diff --git a/.gitconfig b/.gitconfig new file mode 100644 index 000000000..04c63d28b --- /dev/null +++ b/.gitconfig @@ -0,0 +1,2 @@ +[core] + hookspath = .githooks \ No newline at end of file diff --git a/.githooks/pre-push b/.githooks/pre-push new file mode 100755 index 000000000..92ce4bcd1 --- /dev/null +++ b/.githooks/pre-push @@ -0,0 +1,43 @@ +#!/bin/sh + +FORMAT=$(which swiftformat) + +if [[ -e "${FORMAT}" ]]; then + echo "🚀 SwiftFormat 시작..." + echo "🔍 SwiftFormat 적용 경로: $(pwd)/Projects" +else + echo "SwiftFormat이 존재하지 않습니다. 설치해주세요 ! 'brew install swiftformat'" + exit 1 +fi + +RESULT=$($FORMAT ./Projects --config .swiftformat) + +if [ "$RESULT" == '' ]; then + git add . + git commit -m "🎨 :: 코드 Formatting 적용" + printf "\n 🎉 SwiftFormat 적용을 완료했습니다 !! \n" +else + echo "" + printf "❌ SwiftFormat Failed 아래 내용을 확인해주세요 \n" + while read -r line; do + FILEPATH=$(echo $line | cut -d : -f 1) + L=$(echo $line | cut -d : -f 2) + C=$(echo $line | cut -d : -f 3) + TYPE=$(echo $line | cut -d : -f 4 | cut -c 2-) + MESSAGE=$(echo $line | cut -d : -f 5 | cut -c 2-) + DESCRIPTION=$(echo $line | cut -d : -f 6 | cut -c 2-) + if [ $TYPE == 'warning' ]; then + printf "\n 🚧 $TYPE\n" + printf " $FILEPATH:$L:$C\n" + printf " 📌 $MESSAGE: - $DESCRIPTION\n" + exit 0 + elif [ $TYPE == 'error' ]; then + printf "\n 🚨 $TYPE\n" + fi + printf " ✅ $FILEPATH:$L:$C\n" + printf " 📌 $MESSAGE: - $DESCRIPTION\n" + done <<< "$RESULT" + + printf "\n 🚑 커밋실패!! SwiftFormat 실행이 실패하였습니다 🥺 \n" + exit 1 +fi \ No newline at end of file diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 1e137a278..3245f3906 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1 +1 @@ -* @yongbeomkwak @kimdaehee0824 @CoCoE1203 @KangTaeHoon @youn9k +* @yongbeomkwak @kimdaehee0824 @KangTaeHoon @youn9k @baekteun diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index fcae229a4..c65464a91 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,6 +1,41 @@ +## 💡 배경 및 개요 -## 개요 + -## 작업사항 + -Closes #이슈번호 \ No newline at end of file +Resolves: #{이슈번호} + +## 📃 작업내용 + + + +## 🙋‍♂️ 리뷰노트 + + + +## ✅ PR 체크리스트 + + + +- [ ] 이 작업으로 인해 변경이 필요한 문서가 변경되었나요? (e.g. `XCConfig`, `노션`, `README`) +- [ ] 이 작업을 하고나서 공유해야할 팀원들에게 공유되었나요? (e.g. `"API 개발 완료됐어요"`, `"XCConfig 값 추가되었어요"`) +- [ ] 작업한 코드가 정상적으로 동작하나요? +- [ ] Merge 대상 브랜치가 올바른가요? +- [ ] PR과 관련 없는 작업이 있지는 않나요? + +## 🎸 기타 diff --git a/.github/actions/Auto_close_associate_issue/Dockerfile b/.github/actions/Auto_close_associate_issue/Dockerfile new file mode 100644 index 000000000..9fa45294b --- /dev/null +++ b/.github/actions/Auto_close_associate_issue/Dockerfile @@ -0,0 +1,5 @@ +FROM node:20.14 + +COPY . . + +CMD [ "node", "/main.js"] \ No newline at end of file diff --git a/.github/actions/Auto_close_associate_issue/action.yml b/.github/actions/Auto_close_associate_issue/action.yml new file mode 100644 index 000000000..729630a2b --- /dev/null +++ b/.github/actions/Auto_close_associate_issue/action.yml @@ -0,0 +1,16 @@ +name: "Auto_close_associate_issue" + +description: "Auto close an issue which associate with a PR." + +inputs: + prbody: + description: "The body of the PR to search for related issues" + required: true + +outputs: + issurNumber: + description: "The issue number" + +runs: + using: "docker" + image: "Dockerfile" \ No newline at end of file diff --git a/.github/actions/Auto_close_associate_issue/main.js b/.github/actions/Auto_close_associate_issue/main.js new file mode 100644 index 000000000..010c4d8a4 --- /dev/null +++ b/.github/actions/Auto_close_associate_issue/main.js @@ -0,0 +1,16 @@ +let body = process.env["INPUT_PRBODY"]; + +/* +PR Template의 resolved issue 넘버 표기 방식 변경 시 해당 코드 또한 변경 필요 +*/ +let pattern = /Resolves: #\d+/; + +let issueNumber; + +try { + issueNumber = body.match(pattern)[0].replace("Resolves: #", "").trim(); +} catch { + issueNumber = -1; +} + +console.log(`::set-output name=issueNumber::${issueNumber}`); diff --git a/.github/workflows/AutoAssign.yml b/.github/workflows/AutoAssign.yml new file mode 100644 index 000000000..dd580a85b --- /dev/null +++ b/.github/workflows/AutoAssign.yml @@ -0,0 +1,40 @@ +name: Auto assign PR author + +on: + pull_request: + types: + - opened + - reopened + +jobs: + assign-pr-author: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Get PR author + id: get-pr-author + run: echo "author=${{ github.event.pull_request.user.login }}" >> $GITHUB_OUTPUT + + - name: Assign PR author + run: gh pr edit ${{ github.event.number }} --add-assignee ${{ steps.get-pr-author.outputs.author }} + env: + GH_TOKEN: ${{ github.token }} + + - name: Comment success result to PR + uses: mshick/add-pr-comment@v2 + if: ${{ success() }} + with: + message: | + ## ✅ Assign 자동 지정을 성공했어요! + @${{ steps.get-pr-author.outputs.author }} + allow-repeats: true + + - name: Comment failure result to PR + uses: mshick/add-pr-comment@v2 + if: ${{ failure() }} + with: + message: "## ❌ PR의 Assign 자동 지정을 실패했어요." + allow-repeats: true diff --git a/.github/workflows/AutoCloseIssueByPullRequest.yml b/.github/workflows/AutoCloseIssueByPullRequest.yml new file mode 100644 index 000000000..f2fac78bc --- /dev/null +++ b/.github/workflows/AutoCloseIssueByPullRequest.yml @@ -0,0 +1,31 @@ +name: Auto close issue when PR is merged + +on: + pull_request_target: + branches-ignore: + - "develop" + types: [closed] + +jobs: + close-issue: + runs-on: ubuntu-latest + if: github.event.pull_request.merged == true || github.event.action != 'closed' + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Run Auto issue closer + uses: ./.github/actions/Auto_close_associate_issue/ + id: Closer + with: + prbody: ${{ github.event.pull_request.body }} + + - name: Close Issue + uses: peter-evans/close-issue@v2 + if: ${{ github.event.pull_request.merged }} + with: + issue-number: ${{ steps.Closer.outputs.issueNumber }} + comment: The associated PR has been merged, this issue is automatically closed, you can reopend if necessary. \#${{ github.event.pull_request.number }} + env: + Github_Token: ${{ secrets.GITHUB_TOKEN }} + PRNUM: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index dbbcbb437..167de5273 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -2,130 +2,143 @@ name: CI on: pull_request: + paths: + - ".github/workflows/CI.yml" + - "**/*.swift" + push: branches: - develop + - master env: - CACHED_DEPENDENCY_PATHS: ${{ github.workspace }}/Tuist/Dependencies + CACHED_PACKAGE_DEPENDENCY_PATHS: ${{ github.workspace }}/.build + CACHED_CARTHAGE_DEPENDENCY_PATHS: ${{ github.workspace }}/Carthage + GOOGLE_SERVICE_INFO_PLIST_PATH: Projects/App/Resources/GoogleService-Info.plist + SECRET_XCCONFIG_PATH: Projects/App/XCConfig/Secrets.xcconfig + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true jobs: prepare-ci: - name: Prepare CI - runs-on: macOS-latest - outputs: - NAME: ${{ steps.get_name.outputs.NAME }} - CI-NEEDED: ${{ steps.check_ci_needed.outputs.CI-NEEDED }} - WROKING-PATH: ${{ steps.get_working_directory.outputs.PATH }} - TESTS-EXISTENCE: ${{ steps.check_tests_existence.outputs.files_exists }} - steps: - - uses: actions/checkout@v1 - - - name: Get Branch Name - uses: tj-actions/branch-names@v6.2 - id: branch_name - - - name: Get Type - id: get_type - run: | - echo ${{ steps.branch_name.outputs.current_branch }} | cut -d / -f 1 - echo "TYPE=$(echo ${{ steps.branch_name.outputs.current_branch }} | cut -d / -f 1)" >> $GITHUB_OUTPUT - - - name: Get Name - id: get_name - run: | - echo ${{ steps.branch_name.outputs.current_branch }} | cut -d / -f 2 - echo "NAME=$(echo ${{ steps.branch_name.outputs.current_branch }} | cut -d / -f 2)" >> $GITHUB_OUTPUT - - - name: Check CI Needed - id: check_ci_needed - run: | - echo ${{steps.get_type.outputs.TYPE == 'Application' || steps.get_type.outputs.TYPE == 'Modules' || steps.get_type.outputs.TYPE == 'Services'}} - echo "CI-NEEDED=${{steps.get_type.outputs.TYPE == 'Application' || steps.get_type.outputs.TYPE == 'Modules' || steps.get_type.outputs.TYPE == 'Services'}}" >> $GITHUB_OUTPUT - - - name: Get Working Directory - id: get_working_directory - if: steps.check_ci_needed.outputs.CI-NEEDED == 'true' - run: | - cd ${{ steps.get_type.outputs.TYPE }} - if [ ${{ steps.get_type.outputs.TYPE }} != "Application" ] - then - cd ${{ steps.get_name.outputs.NAME }} - fi - echo "PATH=$(pwd)" >> $GITHUB_OUTPUT - - - name: Check tests existence - id: check_tests_existence - if: steps.check_ci_needed.outputs.CI-NEEDED == 'true' - uses: andstor/file-existence-action@v1 - with: - files: "${{ steps.get_working_directory.outputs.PATH }}/Tests" - - - - - build: - name: ⚡️ Build - runs-on: macOS-latest - needs: prepare-ci - if: needs.prepare-ci.outputs.CI-NEEDED == 'true' + name: ⚙️ Prepare CI + runs-on: macos-14 steps: - - uses: actions/checkout@v2 - - - name: install needs - run: | - bash <(curl -Ls https://install.tuist.io) - - - name: Compute dependency cache key - id: compute_hash - run: echo "hash=${{ hashFiles('Tuist/Dependencies.swift') }}" >> $GITHUB_OUTPUT - - - name: Check dependency cache - uses: actions/cache@v3 - id: cache_dependencies - with: - path: ${{ env.CACHED_DEPENDENCY_PATHS }} - key: ${{ steps.compute_hash.outputs.hash }} - - - name: Install dependencies - if: steps.cache_dependencies.outputs.cache-hit != 'true' - run: tuist fetch - - - name: build codes - working-directory: ${{ needs.prepare-ci.outputs.WROKING-PATH }} - run: tuist build - - + - uses: actions/checkout@v3 + + - name: Select Xcode 15.4 + run: sudo xcode-select -s /Applications/Xcode_15.4.app/Contents/Developer + + - name: Compute package dependency cache key + id: compute_package_hash + run: echo "package_hash=${{ hashFiles('Package.swift') }}" >> $GITHUB_OUTPUT + + - name: Check package dependency cache + uses: actions/cache@v3 + id: cache_package_dependencies + with: + path: ${{ env.CACHED_PACKAGE_DEPENDENCY_PATHS }} + key: ${{ steps.compute_package_hash.outputs.package_hash }} + + - name: Compute carthage dependency cache key + id: compute_carthage_hash + run: echo "carthage_hash=${{ hashFiles('Cartfile') }}" >> $GITHUB_OUTPUT + + - name: Check carthage dependency cache + uses: actions/cache@v3 + id: cache_carthage_dependencies + with: + path: ${{ env.CACHED_CARTHAGE_DEPENDENCY_PATHS }} + key: ${{ steps.compute_carthage_hash.outputs.carthage_hash }} + + - name: Echo dependency cache hit + run: | + echo "package cache hit = ${{ steps.cache_package_dependencies.outputs.cache-hit }}" + echo "carthage cache hit = ${{ steps.cache_carthage_dependencies.outputs.cache-hit }}" + + - uses: jdx/mise-action@v2 + if: steps.cache_package_dependencies.outputs.cache-hit == '' || steps.cache_carthage_dependencies.outputs.cache-hit == '' + + - name: Install tuist + if: steps.cache_package_dependencies.outputs.cache-hit == '' || steps.cache_carthage_dependencies.outputs.cache-hit == '' + run: | + brew install carthage + mise install tuist + + - name: Install dependencies needs + if: steps.cache_package_dependencies.outputs.cache-hit == '' || steps.cache_carthage_dependencies.outputs.cache-hit == '' + run: make install + outputs: + package_dependency_cache_key: ${{ steps.compute_package_hash.outputs.package_hash }} + carthage_dependency_cache_key: ${{ steps.compute_carthage_hash.outputs.carthage_hash }} test: name: 🧪 Test - runs-on: macOS-latest - needs: [prepare-ci] - if: needs.prepare-ci.outputs.TESTS-EXISTENCE == 'true' + runs-on: macos-14 + needs: prepare-ci steps: - - uses: actions/checkout@v2 - - - name: install needs - run: | - bash <(curl -Ls https://install.tuist.io) - - - name: Compute dependency cache key - id: compute_hash - run: echo "hash=${{ hashFiles('Tuist/Dependencies.swift') }}" >> $GITHUB_OUTPUT - - - name: Check dependency cache - uses: actions/cache@v3 - id: cache_dependencies - with: - path: ${{ env.CACHED_DEPENDENCY_PATHS }} - key: ${{ steps.compute_hash.outputs.hash }} - - - name: Install dependencies - if: steps.cache_dependencies.outputs.cache-hit != 'true' - run: tuist fetch - - - name: test codes - working-directory: ${{ needs.prepare-ci.outputs.WROKING-PATH }} - run: tuist test ${{ needs.prepare-ci.outputs.NAME }}Test - + - uses: actions/checkout@v3 + + - name: List Xcode installations + run: sudo ls -1 /Applications | grep "Xcode" + + - name: Select Xcode 15.4 + run: sudo xcode-select -s /Applications/Xcode_15.4.app/Contents/Developer + + - name: Show swift version + run: swift --version + + - uses: jdx/mise-action@v2 + + - name: Install tuist + run: | + brew install carthage + mise install tuist + + - name: Check package dependency cache + uses: actions/cache@v3 + id: cache_package_dependencies + with: + path: ${{ env.CACHED_PACKAGE_DEPENDENCY_PATHS }} + key: ${{ needs.prepare-ci.outputs.package_dependency_cache_key }} + + - name: Check carthage dependency cache + uses: actions/cache@v3 + id: cache_carthage_dependencies + with: + path: ${{ env.CACHED_CARTHAGE_DEPENDENCY_PATHS }} + key: ${{ needs.prepare-ci.outputs.carthage_dependency_cache_key }} + + - name: Echo dependency cache hit + run: | + echo "package cache hit = ${{ steps.cache_package_dependencies.outputs.cache-hit }}" + echo "carthage cache hit = ${{ steps.cache_carthage_dependencies.outputs.cache-hit }}" + + - name: Install needle + run: brew install needle + + - name: Install dependencies needs + if: steps.cache_package_dependencies.outputs.cache-hit == '' || steps.cache_carthage_dependencies.outputs.cache-hit == '' + run: make install + + - name: Make `Secrets.xcconfig` + run: | + mkdir Projects/App/XCConfig + touch ${{ env.SECRET_XCCONFIG_PATH }} + echo "" > ${{ env.SECRET_XCCONFIG_PATH }} + + - name: Make `GoogleService-Info.plist` + run: | + touch ${{ env.GOOGLE_SERVICE_INFO_PLIST_PATH }} + echo "${{ secrets.GOOGLE_INFO_PLIST }}" > ${{ env.GOOGLE_SERVICE_INFO_PLIST_PATH }} + + - name: Generate NeedleGenerated.swift + run: | + sh Scripts/NeedleRunScript.sh ci + echo finish NeedleRunScript + + - name: Test with tuist + run: make test diff --git a/.github/workflows/CachingDependencies.yml b/.github/workflows/CachingDependencies.yml deleted file mode 100644 index 537bd9515..000000000 --- a/.github/workflows/CachingDependencies.yml +++ /dev/null @@ -1,33 +0,0 @@ -name: CachingDependencies - -on: - push: - branches: - - develop - -env: - CACHED_DEPENDENCY_PATHS: ${{ github.workspace }}/Tuist/Dependencies - -jobs: - install-dependencies: - name: Install dependencies - runs-on: macOS-latest - steps: - - uses: actions/checkout@v2 - - name: Compute dependency cache key - id: compute_hash - run: echo "hash=${{ hashFiles('Tuist/Dependencies.swift') }}" >> $GITHUB_OUTPUT - - name: Check dependency cache - uses: actions/cache@v3 - id: cache_dependencies - with: - path: ${{ env.CACHED_DEPENDENCY_PATHS }} - key: ${{ steps.compute_hash.outputs.hash }} - - name: install tuist - if: steps.cache_dependencies.outputs.cache-hit != 'true' - run: bash <(curl -Ls https://install.tuist.io) - - name: Install dependencies - if: steps.cache_dependencies.outputs.cache-hit != 'true' - run: tuist fetch - outputs: - dependency_cache_key: ${{ steps.compute_hash.outputs.hash }} diff --git a/.github/workflows/IssueToPRLabelSync.yml b/.github/workflows/IssueToPRLabelSync.yml new file mode 100644 index 000000000..d93b50461 --- /dev/null +++ b/.github/workflows/IssueToPRLabelSync.yml @@ -0,0 +1,55 @@ +name: Issue to PR label sync + +on: + pull_request: + types: + - opened + - reopened + +jobs: + add-label: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Extract issue number from PR title + id: extract-issue-number + run: | + sh .github/workflows/IssueToPRLabelSync/ExtractIssueNumber.sh >> $GITHUB_OUTPUT + env: + PR_TITLE: ${{ github.event.pull_request.title }} + + - name: Check if issue number is found + id: check-issue-number + run: echo "valid_format=$(if [[ -n "${{ steps.extract-issue-number.outputs.issue_number }}" ]]; then echo "true"; else echo "false"; fi)" >> $GITHUB_OUTPUT + + - name: Add label if valid issue format + if: steps.check-issue-number.outputs.valid_format == 'true' + run: | + ISSUE_NUMBER="${{ steps.extract-issue-number.outputs.issue_number }}" + echo "Found Issue Number: $ISSUE_NUMBER" + gh issue view $ISSUE_NUMBER --json labels --template "{{range .labels}}'{{.name}}',{{end}}" \ + | sed 's/.$//g' \ + | xargs -I LABELS gh pr edit ${{ github.event.number }} --add-label "LABELS" + env: + GH_TOKEN: ${{ github.token }} + + - name: Skip if invalid issue format + if: steps.check-issue-number.outputs.valid_format == 'false' + run: echo "Invalid issue format. Skipping label addition." + + - name: Comment success result to PR + uses: mshick/add-pr-comment@v2 + if: steps.check-issue-number.outputs.valid_format == 'true' + with: + message: "## ✅ 이슈와 PR의 Labels 동기화를 성공했어요!" + allow-repeats: true + + - name: Comment skip result to PR + uses: mshick/add-pr-comment@v2 + if: steps.check-issue-number.outputs.valid_format == 'false' + with: + message: "## 🛠️ 이슈와 PR의 Labels 동기화를 스킵했어요." + allow-repeats: true diff --git a/.github/workflows/IssueToPRLabelSync/ExtractIssueNumber.sh b/.github/workflows/IssueToPRLabelSync/ExtractIssueNumber.sh new file mode 100644 index 000000000..d411c2886 --- /dev/null +++ b/.github/workflows/IssueToPRLabelSync/ExtractIssueNumber.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +echo "issue_number=$(echo $PR_TITLE | grep -oP '\(#[0-9]+\)' | grep -oP '[0-9]+')" \ No newline at end of file diff --git a/.github/workflows/SwiftLint.yml b/.github/workflows/SwiftLint.yml index 7c9ab585c..b1c66dff8 100644 --- a/.github/workflows/SwiftLint.yml +++ b/.github/workflows/SwiftLint.yml @@ -1,31 +1,31 @@ name: SwiftLint on: - push: - paths: - - '.github/workflows/SwiftLint.yml' - - '.swiftlint.yml' - - '**/*.swift' pull_request: paths: - - '.github/workflows/SwiftLint.yml' - - '.swiftlint.yml' - - '**/*.swift' + - ".github/workflows/SwiftLint.yml" + - ".swiftlint.yml" + - "**/*.swift" jobs: - SwiftLint: + swiftlint: runs-on: ubuntu-latest + permissions: + pull-requests: write steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v3 + - name: GitHub Action for SwiftLint uses: norio-nomura/action-swiftlint@3.2.1 - - name: GitHub Action for SwiftLint with --strict - uses: norio-nomura/action-swiftlint@3.2.1 + + - name: Comment success result to PR + uses: mshick/add-pr-comment@v2 + if: ${{ success() }} with: - args: --strict - - name: GitHub Action for SwiftLint (Only files changed in the PR) - uses: norio-nomura/action-swiftlint@3.2.1 - env: - DIFF_BASE: ${{ github.base_ref }} - - name: GitHub Action for SwiftLint (Different working directory) - uses: norio-nomura/action-swiftlint@3.2.1 + message: "## ✅ Successful finished SwiftLint" + + - name: Comment failure result ot PR + uses: mshick/add-pr-comment@v2 + if: ${{ failure() }} + with: + message: "## ❌ Error detected on SwiftLint" diff --git a/.gitignore b/.gitignore index adfd0277d..fa1024f89 100644 --- a/.gitignore +++ b/.gitignore @@ -65,6 +65,8 @@ DerivedData/ !default.mode2v3 *.perspectivev3 !default.perspectivev3 +.build/ +Carthage/ ### Xcode Patch ### *.xcodeproj/* @@ -109,3 +111,6 @@ amplifytools.xcconfig ### Google GoogleService-Info.plist + +### Needle +Projects/App/Sources/Application/NeedleGenerated.swift \ No newline at end of file diff --git a/.mise.toml b/.mise.toml new file mode 100644 index 000000000..58d10e97a --- /dev/null +++ b/.mise.toml @@ -0,0 +1,2 @@ +[tools] +tuist = "4.12.1" diff --git a/.package.resolved b/.package.resolved index 0f967cd78..9529bfa4c 100644 --- a/.package.resolved +++ b/.package.resolved @@ -1,4 +1,5 @@ { + "originHash" : "838cedc1ff704f14426befc05257203bf3aaf397162004377a05b8e903ad2a57", "pins" : [ { "identity" : "youtubeplayerkit", @@ -10,5 +11,5 @@ } } ], - "version" : 2 + "version" : 3 } diff --git a/.swiftformat b/.swiftformat new file mode 100644 index 000000000..3830d679f --- /dev/null +++ b/.swiftformat @@ -0,0 +1,64 @@ + +--exclude fastlane,Tuist,Dependencies,Carthage,**/NeedleGenerated.swift + +# options +--maxwidth 120 +--indent 4 +--trimwhitespace always # trailingSpace +--lineaftermarks false # fileHeader +--wraparguments before-first # wrapArguments +--wrapparameters before-first # wrapArguments +--wrapcollections before-first # wrapArguments + +# rules +--rules anyObjectProtocol +--rules blankLineAfterImports +--rules blankLinesAroundMark +--rules blankLinesAtEndOfScope +--rules blankLinesAtStartOfScope +--rules blankLinesBetweenImports +--rules blankLinesBetweenScopes +--rules braces +--rules consecutiveBlankLines +--rules consecutiveSpaces +--rules docComments +--rules duplicateImports +--rules elseOnSameLine +--rules emptyBraces +--rules enumNamespaces +--rules extensionAccessControl +--rules fileHeader +--rules hoistAwait +--rules hoistPatternLet +--rules hoistTry +--rules initCoderUnavailable +--rules indent +--rules isEmpty +--rules leadingDelimiters +--rules linebreakAtEndOfFile +--rules modifierOrder +--rules numberFormatting +--rules opaqueGenericParameters +--rules redundantExtensionACL +--rules redundantOptionalBinding +--rules redundantParens +--rules redundantVoidReturnType +--rules semicolons +--rules sortImports +--rules spaceAroundBraces +--rules spaceAroundBrackets +--rules spaceAroundComments +--rules spaceAroundGenerics +--rules spaceAroundOperators +--rules spaceInsideBraces +--rules spaceInsideBrackets +--rules spaceInsideComments +--rules spaceInsideGenerics +--rules spaceInsideParens +--rules todos +--rules trailingClosures +--rules trailingSpace +--rules typeSugar +--rules void +--rules wrap +--rules wrapArguments \ No newline at end of file diff --git a/.swiftlint.yml b/.swiftlint.yml new file mode 100644 index 000000000..9e79480a0 --- /dev/null +++ b/.swiftlint.yml @@ -0,0 +1,28 @@ +excluded: + - "**/*/NeedleGenerated.swift" + - "Tuist" + - "Plugin" + +force_cast: # From https://realm.github.io/SwiftLint/force_cast.html + warning # 강제 캐스팅은 error에서 warning으로 변경 + +identifier_name: + min_length: + warning: 1 + allowed_symbols: ["_"] + +nesting: + type_label: + warning: 3 + +type_name: + max_length: + warning: 60 + +function_body_length: + warning: 100 + error: 300 + +function_parameter_count: + warning: 10 + error: 15 diff --git a/.tuist-bin/ProjectDescription.framework.dSYM/Contents/Info.plist b/.tuist-bin/ProjectDescription.framework.dSYM/Contents/Info.plist deleted file mode 100644 index bb3ab9af2..000000000 --- a/.tuist-bin/ProjectDescription.framework.dSYM/Contents/Info.plist +++ /dev/null @@ -1,20 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleIdentifier - com.apple.xcode.dsym.ProjectDescription - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - dSYM - CFBundleSignature - ???? - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - - diff --git a/.tuist-bin/ProjectDescription.framework.dSYM/Contents/Resources/DWARF/ProjectDescription b/.tuist-bin/ProjectDescription.framework.dSYM/Contents/Resources/DWARF/ProjectDescription deleted file mode 100644 index 885f07c91..000000000 Binary files a/.tuist-bin/ProjectDescription.framework.dSYM/Contents/Resources/DWARF/ProjectDescription and /dev/null differ diff --git a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/arm64-apple-macos.swiftdoc b/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/arm64-apple-macos.swiftdoc deleted file mode 100644 index afc20046e..000000000 Binary files a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/arm64-apple-macos.swiftdoc and /dev/null differ diff --git a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/arm64-apple-macos.swiftinterface b/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/arm64-apple-macos.swiftinterface deleted file mode 100644 index 99e7d8a4b..000000000 --- a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/arm64-apple-macos.swiftinterface +++ /dev/null @@ -1,1418 +0,0 @@ -// swift-interface-format-version: 1.0 -// swift-compiler-version: Apple Swift version 5.5.1 (swiftlang-1300.0.31.4 clang-1300.0.29.6) -// swift-module-flags: -target arm64-apple-macos11.0 -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -module-name ProjectDescription -import Foundation -import Swift -import _Concurrency -public struct AnalyzeAction : Swift.Equatable, Swift.Codable { - public let configuration: ProjectDescription.ConfigurationName - public static func analyzeAction(configuration: ProjectDescription.ConfigurationName) -> ProjectDescription.AnalyzeAction - public static func == (a: ProjectDescription.AnalyzeAction, b: ProjectDescription.AnalyzeAction) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct ArchiveAction : Swift.Equatable, Swift.Codable { - public let configuration: ProjectDescription.ConfigurationName - public let revealArchiveInOrganizer: Swift.Bool - public let customArchiveName: Swift.String? - public let preActions: [ProjectDescription.ExecutionAction] - public let postActions: [ProjectDescription.ExecutionAction] - public static func archiveAction(configuration: ProjectDescription.ConfigurationName, revealArchiveInOrganizer: Swift.Bool = true, customArchiveName: Swift.String? = nil, preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = []) -> ProjectDescription.ArchiveAction - public static func == (a: ProjectDescription.ArchiveAction, b: ProjectDescription.ArchiveAction) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct Arguments : Swift.Equatable, Swift.Codable { - public let environment: [Swift.String : Swift.String] - public let launchArguments: [ProjectDescription.LaunchArgument] - public init(environment: [Swift.String : Swift.String] = [:], launchArguments: [ProjectDescription.LaunchArgument] = []) - public static func == (a: ProjectDescription.Arguments, b: ProjectDescription.Arguments) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct BuildAction : Swift.Equatable, Swift.Codable { - public let targets: [ProjectDescription.TargetReference] - public let preActions: [ProjectDescription.ExecutionAction] - public let postActions: [ProjectDescription.ExecutionAction] - public let runPostActionsOnFailure: Swift.Bool - public init(targets: [ProjectDescription.TargetReference], preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = [], runPostActionsOnFailure: Swift.Bool = false) - public static func buildAction(targets: [ProjectDescription.TargetReference], preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = [], runPostActionsOnFailure: Swift.Bool = false) -> ProjectDescription.BuildAction - public static func == (a: ProjectDescription.BuildAction, b: ProjectDescription.BuildAction) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct Cache : Swift.Codable, Swift.Equatable { - public struct Profile : Swift.Codable, Swift.Equatable { - public let name: Swift.String - public let configuration: Swift.String - public let device: Swift.String? - public let os: Swift.String? - public static func profile(name: Swift.String, configuration: Swift.String, device: Swift.String? = nil, os: Swift.String? = nil) -> ProjectDescription.Cache.Profile - public static func == (a: ProjectDescription.Cache.Profile, b: ProjectDescription.Cache.Profile) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - public let profiles: [ProjectDescription.Cache.Profile] - public let path: ProjectDescription.Path? - public static func cache(profiles: [ProjectDescription.Cache.Profile] = [], path: ProjectDescription.Path? = nil) -> ProjectDescription.Cache - public static func == (a: ProjectDescription.Cache, b: ProjectDescription.Cache) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct Cloud : Swift.Codable, Swift.Equatable { - public enum Option : Swift.String, Swift.Codable, Swift.Equatable { - case analytics - case optional - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } - } - public let url: Swift.String - public let projectId: Swift.String - public let options: [ProjectDescription.Cloud.Option] - public static func cloud(projectId: Swift.String, url: Swift.String, options: [ProjectDescription.Cloud.Option] = []) -> ProjectDescription.Cloud - public static func == (a: ProjectDescription.Cloud, b: ProjectDescription.Cloud) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public enum CompatibleXcodeVersions : Swift.ExpressibleByArrayLiteral, Swift.ExpressibleByStringInterpolation, Swift.Codable, Swift.Equatable { - case all - case exact(ProjectDescription.Version) - case upToNextMajor(ProjectDescription.Version) - case upToNextMinor(ProjectDescription.Version) - case list([ProjectDescription.CompatibleXcodeVersions]) - public init(arrayLiteral elements: [ProjectDescription.CompatibleXcodeVersions]) - public init(arrayLiteral elements: ProjectDescription.CompatibleXcodeVersions...) - public init(stringLiteral value: Swift.String) - public static func == (a: ProjectDescription.CompatibleXcodeVersions, b: ProjectDescription.CompatibleXcodeVersions) -> Swift.Bool - public typealias ArrayLiteralElement = ProjectDescription.CompatibleXcodeVersions - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct Config : Swift.Codable, Swift.Equatable { - public let generationOptions: ProjectDescription.Config.GenerationOptions - public let compatibleXcodeVersions: ProjectDescription.CompatibleXcodeVersions - public let plugins: [ProjectDescription.PluginLocation] - public let cloud: ProjectDescription.Cloud? - public let cache: ProjectDescription.Cache? - public let swiftVersion: ProjectDescription.Version? - public init(compatibleXcodeVersions: ProjectDescription.CompatibleXcodeVersions = .all, cloud: ProjectDescription.Cloud? = nil, cache: ProjectDescription.Cache? = nil, swiftVersion: ProjectDescription.Version? = nil, plugins: [ProjectDescription.PluginLocation] = [], generationOptions: ProjectDescription.Config.GenerationOptions = .options()) - public static func == (a: ProjectDescription.Config, b: ProjectDescription.Config) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.Config { - public struct GenerationOptions : Swift.Codable, Swift.Equatable { - public let resolveDependenciesWithSystemScm: Swift.Bool - public let disablePackageVersionLocking: Swift.Bool - public static func options(resolveDependenciesWithSystemScm: Swift.Bool = false, disablePackageVersionLocking: Swift.Bool = false) -> ProjectDescription.Config.GenerationOptions - public static func == (a: ProjectDescription.Config.GenerationOptions, b: ProjectDescription.Config.GenerationOptions) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } -} -public struct ConfigurationName : Swift.ExpressibleByStringLiteral, Swift.Codable, Swift.Equatable { - public let rawValue: Swift.String - public init(stringLiteral value: Swift.StringLiteralType) - public static func configuration(_ name: Swift.String) -> ProjectDescription.ConfigurationName - public static var debug: ProjectDescription.ConfigurationName { - get - } - public static var release: ProjectDescription.ConfigurationName { - get - } - public static func == (a: ProjectDescription.ConfigurationName, b: ProjectDescription.ConfigurationName) -> Swift.Bool - public typealias ExtendedGraphemeClusterLiteralType = Swift.StringLiteralType - public typealias StringLiteralType = Swift.StringLiteralType - public typealias UnicodeScalarLiteralType = Swift.StringLiteralType - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct CopyFilesAction : Swift.Codable, Swift.Equatable { - public var name: Swift.String - public var destination: ProjectDescription.CopyFilesAction.Destination - public var subpath: Swift.String? - public var files: [ProjectDescription.FileElement] - public enum Destination : Swift.String, Swift.Codable, Swift.Equatable { - case absolutePath - case productsDirectory - case wrapper - case executables - case resources - case javaResources - case frameworks - case sharedFrameworks - case sharedSupport - case plugins - case other - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } - } - public static func productsDirectory(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction - public static func wrapper(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction - public static func executables(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction - public static func resources(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction - public static func javaResources(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction - public static func frameworks(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction - public static func sharedFrameworks(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction - public static func sharedSupport(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction - public static func plugins(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction - public static func == (a: ProjectDescription.CopyFilesAction, b: ProjectDescription.CopyFilesAction) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct CoreDataModel : Swift.Codable, Swift.Equatable { - public let path: ProjectDescription.Path - public let currentVersion: Swift.String? - public init(_ path: ProjectDescription.Path, currentVersion: Swift.String? = nil) - public static func == (a: ProjectDescription.CoreDataModel, b: ProjectDescription.CoreDataModel) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct CarthageDependencies : Swift.Codable, Swift.Equatable { - public let dependencies: [ProjectDescription.CarthageDependencies.Dependency] - public init(_ dependencies: [ProjectDescription.CarthageDependencies.Dependency]) - public static func == (a: ProjectDescription.CarthageDependencies, b: ProjectDescription.CarthageDependencies) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.CarthageDependencies : Swift.ExpressibleByArrayLiteral { - public init(arrayLiteral elements: ProjectDescription.CarthageDependencies.Dependency...) - public typealias ArrayLiteralElement = ProjectDescription.CarthageDependencies.Dependency -} -extension ProjectDescription.CarthageDependencies { - public enum Dependency : Swift.Codable, Swift.Equatable { - case github(path: Swift.String, requirement: ProjectDescription.CarthageDependencies.Requirement) - case git(path: Swift.String, requirement: ProjectDescription.CarthageDependencies.Requirement) - case binary(path: Swift.String, requirement: ProjectDescription.CarthageDependencies.Requirement) - public static func == (a: ProjectDescription.CarthageDependencies.Dependency, b: ProjectDescription.CarthageDependencies.Dependency) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - public enum Requirement : Swift.Codable, Swift.Equatable { - case exact(ProjectDescription.Version) - case upToNext(ProjectDescription.Version) - case atLeast(ProjectDescription.Version) - case branch(Swift.String) - case revision(Swift.String) - public static func == (a: ProjectDescription.CarthageDependencies.Requirement, b: ProjectDescription.CarthageDependencies.Requirement) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } -} -public struct Dependencies : Swift.Codable, Swift.Equatable { - public let carthage: ProjectDescription.CarthageDependencies? - public let swiftPackageManager: ProjectDescription.SwiftPackageManagerDependencies? - public let platforms: Swift.Set - public init(carthage: ProjectDescription.CarthageDependencies? = nil, swiftPackageManager: ProjectDescription.SwiftPackageManagerDependencies? = nil, platforms: Swift.Set = Set(Platform.allCases)) - public static func == (a: ProjectDescription.Dependencies, b: ProjectDescription.Dependencies) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct SwiftPackageManagerDependencies : Swift.Codable, Swift.Equatable { - public let packages: [ProjectDescription.Package] - public let productTypes: [Swift.String : ProjectDescription.Product] - public let baseSettings: ProjectDescription.Settings - public let targetSettings: [Swift.String : ProjectDescription.SettingsDictionary] - public let projectOptions: [Swift.String : ProjectDescription.Project.Options] - public init(_ packages: [ProjectDescription.Package], productTypes: [Swift.String : ProjectDescription.Product] = [:], baseSettings: ProjectDescription.Settings = .settings(), targetSettings: [Swift.String : ProjectDescription.SettingsDictionary] = [:], projectOptions: [Swift.String : ProjectDescription.Project.Options] = [:]) - public static func == (a: ProjectDescription.SwiftPackageManagerDependencies, b: ProjectDescription.SwiftPackageManagerDependencies) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.SwiftPackageManagerDependencies : Swift.ExpressibleByArrayLiteral { - public init(arrayLiteral elements: ProjectDescription.Package...) - public typealias ArrayLiteralElement = ProjectDescription.Package -} -public struct DeploymentDevice : Swift.OptionSet, Swift.Codable, Swift.Hashable { - public static let iphone: ProjectDescription.DeploymentDevice - public static let ipad: ProjectDescription.DeploymentDevice - public static let mac: ProjectDescription.DeploymentDevice - public let rawValue: Swift.UInt - public init(rawValue: Swift.UInt) - public typealias ArrayLiteralElement = ProjectDescription.DeploymentDevice - public typealias Element = ProjectDescription.DeploymentDevice - public typealias RawValue = Swift.UInt -} -public enum DeploymentTarget : Swift.Codable, Swift.Hashable { - case iOS(targetVersion: Swift.String, devices: ProjectDescription.DeploymentDevice) - case macOS(targetVersion: Swift.String) - case watchOS(targetVersion: Swift.String) - case tvOS(targetVersion: Swift.String) - public var targetVersion: Swift.String { - get - } - public func hash(into hasher: inout Swift.Hasher) - public static func == (a: ProjectDescription.DeploymentTarget, b: ProjectDescription.DeploymentTarget) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public var hashValue: Swift.Int { - get - } - public init(from decoder: Swift.Decoder) throws -} -@dynamicMemberLookup public enum Environment { - public enum Value : Swift.Equatable { - case boolean(Swift.Bool) - case string(Swift.String) - public static func == (a: ProjectDescription.Environment.Value, b: ProjectDescription.Environment.Value) -> Swift.Bool - } - public static subscript(dynamicMember member: Swift.String) -> ProjectDescription.Environment.Value? { - get - } -} -extension Swift.Optional where Wrapped == ProjectDescription.Environment.Value { - public func getString(default defaultString: Swift.String) -> Swift.String - public func getBoolean(default defaultBoolean: Swift.Bool) -> Swift.Bool -} -public struct ExecutionAction : Swift.Equatable, Swift.Codable { - public let title: Swift.String - public let scriptText: Swift.String - public let target: ProjectDescription.TargetReference? - public init(title: Swift.String = "Run Script", scriptText: Swift.String, target: ProjectDescription.TargetReference? = nil) - public static func == (a: ProjectDescription.ExecutionAction, b: ProjectDescription.ExecutionAction) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public enum FileCodeGen : Swift.String, Swift.Codable, Swift.Equatable { - case `public` - case `private` - case project - case disabled - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } -} -public enum FileElement : Swift.Codable, Swift.Equatable { - case glob(pattern: ProjectDescription.Path) - case folderReference(path: ProjectDescription.Path) - public static func == (a: ProjectDescription.FileElement, b: ProjectDescription.FileElement) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.FileElement : Swift.ExpressibleByStringInterpolation { - public init(stringLiteral value: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -extension Swift.Array : Swift.ExpressibleByUnicodeScalarLiteral where Element == ProjectDescription.FileElement { - public typealias UnicodeScalarLiteralType = Swift.String -} -extension Swift.Array : Swift.ExpressibleByExtendedGraphemeClusterLiteral where Element == ProjectDescription.FileElement { - public typealias ExtendedGraphemeClusterLiteralType = Swift.String -} -extension Swift.Array : Swift.ExpressibleByStringLiteral where Element == ProjectDescription.FileElement { - public typealias StringLiteralType = Swift.String - public init(stringLiteral value: Swift.String) -} -public enum FileHeaderTemplate : Swift.Codable, Swift.Equatable, Swift.ExpressibleByStringInterpolation { - case file(ProjectDescription.Path) - case string(Swift.String) - public init(stringLiteral value: Swift.String) - public static func == (a: ProjectDescription.FileHeaderTemplate, b: ProjectDescription.FileHeaderTemplate) -> Swift.Bool - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct FileList : Swift.Codable, Swift.Equatable { - public let globs: [ProjectDescription.FileListGlob] - public static func list(_ globs: [ProjectDescription.FileListGlob]) -> ProjectDescription.FileList - public static func == (a: ProjectDescription.FileList, b: ProjectDescription.FileList) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.FileList : Swift.ExpressibleByStringInterpolation { - public init(stringLiteral value: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -extension ProjectDescription.FileList : Swift.ExpressibleByArrayLiteral { - public init(arrayLiteral elements: Swift.String...) - public typealias ArrayLiteralElement = Swift.String -} -public struct FileListGlob : Swift.Codable, Swift.Equatable { - public var glob: ProjectDescription.Path - public var excluding: [ProjectDescription.Path] - public static func glob(_ glob: ProjectDescription.Path, excluding: [ProjectDescription.Path] = []) -> ProjectDescription.FileListGlob - public static func glob(_ glob: ProjectDescription.Path, excluding: ProjectDescription.Path?) -> ProjectDescription.FileListGlob - public static func == (a: ProjectDescription.FileListGlob, b: ProjectDescription.FileListGlob) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.FileListGlob : Swift.ExpressibleByStringInterpolation { - public init(stringLiteral value: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -public struct Headers : Swift.Codable, Swift.Equatable { - public enum AutomaticExclusionRule : Swift.Int, Swift.Codable { - case projectExcludesPrivateAndPublic - case publicExcludesPrivateAndProject - public init?(rawValue: Swift.Int) - public typealias RawValue = Swift.Int - public var rawValue: Swift.Int { - get - } - } - public let umbrellaHeader: ProjectDescription.Path? - public let `public`: ProjectDescription.FileList? - public let `private`: ProjectDescription.FileList? - public let project: ProjectDescription.FileList? - public let exclusionRule: ProjectDescription.Headers.AutomaticExclusionRule - public static func headers(public: ProjectDescription.FileList? = nil, private: ProjectDescription.FileList? = nil, project: ProjectDescription.FileList? = nil, exclusionRule: ProjectDescription.Headers.AutomaticExclusionRule = .projectExcludesPrivateAndPublic) -> ProjectDescription.Headers - public static func allHeaders(from list: ProjectDescription.FileList, umbrella: ProjectDescription.Path, private privateHeaders: ProjectDescription.FileList? = nil) -> ProjectDescription.Headers - public static func onlyHeaders(from list: ProjectDescription.FileList, umbrella: ProjectDescription.Path, private privateHeaders: ProjectDescription.FileList? = nil) -> ProjectDescription.Headers - public static func == (a: ProjectDescription.Headers, b: ProjectDescription.Headers) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public enum InfoPlist : Swift.Codable, Swift.Equatable { - indirect public enum Value : Swift.Codable, Swift.Equatable { - case string(Swift.String) - case integer(Swift.Int) - case real(Swift.Double) - case boolean(Swift.Bool) - case dictionary([Swift.String : ProjectDescription.InfoPlist.Value]) - case array([ProjectDescription.InfoPlist.Value]) - public static func == (a: ProjectDescription.InfoPlist.Value, b: ProjectDescription.InfoPlist.Value) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - case file(path: ProjectDescription.Path) - case dictionary([Swift.String : ProjectDescription.InfoPlist.Value]) - case extendingDefault(with: [Swift.String : ProjectDescription.InfoPlist.Value]) - public static var `default`: ProjectDescription.InfoPlist { - get - } - public enum CodingError : Swift.Error { - case invalidType(Swift.String) - } - public var path: ProjectDescription.Path? { - get - } - public static func == (a: ProjectDescription.InfoPlist, b: ProjectDescription.InfoPlist) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.InfoPlist : Swift.ExpressibleByStringInterpolation { - public init(stringLiteral value: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByStringInterpolation { - public init(stringLiteral value: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByIntegerLiteral { - public init(integerLiteral value: Swift.Int) - public typealias IntegerLiteralType = Swift.Int -} -extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByFloatLiteral { - public init(floatLiteral value: Swift.Double) - public typealias FloatLiteralType = Swift.Double -} -extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Swift.Bool) - public typealias BooleanLiteralType = Swift.Bool -} -extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByDictionaryLiteral { - public init(dictionaryLiteral elements: (Swift.String, ProjectDescription.InfoPlist.Value)...) - public typealias Key = Swift.String - public typealias Value = ProjectDescription.InfoPlist.Value -} -extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByArrayLiteral { - public init(arrayLiteral elements: ProjectDescription.InfoPlist.Value...) - public typealias ArrayLiteralElement = ProjectDescription.InfoPlist.Value -} -public struct LaunchArgument : Swift.Equatable, Swift.Codable { - public let name: Swift.String - public let isEnabled: Swift.Bool - public init(name: Swift.String, isEnabled: Swift.Bool) - public static func == (a: ProjectDescription.LaunchArgument, b: ProjectDescription.LaunchArgument) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public enum Package : Swift.Equatable, Swift.Codable { - case remote(url: Swift.String, requirement: ProjectDescription.Package.Requirement) - case local(path: ProjectDescription.Path) - public static func == (a: ProjectDescription.Package, b: ProjectDescription.Package) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.Package { - public enum Requirement : Swift.Codable, Swift.Equatable { - case upToNextMajor(from: ProjectDescription.Version) - case upToNextMinor(from: ProjectDescription.Version) - case range(from: ProjectDescription.Version, to: ProjectDescription.Version) - case exact(ProjectDescription.Version) - case branch(Swift.String) - case revision(Swift.String) - public static func == (a: ProjectDescription.Package.Requirement, b: ProjectDescription.Package.Requirement) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } -} -extension ProjectDescription.Package { - public static func package(url: Swift.String, from version: ProjectDescription.Version) -> ProjectDescription.Package - public static func package(url: Swift.String, _ requirement: ProjectDescription.Package.Requirement) -> ProjectDescription.Package - public static func package(url: Swift.String, _ range: Swift.Range) -> ProjectDescription.Package - public static func package(url: Swift.String, _ range: Swift.ClosedRange) -> ProjectDescription.Package - public static func package(path: ProjectDescription.Path) -> ProjectDescription.Package -} -extension ProjectDescription.Package { - @available(*, unavailable, message: "use package(url:_:) with the .exact(Version) initializer instead") - public static func package(url _: Swift.String, version _: ProjectDescription.Version) -> ProjectDescription.Package - @available(*, unavailable, message: "use package(url:_:) with the .branch(String) initializer instead") - public static func package(url _: Swift.String, branch _: Swift.String) -> ProjectDescription.Package - @available(*, unavailable, message: "use package(url:_:) with the .revision(String) initializer instead") - public static func package(url _: Swift.String, revision _: Swift.String) -> ProjectDescription.Package - @available(*, unavailable, message: "use package(url:_:) without the range label instead") - public static func package(url _: Swift.String, range _: Swift.Range) -> ProjectDescription.Package -} -public struct Path : Swift.ExpressibleByStringInterpolation, Swift.Codable, Swift.Hashable { - public enum PathType : Swift.String, Swift.Codable { - case relativeToCurrentFile - case relativeToManifest - case relativeToRoot - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } - } - public let type: ProjectDescription.Path.PathType - public let pathString: Swift.String - public let callerPath: Swift.String? - public init(_ path: Swift.String) - public static func relativeToCurrentFile(_ pathString: Swift.String, callerPath: Swift.StaticString = #file) -> ProjectDescription.Path - public static func relativeToManifest(_ pathString: Swift.String) -> ProjectDescription.Path - public static func relativeToRoot(_ pathString: Swift.String) -> ProjectDescription.Path - public init(stringLiteral: Swift.String) - public static func == (a: ProjectDescription.Path, b: ProjectDescription.Path) -> Swift.Bool - public func hash(into hasher: inout Swift.Hasher) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String - public func encode(to encoder: Swift.Encoder) throws - public var hashValue: Swift.Int { - get - } - public init(from decoder: Swift.Decoder) throws -} -public enum Platform : Swift.String, Swift.Codable, Swift.Equatable, Swift.CaseIterable { - case iOS - case macOS - case watchOS - case tvOS - public init?(rawValue: Swift.String) - public typealias AllCases = [ProjectDescription.Platform] - public typealias RawValue = Swift.String - public static var allCases: [ProjectDescription.Platform] { - get - } - public var rawValue: Swift.String { - get - } -} -public struct Plugin : Swift.Codable, Swift.Equatable { - public let name: Swift.String - public init(name: Swift.String) - public static func == (a: ProjectDescription.Plugin, b: ProjectDescription.Plugin) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct PluginLocation : Swift.Codable, Swift.Equatable { - public let type: ProjectDescription.PluginLocation.LocationType - public static func local(path: ProjectDescription.Path) -> ProjectDescription.PluginLocation - public static func git(url: Swift.String, tag: Swift.String, directory: Swift.String? = nil) -> ProjectDescription.PluginLocation - public static func git(url: Swift.String, sha: Swift.String, directory: Swift.String? = nil) -> ProjectDescription.PluginLocation - public static func == (a: ProjectDescription.PluginLocation, b: ProjectDescription.PluginLocation) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.PluginLocation { - public enum LocationType : Swift.Codable, Swift.Equatable { - case local(path: ProjectDescription.Path) - case gitWithTag(url: Swift.String, tag: Swift.String, directory: Swift.String?) - case gitWithSha(url: Swift.String, sha: Swift.String, directory: Swift.String?) - public static func == (a: ProjectDescription.PluginLocation.LocationType, b: ProjectDescription.PluginLocation.LocationType) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } -} -public enum Product : Swift.String, Swift.Codable, Swift.Equatable { - case app - case staticLibrary - case dynamicLibrary - case framework - case staticFramework - case unitTests - case uiTests - case bundle - case commandLineTool - case appClip - case appExtension - case watch2App - case watch2Extension - case tvTopShelfExtension - case messagesExtension - case stickerPackExtension - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } -} -public struct ProfileAction : Swift.Equatable, Swift.Codable { - public let configuration: ProjectDescription.ConfigurationName - public let preActions: [ProjectDescription.ExecutionAction] - public let postActions: [ProjectDescription.ExecutionAction] - public let executable: ProjectDescription.TargetReference? - public let arguments: ProjectDescription.Arguments? - public static func profileAction(configuration: ProjectDescription.ConfigurationName = .release, preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = [], executable: ProjectDescription.TargetReference? = nil, arguments: ProjectDescription.Arguments? = nil) -> ProjectDescription.ProfileAction - public static func == (a: ProjectDescription.ProfileAction, b: ProjectDescription.ProfileAction) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct Project : Swift.Codable, Swift.Equatable { - public let name: Swift.String - public let organizationName: Swift.String? - public let options: ProjectDescription.Project.Options - public let packages: [ProjectDescription.Package] - public let targets: [ProjectDescription.Target] - public let schemes: [ProjectDescription.Scheme] - public let settings: ProjectDescription.Settings? - public let fileHeaderTemplate: ProjectDescription.FileHeaderTemplate? - public let additionalFiles: [ProjectDescription.FileElement] - public let resourceSynthesizers: [ProjectDescription.ResourceSynthesizer] - public init(name: Swift.String, organizationName: Swift.String? = nil, options: ProjectDescription.Project.Options = .options(), packages: [ProjectDescription.Package] = [], settings: ProjectDescription.Settings? = nil, targets: [ProjectDescription.Target] = [], schemes: [ProjectDescription.Scheme] = [], fileHeaderTemplate: ProjectDescription.FileHeaderTemplate? = nil, additionalFiles: [ProjectDescription.FileElement] = [], resourceSynthesizers: [ProjectDescription.ResourceSynthesizer] = .default) - public static func == (a: ProjectDescription.Project, b: ProjectDescription.Project) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.Project { - public struct Options : Swift.Codable, Swift.Equatable { - public let automaticSchemesOptions: ProjectDescription.Project.Options.AutomaticSchemesOptions - public let developmentRegion: Swift.String? - public let disableBundleAccessors: Swift.Bool - public let disableShowEnvironmentVarsInScriptPhases: Swift.Bool - public let disableSynthesizedResourceAccessors: Swift.Bool - public let textSettings: ProjectDescription.Project.Options.TextSettings - public let xcodeProjectName: Swift.String? - public static func options(automaticSchemesOptions: ProjectDescription.Project.Options.AutomaticSchemesOptions = .enabled(), developmentRegion: Swift.String? = nil, disableBundleAccessors: Swift.Bool = false, disableShowEnvironmentVarsInScriptPhases: Swift.Bool = false, disableSynthesizedResourceAccessors: Swift.Bool = false, textSettings: ProjectDescription.Project.Options.TextSettings = .textSettings(), xcodeProjectName: Swift.String? = nil) -> ProjectDescription.Project.Options - public static func == (a: ProjectDescription.Project.Options, b: ProjectDescription.Project.Options) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } -} -extension ProjectDescription.Project.Options { - public enum AutomaticSchemesOptions : Swift.Codable, Swift.Equatable { - public enum TargetSchemesGrouping : Swift.Codable, Swift.Equatable { - case singleScheme - case byNameSuffix(build: Swift.Set, test: Swift.Set, run: Swift.Set) - case notGrouped - public static func == (a: ProjectDescription.Project.Options.AutomaticSchemesOptions.TargetSchemesGrouping, b: ProjectDescription.Project.Options.AutomaticSchemesOptions.TargetSchemesGrouping) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - case enabled(targetSchemesGrouping: ProjectDescription.Project.Options.AutomaticSchemesOptions.TargetSchemesGrouping = .byNameSuffix( - build: ["Implementation", "Interface", "Mocks", "Testing"], - test: ["Tests", "IntegrationTests", "UITests", "SnapshotTests"], - run: ["App", "Demo"] - ), codeCoverageEnabled: Swift.Bool = false, testingOptions: ProjectDescription.TestingOptions = []) - case disabled - public static func == (a: ProjectDescription.Project.Options.AutomaticSchemesOptions, b: ProjectDescription.Project.Options.AutomaticSchemesOptions) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - public struct TextSettings : Swift.Codable, Swift.Equatable { - public let usesTabs: Swift.Bool? - public let indentWidth: Swift.UInt? - public let tabWidth: Swift.UInt? - public let wrapsLines: Swift.Bool? - public static func textSettings(usesTabs: Swift.Bool? = nil, indentWidth: Swift.UInt? = nil, tabWidth: Swift.UInt? = nil, wrapsLines: Swift.Bool? = nil) -> ProjectDescription.Project.Options.TextSettings - public static func == (a: ProjectDescription.Project.Options.TextSettings, b: ProjectDescription.Project.Options.TextSettings) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } -} -public enum ResourceFileElement : Swift.Codable, Swift.Equatable { - case glob(pattern: ProjectDescription.Path, excluding: [ProjectDescription.Path] = [], tags: [Swift.String] = []) - case folderReference(path: ProjectDescription.Path, tags: [Swift.String] = []) - public static func == (a: ProjectDescription.ResourceFileElement, b: ProjectDescription.ResourceFileElement) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.ResourceFileElement : Swift.ExpressibleByStringInterpolation { - public init(stringLiteral value: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -public struct ResourceFileElements : Swift.Codable, Swift.Equatable { - public let resources: [ProjectDescription.ResourceFileElement] - public init(resources: [ProjectDescription.ResourceFileElement]) - public static func == (a: ProjectDescription.ResourceFileElements, b: ProjectDescription.ResourceFileElements) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.ResourceFileElements : Swift.ExpressibleByStringInterpolation { - public init(stringLiteral value: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -extension ProjectDescription.ResourceFileElements : Swift.ExpressibleByArrayLiteral { - public init(arrayLiteral elements: ProjectDescription.ResourceFileElement...) - public typealias ArrayLiteralElement = ProjectDescription.ResourceFileElement -} -public struct ResourceSynthesizer : Swift.Codable, Swift.Equatable { - public let templateType: ProjectDescription.ResourceSynthesizer.TemplateType - public let parser: ProjectDescription.ResourceSynthesizer.Parser - public let extensions: Swift.Set - public enum TemplateType : Swift.Codable, Swift.Equatable { - case plugin(name: Swift.String, resourceName: Swift.String) - case defaultTemplate(resourceName: Swift.String) - public static func == (a: ProjectDescription.ResourceSynthesizer.TemplateType, b: ProjectDescription.ResourceSynthesizer.TemplateType) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - public enum Parser : Swift.String, Swift.Codable { - case strings - case assets - case plists - case fonts - case coreData - case interfaceBuilder - case json - case yaml - case files - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } - } - public static func strings() -> ProjectDescription.ResourceSynthesizer - public static func strings(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer - public static func assets() -> ProjectDescription.ResourceSynthesizer - public static func assets(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer - public static func fonts() -> ProjectDescription.ResourceSynthesizer - public static func fonts(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer - public static func plists() -> ProjectDescription.ResourceSynthesizer - public static func plists(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer - public static func coreData(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer - public static func coreData() -> ProjectDescription.ResourceSynthesizer - public static func interfaceBuilder(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer - public static func interfaceBuilder() -> ProjectDescription.ResourceSynthesizer - public static func json(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer - public static func json() -> ProjectDescription.ResourceSynthesizer - public static func yaml(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer - public static func yaml() -> ProjectDescription.ResourceSynthesizer - public static func files(plugin: Swift.String, extensions: Swift.Set) -> ProjectDescription.ResourceSynthesizer - public static func files(extensions: Swift.Set) -> ProjectDescription.ResourceSynthesizer - public static func custom(plugin: Swift.String, parser: ProjectDescription.ResourceSynthesizer.Parser, extensions: Swift.Set, resourceName: Swift.String) -> ProjectDescription.ResourceSynthesizer - public static func custom(name: Swift.String, parser: ProjectDescription.ResourceSynthesizer.Parser, extensions: Swift.Set) -> ProjectDescription.ResourceSynthesizer - public static func == (a: ProjectDescription.ResourceSynthesizer, b: ProjectDescription.ResourceSynthesizer) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension Swift.Array where Element == ProjectDescription.ResourceSynthesizer { - public static var `default`: Swift.Array { - get - } -} -public struct RunAction : Swift.Equatable, Swift.Codable { - public let configuration: ProjectDescription.ConfigurationName - public let attachDebugger: Swift.Bool - public let preActions: [ProjectDescription.ExecutionAction] - public let postActions: [ProjectDescription.ExecutionAction] - public let executable: ProjectDescription.TargetReference? - public let arguments: ProjectDescription.Arguments? - public let options: ProjectDescription.RunActionOptions - public let diagnosticsOptions: [ProjectDescription.SchemeDiagnosticsOption] - public static func runAction(configuration: ProjectDescription.ConfigurationName = .debug, attachDebugger: Swift.Bool = true, preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = [], executable: ProjectDescription.TargetReference? = nil, arguments: ProjectDescription.Arguments? = nil, options: ProjectDescription.RunActionOptions = .options(), diagnosticsOptions: [ProjectDescription.SchemeDiagnosticsOption] = [.mainThreadChecker]) -> ProjectDescription.RunAction - public static func == (a: ProjectDescription.RunAction, b: ProjectDescription.RunAction) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct RunActionOptions : Swift.Equatable, Swift.Codable { - public let language: ProjectDescription.SchemeLanguage? - public let storeKitConfigurationPath: ProjectDescription.Path? - public let simulatedLocation: ProjectDescription.RunActionOptions.SimulatedLocation? - public let enableGPUFrameCaptureMode: ProjectDescription.RunActionOptions.GPUFrameCaptureMode - public static func options(language: ProjectDescription.SchemeLanguage? = nil, storeKitConfigurationPath: ProjectDescription.Path? = nil, simulatedLocation: ProjectDescription.RunActionOptions.SimulatedLocation? = nil, enableGPUFrameCaptureMode: ProjectDescription.RunActionOptions.GPUFrameCaptureMode = GPUFrameCaptureMode.default) -> ProjectDescription.RunActionOptions - public static func == (a: ProjectDescription.RunActionOptions, b: ProjectDescription.RunActionOptions) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.RunActionOptions { - public struct SimulatedLocation : Swift.Codable, Swift.Equatable { - public let identifier: Swift.String? - public let gpxFile: ProjectDescription.Path? - public static func custom(gpxFile: ProjectDescription.Path) -> ProjectDescription.RunActionOptions.SimulatedLocation - public static var london: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var johannesburg: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var moscow: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var mumbai: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var tokyo: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var sydney: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var hongKong: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var honolulu: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var sanFrancisco: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var mexicoCity: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var newYork: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var rioDeJaneiro: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static func == (a: ProjectDescription.RunActionOptions.SimulatedLocation, b: ProjectDescription.RunActionOptions.SimulatedLocation) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } -} -extension ProjectDescription.RunActionOptions { - public enum GPUFrameCaptureMode : Swift.String, Swift.Codable, Swift.Equatable { - case autoEnabled - case metal - case openGL - case disabled - public static var `default`: ProjectDescription.RunActionOptions.GPUFrameCaptureMode { - get - } - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } - } -} -public struct Scheme : Swift.Equatable, Swift.Codable { - public let name: Swift.String - public let shared: Swift.Bool - public let hidden: Swift.Bool - public let buildAction: ProjectDescription.BuildAction? - public let testAction: ProjectDescription.TestAction? - public let runAction: ProjectDescription.RunAction? - public let archiveAction: ProjectDescription.ArchiveAction? - public let profileAction: ProjectDescription.ProfileAction? - public let analyzeAction: ProjectDescription.AnalyzeAction? - public init(name: Swift.String, shared: Swift.Bool = true, hidden: Swift.Bool = false, buildAction: ProjectDescription.BuildAction? = nil, testAction: ProjectDescription.TestAction? = nil, runAction: ProjectDescription.RunAction? = nil, archiveAction: ProjectDescription.ArchiveAction? = nil, profileAction: ProjectDescription.ProfileAction? = nil, analyzeAction: ProjectDescription.AnalyzeAction? = nil) - public static func == (a: ProjectDescription.Scheme, b: ProjectDescription.Scheme) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public enum SchemeDiagnosticsOption : Swift.String, Swift.Equatable, Swift.Codable { - case mainThreadChecker - case performanceAntipatternChecker - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } -} -public struct SchemeLanguage : Swift.Codable, Swift.Equatable, Swift.ExpressibleByStringLiteral { - public let identifier: Swift.String - public init(identifier: Swift.String) - public init(stringLiteral: Swift.String) - public static func == (a: ProjectDescription.SchemeLanguage, b: ProjectDescription.SchemeLanguage) -> Swift.Bool - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.SchemeLanguage { - public static var doubleLengthPseudoLanguage: ProjectDescription.SchemeLanguage { - get - } - public static var rightToLeftPseudoLanguage: ProjectDescription.SchemeLanguage { - get - } - public static var accentedPseudoLanguage: ProjectDescription.SchemeLanguage { - get - } - public static var boundedStringPseudoLanguage: ProjectDescription.SchemeLanguage { - get - } - public static var rightToLeftWithStringsPseudoLanguage: ProjectDescription.SchemeLanguage { - get - } -} -public typealias SettingsDictionary = [Swift.String : ProjectDescription.SettingValue] -public enum SettingValue : Swift.ExpressibleByStringInterpolation, Swift.ExpressibleByArrayLiteral, Swift.ExpressibleByBooleanLiteral, Swift.Equatable, Swift.Codable { - case string(Swift.String) - case array([Swift.String]) - public init(stringLiteral value: Swift.String) - public init(arrayLiteral elements: Swift.String...) - public typealias BooleanLiteralType = Swift.Bool - public init(booleanLiteral value: Swift.Bool) - public init(_ stringRawRepresentable: T) where T : Swift.RawRepresentable, T.RawValue == Swift.String - public static func == (a: ProjectDescription.SettingValue, b: ProjectDescription.SettingValue) -> Swift.Bool - public typealias ArrayLiteralElement = Swift.String - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct Configuration : Swift.Equatable, Swift.Codable { - public enum Variant : Swift.String, Swift.Codable { - case debug - case release - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } - } - public let name: ProjectDescription.ConfigurationName - public let variant: ProjectDescription.Configuration.Variant - public let settings: ProjectDescription.SettingsDictionary - public let xcconfig: ProjectDescription.Path? - public static func debug(name: ProjectDescription.ConfigurationName, settings: ProjectDescription.SettingsDictionary = [:], xcconfig: ProjectDescription.Path? = nil) -> ProjectDescription.Configuration - public static func release(name: ProjectDescription.ConfigurationName, settings: ProjectDescription.SettingsDictionary = [:], xcconfig: ProjectDescription.Path? = nil) -> ProjectDescription.Configuration - public static func == (a: ProjectDescription.Configuration, b: ProjectDescription.Configuration) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public enum DefaultSettings : Swift.Codable, Swift.Equatable { - case recommended(excluding: Swift.Set = []) - case essential(excluding: Swift.Set = []) - case none - public static func == (a: ProjectDescription.DefaultSettings, b: ProjectDescription.DefaultSettings) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.DefaultSettings { - public static var recommended: ProjectDescription.DefaultSettings { - get - } - public static var essential: ProjectDescription.DefaultSettings { - get - } -} -public struct Settings : Swift.Equatable, Swift.Codable { - public let base: ProjectDescription.SettingsDictionary - public let configurations: [ProjectDescription.Configuration] - public let defaultSettings: ProjectDescription.DefaultSettings - public static func settings(base: ProjectDescription.SettingsDictionary = [:], debug: ProjectDescription.SettingsDictionary = [:], release: ProjectDescription.SettingsDictionary = [:], defaultSettings: ProjectDescription.DefaultSettings = .recommended) -> ProjectDescription.Settings - public static func settings(base: ProjectDescription.SettingsDictionary = [:], configurations: [ProjectDescription.Configuration], defaultSettings: ProjectDescription.DefaultSettings = .recommended) -> ProjectDescription.Settings - public static func == (a: ProjectDescription.Settings, b: ProjectDescription.Settings) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension Swift.Dictionary where Key == Swift.String, Value == ProjectDescription.SettingValue { - public mutating func merge(_ other: ProjectDescription.SettingsDictionary) - public func merging(_ other: ProjectDescription.SettingsDictionary) -> ProjectDescription.SettingsDictionary -} -public enum SwiftCompilationMode : Swift.String { - case singlefile - case wholemodule - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } -} -public enum DebugInformationFormat : Swift.String { - case dwarf - case dwarfWithDsym - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } -} -public enum SwiftOptimizationLevel : Swift.String { - case o - case oNone - case oSize - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } -} -extension Swift.Dictionary where Key == Swift.String, Value == ProjectDescription.SettingValue { - public func manualCodeSigning(identity: Swift.String? = nil, provisioningProfileSpecifier: Swift.String? = nil) -> ProjectDescription.SettingsDictionary - public func automaticCodeSigning(devTeam: Swift.String) -> ProjectDescription.SettingsDictionary - public func codeSignIdentityAppleDevelopment() -> ProjectDescription.SettingsDictionary - public func codeSignIdentity(_ identity: Swift.String) -> ProjectDescription.SettingsDictionary - public func currentProjectVersion(_ version: Swift.String) -> ProjectDescription.SettingsDictionary - public func marketingVersion(_ version: Swift.String) -> ProjectDescription.SettingsDictionary - public func appleGenericVersioningSystem() -> ProjectDescription.SettingsDictionary - public func versionInfo(_ version: Swift.String, prefix: Swift.String? = nil, suffix: Swift.String? = nil) -> ProjectDescription.SettingsDictionary - public func swiftVersion(_ version: Swift.String) -> ProjectDescription.SettingsDictionary - public func otherSwiftFlags(_ flags: Swift.String...) -> ProjectDescription.SettingsDictionary - public func swiftActiveCompilationConditions(_ conditions: Swift.String...) -> ProjectDescription.SettingsDictionary - public func swiftCompilationMode(_ mode: ProjectDescription.SwiftCompilationMode) -> ProjectDescription.SettingsDictionary - public func swiftOptimizationLevel(_ level: ProjectDescription.SwiftOptimizationLevel) -> ProjectDescription.SettingsDictionary - public func swiftOptimizeObjectLifetimes(_ enabled: Swift.Bool) -> ProjectDescription.SettingsDictionary - public func swiftObjcBridingHeaderPath(_ path: Swift.String) -> ProjectDescription.SettingsDictionary - public func otherCFlags(_ flags: [Swift.String]) -> ProjectDescription.SettingsDictionary - public func otherLinkerFlags(_ flags: [Swift.String]) -> ProjectDescription.SettingsDictionary - public func bitcodeEnabled(_ enabled: Swift.Bool) -> ProjectDescription.SettingsDictionary - public func debugInformationFormat(_ format: ProjectDescription.DebugInformationFormat) -> ProjectDescription.SettingsDictionary -} -public struct SourceFileGlob : Swift.Codable, Swift.Equatable { - public let glob: ProjectDescription.Path - public let excluding: [ProjectDescription.Path] - public let compilerFlags: Swift.String? - public let codeGen: ProjectDescription.FileCodeGen? - public static func glob(_ glob: ProjectDescription.Path, excluding: [ProjectDescription.Path] = [], compilerFlags: Swift.String? = nil, codeGen: ProjectDescription.FileCodeGen? = nil) -> ProjectDescription.SourceFileGlob - public static func glob(_ glob: ProjectDescription.Path, excluding: ProjectDescription.Path?, compilerFlags: Swift.String? = nil, codeGen: ProjectDescription.FileCodeGen? = nil) -> ProjectDescription.SourceFileGlob - public static func == (a: ProjectDescription.SourceFileGlob, b: ProjectDescription.SourceFileGlob) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.SourceFileGlob : Swift.ExpressibleByStringInterpolation { - public init(stringLiteral value: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -public struct SourceFilesList : Swift.Codable, Swift.Equatable { - public let globs: [ProjectDescription.SourceFileGlob] - public init(globs: [ProjectDescription.SourceFileGlob]) - public init(globs: [Swift.String]) - public static func paths(_ paths: [ProjectDescription.Path]) -> ProjectDescription.SourceFilesList - public static func == (a: ProjectDescription.SourceFilesList, b: ProjectDescription.SourceFilesList) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.SourceFilesList : Swift.ExpressibleByStringInterpolation { - public init(stringLiteral value: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -extension ProjectDescription.SourceFilesList : Swift.ExpressibleByArrayLiteral { - public init(arrayLiteral elements: ProjectDescription.SourceFileGlob...) - public typealias ArrayLiteralElement = ProjectDescription.SourceFileGlob -} -public struct Target : Swift.Codable, Swift.Equatable { - public let name: Swift.String - public let platform: ProjectDescription.Platform - public let product: ProjectDescription.Product - public let productName: Swift.String? - public let bundleId: Swift.String - public let deploymentTarget: ProjectDescription.DeploymentTarget? - public let infoPlist: ProjectDescription.InfoPlist? - public let sources: ProjectDescription.SourceFilesList? - public let resources: ProjectDescription.ResourceFileElements? - public let copyFiles: [ProjectDescription.CopyFilesAction]? - public let headers: ProjectDescription.Headers? - public let entitlements: ProjectDescription.Path? - public let scripts: [ProjectDescription.TargetScript] - public let dependencies: [ProjectDescription.TargetDependency] - public let settings: ProjectDescription.Settings? - public let coreDataModels: [ProjectDescription.CoreDataModel] - public let environment: [Swift.String : Swift.String] - public let launchArguments: [ProjectDescription.LaunchArgument] - public let additionalFiles: [ProjectDescription.FileElement] - public init(name: Swift.String, platform: ProjectDescription.Platform, product: ProjectDescription.Product, productName: Swift.String? = nil, bundleId: Swift.String, deploymentTarget: ProjectDescription.DeploymentTarget? = nil, infoPlist: ProjectDescription.InfoPlist? = .default, sources: ProjectDescription.SourceFilesList? = nil, resources: ProjectDescription.ResourceFileElements? = nil, copyFiles: [ProjectDescription.CopyFilesAction]? = nil, headers: ProjectDescription.Headers? = nil, entitlements: ProjectDescription.Path? = nil, scripts: [ProjectDescription.TargetScript] = [], dependencies: [ProjectDescription.TargetDependency] = [], settings: ProjectDescription.Settings? = nil, coreDataModels: [ProjectDescription.CoreDataModel] = [], environment: [Swift.String : Swift.String] = [:], launchArguments: [ProjectDescription.LaunchArgument] = [], additionalFiles: [ProjectDescription.FileElement] = []) - public static func == (a: ProjectDescription.Target, b: ProjectDescription.Target) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public enum SDKStatus : Swift.String, Swift.Codable, Swift.Hashable { - case required - case optional - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } -} -public enum SDKType : Swift.String, Swift.Codable, Swift.Hashable { - case library - case framework - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } -} -public enum TargetDependency : Swift.Codable, Swift.Hashable { - case target(name: Swift.String) - case project(target: Swift.String, path: ProjectDescription.Path) - case framework(path: ProjectDescription.Path) - case library(path: ProjectDescription.Path, publicHeaders: ProjectDescription.Path, swiftModuleMap: ProjectDescription.Path?) - case package(product: Swift.String) - case sdk(name: Swift.String, type: ProjectDescription.SDKType, status: ProjectDescription.SDKStatus) - case xcframework(path: ProjectDescription.Path) - case xctest - case external(name: Swift.String) - public static func sdk(name: Swift.String, type: ProjectDescription.SDKType) -> ProjectDescription.TargetDependency - public var typeName: Swift.String { - get - } - public func hash(into hasher: inout Swift.Hasher) - public static func == (a: ProjectDescription.TargetDependency, b: ProjectDescription.TargetDependency) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public var hashValue: Swift.Int { - get - } - public init(from decoder: Swift.Decoder) throws -} -public struct TargetReference : Swift.Hashable, Swift.Codable, Swift.ExpressibleByStringInterpolation { - public var projectPath: ProjectDescription.Path? - public var targetName: Swift.String - public init(projectPath: ProjectDescription.Path?, target: Swift.String) - public init(stringLiteral value: Swift.String) - public static func project(path: ProjectDescription.Path, target: Swift.String) -> ProjectDescription.TargetReference - public func hash(into hasher: inout Swift.Hasher) - public static func == (a: ProjectDescription.TargetReference, b: ProjectDescription.TargetReference) -> Swift.Bool - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String - public func encode(to encoder: Swift.Encoder) throws - public var hashValue: Swift.Int { - get - } - public init(from decoder: Swift.Decoder) throws -} -public struct TargetScript : Swift.Codable, Swift.Equatable { - public enum Order : Swift.String, Swift.Codable, Swift.Equatable { - case pre - case post - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } - } - public enum Script : Swift.Equatable, Swift.Codable { - case tool(path: Swift.String, args: [Swift.String]) - case scriptPath(path: ProjectDescription.Path, args: [Swift.String]) - case embedded(Swift.String) - public static func == (a: ProjectDescription.TargetScript.Script, b: ProjectDescription.TargetScript.Script) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - public let name: Swift.String - public let script: ProjectDescription.TargetScript.Script - public let order: ProjectDescription.TargetScript.Order - public let inputPaths: [ProjectDescription.Path] - public let inputFileListPaths: [ProjectDescription.Path] - public let outputPaths: [ProjectDescription.Path] - public let outputFileListPaths: [ProjectDescription.Path] - public let basedOnDependencyAnalysis: Swift.Bool? - public let runForInstallBuildsOnly: Swift.Bool - public let shellPath: Swift.String - public static func pre(path: ProjectDescription.Path, arguments: Swift.String..., name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript - public static func pre(path: ProjectDescription.Path, arguments: [Swift.String], name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript - public static func post(path: ProjectDescription.Path, arguments: Swift.String..., name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript - public static func post(path: ProjectDescription.Path, arguments: [Swift.String], name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript - public static func pre(tool: Swift.String, arguments: Swift.String..., name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript - public static func pre(tool: Swift.String, arguments: [Swift.String], name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript - public static func post(tool: Swift.String, arguments: Swift.String..., name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript - public static func post(tool: Swift.String, arguments: [Swift.String], name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript - public static func pre(script: Swift.String, name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript - public static func post(script: Swift.String, name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript - public static func == (a: ProjectDescription.TargetScript, b: ProjectDescription.TargetScript) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct Template : Swift.Codable, Swift.Equatable { - public let description: Swift.String - public let attributes: [ProjectDescription.Template.Attribute] - public let items: [ProjectDescription.Template.Item] - public init(description: Swift.String, attributes: [ProjectDescription.Template.Attribute] = [], items: [ProjectDescription.Template.Item] = []) - public enum Contents : Swift.Codable, Swift.Equatable { - case string(Swift.String) - case file(ProjectDescription.Path) - case directory(ProjectDescription.Path) - public static func == (a: ProjectDescription.Template.Contents, b: ProjectDescription.Template.Contents) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - public struct Item : Swift.Codable, Swift.Equatable { - public let path: Swift.String - public let contents: ProjectDescription.Template.Contents - public init(path: Swift.String, contents: ProjectDescription.Template.Contents) - public static func == (a: ProjectDescription.Template.Item, b: ProjectDescription.Template.Item) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - public enum Attribute : Swift.Codable, Swift.Equatable { - case required(Swift.String) - case optional(Swift.String, default: Swift.String) - public static func == (a: ProjectDescription.Template.Attribute, b: ProjectDescription.Template.Attribute) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - public static func == (a: ProjectDescription.Template, b: ProjectDescription.Template) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.Template.Item { - public static func string(path: Swift.String, contents: Swift.String) -> ProjectDescription.Template.Item - public static func file(path: Swift.String, templatePath: ProjectDescription.Path) -> ProjectDescription.Template.Item - public static func directory(path: Swift.String, sourcePath: ProjectDescription.Path) -> ProjectDescription.Template.Item -} -extension Swift.DefaultStringInterpolation { - public mutating func appendInterpolation(_ value: ProjectDescription.Template.Attribute) -} -public struct TemplateString : Swift.Encodable, Swift.Decodable, Swift.Equatable { - public static func == (a: ProjectDescription.TemplateString, b: ProjectDescription.TemplateString) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.TemplateString : Swift.ExpressibleByStringLiteral { - public init(stringLiteral: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -extension ProjectDescription.TemplateString : Swift.CustomStringConvertible { - public var description: Swift.String { - get - } -} -extension ProjectDescription.TemplateString : Swift.ExpressibleByStringInterpolation { - public init(stringInterpolation: ProjectDescription.TemplateString.StringInterpolation) - public struct StringInterpolation : Swift.StringInterpolationProtocol { - public init(literalCapacity _: Swift.Int, interpolationCount _: Swift.Int) - public mutating func appendLiteral(_ literal: Swift.String) - public mutating func appendInterpolation(_ token: ProjectDescription.TemplateString.Token) - public typealias StringLiteralType = Swift.String - } -} -extension ProjectDescription.TemplateString { - public enum Token : Swift.String, Swift.Equatable { - case projectName - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } - } -} -public struct TestAction : Swift.Equatable, Swift.Codable { - public let testPlans: [ProjectDescription.Path]? - public let targets: [ProjectDescription.TestableTarget] - public let arguments: ProjectDescription.Arguments? - public let configuration: ProjectDescription.ConfigurationName - public let attachDebugger: Swift.Bool - public let expandVariableFromTarget: ProjectDescription.TargetReference? - public let preActions: [ProjectDescription.ExecutionAction] - public let postActions: [ProjectDescription.ExecutionAction] - public let options: ProjectDescription.TestActionOptions - public let diagnosticsOptions: [ProjectDescription.SchemeDiagnosticsOption] - public static func targets(_ targets: [ProjectDescription.TestableTarget], arguments: ProjectDescription.Arguments? = nil, configuration: ProjectDescription.ConfigurationName = .debug, attachDebugger: Swift.Bool = true, expandVariableFromTarget: ProjectDescription.TargetReference? = nil, preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = [], options: ProjectDescription.TestActionOptions = .options(), diagnosticsOptions: [ProjectDescription.SchemeDiagnosticsOption] = [.mainThreadChecker]) -> ProjectDescription.TestAction - public static func testPlans(_ testPlans: [ProjectDescription.Path], configuration: ProjectDescription.ConfigurationName = .debug, attachDebugger: Swift.Bool = true, preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = []) -> ProjectDescription.TestAction - public static func == (a: ProjectDescription.TestAction, b: ProjectDescription.TestAction) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct TestActionOptions : Swift.Equatable, Swift.Codable { - public let language: ProjectDescription.SchemeLanguage? - public let region: Swift.String? - public let coverage: Swift.Bool - public let codeCoverageTargets: [ProjectDescription.TargetReference] - public static func options(language: ProjectDescription.SchemeLanguage? = nil, region: Swift.String? = nil, coverage: Swift.Bool = false, codeCoverageTargets: [ProjectDescription.TargetReference] = []) -> ProjectDescription.TestActionOptions - public static func == (a: ProjectDescription.TestActionOptions, b: ProjectDescription.TestActionOptions) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct TestableTarget : Swift.Equatable, Swift.Codable, Swift.ExpressibleByStringInterpolation { - public let target: ProjectDescription.TargetReference - public let isSkipped: Swift.Bool - public let isParallelizable: Swift.Bool - public let isRandomExecutionOrdering: Swift.Bool - public init(target: ProjectDescription.TargetReference, skipped: Swift.Bool = false, parallelizable: Swift.Bool = false, randomExecutionOrdering: Swift.Bool = false) - public init(stringLiteral value: Swift.String) - public static func == (a: ProjectDescription.TestableTarget, b: ProjectDescription.TestableTarget) -> Swift.Bool - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct TestingOptions : Swift.OptionSet, Swift.Codable, Swift.Equatable { - public let rawValue: Swift.Int - public init(rawValue: Swift.Int) - public static let parallelizable: ProjectDescription.TestingOptions - public static let randomExecutionOrdering: ProjectDescription.TestingOptions - public typealias ArrayLiteralElement = ProjectDescription.TestingOptions - public typealias Element = ProjectDescription.TestingOptions - public typealias RawValue = Swift.Int -} -public struct Version : Swift.Hashable, Swift.Codable { - public let major: Swift.Int - public let minor: Swift.Int - public let patch: Swift.Int - public let prereleaseIdentifiers: [Swift.String] - public let buildMetadataIdentifiers: [Swift.String] - public init(_ major: Swift.Int, _ minor: Swift.Int, _ patch: Swift.Int, prereleaseIdentifiers: [Swift.String] = [], buildMetadataIdentifiers: [Swift.String] = []) - public static func == (a: ProjectDescription.Version, b: ProjectDescription.Version) -> Swift.Bool - public func hash(into hasher: inout Swift.Hasher) - public func encode(to encoder: Swift.Encoder) throws - public var hashValue: Swift.Int { - get - } - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.Version : Swift.Comparable { - public static func < (lhs: ProjectDescription.Version, rhs: ProjectDescription.Version) -> Swift.Bool -} -extension ProjectDescription.Version : Swift.CustomStringConvertible { - public var description: Swift.String { - get - } -} -extension ProjectDescription.Version { - public init?(string: Swift.String) -} -extension ProjectDescription.Version : Swift.ExpressibleByStringInterpolation { - public init(stringLiteral value: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -extension Swift.ClosedRange where Bound == ProjectDescription.Version { - public func contains(_: ProjectDescription.Version) -> Swift.Bool -} -extension Swift.Range where Bound == ProjectDescription.Version { - public func contains(_: ProjectDescription.Version) -> Swift.Bool -} -extension Swift.Range where Bound == ProjectDescription.Version { - public func contains(version: ProjectDescription.Version) -> Swift.Bool -} -public struct Workspace : Swift.Codable, Swift.Equatable { - public let name: Swift.String - public let projects: [ProjectDescription.Path] - public let schemes: [ProjectDescription.Scheme] - public let fileHeaderTemplate: ProjectDescription.FileHeaderTemplate? - public let additionalFiles: [ProjectDescription.FileElement] - public let generationOptions: ProjectDescription.Workspace.GenerationOptions - public init(name: Swift.String, projects: [ProjectDescription.Path], schemes: [ProjectDescription.Scheme] = [], fileHeaderTemplate: ProjectDescription.FileHeaderTemplate? = nil, additionalFiles: [ProjectDescription.FileElement] = [], generationOptions: ProjectDescription.Workspace.GenerationOptions = .options()) - public static func == (a: ProjectDescription.Workspace, b: ProjectDescription.Workspace) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.Workspace { - public struct GenerationOptions : Swift.Codable, Swift.Equatable { - public enum AutogeneratedWorkspaceSchemes : Swift.Codable, Swift.Equatable { - public enum CodeCoverageMode : Swift.Codable, Swift.Equatable { - case all - case relevant - case targets([ProjectDescription.TargetReference]) - case disabled - public static func == (a: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes.CodeCoverageMode, b: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes.CodeCoverageMode) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - case disabled - case enabled(codeCoverageMode: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes.CodeCoverageMode = .disabled, testingOptions: ProjectDescription.TestingOptions = []) - public static func == (a: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes, b: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - public let enableAutomaticXcodeSchemes: Swift.Bool? - public let autogeneratedWorkspaceSchemes: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes - public let lastXcodeUpgradeCheck: ProjectDescription.Version? - public let renderMarkdownReadme: Swift.Bool - public static func options(enableAutomaticXcodeSchemes: Swift.Bool? = false, autogeneratedWorkspaceSchemes: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes = .enabled(), lastXcodeUpgradeCheck: ProjectDescription.Version? = nil, renderMarkdownReadme: Swift.Bool = false) -> ProjectDescription.Workspace.GenerationOptions - public static func == (a: ProjectDescription.Workspace.GenerationOptions, b: ProjectDescription.Workspace.GenerationOptions) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } -} -extension ProjectDescription.Cloud.Option : Swift.Hashable {} -extension ProjectDescription.Cloud.Option : Swift.RawRepresentable {} -extension ProjectDescription.CopyFilesAction.Destination : Swift.Hashable {} -extension ProjectDescription.CopyFilesAction.Destination : Swift.RawRepresentable {} -extension ProjectDescription.FileCodeGen : Swift.Hashable {} -extension ProjectDescription.FileCodeGen : Swift.RawRepresentable {} -extension ProjectDescription.Headers.AutomaticExclusionRule : Swift.Equatable {} -extension ProjectDescription.Headers.AutomaticExclusionRule : Swift.Hashable {} -extension ProjectDescription.Headers.AutomaticExclusionRule : Swift.RawRepresentable {} -extension ProjectDescription.Path.PathType : Swift.Equatable {} -extension ProjectDescription.Path.PathType : Swift.Hashable {} -extension ProjectDescription.Path.PathType : Swift.RawRepresentable {} -extension ProjectDescription.Platform : Swift.Hashable {} -extension ProjectDescription.Platform : Swift.RawRepresentable {} -extension ProjectDescription.Product : Swift.Hashable {} -extension ProjectDescription.Product : Swift.RawRepresentable {} -extension ProjectDescription.ResourceSynthesizer.Parser : Swift.Equatable {} -extension ProjectDescription.ResourceSynthesizer.Parser : Swift.Hashable {} -extension ProjectDescription.ResourceSynthesizer.Parser : Swift.RawRepresentable {} -extension ProjectDescription.RunActionOptions.GPUFrameCaptureMode : Swift.Hashable {} -extension ProjectDescription.RunActionOptions.GPUFrameCaptureMode : Swift.RawRepresentable {} -extension ProjectDescription.SchemeDiagnosticsOption : Swift.Hashable {} -extension ProjectDescription.SchemeDiagnosticsOption : Swift.RawRepresentable {} -extension ProjectDescription.Configuration.Variant : Swift.Equatable {} -extension ProjectDescription.Configuration.Variant : Swift.Hashable {} -extension ProjectDescription.Configuration.Variant : Swift.RawRepresentable {} -extension ProjectDescription.SwiftCompilationMode : Swift.Equatable {} -extension ProjectDescription.SwiftCompilationMode : Swift.Hashable {} -extension ProjectDescription.SwiftCompilationMode : Swift.RawRepresentable {} -extension ProjectDescription.DebugInformationFormat : Swift.Equatable {} -extension ProjectDescription.DebugInformationFormat : Swift.Hashable {} -extension ProjectDescription.DebugInformationFormat : Swift.RawRepresentable {} -extension ProjectDescription.SwiftOptimizationLevel : Swift.Equatable {} -extension ProjectDescription.SwiftOptimizationLevel : Swift.Hashable {} -extension ProjectDescription.SwiftOptimizationLevel : Swift.RawRepresentable {} -extension ProjectDescription.SDKStatus : Swift.RawRepresentable {} -extension ProjectDescription.SDKType : Swift.RawRepresentable {} -extension ProjectDescription.TargetScript.Order : Swift.Hashable {} -extension ProjectDescription.TargetScript.Order : Swift.RawRepresentable {} -extension ProjectDescription.TemplateString.Token : Swift.Hashable {} -extension ProjectDescription.TemplateString.Token : Swift.RawRepresentable {} diff --git a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/arm64-apple-macos.swiftmodule b/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/arm64-apple-macos.swiftmodule deleted file mode 100644 index b26ec9477..000000000 Binary files a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/arm64-apple-macos.swiftmodule and /dev/null differ diff --git a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/arm64.swiftdoc b/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/arm64.swiftdoc deleted file mode 100644 index afc20046e..000000000 Binary files a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/arm64.swiftdoc and /dev/null differ diff --git a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/arm64.swiftinterface b/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/arm64.swiftinterface deleted file mode 100644 index 99e7d8a4b..000000000 --- a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/arm64.swiftinterface +++ /dev/null @@ -1,1418 +0,0 @@ -// swift-interface-format-version: 1.0 -// swift-compiler-version: Apple Swift version 5.5.1 (swiftlang-1300.0.31.4 clang-1300.0.29.6) -// swift-module-flags: -target arm64-apple-macos11.0 -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -module-name ProjectDescription -import Foundation -import Swift -import _Concurrency -public struct AnalyzeAction : Swift.Equatable, Swift.Codable { - public let configuration: ProjectDescription.ConfigurationName - public static func analyzeAction(configuration: ProjectDescription.ConfigurationName) -> ProjectDescription.AnalyzeAction - public static func == (a: ProjectDescription.AnalyzeAction, b: ProjectDescription.AnalyzeAction) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct ArchiveAction : Swift.Equatable, Swift.Codable { - public let configuration: ProjectDescription.ConfigurationName - public let revealArchiveInOrganizer: Swift.Bool - public let customArchiveName: Swift.String? - public let preActions: [ProjectDescription.ExecutionAction] - public let postActions: [ProjectDescription.ExecutionAction] - public static func archiveAction(configuration: ProjectDescription.ConfigurationName, revealArchiveInOrganizer: Swift.Bool = true, customArchiveName: Swift.String? = nil, preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = []) -> ProjectDescription.ArchiveAction - public static func == (a: ProjectDescription.ArchiveAction, b: ProjectDescription.ArchiveAction) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct Arguments : Swift.Equatable, Swift.Codable { - public let environment: [Swift.String : Swift.String] - public let launchArguments: [ProjectDescription.LaunchArgument] - public init(environment: [Swift.String : Swift.String] = [:], launchArguments: [ProjectDescription.LaunchArgument] = []) - public static func == (a: ProjectDescription.Arguments, b: ProjectDescription.Arguments) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct BuildAction : Swift.Equatable, Swift.Codable { - public let targets: [ProjectDescription.TargetReference] - public let preActions: [ProjectDescription.ExecutionAction] - public let postActions: [ProjectDescription.ExecutionAction] - public let runPostActionsOnFailure: Swift.Bool - public init(targets: [ProjectDescription.TargetReference], preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = [], runPostActionsOnFailure: Swift.Bool = false) - public static func buildAction(targets: [ProjectDescription.TargetReference], preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = [], runPostActionsOnFailure: Swift.Bool = false) -> ProjectDescription.BuildAction - public static func == (a: ProjectDescription.BuildAction, b: ProjectDescription.BuildAction) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct Cache : Swift.Codable, Swift.Equatable { - public struct Profile : Swift.Codable, Swift.Equatable { - public let name: Swift.String - public let configuration: Swift.String - public let device: Swift.String? - public let os: Swift.String? - public static func profile(name: Swift.String, configuration: Swift.String, device: Swift.String? = nil, os: Swift.String? = nil) -> ProjectDescription.Cache.Profile - public static func == (a: ProjectDescription.Cache.Profile, b: ProjectDescription.Cache.Profile) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - public let profiles: [ProjectDescription.Cache.Profile] - public let path: ProjectDescription.Path? - public static func cache(profiles: [ProjectDescription.Cache.Profile] = [], path: ProjectDescription.Path? = nil) -> ProjectDescription.Cache - public static func == (a: ProjectDescription.Cache, b: ProjectDescription.Cache) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct Cloud : Swift.Codable, Swift.Equatable { - public enum Option : Swift.String, Swift.Codable, Swift.Equatable { - case analytics - case optional - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } - } - public let url: Swift.String - public let projectId: Swift.String - public let options: [ProjectDescription.Cloud.Option] - public static func cloud(projectId: Swift.String, url: Swift.String, options: [ProjectDescription.Cloud.Option] = []) -> ProjectDescription.Cloud - public static func == (a: ProjectDescription.Cloud, b: ProjectDescription.Cloud) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public enum CompatibleXcodeVersions : Swift.ExpressibleByArrayLiteral, Swift.ExpressibleByStringInterpolation, Swift.Codable, Swift.Equatable { - case all - case exact(ProjectDescription.Version) - case upToNextMajor(ProjectDescription.Version) - case upToNextMinor(ProjectDescription.Version) - case list([ProjectDescription.CompatibleXcodeVersions]) - public init(arrayLiteral elements: [ProjectDescription.CompatibleXcodeVersions]) - public init(arrayLiteral elements: ProjectDescription.CompatibleXcodeVersions...) - public init(stringLiteral value: Swift.String) - public static func == (a: ProjectDescription.CompatibleXcodeVersions, b: ProjectDescription.CompatibleXcodeVersions) -> Swift.Bool - public typealias ArrayLiteralElement = ProjectDescription.CompatibleXcodeVersions - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct Config : Swift.Codable, Swift.Equatable { - public let generationOptions: ProjectDescription.Config.GenerationOptions - public let compatibleXcodeVersions: ProjectDescription.CompatibleXcodeVersions - public let plugins: [ProjectDescription.PluginLocation] - public let cloud: ProjectDescription.Cloud? - public let cache: ProjectDescription.Cache? - public let swiftVersion: ProjectDescription.Version? - public init(compatibleXcodeVersions: ProjectDescription.CompatibleXcodeVersions = .all, cloud: ProjectDescription.Cloud? = nil, cache: ProjectDescription.Cache? = nil, swiftVersion: ProjectDescription.Version? = nil, plugins: [ProjectDescription.PluginLocation] = [], generationOptions: ProjectDescription.Config.GenerationOptions = .options()) - public static func == (a: ProjectDescription.Config, b: ProjectDescription.Config) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.Config { - public struct GenerationOptions : Swift.Codable, Swift.Equatable { - public let resolveDependenciesWithSystemScm: Swift.Bool - public let disablePackageVersionLocking: Swift.Bool - public static func options(resolveDependenciesWithSystemScm: Swift.Bool = false, disablePackageVersionLocking: Swift.Bool = false) -> ProjectDescription.Config.GenerationOptions - public static func == (a: ProjectDescription.Config.GenerationOptions, b: ProjectDescription.Config.GenerationOptions) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } -} -public struct ConfigurationName : Swift.ExpressibleByStringLiteral, Swift.Codable, Swift.Equatable { - public let rawValue: Swift.String - public init(stringLiteral value: Swift.StringLiteralType) - public static func configuration(_ name: Swift.String) -> ProjectDescription.ConfigurationName - public static var debug: ProjectDescription.ConfigurationName { - get - } - public static var release: ProjectDescription.ConfigurationName { - get - } - public static func == (a: ProjectDescription.ConfigurationName, b: ProjectDescription.ConfigurationName) -> Swift.Bool - public typealias ExtendedGraphemeClusterLiteralType = Swift.StringLiteralType - public typealias StringLiteralType = Swift.StringLiteralType - public typealias UnicodeScalarLiteralType = Swift.StringLiteralType - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct CopyFilesAction : Swift.Codable, Swift.Equatable { - public var name: Swift.String - public var destination: ProjectDescription.CopyFilesAction.Destination - public var subpath: Swift.String? - public var files: [ProjectDescription.FileElement] - public enum Destination : Swift.String, Swift.Codable, Swift.Equatable { - case absolutePath - case productsDirectory - case wrapper - case executables - case resources - case javaResources - case frameworks - case sharedFrameworks - case sharedSupport - case plugins - case other - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } - } - public static func productsDirectory(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction - public static func wrapper(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction - public static func executables(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction - public static func resources(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction - public static func javaResources(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction - public static func frameworks(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction - public static func sharedFrameworks(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction - public static func sharedSupport(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction - public static func plugins(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction - public static func == (a: ProjectDescription.CopyFilesAction, b: ProjectDescription.CopyFilesAction) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct CoreDataModel : Swift.Codable, Swift.Equatable { - public let path: ProjectDescription.Path - public let currentVersion: Swift.String? - public init(_ path: ProjectDescription.Path, currentVersion: Swift.String? = nil) - public static func == (a: ProjectDescription.CoreDataModel, b: ProjectDescription.CoreDataModel) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct CarthageDependencies : Swift.Codable, Swift.Equatable { - public let dependencies: [ProjectDescription.CarthageDependencies.Dependency] - public init(_ dependencies: [ProjectDescription.CarthageDependencies.Dependency]) - public static func == (a: ProjectDescription.CarthageDependencies, b: ProjectDescription.CarthageDependencies) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.CarthageDependencies : Swift.ExpressibleByArrayLiteral { - public init(arrayLiteral elements: ProjectDescription.CarthageDependencies.Dependency...) - public typealias ArrayLiteralElement = ProjectDescription.CarthageDependencies.Dependency -} -extension ProjectDescription.CarthageDependencies { - public enum Dependency : Swift.Codable, Swift.Equatable { - case github(path: Swift.String, requirement: ProjectDescription.CarthageDependencies.Requirement) - case git(path: Swift.String, requirement: ProjectDescription.CarthageDependencies.Requirement) - case binary(path: Swift.String, requirement: ProjectDescription.CarthageDependencies.Requirement) - public static func == (a: ProjectDescription.CarthageDependencies.Dependency, b: ProjectDescription.CarthageDependencies.Dependency) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - public enum Requirement : Swift.Codable, Swift.Equatable { - case exact(ProjectDescription.Version) - case upToNext(ProjectDescription.Version) - case atLeast(ProjectDescription.Version) - case branch(Swift.String) - case revision(Swift.String) - public static func == (a: ProjectDescription.CarthageDependencies.Requirement, b: ProjectDescription.CarthageDependencies.Requirement) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } -} -public struct Dependencies : Swift.Codable, Swift.Equatable { - public let carthage: ProjectDescription.CarthageDependencies? - public let swiftPackageManager: ProjectDescription.SwiftPackageManagerDependencies? - public let platforms: Swift.Set - public init(carthage: ProjectDescription.CarthageDependencies? = nil, swiftPackageManager: ProjectDescription.SwiftPackageManagerDependencies? = nil, platforms: Swift.Set = Set(Platform.allCases)) - public static func == (a: ProjectDescription.Dependencies, b: ProjectDescription.Dependencies) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct SwiftPackageManagerDependencies : Swift.Codable, Swift.Equatable { - public let packages: [ProjectDescription.Package] - public let productTypes: [Swift.String : ProjectDescription.Product] - public let baseSettings: ProjectDescription.Settings - public let targetSettings: [Swift.String : ProjectDescription.SettingsDictionary] - public let projectOptions: [Swift.String : ProjectDescription.Project.Options] - public init(_ packages: [ProjectDescription.Package], productTypes: [Swift.String : ProjectDescription.Product] = [:], baseSettings: ProjectDescription.Settings = .settings(), targetSettings: [Swift.String : ProjectDescription.SettingsDictionary] = [:], projectOptions: [Swift.String : ProjectDescription.Project.Options] = [:]) - public static func == (a: ProjectDescription.SwiftPackageManagerDependencies, b: ProjectDescription.SwiftPackageManagerDependencies) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.SwiftPackageManagerDependencies : Swift.ExpressibleByArrayLiteral { - public init(arrayLiteral elements: ProjectDescription.Package...) - public typealias ArrayLiteralElement = ProjectDescription.Package -} -public struct DeploymentDevice : Swift.OptionSet, Swift.Codable, Swift.Hashable { - public static let iphone: ProjectDescription.DeploymentDevice - public static let ipad: ProjectDescription.DeploymentDevice - public static let mac: ProjectDescription.DeploymentDevice - public let rawValue: Swift.UInt - public init(rawValue: Swift.UInt) - public typealias ArrayLiteralElement = ProjectDescription.DeploymentDevice - public typealias Element = ProjectDescription.DeploymentDevice - public typealias RawValue = Swift.UInt -} -public enum DeploymentTarget : Swift.Codable, Swift.Hashable { - case iOS(targetVersion: Swift.String, devices: ProjectDescription.DeploymentDevice) - case macOS(targetVersion: Swift.String) - case watchOS(targetVersion: Swift.String) - case tvOS(targetVersion: Swift.String) - public var targetVersion: Swift.String { - get - } - public func hash(into hasher: inout Swift.Hasher) - public static func == (a: ProjectDescription.DeploymentTarget, b: ProjectDescription.DeploymentTarget) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public var hashValue: Swift.Int { - get - } - public init(from decoder: Swift.Decoder) throws -} -@dynamicMemberLookup public enum Environment { - public enum Value : Swift.Equatable { - case boolean(Swift.Bool) - case string(Swift.String) - public static func == (a: ProjectDescription.Environment.Value, b: ProjectDescription.Environment.Value) -> Swift.Bool - } - public static subscript(dynamicMember member: Swift.String) -> ProjectDescription.Environment.Value? { - get - } -} -extension Swift.Optional where Wrapped == ProjectDescription.Environment.Value { - public func getString(default defaultString: Swift.String) -> Swift.String - public func getBoolean(default defaultBoolean: Swift.Bool) -> Swift.Bool -} -public struct ExecutionAction : Swift.Equatable, Swift.Codable { - public let title: Swift.String - public let scriptText: Swift.String - public let target: ProjectDescription.TargetReference? - public init(title: Swift.String = "Run Script", scriptText: Swift.String, target: ProjectDescription.TargetReference? = nil) - public static func == (a: ProjectDescription.ExecutionAction, b: ProjectDescription.ExecutionAction) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public enum FileCodeGen : Swift.String, Swift.Codable, Swift.Equatable { - case `public` - case `private` - case project - case disabled - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } -} -public enum FileElement : Swift.Codable, Swift.Equatable { - case glob(pattern: ProjectDescription.Path) - case folderReference(path: ProjectDescription.Path) - public static func == (a: ProjectDescription.FileElement, b: ProjectDescription.FileElement) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.FileElement : Swift.ExpressibleByStringInterpolation { - public init(stringLiteral value: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -extension Swift.Array : Swift.ExpressibleByUnicodeScalarLiteral where Element == ProjectDescription.FileElement { - public typealias UnicodeScalarLiteralType = Swift.String -} -extension Swift.Array : Swift.ExpressibleByExtendedGraphemeClusterLiteral where Element == ProjectDescription.FileElement { - public typealias ExtendedGraphemeClusterLiteralType = Swift.String -} -extension Swift.Array : Swift.ExpressibleByStringLiteral where Element == ProjectDescription.FileElement { - public typealias StringLiteralType = Swift.String - public init(stringLiteral value: Swift.String) -} -public enum FileHeaderTemplate : Swift.Codable, Swift.Equatable, Swift.ExpressibleByStringInterpolation { - case file(ProjectDescription.Path) - case string(Swift.String) - public init(stringLiteral value: Swift.String) - public static func == (a: ProjectDescription.FileHeaderTemplate, b: ProjectDescription.FileHeaderTemplate) -> Swift.Bool - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct FileList : Swift.Codable, Swift.Equatable { - public let globs: [ProjectDescription.FileListGlob] - public static func list(_ globs: [ProjectDescription.FileListGlob]) -> ProjectDescription.FileList - public static func == (a: ProjectDescription.FileList, b: ProjectDescription.FileList) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.FileList : Swift.ExpressibleByStringInterpolation { - public init(stringLiteral value: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -extension ProjectDescription.FileList : Swift.ExpressibleByArrayLiteral { - public init(arrayLiteral elements: Swift.String...) - public typealias ArrayLiteralElement = Swift.String -} -public struct FileListGlob : Swift.Codable, Swift.Equatable { - public var glob: ProjectDescription.Path - public var excluding: [ProjectDescription.Path] - public static func glob(_ glob: ProjectDescription.Path, excluding: [ProjectDescription.Path] = []) -> ProjectDescription.FileListGlob - public static func glob(_ glob: ProjectDescription.Path, excluding: ProjectDescription.Path?) -> ProjectDescription.FileListGlob - public static func == (a: ProjectDescription.FileListGlob, b: ProjectDescription.FileListGlob) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.FileListGlob : Swift.ExpressibleByStringInterpolation { - public init(stringLiteral value: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -public struct Headers : Swift.Codable, Swift.Equatable { - public enum AutomaticExclusionRule : Swift.Int, Swift.Codable { - case projectExcludesPrivateAndPublic - case publicExcludesPrivateAndProject - public init?(rawValue: Swift.Int) - public typealias RawValue = Swift.Int - public var rawValue: Swift.Int { - get - } - } - public let umbrellaHeader: ProjectDescription.Path? - public let `public`: ProjectDescription.FileList? - public let `private`: ProjectDescription.FileList? - public let project: ProjectDescription.FileList? - public let exclusionRule: ProjectDescription.Headers.AutomaticExclusionRule - public static func headers(public: ProjectDescription.FileList? = nil, private: ProjectDescription.FileList? = nil, project: ProjectDescription.FileList? = nil, exclusionRule: ProjectDescription.Headers.AutomaticExclusionRule = .projectExcludesPrivateAndPublic) -> ProjectDescription.Headers - public static func allHeaders(from list: ProjectDescription.FileList, umbrella: ProjectDescription.Path, private privateHeaders: ProjectDescription.FileList? = nil) -> ProjectDescription.Headers - public static func onlyHeaders(from list: ProjectDescription.FileList, umbrella: ProjectDescription.Path, private privateHeaders: ProjectDescription.FileList? = nil) -> ProjectDescription.Headers - public static func == (a: ProjectDescription.Headers, b: ProjectDescription.Headers) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public enum InfoPlist : Swift.Codable, Swift.Equatable { - indirect public enum Value : Swift.Codable, Swift.Equatable { - case string(Swift.String) - case integer(Swift.Int) - case real(Swift.Double) - case boolean(Swift.Bool) - case dictionary([Swift.String : ProjectDescription.InfoPlist.Value]) - case array([ProjectDescription.InfoPlist.Value]) - public static func == (a: ProjectDescription.InfoPlist.Value, b: ProjectDescription.InfoPlist.Value) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - case file(path: ProjectDescription.Path) - case dictionary([Swift.String : ProjectDescription.InfoPlist.Value]) - case extendingDefault(with: [Swift.String : ProjectDescription.InfoPlist.Value]) - public static var `default`: ProjectDescription.InfoPlist { - get - } - public enum CodingError : Swift.Error { - case invalidType(Swift.String) - } - public var path: ProjectDescription.Path? { - get - } - public static func == (a: ProjectDescription.InfoPlist, b: ProjectDescription.InfoPlist) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.InfoPlist : Swift.ExpressibleByStringInterpolation { - public init(stringLiteral value: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByStringInterpolation { - public init(stringLiteral value: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByIntegerLiteral { - public init(integerLiteral value: Swift.Int) - public typealias IntegerLiteralType = Swift.Int -} -extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByFloatLiteral { - public init(floatLiteral value: Swift.Double) - public typealias FloatLiteralType = Swift.Double -} -extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Swift.Bool) - public typealias BooleanLiteralType = Swift.Bool -} -extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByDictionaryLiteral { - public init(dictionaryLiteral elements: (Swift.String, ProjectDescription.InfoPlist.Value)...) - public typealias Key = Swift.String - public typealias Value = ProjectDescription.InfoPlist.Value -} -extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByArrayLiteral { - public init(arrayLiteral elements: ProjectDescription.InfoPlist.Value...) - public typealias ArrayLiteralElement = ProjectDescription.InfoPlist.Value -} -public struct LaunchArgument : Swift.Equatable, Swift.Codable { - public let name: Swift.String - public let isEnabled: Swift.Bool - public init(name: Swift.String, isEnabled: Swift.Bool) - public static func == (a: ProjectDescription.LaunchArgument, b: ProjectDescription.LaunchArgument) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public enum Package : Swift.Equatable, Swift.Codable { - case remote(url: Swift.String, requirement: ProjectDescription.Package.Requirement) - case local(path: ProjectDescription.Path) - public static func == (a: ProjectDescription.Package, b: ProjectDescription.Package) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.Package { - public enum Requirement : Swift.Codable, Swift.Equatable { - case upToNextMajor(from: ProjectDescription.Version) - case upToNextMinor(from: ProjectDescription.Version) - case range(from: ProjectDescription.Version, to: ProjectDescription.Version) - case exact(ProjectDescription.Version) - case branch(Swift.String) - case revision(Swift.String) - public static func == (a: ProjectDescription.Package.Requirement, b: ProjectDescription.Package.Requirement) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } -} -extension ProjectDescription.Package { - public static func package(url: Swift.String, from version: ProjectDescription.Version) -> ProjectDescription.Package - public static func package(url: Swift.String, _ requirement: ProjectDescription.Package.Requirement) -> ProjectDescription.Package - public static func package(url: Swift.String, _ range: Swift.Range) -> ProjectDescription.Package - public static func package(url: Swift.String, _ range: Swift.ClosedRange) -> ProjectDescription.Package - public static func package(path: ProjectDescription.Path) -> ProjectDescription.Package -} -extension ProjectDescription.Package { - @available(*, unavailable, message: "use package(url:_:) with the .exact(Version) initializer instead") - public static func package(url _: Swift.String, version _: ProjectDescription.Version) -> ProjectDescription.Package - @available(*, unavailable, message: "use package(url:_:) with the .branch(String) initializer instead") - public static func package(url _: Swift.String, branch _: Swift.String) -> ProjectDescription.Package - @available(*, unavailable, message: "use package(url:_:) with the .revision(String) initializer instead") - public static func package(url _: Swift.String, revision _: Swift.String) -> ProjectDescription.Package - @available(*, unavailable, message: "use package(url:_:) without the range label instead") - public static func package(url _: Swift.String, range _: Swift.Range) -> ProjectDescription.Package -} -public struct Path : Swift.ExpressibleByStringInterpolation, Swift.Codable, Swift.Hashable { - public enum PathType : Swift.String, Swift.Codable { - case relativeToCurrentFile - case relativeToManifest - case relativeToRoot - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } - } - public let type: ProjectDescription.Path.PathType - public let pathString: Swift.String - public let callerPath: Swift.String? - public init(_ path: Swift.String) - public static func relativeToCurrentFile(_ pathString: Swift.String, callerPath: Swift.StaticString = #file) -> ProjectDescription.Path - public static func relativeToManifest(_ pathString: Swift.String) -> ProjectDescription.Path - public static func relativeToRoot(_ pathString: Swift.String) -> ProjectDescription.Path - public init(stringLiteral: Swift.String) - public static func == (a: ProjectDescription.Path, b: ProjectDescription.Path) -> Swift.Bool - public func hash(into hasher: inout Swift.Hasher) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String - public func encode(to encoder: Swift.Encoder) throws - public var hashValue: Swift.Int { - get - } - public init(from decoder: Swift.Decoder) throws -} -public enum Platform : Swift.String, Swift.Codable, Swift.Equatable, Swift.CaseIterable { - case iOS - case macOS - case watchOS - case tvOS - public init?(rawValue: Swift.String) - public typealias AllCases = [ProjectDescription.Platform] - public typealias RawValue = Swift.String - public static var allCases: [ProjectDescription.Platform] { - get - } - public var rawValue: Swift.String { - get - } -} -public struct Plugin : Swift.Codable, Swift.Equatable { - public let name: Swift.String - public init(name: Swift.String) - public static func == (a: ProjectDescription.Plugin, b: ProjectDescription.Plugin) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct PluginLocation : Swift.Codable, Swift.Equatable { - public let type: ProjectDescription.PluginLocation.LocationType - public static func local(path: ProjectDescription.Path) -> ProjectDescription.PluginLocation - public static func git(url: Swift.String, tag: Swift.String, directory: Swift.String? = nil) -> ProjectDescription.PluginLocation - public static func git(url: Swift.String, sha: Swift.String, directory: Swift.String? = nil) -> ProjectDescription.PluginLocation - public static func == (a: ProjectDescription.PluginLocation, b: ProjectDescription.PluginLocation) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.PluginLocation { - public enum LocationType : Swift.Codable, Swift.Equatable { - case local(path: ProjectDescription.Path) - case gitWithTag(url: Swift.String, tag: Swift.String, directory: Swift.String?) - case gitWithSha(url: Swift.String, sha: Swift.String, directory: Swift.String?) - public static func == (a: ProjectDescription.PluginLocation.LocationType, b: ProjectDescription.PluginLocation.LocationType) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } -} -public enum Product : Swift.String, Swift.Codable, Swift.Equatable { - case app - case staticLibrary - case dynamicLibrary - case framework - case staticFramework - case unitTests - case uiTests - case bundle - case commandLineTool - case appClip - case appExtension - case watch2App - case watch2Extension - case tvTopShelfExtension - case messagesExtension - case stickerPackExtension - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } -} -public struct ProfileAction : Swift.Equatable, Swift.Codable { - public let configuration: ProjectDescription.ConfigurationName - public let preActions: [ProjectDescription.ExecutionAction] - public let postActions: [ProjectDescription.ExecutionAction] - public let executable: ProjectDescription.TargetReference? - public let arguments: ProjectDescription.Arguments? - public static func profileAction(configuration: ProjectDescription.ConfigurationName = .release, preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = [], executable: ProjectDescription.TargetReference? = nil, arguments: ProjectDescription.Arguments? = nil) -> ProjectDescription.ProfileAction - public static func == (a: ProjectDescription.ProfileAction, b: ProjectDescription.ProfileAction) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct Project : Swift.Codable, Swift.Equatable { - public let name: Swift.String - public let organizationName: Swift.String? - public let options: ProjectDescription.Project.Options - public let packages: [ProjectDescription.Package] - public let targets: [ProjectDescription.Target] - public let schemes: [ProjectDescription.Scheme] - public let settings: ProjectDescription.Settings? - public let fileHeaderTemplate: ProjectDescription.FileHeaderTemplate? - public let additionalFiles: [ProjectDescription.FileElement] - public let resourceSynthesizers: [ProjectDescription.ResourceSynthesizer] - public init(name: Swift.String, organizationName: Swift.String? = nil, options: ProjectDescription.Project.Options = .options(), packages: [ProjectDescription.Package] = [], settings: ProjectDescription.Settings? = nil, targets: [ProjectDescription.Target] = [], schemes: [ProjectDescription.Scheme] = [], fileHeaderTemplate: ProjectDescription.FileHeaderTemplate? = nil, additionalFiles: [ProjectDescription.FileElement] = [], resourceSynthesizers: [ProjectDescription.ResourceSynthesizer] = .default) - public static func == (a: ProjectDescription.Project, b: ProjectDescription.Project) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.Project { - public struct Options : Swift.Codable, Swift.Equatable { - public let automaticSchemesOptions: ProjectDescription.Project.Options.AutomaticSchemesOptions - public let developmentRegion: Swift.String? - public let disableBundleAccessors: Swift.Bool - public let disableShowEnvironmentVarsInScriptPhases: Swift.Bool - public let disableSynthesizedResourceAccessors: Swift.Bool - public let textSettings: ProjectDescription.Project.Options.TextSettings - public let xcodeProjectName: Swift.String? - public static func options(automaticSchemesOptions: ProjectDescription.Project.Options.AutomaticSchemesOptions = .enabled(), developmentRegion: Swift.String? = nil, disableBundleAccessors: Swift.Bool = false, disableShowEnvironmentVarsInScriptPhases: Swift.Bool = false, disableSynthesizedResourceAccessors: Swift.Bool = false, textSettings: ProjectDescription.Project.Options.TextSettings = .textSettings(), xcodeProjectName: Swift.String? = nil) -> ProjectDescription.Project.Options - public static func == (a: ProjectDescription.Project.Options, b: ProjectDescription.Project.Options) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } -} -extension ProjectDescription.Project.Options { - public enum AutomaticSchemesOptions : Swift.Codable, Swift.Equatable { - public enum TargetSchemesGrouping : Swift.Codable, Swift.Equatable { - case singleScheme - case byNameSuffix(build: Swift.Set, test: Swift.Set, run: Swift.Set) - case notGrouped - public static func == (a: ProjectDescription.Project.Options.AutomaticSchemesOptions.TargetSchemesGrouping, b: ProjectDescription.Project.Options.AutomaticSchemesOptions.TargetSchemesGrouping) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - case enabled(targetSchemesGrouping: ProjectDescription.Project.Options.AutomaticSchemesOptions.TargetSchemesGrouping = .byNameSuffix( - build: ["Implementation", "Interface", "Mocks", "Testing"], - test: ["Tests", "IntegrationTests", "UITests", "SnapshotTests"], - run: ["App", "Demo"] - ), codeCoverageEnabled: Swift.Bool = false, testingOptions: ProjectDescription.TestingOptions = []) - case disabled - public static func == (a: ProjectDescription.Project.Options.AutomaticSchemesOptions, b: ProjectDescription.Project.Options.AutomaticSchemesOptions) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - public struct TextSettings : Swift.Codable, Swift.Equatable { - public let usesTabs: Swift.Bool? - public let indentWidth: Swift.UInt? - public let tabWidth: Swift.UInt? - public let wrapsLines: Swift.Bool? - public static func textSettings(usesTabs: Swift.Bool? = nil, indentWidth: Swift.UInt? = nil, tabWidth: Swift.UInt? = nil, wrapsLines: Swift.Bool? = nil) -> ProjectDescription.Project.Options.TextSettings - public static func == (a: ProjectDescription.Project.Options.TextSettings, b: ProjectDescription.Project.Options.TextSettings) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } -} -public enum ResourceFileElement : Swift.Codable, Swift.Equatable { - case glob(pattern: ProjectDescription.Path, excluding: [ProjectDescription.Path] = [], tags: [Swift.String] = []) - case folderReference(path: ProjectDescription.Path, tags: [Swift.String] = []) - public static func == (a: ProjectDescription.ResourceFileElement, b: ProjectDescription.ResourceFileElement) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.ResourceFileElement : Swift.ExpressibleByStringInterpolation { - public init(stringLiteral value: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -public struct ResourceFileElements : Swift.Codable, Swift.Equatable { - public let resources: [ProjectDescription.ResourceFileElement] - public init(resources: [ProjectDescription.ResourceFileElement]) - public static func == (a: ProjectDescription.ResourceFileElements, b: ProjectDescription.ResourceFileElements) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.ResourceFileElements : Swift.ExpressibleByStringInterpolation { - public init(stringLiteral value: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -extension ProjectDescription.ResourceFileElements : Swift.ExpressibleByArrayLiteral { - public init(arrayLiteral elements: ProjectDescription.ResourceFileElement...) - public typealias ArrayLiteralElement = ProjectDescription.ResourceFileElement -} -public struct ResourceSynthesizer : Swift.Codable, Swift.Equatable { - public let templateType: ProjectDescription.ResourceSynthesizer.TemplateType - public let parser: ProjectDescription.ResourceSynthesizer.Parser - public let extensions: Swift.Set - public enum TemplateType : Swift.Codable, Swift.Equatable { - case plugin(name: Swift.String, resourceName: Swift.String) - case defaultTemplate(resourceName: Swift.String) - public static func == (a: ProjectDescription.ResourceSynthesizer.TemplateType, b: ProjectDescription.ResourceSynthesizer.TemplateType) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - public enum Parser : Swift.String, Swift.Codable { - case strings - case assets - case plists - case fonts - case coreData - case interfaceBuilder - case json - case yaml - case files - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } - } - public static func strings() -> ProjectDescription.ResourceSynthesizer - public static func strings(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer - public static func assets() -> ProjectDescription.ResourceSynthesizer - public static func assets(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer - public static func fonts() -> ProjectDescription.ResourceSynthesizer - public static func fonts(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer - public static func plists() -> ProjectDescription.ResourceSynthesizer - public static func plists(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer - public static func coreData(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer - public static func coreData() -> ProjectDescription.ResourceSynthesizer - public static func interfaceBuilder(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer - public static func interfaceBuilder() -> ProjectDescription.ResourceSynthesizer - public static func json(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer - public static func json() -> ProjectDescription.ResourceSynthesizer - public static func yaml(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer - public static func yaml() -> ProjectDescription.ResourceSynthesizer - public static func files(plugin: Swift.String, extensions: Swift.Set) -> ProjectDescription.ResourceSynthesizer - public static func files(extensions: Swift.Set) -> ProjectDescription.ResourceSynthesizer - public static func custom(plugin: Swift.String, parser: ProjectDescription.ResourceSynthesizer.Parser, extensions: Swift.Set, resourceName: Swift.String) -> ProjectDescription.ResourceSynthesizer - public static func custom(name: Swift.String, parser: ProjectDescription.ResourceSynthesizer.Parser, extensions: Swift.Set) -> ProjectDescription.ResourceSynthesizer - public static func == (a: ProjectDescription.ResourceSynthesizer, b: ProjectDescription.ResourceSynthesizer) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension Swift.Array where Element == ProjectDescription.ResourceSynthesizer { - public static var `default`: Swift.Array { - get - } -} -public struct RunAction : Swift.Equatable, Swift.Codable { - public let configuration: ProjectDescription.ConfigurationName - public let attachDebugger: Swift.Bool - public let preActions: [ProjectDescription.ExecutionAction] - public let postActions: [ProjectDescription.ExecutionAction] - public let executable: ProjectDescription.TargetReference? - public let arguments: ProjectDescription.Arguments? - public let options: ProjectDescription.RunActionOptions - public let diagnosticsOptions: [ProjectDescription.SchemeDiagnosticsOption] - public static func runAction(configuration: ProjectDescription.ConfigurationName = .debug, attachDebugger: Swift.Bool = true, preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = [], executable: ProjectDescription.TargetReference? = nil, arguments: ProjectDescription.Arguments? = nil, options: ProjectDescription.RunActionOptions = .options(), diagnosticsOptions: [ProjectDescription.SchemeDiagnosticsOption] = [.mainThreadChecker]) -> ProjectDescription.RunAction - public static func == (a: ProjectDescription.RunAction, b: ProjectDescription.RunAction) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct RunActionOptions : Swift.Equatable, Swift.Codable { - public let language: ProjectDescription.SchemeLanguage? - public let storeKitConfigurationPath: ProjectDescription.Path? - public let simulatedLocation: ProjectDescription.RunActionOptions.SimulatedLocation? - public let enableGPUFrameCaptureMode: ProjectDescription.RunActionOptions.GPUFrameCaptureMode - public static func options(language: ProjectDescription.SchemeLanguage? = nil, storeKitConfigurationPath: ProjectDescription.Path? = nil, simulatedLocation: ProjectDescription.RunActionOptions.SimulatedLocation? = nil, enableGPUFrameCaptureMode: ProjectDescription.RunActionOptions.GPUFrameCaptureMode = GPUFrameCaptureMode.default) -> ProjectDescription.RunActionOptions - public static func == (a: ProjectDescription.RunActionOptions, b: ProjectDescription.RunActionOptions) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.RunActionOptions { - public struct SimulatedLocation : Swift.Codable, Swift.Equatable { - public let identifier: Swift.String? - public let gpxFile: ProjectDescription.Path? - public static func custom(gpxFile: ProjectDescription.Path) -> ProjectDescription.RunActionOptions.SimulatedLocation - public static var london: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var johannesburg: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var moscow: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var mumbai: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var tokyo: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var sydney: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var hongKong: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var honolulu: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var sanFrancisco: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var mexicoCity: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var newYork: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var rioDeJaneiro: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static func == (a: ProjectDescription.RunActionOptions.SimulatedLocation, b: ProjectDescription.RunActionOptions.SimulatedLocation) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } -} -extension ProjectDescription.RunActionOptions { - public enum GPUFrameCaptureMode : Swift.String, Swift.Codable, Swift.Equatable { - case autoEnabled - case metal - case openGL - case disabled - public static var `default`: ProjectDescription.RunActionOptions.GPUFrameCaptureMode { - get - } - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } - } -} -public struct Scheme : Swift.Equatable, Swift.Codable { - public let name: Swift.String - public let shared: Swift.Bool - public let hidden: Swift.Bool - public let buildAction: ProjectDescription.BuildAction? - public let testAction: ProjectDescription.TestAction? - public let runAction: ProjectDescription.RunAction? - public let archiveAction: ProjectDescription.ArchiveAction? - public let profileAction: ProjectDescription.ProfileAction? - public let analyzeAction: ProjectDescription.AnalyzeAction? - public init(name: Swift.String, shared: Swift.Bool = true, hidden: Swift.Bool = false, buildAction: ProjectDescription.BuildAction? = nil, testAction: ProjectDescription.TestAction? = nil, runAction: ProjectDescription.RunAction? = nil, archiveAction: ProjectDescription.ArchiveAction? = nil, profileAction: ProjectDescription.ProfileAction? = nil, analyzeAction: ProjectDescription.AnalyzeAction? = nil) - public static func == (a: ProjectDescription.Scheme, b: ProjectDescription.Scheme) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public enum SchemeDiagnosticsOption : Swift.String, Swift.Equatable, Swift.Codable { - case mainThreadChecker - case performanceAntipatternChecker - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } -} -public struct SchemeLanguage : Swift.Codable, Swift.Equatable, Swift.ExpressibleByStringLiteral { - public let identifier: Swift.String - public init(identifier: Swift.String) - public init(stringLiteral: Swift.String) - public static func == (a: ProjectDescription.SchemeLanguage, b: ProjectDescription.SchemeLanguage) -> Swift.Bool - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.SchemeLanguage { - public static var doubleLengthPseudoLanguage: ProjectDescription.SchemeLanguage { - get - } - public static var rightToLeftPseudoLanguage: ProjectDescription.SchemeLanguage { - get - } - public static var accentedPseudoLanguage: ProjectDescription.SchemeLanguage { - get - } - public static var boundedStringPseudoLanguage: ProjectDescription.SchemeLanguage { - get - } - public static var rightToLeftWithStringsPseudoLanguage: ProjectDescription.SchemeLanguage { - get - } -} -public typealias SettingsDictionary = [Swift.String : ProjectDescription.SettingValue] -public enum SettingValue : Swift.ExpressibleByStringInterpolation, Swift.ExpressibleByArrayLiteral, Swift.ExpressibleByBooleanLiteral, Swift.Equatable, Swift.Codable { - case string(Swift.String) - case array([Swift.String]) - public init(stringLiteral value: Swift.String) - public init(arrayLiteral elements: Swift.String...) - public typealias BooleanLiteralType = Swift.Bool - public init(booleanLiteral value: Swift.Bool) - public init(_ stringRawRepresentable: T) where T : Swift.RawRepresentable, T.RawValue == Swift.String - public static func == (a: ProjectDescription.SettingValue, b: ProjectDescription.SettingValue) -> Swift.Bool - public typealias ArrayLiteralElement = Swift.String - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct Configuration : Swift.Equatable, Swift.Codable { - public enum Variant : Swift.String, Swift.Codable { - case debug - case release - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } - } - public let name: ProjectDescription.ConfigurationName - public let variant: ProjectDescription.Configuration.Variant - public let settings: ProjectDescription.SettingsDictionary - public let xcconfig: ProjectDescription.Path? - public static func debug(name: ProjectDescription.ConfigurationName, settings: ProjectDescription.SettingsDictionary = [:], xcconfig: ProjectDescription.Path? = nil) -> ProjectDescription.Configuration - public static func release(name: ProjectDescription.ConfigurationName, settings: ProjectDescription.SettingsDictionary = [:], xcconfig: ProjectDescription.Path? = nil) -> ProjectDescription.Configuration - public static func == (a: ProjectDescription.Configuration, b: ProjectDescription.Configuration) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public enum DefaultSettings : Swift.Codable, Swift.Equatable { - case recommended(excluding: Swift.Set = []) - case essential(excluding: Swift.Set = []) - case none - public static func == (a: ProjectDescription.DefaultSettings, b: ProjectDescription.DefaultSettings) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.DefaultSettings { - public static var recommended: ProjectDescription.DefaultSettings { - get - } - public static var essential: ProjectDescription.DefaultSettings { - get - } -} -public struct Settings : Swift.Equatable, Swift.Codable { - public let base: ProjectDescription.SettingsDictionary - public let configurations: [ProjectDescription.Configuration] - public let defaultSettings: ProjectDescription.DefaultSettings - public static func settings(base: ProjectDescription.SettingsDictionary = [:], debug: ProjectDescription.SettingsDictionary = [:], release: ProjectDescription.SettingsDictionary = [:], defaultSettings: ProjectDescription.DefaultSettings = .recommended) -> ProjectDescription.Settings - public static func settings(base: ProjectDescription.SettingsDictionary = [:], configurations: [ProjectDescription.Configuration], defaultSettings: ProjectDescription.DefaultSettings = .recommended) -> ProjectDescription.Settings - public static func == (a: ProjectDescription.Settings, b: ProjectDescription.Settings) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension Swift.Dictionary where Key == Swift.String, Value == ProjectDescription.SettingValue { - public mutating func merge(_ other: ProjectDescription.SettingsDictionary) - public func merging(_ other: ProjectDescription.SettingsDictionary) -> ProjectDescription.SettingsDictionary -} -public enum SwiftCompilationMode : Swift.String { - case singlefile - case wholemodule - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } -} -public enum DebugInformationFormat : Swift.String { - case dwarf - case dwarfWithDsym - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } -} -public enum SwiftOptimizationLevel : Swift.String { - case o - case oNone - case oSize - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } -} -extension Swift.Dictionary where Key == Swift.String, Value == ProjectDescription.SettingValue { - public func manualCodeSigning(identity: Swift.String? = nil, provisioningProfileSpecifier: Swift.String? = nil) -> ProjectDescription.SettingsDictionary - public func automaticCodeSigning(devTeam: Swift.String) -> ProjectDescription.SettingsDictionary - public func codeSignIdentityAppleDevelopment() -> ProjectDescription.SettingsDictionary - public func codeSignIdentity(_ identity: Swift.String) -> ProjectDescription.SettingsDictionary - public func currentProjectVersion(_ version: Swift.String) -> ProjectDescription.SettingsDictionary - public func marketingVersion(_ version: Swift.String) -> ProjectDescription.SettingsDictionary - public func appleGenericVersioningSystem() -> ProjectDescription.SettingsDictionary - public func versionInfo(_ version: Swift.String, prefix: Swift.String? = nil, suffix: Swift.String? = nil) -> ProjectDescription.SettingsDictionary - public func swiftVersion(_ version: Swift.String) -> ProjectDescription.SettingsDictionary - public func otherSwiftFlags(_ flags: Swift.String...) -> ProjectDescription.SettingsDictionary - public func swiftActiveCompilationConditions(_ conditions: Swift.String...) -> ProjectDescription.SettingsDictionary - public func swiftCompilationMode(_ mode: ProjectDescription.SwiftCompilationMode) -> ProjectDescription.SettingsDictionary - public func swiftOptimizationLevel(_ level: ProjectDescription.SwiftOptimizationLevel) -> ProjectDescription.SettingsDictionary - public func swiftOptimizeObjectLifetimes(_ enabled: Swift.Bool) -> ProjectDescription.SettingsDictionary - public func swiftObjcBridingHeaderPath(_ path: Swift.String) -> ProjectDescription.SettingsDictionary - public func otherCFlags(_ flags: [Swift.String]) -> ProjectDescription.SettingsDictionary - public func otherLinkerFlags(_ flags: [Swift.String]) -> ProjectDescription.SettingsDictionary - public func bitcodeEnabled(_ enabled: Swift.Bool) -> ProjectDescription.SettingsDictionary - public func debugInformationFormat(_ format: ProjectDescription.DebugInformationFormat) -> ProjectDescription.SettingsDictionary -} -public struct SourceFileGlob : Swift.Codable, Swift.Equatable { - public let glob: ProjectDescription.Path - public let excluding: [ProjectDescription.Path] - public let compilerFlags: Swift.String? - public let codeGen: ProjectDescription.FileCodeGen? - public static func glob(_ glob: ProjectDescription.Path, excluding: [ProjectDescription.Path] = [], compilerFlags: Swift.String? = nil, codeGen: ProjectDescription.FileCodeGen? = nil) -> ProjectDescription.SourceFileGlob - public static func glob(_ glob: ProjectDescription.Path, excluding: ProjectDescription.Path?, compilerFlags: Swift.String? = nil, codeGen: ProjectDescription.FileCodeGen? = nil) -> ProjectDescription.SourceFileGlob - public static func == (a: ProjectDescription.SourceFileGlob, b: ProjectDescription.SourceFileGlob) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.SourceFileGlob : Swift.ExpressibleByStringInterpolation { - public init(stringLiteral value: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -public struct SourceFilesList : Swift.Codable, Swift.Equatable { - public let globs: [ProjectDescription.SourceFileGlob] - public init(globs: [ProjectDescription.SourceFileGlob]) - public init(globs: [Swift.String]) - public static func paths(_ paths: [ProjectDescription.Path]) -> ProjectDescription.SourceFilesList - public static func == (a: ProjectDescription.SourceFilesList, b: ProjectDescription.SourceFilesList) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.SourceFilesList : Swift.ExpressibleByStringInterpolation { - public init(stringLiteral value: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -extension ProjectDescription.SourceFilesList : Swift.ExpressibleByArrayLiteral { - public init(arrayLiteral elements: ProjectDescription.SourceFileGlob...) - public typealias ArrayLiteralElement = ProjectDescription.SourceFileGlob -} -public struct Target : Swift.Codable, Swift.Equatable { - public let name: Swift.String - public let platform: ProjectDescription.Platform - public let product: ProjectDescription.Product - public let productName: Swift.String? - public let bundleId: Swift.String - public let deploymentTarget: ProjectDescription.DeploymentTarget? - public let infoPlist: ProjectDescription.InfoPlist? - public let sources: ProjectDescription.SourceFilesList? - public let resources: ProjectDescription.ResourceFileElements? - public let copyFiles: [ProjectDescription.CopyFilesAction]? - public let headers: ProjectDescription.Headers? - public let entitlements: ProjectDescription.Path? - public let scripts: [ProjectDescription.TargetScript] - public let dependencies: [ProjectDescription.TargetDependency] - public let settings: ProjectDescription.Settings? - public let coreDataModels: [ProjectDescription.CoreDataModel] - public let environment: [Swift.String : Swift.String] - public let launchArguments: [ProjectDescription.LaunchArgument] - public let additionalFiles: [ProjectDescription.FileElement] - public init(name: Swift.String, platform: ProjectDescription.Platform, product: ProjectDescription.Product, productName: Swift.String? = nil, bundleId: Swift.String, deploymentTarget: ProjectDescription.DeploymentTarget? = nil, infoPlist: ProjectDescription.InfoPlist? = .default, sources: ProjectDescription.SourceFilesList? = nil, resources: ProjectDescription.ResourceFileElements? = nil, copyFiles: [ProjectDescription.CopyFilesAction]? = nil, headers: ProjectDescription.Headers? = nil, entitlements: ProjectDescription.Path? = nil, scripts: [ProjectDescription.TargetScript] = [], dependencies: [ProjectDescription.TargetDependency] = [], settings: ProjectDescription.Settings? = nil, coreDataModels: [ProjectDescription.CoreDataModel] = [], environment: [Swift.String : Swift.String] = [:], launchArguments: [ProjectDescription.LaunchArgument] = [], additionalFiles: [ProjectDescription.FileElement] = []) - public static func == (a: ProjectDescription.Target, b: ProjectDescription.Target) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public enum SDKStatus : Swift.String, Swift.Codable, Swift.Hashable { - case required - case optional - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } -} -public enum SDKType : Swift.String, Swift.Codable, Swift.Hashable { - case library - case framework - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } -} -public enum TargetDependency : Swift.Codable, Swift.Hashable { - case target(name: Swift.String) - case project(target: Swift.String, path: ProjectDescription.Path) - case framework(path: ProjectDescription.Path) - case library(path: ProjectDescription.Path, publicHeaders: ProjectDescription.Path, swiftModuleMap: ProjectDescription.Path?) - case package(product: Swift.String) - case sdk(name: Swift.String, type: ProjectDescription.SDKType, status: ProjectDescription.SDKStatus) - case xcframework(path: ProjectDescription.Path) - case xctest - case external(name: Swift.String) - public static func sdk(name: Swift.String, type: ProjectDescription.SDKType) -> ProjectDescription.TargetDependency - public var typeName: Swift.String { - get - } - public func hash(into hasher: inout Swift.Hasher) - public static func == (a: ProjectDescription.TargetDependency, b: ProjectDescription.TargetDependency) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public var hashValue: Swift.Int { - get - } - public init(from decoder: Swift.Decoder) throws -} -public struct TargetReference : Swift.Hashable, Swift.Codable, Swift.ExpressibleByStringInterpolation { - public var projectPath: ProjectDescription.Path? - public var targetName: Swift.String - public init(projectPath: ProjectDescription.Path?, target: Swift.String) - public init(stringLiteral value: Swift.String) - public static func project(path: ProjectDescription.Path, target: Swift.String) -> ProjectDescription.TargetReference - public func hash(into hasher: inout Swift.Hasher) - public static func == (a: ProjectDescription.TargetReference, b: ProjectDescription.TargetReference) -> Swift.Bool - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String - public func encode(to encoder: Swift.Encoder) throws - public var hashValue: Swift.Int { - get - } - public init(from decoder: Swift.Decoder) throws -} -public struct TargetScript : Swift.Codable, Swift.Equatable { - public enum Order : Swift.String, Swift.Codable, Swift.Equatable { - case pre - case post - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } - } - public enum Script : Swift.Equatable, Swift.Codable { - case tool(path: Swift.String, args: [Swift.String]) - case scriptPath(path: ProjectDescription.Path, args: [Swift.String]) - case embedded(Swift.String) - public static func == (a: ProjectDescription.TargetScript.Script, b: ProjectDescription.TargetScript.Script) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - public let name: Swift.String - public let script: ProjectDescription.TargetScript.Script - public let order: ProjectDescription.TargetScript.Order - public let inputPaths: [ProjectDescription.Path] - public let inputFileListPaths: [ProjectDescription.Path] - public let outputPaths: [ProjectDescription.Path] - public let outputFileListPaths: [ProjectDescription.Path] - public let basedOnDependencyAnalysis: Swift.Bool? - public let runForInstallBuildsOnly: Swift.Bool - public let shellPath: Swift.String - public static func pre(path: ProjectDescription.Path, arguments: Swift.String..., name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript - public static func pre(path: ProjectDescription.Path, arguments: [Swift.String], name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript - public static func post(path: ProjectDescription.Path, arguments: Swift.String..., name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript - public static func post(path: ProjectDescription.Path, arguments: [Swift.String], name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript - public static func pre(tool: Swift.String, arguments: Swift.String..., name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript - public static func pre(tool: Swift.String, arguments: [Swift.String], name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript - public static func post(tool: Swift.String, arguments: Swift.String..., name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript - public static func post(tool: Swift.String, arguments: [Swift.String], name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript - public static func pre(script: Swift.String, name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript - public static func post(script: Swift.String, name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript - public static func == (a: ProjectDescription.TargetScript, b: ProjectDescription.TargetScript) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct Template : Swift.Codable, Swift.Equatable { - public let description: Swift.String - public let attributes: [ProjectDescription.Template.Attribute] - public let items: [ProjectDescription.Template.Item] - public init(description: Swift.String, attributes: [ProjectDescription.Template.Attribute] = [], items: [ProjectDescription.Template.Item] = []) - public enum Contents : Swift.Codable, Swift.Equatable { - case string(Swift.String) - case file(ProjectDescription.Path) - case directory(ProjectDescription.Path) - public static func == (a: ProjectDescription.Template.Contents, b: ProjectDescription.Template.Contents) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - public struct Item : Swift.Codable, Swift.Equatable { - public let path: Swift.String - public let contents: ProjectDescription.Template.Contents - public init(path: Swift.String, contents: ProjectDescription.Template.Contents) - public static func == (a: ProjectDescription.Template.Item, b: ProjectDescription.Template.Item) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - public enum Attribute : Swift.Codable, Swift.Equatable { - case required(Swift.String) - case optional(Swift.String, default: Swift.String) - public static func == (a: ProjectDescription.Template.Attribute, b: ProjectDescription.Template.Attribute) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - public static func == (a: ProjectDescription.Template, b: ProjectDescription.Template) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.Template.Item { - public static func string(path: Swift.String, contents: Swift.String) -> ProjectDescription.Template.Item - public static func file(path: Swift.String, templatePath: ProjectDescription.Path) -> ProjectDescription.Template.Item - public static func directory(path: Swift.String, sourcePath: ProjectDescription.Path) -> ProjectDescription.Template.Item -} -extension Swift.DefaultStringInterpolation { - public mutating func appendInterpolation(_ value: ProjectDescription.Template.Attribute) -} -public struct TemplateString : Swift.Encodable, Swift.Decodable, Swift.Equatable { - public static func == (a: ProjectDescription.TemplateString, b: ProjectDescription.TemplateString) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.TemplateString : Swift.ExpressibleByStringLiteral { - public init(stringLiteral: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -extension ProjectDescription.TemplateString : Swift.CustomStringConvertible { - public var description: Swift.String { - get - } -} -extension ProjectDescription.TemplateString : Swift.ExpressibleByStringInterpolation { - public init(stringInterpolation: ProjectDescription.TemplateString.StringInterpolation) - public struct StringInterpolation : Swift.StringInterpolationProtocol { - public init(literalCapacity _: Swift.Int, interpolationCount _: Swift.Int) - public mutating func appendLiteral(_ literal: Swift.String) - public mutating func appendInterpolation(_ token: ProjectDescription.TemplateString.Token) - public typealias StringLiteralType = Swift.String - } -} -extension ProjectDescription.TemplateString { - public enum Token : Swift.String, Swift.Equatable { - case projectName - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } - } -} -public struct TestAction : Swift.Equatable, Swift.Codable { - public let testPlans: [ProjectDescription.Path]? - public let targets: [ProjectDescription.TestableTarget] - public let arguments: ProjectDescription.Arguments? - public let configuration: ProjectDescription.ConfigurationName - public let attachDebugger: Swift.Bool - public let expandVariableFromTarget: ProjectDescription.TargetReference? - public let preActions: [ProjectDescription.ExecutionAction] - public let postActions: [ProjectDescription.ExecutionAction] - public let options: ProjectDescription.TestActionOptions - public let diagnosticsOptions: [ProjectDescription.SchemeDiagnosticsOption] - public static func targets(_ targets: [ProjectDescription.TestableTarget], arguments: ProjectDescription.Arguments? = nil, configuration: ProjectDescription.ConfigurationName = .debug, attachDebugger: Swift.Bool = true, expandVariableFromTarget: ProjectDescription.TargetReference? = nil, preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = [], options: ProjectDescription.TestActionOptions = .options(), diagnosticsOptions: [ProjectDescription.SchemeDiagnosticsOption] = [.mainThreadChecker]) -> ProjectDescription.TestAction - public static func testPlans(_ testPlans: [ProjectDescription.Path], configuration: ProjectDescription.ConfigurationName = .debug, attachDebugger: Swift.Bool = true, preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = []) -> ProjectDescription.TestAction - public static func == (a: ProjectDescription.TestAction, b: ProjectDescription.TestAction) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct TestActionOptions : Swift.Equatable, Swift.Codable { - public let language: ProjectDescription.SchemeLanguage? - public let region: Swift.String? - public let coverage: Swift.Bool - public let codeCoverageTargets: [ProjectDescription.TargetReference] - public static func options(language: ProjectDescription.SchemeLanguage? = nil, region: Swift.String? = nil, coverage: Swift.Bool = false, codeCoverageTargets: [ProjectDescription.TargetReference] = []) -> ProjectDescription.TestActionOptions - public static func == (a: ProjectDescription.TestActionOptions, b: ProjectDescription.TestActionOptions) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct TestableTarget : Swift.Equatable, Swift.Codable, Swift.ExpressibleByStringInterpolation { - public let target: ProjectDescription.TargetReference - public let isSkipped: Swift.Bool - public let isParallelizable: Swift.Bool - public let isRandomExecutionOrdering: Swift.Bool - public init(target: ProjectDescription.TargetReference, skipped: Swift.Bool = false, parallelizable: Swift.Bool = false, randomExecutionOrdering: Swift.Bool = false) - public init(stringLiteral value: Swift.String) - public static func == (a: ProjectDescription.TestableTarget, b: ProjectDescription.TestableTarget) -> Swift.Bool - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct TestingOptions : Swift.OptionSet, Swift.Codable, Swift.Equatable { - public let rawValue: Swift.Int - public init(rawValue: Swift.Int) - public static let parallelizable: ProjectDescription.TestingOptions - public static let randomExecutionOrdering: ProjectDescription.TestingOptions - public typealias ArrayLiteralElement = ProjectDescription.TestingOptions - public typealias Element = ProjectDescription.TestingOptions - public typealias RawValue = Swift.Int -} -public struct Version : Swift.Hashable, Swift.Codable { - public let major: Swift.Int - public let minor: Swift.Int - public let patch: Swift.Int - public let prereleaseIdentifiers: [Swift.String] - public let buildMetadataIdentifiers: [Swift.String] - public init(_ major: Swift.Int, _ minor: Swift.Int, _ patch: Swift.Int, prereleaseIdentifiers: [Swift.String] = [], buildMetadataIdentifiers: [Swift.String] = []) - public static func == (a: ProjectDescription.Version, b: ProjectDescription.Version) -> Swift.Bool - public func hash(into hasher: inout Swift.Hasher) - public func encode(to encoder: Swift.Encoder) throws - public var hashValue: Swift.Int { - get - } - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.Version : Swift.Comparable { - public static func < (lhs: ProjectDescription.Version, rhs: ProjectDescription.Version) -> Swift.Bool -} -extension ProjectDescription.Version : Swift.CustomStringConvertible { - public var description: Swift.String { - get - } -} -extension ProjectDescription.Version { - public init?(string: Swift.String) -} -extension ProjectDescription.Version : Swift.ExpressibleByStringInterpolation { - public init(stringLiteral value: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -extension Swift.ClosedRange where Bound == ProjectDescription.Version { - public func contains(_: ProjectDescription.Version) -> Swift.Bool -} -extension Swift.Range where Bound == ProjectDescription.Version { - public func contains(_: ProjectDescription.Version) -> Swift.Bool -} -extension Swift.Range where Bound == ProjectDescription.Version { - public func contains(version: ProjectDescription.Version) -> Swift.Bool -} -public struct Workspace : Swift.Codable, Swift.Equatable { - public let name: Swift.String - public let projects: [ProjectDescription.Path] - public let schemes: [ProjectDescription.Scheme] - public let fileHeaderTemplate: ProjectDescription.FileHeaderTemplate? - public let additionalFiles: [ProjectDescription.FileElement] - public let generationOptions: ProjectDescription.Workspace.GenerationOptions - public init(name: Swift.String, projects: [ProjectDescription.Path], schemes: [ProjectDescription.Scheme] = [], fileHeaderTemplate: ProjectDescription.FileHeaderTemplate? = nil, additionalFiles: [ProjectDescription.FileElement] = [], generationOptions: ProjectDescription.Workspace.GenerationOptions = .options()) - public static func == (a: ProjectDescription.Workspace, b: ProjectDescription.Workspace) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.Workspace { - public struct GenerationOptions : Swift.Codable, Swift.Equatable { - public enum AutogeneratedWorkspaceSchemes : Swift.Codable, Swift.Equatable { - public enum CodeCoverageMode : Swift.Codable, Swift.Equatable { - case all - case relevant - case targets([ProjectDescription.TargetReference]) - case disabled - public static func == (a: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes.CodeCoverageMode, b: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes.CodeCoverageMode) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - case disabled - case enabled(codeCoverageMode: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes.CodeCoverageMode = .disabled, testingOptions: ProjectDescription.TestingOptions = []) - public static func == (a: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes, b: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - public let enableAutomaticXcodeSchemes: Swift.Bool? - public let autogeneratedWorkspaceSchemes: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes - public let lastXcodeUpgradeCheck: ProjectDescription.Version? - public let renderMarkdownReadme: Swift.Bool - public static func options(enableAutomaticXcodeSchemes: Swift.Bool? = false, autogeneratedWorkspaceSchemes: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes = .enabled(), lastXcodeUpgradeCheck: ProjectDescription.Version? = nil, renderMarkdownReadme: Swift.Bool = false) -> ProjectDescription.Workspace.GenerationOptions - public static func == (a: ProjectDescription.Workspace.GenerationOptions, b: ProjectDescription.Workspace.GenerationOptions) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } -} -extension ProjectDescription.Cloud.Option : Swift.Hashable {} -extension ProjectDescription.Cloud.Option : Swift.RawRepresentable {} -extension ProjectDescription.CopyFilesAction.Destination : Swift.Hashable {} -extension ProjectDescription.CopyFilesAction.Destination : Swift.RawRepresentable {} -extension ProjectDescription.FileCodeGen : Swift.Hashable {} -extension ProjectDescription.FileCodeGen : Swift.RawRepresentable {} -extension ProjectDescription.Headers.AutomaticExclusionRule : Swift.Equatable {} -extension ProjectDescription.Headers.AutomaticExclusionRule : Swift.Hashable {} -extension ProjectDescription.Headers.AutomaticExclusionRule : Swift.RawRepresentable {} -extension ProjectDescription.Path.PathType : Swift.Equatable {} -extension ProjectDescription.Path.PathType : Swift.Hashable {} -extension ProjectDescription.Path.PathType : Swift.RawRepresentable {} -extension ProjectDescription.Platform : Swift.Hashable {} -extension ProjectDescription.Platform : Swift.RawRepresentable {} -extension ProjectDescription.Product : Swift.Hashable {} -extension ProjectDescription.Product : Swift.RawRepresentable {} -extension ProjectDescription.ResourceSynthesizer.Parser : Swift.Equatable {} -extension ProjectDescription.ResourceSynthesizer.Parser : Swift.Hashable {} -extension ProjectDescription.ResourceSynthesizer.Parser : Swift.RawRepresentable {} -extension ProjectDescription.RunActionOptions.GPUFrameCaptureMode : Swift.Hashable {} -extension ProjectDescription.RunActionOptions.GPUFrameCaptureMode : Swift.RawRepresentable {} -extension ProjectDescription.SchemeDiagnosticsOption : Swift.Hashable {} -extension ProjectDescription.SchemeDiagnosticsOption : Swift.RawRepresentable {} -extension ProjectDescription.Configuration.Variant : Swift.Equatable {} -extension ProjectDescription.Configuration.Variant : Swift.Hashable {} -extension ProjectDescription.Configuration.Variant : Swift.RawRepresentable {} -extension ProjectDescription.SwiftCompilationMode : Swift.Equatable {} -extension ProjectDescription.SwiftCompilationMode : Swift.Hashable {} -extension ProjectDescription.SwiftCompilationMode : Swift.RawRepresentable {} -extension ProjectDescription.DebugInformationFormat : Swift.Equatable {} -extension ProjectDescription.DebugInformationFormat : Swift.Hashable {} -extension ProjectDescription.DebugInformationFormat : Swift.RawRepresentable {} -extension ProjectDescription.SwiftOptimizationLevel : Swift.Equatable {} -extension ProjectDescription.SwiftOptimizationLevel : Swift.Hashable {} -extension ProjectDescription.SwiftOptimizationLevel : Swift.RawRepresentable {} -extension ProjectDescription.SDKStatus : Swift.RawRepresentable {} -extension ProjectDescription.SDKType : Swift.RawRepresentable {} -extension ProjectDescription.TargetScript.Order : Swift.Hashable {} -extension ProjectDescription.TargetScript.Order : Swift.RawRepresentable {} -extension ProjectDescription.TemplateString.Token : Swift.Hashable {} -extension ProjectDescription.TemplateString.Token : Swift.RawRepresentable {} diff --git a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/arm64.swiftmodule b/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/arm64.swiftmodule deleted file mode 100644 index b26ec9477..000000000 Binary files a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/arm64.swiftmodule and /dev/null differ diff --git a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/x86_64-apple-macos.swiftdoc b/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/x86_64-apple-macos.swiftdoc deleted file mode 100644 index c638986a6..000000000 Binary files a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/x86_64-apple-macos.swiftdoc and /dev/null differ diff --git a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/x86_64-apple-macos.swiftinterface b/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/x86_64-apple-macos.swiftinterface deleted file mode 100644 index b59be5e68..000000000 --- a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/x86_64-apple-macos.swiftinterface +++ /dev/null @@ -1,1418 +0,0 @@ -// swift-interface-format-version: 1.0 -// swift-compiler-version: Apple Swift version 5.5.1 (swiftlang-1300.0.31.4 clang-1300.0.29.6) -// swift-module-flags: -target x86_64-apple-macos11.0 -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -module-name ProjectDescription -import Foundation -import Swift -import _Concurrency -public struct AnalyzeAction : Swift.Equatable, Swift.Codable { - public let configuration: ProjectDescription.ConfigurationName - public static func analyzeAction(configuration: ProjectDescription.ConfigurationName) -> ProjectDescription.AnalyzeAction - public static func == (a: ProjectDescription.AnalyzeAction, b: ProjectDescription.AnalyzeAction) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct ArchiveAction : Swift.Equatable, Swift.Codable { - public let configuration: ProjectDescription.ConfigurationName - public let revealArchiveInOrganizer: Swift.Bool - public let customArchiveName: Swift.String? - public let preActions: [ProjectDescription.ExecutionAction] - public let postActions: [ProjectDescription.ExecutionAction] - public static func archiveAction(configuration: ProjectDescription.ConfigurationName, revealArchiveInOrganizer: Swift.Bool = true, customArchiveName: Swift.String? = nil, preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = []) -> ProjectDescription.ArchiveAction - public static func == (a: ProjectDescription.ArchiveAction, b: ProjectDescription.ArchiveAction) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct Arguments : Swift.Equatable, Swift.Codable { - public let environment: [Swift.String : Swift.String] - public let launchArguments: [ProjectDescription.LaunchArgument] - public init(environment: [Swift.String : Swift.String] = [:], launchArguments: [ProjectDescription.LaunchArgument] = []) - public static func == (a: ProjectDescription.Arguments, b: ProjectDescription.Arguments) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct BuildAction : Swift.Equatable, Swift.Codable { - public let targets: [ProjectDescription.TargetReference] - public let preActions: [ProjectDescription.ExecutionAction] - public let postActions: [ProjectDescription.ExecutionAction] - public let runPostActionsOnFailure: Swift.Bool - public init(targets: [ProjectDescription.TargetReference], preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = [], runPostActionsOnFailure: Swift.Bool = false) - public static func buildAction(targets: [ProjectDescription.TargetReference], preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = [], runPostActionsOnFailure: Swift.Bool = false) -> ProjectDescription.BuildAction - public static func == (a: ProjectDescription.BuildAction, b: ProjectDescription.BuildAction) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct Cache : Swift.Codable, Swift.Equatable { - public struct Profile : Swift.Codable, Swift.Equatable { - public let name: Swift.String - public let configuration: Swift.String - public let device: Swift.String? - public let os: Swift.String? - public static func profile(name: Swift.String, configuration: Swift.String, device: Swift.String? = nil, os: Swift.String? = nil) -> ProjectDescription.Cache.Profile - public static func == (a: ProjectDescription.Cache.Profile, b: ProjectDescription.Cache.Profile) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - public let profiles: [ProjectDescription.Cache.Profile] - public let path: ProjectDescription.Path? - public static func cache(profiles: [ProjectDescription.Cache.Profile] = [], path: ProjectDescription.Path? = nil) -> ProjectDescription.Cache - public static func == (a: ProjectDescription.Cache, b: ProjectDescription.Cache) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct Cloud : Swift.Codable, Swift.Equatable { - public enum Option : Swift.String, Swift.Codable, Swift.Equatable { - case analytics - case optional - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } - } - public let url: Swift.String - public let projectId: Swift.String - public let options: [ProjectDescription.Cloud.Option] - public static func cloud(projectId: Swift.String, url: Swift.String, options: [ProjectDescription.Cloud.Option] = []) -> ProjectDescription.Cloud - public static func == (a: ProjectDescription.Cloud, b: ProjectDescription.Cloud) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public enum CompatibleXcodeVersions : Swift.ExpressibleByArrayLiteral, Swift.ExpressibleByStringInterpolation, Swift.Codable, Swift.Equatable { - case all - case exact(ProjectDescription.Version) - case upToNextMajor(ProjectDescription.Version) - case upToNextMinor(ProjectDescription.Version) - case list([ProjectDescription.CompatibleXcodeVersions]) - public init(arrayLiteral elements: [ProjectDescription.CompatibleXcodeVersions]) - public init(arrayLiteral elements: ProjectDescription.CompatibleXcodeVersions...) - public init(stringLiteral value: Swift.String) - public static func == (a: ProjectDescription.CompatibleXcodeVersions, b: ProjectDescription.CompatibleXcodeVersions) -> Swift.Bool - public typealias ArrayLiteralElement = ProjectDescription.CompatibleXcodeVersions - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct Config : Swift.Codable, Swift.Equatable { - public let generationOptions: ProjectDescription.Config.GenerationOptions - public let compatibleXcodeVersions: ProjectDescription.CompatibleXcodeVersions - public let plugins: [ProjectDescription.PluginLocation] - public let cloud: ProjectDescription.Cloud? - public let cache: ProjectDescription.Cache? - public let swiftVersion: ProjectDescription.Version? - public init(compatibleXcodeVersions: ProjectDescription.CompatibleXcodeVersions = .all, cloud: ProjectDescription.Cloud? = nil, cache: ProjectDescription.Cache? = nil, swiftVersion: ProjectDescription.Version? = nil, plugins: [ProjectDescription.PluginLocation] = [], generationOptions: ProjectDescription.Config.GenerationOptions = .options()) - public static func == (a: ProjectDescription.Config, b: ProjectDescription.Config) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.Config { - public struct GenerationOptions : Swift.Codable, Swift.Equatable { - public let resolveDependenciesWithSystemScm: Swift.Bool - public let disablePackageVersionLocking: Swift.Bool - public static func options(resolveDependenciesWithSystemScm: Swift.Bool = false, disablePackageVersionLocking: Swift.Bool = false) -> ProjectDescription.Config.GenerationOptions - public static func == (a: ProjectDescription.Config.GenerationOptions, b: ProjectDescription.Config.GenerationOptions) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } -} -public struct ConfigurationName : Swift.ExpressibleByStringLiteral, Swift.Codable, Swift.Equatable { - public let rawValue: Swift.String - public init(stringLiteral value: Swift.StringLiteralType) - public static func configuration(_ name: Swift.String) -> ProjectDescription.ConfigurationName - public static var debug: ProjectDescription.ConfigurationName { - get - } - public static var release: ProjectDescription.ConfigurationName { - get - } - public static func == (a: ProjectDescription.ConfigurationName, b: ProjectDescription.ConfigurationName) -> Swift.Bool - public typealias ExtendedGraphemeClusterLiteralType = Swift.StringLiteralType - public typealias StringLiteralType = Swift.StringLiteralType - public typealias UnicodeScalarLiteralType = Swift.StringLiteralType - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct CopyFilesAction : Swift.Codable, Swift.Equatable { - public var name: Swift.String - public var destination: ProjectDescription.CopyFilesAction.Destination - public var subpath: Swift.String? - public var files: [ProjectDescription.FileElement] - public enum Destination : Swift.String, Swift.Codable, Swift.Equatable { - case absolutePath - case productsDirectory - case wrapper - case executables - case resources - case javaResources - case frameworks - case sharedFrameworks - case sharedSupport - case plugins - case other - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } - } - public static func productsDirectory(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction - public static func wrapper(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction - public static func executables(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction - public static func resources(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction - public static func javaResources(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction - public static func frameworks(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction - public static func sharedFrameworks(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction - public static func sharedSupport(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction - public static func plugins(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction - public static func == (a: ProjectDescription.CopyFilesAction, b: ProjectDescription.CopyFilesAction) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct CoreDataModel : Swift.Codable, Swift.Equatable { - public let path: ProjectDescription.Path - public let currentVersion: Swift.String? - public init(_ path: ProjectDescription.Path, currentVersion: Swift.String? = nil) - public static func == (a: ProjectDescription.CoreDataModel, b: ProjectDescription.CoreDataModel) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct CarthageDependencies : Swift.Codable, Swift.Equatable { - public let dependencies: [ProjectDescription.CarthageDependencies.Dependency] - public init(_ dependencies: [ProjectDescription.CarthageDependencies.Dependency]) - public static func == (a: ProjectDescription.CarthageDependencies, b: ProjectDescription.CarthageDependencies) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.CarthageDependencies : Swift.ExpressibleByArrayLiteral { - public init(arrayLiteral elements: ProjectDescription.CarthageDependencies.Dependency...) - public typealias ArrayLiteralElement = ProjectDescription.CarthageDependencies.Dependency -} -extension ProjectDescription.CarthageDependencies { - public enum Dependency : Swift.Codable, Swift.Equatable { - case github(path: Swift.String, requirement: ProjectDescription.CarthageDependencies.Requirement) - case git(path: Swift.String, requirement: ProjectDescription.CarthageDependencies.Requirement) - case binary(path: Swift.String, requirement: ProjectDescription.CarthageDependencies.Requirement) - public static func == (a: ProjectDescription.CarthageDependencies.Dependency, b: ProjectDescription.CarthageDependencies.Dependency) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - public enum Requirement : Swift.Codable, Swift.Equatable { - case exact(ProjectDescription.Version) - case upToNext(ProjectDescription.Version) - case atLeast(ProjectDescription.Version) - case branch(Swift.String) - case revision(Swift.String) - public static func == (a: ProjectDescription.CarthageDependencies.Requirement, b: ProjectDescription.CarthageDependencies.Requirement) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } -} -public struct Dependencies : Swift.Codable, Swift.Equatable { - public let carthage: ProjectDescription.CarthageDependencies? - public let swiftPackageManager: ProjectDescription.SwiftPackageManagerDependencies? - public let platforms: Swift.Set - public init(carthage: ProjectDescription.CarthageDependencies? = nil, swiftPackageManager: ProjectDescription.SwiftPackageManagerDependencies? = nil, platforms: Swift.Set = Set(Platform.allCases)) - public static func == (a: ProjectDescription.Dependencies, b: ProjectDescription.Dependencies) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct SwiftPackageManagerDependencies : Swift.Codable, Swift.Equatable { - public let packages: [ProjectDescription.Package] - public let productTypes: [Swift.String : ProjectDescription.Product] - public let baseSettings: ProjectDescription.Settings - public let targetSettings: [Swift.String : ProjectDescription.SettingsDictionary] - public let projectOptions: [Swift.String : ProjectDescription.Project.Options] - public init(_ packages: [ProjectDescription.Package], productTypes: [Swift.String : ProjectDescription.Product] = [:], baseSettings: ProjectDescription.Settings = .settings(), targetSettings: [Swift.String : ProjectDescription.SettingsDictionary] = [:], projectOptions: [Swift.String : ProjectDescription.Project.Options] = [:]) - public static func == (a: ProjectDescription.SwiftPackageManagerDependencies, b: ProjectDescription.SwiftPackageManagerDependencies) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.SwiftPackageManagerDependencies : Swift.ExpressibleByArrayLiteral { - public init(arrayLiteral elements: ProjectDescription.Package...) - public typealias ArrayLiteralElement = ProjectDescription.Package -} -public struct DeploymentDevice : Swift.OptionSet, Swift.Codable, Swift.Hashable { - public static let iphone: ProjectDescription.DeploymentDevice - public static let ipad: ProjectDescription.DeploymentDevice - public static let mac: ProjectDescription.DeploymentDevice - public let rawValue: Swift.UInt - public init(rawValue: Swift.UInt) - public typealias ArrayLiteralElement = ProjectDescription.DeploymentDevice - public typealias Element = ProjectDescription.DeploymentDevice - public typealias RawValue = Swift.UInt -} -public enum DeploymentTarget : Swift.Codable, Swift.Hashable { - case iOS(targetVersion: Swift.String, devices: ProjectDescription.DeploymentDevice) - case macOS(targetVersion: Swift.String) - case watchOS(targetVersion: Swift.String) - case tvOS(targetVersion: Swift.String) - public var targetVersion: Swift.String { - get - } - public func hash(into hasher: inout Swift.Hasher) - public static func == (a: ProjectDescription.DeploymentTarget, b: ProjectDescription.DeploymentTarget) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public var hashValue: Swift.Int { - get - } - public init(from decoder: Swift.Decoder) throws -} -@dynamicMemberLookup public enum Environment { - public enum Value : Swift.Equatable { - case boolean(Swift.Bool) - case string(Swift.String) - public static func == (a: ProjectDescription.Environment.Value, b: ProjectDescription.Environment.Value) -> Swift.Bool - } - public static subscript(dynamicMember member: Swift.String) -> ProjectDescription.Environment.Value? { - get - } -} -extension Swift.Optional where Wrapped == ProjectDescription.Environment.Value { - public func getString(default defaultString: Swift.String) -> Swift.String - public func getBoolean(default defaultBoolean: Swift.Bool) -> Swift.Bool -} -public struct ExecutionAction : Swift.Equatable, Swift.Codable { - public let title: Swift.String - public let scriptText: Swift.String - public let target: ProjectDescription.TargetReference? - public init(title: Swift.String = "Run Script", scriptText: Swift.String, target: ProjectDescription.TargetReference? = nil) - public static func == (a: ProjectDescription.ExecutionAction, b: ProjectDescription.ExecutionAction) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public enum FileCodeGen : Swift.String, Swift.Codable, Swift.Equatable { - case `public` - case `private` - case project - case disabled - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } -} -public enum FileElement : Swift.Codable, Swift.Equatable { - case glob(pattern: ProjectDescription.Path) - case folderReference(path: ProjectDescription.Path) - public static func == (a: ProjectDescription.FileElement, b: ProjectDescription.FileElement) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.FileElement : Swift.ExpressibleByStringInterpolation { - public init(stringLiteral value: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -extension Swift.Array : Swift.ExpressibleByUnicodeScalarLiteral where Element == ProjectDescription.FileElement { - public typealias UnicodeScalarLiteralType = Swift.String -} -extension Swift.Array : Swift.ExpressibleByExtendedGraphemeClusterLiteral where Element == ProjectDescription.FileElement { - public typealias ExtendedGraphemeClusterLiteralType = Swift.String -} -extension Swift.Array : Swift.ExpressibleByStringLiteral where Element == ProjectDescription.FileElement { - public typealias StringLiteralType = Swift.String - public init(stringLiteral value: Swift.String) -} -public enum FileHeaderTemplate : Swift.Codable, Swift.Equatable, Swift.ExpressibleByStringInterpolation { - case file(ProjectDescription.Path) - case string(Swift.String) - public init(stringLiteral value: Swift.String) - public static func == (a: ProjectDescription.FileHeaderTemplate, b: ProjectDescription.FileHeaderTemplate) -> Swift.Bool - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct FileList : Swift.Codable, Swift.Equatable { - public let globs: [ProjectDescription.FileListGlob] - public static func list(_ globs: [ProjectDescription.FileListGlob]) -> ProjectDescription.FileList - public static func == (a: ProjectDescription.FileList, b: ProjectDescription.FileList) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.FileList : Swift.ExpressibleByStringInterpolation { - public init(stringLiteral value: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -extension ProjectDescription.FileList : Swift.ExpressibleByArrayLiteral { - public init(arrayLiteral elements: Swift.String...) - public typealias ArrayLiteralElement = Swift.String -} -public struct FileListGlob : Swift.Codable, Swift.Equatable { - public var glob: ProjectDescription.Path - public var excluding: [ProjectDescription.Path] - public static func glob(_ glob: ProjectDescription.Path, excluding: [ProjectDescription.Path] = []) -> ProjectDescription.FileListGlob - public static func glob(_ glob: ProjectDescription.Path, excluding: ProjectDescription.Path?) -> ProjectDescription.FileListGlob - public static func == (a: ProjectDescription.FileListGlob, b: ProjectDescription.FileListGlob) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.FileListGlob : Swift.ExpressibleByStringInterpolation { - public init(stringLiteral value: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -public struct Headers : Swift.Codable, Swift.Equatable { - public enum AutomaticExclusionRule : Swift.Int, Swift.Codable { - case projectExcludesPrivateAndPublic - case publicExcludesPrivateAndProject - public init?(rawValue: Swift.Int) - public typealias RawValue = Swift.Int - public var rawValue: Swift.Int { - get - } - } - public let umbrellaHeader: ProjectDescription.Path? - public let `public`: ProjectDescription.FileList? - public let `private`: ProjectDescription.FileList? - public let project: ProjectDescription.FileList? - public let exclusionRule: ProjectDescription.Headers.AutomaticExclusionRule - public static func headers(public: ProjectDescription.FileList? = nil, private: ProjectDescription.FileList? = nil, project: ProjectDescription.FileList? = nil, exclusionRule: ProjectDescription.Headers.AutomaticExclusionRule = .projectExcludesPrivateAndPublic) -> ProjectDescription.Headers - public static func allHeaders(from list: ProjectDescription.FileList, umbrella: ProjectDescription.Path, private privateHeaders: ProjectDescription.FileList? = nil) -> ProjectDescription.Headers - public static func onlyHeaders(from list: ProjectDescription.FileList, umbrella: ProjectDescription.Path, private privateHeaders: ProjectDescription.FileList? = nil) -> ProjectDescription.Headers - public static func == (a: ProjectDescription.Headers, b: ProjectDescription.Headers) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public enum InfoPlist : Swift.Codable, Swift.Equatable { - indirect public enum Value : Swift.Codable, Swift.Equatable { - case string(Swift.String) - case integer(Swift.Int) - case real(Swift.Double) - case boolean(Swift.Bool) - case dictionary([Swift.String : ProjectDescription.InfoPlist.Value]) - case array([ProjectDescription.InfoPlist.Value]) - public static func == (a: ProjectDescription.InfoPlist.Value, b: ProjectDescription.InfoPlist.Value) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - case file(path: ProjectDescription.Path) - case dictionary([Swift.String : ProjectDescription.InfoPlist.Value]) - case extendingDefault(with: [Swift.String : ProjectDescription.InfoPlist.Value]) - public static var `default`: ProjectDescription.InfoPlist { - get - } - public enum CodingError : Swift.Error { - case invalidType(Swift.String) - } - public var path: ProjectDescription.Path? { - get - } - public static func == (a: ProjectDescription.InfoPlist, b: ProjectDescription.InfoPlist) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.InfoPlist : Swift.ExpressibleByStringInterpolation { - public init(stringLiteral value: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByStringInterpolation { - public init(stringLiteral value: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByIntegerLiteral { - public init(integerLiteral value: Swift.Int) - public typealias IntegerLiteralType = Swift.Int -} -extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByFloatLiteral { - public init(floatLiteral value: Swift.Double) - public typealias FloatLiteralType = Swift.Double -} -extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Swift.Bool) - public typealias BooleanLiteralType = Swift.Bool -} -extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByDictionaryLiteral { - public init(dictionaryLiteral elements: (Swift.String, ProjectDescription.InfoPlist.Value)...) - public typealias Key = Swift.String - public typealias Value = ProjectDescription.InfoPlist.Value -} -extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByArrayLiteral { - public init(arrayLiteral elements: ProjectDescription.InfoPlist.Value...) - public typealias ArrayLiteralElement = ProjectDescription.InfoPlist.Value -} -public struct LaunchArgument : Swift.Equatable, Swift.Codable { - public let name: Swift.String - public let isEnabled: Swift.Bool - public init(name: Swift.String, isEnabled: Swift.Bool) - public static func == (a: ProjectDescription.LaunchArgument, b: ProjectDescription.LaunchArgument) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public enum Package : Swift.Equatable, Swift.Codable { - case remote(url: Swift.String, requirement: ProjectDescription.Package.Requirement) - case local(path: ProjectDescription.Path) - public static func == (a: ProjectDescription.Package, b: ProjectDescription.Package) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.Package { - public enum Requirement : Swift.Codable, Swift.Equatable { - case upToNextMajor(from: ProjectDescription.Version) - case upToNextMinor(from: ProjectDescription.Version) - case range(from: ProjectDescription.Version, to: ProjectDescription.Version) - case exact(ProjectDescription.Version) - case branch(Swift.String) - case revision(Swift.String) - public static func == (a: ProjectDescription.Package.Requirement, b: ProjectDescription.Package.Requirement) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } -} -extension ProjectDescription.Package { - public static func package(url: Swift.String, from version: ProjectDescription.Version) -> ProjectDescription.Package - public static func package(url: Swift.String, _ requirement: ProjectDescription.Package.Requirement) -> ProjectDescription.Package - public static func package(url: Swift.String, _ range: Swift.Range) -> ProjectDescription.Package - public static func package(url: Swift.String, _ range: Swift.ClosedRange) -> ProjectDescription.Package - public static func package(path: ProjectDescription.Path) -> ProjectDescription.Package -} -extension ProjectDescription.Package { - @available(*, unavailable, message: "use package(url:_:) with the .exact(Version) initializer instead") - public static func package(url _: Swift.String, version _: ProjectDescription.Version) -> ProjectDescription.Package - @available(*, unavailable, message: "use package(url:_:) with the .branch(String) initializer instead") - public static func package(url _: Swift.String, branch _: Swift.String) -> ProjectDescription.Package - @available(*, unavailable, message: "use package(url:_:) with the .revision(String) initializer instead") - public static func package(url _: Swift.String, revision _: Swift.String) -> ProjectDescription.Package - @available(*, unavailable, message: "use package(url:_:) without the range label instead") - public static func package(url _: Swift.String, range _: Swift.Range) -> ProjectDescription.Package -} -public struct Path : Swift.ExpressibleByStringInterpolation, Swift.Codable, Swift.Hashable { - public enum PathType : Swift.String, Swift.Codable { - case relativeToCurrentFile - case relativeToManifest - case relativeToRoot - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } - } - public let type: ProjectDescription.Path.PathType - public let pathString: Swift.String - public let callerPath: Swift.String? - public init(_ path: Swift.String) - public static func relativeToCurrentFile(_ pathString: Swift.String, callerPath: Swift.StaticString = #file) -> ProjectDescription.Path - public static func relativeToManifest(_ pathString: Swift.String) -> ProjectDescription.Path - public static func relativeToRoot(_ pathString: Swift.String) -> ProjectDescription.Path - public init(stringLiteral: Swift.String) - public static func == (a: ProjectDescription.Path, b: ProjectDescription.Path) -> Swift.Bool - public func hash(into hasher: inout Swift.Hasher) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String - public func encode(to encoder: Swift.Encoder) throws - public var hashValue: Swift.Int { - get - } - public init(from decoder: Swift.Decoder) throws -} -public enum Platform : Swift.String, Swift.Codable, Swift.Equatable, Swift.CaseIterable { - case iOS - case macOS - case watchOS - case tvOS - public init?(rawValue: Swift.String) - public typealias AllCases = [ProjectDescription.Platform] - public typealias RawValue = Swift.String - public static var allCases: [ProjectDescription.Platform] { - get - } - public var rawValue: Swift.String { - get - } -} -public struct Plugin : Swift.Codable, Swift.Equatable { - public let name: Swift.String - public init(name: Swift.String) - public static func == (a: ProjectDescription.Plugin, b: ProjectDescription.Plugin) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct PluginLocation : Swift.Codable, Swift.Equatable { - public let type: ProjectDescription.PluginLocation.LocationType - public static func local(path: ProjectDescription.Path) -> ProjectDescription.PluginLocation - public static func git(url: Swift.String, tag: Swift.String, directory: Swift.String? = nil) -> ProjectDescription.PluginLocation - public static func git(url: Swift.String, sha: Swift.String, directory: Swift.String? = nil) -> ProjectDescription.PluginLocation - public static func == (a: ProjectDescription.PluginLocation, b: ProjectDescription.PluginLocation) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.PluginLocation { - public enum LocationType : Swift.Codable, Swift.Equatable { - case local(path: ProjectDescription.Path) - case gitWithTag(url: Swift.String, tag: Swift.String, directory: Swift.String?) - case gitWithSha(url: Swift.String, sha: Swift.String, directory: Swift.String?) - public static func == (a: ProjectDescription.PluginLocation.LocationType, b: ProjectDescription.PluginLocation.LocationType) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } -} -public enum Product : Swift.String, Swift.Codable, Swift.Equatable { - case app - case staticLibrary - case dynamicLibrary - case framework - case staticFramework - case unitTests - case uiTests - case bundle - case commandLineTool - case appClip - case appExtension - case watch2App - case watch2Extension - case tvTopShelfExtension - case messagesExtension - case stickerPackExtension - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } -} -public struct ProfileAction : Swift.Equatable, Swift.Codable { - public let configuration: ProjectDescription.ConfigurationName - public let preActions: [ProjectDescription.ExecutionAction] - public let postActions: [ProjectDescription.ExecutionAction] - public let executable: ProjectDescription.TargetReference? - public let arguments: ProjectDescription.Arguments? - public static func profileAction(configuration: ProjectDescription.ConfigurationName = .release, preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = [], executable: ProjectDescription.TargetReference? = nil, arguments: ProjectDescription.Arguments? = nil) -> ProjectDescription.ProfileAction - public static func == (a: ProjectDescription.ProfileAction, b: ProjectDescription.ProfileAction) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct Project : Swift.Codable, Swift.Equatable { - public let name: Swift.String - public let organizationName: Swift.String? - public let options: ProjectDescription.Project.Options - public let packages: [ProjectDescription.Package] - public let targets: [ProjectDescription.Target] - public let schemes: [ProjectDescription.Scheme] - public let settings: ProjectDescription.Settings? - public let fileHeaderTemplate: ProjectDescription.FileHeaderTemplate? - public let additionalFiles: [ProjectDescription.FileElement] - public let resourceSynthesizers: [ProjectDescription.ResourceSynthesizer] - public init(name: Swift.String, organizationName: Swift.String? = nil, options: ProjectDescription.Project.Options = .options(), packages: [ProjectDescription.Package] = [], settings: ProjectDescription.Settings? = nil, targets: [ProjectDescription.Target] = [], schemes: [ProjectDescription.Scheme] = [], fileHeaderTemplate: ProjectDescription.FileHeaderTemplate? = nil, additionalFiles: [ProjectDescription.FileElement] = [], resourceSynthesizers: [ProjectDescription.ResourceSynthesizer] = .default) - public static func == (a: ProjectDescription.Project, b: ProjectDescription.Project) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.Project { - public struct Options : Swift.Codable, Swift.Equatable { - public let automaticSchemesOptions: ProjectDescription.Project.Options.AutomaticSchemesOptions - public let developmentRegion: Swift.String? - public let disableBundleAccessors: Swift.Bool - public let disableShowEnvironmentVarsInScriptPhases: Swift.Bool - public let disableSynthesizedResourceAccessors: Swift.Bool - public let textSettings: ProjectDescription.Project.Options.TextSettings - public let xcodeProjectName: Swift.String? - public static func options(automaticSchemesOptions: ProjectDescription.Project.Options.AutomaticSchemesOptions = .enabled(), developmentRegion: Swift.String? = nil, disableBundleAccessors: Swift.Bool = false, disableShowEnvironmentVarsInScriptPhases: Swift.Bool = false, disableSynthesizedResourceAccessors: Swift.Bool = false, textSettings: ProjectDescription.Project.Options.TextSettings = .textSettings(), xcodeProjectName: Swift.String? = nil) -> ProjectDescription.Project.Options - public static func == (a: ProjectDescription.Project.Options, b: ProjectDescription.Project.Options) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } -} -extension ProjectDescription.Project.Options { - public enum AutomaticSchemesOptions : Swift.Codable, Swift.Equatable { - public enum TargetSchemesGrouping : Swift.Codable, Swift.Equatable { - case singleScheme - case byNameSuffix(build: Swift.Set, test: Swift.Set, run: Swift.Set) - case notGrouped - public static func == (a: ProjectDescription.Project.Options.AutomaticSchemesOptions.TargetSchemesGrouping, b: ProjectDescription.Project.Options.AutomaticSchemesOptions.TargetSchemesGrouping) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - case enabled(targetSchemesGrouping: ProjectDescription.Project.Options.AutomaticSchemesOptions.TargetSchemesGrouping = .byNameSuffix( - build: ["Implementation", "Interface", "Mocks", "Testing"], - test: ["Tests", "IntegrationTests", "UITests", "SnapshotTests"], - run: ["App", "Demo"] - ), codeCoverageEnabled: Swift.Bool = false, testingOptions: ProjectDescription.TestingOptions = []) - case disabled - public static func == (a: ProjectDescription.Project.Options.AutomaticSchemesOptions, b: ProjectDescription.Project.Options.AutomaticSchemesOptions) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - public struct TextSettings : Swift.Codable, Swift.Equatable { - public let usesTabs: Swift.Bool? - public let indentWidth: Swift.UInt? - public let tabWidth: Swift.UInt? - public let wrapsLines: Swift.Bool? - public static func textSettings(usesTabs: Swift.Bool? = nil, indentWidth: Swift.UInt? = nil, tabWidth: Swift.UInt? = nil, wrapsLines: Swift.Bool? = nil) -> ProjectDescription.Project.Options.TextSettings - public static func == (a: ProjectDescription.Project.Options.TextSettings, b: ProjectDescription.Project.Options.TextSettings) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } -} -public enum ResourceFileElement : Swift.Codable, Swift.Equatable { - case glob(pattern: ProjectDescription.Path, excluding: [ProjectDescription.Path] = [], tags: [Swift.String] = []) - case folderReference(path: ProjectDescription.Path, tags: [Swift.String] = []) - public static func == (a: ProjectDescription.ResourceFileElement, b: ProjectDescription.ResourceFileElement) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.ResourceFileElement : Swift.ExpressibleByStringInterpolation { - public init(stringLiteral value: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -public struct ResourceFileElements : Swift.Codable, Swift.Equatable { - public let resources: [ProjectDescription.ResourceFileElement] - public init(resources: [ProjectDescription.ResourceFileElement]) - public static func == (a: ProjectDescription.ResourceFileElements, b: ProjectDescription.ResourceFileElements) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.ResourceFileElements : Swift.ExpressibleByStringInterpolation { - public init(stringLiteral value: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -extension ProjectDescription.ResourceFileElements : Swift.ExpressibleByArrayLiteral { - public init(arrayLiteral elements: ProjectDescription.ResourceFileElement...) - public typealias ArrayLiteralElement = ProjectDescription.ResourceFileElement -} -public struct ResourceSynthesizer : Swift.Codable, Swift.Equatable { - public let templateType: ProjectDescription.ResourceSynthesizer.TemplateType - public let parser: ProjectDescription.ResourceSynthesizer.Parser - public let extensions: Swift.Set - public enum TemplateType : Swift.Codable, Swift.Equatable { - case plugin(name: Swift.String, resourceName: Swift.String) - case defaultTemplate(resourceName: Swift.String) - public static func == (a: ProjectDescription.ResourceSynthesizer.TemplateType, b: ProjectDescription.ResourceSynthesizer.TemplateType) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - public enum Parser : Swift.String, Swift.Codable { - case strings - case assets - case plists - case fonts - case coreData - case interfaceBuilder - case json - case yaml - case files - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } - } - public static func strings() -> ProjectDescription.ResourceSynthesizer - public static func strings(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer - public static func assets() -> ProjectDescription.ResourceSynthesizer - public static func assets(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer - public static func fonts() -> ProjectDescription.ResourceSynthesizer - public static func fonts(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer - public static func plists() -> ProjectDescription.ResourceSynthesizer - public static func plists(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer - public static func coreData(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer - public static func coreData() -> ProjectDescription.ResourceSynthesizer - public static func interfaceBuilder(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer - public static func interfaceBuilder() -> ProjectDescription.ResourceSynthesizer - public static func json(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer - public static func json() -> ProjectDescription.ResourceSynthesizer - public static func yaml(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer - public static func yaml() -> ProjectDescription.ResourceSynthesizer - public static func files(plugin: Swift.String, extensions: Swift.Set) -> ProjectDescription.ResourceSynthesizer - public static func files(extensions: Swift.Set) -> ProjectDescription.ResourceSynthesizer - public static func custom(plugin: Swift.String, parser: ProjectDescription.ResourceSynthesizer.Parser, extensions: Swift.Set, resourceName: Swift.String) -> ProjectDescription.ResourceSynthesizer - public static func custom(name: Swift.String, parser: ProjectDescription.ResourceSynthesizer.Parser, extensions: Swift.Set) -> ProjectDescription.ResourceSynthesizer - public static func == (a: ProjectDescription.ResourceSynthesizer, b: ProjectDescription.ResourceSynthesizer) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension Swift.Array where Element == ProjectDescription.ResourceSynthesizer { - public static var `default`: Swift.Array { - get - } -} -public struct RunAction : Swift.Equatable, Swift.Codable { - public let configuration: ProjectDescription.ConfigurationName - public let attachDebugger: Swift.Bool - public let preActions: [ProjectDescription.ExecutionAction] - public let postActions: [ProjectDescription.ExecutionAction] - public let executable: ProjectDescription.TargetReference? - public let arguments: ProjectDescription.Arguments? - public let options: ProjectDescription.RunActionOptions - public let diagnosticsOptions: [ProjectDescription.SchemeDiagnosticsOption] - public static func runAction(configuration: ProjectDescription.ConfigurationName = .debug, attachDebugger: Swift.Bool = true, preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = [], executable: ProjectDescription.TargetReference? = nil, arguments: ProjectDescription.Arguments? = nil, options: ProjectDescription.RunActionOptions = .options(), diagnosticsOptions: [ProjectDescription.SchemeDiagnosticsOption] = [.mainThreadChecker]) -> ProjectDescription.RunAction - public static func == (a: ProjectDescription.RunAction, b: ProjectDescription.RunAction) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct RunActionOptions : Swift.Equatable, Swift.Codable { - public let language: ProjectDescription.SchemeLanguage? - public let storeKitConfigurationPath: ProjectDescription.Path? - public let simulatedLocation: ProjectDescription.RunActionOptions.SimulatedLocation? - public let enableGPUFrameCaptureMode: ProjectDescription.RunActionOptions.GPUFrameCaptureMode - public static func options(language: ProjectDescription.SchemeLanguage? = nil, storeKitConfigurationPath: ProjectDescription.Path? = nil, simulatedLocation: ProjectDescription.RunActionOptions.SimulatedLocation? = nil, enableGPUFrameCaptureMode: ProjectDescription.RunActionOptions.GPUFrameCaptureMode = GPUFrameCaptureMode.default) -> ProjectDescription.RunActionOptions - public static func == (a: ProjectDescription.RunActionOptions, b: ProjectDescription.RunActionOptions) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.RunActionOptions { - public struct SimulatedLocation : Swift.Codable, Swift.Equatable { - public let identifier: Swift.String? - public let gpxFile: ProjectDescription.Path? - public static func custom(gpxFile: ProjectDescription.Path) -> ProjectDescription.RunActionOptions.SimulatedLocation - public static var london: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var johannesburg: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var moscow: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var mumbai: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var tokyo: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var sydney: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var hongKong: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var honolulu: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var sanFrancisco: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var mexicoCity: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var newYork: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var rioDeJaneiro: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static func == (a: ProjectDescription.RunActionOptions.SimulatedLocation, b: ProjectDescription.RunActionOptions.SimulatedLocation) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } -} -extension ProjectDescription.RunActionOptions { - public enum GPUFrameCaptureMode : Swift.String, Swift.Codable, Swift.Equatable { - case autoEnabled - case metal - case openGL - case disabled - public static var `default`: ProjectDescription.RunActionOptions.GPUFrameCaptureMode { - get - } - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } - } -} -public struct Scheme : Swift.Equatable, Swift.Codable { - public let name: Swift.String - public let shared: Swift.Bool - public let hidden: Swift.Bool - public let buildAction: ProjectDescription.BuildAction? - public let testAction: ProjectDescription.TestAction? - public let runAction: ProjectDescription.RunAction? - public let archiveAction: ProjectDescription.ArchiveAction? - public let profileAction: ProjectDescription.ProfileAction? - public let analyzeAction: ProjectDescription.AnalyzeAction? - public init(name: Swift.String, shared: Swift.Bool = true, hidden: Swift.Bool = false, buildAction: ProjectDescription.BuildAction? = nil, testAction: ProjectDescription.TestAction? = nil, runAction: ProjectDescription.RunAction? = nil, archiveAction: ProjectDescription.ArchiveAction? = nil, profileAction: ProjectDescription.ProfileAction? = nil, analyzeAction: ProjectDescription.AnalyzeAction? = nil) - public static func == (a: ProjectDescription.Scheme, b: ProjectDescription.Scheme) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public enum SchemeDiagnosticsOption : Swift.String, Swift.Equatable, Swift.Codable { - case mainThreadChecker - case performanceAntipatternChecker - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } -} -public struct SchemeLanguage : Swift.Codable, Swift.Equatable, Swift.ExpressibleByStringLiteral { - public let identifier: Swift.String - public init(identifier: Swift.String) - public init(stringLiteral: Swift.String) - public static func == (a: ProjectDescription.SchemeLanguage, b: ProjectDescription.SchemeLanguage) -> Swift.Bool - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.SchemeLanguage { - public static var doubleLengthPseudoLanguage: ProjectDescription.SchemeLanguage { - get - } - public static var rightToLeftPseudoLanguage: ProjectDescription.SchemeLanguage { - get - } - public static var accentedPseudoLanguage: ProjectDescription.SchemeLanguage { - get - } - public static var boundedStringPseudoLanguage: ProjectDescription.SchemeLanguage { - get - } - public static var rightToLeftWithStringsPseudoLanguage: ProjectDescription.SchemeLanguage { - get - } -} -public typealias SettingsDictionary = [Swift.String : ProjectDescription.SettingValue] -public enum SettingValue : Swift.ExpressibleByStringInterpolation, Swift.ExpressibleByArrayLiteral, Swift.ExpressibleByBooleanLiteral, Swift.Equatable, Swift.Codable { - case string(Swift.String) - case array([Swift.String]) - public init(stringLiteral value: Swift.String) - public init(arrayLiteral elements: Swift.String...) - public typealias BooleanLiteralType = Swift.Bool - public init(booleanLiteral value: Swift.Bool) - public init(_ stringRawRepresentable: T) where T : Swift.RawRepresentable, T.RawValue == Swift.String - public static func == (a: ProjectDescription.SettingValue, b: ProjectDescription.SettingValue) -> Swift.Bool - public typealias ArrayLiteralElement = Swift.String - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct Configuration : Swift.Equatable, Swift.Codable { - public enum Variant : Swift.String, Swift.Codable { - case debug - case release - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } - } - public let name: ProjectDescription.ConfigurationName - public let variant: ProjectDescription.Configuration.Variant - public let settings: ProjectDescription.SettingsDictionary - public let xcconfig: ProjectDescription.Path? - public static func debug(name: ProjectDescription.ConfigurationName, settings: ProjectDescription.SettingsDictionary = [:], xcconfig: ProjectDescription.Path? = nil) -> ProjectDescription.Configuration - public static func release(name: ProjectDescription.ConfigurationName, settings: ProjectDescription.SettingsDictionary = [:], xcconfig: ProjectDescription.Path? = nil) -> ProjectDescription.Configuration - public static func == (a: ProjectDescription.Configuration, b: ProjectDescription.Configuration) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public enum DefaultSettings : Swift.Codable, Swift.Equatable { - case recommended(excluding: Swift.Set = []) - case essential(excluding: Swift.Set = []) - case none - public static func == (a: ProjectDescription.DefaultSettings, b: ProjectDescription.DefaultSettings) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.DefaultSettings { - public static var recommended: ProjectDescription.DefaultSettings { - get - } - public static var essential: ProjectDescription.DefaultSettings { - get - } -} -public struct Settings : Swift.Equatable, Swift.Codable { - public let base: ProjectDescription.SettingsDictionary - public let configurations: [ProjectDescription.Configuration] - public let defaultSettings: ProjectDescription.DefaultSettings - public static func settings(base: ProjectDescription.SettingsDictionary = [:], debug: ProjectDescription.SettingsDictionary = [:], release: ProjectDescription.SettingsDictionary = [:], defaultSettings: ProjectDescription.DefaultSettings = .recommended) -> ProjectDescription.Settings - public static func settings(base: ProjectDescription.SettingsDictionary = [:], configurations: [ProjectDescription.Configuration], defaultSettings: ProjectDescription.DefaultSettings = .recommended) -> ProjectDescription.Settings - public static func == (a: ProjectDescription.Settings, b: ProjectDescription.Settings) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension Swift.Dictionary where Key == Swift.String, Value == ProjectDescription.SettingValue { - public mutating func merge(_ other: ProjectDescription.SettingsDictionary) - public func merging(_ other: ProjectDescription.SettingsDictionary) -> ProjectDescription.SettingsDictionary -} -public enum SwiftCompilationMode : Swift.String { - case singlefile - case wholemodule - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } -} -public enum DebugInformationFormat : Swift.String { - case dwarf - case dwarfWithDsym - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } -} -public enum SwiftOptimizationLevel : Swift.String { - case o - case oNone - case oSize - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } -} -extension Swift.Dictionary where Key == Swift.String, Value == ProjectDescription.SettingValue { - public func manualCodeSigning(identity: Swift.String? = nil, provisioningProfileSpecifier: Swift.String? = nil) -> ProjectDescription.SettingsDictionary - public func automaticCodeSigning(devTeam: Swift.String) -> ProjectDescription.SettingsDictionary - public func codeSignIdentityAppleDevelopment() -> ProjectDescription.SettingsDictionary - public func codeSignIdentity(_ identity: Swift.String) -> ProjectDescription.SettingsDictionary - public func currentProjectVersion(_ version: Swift.String) -> ProjectDescription.SettingsDictionary - public func marketingVersion(_ version: Swift.String) -> ProjectDescription.SettingsDictionary - public func appleGenericVersioningSystem() -> ProjectDescription.SettingsDictionary - public func versionInfo(_ version: Swift.String, prefix: Swift.String? = nil, suffix: Swift.String? = nil) -> ProjectDescription.SettingsDictionary - public func swiftVersion(_ version: Swift.String) -> ProjectDescription.SettingsDictionary - public func otherSwiftFlags(_ flags: Swift.String...) -> ProjectDescription.SettingsDictionary - public func swiftActiveCompilationConditions(_ conditions: Swift.String...) -> ProjectDescription.SettingsDictionary - public func swiftCompilationMode(_ mode: ProjectDescription.SwiftCompilationMode) -> ProjectDescription.SettingsDictionary - public func swiftOptimizationLevel(_ level: ProjectDescription.SwiftOptimizationLevel) -> ProjectDescription.SettingsDictionary - public func swiftOptimizeObjectLifetimes(_ enabled: Swift.Bool) -> ProjectDescription.SettingsDictionary - public func swiftObjcBridingHeaderPath(_ path: Swift.String) -> ProjectDescription.SettingsDictionary - public func otherCFlags(_ flags: [Swift.String]) -> ProjectDescription.SettingsDictionary - public func otherLinkerFlags(_ flags: [Swift.String]) -> ProjectDescription.SettingsDictionary - public func bitcodeEnabled(_ enabled: Swift.Bool) -> ProjectDescription.SettingsDictionary - public func debugInformationFormat(_ format: ProjectDescription.DebugInformationFormat) -> ProjectDescription.SettingsDictionary -} -public struct SourceFileGlob : Swift.Codable, Swift.Equatable { - public let glob: ProjectDescription.Path - public let excluding: [ProjectDescription.Path] - public let compilerFlags: Swift.String? - public let codeGen: ProjectDescription.FileCodeGen? - public static func glob(_ glob: ProjectDescription.Path, excluding: [ProjectDescription.Path] = [], compilerFlags: Swift.String? = nil, codeGen: ProjectDescription.FileCodeGen? = nil) -> ProjectDescription.SourceFileGlob - public static func glob(_ glob: ProjectDescription.Path, excluding: ProjectDescription.Path?, compilerFlags: Swift.String? = nil, codeGen: ProjectDescription.FileCodeGen? = nil) -> ProjectDescription.SourceFileGlob - public static func == (a: ProjectDescription.SourceFileGlob, b: ProjectDescription.SourceFileGlob) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.SourceFileGlob : Swift.ExpressibleByStringInterpolation { - public init(stringLiteral value: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -public struct SourceFilesList : Swift.Codable, Swift.Equatable { - public let globs: [ProjectDescription.SourceFileGlob] - public init(globs: [ProjectDescription.SourceFileGlob]) - public init(globs: [Swift.String]) - public static func paths(_ paths: [ProjectDescription.Path]) -> ProjectDescription.SourceFilesList - public static func == (a: ProjectDescription.SourceFilesList, b: ProjectDescription.SourceFilesList) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.SourceFilesList : Swift.ExpressibleByStringInterpolation { - public init(stringLiteral value: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -extension ProjectDescription.SourceFilesList : Swift.ExpressibleByArrayLiteral { - public init(arrayLiteral elements: ProjectDescription.SourceFileGlob...) - public typealias ArrayLiteralElement = ProjectDescription.SourceFileGlob -} -public struct Target : Swift.Codable, Swift.Equatable { - public let name: Swift.String - public let platform: ProjectDescription.Platform - public let product: ProjectDescription.Product - public let productName: Swift.String? - public let bundleId: Swift.String - public let deploymentTarget: ProjectDescription.DeploymentTarget? - public let infoPlist: ProjectDescription.InfoPlist? - public let sources: ProjectDescription.SourceFilesList? - public let resources: ProjectDescription.ResourceFileElements? - public let copyFiles: [ProjectDescription.CopyFilesAction]? - public let headers: ProjectDescription.Headers? - public let entitlements: ProjectDescription.Path? - public let scripts: [ProjectDescription.TargetScript] - public let dependencies: [ProjectDescription.TargetDependency] - public let settings: ProjectDescription.Settings? - public let coreDataModels: [ProjectDescription.CoreDataModel] - public let environment: [Swift.String : Swift.String] - public let launchArguments: [ProjectDescription.LaunchArgument] - public let additionalFiles: [ProjectDescription.FileElement] - public init(name: Swift.String, platform: ProjectDescription.Platform, product: ProjectDescription.Product, productName: Swift.String? = nil, bundleId: Swift.String, deploymentTarget: ProjectDescription.DeploymentTarget? = nil, infoPlist: ProjectDescription.InfoPlist? = .default, sources: ProjectDescription.SourceFilesList? = nil, resources: ProjectDescription.ResourceFileElements? = nil, copyFiles: [ProjectDescription.CopyFilesAction]? = nil, headers: ProjectDescription.Headers? = nil, entitlements: ProjectDescription.Path? = nil, scripts: [ProjectDescription.TargetScript] = [], dependencies: [ProjectDescription.TargetDependency] = [], settings: ProjectDescription.Settings? = nil, coreDataModels: [ProjectDescription.CoreDataModel] = [], environment: [Swift.String : Swift.String] = [:], launchArguments: [ProjectDescription.LaunchArgument] = [], additionalFiles: [ProjectDescription.FileElement] = []) - public static func == (a: ProjectDescription.Target, b: ProjectDescription.Target) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public enum SDKStatus : Swift.String, Swift.Codable, Swift.Hashable { - case required - case optional - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } -} -public enum SDKType : Swift.String, Swift.Codable, Swift.Hashable { - case library - case framework - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } -} -public enum TargetDependency : Swift.Codable, Swift.Hashable { - case target(name: Swift.String) - case project(target: Swift.String, path: ProjectDescription.Path) - case framework(path: ProjectDescription.Path) - case library(path: ProjectDescription.Path, publicHeaders: ProjectDescription.Path, swiftModuleMap: ProjectDescription.Path?) - case package(product: Swift.String) - case sdk(name: Swift.String, type: ProjectDescription.SDKType, status: ProjectDescription.SDKStatus) - case xcframework(path: ProjectDescription.Path) - case xctest - case external(name: Swift.String) - public static func sdk(name: Swift.String, type: ProjectDescription.SDKType) -> ProjectDescription.TargetDependency - public var typeName: Swift.String { - get - } - public func hash(into hasher: inout Swift.Hasher) - public static func == (a: ProjectDescription.TargetDependency, b: ProjectDescription.TargetDependency) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public var hashValue: Swift.Int { - get - } - public init(from decoder: Swift.Decoder) throws -} -public struct TargetReference : Swift.Hashable, Swift.Codable, Swift.ExpressibleByStringInterpolation { - public var projectPath: ProjectDescription.Path? - public var targetName: Swift.String - public init(projectPath: ProjectDescription.Path?, target: Swift.String) - public init(stringLiteral value: Swift.String) - public static func project(path: ProjectDescription.Path, target: Swift.String) -> ProjectDescription.TargetReference - public func hash(into hasher: inout Swift.Hasher) - public static func == (a: ProjectDescription.TargetReference, b: ProjectDescription.TargetReference) -> Swift.Bool - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String - public func encode(to encoder: Swift.Encoder) throws - public var hashValue: Swift.Int { - get - } - public init(from decoder: Swift.Decoder) throws -} -public struct TargetScript : Swift.Codable, Swift.Equatable { - public enum Order : Swift.String, Swift.Codable, Swift.Equatable { - case pre - case post - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } - } - public enum Script : Swift.Equatable, Swift.Codable { - case tool(path: Swift.String, args: [Swift.String]) - case scriptPath(path: ProjectDescription.Path, args: [Swift.String]) - case embedded(Swift.String) - public static func == (a: ProjectDescription.TargetScript.Script, b: ProjectDescription.TargetScript.Script) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - public let name: Swift.String - public let script: ProjectDescription.TargetScript.Script - public let order: ProjectDescription.TargetScript.Order - public let inputPaths: [ProjectDescription.Path] - public let inputFileListPaths: [ProjectDescription.Path] - public let outputPaths: [ProjectDescription.Path] - public let outputFileListPaths: [ProjectDescription.Path] - public let basedOnDependencyAnalysis: Swift.Bool? - public let runForInstallBuildsOnly: Swift.Bool - public let shellPath: Swift.String - public static func pre(path: ProjectDescription.Path, arguments: Swift.String..., name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript - public static func pre(path: ProjectDescription.Path, arguments: [Swift.String], name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript - public static func post(path: ProjectDescription.Path, arguments: Swift.String..., name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript - public static func post(path: ProjectDescription.Path, arguments: [Swift.String], name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript - public static func pre(tool: Swift.String, arguments: Swift.String..., name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript - public static func pre(tool: Swift.String, arguments: [Swift.String], name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript - public static func post(tool: Swift.String, arguments: Swift.String..., name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript - public static func post(tool: Swift.String, arguments: [Swift.String], name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript - public static func pre(script: Swift.String, name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript - public static func post(script: Swift.String, name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript - public static func == (a: ProjectDescription.TargetScript, b: ProjectDescription.TargetScript) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct Template : Swift.Codable, Swift.Equatable { - public let description: Swift.String - public let attributes: [ProjectDescription.Template.Attribute] - public let items: [ProjectDescription.Template.Item] - public init(description: Swift.String, attributes: [ProjectDescription.Template.Attribute] = [], items: [ProjectDescription.Template.Item] = []) - public enum Contents : Swift.Codable, Swift.Equatable { - case string(Swift.String) - case file(ProjectDescription.Path) - case directory(ProjectDescription.Path) - public static func == (a: ProjectDescription.Template.Contents, b: ProjectDescription.Template.Contents) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - public struct Item : Swift.Codable, Swift.Equatable { - public let path: Swift.String - public let contents: ProjectDescription.Template.Contents - public init(path: Swift.String, contents: ProjectDescription.Template.Contents) - public static func == (a: ProjectDescription.Template.Item, b: ProjectDescription.Template.Item) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - public enum Attribute : Swift.Codable, Swift.Equatable { - case required(Swift.String) - case optional(Swift.String, default: Swift.String) - public static func == (a: ProjectDescription.Template.Attribute, b: ProjectDescription.Template.Attribute) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - public static func == (a: ProjectDescription.Template, b: ProjectDescription.Template) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.Template.Item { - public static func string(path: Swift.String, contents: Swift.String) -> ProjectDescription.Template.Item - public static func file(path: Swift.String, templatePath: ProjectDescription.Path) -> ProjectDescription.Template.Item - public static func directory(path: Swift.String, sourcePath: ProjectDescription.Path) -> ProjectDescription.Template.Item -} -extension Swift.DefaultStringInterpolation { - public mutating func appendInterpolation(_ value: ProjectDescription.Template.Attribute) -} -public struct TemplateString : Swift.Encodable, Swift.Decodable, Swift.Equatable { - public static func == (a: ProjectDescription.TemplateString, b: ProjectDescription.TemplateString) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.TemplateString : Swift.ExpressibleByStringLiteral { - public init(stringLiteral: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -extension ProjectDescription.TemplateString : Swift.CustomStringConvertible { - public var description: Swift.String { - get - } -} -extension ProjectDescription.TemplateString : Swift.ExpressibleByStringInterpolation { - public init(stringInterpolation: ProjectDescription.TemplateString.StringInterpolation) - public struct StringInterpolation : Swift.StringInterpolationProtocol { - public init(literalCapacity _: Swift.Int, interpolationCount _: Swift.Int) - public mutating func appendLiteral(_ literal: Swift.String) - public mutating func appendInterpolation(_ token: ProjectDescription.TemplateString.Token) - public typealias StringLiteralType = Swift.String - } -} -extension ProjectDescription.TemplateString { - public enum Token : Swift.String, Swift.Equatable { - case projectName - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } - } -} -public struct TestAction : Swift.Equatable, Swift.Codable { - public let testPlans: [ProjectDescription.Path]? - public let targets: [ProjectDescription.TestableTarget] - public let arguments: ProjectDescription.Arguments? - public let configuration: ProjectDescription.ConfigurationName - public let attachDebugger: Swift.Bool - public let expandVariableFromTarget: ProjectDescription.TargetReference? - public let preActions: [ProjectDescription.ExecutionAction] - public let postActions: [ProjectDescription.ExecutionAction] - public let options: ProjectDescription.TestActionOptions - public let diagnosticsOptions: [ProjectDescription.SchemeDiagnosticsOption] - public static func targets(_ targets: [ProjectDescription.TestableTarget], arguments: ProjectDescription.Arguments? = nil, configuration: ProjectDescription.ConfigurationName = .debug, attachDebugger: Swift.Bool = true, expandVariableFromTarget: ProjectDescription.TargetReference? = nil, preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = [], options: ProjectDescription.TestActionOptions = .options(), diagnosticsOptions: [ProjectDescription.SchemeDiagnosticsOption] = [.mainThreadChecker]) -> ProjectDescription.TestAction - public static func testPlans(_ testPlans: [ProjectDescription.Path], configuration: ProjectDescription.ConfigurationName = .debug, attachDebugger: Swift.Bool = true, preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = []) -> ProjectDescription.TestAction - public static func == (a: ProjectDescription.TestAction, b: ProjectDescription.TestAction) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct TestActionOptions : Swift.Equatable, Swift.Codable { - public let language: ProjectDescription.SchemeLanguage? - public let region: Swift.String? - public let coverage: Swift.Bool - public let codeCoverageTargets: [ProjectDescription.TargetReference] - public static func options(language: ProjectDescription.SchemeLanguage? = nil, region: Swift.String? = nil, coverage: Swift.Bool = false, codeCoverageTargets: [ProjectDescription.TargetReference] = []) -> ProjectDescription.TestActionOptions - public static func == (a: ProjectDescription.TestActionOptions, b: ProjectDescription.TestActionOptions) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct TestableTarget : Swift.Equatable, Swift.Codable, Swift.ExpressibleByStringInterpolation { - public let target: ProjectDescription.TargetReference - public let isSkipped: Swift.Bool - public let isParallelizable: Swift.Bool - public let isRandomExecutionOrdering: Swift.Bool - public init(target: ProjectDescription.TargetReference, skipped: Swift.Bool = false, parallelizable: Swift.Bool = false, randomExecutionOrdering: Swift.Bool = false) - public init(stringLiteral value: Swift.String) - public static func == (a: ProjectDescription.TestableTarget, b: ProjectDescription.TestableTarget) -> Swift.Bool - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct TestingOptions : Swift.OptionSet, Swift.Codable, Swift.Equatable { - public let rawValue: Swift.Int - public init(rawValue: Swift.Int) - public static let parallelizable: ProjectDescription.TestingOptions - public static let randomExecutionOrdering: ProjectDescription.TestingOptions - public typealias ArrayLiteralElement = ProjectDescription.TestingOptions - public typealias Element = ProjectDescription.TestingOptions - public typealias RawValue = Swift.Int -} -public struct Version : Swift.Hashable, Swift.Codable { - public let major: Swift.Int - public let minor: Swift.Int - public let patch: Swift.Int - public let prereleaseIdentifiers: [Swift.String] - public let buildMetadataIdentifiers: [Swift.String] - public init(_ major: Swift.Int, _ minor: Swift.Int, _ patch: Swift.Int, prereleaseIdentifiers: [Swift.String] = [], buildMetadataIdentifiers: [Swift.String] = []) - public static func == (a: ProjectDescription.Version, b: ProjectDescription.Version) -> Swift.Bool - public func hash(into hasher: inout Swift.Hasher) - public func encode(to encoder: Swift.Encoder) throws - public var hashValue: Swift.Int { - get - } - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.Version : Swift.Comparable { - public static func < (lhs: ProjectDescription.Version, rhs: ProjectDescription.Version) -> Swift.Bool -} -extension ProjectDescription.Version : Swift.CustomStringConvertible { - public var description: Swift.String { - get - } -} -extension ProjectDescription.Version { - public init?(string: Swift.String) -} -extension ProjectDescription.Version : Swift.ExpressibleByStringInterpolation { - public init(stringLiteral value: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -extension Swift.ClosedRange where Bound == ProjectDescription.Version { - public func contains(_: ProjectDescription.Version) -> Swift.Bool -} -extension Swift.Range where Bound == ProjectDescription.Version { - public func contains(_: ProjectDescription.Version) -> Swift.Bool -} -extension Swift.Range where Bound == ProjectDescription.Version { - public func contains(version: ProjectDescription.Version) -> Swift.Bool -} -public struct Workspace : Swift.Codable, Swift.Equatable { - public let name: Swift.String - public let projects: [ProjectDescription.Path] - public let schemes: [ProjectDescription.Scheme] - public let fileHeaderTemplate: ProjectDescription.FileHeaderTemplate? - public let additionalFiles: [ProjectDescription.FileElement] - public let generationOptions: ProjectDescription.Workspace.GenerationOptions - public init(name: Swift.String, projects: [ProjectDescription.Path], schemes: [ProjectDescription.Scheme] = [], fileHeaderTemplate: ProjectDescription.FileHeaderTemplate? = nil, additionalFiles: [ProjectDescription.FileElement] = [], generationOptions: ProjectDescription.Workspace.GenerationOptions = .options()) - public static func == (a: ProjectDescription.Workspace, b: ProjectDescription.Workspace) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.Workspace { - public struct GenerationOptions : Swift.Codable, Swift.Equatable { - public enum AutogeneratedWorkspaceSchemes : Swift.Codable, Swift.Equatable { - public enum CodeCoverageMode : Swift.Codable, Swift.Equatable { - case all - case relevant - case targets([ProjectDescription.TargetReference]) - case disabled - public static func == (a: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes.CodeCoverageMode, b: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes.CodeCoverageMode) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - case disabled - case enabled(codeCoverageMode: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes.CodeCoverageMode = .disabled, testingOptions: ProjectDescription.TestingOptions = []) - public static func == (a: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes, b: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - public let enableAutomaticXcodeSchemes: Swift.Bool? - public let autogeneratedWorkspaceSchemes: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes - public let lastXcodeUpgradeCheck: ProjectDescription.Version? - public let renderMarkdownReadme: Swift.Bool - public static func options(enableAutomaticXcodeSchemes: Swift.Bool? = false, autogeneratedWorkspaceSchemes: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes = .enabled(), lastXcodeUpgradeCheck: ProjectDescription.Version? = nil, renderMarkdownReadme: Swift.Bool = false) -> ProjectDescription.Workspace.GenerationOptions - public static func == (a: ProjectDescription.Workspace.GenerationOptions, b: ProjectDescription.Workspace.GenerationOptions) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } -} -extension ProjectDescription.Cloud.Option : Swift.Hashable {} -extension ProjectDescription.Cloud.Option : Swift.RawRepresentable {} -extension ProjectDescription.CopyFilesAction.Destination : Swift.Hashable {} -extension ProjectDescription.CopyFilesAction.Destination : Swift.RawRepresentable {} -extension ProjectDescription.FileCodeGen : Swift.Hashable {} -extension ProjectDescription.FileCodeGen : Swift.RawRepresentable {} -extension ProjectDescription.Headers.AutomaticExclusionRule : Swift.Equatable {} -extension ProjectDescription.Headers.AutomaticExclusionRule : Swift.Hashable {} -extension ProjectDescription.Headers.AutomaticExclusionRule : Swift.RawRepresentable {} -extension ProjectDescription.Path.PathType : Swift.Equatable {} -extension ProjectDescription.Path.PathType : Swift.Hashable {} -extension ProjectDescription.Path.PathType : Swift.RawRepresentable {} -extension ProjectDescription.Platform : Swift.Hashable {} -extension ProjectDescription.Platform : Swift.RawRepresentable {} -extension ProjectDescription.Product : Swift.Hashable {} -extension ProjectDescription.Product : Swift.RawRepresentable {} -extension ProjectDescription.ResourceSynthesizer.Parser : Swift.Equatable {} -extension ProjectDescription.ResourceSynthesizer.Parser : Swift.Hashable {} -extension ProjectDescription.ResourceSynthesizer.Parser : Swift.RawRepresentable {} -extension ProjectDescription.RunActionOptions.GPUFrameCaptureMode : Swift.Hashable {} -extension ProjectDescription.RunActionOptions.GPUFrameCaptureMode : Swift.RawRepresentable {} -extension ProjectDescription.SchemeDiagnosticsOption : Swift.Hashable {} -extension ProjectDescription.SchemeDiagnosticsOption : Swift.RawRepresentable {} -extension ProjectDescription.Configuration.Variant : Swift.Equatable {} -extension ProjectDescription.Configuration.Variant : Swift.Hashable {} -extension ProjectDescription.Configuration.Variant : Swift.RawRepresentable {} -extension ProjectDescription.SwiftCompilationMode : Swift.Equatable {} -extension ProjectDescription.SwiftCompilationMode : Swift.Hashable {} -extension ProjectDescription.SwiftCompilationMode : Swift.RawRepresentable {} -extension ProjectDescription.DebugInformationFormat : Swift.Equatable {} -extension ProjectDescription.DebugInformationFormat : Swift.Hashable {} -extension ProjectDescription.DebugInformationFormat : Swift.RawRepresentable {} -extension ProjectDescription.SwiftOptimizationLevel : Swift.Equatable {} -extension ProjectDescription.SwiftOptimizationLevel : Swift.Hashable {} -extension ProjectDescription.SwiftOptimizationLevel : Swift.RawRepresentable {} -extension ProjectDescription.SDKStatus : Swift.RawRepresentable {} -extension ProjectDescription.SDKType : Swift.RawRepresentable {} -extension ProjectDescription.TargetScript.Order : Swift.Hashable {} -extension ProjectDescription.TargetScript.Order : Swift.RawRepresentable {} -extension ProjectDescription.TemplateString.Token : Swift.Hashable {} -extension ProjectDescription.TemplateString.Token : Swift.RawRepresentable {} diff --git a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/x86_64-apple-macos.swiftmodule b/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/x86_64-apple-macos.swiftmodule deleted file mode 100644 index edc5f9da2..000000000 Binary files a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/x86_64-apple-macos.swiftmodule and /dev/null differ diff --git a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/x86_64.swiftdoc b/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/x86_64.swiftdoc deleted file mode 100644 index c638986a6..000000000 Binary files a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/x86_64.swiftdoc and /dev/null differ diff --git a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/x86_64.swiftinterface b/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/x86_64.swiftinterface deleted file mode 100644 index b59be5e68..000000000 --- a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/x86_64.swiftinterface +++ /dev/null @@ -1,1418 +0,0 @@ -// swift-interface-format-version: 1.0 -// swift-compiler-version: Apple Swift version 5.5.1 (swiftlang-1300.0.31.4 clang-1300.0.29.6) -// swift-module-flags: -target x86_64-apple-macos11.0 -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -module-name ProjectDescription -import Foundation -import Swift -import _Concurrency -public struct AnalyzeAction : Swift.Equatable, Swift.Codable { - public let configuration: ProjectDescription.ConfigurationName - public static func analyzeAction(configuration: ProjectDescription.ConfigurationName) -> ProjectDescription.AnalyzeAction - public static func == (a: ProjectDescription.AnalyzeAction, b: ProjectDescription.AnalyzeAction) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct ArchiveAction : Swift.Equatable, Swift.Codable { - public let configuration: ProjectDescription.ConfigurationName - public let revealArchiveInOrganizer: Swift.Bool - public let customArchiveName: Swift.String? - public let preActions: [ProjectDescription.ExecutionAction] - public let postActions: [ProjectDescription.ExecutionAction] - public static func archiveAction(configuration: ProjectDescription.ConfigurationName, revealArchiveInOrganizer: Swift.Bool = true, customArchiveName: Swift.String? = nil, preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = []) -> ProjectDescription.ArchiveAction - public static func == (a: ProjectDescription.ArchiveAction, b: ProjectDescription.ArchiveAction) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct Arguments : Swift.Equatable, Swift.Codable { - public let environment: [Swift.String : Swift.String] - public let launchArguments: [ProjectDescription.LaunchArgument] - public init(environment: [Swift.String : Swift.String] = [:], launchArguments: [ProjectDescription.LaunchArgument] = []) - public static func == (a: ProjectDescription.Arguments, b: ProjectDescription.Arguments) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct BuildAction : Swift.Equatable, Swift.Codable { - public let targets: [ProjectDescription.TargetReference] - public let preActions: [ProjectDescription.ExecutionAction] - public let postActions: [ProjectDescription.ExecutionAction] - public let runPostActionsOnFailure: Swift.Bool - public init(targets: [ProjectDescription.TargetReference], preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = [], runPostActionsOnFailure: Swift.Bool = false) - public static func buildAction(targets: [ProjectDescription.TargetReference], preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = [], runPostActionsOnFailure: Swift.Bool = false) -> ProjectDescription.BuildAction - public static func == (a: ProjectDescription.BuildAction, b: ProjectDescription.BuildAction) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct Cache : Swift.Codable, Swift.Equatable { - public struct Profile : Swift.Codable, Swift.Equatable { - public let name: Swift.String - public let configuration: Swift.String - public let device: Swift.String? - public let os: Swift.String? - public static func profile(name: Swift.String, configuration: Swift.String, device: Swift.String? = nil, os: Swift.String? = nil) -> ProjectDescription.Cache.Profile - public static func == (a: ProjectDescription.Cache.Profile, b: ProjectDescription.Cache.Profile) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - public let profiles: [ProjectDescription.Cache.Profile] - public let path: ProjectDescription.Path? - public static func cache(profiles: [ProjectDescription.Cache.Profile] = [], path: ProjectDescription.Path? = nil) -> ProjectDescription.Cache - public static func == (a: ProjectDescription.Cache, b: ProjectDescription.Cache) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct Cloud : Swift.Codable, Swift.Equatable { - public enum Option : Swift.String, Swift.Codable, Swift.Equatable { - case analytics - case optional - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } - } - public let url: Swift.String - public let projectId: Swift.String - public let options: [ProjectDescription.Cloud.Option] - public static func cloud(projectId: Swift.String, url: Swift.String, options: [ProjectDescription.Cloud.Option] = []) -> ProjectDescription.Cloud - public static func == (a: ProjectDescription.Cloud, b: ProjectDescription.Cloud) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public enum CompatibleXcodeVersions : Swift.ExpressibleByArrayLiteral, Swift.ExpressibleByStringInterpolation, Swift.Codable, Swift.Equatable { - case all - case exact(ProjectDescription.Version) - case upToNextMajor(ProjectDescription.Version) - case upToNextMinor(ProjectDescription.Version) - case list([ProjectDescription.CompatibleXcodeVersions]) - public init(arrayLiteral elements: [ProjectDescription.CompatibleXcodeVersions]) - public init(arrayLiteral elements: ProjectDescription.CompatibleXcodeVersions...) - public init(stringLiteral value: Swift.String) - public static func == (a: ProjectDescription.CompatibleXcodeVersions, b: ProjectDescription.CompatibleXcodeVersions) -> Swift.Bool - public typealias ArrayLiteralElement = ProjectDescription.CompatibleXcodeVersions - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct Config : Swift.Codable, Swift.Equatable { - public let generationOptions: ProjectDescription.Config.GenerationOptions - public let compatibleXcodeVersions: ProjectDescription.CompatibleXcodeVersions - public let plugins: [ProjectDescription.PluginLocation] - public let cloud: ProjectDescription.Cloud? - public let cache: ProjectDescription.Cache? - public let swiftVersion: ProjectDescription.Version? - public init(compatibleXcodeVersions: ProjectDescription.CompatibleXcodeVersions = .all, cloud: ProjectDescription.Cloud? = nil, cache: ProjectDescription.Cache? = nil, swiftVersion: ProjectDescription.Version? = nil, plugins: [ProjectDescription.PluginLocation] = [], generationOptions: ProjectDescription.Config.GenerationOptions = .options()) - public static func == (a: ProjectDescription.Config, b: ProjectDescription.Config) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.Config { - public struct GenerationOptions : Swift.Codable, Swift.Equatable { - public let resolveDependenciesWithSystemScm: Swift.Bool - public let disablePackageVersionLocking: Swift.Bool - public static func options(resolveDependenciesWithSystemScm: Swift.Bool = false, disablePackageVersionLocking: Swift.Bool = false) -> ProjectDescription.Config.GenerationOptions - public static func == (a: ProjectDescription.Config.GenerationOptions, b: ProjectDescription.Config.GenerationOptions) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } -} -public struct ConfigurationName : Swift.ExpressibleByStringLiteral, Swift.Codable, Swift.Equatable { - public let rawValue: Swift.String - public init(stringLiteral value: Swift.StringLiteralType) - public static func configuration(_ name: Swift.String) -> ProjectDescription.ConfigurationName - public static var debug: ProjectDescription.ConfigurationName { - get - } - public static var release: ProjectDescription.ConfigurationName { - get - } - public static func == (a: ProjectDescription.ConfigurationName, b: ProjectDescription.ConfigurationName) -> Swift.Bool - public typealias ExtendedGraphemeClusterLiteralType = Swift.StringLiteralType - public typealias StringLiteralType = Swift.StringLiteralType - public typealias UnicodeScalarLiteralType = Swift.StringLiteralType - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct CopyFilesAction : Swift.Codable, Swift.Equatable { - public var name: Swift.String - public var destination: ProjectDescription.CopyFilesAction.Destination - public var subpath: Swift.String? - public var files: [ProjectDescription.FileElement] - public enum Destination : Swift.String, Swift.Codable, Swift.Equatable { - case absolutePath - case productsDirectory - case wrapper - case executables - case resources - case javaResources - case frameworks - case sharedFrameworks - case sharedSupport - case plugins - case other - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } - } - public static func productsDirectory(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction - public static func wrapper(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction - public static func executables(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction - public static func resources(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction - public static func javaResources(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction - public static func frameworks(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction - public static func sharedFrameworks(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction - public static func sharedSupport(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction - public static func plugins(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction - public static func == (a: ProjectDescription.CopyFilesAction, b: ProjectDescription.CopyFilesAction) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct CoreDataModel : Swift.Codable, Swift.Equatable { - public let path: ProjectDescription.Path - public let currentVersion: Swift.String? - public init(_ path: ProjectDescription.Path, currentVersion: Swift.String? = nil) - public static func == (a: ProjectDescription.CoreDataModel, b: ProjectDescription.CoreDataModel) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct CarthageDependencies : Swift.Codable, Swift.Equatable { - public let dependencies: [ProjectDescription.CarthageDependencies.Dependency] - public init(_ dependencies: [ProjectDescription.CarthageDependencies.Dependency]) - public static func == (a: ProjectDescription.CarthageDependencies, b: ProjectDescription.CarthageDependencies) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.CarthageDependencies : Swift.ExpressibleByArrayLiteral { - public init(arrayLiteral elements: ProjectDescription.CarthageDependencies.Dependency...) - public typealias ArrayLiteralElement = ProjectDescription.CarthageDependencies.Dependency -} -extension ProjectDescription.CarthageDependencies { - public enum Dependency : Swift.Codable, Swift.Equatable { - case github(path: Swift.String, requirement: ProjectDescription.CarthageDependencies.Requirement) - case git(path: Swift.String, requirement: ProjectDescription.CarthageDependencies.Requirement) - case binary(path: Swift.String, requirement: ProjectDescription.CarthageDependencies.Requirement) - public static func == (a: ProjectDescription.CarthageDependencies.Dependency, b: ProjectDescription.CarthageDependencies.Dependency) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - public enum Requirement : Swift.Codable, Swift.Equatable { - case exact(ProjectDescription.Version) - case upToNext(ProjectDescription.Version) - case atLeast(ProjectDescription.Version) - case branch(Swift.String) - case revision(Swift.String) - public static func == (a: ProjectDescription.CarthageDependencies.Requirement, b: ProjectDescription.CarthageDependencies.Requirement) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } -} -public struct Dependencies : Swift.Codable, Swift.Equatable { - public let carthage: ProjectDescription.CarthageDependencies? - public let swiftPackageManager: ProjectDescription.SwiftPackageManagerDependencies? - public let platforms: Swift.Set - public init(carthage: ProjectDescription.CarthageDependencies? = nil, swiftPackageManager: ProjectDescription.SwiftPackageManagerDependencies? = nil, platforms: Swift.Set = Set(Platform.allCases)) - public static func == (a: ProjectDescription.Dependencies, b: ProjectDescription.Dependencies) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct SwiftPackageManagerDependencies : Swift.Codable, Swift.Equatable { - public let packages: [ProjectDescription.Package] - public let productTypes: [Swift.String : ProjectDescription.Product] - public let baseSettings: ProjectDescription.Settings - public let targetSettings: [Swift.String : ProjectDescription.SettingsDictionary] - public let projectOptions: [Swift.String : ProjectDescription.Project.Options] - public init(_ packages: [ProjectDescription.Package], productTypes: [Swift.String : ProjectDescription.Product] = [:], baseSettings: ProjectDescription.Settings = .settings(), targetSettings: [Swift.String : ProjectDescription.SettingsDictionary] = [:], projectOptions: [Swift.String : ProjectDescription.Project.Options] = [:]) - public static func == (a: ProjectDescription.SwiftPackageManagerDependencies, b: ProjectDescription.SwiftPackageManagerDependencies) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.SwiftPackageManagerDependencies : Swift.ExpressibleByArrayLiteral { - public init(arrayLiteral elements: ProjectDescription.Package...) - public typealias ArrayLiteralElement = ProjectDescription.Package -} -public struct DeploymentDevice : Swift.OptionSet, Swift.Codable, Swift.Hashable { - public static let iphone: ProjectDescription.DeploymentDevice - public static let ipad: ProjectDescription.DeploymentDevice - public static let mac: ProjectDescription.DeploymentDevice - public let rawValue: Swift.UInt - public init(rawValue: Swift.UInt) - public typealias ArrayLiteralElement = ProjectDescription.DeploymentDevice - public typealias Element = ProjectDescription.DeploymentDevice - public typealias RawValue = Swift.UInt -} -public enum DeploymentTarget : Swift.Codable, Swift.Hashable { - case iOS(targetVersion: Swift.String, devices: ProjectDescription.DeploymentDevice) - case macOS(targetVersion: Swift.String) - case watchOS(targetVersion: Swift.String) - case tvOS(targetVersion: Swift.String) - public var targetVersion: Swift.String { - get - } - public func hash(into hasher: inout Swift.Hasher) - public static func == (a: ProjectDescription.DeploymentTarget, b: ProjectDescription.DeploymentTarget) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public var hashValue: Swift.Int { - get - } - public init(from decoder: Swift.Decoder) throws -} -@dynamicMemberLookup public enum Environment { - public enum Value : Swift.Equatable { - case boolean(Swift.Bool) - case string(Swift.String) - public static func == (a: ProjectDescription.Environment.Value, b: ProjectDescription.Environment.Value) -> Swift.Bool - } - public static subscript(dynamicMember member: Swift.String) -> ProjectDescription.Environment.Value? { - get - } -} -extension Swift.Optional where Wrapped == ProjectDescription.Environment.Value { - public func getString(default defaultString: Swift.String) -> Swift.String - public func getBoolean(default defaultBoolean: Swift.Bool) -> Swift.Bool -} -public struct ExecutionAction : Swift.Equatable, Swift.Codable { - public let title: Swift.String - public let scriptText: Swift.String - public let target: ProjectDescription.TargetReference? - public init(title: Swift.String = "Run Script", scriptText: Swift.String, target: ProjectDescription.TargetReference? = nil) - public static func == (a: ProjectDescription.ExecutionAction, b: ProjectDescription.ExecutionAction) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public enum FileCodeGen : Swift.String, Swift.Codable, Swift.Equatable { - case `public` - case `private` - case project - case disabled - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } -} -public enum FileElement : Swift.Codable, Swift.Equatable { - case glob(pattern: ProjectDescription.Path) - case folderReference(path: ProjectDescription.Path) - public static func == (a: ProjectDescription.FileElement, b: ProjectDescription.FileElement) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.FileElement : Swift.ExpressibleByStringInterpolation { - public init(stringLiteral value: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -extension Swift.Array : Swift.ExpressibleByUnicodeScalarLiteral where Element == ProjectDescription.FileElement { - public typealias UnicodeScalarLiteralType = Swift.String -} -extension Swift.Array : Swift.ExpressibleByExtendedGraphemeClusterLiteral where Element == ProjectDescription.FileElement { - public typealias ExtendedGraphemeClusterLiteralType = Swift.String -} -extension Swift.Array : Swift.ExpressibleByStringLiteral where Element == ProjectDescription.FileElement { - public typealias StringLiteralType = Swift.String - public init(stringLiteral value: Swift.String) -} -public enum FileHeaderTemplate : Swift.Codable, Swift.Equatable, Swift.ExpressibleByStringInterpolation { - case file(ProjectDescription.Path) - case string(Swift.String) - public init(stringLiteral value: Swift.String) - public static func == (a: ProjectDescription.FileHeaderTemplate, b: ProjectDescription.FileHeaderTemplate) -> Swift.Bool - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct FileList : Swift.Codable, Swift.Equatable { - public let globs: [ProjectDescription.FileListGlob] - public static func list(_ globs: [ProjectDescription.FileListGlob]) -> ProjectDescription.FileList - public static func == (a: ProjectDescription.FileList, b: ProjectDescription.FileList) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.FileList : Swift.ExpressibleByStringInterpolation { - public init(stringLiteral value: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -extension ProjectDescription.FileList : Swift.ExpressibleByArrayLiteral { - public init(arrayLiteral elements: Swift.String...) - public typealias ArrayLiteralElement = Swift.String -} -public struct FileListGlob : Swift.Codable, Swift.Equatable { - public var glob: ProjectDescription.Path - public var excluding: [ProjectDescription.Path] - public static func glob(_ glob: ProjectDescription.Path, excluding: [ProjectDescription.Path] = []) -> ProjectDescription.FileListGlob - public static func glob(_ glob: ProjectDescription.Path, excluding: ProjectDescription.Path?) -> ProjectDescription.FileListGlob - public static func == (a: ProjectDescription.FileListGlob, b: ProjectDescription.FileListGlob) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.FileListGlob : Swift.ExpressibleByStringInterpolation { - public init(stringLiteral value: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -public struct Headers : Swift.Codable, Swift.Equatable { - public enum AutomaticExclusionRule : Swift.Int, Swift.Codable { - case projectExcludesPrivateAndPublic - case publicExcludesPrivateAndProject - public init?(rawValue: Swift.Int) - public typealias RawValue = Swift.Int - public var rawValue: Swift.Int { - get - } - } - public let umbrellaHeader: ProjectDescription.Path? - public let `public`: ProjectDescription.FileList? - public let `private`: ProjectDescription.FileList? - public let project: ProjectDescription.FileList? - public let exclusionRule: ProjectDescription.Headers.AutomaticExclusionRule - public static func headers(public: ProjectDescription.FileList? = nil, private: ProjectDescription.FileList? = nil, project: ProjectDescription.FileList? = nil, exclusionRule: ProjectDescription.Headers.AutomaticExclusionRule = .projectExcludesPrivateAndPublic) -> ProjectDescription.Headers - public static func allHeaders(from list: ProjectDescription.FileList, umbrella: ProjectDescription.Path, private privateHeaders: ProjectDescription.FileList? = nil) -> ProjectDescription.Headers - public static func onlyHeaders(from list: ProjectDescription.FileList, umbrella: ProjectDescription.Path, private privateHeaders: ProjectDescription.FileList? = nil) -> ProjectDescription.Headers - public static func == (a: ProjectDescription.Headers, b: ProjectDescription.Headers) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public enum InfoPlist : Swift.Codable, Swift.Equatable { - indirect public enum Value : Swift.Codable, Swift.Equatable { - case string(Swift.String) - case integer(Swift.Int) - case real(Swift.Double) - case boolean(Swift.Bool) - case dictionary([Swift.String : ProjectDescription.InfoPlist.Value]) - case array([ProjectDescription.InfoPlist.Value]) - public static func == (a: ProjectDescription.InfoPlist.Value, b: ProjectDescription.InfoPlist.Value) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - case file(path: ProjectDescription.Path) - case dictionary([Swift.String : ProjectDescription.InfoPlist.Value]) - case extendingDefault(with: [Swift.String : ProjectDescription.InfoPlist.Value]) - public static var `default`: ProjectDescription.InfoPlist { - get - } - public enum CodingError : Swift.Error { - case invalidType(Swift.String) - } - public var path: ProjectDescription.Path? { - get - } - public static func == (a: ProjectDescription.InfoPlist, b: ProjectDescription.InfoPlist) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.InfoPlist : Swift.ExpressibleByStringInterpolation { - public init(stringLiteral value: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByStringInterpolation { - public init(stringLiteral value: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByIntegerLiteral { - public init(integerLiteral value: Swift.Int) - public typealias IntegerLiteralType = Swift.Int -} -extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByFloatLiteral { - public init(floatLiteral value: Swift.Double) - public typealias FloatLiteralType = Swift.Double -} -extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByBooleanLiteral { - public init(booleanLiteral value: Swift.Bool) - public typealias BooleanLiteralType = Swift.Bool -} -extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByDictionaryLiteral { - public init(dictionaryLiteral elements: (Swift.String, ProjectDescription.InfoPlist.Value)...) - public typealias Key = Swift.String - public typealias Value = ProjectDescription.InfoPlist.Value -} -extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByArrayLiteral { - public init(arrayLiteral elements: ProjectDescription.InfoPlist.Value...) - public typealias ArrayLiteralElement = ProjectDescription.InfoPlist.Value -} -public struct LaunchArgument : Swift.Equatable, Swift.Codable { - public let name: Swift.String - public let isEnabled: Swift.Bool - public init(name: Swift.String, isEnabled: Swift.Bool) - public static func == (a: ProjectDescription.LaunchArgument, b: ProjectDescription.LaunchArgument) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public enum Package : Swift.Equatable, Swift.Codable { - case remote(url: Swift.String, requirement: ProjectDescription.Package.Requirement) - case local(path: ProjectDescription.Path) - public static func == (a: ProjectDescription.Package, b: ProjectDescription.Package) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.Package { - public enum Requirement : Swift.Codable, Swift.Equatable { - case upToNextMajor(from: ProjectDescription.Version) - case upToNextMinor(from: ProjectDescription.Version) - case range(from: ProjectDescription.Version, to: ProjectDescription.Version) - case exact(ProjectDescription.Version) - case branch(Swift.String) - case revision(Swift.String) - public static func == (a: ProjectDescription.Package.Requirement, b: ProjectDescription.Package.Requirement) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } -} -extension ProjectDescription.Package { - public static func package(url: Swift.String, from version: ProjectDescription.Version) -> ProjectDescription.Package - public static func package(url: Swift.String, _ requirement: ProjectDescription.Package.Requirement) -> ProjectDescription.Package - public static func package(url: Swift.String, _ range: Swift.Range) -> ProjectDescription.Package - public static func package(url: Swift.String, _ range: Swift.ClosedRange) -> ProjectDescription.Package - public static func package(path: ProjectDescription.Path) -> ProjectDescription.Package -} -extension ProjectDescription.Package { - @available(*, unavailable, message: "use package(url:_:) with the .exact(Version) initializer instead") - public static func package(url _: Swift.String, version _: ProjectDescription.Version) -> ProjectDescription.Package - @available(*, unavailable, message: "use package(url:_:) with the .branch(String) initializer instead") - public static func package(url _: Swift.String, branch _: Swift.String) -> ProjectDescription.Package - @available(*, unavailable, message: "use package(url:_:) with the .revision(String) initializer instead") - public static func package(url _: Swift.String, revision _: Swift.String) -> ProjectDescription.Package - @available(*, unavailable, message: "use package(url:_:) without the range label instead") - public static func package(url _: Swift.String, range _: Swift.Range) -> ProjectDescription.Package -} -public struct Path : Swift.ExpressibleByStringInterpolation, Swift.Codable, Swift.Hashable { - public enum PathType : Swift.String, Swift.Codable { - case relativeToCurrentFile - case relativeToManifest - case relativeToRoot - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } - } - public let type: ProjectDescription.Path.PathType - public let pathString: Swift.String - public let callerPath: Swift.String? - public init(_ path: Swift.String) - public static func relativeToCurrentFile(_ pathString: Swift.String, callerPath: Swift.StaticString = #file) -> ProjectDescription.Path - public static func relativeToManifest(_ pathString: Swift.String) -> ProjectDescription.Path - public static func relativeToRoot(_ pathString: Swift.String) -> ProjectDescription.Path - public init(stringLiteral: Swift.String) - public static func == (a: ProjectDescription.Path, b: ProjectDescription.Path) -> Swift.Bool - public func hash(into hasher: inout Swift.Hasher) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String - public func encode(to encoder: Swift.Encoder) throws - public var hashValue: Swift.Int { - get - } - public init(from decoder: Swift.Decoder) throws -} -public enum Platform : Swift.String, Swift.Codable, Swift.Equatable, Swift.CaseIterable { - case iOS - case macOS - case watchOS - case tvOS - public init?(rawValue: Swift.String) - public typealias AllCases = [ProjectDescription.Platform] - public typealias RawValue = Swift.String - public static var allCases: [ProjectDescription.Platform] { - get - } - public var rawValue: Swift.String { - get - } -} -public struct Plugin : Swift.Codable, Swift.Equatable { - public let name: Swift.String - public init(name: Swift.String) - public static func == (a: ProjectDescription.Plugin, b: ProjectDescription.Plugin) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct PluginLocation : Swift.Codable, Swift.Equatable { - public let type: ProjectDescription.PluginLocation.LocationType - public static func local(path: ProjectDescription.Path) -> ProjectDescription.PluginLocation - public static func git(url: Swift.String, tag: Swift.String, directory: Swift.String? = nil) -> ProjectDescription.PluginLocation - public static func git(url: Swift.String, sha: Swift.String, directory: Swift.String? = nil) -> ProjectDescription.PluginLocation - public static func == (a: ProjectDescription.PluginLocation, b: ProjectDescription.PluginLocation) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.PluginLocation { - public enum LocationType : Swift.Codable, Swift.Equatable { - case local(path: ProjectDescription.Path) - case gitWithTag(url: Swift.String, tag: Swift.String, directory: Swift.String?) - case gitWithSha(url: Swift.String, sha: Swift.String, directory: Swift.String?) - public static func == (a: ProjectDescription.PluginLocation.LocationType, b: ProjectDescription.PluginLocation.LocationType) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } -} -public enum Product : Swift.String, Swift.Codable, Swift.Equatable { - case app - case staticLibrary - case dynamicLibrary - case framework - case staticFramework - case unitTests - case uiTests - case bundle - case commandLineTool - case appClip - case appExtension - case watch2App - case watch2Extension - case tvTopShelfExtension - case messagesExtension - case stickerPackExtension - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } -} -public struct ProfileAction : Swift.Equatable, Swift.Codable { - public let configuration: ProjectDescription.ConfigurationName - public let preActions: [ProjectDescription.ExecutionAction] - public let postActions: [ProjectDescription.ExecutionAction] - public let executable: ProjectDescription.TargetReference? - public let arguments: ProjectDescription.Arguments? - public static func profileAction(configuration: ProjectDescription.ConfigurationName = .release, preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = [], executable: ProjectDescription.TargetReference? = nil, arguments: ProjectDescription.Arguments? = nil) -> ProjectDescription.ProfileAction - public static func == (a: ProjectDescription.ProfileAction, b: ProjectDescription.ProfileAction) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct Project : Swift.Codable, Swift.Equatable { - public let name: Swift.String - public let organizationName: Swift.String? - public let options: ProjectDescription.Project.Options - public let packages: [ProjectDescription.Package] - public let targets: [ProjectDescription.Target] - public let schemes: [ProjectDescription.Scheme] - public let settings: ProjectDescription.Settings? - public let fileHeaderTemplate: ProjectDescription.FileHeaderTemplate? - public let additionalFiles: [ProjectDescription.FileElement] - public let resourceSynthesizers: [ProjectDescription.ResourceSynthesizer] - public init(name: Swift.String, organizationName: Swift.String? = nil, options: ProjectDescription.Project.Options = .options(), packages: [ProjectDescription.Package] = [], settings: ProjectDescription.Settings? = nil, targets: [ProjectDescription.Target] = [], schemes: [ProjectDescription.Scheme] = [], fileHeaderTemplate: ProjectDescription.FileHeaderTemplate? = nil, additionalFiles: [ProjectDescription.FileElement] = [], resourceSynthesizers: [ProjectDescription.ResourceSynthesizer] = .default) - public static func == (a: ProjectDescription.Project, b: ProjectDescription.Project) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.Project { - public struct Options : Swift.Codable, Swift.Equatable { - public let automaticSchemesOptions: ProjectDescription.Project.Options.AutomaticSchemesOptions - public let developmentRegion: Swift.String? - public let disableBundleAccessors: Swift.Bool - public let disableShowEnvironmentVarsInScriptPhases: Swift.Bool - public let disableSynthesizedResourceAccessors: Swift.Bool - public let textSettings: ProjectDescription.Project.Options.TextSettings - public let xcodeProjectName: Swift.String? - public static func options(automaticSchemesOptions: ProjectDescription.Project.Options.AutomaticSchemesOptions = .enabled(), developmentRegion: Swift.String? = nil, disableBundleAccessors: Swift.Bool = false, disableShowEnvironmentVarsInScriptPhases: Swift.Bool = false, disableSynthesizedResourceAccessors: Swift.Bool = false, textSettings: ProjectDescription.Project.Options.TextSettings = .textSettings(), xcodeProjectName: Swift.String? = nil) -> ProjectDescription.Project.Options - public static func == (a: ProjectDescription.Project.Options, b: ProjectDescription.Project.Options) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } -} -extension ProjectDescription.Project.Options { - public enum AutomaticSchemesOptions : Swift.Codable, Swift.Equatable { - public enum TargetSchemesGrouping : Swift.Codable, Swift.Equatable { - case singleScheme - case byNameSuffix(build: Swift.Set, test: Swift.Set, run: Swift.Set) - case notGrouped - public static func == (a: ProjectDescription.Project.Options.AutomaticSchemesOptions.TargetSchemesGrouping, b: ProjectDescription.Project.Options.AutomaticSchemesOptions.TargetSchemesGrouping) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - case enabled(targetSchemesGrouping: ProjectDescription.Project.Options.AutomaticSchemesOptions.TargetSchemesGrouping = .byNameSuffix( - build: ["Implementation", "Interface", "Mocks", "Testing"], - test: ["Tests", "IntegrationTests", "UITests", "SnapshotTests"], - run: ["App", "Demo"] - ), codeCoverageEnabled: Swift.Bool = false, testingOptions: ProjectDescription.TestingOptions = []) - case disabled - public static func == (a: ProjectDescription.Project.Options.AutomaticSchemesOptions, b: ProjectDescription.Project.Options.AutomaticSchemesOptions) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - public struct TextSettings : Swift.Codable, Swift.Equatable { - public let usesTabs: Swift.Bool? - public let indentWidth: Swift.UInt? - public let tabWidth: Swift.UInt? - public let wrapsLines: Swift.Bool? - public static func textSettings(usesTabs: Swift.Bool? = nil, indentWidth: Swift.UInt? = nil, tabWidth: Swift.UInt? = nil, wrapsLines: Swift.Bool? = nil) -> ProjectDescription.Project.Options.TextSettings - public static func == (a: ProjectDescription.Project.Options.TextSettings, b: ProjectDescription.Project.Options.TextSettings) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } -} -public enum ResourceFileElement : Swift.Codable, Swift.Equatable { - case glob(pattern: ProjectDescription.Path, excluding: [ProjectDescription.Path] = [], tags: [Swift.String] = []) - case folderReference(path: ProjectDescription.Path, tags: [Swift.String] = []) - public static func == (a: ProjectDescription.ResourceFileElement, b: ProjectDescription.ResourceFileElement) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.ResourceFileElement : Swift.ExpressibleByStringInterpolation { - public init(stringLiteral value: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -public struct ResourceFileElements : Swift.Codable, Swift.Equatable { - public let resources: [ProjectDescription.ResourceFileElement] - public init(resources: [ProjectDescription.ResourceFileElement]) - public static func == (a: ProjectDescription.ResourceFileElements, b: ProjectDescription.ResourceFileElements) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.ResourceFileElements : Swift.ExpressibleByStringInterpolation { - public init(stringLiteral value: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -extension ProjectDescription.ResourceFileElements : Swift.ExpressibleByArrayLiteral { - public init(arrayLiteral elements: ProjectDescription.ResourceFileElement...) - public typealias ArrayLiteralElement = ProjectDescription.ResourceFileElement -} -public struct ResourceSynthesizer : Swift.Codable, Swift.Equatable { - public let templateType: ProjectDescription.ResourceSynthesizer.TemplateType - public let parser: ProjectDescription.ResourceSynthesizer.Parser - public let extensions: Swift.Set - public enum TemplateType : Swift.Codable, Swift.Equatable { - case plugin(name: Swift.String, resourceName: Swift.String) - case defaultTemplate(resourceName: Swift.String) - public static func == (a: ProjectDescription.ResourceSynthesizer.TemplateType, b: ProjectDescription.ResourceSynthesizer.TemplateType) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - public enum Parser : Swift.String, Swift.Codable { - case strings - case assets - case plists - case fonts - case coreData - case interfaceBuilder - case json - case yaml - case files - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } - } - public static func strings() -> ProjectDescription.ResourceSynthesizer - public static func strings(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer - public static func assets() -> ProjectDescription.ResourceSynthesizer - public static func assets(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer - public static func fonts() -> ProjectDescription.ResourceSynthesizer - public static func fonts(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer - public static func plists() -> ProjectDescription.ResourceSynthesizer - public static func plists(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer - public static func coreData(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer - public static func coreData() -> ProjectDescription.ResourceSynthesizer - public static func interfaceBuilder(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer - public static func interfaceBuilder() -> ProjectDescription.ResourceSynthesizer - public static func json(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer - public static func json() -> ProjectDescription.ResourceSynthesizer - public static func yaml(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer - public static func yaml() -> ProjectDescription.ResourceSynthesizer - public static func files(plugin: Swift.String, extensions: Swift.Set) -> ProjectDescription.ResourceSynthesizer - public static func files(extensions: Swift.Set) -> ProjectDescription.ResourceSynthesizer - public static func custom(plugin: Swift.String, parser: ProjectDescription.ResourceSynthesizer.Parser, extensions: Swift.Set, resourceName: Swift.String) -> ProjectDescription.ResourceSynthesizer - public static func custom(name: Swift.String, parser: ProjectDescription.ResourceSynthesizer.Parser, extensions: Swift.Set) -> ProjectDescription.ResourceSynthesizer - public static func == (a: ProjectDescription.ResourceSynthesizer, b: ProjectDescription.ResourceSynthesizer) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension Swift.Array where Element == ProjectDescription.ResourceSynthesizer { - public static var `default`: Swift.Array { - get - } -} -public struct RunAction : Swift.Equatable, Swift.Codable { - public let configuration: ProjectDescription.ConfigurationName - public let attachDebugger: Swift.Bool - public let preActions: [ProjectDescription.ExecutionAction] - public let postActions: [ProjectDescription.ExecutionAction] - public let executable: ProjectDescription.TargetReference? - public let arguments: ProjectDescription.Arguments? - public let options: ProjectDescription.RunActionOptions - public let diagnosticsOptions: [ProjectDescription.SchemeDiagnosticsOption] - public static func runAction(configuration: ProjectDescription.ConfigurationName = .debug, attachDebugger: Swift.Bool = true, preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = [], executable: ProjectDescription.TargetReference? = nil, arguments: ProjectDescription.Arguments? = nil, options: ProjectDescription.RunActionOptions = .options(), diagnosticsOptions: [ProjectDescription.SchemeDiagnosticsOption] = [.mainThreadChecker]) -> ProjectDescription.RunAction - public static func == (a: ProjectDescription.RunAction, b: ProjectDescription.RunAction) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct RunActionOptions : Swift.Equatable, Swift.Codable { - public let language: ProjectDescription.SchemeLanguage? - public let storeKitConfigurationPath: ProjectDescription.Path? - public let simulatedLocation: ProjectDescription.RunActionOptions.SimulatedLocation? - public let enableGPUFrameCaptureMode: ProjectDescription.RunActionOptions.GPUFrameCaptureMode - public static func options(language: ProjectDescription.SchemeLanguage? = nil, storeKitConfigurationPath: ProjectDescription.Path? = nil, simulatedLocation: ProjectDescription.RunActionOptions.SimulatedLocation? = nil, enableGPUFrameCaptureMode: ProjectDescription.RunActionOptions.GPUFrameCaptureMode = GPUFrameCaptureMode.default) -> ProjectDescription.RunActionOptions - public static func == (a: ProjectDescription.RunActionOptions, b: ProjectDescription.RunActionOptions) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.RunActionOptions { - public struct SimulatedLocation : Swift.Codable, Swift.Equatable { - public let identifier: Swift.String? - public let gpxFile: ProjectDescription.Path? - public static func custom(gpxFile: ProjectDescription.Path) -> ProjectDescription.RunActionOptions.SimulatedLocation - public static var london: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var johannesburg: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var moscow: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var mumbai: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var tokyo: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var sydney: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var hongKong: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var honolulu: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var sanFrancisco: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var mexicoCity: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var newYork: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static var rioDeJaneiro: ProjectDescription.RunActionOptions.SimulatedLocation { - get - } - public static func == (a: ProjectDescription.RunActionOptions.SimulatedLocation, b: ProjectDescription.RunActionOptions.SimulatedLocation) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } -} -extension ProjectDescription.RunActionOptions { - public enum GPUFrameCaptureMode : Swift.String, Swift.Codable, Swift.Equatable { - case autoEnabled - case metal - case openGL - case disabled - public static var `default`: ProjectDescription.RunActionOptions.GPUFrameCaptureMode { - get - } - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } - } -} -public struct Scheme : Swift.Equatable, Swift.Codable { - public let name: Swift.String - public let shared: Swift.Bool - public let hidden: Swift.Bool - public let buildAction: ProjectDescription.BuildAction? - public let testAction: ProjectDescription.TestAction? - public let runAction: ProjectDescription.RunAction? - public let archiveAction: ProjectDescription.ArchiveAction? - public let profileAction: ProjectDescription.ProfileAction? - public let analyzeAction: ProjectDescription.AnalyzeAction? - public init(name: Swift.String, shared: Swift.Bool = true, hidden: Swift.Bool = false, buildAction: ProjectDescription.BuildAction? = nil, testAction: ProjectDescription.TestAction? = nil, runAction: ProjectDescription.RunAction? = nil, archiveAction: ProjectDescription.ArchiveAction? = nil, profileAction: ProjectDescription.ProfileAction? = nil, analyzeAction: ProjectDescription.AnalyzeAction? = nil) - public static func == (a: ProjectDescription.Scheme, b: ProjectDescription.Scheme) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public enum SchemeDiagnosticsOption : Swift.String, Swift.Equatable, Swift.Codable { - case mainThreadChecker - case performanceAntipatternChecker - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } -} -public struct SchemeLanguage : Swift.Codable, Swift.Equatable, Swift.ExpressibleByStringLiteral { - public let identifier: Swift.String - public init(identifier: Swift.String) - public init(stringLiteral: Swift.String) - public static func == (a: ProjectDescription.SchemeLanguage, b: ProjectDescription.SchemeLanguage) -> Swift.Bool - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.SchemeLanguage { - public static var doubleLengthPseudoLanguage: ProjectDescription.SchemeLanguage { - get - } - public static var rightToLeftPseudoLanguage: ProjectDescription.SchemeLanguage { - get - } - public static var accentedPseudoLanguage: ProjectDescription.SchemeLanguage { - get - } - public static var boundedStringPseudoLanguage: ProjectDescription.SchemeLanguage { - get - } - public static var rightToLeftWithStringsPseudoLanguage: ProjectDescription.SchemeLanguage { - get - } -} -public typealias SettingsDictionary = [Swift.String : ProjectDescription.SettingValue] -public enum SettingValue : Swift.ExpressibleByStringInterpolation, Swift.ExpressibleByArrayLiteral, Swift.ExpressibleByBooleanLiteral, Swift.Equatable, Swift.Codable { - case string(Swift.String) - case array([Swift.String]) - public init(stringLiteral value: Swift.String) - public init(arrayLiteral elements: Swift.String...) - public typealias BooleanLiteralType = Swift.Bool - public init(booleanLiteral value: Swift.Bool) - public init(_ stringRawRepresentable: T) where T : Swift.RawRepresentable, T.RawValue == Swift.String - public static func == (a: ProjectDescription.SettingValue, b: ProjectDescription.SettingValue) -> Swift.Bool - public typealias ArrayLiteralElement = Swift.String - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct Configuration : Swift.Equatable, Swift.Codable { - public enum Variant : Swift.String, Swift.Codable { - case debug - case release - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } - } - public let name: ProjectDescription.ConfigurationName - public let variant: ProjectDescription.Configuration.Variant - public let settings: ProjectDescription.SettingsDictionary - public let xcconfig: ProjectDescription.Path? - public static func debug(name: ProjectDescription.ConfigurationName, settings: ProjectDescription.SettingsDictionary = [:], xcconfig: ProjectDescription.Path? = nil) -> ProjectDescription.Configuration - public static func release(name: ProjectDescription.ConfigurationName, settings: ProjectDescription.SettingsDictionary = [:], xcconfig: ProjectDescription.Path? = nil) -> ProjectDescription.Configuration - public static func == (a: ProjectDescription.Configuration, b: ProjectDescription.Configuration) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public enum DefaultSettings : Swift.Codable, Swift.Equatable { - case recommended(excluding: Swift.Set = []) - case essential(excluding: Swift.Set = []) - case none - public static func == (a: ProjectDescription.DefaultSettings, b: ProjectDescription.DefaultSettings) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.DefaultSettings { - public static var recommended: ProjectDescription.DefaultSettings { - get - } - public static var essential: ProjectDescription.DefaultSettings { - get - } -} -public struct Settings : Swift.Equatable, Swift.Codable { - public let base: ProjectDescription.SettingsDictionary - public let configurations: [ProjectDescription.Configuration] - public let defaultSettings: ProjectDescription.DefaultSettings - public static func settings(base: ProjectDescription.SettingsDictionary = [:], debug: ProjectDescription.SettingsDictionary = [:], release: ProjectDescription.SettingsDictionary = [:], defaultSettings: ProjectDescription.DefaultSettings = .recommended) -> ProjectDescription.Settings - public static func settings(base: ProjectDescription.SettingsDictionary = [:], configurations: [ProjectDescription.Configuration], defaultSettings: ProjectDescription.DefaultSettings = .recommended) -> ProjectDescription.Settings - public static func == (a: ProjectDescription.Settings, b: ProjectDescription.Settings) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension Swift.Dictionary where Key == Swift.String, Value == ProjectDescription.SettingValue { - public mutating func merge(_ other: ProjectDescription.SettingsDictionary) - public func merging(_ other: ProjectDescription.SettingsDictionary) -> ProjectDescription.SettingsDictionary -} -public enum SwiftCompilationMode : Swift.String { - case singlefile - case wholemodule - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } -} -public enum DebugInformationFormat : Swift.String { - case dwarf - case dwarfWithDsym - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } -} -public enum SwiftOptimizationLevel : Swift.String { - case o - case oNone - case oSize - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } -} -extension Swift.Dictionary where Key == Swift.String, Value == ProjectDescription.SettingValue { - public func manualCodeSigning(identity: Swift.String? = nil, provisioningProfileSpecifier: Swift.String? = nil) -> ProjectDescription.SettingsDictionary - public func automaticCodeSigning(devTeam: Swift.String) -> ProjectDescription.SettingsDictionary - public func codeSignIdentityAppleDevelopment() -> ProjectDescription.SettingsDictionary - public func codeSignIdentity(_ identity: Swift.String) -> ProjectDescription.SettingsDictionary - public func currentProjectVersion(_ version: Swift.String) -> ProjectDescription.SettingsDictionary - public func marketingVersion(_ version: Swift.String) -> ProjectDescription.SettingsDictionary - public func appleGenericVersioningSystem() -> ProjectDescription.SettingsDictionary - public func versionInfo(_ version: Swift.String, prefix: Swift.String? = nil, suffix: Swift.String? = nil) -> ProjectDescription.SettingsDictionary - public func swiftVersion(_ version: Swift.String) -> ProjectDescription.SettingsDictionary - public func otherSwiftFlags(_ flags: Swift.String...) -> ProjectDescription.SettingsDictionary - public func swiftActiveCompilationConditions(_ conditions: Swift.String...) -> ProjectDescription.SettingsDictionary - public func swiftCompilationMode(_ mode: ProjectDescription.SwiftCompilationMode) -> ProjectDescription.SettingsDictionary - public func swiftOptimizationLevel(_ level: ProjectDescription.SwiftOptimizationLevel) -> ProjectDescription.SettingsDictionary - public func swiftOptimizeObjectLifetimes(_ enabled: Swift.Bool) -> ProjectDescription.SettingsDictionary - public func swiftObjcBridingHeaderPath(_ path: Swift.String) -> ProjectDescription.SettingsDictionary - public func otherCFlags(_ flags: [Swift.String]) -> ProjectDescription.SettingsDictionary - public func otherLinkerFlags(_ flags: [Swift.String]) -> ProjectDescription.SettingsDictionary - public func bitcodeEnabled(_ enabled: Swift.Bool) -> ProjectDescription.SettingsDictionary - public func debugInformationFormat(_ format: ProjectDescription.DebugInformationFormat) -> ProjectDescription.SettingsDictionary -} -public struct SourceFileGlob : Swift.Codable, Swift.Equatable { - public let glob: ProjectDescription.Path - public let excluding: [ProjectDescription.Path] - public let compilerFlags: Swift.String? - public let codeGen: ProjectDescription.FileCodeGen? - public static func glob(_ glob: ProjectDescription.Path, excluding: [ProjectDescription.Path] = [], compilerFlags: Swift.String? = nil, codeGen: ProjectDescription.FileCodeGen? = nil) -> ProjectDescription.SourceFileGlob - public static func glob(_ glob: ProjectDescription.Path, excluding: ProjectDescription.Path?, compilerFlags: Swift.String? = nil, codeGen: ProjectDescription.FileCodeGen? = nil) -> ProjectDescription.SourceFileGlob - public static func == (a: ProjectDescription.SourceFileGlob, b: ProjectDescription.SourceFileGlob) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.SourceFileGlob : Swift.ExpressibleByStringInterpolation { - public init(stringLiteral value: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -public struct SourceFilesList : Swift.Codable, Swift.Equatable { - public let globs: [ProjectDescription.SourceFileGlob] - public init(globs: [ProjectDescription.SourceFileGlob]) - public init(globs: [Swift.String]) - public static func paths(_ paths: [ProjectDescription.Path]) -> ProjectDescription.SourceFilesList - public static func == (a: ProjectDescription.SourceFilesList, b: ProjectDescription.SourceFilesList) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.SourceFilesList : Swift.ExpressibleByStringInterpolation { - public init(stringLiteral value: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -extension ProjectDescription.SourceFilesList : Swift.ExpressibleByArrayLiteral { - public init(arrayLiteral elements: ProjectDescription.SourceFileGlob...) - public typealias ArrayLiteralElement = ProjectDescription.SourceFileGlob -} -public struct Target : Swift.Codable, Swift.Equatable { - public let name: Swift.String - public let platform: ProjectDescription.Platform - public let product: ProjectDescription.Product - public let productName: Swift.String? - public let bundleId: Swift.String - public let deploymentTarget: ProjectDescription.DeploymentTarget? - public let infoPlist: ProjectDescription.InfoPlist? - public let sources: ProjectDescription.SourceFilesList? - public let resources: ProjectDescription.ResourceFileElements? - public let copyFiles: [ProjectDescription.CopyFilesAction]? - public let headers: ProjectDescription.Headers? - public let entitlements: ProjectDescription.Path? - public let scripts: [ProjectDescription.TargetScript] - public let dependencies: [ProjectDescription.TargetDependency] - public let settings: ProjectDescription.Settings? - public let coreDataModels: [ProjectDescription.CoreDataModel] - public let environment: [Swift.String : Swift.String] - public let launchArguments: [ProjectDescription.LaunchArgument] - public let additionalFiles: [ProjectDescription.FileElement] - public init(name: Swift.String, platform: ProjectDescription.Platform, product: ProjectDescription.Product, productName: Swift.String? = nil, bundleId: Swift.String, deploymentTarget: ProjectDescription.DeploymentTarget? = nil, infoPlist: ProjectDescription.InfoPlist? = .default, sources: ProjectDescription.SourceFilesList? = nil, resources: ProjectDescription.ResourceFileElements? = nil, copyFiles: [ProjectDescription.CopyFilesAction]? = nil, headers: ProjectDescription.Headers? = nil, entitlements: ProjectDescription.Path? = nil, scripts: [ProjectDescription.TargetScript] = [], dependencies: [ProjectDescription.TargetDependency] = [], settings: ProjectDescription.Settings? = nil, coreDataModels: [ProjectDescription.CoreDataModel] = [], environment: [Swift.String : Swift.String] = [:], launchArguments: [ProjectDescription.LaunchArgument] = [], additionalFiles: [ProjectDescription.FileElement] = []) - public static func == (a: ProjectDescription.Target, b: ProjectDescription.Target) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public enum SDKStatus : Swift.String, Swift.Codable, Swift.Hashable { - case required - case optional - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } -} -public enum SDKType : Swift.String, Swift.Codable, Swift.Hashable { - case library - case framework - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } -} -public enum TargetDependency : Swift.Codable, Swift.Hashable { - case target(name: Swift.String) - case project(target: Swift.String, path: ProjectDescription.Path) - case framework(path: ProjectDescription.Path) - case library(path: ProjectDescription.Path, publicHeaders: ProjectDescription.Path, swiftModuleMap: ProjectDescription.Path?) - case package(product: Swift.String) - case sdk(name: Swift.String, type: ProjectDescription.SDKType, status: ProjectDescription.SDKStatus) - case xcframework(path: ProjectDescription.Path) - case xctest - case external(name: Swift.String) - public static func sdk(name: Swift.String, type: ProjectDescription.SDKType) -> ProjectDescription.TargetDependency - public var typeName: Swift.String { - get - } - public func hash(into hasher: inout Swift.Hasher) - public static func == (a: ProjectDescription.TargetDependency, b: ProjectDescription.TargetDependency) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public var hashValue: Swift.Int { - get - } - public init(from decoder: Swift.Decoder) throws -} -public struct TargetReference : Swift.Hashable, Swift.Codable, Swift.ExpressibleByStringInterpolation { - public var projectPath: ProjectDescription.Path? - public var targetName: Swift.String - public init(projectPath: ProjectDescription.Path?, target: Swift.String) - public init(stringLiteral value: Swift.String) - public static func project(path: ProjectDescription.Path, target: Swift.String) -> ProjectDescription.TargetReference - public func hash(into hasher: inout Swift.Hasher) - public static func == (a: ProjectDescription.TargetReference, b: ProjectDescription.TargetReference) -> Swift.Bool - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String - public func encode(to encoder: Swift.Encoder) throws - public var hashValue: Swift.Int { - get - } - public init(from decoder: Swift.Decoder) throws -} -public struct TargetScript : Swift.Codable, Swift.Equatable { - public enum Order : Swift.String, Swift.Codable, Swift.Equatable { - case pre - case post - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } - } - public enum Script : Swift.Equatable, Swift.Codable { - case tool(path: Swift.String, args: [Swift.String]) - case scriptPath(path: ProjectDescription.Path, args: [Swift.String]) - case embedded(Swift.String) - public static func == (a: ProjectDescription.TargetScript.Script, b: ProjectDescription.TargetScript.Script) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - public let name: Swift.String - public let script: ProjectDescription.TargetScript.Script - public let order: ProjectDescription.TargetScript.Order - public let inputPaths: [ProjectDescription.Path] - public let inputFileListPaths: [ProjectDescription.Path] - public let outputPaths: [ProjectDescription.Path] - public let outputFileListPaths: [ProjectDescription.Path] - public let basedOnDependencyAnalysis: Swift.Bool? - public let runForInstallBuildsOnly: Swift.Bool - public let shellPath: Swift.String - public static func pre(path: ProjectDescription.Path, arguments: Swift.String..., name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript - public static func pre(path: ProjectDescription.Path, arguments: [Swift.String], name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript - public static func post(path: ProjectDescription.Path, arguments: Swift.String..., name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript - public static func post(path: ProjectDescription.Path, arguments: [Swift.String], name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript - public static func pre(tool: Swift.String, arguments: Swift.String..., name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript - public static func pre(tool: Swift.String, arguments: [Swift.String], name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript - public static func post(tool: Swift.String, arguments: Swift.String..., name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript - public static func post(tool: Swift.String, arguments: [Swift.String], name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript - public static func pre(script: Swift.String, name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript - public static func post(script: Swift.String, name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript - public static func == (a: ProjectDescription.TargetScript, b: ProjectDescription.TargetScript) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct Template : Swift.Codable, Swift.Equatable { - public let description: Swift.String - public let attributes: [ProjectDescription.Template.Attribute] - public let items: [ProjectDescription.Template.Item] - public init(description: Swift.String, attributes: [ProjectDescription.Template.Attribute] = [], items: [ProjectDescription.Template.Item] = []) - public enum Contents : Swift.Codable, Swift.Equatable { - case string(Swift.String) - case file(ProjectDescription.Path) - case directory(ProjectDescription.Path) - public static func == (a: ProjectDescription.Template.Contents, b: ProjectDescription.Template.Contents) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - public struct Item : Swift.Codable, Swift.Equatable { - public let path: Swift.String - public let contents: ProjectDescription.Template.Contents - public init(path: Swift.String, contents: ProjectDescription.Template.Contents) - public static func == (a: ProjectDescription.Template.Item, b: ProjectDescription.Template.Item) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - public enum Attribute : Swift.Codable, Swift.Equatable { - case required(Swift.String) - case optional(Swift.String, default: Swift.String) - public static func == (a: ProjectDescription.Template.Attribute, b: ProjectDescription.Template.Attribute) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - public static func == (a: ProjectDescription.Template, b: ProjectDescription.Template) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.Template.Item { - public static func string(path: Swift.String, contents: Swift.String) -> ProjectDescription.Template.Item - public static func file(path: Swift.String, templatePath: ProjectDescription.Path) -> ProjectDescription.Template.Item - public static func directory(path: Swift.String, sourcePath: ProjectDescription.Path) -> ProjectDescription.Template.Item -} -extension Swift.DefaultStringInterpolation { - public mutating func appendInterpolation(_ value: ProjectDescription.Template.Attribute) -} -public struct TemplateString : Swift.Encodable, Swift.Decodable, Swift.Equatable { - public static func == (a: ProjectDescription.TemplateString, b: ProjectDescription.TemplateString) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.TemplateString : Swift.ExpressibleByStringLiteral { - public init(stringLiteral: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -extension ProjectDescription.TemplateString : Swift.CustomStringConvertible { - public var description: Swift.String { - get - } -} -extension ProjectDescription.TemplateString : Swift.ExpressibleByStringInterpolation { - public init(stringInterpolation: ProjectDescription.TemplateString.StringInterpolation) - public struct StringInterpolation : Swift.StringInterpolationProtocol { - public init(literalCapacity _: Swift.Int, interpolationCount _: Swift.Int) - public mutating func appendLiteral(_ literal: Swift.String) - public mutating func appendInterpolation(_ token: ProjectDescription.TemplateString.Token) - public typealias StringLiteralType = Swift.String - } -} -extension ProjectDescription.TemplateString { - public enum Token : Swift.String, Swift.Equatable { - case projectName - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { - get - } - } -} -public struct TestAction : Swift.Equatable, Swift.Codable { - public let testPlans: [ProjectDescription.Path]? - public let targets: [ProjectDescription.TestableTarget] - public let arguments: ProjectDescription.Arguments? - public let configuration: ProjectDescription.ConfigurationName - public let attachDebugger: Swift.Bool - public let expandVariableFromTarget: ProjectDescription.TargetReference? - public let preActions: [ProjectDescription.ExecutionAction] - public let postActions: [ProjectDescription.ExecutionAction] - public let options: ProjectDescription.TestActionOptions - public let diagnosticsOptions: [ProjectDescription.SchemeDiagnosticsOption] - public static func targets(_ targets: [ProjectDescription.TestableTarget], arguments: ProjectDescription.Arguments? = nil, configuration: ProjectDescription.ConfigurationName = .debug, attachDebugger: Swift.Bool = true, expandVariableFromTarget: ProjectDescription.TargetReference? = nil, preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = [], options: ProjectDescription.TestActionOptions = .options(), diagnosticsOptions: [ProjectDescription.SchemeDiagnosticsOption] = [.mainThreadChecker]) -> ProjectDescription.TestAction - public static func testPlans(_ testPlans: [ProjectDescription.Path], configuration: ProjectDescription.ConfigurationName = .debug, attachDebugger: Swift.Bool = true, preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = []) -> ProjectDescription.TestAction - public static func == (a: ProjectDescription.TestAction, b: ProjectDescription.TestAction) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct TestActionOptions : Swift.Equatable, Swift.Codable { - public let language: ProjectDescription.SchemeLanguage? - public let region: Swift.String? - public let coverage: Swift.Bool - public let codeCoverageTargets: [ProjectDescription.TargetReference] - public static func options(language: ProjectDescription.SchemeLanguage? = nil, region: Swift.String? = nil, coverage: Swift.Bool = false, codeCoverageTargets: [ProjectDescription.TargetReference] = []) -> ProjectDescription.TestActionOptions - public static func == (a: ProjectDescription.TestActionOptions, b: ProjectDescription.TestActionOptions) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct TestableTarget : Swift.Equatable, Swift.Codable, Swift.ExpressibleByStringInterpolation { - public let target: ProjectDescription.TargetReference - public let isSkipped: Swift.Bool - public let isParallelizable: Swift.Bool - public let isRandomExecutionOrdering: Swift.Bool - public init(target: ProjectDescription.TargetReference, skipped: Swift.Bool = false, parallelizable: Swift.Bool = false, randomExecutionOrdering: Swift.Bool = false) - public init(stringLiteral value: Swift.String) - public static func == (a: ProjectDescription.TestableTarget, b: ProjectDescription.TestableTarget) -> Swift.Bool - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -public struct TestingOptions : Swift.OptionSet, Swift.Codable, Swift.Equatable { - public let rawValue: Swift.Int - public init(rawValue: Swift.Int) - public static let parallelizable: ProjectDescription.TestingOptions - public static let randomExecutionOrdering: ProjectDescription.TestingOptions - public typealias ArrayLiteralElement = ProjectDescription.TestingOptions - public typealias Element = ProjectDescription.TestingOptions - public typealias RawValue = Swift.Int -} -public struct Version : Swift.Hashable, Swift.Codable { - public let major: Swift.Int - public let minor: Swift.Int - public let patch: Swift.Int - public let prereleaseIdentifiers: [Swift.String] - public let buildMetadataIdentifiers: [Swift.String] - public init(_ major: Swift.Int, _ minor: Swift.Int, _ patch: Swift.Int, prereleaseIdentifiers: [Swift.String] = [], buildMetadataIdentifiers: [Swift.String] = []) - public static func == (a: ProjectDescription.Version, b: ProjectDescription.Version) -> Swift.Bool - public func hash(into hasher: inout Swift.Hasher) - public func encode(to encoder: Swift.Encoder) throws - public var hashValue: Swift.Int { - get - } - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.Version : Swift.Comparable { - public static func < (lhs: ProjectDescription.Version, rhs: ProjectDescription.Version) -> Swift.Bool -} -extension ProjectDescription.Version : Swift.CustomStringConvertible { - public var description: Swift.String { - get - } -} -extension ProjectDescription.Version { - public init?(string: Swift.String) -} -extension ProjectDescription.Version : Swift.ExpressibleByStringInterpolation { - public init(stringLiteral value: Swift.String) - public typealias ExtendedGraphemeClusterLiteralType = Swift.String - public typealias StringInterpolation = Swift.DefaultStringInterpolation - public typealias StringLiteralType = Swift.String - public typealias UnicodeScalarLiteralType = Swift.String -} -extension Swift.ClosedRange where Bound == ProjectDescription.Version { - public func contains(_: ProjectDescription.Version) -> Swift.Bool -} -extension Swift.Range where Bound == ProjectDescription.Version { - public func contains(_: ProjectDescription.Version) -> Swift.Bool -} -extension Swift.Range where Bound == ProjectDescription.Version { - public func contains(version: ProjectDescription.Version) -> Swift.Bool -} -public struct Workspace : Swift.Codable, Swift.Equatable { - public let name: Swift.String - public let projects: [ProjectDescription.Path] - public let schemes: [ProjectDescription.Scheme] - public let fileHeaderTemplate: ProjectDescription.FileHeaderTemplate? - public let additionalFiles: [ProjectDescription.FileElement] - public let generationOptions: ProjectDescription.Workspace.GenerationOptions - public init(name: Swift.String, projects: [ProjectDescription.Path], schemes: [ProjectDescription.Scheme] = [], fileHeaderTemplate: ProjectDescription.FileHeaderTemplate? = nil, additionalFiles: [ProjectDescription.FileElement] = [], generationOptions: ProjectDescription.Workspace.GenerationOptions = .options()) - public static func == (a: ProjectDescription.Workspace, b: ProjectDescription.Workspace) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws -} -extension ProjectDescription.Workspace { - public struct GenerationOptions : Swift.Codable, Swift.Equatable { - public enum AutogeneratedWorkspaceSchemes : Swift.Codable, Swift.Equatable { - public enum CodeCoverageMode : Swift.Codable, Swift.Equatable { - case all - case relevant - case targets([ProjectDescription.TargetReference]) - case disabled - public static func == (a: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes.CodeCoverageMode, b: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes.CodeCoverageMode) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - case disabled - case enabled(codeCoverageMode: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes.CodeCoverageMode = .disabled, testingOptions: ProjectDescription.TestingOptions = []) - public static func == (a: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes, b: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } - public let enableAutomaticXcodeSchemes: Swift.Bool? - public let autogeneratedWorkspaceSchemes: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes - public let lastXcodeUpgradeCheck: ProjectDescription.Version? - public let renderMarkdownReadme: Swift.Bool - public static func options(enableAutomaticXcodeSchemes: Swift.Bool? = false, autogeneratedWorkspaceSchemes: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes = .enabled(), lastXcodeUpgradeCheck: ProjectDescription.Version? = nil, renderMarkdownReadme: Swift.Bool = false) -> ProjectDescription.Workspace.GenerationOptions - public static func == (a: ProjectDescription.Workspace.GenerationOptions, b: ProjectDescription.Workspace.GenerationOptions) -> Swift.Bool - public func encode(to encoder: Swift.Encoder) throws - public init(from decoder: Swift.Decoder) throws - } -} -extension ProjectDescription.Cloud.Option : Swift.Hashable {} -extension ProjectDescription.Cloud.Option : Swift.RawRepresentable {} -extension ProjectDescription.CopyFilesAction.Destination : Swift.Hashable {} -extension ProjectDescription.CopyFilesAction.Destination : Swift.RawRepresentable {} -extension ProjectDescription.FileCodeGen : Swift.Hashable {} -extension ProjectDescription.FileCodeGen : Swift.RawRepresentable {} -extension ProjectDescription.Headers.AutomaticExclusionRule : Swift.Equatable {} -extension ProjectDescription.Headers.AutomaticExclusionRule : Swift.Hashable {} -extension ProjectDescription.Headers.AutomaticExclusionRule : Swift.RawRepresentable {} -extension ProjectDescription.Path.PathType : Swift.Equatable {} -extension ProjectDescription.Path.PathType : Swift.Hashable {} -extension ProjectDescription.Path.PathType : Swift.RawRepresentable {} -extension ProjectDescription.Platform : Swift.Hashable {} -extension ProjectDescription.Platform : Swift.RawRepresentable {} -extension ProjectDescription.Product : Swift.Hashable {} -extension ProjectDescription.Product : Swift.RawRepresentable {} -extension ProjectDescription.ResourceSynthesizer.Parser : Swift.Equatable {} -extension ProjectDescription.ResourceSynthesizer.Parser : Swift.Hashable {} -extension ProjectDescription.ResourceSynthesizer.Parser : Swift.RawRepresentable {} -extension ProjectDescription.RunActionOptions.GPUFrameCaptureMode : Swift.Hashable {} -extension ProjectDescription.RunActionOptions.GPUFrameCaptureMode : Swift.RawRepresentable {} -extension ProjectDescription.SchemeDiagnosticsOption : Swift.Hashable {} -extension ProjectDescription.SchemeDiagnosticsOption : Swift.RawRepresentable {} -extension ProjectDescription.Configuration.Variant : Swift.Equatable {} -extension ProjectDescription.Configuration.Variant : Swift.Hashable {} -extension ProjectDescription.Configuration.Variant : Swift.RawRepresentable {} -extension ProjectDescription.SwiftCompilationMode : Swift.Equatable {} -extension ProjectDescription.SwiftCompilationMode : Swift.Hashable {} -extension ProjectDescription.SwiftCompilationMode : Swift.RawRepresentable {} -extension ProjectDescription.DebugInformationFormat : Swift.Equatable {} -extension ProjectDescription.DebugInformationFormat : Swift.Hashable {} -extension ProjectDescription.DebugInformationFormat : Swift.RawRepresentable {} -extension ProjectDescription.SwiftOptimizationLevel : Swift.Equatable {} -extension ProjectDescription.SwiftOptimizationLevel : Swift.Hashable {} -extension ProjectDescription.SwiftOptimizationLevel : Swift.RawRepresentable {} -extension ProjectDescription.SDKStatus : Swift.RawRepresentable {} -extension ProjectDescription.SDKType : Swift.RawRepresentable {} -extension ProjectDescription.TargetScript.Order : Swift.Hashable {} -extension ProjectDescription.TargetScript.Order : Swift.RawRepresentable {} -extension ProjectDescription.TemplateString.Token : Swift.Hashable {} -extension ProjectDescription.TemplateString.Token : Swift.RawRepresentable {} diff --git a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/x86_64.swiftmodule b/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/x86_64.swiftmodule deleted file mode 100644 index edc5f9da2..000000000 Binary files a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/x86_64.swiftmodule and /dev/null differ diff --git a/.tuist-bin/ProjectDescription.framework/ProjectDescription b/.tuist-bin/ProjectDescription.framework/ProjectDescription deleted file mode 120000 index cc4e4e89d..000000000 --- a/.tuist-bin/ProjectDescription.framework/ProjectDescription +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/ProjectDescription \ No newline at end of file diff --git a/.tuist-bin/ProjectDescription.framework/Resources b/.tuist-bin/ProjectDescription.framework/Resources deleted file mode 120000 index 953ee36f3..000000000 --- a/.tuist-bin/ProjectDescription.framework/Resources +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/Resources \ No newline at end of file diff --git a/.tuist-bin/ProjectDescription.framework/Versions/A/ProjectDescription b/.tuist-bin/ProjectDescription.framework/Versions/A/ProjectDescription deleted file mode 100755 index 443b9b266..000000000 Binary files a/.tuist-bin/ProjectDescription.framework/Versions/A/ProjectDescription and /dev/null differ diff --git a/.tuist-bin/ProjectDescription.framework/Versions/A/Resources/Info.plist b/.tuist-bin/ProjectDescription.framework/Versions/A/Resources/Info.plist deleted file mode 100644 index 70c5199e0..000000000 --- a/.tuist-bin/ProjectDescription.framework/Versions/A/Resources/Info.plist +++ /dev/null @@ -1,46 +0,0 @@ - - - - - BuildMachineOSBuild - 20G817 - CFBundleDevelopmentRegion - en - CFBundleExecutable - ProjectDescription - CFBundleIdentifier - ProjectDescription - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ProjectDescription - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSupportedPlatforms - - MacOSX - - CFBundleVersion - 1 - DTCompiler - com.apple.compilers.llvm.clang.1_0 - DTPlatformBuild - 13A1030d - DTPlatformName - macosx - DTPlatformVersion - 12.0 - DTSDKBuild - 21A344 - DTSDKName - macosx12.0 - DTXcode - 1310 - DTXcodeBuild - 13A1030d - LSMinimumSystemVersion - 11.0 - - diff --git a/.tuist-bin/ProjectDescription.framework/Versions/Current b/.tuist-bin/ProjectDescription.framework/Versions/Current deleted file mode 120000 index 8c7e5a667..000000000 --- a/.tuist-bin/ProjectDescription.framework/Versions/Current +++ /dev/null @@ -1 +0,0 @@ -A \ No newline at end of file diff --git a/.tuist-bin/Templates/AppProject.stencil b/.tuist-bin/Templates/AppProject.stencil deleted file mode 100644 index 692ba5b54..000000000 --- a/.tuist-bin/Templates/AppProject.stencil +++ /dev/null @@ -1,29 +0,0 @@ -import ProjectDescription -import ProjectDescriptionHelpers -import MyPlugin - -/* - +-------------+ - | | - | App | Contains {{ name }} App target and {{ name }} unit-test target - | | - +------+-------------+-------+ - | depends on | - | | - +----v-----+ +-----v-----+ - | | | | - | Kit | | UI | Two independent frameworks to share code and start modularising your app - | | | | - +----------+ +-----------+ - - */ - -// MARK: - Project - -// Local plugin loaded -let localHelper = LocalHelper(name: "MyPlugin") - -// Creates our project using a helper function defined in ProjectDescriptionHelpers -let project = Project.app(name: "{{ name }}", - platform: .{{ platform }}, - additionalTargets: ["{{name}}Kit", "{{name}}UI"]) diff --git a/.tuist-bin/Templates/AppTests.stencil b/.tuist-bin/Templates/AppTests.stencil deleted file mode 100644 index fb7776aa5..000000000 --- a/.tuist-bin/Templates/AppTests.stencil +++ /dev/null @@ -1,8 +0,0 @@ -import Foundation -import XCTest - -final class {{ name }}Tests: XCTestCase { - func test_twoPlusTwo_isFour() { - XCTAssertEqual(2+2, 4) - } -} \ No newline at end of file diff --git a/.tuist-bin/Templates/Config.stencil b/.tuist-bin/Templates/Config.stencil deleted file mode 100644 index 66e92c6e0..000000000 --- a/.tuist-bin/Templates/Config.stencil +++ /dev/null @@ -1,7 +0,0 @@ -import ProjectDescription - -let config = Config( - plugins: [ - .local(path: .relativeToManifest("../../Plugins/{{ name }}")), - ] -) diff --git a/.tuist-bin/Templates/Gitignore.stencil b/.tuist-bin/Templates/Gitignore.stencil deleted file mode 100644 index 551a3f504..000000000 --- a/.tuist-bin/Templates/Gitignore.stencil +++ /dev/null @@ -1,70 +0,0 @@ -### macOS ### -# General -.DS_Store -.AppleDouble -.LSOverride - -# Icon must end with two -Icon - -# Thumbnails -._* - -# Files that might appear in the root of a volume -.DocumentRevisions-V100 -.fseventsd -.Spotlight-V100 -.TemporaryItems -.Trashes -.VolumeIcon.icns -.com.apple.timemachine.donotpresent - -# Directories potentially created on remote AFP share -.AppleDB -.AppleDesktop -Network Trash Folder -Temporary Items -.apdisk - -### Xcode ### -# Xcode -# -# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore - -## User settings -xcuserdata/ - -## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) -*.xcscmblueprint -*.xccheckout - -## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) -build/ -DerivedData/ -*.moved-aside -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 - -### Xcode Patch ### -*.xcodeproj/* -!*.xcodeproj/project.pbxproj -!*.xcodeproj/xcshareddata/ -!*.xcworkspace/contents.xcworkspacedata -/*.gcno - -### Projects ### -*.xcodeproj -*.xcworkspace - -### Tuist derived files ### -graph.dot -Derived/ - -### Tuist managed dependencies ### -Tuist/Dependencies diff --git a/.tuist-bin/Templates/KitSource.stencil b/.tuist-bin/Templates/KitSource.stencil deleted file mode 100644 index 89d02ef60..000000000 --- a/.tuist-bin/Templates/KitSource.stencil +++ /dev/null @@ -1,7 +0,0 @@ -import Foundation - -public final class {{ name }}Kit { - public static func hello() { - print("Hello, from your Kit framework") - } -} diff --git a/.tuist-bin/Templates/KitTests.stencil b/.tuist-bin/Templates/KitTests.stencil deleted file mode 100644 index c7cfa7789..000000000 --- a/.tuist-bin/Templates/KitTests.stencil +++ /dev/null @@ -1,8 +0,0 @@ -import Foundation -import XCTest - -final class {{ name }}KitTests: XCTestCase { - func test_example() { - XCTAssertEqual("{{ name }}Kit", "{{ name }}Kit") - } -} \ No newline at end of file diff --git a/.tuist-bin/Templates/LaunchScreen+macOS.stencil b/.tuist-bin/Templates/LaunchScreen+macOS.stencil deleted file mode 100644 index be1034ddd..000000000 --- a/.tuist-bin/Templates/LaunchScreen+macOS.stencil +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/.tuist-bin/Templates/LaunchScreen+tvOS.stencil b/.tuist-bin/Templates/LaunchScreen+tvOS.stencil deleted file mode 100644 index eadb1feac..000000000 --- a/.tuist-bin/Templates/LaunchScreen+tvOS.stencil +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/.tuist-bin/Templates/LocalHelper.stencil b/.tuist-bin/Templates/LocalHelper.stencil deleted file mode 100644 index 6f49a442d..000000000 --- a/.tuist-bin/Templates/LocalHelper.stencil +++ /dev/null @@ -1,9 +0,0 @@ -import Foundation - -public struct LocalHelper { - let name: String - - public init(name: String) { - self.name = name - } -} diff --git a/.tuist-bin/Templates/Package.stencil b/.tuist-bin/Templates/Package.stencil deleted file mode 100644 index 258c84c7c..000000000 --- a/.tuist-bin/Templates/Package.stencil +++ /dev/null @@ -1,15 +0,0 @@ -// swift-tools-version: 5.4 - -import PackageDescription - -let package = Package( - name: "MyPlugin", - products: [ - .executable(name: "tuist-my-cli", targets: ["tuist-my-cli"]), - ], - targets: [ - .executableTarget( - name: "tuist-my-cli" - ), - ] -) diff --git a/.tuist-bin/Templates/Package.swift b/.tuist-bin/Templates/Package.swift deleted file mode 100644 index 9f926b36a..000000000 --- a/.tuist-bin/Templates/Package.swift +++ /dev/null @@ -1 +0,0 @@ -import PackageDescription diff --git a/.tuist-bin/Templates/Plugin.stencil b/.tuist-bin/Templates/Plugin.stencil deleted file mode 100644 index 86a1e55b8..000000000 --- a/.tuist-bin/Templates/Plugin.stencil +++ /dev/null @@ -1,3 +0,0 @@ -import ProjectDescription - -let plugin = Plugin(name: "MyPlugin") \ No newline at end of file diff --git a/.tuist-bin/Templates/Project+Templates.stencil b/.tuist-bin/Templates/Project+Templates.stencil deleted file mode 100644 index 01b4ec00d..000000000 --- a/.tuist-bin/Templates/Project+Templates.stencil +++ /dev/null @@ -1,76 +0,0 @@ -import ProjectDescription - -/// Project helpers are functions that simplify the way you define your project. -/// Share code to create targets, settings, dependencies, -/// Create your own conventions, e.g: a func that makes sure all shared targets are "static frameworks" -/// See https://docs.tuist.io/guides/helpers/ - -extension Project { - /// Helper function to create the Project for this ExampleApp - public static func app(name: String, platform: Platform, additionalTargets: [String]) -> Project { - var targets = makeAppTargets(name: name, - platform: platform, - dependencies: additionalTargets.map { TargetDependency.target(name: $0) }) - targets += additionalTargets.flatMap({ makeFrameworkTargets(name: $0, platform: platform) }) - return Project(name: name, - organizationName: "tuist.io", - targets: targets) - } - - // MARK: - Private - - /// Helper function to create a framework target and an associated unit test target - private static func makeFrameworkTargets(name: String, platform: Platform) -> [Target] { - let sources = Target(name: name, - platform: platform, - product: .framework, - bundleId: "io.tuist.\(name)", - infoPlist: .default, - sources: ["Targets/\(name)/Sources/**"], - resources: [], - dependencies: []) - let tests = Target(name: "\(name)Tests", - platform: platform, - product: .unitTests, - bundleId: "io.tuist.\(name)Tests", - infoPlist: .default, - sources: ["Targets/\(name)/Tests/**"], - resources: [], - dependencies: [.target(name: name)]) - return [sources, tests] - } - - /// Helper function to create the application target and the unit test target. - private static func makeAppTargets(name: String, platform: Platform, dependencies: [TargetDependency]) -> [Target] { - let platform: Platform = platform - let infoPlist: [String: InfoPlist.Value] = [ - "CFBundleShortVersionString": "1.0", - "CFBundleVersion": "1", - {% if platform == "macOS" %}"NSMainStoryboardFile"{% else %}"UIMainStoryboardFile"{% endif %}: "", - "UILaunchStoryboardName": "LaunchScreen" - ] - - let mainTarget = Target( - name: name, - platform: platform, - product: .app, - bundleId: "io.tuist.\(name)", - infoPlist: .extendingDefault(with: infoPlist), - sources: ["Targets/\(name)/Sources/**"], - resources: ["Targets/\(name)/Resources/**"], - dependencies: dependencies - ) - - let testTarget = Target( - name: "\(name)Tests", - platform: platform, - product: .unitTests, - bundleId: "io.tuist.\(name)Tests", - infoPlist: .default, - sources: ["Targets/\(name)/Tests/**"], - dependencies: [ - .target(name: "\(name)") - ]) - return [mainTarget, testTarget] - } -} diff --git a/.tuist-bin/Templates/UISource.stencil b/.tuist-bin/Templates/UISource.stencil deleted file mode 100644 index 3fc2ac74a..000000000 --- a/.tuist-bin/Templates/UISource.stencil +++ /dev/null @@ -1,7 +0,0 @@ -import Foundation - -public final class {{ name }}UI { - public static func hello() { - print("Hello, from your UI framework") - } -} diff --git a/.tuist-bin/Templates/UITests.stencil b/.tuist-bin/Templates/UITests.stencil deleted file mode 100644 index 67c7bf615..000000000 --- a/.tuist-bin/Templates/UITests.stencil +++ /dev/null @@ -1,8 +0,0 @@ -import Foundation -import XCTest - -final class {{ name }}UITests: XCTestCase { - func test_example() { - XCTAssertEqual("{{ name }}UI", "{{ name }}UI") - } -} \ No newline at end of file diff --git a/.tuist-bin/Templates/default/AppDelegate.stencil b/.tuist-bin/Templates/default/AppDelegate.stencil deleted file mode 100644 index 99814119a..000000000 --- a/.tuist-bin/Templates/default/AppDelegate.stencil +++ /dev/null @@ -1,43 +0,0 @@ -{% if platform == "macOS" %}import Cocoa -import {{ name }}Kit -import {{ name }}UI - -@main -class AppDelegate: NSObject, NSApplicationDelegate { - - @IBOutlet weak var window: NSWindow! - - func applicationDidFinishLaunching(_ aNotification: Notification) { - // Insert code here to initialize your application - } - - func applicationWillTerminate(_ aNotification: Notification) { - // Insert code here to tear down your application - } - -}{% else %}import UIKit -import {{ name }}Kit -import {{ name }}UI - -@main -class AppDelegate: UIResponder, UIApplicationDelegate { - - var window: UIWindow? - - func application( - _ application: UIApplication, - didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil - ) -> Bool { - window = UIWindow(frame: UIScreen.main.bounds) - let viewController = UIViewController() - viewController.view.backgroundColor = .white - window?.rootViewController = viewController - window?.makeKeyAndVisible() - - {{ name }}Kit.hello() - {{ name }}UI.hello() - - return true - } - -}{% endif %} diff --git a/.tuist-bin/Templates/default/default.swift b/.tuist-bin/Templates/default/default.swift deleted file mode 100644 index e8da38ecc..000000000 --- a/.tuist-bin/Templates/default/default.swift +++ /dev/null @@ -1,83 +0,0 @@ -import ProjectDescription - -let nameAttribute: Template.Attribute = .required("name") -let platformAttribute: Template.Attribute = .optional("platform", default: "iOS") -let projectPath = "." -let appPath = "Targets/\(nameAttribute)" -let kitFrameworkPath = "Targets/\(nameAttribute)Kit" -let uiFrameworkPath = "Targets/\(nameAttribute)UI" -let taskPath = "Plugins/\(nameAttribute)" - -func templatePath(_ path: String) -> Path { - "../\(path)" -} - -let template = Template( - description: "Default template", - attributes: [ - nameAttribute, - platformAttribute, - ], - items: [ - .file( - path: "Tuist/ProjectDescriptionHelpers/Project+Templates.swift", - templatePath: templatePath("Project+Templates.stencil") - ), - .file( - path: projectPath + "/Project.swift", - templatePath: templatePath("AppProject.stencil") - ), - .file( - path: appPath + "/Sources/AppDelegate.swift", - templatePath: "AppDelegate.stencil" - ), - .file( - path: appPath + "/Resources/LaunchScreen.storyboard", - templatePath: templatePath("LaunchScreen+\(platformAttribute).stencil") - ), - .file( - path: appPath + "/Tests/AppTests.swift", - templatePath: templatePath("AppTests.stencil") - ), - .file( - path: kitFrameworkPath + "/Sources/\(nameAttribute)Kit.swift", - templatePath: templatePath("/KitSource.stencil") - ), - .file( - path: kitFrameworkPath + "/Tests/\(nameAttribute)KitTests.swift", - templatePath: templatePath("/KitTests.stencil") - ), - .file( - path: uiFrameworkPath + "/Sources/\(nameAttribute)UI.swift", - templatePath: templatePath("/UISource.stencil") - ), - .file( - path: uiFrameworkPath + "/Tests/\(nameAttribute)UITests.swift", - templatePath: templatePath("/UITests.stencil") - ), - .file( - path: taskPath + "/Sources/tuist-my-cli/main.swift", - templatePath: templatePath("/main.stencil") - ), - .file( - path: taskPath + "/ProjectDescriptionHelpers/LocalHelper.swift", - templatePath: templatePath("/LocalHelper.stencil") - ), - .file( - path: taskPath + "/Package.swift", - templatePath: templatePath("/Package.stencil") - ), - .file( - path: taskPath + "/Plugin.swift", - templatePath: templatePath("/Plugin.stencil") - ), - .file( - path: ".gitignore", - templatePath: templatePath("Gitignore.stencil") - ), - .file( - path: "Tuist/Config.swift", - templatePath: templatePath("Config.stencil") - ), - ] -) diff --git a/.tuist-bin/Templates/main.stencil b/.tuist-bin/Templates/main.stencil deleted file mode 100644 index 6f059694c..000000000 --- a/.tuist-bin/Templates/main.stencil +++ /dev/null @@ -1 +0,0 @@ -print("Hello, from your Tuist Task") \ No newline at end of file diff --git a/.tuist-bin/Templates/swiftui/ContentView.stencil b/.tuist-bin/Templates/swiftui/ContentView.stencil deleted file mode 100644 index fc75cd1f4..000000000 --- a/.tuist-bin/Templates/swiftui/ContentView.stencil +++ /dev/null @@ -1,17 +0,0 @@ -import SwiftUI - -public struct ContentView: View { - public init() {} - - public var body: some View { - Text("Hello, World!") - .padding() - } -} - - -struct ContentView_Previews: PreviewProvider { - static var previews: some View { - ContentView() - } -} diff --git a/.tuist-bin/Templates/swiftui/app.stencil b/.tuist-bin/Templates/swiftui/app.stencil deleted file mode 100644 index be85e855a..000000000 --- a/.tuist-bin/Templates/swiftui/app.stencil +++ /dev/null @@ -1,11 +0,0 @@ -import SwiftUI -import {{ name }}UI - -@main -struct {{ name }}App: App { - var body: some Scene { - WindowGroup { - ContentView() - } - } -} diff --git a/.tuist-bin/Templates/swiftui/ios/Assets.xcassets/AccentColor.colorset/Contents.json b/.tuist-bin/Templates/swiftui/ios/Assets.xcassets/AccentColor.colorset/Contents.json deleted file mode 100644 index eb8789700..000000000 --- a/.tuist-bin/Templates/swiftui/ios/Assets.xcassets/AccentColor.colorset/Contents.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "colors" : [ - { - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/.tuist-bin/Templates/swiftui/ios/Assets.xcassets/AppIcon.appiconset/Contents.json b/.tuist-bin/Templates/swiftui/ios/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 9221b9bb1..000000000 --- a/.tuist-bin/Templates/swiftui/ios/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,98 +0,0 @@ -{ - "images" : [ - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "20x20" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "20x20" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "29x29" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "29x29" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "40x40" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "40x40" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "60x60" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "60x60" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "20x20" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "20x20" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "29x29" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "29x29" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "40x40" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "40x40" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "76x76" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "76x76" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "83.5x83.5" - }, - { - "idiom" : "ios-marketing", - "scale" : "1x", - "size" : "1024x1024" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/.tuist-bin/Templates/swiftui/macos/Assets.xcassets/AccentColor.colorset/Contents.json b/.tuist-bin/Templates/swiftui/macos/Assets.xcassets/AccentColor.colorset/Contents.json deleted file mode 100644 index eb8789700..000000000 --- a/.tuist-bin/Templates/swiftui/macos/Assets.xcassets/AccentColor.colorset/Contents.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "colors" : [ - { - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/.tuist-bin/Templates/swiftui/macos/Assets.xcassets/AppIcon.appiconset/Contents.json b/.tuist-bin/Templates/swiftui/macos/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 3f00db43e..000000000 --- a/.tuist-bin/Templates/swiftui/macos/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "images" : [ - { - "idiom" : "mac", - "scale" : "1x", - "size" : "16x16" - }, - { - "idiom" : "mac", - "scale" : "2x", - "size" : "16x16" - }, - { - "idiom" : "mac", - "scale" : "1x", - "size" : "32x32" - }, - { - "idiom" : "mac", - "scale" : "2x", - "size" : "32x32" - }, - { - "idiom" : "mac", - "scale" : "1x", - "size" : "128x128" - }, - { - "idiom" : "mac", - "scale" : "2x", - "size" : "128x128" - }, - { - "idiom" : "mac", - "scale" : "1x", - "size" : "256x256" - }, - { - "idiom" : "mac", - "scale" : "2x", - "size" : "256x256" - }, - { - "idiom" : "mac", - "scale" : "1x", - "size" : "512x512" - }, - { - "idiom" : "mac", - "scale" : "2x", - "size" : "512x512" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/.tuist-bin/Templates/swiftui/swiftui.swift b/.tuist-bin/Templates/swiftui/swiftui.swift deleted file mode 100644 index a1f937a4d..000000000 --- a/.tuist-bin/Templates/swiftui/swiftui.swift +++ /dev/null @@ -1,87 +0,0 @@ -import ProjectDescription - -let nameAttribute: Template.Attribute = .required("name") -let platformAttribute: Template.Attribute = .optional("platform", default: "iOS") -let projectPath = "." -let appPath = "Targets/\(nameAttribute)" -let kitFrameworkPath = "Targets/\(nameAttribute)Kit" -let uiFrameworkPath = "Targets/\(nameAttribute)UI" -let taskPath = "Plugins/\(nameAttribute)" - -func templatePath(_ path: String) -> Path { - "../\(path)" -} - -let template = Template( - description: "SwiftUI template", - attributes: [ - nameAttribute, - platformAttribute, - ], - items: [ - .file( - path: "Tuist/ProjectDescriptionHelpers/Project+Templates.swift", - templatePath: templatePath("Project+Templates.stencil") - ), - .file( - path: projectPath + "/Project.swift", - templatePath: templatePath("AppProject.stencil") - ), - .file( - path: appPath + "/Sources/\(nameAttribute)App.swift", - templatePath: "app.stencil" - ), - .file( - path: uiFrameworkPath + "/Sources/ContentView.swift", - templatePath: "ContentView.stencil" - ), - .directory( - path: appPath + "/Resources", - sourcePath: "\(platformAttribute)/Assets.xcassets" - ), - .directory( - path: appPath + "/Resources", - sourcePath: "Preview Content" - ), - .file( - path: appPath + "/Tests/\(nameAttribute)Tests.swift", - templatePath: templatePath("AppTests.stencil") - ), - .file( - path: kitFrameworkPath + "/Sources/\(nameAttribute)Kit.swift", - templatePath: templatePath("KitSource.stencil") - ), - .file( - path: kitFrameworkPath + "/Tests/\(nameAttribute)KitTests.swift", - templatePath: templatePath("/KitTests.stencil") - ), - .file( - path: uiFrameworkPath + "/Tests/\(nameAttribute)UITests.swift", - templatePath: templatePath("/UITests.stencil") - ), - .file( - path: taskPath + "/Sources/tuist-my-cli/main.swift", - templatePath: templatePath("/main.stencil") - ), - .file( - path: taskPath + "/ProjectDescriptionHelpers/LocalHelper.swift", - templatePath: templatePath("/LocalHelper.stencil") - ), - .file( - path: taskPath + "/Package.swift", - templatePath: templatePath("/Package.stencil") - ), - .file( - path: taskPath + "/Plugin.swift", - templatePath: templatePath("/Plugin.stencil") - ), - .file( - path: ".gitignore", - templatePath: templatePath("Gitignore.stencil") - ), - .file( - path: "Tuist/Config.swift", - templatePath: templatePath("Config.stencil") - ), - ] -) diff --git a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/AccentColor.colorset/Contents.json b/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/AccentColor.colorset/Contents.json deleted file mode 100644 index eb8789700..000000000 --- a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/AccentColor.colorset/Contents.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "colors" : [ - { - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Content.imageset/Contents.json b/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Content.imageset/Contents.json deleted file mode 100644 index 2e003356c..000000000 --- a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Content.imageset/Contents.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "images" : [ - { - "idiom" : "tv" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Contents.json b/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Contents.json deleted file mode 100644 index de59d885a..000000000 --- a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Contents.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - }, - "layers" : [ - { - "filename" : "Front.imagestacklayer" - }, - { - "filename" : "Middle.imagestacklayer" - }, - { - "filename" : "Back.imagestacklayer" - } - ] -} diff --git a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Content.imageset/Contents.json b/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Content.imageset/Contents.json deleted file mode 100644 index 2e003356c..000000000 --- a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Content.imageset/Contents.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "images" : [ - { - "idiom" : "tv" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json b/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json deleted file mode 100644 index 2e003356c..000000000 --- a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "images" : [ - { - "idiom" : "tv" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/Contents.json b/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/Contents.json deleted file mode 100644 index 795cce172..000000000 --- a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/Contents.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "images" : [ - { - "idiom" : "tv", - "scale" : "1x" - }, - { - "idiom" : "tv", - "scale" : "2x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Contents.json b/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Contents.json deleted file mode 100644 index de59d885a..000000000 --- a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Contents.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - }, - "layers" : [ - { - "filename" : "Front.imagestacklayer" - }, - { - "filename" : "Middle.imagestacklayer" - }, - { - "filename" : "Back.imagestacklayer" - } - ] -} diff --git a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/Contents.json b/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/Contents.json deleted file mode 100644 index 795cce172..000000000 --- a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/Contents.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "images" : [ - { - "idiom" : "tv", - "scale" : "1x" - }, - { - "idiom" : "tv", - "scale" : "2x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json b/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json deleted file mode 100644 index 795cce172..000000000 --- a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "images" : [ - { - "idiom" : "tv", - "scale" : "1x" - }, - { - "idiom" : "tv", - "scale" : "2x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json b/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json deleted file mode 100644 index f47ba43da..000000000 --- a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "assets" : [ - { - "filename" : "App Icon - App Store.imagestack", - "idiom" : "tv", - "role" : "primary-app-icon", - "size" : "1280x768" - }, - { - "filename" : "App Icon.imagestack", - "idiom" : "tv", - "role" : "primary-app-icon", - "size" : "400x240" - }, - { - "filename" : "Top Shelf Image Wide.imageset", - "idiom" : "tv", - "role" : "top-shelf-image-wide", - "size" : "2320x720" - }, - { - "filename" : "Top Shelf Image.imageset", - "idiom" : "tv", - "role" : "top-shelf-image", - "size" : "1920x720" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json b/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json deleted file mode 100644 index b65f0cddc..000000000 --- a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "images" : [ - { - "idiom" : "tv", - "scale" : "1x" - }, - { - "idiom" : "tv", - "scale" : "2x" - }, - { - "idiom" : "tv-marketing", - "scale" : "1x" - }, - { - "idiom" : "tv-marketing", - "scale" : "2x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json b/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json deleted file mode 100644 index b65f0cddc..000000000 --- a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "images" : [ - { - "idiom" : "tv", - "scale" : "1x" - }, - { - "idiom" : "tv", - "scale" : "2x" - }, - { - "idiom" : "tv-marketing", - "scale" : "1x" - }, - { - "idiom" : "tv-marketing", - "scale" : "2x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/.tuist-bin/libswift_Concurrency.dylib b/.tuist-bin/libswift_Concurrency.dylib deleted file mode 100755 index 3f83cb528..000000000 Binary files a/.tuist-bin/libswift_Concurrency.dylib and /dev/null differ diff --git a/.tuist-bin/tuist b/.tuist-bin/tuist deleted file mode 100755 index 956546a7b..000000000 Binary files a/.tuist-bin/tuist and /dev/null differ diff --git a/.tuist-bin/vendor/xcbeautify/LICENSE b/.tuist-bin/vendor/xcbeautify/LICENSE deleted file mode 100644 index c4bde3ebd..000000000 --- a/.tuist-bin/vendor/xcbeautify/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2018 Thi Doãn - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/.tuist-bin/vendor/xcbeautify/xcbeautify b/.tuist-bin/vendor/xcbeautify/xcbeautify deleted file mode 100755 index 43b0681c0..000000000 Binary files a/.tuist-bin/vendor/xcbeautify/xcbeautify and /dev/null differ diff --git a/.tuist-version b/.tuist-version deleted file mode 100644 index 87dbaa157..000000000 --- a/.tuist-version +++ /dev/null @@ -1 +0,0 @@ -3.12.0 \ No newline at end of file diff --git a/Cartfile b/Cartfile new file mode 100644 index 000000000..5d46d42f6 --- /dev/null +++ b/Cartfile @@ -0,0 +1 @@ +github "realm/realm-swift" == 10.50.1 diff --git a/Cartfile.resolved b/Cartfile.resolved new file mode 100644 index 000000000..ae7b2097e --- /dev/null +++ b/Cartfile.resolved @@ -0,0 +1 @@ +github "realm/realm-swift" "v10.50.1" diff --git a/Makefile b/Makefile index 5da24e775..e7fcf892a 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,17 @@ generate: - tuist fetch - TUIST_DEV=1 TUIST_ROOT_DIR=${PWD} tuist generate + make install + TUIST_ENV=DEV TUIST_ROOT_DIR=${PWD} tuist generate + +install: + carthage update --use-xcframeworks + tuist install + +test: + TUIST_ENV=CI TUIST_ROOT_DIR=${PWD} tuist test --platform ios + +deploy: + make install + TUIST_ENV=CD TUIST_ROOT_DIR=${PWD} tuist generate clean: rm -rf **/*.xcodeproj @@ -12,4 +23,17 @@ reset: rm -rf *.xcworkspace feature: + echo "\033[0;31m이 명령어는 deprecated 되었습니다. 'make module'을 사용해주세요! \033[0m" python3 Scripts/generate_new_feature.py + +pg: + swift Scripts/GeneratePlugin.swift + +module: + swift Scripts/GenerateModule.swift + +setup: + sh Scripts/Setup.sh + +format: + swiftformat ./Projects --config .swiftformat diff --git a/Package.resolved b/Package.resolved new file mode 100644 index 000000000..39238e883 --- /dev/null +++ b/Package.resolved @@ -0,0 +1,374 @@ +{ + "pins" : [ + { + "identity" : "abseil-cpp-binary", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/abseil-cpp-binary.git", + "state" : { + "revision" : "748c7837511d0e6a507737353af268484e1745e2", + "version" : "1.2024011601.1" + } + }, + { + "identity" : "alamofire", + "kind" : "remoteSourceControl", + "location" : "https://github.com/Alamofire/Alamofire.git", + "state" : { + "revision" : "f455c2975872ccd2d9c81594c658af65716e9b9a", + "version" : "5.9.1" + } + }, + { + "identity" : "app-check", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/app-check.git", + "state" : { + "revision" : "7d2688de038d5484866d835acb47b379722d610e", + "version" : "10.19.0" + } + }, + { + "identity" : "cryptoswift", + "kind" : "remoteSourceControl", + "location" : "https://github.com/krzyzanowskim/CryptoSwift.git", + "state" : { + "revision" : "c9c3df6ab812de32bae61fc0cd1bf6d45170ebf0", + "version" : "1.8.2" + } + }, + { + "identity" : "cwlcatchexception", + "kind" : "remoteSourceControl", + "location" : "https://github.com/mattgallagher/CwlCatchException.git", + "state" : { + "revision" : "3ef6999c73b6938cc0da422f2c912d0158abb0a0", + "version" : "2.2.0" + } + }, + { + "identity" : "cwlpreconditiontesting", + "kind" : "remoteSourceControl", + "location" : "https://github.com/mattgallagher/CwlPreconditionTesting.git", + "state" : { + "revision" : "2ef56b2caf25f55fa7eef8784c30d5a767550f54", + "version" : "2.2.1" + } + }, + { + "identity" : "firebase-ios-sdk", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/firebase-ios-sdk.git", + "state" : { + "revision" : "97940381e57703c07f31a8058d8f39ec53b7c272", + "version" : "10.25.0" + } + }, + { + "identity" : "fittedsheets", + "kind" : "remoteSourceControl", + "location" : "https://github.com/gordontucker/FittedSheets.git", + "state" : { + "revision" : "5d7f5a6307ad510aa05de5a4a16ac40846d3b2d3", + "version" : "2.6.1" + } + }, + { + "identity" : "googleappmeasurement", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleAppMeasurement.git", + "state" : { + "revision" : "16244d177c4e989f87b25e9db1012b382cfedc55", + "version" : "10.25.0" + } + }, + { + "identity" : "googledatatransport", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleDataTransport.git", + "state" : { + "revision" : "a637d318ae7ae246b02d7305121275bc75ed5565", + "version" : "9.4.0" + } + }, + { + "identity" : "googleutilities", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleUtilities.git", + "state" : { + "revision" : "57a1d307f42df690fdef2637f3e5b776da02aad6", + "version" : "7.13.3" + } + }, + { + "identity" : "grpc-binary", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/grpc-binary.git", + "state" : { + "revision" : "e9fad491d0673bdda7063a0341fb6b47a30c5359", + "version" : "1.62.2" + } + }, + { + "identity" : "gtm-session-fetcher", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/gtm-session-fetcher.git", + "state" : { + "revision" : "0382ca27f22fb3494cf657d8dc356dc282cd1193", + "version" : "3.4.1" + } + }, + { + "identity" : "inject", + "kind" : "remoteSourceControl", + "location" : "https://github.com/krzysztofzablocki/Inject.git", + "state" : { + "revision" : "838e614220000a563bbaeba2974236f2c2c51e13", + "version" : "1.5.0" + } + }, + { + "identity" : "interop-ios-for-google-sdks", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/interop-ios-for-google-sdks.git", + "state" : { + "revision" : "2d12673670417654f08f5f90fdd62926dc3a2648", + "version" : "100.0.0" + } + }, + { + "identity" : "kingfisher", + "kind" : "remoteSourceControl", + "location" : "https://github.com/onevcat/Kingfisher.git", + "state" : { + "revision" : "5b92f029fab2cce44386d28588098b5be0824ef5", + "version" : "7.11.0" + } + }, + { + "identity" : "leveldb", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/leveldb.git", + "state" : { + "revision" : "a0bc79961d7be727d258d33d5a6b2f1023270ba1", + "version" : "1.22.5" + } + }, + { + "identity" : "lottie-ios", + "kind" : "remoteSourceControl", + "location" : "https://github.com/airbnb/lottie-ios.git", + "state" : { + "revision" : "769b88d83a42ca8d5572b020c96f47e3690b3796", + "version" : "4.4.3" + } + }, + { + "identity" : "marqueelabel", + "kind" : "remoteSourceControl", + "location" : "https://github.com/cbpowell/MarqueeLabel.git", + "state" : { + "revision" : "877e810534cda9afabb8143ae319b7c3341b121b", + "version" : "4.5.0" + } + }, + { + "identity" : "moya", + "kind" : "remoteSourceControl", + "location" : "https://github.com/Moya/Moya.git", + "state" : { + "revision" : "c263811c1f3dbf002be9bd83107f7cdc38992b26", + "version" : "15.0.3" + } + }, + { + "identity" : "nanopb", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/nanopb.git", + "state" : { + "revision" : "b7e1104502eca3a213b46303391ca4d3bc8ddec1", + "version" : "2.30910.0" + } + }, + { + "identity" : "naveridlogin-sdk-ios", + "kind" : "remoteSourceControl", + "location" : "https://github.com/naver/naveridlogin-sdk-ios.git", + "state" : { + "branch" : "master", + "revision" : "d8d2128b8bcef8cd93068a058ea898d6dbb7d486" + } + }, + { + "identity" : "needle", + "kind" : "remoteSourceControl", + "location" : "https://github.com/uber/needle.git", + "state" : { + "revision" : "6db73ae873952794b94fd6bb5111554e23c160af", + "version" : "0.24.0" + } + }, + { + "identity" : "nimble", + "kind" : "remoteSourceControl", + "location" : "https://github.com/Quick/Nimble.git", + "state" : { + "revision" : "1c49fc1243018f81a7ea99cb5e0985b00096e9f4", + "version" : "13.3.0" + } + }, + { + "identity" : "nvactivityindicatorview", + "kind" : "remoteSourceControl", + "location" : "https://github.com/ninjaprox/NVActivityIndicatorView.git", + "state" : { + "revision" : "121455c4e630fcb95aaefd7e4257b0c2e3cfe6d5", + "version" : "5.2.0" + } + }, + { + "identity" : "pageboy", + "kind" : "remoteSourceControl", + "location" : "https://github.com/uias/Pageboy", + "state" : { + "revision" : "be0c1f6f1964cfb07f9d819b0863f2c3f255f612", + "version" : "4.2.0" + } + }, + { + "identity" : "promises", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/promises.git", + "state" : { + "revision" : "540318ecedd63d883069ae7f1ed811a2df00b6ac", + "version" : "2.4.0" + } + }, + { + "identity" : "quick", + "kind" : "remoteSourceControl", + "location" : "https://github.com/Quick/Quick.git", + "state" : { + "revision" : "26529ff2209c40ae50fd642b031f930d9d68ea02", + "version" : "7.5.0" + } + }, + { + "identity" : "reachability.swift", + "kind" : "remoteSourceControl", + "location" : "https://github.com/ashleymills/Reachability.swift", + "state" : { + "revision" : "57da4b1270cab7c2228919eabc0e4e1bf93e48ea", + "version" : "5.2.2" + } + }, + { + "identity" : "reactiveswift", + "kind" : "remoteSourceControl", + "location" : "https://github.com/ReactiveCocoa/ReactiveSwift.git", + "state" : { + "revision" : "c43bae3dac73fdd3cb906bd5a1914686ca71ed3c", + "version" : "6.7.0" + } + }, + { + "identity" : "reactorkit", + "kind" : "remoteSourceControl", + "location" : "https://github.com/ReactorKit/ReactorKit.git", + "state" : { + "revision" : "8fa33f09c6f6621a2aa536d739956d53b84dd139", + "version" : "3.2.0" + } + }, + { + "identity" : "rxdatasources", + "kind" : "remoteSourceControl", + "location" : "https://github.com/RxSwiftCommunity/RxDataSources.git", + "state" : { + "revision" : "90c29b48b628479097fe775ed1966d75ac374518", + "version" : "5.0.2" + } + }, + { + "identity" : "rxgesture", + "kind" : "remoteSourceControl", + "location" : "https://github.com/RxSwiftCommunity/RxGesture.git", + "state" : { + "revision" : "1b137c576b4aaaab949235752278956697c9e4a0", + "version" : "4.0.4" + } + }, + { + "identity" : "rxkeyboard", + "kind" : "remoteSourceControl", + "location" : "https://github.com/RxSwiftCommunity/RxKeyboard.git", + "state" : { + "revision" : "63f6377975c962a1d89f012a6f1e5bebb2c502b7", + "version" : "2.0.1" + } + }, + { + "identity" : "rxswift", + "kind" : "remoteSourceControl", + "location" : "https://github.com/ReactiveX/RxSwift.git", + "state" : { + "revision" : "b06a8c8596e4c3e8e7788e08e720e3248563ce6a", + "version" : "6.7.1" + } + }, + { + "identity" : "snapkit", + "kind" : "remoteSourceControl", + "location" : "https://github.com/SnapKit/SnapKit.git", + "state" : { + "revision" : "2842e6e84e82eb9a8dac0100ca90d9444b0307f4", + "version" : "5.7.1" + } + }, + { + "identity" : "swift-protobuf", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-protobuf.git", + "state" : { + "revision" : "9f0c76544701845ad98716f3f6a774a892152bcb", + "version" : "1.26.0" + } + }, + { + "identity" : "swiftentrykit", + "kind" : "remoteSourceControl", + "location" : "https://github.com/huri000/SwiftEntryKit", + "state" : { + "revision" : "5ad36cccf0c4b9fea32f4e9b17a8e38f07563ef0", + "version" : "2.0.0" + } + }, + { + "identity" : "tabman", + "kind" : "remoteSourceControl", + "location" : "https://github.com/uias/Tabman.git", + "state" : { + "revision" : "3b2213290eb93e55bb50b49d1a179033005c11ab", + "version" : "3.2.0" + } + }, + { + "identity" : "then", + "kind" : "remoteSourceControl", + "location" : "https://github.com/devxoul/Then", + "state" : { + "revision" : "d41ef523faef0f911369f79c0b96815d9dbb6d7a", + "version" : "3.0.0" + } + }, + { + "identity" : "weakmaptable", + "kind" : "remoteSourceControl", + "location" : "https://github.com/ReactorKit/WeakMapTable.git", + "state" : { + "revision" : "cb05d64cef2bbf51e85c53adee937df46540a74e", + "version" : "1.2.1" + } + } + ], + "version" : 2 +} diff --git a/Package.swift b/Package.swift new file mode 100644 index 000000000..1e7a5772c --- /dev/null +++ b/Package.swift @@ -0,0 +1,48 @@ +// swift-tools-version: 5.9 + +import PackageDescription + +#if TUIST +import ProjectDescription +import ProjectDescriptionHelpers + +let packageSetting = PackageSettings( + productTypes: [:], + baseSettings: .settings( + configurations: [ + .debug(name: .debug), + .debug(name: .qa), + .release(name: .release) + ] + ) +) +#endif + +let package = Package( + name: "WaktaverseMusicPackage", + dependencies: [ + .package(url: "https://github.com/Moya/Moya.git", from: "15.0.3"), + .package(url: "https://github.com/onevcat/Kingfisher.git", from: "7.11.0"), + .package(url: "https://github.com/gordontucker/FittedSheets.git", from: "2.6.1"), + .package(url: "https://github.com/ReactiveX/RxSwift.git",from: "6.7.1"), + .package(url: "https://github.com/devxoul/Then", from: "3.0.0"), + .package(url: "https://github.com/SnapKit/SnapKit.git", from: "5.7.1"), + .package(url: "https://github.com/ashleymills/Reachability.swift", from: "5.2.1"), + .package(url: "https://github.com/airbnb/lottie-ios.git", from: "4.4.3"), + .package(url: "https://github.com/uber/needle.git", from: "0.24.0"), + .package(url: "https://github.com/uias/Tabman.git", from: "3.2.0"), + .package(url: "https://github.com/RxSwiftCommunity/RxDataSources.git", from: "5.0.2"), + .package(url: "https://github.com/RxSwiftCommunity/RxKeyboard.git", from: "2.0.1"), + .package(url: "https://github.com/huri000/SwiftEntryKit", from: "2.0.0"), + .package(url: "https://github.com/naver/naveridlogin-sdk-ios.git", branch: "master"), + .package(url: "https://github.com/krzyzanowskim/CryptoSwift.git", from: "1.8.2"), + .package(url: "https://github.com/cbpowell/MarqueeLabel.git", from: "4.5.0"), + .package(url: "https://github.com/firebase/firebase-ios-sdk.git", from: "10.25.0"), + .package(url: "https://github.com/ninjaprox/NVActivityIndicatorView.git", from: "5.2.0"), + .package(url: "https://github.com/ReactorKit/ReactorKit.git", from: "3.2.0"), + .package(url: "https://github.com/Quick/Quick.git", from: "7.5.0"), + .package(url: "https://github.com/Quick/Nimble.git", from: "13.3.0"), + .package(url: "https://github.com/krzysztofzablocki/Inject.git", from: "1.5.0"), + .package(url: "https://github.com/RxSwiftCommunity/RxGesture.git", from: "4.0.4") + ] +) diff --git a/Plugin/ConfigurationPlugin/Plugin.swift b/Plugin/ConfigurationPlugin/Plugin.swift new file mode 100644 index 000000000..e42bddc80 --- /dev/null +++ b/Plugin/ConfigurationPlugin/Plugin.swift @@ -0,0 +1,3 @@ +import ProjectDescription + +let configurationPlugin = Plugin(name: "ConfigurationPlugin") diff --git a/Plugin/ConfigurationPlugin/ProjectDescriptionHelpers/Configuration+Ext.swift b/Plugin/ConfigurationPlugin/ProjectDescriptionHelpers/Configuration+Ext.swift new file mode 100644 index 000000000..96724758f --- /dev/null +++ b/Plugin/ConfigurationPlugin/ProjectDescriptionHelpers/Configuration+Ext.swift @@ -0,0 +1,13 @@ +import ProjectDescription + +public extension Array where Element == Configuration { + static let `default`: [Configuration] = [ + .debug(name: .debug, xcconfig: .relativeToRoot("Projects/App/XCConfig/Secrets.xcconfig")), + .debug(name: .qa, xcconfig: .relativeToRoot("Projects/App/XCConfig/Secrets.xcconfig")), + .release(name: .release, xcconfig: .relativeToRoot("Projects/App/XCConfig/Secrets.xcconfig")) + ] +} + +public extension ProjectDescription.ConfigurationName { + static let qa = ConfigurationName.configuration("QA") +} diff --git a/Plugin/DependencyPlugin/Plugin.swift b/Plugin/DependencyPlugin/Plugin.swift new file mode 100644 index 000000000..16e44d2f9 --- /dev/null +++ b/Plugin/DependencyPlugin/Plugin.swift @@ -0,0 +1,3 @@ +import ProjectDescription + +let dependencyPlugin = Plugin(name: "DependencyPlugin") diff --git a/Plugin/DependencyPlugin/ProjectDescriptionHelpers/Dependency+Carthage.swift b/Plugin/DependencyPlugin/ProjectDescriptionHelpers/Dependency+Carthage.swift new file mode 100644 index 000000000..3680231db --- /dev/null +++ b/Plugin/DependencyPlugin/ProjectDescriptionHelpers/Dependency+Carthage.swift @@ -0,0 +1,10 @@ +import ProjectDescription + +public extension TargetDependency { + struct Carthage {} +} + +public extension TargetDependency.Carthage { + static let Realm = TargetDependency.external(name: "Realm") + static let RealmSwift = TargetDependency.external(name: "RealmSwift") +} diff --git a/Plugin/DependencyPlugin/ProjectDescriptionHelpers/Dependency+Project.swift b/Plugin/DependencyPlugin/ProjectDescriptionHelpers/Dependency+Project.swift new file mode 100644 index 000000000..6c3a848de --- /dev/null +++ b/Plugin/DependencyPlugin/ProjectDescriptionHelpers/Dependency+Project.swift @@ -0,0 +1,11 @@ +import ProjectDescription + +public extension TargetDependency { + struct Project { + public struct Features {} + public struct Module {} + public struct Service {} + public struct UserInterfaces {} + } +} + diff --git a/Plugin/DependencyPlugin/ProjectDescriptionHelpers/Dependency+SPM.swift b/Plugin/DependencyPlugin/ProjectDescriptionHelpers/Dependency+SPM.swift new file mode 100644 index 000000000..adaef7b5a --- /dev/null +++ b/Plugin/DependencyPlugin/ProjectDescriptionHelpers/Dependency+SPM.swift @@ -0,0 +1,38 @@ +import ProjectDescription + +public extension TargetDependency { + struct SPM {} +} + +public extension TargetDependency.SPM { + // MARK: External + static let Moya = TargetDependency.external(name: "Moya") + static let RxMoya = TargetDependency.external(name: "RxMoya") + static let FittedSheets = TargetDependency.external(name: "FittedSheets") + static let RxSwift = TargetDependency.external(name: "RxSwift") + static let RxCocoa = TargetDependency.external(name: "RxCocoa") + static let Kingfisher = TargetDependency.external(name: "Kingfisher") + static let Then = TargetDependency.external(name: "Then") + static let SnapKit = TargetDependency.external(name: "SnapKit") + static let ReachabilitySwift = TargetDependency.external(name: "ReachabilitySwift") + static let Lottie = TargetDependency.external(name: "Lottie") + static let Needle = TargetDependency.external(name: "NeedleFoundation") + static let Tabman = TargetDependency.external(name: "Tabman") + static let RxDataSources = TargetDependency.external(name: "RxDataSources") + static let RxKeyboard = TargetDependency.external(name: "RxKeyboard") + static let SwiftEntryKit = TargetDependency.external(name: "SwiftEntryKit") + static let NaverLogin = TargetDependency.external(name: "NaverThirdPartyLogin") + static let CryptoSwift = TargetDependency.external(name: "CryptoSwift") + static let MarqueeLabel = TargetDependency.external(name: "MarqueeLabel") + static let FirebaseAnalytics = TargetDependency.external(name: "FirebaseAnalyticsWithoutAdIdSupport") + static let FirebaseCrashlytics = TargetDependency.external(name: "FirebaseCrashlytics") + static let FirebaseMessaging = TargetDependency.external(name: "FirebaseMessaging") + static let NVActivityIndicatorView = TargetDependency.external(name: "NVActivityIndicatorView") + static let ReactorKit = TargetDependency.external(name: "ReactorKit") + static let Quick = TargetDependency.external(name: "Quick") + static let Nimble = TargetDependency.external(name: "Nimble") + static let Inject = TargetDependency.external(name: "Inject") + static let Realm = TargetDependency.external(name: "Realm") + static let RealmSwift = TargetDependency.external(name: "RealmSwift") + static let RxGesture = TargetDependency.external(name: "RxGesture") +} diff --git a/Plugin/DependencyPlugin/ProjectDescriptionHelpers/Dependency+XCFramework.swift b/Plugin/DependencyPlugin/ProjectDescriptionHelpers/Dependency+XCFramework.swift new file mode 100644 index 000000000..eaab5ff05 --- /dev/null +++ b/Plugin/DependencyPlugin/ProjectDescriptionHelpers/Dependency+XCFramework.swift @@ -0,0 +1,18 @@ +import ProjectDescription + +public extension TargetDependency { + struct XCFramework {} +} + +public extension TargetDependency.XCFramework { + static let Realm = TargetDependency.xcframework( + path: .relativeToRoot("Carthage/Build/Realm.xcframework"), + status: .required, + condition: .when([.ios]) + ) + static let RealmSwift = TargetDependency.xcframework( + path: .relativeToRoot("Carthage/Build/RealmSwift.xcframework"), + status: .required, + condition: .when([.ios]) + ) +} diff --git a/Plugin/DependencyPlugin/ProjectDescriptionHelpers/ModulePaths.swift b/Plugin/DependencyPlugin/ProjectDescriptionHelpers/ModulePaths.swift new file mode 100644 index 000000000..3f16a2db8 --- /dev/null +++ b/Plugin/DependencyPlugin/ProjectDescriptionHelpers/ModulePaths.swift @@ -0,0 +1,120 @@ +// +// ModulePaths.swift +// DependencyPlugin +// +// Created by yongbeomkwak on 2/18/24. +// + +import Foundation + +public enum ModulePaths { + case feature(Feature) + case service(Service) + case module(Module) + case userInterface(UserInterface) + case domain(Domain) +} + +extension ModulePaths: MicroTargetPathConvertable { + public func targetName(type: MicroTargetType) -> String { + switch self { + case let .feature(module as any MicroTargetPathConvertable), + let .module(module as any MicroTargetPathConvertable), + let .service(module as any MicroTargetPathConvertable), + let .userInterface(module as any MicroTargetPathConvertable), + let .domain(module as any MicroTargetPathConvertable): + return module.targetName(type: type) + } + } +} + +public extension ModulePaths { + enum Feature: String, MicroTargetPathConvertable { + case CreditSongListFeature + case SongCreditFeature + case TeamFeature + case FruitDrawFeature + case LyricHighlightingFeature + case MyInfoFeature + case MusicDetailFeature + case PlaylistFeature + case BaseFeature + case ArtistFeature + case ChartFeature + case HomeFeature + case MainTabFeature + case RootFeature + case SearchFeature + case SignInFeature + case StorageFeature + } +} + +public extension ModulePaths { + enum Domain: String, MicroTargetPathConvertable { + case PriceDomain + case CreditDomain + case TeamDomain + case NotificationDomain + case ImageDomain + case SearchDomain + case BaseDomain + case AppDomain + case ArtistDomain + case AuthDomain + case ChartDomain + case FaqDomain + case LikeDomain + case NoticeDomain + case PlaylistDomain + case SongsDomain + case UserDomain + } +} + +public extension ModulePaths { + enum Module: String, MicroTargetPathConvertable { + case Localization + case LogManager + case ErrorModule + case FeatureThirdPartyLib + case KeychainModule + case ThirdPartyLib + case Utility + } +} + +public extension ModulePaths { + enum Service: String, MicroTargetPathConvertable { + case APIKit + case DatabaseModule + case DataMappingModule + case DataModule + case DomainModule + case NetworkModule + } +} + +public extension ModulePaths { + enum UserInterface: String, MicroTargetPathConvertable { + case DesignSystem + } +} + +public enum MicroTargetType: String { + case interface = "Interface" + case sources = "" + case testing = "Testing" + case unitTest = "Tests" + case demo = "Demo" +} + +public protocol MicroTargetPathConvertable { + func targetName(type: MicroTargetType) -> String +} + +public extension MicroTargetPathConvertable where Self: RawRepresentable { + func targetName(type: MicroTargetType) -> String { + "\(self.rawValue)\(type.rawValue)" + } +} diff --git a/Plugin/DependencyPlugin/ProjectDescriptionHelpers/PathExtension.swift b/Plugin/DependencyPlugin/ProjectDescriptionHelpers/PathExtension.swift new file mode 100644 index 000000000..e48b6ede2 --- /dev/null +++ b/Plugin/DependencyPlugin/ProjectDescriptionHelpers/PathExtension.swift @@ -0,0 +1,26 @@ +import ProjectDescription + +public extension ProjectDescription.Path { + static func relativeToFeature(_ path: String) -> Self { + return .relativeToRoot("Projects/Features/\(path)") + } + static func relativeToSections(_ path: String) -> Self { + return .relativeToRoot("Projects/\(path)") + } + static func relativeToModule(_ path: String) -> Self { + return .relativeToRoot("Projects/Modules/\(path)") + } + static func relativeToService(_ path: String) -> Self { + return .relativeToRoot("Projects/Services/\(path)") + } + static func relativeToUserInterfaces(_ path: String) -> Self { + return .relativeToRoot("Projects/UsertInterfaces/\(path)") + } + static func relativeToDomain(_ path: String) -> Self { + return .relativeToRoot("Projects/Domains/\(path)") + } + static var app: Self { + return .relativeToRoot("Projects/App") + } +} + diff --git a/Plugin/DependencyPlugin/ProjectDescriptionHelpers/TargetDependency+MicroFeatureTarget.swift b/Plugin/DependencyPlugin/ProjectDescriptionHelpers/TargetDependency+MicroFeatureTarget.swift new file mode 100644 index 000000000..ab47b025c --- /dev/null +++ b/Plugin/DependencyPlugin/ProjectDescriptionHelpers/TargetDependency+MicroFeatureTarget.swift @@ -0,0 +1,61 @@ +// +// TargetDependency+MicroFeatureTarget.swift +// DependencyPlugin +// +// Created by yongbeomkwak on 2/18/24. +// + +import Foundation +import ProjectDescription + +public extension TargetDependency { + static func feature( + target: ModulePaths.Feature, + type: MicroTargetType = .sources + ) -> TargetDependency { + .project( + target: target.targetName(type: type), + path: .relativeToFeature(target.rawValue) + ) + } + + static func service( + target: ModulePaths.Service, + type: MicroTargetType = .sources + ) -> TargetDependency { + .project( + target: target.targetName(type: type), + path: .relativeToService(target.rawValue) + ) + } + + static func module( + target: ModulePaths.Module, + type: MicroTargetType = .sources + ) -> TargetDependency { + .project( + target: target.targetName(type: type), + path: .relativeToModule(target.rawValue) + ) + } + + static func userInterface( + target: ModulePaths.UserInterface, + type: MicroTargetType = .sources + ) -> TargetDependency { + .project( + target: target.targetName(type: type), + path: .relativeToUserInterfaces(target.rawValue) + ) + } + + static func domain( + target: ModulePaths.Domain, + type: MicroTargetType = .sources + ) -> TargetDependency { + .project( + target: target.targetName(type: type), + path: .relativeToDomain(target.rawValue) + ) + } +} diff --git a/Plugin/EnvironmentPlugin/Plugin.swift b/Plugin/EnvironmentPlugin/Plugin.swift new file mode 100644 index 000000000..cbbdd337b --- /dev/null +++ b/Plugin/EnvironmentPlugin/Plugin.swift @@ -0,0 +1,3 @@ +import ProjectDescription + +let environmentPlugin = Plugin(name: "EnvironmentPlugin") diff --git a/Plugin/EnvironmentPlugin/ProjectDescriptionHelpers/ProjectEnvironment.swift b/Plugin/EnvironmentPlugin/ProjectDescriptionHelpers/ProjectEnvironment.swift new file mode 100644 index 000000000..16d8a67bb --- /dev/null +++ b/Plugin/EnvironmentPlugin/ProjectDescriptionHelpers/ProjectEnvironment.swift @@ -0,0 +1,28 @@ +import Foundation +import ProjectDescription + +public struct ProjectEnvironment { + public let previousName : String + public let name: String + public let organizationName: String + public let deploymentTargets: DeploymentTargets + public let destinations : Destinations + public let baseSetting: SettingsDictionary + + +} + +public let env = ProjectEnvironment( + previousName: "Billboardoo", + name: "WaktaverseMusic", + organizationName: "yongbeomkwak", + deploymentTargets: .iOS("15.0"), + destinations: [.iPhone], + baseSetting: SettingsDictionary() + .marketingVersion("3.0.0") + .currentProjectVersion("0") + .debugInformationFormat(DebugInformationFormat.dwarfWithDsym) + .otherLinkerFlags(["-ObjC"]) + .bitcodeEnabled(false) +) + diff --git a/Plugin/TemplatePlugin/Plugin.swift b/Plugin/TemplatePlugin/Plugin.swift new file mode 100644 index 000000000..61a20da19 --- /dev/null +++ b/Plugin/TemplatePlugin/Plugin.swift @@ -0,0 +1,3 @@ +import ProjectDescription + +let templatePlugin = Plugin(name: "TemplatePlugin") diff --git a/Plugin/TemplatePlugin/Templates/Demo/Demo.swift b/Plugin/TemplatePlugin/Templates/Demo/Demo.swift new file mode 100644 index 000000000..a43d23cc1 --- /dev/null +++ b/Plugin/TemplatePlugin/Templates/Demo/Demo.swift @@ -0,0 +1,22 @@ +import ProjectDescription + +private let layerAttribute = Template.Attribute.required("layer") +private let nameAttribute = Template.Attribute.required("name") + +private let template = Template( + description: "A template for a new module's demo target", + attributes: [ + layerAttribute, + nameAttribute + ], + items: [ + .file( + path: "Projects/\(layerAttribute)/\(nameAttribute)/Demo/Sources/AppDelegate.swift", + templatePath: "DemoSources.stencil" + ), + .file( + path: "Projects/\(layerAttribute)/\(nameAttribute)/Demo/Resources/LaunchScreen.storyboard", + templatePath: "DemoResources.stencil" + ) + ] +) diff --git a/.tuist-bin/Templates/LaunchScreen+iOS.stencil b/Plugin/TemplatePlugin/Templates/Demo/DemoResources.stencil similarity index 100% rename from .tuist-bin/Templates/LaunchScreen+iOS.stencil rename to Plugin/TemplatePlugin/Templates/Demo/DemoResources.stencil diff --git a/Plugin/TemplatePlugin/Templates/Demo/DemoSources.stencil b/Plugin/TemplatePlugin/Templates/Demo/DemoSources.stencil new file mode 100644 index 000000000..ef2bae045 --- /dev/null +++ b/Plugin/TemplatePlugin/Templates/Demo/DemoSources.stencil @@ -0,0 +1,19 @@ +import UIKit + +@main +final class AppDelegate: UIResponder, UIApplicationDelegate { + var window: UIWindow? + + func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil + ) -> Bool { + window = UIWindow(frame: UIScreen.main.bounds) + let viewController = UIViewController() + viewController.view.backgroundColor = .yellow + window?.rootViewController = viewController + window?.makeKeyAndVisible() + + return true + } +} diff --git a/Plugin/TemplatePlugin/Templates/Interface/Interface.stencil b/Plugin/TemplatePlugin/Templates/Interface/Interface.stencil new file mode 100644 index 000000000..b1853ce60 --- /dev/null +++ b/Plugin/TemplatePlugin/Templates/Interface/Interface.stencil @@ -0,0 +1 @@ +// This is for Tuist diff --git a/Plugin/TemplatePlugin/Templates/Interface/Interface.swift b/Plugin/TemplatePlugin/Templates/Interface/Interface.swift new file mode 100644 index 000000000..3e518fac0 --- /dev/null +++ b/Plugin/TemplatePlugin/Templates/Interface/Interface.swift @@ -0,0 +1,18 @@ +import ProjectDescription + +private let layerAttribute = Template.Attribute.required("layer") +private let nameAttribute = Template.Attribute.required("name") + +private let template = Template( + description: "A template for a new module's interface target", + attributes: [ + layerAttribute, + nameAttribute + ], + items: [ + .file( + path: "Projects/\(layerAttribute)/\(nameAttribute)/Interface/Interface.swift", + templatePath: "Interface.stencil" + ) + ] +) diff --git a/Plugin/TemplatePlugin/Templates/Sources/Sources.stencil b/Plugin/TemplatePlugin/Templates/Sources/Sources.stencil new file mode 100644 index 000000000..b1853ce60 --- /dev/null +++ b/Plugin/TemplatePlugin/Templates/Sources/Sources.stencil @@ -0,0 +1 @@ +// This is for Tuist diff --git a/Plugin/TemplatePlugin/Templates/Sources/Sources.swift b/Plugin/TemplatePlugin/Templates/Sources/Sources.swift new file mode 100644 index 000000000..dcb8bf2b8 --- /dev/null +++ b/Plugin/TemplatePlugin/Templates/Sources/Sources.swift @@ -0,0 +1,18 @@ +import ProjectDescription + +private let layerAttribute = Template.Attribute.required("layer") +private let nameAttribute = Template.Attribute.required("name") + +private let template = Template( + description: "A template for a new module's sources target", + attributes: [ + layerAttribute, + nameAttribute + ], + items: [ + .file( + path: "Projects/\(layerAttribute)/\(nameAttribute)/Sources/Sources.swift", + templatePath: "Sources.stencil" + ) + ] +) diff --git a/Plugin/TemplatePlugin/Templates/Testing/Testing.stencil b/Plugin/TemplatePlugin/Templates/Testing/Testing.stencil new file mode 100644 index 000000000..b1853ce60 --- /dev/null +++ b/Plugin/TemplatePlugin/Templates/Testing/Testing.stencil @@ -0,0 +1 @@ +// This is for Tuist diff --git a/Plugin/TemplatePlugin/Templates/Testing/Testing.swift b/Plugin/TemplatePlugin/Templates/Testing/Testing.swift new file mode 100644 index 000000000..e945d0a03 --- /dev/null +++ b/Plugin/TemplatePlugin/Templates/Testing/Testing.swift @@ -0,0 +1,18 @@ +import ProjectDescription + +private let layerAttribute = Template.Attribute.required("layer") +private let nameAttribute = Template.Attribute.required("name") + +private let template = Template( + description: "A template for a new module's testing target", + attributes: [ + layerAttribute, + nameAttribute + ], + items: [ + .file( + path: "Projects/\(layerAttribute)/\(nameAttribute)/Testing/Testing.swift", + templatePath: "Testing.stencil" + ) + ] +) diff --git a/Plugin/TemplatePlugin/Templates/Tests/Tests.stencil b/Plugin/TemplatePlugin/Templates/Tests/Tests.stencil new file mode 100644 index 000000000..a6a1c6579 --- /dev/null +++ b/Plugin/TemplatePlugin/Templates/Tests/Tests.stencil @@ -0,0 +1,11 @@ +import XCTest + +final class {{ name }}Tests: XCTestCase { + override func setUpWithError() throws {} + + override func tearDownWithError() throws {} + + func testExample() { + XCTAssertEqual(1, 1) + } +} diff --git a/Plugin/TemplatePlugin/Templates/Tests/Tests.swift b/Plugin/TemplatePlugin/Templates/Tests/Tests.swift new file mode 100644 index 000000000..09d79c9eb --- /dev/null +++ b/Plugin/TemplatePlugin/Templates/Tests/Tests.swift @@ -0,0 +1,18 @@ +import ProjectDescription + +private let layerAttribute = Template.Attribute.required("layer") +private let nameAttribute = Template.Attribute.required("name") + +private let template = Template( + description: "A template for a new module's unit test target", + attributes: [ + layerAttribute, + nameAttribute + ], + items: [ + .file( + path: "Projects/\(layerAttribute)/\(nameAttribute)/Tests/\(nameAttribute)Test.swift", + templatePath: "Tests.stencil" + ), + ] +) diff --git a/Plugin/TemplatePlugin/Templates/UITests/UITests.stencil b/Plugin/TemplatePlugin/Templates/UITests/UITests.stencil new file mode 100644 index 000000000..2a0cbf033 --- /dev/null +++ b/Plugin/TemplatePlugin/Templates/UITests/UITests.stencil @@ -0,0 +1,11 @@ +import XCTest + +final class {{ name }}Tests: XCTestCase { + override func setUpWithError() throws {} + + override func tearDownWithError() throws {} + + func testExample() throws { + XCTAssertEqual("A", "A") + } +} diff --git a/Plugin/TemplatePlugin/Templates/UITests/UITests.swift b/Plugin/TemplatePlugin/Templates/UITests/UITests.swift new file mode 100644 index 000000000..716ef2460 --- /dev/null +++ b/Plugin/TemplatePlugin/Templates/UITests/UITests.swift @@ -0,0 +1,18 @@ +import ProjectDescription + +private let layerAttribute = Template.Attribute.required("layer") +private let nameAttribute = Template.Attribute.required("name") + +private let template = Template( + description: "A template for a new module's ui test target", + attributes: [ + layerAttribute, + nameAttribute + ], + items: [ + .file( + path: "Projects/\(layerAttribute)/\(nameAttribute)/UITests/\(nameAttribute)UITests.swift", + templatePath: "UITests.stencil" + ), + ] +) diff --git a/Plugin/UtilityPlugin/Plugin.swift b/Plugin/UtilityPlugin/Plugin.swift deleted file mode 100644 index dcf03c5cc..000000000 --- a/Plugin/UtilityPlugin/Plugin.swift +++ /dev/null @@ -1,3 +0,0 @@ -import ProjectDescription - -let utilityPlugin = Plugin(name: "UtilityPlugin") diff --git a/Plugin/UtilityPlugin/ProjectDescriptionHelpers/Dependency+Project.swift b/Plugin/UtilityPlugin/ProjectDescriptionHelpers/Dependency+Project.swift deleted file mode 100644 index 0e19b330e..000000000 --- a/Plugin/UtilityPlugin/ProjectDescriptionHelpers/Dependency+Project.swift +++ /dev/null @@ -1,45 +0,0 @@ -import ProjectDescription - -public extension TargetDependency { - struct Project { - public struct Features {} - public struct Module {} - public struct Service {} - public struct UserInterfaces {} - } -} - -public extension TargetDependency.Project.Features { - static let CommonFeature = TargetDependency.feature(name: "CommonFeature") - static let PlayerFeature = TargetDependency.feature(name: "PlayerFeature") - static let StorageFeature = TargetDependency.feature(name: "StorageFeature") - static let SignInFeature = TargetDependency.feature(name: "SignInFeature") - static let HomeFeature = TargetDependency.feature(name: "HomeFeature") - static let ChartFeature = TargetDependency.feature(name: "ChartFeature") - static let SearchFeature = TargetDependency.feature(name: "SearchFeature") - static let MainTabFeature = TargetDependency.feature(name: "MainTabFeature") - static let ArtistFeature = TargetDependency.feature(name: "ArtistFeature") - static let BaseFeature = TargetDependency.feature(name: "BaseFeature") - static let RootFeature = TargetDependency.feature(name: "RootFeature") -} - -public extension TargetDependency.Project.Module { - static let FeatureThirdPartyLib = TargetDependency.module(name: "FeatureThirdPartyLib") - static let ThirdPartyLib = TargetDependency.module(name: "ThirdPartyLib") - static let Utility = TargetDependency.module(name: "Utility") - static let KeychainModule = TargetDependency.module(name: "KeychainModule") - static let ErrorModule = TargetDependency.module(name: "ErrorModule") -} - -public extension TargetDependency.Project.Service { - static let APIKit = TargetDependency.service(name: "APIKit") - static let Data = TargetDependency.service(name: "DataModule") - static let Domain = TargetDependency.service(name: "DomainModule") - static let DatabaseModule = TargetDependency.service(name: "DatabaseModule") - static let DataMappingModule = TargetDependency.service(name: "DataMappingModule") - static let NetworkModule = TargetDependency.service(name: "NetworkModule") -} - -public extension TargetDependency.Project.UserInterfaces { - static let DesignSystem = TargetDependency.ui(name: "DesignSystem") -} diff --git a/Plugin/UtilityPlugin/ProjectDescriptionHelpers/Dependency+SPM.swift b/Plugin/UtilityPlugin/ProjectDescriptionHelpers/Dependency+SPM.swift deleted file mode 100644 index 2ad216bac..000000000 --- a/Plugin/UtilityPlugin/ProjectDescriptionHelpers/Dependency+SPM.swift +++ /dev/null @@ -1,50 +0,0 @@ -import ProjectDescription - -public extension TargetDependency { - struct SPM {} -} - -public extension TargetDependency.SPM { - // MARK: External - static let Moya = TargetDependency.external(name: "Moya") - static let RxMoya = TargetDependency.external(name: "RxMoya") - static let PanModal = TargetDependency.external(name: "PanModal") - static let RxSwift = TargetDependency.external(name: "RxSwift") - static let RxCocoa = TargetDependency.external(name: "RxCocoa") - static let Kingfisher = TargetDependency.external(name: "Kingfisher") - static let Then = TargetDependency.external(name: "Then") - static let SnapKit = TargetDependency.external(name: "SnapKit") - static let ReachabilitySwift = TargetDependency.external(name: "ReachabilitySwift") - static let Lottie = TargetDependency.external(name: "Lottie") - static let Needle = TargetDependency.external(name: "NeedleFoundation") - static let Tabman = TargetDependency.external(name: "Tabman") - static let RxDataSources = TargetDependency.external(name: "RxDataSources") - static let RxKeyboard = TargetDependency.external(name: "RxKeyboard") - static let SwiftEntryKit = TargetDependency.external(name: "SwiftEntryKit") - static let NaverLogin = TargetDependency.external(name: "naveridlogin-ios-sp") - static let CryptoSwift = TargetDependency.external(name: "CryptoSwift") - static let MarqueeLabel = TargetDependency.external(name: "MarqueeLabel") - static let FirebaseAnalytics = TargetDependency.external(name: "FirebaseAnalyticsWithoutAdIdSupport") - static let FirebaseCrashlytics = TargetDependency.external(name: "FirebaseCrashlytics") - static let NVActivityIndicatorView = TargetDependency.external(name: "NVActivityIndicatorView") - -// MARK: Native SPM - static let YouTubePlayerKit = TargetDependency.package(product: "YouTubePlayerKit") - // static let Amplify = TargetDependency.package(product: "Amplify") - // static let AWSCognitoAuthPlugin = TargetDependency.package(product: "AWSCognitoAuthPlugin") - // static let AWSS3StoragePlugin = TargetDependency.package(product:"AWSS3StoragePlugin") -} - -public extension Package { - static let YouTubePlayerKit = Package.remote( - url: "https://github.com/SvenTiigi/YouTubePlayerKit.git", - requirement: .upToNextMajor(from: "1.3.1") - ) - - /* - static let Amplify = Package.remote( - url: "https://github.com/aws-amplify/amplify-swift.git", - requirement: .upToNextMajor(from: "2.10.0") - ) - */ -} diff --git "a/Plugin/UtilityPlugin/ProjectDescriptionHelpers/Dependency+XCFramework\342\200\216.swift" "b/Plugin/UtilityPlugin/ProjectDescriptionHelpers/Dependency+XCFramework\342\200\216.swift" deleted file mode 100644 index f0c187019..000000000 --- "a/Plugin/UtilityPlugin/ProjectDescriptionHelpers/Dependency+XCFramework\342\200\216.swift" +++ /dev/null @@ -1,10 +0,0 @@ -import ProjectDescription - -public extension TargetDependency { - struct XCFramework {} -} - -public extension TargetDependency.XCFramework { - static let Realm = TargetDependency.xcframework(path: "Frameworks/Realm.xcframework") - static let RealmSwift = TargetDependency.xcframework(path: "Frameworks/RealmSwift.xcframework") -} diff --git a/Plugin/UtilityPlugin/ProjectDescriptionHelpers/PathExtension.swift b/Plugin/UtilityPlugin/ProjectDescriptionHelpers/PathExtension.swift deleted file mode 100644 index c5cfddf0f..000000000 --- a/Plugin/UtilityPlugin/ProjectDescriptionHelpers/PathExtension.swift +++ /dev/null @@ -1,37 +0,0 @@ -import ProjectDescription - -public extension ProjectDescription.Path { - static func relativeToFeature(_ path: String) -> Self { - return .relativeToRoot("Projects/Features/\(path)") - } - static func relativeToSections(_ path: String) -> Self { - return .relativeToRoot("Projects/\(path)") - } - static func relativeToModule(_ path: String) -> Self { - return .relativeToRoot("Projects/Modules/\(path)") - } - static func relativeToService(_ path: String) -> Self { - return .relativeToRoot("Projects/Services/\(path)") - } - static func relativeToUserInterfaces(_ path: String) -> Self { - return .relativeToRoot("Projects/UsertInterfaces/\(path)") - } - static var app: Self { - return .relativeToRoot("Projects/App") - } -} - -public extension TargetDependency { - static func module(name: String) -> Self { - return .project(target: name, path: .relativeToModule(name)) - } - static func service(name: String) -> Self { - return .project(target: name, path: .relativeToService(name)) - } - static func feature(name: String) -> Self { - return .project(target: name, path: .relativeToFeature(name)) - } - static func ui(name: String) -> Self { - return .project(target: name, path: .relativeToUserInterfaces(name)) - } -} diff --git a/Projects/App/.swiftlint.yml b/Projects/App/.swiftlint.yml deleted file mode 100644 index 2ad4cc08c..000000000 --- a/Projects/App/.swiftlint.yml +++ /dev/null @@ -1,19 +0,0 @@ -excluded: - - "**/*/NeedleGenerated.swift" - - "Tuist" - - -force_cast: # From https://realm.github.io/SwiftLint/force_cast.html - warning # 강제 캐스팅은 error에서 warning으로 변경 - -disabled_rules: - - trailing_whitespace - - vertical_whitespace - - colon - - comma - - comment_spacing # 주석 여백 - - mark # //MARK 관련 warning - - opening_brace # 괄호 열 때 줄바꿈을 했는지 안했는지, (안했으면 warning) - - line_length # 한줄에 글자 수 제한 , warning: 120, error: 200 (default) - - statement_position # if는 반드시 else로 끝나야한다. - - identifier_name #변수명 글자 수 제한 \ No newline at end of file diff --git a/Projects/App/Project.swift b/Projects/App/Project.swift index 4ddc94a6d..c73afcdfe 100644 --- a/Projects/App/Project.swift +++ b/Projects/App/Project.swift @@ -1,97 +1,127 @@ -import ProjectDescriptionHelpers -import ProjectDescription -import UtilityPlugin +import EnvironmentPlugin import Foundation +import ProjectDescription +import ProjectDescriptionHelpers let settinges: Settings = - .settings(base: Environment.baseSetting, - configurations: [ - .debug(name: .debug), - .release(name: .release) - ], - defaultSettings: .recommended) - -let isForDev = (ProcessInfo.processInfo.environment["TUIST_DEV"] ?? "0") == "1" ? true : false + .settings( + base: env.baseSetting, + configurations: [ + .debug(name: .debug), + .debug(name: .qa), + .release(name: .release) + ], + defaultSettings: .recommended + ) -let scripts: [TargetScript] = isForDev ? [.swiftLint, .needle] : [.firebaseCrashlytics] +let scripts: [TargetScript] = generateEnvironment.appScripts let targets: [Target] = [ - .init( - name: Environment.targetName, - platform: .iOS, + .target( + name: env.name, + destinations: [.iPhone], product: .app, - productName: Environment.appName, - bundleId: "\(Environment.organizationName).\(Environment.beforeName)", - deploymentTarget: Environment.deploymentTarget, + productName: env.name, + bundleId: "\(env.organizationName).\(env.previousName)", + deploymentTargets: env.deploymentTargets, infoPlist: .file(path: "Support/Info.plist"), sources: ["Sources/**"], resources: ["Resources/**"], - entitlements: "Support/\(Environment.appName).entitlements", + entitlements: "Support/\(env.name).entitlements", scripts: scripts, dependencies: [ - .Project.Features.RootFeature, - .Project.Module.ThirdPartyLib, - .Project.Service.Data, - // .SPM.Amplify, - // .SPM.AWSCognitoAuthPlugin, - // .SPM.AWSS3StoragePlugin, + .module(target: .ThirdPartyLib), + .feature(target: .RootFeature), + .feature(target: .PlaylistFeature), + .feature(target: .MusicDetailFeature), + .feature(target: .SongCreditFeature), + .feature(target: .CreditSongListFeature), + .domain(target: .AppDomain), + .domain(target: .ArtistDomain), + .domain(target: .AuthDomain), + .domain(target: .ChartDomain), + .domain(target: .FaqDomain), + .domain(target: .LikeDomain), + .domain(target: .NoticeDomain), + .domain(target: .SongsDomain), + .domain(target: .PlaylistDomain), + .domain(target: .UserDomain), + .domain(target: .SearchDomain), + .domain(target: .ImageDomain), + .domain(target: .NotificationDomain), + .domain(target: .TeamDomain), + .domain(target: .CreditDomain), + .domain(target: .PriceDomain) ], - settings: .settings(base: Environment.baseSetting, - configurations: [ - .debug(name: .debug, xcconfig: "XCConfig/Secrets.xcconfig"), - .release(name: .release, xcconfig: "XCConfig/Secrets.xcconfig") - ]) + settings: .settings( + base: env.baseSetting, + configurations: [ + .debug(name: .debug, xcconfig: "XCConfig/Secrets.xcconfig"), + .debug(name: .qa, xcconfig: "XCConfig/Secrets.xcconfig"), + .release(name: .release, xcconfig: "XCConfig/Secrets.xcconfig") + ] + ), + environmentVariables: ["NETWORK_LOG_LEVEL": "short"] ), - .init( - name: Environment.targetTestName, - platform: .iOS, + .target( + name: "\(env.name)Tests", + destinations: [.iPhone], product: .unitTests, - bundleId: "\(Environment.organizationName).\(Environment.beforeName)Tests", - deploymentTarget: Environment.deploymentTarget, + bundleId: "\(env.organizationName).\(env.previousName)Tests", + deploymentTargets: env.deploymentTargets, infoPlist: .default, sources: ["Tests/**"], dependencies: [ - .target(name: Environment.targetName) + .target(name: env.name) ] ) ] let schemes: [Scheme] = [ - .init( - name: "\(Environment.targetName)-DEBUG", - shared: true, - buildAction: .buildAction(targets: ["\(Environment.targetName)"]), - testAction: TestAction.targets( - ["\(Environment.targetTestName)"], - configuration: .debug, - options: TestActionOptions.options( - coverage: true, - codeCoverageTargets: ["\(Environment.targetName)"] - ) - ), - runAction: .runAction(configuration: .debug), - archiveAction: .archiveAction(configuration: .debug), - profileAction: .profileAction(configuration: .debug), - analyzeAction: .analyzeAction(configuration: .debug) + .scheme( + name: "\(env.name)-DEBUG", + shared: true, + buildAction: .buildAction(targets: ["\(env.name)"]), + testAction: TestAction.targets( + ["\(env.name)"], + configuration: .debug, + options: TestActionOptions.options( + coverage: true, + codeCoverageTargets: ["\(env.name)"] + ) + ), + runAction: .runAction(configuration: .debug), + archiveAction: .archiveAction(configuration: .debug), + profileAction: .profileAction(configuration: .debug), + analyzeAction: .analyzeAction(configuration: .debug) ), - .init( - name: "\(Environment.targetName)-RELEASE", - shared: true, - buildAction: BuildAction(targets: ["\(Environment.targetName)"]), - testAction: nil, - runAction: .runAction(configuration: .release), - archiveAction: .archiveAction(configuration: .release), - profileAction: .profileAction(configuration: .release), - analyzeAction: .analyzeAction(configuration: .release) + .scheme( + name: "\(env.name)-QA", + shared: true, + buildAction: .buildAction(targets: ["\(env.name)"]), + testAction: nil, + runAction: .runAction(configuration: .qa), + archiveAction: .archiveAction(configuration: .qa), + profileAction: .profileAction(configuration: .qa), + analyzeAction: .analyzeAction(configuration: .qa) + ), + .scheme( + name: "\(env.name)-RELEASE", + shared: true, + buildAction: .buildAction(targets: ["\(env.name)"]), + testAction: nil, + runAction: .runAction(configuration: .release), + archiveAction: .archiveAction(configuration: .release), + profileAction: .profileAction(configuration: .release), + analyzeAction: .analyzeAction(configuration: .release) ) ] let project: Project = .init( - name: Environment.targetName, - organizationName: Environment.organizationName, + name: env.name, + organizationName: env.organizationName, packages: [], - //packages: [.Amplify], settings: settinges, targets: targets, schemes: schemes diff --git a/Projects/App/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon.png b/Projects/App/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon.png deleted file mode 100644 index 223eb6a9b..000000000 Binary files a/Projects/App/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon.png and /dev/null differ diff --git a/Projects/App/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon_1024x1024.png b/Projects/App/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon_1024x1024.png new file mode 100644 index 000000000..a87bdcdf7 Binary files /dev/null and b/Projects/App/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon_1024x1024.png differ diff --git a/Projects/App/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json b/Projects/App/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json index cefcc878e..75e969190 100644 --- a/Projects/App/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/Projects/App/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "AppIcon.png", + "filename" : "AppIcon_1024x1024.png", "idiom" : "universal", "platform" : "ios", "size" : "1024x1024" diff --git a/Projects/App/Resources/GoogleService-Info-QA.plist b/Projects/App/Resources/GoogleService-Info-QA.plist new file mode 100644 index 000000000..f6ffe20ea --- /dev/null +++ b/Projects/App/Resources/GoogleService-Info-QA.plist @@ -0,0 +1,30 @@ + + + + + API_KEY + AIzaSyAgnrvQkVHTDrGimRAP1LRdP-clo6X45Ek + GCM_SENDER_ID + 121910868968 + PLIST_VERSION + 1 + BUNDLE_ID + yongbeomkwak.Billboardoo + PROJECT_ID + wakmusic-for-qa + STORAGE_BUCKET + wakmusic-for-qa.appspot.com + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:121910868968:ios:5b3676f5a70ba6535a025d + + \ No newline at end of file diff --git a/Projects/App/Resources/PrivacyInfo.xcprivacy b/Projects/App/Resources/PrivacyInfo.xcprivacy new file mode 100644 index 000000000..d9fd48f5b --- /dev/null +++ b/Projects/App/Resources/PrivacyInfo.xcprivacy @@ -0,0 +1,96 @@ + + + + + NSPrivacyTrackingDomains + + NSPrivacyTracking + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + + + NSPrivacyCollectedDataTypes + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypePhotosorVideos + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAppFunctionality + + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypeCustomerSupport + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAppFunctionality + + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypeUserID + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAppFunctionality + + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypeEmailsOrTextMessages + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAppFunctionality + + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypeSearchHistory + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAppFunctionality + + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypeProductInteraction + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAnalytics + + + + + diff --git a/Projects/App/Sources/Application/AppComponent+App.swift b/Projects/App/Sources/Application/AppComponent+App.swift index 648ea070c..ac03e8760 100644 --- a/Projects/App/Sources/Application/AppComponent+App.swift +++ b/Projects/App/Sources/Application/AppComponent+App.swift @@ -1,38 +1,25 @@ -// -// AppComponent+Search.swift -// WaktaverseMusic -// -// Created by yongbeomkwak on 2023/02/07. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import DomainModule -import DataModule -import NetworkModule - - -//MARK: 변수명 주의 -// AppComponent 내 변수 == Dependency 내 변수 이름 같아야함 +import AppDomain +import AppDomainInterface +// MARK: 변수명 주의 +// AppComponent 내 변수 == Dependency 내 변수 이름 같아야함 public extension AppComponent { - var remoteAppDataSource: any RemoteAppDataSource { shared { RemoteAppDataSourceImpl(keychain: keychain) } } - + var appRepository: any AppRepository { shared { AppRepositoryImpl(remoteAppDataSource: remoteAppDataSource) } } - - - var fetchCheckAppUseCase: any FetchCheckAppUseCase{ + + var fetchAppCheckUseCase: any FetchAppCheckUseCase { shared { - FetchCheckAppUseCaseImpl(appRepository: appRepository) + FetchAppCheckUseCaseImpl(appRepository: appRepository) } } } diff --git a/Projects/App/Sources/Application/AppComponent+Artist.swift b/Projects/App/Sources/Application/AppComponent+Artist.swift index 52b53c047..c6ff090c8 100644 --- a/Projects/App/Sources/Application/AppComponent+Artist.swift +++ b/Projects/App/Sources/Application/AppComponent+Artist.swift @@ -1,58 +1,67 @@ -// -// AppComponent+Artist.swift -// WaktaverseMusic -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import DomainModule -import DataModule -import NetworkModule +import ArtistDomain +import ArtistDomainInterface import ArtistFeature +import ArtistFeatureInterface public extension AppComponent { - - //MARK: Artist - var artistComponent: ArtistComponent { + // MARK: Artist + var artistFactory: any ArtistFactory { ArtistComponent(parent: self) } - + var remoteArtistDataSource: RemoteArtistDataSourceImpl { shared { RemoteArtistDataSourceImpl(keychain: keychain) } } - + var artistRepository: any ArtistRepository { shared { ArtistRepositoryImpl(remoteArtistDataSource: remoteArtistDataSource) } } - + var fetchArtistListUseCase: any FetchArtistListUseCase { shared { FetchArtistListUseCaseImpl(artistRepository: artistRepository) } } - - //MARK: Artist Detail - var artistDetailComponent: ArtistDetailComponent { + + // MARK: Artist Detail + var artistDetailFactory: any ArtistDetailFactory { ArtistDetailComponent(parent: self) } - + + var fetchArtistDetailUseCase: any FetchArtistDetailUseCase { + shared { + FetchArtistDetailUseCaseImpl(artistRepository: artistRepository) + } + } + var fetchArtistSongListUseCase: any FetchArtistSongListUseCase { shared { FetchArtistSongListUseCaseImpl(artistRepository: artistRepository) } } - - //MARK: Artist Detail > Artist Music + + var fetchArtistSubscriptionStatusUseCase: any FetchArtistSubscriptionStatusUseCase { + shared { + FetchSubscriptionStatusUseCaseImpl(artistRepository: artistRepository) + } + } + + var subscriptionArtistUseCase: any SubscriptionArtistUseCase { + shared { + SubscriptionArtistUseCaseImpl(artistRepository: artistRepository) + } + } + + // MARK: Artist Detail > Artist Music var artistMusicComponent: ArtistMusicComponent { ArtistMusicComponent(parent: self) } - //MARK: Artist Detail > Artist Music > Artist Music Content + // MARK: Artist Detail > Artist Music > Artist Music Content var artistMusicContentComponent: ArtistMusicContentComponent { ArtistMusicContentComponent(parent: self) } diff --git a/Projects/App/Sources/Application/AppComponent+Auth.swift b/Projects/App/Sources/Application/AppComponent+Auth.swift index 9255585f8..f731fde47 100644 --- a/Projects/App/Sources/Application/AppComponent+Auth.swift +++ b/Projects/App/Sources/Application/AppComponent+Auth.swift @@ -1,90 +1,63 @@ -// -// AppComponent+Search.swift -// WaktaverseMusic -// -// Created by yongbeomkwak on 2023/02/07. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import DomainModule -import DataModule -import NetworkModule -import CommonFeature +import AuthDomain +import AuthDomainInterface +import BaseFeature +import MyInfoFeature +import MyInfoFeatureInterface import SignInFeature +import SignInFeatureInterface import StorageFeature +import StorageFeatureInterface -//MARK: 변수명 주의 +// MARK: 변수명 주의 // AppComponent 내 변수 == Dependency 내 변수 이름 같아야함 - public extension AppComponent { - - var signInComponent : SignInComponent { + var signInFactory: any SignInFactory { SignInComponent(parent: self) } - - var storageComponent : StorageComponent { - - StorageComponent(parent: self) - - } - - var afterLoginComponent: AfterLoginComponent { - - AfterLoginComponent(parent: self) - } - - var requestComponent: RequestComponent { - RequestComponent(parent: self) + var localAuthDataSource: any LocalAuthDataSource { + shared { + LocalAuthDataSourceImpl(keychain: keychain) + } } - - - + var remoteAuthDataSource: any RemoteAuthDataSource { shared { RemoteAuthDataSourceImpl(keychain: keychain) } } + var authRepository: any AuthRepository { shared { - AuthRepositoryImpl(remoteAuthDataSource: remoteAuthDataSource) + AuthRepositoryImpl( + localAuthDataSource: localAuthDataSource, + remoteAuthDataSource: remoteAuthDataSource + ) } } - - + var fetchTokenUseCase: any FetchTokenUseCase { - shared { FetchTokenUseCaseImpl(authRepository: authRepository) } } - - var fetchNaverUserInfoUseCase: any FetchNaverUserInfoUseCase { - + + var regenerateAccessTokenUseCase: any ReGenerateAccessTokenUseCase { shared { - FetchNaverUserInfoUseCaseImpl(authRepository: authRepository) + ReGenerateAccessTokenUseCaseImpl(authRepository: authRepository) } } - - - - var fetchUserInfoUseCase: any FetchUserInfoUseCase { - + + var logoutUseCase: any LogoutUseCase { shared { - FetchUserInfoUseCaseImpl(authRepository: authRepository) + LogoutUseCaseImpl(authRepository: authRepository) } } - - var withdrawUserInfoUseCase: any WithdrawUserInfoUseCase { - + + var checkIsExistAccessTokenUseCase: any CheckIsExistAccessTokenUseCase { shared { - WithdrawUserInfoUseCaseImpl(authRepository: authRepository) + CheckIsExistAccessTokenUseCaseImpl(authRepository: authRepository) } - } - - - - } diff --git a/Projects/App/Sources/Application/AppComponent+Base.swift b/Projects/App/Sources/Application/AppComponent+Base.swift new file mode 100644 index 000000000..5387df404 --- /dev/null +++ b/Projects/App/Sources/Application/AppComponent+Base.swift @@ -0,0 +1,25 @@ +import BaseFeature +import BaseFeatureInterface +import Foundation + +public extension AppComponent { + var multiPurposePopupFactory: any MultiPurposePopupFactory { + MultiPurposePopupComponent(parent: self) + } + + var textPopupFactory: any TextPopupFactory { + TextPopupComponent(parent: self) + } + + var containSongsFactory: any ContainSongsFactory { + ContainSongsComponent(parent: self) + } + + var privacyFactory: any PrivacyFactory { + PrivacyComponent(parent: self) + } + + var serviceTermsFactory: any ServiceTermFactory { + ServiceTermsComponent(parent: self) + } +} diff --git a/Projects/App/Sources/Application/AppComponent+Chart.swift b/Projects/App/Sources/Application/AppComponent+Chart.swift index 707531d24..83a90a6af 100644 --- a/Projects/App/Sources/Application/AppComponent+Chart.swift +++ b/Projects/App/Sources/Application/AppComponent+Chart.swift @@ -1,11 +1,11 @@ -import DomainModule -import DataModule -import NetworkModule +import BaseFeature +import ChartDomain +import ChartDomainInterface import ChartFeature -import CommonFeature +import ChartFeatureInterface public extension AppComponent { - var chartComponent: ChartComponent { + var chartFactory: any ChartFactory { ChartComponent(parent: self) } @@ -31,10 +31,9 @@ public extension AppComponent { } } - var fetchChartUpdateTimeUseCase: any FetchChartUpdateTimeUseCase { + var fetchCurrentVideoUseCase: any FetchCurrentVideoUseCase { shared { - FetchChartUpdateTimeUseCaseImpl(chartRepository: chartRepository) + FetchCurrentVideoUseCaseImpl(chartRepository: chartRepository) } } } - diff --git a/Projects/App/Sources/Application/AppComponent+Credit.swift b/Projects/App/Sources/Application/AppComponent+Credit.swift new file mode 100644 index 000000000..c59d3f88c --- /dev/null +++ b/Projects/App/Sources/Application/AppComponent+Credit.swift @@ -0,0 +1,48 @@ +import CreditDomain +import CreditDomainInterface +import CreditSongListFeature +import CreditSongListFeatureInterface +import SongCreditFeature +import SongCreditFeatureInterface + +public extension AppComponent { + var remoteCreditDataSource: any RemoteCreditDataSource { + shared { + RemoteCreditDataSourceImpl(keychain: keychain) + } + } + + var creditRepository: any CreditRepository { + shared { + CreditRepositoryImpl(remoteCreditDataSource: remoteCreditDataSource) + } + } + + var fetchCreditSongListUseCase: any FetchCreditSongListUseCase { + shared { + FetchCreditSongListUseCaseImpl(creditRepository: creditRepository) + } + } + + var fetchCreditProfileUseCase: any FetchCreditProfileUseCase { + shared { + FetchCreditProfileUseCaseImpl(creditRepository: creditRepository) + } + } + + var songCreditFactory: any SongCreditFactory { + SongCreditComponent(parent: self) + } + + var creditSongListFactory: any CreditSongListFactory { + CreditSongListComponent(parent: self) + } + + var creditSongListTabFactory: any CreditSongListTabFactory { + CreditSongListTabComponent(parent: self) + } + + var creditSongListTabItemFactory: any CreditSongListTabItemFactory { + CreditSongListTabItemComponent(parent: self) + } +} diff --git a/Projects/App/Sources/Application/AppComponent+Faq.swift b/Projects/App/Sources/Application/AppComponent+Faq.swift new file mode 100644 index 000000000..12bb97865 --- /dev/null +++ b/Projects/App/Sources/Application/AppComponent+Faq.swift @@ -0,0 +1,33 @@ +import BaseFeature +import FaqDomain +import FaqDomainInterface +import SignInFeature + +// MARK: 변수명 주의 +// AppComponent 내 변수 == Dependency 내 변수 이름 같아야함 + +public extension AppComponent { + var remoteFaqDataSource: any RemoteFaqDataSource { + shared { + RemoteFaqDataSourceImpl(keychain: keychain) + } + } + + var faqRepository: any FaqRepository { + shared { + FaqRepositoryImpl(remoteFaqDataSource: remoteFaqDataSource) + } + } + + var fetchFaqCategoriesUseCase: any FetchFaqCategoriesUseCase { + shared { + FetchFaqCategoriesUseCaseImpl(faqRepository: faqRepository) + } + } + + var fetchFaqUseCase: any FetchFaqUseCase { + shared { + FetchFaqUseCaseImpl(faqRepository: faqRepository) + } + } +} diff --git a/Projects/App/Sources/Application/AppComponent+Fruit.swift b/Projects/App/Sources/Application/AppComponent+Fruit.swift new file mode 100644 index 000000000..538722956 --- /dev/null +++ b/Projects/App/Sources/Application/AppComponent+Fruit.swift @@ -0,0 +1,13 @@ +import Foundation +import FruitDrawFeature +import FruitDrawFeatureInterface + +extension AppComponent { + var fruitDrawFactory: any FruitDrawFactory { + FruitDrawComponent(parent: self) + } + + var fruitStorageFactory: any FruitStorageFactory { + FruitStorageComponent(parent: self) + } +} diff --git a/Projects/App/Sources/Application/AppComponent+Image.swift b/Projects/App/Sources/Application/AppComponent+Image.swift new file mode 100644 index 000000000..13a531cbb --- /dev/null +++ b/Projects/App/Sources/Application/AppComponent+Image.swift @@ -0,0 +1,37 @@ +import ImageDomain +import ImageDomainInterface + +// MARK: 변수명 주의 +// AppComponent 내 변수 == Dependency 내 변수 이름 같아야함 + +public extension AppComponent { + var remoteImageDataSource: any RemoteImageDataSource { + shared { + RemoteImageDataSourceImpl(keychain: keychain) + } + } + + var imageRepository: any ImageRepository { + shared { + ImageRepositoryImpl(remoteImageDataSource: remoteImageDataSource) + } + } + + var fetchLyricDecoratingBackgroundUseCase: any FetchLyricDecoratingBackgroundUseCase { + shared { + FetchLyricDecoratingBackgroundUseCaseImpl(imageRepository: imageRepository) + } + } + + var fetchProfileListUseCase: any FetchProfileListUseCase { + shared { + FetchProfileListUseCaseImpl(imageRepository: imageRepository) + } + } + + var fetchDefaultPlaylistImageUseCase: any FetchDefaultPlaylistImageUseCase { + shared { + FetchDefaultPlaylistImageUseCaseImpl(imageRepository: imageRepository) + } + } +} diff --git a/Projects/App/Sources/Application/AppComponent+Like.swift b/Projects/App/Sources/Application/AppComponent+Like.swift index 1730db1bb..680caa3db 100644 --- a/Projects/App/Sources/Application/AppComponent+Like.swift +++ b/Projects/App/Sources/Application/AppComponent+Like.swift @@ -1,66 +1,34 @@ -// -// AppComponent+Search.swift -// WaktaverseMusic -// -// Created by yongbeomkwak on 2023/02/07. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import DomainModule -import DataModule -import NetworkModule -import CommonFeature +import BaseFeature +import LikeDomain +import LikeDomainInterface import SignInFeature import StorageFeature -//MARK: 변수명 주의 +// MARK: 변수명 주의 // AppComponent 내 변수 == Dependency 내 변수 이름 같아야함 - public extension AppComponent { - - - var remoteLikeDataSource: any RemoteLikeDataSource { shared { RemoteLikeDataSourceImpl(keychain: keychain) } } - + var likeRepository: any LikeRepository { shared { LikeRepositoryImpl(remoteLikeDataSource: remoteLikeDataSource) } } - - var fetchLikeNumOfSongUseCase: any FetchLikeNumOfSongUseCase { - - shared { - FetchLikeNumOfSongUseCaseImpl(likeRepository: likeRepository) - } - - - } - + var addLikeSongUseCase: any AddLikeSongUseCase { - shared { AddLikeSongUseCaseImpl(likeRepository: likeRepository) } - - } - + var cancelLikeSongUseCase: any CancelLikeSongUseCase { - shared { CancelLikeSongUseCaseImpl(likeRepository: likeRepository) } - - } - - - - } diff --git a/Projects/App/Sources/Application/AppComponent+MyInfo.swift b/Projects/App/Sources/Application/AppComponent+MyInfo.swift new file mode 100644 index 000000000..9535416f7 --- /dev/null +++ b/Projects/App/Sources/Application/AppComponent+MyInfo.swift @@ -0,0 +1,41 @@ +import Foundation +import MyInfoFeature +import MyInfoFeatureInterface + +extension AppComponent { + var myInfoFactory: any MyInfoFactory { + MyInfoComponent(parent: self) + } + + var settingFactory: any SettingFactory { + SettingComponent(parent: self) + } + + var openSourceLicenseFactory: any OpenSourceLicenseFactory { + OpenSourceLicenseComponent(parent: self) + } + + var questionFactory: any QuestionFactory { + QuestionComponent(parent: self) + } + + var faqFactory: any FaqFactory { + FaqComponent(parent: self) + } + + var faqContentFactory: any FaqContentFactory { + FaqContentComponent(parent: self) + } + + var serviceInfoFactory: any ServiceInfoFactory { + ServiceInfoComponent(parent: self) + } + + var profilePopupFactory: any ProfilePopupFactory { + ProfilePopupComponent(parent: self) + } + + var playTypeTogglePopupFactory: any PlayTypeTogglePopupFactory { + PlayTypeTogglePopupComponent(parent: self) + } +} diff --git a/Projects/App/Sources/Application/AppComponent+Notice.swift b/Projects/App/Sources/Application/AppComponent+Notice.swift index b5eccf7c4..3a4b64c28 100644 --- a/Projects/App/Sources/Application/AppComponent+Notice.swift +++ b/Projects/App/Sources/Application/AppComponent+Notice.swift @@ -1,52 +1,57 @@ -// -// AppComponent+Notice.swift -// WaktaverseMusic -// -// Created by KTH on 2023/04/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import DomainModule -import DataModule -import NetworkModule -import CommonFeature +import BaseFeature +import MainTabFeature +import MyInfoFeature +import MyInfoFeatureInterface +import NoticeDomain +import NoticeDomainInterface import StorageFeature public extension AppComponent { - var noticePopupComponent: NoticePopupComponent { NoticePopupComponent(parent: self) } - - var noticeComponent: NoticeComponent { + + var noticeFactory: any NoticeFactory { NoticeComponent(parent: self) } - var noticeDetailComponent: NoticeDetailComponent { + var noticeDetailFactory: any NoticeDetailFactory { NoticeDetailComponent(parent: self) } - + var remoteNoticeDataSource: any RemoteNoticeDataSource { shared { RemoteNoticeDataSourceImpl(keychain: keychain) } } - + var noticeRepository: any NoticeRepository { shared { NoticeRepositoryImpl(remoteNoticeDataSource: remoteNoticeDataSource) } } - - var fetchNoticeUseCase: any FetchNoticeUseCase{ + + var fetchNoticeAllUseCase: any FetchNoticeAllUseCase { + shared { + FetchNoticeAllUseCaseImpl(noticeRepository: noticeRepository) + } + } + + var fetchNoticePopupUseCase: any FetchNoticePopupUseCase { shared { - FetchNoticeUseCaseImpl(noticeRepository: noticeRepository) + FetchNoticePopupUseCaseImpl(noticeRepository: noticeRepository) } } - var fetchNoticeCategoriesUseCase: any FetchNoticeCategoriesUseCase{ + var fetchNoticeCategoriesUseCase: any FetchNoticeCategoriesUseCase { shared { FetchNoticeCategoriesUseCaseImpl(noticeRepository: noticeRepository) } } + + var fetchNoticeIDListUseCase: any FetchNoticeIDListUseCase { + shared { + FetchNoticeIDListUseCaseImpl(noticeRepository: noticeRepository) + } + } } diff --git a/Projects/App/Sources/Application/AppComponent+Notification.swift b/Projects/App/Sources/Application/AppComponent+Notification.swift new file mode 100644 index 000000000..d3bcd78c9 --- /dev/null +++ b/Projects/App/Sources/Application/AppComponent+Notification.swift @@ -0,0 +1,22 @@ +import NotificationDomain +import NotificationDomainInterface + +public extension AppComponent { + var remoteNotificationDataSource: any RemoteNotificationDataSource { + shared { + RemoteNotificationDataSourceImpl(keychain: keychain) + } + } + + var notificationRepository: any NotificationRepository { + shared { + NotificationRepositoryImpl(remoteNotificationDataSource: remoteNotificationDataSource) + } + } + + var updateNotificationTokenUseCase: any UpdateNotificationTokenUseCase { + shared { + UpdateNotificationTokenUseCaseImpl(notificationRepository: notificationRepository) + } + } +} diff --git a/Projects/App/Sources/Application/AppComponent+Play.swift b/Projects/App/Sources/Application/AppComponent+Play.swift deleted file mode 100644 index 5538a65a8..000000000 --- a/Projects/App/Sources/Application/AppComponent+Play.swift +++ /dev/null @@ -1,31 +0,0 @@ -// -// AppComponent+Play.swift -// WaktaverseMusic -// -// Created by KTH on 2023/08/27. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import DomainModule -import DataModule -import NetworkModule - -public extension AppComponent { - var remotePlayDataSource: any RemotePlayDataSource { - shared { - RemotePlayDataSourceImpl(keychain: keychain) - } - } - - var playRepository: any PlayRepository { - shared { - PlayRepositoryImpl(remotePlayDataSource:remotePlayDataSource) - } - } - - var postPlaybackLogUseCase: any PostPlaybackLogUseCase { - shared { - PostPlaybackLogUseCaseImpl(playRepository: playRepository) - } - } -} diff --git a/Projects/App/Sources/Application/AppComponent+Playlist.swift b/Projects/App/Sources/Application/AppComponent+Playlist.swift index c4a0208d8..cf39453fb 100644 --- a/Projects/App/Sources/Application/AppComponent+Playlist.swift +++ b/Projects/App/Sources/Application/AppComponent+Playlist.swift @@ -1,102 +1,148 @@ -// -// AppComponent+Search.swift -// WaktaverseMusic -// -// Created by yongbeomkwak on 2023/02/07. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import DomainModule -import DataModule -import NetworkModule -import SearchFeature -import CommonFeature +import BaseFeature +import BaseFeatureInterface +import ImageDomain +import ImageDomainInterface +import PlaylistDomain +import PlaylistDomainInterface +import PlaylistFeature +import PlaylistFeatureInterface import StorageFeature -//MARK: 변수명 주의 +// MARK: 변수명 주의 // AppComponent 내 변수 == Dependency 내 변수 이름 같아야함 -// public extension AppComponent { - - var beforeSearchComponent : BeforeSearchComponent { - BeforeSearchComponent(parent: self) + var playlistPresenterGlobalState: any PlayListPresenterGlobalStateProtocol { + shared { + PlayListPresenterGlobalState() + } + } + + var playlistDetailFactory: any PlaylistDetailFactory { + PlaylistDetailComponent(parent: self) + } + + var playlistFactory: any PlaylistFactory { + PlaylistComponent(parent: self) + } + + var myPlaylistDetailFactory: any MyPlaylistDetailFactory { + MyPlaylistDetailComponent(parent: self) + } + + var unknownPlaylistDetailFactory: any UnknownPlaylistDetailFactory { + UnknownPlaylistDetailComponent(parent: self) + } + + var wakmusicPlaylistDetailFactory: any WakmusicPlaylistDetailFactory { + WakmusicPlaylistDetailComponent(parent: self) } - - var playListDetailComponent: PlayListDetailComponent { - PlayListDetailComponent(parent: self) + + var playlistCoverOptionPopupFactory: any PlaylistCoverOptionPopupFactory { + PlaylistCoverOptionPopupComponent(parent: self) } - - var multiPurposePopComponent: MultiPurposePopComponent { - MultiPurposePopComponent(parent: self) + + var checkPlaylistCoverFactory: any CheckPlaylistCoverFactory { + CheckPlaylistCoverComponent(parent: self) } - - var myPlayListComponent: MyPlayListComponent { - MyPlayListComponent(parent:self) + + var defaultPlaylistCoverFactory: any DefaultPlaylistCoverFactory { + DefaultPlaylistCoverComponent(parent: self) } - - var containSongsComponent: ContainSongsComponent { - ContainSongsComponent(parent: self) + + var remotePlaylistDataSource: any RemotePlaylistDataSource { + shared { + RemotePlaylistDataSourceImpl(keychain: keychain) + } } - - var remotePlayListDataSource: any RemotePlayListDataSource { + + var playlistRepository: any PlaylistRepository { shared { - RemotePlayListDataSourceImpl(keychain: keychain) + PlaylistRepositoryImpl(remotePlaylistDataSource: remotePlaylistDataSource) } } - - var playListRepository: any PlayListRepository { + + var fetchRecommendPlaylistUseCase: any FetchRecommendPlaylistUseCase { shared { - PlayListRepositoryImpl(remotePlayListDataSource:remotePlayListDataSource) + FetchRecommendPlaylistUseCaseImpl(playlistRepository: playlistRepository) } } - - var fetchRecommendPlayListUseCase: any FetchRecommendPlayListUseCase { + + var fetchPlaylistSongsUseCase: any FetchPlaylistSongsUseCase { shared { - FetchRecommendPlayListUseCaseImpl(playListRepository: playListRepository) + FetchPlaylistSongsUseCaseImpl(playlistRepository: playlistRepository) } } - - var fetchPlayListDetailUseCase: any FetchPlayListDetailUseCase { - + + var fetchPlaylistDetailUseCase: any FetchPlaylistDetailUseCase { shared { - FetchPlayListDetailUseCaseImpl(playListRepository: playListRepository) + FetchPlaylistDetailUseCaseImpl(playlistRepository: playlistRepository) } } - - var createPlayListUseCase: any CreatePlayListUseCase { + + var fetchWMPlaylistDetailUseCase: any FetchWMPlaylistDetailUseCase { shared { - CreatePlayListUseCaseImpl(playListRepository: playListRepository) + FetchWMPlaylistDetailUseCaseImpl(playlistRepository: playlistRepository) } } - - var editPlayListUseCase: any EditPlayListUseCase { + + var createPlaylistUseCase: any CreatePlaylistUseCase { shared { - EditPlayListUseCaseImpl(playListRepository: playListRepository) + CreatePlaylistUseCaseImpl(playlistRepository: playlistRepository) } } - - var editPlayListNameUseCase: any EditPlayListNameUseCase { + + var updatePlaylistUseCase: any UpdatePlaylistUseCase { shared { - EditPlayListNameUseCaseImpl(playListRepository: playListRepository) + UpdatePlaylistUseCaseImpl(playlistRepository: playlistRepository) } } - - var loadPlayListUseCase: any LoadPlayListUseCase { + + var updateTitleAndPrivateUseCase: any UpdateTitleAndPrivateUseCase { shared { - LoadPlayListUseCaseImpl(playListRepository: playListRepository) + UpdateTitleAndPrivateUseCaseImpl(playlistRepository: playlistRepository) } } - - var addSongIntoPlayListUseCase: any AddSongIntoPlayListUseCase { + + var addSongIntoPlaylistUseCase: any AddSongIntoPlaylistUseCase { shared { - AddSongIntoPlayListUseCaseImpl(playListRepository: playListRepository) + AddSongIntoPlaylistUseCaseImpl(playlistRepository: playlistRepository) } } - + var removeSongsUseCase: any RemoveSongsUseCase { shared { - RemoveSongsUseCaseImpl(playListRepository: playListRepository) + RemoveSongsUseCaseImpl(playlistRepository: playlistRepository) + } + } + + var subscribePlaylistUseCase: any SubscribePlaylistUseCase { + shared { + SubscribePlaylistUseCaseImpl(playlistRepository: playlistRepository) + } + } + + var checkSubscriptionUseCase: any CheckSubscriptionUseCase { + shared { + CheckSubscriptionUseCaseImpl(playlistRepository: playlistRepository) + } + } + + var uploadDefaultPlaylistImageUseCase: any UploadDefaultPlaylistImageUseCase { + shared { + UploadDefaultPlaylistImageUseCaseImpl(playlistRepository: playlistRepository) + } + } + + var requestCustomImageURLUseCase: any RequestCustomImageURLUseCase { + shared { + RequestCustomImageURLUseCaseImpl(playlistRepository: playlistRepository) + } + } + + var requestPlaylistOwnerIDUsecase: any RequestPlaylistOwnerIDUsecase { + shared { + RequestPlaylistOwnerIDUsecaseImpl(playlistRepository: playlistRepository) } } } diff --git a/Projects/App/Sources/Application/AppComponent+Price.swift b/Projects/App/Sources/Application/AppComponent+Price.swift new file mode 100644 index 000000000..954208ac9 --- /dev/null +++ b/Projects/App/Sources/Application/AppComponent+Price.swift @@ -0,0 +1,29 @@ +import Foundation +import PriceDomain +import PriceDomainInterface + +extension AppComponent { + var remotePriceDataSource: any RemotePriceDataSource { + shared { + RemotePriceDataSourceImpl(keychain: keychain) + } + } + + var priceRepository: any PriceRepository { + shared { + PriceRepositoryImpl(remotePriceDataSource: remotePriceDataSource) + } + } + + var fetchPlaylistCreationPriceUseCase: any FetchPlaylistCreationPriceUseCase { + shared { + FetchPlaylistCreationPriceUseCaseImpl(priceRepository: priceRepository) + } + } + + var fetchPlaylistImagePriceUseCase: any FetchPlaylistImagePriceUseCase { + shared { + FetchPlaylistImagePriceUseCaseImpl(priceRepository: priceRepository) + } + } +} diff --git a/Projects/App/Sources/Application/AppComponent+Qna.swift b/Projects/App/Sources/Application/AppComponent+Qna.swift deleted file mode 100644 index 1c7399530..000000000 --- a/Projects/App/Sources/Application/AppComponent+Qna.swift +++ /dev/null @@ -1,52 +0,0 @@ -// -// AppComponent+Search.swift -// WaktaverseMusic -// -// Created by yongbeomkwak on 2023/02/07. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import DomainModule -import DataModule -import NetworkModule -import CommonFeature -import SignInFeature -import StorageFeature - -//MARK: 변수명 주의 -// AppComponent 내 변수 == Dependency 내 변수 이름 같아야함 - - -public extension AppComponent { - var qnaComponent: QnaComponent { - QnaComponent(parent: self) - } - - var qnaContentComponent: QnaContentComponent { - QnaContentComponent(parent: self) - } - - var remoteQnaDataSource: any RemoteQnaDataSource { - shared { - RemoteQnaDataSourceImpl(keychain: keychain) - } - } - - var qnaRepository: any QnaRepository { - shared { - QnaRepositoryImpl(remoteQnaDataSource: remoteQnaDataSource) - } - } - - var fetchQnaCategoriesUseCase: any FetchQnaCategoriesUseCase{ - shared { - FetchQnaCategoriesUseCaseImpl(qnaRepository: qnaRepository) - } - } - - var fetchQnaUseCase: any FetchQnaUseCase { - shared { - FetchQnaUseCaseImpl(qnaRepository: qnaRepository) - } - } -} diff --git a/Projects/App/Sources/Application/AppComponent+Search.swift b/Projects/App/Sources/Application/AppComponent+Search.swift new file mode 100644 index 000000000..08e8f8c20 --- /dev/null +++ b/Projects/App/Sources/Application/AppComponent+Search.swift @@ -0,0 +1,67 @@ +import Foundation +import SearchDomain +import SearchDomainInterface +import SearchFeature +import SearchFeatureInterface + +extension AppComponent { + var searchGlobalScrollState: any SearchGlobalScrollProtocol { + shared { + SearchGlobalScrollState() + } + } + + var searchFactory: any SearchFactory { + SearchComponent(parent: self) + } + + var beforeSearchComponent: BeforeSearchComponent { + BeforeSearchComponent(parent: self) + } + + var afterSearchComponent: AfterSearchComponent { + AfterSearchComponent(parent: self) + } + + var songSearchResultFactory: any SongSearchResultFactory { + SongSearchResultComponent(parent: self) + } + + var listSearchResultFactory: any ListSearchResultFactory { + ListSearchResultComponent(parent: self) + } + + var wakmusicRecommendComponent: WakmusicRecommendComponent { + WakmusicRecommendComponent(parent: self) + } + + var searchSortOptionComponent: SearchSortOptionComponent { + SearchSortOptionComponent(parent: self) + } + + // 도메인 영역 + + var remoteSearchDataSource: any RemoteSearchDataSource { + shared { + RemoteSearchDataSourceImpl(keychain: keychain) + } + } + + var searchRepository: any SearchRepository { + shared { + SearchRepositoryImpl(remoteSearchDataSource: remoteSearchDataSource) + } + } + + var fetchSearchSongsUseCase: any FetchSearchSongsUseCase { + shared { + FetchSearchSongsUseCaseImpl(searchRepository: searchRepository) + } + } + + var fetchSearchPlaylistsUseCase: any FetchSearchPlaylistsUseCase { + shared { + FetchSearchPlaylistsUseCaseImpl(searchRepository: searchRepository) + } + } +} diff --git a/Projects/App/Sources/Application/AppComponent+Songs.swift b/Projects/App/Sources/Application/AppComponent+Songs.swift index 795b82db8..b0f65f952 100644 --- a/Projects/App/Sources/Application/AppComponent+Songs.swift +++ b/Projects/App/Sources/Application/AppComponent+Songs.swift @@ -1,36 +1,32 @@ -// -// AppComponent+Search.swift -// WaktaverseMusic -// -// Created by yongbeomkwak on 2023/02/07. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import DomainModule -import DataModule -import NetworkModule -import SearchFeature +import BaseFeature import HomeFeature -import CommonFeature +import HomeFeatureInterface +import LyricHighlightingFeature +import LyricHighlightingFeatureInterface +import MusicDetailFeature +import MusicDetailFeatureInterface +import SongsDomain +import SongsDomainInterface public extension AppComponent { - - var searchComponent: SearchComponent { - SearchComponent(parent: self) + var songDetailPresenter: any SongDetailPresentable { + shared { + SongDetailPresenter() + } } - - var afterSearchComponent: AfterSearchComponent { - AfterSearchComponent(parent: self) + + var homeFactory: any HomeFactory { + HomeComponent(parent: self) } - - var afterSearchContentComponent: AfterSearchContentComponent { - AfterSearchContentComponent(parent: self) + + var musicDetailFactory: any MusicDetailFactory { + MusicDetailComponent(parent: self) } - - var homeComponent: HomeComponent { - HomeComponent(parent: self) + + var karaokeFactory: any KaraokeFactory { + KaraokeComponent(parent: self) } - + var newSongsComponent: NewSongsComponent { NewSongsComponent(parent: self) } @@ -39,32 +35,57 @@ public extension AppComponent { NewSongsContentComponent(parent: self) } + var lyricHighlightingFactory: any LyricHighlightingFactory { + LyricHighlightingComponent(parent: self) + } + + var lyricDecoratingComponent: LyricDecoratingComponent { + LyricDecoratingComponent(parent: self) + } + var remoteSongsDataSource: any RemoteSongsDataSource { shared { RemoteSongsDataSourceImpl(keychain: keychain) } } + var songsRepository: any SongsRepository { shared { - SongsRepositoryImpl(remoteSongsDataSource:remoteSongsDataSource) + SongsRepositoryImpl(remoteSongsDataSource: remoteSongsDataSource) } } - - var fetchSearchSongUseCase: any FetchSearchSongUseCase { + + var fetchSongUseCase: any FetchSongUseCase { shared { - FetchSearchSongUseCaseImpl(songsRepository: songsRepository) + FetchSongUseCaseImpl( + songsRepository: songsRepository, + likeRepository: likeRepository, + authRepository: authRepository + ) } } + var fetchLyricsUseCase: any FetchLyricsUseCase { - shared { FetchLyricsUseCaseImpl(songsRepository: songsRepository) } } - + var fetchNewSongsUseCase: any FetchNewSongsUseCase { shared { FetchNewSongsUseCaseImpl(songsRepository: songsRepository) } } + + var fetchNewSongsPlaylistUseCase: any FetchNewSongsPlaylistUseCase { + shared { + FetchNewSongsPlaylistUseCaseImpl(songsRepository: songsRepository) + } + } + + var fetchSongCreditsUseCase: any FetchSongCreditsUseCase { + shared { + FetchSongCreditsUseCaseImpl(songsRepository: songsRepository) + } + } } diff --git a/Projects/App/Sources/Application/AppComponent+Storage.swift b/Projects/App/Sources/Application/AppComponent+Storage.swift new file mode 100644 index 000000000..c753e5741 --- /dev/null +++ b/Projects/App/Sources/Application/AppComponent+Storage.swift @@ -0,0 +1,21 @@ +import BaseFeature +import BaseFeatureInterface +import StorageFeature +import StorageFeatureInterface + +// MARK: 변수명 주의 +// AppComponent 내 변수 == Dependency 내 변수 이름 같아야함 + +public extension AppComponent { + var storageFactory: any StorageFactory { + StorageComponent(parent: self) + } + + var listStorageComponent: ListStorageComponent { + ListStorageComponent(parent: self) + } + + var likeStorageComponent: LikeStorageComponent { + LikeStorageComponent(parent: self) + } +} diff --git a/Projects/App/Sources/Application/AppComponent+Suggest.swift b/Projects/App/Sources/Application/AppComponent+Suggest.swift deleted file mode 100644 index 9209b1328..000000000 --- a/Projects/App/Sources/Application/AppComponent+Suggest.swift +++ /dev/null @@ -1,62 +0,0 @@ -// -// AppComponent+Suggest.swift -// WaktaverseMusic -// -// Created by KTH on 2023/04/14. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import DomainModule -import DataModule -import NetworkModule -import CommonFeature -import StorageFeature - -public extension AppComponent { - var questionComponent: QuestionComponent { - QuestionComponent(parent: self) - } - var suggestFunctionComponent:SuggestFunctionComponent { - SuggestFunctionComponent(parent: self) - } - var wakMusicFeedbackComponent: WakMusicFeedbackComponent { - WakMusicFeedbackComponent(parent: self) - } - var askSongComponent: AskSongComponent { - AskSongComponent(parent: self) - } - var bugReportComponent: BugReportComponent { - BugReportComponent(parent: self) - } - - var remoteSuggestDataSource: any RemoteSuggestDataSource { - shared { - RemoteSuggestDataSourceImpl(keychain: keychain) - } - } - var suggestRepository: any SuggestRepository { - shared { - SuggestRepositoryImpl(remoteSuggestDataSource: remoteSuggestDataSource) - } - } - var reportBugUseCase: any ReportBugUseCase{ - shared { - ReportBugUseCaseImpl(suggestRepository: suggestRepository) - } - } - var suggestFunctionUseCase: any SuggestFunctionUseCase{ - shared { - SuggestFunctionUseCaseImpl(suggestRepository: suggestRepository) - } - } - var modifySongUseCase: any ModifySongUseCase{ - shared { - ModifySongUseCaseImpl(suggestRepository: suggestRepository) - } - } - var inquiryWeeklyChartUseCase: any InquiryWeeklyChartUseCase{ - shared { - InquiryWeeklyChartUseCaseImpl(suggestRepository: suggestRepository) - } - } -} diff --git a/Projects/App/Sources/Application/AppComponent+Team.swift b/Projects/App/Sources/Application/AppComponent+Team.swift new file mode 100644 index 000000000..c5c05fd94 --- /dev/null +++ b/Projects/App/Sources/Application/AppComponent+Team.swift @@ -0,0 +1,28 @@ +import TeamDomain +import TeamDomainInterface +import TeamFeature +import TeamFeatureInterface + +public extension AppComponent { + var teamInfoFactory: any TeamInfoFactory { + TeamInfoComponent(parent: self) + } + + var remoteTeamDataSource: any RemoteTeamDataSource { + shared { + RemoteTeamDataSourceImpl(keychain: keychain) + } + } + + var teamRepository: any TeamRepository { + shared { + TeamRepositoryImpl(remoteTeamDataSource: remoteTeamDataSource) + } + } + + var fetchTeamListUseCase: any FetchTeamListUseCase { + shared { + FetchTeamListUseCaseImpl(teamRepository: teamRepository) + } + } +} diff --git a/Projects/App/Sources/Application/AppComponent+User.swift b/Projects/App/Sources/Application/AppComponent+User.swift index 773bd9517..cdf8a4b02 100644 --- a/Projects/App/Sources/Application/AppComponent+User.swift +++ b/Projects/App/Sources/Application/AppComponent+User.swift @@ -1,96 +1,100 @@ -// -// AppComponent+Search.swift -// WaktaverseMusic -// -// Created by yongbeomkwak on 2023/02/07. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import DomainModule -import DataModule -import NetworkModule -import CommonFeature +import BaseFeature import SignInFeature import StorageFeature +import UserDomain +import UserDomainInterface -//MARK: 변수명 주의 +// MARK: 변수명 주의 // AppComponent 내 변수 == Dependency 내 변수 이름 같아야함 - public extension AppComponent { - - var profilePopComponent: ProfilePopComponent { - ProfilePopComponent(parent: self) - } - - var favoriteComponent: FavoriteComponent { - FavoriteComponent(parent: self) - } - var remoteUserDataSource: any RemoteUserDataSource { shared { RemoteUserDataSourceImpl(keychain: keychain) } } - + var userRepository: any UserRepository { shared { UserRepositoryImpl(remoteUserDataSource: remoteUserDataSource) } } - - var fetchProfileListUseCase: any FetchProfileListUseCase{ - shared { - FetchProfileListUseCaseImpl(userRepository: userRepository) - } - } - + var setProfileUseCase: any SetProfileUseCase { shared { SetProfileUseCaseImpl(userRepository: userRepository) } } - + var setUserNameUseCase: any SetUserNameUseCase { - shared{ + shared { SetUserNameUseCaseImpl(userRepository: userRepository) } } - - var fetchPlayListUseCase: any FetchPlayListUseCase { + + var fetchPlayListUseCase: any FetchPlaylistUseCase { shared { - FetchPlayListUseCaseImpl(userRepository: userRepository) + FetchPlaylistUseCaseImpl(userRepository: userRepository) } - } - + var fetchFavoriteSongsUseCase: any FetchFavoriteSongsUseCase { shared { FetchFavoriteSongsUseCaseImpl(userRepository: userRepository) } } - + var editFavoriteSongsOrderUseCase: any EditFavoriteSongsOrderUseCase { shared { EditFavoriteSongsOrderUseCaseImpl(userRepository: userRepository) } } - - var editPlayListOrderUseCase: any EditPlayListOrderUseCase { + + var editPlayListOrderUseCase: any EditPlaylistOrderUseCase { shared { - EditPlayListOrderUseCaseImpl(userRepository: userRepository) + EditPlaylistOrderUseCaseImpl(userRepository: userRepository) } } - - var deletePlayListUseCase: any DeletePlayListUseCase { + + var deletePlayListUseCase: any DeletePlaylistUseCase { shared { - DeletePlayListUseCaseImpl(userRepository: userRepository) + DeletePlaylistUseCaseImpl(userRepository: userRepository) } } - + var deleteFavoriteListUseCase: any DeleteFavoriteListUseCase { shared { DeleteFavoriteListUseCaseImpl(userRepository: userRepository) } } + + var fetchUserInfoUseCase: any FetchUserInfoUseCase { + shared { + FetchUserInfoUseCaseImpl(userRepository: userRepository) + } + } + + var withdrawUserInfoUseCase: any WithdrawUserInfoUseCase { + shared { + WithdrawUserInfoUseCaseImpl(userRepository: userRepository) + } + } + + var fetchFruitListUseCase: any FetchFruitListUseCase { + shared { + FetchFruitListUseCaseImpl(userRepository: userRepository) + } + } + + var fetchFruitDrawStatusUseCase: any FetchFruitDrawStatusUseCase { + shared { + FetchFruitDrawStatusUseCaseImpl(userRepository: userRepository) + } + } + + var drawFruitUseCase: any DrawFruitUseCase { + shared { + DrawFruitUseCaseImpl(userRepository: userRepository) + } + } } diff --git a/Projects/App/Sources/Application/AppComponent.swift b/Projects/App/Sources/Application/AppComponent.swift index de543e09f..d0434b55b 100644 --- a/Projects/App/Sources/Application/AppComponent.swift +++ b/Projects/App/Sources/Application/AppComponent.swift @@ -1,24 +1,24 @@ +import BaseFeature import Foundation -import UIKit +import KeychainModule +import MainTabFeature +import MyInfoFeature import NeedleFoundation -import PlayerFeature import RootFeature -import MainTabFeature -import CommonFeature -import KeychainModule import StorageFeature +import UIKit public final class AppComponent: BootstrapComponent { public func makeRootView() -> IntroViewController { rootComponent.makeView() } - + public var keychain: any Keychain { shared { KeychainImpl() } } - + var rootComponent: RootComponent { shared { RootComponent(parent: self) @@ -31,7 +31,7 @@ public extension AppComponent { var mainContainerComponent: MainContainerComponent { MainContainerComponent(parent: self) } - + var bottomTabBarComponent: BottomTabBarComponent { BottomTabBarComponent(parent: self) } @@ -39,29 +39,16 @@ public extension AppComponent { var mainTabBarComponent: MainTabBarComponent { MainTabBarComponent(parent: self) } -} -// MARK: - Player -public extension AppComponent { - var playerComponent: PlayerComponent { - PlayerComponent(parent: self) - } - - var playlistComponent: PlaylistComponent { - PlaylistComponent(parent: self) + var appEntryState: any AppEntryStateHandleable { + shared { + AppEntryState() + } } } // MARK: - ETC public extension AppComponent { - var openSourceLicenseComponent: OpenSourceLicenseComponent { - OpenSourceLicenseComponent(parent: self) - } - - var serviceInfoComponent: ServiceInfoComponent { - ServiceInfoComponent(parent: self) - } - var permissionComponent: PermissionComponent { PermissionComponent(parent: self) } diff --git a/Projects/App/Sources/Application/AppDelegate.swift b/Projects/App/Sources/Application/AppDelegate.swift index 904031cbc..162350f4b 100644 --- a/Projects/App/Sources/Application/AppDelegate.swift +++ b/Projects/App/Sources/Application/AppDelegate.swift @@ -1,54 +1,47 @@ -import UIKit -import RootFeature -import NaverThirdPartyLogin import AVKit -import Utility -import FirebaseCore +import BaseFeature import FirebaseAnalytics +import FirebaseCore import FirebaseCrashlytics +import FirebaseMessaging +import LogManager +import NaverThirdPartyLogin import RealmSwift -//import Amplify -//import AWSCognitoAuthPlugin -//import AWSS3StoragePlugin +import RootFeature +import UIKit +import Utility @main -class AppDelegate: UIResponder, UIApplicationDelegate { - - func application(_ application: UIApplication, - didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { - // Override point for customization after application launch. - +final class AppDelegate: UIResponder, UIApplicationDelegate { + func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { // Use Firebase library to configure APIs FirebaseApp.configure() + if let userInfo = PreferenceManager.userInfo { + LogManager.setUserID(userID: userInfo.decryptedID) + } else { + LogManager.setUserID(userID: nil) + } + initializeUserProperty() + Analytics.logEvent(AnalyticsEventAppOpen, parameters: nil) // configure NaverThirdPartyLoginConnection let naverInstance = NaverThirdPartyLoginConnection.getSharedInstance() - naverInstance?.isNaverAppOauthEnable = true //네이버앱 로그인 설정 - naverInstance?.isInAppOauthEnable = true //사파리 로그인 설정 + naverInstance?.isNaverAppOauthEnable = true // 네이버앱 로그인 설정 + naverInstance?.isInAppOauthEnable = true // 사파리 로그인 설정 naverInstance?.setOnlyPortraitSupportInIphone(true) - - naverInstance?.serviceUrlScheme = NAVER_URL_SCHEME() //URL Scheme - naverInstance?.consumerKey = NAVER_CONSUMER_KEY() //클라이언트 아이디 - naverInstance?.consumerSecret = NAVER_CONSUMER_SECRET() //시크릿 아이디 - naverInstance?.appName = NAVER_APP_NAME() //앱이름 - - //Amplify -// do { -// try Amplify.add(plugin: AWSCognitoAuthPlugin()) -// try Amplify.add(plugin: AWSS3StoragePlugin()) -// try Amplify.configure() -// DEBUG_LOG("Amplify configured with Auth and Storage plugins") -// } catch { -// DEBUG_LOG("Failed to initialize Amplify with \(error)") -// } - - //Realm register - RealmManager.shared.register() + + naverInstance?.serviceUrlScheme = NAVER_URL_SCHEME() // URL Scheme + naverInstance?.consumerKey = NAVER_CONSUMER_KEY() // 클라이언트 아이디 + naverInstance?.consumerSecret = NAVER_CONSUMER_SECRET() // 시크릿 아이디 + naverInstance?.appName = NAVER_APP_NAME() // 앱이름 return true } - + func application( _ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, @@ -60,9 +53,102 @@ class AppDelegate: UIResponder, UIApplicationDelegate { func application( _ application: UIApplication, didDiscardSceneSessions sceneSessions: Set + ) {} +} + +extension AppDelegate { + /// [START receive_message] + func application( + _ application: UIApplication, + didReceiveRemoteNotification userInfo: [AnyHashable: Any] + ) async -> UIBackgroundFetchResult { + // If you are receiving a notification message while your app is in the background, + // this callback will not be fired till the user taps on the notification launching the application. + + // With swizzling disabled you must let Messaging know about the message, for Analytics + Messaging.messaging().appDidReceiveMessage(userInfo) + + // Print full message. + LogManager.printDebug("🔔:: \(userInfo)") + + return UIBackgroundFetchResult.newData + } + + // [END receive_message] + + func application( + _ application: UIApplication, + didFailToRegisterForRemoteNotificationsWithError error: Error + ) { + LogManager.printDebug("🔔:: Unable to register for remote notifications: \(error.localizedDescription)") + } + + /// This function is added here only for debugging purposes, and can be removed if swizzling is enabled. + /// If swizzling is disabled then this function must be implemented so that the APNs token can be paired to + /// the FCM registration token. + func application( + _ application: UIApplication, + didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data ) { + let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined() + LogManager.printDebug("🔔:: APNs token retrieved: \(token)") + // With swizzling disabled you must set the APNs token here. + Messaging.messaging().apnsToken = deviceToken + Messaging.messaging().token { token, error in + if let error = error { + LogManager.printError("🔔:: Messaging.messaging().token: \(error.localizedDescription)") + } else if let token = token { + LogManager.printDebug("🔔:: Messaging.messaging().token: \(token)") + } + } } - + private func initializeUserProperty() { + if let loginPlatform = PreferenceManager.userInfo?.platform { + LogManager.setUserProperty(property: .loginPlatform(platform: loginPlatform)) + } else { + LogManager.clearUserProperty(property: .loginPlatform(platform: "")) + } + + if let fruitTotal = PreferenceManager.userInfo?.itemCount { + LogManager.setUserProperty(property: .fruitTotal(count: fruitTotal)) + } else { + LogManager.clearUserProperty(property: .fruitTotal(count: -1)) + } + + if let playPlatform = PreferenceManager.songPlayPlatformType { + LogManager.setUserProperty(property: .songPlayPlatform(platform: playPlatform.display)) + } + + LogManager.setUserProperty(property: .playlistSongTotal(count: PlayState.shared.count)) + } } + +#if DEBUG || QA + extension UIWindow { + override open func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?) { + super.motionEnded(motion, with: event) + switch motion { + case .motionShake: + let topViewController = UIApplication.shared.connectedScenes + .compactMap { $0 as? UIWindowScene } + .filter { $0.activationState == .foregroundActive } + .first? + .keyWindow? + .rootViewController + guard let topViewController else { break } + let logHistoryViewController = UINavigationController(rootViewController: LogHistoryViewController()) + if let nav = topViewController as? UINavigationController, + !(nav.visibleViewController is LogHistoryViewController) { + nav.visibleViewController?.present(logHistoryViewController, animated: true) + } else if !(topViewController is LogHistoryViewController) { + topViewController.present(logHistoryViewController, animated: true) + } + + default: + break + } + } + } +#endif diff --git a/Projects/App/Sources/Application/NeedleGenerated.swift b/Projects/App/Sources/Application/NeedleGenerated.swift deleted file mode 100644 index d3ebb2ff1..000000000 --- a/Projects/App/Sources/Application/NeedleGenerated.swift +++ /dev/null @@ -1,1245 +0,0 @@ - - -import ArtistFeature -import BaseFeature -import ChartFeature -import CommonFeature -import DataMappingModule -import DataModule -import DesignSystem -import DomainModule -import Foundation -import HomeFeature -import KeychainModule -import MainTabFeature -import NeedleFoundation -import NetworkModule -import PanModal -import PlayerFeature -import RootFeature -import RxCocoa -import RxKeyboard -import RxSwift -import SearchFeature -import SignInFeature -import SnapKit -import StorageFeature -import UIKit -import Utility - -// swiftlint:disable unused_declaration -private let needleDependenciesHash : String? = nil - -// MARK: - Traversal Helpers - -private func parent1(_ component: NeedleFoundation.Scope) -> NeedleFoundation.Scope { - return component.parent -} - -// MARK: - Providers - -#if !NEEDLE_DYNAMIC - -private class ArtistDependency132a213bf62ad60c622cProvider: ArtistDependency { - var fetchArtistListUseCase: any FetchArtistListUseCase { - return appComponent.fetchArtistListUseCase - } - var artistDetailComponent: ArtistDetailComponent { - return appComponent.artistDetailComponent - } - private let appComponent: AppComponent - init(appComponent: AppComponent) { - self.appComponent = appComponent - } -} -/// ^->AppComponent->ArtistComponent -private func factorye0c5444f5894148bdd93f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { - return ArtistDependency132a213bf62ad60c622cProvider(appComponent: parent1(component) as! AppComponent) -} -private class ArtistDetailDependencyee413dcf7a70e89df6d9Provider: ArtistDetailDependency { - var artistMusicComponent: ArtistMusicComponent { - return appComponent.artistMusicComponent - } - private let appComponent: AppComponent - init(appComponent: AppComponent) { - self.appComponent = appComponent - } -} -/// ^->AppComponent->ArtistDetailComponent -private func factory35314797fadaf164ece6f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { - return ArtistDetailDependencyee413dcf7a70e89df6d9Provider(appComponent: parent1(component) as! AppComponent) -} -private class ArtistMusicContentDependency1615ac8469e54ec51921Provider: ArtistMusicContentDependency { - var fetchArtistSongListUseCase: any FetchArtistSongListUseCase { - return appComponent.fetchArtistSongListUseCase - } - var containSongsComponent: ContainSongsComponent { - return appComponent.containSongsComponent - } - private let appComponent: AppComponent - init(appComponent: AppComponent) { - self.appComponent = appComponent - } -} -/// ^->AppComponent->ArtistMusicContentComponent -private func factory8b6ffa46033e2529b5daf47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { - return ArtistMusicContentDependency1615ac8469e54ec51921Provider(appComponent: parent1(component) as! AppComponent) -} -private class ArtistMusicDependencya0f5073287829dfbc260Provider: ArtistMusicDependency { - var artistMusicContentComponent: ArtistMusicContentComponent { - return appComponent.artistMusicContentComponent - } - private let appComponent: AppComponent - init(appComponent: AppComponent) { - self.appComponent = appComponent - } -} -/// ^->AppComponent->ArtistMusicComponent -private func factory382e7f8466df35a3f1d9f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { - return ArtistMusicDependencya0f5073287829dfbc260Provider(appComponent: parent1(component) as! AppComponent) -} -private class PlaylistDependency6f376d117dc0f38671edProvider: PlaylistDependency { - var containSongsComponent: ContainSongsComponent { - return appComponent.containSongsComponent - } - private let appComponent: AppComponent - init(appComponent: AppComponent) { - self.appComponent = appComponent - } -} -/// ^->AppComponent->PlaylistComponent -private func factory3a0a6eb1061d8d5a2deff47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { - return PlaylistDependency6f376d117dc0f38671edProvider(appComponent: parent1(component) as! AppComponent) -} -private class PlayerDependencyf8a3d594cc3b9254f8adProvider: PlayerDependency { - var fetchLyricsUseCase: any FetchLyricsUseCase { - return appComponent.fetchLyricsUseCase - } - var addLikeSongUseCase: any AddLikeSongUseCase { - return appComponent.addLikeSongUseCase - } - var cancelLikeSongUseCase: any CancelLikeSongUseCase { - return appComponent.cancelLikeSongUseCase - } - var fetchLikeNumOfSongUseCase: any FetchLikeNumOfSongUseCase { - return appComponent.fetchLikeNumOfSongUseCase - } - var fetchFavoriteSongsUseCase: any FetchFavoriteSongsUseCase { - return appComponent.fetchFavoriteSongsUseCase - } - var postPlaybackLogUseCase: any PostPlaybackLogUseCase { - return appComponent.postPlaybackLogUseCase - } - var playlistComponent: PlaylistComponent { - return appComponent.playlistComponent - } - var containSongsComponent: ContainSongsComponent { - return appComponent.containSongsComponent - } - private let appComponent: AppComponent - init(appComponent: AppComponent) { - self.appComponent = appComponent - } -} -/// ^->AppComponent->PlayerComponent -private func factorybc7f802f601dd5913533f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { - return PlayerDependencyf8a3d594cc3b9254f8adProvider(appComponent: parent1(component) as! AppComponent) -} -private class MainTabBarDependencycd05b79389a6a7a6c20fProvider: MainTabBarDependency { - var fetchNoticeUseCase: any FetchNoticeUseCase { - return appComponent.fetchNoticeUseCase - } - var homeComponent: HomeComponent { - return appComponent.homeComponent - } - var chartComponent: ChartComponent { - return appComponent.chartComponent - } - var searchComponent: SearchComponent { - return appComponent.searchComponent - } - var artistComponent: ArtistComponent { - return appComponent.artistComponent - } - var storageComponent: StorageComponent { - return appComponent.storageComponent - } - var noticePopupComponent: NoticePopupComponent { - return appComponent.noticePopupComponent - } - var noticeComponent: NoticeComponent { - return appComponent.noticeComponent - } - var noticeDetailComponent: NoticeDetailComponent { - return appComponent.noticeDetailComponent - } - private let appComponent: AppComponent - init(appComponent: AppComponent) { - self.appComponent = appComponent - } -} -/// ^->AppComponent->MainTabBarComponent -private func factorye547a52b3fce5887c8c7f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { - return MainTabBarDependencycd05b79389a6a7a6c20fProvider(appComponent: parent1(component) as! AppComponent) -} -private class BottomTabBarDependency237c2bd1c7be62020295Provider: BottomTabBarDependency { - - - init() { - - } -} -/// ^->AppComponent->BottomTabBarComponent -private func factoryd34fa9e493604a6295bde3b0c44298fc1c149afb(_ component: NeedleFoundation.Scope) -> AnyObject { - return BottomTabBarDependency237c2bd1c7be62020295Provider() -} -private class MainContainerDependencyd9d908a1d0cf8937bbadProvider: MainContainerDependency { - var bottomTabBarComponent: BottomTabBarComponent { - return appComponent.bottomTabBarComponent - } - var mainTabBarComponent: MainTabBarComponent { - return appComponent.mainTabBarComponent - } - var playerComponent: PlayerComponent { - return appComponent.playerComponent - } - private let appComponent: AppComponent - init(appComponent: AppComponent) { - self.appComponent = appComponent - } -} -/// ^->AppComponent->MainContainerComponent -private func factory8e19f48d5d573d3ea539f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { - return MainContainerDependencyd9d908a1d0cf8937bbadProvider(appComponent: parent1(component) as! AppComponent) -} -private class ChartDependencyafd8882010751c9ef054Provider: ChartDependency { - var chartContentComponent: ChartContentComponent { - return appComponent.chartContentComponent - } - private let appComponent: AppComponent - init(appComponent: AppComponent) { - self.appComponent = appComponent - } -} -/// ^->AppComponent->ChartComponent -private func factoryeac6a4df54bbd391d31bf47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { - return ChartDependencyafd8882010751c9ef054Provider(appComponent: parent1(component) as! AppComponent) -} -private class ChartContentDependency3b8e41cfba060e4d16caProvider: ChartContentDependency { - var fetchChartRankingUseCase: any FetchChartRankingUseCase { - return appComponent.fetchChartRankingUseCase - } - var fetchChartUpdateTimeUseCase: any FetchChartUpdateTimeUseCase { - return appComponent.fetchChartUpdateTimeUseCase - } - var containSongsComponent: ContainSongsComponent { - return appComponent.containSongsComponent - } - private let appComponent: AppComponent - init(appComponent: AppComponent) { - self.appComponent = appComponent - } -} -/// ^->AppComponent->ChartContentComponent -private func factoryc9a137630ce76907f36ff47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { - return ChartContentDependency3b8e41cfba060e4d16caProvider(appComponent: parent1(component) as! AppComponent) -} -private class AskSongDependency02772625c56a0dda0140Provider: AskSongDependency { - var modifySongUseCase: any ModifySongUseCase { - return appComponent.modifySongUseCase - } - private let appComponent: AppComponent - init(appComponent: AppComponent) { - self.appComponent = appComponent - } -} -/// ^->AppComponent->AskSongComponent -private func factory37544fa026b309cd68d7f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { - return AskSongDependency02772625c56a0dda0140Provider(appComponent: parent1(component) as! AppComponent) -} -private class SuggestFunctionDependency229560bbe33097b02547Provider: SuggestFunctionDependency { - var suggestFunctionUseCase: any SuggestFunctionUseCase { - return appComponent.suggestFunctionUseCase - } - private let appComponent: AppComponent - init(appComponent: AppComponent) { - self.appComponent = appComponent - } -} -/// ^->AppComponent->SuggestFunctionComponent -private func factory63287bff3999ed1787ddf47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { - return SuggestFunctionDependency229560bbe33097b02547Provider(appComponent: parent1(component) as! AppComponent) -} -private class StorageDependency1447167c38e97ef97427Provider: StorageDependency { - var signInComponent: SignInComponent { - return appComponent.signInComponent - } - var afterLoginComponent: AfterLoginComponent { - return appComponent.afterLoginComponent - } - private let appComponent: AppComponent - init(appComponent: AppComponent) { - self.appComponent = appComponent - } -} -/// ^->AppComponent->StorageComponent -private func factory2415399d25299b97b98bf47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { - return StorageDependency1447167c38e97ef97427Provider(appComponent: parent1(component) as! AppComponent) -} -private class QuestionDependencyf7010567c2d88e76d191Provider: QuestionDependency { - var suggestFunctionComponent: SuggestFunctionComponent { - return appComponent.suggestFunctionComponent - } - var wakMusicFeedbackComponent: WakMusicFeedbackComponent { - return appComponent.wakMusicFeedbackComponent - } - var askSongComponent: AskSongComponent { - return appComponent.askSongComponent - } - var bugReportComponent: BugReportComponent { - return appComponent.bugReportComponent - } - private let appComponent: AppComponent - init(appComponent: AppComponent) { - self.appComponent = appComponent - } -} -/// ^->AppComponent->QuestionComponent -private func factoryedad1813a36115eec11ef47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { - return QuestionDependencyf7010567c2d88e76d191Provider(appComponent: parent1(component) as! AppComponent) -} -private class MyPlayListDependency067bbf42b28f80e413acProvider: MyPlayListDependency { - var multiPurposePopComponent: MultiPurposePopComponent { - return appComponent.multiPurposePopComponent - } - var playListDetailComponent: PlayListDetailComponent { - return appComponent.playListDetailComponent - } - var fetchPlayListUseCase: any FetchPlayListUseCase { - return appComponent.fetchPlayListUseCase - } - var editPlayListOrderUseCase: any EditPlayListOrderUseCase { - return appComponent.editPlayListOrderUseCase - } - var deletePlayListUseCase: any DeletePlayListUseCase { - return appComponent.deletePlayListUseCase - } - private let appComponent: AppComponent - init(appComponent: AppComponent) { - self.appComponent = appComponent - } -} -/// ^->AppComponent->MyPlayListComponent -private func factory51a57a92f76af93a9ec2f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { - return MyPlayListDependency067bbf42b28f80e413acProvider(appComponent: parent1(component) as! AppComponent) -} -private class AfterLoginDependencya880b76858e0a77ed700Provider: AfterLoginDependency { - var fetchUserInfoUseCase: any FetchUserInfoUseCase { - return appComponent.fetchUserInfoUseCase - } - var requestComponent: RequestComponent { - return appComponent.requestComponent - } - var profilePopComponent: ProfilePopComponent { - return appComponent.profilePopComponent - } - var myPlayListComponent: MyPlayListComponent { - return appComponent.myPlayListComponent - } - var multiPurposePopComponent: MultiPurposePopComponent { - return appComponent.multiPurposePopComponent - } - var favoriteComponent: FavoriteComponent { - return appComponent.favoriteComponent - } - private let appComponent: AppComponent - init(appComponent: AppComponent) { - self.appComponent = appComponent - } -} -/// ^->AppComponent->AfterLoginComponent -private func factory6cc9c8141e04494113b8f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { - return AfterLoginDependencya880b76858e0a77ed700Provider(appComponent: parent1(component) as! AppComponent) -} -private class FavoriteDependency8f7fd37aeb6f0e5d0e30Provider: FavoriteDependency { - var containSongsComponent: ContainSongsComponent { - return appComponent.containSongsComponent - } - var fetchFavoriteSongsUseCase: any FetchFavoriteSongsUseCase { - return appComponent.fetchFavoriteSongsUseCase - } - var editFavoriteSongsOrderUseCase: any EditFavoriteSongsOrderUseCase { - return appComponent.editFavoriteSongsOrderUseCase - } - var deleteFavoriteListUseCase: any DeleteFavoriteListUseCase { - return appComponent.deleteFavoriteListUseCase - } - private let appComponent: AppComponent - init(appComponent: AppComponent) { - self.appComponent = appComponent - } -} -/// ^->AppComponent->FavoriteComponent -private func factory8e4acb90bd0d9b48604af47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { - return FavoriteDependency8f7fd37aeb6f0e5d0e30Provider(appComponent: parent1(component) as! AppComponent) -} -private class QnaDependencybc3f0a2d4f873ad1b160Provider: QnaDependency { - var qnaContentComponent: QnaContentComponent { - return appComponent.qnaContentComponent - } - var fetchQnaCategoriesUseCase: any FetchQnaCategoriesUseCase { - return appComponent.fetchQnaCategoriesUseCase - } - var fetchQnaUseCase: any FetchQnaUseCase { - return appComponent.fetchQnaUseCase - } - private let appComponent: AppComponent - init(appComponent: AppComponent) { - self.appComponent = appComponent - } -} -/// ^->AppComponent->QnaComponent -private func factory49a98666675cb7a82038f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { - return QnaDependencybc3f0a2d4f873ad1b160Provider(appComponent: parent1(component) as! AppComponent) -} -private class RequestDependencyd4f6f0030dbf2a90cf21Provider: RequestDependency { - var withdrawUserInfoUseCase: any WithdrawUserInfoUseCase { - return appComponent.withdrawUserInfoUseCase - } - var qnaComponent: QnaComponent { - return appComponent.qnaComponent - } - var questionComponent: QuestionComponent { - return appComponent.questionComponent - } - var containSongsComponent: ContainSongsComponent { - return appComponent.containSongsComponent - } - var noticeComponent: NoticeComponent { - return appComponent.noticeComponent - } - var serviceInfoComponent: ServiceInfoComponent { - return appComponent.serviceInfoComponent - } - private let appComponent: AppComponent - init(appComponent: AppComponent) { - self.appComponent = appComponent - } -} -/// ^->AppComponent->RequestComponent -private func factory13954fb3ec537bab80bcf47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { - return RequestDependencyd4f6f0030dbf2a90cf21Provider(appComponent: parent1(component) as! AppComponent) -} -private class NoticeDetailDependency714af3aed40eaebda420Provider: NoticeDetailDependency { - - - init() { - - } -} -/// ^->AppComponent->NoticeDetailComponent -private func factory3db143c2f80d621d5a7fe3b0c44298fc1c149afb(_ component: NeedleFoundation.Scope) -> AnyObject { - return NoticeDetailDependency714af3aed40eaebda420Provider() -} -private class NoticeDependencyaec92ef53617a421bdf3Provider: NoticeDependency { - var fetchNoticeUseCase: any FetchNoticeUseCase { - return appComponent.fetchNoticeUseCase - } - var noticeDetailComponent: NoticeDetailComponent { - return appComponent.noticeDetailComponent - } - private let appComponent: AppComponent - init(appComponent: AppComponent) { - self.appComponent = appComponent - } -} -/// ^->AppComponent->NoticeComponent -private func factoryaf8e5665e5b9217918f5f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { - return NoticeDependencyaec92ef53617a421bdf3Provider(appComponent: parent1(component) as! AppComponent) -} -private class QnaContentDependency68ed55648233d525d265Provider: QnaContentDependency { - - - init() { - - } -} -/// ^->AppComponent->QnaContentComponent -private func factory1501f7005831c8411229e3b0c44298fc1c149afb(_ component: NeedleFoundation.Scope) -> AnyObject { - return QnaContentDependency68ed55648233d525d265Provider() -} -private class BugReportDependencyeea5818852f336c35729Provider: BugReportDependency { - var reportBugUseCase: any ReportBugUseCase { - return appComponent.reportBugUseCase - } - private let appComponent: AppComponent - init(appComponent: AppComponent) { - self.appComponent = appComponent - } -} -/// ^->AppComponent->BugReportComponent -private func factoryafa28e93c96a785ed32af47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { - return BugReportDependencyeea5818852f336c35729Provider(appComponent: parent1(component) as! AppComponent) -} -private class WakMusicFeedbackDependency8d09739bdcd24807ec82Provider: WakMusicFeedbackDependency { - var inquiryWeeklyChartUseCase: any InquiryWeeklyChartUseCase { - return appComponent.inquiryWeeklyChartUseCase - } - private let appComponent: AppComponent - init(appComponent: AppComponent) { - self.appComponent = appComponent - } -} -/// ^->AppComponent->WakMusicFeedbackComponent -private func factory32abe9db091bc43329a1f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { - return WakMusicFeedbackDependency8d09739bdcd24807ec82Provider(appComponent: parent1(component) as! AppComponent) -} -private class RootDependency3944cc797a4a88956fb5Provider: RootDependency { - var mainContainerComponent: MainContainerComponent { - return appComponent.mainContainerComponent - } - var permissionComponent: PermissionComponent { - return appComponent.permissionComponent - } - var fetchUserInfoUseCase: any FetchUserInfoUseCase { - return appComponent.fetchUserInfoUseCase - } - var fetchCheckAppUseCase: any FetchCheckAppUseCase { - return appComponent.fetchCheckAppUseCase - } - private let appComponent: AppComponent - init(appComponent: AppComponent) { - self.appComponent = appComponent - } -} -/// ^->AppComponent->RootComponent -private func factory264bfc4d4cb6b0629b40f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { - return RootDependency3944cc797a4a88956fb5Provider(appComponent: parent1(component) as! AppComponent) -} -private class PermissionDependency517ed7598d8c08817d14Provider: PermissionDependency { - - - init() { - - } -} -/// ^->AppComponent->PermissionComponent -private func factoryc1d4d80afbccf86bf1c0e3b0c44298fc1c149afb(_ component: NeedleFoundation.Scope) -> AnyObject { - return PermissionDependency517ed7598d8c08817d14Provider() -} -private class SignInDependency5dda0dd015447272446cProvider: SignInDependency { - var fetchTokenUseCase: any FetchTokenUseCase { - return appComponent.fetchTokenUseCase - } - var fetchNaverUserInfoUseCase: any FetchNaverUserInfoUseCase { - return appComponent.fetchNaverUserInfoUseCase - } - var fetchUserInfoUseCase: any FetchUserInfoUseCase { - return appComponent.fetchUserInfoUseCase - } - private let appComponent: AppComponent - init(appComponent: AppComponent) { - self.appComponent = appComponent - } -} -/// ^->AppComponent->SignInComponent -private func factoryda2925fd76da866a652af47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { - return SignInDependency5dda0dd015447272446cProvider(appComponent: parent1(component) as! AppComponent) -} -private class HomeDependency443c4e1871277bd8432aProvider: HomeDependency { - var fetchChartRankingUseCase: any FetchChartRankingUseCase { - return appComponent.fetchChartRankingUseCase - } - var fetchNewSongsUseCase: any FetchNewSongsUseCase { - return appComponent.fetchNewSongsUseCase - } - var fetchRecommendPlayListUseCase: any FetchRecommendPlayListUseCase { - return appComponent.fetchRecommendPlayListUseCase - } - var playListDetailComponent: PlayListDetailComponent { - return appComponent.playListDetailComponent - } - var newSongsComponent: NewSongsComponent { - return appComponent.newSongsComponent - } - private let appComponent: AppComponent - init(appComponent: AppComponent) { - self.appComponent = appComponent - } -} -/// ^->AppComponent->HomeComponent -private func factory67229cdf0f755562b2b1f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { - return HomeDependency443c4e1871277bd8432aProvider(appComponent: parent1(component) as! AppComponent) -} -private class AfterSearchDependency61822c19bc2eb46d7c52Provider: AfterSearchDependency { - var afterSearchContentComponent: AfterSearchContentComponent { - return appComponent.afterSearchContentComponent - } - var fetchSearchSongUseCase: any FetchSearchSongUseCase { - return appComponent.fetchSearchSongUseCase - } - var containSongsComponent: ContainSongsComponent { - return appComponent.containSongsComponent - } - private let appComponent: AppComponent - init(appComponent: AppComponent) { - self.appComponent = appComponent - } -} -/// ^->AppComponent->AfterSearchComponent -private func factoryeb2da679e35e2c4fb9a5f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { - return AfterSearchDependency61822c19bc2eb46d7c52Provider(appComponent: parent1(component) as! AppComponent) -} -private class AfterSearchComponentDependency028b0697c8624344f660Provider: AfterSearchComponentDependency { - - - init() { - - } -} -/// ^->AppComponent->AfterSearchContentComponent -private func factorycaaccdf52467bfa87f73e3b0c44298fc1c149afb(_ component: NeedleFoundation.Scope) -> AnyObject { - return AfterSearchComponentDependency028b0697c8624344f660Provider() -} -private class SearchDependencya86903a2c751a4f762e8Provider: SearchDependency { - var beforeSearchComponent: BeforeSearchComponent { - return appComponent.beforeSearchComponent - } - var afterSearchComponent: AfterSearchComponent { - return appComponent.afterSearchComponent - } - private let appComponent: AppComponent - init(appComponent: AppComponent) { - self.appComponent = appComponent - } -} -/// ^->AppComponent->SearchComponent -private func factorye3d049458b2ccbbcb3b6f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { - return SearchDependencya86903a2c751a4f762e8Provider(appComponent: parent1(component) as! AppComponent) -} -private class BeforeSearchDependencyebdecb1d478a4766488dProvider: BeforeSearchDependency { - var playListDetailComponent: PlayListDetailComponent { - return appComponent.playListDetailComponent - } - var fetchRecommendPlayListUseCase: any FetchRecommendPlayListUseCase { - return appComponent.fetchRecommendPlayListUseCase - } - private let appComponent: AppComponent - init(appComponent: AppComponent) { - self.appComponent = appComponent - } -} -/// ^->AppComponent->BeforeSearchComponent -private func factory9bb852337d5550979293f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { - return BeforeSearchDependencyebdecb1d478a4766488dProvider(appComponent: parent1(component) as! AppComponent) -} -private class ContainSongsDependencydbd9ae8a072db3a22630Provider: ContainSongsDependency { - var multiPurposePopComponent: MultiPurposePopComponent { - return appComponent.multiPurposePopComponent - } - var fetchPlayListUseCase: any FetchPlayListUseCase { - return appComponent.fetchPlayListUseCase - } - var addSongIntoPlayListUseCase: any AddSongIntoPlayListUseCase { - return appComponent.addSongIntoPlayListUseCase - } - private let appComponent: AppComponent - init(appComponent: AppComponent) { - self.appComponent = appComponent - } -} -/// ^->AppComponent->ContainSongsComponent -private func factory4d4f4455414271fee232f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { - return ContainSongsDependencydbd9ae8a072db3a22630Provider(appComponent: parent1(component) as! AppComponent) -} -private class ServiceInfoDependency17ccca17be0fc87c9a2eProvider: ServiceInfoDependency { - var openSourceLicenseComponent: OpenSourceLicenseComponent { - return appComponent.openSourceLicenseComponent - } - private let appComponent: AppComponent - init(appComponent: AppComponent) { - self.appComponent = appComponent - } -} -/// ^->AppComponent->ServiceInfoComponent -private func factory3afd170b9974b0dbd863f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { - return ServiceInfoDependency17ccca17be0fc87c9a2eProvider(appComponent: parent1(component) as! AppComponent) -} -private class MultiPurposePopDependency30141c7a9a9e67e148afProvider: MultiPurposePopDependency { - var createPlayListUseCase: any CreatePlayListUseCase { - return appComponent.createPlayListUseCase - } - var loadPlayListUseCase: any LoadPlayListUseCase { - return appComponent.loadPlayListUseCase - } - var setUserNameUseCase: any SetUserNameUseCase { - return appComponent.setUserNameUseCase - } - var editPlayListNameUseCase: any EditPlayListNameUseCase { - return appComponent.editPlayListNameUseCase - } - private let appComponent: AppComponent - init(appComponent: AppComponent) { - self.appComponent = appComponent - } -} -/// ^->AppComponent->MultiPurposePopComponent -private func factory972fcba2860fcb8ad7b8f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { - return MultiPurposePopDependency30141c7a9a9e67e148afProvider(appComponent: parent1(component) as! AppComponent) -} -private class NewSongsDependencyee634cc0cae21fc2a9e3Provider: NewSongsDependency { - var newSongsContentComponent: NewSongsContentComponent { - return appComponent.newSongsContentComponent - } - private let appComponent: AppComponent - init(appComponent: AppComponent) { - self.appComponent = appComponent - } -} -/// ^->AppComponent->NewSongsComponent -private func factory379179b05dd24ff979edf47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { - return NewSongsDependencyee634cc0cae21fc2a9e3Provider(appComponent: parent1(component) as! AppComponent) -} -private class PlayListDetailDependencyb06fb5392859952b82a2Provider: PlayListDetailDependency { - var fetchPlayListDetailUseCase: any FetchPlayListDetailUseCase { - return appComponent.fetchPlayListDetailUseCase - } - var editPlayListUseCase: any EditPlayListUseCase { - return appComponent.editPlayListUseCase - } - var removeSongsUseCase: any RemoveSongsUseCase { - return appComponent.removeSongsUseCase - } - var multiPurposePopComponent: MultiPurposePopComponent { - return appComponent.multiPurposePopComponent - } - var containSongsComponent: ContainSongsComponent { - return appComponent.containSongsComponent - } - private let appComponent: AppComponent - init(appComponent: AppComponent) { - self.appComponent = appComponent - } -} -/// ^->AppComponent->PlayListDetailComponent -private func factory9e077ee814ce180ea399f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { - return PlayListDetailDependencyb06fb5392859952b82a2Provider(appComponent: parent1(component) as! AppComponent) -} -private class OpenSourceLicenseDependencyb6842dcc36b26380b91aProvider: OpenSourceLicenseDependency { - - - init() { - - } -} -/// ^->AppComponent->OpenSourceLicenseComponent -private func factoryd505894818021731340ae3b0c44298fc1c149afb(_ component: NeedleFoundation.Scope) -> AnyObject { - return OpenSourceLicenseDependencyb6842dcc36b26380b91aProvider() -} -private class NoticePopupDependency579e3504f53119c2eef1Provider: NoticePopupDependency { - - - init() { - - } -} -/// ^->AppComponent->NoticePopupComponent -private func factorycd081aacb61d6a707ca7e3b0c44298fc1c149afb(_ component: NeedleFoundation.Scope) -> AnyObject { - return NoticePopupDependency579e3504f53119c2eef1Provider() -} -private class ProfilePopDependency081172e20caa75abdb54Provider: ProfilePopDependency { - var fetchProfileListUseCase: any FetchProfileListUseCase { - return appComponent.fetchProfileListUseCase - } - var setProfileUseCase: any SetProfileUseCase { - return appComponent.setProfileUseCase - } - private let appComponent: AppComponent - init(appComponent: AppComponent) { - self.appComponent = appComponent - } -} -/// ^->AppComponent->ProfilePopComponent -private func factorybd14b11ccce6dac94a24f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { - return ProfilePopDependency081172e20caa75abdb54Provider(appComponent: parent1(component) as! AppComponent) -} -private class NewSongsContentDependency93a05f20fa300c5bbec3Provider: NewSongsContentDependency { - var fetchNewSongsUseCase: any FetchNewSongsUseCase { - return appComponent.fetchNewSongsUseCase - } - var fetchChartUpdateTimeUseCase: any FetchChartUpdateTimeUseCase { - return appComponent.fetchChartUpdateTimeUseCase - } - var containSongsComponent: ContainSongsComponent { - return appComponent.containSongsComponent - } - private let appComponent: AppComponent - init(appComponent: AppComponent) { - self.appComponent = appComponent - } -} -/// ^->AppComponent->NewSongsContentComponent -private func factorye130e1fbfcbc622a4c38f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { - return NewSongsContentDependency93a05f20fa300c5bbec3Provider(appComponent: parent1(component) as! AppComponent) -} - -#else -extension AppComponent: Registration { - public func registerItems() { - - localTable["keychain-any Keychain"] = { self.keychain as Any } - localTable["remotePlayDataSource-any RemotePlayDataSource"] = { self.remotePlayDataSource as Any } - localTable["playRepository-any PlayRepository"] = { self.playRepository as Any } - localTable["postPlaybackLogUseCase-any PostPlaybackLogUseCase"] = { self.postPlaybackLogUseCase as Any } - localTable["searchComponent-SearchComponent"] = { self.searchComponent as Any } - localTable["afterSearchComponent-AfterSearchComponent"] = { self.afterSearchComponent as Any } - localTable["afterSearchContentComponent-AfterSearchContentComponent"] = { self.afterSearchContentComponent as Any } - localTable["homeComponent-HomeComponent"] = { self.homeComponent as Any } - localTable["newSongsComponent-NewSongsComponent"] = { self.newSongsComponent as Any } - localTable["newSongsContentComponent-NewSongsContentComponent"] = { self.newSongsContentComponent as Any } - localTable["remoteSongsDataSource-any RemoteSongsDataSource"] = { self.remoteSongsDataSource as Any } - localTable["songsRepository-any SongsRepository"] = { self.songsRepository as Any } - localTable["fetchSearchSongUseCase-any FetchSearchSongUseCase"] = { self.fetchSearchSongUseCase as Any } - localTable["fetchLyricsUseCase-any FetchLyricsUseCase"] = { self.fetchLyricsUseCase as Any } - localTable["fetchNewSongsUseCase-any FetchNewSongsUseCase"] = { self.fetchNewSongsUseCase as Any } - localTable["signInComponent-SignInComponent"] = { self.signInComponent as Any } - localTable["storageComponent-StorageComponent"] = { self.storageComponent as Any } - localTable["afterLoginComponent-AfterLoginComponent"] = { self.afterLoginComponent as Any } - localTable["requestComponent-RequestComponent"] = { self.requestComponent as Any } - localTable["remoteAuthDataSource-any RemoteAuthDataSource"] = { self.remoteAuthDataSource as Any } - localTable["authRepository-any AuthRepository"] = { self.authRepository as Any } - localTable["fetchTokenUseCase-any FetchTokenUseCase"] = { self.fetchTokenUseCase as Any } - localTable["fetchNaverUserInfoUseCase-any FetchNaverUserInfoUseCase"] = { self.fetchNaverUserInfoUseCase as Any } - localTable["fetchUserInfoUseCase-any FetchUserInfoUseCase"] = { self.fetchUserInfoUseCase as Any } - localTable["withdrawUserInfoUseCase-any WithdrawUserInfoUseCase"] = { self.withdrawUserInfoUseCase as Any } - localTable["remoteLikeDataSource-any RemoteLikeDataSource"] = { self.remoteLikeDataSource as Any } - localTable["likeRepository-any LikeRepository"] = { self.likeRepository as Any } - localTable["fetchLikeNumOfSongUseCase-any FetchLikeNumOfSongUseCase"] = { self.fetchLikeNumOfSongUseCase as Any } - localTable["addLikeSongUseCase-any AddLikeSongUseCase"] = { self.addLikeSongUseCase as Any } - localTable["cancelLikeSongUseCase-any CancelLikeSongUseCase"] = { self.cancelLikeSongUseCase as Any } - localTable["beforeSearchComponent-BeforeSearchComponent"] = { self.beforeSearchComponent as Any } - localTable["playListDetailComponent-PlayListDetailComponent"] = { self.playListDetailComponent as Any } - localTable["multiPurposePopComponent-MultiPurposePopComponent"] = { self.multiPurposePopComponent as Any } - localTable["myPlayListComponent-MyPlayListComponent"] = { self.myPlayListComponent as Any } - localTable["containSongsComponent-ContainSongsComponent"] = { self.containSongsComponent as Any } - localTable["remotePlayListDataSource-any RemotePlayListDataSource"] = { self.remotePlayListDataSource as Any } - localTable["playListRepository-any PlayListRepository"] = { self.playListRepository as Any } - localTable["fetchRecommendPlayListUseCase-any FetchRecommendPlayListUseCase"] = { self.fetchRecommendPlayListUseCase as Any } - localTable["fetchPlayListDetailUseCase-any FetchPlayListDetailUseCase"] = { self.fetchPlayListDetailUseCase as Any } - localTable["createPlayListUseCase-any CreatePlayListUseCase"] = { self.createPlayListUseCase as Any } - localTable["editPlayListUseCase-any EditPlayListUseCase"] = { self.editPlayListUseCase as Any } - localTable["editPlayListNameUseCase-any EditPlayListNameUseCase"] = { self.editPlayListNameUseCase as Any } - localTable["loadPlayListUseCase-any LoadPlayListUseCase"] = { self.loadPlayListUseCase as Any } - localTable["addSongIntoPlayListUseCase-any AddSongIntoPlayListUseCase"] = { self.addSongIntoPlayListUseCase as Any } - localTable["removeSongsUseCase-any RemoveSongsUseCase"] = { self.removeSongsUseCase as Any } - localTable["artistComponent-ArtistComponent"] = { self.artistComponent as Any } - localTable["remoteArtistDataSource-RemoteArtistDataSourceImpl"] = { self.remoteArtistDataSource as Any } - localTable["artistRepository-any ArtistRepository"] = { self.artistRepository as Any } - localTable["fetchArtistListUseCase-any FetchArtistListUseCase"] = { self.fetchArtistListUseCase as Any } - localTable["artistDetailComponent-ArtistDetailComponent"] = { self.artistDetailComponent as Any } - localTable["fetchArtistSongListUseCase-any FetchArtistSongListUseCase"] = { self.fetchArtistSongListUseCase as Any } - localTable["artistMusicComponent-ArtistMusicComponent"] = { self.artistMusicComponent as Any } - localTable["artistMusicContentComponent-ArtistMusicContentComponent"] = { self.artistMusicContentComponent as Any } - localTable["profilePopComponent-ProfilePopComponent"] = { self.profilePopComponent as Any } - localTable["favoriteComponent-FavoriteComponent"] = { self.favoriteComponent as Any } - localTable["remoteUserDataSource-any RemoteUserDataSource"] = { self.remoteUserDataSource as Any } - localTable["userRepository-any UserRepository"] = { self.userRepository as Any } - localTable["fetchProfileListUseCase-any FetchProfileListUseCase"] = { self.fetchProfileListUseCase as Any } - localTable["setProfileUseCase-any SetProfileUseCase"] = { self.setProfileUseCase as Any } - localTable["setUserNameUseCase-any SetUserNameUseCase"] = { self.setUserNameUseCase as Any } - localTable["fetchPlayListUseCase-any FetchPlayListUseCase"] = { self.fetchPlayListUseCase as Any } - localTable["fetchFavoriteSongsUseCase-any FetchFavoriteSongsUseCase"] = { self.fetchFavoriteSongsUseCase as Any } - localTable["editFavoriteSongsOrderUseCase-any EditFavoriteSongsOrderUseCase"] = { self.editFavoriteSongsOrderUseCase as Any } - localTable["editPlayListOrderUseCase-any EditPlayListOrderUseCase"] = { self.editPlayListOrderUseCase as Any } - localTable["deletePlayListUseCase-any DeletePlayListUseCase"] = { self.deletePlayListUseCase as Any } - localTable["deleteFavoriteListUseCase-any DeleteFavoriteListUseCase"] = { self.deleteFavoriteListUseCase as Any } - localTable["mainContainerComponent-MainContainerComponent"] = { self.mainContainerComponent as Any } - localTable["bottomTabBarComponent-BottomTabBarComponent"] = { self.bottomTabBarComponent as Any } - localTable["mainTabBarComponent-MainTabBarComponent"] = { self.mainTabBarComponent as Any } - localTable["playerComponent-PlayerComponent"] = { self.playerComponent as Any } - localTable["playlistComponent-PlaylistComponent"] = { self.playlistComponent as Any } - localTable["openSourceLicenseComponent-OpenSourceLicenseComponent"] = { self.openSourceLicenseComponent as Any } - localTable["serviceInfoComponent-ServiceInfoComponent"] = { self.serviceInfoComponent as Any } - localTable["permissionComponent-PermissionComponent"] = { self.permissionComponent as Any } - localTable["noticePopupComponent-NoticePopupComponent"] = { self.noticePopupComponent as Any } - localTable["noticeComponent-NoticeComponent"] = { self.noticeComponent as Any } - localTable["noticeDetailComponent-NoticeDetailComponent"] = { self.noticeDetailComponent as Any } - localTable["remoteNoticeDataSource-any RemoteNoticeDataSource"] = { self.remoteNoticeDataSource as Any } - localTable["noticeRepository-any NoticeRepository"] = { self.noticeRepository as Any } - localTable["fetchNoticeUseCase-any FetchNoticeUseCase"] = { self.fetchNoticeUseCase as Any } - localTable["fetchNoticeCategoriesUseCase-any FetchNoticeCategoriesUseCase"] = { self.fetchNoticeCategoriesUseCase as Any } - localTable["qnaComponent-QnaComponent"] = { self.qnaComponent as Any } - localTable["qnaContentComponent-QnaContentComponent"] = { self.qnaContentComponent as Any } - localTable["remoteQnaDataSource-any RemoteQnaDataSource"] = { self.remoteQnaDataSource as Any } - localTable["qnaRepository-any QnaRepository"] = { self.qnaRepository as Any } - localTable["fetchQnaCategoriesUseCase-any FetchQnaCategoriesUseCase"] = { self.fetchQnaCategoriesUseCase as Any } - localTable["fetchQnaUseCase-any FetchQnaUseCase"] = { self.fetchQnaUseCase as Any } - localTable["questionComponent-QuestionComponent"] = { self.questionComponent as Any } - localTable["suggestFunctionComponent-SuggestFunctionComponent"] = { self.suggestFunctionComponent as Any } - localTable["wakMusicFeedbackComponent-WakMusicFeedbackComponent"] = { self.wakMusicFeedbackComponent as Any } - localTable["askSongComponent-AskSongComponent"] = { self.askSongComponent as Any } - localTable["bugReportComponent-BugReportComponent"] = { self.bugReportComponent as Any } - localTable["remoteSuggestDataSource-any RemoteSuggestDataSource"] = { self.remoteSuggestDataSource as Any } - localTable["suggestRepository-any SuggestRepository"] = { self.suggestRepository as Any } - localTable["reportBugUseCase-any ReportBugUseCase"] = { self.reportBugUseCase as Any } - localTable["suggestFunctionUseCase-any SuggestFunctionUseCase"] = { self.suggestFunctionUseCase as Any } - localTable["modifySongUseCase-any ModifySongUseCase"] = { self.modifySongUseCase as Any } - localTable["inquiryWeeklyChartUseCase-any InquiryWeeklyChartUseCase"] = { self.inquiryWeeklyChartUseCase as Any } - localTable["remoteAppDataSource-any RemoteAppDataSource"] = { self.remoteAppDataSource as Any } - localTable["appRepository-any AppRepository"] = { self.appRepository as Any } - localTable["fetchCheckAppUseCase-any FetchCheckAppUseCase"] = { self.fetchCheckAppUseCase as Any } - localTable["chartComponent-ChartComponent"] = { self.chartComponent as Any } - localTable["chartContentComponent-ChartContentComponent"] = { self.chartContentComponent as Any } - localTable["remoteChartDataSource-any RemoteChartDataSource"] = { self.remoteChartDataSource as Any } - localTable["chartRepository-any ChartRepository"] = { self.chartRepository as Any } - localTable["fetchChartRankingUseCase-any FetchChartRankingUseCase"] = { self.fetchChartRankingUseCase as Any } - localTable["fetchChartUpdateTimeUseCase-any FetchChartUpdateTimeUseCase"] = { self.fetchChartUpdateTimeUseCase as Any } - } -} -extension ArtistComponent: Registration { - public func registerItems() { - keyPathToName[\ArtistDependency.fetchArtistListUseCase] = "fetchArtistListUseCase-any FetchArtistListUseCase" - keyPathToName[\ArtistDependency.artistDetailComponent] = "artistDetailComponent-ArtistDetailComponent" - } -} -extension ArtistDetailComponent: Registration { - public func registerItems() { - keyPathToName[\ArtistDetailDependency.artistMusicComponent] = "artistMusicComponent-ArtistMusicComponent" - } -} -extension ArtistMusicContentComponent: Registration { - public func registerItems() { - keyPathToName[\ArtistMusicContentDependency.fetchArtistSongListUseCase] = "fetchArtistSongListUseCase-any FetchArtistSongListUseCase" - keyPathToName[\ArtistMusicContentDependency.containSongsComponent] = "containSongsComponent-ContainSongsComponent" - } -} -extension ArtistMusicComponent: Registration { - public func registerItems() { - keyPathToName[\ArtistMusicDependency.artistMusicContentComponent] = "artistMusicContentComponent-ArtistMusicContentComponent" - } -} -extension PlaylistComponent: Registration { - public func registerItems() { - keyPathToName[\PlaylistDependency.containSongsComponent] = "containSongsComponent-ContainSongsComponent" - } -} -extension PlayerComponent: Registration { - public func registerItems() { - keyPathToName[\PlayerDependency.fetchLyricsUseCase] = "fetchLyricsUseCase-any FetchLyricsUseCase" - keyPathToName[\PlayerDependency.addLikeSongUseCase] = "addLikeSongUseCase-any AddLikeSongUseCase" - keyPathToName[\PlayerDependency.cancelLikeSongUseCase] = "cancelLikeSongUseCase-any CancelLikeSongUseCase" - keyPathToName[\PlayerDependency.fetchLikeNumOfSongUseCase] = "fetchLikeNumOfSongUseCase-any FetchLikeNumOfSongUseCase" - keyPathToName[\PlayerDependency.fetchFavoriteSongsUseCase] = "fetchFavoriteSongsUseCase-any FetchFavoriteSongsUseCase" - keyPathToName[\PlayerDependency.postPlaybackLogUseCase] = "postPlaybackLogUseCase-any PostPlaybackLogUseCase" - keyPathToName[\PlayerDependency.playlistComponent] = "playlistComponent-PlaylistComponent" - keyPathToName[\PlayerDependency.containSongsComponent] = "containSongsComponent-ContainSongsComponent" - } -} -extension MainTabBarComponent: Registration { - public func registerItems() { - keyPathToName[\MainTabBarDependency.fetchNoticeUseCase] = "fetchNoticeUseCase-any FetchNoticeUseCase" - keyPathToName[\MainTabBarDependency.homeComponent] = "homeComponent-HomeComponent" - keyPathToName[\MainTabBarDependency.chartComponent] = "chartComponent-ChartComponent" - keyPathToName[\MainTabBarDependency.searchComponent] = "searchComponent-SearchComponent" - keyPathToName[\MainTabBarDependency.artistComponent] = "artistComponent-ArtistComponent" - keyPathToName[\MainTabBarDependency.storageComponent] = "storageComponent-StorageComponent" - keyPathToName[\MainTabBarDependency.noticePopupComponent] = "noticePopupComponent-NoticePopupComponent" - keyPathToName[\MainTabBarDependency.noticeComponent] = "noticeComponent-NoticeComponent" - keyPathToName[\MainTabBarDependency.noticeDetailComponent] = "noticeDetailComponent-NoticeDetailComponent" - } -} -extension BottomTabBarComponent: Registration { - public func registerItems() { - - } -} -extension MainContainerComponent: Registration { - public func registerItems() { - keyPathToName[\MainContainerDependency.bottomTabBarComponent] = "bottomTabBarComponent-BottomTabBarComponent" - keyPathToName[\MainContainerDependency.mainTabBarComponent] = "mainTabBarComponent-MainTabBarComponent" - keyPathToName[\MainContainerDependency.playerComponent] = "playerComponent-PlayerComponent" - } -} -extension ChartComponent: Registration { - public func registerItems() { - keyPathToName[\ChartDependency.chartContentComponent] = "chartContentComponent-ChartContentComponent" - } -} -extension ChartContentComponent: Registration { - public func registerItems() { - keyPathToName[\ChartContentDependency.fetchChartRankingUseCase] = "fetchChartRankingUseCase-any FetchChartRankingUseCase" - keyPathToName[\ChartContentDependency.fetchChartUpdateTimeUseCase] = "fetchChartUpdateTimeUseCase-any FetchChartUpdateTimeUseCase" - keyPathToName[\ChartContentDependency.containSongsComponent] = "containSongsComponent-ContainSongsComponent" - } -} -extension AskSongComponent: Registration { - public func registerItems() { - keyPathToName[\AskSongDependency.modifySongUseCase] = "modifySongUseCase-any ModifySongUseCase" - } -} -extension SuggestFunctionComponent: Registration { - public func registerItems() { - keyPathToName[\SuggestFunctionDependency.suggestFunctionUseCase] = "suggestFunctionUseCase-any SuggestFunctionUseCase" - } -} -extension StorageComponent: Registration { - public func registerItems() { - keyPathToName[\StorageDependency.signInComponent] = "signInComponent-SignInComponent" - keyPathToName[\StorageDependency.afterLoginComponent] = "afterLoginComponent-AfterLoginComponent" - } -} -extension QuestionComponent: Registration { - public func registerItems() { - keyPathToName[\QuestionDependency.suggestFunctionComponent] = "suggestFunctionComponent-SuggestFunctionComponent" - keyPathToName[\QuestionDependency.wakMusicFeedbackComponent] = "wakMusicFeedbackComponent-WakMusicFeedbackComponent" - keyPathToName[\QuestionDependency.askSongComponent] = "askSongComponent-AskSongComponent" - keyPathToName[\QuestionDependency.bugReportComponent] = "bugReportComponent-BugReportComponent" - } -} -extension MyPlayListComponent: Registration { - public func registerItems() { - keyPathToName[\MyPlayListDependency.multiPurposePopComponent] = "multiPurposePopComponent-MultiPurposePopComponent" - keyPathToName[\MyPlayListDependency.playListDetailComponent] = "playListDetailComponent-PlayListDetailComponent" - keyPathToName[\MyPlayListDependency.fetchPlayListUseCase] = "fetchPlayListUseCase-any FetchPlayListUseCase" - keyPathToName[\MyPlayListDependency.editPlayListOrderUseCase] = "editPlayListOrderUseCase-any EditPlayListOrderUseCase" - keyPathToName[\MyPlayListDependency.deletePlayListUseCase] = "deletePlayListUseCase-any DeletePlayListUseCase" - } -} -extension AfterLoginComponent: Registration { - public func registerItems() { - keyPathToName[\AfterLoginDependency.fetchUserInfoUseCase] = "fetchUserInfoUseCase-any FetchUserInfoUseCase" - keyPathToName[\AfterLoginDependency.requestComponent] = "requestComponent-RequestComponent" - keyPathToName[\AfterLoginDependency.profilePopComponent] = "profilePopComponent-ProfilePopComponent" - keyPathToName[\AfterLoginDependency.myPlayListComponent] = "myPlayListComponent-MyPlayListComponent" - keyPathToName[\AfterLoginDependency.multiPurposePopComponent] = "multiPurposePopComponent-MultiPurposePopComponent" - keyPathToName[\AfterLoginDependency.favoriteComponent] = "favoriteComponent-FavoriteComponent" - } -} -extension FavoriteComponent: Registration { - public func registerItems() { - keyPathToName[\FavoriteDependency.containSongsComponent] = "containSongsComponent-ContainSongsComponent" - keyPathToName[\FavoriteDependency.fetchFavoriteSongsUseCase] = "fetchFavoriteSongsUseCase-any FetchFavoriteSongsUseCase" - keyPathToName[\FavoriteDependency.editFavoriteSongsOrderUseCase] = "editFavoriteSongsOrderUseCase-any EditFavoriteSongsOrderUseCase" - keyPathToName[\FavoriteDependency.deleteFavoriteListUseCase] = "deleteFavoriteListUseCase-any DeleteFavoriteListUseCase" - } -} -extension QnaComponent: Registration { - public func registerItems() { - keyPathToName[\QnaDependency.qnaContentComponent] = "qnaContentComponent-QnaContentComponent" - keyPathToName[\QnaDependency.fetchQnaCategoriesUseCase] = "fetchQnaCategoriesUseCase-any FetchQnaCategoriesUseCase" - keyPathToName[\QnaDependency.fetchQnaUseCase] = "fetchQnaUseCase-any FetchQnaUseCase" - } -} -extension RequestComponent: Registration { - public func registerItems() { - keyPathToName[\RequestDependency.withdrawUserInfoUseCase] = "withdrawUserInfoUseCase-any WithdrawUserInfoUseCase" - keyPathToName[\RequestDependency.qnaComponent] = "qnaComponent-QnaComponent" - keyPathToName[\RequestDependency.questionComponent] = "questionComponent-QuestionComponent" - keyPathToName[\RequestDependency.containSongsComponent] = "containSongsComponent-ContainSongsComponent" - keyPathToName[\RequestDependency.noticeComponent] = "noticeComponent-NoticeComponent" - keyPathToName[\RequestDependency.serviceInfoComponent] = "serviceInfoComponent-ServiceInfoComponent" - } -} -extension NoticeDetailComponent: Registration { - public func registerItems() { - - } -} -extension NoticeComponent: Registration { - public func registerItems() { - keyPathToName[\NoticeDependency.fetchNoticeUseCase] = "fetchNoticeUseCase-any FetchNoticeUseCase" - keyPathToName[\NoticeDependency.noticeDetailComponent] = "noticeDetailComponent-NoticeDetailComponent" - } -} -extension QnaContentComponent: Registration { - public func registerItems() { - - } -} -extension BugReportComponent: Registration { - public func registerItems() { - keyPathToName[\BugReportDependency.reportBugUseCase] = "reportBugUseCase-any ReportBugUseCase" - } -} -extension WakMusicFeedbackComponent: Registration { - public func registerItems() { - keyPathToName[\WakMusicFeedbackDependency.inquiryWeeklyChartUseCase] = "inquiryWeeklyChartUseCase-any InquiryWeeklyChartUseCase" - } -} -extension RootComponent: Registration { - public func registerItems() { - keyPathToName[\RootDependency.mainContainerComponent] = "mainContainerComponent-MainContainerComponent" - keyPathToName[\RootDependency.permissionComponent] = "permissionComponent-PermissionComponent" - keyPathToName[\RootDependency.fetchUserInfoUseCase] = "fetchUserInfoUseCase-any FetchUserInfoUseCase" - keyPathToName[\RootDependency.fetchCheckAppUseCase] = "fetchCheckAppUseCase-any FetchCheckAppUseCase" - } -} -extension PermissionComponent: Registration { - public func registerItems() { - - } -} -extension SignInComponent: Registration { - public func registerItems() { - keyPathToName[\SignInDependency.fetchTokenUseCase] = "fetchTokenUseCase-any FetchTokenUseCase" - keyPathToName[\SignInDependency.fetchNaverUserInfoUseCase] = "fetchNaverUserInfoUseCase-any FetchNaverUserInfoUseCase" - keyPathToName[\SignInDependency.fetchUserInfoUseCase] = "fetchUserInfoUseCase-any FetchUserInfoUseCase" - } -} -extension HomeComponent: Registration { - public func registerItems() { - keyPathToName[\HomeDependency.fetchChartRankingUseCase] = "fetchChartRankingUseCase-any FetchChartRankingUseCase" - keyPathToName[\HomeDependency.fetchNewSongsUseCase] = "fetchNewSongsUseCase-any FetchNewSongsUseCase" - keyPathToName[\HomeDependency.fetchRecommendPlayListUseCase] = "fetchRecommendPlayListUseCase-any FetchRecommendPlayListUseCase" - keyPathToName[\HomeDependency.playListDetailComponent] = "playListDetailComponent-PlayListDetailComponent" - keyPathToName[\HomeDependency.newSongsComponent] = "newSongsComponent-NewSongsComponent" - } -} -extension AfterSearchComponent: Registration { - public func registerItems() { - keyPathToName[\AfterSearchDependency.afterSearchContentComponent] = "afterSearchContentComponent-AfterSearchContentComponent" - keyPathToName[\AfterSearchDependency.fetchSearchSongUseCase] = "fetchSearchSongUseCase-any FetchSearchSongUseCase" - keyPathToName[\AfterSearchDependency.containSongsComponent] = "containSongsComponent-ContainSongsComponent" - } -} -extension AfterSearchContentComponent: Registration { - public func registerItems() { - - } -} -extension SearchComponent: Registration { - public func registerItems() { - keyPathToName[\SearchDependency.beforeSearchComponent] = "beforeSearchComponent-BeforeSearchComponent" - keyPathToName[\SearchDependency.afterSearchComponent] = "afterSearchComponent-AfterSearchComponent" - } -} -extension BeforeSearchComponent: Registration { - public func registerItems() { - keyPathToName[\BeforeSearchDependency.playListDetailComponent] = "playListDetailComponent-PlayListDetailComponent" - keyPathToName[\BeforeSearchDependency.fetchRecommendPlayListUseCase] = "fetchRecommendPlayListUseCase-any FetchRecommendPlayListUseCase" - } -} -extension ContainSongsComponent: Registration { - public func registerItems() { - keyPathToName[\ContainSongsDependency.multiPurposePopComponent] = "multiPurposePopComponent-MultiPurposePopComponent" - keyPathToName[\ContainSongsDependency.fetchPlayListUseCase] = "fetchPlayListUseCase-any FetchPlayListUseCase" - keyPathToName[\ContainSongsDependency.addSongIntoPlayListUseCase] = "addSongIntoPlayListUseCase-any AddSongIntoPlayListUseCase" - } -} -extension ServiceInfoComponent: Registration { - public func registerItems() { - keyPathToName[\ServiceInfoDependency.openSourceLicenseComponent] = "openSourceLicenseComponent-OpenSourceLicenseComponent" - } -} -extension MultiPurposePopComponent: Registration { - public func registerItems() { - keyPathToName[\MultiPurposePopDependency.createPlayListUseCase] = "createPlayListUseCase-any CreatePlayListUseCase" - keyPathToName[\MultiPurposePopDependency.loadPlayListUseCase] = "loadPlayListUseCase-any LoadPlayListUseCase" - keyPathToName[\MultiPurposePopDependency.setUserNameUseCase] = "setUserNameUseCase-any SetUserNameUseCase" - keyPathToName[\MultiPurposePopDependency.editPlayListNameUseCase] = "editPlayListNameUseCase-any EditPlayListNameUseCase" - } -} -extension NewSongsComponent: Registration { - public func registerItems() { - keyPathToName[\NewSongsDependency.newSongsContentComponent] = "newSongsContentComponent-NewSongsContentComponent" - } -} -extension PlayListDetailComponent: Registration { - public func registerItems() { - keyPathToName[\PlayListDetailDependency.fetchPlayListDetailUseCase] = "fetchPlayListDetailUseCase-any FetchPlayListDetailUseCase" - keyPathToName[\PlayListDetailDependency.editPlayListUseCase] = "editPlayListUseCase-any EditPlayListUseCase" - keyPathToName[\PlayListDetailDependency.removeSongsUseCase] = "removeSongsUseCase-any RemoveSongsUseCase" - keyPathToName[\PlayListDetailDependency.multiPurposePopComponent] = "multiPurposePopComponent-MultiPurposePopComponent" - keyPathToName[\PlayListDetailDependency.containSongsComponent] = "containSongsComponent-ContainSongsComponent" - } -} -extension OpenSourceLicenseComponent: Registration { - public func registerItems() { - - } -} -extension NoticePopupComponent: Registration { - public func registerItems() { - - } -} -extension ProfilePopComponent: Registration { - public func registerItems() { - keyPathToName[\ProfilePopDependency.fetchProfileListUseCase] = "fetchProfileListUseCase-any FetchProfileListUseCase" - keyPathToName[\ProfilePopDependency.setProfileUseCase] = "setProfileUseCase-any SetProfileUseCase" - } -} -extension NewSongsContentComponent: Registration { - public func registerItems() { - keyPathToName[\NewSongsContentDependency.fetchNewSongsUseCase] = "fetchNewSongsUseCase-any FetchNewSongsUseCase" - keyPathToName[\NewSongsContentDependency.fetchChartUpdateTimeUseCase] = "fetchChartUpdateTimeUseCase-any FetchChartUpdateTimeUseCase" - keyPathToName[\NewSongsContentDependency.containSongsComponent] = "containSongsComponent-ContainSongsComponent" - } -} - - -#endif - -private func factoryEmptyDependencyProvider(_ component: NeedleFoundation.Scope) -> AnyObject { - return EmptyDependencyProvider(component: component) -} - -// MARK: - Registration -private func registerProviderFactory(_ componentPath: String, _ factory: @escaping (NeedleFoundation.Scope) -> AnyObject) { - __DependencyProviderRegistry.instance.registerDependencyProviderFactory(for: componentPath, factory) -} - -#if !NEEDLE_DYNAMIC - -@inline(never) private func register1() { - registerProviderFactory("^->AppComponent", factoryEmptyDependencyProvider) - registerProviderFactory("^->AppComponent->ArtistComponent", factorye0c5444f5894148bdd93f47b58f8f304c97af4d5) - registerProviderFactory("^->AppComponent->ArtistDetailComponent", factory35314797fadaf164ece6f47b58f8f304c97af4d5) - registerProviderFactory("^->AppComponent->ArtistMusicContentComponent", factory8b6ffa46033e2529b5daf47b58f8f304c97af4d5) - registerProviderFactory("^->AppComponent->ArtistMusicComponent", factory382e7f8466df35a3f1d9f47b58f8f304c97af4d5) - registerProviderFactory("^->AppComponent->PlaylistComponent", factory3a0a6eb1061d8d5a2deff47b58f8f304c97af4d5) - registerProviderFactory("^->AppComponent->PlayerComponent", factorybc7f802f601dd5913533f47b58f8f304c97af4d5) - registerProviderFactory("^->AppComponent->MainTabBarComponent", factorye547a52b3fce5887c8c7f47b58f8f304c97af4d5) - registerProviderFactory("^->AppComponent->BottomTabBarComponent", factoryd34fa9e493604a6295bde3b0c44298fc1c149afb) - registerProviderFactory("^->AppComponent->MainContainerComponent", factory8e19f48d5d573d3ea539f47b58f8f304c97af4d5) - registerProviderFactory("^->AppComponent->ChartComponent", factoryeac6a4df54bbd391d31bf47b58f8f304c97af4d5) - registerProviderFactory("^->AppComponent->ChartContentComponent", factoryc9a137630ce76907f36ff47b58f8f304c97af4d5) - registerProviderFactory("^->AppComponent->AskSongComponent", factory37544fa026b309cd68d7f47b58f8f304c97af4d5) - registerProviderFactory("^->AppComponent->SuggestFunctionComponent", factory63287bff3999ed1787ddf47b58f8f304c97af4d5) - registerProviderFactory("^->AppComponent->StorageComponent", factory2415399d25299b97b98bf47b58f8f304c97af4d5) - registerProviderFactory("^->AppComponent->QuestionComponent", factoryedad1813a36115eec11ef47b58f8f304c97af4d5) - registerProviderFactory("^->AppComponent->MyPlayListComponent", factory51a57a92f76af93a9ec2f47b58f8f304c97af4d5) - registerProviderFactory("^->AppComponent->AfterLoginComponent", factory6cc9c8141e04494113b8f47b58f8f304c97af4d5) - registerProviderFactory("^->AppComponent->FavoriteComponent", factory8e4acb90bd0d9b48604af47b58f8f304c97af4d5) - registerProviderFactory("^->AppComponent->QnaComponent", factory49a98666675cb7a82038f47b58f8f304c97af4d5) - registerProviderFactory("^->AppComponent->RequestComponent", factory13954fb3ec537bab80bcf47b58f8f304c97af4d5) - registerProviderFactory("^->AppComponent->NoticeDetailComponent", factory3db143c2f80d621d5a7fe3b0c44298fc1c149afb) - registerProviderFactory("^->AppComponent->NoticeComponent", factoryaf8e5665e5b9217918f5f47b58f8f304c97af4d5) - registerProviderFactory("^->AppComponent->QnaContentComponent", factory1501f7005831c8411229e3b0c44298fc1c149afb) - registerProviderFactory("^->AppComponent->BugReportComponent", factoryafa28e93c96a785ed32af47b58f8f304c97af4d5) - registerProviderFactory("^->AppComponent->WakMusicFeedbackComponent", factory32abe9db091bc43329a1f47b58f8f304c97af4d5) - registerProviderFactory("^->AppComponent->RootComponent", factory264bfc4d4cb6b0629b40f47b58f8f304c97af4d5) - registerProviderFactory("^->AppComponent->PermissionComponent", factoryc1d4d80afbccf86bf1c0e3b0c44298fc1c149afb) - registerProviderFactory("^->AppComponent->SignInComponent", factoryda2925fd76da866a652af47b58f8f304c97af4d5) - registerProviderFactory("^->AppComponent->HomeComponent", factory67229cdf0f755562b2b1f47b58f8f304c97af4d5) - registerProviderFactory("^->AppComponent->AfterSearchComponent", factoryeb2da679e35e2c4fb9a5f47b58f8f304c97af4d5) - registerProviderFactory("^->AppComponent->AfterSearchContentComponent", factorycaaccdf52467bfa87f73e3b0c44298fc1c149afb) - registerProviderFactory("^->AppComponent->SearchComponent", factorye3d049458b2ccbbcb3b6f47b58f8f304c97af4d5) - registerProviderFactory("^->AppComponent->BeforeSearchComponent", factory9bb852337d5550979293f47b58f8f304c97af4d5) - registerProviderFactory("^->AppComponent->ContainSongsComponent", factory4d4f4455414271fee232f47b58f8f304c97af4d5) - registerProviderFactory("^->AppComponent->ServiceInfoComponent", factory3afd170b9974b0dbd863f47b58f8f304c97af4d5) - registerProviderFactory("^->AppComponent->MultiPurposePopComponent", factory972fcba2860fcb8ad7b8f47b58f8f304c97af4d5) - registerProviderFactory("^->AppComponent->NewSongsComponent", factory379179b05dd24ff979edf47b58f8f304c97af4d5) - registerProviderFactory("^->AppComponent->PlayListDetailComponent", factory9e077ee814ce180ea399f47b58f8f304c97af4d5) - registerProviderFactory("^->AppComponent->OpenSourceLicenseComponent", factoryd505894818021731340ae3b0c44298fc1c149afb) - registerProviderFactory("^->AppComponent->NoticePopupComponent", factorycd081aacb61d6a707ca7e3b0c44298fc1c149afb) - registerProviderFactory("^->AppComponent->ProfilePopComponent", factorybd14b11ccce6dac94a24f47b58f8f304c97af4d5) - registerProviderFactory("^->AppComponent->NewSongsContentComponent", factorye130e1fbfcbc622a4c38f47b58f8f304c97af4d5) -} -#endif - -public func registerProviderFactories() { -#if !NEEDLE_DYNAMIC - register1() -#endif -} diff --git a/Projects/App/Sources/Application/SceneDelegate.swift b/Projects/App/Sources/Application/SceneDelegate.swift index 3cf617433..42cc4a2b5 100644 --- a/Projects/App/Sources/Application/SceneDelegate.swift +++ b/Projects/App/Sources/Application/SceneDelegate.swift @@ -1,12 +1,15 @@ -import UIKit +import BaseFeature +import Combine +import LogManager +import NaverThirdPartyLogin import RootFeature +import UIKit import Utility -import NaverThirdPartyLogin -import CommonFeature -import Combine class SceneDelegate: UIResponder, UIWindowSceneDelegate { var window: UIWindow? + private var root: AppComponent? + func scene( _ scene: UIScene, willConnectTo session: UISceneSession, @@ -15,62 +18,94 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { guard let scene = (scene as? UIWindowScene) else { return } self.window = UIWindow(windowScene: scene) registerProviderFactories() - let root = AppComponent() - self.window?.rootViewController = root.makeRootView().wrapNavigationController + self.root = AppComponent() + self.window?.rootViewController = root?.makeRootView().wrapNavigationController self.window?.makeKeyAndVisible() + + // Handling App Entry:: Not Running State + handleAppEntry(with: connectionOptions) } - func sceneDidDisconnect(_ scene: UIScene) { + func sceneDidDisconnect(_ scene: UIScene) {} - } - func sceneDidBecomeActive(_ scene: UIScene) { + func sceneDidBecomeActive(_ scene: UIScene) {} - } - func sceneWillResignActive(_ scene: UIScene) { + func sceneWillResignActive(_ scene: UIScene) {} - } - - private var statePublisher: AnyCancellable? - - func sceneWillEnterForeground(_ scene: UIScene) { - statePublisher?.cancel() - } - - func sceneDidEnterBackground(_ scene: UIScene) { - let isPlayed = PlayState.shared.state - statePublisher = PlayState.shared.$state.sink { state in - if state == .paused { - DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { - if isPlayed == .playing { PlayState.shared.play() } - } - } - } - } - - ///MARK: - Handling DeepLink + func sceneWillEnterForeground(_ scene: UIScene) {} + + func sceneDidEnterBackground(_ scene: UIScene) {} + + // MARK: - Handling DeepLink func scene(_ scene: UIScene, openURLContexts URLContexts: Set) { guard let url = URLContexts.first?.url else { return } - + let scheme: String = url.scheme ?? "" - DEBUG_LOG("[openURLContexts] scheme: \(scheme), URL: \(url.absoluteString)") - + LogManager.printDebug("[openURLContexts] scheme: \(scheme), URL: \(url.absoluteString)") + switch scheme { - case GOOGLE_URL_SCHEME(): //구글 + case GOOGLE_URL_SCHEME(): // 구글 GoogleLoginManager.shared.getGoogleToken(url) - case NAVER_URL_SCHEME(): //네이버 + case NAVER_URL_SCHEME(): // 네이버 NaverThirdPartyLoginConnection.getSharedInstance().receiveAccessToken(url) - + + case WM_URI_SCHEME(): + handleDeeplink(url: url) + default: return } } - - ///MARK: - Handling UniversalLink + + // MARK: - Handling UniversalLink func scene(_ scene: UIScene, continue userActivity: NSUserActivity) { guard userActivity.activityType == NSUserActivityTypeBrowsingWeb, let webpageURL = userActivity.webpageURL else { return } - DEBUG_LOG(webpageURL.absoluteString) + LogManager.printDebug("URL: \(webpageURL.absoluteString)") + + guard webpageURL.host == WM_UNIVERSALLINK_DOMAIN() else { + return + } + handleUniversalLink(url: webpageURL) + } +} + +private extension SceneDelegate { + func handleAppEntry(with connectionOptions: UIScene.ConnectionOptions) { + if let url = connectionOptions.urlContexts.first?.url { + handleDeeplink(url: url) + + } else if let userActivity = connectionOptions.userActivities.first, + userActivity.activityType == NSUserActivityTypeBrowsingWeb, + let webpageURL = userActivity.webpageURL { + handleUniversalLink(url: webpageURL) + + } else if let notification = connectionOptions.notificationResponse?.notification { + let userInfo = notification.request.content.userInfo + root?.appEntryState.moveScene(params: userInfo.parseNotificationInfo) + } + } + + func handleDeeplink(url: URL) { + let page: String = url.host ?? "" + let pathComponents: [String] = url.pathComponents.filter { $0 != "/" } + var params: [String: Any] = url.parseToParams() + params["page"] = page + LogManager.printDebug("host: \(page), pathComponents: \(pathComponents), params: \(params)") + root?.appEntryState.moveScene(params: params) + } + + func handleUniversalLink(url: URL) { + let host: String = url.host ?? "" + let pathComponents: [String] = url.pathComponents.filter { $0 != "/" } + let page: String = pathComponents.first ?? "" + let key: String = pathComponents.last ?? "" + var params: [String: Any] = url.parseToParams() + params["page"] = page + params["key"] = key + LogManager.printDebug("host: \(host), pathComponents: \(pathComponents), params: \(params)") + root?.appEntryState.moveScene(params: params) } } diff --git a/Projects/App/Support/Info.plist b/Projects/App/Support/Info.plist index 15cc21b16..118c93f85 100644 --- a/Projects/App/Support/Info.plist +++ b/Projects/App/Support/Info.plist @@ -40,6 +40,14 @@ $(GOOGLE_URL_SCHEME) + + CFBundleTypeRole + Editor + CFBundleURLSchemes + + $(WM_URI_SCHEME) + + CFBundleVersion $(CURRENT_PROJECT_VERSION) @@ -47,27 +55,29 @@ LSApplicationQueriesSchemes - naversearchapp - naversearchthirdlogin + naversearchapp + naversearchthirdlogin + youtube + youtubemusic LSRequiresIPhoneOS NSCameraUsageDescription - [선택권한] 버그 제보 시 카메라 촬영을 하려면 권한 승인이 필요합니다. + [선택권한] 카메라 촬영을 하려면 권한 승인이 필요합니다. + NSPhotoLibraryAddUsageDescription + [선택권한] 앨범 사진을 첨부 하거나, 저장하려면 권한 승인이 필요합니다. NSPhotoLibraryUsageDescription - [선택권한] 버그 제보 시 앨범 사진을 첨부 하려면 권한 승인이 필요합니다. + [선택권한] 앨범 사진을 첨부 하거나, 저장하려면 권한 승인이 필요합니다. Secrets - BASE_IMAGE_URL - $(BASE_IMAGE_URL) BASE_DEV_URL $(BASE_DEV_URL) BASE_PROD_URL $(BASE_PROD_URL) + CDN_DOMAIN_URL + $(CDN_DOMAIN_URL) GOOGLE_CLIENT_ID $(GOOGLE_CLIENT_ID) - GOOGLE_SECRET_KEY - $(GOOGLE_SECRET_KEY) GOOGLE_URL_SCHEME $(GOOGLE_URL_SCHEME) NAVER_APP_NAME @@ -78,8 +88,6 @@ $(NAVER_CONSUMER_SECRET) NAVER_URL_SCHEME $(NAVER_URL_SCHEME) - WAKENTER_BASE_URL - $(WAKENTER_BASE_URL) WMDOMAIN_APP $(WMDOMAIN_APP) WMDOMAIN_ARTIST @@ -88,42 +96,38 @@ $(WMDOMAIN_AUTH) WMDOMAIN_CHARTS $(WMDOMAIN_CHARTS) - WMDOMAIN_IMAGE_ARTIST_ROUND - $(WMDOMAIN_IMAGE_ARTIST_ROUND) - WMDOMAIN_IMAGE_ARTIST_SQUARE - $(WMDOMAIN_IMAGE_ARTIST_SQUARE) - WMDOMAIN_IMAGE_NEWS - $(WMDOMAIN_IMAGE_NEWS) - WMDOMAIN_IMAGE_NOTICE - $(WMDOMAIN_IMAGE_NOTICE) - WMDOMAIN_IMAGE_PLAYLIST - $(WMDOMAIN_IMAGE_PLAYLIST) - WMDOMAIN_IMAGE_PROFILE - $(WMDOMAIN_IMAGE_PROFILE) - WMDOMAIN_IMAGE_RECOMMEND_PLAYLIST_ROUND - $(WMDOMAIN_IMAGE_RECOMMEND_PLAYLIST_ROUND) - WMDOMAIN_IMAGE_RECOMMEND_PLAYLIST_SQUARE - $(WMDOMAIN_IMAGE_RECOMMEND_PLAYLIST_SQUARE) + WMDOMAIN_CREDIT + $(WMDOMAIN_CREDIT) + WMDOMAIN_FAQ + $(WMDOMAIN_FAQ) + WMDOMAIN_IMAGE + $(WMDOMAIN_IMAGE) WMDOMAIN_LIKE $(WMDOMAIN_LIKE) WMDOMAIN_NOTICE $(WMDOMAIN_NOTICE) - WMDOMAIN_PLAY - $(WMDOMAIN_PLAY) + WMDOMAIN_NOTIFICATION + $(WMDOMAIN_NOTIFICATION) WMDOMAIN_PLAYLIST $(WMDOMAIN_PLAYLIST) - WMDOMAIN_QNA - $(WMDOMAIN_QNA) + WMDOMAIN_PRICE + $(WMDOMAIN_PRICE) + WMDOMAIN_SEARCH + $(WMDOMAIN_SEARCH) WMDOMAIN_SONGS $(WMDOMAIN_SONGS) - WMDOMAIN_V2_SONGS - $(WMDOMAIN_V2_SONGS) - WMDOMAIN_SUGGEST - $(WMDOMAIN_SUGGEST) + WMDOMAIN_TEAM + $(WMDOMAIN_TEAM) WMDOMAIN_USER $(WMDOMAIN_USER) WM_APP_ID $(WM_APP_ID) + WM_UNIVERSALLINK_DOMAIN + $(WM_UNIVERSALLINK_DOMAIN) + WM_UNIVERSALLINK_TEST_DOMAIN + $(WM_UNIVERSALLINK_TEST_DOMAIN) + WM_URI_SCHEME + $(WM_URI_SCHEME) UIApplicationSceneManifest @@ -144,6 +148,10 @@ UIApplicationSupportsIndirectInputEvents + UIBackgroundModes + + remote-notification + UILaunchStoryboardName LaunchScreen UIRequiredDeviceCapabilities diff --git a/Projects/App/Support/WaktaverseMusic.entitlements b/Projects/App/Support/WaktaverseMusic.entitlements index a2041499d..e3b209f7c 100644 --- a/Projects/App/Support/WaktaverseMusic.entitlements +++ b/Projects/App/Support/WaktaverseMusic.entitlements @@ -9,6 +9,10 @@ com.apple.developer.associated-domains applinks:wakmusic.xyz + applinks:deeplink.wakmusic.xyz + applinks:deeplink.eatcocoa.xyz + aps-environment + development diff --git a/Projects/App/Tests/TargetTest.swift b/Projects/App/Tests/TargetTest.swift index b1cf79405..147c29d2f 100644 --- a/Projects/App/Tests/TargetTest.swift +++ b/Projects/App/Tests/TargetTest.swift @@ -1,7 +1,6 @@ import XCTest class TargetTests: XCTestCase { - override func setUpWithError() throws { // Put setup code here. This method is called before the invocation of each test method in the class. } @@ -13,5 +12,4 @@ class TargetTests: XCTestCase { func testExample() throws { XCTAssertEqual("A", "A") } - } diff --git a/Projects/Domains/AppDomain/Interface/DataSource/RemoteAppDataSource.swift b/Projects/Domains/AppDomain/Interface/DataSource/RemoteAppDataSource.swift new file mode 100644 index 000000000..50d3cfcb7 --- /dev/null +++ b/Projects/Domains/AppDomain/Interface/DataSource/RemoteAppDataSource.swift @@ -0,0 +1,14 @@ +// +// RemoteAppDataSource.swift +// AppDomain +// +// Created by KTH on 2024/03/04. +// Copyright © 2024 yongbeomkwak. All rights reserved. +// + +import Foundation +import RxSwift + +public protocol RemoteAppDataSource { + func fetchAppCheck() -> Single +} diff --git a/Projects/Domains/AppDomain/Interface/Entity/AppCheckEntity.swift b/Projects/Domains/AppDomain/Interface/Entity/AppCheckEntity.swift new file mode 100644 index 000000000..e1898c66b --- /dev/null +++ b/Projects/Domains/AppDomain/Interface/Entity/AppCheckEntity.swift @@ -0,0 +1,29 @@ +// +// AppCheckEntity.swift +// AppDomain +// +// Created by KTH on 2024/03/04. +// Copyright © 2024 yongbeomkwak. All rights reserved. +// + +import Foundation + +public struct AppCheckEntity: Equatable { + public init( + flag: AppCheckFlagType, + title: String, + description: String, + version: String, + specialLogo: Bool + ) { + self.flag = flag + self.title = title + self.description = description + self.version = version + self.specialLogo = specialLogo + } + + public let flag: AppCheckFlagType + public let title, description, version: String + public let specialLogo: Bool +} diff --git a/Projects/Domains/AppDomain/Interface/Enum/AppCheckFlagType.swift b/Projects/Domains/AppDomain/Interface/Enum/AppCheckFlagType.swift new file mode 100644 index 000000000..ceb51c120 --- /dev/null +++ b/Projects/Domains/AppDomain/Interface/Enum/AppCheckFlagType.swift @@ -0,0 +1,17 @@ +// +// AppCheckFlagType.swift +// AppDomain +// +// Created by KTH on 2024/03/04. +// Copyright © 2024 yongbeomkwak. All rights reserved. +// + +import Foundation + +public enum AppCheckFlagType: Int, Decodable { + case normal = 1 + case event + case update + case forceUpdate + case offline +} diff --git a/Projects/Domains/AppDomain/Interface/Repository/AppRepository.swift b/Projects/Domains/AppDomain/Interface/Repository/AppRepository.swift new file mode 100644 index 000000000..c7519217f --- /dev/null +++ b/Projects/Domains/AppDomain/Interface/Repository/AppRepository.swift @@ -0,0 +1,14 @@ +// +// AppRepository.swift +// AppDomain +// +// Created by KTH on 2024/03/04. +// Copyright © 2024 yongbeomkwak. All rights reserved. +// + +import Foundation +import RxSwift + +public protocol AppRepository { + func fetchAppCheck() -> Single +} diff --git a/Projects/Domains/AppDomain/Interface/UseCase/FetchAppCheckUseCase.swift b/Projects/Domains/AppDomain/Interface/UseCase/FetchAppCheckUseCase.swift new file mode 100644 index 000000000..5c3bff09f --- /dev/null +++ b/Projects/Domains/AppDomain/Interface/UseCase/FetchAppCheckUseCase.swift @@ -0,0 +1,14 @@ +// +// FetchAppCheckUseCase.swift +// AppDomain +// +// Created by KTH on 2024/03/04. +// Copyright © 2024 yongbeomkwak. All rights reserved. +// + +import Foundation +import RxSwift + +public protocol FetchAppCheckUseCase { + func execute() -> Single +} diff --git a/Projects/Domains/AppDomain/Project.swift b/Projects/Domains/AppDomain/Project.swift new file mode 100644 index 000000000..54dd17947 --- /dev/null +++ b/Projects/Domains/AppDomain/Project.swift @@ -0,0 +1,26 @@ +import DependencyPlugin +import ProjectDescription +import ProjectDescriptionHelpers + +let project = Project.module( + name: ModulePaths.Domain.AppDomain.rawValue, + targets: [ + .interface( + module: .domain(.AppDomain), + dependencies: [ + .domain(target: .BaseDomain, type: .interface) + ] + ), + .implements( + module: .domain(.AppDomain), + dependencies: [ + .domain(target: .BaseDomain), + .domain(target: .AppDomain, type: .interface) + ] + ), + .tests( + module: .domain(.AppDomain), + dependencies: [.domain(target: .AppDomain)] + ) + ] +) diff --git a/Projects/Domains/AppDomain/Sources/API/AppAPI.swift b/Projects/Domains/AppDomain/Sources/API/AppAPI.swift new file mode 100644 index 000000000..c338db51a --- /dev/null +++ b/Projects/Domains/AppDomain/Sources/API/AppAPI.swift @@ -0,0 +1,64 @@ +// +// AppAPI.swift +// AppDomain +// +// Created by KTH on 2024/03/04. +// Copyright © 2024 yongbeomkwak. All rights reserved. +// + +import BaseDomain +import ErrorModule +import Foundation +import Moya + +public enum AppAPI { + case fetchAppCheck +} + +extension AppAPI: WMAPI { + public var domain: WMDomain { + return WMDomain.app + } + + public var urlPath: String { + switch self { + case .fetchAppCheck: + return "/check" + } + } + + public var method: Moya.Method { + return .get + } + + public var task: Moya.Task { + switch self { + case .fetchAppCheck: + return .requestPlain + } + } + + public var jwtTokenType: JwtTokenType { + return .none + } + + public var baseInfoTypes: [BaseInfoType] { + return [.os, .appVersion] + } + + public var errorMap: [Int: WMError] { + switch self { + default: + return [ + 400: .badRequest, + 401: .tokenExpired, + 404: .notFound, + 429: .tooManyRequest, + 500: .internalServerError, + 502: .internalServerError, + 521: .internalServerError, + 1009: .offline + ] + } + } +} diff --git a/Projects/Domains/AppDomain/Sources/DataSource/RemoteAppDataSourceImpl.swift b/Projects/Domains/AppDomain/Sources/DataSource/RemoteAppDataSourceImpl.swift new file mode 100644 index 000000000..fcc7871ec --- /dev/null +++ b/Projects/Domains/AppDomain/Sources/DataSource/RemoteAppDataSourceImpl.swift @@ -0,0 +1,20 @@ +// +// RemoteAppDataSourceImpl.swift +// AppDomain +// +// Created by KTH on 2024/03/04. +// Copyright © 2024 yongbeomkwak. All rights reserved. +// + +import AppDomainInterface +import BaseDomain +import Foundation +import RxSwift + +public final class RemoteAppDataSourceImpl: BaseRemoteDataSource, RemoteAppDataSource { + public func fetchAppCheck() -> Single { + request(.fetchAppCheck) + .map(FetchAppCheckResponseDTO.self) + .map { $0.toDomain() } + } +} diff --git a/Projects/Domains/AppDomain/Sources/Repository/AppRepositoryImpl.swift b/Projects/Domains/AppDomain/Sources/Repository/AppRepositoryImpl.swift new file mode 100644 index 000000000..52c2357af --- /dev/null +++ b/Projects/Domains/AppDomain/Sources/Repository/AppRepositoryImpl.swift @@ -0,0 +1,25 @@ +// +// AppRepositoryImpl.swift +// AppDomain +// +// Created by KTH on 2024/03/04. +// Copyright © 2024 yongbeomkwak. All rights reserved. +// + +import AppDomainInterface +import Foundation +import RxSwift + +public final class AppRepositoryImpl: AppRepository { + private let remoteAppDataSource: any RemoteAppDataSource + + public init( + remoteAppDataSource: RemoteAppDataSource + ) { + self.remoteAppDataSource = remoteAppDataSource + } + + public func fetchAppCheck() -> Single { + remoteAppDataSource.fetchAppCheck() + } +} diff --git a/Projects/Domains/AppDomain/Sources/ResponseDTO/FetchAppCheckResponseDTO.swift b/Projects/Domains/AppDomain/Sources/ResponseDTO/FetchAppCheckResponseDTO.swift new file mode 100644 index 000000000..2da9783e5 --- /dev/null +++ b/Projects/Domains/AppDomain/Sources/ResponseDTO/FetchAppCheckResponseDTO.swift @@ -0,0 +1,28 @@ +// +// AppCheckResponseDTO.swift +// AppDomain +// +// Created by KTH on 2024/03/04. +// Copyright © 2024 yongbeomkwak. All rights reserved. +// + +import AppDomainInterface +import Foundation + +public struct FetchAppCheckResponseDTO: Decodable { + public let flag: AppCheckFlagType + public let title, description, version: String? + public let specialLogo: Bool? +} + +public extension FetchAppCheckResponseDTO { + func toDomain() -> AppCheckEntity { + return AppCheckEntity( + flag: flag, + title: title ?? "", + description: description ?? "", + version: version ?? "", + specialLogo: specialLogo ?? false + ) + } +} diff --git a/Projects/Domains/AppDomain/Sources/UseCase/FetchAppCheckUseCaseImpl.swift b/Projects/Domains/AppDomain/Sources/UseCase/FetchAppCheckUseCaseImpl.swift new file mode 100644 index 000000000..a0d32619e --- /dev/null +++ b/Projects/Domains/AppDomain/Sources/UseCase/FetchAppCheckUseCaseImpl.swift @@ -0,0 +1,25 @@ +// +// FetchCheckAppUseCaseImpl.swift +// AppDomain +// +// Created by KTH on 2024/03/04. +// Copyright © 2024 yongbeomkwak. All rights reserved. +// + +import AppDomainInterface +import Foundation +import RxSwift + +public struct FetchAppCheckUseCaseImpl: FetchAppCheckUseCase { + private let appRepository: any AppRepository + + public init( + appRepository: AppRepository + ) { + self.appRepository = appRepository + } + + public func execute() -> Single { + appRepository.fetchAppCheck() + } +} diff --git a/Projects/Domains/AppDomain/Tests/Test.swift b/Projects/Domains/AppDomain/Tests/Test.swift new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/Projects/Domains/AppDomain/Tests/Test.swift @@ -0,0 +1 @@ + diff --git a/Projects/Domains/ArtistDomain/Interface/DataSource/RemoteArtistDataSource.swift b/Projects/Domains/ArtistDomain/Interface/DataSource/RemoteArtistDataSource.swift new file mode 100644 index 000000000..13b9d9204 --- /dev/null +++ b/Projects/Domains/ArtistDomain/Interface/DataSource/RemoteArtistDataSource.swift @@ -0,0 +1,10 @@ +import Foundation +import RxSwift + +public protocol RemoteArtistDataSource { + func fetchArtistList() -> Single<[ArtistEntity]> + func fetchArtistDetail(id: String) -> Single + func fetchArtistSongList(id: String, sort: ArtistSongSortType, page: Int) -> Single<[ArtistSongListEntity]> + func fetchArtistSubscriptionStatus(id: String) -> Single + func subscriptionArtist(id: String, on: Bool) -> Completable +} diff --git a/Projects/Domains/ArtistDomain/Interface/Entity/ArtistEntity.swift b/Projects/Domains/ArtistDomain/Interface/Entity/ArtistEntity.swift new file mode 100644 index 000000000..b4cf8500a --- /dev/null +++ b/Projects/Domains/ArtistDomain/Interface/Entity/ArtistEntity.swift @@ -0,0 +1,55 @@ +import Foundation + +public struct ArtistEntity: Equatable { + public init( + id: String, + krName: String, + enName: String, + groupName: String, + title: String, + description: String, + personalColor: String, + roundImage: String, + squareImage: String, + graduated: Bool, + playlist: ArtistEntity.Playlist, + isHiddenItem: Bool + ) { + self.id = id + self.krName = krName + self.enName = enName + self.groupName = groupName + self.title = title + self.description = description + self.personalColor = personalColor + self.roundImage = roundImage + self.squareImage = squareImage + self.graduated = graduated + self.playlist = playlist + self.isHiddenItem = isHiddenItem + } + + public static func == (lhs: Self, rhs: Self) -> Bool { + return lhs.id == rhs.id + } + + public let id, krName, enName, groupName: String + public let title, description: String + public let personalColor: String + public let roundImage, squareImage: String + public let graduated: Bool + public let playlist: ArtistEntity.Playlist + public var isHiddenItem: Bool = false +} + +public extension ArtistEntity { + struct Playlist { + public let latest, popular, oldest: String + + public init(latest: String, popular: String, oldest: String) { + self.latest = latest + self.popular = popular + self.oldest = oldest + } + } +} diff --git a/Projects/Domains/ArtistDomain/Interface/Entity/ArtistSongListEntity.swift b/Projects/Domains/ArtistDomain/Interface/Entity/ArtistSongListEntity.swift new file mode 100644 index 000000000..759e69eab --- /dev/null +++ b/Projects/Domains/ArtistDomain/Interface/Entity/ArtistSongListEntity.swift @@ -0,0 +1,24 @@ +import Foundation + +public struct ArtistSongListEntity: Equatable { + public init( + songID: String, + title: String, + artist: String, + date: String, + isSelected: Bool + ) { + self.songID = songID + self.title = title + self.artist = artist + self.date = date + self.isSelected = isSelected + } + + public static func == (lhs: Self, rhs: Self) -> Bool { + return lhs.songID == rhs.songID + } + + public let songID, title, artist, date: String + public var isSelected: Bool = false +} diff --git a/Projects/Domains/ArtistDomain/Interface/Entity/ArtistSubscriptionStatusEntity.swift b/Projects/Domains/ArtistDomain/Interface/Entity/ArtistSubscriptionStatusEntity.swift new file mode 100644 index 000000000..d0944a114 --- /dev/null +++ b/Projects/Domains/ArtistDomain/Interface/Entity/ArtistSubscriptionStatusEntity.swift @@ -0,0 +1,9 @@ +import Foundation + +public struct ArtistSubscriptionStatusEntity { + public init(isSubscription: Bool) { + self.isSubscription = isSubscription + } + + public let isSubscription: Bool +} diff --git a/Projects/Domains/ArtistDomain/Interface/Enum/ArtistSongSortType.swift b/Projects/Domains/ArtistDomain/Interface/Enum/ArtistSongSortType.swift new file mode 100644 index 000000000..f73039655 --- /dev/null +++ b/Projects/Domains/ArtistDomain/Interface/Enum/ArtistSongSortType.swift @@ -0,0 +1,18 @@ +import Foundation + +public enum ArtistSongSortType: Int { + case new = 1 + case popular + case old + + public var display: String { + switch self { + case .new: + return "최신순" + case .popular: + return "인기순" + case .old: + return "과거순" + } + } +} diff --git a/Projects/Domains/ArtistDomain/Interface/Repository/ArtistRepository.swift b/Projects/Domains/ArtistDomain/Interface/Repository/ArtistRepository.swift new file mode 100644 index 000000000..45d84abd2 --- /dev/null +++ b/Projects/Domains/ArtistDomain/Interface/Repository/ArtistRepository.swift @@ -0,0 +1,10 @@ +import Foundation +import RxSwift + +public protocol ArtistRepository { + func fetchArtistList() -> Single<[ArtistEntity]> + func fetchArtistDetail(id: String) -> Single + func fetchArtistSongList(id: String, sort: ArtistSongSortType, page: Int) -> Single<[ArtistSongListEntity]> + func fetchArtistSubscriptionStatus(id: String) -> Single + func subscriptionArtist(id: String, on: Bool) -> Completable +} diff --git a/Projects/Domains/ArtistDomain/Interface/UseCase/FetchArtistDetailUseCase.swift b/Projects/Domains/ArtistDomain/Interface/UseCase/FetchArtistDetailUseCase.swift new file mode 100644 index 000000000..f953bebd1 --- /dev/null +++ b/Projects/Domains/ArtistDomain/Interface/UseCase/FetchArtistDetailUseCase.swift @@ -0,0 +1,6 @@ +import Foundation +import RxSwift + +public protocol FetchArtistDetailUseCase { + func execute(id: String) -> Single +} diff --git a/Projects/Domains/ArtistDomain/Interface/UseCase/FetchArtistListUseCase.swift b/Projects/Domains/ArtistDomain/Interface/UseCase/FetchArtistListUseCase.swift new file mode 100644 index 000000000..33071ee5b --- /dev/null +++ b/Projects/Domains/ArtistDomain/Interface/UseCase/FetchArtistListUseCase.swift @@ -0,0 +1,6 @@ +import Foundation +import RxSwift + +public protocol FetchArtistListUseCase { + func execute() -> Single<[ArtistEntity]> +} diff --git a/Projects/Domains/ArtistDomain/Interface/UseCase/FetchArtistSongListUseCase.swift b/Projects/Domains/ArtistDomain/Interface/UseCase/FetchArtistSongListUseCase.swift new file mode 100644 index 000000000..8ac70f402 --- /dev/null +++ b/Projects/Domains/ArtistDomain/Interface/UseCase/FetchArtistSongListUseCase.swift @@ -0,0 +1,6 @@ +import Foundation +import RxSwift + +public protocol FetchArtistSongListUseCase { + func execute(id: String, sort: ArtistSongSortType, page: Int) -> Single<[ArtistSongListEntity]> +} diff --git a/Projects/Domains/ArtistDomain/Interface/UseCase/FetchArtistSubscriptionStatusUseCase.swift b/Projects/Domains/ArtistDomain/Interface/UseCase/FetchArtistSubscriptionStatusUseCase.swift new file mode 100644 index 000000000..27216630f --- /dev/null +++ b/Projects/Domains/ArtistDomain/Interface/UseCase/FetchArtistSubscriptionStatusUseCase.swift @@ -0,0 +1,6 @@ +import Foundation +import RxSwift + +public protocol FetchArtistSubscriptionStatusUseCase { + func execute(id: String) -> Single +} diff --git a/Projects/Domains/ArtistDomain/Interface/UseCase/SubscriptionArtistUseCase.swift b/Projects/Domains/ArtistDomain/Interface/UseCase/SubscriptionArtistUseCase.swift new file mode 100644 index 000000000..e8bbab6a8 --- /dev/null +++ b/Projects/Domains/ArtistDomain/Interface/UseCase/SubscriptionArtistUseCase.swift @@ -0,0 +1,6 @@ +import Foundation +import RxSwift + +public protocol SubscriptionArtistUseCase { + func execute(id: String, on: Bool) -> Completable +} diff --git a/Projects/Domains/ArtistDomain/Project.swift b/Projects/Domains/ArtistDomain/Project.swift new file mode 100644 index 000000000..40e1c0f73 --- /dev/null +++ b/Projects/Domains/ArtistDomain/Project.swift @@ -0,0 +1,30 @@ +import DependencyPlugin +import ProjectDescription +import ProjectDescriptionHelpers + +let project = Project.module( + name: ModulePaths.Domain.ArtistDomain.rawValue, + targets: [ + .interface( + module: .domain(.ArtistDomain), + dependencies: [ + .domain(target: .BaseDomain, type: .interface) + ] + ), + .implements( + module: .domain(.ArtistDomain), + dependencies: [ + .domain(target: .BaseDomain), + .domain(target: .ArtistDomain, type: .interface) + ] + ), + .testing( + module: .domain(.ArtistDomain), + dependencies: [.domain(target: .ArtistDomain, type: .interface)] + ), + .tests( + module: .domain(.ArtistDomain), + dependencies: [.domain(target: .ArtistDomain)] + ) + ] +) diff --git a/Projects/Domains/ArtistDomain/Sources/API/ArtistAPI.swift b/Projects/Domains/ArtistDomain/Sources/API/ArtistAPI.swift new file mode 100644 index 000000000..7ce3569a1 --- /dev/null +++ b/Projects/Domains/ArtistDomain/Sources/API/ArtistAPI.swift @@ -0,0 +1,86 @@ +import ArtistDomainInterface +import BaseDomain +import ErrorModule +import Foundation +import Moya + +public enum ArtistAPI { + case fetchArtistList + case fetchArtistDetail(id: String) + case fetchArtistSongList(id: String, sort: ArtistSongSortType, page: Int) + case fetchSubscriptionStatus(id: String) + case subscriptionArtist(id: String, on: Bool) +} + +extension ArtistAPI: WMAPI { + public var domain: WMDomain { + return .artist + } + + public var urlPath: String { + switch self { + case .fetchArtistList: + return "/list" + case let .fetchArtistDetail(id): + return "/\(id)" + case let .fetchArtistSongList(id, _, _): + return "/\(id)/songs" + case let .fetchSubscriptionStatus(id): + return "/\(id)/subscription" + case let .subscriptionArtist(id, _): + return "/\(id)/subscription" + } + } + + public var method: Moya.Method { + switch self { + case .fetchArtistList, + .fetchArtistDetail, + .fetchArtistSongList, + .fetchSubscriptionStatus: + return .get + case let .subscriptionArtist(_, on): + return on ? .post : .delete + } + } + + public var task: Moya.Task { + switch self { + case .fetchArtistList, + .fetchArtistDetail, + .fetchSubscriptionStatus, + .subscriptionArtist: + return .requestPlain + case let .fetchArtistSongList(_, sort, page): + return .requestParameters( + parameters: [ + "type": sort.rawValue, + "page": page + ], + encoding: URLEncoding.queryString + ) + } + } + + public var jwtTokenType: JwtTokenType { + switch self { + case .fetchArtistList, .fetchArtistDetail, .fetchArtistSongList: + return .none + case .fetchSubscriptionStatus, .subscriptionArtist: + return .accessToken + } + } + + public var errorMap: [Int: WMError] { + switch self { + default: + return [ + 400: .badRequest, + 401: .tokenExpired, + 404: .notFound, + 429: .tooManyRequest, + 500: .internalServerError + ] + } + } +} diff --git a/Projects/Domains/ArtistDomain/Sources/DataSource/RemoteArtistDataSourceImpl.swift b/Projects/Domains/ArtistDomain/Sources/DataSource/RemoteArtistDataSourceImpl.swift new file mode 100644 index 000000000..36c18ffe4 --- /dev/null +++ b/Projects/Domains/ArtistDomain/Sources/DataSource/RemoteArtistDataSourceImpl.swift @@ -0,0 +1,35 @@ +import ArtistDomainInterface +import BaseDomain +import Foundation +import RxSwift + +public final class RemoteArtistDataSourceImpl: BaseRemoteDataSource, RemoteArtistDataSource { + public func fetchArtistList() -> Single<[ArtistEntity]> { + request(.fetchArtistList) + .map([ArtistListResponseDTO].self) + .map { $0.map { $0.toDomain() } } + } + + public func fetchArtistDetail(id: String) -> Single { + request(.fetchArtistDetail(id: id)) + .map(ArtistDetailResponseDTO.self) + .map { $0.toDomain() } + } + + public func fetchArtistSongList(id: String, sort: ArtistSongSortType, page: Int) -> Single<[ArtistSongListEntity]> { + request(.fetchArtistSongList(id: id, sort: sort, page: page)) + .map([ArtistSongListResponseDTO].self) + .map { $0.map { $0.toDomain() } } + } + + public func fetchArtistSubscriptionStatus(id: String) -> Single { + request(.fetchSubscriptionStatus(id: id)) + .map(ArtistSubscriptionStatusResponseDTO.self) + .map { $0.toDomain() } + } + + public func subscriptionArtist(id: String, on: Bool) -> Completable { + request(.subscriptionArtist(id: id, on: on)) + .asCompletable() + } +} diff --git a/Projects/Domains/ArtistDomain/Sources/Repository/ArtistRepositoryImpl.swift b/Projects/Domains/ArtistDomain/Sources/Repository/ArtistRepositoryImpl.swift new file mode 100644 index 000000000..80b82c2ce --- /dev/null +++ b/Projects/Domains/ArtistDomain/Sources/Repository/ArtistRepositoryImpl.swift @@ -0,0 +1,32 @@ +import ArtistDomainInterface +import RxSwift + +public final class ArtistRepositoryImpl: ArtistRepository { + private let remoteArtistDataSource: any RemoteArtistDataSource + + public init( + remoteArtistDataSource: RemoteArtistDataSource + ) { + self.remoteArtistDataSource = remoteArtistDataSource + } + + public func fetchArtistList() -> Single<[ArtistEntity]> { + remoteArtistDataSource.fetchArtistList() + } + + public func fetchArtistDetail(id: String) -> Single { + remoteArtistDataSource.fetchArtistDetail(id: id) + } + + public func fetchArtistSongList(id: String, sort: ArtistSongSortType, page: Int) -> Single<[ArtistSongListEntity]> { + remoteArtistDataSource.fetchArtistSongList(id: id, sort: sort, page: page) + } + + public func fetchArtistSubscriptionStatus(id: String) -> Single { + remoteArtistDataSource.fetchArtistSubscriptionStatus(id: id) + } + + public func subscriptionArtist(id: String, on: Bool) -> Completable { + remoteArtistDataSource.subscriptionArtist(id: id, on: on) + } +} diff --git a/Projects/Domains/ArtistDomain/Sources/ResponseDTO/ArtistDetailResponseDTO.swift b/Projects/Domains/ArtistDomain/Sources/ResponseDTO/ArtistDetailResponseDTO.swift new file mode 100644 index 000000000..90d255977 --- /dev/null +++ b/Projects/Domains/ArtistDomain/Sources/ResponseDTO/ArtistDetailResponseDTO.swift @@ -0,0 +1,89 @@ +import ArtistDomainInterface +import Foundation + +public struct ArtistDetailResponseDTO: Decodable, Equatable { + let id: String + let name: ArtistDetailResponseDTO.Name + let group: ArtistDetailResponseDTO.Group + let info: ArtistDetailResponseDTO.Info + let imageURL: ArtistDetailResponseDTO.ImageURL + let graduated: Bool + + public static func == (lhs: Self, rhs: Self) -> Bool { + return lhs.id == rhs.id + } + + private enum CodingKeys: String, CodingKey { + case id + case name + case group + case info + case imageURL = "imageUrl" + case graduated + } +} + +public extension ArtistDetailResponseDTO { + struct Name: Decodable { + let krName: String + let enName: String + + private enum CodingKeys: String, CodingKey { + case krName = "kr" + case enName = "en" + } + } + + struct Group: Decodable { + let name: String + } + + struct Info: Decodable { + let title: ArtistDetailResponseDTO.Info.Title + let description: String + let color: ArtistDetailResponseDTO.Info.Color + let playlist: ArtistDetailResponseDTO.Info.Playlist + } + + struct ImageURL: Decodable { + let round: String + let square: String + } +} + +public extension ArtistDetailResponseDTO.Info { + struct Title: Decodable { + let short: String + } + + struct Color: Decodable { + let background: [[String]] + } + + struct Playlist: Decodable { + let latest, popular, oldest: String + } +} + +public extension ArtistDetailResponseDTO { + func toDomain() -> ArtistEntity { + ArtistEntity( + id: id, + krName: name.krName, + enName: name.enName, + groupName: group.name, + title: info.title.short, + description: info.description, + personalColor: info.color.background.flatMap { $0 }.first ?? "ffffff", + roundImage: imageURL.round, + squareImage: imageURL.square, + graduated: graduated, + playlist: ArtistEntity.Playlist( + latest: info.playlist.latest, + popular: info.playlist.popular, + oldest: info.playlist.oldest + ), + isHiddenItem: false + ) + } +} diff --git a/Projects/Domains/ArtistDomain/Sources/ResponseDTO/ArtistListResponseDTO.swift b/Projects/Domains/ArtistDomain/Sources/ResponseDTO/ArtistListResponseDTO.swift new file mode 100644 index 000000000..eec4fdb18 --- /dev/null +++ b/Projects/Domains/ArtistDomain/Sources/ResponseDTO/ArtistListResponseDTO.swift @@ -0,0 +1,89 @@ +import ArtistDomainInterface +import Foundation + +public struct ArtistListResponseDTO: Decodable, Equatable { + let id: String + let name: ArtistListResponseDTO.Name + let group: ArtistListResponseDTO.Group + let info: ArtistListResponseDTO.Info + let imageURL: ArtistListResponseDTO.ImageURL + let graduated: Bool + + public static func == (lhs: Self, rhs: Self) -> Bool { + return lhs.id == rhs.id + } + + private enum CodingKeys: String, CodingKey { + case id + case name + case group + case info + case imageURL = "imageUrl" + case graduated + } +} + +public extension ArtistListResponseDTO { + struct Name: Decodable { + let krName: String + let enName: String + + private enum CodingKeys: String, CodingKey { + case krName = "kr" + case enName = "en" + } + } + + struct Group: Decodable { + let name: String + } + + struct Info: Decodable { + let title: ArtistListResponseDTO.Info.Title + let description: String + let color: ArtistListResponseDTO.Info.Color + let playlist: ArtistListResponseDTO.Info.Playlist + } + + struct ImageURL: Decodable { + let round: String + let square: String + } +} + +public extension ArtistListResponseDTO.Info { + struct Title: Decodable { + let short: String + } + + struct Color: Decodable { + let background: [[String]] + } + + struct Playlist: Decodable { + let latest, popular, oldest: String + } +} + +public extension ArtistListResponseDTO { + func toDomain() -> ArtistEntity { + ArtistEntity( + id: id, + krName: name.krName, + enName: name.enName, + groupName: group.name, + title: info.title.short, + description: info.description, + personalColor: info.color.background.flatMap { $0 }.first ?? "ffffff", + roundImage: imageURL.round, + squareImage: imageURL.square, + graduated: graduated, + playlist: ArtistEntity.Playlist( + latest: info.playlist.latest, + popular: info.playlist.popular, + oldest: info.playlist.oldest + ), + isHiddenItem: false + ) + } +} diff --git a/Projects/Domains/ArtistDomain/Sources/ResponseDTO/ArtistSongListResponseDTO.swift b/Projects/Domains/ArtistDomain/Sources/ResponseDTO/ArtistSongListResponseDTO.swift new file mode 100644 index 000000000..45743b532 --- /dev/null +++ b/Projects/Domains/ArtistDomain/Sources/ResponseDTO/ArtistSongListResponseDTO.swift @@ -0,0 +1,30 @@ +import ArtistDomainInterface +import Foundation +import Utility + +public struct ArtistSongListResponseDTO: Decodable, Equatable { + let songID, title: String + let artists: [String] + let date: Int + + public static func == (lhs: Self, rhs: Self) -> Bool { + return lhs.songID == rhs.songID + } + + enum CodingKeys: String, CodingKey { + case songID = "videoId" + case title, artists, date + } +} + +public extension ArtistSongListResponseDTO { + func toDomain() -> ArtistSongListEntity { + ArtistSongListEntity( + songID: songID, + title: title, + artist: artists.joined(separator: ", "), + date: date.changeDateFormat(origin: "yyMMdd", result: "yyyy.MM.dd"), + isSelected: false + ) + } +} diff --git a/Projects/Domains/ArtistDomain/Sources/ResponseDTO/ArtistSubscriptionStatusResponseDTO.swift b/Projects/Domains/ArtistDomain/Sources/ResponseDTO/ArtistSubscriptionStatusResponseDTO.swift new file mode 100644 index 000000000..176936f18 --- /dev/null +++ b/Projects/Domains/ArtistDomain/Sources/ResponseDTO/ArtistSubscriptionStatusResponseDTO.swift @@ -0,0 +1,20 @@ +import ArtistDomainInterface +import Foundation + +public struct ArtistSubscriptionStatusResponseDTO: Decodable { + let status: String + let isSubscription: Bool + + private enum CodingKeys: String, CodingKey { + case status + case isSubscription = "data" + } +} + +public extension ArtistSubscriptionStatusResponseDTO { + func toDomain() -> ArtistSubscriptionStatusEntity { + return ArtistSubscriptionStatusEntity( + isSubscription: status == "success" ? isSubscription : false + ) + } +} diff --git a/Projects/Domains/ArtistDomain/Sources/UseCase/FetchArtistDetailUseCaseImpl.swift b/Projects/Domains/ArtistDomain/Sources/UseCase/FetchArtistDetailUseCaseImpl.swift new file mode 100644 index 000000000..52e0dc79b --- /dev/null +++ b/Projects/Domains/ArtistDomain/Sources/UseCase/FetchArtistDetailUseCaseImpl.swift @@ -0,0 +1,17 @@ +import ArtistDomainInterface +import Foundation +import RxSwift + +public struct FetchArtistDetailUseCaseImpl: FetchArtistDetailUseCase { + private let artistRepository: any ArtistRepository + + public init( + artistRepository: ArtistRepository + ) { + self.artistRepository = artistRepository + } + + public func execute(id: String) -> Single { + artistRepository.fetchArtistDetail(id: id) + } +} diff --git a/Projects/Domains/ArtistDomain/Sources/UseCase/FetchArtistListUseCaseImpl.swift b/Projects/Domains/ArtistDomain/Sources/UseCase/FetchArtistListUseCaseImpl.swift new file mode 100644 index 000000000..97ec4579c --- /dev/null +++ b/Projects/Domains/ArtistDomain/Sources/UseCase/FetchArtistListUseCaseImpl.swift @@ -0,0 +1,17 @@ +import ArtistDomainInterface +import Foundation +import RxSwift + +public struct FetchArtistListUseCaseImpl: FetchArtistListUseCase { + private let artistRepository: any ArtistRepository + + public init( + artistRepository: ArtistRepository + ) { + self.artistRepository = artistRepository + } + + public func execute() -> Single<[ArtistEntity]> { + artistRepository.fetchArtistList() + } +} diff --git a/Projects/Domains/ArtistDomain/Sources/UseCase/FetchArtistSongListUseCaseImpl.swift b/Projects/Domains/ArtistDomain/Sources/UseCase/FetchArtistSongListUseCaseImpl.swift new file mode 100644 index 000000000..4c5b61552 --- /dev/null +++ b/Projects/Domains/ArtistDomain/Sources/UseCase/FetchArtistSongListUseCaseImpl.swift @@ -0,0 +1,17 @@ +import ArtistDomainInterface +import Foundation +import RxSwift + +public struct FetchArtistSongListUseCaseImpl: FetchArtistSongListUseCase { + private let artistRepository: any ArtistRepository + + public init( + artistRepository: ArtistRepository + ) { + self.artistRepository = artistRepository + } + + public func execute(id: String, sort: ArtistSongSortType, page: Int) -> Single<[ArtistSongListEntity]> { + artistRepository.fetchArtistSongList(id: id, sort: sort, page: page) + } +} diff --git a/Projects/Domains/ArtistDomain/Sources/UseCase/FetchSubscriptionStatusUseCaseImpl.swift b/Projects/Domains/ArtistDomain/Sources/UseCase/FetchSubscriptionStatusUseCaseImpl.swift new file mode 100644 index 000000000..749091453 --- /dev/null +++ b/Projects/Domains/ArtistDomain/Sources/UseCase/FetchSubscriptionStatusUseCaseImpl.swift @@ -0,0 +1,17 @@ +import ArtistDomainInterface +import Foundation +import RxSwift + +public struct FetchSubscriptionStatusUseCaseImpl: FetchArtistSubscriptionStatusUseCase { + private let artistRepository: any ArtistRepository + + public init( + artistRepository: ArtistRepository + ) { + self.artistRepository = artistRepository + } + + public func execute(id: String) -> Single { + artistRepository.fetchArtistSubscriptionStatus(id: id) + } +} diff --git a/Projects/Domains/ArtistDomain/Sources/UseCase/SubscriptionArtistUseCaseImpl.swift b/Projects/Domains/ArtistDomain/Sources/UseCase/SubscriptionArtistUseCaseImpl.swift new file mode 100644 index 000000000..cfd36afb5 --- /dev/null +++ b/Projects/Domains/ArtistDomain/Sources/UseCase/SubscriptionArtistUseCaseImpl.swift @@ -0,0 +1,17 @@ +import ArtistDomainInterface +import Foundation +import RxSwift + +public struct SubscriptionArtistUseCaseImpl: SubscriptionArtistUseCase { + private let artistRepository: any ArtistRepository + + public init( + artistRepository: ArtistRepository + ) { + self.artistRepository = artistRepository + } + + public func execute(id: String, on: Bool) -> Completable { + artistRepository.subscriptionArtist(id: id, on: on) + } +} diff --git a/Projects/Domains/ArtistDomain/Testing/UseCase/FetchArtistListUseCaseSpy.swift b/Projects/Domains/ArtistDomain/Testing/UseCase/FetchArtistListUseCaseSpy.swift new file mode 100644 index 000000000..56f15cd9c --- /dev/null +++ b/Projects/Domains/ArtistDomain/Testing/UseCase/FetchArtistListUseCaseSpy.swift @@ -0,0 +1,12 @@ +import ArtistDomainInterface +import Foundation +import RxSwift + +public final class FetchArtistListUseCaseSpy: FetchArtistListUseCase { + public private(set) var callCount = 0 + public var handler: (() -> Single<[ArtistEntity]>) = { .never() } + public func execute() -> Single<[ArtistEntity]> { + callCount += 1 + return handler() + } +} diff --git a/Projects/Domains/ArtistDomain/Tests/ArtistDomainTest.swift b/Projects/Domains/ArtistDomain/Tests/ArtistDomainTest.swift new file mode 100644 index 000000000..79630002d --- /dev/null +++ b/Projects/Domains/ArtistDomain/Tests/ArtistDomainTest.swift @@ -0,0 +1,11 @@ +import XCTest + +final class ArtistDomainTests: XCTestCase { + override func setUpWithError() throws {} + + override func tearDownWithError() throws {} + + func testExample() { + XCTAssertEqual(1, 1) + } +} diff --git a/Projects/Domains/AuthDomain/Interface/DataSource/LocalAuthDataSource.swift b/Projects/Domains/AuthDomain/Interface/DataSource/LocalAuthDataSource.swift new file mode 100644 index 000000000..524736e50 --- /dev/null +++ b/Projects/Domains/AuthDomain/Interface/DataSource/LocalAuthDataSource.swift @@ -0,0 +1,6 @@ +import RxSwift + +public protocol LocalAuthDataSource { + func logout() + func checkIsExistAccessToken() -> Bool +} diff --git a/Projects/Domains/AuthDomain/Interface/DataSource/RemoteAuthDataSource.swift b/Projects/Domains/AuthDomain/Interface/DataSource/RemoteAuthDataSource.swift new file mode 100644 index 000000000..966dbf858 --- /dev/null +++ b/Projects/Domains/AuthDomain/Interface/DataSource/RemoteAuthDataSource.swift @@ -0,0 +1,8 @@ +import Foundation +import RxSwift + +public protocol RemoteAuthDataSource { + func fetchToken(providerType: ProviderType, token: String) -> Single + func reGenerateAccessToken() -> Single + func logout() -> Completable +} diff --git a/Projects/Domains/AuthDomain/Interface/Entity/AuthLoginEntity.swift b/Projects/Domains/AuthDomain/Interface/Entity/AuthLoginEntity.swift new file mode 100644 index 000000000..c6c5bf12c --- /dev/null +++ b/Projects/Domains/AuthDomain/Interface/Entity/AuthLoginEntity.swift @@ -0,0 +1,11 @@ +import Foundation + +public struct AuthLoginEntity: Equatable { + public init( + token: String + ) { + self.token = token + } + + public let token: String +} diff --git a/Projects/Services/DataMappingModule/Sources/Base/ProviderType.swift b/Projects/Domains/AuthDomain/Interface/Enum/ProviderType.swift similarity index 90% rename from Projects/Services/DataMappingModule/Sources/Base/ProviderType.swift rename to Projects/Domains/AuthDomain/Interface/Enum/ProviderType.swift index b602c5d0a..8b160b8ca 100644 --- a/Projects/Services/DataMappingModule/Sources/Base/ProviderType.swift +++ b/Projects/Domains/AuthDomain/Interface/Enum/ProviderType.swift @@ -8,7 +8,7 @@ import Foundation -public enum ProviderType: String, Codable { +public enum ProviderType: String { case naver case apple case google diff --git a/Projects/Domains/AuthDomain/Interface/Repository/AuthRepository.swift b/Projects/Domains/AuthDomain/Interface/Repository/AuthRepository.swift new file mode 100644 index 000000000..ffa21aa9b --- /dev/null +++ b/Projects/Domains/AuthDomain/Interface/Repository/AuthRepository.swift @@ -0,0 +1,9 @@ +import Foundation +import RxSwift + +public protocol AuthRepository { + func fetchToken(providerType: ProviderType, token: String) -> Single + func reGenerateAccessToken() -> Single + func logout(localOnly: Bool) -> Completable + func checkIsExistAccessToken() -> Single +} diff --git a/Projects/Domains/AuthDomain/Interface/UseCase/CheckIsExistAccessTokenUseCase.swift b/Projects/Domains/AuthDomain/Interface/UseCase/CheckIsExistAccessTokenUseCase.swift new file mode 100644 index 000000000..434275268 --- /dev/null +++ b/Projects/Domains/AuthDomain/Interface/UseCase/CheckIsExistAccessTokenUseCase.swift @@ -0,0 +1,5 @@ +import RxSwift + +public protocol CheckIsExistAccessTokenUseCase { + func execute() -> Single +} diff --git a/Projects/Domains/AuthDomain/Interface/UseCase/FetchTokenUseCase.swift b/Projects/Domains/AuthDomain/Interface/UseCase/FetchTokenUseCase.swift new file mode 100644 index 000000000..4a8b6cfa7 --- /dev/null +++ b/Projects/Domains/AuthDomain/Interface/UseCase/FetchTokenUseCase.swift @@ -0,0 +1,6 @@ +import Foundation +import RxSwift + +public protocol FetchTokenUseCase { + func execute(providerType: ProviderType, token: String) -> Single +} diff --git a/Projects/Domains/AuthDomain/Interface/UseCase/LogoutUseCase.swift b/Projects/Domains/AuthDomain/Interface/UseCase/LogoutUseCase.swift new file mode 100644 index 000000000..8c81f1735 --- /dev/null +++ b/Projects/Domains/AuthDomain/Interface/UseCase/LogoutUseCase.swift @@ -0,0 +1,5 @@ +import RxSwift + +public protocol LogoutUseCase { + func execute(localOnly: Bool) -> Completable +} diff --git a/Projects/Domains/AuthDomain/Interface/UseCase/ReGenerateAccessTokenUseCase.swift b/Projects/Domains/AuthDomain/Interface/UseCase/ReGenerateAccessTokenUseCase.swift new file mode 100644 index 000000000..6daa03e4f --- /dev/null +++ b/Projects/Domains/AuthDomain/Interface/UseCase/ReGenerateAccessTokenUseCase.swift @@ -0,0 +1,6 @@ +import Foundation +import RxSwift + +public protocol ReGenerateAccessTokenUseCase { + func execute() -> Single +} diff --git a/Projects/Domains/AuthDomain/Project.swift b/Projects/Domains/AuthDomain/Project.swift new file mode 100644 index 000000000..6f577e8ca --- /dev/null +++ b/Projects/Domains/AuthDomain/Project.swift @@ -0,0 +1,30 @@ +import DependencyPlugin +import ProjectDescription +import ProjectDescriptionHelpers + +let project = Project.module( + name: ModulePaths.Domain.AuthDomain.rawValue, + targets: [ + .interface( + module: .domain(.AuthDomain), + dependencies: [ + .domain(target: .BaseDomain, type: .interface) + ] + ), + .implements( + module: .domain(.AuthDomain), + dependencies: [ + .domain(target: .BaseDomain), + .domain(target: .AuthDomain, type: .interface) + ] + ), + .testing( + module: .domain(.AuthDomain), + dependencies: [.domain(target: .AuthDomain, type: .interface)] + ), + .tests( + module: .domain(.AuthDomain), + dependencies: [.domain(target: .AuthDomain)] + ) + ] +) diff --git a/Projects/Domains/AuthDomain/Sources/API/AuthAPI.swift b/Projects/Domains/AuthDomain/Sources/API/AuthAPI.swift new file mode 100644 index 000000000..59b425591 --- /dev/null +++ b/Projects/Domains/AuthDomain/Sources/API/AuthAPI.swift @@ -0,0 +1,94 @@ +import AuthDomainInterface +import BaseDomain +import ErrorModule +import Foundation +import Moya + +public enum AuthAPI { + case fetchToken(providerType: ProviderType, token: String) + case reGenerateAccessToken + case logout +} + +private struct FetchTokenRequestParameters: Encodable { + var provider: String + var token: String +} + +extension AuthAPI: WMAPI { + public var baseURL: URL { + return URL(string: BASE_URL())! + } + + public var domain: WMDomain { + return .auth + } + + public var urlPath: String { + switch self { + case .fetchToken: + return "/app" + case .reGenerateAccessToken: + return "/token" + case .logout: + return "/logout" + } + } + + public var method: Moya.Method { + switch self { + case .fetchToken: + return .post + case .reGenerateAccessToken: + return .post + case .logout: + return .post + } + } + + public var headers: [String: String]? { + return ["Content-Type": "application/json"] + } + + public var task: Moya.Task { + switch self { + case let .fetchToken(providerType: providerType, token: id): + return .requestJSONEncodable( + FetchTokenRequestParameters( + provider: providerType.rawValue, + token: id + ) + ) + case .reGenerateAccessToken: + return .requestPlain + + case .logout: + return .requestPlain + } + } + + public var jwtTokenType: JwtTokenType { + switch self { + case .fetchToken: + return .none + case .reGenerateAccessToken: + return .refreshToken + + case .logout: + return .refreshToken + } + } + + public var errorMap: [Int: WMError] { + switch self { + default: + return [ + 400: .badRequest, + 401: .tokenExpired, + 404: .notFound, + 429: .tooManyRequest, + 500: .internalServerError + ] + } + } +} diff --git a/Projects/Domains/AuthDomain/Sources/DataSource/LocalAuthDataSourceImpl.swift b/Projects/Domains/AuthDomain/Sources/DataSource/LocalAuthDataSourceImpl.swift new file mode 100644 index 000000000..fe305a2d6 --- /dev/null +++ b/Projects/Domains/AuthDomain/Sources/DataSource/LocalAuthDataSourceImpl.swift @@ -0,0 +1,24 @@ +import AuthDomainInterface +import KeychainModule +import RxSwift +import Utility + +public final class LocalAuthDataSourceImpl: LocalAuthDataSource { + private let keychain: any Keychain + + public init(keychain: any Keychain) { + self.keychain = keychain + } + + public func logout() { + keychain.delete(type: .accessToken) + keychain.delete(type: .refreshToken) + keychain.delete(type: .accessExpiresIn) + PreferenceManager.clearUserInfo() + } + + public func checkIsExistAccessToken() -> Bool { + let isEmptyAccessToken = keychain.load(type: .accessToken).isEmpty + return !isEmptyAccessToken + } +} diff --git a/Projects/Domains/AuthDomain/Sources/DataSource/RemoteAuthDataSourceImpl.swift b/Projects/Domains/AuthDomain/Sources/DataSource/RemoteAuthDataSourceImpl.swift new file mode 100644 index 000000000..fef5f1631 --- /dev/null +++ b/Projects/Domains/AuthDomain/Sources/DataSource/RemoteAuthDataSourceImpl.swift @@ -0,0 +1,24 @@ +import AuthDomainInterface +import BaseDomain +import BaseDomainInterface +import Foundation +import RxSwift + +public final class RemoteAuthDataSourceImpl: BaseRemoteDataSource, RemoteAuthDataSource { + public func fetchToken(providerType: ProviderType, token: String) -> Single { + request(.fetchToken(providerType: providerType, token: token)) + .map(AuthLoginResponseDTO.self) + .map { $0.toDomain() } + } + + public func reGenerateAccessToken() -> Single { + request(.reGenerateAccessToken) + .map(AuthLoginResponseDTO.self) + .map { $0.toDomain() } + } + + public func logout() -> Completable { + request(.logout) + .asCompletable() + } +} diff --git a/Projects/Domains/AuthDomain/Sources/Repository/AuthRepositoryImpl.swift b/Projects/Domains/AuthDomain/Sources/Repository/AuthRepositoryImpl.swift new file mode 100644 index 000000000..41899953f --- /dev/null +++ b/Projects/Domains/AuthDomain/Sources/Repository/AuthRepositoryImpl.swift @@ -0,0 +1,53 @@ +// +// ArtistRepositoryImpl.swift +// DataModule +// +// Created by KTH on 2023/02/08. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import AuthDomainInterface +import BaseDomainInterface +import RxSwift + +public final class AuthRepositoryImpl: AuthRepository { + private let localAuthDataSource: any LocalAuthDataSource + private let remoteAuthDataSource: any RemoteAuthDataSource + + public init( + localAuthDataSource: any LocalAuthDataSource, + remoteAuthDataSource: any RemoteAuthDataSource + ) { + self.localAuthDataSource = localAuthDataSource + self.remoteAuthDataSource = remoteAuthDataSource + } + + public func fetchToken(providerType: ProviderType, token: String) -> Single { + remoteAuthDataSource.fetchToken(providerType: providerType, token: token) + } + + public func reGenerateAccessToken() -> Single { + remoteAuthDataSource.reGenerateAccessToken() + } + + public func logout(localOnly: Bool) -> Completable { + let localLogoutCompletable = Completable.create { [localAuthDataSource] observer in + localAuthDataSource.logout() + observer(.completed) + return Disposables.create() + } + + if localOnly { + return localLogoutCompletable + + } else { + return remoteAuthDataSource.logout() + .andThen(localLogoutCompletable) + } + } + + public func checkIsExistAccessToken() -> Single { + let isExistAccessToken = localAuthDataSource.checkIsExistAccessToken() + return .just(isExistAccessToken) + } +} diff --git a/Projects/Domains/AuthDomain/Sources/ResponseDTO/AuthLoginResponseDTO.swift b/Projects/Domains/AuthDomain/Sources/ResponseDTO/AuthLoginResponseDTO.swift new file mode 100644 index 000000000..1a80dd48d --- /dev/null +++ b/Projects/Domains/AuthDomain/Sources/ResponseDTO/AuthLoginResponseDTO.swift @@ -0,0 +1,22 @@ +import AuthDomainInterface +import Foundation + +public struct AuthLoginResponseDTO: Decodable, Equatable { + public let accessToken: String + public let expiresIn: TimeInterval + public let refreshToken: String? + + public static func == (lhs: Self, rhs: Self) -> Bool { + lhs.accessToken == rhs.accessToken + && lhs.expiresIn == rhs.expiresIn + && lhs.refreshToken == rhs.refreshToken + } +} + +public extension AuthLoginResponseDTO { + func toDomain() -> AuthLoginEntity { + AuthLoginEntity( + token: accessToken + ) + } +} diff --git a/Projects/Domains/AuthDomain/Sources/UseCase/CheckIsExistAccessTokenUseCaseImpl.swift b/Projects/Domains/AuthDomain/Sources/UseCase/CheckIsExistAccessTokenUseCaseImpl.swift new file mode 100644 index 000000000..621af9caf --- /dev/null +++ b/Projects/Domains/AuthDomain/Sources/UseCase/CheckIsExistAccessTokenUseCaseImpl.swift @@ -0,0 +1,14 @@ +import AuthDomainInterface +import RxSwift + +public struct CheckIsExistAccessTokenUseCaseImpl: CheckIsExistAccessTokenUseCase { + private let authRepository: any AuthRepository + + public init(authRepository: any AuthRepository) { + self.authRepository = authRepository + } + + public func execute() -> Single { + authRepository.checkIsExistAccessToken() + } +} diff --git a/Projects/Domains/AuthDomain/Sources/UseCase/FetchTokenUseCaseImpl.swift b/Projects/Domains/AuthDomain/Sources/UseCase/FetchTokenUseCaseImpl.swift new file mode 100644 index 000000000..d322f4add --- /dev/null +++ b/Projects/Domains/AuthDomain/Sources/UseCase/FetchTokenUseCaseImpl.swift @@ -0,0 +1,16 @@ +import AuthDomainInterface +import Foundation +import RxSwift +import Utility + +public struct FetchTokenUseCaseImpl: FetchTokenUseCase { + private let authRepository: any AuthRepository + + public init(authRepository: any AuthRepository) { + self.authRepository = authRepository + } + + public func execute(providerType: ProviderType, token: String) -> Single { + authRepository.fetchToken(providerType: providerType, token: token) + } +} diff --git a/Projects/Domains/AuthDomain/Sources/UseCase/LogoutUseCaseImpl.swift b/Projects/Domains/AuthDomain/Sources/UseCase/LogoutUseCaseImpl.swift new file mode 100644 index 000000000..3b9cc75c5 --- /dev/null +++ b/Projects/Domains/AuthDomain/Sources/UseCase/LogoutUseCaseImpl.swift @@ -0,0 +1,17 @@ +import AuthDomainInterface +import BaseDomainInterface +import Foundation +import RxSwift +import Utility + +public struct LogoutUseCaseImpl: LogoutUseCase { + private let authRepository: any AuthRepository + + public init(authRepository: any AuthRepository) { + self.authRepository = authRepository + } + + public func execute(localOnly: Bool) -> Completable { + authRepository.logout(localOnly: localOnly) + } +} diff --git a/Projects/Domains/AuthDomain/Sources/UseCase/ReGenerateAccessTokenUseCaseImpl.swift b/Projects/Domains/AuthDomain/Sources/UseCase/ReGenerateAccessTokenUseCaseImpl.swift new file mode 100644 index 000000000..38948410c --- /dev/null +++ b/Projects/Domains/AuthDomain/Sources/UseCase/ReGenerateAccessTokenUseCaseImpl.swift @@ -0,0 +1,15 @@ +import AuthDomainInterface +import Foundation +import RxSwift + +public struct ReGenerateAccessTokenUseCaseImpl: ReGenerateAccessTokenUseCase { + private let authRepository: any AuthRepository + + public init(authRepository: any AuthRepository) { + self.authRepository = authRepository + } + + public func execute() -> Single { + authRepository.reGenerateAccessToken() + } +} diff --git a/Projects/Domains/AuthDomain/Testing/CheckIsExistAccessTokenUseCaseStub.swift b/Projects/Domains/AuthDomain/Testing/CheckIsExistAccessTokenUseCaseStub.swift new file mode 100644 index 000000000..80bfb1c72 --- /dev/null +++ b/Projects/Domains/AuthDomain/Testing/CheckIsExistAccessTokenUseCaseStub.swift @@ -0,0 +1,8 @@ +import AuthDomainInterface +import RxSwift + +public struct CheckIsExistAccessTokenUseCaseStub: CheckIsExistAccessTokenUseCase { + public func execute() -> Single { + return .just(false) + } +} diff --git a/Projects/Domains/AuthDomain/Testing/FetchTokenUseCaseSpy.swift b/Projects/Domains/AuthDomain/Testing/FetchTokenUseCaseSpy.swift new file mode 100644 index 000000000..eb4b8f8a2 --- /dev/null +++ b/Projects/Domains/AuthDomain/Testing/FetchTokenUseCaseSpy.swift @@ -0,0 +1,8 @@ +import AuthDomainInterface +import RxSwift + +public struct FetchTokenUseCaseSpy: FetchTokenUseCase { + public func execute(providerType: ProviderType, token: String) -> Single { + return .just(AuthLoginEntity(token: "")) + } +} diff --git a/Projects/Domains/AuthDomain/Testing/LogoutUseCaseSpy.swift b/Projects/Domains/AuthDomain/Testing/LogoutUseCaseSpy.swift new file mode 100644 index 000000000..65fb1056e --- /dev/null +++ b/Projects/Domains/AuthDomain/Testing/LogoutUseCaseSpy.swift @@ -0,0 +1,11 @@ +import AuthDomainInterface +import RxSwift + +public struct LogoutUseCaseSpy: LogoutUseCase { + public func execute(localOnly: Bool) -> Completable { + Completable.create { observer in + observer(.completed) + return Disposables.create() + } + } +} diff --git a/Projects/Domains/AuthDomain/Tests/AuthDomainTest.swift b/Projects/Domains/AuthDomain/Tests/AuthDomainTest.swift new file mode 100644 index 000000000..2e2cca093 --- /dev/null +++ b/Projects/Domains/AuthDomain/Tests/AuthDomainTest.swift @@ -0,0 +1,11 @@ +import XCTest + +final class AuthDomainTests: XCTestCase { + override func setUpWithError() throws {} + + override func tearDownWithError() throws {} + + func testExample() { + XCTAssertEqual(1, 1) + } +} diff --git a/Projects/Domains/BaseDomain/Interface/Entity/BaseEntity.swift b/Projects/Domains/BaseDomain/Interface/Entity/BaseEntity.swift new file mode 100644 index 000000000..433489ce4 --- /dev/null +++ b/Projects/Domains/BaseDomain/Interface/Entity/BaseEntity.swift @@ -0,0 +1,14 @@ +import Foundation + +public struct BaseEntity { + public init( + status: Int, + description: String = "" + ) { + self.status = status + self.description = description + } + + public let status: Int + public var description: String = "" +} diff --git a/Projects/Domains/BaseDomain/Interface/Entity/BaseImageEntity.swift b/Projects/Domains/BaseDomain/Interface/Entity/BaseImageEntity.swift new file mode 100644 index 000000000..c8276c4c9 --- /dev/null +++ b/Projects/Domains/BaseDomain/Interface/Entity/BaseImageEntity.swift @@ -0,0 +1,11 @@ +import Foundation + +public struct BaseImageEntity { + public init( + image: String + ) { + self.image = image + } + + public let image: String +} diff --git a/Projects/Domains/BaseDomain/Project.swift b/Projects/Domains/BaseDomain/Project.swift new file mode 100644 index 000000000..83e969785 --- /dev/null +++ b/Projects/Domains/BaseDomain/Project.swift @@ -0,0 +1,32 @@ +import DependencyPlugin +import ProjectDescription +import ProjectDescriptionHelpers + +let project = Project.module( + name: ModulePaths.Domain.BaseDomain.rawValue, + targets: [ + .interface( + module: .domain(.BaseDomain), + dependencies: [ + .module(target: .ThirdPartyLib), + .module(target: .ErrorModule) + ] + ), + .implements( + module: .domain(.BaseDomain), + dependencies: [ + .module(target: .Utility), + .module(target: .KeychainModule), + .domain(target: .BaseDomain, type: .interface) + ] + ), + .testing( + module: .domain(.BaseDomain), + dependencies: [.domain(target: .BaseDomain, type: .interface)] + ), + .tests( + module: .domain(.BaseDomain), + dependencies: [.domain(target: .BaseDomain)] + ) + ] +) diff --git a/Projects/Domains/BaseDomain/Sources/BasePlugin/BaseInfoSendable.swift b/Projects/Domains/BaseDomain/Sources/BasePlugin/BaseInfoSendable.swift new file mode 100644 index 000000000..2129375a7 --- /dev/null +++ b/Projects/Domains/BaseDomain/Sources/BasePlugin/BaseInfoSendable.swift @@ -0,0 +1,23 @@ +public enum BaseInfoType: String { + case os + case appVersion + case deviceID + case pushToken + + var apiKey: String { + switch self { + case .os: + return "os" + case .appVersion: + return "version" + case .deviceID: + return "uniqueDeviceId" + case .pushToken: + return "token" + } + } +} + +public protocol BaseInfoSendable { + var baseInfoTypes: [BaseInfoType] { get } +} diff --git a/Projects/Domains/BaseDomain/Sources/BasePlugin/BasePlugin.swift b/Projects/Domains/BaseDomain/Sources/BasePlugin/BasePlugin.swift new file mode 100644 index 000000000..a6da000cd --- /dev/null +++ b/Projects/Domains/BaseDomain/Sources/BasePlugin/BasePlugin.swift @@ -0,0 +1,92 @@ +import FirebaseMessaging +import Foundation +import KeychainModule +import LogManager +import Moya +import UIKit + +public struct BasePlugin: PluginType { + private let keychain: any Keychain + + public init(keychain: any Keychain) { + self.keychain = keychain + } + + public func prepare( + _ request: URLRequest, + target: TargetType + ) -> URLRequest { + guard let baseInfoTypes = (target as? BaseInfoSendable)?.baseInfoTypes, + baseInfoTypes.isEmpty == false else { + return request + } + var newRequest = request + + if request.httpMethod == "GET" || request.httpMethod == "DELETE" { + guard let url = request.url, + var urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: false) else { + return request + } + + var queryItems: [URLQueryItem] = urlComponents.queryItems ?? [] + + for type in baseInfoTypes { + let queryItem = URLQueryItem(name: type.apiKey, value: typeToValue(with: type)) + queryItems.append(queryItem) + } + + urlComponents.queryItems = queryItems + newRequest.url = urlComponents.url + + } else { + var newJson: [String: Any] = [:] + if let bodyData = request.httpBody, + let json = try? JSONSerialization.jsonObject(with: bodyData, options: []) as? [String: Any] { + newJson = json + } + + for type in baseInfoTypes { + newJson[type.apiKey] = typeToValue(with: type) + } + + guard let newBodyData = try? JSONSerialization.data(withJSONObject: newJson, options: []) else { + return request + } + newRequest.httpBody = newBodyData + } + + return newRequest + } +} + +private extension BasePlugin { + func typeToValue(with type: BaseInfoType) -> String { + switch type { + case .os: + return "ios" + case .appVersion: + return Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String ?? "" + case .deviceID: + return fetchDeviceID() + case .pushToken: + return fetchPushToken() + } + } + + func fetchDeviceID() -> String { + let deviceIDFromKeychain: String = keychain.load(type: .deviceID) + let uuidString: String = UIDevice.current.identifierForVendor?.uuidString ?? "" + + if deviceIDFromKeychain.isEmpty { + keychain.save(type: .deviceID, value: uuidString) + return uuidString + + } else { + return deviceIDFromKeychain + } + } + + func fetchPushToken() -> String { + return Messaging.messaging().fcmToken ?? "" + } +} diff --git a/Projects/Domains/BaseDomain/Sources/DataSource/BaseRemoteDataSource.swift b/Projects/Domains/BaseDomain/Sources/DataSource/BaseRemoteDataSource.swift new file mode 100644 index 000000000..ad03cb542 --- /dev/null +++ b/Projects/Domains/BaseDomain/Sources/DataSource/BaseRemoteDataSource.swift @@ -0,0 +1,126 @@ +// +// BaseRemoteDataSource.swift +// BaseDomain +// +// Created by KTH on 2024/03/04. +// Copyright © 2024 yongbeomkwak. All rights reserved. +// + +import Foundation +import KeychainModule +import Moya +import RxMoya +import RxSwift + +open class BaseRemoteDataSource { + private let keychain: any Keychain + private let provider: MoyaProvider + private var refreshProvider: MoyaProvider? + private let decoder = JSONDecoder() + private let maxRetryCount = 2 + + public init( + keychain: any Keychain, + provider: MoyaProvider? = nil + ) { + self.keychain = keychain + + #if DEBUG || QA + self.provider = provider ?? MoyaProvider(plugins: [ + JwtPlugin(keychain: keychain), + BasePlugin(keychain: keychain), + CustomLoggingPlugin() + ]) + #else + self.provider = provider ?? MoyaProvider(plugins: [ + JwtPlugin(keychain: keychain), + BasePlugin(keychain: keychain) + ]) + #endif + } + + public func request(_ api: API) -> Single { + return Single.create { single in + var disposabels = [Disposable]() + if self.checkIsApiNeedsAuthorization(api) { + disposabels.append( + self.authorizedRequest(api).subscribe( + onSuccess: { single(.success($0)) }, + onFailure: { single(.failure($0)) } + ) + ) + } else { + disposabels.append( + self.defaultRequest(api).subscribe( + onSuccess: { single(.success($0)) }, + onFailure: { single(.failure($0)) } + ) + ) + } + return Disposables.create(disposabels) + } + } +} + +private extension BaseRemoteDataSource { + func defaultRequest(_ api: API) -> Single { + return provider.rx.request(api) + .timeout(.seconds(10), scheduler: MainScheduler.asyncInstance) + .catch { error in + guard let errorCode = (error as? MoyaError)?.response?.statusCode else { + if let moyaError = (error as? MoyaError), moyaError.errorCode == 6 { + return Single.error(api.errorMap[1009] ?? error) + } + return Single.error(error) + } + return Single.error(api.errorMap[errorCode] ?? error) + } + } + + func authorizedRequest(_ api: API) -> Single { + guard checkTokenIsExist() else { + return defaultRequest(api) + } + + guard checkAccessTokenIsValid() else { + return reissueToken() + .andThen(defaultRequest(api)) + .retry(maxRetryCount) + } + + return defaultRequest(api) + } + + func checkIsApiNeedsAuthorization(_ api: API) -> Bool { + api.jwtTokenType == .accessToken + } + + func checkAccessTokenIsValid() -> Bool { + guard let expired = Double(keychain.load(type: .accessExpiresIn)) else { return false } + let today = Date() + let expiredDate = (expired / 1000.0).unixTimeToDate + return today < expiredDate + } + + func checkTokenIsExist() -> Bool { + !keychain.load(type: .accessToken).isEmpty || !keychain.load(type: .refreshToken).isEmpty + } + + func reissueToken() -> Completable { + #if DEBUG || QA + let provider = refreshProvider ?? MoyaProvider(plugins: [ + JwtPlugin(keychain: keychain), + CustomLoggingPlugin() + ]) + #else + let provider = refreshProvider ?? MoyaProvider(plugins: [JwtPlugin(keychain: keychain)]) + #endif + + if refreshProvider == nil { + refreshProvider = provider + } + + return provider.rx.request(.refresh) + .asCompletable() + } +} diff --git a/Projects/Domains/BaseDomain/Sources/DataSource/TokenRefreshAPI.swift b/Projects/Domains/BaseDomain/Sources/DataSource/TokenRefreshAPI.swift new file mode 100644 index 000000000..2493e3e14 --- /dev/null +++ b/Projects/Domains/BaseDomain/Sources/DataSource/TokenRefreshAPI.swift @@ -0,0 +1,28 @@ +import ErrorModule +import Moya + +enum TokenRefreshAPI { + case refresh +} + +extension TokenRefreshAPI: WMAPI { + var domain: WMDomain { .auth } + + var urlPath: String { "/token" } + + var method: Moya.Method { .post } + + var task: Moya.Task { .requestPlain } + + var jwtTokenType: JwtTokenType { .refreshToken } + + var errorMap: [Int: WMError] { + [ + 400: .badRequest, + 401: .tokenExpired, + 404: .notFound, + 429: .tooManyRequest, + 500: .internalServerError + ] + } +} diff --git a/Projects/Domains/BaseDomain/Sources/Jwt/JwtAuthorizable.swift b/Projects/Domains/BaseDomain/Sources/Jwt/JwtAuthorizable.swift new file mode 100644 index 000000000..db1bc38e7 --- /dev/null +++ b/Projects/Domains/BaseDomain/Sources/Jwt/JwtAuthorizable.swift @@ -0,0 +1,28 @@ +// +// JwtAuthorizable.swift +// BaseDomain +// +// Created by KTH on 2024/03/04. +// Copyright © 2024 yongbeomkwak. All rights reserved. +// + +import Moya + +public enum JwtTokenType: String { + case accessToken + case refreshToken + case none + + var headerKey: String { + switch self { + case .accessToken, .refreshToken: + return "Authorization" + default: + return "" + } + } +} + +public protocol JwtAuthorizable { + var jwtTokenType: JwtTokenType { get } +} diff --git a/Projects/Domains/BaseDomain/Sources/Jwt/JwtPlugin.swift b/Projects/Domains/BaseDomain/Sources/Jwt/JwtPlugin.swift new file mode 100644 index 000000000..b51adf09b --- /dev/null +++ b/Projects/Domains/BaseDomain/Sources/Jwt/JwtPlugin.swift @@ -0,0 +1,85 @@ +// +// JwtPlugin.swift +// BaseDomain +// +// Created by KTH on 2024/03/04. +// Copyright © 2024 yongbeomkwak. All rights reserved. +// + +import Foundation +import KeychainModule +import Moya + +public struct JwtPlugin: PluginType { + private let keychain: any Keychain + + public init(keychain: any Keychain) { + self.keychain = keychain + } + + public func prepare( + _ request: URLRequest, + target: TargetType + ) -> URLRequest { + guard let jwtTokenType = (target as? JwtAuthorizable)?.jwtTokenType, + jwtTokenType != .none, + let keychainType = jwtTokenTypeToKeychainType(jwtTokenType: jwtTokenType), + let token = getToken(type: keychainType) + else { return request } + var req = request + + req.addValue(token, forHTTPHeaderField: jwtTokenType.headerKey) + return req + } + + public func didReceive( + _ result: Result, + target: TargetType + ) { + switch result { + case let .success(res): + if let new = try? res.map(TokenDTO.self) { + saveToken(token: new) + } + default: + break + } + } +} + +private extension JwtPlugin { + func jwtTokenTypeToKeychainType(jwtTokenType: JwtTokenType) -> KeychainType? { + switch jwtTokenType { + case .accessToken: + return .accessToken + case .refreshToken: + return .refreshToken + default: + return nil + } + } + + func getToken(type: KeychainType) -> String? { + let token = keychain.load(type: type) + + guard !token.isEmpty else { return nil } + + switch type { + case .accessToken: + return "bearer \(token)" + + case .refreshToken: + return "bearer \(token)" + default: + return "" + } + } + + func saveToken(token: TokenDTO) { + keychain.save(type: .accessToken, value: token.accessToken) + if let refreshToken = token.refreshToken { + keychain.save(type: .refreshToken, value: refreshToken) + } + keychain.save(type: .accessExpiresIn, value: "\(token.expiresIn)") + } +} diff --git a/Projects/Domains/BaseDomain/Sources/Logging/CustomLoggingPlugin.swift b/Projects/Domains/BaseDomain/Sources/Logging/CustomLoggingPlugin.swift new file mode 100644 index 000000000..dc06aa1b5 --- /dev/null +++ b/Projects/Domains/BaseDomain/Sources/Logging/CustomLoggingPlugin.swift @@ -0,0 +1,102 @@ +import Foundation +import Moya +import OSLog + +#if DEBUG || QA + private enum NetworkLogLevel: String { + case short + case detail + } + + public final class CustomLoggingPlugin: PluginType { + let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "", category: "NETWORK") + private let logLevel: NetworkLogLevel + + public init() { + self.logLevel = CustomLoggingPlugin.getLogLevelFromArguments() ?? .detail + } + + public func willSend(_ request: RequestType, target: TargetType) { + guard let httpRequest = request.request else { + print("--> 유효하지 않은 요청") + return + } + let url = httpRequest.description + let method = httpRequest.httpMethod ?? "unknown method" + var log = "====================\n\n[\(method)] \(url)\n\n====================\n" + log.append("API: \(target)\n") + if let headers = httpRequest.allHTTPHeaderFields, !headers.isEmpty { + log.append("header: \(headers)\n") + } + if let body = httpRequest.httpBody, let bodyString = String(bytes: body, encoding: String.Encoding.utf8) { + log.append("\(bodyString)\n") + } + log.append("---------------- END \(method) -----------------------\n") + + switch logLevel { + case .short: + let log = "[🛜 Request] [\(method)] [\(target)] \(url)" + logger.log(level: .debug, "\(log)") + case .detail: + logger.log(level: .debug, "\(log)") + } + } + + public func didReceive(_ result: Result, target: TargetType) { + switch result { + case let .success(response): + onSuceed(response, target: target, isFromError: false) + case let .failure(error): + onFail(error, target: target) + } + } + + func onSuceed(_ response: Response, target: TargetType, isFromError: Bool) { + let request = response.request + let url = request?.url?.absoluteString ?? "nil" + let statusCode = response.statusCode + var log = "------------------- 네트워크 통신 성공 -------------------" + log.append("\n[\(statusCode)] \(url)\n----------------------------------------------------\n") + log.append("API: \(target)\n") + response.response?.allHeaderFields.forEach { + log.append("\($0): \($1)\n") + } + if let reString = String(bytes: response.data, encoding: String.Encoding.utf8) { + log.append("\(reString)\n") + } + log.append("------------------- END HTTP (\(response.data.count)-byte body) -------------------\n") + + switch logLevel { + case .short: + let log = "[🛜 Response] [\(statusCode)] [\(target)] \(url)" + logger.log(level: .debug, "\(log)") + case .detail: + logger.log(level: .debug, "\(log)") + } + } + + func onFail(_ error: MoyaError, target: TargetType) { + if let response = error.response { + onSuceed(response, target: target, isFromError: true) + return + } + var log = "네트워크 오류" + log.append("<-- \(error.errorCode) \(target)\n") + log.append("\(error.failureReason ?? error.errorDescription ?? "unknown error")\n") + log.append("<-- END HTTP\n") + + logger.log("\(log)") + } + } + + extension CustomLoggingPlugin { + /// Environment Variables 에서 로그 레벨을 가져오는 메소드 + /// Scheme의 Environment Variables 에 key : NETWORK_LOG_LEVEL, value : short 또는 detail + private static func getLogLevelFromArguments() -> NetworkLogLevel? { + guard let logLevelValue = ProcessInfo.processInfo.environment["NETWORK_LOG_LEVEL"] else { return nil } + guard let networkLogLevel = NetworkLogLevel(rawValue: logLevelValue) else { return nil } + return networkLogLevel + } + } + +#endif diff --git a/Projects/Domains/BaseDomain/Sources/ResponseDTO/BaseImageResponseDTO.swift b/Projects/Domains/BaseDomain/Sources/ResponseDTO/BaseImageResponseDTO.swift new file mode 100644 index 000000000..ba4b00fb8 --- /dev/null +++ b/Projects/Domains/BaseDomain/Sources/ResponseDTO/BaseImageResponseDTO.swift @@ -0,0 +1,12 @@ +import BaseDomainInterface +import Foundation + +public struct BaseImageResponseDTO: Decodable { + private let imageUrl: String +} + +public extension BaseImageResponseDTO { + func toDomain() -> BaseImageEntity { + return BaseImageEntity(image: imageUrl) + } +} diff --git a/Projects/Domains/BaseDomain/Sources/ResponseDTO/BaseResponseDTO.swift b/Projects/Domains/BaseDomain/Sources/ResponseDTO/BaseResponseDTO.swift new file mode 100644 index 000000000..7f0536e1e --- /dev/null +++ b/Projects/Domains/BaseDomain/Sources/ResponseDTO/BaseResponseDTO.swift @@ -0,0 +1,20 @@ +// +// BaseResponseDTO.swift +// BaseDomain +// +// Created by KTH on 2024/03/04. +// Copyright © 2024 yongbeomkwak. All rights reserved. +// + +import BaseDomainInterface +import Foundation + +public struct BaseResponseDTO: Codable { + public let status: Int +} + +public extension BaseResponseDTO { + func toDomain() -> BaseEntity { + return BaseEntity(status: status) + } +} diff --git a/Projects/Domains/BaseDomain/Sources/ResponseDTO/TokenDTO.swift b/Projects/Domains/BaseDomain/Sources/ResponseDTO/TokenDTO.swift new file mode 100644 index 000000000..e6d503ef5 --- /dev/null +++ b/Projects/Domains/BaseDomain/Sources/ResponseDTO/TokenDTO.swift @@ -0,0 +1,53 @@ +// +// TokenDTO.swift +// BaseDomain +// +// Created by KTH on 2024/03/04. +// Copyright © 2024 yongbeomkwak. All rights reserved. +// + +import Foundation + +struct TokenDTO: Equatable, Decodable { + let accessToken: String + let refreshToken: String? + let expiresIn: Int + + enum DefaultCodingKeys: String, CodingKey { + case accessToken + case refreshToken + case expiresIn + } + + enum RefreshableCodingKeys: String, CodingKey { + case token + } + + init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: DefaultCodingKeys.self) + let refreshableContainer = try decoder.container(keyedBy: RefreshableCodingKeys.self) + + let accessToken: String + if let token = try? container.decode(String.self, forKey: .accessToken) { + accessToken = token + } else if let token = try? refreshableContainer.decode(String.self, forKey: .token) { + accessToken = token + } else { + throw Error.cannotDecodeAccessToken + } + self.accessToken = accessToken + self.refreshToken = try container.decodeIfPresent(String.self, forKey: .refreshToken) + self.expiresIn = try container.decode(Int.self, forKey: .expiresIn) + } + + enum Error: Swift.Error, LocalizedError { + case cannotDecodeAccessToken + + var errorDescription: String? { + switch self { + case .cannotDecodeAccessToken: + return "Cannot decode access token in data" + } + } + } +} diff --git a/Projects/Domains/BaseDomain/Sources/WMAPI/SecretURL.swift b/Projects/Domains/BaseDomain/Sources/WMAPI/SecretURL.swift new file mode 100644 index 000000000..9c1c42c18 --- /dev/null +++ b/Projects/Domains/BaseDomain/Sources/WMAPI/SecretURL.swift @@ -0,0 +1,90 @@ +// +// SecretURL.swift +// BaseDomain +// +// Created by KTH on 2024/03/04. +// Copyright © 2024 yongbeomkwak. All rights reserved. +// + +import Foundation + +public func config(key: String) -> String { + guard let secrets = Bundle.main.object(forInfoDictionaryKey: "Secrets") as? [String: Any] else { + return "" + } + return secrets[key] as? String ?? "not found key" +} + +// MARK: - BASE_URL +public func BASE_URL() -> String { + #if DEBUG || QA + return config(key: "BASE_DEV_URL") + #else + return config(key: "BASE_PROD_URL") + #endif +} + +// MARK: - WMDomain +public func WMDOMAIN_AUTH() -> String { + return config(key: "WMDOMAIN_AUTH") +} + +public func WMDOMAIN_CHARTS() -> String { + return config(key: "WMDOMAIN_CHARTS") +} + +public func WMDOMAIN_SONGS() -> String { + return config(key: "WMDOMAIN_SONGS") +} + +public func WMDOMAIN_ARTIST() -> String { + return config(key: "WMDOMAIN_ARTIST") +} + +public func WMDOMAIN_USER() -> String { + return config(key: "WMDOMAIN_USER") +} + +public func WMDOMAIN_PLAYLIST() -> String { + return config(key: "WMDOMAIN_PLAYLIST") +} + +public func WMDOMAIN_LIKE() -> String { + return config(key: "WMDOMAIN_LIKE") +} + +public func WMDOMAIN_FAQ() -> String { + return config(key: "WMDOMAIN_FAQ") +} + +public func WMDOMAIN_NOTICE() -> String { + return config(key: "WMDOMAIN_NOTICE") +} + +public func WMDOMAIN_APP() -> String { + return config(key: "WMDOMAIN_APP") +} + +public func WMDOMAIN_SEARCH() -> String { + return config(key: "WMDOMAIN_SEARCH") +} + +public func WMDOMAIN_IMAGE() -> String { + return config(key: "WMDOMAIN_IMAGE") +} + +public func WMDOMAIN_NOTIFICATION() -> String { + return config(key: "WMDOMAIN_NOTIFICATION") +} + +public func WMDOMAIN_TEAM() -> String { + return config(key: "WMDOMAIN_TEAM") +} + +public func WMDOMAIN_PRICE() -> String { + return config(key: "WMDOMAIN_PRICE") +} + +public func WMDOMAIN_CREDIT() -> String { + return config(key: "WMDOMAIN_CREDIT") +} diff --git a/Projects/Domains/BaseDomain/Sources/WMAPI/WMAPI.swift b/Projects/Domains/BaseDomain/Sources/WMAPI/WMAPI.swift new file mode 100644 index 000000000..12107c237 --- /dev/null +++ b/Projects/Domains/BaseDomain/Sources/WMAPI/WMAPI.swift @@ -0,0 +1,108 @@ +// +// WMAPI.swift +// BaseDomain +// +// Created by KTH on 2024/03/04. +// Copyright © 2024 yongbeomkwak. All rights reserved. +// + +import ErrorModule +import Foundation +import KeychainModule +import Moya +import Utility + +public protocol WMAPI: TargetType, JwtAuthorizable, BaseInfoSendable { + var domain: WMDomain { get } + var urlPath: String { get } + var errorMap: [Int: WMError] { get } +} + +public extension WMAPI { + var baseURL: URL { + URL(string: BASE_URL())! + } + + var path: String { + domain.asURLString + urlPath + } + + var headers: [String: String]? { + ["Content-Type": "application/json"] + } + + var validationType: ValidationType { + return .successCodes + } + + var baseInfoTypes: [BaseInfoType] { + return [] + } +} + +public enum WMDomain: String { + case auth + case charts + case songs + case artist + case user + case playlist + case like + case naver + case faq + case notice + case app + case search + case image + case notification + case team + case price + case credit +} + +extension WMDomain { + var asURLString: String { + return "/\(self.asDomainString)" + } +} + +extension WMDomain { + var asDomainString: String { + switch self { + case .auth: + return WMDOMAIN_AUTH() + case .charts: + return WMDOMAIN_CHARTS() + case .songs: + return WMDOMAIN_SONGS() + case .artist: + return WMDOMAIN_ARTIST() + case .user: + return WMDOMAIN_USER() + case .playlist: + return WMDOMAIN_PLAYLIST() + case .like: + return WMDOMAIN_LIKE() + case .naver: + return "/v1/nid/me" + case .faq: + return WMDOMAIN_FAQ() + case .notice: + return WMDOMAIN_NOTICE() + case .app: + return WMDOMAIN_APP() + case .search: + return WMDOMAIN_SEARCH() + case .image: + return WMDOMAIN_IMAGE() + case .notification: + return WMDOMAIN_NOTIFICATION() + case .team: + return WMDOMAIN_TEAM() + case .price: + return WMDOMAIN_PRICE() + case .credit: + return WMDOMAIN_CREDIT() + } + } +} diff --git a/Projects/Domains/BaseDomain/Testing/testing.swift b/Projects/Domains/BaseDomain/Testing/testing.swift new file mode 100644 index 000000000..dae5e363f --- /dev/null +++ b/Projects/Domains/BaseDomain/Testing/testing.swift @@ -0,0 +1 @@ +// for tuist diff --git a/Projects/Domains/BaseDomain/Tests/Test.swift b/Projects/Domains/BaseDomain/Tests/Test.swift new file mode 100644 index 000000000..1935b174a --- /dev/null +++ b/Projects/Domains/BaseDomain/Tests/Test.swift @@ -0,0 +1,9 @@ +// +// t.swift +// BaseDomain +// +// Created by KTH on 2024/03/04. +// Copyright © 2024 yongbeomkwak. All rights reserved. +// + +import Foundation diff --git a/Projects/Domains/ChartDomain/Interface/DataSource/RemoteChartDataSource.swift b/Projects/Domains/ChartDomain/Interface/DataSource/RemoteChartDataSource.swift new file mode 100644 index 000000000..521e1feff --- /dev/null +++ b/Projects/Domains/ChartDomain/Interface/DataSource/RemoteChartDataSource.swift @@ -0,0 +1,7 @@ +import Foundation +import RxSwift + +public protocol RemoteChartDataSource { + func fetchChartRanking(type: ChartDateType) -> Single + func fetchCurrentVideoUseCase() -> Single +} diff --git a/Projects/Domains/ChartDomain/Interface/Entity/ChartEntity.swift b/Projects/Domains/ChartDomain/Interface/Entity/ChartEntity.swift new file mode 100644 index 000000000..2c1fe311c --- /dev/null +++ b/Projects/Domains/ChartDomain/Interface/Entity/ChartEntity.swift @@ -0,0 +1,22 @@ +// +// ChartEntity.swift +// ChartDomainInterface +// +// Created by KTH on 5/16/24. +// Copyright © 2024 yongbeomkwak. All rights reserved. +// + +import Foundation + +public struct ChartEntity { + public init( + updatedAt: String, + songs: [ChartRankingEntity] + ) { + self.updatedAt = updatedAt + self.songs = songs + } + + public let updatedAt: String + public let songs: [ChartRankingEntity] +} diff --git a/Projects/Domains/ChartDomain/Interface/Entity/ChartRankingEntity.swift b/Projects/Domains/ChartDomain/Interface/Entity/ChartRankingEntity.swift new file mode 100644 index 000000000..2644f2ef4 --- /dev/null +++ b/Projects/Domains/ChartDomain/Interface/Entity/ChartRankingEntity.swift @@ -0,0 +1,32 @@ +import Foundation + +public struct ChartRankingEntity: Equatable { + public init( + id: String, + title: String, + artist: String, + views: Int, + last: Int, + increase: Int, + date: String, + isSelected: Bool = false + ) { + self.id = id + self.title = title + self.artist = artist + self.views = views + self.last = last + self.increase = increase + self.date = date + self.isSelected = isSelected + } + + public let id, title, artist: String + public let views, last, increase: Int + public let date: String + public var isSelected: Bool + + public static func == (lhs: ChartRankingEntity, rhs: ChartRankingEntity) -> Bool { + lhs.id == rhs.id + } +} diff --git a/Projects/Domains/ChartDomain/Interface/Entity/CurrentVideoEntity.swift b/Projects/Domains/ChartDomain/Interface/Entity/CurrentVideoEntity.swift new file mode 100644 index 000000000..26c35b0e9 --- /dev/null +++ b/Projects/Domains/ChartDomain/Interface/Entity/CurrentVideoEntity.swift @@ -0,0 +1,9 @@ +import Foundation + +public struct CurrentVideoEntity: Hashable { + public let id: String + + public init(id: String) { + self.id = id + } +} diff --git a/Projects/Services/DataMappingModule/Sources/Base/ChartDateType.swift b/Projects/Domains/ChartDomain/Interface/Enum/ChartDateType.swift similarity index 90% rename from Projects/Services/DataMappingModule/Sources/Base/ChartDateType.swift rename to Projects/Domains/ChartDomain/Interface/Enum/ChartDateType.swift index 0eac60749..3cbadd120 100644 --- a/Projects/Services/DataMappingModule/Sources/Base/ChartDateType.swift +++ b/Projects/Domains/ChartDomain/Interface/Enum/ChartDateType.swift @@ -1,22 +1,22 @@ import Foundation -public enum ChartDateType: String, Codable { - case monthly - case weekly - case daily +public enum ChartDateType: String { case hourly + case daily + case weekly + case monthly case total public var display: String { switch self { - case .monthly: - return "월간순" - case .weekly: - return "주간순" - case .daily: - return "일간순" case .hourly: return "시간순" + case .daily: + return "일간순" + case .weekly: + return "주간순" + case .monthly: + return "월간순" case .total: return "누적순" } diff --git a/Projects/Domains/ChartDomain/Interface/Repository/ChartRepository.swift b/Projects/Domains/ChartDomain/Interface/Repository/ChartRepository.swift new file mode 100644 index 000000000..bef1aa8c6 --- /dev/null +++ b/Projects/Domains/ChartDomain/Interface/Repository/ChartRepository.swift @@ -0,0 +1,7 @@ +import Foundation +import RxSwift + +public protocol ChartRepository { + func fetchChartRanking(type: ChartDateType) -> Single + func fetchCurrentVideoUseCase() -> Single +} diff --git a/Projects/Domains/ChartDomain/Interface/UseCase/FetchChartRankingUseCase.swift b/Projects/Domains/ChartDomain/Interface/UseCase/FetchChartRankingUseCase.swift new file mode 100644 index 000000000..3093ee0d1 --- /dev/null +++ b/Projects/Domains/ChartDomain/Interface/UseCase/FetchChartRankingUseCase.swift @@ -0,0 +1,6 @@ +import Foundation +import RxSwift + +public protocol FetchChartRankingUseCase { + func execute(type: ChartDateType) -> Single +} diff --git a/Projects/Domains/ChartDomain/Interface/UseCase/FetchCurrentVideoUseCase.swift b/Projects/Domains/ChartDomain/Interface/UseCase/FetchCurrentVideoUseCase.swift new file mode 100644 index 000000000..f04360eb6 --- /dev/null +++ b/Projects/Domains/ChartDomain/Interface/UseCase/FetchCurrentVideoUseCase.swift @@ -0,0 +1,6 @@ +import Foundation +import RxSwift + +public protocol FetchCurrentVideoUseCase { + func execute() -> Single +} diff --git a/Projects/Domains/ChartDomain/Project.swift b/Projects/Domains/ChartDomain/Project.swift new file mode 100644 index 000000000..f0bbee73c --- /dev/null +++ b/Projects/Domains/ChartDomain/Project.swift @@ -0,0 +1,26 @@ +import DependencyPlugin +import ProjectDescription +import ProjectDescriptionHelpers + +let project = Project.module( + name: ModulePaths.Domain.ChartDomain.rawValue, + targets: [ + .interface( + module: .domain(.ChartDomain), + dependencies: [ + .domain(target: .BaseDomain, type: .interface) + ] + ), + .implements( + module: .domain(.ChartDomain), + dependencies: [ + .domain(target: .BaseDomain), + .domain(target: .ChartDomain, type: .interface) + ] + ), + .tests( + module: .domain(.ChartDomain), + dependencies: [.domain(target: .ChartDomain)] + ) + ] +) diff --git a/Projects/Domains/ChartDomain/Sources/API/ChartAPI.swift b/Projects/Domains/ChartDomain/Sources/API/ChartAPI.swift new file mode 100644 index 000000000..20a8e8201 --- /dev/null +++ b/Projects/Domains/ChartDomain/Sources/API/ChartAPI.swift @@ -0,0 +1,54 @@ +import BaseDomain +import ChartDomainInterface +import ErrorModule +import Foundation +import Moya + +public enum ChartAPI { + case fetchChartRanking(type: ChartDateType) + case fetchCurrentVideo +} + +extension ChartAPI: WMAPI { + public var domain: WMDomain { + .charts + } + + public var urlPath: String { + switch self { + case let .fetchChartRanking(type): + return "/\(type.rawValue)" + + case .fetchCurrentVideo: + return "/current-video" + } + } + + public var method: Moya.Method { + return .get + } + + public var task: Moya.Task { + switch self { + case .fetchChartRanking, .fetchCurrentVideo: + return .requestPlain + } + } + + public var jwtTokenType: JwtTokenType { + return .none + } + + public var errorMap: [Int: WMError] { + switch self { + default: + return [ + 400: .badRequest, + 401: .tokenExpired, + 404: .notFound, + 429: .tooManyRequest, + 500: .internalServerError + ] + } + } +} diff --git a/Projects/Domains/ChartDomain/Sources/DataSource/RemoteChartDataSourceImpl.swift b/Projects/Domains/ChartDomain/Sources/DataSource/RemoteChartDataSourceImpl.swift new file mode 100644 index 000000000..e3047990f --- /dev/null +++ b/Projects/Domains/ChartDomain/Sources/DataSource/RemoteChartDataSourceImpl.swift @@ -0,0 +1,18 @@ +import BaseDomain +import ChartDomainInterface +import Foundation +import RxSwift + +public final class RemoteChartDataSourceImpl: BaseRemoteDataSource, RemoteChartDataSource { + public func fetchChartRanking(type: ChartDateType) -> Single { + request(.fetchChartRanking(type: type)) + .map(SingleChartRankingResponseDTO.self) + .map { $0.toDomain(type: type) } + } + + public func fetchCurrentVideoUseCase() -> Single { + request(.fetchCurrentVideo) + .map(CurrentVideoDTO.self) + .map { $0.toDomain() } + } +} diff --git a/Projects/Domains/ChartDomain/Sources/Repository/ChartRepositoryImpl.swift b/Projects/Domains/ChartDomain/Sources/Repository/ChartRepositoryImpl.swift new file mode 100644 index 000000000..dabb2de3f --- /dev/null +++ b/Projects/Domains/ChartDomain/Sources/Repository/ChartRepositoryImpl.swift @@ -0,0 +1,21 @@ +import ChartDomainInterface +import Foundation +import RxSwift + +public final class ChartRepositoryImpl: ChartRepository { + private let remoteChartDataSource: any RemoteChartDataSource + + public init( + remoteChartDataSource: RemoteChartDataSource + ) { + self.remoteChartDataSource = remoteChartDataSource + } + + public func fetchChartRanking(type: ChartDateType) -> Single { + remoteChartDataSource.fetchChartRanking(type: type) + } + + public func fetchCurrentVideoUseCase() -> Single { + remoteChartDataSource.fetchCurrentVideoUseCase() + } +} diff --git a/Projects/Domains/ChartDomain/Sources/ResponseDTO/CurrentVideoDTO.swift b/Projects/Domains/ChartDomain/Sources/ResponseDTO/CurrentVideoDTO.swift new file mode 100644 index 000000000..1383932aa --- /dev/null +++ b/Projects/Domains/ChartDomain/Sources/ResponseDTO/CurrentVideoDTO.swift @@ -0,0 +1,12 @@ +import ChartDomainInterface +import Foundation + +struct CurrentVideoDTO: Decodable { + let data: String +} + +extension CurrentVideoDTO { + func toDomain() -> CurrentVideoEntity { + return CurrentVideoEntity(id: data) + } +} diff --git a/Projects/Domains/ChartDomain/Sources/ResponseDTO/FetchChartRankingResponseDTO.swift b/Projects/Domains/ChartDomain/Sources/ResponseDTO/FetchChartRankingResponseDTO.swift new file mode 100644 index 000000000..5b8cc3795 --- /dev/null +++ b/Projects/Domains/ChartDomain/Sources/ResponseDTO/FetchChartRankingResponseDTO.swift @@ -0,0 +1,47 @@ +import ChartDomainInterface +import Foundation +import Utility + +public struct SingleChartRankingResponseDTO: Decodable { + let updatedAt: Double + let songs: [SingleChartRankingResponseDTO.Songs] +} + +public extension SingleChartRankingResponseDTO { + struct Songs: Decodable, Equatable { + let songID, title: String + let artists: [String] + let increase, views, date: Int + let last: Int? + + public static func == (lhs: Self, rhs: Self) -> Bool { + return lhs.songID == rhs.songID + } + + enum CodingKeys: String, CodingKey { + case songID = "videoId" + case title, artists, views, date + case last = "previousOrder" + case increase = "viewsIncrement" + } + } +} + +public extension SingleChartRankingResponseDTO { + func toDomain(type: ChartDateType) -> ChartEntity { + return ChartEntity( + updatedAt: Date(timeIntervalSince1970: updatedAt / 1000).changeDateFormatForChart() + " 업데이트", + songs: songs.map { + return ChartRankingEntity( + id: $0.songID, + title: $0.title, + artist: $0.artists.joined(separator: ", "), + views: $0.views, + last: $0.last ?? 0, + increase: $0.increase, + date: $0.date.changeDateFormat(origin: "yyMMdd", result: "yyyy.MM.dd") + ) + } + ) + } +} diff --git a/Projects/Domains/ChartDomain/Sources/UseCase/FetchChartRankingUseCaseImpl.swift b/Projects/Domains/ChartDomain/Sources/UseCase/FetchChartRankingUseCaseImpl.swift new file mode 100644 index 000000000..f3c0be936 --- /dev/null +++ b/Projects/Domains/ChartDomain/Sources/UseCase/FetchChartRankingUseCaseImpl.swift @@ -0,0 +1,16 @@ +import ChartDomainInterface +import RxSwift + +public struct FetchChartRankingUseCaseImpl: FetchChartRankingUseCase { + private let chartRepository: any ChartRepository + + public init( + chartRepository: ChartRepository + ) { + self.chartRepository = chartRepository + } + + public func execute(type: ChartDateType) -> Single { + chartRepository.fetchChartRanking(type: type) + } +} diff --git a/Projects/Domains/ChartDomain/Sources/UseCase/FetchCurrentVideoUseCaseImpl.swift b/Projects/Domains/ChartDomain/Sources/UseCase/FetchCurrentVideoUseCaseImpl.swift new file mode 100644 index 000000000..97bb72173 --- /dev/null +++ b/Projects/Domains/ChartDomain/Sources/UseCase/FetchCurrentVideoUseCaseImpl.swift @@ -0,0 +1,16 @@ +import ChartDomainInterface +import RxSwift + +public struct FetchCurrentVideoUseCaseImpl: FetchCurrentVideoUseCase { + private let chartRepository: any ChartRepository + + public init( + chartRepository: ChartRepository + ) { + self.chartRepository = chartRepository + } + + public func execute() -> Single { + chartRepository.fetchCurrentVideoUseCase() + } +} diff --git a/Projects/Domains/ChartDomain/Tests/ChartDomainTest.swift b/Projects/Domains/ChartDomain/Tests/ChartDomainTest.swift new file mode 100644 index 000000000..270bcf1c6 --- /dev/null +++ b/Projects/Domains/ChartDomain/Tests/ChartDomainTest.swift @@ -0,0 +1,11 @@ +import XCTest + +final class ChartDomainTests: XCTestCase { + override func setUpWithError() throws {} + + override func tearDownWithError() throws {} + + func testExample() { + XCTAssertEqual(1, 1) + } +} diff --git a/Projects/Domains/CreditDomain/Interface/CreditSongOrderType.swift b/Projects/Domains/CreditDomain/Interface/CreditSongOrderType.swift new file mode 100644 index 000000000..7b6cd99e2 --- /dev/null +++ b/Projects/Domains/CreditDomain/Interface/CreditSongOrderType.swift @@ -0,0 +1,5 @@ +public enum CreditSongOrderType: String { + case latest + case popular + case oldest +} diff --git a/Projects/Domains/CreditDomain/Interface/DataSource/RemoteCreditDataSource.swift b/Projects/Domains/CreditDomain/Interface/DataSource/RemoteCreditDataSource.swift new file mode 100644 index 000000000..fe8e6f884 --- /dev/null +++ b/Projects/Domains/CreditDomain/Interface/DataSource/RemoteCreditDataSource.swift @@ -0,0 +1,14 @@ +import Foundation +import RxSwift +import SongsDomainInterface + +public protocol RemoteCreditDataSource { + func fetchCreditSongList( + name: String, + order: CreditSongOrderType, + page: Int, + limit: Int + ) -> Single<[SongEntity]> + + func fetchCreditProfile(name: String) -> Single +} diff --git a/Projects/Domains/CreditDomain/Interface/Entity/CreditProfileEntity.swift b/Projects/Domains/CreditDomain/Interface/Entity/CreditProfileEntity.swift new file mode 100644 index 000000000..7bfe31835 --- /dev/null +++ b/Projects/Domains/CreditDomain/Interface/Entity/CreditProfileEntity.swift @@ -0,0 +1,11 @@ +import Foundation + +public struct CreditProfileEntity { + public init(name: String, imageURL: String?) { + self.name = name + self.imageURL = imageURL + } + + public let name: String + public let imageURL: String? +} diff --git a/Projects/Domains/CreditDomain/Interface/Repository/CreditRepository.swift b/Projects/Domains/CreditDomain/Interface/Repository/CreditRepository.swift new file mode 100644 index 000000000..ef3035664 --- /dev/null +++ b/Projects/Domains/CreditDomain/Interface/Repository/CreditRepository.swift @@ -0,0 +1,14 @@ +import Foundation +import RxSwift +import SongsDomainInterface + +public protocol CreditRepository { + func fetchCreditSongList( + name: String, + order: CreditSongOrderType, + page: Int, + limit: Int + ) -> Single<[SongEntity]> + + func fetchCreditProfile(name: String) -> Single +} diff --git a/Projects/Domains/CreditDomain/Interface/UseCase/FetchCreditProfileUseCase.swift b/Projects/Domains/CreditDomain/Interface/UseCase/FetchCreditProfileUseCase.swift new file mode 100644 index 000000000..5bec1b3b7 --- /dev/null +++ b/Projects/Domains/CreditDomain/Interface/UseCase/FetchCreditProfileUseCase.swift @@ -0,0 +1,5 @@ +import RxSwift + +public protocol FetchCreditProfileUseCase { + func execute(name: String) -> Single +} diff --git a/Projects/Domains/CreditDomain/Interface/UseCase/FetchCreditSongListUseCase.swift b/Projects/Domains/CreditDomain/Interface/UseCase/FetchCreditSongListUseCase.swift new file mode 100644 index 000000000..3da792edd --- /dev/null +++ b/Projects/Domains/CreditDomain/Interface/UseCase/FetchCreditSongListUseCase.swift @@ -0,0 +1,22 @@ +import Foundation +import RxSwift +import SongsDomainInterface + +public protocol FetchCreditSongListUseCase { + func execute( + name: String, + order: CreditSongOrderType, + page: Int, + limit: Int + ) -> Single<[SongEntity]> +} + +public extension FetchCreditSongListUseCase { + func execute( + name: String, + order: CreditSongOrderType, + page: Int + ) -> Single<[SongEntity]> { + self.execute(name: name, order: order, page: page, limit: 50) + } +} diff --git a/Projects/Domains/CreditDomain/Project.swift b/Projects/Domains/CreditDomain/Project.swift new file mode 100644 index 000000000..392e3042e --- /dev/null +++ b/Projects/Domains/CreditDomain/Project.swift @@ -0,0 +1,23 @@ +import DependencyPlugin +import ProjectDescription +import ProjectDescriptionHelpers + +let project = Project.module( + name: ModulePaths.Domain.CreditDomain.rawValue, + targets: [ + .interface(module: .domain(.CreditDomain), dependencies: [ + .domain(target: .BaseDomain, type: .interface), + .domain(target: .SongsDomain, type: .interface) + ]), + .implements(module: .domain(.CreditDomain), dependencies: [ + .domain(target: .BaseDomain), + .domain(target: .CreditDomain, type: .interface) + ]), + .testing(module: .domain(.CreditDomain), dependencies: [ + .domain(target: .CreditDomain, type: .interface) + ]), + .tests(module: .domain(.CreditDomain), dependencies: [ + .domain(target: .CreditDomain) + ]) + ] +) diff --git a/Projects/Domains/CreditDomain/Sources/API/CreditAPI.swift b/Projects/Domains/CreditDomain/Sources/API/CreditAPI.swift new file mode 100644 index 000000000..edecaba2b --- /dev/null +++ b/Projects/Domains/CreditDomain/Sources/API/CreditAPI.swift @@ -0,0 +1,72 @@ +import BaseDomain +import CreditDomainInterface +import ErrorModule +import Foundation +import KeychainModule +import Moya + +public enum CreditAPI { + case fetchCreditSongList( + name: String, + order: CreditSongOrderType, + page: Int, + limit: Int + ) + case fetchProfile(name: String) +} + +extension CreditAPI: WMAPI { + public var domain: WMDomain { + .credit + } + + public var urlPath: String { + switch self { + case let .fetchCreditSongList(name, _, _, _): + return "/\(name)/songs" + case let .fetchProfile(name): + return "/\(name)" + } + } + + public var method: Moya.Method { + switch self { + case .fetchCreditSongList, .fetchProfile: + return .get + } + } + + public var task: Moya.Task { + switch self { + case let .fetchCreditSongList(name, order, page, limit): + return .requestParameters(parameters: [ + "order": order.rawValue, + "page": page, + "limit": limit + ], encoding: URLEncoding.queryString) + + case .fetchProfile: + return .requestPlain + } + } + + public var jwtTokenType: JwtTokenType { + switch self { + case .fetchCreditSongList, .fetchProfile: + return .none + } + } + + public var errorMap: [Int: WMError] { + switch self { + default: + return [ + 400: .badRequest, + 401: .tokenExpired, + 404: .notFound, + 429: .tooManyRequest, + 500: .internalServerError + ] + } + } +} diff --git a/Projects/Domains/CreditDomain/Sources/DataSource/RemoteCreditDataSourceImpl.swift b/Projects/Domains/CreditDomain/Sources/DataSource/RemoteCreditDataSourceImpl.swift new file mode 100644 index 000000000..dbc298a38 --- /dev/null +++ b/Projects/Domains/CreditDomain/Sources/DataSource/RemoteCreditDataSourceImpl.swift @@ -0,0 +1,24 @@ +import BaseDomain +import CreditDomainInterface +import Foundation +import RxSwift +import SongsDomainInterface + +public final class RemoteCreditDataSourceImpl: BaseRemoteDataSource, RemoteCreditDataSource { + public func fetchCreditSongList( + name: String, + order: CreditSongOrderType, + page: Int, + limit: Int + ) -> Single<[SongEntity]> { + request(.fetchCreditSongList(name: name, order: order, page: page, limit: limit)) + .map([FetchCreditSongListResponseDTO].self) + .map { $0.toDomain() } + } + + public func fetchCreditProfile(name: String) -> Single { + request(.fetchProfile(name: name)) + .map(FetchCreditProfileResponseDTO.self) + .map { $0.toDomain() } + } +} diff --git a/Projects/Domains/CreditDomain/Sources/Repository/CreditRepositoryImpl.swift b/Projects/Domains/CreditDomain/Sources/Repository/CreditRepositoryImpl.swift new file mode 100644 index 000000000..624c1c7fe --- /dev/null +++ b/Projects/Domains/CreditDomain/Sources/Repository/CreditRepositoryImpl.swift @@ -0,0 +1,27 @@ +import CreditDomainInterface +import ErrorModule +import RxSwift +import SongsDomainInterface + +public final class CreditRepositoryImpl: CreditRepository { + private let remoteCreditDataSource: any RemoteCreditDataSource + + public init( + remoteCreditDataSource: any RemoteCreditDataSource + ) { + self.remoteCreditDataSource = remoteCreditDataSource + } + + public func fetchCreditSongList( + name: String, + order: CreditSongOrderType, + page: Int, + limit: Int + ) -> Single<[SongEntity]> { + remoteCreditDataSource.fetchCreditSongList(name: name, order: order, page: page, limit: limit) + } + + public func fetchCreditProfile(name: String) -> Single { + remoteCreditDataSource.fetchCreditProfile(name: name) + } +} diff --git a/Projects/Domains/CreditDomain/Sources/ResponseDTO/FetchCreditProfileResponseDTO.swift b/Projects/Domains/CreditDomain/Sources/ResponseDTO/FetchCreditProfileResponseDTO.swift new file mode 100644 index 000000000..5831cfbcf --- /dev/null +++ b/Projects/Domains/CreditDomain/Sources/ResponseDTO/FetchCreditProfileResponseDTO.swift @@ -0,0 +1,21 @@ +import CreditDomainInterface +import Foundation + +struct FetchCreditProfileResponseDTO: Decodable { + let name: String + let imageURL: String? + + enum CodingKeys: String, CodingKey { + case name + case imageURL = "profileUrl" + } +} + +extension FetchCreditProfileResponseDTO { + func toDomain() -> CreditProfileEntity { + return CreditProfileEntity( + name: name, + imageURL: imageURL + ) + } +} diff --git a/Projects/Domains/CreditDomain/Sources/ResponseDTO/FetchCreditSongListResponseDTO.swift b/Projects/Domains/CreditDomain/Sources/ResponseDTO/FetchCreditSongListResponseDTO.swift new file mode 100644 index 000000000..5c4304f28 --- /dev/null +++ b/Projects/Domains/CreditDomain/Sources/ResponseDTO/FetchCreditSongListResponseDTO.swift @@ -0,0 +1,43 @@ +import Foundation +import SongsDomainInterface +import Utility + +struct FetchCreditSongListResponseDTO: Decodable { + let songID, title: String + let artists: [String] + let views, likes: Int + let date: Int + let karaokeNumber: FetchCreditSongListResponseDTO.KaraokeNumber + + enum CodingKeys: String, CodingKey { + case title, artists, date, views, likes + case songID = "videoId" + case karaokeNumber + } +} + +extension FetchCreditSongListResponseDTO { + struct KaraokeNumber: Decodable { + let TJ, KY: Int? + } +} + +extension FetchCreditSongListResponseDTO { + func toDomain() -> SongEntity { + return SongEntity( + id: songID, + title: title, + artist: artists.joined(separator: ", "), + views: views, + date: date.changeDateFormat(origin: "yyMMdd", result: "yyyy.MM.dd"), + likes: likes, + karaokeNumber: .init(TJ: karaokeNumber.TJ, KY: karaokeNumber.KY) + ) + } +} + +extension [FetchCreditSongListResponseDTO] { + func toDomain() -> [SongEntity] { + return self.map { $0.toDomain() } + } +} diff --git a/Projects/Domains/CreditDomain/Sources/UseCase/FetchCreditProfileUseCaseImpl.swift b/Projects/Domains/CreditDomain/Sources/UseCase/FetchCreditProfileUseCaseImpl.swift new file mode 100644 index 000000000..7a3450f49 --- /dev/null +++ b/Projects/Domains/CreditDomain/Sources/UseCase/FetchCreditProfileUseCaseImpl.swift @@ -0,0 +1,16 @@ +import CreditDomainInterface +import RxSwift + +public final class FetchCreditProfileUseCaseImpl: FetchCreditProfileUseCase { + private let creditRepository: any CreditRepository + + public init( + creditRepository: any CreditRepository + ) { + self.creditRepository = creditRepository + } + + public func execute(name: String) -> Single { + creditRepository.fetchCreditProfile(name: name) + } +} diff --git a/Projects/Domains/CreditDomain/Sources/UseCase/FetchCreditSongListUseCaseImpl.swift b/Projects/Domains/CreditDomain/Sources/UseCase/FetchCreditSongListUseCaseImpl.swift new file mode 100644 index 000000000..59ef90002 --- /dev/null +++ b/Projects/Domains/CreditDomain/Sources/UseCase/FetchCreditSongListUseCaseImpl.swift @@ -0,0 +1,22 @@ +import CreditDomainInterface +import RxSwift +import SongsDomainInterface + +public final class FetchCreditSongListUseCaseImpl: FetchCreditSongListUseCase { + private let creditRepository: any CreditRepository + + public init( + creditRepository: any CreditRepository + ) { + self.creditRepository = creditRepository + } + + public func execute( + name: String, + order: CreditSongOrderType, + page: Int, + limit: Int + ) -> Single<[SongEntity]> { + creditRepository.fetchCreditSongList(name: name, order: order, page: page, limit: limit) + } +} diff --git a/Projects/Domains/CreditDomain/Testing/UseCase/FetchCreditProfileUseCaseSpy.swift b/Projects/Domains/CreditDomain/Testing/UseCase/FetchCreditProfileUseCaseSpy.swift new file mode 100644 index 000000000..fd207404c --- /dev/null +++ b/Projects/Domains/CreditDomain/Testing/UseCase/FetchCreditProfileUseCaseSpy.swift @@ -0,0 +1,17 @@ +import CreditDomainInterface +import RxSwift +import SongsDomainInterface + +public final class FetchCreditProfileUseCaseSpy: FetchCreditProfileUseCase { + public var callCount = 0 + public var handler: (String) -> Single = { _ in fatalError() } + + public init() {} + + public func execute( + name: String + ) -> Single { + callCount += 1 + return handler(name) + } +} diff --git a/Projects/Domains/CreditDomain/Testing/UseCase/FetchCreditSongListUseCaseSpy.swift b/Projects/Domains/CreditDomain/Testing/UseCase/FetchCreditSongListUseCaseSpy.swift new file mode 100644 index 000000000..9dd5d72fe --- /dev/null +++ b/Projects/Domains/CreditDomain/Testing/UseCase/FetchCreditSongListUseCaseSpy.swift @@ -0,0 +1,20 @@ +import CreditDomainInterface +import RxSwift +import SongsDomainInterface + +public final class FetchCreditSongListUseCaseSpy: FetchCreditSongListUseCase { + public var callCount = 0 + public var handler: (String, CreditSongOrderType, Int, Int) -> Single<[SongEntity]> = { _, _, _, _ in fatalError() } + + public init() {} + + public func execute( + name: String, + order: CreditSongOrderType, + page: Int, + limit: Int + ) -> Single<[SongEntity]> { + callCount += 1 + return handler(name, order, page, limit) + } +} diff --git a/Projects/Domains/CreditDomain/Tests/CreditDomainTest.swift b/Projects/Domains/CreditDomain/Tests/CreditDomainTest.swift new file mode 100644 index 000000000..1204b00fc --- /dev/null +++ b/Projects/Domains/CreditDomain/Tests/CreditDomainTest.swift @@ -0,0 +1,11 @@ +import XCTest + +final class CreditDomainTests: XCTestCase { + override func setUpWithError() throws {} + + override func tearDownWithError() throws {} + + func testExample() { + XCTAssertEqual(1, 1) + } +} diff --git a/Projects/Domains/FaqDomain/Interface/DataSource/RemoteFaqDataSource.swift b/Projects/Domains/FaqDomain/Interface/DataSource/RemoteFaqDataSource.swift new file mode 100644 index 000000000..bd5ef8d31 --- /dev/null +++ b/Projects/Domains/FaqDomain/Interface/DataSource/RemoteFaqDataSource.swift @@ -0,0 +1,7 @@ +import Foundation +import RxSwift + +public protocol RemoteFaqDataSource { + func fetchCategories() -> Single + func fetchQna() -> Single<[FaqEntity]> +} diff --git a/Projects/Domains/FaqDomain/Interface/Entity/FaqCategoryEntity.swift b/Projects/Domains/FaqDomain/Interface/Entity/FaqCategoryEntity.swift new file mode 100644 index 000000000..6b310181b --- /dev/null +++ b/Projects/Domains/FaqDomain/Interface/Entity/FaqCategoryEntity.swift @@ -0,0 +1,11 @@ +import Foundation + +public struct FaqCategoryEntity: Equatable { + public init( + categories: [String] + ) { + self.categories = categories + } + + public let categories: [String] +} diff --git a/Projects/Domains/FaqDomain/Interface/Entity/FaqEntity.swift b/Projects/Domains/FaqDomain/Interface/Entity/FaqEntity.swift new file mode 100644 index 000000000..5a0e2a486 --- /dev/null +++ b/Projects/Domains/FaqDomain/Interface/Entity/FaqEntity.swift @@ -0,0 +1,18 @@ +import Foundation + +public struct FaqEntity: Equatable { + public init( + category: String, + question: String, + answer: String, + isOpen: Bool + ) { + self.category = category + self.question = question + self.answer = answer + self.isOpen = isOpen + } + + public let category, question, answer: String + public var isOpen: Bool +} diff --git a/Projects/Domains/FaqDomain/Interface/Repository/FaqRepository.swift b/Projects/Domains/FaqDomain/Interface/Repository/FaqRepository.swift new file mode 100644 index 000000000..d1d223ac8 --- /dev/null +++ b/Projects/Domains/FaqDomain/Interface/Repository/FaqRepository.swift @@ -0,0 +1,15 @@ +// +// ArtistRepository.swift +// DomainModule +// +// Created by KTH on 2023/02/08. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import Foundation +import RxSwift + +public protocol FaqRepository { + func fetchQnaCategories() -> Single + func fetchQna() -> Single<[FaqEntity]> +} diff --git a/Projects/Domains/FaqDomain/Interface/UseCase/FetchFaqCategoriesUseCase.swift b/Projects/Domains/FaqDomain/Interface/UseCase/FetchFaqCategoriesUseCase.swift new file mode 100644 index 000000000..56b863ece --- /dev/null +++ b/Projects/Domains/FaqDomain/Interface/UseCase/FetchFaqCategoriesUseCase.swift @@ -0,0 +1,14 @@ +// +// FetchArtistListUseCase.swift +// DomainModule +// +// Created by KTH on 2023/02/08. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import Foundation +import RxSwift + +public protocol FetchFaqCategoriesUseCase { + func execute() -> Single +} diff --git a/Projects/Domains/FaqDomain/Interface/UseCase/FetchFaqUseCase.swift b/Projects/Domains/FaqDomain/Interface/UseCase/FetchFaqUseCase.swift new file mode 100644 index 000000000..34ffb4b27 --- /dev/null +++ b/Projects/Domains/FaqDomain/Interface/UseCase/FetchFaqUseCase.swift @@ -0,0 +1,14 @@ +// +// FetchArtistListUseCase.swift +// DomainModule +// +// Created by KTH on 2023/02/08. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import Foundation +import RxSwift + +public protocol FetchFaqUseCase { + func execute() -> Single<[FaqEntity]> +} diff --git a/Projects/Domains/FaqDomain/Project.swift b/Projects/Domains/FaqDomain/Project.swift new file mode 100644 index 000000000..102b5ee1d --- /dev/null +++ b/Projects/Domains/FaqDomain/Project.swift @@ -0,0 +1,30 @@ +import DependencyPlugin +import ProjectDescription +import ProjectDescriptionHelpers + +let project = Project.module( + name: ModulePaths.Domain.FaqDomain.rawValue, + targets: [ + .interface( + module: .domain(.FaqDomain), + dependencies: [ + .domain(target: .BaseDomain, type: .interface) + ] + ), + .implements( + module: .domain(.FaqDomain), + dependencies: [ + .domain(target: .BaseDomain), + .domain(target: .FaqDomain, type: .interface) + ] + ), + .testing( + module: .domain(.FaqDomain), + dependencies: [.domain(target: .FaqDomain, type: .interface)] + ), + .tests( + module: .domain(.FaqDomain), + dependencies: [.domain(target: .FaqDomain)] + ) + ] +) diff --git a/Projects/Domains/FaqDomain/Sources/API/FaqAPI.swift b/Projects/Domains/FaqDomain/Sources/API/FaqAPI.swift new file mode 100644 index 000000000..86c5da43c --- /dev/null +++ b/Projects/Domains/FaqDomain/Sources/API/FaqAPI.swift @@ -0,0 +1,56 @@ +import BaseDomain +import ErrorModule +import Foundation +import KeychainModule +import Moya + +public enum FaqAPI { + case fetchFaqCategories + case fetchFaq +} + +extension FaqAPI: WMAPI { + public var domain: WMDomain { + return .faq + } + + public var urlPath: String { + switch self { + case .fetchFaqCategories: + return "/categories" + case .fetchFaq: + return "/list" + } + } + + public var method: Moya.Method { + switch self { + case .fetchFaqCategories, .fetchFaq: + return .get + } + } + + public var task: Moya.Task { + switch self { + case .fetchFaqCategories, .fetchFaq: + return .requestPlain + } + } + + public var jwtTokenType: JwtTokenType { + return .none + } + + public var errorMap: [Int: WMError] { + switch self { + default: + return [ + 400: .badRequest, + 401: .tokenExpired, + 404: .notFound, + 429: .tooManyRequest, + 500: .internalServerError + ] + } + } +} diff --git a/Projects/Domains/FaqDomain/Sources/DataSource/RemoteFaqDataSourceImpl.swift b/Projects/Domains/FaqDomain/Sources/DataSource/RemoteFaqDataSourceImpl.swift new file mode 100644 index 000000000..8d5b4d40a --- /dev/null +++ b/Projects/Domains/FaqDomain/Sources/DataSource/RemoteFaqDataSourceImpl.swift @@ -0,0 +1,18 @@ +import BaseDomain +import FaqDomainInterface +import Foundation +import RxSwift + +public final class RemoteFaqDataSourceImpl: BaseRemoteDataSource, RemoteFaqDataSource { + public func fetchCategories() -> Single { + return request(.fetchFaqCategories) + .map([String].self) + .map { FaqCategoryEntity(categories: $0) } + } + + public func fetchQna() -> Single<[FaqEntity]> { + return request(.fetchFaq) + .map([FaqResponseDTO].self) + .map { $0.map { $0.toDomain() } } + } +} diff --git a/Projects/Domains/FaqDomain/Sources/Repository/FaqRepositoryImpl.swift b/Projects/Domains/FaqDomain/Sources/Repository/FaqRepositoryImpl.swift new file mode 100644 index 000000000..9505b2010 --- /dev/null +++ b/Projects/Domains/FaqDomain/Sources/Repository/FaqRepositoryImpl.swift @@ -0,0 +1,28 @@ +// +// ArtistRepositoryImpl.swift +// DataModule +// +// Created by KTH on 2023/02/08. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import FaqDomainInterface +import RxSwift + +public final class FaqRepositoryImpl: FaqRepository { + private let remoteFaqDataSource: any RemoteFaqDataSource + + public init( + remoteFaqDataSource: RemoteFaqDataSource + ) { + self.remoteFaqDataSource = remoteFaqDataSource + } + + public func fetchQnaCategories() -> Single { + remoteFaqDataSource.fetchCategories() + } + + public func fetchQna() -> Single<[FaqEntity]> { + remoteFaqDataSource.fetchQna() + } +} diff --git a/Projects/Domains/FaqDomain/Sources/ResponseDTO/FaqCategoryResponseDTO.swift b/Projects/Domains/FaqDomain/Sources/ResponseDTO/FaqCategoryResponseDTO.swift new file mode 100644 index 000000000..bedbe1c69 --- /dev/null +++ b/Projects/Domains/FaqDomain/Sources/ResponseDTO/FaqCategoryResponseDTO.swift @@ -0,0 +1,14 @@ +import FaqDomainInterface +import Foundation + +public struct FaqCategoryResponseDTO: Decodable, Equatable { + public let categories: [String] +} + +public extension FaqCategoryResponseDTO { + func toDomain() -> FaqCategoryEntity { + FaqCategoryEntity( + categories: categories + ) + } +} diff --git a/Projects/Domains/FaqDomain/Sources/ResponseDTO/FaqResponseDTO.swift b/Projects/Domains/FaqDomain/Sources/ResponseDTO/FaqResponseDTO.swift new file mode 100644 index 000000000..4a081ff64 --- /dev/null +++ b/Projects/Domains/FaqDomain/Sources/ResponseDTO/FaqResponseDTO.swift @@ -0,0 +1,30 @@ +// +// ArtistListResponseDTO.swift +// DataMappingModule +// +// Created by KTH on 2023/02/01. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import FaqDomainInterface +import Foundation + +public struct FaqResponseDTO: Decodable { + public let question, answer: String + public let category: String + + private enum CodingKeys: String, CodingKey { + case question, answer, category + } +} + +public extension FaqResponseDTO { + func toDomain() -> FaqEntity { + FaqEntity( + category: category, + question: question, + answer: answer, + isOpen: false + ) + } +} diff --git a/Projects/Domains/FaqDomain/Sources/UseCase/FetchFaqCategoriesUseCaseImpl.swift b/Projects/Domains/FaqDomain/Sources/UseCase/FetchFaqCategoriesUseCaseImpl.swift new file mode 100644 index 000000000..dffb208a5 --- /dev/null +++ b/Projects/Domains/FaqDomain/Sources/UseCase/FetchFaqCategoriesUseCaseImpl.swift @@ -0,0 +1,17 @@ +import FaqDomainInterface +import Foundation +import RxSwift + +public struct FetchFaqCategoriesUseCaseImpl: FetchFaqCategoriesUseCase { + private let faqRepository: any FaqRepository + + public init( + faqRepository: FaqRepository + ) { + self.faqRepository = faqRepository + } + + public func execute() -> Single { + faqRepository.fetchQnaCategories() + } +} diff --git a/Projects/Domains/FaqDomain/Sources/UseCase/FetchFaqUseCaseImpl.swift b/Projects/Domains/FaqDomain/Sources/UseCase/FetchFaqUseCaseImpl.swift new file mode 100644 index 000000000..86e7f2754 --- /dev/null +++ b/Projects/Domains/FaqDomain/Sources/UseCase/FetchFaqUseCaseImpl.swift @@ -0,0 +1,17 @@ +import FaqDomainInterface +import Foundation +import RxSwift + +public struct FetchFaqUseCaseImpl: FetchFaqUseCase { + private let faqRepository: any FaqRepository + + public init( + faqRepository: FaqRepository + ) { + self.faqRepository = faqRepository + } + + public func execute() -> Single<[FaqEntity]> { + faqRepository.fetchQna() + } +} diff --git a/Projects/Domains/FaqDomain/Testing/FetchFaqCategoriesUseCaseStub.swift b/Projects/Domains/FaqDomain/Testing/FetchFaqCategoriesUseCaseStub.swift new file mode 100644 index 000000000..c2c4d7aae --- /dev/null +++ b/Projects/Domains/FaqDomain/Testing/FetchFaqCategoriesUseCaseStub.swift @@ -0,0 +1,9 @@ +import FaqDomainInterface +import Foundation +import RxSwift + +public struct FetchFaqCategoriesUseCaseStub: FetchFaqCategoriesUseCase { + public func execute() -> Single { + return .just(FaqCategoryEntity(categories: [])) + } +} diff --git a/Projects/Domains/FaqDomain/Testing/FetchFaqUseCaseStub.swift b/Projects/Domains/FaqDomain/Testing/FetchFaqUseCaseStub.swift new file mode 100644 index 000000000..329d37e71 --- /dev/null +++ b/Projects/Domains/FaqDomain/Testing/FetchFaqUseCaseStub.swift @@ -0,0 +1,9 @@ +import FaqDomainInterface +import Foundation +import RxSwift + +public struct FetchFaqUseCaseStub: FetchFaqUseCase { + public func execute() -> Single<[FaqEntity]> { + return .just([]) + } +} diff --git a/Projects/Domains/FaqDomain/Tests/FaqDomainTest.swift b/Projects/Domains/FaqDomain/Tests/FaqDomainTest.swift new file mode 100644 index 000000000..b07d5b5d3 --- /dev/null +++ b/Projects/Domains/FaqDomain/Tests/FaqDomainTest.swift @@ -0,0 +1,11 @@ +import XCTest + +final class FaqDomainTests: XCTestCase { + override func setUpWithError() throws {} + + override func tearDownWithError() throws {} + + func testExample() { + XCTAssertEqual(1, 1) + } +} diff --git a/Projects/Domains/ImageDomain/Interface/DataSource/RemoteImageDataSource.swift b/Projects/Domains/ImageDomain/Interface/DataSource/RemoteImageDataSource.swift new file mode 100644 index 000000000..ef6eeb0da --- /dev/null +++ b/Projects/Domains/ImageDomain/Interface/DataSource/RemoteImageDataSource.swift @@ -0,0 +1,8 @@ +import Foundation +import RxSwift + +public protocol RemoteImageDataSource { + func fetchLyricDecoratingBackground() -> Single<[LyricDecoratingBackgroundEntity]> + func fetchProfileList() -> Single<[ProfileListEntity]> + func fetchDefaultPlaylistImage() -> Single<[DefaultImageEntity]> +} diff --git a/Projects/Domains/ImageDomain/Interface/Entity/DefaultImageEntity.swift b/Projects/Domains/ImageDomain/Interface/Entity/DefaultImageEntity.swift new file mode 100644 index 000000000..55003262b --- /dev/null +++ b/Projects/Domains/ImageDomain/Interface/Entity/DefaultImageEntity.swift @@ -0,0 +1,11 @@ +import Foundation + +public struct DefaultImageEntity: Hashable, Equatable { + public let name: String + public let url: String + + public init(name: String, url: String) { + self.name = name + self.url = url + } +} diff --git a/Projects/Domains/ImageDomain/Interface/Entity/LyricDecoratingBackgroundEntity.swift b/Projects/Domains/ImageDomain/Interface/Entity/LyricDecoratingBackgroundEntity.swift new file mode 100644 index 000000000..613449a9d --- /dev/null +++ b/Projects/Domains/ImageDomain/Interface/Entity/LyricDecoratingBackgroundEntity.swift @@ -0,0 +1,14 @@ +import Foundation + +public struct LyricDecoratingBackgroundEntity { + public init( + name: String, + url: String + ) { + self.name = name + self.url = url + } + + public let name, url: String + public var isSelected: Bool = false +} diff --git a/Projects/Domains/ImageDomain/Interface/Entity/ProfileListEntity.swift b/Projects/Domains/ImageDomain/Interface/Entity/ProfileListEntity.swift new file mode 100644 index 000000000..5fee6a527 --- /dev/null +++ b/Projects/Domains/ImageDomain/Interface/Entity/ProfileListEntity.swift @@ -0,0 +1,15 @@ +import Foundation + +public struct ProfileListEntity: Equatable { + public init( + name: String, + url: String + ) { + self.name = name + self.url = url + } + + public let name: String + public let url: String + public var isSelected: Bool = false +} diff --git a/Projects/Domains/ImageDomain/Interface/Repository/ImageRepository.swift b/Projects/Domains/ImageDomain/Interface/Repository/ImageRepository.swift new file mode 100644 index 000000000..ef3c8e41e --- /dev/null +++ b/Projects/Domains/ImageDomain/Interface/Repository/ImageRepository.swift @@ -0,0 +1,8 @@ +import Foundation +import RxSwift + +public protocol ImageRepository { + func fetchLyricDecoratingBackground() -> Single<[LyricDecoratingBackgroundEntity]> + func fetchProfileList() -> Single<[ProfileListEntity]> + func fetchDefaultPlaylistImage() -> Single<[DefaultImageEntity]> +} diff --git a/Projects/Domains/ImageDomain/Interface/UseCase/FetchDefaultPlaylistImageUseCase.swift b/Projects/Domains/ImageDomain/Interface/UseCase/FetchDefaultPlaylistImageUseCase.swift new file mode 100644 index 000000000..dca426e27 --- /dev/null +++ b/Projects/Domains/ImageDomain/Interface/UseCase/FetchDefaultPlaylistImageUseCase.swift @@ -0,0 +1,6 @@ +import Foundation +import RxSwift + +public protocol FetchDefaultPlaylistImageUseCase { + func execute() -> Single<[DefaultImageEntity]> +} diff --git a/Projects/Domains/ImageDomain/Interface/UseCase/FetchLyricDecoratingBackgroundUseCase.swift b/Projects/Domains/ImageDomain/Interface/UseCase/FetchLyricDecoratingBackgroundUseCase.swift new file mode 100644 index 000000000..6ea0fe745 --- /dev/null +++ b/Projects/Domains/ImageDomain/Interface/UseCase/FetchLyricDecoratingBackgroundUseCase.swift @@ -0,0 +1,6 @@ +import Foundation +import RxSwift + +public protocol FetchLyricDecoratingBackgroundUseCase { + func execute() -> Single<[LyricDecoratingBackgroundEntity]> +} diff --git a/Projects/Domains/ImageDomain/Interface/UseCase/FetchProfileListUseCase.swift b/Projects/Domains/ImageDomain/Interface/UseCase/FetchProfileListUseCase.swift new file mode 100644 index 000000000..b16712279 --- /dev/null +++ b/Projects/Domains/ImageDomain/Interface/UseCase/FetchProfileListUseCase.swift @@ -0,0 +1,6 @@ +import Foundation +import RxSwift + +public protocol FetchProfileListUseCase { + func execute() -> Single<[ProfileListEntity]> +} diff --git a/Projects/Domains/ImageDomain/Project.swift b/Projects/Domains/ImageDomain/Project.swift new file mode 100644 index 000000000..ace9d994f --- /dev/null +++ b/Projects/Domains/ImageDomain/Project.swift @@ -0,0 +1,22 @@ +import DependencyPlugin +import ProjectDescription +import ProjectDescriptionHelpers + +let project = Project.module( + name: ModulePaths.Domain.ImageDomain.rawValue, + targets: [ + .interface( + module: .domain(.ImageDomain), + dependencies: [ + .domain(target: .BaseDomain, type: .interface) + ] + ), + .implements( + module: .domain(.ImageDomain), + dependencies: [ + .domain(target: .BaseDomain), + .domain(target: .ImageDomain, type: .interface) + ] + ) + ] +) diff --git a/Projects/Domains/ImageDomain/Sources/API/ImageAPI.swift b/Projects/Domains/ImageDomain/Sources/API/ImageAPI.swift new file mode 100644 index 000000000..8b2c61112 --- /dev/null +++ b/Projects/Domains/ImageDomain/Sources/API/ImageAPI.swift @@ -0,0 +1,59 @@ +import BaseDomain +import ErrorModule +import Foundation +import ImageDomainInterface +import Moya + +public enum ImageAPI { + case fetchLyricDecoratingBackground + case fetchProfileList + case fetchDefaultPlaylistImage +} + +extension ImageAPI: WMAPI { + public var domain: WMDomain { + return .image + } + + public var urlPath: String { + switch self { + case .fetchLyricDecoratingBackground: + return "/lyrics/backgrounds" + case .fetchProfileList: + return "/user/profiles" + case .fetchDefaultPlaylistImage: + return "/playlists" + } + } + + public var method: Moya.Method { + switch self { + case .fetchLyricDecoratingBackground, .fetchDefaultPlaylistImage, .fetchProfileList: + return .get + } + } + + public var task: Moya.Task { + switch self { + case .fetchLyricDecoratingBackground, .fetchProfileList, .fetchDefaultPlaylistImage: + return .requestPlain + } + } + + public var jwtTokenType: JwtTokenType { + return .none + } + + public var errorMap: [Int: WMError] { + switch self { + default: + return [ + 400: .badRequest, + 401: .tokenExpired, + 404: .notFound, + 429: .tooManyRequest, + 500: .internalServerError + ] + } + } +} diff --git a/Projects/Domains/ImageDomain/Sources/DataSource/RemoteImageDataSourceImpl.swift b/Projects/Domains/ImageDomain/Sources/DataSource/RemoteImageDataSourceImpl.swift new file mode 100644 index 000000000..f3775fc68 --- /dev/null +++ b/Projects/Domains/ImageDomain/Sources/DataSource/RemoteImageDataSourceImpl.swift @@ -0,0 +1,24 @@ +import BaseDomain +import Foundation +import ImageDomainInterface +import RxSwift + +public final class RemoteImageDataSourceImpl: BaseRemoteDataSource, RemoteImageDataSource { + public func fetchLyricDecoratingBackground() -> Single<[LyricDecoratingBackgroundEntity]> { + request(.fetchLyricDecoratingBackground) + .map([LyricDecoratingBackgroundResponseDTO].self) + .map { $0.map { $0.toDomain() } } + } + + public func fetchProfileList() -> Single<[ProfileListEntity]> { + return request(.fetchProfileList) + .map([FetchProfileListResponseDTO].self) + .map { $0.map { $0.toDomain() } } + } + + public func fetchDefaultPlaylistImage() -> Single<[DefaultImageEntity]> { + return request(.fetchDefaultPlaylistImage) + .map([FetchDefaultImageResponseDTO].self) + .map { $0.map { $0.toDomain() } } + } +} diff --git a/Projects/Domains/ImageDomain/Sources/Repository/ImageRepositoryImpl.swift b/Projects/Domains/ImageDomain/Sources/Repository/ImageRepositoryImpl.swift new file mode 100644 index 000000000..e2a429da5 --- /dev/null +++ b/Projects/Domains/ImageDomain/Sources/Repository/ImageRepositoryImpl.swift @@ -0,0 +1,25 @@ +import Foundation +import ImageDomainInterface +import RxSwift + +public final class ImageRepositoryImpl: ImageRepository { + private let remoteImageDataSource: any RemoteImageDataSource + + public init( + remoteImageDataSource: RemoteImageDataSource + ) { + self.remoteImageDataSource = remoteImageDataSource + } + + public func fetchLyricDecoratingBackground() -> Single<[LyricDecoratingBackgroundEntity]> { + remoteImageDataSource.fetchLyricDecoratingBackground() + } + + public func fetchProfileList() -> Single<[ProfileListEntity]> { + remoteImageDataSource.fetchProfileList() + } + + public func fetchDefaultPlaylistImage() -> Single<[DefaultImageEntity]> { + remoteImageDataSource.fetchDefaultPlaylistImage() + } +} diff --git a/Projects/Domains/ImageDomain/Sources/ResponseDTO/FetchDefaultImageResponseDTO.swift b/Projects/Domains/ImageDomain/Sources/ResponseDTO/FetchDefaultImageResponseDTO.swift new file mode 100644 index 000000000..fb5df685a --- /dev/null +++ b/Projects/Domains/ImageDomain/Sources/ResponseDTO/FetchDefaultImageResponseDTO.swift @@ -0,0 +1,17 @@ +import Foundation +import ImageDomainInterface + +public struct FetchDefaultImageResponseDTO: Decodable, Equatable { + public let type: String + public let name: String + public let url: String +} + +public extension FetchDefaultImageResponseDTO { + func toDomain() -> DefaultImageEntity { + DefaultImageEntity( + name: name, + url: url + ) + } +} diff --git a/Projects/Domains/ImageDomain/Sources/ResponseDTO/FetchProfileListResponseDTO.swift b/Projects/Domains/ImageDomain/Sources/ResponseDTO/FetchProfileListResponseDTO.swift new file mode 100644 index 000000000..f18813968 --- /dev/null +++ b/Projects/Domains/ImageDomain/Sources/ResponseDTO/FetchProfileListResponseDTO.swift @@ -0,0 +1,17 @@ +import Foundation +import ImageDomainInterface + +public struct FetchProfileListResponseDTO: Decodable, Equatable { + public let type: String + public let name: String + public let url: String +} + +public extension FetchProfileListResponseDTO { + func toDomain() -> ProfileListEntity { + ProfileListEntity( + name: name, + url: url + ) + } +} diff --git a/Projects/Domains/ImageDomain/Sources/ResponseDTO/LyricDecoratingBackgroundResponseDTO.swift b/Projects/Domains/ImageDomain/Sources/ResponseDTO/LyricDecoratingBackgroundResponseDTO.swift new file mode 100644 index 000000000..091207643 --- /dev/null +++ b/Projects/Domains/ImageDomain/Sources/ResponseDTO/LyricDecoratingBackgroundResponseDTO.swift @@ -0,0 +1,18 @@ +import Foundation +import ImageDomainInterface + +public struct LyricDecoratingBackgroundResponseDTO: Decodable { + let name: String + let url: String + + private enum CodingKeys: String, CodingKey { + case name + case url + } +} + +public extension LyricDecoratingBackgroundResponseDTO { + func toDomain() -> LyricDecoratingBackgroundEntity { + return .init(name: name, url: url) + } +} diff --git a/Projects/Domains/ImageDomain/Sources/UseCase/FetchDefaultPlaylistImageUseCaseImpl.swift b/Projects/Domains/ImageDomain/Sources/UseCase/FetchDefaultPlaylistImageUseCaseImpl.swift new file mode 100644 index 000000000..c0dd4a064 --- /dev/null +++ b/Projects/Domains/ImageDomain/Sources/UseCase/FetchDefaultPlaylistImageUseCaseImpl.swift @@ -0,0 +1,17 @@ +import Foundation +import ImageDomainInterface +import RxSwift + +public struct FetchDefaultPlaylistImageUseCaseImpl: FetchDefaultPlaylistImageUseCase { + private let imageRepository: any ImageRepository + + public init( + imageRepository: ImageRepository + ) { + self.imageRepository = imageRepository + } + + public func execute() -> Single<[DefaultImageEntity]> { + imageRepository.fetchDefaultPlaylistImage() + } +} diff --git a/Projects/Domains/ImageDomain/Sources/UseCase/FetchLyricDecoratingBackgroundUseCaseImpl.swift b/Projects/Domains/ImageDomain/Sources/UseCase/FetchLyricDecoratingBackgroundUseCaseImpl.swift new file mode 100644 index 000000000..71b43ba00 --- /dev/null +++ b/Projects/Domains/ImageDomain/Sources/UseCase/FetchLyricDecoratingBackgroundUseCaseImpl.swift @@ -0,0 +1,17 @@ +import Foundation +import ImageDomainInterface +import RxSwift + +public struct FetchLyricDecoratingBackgroundUseCaseImpl: FetchLyricDecoratingBackgroundUseCase { + private let imageRepository: any ImageRepository + + public init( + imageRepository: ImageRepository + ) { + self.imageRepository = imageRepository + } + + public func execute() -> Single<[LyricDecoratingBackgroundEntity]> { + imageRepository.fetchLyricDecoratingBackground() + } +} diff --git a/Projects/Domains/ImageDomain/Sources/UseCase/FetchProfileListUseCaseImpl.swift b/Projects/Domains/ImageDomain/Sources/UseCase/FetchProfileListUseCaseImpl.swift new file mode 100644 index 000000000..ea55fc641 --- /dev/null +++ b/Projects/Domains/ImageDomain/Sources/UseCase/FetchProfileListUseCaseImpl.swift @@ -0,0 +1,17 @@ +import Foundation +import ImageDomainInterface +import RxSwift + +public struct FetchProfileListUseCaseImpl: FetchProfileListUseCase { + private let imageRepository: any ImageRepository + + public init( + imageRepository: ImageRepository + ) { + self.imageRepository = imageRepository + } + + public func execute() -> Single<[ProfileListEntity]> { + imageRepository.fetchProfileList() + } +} diff --git a/Projects/Domains/LikeDomain/Interface/DataSource/RemoteLikeDataSource.swift b/Projects/Domains/LikeDomain/Interface/DataSource/RemoteLikeDataSource.swift new file mode 100644 index 000000000..8937ba85d --- /dev/null +++ b/Projects/Domains/LikeDomain/Interface/DataSource/RemoteLikeDataSource.swift @@ -0,0 +1,16 @@ +// +// ArtistRepository.swift +// DomainModule +// +// Created by KTH on 2023/02/08. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import Foundation +import RxSwift + +public protocol RemoteLikeDataSource { + func addLikeSong(id: String) -> Single + func cancelLikeSong(id: String) -> Single + func checkIsLikedSong(id: String) -> Single +} diff --git a/Projects/Services/DomainModule/Sources/Like/Entity/LikeEntity.swift b/Projects/Domains/LikeDomain/Interface/Entity/LikeEntity.swift similarity index 88% rename from Projects/Services/DomainModule/Sources/Like/Entity/LikeEntity.swift rename to Projects/Domains/LikeDomain/Interface/Entity/LikeEntity.swift index 3a4ceaefd..872f4fdef 100644 --- a/Projects/Services/DomainModule/Sources/Like/Entity/LikeEntity.swift +++ b/Projects/Domains/LikeDomain/Interface/Entity/LikeEntity.swift @@ -10,7 +10,7 @@ import Foundation public struct LikeEntity { public init( - status: Int, + status: String, likes: Int, description: String = "" ) { @@ -18,8 +18,8 @@ public struct LikeEntity { self.likes = likes self.description = description } - - public let status: Int + + public let status: String public let likes: Int public var description: String = "" } diff --git a/Projects/Domains/LikeDomain/Interface/Repository/LikeRepository.swift b/Projects/Domains/LikeDomain/Interface/Repository/LikeRepository.swift new file mode 100644 index 000000000..d633eac31 --- /dev/null +++ b/Projects/Domains/LikeDomain/Interface/Repository/LikeRepository.swift @@ -0,0 +1,16 @@ +// +// ArtistRepository.swift +// DomainModule +// +// Created by KTH on 2023/02/08. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import Foundation +import RxSwift + +public protocol LikeRepository { + func addLikeSong(id: String) -> Single + func cancelLikeSong(id: String) -> Single + func checkIsLikedSong(id: String) -> Single +} diff --git a/Projects/Domains/LikeDomain/Interface/UseCase/AddLikeSongUseCase.swift b/Projects/Domains/LikeDomain/Interface/UseCase/AddLikeSongUseCase.swift new file mode 100644 index 000000000..7fabbba89 --- /dev/null +++ b/Projects/Domains/LikeDomain/Interface/UseCase/AddLikeSongUseCase.swift @@ -0,0 +1,14 @@ +// +// FetchArtistListUseCase.swift +// DomainModule +// +// Created by KTH on 2023/02/08. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import Foundation +import RxSwift + +public protocol AddLikeSongUseCase { + func execute(id: String) -> Single +} diff --git a/Projects/Services/DomainModule/Sources/Like/UseCases/CancelLikeSongUseCase.swift b/Projects/Domains/LikeDomain/Interface/UseCase/CancelLikeSongUseCase.swift similarity index 75% rename from Projects/Services/DomainModule/Sources/Like/UseCases/CancelLikeSongUseCase.swift rename to Projects/Domains/LikeDomain/Interface/UseCase/CancelLikeSongUseCase.swift index 7a92848a5..974a3e2b3 100644 --- a/Projects/Services/DomainModule/Sources/Like/UseCases/CancelLikeSongUseCase.swift +++ b/Projects/Domains/LikeDomain/Interface/UseCase/CancelLikeSongUseCase.swift @@ -8,8 +8,7 @@ import Foundation import RxSwift -import DataMappingModule public protocol CancelLikeSongUseCase { - func execute(id:String) -> Single + func execute(id: String) -> Single } diff --git a/Projects/Domains/LikeDomain/Project.swift b/Projects/Domains/LikeDomain/Project.swift new file mode 100644 index 000000000..b44a955c9 --- /dev/null +++ b/Projects/Domains/LikeDomain/Project.swift @@ -0,0 +1,32 @@ +import DependencyPlugin +import ProjectDescription +import ProjectDescriptionHelpers + +let project = Project.module( + name: ModulePaths.Domain.LikeDomain.rawValue, + targets: [ + .interface( + module: .domain(.LikeDomain), + dependencies: [ + .domain(target: .BaseDomain, type: .interface) + ] + ), + .implements( + module: .domain(.LikeDomain), + dependencies: [ + .domain(target: .BaseDomain), + .domain(target: .LikeDomain, type: .interface) + ] + ), + .testing( + module: .domain(.LikeDomain), + dependencies: [ + .domain(target: .LikeDomain, type: .interface) + ] + ), + .tests( + module: .domain(.LikeDomain), + dependencies: [.domain(target: .LikeDomain)] + ) + ] +) diff --git a/Projects/Domains/LikeDomain/Sources/API/LikeAPI.swift b/Projects/Domains/LikeDomain/Sources/API/LikeAPI.swift new file mode 100644 index 000000000..433b329ea --- /dev/null +++ b/Projects/Domains/LikeDomain/Sources/API/LikeAPI.swift @@ -0,0 +1,63 @@ +import BaseDomain +import ErrorModule +import Foundation +import KeychainModule +import Moya + +public enum LikeAPI { + case addLikeSong(id: String) + case cancelLikeSong(id: String) + case checkIsLikedSong(id: String) +} + +extension LikeAPI: WMAPI { + public var domain: WMDomain { + .like + } + + public var urlPath: String { + switch self { + case let .addLikeSong(id: id): + return "/\(id)" + case let .cancelLikeSong(id: id): + return "/\(id)" + case let .checkIsLikedSong(id): + return "/\(id)" + } + } + + public var method: Moya.Method { + switch self { + case .addLikeSong: + return .post + case .cancelLikeSong: + return .delete + case .checkIsLikedSong: + return .get + } + } + + public var task: Moya.Task { + return .requestPlain + } + + public var jwtTokenType: JwtTokenType { + switch self { + case .addLikeSong, .cancelLikeSong, .checkIsLikedSong: + return .accessToken + } + } + + public var errorMap: [Int: WMError] { + switch self { + default: + return [ + 400: .badRequest, + 401: .tokenExpired, + 404: .notFound, + 429: .tooManyRequest, + 500: .internalServerError + ] + } + } +} diff --git a/Projects/Domains/LikeDomain/Sources/DataSource/Remote/RemoteLikeDataSourceImpl.swift b/Projects/Domains/LikeDomain/Sources/DataSource/Remote/RemoteLikeDataSourceImpl.swift new file mode 100644 index 000000000..84082cd88 --- /dev/null +++ b/Projects/Domains/LikeDomain/Sources/DataSource/Remote/RemoteLikeDataSourceImpl.swift @@ -0,0 +1,24 @@ +import BaseDomain +import Foundation +import LikeDomainInterface +import RxSwift + +public final class RemoteLikeDataSourceImpl: BaseRemoteDataSource, RemoteLikeDataSource { + public func addLikeSong(id: String) -> Single { + request(.addLikeSong(id: id)) + .map(LikeResponseDTO.self) + .map { $0.toDomain() } + } + + public func cancelLikeSong(id: String) -> Single { + request(.cancelLikeSong(id: id)) + .map(LikeResponseDTO.self) + .map { $0.toDomain() } + } + + public func checkIsLikedSong(id: String) -> Single { + request(.checkIsLikedSong(id: id)) + .map(CheckIsLikedResponseDTO.self) + .map(\.isLiked) + } +} diff --git a/Projects/Domains/LikeDomain/Sources/Repository/LikeRepositoryImpl.swift b/Projects/Domains/LikeDomain/Sources/Repository/LikeRepositoryImpl.swift new file mode 100644 index 000000000..172f02f8d --- /dev/null +++ b/Projects/Domains/LikeDomain/Sources/Repository/LikeRepositoryImpl.swift @@ -0,0 +1,31 @@ +// +// ArtistRepositoryImpl.swift +// DataModule +// +// Created by KTH on 2023/02/08. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import ErrorModule +import LikeDomainInterface +import RxSwift + +public final class LikeRepositoryImpl: LikeRepository { + private let remoteLikeDataSource: any RemoteLikeDataSource + + public init(remoteLikeDataSource: any RemoteLikeDataSource) { + self.remoteLikeDataSource = remoteLikeDataSource + } + + public func addLikeSong(id: String) -> Single { + remoteLikeDataSource.addLikeSong(id: id) + } + + public func cancelLikeSong(id: String) -> Single { + remoteLikeDataSource.cancelLikeSong(id: id) + } + + public func checkIsLikedSong(id: String) -> Single { + remoteLikeDataSource.checkIsLikedSong(id: id) + } +} diff --git a/Projects/Domains/LikeDomain/Sources/ResponseDTO/CheckIsLikedResponseDTO.swift b/Projects/Domains/LikeDomain/Sources/ResponseDTO/CheckIsLikedResponseDTO.swift new file mode 100644 index 000000000..0b6cf3354 --- /dev/null +++ b/Projects/Domains/LikeDomain/Sources/ResponseDTO/CheckIsLikedResponseDTO.swift @@ -0,0 +1,5 @@ +import Foundation + +struct CheckIsLikedResponseDTO: Decodable { + let isLiked: Bool +} diff --git a/Projects/Domains/LikeDomain/Sources/ResponseDTO/LikeResponseDTO.swift b/Projects/Domains/LikeDomain/Sources/ResponseDTO/LikeResponseDTO.swift new file mode 100644 index 000000000..6e56335ca --- /dev/null +++ b/Projects/Domains/LikeDomain/Sources/ResponseDTO/LikeResponseDTO.swift @@ -0,0 +1,29 @@ +// +// LikeResponseDTO.swift +// DataMappingModuleTests +// +// Created by YoungK on 2023/04/03. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import Foundation +import LikeDomainInterface + +public struct LikeResponseDTO: Decodable { + public let status: String + public let likes: Int + + private enum CodingKeys: String, CodingKey { + case status + case likes = "data" + } +} + +public extension LikeResponseDTO { + func toDomain() -> LikeEntity { + LikeEntity( + status: status, + likes: likes + ) + } +} diff --git a/Projects/Services/DataModule/Sources/Like/UseCases/AddLikeSongUseCaseImpl.swift b/Projects/Domains/LikeDomain/Sources/UseCase/AddLikeSongUseCaseImpl.swift similarity index 86% rename from Projects/Services/DataModule/Sources/Like/UseCases/AddLikeSongUseCaseImpl.swift rename to Projects/Domains/LikeDomain/Sources/UseCase/AddLikeSongUseCaseImpl.swift index 19a6614af..26c09dd3b 100644 --- a/Projects/Services/DataModule/Sources/Like/UseCases/AddLikeSongUseCaseImpl.swift +++ b/Projects/Domains/LikeDomain/Sources/UseCase/AddLikeSongUseCaseImpl.swift @@ -7,15 +7,10 @@ // import Foundation +import LikeDomainInterface import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule public struct AddLikeSongUseCaseImpl: AddLikeSongUseCase { - - - private let likeRepository: any LikeRepository public init( @@ -23,9 +18,8 @@ public struct AddLikeSongUseCaseImpl: AddLikeSongUseCase { ) { self.likeRepository = likeRepository } - + public func execute(id: String) -> Single { likeRepository.addLikeSong(id: id) } - } diff --git a/Projects/Services/DataModule/Sources/Like/UseCases/CancelLikeSongUseCaseImpl.swift b/Projects/Domains/LikeDomain/Sources/UseCase/CancelLikeSongUseCaseImpl.swift similarity index 87% rename from Projects/Services/DataModule/Sources/Like/UseCases/CancelLikeSongUseCaseImpl.swift rename to Projects/Domains/LikeDomain/Sources/UseCase/CancelLikeSongUseCaseImpl.swift index 456dd233e..9814beb49 100644 --- a/Projects/Services/DataModule/Sources/Like/UseCases/CancelLikeSongUseCaseImpl.swift +++ b/Projects/Domains/LikeDomain/Sources/UseCase/CancelLikeSongUseCaseImpl.swift @@ -7,15 +7,10 @@ // import Foundation +import LikeDomainInterface import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule public struct CancelLikeSongUseCaseImpl: CancelLikeSongUseCase { - - - private let likeRepository: any LikeRepository public init( @@ -23,9 +18,8 @@ public struct CancelLikeSongUseCaseImpl: CancelLikeSongUseCase { ) { self.likeRepository = likeRepository } - + public func execute(id: String) -> Single { likeRepository.cancelLikeSong(id: id) } - } diff --git a/Projects/Domains/LikeDomain/Testing/UseCase/AddLikeSongUseCaseSpy.swift b/Projects/Domains/LikeDomain/Testing/UseCase/AddLikeSongUseCaseSpy.swift new file mode 100644 index 000000000..ff041e1c3 --- /dev/null +++ b/Projects/Domains/LikeDomain/Testing/UseCase/AddLikeSongUseCaseSpy.swift @@ -0,0 +1,14 @@ +import LikeDomainInterface +import RxSwift + +public final class AddLikeSongUseCaseSpy: AddLikeSongUseCase { + public private(set) var callCount = 0 + public var handler: (String) -> Single = { _ in fatalError() } + + public init() {} + + public func execute(id: String) -> Single { + callCount += 1 + return handler(id) + } +} diff --git a/Projects/Domains/LikeDomain/Testing/UseCase/CancelLikeSongUseCaseSpy.swift b/Projects/Domains/LikeDomain/Testing/UseCase/CancelLikeSongUseCaseSpy.swift new file mode 100644 index 000000000..180422887 --- /dev/null +++ b/Projects/Domains/LikeDomain/Testing/UseCase/CancelLikeSongUseCaseSpy.swift @@ -0,0 +1,14 @@ +import LikeDomainInterface +import RxSwift + +public final class CancelLikeSongUseCaseSpy: CancelLikeSongUseCase { + public private(set) var callCount = 0 + public var handler: (String) -> Single = { _ in fatalError() } + + public init() {} + + public func execute(id: String) -> Single { + callCount += 1 + return handler(id) + } +} diff --git a/Projects/Domains/LikeDomain/Tests/LikeDomainTest.swift b/Projects/Domains/LikeDomain/Tests/LikeDomainTest.swift new file mode 100644 index 000000000..ada164b0d --- /dev/null +++ b/Projects/Domains/LikeDomain/Tests/LikeDomainTest.swift @@ -0,0 +1,11 @@ +import XCTest + +final class LikeDomainTests: XCTestCase { + override func setUpWithError() throws {} + + override func tearDownWithError() throws {} + + func testExample() { + XCTAssertEqual(1, 1) + } +} diff --git a/Projects/Domains/NoticeDomain/Interface/DataSource/RemoteNoticeDataSource.swift b/Projects/Domains/NoticeDomain/Interface/DataSource/RemoteNoticeDataSource.swift new file mode 100644 index 000000000..078a30721 --- /dev/null +++ b/Projects/Domains/NoticeDomain/Interface/DataSource/RemoteNoticeDataSource.swift @@ -0,0 +1,17 @@ +// +// RemoteNoticeDataSource.swift +// NetworkModule +// +// Created by KTH on 2023/04/08. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import Foundation +import RxSwift + +public protocol RemoteNoticeDataSource { + func fetchNoticeCategories() -> Single + func fetchNoticePopup() -> Single<[FetchNoticeEntity]> + func fetchNoticeAll() -> Single<[FetchNoticeEntity]> + func fetchNoticeIDList() -> Single +} diff --git a/Projects/Domains/NoticeDomain/Interface/Entity/FetchNoticeCategoriesEntity.swift b/Projects/Domains/NoticeDomain/Interface/Entity/FetchNoticeCategoriesEntity.swift new file mode 100644 index 000000000..7a74e107f --- /dev/null +++ b/Projects/Domains/NoticeDomain/Interface/Entity/FetchNoticeCategoriesEntity.swift @@ -0,0 +1,11 @@ +import Foundation + +public struct FetchNoticeCategoriesEntity { + public init ( + categories: [String] + ) { + self.categories = categories + } + + public let categories: [String] +} diff --git a/Projects/Domains/NoticeDomain/Interface/Entity/FetchNoticeEntity.swift b/Projects/Domains/NoticeDomain/Interface/Entity/FetchNoticeEntity.swift new file mode 100644 index 000000000..df7d72fb3 --- /dev/null +++ b/Projects/Domains/NoticeDomain/Interface/Entity/FetchNoticeEntity.swift @@ -0,0 +1,44 @@ +import Foundation + +public struct FetchNoticeEntity { + public init( + id: Int, + category: String, + title: String, + content: String, + thumbnail: FetchNoticeEntity.Image, + origins: [FetchNoticeEntity.Image], + createdAt: Double + ) { + self.id = id + self.category = category + self.title = title + self.content = content + self.thumbnail = thumbnail + self.origins = origins + self.createdAt = createdAt + } + + public let id: Int + public let category, title: String + public let content: String + public let thumbnail: FetchNoticeEntity.Image + public let origins: [FetchNoticeEntity.Image] + public let createdAt: Double + public var isRead: Bool = true +} + +public extension FetchNoticeEntity { + struct Image { + public init ( + url: String, + link: String + ) { + self.url = url + self.link = link + } + + public let url: String + public let link: String + } +} diff --git a/Projects/Domains/NoticeDomain/Interface/Entity/FetchNoticeIDListEntity.swift b/Projects/Domains/NoticeDomain/Interface/Entity/FetchNoticeIDListEntity.swift new file mode 100644 index 000000000..d2206a08f --- /dev/null +++ b/Projects/Domains/NoticeDomain/Interface/Entity/FetchNoticeIDListEntity.swift @@ -0,0 +1,14 @@ +import Foundation + +public struct FetchNoticeIDListEntity { + public init( + status: String, + data: [Int] + ) { + self.status = status + self.data = data + } + + public let status: String + public let data: [Int] +} diff --git a/Projects/Domains/NoticeDomain/Interface/Repository/NoticeRepository.swift b/Projects/Domains/NoticeDomain/Interface/Repository/NoticeRepository.swift new file mode 100644 index 000000000..0755628b7 --- /dev/null +++ b/Projects/Domains/NoticeDomain/Interface/Repository/NoticeRepository.swift @@ -0,0 +1,9 @@ +import Foundation +import RxSwift + +public protocol NoticeRepository { + func fetchNoticeCategories() -> Single + func fetchNoticePopup() -> Single<[FetchNoticeEntity]> + func fetchNoticeAll() -> Single<[FetchNoticeEntity]> + func fetchNoticeIDList() -> Single +} diff --git a/Projects/Domains/NoticeDomain/Interface/UseCase/FetchNoticeAllUseCase.swift b/Projects/Domains/NoticeDomain/Interface/UseCase/FetchNoticeAllUseCase.swift new file mode 100644 index 000000000..740d5eae9 --- /dev/null +++ b/Projects/Domains/NoticeDomain/Interface/UseCase/FetchNoticeAllUseCase.swift @@ -0,0 +1,6 @@ +import Foundation +import RxSwift + +public protocol FetchNoticeAllUseCase { + func execute() -> Single<[FetchNoticeEntity]> +} diff --git a/Projects/Domains/NoticeDomain/Interface/UseCase/FetchNoticeCategoriesUseCase.swift b/Projects/Domains/NoticeDomain/Interface/UseCase/FetchNoticeCategoriesUseCase.swift new file mode 100644 index 000000000..f85908f3d --- /dev/null +++ b/Projects/Domains/NoticeDomain/Interface/UseCase/FetchNoticeCategoriesUseCase.swift @@ -0,0 +1,6 @@ +import Foundation +import RxSwift + +public protocol FetchNoticeCategoriesUseCase { + func execute() -> Single +} diff --git a/Projects/Domains/NoticeDomain/Interface/UseCase/FetchNoticeIDListUseCase.swift b/Projects/Domains/NoticeDomain/Interface/UseCase/FetchNoticeIDListUseCase.swift new file mode 100644 index 000000000..f89096fd3 --- /dev/null +++ b/Projects/Domains/NoticeDomain/Interface/UseCase/FetchNoticeIDListUseCase.swift @@ -0,0 +1,6 @@ +import Foundation +import RxSwift + +public protocol FetchNoticeIDListUseCase { + func execute() -> Single +} diff --git a/Projects/Domains/NoticeDomain/Interface/UseCase/FetchNoticePopupUseCase.swift b/Projects/Domains/NoticeDomain/Interface/UseCase/FetchNoticePopupUseCase.swift new file mode 100644 index 000000000..4323ef4a3 --- /dev/null +++ b/Projects/Domains/NoticeDomain/Interface/UseCase/FetchNoticePopupUseCase.swift @@ -0,0 +1,6 @@ +import Foundation +import RxSwift + +public protocol FetchNoticePopupUseCase { + func execute() -> Single<[FetchNoticeEntity]> +} diff --git a/Projects/Domains/NoticeDomain/Project.swift b/Projects/Domains/NoticeDomain/Project.swift new file mode 100644 index 000000000..61dc7b08c --- /dev/null +++ b/Projects/Domains/NoticeDomain/Project.swift @@ -0,0 +1,30 @@ +import DependencyPlugin +import ProjectDescription +import ProjectDescriptionHelpers + +let project = Project.module( + name: ModulePaths.Domain.NoticeDomain.rawValue, + targets: [ + .interface( + module: .domain(.NoticeDomain), + dependencies: [ + .domain(target: .BaseDomain, type: .interface) + ] + ), + .implements( + module: .domain(.NoticeDomain), + dependencies: [ + .domain(target: .BaseDomain), + .domain(target: .NoticeDomain, type: .interface) + ] + ), + .testing( + module: .domain(.NoticeDomain), + dependencies: [.domain(target: .NoticeDomain, type: .interface)] + ), + .tests( + module: .domain(.NoticeDomain), + dependencies: [.domain(target: .NoticeDomain)] + ) + ] +) diff --git a/Projects/Domains/NoticeDomain/Sources/API/NoticeAPI.swift b/Projects/Domains/NoticeDomain/Sources/API/NoticeAPI.swift new file mode 100644 index 000000000..0da97e75d --- /dev/null +++ b/Projects/Domains/NoticeDomain/Sources/API/NoticeAPI.swift @@ -0,0 +1,82 @@ +// +// NoticeAPI.swift +// APIKit +// +// Created by KTH on 2023/04/04. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import BaseDomain +import ErrorModule +import Foundation +import Moya +import NoticeDomainInterface + +public enum NoticeAPI { + case fetchNoticeCategories + case fetchNoticePopup + case fetchNoticeAll + case fetchNoticeIDList +} + +extension NoticeAPI: WMAPI { + public var domain: WMDomain { + return .notice + } + + public var urlPath: String { + switch self { + case .fetchNoticeCategories: + return "/categories" + case .fetchNoticePopup: + return "/popup" + case .fetchNoticeAll: + return "/all" + case .fetchNoticeIDList: + return "/ids" + } + } + + public var method: Moya.Method { + switch self { + case .fetchNoticeCategories: + return .get + case .fetchNoticePopup: + return .get + case .fetchNoticeAll: + return .get + case .fetchNoticeIDList: + return .get + } + } + + public var task: Moya.Task { + switch self { + case .fetchNoticeCategories: + return .requestPlain + case .fetchNoticePopup: + return .requestPlain + case .fetchNoticeAll: + return .requestPlain + case .fetchNoticeIDList: + return .requestPlain + } + } + + public var jwtTokenType: JwtTokenType { + return .none + } + + public var errorMap: [Int: WMError] { + switch self { + default: + return [ + 400: .badRequest, + 401: .tokenExpired, + 404: .notFound, + 429: .tooManyRequest, + 500: .internalServerError + ] + } + } +} diff --git a/Projects/Domains/NoticeDomain/Sources/DataSource/RemoteNoticeDataSourceImpl.swift b/Projects/Domains/NoticeDomain/Sources/DataSource/RemoteNoticeDataSourceImpl.swift new file mode 100644 index 000000000..d936da175 --- /dev/null +++ b/Projects/Domains/NoticeDomain/Sources/DataSource/RemoteNoticeDataSourceImpl.swift @@ -0,0 +1,38 @@ +// +// RemoteNoticeDataSourceImpl.swift +// NetworkModule +// +// Created by KTH on 2023/04/08. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import BaseDomain +import Foundation +import NoticeDomainInterface +import RxSwift + +public final class RemoteNoticeDataSourceImpl: BaseRemoteDataSource, RemoteNoticeDataSource { + public func fetchNoticeCategories() -> Single { + request(.fetchNoticeCategories) + .map(FetchNoticeCategoriesResponseDTO.self) + .map { $0.toDomain() } + } + + public func fetchNoticePopup() -> Single<[FetchNoticeEntity]> { + request(.fetchNoticePopup) + .map([FetchNoticeResponseDTO].self) + .map { $0.map { $0.toDomain() } } + } + + public func fetchNoticeAll() -> Single<[FetchNoticeEntity]> { + request(.fetchNoticeAll) + .map([FetchNoticeResponseDTO].self) + .map { $0.map { $0.toDomain() } } + } + + public func fetchNoticeIDList() -> Single { + request(.fetchNoticeIDList) + .map(FetchNoticeIDListDTO.self) + .map { $0.toDomain() } + } +} diff --git a/Projects/Domains/NoticeDomain/Sources/Repository/NoticeRepositoryImpl.swift b/Projects/Domains/NoticeDomain/Sources/Repository/NoticeRepositoryImpl.swift new file mode 100644 index 000000000..09c643f4c --- /dev/null +++ b/Projects/Domains/NoticeDomain/Sources/Repository/NoticeRepositoryImpl.swift @@ -0,0 +1,29 @@ +import Foundation +import NoticeDomainInterface +import RxSwift + +public final class NoticeRepositoryImpl: NoticeRepository { + private let remoteNoticeDataSource: any RemoteNoticeDataSource + + public init( + remoteNoticeDataSource: RemoteNoticeDataSource + ) { + self.remoteNoticeDataSource = remoteNoticeDataSource + } + + public func fetchNoticeCategories() -> Single { + remoteNoticeDataSource.fetchNoticeCategories() + } + + public func fetchNoticePopup() -> Single<[FetchNoticeEntity]> { + remoteNoticeDataSource.fetchNoticePopup() + } + + public func fetchNoticeAll() -> Single<[FetchNoticeEntity]> { + remoteNoticeDataSource.fetchNoticeAll() + } + + public func fetchNoticeIDList() -> Single { + remoteNoticeDataSource.fetchNoticeIDList() + } +} diff --git a/Projects/Domains/NoticeDomain/Sources/ResponseDTO/FetchNoticeCategoriesResponseDTO.swift b/Projects/Domains/NoticeDomain/Sources/ResponseDTO/FetchNoticeCategoriesResponseDTO.swift new file mode 100644 index 000000000..7c2a45c95 --- /dev/null +++ b/Projects/Domains/NoticeDomain/Sources/ResponseDTO/FetchNoticeCategoriesResponseDTO.swift @@ -0,0 +1,14 @@ +import Foundation +import NoticeDomainInterface + +public struct FetchNoticeCategoriesResponseDTO: Decodable { + public let categories: [String] +} + +public extension FetchNoticeCategoriesResponseDTO { + func toDomain() -> FetchNoticeCategoriesEntity { + return FetchNoticeCategoriesEntity( + categories: categories + ) + } +} diff --git a/Projects/Domains/NoticeDomain/Sources/ResponseDTO/FetchNoticeIDListDTO.swift b/Projects/Domains/NoticeDomain/Sources/ResponseDTO/FetchNoticeIDListDTO.swift new file mode 100644 index 000000000..329c3d6c1 --- /dev/null +++ b/Projects/Domains/NoticeDomain/Sources/ResponseDTO/FetchNoticeIDListDTO.swift @@ -0,0 +1,13 @@ +import Foundation +import NoticeDomainInterface + +public struct FetchNoticeIDListDTO: Decodable { + let status: String + let data: [Int] +} + +public extension FetchNoticeIDListDTO { + func toDomain() -> FetchNoticeIDListEntity { + return FetchNoticeIDListEntity(status: status, data: data) + } +} diff --git a/Projects/Domains/NoticeDomain/Sources/ResponseDTO/FetchNoticeResponseDTO.swift b/Projects/Domains/NoticeDomain/Sources/ResponseDTO/FetchNoticeResponseDTO.swift new file mode 100644 index 000000000..36f2214f4 --- /dev/null +++ b/Projects/Domains/NoticeDomain/Sources/ResponseDTO/FetchNoticeResponseDTO.swift @@ -0,0 +1,55 @@ +import Foundation +import NoticeDomainInterface + +public struct FetchNoticeResponseDTO: Decodable, Equatable { + public let id: Int + public let category: String + public let title: String + public let content: String? + public let thumbnail: FetchNoticeResponseDTO.Image? + public let origins: [FetchNoticeResponseDTO.Image] + public let createdAt: Double + + public static func == (lhs: Self, rhs: Self) -> Bool { + return lhs.id == rhs.id + } + + enum CodingKeys: String, CodingKey { + case id, category, title + case content = "text" + case thumbnail + case origins = "images" + case createdAt + } +} + +public extension FetchNoticeResponseDTO { + struct Image: Decodable { + public let url: String? + public let link: String? + + enum CodingKeys: String, CodingKey { + case url = "imageUrl" + case link = "hyperlinkUrl" + } + } +} + +public extension FetchNoticeResponseDTO { + func toDomain() -> FetchNoticeEntity { + return FetchNoticeEntity( + id: id, + category: category, + title: title, + content: content ?? "", + thumbnail: FetchNoticeEntity.Image( + url: thumbnail?.url ?? "", + link: thumbnail?.link ?? "" + ), + origins: origins.map { + FetchNoticeEntity.Image(url: $0.url ?? "", link: $0.link ?? "") + }, + createdAt: createdAt + ) + } +} diff --git a/Projects/Domains/NoticeDomain/Sources/UseCase/FetchNoticeAllUseCaseImpl.swift b/Projects/Domains/NoticeDomain/Sources/UseCase/FetchNoticeAllUseCaseImpl.swift new file mode 100644 index 000000000..0bf745e4e --- /dev/null +++ b/Projects/Domains/NoticeDomain/Sources/UseCase/FetchNoticeAllUseCaseImpl.swift @@ -0,0 +1,17 @@ +import Foundation +import NoticeDomainInterface +import RxSwift + +public struct FetchNoticeAllUseCaseImpl: FetchNoticeAllUseCase { + private let noticeRepository: any NoticeRepository + + public init( + noticeRepository: NoticeRepository + ) { + self.noticeRepository = noticeRepository + } + + public func execute() -> Single<[FetchNoticeEntity]> { + return noticeRepository.fetchNoticeAll() + } +} diff --git a/Projects/Domains/NoticeDomain/Sources/UseCase/FetchNoticeCategoriesUseCaseImpl.swift b/Projects/Domains/NoticeDomain/Sources/UseCase/FetchNoticeCategoriesUseCaseImpl.swift new file mode 100644 index 000000000..d6b00a858 --- /dev/null +++ b/Projects/Domains/NoticeDomain/Sources/UseCase/FetchNoticeCategoriesUseCaseImpl.swift @@ -0,0 +1,17 @@ +import Foundation +import NoticeDomainInterface +import RxSwift + +public struct FetchNoticeCategoriesUseCaseImpl: FetchNoticeCategoriesUseCase { + private let noticeRepository: any NoticeRepository + + public init( + noticeRepository: NoticeRepository + ) { + self.noticeRepository = noticeRepository + } + + public func execute() -> Single { + noticeRepository.fetchNoticeCategories() + } +} diff --git a/Projects/Domains/NoticeDomain/Sources/UseCase/FetchNoticeIDListUseCaseImpl.swift b/Projects/Domains/NoticeDomain/Sources/UseCase/FetchNoticeIDListUseCaseImpl.swift new file mode 100644 index 000000000..2aed5cc38 --- /dev/null +++ b/Projects/Domains/NoticeDomain/Sources/UseCase/FetchNoticeIDListUseCaseImpl.swift @@ -0,0 +1,17 @@ +import Foundation +import NoticeDomainInterface +import RxSwift + +public struct FetchNoticeIDListUseCaseImpl: FetchNoticeIDListUseCase { + private let noticeRepository: any NoticeRepository + + public init( + noticeRepository: NoticeRepository + ) { + self.noticeRepository = noticeRepository + } + + public func execute() -> Single { + return noticeRepository.fetchNoticeIDList() + } +} diff --git a/Projects/Domains/NoticeDomain/Sources/UseCase/FetchNoticePopupUseCaseImpl.swift b/Projects/Domains/NoticeDomain/Sources/UseCase/FetchNoticePopupUseCaseImpl.swift new file mode 100644 index 000000000..2aae1fa20 --- /dev/null +++ b/Projects/Domains/NoticeDomain/Sources/UseCase/FetchNoticePopupUseCaseImpl.swift @@ -0,0 +1,17 @@ +import Foundation +import NoticeDomainInterface +import RxSwift + +public struct FetchNoticePopupUseCaseImpl: FetchNoticePopupUseCase { + private let noticeRepository: any NoticeRepository + + public init( + noticeRepository: NoticeRepository + ) { + self.noticeRepository = noticeRepository + } + + public func execute() -> Single<[FetchNoticeEntity]> { + return noticeRepository.fetchNoticePopup() + } +} diff --git a/Projects/Domains/NoticeDomain/Testing/FetchNoticeAllUseCaseStub.swift b/Projects/Domains/NoticeDomain/Testing/FetchNoticeAllUseCaseStub.swift new file mode 100644 index 000000000..80389e2f7 --- /dev/null +++ b/Projects/Domains/NoticeDomain/Testing/FetchNoticeAllUseCaseStub.swift @@ -0,0 +1,35 @@ +import Foundation +import NoticeDomainInterface +import RxSwift + +public struct FetchNoticeAllUseCaseStub: FetchNoticeAllUseCase { + public func execute() -> Single<[FetchNoticeEntity]> { + let title1 = "공지사항 두줄인 경우 공지사항 두줄인 경우 공지사항 두줄인 경우 공지사항 두줄인 경우" + let title2 = "왁타버스 뮤직 2.0 업데이트" + let content2 = + "공지사항 내용이 나옵니다.\n위아래 여백에 맞춰 답변 길이가 유동적으로 바뀝니다.\n\n자주 묻는 질문 답변이 나옵니다.\n위아래 여백에 맞춰 답변 길이가 유동적으로 바뀝니다." + let stubs = [ + FetchNoticeEntity( + id: 99992, + category: "카테고리1", + title: title1, + content: "", + thumbnail: .init(url: "", link: ""), + origins: [], + createdAt: 1 + ), + FetchNoticeEntity( + id: 99993, + category: "카테고리2", + title: title2, + content: "", + thumbnail: .init(url: "", link: ""), + origins: [], + createdAt: 2 + ) + ] + return .just(stubs) + } + + public init() {} +} diff --git a/Projects/Domains/NoticeDomain/Testing/FetchNoticeCategoriesUseCaseStub.swift b/Projects/Domains/NoticeDomain/Testing/FetchNoticeCategoriesUseCaseStub.swift new file mode 100644 index 000000000..27833b9d0 --- /dev/null +++ b/Projects/Domains/NoticeDomain/Testing/FetchNoticeCategoriesUseCaseStub.swift @@ -0,0 +1,9 @@ +import Foundation +import NoticeDomainInterface +import RxSwift + +public struct FetchNoticeCategoriesUseCaseStub: FetchNoticeCategoriesUseCase { + public func execute() -> Single { + return .just(FetchNoticeCategoriesEntity(categories: [])) + } +} diff --git a/Projects/Domains/NoticeDomain/Tests/NoticeDomainTest.swift b/Projects/Domains/NoticeDomain/Tests/NoticeDomainTest.swift new file mode 100644 index 000000000..c048beb6f --- /dev/null +++ b/Projects/Domains/NoticeDomain/Tests/NoticeDomainTest.swift @@ -0,0 +1,11 @@ +import XCTest + +final class NoticeDomainTests: XCTestCase { + override func setUpWithError() throws {} + + override func tearDownWithError() throws {} + + func testExample() { + XCTAssertEqual(1, 1) + } +} diff --git a/Projects/Domains/NotificationDomain/Interface/DataSource/RemoteNotificationDataSource.swift b/Projects/Domains/NotificationDomain/Interface/DataSource/RemoteNotificationDataSource.swift new file mode 100644 index 000000000..8b1c6224c --- /dev/null +++ b/Projects/Domains/NotificationDomain/Interface/DataSource/RemoteNotificationDataSource.swift @@ -0,0 +1,6 @@ +import Foundation +import RxSwift + +public protocol RemoteNotificationDataSource { + func updateNotificationToken(type: NotificationUpdateType) -> Completable +} diff --git a/Projects/Domains/NotificationDomain/Interface/Enum/NotificationUpdateType.swift b/Projects/Domains/NotificationDomain/Interface/Enum/NotificationUpdateType.swift new file mode 100644 index 000000000..7e2598b95 --- /dev/null +++ b/Projects/Domains/NotificationDomain/Interface/Enum/NotificationUpdateType.swift @@ -0,0 +1,6 @@ +import Foundation + +public enum NotificationUpdateType: String { + case update + case delete +} diff --git a/Projects/Domains/NotificationDomain/Interface/Repository/NotificationRepository.swift b/Projects/Domains/NotificationDomain/Interface/Repository/NotificationRepository.swift new file mode 100644 index 000000000..9f697805a --- /dev/null +++ b/Projects/Domains/NotificationDomain/Interface/Repository/NotificationRepository.swift @@ -0,0 +1,6 @@ +import Foundation +import RxSwift + +public protocol NotificationRepository { + func updateNotificationToken(type: NotificationUpdateType) -> Completable +} diff --git a/Projects/Domains/NotificationDomain/Interface/UpdateNotificationTokenUseCaseSpy.swift b/Projects/Domains/NotificationDomain/Interface/UpdateNotificationTokenUseCaseSpy.swift new file mode 100644 index 000000000..966df85b0 --- /dev/null +++ b/Projects/Domains/NotificationDomain/Interface/UpdateNotificationTokenUseCaseSpy.swift @@ -0,0 +1,13 @@ +import Foundation +import RxSwift + +public struct UpdateNotificationTokenUseCaseSpy: UpdateNotificationTokenUseCase { + public func execute(type: NotificationUpdateType) -> Completable { + Completable.create { observer in + observer(.completed) + return Disposables.create() + } + } + + public init() {} +} diff --git a/Projects/Domains/NotificationDomain/Interface/UseCase/UpdateNotificationTokenUseCase.swift b/Projects/Domains/NotificationDomain/Interface/UseCase/UpdateNotificationTokenUseCase.swift new file mode 100644 index 000000000..fd6e268a8 --- /dev/null +++ b/Projects/Domains/NotificationDomain/Interface/UseCase/UpdateNotificationTokenUseCase.swift @@ -0,0 +1,6 @@ +import Foundation +import RxSwift + +public protocol UpdateNotificationTokenUseCase { + func execute(type: NotificationUpdateType) -> Completable +} diff --git a/Projects/Domains/NotificationDomain/Project.swift b/Projects/Domains/NotificationDomain/Project.swift new file mode 100644 index 000000000..eda88e5a1 --- /dev/null +++ b/Projects/Domains/NotificationDomain/Project.swift @@ -0,0 +1,22 @@ +import DependencyPlugin +import ProjectDescription +import ProjectDescriptionHelpers + +let project = Project.module( + name: ModulePaths.Domain.NotificationDomain.rawValue, + targets: [ + .interface( + module: .domain(.NotificationDomain), + dependencies: [ + .domain(target: .BaseDomain, type: .interface) + ] + ), + .implements( + module: .domain(.NotificationDomain), + dependencies: [ + .domain(target: .BaseDomain), + .domain(target: .NotificationDomain, type: .interface) + ] + ) + ] +) diff --git a/Projects/Domains/NotificationDomain/Sources/API/NotificationAPI.swift b/Projects/Domains/NotificationDomain/Sources/API/NotificationAPI.swift new file mode 100644 index 000000000..690611f0e --- /dev/null +++ b/Projects/Domains/NotificationDomain/Sources/API/NotificationAPI.swift @@ -0,0 +1,63 @@ +import BaseDomain +import ErrorModule +import Foundation +import Moya +import NotificationDomainInterface + +public enum NotificationAPI { + case updateNotificationToken(type: NotificationUpdateType) +} + +extension NotificationAPI: WMAPI { + public var domain: WMDomain { + return .notification + } + + public var urlPath: String { + switch self { + case .updateNotificationToken: + return "/token" + } + } + + public var method: Moya.Method { + switch self { + case let .updateNotificationToken(type): + return type == .update ? .put : .delete + } + } + + public var task: Moya.Task { + switch self { + case let .updateNotificationToken(type): + return .requestPlain + } + } + + public var jwtTokenType: JwtTokenType { + switch self { + case .updateNotificationToken: + return .accessToken + } + } + + public var baseInfoTypes: [BaseInfoType] { + switch self { + case let .updateNotificationToken(type): + return type == .update ? [.deviceID, .pushToken] : [.deviceID] + } + } + + public var errorMap: [Int: WMError] { + switch self { + default: + return [ + 400: .badRequest, + 401: .tokenExpired, + 404: .notFound, + 429: .tooManyRequest, + 500: .internalServerError + ] + } + } +} diff --git a/Projects/Domains/NotificationDomain/Sources/DataSource/RemoteNotificationDataSourceImpl.swift b/Projects/Domains/NotificationDomain/Sources/DataSource/RemoteNotificationDataSourceImpl.swift new file mode 100644 index 000000000..0a2451faa --- /dev/null +++ b/Projects/Domains/NotificationDomain/Sources/DataSource/RemoteNotificationDataSourceImpl.swift @@ -0,0 +1,13 @@ +import BaseDomain +import Foundation +import NotificationDomainInterface +import RxSwift + +public final class RemoteNotificationDataSourceImpl: + BaseRemoteDataSource, + RemoteNotificationDataSource { + public func updateNotificationToken(type: NotificationUpdateType) -> Completable { + request(.updateNotificationToken(type: type)) + .asCompletable() + } +} diff --git a/Projects/Domains/NotificationDomain/Sources/Repository/NotificationRepositoryImpl.swift b/Projects/Domains/NotificationDomain/Sources/Repository/NotificationRepositoryImpl.swift new file mode 100644 index 000000000..ceb0d0669 --- /dev/null +++ b/Projects/Domains/NotificationDomain/Sources/Repository/NotificationRepositoryImpl.swift @@ -0,0 +1,16 @@ +import NotificationDomainInterface +import RxSwift + +public final class NotificationRepositoryImpl: NotificationRepository { + private let remoteNotificationDataSource: any RemoteNotificationDataSource + + public init( + remoteNotificationDataSource: RemoteNotificationDataSource + ) { + self.remoteNotificationDataSource = remoteNotificationDataSource + } + + public func updateNotificationToken(type: NotificationUpdateType) -> Completable { + remoteNotificationDataSource.updateNotificationToken(type: type) + } +} diff --git a/Projects/Domains/NotificationDomain/Sources/UseCase/UpdateNotificationTokenUseCaseImpl.swift b/Projects/Domains/NotificationDomain/Sources/UseCase/UpdateNotificationTokenUseCaseImpl.swift new file mode 100644 index 000000000..710dabcb8 --- /dev/null +++ b/Projects/Domains/NotificationDomain/Sources/UseCase/UpdateNotificationTokenUseCaseImpl.swift @@ -0,0 +1,17 @@ +import Foundation +import NotificationDomainInterface +import RxSwift + +public struct UpdateNotificationTokenUseCaseImpl: UpdateNotificationTokenUseCase { + private let notificationRepository: any NotificationRepository + + public init( + notificationRepository: NotificationRepository + ) { + self.notificationRepository = notificationRepository + } + + public func execute(type: NotificationUpdateType) -> Completable { + notificationRepository.updateNotificationToken(type: type) + } +} diff --git a/Projects/Domains/PlaylistDomain/Interface/DataSource/RemotePlaylistDataSource.swift b/Projects/Domains/PlaylistDomain/Interface/DataSource/RemotePlaylistDataSource.swift new file mode 100644 index 000000000..b4130c423 --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Interface/DataSource/RemotePlaylistDataSource.swift @@ -0,0 +1,22 @@ +import BaseDomainInterface +import Foundation +import RxSwift +import SongsDomainInterface + +public protocol RemotePlaylistDataSource { + func fetchRecommendPlaylist() -> Single<[RecommendPlaylistEntity]> + func fetchPlaylistDetail(id: String, type: PlaylistType) -> Single + func fetchWMPlaylistDetail(id: String) -> Single + func updateTitleAndPrivate(key: String, title: String?, isPrivate: Bool?) -> Completable + func createPlaylist(title: String) -> Single + func fetchPlaylistSongs(key: String) -> Single<[SongEntity]> + func updatePlaylist(key: String, songs: [String]) -> Completable + func addSongIntoPlaylist(key: String, songs: [String]) -> Single + func removeSongs(key: String, songs: [String]) -> Completable + func uploadDefaultImage(key: String, model: String) -> Completable + func subscribePlaylist(key: String, isSubscribing: Bool) -> Completable + func checkSubscription(key: String) -> Single + func requestCustomImageURL(key: String, imageSize: Int) -> Single + func uploadCustomImage(presignedURL: String, data: Data) -> Completable + func requestPlaylistOwnerID(key: String) -> Single +} diff --git a/Projects/Domains/PlaylistDomain/Interface/Entity/AddSongEntity.swift b/Projects/Domains/PlaylistDomain/Interface/Entity/AddSongEntity.swift new file mode 100644 index 000000000..c39da12f6 --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Interface/Entity/AddSongEntity.swift @@ -0,0 +1,14 @@ +import Foundation + +public struct AddSongEntity: Equatable { + public init( + addedSongCount: Int, + duplicated: Bool + ) { + self.addedSongCount = addedSongCount + self.duplicated = duplicated + } + + public let addedSongCount: Int + public let duplicated: Bool +} diff --git a/Projects/Domains/PlaylistDomain/Interface/Entity/CustomImageURLEntity.swift b/Projects/Domains/PlaylistDomain/Interface/Entity/CustomImageURLEntity.swift new file mode 100644 index 000000000..ab60213df --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Interface/Entity/CustomImageURLEntity.swift @@ -0,0 +1,8 @@ +public struct CustomImageURLEntity { + public let imageURL, presignedURL: String + + public init(imageURL: String, presignedURL: String) { + self.imageURL = imageURL + self.presignedURL = presignedURL + } +} diff --git a/Projects/Domains/PlaylistDomain/Interface/Entity/PlayListDetailEntity.swift b/Projects/Domains/PlaylistDomain/Interface/Entity/PlayListDetailEntity.swift new file mode 100644 index 000000000..8a589044a --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Interface/Entity/PlayListDetailEntity.swift @@ -0,0 +1,28 @@ +import Foundation +import SongsDomainInterface + +public struct PlaylistDetailEntity: Equatable { + public init( + key: String, + title: String, + songs: [SongEntity], + image: String, + `private`: Bool, + userId: String, + userName: String + + ) { + self.key = key + self.title = title + self.songs = songs + self.image = image + self.private = `private` + self.userId = userId + self.userName = userName + } + + public let key, title: String + public var songs: [SongEntity] + public let image, userId, userName: String + public var `private`: Bool +} diff --git a/Projects/Domains/PlaylistDomain/Interface/Entity/PlaylistBaseEntity.swift b/Projects/Domains/PlaylistDomain/Interface/Entity/PlaylistBaseEntity.swift new file mode 100644 index 000000000..dfc1c778e --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Interface/Entity/PlaylistBaseEntity.swift @@ -0,0 +1,15 @@ + + +import Foundation + +public struct PlaylistBaseEntity: Equatable { + public init( + key: String, + image: String + ) { + self.key = key + self.image = image + } + + public let key, image: String +} diff --git a/Projects/Domains/PlaylistDomain/Interface/Entity/PlaylistOwnerIDEntity.swift b/Projects/Domains/PlaylistDomain/Interface/Entity/PlaylistOwnerIDEntity.swift new file mode 100644 index 000000000..bdb18d34c --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Interface/Entity/PlaylistOwnerIDEntity.swift @@ -0,0 +1,11 @@ +import Foundation + +public struct PlaylistOwnerIDEntity { + public init( + ownerID: String + ) { + self.ownerID = ownerID + } + + public let ownerID: String +} diff --git a/Projects/Domains/PlaylistDomain/Interface/Entity/RecommendPlaylistEntity.swift b/Projects/Domains/PlaylistDomain/Interface/Entity/RecommendPlaylistEntity.swift new file mode 100644 index 000000000..7fdcb15c4 --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Interface/Entity/RecommendPlaylistEntity.swift @@ -0,0 +1,30 @@ +import Foundation + +public struct RecommendPlaylistEntity: Hashable, Equatable { + public init( + key: String, + title: String, + image: String, + `private`: Bool, + count: Int + ) { + self.key = key + self.title = title + self.image = image + self.private = `private` + self.count = count + } + + public let key, title, image: String + public let `private`: Bool + public let count: Int + private let id = UUID() + + public func hash(into hasher: inout Hasher) { + hasher.combine(id) + } + + public static func == (_ lhs: Self, _ rhs: Self) -> Bool { + lhs.id == rhs.id + } +} diff --git a/Projects/Domains/PlaylistDomain/Interface/Entity/WMPlaylistDetailEntity.swift b/Projects/Domains/PlaylistDomain/Interface/Entity/WMPlaylistDetailEntity.swift new file mode 100644 index 000000000..e435b490a --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Interface/Entity/WMPlaylistDetailEntity.swift @@ -0,0 +1,21 @@ +import Foundation +import SongsDomainInterface + +public struct WMPlaylistDetailEntity: Equatable { + public init( + key: String, + title: String, + songs: [SongEntity], + image: String, + playlistURL: String + ) { + self.key = key + self.title = title + self.songs = songs + self.image = image + self.playlistURL = playlistURL + } + + public let key, title, image, playlistURL: String + public var songs: [SongEntity] +} diff --git a/Projects/Domains/PlaylistDomain/Interface/Enum/PlaylistType.swift b/Projects/Domains/PlaylistDomain/Interface/Enum/PlaylistType.swift new file mode 100644 index 000000000..1589dfb79 --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Interface/Enum/PlaylistType.swift @@ -0,0 +1,7 @@ +import Foundation + +public enum PlaylistType { + case unknown + case wmRecommend + case my +} diff --git a/Projects/Domains/PlaylistDomain/Interface/Repository/PlaylistRepository.swift b/Projects/Domains/PlaylistDomain/Interface/Repository/PlaylistRepository.swift new file mode 100644 index 000000000..c8d0e9eea --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Interface/Repository/PlaylistRepository.swift @@ -0,0 +1,22 @@ +import BaseDomainInterface +import Foundation +import RxSwift +import SongsDomainInterface + +public protocol PlaylistRepository { + func fetchRecommendPlaylist() -> Single<[RecommendPlaylistEntity]> + func fetchPlaylistDetail(id: String, type: PlaylistType) -> Single + func fetchWMPlaylistDetail(id: String) -> Single + func updateTitleAndPrivate(key: String, title: String?, isPrivate: Bool?) -> Completable + func createPlaylist(title: String) -> Single + func fetchPlaylistSongs(key: String) -> Single<[SongEntity]> + func updatePlaylist(key: String, songs: [String]) -> Completable + func addSongIntoPlaylist(key: String, songs: [String]) -> Single + func removeSongs(key: String, songs: [String]) -> Completable + func uploadDefaultImage(key: String, model: String) -> Completable + func subscribePlaylist(key: String, isSubscribing: Bool) -> Completable + func checkSubscription(key: String) -> Single + func requestCustomImageURL(key: String, imageSize: Int) -> Single + func uploadCustomImage(presignedURL: String, data: Data) -> Completable + func requestPlaylistOwnerID(key: String) -> Single +} diff --git a/Projects/Domains/PlaylistDomain/Interface/UseCase/AddSongIntoPlaylistUseCase.swift b/Projects/Domains/PlaylistDomain/Interface/UseCase/AddSongIntoPlaylistUseCase.swift new file mode 100644 index 000000000..ef690e71c --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Interface/UseCase/AddSongIntoPlaylistUseCase.swift @@ -0,0 +1,6 @@ +import Foundation +import RxSwift + +public protocol AddSongIntoPlaylistUseCase { + func execute(key: String, songs: [String]) -> Single +} diff --git a/Projects/Domains/PlaylistDomain/Interface/UseCase/CheckSubscriptionUseCase.swift b/Projects/Domains/PlaylistDomain/Interface/UseCase/CheckSubscriptionUseCase.swift new file mode 100644 index 000000000..8a0c9bc3a --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Interface/UseCase/CheckSubscriptionUseCase.swift @@ -0,0 +1,7 @@ +import BaseDomainInterface +import Foundation +import RxSwift + +public protocol CheckSubscriptionUseCase { + func execute(key: String) -> Single +} diff --git a/Projects/Domains/PlaylistDomain/Interface/UseCase/CreatePlaylistUseCase.swift b/Projects/Domains/PlaylistDomain/Interface/UseCase/CreatePlaylistUseCase.swift new file mode 100644 index 000000000..b7b6f146a --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Interface/UseCase/CreatePlaylistUseCase.swift @@ -0,0 +1,6 @@ +import Foundation +import RxSwift + +public protocol CreatePlaylistUseCase { + func execute(title: String) -> Single +} diff --git a/Projects/Domains/PlaylistDomain/Interface/UseCase/FetchPlaylistDetailUseCase.swift b/Projects/Domains/PlaylistDomain/Interface/UseCase/FetchPlaylistDetailUseCase.swift new file mode 100644 index 000000000..eb15b13a8 --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Interface/UseCase/FetchPlaylistDetailUseCase.swift @@ -0,0 +1,6 @@ +import Foundation +import RxSwift + +public protocol FetchPlaylistDetailUseCase { + func execute(id: String, type: PlaylistType) -> Single +} diff --git a/Projects/Domains/PlaylistDomain/Interface/UseCase/FetchPlaylistSongsUseCase.swift b/Projects/Domains/PlaylistDomain/Interface/UseCase/FetchPlaylistSongsUseCase.swift new file mode 100644 index 000000000..fc32cc722 --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Interface/UseCase/FetchPlaylistSongsUseCase.swift @@ -0,0 +1,8 @@ +import BaseDomainInterface +import Foundation +import RxSwift +import SongsDomainInterface + +public protocol FetchPlaylistSongsUseCase { + func execute(key: String) -> Single<[SongEntity]> +} diff --git a/Projects/Domains/PlaylistDomain/Interface/UseCase/FetchRecommendPlaylistUseCase.swift b/Projects/Domains/PlaylistDomain/Interface/UseCase/FetchRecommendPlaylistUseCase.swift new file mode 100644 index 000000000..292d15ae9 --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Interface/UseCase/FetchRecommendPlaylistUseCase.swift @@ -0,0 +1,6 @@ +import Foundation +import RxSwift + +public protocol FetchRecommendPlaylistUseCase { + func execute() -> Single<[RecommendPlaylistEntity]> +} diff --git a/Projects/Domains/PlaylistDomain/Interface/UseCase/FetchWMPlaylistDetailUseCase.swift b/Projects/Domains/PlaylistDomain/Interface/UseCase/FetchWMPlaylistDetailUseCase.swift new file mode 100644 index 000000000..4f3a3ad50 --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Interface/UseCase/FetchWMPlaylistDetailUseCase.swift @@ -0,0 +1,6 @@ +import Foundation +import RxSwift + +public protocol FetchWMPlaylistDetailUseCase { + func execute(id: String) -> Single +} diff --git a/Projects/Domains/PlaylistDomain/Interface/UseCase/RemoveSongsUseCase.swift b/Projects/Domains/PlaylistDomain/Interface/UseCase/RemoveSongsUseCase.swift new file mode 100644 index 000000000..43d13f61b --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Interface/UseCase/RemoveSongsUseCase.swift @@ -0,0 +1,7 @@ +import BaseDomainInterface +import Foundation +import RxSwift + +public protocol RemoveSongsUseCase { + func execute(key: String, songs: [String]) -> Completable +} diff --git a/Projects/Domains/PlaylistDomain/Interface/UseCase/RequestCustomImageURLUseCase.swift b/Projects/Domains/PlaylistDomain/Interface/UseCase/RequestCustomImageURLUseCase.swift new file mode 100644 index 000000000..df1db7d84 --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Interface/UseCase/RequestCustomImageURLUseCase.swift @@ -0,0 +1,7 @@ +import BaseDomainInterface +import Foundation +import RxSwift + +public protocol RequestCustomImageURLUseCase { + func execute(key: String, data: Data) -> Completable +} diff --git a/Projects/Domains/PlaylistDomain/Interface/UseCase/RequestPlaylistOwnerIDUsecase.swift b/Projects/Domains/PlaylistDomain/Interface/UseCase/RequestPlaylistOwnerIDUsecase.swift new file mode 100644 index 000000000..2226011db --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Interface/UseCase/RequestPlaylistOwnerIDUsecase.swift @@ -0,0 +1,7 @@ +import BaseDomainInterface +import Foundation +import RxSwift + +public protocol RequestPlaylistOwnerIDUsecase { + func execute(key: String) -> Single +} diff --git a/Projects/Domains/PlaylistDomain/Interface/UseCase/SubscribePlaylistUseCase.swift b/Projects/Domains/PlaylistDomain/Interface/UseCase/SubscribePlaylistUseCase.swift new file mode 100644 index 000000000..3e3707c0e --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Interface/UseCase/SubscribePlaylistUseCase.swift @@ -0,0 +1,5 @@ +import RxSwift + +public protocol SubscribePlaylistUseCase { + func execute(key: String, isSubscribing: Bool) -> Completable +} diff --git a/Projects/Domains/PlaylistDomain/Interface/UseCase/UpdatePlaylistUseCase.swift b/Projects/Domains/PlaylistDomain/Interface/UseCase/UpdatePlaylistUseCase.swift new file mode 100644 index 000000000..043199681 --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Interface/UseCase/UpdatePlaylistUseCase.swift @@ -0,0 +1,7 @@ +import BaseDomainInterface +import Foundation +import RxSwift + +public protocol UpdatePlaylistUseCase { + func execute(key: String, songs: [String]) -> Completable +} diff --git a/Projects/Domains/PlaylistDomain/Interface/UseCase/UpdateTitleAndPrivateUseCase.swift b/Projects/Domains/PlaylistDomain/Interface/UseCase/UpdateTitleAndPrivateUseCase.swift new file mode 100644 index 000000000..d86527627 --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Interface/UseCase/UpdateTitleAndPrivateUseCase.swift @@ -0,0 +1,7 @@ +import BaseDomainInterface +import Foundation +import RxSwift + +public protocol UpdateTitleAndPrivateUseCase { + func execute(key: String, title: String?, isPrivate: Bool?) -> Completable +} diff --git a/Projects/Domains/PlaylistDomain/Interface/UseCase/UploadPlaylistImageUseCase.swift b/Projects/Domains/PlaylistDomain/Interface/UseCase/UploadPlaylistImageUseCase.swift new file mode 100644 index 000000000..afead3e3b --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Interface/UseCase/UploadPlaylistImageUseCase.swift @@ -0,0 +1,7 @@ +import BaseDomainInterface +import Foundation +import RxSwift + +public protocol UploadDefaultPlaylistImageUseCase { + func execute(key: String, model: String) -> Completable +} diff --git a/Projects/Domains/PlaylistDomain/Project.swift b/Projects/Domains/PlaylistDomain/Project.swift new file mode 100644 index 000000000..bedd03195 --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Project.swift @@ -0,0 +1,31 @@ +import DependencyPlugin +import ProjectDescription +import ProjectDescriptionHelpers + +let project = Project.module( + name: ModulePaths.Domain.PlaylistDomain.rawValue, + targets: [ + .interface( + module: .domain(.PlaylistDomain), + dependencies: [ + .domain(target: .BaseDomain, type: .interface), + .domain(target: .SongsDomain, type: .interface) + ] + ), + .implements( + module: .domain(.PlaylistDomain), + dependencies: [ + .domain(target: .BaseDomain), + .domain(target: .SongsDomain), + .domain(target: .PlaylistDomain, type: .interface) + ] + ), + .tests( + module: .domain(.PlaylistDomain), + dependencies: [.domain(target: .PlaylistDomain)] + ), + .testing(module: .domain(.PlaylistDomain), dependencies: [ + .domain(target: .PlaylistDomain, type: .interface) + ]) + ] +) diff --git a/Projects/Domains/PlaylistDomain/Sources/API/CustomPlaylistImageAPI.swift b/Projects/Domains/PlaylistDomain/Sources/API/CustomPlaylistImageAPI.swift new file mode 100644 index 000000000..7ce234005 --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Sources/API/CustomPlaylistImageAPI.swift @@ -0,0 +1,43 @@ +import Foundation +import Moya + +enum CustomPlaylistImageAPI { + case uploadCustomImage(url: String, data: Data) +} + +extension CustomPlaylistImageAPI: TargetType { + var baseURL: URL { + switch self { + case let .uploadCustomImage(url, _): + return URL(string: url)! + } + } + + var path: String { + return "" + } + + var method: Moya.Method { + return .put + } + + // var sampleData: Data { ... } + + var task: Task { + switch self { + case let .uploadCustomImage(url: _, data): + return .requestData(data) + } + } + + var headers: [String: String]? { + switch self { + case let .uploadCustomImage(url: _, data): + return ["Content-Type": "image/jpeg", " Contnet-Length": "\(data.count)"] + } + } + + var validationType: ValidationType { + return .successCodes + } +} diff --git a/Projects/Domains/PlaylistDomain/Sources/API/PlaylistAPI.swift b/Projects/Domains/PlaylistDomain/Sources/API/PlaylistAPI.swift new file mode 100644 index 000000000..9262992a1 --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Sources/API/PlaylistAPI.swift @@ -0,0 +1,154 @@ +import BaseDomain +import BaseDomainInterface +import ErrorModule +import Foundation +import KeychainModule +import Moya +import PlaylistDomainInterface + +public enum PlaylistAPI { + case fetchPlaylistDetail(id: String, type: PlaylistType) // 플리 상세 불러오기 + case fetchWMPlaylistDetail(id: String) // 왁뮤 플리 상세 불러오기 + case updateTitleAndPrivate(key: String, title: String?, isPrivate: Bool?) // title and private 업데이트 + case createPlaylist(title: String) // 플리 생성 + case fetchPlaylistSongs(key: String) // 전체 재생 시 곡 데이터만 가져오기 + case addSongIntoPlaylist(key: String, songs: [String]) // 곡 추가 + case updatePlaylist(key: String, songs: [String]) // 최종 저장 + case removeSongs(key: String, songs: [String]) // 곡 삭제 + case uploadDefaultImage(key: String, imageName: String) // 플레이리스트 default 이미지 업로드 + case requestCustomImageURL(key: String, imageSize: Int) // 커스텀 이미지를 저장할 presigned url 받아오기 + case subscribePlaylist(key: String, isSubscribing: Bool) // 플레이리스트 구독하기 / 구독 취소하기 + case checkSubscription(key: String) + case fetchRecommendPlaylist // 추천 플리 불러오기 + case requestPlaylistOwnerID(key: String) // playlist ownerId 요청하기 +} + +extension PlaylistAPI: WMAPI { + public var domain: WMDomain { + return .playlist + } + + public var urlPath: String { + switch self { + case .fetchRecommendPlaylist: + return "/recommend/list" + + case let .fetchPlaylistDetail(id: id, type: type): + return "/\(id)" + + case let .fetchWMPlaylistDetail(id: id): + return "/recommend/\(id)" + + case let .updateTitleAndPrivate(key: key, _, _): + return "/\(key)" + + case .createPlaylist: + return "/create" + + case let .fetchPlaylistSongs(key: key), let .addSongIntoPlaylist(key: key, _), let .updatePlaylist(key: key, _), + let .removeSongs(key: key, _): + return "/\(key)/songs" + + case let .uploadDefaultImage(key: key, _): + return "/\(key)/image" + + case let .requestCustomImageURL(key, _): + return "/\(key)/image/upload" + + case let .subscribePlaylist(key, _), let .checkSubscription(key): + return "/\(key)/subscription" + case let .requestPlaylistOwnerID(key): + return "/\(key)/owner" + } + } + + public var method: Moya.Method { + switch self { + case .fetchRecommendPlaylist, .fetchPlaylistDetail, .fetchWMPlaylistDetail, .fetchPlaylistSongs, + .checkSubscription, + .requestPlaylistOwnerID: + return .get + + case .createPlaylist, .addSongIntoPlaylist, .requestCustomImageURL: + return .post + + case let .subscribePlaylist(_, isSubscribing): + return isSubscribing ? .delete : .post + + case .removeSongs: + return .delete + + case .updatePlaylist, .updateTitleAndPrivate, .uploadDefaultImage: + return .patch + } + } + + public var task: Moya.Task { + switch self { + case .fetchRecommendPlaylist, .fetchPlaylistDetail, .fetchWMPlaylistDetail, .fetchPlaylistSongs, + .subscribePlaylist, .checkSubscription, + .requestPlaylistOwnerID: + return .requestPlain + + case let .updateTitleAndPrivate(_, title: title, isPrivate: isPrivate): + return .requestJSONEncodable(TitleAndPrivateRequsetDTO(title: title, private: isPrivate)) + + case let .createPlaylist(title: title): + return .requestJSONEncodable(CreatePlaylistRequsetDTO(title: title)) + + case let .addSongIntoPlaylist(_, songs: songs): + return .requestJSONEncodable(AddSongRequestDTO(songIds: songs)) + + case let .updatePlaylist(_, songs: songs): + return .requestJSONEncodable(SongsKeyRequestDTO(songIds: songs)) + + case let .removeSongs(_, songs: songs): + return .requestParameters( + parameters: ["songIds": songs.joined(separator: ",")], + encoding: URLEncoding.queryString + ) + + case let .uploadDefaultImage(_, imageName): + return .requestJSONEncodable(DefaultImageRequestDTO(imageName: imageName)) + + case let .requestCustomImageURL(key, imageSize): + return .requestParameters( + parameters: ["key": key, "contentLength": imageSize], + encoding: URLEncoding.queryString + ) + } + } + + public var headers: [String: String]? { + return ["Content-Type": "application/json"] + } + + public var jwtTokenType: JwtTokenType { + switch self { + case .fetchRecommendPlaylist, .fetchWMPlaylistDetail: + return .none + + case let .fetchPlaylistDetail(_, type): + return type == .my ? .accessToken : .none + + case .createPlaylist, .fetchPlaylistSongs, .updatePlaylist, .addSongIntoPlaylist, .requestCustomImageURL, + .removeSongs, .updateTitleAndPrivate, .uploadDefaultImage, .subscribePlaylist, + .checkSubscription, .requestPlaylistOwnerID: + return .accessToken + } + } + + public var errorMap: [Int: WMError] { + switch self { + default: + return [ + 400: .badRequest, + 401: .tokenExpired, + 404: .notFound, + 409: .conflict, + 429: .tooManyRequest, + 500: .internalServerError + ] + } + } +} diff --git a/Projects/Domains/PlaylistDomain/Sources/DataSource/RemotePlaylistDataSourceImpl.swift b/Projects/Domains/PlaylistDomain/Sources/DataSource/RemotePlaylistDataSourceImpl.swift new file mode 100644 index 000000000..b53b551a4 --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Sources/DataSource/RemotePlaylistDataSourceImpl.swift @@ -0,0 +1,97 @@ +import BaseDomain +import BaseDomainInterface +import Foundation +import Moya +import PlaylistDomainInterface +import RxSwift +import SongsDomain +import SongsDomainInterface + +public final class RemotePlaylistDataSourceImpl: BaseRemoteDataSource, RemotePlaylistDataSource { + private let provider = MoyaProvider() + + public func fetchRecommendPlaylist() -> Single<[RecommendPlaylistEntity]> { + request(.fetchRecommendPlaylist) + .map([SingleRecommendPlayListResponseDTO].self) + .map { $0.map { $0.toDomain() }} + } + + public func fetchPlaylistDetail(id: String, type: PlaylistType) -> Single { + request(.fetchPlaylistDetail(id: id, type: type)) + .map(SinglePlayListDetailResponseDTO.self) + .map { $0.toDomain() } + } + + public func fetchWMPlaylistDetail(id: String) -> Single { + request(.fetchWMPlaylistDetail(id: id)) + .map(WMPlaylistDetailResponseDTO.self) + .map { $0.toDomain() } + } + + public func updateTitleAndPrivate(key: String, title: String?, isPrivate: Bool?) -> Completable { + request(.updateTitleAndPrivate(key: key, title: title, isPrivate: isPrivate)) + .asCompletable() + } + + public func createPlaylist(title: String) -> Single { + request(.createPlaylist(title: title)) + .map(PlayListBaseResponseDTO.self) + .map { $0.toDomain() } + } + + public func fetchPlaylistSongs(key: String) -> Single<[SongEntity]> { + request(.fetchPlaylistSongs(key: key)) + .map([SingleSongResponseDTO].self) + .map { $0.map { $0.toDomain() } } + } + + public func updatePlaylist(key: String, songs: [String]) -> Completable { + request(.updatePlaylist(key: key, songs: songs)) + .asCompletable() + } + + public func addSongIntoPlaylist(key: String, songs: [String]) -> Single { + request(.addSongIntoPlaylist(key: key, songs: songs)) + .map(AddSongResponseDTO.self) + .map { $0.toDomain() } + } + + public func removeSongs(key: String, songs: [String]) -> Completable { + request(.removeSongs(key: key, songs: songs)) + .asCompletable() + } + + public func uploadDefaultImage(key: String, model: String) -> Completable { + request(.uploadDefaultImage(key: key, imageName: model)) + .asCompletable() + } + + public func subscribePlaylist(key: String, isSubscribing: Bool) -> Completable { + request(.subscribePlaylist(key: key, isSubscribing: isSubscribing)) + .asCompletable() + } + + public func checkSubscription(key: String) -> Single { + request(.checkSubscription(key: key)) + .map(CheckSubscriptionResponseDTO.self) + .map { $0.data } + } + + public func requestCustomImageURL(key: String, imageSize: Int) -> Single { + request(.requestCustomImageURL(key: key, imageSize: imageSize)) + .map(CustomImageURLResponseDTO.self) + .map { $0.toDomain() } + } + + public func uploadCustomImage(presignedURL: String, data: Data) -> Completable { + return provider.rx + .request(CustomPlaylistImageAPI.uploadCustomImage(url: presignedURL, data: data)) + .asCompletable() + } + + public func requestPlaylistOwnerID(key: String) -> Single { + return request(.requestPlaylistOwnerID(key: key)) + .map(PlaylistOwnerIDResponseDTO.self) + .map { $0.toDomain() } + } +} diff --git a/Projects/Domains/PlaylistDomain/Sources/Repository/PlaylistRepositoryImpl.swift b/Projects/Domains/PlaylistDomain/Sources/Repository/PlaylistRepositoryImpl.swift new file mode 100644 index 000000000..fd21dbf66 --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Sources/Repository/PlaylistRepositoryImpl.swift @@ -0,0 +1,75 @@ +import BaseDomainInterface +import Foundation +import PlaylistDomainInterface +import RxSwift +import SongsDomainInterface + +public final class PlaylistRepositoryImpl: PlaylistRepository { + private let remotePlaylistDataSource: any RemotePlaylistDataSource + + public init( + remotePlaylistDataSource: RemotePlaylistDataSource + ) { + self.remotePlaylistDataSource = remotePlaylistDataSource + } + + public func fetchRecommendPlaylist() -> Single<[RecommendPlaylistEntity]> { + remotePlaylistDataSource.fetchRecommendPlaylist() + } + + public func fetchPlaylistDetail(id: String, type: PlaylistType) -> Single { + remotePlaylistDataSource.fetchPlaylistDetail(id: id, type: type) + } + + public func fetchWMPlaylistDetail(id: String) -> Single { + remotePlaylistDataSource.fetchWMPlaylistDetail(id: id) + } + + public func updateTitleAndPrivate(key: String, title: String?, isPrivate: Bool?) -> Completable { + remotePlaylistDataSource.updateTitleAndPrivate(key: key, title: title, isPrivate: isPrivate) + } + + public func createPlaylist(title: String) -> Single { + remotePlaylistDataSource.createPlaylist(title: title) + } + + public func fetchPlaylistSongs(key: String) -> Single<[SongEntity]> { + remotePlaylistDataSource.fetchPlaylistSongs(key: key) + } + + public func updatePlaylist(key: String, songs: [String]) -> Completable { + return remotePlaylistDataSource.updatePlaylist(key: key, songs: songs) + } + + public func addSongIntoPlaylist(key: String, songs: [String]) -> Single { + remotePlaylistDataSource.addSongIntoPlaylist(key: key, songs: songs) + } + + public func removeSongs(key: String, songs: [String]) -> Completable { + remotePlaylistDataSource.removeSongs(key: key, songs: songs) + } + + public func uploadDefaultImage(key: String, model: String) -> Completable { + remotePlaylistDataSource.uploadDefaultImage(key: key, model: model) + } + + public func subscribePlaylist(key: String, isSubscribing: Bool) -> Completable { + remotePlaylistDataSource.subscribePlaylist(key: key, isSubscribing: isSubscribing) + } + + public func checkSubscription(key: String) -> Single { + remotePlaylistDataSource.checkSubscription(key: key) + } + + public func requestCustomImageURL(key: String, imageSize: Int) -> Single { + remotePlaylistDataSource.requestCustomImageURL(key: key, imageSize: imageSize) + } + + public func uploadCustomImage(presignedURL: String, data: Data) -> Completable { + remotePlaylistDataSource.uploadCustomImage(presignedURL: presignedURL, data: data) + } + + public func requestPlaylistOwnerID(key: String) -> Single { + remotePlaylistDataSource.requestPlaylistOwnerID(key: key) + } +} diff --git a/Projects/Domains/PlaylistDomain/Sources/RequestDTO/AddSongRequestDTO.swift b/Projects/Domains/PlaylistDomain/Sources/RequestDTO/AddSongRequestDTO.swift new file mode 100644 index 000000000..9e0e9f05b --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Sources/RequestDTO/AddSongRequestDTO.swift @@ -0,0 +1,5 @@ +import Foundation + +public struct AddSongRequestDTO: Encodable { + var songIds: [String] +} diff --git a/Projects/Domains/PlaylistDomain/Sources/RequestDTO/CreatePlaylistRequsetDTO.swift b/Projects/Domains/PlaylistDomain/Sources/RequestDTO/CreatePlaylistRequsetDTO.swift new file mode 100644 index 000000000..5543dce81 --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Sources/RequestDTO/CreatePlaylistRequsetDTO.swift @@ -0,0 +1,5 @@ +import Foundation + +public struct CreatePlaylistRequsetDTO: Encodable { + let title: String +} diff --git a/Projects/Domains/PlaylistDomain/Sources/RequestDTO/DefaultImageRequestDTO.swift b/Projects/Domains/PlaylistDomain/Sources/RequestDTO/DefaultImageRequestDTO.swift new file mode 100644 index 000000000..026c2b111 --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Sources/RequestDTO/DefaultImageRequestDTO.swift @@ -0,0 +1,5 @@ +import Foundation + +struct DefaultImageRequestDTO: Encodable { + let imageName: String +} diff --git a/Projects/Domains/PlaylistDomain/Sources/RequestDTO/SongsKeyRequestDTO.swift b/Projects/Domains/PlaylistDomain/Sources/RequestDTO/SongsKeyRequestDTO.swift new file mode 100644 index 000000000..e92db1573 --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Sources/RequestDTO/SongsKeyRequestDTO.swift @@ -0,0 +1,5 @@ +import Foundation + +public struct SongsKeyRequestDTO: Encodable { + var songIds: [String] +} diff --git a/Projects/Domains/PlaylistDomain/Sources/RequestDTO/TitleAndPrivateRequsetDTO.swift b/Projects/Domains/PlaylistDomain/Sources/RequestDTO/TitleAndPrivateRequsetDTO.swift new file mode 100644 index 000000000..aa4429b46 --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Sources/RequestDTO/TitleAndPrivateRequsetDTO.swift @@ -0,0 +1,6 @@ +import Foundation + +public struct TitleAndPrivateRequsetDTO: Encodable { + var title: String? + var `private`: Bool? +} diff --git a/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/AddSongResponseDTO.swift b/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/AddSongResponseDTO.swift new file mode 100644 index 000000000..588e77d0a --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/AddSongResponseDTO.swift @@ -0,0 +1,16 @@ +import Foundation +import PlaylistDomainInterface + +public struct AddSongResponseDTO: Decodable { + public let addedSongCount: Int + public let isDuplicatedSongsExist: Bool +} + +public extension AddSongResponseDTO { + func toDomain() -> AddSongEntity { + AddSongEntity( + addedSongCount: addedSongCount, + duplicated: isDuplicatedSongsExist + ) + } +} diff --git a/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/CheckSubscriptionResponseDTO.swift b/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/CheckSubscriptionResponseDTO.swift new file mode 100644 index 000000000..9f6dc8e38 --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/CheckSubscriptionResponseDTO.swift @@ -0,0 +1,6 @@ +import Foundation +import PlaylistDomainInterface + +public struct CheckSubscriptionResponseDTO: Decodable { + public let data: Bool +} diff --git a/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/CustomImageURLResponseDTO.swift b/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/CustomImageURLResponseDTO.swift new file mode 100644 index 000000000..291e413b2 --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/CustomImageURLResponseDTO.swift @@ -0,0 +1,17 @@ +import Foundation +import PlaylistDomainInterface + +public struct CustomImageURLResponseDTO: Decodable { + public let imageURL, presignedURL: String + + enum CodingKeys: String, CodingKey { + case imageURL = "imageUrl" + case presignedURL = "presignedUrl" + } +} + +public extension CustomImageURLResponseDTO { + func toDomain() -> CustomImageURLEntity { + CustomImageURLEntity(imageURL: imageURL, presignedURL: presignedURL) + } +} diff --git a/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/PlayListBaseResponseDTO.swift b/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/PlayListBaseResponseDTO.swift new file mode 100644 index 000000000..b5669226c --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/PlayListBaseResponseDTO.swift @@ -0,0 +1,12 @@ +import Foundation +import PlaylistDomainInterface + +public struct PlayListBaseResponseDTO: Decodable { + public let key, imageUrl: String +} + +public extension PlayListBaseResponseDTO { + func toDomain() -> PlaylistBaseEntity { + PlaylistBaseEntity(key: key, image: imageUrl) + } +} diff --git a/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/PlayListDetailResponseDTO.swift b/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/PlayListDetailResponseDTO.swift new file mode 100644 index 000000000..5d3cc6bbd --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/PlayListDetailResponseDTO.swift @@ -0,0 +1,35 @@ +import Foundation +import PlaylistDomainInterface +import SongsDomain +import SongsDomainInterface +import Utility + +public struct SinglePlayListDetailResponseDTO: Decodable { + public let key: String? + public let title: String + public let songs: [SingleSongResponseDTO]? + public let imageUrl: String + public let `private`: Bool + public let user: SinglePlayListDetailResponseDTO.UserResponseDTO +} + +public extension SinglePlayListDetailResponseDTO { + struct UserResponseDTO: Decodable { + public let handle: String + public let name: String + } +} + +public extension SinglePlayListDetailResponseDTO { + func toDomain() -> PlaylistDetailEntity { + PlaylistDetailEntity( + key: key ?? "", + title: title, + songs: (songs ?? []).map { $0.toDomain() }, + image: imageUrl, + private: `private`, + userId: user.handle, + userName: user.name + ) + } +} diff --git a/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/PlaylistOwnerIdResponseDTO.swift b/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/PlaylistOwnerIdResponseDTO.swift new file mode 100644 index 000000000..3264417bd --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/PlaylistOwnerIdResponseDTO.swift @@ -0,0 +1,16 @@ +import Foundation +import PlaylistDomainInterface + +public struct PlaylistOwnerIDResponseDTO: Decodable { + public let ownerID: String + + enum CodingKeys: String, CodingKey { + case ownerID = "handle" + } +} + +public extension PlaylistOwnerIDResponseDTO { + func toDomain() -> PlaylistOwnerIDEntity { + PlaylistOwnerIDEntity(ownerID: ownerID) + } +} diff --git a/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/RecommendPlayListResponseDTO.swift b/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/RecommendPlayListResponseDTO.swift new file mode 100644 index 000000000..fa51ef443 --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/RecommendPlayListResponseDTO.swift @@ -0,0 +1,20 @@ +import Foundation +import PlaylistDomainInterface + +public struct SingleRecommendPlayListResponseDTO: Decodable { + public let key, title, imageUrl: String + public let `private`: Bool + public let songCount: Int +} + +public extension SingleRecommendPlayListResponseDTO { + func toDomain() -> RecommendPlaylistEntity { + RecommendPlaylistEntity( + key: key, + title: title, + image: imageUrl, + private: `private`, + count: songCount + ) + } +} diff --git a/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/WmPlaylistDetailResponseDTO.swift b/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/WmPlaylistDetailResponseDTO.swift new file mode 100644 index 000000000..8a81ac91b --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/WmPlaylistDetailResponseDTO.swift @@ -0,0 +1,32 @@ +import Foundation +import PlaylistDomainInterface +import SongsDomain +import SongsDomainInterface + +public struct WMPlaylistDetailResponseDTO: Decodable { + public let key: String? + public let title: String + public let songs: [SingleSongResponseDTO]? + public let imageURL: String + public let playlistURL: String + + enum CodingKeys: String, CodingKey { + case key + case title + case songs + case imageURL = "imageUrl" + case playlistURL = "playlistUrl" + } +} + +public extension WMPlaylistDetailResponseDTO { + func toDomain() -> WMPlaylistDetailEntity { + WMPlaylistDetailEntity( + key: key ?? "", + title: title, + songs: (songs ?? []).map { $0.toDomain() }, + image: imageURL, + playlistURL: playlistURL + ) + } +} diff --git a/Projects/Domains/PlaylistDomain/Sources/UseCase/AddSongIntoPlaylistUseCaseImpl.swift b/Projects/Domains/PlaylistDomain/Sources/UseCase/AddSongIntoPlaylistUseCaseImpl.swift new file mode 100644 index 000000000..456c25785 --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Sources/UseCase/AddSongIntoPlaylistUseCaseImpl.swift @@ -0,0 +1,17 @@ +import Foundation +import PlaylistDomainInterface +import RxSwift + +public struct AddSongIntoPlaylistUseCaseImpl: AddSongIntoPlaylistUseCase { + private let playlistRepository: any PlaylistRepository + + public init( + playlistRepository: PlaylistRepository + ) { + self.playlistRepository = playlistRepository + } + + public func execute(key: String, songs: [String]) -> Single { + playlistRepository.addSongIntoPlaylist(key: key, songs: songs) + } +} diff --git a/Projects/Domains/PlaylistDomain/Sources/UseCase/CheckSubscriptionUseCaseImpl.swift b/Projects/Domains/PlaylistDomain/Sources/UseCase/CheckSubscriptionUseCaseImpl.swift new file mode 100644 index 000000000..1f4d7ba93 --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Sources/UseCase/CheckSubscriptionUseCaseImpl.swift @@ -0,0 +1,18 @@ +import BaseDomainInterface +import Foundation +import PlaylistDomainInterface +import RxSwift + +public struct CheckSubscriptionUseCaseImpl: CheckSubscriptionUseCase { + private let playlistRepository: any PlaylistRepository + + public init( + playlistRepository: PlaylistRepository + ) { + self.playlistRepository = playlistRepository + } + + public func execute(key: String) -> Single { + playlistRepository.checkSubscription(key: key) + } +} diff --git a/Projects/Domains/PlaylistDomain/Sources/UseCase/CreatePlaylistUseCaseImpl.swift b/Projects/Domains/PlaylistDomain/Sources/UseCase/CreatePlaylistUseCaseImpl.swift new file mode 100644 index 000000000..efa087843 --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Sources/UseCase/CreatePlaylistUseCaseImpl.swift @@ -0,0 +1,25 @@ +// +// FetchArtistListUseCaseImpl.swift +// DataModule +// +// Created by KTH on 2023/02/08. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import Foundation +import PlaylistDomainInterface +import RxSwift + +public struct CreatePlaylistUseCaseImpl: CreatePlaylistUseCase { + private let playlistRepository: any PlaylistRepository + + public init( + playlistRepository: PlaylistRepository + ) { + self.playlistRepository = playlistRepository + } + + public func execute(title: String) -> Single { + playlistRepository.createPlaylist(title: title) + } +} diff --git a/Projects/Domains/PlaylistDomain/Sources/UseCase/FetchPlaylistDetailUseCaseImpl.swift b/Projects/Domains/PlaylistDomain/Sources/UseCase/FetchPlaylistDetailUseCaseImpl.swift new file mode 100644 index 000000000..cc84d35e5 --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Sources/UseCase/FetchPlaylistDetailUseCaseImpl.swift @@ -0,0 +1,17 @@ +import Foundation +import PlaylistDomainInterface +import RxSwift + +public struct FetchPlaylistDetailUseCaseImpl: FetchPlaylistDetailUseCase { + private let playlistRepository: any PlaylistRepository + + public init( + playlistRepository: PlaylistRepository + ) { + self.playlistRepository = playlistRepository + } + + public func execute(id: String, type: PlaylistType) -> Single { + playlistRepository.fetchPlaylistDetail(id: id, type: type) + } +} diff --git a/Projects/Domains/PlaylistDomain/Sources/UseCase/FetchPlaylistSongsUseCaseImpl.swift b/Projects/Domains/PlaylistDomain/Sources/UseCase/FetchPlaylistSongsUseCaseImpl.swift new file mode 100644 index 000000000..e451600d3 --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Sources/UseCase/FetchPlaylistSongsUseCaseImpl.swift @@ -0,0 +1,19 @@ +import BaseDomainInterface +import Foundation +import PlaylistDomainInterface +import RxSwift +import SongsDomainInterface + +public struct FetchPlaylistSongsUseCaseImpl: FetchPlaylistSongsUseCase { + private let playlistRepository: any PlaylistRepository + + public init( + playlistRepository: PlaylistRepository + ) { + self.playlistRepository = playlistRepository + } + + public func execute(key: String) -> Single<[SongEntity]> { + return playlistRepository.fetchPlaylistSongs(key: key) + } +} diff --git a/Projects/Domains/PlaylistDomain/Sources/UseCase/FetchRecommendPlaylistUseCaseImpl.swift b/Projects/Domains/PlaylistDomain/Sources/UseCase/FetchRecommendPlaylistUseCaseImpl.swift new file mode 100644 index 000000000..f6813e325 --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Sources/UseCase/FetchRecommendPlaylistUseCaseImpl.swift @@ -0,0 +1,25 @@ +// +// FetchArtistListUseCaseImpl.swift +// DataModule +// +// Created by KTH on 2023/02/08. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import Foundation +import PlaylistDomainInterface +import RxSwift + +public struct FetchRecommendPlaylistUseCaseImpl: FetchRecommendPlaylistUseCase { + private let playlistRepository: any PlaylistRepository + + public init( + playlistRepository: PlaylistRepository + ) { + self.playlistRepository = playlistRepository + } + + public func execute() -> Single<[RecommendPlaylistEntity]> { + playlistRepository.fetchRecommendPlaylist() + } +} diff --git a/Projects/Domains/PlaylistDomain/Sources/UseCase/FetchWMPlaylistDetailUseCaseImpl.swift b/Projects/Domains/PlaylistDomain/Sources/UseCase/FetchWMPlaylistDetailUseCaseImpl.swift new file mode 100644 index 000000000..419decf16 --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Sources/UseCase/FetchWMPlaylistDetailUseCaseImpl.swift @@ -0,0 +1,17 @@ +import Foundation +import PlaylistDomainInterface +import RxSwift + +public struct FetchWMPlaylistDetailUseCaseImpl: FetchWMPlaylistDetailUseCase { + private let playlistRepository: any PlaylistRepository + + public init( + playlistRepository: PlaylistRepository + ) { + self.playlistRepository = playlistRepository + } + + public func execute(id: String) -> Single { + playlistRepository.fetchWMPlaylistDetail(id: id) + } +} diff --git a/Projects/Domains/PlaylistDomain/Sources/UseCase/RemoveSongsUseCaseImpl.swift b/Projects/Domains/PlaylistDomain/Sources/UseCase/RemoveSongsUseCaseImpl.swift new file mode 100644 index 000000000..42c82a755 --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Sources/UseCase/RemoveSongsUseCaseImpl.swift @@ -0,0 +1,26 @@ +// +// FetchArtistListUseCaseImpl.swift +// DataModule +// +// Created by KTH on 2023/02/08. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import BaseDomainInterface +import Foundation +import PlaylistDomainInterface +import RxSwift + +public struct RemoveSongsUseCaseImpl: RemoveSongsUseCase { + private let playlistRepository: any PlaylistRepository + + public init( + playlistRepository: PlaylistRepository + ) { + self.playlistRepository = playlistRepository + } + + public func execute(key: String, songs: [String]) -> Completable { + return playlistRepository.removeSongs(key: key, songs: songs) + } +} diff --git a/Projects/Domains/PlaylistDomain/Sources/UseCase/RequestCustomImageURLUseCaseImpl.swift b/Projects/Domains/PlaylistDomain/Sources/UseCase/RequestCustomImageURLUseCaseImpl.swift new file mode 100644 index 000000000..ee97655bd --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Sources/UseCase/RequestCustomImageURLUseCaseImpl.swift @@ -0,0 +1,22 @@ +import BaseDomainInterface +import Foundation +import PlaylistDomainInterface +import RxSwift + +public struct RequestCustomImageURLUseCaseImpl: RequestCustomImageURLUseCase { + private let playlistRepository: any PlaylistRepository + + public init( + playlistRepository: PlaylistRepository + ) { + self.playlistRepository = playlistRepository + } + + public func execute(key: String, data: Data) -> Completable { + let imageSize = data.count + return playlistRepository.requestCustomImageURL(key: key, imageSize: imageSize) + .flatMapCompletable { entity in + return playlistRepository.uploadCustomImage(presignedURL: entity.presignedURL, data: data) + } + } +} diff --git a/Projects/Domains/PlaylistDomain/Sources/UseCase/RequestPlaylistOwnerIDUsecaseImpl.swift b/Projects/Domains/PlaylistDomain/Sources/UseCase/RequestPlaylistOwnerIDUsecaseImpl.swift new file mode 100644 index 000000000..c6e77f025 --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Sources/UseCase/RequestPlaylistOwnerIDUsecaseImpl.swift @@ -0,0 +1,18 @@ +import BaseDomainInterface +import Foundation +import PlaylistDomainInterface +import RxSwift + +public struct RequestPlaylistOwnerIDUsecaseImpl: RequestPlaylistOwnerIDUsecase { + private let playlistRepository: any PlaylistRepository + + public init( + playlistRepository: PlaylistRepository + ) { + self.playlistRepository = playlistRepository + } + + public func execute(key: String) -> Single { + playlistRepository.requestPlaylistOwnerID(key: key) + } +} diff --git a/Projects/Domains/PlaylistDomain/Sources/UseCase/SubscribePlaylistUseCaseImpl.swift b/Projects/Domains/PlaylistDomain/Sources/UseCase/SubscribePlaylistUseCaseImpl.swift new file mode 100644 index 000000000..c30c98c82 --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Sources/UseCase/SubscribePlaylistUseCaseImpl.swift @@ -0,0 +1,18 @@ +import BaseDomainInterface +import Foundation +import PlaylistDomainInterface +import RxSwift + +public struct SubscribePlaylistUseCaseImpl: SubscribePlaylistUseCase { + private let playlistRepository: any PlaylistRepository + + public init( + playlistRepository: PlaylistRepository + ) { + self.playlistRepository = playlistRepository + } + + public func execute(key: String, isSubscribing: Bool) -> Completable { + playlistRepository.subscribePlaylist(key: key, isSubscribing: isSubscribing) + } +} diff --git a/Projects/Domains/PlaylistDomain/Sources/UseCase/UpdatePlaylistUseCaseImpl.swift b/Projects/Domains/PlaylistDomain/Sources/UseCase/UpdatePlaylistUseCaseImpl.swift new file mode 100644 index 000000000..87bd09b11 --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Sources/UseCase/UpdatePlaylistUseCaseImpl.swift @@ -0,0 +1,18 @@ +import BaseDomainInterface +import Foundation +import PlaylistDomainInterface +import RxSwift + +public struct UpdatePlaylistUseCaseImpl: UpdatePlaylistUseCase { + private let playlistRepository: any PlaylistRepository + + public init( + playlistRepository: PlaylistRepository + ) { + self.playlistRepository = playlistRepository + } + + public func execute(key: String, songs: [String]) -> Completable { + return playlistRepository.updatePlaylist(key: key, songs: songs) + } +} diff --git a/Projects/Domains/PlaylistDomain/Sources/UseCase/UpdatePrivatAndTitleeUseCaseImpl.swift b/Projects/Domains/PlaylistDomain/Sources/UseCase/UpdatePrivatAndTitleeUseCaseImpl.swift new file mode 100644 index 000000000..3f225377b --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Sources/UseCase/UpdatePrivatAndTitleeUseCaseImpl.swift @@ -0,0 +1,18 @@ +import BaseDomainInterface +import Foundation +import PlaylistDomainInterface +import RxSwift + +public struct UpdateTitleAndPrivateUseCaseImpl: UpdateTitleAndPrivateUseCase { + private let playlistRepository: any PlaylistRepository + + public init( + playlistRepository: PlaylistRepository + ) { + self.playlistRepository = playlistRepository + } + + public func execute(key: String, title: String?, isPrivate: Bool?) -> Completable { + playlistRepository.updateTitleAndPrivate(key: key, title: title, isPrivate: isPrivate) + } +} diff --git a/Projects/Domains/PlaylistDomain/Sources/UseCase/UploadDefaultPlaylistImageUseCaseImpl.swift b/Projects/Domains/PlaylistDomain/Sources/UseCase/UploadDefaultPlaylistImageUseCaseImpl.swift new file mode 100644 index 000000000..88e9682a2 --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Sources/UseCase/UploadDefaultPlaylistImageUseCaseImpl.swift @@ -0,0 +1,18 @@ +import BaseDomainInterface +import Foundation +import PlaylistDomainInterface +import RxSwift + +public struct UploadDefaultPlaylistImageUseCaseImpl: UploadDefaultPlaylistImageUseCase { + private let playlistRepository: any PlaylistRepository + + public init( + playlistRepository: PlaylistRepository + ) { + self.playlistRepository = playlistRepository + } + + public func execute(key: String, model: String) -> Completable { + playlistRepository.uploadDefaultImage(key: key, model: model) + } +} diff --git a/Projects/Domains/PlaylistDomain/Testing/FetchPlayListUseCaseStub.swift b/Projects/Domains/PlaylistDomain/Testing/FetchPlayListUseCaseStub.swift new file mode 100644 index 000000000..f8a0dffa8 --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Testing/FetchPlayListUseCaseStub.swift @@ -0,0 +1,141 @@ +import PlaylistDomainInterface +import RxSwift + +final class FetchPlayListUseCaseStub: FetchRecommendPlaylistUseCase { + var fetchData = [ + RecommendPlaylistEntity( + key: "best", + title: "베스트", + image: "https://cdn.wakmusic.xyz/playlist/best_1.png", + private: false, + count: 0 + ), + RecommendPlaylistEntity( + key: "carol", + title: "캐롤", + image: "https://cdn.wakmusic.xyz/playlist/carol_1.png", + private: false, + count: 0 + ), + RecommendPlaylistEntity( + key: "competition", + title: "경쟁", + image: "https://cdn.wakmusic.xyz/playlist/competition_1.png", + private: false, + count: 0 + ), + RecommendPlaylistEntity( + key: "best", + title: "베스트", + image: "https://cdn.wakmusic.xyz/playlist/best_1.png", + private: false, + count: 0 + ), + RecommendPlaylistEntity( + key: "carol", + title: "캐롤", + image: "https://cdn.wakmusic.xyz/playlist/carol_1.png", + private: false, + count: 0 + ), + RecommendPlaylistEntity( + key: "competition", + title: "경쟁", + image: "https://cdn.wakmusic.xyz/playlist/competition_1.png", + private: false, + count: 0 + ), + RecommendPlaylistEntity( + key: "best", + title: "베스트", + image: "https://cdn.wakmusic.xyz/playlist/best_1.png", + private: false, + count: 0 + ), + RecommendPlaylistEntity( + key: "carol", + title: "캐롤", + image: "https://cdn.wakmusic.xyz/playlist/carol_1.png", + private: false, + count: 0 + ), + RecommendPlaylistEntity( + key: "competition", + title: "경쟁", + image: "https://cdn.wakmusic.xyz/playlist/competition_1.png", + private: false, + count: 0 + ), + RecommendPlaylistEntity( + key: "best", + title: "베스트", + image: "https://cdn.wakmusic.xyz/playlist/best_1.png", + private: false, + count: 0 + ), + RecommendPlaylistEntity( + key: "carol", + title: "캐롤", + image: "https://cdn.wakmusic.xyz/playlist/carol_1.png", + private: false, + count: 0 + ), + RecommendPlaylistEntity( + key: "competition", + title: "경쟁", + image: "https://cdn.wakmusic.xyz/playlist/competition_1.png", + private: false, + count: 0 + ), + RecommendPlaylistEntity( + key: "best", + title: "베스트", + image: "https://cdn.wakmusic.xyz/playlist/best_1.png", + private: false, + count: 0 + ), + RecommendPlaylistEntity( + key: "carol", + title: "캐롤", + image: "https://cdn.wakmusic.xyz/playlist/carol_1.png", + private: false, + count: 0 + ), + RecommendPlaylistEntity( + key: "competition", + title: "경쟁", + image: "https://cdn.wakmusic.xyz/playlist/competition_1.png", + private: false, + count: 0 + ), + RecommendPlaylistEntity( + key: "best", + title: "베스트", + image: "https://cdn.wakmusic.xyz/playlist/best_1.png", + private: false, + count: 0 + ), + RecommendPlaylistEntity( + key: "carol", + title: "캐롤", + image: "https://cdn.wakmusic.xyz/playlist/carol_1.png", + private: false, + count: 0 + ), + RecommendPlaylistEntity( + key: "competition", + title: "경쟁", + image: "https://cdn.wakmusic.xyz/playlist/competition_1.png", + private: false, + count: 0 + ) + ] + + func execute() -> Single<[RecommendPlaylistEntity]> { + return Single.create { [fetchData] single in + + single(.success(fetchData)) + return Disposables.create() + } + } +} diff --git a/Projects/Domains/PlaylistDomain/Tests/PlayListDomainTest.swift b/Projects/Domains/PlaylistDomain/Tests/PlayListDomainTest.swift new file mode 100644 index 000000000..190c52104 --- /dev/null +++ b/Projects/Domains/PlaylistDomain/Tests/PlayListDomainTest.swift @@ -0,0 +1,11 @@ +import XCTest + +final class PlaylistDomainTests: XCTestCase { + override func setUpWithError() throws {} + + override func tearDownWithError() throws {} + + func testExample() { + XCTAssertEqual(1, 1) + } +} diff --git a/Projects/Domains/PriceDomain/Interface/DataSource/RemotePriceDataSource.swift b/Projects/Domains/PriceDomain/Interface/DataSource/RemotePriceDataSource.swift new file mode 100644 index 000000000..c938b5170 --- /dev/null +++ b/Projects/Domains/PriceDomain/Interface/DataSource/RemotePriceDataSource.swift @@ -0,0 +1,7 @@ +import Foundation +import RxSwift + +public protocol RemotePriceDataSource { + func fetchPlaylistCreationPrice() -> Single + func fetchPlaylistImagePrice() -> Single +} diff --git a/Projects/Domains/PriceDomain/Interface/Entity/PriceEntity.swift b/Projects/Domains/PriceDomain/Interface/Entity/PriceEntity.swift new file mode 100644 index 000000000..e09872399 --- /dev/null +++ b/Projects/Domains/PriceDomain/Interface/Entity/PriceEntity.swift @@ -0,0 +1,9 @@ +import Foundation + +public struct PriceEntity { + public let price: Int + + public init(price: Int) { + self.price = price + } +} diff --git a/Projects/Domains/PriceDomain/Interface/Repository/PriceRepository.swift b/Projects/Domains/PriceDomain/Interface/Repository/PriceRepository.swift new file mode 100644 index 000000000..455ccaf04 --- /dev/null +++ b/Projects/Domains/PriceDomain/Interface/Repository/PriceRepository.swift @@ -0,0 +1,7 @@ +import Foundation +import RxSwift + +public protocol PriceRepository { + func fetchPlaylistCreationPrice() -> Single + func fetchPlaylistImagePrice() -> Single +} diff --git a/Projects/Domains/PriceDomain/Interface/UseCase/FetchPlaylistCreationPriceUseCase.swift b/Projects/Domains/PriceDomain/Interface/UseCase/FetchPlaylistCreationPriceUseCase.swift new file mode 100644 index 000000000..3a8d94c30 --- /dev/null +++ b/Projects/Domains/PriceDomain/Interface/UseCase/FetchPlaylistCreationPriceUseCase.swift @@ -0,0 +1,6 @@ +import Foundation +import RxSwift + +public protocol FetchPlaylistCreationPriceUseCase { + func execute() -> Single +} diff --git a/Projects/Domains/PriceDomain/Interface/UseCase/FetchPlaylistImagePriceUseCase.swift b/Projects/Domains/PriceDomain/Interface/UseCase/FetchPlaylistImagePriceUseCase.swift new file mode 100644 index 000000000..5fe52649a --- /dev/null +++ b/Projects/Domains/PriceDomain/Interface/UseCase/FetchPlaylistImagePriceUseCase.swift @@ -0,0 +1,6 @@ +import Foundation +import RxSwift + +public protocol FetchPlaylistImagePriceUseCase { + func execute() -> Single +} diff --git a/Projects/Domains/PriceDomain/Project.swift b/Projects/Domains/PriceDomain/Project.swift new file mode 100644 index 000000000..e4a4ee5c4 --- /dev/null +++ b/Projects/Domains/PriceDomain/Project.swift @@ -0,0 +1,16 @@ +import DependencyPlugin +import ProjectDescription +import ProjectDescriptionHelpers + +let project = Project.module( + name: ModulePaths.Domain.PriceDomain.rawValue, + targets: [ + .interface(module: .domain(.PriceDomain), dependencies: [ + .domain(target: .BaseDomain, type: .interface) + ]), + .implements(module: .domain(.PriceDomain), dependencies: [ + .domain(target: .PriceDomain, type: .interface), + .domain(target: .BaseDomain) + ]) + ] +) diff --git a/Projects/Domains/PriceDomain/Sources/DataSource/RemotePriceDataSourceImpl.swift b/Projects/Domains/PriceDomain/Sources/DataSource/RemotePriceDataSourceImpl.swift new file mode 100644 index 000000000..e0fdfe640 --- /dev/null +++ b/Projects/Domains/PriceDomain/Sources/DataSource/RemotePriceDataSourceImpl.swift @@ -0,0 +1,18 @@ +import BaseDomain +import Foundation +import PriceDomainInterface +import RxSwift + +public final class RemotePriceDataSourceImpl: BaseRemoteDataSource, RemotePriceDataSource { + public func fetchPlaylistCreationPrice() -> Single { + request(.fetchPlaylistCreationPrice) + .map(PriceResponseDTO.self) + .map { $0.toDomain() } + } + + public func fetchPlaylistImagePrice() -> Single { + request(.fetchPlaylistImagePrice) + .map(PriceResponseDTO.self) + .map { $0.toDomain() } + } +} diff --git a/Projects/Domains/PriceDomain/Sources/PriceAPI.swift b/Projects/Domains/PriceDomain/Sources/PriceAPI.swift new file mode 100644 index 000000000..62640b661 --- /dev/null +++ b/Projects/Domains/PriceDomain/Sources/PriceAPI.swift @@ -0,0 +1,50 @@ +import BaseDomain +import ErrorModule +import Foundation +import Moya +import TeamDomainInterface + +public enum PriceAPI { + case fetchPlaylistCreationPrice + case fetchPlaylistImagePrice +} + +extension PriceAPI: WMAPI { + public var domain: WMDomain { + return .price + } + + public var urlPath: String { + switch self { + case .fetchPlaylistCreationPrice: + return "/playlist/create" + case .fetchPlaylistImagePrice: + return "/playlist/custom-image" + } + } + + public var method: Moya.Method { + return .get + } + + public var task: Moya.Task { + return .requestPlain + } + + public var jwtTokenType: JwtTokenType { + return .none + } + + public var errorMap: [Int: WMError] { + switch self { + default: + return [ + 400: .badRequest, + 401: .tokenExpired, + 404: .notFound, + 429: .tooManyRequest, + 500: .internalServerError + ] + } + } +} diff --git a/Projects/Domains/PriceDomain/Sources/Repository/PriceRepositoryImpl.swift b/Projects/Domains/PriceDomain/Sources/Repository/PriceRepositoryImpl.swift new file mode 100644 index 000000000..14c2268b3 --- /dev/null +++ b/Projects/Domains/PriceDomain/Sources/Repository/PriceRepositoryImpl.swift @@ -0,0 +1,21 @@ +import Foundation +import PriceDomainInterface +import RxSwift + +public final class PriceRepositoryImpl: PriceRepository { + private let remotePriceDataSource: any RemotePriceDataSource + + public init( + remotePriceDataSource: any RemotePriceDataSource + ) { + self.remotePriceDataSource = remotePriceDataSource + } + + public func fetchPlaylistCreationPrice() -> Single { + remotePriceDataSource.fetchPlaylistCreationPrice() + } + + public func fetchPlaylistImagePrice() -> Single { + remotePriceDataSource.fetchPlaylistImagePrice() + } +} diff --git a/Projects/Domains/PriceDomain/Sources/ResponseDTO/PriceResponseDTO.swift b/Projects/Domains/PriceDomain/Sources/ResponseDTO/PriceResponseDTO.swift new file mode 100644 index 000000000..715ff03fa --- /dev/null +++ b/Projects/Domains/PriceDomain/Sources/ResponseDTO/PriceResponseDTO.swift @@ -0,0 +1,20 @@ +import Foundation +import PriceDomainInterface + +struct PriceResponseDTO: Decodable { + let price: Int + + public init(price: Int) { + self.price = price + } + + enum CodingKeys: String, CodingKey { + case price = "data" + } +} + +extension PriceResponseDTO { + func toDomain() -> PriceEntity { + return PriceEntity(price: price) + } +} diff --git a/Projects/Domains/PriceDomain/Sources/UseCase/FetchPlaylistCreationPriceUseCaseImpl.swift b/Projects/Domains/PriceDomain/Sources/UseCase/FetchPlaylistCreationPriceUseCaseImpl.swift new file mode 100644 index 000000000..ad332d494 --- /dev/null +++ b/Projects/Domains/PriceDomain/Sources/UseCase/FetchPlaylistCreationPriceUseCaseImpl.swift @@ -0,0 +1,17 @@ +import Foundation +import PriceDomainInterface +import RxSwift + +public struct FetchPlaylistCreationPriceUseCaseImpl: FetchPlaylistCreationPriceUseCase { + private let priceRepository: any PriceRepository + + public init( + priceRepository: PriceRepository + ) { + self.priceRepository = priceRepository + } + + public func execute() -> Single { + priceRepository.fetchPlaylistCreationPrice() + } +} diff --git a/Projects/Domains/PriceDomain/Sources/UseCase/FetchPlaylistImagePriceUseCaseImpl.swift b/Projects/Domains/PriceDomain/Sources/UseCase/FetchPlaylistImagePriceUseCaseImpl.swift new file mode 100644 index 000000000..155e89857 --- /dev/null +++ b/Projects/Domains/PriceDomain/Sources/UseCase/FetchPlaylistImagePriceUseCaseImpl.swift @@ -0,0 +1,17 @@ +import Foundation +import PriceDomainInterface +import RxSwift + +public struct FetchPlaylistImagePriceUseCaseImpl: FetchPlaylistImagePriceUseCase { + private let priceRepository: any PriceRepository + + public init( + priceRepository: PriceRepository + ) { + self.priceRepository = priceRepository + } + + public func execute() -> Single { + priceRepository.fetchPlaylistImagePrice() + } +} diff --git a/Projects/Domains/SearchDomain/Interface/DataSource/RemoteSearchDataSource.swift b/Projects/Domains/SearchDomain/Interface/DataSource/RemoteSearchDataSource.swift new file mode 100644 index 000000000..23b1c6237 --- /dev/null +++ b/Projects/Domains/SearchDomain/Interface/DataSource/RemoteSearchDataSource.swift @@ -0,0 +1,10 @@ +import BaseDomainInterface +import Foundation +import RxSwift +import SongsDomainInterface + +public protocol RemoteSearchDataSource { + func fetchSearchSongs(order: SortType, filter: FilterType, text: String, page: Int, limit: Int) + -> Single<[SongEntity]> + func fetchSearchPlaylist(order: SortType, text: String, page: Int, limit: Int) -> Single<[SearchPlaylistEntity]> +} diff --git a/Projects/Domains/SearchDomain/Interface/Entity/SearchPlaylistEntity.swift b/Projects/Domains/SearchDomain/Interface/Entity/SearchPlaylistEntity.swift new file mode 100644 index 000000000..978a95464 --- /dev/null +++ b/Projects/Domains/SearchDomain/Interface/Entity/SearchPlaylistEntity.swift @@ -0,0 +1,39 @@ +import Foundation + +public struct SearchPlaylistEntity: Hashable, Equatable { + public init( + key: String, + title: String, + ownerID: String, + userName: String, + image: String, + date: String, + count: Int, + subscribeCount: Int, + isPrivate: Bool + + ) { + self.key = key + self.title = title + self.ownerID = ownerID + self.userName = userName + self.image = image + self.date = date + self.count = count + self.subscribeCount = subscribeCount + + self.isPrivate = isPrivate + } + + public let key, title, ownerID, image, date, userName: String + public let count, subscribeCount: Int + public let isPrivate: Bool + + public func hash(into hasher: inout Hasher) { + hasher.combine(key) + } + + public static func == (lhs: Self, rhs: Self) -> Bool { + return lhs.key == rhs.key + } +} diff --git a/Projects/Domains/SearchDomain/Interface/Enum/Option.swift b/Projects/Domains/SearchDomain/Interface/Enum/Option.swift new file mode 100644 index 000000000..bee7fa6ea --- /dev/null +++ b/Projects/Domains/SearchDomain/Interface/Enum/Option.swift @@ -0,0 +1,43 @@ +public protocol SearchOptionType { + var title: String { get } +} + +public enum FilterType: String, Encodable, SearchOptionType { + case all + case title + case artist + case credit + + public var title: String { + switch self { + case .all: + "전체" + case .title: + "제목" + case .artist: + "아티스트" + case .credit: + "크레딧" + } + } +} + +public enum SortType: String, Encodable, SearchOptionType { + case latest + case oldest + case relevance + case popular + + public var title: String { + switch self { + case .latest: + "최신순" + case .oldest: + "과거순" + case .relevance: + "관련도순" + case .popular: + "인기순" + } + } +} diff --git a/Projects/Domains/SearchDomain/Interface/Repository/SearchRepository.swift b/Projects/Domains/SearchDomain/Interface/Repository/SearchRepository.swift new file mode 100644 index 000000000..9f14eef76 --- /dev/null +++ b/Projects/Domains/SearchDomain/Interface/Repository/SearchRepository.swift @@ -0,0 +1,10 @@ +import BaseDomainInterface +import Foundation +import RxSwift +import SongsDomainInterface + +public protocol SearchRepository { + func fetchSearchSongs(order: SortType, filter: FilterType, text: String, page: Int, limit: Int) + -> Single<[SongEntity]> + func fetchSearchPlaylist(order: SortType, text: String, page: Int, limit: Int) -> Single<[SearchPlaylistEntity]> +} diff --git a/Projects/Domains/SearchDomain/Interface/UseCase/FetchSearchPlaylistsUseCase.swift b/Projects/Domains/SearchDomain/Interface/UseCase/FetchSearchPlaylistsUseCase.swift new file mode 100644 index 000000000..f943f8108 --- /dev/null +++ b/Projects/Domains/SearchDomain/Interface/UseCase/FetchSearchPlaylistsUseCase.swift @@ -0,0 +1,7 @@ +import Foundation +import PlaylistDomainInterface +import RxSwift + +public protocol FetchSearchPlaylistsUseCase { + func execute(order: SortType, text: String, page: Int, limit: Int) -> Single<[SearchPlaylistEntity]> +} diff --git a/Projects/Domains/SearchDomain/Interface/UseCase/FetchSearchSongsUseCase.swift b/Projects/Domains/SearchDomain/Interface/UseCase/FetchSearchSongsUseCase.swift new file mode 100644 index 000000000..3fb83c108 --- /dev/null +++ b/Projects/Domains/SearchDomain/Interface/UseCase/FetchSearchSongsUseCase.swift @@ -0,0 +1,7 @@ +import Foundation +import RxSwift +import SongsDomainInterface + +public protocol FetchSearchSongsUseCase { + func execute(order: SortType, filter: FilterType, text: String, page: Int, limit: Int) -> Single<[SongEntity]> +} diff --git a/Projects/Domains/SearchDomain/Project.swift b/Projects/Domains/SearchDomain/Project.swift new file mode 100644 index 000000000..389848a1c --- /dev/null +++ b/Projects/Domains/SearchDomain/Project.swift @@ -0,0 +1,18 @@ +import DependencyPlugin +import ProjectDescription +import ProjectDescriptionHelpers + +let project = Project.module( + name: ModulePaths.Domain.SearchDomain.rawValue, + targets: [ + .interface(module: .domain(.SearchDomain), dependencies: [ + .domain(target: .PlaylistDomain, type: .interface), + .domain(target: .BaseDomain, type: .interface) + ]), + .implements(module: .domain(.SearchDomain), dependencies: [ + .domain(target: .PlaylistDomain), + .domain(target: .SearchDomain, type: .interface), + .domain(target: .BaseDomain) + ]) + ] +) diff --git a/Projects/Domains/SearchDomain/Sources/API/SearchAPI.swift b/Projects/Domains/SearchDomain/Sources/API/SearchAPI.swift new file mode 100644 index 000000000..9d94a65af --- /dev/null +++ b/Projects/Domains/SearchDomain/Sources/API/SearchAPI.swift @@ -0,0 +1,85 @@ +import BaseDomain +import BaseDomainInterface +import ErrorModule +import Foundation +import KeychainModule +import Moya +import PlaylistDomainInterface +import SearchDomainInterface +import SongsDomainInterface + +public enum SearchAPI { + case fetchPlaylists(order: SortType, text: String, page: Int, limit: Int) + case fetchSongs(order: SortType, filter: FilterType, text: String, page: Int, limit: Int) +} + +extension SearchAPI: WMAPI { + public var domain: WMDomain { + .search + } + + public var urlPath: String { + switch self { + case .fetchPlaylists: + return "/playlists" + case .fetchSongs: + return "/songs" + } + } + + public var method: Moya.Method { + return .get + } + + public var task: Moya.Task { + switch self { + case let .fetchPlaylists(order: order, text: text, page: page, limit: limit): + return .requestParameters( + parameters: [ + "order": order.rawValue, + "query": text, + "page": page, + "limit": limit + ], + encoding: URLEncoding.queryString + ) + + case let .fetchSongs(order: order, filter: filter, text: text, page: page, limit: limit): + return .requestParameters( + parameters: [ + "order": order.rawValue, + "filter": filter.rawValue, + "query": text, + "page": page, + "limit": limit + ], + encoding: URLEncoding.queryString + ) + } + } + + public var headers: [String: String]? { + switch self { + default: + return ["Content-Type": "application/json"] + } + } + + public var jwtTokenType: JwtTokenType { + return .none + } + + public var errorMap: [Int: WMError] { + switch self { + default: + return [ + 400: .badRequest, + 401: .tokenExpired, + 404: .notFound, + 409: .conflict, + 429: .tooManyRequest, + 500: .internalServerError + ] + } + } +} diff --git a/Projects/Domains/SearchDomain/Sources/DTO/SearchPlaylistDTO.swift b/Projects/Domains/SearchDomain/Sources/DTO/SearchPlaylistDTO.swift new file mode 100644 index 000000000..846611ab1 --- /dev/null +++ b/Projects/Domains/SearchDomain/Sources/DTO/SearchPlaylistDTO.swift @@ -0,0 +1,52 @@ +import Foundation +import SearchDomainInterface +import Utility + +public struct SearchPlaylistDTO: Decodable { + public init( + key: String, + title: String, + user: User, + imageUrl: String, + songCount: Int, + subscribeCount: Int, + createdAt: Double, + `private`: Bool + ) { + self.key = key + self.title = title + self.user = user + self.imageUrl = imageUrl + self.songCount = songCount + self.subscribeCount = subscribeCount + self.createdAt = createdAt + self.private = `private` + } + + public struct User: Decodable { + let handle: String + let name: String + } + + public let key, title, imageUrl: String + public let user: User + public let `private`: Bool + public let songCount, subscribeCount: Int + public let createdAt: Double +} + +public extension SearchPlaylistDTO { + func toDomain() -> SearchPlaylistEntity { + SearchPlaylistEntity( + key: key, + title: title, + ownerID: user.handle, + userName: user.name, + image: imageUrl, + date: (createdAt / 1000.0).unixTimeToDate.dateToString(format: "yyyy.MM.dd"), + count: songCount, + subscribeCount: subscribeCount, + isPrivate: self.`private` + ) + } +} diff --git a/Projects/Domains/SearchDomain/Sources/DataSource/RemoteSearchDataSourceImpl.swift b/Projects/Domains/SearchDomain/Sources/DataSource/RemoteSearchDataSourceImpl.swift new file mode 100644 index 000000000..9ae65bea1 --- /dev/null +++ b/Projects/Domains/SearchDomain/Sources/DataSource/RemoteSearchDataSourceImpl.swift @@ -0,0 +1,31 @@ +import BaseDomain +import BaseDomainInterface +import RxSwift +import SearchDomainInterface +import SongsDomain +import SongsDomainInterface + +public final class RemoteSearchDataSourceImpl: BaseRemoteDataSource, RemoteSearchDataSource { + public func fetchSearchSongs( + order: SortType, + filter: FilterType, + text: String, + page: Int, + limit: Int + ) -> Single<[SongEntity]> { + return request(.fetchSongs(order: order, filter: filter, text: text, page: page, limit: limit)) + .map([SingleSongResponseDTO].self) + .map { $0.map { $0.toDomain() }} + } + + public func fetchSearchPlaylist( + order: SortType, + text: String, + page: Int, + limit: Int + ) -> Single<[SearchPlaylistEntity]> { + return request(.fetchPlaylists(order: order, text: text, page: page, limit: limit)) + .map([SearchPlaylistDTO].self) + .map { $0.map { $0.toDomain() }} + } +} diff --git a/Projects/Domains/SearchDomain/Sources/Repository/SearchRepositoryImpl.swift b/Projects/Domains/SearchDomain/Sources/Repository/SearchRepositoryImpl.swift new file mode 100644 index 000000000..c953c675b --- /dev/null +++ b/Projects/Domains/SearchDomain/Sources/Repository/SearchRepositoryImpl.swift @@ -0,0 +1,36 @@ +import RxSwift +import SearchDomainInterface +import SongsDomainInterface + +public final class SearchRepositoryImpl: SearchRepository { + private let remoteSearchDataSource: any RemoteSearchDataSource + + public init(remoteSearchDataSource: any RemoteSearchDataSource) { + self.remoteSearchDataSource = remoteSearchDataSource + } + + public func fetchSearchSongs( + order: SortType, + filter: FilterType, + text: String, + page: Int, + limit: Int + ) -> Single<[SongEntity]> { + return remoteSearchDataSource.fetchSearchSongs( + order: order, + filter: filter, + text: text, + page: page, + limit: limit + ) + } + + public func fetchSearchPlaylist( + order: SortType, + text: String, + page: Int, + limit: Int + ) -> Single<[SearchPlaylistEntity]> { + return remoteSearchDataSource.fetchSearchPlaylist(order: order, text: text, page: page, limit: limit) + } +} diff --git a/Projects/Domains/SearchDomain/Sources/UseCase/FetchSearchPlaylistsUseCaseImpl.swift b/Projects/Domains/SearchDomain/Sources/UseCase/FetchSearchPlaylistsUseCaseImpl.swift new file mode 100644 index 000000000..ae4f9e1ac --- /dev/null +++ b/Projects/Domains/SearchDomain/Sources/UseCase/FetchSearchPlaylistsUseCaseImpl.swift @@ -0,0 +1,17 @@ +import RxSwift +import SearchDomainInterface +import SongsDomainInterface + +public struct FetchSearchPlaylistsUseCaseImpl: FetchSearchPlaylistsUseCase { + private let searchRepository: any SearchRepository + + public init( + searchRepository: SearchRepository + ) { + self.searchRepository = searchRepository + } + + public func execute(order: SortType, text: String, page: Int, limit: Int) -> Single<[SearchPlaylistEntity]> { + return searchRepository.fetchSearchPlaylist(order: order, text: text, page: page, limit: limit) + } +} diff --git a/Projects/Domains/SearchDomain/Sources/UseCase/FetchSearchSongsUseCaseImpl.swift b/Projects/Domains/SearchDomain/Sources/UseCase/FetchSearchSongsUseCaseImpl.swift new file mode 100644 index 000000000..b8de6c23a --- /dev/null +++ b/Projects/Domains/SearchDomain/Sources/UseCase/FetchSearchSongsUseCaseImpl.swift @@ -0,0 +1,23 @@ +import RxSwift +import SearchDomainInterface +import SongsDomainInterface + +public struct FetchSearchSongsUseCaseImpl: FetchSearchSongsUseCase { + private let searchRepository: any SearchRepository + + public init( + searchRepository: SearchRepository + ) { + self.searchRepository = searchRepository + } + + public func execute( + order: SortType, + filter: FilterType, + text: String, + page: Int, + limit: Int + ) -> Single<[SongEntity]> { + return searchRepository.fetchSearchSongs(order: order, filter: filter, text: text, page: page, limit: limit) + } +} diff --git a/Projects/Domains/SongsDomain/Interface/DataSource/RemoteSongsDataSource.swift b/Projects/Domains/SongsDomain/Interface/DataSource/RemoteSongsDataSource.swift new file mode 100644 index 000000000..a71466d11 --- /dev/null +++ b/Projects/Domains/SongsDomain/Interface/DataSource/RemoteSongsDataSource.swift @@ -0,0 +1,10 @@ +import Foundation +import RxSwift + +public protocol RemoteSongsDataSource { + func fetchSong(id: String) -> Single + func fetchLyrics(id: String) -> Single + func fetchSongCredits(id: String) -> Single<[SongCreditsEntity]> + func fetchNewSongs(type: NewSongGroupType, page: Int, limit: Int) -> Single<[NewSongsEntity]> + func fetchNewSongsPlaylist(type: NewSongGroupType) -> Single +} diff --git a/Projects/Domains/SongsDomain/Interface/Entity/LyricsEntity.swift b/Projects/Domains/SongsDomain/Interface/Entity/LyricsEntity.swift new file mode 100644 index 000000000..be46c9ac9 --- /dev/null +++ b/Projects/Domains/SongsDomain/Interface/Entity/LyricsEntity.swift @@ -0,0 +1,27 @@ +import Foundation + +public struct LyricsEntity { + public init( + provider: String, + lyrics: [LyricsEntity.Lyric] + ) { + self.provider = provider + self.lyrics = lyrics + } + + public let provider: String + public let lyrics: [LyricsEntity.Lyric] +} + +public extension LyricsEntity { + struct Lyric { + public init( + text: String + ) { + self.text = text + } + + public let text: String + public var isHighlighting: Bool = false + } +} diff --git a/Projects/Domains/SongsDomain/Interface/Entity/NewSongsEntity.swift b/Projects/Domains/SongsDomain/Interface/Entity/NewSongsEntity.swift new file mode 100644 index 000000000..ca4e501c3 --- /dev/null +++ b/Projects/Domains/SongsDomain/Interface/Entity/NewSongsEntity.swift @@ -0,0 +1,54 @@ +// +// NewSongsEntity.swift +// DomainModule +// +// Created by KTH on 2023/11/15. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import Foundation + +public struct NewSongsEntity: Equatable { + public init( + id: String, + title: String, + artist: String, + views: Int, + date: String, + isSelected: Bool = false, + karaokeNumber: NewSongsEntity.KaraokeNumber = .init(TJ: nil, KY: nil) + ) { + self.id = id + self.title = title + self.artist = artist + self.views = views + self.date = date + self.isSelected = isSelected + self.karaokeNumber = karaokeNumber + } + + public let id, title, artist: String + public let views: Int + public let date: String + public var isSelected: Bool + public let karaokeNumber: NewSongsEntity.KaraokeNumber + + public func hash(into hasher: inout Hasher) { + hasher.combine(id) + } + + public static func == (lhs: NewSongsEntity, rhs: NewSongsEntity) -> Bool { + lhs.id == rhs.id + } +} + +public extension NewSongsEntity { + struct KaraokeNumber { + public init (TJ: Int?, KY: Int?) { + self.TJ = TJ + self.KY = KY + } + + public let TJ, KY: Int? + } +} diff --git a/Projects/Domains/SongsDomain/Interface/Entity/NewSongsPlaylistEntity.swift b/Projects/Domains/SongsDomain/Interface/Entity/NewSongsPlaylistEntity.swift new file mode 100644 index 000000000..bfe6b479d --- /dev/null +++ b/Projects/Domains/SongsDomain/Interface/Entity/NewSongsPlaylistEntity.swift @@ -0,0 +1,9 @@ +import Foundation + +public struct NewSongsPlaylistEntity { + public init(url: String) { + self.url = url + } + + public let url: String +} diff --git a/Projects/Domains/SongsDomain/Interface/Entity/SearchResultEntity.swift b/Projects/Domains/SongsDomain/Interface/Entity/SearchResultEntity.swift new file mode 100644 index 000000000..7cb3eecbf --- /dev/null +++ b/Projects/Domains/SongsDomain/Interface/Entity/SearchResultEntity.swift @@ -0,0 +1,19 @@ +// +// SearchResultEntity.swift +// DomainModule +// +// Created by yongbeomkwak on 12/9/23. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import Foundation + +public struct SearchResultEntity: Equatable { + public init(song: [SongEntity], artist: [SongEntity], remix: [SongEntity]) { + self.song = song + self.artist = artist + self.remix = remix + } + + public let song, artist, remix: [SongEntity] +} diff --git a/Projects/Domains/SongsDomain/Interface/Entity/SongCreditsEntity.swift b/Projects/Domains/SongsDomain/Interface/Entity/SongCreditsEntity.swift new file mode 100644 index 000000000..639316244 --- /dev/null +++ b/Projects/Domains/SongsDomain/Interface/Entity/SongCreditsEntity.swift @@ -0,0 +1,44 @@ +// +// SongCreditsEntity.swift +// SongsDomain +// +// Created by KTH on 5/14/24. +// Copyright © 2024 yongbeomkwak. All rights reserved. +// + +import Foundation + +public struct SongCreditsEntity { + public init( + type: String, + names: [Credit] + ) { + self.type = type + self.names = names + } + + public init( + type: String, + names: [String] + ) { + self.type = type + self.names = names.map { + Credit(name: $0, isArtist: false, artistID: nil) + } + } + + public let type: String + public let names: [Credit] + + public struct Credit { + public let name: String + public let isArtist: Bool + public let artistID: String? + + public init(name: String, isArtist: Bool, artistID: String?) { + self.name = name + self.isArtist = isArtist + self.artistID = artistID + } + } +} diff --git a/Projects/Domains/SongsDomain/Interface/Entity/SongDetailEntity.swift b/Projects/Domains/SongsDomain/Interface/Entity/SongDetailEntity.swift new file mode 100644 index 000000000..04d484828 --- /dev/null +++ b/Projects/Domains/SongsDomain/Interface/Entity/SongDetailEntity.swift @@ -0,0 +1,39 @@ +import Foundation + +public struct SongDetailEntity: Hashable { + public init( + id: String, + title: String, + artist: String, + views: Int, + date: String, + likes: Int, + isLiked: Bool, + karaokeNumber: SongDetailEntity.KaraokeNumber + ) { + self.id = id + self.title = title + self.artist = artist + self.views = views + self.date = date + self.likes = likes + self.isLiked = isLiked + self.karaokeNumber = karaokeNumber + } + + public let id, title, artist: String + public let views: Int + public let date: String + public let likes: Int + public let isLiked: Bool + public let karaokeNumber: SongDetailEntity.KaraokeNumber + + public struct KaraokeNumber: Hashable, Equatable { + public init (tj: Int?, ky: Int?) { + self.tj = tj + self.ky = ky + } + + public let tj, ky: Int? + } +} diff --git a/Projects/Domains/SongsDomain/Interface/Entity/SongEntity.swift b/Projects/Domains/SongsDomain/Interface/Entity/SongEntity.swift new file mode 100644 index 000000000..b4f20862d --- /dev/null +++ b/Projects/Domains/SongsDomain/Interface/Entity/SongEntity.swift @@ -0,0 +1,45 @@ +import Foundation + +public struct SongEntity: Hashable { + public init( + id: String, + title: String, + artist: String, + views: Int, + date: String, + likes: Int = 0, + isSelected: Bool = false, + karaokeNumber: SongEntity.KaraokeNumber = .init(TJ: nil, KY: nil) + ) { + self.id = id + self.title = title + self.artist = artist + self.views = views + self.date = date + self.likes = likes + self.isSelected = isSelected + self.karaokeNumber = karaokeNumber + } + + public let id, title, artist: String + public let views: Int + public let date: String + public let likes: Int + public var isSelected: Bool + public let karaokeNumber: SongEntity.KaraokeNumber + + public func hash(into hasher: inout Hasher) { + hasher.combine(id) + } +} + +public extension SongEntity { + struct KaraokeNumber: Hashable, Equatable { + public init (TJ: Int?, KY: Int?) { + self.TJ = TJ + self.KY = KY + } + + public let TJ, KY: Int? + } +} diff --git a/Projects/Services/DataMappingModule/Sources/Base/NewSongGroupType.swift b/Projects/Domains/SongsDomain/Interface/Enum/NewSongGroupType.swift similarity index 100% rename from Projects/Services/DataMappingModule/Sources/Base/NewSongGroupType.swift rename to Projects/Domains/SongsDomain/Interface/Enum/NewSongGroupType.swift diff --git a/Projects/Domains/SongsDomain/Interface/Repository/SongsRepository.swift b/Projects/Domains/SongsDomain/Interface/Repository/SongsRepository.swift new file mode 100644 index 000000000..ffeafca85 --- /dev/null +++ b/Projects/Domains/SongsDomain/Interface/Repository/SongsRepository.swift @@ -0,0 +1,10 @@ +import Foundation +import RxSwift + +public protocol SongsRepository { + func fetchSong(id: String) -> Single + func fetchLyrics(id: String) -> Single + func fetchSongCredits(id: String) -> Single<[SongCreditsEntity]> + func fetchNewSongs(type: NewSongGroupType, page: Int, limit: Int) -> Single<[NewSongsEntity]> + func fetchNewSongsPlaylist(type: NewSongGroupType) -> Single +} diff --git a/Projects/Domains/SongsDomain/Interface/UseCase/FetchLyricsUseCase.swift b/Projects/Domains/SongsDomain/Interface/UseCase/FetchLyricsUseCase.swift new file mode 100644 index 000000000..7cc1b8fe1 --- /dev/null +++ b/Projects/Domains/SongsDomain/Interface/UseCase/FetchLyricsUseCase.swift @@ -0,0 +1,14 @@ +// +// FetchLyricsUseCase.swift +// DomainModule +// +// Created by YoungK on 2023/02/22. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import Foundation +import RxSwift + +public protocol FetchLyricsUseCase { + func execute(id: String) -> Single +} diff --git a/Projects/Domains/SongsDomain/Interface/UseCase/FetchNewSongsPlaylistUseCase.swift b/Projects/Domains/SongsDomain/Interface/UseCase/FetchNewSongsPlaylistUseCase.swift new file mode 100644 index 000000000..d32c9ff5c --- /dev/null +++ b/Projects/Domains/SongsDomain/Interface/UseCase/FetchNewSongsPlaylistUseCase.swift @@ -0,0 +1,6 @@ +import Foundation +import RxSwift + +public protocol FetchNewSongsPlaylistUseCase { + func execute(type: NewSongGroupType) -> Single +} diff --git a/Projects/Domains/SongsDomain/Interface/UseCase/FetchNewSongsUseCase.swift b/Projects/Domains/SongsDomain/Interface/UseCase/FetchNewSongsUseCase.swift new file mode 100644 index 000000000..379030e45 --- /dev/null +++ b/Projects/Domains/SongsDomain/Interface/UseCase/FetchNewSongsUseCase.swift @@ -0,0 +1,14 @@ +// +// fetchNewSongsUseCase.swift +// DomainModule +// +// Created by KTH on 2023/11/15. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import Foundation +import RxSwift + +public protocol FetchNewSongsUseCase { + func execute(type: NewSongGroupType, page: Int, limit: Int) -> Single<[NewSongsEntity]> +} diff --git a/Projects/Domains/SongsDomain/Interface/UseCase/FetchSongCreditsUseCase.swift b/Projects/Domains/SongsDomain/Interface/UseCase/FetchSongCreditsUseCase.swift new file mode 100644 index 000000000..716227c6b --- /dev/null +++ b/Projects/Domains/SongsDomain/Interface/UseCase/FetchSongCreditsUseCase.swift @@ -0,0 +1,14 @@ +// +// FetchSongCreditsUseCase.swift +// SongsDomain +// +// Created by KTH on 5/14/24. +// Copyright © 2024 yongbeomkwak. All rights reserved. +// + +import Foundation +import RxSwift + +public protocol FetchSongCreditsUseCase { + func execute(id: String) -> Single<[SongCreditsEntity]> +} diff --git a/Projects/Domains/SongsDomain/Interface/UseCase/FetchSongUseCase.swift b/Projects/Domains/SongsDomain/Interface/UseCase/FetchSongUseCase.swift new file mode 100644 index 000000000..c4a2c81d2 --- /dev/null +++ b/Projects/Domains/SongsDomain/Interface/UseCase/FetchSongUseCase.swift @@ -0,0 +1,6 @@ +import Foundation +import RxSwift + +public protocol FetchSongUseCase { + func execute(id: String) -> Single +} diff --git a/Projects/Domains/SongsDomain/Project.swift b/Projects/Domains/SongsDomain/Project.swift new file mode 100644 index 000000000..bf158afd4 --- /dev/null +++ b/Projects/Domains/SongsDomain/Project.swift @@ -0,0 +1,34 @@ +import DependencyPlugin +import ProjectDescription +import ProjectDescriptionHelpers + +let project = Project.module( + name: ModulePaths.Domain.SongsDomain.rawValue, + targets: [ + .interface( + module: .domain(.SongsDomain), + dependencies: [ + .domain(target: .BaseDomain, type: .interface) + ] + ), + .implements( + module: .domain(.SongsDomain), + dependencies: [ + .domain(target: .BaseDomain), + .domain(target: .SongsDomain, type: .interface), + .domain(target: .AuthDomain, type: .interface), + .domain(target: .LikeDomain, type: .interface) + ] + ), + .testing( + module: .domain(.SongsDomain), + dependencies: [ + .domain(target: .SongsDomain, type: .interface) + ] + ), + .tests( + module: .domain(.SongsDomain), + dependencies: [.domain(target: .SongsDomain)] + ) + ] +) diff --git a/Projects/Domains/SongsDomain/Sources/API/SongsAPI.swift b/Projects/Domains/SongsDomain/Sources/API/SongsAPI.swift new file mode 100644 index 000000000..84a17208b --- /dev/null +++ b/Projects/Domains/SongsDomain/Sources/API/SongsAPI.swift @@ -0,0 +1,72 @@ +import BaseDomain +import ErrorModule +import Foundation +import Moya +import SongsDomainInterface + +public enum SongsAPI { + case fetchSong(id: String) + case fetchLyrics(id: String) + case fetchCredits(id: String) + case fetchNewSongs(type: NewSongGroupType, page: Int, limit: Int) + case fetchNewSongsPlaylist(type: NewSongGroupType) +} + +extension SongsAPI: WMAPI { + public var domain: WMDomain { + return .songs + } + + public var urlPath: String { + switch self { + case let .fetchSong(id): + return "/\(id)" + case let .fetchLyrics(id): + return "/\(id)/lyrics" + case let .fetchCredits(id): + return "/\(id)/credits" + case let .fetchNewSongs(type, _, _): + return "/latest/\(type.apiKey)" + case let .fetchNewSongsPlaylist(type): + return "/latest/\(type.apiKey)/playlist" + } + } + + public var method: Moya.Method { + return .get + } + + public var task: Moya.Task { + switch self { + case .fetchSong, .fetchLyrics, .fetchCredits, + .fetchNewSongsPlaylist: + return .requestPlain + + case let .fetchNewSongs(_, page, limit): + return .requestParameters( + parameters: [ + "limit": limit, + "page": page + ], + encoding: URLEncoding.queryString + ) + } + } + + public var jwtTokenType: JwtTokenType { + return .none + } + + public var errorMap: [Int: WMError] { + switch self { + default: + return [ + 400: .badRequest, + 401: .tokenExpired, + 404: .notFound, + 429: .tooManyRequest, + 500: .internalServerError + ] + } + } +} diff --git a/Projects/Domains/SongsDomain/Sources/DataSource/RemoteSongsDataSourceImpl.swift b/Projects/Domains/SongsDomain/Sources/DataSource/RemoteSongsDataSourceImpl.swift new file mode 100644 index 000000000..e3bf582ce --- /dev/null +++ b/Projects/Domains/SongsDomain/Sources/DataSource/RemoteSongsDataSourceImpl.swift @@ -0,0 +1,36 @@ +import BaseDomain +import Foundation +import RxSwift +import SongsDomainInterface + +public final class RemoteSongsDataSourceImpl: BaseRemoteDataSource, RemoteSongsDataSource { + public func fetchSong(id: String) -> Single { + request(.fetchSong(id: id)) + .map(SingleSongResponseDTO.self) + .map { $0.toDomain() } + } + + public func fetchLyrics(id: String) -> Single { + request(.fetchLyrics(id: id)) + .map(LyricsResponseDTO.self) + .map { $0.toDomain() } + } + + public func fetchSongCredits(id: String) -> Single<[SongCreditsEntity]> { + request(.fetchCredits(id: id)) + .map([SongCreditsResponseDTO].self) + .map { $0.map { $0.toDomain() }} + } + + public func fetchNewSongs(type: NewSongGroupType, page: Int, limit: Int) -> Single<[NewSongsEntity]> { + request(.fetchNewSongs(type: type, page: page, limit: limit)) + .map([NewSongsResponseDTO].self) + .map { $0.map { $0.toDomain() }} + } + + public func fetchNewSongsPlaylist(type: NewSongGroupType) -> Single { + request(.fetchNewSongsPlaylist(type: type)) + .map(NewSongsPlaylistResponseDTO.self) + .map { $0.toDomain() } + } +} diff --git a/Projects/Domains/SongsDomain/Sources/Repository/SongsRepositoryImpl.swift b/Projects/Domains/SongsDomain/Sources/Repository/SongsRepositoryImpl.swift new file mode 100644 index 000000000..0af96106e --- /dev/null +++ b/Projects/Domains/SongsDomain/Sources/Repository/SongsRepositoryImpl.swift @@ -0,0 +1,32 @@ +import RxSwift +import SongsDomainInterface + +public final class SongsRepositoryImpl: SongsRepository { + private let remoteSongsDataSource: any RemoteSongsDataSource + + public init( + remoteSongsDataSource: RemoteSongsDataSource + ) { + self.remoteSongsDataSource = remoteSongsDataSource + } + + public func fetchSong(id: String) -> Single { + remoteSongsDataSource.fetchSong(id: id) + } + + public func fetchLyrics(id: String) -> Single { + remoteSongsDataSource.fetchLyrics(id: id) + } + + public func fetchSongCredits(id: String) -> Single<[SongCreditsEntity]> { + remoteSongsDataSource.fetchSongCredits(id: id) + } + + public func fetchNewSongs(type: NewSongGroupType, page: Int, limit: Int) -> Single<[NewSongsEntity]> { + remoteSongsDataSource.fetchNewSongs(type: type, page: page, limit: limit) + } + + public func fetchNewSongsPlaylist(type: NewSongGroupType) -> Single { + remoteSongsDataSource.fetchNewSongsPlaylist(type: type) + } +} diff --git a/Projects/Domains/SongsDomain/Sources/ResponseDTO/LyricsResponseDTO.swift b/Projects/Domains/SongsDomain/Sources/ResponseDTO/LyricsResponseDTO.swift new file mode 100644 index 000000000..b5f292ca9 --- /dev/null +++ b/Projects/Domains/SongsDomain/Sources/ResponseDTO/LyricsResponseDTO.swift @@ -0,0 +1,32 @@ +// +// LyricsResponseDTO.swift +// DataMappingModule +// +// Created by YoungK on 2023/02/22. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import Foundation +import SongsDomainInterface + +public struct LyricsResponseDTO: Decodable { + let provider: String + let lyrics: [LyricsResponseDTO.Lyric] +} + +extension LyricsResponseDTO { + struct Lyric: Decodable { + let text: String + } +} + +public extension LyricsResponseDTO { + func toDomain() -> LyricsEntity { + return .init( + provider: provider, + lyrics: lyrics.map { lyric -> LyricsEntity.Lyric in + return LyricsEntity.Lyric(text: lyric.text) + } + ) + } +} diff --git a/Projects/Domains/SongsDomain/Sources/ResponseDTO/NewSongsPlaylistResponseDTO.swift b/Projects/Domains/SongsDomain/Sources/ResponseDTO/NewSongsPlaylistResponseDTO.swift new file mode 100644 index 000000000..d17fced88 --- /dev/null +++ b/Projects/Domains/SongsDomain/Sources/ResponseDTO/NewSongsPlaylistResponseDTO.swift @@ -0,0 +1,16 @@ +import Foundation +import SongsDomainInterface + +struct NewSongsPlaylistResponseDTO: Decodable { + let url: String + + enum CodingKeys: String, CodingKey { + case url = "data" + } +} + +extension NewSongsPlaylistResponseDTO { + func toDomain() -> NewSongsPlaylistEntity { + return NewSongsPlaylistEntity(url: url) + } +} diff --git a/Projects/Domains/SongsDomain/Sources/ResponseDTO/NewSongsResponseDTO.swift b/Projects/Domains/SongsDomain/Sources/ResponseDTO/NewSongsResponseDTO.swift new file mode 100644 index 000000000..462e0282b --- /dev/null +++ b/Projects/Domains/SongsDomain/Sources/ResponseDTO/NewSongsResponseDTO.swift @@ -0,0 +1,42 @@ +// +// NewSongsResponseDTO.swift +// DataMappingModule +// +// Created by KTH on 2023/11/15. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import Foundation +import SongsDomainInterface + +public struct NewSongsResponseDTO: Decodable { + public let songID, title: String + public let artists: [String] + public let date, views, likes: Int + public let karaokeNumber: SingleSongResponseDTO.KaraokeNumber + + enum CodingKeys: String, CodingKey { + case title, artists, date, views, likes + case songID = "videoId" + case karaokeNumber + } +} + +public extension NewSongsResponseDTO { + struct KaraokeNumber: Decodable { + public let TJ, KY: Int? + } +} + +public extension NewSongsResponseDTO { + func toDomain() -> NewSongsEntity { + return NewSongsEntity( + id: songID, + title: title, + artist: artists.joined(separator: ", "), + views: views, + date: date.changeDateFormat(origin: "yyMMdd", result: "yyyy.MM.dd"), + karaokeNumber: .init(TJ: karaokeNumber.TJ, KY: karaokeNumber.KY) + ) + } +} diff --git a/Projects/Domains/SongsDomain/Sources/ResponseDTO/SingleSongResponseDTO.swift b/Projects/Domains/SongsDomain/Sources/ResponseDTO/SingleSongResponseDTO.swift new file mode 100644 index 000000000..7ee3146bd --- /dev/null +++ b/Projects/Domains/SongsDomain/Sources/ResponseDTO/SingleSongResponseDTO.swift @@ -0,0 +1,45 @@ +// +// SearchSongResponseDTO.swift +// DataMappingModule +// +// Created by yongbeomkwak on 2023/02/07. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import Foundation +import SongsDomainInterface +import Utility + +public struct SingleSongResponseDTO: Decodable { + public let songID, title: String + public let artists: [String] + public let views, likes: Int + public let date: Int + public let karaokeNumber: SingleSongResponseDTO.KaraokeNumber + + enum CodingKeys: String, CodingKey { + case title, artists, date, views, likes + case songID = "videoId" + case karaokeNumber + } +} + +public extension SingleSongResponseDTO { + struct KaraokeNumber: Decodable { + public let TJ, KY: Int? + } +} + +public extension SingleSongResponseDTO { + func toDomain() -> SongEntity { + return SongEntity( + id: songID, + title: title, + artist: artists.joined(separator: ", "), + views: views, + date: date.changeDateFormat(origin: "yyMMdd", result: "yyyy.MM.dd"), + likes: likes, + karaokeNumber: .init(TJ: karaokeNumber.TJ, KY: karaokeNumber.KY) + ) + } +} diff --git a/Projects/Domains/SongsDomain/Sources/ResponseDTO/SongCreditsResponseDTO.swift b/Projects/Domains/SongsDomain/Sources/ResponseDTO/SongCreditsResponseDTO.swift new file mode 100644 index 000000000..a470aac87 --- /dev/null +++ b/Projects/Domains/SongsDomain/Sources/ResponseDTO/SongCreditsResponseDTO.swift @@ -0,0 +1,42 @@ +// +// FetchSongCreditsResponseDTO.swift +// SongsDomain +// +// Created by KTH on 5/14/24. +// Copyright © 2024 yongbeomkwak. All rights reserved. +// + +import Foundation +import SongsDomainInterface + +public struct SongCreditsResponseDTO: Decodable { + let type: String + let names: [Credit] + + public struct Credit: Decodable { + let name: String + let isArtist: Bool + let artistID: String? + + enum CodingKeys: String, CodingKey { + case name + case isArtist = "isArtist" + case artistID = "artistId" + } + } +} + +public extension SongCreditsResponseDTO { + func toDomain() -> SongCreditsEntity { + return SongCreditsEntity( + type: type, + names: names.map { + SongCreditsEntity.Credit( + name: $0.name, + isArtist: $0.isArtist, + artistID: $0.artistID + ) + } + ) + } +} diff --git a/Projects/Services/DataModule/Sources/Songs/UseCases/FetchLyricsUseCaseImpl.swift b/Projects/Domains/SongsDomain/Sources/UseCase/FetchLyricsUseCaseImpl.swift similarity index 76% rename from Projects/Services/DataModule/Sources/Songs/UseCases/FetchLyricsUseCaseImpl.swift rename to Projects/Domains/SongsDomain/Sources/UseCase/FetchLyricsUseCaseImpl.swift index 8a3b1fa99..de796bcad 100644 --- a/Projects/Services/DataModule/Sources/Songs/UseCases/FetchLyricsUseCaseImpl.swift +++ b/Projects/Domains/SongsDomain/Sources/UseCase/FetchLyricsUseCaseImpl.swift @@ -7,12 +7,9 @@ // import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule +import SongsDomainInterface public struct FetchLyricsUseCaseImpl: FetchLyricsUseCase { - private let songsRepository: any SongsRepository public init( @@ -20,10 +17,8 @@ public struct FetchLyricsUseCaseImpl: FetchLyricsUseCase { ) { self.songsRepository = songsRepository } - - public func execute(id: String) -> Single<[LyricsEntity]> { + + public func execute(id: String) -> Single { songsRepository.fetchLyrics(id: id) } - - } diff --git a/Projects/Domains/SongsDomain/Sources/UseCase/FetchNewSongsPlaylistUseCaseImpl.swift b/Projects/Domains/SongsDomain/Sources/UseCase/FetchNewSongsPlaylistUseCaseImpl.swift new file mode 100644 index 000000000..c63cc90d5 --- /dev/null +++ b/Projects/Domains/SongsDomain/Sources/UseCase/FetchNewSongsPlaylistUseCaseImpl.swift @@ -0,0 +1,16 @@ +import RxSwift +import SongsDomainInterface + +public struct FetchNewSongsPlaylistUseCaseImpl: FetchNewSongsPlaylistUseCase { + private let songsRepository: any SongsRepository + + public init( + songsRepository: SongsRepository + ) { + self.songsRepository = songsRepository + } + + public func execute(type: NewSongGroupType) -> Single { + return songsRepository.fetchNewSongsPlaylist(type: type) + } +} diff --git a/Projects/Services/DataModule/Sources/Songs/UseCases/FetchNewSongsUseCaseImpl.swift b/Projects/Domains/SongsDomain/Sources/UseCase/FetchNewSongsUseCaseImpl.swift similarity index 86% rename from Projects/Services/DataModule/Sources/Songs/UseCases/FetchNewSongsUseCaseImpl.swift rename to Projects/Domains/SongsDomain/Sources/UseCase/FetchNewSongsUseCaseImpl.swift index 7ec14acd8..b6d00e982 100644 --- a/Projects/Services/DataModule/Sources/Songs/UseCases/FetchNewSongsUseCaseImpl.swift +++ b/Projects/Domains/SongsDomain/Sources/UseCase/FetchNewSongsUseCaseImpl.swift @@ -1,7 +1,5 @@ import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule +import SongsDomainInterface public struct FetchNewSongsUseCaseImpl: FetchNewSongsUseCase { private let songsRepository: any SongsRepository @@ -11,7 +9,7 @@ public struct FetchNewSongsUseCaseImpl: FetchNewSongsUseCase { ) { self.songsRepository = songsRepository } - + public func execute(type: NewSongGroupType, page: Int, limit: Int) -> Single<[NewSongsEntity]> { return songsRepository.fetchNewSongs(type: type, page: page, limit: limit) } diff --git a/Projects/Domains/SongsDomain/Sources/UseCase/FetchSongCreditsUseCaseImpl.swift b/Projects/Domains/SongsDomain/Sources/UseCase/FetchSongCreditsUseCaseImpl.swift new file mode 100644 index 000000000..fc26155a1 --- /dev/null +++ b/Projects/Domains/SongsDomain/Sources/UseCase/FetchSongCreditsUseCaseImpl.swift @@ -0,0 +1,24 @@ +// +// FetchSongCreditsUseCaseImpl.swift +// SongsDomain +// +// Created by KTH on 5/14/24. +// Copyright © 2024 yongbeomkwak. All rights reserved. +// + +import RxSwift +import SongsDomainInterface + +public struct FetchSongCreditsUseCaseImpl: FetchSongCreditsUseCase { + private let songsRepository: any SongsRepository + + public init( + songsRepository: SongsRepository + ) { + self.songsRepository = songsRepository + } + + public func execute(id: String) -> Single<[SongCreditsEntity]> { + songsRepository.fetchSongCredits(id: id) + } +} diff --git a/Projects/Domains/SongsDomain/Sources/UseCase/FetchSongUseCaseImpl.swift b/Projects/Domains/SongsDomain/Sources/UseCase/FetchSongUseCaseImpl.swift new file mode 100644 index 000000000..7b3df55eb --- /dev/null +++ b/Projects/Domains/SongsDomain/Sources/UseCase/FetchSongUseCaseImpl.swift @@ -0,0 +1,56 @@ +import AuthDomainInterface +import LikeDomainInterface +import RxSwift +import SongsDomainInterface + +public struct FetchSongUseCaseImpl: FetchSongUseCase { + private let songsRepository: any SongsRepository + private let likeRepository: any LikeRepository + private let authRepository: any AuthRepository + + public init( + songsRepository: SongsRepository, + likeRepository: any LikeRepository, + authRepository: any AuthRepository + ) { + self.songsRepository = songsRepository + self.likeRepository = likeRepository + self.authRepository = authRepository + } + + public func execute(id: String) -> Single { + authRepository.checkIsExistAccessToken() + .flatMap { isLoggedIn in + let fetchSong = songsRepository.fetchSong(id: id) + guard isLoggedIn else { + return fetchSong.map { + $0.toDetailEntity(isLiked: false) + } + } + + let fetchIsLiked = likeRepository.checkIsLikedSong(id: id) + return Single.zip(fetchSong, fetchIsLiked) + .map { song, isLiked in + song.toDetailEntity(isLiked: isLiked) + } + } + } +} + +private extension SongEntity { + func toDetailEntity(isLiked: Bool) -> SongDetailEntity { + SongDetailEntity( + id: self.id, + title: self.title, + artist: self.artist, + views: self.views, + date: self.date, + likes: self.likes, + isLiked: isLiked, + karaokeNumber: .init( + tj: self.karaokeNumber.TJ, + ky: self.karaokeNumber.KY + ) + ) + } +} diff --git a/Projects/Domains/SongsDomain/Testing/UseCase/FetchSongCreditsUseCaseSpy.swift b/Projects/Domains/SongsDomain/Testing/UseCase/FetchSongCreditsUseCaseSpy.swift new file mode 100644 index 000000000..7e26eee22 --- /dev/null +++ b/Projects/Domains/SongsDomain/Testing/UseCase/FetchSongCreditsUseCaseSpy.swift @@ -0,0 +1,14 @@ +import RxSwift +import SongsDomainInterface + +public final class FetchSongCreditsUseCaseSpy: FetchSongCreditsUseCase { + public private(set) var callCount = 0 + public var handler: ((String) -> Single<[SongCreditsEntity]>) = { _ in fatalError() } + + public init() {} + + public func execute(id: String) -> Single<[SongCreditsEntity]> { + callCount += 1 + return handler(id) + } +} diff --git a/Projects/Domains/SongsDomain/Testing/UseCase/FetchSongUseCaseSpy.swift b/Projects/Domains/SongsDomain/Testing/UseCase/FetchSongUseCaseSpy.swift new file mode 100644 index 000000000..5642fb95b --- /dev/null +++ b/Projects/Domains/SongsDomain/Testing/UseCase/FetchSongUseCaseSpy.swift @@ -0,0 +1,14 @@ +import RxSwift +import SongsDomainInterface + +public final class FetchSongUseCaseSpy: FetchSongUseCase { + public private(set) var callCount = 0 + public var handler: ((String) -> Single) = { _ in fatalError() } + + public init() {} + + public func execute(id: String) -> Single { + callCount += 1 + return handler(id) + } +} diff --git a/Projects/Domains/SongsDomain/Tests/SongsDomainTest.swift b/Projects/Domains/SongsDomain/Tests/SongsDomainTest.swift new file mode 100644 index 000000000..a7a935767 --- /dev/null +++ b/Projects/Domains/SongsDomain/Tests/SongsDomainTest.swift @@ -0,0 +1,11 @@ +import XCTest + +final class SongsDomainTests: XCTestCase { + override func setUpWithError() throws {} + + override func tearDownWithError() throws {} + + func testExample() { + XCTAssertEqual(1, 1) + } +} diff --git a/Projects/Domains/TeamDomain/Interface/DataSource/RemoteTeamDataSource.swift b/Projects/Domains/TeamDomain/Interface/DataSource/RemoteTeamDataSource.swift new file mode 100644 index 000000000..83fd547f2 --- /dev/null +++ b/Projects/Domains/TeamDomain/Interface/DataSource/RemoteTeamDataSource.swift @@ -0,0 +1,6 @@ +import Foundation +import RxSwift + +public protocol RemoteTeamDataSource { + func fetchTeamList() -> Single<[TeamListEntity]> +} diff --git a/Projects/Domains/TeamDomain/Interface/Entity/TeamListEntity.swift b/Projects/Domains/TeamDomain/Interface/Entity/TeamListEntity.swift new file mode 100644 index 000000000..5573ce8d6 --- /dev/null +++ b/Projects/Domains/TeamDomain/Interface/Entity/TeamListEntity.swift @@ -0,0 +1,29 @@ +import Foundation + +public struct TeamListEntity { + public let team: String + public let part: String + public let name: String + public let position: String + public let profile: String + public let isLead: Bool + public let isManager: Bool + + public init( + team: String, + part: String, + name: String, + position: String, + profile: String, + isLead: Bool, + isManager: Bool + ) { + self.team = team + self.part = part + self.name = name + self.position = position + self.profile = profile + self.isLead = isLead + self.isManager = isManager + } +} diff --git a/Projects/Domains/TeamDomain/Interface/Repository/TeamRepository.swift b/Projects/Domains/TeamDomain/Interface/Repository/TeamRepository.swift new file mode 100644 index 000000000..9a9d3a697 --- /dev/null +++ b/Projects/Domains/TeamDomain/Interface/Repository/TeamRepository.swift @@ -0,0 +1,6 @@ +import Foundation +import RxSwift + +public protocol TeamRepository { + func fetchTeamList() -> Single<[TeamListEntity]> +} diff --git a/Projects/Domains/TeamDomain/Interface/UseCase/FetchTeamListUseCase.swift b/Projects/Domains/TeamDomain/Interface/UseCase/FetchTeamListUseCase.swift new file mode 100644 index 000000000..a5e5ab653 --- /dev/null +++ b/Projects/Domains/TeamDomain/Interface/UseCase/FetchTeamListUseCase.swift @@ -0,0 +1,6 @@ +import Foundation +import RxSwift + +public protocol FetchTeamListUseCase { + func execute() -> Single<[TeamListEntity]> +} diff --git a/Projects/Domains/TeamDomain/Project.swift b/Projects/Domains/TeamDomain/Project.swift new file mode 100644 index 000000000..12b6e8e67 --- /dev/null +++ b/Projects/Domains/TeamDomain/Project.swift @@ -0,0 +1,22 @@ +import DependencyPlugin +import ProjectDescription +import ProjectDescriptionHelpers + +let project = Project.module( + name: ModulePaths.Domain.TeamDomain.rawValue, + targets: [ + .interface( + module: .domain(.TeamDomain), + dependencies: [ + .domain(target: .BaseDomain, type: .interface) + ] + ), + .implements( + module: .domain(.TeamDomain), + dependencies: [ + .domain(target: .BaseDomain), + .domain(target: .TeamDomain, type: .interface) + ] + ) + ] +) diff --git a/Projects/Domains/TeamDomain/Sources/API/TeamAPI.swift b/Projects/Domains/TeamDomain/Sources/API/TeamAPI.swift new file mode 100644 index 000000000..c0c9b841d --- /dev/null +++ b/Projects/Domains/TeamDomain/Sources/API/TeamAPI.swift @@ -0,0 +1,53 @@ +import BaseDomain +import ErrorModule +import Foundation +import Moya +import TeamDomainInterface + +public enum TeamAPI { + case fetchTeamList +} + +extension TeamAPI: WMAPI { + public var domain: WMDomain { + return .team + } + + public var urlPath: String { + switch self { + case .fetchTeamList: + return "/list" + } + } + + public var method: Moya.Method { + switch self { + case .fetchTeamList: + return .get + } + } + + public var task: Moya.Task { + switch self { + case .fetchTeamList: + return .requestPlain + } + } + + public var jwtTokenType: JwtTokenType { + return .none + } + + public var errorMap: [Int: WMError] { + switch self { + default: + return [ + 400: .badRequest, + 401: .tokenExpired, + 404: .notFound, + 429: .tooManyRequest, + 500: .internalServerError + ] + } + } +} diff --git a/Projects/Domains/TeamDomain/Sources/DataSource/RemoteTeamDataSourceImpl.swift b/Projects/Domains/TeamDomain/Sources/DataSource/RemoteTeamDataSourceImpl.swift new file mode 100644 index 000000000..2b9c348f8 --- /dev/null +++ b/Projects/Domains/TeamDomain/Sources/DataSource/RemoteTeamDataSourceImpl.swift @@ -0,0 +1,12 @@ +import BaseDomain +import Foundation +import RxSwift +import TeamDomainInterface + +public final class RemoteTeamDataSourceImpl: BaseRemoteDataSource, RemoteTeamDataSource { + public func fetchTeamList() -> Single<[TeamListEntity]> { + request(.fetchTeamList) + .map([FetchTeamListResponseDTO].self) + .map { $0.map { $0.toDomain() } } + } +} diff --git a/Projects/Domains/TeamDomain/Sources/Repository/TeamRepositoryImpl.swift b/Projects/Domains/TeamDomain/Sources/Repository/TeamRepositoryImpl.swift new file mode 100644 index 000000000..d499a7ed6 --- /dev/null +++ b/Projects/Domains/TeamDomain/Sources/Repository/TeamRepositoryImpl.swift @@ -0,0 +1,17 @@ +import Foundation +import RxSwift +import TeamDomainInterface + +public final class TeamRepositoryImpl: TeamRepository { + private let remoteTeamDataSource: any RemoteTeamDataSource + + public init( + remoteTeamDataSource: RemoteTeamDataSource + ) { + self.remoteTeamDataSource = remoteTeamDataSource + } + + public func fetchTeamList() -> Single<[TeamListEntity]> { + remoteTeamDataSource.fetchTeamList() + } +} diff --git a/Projects/Domains/TeamDomain/Sources/ResponseDTO/FetchTeamListResponseDTO.swift b/Projects/Domains/TeamDomain/Sources/ResponseDTO/FetchTeamListResponseDTO.swift new file mode 100644 index 000000000..3fd86b9fe --- /dev/null +++ b/Projects/Domains/TeamDomain/Sources/ResponseDTO/FetchTeamListResponseDTO.swift @@ -0,0 +1,26 @@ +import Foundation +import TeamDomainInterface + +public struct FetchTeamListResponseDTO: Decodable { + public let team: String + public let part: String + public let name: String + public let position: String + public let profile: String + public let isLead: Bool + public let isManager: Bool +} + +public extension FetchTeamListResponseDTO { + func toDomain() -> TeamListEntity { + return .init( + team: team, + part: part, + name: name, + position: position, + profile: profile, + isLead: isLead, + isManager: isManager + ) + } +} diff --git a/Projects/Domains/TeamDomain/Sources/UseCase/FetchTeamListUseCaseImpl.swift b/Projects/Domains/TeamDomain/Sources/UseCase/FetchTeamListUseCaseImpl.swift new file mode 100644 index 000000000..88d7ab9f9 --- /dev/null +++ b/Projects/Domains/TeamDomain/Sources/UseCase/FetchTeamListUseCaseImpl.swift @@ -0,0 +1,17 @@ +import Foundation +import RxSwift +import TeamDomainInterface + +public struct FetchTeamListUseCaseImpl: FetchTeamListUseCase { + private let teamRepository: any TeamRepository + + public init( + teamRepository: TeamRepository + ) { + self.teamRepository = teamRepository + } + + public func execute() -> Single<[TeamListEntity]> { + teamRepository.fetchTeamList() + } +} diff --git a/Projects/Domains/UserDomain/Interface/DataSource/RemoteUserDataSource.swift b/Projects/Domains/UserDomain/Interface/DataSource/RemoteUserDataSource.swift new file mode 100644 index 000000000..4ff9bdad9 --- /dev/null +++ b/Projects/Domains/UserDomain/Interface/DataSource/RemoteUserDataSource.swift @@ -0,0 +1,19 @@ +import BaseDomainInterface +import Foundation +import RxSwift + +public protocol RemoteUserDataSource { + func setProfile(image: String) -> Completable + func setUserName(name: String) -> Completable + func fetchPlaylist() -> Single<[PlaylistEntity]> + func fetchFavoriteSong() -> Single<[FavoriteSongEntity]> + func editFavoriteSongsOrder(ids: [String]) -> Completable + func editPlaylistOrder(ids: [String]) -> Completable + func deletePlaylist(ids: [String]) -> Completable + func deleteFavoriteList(ids: [String]) -> Completable + func fetchUserInfo() -> Single + func withdrawUserInfo() -> Completable + func fetchFruitList() -> Single<[FruitEntity]> + func fetchFruitDrawStatus() -> Single + func drawFruit() -> Single +} diff --git a/Projects/Domains/UserDomain/Interface/Entity/FavoriteSongEntity.swift b/Projects/Domains/UserDomain/Interface/Entity/FavoriteSongEntity.swift new file mode 100644 index 000000000..f75e05fcb --- /dev/null +++ b/Projects/Domains/UserDomain/Interface/Entity/FavoriteSongEntity.swift @@ -0,0 +1,19 @@ +import Foundation +import SongsDomainInterface + +public struct FavoriteSongEntity: Equatable { + public init(songID: String, title: String, artist: String, like: Int) { + self.songID = songID + self.title = title + self.artist = artist + self.like = like + self.isSelected = false + } + + public let songID: String + public let title: String + public let artist: String + public let like: Int + #warning("엔티티에 기반한 상태관리 로직 리팩토링") + public var isSelected: Bool +} diff --git a/Projects/Domains/UserDomain/Interface/Entity/FruitDrawStatusEntity.swift b/Projects/Domains/UserDomain/Interface/Entity/FruitDrawStatusEntity.swift new file mode 100644 index 000000000..81758cef8 --- /dev/null +++ b/Projects/Domains/UserDomain/Interface/Entity/FruitDrawStatusEntity.swift @@ -0,0 +1,41 @@ +import Foundation + +public struct FruitDrawStatusEntity { + public let canDraw: Bool + public let lastDraw: FruitDrawStatusEntity.LastDraw + + public init(canDraw: Bool, lastDraw: FruitDrawStatusEntity.LastDraw) { + self.canDraw = canDraw + self.lastDraw = lastDraw + } +} + +public extension FruitDrawStatusEntity { + struct LastDraw { + public let drawAt: Double + public let fruit: FruitDrawStatusEntity.LastDraw.Fruit + + public init(drawAt: Double, fruit: FruitDrawStatusEntity.LastDraw.Fruit) { + self.drawAt = drawAt + self.fruit = fruit + } + } +} + +public extension FruitDrawStatusEntity.LastDraw { + struct Fruit { + public let fruitID, name, imageURL: String + + public init(fruitID: String, name: String, imageURL: String) { + self.fruitID = fruitID + self.name = name + self.imageURL = imageURL + } + + enum CodingKeys: String, CodingKey { + case fruitID = "fruitId" + case name + case imageURL = "imageUrl" + } + } +} diff --git a/Projects/Domains/UserDomain/Interface/Entity/FruitEntity.swift b/Projects/Domains/UserDomain/Interface/Entity/FruitEntity.swift new file mode 100644 index 000000000..0c8645023 --- /dev/null +++ b/Projects/Domains/UserDomain/Interface/Entity/FruitEntity.swift @@ -0,0 +1,19 @@ +import Foundation + +public struct FruitEntity { + public init( + quantity: Int, + fruitID: String, + name: String, + imageURL: String + ) { + self.quantity = quantity + self.fruitID = fruitID + self.name = name + self.imageURL = imageURL + } + + public let quantity: Int + public let fruitID, name, imageURL: String + public var imageData: Data? +} diff --git a/Projects/Domains/UserDomain/Interface/Entity/PlaylistEntity.swift b/Projects/Domains/UserDomain/Interface/Entity/PlaylistEntity.swift new file mode 100644 index 000000000..023dcd975 --- /dev/null +++ b/Projects/Domains/UserDomain/Interface/Entity/PlaylistEntity.swift @@ -0,0 +1,26 @@ +import Foundation +import SongsDomainInterface + +public struct PlaylistEntity: Equatable { + public init( + key: String, + title: String, + image: String, + songCount: Int, + userId: String, + private: Bool, + isSelected: Bool = false + ) { + self.key = key + self.title = title + self.image = image + self.private = `private` + self.isSelected = isSelected + self.songCount = songCount + self.userId = userId + } + + public let key, title, image, userId: String + public let songCount: Int + public var `private`, isSelected: Bool +} diff --git a/Projects/Domains/UserDomain/Interface/Entity/UserInfoEntity.swift b/Projects/Domains/UserDomain/Interface/Entity/UserInfoEntity.swift new file mode 100644 index 000000000..5662e48f8 --- /dev/null +++ b/Projects/Domains/UserDomain/Interface/Entity/UserInfoEntity.swift @@ -0,0 +1,33 @@ +// +// UserInfoEntity.swift +// DomainModule +// +// Created by yongbeomkwak on 12/8/23. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import Foundation + +public struct UserInfoEntity: Equatable { + public init( + id: String, + platform: String, + name: String, + profile: String, + itemCount: Int + + ) { + self.id = id + self.platform = platform + self.name = name + self.profile = profile + self.itemCount = itemCount + } + + public let id, platform, name, profile: String + public let itemCount: Int + + public static func == (lhs: UserInfoEntity, rhs: UserInfoEntity) -> Bool { + lhs.id == rhs.id + } +} diff --git a/Projects/Domains/UserDomain/Interface/Repository/UserRepository.swift b/Projects/Domains/UserDomain/Interface/Repository/UserRepository.swift new file mode 100644 index 000000000..0a61d777f --- /dev/null +++ b/Projects/Domains/UserDomain/Interface/Repository/UserRepository.swift @@ -0,0 +1,19 @@ +import BaseDomainInterface +import Foundation +import RxSwift + +public protocol UserRepository { + func setProfile(image: String) -> Completable + func setUserName(name: String) -> Completable + func fetchPlaylist() -> Single<[PlaylistEntity]> + func fetchFavoriteSongs() -> Single<[FavoriteSongEntity]> + func editFavoriteSongsOrder(ids: [String]) -> Completable + func editPlaylistOrder(ids: [String]) -> Completable + func deletePlaylist(ids: [String]) -> Completable + func deleteFavoriteList(ids: [String]) -> Completable + func fetchUserInfo() -> Single + func withdrawUserInfo() -> Completable + func fetchFruitList() -> Single<[FruitEntity]> + func fetchFruitDrawStatus() -> Single + func drawFruit() -> Single +} diff --git a/Projects/Domains/UserDomain/Interface/UseCase/DeleteFavoriteListUseCase.swift b/Projects/Domains/UserDomain/Interface/UseCase/DeleteFavoriteListUseCase.swift new file mode 100644 index 000000000..0a20c0fc3 --- /dev/null +++ b/Projects/Domains/UserDomain/Interface/UseCase/DeleteFavoriteListUseCase.swift @@ -0,0 +1,7 @@ +import BaseDomainInterface +import Foundation +import RxSwift + +public protocol DeleteFavoriteListUseCase { + func execute(ids: [String]) -> Completable +} diff --git a/Projects/Domains/UserDomain/Interface/UseCase/DeletePlaylistUseCase.swift b/Projects/Domains/UserDomain/Interface/UseCase/DeletePlaylistUseCase.swift new file mode 100644 index 000000000..47790162b --- /dev/null +++ b/Projects/Domains/UserDomain/Interface/UseCase/DeletePlaylistUseCase.swift @@ -0,0 +1,7 @@ +import BaseDomainInterface +import Foundation +import RxSwift + +public protocol DeletePlaylistUseCase { + func execute(ids: [String]) -> Completable +} diff --git a/Projects/Domains/UserDomain/Interface/UseCase/DrawFruitUseCase.swift b/Projects/Domains/UserDomain/Interface/UseCase/DrawFruitUseCase.swift new file mode 100644 index 000000000..db3bae005 --- /dev/null +++ b/Projects/Domains/UserDomain/Interface/UseCase/DrawFruitUseCase.swift @@ -0,0 +1,5 @@ +import RxSwift + +public protocol DrawFruitUseCase { + func execute() -> Single +} diff --git a/Projects/Domains/UserDomain/Interface/UseCase/EditFavoriteSongsOrderUseCase.swift b/Projects/Domains/UserDomain/Interface/UseCase/EditFavoriteSongsOrderUseCase.swift new file mode 100644 index 000000000..7347aed7e --- /dev/null +++ b/Projects/Domains/UserDomain/Interface/UseCase/EditFavoriteSongsOrderUseCase.swift @@ -0,0 +1,7 @@ +import BaseDomainInterface +import Foundation +import RxSwift + +public protocol EditFavoriteSongsOrderUseCase { + func execute(ids: [String]) -> Completable +} diff --git a/Projects/Domains/UserDomain/Interface/UseCase/EditPlaylistOrderUseCase.swift b/Projects/Domains/UserDomain/Interface/UseCase/EditPlaylistOrderUseCase.swift new file mode 100644 index 000000000..dcca28bc3 --- /dev/null +++ b/Projects/Domains/UserDomain/Interface/UseCase/EditPlaylistOrderUseCase.swift @@ -0,0 +1,7 @@ +import BaseDomainInterface +import Foundation +import RxSwift + +public protocol EditPlaylistOrderUseCase { + func execute(ids: [String]) -> Completable +} diff --git a/Projects/Domains/UserDomain/Interface/UseCase/FetchFavoriteSongsUseCase.swift b/Projects/Domains/UserDomain/Interface/UseCase/FetchFavoriteSongsUseCase.swift new file mode 100644 index 000000000..4d872c3dd --- /dev/null +++ b/Projects/Domains/UserDomain/Interface/UseCase/FetchFavoriteSongsUseCase.swift @@ -0,0 +1,6 @@ +import Foundation +import RxSwift + +public protocol FetchFavoriteSongsUseCase { + func execute() -> Single<[FavoriteSongEntity]> +} diff --git a/Projects/Domains/UserDomain/Interface/UseCase/FetchFruitDrawStatusUseCase.swift b/Projects/Domains/UserDomain/Interface/UseCase/FetchFruitDrawStatusUseCase.swift new file mode 100644 index 000000000..475d1c502 --- /dev/null +++ b/Projects/Domains/UserDomain/Interface/UseCase/FetchFruitDrawStatusUseCase.swift @@ -0,0 +1,5 @@ +import RxSwift + +public protocol FetchFruitDrawStatusUseCase { + func execute() -> Single +} diff --git a/Projects/Domains/UserDomain/Interface/UseCase/FetchFruitListUseCase.swift b/Projects/Domains/UserDomain/Interface/UseCase/FetchFruitListUseCase.swift new file mode 100644 index 000000000..5d5db31d6 --- /dev/null +++ b/Projects/Domains/UserDomain/Interface/UseCase/FetchFruitListUseCase.swift @@ -0,0 +1,5 @@ +import RxSwift + +public protocol FetchFruitListUseCase { + func execute() -> Single<[FruitEntity]> +} diff --git a/Projects/Domains/UserDomain/Interface/UseCase/FetchPlaylistUseCase.swift b/Projects/Domains/UserDomain/Interface/UseCase/FetchPlaylistUseCase.swift new file mode 100644 index 000000000..893de9add --- /dev/null +++ b/Projects/Domains/UserDomain/Interface/UseCase/FetchPlaylistUseCase.swift @@ -0,0 +1,6 @@ +import Foundation +import RxSwift + +public protocol FetchPlaylistUseCase { + func execute() -> Single<[PlaylistEntity]> +} diff --git a/Projects/Domains/UserDomain/Interface/UseCase/FetchUserInfoUseCase.swift b/Projects/Domains/UserDomain/Interface/UseCase/FetchUserInfoUseCase.swift new file mode 100644 index 000000000..68311c55c --- /dev/null +++ b/Projects/Domains/UserDomain/Interface/UseCase/FetchUserInfoUseCase.swift @@ -0,0 +1,6 @@ +import Foundation +import RxSwift + +public protocol FetchUserInfoUseCase { + func execute() -> Single +} diff --git a/Projects/Domains/UserDomain/Interface/UseCase/SetProfileUseCase.swift b/Projects/Domains/UserDomain/Interface/UseCase/SetProfileUseCase.swift new file mode 100644 index 000000000..484b410c7 --- /dev/null +++ b/Projects/Domains/UserDomain/Interface/UseCase/SetProfileUseCase.swift @@ -0,0 +1,7 @@ +import BaseDomainInterface +import Foundation +import RxSwift + +public protocol SetProfileUseCase { + func execute(image: String) -> Completable +} diff --git a/Projects/Domains/UserDomain/Interface/UseCase/SetUserNameUseCase.swift b/Projects/Domains/UserDomain/Interface/UseCase/SetUserNameUseCase.swift new file mode 100644 index 000000000..10e04d8aa --- /dev/null +++ b/Projects/Domains/UserDomain/Interface/UseCase/SetUserNameUseCase.swift @@ -0,0 +1,7 @@ +import BaseDomainInterface +import Foundation +import RxSwift + +public protocol SetUserNameUseCase { + func execute(name: String) -> Completable +} diff --git a/Projects/Domains/UserDomain/Interface/UseCase/WithdrawUserInfoUseCase.swift b/Projects/Domains/UserDomain/Interface/UseCase/WithdrawUserInfoUseCase.swift new file mode 100644 index 000000000..5ed6ce676 --- /dev/null +++ b/Projects/Domains/UserDomain/Interface/UseCase/WithdrawUserInfoUseCase.swift @@ -0,0 +1,7 @@ +import BaseDomainInterface +import Foundation +import RxSwift + +public protocol WithdrawUserInfoUseCase { + func execute() -> Completable +} diff --git a/Projects/Domains/UserDomain/Project.swift b/Projects/Domains/UserDomain/Project.swift new file mode 100644 index 000000000..36e5b069c --- /dev/null +++ b/Projects/Domains/UserDomain/Project.swift @@ -0,0 +1,33 @@ +import DependencyPlugin +import ProjectDescription +import ProjectDescriptionHelpers + +let project = Project.module( + name: ModulePaths.Domain.UserDomain.rawValue, + targets: [ + .interface( + module: .domain(.UserDomain), + dependencies: [ + .domain(target: .BaseDomain, type: .interface), + .domain(target: .SongsDomain, type: .interface) + ] + ), + .implements( + module: .domain(.UserDomain), + dependencies: [ + .domain(target: .BaseDomain), + .domain(target: .SongsDomain, type: .interface), + .domain(target: .UserDomain, type: .interface), + .domain(target: .LikeDomain, type: .interface) + ] + ), + .testing( + module: .domain(.UserDomain), + dependencies: [.domain(target: .UserDomain, type: .interface)] + ), + .tests( + module: .domain(.UserDomain), + dependencies: [.domain(target: .UserDomain)] + ) + ] +) diff --git a/Projects/Domains/UserDomain/Sources/API/UserAPI.swift b/Projects/Domains/UserDomain/Sources/API/UserAPI.swift new file mode 100644 index 000000000..3b88ee49d --- /dev/null +++ b/Projects/Domains/UserDomain/Sources/API/UserAPI.swift @@ -0,0 +1,150 @@ +import BaseDomain +import ErrorModule +import Foundation +import KeychainModule +import Moya + +public enum UserAPI { + case fetchUserInfo + case fetchPlaylist + case editPlaylistOrder(ids: [String]) + case deletePlaylist(ids: [String]) + case fetchFavoriteSongs + case editFavoriteSongsOrder(ids: [String]) + case deleteFavoriteList(ids: [String]) + case setProfile(image: String) + case setUserName(name: String) + case withdrawUserInfo + case fetchFruitList + case fetchFruitDrawStatus + case drawFruit +} + +extension UserAPI: WMAPI { + public var domain: WMDomain { + .user + } + + public var urlPath: String { + switch self { + case .fetchUserInfo: + return "/profile" + case .fetchPlaylist: + return "/playlists" + case .editPlaylistOrder: + return "/playlists" + case .deletePlaylist: + return "/playlists" + case .fetchFavoriteSongs: + return "/likes" + case .editFavoriteSongsOrder: + return "/likes" + case .deleteFavoriteList: + return "/likes" + case .setProfile: + return "/profile/image" + case .setUserName: + return "/profile/name" + case .withdrawUserInfo: + return "/delete" + case .fetchFruitList: + return "/fruit/list" + case .fetchFruitDrawStatus: + return "/fruit/status" + case .drawFruit: + return "/fruit/draw" + } + } + + public var method: Moya.Method { + switch self { + case .fetchUserInfo: + return .get + case .fetchPlaylist: + return .get + case .editPlaylistOrder: + return .patch + case .deletePlaylist: + return .delete + case .fetchFavoriteSongs: + return .get + case .editFavoriteSongsOrder: + return .patch + case .deleteFavoriteList: + return .delete + case .setProfile: + return .patch + case .setUserName: + return .patch + case .withdrawUserInfo: + return .delete + case .fetchFruitList: + return .get + case .fetchFruitDrawStatus: + return .get + case .drawFruit: + return .post + } + } + + public var task: Moya.Task { + switch self { + case .fetchUserInfo: + return .requestPlain + case .fetchPlaylist: + return .requestPlain + case let .editPlaylistOrder(ids): + return .requestJSONEncodable(EditPlaylistOrderRequestDTO(playlistKeys: ids)) + case let .deletePlaylist(ids): + return .requestParameters( + parameters: [ + "playlistKeys": ids.joined(separator: ",") + ], + encoding: URLEncoding.queryString + ) + case .fetchFavoriteSongs: + return .requestPlain + case let .editFavoriteSongsOrder(ids): + return .requestJSONEncodable(EditFavoriteSongsOrderRequestDTO(songIds: ids)) + case let .deleteFavoriteList(ids): + return .requestParameters( + parameters: [ + "songIds": ids.joined(separator: ",") + ], + encoding: URLEncoding.queryString + ) + case let .setProfile(image): + return .requestJSONEncodable(SetProfileRequestDTO(imageName: image)) + case let .setUserName(name): + return .requestJSONEncodable(SetUserNameRequestDTO(name: name)) + case .withdrawUserInfo: + return .requestPlain + case .fetchFruitList: + return .requestPlain + case .fetchFruitDrawStatus: + return .requestPlain + case .drawFruit: + return .requestPlain + } + } + + public var jwtTokenType: JwtTokenType { + switch self { + default: + return .accessToken + } + } + + public var errorMap: [Int: WMError] { + switch self { + default: + return [ + 400: .badRequest, + 401: .tokenExpired, + 404: .notFound, + 429: .tooManyRequest, + 500: .internalServerError + ] + } + } +} diff --git a/Projects/Domains/UserDomain/Sources/DataSource/RemoteUserDataSourceImpl.swift b/Projects/Domains/UserDomain/Sources/DataSource/RemoteUserDataSourceImpl.swift new file mode 100644 index 000000000..e9cad88df --- /dev/null +++ b/Projects/Domains/UserDomain/Sources/DataSource/RemoteUserDataSourceImpl.swift @@ -0,0 +1,78 @@ +import BaseDomain +import BaseDomainInterface +import Foundation +import RxSwift +import UserDomainInterface + +public final class RemoteUserDataSourceImpl: BaseRemoteDataSource, RemoteUserDataSource { + public func fetchUserInfo() -> Single { + return request(.fetchUserInfo) + .map(FetchUserResponseDTO.self) + .map { $0.toDomain() } + } + + public func setProfile(image: String) -> Completable { + return request(.setProfile(image: image)) + .asCompletable() + } + + public func setUserName(name: String) -> Completable { + return request(.setUserName(name: name)) + .asCompletable() + } + + public func fetchPlaylist() -> Single<[PlaylistEntity]> { + return request(.fetchPlaylist) + .map([PlaylistResponseDTO].self) + .map { $0.map { $0.toDomain() }} + } + + public func fetchFavoriteSong() -> Single<[FavoriteSongEntity]> { + return request(.fetchFavoriteSongs) + .map([FavoriteSongsResponseDTO].self) + .map { $0.map { $0.toDomain() } } + } + + public func editFavoriteSongsOrder(ids: [String]) -> Completable { + return request(.editFavoriteSongsOrder(ids: ids)) + .asCompletable() + } + + public func editPlaylistOrder(ids: [String]) -> Completable { + request(.editPlaylistOrder(ids: ids)) + .asCompletable() + } + + public func deletePlaylist(ids: [String]) -> Completable { + request(.deletePlaylist(ids: ids)) + .asCompletable() + } + + public func deleteFavoriteList(ids: [String]) -> Completable { + request(.deleteFavoriteList(ids: ids)) + .asCompletable() + } + + public func withdrawUserInfo() -> Completable { + request(.withdrawUserInfo) + .asCompletable() + } + + public func fetchFruitList() -> Single<[FruitEntity]> { + return request(.fetchFruitList) + .map([FruitListResponseDTO].self) + .map { $0.map { $0.toDomain() } } + } + + public func fetchFruitDrawStatus() -> Single { + return request(.fetchFruitDrawStatus) + .map(FruitDrawStatusResponseDTO.self) + .map { $0.toDomain() } + } + + public func drawFruit() -> Single { + return request(.drawFruit) + .map(FruitListResponseDTO.self) + .map { $0.toDomain() } + } +} diff --git a/Projects/Domains/UserDomain/Sources/Repository/UserRepositoryImpl.swift b/Projects/Domains/UserDomain/Sources/Repository/UserRepositoryImpl.swift new file mode 100644 index 000000000..d9402f15c --- /dev/null +++ b/Projects/Domains/UserDomain/Sources/Repository/UserRepositoryImpl.swift @@ -0,0 +1,75 @@ +import BaseDomainInterface +import ErrorModule +import LikeDomainInterface +import RxSwift +import UserDomainInterface +import Utility + +public final class UserRepositoryImpl: UserRepository { + private let remoteUserDataSource: any RemoteUserDataSource + + public init(remoteUserDataSource: any RemoteUserDataSource) { + self.remoteUserDataSource = remoteUserDataSource + } + + public func fetchUserInfo() -> Single { + remoteUserDataSource.fetchUserInfo() + .do(onSuccess: { entity in + PreferenceManager.shared.setUserInfo( + ID: entity.id, + platform: entity.platform, + profile: entity.profile, + name: entity.name, + itemCount: entity.itemCount + ) + }) + } + + public func setProfile(image: String) -> Completable { + remoteUserDataSource.setProfile(image: image) + } + + public func setUserName(name: String) -> Completable { + remoteUserDataSource.setUserName(name: name) + } + + public func fetchPlaylist() -> Single<[PlaylistEntity]> { + remoteUserDataSource.fetchPlaylist() + } + + public func fetchFavoriteSongs() -> Single<[FavoriteSongEntity]> { + remoteUserDataSource.fetchFavoriteSong() + } + + public func editFavoriteSongsOrder(ids: [String]) -> Completable { + remoteUserDataSource.editFavoriteSongsOrder(ids: ids) + } + + public func editPlaylistOrder(ids: [String]) -> Completable { + remoteUserDataSource.editPlaylistOrder(ids: ids) + } + + public func deletePlaylist(ids: [String]) -> Completable { + remoteUserDataSource.deletePlaylist(ids: ids) + } + + public func deleteFavoriteList(ids: [String]) -> Completable { + remoteUserDataSource.deleteFavoriteList(ids: ids) + } + + public func withdrawUserInfo() -> Completable { + remoteUserDataSource.withdrawUserInfo() + } + + public func fetchFruitList() -> Single<[FruitEntity]> { + remoteUserDataSource.fetchFruitList() + } + + public func fetchFruitDrawStatus() -> Single { + remoteUserDataSource.fetchFruitDrawStatus() + } + + public func drawFruit() -> Single { + remoteUserDataSource.drawFruit() + } +} diff --git a/Projects/Domains/UserDomain/Sources/RequestDTO/EditFavoriteSongsOrderRequestDTO.swift b/Projects/Domains/UserDomain/Sources/RequestDTO/EditFavoriteSongsOrderRequestDTO.swift new file mode 100644 index 000000000..31e803b94 --- /dev/null +++ b/Projects/Domains/UserDomain/Sources/RequestDTO/EditFavoriteSongsOrderRequestDTO.swift @@ -0,0 +1,5 @@ +import Foundation + +struct EditFavoriteSongsOrderRequestDTO: Encodable { + var songIds: [String] +} diff --git a/Projects/Domains/UserDomain/Sources/RequestDTO/EditPlaylistOrderRequestDTO.swift b/Projects/Domains/UserDomain/Sources/RequestDTO/EditPlaylistOrderRequestDTO.swift new file mode 100644 index 000000000..9109a6623 --- /dev/null +++ b/Projects/Domains/UserDomain/Sources/RequestDTO/EditPlaylistOrderRequestDTO.swift @@ -0,0 +1,5 @@ +import Foundation + +struct EditPlaylistOrderRequestDTO: Encodable { + var playlistKeys: [String] +} diff --git a/Projects/Domains/UserDomain/Sources/RequestDTO/SetProfileRequestDTO.swift b/Projects/Domains/UserDomain/Sources/RequestDTO/SetProfileRequestDTO.swift new file mode 100644 index 000000000..39867b9ac --- /dev/null +++ b/Projects/Domains/UserDomain/Sources/RequestDTO/SetProfileRequestDTO.swift @@ -0,0 +1,5 @@ +import Foundation + +struct SetProfileRequestDTO: Encodable { + var imageName: String +} diff --git a/Projects/Domains/UserDomain/Sources/RequestDTO/SetUserNameRequestDTO.swift b/Projects/Domains/UserDomain/Sources/RequestDTO/SetUserNameRequestDTO.swift new file mode 100644 index 000000000..38b40d141 --- /dev/null +++ b/Projects/Domains/UserDomain/Sources/RequestDTO/SetUserNameRequestDTO.swift @@ -0,0 +1,5 @@ +import Foundation + +struct SetUserNameRequestDTO: Encodable { + var name: String +} diff --git a/Projects/Domains/UserDomain/Sources/ResponseDTO/FavoriteSongsResponseDTO.swift b/Projects/Domains/UserDomain/Sources/ResponseDTO/FavoriteSongsResponseDTO.swift new file mode 100644 index 000000000..173039ea0 --- /dev/null +++ b/Projects/Domains/UserDomain/Sources/ResponseDTO/FavoriteSongsResponseDTO.swift @@ -0,0 +1,35 @@ +// +// ArtistListResponseDTO.swift +// DataMappingModule +// +// Created by KTH on 2023/02/01. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import Foundation +import SongsDomainInterface +import UserDomainInterface +import Utility + +public struct FavoriteSongsResponseDTO: Decodable { + public let songID, title: String + public let artists: [String] + public let views, likes: Int + public let date: Int + + enum CodingKeys: String, CodingKey { + case title, artists, date, views, likes + case songID = "videoId" + } +} + +public extension FavoriteSongsResponseDTO { + func toDomain() -> FavoriteSongEntity { + FavoriteSongEntity( + songID: songID, + title: title, + artist: artists.joined(separator: ", "), + like: likes + ) + } +} diff --git a/Projects/Domains/UserDomain/Sources/ResponseDTO/FetchUserResponseDTO.swift b/Projects/Domains/UserDomain/Sources/ResponseDTO/FetchUserResponseDTO.swift new file mode 100644 index 000000000..e9cc9bc13 --- /dev/null +++ b/Projects/Domains/UserDomain/Sources/ResponseDTO/FetchUserResponseDTO.swift @@ -0,0 +1,31 @@ +import Foundation +import UserDomainInterface + +public struct FetchUserResponseDTO: Decodable, Equatable { + public let itemCount, createdAt: Int + public let id, name, profile, platform: String + + public static func == (lhs: Self, rhs: Self) -> Bool { + return lhs.id == rhs.id + } + + enum CodingKeys: String, CodingKey { + case platform = "loginType" + case id = "handle" + case name, itemCount + case profile = "profileUrl" + case createdAt + } +} + +public extension FetchUserResponseDTO { + func toDomain() -> UserInfoEntity { + UserInfoEntity( + id: id, + platform: platform, + name: name, + profile: profile, + itemCount: itemCount + ) + } +} diff --git a/Projects/Domains/UserDomain/Sources/ResponseDTO/FruitDrawStatusResponseDTO.swift b/Projects/Domains/UserDomain/Sources/ResponseDTO/FruitDrawStatusResponseDTO.swift new file mode 100644 index 000000000..4b6527b98 --- /dev/null +++ b/Projects/Domains/UserDomain/Sources/ResponseDTO/FruitDrawStatusResponseDTO.swift @@ -0,0 +1,42 @@ +import Foundation +import UserDomainInterface + +public struct FruitDrawStatusResponseDTO: Decodable { + public let canDraw: Bool + public let lastDraw: FruitDrawStatusResponseDTO.LastDraw? +} + +public extension FruitDrawStatusResponseDTO { + struct LastDraw: Decodable { + public let drawAt: Double + public let fruit: FruitDrawStatusResponseDTO.LastDraw.Fruit + } +} + +public extension FruitDrawStatusResponseDTO.LastDraw { + struct Fruit: Decodable { + public let fruitID, name, imageURL: String + + enum CodingKeys: String, CodingKey { + case fruitID = "fruitId" + case name + case imageURL = "imageUrl" + } + } +} + +public extension FruitDrawStatusResponseDTO { + func toDomain() -> FruitDrawStatusEntity { + return FruitDrawStatusEntity( + canDraw: canDraw, + lastDraw: FruitDrawStatusEntity.LastDraw( + drawAt: lastDraw?.drawAt ?? 0, + fruit: FruitDrawStatusEntity.LastDraw.Fruit( + fruitID: lastDraw?.fruit.fruitID ?? "", + name: lastDraw?.fruit.name ?? "", + imageURL: lastDraw?.fruit.imageURL ?? "" + ) + ) + ) + } +} diff --git a/Projects/Domains/UserDomain/Sources/ResponseDTO/FruitListResponseDTO.swift b/Projects/Domains/UserDomain/Sources/ResponseDTO/FruitListResponseDTO.swift new file mode 100644 index 000000000..f6b072419 --- /dev/null +++ b/Projects/Domains/UserDomain/Sources/ResponseDTO/FruitListResponseDTO.swift @@ -0,0 +1,25 @@ +import Foundation +import UserDomainInterface + +public struct FruitListResponseDTO: Decodable { + public let quantity: Int? + public let fruitID, name, imageURL: String + + enum CodingKeys: String, CodingKey { + case quantity + case fruitID = "fruitId" + case name + case imageURL = "imageUrl" + } +} + +public extension FruitListResponseDTO { + func toDomain() -> FruitEntity { + .init( + quantity: quantity ?? -1, + fruitID: fruitID, + name: name, + imageURL: imageURL + ) + } +} diff --git a/Projects/Domains/UserDomain/Sources/ResponseDTO/PlaylistResponseDTO.swift b/Projects/Domains/UserDomain/Sources/ResponseDTO/PlaylistResponseDTO.swift new file mode 100644 index 000000000..4250207fe --- /dev/null +++ b/Projects/Domains/UserDomain/Sources/ResponseDTO/PlaylistResponseDTO.swift @@ -0,0 +1,38 @@ +// +// ArtistListResponseDTO.swift +// DataMappingModule +// +// Created by KTH on 2023/02/01. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import Foundation +import SongsDomainInterface +import UserDomainInterface + +public struct PlaylistResponseDTO: Decodable { + public let title: String + public let key: String? + public let user: PlaylistResponseDTO.User + public let imageUrl: String + public let songCount: Int + public let `private`: Bool + + public struct User: Decodable { + public let handle: String + public let name: String + } +} + +public extension PlaylistResponseDTO { + func toDomain() -> PlaylistEntity { + PlaylistEntity( + key: key ?? "", + title: title, + image: imageUrl, + songCount: songCount, + userId: user.handle, + private: `private` + ) + } +} diff --git a/Projects/Domains/UserDomain/Sources/UseCase/DeleteFavoriteListUseCaseImpl.swift b/Projects/Domains/UserDomain/Sources/UseCase/DeleteFavoriteListUseCaseImpl.swift new file mode 100644 index 000000000..34f4ae885 --- /dev/null +++ b/Projects/Domains/UserDomain/Sources/UseCase/DeleteFavoriteListUseCaseImpl.swift @@ -0,0 +1,18 @@ +import BaseDomainInterface +import Foundation +import RxSwift +import UserDomainInterface + +public struct DeleteFavoriteListUseCaseImpl: DeleteFavoriteListUseCase { + private let userRepository: any UserRepository + + public init( + userRepository: UserRepository + ) { + self.userRepository = userRepository + } + + public func execute(ids: [String]) -> Completable { + userRepository.deleteFavoriteList(ids: ids) + } +} diff --git a/Projects/Domains/UserDomain/Sources/UseCase/DeletePlaylistUseCaseImpl.swift b/Projects/Domains/UserDomain/Sources/UseCase/DeletePlaylistUseCaseImpl.swift new file mode 100644 index 000000000..89e4e78dd --- /dev/null +++ b/Projects/Domains/UserDomain/Sources/UseCase/DeletePlaylistUseCaseImpl.swift @@ -0,0 +1,18 @@ +import BaseDomainInterface +import Foundation +import RxSwift +import UserDomainInterface + +public struct DeletePlaylistUseCaseImpl: DeletePlaylistUseCase { + private let userRepository: any UserRepository + + public init( + userRepository: UserRepository + ) { + self.userRepository = userRepository + } + + public func execute(ids: [String]) -> Completable { + userRepository.deletePlaylist(ids: ids) + } +} diff --git a/Projects/Domains/UserDomain/Sources/UseCase/DrawFruitUseCaseImpl.swift b/Projects/Domains/UserDomain/Sources/UseCase/DrawFruitUseCaseImpl.swift new file mode 100644 index 000000000..8f681c41c --- /dev/null +++ b/Projects/Domains/UserDomain/Sources/UseCase/DrawFruitUseCaseImpl.swift @@ -0,0 +1,16 @@ +import RxSwift +import UserDomainInterface + +public struct DrawFruitUseCaseImpl: DrawFruitUseCase { + private let userRepository: any UserRepository + + public init( + userRepository: UserRepository + ) { + self.userRepository = userRepository + } + + public func execute() -> Single { + userRepository.drawFruit() + } +} diff --git a/Projects/Domains/UserDomain/Sources/UseCase/EditFavoriteSongsOrderUseCaseImpl.swift b/Projects/Domains/UserDomain/Sources/UseCase/EditFavoriteSongsOrderUseCaseImpl.swift new file mode 100644 index 000000000..7ee1f7f1b --- /dev/null +++ b/Projects/Domains/UserDomain/Sources/UseCase/EditFavoriteSongsOrderUseCaseImpl.swift @@ -0,0 +1,18 @@ +import BaseDomainInterface +import Foundation +import RxSwift +import UserDomainInterface + +public struct EditFavoriteSongsOrderUseCaseImpl: EditFavoriteSongsOrderUseCase { + private let userRepository: any UserRepository + + public init( + userRepository: UserRepository + ) { + self.userRepository = userRepository + } + + public func execute(ids: [String]) -> Completable { + userRepository.editFavoriteSongsOrder(ids: ids) + } +} diff --git a/Projects/Domains/UserDomain/Sources/UseCase/EditPlaylistOrderUseCaseImpl.swift b/Projects/Domains/UserDomain/Sources/UseCase/EditPlaylistOrderUseCaseImpl.swift new file mode 100644 index 000000000..37c705e5b --- /dev/null +++ b/Projects/Domains/UserDomain/Sources/UseCase/EditPlaylistOrderUseCaseImpl.swift @@ -0,0 +1,18 @@ +import BaseDomainInterface +import Foundation +import RxSwift +import UserDomainInterface + +public struct EditPlaylistOrderUseCaseImpl: EditPlaylistOrderUseCase { + private let userRepository: any UserRepository + + public init( + userRepository: UserRepository + ) { + self.userRepository = userRepository + } + + public func execute(ids: [String]) -> Completable { + userRepository.editPlaylistOrder(ids: ids) + } +} diff --git a/Projects/Services/DataModule/Sources/User/UseCases/FetchFavoriteSongsUseCaseImpl.swift b/Projects/Domains/UserDomain/Sources/UseCase/FetchFavoriteSongsUseCaseImpl.swift similarity index 86% rename from Projects/Services/DataModule/Sources/User/UseCases/FetchFavoriteSongsUseCaseImpl.swift rename to Projects/Domains/UserDomain/Sources/UseCase/FetchFavoriteSongsUseCaseImpl.swift index 78bf96d6a..d4198c5f8 100644 --- a/Projects/Services/DataModule/Sources/User/UseCases/FetchFavoriteSongsUseCaseImpl.swift +++ b/Projects/Domains/UserDomain/Sources/UseCase/FetchFavoriteSongsUseCaseImpl.swift @@ -8,13 +8,9 @@ import Foundation import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule +import UserDomainInterface public struct FetchFavoriteSongsUseCaseImpl: FetchFavoriteSongsUseCase { - - private let userRepository: any UserRepository public init( @@ -22,11 +18,8 @@ public struct FetchFavoriteSongsUseCaseImpl: FetchFavoriteSongsUseCase { ) { self.userRepository = userRepository } - + public func execute() -> Single<[FavoriteSongEntity]> { userRepository.fetchFavoriteSongs() } - - - } diff --git a/Projects/Domains/UserDomain/Sources/UseCase/FetchFruitDrawStatusUseCaseImpl.swift b/Projects/Domains/UserDomain/Sources/UseCase/FetchFruitDrawStatusUseCaseImpl.swift new file mode 100644 index 000000000..c64758644 --- /dev/null +++ b/Projects/Domains/UserDomain/Sources/UseCase/FetchFruitDrawStatusUseCaseImpl.swift @@ -0,0 +1,16 @@ +import RxSwift +import UserDomainInterface + +public struct FetchFruitDrawStatusUseCaseImpl: FetchFruitDrawStatusUseCase { + private let userRepository: any UserRepository + + public init( + userRepository: UserRepository + ) { + self.userRepository = userRepository + } + + public func execute() -> Single { + userRepository.fetchFruitDrawStatus() + } +} diff --git a/Projects/Domains/UserDomain/Sources/UseCase/FetchFruitListUseCaseImpl.swift b/Projects/Domains/UserDomain/Sources/UseCase/FetchFruitListUseCaseImpl.swift new file mode 100644 index 000000000..a4affc912 --- /dev/null +++ b/Projects/Domains/UserDomain/Sources/UseCase/FetchFruitListUseCaseImpl.swift @@ -0,0 +1,16 @@ +import RxSwift +import UserDomainInterface + +public struct FetchFruitListUseCaseImpl: FetchFruitListUseCase { + private let userRepository: any UserRepository + + public init( + userRepository: UserRepository + ) { + self.userRepository = userRepository + } + + public func execute() -> Single<[FruitEntity]> { + userRepository.fetchFruitList() + } +} diff --git a/Projects/Domains/UserDomain/Sources/UseCase/FetchPlaylistUseCaseImpl.swift b/Projects/Domains/UserDomain/Sources/UseCase/FetchPlaylistUseCaseImpl.swift new file mode 100644 index 000000000..5f6115f05 --- /dev/null +++ b/Projects/Domains/UserDomain/Sources/UseCase/FetchPlaylistUseCaseImpl.swift @@ -0,0 +1,17 @@ +import Foundation +import RxSwift +import UserDomainInterface + +public struct FetchPlaylistUseCaseImpl: FetchPlaylistUseCase { + private let userRepository: any UserRepository + + public init( + userRepository: UserRepository + ) { + self.userRepository = userRepository + } + + public func execute() -> Single<[PlaylistEntity]> { + userRepository.fetchPlaylist() + } +} diff --git a/Projects/Domains/UserDomain/Sources/UseCase/FetchUserInfoUseCaseImpl.swift b/Projects/Domains/UserDomain/Sources/UseCase/FetchUserInfoUseCaseImpl.swift new file mode 100644 index 000000000..da1d90210 --- /dev/null +++ b/Projects/Domains/UserDomain/Sources/UseCase/FetchUserInfoUseCaseImpl.swift @@ -0,0 +1,17 @@ +import Foundation +import RxSwift +import UserDomainInterface + +public struct FetchUserInfoUseCaseImpl: FetchUserInfoUseCase { + private let userRepository: any UserRepository + + public init( + userRepository: UserRepository + ) { + self.userRepository = userRepository + } + + public func execute() -> Single { + userRepository.fetchUserInfo() + } +} diff --git a/Projects/Domains/UserDomain/Sources/UseCase/SetProfileUseCaseImpl.swift b/Projects/Domains/UserDomain/Sources/UseCase/SetProfileUseCaseImpl.swift new file mode 100644 index 000000000..78a34b652 --- /dev/null +++ b/Projects/Domains/UserDomain/Sources/UseCase/SetProfileUseCaseImpl.swift @@ -0,0 +1,18 @@ +import BaseDomainInterface +import Foundation +import RxSwift +import UserDomainInterface + +public struct SetProfileUseCaseImpl: SetProfileUseCase { + private let userRepository: any UserRepository + + public init( + userRepository: UserRepository + ) { + self.userRepository = userRepository + } + + public func execute(image: String) -> Completable { + userRepository.setProfile(image: image) + } +} diff --git a/Projects/Domains/UserDomain/Sources/UseCase/SetUserNameUseCaseImpl.swift b/Projects/Domains/UserDomain/Sources/UseCase/SetUserNameUseCaseImpl.swift new file mode 100644 index 000000000..22ac0700c --- /dev/null +++ b/Projects/Domains/UserDomain/Sources/UseCase/SetUserNameUseCaseImpl.swift @@ -0,0 +1,18 @@ +import BaseDomainInterface +import Foundation +import RxSwift +import UserDomainInterface + +public struct SetUserNameUseCaseImpl: SetUserNameUseCase { + private let userRepository: any UserRepository + + public init( + userRepository: UserRepository + ) { + self.userRepository = userRepository + } + + public func execute(name: String) -> Completable { + userRepository.setUserName(name: name) + } +} diff --git a/Projects/Domains/UserDomain/Sources/UseCase/WithdrawUserInfoUseCaseImpl.swift b/Projects/Domains/UserDomain/Sources/UseCase/WithdrawUserInfoUseCaseImpl.swift new file mode 100644 index 000000000..a89f81c9b --- /dev/null +++ b/Projects/Domains/UserDomain/Sources/UseCase/WithdrawUserInfoUseCaseImpl.swift @@ -0,0 +1,18 @@ +import BaseDomainInterface +import Foundation +import RxSwift +import UserDomainInterface + +public struct WithdrawUserInfoUseCaseImpl: WithdrawUserInfoUseCase { + private let userRepository: any UserRepository + + public init( + userRepository: UserRepository + ) { + self.userRepository = userRepository + } + + public func execute() -> Completable { + userRepository.withdrawUserInfo() + } +} diff --git a/Projects/Domains/UserDomain/Testing/FetchFavoriteSongsUseCaseStub.swift b/Projects/Domains/UserDomain/Testing/FetchFavoriteSongsUseCaseStub.swift new file mode 100644 index 000000000..f37a39c63 --- /dev/null +++ b/Projects/Domains/UserDomain/Testing/FetchFavoriteSongsUseCaseStub.swift @@ -0,0 +1,26 @@ +import Foundation +import RxSwift +import UserDomainInterface + +public struct FetchFavoriteSongsUseCaseStub: FetchFavoriteSongsUseCase { + let items: [FavoriteSongEntity] = [ + .init( + songID: "fgSXAKsq-Vo", + title: "리와인드 (RE:WIND)", + artist: "이세계아이돌", + like: 10 + ), + .init( + songID: "6GQV6lhwgNs", + title: "팬서비스", + artist: "세구", + like: 100 + ) + ] + + public init() {} + + public func execute() -> Single<[FavoriteSongEntity]> { + return .just(items).delay(.seconds(1), scheduler: MainScheduler.instance) + } +} diff --git a/Projects/Domains/UserDomain/Testing/FetchPlaylistUseCaseStub.swift b/Projects/Domains/UserDomain/Testing/FetchPlaylistUseCaseStub.swift new file mode 100644 index 000000000..eb31b2137 --- /dev/null +++ b/Projects/Domains/UserDomain/Testing/FetchPlaylistUseCaseStub.swift @@ -0,0 +1,45 @@ +import Foundation +import RxSwift +import UserDomainInterface + +public struct FetchPlaylistUseCaseStub: FetchPlaylistUseCase { + let items: [PlaylistEntity] = [ + .init( + key: "123", + title: "우중충한 장마철 여름에 듣기 좋은 일본 시티팝 플레이리스트", + image: "", + songCount: 0, + userId: "", + private: true + ), + .init( + key: "1234", + title: "비내리는 도시, 세련된 무드 감각적인 팝송☔️ 분위기 있는 노래 모음", + image: "", + songCount: 1, + userId: "", + private: true + ), + .init( + key: "1424", + title: "[𝐏𝐥𝐚𝐲𝐥𝐢𝐬𝐭] 여름 밤, 퇴근길에 꽂는 플레이리스트🚃", + image: "", + songCount: 200, + userId: "", + private: false + ), + .init( + key: "1324", + title: "𝐏𝐥𝐚𝐲𝐥𝐢𝐬𝐭 벌써 여름이야? 내 방을 청량한 캘리포니아 해변으로 신나는 여름 팝송 𝐒𝐮𝐦𝐦𝐞𝐫 𝐢𝐬 𝐜𝐨𝐦𝐢𝐧𝐠 🌴", + image: "", + songCount: 1000, + userId: "", private: true + ) + ] + + public init() {} + + public func execute() -> Single<[PlaylistEntity]> { + return .just(items).delay(.seconds(1), scheduler: MainScheduler.instance) + } +} diff --git a/Projects/Domains/UserDomain/Testing/FetchUserInfoUserCaseSpy.swift b/Projects/Domains/UserDomain/Testing/FetchUserInfoUserCaseSpy.swift new file mode 100644 index 000000000..c5ad894ed --- /dev/null +++ b/Projects/Domains/UserDomain/Testing/FetchUserInfoUserCaseSpy.swift @@ -0,0 +1,9 @@ +import Foundation +import RxSwift +import UserDomainInterface + +public struct FetchUserInfoUseCaseSpy: FetchUserInfoUseCase { + public func execute() -> Single { + return .just(UserInfoEntity(id: "fakeid", platform: "naver", name: "fakename", profile: "", itemCount: 1)) + } +} diff --git a/Projects/Domains/UserDomain/Testing/WithdrawUserInfoUseCaseSpy.swift b/Projects/Domains/UserDomain/Testing/WithdrawUserInfoUseCaseSpy.swift new file mode 100644 index 000000000..8f6f6c7c1 --- /dev/null +++ b/Projects/Domains/UserDomain/Testing/WithdrawUserInfoUseCaseSpy.swift @@ -0,0 +1,10 @@ +import BaseDomainInterface +import Foundation +import RxSwift +import UserDomainInterface + +public struct WithdrawUserInfoUseCaseSpy: WithdrawUserInfoUseCase { + public func execute() -> Completable { + return .empty() + } +} diff --git a/Projects/Domains/UserDomain/Tests/UserDomainTest.swift b/Projects/Domains/UserDomain/Tests/UserDomainTest.swift new file mode 100644 index 000000000..e1c1e1670 --- /dev/null +++ b/Projects/Domains/UserDomain/Tests/UserDomainTest.swift @@ -0,0 +1,11 @@ +import XCTest + +final class UserDomainTests: XCTestCase { + override func setUpWithError() throws {} + + override func tearDownWithError() throws {} + + func testExample() { + XCTAssertEqual(1, 1) + } +} diff --git a/Projects/Features/ArtistFeature/.swiftlint.yml b/Projects/Features/ArtistFeature/.swiftlint.yml deleted file mode 100644 index 000f16665..000000000 --- a/Projects/Features/ArtistFeature/.swiftlint.yml +++ /dev/null @@ -1,21 +0,0 @@ -excluded: - - "**/*/NeedleGenerated.swift" - - "Tuist" - - -force_cast: # From https://realm.github.io/SwiftLint/force_cast.html - warning # 강제 캐스팅은 error에서 warning으로 변경 - -disabled_rules: - - trailing_whitespace - - vertical_whitespace - - colon - - comma - - comment_spacing # 주석 여백 - - mark # //MARK 관련 warning - - opening_brace # 괄호 열 때 줄바꿈을 했는지 안했는지, (안했으면 warning) - - line_length # 한줄에 글자 수 제한 , warning: 120, error: 200 (default) - - statement_position # if는 반드시 else로 끝나야한다. - - identifier_name #변수명 글자 수 제한 - - function_body_length #함수 바디 길이 50글자 제한 - diff --git a/Projects/Features/ArtistFeature/Interface/ArtistDetailFactory.swift b/Projects/Features/ArtistFeature/Interface/ArtistDetailFactory.swift new file mode 100644 index 000000000..21751cdc3 --- /dev/null +++ b/Projects/Features/ArtistFeature/Interface/ArtistDetailFactory.swift @@ -0,0 +1,7 @@ +import ArtistDomainInterface +import Foundation +import UIKit + +public protocol ArtistDetailFactory { + func makeView(artistID: String) -> UIViewController +} diff --git a/Projects/Features/ArtistFeature/Interface/ArtistFactory.swift b/Projects/Features/ArtistFeature/Interface/ArtistFactory.swift new file mode 100644 index 000000000..b7e455886 --- /dev/null +++ b/Projects/Features/ArtistFeature/Interface/ArtistFactory.swift @@ -0,0 +1,6 @@ +import Foundation +import UIKit + +public protocol ArtistFactory { + func makeView() -> UIViewController +} diff --git a/Projects/Features/ArtistFeature/Project.swift b/Projects/Features/ArtistFeature/Project.swift index ca60d5a6e..b14d12270 100644 --- a/Projects/Features/ArtistFeature/Project.swift +++ b/Projects/Features/ArtistFeature/Project.swift @@ -1,11 +1,30 @@ +import DependencyPlugin import ProjectDescription import ProjectDescriptionHelpers -let project = Project.makeModule( - name: "ArtistFeature", - product: .staticFramework, - dependencies: [ - .Project.Features.PlayerFeature +let project = Project.module( + name: ModulePaths.Feature.ArtistFeature.rawValue, + targets: [ + .interface( + module: .feature(.ArtistFeature), + dependencies: [.domain(target: .ArtistDomain, type: .interface)] + ), + .implements( + module: .feature(.ArtistFeature), + product: .staticFramework, + spec: .init( + resources: ["Resources/**"], + dependencies: [ + .feature(target: .BaseFeature), + .feature(target: .ArtistFeature, type: .interface), + .feature(target: .SignInFeature, type: .interface), + .domain(target: .ArtistDomain, type: .interface) + ] + ) + ), + .tests(module: .feature(.ArtistFeature), dependencies: [ + .feature(target: .ArtistFeature), + .domain(target: .ArtistDomain, type: .testing) + ]) ] - , resources: ["Resources/**"] ) diff --git a/Projects/Features/ArtistFeature/Resources/Artist.storyboard b/Projects/Features/ArtistFeature/Resources/Artist.storyboard index 2138980c0..3b918801a 100644 --- a/Projects/Features/ArtistFeature/Resources/Artist.storyboard +++ b/Projects/Features/ArtistFeature/Resources/Artist.storyboard @@ -1,9 +1,9 @@ - + - + @@ -138,16 +138,13 @@ - - - + - - - - - - + + + - + - + + + + + + @@ -522,8 +546,10 @@ + + @@ -531,10 +557,13 @@ + + + diff --git a/Projects/Features/ArtistFeature/Resources/ArtistPlayButtonGroupView.xib b/Projects/Features/ArtistFeature/Resources/ArtistPlayButtonGroupView.xib index d5db99a64..ac4bda3ec 100644 --- a/Projects/Features/ArtistFeature/Resources/ArtistPlayButtonGroupView.xib +++ b/Projects/Features/ArtistFeature/Resources/ArtistPlayButtonGroupView.xib @@ -1,9 +1,9 @@ - + - + @@ -11,9 +11,8 @@ - + - @@ -22,15 +21,15 @@ - + - + - - - - - - - - - + + + + + + + - - - + - - - - - - + + @@ -86,7 +67,7 @@ - + diff --git a/Projects/Features/ArtistFeature/Sources/Analytics/ArtistAnalyticsLog.swift b/Projects/Features/ArtistFeature/Sources/Analytics/ArtistAnalyticsLog.swift new file mode 100644 index 000000000..6cf400099 --- /dev/null +++ b/Projects/Features/ArtistFeature/Sources/Analytics/ArtistAnalyticsLog.swift @@ -0,0 +1,10 @@ +import LogManager + +enum ArtistAnalyticsLog: AnalyticsLogType { + case viewPage(pageName: String) + case clickArtistItem(artist: String) + case clickArtistDescriptionButton(artist: String) + case clickArtistSubscriptionButton(artist: String) + case clickArtistPlayButton(type: String, artist: String) + case clickArtistTabbarTab(tab: String, artist: String) +} diff --git a/Projects/Features/ArtistFeature/Sources/Components/ArtistComponent.swift b/Projects/Features/ArtistFeature/Sources/Components/ArtistComponent.swift index 1709110ad..da3b1e401 100644 --- a/Projects/Features/ArtistFeature/Sources/Components/ArtistComponent.swift +++ b/Projects/Features/ArtistFeature/Sources/Components/ArtistComponent.swift @@ -1,26 +1,20 @@ -// -// ArtistComponent.swift -// ArtistFeatureTests -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - +import ArtistDomainInterface +import ArtistFeatureInterface import Foundation -import UIKit import NeedleFoundation -import DomainModule +import UIKit public protocol ArtistDependency: Dependency { var fetchArtistListUseCase: any FetchArtistListUseCase { get } - var artistDetailComponent: ArtistDetailComponent { get } + var artistDetailFactory: any ArtistDetailFactory { get } } -public final class ArtistComponent: Component { - public func makeView() -> ArtistViewController { +public final class ArtistComponent: Component, ArtistFactory { + public func makeView() -> UIViewController { + let reactor = ArtistReactor(fetchArtistListUseCase: dependency.fetchArtistListUseCase) return ArtistViewController.viewController( - viewModel: ArtistViewModel(fetchArtistListUseCase: dependency.fetchArtistListUseCase), - artistDetailComponent: dependency.artistDetailComponent + reactor: reactor, + artistDetailFactory: dependency.artistDetailFactory ) } } diff --git a/Projects/Features/ArtistFeature/Sources/Components/ArtistDetailComponent.swift b/Projects/Features/ArtistFeature/Sources/Components/ArtistDetailComponent.swift index 6460c7751..576d2e5f9 100644 --- a/Projects/Features/ArtistFeature/Sources/Components/ArtistDetailComponent.swift +++ b/Projects/Features/ArtistFeature/Sources/Components/ArtistDetailComponent.swift @@ -1,25 +1,32 @@ -// -// ArtistDetailComponent.swift -// ArtistFeature -// -// Created by KTH on 2023/02/09. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - +import ArtistDomainInterface +import ArtistFeatureInterface +import BaseFeatureInterface import Foundation -import UIKit import NeedleFoundation -import DomainModule +import SignInFeatureInterface +import UIKit public protocol ArtistDetailDependency: Dependency { var artistMusicComponent: ArtistMusicComponent { get } + var fetchArtistDetailUseCase: any FetchArtistDetailUseCase { get } + var fetchArtistSubscriptionStatusUseCase: any FetchArtistSubscriptionStatusUseCase { get } + var subscriptionArtistUseCase: any SubscriptionArtistUseCase { get } + var textPopupFactory: any TextPopupFactory { get } + var signInFactory: any SignInFactory { get } } -public final class ArtistDetailComponent: Component { - public func makeView(model: ArtistListEntity) -> ArtistDetailViewController { +public final class ArtistDetailComponent: Component, ArtistDetailFactory { + public func makeView(artistID: String) -> UIViewController { return ArtistDetailViewController.viewController( - model: model, - artistMusicComponent: dependency.artistMusicComponent + viewModel: .init( + artistID: artistID, + fetchArtistDetailUseCase: dependency.fetchArtistDetailUseCase, + fetchArtistSubscriptionStatusUseCase: dependency.fetchArtistSubscriptionStatusUseCase, + subscriptionArtistUseCase: dependency.subscriptionArtistUseCase + ), + artistMusicComponent: dependency.artistMusicComponent, + textPopupFactory: dependency.textPopupFactory, + signInFactory: dependency.signInFactory ) } } diff --git a/Projects/Features/ArtistFeature/Sources/Components/ArtistMusicComponent.swift b/Projects/Features/ArtistFeature/Sources/Components/ArtistMusicComponent.swift index e9abe2e05..b3251233f 100644 --- a/Projects/Features/ArtistFeature/Sources/Components/ArtistMusicComponent.swift +++ b/Projects/Features/ArtistFeature/Sources/Components/ArtistMusicComponent.swift @@ -6,18 +6,16 @@ // Copyright © 2023 yongbeomkwak. All rights reserved. // +import ArtistDomainInterface import Foundation -import UIKit import NeedleFoundation -import DomainModule -import DataMappingModule public protocol ArtistMusicDependency: Dependency { var artistMusicContentComponent: ArtistMusicContentComponent { get } } public final class ArtistMusicComponent: Component { - public func makeView(model: ArtistListEntity?) -> ArtistMusicViewController { + public func makeView(model: ArtistEntity?) -> ArtistMusicViewController { return ArtistMusicViewController.viewController( model: model, artistMusicContentComponent: dependency.artistMusicContentComponent diff --git a/Projects/Features/ArtistFeature/Sources/Components/ArtistMusicContentComponent.swift b/Projects/Features/ArtistFeature/Sources/Components/ArtistMusicContentComponent.swift index 3aba75042..95846a0ab 100644 --- a/Projects/Features/ArtistFeature/Sources/Components/ArtistMusicContentComponent.swift +++ b/Projects/Features/ArtistFeature/Sources/Components/ArtistMusicContentComponent.swift @@ -1,27 +1,22 @@ -// -// ArtistMusicContentComponent.swift -// ArtistFeature -// -// Created by KTH on 2023/02/10. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - +import ArtistDomainInterface +import BaseFeature +import BaseFeatureInterface import Foundation -import UIKit import NeedleFoundation -import DomainModule -import DataMappingModule -import CommonFeature +import SignInFeatureInterface public protocol ArtistMusicContentDependency: Dependency { var fetchArtistSongListUseCase: any FetchArtistSongListUseCase { get } - var containSongsComponent: ContainSongsComponent { get } + var containSongsFactory: any ContainSongsFactory { get } + var signInFactory: any SignInFactory { get } + var textPopupFactory: any TextPopupFactory { get } + var songDetailPresenter: any SongDetailPresentable { get } } public final class ArtistMusicContentComponent: Component { public func makeView( type: ArtistSongSortType, - model: ArtistListEntity? + model: ArtistEntity? ) -> ArtistMusicContentViewController { return ArtistMusicContentViewController.viewController( viewModel: .init( @@ -29,7 +24,10 @@ public final class ArtistMusicContentComponent: Component Observable { + switch action { + case .viewDidLoad: + return viewDidLoad() + } + } + + public func reduce(state: State, mutation: Mutation) -> State { + var newState = state + switch mutation { + case let .updateArtistList(artistList): + newState.artistList = artistList + } + return newState + } +} + +// MARK: - Mutate +private extension ArtistReactor { + func viewDidLoad() -> Observable { + return fetchArtistListUseCase.execute() + .catchAndReturn([]) + .asObservable() + .map { [weak self] artistList in + guard let self, !artistList.isEmpty else { + DEBUG_LOG("데이터가 없습니다.") + return artistList + } + var newArtistList = artistList + + // Waterfall Grid UI가 기본적으로 왼쪽부터 쌓이게 되기에 첫번째 Cell을 hide 시킵니다 + if newArtistList.count == 1 { + let hiddenItem: ArtistEntity = self.makeHiddenArtistEntity() + newArtistList.insert(hiddenItem, at: 0) + } else { + newArtistList.swapAt(0, 1) + } + return newArtistList + } + .map(Mutation.updateArtistList) + } +} + +// MARK: - Reusable +private extension ArtistReactor { + func makeHiddenArtistEntity() -> ArtistEntity { + ArtistEntity( + id: "", + krName: "", + enName: "", + groupName: "", + title: "", + description: "", + personalColor: "", + roundImage: "", + squareImage: "", + graduated: false, + playlist: .init(latest: "", popular: "", oldest: ""), + isHiddenItem: false + ) + } +} diff --git a/Projects/Features/ArtistFeature/Sources/ViewControllers/ArtistDetailHeaderViewController.swift b/Projects/Features/ArtistFeature/Sources/ViewControllers/ArtistDetailHeaderViewController.swift index 1e7e05aac..64fbae61c 100644 --- a/Projects/Features/ArtistFeature/Sources/ViewControllers/ArtistDetailHeaderViewController.swift +++ b/Projects/Features/ArtistFeature/Sources/ViewControllers/ArtistDetailHeaderViewController.swift @@ -1,46 +1,38 @@ -// -// ArtistDetailHeaderViewController.swift -// ArtistFeature -// -// Created by KTH on 2023/01/21. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import Utility +import ArtistDomainInterface import DesignSystem -import RxSwift +import LogManager import RxCocoa -import DomainModule +import RxSwift +import UIKit +import Utility class ArtistDetailHeaderViewController: UIViewController, ViewControllerFromStoryBoard { - @IBOutlet weak var artistImageView: UIImageView! @IBOutlet weak var descriptionView: UIView! + @IBOutlet weak var flipButton: UIButton! - //Description Front + /// Description Front @IBOutlet weak var descriptionFrontView: UIView! @IBOutlet weak var descriptionFrontButton: UIButton! @IBOutlet weak var artistNameLabel: UILabel! @IBOutlet weak var artistNameLabelHeight: NSLayoutConstraint! @IBOutlet weak var artistGroupLabel: UILabel! @IBOutlet weak var artistIntroLabel: UILabel! - @IBOutlet weak var artistIntroLabelBottomConstraint: NSLayoutConstraint! - - //Description Back + + /// Description Back @IBOutlet weak var descriptionBackView: UIView! @IBOutlet weak var descriptionBackButton: UIButton! @IBOutlet weak var scrollView: UIScrollView! @IBOutlet weak var introTitleLabel: UILabel! @IBOutlet weak var introDescriptionLabel: UILabel! - + var disposeBag: DisposeBag = DisposeBag() - var isBack: Bool = false + private var model: ArtistEntity? deinit { DEBUG_LOG("\(Self.self) Deinit") } - + override func viewDidLoad() { super.viewDidLoad() configureUI() @@ -48,155 +40,156 @@ class ArtistDetailHeaderViewController: UIViewController, ViewControllerFromStor } public static func viewController() -> ArtistDetailHeaderViewController { - let viewController = ArtistDetailHeaderViewController.viewController(storyBoardName: "Artist", bundle: Bundle.module) + let viewController = ArtistDetailHeaderViewController.viewController( + storyBoardName: "Artist", + bundle: Bundle.module + ) return viewController } } extension ArtistDetailHeaderViewController { - func update(model: ArtistListEntity) { - let artistName: String = model.name - let artistEngName: String = model.ID.capitalizingFirstLetter + func update(model: ArtistEntity) { + self.model = model + let artistKrName: String = model.krName + let artistEnName: String = model.enName let artistNameAttributedString = NSMutableAttributedString( - string: artistName + " " + artistEngName, - attributes: [.font: DesignSystemFontFamily.Pretendard.bold.font(size: 24), - .foregroundColor: DesignSystemAsset.GrayColor.gray900.color, - .kern: -0.5] + string: artistKrName + " " + artistEnName, + attributes: [ + .font: UIFont.WMFontSystem.t1(weight: .bold).font, + .foregroundColor: DesignSystemAsset.BlueGrayColor.gray900.color, + .kern: -0.5 + ] ) - let artistNameRange = (artistNameAttributedString.string as NSString).range(of: artistName) - let artistEngNameRange = (artistNameAttributedString.string as NSString).range(of: artistEngName) - + let artistKrNameRange = (artistNameAttributedString.string as NSString).range(of: artistKrName) + let artistEnNameRange = (artistNameAttributedString.string as NSString).range(of: artistEnName) + artistNameAttributedString.addAttributes( - [.font: DesignSystemFontFamily.Pretendard.light.font(size: 14), - .foregroundColor: DesignSystemAsset.GrayColor.gray900.color.withAlphaComponent(0.6), - .kern: -0.5], - range: artistEngNameRange + [ + .font: UIFont.WMFontSystem.t6(weight: .light).font, + .foregroundColor: DesignSystemAsset.BlueGrayColor.gray900.color.withAlphaComponent(0.6), + .kern: -0.5 + ], + range: artistEnNameRange ) - + let margin: CGFloat = 104.0 let availableWidth: CGFloat = APP_WIDTH() - (((140 * APP_WIDTH()) / 375.0) + margin) let artistNameWidth: CGFloat = artistNameAttributedString.width(containerHeight: 36) - + DEBUG_LOG("availableWidth: \(availableWidth)") - DEBUG_LOG("\(model.name): \(artistNameWidth)") - - artistNameAttributedString.addAttributes( - [.font: DesignSystemFontFamily.Pretendard.bold.font(size: availableWidth >= artistNameWidth ? 24 : 20)], - range: artistNameRange + DEBUG_LOG("\(model.krName): \(artistNameWidth)") + + if availableWidth >= artistNameWidth { + artistNameAttributedString.addAttributes( + [.font: UIFont.WMFontSystem.t1(weight: .bold).font], + range: artistKrNameRange + ) + } else { + if model.krName.count >= 9 { // ex: 김치만두번영택사스가, 캘리칼리 데이비슨 + artistNameAttributedString.addAttributes( + [.font: UIFont.WMFontSystem.t4(weight: .bold).font], + range: artistKrNameRange + ) + } else { + artistNameAttributedString.addAttributes( + [.font: UIFont.WMFontSystem.t3(weight: .bold).font], + range: artistKrNameRange + ) + } + } + + artistNameLabelHeight.constant = (availableWidth >= artistNameWidth) ? + 36 : ceil(artistNameAttributedString.height(containerWidth: availableWidth)) + artistNameLabel.attributedText = artistNameAttributedString + + artistGroupLabel.text = (model.id == "woowakgood") ? + "" : model.groupName + (model.graduated ? " · 졸업" : "") + artistGroupLabel.setTextWithAttributes( + lineHeight: UIFont.WMFontSystem.t6(weight: .medium).lineHeight, + lineBreakMode: .byCharWrapping ) - self.artistNameLabelHeight.constant = - (availableWidth >= artistNameWidth) ? 36 : ceil(artistNameAttributedString.height(containerWidth: availableWidth)) - - self.artistNameLabel.attributedText = artistNameAttributedString - - self.artistGroupLabel.text = model.group + (model.graduated ? " · 졸업" : "") - - let artistIntroParagraphStyle = NSMutableParagraphStyle() - artistIntroParagraphStyle.lineHeightMultiple = (APP_WIDTH() < 375) ? 0 : 1.44 - - let artistIntroAttributedString = NSMutableAttributedString( - string: model.title, - attributes: [.font: DesignSystemFontFamily.Pretendard.medium.font(size: 14), - .foregroundColor: DesignSystemAsset.GrayColor.gray900.color, - .paragraphStyle: artistIntroParagraphStyle, - .kern: -0.5] + artistIntroLabel.text = model.title + artistIntroLabel.setTextWithAttributes( + lineHeight: UIFont.WMFontSystem.t6(weight: .medium).lineHeight, + lineBreakMode: .byWordWrapping, + hangulWordPriority: true ) - self.artistIntroLabel.lineBreakMode = .byCharWrapping - self.artistIntroLabel.attributedText = artistIntroAttributedString - self.artistIntroLabelBottomConstraint.constant = (APP_WIDTH() < 375) ? 0 : 16 - - self.introTitleLabel.text = "소개글" - let artistIntroDescriptionParagraphStyle = NSMutableParagraphStyle() - artistIntroDescriptionParagraphStyle.lineHeightMultiple = 1.26 - - let artistIntroDescriptionAttributedString = NSMutableAttributedString( - string: model.description, - attributes: [.font: DesignSystemFontFamily.Pretendard.light.font(size: 12), - .foregroundColor: DesignSystemAsset.GrayColor.gray900.color, - .paragraphStyle: artistIntroDescriptionParagraphStyle, - .kern: -0.5] + + introDescriptionLabel.text = model.description + introDescriptionLabel.setTextWithAttributes( + lineHeight: UIFont.WMFontSystem.t7(weight: .light).lineHeight, + lineBreakMode: .byCharWrapping ) - self.introDescriptionLabel.attributedText = artistIntroDescriptionAttributedString - - let originImageURLString: String = WMImageAPI.fetchArtistWithSquare(id: model.ID, version: model.imageSquareVersion).toString - let encodedImageURLString: String = originImageURLString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? originImageURLString + + let encodedImageURLString: String = model.squareImage + .addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? model.squareImage + artistImageView.kf.setImage( with: URL(string: encodedImageURLString), placeholder: nil, options: [.transition(.fade(0.2))] ) - self.view.layoutIfNeeded() } - - private func bind() { - let mergeObservable = Observable.merge(descriptionFrontButton.rx.tap.map { _ in () }, - descriptionBackButton.rx.tap.map { _ in () }) - - mergeObservable - .subscribe(onNext: { [weak self] _ in - guard let `self` = self else { return } - self.flip() - }).disposed(by: disposeBag) +} + +private extension ArtistDetailHeaderViewController { + func bind() { + flipButton.rx.tap + .bind(with: self) { owner, _ in + LogManager.analytics( + ArtistAnalyticsLog.clickArtistDescriptionButton(artist: owner.model?.id ?? "") + ) + owner.flipArtistIntro() + } + .disposed(by: disposeBag) } - - private func flip() { - if self.isBack { - self.isBack = false - self.descriptionFrontView.isHidden = self.isBack - self.descriptionBackView.isHidden = !self.descriptionFrontView.isHidden - - UIView.transition(with: self.descriptionView, - duration: 0.3, - options: .transitionFlipFromLeft, - animations: nil, - completion: { _ in - }) - }else{ - self.isBack = true - self.descriptionFrontView.isHidden = self.isBack - self.descriptionBackView.isHidden = !self.descriptionFrontView.isHidden - - UIView.transition(with: self.descriptionView, - duration: 0.3, - options: .transitionFlipFromRight, - animations: nil, - completion: { _ in - }) - } + + func flipArtistIntro() { + descriptionFrontView.isHidden = descriptionFrontView.isHidden ? false : true + descriptionBackView.isHidden = !descriptionFrontView.isHidden + + UIView.transition( + with: descriptionView, + duration: 0.3, + options: descriptionFrontView.isHidden ? .transitionFlipFromRight : .transitionFlipFromLeft, + animations: nil, + completion: { _ in + } + ) } - - private func configureUI() { + + func configureUI() { descriptionFrontButton.setImage(DesignSystemAsset.Artist.documentOff.image, for: .normal) descriptionBackButton.setImage(DesignSystemAsset.Artist.documentOn.image, for: .normal) - + descriptionView.backgroundColor = UIColor.white.withAlphaComponent(0.4) descriptionView.layer.borderWidth = 1 - descriptionView.layer.borderColor = DesignSystemAsset.GrayColor.gray25.color.cgColor + descriptionView.layer.borderColor = DesignSystemAsset.BlueGrayColor.gray25.color.cgColor descriptionView.layer.cornerRadius = 8 - + descriptionFrontView.isHidden = false descriptionBackView.isHidden = true - - artistGroupLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 14) - artistGroupLabel.textColor = DesignSystemAsset.GrayColor.gray900.color - artistGroupLabel.setTextWithAttributes(kernValue: -0.5) - - artistIntroLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 14) - artistIntroLabel.textColor = DesignSystemAsset.GrayColor.gray900.color - artistIntroLabel.textAlignment = .left - - introTitleLabel.font = DesignSystemFontFamily.Pretendard.bold.font(size: 14) - introTitleLabel.textColor = DesignSystemAsset.GrayColor.gray900.color + + artistGroupLabel.font = UIFont.WMFontSystem.t6(weight: .medium).font + artistGroupLabel.textColor = DesignSystemAsset.BlueGrayColor.gray900.color + artistGroupLabel.numberOfLines = 1 + + artistIntroLabel.font = UIFont.WMFontSystem.t6(weight: .medium).font + artistIntroLabel.textColor = DesignSystemAsset.BlueGrayColor.gray900.color + artistIntroLabel.numberOfLines = 0 + + introTitleLabel.text = "소개글" + introTitleLabel.font = UIFont.WMFontSystem.t6(weight: .bold).font + introTitleLabel.textColor = DesignSystemAsset.BlueGrayColor.gray900.color introTitleLabel.setTextWithAttributes(kernValue: -0.5) - introDescriptionLabel.font = DesignSystemFontFamily.Pretendard.light.font(size: 12) - introDescriptionLabel.textColor = DesignSystemAsset.GrayColor.gray900.color - introDescriptionLabel.textAlignment = .left - introDescriptionLabel.lineBreakMode = .byWordWrapping - introDescriptionLabel.setTextWithAttributes(kernValue: -0.5) + introDescriptionLabel.font = UIFont.WMFontSystem.t7(weight: .light).font + introDescriptionLabel.textColor = DesignSystemAsset.BlueGrayColor.gray900.color + introDescriptionLabel.numberOfLines = 0 - scrollView.scrollIndicatorInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: -3) + scrollView.verticalScrollIndicatorInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: -3) } } diff --git a/Projects/Features/ArtistFeature/Sources/ViewControllers/ArtistDetailViewController.swift b/Projects/Features/ArtistFeature/Sources/ViewControllers/ArtistDetailViewController.swift index 58e737242..1a0baaac7 100644 --- a/Projects/Features/ArtistFeature/Sources/ViewControllers/ArtistDetailViewController.swift +++ b/Projects/Features/ArtistFeature/Sources/ViewControllers/ArtistDetailViewController.swift @@ -1,103 +1,208 @@ -// -// ArtistDetailViewController.swift -// ArtistFeature -// -// Created by KTH on 2023/01/07. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import Utility +import ArtistDomainInterface +import BaseFeatureInterface import DesignSystem -import RxSwift +import LogManager +import NVActivityIndicatorView import RxCocoa -import DomainModule -import DataMappingModule +import RxSwift +import SignInFeatureInterface +import UIKit +import Utility public final class ArtistDetailViewController: UIViewController, ViewControllerFromStoryBoard, ContainerViewType { - @IBOutlet weak var gradationView: UIView! @IBOutlet weak var backButton: UIButton! + @IBOutlet weak var subscriptionButton: UIButton! @IBOutlet weak var headerContentView: UIView! @IBOutlet weak var headerContentViewTopConstraint: NSLayoutConstraint! - @IBOutlet weak public var contentView: UIView! - + @IBOutlet public weak var contentView: UIView! + @IBOutlet weak var activityIndicator: NVActivityIndicatorView! + private lazy var headerViewController: ArtistDetailHeaderViewController = { let header = ArtistDetailHeaderViewController.viewController() return header }() - - private lazy var contentViewController: ArtistMusicViewController = { - let content = artistMusicComponent.makeView(model: model) - return content - }() - var gradientLayer = CAGradientLayer() - var model: ArtistListEntity? - var disposeBag: DisposeBag = DisposeBag() - - var artistMusicComponent: ArtistMusicComponent! - + private var contentViewController: ArtistMusicViewController? + + private let gradientLayer = CAGradientLayer() + private var artistMusicComponent: ArtistMusicComponent! + private var textPopupFactory: TextPopupFactory! + private var signInFactory: SignInFactory! + + private var viewModel: ArtistDetailViewModel! + private lazy var input = ArtistDetailViewModel.Input() + private lazy var output = viewModel.transform(from: input) + private let disposeBag = DisposeBag() + private var maxHeaderHeight: CGFloat { let margin: CGFloat = 8.0 + 20.0 let width = (140 * APP_WIDTH()) / 375.0 let height = (180 * width) / 140.0 return -(margin + height) } + private let minHeaderHeight: CGFloat = 0 private var previousScrollOffset: [CGFloat] = [0, 0, 0] deinit { - DEBUG_LOG("\(Self.self) Deinit") + LogManager.printDebug("\(Self.self) Deinit") } - public override func viewDidLoad() { + override public func viewDidLoad() { super.viewDidLoad() configureUI() - configureHeader() - configureContent() + outputBind() + inputBind() + } + + override public func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + LogManager.analytics(ArtistAnalyticsLog.viewPage(pageName: "artist_detail")) } - - public override func viewDidLayoutSubviews() { + + override public func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() self.gradientLayer.frame = self.gradationView.bounds } - + public static func viewController( - model: ArtistListEntity? = nil, - artistMusicComponent: ArtistMusicComponent + viewModel: ArtistDetailViewModel, + artistMusicComponent: ArtistMusicComponent, + textPopupFactory: TextPopupFactory, + signInFactory: SignInFactory ) -> ArtistDetailViewController { let viewController = ArtistDetailViewController.viewController(storyBoardName: "Artist", bundle: Bundle.module) - viewController.model = model + viewController.viewModel = viewModel viewController.artistMusicComponent = artistMusicComponent + viewController.textPopupFactory = textPopupFactory + viewController.signInFactory = signInFactory return viewController } - + @IBAction func backButtonAction(_ sender: Any) { self.navigationController?.popViewController(animated: true) } } -extension ArtistDetailViewController { - private func configureUI() { - backButton.setImage(DesignSystemAsset.Navigation.back.image, for: .normal) +private extension ArtistDetailViewController { + func outputBind() { + output.dataSource + .filter { $0 != nil } + .compactMap { $0 } + .bind(with: self) { owner, entity in + owner.configureGradation(model: entity) + owner.configureHeader(model: entity) + owner.configureContent(model: entity) + owner.activityIndicator.stopAnimating() + } + .disposed(by: disposeBag) - guard let model = self.model else { return } + output.isSubscription + .skip(1) + .bind { [subscriptionButton] isSubscription in + subscriptionButton?.isHidden = false + subscriptionButton?.isSelected = isSubscription + } + .disposed(by: disposeBag) - let flatColor: String = model.color.first?.first ?? "" + output.showLogin + .bind(with: self) { owner, entry in + let viewController = owner.textPopupFactory.makeView( + text: "로그인이 필요한 서비스입니다.\n로그인 하시겠습니까?", + cancelButtonIsHidden: false, + confirmButtonText: nil, + cancelButtonText: nil, + completion: { + let log = CommonAnalyticsLog.clickLoginButton(entry: entry) + LogManager.analytics(log) + let loginVC = owner.signInFactory.makeView() + loginVC.modalPresentationStyle = .fullScreen + owner.present(loginVC, animated: true) + }, + cancelCompletion: {} + ) + owner.showBottomSheet(content: viewController) + } + .disposed(by: disposeBag) + + output.showToast + .bind(with: self) { owner, message in + owner.showToast(text: message, options: [.tabBar]) + } + .disposed(by: disposeBag) + + output.occurredError + .bind(with: self) { owner, message in + owner.showBottomSheet( + content: owner.textPopupFactory.makeView( + text: message, + cancelButtonIsHidden: true, + confirmButtonText: "확인", + cancelButtonText: nil, + completion: { + owner.navigationController?.popViewController(animated: true) + }, + cancelCompletion: nil + ), + dismissOnOverlayTapAndPull: false + ) + } + .disposed(by: disposeBag) + + output.showWarningNotification + .bind(with: self) { owner, _ in + let viewController = owner.textPopupFactory.makeView( + text: "기기 알림이 꺼져있습니다.\n설정에서 알림을 켜주세요.", + cancelButtonIsHidden: false, + confirmButtonText: "설정 바로가기", + cancelButtonText: "확인", + completion: { + guard let openSettingsURL = URL(string: UIApplication.openSettingsURLString) else { return } + UIApplication.shared.open(openSettingsURL) + }, + cancelCompletion: {} + ) + owner.showBottomSheet(content: viewController) + } + .disposed(by: disposeBag) + } + + func inputBind() { + input.fetchArtistDetail.onNext(()) + input.fetchArtistSubscriptionStatus.onNext(()) + + subscriptionButton.rx.tap + .throttle(.milliseconds(1000), latest: false, scheduler: MainScheduler.instance) + .bind(to: input.didTapSubscription) + .disposed(by: disposeBag) + } + + func configureUI() { + backButton.setImage(DesignSystemAsset.Navigation.back.image, for: .normal) + subscriptionButton.setImage(DesignSystemAsset.Artist.subscriptionOff.image, for: .normal) + subscriptionButton.setImage(DesignSystemAsset.Artist.subscriptionOn.image, for: .selected) + subscriptionButton.isHidden = true + activityIndicator.color = DesignSystemAsset.PrimaryColor.point.color + activityIndicator.type = .circleStrokeSpin + activityIndicator.startAnimating() + } + + func configureGradation(model: ArtistEntity) { + let flatColor: String = model.personalColor guard !flatColor.isEmpty else { return } - + let startAlpha: CGFloat = 0.6 let value: CGFloat = 0.1 - let colors = Array(0...Int(startAlpha*10)).enumerated().map { (i, _) in + let colors = Array(0 ... Int(startAlpha * 10)).enumerated().map { i, _ in return colorFromRGB(flatColor, alpha: startAlpha - (CGFloat(i) * value)).cgColor } - + gradientLayer.colors = colors gradationView.layer.addSublayer(gradientLayer) } - - private func configureHeader() { + + func configureHeader(model: ArtistEntity) { self.addChild(headerViewController) self.headerContentView.addSubview(headerViewController.view) headerViewController.didMove(toParent: self) @@ -105,12 +210,11 @@ extension ArtistDetailViewController { headerViewController.view.snp.makeConstraints { $0.edges.equalTo(headerContentView) } - - guard let model = self.model else { return } headerViewController.update(model: model) } - - private func configureContent() { + + func configureContent(model: ArtistEntity) { + contentViewController = artistMusicComponent.makeView(model: model) self.add(asChildViewController: contentViewController) } } @@ -122,18 +226,21 @@ extension ArtistDetailViewController { let absoluteBottom: CGFloat = scrollView.contentSize.height - scrollView.frame.size.height let isScrollingDown = scrollDiff > 0 && scrollView.contentOffset.y > absoluteTop let isScrollingUp = scrollDiff < 0 && scrollView.contentOffset.y < absoluteBottom - + if scrollView.contentOffset.y < absoluteBottom { var newHeight = self.headerContentViewTopConstraint.constant - + if isScrollingDown { newHeight = max(self.maxHeaderHeight, self.headerContentViewTopConstraint.constant - abs(scrollDiff)) - }else if isScrollingUp { + } else if isScrollingUp { if scrollView.contentOffset.y <= abs(self.maxHeaderHeight) { - newHeight = min(self.minHeaderHeight, self.headerContentViewTopConstraint.constant + abs(scrollDiff)) + newHeight = min( + self.minHeaderHeight, + self.headerContentViewTopConstraint.constant + abs(scrollDiff) + ) } } - + if newHeight != self.headerContentViewTopConstraint.constant { self.headerContentViewTopConstraint.constant = newHeight self.updateHeader() @@ -142,7 +249,7 @@ extension ArtistDetailViewController { self.previousScrollOffset[i] = scrollView.contentOffset.y } } - + private func updateHeader() { let openAmount = self.headerContentViewTopConstraint.constant + abs(self.maxHeaderHeight) let percentage = openAmount / abs(self.maxHeaderHeight) diff --git a/Projects/Features/ArtistFeature/Sources/ViewControllers/ArtistMusicContentViewController.swift b/Projects/Features/ArtistFeature/Sources/ViewControllers/ArtistMusicContentViewController.swift index 7ef98ea53..f3d57ef88 100644 --- a/Projects/Features/ArtistFeature/Sources/ViewControllers/ArtistMusicContentViewController.swift +++ b/Projects/Features/ArtistFeature/Sources/ViewControllers/ArtistMusicContentViewController.swift @@ -1,76 +1,92 @@ -// -// ArtistMusicContentViewController.swift -// ArtistFeature -// -// Created by KTH on 2023/01/07. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import Utility -import DesignSystem -import RxSwift -import RxCocoa +import ArtistDomainInterface import BaseFeature -import CommonFeature -import DataMappingModule -import DomainModule +import BaseFeatureInterface +import DesignSystem +import Localization +import LogManager import NVActivityIndicatorView +import RxCocoa +import RxSwift +import SignInFeatureInterface +import SongsDomainInterface +import UIKit +import Utility -public class ArtistMusicContentViewController: BaseViewController, ViewControllerFromStoryBoard, SongCartViewType { +public final class ArtistMusicContentViewController: + BaseViewController, ViewControllerFromStoryBoard, SongCartViewType { @IBOutlet weak var tableView: UITableView! @IBOutlet weak var activityIndidator: NVActivityIndicatorView! - + @IBOutlet weak var songCartOnView: UIView! + @IBOutlet weak var songCartOnViewHeightConstraint: NSLayoutConstraint! + public var songCartView: SongCartView! public var bottomSheetView: BottomSheetView! - var containSongsComponent: ContainSongsComponent! - + private var containSongsFactory: ContainSongsFactory! + private var signInFactory: SignInFactory! + private var textPopupFactory: TextPopupFactory! + private var songDetailPresenter: SongDetailPresentable! + private var viewModel: ArtistMusicContentViewModel! - lazy var input = ArtistMusicContentViewModel.Input(pageID: BehaviorRelay(value: 1)) + lazy var input = ArtistMusicContentViewModel.Input() lazy var output = viewModel.transform(from: input) - var disposeBag = DisposeBag() + private let disposeBag = DisposeBag() + private var isFromArtistScene: Bool = false - deinit { DEBUG_LOG("\(Self.self) Deinit") } + deinit { + LogManager.printDebug("\(Self.self) Deinit") + } - public override func viewDidLoad() { + override public func viewDidLoad() { super.viewDidLoad() configureUI() inputBind() outputBind() } - - public override func viewWillDisappear(_ animated: Bool) { + + override public func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) self.input.allSongSelected.onNext(false) } - + public static func viewController( viewModel: ArtistMusicContentViewModel, - containSongsComponent: ContainSongsComponent + containSongsFactory: ContainSongsFactory, + signInFactory: SignInFactory, + textPopupFactory: TextPopupFactory, + songDetailPresenter: SongDetailPresentable ) -> ArtistMusicContentViewController { - let viewController = ArtistMusicContentViewController.viewController(storyBoardName: "Artist", bundle: Bundle.module) + let viewController = ArtistMusicContentViewController.viewController( + storyBoardName: "Artist", + bundle: Bundle.module + ) viewController.viewModel = viewModel - viewController.containSongsComponent = containSongsComponent + viewController.containSongsFactory = containSongsFactory + viewController.signInFactory = signInFactory + viewController.textPopupFactory = textPopupFactory + viewController.songDetailPresenter = songDetailPresenter return viewController } } -extension ArtistMusicContentViewController { - private func inputBind() { +private extension ArtistMusicContentViewController { + func inputBind() { tableView.rx .setDelegate(self) .disposed(by: disposeBag) - + tableView.rx.willDisplayCell .map { $1 } - .withLatestFrom(output.dataSource, resultSelector: { (indexPath, datasource) -> (IndexPath, [ArtistSongListEntity]) in - return (indexPath, datasource) - }) - .filter{ (indexPath, datasources) -> Bool in - return indexPath.item == datasources.count-1 + .withLatestFrom( + output.dataSource, + resultSelector: { indexPath, datasource -> (IndexPath, [ArtistSongListEntity]) in + return (indexPath, datasource) + } + ) + .filter { indexPath, datasources -> Bool in + return indexPath.item == datasources.count - 1 } .withLatestFrom(output.canLoadMore) - .filter{ $0 } + .filter { $0 } .map { _ in return () } .bind(to: rx.loadMore) .disposed(by: disposeBag) @@ -80,81 +96,183 @@ extension ArtistMusicContentViewController { .bind(to: input.songTapped) .disposed(by: disposeBag) } - - private func outputBind() { + + func outputBind() { output.dataSource .skip(1) .withLatestFrom(output.indexOfSelectedSongs) { ($0, $1) } - .do(onNext: { [weak self] (dataSource, songs) in - guard let `self` = self else { return } + .do(onNext: { [weak self] dataSource, songs in + guard let self = self else { return } + if dataSource.isEmpty { + let height = self.tableView.frame.height / 3 * 2 + let warningView = WarningView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: height)) + warningView.text = "아티스트 곡이 없습니다." + self.tableView.tableFooterView = warningView + } else { + self.tableView.tableFooterView = UIView(frame: CGRect( + x: 0, + y: 0, + width: APP_WIDTH(), + height: PLAYER_HEIGHT() + )) + } self.activityIndidator.stopAnimating() - guard let songCart = self.songCartView else { return } songCart.updateAllSelect(isAll: songs.count == dataSource.count) }) .map { $0.0 } - .bind(to: tableView.rx.items) { (tableView, index, model) -> UITableViewCell in - let indexPath: IndexPath = IndexPath(row: index, section: 0) - guard let cell = tableView.dequeueReusableCell(withIdentifier: "ArtistMusicCell", for: indexPath) as? ArtistMusicCell else{ + .bind(to: tableView.rx.items) { [weak self] tableView, index, model -> UITableViewCell in + guard let self = self, + let cell = tableView.dequeueReusableCell( + withIdentifier: "ArtistMusicCell", + for: IndexPath(row: index, section: 0) + ) as? ArtistMusicCell else { return UITableViewCell() } + cell.delegate = self cell.update(model: model) return cell - }.disposed(by: disposeBag) - + } + .disposed(by: disposeBag) + output.indexOfSelectedSongs .skip(1) .withLatestFrom(output.dataSource) { ($0, $1) } - .subscribe(onNext: { [weak self] (songs, dataSource) in + .subscribe(onNext: { [weak self] songs, dataSource in guard let self = self else { return } + switch songs.isEmpty { - case true : + case true: + UIView.animate(withDuration: 0.5) { + self.songCartOnView.alpha = .zero + } self.hideSongCart() case false: + self.songCartOnView.alpha = 1.0 self.showSongCart( - in: self.view, + in: self.songCartOnView, type: .artistSong, selectedSongCount: songs.count, totalSongCount: dataSource.count, - useBottomSpace: false + useBottomSpace: self.isFromArtistScene ? false : true ) self.songCartView?.delegate = self } - }).disposed(by: disposeBag) + }) + .disposed(by: disposeBag) + + output.showToast + .bind(with: self) { owner, message in + var options: WMToastOptions + if owner.isFromArtistScene { + options = owner.output.songEntityOfSelectedSongs.value.isEmpty ? + [.tabBar] : [.tabBar, .songCart] + + } else { + options = owner.output.songEntityOfSelectedSongs.value.isEmpty ? + [.empty] : [.songCart] + } + owner.showToast( + text: message, + options: options + ) + } + .disposed(by: disposeBag) + + output.showLogin + .bind(with: self) { owner, _ in + let viewController = owner.textPopupFactory.makeView( + text: "로그인이 필요한 서비스입니다.\n로그인 하시겠습니까?", + cancelButtonIsHidden: false, + confirmButtonText: nil, + cancelButtonText: nil, + completion: { + let log = CommonAnalyticsLog.clickLoginButton(entry: .addMusics) + LogManager.analytics(log) + + let loginVC = owner.signInFactory.makeView() + loginVC.modalPresentationStyle = .overFullScreen + owner.present(loginVC, animated: true) + }, + cancelCompletion: {} + ) + owner.showBottomSheet(content: viewController) + } + .disposed(by: disposeBag) } - - private func configureUI() { - self.activityIndidator.color = DesignSystemAsset.PrimaryColor.point.color - self.activityIndidator.type = .circleStrokeSpin - self.activityIndidator.startAnimating() - self.tableView.backgroundColor = .clear - self.tableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: PLAYER_HEIGHT())) - self.tableView.scrollIndicatorInsets = UIEdgeInsets(top: 0, left: 0, bottom: PLAYER_HEIGHT(), right: 0) + + func configureUI() { + activityIndidator.color = DesignSystemAsset.PrimaryColor.point.color + activityIndidator.type = .circleStrokeSpin + activityIndidator.startAnimating() + tableView.backgroundColor = .clear + isFromArtistScene = navigationController?.viewControllers.first is ArtistViewController + songCartOnView.alpha = .zero + songCartOnViewHeightConstraint.constant = isFromArtistScene ? + PLAYER_HEIGHT() : PLAYER_HEIGHT() + SAFEAREA_BOTTOM_HEIGHT() + } +} + +extension ArtistMusicContentViewController: ArtistMusicCellDelegate { + func tappedThumbnail(id: String) { + guard let tappedSong = output.dataSource.value + .first(where: { $0.songID == id }) + else { return } + PlayState.shared.append(item: .init(id: tappedSong.songID, title: tappedSong.title, artist: tappedSong.artist)) + let playlistIDs = PlayState.shared.currentPlaylist + .map(\.id) + songDetailPresenter.present(ids: playlistIDs, selectedID: tappedSong.songID) } } extension ArtistMusicContentViewController: SongCartViewDelegate { public func buttonTapped(type: SongCartSelectType) { + let limit: Int = 50 + let songs: [SongEntity] = output.songEntityOfSelectedSongs.value + switch type { case let .allSelect(flag): input.allSongSelected.onNext(flag) - + case .addSong: - let songs: [String] = output.songEntityOfSelectedSongs.value.map { $0.id } - let viewController = containSongsComponent.makeView(songs: songs) + let log = CommonAnalyticsLog.clickAddMusicsButton(location: .artist) + LogManager.analytics(log) + + if PreferenceManager.userInfo == nil { + output.showLogin.onNext(.addMusics) + return + } + guard songs.count <= limit else { + output.showToast.onNext(LocalizationStrings.overFlowContainWarning(songs.count - limit)) + return + } + let songIds: [String] = songs.map { $0.id } + let viewController = containSongsFactory.makeView(songs: songIds) viewController.modalPresentationStyle = .overFullScreen self.present(viewController, animated: true) { self.input.allSongSelected.onNext(false) } + case .addPlayList: - let songs: [SongEntity] = output.songEntityOfSelectedSongs.value PlayState.shared.appendSongsToPlaylist(songs) + output.showToast.onNext(LocalizationStrings.addList) input.allSongSelected.onNext(false) case .play: - let songs: [SongEntity] = output.songEntityOfSelectedSongs.value + guard songs.count <= limit else { + output.showToast.onNext(LocalizationStrings.overFlowPlayWarning(songs.count - limit)) + return + } + LogManager.analytics( + CommonAnalyticsLog.clickPlayButton(location: .artist, type: .multiple) + ) PlayState.shared.loadAndAppendSongsToPlaylist(songs) input.allSongSelected.onNext(false) + if songs.allSatisfy({ $0.title.isContainShortsTagTitle }) { + WakmusicYoutubePlayer(ids: songs.map { $0.id }, title: "왁타버스 뮤직", playPlatform: .youtube).play() + } else { + WakmusicYoutubePlayer(ids: songs.map { $0.id }, title: "왁타버스 뮤직").play() + } default: return } @@ -165,44 +283,62 @@ extension ArtistMusicContentViewController: UITableViewDelegate { public func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 60 } - + public func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { - return 80 + return output.dataSource.value.isEmpty ? 0 : 80 } public func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { let view = ArtistPlayButtonGroupView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: 80)) view.delegate = self - return view + return output.dataSource.value.isEmpty ? nil : view } } -extension ArtistMusicContentViewController: PlayButtonGroupViewDelegate{ - public func pressPlay(_ event: PlayEvent) { +extension ArtistMusicContentViewController: PlayButtonGroupViewDelegate { + public func play(_ event: PlayEvent) { let songs: [SongEntity] = output.dataSource.value.map { return SongEntity( - id: $0.ID, - title: $0.title, - artist: $0.artist, - remix: $0.remix, - reaction: $0.reaction, - views: $0.views, - last: $0.last, - date: $0.date + id: $0.songID, + title: $0.title, + artist: $0.artist, + views: 0, + date: $0.date ) } + switch event { case .allPlay: + LogManager.analytics( + CommonAnalyticsLog.clickPlayButton(location: .artist, type: .all) + ) + var urlString: String = "" + switch viewModel.type { + case .new: + urlString = viewModel.model?.playlist.latest ?? "" + case .popular: + urlString = viewModel.model?.playlist.popular ?? "" + case .old: + urlString = viewModel.model?.playlist.oldest ?? "" + } + guard !urlString.isEmpty, let url = URL(string: urlString) else { + output.showToast.onNext("해당 기능은 준비 중입니다.") + return + } PlayState.shared.loadAndAppendSongsToPlaylist(songs) - input.allSongSelected.onNext(false) - case .shufflePlay: - PlayState.shared.loadAndAppendSongsToPlaylist(songs.shuffled()) - input.allSongSelected.onNext(false) + if let components = URLComponents(url: url, resolvingAgainstBaseURL: false), + let listID = components.queryItems?.first(where: { $0.name == "list" })?.value { + WakmusicYoutubePlayer(listID: listID).play() + } + + case .shufflePlay: // 미사용 + break } + input.allSongSelected.onNext(false) } } -extension Reactive where Base: ArtistMusicContentViewController{ +extension Reactive where Base: ArtistMusicContentViewController { var refresh: Binder { return Binder(base) { viewController, _ in viewController.input.pageID.accept(1) diff --git a/Projects/Features/ArtistFeature/Sources/ViewControllers/ArtistMusicViewController.swift b/Projects/Features/ArtistFeature/Sources/ViewControllers/ArtistMusicViewController.swift index 49f35ccc6..207a94b27 100644 --- a/Projects/Features/ArtistFeature/Sources/ViewControllers/ArtistMusicViewController.swift +++ b/Projects/Features/ArtistFeature/Sources/ViewControllers/ArtistMusicViewController.swift @@ -1,22 +1,14 @@ -// -// ArtistMusicViewController.swift -// ArtistFeature -// -// Created by KTH on 2023/01/07. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import Utility +import ArtistDomainInterface import DesignSystem +import LogManager import Pageboy import Tabman -import DomainModule +import UIKit +import Utility public class ArtistMusicViewController: TabmanViewController, ViewControllerFromStoryBoard { - @IBOutlet weak var tabBarContentView: UIView! - + lazy var viewControllers: [UIViewController] = { let viewControllers = [ artistMusicContentComponent.makeView(type: .new, model: model), @@ -25,27 +17,36 @@ public class ArtistMusicViewController: TabmanViewController, ViewControllerFrom ] return viewControllers }() - + var artistMusicContentComponent: ArtistMusicContentComponent! - var model: ArtistListEntity? - + var model: ArtistEntity? + deinit { DEBUG_LOG("\(Self.self) Deinit") } - public override func viewDidLoad() { + override public func viewDidLoad() { super.viewDidLoad() configureUI() } - - public override func pageboyViewController(_ pageboyViewController: PageboyViewController, - didScrollToPageAt index: TabmanViewController.PageIndex, - direction: PageboyViewController.NavigationDirection, - animated: Bool) { + + override public func pageboyViewController( + _ pageboyViewController: PageboyViewController, + didScrollToPageAt index: TabmanViewController.PageIndex, + direction: PageboyViewController.NavigationDirection, + animated: Bool + ) { + LogManager.analytics( + ArtistAnalyticsLog.clickArtistTabbarTab( + tab: index == 0 ? "new" : + index == 1 ? "popular" : "old", + artist: model?.id ?? "" + ) + ) } public static func viewController( - model: ArtistListEntity?, + model: ArtistEntity?, artistMusicContentComponent: ArtistMusicContentComponent ) -> ArtistMusicViewController { let viewController = ArtistMusicViewController.viewController(storyBoardName: "Artist", bundle: Bundle.module) @@ -56,27 +57,27 @@ public class ArtistMusicViewController: TabmanViewController, ViewControllerFrom } extension ArtistMusicViewController { - private func configureUI() { self.dataSource = self let bar = TMBar.ButtonBar() - + // 배경색 bar.backgroundView.style = .clear - + // 간격 설정 bar.layout.contentInset = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20) bar.layout.contentMode = .fit bar.layout.transitionStyle = .progressive - + bar.layout.interButtonSpacing = 0 + // 버튼 글씨 커스텀 - bar.buttons.customize { (button) in - button.tintColor = DesignSystemAsset.GrayColor.gray400.color - button.selectedTintColor = DesignSystemAsset.GrayColor.gray900.color + bar.buttons.customize { button in + button.tintColor = DesignSystemAsset.BlueGrayColor.gray400.color + button.selectedTintColor = DesignSystemAsset.BlueGrayColor.gray900.color button.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) button.selectedFont = DesignSystemFontFamily.Pretendard.bold.font(size: 16) } - + // indicator bar.indicator.weight = .custom(value: 2) bar.indicator.tintColor = DesignSystemAsset.PrimaryColor.point.color @@ -87,7 +88,6 @@ extension ArtistMusicViewController { } extension ArtistMusicViewController: PageboyViewControllerDataSource, TMBarDataSource { - public func barItem(for bar: TMBar, at index: Int) -> TMBarItemable { switch index { case 0: @@ -95,21 +95,24 @@ extension ArtistMusicViewController: PageboyViewControllerDataSource, TMBarDataS case 1: return TMBarItem(title: "인기순") case 2: - return TMBarItem(title: "과거순") + return TMBarItem(title: "과거순") default: let title = "Page \(index)" - return TMBarItem(title: title) + return TMBarItem(title: title) } } public func numberOfViewControllers(in pageboyViewController: PageboyViewController) -> Int { return viewControllers.count } - - public func viewController(for pageboyViewController: PageboyViewController, at index: PageboyViewController.PageIndex) -> UIViewController? { + + public func viewController( + for pageboyViewController: PageboyViewController, + at index: PageboyViewController.PageIndex + ) -> UIViewController? { return viewControllers[index] } - + public func defaultPage(for pageboyViewController: PageboyViewController) -> PageboyViewController.Page? { return nil } diff --git a/Projects/Features/ArtistFeature/Sources/ViewControllers/ArtistViewController.swift b/Projects/Features/ArtistFeature/Sources/ViewControllers/ArtistViewController.swift index e24c8629e..45948439e 100644 --- a/Projects/Features/ArtistFeature/Sources/ViewControllers/ArtistViewController.swift +++ b/Projects/Features/ArtistFeature/Sources/ViewControllers/ArtistViewController.swift @@ -1,91 +1,144 @@ -import UIKit -import Utility -import DesignSystem -import RxSwift -import RxCocoa +import ArtistFeatureInterface import BaseFeature -import DomainModule +import DesignSystem +import Localization +import LogManager import NeedleFoundation -import PDFKit import NVActivityIndicatorView +import ReactorKit +import RxCocoa +import RxSwift +import UIKit +import Utility + +public final class ArtistViewController: + BaseViewController, + ViewControllerFromStoryBoard, + EqualHandleTappedType, + StoryboardView { + public typealias Reactor = ArtistReactor -public final class ArtistViewController: BaseViewController, ViewControllerFromStoryBoard, EqualHandleTappedType { @IBOutlet weak var collectionView: UICollectionView! @IBOutlet weak var activityIndicator: NVActivityIndicatorView! - - private var viewModel: ArtistViewModel! - private lazy var input = ArtistViewModel.Input() - private lazy var output = viewModel.transform(from: input) - var artistDetailComponent: ArtistDetailComponent! - var disposeBag: DisposeBag = DisposeBag() - - public override func viewDidLoad() { + private let retryWarningView = WMRetryWarningView( + description: LocalizationStrings.unknownErrorWarning, + retryButtonTitle: LocalizationStrings.titleRetry + ) + private let translucentView = UIVisualEffectView(effect: UIBlurEffect(style: .light)).then { + $0.alpha = 0 + } + + var artistDetailFactory: ArtistDetailFactory! + public var disposeBag: DisposeBag = DisposeBag() + + override public func viewDidLoad() { super.viewDidLoad() + addSubviews() + setLayout() configureUI() - bindRx() } - - public override func viewDidAppear(_ animated: Bool) { + + override public func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) navigationController?.interactivePopGestureRecognizer?.delegate = self + LogManager.analytics(ArtistAnalyticsLog.viewPage(pageName: "artist")) } - public override func viewDidDisappear(_ animated: Bool) { + override public func viewDidDisappear(_ animated: Bool) { super.viewDidDisappear(animated) navigationController?.interactivePopGestureRecognizer?.delegate = nil } - public static func viewController( - viewModel: ArtistViewModel, - artistDetailComponent: ArtistDetailComponent - ) -> ArtistViewController { - let viewController = ArtistViewController.viewController(storyBoardName: "Artist", bundle: Bundle.module) - viewController.viewModel = viewModel - viewController.artistDetailComponent = artistDetailComponent - return viewController + public func bind(reactor: ArtistReactor) { + bindAction(reactor: reactor) + bindState(reactor: reactor) } -} -extension ArtistViewController { - private func bindRx() { - output.dataSource + private func bindAction(reactor: ArtistReactor) { + reactor.action.onNext(Reactor.Action.viewDidLoad) + // Storyboard 기반이기에 바로 viewDidLoad로 onNext, 만약 codebase로 전환 시 `methodInvoked(#selector(viewDidLoad))` 로 옵저빙 + + collectionView.rx.itemSelected + .withLatestFrom(reactor.state.map(\.artistList)) { ($0, $1) } + .do(onNext: { [collectionView] indexPath, _ in + guard let cell = collectionView?.cellForItem(at: indexPath) as? ArtistListCell else { return } + cell.animateSizeDownToUp(timeInterval: 0.3) + }) + .delay(RxTimeInterval.milliseconds(100), scheduler: MainScheduler.instance) + .map { $0.1[$0.0.row] } + .bind(with: self) { owner, entity in + LogManager.analytics(ArtistAnalyticsLog.clickArtistItem(artist: entity.id)) + let viewController = owner.artistDetailFactory.makeView(artistID: entity.id) + owner.navigationController?.pushViewController(viewController, animated: true) + } + .disposed(by: disposeBag) + + collectionView.rx.didScroll + .bind(with: self) { owner, _ in + let offsetY: CGFloat = owner.collectionView.contentOffset.y + STATUS_BAR_HEGHIT() + owner.translucentView.alpha = min(max(offsetY / owner.translucentView.frame.height, 0), 1) + } + .disposed(by: disposeBag) + } + + private func bindState(reactor: ArtistReactor) { + let sharedState = reactor.state.share(replay: 1) + + sharedState.map(\.artistList) .skip(1) - .do(onNext: { [weak self] _ in - guard let self = self else { return } - self.activityIndicator.stopAnimating() + .do(onNext: { [activityIndicator, retryWarningView] entities in + retryWarningView.isHidden = !entities.isEmpty + activityIndicator?.stopAnimating() }) - .bind(to: collectionView.rx.items) { (collectionView, index, model) -> UICollectionViewCell in + .bind(to: collectionView.rx.items) { collectionView, index, artist in let indexPath = IndexPath(item: index, section: 0) - guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ArtistListCell", - for: indexPath) as? ArtistListCell else { + guard let cell = collectionView.dequeueReusableCell( + withReuseIdentifier: "ArtistListCell", + for: indexPath + ) as? ArtistListCell else { return UICollectionViewCell() } - cell.update(model: model) + cell.update(model: artist) return cell - }.disposed(by: disposeBag) - - collectionView.rx.itemSelected - .withLatestFrom(output.dataSource) { ($0, $1) } - .do(onNext: { [weak self] (indexPath, _) in - guard let `self` = self, - let cell = self.collectionView.cellForItem(at: indexPath) as? ArtistListCell else { return } - cell.animateSizeDownToUp(timeInterval: 0.3) - }) - .delay(RxTimeInterval.milliseconds(100), scheduler: MainScheduler.instance) - .map { $0.1[$0.0.row] } - .subscribe(onNext:{ [weak self] (model) in - guard let `self` = self else { return } - let viewController = self.artistDetailComponent.makeView(model: model) - self.navigationController?.pushViewController(viewController, animated: true) - }).disposed(by: disposeBag) - } - - private func configureUI() { - self.view.backgroundColor = DesignSystemAsset.GrayColor.gray100.color + } + .disposed(by: disposeBag) + } + + public static func viewController( + reactor: ArtistReactor, + artistDetailFactory: ArtistDetailFactory + ) -> ArtistViewController { + let viewController = ArtistViewController.viewController(storyBoardName: "Artist", bundle: Bundle.module) + viewController.reactor = reactor + viewController.artistDetailFactory = artistDetailFactory + return viewController + } +} + +private extension ArtistViewController { + func addSubviews() { + view.addSubviews(retryWarningView, translucentView) + } + + func setLayout() { + let topOffset = (APP_HEIGHT() - SAFEAREA_BOTTOM_HEIGHT() - PLAYER_HEIGHT() - 160) / 3.0 + retryWarningView.snp.makeConstraints { + $0.centerX.equalToSuperview() + $0.top.equalToSuperview().offset(topOffset + STATUS_BAR_HEGHIT()) + } + + translucentView.snp.makeConstraints { + $0.top.horizontalEdges.equalToSuperview() + $0.bottom.equalTo(view.safeAreaLayoutGuide.snp.top) + } + } + + func configureUI() { + view.backgroundColor = DesignSystemAsset.BlueGrayColor.gray100.color activityIndicator.color = DesignSystemAsset.PrimaryColor.point.color activityIndicator.type = .circleStrokeSpin activityIndicator.startAnimating() - + let sideSpace: CGFloat = 20.0 let layout = WaterfallLayout() layout.delegate = self @@ -94,29 +147,51 @@ extension ArtistViewController { layout.minimumInteritemSpacing = 8 // 열 사이의 간격 layout.headerHeight = 0 layout.footerHeight = 56.0 - - self.collectionView.setCollectionViewLayout(layout, animated: false) - self.collectionView.showsVerticalScrollIndicator = false + + collectionView.setCollectionViewLayout(layout, animated: false) + collectionView.showsVerticalScrollIndicator = false + + retryWarningView.isHidden = true + retryWarningView.delegate = self + } +} + +extension ArtistViewController: UICollectionViewDelegate { + public func scrollViewDidScroll(_ scrollView: UIScrollView) { + let offsetY: CGFloat = scrollView.contentOffset.y + STATUS_BAR_HEGHIT() + translucentView.alpha = min(max(offsetY / translucentView.frame.height, 0), 1) + } +} + +extension ArtistViewController: WMRetryWarningViewDelegate { + public func tappedRetryButton() { + retryWarningView.isHidden = true + activityIndicator.startAnimating() + reactor?.action.onNext(Reactor.Action.viewDidLoad) } } extension ArtistViewController: WaterfallLayoutDelegate { - public func collectionView(_ collectionView: UICollectionView, layout: WaterfallLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { + public func collectionView( + _ collectionView: UICollectionView, + layout: WaterfallLayout, + sizeForItemAt indexPath: IndexPath + ) -> CGSize { let originWidth: CGFloat = 106.0 let originHeight: CGFloat = 130.0 - let rate: CGFloat = originHeight/max(1.0, originWidth) + let rate: CGFloat = originHeight / max(1.0, originWidth) let sideSpace: CGFloat = 8.0 let width: CGFloat = APP_WIDTH() - ((sideSpace * 2.0) + 40.0) let topSpace: CGFloat = 55.0 let spacingWithNameHeight: CGFloat = 4.0 + 24.0 + topSpace + 15 let imageHeight: CGFloat = width * rate - + switch indexPath.item { case 0, 2: - return CGSize(width: width, height: (imageHeight) + (width / 2) + spacingWithNameHeight) + return CGSize(width: width, height: imageHeight + (width / 2) + spacingWithNameHeight) default: - return CGSize(width: width, height: (imageHeight) + spacingWithNameHeight) + return CGSize(width: width, height: imageHeight + spacingWithNameHeight) } } @@ -125,13 +200,13 @@ extension ArtistViewController: WaterfallLayoutDelegate { } } -extension ArtistViewController { - public func equalHandleTapped() { +public extension ArtistViewController { + func equalHandleTapped() { let viewControllersCount: Int = self.navigationController?.viewControllers.count ?? 0 if viewControllersCount > 1 { self.navigationController?.popToRootViewController(animated: true) - }else{ - guard !output.dataSource.value.isEmpty else { return } + } else { + guard reactor?.currentState.artistList.isEmpty == false else { return } self.collectionView.setContentOffset(CGPoint(x: 0, y: -STATUS_BAR_HEGHIT()), animated: true) } } diff --git a/Projects/Features/ArtistFeature/Sources/ViewModels/ArtistDetailViewModel.swift b/Projects/Features/ArtistFeature/Sources/ViewModels/ArtistDetailViewModel.swift new file mode 100644 index 000000000..391eeac53 --- /dev/null +++ b/Projects/Features/ArtistFeature/Sources/ViewModels/ArtistDetailViewModel.swift @@ -0,0 +1,133 @@ +import ArtistDomainInterface +import BaseFeature +import Foundation +import Localization +import LogManager +import RxRelay +import RxSwift +import Utility + +public final class ArtistDetailViewModel: ViewModelType { + let artistID: String + private let fetchArtistDetailUseCase: FetchArtistDetailUseCase + private let fetchArtistSubscriptionStatusUseCase: FetchArtistSubscriptionStatusUseCase + private let subscriptionArtistUseCase: SubscriptionArtistUseCase + private let disposeBag = DisposeBag() + + public init( + artistID: String, + fetchArtistDetailUseCase: any FetchArtistDetailUseCase, + fetchArtistSubscriptionStatusUseCase: any FetchArtistSubscriptionStatusUseCase, + subscriptionArtistUseCase: any SubscriptionArtistUseCase + ) { + self.artistID = artistID + self.fetchArtistDetailUseCase = fetchArtistDetailUseCase + self.fetchArtistSubscriptionStatusUseCase = fetchArtistSubscriptionStatusUseCase + self.subscriptionArtistUseCase = subscriptionArtistUseCase + } + + public struct Input { + let fetchArtistDetail: PublishSubject = PublishSubject() + let fetchArtistSubscriptionStatus: PublishSubject = PublishSubject() + let didTapSubscription: PublishSubject = PublishSubject() + } + + public struct Output { + let dataSource: BehaviorRelay = BehaviorRelay(value: nil) + let isSubscription: BehaviorRelay = BehaviorRelay(value: false) + let showToast: PublishSubject = PublishSubject() + let showLogin: PublishSubject = PublishSubject() + let showWarningNotification: PublishSubject = PublishSubject() + let occurredError: PublishSubject = PublishSubject() + } + + public func transform(from input: Input) -> Output { + let output = Output() + let id = self.artistID + + input.fetchArtistDetail + .flatMap { [fetchArtistDetailUseCase] _ in + return fetchArtistDetailUseCase.execute(id: id) + .asObservable() + .catch { error in + output.occurredError + .onNext(error.asWMError.errorDescription ?? LocalizationStrings.unknownErrorWarning) + return Observable.empty() + } + } + .bind(to: output.dataSource) + .disposed(by: disposeBag) + + input.fetchArtistSubscriptionStatus + .withLatestFrom(PreferenceManager.$userInfo) + .withLatestFrom(PreferenceManager.$pushNotificationAuthorizationStatus) { ($0, $1 ?? false) } + .flatMap { [fetchArtistSubscriptionStatusUseCase] userInfo, granted + -> Observable in + if userInfo == nil || granted == false { + return Observable.just(.init(isSubscription: false)) + } else { + return fetchArtistSubscriptionStatusUseCase.execute(id: id) + .asObservable() + .catchAndReturn(.init(isSubscription: false)) + } + } + .map { $0.isSubscription } + .bind(to: output.isSubscription) + .disposed(by: disposeBag) + + input.didTapSubscription + .do(onNext: { _ in + LogManager.analytics( + ArtistAnalyticsLog.clickArtistSubscriptionButton(artist: id) + ) + }) + .withLatestFrom(PreferenceManager.$userInfo) + .filter { userInfo in + if userInfo == nil { + output.showLogin.onNext(.artistSubscribe) + return false + } + return true + } + .withLatestFrom(PreferenceManager.$pushNotificationAuthorizationStatus) + .map { $0 ?? false } + .filter { granted in + if granted == false { + output.showWarningNotification.onNext(()) + return false + } + return true + } + .withLatestFrom(output.isSubscription) + .flatMap { [subscriptionArtistUseCase] status -> Observable in + return subscriptionArtistUseCase.execute(id: id, on: !status) + .andThen(Observable.just(!status)) + .catch { error in + output.showToast.onNext(error.asWMError.errorDescription ?? error.localizedDescription) + return Observable.empty() + } + } + .subscribe(onNext: { isSubscribe in + output.isSubscription.accept(isSubscribe) + output.showToast.onNext( + isSubscribe ? + "신곡 알림이 등록되었습니다." : "신곡 알림이 해제되었습니다." + ) + }) + .disposed(by: disposeBag) + + // 로그인/아웃, 기기알림 끔 상태 반영 + Observable.combineLatest( + PreferenceManager.$userInfo.map { $0?.ID }.distinctUntilChanged(), + PreferenceManager.$pushNotificationAuthorizationStatus.distinctUntilChanged().map { $0 ?? false } + ) { id, granted -> (String?, Bool) in + return (id, granted) + } + .skip(1) + .map { _ in () } + .bind(to: input.fetchArtistSubscriptionStatus) + .disposed(by: disposeBag) + + return output + } +} diff --git a/Projects/Features/ArtistFeature/Sources/ViewModels/ArtistMusicContentViewModel.swift b/Projects/Features/ArtistFeature/Sources/ViewModels/ArtistMusicContentViewModel.swift index 6045ec460..bbf1f42b2 100644 --- a/Projects/Features/ArtistFeature/Sources/ViewModels/ArtistMusicContentViewModel.swift +++ b/Projects/Features/ArtistFeature/Sources/ViewModels/ArtistMusicContentViewModel.swift @@ -6,110 +6,111 @@ // Copyright © 2023 yongbeomkwak. All rights reserved. // +import ArtistDomainInterface +import BaseFeature import Foundation -import RxSwift +import LogManager import RxCocoa -import BaseFeature -import DomainModule -import DataMappingModule +import RxSwift +import SongsDomainInterface import Utility public final class ArtistMusicContentViewModel: ViewModelType { - - var fetchArtistSongListUseCase: FetchArtistSongListUseCase + private let fetchArtistSongListUseCase: FetchArtistSongListUseCase var type: ArtistSongSortType - var model: ArtistListEntity? - var disposeBag = DisposeBag() + var model: ArtistEntity? + private let disposeBag = DisposeBag() public init( type: ArtistSongSortType, - model: ArtistListEntity?, + model: ArtistEntity?, fetchArtistSongListUseCase: any FetchArtistSongListUseCase - ){ + ) { self.type = type self.model = model self.fetchArtistSongListUseCase = fetchArtistSongListUseCase } - + public struct Input { - var pageID: BehaviorRelay - var songTapped: PublishSubject = PublishSubject() - var allSongSelected: PublishSubject = PublishSubject() + let pageID: BehaviorRelay = BehaviorRelay(value: 1) + let songTapped: PublishSubject = PublishSubject() + let allSongSelected: PublishSubject = PublishSubject() } public struct Output { - var canLoadMore: BehaviorRelay - var dataSource: BehaviorRelay<[ArtistSongListEntity]> - let indexOfSelectedSongs: BehaviorRelay<[Int]> - let songEntityOfSelectedSongs: BehaviorRelay<[SongEntity]> + let canLoadMore: BehaviorRelay = BehaviorRelay(value: true) + let dataSource: BehaviorRelay<[ArtistSongListEntity]> = BehaviorRelay(value: []) + let indexOfSelectedSongs: BehaviorRelay<[Int]> = BehaviorRelay(value: []) + let songEntityOfSelectedSongs: BehaviorRelay<[SongEntity]> = BehaviorRelay(value: []) + let showToast: PublishSubject = .init() + let showLogin: PublishSubject = .init() } - + public func transform(from input: Input) -> Output { - let ID: String = model?.ID ?? "" + let output = Output() + let ID: String = self.model?.id ?? "" let type: ArtistSongSortType = self.type let fetchArtistSongListUseCase: FetchArtistSongListUseCase = self.fetchArtistSongListUseCase - - let dataSource: BehaviorRelay<[ArtistSongListEntity]> = BehaviorRelay(value: []) - let canLoadMore: BehaviorRelay = BehaviorRelay(value: true) - let indexOfSelectedSongs: BehaviorRelay<[Int]> = BehaviorRelay(value: []) - let songEntityOfSelectedSongs: BehaviorRelay<[SongEntity]> = BehaviorRelay(value: []) - - let refresh = Observable.combineLatest(dataSource, input.pageID) { (dataSource, pageID) -> [ArtistSongListEntity] in - return pageID == 1 ? [] : dataSource - } + + let refresh = Observable + .combineLatest(output.dataSource, input.pageID) { dataSource, pageID -> [ArtistSongListEntity] in + return pageID == 1 ? [] : dataSource + } input.pageID - .flatMap { (pageID) -> Single<[ArtistSongListEntity]> in + .flatMap { pageID -> Single<[ArtistSongListEntity]> in return fetchArtistSongListUseCase - .execute(id: ID, sort: type, page: pageID) - .catchAndReturn([]) + .execute(id: ID, sort: type, page: pageID) + .catchAndReturn([]) } .asObservable() - .do(onNext: { (model) in - canLoadMore.accept(!model.isEmpty) -// DEBUG_LOG("page: \(input.pageID.value) called, nextPage exist: \(!model.isEmpty)") + .do(onNext: { model in + let loadMore: Bool = model.count < 30 ? false : true + output.canLoadMore.accept(loadMore) + // DEBUG_LOG("page: \(input.pageID.value) called, count: \(model.count), nextPage exist: \(loadMore)") }, onError: { _ in - canLoadMore.accept(false) + output.canLoadMore.accept(false) }) - .withLatestFrom(refresh, resultSelector: { (newModels, datasources) -> [ArtistSongListEntity] in + .withLatestFrom(refresh, resultSelector: { newModels, datasources -> [ArtistSongListEntity] in return datasources + newModels }) - .bind(to: dataSource) + .bind(to: output.dataSource) .disposed(by: disposeBag) - + input.songTapped - .withLatestFrom(indexOfSelectedSongs, resultSelector: { (index, selectedSongs) -> [Int] in + .withLatestFrom(output.indexOfSelectedSongs, resultSelector: { index, selectedSongs -> [Int] in + let songID: String = output.dataSource.value[index].songID if selectedSongs.contains(index) { - guard let removeTargetIndex = selectedSongs.firstIndex(where: { $0 == index }) else { return selectedSongs } + guard let removeTargetIndex = selectedSongs.firstIndex(where: { $0 == index }) + else { return selectedSongs } var newSelectedSongs = selectedSongs newSelectedSongs.remove(at: removeTargetIndex) return newSelectedSongs - - }else{ + } else { return selectedSongs + [index] } }) .map { $0.sorted { $0 < $1 } } - .bind(to: indexOfSelectedSongs) + .bind(to: output.indexOfSelectedSongs) .disposed(by: disposeBag) - + input.allSongSelected - .withLatestFrom(dataSource) { ($0, $1) } - .map { (flag, dataSource) -> [Int] in - return flag ? Array(0.. [Int] in + return flag ? Array(0 ..< dataSource.count) : [] } - .bind(to: indexOfSelectedSongs) + .bind(to: output.indexOfSelectedSongs) .disposed(by: disposeBag) - + Utility.PreferenceManager.$startPage .skip(1) .map { _ in [] } - .bind(to: indexOfSelectedSongs) + .bind(to: output.indexOfSelectedSongs) .disposed(by: disposeBag) - indexOfSelectedSongs - .withLatestFrom(dataSource) { ($0, $1) } - .map { (selectedSongs, dataSource) in + output.indexOfSelectedSongs + .withLatestFrom(output.dataSource) { ($0, $1) } + .map { selectedSongs, dataSource in var newModel = dataSource newModel.indices.forEach { newModel[$0].isSelected = false } @@ -118,33 +119,25 @@ public final class ArtistMusicContentViewModel: ViewModelType { } return newModel } - .bind(to: dataSource) + .bind(to: output.dataSource) .disposed(by: disposeBag) - - indexOfSelectedSongs - .withLatestFrom(dataSource) { ($0, $1) } - .map { (indexOfSelectedSongs, dataSource) in + + output.indexOfSelectedSongs + .withLatestFrom(output.dataSource) { ($0, $1) } + .map { indexOfSelectedSongs, dataSource in return indexOfSelectedSongs.map { SongEntity( - id: dataSource[$0].ID, + id: dataSource[$0].songID, title: dataSource[$0].title, artist: dataSource[$0].artist, - remix: dataSource[$0].remix, - reaction: dataSource[$0].reaction, - views: dataSource[$0].views, - last: dataSource[$0].last, + views: 0, date: dataSource[$0].date ) } } - .bind(to: songEntityOfSelectedSongs) + .bind(to: output.songEntityOfSelectedSongs) .disposed(by: disposeBag) - return Output( - canLoadMore: canLoadMore, - dataSource: dataSource, - indexOfSelectedSongs: indexOfSelectedSongs, - songEntityOfSelectedSongs: songEntityOfSelectedSongs - ) + return output } } diff --git a/Projects/Features/ArtistFeature/Sources/ViewModels/ArtistViewModel.swift b/Projects/Features/ArtistFeature/Sources/ViewModels/ArtistViewModel.swift deleted file mode 100644 index 8841e4b38..000000000 --- a/Projects/Features/ArtistFeature/Sources/ViewModels/ArtistViewModel.swift +++ /dev/null @@ -1,78 +0,0 @@ -// -// ArtistViewModel.swift -// ArtistFeatureTests -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import RxCocoa -import BaseFeature -import DomainModule -import Utility - -public final class ArtistViewModel: ViewModelType { - - var disposeBag = DisposeBag() - var fetchArtistListUseCase: FetchArtistListUseCase - - public init( - fetchArtistListUseCase: any FetchArtistListUseCase - ){ - self.fetchArtistListUseCase = fetchArtistListUseCase - } - - public struct Input { - } - - public struct Output { - let dataSource: BehaviorRelay<[ArtistListEntity]> - } - - public func transform(from input: Input) -> Output { - - let dataSource: BehaviorRelay<[ArtistListEntity]> = BehaviorRelay(value: []) - - fetchArtistListUseCase.execute() - .catchAndReturn([]) - .asObservable() - .map{ (model) -> [ArtistListEntity] in - guard !model.isEmpty else { - DEBUG_LOG("데이터가 없습니다.") - return model - } - var newModel = model - - if model.count == 1 { - let hiddenItem: ArtistListEntity = ArtistListEntity( - ID: "", - name: "", - short: "", - group: "", - title: "", - description: "", - color: [], - youtube: "", - twitch: "", - instagram: "", - imageRoundVersion: 0, - imageSquareVersion: 0, - graduated: false, - isHiddenItem: true - ) - newModel.append(hiddenItem) - return newModel - - }else { - newModel.swapAt(0, 1) - } - return newModel - } - .bind(to: dataSource) - .disposed(by: disposeBag) - - return Output(dataSource: dataSource) - } -} diff --git a/Projects/Features/ArtistFeature/Sources/Views/ArtistListCell.swift b/Projects/Features/ArtistFeature/Sources/Views/ArtistListCell.swift index fbc50d5e1..697a0fa15 100644 --- a/Projects/Features/ArtistFeature/Sources/Views/ArtistListCell.swift +++ b/Projects/Features/ArtistFeature/Sources/Views/ArtistListCell.swift @@ -5,35 +5,35 @@ // Created by KTH on 2022/12/15. // -import UIKit +import ArtistDomainInterface +import DesignSystem import Kingfisher +import UIKit import Utility -import DomainModule -import DesignSystem class ArtistListCell: UICollectionViewCell { - @IBOutlet weak var artistImageView: UIImageView! @IBOutlet weak var artistLabel: UILabel! - + override func awakeFromNib() { super.awakeFromNib() } } extension ArtistListCell { - - func update(model: ArtistListEntity) { + func update(model: ArtistEntity) { self.contentView.alpha = model.isHiddenItem ? 0 : 1 let artistNameAttributedString = NSMutableAttributedString( - string: model.name, - attributes: [.font: DesignSystemFontFamily.Pretendard.medium.font(size: 14), - .foregroundColor: DesignSystemAsset.GrayColor.gray600.color, - .kern: -0.5] + string: model.krName, + attributes: [ + .font: DesignSystemFontFamily.Pretendard.medium.font(size: 14), + .foregroundColor: DesignSystemAsset.BlueGrayColor.gray600.color, + .kern: -0.5 + ] ) - let originImageURLString: String = WMImageAPI.fetchArtistWithRound(id: model.ID, version: model.imageRoundVersion).toString - let encodedImageURLString: String = originImageURLString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? originImageURLString - + let encodedImageURLString: String = model.roundImage + .addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? model.roundImage + artistLabel.attributedText = artistNameAttributedString artistLabel.textAlignment = .center artistImageView.kf.setImage( diff --git a/Projects/Features/ArtistFeature/Sources/Views/ArtistMusicCell.swift b/Projects/Features/ArtistFeature/Sources/Views/ArtistMusicCell.swift index c2e3d3727..211ff81e3 100644 --- a/Projects/Features/ArtistFeature/Sources/Views/ArtistMusicCell.swift +++ b/Projects/Features/ArtistFeature/Sources/Views/ArtistMusicCell.swift @@ -1,91 +1,78 @@ -// -// ArtistMusicCell.swift -// ArtistFeature -// -// Created by KTH on 2023/01/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - +import ArtistDomainInterface +import BaseFeature +import DesignSystem +import Kingfisher +import SongsDomainInterface import UIKit import Utility -import DesignSystem -import DomainModule -import CommonFeature -class ArtistMusicCell: UITableViewCell { - @IBOutlet weak var albumImageView: UIImageView! +protocol ArtistMusicCellDelegate: AnyObject { + func tappedThumbnail(id: String) +} + +final class ArtistMusicCell: UITableViewCell { + @IBOutlet weak var albumImageButton: UIButton! @IBOutlet weak var titleStringLabel: UILabel! @IBOutlet weak var groupStringLabel: UILabel! @IBOutlet weak var releaseDateLabel: UILabel! - @IBOutlet weak var thumbnailToPlayButton: UIButton! - + private var model: ArtistSongListEntity? - + weak var delegate: ArtistMusicCellDelegate? + override func awakeFromNib() { super.awakeFromNib() - self.backgroundColor = .clear - self.contentView.backgroundColor = .clear - - albumImageView.layer.cornerRadius = 4 - albumImageView.contentMode = .scaleAspectFill - + backgroundColor = .clear + contentView.backgroundColor = .clear + + albumImageButton.layer.cornerRadius = 4 + albumImageButton.contentMode = .scaleAspectFill + albumImageButton.clipsToBounds = true + titleStringLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 14) groupStringLabel.font = DesignSystemFontFamily.Pretendard.light.font(size: 12) releaseDateLabel.font = DesignSystemFontFamily.SCoreDream._3Light.font(size: 12) } - + @IBAction func thumbnailToPlayButtonAction(_ sender: Any) { guard let song = self.model else { return } - let songEntity: SongEntity = SongEntity( - id: song.ID, - title: song.title, - artist: song.artist, - remix: song.remix, - reaction: song.reaction, - views: song.views, - last: song.last, - date: song.date - ) - PlayState.shared.loadAndAppendSongsToPlaylist([songEntity]) + delegate?.tappedThumbnail(id: song.songID) } } extension ArtistMusicCell { - static func getCellHeight() -> CGFloat { - let base: CGFloat = 10 + 10 - let width: CGFloat = (72.0 * APP_WIDTH()) / 375.0 - let height: CGFloat = (width * 40.0) / 72.0 - return base + height - } - func update(model: ArtistSongListEntity) { self.model = model - self.contentView.backgroundColor = model.isSelected ? DesignSystemAsset.GrayColor.gray200.color : UIColor.clear - + contentView.backgroundColor = model.isSelected ? + DesignSystemAsset.BlueGrayColor.gray200.color : UIColor.clear + titleStringLabel.attributedText = getAttributedString( text: model.title, font: DesignSystemFontFamily.Pretendard.medium.font(size: 14) ) - + groupStringLabel.attributedText = getAttributedString( text: model.artist, font: DesignSystemFontFamily.Pretendard.light.font(size: 12) ) - + releaseDateLabel.attributedText = getAttributedString( text: model.date, font: DesignSystemFontFamily.SCoreDream._3Light.font(size: 12) ) - - albumImageView.kf.setImage( - with: URL(string: WMImageAPI.fetchYoutubeThumbnail(id: model.ID).toString), + + let modifier = AnyImageModifier { return $0.withRenderingMode(.alwaysOriginal) } + albumImageButton.kf.setImage( + with: URL(string: WMImageAPI.fetchYoutubeThumbnail(id: model.songID).toString), + for: .normal, placeholder: DesignSystemAsset.Logo.placeHolderSmall.image, - options: [.transition(.fade(0.2))] + options: [.imageModifier(modifier), .transition(.fade(0.2))] ) } - - private func getAttributedString( +} + +private extension ArtistMusicCell { + func getAttributedString( text: String, font: UIFont ) -> NSMutableAttributedString { @@ -93,7 +80,7 @@ extension ArtistMusicCell { string: text, attributes: [ .font: font, - .foregroundColor: DesignSystemAsset.GrayColor.gray900.color, + .foregroundColor: DesignSystemAsset.BlueGrayColor.gray900.color, .kern: -0.5 ] ) diff --git a/Projects/Features/ArtistFeature/Sources/Views/ArtistPlayButtonGroupView.swift b/Projects/Features/ArtistFeature/Sources/Views/ArtistPlayButtonGroupView.swift index d787ff081..d9a03feac 100644 --- a/Projects/Features/ArtistFeature/Sources/Views/ArtistPlayButtonGroupView.swift +++ b/Projects/Features/ArtistFeature/Sources/Views/ArtistPlayButtonGroupView.swift @@ -6,42 +6,38 @@ // Copyright © 2023 yongbeomkwak. All rights reserved. // +import BaseFeature +import DesignSystem import Foundation import UIKit -import DesignSystem import Utility -import CommonFeature public class ArtistPlayButtonGroupView: UIView { - @IBOutlet weak var allPlayButton: UIButton! - @IBOutlet weak var shufflePlayButton: UIButton! + @IBOutlet weak var imageView: UIImageView! @IBOutlet var blurEffectViews: [UIVisualEffectView]! - + public weak var delegate: PlayButtonGroupViewDelegate? - public override init(frame: CGRect) { + override public init(frame: CGRect) { super.init(frame: frame) self.setupView() } - + required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) self.setupView() } - + @IBAction func allPlayButtonAction(_ sender: Any) { - delegate?.pressPlay(.allPlay) - } - - @IBAction func shufflePlayButtonAction(_ sender: Any) { - delegate?.pressPlay(.shufflePlay) + delegate?.play(.allPlay) } } extension ArtistPlayButtonGroupView { - private func setupView(){ - guard let view = Bundle.module.loadNibNamed("ArtistPlayButtonGroupView", owner: self, options: nil)?.first as? UIView else { return } + private func setupView() { + guard let view = Bundle.module.loadNibNamed("ArtistPlayButtonGroupView", owner: self, options: nil)? + .first as? UIView else { return } view.frame = self.bounds view.layoutIfNeeded() self.addSubview(view) @@ -52,38 +48,26 @@ extension ArtistPlayButtonGroupView { extension ArtistPlayButtonGroupView { private func configureUI() { - //전체재생 + imageView.image = DesignSystemAsset.Chart.allPlay.image.withRenderingMode(.alwaysOriginal) + // 전체재생 allPlayButton.layer.cornerRadius = 8 allPlayButton.layer.borderWidth = 1 - allPlayButton.layer.borderColor = DesignSystemAsset.GrayColor.gray200.color.withAlphaComponent(0.7).cgColor + allPlayButton.layer.borderColor = DesignSystemAsset.BlueGrayColor.gray200.color.withAlphaComponent(0.7).cgColor allPlayButton.backgroundColor = UIColor.white.withAlphaComponent(0.4) - allPlayButton.setImage(DesignSystemAsset.Chart.allPlay.image.withRenderingMode(.alwaysOriginal), for: .normal) - allPlayButton.contentEdgeInsets = UIEdgeInsets(top: 0, left: -10, bottom: 0, right: 0) - allPlayButton.titleEdgeInsets = UIEdgeInsets(top: 0, left: 6, bottom: 0, right: 0) - let allButtonAttributedString = NSMutableAttributedString.init(string: "전체재생") - allButtonAttributedString.addAttributes([.font: DesignSystemFontFamily.Pretendard.medium.font(size: 14), - .foregroundColor: DesignSystemAsset.GrayColor.gray900.color, - .kern: -0.5], - range: NSRange(location: 0, length: allButtonAttributedString.string.count)) + allButtonAttributedString.addAttributes( + [ + .font: DesignSystemFontFamily.Pretendard.medium.font(size: 14), + .foregroundColor: DesignSystemAsset.BlueGrayColor.gray900.color, + .kern: -0.5 + ], + range: NSRange( + location: 0, + length: allButtonAttributedString.string.count + ) + ) allPlayButton.setAttributedTitle(allButtonAttributedString, for: .normal) - //랜덤재생 - shufflePlayButton.layer.cornerRadius = 8 - shufflePlayButton.layer.borderWidth = 1 - shufflePlayButton.layer.borderColor = DesignSystemAsset.GrayColor.gray200.color.withAlphaComponent(0.7).cgColor - shufflePlayButton.backgroundColor = UIColor.white.withAlphaComponent(0.4) - shufflePlayButton.setImage(DesignSystemAsset.Chart.shufflePlay.image.withRenderingMode(.alwaysOriginal), for: .normal) - shufflePlayButton.contentEdgeInsets = UIEdgeInsets(top: 0, left: -10, bottom: 0, right: 0) - shufflePlayButton.titleEdgeInsets = UIEdgeInsets(top: 0, left: 6, bottom: 0, right: 0) - - let shuffleButtonAttributedString = NSMutableAttributedString.init(string: "랜덤재생") - shuffleButtonAttributedString.addAttributes([.font: DesignSystemFontFamily.Pretendard.medium.font(size: 14), - .foregroundColor: DesignSystemAsset.GrayColor.gray900.color, - .kern: -0.5], - range: NSRange(location: 0, length: shuffleButtonAttributedString.string.count)) - shufflePlayButton.setAttributedTitle(shuffleButtonAttributedString, for: .normal) - blurEffectViews.forEach { $0.layer.cornerRadius = 8 $0.clipsToBounds = true diff --git a/Projects/Features/ArtistFeature/Sources/WaterfallLayout/WaterfallLayout.swift b/Projects/Features/ArtistFeature/Sources/WaterfallLayout/WaterfallLayout.swift index dad873ba9..a0d6439bc 100644 --- a/Projects/Features/ArtistFeature/Sources/WaterfallLayout/WaterfallLayout.swift +++ b/Projects/Features/ArtistFeature/Sources/WaterfallLayout/WaterfallLayout.swift @@ -3,67 +3,103 @@ import UIKit public protocol WaterfallLayoutDelegate: AnyObject { // MARK: - Required func collectionViewLayout(for section: Int) -> WaterfallLayout.Layout - func collectionView(_ collectionView: UICollectionView, - layout: WaterfallLayout, - sizeForItemAt indexPath: IndexPath) -> CGSize + func collectionView( + _ collectionView: UICollectionView, + layout: WaterfallLayout, + sizeForItemAt indexPath: IndexPath + ) -> CGSize // MARK: - Optional - func collectionView(_ collectionView: UICollectionView, - layout: WaterfallLayout, - minimumInteritemSpacingFor section: Int) -> CGFloat? - func collectionView(_ collectionView: UICollectionView, - layout: WaterfallLayout, - minimumLineSpacingFor section: Int) -> CGFloat? - func collectionView(_ collectionView: UICollectionView, - layout: WaterfallLayout, - sectionInsetFor section: Int) -> UIEdgeInsets? - func collectionView(_ collectionView: UICollectionView, - layout: WaterfallLayout, - headerHeightFor section: Int) -> CGFloat? - func collectionView(_ collectionView: UICollectionView, - layout: WaterfallLayout, - headerInsetFor section: Int) -> UIEdgeInsets? - func collectionView(_ collectionView: UICollectionView, - layout: WaterfallLayout, - footerHeightFor section: Int) -> CGFloat? - func collectionView(_ collectionView: UICollectionView, - layout: WaterfallLayout, - footerInsetFor section: Int) -> UIEdgeInsets? - func collectionView(_ collectionView: UICollectionView, - layout: WaterfallLayout, - estimatedSizeForItemAt indexPath: IndexPath) -> CGSize? + func collectionView( + _ collectionView: UICollectionView, + layout: WaterfallLayout, + minimumInteritemSpacingFor section: Int + ) -> CGFloat? + func collectionView( + _ collectionView: UICollectionView, + layout: WaterfallLayout, + minimumLineSpacingFor section: Int + ) -> CGFloat? + func collectionView( + _ collectionView: UICollectionView, + layout: WaterfallLayout, + sectionInsetFor section: Int + ) -> UIEdgeInsets? + func collectionView( + _ collectionView: UICollectionView, + layout: WaterfallLayout, + headerHeightFor section: Int + ) -> CGFloat? + func collectionView( + _ collectionView: UICollectionView, + layout: WaterfallLayout, + headerInsetFor section: Int + ) -> UIEdgeInsets? + func collectionView( + _ collectionView: UICollectionView, + layout: WaterfallLayout, + footerHeightFor section: Int + ) -> CGFloat? + func collectionView( + _ collectionView: UICollectionView, + layout: WaterfallLayout, + footerInsetFor section: Int + ) -> UIEdgeInsets? + func collectionView( + _ collectionView: UICollectionView, + layout: WaterfallLayout, + estimatedSizeForItemAt indexPath: IndexPath + ) -> CGSize? } -extension WaterfallLayoutDelegate { - public func collectionView(_ collectionView: UICollectionView, - layout: WaterfallLayout, - minimumInteritemSpacingFor section: Int) -> CGFloat? { return nil } - public func collectionView(_ collectionView: UICollectionView, - layout: WaterfallLayout, - minimumLineSpacingFor section: Int) -> CGFloat? { return nil } - public func collectionView(_ collectionView: UICollectionView, - layout: WaterfallLayout, - sectionInsetFor section: Int) -> UIEdgeInsets? { return nil } - public func collectionView(_ collectionView: UICollectionView, - layout: WaterfallLayout, - headerHeightFor section: Int) -> CGFloat? { return nil } - public func collectionView(_ collectionView: UICollectionView, - layout: WaterfallLayout, - headerInsetFor section: Int) -> UIEdgeInsets? { return nil } - public func collectionView(_ collectionView: UICollectionView, - layout: WaterfallLayout, - footerHeightFor section: Int) -> CGFloat? { return nil } - public func collectionView(_ collectionView: UICollectionView, - layout: WaterfallLayout, - footerInsetFor section: Int) -> UIEdgeInsets? { return nil } - public func collectionView(_ collectionView: UICollectionView, - layout: WaterfallLayout, - estimatedSizeForItemAt indexPath: IndexPath) -> CGSize? { return nil } +public extension WaterfallLayoutDelegate { + func collectionView( + _ collectionView: UICollectionView, + layout: WaterfallLayout, + minimumInteritemSpacingFor section: Int + ) -> CGFloat? { return nil } + func collectionView( + _ collectionView: UICollectionView, + layout: WaterfallLayout, + minimumLineSpacingFor section: Int + ) -> CGFloat? { return nil } + func collectionView( + _ collectionView: UICollectionView, + layout: WaterfallLayout, + sectionInsetFor section: Int + ) -> UIEdgeInsets? { return nil } + func collectionView( + _ collectionView: UICollectionView, + layout: WaterfallLayout, + headerHeightFor section: Int + ) -> CGFloat? { return nil } + func collectionView( + _ collectionView: UICollectionView, + layout: WaterfallLayout, + headerInsetFor section: Int + ) -> UIEdgeInsets? { return nil } + func collectionView( + _ collectionView: UICollectionView, + layout: WaterfallLayout, + footerHeightFor section: Int + ) -> CGFloat? { return nil } + func collectionView( + _ collectionView: UICollectionView, + layout: WaterfallLayout, + footerInsetFor section: Int + ) -> UIEdgeInsets? { return nil } + func collectionView( + _ collectionView: UICollectionView, + layout: WaterfallLayout, + estimatedSizeForItemAt indexPath: IndexPath + ) -> CGSize? { return nil } } public class WaterfallLayout: UICollectionViewLayout { - public static let automaticSize: CGSize = CGSize(width: CGFloat.greatestFiniteMagnitude, - height: .greatestFiniteMagnitude) + public static let automaticSize: CGSize = CGSize( + width: CGFloat.greatestFiniteMagnitude, + height: .greatestFiniteMagnitude + ) public enum DistributionMethod { case equal @@ -82,7 +118,7 @@ public class WaterfallLayout: UICollectionViewLayout { } } - public struct Const { + public enum Const { static let minimumLineSpacing: CGFloat = 10.0 static let minimumInteritemSpacing: CGFloat = 10.0 static let sectionInset: UIEdgeInsets = .zero @@ -134,7 +170,7 @@ public class WaterfallLayout: UICollectionViewLayout { public weak var delegate: WaterfallLayoutDelegate? - public override func prepare() { + override public func prepare() { super.prepare() cleaunup() @@ -144,21 +180,21 @@ public class WaterfallLayout: UICollectionViewLayout { let numberOfSections = collectionView.numberOfSections if numberOfSections == 0 { return } - (0.. 0 else { + override public var collectionViewContentSize: CGSize { + guard let collectionView = collectionView, collectionView.numberOfSections > 0 else { return .zero } var contentSize = collectionView.bounds.size @@ -166,7 +202,7 @@ public class WaterfallLayout: UICollectionViewLayout { return contentSize } - public override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? { + override public func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? { if indexPath.section >= sectionItemAttributes.count { return nil } @@ -176,16 +212,18 @@ public class WaterfallLayout: UICollectionViewLayout { return sectionItemAttributes[indexPath.section][indexPath.item] } - public override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? { + override public func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? { return allItemAttributes.filter { rect.intersects($0.frame) } } - public override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool { + override public func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool { return newBounds.width != (collectionView?.bounds ?? .zero).width } - override public func shouldInvalidateLayout(forPreferredLayoutAttributes preferredAttributes: UICollectionViewLayoutAttributes, - withOriginalAttributes originalAttributes: UICollectionViewLayoutAttributes) -> Bool { + override public func shouldInvalidateLayout( + forPreferredLayoutAttributes preferredAttributes: UICollectionViewLayoutAttributes, + withOriginalAttributes originalAttributes: UICollectionViewLayoutAttributes + ) -> Bool { if let delegate = delegate { // For .waterfall mode, disabling shouldInvalidateLayout will prevent infinite loop to occur due to unstable constraints. // e.g. UIImageView causes AL constraints to be updated due to content hugging that causes infinite UI update. @@ -197,9 +235,15 @@ public class WaterfallLayout: UICollectionViewLayout { return cachedItemSizes[originalAttributes.indexPath] != preferredAttributes.size } - override public func invalidationContext(forPreferredLayoutAttributes preferredAttributes: UICollectionViewLayoutAttributes, - withOriginalAttributes originalAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutInvalidationContext { - let context = super.invalidationContext(forPreferredLayoutAttributes: preferredAttributes, withOriginalAttributes: originalAttributes) + override public func invalidationContext( + forPreferredLayoutAttributes preferredAttributes: UICollectionViewLayoutAttributes, + withOriginalAttributes originalAttributes: UICollectionViewLayoutAttributes + ) + -> UICollectionViewLayoutInvalidationContext { + let context = super.invalidationContext( + forPreferredLayoutAttributes: preferredAttributes, + withOriginalAttributes: originalAttributes + ) guard collectionView != nil else { return context } @@ -224,7 +268,12 @@ public class WaterfallLayout: UICollectionViewLayout { if old != new { invalidateLayout() } } - private func layoutHeader(position: inout CGFloat, collectionView: UICollectionView, delegate: WaterfallLayoutDelegate, section: Int) { + private func layoutHeader( + position: inout CGFloat, + collectionView: UICollectionView, + delegate: WaterfallLayoutDelegate, + section: Int + ) { let columnCount = delegate.collectionViewLayout(for: section).column let headerHeight = self.headerHeight(for: section) let headerInset = self.headerInset(for: section) @@ -232,7 +281,10 @@ public class WaterfallLayout: UICollectionViewLayout { position += headerInset.top if headerHeight > 0 { - let attributes = UICollectionViewLayoutAttributes(forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, with: [section, 0]) + let attributes = UICollectionViewLayoutAttributes( + forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, + with: [section, 0] + ) attributes.frame = CGRect( x: headerInset.left, y: position, @@ -249,20 +301,21 @@ public class WaterfallLayout: UICollectionViewLayout { columnHeights[section] = Array(repeating: position, count: columnCount) } - private func pickColumn(itemIndex: Int, - delegate: WaterfallLayoutDelegate, - section: Int) -> Int { - + private func pickColumn( + itemIndex: Int, + delegate: WaterfallLayoutDelegate, + section: Int + ) -> Int { let layout = delegate.collectionViewLayout(for: section) switch layout { case .flow: let columnCount = delegate.collectionViewLayout(for: section).column return itemIndex % columnCount - case .waterfall(_, let distributionMethod): + case let .waterfall(_, distributionMethod): if distributionMethod == .balanced { var minIndex: Int = 0 var minValue = CGFloat.greatestFiniteMagnitude - columnHeights[section].enumerated().forEach { (index, element) in + columnHeights[section].enumerated().forEach { index, element in if element < minValue { minIndex = index minValue = element @@ -276,7 +329,12 @@ public class WaterfallLayout: UICollectionViewLayout { } } - private func layoutItems(position: CGFloat, collectionView: UICollectionView, delegate: WaterfallLayoutDelegate, section: Int) { + private func layoutItems( + position: CGFloat, + collectionView: UICollectionView, + delegate: WaterfallLayoutDelegate, + section: Int + ) { let sectionInset = self.sectionInset(for: section) let minimumInteritemSpacing = self.minimumInteritemSpacing(for: section) let minimumLineSpacing = self.minimumInteritemSpacing(for: section) @@ -289,7 +347,7 @@ public class WaterfallLayout: UICollectionViewLayout { var itemAttributes: [UICollectionViewLayoutAttributes] = [] - (0.. 0 && itemSize.width > 0 ? floor(itemSize.height * itemWidth / itemSize.width) : 0.0 + itemHeight = itemSize.height > 0 && itemSize + .width > 0 ? floor(itemSize.height * itemWidth / itemSize.width) : 0.0 } let offsetY: CGFloat @@ -323,7 +382,8 @@ public class WaterfallLayout: UICollectionViewLayout { columnHeights[section][columnIndex] = attributes.frame.maxY + minimumInteritemSpacing if case .flow = layout, index % columnCount == columnCount - 1 { - let maxHeight = columnHeights[section].enumerated().sorted { $0.element > $1.element }.first?.element ?? 0.0 + let maxHeight = columnHeights[section].enumerated().sorted { $0.element > $1.element }.first? + .element ?? 0.0 columnHeights[section] = Array(repeating: maxHeight, count: columnCount) } } @@ -331,13 +391,19 @@ public class WaterfallLayout: UICollectionViewLayout { sectionItemAttributes.append(itemAttributes) } - private func layoutFooter(position: inout CGFloat, collectionView: UICollectionView, delegate: WaterfallLayoutDelegate, section: Int) { + private func layoutFooter( + position: inout CGFloat, + collectionView: UICollectionView, + delegate: WaterfallLayoutDelegate, + section: Int + ) { let sectionInset = self.sectionInset(for: section) let minimumInteritemSpacing = self.minimumInteritemSpacing(for: section) let columnCount = delegate.collectionViewLayout(for: section).column - let longestColumnIndex = columnHeights[section].enumerated().sorted { $0.element > $1.element }.first?.offset ?? 0 + let longestColumnIndex = columnHeights[section].enumerated().sorted { $0.element > $1.element }.first? + .offset ?? 0 - if columnHeights[section].count > 0 { + if !columnHeights[section].isEmpty { position = columnHeights[section][longestColumnIndex] - minimumInteritemSpacing + sectionInset.bottom } else { position = 0.0 @@ -347,8 +413,16 @@ public class WaterfallLayout: UICollectionViewLayout { position += footerInset.top if footerHeight > 0.0 { - let attributes = UICollectionViewLayoutAttributes(forSupplementaryViewOfKind: UICollectionView.elementKindSectionFooter, with: [section, 0]) - attributes.frame = CGRect(x: footerInset.left, y: position, width: collectionView.bounds.width - (footerInset.left + footerInset.right), height: footerHeight) + let attributes = UICollectionViewLayoutAttributes( + forSupplementaryViewOfKind: UICollectionView.elementKindSectionFooter, + with: [section, 0] + ) + attributes.frame = CGRect( + x: footerInset.left, + y: position, + width: collectionView.bounds.width - (footerInset.left + footerInset.right), + height: footerHeight + ) footersAttribute[section] = attributes allItemAttributes.append(attributes) position = attributes.frame.maxY + footerInset.bottom @@ -357,34 +431,45 @@ public class WaterfallLayout: UICollectionViewLayout { } private func minimumInteritemSpacing(for section: Int) -> CGFloat { - return collectionView.flatMap { delegate?.collectionView($0, layout: self, minimumInteritemSpacingFor: section) } ?? minimumInteritemSpacing + return collectionView + .flatMap { delegate?.collectionView($0, layout: self, minimumInteritemSpacingFor: section) } ?? + minimumInteritemSpacing } private func minimumLineSpacing(for section: Int) -> CGFloat { - return collectionView.flatMap { delegate?.collectionView($0, layout: self, minimumLineSpacingFor: section) } ?? minimumLineSpacing + return collectionView + .flatMap { delegate?.collectionView($0, layout: self, minimumLineSpacingFor: section) } ?? + minimumLineSpacing } private func sectionInset(for section: Int) -> UIEdgeInsets { - return collectionView.flatMap { delegate?.collectionView($0, layout: self, sectionInsetFor: section) } ?? sectionInset + return collectionView + .flatMap { delegate?.collectionView($0, layout: self, sectionInsetFor: section) } ?? sectionInset } private func headerHeight(for section: Int) -> CGFloat { - return collectionView.flatMap { delegate?.collectionView($0, layout: self, headerHeightFor: section) } ?? headerHeight + return collectionView + .flatMap { delegate?.collectionView($0, layout: self, headerHeightFor: section) } ?? headerHeight } private func headerInset(for section: Int) -> UIEdgeInsets { - return collectionView.flatMap { delegate?.collectionView($0, layout: self, headerInsetFor: section) } ?? headerInset + return collectionView + .flatMap { delegate?.collectionView($0, layout: self, headerInsetFor: section) } ?? headerInset } private func footerHeight(for section: Int) -> CGFloat { - return collectionView.flatMap { delegate?.collectionView($0, layout: self, footerHeightFor: section) } ?? footerHeight + return collectionView + .flatMap { delegate?.collectionView($0, layout: self, footerHeightFor: section) } ?? footerHeight } private func footerInset(for section: Int) -> UIEdgeInsets { - return collectionView.flatMap { delegate?.collectionView($0, layout: self, footerInsetFor: section) } ?? footerInset + return collectionView + .flatMap { delegate?.collectionView($0, layout: self, footerInsetFor: section) } ?? footerInset } private func estimatedSizeForItemAt(_ indexPath: IndexPath) -> CGSize { - return collectionView.flatMap { delegate?.collectionView($0, layout: self, estimatedSizeForItemAt: indexPath) } ?? estimatedItemSize + return collectionView + .flatMap { delegate?.collectionView($0, layout: self, estimatedSizeForItemAt: indexPath) } ?? + estimatedItemSize } } diff --git a/Projects/Features/ArtistFeature/Tests/ArtistReactorTests.swift b/Projects/Features/ArtistFeature/Tests/ArtistReactorTests.swift new file mode 100644 index 000000000..9baa9dcb2 --- /dev/null +++ b/Projects/Features/ArtistFeature/Tests/ArtistReactorTests.swift @@ -0,0 +1,91 @@ +import ArtistDomainInterface +@testable import ArtistDomainTesting +@testable import ArtistFeature +import XCTest + +final class ArtistReactorTests: XCTestCase { + var fetchArtistListUseCase: FetchArtistListUseCaseSpy! + var sut: ArtistReactor! + + override func setUp() { + super.setUp() + fetchArtistListUseCase = .init() + sut = ArtistReactor(fetchArtistListUseCase: fetchArtistListUseCase) + } + + override func tearDown() { + super.tearDown() + fetchArtistListUseCase = nil + sut = nil + } + + func test_when_viewDidLoad_action_and_artist_count_is_1_then_insert_zero_index_hidden_item() { + // Given + let dummyArtistList = [makeTwoDummyArtistList().first!] + fetchArtistListUseCase.handler = { + return .just(dummyArtistList) + } + + // When + sut.action.onNext(.viewDidLoad) + + // Then + XCTAssertEqual(fetchArtistListUseCase.callCount, 1) + XCTAssertEqual(sut.currentState.artistList[0], dummyArtistList.first) + XCTAssertEqual(sut.currentState.artistList[0].id, "") + XCTAssertEqual(sut.currentState.artistList[0].isHiddenItem, false) + } + + func test_when_viewDidLoad_action_and_artist_count_greater_than_2_then_swap_index_0_and_1() { + // Given + let dummyArtistList = makeTwoDummyArtistList() + fetchArtistListUseCase.handler = { + return .just(dummyArtistList) + } + let expectedArtistList = { + var list = dummyArtistList + list.swapAt(0, 1) + return list + }() + + // When + sut.action.onNext(.viewDidLoad) + + // Then + XCTAssertEqual(fetchArtistListUseCase.callCount, 1) + XCTAssertEqual(sut.currentState.artistList, expectedArtistList) + } + + private func makeTwoDummyArtistList() -> [ArtistEntity] { + [ + ArtistEntity( + id: "", + krName: "", + enName: "", + groupName: "", + title: "", + description: "", + personalColor: "", + roundImage: "", + squareImage: "", + graduated: false, + playlist: .init(latest: "", popular: "", oldest: ""), + isHiddenItem: false + ), + ArtistEntity( + id: "2", + krName: "nam2", + enName: "eng2", + groupName: "group2", + title: "title2", + description: "description2", + personalColor: "ffffff", + roundImage: "", + squareImage: "", + graduated: false, + playlist: .init(latest: "", popular: "", oldest: ""), + isHiddenItem: false + ) + ] + } +} diff --git a/Projects/Features/ArtistFeature/Tests/TargetTests.swift b/Projects/Features/ArtistFeature/Tests/TargetTests.swift deleted file mode 100644 index b1cf79405..000000000 --- a/Projects/Features/ArtistFeature/Tests/TargetTests.swift +++ /dev/null @@ -1,17 +0,0 @@ -import XCTest - -class TargetTests: XCTestCase { - - override func setUpWithError() throws { - // Put setup code here. This method is called before the invocation of each test method in the class. - } - - override func tearDownWithError() throws { - // Put teardown code here. This method is called after the invocation of each test method in the class. - } - - func testExample() throws { - XCTAssertEqual("A", "A") - } - -} diff --git a/Projects/Features/BaseFeature/.swiftlint.yml b/Projects/Features/BaseFeature/.swiftlint.yml deleted file mode 100644 index ff44f9f28..000000000 --- a/Projects/Features/BaseFeature/.swiftlint.yml +++ /dev/null @@ -1,20 +0,0 @@ -excluded: - - "**/*/NeedleGenerated.swift" - - "Tuist" - - -force_cast: # From https://realm.github.io/SwiftLint/force_cast.html - warning # 강제 캐스팅은 error에서 warning으로 변경 - -disabled_rules: - - trailing_whitespace - - vertical_whitespace - - colon - - comma - - comment_spacing # 주석 여백 - - mark # //MARK 관련 warning - - opening_brace # 괄호 열 때 줄바꿈을 했는지 안했는지, (안했으면 warning) - - line_length # 한줄에 글자 수 제한 , warning: 120, error: 200 (default) - - statement_position # if는 반드시 else로 끝나야한다. - - identifier_name #변수명 글자 수 제한 - diff --git a/Projects/Features/BaseFeature/Interface/ContainSongs/ContainSongsFactory.swift b/Projects/Features/BaseFeature/Interface/ContainSongs/ContainSongsFactory.swift new file mode 100644 index 000000000..930bfb13c --- /dev/null +++ b/Projects/Features/BaseFeature/Interface/ContainSongs/ContainSongsFactory.swift @@ -0,0 +1,5 @@ +import UIKit + +public protocol ContainSongsFactory { + func makeView(songs: [String]) -> UIViewController +} diff --git a/Projects/Features/BaseFeature/Interface/Enum/PlayListType.swift b/Projects/Features/BaseFeature/Interface/Enum/PlayListType.swift new file mode 100644 index 000000000..b7d23ee7c --- /dev/null +++ b/Projects/Features/BaseFeature/Interface/Enum/PlayListType.swift @@ -0,0 +1,6 @@ +import Foundation + +public enum PlaylistType { + case custom + case wmRecommend +} diff --git a/Projects/Features/BaseFeature/Interface/Enum/PurposeType.swift b/Projects/Features/BaseFeature/Interface/Enum/PurposeType.swift new file mode 100644 index 000000000..7fcfa3e96 --- /dev/null +++ b/Projects/Features/BaseFeature/Interface/Enum/PurposeType.swift @@ -0,0 +1,60 @@ +import Foundation + +public enum PurposeType { + case creation + case updatePlaylistTitle + case nickname +} + +public extension PurposeType { + var title: String { + switch self { + case .creation: + return "리스트 만들기" + case .updatePlaylistTitle: + return "리스트 수정하기" + case .nickname: + return "닉네임 수정" + } + } + + var subTitle: String { + switch self { + case .creation: + return "리스트 제목" + case .updatePlaylistTitle: + return "리스트 제목" + case .nickname: + return "닉네임" + } + } + + var btnText: String { + switch self { + case .creation: + return "리스트 생성" + case .updatePlaylistTitle: + return "리스트 수정" + case .nickname: + return "완료" + } + } + + var textLimitCount: Int { + switch self { + case .creation, .updatePlaylistTitle: + return 12 + case .nickname: + return 12 + } + } + + var placeHolder: String { + switch self { + case .creation, .updatePlaylistTitle: + return "리스트 제목을 입력하세요." + case .nickname: + return "닉네임을 입력하세요." + } + } +} diff --git a/Projects/Features/BaseFeature/Interface/MultiPurposePopup/MultiPurposePopupFactory.swift b/Projects/Features/BaseFeature/Interface/MultiPurposePopup/MultiPurposePopupFactory.swift new file mode 100644 index 000000000..bce2c594a --- /dev/null +++ b/Projects/Features/BaseFeature/Interface/MultiPurposePopup/MultiPurposePopupFactory.swift @@ -0,0 +1,9 @@ +import UIKit + +public protocol MultiPurposePopupFactory { + func makeView( + type: PurposeType, + key: String, + completion: ((String) -> Void)? + ) -> UIViewController +} diff --git a/Projects/Features/BaseFeature/Interface/Privacy/PrivacyFactory.swift b/Projects/Features/BaseFeature/Interface/Privacy/PrivacyFactory.swift new file mode 100644 index 000000000..75be26c6c --- /dev/null +++ b/Projects/Features/BaseFeature/Interface/Privacy/PrivacyFactory.swift @@ -0,0 +1,5 @@ +import UIKit + +public protocol PrivacyFactory { + func makeView() -> UIViewController +} diff --git a/Projects/Features/BaseFeature/Interface/ServiceTerm/ServiceTermFactory.swift b/Projects/Features/BaseFeature/Interface/ServiceTerm/ServiceTermFactory.swift new file mode 100644 index 000000000..da3a20d2e --- /dev/null +++ b/Projects/Features/BaseFeature/Interface/ServiceTerm/ServiceTermFactory.swift @@ -0,0 +1,5 @@ +import UIKit + +public protocol ServiceTermFactory { + func makeView() -> UIViewController +} diff --git a/Projects/Features/BaseFeature/Interface/TextPopup/TextPopupFactory.swift b/Projects/Features/BaseFeature/Interface/TextPopup/TextPopupFactory.swift new file mode 100644 index 000000000..e4abc1518 --- /dev/null +++ b/Projects/Features/BaseFeature/Interface/TextPopup/TextPopupFactory.swift @@ -0,0 +1,32 @@ +import UIKit + +public protocol TextPopupFactory { + func makeView( + text: String?, + cancelButtonIsHidden: Bool, + confirmButtonText: String?, + cancelButtonText: String?, + completion: (() -> Void)?, + cancelCompletion: (() -> Void)? + ) -> UIViewController +} + +public extension TextPopupFactory { + func makeView( + text: String? = nil, + cancelButtonIsHidden: Bool = false, + confirmButtonText: String? = nil, + cancelButtonText: String? = nil, + completion: (() -> Void)? = nil, + cancelCompletion: (() -> Void)? = nil + ) -> UIViewController { + self.makeView( + text: text, + cancelButtonIsHidden: cancelButtonIsHidden, + confirmButtonText: confirmButtonText, + cancelButtonText: cancelButtonText, + completion: completion, + cancelCompletion: cancelCompletion + ) + } +} diff --git a/Projects/Features/BaseFeature/Project.swift b/Projects/Features/BaseFeature/Project.swift index ddcad40e8..266229e2d 100644 --- a/Projects/Features/BaseFeature/Project.swift +++ b/Projects/Features/BaseFeature/Project.swift @@ -1,13 +1,40 @@ +import DependencyPlugin import ProjectDescription import ProjectDescriptionHelpers -let project = Project.makeModule( - name: "BaseFeature", - product: .staticFramework, - dependencies: [ - .Project.Service.Domain, - .Project.Module.FeatureThirdPartyLib, - .Project.UserInterfaces.DesignSystem, - .Project.Module.Utility +#warning("에러 모듈위치 변경 필요") +let project = Project.module( + name: ModulePaths.Feature.BaseFeature.rawValue, + targets: [ + .interface(module: .feature(.BaseFeature)), + .implements( + module: .feature(.BaseFeature), + product: .staticFramework, + spec: .init( + resources: ["Resources/**"], + dependencies: [ + .feature(target: .BaseFeature, type: .interface), + .domain(target: .BaseDomain, type: .interface), + .domain(target: .AuthDomain, type: .interface), + .domain(target: .PlaylistDomain, type: .interface), + .domain(target: .UserDomain, type: .interface), + .domain(target: .NoticeDomain, type: .interface), + .domain(target: .PriceDomain, type: .interface), + .module(target: .ErrorModule), + .module(target: .FeatureThirdPartyLib), + .userInterface(target: .DesignSystem), + .module(target: .Utility), + .SPM.RxGesture, + ] + ) + ), + .testing( + module: .feature(.BaseFeature), + dependencies: [ + .feature(target: .BaseFeature), + .feature(target: .BaseFeature, type: .interface), + .domain(target: .BaseDomain, type: .testing) + ] + ) ] ) diff --git a/Projects/Features/BaseFeature/Resources/Base.storyboard b/Projects/Features/BaseFeature/Resources/Base.storyboard new file mode 100644 index 000000000..18bf99a94 --- /dev/null +++ b/Projects/Features/BaseFeature/Resources/Base.storyboard @@ -0,0 +1,510 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Projects/Features/BaseFeature/Resources/ContainPlaylistHeaderView.xib b/Projects/Features/BaseFeature/Resources/ContainPlaylistHeaderView.xib new file mode 100644 index 000000000..f36f7353e --- /dev/null +++ b/Projects/Features/BaseFeature/Resources/ContainPlaylistHeaderView.xib @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Projects/Features/CommonFeature/Resources/EditSheetView/EditSheetView.xib b/Projects/Features/BaseFeature/Resources/EditSheetView.xib similarity index 94% rename from Projects/Features/CommonFeature/Resources/EditSheetView/EditSheetView.xib rename to Projects/Features/BaseFeature/Resources/EditSheetView.xib index b8944a687..3285b2354 100644 --- a/Projects/Features/CommonFeature/Resources/EditSheetView/EditSheetView.xib +++ b/Projects/Features/BaseFeature/Resources/EditSheetView.xib @@ -1,15 +1,15 @@ - + - + - + @@ -90,12 +90,12 @@ - + - + diff --git a/Projects/Features/CommonFeature/Resources/NoticeCollection/NoticeCollectionViewCell.xib b/Projects/Features/BaseFeature/Resources/NoticeCollectionViewCell.xib similarity index 94% rename from Projects/Features/CommonFeature/Resources/NoticeCollection/NoticeCollectionViewCell.xib rename to Projects/Features/BaseFeature/Resources/NoticeCollectionViewCell.xib index b51c06d74..c94c30d45 100644 --- a/Projects/Features/CommonFeature/Resources/NoticeCollection/NoticeCollectionViewCell.xib +++ b/Projects/Features/BaseFeature/Resources/NoticeCollectionViewCell.xib @@ -1,16 +1,15 @@ - + - - + - + diff --git a/Projects/Features/CommonFeature/Resources/PlayButtonGroup/PlayButtonGroupView.xib b/Projects/Features/BaseFeature/Resources/PlayButtonGroupView.xib similarity index 97% rename from Projects/Features/CommonFeature/Resources/PlayButtonGroup/PlayButtonGroupView.xib rename to Projects/Features/BaseFeature/Resources/PlayButtonGroupView.xib index 3eec06c64..67a0b7dfe 100644 --- a/Projects/Features/CommonFeature/Resources/PlayButtonGroup/PlayButtonGroupView.xib +++ b/Projects/Features/BaseFeature/Resources/PlayButtonGroupView.xib @@ -1,15 +1,14 @@ - + - - + - + diff --git a/Projects/Features/CommonFeature/Resources/RecommendPlayList/RecommendPlayListCell.xib b/Projects/Features/BaseFeature/Resources/RecommendPlayListCell.xib similarity index 85% rename from Projects/Features/CommonFeature/Resources/RecommendPlayList/RecommendPlayListCell.xib rename to Projects/Features/BaseFeature/Resources/RecommendPlayListCell.xib index a21f1132c..0e231112f 100644 --- a/Projects/Features/CommonFeature/Resources/RecommendPlayList/RecommendPlayListCell.xib +++ b/Projects/Features/BaseFeature/Resources/RecommendPlayListCell.xib @@ -1,16 +1,16 @@ - + - + - + @@ -24,7 +24,7 @@ diff --git a/Projects/Features/CommonFeature/Resources/RecommendPlayList/RecommendPlayListView.xib b/Projects/Features/BaseFeature/Resources/RecommendPlayListView.xib similarity index 96% rename from Projects/Features/CommonFeature/Resources/RecommendPlayList/RecommendPlayListView.xib rename to Projects/Features/BaseFeature/Resources/RecommendPlayListView.xib index e3ab80726..51e92165f 100644 --- a/Projects/Features/CommonFeature/Resources/RecommendPlayList/RecommendPlayListView.xib +++ b/Projects/Features/BaseFeature/Resources/RecommendPlayListView.xib @@ -1,14 +1,13 @@ - + - - + - + diff --git a/Projects/Features/CommonFeature/Resources/SongCartView/SongCartView.xib b/Projects/Features/BaseFeature/Resources/SongCartView.xib similarity index 99% rename from Projects/Features/CommonFeature/Resources/SongCartView/SongCartView.xib rename to Projects/Features/BaseFeature/Resources/SongCartView.xib index b92322f3d..ea2f4354c 100644 --- a/Projects/Features/CommonFeature/Resources/SongCartView/SongCartView.xib +++ b/Projects/Features/BaseFeature/Resources/SongCartView.xib @@ -1,15 +1,14 @@ - + - - + - + diff --git a/Projects/Features/CommonFeature/Resources/SongList/SongListCell.xib b/Projects/Features/BaseFeature/Resources/SongListCell.xib similarity index 97% rename from Projects/Features/CommonFeature/Resources/SongList/SongListCell.xib rename to Projects/Features/BaseFeature/Resources/SongListCell.xib index 4b10585ad..12464bf4d 100644 --- a/Projects/Features/CommonFeature/Resources/SongList/SongListCell.xib +++ b/Projects/Features/BaseFeature/Resources/SongListCell.xib @@ -1,15 +1,14 @@ - + - - + - + diff --git a/Projects/Features/CommonFeature/Resources/Warning/Warning.xib b/Projects/Features/BaseFeature/Resources/Warning.xib similarity index 97% rename from Projects/Features/CommonFeature/Resources/Warning/Warning.xib rename to Projects/Features/BaseFeature/Resources/Warning.xib index 2282b03b0..7476ccf19 100644 --- a/Projects/Features/CommonFeature/Resources/Warning/Warning.xib +++ b/Projects/Features/BaseFeature/Resources/Warning.xib @@ -1,15 +1,15 @@ - + - + - + diff --git a/Projects/Features/BaseFeature/Sources/Analytics/ContainSongsAnalyticsLog.swift b/Projects/Features/BaseFeature/Sources/Analytics/ContainSongsAnalyticsLog.swift new file mode 100644 index 000000000..2179de282 --- /dev/null +++ b/Projects/Features/BaseFeature/Sources/Analytics/ContainSongsAnalyticsLog.swift @@ -0,0 +1,14 @@ +import LogManager + +enum ContainSongsAnalyticsLog: AnalyticsLogType { + case clickCreatePlaylistButton(location: CreatePlaylistLocation) + case completeAddMusics(playlistId: String, count: Int) +} + +enum CreatePlaylistLocation: String, AnalyticsLogEnumParametable { + case addMusics = "add_musics" + + var description: String { + self.rawValue + } +} diff --git a/Projects/Features/BaseFeature/Sources/BaseViewController.swift b/Projects/Features/BaseFeature/Sources/BaseViewController.swift deleted file mode 100644 index aa0100305..000000000 --- a/Projects/Features/BaseFeature/Sources/BaseViewController.swift +++ /dev/null @@ -1,32 +0,0 @@ -// -// BaseViewController.swift -// BaseFeature -// -// Created by KTH on 2023/01/29. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit - -open class BaseViewController: UIViewController { - - open override func viewDidLoad() { - super.viewDidLoad() - configureCommonUI() - } -} - -extension BaseViewController { - - /// 1. 네비게이션 바 숨김, 2. 테이블 뷰를 사용한다면 섹션헤더 간격 0으로 설정 - private func configureCommonUI() { - self.navigationController?.setNavigationBarHidden(true, animated: false) - - if #available(iOS 15.0, *) { - let tableViews = self.view.subviews.map { $0 as? UITableView }.compactMap { $0 } - tableViews.forEach { - $0.sectionHeaderTopPadding = 0 - } - } - } -} diff --git a/Projects/Features/BaseFeature/Sources/Components/ContainSongsComponent.swift b/Projects/Features/BaseFeature/Sources/Components/ContainSongsComponent.swift new file mode 100644 index 000000000..f8abe6a35 --- /dev/null +++ b/Projects/Features/BaseFeature/Sources/Components/ContainSongsComponent.swift @@ -0,0 +1,35 @@ +import AuthDomainInterface +import BaseFeatureInterface +import Foundation +import NeedleFoundation +import PlaylistDomainInterface +import PriceDomainInterface +import UIKit +import UserDomainInterface + +public protocol ContainSongsDependency: Dependency { + var multiPurposePopupFactory: any MultiPurposePopupFactory { get } + var fetchPlayListUseCase: any FetchPlaylistUseCase { get } + var addSongIntoPlaylistUseCase: any AddSongIntoPlaylistUseCase { get } + var createPlaylistUseCase: any CreatePlaylistUseCase { get } + var fetchPlaylistCreationPriceUseCase: any FetchPlaylistCreationPriceUseCase { get } + var textPopupFactory: any TextPopupFactory { get } + var logoutUseCase: any LogoutUseCase { get } +} + +public final class ContainSongsComponent: Component, ContainSongsFactory { + public func makeView(songs: [String]) -> UIViewController { + return ContainSongsViewController.viewController( + multiPurposePopupFactory: dependency.multiPurposePopupFactory, + textPopupFactory: dependency.textPopupFactory, + viewModel: .init( + songs: songs, + createPlaylistUseCase: dependency.createPlaylistUseCase, + fetchPlayListUseCase: dependency.fetchPlayListUseCase, + addSongIntoPlaylistUseCase: dependency.addSongIntoPlaylistUseCase, + fetchPlaylistCreationPriceUsecase: dependency.fetchPlaylistCreationPriceUseCase, + logoutUseCase: dependency.logoutUseCase + ) + ) + } +} diff --git a/Projects/Features/BaseFeature/Sources/Components/MultiPurposePopupComponent.swift b/Projects/Features/BaseFeature/Sources/Components/MultiPurposePopupComponent.swift new file mode 100644 index 000000000..682ce3ff0 --- /dev/null +++ b/Projects/Features/BaseFeature/Sources/Components/MultiPurposePopupComponent.swift @@ -0,0 +1,23 @@ +import AuthDomainInterface +import BaseFeatureInterface +import Foundation +import NeedleFoundation +import PlaylistDomainInterface +import UIKit +import UserDomainInterface + +public final class MultiPurposePopupComponent: Component, MultiPurposePopupFactory { + public func makeView( + type: PurposeType, + key: String, + completion: ((String) -> Void)? + ) -> UIViewController { + return MultiPurposePopupViewController.viewController( + viewModel: .init( + type: type, + key: key + ), + completion: completion + ) + } +} diff --git a/Projects/Features/BaseFeature/Sources/Components/PrivacyComponent.swift b/Projects/Features/BaseFeature/Sources/Components/PrivacyComponent.swift new file mode 100644 index 000000000..a1ee6d6c9 --- /dev/null +++ b/Projects/Features/BaseFeature/Sources/Components/PrivacyComponent.swift @@ -0,0 +1,11 @@ +import BaseFeatureInterface +import NeedleFoundation +import UIKit + +public protocol PrivacyDependency: Dependency {} + +public final class PrivacyComponent: Component, PrivacyFactory { + public func makeView() -> UIViewController { + return ContractViewController.viewController(type: .privacy) + } +} diff --git a/Projects/Features/BaseFeature/Sources/Components/ServiceTermsComponent.swift b/Projects/Features/BaseFeature/Sources/Components/ServiceTermsComponent.swift new file mode 100644 index 000000000..2dd6d4aad --- /dev/null +++ b/Projects/Features/BaseFeature/Sources/Components/ServiceTermsComponent.swift @@ -0,0 +1,11 @@ +import BaseFeatureInterface +import NeedleFoundation +import UIKit + +public protocol ServiceTermsDependency: Dependency {} + +public final class ServiceTermsComponent: Component, ServiceTermFactory { + public func makeView() -> UIViewController { + return ContractViewController.viewController(type: .service) + } +} diff --git a/Projects/Features/BaseFeature/Sources/Components/TextPopUpComponent.swift b/Projects/Features/BaseFeature/Sources/Components/TextPopUpComponent.swift new file mode 100644 index 000000000..545b6aa10 --- /dev/null +++ b/Projects/Features/BaseFeature/Sources/Components/TextPopUpComponent.swift @@ -0,0 +1,23 @@ +import BaseFeatureInterface +import NeedleFoundation +import UIKit + +public final class TextPopupComponent: Component, TextPopupFactory { + public func makeView( + text: String?, + cancelButtonIsHidden: Bool, + confirmButtonText: String?, + cancelButtonText: String?, + completion: (() -> Void)?, + cancelCompletion: (() -> Void)? + ) -> UIViewController { + return TextPopupViewController.viewController( + text: text ?? "", + cancelButtonIsHidden: cancelButtonIsHidden, + confirmButtonText: confirmButtonText ?? "확인", + cancelButtonText: cancelButtonText ?? "취소", + completion: completion, + cancelCompletion: cancelCompletion + ) + } +} diff --git a/Projects/Features/BaseFeature/Sources/Etc/EditState.swift b/Projects/Features/BaseFeature/Sources/Etc/EditState.swift new file mode 100644 index 000000000..ad2b91f57 --- /dev/null +++ b/Projects/Features/BaseFeature/Sources/Etc/EditState.swift @@ -0,0 +1,11 @@ +import Foundation + +public struct EditState { + public var isEditing: Bool + public var force: Bool + + public init(isEditing: Bool, force: Bool) { + self.isEditing = isEditing + self.force = force + } +} diff --git a/Projects/Features/BaseFeature/Sources/Etc/PlayState/Entity/PlaylistLocalEntity.swift b/Projects/Features/BaseFeature/Sources/Etc/PlayState/Entity/PlaylistLocalEntity.swift new file mode 100644 index 000000000..86901c5a0 --- /dev/null +++ b/Projects/Features/BaseFeature/Sources/Etc/PlayState/Entity/PlaylistLocalEntity.swift @@ -0,0 +1,19 @@ +import Foundation +import RealmSwift + +final class PlaylistLocalEntity: Object { + @Persisted(primaryKey: true) var id: String + @Persisted var title: String + @Persisted var artist: String + + convenience init( + id: String, + title: String, + artist: String + ) { + self.init() + self.id = id + self.title = title + self.artist = artist + } +} diff --git a/Projects/Features/BaseFeature/Sources/Etc/PlayState/PlayState+Playlist.swift b/Projects/Features/BaseFeature/Sources/Etc/PlayState/PlayState+Playlist.swift new file mode 100644 index 000000000..cf85ac66b --- /dev/null +++ b/Projects/Features/BaseFeature/Sources/Etc/PlayState/PlayState+Playlist.swift @@ -0,0 +1,87 @@ +// +// PlayState+Playlist.swift +// CommonFeature +// +// Created by YoungK on 2023/04/01. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import Combine +import Foundation +import SongsDomainInterface +import Utility + +final class Playlist { + @Published private(set) var list: [PlaylistItem] = [] + + init(list: [PlaylistItem] = []) { + self.list = list + } + + var count: Int { return list.count } + var isEmpty: Bool { return list.isEmpty } + + internal func subscribeListChanges() -> AnyPublisher<[PlaylistItem], Never> { + $list.eraseToAnyPublisher() + } + + func append(_ item: PlaylistItem) { + list.append(item) + } + + func append(_ items: [PlaylistItem]) { + list.append(contentsOf: items) + } + + func insert(_ newElement: PlaylistItem, at: Int) { + list.insert(newElement, at: at) + } + + func update(contentsOf items: [PlaylistItem]) { + list = items + } + + func remove(at index: Int) { + list.remove(at: index) + } + + func remove(indexs: [Int]) { + let sortedIndexs = indexs.sorted(by: >) // 앞에서부터 삭제하면 인덱스 순서가 바뀜 + sortedIndexs.forEach { index in + remove(at: index) + } + } + + func remove(id: String) { + if let index = list.firstIndex(where: { $0.id == id }) { + remove(at: index) + } + } + + func removeAll() { + list.removeAll() + } + + func removeAll(where shouldBeRemoved: (PlaylistItem) -> Bool) { + list.removeAll(where: shouldBeRemoved) + } + + func contains(_ item: PlaylistItem) -> Bool { + return list.contains(item) + } + + func contains(id: String) -> Bool { + return list.contains { $0.id == id } + } + + func reorderPlaylist(from: Int, to: Int) { + let movedData = list[from] + list.remove(at: from) + list.insert(movedData, at: to) + } + + /// 해당 곡이 이미 재생목록에 있으면 재생목록 속 해당 곡의 index, 없으면 nil 리턴 + func uniqueIndex(of item: PlaylistItem) -> Int? { + return list.firstIndex(of: item) + } +} diff --git a/Projects/Features/BaseFeature/Sources/Etc/PlayState/PlayState+Public.swift b/Projects/Features/BaseFeature/Sources/Etc/PlayState/PlayState+Public.swift new file mode 100644 index 000000000..3d3e81726 --- /dev/null +++ b/Projects/Features/BaseFeature/Sources/Etc/PlayState/PlayState+Public.swift @@ -0,0 +1,39 @@ +// +// PlayState+Public.swift +// PlayerFeature +// +// Created by YoungK on 2023/03/25. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import Foundation +import SongsDomainInterface +import UIKit +import Utility + +public extension PlayState { + /// 주어진 곡들을 재생목록에 추가하고 재생합니다. + /// - 먼저 주어진 곡들의 첫번째 곡을 재생하며, 이후의 곡들은 재생목록의 마지막에 추가합니다. + /// - Parameter duplicateAllowed: 재생목록 추가 시 중복 허용 여부 (기본값: false) + func loadAndAppendSongsToPlaylist(_ songs: [SongsDomainInterface.SongEntity], duplicateAllowed: Bool = false) { + if songs.isEmpty { return } + // 1. 이미 있는 곡들 인덱스 찾기 + // 2. 리스트에서 해당 인덱스들 곡 삭제 + // 3. 리스트 뒤에 곡들 추가 + // 4. currentPlayIndex 변경 + // 5. 주어진 첫번째 곡 재생 + let existSongIndexs = songs.uniqueElements.compactMap { self.uniqueIndex(of: PlaylistItem(item: $0)) } + self.remove(indexs: existSongIndexs) + let mappedSongs = songs.uniqueElements.map { PlaylistItem(item: $0) } + self.append(contentsOf: mappedSongs) + } + + /// 주어진 곡들을 재생목록에 추가합니다. + /// - Parameter duplicateAllowed: 재생목록 추가 시 중복 허용 여부 (기본값: false) + func appendSongsToPlaylist(_ songs: [SongsDomainInterface.SongEntity], duplicateAllowed: Bool = false) { + let existSongIndexs = songs.uniqueElements.compactMap { self.uniqueIndex(of: PlaylistItem(item: $0)) } + self.remove(indexs: existSongIndexs) + let mappedSongs = songs.uniqueElements.map { PlaylistItem(item: $0) } + self.append(contentsOf: mappedSongs) + } +} diff --git a/Projects/Features/BaseFeature/Sources/Etc/PlayState/PlayState.swift b/Projects/Features/BaseFeature/Sources/Etc/PlayState/PlayState.swift new file mode 100644 index 000000000..fd0cf6938 --- /dev/null +++ b/Projects/Features/BaseFeature/Sources/Etc/PlayState/PlayState.swift @@ -0,0 +1,137 @@ +// +// PlayState.swift +// PlayerFeature +// +// Created by YoungK on 2023/02/20. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import Combine +import Foundation +import LogManager +import SongsDomainInterface +import Utility + +/// 완전히 도메인 로직으로 전환 고려 +public final class PlayState { + public static let shared = PlayState() + private var playlist: Playlist + private var subscription = Set() + public var count: Int { playlist.count } + public var isEmpty: Bool { playlist.isEmpty } + public var currentPlaylist: [PlaylistItem] { playlist.list } + public var listChangedPublisher: AnyPublisher<[PlaylistItem], Never> { playlist.subscribeListChanges() } + + private init() { + let playedList = RealmManager.shared.fetchRealmDB(PlaylistLocalEntity.self) + .toArray(type: PlaylistLocalEntity.self) + .map { PlaylistItem(id: $0.id, title: $0.title, artist: $0.artist) } + + self.playlist = Playlist(list: playedList) + subscribePlayListChanges() + } + + deinit { + LogManager.printDebug("🚀:: \(Self.self) deinit") + NotificationCenter.default.removeObserver(self) + } + + /// 플레이리스트에 변경사항이 생겼을 때, 로컬 DB를 덮어씁니다. + private func subscribePlayListChanges() { + playlist.subscribeListChanges() + .map { Array($0) } + .sink { [weak self] playlistItems in + LogManager.setUserProperty(property: .playlistSongTotal(count: playlistItems.count)) + self?.updatePlaylistChangesToLocalDB(playList: playlistItems) + } + .store(in: &subscription) + } + + private func updatePlaylistChangesToLocalDB(playList: [PlaylistItem]) { + let allPlayedLists = RealmManager.shared.fetchRealmDB(PlaylistLocalEntity.self) + RealmManager.shared.deleteRealmDB(model: allPlayedLists) + + let playedList = playList.map { + PlaylistLocalEntity( + id: $0.id, + title: $0.title, + artist: $0.artist + ) + } + RealmManager.shared.addRealmDB(model: playedList) + } + + public func fetchPlayListFromLocalDB() -> [PlaylistItem] { + let playedList = RealmManager.shared.fetchRealmDB(PlaylistLocalEntity.self) + .toArray(type: PlaylistLocalEntity.self) + .map { + PlaylistItem(id: $0.id, title: $0.title, artist: $0.artist) + } + return playedList + } + + public func append(item: PlaylistItem) { + if let existSongIndexs = self.uniqueIndex(of: item) { + self.remove(indexs: [existSongIndexs]) + } + playlist.append(item) + } + + public func append(contentsOf items: [PlaylistItem]) { + let existSongIndexs = items.compactMap { self.uniqueIndex(of: $0) } + playlist.remove(indexs: existSongIndexs) + let mappedSongs = items.uniqueElements + playlist.append(mappedSongs) + } + + public func insert(_ item: PlaylistItem, at index: Int) { + if let existSongIndexs = self.uniqueIndex(of: item) { + self.remove(indexs: [existSongIndexs]) + } + playlist.insert(item, at: index) + } + + public func update(contentsOf: [PlaylistItem]) { + playlist.update(contentsOf: contentsOf) + } + + public func remove(id: String) { + playlist.remove(id: id) + } + + public func remove(ids: [String]) { + ids.forEach { playlist.remove(id: $0) } + } + + public func remove(at index: Int) { + playlist.remove(at: index) + } + + public func remove(indexs: [Int]) { + playlist.remove(indexs: indexs) + } + + public func removeAll() { + playlist.removeAll() + } + + func removeAll(where shouldBeRemoved: (PlaylistItem) -> Bool) { + playlist.removeAll(where: shouldBeRemoved) + } + + public func contains(item: PlaylistItem) -> Bool { + return playlist.contains(item) + } + + public func contains(id: String) -> Bool { + return playlist.contains(id: id) + } + + public func reorderPlaylist(from: Int, to: Int) { + playlist.reorderPlaylist(from: from, to: to) + } + + public func uniqueIndex(of item: PlaylistItem) -> Int? { + return playlist.uniqueIndex(of: item) + } +} diff --git a/Projects/Features/BaseFeature/Sources/Etc/PlayState/PlaylistItem.swift b/Projects/Features/BaseFeature/Sources/Etc/PlayState/PlaylistItem.swift new file mode 100644 index 000000000..96e603776 --- /dev/null +++ b/Projects/Features/BaseFeature/Sources/Etc/PlayState/PlaylistItem.swift @@ -0,0 +1,24 @@ +import Foundation +import SongsDomainInterface + +public struct PlaylistItem: Equatable { + public let id: String + public let title: String + public let artist: String + + public init( + id: String, + title: String, + artist: String + ) { + self.id = id + self.title = title + self.artist = artist + } + + public init(item: SongEntity) { + self.id = item.id + self.title = item.title + self.artist = item.artist + } +} diff --git a/Projects/Features/BaseFeature/Sources/GlobalState/PlayListPresenterGlobalState.swift b/Projects/Features/BaseFeature/Sources/GlobalState/PlayListPresenterGlobalState.swift new file mode 100644 index 000000000..b029b9d55 --- /dev/null +++ b/Projects/Features/BaseFeature/Sources/GlobalState/PlayListPresenterGlobalState.swift @@ -0,0 +1,26 @@ +import Foundation +import RxSwift + +public protocol PlayListPresenterGlobalStateProtocol { + var presentPlayListObservable: Observable { get } + + func presentPlayList(currentSongID: String?) + func presentPlayList() +} + +public final class PlayListPresenterGlobalState: PlayListPresenterGlobalStateProtocol { + private let presentPlayListSubject = PublishSubject() + public var presentPlayListObservable: Observable { + presentPlayListSubject + } + + public init() {} + + public func presentPlayList(currentSongID: String?) { + presentPlayListSubject.onNext(currentSongID) + } + + public func presentPlayList() { + presentPlayList(currentSongID: nil) + } +} diff --git a/Projects/Features/CommonFeature/Sources/Protocols/EditSheetViewType.swift b/Projects/Features/BaseFeature/Sources/Protocols/EditSheetViewType.swift similarity index 89% rename from Projects/Features/CommonFeature/Sources/Protocols/EditSheetViewType.swift rename to Projects/Features/BaseFeature/Sources/Protocols/EditSheetViewType.swift index d80867ad3..66f680f61 100644 --- a/Projects/Features/CommonFeature/Sources/Protocols/EditSheetViewType.swift +++ b/Projects/Features/BaseFeature/Sources/Protocols/EditSheetViewType.swift @@ -6,10 +6,10 @@ // Copyright © 2023 yongbeomkwak. All rights reserved. // +import DesignSystem import Foundation import UIKit import Utility -import DesignSystem public protocol EditSheetViewType: AnyObject { var editSheetView: EditSheetView! { get set } @@ -18,11 +18,10 @@ public protocol EditSheetViewType: AnyObject { public enum EditSheetType { case playList // 보관함 > 플레이리스트 편집 - case profile // 보관함 > 프로필 편집 + case profile // 보관함 > 프로필 편집 } public extension EditSheetViewType where Self: UIViewController { - /// 편집하기 팝업을 띄웁니다. /// - Parameter view: 팝업을 붙일 대상이 되는 뷰 (ex: 아티스트 노래 리스트, viewController.view) /// - Parameter type: 위에 EditSheetType 참조 @@ -39,7 +38,7 @@ public extension EditSheetViewType where Self: UIViewController { contentHeights: [contentHeight] ) } - + guard let bottomSheetView = self.bottomSheetView else { return } @@ -48,11 +47,11 @@ public extension EditSheetViewType where Self: UIViewController { guard !view.subviews.contains(self.bottomSheetView) else { return } - + bottomSheetView.present(in: view) - + // 메인 컨테이너 뷰컨에서 해당 노티를 수신, 팝업이 올라오면 미니 플레이어를 숨깁니다. - NotificationCenter.default.post(name: .showSongCart, object: nil) + NotificationCenter.default.post(name: .shouldHidePlaylistFloatingButton, object: nil) } /// 편집하기 팝업을 제거합니다. @@ -61,12 +60,12 @@ public extension EditSheetViewType where Self: UIViewController { let bottomSheetView = self.bottomSheetView else { return } bottomSheetView.dismiss() - + // nil 할당으로 메모리에서 제거 self.editSheetView = nil self.bottomSheetView = nil - + // 메인 컨테이너 뷰컨에서 해당 노티를 수신, 팝업이 올라오면 미니 플레이어를 다시 보여줍니다. - NotificationCenter.default.post(name: .hideSongCart, object: nil) + NotificationCenter.default.post(name: .shouldShowPlaylistFloatingButton, object: nil) } } diff --git a/Projects/Features/BaseFeature/Sources/EqualHandleTappedType.swift b/Projects/Features/BaseFeature/Sources/Protocols/EqualHandleTappedType.swift similarity index 100% rename from Projects/Features/BaseFeature/Sources/EqualHandleTappedType.swift rename to Projects/Features/BaseFeature/Sources/Protocols/EqualHandleTappedType.swift diff --git a/Projects/Features/BaseFeature/Sources/Protocols/ImageUploadable.swift b/Projects/Features/BaseFeature/Sources/Protocols/ImageUploadable.swift new file mode 100644 index 000000000..4d1c52ef2 --- /dev/null +++ b/Projects/Features/BaseFeature/Sources/Protocols/ImageUploadable.swift @@ -0,0 +1,11 @@ +import BaseDomainInterface +import Foundation +import UIKit + +public protocol ImageUploadable { + #warning("이미지 선택 Sheet") +} + +public extension ImageUploadable where Self: UIViewController { + #warning("Sheet 구현 시 연결") +} diff --git a/Projects/Features/BaseFeature/Sources/Protocols/PlayButtonDelegate.swift b/Projects/Features/BaseFeature/Sources/Protocols/PlayButtonDelegate.swift new file mode 100644 index 000000000..13f517410 --- /dev/null +++ b/Projects/Features/BaseFeature/Sources/Protocols/PlayButtonDelegate.swift @@ -0,0 +1,14 @@ +// +// PlayButtonDelegate.swift +// Utility +// +// Created by yongbeomkwak on 2023/03/23. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import Foundation +import SongsDomainInterface + +public protocol PlayButtonDelegate: AnyObject { + func play(model: SongEntity) +} diff --git a/Projects/Features/BaseFeature/Sources/Protocols/PlaylistEditSheetViewType.swift b/Projects/Features/BaseFeature/Sources/Protocols/PlaylistEditSheetViewType.swift new file mode 100644 index 000000000..0e1366615 --- /dev/null +++ b/Projects/Features/BaseFeature/Sources/Protocols/PlaylistEditSheetViewType.swift @@ -0,0 +1,62 @@ +import DesignSystem +import Foundation +import UIKit +import Utility + +public protocol PlaylistEditSheetViewType: AnyObject { + var playlisteditSheetView: PlaylistEditSheetView! { get set } + var bottomSheetView: BottomSheetView! { get set } +} + +public enum PlaylistEditType { + case edit + case share +} + +public extension PlaylistEditSheetViewType where Self: UIViewController { + /// 편집하기 팝업을 띄웁니다. + /// - Parameter view: 팝업을 붙일 대상이 되는 뷰 (ex: 아티스트 노래 리스트, viewController.view) + /// - Parameter type: 위에 EditSheetType 참조 + /// - Parameter contentHeight: (변경할 일 있으면 사용) + func showplaylistEditSheet( + in view: UIView, + contentHeight: CGFloat = 56 + ) { + if self.playlisteditSheetView == nil || self.bottomSheetView == nil { + self.playlisteditSheetView = PlaylistEditSheetView() + self.bottomSheetView = BottomSheetView( + contentView: self.playlisteditSheetView, + contentHeights: [contentHeight] + ) + } + + guard + let bottomSheetView = self.bottomSheetView + else { return } + + // bottomSheetView가 해당 뷰에 붙지 않았을때만 present 합니다. + guard + !view.subviews.contains(self.bottomSheetView) + else { return } + + bottomSheetView.present(in: view) + + // 메인 컨테이너 뷰컨에서 해당 노티를 수신, 팝업이 올라오면 미니 플레이어를 숨깁니다. + NotificationCenter.default.post(name: .shouldHidePlaylistFloatingButton, object: nil) + } + + /// 편집하기 팝업을 제거합니다. + func hideplaylistEditSheet() { + guard + let bottomSheetView = self.bottomSheetView + else { return } + bottomSheetView.dismiss() + + // nil 할당으로 메모리에서 제거 + self.playlisteditSheetView = nil + self.bottomSheetView = nil + + // 메인 컨테이너 뷰컨에서 해당 노티를 수신, 팝업이 올라오면 미니 플레이어를 다시 보여줍니다. + NotificationCenter.default.post(name: .shouldShowPlaylistFloatingButton, object: nil) + } +} diff --git a/Projects/Features/BaseFeature/Sources/Protocols/RequestPermissionable.swift b/Projects/Features/BaseFeature/Sources/Protocols/RequestPermissionable.swift new file mode 100644 index 000000000..5d617ddc2 --- /dev/null +++ b/Projects/Features/BaseFeature/Sources/Protocols/RequestPermissionable.swift @@ -0,0 +1,67 @@ +import AVFoundation +import Foundation +import Photos +import UIKit +import Utility + +public enum RequestPermissionType { + case photoLibrary +} + +public protocol RequestPermissionable: AnyObject { + func requestPhotoLibraryPermission() + func showErrorMessage(type: RequestPermissionType) + func showPhotoLibrary() +} + +public extension RequestPermissionable where Self: UIViewController { + func requestPhotoLibraryPermission() { + let status = PHPhotoLibrary.authorizationStatus() + switch status { + case .authorized: + self.showPhotoLibrary() + case .denied, .restricted: + self.showErrorMessage(type: .photoLibrary) + case .notDetermined: + PHPhotoLibrary.requestAuthorization { status in + switch status { + case .authorized: + DispatchQueue.main.async { + self.showPhotoLibrary() + } + case .denied, .restricted: + self.showErrorMessage(type: .photoLibrary) + default: return + } + } + default: return + } + } + + func showErrorMessage(type: RequestPermissionType) { + var message: String = "" + switch type { + case .photoLibrary: + message = "[선택권한] 앨범 사진을 첨부하거나, 저장 하려면 권한 승인이 필요합니다." + } + + DispatchQueue.main.async { + let alertViewController = UIAlertController( + title: "권한이 거부 됨", + message: message, + preferredStyle: UIAlertController.Style.alert + ) + + let okAction = UIAlertAction(title: "설정 바로가기", style: .default) { _ in + guard let openSettingsURL = URL(string: UIApplication.openSettingsURLString) else { return } + UIApplication.shared.open(openSettingsURL) + } + let cancelAction = UIAlertAction(title: "취소", style: .cancel) { _ in + } + + alertViewController.addAction(okAction) + alertViewController.addAction(cancelAction) + self.present(alertViewController, animated: true, completion: nil) + } + } +} diff --git a/Projects/Features/CommonFeature/Sources/Protocols/SongCartViewType.swift b/Projects/Features/BaseFeature/Sources/Protocols/SongCartViewType.swift similarity index 81% rename from Projects/Features/CommonFeature/Sources/Protocols/SongCartViewType.swift rename to Projects/Features/BaseFeature/Sources/Protocols/SongCartViewType.swift index e5ed788d3..1a696743d 100644 --- a/Projects/Features/CommonFeature/Sources/Protocols/SongCartViewType.swift +++ b/Projects/Features/BaseFeature/Sources/Protocols/SongCartViewType.swift @@ -6,10 +6,10 @@ // Copyright © 2023 yongbeomkwak. All rights reserved. // +import DesignSystem import Foundation import UIKit import Utility -import DesignSystem public protocol SongCartViewType: AnyObject { var songCartView: SongCartView! { get set } @@ -18,18 +18,18 @@ public protocol SongCartViewType: AnyObject { /// 각 (담당자)는 넣어서 호출 하세요. public enum SongCartType { - case playList // 플레이어 > 재생목록 (케이) - case chartSong // 차트 (대희) - case searchSong // 검색 (함프) - case artistSong // 아티스트 (구구) - case likeSong // 보관함 > 좋아요 (함프) - case myList // 보관함 > 내 리스트 (함프) - case myPlayList // 보관함 > 플레이 리스트 상세 (함프) - case WMPlayList // 추천 플레이 리스트 상세 (함프) + case playlist // 플레이어 > 재생목록 (케이) + case chartSong // 차트 (대희) + case searchSong // 검색 (함프) + case artistSong // 아티스트 (구구) + case likeSong // 보관함 > 좋아요 (함프) + case playlistStorage // 보관함 > 내 리스트 (함프) + case myPlaylist // 보관함 > 플레이 리스트 상세 (함프) + case WMPlaylist // 추천 플레이 리스트 상세 (함프) + case creditSong // 크레딧 작업자 노래 리스트 (백튼) } public extension SongCartViewType where Self: UIViewController { - /// 노래 담기 팝업을 띄웁니다. /// - Parameter view: 팝업을 붙일 대상이 되는 뷰 (ex: 아티스트 노래 리스트, viewController.view) /// - Parameter type: 위에 SongCartType 참조 @@ -54,18 +54,18 @@ public extension SongCartViewType where Self: UIViewController { contentHeights: [contentHeight + (useBottomSpace ? SAFEAREA_BOTTOM_HEIGHT() : 0)] ) } - + guard let songCartView = self.songCartView, let bottomSheetView = self.bottomSheetView else { return } - + // 하단 마진 사용 여부 업데이트 songCartView.updateBottomSpace(isUse: useBottomSpace) - + // 선택된 노래 갯수 업데이트 songCartView.updateCount(value: selectedSongCount) - + // 선택된 노래 갯수와 전체 노래 갯수를 비교하여 전체선택이 되었는지 비교하여 덥데이트 songCartView.updateAllSelect(isAll: selectedSongCount == totalSongCount) @@ -73,11 +73,11 @@ public extension SongCartViewType where Self: UIViewController { guard !view.subviews.contains(self.bottomSheetView) else { return } - + bottomSheetView.present(in: view) - + // 메인 컨테이너 뷰컨에서 해당 노티를 수신, 팝업이 올라오면 미니 플레이어를 숨깁니다. - NotificationCenter.default.post(name: .showSongCart, object: nil) + NotificationCenter.default.post(name: .shouldHidePlaylistFloatingButton, object: nil) } /// 노래 담기 팝업을 제거합니다. @@ -86,12 +86,12 @@ public extension SongCartViewType where Self: UIViewController { let bottomSheetView = self.bottomSheetView else { return } bottomSheetView.dismiss() - + // nil 할당으로 메모리에서 제거 self.songCartView = nil self.bottomSheetView = nil - + // 메인 컨테이너 뷰컨에서 해당 노티를 수신, 팝업이 올라오면 미니 플레이어를 다시 보여줍니다. - NotificationCenter.default.post(name: .hideSongCart, object: nil) + NotificationCenter.default.post(name: .shouldShowPlaylistFloatingButton, object: nil) } } diff --git a/Projects/Features/BaseFeature/Sources/ViewModelType+Protocol.swift b/Projects/Features/BaseFeature/Sources/Protocols/ViewModelType+Protocol.swift similarity index 100% rename from Projects/Features/BaseFeature/Sources/ViewModelType+Protocol.swift rename to Projects/Features/BaseFeature/Sources/Protocols/ViewModelType+Protocol.swift diff --git a/Projects/Features/BaseFeature/Sources/Protocols/WMBottomSheetViewType.swift b/Projects/Features/BaseFeature/Sources/Protocols/WMBottomSheetViewType.swift new file mode 100644 index 000000000..2f01b0108 --- /dev/null +++ b/Projects/Features/BaseFeature/Sources/Protocols/WMBottomSheetViewType.swift @@ -0,0 +1,58 @@ +import DesignSystem +import Foundation +import UIKit +import Utility + +public protocol WMBottomSheetViewType: AnyObject { + var bottomSheetView: BottomSheetView! { get set } +} + +public extension WMBottomSheetViewType where Self: UIViewController { + /// 편집하기 팝업을 띄웁니다. + /// - Parameter view: 팝업을 붙일 대상이 되는 뷰 + /// - Parameter size: 높이 값 (변경할 일 있으면 사용) + func showWMBottomSheet( + in view: UIView, + with items: [UIButton], + size: CGFloat = 56 + ) { + if self.bottomSheetView != nil { + hideWMBottomSheet(postNoti: false) + } + let wmBottomSheetView = WMBottomSheetView(items: items) + bottomSheetView = BottomSheetView( + contentView: wmBottomSheetView, + contentHeights: [size] + ) + + guard + let bottomSheetView = self.bottomSheetView + else { return } + + // bottomSheetView가 해당 뷰에 붙지 않았을때만 present 합니다. + guard + !view.subviews.contains(self.bottomSheetView) + else { return } + + bottomSheetView.present(in: view) + + // 메인 컨테이너 뷰컨에서 해당 노티를 수신, 팝업이 올라오면 미니 플레이어를 숨깁니다. + NotificationCenter.default.post(name: .shouldHidePlaylistFloatingButton, object: nil) + } + + /// 편집하기 팝업을 제거합니다. + func hideWMBottomSheet(postNoti: Bool = true) { + guard + let bottomSheetView = self.bottomSheetView + else { return } + bottomSheetView.dismiss() + + // nil 할당으로 메모리에서 제거 + self.bottomSheetView = nil + + // 메인 컨테이너 뷰컨에서 해당 노티를 수신, 팝업이 올라오면 미니 플레이어를 다시 보여줍니다. + if postNoti { + NotificationCenter.default.post(name: .shouldShowPlaylistFloatingButton, object: nil) + } + } +} diff --git a/Projects/Features/BaseFeature/Sources/RequestPermissionable.swift b/Projects/Features/BaseFeature/Sources/RequestPermissionable.swift deleted file mode 100644 index 604c200e6..000000000 --- a/Projects/Features/BaseFeature/Sources/RequestPermissionable.swift +++ /dev/null @@ -1,101 +0,0 @@ -// -// RequestPermissionable.swift -// BaseFeature -// -// Created by KTH on 2023/04/09. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import UIKit -import AVFoundation -import Photos -import Utility - -public enum RequestPermissionType{ - case camera - case photoLibrary -} - -public protocol RequestPermissionable: AnyObject { - func requestCameraPermission() - func requestPhotoLibraryPermission() - func showErrorMessage(type: RequestPermissionType) - func showCamera() - func showPhotoLibrary() -} - -public extension RequestPermissionable where Self: UIViewController { - func requestCameraPermission() { - let cameraMediaType = AVMediaType.video - let cameraAuthorizationStatus = AVCaptureDevice.authorizationStatus(for: AVMediaType.video) - - switch cameraAuthorizationStatus { - case .denied, .restricted: - self.showErrorMessage(type: .camera) - case .authorized: - self.showCamera() - case .notDetermined: - AVCaptureDevice.requestAccess(for: cameraMediaType) { granted in - if granted { - DispatchQueue.main.async { - self.showCamera() - } - }else { - self.showErrorMessage(type: .camera) - } - } - default: return - } - } - - func requestPhotoLibraryPermission() { - let status = PHPhotoLibrary.authorizationStatus() - switch status { - case .authorized: - self.showPhotoLibrary() - case .denied, .restricted: - self.showErrorMessage(type: .photoLibrary) - case .notDetermined: - PHPhotoLibrary.requestAuthorization { status in - switch status { - case .authorized: - DispatchQueue.main.async { - self.showPhotoLibrary() - } - case .denied, .restricted: - self.showErrorMessage(type: .photoLibrary) - default: return - } - } - default: return - } - } - - func showErrorMessage(type: RequestPermissionType) { - var message: String = "" - switch type { - case .camera: - message = "[선택권한] 버그 제보 시 카메라 촬영을 하려면 권한 승인이 필요합니다." - case .photoLibrary: - message = "[선택권한] 버그 제보 시 앨범 사진을 첨부 하려면 권한 승인이 필요합니다." - } - - DispatchQueue.main.async { - let alertViewController = UIAlertController(title: "권한이 거부 됨", - message: message, - preferredStyle: UIAlertController.Style.alert) - - let okAction = UIAlertAction(title: "설정 바로가기", style: .default) { (_) in - guard let openSettingsURL = URL(string: UIApplication.openSettingsURLString) else { return } - UIApplication.shared.open(openSettingsURL) - } - let cancelAction = UIAlertAction(title: "취소", style: .cancel) { (_) in - } - - alertViewController.addAction(okAction) - alertViewController.addAction(cancelAction) - self.present(alertViewController, animated: true, completion: nil) - } - } -} diff --git a/Projects/Features/BaseFeature/Sources/SongDetailPresenter/SongDetailPresenter.swift b/Projects/Features/BaseFeature/Sources/SongDetailPresenter/SongDetailPresenter.swift new file mode 100644 index 000000000..f94d2a942 --- /dev/null +++ b/Projects/Features/BaseFeature/Sources/SongDetailPresenter/SongDetailPresenter.swift @@ -0,0 +1,25 @@ +import Foundation +import RxSwift + +public protocol SongDetailPresentable { + var presentSongDetailObservable: Observable<(ids: [String], selectedID: String)> { get } + func present(id: String) + func present(ids: [String], selectedID: String) +} + +public final class SongDetailPresenter: SongDetailPresentable { + private let presentSongDetailSubject = PublishSubject<(ids: [String], selectedID: String)>() + public var presentSongDetailObservable: Observable<(ids: [String], selectedID: String)> { + presentSongDetailSubject + } + + public func present(id: String) { + presentSongDetailSubject.onNext(([id], id)) + } + + public func present(ids: [String], selectedID: String) { + presentSongDetailSubject.onNext((ids, selectedID)) + } + + public init() {} +} diff --git a/Projects/Features/BaseFeature/Sources/ViewControllers/BaseReactorViewController.swift b/Projects/Features/BaseFeature/Sources/ViewControllers/BaseReactorViewController.swift new file mode 100644 index 000000000..399f0bcab --- /dev/null +++ b/Projects/Features/BaseFeature/Sources/ViewControllers/BaseReactorViewController.swift @@ -0,0 +1,61 @@ +import DesignSystem +import NVActivityIndicatorView +import ReactorKit +import RxSwift +import SnapKit +import Then +import UIKit + +open class BaseReactorViewController: UIViewController, View { + public var disposeBag = DisposeBag() + open lazy var indicator = NVActivityIndicatorView(frame: .zero).then { + $0.color = DesignSystemAsset.PrimaryColorV2.point.color + $0.type = .circleStrokeSpin + view.addSubview($0) + $0.snp.makeConstraints { + $0.center.equalToSuperview() + $0.size.equalTo(30) + } + } + + public init(reactor: R) { + super.init(nibName: nil, bundle: nil) + self.reactor = reactor + } + + @available(*, unavailable) + public required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override open func viewDidLoad() { + super.viewDidLoad() + addView() + setLayout() + configureUI() + configureNavigation() + } + + open func bind(reactor: R) { + bindState(reactor: reactor) + bindAction(reactor: reactor) + } + + open func addView() {} + open func setLayout() {} + open func configureUI() { + self.view.subviews + .compactMap { $0 as? UITableView } + .forEach { + $0.sectionHeaderTopPadding = 0 + } + } + + open func configureNavigation() { + // 내용 유지? + self.navigationController?.setNavigationBarHidden(true, animated: false) + } + + open func bindState(reactor: R) {} + open func bindAction(reactor: R) {} +} diff --git a/Projects/Features/BaseFeature/Sources/ViewControllers/BaseStoryboardReactorViewController.swift b/Projects/Features/BaseFeature/Sources/ViewControllers/BaseStoryboardReactorViewController.swift new file mode 100644 index 000000000..e51a38fa3 --- /dev/null +++ b/Projects/Features/BaseFeature/Sources/ViewControllers/BaseStoryboardReactorViewController.swift @@ -0,0 +1,39 @@ +import NVActivityIndicatorView +import ReactorKit +import RxSwift +import SnapKit +import Then +import UIKit +import Utility + +open class BaseStoryboardReactorViewController: UIViewController, StoryboardView, + ViewControllerFromStoryBoard { + public var disposeBag = DisposeBag() + + override open func viewDidLoad() { + super.viewDidLoad() + configureUI() + configureNavigation() + } + + open func bind(reactor: R) { + bindState(reactor: reactor) + bindAction(reactor: reactor) + } + + open func configureUI() { + self.view.subviews + .compactMap { $0 as? UITableView } + .forEach { + $0.sectionHeaderTopPadding = 0 + } + } + + open func configureNavigation() { + // 내용 유지? + self.navigationController?.setNavigationBarHidden(true, animated: false) + } + + open func bindState(reactor: R) {} + open func bindAction(reactor: R) {} +} diff --git a/Projects/Features/BaseFeature/Sources/ViewControllers/BaseViewController.swift b/Projects/Features/BaseFeature/Sources/ViewControllers/BaseViewController.swift new file mode 100644 index 000000000..c06571676 --- /dev/null +++ b/Projects/Features/BaseFeature/Sources/ViewControllers/BaseViewController.swift @@ -0,0 +1,27 @@ +// +// BaseViewController.swift +// BaseFeature +// +// Created by KTH on 2023/01/29. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import UIKit + +open class BaseViewController: UIViewController { + override open func viewDidLoad() { + super.viewDidLoad() + configureCommonUI() + } +} + +extension BaseViewController { + /// 1. 네비게이션 바 숨김, 2. 테이블 뷰를 사용한다면 섹션헤더 간격 0으로 설정 + private func configureCommonUI() { + self.navigationController?.setNavigationBarHidden(true, animated: false) + let tableViews = self.view.subviews.map { $0 as? UITableView }.compactMap { $0 } + tableViews.forEach { + $0.sectionHeaderTopPadding = 0 + } + } +} diff --git a/Projects/Features/BaseFeature/Sources/ViewControllers/ContainSongsViewController.swift b/Projects/Features/BaseFeature/Sources/ViewControllers/ContainSongsViewController.swift new file mode 100644 index 000000000..444f559b3 --- /dev/null +++ b/Projects/Features/BaseFeature/Sources/ViewControllers/ContainSongsViewController.swift @@ -0,0 +1,242 @@ +import BaseDomainInterface +import BaseFeatureInterface +import DesignSystem +import Localization +import LogManager +import NVActivityIndicatorView +import PlaylistDomainInterface +import RxSwift +import UIKit +import UserDomainInterface +import Utility + +public final class ContainSongsViewController: BaseViewController, ViewControllerFromStoryBoard { + @IBOutlet weak var closeButton: UIButton! + @IBOutlet weak var titleLabel: UILabel! + @IBOutlet weak var tableView: UITableView! + @IBOutlet weak var indicator: NVActivityIndicatorView! + let containerView = UIView(frame: CGRect(x: .zero, y: .zero, width: APP_WIDTH(), height: 48)) + let songCountLabel: UILabel = UILabel() + let subTitleLabel: UILabel = UILabel() + var multiPurposePopupFactory: MultiPurposePopupFactory! + var textPopupFactory: TextPopupFactory! + + var viewModel: ContainSongsViewModel! + lazy var input = ContainSongsViewModel.Input() + lazy var output = viewModel.transform(from: input) + var disposeBag = DisposeBag() + + deinit { DEBUG_LOG("❌ \(Self.self) Deinit") } + + override public func viewDidLoad() { + super.viewDidLoad() + addSubviews() + setLayout() + configureUI() + inputBind() + outputBind() + input.viewDidLoad.onNext(()) + } + + public static func viewController( + multiPurposePopupFactory: MultiPurposePopupFactory, + textPopupFactory: TextPopupFactory, + viewModel: ContainSongsViewModel + ) -> ContainSongsViewController { + let viewController = ContainSongsViewController.viewController( + storyBoardName: "Base", + bundle: Bundle.module + ) + viewController.multiPurposePopupFactory = multiPurposePopupFactory + viewController.textPopupFactory = textPopupFactory + viewController.viewModel = viewModel + return viewController + } +} + +extension ContainSongsViewController { + private func addSubviews() { + containerView.addSubviews(songCountLabel, subTitleLabel) + tableView.tableHeaderView = containerView + } + + private func setLayout() { + subTitleLabel.snp.makeConstraints { + $0.leading.equalTo(songCountLabel.snp.trailing) + $0.centerY.equalTo(songCountLabel.snp.centerY) + } + + songCountLabel.snp.makeConstraints { + $0.leading.equalTo(closeButton.snp.leading) + $0.centerY.equalToSuperview() + } + } + + private func inputBind() { + tableView.rx.setDelegate(self).disposed(by: disposeBag) + + closeButton.rx.tap + .bind(with: self) { owner, _ in + owner.dismiss(animated: true) + } + .disposed(by: disposeBag) + + tableView.rx.itemSelected + .throttle(.milliseconds(500), latest: false, scheduler: MainScheduler.instance) + .withLatestFrom(output.dataSource) { ($0, $1) } + .do(onNext: { [weak self] indexPath, _ in + self?.tableView.deselectRow(at: indexPath, animated: true) + }) + .map { indexPath, model -> PlaylistEntity in + return model[indexPath.row] + } + .bind(to: input.itemDidTap) + .disposed(by: disposeBag) + + NotificationCenter.default.rx.notification(.shouldRefreshPlaylist) + .map { _ in () } + .bind(to: input.playListLoad) + .disposed(by: disposeBag) + } + + private func outputBind() { + output.dataSource + .skip(1) + .do(onNext: { [weak self] model in + guard let self = self else { + return + } + let space = APP_HEIGHT() - 48 - 16 - 24 - 12 - 52 - 12 - STATUS_BAR_HEGHIT() - SAFEAREA_BOTTOM_HEIGHT() + let height = space / 3 * 2 + + let warningView = WarningView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: height)) + warningView.text = "내 리스트가 없습니다." + self.tableView.tableFooterView = model.isEmpty ? warningView : nil + self.indicator.stopAnimating() + }) + .bind(to: tableView.rx.items) { tableView, index, model -> UITableViewCell in + guard let cell = tableView.dequeueReusableCell( + withIdentifier: "CurrentPlaylistTableViewCell", + for: IndexPath(row: index, section: 0) + ) as? CurrentPlaylistTableViewCell + else { + return UITableViewCell() + } + cell.update(model: model) + return cell + }.disposed(by: disposeBag) + + output.showToastMessage + .observe(on: MainScheduler.instance) + .subscribe(onNext: { [weak self] result in + guard let self = self else { return } + self.showToast(text: result.description, options: [.tabBar]) + + if result.status == 201 { + NotificationCenter.default.post(name: .shouldRefreshPlaylist, object: nil) // 플리목록창 이름 변경하기 위함 + } else if result.status == 200 { + NotificationCenter.default.post(name: .shouldRefreshPlaylist, object: nil) // 플리목록창 이름 변경하기 위함 + self.dismiss(animated: true) + } else if result.status == -1 { + return + } else { + self.dismiss(animated: true) + } + }) + .disposed(by: disposeBag) + + output.onLogout + .bind(with: self) { owner, error in + owner.showToast(text: error.localizedDescription, options: [.tabBar]) + owner.dismiss(animated: true) + } + .disposed(by: disposeBag) + + output.showPricePopup + .withLatestFrom(PreferenceManager.$userInfo) { $1 } + .compactMap { $0 } + .withLatestFrom(output.creationPrice) { ($0, $1) } + .bind(with: self) { owner, info in + + let (user, price) = (info.0, info.1) + + if user.itemCount < price { + owner.showToast(text: LocalizationStrings.lackOfMoney(price - user.itemCount), options: [.tabBar]) + return + } + + let text = owner.textPopupFactory.makeView( + text: "리스트를 만들기 위해서는\n음표 열매 \(price)개가 필요합니다.", + cancelButtonIsHidden: false, + confirmButtonText: "\(price)개 사용", + cancelButtonText: "취소", + completion: { + owner.input.payButtonDidTap.onNext(()) + }, cancelCompletion: nil + ) + + owner.showBottomSheet(content: text) + } + .disposed(by: disposeBag) + + output.showCreationPopup + .bind(with: self) { owner, _ in + let multiPurposePopupVc = owner.multiPurposePopupFactory.makeView( + type: .creation, + key: "", + completion: { text in + owner.input.createPlaylist.onNext(text) + } + ) + owner.showBottomSheet(content: multiPurposePopupVc, size: .fixed(296)) + } + .disposed(by: disposeBag) + } + + private func configureUI() { + closeButton.setImage(DesignSystemAsset.Navigation.close.image, for: .normal) + + titleLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) + titleLabel.textColor = DesignSystemAsset.BlueGrayColor.gray900.color + titleLabel.text = "리스트에 담기" + titleLabel.setTextWithAttributes(kernValue: -0.5) + + // 24 , 12 + songCountLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 14) + songCountLabel.textColor = DesignSystemAsset.PrimaryColor.point.color + songCountLabel.text = "\(viewModel.songs.count)" + songCountLabel.setTextWithAttributes(kernValue: -0.5) + + subTitleLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 14) + subTitleLabel.textColor = DesignSystemAsset.PrimaryColor.sub3.color + subTitleLabel.text = "곡 선택" + subTitleLabel.setTextWithAttributes(kernValue: -0.5) + + indicator.type = .circleStrokeSpin + indicator.color = DesignSystemAsset.PrimaryColor.point.color + indicator.startAnimating() + } +} + +extension ContainSongsViewController: UITableViewDelegate { + public func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + return 60 + } + + public func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { + let header = ContainPlaylistHeaderView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: 140)) + header.delegate = self + return header + } + + public func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { + return 64 + } +} + +extension ContainSongsViewController: ContainPlaylistHeaderViewDelegate { + public func action() { + LogManager.analytics(ContainSongsAnalyticsLog.clickCreatePlaylistButton(location: .addMusics)) + input.creationButtonDidTap.onNext(()) + } +} diff --git a/Projects/Features/BaseFeature/Sources/ViewControllers/ContractViewController.swift b/Projects/Features/BaseFeature/Sources/ViewControllers/ContractViewController.swift new file mode 100644 index 000000000..0e8fe94d8 --- /dev/null +++ b/Projects/Features/BaseFeature/Sources/ViewControllers/ContractViewController.swift @@ -0,0 +1,149 @@ +// +// ContractViewController.swift +// DesignSystem +// +// Created by yongbeomkwak on 2023/02/08. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import DesignSystem +import LogManager +import NVActivityIndicatorView +import PDFKit +import RxCocoa +import RxSwift +import SnapKit +import UIKit +import Utility + +public enum ContractType { + case privacy + case service +} + +extension ContractType { + var title: String { + switch self { + case .privacy: + return "개인정보 처리방침" + case .service: + return "서비스 이용약관" + } + } + + var url: String { + switch self { + case .privacy: + return "\(CDN_DOMAIN_URL())/document/privacy.pdf" + case .service: + return "\(CDN_DOMAIN_URL())/document/terms.pdf" + } + } +} + +public final class ContractViewController: UIViewController, ViewControllerFromStoryBoard { + @IBOutlet weak var titleLabel: UILabel! + @IBOutlet weak var closeButton: UIButton! + @IBOutlet weak var fakeView: UIView! + @IBOutlet weak var confirmButton: UIButton! + @IBOutlet weak var activityIndicator: NVActivityIndicatorView! + + var type: ContractType = .privacy + private let disposeBag = DisposeBag() + + deinit { + LogManager.printDebug("❌ \(Self.self) deinit") + } + + override public func viewDidLoad() { + super.viewDidLoad() + configureUI() + bindRx() + loadPDF() + } + + public static func viewController(type: ContractType) -> ContractViewController { + let viewController = ContractViewController.viewController(storyBoardName: "Base", bundle: Bundle.module) + viewController.type = type + return viewController + } +} + +private extension ContractViewController { + func bindRx() { + Observable.merge( + closeButton.rx.tap.map { _ in () }, + confirmButton.rx.tap.map { _ in () } + ) + .withUnretained(self) + .subscribe(onNext: { owner, _ in + owner.dismiss(animated: true) + }) + .disposed(by: disposeBag) + } + + func configureUI() { + navigationController?.setNavigationBarHidden(true, animated: false) + closeButton.setImage(DesignSystemAsset.Navigation.crossClose.image, for: .normal) + + activityIndicator.type = .circleStrokeSpin + activityIndicator.color = DesignSystemAsset.PrimaryColor.point.color + activityIndicator.startAnimating() + + confirmButton.setBackgroundColor(DesignSystemAsset.PrimaryColor.point.color, for: .normal) + confirmButton.layer.cornerRadius = 12 + confirmButton.clipsToBounds = true + confirmButton.setAttributedTitle(NSMutableAttributedString( + string: "확인", + attributes: [ + .font: DesignSystemFontFamily.Pretendard.medium.font(size: 18), + .foregroundColor: DesignSystemAsset.BlueGrayColor.gray25.color, + .kern: -0.5 + ] + ), for: .normal) + + titleLabel.text = type.title + titleLabel.textColor = DesignSystemAsset.BlueGrayColor.gray900.color + titleLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) + titleLabel.setTextWithAttributes(kernValue: -0.5) + } +} + +private extension ContractViewController { + func loadPDF() { + DispatchQueue.global(qos: .default).async { + guard let url = URL(string: self.type.url), + let document = PDFDocument(url: url) else { + self.loadFailPDF() + return + } + self.configurePDF(document: document) + } + } + + func configurePDF(document: PDFDocument) { + DispatchQueue.main.async { + let pdfView = PDFView(frame: self.fakeView.bounds) + pdfView.autoresizingMask = [.flexibleWidth, .flexibleHeight] + pdfView.autoScales = true + pdfView.displayMode = .singlePageContinuous + pdfView.displayDirection = .vertical + pdfView.document = document + self.fakeView.addSubview(pdfView) + self.activityIndicator.stopAnimating() + } + } + + func loadFailPDF() { + DispatchQueue.main.async { + self.activityIndicator.stopAnimating() + self.fakeView.backgroundColor = DesignSystemAsset.BlueGrayColor.gray100.color + let warningView = WMWarningView(text: "파일을 불러오는 데 문제가 발생했습니다.") + self.view.addSubview(warningView) + warningView.snp.makeConstraints { + $0.top.equalTo(self.view.frame.height / 3) + $0.centerX.equalToSuperview() + } + } + } +} diff --git a/Projects/Features/BaseFeature/Sources/ViewControllers/MultiPurposePopupViewController.swift b/Projects/Features/BaseFeature/Sources/ViewControllers/MultiPurposePopupViewController.swift new file mode 100644 index 000000000..7e2740ebd --- /dev/null +++ b/Projects/Features/BaseFeature/Sources/ViewControllers/MultiPurposePopupViewController.swift @@ -0,0 +1,287 @@ +import BaseFeatureInterface +import DesignSystem +import LogManager +import RxCocoa +import RxKeyboard +import RxSwift +import UIKit +import Utility + +public final class MultiPurposePopupViewController: UIViewController, ViewControllerFromStoryBoard { + @IBOutlet weak var saveButton: UIButton! + @IBOutlet weak var cancelButton: UIButton! + @IBOutlet weak var titleLabel: UILabel! + @IBOutlet weak var subTitleLabel: UILabel! + @IBOutlet weak var dividerView: UIView! + @IBOutlet weak var textField: UITextField! + @IBOutlet weak var countLabel: UILabel! + @IBOutlet weak var limitLabel: UILabel! + @IBOutlet weak var confirmLabel: UILabel! + + @IBAction func cancelAction(_ sender: UIButton) { + textField.rx.text.onNext("") + input.textString.accept("") + } + + private var viewModel: MultiPurposePopupViewModel! + private lazy var input = MultiPurposePopupViewModel.Input() + private lazy var output = viewModel.transform(from: input) + + private var completion: ((String) -> Void)? + private let disposeBag = DisposeBag() + + deinit { LogManager.printDebug("❌ \(Self.self) Deinit") } + + override public func viewDidLoad() { + super.viewDidLoad() + configureUI() + inputBind() + } + + public static func viewController( + viewModel: MultiPurposePopupViewModel, + completion: ((String) -> Void)? = nil + ) -> MultiPurposePopupViewController { + let viewController = MultiPurposePopupViewController.viewController( + storyBoardName: "Base", + bundle: Bundle.module + ) + viewController.viewModel = viewModel + viewController.completion = completion + return viewController + } +} + +private extension MultiPurposePopupViewController { + func inputBind() { + textField.rx.text.orEmpty + .skip(1) + .bind(to: input.textString) + .disposed(by: disposeBag) + + saveButton.rx.tap + .withLatestFrom(input.textString) + .bind(with: self) { owner, text in + owner.dismiss(animated: true) { + owner.completion?(text) + } + } + .disposed(by: disposeBag) + + input.textString + .bind(with: self) { owner, str in + let errorColor = DesignSystemAsset.PrimaryColor.increase.color + let passColor = DesignSystemAsset.PrimaryColor.decrease.color + + owner.countLabel.text = "\(str.alphabetCharacterCeilCount)자" + + if str.isEmpty { + owner.cancelButton.isHidden = true + owner.confirmLabel.isHidden = true + owner.saveButton.isEnabled = false + owner.dividerView.backgroundColor = DesignSystemAsset.BlueGrayColor.gray200.color + owner.countLabel.textColor = DesignSystemAsset.PrimaryColor.point.color + return + + } else { + owner.cancelButton.isHidden = false + owner.confirmLabel.isHidden = false + owner.countLabel.isHidden = false + } + + if str.isWhiteSpace { + owner.dividerView.backgroundColor = errorColor + owner.confirmLabel.text = "제목이 비어있습니다." + owner.confirmLabel.textColor = errorColor + owner.countLabel.textColor = errorColor + owner.saveButton.isEnabled = false + + } else if str.alphabetCharacterCeilCount > owner.viewModel.type.textLimitCount { + owner.dividerView.backgroundColor = errorColor + owner.confirmLabel.text = "글자 수를 초과하였습니다." + owner.confirmLabel.textColor = errorColor + owner.countLabel.textColor = errorColor + owner.saveButton.isEnabled = false + + } else { + owner.dividerView.backgroundColor = passColor + owner.confirmLabel.text = owner.viewModel.type == .nickname ? "사용할 수 있는 닉네임입니다." : "사용할 수 있는 제목입니다." + owner.confirmLabel.textColor = passColor + owner.countLabel.textColor = DesignSystemAsset.PrimaryColor.point.color + owner.saveButton.isEnabled = true + } + } + .disposed(by: disposeBag) + } +} + +private extension MultiPurposePopupViewController { + func configureUI() { + limitLabel.text = "/\(viewModel.type.textLimitCount)" + + titleLabel.text = viewModel.type.title + titleLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 18) + titleLabel.textColor = DesignSystemAsset.BlueGrayColor.gray900.color + + subTitleLabel.text = viewModel.type.subTitle + subTitleLabel.font = DesignSystemFontFamily.Pretendard.light.font(size: 16) + subTitleLabel.textColor = DesignSystemAsset.BlueGrayColor.gray400.color + + let headerFontSize: CGFloat = 20 + let focusedplaceHolderAttributes = [ + NSAttributedString.Key.foregroundColor: DesignSystemAsset.BlueGrayColor.gray400.color, + NSAttributedString.Key.font: DesignSystemFontFamily.Pretendard.medium.font(size: headerFontSize) + ] + + textField.attributedPlaceholder = NSAttributedString( + string: viewModel.type.placeHolder, + attributes: focusedplaceHolderAttributes + ) + textField.font = DesignSystemFontFamily.Pretendard.medium.font(size: headerFontSize) + textField.becomeFirstResponder() + textField.delegate = self + + dividerView.backgroundColor = DesignSystemAsset.BlueGrayColor.gray200.color + + cancelButton.layer.cornerRadius = 12 + cancelButton.titleLabel?.text = "취소" + cancelButton.titleLabel?.font = DesignSystemFontFamily.Pretendard.bold.font(size: 12) + cancelButton.layer.cornerRadius = 4 + cancelButton.layer.borderColor = DesignSystemAsset.BlueGrayColor.gray200.color.cgColor + cancelButton.layer.borderWidth = 1 + cancelButton.backgroundColor = .white + cancelButton.isHidden = true + + confirmLabel.font = DesignSystemFontFamily.Pretendard.light.font(size: 12) + confirmLabel.isHidden = true + + limitLabel.font = DesignSystemFontFamily.Pretendard.light.font(size: 12) + limitLabel.textColor = DesignSystemAsset.BlueGrayColor.gray500.color + + countLabel.font = DesignSystemFontFamily.Pretendard.light.font(size: 12) + countLabel.textColor = DesignSystemAsset.PrimaryColor.point.color + + saveButton.layer.cornerRadius = 12 + saveButton.clipsToBounds = true + saveButton.setAttributedTitle(NSMutableAttributedString( + string: viewModel.type.btnText, + attributes: [ + .font: DesignSystemFontFamily.Pretendard.medium.font(size: 18), + .foregroundColor: DesignSystemAsset.BlueGrayColor.gray25.color + ] + ), for: .normal) + + saveButton.setBackgroundColor(DesignSystemAsset.PrimaryColor.point.color, for: .normal) + saveButton.setBackgroundColor(DesignSystemAsset.BlueGrayColor.gray300.color, for: .disabled) + } +} + +extension MultiPurposePopupViewController: UITextFieldDelegate { + public func textField( + _ textField: UITextField, + shouldChangeCharactersIn range: NSRange, + replacementString string: String + ) -> Bool { + guard let char = string.cString(using: String.Encoding.utf8) else { return false } + let isBackSpace: Bool = strcmp(char, "\\b") == -92 + + let currentText = textField.text ?? "" + let latinCharCount: Double = currentText.alphabetCharacterCount + + if let lastChar = currentText.last, + latinCharCount <= Double(viewModel.type.textLimitCount) { + // 완성되지 않은 한글인 경우 + if lastChar.isIncompleteHangul { + return true + } + + // 완성된 한글이지만, 추가로 자음이 결합될 수 있는 경우 + if !lastChar.isIncompleteHangul && + lastChar.canAddAdditionalJongseong { + return true + } + } + + guard isBackSpace || latinCharCount < Double(viewModel.type.textLimitCount) else { return false } + + return true + } +} + +private extension String { + var alphabetCharacterCount: Double { + let count = reduce(0) { count, char in + return count + (char.isAlphabetCharacter ? 0.5 : 1) + } + return count + } + + var alphabetCharacterCeilCount: Int { + let count = reduce(0) { count, char in + return count + (char.isAlphabetCharacter ? 0.5 : 1) + } + return Int(ceil(count)) + } +} + +private extension Character { + var isAlphabetCharacter: Bool { + return self.unicodeScalars.allSatisfy { $0.isASCII && $0.properties.isAlphabetic } + } + + /// 완성되지 않은 한글 여부 + var isIncompleteHangul: Bool { + guard let scalar = unicodeScalars.first else { return false } + + // 한글 범위에 있는지 확인 (유니코드 값 범위 체크) + let hangulBase: UInt32 = 0xAC00 + let hangulEnd: UInt32 = 0xD7A3 + + if scalar.value >= hangulBase && scalar.value <= hangulEnd { + let syllableIndex = (scalar.value - hangulBase) + let isCompleted = syllableIndex % 28 != 0 + return !isCompleted + } + + // 완성되지 않은 자모나 조합 중인 경우 + return (scalar.value >= 0x1100 && scalar.value <= 0x11FF) || // 초성 자모 (현대 한글에서 사용하는 초성, 중성, 종성 등의 조합용 자모) + (scalar.value >= 0x3130 && scalar.value <= 0x318F) || // 호환용 자모 (구성된 한글 자모, 옛 한글 자모 등) + (scalar.value >= 0xA960 && scalar.value <= 0xA97F) || // 확장 A (옛 한글 자모의 일부) + (scalar.value >= 0xD7B0 && scalar.value <= 0xD7FF) // 확장 B (옛 한글 자모의 일부) + } + + /// 한글 음절이 종성을 가졌으나 추가적인 종성이 더 결합될 수 있는지 여부 확인 + var canAddAdditionalJongseong: Bool { + guard let scalar = unicodeScalars.first else { return false } + + // 한글 음절 유니코드 범위: U+AC00 ~ U+D7A3 + let hangulBase: UInt32 = 0xAC00 + let hangulEnd: UInt32 = 0xD7A3 + + guard scalar.value >= hangulBase && scalar.value <= hangulEnd else { + return false + } + + // 종성에 해당하는 인덱스를 계산 + let syllableIndex = scalar.value - hangulBase + let jongseongIndex = Int(syllableIndex % 28) + + // 종성이 있을 때 추가 종성을 가질 수 있는 경우를 판별 + let canHaveDoubleJongseong: Bool + + switch jongseongIndex { + case 1: // ㄱ (U+11A8) + canHaveDoubleJongseong = true + case 4: // ㄴ (U+11AB) + canHaveDoubleJongseong = true + case 8: // ㄹ (U+11AF) + canHaveDoubleJongseong = true + case 17: // ㅂ (U+11B7) + canHaveDoubleJongseong = true + default: + canHaveDoubleJongseong = false + } + + return canHaveDoubleJongseong + } +} diff --git a/Projects/Features/BaseFeature/Sources/ViewControllers/TextPopupViewController.swift b/Projects/Features/BaseFeature/Sources/ViewControllers/TextPopupViewController.swift new file mode 100644 index 000000000..01f062f7b --- /dev/null +++ b/Projects/Features/BaseFeature/Sources/ViewControllers/TextPopupViewController.swift @@ -0,0 +1,108 @@ +import DesignSystem +import UIKit +import Utility + +public final class TextPopupViewController: UIViewController, ViewControllerFromStoryBoard { + @IBOutlet weak var contentLabel: UILabel! + @IBOutlet weak var cancelButton: UIButton! + @IBOutlet weak var confirmButton: UIButton! + + var contentString: String = "" + var cancelButtonIsHidden: Bool = false + var completion: (() -> Void)? + var cancelCompletion: (() -> Void)? + var cancelButtonText: String = "" + var confirmButtonText: String = "" + + deinit { + DEBUG_LOG("❌ \(Self.self) Deinit") + } + + override public func viewDidLoad() { + super.viewDidLoad() + + configureUI() + } + + public static func viewController( + text: String = "", + cancelButtonIsHidden: Bool, + confirmButtonText: String = "확인", + cancelButtonText: String = "취소", + completion: (() -> Void)? = nil, + cancelCompletion: (() -> Void)? = nil + + ) -> TextPopupViewController { + let viewController = TextPopupViewController.viewController(storyBoardName: "Base", bundle: Bundle.module) + viewController.contentString = text + viewController.cancelButtonIsHidden = cancelButtonIsHidden + viewController.completion = completion + viewController.cancelCompletion = cancelCompletion + viewController.confirmButtonText = confirmButtonText + viewController.cancelButtonText = cancelButtonText + return viewController + } + + @IBAction func cancelButtonAction(_ sender: Any) { + dismiss(animated: true, completion: { [cancelCompletion] in + cancelCompletion?() + }) + } + + @IBAction func confirmButtonAction(_ sender: Any) { + dismiss(animated: true, completion: { [completion] in + completion?() + }) + } +} + +extension TextPopupViewController { + private func configureUI() { + // 취소 + cancelButton.layer.cornerRadius = 12 + cancelButton.clipsToBounds = true + cancelButton.isHidden = cancelButtonIsHidden + + let cancelAttributedString = NSMutableAttributedString( + string: cancelButtonText, + attributes: [ + .font: DesignSystem.DesignSystemFontFamily.Pretendard.medium.font(size: 18), + .foregroundColor: DesignSystemAsset.BlueGrayColor.gray25.color, + .kern: -0.5 + ] + ) + cancelButton.setAttributedTitle(cancelAttributedString, for: .normal) + + confirmButton.backgroundColor = DesignSystemAsset.PrimaryColor.point.color + confirmButton.layer.cornerRadius = cancelButton.layer.cornerRadius + confirmButton.clipsToBounds = true + + // 확인 + let confirmAttributedString = NSMutableAttributedString( + string: confirmButtonText, + attributes: [ + .font: DesignSystem.DesignSystemFontFamily.Pretendard.medium.font(size: 18), + .foregroundColor: DesignSystemAsset.BlueGrayColor.gray25.color, + .kern: -0.5 + ] + ) + confirmButton.setAttributedTitle(confirmAttributedString, for: .normal) + + // 내용 + let paragraphStyle = NSMutableParagraphStyle() + paragraphStyle.lineHeightMultiple = 1.3 + paragraphStyle.alignment = .center + paragraphStyle.lineBreakStrategy = .hangulWordPriority + + let contentAttributedString = NSMutableAttributedString( + string: contentString, + attributes: [ + .font: DesignSystem.DesignSystemFontFamily.Pretendard.medium.font(size: 18), + .foregroundColor: DesignSystemAsset.BlueGrayColor.gray900.color, + .kern: -0.5, + .paragraphStyle: paragraphStyle + ] + ) + contentLabel.attributedText = contentAttributedString + } +} diff --git a/Projects/Features/BaseFeature/Sources/ViewModels/ContainSongsViewModel.swift b/Projects/Features/BaseFeature/Sources/ViewModels/ContainSongsViewModel.swift new file mode 100644 index 000000000..e8f8ca33e --- /dev/null +++ b/Projects/Features/BaseFeature/Sources/ViewModels/ContainSongsViewModel.swift @@ -0,0 +1,218 @@ +import AuthDomainInterface +import BaseDomainInterface +import ErrorModule +import Foundation +import Localization +import LogManager +import PlaylistDomainInterface +import PriceDomainInterface +import RxRelay +import RxSwift +import UserDomainInterface +import Utility + +#warning("커스텀 에러 리스폰스 후추..") +public final class ContainSongsViewModel: ViewModelType { + private let fetchPlayListUseCase: any FetchPlaylistUseCase + private let addSongIntoPlaylistUseCase: any AddSongIntoPlaylistUseCase + private let createPlaylistUseCase: any CreatePlaylistUseCase + private let fetchPlaylistCreationPriceUsecase: any FetchPlaylistCreationPriceUseCase + private let logoutUseCase: LogoutUseCase + var songs: [String]! + let disposeBag = DisposeBag() + let limit: Int = 50 + + public struct Input { + let viewDidLoad: PublishSubject = PublishSubject() + let newPlayListTap: PublishSubject = PublishSubject() + let playListLoad: BehaviorRelay = BehaviorRelay(value: ()) + let itemDidTap: PublishSubject = PublishSubject() + let createPlaylist: PublishSubject = PublishSubject() + let creationButtonDidTap: PublishSubject = PublishSubject() + let payButtonDidTap: PublishSubject = PublishSubject() + } + + public struct Output { + let dataSource: BehaviorRelay<[PlaylistEntity]> = BehaviorRelay(value: []) + let showToastMessage: PublishSubject = PublishSubject() + let creationPrice: BehaviorRelay = BehaviorRelay(value: 2) + let showPricePopup: PublishSubject = PublishSubject() + let showCreationPopup: PublishSubject = PublishSubject() + let onLogout: PublishRelay + + init(onLogout: PublishRelay) { + self.onLogout = onLogout + } + } + + init( + songs: [String], + createPlaylistUseCase: any CreatePlaylistUseCase, + fetchPlayListUseCase: any FetchPlaylistUseCase, + addSongIntoPlaylistUseCase: any AddSongIntoPlaylistUseCase, + fetchPlaylistCreationPriceUsecase: any FetchPlaylistCreationPriceUseCase, + logoutUseCase: LogoutUseCase + ) { + self.createPlaylistUseCase = createPlaylistUseCase + self.fetchPlayListUseCase = fetchPlayListUseCase + self.addSongIntoPlaylistUseCase = addSongIntoPlaylistUseCase + self.fetchPlaylistCreationPriceUsecase = fetchPlaylistCreationPriceUsecase + self.logoutUseCase = logoutUseCase + self.songs = songs + } + + public func transform(from input: Input) -> Output { + let logoutRelay = PublishRelay() + + let output = Output(onLogout: logoutRelay) + + input.viewDidLoad + .withUnretained(self) + .flatMap { owner, _ -> Observable in + + owner.fetchPlaylistCreationPriceUsecase + .execute() + .asObservable() + .map(\.price) + } + .bind(to: output.creationPrice) + .disposed(by: disposeBag) + + input.playListLoad + .flatMap { [weak self] () -> Observable<[PlaylistEntity]> in + guard let self = self else { + return Observable.empty() + } + return self.fetchPlayListUseCase.execute() + .asObservable() + .catch { [logoutUseCase] (error: Error) in + let wmError = error.asWMError + if wmError == .tokenExpired { + logoutRelay.accept(wmError) + return logoutUseCase.execute(localOnly: false) + .andThen(Observable.error(wmError)) + } else { + return Observable.error(wmError) + } + } + } + .do(onError: { (error: Error) in + let wmError = error.asWMError + output.showToastMessage.onNext(BaseEntity( + status: 401, + description: wmError.errorDescription ?? LocalizationStrings.unknownErrorWarning + )) + }) + .catchAndReturn([]) + .withLatestFrom(PreferenceManager.$userInfo) { ($0, $1) } + .map { playlist, userInfo in + + return playlist.filter { $0.userId == userInfo?.decryptedID } + } + .bind(to: output.dataSource) + .disposed(by: disposeBag) + + input.itemDidTap + .flatMap { [weak self] (model: PlaylistEntity) -> Observable in + guard let self = self else { + return Observable.empty() + } + + let count = model.songCount + self.songs.count + + guard count <= limit else { + output.showToastMessage.onNext( + BaseEntity( + status: -1, + description: LocalizationStrings.overFlowAddPlaylistWarning(count - limit) + ) + ) + return .empty() + } + + return self.addSongIntoPlaylistUseCase + .execute(key: model.key, songs: self.songs) + .do(onSuccess: { _ in + let log = ContainSongsAnalyticsLog.completeAddMusics( + playlistId: model.key, + count: self.songs.count + ) + LogManager.analytics(log) + }) + .catch { (error: Error) in + let wmError = error.asWMError + + switch wmError { + case .tokenExpired: + logoutRelay.accept(wmError) + output.showToastMessage.onNext(BaseEntity( + status: 401, + description: wmError.errorDescription ?? wmError.localizedDescription + )) + case .conflict: + + output.showToastMessage.onNext(BaseEntity( + status: 409, + description: "이미 내 리스트에 담긴 곡들입니다." + )) + + default: + output.showToastMessage.onNext(BaseEntity(status: 400, description: "잘못된 요청입니다.")) + } + + return .never() + } + .asObservable() + } + .map { (entity: AddSongEntity) -> BaseEntity in + if entity.duplicated { + return BaseEntity( + status: 200, + description: "\(entity.addedSongCount)곡이 내 리스트에 담겼습니다. 중복 곡은 제외됩니다." + ) + } else { + return BaseEntity(status: 200, description: "\(entity.addedSongCount)곡이 내 리스트에 담겼습니다.") + } + } + .bind(to: output.showToastMessage) + .disposed(by: disposeBag) + + input.creationButtonDidTap + .bind(to: output.showPricePopup) + .disposed(by: disposeBag) + + input.payButtonDidTap + .bind(to: output.showCreationPopup) + .disposed(by: disposeBag) + + input.createPlaylist + .withUnretained(self) { ($0, $1) } + .flatMap { owner, text -> Observable in + + owner.createPlaylistUseCase.execute(title: text) + .asObservable() + .catch { (error: Error) in + let wmError = error.asWMError + if wmError == .tokenExpired { + logoutRelay.accept(wmError) + return owner.logoutUseCase.execute(localOnly: false) + .andThen(Observable.error(wmError)) + } else { + return Observable.error(wmError) + } + } + } + .do(onError: { error in + let wmError: WMError = error.asWMError + output.showToastMessage.onNext(BaseEntity(status: 400, description: wmError.errorDescription!)) + }) + .map { _ in BaseEntity(status: 201, description: "플레이리스트를 성공적으로 생성했습니다.") } + .do(onNext: { _ in + NotificationCenter.default.post(name: .willRefreshUserInfo, object: nil) + }) + .bind(to: output.showToastMessage) + .disposed(by: disposeBag) + + return output + } +} diff --git a/Projects/Features/BaseFeature/Sources/ViewModels/MultiPurposePopupViewModel.swift b/Projects/Features/BaseFeature/Sources/ViewModels/MultiPurposePopupViewModel.swift new file mode 100644 index 000000000..c9f276c58 --- /dev/null +++ b/Projects/Features/BaseFeature/Sources/ViewModels/MultiPurposePopupViewModel.swift @@ -0,0 +1,37 @@ +import AuthDomainInterface +import BaseDomainInterface +import BaseFeatureInterface +import Foundation +import PlaylistDomainInterface +import RxRelay +import RxSwift +import UserDomainInterface +import Utility + +public final class MultiPurposePopupViewModel: ViewModelType { + let type: PurposeType + let key: String + + public struct Input { + let textString: BehaviorRelay = BehaviorRelay(value: "") + } + + public struct Output {} + + public init( + type: PurposeType, + key: String + ) { + self.key = key + self.type = type + } + + deinit { + DEBUG_LOG("❌ \(Self.self) 소멸") + } + + public func transform(from input: Input) -> Output { + let output = Output() + return output + } +} diff --git a/Projects/Features/CommonFeature/Sources/Views/BottomSheet/BottomSheetCalculator.swift b/Projects/Features/BaseFeature/Sources/Views/BottomSheet/BottomSheetCalculator.swift similarity index 95% rename from Projects/Features/CommonFeature/Sources/Views/BottomSheet/BottomSheetCalculator.swift rename to Projects/Features/BaseFeature/Sources/Views/BottomSheet/BottomSheetCalculator.swift index 986254d93..f0a5d1886 100644 --- a/Projects/Features/CommonFeature/Sources/Views/BottomSheet/BottomSheetCalculator.swift +++ b/Projects/Features/BaseFeature/Sources/Views/BottomSheet/BottomSheetCalculator.swift @@ -3,14 +3,15 @@ // import UIKit +import Utility extension CGFloat { static var safeAreaBottomInset: CGFloat { - return UIApplication.shared.windows.first?.safeAreaInsets.bottom ?? 0 + return SAFEAREA_BOTTOM_HEIGHT() } } -struct BottomSheetCalculator { +enum BottomSheetCalculator { /// Calculates offset for the given content view within its superview, taking preferred height into account. /// /// - Parameters: @@ -81,7 +82,8 @@ struct BottomSheetCalculator { // We add a zero threshold at the end to make the BottomSheetView stop at its biggest height. let highestThreshold: CGFloat = 0 // Calculate all the offsets in between - let thresholds = [lowestThreshold] + zip(targetOffsets.dropFirst(), targetOffsets).map { threshold($0, $1) } + [highestThreshold] + let thresholds = [lowestThreshold] + zip(targetOffsets.dropFirst(), targetOffsets) + .map { threshold($0, $1) } + [highestThreshold] // Calculate lower bounds let lowerOffsets = targetOffsets[currentTargetIndex...] @@ -139,7 +141,7 @@ extension UIView { func systemLayoutHeightFitting(_ size: CGSize) -> CGFloat { let sizeToFit: CGSize - /// Consider preferredContentSize if it's a view of UIViewController + // Consider preferredContentSize if it's a view of UIViewController if let viewController = next as? UIViewController { sizeToFit = viewController.preferredContentSize } else { diff --git a/Projects/Features/CommonFeature/Sources/Views/BottomSheet/BottomSheetPresentationController.swift b/Projects/Features/BaseFeature/Sources/Views/BottomSheet/BottomSheetPresentationController.swift similarity index 99% rename from Projects/Features/CommonFeature/Sources/Views/BottomSheet/BottomSheetPresentationController.swift rename to Projects/Features/BaseFeature/Sources/Views/BottomSheet/BottomSheetPresentationController.swift index eee84c6c0..1036612ec 100644 --- a/Projects/Features/CommonFeature/Sources/Views/BottomSheet/BottomSheetPresentationController.swift +++ b/Projects/Features/BaseFeature/Sources/Views/BottomSheet/BottomSheetPresentationController.swift @@ -34,12 +34,10 @@ public protocol BottomSheetPresentationControllerDelegate: AnyObject { } final class BottomSheetPresentationController: UIPresentationController { - // MARK: - Internal properties var transitionState: TransitionState? - // MARK: - Private properties private var contentHeights: [CGFloat] @@ -231,7 +229,7 @@ extension BottomSheetPresentationController: BottomSheetViewDismissalDelegate { dismissAction = action switch action { - case .drag(let velocity): + case let .drag(velocity): dismiss(with: velocity) case .tap: dismiss(with: .zero) diff --git a/Projects/Features/CommonFeature/Sources/Views/BottomSheet/BottomSheetTransitioningDelegate.swift b/Projects/Features/BaseFeature/Sources/Views/BottomSheet/BottomSheetTransitioningDelegate.swift similarity index 98% rename from Projects/Features/CommonFeature/Sources/Views/BottomSheet/BottomSheetTransitioningDelegate.swift rename to Projects/Features/BaseFeature/Sources/Views/BottomSheet/BottomSheetTransitioningDelegate.swift index f519b2d17..a1f3dcb5f 100644 --- a/Projects/Features/CommonFeature/Sources/Views/BottomSheet/BottomSheetTransitioningDelegate.swift +++ b/Projects/Features/BaseFeature/Sources/Views/BottomSheet/BottomSheetTransitioningDelegate.swift @@ -99,7 +99,8 @@ extension BottomSheetTransitioningDelegate: UIViewControllerTransitioningDelegat return presentationController } - public func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? { + public func animationController(forDismissed dismissed: UIViewController) + -> UIViewControllerAnimatedTransitioning? { presentationController?.transitionState = .dismissing return presentationController } diff --git a/Projects/Features/CommonFeature/Sources/Views/BottomSheet/BottomSheetView.swift b/Projects/Features/BaseFeature/Sources/Views/BottomSheet/BottomSheetView.swift similarity index 91% rename from Projects/Features/CommonFeature/Sources/Views/BottomSheet/BottomSheetView.swift rename to Projects/Features/BaseFeature/Sources/Views/BottomSheet/BottomSheetView.swift index 697a693d8..dcff08090 100644 --- a/Projects/Features/CommonFeature/Sources/Views/BottomSheet/BottomSheetView.swift +++ b/Projects/Features/BaseFeature/Sources/Views/BottomSheet/BottomSheetView.swift @@ -6,18 +6,18 @@ import UIKit // MARK: - Public extensions extension Array { - // Returns an Optional that will be nil if index < count + /// Returns an Optional that will be nil if index < count subscript(safe index: Int) -> Element? { return indices.contains(index) ? self[index] : .none } } -extension CGFloat { - public static let bottomSheetAutomatic: CGFloat = -123456789 +public extension CGFloat { + static let bottomSheetAutomatic: CGFloat = -123_456_789 } -extension Array where Element == CGFloat { - public static var bottomSheetDefault: [CGFloat] { +public extension Array where Element == CGFloat { + static var bottomSheetDefault: [CGFloat] { let screenSize = UIScreen.main.bounds.size if screenSize.height <= 568 { @@ -50,11 +50,11 @@ public final class BottomSheetView: UIView { var view: UIView { switch self { - case .color(let value): + case let .color(value): let view = UIView() view.backgroundColor = value return view - case .visualEffect(let value): + case let .visualEffect(value): return UIVisualEffectView(effect: value) } } @@ -83,6 +83,7 @@ public final class BottomSheetView: UIView { private var bottomInset: CGFloat { return useSafeAreaInsets ? .safeAreaBottomInset : 0 } + private lazy var contentViewHeightConstraint = contentView.heightAnchor.constraint(greaterThanOrEqualToConstant: 0) // MARK: - Init @@ -108,13 +109,14 @@ public final class BottomSheetView: UIView { accessibilityViewIsModal = true } + @available(*, unavailable) public required init?(coder: NSCoder) { fatalError("Not implemented") } // MARK: - Overrides - public override func layoutSubviews() { + override public func layoutSubviews() { super.layoutSubviews() } @@ -125,7 +127,12 @@ public final class BottomSheetView: UIView { /// - Parameters: /// - view: the container for the bottom sheet view /// - completion: a closure to be executed when the animation ends - public func present(in superview: UIView, targetIndex: Int = 0, animated: Bool = true, completion: ((Bool) -> Void)? = nil) { + public func present( + in superview: UIView, + targetIndex: Int = 0, + animated: Bool = true, + completion: ((Bool) -> Void)? = nil + ) { guard self.superview != superview, let height = contentHeights[safe: targetIndex] @@ -259,7 +266,10 @@ public final class BottomSheetView: UIView { if stretchOnResize { constraints.append(contentView.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -bottomInset)) } else { - constraints.append(contentView.bottomAnchor.constraint(lessThanOrEqualTo: bottomAnchor, constant: -bottomInset)) + constraints.append(contentView.bottomAnchor.constraint( + lessThanOrEqualTo: bottomAnchor, + constant: -bottomInset + )) } NSLayoutConstraint.activate(constraints) @@ -285,7 +295,12 @@ public final class BottomSheetView: UIView { contentViewHeightConstraint.constant = 0 targetOffsets = contentHeights.map { - BottomSheetCalculator.offset(for: contentView, in: superview, height: $0, useSafeAreaInsets: useSafeAreaInsets) + BottomSheetCalculator.offset( + for: contentView, + in: superview, + height: $0, + useSafeAreaInsets: useSafeAreaInsets + ) }.sorted(by: >) if let maxOffset = targetOffsets.max() { diff --git a/Projects/Features/CommonFeature/Sources/Views/BottomSheet/SpringAnimator.swift b/Projects/Features/BaseFeature/Sources/Views/BottomSheet/SpringAnimator.swift similarity index 99% rename from Projects/Features/CommonFeature/Sources/Views/BottomSheet/SpringAnimator.swift rename to Projects/Features/BaseFeature/Sources/Views/BottomSheet/SpringAnimator.swift index e31f47920..5df679f48 100644 --- a/Projects/Features/CommonFeature/Sources/Views/BottomSheet/SpringAnimator.swift +++ b/Projects/Features/BaseFeature/Sources/Views/BottomSheet/SpringAnimator.swift @@ -112,7 +112,7 @@ class SpringAnimator: NSObject { private extension SpringAnimator { @objc func step(displayLink: CADisplayLink) { - // Get duration in a way that supports screens with variable refresh rates + // Get duration in a way that supports screens with variable refresh rates let duration = displayLink.targetTimestamp - CACurrentMediaTime() // Calculate new potision position += velocity * CGFloat(duration) diff --git a/Projects/Features/CommonFeature/Sources/Views/BottomSheet/TranslationTarget.swift b/Projects/Features/BaseFeature/Sources/Views/BottomSheet/TranslationTarget.swift similarity index 98% rename from Projects/Features/CommonFeature/Sources/Views/BottomSheet/TranslationTarget.swift rename to Projects/Features/BaseFeature/Sources/Views/BottomSheet/TranslationTarget.swift index 945d17230..3f60d3ef7 100644 --- a/Projects/Features/CommonFeature/Sources/Views/BottomSheet/TranslationTarget.swift +++ b/Projects/Features/BaseFeature/Sources/Views/BottomSheet/TranslationTarget.swift @@ -7,7 +7,6 @@ import CoreGraphics /// Model defining a certain area of a BottomSheetView. /// protocol TranslationTarget { - /// An offset which a BottomSheetView can transition to var targetOffset: CGFloat { get } @@ -97,7 +96,7 @@ struct LimitTarget: TranslationTarget { switch behavior { case .linear: return offset - case .rubberBand(let radius): + case let .rubberBand(radius): let distance = offset - bound let newOffset = radius * (1 - exp(-abs(distance) / radius)) @@ -116,7 +115,7 @@ struct LimitTarget: TranslationTarget { switch behavior { case .linear: return velocity - case .rubberBand(let radius): + case let .rubberBand(radius): let distance = offset - bound let constant = exp(-abs(distance) / radius) diff --git a/Projects/Features/BaseFeature/Sources/Views/ChartUpdateTimeView.swift b/Projects/Features/BaseFeature/Sources/Views/ChartUpdateTimeView.swift new file mode 100644 index 000000000..7dd044998 --- /dev/null +++ b/Projects/Features/BaseFeature/Sources/Views/ChartUpdateTimeView.swift @@ -0,0 +1,63 @@ +// +// PlayButtonForNewSongsView.swift +// CommonFeature +// +// Created by KTH on 2023/11/16. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import DesignSystem +import RxRelay +import RxSwift +import SnapKit +import Then +import UIKit + +public final class ChartUpdateTimeView: UIView { + private let updateTimeLabel = WMLabel( + text: "업데이트", + textColor: DesignSystemAsset.GrayColor.gray600.color, + font: .t7(weight: .light), + alignment: .left, + lineHeight: UIFont.WMFontSystem.t7().lineHeight, + kernValue: -0.5 + ) + + private let updateTimeImageView = UIImageView().then { + $0.image = DesignSystemAsset.Chart.check.image + } + + override public init(frame: CGRect) { + super.init(frame: frame) + self.setupView() + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + self.setupView() + } + + public func setUpdateTime(updateTime: String) { + updateTimeLabel.text = updateTime + } +} + +extension ChartUpdateTimeView { + private func setupView() { + self.backgroundColor = DesignSystemAsset.GrayColor.gray100.color + + [updateTimeImageView, updateTimeLabel].forEach { self.addSubview($0) } + + updateTimeImageView.snp.makeConstraints { + $0.top.equalTo(1) + $0.width.height.equalTo(16) + $0.leading.equalTo(20) + } + + updateTimeLabel.snp.makeConstraints { + $0.top.equalTo(0) + $0.height.equalTo(18) + $0.leading.equalTo(updateTimeImageView.snp.trailing).offset(2) + } + } +} diff --git a/Projects/Features/BaseFeature/Sources/Views/ContainPlaylistHeaderView.swift b/Projects/Features/BaseFeature/Sources/Views/ContainPlaylistHeaderView.swift new file mode 100644 index 000000000..6af835b79 --- /dev/null +++ b/Projects/Features/BaseFeature/Sources/Views/ContainPlaylistHeaderView.swift @@ -0,0 +1,61 @@ +import DesignSystem +import UIKit + +public protocol ContainPlaylistHeaderViewDelegate: AnyObject { + func action() +} + +class ContainPlaylistHeaderView: UIView { + @IBOutlet weak var superView: UIView! + @IBOutlet weak var button: UIButton! + @IBOutlet weak var buttonImageView: UIImageView! + + @IBOutlet weak var blurEffectViews: UIVisualEffectView! + + weak var delegate: ContainPlaylistHeaderViewDelegate? + + @IBAction func buttonAction(_ sender: Any) { + self.delegate?.action() + } + + override init(frame: CGRect) { // 코드쪽에서 생성 시 호출 + super.init(frame: frame) + self.setupView() + } + + required init?(coder aDecoder: NSCoder) // StoryBoard에서 호출됨 + { + super.init(coder: aDecoder) + self.setupView() + } + + private func setupView() { + if let view = Bundle.module.loadNibNamed("ContainPlaylistHeaderView", owner: self, options: nil)! + .first as? UIView { + view.frame = self.bounds + view.layoutIfNeeded() // 드로우 사이클을 호출할 때 쓰임 + self.addSubview(view) + } + + self.buttonImageView.image = DesignSystemAsset.Storage.storageNewPlaylistAdd.image + + let attr = NSMutableAttributedString( + string: "새 리스트 만들기", + attributes: [ + .font: DesignSystemFontFamily.Pretendard.medium.font(size: 14), + .foregroundColor: DesignSystemAsset.BlueGrayColor.gray900.color, + .kern: -0.5 + ] + ) + self.backgroundColor = .clear + superView.backgroundColor = .white.withAlphaComponent(0.4) + superView.layer.cornerRadius = 8 + superView.layer.borderColor = DesignSystemAsset.BlueGrayColor.gray200.color.withAlphaComponent(0.4).cgColor + superView.layer.borderWidth = 1 + + blurEffectViews.layer.cornerRadius = 8 + blurEffectViews.clipsToBounds = true + + self.button.setAttributedTitle(attr, for: .normal) + } +} diff --git a/Projects/Features/BaseFeature/Sources/Views/CurrentPlaylistTableViewCell.swift b/Projects/Features/BaseFeature/Sources/Views/CurrentPlaylistTableViewCell.swift new file mode 100644 index 000000000..ed104346f --- /dev/null +++ b/Projects/Features/BaseFeature/Sources/Views/CurrentPlaylistTableViewCell.swift @@ -0,0 +1,37 @@ +import DesignSystem +import UIKit +import UserDomainInterface +import Utility + +class CurrentPlaylistTableViewCell: UITableViewCell { + @IBOutlet weak var playlistImageView: UIImageView! + @IBOutlet weak var playlistNameLabel: UILabel! + @IBOutlet weak var playlistCountLabel: UILabel! + @IBOutlet weak var lockImageView: UIImageView! + + override func awakeFromNib() { + super.awakeFromNib() + self.backgroundColor = DesignSystemAsset.BlueGrayColor.gray100.color + self.playlistImageView.layer.cornerRadius = 4 + self.playlistNameLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 14) + self.playlistNameLabel.textColor = DesignSystemAsset.BlueGrayColor.gray900.color + self.playlistNameLabel.setTextWithAttributes(kernValue: -0.5) + self.playlistCountLabel.font = DesignSystemFontFamily.Pretendard.light.font(size: 12) + self.playlistCountLabel.textColor = DesignSystemAsset.BlueGrayColor.gray900.color + self.playlistCountLabel.setTextWithAttributes(kernValue: -0.5) + self.lockImageView.image = DesignSystemAsset.Storage.storageClose.image + } +} + +extension CurrentPlaylistTableViewCell { + func update(model: PlaylistEntity) { + self.playlistImageView.kf.setImage( + with: URL(string: model.image), + placeholder: nil, + options: [.transition(.fade(0.2))] + ) + self.playlistNameLabel.text = model.title + self.playlistCountLabel.text = "\(model.songCount)곡" + self.lockImageView.isHidden = !model.private + } +} diff --git a/Projects/Features/BaseFeature/Sources/Views/EditSheetView.swift b/Projects/Features/BaseFeature/Sources/Views/EditSheetView.swift new file mode 100644 index 000000000..bebed910f --- /dev/null +++ b/Projects/Features/BaseFeature/Sources/Views/EditSheetView.swift @@ -0,0 +1,135 @@ +// +// EditSheetView.swift +// CommonFeature +// +// Created by KTH on 2023/03/17. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import DesignSystem +import UIKit +import Utility + +public protocol EditSheetViewDelegate: AnyObject { + func buttonTapped(type: EditSheetSelectType) +} + +public enum EditSheetSelectType { + case edit + case share + case profile + case nickname +} + +public class EditSheetView: UIView { + @IBOutlet weak var contentView: UIView! + @IBOutlet weak var editButton: UIButton! + @IBOutlet weak var shareButton: UIButton! + @IBOutlet weak var profileButton: UIButton! + @IBOutlet weak var nicknameButton: UIButton! + + public weak var delegate: EditSheetViewDelegate? + public var type: EditSheetType = .playList + + override public init(frame: CGRect) { + super.init(frame: frame) + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + self.setupView() + } + + convenience init(type: EditSheetType) { + self.init() + self.type = type + self.setupView() + } + + deinit { + DEBUG_LOG("\(Self.self) Deinit") + } + + @IBAction func buttonAction(_ sender: Any) { + guard let button = sender as? UIButton else { return } + + if button == editButton { + delegate?.buttonTapped(type: .edit) + + } else if button == shareButton { + delegate?.buttonTapped(type: .share) + + } else if button == profileButton { + delegate?.buttonTapped(type: .profile) + + } else if button == nicknameButton { + delegate?.buttonTapped(type: .nickname) + } + } +} + +public extension EditSheetView { + private func setupView() { + guard let view = Bundle.module.loadNibNamed("EditSheetView", owner: self, options: nil)?.first as? UIView + else { return } + view.frame = self.bounds + view.layoutIfNeeded() + addSubview(view) + configureType() + configureUI() + } + + private func configureType() { + switch self.type { + case .playList: + editButton.isHidden = false + shareButton.isHidden = false + profileButton.isHidden = true + nicknameButton.isHidden = true + + case .profile: + editButton.isHidden = true + shareButton.isHidden = true + profileButton.isHidden = false + nicknameButton.isHidden = false + } + } + + private func configureUI() { + contentView.backgroundColor = DesignSystemAsset.PrimaryColor.point.color + let titles: [String] = ["편집", "공유하기", "프로필 변경", "닉네임 수정"] + + let images: [UIImage] = [ + DesignSystemAsset.PlayListEdit.playlistEdit.image, + DesignSystemAsset.PlayListEdit.playlistShare.image, + DesignSystemAsset.Storage.profileEdit.image, + DesignSystemAsset.Storage.nicknameEdit.image + ] + + let buttons: [UIButton] = [ + editButton, + shareButton, + profileButton, + nicknameButton + ] + + guard titles.count == images.count, + titles.count == buttons.count else { return } + + for i in 0 ..< titles.count { + buttons[i].setImage(images[i], for: .normal) + let attributedString = NSMutableAttributedString.init(string: titles[i]) + attributedString.addAttributes( + [ + .font: DesignSystemFontFamily.Pretendard.medium.font(size: 12), + .foregroundColor: DesignSystemAsset.GrayColor.gray25.color, + .kern: -0.5 + ], + range: NSRange(location: 0, length: attributedString.string.count) + ) + + buttons[i].setAttributedTitle(attributedString, for: .normal) + buttons[i].alignTextBelow(spacing: 0) + } + } +} diff --git a/Projects/Features/CommonFeature/Sources/Views/GlassmorphismView.swift b/Projects/Features/BaseFeature/Sources/Views/GlassmorphismView.swift similarity index 96% rename from Projects/Features/CommonFeature/Sources/Views/GlassmorphismView.swift rename to Projects/Features/BaseFeature/Sources/Views/GlassmorphismView.swift index 22239d300..23fe05d9f 100644 --- a/Projects/Features/CommonFeature/Sources/Views/GlassmorphismView.swift +++ b/Projects/Features/BaseFeature/Sources/Views/GlassmorphismView.swift @@ -13,28 +13,28 @@ public class GlassmorphismView: UIView { // MARK: - Properties private var blurView = UIVisualEffectView(effect: UIBlurEffect(style: .light)) private let backgroundView = UIView() - public override var backgroundColor: UIColor? { + override public var backgroundColor: UIColor? { get { return .clear } set {} } - + // MARK: - init/deinit override init(frame: CGRect) { super.init(frame: frame) self.initialize() } - + required init?(coder: NSCoder) { super.init(coder: coder) self.initialize() } - - public override func awakeFromNib() { + + override public func awakeFromNib() { super.awakeFromNib() } - + // MARK: - Public Method /// Customizes theme by changing base view's background color. /// .light and .dark is available. @@ -50,14 +50,14 @@ public class GlassmorphismView: UIView { self.blurView.backgroundColor = UIColor.black.withAlphaComponent(0.35) } } - + /// Changes cornerRadius of the view. /// Default value is 20 public func setCornerRadius(_ value: CGFloat) { self.backgroundView.layer.cornerRadius = value self.blurView.layer.cornerRadius = value } - + /// Change distance of the view. /// Value can be set between 0 ~ 100 (default: 20) /// - parameters: @@ -71,7 +71,7 @@ public class GlassmorphismView: UIView { } self.backgroundView.layer.shadowRadius = distance } - + // MARK: - Private Method private func initialize() { // backgoundView(baseView) setting @@ -84,7 +84,7 @@ public class GlassmorphismView: UIView { backgroundView.layer.shadowOffset = CGSize(width: 0, height: 0) backgroundView.layer.shadowOpacity = 0.2 backgroundView.layer.shadowRadius = 20.0 - + // blurEffectView setting blurView.layer.masksToBounds = true blurView.layer.cornerRadius = 20 @@ -102,7 +102,7 @@ public class GlassmorphismView: UIView { blurView.widthAnchor.constraint(equalTo: self.widthAnchor) ]) } - + // MARK: - Theme public enum CHTheme { case light diff --git a/Projects/Features/BaseFeature/Sources/Views/NoticeCollectionViewCell.swift b/Projects/Features/BaseFeature/Sources/Views/NoticeCollectionViewCell.swift new file mode 100644 index 000000000..b08a1d9c2 --- /dev/null +++ b/Projects/Features/BaseFeature/Sources/Views/NoticeCollectionViewCell.swift @@ -0,0 +1,31 @@ +// +// NoticeCollectionViewCell.swift +// CommonFeature +// +// Created by KTH on 2023/04/08. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import NoticeDomainInterface +import UIKit +import Utility + +public final class NoticeCollectionViewCell: UICollectionViewCell { + @IBOutlet weak var contentImageView: UIImageView! + + override public func awakeFromNib() { + super.awakeFromNib() + contentImageView.contentMode = .scaleAspectFill + contentImageView.clipsToBounds = true + } +} + +public extension NoticeCollectionViewCell { + func update(model: FetchNoticeEntity.Image) { + contentImageView.kf.setImage( + with: URL(string: model.url), + placeholder: nil, + options: [.transition(.fade(0.2))] + ) + } +} diff --git a/Projects/Features/BaseFeature/Sources/Views/PlayButtonGroupView.swift b/Projects/Features/BaseFeature/Sources/Views/PlayButtonGroupView.swift new file mode 100644 index 000000000..58c29b7de --- /dev/null +++ b/Projects/Features/BaseFeature/Sources/Views/PlayButtonGroupView.swift @@ -0,0 +1,110 @@ +// +// PlayButtonGroupView.swift +// DesignSystemTests +// +// Created by yongbeomkwak on 2023/01/18. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import DesignSystem +import UIKit + +public enum PlayEvent { + case allPlay + case shufflePlay +} + +public protocol PlayButtonGroupViewDelegate: AnyObject { + func play(_ event: PlayEvent) +} + +public class PlayButtonGroupView: UIView { + @IBOutlet weak var allPlaySuperView: UIView! + @IBOutlet weak var allPlayButton: UIButton! + + @IBOutlet weak var shufflePlayButton: UIButton! + @IBOutlet weak var shufflePlaySuperView: UIView! + + public weak var delegate: PlayButtonGroupViewDelegate? + + @IBAction func pressAllPlay(_ sender: UIButton) { + delegate?.play(.allPlay) + } + + @IBAction func pressSufflePlay(_ sender: UIButton) { + delegate?.play(.shufflePlay) + } + + override public init(frame: CGRect) { + super.init(frame: frame) + self.setupView() + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + self.setupView() + } +} + +extension PlayButtonGroupView { + private func setupView() { + guard let view = Bundle.module.loadNibNamed("PlayButtonGroupView", owner: self, options: nil)?.first as? UIView + else { return } + view.frame = self.bounds + view.layoutIfNeeded() + self.addSubview(view) + + view.backgroundColor = DesignSystemAsset.GrayColor.gray100.color + let allPlayAttributedString = NSMutableAttributedString.init(string: "전체재생") + + allPlayAttributedString.addAttributes( + [ + .font: DesignSystemFontFamily.Pretendard.medium.font(size: 14), + .foregroundColor: DesignSystemAsset.GrayColor.gray900.color + ], + range: NSRange(location: 0, length: allPlayAttributedString.string.count) + ) + + allPlaySuperView.backgroundColor = .white.withAlphaComponent(0.4) + + allPlayButton.setImage(DesignSystemAsset.Chart.allPlay.image.withRenderingMode(.alwaysOriginal), for: .normal) + allPlayButton.contentEdgeInsets = UIEdgeInsets(top: 0, left: -10, bottom: 0, right: 0) + allPlayButton.titleEdgeInsets = UIEdgeInsets(top: 0, left: 6, bottom: 0, right: 0) + + allPlaySuperView.layer.cornerRadius = 8 + allPlaySuperView.layer.borderColor = DesignSystemAsset.GrayColor.gray200.color.withAlphaComponent(0.7).cgColor + allPlaySuperView.layer.borderWidth = 1 + allPlayButton.titleLabel?.alpha = 1 + + let shufflePlayAttributedString = NSMutableAttributedString.init(string: "랜덤재생") + + shufflePlayAttributedString.addAttributes( + [ + .font: DesignSystemFontFamily.Pretendard.medium.font(size: 14), + .foregroundColor: DesignSystemAsset.GrayColor.gray900.color + ], + range: NSRange( + location: 0, + length: shufflePlayAttributedString.string.count + ) + ) + + shufflePlayButton.setImage( + DesignSystemAsset.Chart.shufflePlay.image.withRenderingMode(.alwaysOriginal), + for: .normal + ) + shufflePlayButton.contentEdgeInsets = UIEdgeInsets(top: 0, left: -10, bottom: 0, right: 0) + shufflePlayButton.titleEdgeInsets = UIEdgeInsets(top: 0, left: 6, bottom: 0, right: 0) + + shufflePlaySuperView.backgroundColor = .white.withAlphaComponent(0.4) + shufflePlaySuperView.layer.cornerRadius = 8 + shufflePlaySuperView.layer.borderColor = DesignSystemAsset.GrayColor.gray200.color.withAlphaComponent(0.7) + .cgColor + shufflePlaySuperView.layer.borderWidth = 1 + + // 여기 안으로 넣어보세요. + allPlayButton.setAttributedTitle(allPlayAttributedString, for: .normal) + shufflePlayButton.setAttributedTitle(shufflePlayAttributedString, for: .normal) + view.layoutIfNeeded() // 당장 UI 갱신해 : 사용 이유, 버튼 텍스트 깜빡거림 방지 + } +} diff --git a/Projects/Features/BaseFeature/Sources/Views/PlaylistEditSheetView.swift b/Projects/Features/BaseFeature/Sources/Views/PlaylistEditSheetView.swift new file mode 100644 index 000000000..2f73288fa --- /dev/null +++ b/Projects/Features/BaseFeature/Sources/Views/PlaylistEditSheetView.swift @@ -0,0 +1,72 @@ +import DesignSystem +import SnapKit +import Then +import UIKit +import Utility + +public protocol PlaylistEditSheetDelegate: AnyObject { + func didTap(_ type: PlaylistEditType) +} + +public class PlaylistEditSheetView: UIView { + public weak var delegate: PlaylistEditSheetDelegate? + + private let editButton: VerticalAlignButton = VerticalAlignButton( + title: "편집", + image: DesignSystemAsset.PlayListEdit.playlistEdit.image, + titleColor: .white, + spacing: .zero + ) + + private let shareButton: VerticalAlignButton = VerticalAlignButton( + title: "공유하기", + image: DesignSystemAsset.PlayListEdit.playlistShare.image, + titleColor: .white, + spacing: .zero + ) + + private lazy var stackView: UIStackView = UIStackView(arrangedSubviews: [editButton, shareButton]).then { + $0.spacing = 0 + $0.distribution = .fillEqually + $0.alignment = .fill + $0.backgroundColor = .clear + } + + override init(frame: CGRect) { + super.init(frame: .zero) + addViews() + setLayout() + addAction() + self.backgroundColor = DesignSystemAsset.PrimaryColorV2.point.color + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +extension PlaylistEditSheetView { + private func addViews() { + self.addSubviews(stackView) + } + + private func setLayout() { + stackView.snp.makeConstraints { + $0.top.bottom.equalToSuperview() + $0.leading.trailing.equalToSuperview().inset(40) + } + } + + private func addAction() { + editButton.addAction { [weak self] in + guard let self else { return } + self.delegate?.didTap(.edit) + } + + shareButton.addAction { [weak self] in + guard let self else { return } + self.delegate?.didTap(.share) + } + } +} diff --git a/Projects/Features/BaseFeature/Sources/Views/RecommendPlayListCell.swift b/Projects/Features/BaseFeature/Sources/Views/RecommendPlayListCell.swift new file mode 100644 index 000000000..89078765b --- /dev/null +++ b/Projects/Features/BaseFeature/Sources/Views/RecommendPlayListCell.swift @@ -0,0 +1,52 @@ +// +// RecommendPlayListCell.swift +// HomeFeature +// +// Created by KTH on 2023/01/07. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import DesignSystem +import Kingfisher +import PlaylistDomainInterface +import UIKit +import Utility + +public class RecommendPlayListCell: UICollectionViewCell { + @IBOutlet weak var titleStringLabel: UILabel! + + @IBOutlet weak var logoImageView: UIImageView! + override public func awakeFromNib() { + super.awakeFromNib() + + self.contentView.layer.cornerRadius = 8 + self.contentView.layer.borderColor = UIColor.white.cgColor + self.contentView.layer.borderWidth = 1 + self.contentView.backgroundColor = DesignSystemAsset.GrayColor.gray25.color + + let itemWidth: CGFloat = (APP_WIDTH() - (20 + 8 + 20)) / 2.0 + let itemHeight: CGFloat = (80.0 * itemWidth) / 164.0 + self.logoImageView.layer.cornerRadius = ((48 * itemHeight) / 80.0) / 2.0 + } +} + +public extension RecommendPlayListCell { + func update(model: RecommendPlaylistEntity) { + let attributedString = NSMutableAttributedString( + string: model.title, + attributes: [ + .font: DesignSystemFontFamily.Pretendard.medium.font(size: 14), + .foregroundColor: DesignSystemAsset.GrayColor.gray600.color, + .kern: -0.5 + ] + ) + titleStringLabel.attributedText = attributedString + titleStringLabel.numberOfLines = 3 + + logoImageView.kf.setImage( + with: URL(string: model.image), + placeholder: nil, + options: [.transition(.fade(0.2))] + ) + } +} diff --git a/Projects/Features/BaseFeature/Sources/Views/RecommendPlayListView.swift b/Projects/Features/BaseFeature/Sources/Views/RecommendPlayListView.swift new file mode 100644 index 000000000..ce06dac83 --- /dev/null +++ b/Projects/Features/BaseFeature/Sources/Views/RecommendPlayListView.swift @@ -0,0 +1,138 @@ +// +// RecommendPlayListView.swift +// HomeFeature +// +// Created by KTH on 2023/01/07. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import DesignSystem +import PlaylistDomainInterface +import UIKit +import Utility + +public protocol RecommendPlayListViewDelegate: AnyObject { + func itemSelected(model: RecommendPlaylistEntity) +} + +public class RecommendPlayListView: UIView { + @IBOutlet weak var titleStringLabel: UILabel! + @IBOutlet weak var collectionView: UICollectionView! + + public weak var delegate: RecommendPlayListViewDelegate? + + override public init(frame: CGRect) { + super.init(frame: frame) + self.setupView() + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + self.setupView() + } + + public var dataSource: [RecommendPlaylistEntity] = [] { + didSet { + collectionView.reloadData() + } + } +} + +public extension RecommendPlayListView { + private func setupView() { + guard let view = Bundle.module.loadNibNamed("RecommendPlayListView", owner: self, options: nil)? + .first as? UIView else { return } + view.frame = self.bounds + view.layoutIfNeeded() + self.addSubview(view) + + // xib로 만든 UI를 컬렉션 뷰에서 사용하기 위해서는 등록이 필요 + collectionView.register( + UINib(nibName: "RecommendPlayListCell", bundle: BaseFeatureResources.bundle), + forCellWithReuseIdentifier: "RecommendPlayListCell" + ) + collectionView.dataSource = self + collectionView.delegate = self + + let attributedString = NSMutableAttributedString( + string: "왁뮤팀이 추천하는 리스트", + attributes: [ + .font: DesignSystemFontFamily.Pretendard.bold.font(size: 16), + .foregroundColor: DesignSystemAsset.GrayColor.gray900.color, + .kern: -0.5 + ] + ) + titleStringLabel.attributedText = attributedString + } + + static func getViewHeight(model: [RecommendPlaylistEntity]) -> CGFloat { + guard !model.isEmpty else { + return 0 + } + + let base: CGFloat = 32 + 24 + 20 + 32 + let spacing: CGFloat = 8.0 + + let itemWidth: CGFloat = (APP_WIDTH() - (20 + 8 + 20)) / 2.0 + let itemHeight: CGFloat = (80.0 * itemWidth) / 164.0 + + let mok: Int = model.count / 2 + let remain: Int = model.count % 2 + + if model.count == 1 { + return base + itemHeight + + } else { + if remain == 0 { + return base + (CGFloat(mok) * itemHeight) + (CGFloat(mok - 1) * spacing) + } else { + return base + (CGFloat(mok) * itemHeight) + (CGFloat(remain) * itemHeight) + + (CGFloat(mok - 1) * spacing) + (CGFloat(remain) * spacing) + } + } + } +} + +extension RecommendPlayListView: UICollectionViewDataSource, UICollectionViewDelegate, + UICollectionViewDelegateFlowLayout { + public func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + self.delegate?.itemSelected(model: self.dataSource[indexPath.row]) + } + + public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return self.dataSource.count + } + + public func collectionView( + _ collectionView: UICollectionView, + layout collectionViewLayout: UICollectionViewLayout, + sizeForItemAt indexPath: IndexPath + ) -> CGSize { + let itemWidth: CGFloat = (APP_WIDTH() - (20 + 8 + 20)) / 2.0 + let itemHeight: CGFloat = (80.0 * itemWidth) / 164.0 + return CGSize(width: itemWidth, height: itemHeight) + } + + public func collectionView( + _ collectionView: UICollectionView, + cellForItemAt indexPath: IndexPath + ) -> UICollectionViewCell { + guard let cell = collectionView.dequeueReusableCell( + withReuseIdentifier: "RecommendPlayListCell", + for: indexPath + ) as? RecommendPlayListCell else { + return UICollectionViewCell() + } + let model = self.dataSource[indexPath.row] + cell.update(model: model) + return cell + } + + public func collectionView( + _ collectionView: UICollectionView, + layout collectionViewLayout: UICollectionViewLayout, + minimumInteritemSpacingForSectionAt section: Int + ) -> CGFloat { + return 8 + } +} diff --git a/Projects/Features/BaseFeature/Sources/Views/SongCartView.swift b/Projects/Features/BaseFeature/Sources/Views/SongCartView.swift new file mode 100644 index 000000000..57426af90 --- /dev/null +++ b/Projects/Features/BaseFeature/Sources/Views/SongCartView.swift @@ -0,0 +1,228 @@ +// +// EditBottomSheetView.swift +// DesignSystem +// +// Created by KTH on 2023/01/25. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import DesignSystem +import UIKit +import Utility + +public protocol SongCartViewDelegate: AnyObject { + func buttonTapped(type: SongCartSelectType) +} + +public enum SongCartSelectType { + case allSelect(flag: Bool) // 전체선택 + case addSong // 노래담기 + case addPlayList // 재생목록추가 + case play // 재생 + case remove // 삭제 +} + +public class SongCartView: UIView { + @IBOutlet weak var allSelectView: UIView! + @IBOutlet weak var allSelectImageView: UIImageView! + @IBOutlet weak var allSelectLabel: UILabel! + @IBOutlet weak var allSelectButton: UIButton! + @IBOutlet weak var songAddButton: UIButton! + @IBOutlet weak var playListAddButton: UIButton! + @IBOutlet weak var removeButton: UIButton! + @IBOutlet weak var playButton: UIButton! + @IBOutlet weak var selectCountView: UIView! + @IBOutlet weak var selectCountViewLeadingConstraint: NSLayoutConstraint! + @IBOutlet weak var selectCountLabel: UILabel! + @IBOutlet weak var stackContentView: UIView! + @IBOutlet weak var bottomSpaceView: UIView! + @IBOutlet weak var bottomSpaceViewHeight: NSLayoutConstraint! + + public weak var delegate: SongCartViewDelegate? + public var type: SongCartType = .playlist + + override public init(frame: CGRect) { + super.init(frame: frame) + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + self.setupView() + } + + convenience init(type: SongCartType) { + self.init() + self.type = type + self.setupView() + } + + deinit { + DEBUG_LOG("\(Self.self) Deinit") + } + + @IBAction func buttonAction(_ sender: Any) { + guard let button = sender as? UIButton else { return } + + if button == allSelectButton { // 전체선택 + allSelectButton.isSelected = !allSelectButton.isSelected + allSelectImageView.image = allSelectButton.isSelected ? DesignSystemAsset.PlayListEdit.checkOn + .image : DesignSystemAsset.PlayListEdit.checkOff.image + allSelectLabel.text = allSelectButton.isSelected ? "전체선택해제" : "전체선택" + delegate?.buttonTapped(type: .allSelect(flag: allSelectButton.isSelected)) + + } else if button == songAddButton { // 노래담기 + delegate?.buttonTapped(type: .addSong) + + } else if button == playListAddButton { // 재생목록추가 + delegate?.buttonTapped(type: .addPlayList) + + } else if button == playButton { // 재생 + delegate?.buttonTapped(type: .play) + + } else if button == removeButton { // 삭제 + delegate?.buttonTapped(type: .remove) + } + } +} + +public extension SongCartView { + private func setupView() { + guard let view = Bundle.module.loadNibNamed("SongCartView", owner: self, options: nil)?.first as? UIView + else { return } + view.frame = self.bounds + view.layoutIfNeeded() + addSubview(view) + configureType() + configureUI() + } + + private func configureType() { + switch self.type { + case .playlist: + allSelectView.isHidden = false + songAddButton.isHidden = false + playListAddButton.isHidden = true + playButton.isHidden = true + removeButton.isHidden = false + + case .chartSong, .artistSong, .WMPlaylist, .creditSong: + allSelectView.isHidden = false + songAddButton.isHidden = false + playListAddButton.isHidden = false + playButton.isHidden = false + removeButton.isHidden = true + + case .myPlaylist: + allSelectView.isHidden = false + songAddButton.isHidden = false + playListAddButton.isHidden = false + playButton.isHidden = true + removeButton.isHidden = false + + case .likeSong: + allSelectView.isHidden = false + songAddButton.isHidden = false + playListAddButton.isHidden = false + playButton.isHidden = true + removeButton.isHidden = false + + case .playlistStorage: + allSelectView.isHidden = false + songAddButton.isHidden = true + playListAddButton.isHidden = false + playButton.isHidden = true + removeButton.isHidden = false + + case .searchSong: + allSelectView.isHidden = true + songAddButton.isHidden = false + playListAddButton.isHidden = false + playButton.isHidden = false + removeButton.isHidden = true + } + } + + private func configureUI() { + selectCountView.backgroundColor = .white + selectCountView.layer.cornerRadius = selectCountView.frame.width / 2 + selectCountView.clipsToBounds = true + + selectCountLabel.font = DesignSystemFontFamily.Pretendard.bold.font(size: 18) + selectCountLabel.text = "1" + selectCountLabel.textColor = DesignSystemAsset.PrimaryColor.point.color + + let titles: [String] = ["전체선택", "노래담기", "재생목록추가", "재생", "삭제"] + + let images: [UIImage] = [ + DesignSystemAsset.PlayListEdit.checkOff.image, + DesignSystemAsset.PlayListEdit.musicAdd.image, + DesignSystemAsset.PlayListEdit.playlistAdd.image, + DesignSystemAsset.PlayListEdit.playlistPlay.image, + DesignSystemAsset.PlayListEdit.delete.image + ] + + let buttons: [UIButton] = [ + allSelectButton, + songAddButton, + playListAddButton, + playButton, + removeButton + ] + + guard titles.count == images.count, + titles.count == buttons.count else { return } + + for i in 0 ..< titles.count { + if buttons[i] == allSelectButton { + allSelectImageView.image = DesignSystemAsset.PlayListEdit.checkOff.image + let attributedString = NSMutableAttributedString.init(string: "전체선택") + attributedString.addAttributes( + [ + .font: DesignSystemFontFamily.Pretendard.medium.font(size: 12), + .foregroundColor: DesignSystemAsset.BlueGrayColor.gray25.color, + .kern: -0.5 + ], + range: NSRange(location: 0, length: attributedString.string.count) + ) + allSelectLabel.attributedText = attributedString + + } else { + buttons[i].setImage(images[i], for: .normal) + let attributedString = NSMutableAttributedString.init(string: titles[i]) + attributedString.addAttributes( + [ + .font: DesignSystemFontFamily.Pretendard.medium.font(size: 12), + .foregroundColor: DesignSystemAsset.BlueGrayColor.gray25.color, + .kern: -0.5 + ], + range: NSRange(location: 0, length: attributedString.string.count) + ) + buttons[i].setAttributedTitle(attributedString, for: .normal) + buttons[i].alignTextBelow(spacing: -2) + } + } + + stackContentView.backgroundColor = DesignSystemAsset.PrimaryColor.point.color + bottomSpaceView.backgroundColor = DesignSystemAsset.PrimaryColor.point.color + bottomSpaceViewHeight.constant = SAFEAREA_BOTTOM_HEIGHT() + layoutIfNeeded() + } + + func updateCount(value: Int) { + self.selectCountView.isHidden = (value == 0) + self.selectCountLabel.text = (value == 0) ? "" : "\(value)" + self.selectCountViewLeadingConstraint.constant = value >= 1000 ? 8 : 20 + self.layoutIfNeeded() + } + + func updateAllSelect(isAll: Bool) { + self.allSelectButton.isSelected = isAll + self.allSelectImageView.image = self.allSelectButton.isSelected ? DesignSystemAsset.PlayListEdit.checkOn + .image : DesignSystemAsset.PlayListEdit.checkOff.image + self.allSelectLabel.text = self.allSelectButton.isSelected ? "전체선택해제" : "전체선택" + } + + func updateBottomSpace(isUse: Bool) { + self.bottomSpaceView.isHidden = isUse ? false : true + } +} diff --git a/Projects/Features/BaseFeature/Sources/Views/WMBottomSheetView.swift b/Projects/Features/BaseFeature/Sources/Views/WMBottomSheetView.swift new file mode 100644 index 000000000..c7e90835c --- /dev/null +++ b/Projects/Features/BaseFeature/Sources/Views/WMBottomSheetView.swift @@ -0,0 +1,82 @@ +import DesignSystem +import LogManager +import SnapKit +import Then +import UIKit + +public final class WMBottomSheetView: UIView { + private let stackView = UIStackView().then { + $0.axis = .horizontal + $0.distribution = .fillEqually + } + + deinit { + LogManager.printDebug("❌:: \(Self.self) deinit") + } + + public init(items: [UIButton]) { + super.init(frame: .zero) + addViews() + setLayout() + configureUI() + setupItems(items: items) + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + public func setupItems(items: [UIButton]) { + items.forEach { + self.stackView.addArrangedSubview($0) + } + } +} + +private extension WMBottomSheetView { + func configureUI() { + backgroundColor = DesignSystemAsset.PrimaryColorV2.point.color + } + + func addViews() { + addSubview(stackView) + } + + func setLayout() { + let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene + let screenWidth = windowScene?.screen.bounds.size.width ?? .zero + + stackView.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview().inset(40 * screenWidth / 375) + $0.verticalEdges.equalToSuperview() + $0.height.equalTo(56) + } + } +} + +public extension UIViewController { + func showInlineBottomSheet( + content: UIView, + size: CGFloat = 56, + useSafeArea: Bool = false + ) { + let bottomSheetView = BottomSheetView( + contentView: content, + contentHeights: [size], + useSafeAreaInsets: useSafeArea + ) + + bottomSheetView.present(in: self.view) + NotificationCenter.default.post(name: .shouldHidePlaylistFloatingButton, object: nil) + } + + func hideInlineBottomSheet() { + guard let bottomSheetView = view.subviews + .filter({ $0 is BottomSheetView }) + .last as? BottomSheetView else { return } + + bottomSheetView.dismiss() + NotificationCenter.default.post(name: .shouldShowPlaylistFloatingButton, object: nil) + } +} diff --git a/Projects/Features/BaseFeature/Sources/Views/WarningView.swift b/Projects/Features/BaseFeature/Sources/Views/WarningView.swift new file mode 100644 index 000000000..eb6430598 --- /dev/null +++ b/Projects/Features/BaseFeature/Sources/Views/WarningView.swift @@ -0,0 +1,44 @@ +import DesignSystem +import UIKit + +public class WarningView: UIView { + @IBOutlet weak var superView: UIView! + @IBOutlet weak var warningLabelView: UILabel! + @IBOutlet weak var warningImageView: UIImageView! + + public var text: String = "" { + didSet { + warningLabelView.text = text + } + } + + override public init(frame: CGRect) { + super.init(frame: frame) + self.setupView() + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + self.setupView() + } + + private func setupView() { + guard let view = Bundle.module.loadNibNamed("Warning", owner: self, options: nil)?.first as? UIView + else { return } + view.frame = self.bounds + view.layoutIfNeeded() + view.backgroundColor = .clear + self.superView.backgroundColor = .clear + self.addSubview(view) + configureUI() + } +} + +private extension WarningView { + func configureUI() { + warningImageView.image = DesignSystemAsset.Search.warning.image + warningLabelView.textColor = DesignSystemAsset.BlueGrayColor.gray900.color + warningLabelView.font = UIFont.WMFontSystem.t6(weight: .light).font + warningLabelView.setTextWithAttributes(kernValue: -0.5) + } +} diff --git a/Projects/Features/BaseFeature/Testing/PrivacyComponentStub.swift b/Projects/Features/BaseFeature/Testing/PrivacyComponentStub.swift new file mode 100644 index 000000000..f7a3ac181 --- /dev/null +++ b/Projects/Features/BaseFeature/Testing/PrivacyComponentStub.swift @@ -0,0 +1,9 @@ +@testable import BaseFeature +import BaseFeatureInterface +import UIKit + +public final class PrivacyComponentStub: PrivacyFactory { + public func makeView() -> UIViewController { + return ContractViewController.viewController(type: .privacy) + } +} diff --git a/Projects/Features/BaseFeature/Testing/ServiceTermsComponentStub.swift b/Projects/Features/BaseFeature/Testing/ServiceTermsComponentStub.swift new file mode 100644 index 000000000..029651015 --- /dev/null +++ b/Projects/Features/BaseFeature/Testing/ServiceTermsComponentStub.swift @@ -0,0 +1,9 @@ +@testable import BaseFeature +import BaseFeatureInterface +import UIKit + +public final class ServiceTermComponentStub: ServiceTermFactory { + public func makeView() -> UIViewController { + return ContractViewController.viewController(type: .service) + } +} diff --git a/Projects/Features/BaseFeature/Testing/TextPopUpComponentStub.swift b/Projects/Features/BaseFeature/Testing/TextPopUpComponentStub.swift new file mode 100644 index 000000000..5c4324243 --- /dev/null +++ b/Projects/Features/BaseFeature/Testing/TextPopUpComponentStub.swift @@ -0,0 +1,23 @@ +@testable import BaseFeature +import BaseFeatureInterface +import UIKit + +public final class TextPopupComponentStub: TextPopupFactory { + public func makeView( + text: String?, + cancelButtonIsHidden: Bool, + confirmButtonText: String?, + cancelButtonText: String?, + completion: (() -> Void)?, + cancelCompletion: (() -> Void)? + ) -> UIViewController { + return TextPopupViewController.viewController( + text: text ?? "", + cancelButtonIsHidden: cancelButtonIsHidden, + confirmButtonText: confirmButtonText ?? "확인", + cancelButtonText: cancelButtonText ?? "취소", + completion: completion, + cancelCompletion: cancelCompletion + ) + } +} diff --git a/Projects/Features/BaseFeature/Tests/TargetTest.swift b/Projects/Features/BaseFeature/Tests/TargetTest.swift index b1cf79405..147c29d2f 100644 --- a/Projects/Features/BaseFeature/Tests/TargetTest.swift +++ b/Projects/Features/BaseFeature/Tests/TargetTest.swift @@ -1,7 +1,6 @@ import XCTest class TargetTests: XCTestCase { - override func setUpWithError() throws { // Put setup code here. This method is called before the invocation of each test method in the class. } @@ -13,5 +12,4 @@ class TargetTests: XCTestCase { func testExample() throws { XCTAssertEqual("A", "A") } - } diff --git a/Projects/Features/ChartFeature/.swiftlint.yml b/Projects/Features/ChartFeature/.swiftlint.yml deleted file mode 100644 index d4929c937..000000000 --- a/Projects/Features/ChartFeature/.swiftlint.yml +++ /dev/null @@ -1,21 +0,0 @@ -excluded: - - "**/*/NeedleGenerated.swift" - - "Tuist" - - -force_cast: # From https://realm.github.io/SwiftLint/force_cast.html - warning # 강제 캐스팅은 error에서 warning으로 변경 - -disabled_rules: - - trailing_whitespace - - vertical_whitespace - - colon - - comma - - comment_spacing # 주석 여백 - - mark # //MARK 관련 warning - - opening_brace # 괄호 열 때 줄바꿈을 했는지 안했는지, (안했으면 warning) - - line_length # 한줄에 글자 수 제한 , warning: 120, error: 200 (default) - - statement_position # if는 반드시 else로 끝나야한다. - - identifier_name #변수명 글자 수 제한 - - function_body_length - diff --git a/Projects/Features/ChartFeature/Interface/ChartFactory.swift b/Projects/Features/ChartFeature/Interface/ChartFactory.swift new file mode 100644 index 000000000..22aa0b352 --- /dev/null +++ b/Projects/Features/ChartFeature/Interface/ChartFactory.swift @@ -0,0 +1,5 @@ +import UIKit + +public protocol ChartFactory { + func makeView() -> UIViewController +} diff --git a/Projects/Features/ChartFeature/Project.swift b/Projects/Features/ChartFeature/Project.swift index 3846312a5..77667204f 100644 --- a/Projects/Features/ChartFeature/Project.swift +++ b/Projects/Features/ChartFeature/Project.swift @@ -1,11 +1,25 @@ +import DependencyPlugin import ProjectDescription import ProjectDescriptionHelpers -let project = Project.makeModule( - name: "ChartFeature", - product: .staticFramework, - dependencies: [ - .Project.Features.PlayerFeature +let project = Project.module( + name: ModulePaths.Feature.ChartFeature.rawValue, + targets: [ + .interface( + module: .feature(.ChartFeature) + ), + .implements( + module: .feature(.ChartFeature), + product: .staticFramework, + spec: .init( + resources: ["Resources/**"], + dependencies: [ + .feature(target: .BaseFeature), + .feature(target: .ChartFeature, type: .interface), + .feature(target: .SignInFeature, type: .interface), + .domain(target: .ChartDomain, type: .interface) + ] + ) + ) ] - , resources: ["Resources/**"] ) diff --git a/Projects/Features/ChartFeature/Resources/Chart.storyboard b/Projects/Features/ChartFeature/Resources/Chart.storyboard index bdea89b8a..0b3c3dccf 100644 --- a/Projects/Features/ChartFeature/Resources/Chart.storyboard +++ b/Projects/Features/ChartFeature/Resources/Chart.storyboard @@ -1,26 +1,75 @@ - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + @@ -34,14 +83,8 @@ - - - - - - - + @@ -55,10 +98,7 @@ - - - - + @@ -73,7 +113,7 @@ - + diff --git a/Projects/Features/ChartFeature/Sources/Analytics/ChartAnalyticsLog.swift b/Projects/Features/ChartFeature/Sources/Analytics/ChartAnalyticsLog.swift new file mode 100644 index 000000000..86fb0bb66 --- /dev/null +++ b/Projects/Features/ChartFeature/Sources/Analytics/ChartAnalyticsLog.swift @@ -0,0 +1,13 @@ +import LogManager + +enum ChartAnalyticsLog: AnalyticsLogType { + enum ChartType: String, CaseIterable, AnalyticsLogEnumParametable { + case hourly + case daily + case weekly + case monthly + case total + } + + case selectChartType(type: ChartType) +} diff --git a/Projects/Features/ChartFeature/Sources/Components/ChartComponent.swift b/Projects/Features/ChartFeature/Sources/Components/ChartComponent.swift index b3a4c0f5e..7fb991b4d 100644 --- a/Projects/Features/ChartFeature/Sources/Components/ChartComponent.swift +++ b/Projects/Features/ChartFeature/Sources/Components/ChartComponent.swift @@ -1,16 +1,15 @@ +import BaseFeature +import ChartFeatureInterface import Foundation -import CommonFeature import NeedleFoundation -import DomainModule - +import UIKit public protocol ChartDependency: Dependency { var chartContentComponent: ChartContentComponent { get } - } -public final class ChartComponent: Component { - public func makeView() -> ChartViewController { +public final class ChartComponent: Component, ChartFactory { + public func makeView() -> UIViewController { return ChartViewController.viewController(chartContentComponent: dependency.chartContentComponent) } } diff --git a/Projects/Features/ChartFeature/Sources/Components/ChartContentComponent.swift b/Projects/Features/ChartFeature/Sources/Components/ChartContentComponent.swift index 1005b5d37..7e6291d00 100644 --- a/Projects/Features/ChartFeature/Sources/Components/ChartContentComponent.swift +++ b/Projects/Features/ChartFeature/Sources/Components/ChartContentComponent.swift @@ -1,25 +1,29 @@ +import BaseFeature +import BaseFeatureInterface +import ChartDomainInterface import Foundation -import CommonFeature import NeedleFoundation -import DomainModule -import DataMappingModule +import SignInFeatureInterface public protocol ChartContentDependency: Dependency { var fetchChartRankingUseCase: any FetchChartRankingUseCase { get } - var fetchChartUpdateTimeUseCase: any FetchChartUpdateTimeUseCase { get } - var containSongsComponent: ContainSongsComponent {get} + var containSongsFactory: any ContainSongsFactory { get } + var textPopupFactory: any TextPopupFactory { get } + var signInFactory: any SignInFactory { get } + var songDetailPresenter: any SongDetailPresentable { get } } public final class ChartContentComponent: Component { public func makeView(type: ChartDateType) -> ChartContentViewController { return ChartContentViewController.viewController( - viewModel: .init( type: type, - fetchChartRankingUseCase: dependency.fetchChartRankingUseCase, - fetchChartUpdateTimeUseCase: dependency.fetchChartUpdateTimeUseCase - ) - ,containSongsComponent: dependency.containSongsComponent + fetchChartRankingUseCase: dependency.fetchChartRankingUseCase + ), + containSongsFactory: dependency.containSongsFactory, + textPopupFactory: dependency.textPopupFactory, + signInFactory: dependency.signInFactory, + songDetailPresenter: dependency.songDetailPresenter ) } } diff --git a/Projects/Features/ChartFeature/Sources/ViewContrillers/ChartContentViewController.swift b/Projects/Features/ChartFeature/Sources/ViewContrillers/ChartContentViewController.swift index 65630be18..a4621acd7 100644 --- a/Projects/Features/ChartFeature/Sources/ViewContrillers/ChartContentViewController.swift +++ b/Projects/Features/ChartFeature/Sources/ViewContrillers/ChartContentViewController.swift @@ -1,64 +1,72 @@ -import UIKit -import Utility +import BaseFeature +import BaseFeatureInterface import DesignSystem -import RxSwift +import Localization +import LogManager +import NVActivityIndicatorView import RxCocoa -import BaseFeature -import CommonFeature -import DataMappingModule -import DomainModule +import RxSwift +import SignInFeatureInterface import SnapKit import Then -import NVActivityIndicatorView - -public class ChartContentViewController: BaseViewController, ViewControllerFromStoryBoard,SongCartViewType { - private let disposeBag = DisposeBag() - private var viewModel: ChartContentViewModel! - - fileprivate lazy var input = ChartContentViewModel.Input() - fileprivate lazy var output = viewModel.transform(from: input) +import UIKit +import Utility +public final class ChartContentViewController: BaseViewController, ViewControllerFromStoryBoard, SongCartViewType { @IBOutlet weak var tableView: UITableView! @IBOutlet weak var activityIncidator: NVActivityIndicatorView! public var songCartView: SongCartView! public var bottomSheetView: BottomSheetView! - private var refreshControl = UIRefreshControl() + private let refreshControl = UIRefreshControl() + + private var viewModel: ChartContentViewModel! + private lazy var input = ChartContentViewModel.Input() + private lazy var output = viewModel.transform(from: input) + private let disposeBag = DisposeBag() + + private var containSongsFactory: ContainSongsFactory! + private var textPopupFactory: TextPopupFactory! + private var signInFactory: SignInFactory! + private var songDetailPresenter: SongDetailPresentable! - let playState = PlayState.shared - - private var containSongsComponent: ContainSongsComponent! + deinit { LogManager.printDebug("❌ \(Self.self) Deinit") } - public override func viewDidLoad() { + override public func viewDidLoad() { super.viewDidLoad() configureUI() - bind() + inputBind() outputBind() } - - public override func viewWillDisappear(_ animated: Bool) { + + override public func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) - self.input.allSongSelected.onNext(false) + input.allSongSelected.onNext(false) } public static func viewController( viewModel: ChartContentViewModel, - containSongsComponent:ContainSongsComponent + containSongsFactory: ContainSongsFactory, + textPopupFactory: TextPopupFactory, + signInFactory: SignInFactory, + songDetailPresenter: SongDetailPresentable ) -> ChartContentViewController { let viewController = ChartContentViewController.viewController(storyBoardName: "Chart", bundle: Bundle.module) viewController.viewModel = viewModel - viewController.containSongsComponent = containSongsComponent + viewController.containSongsFactory = containSongsFactory + viewController.textPopupFactory = textPopupFactory + viewController.signInFactory = signInFactory + viewController.songDetailPresenter = songDetailPresenter return viewController } } -extension ChartContentViewController { - private func bind() { - tableView.register(ChartContentTableViewCell.self, forCellReuseIdentifier: "chartContentTableViewCell") +private extension ChartContentViewController { + func inputBind() { + tableView.register(ChartContentTableViewCell.self, forCellReuseIdentifier: "\(ChartContentTableViewCell.self)") tableView.rx.setDelegate(self).disposed(by: disposeBag) - + tableView.rx.itemSelected - .map{ $0.row } .bind(to: input.songTapped) .disposed(by: disposeBag) @@ -67,39 +75,51 @@ extension ChartContentViewController { .bind(to: input.refreshPulled) .disposed(by: disposeBag) } - - private func outputBind() { + + func outputBind() { output.dataSource .skip(1) - .do(onNext: { [weak self] (model) in - guard let `self` = self else { return } + .do(onNext: { [weak self] model in + guard let self = self else { return } self.activityIncidator.stopAnimating() self.refreshControl.endRefreshing() let space: CGFloat = APP_HEIGHT() - 40 - 102 - 56 - 56 - STATUS_BAR_HEGHIT() - SAFEAREA_BOTTOM_HEIGHT() let height: CGFloat = space / 3 * 2 - let warningView: WarningView = WarningView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: height)) + let warningView: WarningView = WarningView(frame: CGRect( + x: 0, + y: 0, + width: APP_WIDTH(), + height: height + )) warningView.text = "차트 데이터가 없습니다." - self.tableView.tableFooterView = model.isEmpty ? warningView : UIView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: PLAYER_HEIGHT())) + self.tableView.tableFooterView = model.isEmpty ? warningView : UIView(frame: CGRect( + x: 0, + y: 0, + width: APP_WIDTH(), + height: PLAYER_HEIGHT() + )) }) - .bind(to: tableView.rx.items) { [weak self] (tableView, index, model) -> UITableViewCell in - guard let self else { return UITableViewCell() } - let indexPath: IndexPath = IndexPath(row: index, section: 0) - guard let cell = tableView.dequeueReusableCell( - withIdentifier: "chartContentTableViewCell", - for: indexPath - ) as? ChartContentTableViewCell else { - return UITableViewCell() } + .bind(to: tableView.rx.items) { [weak self] tableView, index, model -> UITableViewCell in + guard let self, + let cell = tableView.dequeueReusableCell( + withIdentifier: "\(ChartContentTableViewCell.self)", + for: IndexPath(row: index, section: 0) + ) as? ChartContentTableViewCell else { + return UITableViewCell() + } + cell.delegate = self cell.update(model: model, index: index, type: self.viewModel.type) return cell - }.disposed(by: disposeBag) + } + .disposed(by: disposeBag) output.indexOfSelectedSongs .skip(1) .withLatestFrom(output.dataSource) { ($0, $1) } - .subscribe(onNext: { [weak self] (songs, dataSource) in + .subscribe(onNext: { [weak self] songs, dataSource in guard let self = self else { return } switch songs.isEmpty { - case true : + case true: self.hideSongCart() case false: self.showSongCart( @@ -111,29 +131,82 @@ extension ChartContentViewController { ) self.songCartView?.delegate = self } - }).disposed(by: disposeBag) - + }) + .disposed(by: disposeBag) + output.songEntityOfSelectedSongs - .filter{ !$0.isEmpty } + .filter { !$0.isEmpty } .subscribe() .disposed(by: disposeBag) - + output.groupPlaySongs - .subscribe(onNext: { [weak self] songs in - guard let self = self else {return} - self.playState.loadAndAppendSongsToPlaylist(songs) + .bind(with: self, onNext: { owner, source in + guard !source.songs.isEmpty else { + owner.output.showToast.onNext("차트 데이터가 없습니다.") + return + } + PlayState.shared.loadAndAppendSongsToPlaylist(source.songs) + if source.songs.allSatisfy({ $0.title.isContainShortsTagTitle }) { + WakmusicYoutubePlayer( + ids: source.songs.map { $0.id }, + title: source.playlistTitle, + playPlatform: .youtube + ).play() + } else { + WakmusicYoutubePlayer(ids: source.songs.map { $0.id }, title: source.playlistTitle).play() + } }) .disposed(by: disposeBag) + + output.showToast + .bind(with: self) { owner, message in + owner.showToast( + text: message, + options: [.tabBar, .songCart] + ) + } + .disposed(by: disposeBag) + + output.showLogin + .bind(with: self) { owner, _ in + let viewController = owner.textPopupFactory.makeView( + text: "로그인이 필요한 서비스입니다.\n로그인 하시겠습니까?", + cancelButtonIsHidden: false, + confirmButtonText: nil, + cancelButtonText: nil, + completion: { + let log = CommonAnalyticsLog.clickLoginButton(entry: .addMusics) + LogManager.analytics(log) + + let loginVC = owner.signInFactory.makeView() + loginVC.modalPresentationStyle = .overFullScreen + owner.present(loginVC, animated: true) + }, + cancelCompletion: {} + ) + owner.showBottomSheet(content: viewController) + } + .disposed(by: disposeBag) + } + + func configureUI() { + view.backgroundColor = DesignSystemAsset.BlueGrayColor.gray100.color + activityIncidator.type = .circleStrokeSpin + activityIncidator.color = DesignSystemAsset.PrimaryColor.point.color + activityIncidator.startAnimating() + tableView.refreshControl = refreshControl } - - private func configureUI() { - view.backgroundColor = DesignSystemAsset.GrayColor.gray100.color - self.activityIncidator.type = .circleStrokeSpin - self.activityIncidator.color = DesignSystemAsset.PrimaryColor.point.color - self.activityIncidator.startAnimating() - self.tableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: PLAYER_HEIGHT())) - self.tableView.scrollIndicatorInsets = UIEdgeInsets(top: 0, left: 0, bottom: PLAYER_HEIGHT(), right: 0) - self.tableView.refreshControl = refreshControl +} + +extension ChartContentViewController: ChartContentTableViewCellDelegate { + func tappedThumbnail(id: String) { + guard let tappedSong = output.dataSource.value + .first(where: { $0.id == id }) + else { return } + PlayState.shared.append(item: .init(id: tappedSong.id, title: tappedSong.title, artist: tappedSong.artist)) + let playlistIDs = PlayState.shared.currentPlaylist + .map(\.id) + songDetailPresenter.present(ids: playlistIDs, selectedID: tappedSong.id) } } @@ -154,43 +227,104 @@ extension ChartContentViewController: UITableViewDelegate { } } -extension ChartContentViewController: PlayButtonForChartViewDelegate{ +extension ChartContentViewController: PlayButtonForChartViewDelegate { public func pressPlay(_ event: PlayEvent) { - input.groupPlayTapped.onNext(event) + guard !output.dataSource.value.isEmpty else { + output.showToast.onNext("차트 데이터가 없습니다.") + return + } + + if event == .allPlay { + LogManager.analytics( + CommonAnalyticsLog.clickPlayButton(location: .chart, type: .all) + ) + let viewController = ChartPlayPopupViewController() + viewController.delegate = self + showBottomSheet(content: viewController, size: .fixed(192 + SAFEAREA_BOTTOM_HEIGHT())) + + } else { + LogManager.analytics( + CommonAnalyticsLog.clickPlayButton(location: .chart, type: .random) + ) + input.shufflePlayTapped.onNext(()) + } + } +} + +extension ChartContentViewController: ChartPlayPopupViewControllerDelegate { + public func playTapped(type: HalfPlayType) { + switch type { + case .front: // 1-50 + LogManager.analytics( + CommonAnalyticsLog.clickPlayButton(location: .chart, type: .range1to50) + ) + case .back: // 50-100 + LogManager.analytics( + CommonAnalyticsLog.clickPlayButton(location: .chart, type: .range50to100) + ) + } + input.halfPlayTapped.onNext(type) } } extension ChartContentViewController: SongCartViewDelegate { public func buttonTapped(type: SongCartSelectType) { + let limit: Int = 50 + let songs = output.songEntityOfSelectedSongs.value + switch type { case let .allSelect(flag): input.allSongSelected.onNext(flag) - + case .addSong: - let songs: [String] = output.songEntityOfSelectedSongs.value.map { $0.id } - let viewController = containSongsComponent.makeView(songs: songs) + let log = CommonAnalyticsLog.clickAddMusicsButton(location: .chart) + LogManager.analytics(log) + if PreferenceManager.userInfo == nil { + output.showLogin.onNext(()) + return + } + + guard songs.count <= limit else { + output.showToast.onNext(LocalizationStrings.overFlowContainWarning(songs.count - limit)) + return + } + + let songIds: [String] = songs.map { $0.id } + let viewController = containSongsFactory.makeView(songs: songIds) viewController.modalPresentationStyle = .overFullScreen - self.present(viewController, animated: true) { + present(viewController, animated: true) { self.input.allSongSelected.onNext(false) } + case .addPlayList: - let songs = output.songEntityOfSelectedSongs.value - playState.appendSongsToPlaylist(songs) - self.input.allSongSelected.onNext(false) - + PlayState.shared.appendSongsToPlaylist(songs) + output.showToast.onNext(LocalizationStrings.addList) + input.allSongSelected.onNext(false) + case .play: - let songs = output.songEntityOfSelectedSongs.value - playState.loadAndAppendSongsToPlaylist(songs) - self.input.allSongSelected.onNext(false) - + guard songs.count <= limit else { + output.showToast.onNext(LocalizationStrings.overFlowPlayWarning(songs.count - limit)) + return + } + PlayState.shared.loadAndAppendSongsToPlaylist(songs) + input.allSongSelected.onNext(false) + LogManager.analytics( + CommonAnalyticsLog.clickPlayButton(location: .chart, type: .multiple) + ) + if songs.allSatisfy({ $0.title.isContainShortsTagTitle }) { + WakmusicYoutubePlayer(ids: songs.map { $0.id }, title: "왁타버스 뮤직", playPlatform: .youtube).play() + } else { + WakmusicYoutubePlayer(ids: songs.map { $0.id }, title: "왁타버스 뮤직").play() + } + case .remove: return } } } -extension ChartContentViewController { - public func scrollToTop() { +public extension ChartContentViewController { + func scrollToTop() { guard !output.dataSource.value.isEmpty else { return } tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: true) } diff --git a/Projects/Features/ChartFeature/Sources/ViewContrillers/ChartPlayPopupViewController.swift b/Projects/Features/ChartFeature/Sources/ViewContrillers/ChartPlayPopupViewController.swift new file mode 100644 index 000000000..ddbf839bb --- /dev/null +++ b/Projects/Features/ChartFeature/Sources/ViewContrillers/ChartPlayPopupViewController.swift @@ -0,0 +1,125 @@ +import DesignSystem +import LogManager +import SnapKit +import Then +import UIKit + +public protocol ChartPlayPopupViewControllerDelegate: AnyObject { + func playTapped(type: HalfPlayType) +} + +public enum HalfPlayType { + case front + case back + + var playlistTitleString: String { + switch self { + case .front: + return "왁뮤차트 TOP100 1위 ~ 50위" + case .back: + return "왁뮤차트 TOP100 51위 ~ 100위" + } + } +} + +final class ChartPlayPopupViewController: UIViewController { + private let titleLabel = WMLabel( + text: "전체재생", + textColor: DesignSystemAsset.BlueGrayColor.blueGray900.color, + font: UIFont.WMFontSystem.t2(weight: .bold), + alignment: .center, + lineHeight: UIFont.WMFontSystem.t2(weight: .bold).lineHeight + ) + + private let stackView = UIStackView().then { + $0.axis = .horizontal + $0.spacing = 8 + $0.distribution = .fillEqually + } + + private let frontHalfPlayButton = HorizontalAlignButton( + imagePlacement: .trailing, + title: "1 ~ 50위", + image: DesignSystemAsset.Chart.halfPlay.image, + font: .setFont(.t5(weight: .medium)), + titleColor: DesignSystemAsset.BlueGrayColor.gray900.color, + spacing: 8 + ).then { + $0.backgroundColor = DesignSystemAsset.BlueGrayColor.blueGray50.color + $0.layer.cornerRadius = 12 + $0.clipsToBounds = true + } + + private let backHalfPlayButton = HorizontalAlignButton( + imagePlacement: .trailing, + title: "51 ~ 100위", + image: DesignSystemAsset.Chart.halfPlay.image, + font: .setFont(.t5(weight: .medium)), + titleColor: DesignSystemAsset.BlueGrayColor.gray900.color, + spacing: 8 + ).then { + $0.backgroundColor = DesignSystemAsset.BlueGrayColor.blueGray50.color + $0.layer.cornerRadius = 12 + $0.clipsToBounds = true + } + + public weak var delegate: ChartPlayPopupViewControllerDelegate? + + deinit { LogManager.printDebug("❌:: \(Self.self) deinit") } + + public init() { + super.init(nibName: nil, bundle: nil) + } + + @available(*, unavailable) + public required init?(coder: NSCoder) { + fatalError("\(Self.self) has not been implemented") + } + + override func viewDidLoad() { + super.viewDidLoad() + addSubViews() + setLayout() + configureUI() + addAction() + } +} + +private extension ChartPlayPopupViewController { + func addSubViews() { + view.addSubviews(titleLabel, stackView) + stackView.addArrangedSubviews(frontHalfPlayButton, backHalfPlayButton) + } + + func setLayout() { + titleLabel.snp.makeConstraints { + $0.top.equalTo(view.snp.top).offset(32) + $0.horizontalEdges.equalToSuperview().inset(20) + } + + stackView.snp.makeConstraints { + $0.top.equalTo(titleLabel.snp.bottom).offset(16) + $0.horizontalEdges.equalToSuperview().inset(20) + $0.bottom.equalTo(view.safeAreaLayoutGuide).offset(-40) + $0.height.equalTo(72) + } + } + + func configureUI() { + view.backgroundColor = .white + } + + func addAction() { + frontHalfPlayButton.addAction { [weak self] in + self?.dismiss(animated: true, completion: { + self?.delegate?.playTapped(type: .front) + }) + } + + backHalfPlayButton.addAction { [weak self] in + self?.dismiss(animated: true, completion: { + self?.delegate?.playTapped(type: .back) + }) + } + } +} diff --git a/Projects/Features/ChartFeature/Sources/ViewContrillers/ChartViewController.swift b/Projects/Features/ChartFeature/Sources/ViewContrillers/ChartViewController.swift index 82173cd6a..1c704d919 100644 --- a/Projects/Features/ChartFeature/Sources/ViewContrillers/ChartViewController.swift +++ b/Projects/Features/ChartFeature/Sources/ViewContrillers/ChartViewController.swift @@ -1,14 +1,17 @@ -import UIKit -import CommonFeature -import Utility +import BaseFeature import DesignSystem +import LogManager import Pageboy import Tabman -import DomainModule +import UIKit +import Utility public final class ChartViewController: TabmanViewController, ViewControllerFromStoryBoard { - private var chartContentComponent: ChartContentComponent? + @IBOutlet weak var backButton: UIButton! + @IBOutlet weak var naviTitleLabel: UILabel! + @IBOutlet weak var tabBarContentView: UIView! + private var chartContentComponent: ChartContentComponent? private lazy var viewControllers: [ChartContentViewController?] = { let viewControllers = [ chartContentComponent?.makeView(type: .hourly), @@ -20,54 +23,90 @@ public final class ChartViewController: TabmanViewController, ViewControllerFrom return viewControllers }() - private let tabBarContentView = UIView() + deinit { LogManager.printDebug("❌ \(Self.self) Deinit") } - public override func viewDidLoad() { + override public func viewDidLoad() { super.viewDidLoad() configureUI() } + override public func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + let log = CommonAnalyticsLog.viewPage(pageName: .chart) + LogManager.analytics(log) + } + + override public func pageboyViewController( + _ pageboyViewController: PageboyViewController, + didScrollToPageAt index: TabmanViewController.PageIndex, + direction: PageboyViewController.NavigationDirection, + animated: Bool + ) { + let chartType = ChartAnalyticsLog.ChartType.allCases[safe: index] ?? .hourly + let log = ChartAnalyticsLog.selectChartType(type: chartType) + LogManager.analytics(log) + + super.pageboyViewController( + pageboyViewController, + didScrollToPageAt: index, + direction: direction, + animated: animated + ) + } + public static func viewController(chartContentComponent: ChartContentComponent) -> ChartViewController { - let viewController = ChartViewController.viewController(storyBoardName: "Chart", bundle: Bundle.module) + let viewController = ChartViewController.viewController( + storyBoardName: "Chart", + bundle: ChartFeatureResources.bundle + ) viewController.chartContentComponent = chartContentComponent return viewController } + + @IBAction func backButtonAction(_ sender: Any) { + navigationController?.popViewController(animated: true) + } } -extension ChartViewController { - private func configureUI() { +private extension ChartViewController { + func configureUI() { + backButton.setImage(DesignSystemAsset.Navigation.back.image, for: .normal) + naviTitleLabel.text = "왁뮤차트 TOP100" + naviTitleLabel.textColor = DesignSystemAsset.BlueGrayColor.blueGray900.color + naviTitleLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) + naviTitleLabel.setTextWithAttributes(alignment: .center) + self.dataSource = self let bar = TMBar.ButtonBar() - + // 배경색 - bar.backgroundView.style = .flat(color: DesignSystemAsset.GrayColor.gray100.color) - + bar.backgroundView.style = .flat(color: DesignSystemAsset.BlueGrayColor.gray100.color) + // 간격 설정 bar.layout.contentInset = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20) bar.layout.contentMode = .fit bar.layout.transitionStyle = .progressive - + bar.layout.interButtonSpacing = 0 + // 버튼 글씨 커스텀 - bar.buttons.customize { (button) in - button.tintColor = DesignSystemAsset.GrayColor.gray400.color - button.selectedTintColor = DesignSystemAsset.GrayColor.gray900.color + bar.buttons.customize { button in + button.tintColor = DesignSystemAsset.BlueGrayColor.gray400.color + button.selectedTintColor = DesignSystemAsset.BlueGrayColor.gray900.color button.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) button.selectedFont = DesignSystemFontFamily.Pretendard.bold.font(size: 16) } - + // indicator bar.indicator.weight = .custom(value: 2) bar.indicator.tintColor = DesignSystemAsset.PrimaryColor.point.color bar.indicator.overscrollBehavior = .compress - view.addSubview(tabBarContentView) - tabBarContentView.snp.makeConstraints { - $0.top.horizontalEdges.equalTo(view.safeAreaLayoutGuide) - $0.height.equalTo(40) - } - addBar(bar, dataSource: self, at: .custom(view: self.tabBarContentView, layout: nil)) - bar.layer.addBorder([.bottom], color:DesignSystemAsset.GrayColor.gray300.color.withAlphaComponent(0.4), height: 1) + bar.layer.addBorder( + [.bottom], + color: DesignSystemAsset.BlueGrayColor.gray300.color.withAlphaComponent(0.4), + height: 1 + ) } } @@ -79,40 +118,29 @@ extension ChartViewController: PageboyViewControllerDataSource, TMBarDataSource case 1: return TMBarItem(title: "일간순") case 2: - return TMBarItem(title: "주간순") + return TMBarItem(title: "주간순") case 3: - return TMBarItem(title: "월간순") + return TMBarItem(title: "월간순") case 4: - return TMBarItem(title: "누적순") + return TMBarItem(title: "누적순") default: let title = "Page \(index)" - return TMBarItem(title: title) + return TMBarItem(title: title) } } public func numberOfViewControllers(in pageboyViewController: PageboyViewController) -> Int { return viewControllers.count } - - public func viewController(for pageboyViewController: PageboyViewController, at index: PageboyViewController.PageIndex) -> UIViewController? { + + public func viewController( + for pageboyViewController: PageboyViewController, + at index: PageboyViewController.PageIndex + ) -> UIViewController? { return viewControllers[index] } - + public func defaultPage(for pageboyViewController: PageboyViewController) -> PageboyViewController.Page? { return nil } } - -extension ChartViewController { - public func equalHandleTapped() { - let viewControllersCount: Int = self.navigationController?.viewControllers.count ?? 0 - if viewControllersCount > 1 { - self.navigationController?.popToRootViewController(animated: true) - }else{ - let current: Int = self.currentIndex ?? 0 - let chartContent = self.viewControllers.compactMap { $0 } - guard chartContent.count > current else { return } - chartContent[current].scrollToTop() - } - } -} diff --git a/Projects/Features/ChartFeature/Sources/ViewModels/ChartContentViewModel.swift b/Projects/Features/ChartFeature/Sources/ViewModels/ChartContentViewModel.swift index bbcce306a..4bba3ea9f 100644 --- a/Projects/Features/ChartFeature/Sources/ViewModels/ChartContentViewModel.swift +++ b/Projects/Features/ChartFeature/Sources/ViewModels/ChartContentViewModel.swift @@ -1,97 +1,91 @@ +import BaseFeature +import ChartDomainInterface import Foundation -import RxSwift import RxRelay -import DomainModule -import BaseFeature +import RxSwift +import SongsDomainInterface import Utility -import DataMappingModule public final class ChartContentViewModel: ViewModelType { public let type: ChartDateType - private let disposeBag = DisposeBag() private let fetchChartRankingUseCase: FetchChartRankingUseCase - private let fetchChartUpdateTimeUseCase: FetchChartUpdateTimeUseCase - + public init( type: ChartDateType, - fetchChartRankingUseCase: FetchChartRankingUseCase, - fetchChartUpdateTimeUseCase: FetchChartUpdateTimeUseCase + fetchChartRankingUseCase: FetchChartRankingUseCase ) { self.type = type self.fetchChartRankingUseCase = fetchChartRankingUseCase - self.fetchChartUpdateTimeUseCase = fetchChartUpdateTimeUseCase } - + public struct Input { - var songTapped: PublishSubject = PublishSubject() - var allSongSelected: PublishSubject = PublishSubject() - let groupPlayTapped: PublishSubject = PublishSubject() - var refreshPulled: PublishSubject = PublishSubject() + let songTapped: PublishSubject = PublishSubject() + let allSongSelected: PublishSubject = PublishSubject() + let halfPlayTapped: PublishSubject = PublishSubject() + let shufflePlayTapped: PublishSubject = PublishSubject() + let refreshPulled: PublishSubject = PublishSubject() } - + public struct Output { - var dataSource: BehaviorRelay<[ChartRankingEntity]> = BehaviorRelay(value: []) - var updateTime: BehaviorRelay = BehaviorRelay(value: "") - let indexOfSelectedSongs: BehaviorRelay<[Int]> = BehaviorRelay(value: []) + let dataSource: BehaviorRelay<[ChartRankingEntity]> = BehaviorRelay(value: []) + let updateTime: BehaviorRelay = BehaviorRelay(value: "") + let indexOfSelectedSongs: BehaviorRelay<[Int]> = BehaviorRelay(value: []) let songEntityOfSelectedSongs: BehaviorRelay<[SongEntity]> = BehaviorRelay(value: []) - let groupPlaySongs: PublishSubject<[SongEntity]> = PublishSubject() + let groupPlaySongs: PublishSubject<(playlistTitle: String, songs: [SongEntity])> = PublishSubject() + let showToast: PublishSubject = PublishSubject() + let showLogin: PublishSubject = .init() } - + public func transform(from input: Input) -> Output { let output = Output() - - let dataSourceForZip = Observable.zip( - fetchChartUpdateTimeUseCase - .execute(type: type) - .catchAndReturn("팬치들 미안해요 ㅠㅠ 잠시만 기다려주세요") // 이스터에그 🥰 - .asObservable(), - fetchChartRankingUseCase - .execute(type: type, limit: 100) - .catchAndReturn([]) - .asObservable() - ) - - dataSourceForZip - .subscribe(onNext: { (time, data) in - output.updateTime.accept(time) - output.dataSource.accept(data) + + let fetchChartRankingUseCase = fetchChartRankingUseCase + .execute(type: type) + .debug("fetchChartRankingUseCase") + .catchAndReturn(.init(updatedAt: "팬치들 미안해요 ㅠㅠ 잠시만 기다려주세요.", songs: [])) + .asObservable() + + fetchChartRankingUseCase + .subscribe(onNext: { entity in + output.updateTime.accept(entity.updatedAt) + output.dataSource.accept(entity.songs) }) .disposed(by: disposeBag) input.refreshPulled - .flatMap { (_) -> Observable<(String, [ChartRankingEntity])> in - return dataSourceForZip + .flatMap { _ -> Observable in + return fetchChartRankingUseCase } - .subscribe(onNext: { (time, data) in - output.updateTime.accept(time) - output.dataSource.accept(data) + .subscribe(onNext: { entity in + output.updateTime.accept(entity.updatedAt) + output.dataSource.accept(entity.songs) }) .disposed(by: disposeBag) input.songTapped - .withLatestFrom(output.indexOfSelectedSongs, resultSelector: { (index, selectedSongs) -> [Int] in + .map { $0.row } + .withLatestFrom(output.indexOfSelectedSongs, resultSelector: { index, selectedSongs -> [Int] in if selectedSongs.contains(index) { - guard let removeTargetIndex = selectedSongs.firstIndex(where: { $0 == index }) else { return selectedSongs } + guard let removeTargetIndex = selectedSongs.firstIndex(where: { $0 == index }) + else { return selectedSongs } var newSelectedSongs = selectedSongs newSelectedSongs.remove(at: removeTargetIndex) return newSelectedSongs - - } - else { return selectedSongs + [index] } + } else { return selectedSongs + [index] } }) .map { $0.sorted { $0 < $1 } } .bind(to: output.indexOfSelectedSongs) .disposed(by: disposeBag) - + input.allSongSelected .withLatestFrom(output.dataSource) { ($0, $1) } - .map { (flag, dataSource) -> [Int] in - return flag ? Array(0.. [Int] in + return flag ? Array(0 ..< dataSource.count) : [] } .bind(to: output.indexOfSelectedSongs) .disposed(by: disposeBag) - + Utility.PreferenceManager.$startPage .skip(1) .map { _ in [] } @@ -100,7 +94,7 @@ public final class ChartContentViewModel: ViewModelType { output.indexOfSelectedSongs .withLatestFrom(output.dataSource) { ($0, $1) } - .map { (selectedSongs, dataSource) in + .map { selectedSongs, dataSource in var newModel = dataSource newModel.indices.forEach { newModel[$0].isSelected = false } selectedSongs.forEach { i in @@ -110,55 +104,76 @@ public final class ChartContentViewModel: ViewModelType { } .bind(to: output.dataSource) .disposed(by: disposeBag) - + output.indexOfSelectedSongs .withLatestFrom(output.dataSource) { ($0, $1) } - .map { (indexOfSelectedSongs, dataSource) -> [SongEntity] in - + .map { indexOfSelectedSongs, dataSource -> [SongEntity] in return indexOfSelectedSongs.map { SongEntity( id: dataSource[$0].id, title: dataSource[$0].title, artist: dataSource[$0].artist, - remix: dataSource[$0].remix, - reaction: dataSource[$0].reaction, views: dataSource[$0].views, - last: dataSource[$0].last, date: dataSource[$0].date ) } } .bind(to: output.songEntityOfSelectedSongs) .disposed(by: disposeBag) - - input.groupPlayTapped + + input.halfPlayTapped .withLatestFrom(output.dataSource) { ($0, $1) } - .map{ (type, dataSource) -> (PlayEvent, [SongEntity]) in - let songEntities: [SongEntity] = dataSource.map { - return SongEntity( - id: $0.id, - title: $0.title, - artist: $0.artist, - remix: $0.remix, - reaction: $0.reaction, - views: $0.views, - last: $0.last, - date: $0.date - ) - } - return (type, songEntities) + .bind(with: self) { owner, tuple in + let (type, songs) = tuple + let chartsArray = owner.halfSplitArray(array: songs, type: type) + let songsArray = owner.toSongEntities(array: chartsArray) + let title = type.playlistTitleString + output.groupPlaySongs.onNext((title, songsArray)) } - .map{ (type, dataSource) -> [SongEntity] in - switch type { - case .allPlay: - return dataSource - case .shufflePlay: - return dataSource.shuffled() - } + .disposed(by: disposeBag) + + input.shufflePlayTapped + .withLatestFrom(output.dataSource) + .map { [weak self] source -> [ChartRankingEntity] in + self?.shuffledSplitArray(array: source) ?? [] + } + .map { [weak self] entities -> [SongEntity] in + self?.toSongEntities(array: entities) ?? [] } + .map { ("왁뮤차트 TOP100 랜덤", $0) } .bind(to: output.groupPlaySongs) .disposed(by: disposeBag) return output } } + +private extension ChartContentViewModel { + func halfSplitArray(array: [T], type: HalfPlayType, limit: Int = 50) -> [T] { + switch type { + case .front: + return Array(array.prefix(limit)) + case .back: + return array.count > limit ? Array(array[limit ..< array.count].prefix(limit)) : [] + } + } + + func shuffledSplitArray(array: [T], limit: Int = 50) -> [T] { + let shuffledArray = array.shuffled() + let result = Array(shuffledArray.prefix(limit)) + return result + } + + func toSongEntities(array: [ChartRankingEntity]) -> [SongEntity] { + let songEntities: [SongEntity] = array.map { + return SongEntity( + id: $0.id, + title: $0.title, + artist: $0.artist, + views: $0.views, + date: $0.date + ) + } + return songEntities + } +} diff --git a/Projects/Features/ChartFeature/Sources/Views/ChartContentTableViewCell.swift b/Projects/Features/ChartFeature/Sources/Views/ChartContentTableViewCell.swift index c68f0ce28..f702096ae 100644 --- a/Projects/Features/ChartFeature/Sources/Views/ChartContentTableViewCell.swift +++ b/Projects/Features/ChartFeature/Sources/Views/ChartContentTableViewCell.swift @@ -1,65 +1,99 @@ -import UIKit -import SnapKit -import Then +import BaseFeature +import ChartDomainInterface import DesignSystem -import DomainModule -import DataMappingModule import Kingfisher +import SnapKit +import SongsDomainInterface +import Then +import UIKit import Utility -import CommonFeature + +protocol ChartContentTableViewCellDelegate: AnyObject { + func tappedThumbnail(id: String) +} public final class ChartContentTableViewCell: UITableViewCell { // MARK: - UI - private let rankingLabel = UILabel().then { - $0.textAlignment = .center - $0.textColor = DesignSystemAsset.GrayColor.gray900.color - $0.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) - } + private let rankingLabel = WMLabel( + text: "0", + textColor: DesignSystemAsset.BlueGrayColor.gray900.color, + font: .t5(weight: .medium), + alignment: .center, + lineHeight: UIFont.WMFontSystem.t5().lineHeight, + kernValue: -0.5 + ) + private let nonImageView = UIImageView().then { $0.image = DesignSystemAsset.Chart.non.image } + private let blowUpImageView = UIImageView().then { $0.image = DesignSystemAsset.Chart.blowup.image } + private let increaseRateImageView = UIImageView().then { $0.image = DesignSystemAsset.Chart.up.image } + private let decreaseRateImageView = UIImageView().then { $0.image = DesignSystemAsset.Chart.down.image } - private let newRateLabel = UILabel().then { - $0.textColor = DesignSystemAsset.PrimaryColor.new.color - $0.text = "NEW" - $0.font = DesignSystemFontFamily.Pretendard.medium.font(size: 11) - } - private let rateLabel = UILabel().then { - $0.textAlignment = .center - $0.font = DesignSystemFontFamily.Pretendard.medium.font(size: 11) - } + + private let newRateLabel = WMLabel( + text: "NEW", + textColor: DesignSystemAsset.PrimaryColor.new.color, + font: .t8(weight: .medium), + alignment: .left, + lineHeight: UIFont.WMFontSystem.t8().lineHeight, + kernValue: -0.5 + ) + + private let rateLabel = WMLabel( + text: "0", + textColor: DesignSystemAsset.PrimaryColor.new.color, + font: .t8(weight: .medium), + alignment: .center, + lineHeight: UIFont.WMFontSystem.t8().lineHeight, + kernValue: -0.5 + ) + private let albumImageView = UIImageView().then { $0.clipsToBounds = true $0.layer.cornerRadius = 4 $0.contentMode = .scaleAspectFill } - private let titleStringLabel = UILabel().then { - $0.textColor = DesignSystemAsset.GrayColor.gray900.color - $0.font = DesignSystemFontFamily.Pretendard.medium.font(size: 14) - } - private let groupStringLabel = UILabel().then { - $0.textColor = DesignSystemAsset.GrayColor.gray900.color - $0.font = DesignSystemFontFamily.Pretendard.light.font(size: 12) - } + + private let titleStringLabel = WMLabel( + text: "제목", + textColor: DesignSystemAsset.BlueGrayColor.gray900.color, + font: .t6(weight: .medium), + alignment: .left, + lineHeight: UIFont.WMFontSystem.t6().lineHeight, + kernValue: -0.5 + ) + + private let groupStringLabel = WMLabel( + text: "아티스트", + textColor: DesignSystemAsset.BlueGrayColor.gray900.color, + font: .t7(weight: .light), + alignment: .left, + lineHeight: UIFont.WMFontSystem.t7().lineHeight, + kernValue: -0.5 + ) + private let hitsLabel = UILabel().then { $0.textAlignment = .right - $0.textColor = DesignSystemAsset.GrayColor.gray900.color + $0.textColor = DesignSystemAsset.BlueGrayColor.gray900.color $0.font = DesignSystemFontFamily.SCoreDream._3Light.font(size: 12) } + private let thumbnailToPlayButton = UIButton(type: .system).then { $0.backgroundColor = UIColor.clear } - - // MARK: -Property + + // MARK: - Property private var model: ChartRankingEntity? + weak var delegate: ChartContentTableViewCellDelegate? // MARK: - Life Cycle override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { @@ -78,7 +112,7 @@ public final class ChartContentTableViewCell: UITableViewCell { fatalError("init(coder:) has not been implemented") } - public override func prepareForReuse() { + override public func prepareForReuse() { super.prepareForReuse() rateLabel.isHidden = false newRateLabel.isHidden = false @@ -90,8 +124,8 @@ public final class ChartContentTableViewCell: UITableViewCell { } // MARK: - Layout -extension ChartContentTableViewCell { - private func addView() { +private extension ChartContentTableViewCell { + func addView() { [ rankingLabel, blowUpImageView, @@ -109,8 +143,8 @@ extension ChartContentTableViewCell { contentView.addSubview($0) } } - - private func setRankingLayout() { + + func setRankingLayout() { rankingLabel.snp.makeConstraints { $0.top.equalTo(10) $0.left.equalTo(20) @@ -155,8 +189,8 @@ extension ChartContentTableViewCell { $0.right.equalTo(-20) } } - - private func setLayout() { + + func setLayout() { titleStringLabel.snp.makeConstraints { $0.height.equalTo(24) $0.top.equalTo(9) @@ -173,15 +207,15 @@ extension ChartContentTableViewCell { $0.edges.equalTo(albumImageView) } } - - private func addTarget() { + + func addTarget() { thumbnailToPlayButton.addTarget(self, action: #selector(thumbnailToPlayButtonAction), for: .touchUpInside) } } // MARK: - Chart 등락률 화살표 -extension ChartContentTableViewCell { - private func newThenBefore() { +private extension ChartContentTableViewCell { + func newThenBefore() { newRateLabel.isHidden = false nonImageView.isHidden = true blowUpImageView.isHidden = true @@ -189,7 +223,8 @@ extension ChartContentTableViewCell { decreaseRateImageView.isHidden = true rateLabel.isHidden = true } - private func higherThanBefore(ranking: Int) { + + func higherThanBefore(ranking: Int) { rateLabel.textColor = DesignSystemAsset.PrimaryColor.increase.color rateLabel.text = "\(ranking)" rateLabel.isHidden = false @@ -199,7 +234,8 @@ extension ChartContentTableViewCell { increaseRateImageView.isHidden = false decreaseRateImageView.isHidden = true } - private func lowerThanBefore(ranking: Int) { + + func lowerThanBefore(ranking: Int) { let minusBeforeRanking = "\(ranking)" rateLabel.textColor = DesignSystemAsset.PrimaryColor.decrease.color rateLabel.text = minusBeforeRanking.trimmingCharacters(in: ["-"]) @@ -210,7 +246,8 @@ extension ChartContentTableViewCell { increaseRateImageView.isHidden = true decreaseRateImageView.isHidden = false } - private func sameAsBefore() { + + func sameAsBefore() { rateLabel.isHidden = true newRateLabel.isHidden = true nonImageView.isHidden = false @@ -219,7 +256,8 @@ extension ChartContentTableViewCell { increaseRateImageView.isHidden = true decreaseRateImageView.isHidden = true } - private func blowThenBefore() { + + func blowThenBefore() { rateLabel.isHidden = true newRateLabel.isHidden = true nonImageView.isHidden = true @@ -231,11 +269,11 @@ extension ChartContentTableViewCell { } // MARK: - Update -extension ChartContentTableViewCell { - public func update(model: ChartRankingEntity, index: Int, type: ChartDateType) { +public extension ChartContentTableViewCell { + func update(model: ChartRankingEntity, index: Int, type: ChartDateType) { self.model = model - self.backgroundColor = model.isSelected ? DesignSystemAsset.GrayColor.gray200.color : .clear - + self.backgroundColor = model.isSelected ? DesignSystemAsset.BlueGrayColor.gray200.color : .clear + let lastRanking = model.last - (index + 1) albumImageView.kf.setImage( with: URL(string: WMImageAPI.fetchYoutubeThumbnail(id: model.id).toString), @@ -265,7 +303,7 @@ extension ChartContentTableViewCell { text: "\(index + 1)", font: DesignSystemFontFamily.Pretendard.medium.font(size: 16) ) - + if model.last == 0 { newThenBefore() return() @@ -283,8 +321,10 @@ extension ChartContentTableViewCell { return() } } - - private func getAttributedString( +} + +private extension ChartContentTableViewCell { + func getAttributedString( text: String, font: UIFont ) -> NSMutableAttributedString { @@ -292,25 +332,15 @@ extension ChartContentTableViewCell { string: text, attributes: [ .font: font, - .foregroundColor: DesignSystemAsset.GrayColor.gray900.color, + .foregroundColor: DesignSystemAsset.BlueGrayColor.gray900.color, .kern: -0.5 ] ) return attributedString } - - @objc private func thumbnailToPlayButtonAction() { + + @objc func thumbnailToPlayButtonAction() { guard let song = self.model else { return } - let songEntity: SongEntity = SongEntity( - id: song.id, - title: song.title, - artist: song.artist, - remix: song.remix, - reaction: song.reaction, - views: song.views, - last: song.last, - date: song.date - ) - PlayState.shared.loadAndAppendSongsToPlaylist([songEntity]) + delegate?.tappedThumbnail(id: song.id) } } diff --git a/Projects/Features/ChartFeature/Sources/Views/PlayButtonForChartView.swift b/Projects/Features/ChartFeature/Sources/Views/PlayButtonForChartView.swift index 2d1783826..9642173b7 100644 --- a/Projects/Features/ChartFeature/Sources/Views/PlayButtonForChartView.swift +++ b/Projects/Features/ChartFeature/Sources/Views/PlayButtonForChartView.swift @@ -1,9 +1,9 @@ -import UIKit import DesignSystem import RxRelay import RxSwift import SnapKit import Then +import UIKit public enum PlayEvent { case allPlay @@ -11,41 +11,56 @@ public enum PlayEvent { } public protocol PlayButtonForChartViewDelegate: AnyObject { - func pressPlay(_ event:PlayEvent) + func pressPlay(_ event: PlayEvent) } public final class PlayButtonForChartView: UIView { - public weak var delegate:PlayButtonForChartViewDelegate? + public weak var delegate: PlayButtonForChartViewDelegate? private let disposeBag = DisposeBag() private let allPlayButton = UIButton().then { $0.setImage(DesignSystemAsset.Chart.allPlay.image.withRenderingMode(.alwaysOriginal), for: .normal) let attributedString = NSMutableAttributedString(string: "전체재생") - attributedString.addAttributes([.font: DesignSystemFontFamily.Pretendard.medium.font(size: 14), - .foregroundColor: DesignSystemAsset.GrayColor.gray900.color, - .kern: -0.5], - range: NSRange(location: 0, length: attributedString.string.count)) + attributedString.addAttributes( + [ + .font: DesignSystemFontFamily.Pretendard.medium.font(size: 14), + .foregroundColor: DesignSystemAsset.GrayColor.gray900.color, + .kern: -0.5 + ], + range: NSRange(location: 0, length: attributedString.string.count) + ) $0.setAttributedTitle(attributedString, for: .normal) } + private let shufflePlayButton = UIButton().then { $0.setTitle("랜덤재생", for: .normal) $0.setImage(DesignSystemAsset.Chart.shufflePlay.image.withRenderingMode(.alwaysOriginal), for: .normal) let attributedString = NSMutableAttributedString(string: "랜덤재생") - attributedString.addAttributes([.font: DesignSystemFontFamily.Pretendard.medium.font(size: 14), - .foregroundColor: DesignSystemAsset.GrayColor.gray900.color, - .kern: -0.5], - range: NSRange(location: 0, length: attributedString.string.count)) + attributedString.addAttributes( + [ + .font: DesignSystemFontFamily.Pretendard.medium.font(size: 14), + .foregroundColor: DesignSystemAsset.GrayColor.gray900.color, + .kern: -0.5 + ], + range: NSRange(location: 0, length: attributedString.string.count) + ) $0.setAttributedTitle(attributedString, for: .normal) } - private let updateTimeLabel = UILabel().then { - $0.font = DesignSystemFontFamily.Pretendard.light.font(size: 12) - $0.textColor = DesignSystemAsset.GrayColor.gray600.color - } + + private let updateTimeLabel = WMLabel( + text: "업데이트", + textColor: DesignSystemAsset.GrayColor.gray600.color, + font: .t7(weight: .light), + alignment: .left, + lineHeight: UIFont.WMFontSystem.t7().lineHeight, + kernValue: -0.5 + ) + private let updateTimeImageView = UIImageView().then { $0.image = DesignSystemAsset.Chart.check.image } - public override init(frame: CGRect) { + override public init(frame: CGRect) { super.init(frame: frame) self.setupView() self.bind() @@ -58,10 +73,14 @@ public final class PlayButtonForChartView: UIView { public func setUpdateTime(updateTime: BehaviorRelay) { let attributedString = NSMutableAttributedString(string: updateTime.value) - attributedString.addAttributes([.font: DesignSystemFontFamily.Pretendard.light.font(size: 12), - .foregroundColor: DesignSystemAsset.GrayColor.gray600.color, - .kern: -0.5], - range: NSRange(location: 0, length: attributedString.string.count)) + attributedString.addAttributes( + [ + .font: DesignSystemFontFamily.Pretendard.light.font(size: 12), + .foregroundColor: DesignSystemAsset.GrayColor.gray600.color, + .kern: -0.5 + ], + range: NSRange(location: 0, length: attributedString.string.count) + ) updateTimeLabel.attributedText = attributedString } } @@ -69,7 +88,7 @@ public final class PlayButtonForChartView: UIView { extension PlayButtonForChartView { private func setupView() { self.backgroundColor = DesignSystemAsset.GrayColor.gray100.color - + [ allPlayButton, shufflePlayButton @@ -89,7 +108,7 @@ extension PlayButtonForChartView { ].forEach { self.addSubview($0) } - + allPlayButton.snp.makeConstraints { $0.top.equalTo(16) $0.leading.equalTo(20) diff --git a/Projects/Features/ChartFeature/Tests/TargetTests.swift b/Projects/Features/ChartFeature/Tests/TargetTests.swift index b1cf79405..147c29d2f 100644 --- a/Projects/Features/ChartFeature/Tests/TargetTests.swift +++ b/Projects/Features/ChartFeature/Tests/TargetTests.swift @@ -1,7 +1,6 @@ import XCTest class TargetTests: XCTestCase { - override func setUpWithError() throws { // Put setup code here. This method is called before the invocation of each test method in the class. } @@ -13,5 +12,4 @@ class TargetTests: XCTestCase { func testExample() throws { XCTAssertEqual("A", "A") } - } diff --git a/Projects/Features/CommonFeature/.swiftlint.yml b/Projects/Features/CommonFeature/.swiftlint.yml deleted file mode 100644 index cefcdca25..000000000 --- a/Projects/Features/CommonFeature/.swiftlint.yml +++ /dev/null @@ -1,20 +0,0 @@ -excluded: - - "**/*/NeedleGenerated.swift" - - "Tuist" - - -force_cast: # From https://realm.github.io/SwiftLint/force_cast.html - warning # 강제 캐스팅은 error에서 warning으로 변경 - -disabled_rules: - - trailing_whitespace - - vertical_whitespace - - colon - - comma - - comment_spacing # 주석 여백 - - mark # //MARK 관련 warning - - opening_brace # 괄호 열 때 줄바꿈을 했는지 안했는지, (안했으면 warning) - - line_length # 한줄에 글자 수 제한 , warning: 120, error: 200 (default) - - statement_position # if는 반드시 else로 끝나야한다. - - identifier_name #변수명 글자 수 제한 - - function_body_length diff --git a/Projects/Features/CommonFeature/Project.swift b/Projects/Features/CommonFeature/Project.swift deleted file mode 100644 index 044997126..000000000 --- a/Projects/Features/CommonFeature/Project.swift +++ /dev/null @@ -1,11 +0,0 @@ -import ProjectDescription -import ProjectDescriptionHelpers - -let project = Project.makeModule( - name: "CommonFeature", - product: .staticFramework, - dependencies: [ - .Project.Features.BaseFeature - ], - resources: ["Resources/**"] -) diff --git a/Projects/Features/CommonFeature/Resources/CommonUI.storyboard b/Projects/Features/CommonFeature/Resources/CommonUI.storyboard deleted file mode 100644 index ee4f46f94..000000000 --- a/Projects/Features/CommonFeature/Resources/CommonUI.storyboard +++ /dev/null @@ -1,1494 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Projects/Features/CommonFeature/Resources/ContainPlayListHeaderView/ContainPlayListHeaderView.xib b/Projects/Features/CommonFeature/Resources/ContainPlayListHeaderView/ContainPlayListHeaderView.xib deleted file mode 100644 index 15c44c950..000000000 --- a/Projects/Features/CommonFeature/Resources/ContainPlayListHeaderView/ContainPlayListHeaderView.xib +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Projects/Features/CommonFeature/Sources/Components/ContainSongsComponent.swift b/Projects/Features/CommonFeature/Sources/Components/ContainSongsComponent.swift deleted file mode 100644 index 8db6cdc7c..000000000 --- a/Projects/Features/CommonFeature/Sources/Components/ContainSongsComponent.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// BeforeSearchComponent.swift -// SearchFeature -// -// Created by yongbeomkwak on 2023/02/10. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import NeedleFoundation -import DomainModule - -public protocol ContainSongsDependency: Dependency { - var multiPurposePopComponent : MultiPurposePopComponent {get} - var fetchPlayListUseCase : any FetchPlayListUseCase {get} - var addSongIntoPlayListUseCase: any AddSongIntoPlayListUseCase {get} - -} - -public final class ContainSongsComponent: Component { - public func makeView(songs:[String]) -> ContainSongsViewController { - return ContainSongsViewController.viewController(multiPurposePopComponent: dependency.multiPurposePopComponent ,viewModel: .init(songs:songs,fetchPlayListUseCase: dependency.fetchPlayListUseCase,addSongIntoPlayListUseCase: dependency.addSongIntoPlayListUseCase )) - } -} diff --git a/Projects/Features/CommonFeature/Sources/Components/MultiPurposePopComponent.swift b/Projects/Features/CommonFeature/Sources/Components/MultiPurposePopComponent.swift deleted file mode 100644 index cdc9669b0..000000000 --- a/Projects/Features/CommonFeature/Sources/Components/MultiPurposePopComponent.swift +++ /dev/null @@ -1,31 +0,0 @@ -// -// BeforeSearchComponent.swift -// SearchFeature -// -// Created by yongbeomkwak on 2023/02/10. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import NeedleFoundation -import DomainModule - -public protocol MultiPurposePopDependency: Dependency { - var createPlayListUseCase : any CreatePlayListUseCase {get} - var loadPlayListUseCase : any LoadPlayListUseCase {get} - var setUserNameUseCase: any SetUserNameUseCase {get} - var editPlayListNameUseCase : any EditPlayListNameUseCase {get} -} - -public final class MultiPurposePopComponent: Component { - public func makeView(type:PurposeType,key:String = "",completion: ((String) -> Void)? = nil ) -> MultiPurposePopupViewController { - return MultiPurposePopupViewController.viewController(viewModel: .init( - type: type, - key: key, - createPlayListUseCase: dependency.createPlayListUseCase, - loadPlayListUseCase: dependency.loadPlayListUseCase, - setUserNameUseCase: dependency.setUserNameUseCase, - editPlayListNameUseCase: dependency.editPlayListNameUseCase), - completion: completion) - } -} diff --git a/Projects/Features/CommonFeature/Sources/Components/NewSongsContentComponent.swift b/Projects/Features/CommonFeature/Sources/Components/NewSongsContentComponent.swift deleted file mode 100644 index 3962d88cd..000000000 --- a/Projects/Features/CommonFeature/Sources/Components/NewSongsContentComponent.swift +++ /dev/null @@ -1,31 +0,0 @@ -// -// NewSongsContentComponent.swift -// CommonFeature -// -// Created by KTH on 2023/11/15. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import NeedleFoundation -import DomainModule -import DataMappingModule - -public protocol NewSongsContentDependency: Dependency { - var fetchNewSongsUseCase: any FetchNewSongsUseCase { get } - var fetchChartUpdateTimeUseCase: any FetchChartUpdateTimeUseCase { get } - var containSongsComponent: ContainSongsComponent { get } -} - -public final class NewSongsContentComponent: Component { - public func makeView(type: NewSongGroupType) -> NewSongsContentViewController { - return NewSongsContentViewController.viewController( - viewModel: .init( - type: type, - fetchNewSongsUseCase: dependency.fetchNewSongsUseCase, - fetchChartUpdateTimeUseCase: dependency.fetchChartUpdateTimeUseCase - ), - containSongsComponent: dependency.containSongsComponent - ) - } -} diff --git a/Projects/Features/CommonFeature/Sources/Components/NoticePopupComponent.swift b/Projects/Features/CommonFeature/Sources/Components/NoticePopupComponent.swift deleted file mode 100644 index c93b73629..000000000 --- a/Projects/Features/CommonFeature/Sources/Components/NoticePopupComponent.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// NoticePopupComponent.swift -// CommonFeature -// -// Created by KTH on 2023/04/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import NeedleFoundation -import DomainModule - -public protocol NoticePopupDependency: Dependency { -} - -public final class NoticePopupComponent: Component { - public func makeView(model: [FetchNoticeEntity]) -> NoticePopupViewController { - return NoticePopupViewController.viewController( - viewModel: .init( - fetchNoticeEntities: model - ) - ) - } -} diff --git a/Projects/Features/CommonFeature/Sources/Components/OpenSourceLicenseComponent.swift b/Projects/Features/CommonFeature/Sources/Components/OpenSourceLicenseComponent.swift deleted file mode 100644 index 8d3977fd4..000000000 --- a/Projects/Features/CommonFeature/Sources/Components/OpenSourceLicenseComponent.swift +++ /dev/null @@ -1,21 +0,0 @@ -// -// OpenSourceLicenseComponent.swift -// CommonFeature -// -// Created by KTH on 2023/05/17. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import NeedleFoundation - -public protocol OpenSourceLicenseDependency: Dependency { -} - -public final class OpenSourceLicenseComponent: Component { - public func makeView() -> OpenSourceLicenseViewController { - return OpenSourceLicenseViewController.viewController( - viewModel: OpenSourceLicenseViewModel() - ) - } -} diff --git a/Projects/Features/CommonFeature/Sources/Components/PlayListDetailComponent.swift b/Projects/Features/CommonFeature/Sources/Components/PlayListDetailComponent.swift deleted file mode 100644 index 62681772d..000000000 --- a/Projects/Features/CommonFeature/Sources/Components/PlayListDetailComponent.swift +++ /dev/null @@ -1,38 +0,0 @@ -// -// BeforeSearchComponent.swift -// SearchFeature -// -// Created by yongbeomkwak on 2023/02/10. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import NeedleFoundation -import DomainModule -import DataMappingModule - -public protocol PlayListDetailDependency: Dependency { - var fetchPlayListDetailUseCase: any FetchPlayListDetailUseCase {get} - - var editPlayListUseCase : any EditPlayListUseCase {get} - var removeSongsUseCase : any RemoveSongsUseCase {get} - - var multiPurposePopComponent: MultiPurposePopComponent {get} - var containSongsComponent : ContainSongsComponent {get} - - -} - -public final class PlayListDetailComponent: Component { - public func makeView(id:String,type:PlayListType) -> PlayListDetailViewController { - return PlayListDetailViewController.viewController(viewModel: PlayListDetailViewModel( - id:id, - type:type, - fetchPlayListDetailUseCase: dependency.fetchPlayListDetailUseCase, - editPlayListUseCase: dependency.editPlayListUseCase, - removeSongsUseCase: dependency.removeSongsUseCase), - multiPurposePopComponent: dependency.multiPurposePopComponent, - containSongsComponent:dependency.containSongsComponent) - - } -} diff --git a/Projects/Features/CommonFeature/Sources/Components/ProfilePopComponent.swift b/Projects/Features/CommonFeature/Sources/Components/ProfilePopComponent.swift deleted file mode 100644 index 051bc4240..000000000 --- a/Projects/Features/CommonFeature/Sources/Components/ProfilePopComponent.swift +++ /dev/null @@ -1,27 +0,0 @@ -// -// BeforeSearchComponent.swift -// SearchFeature -// -// Created by yongbeomkwak on 2023/02/10. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import NeedleFoundation -import DomainModule - -public protocol ProfilePopDependency: Dependency { - var fetchProfileListUseCase: any FetchProfileListUseCase {get} - var setProfileUseCase: any SetProfileUseCase {get} -} - -public final class ProfilePopComponent: Component { - public func makeView() -> ProfilePopViewController { - return ProfilePopViewController.viewController( - viewModel: .init( - fetchProfileListUseCase: dependency.fetchProfileListUseCase, - setProfileUseCase: dependency.setProfileUseCase - ) - ) - } -} diff --git a/Projects/Features/CommonFeature/Sources/Components/ServiceInfoComponent.swift b/Projects/Features/CommonFeature/Sources/Components/ServiceInfoComponent.swift deleted file mode 100644 index ac5f2c4c2..000000000 --- a/Projects/Features/CommonFeature/Sources/Components/ServiceInfoComponent.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// ServiceInfoComponent.swift -// CommonFeature -// -// Created by KTH on 2023/05/17. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import NeedleFoundation - -public protocol ServiceInfoDependency: Dependency { - var openSourceLicenseComponent: OpenSourceLicenseComponent { get } - -} - -public final class ServiceInfoComponent: Component { - public func makeView() -> ServiceInfoViewController { - return ServiceInfoViewController.viewController( - viewModel: ServiceInfoViewModel(), - openSourceLicenseComponent: dependency.openSourceLicenseComponent - ) - } -} diff --git a/Projects/Features/CommonFeature/Sources/PlayState/PlayState+Enum.swift b/Projects/Features/CommonFeature/Sources/PlayState/PlayState+Enum.swift deleted file mode 100644 index 22a531a58..000000000 --- a/Projects/Features/CommonFeature/Sources/PlayState/PlayState+Enum.swift +++ /dev/null @@ -1,44 +0,0 @@ -// -// PlayState+Enum.swift -// CommonFeature -// -// Created by YoungK on 2023/03/31. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public enum ShuffleMode { - case on - case off - - public var isOn: Bool { return self == .on } - public var isOff: Bool { return self == .off } - - public mutating func toggle() { - self = (self == .on) ? .off : .on - } -} - -public enum RepeatMode { - case none // 반복 없음 - case repeatAll // 전체 반복 - case repeatOnce // 한곡 반복 - - public mutating func rotate() { - switch self { - case .none: - self = .repeatAll - case .repeatAll: - self = .repeatOnce - case .repeatOnce: - self = .none - } - } -} - -public enum PlayerMode: Equatable { - case full - case mini - case close -} diff --git a/Projects/Features/CommonFeature/Sources/PlayState/PlayState+PlayProgress.swift b/Projects/Features/CommonFeature/Sources/PlayState/PlayState+PlayProgress.swift deleted file mode 100644 index f765262d9..000000000 --- a/Projects/Features/CommonFeature/Sources/PlayState/PlayState+PlayProgress.swift +++ /dev/null @@ -1,28 +0,0 @@ -// -// PlayState+PlayProgress.swift -// CommonFeature -// -// Created by YoungK on 2023/04/03. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public struct PlayProgress { - public var currentProgress: Double - public var endProgress: Double - - public init(currentProgress: Double = 0, endProgress: Double = 0) { - self.currentProgress = currentProgress - self.endProgress = endProgress - } - - public mutating func clear() { - currentProgress = 0 - endProgress = 0 - } - - public mutating func resetCurrentProgress() { - currentProgress = 0 - } -} diff --git a/Projects/Features/CommonFeature/Sources/PlayState/PlayState+PlaybackLog.swift b/Projects/Features/CommonFeature/Sources/PlayState/PlayState+PlaybackLog.swift deleted file mode 100644 index 7154cfc2c..000000000 --- a/Projects/Features/CommonFeature/Sources/PlayState/PlayState+PlaybackLog.swift +++ /dev/null @@ -1,28 +0,0 @@ -// -// PlayState+PlaybackLog.swift -// CommonFeature -// -// Created by KTH on 2023/08/27. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -extension PlayState { - public struct PlaybackLog: Codable { - public var os: String = "ios" - public var prev: PlayState.PlaybackLog.Previous - public var curr: PlayState.PlaybackLog.Current - } -} - -extension PlayState.PlaybackLog { - public struct Previous: Codable { - public var songId: String - public var songLength: Int - public var stoppedAt: Int - } - public struct Current: Codable { - public var songId: String - } -} diff --git a/Projects/Features/CommonFeature/Sources/PlayState/PlayState+PlayerMode.swift b/Projects/Features/CommonFeature/Sources/PlayState/PlayState+PlayerMode.swift deleted file mode 100644 index 1e549b2e9..000000000 --- a/Projects/Features/CommonFeature/Sources/PlayState/PlayState+PlayerMode.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// PlayState+PlayerMode.swift -// CommonFeature -// -// Created by YoungK on 2023/04/01. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -extension PlayState { - public func switchPlayerMode(to mode: PlayerMode) { - NotificationCenter.default.post(name: .updatePlayerMode, object: mode) - } -} diff --git a/Projects/Features/CommonFeature/Sources/PlayState/PlayState+Playlist.swift b/Projects/Features/CommonFeature/Sources/PlayState/PlayState+Playlist.swift deleted file mode 100644 index 4ee1aa822..000000000 --- a/Projects/Features/CommonFeature/Sources/PlayState/PlayState+Playlist.swift +++ /dev/null @@ -1,136 +0,0 @@ -// -// PlayState+Playlist.swift -// CommonFeature -// -// Created by YoungK on 2023/04/01. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import DomainModule -import Combine - -public struct PlayListItem: Equatable { - public var item: SongEntity - public var isPlaying: Bool - - public init(item: SongEntity, isPlaying: Bool = false) { - self.item = item - self.isPlaying = isPlaying - } - - public static func == (lhs: PlayListItem, rhs: PlayListItem) -> Bool { - return lhs.item == rhs.item && lhs.item.isSelected == rhs.item.isSelected && lhs.isPlaying == rhs.isPlaying - } -} - -public class PlayList { - public var list: [PlayListItem] { - didSet(oldValue) { - listChanged.send(list) - - let allItemsNotPlaying = list.allSatisfy { $0.isPlaying == false } - if oldValue.isEmpty && !list.isEmpty && allItemsNotPlaying { - changeCurrentPlayIndex(to: 0) - } - } - } - public var listChanged = PassthroughSubject<[PlayListItem], Never>() - public var listAppended = PassthroughSubject<[PlayListItem], Never>() - public var listRemoved = PassthroughSubject<[PlayListItem], Never>() - public var listReordered = PassthroughSubject<[PlayListItem], Never>() - public var currentPlayIndexChanged = PassthroughSubject<[PlayListItem], Never>() - public var currentPlaySongChanged = PassthroughSubject() - - public init(list: [PlayListItem] = []) { - self.list = list - } - public var currentPlayIndex: Int? { return list.firstIndex(where: { $0.isPlaying == true }) } - public var currentPlaySong: SongEntity? { list[safe: currentPlayIndex ?? -1]?.item } - public var first: SongEntity? { return list.first?.item } - public var last: SongEntity? { return list.last?.item } - public var count: Int { return list.count } - public var lastIndex: Int { return list.count - 1 } - public var isEmpty: Bool { return list.isEmpty } - public var isFirst: Bool { return currentPlayIndex == 0 } - public var isLast: Bool { return currentPlayIndex == lastIndex } - - public func append(_ item: PlayListItem) { - list.append(item) - listAppended.send(list) - } - - public func append(_ items: [PlayListItem]) { - list.append(contentsOf: items) - listAppended.send(list) - } - - public func insert(_ newElement: PlayListItem, at: Int) { - list.insert(newElement, at: at) - listAppended.send(list) - } - - private func remove(at index: Int) { - // 재생중인 곡을 삭제하는 경우 CurrentPlayIndex를 다음으로 옮기고, 옮겨진 currentPlayIndex에 해당하는 곡을 재생 - if let currentPlayIndex = currentPlayIndex, index == currentPlayIndex { - changeCurrentPlayIndexToNext() - if let currentPlayIndex = self.currentPlayIndex, - let song = list[safe: currentPlayIndex]?.item { - currentPlaySongChanged.send(song) - } - } - - list.remove(at: index) - } - - public func remove(indexs: [Int]) { - let sortedIndexs = indexs.sorted(by: >) // 앞에서부터 삭제하면 인덱스 순서가 바뀜 - sortedIndexs.forEach { index in - remove(at: index) - } - listRemoved.send(list) - } - - public func removeAll() { - list.removeAll() - PlayState.shared.stop() - PlayState.shared.switchPlayerMode(to: .mini) - listRemoved.send(list) - } - - public func contains(_ item: PlayListItem) -> Bool { - return list.contains(item) - } - - public func changeCurrentPlayIndex(to index: Int) { - let currentPlayIndex = currentPlayIndex ?? 0 - list[currentPlayIndex].isPlaying = false - list[index].isPlaying = true - currentPlayIndexChanged.send(list) - } - - public func changeCurrentPlayIndexToPrevious() { - guard let currentPlayIndex = currentPlayIndex else { return } - let previousIndex = (currentPlayIndex - 1 + list.count) % list.count - changeCurrentPlayIndex(to: previousIndex) - } - - public func changeCurrentPlayIndexToNext() { - guard let currentPlayIndex = currentPlayIndex else { return } - let nextIndex = (currentPlayIndex + 1 + list.count) % list.count - changeCurrentPlayIndex(to: nextIndex) - } - - public func reorderPlaylist(from: Int, to: Int) { - let movedData = list[from] - list.remove(at: from) - list.insert(movedData, at: to) - //Comment: 순서가 변경되어도 DB를 업데이트 하지 않음 - //listReordered.send(list) - } - - /// 해당 곡이 이미 재생목록에 있으면 재생목록 속 해당 곡의 index, 없으면 nil 리턴 - public func uniqueIndex(of item: PlayListItem) -> Int? { - return list.firstIndex(where: { $0.item == item.item }) - } -} diff --git a/Projects/Features/CommonFeature/Sources/PlayState/PlayState+Public.swift b/Projects/Features/CommonFeature/Sources/PlayState/PlayState+Public.swift deleted file mode 100644 index 70a012284..000000000 --- a/Projects/Features/CommonFeature/Sources/PlayState/PlayState+Public.swift +++ /dev/null @@ -1,67 +0,0 @@ -// -// PlayState+Public.swift -// PlayerFeature -// -// Created by YoungK on 2023/03/25. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import DomainModule -import Utility -import UIKit -import YouTubePlayerKit - -public extension PlayState { - /// 주어진 곡들을 재생목록에 추가하고 재생합니다. - /// - 먼저 주어진 곡들의 첫번째 곡을 재생하며, 이후의 곡들은 재생목록의 마지막에 추가합니다. - /// - Parameter duplicateAllowed: 재생목록 추가 시 중복 허용 여부 (기본값: false) - func loadAndAppendSongsToPlaylist(_ songs: [SongEntity], duplicateAllowed: Bool = false) { - if songs.isEmpty { return } - // 1. 이미 있는 곡들 인덱스 찾기 - // 2. 리스트에서 해당 인덱스들 곡 삭제 - // 3. 리스트 뒤에 곡들 추가 - // 4. currentPlayIndex 변경 - // 5. 주어진 첫번째 곡 재생 - let existSongIndexs = songs.uniqueElements.compactMap { self.playList.uniqueIndex(of: PlayListItem(item: $0)) } - self.playList.remove(indexs: existSongIndexs) - let mappedSongs = songs.uniqueElements.map { PlayListItem(item: $0) } - self.playList.append(mappedSongs) - - if let firstSong = mappedSongs.first, let playSongIndex = self.playList.uniqueIndex(of: firstSong) { - if self.playerMode == .close { self.switchPlayerMode(to: .mini) } - self.playList.changeCurrentPlayIndex(to: playSongIndex) - self.load(at: firstSong.item) - } - } - - /// 주어진 곡들을 재생목록에 추가합니다. - /// - Parameter duplicateAllowed: 재생목록 추가 시 중복 허용 여부 (기본값: false) - func appendSongsToPlaylist(_ songs: [SongEntity], duplicateAllowed: Bool = false) { - let existSongIndexs = songs.uniqueElements.compactMap { self.playList.uniqueIndex(of: PlayListItem(item: $0)) } - self.playList.remove(indexs: existSongIndexs) - let mappedSongs = songs.uniqueElements.map { PlayListItem(item: $0) } - self.playList.append(mappedSongs) - - if self.playerMode == .close { - self.switchPlayerMode(to: .mini) - self.currentSong = self.playList.currentPlaySong - if let currentSong = currentSong { - self.player?.cue(source: .video(id: currentSong.id)) - } - } - } - - /// 플레이어의 상태를 체크합니다. - func checkForPlayerState(completion: ((YouTubePlayer.State) -> Void)? = nil) { - guard let playerState = self.player?.state else { return } - completion?(playerState) - } - - /// 플레이어를 리셋합니다. - func resetPlayer() { - self.player = YouTubePlayer(configuration: .init(autoPlay: false, showControls: false, showRelatedVideos: false)) - self.player?.cue(source: .video(id: self.currentSong?.id ?? "")) - NotificationCenter.default.post(name: .resetYouTubePlayerHostingView, object: nil) - } -} diff --git a/Projects/Features/CommonFeature/Sources/PlayState/PlayState+YoutubePlayer.swift b/Projects/Features/CommonFeature/Sources/PlayState/PlayState+YoutubePlayer.swift deleted file mode 100644 index 26262c884..000000000 --- a/Projects/Features/CommonFeature/Sources/PlayState/PlayState+YoutubePlayer.swift +++ /dev/null @@ -1,94 +0,0 @@ -// -// PlayState+YoutubePlayer.swift -// CommonFeature -// -// Created by YoungK on 2023/04/01. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import DomainModule -import Utility - -// MARK: YouTubePlayer 컨트롤과 관련된 메소드들을 모아놓은 익스텐션입니다. -extension PlayState { - - /// ⏯️ 현재 곡 재생 - public func play() { - self.player?.play() - } - - /// ⏸️ 일시정지 - public func pause() { - self.player?.pause() - } - - /// ⏹️ 플레이어 닫기 - public func stop() { - self.player?.stop() // stop만 하면 playbackState가 .cued로 들어감 - self.currentSong = nil - self.progress.resetCurrentProgress() - self.player?.cue(source: .video(id: "")) // playbackState를 .unstarted로 바꿈 - //self.playList.removeAll() - } - - /// ▶️ 해당 곡 새로 재생 - public func load(at song: SongEntity) { - //requestPlaybackLog(current: song) // v2 api 완성 후 적용하기로 함. - self.currentSong = song - guard let currentSong = currentSong else { return } - self.player?.load(source: .video(id: currentSong.id)) - } - - /// ▶️ 플레이리스트의 해당 위치의 곡 재생 - public func loadInPlaylist(at index: Int) { - guard let playListItem = playList.list[safe: index] else { return } - load(at: playListItem.item) - } - - /// ⏩ 다음 곡으로 변경 후 재생 - public func forward() { - self.playList.changeCurrentPlayIndexToNext() - guard let currentPlayIndex = playList.currentPlayIndex else { return } - guard let playListItem = playList.list[safe: currentPlayIndex] else { return } - load(at: playListItem.item) - } - - /// ⏪ 이전 곡으로 변경 후 재생 - public func backward() { - self.playList.changeCurrentPlayIndexToPrevious() - guard let currentPlayIndex = playList.currentPlayIndex else { return } - guard let playListItem = playList.list[safe: currentPlayIndex] else { return } - load(at: playListItem.item) - } - - /// 🔀 플레이리스트 내 랜덤 재생 - public func shufflePlay() { - let shuffledIndices = self.playList.list.indices.shuffled() - if let index = shuffledIndices.first(where: { $0 != self.playList.currentPlayIndex }) { - self.playList.changeCurrentPlayIndex(to: index) - self.loadInPlaylist(at: index) - } else { - self.forward() - } - } - - /// ♻️ 첫번째 곡으로 변경 후 재생 - public func playAgain() { - self.playList.changeCurrentPlayIndex(to: 0) - guard let firstItem = self.playList.first else { return } - load(at: firstItem) - } - - /// 🎤 재생 로그 전송 - public func requestPlaybackLog(current: SongEntity) { - guard Utility.PreferenceManager.userInfo != nil else { - return - } - let logItem = PlayState.PlaybackLog(prev: PlayState.PlaybackLog.Previous(songId: self.currentSong?.id ?? "", - songLength: Int(self.progress.endProgress), - stoppedAt: Int(self.progress.currentProgress)), - curr: PlayState.PlaybackLog.Current(songId: current.id)) - NotificationCenter.default.post(name: .requestPlaybackLog, object: logItem) - } -} diff --git a/Projects/Features/CommonFeature/Sources/PlayState/PlayState.swift b/Projects/Features/CommonFeature/Sources/PlayState/PlayState.swift deleted file mode 100644 index 30c955d23..000000000 --- a/Projects/Features/CommonFeature/Sources/PlayState/PlayState.swift +++ /dev/null @@ -1,193 +0,0 @@ -// -// PlayState.swift -// PlayerFeature -// -// Created by YoungK on 2023/02/20. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import DomainModule -import YouTubePlayerKit -import Combine -import Utility -import AVFAudio - -final public class PlayState { - public static let shared = PlayState(player: YouTubePlayer(configuration: .init(autoPlay: false, showControls: false, showRelatedVideos: false))) - - @Published public var player: YouTubePlayer? - @Published public var state: YouTubePlayer.PlaybackState = .unstarted - @Published public var currentSong: SongEntity? - @Published public var progress: PlayProgress - @Published public var playList: PlayList - @Published public var repeatMode: RepeatMode = .none - @Published public var shuffleMode: ShuffleMode = .off - @Published public var playerMode: PlayerMode = .mini - - private var subscription = Set() - - public init( - player: YouTubePlayer?, - playList: PlayList = PlayList(), - playProgress: PlayProgress = PlayProgress()) - { - DEBUG_LOG("🚀:: \(Self.self) initialized") - self.player = player - self.playList = playList - self.progress = playProgress - - self.playList.list = fetchPlayListFromLocalDB() - currentSong = playList.currentPlaySong - self.player?.cue(source: .video(id: currentSong?.id ?? "")) // 곡이 있으면 .cued 없으면 .unstarted - - subscribePlayPublisher() - subscribePlayListChanges() - registerAudioRouteChangeNotification() - } - - deinit { - DEBUG_LOG("🚀:: \(Self.self) deinit") - NotificationCenter.default.removeObserver(self) - } - - public func subscribePlayPublisher() { - player?.playbackStatePublisher.sink { [weak self] state in - guard let self = self else { return } - self.state = state - }.store(in: &subscription) - - player?.currentTimePublisher().sink { [weak self] currentTime in - guard let self = self else { return } - self.progress.currentProgress = currentTime - }.store(in: &subscription) - - player?.durationPublisher.sink { [weak self] duration in - guard let self = self else { return } - self.progress.endProgress = duration - }.store(in: &subscription) - } - - /// 플레이리스트에 변경사항이 생겼을 때, 로컬 DB를 덮어씁니다. - public func subscribePlayListChanges() { - Publishers.Merge4( - playList.listAppended, - playList.listRemoved, - playList.listReordered, - playList.currentPlayIndexChanged - ) - .sink { [weak self] playListItems in - guard let self else { return } - self.updatePlayListChangesToLocalDB(playList: playListItems) - }.store(in: &subscription) - - playList.currentPlaySongChanged.sink { [weak self] song in - guard let self else { return } - self.currentSong = song - if let index = self.playList.currentPlayIndex { - loadInPlaylist(at: index) - } - }.store(in: &subscription) - } - - public func updatePlayListChangesToLocalDB(playList: [PlayListItem]) { - let allPlayedLists = RealmManager.shared.realm.objects(PlayedLists.self) - RealmManager.shared.deleteRealmDB(model: allPlayedLists) - - let playedList = playList.map { - PlayedLists( - id: $0.item.id, - title: $0.item.title, - artist: $0.item.artist, - remix: $0.item.remix, - reaction: $0.item.reaction, - views: $0.item.views, - last: $0.item.last, - date: $0.item.date, - lastPlayed: $0.isPlaying - )} - RealmManager.shared.addRealmDB(model: playedList) - } - - public func fetchPlayListFromLocalDB() -> [PlayListItem] { - let playedList = RealmManager.shared.realm.objects(PlayedLists.self) - .toArray(type: PlayedLists.self) - .map { PlayListItem(item: - SongEntity( - id: $0.id, - title: $0.title, - artist: $0.artist, - remix: $0.remix, - reaction: $0.reaction, - views: $0.views, - last: $0.last, - date: $0.date), - isPlaying: $0.lastPlayed - )} - return playedList - } - - /// 디바이스와 연결된 오디오 장치가 변경되었음을 감지합니다. - public func registerAudioRouteChangeNotification() { - NotificationCenter.default.addObserver( - self, - selector: #selector(handleRouteChange(notification:)), - name: AVAudioSession.routeChangeNotification, - object: AVAudioSession.sharedInstance() - ) - } - - @objc func handleRouteChange(notification: Notification) { - guard let userInfo = notification.userInfo, - let reasonValue = userInfo[AVAudioSessionRouteChangeReasonKey] as? UInt, - let reason = AVAudioSession.RouteChangeReason(rawValue: reasonValue) else { - return - } - - switch reason { - - case .unknown: - DEBUG_LOG("🚀unknown") - - case .newDeviceAvailable: //이어폰 꼈을때, - DEBUG_LOG("🚀newDeviceAvailable") - - case .oldDeviceUnavailable: //이어폰 뺐을때 .oldDeviceUnavailable, .categoryChange 두 가지가 간헐적으로 꽂힘 - let previousRoute = userInfo[AVAudioSessionRouteChangePreviousRouteKey] as? AVAudioSessionRouteDescription - let previousOutput = previousRoute?.outputs.first - let portType = previousOutput?.portType - - if portType == AVAudioSession.Port.headphones || portType == AVAudioSession.Port.bluetoothA2DP { - // 이어폰 또는 블루투스 이어폰이 연결 해제됨 - DEBUG_LOG("🚀oldDeviceUnavailable 이어폰이 연결 해제되었습니다.") - self.pause() - } - - case .categoryChange: //이어폰 뺐을때 .oldDeviceUnavailable, .categoryChange 두 가지가 간헐적으로 꽂힘 - let previousRoute = userInfo[AVAudioSessionRouteChangePreviousRouteKey] as? AVAudioSessionRouteDescription - let previousOutput = previousRoute?.outputs.first - let portType = previousOutput?.portType - - if portType == AVAudioSession.Port.headphones || portType == AVAudioSession.Port.bluetoothA2DP { - // 이어폰 또는 블루투스 이어폰이 연결 해제됨 - DEBUG_LOG("🚀categoryChange 이어폰이 연결 해제되었습니다.") - self.pause() - } - - case .override: - DEBUG_LOG("🚀override") - - case .wakeFromSleep: - DEBUG_LOG("🚀wakeFromSleep") - - case .noSuitableRouteForCategory: - DEBUG_LOG("🚀noSuitableRouteForCategory") - - case .routeConfigurationChange: - DEBUG_LOG("🚀routeConfigurationChange") - - default: - return - } - } -} diff --git a/Projects/Features/CommonFeature/Sources/Protocols/LoadingAlertControllerType.swift b/Projects/Features/CommonFeature/Sources/Protocols/LoadingAlertControllerType.swift deleted file mode 100644 index 7c49f5dbf..000000000 --- a/Projects/Features/CommonFeature/Sources/Protocols/LoadingAlertControllerType.swift +++ /dev/null @@ -1,31 +0,0 @@ -// -// LoadingAlertControllerType.swift -// CommonFeature -// -// Created by KTH on 2023/05/14. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import UIKit - -public protocol LoadingAlertControllerType: AnyObject { - var alertController: UIAlertController! { get set } -} - -public extension LoadingAlertControllerType where Self: UIViewController { - func startLoading(message: String) { - DispatchQueue.main.async { - self.alertController = UIAlertController(title: message, message: "", preferredStyle: .alert) - self.present(self.alertController, animated: true) - } - } - - func stopLoading(completion: (() -> Void)? = nil) { - DispatchQueue.main.async { - self.alertController?.dismiss(animated: true) { - completion?() - } - } - } -} diff --git a/Projects/Features/CommonFeature/Sources/Protocols/PlayButtonDelegate.swift b/Projects/Features/CommonFeature/Sources/Protocols/PlayButtonDelegate.swift deleted file mode 100644 index fc318cd47..000000000 --- a/Projects/Features/CommonFeature/Sources/Protocols/PlayButtonDelegate.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// PlayButtonDelegate.swift -// Utility -// -// Created by yongbeomkwak on 2023/03/23. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import DomainModule - -public protocol PlayButtonDelegate:AnyObject { - - func play(model:SongEntity) -} diff --git a/Projects/Features/CommonFeature/Sources/Struct/EditState.swift b/Projects/Features/CommonFeature/Sources/Struct/EditState.swift deleted file mode 100644 index e1e00c1cc..000000000 --- a/Projects/Features/CommonFeature/Sources/Struct/EditState.swift +++ /dev/null @@ -1,12 +0,0 @@ -import Foundation - -public struct EditState { - - public var isEditing:Bool - public var force:Bool - - public init(isEditing: Bool, force: Bool) { - self.isEditing = isEditing - self.force = force - } -} diff --git a/Projects/Features/CommonFeature/Sources/ViewControllers/ContainSongsViewController.swift b/Projects/Features/CommonFeature/Sources/ViewControllers/ContainSongsViewController.swift deleted file mode 100644 index 11034c3b1..000000000 --- a/Projects/Features/CommonFeature/Sources/ViewControllers/ContainSongsViewController.swift +++ /dev/null @@ -1,190 +0,0 @@ -// -// ContainSongsViewController.swift -// CommonFeature -// -// Created by yongbeomkwak on 2023/03/11. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import BaseFeature -import Utility -import DesignSystem -import RxSwift -import NVActivityIndicatorView -import DomainModule - -public protocol ContainSongsViewDelegate: AnyObject { - func tokenExpired() -} - -public final class ContainSongsViewController: BaseViewController,ViewControllerFromStoryBoard{ - @IBOutlet weak var closeButton: UIButton! - @IBOutlet weak var titleLabel: UILabel! - @IBOutlet weak var tableView: UITableView! - @IBOutlet weak var indicator: NVActivityIndicatorView! - @IBOutlet weak var songCountLabel: UILabel! - @IBOutlet weak var subTitleLabel: UILabel! - - var multiPurposePopComponent : MultiPurposePopComponent! - - var viewModel:ContainSongsViewModel! - lazy var input = ContainSongsViewModel.Input() - lazy var output = viewModel.transform(from: input) - var disposeBag = DisposeBag() - public var delegate: ContainSongsViewDelegate? - - deinit { DEBUG_LOG("❌ \(Self.self) Deinit") } - - public override func viewDidLoad() { - super.viewDidLoad() - configureUI() - bindRx() - } - - public static func viewController( - multiPurposePopComponent: MultiPurposePopComponent, - viewModel: ContainSongsViewModel - ) -> ContainSongsViewController { - let viewController = ContainSongsViewController.viewController(storyBoardName: "CommonUI", bundle: Bundle.module) - viewController.multiPurposePopComponent = multiPurposePopComponent - viewController.viewModel = viewModel - return viewController - } -} - -extension ContainSongsViewController { - - private func bindRx() { - tableView.rx.setDelegate(self).disposed(by: disposeBag) - - closeButton.rx.tap.subscribe(onNext: { [weak self] _ in - self?.dismiss(animated: true) - }) - .disposed(by: disposeBag) - - output.dataSource - .skip(1) - .do(onNext: { [weak self] model in - guard let self = self else { - return - } - let window: UIWindow? = UIApplication.shared.windows.first - let safeAreaInsetsTop: CGFloat = window?.safeAreaInsets.top ?? 0 - let safeAreaInsetsBottom: CGFloat = window?.safeAreaInsets.bottom ?? 0 - - let space = APP_HEIGHT() - 48 - 16 - 24 - 12 - 52 - 12 - safeAreaInsetsTop - safeAreaInsetsBottom - let height = space / 3 * 2 - - let warningView = WarningView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: height)) - warningView.text = "내 리스트가 없습니다." - self.tableView.tableFooterView = model.isEmpty ? warningView : nil - self.indicator.stopAnimating() - }) - .bind(to: tableView.rx.items){ (tableView,index,model) -> UITableViewCell in - guard let cell = tableView.dequeueReusableCell( - withIdentifier: "CurrentPlayListTableViewCell", - for: IndexPath(row: index, section: 0)) as? CurrentPlayListTableViewCell - else { - return UITableViewCell() - } - cell.update(model: model) - return cell - }.disposed(by: disposeBag) - - tableView.rx.itemSelected - .withLatestFrom(output.dataSource){ ($0, $1) } - .do(onNext: { [weak self] (indexPath, _) in - self?.tableView.deselectRow(at: indexPath, animated: true) - }) - .map{ (indexPath, model) -> String in - return model[indexPath.row].key - } - .bind(to: input.containSongWithKey) - .disposed(by: disposeBag) - - output.showToastMessage - .observe(on: MainScheduler.instance) - .subscribe(onNext: { [weak self] (result:AddSongEntity) in - guard let self = self else {return} - self.showToast(text: result.description, font: DesignSystemFontFamily.Pretendard.light.font(size: 14)) - - if result.status == 401 { - LOGOUT() - PlayState.shared.switchPlayerMode(to: .mini) - self.dismiss(animated: true) { [weak self] in - guard let self else {return} - self.delegate?.tokenExpired() - } - }else{ - NotificationCenter.default.post(name: .playListRefresh, object: nil) // 플리목록창 이름 변경하기 위함 - self.dismiss(animated: true) - } - }) - .disposed(by: disposeBag) - - NotificationCenter.default.rx.notification(.playListRefresh) - .map{ _ in () } - .bind(to: input.playListLoad) - .disposed(by: disposeBag) - } - - private func configureUI() { - closeButton.setImage(DesignSystemAsset.Navigation.close.image, for: .normal) - - titleLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) - titleLabel.textColor = DesignSystemAsset.GrayColor.gray900.color - titleLabel.text = "리스트에 담기" - titleLabel.setTextWithAttributes(kernValue: -0.5) - - songCountLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 14) - songCountLabel.textColor = DesignSystemAsset.PrimaryColor.point.color - songCountLabel.text = "\(viewModel.songs.count)" - songCountLabel.setTextWithAttributes(kernValue: -0.5) - - subTitleLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 14) - subTitleLabel.textColor = DesignSystemAsset.PrimaryColor.sub3.color - subTitleLabel.text = "곡 선택" - subTitleLabel.setTextWithAttributes(kernValue: -0.5) - - indicator.type = .circleStrokeSpin - indicator.color = DesignSystemAsset.PrimaryColor.point.color - indicator.startAnimating() - } -} - -extension ContainSongsViewController : UITableViewDelegate { - public func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { - return 60 - } - - public func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { - let header = ContainPlayListHeaderView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: 140)) - header.delegate = self - return header - } - - public func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { - return 64 - } -} - -extension ContainSongsViewController : ContainPlayListHeaderViewDelegate { - public func action() { - let vc = multiPurposePopComponent.makeView(type: .creation) - vc.delegate = self - self.showEntryKitModal(content: vc, height: 296) - } -} - -extension ContainSongsViewController: MultiPurposePopupViewDelegate{ - public func didTokenExpired() { - PlayState.shared.switchPlayerMode(to: .mini) - self.dismiss(animated: true) {[weak self] in - - guard let self else {return} - - self.delegate?.tokenExpired() - } - } -} diff --git a/Projects/Features/CommonFeature/Sources/ViewControllers/ContractViewController.swift b/Projects/Features/CommonFeature/Sources/ViewControllers/ContractViewController.swift deleted file mode 100644 index 682869d11..000000000 --- a/Projects/Features/CommonFeature/Sources/ViewControllers/ContractViewController.swift +++ /dev/null @@ -1,124 +0,0 @@ -// -// ContractViewController.swift -// DesignSystem -// -// Created by yongbeomkwak on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import Utility -import RxSwift -import PDFKit -import DesignSystem -import NVActivityIndicatorView - -public enum ContractType{ - case privacy - case service -} - -extension ContractType{ - var title:String{ - switch self{ - case .privacy: - return "개인정보처리방침" - case .service: - return "서비스 이용약관" - } - } - - var url:String { - switch self{ - case .privacy: - return "\(BASE_IMAGE_URL())/static/document/privacy.pdf" - case .service: - return "\(BASE_IMAGE_URL())/static/document/terms.pdf" - } - } -} - -public final class ContractViewController: UIViewController, ViewControllerFromStoryBoard { - @IBOutlet weak var titleLabel: UILabel! - @IBOutlet weak var closeButton: UIButton! - @IBOutlet weak var fakeView: UIView! - @IBOutlet weak var confirmButton: UIButton! - @IBOutlet weak var activityIndicator: NVActivityIndicatorView! - - var type: ContractType = .privacy - var disposeBag = DisposeBag() - - public override func viewDidLoad() { - super.viewDidLoad() - configureUI() - bindRx() - } - - deinit { - DEBUG_LOG("❌ \(Self.self) deinit") - } - - public static func viewController(type: ContractType) -> ContractViewController { - let viewController = ContractViewController.viewController(storyBoardName: "CommonUI", bundle: Bundle.module) - viewController.type = type - return viewController - } -} - -extension ContractViewController{ - private func bindRx(){ - Observable.merge( - closeButton.rx.tap.map { _ in () }, - confirmButton.rx.tap.map { _ in () } - ) - .withUnretained(self) - .subscribe(onNext: { (owner, _) in - owner.dismiss(animated: true) - }) - .disposed(by: disposeBag) - } - - private func loadPdf(document:PDFDocument){ - let pdfView = PDFView(frame: self.fakeView.bounds) - pdfView.autoresizingMask = [.flexibleWidth, .flexibleHeight] - pdfView.autoScales = true - pdfView.displayMode = .singlePageContinuous - pdfView.displayDirection = .vertical - pdfView.document = document - self.fakeView.addSubview(pdfView) - activityIndicator.stopAnimating() - } - - private func configureUI(){ - self.navigationController?.setNavigationBarHidden(true, animated: false) - - activityIndicator.type = .circleStrokeSpin - activityIndicator.color = DesignSystemAsset.PrimaryColor.point.color - activityIndicator.startAnimating() - - confirmButton.setBackgroundColor(DesignSystemAsset.PrimaryColor.point.color, for: .normal) - confirmButton.layer.cornerRadius = 12 - confirmButton.clipsToBounds = true - confirmButton.setAttributedTitle(NSMutableAttributedString( - string: "확인", - attributes: [.font: DesignSystemFontFamily.Pretendard.medium.font(size: 18), - .foregroundColor: DesignSystemAsset.GrayColor.gray25.color, - .kern: -0.5 - ] - ), for: .normal) - closeButton.setImage(DesignSystemAsset.Navigation.crossClose.image, for: .normal) - - titleLabel.text = type.title - titleLabel.textColor = DesignSystemAsset.GrayColor.gray900.color - titleLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) - titleLabel.setTextWithAttributes(kernValue: -0.5) - - DispatchQueue.global(qos: .default).async { - if let url = URL(string: self.type.url), let document = PDFDocument(url: url) { - DispatchQueue.main.async { - self.loadPdf(document: document) // UI 작업이라 main 스레드로 - } - } - } - } -} diff --git a/Projects/Features/CommonFeature/Sources/ViewControllers/MultiPurposePopupViewController.swift b/Projects/Features/CommonFeature/Sources/ViewControllers/MultiPurposePopupViewController.swift deleted file mode 100644 index 07ff84038..000000000 --- a/Projects/Features/CommonFeature/Sources/ViewControllers/MultiPurposePopupViewController.swift +++ /dev/null @@ -1,383 +0,0 @@ -// -// CreatePlayListPopupViewController.swift -// DesignSystem -// -// Created by yongbeomkwak on 2023/01/21. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import Utility -import RxCocoa -import RxSwift -import RxKeyboard -import DesignSystem -import NVActivityIndicatorView -import SwiftEntryKit - -public enum PurposeType{ - case creation - case edit - case load - case share - case nickname -} - -extension PurposeType{ - var title:String{ - switch self{ - case .creation: - return "리스트 만들기" - case .edit: - return "리스트 수정하기" - case .load: - return "리스트 가져오기" - case .share: - return "리스트 공유하기" - case .nickname: - return "닉네임 수정" - } - } - - var subTitle:String{ - switch self{ - case .creation: - return "리스트 제목" - case .edit: - return "리스트 제목" - case .load: - return "리스트 코드" - case .share: - return "리스트 코드" - case .nickname: - return "닉네임" - } - } - - var btnText:String{ - switch self{ - case .creation: - return "리스트 생성" - case .edit: - return "리스트 수정" - case .load: - return "가져오기" - case .share: - return "확인" - case .nickname: - return "완료" - } - } -} - -public protocol MultiPurposePopupViewDelegate: AnyObject { - func didTokenExpired() -} - -public final class MultiPurposePopupViewController: UIViewController, ViewControllerFromStoryBoard { - @IBOutlet weak var saveButton: UIButton! - @IBOutlet weak var cancelButton: UIButton! - @IBOutlet weak var titleLabel: UILabel! - @IBOutlet weak var subTitleLabel: UILabel! - @IBOutlet weak var dividerView: UIView! - @IBOutlet weak var textField: UITextField! - @IBOutlet weak var countLabel: UILabel! - @IBOutlet weak var limitLabel: UILabel! - @IBOutlet weak var confirmLabel: UILabel! - - @IBOutlet weak var indicator: NVActivityIndicatorView! - - @IBOutlet weak var confireLabelGap: NSLayoutConstraint! - - @IBOutlet weak var cancelButtonHeight: NSLayoutConstraint! - - @IBOutlet weak var cancelButtonWidth: NSLayoutConstraint! - - @IBAction func cancelAction(_ sender: UIButton) { - if viewModel.type == .share{ - UIPasteboard.general.string = input.textString.value //클립보드 복사 - self.showToast(text: "복사가 완료되었습니다.", font: DesignSystemFontFamily.Pretendard.light.font(size: 14)) - - }else{ - textField.rx.text.onNext("") - input.textString.accept("") - } - } - - var viewModel:MultiPurposePopupViewModel! - lazy var input = MultiPurposePopupViewModel.Input() - lazy var output = viewModel.transform(from: input) - - var limitCount: Int = 12 - var creationCompletion: ((String) -> Void)? - var delegate: MultiPurposePopupViewDelegate? - public var disposeBag = DisposeBag() - - deinit { DEBUG_LOG("❌ \(Self.self) Deinit") } - - public override func viewDidLoad() { - super.viewDidLoad() - configureUI() - } - - public static func viewController( - viewModel: MultiPurposePopupViewModel, - completion: ((String) -> Void)? = nil - ) -> MultiPurposePopupViewController { - let viewController = MultiPurposePopupViewController.viewController(storyBoardName: "CommonUI", bundle: Bundle.module) - viewController.viewModel = viewModel - viewController.creationCompletion = completion - return viewController - } -} - -extension MultiPurposePopupViewController{ - private func configureUI() { - self.view.layer.cornerRadius = 24 - self.view.clipsToBounds = true - - titleLabel.text = viewModel.type.title - titleLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 18) - titleLabel.textColor = DesignSystemAsset.GrayColor.gray900.color - - subTitleLabel.text = viewModel.type.subTitle - subTitleLabel.font = DesignSystemFontFamily.Pretendard.light.font(size: 16) - subTitleLabel.textColor = DesignSystemAsset.GrayColor.gray400.color - - let headerFontSize:CGFloat = 20 - let focusedplaceHolderAttributes = [ - NSAttributedString.Key.foregroundColor: DesignSystemAsset.GrayColor.gray400.color, - NSAttributedString.Key.font : DesignSystemFontFamily.Pretendard.medium.font(size: headerFontSize) - ] // 포커싱 플레이스홀더 폰트 및 color 설정 - -// textField.becomeFirstResponder() - self.textField.attributedPlaceholder = NSAttributedString( - string: viewModel.type == .creation || viewModel.type == .edit ? - "리스트 제목을 입력하세요." : viewModel.type == .nickname ? "닉네임을 입력하세요." : "코드를 입력해주세요.", - attributes: focusedplaceHolderAttributes - ) //플레이스 홀더 설정 - self.textField.font = DesignSystemFontFamily.Pretendard.medium.font(size: headerFontSize) - - if viewModel.type == .share { //공유는 오직 읽기 전용 - self.textField.isEnabled = false - self.input.textString.accept(viewModel.key) - self.textField.text = viewModel.key - } - - self.dividerView.backgroundColor = DesignSystemAsset.GrayColor.gray200.color - - if viewModel.type == .share{ - self.cancelButtonWidth.constant = 32 - self.cancelButtonHeight.constant = 32 - self.cancelButton.setImage(DesignSystemAsset.Storage.copy.image, for: .normal) - - }else{ - self.cancelButton.layer.cornerRadius = 12 - self.cancelButton.titleLabel?.text = "취소" - self.cancelButton.titleLabel?.font = DesignSystemFontFamily.Pretendard.bold.font(size: 12) - self.cancelButton.layer.cornerRadius = 4 - self.cancelButton.layer.borderColor = DesignSystemAsset.GrayColor.gray200.color.cgColor - self.cancelButton.layer.borderWidth = 1 - self.cancelButton.backgroundColor = .white - self.cancelButton.isHidden = true - } - - switch viewModel.type { - - case .creation, .edit, .nickname: - self.confirmLabel.font = DesignSystemFontFamily.Pretendard.light.font(size: 12) - self.confirmLabel.isHidden = true - - self.limitLabel.font = DesignSystemFontFamily.Pretendard.light.font(size: 12) - self.limitLabel.textColor = DesignSystemAsset.GrayColor.gray500.color - - self.countLabel.font = DesignSystemFontFamily.Pretendard.light.font(size: 12) - self.countLabel.textColor = DesignSystemAsset.PrimaryColor.point.color - bindRxCreationOrEditOrNickName() - - case .load, .share: - self.confirmLabel.font = DesignSystemFontFamily.Pretendard.light.font(size: 12) - self.confirmLabel.textColor = DesignSystemAsset.GrayColor.gray500.color - self.confirmLabel.isHidden = false - self.confirmLabel.text = viewModel.type == .load ? "· 리스트 코드로 리스트를 가져올 수 있습니다." : "· 리스트 코드로 리스트를 공유할 수 있습니다." - self.confireLabelGap.constant = 12 - - self.limitLabel.isHidden = true - self.countLabel.isHidden = true - bindRxLoadOrShare() - } - - bindRxEvent() - - saveButton.layer.cornerRadius = 12 - saveButton.clipsToBounds = true - saveButton.setAttributedTitle(NSMutableAttributedString( - string: viewModel.type.btnText, - attributes: [.font: DesignSystemFontFamily.Pretendard.medium.font(size: 18), - .foregroundColor: DesignSystemAsset.GrayColor.gray25.color ] - ), for: .normal) - - saveButton.setBackgroundColor(DesignSystemAsset.PrimaryColor.point.color, for: .normal) - saveButton.setBackgroundColor(DesignSystemAsset.GrayColor.gray300.color, for: .disabled) - - self.indicator.type = .circleStrokeSpin - self.indicator.color = .white - } - - private func bindRxCreationOrEditOrNickName(){ - limitCount = viewModel.type == .nickname ? 8 : 12 - limitLabel.text = "/\(limitCount)" - - input.textString - .subscribe { [weak self] (str: String) in - guard let self = self else{ - return - } - - let errorColor = DesignSystemAsset.PrimaryColor.increase.color - let passColor = DesignSystemAsset.PrimaryColor.decrease.color - - self.countLabel.text = "\(str.count)자" - - if str.count == 0{ - self.cancelButton.isHidden = true - self.confirmLabel.isHidden = true - self.saveButton.isEnabled = false - self.dividerView.backgroundColor = DesignSystemAsset.GrayColor.gray200.color - self.countLabel.textColor = DesignSystemAsset.PrimaryColor.point.color - return - - }else{ - self.cancelButton.isHidden = false - self.confirmLabel.isHidden = false - self.countLabel.isHidden = false - } - - if str.isWhiteSpace { - self.dividerView.backgroundColor = errorColor - self.confirmLabel.text = "제목이 비어있습니다." - self.confirmLabel.textColor = errorColor - self.countLabel.textColor = errorColor - self.saveButton.isEnabled = false - - }else if str.count > self.limitCount { - self.dividerView.backgroundColor = errorColor - self.confirmLabel.text = "글자 수를 초과하였습니다." - self.confirmLabel.textColor = errorColor - self.countLabel.textColor = errorColor - self.saveButton.isEnabled = false - - }else { - self.dividerView.backgroundColor = passColor - self.confirmLabel.text = self.viewModel.type == .nickname ? "사용할 수 있는 닉네임입니다." : "사용할 수 있는 제목입니다." - self.confirmLabel.textColor = passColor - self.countLabel.textColor = DesignSystemAsset.PrimaryColor.point.color - self.saveButton.isEnabled = true - } - - }.disposed(by: disposeBag) - - output.newPlayListKey - .subscribe(onNext: { [weak self] (str: String) in - guard let self = self else{return} - self.creationCompletion?(str) - }) - .disposed(by: disposeBag) - } - - private func bindRxLoadOrShare() { - input.textString - .subscribe { [weak self] (str: String) in - guard let self = self else{ - return - } - - if str.count == 0 { - self.cancelButton.isHidden = true - self.saveButton.isEnabled = false - }else { - self.cancelButton.isHidden = false - if str.isWhiteSpace { - self.saveButton.isEnabled = false - }else{ - self.saveButton.isEnabled = true - } - } - }.disposed(by: disposeBag) - } - - private func bindRxEvent(){ - textField.rx.text.orEmpty - .skip(1) //바인드 할 때 발생하는 첫 이벤트를 무시 - .bind(to: input.textString) - .disposed(by: self.disposeBag) - - output.result.subscribe(onNext: { [weak self] res in - guard let self = self else{ - return - } - - self.indicator.stopAnimating() - self.saveButton.setAttributedTitle( - NSMutableAttributedString( - string: "완료", - attributes: [.font: DesignSystemFontFamily.Pretendard.medium.font(size: 18), - .foregroundColor: DesignSystemAsset.GrayColor.gray25.color] - ), for: .normal - ) - self.view.endEditing(true) - - // 토스트도 EntryKit을 사용하기 때문에 토스트만 띄워도 떠있던 팝업이 자동으로 내려감. - if res.status == 200 { - var description: String = "" - switch self.viewModel.type { - case .creation: - description = "리스트가 생성되었습니다." - case .edit: - description = "리스트가 수정되었습니다." - case .load: - description = "리스트를 가져왔습니다." - case .share: - SwiftEntryKit.dismiss() - return - case .nickname: - description = "닉네임이 수정되었습니다." - } - self.showToast( - text: description, - font: DesignSystemFontFamily.Pretendard.light.font(size: 14) - ) - - }else if res.status == 401 { - self.showToast(text: res.description, font: DesignSystemFontFamily.Pretendard.light.font(size: 14)) - LOGOUT() - if self.viewModel.type == .edit || self.viewModel.type == .creation { - self.delegate?.didTokenExpired() - } - - }else { - self.showToast(text: res.description, font: DesignSystemFontFamily.Pretendard.light.font(size: 14)) - } - }) - .disposed(by: disposeBag) - - saveButton.rx.tap.subscribe(onNext: { [weak self] in - guard let self = self else { - return - } - if self.viewModel.type != .share { - self.indicator.startAnimating() - self.saveButton.setAttributedTitle( - NSMutableAttributedString( - string: "", - attributes: [.font: DesignSystemFontFamily.Pretendard.medium.font(size: 18), - .foregroundColor: DesignSystemAsset.GrayColor.gray25.color] - ), for: .normal - ) - } - self.input.pressConfirm.onNext(()) - }) - .disposed(by: disposeBag) - } - -} diff --git a/Projects/Features/CommonFeature/Sources/ViewControllers/NewSongsContentViewController.swift b/Projects/Features/CommonFeature/Sources/ViewControllers/NewSongsContentViewController.swift deleted file mode 100644 index 4fc3cb5a0..000000000 --- a/Projects/Features/CommonFeature/Sources/ViewControllers/NewSongsContentViewController.swift +++ /dev/null @@ -1,229 +0,0 @@ -// -// NewSongsContentViewController.swift -// CommonFeature -// -// Created by KTH on 2023/11/15. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import Utility -import DesignSystem -import RxSwift -import RxCocoa -import NVActivityIndicatorView -import DomainModule - -public class NewSongsContentViewController: UIViewController, ViewControllerFromStoryBoard, SongCartViewType { - @IBOutlet weak var tableView: UITableView! - @IBOutlet weak var activityIncidator: NVActivityIndicatorView! - - var viewModel: NewSongsContentViewModel! - fileprivate lazy var input = NewSongsContentViewModel.Input() - fileprivate lazy var output = viewModel.transform(from: input) - var disposeBag = DisposeBag() - - private var containSongsComponent: ContainSongsComponent! - public var songCartView: SongCartView! - public var bottomSheetView: BottomSheetView! - private var refreshControl = UIRefreshControl() - - deinit { DEBUG_LOG("❌ \(Self.self) Deinit") } - - public override func viewDidLoad() { - super.viewDidLoad() - configureUI() - outputBind() - inputBind() - } - - public override func viewWillDisappear(_ animated: Bool) { - super.viewWillDisappear(animated) - self.input.allSongSelected.onNext(false) - } - - public static func viewController( - viewModel: NewSongsContentViewModel, - containSongsComponent: ContainSongsComponent - ) -> NewSongsContentViewController { - let viewController = NewSongsContentViewController.viewController(storyBoardName: "CommonUI", bundle: Bundle.module) - viewController.viewModel = viewModel - viewController.containSongsComponent = containSongsComponent - return viewController - } -} - -extension NewSongsContentViewController { - private func inputBind() { - tableView.rx - .setDelegate(self) - .disposed(by: disposeBag) - - tableView.rx.willDisplayCell - .map { $1 } - .withLatestFrom(output.dataSource, resultSelector: { (indexPath, datasource) -> (IndexPath, [NewSongsEntity]) in - return (indexPath, datasource) - }) - .filter{ (indexPath, datasources) -> Bool in - return indexPath.item == datasources.count-1 - } - .withLatestFrom(output.canLoadMore) - .filter{ $0 } - .map { _ in return () } - .bind(to: rx.loadMore) - .disposed(by: disposeBag) - - tableView.rx.itemSelected - .map{ $0.row } - .bind(to: input.songTapped) - .disposed(by: disposeBag) - - refreshControl.rx - .controlEvent(.valueChanged) - .bind(to: input.refreshPulled) - .disposed(by: disposeBag) - } - - private func outputBind() { - output.dataSource - .skip(1) - .do(onNext: { [weak self] (model) in - guard let `self` = self else { return } - self.activityIncidator.stopAnimating() - self.refreshControl.endRefreshing() - let space: CGFloat = APP_HEIGHT() - 48 - 40 - 56 - 56 - STATUS_BAR_HEGHIT() - SAFEAREA_BOTTOM_HEIGHT() - let height: CGFloat = space / 3 * 2 - let warningView: WarningView = WarningView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: height)) - warningView.text = "데이터가 없습니다." - self.tableView.tableFooterView = model.isEmpty ? warningView : UIView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: PLAYER_HEIGHT())) - }) - .bind(to: tableView.rx.items) { (tableView, index, model) -> UITableViewCell in - let indexPath: IndexPath = IndexPath(row: index, section: 0) - guard let cell = tableView.dequeueReusableCell( - withIdentifier: "NewSongsCell", - for: indexPath - ) as? NewSongsCell else { - return UITableViewCell() - } - cell.update(model: model) - return cell - } - .disposed(by: disposeBag) - - output.indexOfSelectedSongs - .skip(1) - .withLatestFrom(output.dataSource) { ($0, $1) } - .subscribe(onNext: { [weak self] (songs, dataSource) in - guard let self = self else { return } - switch songs.isEmpty { - case true : - self.hideSongCart() - case false: - self.showSongCart( - in: self.view, - type: .chartSong, - selectedSongCount: songs.count, - totalSongCount: dataSource.count, - useBottomSpace: false - ) - self.songCartView?.delegate = self - } - }).disposed(by: disposeBag) - - output.songEntityOfSelectedSongs - .filter{ !$0.isEmpty } - .subscribe() - .disposed(by: disposeBag) - - output.updateTime - .filter { !$0.isEmpty } - .subscribe(onNext: { [weak self] _ in - self?.tableView.reloadData() - }) - .disposed(by: disposeBag) - } - - private func configureUI() { - self.view.backgroundColor = DesignSystemAsset.GrayColor.gray100.color - self.activityIncidator.type = .circleStrokeSpin - self.activityIncidator.color = DesignSystemAsset.PrimaryColor.point.color - self.activityIncidator.startAnimating() - self.tableView.backgroundColor = .clear - self.tableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: PLAYER_HEIGHT())) - self.tableView.scrollIndicatorInsets = UIEdgeInsets(top: 0, left: 0, bottom: PLAYER_HEIGHT(), right: 0) - self.tableView.refreshControl = refreshControl - - if #available(iOS 15.0, *) { - tableView.sectionHeaderTopPadding = 0 - } - } -} - -extension NewSongsContentViewController: UITableViewDelegate { - public func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { - return 60 - } - - public func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { - return 80 + 22 - } - - public func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { - let base = UIView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: 88+22)) - - let view = PlayButtonGroupView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: 80)) - view.delegate = self - base.addSubview(view) - - let time = ChartUpdateTimeView(frame: CGRect(x: 0, y: view.frame.height, width: APP_WIDTH(), height: 22)) - time.setUpdateTime(updateTime: self.output.updateTime.value) - base.addSubview(time) - - return base - } -} - -extension NewSongsContentViewController: PlayButtonGroupViewDelegate{ - public func pressPlay(_ event: PlayEvent) { - input.groupPlayTapped.onNext(event) - } -} - -extension NewSongsContentViewController: SongCartViewDelegate { - public func buttonTapped(type: SongCartSelectType) { - switch type { - case let .allSelect(flag): - input.allSongSelected.onNext(flag) - - case .addSong: - let songs: [String] = output.songEntityOfSelectedSongs.value.map { $0.id } - let viewController = containSongsComponent.makeView(songs: songs) - viewController.modalPresentationStyle = .overFullScreen - self.present(viewController, animated: true) { - self.input.allSongSelected.onNext(false) - } - - case .addPlayList: - let songs = output.songEntityOfSelectedSongs.value - PlayState.shared.appendSongsToPlaylist(songs) - self.input.allSongSelected.onNext(false) - - case .play: - let songs = output.songEntityOfSelectedSongs.value - PlayState.shared.loadAndAppendSongsToPlaylist(songs) - self.input.allSongSelected.onNext(false) - - case .remove: - return - } - } -} - -extension Reactive where Base: NewSongsContentViewController{ - var loadMore: Binder { - return Binder(base) { viewController, _ in - let pageID = viewController.input.pageID.value - viewController.input.pageID.accept(pageID + 1) - } - } -} diff --git a/Projects/Features/CommonFeature/Sources/ViewControllers/NewSongsViewController.swift b/Projects/Features/CommonFeature/Sources/ViewControllers/NewSongsViewController.swift deleted file mode 100644 index b2a6fce1c..000000000 --- a/Projects/Features/CommonFeature/Sources/ViewControllers/NewSongsViewController.swift +++ /dev/null @@ -1,119 +0,0 @@ -// -// NewSongsViewController.swift -// CommonFeature -// -// Created by KTH on 2023/11/15. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import Utility -import DesignSystem -import Tabman -import Pageboy -import DataMappingModule - -public class NewSongsViewController: TabmanViewController, ViewControllerFromStoryBoard { - @IBOutlet weak var backButton: UIButton! - @IBOutlet weak var navigationTitleLabel: UILabel! - @IBOutlet weak var tabBarContentView: UIView! - - private var newSongsContentComponent: NewSongsContentComponent! - private lazy var viewControllers: [NewSongsContentViewController] = { - let viewControllers = NewSongGroupType.allCases.map { - self.newSongsContentComponent.makeView(type: $0) - } - return viewControllers - }() - - deinit { DEBUG_LOG("❌ \(Self.self) Deinit") } - - public override func viewDidLoad() { - super.viewDidLoad() - configureUI() - configurePage() - } - - public static func viewController( - newSongsContentComponent: NewSongsContentComponent - ) -> NewSongsViewController { - let viewController = NewSongsViewController.viewController(storyBoardName: "CommonUI", bundle: Bundle.module) - viewController.newSongsContentComponent = newSongsContentComponent - return viewController - } - - @IBAction func backButtonAction(_ sender: Any) { - self.navigationController?.popViewController(animated: true) - } -} - -extension NewSongsViewController { - private func configureUI() { - self.view.backgroundColor = DesignSystemAsset.GrayColor.gray100.color - self.backButton.setImage(DesignSystemAsset.Navigation.back.image, for: .normal) - self.navigationTitleLabel.text = "최신 음악" - self.navigationTitleLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) - self.navigationTitleLabel.textColor = DesignSystemAsset.GrayColor.gray900.color - self.navigationTitleLabel.setTextWithAttributes(kernValue: -0.5) - } - - private func configurePage() { - self.dataSource = self - let bar = TMBar.ButtonBar() - - // 배경색 - bar.backgroundView.style = .clear - - // 간격 설정 - bar.layout.contentInset = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20) - bar.layout.contentMode = .fit - bar.layout.transitionStyle = .progressive - - // 버튼 글씨 커스텀 - bar.buttons.customize { (button) in - button.tintColor = DesignSystemAsset.GrayColor.gray400.color - button.selectedTintColor = DesignSystemAsset.GrayColor.gray900.color - button.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) - button.selectedFont = DesignSystemFontFamily.Pretendard.bold.font(size: 16) - } - - // indicator - bar.indicator.weight = .custom(value: 2) - bar.indicator.tintColor = DesignSystemAsset.PrimaryColor.point.color - bar.indicator.overscrollBehavior = .compress - - addBar(bar, dataSource: self, at: .custom(view: tabBarContentView, layout: nil)) - } -} - -extension NewSongsViewController: PageboyViewControllerDataSource, TMBarDataSource { - public func barItem(for bar: TMBar, at index: Int) -> TMBarItemable { - switch index { - case 0: - return TMBarItem(title: NewSongGroupType.all.display) - case 1: - return TMBarItem(title: NewSongGroupType.woowakgood.display) - case 2: - return TMBarItem(title: NewSongGroupType.isedol.display) - case 3: - return TMBarItem(title: NewSongGroupType.gomem.display) - case 4: - return TMBarItem(title: NewSongGroupType.academy.display) - default: - let title = "Page \(index)" - return TMBarItem(title: title) - } - } - - public func numberOfViewControllers(in pageboyViewController: PageboyViewController) -> Int { - return viewControllers.count - } - - public func viewController(for pageboyViewController: PageboyViewController, at index: PageboyViewController.PageIndex) -> UIViewController? { - return viewControllers[index] - } - - public func defaultPage(for pageboyViewController: PageboyViewController) -> PageboyViewController.Page? { - return nil - } -} diff --git a/Projects/Features/CommonFeature/Sources/ViewControllers/NoticePopupViewController.swift b/Projects/Features/CommonFeature/Sources/ViewControllers/NoticePopupViewController.swift deleted file mode 100644 index 9ebd07c37..000000000 --- a/Projects/Features/CommonFeature/Sources/ViewControllers/NoticePopupViewController.swift +++ /dev/null @@ -1,185 +0,0 @@ -// -// NoticePopupViewController.swift -// DesignSystem -// -// Created by KTH on 2023/01/29. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import Utility -import PanModal -import SnapKit -import Then -import DesignSystem -import RxSwift -import RxCocoa -import DomainModule - -public protocol NoticePopupViewControllerDelegate: AnyObject { - func noticeTapped(model: FetchNoticeEntity) -} - -public class NoticePopupViewController: UIViewController, ViewControllerFromStoryBoard { - @IBOutlet weak var collectionView: UICollectionView! - @IBOutlet weak var pageCountView: UIView! - @IBOutlet weak var pageCountLabel: UILabel! - @IBOutlet weak var ignoreButton: UIButton! - @IBOutlet weak var confirmButton: UIButton! - - public weak var delegate: NoticePopupViewControllerDelegate? - var viewModel: NoticePopupViewModel! - var disposeBag = DisposeBag() - - deinit { - DEBUG_LOG("\(Self.self) Deinit") - } - - public override func viewDidLoad() { - super.viewDidLoad() - configureUI() - bind() - } - - public static func viewController( - viewModel: NoticePopupViewModel - ) -> NoticePopupViewController { - let viewController = NoticePopupViewController.viewController(storyBoardName: "CommonUI", bundle: Bundle.module) - viewController.viewModel = viewModel - return viewController - } - - @IBAction func ignoreButtonAction(_ sender: Any) { - let savedIgoredNoticeIds: [Int] = Utility.PreferenceManager.ignoredNoticeIDs ?? [] - let currentNoticeIds: [Int] = viewModel.output.ids.value - - if savedIgoredNoticeIds.isEmpty { - Utility.PreferenceManager.ignoredNoticeIDs = currentNoticeIds - }else{ - Utility.PreferenceManager.ignoredNoticeIDs = savedIgoredNoticeIds + currentNoticeIds - } - dismiss(animated: true) - } - - @IBAction func confirmButtonAction(_ sender: Any) { - dismiss(animated: true) - } -} - -extension NoticePopupViewController { - private func bind() { - viewModel.output - .dataSource - .do(onNext: { [weak self] (model) in - self?.pageCountLabel.text = "1/\(model.count)" - self?.pageCountView.isHidden = model.count <= 1 - }) - .bind(to: collectionView.rx.items) { (collectionView, row, model) -> UICollectionViewCell in - guard let cell = collectionView.dequeueReusableCell( - withReuseIdentifier: "NoticeCollectionViewCell", - for: IndexPath(row: row, section: 0) - ) as? NoticeCollectionViewCell else { return UICollectionViewCell() } - cell.update(model: model) - return cell - } - .disposed(by: disposeBag) - - collectionView.rx.itemSelected - .withUnretained(self) - .subscribe(onNext:{ (owner, indexPath) in - owner.dismiss(animated: true) { - owner.delegate?.noticeTapped(model: owner.viewModel.fetchNoticeEntities[indexPath.row]) - } - }).disposed(by: disposeBag) - } - - private func configureUI() { - self.view.backgroundColor = .white - - let ignoreButtonAttributedString = NSMutableAttributedString.init(string: "다시보지 않기") - ignoreButtonAttributedString.addAttributes([.font: DesignSystemFontFamily.Pretendard.medium.font(size: 18), - .foregroundColor: DesignSystemAsset.GrayColor.gray25.color, - .kern: -0.5], - range: NSRange(location: 0, length: ignoreButtonAttributedString.string.count)) - ignoreButton.backgroundColor = DesignSystemAsset.GrayColor.gray400.color - ignoreButton.layer.cornerRadius = 12 - ignoreButton.setAttributedTitle(ignoreButtonAttributedString, for: .normal) - - - let confirmButtonAttributedString = NSMutableAttributedString.init(string: "닫기") - confirmButtonAttributedString.addAttributes([.font: DesignSystemFontFamily.Pretendard.medium.font(size: 18), - .foregroundColor: DesignSystemAsset.GrayColor.gray25.color, - .kern: -0.5], - range: NSRange(location: 0, length: confirmButtonAttributedString.string.count)) - confirmButton.backgroundColor = DesignSystemAsset.PrimaryColor.point.color - confirmButton.layer.cornerRadius = 12 - confirmButton.setAttributedTitle(confirmButtonAttributedString, for: .normal) - - pageCountView.layer.cornerRadius = 12 - pageCountView.backgroundColor = DesignSystemAsset.GrayColor.gray900.color.withAlphaComponent(0.2) - pageCountView.clipsToBounds = true - pageCountView.isHidden = true - - pageCountLabel.textColor = DesignSystemAsset.GrayColor.gray25.color - pageCountLabel.font = DesignSystemFontFamily.SCoreDream._3Light.font(size: 14) - - collectionView.register(UINib(nibName: "NoticeCollectionViewCell", bundle: Bundle.module), forCellWithReuseIdentifier: "NoticeCollectionViewCell") - collectionView.isPagingEnabled = true - collectionView.rx.setDelegate(self).disposed(by: disposeBag) - collectionView.bounces = false - } -} - -extension NoticePopupViewController: UIScrollViewDelegate { - public func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { - let i = Int(scrollView.contentOffset.x / APP_WIDTH()) - self.pageCountLabel.text = "\(i+1)/\(viewModel.output.dataSource.value.count)" - } -} - -extension NoticePopupViewController: UICollectionViewDelegateFlowLayout, UICollectionViewDelegate { - public func collectionView(_ collectionView: UICollectionView, - layout collectionViewLayout: UICollectionViewLayout, - sizeForItemAt indexPath: IndexPath) -> CGSize { - return CGSize(width: APP_WIDTH(), height: APP_WIDTH()) - } - - public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat { - return 0 - } - - public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { - return 0 - } -} - -extension NoticePopupViewController: PanModalPresentable { - - public override var preferredStatusBarStyle: UIStatusBarStyle { - return .lightContent - } - - public var panModalBackgroundColor: UIColor { - return colorFromRGB(0x000000, alpha: 0.4) - } - - public var panScrollable: UIScrollView? { - return nil - } - - public var longFormHeight: PanModalHeight { - return PanModalHeight.contentHeight(APP_WIDTH() + 20 + 56 + 20) - } - - public var cornerRadius: CGFloat { - return 24.0 - } - - public var allowsExtendedPanScrolling: Bool { - return true - } - - public var showDragIndicator: Bool { - return false - } -} diff --git a/Projects/Features/CommonFeature/Sources/ViewControllers/PlayListDetailViewController.swift b/Projects/Features/CommonFeature/Sources/ViewControllers/PlayListDetailViewController.swift deleted file mode 100644 index ccc8f2196..000000000 --- a/Projects/Features/CommonFeature/Sources/ViewControllers/PlayListDetailViewController.swift +++ /dev/null @@ -1,517 +0,0 @@ -// -// PlayListDetailViewController.swift -// StorageFeature -// -// Created by yongbeomkwak on 2023/01/15. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// -import UIKit -import Utility -import RxRelay -import RxSwift -import RxCocoa -import RxDataSources -import PanModal -import DesignSystem -import BaseFeature -import Kingfisher -import DomainModule -import NVActivityIndicatorView - -public class PlayListDetailViewController: BaseViewController,ViewControllerFromStoryBoard, SongCartViewType, EditSheetViewType { - @IBOutlet weak var backButton: UIButton! - @IBOutlet weak var moreButton: UIButton! - @IBOutlet weak var completeButton: UIButton! - @IBOutlet weak var playListImage: UIImageView! - @IBOutlet weak var playListNameLabel: UILabel! - @IBOutlet weak var playListCountLabel: UILabel! - @IBOutlet weak var editPlayListNameButton: UIButton! - @IBOutlet weak var tableView: UITableView! - @IBOutlet weak var editStateLabel: UILabel! - @IBOutlet weak var playListInfoView: UIView! - @IBOutlet weak var playListInfoSuperView: UIView! - @IBOutlet weak var activityIndicator: NVActivityIndicatorView! - - var disposeBag = DisposeBag() - var viewModel:PlayListDetailViewModel! - lazy var input = PlayListDetailViewModel.Input() - lazy var output = viewModel.transform(from: input) - var multiPurposePopComponent:MultiPurposePopComponent! - var containSongsComponent:ContainSongsComponent! - - public var editSheetView: EditSheetView! - public var songCartView: SongCartView! - public var bottomSheetView: BottomSheetView! - - let playState = PlayState.shared - - @IBAction func backButtonAction(_ sender: UIButton) { - - let isEdit: Bool = input.state.value.isEditing - - if isEdit { - let vc = TextPopupViewController.viewController(text: "변경된 내용을 저장할까요?", cancelButtonIsHidden: false,completion: {[weak self] in - guard let self = self else { - return - } - self.input.runEditing.onNext(()) - self.navigationController?.popViewController(animated: true) - - }, cancelCompletion: { [weak self] in - guard let self = self else { - return - } - self.input.state.accept(EditState(isEditing: false, force: true)) - self.input.cancelEdit.onNext(()) - self.input.runEditing.onNext(()) - }) - self.showPanModal(content: vc) - - }else{ - self.navigationController?.popViewController(animated: true) - } - } - - @IBAction func pressEditListAction(_ sender: UIButton) { - self.moreButton.isSelected = !self.moreButton.isSelected - - if self.moreButton.isSelected { - self.showEditSheet(in: self.view, type: .playList) - self.editSheetView.delegate = self - }else{ - self.hideEditSheet() - } - } - - @IBAction func pressCompleteAction(_ sender: UIButton) { - input.state.accept(EditState(isEditing: false, force: false)) - } - - @IBAction func pressEditNameAction(_ sender: UIButton) { - let multiPurposePopVc = multiPurposePopComponent.makeView(type: .edit, key: viewModel.key!) - multiPurposePopVc.delegate = self - self.showEntryKitModal(content: multiPurposePopVc, height: 296) - } - - public override func viewDidLoad() { - super.viewDidLoad() - configureUI() - bindRx() - bindSelectedEvent() - } - - public override func viewDidAppear(_ animated: Bool) { - super.viewDidAppear(animated) - navigationController?.interactivePopGestureRecognizer?.delegate = nil - } - - public override func viewWillDisappear(_ animated: Bool) { - super.viewWillDisappear(animated) - self.hideEditSheet() - self.moreButton.isSelected = false - } - - deinit { - DEBUG_LOG("\(Self.self) deinit") - } - - public static func viewController( - viewModel: PlayListDetailViewModel, - multiPurposePopComponent: MultiPurposePopComponent, - containSongsComponent: ContainSongsComponent - ) -> PlayListDetailViewController { - let viewController = PlayListDetailViewController.viewController(storyBoardName: "CommonUI", bundle: Bundle.module) - viewController.viewModel = viewModel - viewController.multiPurposePopComponent = multiPurposePopComponent - viewController.containSongsComponent = containSongsComponent - return viewController - } -} - -public typealias PlayListDetailSectionModel = SectionModel - -extension PlayListDetailViewController{ - - private func configureUI(){ - self.view.backgroundColor = DesignSystemAsset.GrayColor.gray100.color - self.tableView.backgroundColor = .clear - self.tableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: 56)) - self.tableView.scrollIndicatorInsets = UIEdgeInsets(top: 0, left: 0, bottom: 56, right: 0) - - self.activityIndicator.color = DesignSystemAsset.PrimaryColor.point.color - self.activityIndicator.type = .circleStrokeSpin - self.activityIndicator.startAnimating() - - self.completeButton.isHidden = true - self.editStateLabel.isHidden = true - - self.backButton.setImage(DesignSystemAsset.Navigation.back.image, for: .normal) - self.moreButton.setImage(DesignSystemAsset.Storage.more.image, for: .normal) - - self.completeButton.titleLabel?.text = "완료" - self.completeButton.titleLabel?.font = DesignSystemFontFamily.Pretendard.bold.font(size: 12) - self.completeButton.layer.cornerRadius = 4 - self.completeButton.layer.borderColor = DesignSystemAsset.PrimaryColor.point.color.cgColor - self.completeButton.layer.borderWidth = 1 - self.completeButton.backgroundColor = .clear - - self.editStateLabel.text = "편집" - self.editStateLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) - self.editStateLabel.setTextWithAttributes(kernValue: -0.5) - - self.playListCountLabel.font = DesignSystemFontFamily.Pretendard.light.font(size: 14) - self.playListCountLabel.textColor = DesignSystemAsset.GrayColor.gray900.color.withAlphaComponent(0.6) // opacity 60% - self.playListCountLabel.setTextWithAttributes(kernValue: -0.5) - - self.playListNameLabel.font = DesignSystemFontFamily.Pretendard.bold.font(size: 20) - self.playListNameLabel.setTextWithAttributes(kernValue: -0.5) - - playListInfoView.layer.borderWidth = 1 - playListInfoView.layer.borderColor = colorFromRGB(0xFCFCFD).cgColor - playListInfoView.layer.cornerRadius = 8 - - self.playListImage.layer.cornerRadius = 12 - self.moreButton.isHidden = viewModel.type == .wmRecommend - self.editPlayListNameButton.isHidden = true - } - - private func createDatasources() -> RxTableViewSectionedReloadDataSource { - let datasource = RxTableViewSectionedReloadDataSource(configureCell: { [weak self] (_, tableView, indexPath, model) -> UITableViewCell in - guard let self = self else { return UITableViewCell() } - - switch self.viewModel.type { - - case .custom: - guard let cell = tableView.dequeueReusableCell(withIdentifier: "PlayListTableViewCell", for: IndexPath(row: indexPath.row, section: 0)) as? PlayListTableViewCell else{ - return UITableViewCell() - } - cell.update(model,self.input.state.value.isEditing, index: indexPath.row) - cell.delegate = self - return cell - - case .wmRecommend: - guard let cell = tableView.dequeueReusableCell(withIdentifier: "SongListCell", for: IndexPath(row: indexPath.row, section: 0)) as? SongListCell else{ - return UITableViewCell() - } - cell.update(model) - return cell - - case .none: - return UITableViewCell() - } - - }, canEditRowAtIndexPath: { (_, _) -> Bool in - return true - }, canMoveRowAtIndexPath: { (_, _) -> Bool in - return true - }) - return datasource - } - - private func bindRx() { - - tableView.rx.setDelegate(self).disposed(by: disposeBag) - tableView.register(UINib(nibName:"SongListCell", bundle: CommonFeatureResources.bundle), forCellReuseIdentifier: "SongListCell") - - //xib로 만든 UI를 컬렉션 뷰에서 사용하기 위해서는 등록이 필요 - //다른 모듈 시 번들 변경 Bundle.module 사용 X - - output.dataSource - .skip(1) - .do(onNext: { [weak self] model in - guard let self = self else { - return - } - self.activityIndicator.stopAnimating() - - let warningView = WarningView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: APP_HEIGHT()/3)) - warningView.text = "리스트에 곡이 없습니다." - - let items = model.first?.items ?? [] - self.tableView.tableFooterView = items.isEmpty ? warningView : UIView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: 56)) - }) - .bind(to: tableView.rx.items(dataSource: createDatasources())) - .disposed(by: disposeBag) - - tableView.rx.itemMoved - .bind(to: input.itemMoved) - .disposed(by: disposeBag) - - input.state - .skip(1) - .subscribe(onNext: { [weak self] (state) in - guard let self = self else { return } - let type = self.viewModel.type ?? .wmRecommend - - switch type { - case .custom: - if state.isEditing == false && state.force == false { - self.input.runEditing.onNext(()) - } - - let isEdit = state.isEditing - self.navigationController?.interactivePopGestureRecognizer?.delegate = isEdit ? self : nil - - self.moreButton.isHidden = isEdit - self.completeButton.isHidden = !isEdit - self.editStateLabel.isHidden = !isEdit - self.editPlayListNameButton.isHidden = !isEdit - - self.tableView.setEditing(isEdit, animated: true) - self.tableView.reloadData() - - case .wmRecommend: - self.navigationController?.interactivePopGestureRecognizer?.delegate = nil - self.moreButton.isHidden = true - self.completeButton.isHidden = true - self.editStateLabel.isHidden = true - self.editPlayListNameButton.isHidden = true - } - }) - .disposed(by: disposeBag) - - output.headerInfo - .do(onNext: { [weak self] _ in - guard let self = self else { return } - let imageHeight: CGFloat = (140.0*APP_WIDTH())/375.0 - let newFrame: CGRect = CGRect(x: 0, y: 0, width: APP_WIDTH(), height: imageHeight + 20) - self.tableView.tableHeaderView?.frame = newFrame - }) - .subscribe(onNext: { [weak self] (model) in - guard let self = self else{ - return - } - let type = self.viewModel.type - - self.playListImage.kf.setImage( - with: type == .wmRecommend ? WMImageAPI.fetchRecommendPlayListWithSquare(id: model.image,version: model.version).toURL : WMImageAPI.fetchPlayList(id: model.image,version: model.version).toURL, - placeholder: nil, - options: [.transition(.fade(0.2))] - ) - self.playListCountLabel.text = model.songCount - self.playListNameLabel.text = model.title - self.editPlayListNameButton.setImage(DesignSystemAsset.Storage.storageEdit.image, for: .normal) - }).disposed(by: disposeBag) - - output.showErrorToast - .subscribe(onNext: { [weak self] in - guard let self = self else { return } - self.showToast(text: $0.description, font: DesignSystemFontFamily.Pretendard.light.font(size: 14)) - - if $0.status == 401 { - LOGOUT() - self.navigationController?.popViewController(animated: true) - - }else{ - self.input.state.accept(EditState(isEditing: false, force: true)) - } - }) - .disposed(by: disposeBag) - - tableView.rx.itemSelected - .withLatestFrom(output.dataSource) { ($0, $1) } - .withLatestFrom(input.state) { ($0.0, $0.1, $1) } - .filter { $0.2.isEditing == false } - .subscribe(onNext: { [weak self] (indexPath, dataSource, _) in - guard let self else {return} - - guard let type = self.viewModel.type else { - return - } - - switch type { - - case .custom: - let song:SongEntity = dataSource[indexPath.section].items[indexPath.row] - playState.loadAndAppendSongsToPlaylist([song]) - case .wmRecommend: - input.songTapped.onNext(indexPath.row) - } - - }) - .disposed(by: disposeBag) - - output.groupPlaySongs - .subscribe(onNext: { [weak self] songs in - guard let self = self else {return} - self.playState.loadAndAppendSongsToPlaylist(songs) - }) - .disposed(by: disposeBag) - - Utility.PreferenceManager.$startPage - .skip(1) - .subscribe(onNext: { [weak self] _ in - guard let self = self else {return} - self.input.allSongSelected.onNext(false) - self.input.state.accept(EditState(isEditing: false, force: true)) - }).disposed(by: disposeBag) - } - - private func bindSelectedEvent() { - - output.indexOfSelectedSongs - .skip(1) - .withLatestFrom(output.dataSource) {($0,$1)} - .withLatestFrom(input.state) { ($0,$1)} - .subscribe(onNext: { [weak self] (arg0, _) in - let (songs, dataSource) = arg0 - guard let self = self else {return} - guard let type = self.viewModel.type else { - return - } - - switch type { - - case .custom: - switch songs.isEmpty { - case true: - self.hideSongCart() - - case false: - self.showSongCart( - in: self.view, - type: .myList, - selectedSongCount: songs.count, - totalSongCount: (dataSource.first?.items.count ?? 0), - useBottomSpace: false - ) - self.songCartView?.delegate = self - } - case .wmRecommend: - switch songs.isEmpty { - case true: - self.hideSongCart() - - case false: - self.showSongCart( - in: self.view, - type: .WMPlayList, - selectedSongCount: songs.count, - totalSongCount: (dataSource.first?.items.count ?? 0), - useBottomSpace: false - ) - self.songCartView?.delegate = self - } - } - }) - .disposed(by: disposeBag) - } -} - -extension PlayListDetailViewController:UITableViewDelegate{ - - public func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { - let view = PlayButtonGroupView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: 80)) - view.delegate = self - let items = output.dataSource.value.first?.items ?? [] - return items.isEmpty ? nil : view - } - - public func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { - let items = output.dataSource.value.first?.items ?? [] - return items.isEmpty ? 0 : 80 - } - - public func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { - return 60 - } - - public func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell.EditingStyle { - return .none // 편집모드 시 왼쪽 버튼을 숨기려면 .none을 리턴합니다. - } - - public func tableView(_ tableView: UITableView, shouldIndentWhileEditingRowAt indexPath: IndexPath) -> Bool { - return false // 편집모드 시 셀의 들여쓰기를 없애려면 false를 리턴합니다. - } -} - -extension PlayListDetailViewController: MultiPurposePopupViewDelegate { - public func didTokenExpired() { - self.navigationController?.popViewController(animated: true) - } -} - -extension PlayListDetailViewController: PlayButtonGroupViewDelegate{ - public func pressPlay(_ event: PlayEvent) { - input.groupPlayTapped.onNext(event) - } -} - -extension PlayListDetailViewController: UIGestureRecognizerDelegate { - public func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { - return false - } -} - -extension PlayListDetailViewController:SongCartViewDelegate { - public func buttonTapped(type: SongCartSelectType) { - - switch type { - case let .allSelect(flag): - input.allSongSelected.onNext(flag) - - case .addSong: - let songs: [String] = output.songEntityOfSelectedSongs.value.map { $0.id } - let viewController = containSongsComponent.makeView(songs: songs) - viewController.modalPresentationStyle = .overFullScreen - self.present(viewController, animated: true) { - self.input.allSongSelected.onNext(false) - self.input.state.accept(EditState(isEditing: false, force: true)) - } - case .addPlayList: - let songs: [SongEntity] = output.songEntityOfSelectedSongs.value - playState.appendSongsToPlaylist(songs) - self.input.allSongSelected.onNext(false) - self.input.state.accept(EditState(isEditing: false, force: true)) - - case .play: - let songs: [SongEntity] = output.songEntityOfSelectedSongs.value - playState.loadAndAppendSongsToPlaylist(songs) - self.input.allSongSelected.onNext(false) - self.input.state.accept(EditState(isEditing: false, force: true)) - - case .remove: - let count: Int = output.songEntityOfSelectedSongs.value.count - let popup = TextPopupViewController.viewController( - text: "선택한 내 리스트 \(count)곡이 삭제됩니다.", - cancelButtonIsHidden: false, - completion: { [weak self] () in - guard let `self` = self else { return } - self.input.tapRemoveSongs.onNext(()) - }) - self.showPanModal(content: popup) - } - } -} - -extension PlayListDetailViewController:EditSheetViewDelegate { - public func buttonTapped(type: EditSheetSelectType) { - switch type { - case .edit: - input.state.accept(EditState(isEditing: true, force: false)) - - case .share: - let vc = multiPurposePopComponent.makeView(type: .share,key: viewModel?.key ?? "") - self.showEntryKitModal(content: vc, height: 296) - - case .profile: - return - - case .nickname: - return - } - self.hideEditSheet() - self.moreButton.isSelected = false - } -} - -extension PlayListDetailViewController:PlayListCellDelegate { - public func buttonTapped(type: PlayListCellDelegateConstant) { - switch type { - case let .listTapped(index): - input.songTapped.onNext(index) - case let .playTapped(song): - playState.loadAndAppendSongsToPlaylist([song]) - } - } -} diff --git a/Projects/Features/CommonFeature/Sources/ViewControllers/ProfilePopViewController.swift b/Projects/Features/CommonFeature/Sources/ViewControllers/ProfilePopViewController.swift deleted file mode 100644 index 99c19f12d..000000000 --- a/Projects/Features/CommonFeature/Sources/ViewControllers/ProfilePopViewController.swift +++ /dev/null @@ -1,218 +0,0 @@ -// -// ProfilePopViewController.swift -// DesignSystem -// -// Created by yongbeomkwak on 2023/01/26. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import Utility -import PanModal -import RxCocoa -import RxRelay -import RxSwift -import DesignSystem -import DomainModule -import NVActivityIndicatorView - -public final class ProfilePopViewController: UIViewController, ViewControllerFromStoryBoard { - - @IBOutlet weak var collectionVIewHeight: NSLayoutConstraint! - @IBOutlet weak var titleLabel: UILabel! - @IBOutlet weak var collectionView: UICollectionView! - @IBOutlet weak var saveButton: UIButton! - @IBOutlet weak var dataLoadActivityIndicator: NVActivityIndicatorView! - @IBOutlet weak var activityIndicator: NVActivityIndicatorView! - - var viewModel: ProfilePopViewModel! - var disposeBag = DisposeBag() - var rowHeight:CGFloat = (( APP_WIDTH() - 70) / 4) * 2 - - deinit { - DEBUG_LOG("\(Self.self) deinit") - } - - public override func viewDidLoad() { - super.viewDidLoad() - - configureUI() - bindRx() - } - - public static func viewController(viewModel: ProfilePopViewModel) -> ProfilePopViewController { - let viewController = ProfilePopViewController.viewController(storyBoardName: "CommonUI", bundle: Bundle.module) - viewController.viewModel = viewModel - return viewController - } -} - -extension ProfilePopViewController{ - - private func configureUI(){ - saveButton.backgroundColor = DesignSystemAsset.PrimaryColor.point.color - saveButton.layer.cornerRadius = 12 - saveButton.clipsToBounds = true - saveButton.setAttributedTitle( - NSMutableAttributedString( - string:"완료", - attributes: [.font: DesignSystemFontFamily.Pretendard.medium.font(size: 18), - .foregroundColor: DesignSystemAsset.GrayColor.gray25.color] - ), for: .normal - ) - - self.dataLoadActivityIndicator.type = .circleStrokeSpin - self.dataLoadActivityIndicator.color = DesignSystemAsset.PrimaryColor.point.color - self.dataLoadActivityIndicator.startAnimating() - - self.activityIndicator.type = .circleStrokeSpin - self.activityIndicator.color = .white - self.collectionVIewHeight.constant = rowHeight + 10 - } - - private func bindRx(){ - - collectionView.rx.setDelegate(self).disposed(by: disposeBag) - - viewModel.output.dataSource - .skip(1) - .do(onNext: { [weak self] _ in - self?.dataLoadActivityIndicator.stopAnimating() - }) - .bind(to: collectionView.rx.items) { (collectionView: UICollectionView, index: Int, model: ProfileListEntity) -> UICollectionViewCell in - guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ProfileCollectionViewCell", - for: IndexPath(row: index, section: 0)) as? ProfileCollectionViewCell else { - return UICollectionViewCell() - } - cell.update(model) - return cell - - }.disposed(by:disposeBag) - - collectionView.rx.itemSelected - .bind(to: viewModel.input.itemSelected) - .disposed(by: disposeBag) - - saveButton.rx.tap - .withLatestFrom(viewModel.output.dataSource) - .map{ (model) in - let id: String = model.filter { $0.isSelected }.first?.type ?? "unknown" - return id - } - .filter{ [weak self] (id) in - guard let self = self else { return false } - let currentProfile = Utility.PreferenceManager.userInfo?.profile ?? "unknown" - guard currentProfile != id else { - self.showToast(text: "현재 설정 된 프로필 입니다. 다른 프로필을 선택해주세요.", - font: DesignSystemFontFamily.Pretendard.light.font(size: 14)) - return false - } - return true - } - .do(onNext: { [weak self] _ in - self?.activityIndicator.startAnimating() - self?.saveButton.setAttributedTitle( - NSMutableAttributedString( - string:"", - attributes: [.font: DesignSystemFontFamily.Pretendard.medium.font(size: 18), - .foregroundColor: DesignSystemAsset.GrayColor.gray25.color] - ), for: .normal - ) - }) - .bind(to: viewModel.input.setProfileRequest) - .disposed(by: disposeBag) - - viewModel.output.setProfileResult - .observe(on: MainScheduler.instance) - .subscribe(onNext: { [weak self] (result) in - guard let self = self else { return } - - self.activityIndicator.stopAnimating() - self.saveButton.setAttributedTitle( - NSMutableAttributedString( - string:"완료", - attributes: [.font: DesignSystemFontFamily.Pretendard.medium.font(size: 18), - .foregroundColor: DesignSystemAsset.GrayColor.gray25.color] - ), for: .normal - ) - - if result.status == 200 { - self.dismiss(animated: true) - } - - else if result.status == 401 { - LOGOUT() - self.dismiss(animated: true) - self.showToast(text: result.description, font: DesignSystemFontFamily.Pretendard.light.font(size: 14)) - } - - else{ - self.showToast(text: result.description, font: DesignSystemFontFamily.Pretendard.light.font(size: 14)) - } - - }).disposed(by: disposeBag) - - - viewModel.output.collectionViewHeight - .observe(on: MainScheduler.instance) - .subscribe(onNext: { [weak self] (height) in - guard let self = self else { return } - self.collectionVIewHeight.constant = height - self.panModalSetNeedsLayoutUpdate() - self.panModalTransition(to: .longForm) - self.view.layoutIfNeeded() - }).disposed(by: disposeBag) - - - } -} - -extension ProfilePopViewController: PanModalPresentable { - - public override var preferredStatusBarStyle: UIStatusBarStyle { - return .lightContent - } - - public var panModalBackgroundColor: UIColor { - return colorFromRGB(0x000000, alpha: 0.4) - } - - public var panScrollable: UIScrollView? { - return nil - } - - public var longFormHeight: PanModalHeight { - return PanModalHeight.contentHeight(collectionVIewHeight.constant + 190) - } - - public var cornerRadius: CGFloat { - return 24.0 - } - - public var allowsExtendedPanScrolling: Bool { - return true - } - - public var showDragIndicator: Bool { - return false - } -} - -extension ProfilePopViewController:UICollectionViewDelegate,UICollectionViewDelegateFlowLayout{ - - public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { - - let size:CGFloat = (APP_WIDTH() - 70) / 4 - return CGSize(width: size, height: size) - } - - //행간 간격 - public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat { - return 10 - } - - //아이템 사이 간격(좌,우) - public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { - return 10 - } -} diff --git a/Projects/Features/CommonFeature/Sources/ViewControllers/ServiceInfoViewController.swift b/Projects/Features/CommonFeature/Sources/ViewControllers/ServiceInfoViewController.swift deleted file mode 100644 index cf86b8ebe..000000000 --- a/Projects/Features/CommonFeature/Sources/ViewControllers/ServiceInfoViewController.swift +++ /dev/null @@ -1,143 +0,0 @@ -// -// ServiceInfoViewController.swift -// CommonFeature -// -// Created by KTH on 2023/05/17. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import Utility -import DesignSystem -import RxSwift -import RxCocoa -import Kingfisher - -public class ServiceInfoViewController: UIViewController, ViewControllerFromStoryBoard { - @IBOutlet weak var backButton: UIButton! - @IBOutlet weak var titleStringLabel: UILabel! - @IBOutlet weak var tableView: UITableView! - - var openSourceLicenseComponent: OpenSourceLicenseComponent! - var viewModel: ServiceInfoViewModel! - var disposeBag: DisposeBag = DisposeBag() - - deinit { DEBUG_LOG("❌ \(Self.self) Deinit") } - - public override func viewDidLoad() { - super.viewDidLoad() - configureUI() - bindBtn() - inputBind() - outputBind() - } - - public static func viewController( - viewModel: ServiceInfoViewModel, - openSourceLicenseComponent: OpenSourceLicenseComponent - ) -> ServiceInfoViewController { - let viewController = ServiceInfoViewController.viewController(storyBoardName: "CommonUI", bundle: Bundle.module) - viewController.viewModel = viewModel - viewController.openSourceLicenseComponent = openSourceLicenseComponent - return viewController - } -} - -extension ServiceInfoViewController { - private func inputBind() { - tableView.rx - .setDelegate(self) - .disposed(by: disposeBag) - - tableView.rx.itemSelected - .withUnretained(self) - .withLatestFrom(viewModel.output.dataSource) { ($0.0, $0.1, $1) } - .subscribe(onNext: { (owner, indexPath, dataSource) in - owner.tableView.deselectRow(at: indexPath, animated: true) - let model = dataSource[indexPath.row] - switch model.identifier { - case .termsOfUse: - let vc = ContractViewController.viewController(type: .service) - vc.modalPresentationStyle = .overFullScreen - owner.present(vc, animated: true) - case .privacy: - let vc = ContractViewController.viewController(type: .privacy) - vc.modalPresentationStyle = .overFullScreen - owner.present(vc, animated: true) - case .openSourceLicense: - let vc = owner.openSourceLicenseComponent.makeView() - owner.navigationController?.pushViewController(vc, animated: true) - case .removeCache: - owner.viewModel.input.requestCacheSize.onNext(()) - case .versionInfomation: - return - } - }).disposed(by: disposeBag) - } - - private func outputBind() { - viewModel.output - .dataSource - .bind(to: tableView.rx.items) { (tableView, index, model) -> UITableViewCell in - guard let cell = tableView.dequeueReusableCell( - withIdentifier: "ServiceInfoCell", - for: IndexPath(row: index, section: 0) - ) as? ServiceInfoCell else{ - return UITableViewCell() - } - cell.update(model: model) - return cell - }.disposed(by: disposeBag) - - viewModel.output - .cacheSizeString - .withUnretained(self) - .subscribe(onNext: { (owner, sizeString) in - let popup = TextPopupViewController.viewController( - text: "캐시 데이터(\(sizeString))를 지우시겠습니까?", - cancelButtonIsHidden: false, - completion: { - owner.viewModel.input.removeCache.onNext(()) - }) - owner.showPanModal(content: popup) - }).disposed(by: disposeBag) - - viewModel.output - .showToast - .withUnretained(self) - .subscribe(onNext: { (owner, message) in - owner.showToast( - text: message, - font: DesignSystemFontFamily.Pretendard.light.font(size: 14) - ) - }).disposed(by: disposeBag) - } - - private func bindBtn(){ - backButton.rx.tap - .withUnretained(self) - .subscribe(onNext: { (owner, _) in - owner.navigationController?.popViewController(animated: true) - }).disposed(by: disposeBag) - } -} - -extension ServiceInfoViewController: UITableViewDelegate { - public func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { - return 60 - } -} - -extension ServiceInfoViewController { - private func configureUI() { - backButton.setImage(DesignSystemAsset.Navigation.back.image, for: .normal) - view.backgroundColor = DesignSystemAsset.GrayColor.gray100.color - titleStringLabel.text = "서비스 정보" - titleStringLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) - titleStringLabel.textColor = DesignSystemAsset.GrayColor.gray900.color - titleStringLabel.setTextWithAttributes(kernValue: -0.5) - tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: 20)) - tableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: 56)) - tableView.scrollIndicatorInsets = UIEdgeInsets(top: 0, left: 0, bottom: 56, right: 0) - } -} diff --git a/Projects/Features/CommonFeature/Sources/ViewControllers/TextPopupViewController.swift b/Projects/Features/CommonFeature/Sources/ViewControllers/TextPopupViewController.swift deleted file mode 100644 index 871a5ca36..000000000 --- a/Projects/Features/CommonFeature/Sources/ViewControllers/TextPopupViewController.swift +++ /dev/null @@ -1,163 +0,0 @@ -import UIKit -import Utility -import PanModal -import DesignSystem -public final class TextPopupViewController: UIViewController, ViewControllerFromStoryBoard { - - @IBOutlet weak var contentLabel: UILabel! - @IBOutlet weak var cancelButton: UIButton! - @IBOutlet weak var confirmButton: UIButton! - - var contentString: String = "" - var cancelButtonIsHidden: Bool = false - var completion: (() -> Void)? - var cancelCompletion: (() -> Void)? - var allowsDragAndTapToDismiss: Bool = true - var cancelButtonText: String = "" - var confirmButtonText: String = "" - - deinit { - DEBUG_LOG("❌ \(Self.self) Deinit") - } - - public override func viewDidLoad() { - super.viewDidLoad() - - configureUI() - } - - public static func viewController( - text: String = "", - cancelButtonIsHidden: Bool, - allowsDragAndTapToDismiss: Bool = true, - confirmButtonText:String = "확인", - cancelButtonText:String = "취소", - completion: (() -> Void)? = nil, - cancelCompletion: (() -> Void)? = nil - - ) -> TextPopupViewController { - let viewController = TextPopupViewController.viewController(storyBoardName: "CommonUI", bundle: Bundle.module) - viewController.contentString = text - viewController.cancelButtonIsHidden = cancelButtonIsHidden - viewController.allowsDragAndTapToDismiss = allowsDragAndTapToDismiss - viewController.completion = completion - viewController.cancelCompletion = cancelCompletion - viewController.confirmButtonText = confirmButtonText - viewController.cancelButtonText = cancelButtonText - return viewController - } - - @IBAction func cancelButtonAction(_ sender: Any) { - dismiss(animated: true) - cancelCompletion?() - } - - @IBAction func confirmButtonAction(_ sender: Any) { - dismiss(animated: true) - completion?() - } -} - -extension TextPopupViewController { - - private func configureUI() { - - // 취소 - cancelButton.layer.cornerRadius = 12 - cancelButton.clipsToBounds = true - cancelButton.isHidden = cancelButtonIsHidden - - let cancelAttributedString = NSMutableAttributedString( - string: cancelButtonText, - attributes: [ - .font: DesignSystem.DesignSystemFontFamily.Pretendard.medium.font(size: 18), - .foregroundColor: DesignSystemAsset.GrayColor.gray25.color, - .kern: -0.5] - ) - cancelButton.setAttributedTitle(cancelAttributedString, for: .normal) - - confirmButton.backgroundColor = DesignSystemAsset.PrimaryColor.point.color - confirmButton.layer.cornerRadius = cancelButton.layer.cornerRadius - confirmButton.clipsToBounds = true - - // 확인 - let confirmAttributedString = NSMutableAttributedString( - string: confirmButtonText, - attributes: [ - .font: DesignSystem.DesignSystemFontFamily.Pretendard.medium.font(size: 18), - .foregroundColor: DesignSystemAsset.GrayColor.gray25.color, - .kern: -0.5] - ) - confirmButton.setAttributedTitle(confirmAttributedString, for: .normal) - - // 내용 - let paragraphStyle = NSMutableParagraphStyle() - paragraphStyle.lineHeightMultiple = 1.3 - paragraphStyle.alignment = .center - paragraphStyle.lineBreakStrategy = .hangulWordPriority - - let contentAttributedString = NSMutableAttributedString( - string: contentString, - attributes: [ - .font: DesignSystem.DesignSystemFontFamily.Pretendard.medium.font(size: 18), - .foregroundColor: DesignSystemAsset.GrayColor.gray900.color, - .kern: -0.5, - .paragraphStyle: paragraphStyle] - ) - contentLabel.attributedText = contentAttributedString - } -} - -extension TextPopupViewController: PanModalPresentable { - - public override var preferredStatusBarStyle: UIStatusBarStyle { - return .lightContent - } - - public var panModalBackgroundColor: UIColor { - return colorFromRGB(0x000000, alpha: 0.4) - } - - public var panScrollable: UIScrollView? { - return nil - } - - public var longFormHeight: PanModalHeight { - let paragraphStyle = NSMutableParagraphStyle() - paragraphStyle.lineHeightMultiple = 1.3 - paragraphStyle.alignment = .center - - let contentAttributedString = NSMutableAttributedString( - string: contentString, - attributes: [ - .font: DesignSystem.DesignSystemFontFamily.Pretendard.medium.font(size: 18), - .foregroundColor: DesignSystemAsset.GrayColor.gray900.color, - .kern: -0.5, - .paragraphStyle: paragraphStyle] - ) - - let contentHeight: CGFloat = contentAttributedString.height(containerWidth: APP_WIDTH()-40) - let spacingHeight: CGFloat = 60 + 52 + 56 + 10 - return .contentHeight(spacingHeight + contentHeight) - } - - public var cornerRadius: CGFloat { - return 24.0 - } - - public var allowsExtendedPanScrolling: Bool { - return true - } - - public var showDragIndicator: Bool { - return false - } - - public var allowsDragToDismiss: Bool { - return allowsDragAndTapToDismiss - } - - public var allowsTapToDismiss: Bool { - return allowsDragAndTapToDismiss - } -} diff --git a/Projects/Features/CommonFeature/Sources/ViewModels/ContainSongsViewModel.swift b/Projects/Features/CommonFeature/Sources/ViewModels/ContainSongsViewModel.swift deleted file mode 100644 index 8a40fea1b..000000000 --- a/Projects/Features/CommonFeature/Sources/ViewModels/ContainSongsViewModel.swift +++ /dev/null @@ -1,117 +0,0 @@ -// -// ContainSongsViewModel.swift -// CommonFeature -// -// Created by yongbeomkwak on 2023/03/11. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import BaseFeature -import RxRelay -import DomainModule -import RxSwift -import ErrorModule - -public final class ContainSongsViewModel: ViewModelType { - var fetchPlayListUseCase:FetchPlayListUseCase! - var addSongIntoPlayListUseCase:AddSongIntoPlayListUseCase! - var songs:[String]! - let disposeBag = DisposeBag() - - public struct Input { - let newPlayListTap: PublishSubject = PublishSubject() - let playListLoad: BehaviorRelay = BehaviorRelay(value: ()) - let containSongWithKey: PublishSubject = PublishSubject() - } - - public struct Output{ - let dataSource: BehaviorRelay<[PlayListEntity]> = BehaviorRelay(value: []) - let showToastMessage: PublishSubject = PublishSubject() - } - - init(songs:[String],fetchPlayListUseCase: FetchPlayListUseCase!,addSongIntoPlayListUseCase:AddSongIntoPlayListUseCase!) { - self.fetchPlayListUseCase = fetchPlayListUseCase - self.addSongIntoPlayListUseCase = addSongIntoPlayListUseCase - self.songs = songs - } - - public func transform(from input: Input) -> Output { - let output = Output() - - input.playListLoad - .flatMap({ [weak self] () -> Observable<[PlayListEntity]> in - guard let self = self else{ - return Observable.empty() - } - return self.fetchPlayListUseCase.execute() - .asObservable() - .catch{ (error: Error) in - let wmError = error.asWMError - if wmError == .tokenExpired { - let model = AddSongEntity( - status: 401, - added_songs_length: 0, - duplicated: false, - description: wmError.errorDescription ?? "" - ) - output.showToastMessage.onNext(model) - } - return Observable.just([]) - } - }) - .bind(to: output.dataSource) - .disposed(by: disposeBag) - - input.containSongWithKey - .flatMap({ [weak self] (key: String) -> Observable in - guard let self = self else { - return Observable.empty() - } - return self.addSongIntoPlayListUseCase - .execute(key: key, songs: self.songs) - .catch({ (error: Error) in - let wmError = error.asWMError - - if wmError == .tokenExpired { - return Single.create { single in - single(.success(AddSongEntity(status: 401, added_songs_length: 0, duplicated: false, description: wmError.errorDescription ?? ""))) - return Disposables.create() - } - }else if wmError == .badRequest { - return Single.create { single in - single(.success(AddSongEntity(status: 400, added_songs_length: 0, duplicated: false, description: wmError.errorDescription ?? ""))) - return Disposables.create {} - } - }else if wmError == .conflict { - return Single.create { single in - single(.success(AddSongEntity(status: 409, added_songs_length: 0, duplicated: true, description: "이미 내 리스트에 담긴 곡들입니다."))) - return Disposables.create {} - } - }else { - return Single.create { single in - single(.success(AddSongEntity(status: 500, added_songs_length: 0, duplicated: false, description: "서버에서 문제가 발생하였습니다.\n잠시 후 다시 시도해주세요!"))) - return Disposables.create {} - } - } - }) - .asObservable() - }) - .map{ (entity: AddSongEntity) -> AddSongEntity in - if entity.status == 200 { - if entity.duplicated { - return AddSongEntity(status: 200, added_songs_length: entity.added_songs_length, duplicated: true, description: "\(entity.added_songs_length)곡이 내 리스트에 담겼습니다. 중복 곡은 제외됩니다." ) - }else { - return AddSongEntity(status: 200, added_songs_length: entity.added_songs_length, duplicated: false, description: "\(entity.added_songs_length)곡이 내 리스트에 담겼습니다.") - } - } - else { - return entity - } - } - .bind(to: output.showToastMessage) - .disposed(by: disposeBag) - - return output - } -} diff --git a/Projects/Features/CommonFeature/Sources/ViewModels/MultiPurposePopupViewModel.swift b/Projects/Features/CommonFeature/Sources/ViewModels/MultiPurposePopupViewModel.swift deleted file mode 100644 index 04fba4989..000000000 --- a/Projects/Features/CommonFeature/Sources/ViewModels/MultiPurposePopupViewModel.swift +++ /dev/null @@ -1,194 +0,0 @@ -// -// SearchViewModel.swift -// SearchFeature -// -// Created by yongbeomkwak on 2023/01/05. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import RxRelay -import BaseFeature -import DomainModule -import DataMappingModule -import Utility - -public final class MultiPurposePopupViewModel: ViewModelType { - var type: PurposeType - var key: String - let disposeBag: DisposeBag = DisposeBag() - - var createPlayListUseCase: CreatePlayListUseCase! - var loadPlayListUseCase: LoadPlayListUseCase! - var setUserNameUseCase: SetUserNameUseCase! - var editPlayListNameUseCase: EditPlayListNameUseCase! - - public struct Input { - let textString: BehaviorRelay = BehaviorRelay(value: "") - let pressConfirm: PublishSubject = PublishSubject() - } - public struct Output { - let isFoucused: BehaviorRelay = BehaviorRelay(value:false) - let result: PublishSubject = PublishSubject() - let newPlayListKey: PublishSubject = PublishSubject() - } - - public init( - type: PurposeType, - key: String, - createPlayListUseCase: CreatePlayListUseCase, - loadPlayListUseCase: LoadPlayListUseCase, - setUserNameUseCase: SetUserNameUseCase, - editPlayListNameUseCase: EditPlayListNameUseCase - ) { - self.key = key - self.type = type - self.createPlayListUseCase = createPlayListUseCase - self.loadPlayListUseCase = loadPlayListUseCase - self.setUserNameUseCase = setUserNameUseCase - self.editPlayListNameUseCase = editPlayListNameUseCase - } - - deinit{ - DEBUG_LOG("❌ \(Self.self) 소멸") - } - - public func transform(from input: Input) -> Output { - var output = Output() - - input.pressConfirm - .withLatestFrom(input.textString) - .subscribe(onNext: { [weak self] (text: String) in - guard let self = self else{ - return - } - switch self.type{ - case .creation: - self.createPlayListUseCase.execute(title: text) - .catch{ (error: Error) in - let wmError = error.asWMError - if wmError == .tokenExpired { - return Single.create { single in - single(.success(PlayListBaseEntity(status: 401, key: "", description: wmError.errorDescription ?? ""))) - return Disposables.create() - } - }else { - return Single.create { single in - single(.success(PlayListBaseEntity(status: 0, key: "", description: error.asWMError.errorDescription ?? ""))) - return Disposables.create {} - } - } - } - .asObservable() - .map{ (entity) -> (BaseEntity, String) in - return (BaseEntity(status: entity.status, description: entity.description), entity.key) - } - .subscribe(onNext: { (result: BaseEntity, key: String) in - if result.status != 200 { //Created == 201 - output.result.onNext(result) - return - } - //리프래쉬 작업 - output.result.onNext(result) - output.newPlayListKey.onNext(key) - NotificationCenter.default.post(name: .playListRefresh, object: nil) - }) - .disposed(by: self.disposeBag) - - case .nickname: - self.setUserNameUseCase.execute(name:text) - .catch{ (error) in - let wmError = error.asWMError - if wmError == .tokenExpired { - return Single.create { single in - single(.success(BaseEntity(status: 401, description: wmError.errorDescription ?? ""))) - return Disposables.create() - } - } - else { - return Single.create { single in - single(.success(BaseEntity(status: 0, description: error.asWMError.errorDescription ?? ""))) - return Disposables.create {} - } - } - } - .asObservable() - .subscribe(onNext: { result in - if result.status != 200 { //Created == 201 - output.result.onNext(result) - return - } - Utility.PreferenceManager.userInfo = Utility.PreferenceManager.userInfo?.update(displayName:AES256.encrypt(string: text)) - output.result.onNext(BaseEntity(status: 200,description: "")) - }).disposed(by: self.disposeBag) - - case .load: - self.loadPlayListUseCase.execute(key: text) - .catch({ (error: Error) in - let wmError = error.asWMError - if wmError == .tokenExpired { - return Single.create { single in - single(.success(PlayListBaseEntity(status: 401, key: "", description: wmError.errorDescription ?? ""))) - return Disposables.create() - } - } - else { - return Single.create { single in - single(.success(PlayListBaseEntity(status: 0, key: "", description: error.asWMError.errorDescription ?? ""))) - return Disposables.create {} - } - } - }) - .asObservable() - .map{ (entity) -> BaseEntity in - return BaseEntity(status: entity.status, description: entity.description) - } - .subscribe(onNext: { result in - if result.status != 200 { //Created == 201 - output.result.onNext(result) - return - } - //리프래쉬 작업 - NotificationCenter.default.post(name: .playListRefresh, object: nil) - output.result.onNext(result) - }) - .disposed(by: self.disposeBag) - - case .edit: - self.editPlayListNameUseCase.execute(key: self.key, title: text) - .catch({ (error:Error) in - let wmError = error.asWMError - if wmError == .tokenExpired { - return Single.create { single in - single(.success(EditPlayListNameEntity(title: "", status: 401 ,description: error.asWMError.errorDescription ?? ""))) - return Disposables.create() - } - } - else { - return Single.create { single in - single(.success(EditPlayListNameEntity(title: "", status: 0 ,description: error.asWMError.errorDescription ?? ""))) - return Disposables.create {} - } - } - }) - .asObservable() - .subscribe(onNext: { result in - if result.status != 200 { - output.result.onNext(BaseEntity(status: result.status,description: result.description)) - return - } - NotificationCenter.default.post(name: .playListRefresh, object: nil) // 플리목록창 이름 변경하기 위함 - NotificationCenter.default.post(name: .playListNameRefresh, object: result.title) - output.result.onNext(BaseEntity(status: 200, description: "")) - }) - .disposed(by: self.disposeBag) - - case .share: - output.result.onNext(BaseEntity(status: 200, description: "")) - } - }).disposed(by: disposeBag) - - return output - } -} diff --git a/Projects/Features/CommonFeature/Sources/ViewModels/NewSongsContentViewModel.swift b/Projects/Features/CommonFeature/Sources/ViewModels/NewSongsContentViewModel.swift deleted file mode 100644 index 4f71b77ef..000000000 --- a/Projects/Features/CommonFeature/Sources/ViewModels/NewSongsContentViewModel.swift +++ /dev/null @@ -1,196 +0,0 @@ -// -// NewSongsContentViewModel.swift -// CommonFeature -// -// Created by KTH on 2023/11/15. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import RxRelay -import DomainModule -import BaseFeature -import Utility -import DataMappingModule - -public final class NewSongsContentViewModel: ViewModelType { - public let type: NewSongGroupType - private let disposeBag = DisposeBag() - private let fetchNewSongsUseCase: FetchNewSongsUseCase - private let fetchChartUpdateTimeUseCase: FetchChartUpdateTimeUseCase - - deinit { DEBUG_LOG("❌ \(Self.self) Deinit") } - - public init( - type: NewSongGroupType, - fetchNewSongsUseCase: FetchNewSongsUseCase, - fetchChartUpdateTimeUseCase: FetchChartUpdateTimeUseCase - ) { - self.type = type - self.fetchNewSongsUseCase = fetchNewSongsUseCase - self.fetchChartUpdateTimeUseCase = fetchChartUpdateTimeUseCase - } - - public struct Input { - var pageID: BehaviorRelay = BehaviorRelay(value: 1) - var songTapped: PublishSubject = PublishSubject() - var allSongSelected: PublishSubject = PublishSubject() - var groupPlayTapped: PublishSubject = PublishSubject() - var refreshPulled: PublishSubject = PublishSubject() - } - - public struct Output { - var dataSource: BehaviorRelay<[NewSongsEntity]> = BehaviorRelay(value: []) - var updateTime: BehaviorRelay = BehaviorRelay(value: "") - let indexOfSelectedSongs: BehaviorRelay<[Int]> = BehaviorRelay(value: []) - let songEntityOfSelectedSongs: BehaviorRelay<[SongEntity]> = BehaviorRelay(value: []) - var canLoadMore: BehaviorRelay = BehaviorRelay(value: true) - } - - public func transform(from input: Input) -> Output { - let output = Output() - - let chartUpdateTime = self.fetchChartUpdateTimeUseCase - .execute(type: .total) - .catchAndReturn("팬치들 미안해요 ㅠㅠ 잠시만 기다려주세요") // 이스터에그 🥰 - .asObservable() - - chartUpdateTime - .take(1) - .bind(to: output.updateTime) - .disposed(by: disposeBag) - - let refresh = Observable.combineLatest( - output.dataSource, - input.pageID - ) { (dataSource, pageID) -> [NewSongsEntity] in - return pageID == 1 ? [] : dataSource - } - - let type: NewSongGroupType = self.type - let fetchNewSongsUseCase = self.fetchNewSongsUseCase - - input.pageID - .flatMap { (pageID) -> Single<[NewSongsEntity]> in - return fetchNewSongsUseCase - .execute(type: type, page: pageID, limit: 100) - .catchAndReturn([]) - } - .asObservable() - .do(onNext: { (model) in - output.canLoadMore.accept(!model.isEmpty) -// DEBUG_LOG("page: \(input.pageID.value) called, nextPage exist: \(!model.isEmpty)") - }, onError: { _ in - output.canLoadMore.accept(false) - }) - .withLatestFrom(refresh, resultSelector: { (newModels, datasources) -> [NewSongsEntity] in - return datasources + newModels - }) - .bind(to: output.dataSource) - .disposed(by: disposeBag) - - input.refreshPulled - .do(onNext: { _ in - input.pageID.accept(1) - }) - .flatMap{ _ -> Observable in - return chartUpdateTime - } - .bind(to: output.updateTime) - .disposed(by: disposeBag) - - input.songTapped - .withLatestFrom(output.indexOfSelectedSongs, resultSelector: { (index, selectedSongs) -> [Int] in - if selectedSongs.contains(index) { - guard let removeTargetIndex = selectedSongs.firstIndex(where: { $0 == index }) else { return selectedSongs } - var newSelectedSongs = selectedSongs - newSelectedSongs.remove(at: removeTargetIndex) - return newSelectedSongs - }else { - return selectedSongs + [index] - } - }) - .map { $0.sorted { $0 < $1 } } - .bind(to: output.indexOfSelectedSongs) - .disposed(by: disposeBag) - - input.allSongSelected - .withLatestFrom(output.dataSource) { ($0, $1) } - .map { (flag, dataSource) -> [Int] in - return flag ? Array(0.. [SongEntity] in - return indexOfSelectedSongs.map { - SongEntity( - id: dataSource[$0].id, - title: dataSource[$0].title, - artist: dataSource[$0].artist, - remix: dataSource[$0].remix, - reaction: dataSource[$0].reaction, - views: dataSource[$0].views, - last: dataSource[$0].last, - date: "\(dataSource[$0].date)" - ) - } - } - .bind(to: output.songEntityOfSelectedSongs) - .disposed(by: disposeBag) - - input.groupPlayTapped - .withLatestFrom(output.dataSource) { ($0, $1) } - .map{ (type, dataSource) -> (PlayEvent, [SongEntity]) in - let songEntities: [SongEntity] = dataSource.map { - return SongEntity( - id: $0.id, - title: $0.title, - artist: $0.artist, - remix: $0.remix, - reaction: $0.reaction, - views: $0.views, - last: $0.last, - date: "\($0.date)" - ) - } - return (type, songEntities) - } - .map{ (type, dataSource) -> [SongEntity] in - switch type { - case .allPlay: - return dataSource - case .shufflePlay: - return dataSource.shuffled() - } - } - .subscribe(onNext: { (songs) in - PlayState.shared.loadAndAppendSongsToPlaylist(songs) - }) - .disposed(by: disposeBag) - - return output - } -} diff --git a/Projects/Features/CommonFeature/Sources/ViewModels/NoticePopupViewModel.swift b/Projects/Features/CommonFeature/Sources/ViewModels/NoticePopupViewModel.swift deleted file mode 100644 index 89d76c0ff..000000000 --- a/Projects/Features/CommonFeature/Sources/ViewModels/NoticePopupViewModel.swift +++ /dev/null @@ -1,42 +0,0 @@ -// -// NoticePopupViewModel.swift -// CommonFeature -// -// Created by KTH on 2023/04/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import RxCocoa -import BaseFeature -import DomainModule -import DataMappingModule -import Utility - -public class NoticePopupViewModel { - let input = Input() - let output = Output() - var disposeBag = DisposeBag() - var fetchNoticeEntities: [FetchNoticeEntity] - - public struct Input { - } - - public struct Output { - var dataSource: BehaviorRelay<[String]> = BehaviorRelay(value: []) - var ids: BehaviorRelay<[Int]> = BehaviorRelay(value: []) - } - - public init( - fetchNoticeEntities: [FetchNoticeEntity] - ){ - self.fetchNoticeEntities = fetchNoticeEntities - - let images: [String] = self.fetchNoticeEntities.map { $0.thumbnail ?? "" }.filter { !$0.isEmpty } - output.dataSource.accept(images) - - let ids: [Int] = self.fetchNoticeEntities.map { $0.id } - output.ids.accept(ids) - } -} diff --git a/Projects/Features/CommonFeature/Sources/ViewModels/PlayListDetailViewModel.swift b/Projects/Features/CommonFeature/Sources/ViewModels/PlayListDetailViewModel.swift deleted file mode 100644 index 6e207b7ec..000000000 --- a/Projects/Features/CommonFeature/Sources/ViewModels/PlayListDetailViewModel.swift +++ /dev/null @@ -1,374 +0,0 @@ -// -// SearchViewModel.swift -// SearchFeature -// -// Created by yongbeomkwak on 2023/01/05. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import RxRelay -import BaseFeature -import DomainModule -import DataMappingModule -import Utility -import ErrorModule -import RxCocoa - -struct PlayListHeaderInfo { - var title:String - var songCount:String - var image:String - var version:Int -} - -public final class PlayListDetailViewModel: ViewModelType { - var type: PlayListType! - var id: String! - var key: String? - var fetchPlayListDetailUseCase: FetchPlayListDetailUseCase! - var editPlayListUseCase: EditPlayListUseCase! - var removeSongsUseCase: RemoveSongsUseCase! - var disposeBag = DisposeBag() - - public struct Input { - let textString: BehaviorRelay = BehaviorRelay(value: "") - let itemMoved: PublishSubject = PublishSubject() - let playListNameLoad: BehaviorRelay = BehaviorRelay(value: "") - let cancelEdit: PublishSubject = PublishSubject() - let runEditing: PublishSubject = PublishSubject() - let songTapped: PublishSubject = PublishSubject() - let allSongSelected: PublishSubject = PublishSubject() - let tapRemoveSongs: PublishSubject = PublishSubject() - let state: BehaviorRelay = BehaviorRelay(value:EditState(isEditing: false, force: false)) - let groupPlayTapped: PublishSubject = PublishSubject() - } - - public struct Output { - let headerInfo: PublishRelay = PublishRelay() - let dataSource: BehaviorRelay<[PlayListDetailSectionModel]> = BehaviorRelay(value: []) - let backUpdataSource: BehaviorRelay<[PlayListDetailSectionModel]> = BehaviorRelay(value: []) - let indexOfSelectedSongs: BehaviorRelay<[Int]> = BehaviorRelay(value: []) - let songEntityOfSelectedSongs: BehaviorRelay<[SongEntity]> = BehaviorRelay(value: []) - let refreshPlayList: BehaviorRelay = BehaviorRelay(value: ()) - let groupPlaySongs: PublishSubject<[SongEntity]> = PublishSubject() - let showErrorToast: PublishRelay = PublishRelay() - } - - public init( - id: String, - type: PlayListType, - fetchPlayListDetailUseCase: FetchPlayListDetailUseCase, - editPlayListUseCase: EditPlayListUseCase, - removeSongsUseCase: RemoveSongsUseCase - ) { - self.id = id - self.type = type - self.fetchPlayListDetailUseCase = fetchPlayListDetailUseCase - self.editPlayListUseCase = editPlayListUseCase - self.removeSongsUseCase = removeSongsUseCase - } - - deinit{ - DEBUG_LOG("❌ \(Self.self) 소멸") - } - - public func transform(from input: Input) -> Output { - let output = Output() - - output.refreshPlayList - .flatMap({ [weak self] () -> Observable in - guard let self = self else {return Observable.empty()} - return self.fetchPlayListDetailUseCase.execute(id: self.id, type: self.type) - .catchAndReturn( - - PlayListDetailEntity(title: "", songs: [], public: true, key: "", image: "", image_square_version: 0, image_round_version: 0, version: 0) - - ) - .asObservable() - .do(onNext: { [weak self] (model) in - guard let self = self else { return } - output.headerInfo.accept( - PlayListHeaderInfo( - title: model.title, - songCount: "\(model.songs.count)곡", - image: self.type == .wmRecommend ? - model.key : model.image,version: self.type == .wmRecommend ? - model.image_square_version : model.version - ) - ) - self.key = model.key - }) - }) - .map { [PlayListDetailSectionModel(model: 0, items: $0.songs)] } - .bind(to: output.dataSource, output.backUpdataSource) - .disposed(by: disposeBag) - - input.playListNameLoad - .skip(1) - .withLatestFrom(output.headerInfo){($0,$1)} - .map({PlayListHeaderInfo(title: $0.0, songCount: $0.1.songCount, image: $0.1.image,version: $0.1.version)}) - .bind(to: output.headerInfo) - .disposed(by: disposeBag) - - input.runEditing - .withLatestFrom(output.dataSource) - .filter { !($0.first?.items ?? []).isEmpty } - .map { $0.first?.items.map { $0.id } ?? [] } - .do(onNext: { _ in - output.indexOfSelectedSongs.accept([]) // 바텀 Tab 내려가게 하기 위해 - output.songEntityOfSelectedSongs.accept([]) // 바텀 Tab 내려가게 하기 위해 - }) - .filter{ (ids: [String]) -> Bool in - let beforeIds: [String] = output.backUpdataSource.value.first?.items.map { $0.id } ?? [] - let elementsEqual: Bool = beforeIds.elementsEqual(ids) - DEBUG_LOG(elementsEqual ? "❌ 변경된 내용이 없습니다." : "✅ 리스트가 변경되었습니다.") - return elementsEqual == false - } - .flatMap{ [weak self] (songs: [String]) -> Observable in - guard let self = self, let key = self.key else { - return Observable.empty() - } - return self.editPlayListUseCase.execute(key: key, songs: songs) - .catch({ (error:Error) in - let wmError = error.asWMError - - if wmError == .tokenExpired { - return Single.create { single in - single(.success(BaseEntity(status: 401, description: error.asWMError.errorDescription ?? ""))) - return Disposables.create {} - } - } - - else { - return Single.create { single in - single(.success(BaseEntity(status: 0, description: error.asWMError.errorDescription ?? ""))) - return Disposables.create {} - } - } - }) - .asObservable() - } - .subscribe(onNext: { (model) in - if model.status != 200 { - output.showErrorToast.accept(model) - return - } - output.refreshPlayList.accept(()) - NotificationCenter.default.post(name: .playListRefresh, object: nil) // 바깥 플리 업데이트 - }).disposed(by: disposeBag) - - input.cancelEdit - .withLatestFrom(output.backUpdataSource) - .bind(to: output.dataSource) - .disposed(by: disposeBag) - - input.songTapped - .withLatestFrom(output.indexOfSelectedSongs, resultSelector: { (index, selectedSongs) -> [Int] in - if selectedSongs.contains(index) { - guard let removeTargetIndex = selectedSongs.firstIndex(where: { $0 == index }) else { return selectedSongs } - var newSelectedSongs = selectedSongs - newSelectedSongs.remove(at: removeTargetIndex) - return newSelectedSongs - }else{ - return selectedSongs + [index] - } - }) - .map { $0.sorted { $0 < $1 } } - .bind(to: output.indexOfSelectedSongs) - .disposed(by: disposeBag) - - input.allSongSelected - .withLatestFrom(output.dataSource) { ($0, $1) } - .map { (flag, dataSource) -> [Int] in - return flag ? Array(0.. [String] in - let remainDataSource = dataSource.first?.items.filter({ (song: SongEntity) in - return !ids.contains(song) - }) - .map { $0.id } - return remainDataSource ?? [] - } - .flatMap{ [weak self] (songs: [String]) -> Observable in - guard let self = self, let key = self.key else { - return Observable.empty() - } - return self.editPlayListUseCase.execute(key: key, songs: songs) - .catch({ (error:Error) in - let wmError = error.asWMError - - if wmError == .tokenExpired { - return Single.create { single in - single(.success(BaseEntity(status: 401, description: error.asWMError.errorDescription ?? ""))) - return Disposables.create {} - } - } - - else { - return Single.create { single in - single(.success(BaseEntity(status: 0, description: error.asWMError.errorDescription ?? ""))) - return Disposables.create {} - } - } - }) - .asObservable() - } - .subscribe(onNext: { (model) in - output.showErrorToast.accept((model.status == 200) ? BaseEntity(status: 200,description:"리스트에서 삭제되었습니다.") : model) - output.refreshPlayList.accept(()) - output.indexOfSelectedSongs.accept([]) - output.songEntityOfSelectedSongs.accept([]) - NotificationCenter.default.post(name: .playListRefresh, object: nil) - }).disposed(by: disposeBag) - - input.itemMoved - .subscribe(onNext: { (itemMovedEvent) in - let source = itemMovedEvent.sourceIndex.row - let dest = itemMovedEvent.destinationIndex.row - var curr = output.dataSource.value.first?.items ?? [] - let tmp = curr[source] - - curr.remove(at: source) - curr.insert(tmp, at: dest) - - let newModel = [PlayListDetailSectionModel(model: 0, items: curr)] - output.dataSource.accept(newModel) - - //꼭 먼저 데이터 소스를 갱신 해야합니다 - - var indexs = output.indexOfSelectedSongs.value // 현재 선택된 인덱스 모음 - let limit = curr.count - 1 // 마지막 인덱스 - - let sourceIsSelected:Bool = indexs.contains(where: {$0 == source}) // 선택된 것을 움직 였는지 ? - - if sourceIsSelected { - //선택된 인덱스 배열 안에 source(시작점)이 있다는 뜻은 선택된 것을 옮긴다는 뜻 - - let pos = indexs.firstIndex(where: {$0 == source})! - indexs.remove(at: pos) - //그러므로 일단 지워준다. - } - - indexs = indexs - .map({ i -> Int in - //i: 현재 저장된 인덱스들을 순회함 - if source < i && i > dest { - // 옮기기 시작한 위치와 도착한 위치가 i를 기준으로 앞일 때 아무 영향 없음 - return i - } - if source < i && i <= dest { - /* 옮기기 시작한 위치는 i 앞 - 도착한 위치가 i또는 i 뒤일 경우 - i는 앞으로 한 칸 가야함 - */ - return i - 1 - } - if i < source && dest <= i { - /* 옮기기 시작한 위치는 i 뒤 - 도착한 위치가 i또는 i 앞일 경우 - i는 뒤로 한칸 가야함 - - ** 단 옮겨질 위치가 배열의 끝일 경우는 그대로 있음 - */ - return i + 1 - } - if source > i && i < dest { - /* 옮기기 시작한 위치는 i 뒤 - 도착한 위치가 i 뒤 일경우 - - 아무 영향 없음 - */ - return i - } - return i - }) - if sourceIsSelected { // 선택된 것을 건드렸으므로 dest 인덱스로 갱신하여 넣어준다 - indexs.append(dest) - } - - indexs.sort() - - DEBUG_LOG("sourceIndexPath: \(source)") - DEBUG_LOG("destIndexPath: \(dest)") - DEBUG_LOG("dataSource: \(curr.map({$0.title}))") - DEBUG_LOG("indexs: \(indexs)") - output.indexOfSelectedSongs.accept(indexs) - - }).disposed(by: disposeBag) - - input.groupPlayTapped - .withLatestFrom(output.dataSource){($0,$1)} - .map({ (type,dataSourc) -> [SongEntity] in - guard let songs = dataSourc.first?.items as? [SongEntity] else { - return [] - } - switch type { - case .allPlay: - return songs - case .shufflePlay: - return songs.shuffled() - } - }) - .bind(to: output.groupPlaySongs) - .disposed(by: disposeBag) - - output.indexOfSelectedSongs - .withLatestFrom(output.dataSource) { ($0, $1) } - .map { (selectedSongs, dataSource) -> [PlayListDetailSectionModel] in - var realData = dataSource.first?.items ?? [] - realData.indices.forEach({ - realData[$0].isSelected = false - }) - selectedSongs.forEach { i in - realData[i].isSelected = true - } - return [PlayListDetailSectionModel(model: 0, items: realData)] - } - .bind(to: output.dataSource) - .disposed(by: disposeBag) - - output.indexOfSelectedSongs - .withLatestFrom(output.dataSource) { ($0, $1) } - .map { (indexOfSelectedSongs, dataSource) -> [SongEntity] in - let song = dataSource.first?.items ?? [] - return indexOfSelectedSongs.map { - SongEntity( - id: song[$0].id, - title: song[$0].title, - artist: song[$0].artist, - remix: song[$0].remix, - reaction: song[$0].reaction, - views: song[$0].views, - last: song[$0].last, - date: song[$0].date - ) - } - } - .bind(to: output.songEntityOfSelectedSongs) - .disposed(by: disposeBag) - - NotificationCenter.default.rx.notification(.playListNameRefresh) - .map{ (notification) -> String in - guard let obj = notification.object as? String else { - return "" - } - return obj - } - .do(onNext: { _ in - input.state.accept(EditState(isEditing: false, force: true)) - input.cancelEdit.onNext(()) - }) - .bind(to: input.playListNameLoad) - .disposed(by: disposeBag) - - return output - } -} diff --git a/Projects/Features/CommonFeature/Sources/ViewModels/ProfilePopViewModel.swift b/Projects/Features/CommonFeature/Sources/ViewModels/ProfilePopViewModel.swift deleted file mode 100644 index 411301239..000000000 --- a/Projects/Features/CommonFeature/Sources/ViewModels/ProfilePopViewModel.swift +++ /dev/null @@ -1,140 +0,0 @@ -// -// ProfilePopViewModel.swift -// CommonFeature -// -// Created by KTH on 2023/02/18. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import RxCocoa -import BaseFeature -import DomainModule -import DataMappingModule -import Utility - -public final class ProfilePopViewModel { - - let input = Input() - let output = Output() - var disposeBag = DisposeBag() - - var fetchProfileListUseCase: FetchProfileListUseCase - var setProfileUseCase: SetProfileUseCase - - public struct Input { - var setProfileRequest: PublishSubject = PublishSubject() - var itemSelected: PublishRelay = PublishRelay() - } - - public struct Output { - var setProfileResult: PublishSubject = PublishSubject() - var dataSource: BehaviorRelay<[ProfileListEntity]> = BehaviorRelay(value: []) - var collectionViewHeight: PublishRelay = PublishRelay() - } - - public init( - fetchProfileListUseCase: any FetchProfileListUseCase, - setProfileUseCase: any SetProfileUseCase - ){ - self.fetchProfileListUseCase = fetchProfileListUseCase - self.setProfileUseCase = setProfileUseCase - - fetchProfileListUseCase.execute() - .asObservable() - .catchAndReturn([]) - .map({ (model) -> [ProfileListEntity] in - let currentProfile = Utility.PreferenceManager.userInfo?.profile ?? "unknown" - - var newModel = model - newModel.indices.forEach { newModel[$0].isSelected = (currentProfile == newModel[$0].type) } - return newModel - }) - .bind(to: output.dataSource) - .disposed(by: disposeBag) - - output.dataSource - .map{ [weak self] (model) -> CGFloat in - guard let self = self, !model.isEmpty else { return 0 } - return self.getCollectionViewHeight(model: model) - } - .bind(to: output.collectionViewHeight) - .disposed(by: disposeBag) - - input.itemSelected - .withLatestFrom(output.dataSource){ ($0, $1) } - .map{ (indexPath: IndexPath, dataSource: [ProfileListEntity]) -> [ProfileListEntity] in - var newModel = dataSource - guard let index = newModel.firstIndex(where:{$0.isSelected}) else { - return dataSource - } - newModel[index].isSelected = false //이전 선택 false - newModel[indexPath.row].isSelected = true //현재 선택 true - return newModel - } - .bind(to: output.dataSource) - .disposed(by: disposeBag) - - input.setProfileRequest - .flatMap { [weak self] (id) -> Observable in - guard let self = self else { return Observable.empty() } - return self.setProfileUseCase.execute(image: id) - .catch{ (error) in - - let wmError = error.asWMError - - if wmError == .tokenExpired { - return Single.create { single in - single(.success(BaseEntity(status: 401, description: error.asWMError.errorDescription ?? ""))) - return Disposables.create {} - } - } - - else { - return Single.create { single in - single(.success(BaseEntity(status: 0, description: error.asWMError.errorDescription ?? ""))) - return Disposables.create {} - } - } - - - }.asObservable() - } - .withLatestFrom(input.setProfileRequest) { ($0, $1) } - .do(onNext: {[weak self] (model, profile) in - - guard let self else {return} - - if model.status == 401 { - return - } - - guard model.status == 200 else { return } - Utility.PreferenceManager.userInfo = Utility.PreferenceManager.userInfo?.update(profile: profile) - }) - .map { $0.0 } - .bind(to: output.setProfileResult) - .disposed(by: disposeBag) - } - - private func getCollectionViewHeight(model: [ProfileListEntity]) -> CGFloat { - - let spacing: CGFloat = 10.0 - let itemHeight: CGFloat = (APP_WIDTH()-70)/4 - - let mok: Int = model.count / 4 - let remain: Int = model.count % 4 - - if model.count == 1 { - return itemHeight - - }else{ - if remain == 0 { - return (CGFloat(mok) * itemHeight) + (CGFloat(mok-1) * spacing) - }else{ - return (CGFloat(mok) * itemHeight) + (CGFloat(remain) * itemHeight) + (CGFloat(mok-1) * spacing) + (CGFloat(remain) * spacing) - } - } - } -} diff --git a/Projects/Features/CommonFeature/Sources/Views/ChartUpdateTimeView.swift b/Projects/Features/CommonFeature/Sources/Views/ChartUpdateTimeView.swift deleted file mode 100644 index 511694c0e..000000000 --- a/Projects/Features/CommonFeature/Sources/Views/ChartUpdateTimeView.swift +++ /dev/null @@ -1,63 +0,0 @@ -// -// PlayButtonForNewSongsView.swift -// CommonFeature -// -// Created by KTH on 2023/11/16. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import DesignSystem -import RxRelay -import RxSwift -import SnapKit -import Then - -public final class ChartUpdateTimeView: UIView { - private let updateTimeLabel = UILabel().then { - $0.font = DesignSystemFontFamily.Pretendard.light.font(size: 12) - $0.textColor = DesignSystemAsset.GrayColor.gray600.color - } - private let updateTimeImageView = UIImageView().then { - $0.image = DesignSystemAsset.Chart.check.image - } - - public override init(frame: CGRect) { - super.init(frame: frame) - self.setupView() - } - - required init?(coder aDecoder: NSCoder) { - super.init(coder: aDecoder) - self.setupView() - } - - public func setUpdateTime(updateTime: String) { - let attributedString = NSMutableAttributedString(string: updateTime) - attributedString.addAttributes([.font: DesignSystemFontFamily.Pretendard.light.font(size: 12), - .foregroundColor: DesignSystemAsset.GrayColor.gray600.color, - .kern: -0.5], - range: NSRange(location: 0, length: attributedString.string.count)) - updateTimeLabel.attributedText = attributedString - } -} - -extension ChartUpdateTimeView { - private func setupView() { - self.backgroundColor = DesignSystemAsset.GrayColor.gray100.color - - [updateTimeImageView, updateTimeLabel].forEach { self.addSubview($0) } - - updateTimeImageView.snp.makeConstraints { - $0.top.equalTo(1) - $0.width.height.equalTo(16) - $0.leading.equalTo(20) - } - - updateTimeLabel.snp.makeConstraints { - $0.top.equalTo(0) - $0.height.equalTo(18) - $0.leading.equalTo(updateTimeImageView.snp.trailing).offset(2) - } - } -} diff --git a/Projects/Features/CommonFeature/Sources/Views/ContainPlayListHeaderView.swift b/Projects/Features/CommonFeature/Sources/Views/ContainPlayListHeaderView.swift deleted file mode 100644 index 9a49082c9..000000000 --- a/Projects/Features/CommonFeature/Sources/Views/ContainPlayListHeaderView.swift +++ /dev/null @@ -1,63 +0,0 @@ -// -// ContainPlayListHeaderView.swift -// CommonFeature -// -// Created by yongbeomkwak on 2023/03/11. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import DesignSystem - -public protocol ContainPlayListHeaderViewDelegate : AnyObject { - func action() -} - -class ContainPlayListHeaderView: UIView { - @IBOutlet weak var superView: UIView! - @IBOutlet weak var button: UIButton! - @IBOutlet weak var buttonImageView: UIImageView! - - weak var delegate:ContainPlayListHeaderViewDelegate? - - @IBAction func buttonAction(_ sender: Any) { - self.delegate?.action() - } - - override init(frame: CGRect) { //코드쪽에서 생성 시 호출 - super.init(frame: frame) - self.setupView() - } - - required init?(coder aDecoder:NSCoder) //StoryBoard에서 호출됨 - { - super.init(coder: aDecoder) - self.setupView() - } - - private func setupView() - { - if let view = Bundle.module.loadNibNamed("ContainPlayListHeaderView", owner: self,options: nil)!.first as? UIView{ - view.frame = self.bounds - view.layoutIfNeeded() //드로우 사이클을 호출할 때 쓰임 - self.addSubview(view) - } - - self.buttonImageView.image = DesignSystemAsset.Storage.storageNewPlaylistAdd.image - - let attr = NSMutableAttributedString( - string: "새 리스트 만들기", - attributes: [ - .font: DesignSystemFontFamily.Pretendard.medium.font(size: 14), - .foregroundColor: DesignSystemAsset.GrayColor.gray900.color, - .kern: -0.5 - ] - ) - - superView.backgroundColor = .white.withAlphaComponent(0.4) - superView.layer.cornerRadius = 8 - superView.layer.borderColor = DesignSystemAsset.GrayColor.gray200.color.cgColor - superView.layer.borderWidth = 1 - self.button.setAttributedTitle(attr, for: .normal) - } -} diff --git a/Projects/Features/CommonFeature/Sources/Views/CurrentPlayListTableViewCell.swift b/Projects/Features/CommonFeature/Sources/Views/CurrentPlayListTableViewCell.swift deleted file mode 100644 index a8a3df391..000000000 --- a/Projects/Features/CommonFeature/Sources/Views/CurrentPlayListTableViewCell.swift +++ /dev/null @@ -1,42 +0,0 @@ -// -// CurrentPlayListTableViewCell.swift -// CommonFeature -// -// Created by yongbeomkwak on 2023/03/11. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import DesignSystem -import DomainModule -import Utility - -class CurrentPlayListTableViewCell: UITableViewCell { - - @IBOutlet weak var playListImageView: UIImageView! - @IBOutlet weak var playListNameLabel: UILabel! - @IBOutlet weak var playListCountLabel: UILabel! - - override func awakeFromNib() { - super.awakeFromNib() - self.backgroundColor = DesignSystemAsset.GrayColor.gray100.color - self.playListImageView.layer.cornerRadius = 4 - self.playListNameLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 14) - self.playListNameLabel.textColor = DesignSystemAsset.GrayColor.gray900.color - self.playListNameLabel.setTextWithAttributes(kernValue: -0.5) - self.playListCountLabel.font = DesignSystemFontFamily.Pretendard.light.font(size: 12) - self.playListCountLabel.textColor = DesignSystemAsset.GrayColor.gray900.color - self.playListCountLabel.setTextWithAttributes(kernValue: -0.5) - } -} - -extension CurrentPlayListTableViewCell { - func update(model:PlayListEntity) { - self.playListImageView.kf.setImage( - with: WMImageAPI.fetchPlayList(id: String(model.image),version: model.image_version).toURL, - placeholder: nil, - options: [.transition(.fade(0.2))]) - self.playListNameLabel.text = model.title - self.playListCountLabel.text = "\(model.songlist.count)곡" - } -} diff --git a/Projects/Features/CommonFeature/Sources/Views/EditSheetView.swift b/Projects/Features/CommonFeature/Sources/Views/EditSheetView.swift deleted file mode 100644 index 54f235ed9..000000000 --- a/Projects/Features/CommonFeature/Sources/Views/EditSheetView.swift +++ /dev/null @@ -1,130 +0,0 @@ -// -// EditSheetView.swift -// CommonFeature -// -// Created by KTH on 2023/03/17. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import Utility -import DesignSystem - -public protocol EditSheetViewDelegate: AnyObject{ - func buttonTapped(type: EditSheetSelectType) -} - -public enum EditSheetSelectType { - case edit - case share - case profile - case nickname -} - -public class EditSheetView: UIView { - @IBOutlet weak var contentView: UIView! - @IBOutlet weak var editButton: UIButton! - @IBOutlet weak var shareButton: UIButton! - @IBOutlet weak var profileButton: UIButton! - @IBOutlet weak var nicknameButton: UIButton! - - public weak var delegate: EditSheetViewDelegate? - public var type: EditSheetType = .playList - - public override init(frame: CGRect) { - super.init(frame: frame) - } - - required init?(coder aDecoder: NSCoder) { - super.init(coder: aDecoder) - self.setupView() - } - - convenience init(type: EditSheetType) { - self.init() - self.type = type - self.setupView() - } - - deinit { - DEBUG_LOG("\(Self.self) Deinit") - } - - @IBAction func buttonAction(_ sender: Any) { - - guard let button = sender as? UIButton else { return } - - if button == editButton { - delegate?.buttonTapped(type: .edit) - - }else if button == shareButton { - delegate?.buttonTapped(type: .share) - - }else if button == profileButton { - delegate?.buttonTapped(type: .profile) - - }else if button == nicknameButton { - delegate?.buttonTapped(type: .nickname) - } - } -} - -public extension EditSheetView { - - private func setupView(){ - guard let view = Bundle.module.loadNibNamed("EditSheetView", owner: self, options: nil)?.first as? UIView else { return } - view.frame = self.bounds - view.layoutIfNeeded() - addSubview(view) - configureType() - configureUI() - } - - private func configureType() { - - switch self.type { - - case .playList: - editButton.isHidden = false - shareButton.isHidden = false - profileButton.isHidden = true - nicknameButton.isHidden = true - - case .profile: - editButton.isHidden = true - shareButton.isHidden = true - profileButton.isHidden = false - nicknameButton.isHidden = false - } - } - - private func configureUI() { - contentView.backgroundColor = DesignSystemAsset.PrimaryColor.point.color - let titles: [String] = ["편집", "공유하기", "프로필 변경", "닉네임 수정"] - - let images: [UIImage] = [DesignSystemAsset.PlayListEdit.playlistEdit.image, - DesignSystemAsset.PlayListEdit.playlistShare.image, - DesignSystemAsset.Storage.profileEdit.image, - DesignSystemAsset.Storage.nicknameEdit.image] - - let buttons: [UIButton] = [editButton, - shareButton, - profileButton, - nicknameButton] - - guard titles.count == images.count, - titles.count == buttons.count else { return } - - for i in 0.. 0 ? max(height, minHeight) : height - - // Constrain maximum height - height = maxHeight > 0 ? min(height, maxHeight) : height - - // Add height constraint if it is not found - if heightConstraint == nil { - heightConstraint = NSLayoutConstraint(item: self, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: height) - addConstraint(heightConstraint!) - } - - // Update height constraint if needed - if height != heightConstraint!.constant { - shouldScrollAfterHeightChanged = true - heightConstraint!.constant = height - if let delegate = delegate as? GrowingTextViewDelegate { - delegate.textViewDidChangeHeight?(self, height: height) - } - } else if shouldScrollAfterHeightChanged { - shouldScrollAfterHeightChanged = false - scrollToCorrectPosition() - } - } - - private func scrollToCorrectPosition() { - if self.isFirstResponder { - self.scrollRangeToVisible(NSRange(location: -1, length: 0)) // Scroll to bottom - } else { - self.scrollRangeToVisible(NSRange(location: 0, length: 0)) // Scroll to top - } - } - - // Show placeholder if needed - override open func draw(_ rect: CGRect) { - super.draw(rect) - - let style = NSMutableParagraphStyle() - style.lineHeightMultiple = 1.35 - - self.attributedText = NSMutableAttributedString( - string: self.text, - attributes: [.font: DesignSystemFontFamily.Pretendard.medium.font(size: 16), - .foregroundColor: DesignSystemAsset.GrayColor.gray600.color, - .paragraphStyle: style] - ) - - if text.isEmpty { - let xValue = textContainerInset.left + textContainer.lineFragmentPadding - let yValue = textContainerInset.top - let width = rect.size.width - xValue - textContainerInset.right - let height = rect.size.height - yValue - textContainerInset.bottom - let placeholderRect = CGRect(x: xValue, y: yValue, width: width, height: height) - - if let attributedPlaceholder = attributedPlaceholder { - // Prefer to use attributedPlaceholder - attributedPlaceholder.draw(in: placeholderRect) - } else if let placeholder = placeholder { - // Otherwise user placeholder and inherit `text` attributes - let paragraphStyle = NSMutableParagraphStyle() - paragraphStyle.alignment = textAlignment - var attributes: [NSAttributedString.Key: Any] = [ - .foregroundColor: placeholderColor, - .paragraphStyle: paragraphStyle - ] - if let font = font { - attributes[.font] = font - } - - placeholder.draw(in: placeholderRect, withAttributes: attributes) - } - } - } - - // Trim white space and new line characters when end editing. - @objc func textDidEndEditing(notification: Notification) { - if let sender = notification.object as? GrowingTextView, sender == self { - if trimWhiteSpaceWhenEndEditing { - text = text?.trimmingCharacters(in: .whitespacesAndNewlines) - setNeedsDisplay() - } - scrollToCorrectPosition() - } - } - - // Limit the length of text - @objc func textDidChange(notification: Notification) { - if let sender = notification.object as? GrowingTextView, sender == self { - if maxLength > 0 && text.count > maxLength { - let endIndex = text.index(text.startIndex, offsetBy: maxLength) - text = String(text[.. NSMutableAttributedString { - let attributedString = NSMutableAttributedString( - string: text, - attributes: [ - .font: font, - .foregroundColor: DesignSystemAsset.GrayColor.gray900.color, - .kern: -0.5 - ] - ) - return attributedString - } -} diff --git a/Projects/Features/CommonFeature/Sources/Views/ProfileCollectionViewCell.swift b/Projects/Features/CommonFeature/Sources/Views/ProfileCollectionViewCell.swift deleted file mode 100644 index 86ddb0782..000000000 --- a/Projects/Features/CommonFeature/Sources/Views/ProfileCollectionViewCell.swift +++ /dev/null @@ -1,48 +0,0 @@ -// -// ProfileCollectionViewCell.swift -// DesignSystem -// -// Created by yongbeomkwak on 2023/01/26. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import Utility -import DesignSystem -import DomainModule - -public enum FanType: String{ - case panchi - case ifari - case dulgi - case bat - case segyun - case gorani - case jupock - case ddong -} - -public class ProfileCollectionViewCell: UICollectionViewCell { - - @IBOutlet weak var imageView: UIImageView! - - public override func awakeFromNib() { - super.awakeFromNib() - } -} - -public extension ProfileCollectionViewCell{ - - func update(_ model: ProfileListEntity){ - - self.imageView.layer.cornerRadius = ((APP_WIDTH() - 70) / 4) / 2 - self.imageView.layer.borderColor = model.isSelected ? DesignSystemAsset.PrimaryColor.point.color.cgColor : UIColor.clear.cgColor - self.imageView.layer.borderWidth = 3 - - self.imageView.kf.setImage( - with: URL(string: WMImageAPI.fetchProfile(name: model.type,version: model.version).toString), - placeholder: nil, - options: [.transition(.fade(0.2))] - ) - } -} diff --git a/Projects/Features/CommonFeature/Sources/Views/RecommendPlayListCell.swift b/Projects/Features/CommonFeature/Sources/Views/RecommendPlayListCell.swift deleted file mode 100644 index 07bb6c690..000000000 --- a/Projects/Features/CommonFeature/Sources/Views/RecommendPlayListCell.swift +++ /dev/null @@ -1,51 +0,0 @@ -// -// RecommendPlayListCell.swift -// HomeFeature -// -// Created by KTH on 2023/01/07. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import Utility -import DesignSystem -import DomainModule -import Kingfisher - -public class RecommendPlayListCell: UICollectionViewCell { - - @IBOutlet weak var titleStringLabel: UILabel! - - @IBOutlet weak var logoImageView: UIImageView! - public override func awakeFromNib() { - super.awakeFromNib() - - self.contentView.layer.cornerRadius = 8 - self.contentView.layer.borderColor = UIColor.white.cgColor - self.contentView.layer.borderWidth = 1 - self.contentView.backgroundColor = DesignSystemAsset.GrayColor.gray25.color - - let itemWidth: CGFloat = (APP_WIDTH()-(20+8+20)) / 2.0 - let itemHeight: CGFloat = (80.0 * itemWidth) / 164.0 - self.logoImageView.layer.cornerRadius = ((48 * itemHeight) / 80.0) / 2.0 - } -} - -extension RecommendPlayListCell { - - func update(model: RecommendPlayListEntity) { - let attributedString = NSMutableAttributedString( - string: model.title, - attributes: [.font: DesignSystemFontFamily.Pretendard.medium.font(size: 14.2), - .foregroundColor: DesignSystemAsset.GrayColor.gray600.color, - .kern: -0.5] - ) - titleStringLabel.attributedText = attributedString - - logoImageView.kf.setImage( - with: WMImageAPI.fetchRecommendPlayListWithRound(id: model.key,version: model.image_round_version).toURL, - placeholder: nil, - options: [.transition(.fade(0.2))] - ) - } -} diff --git a/Projects/Features/CommonFeature/Sources/Views/RecommendPlayListView.swift b/Projects/Features/CommonFeature/Sources/Views/RecommendPlayListView.swift deleted file mode 100644 index 18bfa1ace..000000000 --- a/Projects/Features/CommonFeature/Sources/Views/RecommendPlayListView.swift +++ /dev/null @@ -1,121 +0,0 @@ -// -// RecommendPlayListView.swift -// HomeFeature -// -// Created by KTH on 2023/01/07. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import Utility -import DesignSystem -import DomainModule - -public protocol RecommendPlayListViewDelegate: AnyObject { - func itemSelected(model: RecommendPlayListEntity) -} - -public class RecommendPlayListView: UIView { - - @IBOutlet weak var titleStringLabel: UILabel! - @IBOutlet weak var collectionView: UICollectionView! - - public weak var delegate: RecommendPlayListViewDelegate? - - public override init(frame: CGRect) { - super.init(frame: frame) - self.setupView() - } - - required init?(coder aDecoder: NSCoder) { - super.init(coder: aDecoder) - self.setupView() - } - - public var dataSource: [RecommendPlayListEntity] = [] { - didSet{ - collectionView.reloadData() - } - } -} - -public extension RecommendPlayListView { - - private func setupView(){ - guard let view = Bundle.module.loadNibNamed("RecommendPlayListView", owner: self, options: nil)?.first as? UIView else { return } - view.frame = self.bounds - view.layoutIfNeeded() - self.addSubview(view) - - //xib로 만든 UI를 컬렉션 뷰에서 사용하기 위해서는 등록이 필요 - collectionView.register(UINib(nibName:"RecommendPlayListCell", bundle: Bundle.module), - forCellWithReuseIdentifier: "RecommendPlayListCell") - collectionView.dataSource = self - collectionView.delegate = self - - let attributedString = NSMutableAttributedString( - string: "왁뮤팀이 추천하는 리스트", - attributes: [.font: DesignSystemFontFamily.Pretendard.bold.font(size: 16), - .foregroundColor: DesignSystemAsset.GrayColor.gray900.color, - .kern: -0.5] - ) - titleStringLabel.attributedText = attributedString - } - - static func getViewHeight(model: [RecommendPlayListEntity]) -> CGFloat { - guard !model.isEmpty else { - return 0 - } - - let base: CGFloat = 32 + 24 + 20 + 32 - let spacing: CGFloat = 8.0 - - let itemWidth: CGFloat = (APP_WIDTH()-(20+8+20)) / 2.0 - let itemHeight: CGFloat = (80.0 * itemWidth) / 164.0 - - let mok: Int = model.count / 2 - let remain: Int = model.count % 2 - - if model.count == 1 { - return base + itemHeight - - }else{ - if remain == 0 { - return base + (CGFloat(mok) * itemHeight) + (CGFloat(mok-1) * spacing) - }else{ - return base + (CGFloat(mok) * itemHeight) + (CGFloat(remain) * itemHeight) + (CGFloat(mok-1) * spacing) + (CGFloat(remain) * spacing) - } - } - } -} - -extension RecommendPlayListView: UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout { - - public func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { - self.delegate?.itemSelected(model: self.dataSource[indexPath.row]) - } - - public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - return self.dataSource.count - } - - public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { - let itemWidth: CGFloat = (APP_WIDTH()-(20+8+20)) / 2.0 - let itemHeight: CGFloat = (80.0 * itemWidth) / 164.0 - return CGSize(width: itemWidth, height: itemHeight) - } - - public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { - guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "RecommendPlayListCell", - for: indexPath) as? RecommendPlayListCell else { - return UICollectionViewCell() - } - let model = self.dataSource[indexPath.row] - cell.update(model: model) - return cell - } - - public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { - return 8 - } -} diff --git a/Projects/Features/CommonFeature/Sources/Views/SongCartView.swift b/Projects/Features/CommonFeature/Sources/Views/SongCartView.swift deleted file mode 100644 index e7b86e176..000000000 --- a/Projects/Features/CommonFeature/Sources/Views/SongCartView.swift +++ /dev/null @@ -1,235 +0,0 @@ -// -// EditBottomSheetView.swift -// DesignSystem -// -// Created by KTH on 2023/01/25. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import DesignSystem -import Utility - -public protocol SongCartViewDelegate: AnyObject{ - func buttonTapped(type: SongCartSelectType) -} - -public enum SongCartSelectType { - case allSelect(flag: Bool) // 전체선택 - case addSong // 노래담기 - case addPlayList // 재생목록추가 - case play // 재생 - case remove // 삭제 -} - -public class SongCartView: UIView { - - @IBOutlet weak var allSelectView: UIView! - @IBOutlet weak var allSelectImageView: UIImageView! - @IBOutlet weak var allSelectLabel: UILabel! - @IBOutlet weak var allSelectButton: UIButton! - @IBOutlet weak var songAddButton: UIButton! - @IBOutlet weak var playListAddButton: UIButton! - @IBOutlet weak var removeButton: UIButton! - @IBOutlet weak var playButton: UIButton! - @IBOutlet weak var selectCountView: UIView! - @IBOutlet weak var selectCountViewLeadingConstraint: NSLayoutConstraint! - @IBOutlet weak var selectCountLabel: UILabel! - @IBOutlet weak var stackContentView: UIView! - @IBOutlet weak var bottomSpaceView: UIView! - @IBOutlet weak var bottomSpaceViewHeight: NSLayoutConstraint! - - public weak var delegate: SongCartViewDelegate? - public var type: SongCartType = .playList - - public override init(frame: CGRect) { - super.init(frame: frame) - } - - required init?(coder aDecoder: NSCoder) { - super.init(coder: aDecoder) - self.setupView() - } - - convenience init(type: SongCartType) { - self.init() - self.type = type - self.setupView() - } - - deinit { - DEBUG_LOG("\(Self.self) Deinit") - } - - @IBAction func buttonAction(_ sender: Any) { - - guard let button = sender as? UIButton else { return } - - if button == allSelectButton { //전체선택 - allSelectButton.isSelected = !allSelectButton.isSelected - allSelectImageView.image = allSelectButton.isSelected ? DesignSystemAsset.PlayListEdit.checkOn.image : DesignSystemAsset.PlayListEdit.checkOff.image - allSelectLabel.text = allSelectButton.isSelected ? "전체선택해제" : "전체선택" - delegate?.buttonTapped(type: .allSelect(flag: allSelectButton.isSelected)) - - }else if button == songAddButton { //노래담기 - guard Utility.PreferenceManager.userInfo != nil else { - showLoginPopup() - return - } - delegate?.buttonTapped(type: .addSong) - - }else if button == playListAddButton { //재생목록추가 - delegate?.buttonTapped(type: .addPlayList) - - }else if button == playButton { //재생 - delegate?.buttonTapped(type: .play) - - }else if button == removeButton { //삭제 - if self.type == .playList { - delegate?.buttonTapped(type: .remove) - - }else{ - guard Utility.PreferenceManager.userInfo != nil else { - showLoginPopup() - return - } - delegate?.buttonTapped(type: .remove) - } - } - } -} - -public extension SongCartView { - - private func setupView(){ - guard let view = Bundle.module.loadNibNamed("SongCartView", owner: self, options: nil)?.first as? UIView else { return } - view.frame = self.bounds - view.layoutIfNeeded() - addSubview(view) - configureType() - configureUI() - } - - private func configureType() { - - switch self.type { - - case .playList: - allSelectView.isHidden = false - songAddButton.isHidden = false - playListAddButton.isHidden = true - playButton.isHidden = true - removeButton.isHidden = false - - case .chartSong, .artistSong, .WMPlayList: - allSelectView.isHidden = false - songAddButton.isHidden = false - playListAddButton.isHidden = false - playButton.isHidden = false - removeButton.isHidden = true - - case .likeSong, .myPlayList: - allSelectView.isHidden = false - songAddButton.isHidden = false - playListAddButton.isHidden = false - playButton.isHidden = true - removeButton.isHidden = false - - case .myList: - allSelectView.isHidden = false - songAddButton.isHidden = true - playListAddButton.isHidden = false - playButton.isHidden = true - removeButton.isHidden = false - - case .searchSong: - allSelectView.isHidden = true - songAddButton.isHidden = false - playListAddButton.isHidden = false - playButton.isHidden = false - removeButton.isHidden = true - } - } - - private func configureUI() { - - selectCountView.backgroundColor = .white - selectCountView.layer.cornerRadius = selectCountView.frame.width / 2 - selectCountView.clipsToBounds = true - - selectCountLabel.font = DesignSystemFontFamily.Pretendard.bold.font(size: 18) - selectCountLabel.text = "1" - selectCountLabel.textColor = DesignSystemAsset.PrimaryColor.point.color - - let titles: [String] = ["전체선택", "노래담기", "재생목록추가", "재생", "삭제"] - - let images: [UIImage] = [DesignSystemAsset.PlayListEdit.checkOff.image, - DesignSystemAsset.PlayListEdit.musicAdd.image, - DesignSystemAsset.PlayListEdit.playlistAdd.image, - DesignSystemAsset.PlayListEdit.playlistPlay.image, - DesignSystemAsset.PlayListEdit.delete.image] - - let buttons: [UIButton] = [allSelectButton, - songAddButton, - playListAddButton, - playButton, - removeButton] - - guard titles.count == images.count, - titles.count == buttons.count else { return } - - for i in 0..= 1000 ? 8 : 20 - self.layoutIfNeeded() - } - - func updateAllSelect(isAll: Bool) { - self.allSelectButton.isSelected = isAll - self.allSelectImageView.image = self.allSelectButton.isSelected ? DesignSystemAsset.PlayListEdit.checkOn.image : DesignSystemAsset.PlayListEdit.checkOff.image - self.allSelectLabel.text = self.allSelectButton.isSelected ? "전체선택해제" : "전체선택" - } - - func updateBottomSpace(isUse: Bool) { - self.bottomSpaceView.isHidden = isUse ? false : true - } -} - -extension SongCartView { - private func showLoginPopup() { - let viewController = TextPopupViewController.viewController(text: "로그인이 필요한 서비스입니다.\n로그인 하시겠습니까?", cancelButtonIsHidden: false, completion: { () in - NotificationCenter.default.post(name: .movedTab, object: 4) - }) - guard let parent = self.parentViewController() else { return } - parent.showPanModal(content: viewController) - } -} diff --git a/Projects/Features/CommonFeature/Sources/Views/SongListCell.swift b/Projects/Features/CommonFeature/Sources/Views/SongListCell.swift deleted file mode 100644 index f3866ac77..000000000 --- a/Projects/Features/CommonFeature/Sources/Views/SongListCell.swift +++ /dev/null @@ -1,79 +0,0 @@ -// -// SongListCellView.swift -// DesignSystem -// -// Created by yongbeomkwak on 2023/01/11. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import Utility -import DesignSystem -import DomainModule -import Kingfisher -import SnapKit - -public class SongListCell: UITableViewCell { - @IBOutlet weak var albumImageView: UIImageView! - @IBOutlet weak var titleLabel: UILabel! - @IBOutlet weak var artistLabel: UILabel! - @IBOutlet weak var releaseDateLabel: UILabel! - @IBOutlet weak var thumbnailToPlayButton: UIButton! - - private var model: SongEntity? - - public override func awakeFromNib() { - super.awakeFromNib() - self.backgroundColor = .clear - albumImageView.layer.cornerRadius = 4 - } - - @IBAction func thumbnailToPlayButtonAction(_ sender: Any) { - guard let songEntity = self.model else { return } - PlayState.shared.loadAndAppendSongsToPlaylist([songEntity]) - } -} - -public extension SongListCell { - static func getCellHeight() -> CGFloat { - let base: CGFloat = 10 + 10 - let width: CGFloat = (72.0 * APP_WIDTH()) / 375.0 - let height: CGFloat = (width * 40.0) / 72.0 - return base + height - } - - func update(_ model:SongEntity) { - self.contentView.backgroundColor = model.isSelected ? DesignSystemAsset.GrayColor.gray200.color : UIColor.clear - self.model = model - - albumImageView.kf.setImage(with: WMImageAPI.fetchYoutubeThumbnail(id: model.id).toURL,placeholder: DesignSystemAsset.Logo.placeHolderSmall.image,options: [.transition(.fade(0.2))]) - - self.titleLabel.attributedText = getAttributedString( - text: model.title, - font: DesignSystemFontFamily.Pretendard.medium.font(size: 14) - ) - self.artistLabel.attributedText = getAttributedString( - text: model.artist, - font: DesignSystemFontFamily.Pretendard.light.font(size: 12) - ) - self.releaseDateLabel.attributedText = getAttributedString( - text: model.date, - font: DesignSystemFontFamily.SCoreDream._3Light.font(size: 12) - ) - } - - private func getAttributedString( - text: String, - font: UIFont - ) -> NSMutableAttributedString { - let attributedString = NSMutableAttributedString( - string: text, - attributes: [ - .font: font, - .foregroundColor: DesignSystemAsset.GrayColor.gray900.color, - .kern: -0.5 - ] - ) - return attributedString - } -} diff --git a/Projects/Features/CommonFeature/Sources/Views/WarningView.swift b/Projects/Features/CommonFeature/Sources/Views/WarningView.swift deleted file mode 100644 index a99a5d18e..000000000 --- a/Projects/Features/CommonFeature/Sources/Views/WarningView.swift +++ /dev/null @@ -1,48 +0,0 @@ -// -// WarningView.swift -// Created by yongbeomkwak on 2023/01/07. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// -import UIKit -import DesignSystem - -public class WarningView: UIView { - @IBOutlet weak var superView: UIView! - @IBOutlet weak var warningLabelView: UILabel! - @IBOutlet weak var warningImageView: UIImageView! - - public var text: String = "" { - didSet{ - warningLabelView.text = text - } - } - - public override init(frame: CGRect) { // 코드쪽에서 생성 시 호출 - super.init(frame: frame) - self.setupView() - } - - required init?(coder aDecoder: NSCoder) { // StoryBoard에서 호출됨 - super.init(coder: aDecoder) - self.setupView() - } - - private func setupView(){ - guard let view = Bundle.module.loadNibNamed("Warning", owner: self,options: nil)?.first as? UIView else { return } - view.frame = self.bounds - view.layoutIfNeeded() //드로우 사이클을 호출할 때 쓰임 - view.backgroundColor = .clear //헤더 영역 흰 색 방지 - self.superView.backgroundColor = .clear - self.addSubview(view) - configureUI() - } -} - -extension WarningView { - private func configureUI() { - warningImageView.image = DesignSystemAsset.Search.warning.image - warningLabelView.textColor = DesignSystemAsset.GrayColor.gray900.color - warningLabelView.setTextWithAttributes(kernValue: -0.5) - warningLabelView.font = DesignSystemFontFamily.Pretendard.medium.font(size: 14) - } -} diff --git a/Projects/Features/CommonFeature/Tests/PlaylistTests.swift b/Projects/Features/CommonFeature/Tests/PlaylistTests.swift deleted file mode 100644 index ca299f418..000000000 --- a/Projects/Features/CommonFeature/Tests/PlaylistTests.swift +++ /dev/null @@ -1,82 +0,0 @@ -// -// PlaylistTests.swift -// CommonFeature -// -// Created by YoungK on 2023/09/25. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import XCTest -import DomainModule -import CommonFeature - -final class PlaylistTests: XCTestCase { - let givenList = [ - SongEntity(id: "", title: "제목1", artist: "", remix: "", reaction: "", views: 0, last: 0, date: ""), - SongEntity(id: "", title: "제목2", artist: "", remix: "", reaction: "", views: 0, last: 0, date: ""), - SongEntity(id: "", title: "제목3", artist: "", remix: "", reaction: "", views: 0, last: 0, date: ""), - SongEntity(id: "", title: "제목4", artist: "", remix: "", reaction: "", views: 0, last: 0, date: ""), - SongEntity(id: "", title: "제목5", artist: "", remix: "", reaction: "", views: 0, last: 0, date: ""), - SongEntity(id: "", title: "제목6", artist: "", remix: "", reaction: "", views: 0, last: 0, date: ""), - SongEntity(id: "", title: "제목7", artist: "", remix: "", reaction: "", views: 0, last: 0, date: "") - ].map { PlayListItem(item: $0) } - - override func setUpWithError() throws { - // Put setup code here. This method is called before the invocation of each test method in the class. - } - - override func tearDownWithError() throws { - // Put teardown code here. This method is called after the invocation of each test method in the class. - } - - func testRemoveSong() { - // given - var playList = PlayList(list: givenList) - playList.changeCurrentPlayIndex(to: 2) - - // when - playList.remove(indexs: [1, 2, 4, 5]) - - // then - var currentPlayIndex = playList.currentPlayIndex ?? -1 - XCTAssertEqual(currentPlayIndex , 1) - XCTAssertEqual(playList.count, 3) - XCTAssertEqual(playList.list[0].item.title, "제목1") - XCTAssertEqual(playList.list[1].item.title, "제목4") - - // given - playList = PlayList(list: givenList) - playList.changeCurrentPlayIndex(to: playList.lastIndex) - - // when - playList.remove(indexs: [4, 5, 6]) - - // then - currentPlayIndex = playList.currentPlayIndex ?? -1 - XCTAssertEqual(currentPlayIndex , 0) - XCTAssertEqual(playList.count, 4) - XCTAssertEqual(playList.list[0].item.title, "제목1") - XCTAssertEqual(playList.list[1].item.title, "제목2") - } - - func testRorderSong() { - // given - var playList = PlayList(list: givenList) - playList.list[0].isPlaying = true - - // when - playList.reorderPlaylist(from: 2, to: 1) - - // then - var currentPlayIndex = playList.currentPlayIndex ?? -1 - XCTAssertEqual(currentPlayIndex, 0) - - // when - playList.reorderPlaylist(from: 0, to: 6) - - // then - currentPlayIndex = playList.currentPlayIndex ?? -1 - XCTAssertEqual(currentPlayIndex, 6) - } - -} diff --git a/Projects/Features/CommonFeature/Tests/TargetTests.swift b/Projects/Features/CommonFeature/Tests/TargetTests.swift deleted file mode 100644 index aa23840f2..000000000 --- a/Projects/Features/CommonFeature/Tests/TargetTests.swift +++ /dev/null @@ -1,53 +0,0 @@ -import XCTest -import CommonFeature -import DomainModule - -class TargetTests: XCTestCase { - let givenList = [ - SongEntity(id: "", title: "제목1", artist: "", remix: "", reaction: "", views: 0, last: 0, date: ""), - SongEntity(id: "", title: "제목2", artist: "", remix: "", reaction: "", views: 0, last: 0, date: ""), - SongEntity(id: "", title: "제목3", artist: "", remix: "", reaction: "", views: 0, last: 0, date: ""), - SongEntity(id: "", title: "제목4", artist: "", remix: "", reaction: "", views: 0, last: 0, date: ""), - SongEntity(id: "", title: "제목5", artist: "", remix: "", reaction: "", views: 0, last: 0, date: ""), - SongEntity(id: "", title: "제목6", artist: "", remix: "", reaction: "", views: 0, last: 0, date: ""), - SongEntity(id: "", title: "제목7", artist: "", remix: "", reaction: "", views: 0, last: 0, date: "") - ].map { PlayListItem(item: $0) } - - override func setUpWithError() throws { - // Put setup code here. This method is called before the invocation of each test method in the class. - } - - override func tearDownWithError() throws { - // Put teardown code here. This method is called after the invocation of each test method in the class. - } - - func testExample() throws { - XCTAssertEqual("A", "A") - } - - func testAppendSong() { - // given - var playState = PlayState(player: nil) - var playList = playState.playList - playList.list = givenList - - // when - let testList = [ - SongEntity(id: "", title: "제목3", artist: "", remix: "", reaction: "", views: 0, last: 0, date: ""), - SongEntity(id: "", title: "제목2", artist: "", remix: "", reaction: "", views: 0, last: 0, date: ""), - SongEntity(id: "", title: "제목5", artist: "", remix: "", reaction: "", views: 0, last: 0, date: ""), - SongEntity(id: "", title: "제목6", artist: "", remix: "", reaction: "", views: 0, last: 0, date: "") - ] - playState.loadAndAppendSongsToPlaylist(testList) - - // then 147 3256 - let currentPlayIndex = playList.currentPlayIndex ?? -1 - XCTAssertEqual(currentPlayIndex, 3) - XCTAssertEqual(playList.list[2].item.title, "제목7") - XCTAssertEqual(playList.list[3].item.title, "제목3") - XCTAssertEqual(playList.list[4].item.title, "제목2") - XCTAssertEqual(playList.list[5].item.title, "제목5") - XCTAssertEqual(playList.list[6].item.title, "제목6") - } - -} diff --git a/Projects/Features/CreditSongListFeature/Demo/Resources/LaunchScreen.storyboard b/Projects/Features/CreditSongListFeature/Demo/Resources/LaunchScreen.storyboard new file mode 100644 index 000000000..865e9329f --- /dev/null +++ b/Projects/Features/CreditSongListFeature/Demo/Resources/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Projects/Features/CreditSongListFeature/Demo/Sources/AppDelegate.swift b/Projects/Features/CreditSongListFeature/Demo/Sources/AppDelegate.swift new file mode 100644 index 000000000..6c7849559 --- /dev/null +++ b/Projects/Features/CreditSongListFeature/Demo/Sources/AppDelegate.swift @@ -0,0 +1,121 @@ +import BaseFeature +import BaseFeatureInterface +import CreditDomainTesting +@testable import CreditSongListFeature +import CreditSongListFeatureInterface +import Inject +import RxSwift +import SignInFeatureInterface +import UIKit + +@main +final class AppDelegate: UIResponder, UIApplicationDelegate { + var window: UIWindow? + + func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil + ) -> Bool { + window = UIWindow(frame: UIScreen.main.bounds) + let creditSongListTabFactory = FakeCreditSongListTabFactory() + let reactor = CreditSongListReactor( + workerName: "CLTH", + fetchCreditProfileUseCase: FetchCreditProfileUseCaseSpy() + ) + let viewController = CreditSongListViewController( + reactor: reactor, + creditSongListTabFactory: creditSongListTabFactory + ) + window?.rootViewController = Inject.ViewControllerHost(viewController) + window?.makeKeyAndVisible() + + return true + } +} + +final class FakeCreditSongListTabFactory: CreditSongListTabFactory { + func makeViewController(workerName: String) -> UIViewController { + let creditSongListTabItemFactory = FakeCreditSongListTabItemFactory() + return CreditSongListTabViewController( + workerName: workerName, + creditSongListTabItemFactory: creditSongListTabItemFactory + ) + } +} + +final class FakeCreditSongListTabItemFactory: CreditSongListTabItemFactory { + func makeViewController(workerName: String, sortType: CreditSongSortType) -> UIViewController { + let fetchCreditSongListUseCase = FetchCreditSongListUseCaseSpy() + fetchCreditSongListUseCase.handler = { _, _, _, _ in + .just([ + .init(id: "6GQV6lhwgNs", title: "팬섭", artist: "세구", views: 100_000_000, date: "2024"), + .init(id: "5qUwMpUWNLQ", title: "신시대", artist: "세구", views: 100_000_000, date: "2024"), + .init(id: "5qUwMpUWNQ", title: "신시대", artist: "세구", views: 100_000_000, date: "2024"), + .init(id: "5qUwMpUWLQ", title: "신시대", artist: "세구", views: 100_000_000, date: "2024"), + .init(id: "5qUwMpUNLQ", title: "신시대", artist: "세구", views: 100_000_000, date: "2024"), + .init(id: "5qUwMpWNLQ", title: "신시대", artist: "세구", views: 100_000_000, date: "2024"), + .init(id: "5qUwMUWNLQ", title: "신시대", artist: "세구", views: 100_000_000, date: "2024"), + .init(id: "5qUwpUWNLQ", title: "신시대", artist: "세구", views: 100_000_000, date: "2024"), + .init(id: "5qUMpUWNLQ", title: "신시대", artist: "세구", views: 100_000_000, date: "2024"), + .init(id: "5qwMpUWNLQ", title: "신시대", artist: "세구", views: 100_000_000, date: "2024"), + .init(id: "5UwMpUWNLQ", title: "신시대", artist: "세구", views: 100_000_000, date: "2024"), + .init(id: "qUwMpUWNLQ", title: "신시대", artist: "세구", views: 100_000_000, date: "2024"), + .init(id: "UwMpUWNLQ", title: "신시대", artist: "세구", views: 100_000_000, date: "2024") + ]) + } + + let reactor = CreditSongListTabItemReactor( + workerName: workerName, + creditSortType: sortType, + songDetailPresenter: DummySongDetailPresenter(), + fetchCreditSongListUseCase: fetchCreditSongListUseCase + ) + return Inject.ViewControllerHost( + CreditSongListTabItemViewController( + reactor: reactor, + containSongsFactory: DummyContainSongsFactory(), + textPopupFactory: DummyTextPopupFactory(), + signInFactory: DummySignInFactory() + ) + ) + } +} + +final class DummySongDetailPresenter: SongDetailPresentable { + var presentSongDetailObservable: RxSwift.Observable<(ids: [String], selectedID: String)> { + .empty() + } + + func present(id: String) {} + + func present(ids: [String], selectedID: String) {} +} + +final class DummyContainSongsFactory: ContainSongsFactory { + func makeView(songs: [String]) -> UIViewController { + let viewController = UIViewController() + DispatchQueue.main.asyncAfter(deadline: .now() + 3) { + viewController.dismiss(animated: true) + } + return viewController + } +} + +final class DummySignInFactory: SignInFactory { + func makeView() -> UIViewController { + return UIViewController() + } +} + +final class DummyTextPopupFactory: TextPopupFactory { + func makeView( + text: String?, + cancelButtonIsHidden: Bool, + confirmButtonText: String?, + cancelButtonText: String?, + completion: (() -> Void)?, + cancelCompletion: (() -> Void)? + ) -> UIViewController { + return UIViewController() + } +} diff --git a/Projects/Features/CreditSongListFeature/Interface/CreditSongListFactory.swift b/Projects/Features/CreditSongListFeature/Interface/CreditSongListFactory.swift new file mode 100644 index 000000000..100b3e0ad --- /dev/null +++ b/Projects/Features/CreditSongListFeature/Interface/CreditSongListFactory.swift @@ -0,0 +1,5 @@ +import UIKit + +public protocol CreditSongListFactory { + func makeViewController(workerName: String) -> UIViewController +} diff --git a/Projects/Features/CreditSongListFeature/Interface/CreditSongListTabFactory.swift b/Projects/Features/CreditSongListFeature/Interface/CreditSongListTabFactory.swift new file mode 100644 index 000000000..ddf166b74 --- /dev/null +++ b/Projects/Features/CreditSongListFeature/Interface/CreditSongListTabFactory.swift @@ -0,0 +1,5 @@ +import UIKit + +public protocol CreditSongListTabFactory { + func makeViewController(workerName: String) -> UIViewController +} diff --git a/Projects/Features/CreditSongListFeature/Interface/CreditSongListTabItemFactory.swift b/Projects/Features/CreditSongListFeature/Interface/CreditSongListTabItemFactory.swift new file mode 100644 index 000000000..fde4ff1d2 --- /dev/null +++ b/Projects/Features/CreditSongListFeature/Interface/CreditSongListTabItemFactory.swift @@ -0,0 +1,5 @@ +import UIKit + +public protocol CreditSongListTabItemFactory { + func makeViewController(workerName: String, sortType: CreditSongSortType) -> UIViewController +} diff --git a/Projects/Features/CreditSongListFeature/Interface/CreditSortType.swift b/Projects/Features/CreditSongListFeature/Interface/CreditSortType.swift new file mode 100644 index 000000000..c6cc2727e --- /dev/null +++ b/Projects/Features/CreditSongListFeature/Interface/CreditSortType.swift @@ -0,0 +1,16 @@ +public enum CreditSongSortType: CaseIterable { + case latest + case popular + case oldest + + public var display: String { + switch self { + case .latest: + return "최신순" + case .popular: + return "인기순" + case .oldest: + return "과거순" + } + } +} diff --git a/Projects/Features/CreditSongListFeature/Project.swift b/Projects/Features/CreditSongListFeature/Project.swift new file mode 100644 index 000000000..69e5906df --- /dev/null +++ b/Projects/Features/CreditSongListFeature/Project.swift @@ -0,0 +1,26 @@ +import DependencyPlugin +import ProjectDescription +import ProjectDescriptionHelpers + +let project = Project.module( + name: ModulePaths.Feature.CreditSongListFeature.rawValue, + targets: [ + .interface(module: .feature(.CreditSongListFeature)), + .implements(module: .feature(.CreditSongListFeature), dependencies: [ + .feature(target: .BaseFeature), + .feature(target: .CreditSongListFeature, type: .interface), + .feature(target: .SignInFeature, type: .interface), + .domain(target: .CreditDomain, type: .interface) + ]), + .testing(module: .feature(.CreditSongListFeature), dependencies: [ + .feature(target: .CreditSongListFeature, type: .interface) + ]), + .tests(module: .feature(.CreditSongListFeature), dependencies: [ + .feature(target: .CreditSongListFeature) + ]), + .demo(module: .feature(.CreditSongListFeature), dependencies: [ + .feature(target: .CreditSongListFeature), + .domain(target: .CreditDomain, type: .testing) + ]) + ] +) diff --git a/Projects/Features/CreditSongListFeature/Sources/CreditSongList/Component/CreditSongListComponent.swift b/Projects/Features/CreditSongListFeature/Sources/CreditSongList/Component/CreditSongListComponent.swift new file mode 100644 index 000000000..00c6cec8e --- /dev/null +++ b/Projects/Features/CreditSongListFeature/Sources/CreditSongList/Component/CreditSongListComponent.swift @@ -0,0 +1,23 @@ +import CreditDomainInterface +import CreditSongListFeatureInterface +import NeedleFoundation +import UIKit + +public protocol CreditSongListDependency: Dependency { + var creditSongListTabFactory: any CreditSongListTabFactory { get } + var fetchCreditProfileUseCase: any FetchCreditProfileUseCase { get } +} + +public final class CreditSongListComponent: Component, CreditSongListFactory { + public func makeViewController(workerName: String) -> UIViewController { + let reactor = CreditSongListReactor( + workerName: workerName, + fetchCreditProfileUseCase: dependency.fetchCreditProfileUseCase + ) + let viewController = CreditSongListViewController( + reactor: reactor, + creditSongListTabFactory: dependency.creditSongListTabFactory + ) + return viewController + } +} diff --git a/Projects/Features/CreditSongListFeature/Sources/CreditSongList/CreditSongListReactor.swift b/Projects/Features/CreditSongListFeature/Sources/CreditSongList/CreditSongListReactor.swift new file mode 100644 index 000000000..43ac6d899 --- /dev/null +++ b/Projects/Features/CreditSongListFeature/Sources/CreditSongList/CreditSongListReactor.swift @@ -0,0 +1,60 @@ +import CreditDomainInterface +import ReactorKit + +final class CreditSongListReactor: Reactor { + enum Action { + case viewDidLoad + } + + enum Mutation { + case updateProfile(CreditProfileEntity) + } + + struct State { + var workerName: String + var profile: CreditProfileEntity + } + + let initialState: State + internal let workerName: String + private let fetchCreditProfileUseCase: FetchCreditProfileUseCase + + init( + workerName: String, + fetchCreditProfileUseCase: FetchCreditProfileUseCase + ) { + self.initialState = .init( + workerName: workerName, + profile: .init(name: "", imageURL: nil) + ) + self.workerName = workerName + self.fetchCreditProfileUseCase = fetchCreditProfileUseCase + } + + func mutate(action: Action) -> Observable { + switch action { + case .viewDidLoad: + return viewDidLoad() + } + } + + func reduce(state: State, mutation: Mutation) -> State { + var newState = state + + switch mutation { + case let .updateProfile(data): + newState.profile = data + } + + return newState + } +} + +private extension CreditSongListReactor { + func viewDidLoad() -> Observable { + fetchCreditProfileUseCase + .execute(name: workerName) + .map { Mutation.updateProfile($0) } + .asObservable() + } +} diff --git a/Projects/Features/CreditSongListFeature/Sources/CreditSongList/CreditSongListViewController.swift b/Projects/Features/CreditSongListFeature/Sources/CreditSongList/CreditSongListViewController.swift new file mode 100644 index 000000000..3b6b0f303 --- /dev/null +++ b/Projects/Features/CreditSongListFeature/Sources/CreditSongList/CreditSongListViewController.swift @@ -0,0 +1,182 @@ +import BaseFeature +import CreditSongListFeatureInterface +import DesignSystem +import LogManager +import RxSwift +import SnapKit +import UIKit +import Utility + +final class CreditSongListViewController: BaseReactorViewController { + private let creditProfileGradientContainerView = UIView().then { + $0.alpha = 0.6 + } + + private let wmNavigationBar = WMNavigationBarView() + private let dismissButton = UIButton(type: .system).then { + $0.setImage(DesignSystemAsset.Navigation.back.image, for: .normal) + $0.tintColor = .black + } + + private let creditProfileView = CreditProfileView() + private let creditSongListTabViewController: UIViewController + private var creditSongListTabView: UIView { creditSongListTabViewController.view } + + private var creditProfileViewTopConstraint: NSLayoutConstraint? + private var minusCreditProfileViewMaxHeight: CGFloat = 0 + private var scrollHistory: [Int: CGFloat] = [:] + + private var profileGradientLayer: CAGradientLayer? + + init( + reactor: Reactor, + creditSongListTabFactory: any CreditSongListTabFactory + ) { + self.creditSongListTabViewController = creditSongListTabFactory.makeViewController( + workerName: reactor.workerName + ) + super.init(reactor: reactor) + } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + let log = CommonAnalyticsLog.viewPage(pageName: .creditSongList) + LogManager.analytics(log) + } + + override func viewDidLayoutSubviews() { + super.viewDidLayoutSubviews() + if profileGradientLayer == nil { + let gradientLayer = CAGradientLayer() + gradientLayer.colors = [ + DesignSystemAsset.BlueGrayColor.blueGray900.color.cgColor, + DesignSystemAsset.BlueGrayColor.blueGray900.color.withAlphaComponent(0.0).cgColor + ] + gradientLayer.frame = creditProfileGradientContainerView.bounds + creditProfileGradientContainerView.layer.addSublayer(gradientLayer) + profileGradientLayer = gradientLayer + } + + if minusCreditProfileViewMaxHeight == 0, creditProfileView.frame.height != 0 { + minusCreditProfileViewMaxHeight = -creditProfileView.frame.height + } + } + + override func addView() { + addChild(creditSongListTabViewController) + view.addSubviews(creditSongListTabView) + creditSongListTabViewController.didMove(toParent: self) + + view.addSubviews(creditProfileGradientContainerView, wmNavigationBar, creditProfileView) + wmNavigationBar.setLeftViews([dismissButton]) + } + + override func setLayout() { + creditProfileGradientContainerView.snp.makeConstraints { + $0.top.horizontalEdges.equalToSuperview() + $0.height.equalTo(210) + } + + wmNavigationBar.snp.makeConstraints { + $0.top.equalToSuperview().offset(STATUS_BAR_HEGHIT()) + $0.horizontalEdges.equalToSuperview() + $0.height.equalTo(48) + } + + creditProfileViewTopConstraint = creditProfileView.topAnchor.constraint( + equalTo: wmNavigationBar.bottomAnchor, + constant: 8 + ) + creditProfileViewTopConstraint?.isActive = true + + creditProfileView.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview().inset(20) + } + + creditSongListTabView.snp.makeConstraints { + $0.top.equalTo(creditProfileView.snp.bottom).offset(24) + $0.horizontalEdges.bottom.equalToSuperview() + } + } + + override func configureUI() { + view.backgroundColor = DesignSystemAsset.BlueGrayColor.blueGray100.color + } + + override func configureNavigation() {} + + override func bindAction(reactor: CreditSongListReactor) { + self.rx.methodInvoked(#selector(viewDidLoad)) + .map { _ in Reactor.Action.viewDidLoad } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + dismissButton.rx.tap + .bind(with: self) { owner, _ in + owner.navigationController?.popViewController(animated: true) + } + .disposed(by: disposeBag) + } + + override func bindState(reactor: CreditSongListReactor) { + let sharedState = reactor.state.share() + + sharedState.map(\.profile) + .bind(with: creditProfileView) { view, entity in + view.updateProfile(entity: entity) + } + .disposed(by: disposeBag) + + CreditSongListScopedState.shared.creditSongTabItemScrolledObservable + .observe(on: MainScheduler.asyncInstance) + .bind(with: self) { owner, scrollView in + owner.songListDidScroll(scrollView: scrollView) + } + .disposed(by: disposeBag) + } +} + +private extension CreditSongListViewController { + func songListDidScroll(scrollView: UIScrollView) { + guard let creditProfileViewTopConstraint else { return } + + let scrollDiff = scrollView.contentOffset.y - scrollHistory[ + scrollView.hash, + default: scrollView.contentOffset.y + ] + let absoluteTop: CGFloat = 0 + let absoluteBottom: CGFloat = scrollView.contentSize.height - scrollView.frame.size.height + let isScrollingDown = scrollDiff > 0 && scrollView.contentOffset.y > absoluteTop + let isScrollingUp = scrollDiff < 0 && scrollView.contentOffset.y < absoluteBottom + + if scrollView.contentOffset.y < absoluteBottom { + var newHeight = creditProfileViewTopConstraint.constant + + if isScrollingDown { + newHeight = max( + minusCreditProfileViewMaxHeight, + creditProfileViewTopConstraint.constant - abs(scrollDiff) + ) + } else if isScrollingUp { + if scrollView.contentOffset.y <= abs(minusCreditProfileViewMaxHeight) { + newHeight = min( + 8, + creditProfileViewTopConstraint.constant + abs(scrollDiff) + ) + } + } + + if newHeight != creditProfileViewTopConstraint.constant { + creditProfileViewTopConstraint.constant = newHeight + + let openAmount = creditProfileViewTopConstraint.constant + abs(minusCreditProfileViewMaxHeight) + let percentage = openAmount / abs(minusCreditProfileViewMaxHeight) + creditProfileView.alpha = percentage + + self.view.layoutIfNeeded() + } + + scrollHistory[scrollView.hash] = scrollView.contentOffset.y + } + } +} diff --git a/Projects/Features/CreditSongListFeature/Sources/CreditSongList/View/CreditProfileView.swift b/Projects/Features/CreditSongListFeature/Sources/CreditSongList/View/CreditProfileView.swift new file mode 100644 index 000000000..b7110981f --- /dev/null +++ b/Projects/Features/CreditSongListFeature/Sources/CreditSongList/View/CreditProfileView.swift @@ -0,0 +1,88 @@ +import CreditDomainInterface +import DesignSystem +import Kingfisher +import Then +import UIKit +import Utility + +protocol CreditProfileViewStateProtocol { + func updateProfile(entity: CreditProfileEntity) +} + +final class CreditProfileView: UIStackView { + private let creditProfileImageViewContainer = UIImageView().then { + $0.backgroundColor = DesignSystemAsset.BlueGrayColor.blueGray200.color + $0.layer.cornerRadius = 8 + $0.clipsToBounds = true + } + + private let creditProfilePlaceholderImageView = UIImageView().then { + $0.image = DesignSystemAsset.Logo.placeHolderLarge.image + $0.contentMode = .scaleAspectFill + } + + private let creditNameContainer = UIView().then { + $0.backgroundColor = DesignSystemAsset.PrimaryColorV2.white.color.withAlphaComponent(0.4) + $0.layer.borderColor = DesignSystemAsset.BlueGrayColor.blueGray25.color.cgColor + $0.layer.borderWidth = 1 + $0.layer.cornerRadius = 8 + } + + private let creditNameLabel = WMLabel( + text: "", + textColor: DesignSystemAsset.BlueGrayColor.blueGray900.color, + font: .t1(weight: .bold) + ).then { + $0.numberOfLines = 0 + } + + override init(frame: CGRect) { + super.init(frame: frame) + self.axis = .horizontal + self.spacing = 8 + addView() + setLayout() + } + + @available(*, unavailable) + required init(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +extension CreditProfileView: CreditProfileViewStateProtocol { + func updateProfile(entity: CreditProfileEntity) { + creditNameLabel.text = entity.name + if let url = entity.imageURL { + creditProfilePlaceholderImageView.isHidden = true + creditProfileImageViewContainer.kf.setImage( + with: URL(string: url) + ) + } + } +} + +private extension CreditProfileView { + func addView() { + self.addArrangedSubviews(creditProfileImageViewContainer, creditNameContainer) + creditProfileImageViewContainer.addSubview(creditProfilePlaceholderImageView) + creditNameContainer.addSubview(creditNameLabel) + } + + func setLayout() { + creditProfileImageViewContainer.snp.makeConstraints { + $0.size.equalTo(140) + } + + creditProfilePlaceholderImageView.snp.makeConstraints { + $0.center.equalToSuperview() + $0.size.equalTo(80) + } + + creditNameLabel.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview().inset(16) + $0.top.equalToSuperview().inset(12) + $0.bottom.lessThanOrEqualToSuperview().inset(12) + } + } +} diff --git a/Projects/Features/CreditSongListFeature/Sources/CreditSongListTab/Component/CreditSongListTabComponent.swift b/Projects/Features/CreditSongListFeature/Sources/CreditSongListTab/Component/CreditSongListTabComponent.swift new file mode 100644 index 000000000..8343d048c --- /dev/null +++ b/Projects/Features/CreditSongListFeature/Sources/CreditSongListTab/Component/CreditSongListTabComponent.swift @@ -0,0 +1,17 @@ +import CreditSongListFeatureInterface +import NeedleFoundation +import UIKit + +public protocol CreditSongListTabDependency: Dependency { + var creditSongListTabItemFactory: any CreditSongListTabItemFactory { get } +} + +public final class CreditSongListTabComponent: Component, CreditSongListTabFactory { + public func makeViewController(workerName: String) -> UIViewController { + let viewController = CreditSongListTabViewController( + workerName: workerName, + creditSongListTabItemFactory: dependency.creditSongListTabItemFactory + ) + return viewController + } +} diff --git a/Projects/Features/CreditSongListFeature/Sources/CreditSongListTab/Component/CreditSongListTabItemComponent.swift b/Projects/Features/CreditSongListFeature/Sources/CreditSongListTab/Component/CreditSongListTabItemComponent.swift new file mode 100644 index 000000000..b619de867 --- /dev/null +++ b/Projects/Features/CreditSongListFeature/Sources/CreditSongListTab/Component/CreditSongListTabItemComponent.swift @@ -0,0 +1,34 @@ +import BaseFeature +import BaseFeatureInterface +import CreditDomainInterface +import CreditSongListFeatureInterface +import NeedleFoundation +import SignInFeatureInterface +import UIKit + +public protocol CreditSongListTabItemDependency: Dependency { + var fetchCreditSongListUseCase: any FetchCreditSongListUseCase { get } + var containSongsFactory: any ContainSongsFactory { get } + var textPopupFactory: any TextPopupFactory { get } + var signInFactory: any SignInFactory { get } + var songDetailPresenter: any SongDetailPresentable { get } +} + +public final class CreditSongListTabItemComponent: Component, + CreditSongListTabItemFactory { + public func makeViewController(workerName: String, sortType: CreditSongSortType) -> UIViewController { + let reactor = CreditSongListTabItemReactor( + workerName: workerName, + creditSortType: sortType, + songDetailPresenter: dependency.songDetailPresenter, + fetchCreditSongListUseCase: dependency.fetchCreditSongListUseCase + ) + let viewController = CreditSongListTabItemViewController( + reactor: reactor, + containSongsFactory: dependency.containSongsFactory, + textPopupFactory: dependency.textPopupFactory, + signInFactory: dependency.signInFactory + ) + return viewController + } +} diff --git a/Projects/Features/CreditSongListFeature/Sources/CreditSongListTab/CreditSongListTabItemReactor.swift b/Projects/Features/CreditSongListFeature/Sources/CreditSongListTab/CreditSongListTabItemReactor.swift new file mode 100644 index 000000000..98a152052 --- /dev/null +++ b/Projects/Features/CreditSongListFeature/Sources/CreditSongListTab/CreditSongListTabItemReactor.swift @@ -0,0 +1,300 @@ +import BaseFeature +import CreditDomainInterface +import CreditSongListFeatureInterface +import Localization +import LogManager +import ReactorKit +import RxSwift +import Utility + +final class CreditSongListTabItemReactor: Reactor { + private enum Metric { + static let pageLimit = 50 + static let availableLimit = 50 + } + + enum Action { + case viewDidLoad + case songDidTap(id: String) + case songThumbnailDidTap(model: CreditSongModel) + case randomPlayButtonDidTap + case allSelectButtonDidTap + case allDeselectButtonDidTap + case addSongButtonDidTap + case addPlaylistButtonDidTap + case playButtonDidTap + case reachedBottom + } + + enum Mutation { + case updateSelectedSongs(Set) + case updateSongs([CreditSongModel]) + case updateNavigateType(NavigateType?) + case updateIsLoading(Bool) + case updateToastMessage(String) + } + + enum NavigateType { + case playYoutube(ids: [String], playPlatform: WakmusicYoutubePlayer.PlayPlatform) + case containSongs(ids: [String]) + case textPopup(text: String, completion: () -> Void) + case signIn + case dismiss(completion: () -> Void) + } + + struct State { + var songs: [CreditSongModel] = [] + var selectedSongs: Set = [] + @Pulse var navigateType: NavigateType? + @Pulse var isLoading = false + @Pulse var toastMessage: String? + } + + private let signInIsRequiredSubject = PublishSubject() + + private var page: Int = 1 + private var isLastPage: Bool = false + let initialState: State + let workerName: String + private let creditSortType: CreditSongSortType + private let songDetailPresenter: any SongDetailPresentable + private let fetchCreditSongListUseCase: any FetchCreditSongListUseCase + + init( + workerName: String, + creditSortType: CreditSongSortType, + songDetailPresenter: any SongDetailPresentable, + fetchCreditSongListUseCase: any FetchCreditSongListUseCase + ) { + self.initialState = .init() + self.workerName = workerName + self.creditSortType = creditSortType + self.songDetailPresenter = songDetailPresenter + self.fetchCreditSongListUseCase = fetchCreditSongListUseCase + } + + func mutate(action: Action) -> Observable { + switch action { + case .viewDidLoad: + return viewDidLoad() + case let .songDidTap(id): + return songDidTap(id: id) + case let .songThumbnailDidTap(model): + PlayState.shared.append(item: .init(id: model.id, title: model.title, artist: model.artist)) + return navigateMutation(navigateType: .dismiss(completion: { [songDetailPresenter] in + let playlistIDs = PlayState.shared.currentPlaylist + .map(\.id) + songDetailPresenter.present(ids: playlistIDs, selectedID: model.id) + })) + case .randomPlayButtonDidTap: + return randomPlayButtonDidTap() + case .allSelectButtonDidTap: + return allSelectButtonDidTap() + case .allDeselectButtonDidTap: + return allDeselectButtonDidTap() + case .addSongButtonDidTap: + return addSongButtonDidTap() + case .addPlaylistButtonDidTap: + return addPlaylistButtonDidTap() + case .playButtonDidTap: + return playButtonDidTap() + case .reachedBottom: + return reachedBottom() + } + } + + func reduce(state: State, mutation: Mutation) -> State { + var newState = state + + switch mutation { + case let .updateSongs(songs): + newState.songs = songs + case let .updateSelectedSongs(selectedSongs): + newState.selectedSongs = selectedSongs + case let .updateNavigateType(navigateType): + newState.navigateType = navigateType + case let .updateIsLoading(isLoading): + newState.isLoading = isLoading + case let .updateToastMessage(toastMessage): + newState.toastMessage = toastMessage + } + + return newState + } + + func transform(mutation: Observable) -> Observable { + let signinIsRequired = signInIsRequiredSubject + .withUnretained(self) + .flatMap { owner, _ in + owner.navigateMutation(navigateType: .signIn) + } + + return Observable.merge(mutation, signinIsRequired) + } +} + +// MARK: - Mutate + +private extension CreditSongListTabItemReactor { + func viewDidLoad() -> Observable { + let initialCreditSongListObservable = fetchPaginatedCreditSongList() + .do(onNext: { [weak self] creditModels in + if creditModels.isEmpty || creditModels.count < Metric.pageLimit { + self?.isLastPage = true + } + }) + .map(Mutation.updateSongs) + return withLoadingMutation(observable: initialCreditSongListObservable) + } + + func songDidTap(id: String) -> Observable { + var currentSelectedSongIDs = currentState.selectedSongs + if currentSelectedSongIDs.contains(id) { + currentSelectedSongIDs.remove(id) + } else { + currentSelectedSongIDs.insert(id) + } + return .just(.updateSelectedSongs(currentSelectedSongIDs)) + } + + func randomPlayButtonDidTap() -> Observable { + let randomSongs = currentState.songs.map(\.id) + .shuffled() + .prefix(50) + let songs = Array(randomSongs) + let playPlatform = if currentState.songs.allSatisfy({ $0.title.isContainShortsTagTitle }) { + WakmusicYoutubePlayer.PlayPlatform.youtube + } else { + WakmusicYoutubePlayer.PlayPlatform.automatic + } + return navigateMutation(navigateType: .playYoutube(ids: songs, playPlatform: playPlatform)) + } + + func allSelectButtonDidTap() -> Observable { + let allSongIDs = Set(currentState.songs.map(\.id)) + return .just(.updateSelectedSongs(allSongIDs)) + } + + func allDeselectButtonDidTap() -> Observable { + return .just(.updateSelectedSongs([])) + } + + func addSongButtonDidTap() -> Observable { + guard PreferenceManager.userInfo != nil else { + return navigateMutation( + navigateType: .textPopup( + text: LocalizationStrings.needLoginWarning, + completion: { [signInIsRequiredSubject] in + let log = CommonAnalyticsLog.clickLoginButton(entry: .addMusics) + LogManager.analytics(log) + + signInIsRequiredSubject.onNext(()) + } + ) + ) + } + + let containingSongIDs = currentState.songs + .filter { currentState.selectedSongs.contains($0.id) } + .map(\.id) + + if containingSongIDs.count > Metric.availableLimit { + return .just(.updateToastMessage( + Localization.LocalizationStrings + .overFlowAddPlaylistWarning(containingSongIDs.count - Metric.availableLimit) + )) + } + + return navigateMutation(navigateType: .containSongs(ids: containingSongIDs)) + } + + func addPlaylistButtonDidTap() -> Observable { + let appendingSongs = currentState.songs + .filter { currentState.selectedSongs.contains($0.id) } + .map { PlaylistItem(id: $0.id, title: $0.title, artist: $0.artist) } + + PlayState.shared.append(contentsOf: appendingSongs) + return .just(.updateToastMessage(Localization.LocalizationStrings.addList)) + } + + func playButtonDidTap() -> Observable { + let containTargetSongIDs = Array(currentState.selectedSongs) + + if containTargetSongIDs.count > Metric.availableLimit { + return .just(.updateToastMessage( + Localization.LocalizationStrings + .overFlowPlayWarning(containTargetSongIDs.count - Metric.availableLimit) + )) + } + + let isOnlyShorts = currentState.songs + .filter { currentState.selectedSongs.contains($0.id) } + .allSatisfy { $0.title.isContainShortsTagTitle } + let playPlatform = if isOnlyShorts { + WakmusicYoutubePlayer.PlayPlatform.youtube + } else { + WakmusicYoutubePlayer.PlayPlatform.automatic + } + + return navigateMutation(navigateType: .playYoutube(ids: containTargetSongIDs, playPlatform: playPlatform)) + } + + func reachedBottom() -> Observable { + guard !isLastPage else { return .empty() } + let initialCreditSongListObservable = fetchPaginatedCreditSongList() + .do(onNext: { [weak self] creditModels in + if creditModels.isEmpty || creditModels.count < Metric.pageLimit { + self?.isLastPage = true + } + }) + .map { [weak self] in return $0 + (self?.currentState.songs ?? []) } + .map(Mutation.updateSongs) + return withLoadingMutation(observable: initialCreditSongListObservable) + } +} + +// MARK: - Private Methods + +private extension CreditSongListTabItemReactor { + func fetchPaginatedCreditSongList() -> Observable<[CreditSongModel]> { + return fetchCreditSongListUseCase.execute( + name: workerName, + order: creditSortType.toDomain(), + page: page, + limit: Metric.pageLimit + ) + .do(onSuccess: { [weak self] _ in + self?.page += 1 + }) + .map { $0.map { CreditSongModel(songEntity: $0) } } + .asObservable() + } + + func withLoadingMutation(observable: Observable) -> Observable { + return .concat( + .just(.updateIsLoading(true)), + observable, + .just(.updateIsLoading(false)) + ) + } + + func navigateMutation(navigateType: NavigateType) -> Observable { + return .concat( + .just(.updateNavigateType(navigateType)), + .just(.updateNavigateType(nil)) + ) + } +} + +private extension CreditSongSortType { + func toDomain() -> CreditSongOrderType { + switch self { + case .latest: + return .latest + case .popular: + return .popular + case .oldest: + return .oldest + } + } +} diff --git a/Projects/Features/CreditSongListFeature/Sources/CreditSongListTab/CreditSongListTabItemViewController.swift b/Projects/Features/CreditSongListFeature/Sources/CreditSongListTab/CreditSongListTabItemViewController.swift new file mode 100644 index 000000000..37acd281f --- /dev/null +++ b/Projects/Features/CreditSongListFeature/Sources/CreditSongListTab/CreditSongListTabItemViewController.swift @@ -0,0 +1,333 @@ +import BaseFeature +import BaseFeatureInterface +import CreditSongListFeatureInterface +import DesignSystem +import LogManager +import RxSwift +import SignInFeatureInterface +import Then +import UIKit +import Utility + +final class CreditSongListTabItemViewController: + BaseReactorViewController, + SongCartViewType { + var songCartView: SongCartView! + var bottomSheetView: BottomSheetView! + + private typealias SectionType = Int + private typealias ItemType = CreditSongModel + + private lazy var dataSource = makeCreditSongListDataSource() + + private lazy var creditSongListCollectionView = UICollectionView( + frame: .zero, + collectionViewLayout: makeCreditSongListCollectionViewLayout() + ).then { + $0.backgroundColor = DesignSystemAsset.BlueGrayColor.blueGray100.color + $0.delegate = self + $0.contentInset = .init(top: 16, left: 0, bottom: .songCartHeight, right: 0) + $0.scrollIndicatorInsets = .init(top: 0, left: 0, bottom: .songCartHeight, right: 0) + } + + private let songCartContainerView = UIView().then { + $0.backgroundColor = .clear + } + + private lazy var creditSongCellRegistration = UICollectionView.CellRegistration< + CreditSongCollectionViewCell, + CreditSongModel + > { [reactor] cell, _, model in + let isSelected = reactor?.currentState.selectedSongs.contains(model.id) ?? false + cell.update(model, isSelected: isSelected) + + cell.setThumbnailTapHandler { [reactor, model] in + reactor?.action.onNext(.songThumbnailDidTap(model: model)) + } + } + + private lazy var creditSongHeaderRegistration = UICollectionView + .SupplementaryRegistration( + elementKind: UICollectionView.elementKindSectionHeader + ) { [reactor] headerView, _, _ in + headerView.setPlayButtonHandler { + let log = CommonAnalyticsLog.clickPlayButton(location: .creditSongList, type: .random) + LogManager.analytics(log) + + reactor?.action.onNext(.randomPlayButtonDidTap) + } + } + + private let containSongsFactory: any ContainSongsFactory + private let textPopupFactory: any TextPopupFactory + private let signInFactory: any SignInFactory + + init( + reactor: Reactor, + containSongsFactory: any ContainSongsFactory, + textPopupFactory: any TextPopupFactory, + signInFactory: any SignInFactory + ) { + self.containSongsFactory = containSongsFactory + self.textPopupFactory = textPopupFactory + self.signInFactory = signInFactory + super.init(reactor: reactor) + } + + override func viewDidLoad() { + super.viewDidLoad() + reactor?.action.onNext(.viewDidLoad) + } + + override func addView() { + view.addSubviews(creditSongListCollectionView, songCartContainerView) + } + + override func setLayout() { + creditSongListCollectionView.snp.makeConstraints { + $0.horizontalEdges.bottom.equalToSuperview() + $0.top.equalToSuperview().offset(CGFloat.offsetForTabbarHeight) + } + + songCartContainerView.snp.makeConstraints { + $0.horizontalEdges.bottom.equalToSuperview() + $0.height.equalTo(CGFloat.songCartHeight + SAFEAREA_BOTTOM_HEIGHT()) + } + } + + override func bindAction(reactor: CreditSongListTabItemReactor) { + creditSongListCollectionView.rx.itemSelected + .compactMap { [reactor] in + reactor.currentState.songs[safe: $0.row] + } + .map { Reactor.Action.songDidTap(id: $0.id) } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + creditSongListCollectionView.rx.prefetchItems + .compactMap(\.last) + .map(\.row) + .filter { lastPrefetchedIndex in + reactor.currentState.songs.count - 1 == lastPrefetchedIndex + } + .filter { _ in reactor.currentState.isLoading == false } + .throttle(.seconds(1), scheduler: MainScheduler.asyncInstance) + .map { _ in Reactor.Action.reachedBottom } + .bind(to: reactor.action) + .disposed(by: disposeBag) + } + + override func bindState(reactor: CreditSongListTabItemReactor) { + let sharedState = reactor.state.share() + + sharedState.map(\.songs) + .distinctUntilChanged() + .bind(with: self) { owner, songs in + var snapshot = NSDiffableDataSourceSnapshot() + snapshot.appendSections([0]) + snapshot.appendItems(songs, toSection: 0) + owner.dataSource.apply(snapshot, animatingDifferences: true) + } + .disposed(by: disposeBag) + + sharedState.map(\.selectedSongs) + .distinctUntilChanged() + .bind(with: self) { owner, selectedSongs in + if selectedSongs.count == .zero { + owner.hideSongCart() + } else { + owner.showSongCart( + in: owner.songCartContainerView, + type: .creditSong, + selectedSongCount: selectedSongs.count, + totalSongCount: owner.reactor?.currentState.songs.count ?? selectedSongs.count, + useBottomSpace: true + ) + owner.songCartView.delegate = owner + } + var snapshot = owner.dataSource.snapshot() + snapshot.reconfigureItems(snapshot.itemIdentifiers) + owner.dataSource.apply(snapshot) + } + .disposed(by: disposeBag) + + reactor.pulse(\.$navigateType) + .compactMap { $0 } + .bind(with: self) { owner, navigate in + switch navigate { + case let .playYoutube(ids, playPlatform): + owner.playYoutube(ids: ids, playPlatform: playPlatform) + case let .containSongs(ids): + owner.presentContainSongs(ids: ids) + case let .textPopup(text, completion): + owner.presentTextPopup(text: text, completion: completion) + case .signIn: + owner.presentSignIn() + case let .dismiss(completion): + owner.dismiss(completion: completion) + } + } + .disposed(by: disposeBag) + + reactor.pulse(\.$isLoading) + .bind(with: self) { owner, isLoading in + if isLoading { + owner.indicator.startAnimating() + } else { + owner.indicator.stopAnimating() + } + } + .disposed(by: disposeBag) + + reactor.pulse(\.$toastMessage) + .compactMap { $0 } + .bind(with: self) { owner, message in + owner.showToast(text: message, options: [.songCart]) + } + .disposed(by: disposeBag) + } +} + +// MARK: - UICollectionViewDelegate + +extension CreditSongListTabItemViewController: UICollectionViewDelegate { + func scrollViewDidScroll(_ scrollView: UIScrollView) { + CreditSongListScopedState.shared.didScroll(scrollView: scrollView) + } +} + +// MARK: - SongCartViewDelegate + +extension CreditSongListTabItemViewController: SongCartViewDelegate { + func buttonTapped(type: SongCartSelectType) { + guard let reactor = reactor else { return } + + let currentState = reactor.currentState + + let songs = currentState.songs + .filter { currentState.selectedSongs.contains($0.id) } + + switch type { + case let .allSelect(isAll): + if isAll { + reactor.action.onNext(.allSelectButtonDidTap) + } else { + reactor.action.onNext(.allDeselectButtonDidTap) + } + case .addSong: + reactor.action.onNext(.addSongButtonDidTap) + + case .addPlayList: + reactor.action.onNext(.addPlaylistButtonDidTap) + + case .play: + reactor.action.onNext(.playButtonDidTap) + + default: + break + } + } +} + +// MARK: - Private Method + +extension CreditSongListTabItemViewController { + private func makeCreditSongListCollectionViewLayout() -> UICollectionViewLayout { + var config = UICollectionLayoutListConfiguration(appearance: .plain) + config.showsSeparators = false + config.headerMode = .supplementary + config.headerTopPadding = 0 + config.backgroundColor = DesignSystemAsset.BlueGrayColor.blueGray100.color + let headerSize = NSCollectionLayoutSize( + widthDimension: .fractionalWidth(1.0), + heightDimension: .absolute(CGFloat.playButtonHeight) + ) + let headerSupplementary = NSCollectionLayoutBoundarySupplementaryItem( + layoutSize: headerSize, + elementKind: UICollectionView.elementKindSectionHeader, + alignment: .top + ) + headerSupplementary.pinToVisibleBounds = true + headerSupplementary.contentInsets = .init( + top: .playButtonTopMargin, + leading: .playButtonHorizontalMargin, + bottom: .playButtonBottomMargin, + trailing: .playButtonHorizontalMargin + ) + + return UICollectionViewCompositionalLayout { _, layoutEnvironment in + let section = NSCollectionLayoutSection.list(using: config, layoutEnvironment: layoutEnvironment) + section.boundarySupplementaryItems = [headerSupplementary] + return section + } + } + + private func makeCreditSongListDataSource() -> UICollectionViewDiffableDataSource { + let dataSource: UICollectionViewDiffableDataSource = UICollectionViewDiffableDataSource< + SectionType, + ItemType + >.init( + collectionView: creditSongListCollectionView + ) { [creditSongCellRegistration] collectionView, indexPath, itemIdentifier in + let cell = collectionView.dequeueConfiguredReusableCell( + using: creditSongCellRegistration, + for: indexPath, + item: itemIdentifier + ) + return cell + } + dataSource.supplementaryViewProvider = { [creditSongHeaderRegistration] collectionView, kind, indexPath in + let headerView = collectionView.dequeueConfiguredReusableSupplementary( + using: creditSongHeaderRegistration, + for: indexPath + ) + return headerView + } + + return dataSource + } + + private func playYoutube(ids: [String], playPlatform: WakmusicYoutubePlayer.PlayPlatform) { + let worker = reactor?.workerName ?? "작업자" + let title = "\(worker)님과 함께하는 랜뮤" + WakmusicYoutubePlayer(ids: ids, title: title, playPlatform: playPlatform).play() + } + + private func presentContainSongs(ids: [String]) { + let viewController = containSongsFactory.makeView(songs: ids) + viewController.modalPresentationStyle = .overFullScreen + UIApplication.topVisibleViewController()?.present(viewController, animated: true) + } + + private func presentTextPopup(text: String, completion: @escaping () -> Void) { + let viewController = textPopupFactory.makeView( + text: text, + cancelButtonIsHidden: false, + confirmButtonText: "확인", + cancelButtonText: "취소", + completion: completion, + cancelCompletion: nil + ) + + self.showBottomSheet(content: viewController) + } + + private func presentSignIn() { + let viewController = signInFactory.makeView() + viewController.modalPresentationStyle = .overFullScreen + UIApplication.topVisibleViewController()?.present(viewController, animated: true) + } + + private func dismiss(completion: @escaping () -> Void) { + UIApplication.keyRootViewController?.dismiss(animated: true, completion: completion) + } +} + +private extension CGFloat { + static let offsetForTabbarHeight: CGFloat = 36 + static let playButtonHeight: CGFloat = 52 + 10 + static let playButtonHorizontalMargin: CGFloat = 20 + static let playButtonTopMargin: CGFloat = 0 + static let playButtonBottomMargin: CGFloat = 10 + static let songCartHeight: CGFloat = 56 +} diff --git a/Projects/Features/CreditSongListFeature/Sources/CreditSongListTab/CreditSongListTabViewController.swift b/Projects/Features/CreditSongListFeature/Sources/CreditSongListTab/CreditSongListTabViewController.swift new file mode 100644 index 000000000..f408b43fa --- /dev/null +++ b/Projects/Features/CreditSongListFeature/Sources/CreditSongListTab/CreditSongListTabViewController.swift @@ -0,0 +1,122 @@ +import CreditSongListFeatureInterface +import DesignSystem +import Pageboy +import SnapKit +import Tabman +import UIKit +import Utility + +final class CreditSongListTabViewController: TabmanViewController { + private let tabContainerView = UIView() + + private let sortTypes = CreditSongSortType.allCases + + private let viewControllers: [UIViewController] + + private var tabUnderlineLayer: CALayer? + + init( + workerName: String, + creditSongListTabItemFactory: any CreditSongListTabItemFactory + ) { + self.viewControllers = CreditSongSortType.allCases.map { + creditSongListTabItemFactory.makeViewController(workerName: workerName, sortType: $0) + } + super.init(nibName: nil, bundle: nil) + } + + @available(*, unavailable) + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func viewDidLoad() { + super.viewDidLoad() + self.dataSource = self + addView() + setLayout() + configureUI() + } + + override func viewDidLayoutSubviews() { + super.viewDidLayoutSubviews() + if tabUnderlineLayer == nil { + let underlineLayer = CALayer() + underlineLayer.backgroundColor = DesignSystemAsset.BlueGrayColor.blueGray200.color.cgColor + underlineLayer.frame = CGRect( + x: 0, + y: tabContainerView.frame.size.height - 1, + width: tabContainerView.frame.size.width, + height: 1 + ) + tabContainerView.layer.addSublayer(underlineLayer) + } + } +} + +private extension CreditSongListTabViewController { + func addView() { + view.addSubviews(tabContainerView) + } + + func setLayout() { + tabContainerView.snp.makeConstraints { + $0.top.horizontalEdges.equalToSuperview() + $0.height.equalTo(CGFloat.tabbarHeight) + } + } + + func configureUI() { + let bar = TMBar.ButtonBar() + + bar.backgroundView.style = .clear + + bar.layout.contentInset = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20) + bar.layout.contentMode = .fit + bar.layout.transitionStyle = .progressive + bar.layout.interButtonSpacing = 0 + + bar.buttons.customize { button in + button.tintColor = DesignSystemAsset.BlueGrayColor.blueGray400.color + button.selectedTintColor = DesignSystemAsset.BlueGrayColor.blueGray900.color + button.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) + button.selectedFont = DesignSystemFontFamily.Pretendard.bold.font(size: 16) + } + + bar.indicator.weight = .custom(value: 2) + bar.indicator.tintColor = DesignSystemAsset.PrimaryColorV2.point.color + bar.indicator.overscrollBehavior = .compress + + addBar(bar, dataSource: self, at: .custom(view: tabContainerView, layout: nil)) + bar.layer.zPosition = 1 + } +} + +extension CreditSongListTabViewController: PageboyViewControllerDataSource { + func numberOfViewControllers(in pageboyViewController: PageboyViewController) -> Int { + sortTypes.count + } + + func viewController( + for pageboyViewController: PageboyViewController, + at index: PageboyViewController.PageIndex + ) -> UIViewController? { + viewControllers[safe: index] + } + + func defaultPage(for pageboyViewController: PageboyViewController) -> PageboyViewController.Page? { + .first + } +} + +extension CreditSongListTabViewController: TMBarDataSource { + func barItem(for bar: any TMBar, at index: Int) -> any TMBarItemable { + guard let sortItem = sortTypes[safe: index] else { return TMBarItem(title: "") } + + return TMBarItem(title: sortItem.display) + } +} + +private extension CGFloat { + static let tabbarHeight: CGFloat = 36 +} diff --git a/Projects/Features/CreditSongListFeature/Sources/CreditSongListTab/Model/CreditSongModel.swift b/Projects/Features/CreditSongListFeature/Sources/CreditSongListTab/Model/CreditSongModel.swift new file mode 100644 index 000000000..284108a21 --- /dev/null +++ b/Projects/Features/CreditSongListFeature/Sources/CreditSongListTab/Model/CreditSongModel.swift @@ -0,0 +1,16 @@ +import Foundation +import SongsDomainInterface + +struct CreditSongModel: Equatable, Hashable { + let id: String + let title: String + let artist: String + let date: String + + init(songEntity: SongEntity) { + self.id = songEntity.id + self.title = songEntity.title + self.artist = songEntity.artist + self.date = songEntity.date + } +} diff --git a/Projects/Features/CreditSongListFeature/Sources/CreditSongListTab/View/CreditSongCollectionHeaderView.swift b/Projects/Features/CreditSongListFeature/Sources/CreditSongListTab/View/CreditSongCollectionHeaderView.swift new file mode 100644 index 000000000..307cfcf1f --- /dev/null +++ b/Projects/Features/CreditSongListFeature/Sources/CreditSongListTab/View/CreditSongCollectionHeaderView.swift @@ -0,0 +1,51 @@ +import SnapKit +import Then +import UIKit +import Utility + +final class CreditSongCollectionHeaderView: UICollectionReusableView { + private let randomPlayButton = RandomPlayButton() + private let blurEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .regular)).then { + $0.layer.cornerRadius = 8 + $0.clipsToBounds = true + } + + private var playButtonHandler: (() -> Void)? + + override init(frame: CGRect) { + super.init(frame: frame) + setupViews() + bind() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func apply(_ layoutAttributes: UICollectionViewLayoutAttributes) { + super.apply(layoutAttributes) + layer.zPosition = 1 + } + + func setPlayButtonHandler(handler: @escaping () -> Void) { + self.playButtonHandler = handler + } + + private func setupViews() { + addSubviews(blurEffectView, randomPlayButton) + blurEffectView.snp.makeConstraints { + $0.edges.equalToSuperview() + } + + randomPlayButton.snp.makeConstraints { + $0.edges.equalToSuperview() + } + } + + private func bind() { + randomPlayButton.addAction { [weak self] in + self?.playButtonHandler?() + } + } +} diff --git a/Projects/Features/CreditSongListFeature/Sources/CreditSongListTab/View/CreditSongCollectionViewCell.swift b/Projects/Features/CreditSongListFeature/Sources/CreditSongListTab/View/CreditSongCollectionViewCell.swift new file mode 100644 index 000000000..d3f08f864 --- /dev/null +++ b/Projects/Features/CreditSongListFeature/Sources/CreditSongListTab/View/CreditSongCollectionViewCell.swift @@ -0,0 +1,121 @@ +import DesignSystem +import Kingfisher +import Lottie +import RxGesture +import RxSwift +import SnapKit +import SongsDomainInterface +import Then +import UIKit +import Utility + +final class CreditSongCollectionViewCell: UICollectionViewCell { + private let thumbnailImageView = UIImageView().then { + $0.image = DesignSystemAsset.Player.dummyThumbnailSmall.image + $0.contentMode = .scaleAspectFill + $0.layer.cornerRadius = 4 + $0.clipsToBounds = true + } + + private lazy var songInfoStackView = UIStackView(arrangedSubviews: [titleLabel, artistLabel]).then { + $0.axis = .vertical + $0.distribution = .fill + } + + private let titleLabel = WMLabel( + text: "", + textColor: DesignSystemAsset.BlueGrayColor.gray900.color, + font: .t6(weight: .medium) + ).then { + $0.lineBreakMode = .byTruncatingTail + } + + private let artistLabel = WMLabel( + text: "", + textColor: DesignSystemAsset.BlueGrayColor.gray900.color, + font: .t7(weight: .light) + ).then { + $0.lineBreakMode = .byTruncatingTail + } + + private let dateLabel = WMLabel( + text: "", + textColor: DesignSystemAsset.BlueGrayColor.gray900.color, + font: .t7(weight: .score3Light), + alignment: .right + ).then { + $0.lineBreakMode = .byTruncatingTail + } + + private let disposeBag = DisposeBag() + private var handler: (() -> Void)? + + override init(frame: CGRect) { + super.init(frame: frame) + addViews() + setLayout() + bind() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func setThumbnailTapHandler(_ handler: @escaping () -> Void) { + self.handler = handler + } + + func update(_ model: CreditSongModel, isSelected: Bool) { + self.thumbnailImageView.kf.setImage( + with: URL(string: WMImageAPI.fetchYoutubeThumbnail(id: model.id).toString), + placeholder: DesignSystemAsset.Logo.placeHolderSmall.image, + options: [.transition(.fade(0.2))] + ) + + self.titleLabel.text = model.title + self.artistLabel.text = model.artist + self.dateLabel.text = model.date + self.backgroundColor = isSelected ? DesignSystemAsset.BlueGrayColor.gray200.color : UIColor.clear + } +} + +private extension CreditSongCollectionViewCell { + func addViews() { + contentView.addSubviews(thumbnailImageView, songInfoStackView, dateLabel) + } + + func setLayout() { + contentView.snp.makeConstraints { + $0.height.equalTo(60) + $0.edges.equalToSuperview() + } + + thumbnailImageView.snp.makeConstraints { + $0.centerY.equalToSuperview() + $0.leading.equalToSuperview().offset(20) + $0.verticalEdges.equalToSuperview().inset(10) + $0.width.equalTo(thumbnailImageView.snp.height).multipliedBy(16.0 / 9.0) + } + + songInfoStackView.snp.makeConstraints { + $0.centerY.equalToSuperview() + $0.leading.equalTo(thumbnailImageView.snp.trailing).offset(8) + $0.trailing.equalTo(dateLabel.snp.leading).offset(-16) + } + + dateLabel.snp.makeConstraints { + $0.centerY.equalToSuperview() + $0.trailing.equalToSuperview().inset(20) + } + } + + func bind() { + thumbnailImageView.rx.tapGesture() + .when(.recognized) + .bind { [weak self] _ in + self?.handler?() + } + .disposed(by: disposeBag) + } +} diff --git a/Projects/Features/CreditSongListFeature/Sources/CreditSongListTab/View/RandomPlayButton.swift b/Projects/Features/CreditSongListFeature/Sources/CreditSongListTab/View/RandomPlayButton.swift new file mode 100644 index 000000000..8fe971979 --- /dev/null +++ b/Projects/Features/CreditSongListFeature/Sources/CreditSongListTab/View/RandomPlayButton.swift @@ -0,0 +1,58 @@ +import DesignSystem +import Localization +import SnapKit +import Then +import UIKit +import Utility + +final class RandomPlayButton: UIButton { + private let randomImageView = UIImageView().then { + $0.image = DesignSystemAsset.Chart.shufflePlay.image + $0.tintColor = DesignSystemAsset.BlueGrayColor.blueGray900.color + $0.contentMode = .scaleAspectFit + } + + private let playLabel = UILabel().then { + $0.text = LocalizationStrings.titleRandomPlay + $0.textColor = DesignSystemAsset.BlueGrayColor.blueGray900.color + $0.font = .setFont(.t6(weight: .medium)) + } + + override init(frame: CGRect) { + super.init(frame: frame) + setupView() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func updateTitle(isOverMaximumNumber: Bool) { + playLabel.text = if isOverMaximumNumber { + LocalizationStrings.title50RandomPlay + } else { + LocalizationStrings.titleRandomPlay + } + } + + private func setupView() { + addSubviews(randomImageView, playLabel) + + randomImageView.snp.makeConstraints { + $0.centerY.equalToSuperview() + $0.leading.equalToSuperview().inset(32) + $0.size.equalTo(32) + } + + playLabel.snp.makeConstraints { + $0.center.equalToSuperview() + } + + layer.borderWidth = 1 + layer.borderColor = DesignSystemAsset.BlueGrayColor.blueGray200.color + .withAlphaComponent(0.4).cgColor + layer.cornerRadius = 8 + backgroundColor = DesignSystemAsset.PrimaryColorV2.white.color.withAlphaComponent(0.4) + } +} diff --git a/Projects/Features/CreditSongListFeature/Sources/ScopedState/CreditSongListScopedState.swift b/Projects/Features/CreditSongListFeature/Sources/ScopedState/CreditSongListScopedState.swift new file mode 100644 index 000000000..746bebc9c --- /dev/null +++ b/Projects/Features/CreditSongListFeature/Sources/ScopedState/CreditSongListScopedState.swift @@ -0,0 +1,19 @@ +import Foundation +import RxCocoa +import RxSwift +import UIKit + +final class CreditSongListScopedState { + static let shared = CreditSongListScopedState() + + private init() {} + + private let creditSongTabItemScrolledSubject = PublishSubject() + var creditSongTabItemScrolledObservable: Observable { + creditSongTabItemScrolledSubject + } + + func didScroll(scrollView: UIScrollView) { + creditSongTabItemScrolledSubject.onNext(scrollView) + } +} diff --git a/Projects/Features/CreditSongListFeature/Testing/Testing.swift b/Projects/Features/CreditSongListFeature/Testing/Testing.swift new file mode 100644 index 000000000..b1853ce60 --- /dev/null +++ b/Projects/Features/CreditSongListFeature/Testing/Testing.swift @@ -0,0 +1 @@ +// This is for Tuist diff --git a/Projects/Features/CreditSongListFeature/Tests/CreditSongListFeatureTest.swift b/Projects/Features/CreditSongListFeature/Tests/CreditSongListFeatureTest.swift new file mode 100644 index 000000000..50478b0a7 --- /dev/null +++ b/Projects/Features/CreditSongListFeature/Tests/CreditSongListFeatureTest.swift @@ -0,0 +1,11 @@ +import XCTest + +final class CreditSongListFeatureTests: XCTestCase { + override func setUpWithError() throws {} + + override func tearDownWithError() throws {} + + func testExample() { + XCTAssertEqual(1, 1) + } +} diff --git a/Projects/Features/FruitDrawFeature/Demo/Resources/LaunchScreen.storyboard b/Projects/Features/FruitDrawFeature/Demo/Resources/LaunchScreen.storyboard new file mode 100644 index 000000000..865e9329f --- /dev/null +++ b/Projects/Features/FruitDrawFeature/Demo/Resources/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Projects/Features/FruitDrawFeature/Demo/Sources/AppDelegate.swift b/Projects/Features/FruitDrawFeature/Demo/Sources/AppDelegate.swift new file mode 100644 index 000000000..b2da37561 --- /dev/null +++ b/Projects/Features/FruitDrawFeature/Demo/Sources/AppDelegate.swift @@ -0,0 +1,18 @@ +@testable import FruitDrawFeature +import UIKit + +@main +final class AppDelegate: UIResponder, UIApplicationDelegate { + var window: UIWindow? + + func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil + ) -> Bool { + window = UIWindow(frame: UIScreen.main.bounds) + window?.rootViewController = UIViewController() + window?.makeKeyAndVisible() + + return true + } +} diff --git a/Projects/Features/FruitDrawFeature/Interface/FruitDrawFactory.swift b/Projects/Features/FruitDrawFeature/Interface/FruitDrawFactory.swift new file mode 100644 index 000000000..48d843dce --- /dev/null +++ b/Projects/Features/FruitDrawFeature/Interface/FruitDrawFactory.swift @@ -0,0 +1,9 @@ +import UIKit + +public protocol FruitDrawViewControllerDelegate: AnyObject { + func completedFruitDraw(itemCount: Int) +} + +public protocol FruitDrawFactory { + func makeView(delegate: FruitDrawViewControllerDelegate) -> UIViewController +} diff --git a/Projects/Features/FruitDrawFeature/Interface/FruitStorageFactory.swift b/Projects/Features/FruitDrawFeature/Interface/FruitStorageFactory.swift new file mode 100644 index 000000000..4079e460b --- /dev/null +++ b/Projects/Features/FruitDrawFeature/Interface/FruitStorageFactory.swift @@ -0,0 +1,5 @@ +import UIKit + +public protocol FruitStorageFactory { + func makeView() -> UIViewController +} diff --git a/Projects/Features/FruitDrawFeature/Project.swift b/Projects/Features/FruitDrawFeature/Project.swift new file mode 100644 index 000000000..e9dbde64b --- /dev/null +++ b/Projects/Features/FruitDrawFeature/Project.swift @@ -0,0 +1,25 @@ +import DependencyPlugin +import ProjectDescription +import ProjectDescriptionHelpers + +let project = Project.module( + name: ModulePaths.Feature.FruitDrawFeature.rawValue, + targets: [ + .interface(module: .feature(.FruitDrawFeature)), + .implements( + module: .feature(.FruitDrawFeature), + dependencies: [ + .feature(target: .FruitDrawFeature, type: .interface), + .feature(target: .BaseFeature), + .domain(target: .UserDomain, type: .interface), + .domain(target: .AuthDomain, type: .interface) + ] + ), + .demo( + module: .feature(.FruitDrawFeature), + dependencies: [ + .feature(target: .FruitDrawFeature) + ] + ) + ] +) diff --git a/Projects/Features/FruitDrawFeature/Sources/Analytics/FruitDrawAnalyticsLog.swift b/Projects/Features/FruitDrawFeature/Sources/Analytics/FruitDrawAnalyticsLog.swift new file mode 100644 index 000000000..5ddab140b --- /dev/null +++ b/Projects/Features/FruitDrawFeature/Sources/Analytics/FruitDrawAnalyticsLog.swift @@ -0,0 +1,7 @@ +import LogManager + +enum FruitDrawAnalyticsLog: AnalyticsLogType { + case viewPage(pageName: String) + case clickFruitDrawButton + case clickFruitItem(id: String) +} diff --git a/Projects/Features/FruitDrawFeature/Sources/Components/FruitDrawComponent.swift b/Projects/Features/FruitDrawFeature/Sources/Components/FruitDrawComponent.swift new file mode 100644 index 000000000..46fc83afc --- /dev/null +++ b/Projects/Features/FruitDrawFeature/Sources/Components/FruitDrawComponent.swift @@ -0,0 +1,26 @@ +import AuthDomainInterface +import BaseFeatureInterface +import Foundation +import FruitDrawFeatureInterface +import NeedleFoundation +import UIKit +import UserDomainInterface + +public protocol FruitDrawDependency: Dependency { + var fetchFruitDrawStatusUseCase: any FetchFruitDrawStatusUseCase { get } + var drawFruitUseCase: any DrawFruitUseCase { get } + var textPopupFactory: any TextPopupFactory { get } +} + +public final class FruitDrawComponent: Component, FruitDrawFactory { + public func makeView(delegate: any FruitDrawViewControllerDelegate) -> UIViewController { + return FruitDrawViewController( + viewModel: .init( + fetchFruitDrawStatusUseCase: dependency.fetchFruitDrawStatusUseCase, + drawFruitUseCase: dependency.drawFruitUseCase + ), + textPopupFactory: dependency.textPopupFactory, + delegate: delegate + ) + } +} diff --git a/Projects/Features/FruitDrawFeature/Sources/Components/FruitStorageComponent.swift b/Projects/Features/FruitDrawFeature/Sources/Components/FruitStorageComponent.swift new file mode 100644 index 000000000..48233b20f --- /dev/null +++ b/Projects/Features/FruitDrawFeature/Sources/Components/FruitStorageComponent.swift @@ -0,0 +1,22 @@ +import BaseFeatureInterface +import Foundation +import FruitDrawFeatureInterface +import NeedleFoundation +import UIKit +import UserDomainInterface + +public protocol FruitStorageDependency: Dependency { + var fetchFruitListUseCase: any FetchFruitListUseCase { get } + var textPopupFactory: any TextPopupFactory { get } +} + +public final class FruitStorageComponent: Component, FruitStorageFactory { + public func makeView() -> UIViewController { + return FruitStorageViewController( + viewModel: .init( + fetchFruitListUseCase: dependency.fetchFruitListUseCase + ), + textPopupFactory: dependency.textPopupFactory + ) + } +} diff --git a/Projects/Features/FruitDrawFeature/Sources/ViewControllers/FruitDrawViewController.swift b/Projects/Features/FruitDrawFeature/Sources/ViewControllers/FruitDrawViewController.swift new file mode 100644 index 000000000..4f305f53f --- /dev/null +++ b/Projects/Features/FruitDrawFeature/Sources/ViewControllers/FruitDrawViewController.swift @@ -0,0 +1,545 @@ +import BaseFeatureInterface +import DesignSystem +import FruitDrawFeatureInterface +import LogManager +import Lottie +import NVActivityIndicatorView +import RxCocoa +import RxSwift +import SnapKit +import Then +import UIKit +import Utility + +public final class FruitDrawViewController: UIViewController { + private let backgroundImageView = UIImageView().then { + $0.contentMode = .scaleAspectFill + $0.image = DesignSystemAsset.FruitDraw.fruitDrawBg.image + } + + private let navigationBarView = WMNavigationBarView() + + private let dismissButton = UIButton().then { + let dismissImage = DesignSystemAsset.MusicDetail.dismiss.image + .withTintColor(DesignSystemAsset.PrimaryColorV2.white.color, renderingMode: .alwaysOriginal) + $0.setImage(dismissImage, for: .normal) + } + + private let componentContentView = UIView() + + private let descriptioniLabel = WMLabel( + text: "두근.. 두근...\n열매를 뽑아주세요!", + textColor: .white, + font: .t4(weight: .medium), + alignment: .center, + lineHeight: 28 + ).then { + $0.numberOfLines = 0 + } + + private let drawMachineImageView = UIImageView().then { + $0.contentMode = .scaleAspectFill + $0.image = DesignSystemAsset.FruitDraw.fruitDrawMachine.image + } + + private let drawOrConfirmButton = UIButton(type: .system).then { + $0.setTitleColor(DesignSystemAsset.BlueGrayColor.blueGray25.color, for: .normal) + $0.titleLabel?.font = DesignSystemFontFamily.Pretendard.medium.font(size: 18) + $0.titleLabel?.setTextWithAttributes(alignment: .center) + $0.backgroundColor = DesignSystemAsset.BlueGrayColor.gray300.color + $0.layer.cornerRadius = 12 + $0.clipsToBounds = true + $0.isEnabled = false + } + + private lazy var activityIndicator = NVActivityIndicatorView(frame: .zero).then { + $0.color = .white + $0.type = .circleStrokeSpin + } + + private lazy var lottieAnimationView = + LottieAnimationView( + name: "Fruit_Draw", + bundle: DesignSystemResources.bundle + ).then { + $0.loopMode = .playOnce + $0.contentMode = .scaleAspectFit + } + + private let rewardDescriptioniLabel = WMLabel( + text: "", + textColor: .white, + font: .t2(weight: .bold), + alignment: .center + ).then { + $0.numberOfLines = 0 + $0.alpha = 0 + } + + private let rewardFruitImageView = UIImageView().then { + $0.contentMode = .scaleAspectFit + $0.alpha = 0 + } + + /// Left Component + private let purpleHeartImageView = UIImageView().then { + $0.contentMode = .scaleAspectFill + $0.image = DesignSystemAsset.FruitDraw.fruitDrawPurpleHeart.image + } + + private let leftNoteImageView = UIImageView().then { + $0.contentMode = .scaleAspectFill + $0.image = DesignSystemAsset.FruitDraw.fruitDrawLeftNote.image + } + + private let greenHeartImageView = UIImageView().then { + $0.contentMode = .scaleAspectFill + $0.image = DesignSystemAsset.FruitDraw.fruitDrawGreenHeart.image + } + + private let cloudImageView = UIImageView().then { + $0.contentMode = .scaleAspectFill + $0.image = DesignSystemAsset.FruitDraw.fruitDrawCloud.image + } + + private let pickBallImageView = UIImageView().then { + $0.contentMode = .scaleAspectFill + $0.image = DesignSystemAsset.FruitDraw.fruitDrawPinkBall.image + } + + /// Right Component + private let yellowHeartImageView = UIImageView().then { + $0.contentMode = .scaleAspectFill + $0.image = DesignSystemAsset.FruitDraw.fruitDrawYellowHeart.image + } + + private let rightTopNoteImageView = UIImageView().then { + $0.contentMode = .scaleAspectFill + $0.image = DesignSystemAsset.FruitDraw.fruitDrawRightTopNote.image + } + + private let purpleBallImageView = UIImageView().then { + $0.contentMode = .scaleAspectFill + $0.image = DesignSystemAsset.FruitDraw.fruitDrawPurpleBall.image + } + + private let magentaBallImageView = UIImageView().then { + $0.contentMode = .scaleAspectFill + $0.image = DesignSystemAsset.FruitDraw.fruitDrawMagentaBall.image + } + + private let orangeBallImageView = UIImageView().then { + $0.contentMode = .scaleAspectFill + $0.image = DesignSystemAsset.FruitDraw.fruitDrawOrangeBall.image + } + + private let redHeartImageView = UIImageView().then { + $0.contentMode = .scaleAspectFill + $0.image = DesignSystemAsset.FruitDraw.fruitDrawRedHeart.image + } + + private let rightBottomNoteImageView = UIImageView().then { + $0.contentMode = .scaleAspectFill + $0.image = DesignSystemAsset.FruitDraw.fruitDrawRightBottomNote.image + } + + private let deepGreenHeartImageView = UIImageView().then { + $0.contentMode = .scaleAspectFill + $0.image = DesignSystemAsset.FruitDraw.fruitDrawDeepGreenHeart.image + } + + private let viewModel: FruitDrawViewModel + private let textPopupFactory: TextPopupFactory + private weak var delegate: FruitDrawViewControllerDelegate? + + lazy var input = FruitDrawViewModel.Input() + lazy var output = viewModel.transform(from: input) + private let disposeBag = DisposeBag() + + deinit { + LogManager.printDebug("❌:: \(Self.self) deinit") + } + + public init( + viewModel: FruitDrawViewModel, + textPopupFactory: TextPopupFactory, + delegate: FruitDrawViewControllerDelegate + ) { + self.viewModel = viewModel + self.textPopupFactory = textPopupFactory + self.delegate = delegate + super.init(nibName: nil, bundle: nil) + } + + @available(*, unavailable) + public required init?(coder: NSCoder) { + fatalError("\(Self.self) has not been implemented") + } + + override public func viewDidLoad() { + super.viewDidLoad() + addSubViews() + setLayout() + configureUI() + outputBind() + inputBind() + } + + override public func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + LogManager.analytics(FruitDrawAnalyticsLog.viewPage(pageName: "fruit_draw")) + } + + override public var preferredStatusBarStyle: UIStatusBarStyle { + return .lightContent + } +} + +private extension FruitDrawViewController { + func outputBind() { + output.canDraw + .skip(1) + .bind(with: self) { owner, canDraw in + owner.drawOrConfirmButton.isEnabled = true + owner.drawOrConfirmButton.setTitle(canDraw ? "음표 열매 뽑기" : "오늘 뽑기 완료", for: .normal) + owner.drawOrConfirmButton.backgroundColor = canDraw ? + DesignSystemAsset.PrimaryColorV2.point.color : + DesignSystemAsset.BlueGrayColor.gray300.color + owner.activityIndicator.stopAnimating() + } + .disposed(by: disposeBag) + + output.showRewardNote + .bind(with: self) { owner, entity in + owner.drawOrConfirmButton.setTitle("확인", for: .normal) + owner.drawOrConfirmButton.backgroundColor = DesignSystemAsset.PrimaryColorV2.point.color + owner.rewardDescriptioniLabel.text = "\(entity.name)를 획득했어요!" + + if let data = entity.imageData { + owner.rewardFruitImageView.image = UIImage(data: data) + } + + UIView.animate(withDuration: 0.3) { + owner.lottieAnimationView.alpha = 0 + owner.drawOrConfirmButton.alpha = 1 + owner.rewardDescriptioniLabel.alpha = 1 + owner.rewardFruitImageView.alpha = 1 + } + } + .disposed(by: disposeBag) + + output.showToast + .bind(with: self) { owner, message in + owner.showToast(text: message, options: [.tabBar]) + } + .disposed(by: disposeBag) + + output.occurredError + .bind(with: self) { owner, message in + owner.showBottomSheet( + content: owner.textPopupFactory.makeView( + text: message, + cancelButtonIsHidden: true, + confirmButtonText: "확인", + cancelButtonText: nil, + completion: { + owner.dismiss(animated: true) + }, + cancelCompletion: nil + ), + dismissOnOverlayTapAndPull: false + ) + } + .disposed(by: disposeBag) + } + + func inputBind() { + input.fetchFruitDrawStatus.onNext(()) + + dismissButton.rx.tap + .withLatestFrom(output.fruitSource) + .bind(with: self) { owner, fruit in + let drawCompleted: Bool = fruit.quantity > 0 + if drawCompleted { + owner.delegate?.completedFruitDraw(itemCount: fruit.quantity) + owner.dismiss(animated: true) + } else { + owner.dismiss(animated: true) + } + } + .disposed(by: disposeBag) + + drawOrConfirmButton.rx.tap + .withLatestFrom(output.canDraw) + .filter { [output] canDraw in + guard canDraw else { + output.showToast.onNext("오늘은 더 이상 뽑을 수 없어요.") + return false + } + return true + } + .throttle(.seconds(2), latest: false, scheduler: MainScheduler.instance) + .withLatestFrom(output.fruitSource) + .bind(with: self) { owner, fruit in + let drawCompleted: Bool = fruit.quantity > 0 + + if drawCompleted { + owner.delegate?.completedFruitDraw(itemCount: fruit.quantity) + owner.dismiss(animated: true) + } else { + LogManager.analytics(FruitDrawAnalyticsLog.clickFruitDrawButton) + owner.input.didTapFruitDraw.onNext(()) + owner.startLottieAnimation() + UIView.animate( + withDuration: 0.3, + delay: 0.5 + ) { + owner.showHideComponent(isHide: true) + } + } + } + .disposed(by: disposeBag) + + Observable.merge( + NotificationCenter.default.rx.notification(UIApplication.didEnterBackgroundNotification) + .map { _ in UIApplication.didEnterBackgroundNotification }, + NotificationCenter.default.rx.notification(UIApplication.willEnterForegroundNotification) + .map { _ in UIApplication.willEnterForegroundNotification } + ) + .bind(with: self, onNext: { owner, notification in + if notification == UIApplication.didEnterBackgroundNotification { + owner.removeComponentAnimation() + } else { + owner.startComponentAnimation() + } + }) + .disposed(by: disposeBag) + } +} + +private extension FruitDrawViewController { + func addSubViews() { + view.addSubviews( + backgroundImageView, + drawMachineImageView, + componentContentView + ) + + // Left Component + componentContentView.addSubviews( + purpleHeartImageView, + leftNoteImageView, + greenHeartImageView, + pickBallImageView, + cloudImageView + ) + + // Right Component + componentContentView.addSubviews( + yellowHeartImageView, + purpleBallImageView, + rightTopNoteImageView, + magentaBallImageView, + orangeBallImageView, + redHeartImageView, + deepGreenHeartImageView, + rightBottomNoteImageView + ) + + view.addSubviews( + navigationBarView, + descriptioniLabel, + rewardFruitImageView, + rewardDescriptioniLabel, + drawOrConfirmButton, + activityIndicator + ) + navigationBarView.setLeftViews([dismissButton]) + } + + func setLayout() { + backgroundImageView.snp.makeConstraints { + $0.edges.equalToSuperview() + } + + componentContentView.snp.makeConstraints { + $0.edges.equalToSuperview() + } + + navigationBarView.snp.makeConstraints { + $0.top.equalTo(view.safeAreaLayoutGuide) + $0.horizontalEdges.equalToSuperview() + $0.height.equalTo(48) + } + + drawMachineImageView.snp.makeConstraints { + $0.top.equalTo(218.0.correctTop) + $0.centerX.equalToSuperview() + $0.width.equalTo(180 * APP_WIDTH() / 375) + $0.height.equalTo(300 * APP_HEIGHT() / 812) + } + + descriptioniLabel.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview().inset(20) + $0.bottom.equalTo(drawMachineImageView.snp.top).offset(-14) + $0.height.equalTo(56) + } + + drawOrConfirmButton.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview().inset(20) + $0.bottom.equalTo(view.safeAreaLayoutGuide).offset(-20) + $0.height.equalTo(56) + } + + activityIndicator.snp.makeConstraints { + $0.center.equalTo(drawOrConfirmButton.snp.center) + $0.size.equalTo(20) + } + + rewardFruitImageView.snp.makeConstraints { + $0.top.equalTo(276.0.correctTop) + $0.centerX.equalToSuperview() + $0.width.equalTo(275) + $0.height.equalTo(200) + } + + rewardDescriptioniLabel.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview().inset(20) + $0.centerX.equalToSuperview() + $0.height.equalTo(32) + $0.bottom.equalTo(rewardFruitImageView.snp.top).offset(60.0.correctBottom) + } + + // Left Component + purpleHeartImageView.snp.makeConstraints { + $0.leading.equalToSuperview().offset(40.0.correctLeading) + $0.top.equalToSuperview().offset(140.0.correctTop) + } + + leftNoteImageView.snp.makeConstraints { + $0.leading.equalToSuperview().offset(29.0.correctLeading) + $0.top.equalToSuperview().offset(234.0.correctTop) + } + + greenHeartImageView.snp.makeConstraints { + $0.leading.equalToSuperview().offset(25.0.correctLeading) + $0.top.equalToSuperview().offset(362.0.correctTop) + } + + cloudImageView.snp.makeConstraints { + $0.leading.equalToSuperview().offset(-31) + $0.bottom.equalToSuperview().offset(153.56.correctBottom) + } + + pickBallImageView.snp.makeConstraints { + $0.leading.equalToSuperview().offset(6) + $0.bottom.equalTo(cloudImageView.snp.bottom).offset(-80.44) + } + + // Right Component + yellowHeartImageView.snp.makeConstraints { + $0.top.equalToSuperview().offset(104.0.correctTop) + $0.trailing.equalToSuperview().offset(108.0.correctTrailing) + } + + rightTopNoteImageView.snp.makeConstraints { + $0.top.equalToSuperview().offset(132.0.correctTop) + $0.trailing.equalToSuperview().offset(38.61.correctTrailing) + } + + purpleBallImageView.snp.makeConstraints { + $0.top.equalToSuperview().offset(159.0.correctTop) + $0.trailing.equalToSuperview().offset(26.47.correctTrailing) + } + + magentaBallImageView.snp.makeConstraints { + $0.top.equalToSuperview().offset(259.0.correctTop) + $0.trailing.equalToSuperview().offset(-5.94) + } + + orangeBallImageView.snp.makeConstraints { + $0.top.equalToSuperview().offset(342.0.correctTop) + $0.trailing.equalToSuperview().offset(48.61.correctTrailing) + } + + redHeartImageView.snp.makeConstraints { + $0.trailing.equalToSuperview().offset(34.52.correctTrailing) + $0.bottom.equalToSuperview().offset(326.38.correctBottom) + } + + rightBottomNoteImageView.snp.makeConstraints { + $0.trailing.equalToSuperview().offset(82.24.correctTrailing) + $0.bottom.equalToSuperview().offset(160.66.correctBottom) + } + + deepGreenHeartImageView.snp.makeConstraints { + $0.trailing.equalToSuperview().offset(84.67.correctTrailing) + $0.bottom.equalToSuperview().offset(158.22.correctBottom) + } + } + + func configureUI() { + navigationController?.setNavigationBarHidden(true, animated: false) + perform(#selector(startComponentAnimation), with: nil, afterDelay: 0.3) + rewardFruitImageView.addShadow( + offset: CGSize(width: 0, height: 2.5), + color: UIColor.black, + opacity: 0.1, + radius: 50 + ) + activityIndicator.startAnimating() + } +} + +private extension FruitDrawViewController { + func startLottieAnimation() { + view.addSubview(lottieAnimationView) + lottieAnimationView.snp.makeConstraints { + $0.width.equalTo(APP_WIDTH()) + $0.height.equalTo(200 * APP_WIDTH() / 275) + $0.center.equalToSuperview() + } + lottieAnimationView.play { _ in + self.input.endedLottieAnimation.onNext(()) + } + } + + @objc func startComponentAnimation() { + // Left Component + purpleHeartImageView.moveAnimate(duration: 5.0, amount: 30, direction: .up) + leftNoteImageView.moveAnimate(duration: 3.0, amount: 30, direction: .up) + greenHeartImageView.moveAnimate(duration: 4.0, amount: 20, direction: .down) + [cloudImageView, pickBallImageView].forEach { + $0.moveAnimate(duration: 3.0, amount: 30, direction: .down) + } + + // Right Component + yellowHeartImageView.moveAnimate(duration: 3.0, amount: 20, direction: .down) + [rightTopNoteImageView, purpleBallImageView].forEach { + $0.moveAnimate(duration: 5.0, amount: 30, direction: .up) + } + magentaBallImageView.moveAnimate(duration: 5.0, amount: 20, direction: .down) + orangeBallImageView.moveAnimate(duration: 3.0, amount: 30, direction: .up) + redHeartImageView.moveAnimate(duration: 4.0, amount: 15, direction: .up) + [rightBottomNoteImageView, deepGreenHeartImageView].forEach { + $0.moveAnimate(duration: 5.0, amount: 20, direction: .up) + } + } + + func removeComponentAnimation() { + componentContentView.subviews.forEach { + $0.transform = .identity + $0.layer.removeAllAnimations() + } + } + + func showHideComponent(isHide: Bool) { + componentContentView.subviews.forEach { + $0.alpha = isHide ? 0 : 1 + } + descriptioniLabel.alpha = isHide ? 0 : 1 + drawMachineImageView.alpha = descriptioniLabel.alpha + drawOrConfirmButton.alpha = descriptioniLabel.alpha + navigationBarView.alpha = descriptioniLabel.alpha + } +} diff --git a/Projects/Features/FruitDrawFeature/Sources/ViewControllers/FruitInfoPopupViewController.swift b/Projects/Features/FruitDrawFeature/Sources/ViewControllers/FruitInfoPopupViewController.swift new file mode 100644 index 000000000..77aa05bcf --- /dev/null +++ b/Projects/Features/FruitDrawFeature/Sources/ViewControllers/FruitInfoPopupViewController.swift @@ -0,0 +1,153 @@ +import DesignSystem +import SnapKit +import Then +import UIKit +import UserDomainInterface +import Utility + +public final class FruitInfoPopupViewController: UIViewController { + private let aroundView = UIView() + private let popupContentView = UIView() + + private let backgroundImageView = UIImageView().then { + $0.image = DesignSystemAsset.FruitDraw.noteInfoPopupBg.image + $0.contentMode = .scaleAspectFill + } + + private let descriptionLabel = WMLabel( + text: "", + textColor: DesignSystemAsset.BlueGrayColor.blueGray900.color, + font: .t2(weight: .bold), + alignment: .center + ).then { + $0.numberOfLines = 0 + } + + private let noteImageView = UIImageView().then { + $0.contentMode = .scaleAspectFit + $0.clipsToBounds = true + } + + private let confirmButton = UIButton(type: .system).then { + $0.backgroundColor = DesignSystemAsset.PrimaryColorV2.point.color + $0.setTitle("확인", for: .normal) + $0.setTitleColor(DesignSystemAsset.BlueGrayColor.blueGray25.color, for: .normal) + $0.titleLabel?.font = .setFont(.t4(weight: .medium)) + $0.titleLabel?.setTextWithAttributes(alignment: .center) + } + + private let item: FruitEntity + + public init( + item: FruitEntity + ) { + self.item = item + super.init(nibName: nil, bundle: nil) + } + + @available(*, unavailable) + public required init?(coder: NSCoder) { + fatalError("\(Self.self) has not been implemented") + } + + override public func viewDidLoad() { + super.viewDidLoad() + addSubViews() + setLayout() + configureUI() + addAction() + } +} + +private extension FruitInfoPopupViewController { + func addSubViews() { + view.addSubviews(aroundView, popupContentView) + popupContentView.addSubviews( + backgroundImageView, + descriptionLabel, + noteImageView, + confirmButton + ) + } + + func setLayout() { + let is320 = APP_WIDTH() < 375 + + aroundView.snp.makeConstraints { + $0.edges.equalToSuperview() + } + + popupContentView.snp.makeConstraints { + $0.width.equalTo(is320 ? APP_WIDTH() - 40 : 335) + $0.center.equalToSuperview() + } + + backgroundImageView.snp.makeConstraints { + $0.edges.equalToSuperview() + } + + confirmButton.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview() + $0.bottom.equalToSuperview() + $0.height.equalTo(56) + } + + descriptionLabel.snp.makeConstraints { + $0.top.equalToSuperview().offset(30) + $0.horizontalEdges.equalToSuperview().inset(20) + $0.height.equalTo(32) + } + + let is320Width: CGFloat = (275 * APP_WIDTH()) / 375 + let is320Height: CGFloat = (is320Width * 200) / 275 + + noteImageView.snp.makeConstraints { + $0.top.equalTo(descriptionLabel.snp.bottom).offset(60) + $0.centerX.equalToSuperview() + $0.bottom.equalTo(confirmButton.snp.top).offset(-80) + $0.width.equalTo(is320 ? is320Width : 275) + $0.height.equalTo(is320 ? is320Height : 200) + } + } + + func configureUI() { + view.backgroundColor = .clear + popupContentView.layer.cornerRadius = 24 + popupContentView.clipsToBounds = true + + if item.quantity == -1 { + descriptionLabel.text = "? 음표" + noteImageView.image = DesignSystemAsset.FruitDraw.unidentifiedNoteBig.image + + } else { + descriptionLabel.text = item.name + noteImageView.kf.setImage( + with: URL(string: item.imageURL), + placeholder: nil, + options: [.transition(.fade(0.2))] + ) + } + + noteImageView.addShadow( + offset: CGSize(width: 0, height: 2.5), + color: UIColor.black, + opacity: 0.1, + radius: 50 + ) + + let gesture = UITapGestureRecognizer(target: self, action: #selector(tappedAround(_:))) + aroundView.addGestureRecognizer(gesture) + aroundView.isUserInteractionEnabled = true + } + + @objc func tappedAround(_ sender: UITapGestureRecognizer) { + dismiss(animated: true) + } + + func addAction() { + confirmButton.addAction { [weak self] in + guard let self else { return } + self.dismiss(animated: true) + } + } +} diff --git a/Projects/Features/FruitDrawFeature/Sources/ViewControllers/FruitStorageViewController.swift b/Projects/Features/FruitDrawFeature/Sources/ViewControllers/FruitStorageViewController.swift new file mode 100644 index 000000000..8507faabe --- /dev/null +++ b/Projects/Features/FruitDrawFeature/Sources/ViewControllers/FruitStorageViewController.swift @@ -0,0 +1,230 @@ +import BaseFeatureInterface +import DesignSystem +import FruitDrawFeatureInterface +import LogManager +import NVActivityIndicatorView +import RxCocoa +import RxSwift +import SnapKit +import Then +import UIKit +import UserDomainInterface +import Utility + +public final class FruitStorageViewController: UIViewController { + private let gradientLayer = CAGradientLayer() + + private let navigationBarView = WMNavigationBarView() + + private let visualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .regular)) + + private let backButton = UIButton(type: .system).then { + let dismissImage = DesignSystemAsset.Navigation.back.image + .withTintColor(DesignSystemAsset.PrimaryColorV2.white.color, renderingMode: .alwaysOriginal) + $0.setImage(dismissImage, for: .normal) + $0.tintColor = .white + } + + private let collectionViewFlowLayout = UICollectionViewFlowLayout().then { + $0.scrollDirection = .vertical + $0.minimumLineSpacing = 32.0.correctTop + $0.minimumInteritemSpacing = 0 + $0.sectionInset = .init(top: 24, left: 0, bottom: 40, right: 0) + } + + lazy var collectionView = UICollectionView( + frame: .zero, + collectionViewLayout: collectionViewFlowLayout + ).then { + $0.backgroundColor = .clear + } + + private lazy var activityIndicator = NVActivityIndicatorView(frame: .zero).then { + $0.color = .white + $0.type = .circleStrokeSpin + } + + private let viewModel: FruitStorageViewModel + private let textPopupFactory: TextPopupFactory + + lazy var input = FruitStorageViewModel.Input() + lazy var output = viewModel.transform(from: input) + private let disposeBag = DisposeBag() + + deinit { + LogManager.printDebug("❌:: \(Self.self) deinit") + } + + public init( + viewModel: FruitStorageViewModel, + textPopupFactory: TextPopupFactory + ) { + self.viewModel = viewModel + self.textPopupFactory = textPopupFactory + super.init(nibName: nil, bundle: nil) + } + + @available(*, unavailable) + public required init?(coder: NSCoder) { + fatalError("\(Self.self) has not been implemented") + } + + override public func viewDidLoad() { + super.viewDidLoad() + configureGradientLayer() + addSubViews() + setLayout() + configureUI() + outputBind() + inputBind() + } + + override public func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + LogManager.analytics(FruitDrawAnalyticsLog.viewPage(pageName: "fruit_storage")) + NotificationCenter.default.post(name: .willStatusBarEnterDarkBackground, object: nil) + } + + override public func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + NotificationCenter.default.post(name: .willStatusBarEnterLightBackground, object: nil) + } + + override public func viewDidLayoutSubviews() { + super.viewDidLayoutSubviews() + self.gradientLayer.frame = CGRect( + x: view.bounds.origin.x, + y: view.bounds.origin.y, + width: view.bounds.width, + height: view.bounds.height + PLAYER_HEIGHT() + SAFEAREA_BOTTOM_HEIGHT() + ) + } +} + +private extension FruitStorageViewController { + func outputBind() { + collectionView.rx + .setDelegate(self) + .disposed(by: disposeBag) + + output.fruitSource + .skip(1) + .do(onNext: { [activityIndicator] _ in + activityIndicator.stopAnimating() + }) + .bind(to: collectionView.rx.items) { [weak self] collectionView, index, model in + guard let self = self else { return UICollectionViewCell() } + guard let cell = collectionView.dequeueReusableCell( + withReuseIdentifier: "\(FruitListCell.self)", + for: IndexPath(item: index, section: 0) + ) as? FruitListCell else { + return UICollectionViewCell() + } + cell.update( + model: model, + floor: index, + totalCount: self.output.fruitTotalCount.value + ) + cell.delegate = self + return cell + } + .disposed(by: disposeBag) + } + + func inputBind() { + input.fetchFruitList.onNext(()) + + backButton.rx.tap + .bind(with: self) { owner, _ in + owner.navigationController?.popViewController(animated: true) + } + .disposed(by: disposeBag) + } +} + +private extension FruitStorageViewController { + func addSubViews() { + view.addSubviews( + collectionView, + visualEffectView, + navigationBarView, + activityIndicator + ) + navigationBarView.setLeftViews([backButton]) + navigationBarView.setTitle("열매함", textColor: .white) + } + + func setLayout() { + navigationBarView.snp.makeConstraints { + $0.top.equalTo(view.safeAreaLayoutGuide) + $0.horizontalEdges.equalToSuperview() + $0.height.equalTo(48) + } + + visualEffectView.snp.makeConstraints { + $0.top.equalToSuperview() + $0.horizontalEdges.equalToSuperview() + $0.bottom.equalTo(navigationBarView.snp.bottom) + } + + collectionView.snp.makeConstraints { + $0.edges.equalToSuperview() + } + + activityIndicator.snp.makeConstraints { + $0.center.equalToSuperview() + $0.size.equalTo(30) + } + } + + func configureGradientLayer() { + gradientLayer.colors = [ + colorFromRGB(0x009DE6).cgColor, + colorFromRGB(0xC585FF).cgColor, + colorFromRGB(0xFBC6F5).cgColor, + colorFromRGB(0xFFFFFF).cgColor + ] + view.layer.addSublayer(gradientLayer) + } + + func configureUI() { + view.backgroundColor = .white + collectionView.register(FruitListCell.self, forCellWithReuseIdentifier: "\(FruitListCell.self)") + collectionView.contentInset = .init(top: 48, left: 0, bottom: 0, right: 0) + collectionView.showsVerticalScrollIndicator = false + activityIndicator.startAnimating() + } +} + +extension FruitStorageViewController: UICollectionViewDelegateFlowLayout { + public func collectionView( + _ collectionView: UICollectionView, + layout collectionViewLayout: UICollectionViewLayout, + sizeForItemAt indexPath: IndexPath + ) -> CGSize { + let width: CGFloat = APP_WIDTH() + let height: CGFloat = ( + collectionView.frame.height + - 24 - 40 - STATUS_BAR_HEGHIT() - 48 - (32.0.correctTop * 4) + ) / 5 + return .init(width: width, height: height) + } +} + +extension FruitStorageViewController: FruitListCellDelegate { + public func itemSelected(item: FruitEntity) { + LogManager.analytics(FruitDrawAnalyticsLog.clickFruitItem(id: item.fruitID)) + let viewController = FruitInfoPopupViewController(item: item) + viewController.modalPresentationStyle = .overFullScreen + viewController.modalTransitionStyle = .crossDissolve + present(viewController, animated: true) + } +} + +extension FruitStorageViewController: UIScrollViewDelegate { + public func scrollViewDidScroll(_ scrollView: UIScrollView) { + UIView.animate(withDuration: 0.1) { + self.visualEffectView.alpha = scrollView.contentOffset.y > -(STATUS_BAR_HEGHIT() + 48) ? 1 : 0 + } + } +} diff --git a/Projects/Features/FruitDrawFeature/Sources/ViewModels/FruitDrawViewModel.swift b/Projects/Features/FruitDrawFeature/Sources/ViewModels/FruitDrawViewModel.swift new file mode 100644 index 000000000..4ad4da602 --- /dev/null +++ b/Projects/Features/FruitDrawFeature/Sources/ViewModels/FruitDrawViewModel.swift @@ -0,0 +1,127 @@ +import AuthDomainInterface +import BaseFeature +import Foundation +import Kingfisher +import LogManager +import RxRelay +import RxSwift +import UserDomainInterface +import Utility + +public final class FruitDrawViewModel: ViewModelType { + private let fetchFruitDrawStatusUseCase: FetchFruitDrawStatusUseCase + private let drawFruitUseCase: DrawFruitUseCase + private let disposeBag = DisposeBag() + + deinit { + LogManager.printDebug("❌:: \(Self.self) deinit") + } + + public init( + fetchFruitDrawStatusUseCase: any FetchFruitDrawStatusUseCase, + drawFruitUseCase: any DrawFruitUseCase + ) { + self.fetchFruitDrawStatusUseCase = fetchFruitDrawStatusUseCase + self.drawFruitUseCase = drawFruitUseCase + } + + public struct Input { + let fetchFruitDrawStatus: PublishSubject = PublishSubject() + let didTapFruitDraw: PublishSubject = PublishSubject() + let endedLottieAnimation: PublishSubject = PublishSubject() + } + + public struct Output { + let canDraw: BehaviorRelay = BehaviorRelay(value: false) + let fruitSource: BehaviorRelay = BehaviorRelay(value: .init( + quantity: 0, + fruitID: "", + name: "", + imageURL: "" + )) + let showRewardNote: PublishSubject = PublishSubject() + let showToast: PublishSubject = PublishSubject() + let occurredError: PublishSubject = PublishSubject() + } + + public func transform(from input: Input) -> Output { + let output = Output() + + input.fetchFruitDrawStatus + .flatMap { [fetchFruitDrawStatusUseCase] _ in + return fetchFruitDrawStatusUseCase.execute() + .asObservable() + .catch { error in + let message = error.asWMError.errorDescription ?? error.localizedDescription + output.occurredError.onNext(message) + return .empty() + } + } + .do(onNext: { entity in + let lastAt = (entity.lastDraw.drawAt / 1000.0) + .unixTimeToDate + .dateToString(format: "yyyy.MM.dd HH:mm:ss") + LogManager.printDebug("Draw lastAt: \(lastAt)") + }) + .map { $0.canDraw } + .bind(to: output.canDraw) + .disposed(by: disposeBag) + + input.didTapFruitDraw + .flatMap { [drawFruitUseCase] _ in + return drawFruitUseCase.execute() + .asObservable() + .catch { error in + let message = error.asWMError.errorDescription ?? error.localizedDescription + output.occurredError.onNext(message) + return .empty() + } + } + .flatMap { [weak self] entity -> Observable<(FruitEntity, Data?)> in + guard let self = self else { return .never() } + return self.downloadNoteImage(entity: entity) + } + .map { entity, data -> FruitEntity in + var newEntity = entity + newEntity.imageData = data + return newEntity + } + .bind(to: output.fruitSource) + .disposed(by: disposeBag) + + Observable.zip( + input.endedLottieAnimation, + output.fruitSource.skip(1) + ) { _, entity -> FruitEntity in + return entity + } + .debug("FruitDrawZip") + .bind(to: output.showRewardNote) + .disposed(by: disposeBag) + + return output + } +} + +private extension FruitDrawViewModel { + func downloadNoteImage(entity: FruitEntity) -> Observable<(FruitEntity, Data?)> { + guard let URL = URL(string: entity.imageURL) else { return .never() } + return Observable.create { observer in + KingfisherManager.shared.retrieveImage( + with: URL + ) { result in + switch result { + case let .success(value): + observer.onNext((entity, value.data())) + observer.onCompleted() + + case let .failure(error): + LogManager.printDebug(error.localizedDescription) + observer.onNext((entity, Data())) + observer.onCompleted() + } + } + return Disposables.create() + } + } +} diff --git a/Projects/Features/FruitDrawFeature/Sources/ViewModels/FruitStorageViewModel.swift b/Projects/Features/FruitDrawFeature/Sources/ViewModels/FruitStorageViewModel.swift new file mode 100644 index 000000000..822f03943 --- /dev/null +++ b/Projects/Features/FruitDrawFeature/Sources/ViewModels/FruitStorageViewModel.swift @@ -0,0 +1,76 @@ +import AuthDomainInterface +import BaseFeature +import Foundation +import LogManager +import RxRelay +import RxSwift +import UserDomainInterface +import Utility + +public final class FruitStorageViewModel: ViewModelType { + private let fetchFruitListUseCase: FetchFruitListUseCase + private let disposeBag = DisposeBag() + + deinit { + LogManager.printDebug("❌:: \(Self.self) deinit") + } + + public init( + fetchFruitListUseCase: any FetchFruitListUseCase + ) { + self.fetchFruitListUseCase = fetchFruitListUseCase + } + + public struct Input { + let fetchFruitList: PublishSubject = PublishSubject() + } + + public struct Output { + let fruitSource: BehaviorRelay<[[FruitEntity]]> = BehaviorRelay(value: []) + let fruitTotalCount: BehaviorRelay = BehaviorRelay(value: 0) + } + + public func transform(from input: Input) -> Output { + let output = Output() + + input.fetchFruitList + .flatMap { [fetchFruitListUseCase] _ in + return fetchFruitListUseCase.execute() + .asObservable() + .catchAndReturn([]) + } + .do(onNext: { entities in + output.fruitTotalCount.accept(entities.count) + }) + .map { [weak self] source in + guard let self = self else { return [] } + return self.chunkArray(source: source, chunkSize: 3) + } + .bind(to: output.fruitSource) + .disposed(by: disposeBag) + + return output + } +} + +private extension FruitStorageViewModel { + func chunkArray(source: [FruitEntity], chunkSize: Int) -> [[FruitEntity]] { + guard chunkSize > 0 else { return [] } + + var result: [[FruitEntity]] = [] + var chunk: [FruitEntity] = [] + + for element in source { + chunk.append(element) + if chunk.count == chunkSize { + result.append(chunk) + chunk = [] + } + } + + if !chunk.isEmpty { + result.append(chunk) + } + return result + } +} diff --git a/Projects/Features/FruitDrawFeature/Sources/Views/FruitListCell.swift b/Projects/Features/FruitDrawFeature/Sources/Views/FruitListCell.swift new file mode 100644 index 000000000..15bb5cbbb --- /dev/null +++ b/Projects/Features/FruitDrawFeature/Sources/Views/FruitListCell.swift @@ -0,0 +1,178 @@ +import DesignSystem +import UIKit +import UserDomainInterface +import Utility + +public protocol FruitListCellDelegate: AnyObject { + func itemSelected(item: FruitEntity) +} + +public final class FruitListCell: UICollectionViewCell { + private let supportImageView = UIImageView().then { + $0.contentMode = .scaleAspectFill + $0.image = DesignSystemAsset.FruitDraw.noteSupport.image + } + + private let noteStackView: UIStackView = UIStackView().then { + $0.axis = .horizontal + $0.distribution = .fillEqually + } + + private let firstNoteContentView = UIView() + private let secondNoteContentView = UIView() + private let thirdNoteContentView = UIView() + + private let firstNoteImageView = UIImageView().then { + $0.contentMode = .scaleAspectFit + } + + private let firstNoteShadowImageView = UIImageView().then { + $0.contentMode = .scaleAspectFit + $0.image = DesignSystemAsset.FruitDraw.noteShadow.image + } + + private let secondNoteImageView = UIImageView().then { + $0.contentMode = .scaleAspectFit + } + + private let secondNoteShadowImageView = UIImageView().then { + $0.contentMode = .scaleAspectFit + $0.image = DesignSystemAsset.FruitDraw.noteShadow.image + } + + private let thirdNoteImageView = UIImageView().then { + $0.contentMode = .scaleAspectFit + } + + private let thirdNoteShadowImageView = UIImageView().then { + $0.contentMode = .scaleAspectFit + $0.image = DesignSystemAsset.FruitDraw.noteShadow.image + } + + private var items: [FruitEntity] = [] + weak var delegate: FruitListCellDelegate? + + override init(frame: CGRect) { + super.init(frame: frame) + addSubViews() + setLayout() + addTapGestureRecognizers() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +extension FruitListCell { + func update( + model: [FruitEntity], + floor: Int, + totalCount: Int + ) { + self.items = model + let notes = [firstNoteImageView, secondNoteImageView, thirdNoteImageView] + let shadows = [firstNoteShadowImageView, secondNoteShadowImageView, thirdNoteShadowImageView] + notes.forEach { $0.alpha = 0 } + shadows.forEach { $0.alpha = 0 } + + for i in 0 ..< model.count { + notes[i].alpha = 1 + shadows[i].alpha = 1 + + if model[i].quantity == -1 { + notes[i].image = totalCount > 15 ? + DesignSystemAsset.FruitDraw.unidentifiedNote.image : + floorToImage(with: floor) + } else { + notes[i].kf.setImage( + with: URL(string: model[i].imageURL), + placeholder: nil, + options: [.transition(.fade(0.2))] + ) + } + } + } +} + +private extension FruitListCell { + func addTapGestureRecognizers() { + [firstNoteImageView, secondNoteImageView, thirdNoteImageView].forEach { + let gesture = UITapGestureRecognizer(target: self, action: #selector(tappedNoteImageView(_:))) + $0.addGestureRecognizer(gesture) + $0.isUserInteractionEnabled = true + } + } + + @objc private func tappedNoteImageView(_ sender: UITapGestureRecognizer) { + if let imageView = sender.view { + if imageView == firstNoteImageView { + delegate?.itemSelected(item: items[0]) + } else if imageView == secondNoteImageView { + delegate?.itemSelected(item: items[1]) + } else if imageView == thirdNoteImageView { + delegate?.itemSelected(item: items[2]) + } + } + } + + func floorToImage(with floor: Int) -> UIImage { + switch floor { + case 0: + return DesignSystemAsset.FruitDraw.unidentifiedNote1st.image + case 1: + return DesignSystemAsset.FruitDraw.unidentifiedNote2nd.image + case 2: + return DesignSystemAsset.FruitDraw.unidentifiedNote3rd.image + case 3: + return DesignSystemAsset.FruitDraw.unidentifiedNote4th.image + case 4: + return DesignSystemAsset.FruitDraw.unidentifiedNote5th.image + default: + return DesignSystemAsset.FruitDraw.unidentifiedNote.image + } + } +} + +private extension FruitListCell { + func addSubViews() { + contentView.addSubviews(supportImageView, noteStackView) + + firstNoteContentView.addSubviews(firstNoteShadowImageView, firstNoteImageView) + secondNoteContentView.addSubviews(secondNoteShadowImageView, secondNoteImageView) + thirdNoteContentView.addSubviews(thirdNoteShadowImageView, thirdNoteImageView) + + noteStackView.addArrangedSubview(firstNoteContentView) + noteStackView.addArrangedSubview(secondNoteContentView) + noteStackView.addArrangedSubview(thirdNoteContentView) + } + + func setLayout() { + supportImageView.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview().inset(20) + $0.bottom.equalToSuperview() + $0.width.equalTo(APP_WIDTH() - 40) + $0.height.equalTo(26) + } + + [firstNoteShadowImageView, secondNoteShadowImageView, thirdNoteShadowImageView].forEach { + $0.snp.makeConstraints { + $0.centerX.equalToSuperview() + $0.bottom.equalTo(supportImageView.snp.bottom).offset(-11) + } + } + + [firstNoteImageView, secondNoteImageView, thirdNoteImageView].forEach { + $0.snp.makeConstraints { + $0.edges.equalToSuperview() + } + } + + noteStackView.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview().inset(20) + $0.top.equalToSuperview() + $0.bottom.equalToSuperview().offset(-15) + } + } +} diff --git a/Projects/Features/HomeFeature/.swiftlint.yml b/Projects/Features/HomeFeature/.swiftlint.yml deleted file mode 100644 index a3af04f42..000000000 --- a/Projects/Features/HomeFeature/.swiftlint.yml +++ /dev/null @@ -1,20 +0,0 @@ -excluded: - - "**/*/NeedleGenerated.swift" - - "Tuist" - - -force_cast: # From https://realm.github.io/SwiftLint/force_cast.html - warning # 강제 캐스팅은 error에서 warning으로 변경 - -disabled_rules: - - trailing_whitespace - - vertical_whitespace - - colon - - comma - - comment_spacing # 주석 여백 - - mark # //MARK 관련 warning - - opening_brace # 괄호 열 때 줄바꿈을 했는지 안했는지, (안했으면 warning) - - line_length # 한줄에 글자 수 제한 , warning: 120, error: 200 (default) - - statement_position # if는 반드시 else로 끝나야한다. - - identifier_name #변수명 글자 수 제한 - - function_body_length #함수 바디 라인 제한 diff --git a/Projects/Features/HomeFeature/Interface/HomeFactory.swift b/Projects/Features/HomeFeature/Interface/HomeFactory.swift new file mode 100644 index 000000000..4150d1f89 --- /dev/null +++ b/Projects/Features/HomeFeature/Interface/HomeFactory.swift @@ -0,0 +1,6 @@ +import Foundation +import UIKit + +public protocol HomeFactory { + func makeView() -> UIViewController +} diff --git a/Projects/Features/HomeFeature/Project.swift b/Projects/Features/HomeFeature/Project.swift index 32f3cef17..3f2d23f35 100644 --- a/Projects/Features/HomeFeature/Project.swift +++ b/Projects/Features/HomeFeature/Project.swift @@ -1,11 +1,29 @@ +import DependencyPlugin import ProjectDescription import ProjectDescriptionHelpers -let project = Project.makeModule( - name: "HomeFeature", - product: .staticFramework, - dependencies: [ - .Project.Features.PlayerFeature +let project = Project.module( + name: ModulePaths.Feature.HomeFeature.rawValue, + targets: [ + .interface( + module: .feature(.HomeFeature), + dependencies: [] + ), + .implements( + module: .feature(.HomeFeature), + product: .staticFramework, + spec: .init( + resources: ["Resources/**"], + dependencies: [ + .feature(target: .BaseFeature), + .feature(target: .HomeFeature, type: .interface), + .feature(target: .ChartFeature, type: .interface), + .feature(target: .PlaylistFeature, type: .interface), + .feature(target: .SignInFeature, type: .interface), + .domain(target: .ChartDomain, type: .interface), + .domain(target: .SongsDomain, type: .interface), + ] + ) + ) ] - , resources: ["Resources/**"] ) diff --git a/Projects/Features/HomeFeature/Resources/Home.storyboard b/Projects/Features/HomeFeature/Resources/Home.storyboard index 1ee588045..2fd2bc211 100644 --- a/Projects/Features/HomeFeature/Resources/Home.storyboard +++ b/Projects/Features/HomeFeature/Resources/Home.storyboard @@ -1,9 +1,9 @@ - + - + @@ -48,7 +48,7 @@ - + @@ -272,7 +272,7 @@ - + @@ -445,10 +445,209 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Projects/Features/HomeFeature/Sources/Analytics/HomeAnalyticsLog.swift b/Projects/Features/HomeFeature/Sources/Analytics/HomeAnalyticsLog.swift new file mode 100644 index 000000000..7a84115d9 --- /dev/null +++ b/Projects/Features/HomeFeature/Sources/Analytics/HomeAnalyticsLog.swift @@ -0,0 +1,18 @@ +import LogManager + +enum HomeAnalyticsLog: AnalyticsLogType { + case clickChartTop100MusicsTitleButton + case clickAllChartTop100MusicsButton + case clickRecentMusicsTitleButton + case clickAllRecentMusicsButton + case clickMusicItem(location: MusicItemLocation, id: String) +} + +enum MusicItemLocation: String, AnalyticsLogEnumParametable { + case homeTop100 = "home_top100" + case homeRecent = "home_recent" + + var description: String { + self.rawValue + } +} diff --git a/Projects/Features/HomeFeature/Sources/Analytics/NewSongsAnalyticsLog.swift b/Projects/Features/HomeFeature/Sources/Analytics/NewSongsAnalyticsLog.swift new file mode 100644 index 000000000..fd2737028 --- /dev/null +++ b/Projects/Features/HomeFeature/Sources/Analytics/NewSongsAnalyticsLog.swift @@ -0,0 +1,13 @@ +import LogManager + +enum NewSongsAnalyticsLog: AnalyticsLogType { + enum RecentMusicType: String, CaseIterable, AnalyticsLogEnumParametable { + case all + case woowakgood + case isegyeIdol = "isegye_idol" + case gomem + case academy + } + + case selectRecentMusicType(type: RecentMusicType) +} diff --git a/Projects/Features/HomeFeature/Sources/Components/HomeComponent.swift b/Projects/Features/HomeFeature/Sources/Components/HomeComponent.swift index ef61395cd..a2f85e1ca 100644 --- a/Projects/Features/HomeFeature/Sources/Components/HomeComponent.swift +++ b/Projects/Features/HomeFeature/Sources/Components/HomeComponent.swift @@ -1,35 +1,36 @@ -// -// HomeComponent.swift -// HomeFeatureTests -// -// Created by KTH on 2023/02/20. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - +import BaseFeature +import ChartDomainInterface +import ChartFeatureInterface import Foundation -import UIKit +import HomeFeatureInterface import NeedleFoundation -import DomainModule -import CommonFeature +import PlaylistDomainInterface +import PlaylistFeatureInterface +import SongsDomainInterface +import UIKit public protocol HomeDependency: Dependency { var fetchChartRankingUseCase: any FetchChartRankingUseCase { get } var fetchNewSongsUseCase: any FetchNewSongsUseCase { get } - var fetchRecommendPlayListUseCase: any FetchRecommendPlayListUseCase { get } - var playListDetailComponent : PlayListDetailComponent { get } + var fetchRecommendPlaylistUseCase: any FetchRecommendPlaylistUseCase { get } + var playlistDetailFactory: any PlaylistDetailFactory { get } + var chartFactory: any ChartFactory { get } var newSongsComponent: NewSongsComponent { get } + var songDetailPresenter: any SongDetailPresentable { get } } -public final class HomeComponent: Component { - public func makeView() -> HomeViewController { +public final class HomeComponent: Component, HomeFactory { + public func makeView() -> UIViewController { return HomeViewController.viewController( viewModel: .init( fetchChartRankingUseCase: dependency.fetchChartRankingUseCase, fetchNewSongsUseCase: dependency.fetchNewSongsUseCase, - fetchRecommendPlayListUseCase: dependency.fetchRecommendPlayListUseCase + fetchRecommendPlaylistUseCase: dependency.fetchRecommendPlaylistUseCase ), - playListDetailComponent: dependency.playListDetailComponent, - newSongsComponent: dependency.newSongsComponent + playlistDetailFactory: dependency.playlistDetailFactory, + newSongsComponent: dependency.newSongsComponent, + chartFactory: dependency.chartFactory, + songDetailPresenter: dependency.songDetailPresenter ) } } diff --git a/Projects/Features/CommonFeature/Sources/Components/NewSongsComponent.swift b/Projects/Features/HomeFeature/Sources/Components/NewSongsComponent.swift similarity index 95% rename from Projects/Features/CommonFeature/Sources/Components/NewSongsComponent.swift rename to Projects/Features/HomeFeature/Sources/Components/NewSongsComponent.swift index 36ba48c32..0d29afde5 100644 --- a/Projects/Features/CommonFeature/Sources/Components/NewSongsComponent.swift +++ b/Projects/Features/HomeFeature/Sources/Components/NewSongsComponent.swift @@ -1,6 +1,5 @@ import Foundation import NeedleFoundation -import DomainModule public protocol NewSongsDependency: Dependency { var newSongsContentComponent: NewSongsContentComponent { get } diff --git a/Projects/Features/HomeFeature/Sources/Components/NewSongsContentComponent.swift b/Projects/Features/HomeFeature/Sources/Components/NewSongsContentComponent.swift new file mode 100644 index 000000000..530926b4c --- /dev/null +++ b/Projects/Features/HomeFeature/Sources/Components/NewSongsContentComponent.swift @@ -0,0 +1,32 @@ +import BaseFeature +import BaseFeatureInterface +import ChartDomainInterface +import Foundation +import NeedleFoundation +import SignInFeatureInterface +import SongsDomainInterface + +public protocol NewSongsContentDependency: Dependency { + var fetchNewSongsUseCase: any FetchNewSongsUseCase { get } + var fetchNewSongsPlaylistUseCase: any FetchNewSongsPlaylistUseCase { get } + var containSongsFactory: any ContainSongsFactory { get } + var signInFactory: any SignInFactory { get } + var textPopupFactory: any TextPopupFactory { get } + var songDetailPresenter: any SongDetailPresentable { get } +} + +public final class NewSongsContentComponent: Component { + public func makeView(type: NewSongGroupType) -> NewSongsContentViewController { + return NewSongsContentViewController.viewController( + viewModel: .init( + type: type, + fetchNewSongsUseCase: dependency.fetchNewSongsUseCase, + fetchNewSongsPlaylistUseCase: dependency.fetchNewSongsPlaylistUseCase + ), + containSongsFactory: dependency.containSongsFactory, + textPopupFactory: dependency.textPopupFactory, + signInFactory: dependency.signInFactory, + songDetailPresenter: dependency.songDetailPresenter + ) + } +} diff --git a/Projects/Features/HomeFeature/Sources/ViewControllers/HomeViewController.swift b/Projects/Features/HomeFeature/Sources/ViewControllers/HomeViewController.swift index 79269a5ca..86ccdc97b 100644 --- a/Projects/Features/HomeFeature/Sources/ViewControllers/HomeViewController.swift +++ b/Projects/Features/HomeFeature/Sources/ViewControllers/HomeViewController.swift @@ -1,24 +1,26 @@ -import UIKit -import CommonFeature -import Utility -import DesignSystem -import PanModal import BaseFeature -import RxSwift -import RxCocoa -import DataMappingModule -import DomainModule +import ChartDomainInterface +import ChartFeatureInterface +import DesignSystem +import LogManager import NVActivityIndicatorView -import Then +import PlaylistDomainInterface +import PlaylistFeatureInterface +import RxCocoa +import RxSwift import SnapKit +import SongsDomainInterface +import Then +import UIKit +import Utility public final class HomeViewController: BaseViewController, ViewControllerFromStoryBoard, EqualHandleTappedType { @IBOutlet weak var topSpaceConstraint: NSLayoutConstraint! @IBOutlet weak var scrollView: UIScrollView! @IBOutlet weak var stackView: UIStackView! @IBOutlet weak var activityIndicator: NVActivityIndicatorView! - - //왁뮤차트 TOP100 + + /// 왁뮤차트 TOP100 @IBOutlet weak var topCircleImageView: UIImageView! @IBOutlet weak var chartContentView: UIView! @IBOutlet weak var chartBorderView: UIView! @@ -27,8 +29,8 @@ public final class HomeViewController: BaseViewController, ViewControllerFromSto @IBOutlet weak var chartAllListenButton: UIButton! @IBOutlet weak var chartMoreButton: UIButton! @IBOutlet weak var tableView: UITableView! - - //최신음악 + + /// 최신음악 @IBOutlet weak var latestSongLabel: UILabel! @IBOutlet weak var latestArrowImageView: UIImageView! @IBOutlet weak var latestSongsMoveButton: UIButton! @@ -42,6 +44,7 @@ public final class HomeViewController: BaseViewController, ViewControllerFromSto $0.image = DesignSystemAsset.Home.blurBg.image $0.contentMode = .scaleAspectFill } + private let glassmorphismView = GlassmorphismView().then { $0.setCornerRadius(12) $0.setTheme(theme: .light) @@ -49,69 +52,95 @@ public final class HomeViewController: BaseViewController, ViewControllerFromSto $0.layer.cornerRadius = 12 $0.clipsToBounds = true } + + private let translucentView = UIVisualEffectView(effect: UIBlurEffect(style: .light)).then { + $0.alpha = 0 + } + private var refreshControl = UIRefreshControl() - var playListDetailComponent: PlayListDetailComponent! - var newSongsComponent: NewSongsComponent! - var recommendViewHeightConstraint: NSLayoutConstraint? + private var chartFactory: ChartFactory! + private var playlistDetailFactory: PlaylistDetailFactory! + private var newSongsComponent: NewSongsComponent! + private var songDetailPresenter: (any SongDetailPresentable)! + private var recommendViewHeightConstraint: NSLayoutConstraint? - var viewModel: HomeViewModel! + private var viewModel: HomeViewModel! private lazy var input = HomeViewModel.Input() private lazy var output = viewModel.transform(from: input) - var disposeBag = DisposeBag() + private let disposeBag = DisposeBag() - public override func viewDidLoad() { + override public func viewDidLoad() { super.viewDidLoad() configureUI() configureBlurUI() - inputBind() outputBind() + inputBind() } - - public override func viewDidAppear(_ animated: Bool) { + + override public func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) + LogManager.analytics(CommonAnalyticsLog.viewPage(pageName: .home)) navigationController?.interactivePopGestureRecognizer?.delegate = self } - public override func viewDidDisappear(_ animated: Bool) { + override public func viewDidDisappear(_ animated: Bool) { super.viewDidDisappear(animated) navigationController?.interactivePopGestureRecognizer?.delegate = nil } public static func viewController( viewModel: HomeViewModel, - playListDetailComponent: PlayListDetailComponent, - newSongsComponent: NewSongsComponent + playlistDetailFactory: PlaylistDetailFactory, + newSongsComponent: NewSongsComponent, + chartFactory: ChartFactory, + songDetailPresenter: any SongDetailPresentable ) -> HomeViewController { let viewController = HomeViewController.viewController(storyBoardName: "Home", bundle: Bundle.module) viewController.viewModel = viewModel - viewController.playListDetailComponent = playListDetailComponent + viewController.playlistDetailFactory = playlistDetailFactory viewController.newSongsComponent = newSongsComponent + viewController.chartFactory = chartFactory + viewController.songDetailPresenter = songDetailPresenter return viewController } } extension HomeViewController { private func inputBind() { + input.fetchHomeUseCase.onNext(()) + chartMoreButton.rx.tap - .bind(to: input.chartMoreTapped) + .bind(with: self, onNext: { owner, _ in + LogManager.analytics(HomeAnalyticsLog.clickChartTop100MusicsTitleButton) + let viewController = owner.chartFactory.makeView() + owner.navigationController?.pushViewController(viewController, animated: true) + }) .disposed(by: disposeBag) chartAllListenButton.rx.tap - .bind(to: input.chartAllListenTapped) + .bind(with: self) { owner, _ in + LogManager.analytics(HomeAnalyticsLog.clickAllChartTop100MusicsButton) + let viewController = owner.chartFactory.makeView() + owner.navigationController?.pushViewController(viewController, animated: true) + } .disposed(by: disposeBag) - + latestSongsMoveButton.rx.tap - .withUnretained(self) - .subscribe(onNext: { (owner, _) in + .bind(with: self) { owner, _ in + LogManager.analytics(HomeAnalyticsLog.clickRecentMusicsTitleButton) let viewController = owner.newSongsComponent.makeView() owner.navigationController?.pushViewController(viewController, animated: true) - }) + } .disposed(by: disposeBag) - + latestSongsPlayButton.rx.tap - .bind(to: input.newSongsAllListenTapped) + .bind(with: self) { owner, _ in + LogManager.analytics(HomeAnalyticsLog.clickAllRecentMusicsButton) + let viewController = owner.newSongsComponent.makeView() + owner.navigationController?.pushViewController(viewController, animated: true) + } .disposed(by: disposeBag) - + refreshControl.rx .controlEvent(.valueChanged) .bind(to: input.refreshPulled) @@ -120,45 +149,45 @@ extension HomeViewController { tableView.rx.itemSelected .withLatestFrom(output.chartDataSource) { ($0, $1) } .map { SongEntity( - id: $0.1[$0.0.row].id, - title: $0.1[$0.0.row].title, - artist: $0.1[$0.0.row].artist, - remix: $0.1[$0.0.row].remix, - reaction: $0.1[$0.0.row].reaction, - views: $0.1[$0.0.row].views, - last: $0.1[$0.0.row].last, - date: $0.1[$0.0.row].date + id: $0.1[$0.0.row].id, + title: $0.1[$0.0.row].title, + artist: $0.1[$0.0.row].artist, + views: $0.1[$0.0.row].views, + date: "\($0.1[$0.0.row].date)" + ) } + .bind(with: self) { owner, song in + LogManager.analytics( + HomeAnalyticsLog.clickMusicItem(location: .homeTop100, id: song.id) ) + let viewController = owner.chartFactory.makeView() + owner.navigationController?.pushViewController(viewController, animated: true) } - .subscribe(onNext: { (song) in - PlayState.shared.loadAndAppendSongsToPlaylist([song]) - }) .disposed(by: disposeBag) - + collectionView.rx.itemSelected .withLatestFrom(output.newSongDataSource) { ($0, $1) } .map { SongEntity( - id: $0.1[$0.0.row].id, - title: $0.1[$0.0.row].title, - artist: $0.1[$0.0.row].artist, - remix: $0.1[$0.0.row].remix, - reaction: $0.1[$0.0.row].reaction, - views: $0.1[$0.0.row].views, - last: $0.1[$0.0.row].last, - date: "\($0.1[$0.0.row].date)" + id: $0.1[$0.0.row].id, + title: $0.1[$0.0.row].title, + artist: $0.1[$0.0.row].artist, + views: $0.1[$0.0.row].views, + date: "\($0.1[$0.0.row].date)" + ) } + .bind(with: self) { owner, song in + LogManager.analytics( + HomeAnalyticsLog.clickMusicItem(location: .homeRecent, id: song.id) ) + let viewController = owner.newSongsComponent.makeView() + owner.navigationController?.pushViewController(viewController, animated: true) } - .subscribe(onNext: { (song) in - PlayState.shared.loadAndAppendSongsToPlaylist([song]) - }) .disposed(by: disposeBag) } - + private func outputBind() { tableView.rx .setDelegate(self) .disposed(by: disposeBag) - + collectionView.rx .setDelegate(self) .disposed(by: disposeBag) @@ -166,47 +195,54 @@ extension HomeViewController { output.chartDataSource .skip(1) .filter { $0.count >= 5 } - .map{ Array($0[0..<5]) } + .map { Array($0[0 ..< 5]) } .do(onNext: { [weak self] _ in self?.activityIndicator.stopAnimating() }) - .bind(to: tableView.rx.items) { (tableView, index, model) -> UITableViewCell in + .bind(to: tableView.rx.items) { [weak self] tableView, index, model -> UITableViewCell in let indexPath: IndexPath = IndexPath(row: index, section: 0) - guard let cell = tableView.dequeueReusableCell(withIdentifier: "HomeChartCell", for: indexPath) as? HomeChartCell else{ + guard let cell = tableView + .dequeueReusableCell( + withIdentifier: "HomeChartCell", + for: indexPath + ) as? HomeChartCell else { return UITableViewCell() } cell.update(model: model, index: indexPath.row) + cell.delegate = self return cell - }.disposed(by: disposeBag) - + } + .disposed(by: disposeBag) + output.newSongDataSource .skip(1) - .map{ (model) in - let max: Int = 10 - return (model.count >= max) ? Array(model[0.. UICollectionViewCell in + .bind(to: collectionView.rx.items) { [weak self] collectionView, index, model -> UICollectionViewCell in let indexPath = IndexPath(item: index, section: 0) - guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "HomeNewSongCell", for: indexPath) as? HomeNewSongCell else { + guard let cell = collectionView.dequeueReusableCell( + withReuseIdentifier: "HomeNewSongCell", + for: indexPath + ) as? HomeNewSongCell else { return UICollectionViewCell() } + cell.delegate = self cell.update(model: model) return cell }.disposed(by: disposeBag) - + output.playListDataSource .skip(1) .filter { !$0.isEmpty } .observe(on: MainScheduler.instance) - .subscribe(onNext: { [weak self] (model) in + .subscribe(onNext: { [weak self] model in guard let `self` = self else { return } - let subviews: [UIView] = self.stackView.arrangedSubviews.filter { $0 is RecommendPlayListView }.compactMap { $0 } + let subviews: [UIView] = self.stackView.arrangedSubviews.filter { $0 is RecommendPlayListView } + .compactMap { $0 } let height: CGFloat = RecommendPlayListView.getViewHeight(model: model) if subviews.isEmpty { @@ -229,7 +265,7 @@ extension HomeViewController { bottomSpace.heightAnchor.constraint(equalToConstant: bottomSpace.frame.height).isActive = true self.stackView.addArrangedSubview(bottomSpace) - }else{ + } else { guard let recommendView = subviews.first as? RecommendPlayListView else { return } self.recommendViewHeightConstraint?.constant = height recommendView.dataSource = model @@ -237,7 +273,7 @@ extension HomeViewController { }) .disposed(by: disposeBag) } - + private func configureBlurUI() { [blurImageView, glassmorphismView].forEach { chartContentView.insertSubview($0, at: 0) @@ -247,56 +283,70 @@ extension HomeViewController { $0.top.bottom.equalToSuperview() } } + + view.addSubviews(translucentView) + translucentView.snp.makeConstraints { + $0.top.horizontalEdges.equalToSuperview() + $0.bottom.equalTo(view.safeAreaLayoutGuide.snp.top) + } } - + private func configureUI() { activityIndicator.type = .circleStrokeSpin activityIndicator.color = DesignSystemAsset.PrimaryColor.point.color activityIndicator.startAnimating() - view.backgroundColor = DesignSystemAsset.GrayColor.gray100.color + view.backgroundColor = DesignSystemAsset.BlueGrayColor.gray100.color topCircleImageView.image = DesignSystemAsset.Home.gradationBg.image chartBorderView.layer.cornerRadius = 12 chartBorderView.layer.borderWidth = 1 - chartBorderView.layer.borderColor = DesignSystemAsset.GrayColor.gray25.color.cgColor - + chartBorderView.layer.borderColor = DesignSystemAsset.BlueGrayColor.gray25.color.cgColor + let mainTitleLabelAttributedString = NSMutableAttributedString( string: "왁뮤차트 TOP100", - attributes: [.font: DesignSystemFontFamily.Pretendard.bold.font(size: 16), - .foregroundColor: DesignSystemAsset.GrayColor.gray900.color, - .kern: -0.5] + attributes: [ + .font: DesignSystemFontFamily.Pretendard.bold.font(size: 16), + .foregroundColor: DesignSystemAsset.BlueGrayColor.gray900.color, + .kern: -0.5 + ] ) chartTitleLabel.attributedText = mainTitleLabelAttributedString let mainTitleAllButtonAttributedString = NSMutableAttributedString( - string: "전체듣기", - attributes: [.font: DesignSystemFontFamily.Pretendard.medium.font(size: 14), - .foregroundColor: DesignSystemAsset.GrayColor.gray25.color, - .kern: -0.5] + string: "전체보기", + attributes: [ + .font: DesignSystemFontFamily.Pretendard.medium.font(size: 14), + .foregroundColor: DesignSystemAsset.BlueGrayColor.gray25.color, + .kern: -0.5 + ] ) chartAllListenButton.setAttributedTitle(mainTitleAllButtonAttributedString, for: .normal) chartArrowImageView.image = DesignSystemAsset.Home.homeArrowRight.image - + let latestSongAttributedString = NSMutableAttributedString( string: "최신 음악", - attributes: [.font: DesignSystemFontFamily.Pretendard.bold.font(size: 16), - .foregroundColor: DesignSystemAsset.GrayColor.gray900.color, - .kern: -0.5] + attributes: [ + .font: DesignSystemFontFamily.Pretendard.bold.font(size: 16), + .foregroundColor: DesignSystemAsset.BlueGrayColor.gray900.color, + .kern: -0.5 + ] ) latestSongLabel.attributedText = latestSongAttributedString latestArrowImageView.image = DesignSystemAsset.Home.homeArrowRight.image let latestSongPlayAttributedString = NSMutableAttributedString( - string: "전체듣기", - attributes: [.font: DesignSystemFontFamily.Pretendard.medium.font(size: 14), - .foregroundColor: DesignSystemAsset.GrayColor.gray900.color.withAlphaComponent(0.6), - .kern: -0.5] + string: "전체보기", + attributes: [ + .font: DesignSystemFontFamily.Pretendard.medium.font(size: 14), + .foregroundColor: DesignSystemAsset.BlueGrayColor.gray900.color.withAlphaComponent(0.6), + .kern: -0.5 + ] ) latestSongsPlayButton.setAttributedTitle(latestSongPlayAttributedString, for: .normal) - + latestSongEmptyLabel.isHidden = true latestSongEmptyLabel.text = "현재 집계된 음악이 없습니다." - latestSongEmptyLabel.textColor = DesignSystemAsset.GrayColor.gray900.color + latestSongEmptyLabel.textColor = DesignSystemAsset.BlueGrayColor.gray900.color latestSongEmptyLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 14) latestSongEmptyLabel.setTextWithAttributes(kernValue: -0.5) latestSongEmptyLabel.textAlignment = .center @@ -312,6 +362,7 @@ extension HomeViewController: UIScrollViewDelegate { let standard: CGFloat = offsetY / topCircleImageView.frame.height blurImageView.alpha = 1.0 - standard glassmorphismView.alpha = min(1.0, standard + 0.8) + translucentView.alpha = min(max(offsetY / translucentView.frame.height, 0), 1) } } @@ -321,7 +372,7 @@ extension HomeViewController: UITableViewDelegate { } } -extension HomeViewController: UICollectionViewDelegate, UICollectionViewDelegateFlowLayout{ +extension HomeViewController: UICollectionViewDelegate, UICollectionViewDelegateFlowLayout { public func collectionView( _ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, @@ -329,33 +380,89 @@ extension HomeViewController: UICollectionViewDelegate, UICollectionViewDelegate ) -> CGSize { return CGSize(width: 144.0, height: 131.0) } - - public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets { + + public func collectionView( + _ collectionView: UICollectionView, + layout collectionViewLayout: UICollectionViewLayout, + insetForSectionAt section: Int + ) -> UIEdgeInsets { return UIEdgeInsets(top: 0, left: 20.0, bottom: 0, right: 20.0) } - public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat { + public func collectionView( + _ collectionView: UICollectionView, + layout collectionViewLayout: UICollectionViewLayout, + minimumLineSpacingForSectionAt section: Int + ) -> CGFloat { return 8.0 } - - public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { + + public func collectionView( + _ collectionView: UICollectionView, + layout collectionViewLayout: UICollectionViewLayout, + minimumInteritemSpacingForSectionAt section: Int + ) -> CGFloat { return 8.0 } } +extension HomeViewController: HomeChartCellDelegate { + func thumbnailDidTap(model: ChartRankingEntity) { + LogManager.analytics(HomeAnalyticsLog.clickMusicItem(location: .homeTop100, id: model.id)) + PlayState.shared.append(item: .init(id: model.id, title: model.title, artist: model.artist)) + let playlistIDs = PlayState.shared.currentPlaylist + .map(\.id) + songDetailPresenter.present(ids: playlistIDs, selectedID: model.id) + } + + func playButtonDidTap(model: ChartRankingEntity) { + LogManager.analytics( + CommonAnalyticsLog.clickPlayButton(location: .home, type: .single) + ) + PlayState.shared.append(item: .init(id: model.id, title: model.title, artist: model.artist)) + WakmusicYoutubePlayer( + id: model.id, + playPlatform: model.title.isContainShortsTagTitle ? .youtube : .automatic + ).play() + } +} + +extension HomeViewController: HomeNewSongCellDelegate { + func thumbnailDidTap(model: NewSongsEntity) { + LogManager.analytics(HomeAnalyticsLog.clickMusicItem(location: .homeRecent, id: model.id)) + PlayState.shared.append(item: .init(id: model.id, title: model.title, artist: model.artist)) + let playlistIDs = PlayState.shared.currentPlaylist + .map(\.id) + songDetailPresenter.present(ids: playlistIDs, selectedID: model.id) + } + + func playButtonDidTap(model: NewSongsEntity) { + LogManager.analytics( + CommonAnalyticsLog.clickPlayButton(location: .home, type: .single) + ) + PlayState.shared.append(item: .init(id: model.id, title: model.title, artist: model.artist)) + WakmusicYoutubePlayer( + id: model.id, + playPlatform: model.title.isContainShortsTagTitle ? .youtube : .automatic + ).play() + } +} + extension HomeViewController: RecommendPlayListViewDelegate { - public func itemSelected(model: RecommendPlayListEntity) { - let playListDetailVc = playListDetailComponent.makeView(id: model.key, type: .wmRecommend) - self.navigationController?.pushViewController(playListDetailVc, animated: true) + public func itemSelected(model: RecommendPlaylistEntity) { + LogManager.analytics(CommonAnalyticsLog.clickPlaylistItem(location: .home, key: model.key)) + let viewController = playlistDetailFactory.makeWmView(key: model.key) // 왁뮤 플리 + self.navigationController?.pushViewController(viewController, animated: true) } } -extension HomeViewController { - public func equalHandleTapped() { +public extension HomeViewController { + func equalHandleTapped() { let viewControllersCount: Int = self.navigationController?.viewControllers.count ?? 0 if viewControllersCount > 1 { self.navigationController?.popToRootViewController(animated: true) - }else{ + } else { + guard let scrollView = self.scrollView else { return } scrollView.setContentOffset(CGPoint(x: 0, y: -STATUS_BAR_HEGHIT()), animated: true) } } diff --git a/Projects/Features/HomeFeature/Sources/ViewControllers/NewSongsContentViewController.swift b/Projects/Features/HomeFeature/Sources/ViewControllers/NewSongsContentViewController.swift new file mode 100644 index 000000000..06f15d263 --- /dev/null +++ b/Projects/Features/HomeFeature/Sources/ViewControllers/NewSongsContentViewController.swift @@ -0,0 +1,339 @@ +import BaseFeature +import BaseFeatureInterface +import DesignSystem +import Localization +import LogManager +import NVActivityIndicatorView +import RxCocoa +import RxSwift +import SignInFeatureInterface +import SongsDomainInterface +import UIKit +import Utility + +public class NewSongsContentViewController: UIViewController, ViewControllerFromStoryBoard, SongCartViewType { + @IBOutlet weak var tableView: UITableView! + @IBOutlet weak var activityIncidator: NVActivityIndicatorView! + + private var viewModel: NewSongsContentViewModel! + fileprivate lazy var input = NewSongsContentViewModel.Input() + fileprivate lazy var output = viewModel.transform(from: input) + private let disposeBag = DisposeBag() + + private var containSongsFactory: ContainSongsFactory! + private var textPopupFactory: TextPopupFactory! + private var signInFactory: SignInFactory! + private var songDetailPresenter: SongDetailPresentable! + + public var songCartView: SongCartView! + public var bottomSheetView: BottomSheetView! + private var refreshControl = UIRefreshControl() + + deinit { DEBUG_LOG("❌ \(Self.self) Deinit") } + + override public func viewDidLoad() { + super.viewDidLoad() + configureUI() + outputBind() + inputBind() + } + + override public func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + self.input.allSongSelected.onNext(false) + } + + public static func viewController( + viewModel: NewSongsContentViewModel, + containSongsFactory: ContainSongsFactory, + textPopupFactory: TextPopupFactory, + signInFactory: SignInFactory, + songDetailPresenter: SongDetailPresentable + ) -> NewSongsContentViewController { + let viewController = NewSongsContentViewController.viewController( + storyBoardName: "Home", + bundle: Bundle.module + ) + viewController.viewModel = viewModel + viewController.containSongsFactory = containSongsFactory + viewController.textPopupFactory = textPopupFactory + viewController.signInFactory = signInFactory + viewController.songDetailPresenter = songDetailPresenter + return viewController + } +} + +private extension NewSongsContentViewController { + func inputBind() { + input.fetchPlaylistURL.onNext(()) + + tableView.rx + .setDelegate(self) + .disposed(by: disposeBag) + + tableView.rx.willDisplayCell + .map { $1 } + .withLatestFrom( + output.dataSource, + resultSelector: { indexPath, datasource -> (IndexPath, [NewSongsEntity]) in + return (indexPath, datasource) + } + ) + .filter { indexPath, datasources -> Bool in + return indexPath.item == datasources.count - 1 + } + .withLatestFrom(output.canLoadMore) + .filter { $0 } + .map { _ in return () } + .bind(to: rx.loadMore) + .disposed(by: disposeBag) + + tableView.rx.itemSelected + .map { $0.row } + .bind(to: input.songTapped) + .disposed(by: disposeBag) + + refreshControl.rx + .controlEvent(.valueChanged) + .bind(to: input.refreshPulled) + .disposed(by: disposeBag) + } + + func outputBind() { + output.dataSource + .skip(1) + .withLatestFrom(output.indexOfSelectedSongs) { ($0, $1) } + .do(onNext: { [weak self] dataSource, songs in + guard let self = self else { return } + self.activityIncidator.stopAnimating() + self.refreshControl.endRefreshing() + let space: CGFloat = APP_HEIGHT() - 48 - 40 - 56 - 56 - STATUS_BAR_HEGHIT() - SAFEAREA_BOTTOM_HEIGHT() + let height: CGFloat = space / 3 * 2 + let warningView: WarningView = WarningView(frame: CGRect( + x: 0, + y: 0, + width: APP_WIDTH(), + height: height + )) + warningView.text = "데이터가 없습니다." + self.tableView.tableFooterView = dataSource.isEmpty ? warningView : UIView(frame: CGRect( + x: 0, + y: 0, + width: APP_WIDTH(), + height: PLAYER_HEIGHT() + )) + if let songCart = self.songCartView { + songCart.updateAllSelect(isAll: songs.count == dataSource.count) + } + }) + .map { $0.0 } + .bind(to: tableView.rx.items) { [weak self] tableView, index, model -> UITableViewCell in + guard let self = self, + let cell = tableView.dequeueReusableCell( + withIdentifier: "NewSongsCell", + for: IndexPath(row: index, section: 0) + ) as? NewSongsCell else { + return UITableViewCell() + } + cell.delegate = self + cell.update(model: model) + return cell + } + .disposed(by: disposeBag) + + output.indexOfSelectedSongs + .skip(1) + .withLatestFrom(output.dataSource) { ($0, $1) } + .subscribe(onNext: { [weak self] songs, dataSource in + guard let self = self else { return } + switch songs.isEmpty { + case true: + self.hideSongCart() + case false: + self.showSongCart( + in: self.view, + type: .chartSong, + selectedSongCount: songs.count, + totalSongCount: dataSource.count, + useBottomSpace: false + ) + self.songCartView?.delegate = self + } + }) + .disposed(by: disposeBag) + + output.songEntityOfSelectedSongs + .filter { !$0.isEmpty } + .subscribe() + .disposed(by: disposeBag) + + output.playlistURL + .subscribe() + .disposed(by: disposeBag) + + output.showToast + .withLatestFrom(output.songEntityOfSelectedSongs) { ($0, $1) } + .bind(with: self) { owner, model in + let (message, selectedSongs) = model + owner.showToast( + text: message, + options: selectedSongs.isEmpty ? [.tabBar] : [.tabBar, .songCart] + ) + } + .disposed(by: disposeBag) + + output.showLogin + .bind(with: self) { owner, _ in + let viewController = owner.textPopupFactory.makeView( + text: "로그인이 필요한 서비스입니다.\n로그인 하시겠습니까?", + cancelButtonIsHidden: false, + confirmButtonText: nil, + cancelButtonText: nil, + completion: { + let log = CommonAnalyticsLog.clickLoginButton(entry: .addMusics) + LogManager.analytics(log) + + let loginVC = owner.signInFactory.makeView() + loginVC.modalPresentationStyle = .overFullScreen + owner.present(loginVC, animated: true) + }, + cancelCompletion: {} + ) + owner.showBottomSheet(content: viewController) + } + .disposed(by: disposeBag) + } + + func configureUI() { + view.backgroundColor = DesignSystemAsset.BlueGrayColor.gray100.color + activityIncidator.type = .circleStrokeSpin + activityIncidator.color = DesignSystemAsset.PrimaryColor.point.color + activityIncidator.startAnimating() + tableView.backgroundColor = .clear + tableView.refreshControl = refreshControl + tableView.sectionHeaderTopPadding = 0 + } +} + +extension NewSongsContentViewController: NewSongsCellDelegate { + func tappedThumbnail(id: String) { + guard let tappedSong = output.dataSource.value + .first(where: { $0.id == id }) + else { return } + PlayState.shared.append(item: .init(id: tappedSong.id, title: tappedSong.title, artist: tappedSong.artist)) + let playlistIDs = PlayState.shared.currentPlaylist + .map(\.id) + songDetailPresenter.present(ids: playlistIDs, selectedID: id) + } +} + +extension NewSongsContentViewController: UITableViewDelegate { + public func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + return 60 + } + + public func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { + return 78 + } + + public func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { + let view = SingleActionButtonView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: 78)) + view.delegate = self + view.setTitleAndImage(text: "전체재생", image: DesignSystemAsset.Chart.allPlay.image) + return view + } +} + +extension NewSongsContentViewController: SingleActionButtonViewDelegate { + public func tappedButtonAction() { + let playlistURL: String = output.playlistURL.value + guard !playlistURL.isEmpty, let url = URL(string: playlistURL) else { + output.showToast.onNext("해당 기능은 준비 중입니다.") + return + } + if let components = URLComponents(url: url, resolvingAgainstBaseURL: false), + let listID = components.queryItems?.first(where: { $0.name == "list" })?.value { + WakmusicYoutubePlayer(listID: listID).play() + } + + let songs: [SongEntity] = output.dataSource.value.map { + return SongEntity( + id: $0.id, + title: $0.title, + artist: $0.artist, + views: $0.views, + date: "\($0.date)" + ) + } + LogManager.analytics( + CommonAnalyticsLog.clickPlayButton(location: .recentMusic, type: .all) + ) + PlayState.shared.loadAndAppendSongsToPlaylist(songs) + } +} + +extension NewSongsContentViewController: SongCartViewDelegate { + public func buttonTapped(type: SongCartSelectType) { + let limit: Int = 50 + let songs: [SongEntity] = output.songEntityOfSelectedSongs.value + + switch type { + case let .allSelect(flag): + input.allSongSelected.onNext(flag) + + case .addSong: + let log = CommonAnalyticsLog.clickAddMusicsButton(location: .recentMusic) + LogManager.analytics(log) + + if PreferenceManager.userInfo == nil { + output.showLogin.onNext(()) + return + } + + guard songs.count <= limit else { + output.showToast.onNext(LocalizationStrings.overFlowContainWarning(songs.count - limit)) + return + } + + let songIds: [String] = songs.map { $0.id } + let viewController = containSongsFactory.makeView(songs: songIds) + viewController.modalPresentationStyle = .overFullScreen + self.present(viewController, animated: true) { + self.input.allSongSelected.onNext(false) + } + + case .addPlayList: + PlayState.shared.appendSongsToPlaylist(songs) + output.showToast.onNext(LocalizationStrings.addList) + input.allSongSelected.onNext(false) + + case .play: + guard songs.count <= limit else { + output.showToast.onNext(LocalizationStrings.overFlowPlayWarning(songs.count - limit)) + return + } + PlayState.shared.loadAndAppendSongsToPlaylist(songs) + input.allSongSelected.onNext(false) + LogManager.analytics( + CommonAnalyticsLog.clickPlayButton(location: .recentMusic, type: .multiple) + ) + if songs.allSatisfy({ $0.title.isContainShortsTagTitle }) { + WakmusicYoutubePlayer(ids: songs.map { $0.id }, title: "왁타버스 뮤직", playPlatform: .youtube).play() + } else { + WakmusicYoutubePlayer(ids: songs.map { $0.id }, title: "왁타버스 뮤직").play() + } + + case .remove: + return + } + } +} + +extension Reactive where Base: NewSongsContentViewController { + var loadMore: Binder { + return Binder(base) { viewController, _ in + let pageID = viewController.input.pageID.value + viewController.input.pageID.accept(pageID + 1) + } + } +} diff --git a/Projects/Features/HomeFeature/Sources/ViewControllers/NewSongsViewController.swift b/Projects/Features/HomeFeature/Sources/ViewControllers/NewSongsViewController.swift new file mode 100644 index 000000000..770c84f49 --- /dev/null +++ b/Projects/Features/HomeFeature/Sources/ViewControllers/NewSongsViewController.swift @@ -0,0 +1,148 @@ +// +// NewSongsViewController.swift +// CommonFeature +// +// Created by KTH on 2023/11/15. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import DesignSystem +import LogManager +import Pageboy +import SongsDomainInterface +import Tabman +import UIKit +import Utility + +public class NewSongsViewController: TabmanViewController, ViewControllerFromStoryBoard { + @IBOutlet weak var backButton: UIButton! + @IBOutlet weak var navigationTitleLabel: UILabel! + @IBOutlet weak var tabBarContentView: UIView! + + private var newSongsContentComponent: NewSongsContentComponent! + private lazy var viewControllers: [NewSongsContentViewController] = { + let viewControllers = NewSongGroupType.allCases.map { + self.newSongsContentComponent.makeView(type: $0) + } + return viewControllers + }() + + deinit { LogManager.printDebug("❌ \(Self.self) Deinit") } + + override public func viewDidLoad() { + super.viewDidLoad() + configureUI() + configurePage() + } + + override public func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + let log = CommonAnalyticsLog.viewPage(pageName: .recentMusic) + LogManager.analytics(log) + } + + override public func pageboyViewController( + _ pageboyViewController: PageboyViewController, + didScrollToPageAt index: TabmanViewController.PageIndex, + direction: PageboyViewController.NavigationDirection, + animated: Bool + ) { + let type = NewSongsAnalyticsLog.RecentMusicType.allCases[safe: index] ?? .all + let log = NewSongsAnalyticsLog.selectRecentMusicType(type: type) + LogManager.analytics(log) + + super.pageboyViewController( + pageboyViewController, + didScrollToPageAt: index, + direction: direction, + animated: animated + ) + } + + public static func viewController( + newSongsContentComponent: NewSongsContentComponent + ) -> NewSongsViewController { + let viewController = NewSongsViewController.viewController(storyBoardName: "Home", bundle: Bundle.module) + viewController.newSongsContentComponent = newSongsContentComponent + return viewController + } + + @IBAction func backButtonAction(_ sender: Any) { + self.navigationController?.popViewController(animated: true) + } +} + +extension NewSongsViewController { + private func configureUI() { + self.view.backgroundColor = DesignSystemAsset.BlueGrayColor.gray100.color + self.backButton.setImage(DesignSystemAsset.Navigation.back.image, for: .normal) + self.navigationTitleLabel.text = "최신 음악" + self.navigationTitleLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) + self.navigationTitleLabel.textColor = DesignSystemAsset.BlueGrayColor.gray900.color + self.navigationTitleLabel.setTextWithAttributes(kernValue: -0.5) + } + + private func configurePage() { + self.dataSource = self + let bar = TMBar.ButtonBar() + + // 배경색 + bar.backgroundView.style = .clear + + // 간격 설정 + bar.layout.contentInset = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20) + bar.layout.contentMode = .fit + bar.layout.transitionStyle = .progressive + bar.layout.interButtonSpacing = 0 + + // 버튼 글씨 커스텀 + bar.buttons.customize { button in + button.tintColor = DesignSystemAsset.BlueGrayColor.gray400.color + button.selectedTintColor = DesignSystemAsset.BlueGrayColor.gray900.color + button.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) + button.selectedFont = DesignSystemFontFamily.Pretendard.bold.font(size: 16) + } + + // indicator + bar.indicator.weight = .custom(value: 2) + bar.indicator.tintColor = DesignSystemAsset.PrimaryColor.point.color + bar.indicator.overscrollBehavior = .compress + + addBar(bar, dataSource: self, at: .custom(view: tabBarContentView, layout: nil)) + } +} + +extension NewSongsViewController: PageboyViewControllerDataSource, TMBarDataSource { + public func barItem(for bar: TMBar, at index: Int) -> TMBarItemable { + switch index { + case 0: + return TMBarItem(title: NewSongGroupType.all.display) + case 1: + return TMBarItem(title: NewSongGroupType.woowakgood.display) + case 2: + return TMBarItem(title: NewSongGroupType.isedol.display) + case 3: + return TMBarItem(title: NewSongGroupType.gomem.display) + case 4: + return TMBarItem(title: NewSongGroupType.academy.display) + default: + let title = "Page \(index)" + return TMBarItem(title: title) + } + } + + public func numberOfViewControllers(in pageboyViewController: PageboyViewController) -> Int { + return viewControllers.count + } + + public func viewController( + for pageboyViewController: PageboyViewController, + at index: PageboyViewController.PageIndex + ) -> UIViewController? { + return viewControllers[index] + } + + public func defaultPage(for pageboyViewController: PageboyViewController) -> PageboyViewController.Page? { + return nil + } +} diff --git a/Projects/Features/HomeFeature/Sources/ViewModels/HomeViewModel.swift b/Projects/Features/HomeFeature/Sources/ViewModels/HomeViewModel.swift index 05f02ca16..90963f49a 100644 --- a/Projects/Features/HomeFeature/Sources/ViewModels/HomeViewModel.swift +++ b/Projects/Features/HomeFeature/Sources/ViewModels/HomeViewModel.swift @@ -6,141 +6,90 @@ // Copyright © 2023 yongbeomkwak. All rights reserved. // +import BaseFeature +import ChartDomainInterface import Foundation -import RxSwift +import LogManager +import PlaylistDomainInterface import RxCocoa -import BaseFeature -import DomainModule +import RxSwift +import SongsDomainInterface import Utility -import DataMappingModule -import CommonFeature + +typealias HomeUseCase = Observable<([ChartRankingEntity], [NewSongsEntity], [RecommendPlaylistEntity])> public final class HomeViewModel: ViewModelType { - - var disposeBag = DisposeBag() + private let disposeBag = DisposeBag() var fetchChartRankingUseCase: FetchChartRankingUseCase var fetchNewSongsUseCase: FetchNewSongsUseCase - var fetchRecommendPlayListUseCase: FetchRecommendPlayListUseCase + var fetchRecommendPlaylistUseCase: FetchRecommendPlaylistUseCase public init( fetchChartRankingUseCase: any FetchChartRankingUseCase, fetchNewSongsUseCase: any FetchNewSongsUseCase, - fetchRecommendPlayListUseCase: any FetchRecommendPlayListUseCase - ){ + fetchRecommendPlaylistUseCase: any FetchRecommendPlaylistUseCase + ) { self.fetchChartRankingUseCase = fetchChartRankingUseCase self.fetchNewSongsUseCase = fetchNewSongsUseCase - self.fetchRecommendPlayListUseCase = fetchRecommendPlayListUseCase + self.fetchRecommendPlaylistUseCase = fetchRecommendPlaylistUseCase } public struct Input { - var chartMoreTapped: PublishSubject = PublishSubject() - var chartAllListenTapped: PublishSubject = PublishSubject() - var newSongsAllListenTapped: PublishSubject = PublishSubject() - var refreshPulled: PublishSubject = PublishSubject() + let fetchHomeUseCase: PublishSubject = PublishSubject() + let refreshPulled: PublishSubject = PublishSubject() } public struct Output { - var chartDataSource: BehaviorRelay<[ChartRankingEntity]> - let newSongDataSource: BehaviorRelay<[NewSongsEntity]> - var playListDataSource: BehaviorRelay<[RecommendPlayListEntity]> - } - - public func transform(from input: Input) -> Output { let chartDataSource: BehaviorRelay<[ChartRankingEntity]> = BehaviorRelay(value: []) let newSongDataSource: BehaviorRelay<[NewSongsEntity]> = BehaviorRelay(value: []) - let playListDataSource: BehaviorRelay<[RecommendPlayListEntity]> = BehaviorRelay(value: []) + let playListDataSource: BehaviorRelay<[RecommendPlaylistEntity]> = BehaviorRelay(value: []) + } + public func transform(from input: Input) -> Output { + let output = Output() let chart = self.fetchChartRankingUseCase - .execute(type: .hourly, limit: 100) - .catchAndReturn([]) + .execute(type: .hourly) + .catchAndReturn(.init(updatedAt: "팬치들 미안해요 ㅠㅠ 잠시만 기다려주세요.", songs: [])) + .map { $0.songs } .asObservable() - + let newSongs = self.fetchNewSongsUseCase - .execute(type: .all, page: 1, limit: 100) + .execute(type: .all, page: 1, limit: 10) .catchAndReturn([]) .asObservable() - - let playList = self.fetchRecommendPlayListUseCase + + let playList = self.fetchRecommendPlaylistUseCase .execute() .catchAndReturn([]) .asObservable() - let chartAndNewSong = Observable.zip(chart, newSongs) - let firstLoad = Observable.zip(chartAndNewSong, playList) + let homeSceneUseCase = Observable.zip(chart, newSongs, playList) - firstLoad - .take(1) - .subscribe(onNext: { (arg, recommendPlayListEntity) in - let (chartRankingEntity, newSongEntity) = arg - chartDataSource.accept(chartRankingEntity) - newSongDataSource.accept(newSongEntity) - playListDataSource.accept(recommendPlayListEntity) - }) - .disposed(by: disposeBag) - - input.chartMoreTapped - .map { _ in 1 } - .subscribe(onNext: { (index) in - NotificationCenter.default.post(name: .movedTab, object: index) - }).disposed(by: disposeBag) - - input.chartAllListenTapped - .withLatestFrom(chartDataSource) - .subscribe(onNext: { (songs) in - let songEntities: [SongEntity] = songs.map { - return SongEntity( - id: $0.id, - title: $0.title, - artist: $0.artist, - remix: $0.remix, - reaction: $0.reaction, - views: $0.views, - last: $0.last, - date: $0.date - ) - } - PlayState.shared.loadAndAppendSongsToPlaylist(songEntities) + input.fetchHomeUseCase + .flatMap { _ -> HomeUseCase in + return homeSceneUseCase + } + .subscribe(onNext: { arg in + let (chartRankingEntity, newSongEntity, recommendPlayListEntity) = arg + output.chartDataSource.accept(chartRankingEntity) + output.newSongDataSource.accept(newSongEntity) + output.playListDataSource.accept(recommendPlayListEntity) }) .disposed(by: disposeBag) - input.newSongsAllListenTapped - .withLatestFrom(newSongDataSource) - .subscribe(onNext: { (newSongs) in - let songEntities: [SongEntity] = newSongs.map { - return SongEntity( - id: $0.id, - title: $0.title, - artist: $0.artist, - remix: $0.remix, - reaction: $0.reaction, - views: $0.views, - last: $0.last, - date: "\($0.date)" - ) - } - PlayState.shared.loadAndAppendSongsToPlaylist(songEntities) - }) - .disposed(by: disposeBag) - input.refreshPulled - .flatMap { _ -> Observable<(([ChartRankingEntity], [NewSongsEntity]), [RecommendPlayListEntity])> in - let chartAndNewSong = Observable.zip(chart, newSongs) - let result = Observable.zip(chartAndNewSong, playList) - return result + .flatMap { _ -> HomeUseCase in + return homeSceneUseCase } .debug("✅ Refresh Completed") - .subscribe(onNext: { (arg, recommendPlayListEntity) in - let (chartRankingEntity, newSongEntity) = arg - chartDataSource.accept(chartRankingEntity) - newSongDataSource.accept(newSongEntity) - playListDataSource.accept(recommendPlayListEntity) + .subscribe(onNext: { arg in + let (chartRankingEntity, newSongEntity, recommendPlayListEntity) = arg + output.chartDataSource.accept(chartRankingEntity) + output.newSongDataSource.accept(newSongEntity) + output.playListDataSource.accept(recommendPlayListEntity) }) .disposed(by: disposeBag) - return Output( - chartDataSource: chartDataSource, - newSongDataSource: newSongDataSource, - playListDataSource: playListDataSource - ) + return output } } diff --git a/Projects/Features/HomeFeature/Sources/ViewModels/NewSongsContentViewModel.swift b/Projects/Features/HomeFeature/Sources/ViewModels/NewSongsContentViewModel.swift new file mode 100644 index 000000000..26b00ae4f --- /dev/null +++ b/Projects/Features/HomeFeature/Sources/ViewModels/NewSongsContentViewModel.swift @@ -0,0 +1,166 @@ +// +// NewSongsContentViewModel.swift +// CommonFeature +// +// Created by KTH on 2023/11/15. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import BaseFeature +import ChartDomainInterface +import Foundation +import LogManager +import RxRelay +import RxSwift +import SongsDomainInterface +import Utility + +public final class NewSongsContentViewModel: ViewModelType { + public let type: NewSongGroupType + private let disposeBag = DisposeBag() + private let fetchNewSongsUseCase: FetchNewSongsUseCase + private let fetchNewSongsPlaylistUseCase: FetchNewSongsPlaylistUseCase + + deinit { DEBUG_LOG("❌ \(Self.self) Deinit") } + + public init( + type: NewSongGroupType, + fetchNewSongsUseCase: FetchNewSongsUseCase, + fetchNewSongsPlaylistUseCase: FetchNewSongsPlaylistUseCase + ) { + self.type = type + self.fetchNewSongsUseCase = fetchNewSongsUseCase + self.fetchNewSongsPlaylistUseCase = fetchNewSongsPlaylistUseCase + } + + public struct Input { + let pageID: BehaviorRelay = BehaviorRelay(value: 1) + let songTapped: PublishSubject = PublishSubject() + let allSongSelected: PublishSubject = PublishSubject() + let refreshPulled: PublishSubject = PublishSubject() + let fetchPlaylistURL: PublishSubject = PublishSubject() + } + + public struct Output { + let dataSource: BehaviorRelay<[NewSongsEntity]> = BehaviorRelay(value: []) + let indexOfSelectedSongs: BehaviorRelay<[Int]> = BehaviorRelay(value: []) + let songEntityOfSelectedSongs: BehaviorRelay<[SongEntity]> = BehaviorRelay(value: []) + let playlistURL: BehaviorRelay = BehaviorRelay(value: "") + let canLoadMore: BehaviorRelay = BehaviorRelay(value: true) + let showToast: PublishSubject = .init() + let showLogin: PublishSubject = .init() + } + + public func transform(from input: Input) -> Output { + let output = Output() + + let refresh = Observable.combineLatest( + output.dataSource, + input.pageID + ) { dataSource, pageID -> [NewSongsEntity] in + return pageID == 1 ? [] : dataSource + } + + let type: NewSongGroupType = self.type + let fetchNewSongsUseCase = self.fetchNewSongsUseCase + let limit: Int = 30 + + input.pageID + .flatMap { pageID -> Single<[NewSongsEntity]> in + return fetchNewSongsUseCase + .execute(type: type, page: pageID, limit: limit) + .catchAndReturn([]) + } + .asObservable() + .do(onNext: { model in + let canLoadMore: Bool = model.count < limit ? false : true + output.canLoadMore.accept(canLoadMore) + LogManager + .printDebug( + "page: \(input.pageID.value) called, count: \(model.count), nextPage exist: \(canLoadMore)" + ) + }, onError: { _ in + output.canLoadMore.accept(false) + }) + .withLatestFrom(refresh, resultSelector: { newModels, datasources -> [NewSongsEntity] in + return datasources + newModels + }) + .bind(to: output.dataSource) + .disposed(by: disposeBag) + + input.refreshPulled + .map { _ in 1 } + .bind(to: input.pageID) + .disposed(by: disposeBag) + + input.fetchPlaylistURL + .flatMap { [fetchNewSongsPlaylistUseCase] _ in + return fetchNewSongsPlaylistUseCase.execute(type: type) + .catchAndReturn(.init(url: "")) + } + .map { $0.url } + .bind(to: output.playlistURL) + .disposed(by: disposeBag) + + input.songTapped + .withLatestFrom(output.indexOfSelectedSongs, resultSelector: { index, selectedSongs -> [Int] in + if selectedSongs.contains(index) { + guard let removeTargetIndex = selectedSongs.firstIndex(where: { $0 == index }) + else { return selectedSongs } + var newSelectedSongs = selectedSongs + newSelectedSongs.remove(at: removeTargetIndex) + return newSelectedSongs + } else { + return selectedSongs + [index] + } + }) + .map { $0.sorted { $0 < $1 } } + .bind(to: output.indexOfSelectedSongs) + .disposed(by: disposeBag) + + input.allSongSelected + .withLatestFrom(output.dataSource) { ($0, $1) } + .map { flag, dataSource -> [Int] in + return flag ? Array(0 ..< dataSource.count) : [] + } + .bind(to: output.indexOfSelectedSongs) + .disposed(by: disposeBag) + + Utility.PreferenceManager.$startPage + .skip(1) + .map { _ in [] } + .bind(to: output.indexOfSelectedSongs) + .disposed(by: disposeBag) + + output.indexOfSelectedSongs + .withLatestFrom(output.dataSource) { ($0, $1) } + .map { selectedSongs, dataSource in + var newModel = dataSource + newModel.indices.forEach { newModel[$0].isSelected = false } + selectedSongs.forEach { i in + newModel[i].isSelected = true + } + return newModel + } + .bind(to: output.dataSource) + .disposed(by: disposeBag) + + output.indexOfSelectedSongs + .withLatestFrom(output.dataSource) { ($0, $1) } + .map { indexOfSelectedSongs, dataSource -> [SongEntity] in + return indexOfSelectedSongs.map { + SongEntity( + id: dataSource[$0].id, + title: dataSource[$0].title, + artist: dataSource[$0].artist, + views: dataSource[$0].views, + date: "\(dataSource[$0].date)" + ) + } + } + .bind(to: output.songEntityOfSelectedSongs) + .disposed(by: disposeBag) + + return output + } +} diff --git a/Projects/Features/HomeFeature/Sources/Views/HomeChartCell.swift b/Projects/Features/HomeFeature/Sources/Views/HomeChartCell.swift index 25dbefba7..c44c2c4d8 100644 --- a/Projects/Features/HomeFeature/Sources/Views/HomeChartCell.swift +++ b/Projects/Features/HomeFeature/Sources/Views/HomeChartCell.swift @@ -6,15 +6,21 @@ // Copyright © 2023 yongbeomkwak. All rights reserved. // -import UIKit -import SnapKit +import ChartDomainInterface import DesignSystem -import DomainModule import Kingfisher +import RxGesture +import RxSwift +import SnapKit +import UIKit import Utility -class HomeChartCell: UITableViewCell { +protocol HomeChartCellDelegate: AnyObject { + func thumbnailDidTap(model: ChartRankingEntity) + func playButtonDidTap(model: ChartRankingEntity) +} +class HomeChartCell: UITableViewCell { @IBOutlet weak var rankLabel: UILabel! @IBOutlet weak var rankImageView: UIImageView! @IBOutlet weak var rankChangedLabel: UILabel! @@ -22,18 +28,23 @@ class HomeChartCell: UITableViewCell { @IBOutlet weak var songNameLabel: UILabel! @IBOutlet weak var artistLabel: UILabel! @IBOutlet weak var playImageView: UIImageView! - + + var delegate: (any HomeChartCellDelegate)? + private var model: ChartRankingEntity? + private let disposeBag = DisposeBag() + override func awakeFromNib() { super.awakeFromNib() albumImageView.layer.cornerRadius = 4 albumImageView.contentMode = .scaleAspectFill playImageView.image = DesignSystemAsset.Home.playSmall.image + bind() } } -extension HomeChartCell{ +extension HomeChartCell { public func update(model: ChartRankingEntity, index: Int) { - + self.model = model albumImageView.kf.setImage( with: URL(string: WMImageAPI.fetchYoutubeThumbnail(id: model.id).toString), placeholder: DesignSystemAsset.Logo.placeHolderSmall.image, @@ -42,37 +53,45 @@ extension HomeChartCell{ let rankAttributedString = NSMutableAttributedString( string: "\(index + 1)", - attributes: [.font: DesignSystemFontFamily.Pretendard.medium.font(size: 16), - .foregroundColor: DesignSystemAsset.GrayColor.gray900.color, - .kern: -0.5] + attributes: [ + .font: DesignSystemFontFamily.Pretendard.medium.font(size: 16), + .foregroundColor: DesignSystemAsset.BlueGrayColor.gray900.color, + .kern: -0.5 + ] ) rankLabel.attributedText = rankAttributedString let songNameAttributedString = NSMutableAttributedString( string: model.title, - attributes: [.font: DesignSystemFontFamily.Pretendard.medium.font(size: 14), - .foregroundColor: DesignSystemAsset.GrayColor.gray900.color, - .kern: -0.5] + attributes: [ + .font: DesignSystemFontFamily.Pretendard.medium.font(size: 14), + .foregroundColor: DesignSystemAsset.BlueGrayColor.gray900.color, + .kern: -0.5 + ] ) songNameLabel.attributedText = songNameAttributedString let artistAttributedString = NSMutableAttributedString( string: model.artist, - attributes: [.font: DesignSystemFontFamily.Pretendard.light.font(size: 12), - .foregroundColor: DesignSystemAsset.GrayColor.gray900.color, - .kern: -0.5] + attributes: [ + .font: DesignSystemFontFamily.Pretendard.light.font(size: 12), + .foregroundColor: DesignSystemAsset.BlueGrayColor.gray900.color, + .kern: -0.5 + ] ) artistLabel.attributedText = artistAttributedString let lastRanking: Int = model.last - (index + 1) rankChangedLabel.text = "\(model.last)" - if model.last == 0 { //NEW + if model.last == 0 { // NEW let rankLabelAttributedString = NSMutableAttributedString( string: "NEW", - attributes: [.font: DesignSystemFontFamily.Pretendard.medium.font(size: 11), - .foregroundColor: DesignSystemAsset.PrimaryColor.new.color, - .kern: -0.5] + attributes: [ + .font: DesignSystemFontFamily.Pretendard.medium.font(size: 11), + .foregroundColor: DesignSystemAsset.PrimaryColor.new.color, + .kern: -0.5 + ] ) rankChangedLabel.attributedText = rankLabelAttributedString rankChangedLabel.isHidden = false @@ -88,29 +107,53 @@ extension HomeChartCell{ rankImageView.isHidden = false rankChangedLabel.isHidden = true - } else if lastRanking > 0 { //UP + } else if lastRanking > 0 { // UP let rankLabelAttributedString = NSMutableAttributedString( string: "\(abs(lastRanking))", - attributes: [.font: DesignSystemFontFamily.Pretendard.medium.font(size: 11), - .foregroundColor: DesignSystemAsset.PrimaryColor.increase.color, - .kern: -0.5] + attributes: [ + .font: DesignSystemFontFamily.Pretendard.medium.font(size: 11), + .foregroundColor: DesignSystemAsset.PrimaryColor.increase.color, + .kern: -0.5 + ] ) rankChangedLabel.attributedText = rankLabelAttributedString rankImageView.image = DesignSystemAsset.Chart.up.image rankImageView.isHidden = false rankChangedLabel.isHidden = false - } else if lastRanking < 0 { //DOWN + } else if lastRanking < 0 { // DOWN let rankLabelAttributedString = NSMutableAttributedString( string: "\(abs(lastRanking))", - attributes: [.font: DesignSystemFontFamily.Pretendard.medium.font(size: 11), - .foregroundColor: DesignSystemAsset.PrimaryColor.decrease.color, - .kern: -0.5] + attributes: [ + .font: DesignSystemFontFamily.Pretendard.medium.font(size: 11), + .foregroundColor: DesignSystemAsset.PrimaryColor.decrease.color, + .kern: -0.5 + ] ) rankChangedLabel.attributedText = rankLabelAttributedString rankImageView.image = DesignSystemAsset.Chart.down.image rankImageView.isHidden = false rankChangedLabel.isHidden = false } - } + } +} + +private extension HomeChartCell { + func bind() { + albumImageView.rx.tapGesture() + .when(.recognized) + .bind { [weak self] _ in + guard let model = self?.model else { return } + self?.delegate?.thumbnailDidTap(model: model) + } + .disposed(by: disposeBag) + + playImageView.rx.tapGesture() + .when(.recognized) + .bind { [weak self] _ in + guard let model = self?.model else { return } + self?.delegate?.playButtonDidTap(model: model) + } + .disposed(by: disposeBag) + } } diff --git a/Projects/Features/HomeFeature/Sources/Views/HomeNewSongCell.swift b/Projects/Features/HomeFeature/Sources/Views/HomeNewSongCell.swift index ae3dd769b..0b290477d 100644 --- a/Projects/Features/HomeFeature/Sources/Views/HomeNewSongCell.swift +++ b/Projects/Features/HomeFeature/Sources/Views/HomeNewSongCell.swift @@ -6,49 +6,63 @@ // Copyright © 2023 yongbeomkwak. All rights reserved. // -import UIKit import DesignSystem -import DomainModule import Kingfisher +import RxGesture +import RxSwift +import SongsDomainInterface +import UIKit import Utility -class HomeNewSongCell: UICollectionViewCell { - +protocol HomeNewSongCellDelegate: AnyObject { + func thumbnailDidTap(model: NewSongsEntity) + func playButtonDidTap(model: NewSongsEntity) +} + +final class HomeNewSongCell: UICollectionViewCell { @IBOutlet weak var albumImageView: UIImageView! @IBOutlet weak var titleStringLabel: UILabel! @IBOutlet weak var artistLabel: UILabel! @IBOutlet weak var playImageView: UIImageView! - + + private var model: NewSongsEntity? + weak var delegate: (any HomeNewSongCellDelegate)? + private let disposeBag = DisposeBag() + override func awakeFromNib() { super.awakeFromNib() - + self.backgroundColor = .clear self.contentView.backgroundColor = .clear - + albumImageView.layer.cornerRadius = 8 albumImageView.clipsToBounds = true albumImageView.contentMode = .scaleAspectFill playImageView.image = DesignSystemAsset.Home.playSmall.image + bind() } } extension HomeNewSongCell { - func update(model: NewSongsEntity) { - + self.model = model let titleAttributedString = NSMutableAttributedString( string: model.title, - attributes: [.font: DesignSystemFontFamily.Pretendard.medium.font(size: 14), - .foregroundColor: DesignSystemAsset.GrayColor.gray900.color, - .kern: -0.5] + attributes: [ + .font: DesignSystemFontFamily.Pretendard.medium.font(size: 14), + .foregroundColor: DesignSystemAsset.BlueGrayColor.gray900.color, + .kern: -0.5 + ] ) titleStringLabel.attributedText = titleAttributedString let artistAttributedString = NSMutableAttributedString( string: model.artist, - attributes: [.font: DesignSystemFontFamily.Pretendard.light.font(size: 12), - .foregroundColor: DesignSystemAsset.GrayColor.gray900.color, - .kern: -0.5] + attributes: [ + .font: DesignSystemFontFamily.Pretendard.light.font(size: 12), + .foregroundColor: DesignSystemAsset.BlueGrayColor.gray900.color, + .kern: -0.5 + ] ) artistLabel.attributedText = artistAttributedString @@ -59,3 +73,23 @@ extension HomeNewSongCell { ) } } + +private extension HomeNewSongCell { + func bind() { + albumImageView.rx.tapGesture() + .when(.recognized) + .bind { [weak self] _ in + guard let newSongEntity = self?.model else { return } + self?.delegate?.thumbnailDidTap(model: newSongEntity) + } + .disposed(by: disposeBag) + + playImageView.rx.tapGesture() + .when(.recognized) + .bind { [weak self] _ in + guard let newSongEntity = self?.model else { return } + self?.delegate?.playButtonDidTap(model: newSongEntity) + } + .disposed(by: disposeBag) + } +} diff --git a/Projects/Features/HomeFeature/Sources/Views/NewSongsCell.swift b/Projects/Features/HomeFeature/Sources/Views/NewSongsCell.swift new file mode 100644 index 000000000..72e8fb9aa --- /dev/null +++ b/Projects/Features/HomeFeature/Sources/Views/NewSongsCell.swift @@ -0,0 +1,60 @@ +import BaseFeature +import DesignSystem +import SongsDomainInterface +import UIKit +import Utility + +protocol NewSongsCellDelegate: AnyObject { + func tappedThumbnail(id: String) +} + +class NewSongsCell: UITableViewCell { + @IBOutlet weak var albumImageView: UIImageView! + @IBOutlet weak var titleStringLabel: UILabel! + @IBOutlet weak var artistLabel: UILabel! + @IBOutlet weak var viewsLabel: UILabel! + + private var model: NewSongsEntity? + weak var delegate: NewSongsCellDelegate? + + override func awakeFromNib() { + super.awakeFromNib() + + contentView.backgroundColor = .clear + albumImageView.clipsToBounds = true + albumImageView.layer.cornerRadius = 4 + albumImageView.contentMode = .scaleAspectFill + } + + @IBAction func playButtonAction(_ sender: Any) { + guard let song = self.model else { return } + delegate?.tappedThumbnail(id: song.id) + } +} + +extension NewSongsCell { + func update(model: NewSongsEntity) { + self.model = model + contentView.backgroundColor = model.isSelected ? DesignSystemAsset.BlueGrayColor.gray200 + .color : DesignSystemAsset.BlueGrayColor.gray100.color + + titleStringLabel.text = model.title + titleStringLabel.textColor = DesignSystemAsset.BlueGrayColor.gray900.color + titleStringLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 14) + titleStringLabel.setTextWithAttributes(kernValue: -0.5) + + artistLabel.text = model.artist + artistLabel.textColor = DesignSystemAsset.BlueGrayColor.gray900.color + artistLabel.font = DesignSystemFontFamily.Pretendard.light.font(size: 12) + artistLabel.setTextWithAttributes(kernValue: -0.5) + + viewsLabel.text = model.views.addCommaToNumber() + "회" + viewsLabel.font = DesignSystemFontFamily.SCoreDream._3Light.font(size: 12) + + albumImageView.kf.setImage( + with: URL(string: WMImageAPI.fetchYoutubeThumbnail(id: model.id).toString), + placeholder: DesignSystemAsset.Logo.placeHolderSmall.image, + options: [.transition(.fade(0.2))] + ) + } +} diff --git a/Projects/Features/HomeFeature/Tests/TargetTests.swift b/Projects/Features/HomeFeature/Tests/TargetTests.swift index b1cf79405..147c29d2f 100644 --- a/Projects/Features/HomeFeature/Tests/TargetTests.swift +++ b/Projects/Features/HomeFeature/Tests/TargetTests.swift @@ -1,7 +1,6 @@ import XCTest class TargetTests: XCTestCase { - override func setUpWithError() throws { // Put setup code here. This method is called before the invocation of each test method in the class. } @@ -13,5 +12,4 @@ class TargetTests: XCTestCase { func testExample() throws { XCTAssertEqual("A", "A") } - } diff --git a/Projects/Features/LyricHighlightingFeature/Demo/Resources/LaunchScreen.storyboard b/Projects/Features/LyricHighlightingFeature/Demo/Resources/LaunchScreen.storyboard new file mode 100644 index 000000000..865e9329f --- /dev/null +++ b/Projects/Features/LyricHighlightingFeature/Demo/Resources/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Projects/Features/LyricHighlightingFeature/Demo/Sources/AppDelegate.swift b/Projects/Features/LyricHighlightingFeature/Demo/Sources/AppDelegate.swift new file mode 100644 index 000000000..ef2bae045 --- /dev/null +++ b/Projects/Features/LyricHighlightingFeature/Demo/Sources/AppDelegate.swift @@ -0,0 +1,19 @@ +import UIKit + +@main +final class AppDelegate: UIResponder, UIApplicationDelegate { + var window: UIWindow? + + func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil + ) -> Bool { + window = UIWindow(frame: UIScreen.main.bounds) + let viewController = UIViewController() + viewController.view.backgroundColor = .yellow + window?.rootViewController = viewController + window?.makeKeyAndVisible() + + return true + } +} diff --git a/Projects/Features/LyricHighlightingFeature/Interface/LyricHighlightingFactory.swift b/Projects/Features/LyricHighlightingFeature/Interface/LyricHighlightingFactory.swift new file mode 100644 index 000000000..70ad81de4 --- /dev/null +++ b/Projects/Features/LyricHighlightingFeature/Interface/LyricHighlightingFactory.swift @@ -0,0 +1,5 @@ +import UIKit + +public protocol LyricHighlightingFactory { + func makeView(model: LyricHighlightingRequiredModel) -> UIViewController +} diff --git a/Projects/Features/LyricHighlightingFeature/Interface/LyricHighlightingRequiredModel.swift b/Projects/Features/LyricHighlightingFeature/Interface/LyricHighlightingRequiredModel.swift new file mode 100644 index 000000000..ca2ba54db --- /dev/null +++ b/Projects/Features/LyricHighlightingFeature/Interface/LyricHighlightingRequiredModel.swift @@ -0,0 +1,21 @@ +import Foundation + +public struct LyricHighlightingRequiredModel { + public let songID: String + public let title: String + public let artist: String + public let highlightingItems: [String] + + /// 가사 하이라이팅 화면에 주입해줘야할 필수 아이템 + public init( + songID: String, // 노래 고유 ID + title: String, // 노래 제목 + artist: String, // 아티스트 이름 + highlightingItems: [String] = [] // 데코레이팅 화면으로 넘어갈 때만 넣으면됩니다. + ) { + self.songID = songID + self.title = title + self.artist = artist + self.highlightingItems = highlightingItems + } +} diff --git a/Projects/Features/LyricHighlightingFeature/Project.swift b/Projects/Features/LyricHighlightingFeature/Project.swift new file mode 100644 index 000000000..801c0420f --- /dev/null +++ b/Projects/Features/LyricHighlightingFeature/Project.swift @@ -0,0 +1,31 @@ +import DependencyPlugin +import ProjectDescription +import ProjectDescriptionHelpers + +let project = Project.module( + name: ModulePaths.Feature.LyricHighlightingFeature.rawValue, + targets: [ + .interface( + module: .feature(.LyricHighlightingFeature) + ), + .implements( + module: .feature(.LyricHighlightingFeature), + dependencies: [ + .feature(target: .BaseFeature), + .feature(target: .LyricHighlightingFeature, type: .interface), + .domain(target: .SongsDomain, type: .interface), + .domain(target: .ImageDomain, type: .interface) + ] + ), + .tests( + module: .feature(.LyricHighlightingFeature), + dependencies: [.feature(target: .LyricHighlightingFeature)] + ), + .demo( + module: .feature(.LyricHighlightingFeature), + dependencies: [ + .feature(target: .LyricHighlightingFeature) + ] + ) + ] +) diff --git a/Projects/Features/LyricHighlightingFeature/Sources/Analytics/LyricHighlightingAnalyticsLog.swift b/Projects/Features/LyricHighlightingFeature/Sources/Analytics/LyricHighlightingAnalyticsLog.swift new file mode 100644 index 000000000..6283f659d --- /dev/null +++ b/Projects/Features/LyricHighlightingFeature/Sources/Analytics/LyricHighlightingAnalyticsLog.swift @@ -0,0 +1,6 @@ +import LogManager + +enum LyricHighlightingAnalyticsLog: AnalyticsLogType { + case viewPage(pageName: String) + case clickLyricDecoratingCompleteButton(type: String, id: String, bg: String) +} diff --git a/Projects/Features/LyricHighlightingFeature/Sources/Components/LyricDecoratingComponent.swift b/Projects/Features/LyricHighlightingFeature/Sources/Components/LyricDecoratingComponent.swift new file mode 100644 index 000000000..3bd9f12aa --- /dev/null +++ b/Projects/Features/LyricHighlightingFeature/Sources/Components/LyricDecoratingComponent.swift @@ -0,0 +1,23 @@ +import BaseFeatureInterface +import Foundation +import ImageDomainInterface +import LyricHighlightingFeatureInterface +import NeedleFoundation + +public protocol LyricDecoratingDependency: Dependency { + var fetchLyricDecoratingBackgroundUseCase: any FetchLyricDecoratingBackgroundUseCase { get } + var textPopupFactory: any TextPopupFactory { get } +} + +public final class LyricDecoratingComponent: Component { + public func makeView(model: LyricHighlightingRequiredModel) -> LyricDecoratingViewController { + let viewModel = LyricDecoratingViewModel( + model: model, + fetchLyricDecoratingBackgroundUseCase: dependency.fetchLyricDecoratingBackgroundUseCase + ) + return LyricDecoratingViewController( + viewModel: viewModel, + textPopupFactory: dependency.textPopupFactory + ) + } +} diff --git a/Projects/Features/LyricHighlightingFeature/Sources/Components/LyricHighlightingComponent.swift b/Projects/Features/LyricHighlightingFeature/Sources/Components/LyricHighlightingComponent.swift new file mode 100644 index 000000000..947fb1a51 --- /dev/null +++ b/Projects/Features/LyricHighlightingFeature/Sources/Components/LyricHighlightingComponent.swift @@ -0,0 +1,21 @@ +import Foundation +import LyricHighlightingFeatureInterface +import NeedleFoundation +import SongsDomainInterface +import UIKit + +public protocol LyricHighlightingDependency: Dependency { + var fetchLyricsUseCase: any FetchLyricsUseCase { get } + var lyricDecoratingComponent: LyricDecoratingComponent { get } + var lyricHighlightingFactory: any LyricHighlightingFactory { get } +} + +public final class LyricHighlightingComponent: Component, LyricHighlightingFactory { + public func makeView(model: LyricHighlightingRequiredModel) -> UIViewController { + let viewModel = LyricHighlightingViewModel(model: model, fetchLyricsUseCase: dependency.fetchLyricsUseCase) + return LyricHighlightingViewController( + viewModel: viewModel, + lyricDecoratingComponent: dependency.lyricDecoratingComponent + ) + } +} diff --git a/Projects/Features/LyricHighlightingFeature/Sources/ViewControllers/LyricDecoratingViewController+Bind.swift b/Projects/Features/LyricHighlightingFeature/Sources/ViewControllers/LyricDecoratingViewController+Bind.swift new file mode 100644 index 000000000..9b4e25371 --- /dev/null +++ b/Projects/Features/LyricHighlightingFeature/Sources/ViewControllers/LyricDecoratingViewController+Bind.swift @@ -0,0 +1,134 @@ +import DesignSystem +import Foundation +import LogManager +import RxCocoa +import RxSwift +import UIKit + +extension LyricDecoratingViewController { + func inputBind() { + input.fetchBackgroundImage.onNext(()) + + collectionView.rx + .setDelegate(self) + .disposed(by: disposeBag) + + collectionView.rx.itemSelected + .do(onNext: { [collectionView] indexPath in + collectionView.scrollToItem( + at: indexPath, + at: .centeredHorizontally, + animated: true + ) + }) + .bind(to: input.didTapBackground) + .disposed(by: disposeBag) + + backButton.rx.tap + .bind(with: self) { owner, _ in + owner.navigationController?.popViewController(animated: true) + } + .disposed(by: disposeBag) + + saveButton.rx.tap + .bind(with: self) { owner, _ in + LogManager.analytics( + LyricHighlightingAnalyticsLog.clickLyricDecoratingCompleteButton( + type: "save", + id: owner.output.updateInfo.value.songID, + bg: owner.output.dataSource.value.filter { $0.isSelected }.first?.name ?? "" + ) + ) + owner.requestPhotoLibraryPermission() + } + .disposed(by: disposeBag) + } + + func outputBind() { + output.updateInfo + .bind(with: self, onNext: { owner, info in + owner.songTitleLabel.text = info.title + owner.songTitleLabel.setTextWithAttributes(kernValue: -0.5, alignment: .center) + owner.artistLabel.text = info.artist + owner.artistLabel.setTextWithAttributes(kernValue: -0.5, alignment: .center) + }) + .disposed(by: disposeBag) + + output.updateDecoratingImage + .filter { !$0.isEmpty } + .map { URL(string: $0) } + .compactMap { $0 } + .bind(with: self) { owner, url in + owner.decorateImageView.kf.setImage( + with: url, + placeholder: nil, + options: [.transition(.fade(0.2))] + ) { result in + switch result { + case .success: + break + case let .failure(error): + owner.showToast(text: "알 수 없는 이유로 배경 이미지 다운로드를 실패했습니다.", options: .empty) + LogManager.printError(error.localizedDescription) + } + } + } + .disposed(by: disposeBag) + + output.dataSource + .skip(1) + .do(onNext: { [indicator, saveButton] source in + indicator.stopAnimating() + saveButton.isEnabled = !source.isEmpty + }) + .bind(to: collectionView.rx.items) { collectionView, index, model in + guard let cell = collectionView.dequeueReusableCell( + withReuseIdentifier: "\(LyricDecoratingCell.self)", + for: IndexPath(item: index, section: 0) + ) as? LyricDecoratingCell else { + return UICollectionViewCell() + } + cell.update(model: model) + return cell + } + .disposed(by: disposeBag) + + output.highlightingItems + .filter { !$0.isEmpty } + .map { lyric in + let style = NSMutableParagraphStyle() + style.alignment = .center + style.lineSpacing = 8 + let attributedString = NSMutableAttributedString( + string: lyric, + attributes: [ + .font: DesignSystemFontFamily.Pretendard.medium.font(size: 18), + .foregroundColor: UIColor.white, + .kern: -0.5, + .paragraphStyle: style + ] + ) + return attributedString + } + .bind(to: highlightingLyricLabel.rx.attributedText) + .disposed(by: disposeBag) + + output.occurredError + .bind(with: self) { owner, message in + owner.showBottomSheet( + content: owner.textPopupFactory.makeView( + text: message, + cancelButtonIsHidden: true, + confirmButtonText: "확인", + cancelButtonText: nil, + completion: { + owner.navigationController?.popViewController(animated: true) + }, + cancelCompletion: nil + ), + dismissOnOverlayTapAndPull: false + ) + } + .disposed(by: disposeBag) + } +} diff --git a/Projects/Features/LyricHighlightingFeature/Sources/ViewControllers/LyricDecoratingViewController.swift b/Projects/Features/LyricHighlightingFeature/Sources/ViewControllers/LyricDecoratingViewController.swift new file mode 100644 index 000000000..59522ffc4 --- /dev/null +++ b/Projects/Features/LyricHighlightingFeature/Sources/ViewControllers/LyricDecoratingViewController.swift @@ -0,0 +1,336 @@ +import BaseFeature +import BaseFeatureInterface +import DesignSystem +import LogManager +import NVActivityIndicatorView +import Photos +import RxCocoa +import RxSwift +import SnapKit +import Then +import UIKit +import Utility + +public final class LyricDecoratingViewController: UIViewController, RequestPermissionable { + private let navigationBarView = UIView() + let backButton = UIButton(type: .system).then { + $0.tintColor = DesignSystemAsset.NewGrayColor.gray900.color + $0.setImage(DesignSystemAsset.Navigation.back.image, for: .normal) + } + + private let navigationTitleLabel = UILabel().then { + $0.text = "내가 선택한 가사" + $0.textColor = DesignSystemAsset.NewGrayColor.gray900.color + $0.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) + $0.setTextWithAttributes(kernValue: -0.5, alignment: .center) + } + + private let decorateContentView = UIView() + let decorateShareContentView = UIView().then { + $0.layer.cornerRadius = 32 + $0.clipsToBounds = true + } + + let decorateImageView = UIImageView().then { + $0.contentMode = .scaleAspectFill + } + + private let decorateLogoImageView = UIImageView().then { + $0.contentMode = .scaleAspectFill + $0.image = DesignSystemAsset.LyricHighlighting.lyricDecoratingWMLogo.image + } + + private let decorateTextContentView = UIView().then { + $0.backgroundColor = .clear + } + + private let decorateFirstStackView = UIStackView().then { + $0.axis = .vertical + $0.spacing = 16 + $0.distribution = .fill + } + + private let decorateQuotationLeftImageView = UIImageView().then { + $0.contentMode = .scaleAspectFit + $0.image = DesignSystemAsset.LyricHighlighting.lyricDecoratingQuotationMarksLeft.image + } + + let highlightingLyricLabel = UILabel().then { + $0.numberOfLines = 0 + } + + private let decorateQuotationRightImageView = UIImageView().then { + $0.contentMode = .scaleAspectFit + $0.image = DesignSystemAsset.LyricHighlighting.lyricDecoratingQuotationMarksRight.image + } + + private let decorateSecondStackView = UIStackView().then { + $0.axis = .vertical + $0.spacing = 0 + $0.distribution = .fill + } + + let songTitleLabel = UILabel().then { + $0.textColor = .white + $0.font = DesignSystemFontFamily.Pretendard.light.font(size: 14) + } + + let artistLabel = UILabel().then { + $0.textColor = .white + $0.font = DesignSystemFontFamily.Pretendard.light.font(size: 14) + } + + private let decoratePickContentView = UIView().then { + $0.backgroundColor = .clear + } + + private let decoratePickShadowImageView = UIImageView().then { + $0.contentMode = .scaleToFill + $0.image = DesignSystemAsset.LyricHighlighting.lyricDecoratingBottomShadow.image + } + + private let descriptionLabel = UILabel().then { + $0.text = "배경을 선택해주세요" + $0.textColor = DesignSystemAsset.BlueGrayColor.blueGray900.color + $0.font = DesignSystemFontFamily.Pretendard.medium.font(size: 14) + $0.setTextWithAttributes(kernValue: -0.5) + } + + private let collectionViewFlowLayout = UICollectionViewFlowLayout().then { + $0.scrollDirection = .horizontal + $0.minimumLineSpacing = 4 + $0.minimumInteritemSpacing = 4 + $0.itemSize = .init(width: 56, height: 64) + $0.sectionInset = .init(top: 0, left: 20, bottom: 0, right: 20) + } + + lazy var collectionView = UICollectionView( + frame: .zero, + collectionViewLayout: collectionViewFlowLayout + ).then { + $0.backgroundColor = .clear + $0.showsHorizontalScrollIndicator = false + } + + let saveButton = UIButton(type: .system).then { + $0.backgroundColor = DesignSystemAsset.PrimaryColorV2.point.color + $0.setTitle("저장하기", for: .normal) + $0.setTitleColor(.white, for: .normal) + $0.titleLabel?.font = UIFont.WMFontSystem.t4(weight: .medium).font + $0.titleLabel?.setTextWithAttributes() + $0.isEnabled = false + $0.layer.cornerRadius = 12 + $0.clipsToBounds = true + } + + let indicator = NVActivityIndicatorView(frame: .zero).then { + $0.type = .circleStrokeSpin + $0.color = DesignSystemAsset.PrimaryColorV2.point.color + } + + private let viewModel: LyricDecoratingViewModel + lazy var input = LyricDecoratingViewModel.Input() + lazy var output = viewModel.transform(from: input) + let textPopupFactory: TextPopupFactory + let disposeBag = DisposeBag() + + deinit { + LogManager.printDebug("❌:: \(Self.self) deinit") + } + + init( + viewModel: LyricDecoratingViewModel, + textPopupFactory: TextPopupFactory + ) { + self.viewModel = viewModel + self.textPopupFactory = textPopupFactory + super.init(nibName: nil, bundle: nil) + } + + @available(*, unavailable) + public required init?(coder: NSCoder) { + fatalError("\(Self.self) has not been implemented") + } + + override public func viewDidLoad() { + super.viewDidLoad() + addSubViews() + setLayout() + configureUI() + outputBind() + inputBind() + } + + override public func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + LogManager.analytics( + LyricHighlightingAnalyticsLog.viewPage(pageName: "lyric_decorating") + ) + } +} + +extension LyricDecoratingViewController: UICollectionViewDelegateFlowLayout { + public func collectionView( + _ collectionView: UICollectionView, + layout collectionViewLayout: UICollectionViewLayout, + sizeForItemAt indexPath: IndexPath + ) -> CGSize { + return .init(width: 56, height: 64) + } +} + +private extension LyricDecoratingViewController { + func addSubViews() { + view.addSubviews( + navigationBarView, + decorateContentView, + decoratePickContentView, + indicator + ) + navigationBarView.addSubviews(backButton, navigationTitleLabel) + + decorateContentView.addSubview(decorateShareContentView) + decorateShareContentView.addSubviews(decorateImageView, decorateLogoImageView, decorateTextContentView) + + decorateTextContentView.addSubview(decorateFirstStackView) + decorateFirstStackView.addArrangedSubview(decorateQuotationLeftImageView) + decorateFirstStackView.addArrangedSubview(highlightingLyricLabel) + decorateFirstStackView.addArrangedSubview(decorateQuotationRightImageView) + + decorateTextContentView.addSubview(decorateSecondStackView) + decorateSecondStackView.addArrangedSubview(songTitleLabel) + decorateSecondStackView.addArrangedSubview(artistLabel) + + decoratePickContentView.addSubviews(decoratePickShadowImageView, descriptionLabel, collectionView, saveButton) + } + + func setLayout() { + navigationBarView.snp.makeConstraints { + $0.top.equalTo(view.safeAreaLayoutGuide) + $0.leading.trailing.equalToSuperview() + $0.height.equalTo(48) + } + + backButton.snp.makeConstraints { + $0.top.bottom.equalToSuperview() + $0.leading.equalToSuperview().offset(20) + $0.width.equalTo(32) + } + + navigationTitleLabel.snp.makeConstraints { + $0.center.equalToSuperview() + } + + decorateContentView.snp.makeConstraints { + $0.top.equalTo(navigationBarView.snp.bottom) + $0.leading.trailing.equalToSuperview() + } + + decorateShareContentView.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview().inset(20) + $0.center.equalToSuperview() + $0.height.equalTo(decorateImageView.snp.width) + } + + decorateImageView.snp.makeConstraints { + $0.edges.equalToSuperview() + } + + decorateLogoImageView.snp.makeConstraints { + $0.top.equalToSuperview().offset(12) + $0.trailing.equalToSuperview().offset(-14) + $0.size.equalTo(32) + } + + decorateTextContentView.snp.makeConstraints { + $0.center.equalToSuperview() + $0.horizontalEdges.equalToSuperview().inset(20) + } + + decorateFirstStackView.snp.makeConstraints { + $0.top.leading.trailing.equalToSuperview() + } + + decorateQuotationLeftImageView.snp.makeConstraints { + $0.height.equalTo(12) + } + + decorateQuotationRightImageView.snp.makeConstraints { + $0.height.equalTo(12) + } + + decorateSecondStackView.snp.makeConstraints { + $0.top.equalTo(decorateFirstStackView.snp.bottom).offset(16) + $0.leading.trailing.bottom.equalToSuperview() + } + + songTitleLabel.snp.makeConstraints { + $0.height.equalTo(22) + } + + artistLabel.snp.makeConstraints { + $0.height.equalTo(22) + } + + decoratePickContentView.snp.makeConstraints { + $0.top.equalTo(decorateContentView.snp.bottom) + $0.horizontalEdges.equalToSuperview() + $0.bottom.equalTo(view.safeAreaLayoutGuide) + } + + decoratePickShadowImageView.snp.makeConstraints { + $0.top.equalToSuperview().offset(-24) + $0.horizontalEdges.equalToSuperview() + $0.bottom.equalTo(view.snp.bottom) + } + + descriptionLabel.snp.makeConstraints { + $0.top.equalTo(decoratePickContentView.snp.top).offset(16) + $0.horizontalEdges.equalToSuperview().inset(20) + $0.height.equalTo(22) + } + + collectionView.snp.makeConstraints { + $0.top.equalTo(descriptionLabel.snp.bottom).offset(12) + $0.leading.trailing.equalToSuperview() + $0.height.equalTo(64) + } + + saveButton.snp.makeConstraints { + $0.top.equalTo(collectionView.snp.bottom).offset(16) + $0.horizontalEdges.equalToSuperview().inset(20) + $0.height.equalTo(56) + } + + indicator.snp.makeConstraints { + $0.center.equalTo(decorateShareContentView.snp.center) + $0.size.equalTo(30) + } + } + + func configureUI() { + navigationController?.setNavigationBarHidden(true, animated: false) + view.backgroundColor = UIColor.white + collectionView.register(LyricDecoratingCell.self, forCellWithReuseIdentifier: "\(LyricDecoratingCell.self)") + indicator.startAnimating() + } +} + +public extension LyricDecoratingViewController { + func showPhotoLibrary() { + let image = decorateShareContentView.asImage(size: .init(width: 960, height: 960)) + PHPhotoLibrary.shared().performChanges { + PHAssetChangeRequest.creationRequestForAsset(from: image) + } completionHandler: { _, error in + var message: String = "" + if let error = error { + message = error.localizedDescription + } else { + message = "해당 이미지가 저장되었습니다." + } + DispatchQueue.main.async { + self.showToast(text: message, options: [.tabBar]) + } + } + } +} diff --git a/Projects/Features/LyricHighlightingFeature/Sources/ViewControllers/LyricHighlightingViewController+Bind.swift b/Projects/Features/LyricHighlightingFeature/Sources/ViewControllers/LyricHighlightingViewController+Bind.swift new file mode 100644 index 000000000..2fe1590a3 --- /dev/null +++ b/Projects/Features/LyricHighlightingFeature/Sources/ViewControllers/LyricHighlightingViewController+Bind.swift @@ -0,0 +1,95 @@ +import DesignSystem +import Foundation +import LogManager +import LyricHighlightingFeatureInterface +import UIKit + +extension LyricHighlightingViewController { + func inputBind() { + input.fetchLyric.onNext(()) + + activateButton.rx.tap + .do(onNext: { [activateContentView] _ in + UIView.animate(withDuration: 0.2) { + activateContentView.isHidden = true + } + }) + .map { _ in true } + .bind(to: input.didTapActivateButton) + .disposed(by: disposeBag) + + collectionView.rx.itemSelected + .bind(to: input.didTapHighlighting) + .disposed(by: disposeBag) + + backButton.rx.tap + .bind(with: self) { owner, _ in + owner.navigationController?.popViewController(animated: true) + } + .disposed(by: disposeBag) + + completeButton.rx.tap + .bind(to: input.didTapSaveButton) + .disposed(by: disposeBag) + } + + func outputBind() { + output.updateInfo + .bind(with: self, onNext: { owner, info in + owner.songLabel.text = info.title + owner.songLabel.setTextWithAttributes(kernValue: -0.5, alignment: .center) + owner.artistLabel.text = info.artist + owner.artistLabel.setTextWithAttributes(kernValue: -0.5, alignment: .center) + }) + .disposed(by: disposeBag) + + output.updateProvider + .bind(to: writerLabel.rx.text) + .disposed(by: disposeBag) + + output.dataSource + .skip(1) + .do(onNext: { [activityIndicator, warningView, collectionView, bottomContentStackView] model in + activityIndicator.stopAnimating() + warningView.isHidden = !model.isEmpty + collectionView.isHidden = model.isEmpty + bottomContentStackView.isHidden = model.isEmpty + }) + .bind(to: collectionView.rx.items) { collectionView, index, entity in + guard let cell = collectionView.dequeueReusableCell( + withReuseIdentifier: "\(LyricHighlightingCell.self)", + for: IndexPath(item: index, section: 0) + ) as? LyricHighlightingCell else { + return UICollectionViewCell() + } + cell.update(entity: entity) + return cell + } + .disposed(by: disposeBag) + + output.isStorable + .bind(with: self) { owner, isStorable in + UIView.animate(withDuration: 0.2) { + owner.completeButton.alpha = isStorable ? 1 : 0 + } + } + .disposed(by: disposeBag) + + output.goDecoratingScene + .bind(with: self) { owner, model in + let viewController = owner.lyricDecoratingComponent.makeView(model: model) + owner.navigationController?.pushViewController(viewController, animated: true) + } + .disposed(by: disposeBag) + + output.showToast + .bind(with: self) { owner, message in + owner.showToast( + text: message, + options: [.tabBar], + backgroundThema: .light + ) + } + .disposed(by: disposeBag) + } +} diff --git a/Projects/Features/LyricHighlightingFeature/Sources/ViewControllers/LyricHighlightingViewController.swift b/Projects/Features/LyricHighlightingFeature/Sources/ViewControllers/LyricHighlightingViewController.swift new file mode 100644 index 000000000..7ee2609d0 --- /dev/null +++ b/Projects/Features/LyricHighlightingFeature/Sources/ViewControllers/LyricHighlightingViewController.swift @@ -0,0 +1,336 @@ +import DesignSystem +import Kingfisher +import LogManager +import NVActivityIndicatorView +import RxCocoa +import RxSwift +import UIKit +import Utility + +public final class LyricHighlightingViewController: UIViewController { + private let navigationBarView = UIView() + + let backButton = UIButton(type: .system).then { + $0.tintColor = .white + $0.setImage(DesignSystemAsset.Navigation.back.image, for: .normal) + } + + private let thumbnailImageView = UIImageView().then { + $0.contentMode = .scaleAspectFill + $0.clipsToBounds = true + } + + private let dimmedBackgroundView = UIView() + + private let navigationTitleStackView = UIStackView().then { + $0.axis = .vertical + $0.spacing = 0 + } + + let songLabel = WMFlowLabel( + textColor: DesignSystemAsset.BlueGrayColor.gray25.color, + font: .t5(weight: .medium), + alignment: .center, + kernValue: -0.5 + ) + + let artistLabel = WMFlowLabel( + textColor: DesignSystemAsset.BlueGrayColor.gray100.color.withAlphaComponent(0.6), + font: .t6(weight: .medium), + alignment: .center, + kernValue: -0.5 + ) + + lazy var collectionView = UICollectionView( + frame: .zero, + collectionViewLayout: createLayout() + ).then { + $0.backgroundColor = .clear + } + + let bottomContentStackView = UIStackView().then { + $0.axis = .vertical + $0.distribution = .fill + $0.isHidden = true + } + + let writerContentView = UIView() + + let writerLabel = WMLabel( + text: "", + textColor: .white.withAlphaComponent(0.5), + font: .t6(weight: .light), + alignment: .center, + kernValue: -0.5 + ) + + let activateContentView = UIView() + + let activateTopLineLabel = UILabel().then { + $0.backgroundColor = DesignSystemAsset.NewGrayColor.gray700.color + } + + let activateButton = UIButton(type: .system).then { + $0.setImage( + DesignSystemAsset.LyricHighlighting.lyricHighlightSaveOff.image.withRenderingMode(.alwaysOriginal), + for: .normal + ) + } + + let warningView = UIView().then { + $0.isHidden = true + } + + let warningImageView = UIImageView().then { + $0.contentMode = .scaleAspectFit + $0.image = DesignSystemAsset.LyricHighlighting.errorDark.image + } + + let warningLabel = WMLabel( + text: "노래 가사가 없습니다.", + textColor: DesignSystemAsset.BlueGrayColor.blueGray200.color, + font: .t6(weight: .light), + alignment: .center, + lineHeight: UIFont.WMFontSystem.t6(weight: .light).lineHeight + ).then { + $0.numberOfLines = 0 + $0.preferredMaxLayoutWidth = APP_WIDTH() - 40 + } + + let completeButton = UIButton().then { + $0.layer.borderColor = DesignSystemAsset.PrimaryColorV2.point.color.cgColor + $0.layer.borderWidth = 1 + $0.layer.cornerRadius = 4 + $0.clipsToBounds = true + $0.setTitle("완료", for: .normal) + $0.setTitleColor(DesignSystemAsset.PrimaryColorV2.point.color, for: .normal) + $0.titleLabel?.font = DesignSystemFontFamily.Pretendard.bold.font(size: 12) + $0.titleLabel?.setTextWithAttributes(alignment: .center) + $0.alpha = 0 + } + + let activityIndicator = NVActivityIndicatorView(frame: .zero).then { + $0.type = .circleStrokeSpin + $0.color = DesignSystemAsset.PrimaryColorV2.point.color + } + + private var dimmedLayer: DimmedGradientLayer? + var lyricDecoratingComponent: LyricDecoratingComponent + + private var viewModel: LyricHighlightingViewModel + lazy var input = LyricHighlightingViewModel.Input() + lazy var output = viewModel.transform(from: input) + let disposeBag = DisposeBag() + + deinit { + LogManager.printDebug("❌:: \(Self.self) deinit") + } + + public init( + viewModel: LyricHighlightingViewModel, + lyricDecoratingComponent: LyricDecoratingComponent + ) { + self.viewModel = viewModel + self.lyricDecoratingComponent = lyricDecoratingComponent + super.init(nibName: nil, bundle: nil) + } + + @available(*, unavailable) + public required init?(coder: NSCoder) { + fatalError("\(Self.self) has not been implemented") + } + + override public func viewDidLoad() { + super.viewDidLoad() + addSubViews() + setLayout() + configureUI() + outputBind() + inputBind() + } + + override public func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + LogManager.analytics( + LyricHighlightingAnalyticsLog.viewPage(pageName: "lyric_highlighting") + ) + } + + override public func viewDidLayoutSubviews() { + super.viewDidLayoutSubviews() + if dimmedLayer == nil { + let dimmedLayer = DimmedGradientLayer(frame: dimmedBackgroundView.bounds) + self.dimmedLayer = dimmedLayer + dimmedBackgroundView.layer.addSublayer(dimmedLayer) + } + } +} + +private extension LyricHighlightingViewController { + func addSubViews() { + view.addSubviews( + thumbnailImageView, + dimmedBackgroundView, + collectionView, + bottomContentStackView, + warningView, + navigationBarView, + activityIndicator + ) + + navigationBarView.addSubviews(backButton, navigationTitleStackView, completeButton) + navigationTitleStackView.addArrangedSubview(songLabel) + navigationTitleStackView.addArrangedSubview(artistLabel) + + bottomContentStackView.addArrangedSubviews(writerContentView, activateContentView) + writerContentView.addSubview(writerLabel) + activateContentView.addSubviews(activateTopLineLabel, activateButton) + warningView.addSubviews(warningImageView, warningLabel) + } + + func setLayout() { + navigationBarView.snp.makeConstraints { + $0.top.equalTo(view.safeAreaLayoutGuide) + $0.leading.trailing.equalToSuperview() + $0.height.equalTo(48) + } + + backButton.snp.makeConstraints { + $0.top.bottom.equalToSuperview() + $0.leading.equalToSuperview().offset(20) + $0.width.equalTo(32) + } + + completeButton.snp.makeConstraints { + $0.width.equalTo(45) + $0.height.equalTo(24) + $0.centerY.equalToSuperview() + $0.trailing.equalToSuperview().offset(-20) + } + + navigationTitleStackView.snp.makeConstraints { + $0.leading.equalTo(backButton.snp.trailing).offset(10 + 13) + $0.trailing.equalTo(completeButton.snp.leading).offset(-10) + $0.centerY.equalToSuperview() + } + + songLabel.snp.makeConstraints { + $0.height.equalTo(24) + } + + artistLabel.snp.makeConstraints { + $0.height.equalTo(20) + } + + thumbnailImageView.snp.makeConstraints { + $0.edges.equalToSuperview() + } + + dimmedBackgroundView.snp.makeConstraints { + $0.edges.equalToSuperview() + } + + collectionView.snp.makeConstraints { + $0.top.equalTo(navigationBarView.snp.bottom) + $0.horizontalEdges.equalToSuperview() + } + + bottomContentStackView.snp.makeConstraints { + $0.top.equalTo(collectionView.snp.bottom).offset(19) + $0.horizontalEdges.equalToSuperview() + $0.bottom.equalTo(view.safeAreaLayoutGuide) + } + + writerContentView.snp.makeConstraints { + $0.height.equalTo(51) + } + + writerLabel.snp.makeConstraints { + $0.top.equalToSuperview() + $0.horizontalEdges.equalToSuperview().inset(20) + $0.height.equalTo(22) + } + + activateContentView.snp.makeConstraints { + $0.height.equalTo(56) + } + + activateTopLineLabel.snp.makeConstraints { + $0.top.equalToSuperview() + $0.horizontalEdges.equalToSuperview() + $0.height.equalTo(1) + } + + activateButton.snp.makeConstraints { + $0.edges.equalToSuperview() + } + + warningView.snp.makeConstraints { + $0.top.equalToSuperview().offset(APP_HEIGHT() * ((294.0 - 6.0) / 812.0)) + $0.centerX.equalToSuperview() + } + + warningImageView.snp.makeConstraints { + $0.top.equalToSuperview() + $0.horizontalEdges.equalToSuperview() + $0.centerX.equalToSuperview() + } + + warningLabel.snp.makeConstraints { + $0.top.equalTo(warningImageView.snp.bottom).offset(-2) + $0.horizontalEdges.equalToSuperview() + $0.bottom.equalToSuperview() + } + + activityIndicator.snp.makeConstraints { + $0.center.equalTo(warningView.snp.center) + $0.size.equalTo(30) + } + } + + func configureUI() { + navigationController?.setNavigationBarHidden(true, animated: false) + view.backgroundColor = .white + collectionView.register(LyricHighlightingCell.self, forCellWithReuseIdentifier: "\(LyricHighlightingCell.self)") + + let alternativeSources = [ + WMImageAPI.fetchYoutubeThumbnail(id: output.updateInfo.value.songID).toURL + ].compactMap { $0 } + .map { Source.network($0) } + thumbnailImageView.kf.setImage( + with: URL(string: WMImageAPI.fetchYoutubeThumbnailHD(id: output.updateInfo.value.songID).toString), + options: [ + .waitForCache, + .transition(.fade(0.2)), + .forceTransition, + .processor( + DownsamplingImageProcessor( + size: .init(width: 10, height: 10) + ) + ), + .alternativeSources(alternativeSources) + ] + ) + activityIndicator.startAnimating() + } + + func createLayout() -> UICollectionViewLayout { + let sectionProvider = { ( + sectionIndex: Int, + layoutEnvironment: NSCollectionLayoutEnvironment + ) -> NSCollectionLayoutSection? in + var config = UICollectionLayoutListConfiguration(appearance: .plain) + config.showsSeparators = false + config.backgroundColor = .clear + + let section = NSCollectionLayoutSection.list( + using: config, + layoutEnvironment: layoutEnvironment + ) + section.contentInsets = NSDirectionalEdgeInsets(top: 16, leading: 0, bottom: 28, trailing: 0) + + return section + } + return UICollectionViewCompositionalLayout(sectionProvider: sectionProvider) + } +} diff --git a/Projects/Features/LyricHighlightingFeature/Sources/ViewModels/LyricDecoratingViewModel.swift b/Projects/Features/LyricHighlightingFeature/Sources/ViewModels/LyricDecoratingViewModel.swift new file mode 100644 index 000000000..4bf47c808 --- /dev/null +++ b/Projects/Features/LyricHighlightingFeature/Sources/ViewModels/LyricDecoratingViewModel.swift @@ -0,0 +1,98 @@ +import BaseFeature +import Foundation +import ImageDomainInterface +import LogManager +import LyricHighlightingFeatureInterface +import RxRelay +import RxSwift +import SongsDomainInterface +import UIKit +import Utility + +final class LyricDecoratingViewModel: ViewModelType { + private let model: LyricHighlightingRequiredModel + private let fetchLyricDecoratingBackgroundUseCase: FetchLyricDecoratingBackgroundUseCase + private let disposeBag = DisposeBag() + + deinit { + LogManager.printDebug("❌:: \(Self.self) deinit") + } + + public init( + model: LyricHighlightingRequiredModel, + fetchLyricDecoratingBackgroundUseCase: any FetchLyricDecoratingBackgroundUseCase + ) { + self.model = model + self.fetchLyricDecoratingBackgroundUseCase = fetchLyricDecoratingBackgroundUseCase + } + + public struct Input { + let fetchBackgroundImage: PublishSubject = PublishSubject() + let didTapBackground: PublishSubject = PublishSubject() + } + + public struct Output { + let dataSource: BehaviorRelay<[LyricDecoratingBackgroundEntity]> = BehaviorRelay(value: []) + let highlightingItems: BehaviorRelay = BehaviorRelay(value: "") + let updateInfo: BehaviorRelay = BehaviorRelay(value: .init( + songID: "", + title: "", + artist: "" + )) + let updateDecoratingImage: BehaviorRelay = BehaviorRelay(value: "") + let occurredError: PublishSubject = PublishSubject() + } + + public func transform(from input: Input) -> Output { + let output = Output() + + input.fetchBackgroundImage + .flatMap { [fetchLyricDecoratingBackgroundUseCase] _ -> Observable<[LyricDecoratingBackgroundEntity]> in + return fetchLyricDecoratingBackgroundUseCase.execute() + .asObservable() + .catchAndReturn([]) + } + .do(onNext: { entities in + guard !entities.isEmpty else { + output.occurredError.onNext("서버에서 문제가 발생하였습니다.\n잠시 후 다시 시도해주세요!") + return + } + output.updateDecoratingImage.accept(entities[0].url) + }) + .map { entities in + guard !entities.isEmpty else { return entities } + var newEntities = entities + newEntities[0].isSelected = true + return newEntities + } + .bind(to: output.dataSource) + .disposed(by: disposeBag) + + output.highlightingItems + .accept(model.highlightingItems.joined(separator: "\n")) + output.updateInfo.accept( + .init( + songID: model.songID, title: model.title, artist: model.artist + ) + ) + + input.didTapBackground + .map { $0.item } + .withLatestFrom(output.dataSource) { ($0, $1) } + .do(onNext: { index, entities in + output.updateDecoratingImage.accept(entities[index].url) + }) + .map { index, entities in + var newEntities = entities + if let i = entities.firstIndex(where: { $0.isSelected }) { + newEntities[i].isSelected = false + } + newEntities[index].isSelected = true + return newEntities + } + .bind(to: output.dataSource) + .disposed(by: disposeBag) + + return output + } +} diff --git a/Projects/Features/LyricHighlightingFeature/Sources/ViewModels/LyricHighlightingViewModel.swift b/Projects/Features/LyricHighlightingFeature/Sources/ViewModels/LyricHighlightingViewModel.swift new file mode 100644 index 000000000..a23e71a48 --- /dev/null +++ b/Projects/Features/LyricHighlightingFeature/Sources/ViewModels/LyricHighlightingViewModel.swift @@ -0,0 +1,116 @@ +import BaseFeature +import Foundation +import LogManager +import LyricHighlightingFeatureInterface +import RxRelay +import RxSwift +import SongsDomainInterface +import Utility + +public final class LyricHighlightingViewModel: ViewModelType { + private let model: LyricHighlightingRequiredModel + private let fetchLyricsUseCase: FetchLyricsUseCase + private let disposeBag = DisposeBag() + + deinit { + LogManager.printDebug("❌:: \(Self.self) deinit") + } + + public init( + model: LyricHighlightingRequiredModel, + fetchLyricsUseCase: any FetchLyricsUseCase + ) { + self.model = model + self.fetchLyricsUseCase = fetchLyricsUseCase + } + + public struct Input { + let fetchLyric: PublishSubject = PublishSubject() + let didTapActivateButton: BehaviorRelay = BehaviorRelay(value: false) + let didTapHighlighting: BehaviorRelay = BehaviorRelay(value: .init(row: -1, section: 0)) + let didTapSaveButton: PublishSubject = PublishSubject() + } + + public struct Output { + let dataSource: BehaviorRelay<[LyricsEntity.Lyric]> = BehaviorRelay(value: []) + let isStorable: BehaviorRelay = BehaviorRelay(value: false) + let goDecoratingScene: PublishSubject = PublishSubject() + let updateInfo: BehaviorRelay = BehaviorRelay(value: .init( + songID: "", + title: "", + artist: "" + )) + let updateProvider: PublishSubject = .init() + let showToast: PublishSubject = .init() + } + + public func transform(from input: Input) -> Output { + let output = Output() + let songID: String = self.model.songID + + input.fetchLyric + .flatMap { [fetchLyricsUseCase] _ -> Observable in + return fetchLyricsUseCase.execute(id: songID) + .asObservable() + .catchAndReturn(.init(provider: "", lyrics: [])) + .do(onNext: { entity in + output.updateProvider.onNext(entity.lyrics.isEmpty ? "" : "자막 제공 : \(entity.provider)") + }) + } + .map { $0.lyrics } + .bind(to: output.dataSource) + .disposed(by: disposeBag) + + input.didTapHighlighting + .withLatestFrom(input.didTapActivateButton) { ($0, $1) } + .filter { $0.1 } + .map { $0.0.item } + .filter { $0 >= 0 } + .withLatestFrom(output.dataSource) { ($0, $1) } + .filter { index, entities in + let currentTotalLineCount: Int = entities.filter { $0.isHighlighting } + .map { $0.text.components(separatedBy: "\n").count } + .reduce(0, +) + let nowSelectItemLineCount: Int = entities[index].text + .components(separatedBy: "\n").count + guard entities[index].isHighlighting || (currentTotalLineCount + nowSelectItemLineCount <= 4) else { + output.showToast.onNext("가사는 최대 4줄까지 선택 가능합니다.") + return false + } + return true + } + .map { index, entities in + var newEntities = entities + newEntities[index].isHighlighting = !entities[index].isHighlighting + return newEntities + } + .bind(to: output.dataSource) + .disposed(by: disposeBag) + + input.didTapSaveButton + .withLatestFrom(output.dataSource) + .filter { !$0.filter { $0.isHighlighting }.isEmpty } + .map { $0.filter { $0.isHighlighting }.map { $0.text } } + .map { LyricHighlightingRequiredModel( + songID: songID, + title: output.updateInfo.value.title, + artist: output.updateInfo.value.artist, + highlightingItems: $0 + ) } + .bind(to: output.goDecoratingScene) + .disposed(by: disposeBag) + + output.updateInfo.accept( + .init( + songID: model.songID, title: model.title, artist: model.artist + ) + ) + + output.dataSource + .map { !$0.filter { $0.isHighlighting }.isEmpty } + .bind(to: output.isStorable) + .disposed(by: disposeBag) + + return output + } +} diff --git a/Projects/Features/LyricHighlightingFeature/Sources/Views/LyricDecoratingCell.swift b/Projects/Features/LyricHighlightingFeature/Sources/Views/LyricDecoratingCell.swift new file mode 100644 index 000000000..695371a81 --- /dev/null +++ b/Projects/Features/LyricHighlightingFeature/Sources/Views/LyricDecoratingCell.swift @@ -0,0 +1,90 @@ +import DesignSystem +import ImageDomainInterface +import SnapKit +import Then +import UIKit + +final class LyricDecoratingCell: UICollectionViewCell { + private let decoImageView = UIImageView().then { + $0.clipsToBounds = true + } + + private let checkBoxContentView = UIView().then { + $0.backgroundColor = DesignSystemAsset.BlueGrayColor.blueGray900.color.withAlphaComponent(0.4) + } + + private let checkBoxImageView = UIImageView().then { + $0.image = DesignSystemAsset.LyricHighlighting.lyricDecoratingCheckBox.image + } + + private let descriptionContentView = UIView().then { + $0.backgroundColor = DesignSystemAsset.BlueGrayColor.blueGray900.color.withAlphaComponent(0.4) + } + + private let descriptionLabel = UILabel().then { + $0.font = DesignSystemFontFamily.Pretendard.light.font(size: 11) + $0.textColor = .white + } + + override init(frame: CGRect) { + super.init(frame: frame) + addSubViews() + setLayout() + layer.cornerRadius = 4 + clipsToBounds = true + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override public func prepareForReuse() { + super.prepareForReuse() + } +} + +extension LyricDecoratingCell { + func update(model: LyricDecoratingBackgroundEntity) { + descriptionLabel.text = model.name + descriptionLabel.setTextWithAttributes(kernValue: -0.5, alignment: .center) + checkBoxContentView.isHidden = !model.isSelected + decoImageView.kf.setImage( + with: URL(string: model.url), + placeholder: nil, + options: [.transition(.fade(0.2))] + ) + } +} + +private extension LyricDecoratingCell { + func addSubViews() { + contentView.addSubviews(decoImageView, checkBoxContentView, descriptionContentView) + checkBoxContentView.addSubview(checkBoxImageView) + descriptionContentView.addSubview(descriptionLabel) + } + + func setLayout() { + decoImageView.snp.makeConstraints { + $0.edges.equalToSuperview() + } + checkBoxContentView.snp.makeConstraints { + $0.top.leading.trailing.equalToSuperview() + $0.height.equalTo(44) + } + checkBoxImageView.snp.makeConstraints { + $0.size.equalTo(32) + $0.top.equalToSuperview().offset(8) + $0.centerX.equalToSuperview() + } + descriptionContentView.snp.makeConstraints { + $0.leading.trailing.bottom.equalToSuperview() + $0.height.equalTo(20) + } + descriptionLabel.snp.makeConstraints { + $0.top.equalToSuperview().offset(2) + $0.leading.trailing.equalToSuperview() + $0.height.equalTo(16) + } + } +} diff --git a/Projects/Features/LyricHighlightingFeature/Sources/Views/LyricHighlightingCell.swift b/Projects/Features/LyricHighlightingFeature/Sources/Views/LyricHighlightingCell.swift new file mode 100644 index 000000000..8305bc005 --- /dev/null +++ b/Projects/Features/LyricHighlightingFeature/Sources/Views/LyricHighlightingCell.swift @@ -0,0 +1,67 @@ +import DesignSystem +import SnapKit +import SongsDomainInterface +import Then +import UIKit +import Utility + +final class LyricHighlightingCell: UICollectionViewCell { + private let lyricLabel = WMLabel( + text: "", + textColor: .white, + font: .t4(weight: .light), + alignment: .center, + lineHeight: UIFont.WMFontSystem.t4().lineHeight, + kernValue: -0.5 + ).then { + $0.numberOfLines = 0 + } + + override init(frame: CGRect) { + super.init(frame: frame) + addSubViews() + setLayout() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +extension LyricHighlightingCell { + func update(entity: LyricsEntity.Lyric) { + lyricLabel.text = entity.text + lyricLabel.setBackgroundColorForAttributedString( + color: entity.isHighlighting ? + DesignSystemAsset.PrimaryColorV2.point.color.withAlphaComponent(0.5) : .clear + ) + } +} + +private extension LyricHighlightingCell { + func addSubViews() { + contentView.addSubview(lyricLabel) + } + + func setLayout() { + lyricLabel.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview().inset(25) + $0.verticalEdges.equalToSuperview() + } + } +} + +private extension UILabel { + func setBackgroundColorForAttributedString(color: UIColor) { + guard let attributedText = self.attributedText else { return } + let mutableAttributedText = NSMutableAttributedString(attributedString: attributedText) + + mutableAttributedText.addAttribute( + .backgroundColor, + value: color, + range: NSRange(location: 0, length: attributedText.length) + ) + self.attributedText = mutableAttributedText + } +} diff --git a/Projects/Features/LyricHighlightingFeature/Tests/LyricHighlightingFeatureTests.swift b/Projects/Features/LyricHighlightingFeature/Tests/LyricHighlightingFeatureTests.swift new file mode 100644 index 000000000..9400c4d1b --- /dev/null +++ b/Projects/Features/LyricHighlightingFeature/Tests/LyricHighlightingFeatureTests.swift @@ -0,0 +1,11 @@ +import XCTest + +final class LyricHighlightingFeatureTests: XCTestCase { + override func setUpWithError() throws {} + + override func tearDownWithError() throws {} + + func testExample() { + XCTAssertEqual(1, 1) + } +} diff --git a/Projects/Features/MainTabFeature/.swiftlint.yml b/Projects/Features/MainTabFeature/.swiftlint.yml deleted file mode 100644 index 3293002b1..000000000 --- a/Projects/Features/MainTabFeature/.swiftlint.yml +++ /dev/null @@ -1,20 +0,0 @@ -excluded: - - "**/*/NeedleGenerated.swift" - - "Tuist" - - -force_cast: # From https://realm.github.io/SwiftLint/force_cast.html - warning # 강제 캐스팅은 error에서 warning으로 변경 - -disabled_rules: - - trailing_whitespace - - vertical_whitespace - - colon - - comma - - comment_spacing # 주석 여백 - - mark # //MARK 관련 warning - - opening_brace # 괄호 열 때 줄바꿈을 했는지 안했는지, (안했으면 warning) - - line_length # 한줄에 글자 수 제한 , warning: 120, error: 200 (default) - - statement_position # if는 반드시 else로 끝나야한다. - - identifier_name #변수명 글자 수 제한 - - function_parameter_count #함수 파라미터 갯수 제한 diff --git a/Projects/Features/MainTabFeature/Project.swift b/Projects/Features/MainTabFeature/Project.swift index 8c12f411a..d7436fa6d 100644 --- a/Projects/Features/MainTabFeature/Project.swift +++ b/Projects/Features/MainTabFeature/Project.swift @@ -1,17 +1,32 @@ +import DependencyPlugin import ProjectDescription import ProjectDescriptionHelpers -let project = Project.makeModule( - name: "MainTabFeature", - product: .staticFramework, - dependencies: [ - .Project.Features.BaseFeature, - .Project.Features.HomeFeature, - .Project.Features.ChartFeature, - .Project.Features.SearchFeature, - .Project.Features.ArtistFeature, - .Project.Features.StorageFeature, - .Project.Features.PlayerFeature, +let project = Project.module( + name: ModulePaths.Feature.MainTabFeature.rawValue, + targets: [ + .implements( + module: .feature(.MainTabFeature), + product: .staticFramework, + spec: .init( + resources: ["Resources/**"], + dependencies: [ + .feature(target: .BaseFeature), + .feature(target: .HomeFeature), + .feature(target: .ChartFeature), + .feature(target: .SearchFeature), + .feature(target: .ArtistFeature), + .feature(target: .StorageFeature), + .feature(target: .MyInfoFeature), + .feature(target: .PlaylistFeature, type: .interface), + .feature(target: .MusicDetailFeature, type: .interface), + .feature(target: .LyricHighlightingFeature), + .feature(target: .FruitDrawFeature), + .feature(target: .TeamFeature), + .domain(target: .NoticeDomain, type: .interface), + .domain(target: .NotificationDomain, type: .interface) + ] + ) + ) ] - , resources: ["Resources/**"] ) diff --git a/Projects/Features/MainTabFeature/Resources/Main.storyboard b/Projects/Features/MainTabFeature/Resources/Main.storyboard index 598499698..c3abe8188 100644 --- a/Projects/Features/MainTabFeature/Resources/Main.storyboard +++ b/Projects/Features/MainTabFeature/Resources/Main.storyboard @@ -1,11 +1,12 @@ - + - + + @@ -21,56 +22,28 @@ - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - @@ -162,10 +135,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Projects/Features/MainTabFeature/Sources/Analytics/MainTabAnalyticsLog.swift b/Projects/Features/MainTabFeature/Sources/Analytics/MainTabAnalyticsLog.swift new file mode 100644 index 000000000..2c042b394 --- /dev/null +++ b/Projects/Features/MainTabFeature/Sources/Analytics/MainTabAnalyticsLog.swift @@ -0,0 +1,14 @@ +import LogManager + +enum MainTabAnalyticsLog: AnalyticsLogType { + enum TabbarTab: String, CaseIterable, AnalyticsLogEnumParametable { + case home + case search + case artist + case storage + case mypage + } + + case clickTabbarTab(tab: TabbarTab) + case clickPlaylistFabButton +} diff --git a/Projects/Features/MainTabFeature/Sources/Analytics/NoticePopupAnalyticsLog.swift b/Projects/Features/MainTabFeature/Sources/Analytics/NoticePopupAnalyticsLog.swift new file mode 100644 index 000000000..d7e0f33fa --- /dev/null +++ b/Projects/Features/MainTabFeature/Sources/Analytics/NoticePopupAnalyticsLog.swift @@ -0,0 +1,5 @@ +import LogManager + +enum NoticePopupAnalyticsLog: AnalyticsLogType { + case clickNoticeItem(id: String, location: String = "notice_popup") +} diff --git a/Projects/Features/MainTabFeature/Sources/AppEntryState/AppEntryState.swift b/Projects/Features/MainTabFeature/Sources/AppEntryState/AppEntryState.swift new file mode 100644 index 000000000..8db55cd2d --- /dev/null +++ b/Projects/Features/MainTabFeature/Sources/AppEntryState/AppEntryState.swift @@ -0,0 +1,21 @@ +import Foundation +import RxRelay + +public protocol AppEntryStateHandleable { + var moveSceneObservable: BehaviorRelay<[String: Any]> { get } + func moveScene(params: [String: Any]) +} + +public final class AppEntryState: AppEntryStateHandleable { + private let moveSceneRelay: BehaviorRelay<[String: Any]> = .init(value: [:]) + + public var moveSceneObservable: BehaviorRelay<[String: Any]> { + return moveSceneRelay + } + + public func moveScene(params: [String: Any]) { + moveSceneRelay.accept(params) + } + + public init() {} +} diff --git a/Projects/Features/MainTabFeature/Sources/Components/BottomTabBarComponent.swift b/Projects/Features/MainTabFeature/Sources/Components/BottomTabBarComponent.swift index d52416d14..df7336485 100644 --- a/Projects/Features/MainTabFeature/Sources/Components/BottomTabBarComponent.swift +++ b/Projects/Features/MainTabFeature/Sources/Components/BottomTabBarComponent.swift @@ -1,9 +1,7 @@ import Foundation import NeedleFoundation -public protocol BottomTabBarDependency: Dependency { - -} +public protocol BottomTabBarDependency: Dependency {} public final class BottomTabBarComponent: Component { public func makeView() -> BottomTabBarViewController { diff --git a/Projects/Features/MainTabFeature/Sources/Components/MainContainerComponent.swift b/Projects/Features/MainTabFeature/Sources/Components/MainContainerComponent.swift index c12d7f3f7..b74fd80d2 100644 --- a/Projects/Features/MainTabFeature/Sources/Components/MainContainerComponent.swift +++ b/Projects/Features/MainTabFeature/Sources/Components/MainContainerComponent.swift @@ -1,12 +1,14 @@ +import BaseFeature import Foundation -import UIKit -import PlayerFeature import NeedleFoundation +import PlaylistFeatureInterface +import UIKit public protocol MainContainerDependency: Dependency { var bottomTabBarComponent: BottomTabBarComponent { get } var mainTabBarComponent: MainTabBarComponent { get } - var playerComponent: PlayerComponent { get } + var playlistFactory: any PlaylistFactory { get } + var playlistPresenterGlobalState: any PlayListPresenterGlobalStateProtocol { get } } public final class MainContainerComponent: Component { @@ -15,7 +17,8 @@ public final class MainContainerComponent: Component { .viewController( bottomTabBarComponent: self.dependency.bottomTabBarComponent, mainTabBarComponent: self.dependency.mainTabBarComponent, - playerComponent: self.dependency.playerComponent + playlistFactory: self.dependency.playlistFactory, + playlistPresenterGlobalState: self.dependency.playlistPresenterGlobalState ) } } diff --git a/Projects/Features/MainTabFeature/Sources/Components/MainTabBarComponent.swift b/Projects/Features/MainTabFeature/Sources/Components/MainTabBarComponent.swift index 95e81185c..8b50be05e 100644 --- a/Projects/Features/MainTabFeature/Sources/Components/MainTabBarComponent.swift +++ b/Projects/Features/MainTabFeature/Sources/Components/MainTabBarComponent.swift @@ -1,39 +1,55 @@ +import ArtistFeatureInterface +import BaseFeature import Foundation -import HomeFeature -import StorageFeature -import SearchFeature -import ArtistFeature -import ChartFeature -import CommonFeature +import HomeFeatureInterface +import MusicDetailFeatureInterface +import MyInfoFeatureInterface import NeedleFoundation -import DomainModule +import NoticeDomainInterface +import NotificationDomainInterface +import PlaylistFeatureInterface +import SearchFeatureInterface +import SongsDomainInterface +import StorageFeatureInterface public protocol MainTabBarDependency: Dependency { - var fetchNoticeUseCase: any FetchNoticeUseCase {get} - var homeComponent: HomeComponent { get } - var chartComponent: ChartComponent { get } - var searchComponent: SearchComponent { get } - var artistComponent: ArtistComponent { get } - var storageComponent: StorageComponent { get } + var fetchNoticePopupUseCase: any FetchNoticePopupUseCase { get } + var fetchNoticeIDListUseCase: any FetchNoticeIDListUseCase { get } + var updateNotificationTokenUseCase: any UpdateNotificationTokenUseCase { get } + var fetchSongUseCase: any FetchSongUseCase { get } + var appEntryState: any AppEntryStateHandleable { get } + var homeFactory: any HomeFactory { get } + var searchFactory: any SearchFactory { get } + var artistFactory: any ArtistFactory { get } + var storageFactory: any StorageFactory { get } + var myInfoFactory: any MyInfoFactory { get } var noticePopupComponent: NoticePopupComponent { get } - var noticeComponent: NoticeComponent { get } - var noticeDetailComponent: NoticeDetailComponent { get } + var noticeDetailFactory: any NoticeDetailFactory { get } + var playlistDetailFactory: any PlaylistDetailFactory { get } + var musicDetailFactory: any MusicDetailFactory { get } + var songDetailPresenter: any SongDetailPresentable { get } } public final class MainTabBarComponent: Component { public func makeView() -> MainTabBarViewController { return MainTabBarViewController.viewController( viewModel: MainTabBarViewModel.init( - fetchNoticeUseCase: self.dependency.fetchNoticeUseCase + fetchNoticePopupUseCase: dependency.fetchNoticePopupUseCase, + fetchNoticeIDListUseCase: dependency.fetchNoticeIDListUseCase, + updateNotificationTokenUseCase: dependency.updateNotificationTokenUseCase, + fetchSongUseCase: dependency.fetchSongUseCase ), - homeComponent: self.dependency.homeComponent, - chartComponent: self.dependency.chartComponent, - searchComponent: self.dependency.searchComponent, - artistComponent: self.dependency.artistComponent, - storageCompoent: self.dependency.storageComponent, - noticePopupComponent: self.dependency.noticePopupComponent, - noticeComponent: self.dependency.noticeComponent, - noticeDetailComponent: self.dependency.noticeDetailComponent + appEntryState: dependency.appEntryState, + homeFactory: dependency.homeFactory, + searchFactory: dependency.searchFactory, + artistFactory: dependency.artistFactory, + storageFactory: dependency.storageFactory, + myInfoFactory: dependency.myInfoFactory, + noticePopupComponent: dependency.noticePopupComponent, + noticeDetailFactory: dependency.noticeDetailFactory, + playlistDetailFactory: dependency.playlistDetailFactory, + musicDetailFactory: dependency.musicDetailFactory, + songDetailPresenter: dependency.songDetailPresenter ) } } diff --git a/Projects/Features/MainTabFeature/Sources/Components/NoticePopupComponent.swift b/Projects/Features/MainTabFeature/Sources/Components/NoticePopupComponent.swift new file mode 100644 index 000000000..5835ccc4b --- /dev/null +++ b/Projects/Features/MainTabFeature/Sources/Components/NoticePopupComponent.swift @@ -0,0 +1,21 @@ +// +// NoticePopupComponent.swift +// CommonFeature +// +// Created by KTH on 2023/04/08. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import Foundation +import NeedleFoundation +import NoticeDomainInterface + +public protocol NoticePopupDependency: Dependency {} + +public final class NoticePopupComponent: Component { + public func makeView(model: [FetchNoticeEntity]) -> NoticePopupViewController { + return NoticePopupViewController.viewController( + viewModel: .init(noticeEntities: model) + ) + } +} diff --git a/Projects/Features/MainTabFeature/Sources/ViewControllers/BottomTabBarViewController.swift b/Projects/Features/MainTabFeature/Sources/ViewControllers/BottomTabBarViewController.swift index 34b42a373..afc97c8fa 100644 --- a/Projects/Features/MainTabFeature/Sources/ViewControllers/BottomTabBarViewController.swift +++ b/Projects/Features/MainTabFeature/Sources/ViewControllers/BottomTabBarViewController.swift @@ -1,66 +1,73 @@ -// -// BottomTabBarViewController.swift -// MainTabFeature -// -// Created by KTH on 2023/01/14. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import Utility import DesignSystem +import LogManager import RxSwift +import UIKit +import Utility protocol BottomTabBarViewDelegate: AnyObject { func handleTapped(index previous: Int, current: Int) func equalHandleTapped(index current: Int) } -public class BottomTabBarViewController: UIViewController, ViewControllerFromStoryBoard { +public final class BottomTabBarViewController: UIViewController, ViewControllerFromStoryBoard { @IBOutlet weak var stackView: UIStackView! - - var currentIndex = Utility.PreferenceManager.startPage ?? 0 + + private var currentIndex = Utility.PreferenceManager.startPage ?? 0 weak var delegate: BottomTabBarViewDelegate? private lazy var tabs: [TabItemView] = { var items = [TabItemView]() - for _ in 0..<5 { + for _ in 0 ..< 5 { items.append(TabItemView.newInstance) } return items }() - + private lazy var tabItems: [TabItem] = { return [ - TabItem(title: "홈", - offImage: DesignSystemAsset.TabBar.homeOff.image, - onImage: DesignSystemAsset.TabBar.homeOn.image, - animateImage: "Home_Tab"), - TabItem(title: "차트", - offImage: DesignSystemAsset.TabBar.chartOff.image, - onImage: DesignSystemAsset.TabBar.chartOn.image, - animateImage: "Chart_Tab"), - TabItem(title: "검색", - offImage: DesignSystemAsset.TabBar.searchOff.image, - onImage: DesignSystemAsset.TabBar.searchOn.image, - animateImage: "Search_Tab"), - TabItem(title: "아티스트", - offImage: DesignSystemAsset.TabBar.artistOff.image, - onImage: DesignSystemAsset.TabBar.artistOn.image, - animateImage: "Artist_Tab"), - TabItem(title: "보관함", - offImage: DesignSystemAsset.TabBar.storageOff.image, - onImage: DesignSystemAsset.TabBar.storageOn.image, - animateImage: "Storage_Tab") + TabItem( + title: "홈", + offImage: DesignSystemAsset.TabBar.homeOff.image, + onImage: DesignSystemAsset.TabBar.homeOn.image, + animateImage: "Home_Tab", + analyticsTabbarType: .home + ), + TabItem( + title: "검색", + offImage: DesignSystemAsset.TabBar.searchOff.image, + onImage: DesignSystemAsset.TabBar.searchOn.image, + animateImage: "Search_Tab", + analyticsTabbarType: .search + ), + TabItem( + title: "아티스트", + offImage: DesignSystemAsset.TabBar.artistOff.image, + onImage: DesignSystemAsset.TabBar.artistOn.image, + animateImage: "Artist_Tab", + analyticsTabbarType: .artist + ), + TabItem( + title: "보관함", + offImage: DesignSystemAsset.TabBar.storageOff.image, + onImage: DesignSystemAsset.TabBar.storageOn.image, + animateImage: "Storage_Tab", + analyticsTabbarType: .storage + ), + TabItem( + title: "내정보", + offImage: DesignSystemAsset.TabBar.myinfoOff.image, + onImage: DesignSystemAsset.TabBar.myinfoOn.image, + animateImage: "MyInfo_Tab", + analyticsTabbarType: .mypage + ) ] }() - - var disposeBag = DisposeBag() - public override func viewDidLoad() { + private let disposeBag = DisposeBag() + + override public func viewDidLoad() { super.viewDidLoad() configureUI() - bindNotification() } public static func viewController() -> BottomTabBarViewController { @@ -69,10 +76,10 @@ public class BottomTabBarViewController: UIViewController, ViewControllerFromSto } } -extension BottomTabBarViewController { - private func configureUI() { +private extension BottomTabBarViewController { + func configureUI() { let startPage: Int = Utility.PreferenceManager.startPage ?? 0 - DEBUG_LOG("startPage: \(startPage)") + LogManager.printDebug("startPage: \(startPage)") for (index, model) in self.tabItems.enumerated() { let tabView = self.tabs[index] @@ -82,20 +89,6 @@ extension BottomTabBarViewController { self.stackView.addArrangedSubview(tabView) } } - - private func bindNotification() { - NotificationCenter.default.rx - .notification(.movedTab) - .subscribe(onNext: { [weak self] (notification) in - guard - let `self` = self, - let index = notification.object as? Int, - self.tabs.count > index - else { return } - - self.handleTap(view: self.tabs[index]) - }).disposed(by: disposeBag) - } } extension BottomTabBarViewController: TabItemViewDelegate { @@ -104,17 +97,17 @@ extension BottomTabBarViewController: TabItemViewDelegate { self.delegate?.equalHandleTapped(index: self.currentIndex) return } - - //previous selected + + // previous selected let previousIndex = self.currentIndex self.tabs[self.currentIndex].isSelected = false - - //current select + + // current select view.isSelected = true let newIndex = self.tabs.firstIndex(where: { $0 === view }) ?? 0 self.currentIndex = newIndex - //delegate + // delegate self.delegate?.handleTapped(index: previousIndex, current: newIndex) } } diff --git a/Projects/Features/MainTabFeature/Sources/ViewControllers/MainContainerViewController.swift b/Projects/Features/MainTabFeature/Sources/ViewControllers/MainContainerViewController.swift index cca66d6d5..11a0b654f 100644 --- a/Projects/Features/MainTabFeature/Sources/ViewControllers/MainContainerViewController.swift +++ b/Projects/Features/MainTabFeature/Sources/ViewControllers/MainContainerViewController.swift @@ -1,160 +1,73 @@ -import UIKit -import Utility -import DesignSystem +import ArtistFeature import BaseFeature -import PlayerFeature -import SnapKit +import Combine +import DesignSystem +import LogManager +import PlaylistFeatureInterface import RxSwift -import DomainModule -import CommonFeature -import ArtistFeature +import SnapKit +import SongsDomainInterface +import UIKit +import Utility open class MainContainerViewController: BaseViewController, ViewControllerFromStoryBoard { - @IBOutlet weak var containerView: UIView! - @IBOutlet weak var containerViewBottomConstraint: NSLayoutConstraint! @IBOutlet weak var bottomContainerView: UIView! - @IBOutlet weak var bottomContainerViewHeight: NSLayoutConstraint! - @IBOutlet weak var bottomContainerViewBottomConstraint: NSLayoutConstraint! - @IBOutlet weak var panelView: UIView! - @IBOutlet weak var panelViewTopConstraint: NSLayoutConstraint! - @IBOutlet weak var panelViewHeightConstraint: NSLayoutConstraint! - @IBOutlet weak var safeAreaBottomView: UIView! - @IBOutlet weak var safeAreaBottomViewHeightConstraint: NSLayoutConstraint! - - var originalPanelAlpha: CGFloat = 0 - var originalPanelPosition: CGFloat = 0 - var lastPoint: CGPoint = .zero - var originalTabBarPosition: CGFloat = 0 + private let playlistFloatingActionButton = PlayListFloatingActionButton() var bottomTabBarComponent: BottomTabBarComponent! var mainTabBarComponent: MainTabBarComponent! - var playerComponent: PlayerComponent! + var playlistFactory: PlaylistFactory! + var playlistPresenterGlobalState: PlayListPresenterGlobalStateProtocol! - lazy var panGestureRecognizer: UIPanGestureRecognizer = { - let gesture = UIPanGestureRecognizer(target: self, - action: #selector(panGesture(_:))) - self.panelView.addGestureRecognizer(gesture) - return gesture - }() var isDarkContentBackground: Bool = false - var playerMode: PlayerMode = .mini { - didSet{ - DEBUG_LOG("playerMode: \(playerMode)") - PlayState.shared.playerMode = playerMode - } - } - var disposeBag = DisposeBag() - - open override func viewDidLoad() { - super.viewDidLoad() + private let disposeBag = DisposeBag() + private var subscription = Set() + override open func viewDidLoad() { + super.viewDidLoad() + setLayout() configureUI() - configurePlayer() bindNotification() + bind() } - - open override var preferredStatusBarStyle: UIStatusBarStyle { + + override open var preferredStatusBarStyle: UIStatusBarStyle { return isDarkContentBackground ? .lightContent : .default } public static func viewController( bottomTabBarComponent: BottomTabBarComponent, mainTabBarComponent: MainTabBarComponent, - playerComponent: PlayerComponent + playlistFactory: PlaylistFactory, + playlistPresenterGlobalState: PlayListPresenterGlobalStateProtocol ) -> MainContainerViewController { let viewController = MainContainerViewController.viewController(storyBoardName: "Main", bundle: Bundle.module) - viewController.bottomTabBarComponent = bottomTabBarComponent viewController.mainTabBarComponent = mainTabBarComponent - viewController.playerComponent = playerComponent - + viewController.playlistFactory = playlistFactory + viewController.playlistPresenterGlobalState = playlistPresenterGlobalState return viewController } } -extension MainContainerViewController { - - @objc - func panGesture(_ gestureRecognizer: UIPanGestureRecognizer) { - - let point = gestureRecognizer.location(in: self.view) - let direction = gestureRecognizer.direction(in: self.view) -// let velocity = gestureRecognizer.velocity(in: self.view) - - let window: UIWindow? = UIApplication.shared.windows.first - let safeAreaInsetsTop: CGFloat = window?.safeAreaInsets.top ?? 0 - let safeAreaInsetsBottom: CGFloat = window?.safeAreaInsets.bottom ?? 0 - var statusBarHeight: CGFloat = window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0 - - if safeAreaInsetsTop > statusBarHeight { - statusBarHeight = safeAreaInsetsTop - } - - let screenHeight = APP_HEIGHT() - safeAreaInsetsBottom - var centerRatio = (-panelViewTopConstraint.constant + originalPanelPosition) / - (screenHeight + originalPanelPosition) - - switch gestureRecognizer.state { - - case .began: - return - - case .changed: - let yDelta = point.y - lastPoint.y - - var newConstant = panelViewTopConstraint.constant + yDelta - newConstant = newConstant > originalPanelPosition ? originalPanelPosition : newConstant - newConstant = newConstant < -screenHeight ? -screenHeight : newConstant - - self.panelViewTopConstraint.constant = newConstant - self.bottomContainerViewBottomConstraint.constant = centerRatio * -self.originalTabBarPosition - - updatePlayerViewController(value: Float(centerRatio)) - - case .ended: - let standard: CGFloat = direction.contains(.Down) ? 1.0 : direction.contains(.Up) ? 0.0 : 0.5 - - //플레이어 확장 여부 - let expanded: Bool = (centerRatio < standard) ? false : true - - self.panelViewTopConstraint.constant = (expanded) ? -screenHeight : self.originalPanelPosition - self.bottomContainerView.isHidden = (expanded) ? true : false - self.playerMode = expanded ? .full : .mini - - UIView.animate(withDuration: 0.35, - delay: 0.0, - usingSpringWithDamping: 0.8, - initialSpringVelocity: 0.8, - options: [.curveEaseInOut], - animations: { - - self.bottomContainerViewBottomConstraint.constant = (expanded) ? -self.originalTabBarPosition : 0 - self.view.layoutIfNeeded() - - }, completion: { _ in - - }) - - centerRatio = (-panelViewTopConstraint.constant + originalPanelPosition) / (screenHeight + originalPanelPosition) - updatePlayerViewController(value: Float(centerRatio)) - - default: - return - } - - self.lastPoint = point - } - - private func updatePlayerViewController(value: Float) { - if let playerViewController: PlayerViewController = self.children.last as? PlayerViewController { - playerViewController.updateOpacity(value: value) +private extension MainContainerViewController { + func setLayout() { + view.addSubview(playlistFloatingActionButton) + + let startPage: Int = PreferenceManager.startPage ?? 0 + let bottomOffset: CGFloat = startPage == 3 ? + PlaylistFloatingButtonPosition.top.bottomOffset : + PlaylistFloatingButtonPosition.default.bottomOffset + playlistFloatingActionButton.snp.makeConstraints { + $0.trailing.equalToSuperview().inset(20) + $0.bottom.equalTo(bottomContainerView.snp.top).offset(bottomOffset) + $0.size.equalTo(56) } } - - private func configureUI() { - //Main Content + func configureUI() { + // Main Content let viewController = mainTabBarComponent.makeView().wrapNavigationController self.addChild(viewController) self.containerView.addSubview(viewController.view) @@ -163,235 +76,139 @@ extension MainContainerViewController { viewController.view.snp.makeConstraints { $0.edges.equalTo(containerView) } - - //Bottom TabBar + + // Bottom TabBar let bottomTabBar = bottomTabBarComponent.makeView() self.addChild(bottomTabBar) self.bottomContainerView.addSubview(bottomTabBar.view) - + bottomTabBar.didMove(toParent: self) bottomTabBar.delegate = self bottomTabBar.view.snp.makeConstraints { $0.edges.equalTo(bottomContainerView) } - - //Base UI - _ = panGestureRecognizer - - self.originalTabBarPosition = self.bottomContainerViewHeight.constant //56 - self.originalPanelPosition = self.panelViewTopConstraint.constant // -56 - self.originalPanelAlpha = self.panelView.alpha - - self.panelView.isHidden = false - self.panelView.backgroundColor = .clear - - self.safeAreaBottomView.backgroundColor = UIColor.white - self.safeAreaBottomViewHeightConstraint.constant = SAFEAREA_BOTTOM_HEIGHT() - self.view.layoutIfNeeded() - } - - private func configurePlayer() { - let vc = playerComponent.makeView() - self.addChild(vc) - panelView.addSubview(vc.view) - vc.didMove(toParent: self) - - vc.view.snp.makeConstraints { - $0.edges.equalTo(panelView) - } - - //미니 플레이어 상태: 0 - mini, 1 - full - updatePlayerViewController(value: Float(0)) - - //DB 조회 후 미니 플레이어 초기 상태 결정 - let allPlayedLists = RealmManager.shared.realm.objects(PlayedLists.self) - self.playerMode = allPlayedLists.isEmpty ? .close : .mini - updatePlayerMode(with: self.playerMode, animate: false) } } extension MainContainerViewController: BottomTabBarViewDelegate { func handleTapped(index previous: Int, current: Int) { guard let navigationController = self.children.first as? UINavigationController, - let mainTabBarViewController = navigationController.viewControllers.first as? MainTabBarViewController else { return } + let mainTabBarViewController = navigationController.viewControllers.first as? MainTabBarViewController + else { return } mainTabBarViewController.updateContent(previous: previous, current: current) } - + func equalHandleTapped(index current: Int) { guard let navigationController = self.children.first as? UINavigationController, - let mainTabBarViewController = navigationController.viewControllers.first as? MainTabBarViewController else { return } + let mainTabBarViewController = navigationController.viewControllers.first as? MainTabBarViewController + else { return } mainTabBarViewController.equalHandleTapped(for: current) } } -public extension MainContainerViewController { - - func updatePlayerMode(with mode: PlayerMode, animate: Bool) { - switch mode { - case .full, .mini: - expandPlayer(expanded: mode == .full, animate: animate) - case .close: - closePlayer(animate: animate) +private extension MainContainerViewController { + func bind() { + let playlistButtonAction = UIAction { [navigationController, playlistFactory] _ in + LogManager.analytics(MainTabAnalyticsLog.clickPlaylistFabButton) + guard let playlistFactory else { return } + let playlistViewController = playlistFactory.makeViewController() + playlistViewController.modalPresentationStyle = .overFullScreen + navigationController?.topViewController?.present(playlistViewController, animated: true) } - } - - // 플레이어 확장, 축소 - private func expandPlayer(expanded: Bool, animate: Bool) { - let screenHeight = APP_HEIGHT() - SAFEAREA_BOTTOM_HEIGHT() - self.panelViewTopConstraint.constant = expanded ? -screenHeight : self.originalPanelPosition - self.bottomContainerView.isHidden = expanded ? true : false - - UIView.animate(withDuration: animate ? 0.5 : 0, - delay: 0.0, - usingSpringWithDamping: 0.8, - initialSpringVelocity: 0.8, - options: [.curveEaseInOut], - animations: { + playlistFloatingActionButton.isHidden = PlayState.shared.isEmpty + playlistFloatingActionButton.addAction( + playlistButtonAction, + for: .primaryActionTriggered + ) + + playlistPresenterGlobalState.presentPlayListObservable + .bind { [navigationController, playlistFactory] currentSongID in + guard let playlistFactory else { return } + let playlistViewController = if let currentSongID { + playlistFactory.makeViewController(currentSongID: currentSongID) + } else { + playlistFactory.makeViewController() + } + playlistViewController.modalPresentationStyle = .overFullScreen + navigationController?.topViewController?.present(playlistViewController, animated: true) + } + .disposed(by: disposeBag) - self.bottomContainerViewBottomConstraint.constant = expanded ? -self.originalTabBarPosition : 0 - self.view.layoutIfNeeded() - - }, completion: { _ in - }) - - updatePlayerViewController(value: expanded ? Float(1) : Float(0)) - } - - // 플레이어 닫기 - private func closePlayer(animate: Bool) { - UIView.animate(withDuration: animate ? 0.5 : 0, - delay: 0.0, - usingSpringWithDamping: 0.8, - initialSpringVelocity: 0.8, - options: [.curveEaseInOut], - animations: { - - self.panelViewTopConstraint.constant = 0 - self.view.layoutIfNeeded() - - }, completion: { _ in - }) + PlayState.shared.listChangedPublisher + .map(\.isEmpty) + .assign(to: \.isHidden, on: playlistFloatingActionButton) + .store(in: &subscription) } - - // 플레이어 생성 (현재 미사용, 추후에는 쓸지도..?) - private func makePlayer(songs: [SongEntity], expanded: Bool = false) { - let vc = playerComponent.makeView() - self.addChild(vc) - panelView.addSubview(vc.view) - vc.didMove(toParent: self) - panelView.isHidden = false - - vc.view.snp.makeConstraints { - $0.edges.equalTo(panelView) - } - - let screenHeight = APP_HEIGHT() - SAFEAREA_BOTTOM_HEIGHT() - self.panelViewTopConstraint.constant = expanded ? -screenHeight : self.originalPanelPosition - self.bottomContainerView.isHidden = expanded ? true : false - - UIView.animate(withDuration: 0.5, - delay: 0.0, - usingSpringWithDamping: 0.8, - initialSpringVelocity: 0.8, - options: [.curveEaseInOut], - animations: { - self.bottomContainerViewBottomConstraint.constant = expanded ? -self.originalTabBarPosition : 0 - self.view.layoutIfNeeded() - - }, completion: { _ in - }) - - //미니플레이어 상태는 0, 풀스크린이면 1 - updatePlayerViewController(value: expanded ? Float(1) : Float(0)) - } - - // 플레이어 삭제 (현재 미사용, 추후에는 쓸지도..?) - private func removePlayer() { - guard let playerViewController = self.children.last as? PlayerViewController else { - DEBUG_LOG("❌ Player Load Failed") - return - } - - playerViewController.willMove(toParent: nil) - playerViewController.view.removeFromSuperview() - playerViewController.removeFromParent() - - self.panelView.subviews.forEach { $0.removeFromSuperview() } - self.panelView.isHidden = true - DEBUG_LOG("❌ Player Closed") - } -} - -extension MainContainerViewController { - private func bindNotification() { - NotificationCenter.default.rx - .notification(.updatePlayerMode) - .debug("updatePlayerMode") - .subscribe(onNext: { [weak self] (notification) in - guard let mode = notification.object as? PlayerMode else { return } - self?.playerMode = mode - self?.updatePlayerMode(with: mode, animate: true) - }).disposed(by: disposeBag) - + func bindNotification() { NotificationCenter.default.rx - .notification(.statusBarEnterDarkBackground) + .notification(.willStatusBarEnterDarkBackground) .subscribe(onNext: { [weak self] _ in self?.statusBarEnterDarkBackground() - }).disposed(by: disposeBag) - + }) + .disposed(by: disposeBag) + NotificationCenter.default.rx - .notification(.statusBarEnterLightBackground) + .notification(.willStatusBarEnterLightBackground) .subscribe(onNext: { [weak self] _ in self?.statusBarEnterLightBackground() - }).disposed(by: disposeBag) - + }) + .disposed(by: disposeBag) + NotificationCenter.default.rx - .notification(.showSongCart) - .subscribe(onNext: { [weak self] _ in - guard let self = self else { return } + .notification(.shouldHidePlaylistFloatingButton) + .subscribe(onNext: { [playlistFloatingActionButton] _ in UIView.animate(withDuration: 0.2) { - self.panelView.alpha = 0 + playlistFloatingActionButton.alpha = 0 } - }).disposed(by: disposeBag) - + }) + .disposed(by: disposeBag) + NotificationCenter.default.rx - .notification(.hideSongCart) - .subscribe(onNext: { [weak self] _ in - guard let self = self else { return } + .notification(.shouldShowPlaylistFloatingButton) + .subscribe(onNext: { [playlistFloatingActionButton] _ in UIView.animate(withDuration: 0.2) { - self.panelView.alpha = 1 - } - }).disposed(by: disposeBag) - - NotificationCenter.default.rx - .notification(UIApplication.didBecomeActiveNotification) - .subscribe(onNext: { _ in - PlayState.shared.checkForPlayerState { (state) in - switch state { - case .idle: - DEBUG_LOG("🚀:: Player State ➡️ [idle]") - case .ready: - DEBUG_LOG("🚀:: Player State ➡️ [ready]") - case let .error(error): - DEBUG_LOG("🚀:: Player State ➡️ [error] \(error.localizedDescription)") - PlayState.shared.resetPlayer() - } + playlistFloatingActionButton.alpha = 1 } }) .disposed(by: disposeBag) + + Observable.combineLatest( + PreferenceManager.$startPage.map { $0 ?? 0 }, + NotificationCenter.default.rx + .notification(.shouldMovePlaylistFloatingButton) + .map { $0.object as? PlaylistFloatingButtonPosition ?? .default } + ) { startPage, pos -> (Int, PlaylistFloatingButtonPosition) in + return (startPage, pos) + } + .bind(with: self, onNext: { owner, params in + let (startPage, pos) = params + var bottomOffset: CGFloat + switch startPage { + case 3: + bottomOffset = pos.bottomOffset + default: + bottomOffset = PlaylistFloatingButtonPosition.default.bottomOffset + } + owner.playlistFloatingActionButton.snp.updateConstraints { + $0.trailing.equalToSuperview().inset(20) + $0.bottom.equalTo(owner.bottomContainerView.snp.top).offset(bottomOffset) + $0.size.equalTo(56) + } + }) + .disposed(by: disposeBag) } } -extension MainContainerViewController { - private func statusBarEnterLightBackground() { +private extension MainContainerViewController { + func statusBarEnterLightBackground() { isDarkContentBackground = false UIView.animate(withDuration: 0.15) { self.setNeedsStatusBarAppearanceUpdate() } } - private func statusBarEnterDarkBackground() { + func statusBarEnterDarkBackground() { isDarkContentBackground = true UIView.animate(withDuration: 0.15) { self.setNeedsStatusBarAppearanceUpdate() diff --git a/Projects/Features/MainTabFeature/Sources/ViewControllers/MainTabBarViewController.swift b/Projects/Features/MainTabFeature/Sources/ViewControllers/MainTabBarViewController.swift index 365c35360..84ddb57c1 100644 --- a/Projects/Features/MainTabFeature/Sources/ViewControllers/MainTabBarViewController.swift +++ b/Projects/Features/MainTabFeature/Sources/ViewControllers/MainTabBarViewController.swift @@ -1,156 +1,313 @@ -// -// MainTabBarViewController.swift -// MainTabFeature -// -// Created by KTH on 2023/01/13. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import Utility -import DesignSystem -import SnapKit +import ArtistFeatureInterface import BaseFeature -import HomeFeature -import SearchFeature -import ArtistFeature -import ChartFeature -import StorageFeature -import CommonFeature -import RxSwift +import DesignSystem +import ErrorModule +import FirebaseMessaging +import HomeFeatureInterface +import LogManager +import MusicDetailFeatureInterface +import MyInfoFeatureInterface +import NoticeDomainInterface +import PlaylistFeatureInterface import RxCocoa -import DomainModule +import RxSwift +import SafariServices +import SearchFeatureInterface +import SnapKit +import StorageFeatureInterface +import UIKit +import Utility public final class MainTabBarViewController: BaseViewController, ViewControllerFromStoryBoard, ContainerViewType { + @IBOutlet public weak var contentView: UIView! - @IBOutlet weak public var contentView: UIView! - + private var previousIndex: Int? + private var selectedIndex: Int = Utility.PreferenceManager.startPage ?? 0 private lazy var viewControllers: [UIViewController] = { return [ - homeComponent.makeView().wrapNavigationController, - chartComponent.makeView().wrapNavigationController, - searchComponent.makeView().wrapNavigationController, - artistComponent.makeView().wrapNavigationController, - storageComponent.makeView().wrapNavigationController + homeFactory.makeView().wrapNavigationController, + searchFactory.makeView().wrapNavigationController, + artistFactory.makeView().wrapNavigationController, + storageFactory.makeView().wrapNavigationController, + myInfoFactory.makeView().wrapNavigationController ] }() - var viewModel: MainTabBarViewModel! - private var previousIndex: Int? - private var selectedIndex: Int = Utility.PreferenceManager.startPage ?? 0 - private var disposeBag: DisposeBag = DisposeBag() - - private var homeComponent: HomeComponent! - private var chartComponent: ChartComponent! - private var searchComponent: SearchComponent! - private var artistComponent: ArtistComponent! - private var storageComponent: StorageComponent! + private var viewModel: MainTabBarViewModel! + private lazy var input = MainTabBarViewModel.Input() + private lazy var output = viewModel.transform(from: input) + private let disposeBag: DisposeBag = DisposeBag() + + private var appEntryState: AppEntryStateHandleable! + private var homeFactory: HomeFactory! + private var searchFactory: SearchFactory! + private var artistFactory: ArtistFactory! + private var storageFactory: StorageFactory! + private var myInfoFactory: MyInfoFactory! private var noticePopupComponent: NoticePopupComponent! - private var noticeComponent: NoticeComponent! - private var noticeDetailComponent: NoticeDetailComponent! - - public override func viewDidLoad() { + private var noticeDetailFactory: NoticeDetailFactory! + private var playlistDetailFactory: PlaylistDetailFactory! + private var musicDetailFactory: MusicDetailFactory! + private var songDetailPresenter: SongDetailPresentable! + + override public func viewDidLoad() { super.viewDidLoad() configureUI() - bind() + requestNotificationAuthorization() + outputBind() + inputBind() + entryBind() } - - public override func viewDidAppear(_ animated: Bool) { + + override public func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) navigationController?.interactivePopGestureRecognizer?.delegate = self } - public override func viewDidDisappear(_ animated: Bool) { + override public func viewDidDisappear(_ animated: Bool) { super.viewDidDisappear(animated) navigationController?.interactivePopGestureRecognizer?.delegate = nil } public static func viewController( viewModel: MainTabBarViewModel, - homeComponent: HomeComponent, - chartComponent: ChartComponent, - searchComponent: SearchComponent, - artistComponent: ArtistComponent, - storageCompoent: StorageComponent, + appEntryState: AppEntryStateHandleable, + homeFactory: HomeFactory, + searchFactory: SearchFactory, + artistFactory: ArtistFactory, + storageFactory: StorageFactory, + myInfoFactory: MyInfoFactory, noticePopupComponent: NoticePopupComponent, - noticeComponent: NoticeComponent, - noticeDetailComponent: NoticeDetailComponent + noticeDetailFactory: NoticeDetailFactory, + playlistDetailFactory: PlaylistDetailFactory, + musicDetailFactory: MusicDetailFactory, + songDetailPresenter: SongDetailPresentable ) -> MainTabBarViewController { let viewController = MainTabBarViewController.viewController(storyBoardName: "Main", bundle: Bundle.module) viewController.viewModel = viewModel - viewController.homeComponent = homeComponent - viewController.chartComponent = chartComponent - viewController.searchComponent = searchComponent - viewController.artistComponent = artistComponent - viewController.storageComponent = storageCompoent + viewController.appEntryState = appEntryState + viewController.homeFactory = homeFactory + viewController.searchFactory = searchFactory + viewController.artistFactory = artistFactory + viewController.storageFactory = storageFactory + viewController.myInfoFactory = myInfoFactory viewController.noticePopupComponent = noticePopupComponent - viewController.noticeComponent = noticeComponent - viewController.noticeDetailComponent = noticeDetailComponent + viewController.noticeDetailFactory = noticeDetailFactory + viewController.playlistDetailFactory = playlistDetailFactory + viewController.musicDetailFactory = musicDetailFactory + viewController.songDetailPresenter = songDetailPresenter return viewController } } -extension MainTabBarViewController { - private func bind() { - viewModel.output - .dataSource +private extension MainTabBarViewController { + func entryBind() { + appEntryState.moveSceneObservable + .debug("🚚:: moveSceneObservable") + .filter { !$0.isEmpty } + .delay(.milliseconds(500), scheduler: MainScheduler.instance) + .bind(with: self, onNext: { owner, params in + owner.moveScene(params: params) + }) + .disposed(by: disposeBag) + + songDetailPresenter.presentSongDetailObservable + .filter { !$0.selectedID.isEmpty } + .bind(with: self, onNext: { owner, selection in + let viewController = owner.musicDetailFactory.makeViewController( + songIDs: selection.ids, + selectedID: selection.selectedID + ) + viewController.modalPresentationStyle = .overFullScreen + + if let presentedViewController = self.presentedViewController { + presentedViewController.dismiss(animated: true) { + owner.present(viewController, animated: true) + } + } else { + owner.present(viewController, animated: true) + } + }) + .disposed(by: disposeBag) + + NotificationCenter.default.rx + .notification(UIApplication.willEnterForegroundNotification) + .bind(with: self, onNext: { owner, _ in + owner.requestNotificationAuthorization() + }) + .disposed(by: disposeBag) + } + + func moveScene(params: [String: Any]) { + let page = params["page"] as? String ?? "" + let navigationController = viewControllers[selectedIndex] as? UINavigationController + + switch page { + case "playlist": + let key: String = params["key"] as? String ?? "" + let viewController = playlistDetailFactory.makeView(key: key) + navigationController?.pushViewController(viewController, animated: true) + + // 보관함에서 플리상세 접근 시 플로팅버튼 내림 + if selectedIndex == 3 { + NotificationCenter.default.post( + name: .shouldMovePlaylistFloatingButton, + object: PlaylistFloatingButtonPosition.default + ) + } + + case "songDetail": + guard let id = params["id"] as? String else { + self.showToast(text: WMError.unknown.localizedDescription, options: .tabBar) + return + } + + if PlayState.shared.contains(id: id) { + let playlistIDs = PlayState.shared.currentPlaylist + .map(\.id) + songDetailPresenter.present(ids: playlistIDs, selectedID: id) + } else { + Task { + do { + let song = try await viewModel.fetchSong(id: id) + PlayState.shared.append(item: .init(id: song.id, title: song.title, artist: song.artist)) + let playlistIDs = PlayState.shared.currentPlaylist + .map(\.id) + songDetailPresenter?.present(ids: playlistIDs, selectedID: id) + } catch { + self.showToast(text: error.asWMError.localizedDescription, options: .tabBar) + } + } + } + + default: + break + } + } + + func inputBind() { + input.fetchNoticePopup.onNext(()) + input.fetchNoticeIDList.onNext(()) + input.detectedRefreshPushToken.onNext(()) + } + + func outputBind() { + output.noticePopupDataSource .filter { !$0.isEmpty } - .withUnretained(self) - .subscribe(onNext: { (owner, model) in + .bind(with: self) { owner, model in let viewController = owner.noticePopupComponent.makeView(model: model) viewController.delegate = owner - owner.showPanModal(content: viewController) - }).disposed(by: disposeBag) + owner.showBottomSheet( + content: viewController, + size: .fixed(APP_WIDTH() + 96 + SAFEAREA_BOTTOM_HEIGHT()) + ) + } + .disposed(by: disposeBag) + } +} + +private extension MainTabBarViewController { + func requestNotificationAuthorization() { + Messaging.messaging().delegate = self + UNUserNotificationCenter.current().delegate = self + + let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound] + UNUserNotificationCenter.current().requestAuthorization( + options: authOptions, + completionHandler: { granted, _ in + if granted { + DispatchQueue.main.async { + UIApplication.shared.registerForRemoteNotifications() + } + LogManager.printDebug("🔔:: Notification authorized: \(Messaging.messaging().fcmToken ?? "")") + } else { + LogManager.printDebug("🔔:: Notification denied") + } + PreferenceManager.pushNotificationAuthorizationStatus = granted + } + ) } - - private func configureUI() { + + func configureUI() { let startPage: Int = Utility.PreferenceManager.startPage ?? 0 add(asChildViewController: viewControllers[startPage]) } - +} + +extension MainTabBarViewController { func updateContent(previous: Int, current: Int) { Utility.PreferenceManager.startPage = current remove(asChildViewController: viewControllers[previous]) add(asChildViewController: viewControllers[current]) - + self.previousIndex = previous self.selectedIndex = current } - - func forceUpdateContent(for index: Int) { - Utility.PreferenceManager.startPage = index - if let previous = self.previousIndex{ - remove(asChildViewController: viewControllers[previous]) - } - add(asChildViewController: viewControllers[index]) - - self.previousIndex = self.selectedIndex - self.selectedIndex = index - } - func equalHandleTapped(for index: Int) { - guard let navigationController = self.viewControllers[index] as? UINavigationController else { return } - if let home = navigationController.viewControllers.first as? HomeViewController { - home.equalHandleTapped() - }else if let chart = navigationController.viewControllers.first as? ChartViewController { - chart.equalHandleTapped() - }else if let search = navigationController.viewControllers.first as? SearchViewController { - search.equalHandleTapped() - }else if let artist = navigationController.viewControllers.first as? ArtistViewController { - artist.equalHandleTapped() - }else if let storage = navigationController.viewControllers.first as? StorageViewController { - storage.equalHandleTapped() + guard let navigationController = self.viewControllers[index] as? UINavigationController, + let viewController = navigationController.viewControllers.first as? EqualHandleTappedType else { + return } + viewController.equalHandleTapped() } } extension MainTabBarViewController: NoticePopupViewControllerDelegate { public func noticeTapped(model: FetchNoticeEntity) { - let viewController = noticeDetailComponent.makeView(model: model) - viewController.modalPresentationStyle = .overFullScreen - self.present(viewController, animated: true) + if model.thumbnail.link.isEmpty { + let viewController = noticeDetailFactory.makeView(model: model) + viewController.modalPresentationStyle = .fullScreen + present(viewController, animated: true) + + } else { + guard let URL = URL(string: model.thumbnail.link) else { return } + present(SFSafariViewController(url: URL), animated: true) + } + } +} + +extension MainTabBarViewController: UNUserNotificationCenterDelegate { + public func userNotificationCenter( + _ center: UNUserNotificationCenter, + willPresent notification: UNNotification + ) async -> UNNotificationPresentationOptions { + let userInfo = notification.request.content.userInfo + + // With swizzling disabled you must let Messaging know about the message, for Analytics + Messaging.messaging().appDidReceiveMessage(userInfo) + + // Print full message. + LogManager.printDebug("🔔:: \(userInfo)") + + // Change this to your preferred presentation option + return [[.list, .banner, .sound]] + } + + public func userNotificationCenter( + _ center: UNUserNotificationCenter, + didReceive response: UNNotificationResponse + ) async { + let userInfo = response.notification.request.content.userInfo + appEntryState.moveScene(params: userInfo.parseNotificationInfo) + + // With swizzling disabled you must let Messaging know about the message, for Analytics + Messaging.messaging().appDidReceiveMessage(userInfo) + + // Print full message. + LogManager.printDebug("🔔:: \(userInfo)") + } +} + +extension MainTabBarViewController: MessagingDelegate { + /// [START refresh_token] + public func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) { + LogManager.printDebug("🔔:: Firebase registration token: \(String(describing: fcmToken ?? "-"))") + // If necessary send token to application server. + input.detectedRefreshPushToken.onNext(()) + // Note: This callback is fired at each app startup and whenever a new token is generated. } + // [END refresh_token] } extension MainTabBarViewController: UIGestureRecognizerDelegate { diff --git a/Projects/Features/MainTabFeature/Sources/ViewControllers/NoticePopupViewController.swift b/Projects/Features/MainTabFeature/Sources/ViewControllers/NoticePopupViewController.swift new file mode 100644 index 000000000..4b4285800 --- /dev/null +++ b/Projects/Features/MainTabFeature/Sources/ViewControllers/NoticePopupViewController.swift @@ -0,0 +1,202 @@ +// +// NoticePopupViewController.swift +// DesignSystem +// +// Created by KTH on 2023/01/29. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import BaseFeature +import DesignSystem +import LogManager +import NoticeDomainInterface +import RxCocoa +import RxSwift +import SnapKit +import Then +import UIKit +import Utility + +public protocol NoticePopupViewControllerDelegate: AnyObject { + func noticeTapped(model: FetchNoticeEntity) +} + +public class NoticePopupViewController: UIViewController, ViewControllerFromStoryBoard { + @IBOutlet weak var collectionView: UICollectionView! + @IBOutlet weak var pageCountView: UIView! + @IBOutlet weak var pageCountLabel: UILabel! + @IBOutlet weak var ignoreButton: UIButton! + @IBOutlet weak var confirmButton: UIButton! + + public weak var delegate: NoticePopupViewControllerDelegate? + private var viewModel: NoticePopupViewModel! + private lazy var input = NoticePopupViewModel.Input() + private lazy var output = viewModel.transform(from: input) + private let disposeBag = DisposeBag() + + deinit { + DEBUG_LOG("\(Self.self) Deinit") + } + + override public func viewDidLoad() { + super.viewDidLoad() + configureUI() + outputBind() + inputBind() + } + + override public func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + LogManager.analytics(CommonAnalyticsLog.viewPage(pageName: .noticePopup)) + } + + public static func viewController( + viewModel: NoticePopupViewModel + ) -> NoticePopupViewController { + let viewController = NoticePopupViewController.viewController(storyBoardName: "Main", bundle: Bundle.module) + viewController.viewModel = viewModel + return viewController + } + + @IBAction func ignoreButtonAction(_ sender: Any) { + let savedIgoredNoticeIds: [Int] = Utility.PreferenceManager.ignoredPopupIDs ?? [] + let currentNoticeIds: [Int] = output.originDataSource.value.map { $0.id } + + if savedIgoredNoticeIds.isEmpty { + Utility.PreferenceManager.ignoredPopupIDs = currentNoticeIds + } else { + Utility.PreferenceManager.ignoredPopupIDs = savedIgoredNoticeIds + currentNoticeIds + } + dismiss(animated: true) + } + + @IBAction func confirmButtonAction(_ sender: Any) { + dismiss(animated: true) + } +} + +private extension NoticePopupViewController { + func inputBind() { + input.fetchFilteredNotice.onNext(()) + + collectionView.rx.itemSelected + .bind(to: input.didTapPopup) + .disposed(by: disposeBag) + } + + func outputBind() { + output.thumbnailDataSource + .filter { !$0.isEmpty } + .do(onNext: { [pageCountLabel, pageCountView] model in + pageCountLabel?.text = "1/\(model.count)" + pageCountView?.isHidden = model.count <= 1 + }) + .bind(to: collectionView.rx.items) { collectionView, row, model -> UICollectionViewCell in + guard let cell = collectionView.dequeueReusableCell( + withReuseIdentifier: "NoticeCollectionViewCell", + for: IndexPath(row: row, section: 0) + ) as? NoticeCollectionViewCell else { + return UICollectionViewCell() + } + cell.update(model: model) + return cell + } + .disposed(by: disposeBag) + + output.dismissAndCallDelegate + .bind(with: self) { owner, entity in + let log = NoticePopupAnalyticsLog.clickNoticeItem(id: "\(entity.id)", location: "notice_popup") + LogManager.analytics(log) + + owner.dismiss(animated: true) { + owner.delegate?.noticeTapped(model: entity) + } + } + .disposed(by: disposeBag) + } + + func configureUI() { + self.view.backgroundColor = .white + + let ignoreButtonAttributedString = NSMutableAttributedString.init(string: "다시보지 않기") + ignoreButtonAttributedString.addAttributes( + [ + .font: DesignSystemFontFamily.Pretendard.medium.font(size: 18), + .foregroundColor: DesignSystemAsset.BlueGrayColor.gray25.color, + .kern: -0.5 + ], + range: NSRange( + location: 0, + length: ignoreButtonAttributedString.string.count + ) + ) + ignoreButton.backgroundColor = DesignSystemAsset.BlueGrayColor.gray400.color + ignoreButton.layer.cornerRadius = 12 + ignoreButton.setAttributedTitle(ignoreButtonAttributedString, for: .normal) + + let confirmButtonAttributedString = NSMutableAttributedString.init(string: "닫기") + confirmButtonAttributedString.addAttributes( + [ + .font: DesignSystemFontFamily.Pretendard.medium.font(size: 18), + .foregroundColor: DesignSystemAsset.BlueGrayColor.gray25.color, + .kern: -0.5 + ], + range: NSRange( + location: 0, + length: confirmButtonAttributedString.string.count + ) + ) + confirmButton.backgroundColor = DesignSystemAsset.PrimaryColor.point.color + confirmButton.layer.cornerRadius = 12 + confirmButton.setAttributedTitle(confirmButtonAttributedString, for: .normal) + + pageCountView.layer.cornerRadius = 12 + pageCountView.backgroundColor = DesignSystemAsset.BlueGrayColor.gray900.color.withAlphaComponent(0.2) + pageCountView.clipsToBounds = true + pageCountView.isHidden = true + + pageCountLabel.textColor = DesignSystemAsset.BlueGrayColor.gray25.color + pageCountLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 14) + + collectionView.register( + UINib(nibName: "NoticeCollectionViewCell", bundle: BaseFeatureResources.bundle), + forCellWithReuseIdentifier: "NoticeCollectionViewCell" + ) + collectionView.isPagingEnabled = true + collectionView.rx.setDelegate(self).disposed(by: disposeBag) + collectionView.bounces = false + } +} + +extension NoticePopupViewController: UIScrollViewDelegate { + public func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { + let i = Int(scrollView.contentOffset.x / APP_WIDTH()) + pageCountLabel.text = "\(i + 1)/\(output.thumbnailDataSource.value.count)" + } +} + +extension NoticePopupViewController: UICollectionViewDelegateFlowLayout, UICollectionViewDelegate { + public func collectionView( + _ collectionView: UICollectionView, + layout collectionViewLayout: UICollectionViewLayout, + sizeForItemAt indexPath: IndexPath + ) -> CGSize { + return CGSize(width: APP_WIDTH(), height: APP_WIDTH()) + } + + public func collectionView( + _ collectionView: UICollectionView, + layout collectionViewLayout: UICollectionViewLayout, + minimumLineSpacingForSectionAt section: Int + ) -> CGFloat { + return 0 + } + + public func collectionView( + _ collectionView: UICollectionView, + layout collectionViewLayout: UICollectionViewLayout, + minimumInteritemSpacingForSectionAt section: Int + ) -> CGFloat { + return 0 + } +} diff --git a/Projects/Features/MainTabFeature/Sources/ViewModels/MainTabBarViewModel.swift b/Projects/Features/MainTabFeature/Sources/ViewModels/MainTabBarViewModel.swift index aeefec141..87722e9ee 100644 --- a/Projects/Features/MainTabFeature/Sources/ViewModels/MainTabBarViewModel.swift +++ b/Projects/Features/MainTabFeature/Sources/ViewModels/MainTabBarViewModel.swift @@ -1,52 +1,126 @@ -// -// MainTabBarViewModel.swift -// MainTabFeature -// -// Created by KTH on 2023/04/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - +import FirebaseMessaging import Foundation +import LogManager +import NoticeDomainInterface +import NotificationDomainInterface +import RxRelay import RxSwift -import RxCocoa -import DomainModule -import DataMappingModule +import SongsDomainInterface import Utility -public class MainTabBarViewModel { - - var input = Input() - var output = Output() - var disposeBag = DisposeBag() - - var fetchNoticeUseCase: FetchNoticeUseCase - +private typealias Observer = ( + detectedRefreshPushToken: Void, + isLoggedIn: Bool, + grantedNotificationAuthorization: Bool +) + +public final class MainTabBarViewModel { + private let fetchNoticePopupUseCase: FetchNoticePopupUseCase + private let fetchNoticeIDListUseCase: FetchNoticeIDListUseCase + private let updateNotificationTokenUseCase: UpdateNotificationTokenUseCase + private let fetchSongUseCase: FetchSongUseCase + private let disposeBag = DisposeBag() + + public init( + fetchNoticePopupUseCase: any FetchNoticePopupUseCase, + fetchNoticeIDListUseCase: any FetchNoticeIDListUseCase, + updateNotificationTokenUseCase: any UpdateNotificationTokenUseCase, + fetchSongUseCase: any FetchSongUseCase + ) { + self.fetchNoticePopupUseCase = fetchNoticePopupUseCase + self.fetchNoticeIDListUseCase = fetchNoticeIDListUseCase + self.updateNotificationTokenUseCase = updateNotificationTokenUseCase + self.fetchSongUseCase = fetchSongUseCase + } + public struct Input { + let fetchNoticePopup: PublishSubject = PublishSubject() + let fetchNoticeIDList: PublishSubject = PublishSubject() + let detectedRefreshPushToken: PublishSubject = PublishSubject() } public struct Output { - var dataSource: BehaviorRelay<[FetchNoticeEntity]> = BehaviorRelay(value: []) + let noticePopupDataSource: BehaviorRelay<[FetchNoticeEntity]> = BehaviorRelay(value: []) } - - public init( - fetchNoticeUseCase: any FetchNoticeUseCase - ){ - self.fetchNoticeUseCase = fetchNoticeUseCase - - let igoredNoticeIds: [Int] = Utility.PreferenceManager.ignoredNoticeIDs ?? [] - DEBUG_LOG("igoredNoticeIds: \(igoredNoticeIds)") - - self.fetchNoticeUseCase.execute(type: .currently) - .catchAndReturn([]) - .asObservable() - .map{ (entities) in - guard !igoredNoticeIds.isEmpty else { return entities } + + public func transform(from input: Input) -> Output { + let output = Output() + let ignoredPopupIDs: [Int] = Utility.PreferenceManager.ignoredPopupIDs ?? [] + DEBUG_LOG("ignoredPopupIDs: \(ignoredPopupIDs)") + + input.fetchNoticePopup + .flatMap { [fetchNoticePopupUseCase] _ -> Single<[FetchNoticeEntity]> in + return fetchNoticePopupUseCase.execute() + .catchAndReturn([]) + } + .map { entities in + guard !ignoredPopupIDs.isEmpty else { return entities } return entities.filter { entity in - return !igoredNoticeIds.contains(where: { $0 == entity.id }) + return !ignoredPopupIDs.contains(where: { $0 == entity.id }) } } - .debug("igoredNoticeIds") - .bind(to: output.dataSource) + .debug("ignoredPopupIDs") + .bind(to: output.noticePopupDataSource) + .disposed(by: disposeBag) + + input.fetchNoticeIDList + .withLatestFrom(PreferenceManager.$readNoticeIDs) + .filter { ($0 ?? []).isEmpty } + .flatMap { [fetchNoticeIDListUseCase] _ -> Single in + return fetchNoticeIDListUseCase.execute() + .catchAndReturn(FetchNoticeIDListEntity(status: "404", data: [])) + } + .map { $0.data } + .bind { allNoticeIDs in + PreferenceManager.readNoticeIDs = allNoticeIDs + } .disposed(by: disposeBag) + + // 호출 조건: 앱 실행 시 1회, 리프레쉬 토큰 감지, 기기알림 on/off + Observable.combineLatest( + input.detectedRefreshPushToken, + PreferenceManager.$userInfo.map { $0?.ID }.distinctUntilChanged(), + PreferenceManager.$pushNotificationAuthorizationStatus.distinctUntilChanged().map { $0 ?? false } + ) { detected, id, granted -> Observer in + return Observer( + detectedRefreshPushToken: detected, + isLoggedIn: id != nil, + grantedNotificationAuthorization: granted + ) + } + .flatMap { [updateNotificationTokenUseCase] observer -> Observable in + let updateUseCase = updateNotificationTokenUseCase.execute(type: .update) + .debug("🔔:: updateNotificationTokenUseCase") + .andThen(Observable.just(true)) + .catchAndReturn(false) + let deleteUseCase = updateNotificationTokenUseCase.execute(type: .delete) + .debug("🔔:: updateNotificationTokenUseCase") + .andThen(Observable.just(true)) + .catchAndReturn(false) + + if observer.isLoggedIn && observer.grantedNotificationAuthorization { + return updateUseCase + + } else if observer.isLoggedIn && observer.grantedNotificationAuthorization == false { + return Messaging.messaging().fetchRxPushToken() + .asObservable() + .catchAndReturn("") + .flatMap { token in + return token.isEmpty ? Observable.just(false) : deleteUseCase + } + + } else { + return Observable.just(false) + } + } + .debug("🔔:: updateNotificationTokenUseCase") + .subscribe() + .disposed(by: disposeBag) + + return output + } + + func fetchSong(id: String) async throws -> SongDetailEntity { + return try await fetchSongUseCase.execute(id: id).value } } diff --git a/Projects/Features/MainTabFeature/Sources/ViewModels/NoticePopupViewModel.swift b/Projects/Features/MainTabFeature/Sources/ViewModels/NoticePopupViewModel.swift new file mode 100644 index 000000000..cfaec9ed4 --- /dev/null +++ b/Projects/Features/MainTabFeature/Sources/ViewModels/NoticePopupViewModel.swift @@ -0,0 +1,58 @@ +// +// NoticePopupViewModel.swift +// CommonFeature +// +// Created by KTH on 2023/04/08. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import BaseFeature +import Foundation +import NoticeDomainInterface +import RxCocoa +import RxSwift +import Utility + +public final class NoticePopupViewModel { + private let disposeBag = DisposeBag() + private let noticeEntities: [FetchNoticeEntity] + + public init( + noticeEntities: [FetchNoticeEntity] + ) { + self.noticeEntities = noticeEntities + } + + public struct Input { + let fetchFilteredNotice: PublishSubject = PublishSubject() + let didTapPopup: PublishSubject = PublishSubject() + } + + public struct Output { + let originDataSource: BehaviorRelay<[FetchNoticeEntity]> = BehaviorRelay(value: []) + let thumbnailDataSource: BehaviorRelay<[FetchNoticeEntity.Image]> = BehaviorRelay(value: []) + let dismissAndCallDelegate: PublishSubject = PublishSubject() + } + + public func transform(from input: Input) -> Output { + let output = Output() + let noticeEntities: [FetchNoticeEntity] = self.noticeEntities + + input.fetchFilteredNotice + .bind { + output.thumbnailDataSource.accept( + noticeEntities.map { $0.thumbnail }.filter { !$0.url.isEmpty } + ) + output.originDataSource.accept(noticeEntities) + } + .disposed(by: disposeBag) + + input.didTapPopup + .withLatestFrom(output.originDataSource) { ($0, $1) } + .map { $0.1[$0.0.item] } + .bind(to: output.dismissAndCallDelegate) + .disposed(by: disposeBag) + + return output + } +} diff --git a/Projects/Features/MainTabFeature/Sources/Views/PlayListFloatingActionButton.swift b/Projects/Features/MainTabFeature/Sources/Views/PlayListFloatingActionButton.swift new file mode 100644 index 000000000..227c1c3d4 --- /dev/null +++ b/Projects/Features/MainTabFeature/Sources/Views/PlayListFloatingActionButton.swift @@ -0,0 +1,31 @@ +import DesignSystem +import UIKit + +final class PlayListFloatingActionButton: UIButton { + init() { + super.init(frame: .zero) + setupButton() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + super.init(coder: coder) + } + + override func layoutSubviews() { + super.layoutSubviews() + self.layer.cornerRadius = self.frame.height / 2.0 + self.layer.borderWidth = 1 + self.layer.borderColor = UIColor.white.cgColor + self.clipsToBounds = true + } + + private func setupButton() { + self.setImage( + DesignSystemAsset.Main.playlist.image + .withTintColor(DesignSystemAsset.BlueGrayColor.blueGray900.color, renderingMode: .alwaysOriginal), + for: .normal + ) + self.backgroundColor = .white.withAlphaComponent(0.8) + } +} diff --git a/Projects/Features/MainTabFeature/Sources/Views/TabItemView.swift b/Projects/Features/MainTabFeature/Sources/Views/TabItemView.swift index 1179a9c2c..a1a165e31 100644 --- a/Projects/Features/MainTabFeature/Sources/Views/TabItemView.swift +++ b/Projects/Features/MainTabFeature/Sources/Views/TabItemView.swift @@ -6,149 +6,164 @@ // Copyright © 2023 yongbeomkwak. All rights reserved. // -import UIKit -import Utility import DesignSystem +import LogManager import Lottie import SnapKit +import UIKit +import Utility protocol TabItemViewDelegate: AnyObject { func handleTap(view: TabItemView) } -class TabItemView: UIView { - +final class TabItemView: UIView { @IBOutlet weak var defaultTabImageView: UIImageView! @IBOutlet weak var lottieContentView: UIView! @IBOutlet weak var titleStringLabel: UILabel! - + static var newInstance: TabItemView { - return Bundle.module.loadNibNamed("TabItemView", - owner: self, - options: nil + return Bundle.module.loadNibNamed( + "TabItemView", + owner: self, + options: nil )?.first as? TabItemView ?? TabItemView() } weak var delegate: TabItemViewDelegate? - var lottieAnimationView: LottieAnimationView? - + private var lottieAnimationView: LottieAnimationView? + var isSelected: Bool = false { didSet { self.updateUI(isSelected: isSelected) } } - + var item: TabItem? { didSet { self.configure(self.item) } } - + override func awakeFromNib() { super.awakeFromNib() self.addTapGesture() } } -extension TabItemView { - - private func animateLottie() { - +private extension TabItemView { + func animateLottie() { guard let item = self.item else { return } - + if self.lottieAnimationView == nil { - self.lottieAnimationView = LottieAnimationView(name: item.animateImage, bundle: DesignSystemResources.bundle) + self.lottieAnimationView = LottieAnimationView( + name: item.animateImage, + bundle: DesignSystemResources.bundle + ) guard let lottieAnimationView = self.lottieAnimationView else { return } - + lottieAnimationView.frame = self.lottieContentView.bounds lottieAnimationView.backgroundColor = .clear lottieAnimationView.contentMode = .scaleAspectFill lottieAnimationView.loopMode = .playOnce - + self.lottieContentView.addSubview(lottieAnimationView) - + lottieAnimationView.snp.makeConstraints { - $0.width.height.equalTo(45) + $0.width.height.equalTo(32) $0.centerX.equalTo(self.lottieContentView.snp.centerX) $0.centerY.equalTo(self.lottieContentView.snp.centerY).offset(0.75) } self.lottieContentView.isHidden = false self.defaultTabImageView.isHidden = !self.lottieContentView.isHidden - + lottieAnimationView.stop() lottieAnimationView.play { _ in -// self.lottieContentView.isHidden = true -// self.defaultTabImageView.isHidden = !self.lottieContentView.isHidden } - - }else{ + + } else { guard let lottieAnimationView = self.lottieAnimationView else { return } self.lottieContentView.isHidden = false self.defaultTabImageView.isHidden = !self.lottieContentView.isHidden lottieAnimationView.stop() lottieAnimationView.play { _ in -// self.lottieContentView.isHidden = true -// self.defaultTabImageView.isHidden = !self.lottieContentView.isHidden } } } - private func updateUI(isSelected: Bool) { - - self.titleStringLabel.textColor = isSelected ? DesignSystemAsset.GrayColor.gray900.color : DesignSystemAsset.GrayColor.gray400.color + func updateUI(isSelected: Bool) { + self.titleStringLabel.textColor = isSelected ? + DesignSystemAsset.BlueGrayColor.gray900.color : DesignSystemAsset.BlueGrayColor.gray400.color self.defaultTabImageView.image = isSelected ? item?.onImage : item?.offImage - + if isSelected { animateLottie() - - }else{ + + } else { self.defaultTabImageView.isHidden = false self.lottieContentView.isHidden = true } } - - private func configure(_ item: TabItem?) { + + func configure(_ item: TabItem?) { guard let model = item else { return } - + let attributedString = NSMutableAttributedString( string: model.title, - attributes: [.font: DesignSystemFontFamily.Pretendard.medium.font(size: 12), - .foregroundColor: DesignSystemAsset.GrayColor.gray900.color, - .kern: -0.5] + attributes: [ + .font: DesignSystemFontFamily.Pretendard.medium.font(size: 12), + .foregroundColor: DesignSystemAsset.BlueGrayColor.gray900.color, + .kern: -0.5 + ] ) self.titleStringLabel.attributedText = attributedString self.defaultTabImageView.image = model.offImage self.isSelected = model.isSelected } - + func addTapGesture() { - let tapGesture = UITapGestureRecognizer(target: self, - action: #selector(handleGesture(_:))) + let tapGesture = UITapGestureRecognizer( + target: self, + action: #selector(handleGesture(_:)) + ) self.addGestureRecognizer(tapGesture) } - + @objc func handleGesture(_ sender: UITapGestureRecognizer) { self.delegate?.handleTap(view: self) + if let item { + let log = MainTabAnalyticsLog.clickTabbarTab(tab: item.analyticsTabbarType) + LogManager.analytics(log) + } } } -class TabItem { +final class TabItem { var title: String var offImage: UIImage var onImage: UIImage var animateImage: String var isSelected: Bool - - public init(title: String, offImage: UIImage, onImage: UIImage, animateImage: String, isSelected: Bool = false) { + let analyticsTabbarType: MainTabAnalyticsLog.TabbarTab + + public init( + title: String, + offImage: UIImage, + onImage: UIImage, + animateImage: String, + isSelected: Bool = false, + analyticsTabbarType: MainTabAnalyticsLog.TabbarTab + ) { self.title = title self.offImage = offImage self.onImage = onImage self.animateImage = animateImage self.isSelected = isSelected + self.analyticsTabbarType = analyticsTabbarType } } diff --git a/Projects/Features/MainTabFeature/Tests/TargetTests.swift b/Projects/Features/MainTabFeature/Tests/TargetTests.swift index b1cf79405..147c29d2f 100644 --- a/Projects/Features/MainTabFeature/Tests/TargetTests.swift +++ b/Projects/Features/MainTabFeature/Tests/TargetTests.swift @@ -1,7 +1,6 @@ import XCTest class TargetTests: XCTestCase { - override func setUpWithError() throws { // Put setup code here. This method is called before the invocation of each test method in the class. } @@ -13,5 +12,4 @@ class TargetTests: XCTestCase { func testExample() throws { XCTAssertEqual("A", "A") } - } diff --git a/Projects/Features/MusicDetailFeature/Demo/Resources/LaunchScreen.storyboard b/Projects/Features/MusicDetailFeature/Demo/Resources/LaunchScreen.storyboard new file mode 100644 index 000000000..865e9329f --- /dev/null +++ b/Projects/Features/MusicDetailFeature/Demo/Resources/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Projects/Features/MusicDetailFeature/Demo/Sources/AppDelegate.swift b/Projects/Features/MusicDetailFeature/Demo/Sources/AppDelegate.swift new file mode 100644 index 000000000..944f0a847 --- /dev/null +++ b/Projects/Features/MusicDetailFeature/Demo/Sources/AppDelegate.swift @@ -0,0 +1,131 @@ +import BaseFeature +import BaseFeatureInterface +import Inject +import LikeDomainInterface +import LikeDomainTesting +import LyricHighlightingFeatureInterface +@testable import MusicDetailFeature +import MusicDetailFeatureInterface +import RxSwift +import SignInFeatureInterface +import SongCreditFeatureInterface +import SongsDomainTesting +import UIKit +import Utility + +@main +final class AppDelegate: UIResponder, UIApplicationDelegate { + var window: UIWindow? + + func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil + ) -> Bool { + window = UIWindow(frame: UIScreen.main.bounds) + + let fetchSongUseCase = FetchSongUseCaseSpy() + fetchSongUseCase.handler = { _ in + .just( + .init( + id: "DPEtmqvaKqY", + title: "팬서비스", + artist: "고세구", + views: 120, + date: "2024.03.11", + likes: 120, + isLiked: false, + karaokeNumber: .init(tj: 36, ky: nil) + ) + ) + } + + let addLikeSongUseCase = AddLikeSongUseCaseSpy() + addLikeSongUseCase.handler = { _ in + .just(.init(status: "", likes: 0)) + } + let cancelLikeSongUseCase = CancelLikeSongUseCaseSpy() + cancelLikeSongUseCase.handler = { _ in + .just(.init(status: "", likes: 0)) + } + + let reactor = MusicDetailReactor( + songIDs: [ + "fgSXAKsq-Vo", + "DPEtmqvaKqY", + "KQa297hRop0", + "qZi1Xh0_8q4" + ], + selectedID: "DPEtmqvaKqY", + fetchSongUseCase: fetchSongUseCase, + addLikeSongUseCase: addLikeSongUseCase, + cancelLikeSongUseCase: cancelLikeSongUseCase + ) + let viewController = Inject.ViewControllerHost( + UINavigationController( + rootViewController: MusicDetailViewController( + reactor: reactor, + lyricHighlightingFactory: DummyLyricHighlightingFactory(), + songCreditFactory: DummySongCreditFactory(), + signInFactory: DummySignInFactory(), + containSongsFactory: DummyContainSongsFactory(), + textPopupFactory: DummyTextPopupFactory(), + karaokeFactory: DummyKaraokeFactory(), + playlistPresenterGlobalState: DummyPlaylistPresenterGlobalState() + ) + ) + ) + window?.rootViewController = viewController + window?.makeKeyAndVisible() + + return true + } +} + +final class DummyLyricHighlightingFactory: LyricHighlightingFactory { + func makeView(model: LyricHighlightingRequiredModel) -> UIViewController { + return UIViewController() + } +} + +final class DummyContainSongsFactory: ContainSongsFactory { + func makeView(songs: [String]) -> UIViewController { + return UIViewController() + } +} + +final class DummySongCreditFactory: SongCreditFactory { + func makeViewController(songID: String) -> UIViewController { + return UIViewController() + } +} + +final class DummySignInFactory: SignInFactory { + func makeView() -> UIViewController { + return UIViewController() + } +} + +final class DummyTextPopupFactory: TextPopupFactory { + func makeView( + text: String?, + cancelButtonIsHidden: Bool, + confirmButtonText: String?, + cancelButtonText: String?, + completion: (() -> Void)?, + cancelCompletion: (() -> Void)? + ) -> UIViewController { + return UIViewController() + } +} + +final class DummyPlaylistPresenterGlobalState: PlayListPresenterGlobalStateProtocol { + var presentPlayListObservable: RxSwift.Observable { .empty() } + func presentPlayList(currentSongID: String?) {} + func presentPlayList() {} +} + +final class DummyKaraokeFactory: KaraokeFactory { + func makeViewController(ky: Int?, tj: Int?) -> UIViewController { + UIViewController() + } +} diff --git a/Projects/Features/MusicDetailFeature/Interface/KaraokeFactory.swift b/Projects/Features/MusicDetailFeature/Interface/KaraokeFactory.swift new file mode 100644 index 000000000..1ce7c0045 --- /dev/null +++ b/Projects/Features/MusicDetailFeature/Interface/KaraokeFactory.swift @@ -0,0 +1,5 @@ +import UIKit + +public protocol KaraokeFactory { + func makeViewController(ky: Int?, tj: Int?) -> UIViewController +} diff --git a/Projects/Features/MusicDetailFeature/Interface/MusicDetailFactory.swift b/Projects/Features/MusicDetailFeature/Interface/MusicDetailFactory.swift new file mode 100644 index 000000000..fe384d845 --- /dev/null +++ b/Projects/Features/MusicDetailFeature/Interface/MusicDetailFactory.swift @@ -0,0 +1,5 @@ +import UIKit + +public protocol MusicDetailFactory { + func makeViewController(songIDs: [String], selectedID: String) -> UIViewController +} diff --git a/Projects/Features/MusicDetailFeature/Project.swift b/Projects/Features/MusicDetailFeature/Project.swift new file mode 100644 index 000000000..38a0896e7 --- /dev/null +++ b/Projects/Features/MusicDetailFeature/Project.swift @@ -0,0 +1,29 @@ +import DependencyPlugin +import ProjectDescription +import ProjectDescriptionHelpers + +let project = Project.module( + name: ModulePaths.Feature.MusicDetailFeature.rawValue, + targets: [ + .interface(module: .feature(.MusicDetailFeature)), + .implements(module: .feature(.MusicDetailFeature), dependencies: [ + .feature(target: .MusicDetailFeature, type: .interface), + .feature(target: .BaseFeature), + .feature(target: .LyricHighlightingFeature, type: .interface), + .feature(target: .SongCreditFeature, type: .interface), + .feature(target: .SignInFeature, type: .interface), + .domain(target: .SongsDomain, type: .interface), + .domain(target: .LikeDomain, type: .interface) + ]), + .tests(module: .feature(.MusicDetailFeature), dependencies: [ + .feature(target: .MusicDetailFeature), + .domain(target: .SongsDomain, type: .testing), + .domain(target: .LikeDomain, type: .testing) + ]), + .demo(module: .feature(.MusicDetailFeature), dependencies: [ + .feature(target: .MusicDetailFeature), + .domain(target: .SongsDomain, type: .testing), + .domain(target: .LikeDomain, type: .testing) + ]) + ] +) diff --git a/Projects/Features/MusicDetailFeature/Sources/Analytics/MusicDetailAnalyticsLog.swift b/Projects/Features/MusicDetailFeature/Sources/Analytics/MusicDetailAnalyticsLog.swift new file mode 100644 index 000000000..3cfd6d541 --- /dev/null +++ b/Projects/Features/MusicDetailFeature/Sources/Analytics/MusicDetailAnalyticsLog.swift @@ -0,0 +1,11 @@ +import LogManager + +enum MusicDetailAnalyticsLog: AnalyticsLogType { + case clickCreditButton(id: String) + case clickPrevMusicButton(id: String) + case clickNextMusicButton(id: String) + case clickSingingRoomButton(id: String) + case clickLyricsButton(id: String) + case clickLikeMusicButton(id: String, like: Bool) + case clickPlaylistButton(id: String) +} diff --git a/Projects/Features/MusicDetailFeature/Sources/Karaoke/Component/KaraokeComponent.swift b/Projects/Features/MusicDetailFeature/Sources/Karaoke/Component/KaraokeComponent.swift new file mode 100644 index 000000000..c4f0ef8c8 --- /dev/null +++ b/Projects/Features/MusicDetailFeature/Sources/Karaoke/Component/KaraokeComponent.swift @@ -0,0 +1,9 @@ +import MusicDetailFeatureInterface +import NeedleFoundation +import UIKit + +public final class KaraokeComponent: Component, KaraokeFactory { + public func makeViewController(ky: Int?, tj: Int?) -> UIViewController { + return KaraokeViewController(ky: ky, tj: tj) + } +} diff --git a/Projects/Features/MusicDetailFeature/Sources/Karaoke/KaraokeViewController.swift b/Projects/Features/MusicDetailFeature/Sources/Karaoke/KaraokeViewController.swift new file mode 100644 index 000000000..93983134a --- /dev/null +++ b/Projects/Features/MusicDetailFeature/Sources/Karaoke/KaraokeViewController.swift @@ -0,0 +1,87 @@ +import BaseFeature +import DesignSystem +import UIKit +import Utility + +final class KaraokeViewController: BaseViewController { + private var ky: Int? + private var tj: Int? + + private let titleLabel: WMLabel = WMLabel( + text: "노래방", + textColor: DesignSystemAsset.BlueGrayColor.blueGray900.color, + font: .t2(weight: .bold), + alignment: .center, + lineHeight: UIFont.WMFontSystem.t2(weight: .bold).lineHeight + ) + + private let karaokeInfoView: KaraokeInfoView = KaraokeInfoView() + + private let confirmButton: UIButton = UIButton().then { + $0.setTitle("확인", for: .normal) + $0.setTitleColor(.white, for: .normal) + $0.titleLabel?.font = .setFont(.t4(weight: .medium)) + $0.layer.cornerRadius = 12 + $0.clipsToBounds = true + $0.backgroundColor = DesignSystemAsset.PrimaryColorV2.point.color + } + + init(ky: Int?, tj: Int?) { + self.ky = ky + self.tj = tj + + super.init(nibName: nil, bundle: nil) + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func viewDidLoad() { + super.viewDidLoad() + addViews() + setLayout() + configureUI() + bindAction() + } +} + +extension KaraokeViewController { + private func addViews() { + self.view.addSubviews(titleLabel, karaokeInfoView, confirmButton) + } + + private func setLayout() { + titleLabel.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview().inset(20) + $0.top.equalToSuperview().inset(32) + } + + karaokeInfoView.snp.makeConstraints { + $0.leading.trailing.equalToSuperview() + $0.top.equalTo(titleLabel.snp.bottom).offset(16) + } + + confirmButton.snp.makeConstraints { + $0.top.equalTo(karaokeInfoView.snp.bottom).offset(40) + $0.horizontalEdges.equalToSuperview().inset(20) + $0.height.equalTo(56) + $0.bottom.equalTo(view.safeAreaLayoutGuide).inset(20) + } + } + + private func configureUI() { + self.view.backgroundColor = .white + karaokeInfoView.update(ky: ky, tj: tj) + } + + private func bindAction() { + confirmButton.addAction { [weak self] in + + guard let self else { return } + + self.dismiss(animated: true) + } + } +} diff --git a/Projects/Features/MusicDetailFeature/Sources/Karaoke/Model/KaraokeKind.swift b/Projects/Features/MusicDetailFeature/Sources/Karaoke/Model/KaraokeKind.swift new file mode 100644 index 000000000..42a2491d2 --- /dev/null +++ b/Projects/Features/MusicDetailFeature/Sources/Karaoke/Model/KaraokeKind.swift @@ -0,0 +1,25 @@ +import DesignSystem +import UIKit + +enum KaraokeKind { + case KY + case TJ + + var koreanTitle: String { + switch self { + case .KY: + "금영" + case .TJ: + "태진" + } + } + + var logoImage: UIImage { + switch self { + case .KY: + return DesignSystemAsset.MusicDetail.ky.image + case .TJ: + return DesignSystemAsset.MusicDetail.tj.image + } + } +} diff --git a/Projects/Features/MusicDetailFeature/Sources/Karaoke/Views/KaraokeContentView.swift b/Projects/Features/MusicDetailFeature/Sources/Karaoke/Views/KaraokeContentView.swift new file mode 100644 index 000000000..978d200e2 --- /dev/null +++ b/Projects/Features/MusicDetailFeature/Sources/Karaoke/Views/KaraokeContentView.swift @@ -0,0 +1,85 @@ +import DesignSystem +import SnapKit +import Then +import UIKit + +private protocol KaraokeContentStateProtocol { + func update(number: Int?, kind: KaraokeKind) +} + +final class KaraokeContentView: UIView { + private let imageView: UIImageView = UIImageView().then { + $0.contentMode = .scaleAspectFill + } + + private lazy var labelContainerView: UIView = UIView ().then { + $0.addSubviews(titleLabel, subTitleLabel) + } + + private let titleLabel: WMLabel = WMLabel( + text: "", + textColor: DesignSystemAsset.BlueGrayColor.blueGray500.color, + font: .t7(weight: .light), + lineHeight: UIFont.WMFontSystem.t7(weight: .light).lineHeight, + kernValue: -0.5 + ) + + private let subTitleLabel: WMLabel = WMLabel( + text: "", + textColor: DesignSystemAsset.BlueGrayColor.blueGray900.color, + font: .t5(weight: .medium), + lineHeight: UIFont.WMFontSystem.t5(weight: .medium).lineHeight, + kernValue: -0.5 + ) + init() { + super.init(frame: .zero) + addViews() + setLayout() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func addViews() { + self.addSubviews(imageView, labelContainerView) + } + + func setLayout() { + imageView.snp.makeConstraints { + $0.width.height.equalTo(32) + $0.leading.equalToSuperview().inset(24) + $0.top.bottom.equalToSuperview().inset(20) + } + + labelContainerView.snp.makeConstraints { + $0.leading.equalTo(imageView.snp.trailing).offset(16) + $0.top.bottom.equalToSuperview().inset(15) + $0.trailing.equalToSuperview().inset(44) + } + + titleLabel.snp.makeConstraints { + $0.top.leading.trailing.equalToSuperview() + } + + subTitleLabel.snp.makeConstraints { + $0.top.equalTo(titleLabel.snp.bottom) + $0.leading.trailing.bottom.equalToSuperview() + } + } +} + +extension KaraokeContentView: KaraokeContentStateProtocol { + func update(number: Int?, kind: KaraokeKind) { + imageView.image = kind.logoImage + titleLabel.text = kind.koreanTitle + + guard let number = number else { + subTitleLabel.text = "없음" + return + } + + subTitleLabel.text = "\(number)" + } +} diff --git a/Projects/Features/MusicDetailFeature/Sources/Karaoke/Views/KaraokeInfoView.swift b/Projects/Features/MusicDetailFeature/Sources/Karaoke/Views/KaraokeInfoView.swift new file mode 100644 index 000000000..370ab439a --- /dev/null +++ b/Projects/Features/MusicDetailFeature/Sources/Karaoke/Views/KaraokeInfoView.swift @@ -0,0 +1,60 @@ +import DesignSystem +import SnapKit +import Then +import UIKit + +private protocol KaraokeStateProtocol { + func update(ky: Int?, tj: Int?) +} + +final class KaraokeInfoView: UIView { + private let kyKaraokeView: KaraokeContentView = KaraokeContentView().then { + $0.layer.cornerRadius = 12 + $0.clipsToBounds = true + $0.backgroundColor = DesignSystemAsset.BlueGrayColor.blueGray50.color + } + + private let tyKaraokeView: KaraokeContentView = KaraokeContentView().then { + $0.layer.cornerRadius = 12 + $0.clipsToBounds = true + $0.backgroundColor = DesignSystemAsset.BlueGrayColor.blueGray50.color + } + + private lazy var stackView: UIStackView = UIStackView().then { + $0.distribution = .fillEqually + $0.spacing = 8 + + $0.addArrangedSubviews(kyKaraokeView, tyKaraokeView) + } + + init() { + super.init(frame: .zero) + self.backgroundColor = .clear + + addViews() + setLayout() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func addViews() { + self.addSubviews(stackView) + } + + private func setLayout() { + stackView.snp.makeConstraints { + $0.leading.trailing.equalToSuperview().inset(20) + $0.top.bottom.equalToSuperview() + } + } +} + +extension KaraokeInfoView: KaraokeStateProtocol { + func update(ky: Int?, tj: Int?) { + kyKaraokeView.update(number: ky, kind: .KY) + tyKaraokeView.update(number: tj, kind: .TJ) + } +} diff --git a/Projects/Features/MusicDetailFeature/Sources/MusicDetail/Component/MusicDetailComponent.swift b/Projects/Features/MusicDetailFeature/Sources/MusicDetail/Component/MusicDetailComponent.swift new file mode 100644 index 000000000..a7fce96d3 --- /dev/null +++ b/Projects/Features/MusicDetailFeature/Sources/MusicDetail/Component/MusicDetailComponent.swift @@ -0,0 +1,50 @@ +import BaseFeature +import BaseFeatureInterface +import LikeDomainInterface +import LyricHighlightingFeatureInterface +import MusicDetailFeatureInterface +import NeedleFoundation +import SignInFeatureInterface +import SongCreditFeatureInterface +import SongsDomainInterface +import UIKit + +public protocol MusicDetailDependency: Dependency { + var fetchSongUseCase: any FetchSongUseCase { get } + var lyricHighlightingFactory: any LyricHighlightingFactory { get } + var songCreditFactory: any SongCreditFactory { get } + var signInFactory: any SignInFactory { get } + var containSongsFactory: any ContainSongsFactory { get } + var karaokeFactory: any KaraokeFactory { get } + var textPopupFactory: any TextPopupFactory { get } + var playlistPresenterGlobalState: any PlayListPresenterGlobalStateProtocol { get } + var addLikeSongUseCase: any AddLikeSongUseCase { get } + var cancelLikeSongUseCase: any CancelLikeSongUseCase { get } +} + +public final class MusicDetailComponent: Component, MusicDetailFactory { + public func makeViewController(songIDs: [String], selectedID: String) -> UIViewController { + let reactor = MusicDetailReactor( + songIDs: songIDs, + selectedID: selectedID, + fetchSongUseCase: dependency.fetchSongUseCase, + addLikeSongUseCase: dependency.addLikeSongUseCase, + cancelLikeSongUseCase: dependency.cancelLikeSongUseCase + ) + + let viewController = MusicDetailViewController( + reactor: reactor, + lyricHighlightingFactory: dependency.lyricHighlightingFactory, + songCreditFactory: dependency.songCreditFactory, + signInFactory: dependency.signInFactory, + containSongsFactory: dependency.containSongsFactory, + textPopupFactory: dependency.textPopupFactory, + karaokeFactory: dependency.karaokeFactory, + playlistPresenterGlobalState: dependency.playlistPresenterGlobalState + ) + + return UINavigationController( + rootViewController: viewController + ) + } +} diff --git a/Projects/Features/MusicDetailFeature/Sources/MusicDetail/Model/SongModel.swift b/Projects/Features/MusicDetailFeature/Sources/MusicDetail/Model/SongModel.swift new file mode 100644 index 000000000..96be2a1c5 --- /dev/null +++ b/Projects/Features/MusicDetailFeature/Sources/MusicDetail/Model/SongModel.swift @@ -0,0 +1,50 @@ +import Foundation +import PlaylistDomainInterface +import SongsDomainInterface + +struct SongModel: Equatable { + let videoID: String + let title: String + let artistString: String + let date: String + let views: Int + let likes: Int + let isLiked: Bool + let karaokeNumber: KaraokeNumber + + struct KaraokeNumber: Equatable { + let tj: Int? + let ky: Int? + } + + func updateIsLiked(likes: Int, isLiked: Bool) -> SongModel { + SongModel( + videoID: self.videoID, + title: self.title, + artistString: self.artistString, + date: self.date, + views: self.views, + likes: likes, + isLiked: isLiked, + karaokeNumber: self.karaokeNumber + ) + } +} + +extension SongDetailEntity { + func toModel() -> SongModel { + SongModel( + videoID: self.id, + title: self.title, + artistString: self.artist, + date: self.date, + views: self.views, + likes: self.likes, + isLiked: self.isLiked, + karaokeNumber: SongModel.KaraokeNumber( + tj: self.karaokeNumber.tj, + ky: self.karaokeNumber.ky + ) + ) + } +} diff --git a/Projects/Features/MusicDetailFeature/Sources/MusicDetail/Model/ThumbnailModel.swift b/Projects/Features/MusicDetailFeature/Sources/MusicDetail/Model/ThumbnailModel.swift new file mode 100644 index 000000000..0b5b88bcd --- /dev/null +++ b/Projects/Features/MusicDetailFeature/Sources/MusicDetail/Model/ThumbnailModel.swift @@ -0,0 +1,6 @@ +import Foundation + +struct ThumbnailModel: Hashable { + let imageURL: String + let alternativeImageURL: String +} diff --git a/Projects/Features/MusicDetailFeature/Sources/MusicDetail/MusicDetailReactor.swift b/Projects/Features/MusicDetailFeature/Sources/MusicDetail/MusicDetailReactor.swift new file mode 100644 index 000000000..9bda66e2e --- /dev/null +++ b/Projects/Features/MusicDetailFeature/Sources/MusicDetail/MusicDetailReactor.swift @@ -0,0 +1,492 @@ +import BaseFeature +import Foundation +import Kingfisher +import LikeDomainInterface +import Localization +import LogManager +import LyricHighlightingFeatureInterface +import ReactorKit +import RxSwift +import SongsDomainInterface +import Utility + +final class MusicDetailReactor: Reactor { + private typealias Log = MusicDetailAnalyticsLog + private struct LikeRequest { + let songID: String + let isLiked: Bool + } + + enum Action { + case viewDidLoad + case viewWillDisappear + case prevButtonDidTap + case playButtonDidTap + case nextButtonDidTap + case singingRoomButtonDidTap + case lyricsButtonDidTap + case creditButtonDidTap + case likeButtonDidTap + case musicPickButtonDidTap + case playListButtonDidTap + case dismissButtonDidTap + } + + enum Mutation { + case updateSelectedIndex(Int) + case navigate(NavigateType?) + case updateSongDictionary(key: String, value: SongModel) + } + + enum NavigateType { + case youtube(id: String, playPlatform: WakmusicYoutubePlayer.PlayPlatform) + case credit(id: String) + case lyricsHighlighting(model: LyricHighlightingRequiredModel) + case musicPick(id: String) + case playlist(id: String) + case dismiss + case textPopup(text: String, completion: () -> Void) + case signin + case karaoke(ky: Int?, tj: Int?) + } + + struct State { + var songIDs: [String] + var selectedIndex: Int + var songDictionary: [String: SongModel] = [:] + var selectedSong: SongModel? { + guard selectedIndex >= 0, selectedIndex < songIDs.count else { return nil } + return songDictionary[songIDs[selectedIndex]] + } + + var isFirstSong: Bool { selectedIndex == 0 } + var isLastSong: Bool { selectedIndex == songIDs.count - 1 } + var navigateType: NavigateType? + } + + private let signInIsRequiredSubject = PublishSubject() + + var initialState: State + private let youtubeURLGenerator = YoutubeURLGenerator() + private let fetchSongUseCase: any FetchSongUseCase + private let addLikeSongUseCase: any AddLikeSongUseCase + private let cancelLikeSongUseCase: any CancelLikeSongUseCase + private var shouldRefreshLikeList = false + + private var pendingLikeRequests: [String: LikeRequest] = [:] + private var latestLikeRequests: [String: LikeRequest] = [:] + private let likeRequestSubject = PublishSubject() + private var currentLikeRequestSongID: String? + + init( + songIDs: [String], + selectedID: String, + fetchSongUseCase: any FetchSongUseCase, + addLikeSongUseCase: any AddLikeSongUseCase, + cancelLikeSongUseCase: any CancelLikeSongUseCase + ) { + let selectedIndex = songIDs.firstIndex(of: selectedID) ?? 0 + self.initialState = .init( + songIDs: songIDs, + selectedIndex: selectedIndex + ) + + self.fetchSongUseCase = fetchSongUseCase + self.addLikeSongUseCase = addLikeSongUseCase + self.cancelLikeSongUseCase = cancelLikeSongUseCase + + let urls = [ + songIDs[safe: selectedIndex - 1], + songIDs[safe: selectedIndex], + songIDs[safe: selectedIndex + 1] + ] + .compactMap { $0 } + .map { youtubeURLGenerator.generateHDThumbnailURL(id: $0) } + .compactMap { URL(string: $0) } + + ImagePrefetcher(urls: urls).start() + } + + func mutate(action: Action) -> Observable { + switch action { + case .viewDidLoad: + return viewDidLoad() + case .viewWillDisappear: + return viewWillDisappear() + case .prevButtonDidTap: + return prevButtonDidTap() + case .playButtonDidTap: + return playButtonDidTap() + case .nextButtonDidTap: + return nextButtonDidTap() + case .singingRoomButtonDidTap: + return singingRoomButtonDiTap() + case .lyricsButtonDidTap: + return lyricsButtonDidTap() + case .creditButtonDidTap: + return creditButtonDidTap() + case .likeButtonDidTap: + return likeButtonDidTap() + case .musicPickButtonDidTap: + return musicPickButtonDidTap() + case .playListButtonDidTap: + return playListButtonDidTap() + case .dismissButtonDidTap: + return navigateMutation(navigate: .dismiss) + } + } + + func reduce(state: State, mutation: Mutation) -> State { + var newState = state + switch mutation { + case let .updateSelectedIndex(index): + newState.selectedIndex = index + case let .navigate(navigate): + newState.navigateType = navigate + case let .updateSongDictionary(key, value): + newState.songDictionary[key] = value + } + return newState + } + + func transform(mutation: Observable) -> Observable { + let signInIsRequired = signInIsRequiredSubject + .withUnretained(self) + .flatMap { owner, _ in + owner.navigateMutation(navigate: .signin) + } + + let likeRequestObservable = likeRequestSubject + .flatMapLatest { [weak self] request -> Observable in + guard let self = self else { return .empty() } + return self.handleLikeRequest(request) + } + + return Observable.merge(mutation, signInIsRequired, likeRequestObservable) + } + + /// 좋아요 요청을 처리하고 대기 중인 요청이 있다면 연속적으로 처리해요. + /// + /// 이 함수는 주어진 좋아요 요청을 처리하고, 해당 요청의 처리가 완료된 후 대기 중인 다른 요청이 있는지 확인해요. + /// 대기 중인 요청이 있다면 해당 요청도 처리합니다. + /// + /// - Parameters: + /// - request: 처리할 좋아요 요청 + /// + /// - Returns: 처리 결과에 따른 Mutation Observable 스트림 + /// + /// - Note: 이 함수는 에러 발생 시 로그를 출력하고 빈 Observable을 반환해요. + private func handleLikeRequest(_ request: LikeRequest) -> Observable { + let useCase: (_ id: String) -> Observable = request.isLiked + ? { [addLikeSongUseCase] id in + addLikeSongUseCase.execute(id: id) + .asObservable() + .map { _ in () } + } + : { [cancelLikeSongUseCase] id in + cancelLikeSongUseCase.execute(id: id) + .asObservable() + .map { _ in () } + } + + self.latestLikeRequests[request.songID] = request + self.pendingLikeRequests.removeValue(forKey: request.songID) + return useCase(request.songID) + .asObservable() + .flatMap { [weak self] _ -> Observable in + guard let self = self else { return .empty() } + + if let nextRequest = self.getNextPendingRequest() { + return self.handleLikeRequest(nextRequest) + } + + self.currentLikeRequestSongID = nil + return .empty() + } + .catch { [weak self] error in + self?.currentLikeRequestSongID = nil + LogManager.printError("Like request failed: \(error)") + return .empty() + } + } + + /// 다음으로 처리할 대기 중인 좋아요 요청을 반환해요. + /// + /// 이 함수는 현재 처리 중인 곡의 ID에 해당하는 대기 중인 요청이 있는지 먼저 확인해요. + /// 만약 있다면, 해당 요청의 상태가 최신 상태와 다를 경우에만 반환해요. + /// 현재 곡의 대기 중인 요청이 없거나 상태가 같다면, 다른 곡의 대기 중인 요청 중 첫 번째 요청을 반환해요. + /// + /// - Returns: 다음으로 처리할 `LikeRequest` 객체. 처리할 마땅한 요청이 없다면 `nil`을 반환 + /// + /// - Note: 이 함수는 대기 중인 요청들의 우선순위에 따라 반환됩니다. + private func getNextPendingRequest() -> LikeRequest? { + if let currentSongID = currentLikeRequestSongID, + let nextPendingRequest = pendingLikeRequests[currentSongID] { + let latestRequest = latestLikeRequests[currentSongID] + return if latestRequest == nil { + nextPendingRequest + } else if nextPendingRequest.isLiked != latestRequest?.isLiked { + nextPendingRequest + } else { + nil + } + } + + guard let remainRequest = pendingLikeRequests.values.first else { return nil } + + return remainRequest + } +} + +// MARK: - Mutate + +private extension MusicDetailReactor { + func viewDidLoad() -> Observable { + let selectedIndex = currentState.selectedIndex + guard let selectedSongID = currentState.songIDs[safe: selectedIndex] else { return .empty() } + let prefetchingSongMutationObservable = [ + currentState.songIDs[safe: selectedIndex - 1], + currentState.songIDs[safe: selectedIndex + 1] + ].compactMap { $0 } + .map { index in + fetchSongUseCase.execute(id: index) + .map { $0.toModel() } + .catchAndReturn(SongModel.notFoundModel()) + .map { Mutation.updateSongDictionary(key: index, value: $0) } + .asObservable() + } + + let songMutationObservable = fetchSongUseCase.execute(id: selectedSongID) + .map { $0.toModel() } + .catchAndReturn(SongModel.notFoundModel()) + .map { Mutation.updateSongDictionary(key: selectedSongID, value: $0) } + .asObservable() + + return Observable.merge( + [songMutationObservable] + prefetchingSongMutationObservable + ) + } + + func viewWillDisappear() -> Observable { + if shouldRefreshLikeList { + NotificationCenter.default.post(name: .shouldRefreshLikeList, object: nil) + } + return .empty() + } + + func prevButtonDidTap() -> Observable { + guard !currentState.isFirstSong else { return .empty() } + if let song = currentState.selectedSong { + let log = Log.clickPrevMusicButton(id: song.videoID) + LogManager.analytics(log) + } + let newIndex = currentState.selectedIndex - 1 + prefetchThumbnailImage(index: newIndex) + + return .concat( + .just(.updateSelectedIndex(newIndex)), + fetchSongDetailWith(index: newIndex) + ) + } + + func playButtonDidTap() -> Observable { + guard let song = currentState.selectedSong, !song.videoID.isEmpty else { return .empty() } + if let song = currentState.selectedSong { + let log = CommonAnalyticsLog.clickPlayButton(location: .musicDetail, type: .single) + LogManager.analytics(log) + } + PlayState.shared.append(item: PlaylistItem(id: song.videoID, title: song.title, artist: song.artistString)) + return navigateMutation(navigate: .youtube( + id: song.videoID, + playPlatform: song.title.isContainShortsTagTitle ? .youtube : .automatic + )) + } + + func nextButtonDidTap() -> Observable { + guard !currentState.isLastSong else { return .empty() } + if let song = currentState.selectedSong { + let log = Log.clickNextMusicButton( + id: song.videoID + ) + LogManager.analytics(log) + } + let newIndex = currentState.selectedIndex + 1 + prefetchThumbnailImage(index: newIndex) + + return .concat( + .just(.updateSelectedIndex(newIndex)), + fetchSongDetailWith(index: newIndex) + ) + } + + func singingRoomButtonDiTap() -> Observable { + guard let song = currentState.selectedSong, !song.videoID.isEmpty else { return .empty() } + let log = Log.clickSingingRoomButton(id: song.videoID) + LogManager.analytics(log) + return navigateMutation(navigate: .karaoke(ky: song.karaokeNumber.ky, tj: song.karaokeNumber.tj)) + } + + func lyricsButtonDidTap() -> Observable { + guard let song = currentState.selectedSong, !song.videoID.isEmpty else { return .empty() } + let log = Log.clickLyricsButton(id: song.videoID) + LogManager.analytics(log) + + let lyricHighlightingModel = LyricHighlightingRequiredModel( + songID: song.videoID, + title: song.title, + artist: song.artistString + ) + return navigateMutation(navigate: .lyricsHighlighting(model: lyricHighlightingModel)) + } + + func creditButtonDidTap() -> Observable { + guard let song = currentState.selectedSong, !song.videoID.isEmpty else { return .empty() } + let log = Log.clickCreditButton(id: song.videoID) + LogManager.analytics(log) + return navigateMutation(navigate: .credit(id: song.videoID)) + } + + func likeButtonDidTap() -> Observable { + guard PreferenceManager.userInfo != nil else { + return navigateMutation( + navigate: NavigateType.textPopup( + text: LocalizationStrings.needLoginWarning, + completion: { [signInIsRequiredSubject] in + let log = CommonAnalyticsLog.clickLoginButton(entry: .songLike) + LogManager.analytics(log) + + signInIsRequiredSubject.onNext(()) + } + ) + ) + } + + guard let song = currentState.selectedSong, !song.videoID.isEmpty else { return .empty() } + let isLike = currentState.selectedSong?.isLiked ?? false + let log = Log.clickLikeMusicButton( + id: song.videoID, + like: isLike + ) + + let newLike = !isLike + let newSong = if newLike { + song.updateIsLiked(likes: song.likes + 1, isLiked: newLike) + } else { + song.updateIsLiked(likes: song.likes - 1, isLiked: newLike) + } + LogManager.analytics(log) + + let request = LikeRequest(songID: song.videoID, isLiked: newLike) + pendingLikeRequests[song.videoID] = request + + let currentLikeRequestSongID = currentLikeRequestSongID + self.currentLikeRequestSongID = song.videoID + if currentLikeRequestSongID == nil { + likeRequestSubject.onNext(request) + } + + shouldRefreshLikeList = true + return .just(.updateSongDictionary(key: newSong.videoID, value: newSong)) + } + + func musicPickButtonDidTap() -> Observable { + let log = CommonAnalyticsLog.clickAddMusicsButton(location: .songDetail) + LogManager.analytics(log) + + guard PreferenceManager.userInfo != nil else { + return navigateMutation( + navigate: NavigateType.textPopup( + text: LocalizationStrings.needLoginWarning, + completion: { [signInIsRequiredSubject] in + let log = CommonAnalyticsLog.clickLoginButton(entry: .addMusics) + LogManager.analytics(log) + + signInIsRequiredSubject.onNext(()) + } + ) + ) + } + guard let song = currentState.selectedSong, !song.videoID.isEmpty else { return .empty() } + return navigateMutation(navigate: .musicPick(id: song.videoID)) + } + + func playListButtonDidTap() -> Observable { + guard let song = currentState.selectedSong else { return .empty() } + let log = Log.clickPlaylistButton(id: song.videoID) + LogManager.analytics(log) + return navigateMutation(navigate: .playlist(id: song.videoID)) + } +} + +// MARK: - Private Methods + +private extension MusicDetailReactor { + func navigateMutation(navigate: NavigateType) -> Observable { + return .concat( + .just(.navigate(navigate)), + .just(.navigate(nil)) + ) + } + + func prefetchThumbnailImage(index: Int) { + let prefetchingSongImageURLs = [ + currentState.songIDs[safe: index - 1], + currentState.songIDs[safe: index], + currentState.songIDs[safe: index + 1] + ].compactMap { $0 } + .compactMap { URL(string: youtubeURLGenerator.generateHDThumbnailURL(id: $0)) } + ImagePrefetcher(urls: prefetchingSongImageURLs).start() + } + + func fetchSongDetailWith(index: Int) -> Observable { + let prefetchingSongMutationObservable = [ + currentState.songIDs[safe: index - 1], + currentState.songIDs[safe: index + 1] + ].compactMap { $0 } + .filter { currentState.songDictionary[$0] == nil } + .map { index in + fetchSongUseCase.execute(id: index) + .map { $0.toModel() } + .catchAndReturn(SongModel.notFoundModel()) + .map { Mutation.updateSongDictionary(key: index, value: $0) } + .asObservable() + } + + guard let songID = currentState.songIDs[safe: index] else { + return Observable.merge( + prefetchingSongMutationObservable + ) + } + + guard currentState.songDictionary[songID] == nil else { + return Observable.merge( + prefetchingSongMutationObservable + ) + } + + let currentSongMutationObservable = fetchSongUseCase.execute(id: songID) + .map { $0.toModel() } + .catchAndReturn(SongModel.notFoundModel()) + .map { Mutation.updateSongDictionary(key: songID, value: $0) } + .asObservable() + + return Observable.merge( + [currentSongMutationObservable] + prefetchingSongMutationObservable + ) + } +} + +private extension SongModel { + static func notFoundModel() -> SongModel { + .init( + videoID: "", + title: "해당 곡을 찾을 수 없습니다", + artistString: "정보를 가져올 수 없습니다", + date: "", + views: 0, + likes: 0, + isLiked: false, + karaokeNumber: .init(tj: nil, ky: nil) + ) + } +} diff --git a/Projects/Features/MusicDetailFeature/Sources/MusicDetail/MusicDetailView.swift b/Projects/Features/MusicDetailFeature/Sources/MusicDetail/MusicDetailView.swift new file mode 100644 index 000000000..f995728e2 --- /dev/null +++ b/Projects/Features/MusicDetailFeature/Sources/MusicDetail/MusicDetailView.swift @@ -0,0 +1,259 @@ +import DesignSystem +import Kingfisher +import RxCocoa +import RxSwift +import SnapKit +import Then +import UIKit +import Utility + +private protocol MusicDetailStateProtocol { + func updateTitle(title: String) + func updateArtist(artist: String) + func updateSelectedIndex(index: Int) + func updateInitialSelectedIndex(index: Int) + func updateThumbnails(thumbnailModels: [ThumbnailModel], completion: @escaping () -> Void) + func updateBackgroundImage(thumbnailModel: ThumbnailModel) + func updateIsDisabledSingingRoom(isDisabled: Bool) + func updateIsDisabledPrevButton(isDisabled: Bool) + func updateIsDisabledNextButton(isDisabled: Bool) + func updateViews(views: Int) + func updateIsLike(likes: Int, isLike: Bool) +} + +private protocol MusicDetailActionProtocol { + var prevMusicButtonDidTap: Observable { get } + var playMusicButtonDidTap: Observable { get } + var nextMusicButtonDidTap: Observable { get } + var singingRoomButtonDidTap: Observable { get } + var lyricsButtonDidTap: Observable { get } + var likeButtonDidTap: Observable { get } + var musicPickButtonDidTap: Observable { get } + var playlistButtonDidTap: Observable { get } + var creditButtonDidTap: Observable { get } + var dismissButtonDidTap: Observable { get } +} + +final class MusicDetailView: UIView { + private typealias SectionType = Int + private typealias ItemType = ThumbnailModel + + private let thumbnailCellRegistration = UICollectionView.CellRegistration< + ThumbnailCell, ItemType + > { cell, _, itemIdentifier in + cell.configure(thumbnailModel: itemIdentifier) + } + + private lazy var thumbnailDiffableDataSource = UICollectionViewDiffableDataSource( + collectionView: thumbnailCollectionView + ) { [thumbnailCellRegistration] collectionView, indexPath, itemIdentifier in + let cell = collectionView.dequeueConfiguredReusableCell( + using: thumbnailCellRegistration, + for: indexPath, + item: itemIdentifier + ) + return cell + } + + private let thumbnailCollectionView = ThumbnailCollectionView() + private let backgroundImageView = UIImageView().then { + $0.backgroundColor = .gray + $0.contentMode = .scaleAspectFill + $0.clipsToBounds = true + } + + fileprivate let dismissButton = UIButton().then { + let dismissImage = DesignSystemAsset.MusicDetail.dismiss.image + .withTintColor(DesignSystemAsset.PrimaryColorV2.white.color, renderingMode: .alwaysOriginal) + $0.setImage(dismissImage, for: .normal) + } + + fileprivate let creditButton = UIButton().then { + let creditImage = DesignSystemAsset.MusicDetail.credit.image + .withTintColor(DesignSystemAsset.PrimaryColorV2.white.color, renderingMode: .alwaysOriginal) + $0.setImage(creditImage, for: .normal) + } + + private let dimmedBackgroundView = UIView() + private var dimmedLayer: DimmedGradientLayer? + private let wmNavigationbarView = WMNavigationBarView() + fileprivate let musicControlView = MusicControlView() + fileprivate let musicToolbarView = MusicToolbarView() + + init() { + super.init(frame: .zero) + addView() + setLayout() + self.backgroundColor = .white + thumbnailCollectionView.delegate = self + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func layoutSubviews() { + super.layoutSubviews() + if dimmedLayer == nil { + let dimmedLayer = DimmedGradientLayer(frame: dimmedBackgroundView.bounds) + self.dimmedLayer = dimmedLayer + dimmedBackgroundView.layer.addSublayer(dimmedLayer) + } + } +} + +extension MusicDetailView: UICollectionViewDelegateFlowLayout { + func collectionView( + _ collectionView: UICollectionView, + layout collectionViewLayout: UICollectionViewLayout, + sizeForItemAt indexPath: IndexPath + ) -> CGSize { + collectionView.frame.size + } + + func scrollViewDidScroll(_ scrollView: UIScrollView) {} +} + +private extension MusicDetailView { + func addView() { + self.addSubviews( + backgroundImageView, + dimmedBackgroundView, + thumbnailCollectionView, + wmNavigationbarView, + musicControlView, + musicToolbarView + ) + } + + func setLayout() { + thumbnailCollectionView.snp.makeConstraints { + $0.top.lessThanOrEqualTo(wmNavigationbarView.snp.bottom).offset(44) + $0.centerX.equalToSuperview() + $0.leading.trailing.equalToSuperview() + $0.height.equalTo(thumbnailCollectionView.snp.width).multipliedBy(9.0 / 16.0) + } + + backgroundImageView.snp.makeConstraints { + $0.edges.equalToSuperview() + } + + wmNavigationbarView.snp.makeConstraints { + $0.top.equalTo(self.safeAreaLayoutGuide.snp.top) + $0.horizontalEdges.equalToSuperview() + $0.height.equalTo(48) + } + wmNavigationbarView.setLeftViews([dismissButton]) + wmNavigationbarView.setRightViews([creditButton]) + + musicControlView.snp.makeConstraints { + $0.top.equalTo(thumbnailCollectionView.snp.bottom).offset(20).priority(.required) + $0.leading.trailing.equalToSuperview().inset(36) + $0.bottom.lessThanOrEqualTo(musicToolbarView.snp.top) + $0.height.equalTo(musicControlView.snp.width).multipliedBy(1.0 / 1.0) + } + + musicToolbarView.snp.makeConstraints { + $0.leading.bottom.trailing.equalToSuperview() + $0.top.equalTo(self.safeAreaLayoutGuide.snp.bottom).offset(-56) + } + + dimmedBackgroundView.snp.makeConstraints { + $0.top.leading.trailing.equalToSuperview() + $0.bottom.equalTo(musicToolbarView.snp.top) + } + } +} + +extension MusicDetailView: MusicDetailStateProtocol { + func updateTitle(title: String) { + musicControlView.updateTitle(title: title) + } + + func updateArtist(artist: String) { + musicControlView.updateArtist(artist: artist) + } + + func updateSelectedIndex(index: Int) { + thumbnailCollectionView.scrollToItem( + at: .init(row: index, section: 0), + at: .centeredHorizontally, + animated: true + ) + } + + func updateInitialSelectedIndex(index: Int) { + DispatchQueue.main.async { + self.thumbnailCollectionView.scrollToItem( + at: .init(row: index, section: 0), + at: .centeredHorizontally, + animated: false + ) + } + } + + func updateThumbnails( + thumbnailModels: [ThumbnailModel], + completion: @escaping () -> Void + ) { + var snapshot = thumbnailDiffableDataSource.snapshot() + snapshot.appendSections([0]) + snapshot.appendItems(thumbnailModels, toSection: 0) + thumbnailDiffableDataSource.apply(snapshot, completion: completion) + } + + func updateBackgroundImage(thumbnailModel: ThumbnailModel) { + let alternativeSources = [thumbnailModel.alternativeImageURL] + .compactMap { URL(string: $0) } + .map { Source.network($0) } + + backgroundImageView.kf.setImage( + with: URL(string: thumbnailModel.imageURL), + options: [ + .waitForCache, + .transition(.fade(0.5)), + .forceTransition, + .processor( + DownsamplingImageProcessor( + size: .init(width: 10, height: 10) + ) + ), + .alternativeSources(alternativeSources) + ] + ) + } + + func updateIsDisabledSingingRoom(isDisabled: Bool) { + musicControlView.updateIsDisabledSingingRoom(isDisabled: isDisabled) + } + + func updateIsDisabledPrevButton(isDisabled: Bool) { + musicControlView.updateIsDisabledPrevButton(isDisabled: isDisabled) + } + + func updateIsDisabledNextButton(isDisabled: Bool) { + musicControlView.updateIsDisabledNextButton(isDisabled: isDisabled) + } + + func updateViews(views: Int) { + musicToolbarView.updateViews(views: views) + } + + func updateIsLike(likes: Int, isLike: Bool) { + musicToolbarView.updateIsLike(likes: likes, isLike: isLike) + } +} + +extension Reactive: MusicDetailActionProtocol where Base: MusicDetailView { + var prevMusicButtonDidTap: Observable { base.musicControlView.rx.prevMusicButtonDidTap } + var playMusicButtonDidTap: Observable { base.musicControlView.rx.playMusicButtonDidTap } + var nextMusicButtonDidTap: Observable { base.musicControlView.rx.nextMusicButtonDidTap } + var singingRoomButtonDidTap: Observable { base.musicControlView.rx.singingRoomButtonDidTap } + var lyricsButtonDidTap: Observable { base.musicControlView.rx.lyricsButtonDidTap } + var likeButtonDidTap: Observable { base.musicToolbarView.rx.likeButtonDidTap } + var musicPickButtonDidTap: Observable { base.musicToolbarView.rx.musicPickButtonDidTap } + var playlistButtonDidTap: Observable { base.musicToolbarView.rx.playlistButtonDidTap } + var creditButtonDidTap: Observable { base.creditButton.rx.tap.asObservable() } + var dismissButtonDidTap: Observable { base.dismissButton.rx.tap.asObservable() } +} diff --git a/Projects/Features/MusicDetailFeature/Sources/MusicDetail/MusicDetailViewController.swift b/Projects/Features/MusicDetailFeature/Sources/MusicDetail/MusicDetailViewController.swift new file mode 100644 index 000000000..7cefcb4c3 --- /dev/null +++ b/Projects/Features/MusicDetailFeature/Sources/MusicDetail/MusicDetailViewController.swift @@ -0,0 +1,281 @@ +import BaseFeature +import BaseFeatureInterface +import DesignSystem +import LogManager +import LyricHighlightingFeatureInterface +import MusicDetailFeatureInterface +import RxSwift +import SignInFeatureInterface +import SnapKit +import SongCreditFeatureInterface +import Then +import UIKit +import Utility + +final class MusicDetailViewController: BaseReactorViewController { + private let musicDetailView = MusicDetailView() + private let lyricHighlightingFactory: any LyricHighlightingFactory + private let songCreditFactory: any SongCreditFactory + private let signInFactory: any SignInFactory + private let containSongsFactory: any ContainSongsFactory + private let textPopupFactory: any TextPopupFactory + private let karaokeFactory: any KaraokeFactory + private let playlistPresenterGlobalState: any PlayListPresenterGlobalStateProtocol + + init( + reactor: MusicDetailReactor, + lyricHighlightingFactory: any LyricHighlightingFactory, + songCreditFactory: any SongCreditFactory, + signInFactory: any SignInFactory, + containSongsFactory: any ContainSongsFactory, + textPopupFactory: any TextPopupFactory, + karaokeFactory: any KaraokeFactory, + playlistPresenterGlobalState: any PlayListPresenterGlobalStateProtocol + ) { + self.lyricHighlightingFactory = lyricHighlightingFactory + self.songCreditFactory = songCreditFactory + self.signInFactory = signInFactory + self.containSongsFactory = containSongsFactory + self.textPopupFactory = textPopupFactory + self.karaokeFactory = karaokeFactory + self.playlistPresenterGlobalState = playlistPresenterGlobalState + super.init(reactor: reactor) + } + + override func loadView() { + view = musicDetailView + } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + LogManager.analytics(CommonAnalyticsLog.viewPage(pageName: .musicDetail)) + navigationController?.interactivePopGestureRecognizer?.isEnabled = true + navigationController?.interactivePopGestureRecognizer?.delegate = self + } + + override func configureNavigation() { + self.navigationController?.setNavigationBarHidden(true, animated: true) + } + + override func bindState(reactor: MusicDetailReactor) { + let sharedState = reactor.state + .subscribe(on: MainScheduler.asyncInstance) + .share(replay: 8) + let youtubeURLGenerator = YoutubeURLGenerator() + + sharedState.map(\.songIDs) + .distinctUntilChanged() + .map { songs in + songs.map { + ThumbnailModel( + imageURL: youtubeURLGenerator.generateHDThumbnailURL(id: $0), + alternativeImageURL: youtubeURLGenerator.generateThumbnailURL(id: $0) + ) + } + } + .bind { [musicDetailView] thumbnailModels in + musicDetailView.updateThumbnails(thumbnailModels: thumbnailModels) { + musicDetailView.updateInitialSelectedIndex(index: reactor.initialState.selectedIndex) + } + } + .disposed(by: disposeBag) + + sharedState.map(\.isFirstSong) + .distinctUntilChanged() + .bind(onNext: musicDetailView.updateIsDisabledPrevButton(isDisabled:)) + .disposed(by: disposeBag) + + sharedState.map(\.isLastSong) + .distinctUntilChanged() + .bind(onNext: musicDetailView.updateIsDisabledNextButton(isDisabled:)) + .disposed(by: disposeBag) + + sharedState + .compactMap(\.selectedSong) + .distinctUntilChanged() + .bind(with: self) { owner, song in + owner.musicDetailView.updateTitle(title: song.title) + owner.musicDetailView.updateArtist(artist: song.artistString) + owner.musicDetailView.updateViews(views: song.views) + owner.musicDetailView.updateIsLike(likes: song.likes, isLike: song.isLiked) + + let isEnabled = song.karaokeNumber.ky != nil || song.karaokeNumber.tj != nil + owner.musicDetailView.updateIsDisabledSingingRoom(isDisabled: !isEnabled) + } + .disposed(by: disposeBag) + + sharedState + .compactMap(\.selectedSong) + .map(\.videoID) + .distinctUntilChanged() + .bind(with: self) { owner, songID in + owner.musicDetailView.updateBackgroundImage( + thumbnailModel: .init( + imageURL: youtubeURLGenerator.generateHDThumbnailURL(id: songID), + alternativeImageURL: youtubeURLGenerator.generateThumbnailURL(id: songID) + ) + ) + } + .disposed(by: disposeBag) + + sharedState + .filter { !$0.songIDs.isEmpty } + .map(\.selectedIndex) + .skip(3) + .distinctUntilChanged() + .bind(onNext: musicDetailView.updateSelectedIndex(index:)) + .disposed(by: disposeBag) + + sharedState.compactMap(\.navigateType) + .bind(with: self) { owner, navigate in + switch navigate { + case let .youtube(id, playPlatform): + owner.openYoutube(id: id, playPlatform: playPlatform) + case let .credit(id): + owner.navigateCredits(id: id) + case let .lyricsHighlighting(model): + owner.navigateLyricsHighlighing(model: model) + case let .musicPick(id): + owner.presentMusicPick(id: id) + case let .playlist(id): + owner.presentPlaylist(id: id) + case let .textPopup(text, completion): + owner.presentTextPopup(text: text, completion: completion) + case .signin: + owner.presentSignIn() + case let .karaoke(ky, tj): + owner.presentKaraokeSheet(ky: ky, tj: tj) + case .dismiss: + owner.dismiss() + } + } + .disposed(by: disposeBag) + } + + override func bindAction(reactor: MusicDetailReactor) { + self.rx.methodInvoked(#selector(viewDidLoad)) + .map { _ in Reactor.Action.viewDidLoad } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + self.rx.methodInvoked(#selector(viewWillDisappear)) + .map { _ in Reactor.Action.viewWillDisappear } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + musicDetailView.rx.prevMusicButtonDidTap + .throttle(.milliseconds(500), latest: false, scheduler: MainScheduler.asyncInstance) + .map { Reactor.Action.prevButtonDidTap } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + musicDetailView.rx.nextMusicButtonDidTap + .throttle(.milliseconds(500), latest: false, scheduler: MainScheduler.asyncInstance) + .map { Reactor.Action.nextButtonDidTap } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + musicDetailView.rx.playMusicButtonDidTap + .map { Reactor.Action.playButtonDidTap } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + musicDetailView.rx.creditButtonDidTap + .map { Reactor.Action.creditButtonDidTap } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + musicDetailView.rx.singingRoomButtonDidTap + .map { Reactor.Action.singingRoomButtonDidTap } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + musicDetailView.rx.lyricsButtonDidTap + .map { Reactor.Action.lyricsButtonDidTap } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + musicDetailView.rx.likeButtonDidTap + .map { Reactor.Action.likeButtonDidTap } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + musicDetailView.rx.musicPickButtonDidTap + .map { Reactor.Action.musicPickButtonDidTap } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + musicDetailView.rx.playlistButtonDidTap + .map { Reactor.Action.playListButtonDidTap } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + musicDetailView.rx.dismissButtonDidTap + .map { Reactor.Action.dismissButtonDidTap } + .bind(to: reactor.action) + .disposed(by: disposeBag) + } +} + +private extension MusicDetailViewController { + func openYoutube(id: String, playPlatform: WakmusicYoutubePlayer.PlayPlatform = .automatic) { + WakmusicYoutubePlayer(id: id, playPlatform: playPlatform).play() + } + + func navigateCredits(id: String) { + let viewController = songCreditFactory.makeViewController(songID: id) + self.navigationController?.pushViewController(viewController, animated: true) + } + + func navigateLyricsHighlighing(model: LyricHighlightingRequiredModel) { + let viewController = lyricHighlightingFactory.makeView(model: model) + self.navigationController?.pushViewController(viewController, animated: true) + } + + func presentMusicPick(id: String) { + let viewController = containSongsFactory.makeView( + songs: [id] + ) + viewController.modalPresentationStyle = .fullScreen + self.present(viewController, animated: true) + } + + func presentPlaylist(id: String) { + self.dismiss(animated: true) { [playlistPresenterGlobalState] in + playlistPresenterGlobalState.presentPlayList(currentSongID: id) + } + } + + func presentTextPopup(text: String, completion: @escaping () -> Void) { + let viewController = textPopupFactory.makeView( + text: text, + cancelButtonIsHidden: false, + confirmButtonText: "확인", + cancelButtonText: "취소", + completion: completion, + cancelCompletion: nil + ) + self.showBottomSheet(content: viewController) + } + + func presentKaraokeSheet(ky: Int?, tj: Int?) { + let viewController = karaokeFactory.makeViewController(ky: ky, tj: tj) + self.showBottomSheet(content: viewController) + } + + func presentSignIn() { + let viewController = signInFactory.makeView() + viewController.modalPresentationStyle = .overFullScreen + self.present(viewController, animated: true) + } + + func dismiss() { + self.dismiss(animated: true) + } +} + +extension MusicDetailViewController: UIGestureRecognizerDelegate { + func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { + return navigationController?.viewControllers.count ?? 0 > 1 + } +} diff --git a/Projects/Features/MusicDetailFeature/Sources/MusicDetail/Views/MusicControlView/MusicControlGradientPanelLayer.swift b/Projects/Features/MusicDetailFeature/Sources/MusicDetail/Views/MusicControlView/MusicControlGradientPanelLayer.swift new file mode 100644 index 000000000..e428781ee --- /dev/null +++ b/Projects/Features/MusicDetailFeature/Sources/MusicDetail/Views/MusicControlView/MusicControlGradientPanelLayer.swift @@ -0,0 +1,22 @@ +import DesignSystem +import UIKit + +final class MusicControlGradientPanelLayer: CAGradientLayer { + init(frame: CGRect) { + super.init() + self.frame = frame + self.colors = [ + DesignSystemAsset.NewGrayColor.gray600.color.withAlphaComponent(0.0).cgColor, + DesignSystemAsset.NewGrayColor.gray600.color.withAlphaComponent(1.0).cgColor + ] + self.startPoint = .init(x: 0.5, y: 0.4) + self.endPoint = .init(x: 0.5, y: 1.0) + self.cornerRadius = self.frame.width / 2 + self.opacity = 0.2 + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} diff --git a/Projects/Features/MusicDetailFeature/Sources/MusicDetail/Views/MusicControlView/MusicControlView.swift b/Projects/Features/MusicDetailFeature/Sources/MusicDetail/Views/MusicControlView/MusicControlView.swift new file mode 100644 index 000000000..0e553d579 --- /dev/null +++ b/Projects/Features/MusicDetailFeature/Sources/MusicDetail/Views/MusicControlView/MusicControlView.swift @@ -0,0 +1,217 @@ +import DesignSystem +import RxCocoa +import RxSwift +import SnapKit +import Then +import UIKit +import Utility + +private protocol MusicControlStateProtool { + func updateTitle(title: String) + func updateArtist(artist: String) + func updateIsDisabledSingingRoom(isDisabled: Bool) + func updateIsDisabledPrevButton(isDisabled: Bool) + func updateIsDisabledNextButton(isDisabled: Bool) +} + +private protocol MusicControlActionProtocol { + var prevMusicButtonDidTap: Observable { get } + var playMusicButtonDidTap: Observable { get } + var nextMusicButtonDidTap: Observable { get } + var singingRoomButtonDidTap: Observable { get } + var lyricsButtonDidTap: Observable { get } +} + +final class MusicControlView: UIView { + private let titleLabel: WMFlowLabel = WMFlowLabel( + text: "", + textColor: DesignSystemAsset.BlueGrayColor.gray25.color, + font: .t4(weight: .medium) + ) + private let artistLabel: WMFlowLabel = WMFlowLabel( + text: "", + textColor: DesignSystemAsset.BlueGrayColor.gray100.color.withAlphaComponent(0.6), + font: .t5(weight: .medium) + ) + private let titleStackView = UIStackView().then { + $0.alignment = .center + $0.axis = .vertical + $0.spacing = 8 + } + + fileprivate let prevMusicButton = UIButton().then { + $0.setImage(DesignSystemAsset.MusicDetail.prev.image, for: .normal) + } + + fileprivate let playMusicButton = UIButton().then { + let playImage = DesignSystemAsset.MusicDetail.play.image + .withTintColor( + DesignSystemAsset.PrimaryColorV2.point.color, + renderingMode: .alwaysOriginal + ) + $0.setImage(playImage, for: .normal) + } + + fileprivate let nextMusicButton = UIButton().then { + $0.setImage(DesignSystemAsset.MusicDetail.next.image, for: .normal) + } + + private let playStackView: UIStackView = UIStackView().then { + $0.distribution = .equalCentering + $0.axis = .horizontal + } + + fileprivate let singingRoomButton = UIButton().then { + $0.setImage( + DesignSystemAsset.MusicDetail.singingRoom.image + .withTintColor(DesignSystemAsset.NewGrayColor.gray600.color, renderingMode: .alwaysOriginal), + for: .normal + ) + $0.isEnabled = false + } + + fileprivate let lyricsRoomButton = UIButton().then { + $0.setImage(DesignSystemAsset.MusicDetail.lyrics.image, for: .normal) + } + + private let musicInfoStackView: UIStackView = UIStackView().then { + $0.axis = .horizontal + $0.distribution = .fillProportionally + } + + private var musicControlPanelGradientLayer: MusicControlGradientPanelLayer? + private var playButtonGradientLayer: PlayMusicButtonGradientLayer? + + init() { + super.init(frame: .zero) + addView() + setLayout() + } + + override func layoutSubviews() { + super.layoutSubviews() + if musicControlPanelGradientLayer == nil { + let musicControlPanelGradientLayer = MusicControlGradientPanelLayer(frame: self.bounds) + self.musicControlPanelGradientLayer = musicControlPanelGradientLayer + self.layer.addSublayer(musicControlPanelGradientLayer) + } + + if playButtonGradientLayer == nil { + playMusicButton.layoutIfNeeded() + let playButtonGradientLayer = PlayMusicButtonGradientLayer( + frame: playMusicButton.bounds, + cornerRadius: playMusicButton.frame.height / 2 + ) + self.playButtonGradientLayer = playButtonGradientLayer + playMusicButton.layer.addSublayer(playButtonGradientLayer) + } + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +private extension MusicControlView { + func addView() { + titleStackView.addArrangedSubviews(titleLabel, artistLabel) + + playStackView.addArrangedSubviews(prevMusicButton, playMusicButton, nextMusicButton) + + musicInfoStackView.addArrangedSubviews(singingRoomButton, lyricsRoomButton) + + self.addSubviews(titleStackView, playStackView, musicInfoStackView) + } + + func setLayout() { + titleStackView.snp.makeConstraints { + $0.centerX.equalToSuperview() + $0.top.equalToSuperview() + $0.horizontalEdges.equalToSuperview().inset(20) + } + + playStackView.snp.makeConstraints { + $0.center.equalToSuperview() + $0.leading.trailing.equalToSuperview().inset(24) + } + + playMusicButton.snp.makeConstraints { + $0.size.equalTo(88) + } + + musicInfoStackView.snp.makeConstraints { + $0.centerX.equalToSuperview() + $0.bottom.equalToSuperview().inset(36) + $0.width.equalToSuperview().multipliedBy(3.0 / 5.0) + } + } +} + +extension MusicControlView: MusicControlStateProtool { + func updateTitle(title: String) { + titleLabel.text = title + } + + func updateArtist(artist: String) { + artistLabel.text = artist + } + + func updateIsDisabledSingingRoom(isDisabled: Bool) { + let tintColor = isDisabled + ? DesignSystemAsset.NewGrayColor.gray600.color + : DesignSystemAsset.NewGrayColor.gray400.color + + let singingRoomImage = DesignSystemAsset.MusicDetail.singingRoom.image + .withTintColor(tintColor, renderingMode: .alwaysOriginal) + + singingRoomButton.setImage(singingRoomImage, for: .normal) + singingRoomButton.isEnabled = !isDisabled + } + + func updateIsDisabledPrevButton(isDisabled: Bool) { + let tintColor = isDisabled + ? DesignSystemAsset.NewGrayColor.gray600.color + : DesignSystemAsset.NewGrayColor.gray400.color + + let prevButtonImage = DesignSystemAsset.MusicDetail.prev.image + .withTintColor(tintColor, renderingMode: .alwaysOriginal) + + prevMusicButton.setImage(prevButtonImage, for: .normal) + prevMusicButton.isEnabled = !isDisabled + } + + func updateIsDisabledNextButton(isDisabled: Bool) { + let tintColor = isDisabled + ? DesignSystemAsset.NewGrayColor.gray600.color + : DesignSystemAsset.NewGrayColor.gray400.color + + let nextButtonImage = DesignSystemAsset.MusicDetail.next.image + .withTintColor(tintColor, renderingMode: .alwaysOriginal) + + nextMusicButton.setImage(nextButtonImage, for: .normal) + nextMusicButton.isEnabled = !isDisabled + } +} + +extension Reactive: MusicControlActionProtocol where Base: MusicControlView { + var prevMusicButtonDidTap: Observable { + base.prevMusicButton.rx.tap.asObservable() + } + + var playMusicButtonDidTap: Observable { + base.playMusicButton.rx.tap.asObservable() + } + + var nextMusicButtonDidTap: Observable { + base.nextMusicButton.rx.tap.asObservable() + } + + var singingRoomButtonDidTap: Observable { + base.singingRoomButton.rx.tap.asObservable() + } + + var lyricsButtonDidTap: Observable { + base.lyricsRoomButton.rx.tap.asObservable() + } +} diff --git a/Projects/Features/MusicDetailFeature/Sources/MusicDetail/Views/MusicControlView/PlayMusicButtonGradientLayer.swift b/Projects/Features/MusicDetailFeature/Sources/MusicDetail/Views/MusicControlView/PlayMusicButtonGradientLayer.swift new file mode 100644 index 000000000..ddf5480d0 --- /dev/null +++ b/Projects/Features/MusicDetailFeature/Sources/MusicDetail/Views/MusicControlView/PlayMusicButtonGradientLayer.swift @@ -0,0 +1,22 @@ +import DesignSystem +import UIKit + +final class PlayMusicButtonGradientLayer: CAGradientLayer { + init(frame: CGRect, cornerRadius: CGFloat) { + super.init() + self.frame = frame + self.colors = [ + DesignSystemAsset.NewGrayColor.gray600.color.withAlphaComponent(0.0).cgColor, + DesignSystemAsset.NewGrayColor.gray600.color.withAlphaComponent(1.0).cgColor + ] + self.startPoint = .init(x: 0.5, y: 0.4) + self.endPoint = .init(x: 0.5, y: 1.0) + self.cornerRadius = cornerRadius + self.opacity = 0.5 + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} diff --git a/Projects/Features/MusicDetailFeature/Sources/MusicDetail/Views/MusicHeartButton/MusicHeartButton.swift b/Projects/Features/MusicDetailFeature/Sources/MusicDetail/Views/MusicHeartButton/MusicHeartButton.swift new file mode 100644 index 000000000..56754e6c1 --- /dev/null +++ b/Projects/Features/MusicDetailFeature/Sources/MusicDetail/Views/MusicHeartButton/MusicHeartButton.swift @@ -0,0 +1,40 @@ +import DesignSystem +import Foundation +import UIKit + +final class MusicHeartButton: VerticalAlignButton { + private(set) var isLike: Bool = false + + init() { + super.init() + + let heartImage = DesignSystemAsset.MusicDetail.heart.image + self.setTitle("0", for: .normal) + self.titleLabel?.font = .setFont(.t7(weight: .medium)) + self.setImage(heartImage, for: .normal) + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func setIsLike(isLike: Bool, animated: Bool = true) { + let heartImage: UIImage = if isLike { + DesignSystemAsset.MusicDetail.heartFill.image + } else { + DesignSystemAsset.MusicDetail.heart.image + } + + self.setImage(heartImage, for: .normal) + self.setIsLikeTextColor(isLike: isLike) + } + + private func setIsLikeTextColor(isLike: Bool) { + if isLike { + self.setTextColor(color: DesignSystemAsset.PrimaryColorV2.increase.color) + } else { + self.setTextColor(color: DesignSystemAsset.NewGrayColor.gray400.color) + } + } +} diff --git a/Projects/Features/MusicDetailFeature/Sources/MusicDetail/Views/MusicToolbarView.swift b/Projects/Features/MusicDetailFeature/Sources/MusicDetail/Views/MusicToolbarView.swift new file mode 100644 index 000000000..a7636ad4b --- /dev/null +++ b/Projects/Features/MusicDetailFeature/Sources/MusicDetail/Views/MusicToolbarView.swift @@ -0,0 +1,85 @@ +import DesignSystem +import RxCocoa +import RxSwift +import Then +import UIKit +import Utility + +private protocol MusicToolbarStateProtocol { + func updateViews(views: Int) + func updateIsLike(likes: Int, isLike: Bool) +} + +private protocol MusicToolbarActionProtocol { + var likeButtonDidTap: Observable { get } + var musicPickButtonDidTap: Observable { get } + var playlistButtonDidTap: Observable { get } +} + +final class MusicToolbarView: UIStackView { + fileprivate let heartButton = MusicHeartButton() + private let viewsButton = VerticalAlignButton( + title: "0", + image: DesignSystemAsset.MusicDetail.views.image + ).then { + $0.isEnabled = false + } + + fileprivate let musicPickButton = VerticalAlignButton( + title: "노래담기", + image: DesignSystemAsset.MusicDetail.musicPick.image + ) + fileprivate let playlistButton = VerticalAlignButton( + title: "재생목록", + image: DesignSystemAsset.MusicDetail.playlist.image + ) + + init() { + super.init(frame: .zero) + self.addArrangedSubviews(heartButton, viewsButton, musicPickButton, playlistButton) + self.axis = .horizontal + self.distribution = .fillEqually + self.alignment = .top + self.isLayoutMarginsRelativeArrangement = true + self.layoutMargins = .init(top: 4, left: 0, bottom: 0, right: 0) + self.backgroundColor = DesignSystemAsset.NewGrayColor.gray900.color + } + + @available(*, unavailable) + required init(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func layoutSubviews() { + super.layoutSubviews() + let lineBorder = CALayer() + lineBorder.backgroundColor = DesignSystemAsset.NewGrayColor.gray700.color.cgColor + lineBorder.frame = CGRect(x: 0, y: 0, width: frame.width, height: 1) + self.layer.addSublayer(lineBorder) + } +} + +extension MusicToolbarView: MusicToolbarStateProtocol { + func updateViews(views: Int) { + viewsButton.setTitle("\(views.toUnitNumber)", for: .normal) + } + + func updateIsLike(likes: Int, isLike: Bool) { + heartButton.setTitle("\(likes.toUnitNumber)", for: .normal) + heartButton.setIsLike(isLike: isLike, animated: false) + } +} + +extension Reactive: MusicToolbarActionProtocol where Base: MusicToolbarView { + var likeButtonDidTap: Observable { + base.heartButton.rx.tap.asObservable() + } + + var musicPickButtonDidTap: Observable { + base.musicPickButton.rx.tap.asObservable() + } + + var playlistButtonDidTap: Observable { + base.playlistButton.rx.tap.asObservable() + } +} diff --git a/Projects/Features/MusicDetailFeature/Sources/MusicDetail/Views/ThumbnailCollectionView/ThumbnailCell.swift b/Projects/Features/MusicDetailFeature/Sources/MusicDetail/Views/ThumbnailCollectionView/ThumbnailCell.swift new file mode 100644 index 000000000..bce885c79 --- /dev/null +++ b/Projects/Features/MusicDetailFeature/Sources/MusicDetail/Views/ThumbnailCollectionView/ThumbnailCell.swift @@ -0,0 +1,59 @@ +import DesignSystem +import Kingfisher +import Then +import UIKit +import Utility + +final class ThumbnailCell: UICollectionViewCell { + private let thumbnailImageView = UIImageView().then { + $0.layer.cornerRadius = 12 + $0.clipsToBounds = true + $0.contentMode = .scaleAspectFill + } + + override init(frame: CGRect) { + super.init(frame: frame) + addView() + setLayout() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func prepareForReuse() { + super.prepareForReuse() + thumbnailImageView.kf.cancelDownloadTask() + thumbnailImageView.image = nil + } + + func configure(thumbnailModel: ThumbnailModel) { + let alternativeSources = [thumbnailModel.alternativeImageURL] + .compactMap { URL(string: $0) } + .map { Source.network($0) } + + thumbnailImageView.kf.setImage( + with: URL(string: thumbnailModel.imageURL), + placeholder: DesignSystemAsset.Logo.musicDetailPlaceholder.image, + options: [ + .alsoPrefetchToMemory, + .alternativeSources(alternativeSources) + ] + ) + } +} + +private extension ThumbnailCell { + func addView() { + self.addSubview(thumbnailImageView) + } + + func setLayout() { + thumbnailImageView.snp.makeConstraints { + $0.leading.trailing.equalToSuperview().inset(24) + $0.center.equalToSuperview() + $0.height.equalTo(thumbnailImageView.snp.width).multipliedBy(9.0 / 16.0) + } + } +} diff --git a/Projects/Features/MusicDetailFeature/Sources/MusicDetail/Views/ThumbnailCollectionView/ThumbnailCollectionView.swift b/Projects/Features/MusicDetailFeature/Sources/MusicDetail/Views/ThumbnailCollectionView/ThumbnailCollectionView.swift new file mode 100644 index 000000000..90a497db1 --- /dev/null +++ b/Projects/Features/MusicDetailFeature/Sources/MusicDetail/Views/ThumbnailCollectionView/ThumbnailCollectionView.swift @@ -0,0 +1,20 @@ +import UIKit + +final class ThumbnailCollectionView: UICollectionView { + init() { + super.init(frame: .zero, collectionViewLayout: .init()) + let collectionViewLayout = UICollectionViewFlowLayout() + collectionViewLayout.scrollDirection = .horizontal + collectionViewLayout.minimumLineSpacing = 0 + self.isPagingEnabled = true + self.collectionViewLayout = collectionViewLayout + self.showsHorizontalScrollIndicator = false + self.isUserInteractionEnabled = false + self.backgroundColor = .clear + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} diff --git a/Projects/Features/MusicDetailFeature/Tests/MusicDetailFeatureTest.swift b/Projects/Features/MusicDetailFeature/Tests/MusicDetailFeatureTest.swift new file mode 100644 index 000000000..bf4e719ba --- /dev/null +++ b/Projects/Features/MusicDetailFeature/Tests/MusicDetailFeatureTest.swift @@ -0,0 +1,11 @@ +import XCTest + +final class MusicDetailFeatureTests: XCTestCase { + override func setUpWithError() throws {} + + override func tearDownWithError() throws {} + + func testExample() { + XCTAssertEqual(1, 1) + } +} diff --git a/Projects/Features/MyInfoFeature/Demo/Resources/LaunchScreen.storyboard b/Projects/Features/MyInfoFeature/Demo/Resources/LaunchScreen.storyboard new file mode 100644 index 000000000..865e9329f --- /dev/null +++ b/Projects/Features/MyInfoFeature/Demo/Resources/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Projects/Features/MyInfoFeature/Demo/Sources/AppDelegate.swift b/Projects/Features/MyInfoFeature/Demo/Sources/AppDelegate.swift new file mode 100644 index 000000000..3c171422b --- /dev/null +++ b/Projects/Features/MyInfoFeature/Demo/Sources/AppDelegate.swift @@ -0,0 +1,24 @@ +import Inject +@testable import MyInfoFeatureTesting +import UIKit + +@main +final class AppDelegate: UIResponder, UIApplicationDelegate { + var window: UIWindow? + + func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil + ) -> Bool { + window = UIWindow(frame: UIScreen.main.bounds) + + let vc = MyInfoComponentStub() + let viewController = Inject.ViewControllerHost( + UINavigationController(rootViewController: vc.makeView()) + ) + window?.rootViewController = viewController + window?.makeKeyAndVisible() + + return true + } +} diff --git a/Projects/Features/MyInfoFeature/Interface/Enum/SettingItemCategory.swift b/Projects/Features/MyInfoFeature/Interface/Enum/SettingItemCategory.swift new file mode 100644 index 000000000..f79d1156f --- /dev/null +++ b/Projects/Features/MyInfoFeature/Interface/Enum/SettingItemCategory.swift @@ -0,0 +1,12 @@ +import Foundation + +public enum SettingItemCategory: String { + case appPush = "알림" + case playType = "재생" + case serviceTerms = "서비스 이용약관" + case privacy = "개인정보 처리방침" + case openSource = "오픈소스 라이선스" + case removeCache = "캐시 데이터 지우기" + case logout = "로그아웃" + case versionInfo = "버전정보" +} diff --git a/Projects/Features/MyInfoFeature/Interface/Enum/SettingItemType.swift b/Projects/Features/MyInfoFeature/Interface/Enum/SettingItemType.swift new file mode 100644 index 000000000..ce733f8a0 --- /dev/null +++ b/Projects/Features/MyInfoFeature/Interface/Enum/SettingItemType.swift @@ -0,0 +1,6 @@ +import Foundation + +public enum SettingItemType { + case navigate(_ category: SettingItemCategory) + case description(_ category: SettingItemCategory) +} diff --git a/Projects/Features/MyInfoFeature/Interface/Protocol/Factory.swift b/Projects/Features/MyInfoFeature/Interface/Protocol/Factory.swift new file mode 100644 index 000000000..9b27cabab --- /dev/null +++ b/Projects/Features/MyInfoFeature/Interface/Protocol/Factory.swift @@ -0,0 +1,43 @@ +import FaqDomainInterface +import NoticeDomainInterface +import UIKit + +public protocol MyInfoFactory { + func makeView() -> UIViewController +} + +public protocol SettingFactory { + func makeView() -> UIViewController +} + +public protocol OpenSourceLicenseFactory { + func makeView() -> UIViewController +} + +public protocol FaqFactory { + func makeView() -> UIViewController +} + +public protocol FaqContentFactory { + func makeView(dataSource: [FaqEntity]) -> UIViewController +} + +public protocol NoticeFactory { + func makeView() -> UIViewController +} + +public protocol NoticeDetailFactory { + func makeView(model: FetchNoticeEntity) -> UIViewController +} + +public protocol QuestionFactory { + func makeView() -> UIViewController +} + +public protocol ServiceInfoFactory { + func makeView() -> UIViewController +} + +public protocol ProfilePopupFactory { + func makeView(completion: (() -> Void)?) -> UIViewController +} diff --git a/Projects/Features/MyInfoFeature/Interface/Protocol/PlayTypeTogglePopupFactory.swift b/Projects/Features/MyInfoFeature/Interface/Protocol/PlayTypeTogglePopupFactory.swift new file mode 100644 index 000000000..11ada2cbb --- /dev/null +++ b/Projects/Features/MyInfoFeature/Interface/Protocol/PlayTypeTogglePopupFactory.swift @@ -0,0 +1,20 @@ +import UIKit + +public protocol PlayTypeTogglePopupFactory { + func makeView( + completion: ((_ selectedItemString: String) -> Void)?, + cancelCompletion: (() -> Void)? + ) -> UIViewController +} + +public extension PlayTypeTogglePopupFactory { + func makeView( + completion: ((_ selectedItemString: String) -> Void)? = nil, + cancelCompletion: (() -> Void)? = nil + ) -> UIViewController { + self.makeView( + completion: completion, + cancelCompletion: cancelCompletion + ) + } +} diff --git a/Projects/Features/MyInfoFeature/Project.swift b/Projects/Features/MyInfoFeature/Project.swift new file mode 100644 index 000000000..3191ceab1 --- /dev/null +++ b/Projects/Features/MyInfoFeature/Project.swift @@ -0,0 +1,47 @@ +import DependencyPlugin +import ProjectDescription +import ProjectDescriptionHelpers + +let project = Project.module( + name: ModulePaths.Feature.MyInfoFeature.rawValue, + targets: [ + .interface(module: .feature(.MyInfoFeature), dependencies: [ + .domain(target: .NoticeDomain, type: .interface), + .domain(target: .FaqDomain, type: .interface) + ]), + .implements( + module: .feature(.MyInfoFeature), + product: .staticFramework, + spec: .init( + resources: ["Resources/**"], + dependencies: [ + .feature(target: .BaseFeature), + .feature(target: .MyInfoFeature, type: .interface), + .feature(target: .SignInFeature, type: .interface), + .feature(target: .FruitDrawFeature, type: .interface), + .feature(target: .TeamFeature, type: .interface), + .domain(target: .FaqDomain, type: .interface), + .domain(target: .NoticeDomain, type: .interface), + .domain(target: .AuthDomain, type: .interface), + .domain(target: .UserDomain, type: .interface), + .domain(target: .ImageDomain, type: .interface), + .domain(target: .NotificationDomain, type: .interface) + ] + ) + ), + .testing(module: .feature(.MyInfoFeature), dependencies: [ + .feature(target: .MyInfoFeature), + .feature(target: .MyInfoFeature, type: .interface), + .feature(target: .BaseFeature, type: .testing), + .feature(target: .SignInFeature, type: .testing), + .domain(target: .FaqDomain, type: .testing), + .domain(target: .NoticeDomain, type: .testing) + ]), + .tests(module: .feature(.MyInfoFeature), dependencies: [ + .feature(target: .MyInfoFeature) + ]), + .demo(module: .feature(.MyInfoFeature), dependencies: [ + .feature(target: .MyInfoFeature, type: .testing) + ]) + ] +) diff --git a/Projects/Features/CommonFeature/Resources/License/ApacheLicense.txt b/Projects/Features/MyInfoFeature/Resources/ApacheLicense.txt similarity index 100% rename from Projects/Features/CommonFeature/Resources/License/ApacheLicense.txt rename to Projects/Features/MyInfoFeature/Resources/ApacheLicense.txt diff --git a/Projects/Features/MyInfoFeature/Resources/Faq.storyboard b/Projects/Features/MyInfoFeature/Resources/Faq.storyboard new file mode 100644 index 000000000..3e3a29484 --- /dev/null +++ b/Projects/Features/MyInfoFeature/Resources/Faq.storyboard @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Projects/Features/CommonFeature/Resources/License/MITLicense.txt b/Projects/Features/MyInfoFeature/Resources/MITLicense.txt similarity index 100% rename from Projects/Features/CommonFeature/Resources/License/MITLicense.txt rename to Projects/Features/MyInfoFeature/Resources/MITLicense.txt diff --git a/Projects/Features/MyInfoFeature/Resources/Notice.storyboard b/Projects/Features/MyInfoFeature/Resources/Notice.storyboard new file mode 100644 index 000000000..65f33b5ee --- /dev/null +++ b/Projects/Features/MyInfoFeature/Resources/Notice.storyboard @@ -0,0 +1,343 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Projects/Features/MyInfoFeature/Resources/OpenSourceAndServiceInfo.storyboard b/Projects/Features/MyInfoFeature/Resources/OpenSourceAndServiceInfo.storyboard new file mode 100644 index 000000000..315b899dc --- /dev/null +++ b/Projects/Features/MyInfoFeature/Resources/OpenSourceAndServiceInfo.storyboard @@ -0,0 +1,300 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Projects/Features/MyInfoFeature/Resources/ProfilePopUp.storyboard b/Projects/Features/MyInfoFeature/Resources/ProfilePopUp.storyboard new file mode 100644 index 000000000..d6cb04dbb --- /dev/null +++ b/Projects/Features/MyInfoFeature/Resources/ProfilePopUp.storyboard @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Projects/Features/MyInfoFeature/Resources/Question.storyboard b/Projects/Features/MyInfoFeature/Resources/Question.storyboard new file mode 100644 index 000000000..87ec29c32 --- /dev/null +++ b/Projects/Features/MyInfoFeature/Resources/Question.storyboard @@ -0,0 +1,298 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Projects/Features/MyInfoFeature/Sources/Analytics/FAQAnalyticsLog.swift b/Projects/Features/MyInfoFeature/Sources/Analytics/FAQAnalyticsLog.swift new file mode 100644 index 000000000..7b9897658 --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/Analytics/FAQAnalyticsLog.swift @@ -0,0 +1,6 @@ +import LogManager + +enum FAQAnalyticsLog: AnalyticsLogType { + case selectFaqCategory(category: String) + case clickFaqItem(title: String) +} diff --git a/Projects/Features/MyInfoFeature/Sources/Analytics/InquiryAnalyticsLog.swift b/Projects/Features/MyInfoFeature/Sources/Analytics/InquiryAnalyticsLog.swift new file mode 100644 index 000000000..b36030a65 --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/Analytics/InquiryAnalyticsLog.swift @@ -0,0 +1,33 @@ +import LogManager + +enum InquiryAnalyticsLog: AnalyticsLogType { + case clickInquirySubmitButton(type: LogInquiryType) + + enum LogInquiryType: String, AnalyticsLogEnumParametable { + case bug = "버그 제보" + case feature = "기능 제안" + case addSong = "노래 추가" + case modifySong = "노래 수정" + case weeklyChart = "주간차트 영상" + case credit = "참여 정보" + + init(mailSource: InquiryType) { + switch mailSource { + case .reportBug: + self = .bug + case .suggestFunction: + self = .feature + case .addSong: + self = .addSong + case .modifySong: + self = .modifySong + case .weeklyChart: + self = .weeklyChart + case .credit: + self = .credit + case .unknown: + self = .bug + } + } + } +} diff --git a/Projects/Features/MyInfoFeature/Sources/Analytics/MyInfoAnalyticsLog.swift b/Projects/Features/MyInfoFeature/Sources/Analytics/MyInfoAnalyticsLog.swift new file mode 100644 index 000000000..25b39e469 --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/Analytics/MyInfoAnalyticsLog.swift @@ -0,0 +1,24 @@ +import LogManager + +enum MyInfoAnalyticsLog: AnalyticsLogType { + case clickProfileImage + case clickProfileChangeButton + case completeProfileChange + case clickNicknameChangeButton + case completeNicknameChange + case clickFruitDrawEntryButton(location: FruitDrawEntryLocation) + case clickFruitStorageButton + case clickFaqButton + case clickNoticeButton + case clickInquiryButton + case clickTeamButton + case clickSettingButton +} + +enum FruitDrawEntryLocation: String, AnalyticsLogEnumParametable { + case myPage = "my_page" + + var description: String { + self.rawValue + } +} diff --git a/Projects/Features/MyInfoFeature/Sources/Analytics/NoticeAnalyticsLog.swift b/Projects/Features/MyInfoFeature/Sources/Analytics/NoticeAnalyticsLog.swift new file mode 100644 index 000000000..2b06b27c1 --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/Analytics/NoticeAnalyticsLog.swift @@ -0,0 +1,5 @@ +import LogManager + +enum NoticeAnalyticsLog: AnalyticsLogType { + case clickNoticeItem(id: String, location: String = "notice") +} diff --git a/Projects/Features/MyInfoFeature/Sources/Analytics/SettingAnalyticsLog.swift b/Projects/Features/MyInfoFeature/Sources/Analytics/SettingAnalyticsLog.swift new file mode 100644 index 000000000..5cb1a9553 --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/Analytics/SettingAnalyticsLog.swift @@ -0,0 +1,17 @@ +import LogManager + +enum SettingAnalyticsLog: AnalyticsLogType { + case clickNotificationButton + case clickTermsOfServiceButton + case clickPrivacyPolicyButton + case clickSongPlayPlatform + case completeSelectSongPlayPlatform(platform: String) + case clickOpensourceButton + case clickRemoveCacheButton + case completeRemoveCache(size: String) + case clickLogoutButton + case completeLogout + case clickVersionButton + case clickWithdrawButton + case completeWithdraw +} diff --git a/Projects/Features/MyInfoFeature/Sources/Components/FaqComponent.swift b/Projects/Features/MyInfoFeature/Sources/Components/FaqComponent.swift new file mode 100644 index 000000000..5ea67a196 --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/Components/FaqComponent.swift @@ -0,0 +1,23 @@ +import FaqDomainInterface +import Foundation +import MyInfoFeatureInterface +import NeedleFoundation +import UIKit + +public protocol FaqDependency: Dependency { + var faqContentFactory: any FaqContentFactory { get } + var fetchFaqCategoriesUseCase: any FetchFaqCategoriesUseCase { get } + var fetchFaqUseCase: any FetchFaqUseCase { get } +} + +public final class FaqComponent: Component, FaqFactory { + public func makeView() -> UIViewController { + return FaqViewController.viewController( + viewModel: .init( + fetchFaqCategoriesUseCase: dependency.fetchFaqCategoriesUseCase, + fetchQnaUseCase: dependency.fetchFaqUseCase + ), + faqContentFactory: dependency.faqContentFactory + ) + } +} diff --git a/Projects/Features/MyInfoFeature/Sources/Components/FaqContentComponent.swift b/Projects/Features/MyInfoFeature/Sources/Components/FaqContentComponent.swift new file mode 100644 index 000000000..71d5ae035 --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/Components/FaqContentComponent.swift @@ -0,0 +1,11 @@ +import FaqDomainInterface +import Foundation +import MyInfoFeatureInterface +import NeedleFoundation +import UIKit + +public final class FaqContentComponent: Component, FaqContentFactory { + public func makeView(dataSource: [FaqEntity]) -> UIViewController { + return FaqContentViewController.viewController(viewModel: .init(dataSource: dataSource)) + } +} diff --git a/Projects/Features/MyInfoFeature/Sources/Components/MyInfoComponent.swift b/Projects/Features/MyInfoFeature/Sources/Components/MyInfoComponent.swift new file mode 100644 index 000000000..b8b957c6c --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/Components/MyInfoComponent.swift @@ -0,0 +1,49 @@ +import BaseFeatureInterface +import FruitDrawFeatureInterface +import MyInfoFeatureInterface +import NeedleFoundation +import NoticeDomainInterface +import SignInFeatureInterface +import TeamFeatureInterface +import UIKit +import UserDomainInterface + +public protocol MyInfoDependency: Dependency { + var signInFactory: any SignInFactory { get } + var textPopupFactory: any TextPopupFactory { get } + var multiPurposePopupFactory: any MultiPurposePopupFactory { get } + var faqFactory: any FaqFactory { get } + var noticeFactory: any NoticeFactory { get } + var questionFactory: any QuestionFactory { get } + var teamInfoFactory: any TeamInfoFactory { get } + var settingFactory: any SettingFactory { get } + var profilePopupFactory: any ProfilePopupFactory { get } + var fruitDrawFactory: any FruitDrawFactory { get } + var fruitStorageFactory: any FruitStorageFactory { get } + var fetchNoticeIDListUseCase: any FetchNoticeIDListUseCase { get } + var setUserNameUseCase: any SetUserNameUseCase { get } + var fetchUserInfoUseCase: any FetchUserInfoUseCase { get } +} + +public final class MyInfoComponent: Component, MyInfoFactory { + public func makeView() -> UIViewController { + return MyInfoViewController.viewController( + reactor: MyInfoReactor( + fetchNoticeIDListUseCase: dependency.fetchNoticeIDListUseCase, + setUserNameUseCase: dependency.setUserNameUseCase, + fetchUserInfoUseCase: dependency.fetchUserInfoUseCase + ), + profilePopupFactory: dependency.profilePopupFactory, + textPopupFactory: dependency.textPopupFactory, + multiPurposePopupFactory: dependency.multiPurposePopupFactory, + signInFactory: dependency.signInFactory, + faqFactory: dependency.faqFactory, + noticeFactory: dependency.noticeFactory, + questionFactory: dependency.questionFactory, + teamInfoFactory: dependency.teamInfoFactory, + settingFactory: dependency.settingFactory, + fruitDrawFactory: dependency.fruitDrawFactory, + fruitStorageFactory: dependency.fruitStorageFactory + ) + } +} diff --git a/Projects/Features/MyInfoFeature/Sources/Components/NoticeComponent.swift b/Projects/Features/MyInfoFeature/Sources/Components/NoticeComponent.swift new file mode 100644 index 000000000..bfd0666f4 --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/Components/NoticeComponent.swift @@ -0,0 +1,21 @@ +import Foundation +import MyInfoFeatureInterface +import NeedleFoundation +import NoticeDomainInterface +import UIKit + +public protocol NoticeDependency: Dependency { + var fetchNoticeAllUseCase: any FetchNoticeAllUseCase { get } + var noticeDetailFactory: any NoticeDetailFactory { get } +} + +public final class NoticeComponent: Component, NoticeFactory { + public func makeView() -> UIViewController { + return NoticeViewController.viewController( + viewModel: .init( + fetchNoticeAllUseCase: dependency.fetchNoticeAllUseCase + ), + noticeDetailFactory: dependency.noticeDetailFactory + ) + } +} diff --git a/Projects/Features/MyInfoFeature/Sources/Components/NoticeDetailComponent.swift b/Projects/Features/MyInfoFeature/Sources/Components/NoticeDetailComponent.swift new file mode 100644 index 000000000..453b95e1f --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/Components/NoticeDetailComponent.swift @@ -0,0 +1,17 @@ +import Foundation +import MyInfoFeatureInterface +import NeedleFoundation +import NoticeDomainInterface +import UIKit + +public protocol NoticeDetailDependency: Dependency {} + +public final class NoticeDetailComponent: Component, NoticeDetailFactory { + public func makeView(model: FetchNoticeEntity) -> UIViewController { + return NoticeDetailViewController.viewController( + viewModel: .init( + model: model + ) + ) + } +} diff --git a/Projects/Features/MyInfoFeature/Sources/Components/OpenSourceLicenseComponent.swift b/Projects/Features/MyInfoFeature/Sources/Components/OpenSourceLicenseComponent.swift new file mode 100644 index 000000000..6f4f5242e --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/Components/OpenSourceLicenseComponent.swift @@ -0,0 +1,14 @@ +import Foundation +import MyInfoFeatureInterface +import NeedleFoundation +import UIKit + +public protocol OpenSourceLicenseDependency: Dependency {} + +public final class OpenSourceLicenseComponent: Component, OpenSourceLicenseFactory { + public func makeView() -> UIViewController { + return OpenSourceLicenseViewController.viewController( + viewModel: OpenSourceLicenseViewModel() + ) + } +} diff --git a/Projects/Features/MyInfoFeature/Sources/Components/PlayTypeTogglePopupComponent.swift b/Projects/Features/MyInfoFeature/Sources/Components/PlayTypeTogglePopupComponent.swift new file mode 100644 index 000000000..5866f6004 --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/Components/PlayTypeTogglePopupComponent.swift @@ -0,0 +1,15 @@ +import MyInfoFeatureInterface +import NeedleFoundation +import UIKit + +public final class PlayTypeTogglePopupComponent: Component, PlayTypeTogglePopupFactory { + public func makeView( + completion: ((_ selectedItemString: String) -> Void)? = nil, + cancelCompletion: (() -> Void)? = nil + ) -> UIViewController { + return PlayTypeTogglePopupViewController( + completion: completion, + cancelCompletion: cancelCompletion + ) + } +} diff --git a/Projects/Features/MyInfoFeature/Sources/Components/ProfilePopupComponent.swift b/Projects/Features/MyInfoFeature/Sources/Components/ProfilePopupComponent.swift new file mode 100644 index 000000000..275739b4e --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/Components/ProfilePopupComponent.swift @@ -0,0 +1,24 @@ +import AuthDomainInterface +import Foundation +import ImageDomainInterface +import MyInfoFeatureInterface +import NeedleFoundation +import UIKit +import UserDomainInterface + +public protocol ProfilePopupDependency: Dependency { + var fetchProfileListUseCase: any FetchProfileListUseCase { get } + var setProfileUseCase: any SetProfileUseCase { get } +} + +public final class ProfilePopupComponent: Component, ProfilePopupFactory { + public func makeView(completion: (() -> Void)?) -> UIViewController { + return ProfilePopupViewController.viewController( + viewModel: .init( + fetchProfileListUseCase: dependency.fetchProfileListUseCase, + setProfileUseCase: dependency.setProfileUseCase + ), + completion: completion + ) + } +} diff --git a/Projects/Features/MyInfoFeature/Sources/Components/QuestionComponent.swift b/Projects/Features/MyInfoFeature/Sources/Components/QuestionComponent.swift new file mode 100644 index 000000000..24bec9ab3 --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/Components/QuestionComponent.swift @@ -0,0 +1,18 @@ +import BaseFeatureInterface +import Foundation +import MyInfoFeatureInterface +import NeedleFoundation +import UIKit + +public protocol QuestionDependency: Dependency { + var textPopupFactory: any TextPopupFactory { get } +} + +public final class QuestionComponent: Component, QuestionFactory { + public func makeView() -> UIViewController { + return QuestionViewController.viewController( + viewModel: .init(), + textPopupFactory: dependency.textPopupFactory + ) + } +} diff --git a/Projects/Features/MyInfoFeature/Sources/Components/ServiceInfoComponent.swift b/Projects/Features/MyInfoFeature/Sources/Components/ServiceInfoComponent.swift new file mode 100644 index 000000000..6e968a0eb --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/Components/ServiceInfoComponent.swift @@ -0,0 +1,19 @@ +import BaseFeatureInterface +import MyInfoFeatureInterface +import NeedleFoundation +import UIKit + +public protocol ServiceInfoDependency: Dependency { + var openSourceLicenseFactory: any OpenSourceLicenseFactory { get } + var textPopupFactory: any TextPopupFactory { get } +} + +public final class ServiceInfoComponent: Component, ServiceInfoFactory { + public func makeView() -> UIViewController { + return ServiceInfoViewController.viewController( + viewModel: ServiceInfoViewModel(), + openSourceLicenseFactory: dependency.openSourceLicenseFactory, + textPopupFactory: dependency.textPopupFactory + ) + } +} diff --git a/Projects/Features/MyInfoFeature/Sources/Components/SettingComponent.swift b/Projects/Features/MyInfoFeature/Sources/Components/SettingComponent.swift new file mode 100644 index 000000000..a805b41c7 --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/Components/SettingComponent.swift @@ -0,0 +1,39 @@ +import AuthDomainInterface +import BaseFeature +import BaseFeatureInterface +import MyInfoFeatureInterface +import NeedleFoundation +import NotificationDomainInterface +import SignInFeatureInterface +import UIKit +import UserDomainInterface + +public protocol SettingDependency: Dependency { + var withdrawUserInfoUseCase: any WithdrawUserInfoUseCase { get } + var logoutUseCase: any LogoutUseCase { get } + var updateNotificationTokenUseCase: any UpdateNotificationTokenUseCase { get } + var textPopupFactory: any TextPopupFactory { get } + var signInFactory: any SignInFactory { get } + var serviceTermsFactory: any ServiceTermFactory { get } + var privacyFactory: any PrivacyFactory { get } + var openSourceLicenseFactory: any OpenSourceLicenseFactory { get } + var playTypeTogglePopupFactory: any PlayTypeTogglePopupFactory { get } +} + +public final class SettingComponent: Component, SettingFactory { + public func makeView() -> UIViewController { + return SettingViewController.viewController( + reactor: SettingReactor( + withDrawUserInfoUseCase: dependency.withdrawUserInfoUseCase, + logoutUseCase: dependency.logoutUseCase, + updateNotificationTokenUseCase: dependency.updateNotificationTokenUseCase + ), + textPopupFactory: dependency.textPopupFactory, + signInFactory: dependency.signInFactory, + serviceTermsFactory: dependency.serviceTermsFactory, + privacyFactory: dependency.privacyFactory, + openSourceLicenseFactory: dependency.openSourceLicenseFactory, + playTypeTogglePopupFactory: dependency.playTypeTogglePopupFactory + ) + } +} diff --git a/Projects/Features/MyInfoFeature/Sources/DataSource/SettingItemDataSource.swift b/Projects/Features/MyInfoFeature/Sources/DataSource/SettingItemDataSource.swift new file mode 100644 index 000000000..7c80780df --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/DataSource/SettingItemDataSource.swift @@ -0,0 +1,53 @@ +import MyInfoFeatureInterface +import UIKit + +class SettingItemDataSource: NSObject, UITableViewDataSource { + private let nonLoginSettingItems: [SettingItemType] = [ + .navigate(.appPush), + .navigate(.playType), + .navigate(.serviceTerms), + .navigate(.privacy), + .navigate(.openSource), + .navigate(.removeCache), + .description(.versionInfo) + ] + + private let loginSettingItems: [SettingItemType] = [ + .navigate(.appPush), + .navigate(.playType), + .navigate(.serviceTerms), + .navigate(.privacy), + .navigate(.openSource), + .navigate(.removeCache), + .navigate(.logout), + .description(.versionInfo) + ] + + private(set) var currentSettingItems: [SettingItemType] + + override init() { + currentSettingItems = nonLoginSettingItems + } + + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return currentSettingItems.count + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let item = currentSettingItems[indexPath.row] + guard let cell = tableView.dequeueReusableCell( + withIdentifier: SettingItemTableViewCell.reuseIdentifier, + for: indexPath + ) as? SettingItemTableViewCell else { + return UITableViewCell() + } + cell.configure(type: item) + return cell + } +} + +extension SettingItemDataSource { + func updateCurrentSettingItems(isHidden: Bool) { + currentSettingItems = isHidden ? nonLoginSettingItems : loginSettingItems + } +} diff --git a/Projects/Features/MyInfoFeature/Sources/Reactors/MyInfoReactor.swift b/Projects/Features/MyInfoFeature/Sources/Reactors/MyInfoReactor.swift new file mode 100644 index 000000000..f7ffbbc91 --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/Reactors/MyInfoReactor.swift @@ -0,0 +1,316 @@ +import BaseFeature +import Foundation +import Localization +import LogManager +import NoticeDomainInterface +import ReactorKit +import UserDomainInterface +import Utility + +final class MyInfoReactor: Reactor { + enum Action { + case viewDidLoad + case loginButtonDidTap + case profileImageDidTap + case drawButtonDidTap + case fruitNavigationDidTap + case faqNavigationDidTap + case notiNavigationDidTap + case mailNavigationDidTap + case teamNavigationDidTap + case settingNavigationDidTap + case completedFruitDraw + case completedSetProfile + case changeNicknameButtonDidTap(String) + case requiredLogin(CommonAnalyticsLog.LoginButtonEntry) + } + + enum Mutation { + case loginButtonDidTap + case profileImageDidTap + case navigate(NavigateType?) + case updateIsLoggedIn(Bool) + case updateProfileImage(String) + case updateNickname(String) + case updatePlatform(String) + case updateFruitCount(Int) + case updateIsAllNoticesRead(Bool) + case showToast(String) + case dismissEditSheet + } + + enum NavigateType { + case draw + case fruit + case faq + case noti + case mail + case team + case setting + case login(entry: CommonAnalyticsLog.LoginButtonEntry) + } + + struct State { + var isLoggedIn: Bool + var profileImage: String + var nickname: String + var platform: String + var fruitCount: Int + var isAllNoticesRead: Bool + @Pulse var loginButtonDidTap: Bool? + @Pulse var profileImageDidTap: Bool? + @Pulse var navigateType: NavigateType? + @Pulse var showToast: String? + @Pulse var dismissEditSheet: Bool? + } + + var initialState: State + private let fetchNoticeIDListUseCase: any FetchNoticeIDListUseCase + private let setUsernameUseCase: any SetUserNameUseCase + private let fetchUserInfoUseCase: any FetchUserInfoUseCase + private let myInfoCommonService: any MyInfoCommonService + private let disposeBag = DisposeBag() + + init( + fetchNoticeIDListUseCase: any FetchNoticeIDListUseCase, + setUserNameUseCase: any SetUserNameUseCase, + fetchUserInfoUseCase: any FetchUserInfoUseCase, + myInfoCommonService: any MyInfoCommonService = DefaultMyInfoCommonService.shared + ) { + self.fetchNoticeIDListUseCase = fetchNoticeIDListUseCase + self.setUsernameUseCase = setUserNameUseCase + self.fetchUserInfoUseCase = fetchUserInfoUseCase + self.myInfoCommonService = myInfoCommonService + self.initialState = .init( + isLoggedIn: false, + profileImage: "", + nickname: "", + platform: "", + fruitCount: 0, + isAllNoticesRead: false + ) + } + + func mutate(action: Action) -> Observable { + switch action { + case .viewDidLoad: + return viewDidLoad() + case .loginButtonDidTap: + return loginButtonDidTap() + case .profileImageDidTap: + return profileImageDidTap() + case .drawButtonDidTap: + return drawButtonDidTap() + case .fruitNavigationDidTap: + return fruitNavigationDidTap() + case .faqNavigationDidTap: + return faqNavigationDidTap() + case .notiNavigationDidTap: + return notiNavigationDidTap() + case .mailNavigationDidTap: + return mailNavigationDidTap() + case .teamNavigationDidTap: + return teamNavigationDidTap() + case .settingNavigationDidTap: + return settingNavigationDidTap() + case let .requiredLogin(entry): + return navigateLogin(entry: entry) + case .completedFruitDraw: + return mutateFetchUserInfo() + case .completedSetProfile: + return mutateFetchUserInfo() + case let .changeNicknameButtonDidTap(newNickname): + return mutateSetRemoteUserName(newNickname) + } + } + + func reduce(state: State, mutation: Mutation) -> State { + var newState = state + switch mutation { + case .loginButtonDidTap: + newState.loginButtonDidTap = true + + case .profileImageDidTap: + newState.profileImageDidTap = true + + case let .navigate(navigate): + newState.navigateType = navigate + + case let .updateIsLoggedIn(isLoggedIn): + newState.isLoggedIn = isLoggedIn + + case let .updateProfileImage(image): + newState.profileImage = image + + case let .updateNickname(nickname): + newState.nickname = nickname + + case let .updatePlatform(platform): + newState.platform = platform + + case let .updateIsAllNoticesRead(isAllNoticesRead): + newState.isAllNoticesRead = isAllNoticesRead + + case let .updateFruitCount(count): + newState.fruitCount = count + + case let .showToast(message): + newState.showToast = message + + case .dismissEditSheet: + newState.dismissEditSheet = true + } + return newState + } + + func transform(mutation: Observable) -> Observable { + let willRefreshUserInfoMutation = myInfoCommonService.willRefreshUserInfoEvent + .withUnretained(self) + .flatMap { owner, _ -> Observable in + return owner.mutateFetchUserInfo() + } + + let didChangedUserInfoMutation = myInfoCommonService.didChangedUserInfoEvent + .withUnretained(self) + .flatMap { owner, userInfo -> Observable in + return .concat( + owner.updateNickname(userInfo), + owner.updatePlatform(userInfo), + owner.updateFruitCount(userInfo), + owner.updateIsLoggedIn(userInfo), + owner.updateProfileImage(userInfo) + ) + } + + let didChangedReadNoticeIDsMutation = myInfoCommonService.didChangedReadNoticeIDsEvent + .withUnretained(self) + .flatMap { owner, readIDs -> Observable in + return owner.mutateFetchNoticeIDList(readIDs ?? []) + } + + return Observable.merge( + mutation, + willRefreshUserInfoMutation, + didChangedUserInfoMutation, + didChangedReadNoticeIDsMutation + ) + } +} + +private extension MyInfoReactor { + func viewDidLoad() -> Observable { + guard PreferenceManager.userInfo != nil else { return .empty() } + return mutateFetchUserInfo() + } + + func updateIsLoggedIn(_ userInfo: UserInfo?) -> Observable { + return .just(.updateIsLoggedIn(userInfo != nil)) + } + + func updateProfileImage(_ userInfo: UserInfo?) -> Observable { + guard let profile = userInfo?.profile else { return .empty() } + return .just(.updateProfileImage(profile)) + } + + func updateNickname(_ userInfo: UserInfo?) -> Observable { + guard let userInfo = userInfo else { return .empty() } + return .just(.updateNickname(userInfo.decryptedName)) + } + + func updatePlatform(_ userInfo: UserInfo?) -> Observable { + guard let platform = userInfo?.platform else { return .empty() } + return .just(.updatePlatform(platform)) + } + + func updateFruitCount(_ userInfo: UserInfo?) -> Observable { + guard let count = userInfo?.itemCount else { + return .just(.updateFruitCount(-1)) + } + return .just(.updateFruitCount(count)) + } + + func loginButtonDidTap() -> Observable { + return .just(.loginButtonDidTap) + } + + func profileImageDidTap() -> Observable { + return .just(.profileImageDidTap) + } + + func drawButtonDidTap() -> Observable { + return .just(.navigate(.draw)) + } + + func fruitNavigationDidTap() -> Observable { + return .just(.navigate(.fruit)) + } + + func faqNavigationDidTap() -> Observable { + return .just(.navigate(.faq)) + } + + func notiNavigationDidTap() -> Observable { + return .just(.navigate(.noti)) + } + + func mailNavigationDidTap() -> Observable { + return .just(.navigate(.mail)) + } + + func teamNavigationDidTap() -> Observable { + return .just(.navigate(.team)) + } + + func settingNavigationDidTap() -> Observable { + return .just(.navigate(.setting)) + } + + func navigateLogin(entry: CommonAnalyticsLog.LoginButtonEntry) -> Observable { + return .just(.navigate(.login(entry: entry))) + } +} + +private extension MyInfoReactor { + func mutateFetchUserInfo() -> Observable { + return fetchUserInfoUseCase.execute() + .asObservable() + .flatMap { _ in Observable.empty() } + .catch { error in + let error = error.asWMError + return Observable.just(.showToast(error.errorDescription ?? LocalizationStrings.unknownErrorWarning)) + } + } + + func mutateSetRemoteUserName(_ newNickname: String) -> Observable { + setUsernameUseCase.execute(name: newNickname) + .andThen( + fetchUserInfoUseCase.execute() + .asObservable() + .flatMap { _ -> Observable in + return .concat( + .just(.showToast("닉네임이 변경되었습니다.")), + .just(.dismissEditSheet) + ) + } + ) + .catch { error in + let error = error.asWMError + return .concat( + .just(.showToast(error.errorDescription ?? LocalizationStrings.unknownErrorWarning)), + .just(.dismissEditSheet) + ) + } + } + + func mutateFetchNoticeIDList(_ readIDs: [Int]) -> Observable { + return fetchNoticeIDListUseCase.execute() + .catchAndReturn(FetchNoticeIDListEntity(status: "404", data: [])) + .asObservable() + .map { + let readIDsSet = Set(readIDs) + let allNoticeIDsSet = Set($0.data) + return allNoticeIDsSet.isSubset(of: readIDsSet) + } + .map { Mutation.updateIsAllNoticesRead($0) } + } +} diff --git a/Projects/Features/MyInfoFeature/Sources/Reactors/SettingReactor.swift b/Projects/Features/MyInfoFeature/Sources/Reactors/SettingReactor.swift new file mode 100644 index 000000000..785ecf21b --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/Reactors/SettingReactor.swift @@ -0,0 +1,349 @@ +import AuthDomainInterface +import BaseDomainInterface +import FirebaseMessaging +import Foundation +import Kingfisher +import LogManager +import NaverThirdPartyLogin +import NotificationDomainInterface +import ReactorKit +import UserDomainInterface +import Utility + +final class SettingReactor: Reactor { + enum Action { + case dismissButtonDidTap + case withDrawButtonDidTap + case confirmWithDrawButtonDidTap + case appPushSettingNavigationDidTap + case serviceTermsNavigationDidTap + case privacyNavigationDidTap + case openSourceNavigationDidTap + case removeCacheButtonDidTap + case confirmRemoveCacheButtonDidTap + case confirmLogoutButtonDidTap + case versionInfoButtonDidTap + case showToast(String) + } + + enum Mutation { + case navigate(NavigateType?) + case withDrawButtonDidTap + case removeCacheButtonDidTap(cacheSize: String) + case confirmRemoveCacheButtonDidTap + case showToast(String) + case withDrawResult(BaseEntity) + case updateIsHiddenLogoutButton(Bool) + case updateIsHiddenWithDrawButton(Bool) + case changedNotificationAuthorizationStatus(Bool) + case updateIsShowActivityIndicator(Bool) + case reloadTableView + } + + enum NavigateType { + case dismiss + case appPushSetting + case serviceTerms + case privacy + case openSource + } + + struct State { + var userInfo: UserInfo? + var isHiddenLogoutButton: Bool + var isHiddenWithDrawButton: Bool + var notificationAuthorizationStatus: Bool + var isShowActivityIndicator: Bool + @Pulse var cacheSize: String? + @Pulse var toastMessage: String? + @Pulse var navigateType: NavigateType? + @Pulse var withDrawButtonDidTap: Bool? + @Pulse var confirmRemoveCacheButtonDidTap: Bool? + @Pulse var withDrawResult: BaseEntity? + @Pulse var reloadTableView: Void? + } + + var initialState: State + private var disposeBag = DisposeBag() + private let withDrawUserInfoUseCase: any WithdrawUserInfoUseCase + private let logoutUseCase: any LogoutUseCase + private let updateNotificationTokenUseCase: any UpdateNotificationTokenUseCase + private let naverLoginInstance = NaverThirdPartyLoginConnection.getSharedInstance() + + init( + withDrawUserInfoUseCase: WithdrawUserInfoUseCase, + logoutUseCase: LogoutUseCase, + updateNotificationTokenUseCase: UpdateNotificationTokenUseCase + ) { + self.initialState = .init( + userInfo: Utility.PreferenceManager.userInfo, + isHiddenLogoutButton: true, + isHiddenWithDrawButton: true, + notificationAuthorizationStatus: PreferenceManager.pushNotificationAuthorizationStatus ?? false, + isShowActivityIndicator: false + ) + self.withDrawUserInfoUseCase = withDrawUserInfoUseCase + self.logoutUseCase = logoutUseCase + self.updateNotificationTokenUseCase = updateNotificationTokenUseCase + } + + func mutate(action: Action) -> Observable { + switch action { + case .dismissButtonDidTap: + return dismissButtonDidTap() + case .withDrawButtonDidTap: + return withDrawButtonDidTap() + case .appPushSettingNavigationDidTap: + return appPushSettingNavigationDidTap() + case .serviceTermsNavigationDidTap: + return serviceTermsNavigationDidTap() + case .privacyNavigationDidTap: + return privacyNavigationDidTap() + case .openSourceNavigationDidTap: + return openSourceNavigationDidTap() + case .removeCacheButtonDidTap: + return removeCacheButtonDidTap() + case .versionInfoButtonDidTap: + return versionInfoButtonDidTap() + case .confirmRemoveCacheButtonDidTap: + return confirmRemoveCacheButtonDidTap() + case .confirmLogoutButtonDidTap: + return confirmLogoutButtonDidTap() + case let .showToast(message): + return showToast(message: message) + case .confirmWithDrawButtonDidTap: + return confirmWithDrawButtonDidTap() + } + } + + func reduce(state: State, mutation: Mutation) -> State { + var newState = state + switch mutation { + case let .navigate(navigate): + newState.navigateType = navigate + case .withDrawButtonDidTap: + newState.withDrawButtonDidTap = true + case let .removeCacheButtonDidTap(cacheSize): + newState.cacheSize = cacheSize + case .confirmRemoveCacheButtonDidTap: + newState.confirmRemoveCacheButtonDidTap = true + case let .showToast(message): + newState.toastMessage = message + case let .withDrawResult(withDrawResult): + newState.withDrawResult = withDrawResult + case let .updateIsHiddenLogoutButton(isHiddenLogoutButton): + newState.isHiddenLogoutButton = isHiddenLogoutButton + case let .updateIsHiddenWithDrawButton(isHiddenWithDrawButton): + newState.isHiddenWithDrawButton = isHiddenWithDrawButton + case let .changedNotificationAuthorizationStatus(granted): + newState.notificationAuthorizationStatus = granted + case let .updateIsShowActivityIndicator(isShow): + newState.isShowActivityIndicator = isShow + case .reloadTableView: + newState.reloadTableView = () + } + return newState + } + + func transform(mutation: Observable) -> Observable { + let updateIsLoggedInMutation = PreferenceManager.$userInfo.map { $0?.ID } + .distinctUntilChanged() + .map { $0 != nil } + .withUnretained(self) + .flatMap { owner, isLoggedIn -> Observable in + return .concat( + owner.updateIsHiddenLogoutButton(isLoggedIn), + owner.updateIsHiddenWithDrawButton(isLoggedIn) + ) + } + + let updatepushNotificationAuthorizationStatusMutation = PreferenceManager.$pushNotificationAuthorizationStatus + .skip(1) + .distinctUntilChanged() + .map { $0 ?? false } + .flatMap { granted -> Observable in + return .just(.changedNotificationAuthorizationStatus(granted)) + } + + let updatePlayTypeMutation = PreferenceManager.$songPlayPlatformType + .distinctUntilChanged() + .map { $0 ?? .youtube } + .flatMap { playType -> Observable in + return .just(.reloadTableView) + } + + return Observable.merge( + mutation, + updateIsLoggedInMutation, + updatepushNotificationAuthorizationStatusMutation, + updatePlayTypeMutation + ) + } +} + +private extension SettingReactor { + func updateIsHiddenLogoutButton(_ isLoggedIn: Bool) -> Observable { + let isHidden = isLoggedIn == false + return .just(.updateIsHiddenLogoutButton(isHidden)) + } + + func updateIsHiddenWithDrawButton(_ isLoggedIn: Bool) -> Observable { + let isHidden = isLoggedIn == false + return .just(.updateIsHiddenWithDrawButton(isHidden)) + } + + func dismissButtonDidTap() -> Observable { + return .just(.navigate(.dismiss)) + } + + func confirmLogoutButtonDidTap() -> Observable { + let notificationGranted = PreferenceManager.pushNotificationAuthorizationStatus ?? false + let logoutUseCase = logoutUseCase.execute(localOnly: false) + .andThen( + .concat( + .just(.updateIsHiddenLogoutButton(true)), + .just(.updateIsHiddenWithDrawButton(true)), + .just(.showToast("로그아웃 되었습니다.")) + ) + ) + .catch { error in + let description = error.asWMError.errorDescription ?? "" + return Observable.just(Mutation.showToast(description)) + } + + if notificationGranted { + return Messaging.messaging().fetchRxPushToken() + .asObservable() + .catchAndReturn("") + .flatMap { [updateNotificationTokenUseCase] token -> Observable in + return token.isEmpty ? + Observable.just(()) : + updateNotificationTokenUseCase.execute(type: .delete) + .andThen(Observable.just(())) + .catchAndReturn(()) + } + .flatMap { _ in + return Observable.concat( + .just(.updateIsShowActivityIndicator(true)), + logoutUseCase, + .just(.updateIsShowActivityIndicator(false)) + ) + } + + } else { + return Observable.concat( + .just(.updateIsShowActivityIndicator(true)), + logoutUseCase, + .just(.updateIsShowActivityIndicator(false)) + ) + } + } + + func withDrawButtonDidTap() -> Observable { + return .just(.withDrawButtonDidTap) + } + + func confirmWithDrawButtonDidTap() -> Observable { + return withDrawUserInfoUseCase.execute() + .andThen( + .concat( + handleThirdPartyWithDraw(), + clearUserInfo() + ) + ) + .catch { error in + let baseEntity = BaseEntity( + status: 0, + description: error.asWMError.errorDescription ?? "" + ) + return Observable.just(baseEntity) + } + .map { Mutation.withDrawResult($0) } + } + + func appPushSettingNavigationDidTap() -> Observable { + return .just(.navigate(.appPushSetting)) + } + + func serviceTermsNavigationDidTap() -> Observable { + return .just(.navigate(.serviceTerms)) + } + + func privacyNavigationDidTap() -> Observable { + return .just(.navigate(.privacy)) + } + + func openSourceNavigationDidTap() -> Observable { + return .just(.navigate(.openSource)) + } + + func removeCacheButtonDidTap() -> Observable { + calculateCacheSize() + .asObservable() + .map { cacheSize in + Mutation.removeCacheButtonDidTap(cacheSize: cacheSize) + } + } + + func confirmRemoveCacheButtonDidTap() -> Observable { + return Completable.create { completable in + ImageCache.default.clearCache { + completable(.completed) + } + return Disposables.create() + } + .andThen( + Observable.just(Mutation.showToast("캐시 데이터가 삭제되었습니다.")) + ) + } + + func calculateCacheSize() -> Single { + return Single.create { single in + ImageCache.default.calculateDiskStorageSize { result in + switch result { + case let .success(size): + let formatter = ByteCountFormatter() + formatter.allowedUnits = .useAll + formatter.countStyle = .decimal + + let sizeString = formatter.string(fromByteCount: Int64(size)) + single(.success(sizeString)) + case let .failure(error): + let description = error.asWMError.errorDescription ?? "" + single(.success(description)) + } + } + return Disposables.create() + } + } + + func versionInfoButtonDidTap() -> Observable { + return .empty() + } + + func showToast(message: String) -> Observable { + return .just(.showToast(message)) + } +} + +private extension SettingReactor { + func handleThirdPartyWithDraw() -> Observable { + let platform = Utility.PreferenceManager.userInfo?.platform + if platform == "naver" { + naverLoginInstance?.requestDeleteToken() + } + return .empty() + } + + func clearUserInfo() -> Observable { + PreferenceManager.clearUserInfo() + return Observable.create { observable in + observable.onNext(BaseEntity( + status: 200, + description: "" + )) + observable.onCompleted() + return Disposables.create {} + } + } +} diff --git a/Projects/Features/MyInfoFeature/Sources/Service/MyInfoCommonService.swift b/Projects/Features/MyInfoFeature/Sources/Service/MyInfoCommonService.swift new file mode 100644 index 000000000..bf251b766 --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/Service/MyInfoCommonService.swift @@ -0,0 +1,24 @@ +import Foundation +import RxSwift +import Utility + +protocol MyInfoCommonService { + var willRefreshUserInfoEvent: Observable { get } + var didChangedUserInfoEvent: Observable { get } + var didChangedReadNoticeIDsEvent: Observable<[Int]?> { get } +} + +final class DefaultMyInfoCommonService: MyInfoCommonService { + let willRefreshUserInfoEvent: Observable + let didChangedUserInfoEvent: Observable + let didChangedReadNoticeIDsEvent: Observable<[Int]?> + + static let shared = DefaultMyInfoCommonService() + + init() { + let notificationCenter = NotificationCenter.default + willRefreshUserInfoEvent = notificationCenter.rx.notification(.willRefreshUserInfo) + didChangedUserInfoEvent = PreferenceManager.$userInfo + didChangedReadNoticeIDsEvent = PreferenceManager.$readNoticeIDs + } +} diff --git a/Projects/Features/MyInfoFeature/Sources/ViewControllers/FAQ/FaqContentViewController.swift b/Projects/Features/MyInfoFeature/Sources/ViewControllers/FAQ/FaqContentViewController.swift new file mode 100644 index 000000000..7b4c0c542 --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/ViewControllers/FAQ/FaqContentViewController.swift @@ -0,0 +1,123 @@ +import BaseFeature +import LogManager +import RxCocoa +import RxRelay +import RxSwift +import UIKit +import Utility + +public final class FaqContentViewController: UIViewController, ViewControllerFromStoryBoard { + @IBOutlet weak var tableView: UITableView! + + var viewModel: QnaContentViewModel! + + override public func viewDidLoad() { + super.viewDidLoad() + configureUI() + } + + override public func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + navigationController?.interactivePopGestureRecognizer?.delegate = nil // 스와이프로 뒤로가기 + } + + public static func viewController(viewModel: QnaContentViewModel) -> FaqContentViewController { + let viewController = FaqContentViewController.viewController(storyBoardName: "Faq", bundle: Bundle.module) + viewController.viewModel = viewModel + return viewController + } +} + +extension FaqContentViewController { + private func configureUI() { + tableView.dataSource = self + tableView.delegate = self + let space = APP_HEIGHT() - 106 - STATUS_BAR_HEGHIT() - SAFEAREA_BOTTOM_HEIGHT() + let height = space / 3 * 2 + let warningView = WarningView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: height)) + warningView.text = "자주 묻는 질문이 없습니다." + tableView.tableFooterView = viewModel.dataSource.isEmpty ? warningView : UIView(frame: CGRect( + x: 0, + y: 0, + width: APP_WIDTH(), + height: PLAYER_HEIGHT() + )) + tableView.reloadData() + } + + private func scrollToBottom(indexPath: IndexPath) { + DispatchQueue.main.async { + self.tableView.scrollToRow(at: indexPath, at: .middle, animated: true) + } + } +} + +extension FaqContentViewController: UITableViewDataSource { + public func numberOfSections(in tableView: UITableView) -> Int { + return viewModel.dataSource.count + } + + public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + let data = viewModel.dataSource[section] + var count: Int = 0 + + if data.isOpen { + count = 2 + } else { + count = 1 + } + return count + } + + public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + guard let questionCell = tableView + .dequeueReusableCell(withIdentifier: "QuestionTableViewCell", for: indexPath) as? QuestionTableViewCell + else { + return UITableViewCell() + } + guard let answerCell = tableView + .dequeueReusableCell(withIdentifier: "AnswerTableViewCell", for: indexPath) as? AnswerTableViewCell else { + return UITableViewCell() + } + + var data = viewModel.dataSource + + questionCell.update(model: data[indexPath.section]) + questionCell.selectionStyle = .none // 선택 시 깜빡임 방지 + answerCell.update(model: data[indexPath.section]) + answerCell.selectionStyle = .none + + // 왜 Row는 인덱스 개념이다 0 부터 시작?? + if indexPath.row == 0 { + return questionCell + } else { + return answerCell + } + } +} + +extension FaqContentViewController: UITableViewDelegate { + public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + tableView.deselectRow(at: indexPath, animated: true) + + var data = viewModel.dataSource + + data[indexPath.section].isOpen = !data[indexPath.section].isOpen + + viewModel.dataSource = data + + tableView.reloadSections([indexPath.section], with: .none) + + let next = IndexPath(row: 1, section: indexPath.section) // row 1이 답변 쪽 + + if data[indexPath.section].isOpen { + self.scrollToBottom(indexPath: next) + let title = data[indexPath.section].question + LogManager.analytics(FAQAnalyticsLog.clickFaqItem(title: title)) + } + } + + public func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + return UITableView.automaticDimension + } +} diff --git a/Projects/Features/MyInfoFeature/Sources/ViewControllers/FAQ/FaqViewController.swift b/Projects/Features/MyInfoFeature/Sources/ViewControllers/FAQ/FaqViewController.swift new file mode 100644 index 000000000..6c395ef6a --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/ViewControllers/FAQ/FaqViewController.swift @@ -0,0 +1,162 @@ +import DesignSystem +import LogManager +import MyInfoFeatureInterface +import NVActivityIndicatorView +import Pageboy +import RxSwift +import Tabman +import UIKit +import Utility + +public final class FaqViewController: TabmanViewController, ViewControllerFromStoryBoard { + @IBOutlet weak var backButton: UIButton! + @IBOutlet weak var titleLabel: UILabel! + @IBOutlet weak var tabBarView: UIView! + @IBOutlet weak var activityIndicator: NVActivityIndicatorView! + + @IBAction func pressBackAction(_ sender: UIButton) { + self.navigationController?.popViewController(animated: true) + } + + override public func viewDidLoad() { + super.viewDidLoad() + configureUI() + bindRx() + } + + override public func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + navigationController?.interactivePopGestureRecognizer?.delegate = nil // 스와이프로 뒤로가기 + } + + var disposeBag = DisposeBag() + var viewModel: FaqViewModel! + var faqContentFactory: FaqContentFactory! + lazy var input = FaqViewModel.Input() + lazy var output = viewModel.transform(from: input) + + var viewControllers: [UIViewController] = [] + + public static func viewController( + viewModel: FaqViewModel, + faqContentFactory: FaqContentFactory + ) -> FaqViewController { + let viewController = FaqViewController.viewController(storyBoardName: "Faq", bundle: Bundle.module) + viewController.viewModel = viewModel + viewController.faqContentFactory = faqContentFactory + return viewController + } + + override public func pageboyViewController( + _ pageboyViewController: PageboyViewController, + didScrollToPageAt index: TabmanViewController.PageIndex, + direction: PageboyViewController.NavigationDirection, + animated: Bool + ) { + super.pageboyViewController( + pageboyViewController, + didScrollToPageAt: index, + direction: direction, + animated: animated + ) + + let titles = output.dataSource.value.0 + if let selectedTitle = titles[safe: index]?.trimmingCharacters(in: .whitespaces) { + LogManager.analytics(FAQAnalyticsLog.selectFaqCategory(category: selectedTitle)) + } + } +} + +extension FaqViewController { + private func configureUI() { + self.backButton.setImage(DesignSystemAsset.Navigation.back.image, for: .normal) + self.titleLabel.font = .setFont(.t5(weight: .medium)) + self.titleLabel.setTextWithAttributes( + lineHeight: UIFont.WMFontSystem.t5(weight: .medium).lineHeight, + kernValue: -0.5 + ) + self.activityIndicator.type = .circleStrokeSpin + self.activityIndicator.color = DesignSystemAsset.PrimaryColor.point.color + self.activityIndicator.startAnimating() + + // 탭바 설정 + self.dataSource = self + let bar = TMBar.ButtonBar() + + // 배경색 + bar.backgroundView.style = .flat(color: colorFromRGB(0xF0F3F6)) + + // 간격 설정 + bar.layout.contentInset = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20) + bar.layout.contentMode = .intrinsic + bar.layout.transitionStyle = .progressive + + // 버튼 글씨 커스텀 + bar.buttons.customize { button in + button.tintColor = DesignSystemAsset.GrayColor.gray400.color + button.selectedTintColor = DesignSystemAsset.GrayColor.gray900.color + button.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) + button.selectedFont = DesignSystemFontFamily.Pretendard.bold.font(size: 16) + } + + // indicator + bar.indicator.weight = .custom(value: 2) + bar.indicator.tintColor = DesignSystemAsset.PrimaryColor.point.color + bar.indicator.overscrollBehavior = .compress + addBar(bar, dataSource: self, at: .custom(view: tabBarView, layout: nil)) + + // 회색 구분선 추가 + bar.layer.addBorder( + [.bottom], + color: DesignSystemAsset.GrayColor.gray300.color.withAlphaComponent(0.4), + height: 1 + ) + } + + func bindRx() { + output.dataSource + .skip(1) + .do(onNext: { [weak self] _, _ in + self?.activityIndicator.stopAnimating() + }) + .subscribe { [weak self] categories, qna in + guard let self = self else { return } + guard let factory = self.faqContentFactory else { return } + + self.viewControllers = categories.enumerated().map { i, c in + if i == 0 { + return factory.makeView(dataSource: qna) + } else { + return factory.makeView(dataSource: qna.filter { + $0.category.replacingOccurrences(of: " ", with: "") == c + .replacingOccurrences(of: " ", with: "") + }) + } + } + self.reloadData() + }.disposed(by: disposeBag) + } +} + +extension FaqViewController: PageboyViewControllerDataSource, TMBarDataSource { + public func numberOfViewControllers(in pageboyViewController: Pageboy.PageboyViewController) -> Int { + LogManager.printDebug(self.viewControllers.count) + return self.viewControllers.count + } + + public func viewController( + for pageboyViewController: Pageboy.PageboyViewController, + at index: Pageboy.PageboyViewController.PageIndex + ) -> UIViewController? { + viewControllers[index] + } + + public func defaultPage(for pageboyViewController: Pageboy.PageboyViewController) -> Pageboy.PageboyViewController + .Page? { + nil + } + + public func barItem(for bar: Tabman.TMBar, at index: Int) -> Tabman.TMBarItemable { + return TMBarItem(title: output.dataSource.value.0[index]) + } +} diff --git a/Projects/Features/MyInfoFeature/Sources/ViewControllers/MyInfo/MyInfoViewController.swift b/Projects/Features/MyInfoFeature/Sources/ViewControllers/MyInfo/MyInfoViewController.swift new file mode 100644 index 000000000..60cb00400 --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/ViewControllers/MyInfo/MyInfoViewController.swift @@ -0,0 +1,354 @@ +import BaseFeature +import BaseFeatureInterface +import DesignSystem +import Foundation +import FruitDrawFeatureInterface +import Localization +import LogManager +import MyInfoFeatureInterface +import RxSwift +import SignInFeatureInterface +import SnapKit +import TeamFeatureInterface +import Then +import UIKit +import Utility + +final class MyInfoViewController: BaseReactorViewController, EditSheetViewType { + let myInfoView = MyInfoView() + private var profilePopupFactory: ProfilePopupFactory! + private var textPopupFactory: TextPopupFactory! + private var multiPurposePopupFactory: MultiPurposePopupFactory! + private var signInFactory: SignInFactory! + private var faqFactory: FaqFactory! // 자주 묻는 질문 + private var noticeFactory: NoticeFactory! // 공지사항 + private var questionFactory: QuestionFactory! // 문의하기 + private var teamInfoFactory: TeamInfoFactory! // 팀 소개 + private var settingFactory: SettingFactory! + private var fruitDrawFactory: FruitDrawFactory! + private var fruitStorageFactory: FruitStorageFactory! + + var editSheetView: EditSheetView! + var bottomSheetView: BottomSheetView! + + override func configureNavigation() { + self.navigationController?.setNavigationBarHidden(true, animated: true) + } + + override func loadView() { + view = myInfoView + } + + override func viewDidLoad() { + super.viewDidLoad() + reactor?.action.onNext(.viewDidLoad) + } + + override public func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + navigationController?.interactivePopGestureRecognizer?.delegate = self + LogManager.analytics(CommonAnalyticsLog.viewPage(pageName: .myPage)) + } + + override public func viewDidDisappear(_ animated: Bool) { + super.viewDidDisappear(animated) + navigationController?.interactivePopGestureRecognizer?.delegate = nil + hideEditSheet() + } + + public static func viewController( + reactor: MyInfoReactor, + profilePopupFactory: ProfilePopupFactory, + textPopupFactory: TextPopupFactory, + multiPurposePopupFactory: MultiPurposePopupFactory, + signInFactory: SignInFactory, + faqFactory: FaqFactory, + noticeFactory: NoticeFactory, + questionFactory: QuestionFactory, + teamInfoFactory: TeamInfoFactory, + settingFactory: SettingFactory, + fruitDrawFactory: FruitDrawFactory, + fruitStorageFactory: FruitStorageFactory + ) -> MyInfoViewController { + let viewController = MyInfoViewController(reactor: reactor) + viewController.profilePopupFactory = profilePopupFactory + viewController.textPopupFactory = textPopupFactory + viewController.multiPurposePopupFactory = multiPurposePopupFactory + viewController.signInFactory = signInFactory + viewController.faqFactory = faqFactory + viewController.noticeFactory = noticeFactory + viewController.questionFactory = questionFactory + viewController.teamInfoFactory = teamInfoFactory + viewController.settingFactory = settingFactory + viewController.fruitDrawFactory = fruitDrawFactory + viewController.fruitStorageFactory = fruitStorageFactory + return viewController + } + + override func bindState(reactor: MyInfoReactor) { + reactor.pulse(\.$showToast) + .compactMap { $0 } + .bind(with: self, onNext: { owner, message in + owner.showToast(text: message, options: [.tabBar]) + }) + .disposed(by: disposeBag) + + reactor.state.map(\.isAllNoticesRead) + .skip(1) + .distinctUntilChanged() + .bind(with: self) { owner, isAllNoticesRead in + owner.myInfoView.newNotiIndicator.isHidden = isAllNoticesRead + } + .disposed(by: disposeBag) + + reactor.state.map(\.isLoggedIn) + .distinctUntilChanged() + .bind(with: self) { owner, isLoggedIn in + owner.myInfoView.updateIsHiddenLoginWarningView(isLoggedIn: isLoggedIn) + } + .disposed(by: disposeBag) + + reactor.state.map(\.profileImage) + .distinctUntilChanged() + .bind(with: self) { owner, image in + owner.myInfoView.profileView.updateProfileImage(image: image) + } + .disposed(by: disposeBag) + + reactor.state.map(\.nickname) + .distinctUntilChanged() + .bind(with: self) { owner, nickname in + owner.myInfoView.profileView.updateNickName(nickname: nickname) + } + .disposed(by: disposeBag) + + reactor.state.map(\.platform) + .distinctUntilChanged() + .bind(with: self) { owner, platform in + owner.myInfoView.profileView.updatePlatform(platform: platform) + } + .disposed(by: disposeBag) + + reactor.state.map(\.fruitCount) + .distinctUntilChanged() + .bind(with: self) { owner, count in + owner.myInfoView.updateFruitCount(count: count) + } + .disposed(by: disposeBag) + + reactor.pulse(\.$loginButtonDidTap) + .compactMap { $0 } + .bind(with: self) { owner, _ in + let log = CommonAnalyticsLog.clickLoginButton(entry: .mypage) + LogManager.analytics(log) + + let vc = owner.signInFactory.makeView() + vc.modalPresentationStyle = .fullScreen + owner.present(vc, animated: true) + } + .disposed(by: disposeBag) + + reactor.pulse(\.$profileImageDidTap) + .compactMap { $0 } + .bind(with: self, onNext: { owner, _ in + owner.showEditSheet(in: owner.view, type: .profile) + owner.editSheetView.delegate = owner + }) + .disposed(by: disposeBag) + + reactor.pulse(\.$dismissEditSheet) + .compactMap { $0 } + .bind(with: self, onNext: { owner, _ in + owner.hideEditSheet() + }) + .disposed(by: disposeBag) + + reactor.pulse(\.$navigateType) + .compactMap { $0 } + .bind(with: self) { owner, navigate in + switch navigate { + case .draw: + if reactor.currentState.isLoggedIn { + let viewController = owner.fruitDrawFactory.makeView(delegate: owner) + viewController.modalPresentationStyle = .fullScreen + owner.present(viewController, animated: true) + } else { + reactor.action.onNext(.requiredLogin(.fruitDraw)) + } + case .fruit: + if reactor.currentState.isLoggedIn { + let viewController = owner.fruitStorageFactory.makeView() + owner.navigationController?.pushViewController(viewController, animated: true) + } else { + reactor.action.onNext(.requiredLogin(.fruitStorage)) + } + case .faq: + let vc = owner.faqFactory.makeView() + owner.navigationController?.pushViewController(vc, animated: true) + case .noti: + let vc = owner.noticeFactory.makeView() + owner.navigationController?.pushViewController(vc, animated: true) + case .mail: + let vc = owner.questionFactory.makeView() + vc.modalPresentationStyle = .overFullScreen + owner.present(vc, animated: true) + case .team: + let vc = owner.teamInfoFactory.makeView() + owner.navigationController?.pushViewController(vc, animated: true) + case .setting: + let vc = owner.settingFactory.makeView() + owner.navigationController?.pushViewController(vc, animated: true) + case let .login(entry): + let vc = owner.textPopupFactory.makeView( + text: LocalizationStrings.needLoginWarning, + cancelButtonIsHidden: false, + confirmButtonText: nil, + cancelButtonText: nil, + completion: { + switch entry { + case .fruitDraw: + let log = CommonAnalyticsLog.clickLoginButton(entry: .fruitDraw) + LogManager.analytics(log) + case .fruitStorage: + let log = CommonAnalyticsLog.clickLoginButton(entry: .fruitStorage) + LogManager.analytics(log) + default: + assertionFailure("예상치 못한 entry가 들어옴") + LogManager.printDebug("예상치 못한 entry가 들어옴") + } + + let loginVC = owner.signInFactory.makeView() + loginVC.modalPresentationStyle = .fullScreen + owner.present(loginVC, animated: true) + }, + cancelCompletion: {} + ) + owner.showBottomSheet(content: vc) + } + } + .disposed(by: disposeBag) + } + + override func bindAction(reactor: MyInfoReactor) { + myInfoView.rx.loginButtonDidTap + .throttle(.milliseconds(500), latest: false, scheduler: MainScheduler.asyncInstance) + .map { MyInfoReactor.Action.loginButtonDidTap } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + myInfoView.rx.profileImageDidTap + .do(onNext: { LogManager.analytics(MyInfoAnalyticsLog.clickProfileImage) }) + .map { MyInfoReactor.Action.profileImageDidTap } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + myInfoView.rx.fruitStorageButtonDidTap + .do(onNext: { LogManager.analytics(MyInfoAnalyticsLog.clickFruitStorageButton) }) + .map { MyInfoReactor.Action.fruitNavigationDidTap } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + myInfoView.rx.drawButtonDidTap + .do(onNext: { LogManager.analytics(MyInfoAnalyticsLog.clickFruitDrawEntryButton(location: .myPage)) }) + .map { MyInfoReactor.Action.drawButtonDidTap } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + myInfoView.rx.fruitNavigationButtonDidTap + .do(onNext: { LogManager.analytics(MyInfoAnalyticsLog.clickFruitStorageButton) }) + .map { MyInfoReactor.Action.fruitNavigationDidTap } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + #warning("자주묻는질문 qna -> faq 로 변경하기") + myInfoView.rx.qnaNavigationButtonDidTap + .do(onNext: { LogManager.analytics(MyInfoAnalyticsLog.clickFaqButton) }) + .map { MyInfoReactor.Action.faqNavigationDidTap } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + myInfoView.rx.notiNavigationButtonDidTap + .do(onNext: { LogManager.analytics(MyInfoAnalyticsLog.clickNoticeButton) }) + .map { MyInfoReactor.Action.notiNavigationDidTap } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + #warning("문의하기 mail -> qna 로 변경하기") + myInfoView.rx.mailNavigationButtonDidTap + .do(onNext: { LogManager.analytics(MyInfoAnalyticsLog.clickInquiryButton) }) + .map { MyInfoReactor.Action.mailNavigationDidTap } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + myInfoView.rx.teamNavigationButtonDidTap + .do(onNext: { LogManager.analytics(MyInfoAnalyticsLog.clickTeamButton) }) + .map { MyInfoReactor.Action.teamNavigationDidTap } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + myInfoView.rx.settingNavigationButtonDidTap + .do(onNext: { LogManager.analytics(MyInfoAnalyticsLog.clickSettingButton) }) + .map { MyInfoReactor.Action.settingNavigationDidTap } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + myInfoView.rx.scrollViewDidTap + .bind(with: self) { owner, _ in + owner.hideEditSheet() + }.disposed(by: disposeBag) + } +} + +extension MyInfoViewController: UIGestureRecognizerDelegate { + public func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { + return false + } +} + +extension MyInfoViewController: EditSheetViewDelegate { + func buttonTapped(type: EditSheetSelectType) { + switch type { + case .edit: + break + case .share: + break + case .profile: + LogManager.analytics(MyInfoAnalyticsLog.clickProfileChangeButton) + let vc = profilePopupFactory.makeView( + completion: { [reactor] () in + LogManager.analytics(MyInfoAnalyticsLog.completeProfileChange) + reactor?.action.onNext(.completedSetProfile) + } + ) + let height: CGFloat = (ProfilePopupViewController.rowHeight * 2) + 10 + showBottomSheet(content: vc, size: .fixed(190 + height + SAFEAREA_BOTTOM_HEIGHT())) + case .nickname: + LogManager.analytics(MyInfoAnalyticsLog.clickNicknameChangeButton) + let vc = multiPurposePopupFactory.makeView( + type: .nickname, + key: "", + completion: { [reactor] text in + LogManager.analytics(MyInfoAnalyticsLog.completeNicknameChange) + reactor?.action.onNext(.changeNicknameButtonDidTap(text)) + } + ) + showBottomSheet(content: vc, size: .fixed(296)) + } + hideEditSheet() + } +} + +extension MyInfoViewController: EqualHandleTappedType { + func equalHandleTapped() { + let viewControllersCount: Int = self.navigationController?.viewControllers.count ?? 0 + if viewControllersCount > 1 { + self.navigationController?.popToRootViewController(animated: true) + } + } +} + +extension MyInfoViewController: FruitDrawViewControllerDelegate { + func completedFruitDraw(itemCount: Int) { + reactor?.action.onNext(.completedFruitDraw) + } +} diff --git a/Projects/Features/MyInfoFeature/Sources/ViewControllers/Notice/NoticeDetailViewController.swift b/Projects/Features/MyInfoFeature/Sources/ViewControllers/Notice/NoticeDetailViewController.swift new file mode 100644 index 000000000..0fa1d3674 --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/ViewControllers/Notice/NoticeDetailViewController.swift @@ -0,0 +1,184 @@ +import BaseFeature +import DesignSystem +import NoticeDomainInterface +import NVActivityIndicatorView +import RxCocoa +import RxDataSources +import RxSwift +import SafariServices +import UIKit +import Utility + +typealias NoticeDetailSectionModel = SectionModel + +public final class NoticeDetailViewController: UIViewController, ViewControllerFromStoryBoard { + @IBOutlet weak var titleStringLabel: UILabel! + @IBOutlet weak var closeButton: UIButton! + @IBOutlet weak var collectionView: UICollectionView! + @IBOutlet weak var indicator: NVActivityIndicatorView! + + private var viewModel: NoticeDetailViewModel! + private lazy var input = NoticeDetailViewModel.Input() + private lazy var output = viewModel.transform(from: input) + private let disposeBag = DisposeBag() + + deinit { + DEBUG_LOG("❌ \(Self.self) Deinit") + } + + override public func viewDidLoad() { + super.viewDidLoad() + configureUI() + outputBind() + inputBind() + } + + public static func viewController( + viewModel: NoticeDetailViewModel + ) -> NoticeDetailViewController { + let viewController = NoticeDetailViewController.viewController(storyBoardName: "Notice", bundle: Bundle.module) + viewController.viewModel = viewModel + return viewController + } + + @IBAction func closeButtonAction(_ sender: Any) { + dismiss(animated: true) + } +} + +private extension NoticeDetailViewController { + func inputBind() { + input.fetchNoticeDetail.onNext(()) + + collectionView.rx.itemSelected + .bind(to: input.didTapImage) + .disposed(by: disposeBag) + } + + func outputBind() { + output.dataSource + .skip(1) + .bind(to: collectionView.rx.items(dataSource: createDataSource())) + .disposed(by: disposeBag) + + output.imageSizes + .skip(1) + .subscribe(onNext: { [indicator] _ in + indicator?.stopAnimating() + }) + .disposed(by: disposeBag) + + output.goSafariScene + .compactMap { URL(string: $0) } + .bind(with: self) { owner, url in + owner.present(SFSafariViewController(url: url), animated: true) + } + .disposed(by: disposeBag) + } + + func createDataSource() -> RxCollectionViewSectionedReloadDataSource { + let dataSource = RxCollectionViewSectionedReloadDataSource( + configureCell: { _, collectionView, indexPath, item -> UICollectionViewCell in + guard let cell = collectionView.dequeueReusableCell( + withReuseIdentifier: "NoticeCollectionViewCell", + for: indexPath + ) as? NoticeCollectionViewCell else { + return UICollectionViewCell() + } + cell.update(model: item) + return cell + }, + configureSupplementaryView: { dataSource, collectionView, elementKind, indexPath -> UICollectionReusableView in + switch elementKind { + case UICollectionView.elementKindSectionHeader: + if let header = collectionView.dequeueReusableSupplementaryView( + ofKind: elementKind, + withReuseIdentifier: "NoticeDetailHeaderView", + for: indexPath + ) as? NoticeDetailHeaderView { + header.update(model: dataSource[indexPath.section].model) + return header + + } else { return UICollectionReusableView() } + + default: + return UICollectionReusableView() + } + } + ) + return dataSource + } + + func configureUI() { + self.view.backgroundColor = DesignSystemAsset.BlueGrayColor.gray100.color + closeButton.setImage(DesignSystemAsset.Navigation.crossClose.image, for: .normal) + + let attributedString: NSAttributedString = NSAttributedString( + string: "공지사항", + attributes: [ + .font: DesignSystemFontFamily.Pretendard.medium.font(size: 16), + .foregroundColor: DesignSystemAsset.BlueGrayColor.gray900.color, + .kern: -0.5 + ] + ) + self.titleStringLabel.attributedText = attributedString + + collectionView.register( + UINib(nibName: "NoticeCollectionViewCell", bundle: BaseFeatureResources.bundle), + forCellWithReuseIdentifier: "NoticeCollectionViewCell" + ) + collectionView.rx.setDelegate(self).disposed(by: disposeBag) + collectionView.bounces = false + + self.indicator.type = .circleStrokeSpin + self.indicator.color = DesignSystemAsset.PrimaryColor.point.color + self.indicator.startAnimating() + } +} + +extension NoticeDetailViewController: UICollectionViewDelegate, UICollectionViewDelegateFlowLayout { + public func collectionView( + _ collectionView: UICollectionView, + layout collectionViewLayout: UICollectionViewLayout, + sizeForItemAt indexPath: IndexPath + ) -> CGSize { + let imageSize: CGSize = output.imageSizes.value[indexPath.row] + let width: CGFloat = APP_WIDTH() + let height: CGFloat = (imageSize.height * width) / max(1.0, imageSize.width) + return CGSize(width: width, height: height) + } + + public func collectionView( + _ collectionView: UICollectionView, + layout collectionViewLayout: UICollectionViewLayout, + insetForSectionAt section: Int + ) -> UIEdgeInsets { + let sideSpace: CGFloat = 20 + return UIEdgeInsets(top: sideSpace, left: 0, bottom: 0, right: 0) + } + + public func collectionView( + _ collectionView: UICollectionView, + layout collectionViewLayout: UICollectionViewLayout, + minimumLineSpacingForSectionAt section: Int + ) -> CGFloat { + return 20 + } + + public func collectionView( + _ collectionView: UICollectionView, + layout collectionViewLayout: UICollectionViewLayout, + minimumInteritemSpacingForSectionAt section: Int + ) -> CGFloat { + return 20 + } + + public func collectionView( + _ collectionView: UICollectionView, + layout collectionViewLayout: UICollectionViewLayout, + referenceSizeForHeaderInSection section: Int + ) -> CGSize { + let model: FetchNoticeEntity = output.dataSource.value[section].model + return CGSize(width: APP_WIDTH(), height: NoticeDetailHeaderView.getCellHeight(model: model)) + } +} diff --git a/Projects/Features/MyInfoFeature/Sources/ViewControllers/Notice/NoticeViewController.swift b/Projects/Features/MyInfoFeature/Sources/ViewControllers/Notice/NoticeViewController.swift new file mode 100644 index 000000000..6fc716562 --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/ViewControllers/Notice/NoticeViewController.swift @@ -0,0 +1,127 @@ +import BaseFeature +import DesignSystem +import LogManager +import MyInfoFeatureInterface +import NVActivityIndicatorView +import RxCocoa +import RxSwift +import UIKit +import Utility + +public final class NoticeViewController: UIViewController, ViewControllerFromStoryBoard { + @IBOutlet weak var titleStringLabel: UILabel! + @IBOutlet weak var tableView: UITableView! + @IBOutlet weak var backButton: UIButton! + @IBOutlet weak var indicator: NVActivityIndicatorView! + + private var noticeDetailFactory: NoticeDetailFactory! + private var viewModel: NoticeViewModel! + private lazy var input = NoticeViewModel.Input() + private lazy var output = viewModel.transform(from: input) + private let disposeBag = DisposeBag() + + override public func viewDidLoad() { + super.viewDidLoad() + configureUI() + outputBind() + inputBind() + } + + public static func viewController( + viewModel: NoticeViewModel, + noticeDetailFactory: NoticeDetailFactory + ) -> NoticeViewController { + let viewController = NoticeViewController.viewController(storyBoardName: "Notice", bundle: Bundle.module) + viewController.viewModel = viewModel + viewController.noticeDetailFactory = noticeDetailFactory + return viewController + } + + @IBAction func backButtonAction(_ sender: Any) { + self.navigationController?.popViewController(animated: true) + } +} + +private extension NoticeViewController { + func inputBind() { + input.fetchNotice.onNext(()) + + tableView.rx.itemSelected + .do(onNext: { [tableView] indexPath in + tableView?.deselectRow(at: indexPath, animated: true) + }) + .bind(to: input.didTapList) + .disposed(by: disposeBag) + } + + func outputBind() { + output.dataSource + .skip(1) + .do(onNext: { [indicator, tableView] model in + indicator?.stopAnimating() + let space = APP_HEIGHT() - 48 - STATUS_BAR_HEGHIT() - SAFEAREA_BOTTOM_HEIGHT() + let height = space / 3 * 2 + let warningView = WarningView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: height)) + warningView.text = "공지사항이 없습니다." + tableView?.tableFooterView = model.isEmpty ? warningView : UIView(frame: CGRect( + x: 0, + y: 0, + width: APP_WIDTH(), + height: 56 + )) + }) + .bind(to: tableView.rx.items) { tableView, index, model -> UITableViewCell in + let indexPath: IndexPath = IndexPath(row: index, section: 0) + guard let cell = tableView.dequeueReusableCell( + withIdentifier: "NoticeListCell", + for: indexPath + ) as? NoticeListCell else { + return UITableViewCell() + } + cell.update(model: model) + cell.updateVisibleIndicator(visible: !model.isRead) + return cell + } + .disposed(by: disposeBag) + + output.goNoticeDetailScene + .bind(with: self) { owner, model in + let log = NoticeAnalyticsLog.clickNoticeItem(id: "\(model.id)", location: "notice") + LogManager.analytics(log) + + let viewController = owner.noticeDetailFactory.makeView(model: model) + viewController.modalPresentationStyle = .fullScreen + owner.present(viewController, animated: true) + } + .disposed(by: disposeBag) + } + + func configureUI() { + view.backgroundColor = DesignSystemAsset.BlueGrayColor.gray100.color + backButton.setImage(DesignSystemAsset.Navigation.back.image, for: .normal) + + tableView.rx.setDelegate(self).disposed(by: disposeBag) + tableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: 56)) + tableView.verticalScrollIndicatorInsets = UIEdgeInsets(top: 0, left: 0, bottom: 56, right: 0) + + let attributedString: NSAttributedString = NSAttributedString( + string: "공지사항", + attributes: [ + .font: DesignSystemFontFamily.Pretendard.medium.font(size: 16), + .foregroundColor: DesignSystemAsset.BlueGrayColor.gray900.color, + .kern: -0.5 + ] + ) + titleStringLabel.attributedText = attributedString + + indicator.type = .circleStrokeSpin + indicator.color = DesignSystemAsset.PrimaryColor.point.color + indicator.startAnimating() + } +} + +extension NoticeViewController: UITableViewDelegate { + public func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + return UITableView.automaticDimension + } +} diff --git a/Projects/Features/CommonFeature/Sources/ViewControllers/OpenSourceLicenseViewController.swift b/Projects/Features/MyInfoFeature/Sources/ViewControllers/OpenSourceLicense/OpenSourceLicenseViewController.swift similarity index 82% rename from Projects/Features/CommonFeature/Sources/ViewControllers/OpenSourceLicenseViewController.swift rename to Projects/Features/MyInfoFeature/Sources/ViewControllers/OpenSourceLicense/OpenSourceLicenseViewController.swift index 7ec9bab3f..fc7a58cd5 100644 --- a/Projects/Features/CommonFeature/Sources/ViewControllers/OpenSourceLicenseViewController.swift +++ b/Projects/Features/MyInfoFeature/Sources/ViewControllers/OpenSourceLicense/OpenSourceLicenseViewController.swift @@ -6,23 +6,23 @@ // Copyright © 2023 yongbeomkwak. All rights reserved. // -import UIKit import DesignSystem -import Utility -import RxSwift import RxCocoa +import RxSwift import SafariServices +import UIKit +import Utility public class OpenSourceLicenseViewController: UIViewController, ViewControllerFromStoryBoard { @IBOutlet weak var backButton: UIButton! @IBOutlet weak var titleStringLabel: UILabel! @IBOutlet weak var tableView: UITableView! - + var viewModel: OpenSourceLicenseViewModel! var disposeBag: DisposeBag = DisposeBag() deinit { DEBUG_LOG("❌ \(Self.self) Deinit") } - public override func viewDidLoad() { + override public func viewDidLoad() { super.viewDidLoad() configureUI() inputBind() @@ -33,22 +33,25 @@ public class OpenSourceLicenseViewController: UIViewController, ViewControllerFr public static func viewController( viewModel: OpenSourceLicenseViewModel ) -> OpenSourceLicenseViewController { - let viewController = OpenSourceLicenseViewController.viewController(storyBoardName: "CommonUI", bundle: Bundle.module) + let viewController = OpenSourceLicenseViewController.viewController( + storyBoardName: "OpenSourceAndServiceInfo", + bundle: Bundle.module + ) viewController.viewModel = viewModel return viewController } } -extension OpenSourceLicenseViewController{ +extension OpenSourceLicenseViewController { private func inputBind() { tableView.rx .setDelegate(self) .disposed(by: disposeBag) - + tableView.rx.itemSelected .withUnretained(self) .withLatestFrom(viewModel.output.dataSource) { ($0.0, $0.1, $1) } - .subscribe(onNext: { (owner, indexPath, dataSource) in + .subscribe(onNext: { owner, indexPath, dataSource in owner.tableView.deselectRow(at: indexPath, animated: true) let model = dataSource[indexPath.row] guard let URL = URL(string: model.link) else { return } @@ -56,17 +59,17 @@ extension OpenSourceLicenseViewController{ owner.present(safari, animated: true) }).disposed(by: disposeBag) } - + private func outputBind() { viewModel.output .dataSource - .bind(to: tableView.rx.items) { (tableView, index, model) -> UITableViewCell in + .bind(to: tableView.rx.items) { tableView, index, model -> UITableViewCell in switch model.type { case .library: guard let cell = tableView.dequeueReusableCell( withIdentifier: "OpenSourceLibraryCell", for: IndexPath(row: index, section: 0) - ) as? OpenSourceLibraryCell else{ + ) as? OpenSourceLibraryCell else { return UITableViewCell() } cell.update(model: model) @@ -75,7 +78,7 @@ extension OpenSourceLicenseViewController{ guard let cell = tableView.dequeueReusableCell( withIdentifier: "OpenSourceLicenseCell", for: IndexPath(row: index, section: 0) - ) as? OpenSourceLicenseCell else{ + ) as? OpenSourceLicenseCell else { return UITableViewCell() } cell.update(model: model) @@ -83,11 +86,11 @@ extension OpenSourceLicenseViewController{ } }.disposed(by: disposeBag) } - - private func bindBtn(){ + + private func bindBtn() { backButton.rx.tap .withUnretained(self) - .subscribe(onNext: { (owner, _) in + .subscribe(onNext: { owner, _ in owner.navigationController?.popViewController(animated: true) }).disposed(by: disposeBag) } @@ -108,12 +111,12 @@ extension OpenSourceLicenseViewController: UITableViewDelegate { extension OpenSourceLicenseViewController { private func configureUI() { backButton.setImage(DesignSystemAsset.Navigation.back.image, for: .normal) - view.backgroundColor = DesignSystemAsset.GrayColor.gray100.color + view.backgroundColor = DesignSystemAsset.BlueGrayColor.blueGray100.color titleStringLabel.text = "오픈소스 라이선스" titleStringLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) - titleStringLabel.textColor = DesignSystemAsset.GrayColor.gray900.color + titleStringLabel.textColor = DesignSystemAsset.BlueGrayColor.blueGray900.color titleStringLabel.setTextWithAttributes(kernValue: -0.5) tableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: 56)) - tableView.scrollIndicatorInsets = UIEdgeInsets(top: 0, left: 0, bottom: 56, right: 0) + tableView.verticalScrollIndicatorInsets = UIEdgeInsets(top: 0, left: 0, bottom: 56, right: 0) } } diff --git a/Projects/Features/MyInfoFeature/Sources/ViewControllers/PlayTypeTogglePopup/PlayTypeTogglePopupViewController.swift b/Projects/Features/MyInfoFeature/Sources/ViewControllers/PlayTypeTogglePopup/PlayTypeTogglePopupViewController.swift new file mode 100644 index 000000000..865c21107 --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/ViewControllers/PlayTypeTogglePopup/PlayTypeTogglePopupViewController.swift @@ -0,0 +1,281 @@ +import DesignSystem +import RxCocoa +import RxSwift +import SnapKit +import Then +import UIKit +import Utility + +public final class PlayTypeTogglePopupViewController: UIViewController { + private let dimmView = UIView().then { + $0.backgroundColor = .black.withAlphaComponent(0.4) + } + + private let contentView = UIView().then { + $0.layer.cornerRadius = 24 + $0.backgroundColor = .white + } + + private let titleLabel = WMLabel( + text: "어떻게 재생할까요?", + textColor: DesignSystemAsset.BlueGrayColor.gray900.color, + font: .t2(weight: .bold), + alignment: .center, + lineHeight: UIFont.WMFontSystem.t2().lineHeight, + kernValue: -0.5 + ) + + private let vStackView = UIStackView().then { + $0.axis = .vertical + $0.spacing = 8 + $0.distribution = .fillEqually + } + + private let firstItemButton = PlayTypeTogglePopupItemButtonView() + + private let secondItemButton = PlayTypeTogglePopupItemButtonView() + + private let firstDotImageView = UIImageView().then { + $0.image = DesignSystemAsset.MyInfo.dot.image + } + + private let secondDotImageView = UIImageView().then { + $0.image = DesignSystemAsset.MyInfo.dot.image + } + + private let firstDescriptionLabel = WMLabel( + text: "해당 기능을 사용하려면 앱이 설치되어 있어야 합니다.", + textColor: DesignSystemAsset.BlueGrayColor.gray500.color, + font: .t7(weight: .light), + alignment: .left + ) + + private let secondDescriptionLabel = WMLabel( + text: "일부 노래나 쇼츠는 YouTube Music에서 지원되지 않습니다.", + textColor: DesignSystemAsset.BlueGrayColor.gray500.color, + font: .t7(weight: .light), + alignment: .left + ) + + private let hStackView = UIStackView().then { + $0.axis = .horizontal + $0.spacing = 0 + $0.distribution = .fillEqually + } + + private let cancelButton = UIButton().then { + let cancleButtonBackgroundColor = DesignSystemAsset.BlueGrayColor.blueGray400.color + $0.setBackgroundColor(cancleButtonBackgroundColor, for: .normal) + $0.setTitle("취소", for: .normal) + $0.setTitleColor(DesignSystemAsset.BlueGrayColor.blueGray25.color, for: .normal) + $0.titleLabel?.font = .setFont(.t4(weight: .medium)) + $0.titleLabel?.setTextWithAttributes(alignment: .center) + } + + private let confirmButton = UIButton().then { + let confirmButtonBackgroundColor = DesignSystemAsset.PrimaryColorV2.point.color + $0.setBackgroundColor(confirmButtonBackgroundColor, for: .normal) + $0.setTitle("확인", for: .normal) + $0.setTitleColor(DesignSystemAsset.BlueGrayColor.blueGray25.color, for: .normal) + $0.titleLabel?.font = .setFont(.t4(weight: .medium)) + $0.titleLabel?.setTextWithAttributes(alignment: .center) + } + + private let disposeBag = DisposeBag() + private var selectedItemString: String = "" + private var completion: ((_ selectedItemString: String) -> Void)? + private var cancelCompletion: (() -> Void)? + + init( + completion: ((_ selectedItemString: String) -> Void)? = nil, + cancelCompletion: (() -> Void)? = nil + ) { + self.completion = completion + self.cancelCompletion = cancelCompletion + super.init(nibName: nil, bundle: nil) + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override public func viewDidLoad() { + super.viewDidLoad() + addViews() + setLayout() + configureUI() + setActions() + firstItemButton.setDelegate(self) + secondItemButton.setDelegate(self) + } + + override public func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + + contentView.transform = CGAffineTransform(translationX: 0, y: 80) + contentView.alpha = 0 + dimmView.alpha = 0 + let animator = UIViewPropertyAnimator(duration: 0.3, curve: .easeInOut) + animator.addAnimations { + self.contentView.transform = CGAffineTransform.identity + } + animator.addAnimations { + self.contentView.alpha = 1 + self.dimmView.alpha = 1 + } + animator.startAnimation() + } + + func setActions() { + NotificationCenter.default.rx.notification(UIApplication.didBecomeActiveNotification) + .subscribe(onNext: { [weak self] _ in + self?.secondItemButton.checkAppIsInstalled() + }) + .disposed(by: disposeBag) + + let cancelAction = UIAction { [weak self] _ in + self?.dismiss() + } + + let confirmAction = UIAction { [weak self] _ in + guard let self else { return } + self.completion?(self.selectedItemString) + self.dismiss() + } + cancelButton.addAction(cancelAction, for: .touchUpInside) + confirmButton.addAction(confirmAction, for: .touchUpInside) + } +} + +private extension PlayTypeTogglePopupViewController { + func addViews() { + self.view.addSubviews( + dimmView, + contentView + ) + contentView.addSubviews( + titleLabel, + firstItemButton, + secondItemButton, + firstDotImageView, + firstDescriptionLabel, + secondDotImageView, + secondDescriptionLabel, + hStackView + ) + hStackView.addArrangedSubviews(cancelButton, confirmButton) + } + + func setLayout() { + let is320 = APP_WIDTH() <= 320 + + dimmView.snp.makeConstraints { + $0.edges.equalToSuperview() + } + + contentView.snp.makeConstraints { + $0.height.equalTo(is320 ? 364 : 344) + $0.center.equalToSuperview() + $0.horizontalEdges.equalToSuperview().inset(20) + } + + titleLabel.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview().inset(20) + $0.top.equalToSuperview().offset(30) + } + + firstItemButton.snp.makeConstraints { + $0.height.equalTo(60) + $0.top.equalTo(titleLabel.snp.bottom).offset(20) + $0.horizontalEdges.equalToSuperview().inset(20) + } + + secondItemButton.snp.makeConstraints { + $0.height.equalTo(60) + $0.top.equalTo(firstItemButton.snp.bottom).offset(8) + $0.horizontalEdges.equalToSuperview().inset(20) + } + + firstDotImageView.snp.makeConstraints { + $0.size.equalTo(16) + $0.top.equalTo(secondItemButton.snp.bottom).offset(12) + $0.left.equalToSuperview().offset(20) + } + + firstDescriptionLabel.snp.makeConstraints { + $0.top.equalTo(firstDotImageView) + $0.left.equalTo(firstDotImageView.snp.right) + $0.right.equalToSuperview().inset(20) + } + + secondDotImageView.snp.makeConstraints { + $0.size.equalTo(16) + $0.top.equalTo(firstDescriptionLabel.snp.bottom).offset(4) + $0.left.equalToSuperview().offset(20) + } + + secondDescriptionLabel.snp.makeConstraints { + $0.top.equalTo(secondDotImageView) + $0.left.equalTo(secondDotImageView.snp.right) + $0.right.equalToSuperview().inset(20) + } + + hStackView.snp.makeConstraints { + $0.height.equalTo(56) + $0.horizontalEdges.equalToSuperview() + $0.bottom.equalToSuperview() + } + } + + func configureUI() { + self.view.backgroundColor = .clear + contentView.clipsToBounds = true + + let playType = PreferenceManager.songPlayPlatformType ?? .youtube + self.selectedItemString = playType.display + + firstItemButton.setTitleWithOption(title: YoutubePlayType.youtube.display) + secondItemButton.setTitleWithOption( + title: YoutubePlayType.youtubeMusic.display, + shouldCheckAppIsInstalled: true + ) + + firstItemButton.isSelected = playType == .youtube + secondItemButton.isSelected = playType == .youtubeMusic + + if APP_WIDTH() <= 320 { // 두줄로 표기하기 위함 + firstDescriptionLabel.numberOfLines = 0 + secondDescriptionLabel.numberOfLines = 0 + } + + let gesture = UITapGestureRecognizer(target: self, action: #selector(tappedAround(_:))) + dimmView.addGestureRecognizer(gesture) + dimmView.isUserInteractionEnabled = true + } + + @objc func tappedAround(_ sender: UITapGestureRecognizer) { + dismiss() + } + + func dismiss() { + self.dismiss(animated: false) + } +} + +extension PlayTypeTogglePopupViewController: PlayTypeTogglePopupItemButtonViewDelegate { + func tappedButtonAction(title: String) { + switch title { + case "YouTube": + self.selectedItemString = title + firstItemButton.isSelected = true + secondItemButton.isSelected = false + case "YouTube Music": + self.selectedItemString = title + firstItemButton.isSelected = false + secondItemButton.isSelected = true + default: + break + } + } +} diff --git a/Projects/Features/MyInfoFeature/Sources/ViewControllers/ProfilePopup/ProfilePopupViewController.swift b/Projects/Features/MyInfoFeature/Sources/ViewControllers/ProfilePopup/ProfilePopupViewController.swift new file mode 100644 index 000000000..b31286489 --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/ViewControllers/ProfilePopup/ProfilePopupViewController.swift @@ -0,0 +1,197 @@ +import DesignSystem +import ImageDomainInterface +import LogManager +import MyInfoFeatureInterface +import NVActivityIndicatorView +import RxCocoa +import RxRelay +import RxSwift +import UIKit +import Utility + +public final class ProfilePopupViewController: UIViewController, ViewControllerFromStoryBoard { + @IBOutlet weak var titleLabel: UILabel! + @IBOutlet weak var collectionView: UICollectionView! + @IBOutlet weak var collectionViewHeightConstraint: NSLayoutConstraint! + @IBOutlet weak var saveButton: UIButton! + @IBOutlet weak var dataLoadActivityIndicator: NVActivityIndicatorView! + @IBOutlet weak var activityIndicator: NVActivityIndicatorView! + + private var completion: (() -> Void)? + private var viewModel: ProfilePopupViewModel! + private lazy var input = ProfilePopupViewModel.Input() + private lazy var output = viewModel.transform(from: input) + private let disposeBag = DisposeBag() + + static let rowHeight: CGFloat = (APP_WIDTH() - 70) / 4 + + deinit { + LogManager.printDebug("\(Self.self) deinit") + } + + override public func viewDidLoad() { + super.viewDidLoad() + configureUI() + outputBind() + inputBind() + } + + public static func viewController( + viewModel: ProfilePopupViewModel, + completion: (() -> Void)? = nil + ) -> UIViewController { + let viewController = ProfilePopupViewController.viewController( + storyBoardName: "ProfilePopUp", + bundle: Bundle.module + ) + viewController.viewModel = viewModel + viewController.completion = completion + return viewController + } +} + +private extension ProfilePopupViewController { + func inputBind() { + input.fetchProfileList.onNext(()) + + collectionView.rx.itemSelected + .bind(to: input.itemSelected) + .disposed(by: disposeBag) + + saveButton.rx.tap + .throttle(.milliseconds(1000), latest: false, scheduler: MainScheduler.instance) + .withLatestFrom(output.dataSource) + .map { model in + let id: String = model.filter { $0.isSelected }.first?.name ?? "" + return id + } + .filter { [weak self] id in + guard !id.isEmpty else { + self?.output.showToast.onNext("프로필을 선택해주세요.") + return false + } + return true + } + .bind(with: self) { owner, _ in + owner.activityIndicator.startAnimating() + owner.saveButton.setAttributedTitle( + NSMutableAttributedString( + string: "", + attributes: [ + .font: UIFont.WMFontSystem.t4(weight: .medium).font, + .foregroundColor: DesignSystemAsset.BlueGrayColor.blueGray25.color, + .kern: -0.5 + ] + ), for: .normal + ) + owner.input.requestSetProfile.onNext(()) + } + .disposed(by: disposeBag) + } + + func outputBind() { + output.dataSource + .skip(1) + .do(onNext: { [dataLoadActivityIndicator] _ in + dataLoadActivityIndicator?.stopAnimating() + }) + .bind(to: collectionView.rx.items) { collectionView, index, model -> UICollectionViewCell in + guard let cell = collectionView.dequeueReusableCell( + withReuseIdentifier: "ProfileCollectionViewCell", + for: IndexPath(row: index, section: 0) + ) as? ProfileCollectionViewCell else { + return UICollectionViewCell() + } + cell.update(model) + return cell + } + .disposed(by: disposeBag) + + output.showToast + .bind(with: self) { owner, message in + owner.showToast(text: message, options: [.tabBar]) + owner.saveButton.setAttributedTitle( + NSMutableAttributedString( + string: "완료", + attributes: [ + .font: UIFont.WMFontSystem.t4(weight: .medium).font, + .foregroundColor: DesignSystemAsset.BlueGrayColor.blueGray25.color, + .kern: -0.5 + ] + ), for: .normal + ) + owner.activityIndicator.stopAnimating() + } + .disposed(by: disposeBag) + + output.completedProfile + .bind(with: self) { owner, _ in + owner.completion?() + owner.dismiss(animated: true) + } + .disposed(by: disposeBag) + } +} + +private extension ProfilePopupViewController { + func configureUI() { + collectionView.rx.setDelegate(self).disposed(by: disposeBag) + collectionView.clipsToBounds = false + collectionViewHeightConstraint.constant = (ProfilePopupViewController.rowHeight * 2) + 10 + + titleLabel.text = "프로필을 선택해주세요" + titleLabel.font = UIFont.WMFontSystem.t4(weight: .medium).font + titleLabel.textColor = DesignSystemAsset.BlueGrayColor.gray900.color + titleLabel.setTextWithAttributes(kernValue: -0.5) + + saveButton.backgroundColor = DesignSystemAsset.PrimaryColorV2.point.color + saveButton.layer.cornerRadius = 12 + saveButton.clipsToBounds = true + saveButton.setAttributedTitle( + NSMutableAttributedString( + string: "완료", + attributes: [ + .font: UIFont.WMFontSystem.t4(weight: .medium).font, + .foregroundColor: DesignSystemAsset.BlueGrayColor.blueGray25.color, + .kern: -0.5 + ] + ), for: .normal + ) + + dataLoadActivityIndicator.type = .circleStrokeSpin + dataLoadActivityIndicator.color = DesignSystemAsset.PrimaryColor.point.color + dataLoadActivityIndicator.startAnimating() + + activityIndicator.type = .circleStrokeSpin + activityIndicator.color = .white + } +} + +extension ProfilePopupViewController: UICollectionViewDelegate, UICollectionViewDelegateFlowLayout { + public func collectionView( + _ collectionView: UICollectionView, + layout collectionViewLayout: UICollectionViewLayout, + sizeForItemAt indexPath: IndexPath + ) -> CGSize { + let size: CGFloat = ProfilePopupViewController.rowHeight + return CGSize(width: size, height: size) + } + + /// 행간 간격 + public func collectionView( + _ collectionView: UICollectionView, + layout collectionViewLayout: UICollectionViewLayout, + minimumLineSpacingForSectionAt section: Int + ) -> CGFloat { + return 10 + } + + /// 아이템 사이 간격(좌,우) + public func collectionView( + _ collectionView: UICollectionView, + layout collectionViewLayout: UICollectionViewLayout, + minimumInteritemSpacingForSectionAt section: Int + ) -> CGFloat { + return 10 + } +} diff --git a/Projects/Features/MyInfoFeature/Sources/ViewControllers/Question/QuestionViewController.swift b/Projects/Features/MyInfoFeature/Sources/ViewControllers/Question/QuestionViewController.swift new file mode 100644 index 000000000..b8a02d189 --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/ViewControllers/Question/QuestionViewController.swift @@ -0,0 +1,299 @@ +import BaseFeature +import BaseFeatureInterface +import DesignSystem +import LogManager +import MessageUI +import RxSwift +import SafariServices +import UIKit +import Utility + +public final class QuestionViewController: BaseViewController, ViewControllerFromStoryBoard { + @IBOutlet weak var titleLabel: UILabel! + @IBOutlet weak var closeButton: UIButton! + @IBOutlet weak var descriptionLabel: UILabel! + @IBOutlet weak var bugReportSuperView: UIView! + @IBOutlet weak var bugReportButton: UIButton! + @IBOutlet weak var bugReportCheckImageView: UIImageView! + + @IBOutlet weak var suggestFunctionSuperView: UIView! + @IBOutlet weak var suggestFunctionButton: UIButton! + @IBOutlet weak var suggestFunctionCheckImageView: UIImageView! + + @IBOutlet weak var addSongSuperView: UIView! + @IBOutlet weak var addSongButton: UIButton! + @IBOutlet weak var addSongCheckImageView: UIImageView! + + @IBOutlet weak var editSongSuperView: UIView! + @IBOutlet weak var editSongButton: UIButton! + @IBOutlet weak var editSongCheckImageView: UIImageView! + + @IBOutlet weak var wakMusicFeedbackSuperView: UIView! + @IBOutlet weak var wakMusicFeedbackButton: UIButton! + @IBOutlet weak var wakMusicFeedbackCheckImageView: UIImageView! + + @IBOutlet weak var creditSuperView: UIView! + @IBOutlet weak var creditButton: UIButton! + @IBOutlet weak var creditCheckImageView: UIImageView! + @IBOutlet weak var nextButton: UIButton! + + let selectedColor: UIColor = DesignSystemAsset.PrimaryColor.decrease.color + let unSelectedTextColor: UIColor = DesignSystemAsset.BlueGrayColor.blueGray900.color + let unSelectedColor: UIColor = DesignSystemAsset.BlueGrayColor.blueGray200.color + let disposeBag = DisposeBag() + var viewModel: QuestionViewModel! + var textPopupFactory: TextPopupFactory! + lazy var input = QuestionViewModel.Input() + lazy var output = viewModel.transform(from: input) + + deinit { + DEBUG_LOG("❌ \(Self.self) 소멸") + } + + override public func viewDidLoad() { + super.viewDidLoad() + configureUI() + bindRx() + } + + public static func viewController( + viewModel: QuestionViewModel, + textPopupFactory: TextPopupFactory + ) -> QuestionViewController { + let viewController = QuestionViewController.viewController(storyBoardName: "Question", bundle: Bundle.module) + viewController.viewModel = viewModel + viewController.textPopupFactory = textPopupFactory + return viewController + } +} + +extension QuestionViewController { + private func configureUI() { + self.titleLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) + self.titleLabel.textColor = DesignSystemAsset.BlueGrayColor.gray900.color + self.titleLabel.text = "문의하기" + self.titleLabel.setTextWithAttributes(kernValue: -0.5) + + self.closeButton.setImage(DesignSystemAsset.Navigation.crossClose.image, for: .normal) + + self.descriptionLabel.text = "어떤 것 관련해서 문의주셨나요?" + self.descriptionLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 20) + self.descriptionLabel.textColor = DesignSystemAsset.BlueGrayColor.gray900.color + self.descriptionLabel.setTextWithAttributes(kernValue: -0.5) + + self.nextButton.layer.cornerRadius = 12 + self.nextButton.clipsToBounds = true + self.nextButton.isEnabled = false + self.nextButton.setBackgroundColor(DesignSystemAsset.PrimaryColor.point.color, for: .normal) + self.nextButton.setBackgroundColor(DesignSystemAsset.BlueGrayColor.gray300.color, for: .disabled) + self.nextButton.setAttributedTitle( + NSMutableAttributedString( + string: "다음", + attributes: [ + .font: DesignSystemFontFamily.Pretendard.medium.font(size: 18), + .foregroundColor: DesignSystemAsset.BlueGrayColor.gray25.color, + .kern: -0.5 + ] + ), for: .normal + ) + + let superViews: [UIView] = [ + self.bugReportSuperView, + self.suggestFunctionSuperView, + self.addSongSuperView, + self.editSongSuperView, + self.wakMusicFeedbackSuperView, + self.creditSuperView + ] + + let buttons: [UIButton] = [ + self.bugReportButton, + self.suggestFunctionButton, + self.addSongButton, + self.editSongButton, + self.wakMusicFeedbackButton, + self.creditButton + ] + + let imageViews: [UIImageView] = [ + self.bugReportCheckImageView, + self.suggestFunctionCheckImageView, + self.addSongCheckImageView, + self.editSongCheckImageView, + self.wakMusicFeedbackCheckImageView, + self.creditCheckImageView + ] + + for i in 0 ..< superViews.count { + superViews[i].layer.cornerRadius = 12 + superViews[i].layer.borderColor = unSelectedColor.cgColor + superViews[i].layer.borderWidth = 1 + imageViews[i].image = DesignSystemAsset.Storage.checkBox.image + imageViews[i].isHidden = true + + guard let type = InquiryType(rawValue: i) else { return } + + buttons[i].setAttributedTitle( + NSMutableAttributedString( + string: type.title, + attributes: [ + .font: DesignSystemFontFamily.Pretendard.light.font(size: 16), + .foregroundColor: unSelectedTextColor, + .kern: -0.5 + ] + ), for: .normal + ) + } + } + + private func bindRx() { + closeButton.rx.tap + .subscribe(onNext: { [weak self] in + self?.dismiss(animated: true) + }).disposed(by: disposeBag) + + Observable.merge( + bugReportButton.rx.tap.map { _ -> Int in 0 }, + suggestFunctionButton.rx.tap.map { _ -> Int in 1 }, + addSongButton.rx.tap.map { _ -> Int in 2 }, + editSongButton.rx.tap.map { _ -> Int in 3 }, + wakMusicFeedbackButton.rx.tap.map { _ -> Int in 4 }, + creditButton.rx.tap.map { _ -> Int in 5 } + ) + .bind(to: input.selectedIndex) + .disposed(by: disposeBag) + + output.mailSource + .filter { $0 != .unknown } + .map { $0.rawValue } + .subscribe(onNext: { [weak self] (index: Int) in + guard let self = self else { + return + } + + if !self.nextButton.isEnabled { + self.nextButton.isEnabled = true + } + let superViews: [UIView] = [ + self.bugReportSuperView, + self.suggestFunctionSuperView, + self.addSongSuperView, + self.editSongSuperView, + self.wakMusicFeedbackSuperView, + self.creditSuperView + ] + + let buttons: [UIButton] = [ + self.bugReportButton, + self.suggestFunctionButton, + self.addSongButton, + self.editSongButton, + self.wakMusicFeedbackButton, + self.creditButton + ] + + let imageViews: [UIImageView] = [ + self.bugReportCheckImageView, + self.suggestFunctionCheckImageView, + self.addSongCheckImageView, + self.editSongCheckImageView, + self.wakMusicFeedbackCheckImageView, + self.creditCheckImageView + ] + + for i in 0 ..< superViews.count { + guard let type = InquiryType(rawValue: i) else { return } + + buttons[i].setAttributedTitle( + NSMutableAttributedString( + string: type.title, + attributes: [ + .font: i == index ? DesignSystemFontFamily.Pretendard.medium.font(size: 16) : + DesignSystemFontFamily.Pretendard.light.font(size: 16), + .foregroundColor: i == index ? self.selectedColor : self.unSelectedTextColor, + .kern: -0.5 + ] + ), for: .normal + ) + imageViews[i].isHidden = i == index ? false : true + superViews[i].layer.borderColor = i == index ? self.selectedColor.cgColor : self.unSelectedColor + .cgColor + superViews[i].addShadow( + offset: CGSize(width: 0, height: 2), + color: colorFromRGB("080F34"), + opacity: i == index ? 0.08 : 0 + ) + } + }) + .disposed(by: disposeBag) + + nextButton.rx.tap + .withLatestFrom(output.mailSource) + .filter { $0 != .unknown } + .subscribe(onNext: { [weak self] source in + let logInquiryType: InquiryAnalyticsLog.LogInquiryType = .init(mailSource: source) + let log = InquiryAnalyticsLog.clickInquirySubmitButton(type: logInquiryType) + LogManager.analytics(log) + + guard let self = self else { return } + self.goToMail(source: source) + }) + .disposed(by: disposeBag) + + output.showToastWithDismiss + .filter { !$0.0.isEmpty } + .withUnretained(self) + .subscribe(onNext: { owner, params in + let (text, toDismiss) = params + owner.showToast( + text: text, options: [.tabBar] + ) + guard toDismiss else { return } + owner.dismiss(animated: true) + }) + .disposed(by: disposeBag) + } +} + +extension QuestionViewController { + private func goToMail(source: InquiryType) { + if MFMailComposeViewController.canSendMail() { + let compseVC = MFMailComposeViewController() + compseVC.mailComposeDelegate = self + compseVC.setToRecipients([source.receiver]) + compseVC.setSubject(source.title) + compseVC.setMessageBody(source.body + source.suffix, isHTML: false) + self.present(compseVC, animated: true, completion: nil) + + } else { + guard let textPopupViewController = self.textPopupFactory.makeView( + text: "메일 계정이 설정되어 있지 않습니다.\n설정 > Mail 앱 > 계정을 설정해주세요.", + cancelButtonIsHidden: true, + confirmButtonText: "확인", + cancelButtonText: nil, + completion: nil, + cancelCompletion: nil + ) as? TextPopupViewController else { + return + } + + self.showBottomSheet(content: textPopupViewController) + } + } +} + +extension QuestionViewController: MFMailComposeViewControllerDelegate { + public func mailComposeController( + _ controller: MFMailComposeViewController, + didFinishWith result: MFMailComposeResult, + error: Error? + ) { + controller.dismiss(animated: true) { + if let error = error { + self.input.mailComposeResult.onNext(.failure(error)) + } else { + self.input.mailComposeResult.onNext(.success(result)) + } + } + } +} diff --git a/Projects/Features/MyInfoFeature/Sources/ViewControllers/ServiceInfo/ServiceInfoViewController.swift b/Projects/Features/MyInfoFeature/Sources/ViewControllers/ServiceInfo/ServiceInfoViewController.swift new file mode 100644 index 000000000..f3ac46b77 --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/ViewControllers/ServiceInfo/ServiceInfoViewController.swift @@ -0,0 +1,150 @@ +import BaseFeature +import BaseFeatureInterface +import DesignSystem +import Kingfisher +import MyInfoFeatureInterface +import RxCocoa +import RxSwift +import UIKit +import Utility + +public class ServiceInfoViewController: UIViewController, ViewControllerFromStoryBoard { + @IBOutlet weak var backButton: UIButton! + @IBOutlet weak var titleStringLabel: UILabel! + @IBOutlet weak var tableView: UITableView! + + var openSourceLicenseFactory: OpenSourceLicenseFactory! + var textPopupFactory: TextPopupFactory! + var viewModel: ServiceInfoViewModel! + var disposeBag: DisposeBag = DisposeBag() + + deinit { DEBUG_LOG("❌ \(Self.self) Deinit") } + + override public func viewDidLoad() { + super.viewDidLoad() + configureUI() + bindBtn() + inputBind() + outputBind() + } + + public static func viewController( + viewModel: ServiceInfoViewModel, + openSourceLicenseFactory: OpenSourceLicenseFactory, + textPopupFactory: TextPopupFactory + ) -> ServiceInfoViewController { + let viewController = ServiceInfoViewController.viewController( + storyBoardName: "OpenSourceAndServiceInfo", + bundle: Bundle.module + ) + viewController.viewModel = viewModel + viewController.openSourceLicenseFactory = openSourceLicenseFactory + viewController.textPopupFactory = textPopupFactory + return viewController + } +} + +extension ServiceInfoViewController { + private func inputBind() { + tableView.rx + .setDelegate(self) + .disposed(by: disposeBag) + + tableView.rx.itemSelected + .withUnretained(self) + .withLatestFrom(viewModel.output.dataSource) { ($0.0, $0.1, $1) } + .subscribe(onNext: { owner, indexPath, dataSource in + owner.tableView.deselectRow(at: indexPath, animated: true) + let model = dataSource[indexPath.row] + switch model.identifier { + case .termsOfUse: + let vc = ContractViewController.viewController(type: .service) + vc.modalPresentationStyle = .fullScreen + owner.present(vc, animated: true) + case .privacy: + let vc = ContractViewController.viewController(type: .privacy) + vc.modalPresentationStyle = .fullScreen + owner.present(vc, animated: true) + case .openSourceLicense: + let vc = owner.openSourceLicenseFactory.makeView() + owner.navigationController?.pushViewController(vc, animated: true) + case .removeCache: + owner.viewModel.input.requestCacheSize.onNext(()) + case .versionInfomation: + return + } + }).disposed(by: disposeBag) + } + + private func outputBind() { + viewModel.output + .dataSource + .bind(to: tableView.rx.items) { tableView, index, model -> UITableViewCell in + guard let cell = tableView.dequeueReusableCell( + withIdentifier: "ServiceInfoCell", + for: IndexPath(row: index, section: 0) + ) as? ServiceInfoCell else { + return UITableViewCell() + } + cell.update(model: model) + return cell + }.disposed(by: disposeBag) + + viewModel.output + .cacheSizeString + .withUnretained(self) + .subscribe(onNext: { owner, sizeString in + + guard let textPopupVC = owner.textPopupFactory.makeView( + text: "캐시 데이터(\(sizeString))를 지우시겠습니까?", + cancelButtonIsHidden: false, + confirmButtonText: nil, + cancelButtonText: nil, + completion: { owner.viewModel.input.removeCache.onNext(()) }, + cancelCompletion: nil + ) as? TextPopupViewController else { + return + } + + owner.showBottomSheet(content: textPopupVC) + }).disposed(by: disposeBag) + + viewModel.output + .showToast + .withUnretained(self) + .subscribe(onNext: { owner, message in + owner.showToast( + text: message, + font: DesignSystemFontFamily.Pretendard.light.font(size: 14) + ) + }).disposed(by: disposeBag) + } + + private func bindBtn() { + backButton.rx.tap + .withUnretained(self) + .subscribe(onNext: { owner, _ in + owner.navigationController?.popViewController(animated: true) + }).disposed(by: disposeBag) + } +} + +extension ServiceInfoViewController: UITableViewDelegate { + public func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + return 60 + } +} + +extension ServiceInfoViewController { + private func configureUI() { + backButton.setImage(DesignSystemAsset.Navigation.back.image, for: .normal) + view.backgroundColor = DesignSystemAsset.BlueGrayColor.gray100.color + titleStringLabel.text = "서비스 정보" + titleStringLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) + titleStringLabel.textColor = DesignSystemAsset.BlueGrayColor.gray900.color + titleStringLabel.setTextWithAttributes(kernValue: -0.5) + tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: 20)) + tableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: 56)) + tableView.verticalScrollIndicatorInsets = UIEdgeInsets(top: 0, left: 0, bottom: 56, right: 0) + } +} diff --git a/Projects/Features/MyInfoFeature/Sources/ViewControllers/Setting/SettingViewController.swift b/Projects/Features/MyInfoFeature/Sources/ViewControllers/Setting/SettingViewController.swift new file mode 100644 index 000000000..8b1583d9a --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/ViewControllers/Setting/SettingViewController.swift @@ -0,0 +1,309 @@ +import BaseFeature +import BaseFeatureInterface +import DesignSystem +import Foundation +import LogManager +import MyInfoFeatureInterface +import NVActivityIndicatorView +import RxSwift +import SignInFeatureInterface +import SnapKit +import Then +import UIKit +import Utility + +final class SettingViewController: BaseReactorViewController { + private var textPopupFactory: TextPopupFactory! + private var signInFactory: SignInFactory! + private var serviceTermsFactory: ServiceTermFactory! + private var privacyFactory: PrivacyFactory! + private var openSourceLicenseFactory: OpenSourceLicenseFactory! + private var playTypeTogglePopupFactory: PlayTypeTogglePopupFactory! + + let settingView = SettingView() + let settingItemDataSource = SettingItemDataSource() + + override func loadView() { + view = settingView + } + + override func viewDidLoad() { + super.viewDidLoad() + setSettingItemTableView() + view.backgroundColor = DesignSystemAsset.BlueGrayColor.blueGray100.color + } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + LogManager.analytics(CommonAnalyticsLog.viewPage(pageName: .setting)) + } + + public static func viewController( + reactor: SettingReactor, + textPopupFactory: TextPopupFactory, + signInFactory: SignInFactory, + serviceTermsFactory: ServiceTermFactory, + privacyFactory: PrivacyFactory, + openSourceLicenseFactory: OpenSourceLicenseFactory, + playTypeTogglePopupFactory: PlayTypeTogglePopupFactory + ) -> SettingViewController { + let viewController = SettingViewController(reactor: reactor) + viewController.textPopupFactory = textPopupFactory + viewController.signInFactory = signInFactory + viewController.serviceTermsFactory = serviceTermsFactory + viewController.privacyFactory = privacyFactory + viewController.openSourceLicenseFactory = openSourceLicenseFactory + viewController.playTypeTogglePopupFactory = playTypeTogglePopupFactory + return viewController + } + + override func bindState(reactor: SettingReactor) { + reactor.pulse(\.$reloadTableView) + .compactMap { $0 } + .bind(with: self) { owner, _ in + owner.settingView.settingItemTableView.reloadData() + } + .disposed(by: disposeBag) + + reactor.state.map(\.isShowActivityIndicator) + .distinctUntilChanged() + .bind(with: self) { owner, isShow in + owner.settingView.updateActivityIndicatorState(isPlaying: isShow) + } + .disposed(by: disposeBag) + + reactor.state.map(\.isHiddenWithDrawButton) + .distinctUntilChanged() + .bind(with: self) { owner, isHidden in + owner.settingView.updateIsHiddenWithDrawButton(isHidden: isHidden) + } + .disposed(by: disposeBag) + + reactor.state.map(\.isHiddenLogoutButton) + .distinctUntilChanged() + .bind(with: self) { owner, isHidden in + owner.settingItemDataSource.updateCurrentSettingItems(isHidden: isHidden) + owner.settingView.updateIsHiddenLogoutButton(isHidden: isHidden) + } + .disposed(by: disposeBag) + + reactor.state.map(\.notificationAuthorizationStatus) + .distinctUntilChanged() + .bind(with: self) { owner, granted in + owner.settingView.updateNotificationAuthorizationStatus(granted: granted) + } + .disposed(by: disposeBag) + + reactor.pulse(\.$navigateType) + .compactMap { $0 } + .bind(with: self) { owner, navigate in + switch navigate { + case .dismiss: + owner.navigationController?.popViewController(animated: true) + case .appPushSetting: + guard let openSettingsURL = URL(string: UIApplication.openSettingsURLString) else { return } + UIApplication.shared.open(openSettingsURL) + case .serviceTerms: + let vc = owner.serviceTermsFactory.makeView() + vc.modalPresentationStyle = .fullScreen + owner.present(vc, animated: true) + case .privacy: + let vc = owner.privacyFactory.makeView() + vc.modalPresentationStyle = .fullScreen + owner.present(vc, animated: true) + case .openSource: + let vc = owner.openSourceLicenseFactory.makeView() + owner.navigationController?.pushViewController(vc, animated: true) + } + } + .disposed(by: disposeBag) + + reactor.pulse(\.$cacheSize) + .compactMap { $0 } + .bind(with: self, onNext: { owner, cachSize in + guard let textPopupVC = owner.textPopupFactory.makeView( + text: "캐시 데이터(\(cachSize))를 지우시겠습니까?", + cancelButtonIsHidden: false, + confirmButtonText: nil, + cancelButtonText: nil, + completion: { + let log = SettingAnalyticsLog.completeRemoveCache(size: cachSize) + LogManager.analytics(log) + + owner.reactor?.action.onNext(.confirmRemoveCacheButtonDidTap) + }, + cancelCompletion: nil + ) as? TextPopupViewController else { + return + } + owner.showBottomSheet(content: textPopupVC) + }) + .disposed(by: disposeBag) + + reactor.pulse(\.$toastMessage) + .compactMap { $0 } + .bind(with: self, onNext: { owner, message in + owner.showToast(text: message, options: [.tabBar]) + }) + .disposed(by: disposeBag) + + reactor.pulse(\.$withDrawButtonDidTap) + .compactMap { $0 } + .bind(with: self, onNext: { owner, _ in + let makeSecondConfirmVC: () -> UIViewController = { + owner.textPopupFactory.makeView( + text: "정말 탈퇴하시겠습니까?", + cancelButtonIsHidden: false, + completion: { + let log = SettingAnalyticsLog.completeWithdraw + LogManager.analytics(log) + + owner.reactor?.action.onNext(.confirmWithDrawButtonDidTap) + } + ) + } + let firstConfirmVC = owner.textPopupFactory.makeView( + text: "회원탈퇴 신청을 하시겠습니까?", + cancelButtonIsHidden: false, + completion: { + let secondConfirmVC = makeSecondConfirmVC() + owner.showBottomSheet(content: secondConfirmVC) + } + ) + owner.showBottomSheet(content: firstConfirmVC) + }) + .disposed(by: disposeBag) + + reactor.pulse(\.$withDrawResult) + .compactMap { $0 } + .bind(with: self) { owner, withDrawResult in + let status = withDrawResult.status + let description = withDrawResult.description + guard let textPopupVC = owner.textPopupFactory.makeView( + text: (status == 200) ? "회원탈퇴가 완료되었습니다.\n이용해주셔서 감사합니다." : description, + cancelButtonIsHidden: true, + confirmButtonText: nil, + cancelButtonText: nil, + completion: { + if status == 200 { + owner.navigationController?.popViewController(animated: true) + } + }, + cancelCompletion: nil + ) as? TextPopupViewController else { + return + } + owner.showBottomSheet(content: textPopupVC) + } + .disposed(by: disposeBag) + } + + override func bindAction(reactor: SettingReactor) { + settingView.rx.dismissButtonDidTap + .map { Reactor.Action.dismissButtonDidTap } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + settingView.rx.withDrawButtonDidTap + .do(onNext: { + LogManager.analytics(SettingAnalyticsLog.clickWithdrawButton) + }) + .map { Reactor.Action.withDrawButtonDidTap } + .bind(to: reactor.action) + .disposed(by: disposeBag) + } +} + +extension SettingViewController: UITableViewDelegate { + func setSettingItemTableView() { + settingView.settingItemTableView.dataSource = settingItemDataSource + settingView.settingItemTableView.delegate = self + } + + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + return 60 + } + + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + tableView.deselectRow(at: indexPath, animated: true) + guard let cell = tableView.cellForRow(at: indexPath) as? SettingItemTableViewCell else { return } + guard let category = cell.category else { return } + + switch category { + case .appPush: + LogManager.analytics(SettingAnalyticsLog.clickNotificationButton) + reactor?.action.onNext(.appPushSettingNavigationDidTap) + case .playType: + LogManager.analytics(SettingAnalyticsLog.clickSongPlayPlatform) + showPlayTypeTogglePopup() + case .serviceTerms: LogManager.analytics(SettingAnalyticsLog.clickTermsOfServiceButton) + reactor?.action.onNext(.serviceTermsNavigationDidTap) + case .privacy: + LogManager.analytics(SettingAnalyticsLog.clickPrivacyPolicyButton) + reactor?.action.onNext(.privacyNavigationDidTap) + case .openSource: + LogManager.analytics(SettingAnalyticsLog.clickOpensourceButton) + reactor?.action.onNext(.openSourceNavigationDidTap) + case .removeCache: + LogManager.analytics(SettingAnalyticsLog.clickRemoveCacheButton) + reactor?.action.onNext(.removeCacheButtonDidTap) + case .logout: + LogManager.analytics(SettingAnalyticsLog.clickLogoutButton) + showLogoutTextPopup() + case .versionInfo: + LogManager.analytics(SettingAnalyticsLog.clickVersionButton) + reactor?.action.onNext(.versionInfoButtonDidTap) + } + } + + private func showPlayTypeTogglePopup() { + let togglePopupVC = playTypeTogglePopupFactory.makeView( + completion: { selectedItemString in + switch selectedItemString { + case YoutubePlayType.youtube.display: + PreferenceManager.songPlayPlatformType = .youtube + LogManager.analytics( + SettingAnalyticsLog.completeSelectSongPlayPlatform(platform: YoutubePlayType.youtube.display) + ) + LogManager.setUserProperty( + property: .songPlayPlatform(platform: YoutubePlayType.youtube.display) + ) + case YoutubePlayType.youtubeMusic.display: + PreferenceManager.songPlayPlatformType = .youtubeMusic + LogManager.analytics( + SettingAnalyticsLog.completeSelectSongPlayPlatform( + platform: YoutubePlayType.youtubeMusic.display + ) + ) + LogManager.setUserProperty( + property: .songPlayPlatform(platform: YoutubePlayType.youtubeMusic.display) + ) + default: + break + } + }, + cancelCompletion: {} + ) + togglePopupVC.modalPresentationStyle = .overFullScreen + togglePopupVC.modalTransitionStyle = .crossDissolve + self.present(togglePopupVC, animated: false) + } + + private func showLogoutTextPopup() { + let textPopUpVC = textPopupFactory.makeView( + text: "로그아웃 하시겠습니까?", + cancelButtonIsHidden: false, + confirmButtonText: "확인", + cancelButtonText: "취소", + completion: { [weak self] in + guard let self else { return } + let log = SettingAnalyticsLog.completeLogout + LogManager.analytics(log) + + self.reactor?.action.onNext(.confirmLogoutButtonDidTap) + }, + cancelCompletion: {} + ) + showBottomSheet(content: textPopUpVC, size: .fixed(234)) + } +} diff --git a/Projects/Features/MyInfoFeature/Sources/ViewModels/FaqViewModel.swift b/Projects/Features/MyInfoFeature/Sources/ViewModels/FaqViewModel.swift new file mode 100644 index 000000000..84e330487 --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/ViewModels/FaqViewModel.swift @@ -0,0 +1,57 @@ +import BaseFeature +import FaqDomainInterface +import Foundation +import MyInfoFeatureInterface +import RxRelay +import RxSwift +import Utility + +public final class FaqViewModel: ViewModelType { + var disposeBag = DisposeBag() + var fetchFaqCategoriesUseCase: FetchFaqCategoriesUseCase! + var fetchQnaUseCase: FetchFaqUseCase! + + public struct Input {} + + public struct Output { + let dataSource: BehaviorRelay<([String], [FaqEntity])> = BehaviorRelay(value: ([], [])) + } + + public init( + fetchFaqCategoriesUseCase: FetchFaqCategoriesUseCase, + fetchQnaUseCase: FetchFaqUseCase + ) { + DEBUG_LOG("✅ \(Self.self) 생성") + self.fetchFaqCategoriesUseCase = fetchFaqCategoriesUseCase + self.fetchQnaUseCase = fetchQnaUseCase + } + + public func transform(from input: Input) -> Output { + let output = Output() + + let zip1 = fetchFaqCategoriesUseCase.execute() + .catchAndReturn(FaqCategoryEntity(categories: [])) + .map { + /* + 탭맨의 무언가 이상함으로 인해 임시방편으로 공백을 직접 넣어줌 + */ + var result: [String] = [String("전체 ")] + + result += $0.categories.map { $0.count < 6 ? $0 + String(repeating: " ", count: 6 - $0.count) : $0 } + + DEBUG_LOG(result) + return result + } + .asObservable() + + let zip2 = fetchQnaUseCase.execute() + .catchAndReturn([]) + .asObservable() + + Observable.zip(zip1, zip2) + .bind(to: output.dataSource) + .disposed(by: disposeBag) + + return output + } +} diff --git a/Projects/Features/MyInfoFeature/Sources/ViewModels/NoticeDetailViewModel.swift b/Projects/Features/MyInfoFeature/Sources/ViewModels/NoticeDetailViewModel.swift new file mode 100644 index 000000000..c3bd4df47 --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/ViewModels/NoticeDetailViewModel.swift @@ -0,0 +1,95 @@ +import BaseFeature +import Foundation +import Kingfisher +import LogManager +import NoticeDomainInterface +import RxCocoa +import RxSwift +import Utility + +public final class NoticeDetailViewModel { + private let model: FetchNoticeEntity + private let disposeBag = DisposeBag() + + deinit { + DEBUG_LOG("❌ \(Self.self) Deinit") + } + + public init(model: FetchNoticeEntity) { + self.model = model + readNotice(ID: self.model.id) + } + + public struct Input { + let fetchNoticeDetail: PublishSubject = PublishSubject() + let didTapImage: PublishSubject = PublishSubject() + } + + public struct Output { + let dataSource: BehaviorRelay<[NoticeDetailSectionModel]> = BehaviorRelay(value: []) + let imageSizes: BehaviorRelay<[CGSize]> = BehaviorRelay(value: []) + let goSafariScene: PublishSubject = PublishSubject() + } + + public func transform(from input: Input) -> Output { + let output = Output() + let sectionModel = [NoticeDetailSectionModel(model: model, items: model.origins)] + let imageURLs: [URL] = model.origins.map { URL(string: $0.url) }.compactMap { $0 } + + input.fetchNoticeDetail + .flatMap { [weak self] _ -> Observable<[CGSize]> in + guard let self = self else { return .never() } + return imageURLs.isEmpty ? + Observable.just([]) : + Observable.zip( + imageURLs.map { self.downloadImageSize(url: $0) } + ) + } + .bind { imageSizes in + output.imageSizes.accept(imageSizes) + output.dataSource.accept(sectionModel) + } + .disposed(by: disposeBag) + + input.didTapImage + .withLatestFrom(output.dataSource) { ($0, $1) } + .map { $0.1[$0.0.section].items[$0.0.item] } + .filter { !$0.link.isEmpty } + .map { $0.link } + .bind(to: output.goSafariScene) + .disposed(by: disposeBag) + + return output + } +} + +private extension NoticeDetailViewModel { + func readNotice(ID: Int) { + var newReadNoticeIDs = PreferenceManager.readNoticeIDs ?? [] + guard newReadNoticeIDs.contains(ID) == false else { + return + } + newReadNoticeIDs.append(ID) + PreferenceManager.readNoticeIDs = newReadNoticeIDs + } + + func downloadImageSize(url: URL) -> Observable { + return Observable.create { observer in + KingfisherManager.shared.retrieveImage( + with: url + ) { result in + switch result { + case let .success(value): + observer.onNext(value.image.size) + observer.onCompleted() + + case let .failure(error): + LogManager.printDebug(error.localizedDescription) + observer.onNext(.zero) + observer.onCompleted() + } + } + return Disposables.create() + } + } +} diff --git a/Projects/Features/MyInfoFeature/Sources/ViewModels/NoticeViewModel.swift b/Projects/Features/MyInfoFeature/Sources/ViewModels/NoticeViewModel.swift new file mode 100644 index 000000000..689269e4e --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/ViewModels/NoticeViewModel.swift @@ -0,0 +1,71 @@ +import BaseFeature +import Foundation +import MyInfoFeatureInterface +import NoticeDomainInterface +import RxRelay +import RxSwift +import Utility + +public final class NoticeViewModel { + private let fetchNoticeAllUseCase: FetchNoticeAllUseCase + private let disposeBag = DisposeBag() + + public init( + fetchNoticeAllUseCase: any FetchNoticeAllUseCase + ) { + self.fetchNoticeAllUseCase = fetchNoticeAllUseCase + } + + public struct Input { + let fetchNotice: PublishSubject = PublishSubject() + let didTapList: PublishSubject = PublishSubject() + } + + public struct Output { + let dataSource: BehaviorRelay<[FetchNoticeEntity]> = BehaviorRelay(value: []) + let goNoticeDetailScene: PublishSubject = PublishSubject() + } + + public func transform(from input: Input) -> Output { + let output = Output() + + input.fetchNotice + .flatMap { [fetchNoticeAllUseCase] _ -> Single<[FetchNoticeEntity]> in + return fetchNoticeAllUseCase.execute() + .catchAndReturn([]) + } + .map { notices in + let readIDs = Set(PreferenceManager.readNoticeIDs ?? []) + return notices.map { notice in + var notice = notice + notice.isRead = readIDs.contains(notice.id) + return notice + } + } + .bind(to: output.dataSource) + .disposed(by: disposeBag) + + input.didTapList + .withLatestFrom(output.dataSource) { ($0, $1) } + .map { selectedIndexPath, notices in + let selecterdID = notices[selectedIndexPath.row].id + return notices.map { notice in + var updatedNotice = notice + updatedNotice.isRead = (notice.id == selecterdID) ? true : notice.isRead + return updatedNotice + } + } + .bind(to: output.dataSource) + .disposed(by: disposeBag) + + input.didTapList + .withLatestFrom(output.dataSource) { ($0, $1) } + .map { selectedIndexPath, entities in + entities[selectedIndexPath.row] + } + .bind(to: output.goNoticeDetailScene) + .disposed(by: disposeBag) + + return output + } +} diff --git a/Projects/Features/CommonFeature/Sources/ViewModels/OpenSourceLicenseViewModel.swift b/Projects/Features/MyInfoFeature/Sources/ViewModels/OpenSourceLicenseViewModel.swift similarity index 87% rename from Projects/Features/CommonFeature/Sources/ViewModels/OpenSourceLicenseViewModel.swift rename to Projects/Features/MyInfoFeature/Sources/ViewModels/OpenSourceLicenseViewModel.swift index f75dcc859..a70d96583 100644 --- a/Projects/Features/CommonFeature/Sources/ViewModels/OpenSourceLicenseViewModel.swift +++ b/Projects/Features/MyInfoFeature/Sources/ViewModels/OpenSourceLicenseViewModel.swift @@ -7,20 +7,20 @@ // import Foundation -import RxSwift import RxCocoa +import RxSwift import Utility public final class OpenSourceLicenseViewModel { let input = Input() let output = Output() var disposeBag = DisposeBag() - + public struct Input {} public struct Output { var dataSource: BehaviorRelay<[OpenSourceLicense]> = BehaviorRelay(value: []) } - + init() { var dataSource: [OpenSourceLicense] = [ OpenSourceLicense( @@ -43,6 +43,11 @@ public final class OpenSourceLicenseViewModel { description: "The MIT License\nCopyright © 2015 Krunoslav Zaher All rights reserved.", link: "https://github.com/ReactiveX/RxSwift.git" ), + OpenSourceLicense( + title: "RxGesture", + description: "The MIT License\nCopyright © 2016 RxSwiftCommunity.", + link: "https://github.com/RxSwiftCommunity/RxGesture.git" + ), OpenSourceLicense( title: "RxDataSources", description: "The MIT License\nCopyright (c) 2017 RxSwift Community", @@ -54,9 +59,9 @@ public final class OpenSourceLicenseViewModel { link: "https://github.com/RxSwiftCommunity/RxKeyboard.git" ), OpenSourceLicense( - title: "PanModal", - description: "The MIT License\nCopyright © 2018 Tiny Speck, Inc.", - link: "https://github.com/slackhq/PanModal.git" + title: "FittedSheets", + description: "The MIT License\nCopyright (c) 2018 Gordon Tucker", + link: "https://github.com/gordontucker/FittedSheets.git" ), OpenSourceLicense( title: "Then", @@ -122,18 +127,13 @@ public final class OpenSourceLicenseViewModel { title: "RealmSwift", description: "realm/realm-swift is licensed under the Apache License 2.0", link: "https://github.com/realm/realm-swift" - ), - OpenSourceLicense( - title: "YouTubePlayerKit", - description: "The MIT License\nCopyright (c) 2023 Sven Tiigi", - link: "https://github.com/SvenTiigi/YouTubePlayerKit.git" ) ].sorted { $0.title < $1.title } - self.loadTextFileFromBundle(fileName: "ApacheLicense") { [weak self] (result) in + self.loadTextFileFromBundle(fileName: "ApacheLicense") { [weak self] result in guard let self else { return } switch result { - case .success(let contents): + case let .success(contents): let apacheLicense = OpenSourceLicense( type: .license, title: "Apache License 2.0", @@ -142,10 +142,10 @@ public final class OpenSourceLicenseViewModel { ) dataSource.append(apacheLicense) - self.loadTextFileFromBundle(fileName: "MITLicense") { [weak self] (result) in + self.loadTextFileFromBundle(fileName: "MITLicense") { [weak self] result in guard let self else { return } switch result { - case .success(let contents): + case let .success(contents): let mitLicense = OpenSourceLicense( type: .license, title: "MIT License (MIT)", @@ -155,11 +155,11 @@ public final class OpenSourceLicenseViewModel { dataSource.append(mitLicense) self.output.dataSource.accept(dataSource) - case .failure(let error): + case let .failure(error): DEBUG_LOG("파일 로드 에러: \(error)") } } - case .failure(let error): + case let .failure(error): DEBUG_LOG("파일 로드 에러: \(error)") } } @@ -167,9 +167,12 @@ public final class OpenSourceLicenseViewModel { } extension OpenSourceLicenseViewModel { - private func loadTextFileFromBundle(fileName: String, completionHandler: @escaping (Result) -> Void) { + private func loadTextFileFromBundle( + fileName: String, + completionHandler: @escaping (Result) -> Void + ) { DispatchQueue.global().async { - if let fileURL = CommonFeatureResources.bundle.url(forResource: fileName, withExtension: "txt") { + if let fileURL = MyInfoFeatureResources.bundle.url(forResource: fileName, withExtension: "txt") { do { let contents = try String(contentsOf: fileURL, encoding: .utf8) completionHandler(.success(contents)) @@ -177,7 +180,11 @@ extension OpenSourceLicenseViewModel { completionHandler(.failure(error)) } } else { - let error = NSError(domain: "com.example.app", code: 0, userInfo: [NSLocalizedDescriptionKey: "파일을 찾을 수 없습니다."]) + let error = NSError( + domain: "com.example.app", + code: 0, + userInfo: [NSLocalizedDescriptionKey: "파일을 찾을 수 없습니다."] + ) completionHandler(.failure(error)) } } diff --git a/Projects/Features/MyInfoFeature/Sources/ViewModels/ProfilePopupViewModel.swift b/Projects/Features/MyInfoFeature/Sources/ViewModels/ProfilePopupViewModel.swift new file mode 100644 index 000000000..7a4e23e0d --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/ViewModels/ProfilePopupViewModel.swift @@ -0,0 +1,89 @@ +import AuthDomainInterface +import BaseDomainInterface +import BaseFeature +import Foundation +import ImageDomainInterface +import RxRelay +import RxSwift +import UserDomainInterface +import Utility + +public final class ProfilePopupViewModel: ViewModelType { + private let fetchProfileListUseCase: FetchProfileListUseCase + private let setProfileUseCase: SetProfileUseCase + private let disposeBag = DisposeBag() + + public init( + fetchProfileListUseCase: any FetchProfileListUseCase, + setProfileUseCase: any SetProfileUseCase + ) { + self.fetchProfileListUseCase = fetchProfileListUseCase + self.setProfileUseCase = setProfileUseCase + } + + public struct Input { + let fetchProfileList: PublishSubject = PublishSubject() + let requestSetProfile: PublishSubject = PublishSubject() + let itemSelected: PublishRelay = PublishRelay() + } + + public struct Output { + let dataSource: BehaviorRelay<[ProfileListEntity]> = BehaviorRelay(value: []) + let setProfileResult: PublishSubject = PublishSubject() + let showToast: PublishSubject = PublishSubject() + let completedProfile: PublishSubject = PublishSubject() + } + + public func transform(from input: Input) -> Output { + let output = Output() + + input.fetchProfileList + .flatMap { [fetchProfileListUseCase] _ in + fetchProfileListUseCase.execute() + .asObservable() + .catchAndReturn([]) + } + .bind(to: output.dataSource) + .disposed(by: disposeBag) + + input.itemSelected + .withLatestFrom(output.dataSource) { ($0, $1) } + .map { indexPath, dataSource -> [ProfileListEntity] in + var newModel = dataSource + if let i = newModel.firstIndex(where: { $0.isSelected }) { + newModel[i].isSelected = false + newModel[indexPath.row].isSelected = true + + } else { + newModel[indexPath.row].isSelected = true + return newModel + } + return newModel + } + .bind(to: output.dataSource) + .disposed(by: disposeBag) + + input.requestSetProfile + .withLatestFrom(output.dataSource) + .map { model in + let id: String = model.filter { $0.isSelected }.first?.name ?? "" + return id + } + .filter { !$0.isEmpty } + .flatMap { [setProfileUseCase] profileName -> Observable in + return setProfileUseCase.execute(image: profileName) + .andThen(Observable.just(())) + .catch { error in + output.showToast.onNext(error.asWMError.errorDescription ?? error.localizedDescription) + return Observable.empty() + } + } + .subscribe(onNext: { _ in + output.showToast.onNext("프로필이 변경되었습니다.") + output.completedProfile.onNext(()) + }) + .disposed(by: disposeBag) + + return output + } +} diff --git a/Projects/Features/MyInfoFeature/Sources/ViewModels/QnaContentViewModel.swift b/Projects/Features/MyInfoFeature/Sources/ViewModels/QnaContentViewModel.swift new file mode 100644 index 000000000..ef646a4d1 --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/ViewModels/QnaContentViewModel.swift @@ -0,0 +1,27 @@ +import BaseFeature +import FaqDomainInterface +import Foundation +import RxRelay +import RxSwift +import Utility + +public final class QnaContentViewModel: ViewModelType { + var disposeBag = DisposeBag() + var dataSource: [FaqEntity] + + public struct Input {} + + public struct Output {} + + public init( + dataSource: [FaqEntity] + ) { + DEBUG_LOG("✅ \(Self.self) 생성") + self.dataSource = dataSource + } + + public func transform(from input: Input) -> Output { + let output = Output() + return output + } +} diff --git a/Projects/Features/StorageFeature/Sources/ViewModels/QuestionViewModel.swift b/Projects/Features/MyInfoFeature/Sources/ViewModels/QuestionViewModel.swift similarity index 93% rename from Projects/Features/StorageFeature/Sources/ViewModels/QuestionViewModel.swift rename to Projects/Features/MyInfoFeature/Sources/ViewModels/QuestionViewModel.swift index 97189688d..8ed3fff35 100644 --- a/Projects/Features/StorageFeature/Sources/ViewModels/QuestionViewModel.swift +++ b/Projects/Features/MyInfoFeature/Sources/ViewModels/QuestionViewModel.swift @@ -6,18 +6,16 @@ // Copyright © 2023 yongbeomkwak. All rights reserved. // -import Foundation -import Utility -import RxSwift -import RxRelay -import DomainModule import BaseFeature -import KeychainModule +import Foundation import MessageUI +import RxRelay +import RxSwift +import Utility -public final class QuestionViewModel:ViewModelType { +public final class QuestionViewModel: ViewModelType { var disposeBag = DisposeBag() - + public struct Input { var selectedIndex: PublishSubject = PublishSubject() var mailComposeResult: PublishSubject> = PublishSubject() @@ -32,21 +30,21 @@ public final class QuestionViewModel:ViewModelType { ) { DEBUG_LOG("✅ \(Self.self) 생성") } - + deinit { DEBUG_LOG("❌ \(Self.self) 소멸") } - + public func transform(from input: Input) -> Output { let output = Output() - + input.selectedIndex .map { (i: Int) -> InquiryType in return InquiryType(rawValue: i) ?? .unknown } .bind(to: output.mailSource) .disposed(by: disposeBag) - + input.mailComposeResult .map { (result: Result) -> (String, Bool) in switch result { @@ -70,6 +68,7 @@ enum InquiryType: Int { case addSong case modifySong case weeklyChart + case credit case unknown } @@ -80,7 +79,7 @@ extension InquiryType { return "contact@wakmusic.xyz" } } - + var title: String { switch self { case .reportBug: @@ -93,11 +92,13 @@ extension InquiryType { return "노래 수정" case .weeklyChart: return "주간차트 영상" + case .credit: + return "참여 정보" case .unknown: return "" } } - + var body: String { switch self { case .reportBug: @@ -117,7 +118,7 @@ extension InquiryType { · 조회수가 이상한 경우는 반응 영상이 포함되어 있을 수 있습니다. \n아티스트:\n\n노래 제목:\n\n유튜브 링크:\n\n내용:\n\n\n\n """ - case .weeklyChart: + case .weeklyChart, .credit: return """ 문의하실 내용을 적어주세요.\n\n\n\n\n\n """ @@ -125,7 +126,7 @@ extension InquiryType { return "" } } - + var suffix: String { switch self { default: @@ -134,7 +135,7 @@ extension InquiryType { * 자동으로 작성된 시스템 정보입니다. 원활한 문의를 위해서 삭제하지 말아 주세요.\n \(APP_NAME()) v\(APP_VERSION()) \(Device().modelName) / \(OS_NAME()) \(OS_VERSION()) - 닉네임: \(AES256.decrypt(encoded: Utility.PreferenceManager.userInfo?.displayName ?? "")) + 닉네임: \(Utility.PreferenceManager.userInfo?.decryptedName ?? "") """ } } diff --git a/Projects/Features/CommonFeature/Sources/ViewModels/ServiceInfoViewModel.swift b/Projects/Features/MyInfoFeature/Sources/ViewModels/ServiceInfoViewModel.swift similarity index 91% rename from Projects/Features/CommonFeature/Sources/ViewModels/ServiceInfoViewModel.swift rename to Projects/Features/MyInfoFeature/Sources/ViewModels/ServiceInfoViewModel.swift index ab44d9273..eae238c21 100644 --- a/Projects/Features/CommonFeature/Sources/ViewModels/ServiceInfoViewModel.swift +++ b/Projects/Features/MyInfoFeature/Sources/ViewModels/ServiceInfoViewModel.swift @@ -6,28 +6,29 @@ // Copyright © 2023 yongbeomkwak. All rights reserved. // -import UIKit import Foundation -import RxSwift +import Kingfisher import RxCocoa +import RxSwift +import UIKit import Utility -import Kingfisher public final class ServiceInfoViewModel { let input = Input() let output = Output() var disposeBag = DisposeBag() - + public struct Input { var requestCacheSize: PublishSubject = PublishSubject() var removeCache: PublishSubject = PublishSubject() } + public struct Output { var dataSource: BehaviorRelay<[ServiceInfoGroup]> = BehaviorRelay(value: []) var cacheSizeString: PublishSubject = PublishSubject() var showToast: PublishSubject = PublishSubject() } - + init() { let dataSource: [ServiceInfoGroup] = [ ServiceInfoGroup( @@ -62,11 +63,11 @@ public final class ServiceInfoViewModel { ) ] output.dataSource.accept(dataSource) - + input.requestCacheSize .withUnretained(self) - .subscribe(onNext: { (owner, _) in - owner.calculateMemorySize { (result) in + .subscribe(onNext: { owner, _ in + owner.calculateMemorySize { result in switch result { case let .success(sizeString): owner.output.cacheSizeString.onNext(sizeString) @@ -75,10 +76,10 @@ public final class ServiceInfoViewModel { } } }).disposed(by: disposeBag) - + input.removeCache .withUnretained(self) - .subscribe(onNext: { (owner, _) in + .subscribe(onNext: { owner, _ in ImageCache.default.clearDiskCache { () in owner.output.showToast.onNext("캐시 데이터가 삭제되었습니다.") } @@ -88,9 +89,9 @@ public final class ServiceInfoViewModel { extension ServiceInfoViewModel { private func calculateMemorySize(completionHandler: @escaping (Result) -> Void) { - ImageCache.default.calculateDiskStorageSize { (result) in + ImageCache.default.calculateDiskStorageSize { result in switch result { - case .success(let size): + case let .success(size): let sizeString = ByteCountFormatter.string(fromByteCount: Int64(size), countStyle: .file) completionHandler(.success(sizeString)) case let .failure(error): @@ -108,13 +109,14 @@ public struct ServiceInfoGroup { let accessoryType: AccessoryType } -extension ServiceInfoGroup{ - public enum AccessoryType{ +public extension ServiceInfoGroup { + enum AccessoryType { case detail case onlyTitle case detailTitle } - public enum Identifier: String{ + + enum Identifier: String { case termsOfUse = "서비스 이용약관" case privacy = "개인정보 처리방침" case openSourceLicense = "오픈소스 라이선스" diff --git a/Projects/Features/MyInfoFeature/Sources/Views/AnswerTableViewCell.swift b/Projects/Features/MyInfoFeature/Sources/Views/AnswerTableViewCell.swift new file mode 100644 index 000000000..20392cb6b --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/Views/AnswerTableViewCell.swift @@ -0,0 +1,19 @@ +import DesignSystem +import FaqDomainInterface +import UIKit + +class AnswerTableViewCell: UITableViewCell { + @IBOutlet weak var answerLabel: UILabel! + + override func awakeFromNib() { + super.awakeFromNib() + answerLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 14) + answerLabel.setTextWithAttributes(kernValue: -0.5, lineSpacing: 6) + } +} + +extension AnswerTableViewCell { + public func update(model: FaqEntity) { + answerLabel.text = model.answer + } +} diff --git a/Projects/Features/MyInfoFeature/Sources/Views/AppPushSettingView.swift b/Projects/Features/MyInfoFeature/Sources/Views/AppPushSettingView.swift new file mode 100644 index 000000000..23da9c604 --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/Views/AppPushSettingView.swift @@ -0,0 +1,73 @@ +import DesignSystem +import RxCocoa +import RxSwift +import SignInFeatureInterface +import SnapKit +import Then +import UIKit +import UserDomainInterface +import Utility + +private protocol AppPushSettingStateProtocol {} + +private protocol AppPushSettingActionProtocol { + var dismissButtonDidTap: Observable { get } +} + +final class AppPushSettingView: UIView { + private let wmNavigationbarView = WMNavigationBarView() + + fileprivate let dismissButton = UIButton().then { + let dismissImage = DesignSystemAsset.Navigation.back.image + $0.setImage(dismissImage, for: .normal) + } + + private let titleLabel = WMLabel( + text: "앱 알림 설정", + textColor: DesignSystemAsset.BlueGrayColor.blueGray900.color, + font: .t5(weight: .medium), + alignment: .center, + lineHeight: UIFont.WMFontSystem.t5().lineHeight, + kernValue: -0.5 + ).then { + $0.numberOfLines = .zero + } + + init() { + super.init(frame: .zero) + addView() + setLayout() + self.backgroundColor = DesignSystemAsset.BlueGrayColor.blueGray100.color + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +private extension AppPushSettingView { + func addView() { + self.addSubviews( + wmNavigationbarView, + titleLabel + ) + } + + func setLayout() { + wmNavigationbarView.snp.makeConstraints { + $0.top.equalToSuperview().offset(STATUS_BAR_HEGHIT()) + $0.horizontalEdges.equalToSuperview() + $0.height.equalTo(48) + } + wmNavigationbarView.setLeftViews([dismissButton]) + + titleLabel.snp.makeConstraints { + $0.center.equalTo(wmNavigationbarView.snp.center) + } + } +} + +extension Reactive: AppPushSettingActionProtocol where Base: AppPushSettingView { + var dismissButtonDidTap: Observable { base.dismissButton.rx.tap.asObservable() } +} diff --git a/Projects/Features/MyInfoFeature/Sources/Views/FruitDrawButtonView.swift b/Projects/Features/MyInfoFeature/Sources/Views/FruitDrawButtonView.swift new file mode 100644 index 000000000..83002867f --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/Views/FruitDrawButtonView.swift @@ -0,0 +1,115 @@ +import DesignSystem +import RxCocoa +import RxSwift +import SnapKit +import Then +import UIKit + +private protocol FruitDrawStateProtocol { + func updateFruitCount(count: Int) +} + +private protocol FruitDrawActionProtocol { + var fruitStorageButtonDidTap: Observable { get } + var drawButtonDidTap: Observable { get } +} + +final class FruitDrawButtonView: UIView { + let backgroundView = UIView().then { + $0.backgroundColor = .white.withAlphaComponent(0.4) + $0.layer.borderWidth = 1 + $0.layer.borderColor = UIColor(hex: "ECEFF3").cgColor + $0.layer.cornerRadius = 8 + $0.clipsToBounds = true + } + + let titleLabel = WMLabel( + text: "내 열매", + textColor: DesignSystemAsset.BlueGrayColor.blueGray900.color, + font: .t5(weight: .medium), + alignment: .center, + lineHeight: UIFont.WMFontSystem.t5().lineHeight, + kernValue: -0.5 + ) + + let countLabel = WMLabel( + text: "", + textColor: DesignSystemAsset.PrimaryColorV2.point.color, + font: .t5(weight: .bold), + alignment: .center, + lineHeight: UIFont.WMFontSystem.t5().lineHeight, + kernValue: -0.5 + ) + + let fruitStorageButton = UIButton() + + let drawButton = UIButton().then { + $0.titleLabel?.font = DesignSystemFontFamily.Pretendard.medium.font(size: 14) + $0.setTitle("뽑기", for: .normal) + $0.setTitleColor(DesignSystemAsset.BlueGrayColor.blueGray900.color, for: .normal) + $0.setImage(DesignSystemAsset.Home.homeArrowRight.image, for: .normal) + $0.semanticContentAttribute = .forceRightToLeft + } + + init() { + super.init(frame: .zero) + addView() + setLayout() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +extension FruitDrawButtonView { + func addView() { + self.addSubviews( + backgroundView, + titleLabel, + countLabel, + fruitStorageButton, + drawButton + ) + } + + func setLayout() { + backgroundView.snp.makeConstraints { + $0.edges.equalToSuperview() + } + + titleLabel.snp.makeConstraints { + $0.centerY.equalToSuperview() + $0.left.equalTo(backgroundView.snp.left).offset(20) + } + + countLabel.snp.makeConstraints { + $0.centerY.equalToSuperview() + $0.left.equalTo(titleLabel.snp.right).offset(8) + } + + fruitStorageButton.snp.makeConstraints { + $0.verticalEdges.equalTo(backgroundView.snp.verticalEdges) + $0.leading.equalTo(backgroundView.snp.leading) + $0.trailing.equalTo(drawButton.snp.leading) + } + + drawButton.snp.makeConstraints { + $0.verticalEdges.equalTo(backgroundView.snp.verticalEdges) + $0.trailing.equalTo(backgroundView.snp.trailing) + $0.width.equalTo(80) + } + } +} + +extension FruitDrawButtonView: FruitDrawStateProtocol { + func updateFruitCount(count: Int) { + countLabel.text = count >= 0 ? "\(count)개" : "" + } +} + +extension Reactive: FruitDrawActionProtocol where Base: FruitDrawButtonView { + var fruitStorageButtonDidTap: Observable { base.fruitStorageButton.rx.tap.asObservable() } + var drawButtonDidTap: Observable { base.drawButton.rx.tap.asObservable() } +} diff --git a/Projects/Features/MyInfoFeature/Sources/Views/LoginWarningView.swift b/Projects/Features/MyInfoFeature/Sources/Views/LoginWarningView.swift new file mode 100644 index 000000000..4e0a77609 --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/Views/LoginWarningView.swift @@ -0,0 +1,84 @@ +import DesignSystem +import RxCocoa +import RxSwift +import SnapKit +import Then +import UIKit + +private protocol LoginWarningActionProtocol { + var loginButtonDidTap: Observable { get } +} + +final class LoginWarningView: UIView { + private let imageView: UIImageView = UIImageView().then { + $0.contentMode = .scaleAspectFill + $0.image = DesignSystemAsset.Search.warning.image + } + + private let label = WMLabel( + text: "", + textColor: DesignSystemAsset.BlueGrayColor.blueGray900.color, + font: .t6(weight: .medium), + alignment: .center, + lineHeight: UIFont.WMFontSystem.t6().lineHeight, + kernValue: -0.5 + ).then { + $0.backgroundColor = .clear + $0.numberOfLines = .zero + } + + fileprivate let button: UIButton = UIButton().then { + $0.titleLabel?.font = DesignSystemFontFamily.Pretendard.medium.font(size: 14) + $0.setTitle("로그인", for: .normal) + $0.setTitleColor(DesignSystemAsset.BlueGrayColor.blueGray600.color, for: .normal) + $0.layer.cornerRadius = 8 + $0.layer.borderColor = DesignSystemAsset.BlueGrayColor.blueGray400.color.cgColor.copy(alpha: 0.4) + $0.layer.borderWidth = 1 + $0.clipsToBounds = true + } + + init(text: String = "로그인을 해주세요.") { + super.init(frame: .zero) + label.text = text + addView() + setLayout() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +extension LoginWarningView { + func addView() { + self.addSubview(imageView) + self.addSubview(label) + self.addSubview(button) + } + + func setLayout() { + imageView.snp.makeConstraints { + $0.width.height.equalTo(80) + $0.top.equalToSuperview() + $0.centerX.equalToSuperview() + } + + label.snp.makeConstraints { + $0.top.equalTo(imageView.snp.bottom) + $0.leading.trailing.equalToSuperview() + $0.centerX.equalTo(imageView.snp.centerX) + } + + button.snp.makeConstraints { + $0.height.equalTo(44) + $0.width.equalTo(164) + $0.top.equalTo(label.snp.bottom).offset(16) + $0.centerX.equalToSuperview() + } + } +} + +extension Reactive: LoginWarningActionProtocol where Base: LoginWarningView { + var loginButtonDidTap: Observable { base.button.rx.tap.asObservable() } +} diff --git a/Projects/Features/MyInfoFeature/Sources/Views/MyInfoNavigationButton.swift b/Projects/Features/MyInfoFeature/Sources/Views/MyInfoNavigationButton.swift new file mode 100644 index 000000000..ad58125f3 --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/Views/MyInfoNavigationButton.swift @@ -0,0 +1,39 @@ +import DesignSystem +import Foundation +import UIKit + +final class MyInfoNavigationButton: VerticalAlignButton { + init(title: String, image: UIImage, spacing: CGFloat = 8) { + super.init(title: title, image: image, spacing: spacing) + setTitle() + setSpacing(spacing) + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func setTitle( + font: UIFont = .setFont(.t6(weight: .light)), + color: UIColor = DesignSystemAsset.BlueGrayColor.blueGray600.color + ) { + var config = self.configuration + config?.baseForegroundColor = color + + config?.titleTextAttributesTransformer = UIConfigurationTextAttributesTransformer { + var attribute = $0 + attribute.font = font + attribute.foregroundColor = color + return attribute + } + self.configuration = config + } + + func setSpacing(_ spacing: CGFloat) { + if var config = self.configuration { + config.imagePadding = spacing + self.configuration = config + } + } +} diff --git a/Projects/Features/MyInfoFeature/Sources/Views/MyInfoView.swift b/Projects/Features/MyInfoFeature/Sources/Views/MyInfoView.swift new file mode 100644 index 000000000..894c8874d --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/Views/MyInfoView.swift @@ -0,0 +1,216 @@ +import DesignSystem +import RxCocoa +import RxSwift +import SignInFeatureInterface +import SnapKit +import Then +import UIKit +import UserDomainInterface +import Utility + +private protocol MyInfoStateProtocol { + func updateIsHiddenLoginWarningView(isLoggedIn: Bool) + func updateFruitCount(count: Int) +} + +private protocol MyInfoActionProtocol { + var scrollViewDidTap: Observable { get } + var loginButtonDidTap: Observable { get } + var profileImageDidTap: Observable { get } + var fruitStorageButtonDidTap: Observable { get } + var drawButtonDidTap: Observable { get } + var fruitNavigationButtonDidTap: Observable { get } + var qnaNavigationButtonDidTap: Observable { get } + var notiNavigationButtonDidTap: Observable { get } + var mailNavigationButtonDidTap: Observable { get } + var teamNavigationButtonDidTap: Observable { get } + var settingNavigationButtonDidTap: Observable { get } +} + +final class MyInfoView: UIView { + let scrollView = UIScrollView() + let contentView = UIView() + + let loginWarningView = LoginWarningView(text: "로그인을 해주세요.") + + let profileView = ProfileView().then { + $0.isHidden = true + } + + let fruitDrawButtonView = FruitDrawButtonView() + + let vStackView = UIStackView().then { + $0.axis = .vertical + $0.distribution = .fillEqually + } + + let hStackViewTop = UIStackView().then { + $0.axis = .horizontal + $0.spacing = 10 + $0.distribution = .fillEqually + } + + let hStackViewBottom = UIStackView().then { + $0.axis = .horizontal + $0.spacing = 10 + $0.distribution = .fillEqually + } + + let fruitNavigationButton = MyInfoNavigationButton( + title: "열매함", + image: DesignSystemAsset.MyInfo.fruit.image + ) + let qnaNavigationButton = MyInfoNavigationButton( + title: "자주 묻는 질문", + image: DesignSystemAsset.MyInfo.qna.image + ) + let notiNavigationButton = MyInfoNavigationButton( + title: "공지사항", + image: DesignSystemAsset.MyInfo.noti.image + ) + let mailNavigationButton = MyInfoNavigationButton( + title: "문의하기", + image: DesignSystemAsset.MyInfo.mail.image + ) + let teamNavigationButton = MyInfoNavigationButton( + title: "팀 소개", + image: DesignSystemAsset.MyInfo.team.image + ) + let settingNavigationButton = MyInfoNavigationButton( + title: "설정", + image: DesignSystemAsset.MyInfo.gear.image + ) + let newNotiIndicator = UIView().then { + $0.backgroundColor = .red + $0.layer.cornerRadius = 2.5 + $0.isHidden = true + } + + init() { + super.init(frame: .zero) + addView() + setLayout() + self.backgroundColor = DesignSystemAsset.BlueGrayColor.blueGray100.color + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +private extension MyInfoView { + func addView() { + self.addSubview(scrollView) + scrollView.addSubview(contentView) + contentView.addSubviews( + loginWarningView, + profileView, + fruitDrawButtonView, + vStackView, + newNotiIndicator + ) + vStackView.addArrangedSubviews( + hStackViewTop, + hStackViewBottom + ) + hStackViewTop.addArrangedSubviews( + fruitNavigationButton, + qnaNavigationButton, + notiNavigationButton + ) + hStackViewBottom.addArrangedSubviews( + mailNavigationButton, + teamNavigationButton, + settingNavigationButton + ) + } + + func setLayout() { + scrollView.snp.makeConstraints { + $0.top.equalTo(safeAreaLayoutGuide) + $0.horizontalEdges.equalToSuperview() + $0.bottom.equalToSuperview() + } + contentView.snp.makeConstraints { + $0.width.equalToSuperview() + $0.edges.equalTo(scrollView.contentLayoutGuide) + } + + loginWarningView.snp.makeConstraints { + $0.top.equalToSuperview().offset(40) + $0.centerX.equalToSuperview() + $0.width.equalTo(164) + $0.height.equalTo(154) + } + + profileView.snp.makeConstraints { + $0.top.equalToSuperview().offset(52) + $0.centerX.equalToSuperview() + $0.height.equalTo(162) + } + + fruitDrawButtonView.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview().inset(20) + $0.height.equalTo(52) + $0.top.equalTo(loginWarningView.snp.bottom).offset(52) + } + + vStackView.snp.makeConstraints { + $0.height.equalTo(200) + $0.horizontalEdges.equalToSuperview().inset(20) + $0.top.equalTo(fruitDrawButtonView.snp.bottom).offset(16) + $0.bottom.equalToSuperview() + } + + hStackViewTop.snp.makeConstraints { + $0.height.equalTo(100) + } + + hStackViewBottom.snp.makeConstraints { + $0.height.equalTo(100) + } + + newNotiIndicator.snp.makeConstraints { + $0.width.height.equalTo(5) + $0.centerX.equalTo(notiNavigationButton.snp.centerX).offset(27) + $0.centerY.equalTo(notiNavigationButton.snp.centerY).offset(12) + } + } +} + +extension MyInfoView: MyInfoStateProtocol { + func updateIsHiddenLoginWarningView(isLoggedIn: Bool) { + if isLoggedIn { + loginWarningView.isHidden = true + profileView.isHidden = false + } else { + profileView.isHidden = true + loginWarningView.isHidden = false + } + } + + func updateFruitCount(count: Int) { + fruitDrawButtonView.updateFruitCount(count: count) + } +} + +extension Reactive: MyInfoActionProtocol where Base: MyInfoView { + var scrollViewDidTap: Observable { + let tapGestureRecognizer = UITapGestureRecognizer() + base.scrollView.addGestureRecognizer(tapGestureRecognizer) + base.scrollView.isUserInteractionEnabled = true + return tapGestureRecognizer.rx.event.map { _ in }.asObservable() + } + + var loginButtonDidTap: Observable { base.loginWarningView.rx.loginButtonDidTap } + var profileImageDidTap: Observable { base.profileView.rx.profileImageDidTap } + var fruitStorageButtonDidTap: Observable { base.fruitDrawButtonView.rx.fruitStorageButtonDidTap } + var drawButtonDidTap: Observable { base.fruitDrawButtonView.rx.drawButtonDidTap } + var fruitNavigationButtonDidTap: Observable { base.fruitNavigationButton.rx.tap.asObservable() } + var qnaNavigationButtonDidTap: Observable { base.qnaNavigationButton.rx.tap.asObservable() } + var notiNavigationButtonDidTap: Observable { base.notiNavigationButton.rx.tap.asObservable() } + var mailNavigationButtonDidTap: Observable { base.mailNavigationButton.rx.tap.asObservable() } + var teamNavigationButtonDidTap: Observable { base.teamNavigationButton.rx.tap.asObservable() } + var settingNavigationButtonDidTap: Observable { base.settingNavigationButton.rx.tap.asObservable() } +} diff --git a/Projects/Features/MyInfoFeature/Sources/Views/NoticeDetailHeaderView.swift b/Projects/Features/MyInfoFeature/Sources/Views/NoticeDetailHeaderView.swift new file mode 100644 index 000000000..a9fd653d9 --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/Views/NoticeDetailHeaderView.swift @@ -0,0 +1,73 @@ +import DesignSystem +import NoticeDomainInterface +import UIKit +import Utility + +class NoticeDetailHeaderView: UICollectionReusableView { + @IBOutlet weak var titleStringLabel: UILabel! + @IBOutlet weak var dateLabel: UILabel! + @IBOutlet weak var timeLabel: UILabel! + @IBOutlet weak var contentStringLabel: UILabel! + + override func awakeFromNib() { + super.awakeFromNib() + + titleStringLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 18) + titleStringLabel.textColor = DesignSystemAsset.BlueGrayColor.gray900.color + titleStringLabel.setTextWithAttributes(kernValue: -0.5, lineSpacing: 0, lineHeightMultiple: 1.26) + + dateLabel.font = DesignSystemFontFamily.Pretendard.light.font(size: 12) + dateLabel.textColor = DesignSystemAsset.BlueGrayColor.gray500.color + dateLabel.setTextWithAttributes(kernValue: -0.5, lineSpacing: 0, lineHeightMultiple: 0) + + timeLabel.font = DesignSystemFontFamily.Pretendard.light.font(size: 12) + timeLabel.textColor = DesignSystemAsset.BlueGrayColor.gray500.color + timeLabel.setTextWithAttributes(kernValue: -0.5, lineSpacing: 0, lineHeightMultiple: 0) + + contentStringLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 14) + contentStringLabel.textColor = DesignSystemAsset.BlueGrayColor.gray900.color + contentStringLabel.setTextWithAttributes(kernValue: -0.5, lineSpacing: 0, lineHeightMultiple: 1.26) + } +} + +extension NoticeDetailHeaderView { + static func getCellHeight(model: FetchNoticeEntity) -> CGFloat { + let availableWidth: CGFloat = APP_WIDTH() - 40 + let paragraphStyle = NSMutableParagraphStyle() + paragraphStyle.lineHeightMultiple = 1.26 + + let titleAttributedString = NSMutableAttributedString( + string: model.title, + attributes: [ + .font: DesignSystemFontFamily.Pretendard.medium.font(size: 18), + .foregroundColor: DesignSystemAsset.BlueGrayColor.gray900.color, + .kern: -0.5, + .paragraphStyle: paragraphStyle + ] + ) + let titleHeight: CGFloat = max(28, titleAttributedString.height(containerWidth: availableWidth)) + + let contentString: String = model.content + let contentAttributedString = NSMutableAttributedString( + string: contentString, + attributes: [ + .font: DesignSystemFontFamily.Pretendard.medium.font(size: 14), + .foregroundColor: DesignSystemAsset.BlueGrayColor.gray900.color, + .kern: -0.5, + .paragraphStyle: paragraphStyle + ] + ) + let contentHeight: CGFloat = contentString.isEmpty ? 0 : contentAttributedString + .height(containerWidth: availableWidth) + + let baseHeight: CGFloat = 12 + 3 + 18 + 20 + 1 + 20 + return titleHeight + contentHeight + baseHeight + } + + func update(model: FetchNoticeEntity) { + titleStringLabel.text = model.title + dateLabel.text = (model.createdAt / 1000.0).unixTimeToDate.dateToString(format: "yy.MM.dd") + timeLabel.text = (model.createdAt / 1000.0).unixTimeToDate.dateToString(format: "HH:mm") + contentStringLabel.text = model.content + } +} diff --git a/Projects/Features/MyInfoFeature/Sources/Views/NoticeListCell.swift b/Projects/Features/MyInfoFeature/Sources/Views/NoticeListCell.swift new file mode 100644 index 000000000..719cf798b --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/Views/NoticeListCell.swift @@ -0,0 +1,56 @@ +import DesignSystem +import NoticeDomainInterface +import UIKit +import Utility + +class NoticeListCell: UITableViewCell { + @IBOutlet weak var titleStringLabel: UILabel! + @IBOutlet weak var dayLabel: UILabel! + @IBOutlet weak var timeLabel: UILabel! + + override func awakeFromNib() { + super.awakeFromNib() + self.backgroundColor = .clear + self.contentView.backgroundColor = .clear + + titleStringLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) + titleStringLabel.textColor = DesignSystemAsset.BlueGrayColor.blueGray900.color + titleStringLabel.setTextWithAttributes(kernValue: -0.5, lineSpacing: 0, lineHeightMultiple: 1.26) + + dayLabel.font = DesignSystemFontFamily.Pretendard.light.font(size: 12) + dayLabel.textColor = DesignSystemAsset.BlueGrayColor.blueGray500.color + dayLabel.setTextWithAttributes(kernValue: -0.5, lineSpacing: 0, lineHeightMultiple: 0) + + timeLabel.font = DesignSystemFontFamily.Pretendard.light.font(size: 12) + timeLabel.textColor = DesignSystemAsset.BlueGrayColor.blueGray500.color + timeLabel.setTextWithAttributes(kernValue: -0.5, lineSpacing: 0, lineHeightMultiple: 0) + } +} + +extension NoticeListCell { + func update(model: FetchNoticeEntity) { + titleStringLabel.text = model.title + dayLabel.text = (model.createdAt / 1000.0).unixTimeToDate.dateToString(format: "yy.MM.dd") + timeLabel.text = (model.createdAt / 1000.0).unixTimeToDate.dateToString(format: "HH:mm") + } + + func updateVisibleIndicator(visible: Bool) { + if visible { + let attributedString = NSMutableAttributedString(string: titleStringLabel.text ?? "") + let padding = NSTextAttachment() + let imageAttachment = NSTextAttachment() + imageAttachment.image = DesignSystemAsset.MyInfo.redDot.image + imageAttachment.bounds = CGRect(x: 0, y: 10, width: 5, height: 5) + padding.bounds = CGRect(x: 0, y: 0, width: 2, height: 0) + + attributedString.append(NSAttributedString(attachment: padding)) + attributedString.append(NSAttributedString(attachment: imageAttachment)) + titleStringLabel.attributedText = attributedString + } else { + guard let attributedText = titleStringLabel.attributedText else { return } + let text = attributedText.string + titleStringLabel.attributedText = nil + titleStringLabel.text = text + } + } +} diff --git a/Projects/Features/CommonFeature/Sources/Views/OpenSourceLibraryCell.swift b/Projects/Features/MyInfoFeature/Sources/Views/OpenSourceLibraryCell.swift similarity index 79% rename from Projects/Features/CommonFeature/Sources/Views/OpenSourceLibraryCell.swift rename to Projects/Features/MyInfoFeature/Sources/Views/OpenSourceLibraryCell.swift index 7f5d4db5f..70187daf1 100644 --- a/Projects/Features/CommonFeature/Sources/Views/OpenSourceLibraryCell.swift +++ b/Projects/Features/MyInfoFeature/Sources/Views/OpenSourceLibraryCell.swift @@ -6,32 +6,32 @@ // Copyright © 2023 yongbeomkwak. All rights reserved. // -import UIKit import DesignSystem +import UIKit import Utility public class OpenSourceLibraryCell: UITableViewCell { @IBOutlet weak var titleStringLabel: UILabel! @IBOutlet weak var descriptionLabel: UILabel! - - public override func awakeFromNib() { + + override public func awakeFromNib() { super.awakeFromNib() self.backgroundColor = .clear self.contentView.backgroundColor = .clear titleStringLabel.font = DesignSystemFontFamily.Pretendard.bold.font(size: 15) - titleStringLabel.textColor = DesignSystemAsset.GrayColor.gray900.color + titleStringLabel.textColor = DesignSystemAsset.BlueGrayColor.gray900.color titleStringLabel.setTextWithAttributes(kernValue: -0.5) titleStringLabel.numberOfLines = 0 descriptionLabel.font = DesignSystemFontFamily.Pretendard.light.font(size: 13) - descriptionLabel.textColor = DesignSystemAsset.GrayColor.gray500.color + descriptionLabel.textColor = DesignSystemAsset.BlueGrayColor.gray500.color descriptionLabel.setTextWithAttributes(kernValue: -0.5) descriptionLabel.lineBreakMode = .byWordWrapping descriptionLabel.numberOfLines = 0 } } -extension OpenSourceLibraryCell { - static public func getCellHeight(model: OpenSourceLicense) -> CGFloat { +public extension OpenSourceLibraryCell { + static func getCellHeight(model: OpenSourceLicense) -> CGFloat { let baseMargin: CGFloat = 25 let titleAttributedString = NSAttributedString( string: model.title, @@ -40,8 +40,8 @@ extension OpenSourceLibraryCell { .kern: -0.5 ] ) - let titleHeight: CGFloat = titleAttributedString.height(containerWidth: APP_WIDTH()-40) - + let titleHeight: CGFloat = titleAttributedString.height(containerWidth: APP_WIDTH() - 40) + let descriptionAttributedString = NSAttributedString( string: model.description, attributes: [ @@ -49,12 +49,12 @@ extension OpenSourceLibraryCell { .kern: -0.5 ] ) - let descriptionHeight: CGFloat = descriptionAttributedString.height(containerWidth: APP_WIDTH()-50) - + let descriptionHeight: CGFloat = descriptionAttributedString.height(containerWidth: APP_WIDTH() - 50) + return baseMargin + titleHeight + descriptionHeight } - - public func update(model: OpenSourceLicense){ + + func update(model: OpenSourceLicense) { titleStringLabel.text = model.title descriptionLabel.text = model.description } diff --git a/Projects/Features/CommonFeature/Sources/Views/OpenSourceLicenseCell.swift b/Projects/Features/MyInfoFeature/Sources/Views/OpenSourceLicenseCell.swift similarity index 82% rename from Projects/Features/CommonFeature/Sources/Views/OpenSourceLicenseCell.swift rename to Projects/Features/MyInfoFeature/Sources/Views/OpenSourceLicenseCell.swift index 842c9bf57..d1f15254b 100644 --- a/Projects/Features/CommonFeature/Sources/Views/OpenSourceLicenseCell.swift +++ b/Projects/Features/MyInfoFeature/Sources/Views/OpenSourceLicenseCell.swift @@ -6,24 +6,24 @@ // Copyright © 2023 yongbeomkwak. All rights reserved. // -import UIKit import DesignSystem +import UIKit import Utility class OpenSourceLicenseCell: UITableViewCell { @IBOutlet weak var titleStringLabel: UILabel! @IBOutlet weak var descriptionLabel: UILabel! - + override func awakeFromNib() { super.awakeFromNib() self.backgroundColor = .clear self.contentView.backgroundColor = .clear titleStringLabel.font = DesignSystemFontFamily.Pretendard.bold.font(size: 18) - titleStringLabel.textColor = DesignSystemAsset.GrayColor.gray900.color + titleStringLabel.textColor = DesignSystemAsset.BlueGrayColor.gray900.color titleStringLabel.setTextWithAttributes(kernValue: -0.5) titleStringLabel.numberOfLines = 0 descriptionLabel.font = DesignSystemFontFamily.Pretendard.light.font(size: 13) - descriptionLabel.textColor = DesignSystemAsset.GrayColor.gray500.color + descriptionLabel.textColor = DesignSystemAsset.BlueGrayColor.gray500.color descriptionLabel.setTextWithAttributes(kernValue: -0.5) descriptionLabel.lineBreakMode = .byWordWrapping descriptionLabel.numberOfLines = 0 @@ -31,7 +31,7 @@ class OpenSourceLicenseCell: UITableViewCell { } extension OpenSourceLicenseCell { - static public func getCellHeight(model: OpenSourceLicense) -> CGFloat { + public static func getCellHeight(model: OpenSourceLicense) -> CGFloat { let baseMargin: CGFloat = 71 let titleAttributedString = NSAttributedString( string: model.title, @@ -40,8 +40,8 @@ extension OpenSourceLicenseCell { .kern: -0.5 ] ) - let titleHeight: CGFloat = titleAttributedString.height(containerWidth: APP_WIDTH()-40) - + let titleHeight: CGFloat = titleAttributedString.height(containerWidth: APP_WIDTH() - 40) + let descriptionAttributedString = NSAttributedString( string: model.description, attributes: [ @@ -49,12 +49,12 @@ extension OpenSourceLicenseCell { .kern: -0.5 ] ) - let descriptionHeight: CGFloat = descriptionAttributedString.height(containerWidth: APP_WIDTH()-40) - + let descriptionHeight: CGFloat = descriptionAttributedString.height(containerWidth: APP_WIDTH() - 40) + return baseMargin + titleHeight + descriptionHeight } - - public func update(model: OpenSourceLicense){ + + public func update(model: OpenSourceLicense) { titleStringLabel.text = model.title descriptionLabel.text = model.description } diff --git a/Projects/Features/MyInfoFeature/Sources/Views/PlayTypeTogglePopupItemButton.swift b/Projects/Features/MyInfoFeature/Sources/Views/PlayTypeTogglePopupItemButton.swift new file mode 100644 index 000000000..02423ee13 --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/Views/PlayTypeTogglePopupItemButton.swift @@ -0,0 +1,210 @@ +import DesignSystem +import SnapKit +import Then +import UIKit + +protocol PlayTypeTogglePopupItemButtonViewDelegate: AnyObject { + func tappedButtonAction(title: String) +} + +final class PlayTypeTogglePopupItemButtonView: UIView { + private let baseView = UIView().then { + $0.layer.cornerRadius = 12 + $0.layer.borderColor = DesignSystemAsset.BlueGrayColor.gray200.color.cgColor + $0.layer.borderWidth = 1 + $0.backgroundColor = .white + $0.layer.addShadow( + color: UIColor(hex: "#080F34"), + alpha: 0.08, + x: 0, + y: 2, + blur: 4, + spread: 0 + ) + } + + private let titleLabel = WMLabel( + text: "", + textColor: DesignSystemAsset.BlueGrayColor.blueGray900.color, + font: .t5(weight: .light), + alignment: .left + ) + + private let imageView = UIImageView().then { + $0.image = DesignSystemAsset.Storage.checkBox.image + $0.contentMode = .scaleAspectFit + } + + private let installButton = InstallButton().then { + $0.isHidden = true + } + + private let button = UIButton() + + private weak var delegate: PlayTypeTogglePopupItemButtonViewDelegate? + + private var shouldCheckAppIsInstalled: Bool = false + + var isSelected: Bool = false { + didSet { + didChangedSelection(isSelected) + } + } + + override init(frame: CGRect) { + super.init(frame: frame) + backgroundColor = .white + addViews() + setLayout() + setActions() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func setDelegate(_ delegate: PlayTypeTogglePopupItemButtonViewDelegate) { + self.delegate = delegate + } + + func setTitleWithOption( + title: String, + shouldCheckAppIsInstalled: Bool = false + ) { + self.titleLabel.text = title + self.shouldCheckAppIsInstalled = shouldCheckAppIsInstalled + if shouldCheckAppIsInstalled { + checkAppIsInstalled() + } + } + + @discardableResult + func checkAppIsInstalled() -> Bool { + let isInstalled: Bool + if let url = URL(string: "youtubemusic://"), UIApplication.shared.canOpenURL(url) { + isInstalled = true + } else { + isInstalled = false + } + installButton.isHidden = isInstalled + button.isEnabled = isInstalled + + return isInstalled + } +} + +private extension PlayTypeTogglePopupItemButtonView { + func didChangedSelection(_ isSelected: Bool) { + UIView.animate(withDuration: 0.2) { [weak self] in + guard let self else { return } + + self.baseView.layer.borderColor = isSelected ? + DesignSystemAsset.PrimaryColorV2.decrease.color.cgColor : + DesignSystemAsset.BlueGrayColor.blueGray200.color.withAlphaComponent(0.4).cgColor + + self.baseView.layer.shadowOpacity = isSelected ? 0.08 : 0 + } + + self.imageView.image = isSelected ? + DesignSystemAsset.Storage.checkBox.image : nil + + let font = isSelected ? + UIFont.WMFontSystem.t5(weight: .medium) : + UIFont.WMFontSystem.t5(weight: .light) + self.titleLabel.setFont(font) + self.titleLabel.textColor = isSelected ? + DesignSystemAsset.PrimaryColorV2.decrease.color : + DesignSystemAsset.BlueGrayColor.blueGray900.color + } + + func setActions() { + let buttonAction = UIAction { [weak self] _ in + guard let self = self else { return } + self.delegate?.tappedButtonAction(title: titleLabel.text ?? "") + } + button.addAction(buttonAction, for: .touchUpInside) + + installButton.addAction { + let youtubeMusicAppStoreURL = "itms-apps://apps.apple.com/app/id1017492454" + if let url = URL(string: youtubeMusicAppStoreURL) { + UIApplication.shared.open(url, options: [:], completionHandler: nil) + } + } + } + + func addViews() { + addSubview(baseView) + addSubview(titleLabel) + addSubview(imageView) + addSubview(button) + addSubview(installButton) + } + + func setLayout() { + baseView.snp.makeConstraints { + $0.edges.equalToSuperview() + } + + titleLabel.snp.makeConstraints { + $0.centerY.equalToSuperview() + $0.leading.equalToSuperview().inset(16) + $0.trailing.equalTo(imageView.snp.leading).offset(-20) + } + + imageView.snp.makeConstraints { + $0.size.equalTo(24) + $0.trailing.equalToSuperview().inset(20) + $0.centerY.equalToSuperview() + } + + button.snp.makeConstraints { + $0.edges.equalTo(baseView) + } + + installButton.snp.makeConstraints { + $0.edges.equalToSuperview() + } + } +} + +private extension PlayTypeTogglePopupItemButtonView { + class InstallButton: UIButton { + private let messageLabel = WMLabel( + text: "미설치", + textColor: DesignSystemAsset.BlueGrayColor.gray400.color, + font: .t7(weight: .bold), + alignment: .center + ).then { + $0.layer.cornerRadius = 4 + $0.layer.borderWidth = 1 + $0.layer.borderColor = DesignSystemAsset.BlueGrayColor.gray300.color.cgColor + $0.backgroundColor = .white + $0.clipsToBounds = true + } + + init() { + super.init(frame: .zero) + addViews() + setLayout() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func addViews() { + addSubviews(messageLabel) + } + + func setLayout() { + messageLabel.snp.makeConstraints { + $0.width.equalTo(55) + $0.height.equalTo(24) + $0.trailing.equalToSuperview().inset(20) + $0.centerY.equalToSuperview() + } + } + } +} diff --git a/Projects/Features/MyInfoFeature/Sources/Views/ProfileCollectionViewCell.swift b/Projects/Features/MyInfoFeature/Sources/Views/ProfileCollectionViewCell.swift new file mode 100644 index 000000000..121019677 --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/Views/ProfileCollectionViewCell.swift @@ -0,0 +1,33 @@ +import DesignSystem +import ImageDomainInterface +import UIKit +import Utility + +public class ProfileCollectionViewCell: UICollectionViewCell { + @IBOutlet weak var imageView: UIImageView! + @IBOutlet weak var outerView: UIView! + + override public func awakeFromNib() { + super.awakeFromNib() + clipsToBounds = false + contentView.clipsToBounds = false + } +} + +public extension ProfileCollectionViewCell { + func update(_ model: ProfileListEntity) { + imageView.layer.cornerRadius = ((APP_WIDTH() - 70) / 4) / 2 + imageView.kf.setImage( + with: URL(string: model.url), + placeholder: nil, + options: [.transition(.fade(0.2))] + ) + + outerView.layer.cornerRadius = imageView.layer.cornerRadius + 2 + outerView.layer.borderColor = model.isSelected ? + DesignSystemAsset.PrimaryColor.point.color.cgColor : + UIColor.clear.cgColor + outerView.layer.borderWidth = 2 + outerView.clipsToBounds = false + } +} diff --git a/Projects/Features/MyInfoFeature/Sources/Views/ProfileView.swift b/Projects/Features/MyInfoFeature/Sources/Views/ProfileView.swift new file mode 100644 index 000000000..8a27a11af --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/Views/ProfileView.swift @@ -0,0 +1,178 @@ +import DesignSystem +import Kingfisher +import RxCocoa +import RxGesture +import RxSwift +import SnapKit +import Then +import UIKit +import Utility + +private protocol ProfileStateProtocol { + func updateProfileImage(image: String) + func updateNickName(nickname: String) + func updatePlatform(platform: String) +} + +private protocol ProfileActionProtocol { + var profileImageDidTap: Observable { get } +} + +final class ProfileView: UIView { + fileprivate let imageView: UIImageView = UIImageView().then { + $0.contentMode = .scaleAspectFill + $0.layer.cornerRadius = 92 / 2.0 + $0.clipsToBounds = true + $0.isUserInteractionEnabled = true + } + + private let nameLabel = WMLabel( + text: "", + textColor: DesignSystemAsset.BlueGrayColor.blueGray900.color, + font: .t4(weight: .light), + alignment: .center, + lineHeight: UIFont.WMFontSystem.t4().lineHeight, + kernValue: -0.5 + ).then { + $0.backgroundColor = .clear + $0.numberOfLines = .zero + } + + private let platformLabel = WMLabel( + text: "로 로그인 중", + textColor: DesignSystemAsset.BlueGrayColor.blueGray600.color, + font: .t6(weight: .light), + alignment: .center, + lineHeight: UIFont.WMFontSystem.t6().lineHeight, + kernValue: -0.5 + ).then { + $0.backgroundColor = .clear + $0.numberOfLines = .zero + } + + fileprivate let didTapProfileImageSubject = PublishSubject() + private let scaleDownTransform = CGAffineTransform(scaleX: 0.9, y: 0.9) + private let disposeBag = DisposeBag() + + init() { + super.init(frame: .zero) + addView() + setLayout() + registerGesture() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func highlightName() { + guard let text = self.nameLabel.text else { return } + let attrStr = NSMutableAttributedString(string: text) + let strLength = attrStr.length + let nameRange = NSRange(location: 0, length: strLength - 1) + let lastRange = NSRange(location: strLength - 1, length: 1) + let color = DesignSystemAsset.BlueGrayColor.blueGray900.color + let lightColor = DesignSystemAsset.BlueGrayColor.blueGray500.color + let font = UIFont.setFont(.t3(weight: .medium)) + let lightFont = UIFont.setFont(.t4(weight: .light)) + attrStr.addAttribute(.foregroundColor, value: color, range: nameRange) + attrStr.addAttribute(.font, value: font, range: nameRange) + attrStr.addAttribute(.foregroundColor, value: lightColor, range: lastRange) + attrStr.addAttribute(.font, value: lightFont, range: lastRange) + self.nameLabel.attributedText = attrStr + } +} + +private extension ProfileView { + func addView() { + self.addSubview(imageView) + self.addSubview(nameLabel) + self.addSubview(platformLabel) + } + + func setLayout() { + imageView.snp.makeConstraints { + $0.width.height.equalTo(92) + $0.top.equalToSuperview() + $0.centerX.equalToSuperview() + } + + nameLabel.snp.makeConstraints { + $0.top.equalTo(imageView.snp.bottom).offset(12) + $0.horizontalEdges.equalToSuperview() + $0.centerX.equalTo(imageView.snp.centerX) + } + + platformLabel.snp.makeConstraints { + $0.top.equalTo(nameLabel.snp.bottom).offset(4) + $0.horizontalEdges.equalToSuperview() + $0.centerX.equalToSuperview() + } + } + + func registerGesture() { + imageView.rx.longPressGesture(configuration: { gestureRecognizer, delegate in + gestureRecognizer.minimumPressDuration = 0.0 + delegate.selfFailureRequirementPolicy = .always + }) + .bind(with: self) { owner, gesture in + switch gesture.state { + case .began: + UIViewPropertyAnimator(duration: 0.1, curve: .easeInOut) { + owner.imageView.transform = owner.scaleDownTransform + } + .startAnimation() + case .ended, .cancelled: + let animator = UIViewPropertyAnimator(duration: 0.3, dampingRatio: 0.5, animations: { + owner.imageView.transform = .identity + }) + animator.startAnimation() + owner.didTapProfileImageSubject.onNext(()) + default: + break + } + } + .disposed(by: disposeBag) + } +} + +extension ProfileView: ProfileStateProtocol { + func updateProfileImage(image: String) { + imageView.kf.setImage( + with: URL(string: image), + placeholder: nil, + options: [ + .transition(.fade(0.5)), + .processor(DownsamplingImageProcessor(size: CGSize(width: 300, height: 300))) + ] + ) + } + + func updateNickName(nickname: String) { + nameLabel.text = nickname + "님" + highlightName() + } + + func updatePlatform(platform: String) { + var platformStr = "" + switch platform { + case "naver": + platformStr = "네이버" + case "google": + platformStr = "구글" + case "apple": + platformStr = "애플" + default: + platformStr = "Unknown" + } + platformLabel.text = "\(platformStr)로 로그인 중" + } +} + +extension Reactive: ProfileActionProtocol where Base: ProfileView { + var profileImageDidTap: Observable { + return base.didTapProfileImageSubject.asObserver() + .throttle(.milliseconds(500), latest: false, scheduler: MainScheduler.asyncInstance) + } +} diff --git a/Projects/Features/MyInfoFeature/Sources/Views/QuestionTableViewCell.swift b/Projects/Features/MyInfoFeature/Sources/Views/QuestionTableViewCell.swift new file mode 100644 index 000000000..ce19cce34 --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/Views/QuestionTableViewCell.swift @@ -0,0 +1,26 @@ +import DesignSystem +import FaqDomainInterface +import UIKit + +class QuestionTableViewCell: UITableViewCell { + @IBOutlet weak var categoryLabel: UILabel! + @IBOutlet weak var titleLabel: UILabel! + @IBOutlet weak var expandImageView: UIImageView! + + override func awakeFromNib() { + super.awakeFromNib() + categoryLabel.font = DesignSystemFontFamily.Pretendard.light.font(size: 12) + categoryLabel.setTextWithAttributes(kernValue: -0.5) + titleLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) + titleLabel.setTextWithAttributes(kernValue: -0.5, lineSpacing: 5) + } +} + +extension QuestionTableViewCell { + public func update(model: FaqEntity) { + categoryLabel.text = model.category + titleLabel.text = model.question + expandImageView.image = model.isOpen ? DesignSystemAsset.Navigation.fold.image : DesignSystemAsset.Navigation + .close.image + } +} diff --git a/Projects/Features/CommonFeature/Sources/Views/ServiceInfoCell.swift b/Projects/Features/MyInfoFeature/Sources/Views/ServiceInfoCell.swift similarity index 81% rename from Projects/Features/CommonFeature/Sources/Views/ServiceInfoCell.swift rename to Projects/Features/MyInfoFeature/Sources/Views/ServiceInfoCell.swift index 7025bc061..241988d67 100644 --- a/Projects/Features/CommonFeature/Sources/Views/ServiceInfoCell.swift +++ b/Projects/Features/MyInfoFeature/Sources/Views/ServiceInfoCell.swift @@ -6,36 +6,36 @@ // Copyright © 2023 yongbeomkwak. All rights reserved. // -import UIKit import DesignSystem +import UIKit import Utility class ServiceInfoCell: UITableViewCell { - @IBOutlet weak var titleStringLabel: UILabel! @IBOutlet weak var subTitleStringLabel: UILabel! @IBOutlet weak var arrowImageView: UIImageView! @IBOutlet weak var stackViewTrailingConstraint: NSLayoutConstraint! - + override func awakeFromNib() { super.awakeFromNib() arrowImageView.image = DesignSystemAsset.Navigation.serviceInfoArrowRight.image self.backgroundColor = .clear self.contentView.backgroundColor = .clear titleStringLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) - titleStringLabel.textColor = DesignSystemAsset.GrayColor.gray900.color + titleStringLabel.textColor = DesignSystemAsset.BlueGrayColor.gray900.color titleStringLabel.setTextWithAttributes(kernValue: -0.5) subTitleStringLabel.font = DesignSystemFontFamily.Pretendard.light.font(size: 12) - subTitleStringLabel.textColor = DesignSystemAsset.GrayColor.gray500.color + subTitleStringLabel.textColor = DesignSystemAsset.BlueGrayColor.gray500.color subTitleStringLabel.setTextWithAttributes(kernValue: -0.5) } } -extension ServiceInfoCell{ +extension ServiceInfoCell { public func update(model: ServiceInfoGroup) { titleStringLabel.text = model.name subTitleStringLabel.text = model.subName - subTitleStringLabel.font = (model.identifier == .versionInfomation) ? DesignSystemFontFamily.SCoreDream._3Light.font(size: 12) : DesignSystemFontFamily.Pretendard.light.font(size: 12) + subTitleStringLabel.font = (model.identifier == .versionInfomation) ? DesignSystemFontFamily.SCoreDream._3Light + .font(size: 12) : DesignSystemFontFamily.Pretendard.light.font(size: 12) arrowImageView.isHidden = model.accessoryType == .onlyTitle stackViewTrailingConstraint.constant = (model.accessoryType == .onlyTitle) ? 24 : 18 selectionStyle = (model.identifier == .versionInfomation) ? .none : .default diff --git a/Projects/Features/MyInfoFeature/Sources/Views/SettingItemTableViewCell.swift b/Projects/Features/MyInfoFeature/Sources/Views/SettingItemTableViewCell.swift new file mode 100644 index 000000000..d35b6a63b --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/Views/SettingItemTableViewCell.swift @@ -0,0 +1,145 @@ +import DesignSystem +import MyInfoFeatureInterface +import SnapKit +import Then +import UIKit +import Utility + +class SettingItemTableViewCell: UITableViewCell { + static let reuseIdentifier = "SettingItemTableViewCell" + var category: SettingItemCategory? + + private let titleLabel = UILabel().then { + $0.font = .setFont(.t5(weight: .medium)) + $0.textColor = DesignSystemAsset.BlueGrayColor.blueGray900.color + $0.setTextWithAttributes(kernValue: -0.5) + $0.textAlignment = .left + $0.numberOfLines = 2 + } + + private let subTitleLabel = UILabel().then { + $0.font = .setFont(.t5(weight: .medium)) + $0.textColor = DesignSystemAsset.BlueGrayColor.blueGray500.color + $0.setTextWithAttributes(kernValue: -0.5) + $0.textAlignment = .right + } + + private let rightImageView = UIImageView().then { + $0.image = DesignSystemAsset.Navigation.serviceInfoArrowRight.image + } + + private let rightLabel = UILabel().then { + $0.text = APP_VERSION() + $0.font = .setFont(.sc7(weight: .score3Light)) + $0.textColor = DesignSystemAsset.BlueGrayColor.blueGray500.color + $0.setTextWithAttributes(kernValue: -0.5) + $0.lineBreakMode = .byTruncatingTail + $0.textAlignment = .right + } + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + addView() + setLayout() + backgroundColor = .clear + contentView.backgroundColor = .clear + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func configure(type: SettingItemType) { + configureTitle(type: type) + configureSubTitle(type: type) + configureRightItem(type: type) + configureIdentifier(type: type) + } +} + +private extension SettingItemTableViewCell { + func configureTitle(type: SettingItemType) { + switch type { + case let .navigate(category): + self.titleLabel.text = category.rawValue + case let .description(category): + self.titleLabel.text = category.rawValue + } + } + + func configureSubTitle(type: SettingItemType) { + switch type { + case let .navigate(category): + let pushNotificationAuthorizationStatus = PreferenceManager.pushNotificationAuthorizationStatus ?? false + let playType = PreferenceManager.songPlayPlatformType ?? .youtube + switch category { + case .appPush: + self.subTitleLabel.text = pushNotificationAuthorizationStatus ? "켜짐" : "꺼짐" + case .playType: + self.subTitleLabel.text = playType.display + default: + self.subTitleLabel.text = "" + } + case let .description(category): + self.subTitleLabel.text = "" + } + } + + func configureRightItem(type: SettingItemType) { + switch type { + case let .navigate(category): + rightImageView.isHidden = false + rightLabel.isHidden = true + subTitleLabel.isHidden = !(category == .appPush || category == .playType) + case .description: + rightImageView.isHidden = true + rightLabel.isHidden = false + subTitleLabel.isHidden = true + } + } + + func configureIdentifier(type: SettingItemType) { + switch type { + case let .navigate(category): + self.category = category + case let .description(category): + self.category = category + } + } +} + +private extension SettingItemTableViewCell { + func addView() { + contentView.addSubview(titleLabel) + contentView.addSubview(subTitleLabel) + contentView.addSubview(rightImageView) + contentView.addSubview(rightLabel) + } + + func setLayout() { + titleLabel.setContentCompressionResistancePriority(.init(rawValue: 749), for: .horizontal) + titleLabel.snp.makeConstraints { + $0.left.equalToSuperview().inset(20) + $0.centerY.equalToSuperview() + } + + rightImageView.snp.makeConstraints { + $0.width.height.equalTo(24) + $0.right.equalToSuperview().inset(20) + $0.centerY.equalToSuperview() + } + + subTitleLabel.snp.makeConstraints { + $0.left.equalTo(titleLabel.snp.right).offset(10) + $0.right.equalTo(rightImageView.snp.left).offset(-2) + $0.centerY.equalToSuperview() + } + + rightLabel.snp.makeConstraints { + $0.width.equalTo(30) + $0.right.equalToSuperview().inset(20) + $0.centerY.equalToSuperview() + } + } +} diff --git a/Projects/Features/MyInfoFeature/Sources/Views/SettingView.swift b/Projects/Features/MyInfoFeature/Sources/Views/SettingView.swift new file mode 100644 index 000000000..59ae8108c --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/Views/SettingView.swift @@ -0,0 +1,158 @@ +import DesignSystem +import NVActivityIndicatorView +import RxCocoa +import RxSwift +import SignInFeatureInterface +import SnapKit +import Then +import UIKit +import UserDomainInterface +import Utility + +private protocol SettingStateProtocol { + func updateIsHiddenWithDrawButton(isHidden: Bool) + func updateIsHiddenLogoutButton(isHidden: Bool) + func updateActivityIndicatorState(isPlaying: Bool) +} + +private protocol SettingActionProtocol { + var dismissButtonDidTap: Observable { get } + var withDrawButtonDidTap: Observable { get } +} + +final class SettingView: UIView { + private let wmNavigationbarView = WMNavigationBarView() + + fileprivate let dismissButton = UIButton().then { + let dismissImage = DesignSystemAsset.Navigation.back.image + $0.setImage(dismissImage, for: .normal) + } + + private let titleLabel = WMLabel( + text: "설정", + textColor: DesignSystemAsset.BlueGrayColor.blueGray900.color, + font: .t5(weight: .medium), + alignment: .center, + lineHeight: UIFont.WMFontSystem.t5().lineHeight, + kernValue: -0.5 + ) + + let settingItemTableView = UITableView().then { + $0.register(SettingItemTableViewCell.self, forCellReuseIdentifier: SettingItemTableViewCell.reuseIdentifier) + $0.separatorStyle = .none + $0.backgroundColor = .clear + } + + private let withDrawContentView = UIView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: 60)) + + private let dotImageView = UIImageView().then { + $0.image = DesignSystemAsset.MyInfo.dot.image + } + + fileprivate let withDrawLabel = WithDrawLabel().then { + $0.preferredMaxLayoutWidth = APP_WIDTH() - 56 + } + + private let activityIndicator = NVActivityIndicatorView( + frame: .zero, + type: .circleStrokeSpin, + color: DesignSystemAsset.PrimaryColor.point.color + ) + + init() { + super.init(frame: .zero) + addView() + setLayout() + configureUI() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +private extension SettingView { + func addView() { + self.addSubviews( + wmNavigationbarView, + titleLabel, + settingItemTableView, + activityIndicator + ) + withDrawContentView.addSubviews(dotImageView, withDrawLabel) + settingItemTableView.tableFooterView = withDrawContentView + } + + func setLayout() { + wmNavigationbarView.snp.makeConstraints { + $0.top.equalTo(safeAreaLayoutGuide) + $0.horizontalEdges.equalToSuperview() + $0.height.equalTo(48) + } + wmNavigationbarView.setLeftViews([dismissButton]) + + titleLabel.snp.makeConstraints { + $0.center.equalTo(wmNavigationbarView.snp.center) + } + + settingItemTableView.snp.makeConstraints { + $0.top.equalTo(wmNavigationbarView.snp.bottom) + $0.horizontalEdges.equalToSuperview() + $0.bottom.equalToSuperview() + } + + dotImageView.snp.makeConstraints { + $0.top.equalTo(withDrawContentView.snp.top).offset(12) + $0.left.equalToSuperview().offset(20) + $0.size.equalTo(16) + } + + withDrawLabel.snp.makeConstraints { + $0.top.equalTo(dotImageView.snp.top) + $0.left.equalTo(dotImageView.snp.right) + $0.height.equalTo(18) + } + + activityIndicator.snp.makeConstraints { + $0.width.height.equalTo(30) + $0.center.equalToSuperview() + } + } + + func configureUI() { + activityIndicator.isHidden = true + activityIndicator.stopAnimating() + } +} + +extension SettingView: SettingStateProtocol { + func updateActivityIndicatorState(isPlaying: Bool) { + if isPlaying { + self.activityIndicator.startAnimating() + } else { + self.activityIndicator.stopAnimating() + } + } + + func updateIsHiddenWithDrawButton(isHidden: Bool) { + self.dotImageView.isHidden = isHidden + self.withDrawLabel.isHidden = isHidden + } + + func updateIsHiddenLogoutButton(isHidden: Bool) { + guard let dataSource = settingItemTableView.dataSource as? SettingItemDataSource else { return } + settingItemTableView.reloadData() + } + + func updateNotificationAuthorizationStatus(granted: Bool) { + DispatchQueue.main.async { + self.settingItemTableView.reloadData() + } + } +} + +extension Reactive: SettingActionProtocol where Base: SettingView { + var withDrawButtonDidTap: Observable { base.withDrawLabel.rx.didTap } + var dismissButtonDidTap: Observable { base.dismissButton.rx.tap.asObservable() } +} diff --git a/Projects/Features/MyInfoFeature/Sources/Views/WithDrawLabel.swift b/Projects/Features/MyInfoFeature/Sources/Views/WithDrawLabel.swift new file mode 100644 index 000000000..1f07a648b --- /dev/null +++ b/Projects/Features/MyInfoFeature/Sources/Views/WithDrawLabel.swift @@ -0,0 +1,80 @@ +import DesignSystem +import RxCocoa +import RxGesture +import RxSwift +import UIKit + +private protocol WithDrawLabelActionProtocol { + var didTap: Observable { get } +} + +final class WithDrawLabel: UILabel { + private let targetText: String + fileprivate let didTapSubject = PublishSubject() + private let disposeBag = DisposeBag() + + init(text: String = "회원 탈퇴를 원하신다면 여기를 눌러주세요.", targetText: String = "여기") { + self.targetText = targetText + super.init(frame: .zero) + self.text = text + + guard let text = self.text else { return } + let attrStr = NSMutableAttributedString(string: text) + let fullRange = NSRange(location: 0, length: attrStr.length) + let targetRange = (text as NSString).range(of: targetText) + let color = DesignSystemAsset.BlueGrayColor.blueGray500.color + let font = UIFont.setFont(.t7(weight: .light)) + attrStr.addAttribute(.foregroundColor, value: color, range: fullRange) + attrStr.addAttribute(.font, value: font, range: fullRange) + attrStr.addAttribute(.kern, value: -0.5, range: fullRange) + attrStr.addAttribute(.underlineStyle, value: 1, range: targetRange) + + self.attributedText = attrStr + registerGesture() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func registerGesture() { + self.isUserInteractionEnabled = true + self.rx.tapGesture() + .when(.recognized) + .filter { [weak self] gesture in + guard let self = self else { return false } + let location = gesture.location(in: self) + return self.isTargetTapped(at: location) + } + .map { _ in () } + .bind(to: didTapSubject) + .disposed(by: disposeBag) + } + + private func isTargetTapped(at point: CGPoint) -> Bool { + guard let attributedText = attributedText else { return false } + + let textStorage = NSTextStorage(attributedString: attributedText) + let layoutManager = NSLayoutManager() + textStorage.addLayoutManager(layoutManager) + + let textContainer = NSTextContainer(size: bounds.size) + textContainer.lineFragmentPadding = 0 + layoutManager.addTextContainer(textContainer) + + let index = layoutManager.characterIndex( + for: point, + in: textContainer, + fractionOfDistanceBetweenInsertionPoints: nil + ) + let targetRange = (text as NSString?)?.range(of: targetText) ?? NSRange(location: 0, length: 0) + return NSLocationInRange(index, targetRange) + } +} + +extension Reactive where Base: WithDrawLabel { + var didTap: Observable { + return base.didTapSubject.asObservable() + } +} diff --git a/Projects/Features/MyInfoFeature/Testing/FaqComponentStub.swift b/Projects/Features/MyInfoFeature/Testing/FaqComponentStub.swift new file mode 100644 index 000000000..caa833a07 --- /dev/null +++ b/Projects/Features/MyInfoFeature/Testing/FaqComponentStub.swift @@ -0,0 +1,18 @@ +import FaqDomainInterface +@testable import FaqDomainTesting +import Foundation +@testable import MyInfoFeature +import MyInfoFeatureInterface +import UIKit + +public final class FaqComponentStub: FaqFactory { + public func makeView() -> UIViewController { + return FaqViewController.viewController( + viewModel: .init( + fetchFaqCategoriesUseCase: FetchFaqCategoriesUseCaseStub(), + fetchQnaUseCase: FetchFaqUseCaseStub() + ), + faqContentFactory: FaqContentComponentStub() + ) + } +} diff --git a/Projects/Features/MyInfoFeature/Testing/FaqContentComponentStub.swift b/Projects/Features/MyInfoFeature/Testing/FaqContentComponentStub.swift new file mode 100644 index 000000000..9b1ec61e7 --- /dev/null +++ b/Projects/Features/MyInfoFeature/Testing/FaqContentComponentStub.swift @@ -0,0 +1,11 @@ +import FaqDomainInterface +import Foundation +@testable import MyInfoFeature +import MyInfoFeatureInterface +import UIKit + +public final class FaqContentComponentStub: FaqContentFactory { + public func makeView(dataSource: [FaqEntity]) -> UIViewController { + return FaqContentViewController.viewController(viewModel: .init(dataSource: dataSource)) + } +} diff --git a/Projects/Features/MyInfoFeature/Testing/MyInfoComponentStub.swift b/Projects/Features/MyInfoFeature/Testing/MyInfoComponentStub.swift new file mode 100644 index 000000000..a58859682 --- /dev/null +++ b/Projects/Features/MyInfoFeature/Testing/MyInfoComponentStub.swift @@ -0,0 +1,13 @@ +import BaseFeatureInterface +@testable import BaseFeatureTesting +@testable import MyInfoFeature +import MyInfoFeatureInterface +import SignInFeatureInterface +@testable import SignInFeatureTesting +import UIKit + +public final class MyInfoComponentStub: MyInfoFactory { + public func makeView() -> UIViewController { + return UIViewController() + } +} diff --git a/Projects/Features/MyInfoFeature/Testing/NoticeComponentStub.swift b/Projects/Features/MyInfoFeature/Testing/NoticeComponentStub.swift new file mode 100644 index 000000000..8ce8e626f --- /dev/null +++ b/Projects/Features/MyInfoFeature/Testing/NoticeComponentStub.swift @@ -0,0 +1,18 @@ +@testable import BaseFeatureTesting +import Foundation +@testable import MyInfoFeature +import MyInfoFeatureInterface +import NoticeDomainInterface +@testable import NoticeDomainTesting +import UIKit + +public final class NoticeComponentStub: NoticeFactory { + public func makeView() -> UIViewController { + return NoticeViewController.viewController( + viewModel: .init( + fetchNoticeAllUseCase: FetchNoticeAllUseCaseStub() + ), + noticeDetailFactory: NoticeDetailComponentStub() + ) + } +} diff --git a/Projects/Features/MyInfoFeature/Testing/NoticeDetailComponentStub.swift b/Projects/Features/MyInfoFeature/Testing/NoticeDetailComponentStub.swift new file mode 100644 index 000000000..a549b6196 --- /dev/null +++ b/Projects/Features/MyInfoFeature/Testing/NoticeDetailComponentStub.swift @@ -0,0 +1,15 @@ +import Foundation +@testable import MyInfoFeature +import MyInfoFeatureInterface +import NoticeDomainInterface +import UIKit + +public final class NoticeDetailComponentStub: NoticeDetailFactory { + public func makeView(model: FetchNoticeEntity) -> UIViewController { + return NoticeDetailViewController.viewController( + viewModel: .init( + model: model + ) + ) + } +} diff --git a/Projects/Features/MyInfoFeature/Testing/OpenSourceLicenseComponentStub.swift b/Projects/Features/MyInfoFeature/Testing/OpenSourceLicenseComponentStub.swift new file mode 100644 index 000000000..6f9d484b9 --- /dev/null +++ b/Projects/Features/MyInfoFeature/Testing/OpenSourceLicenseComponentStub.swift @@ -0,0 +1,12 @@ +import Foundation +@testable import MyInfoFeature +import MyInfoFeatureInterface +import UIKit + +public final class OpenSourceLicenseComponentStub: OpenSourceLicenseFactory { + public func makeView() -> UIViewController { + return OpenSourceLicenseViewController.viewController( + viewModel: OpenSourceLicenseViewModel() + ) + } +} diff --git a/Projects/Features/MyInfoFeature/Testing/QuestionComponentStub.swift b/Projects/Features/MyInfoFeature/Testing/QuestionComponentStub.swift new file mode 100644 index 000000000..808b849d2 --- /dev/null +++ b/Projects/Features/MyInfoFeature/Testing/QuestionComponentStub.swift @@ -0,0 +1,14 @@ +import BaseFeatureInterface +@testable import BaseFeatureTesting +@testable import MyInfoFeature +import MyInfoFeatureInterface +import UIKit + +public final class QuestionComponentStub: QuestionFactory { + public func makeView() -> UIViewController { + return QuestionViewController.viewController( + viewModel: .init(), + textPopupFactory: TextPopupComponentStub() + ) + } +} diff --git a/Projects/Features/MyInfoFeature/Testing/SettingComponentStub.swift b/Projects/Features/MyInfoFeature/Testing/SettingComponentStub.swift new file mode 100644 index 000000000..ea6cd31d8 --- /dev/null +++ b/Projects/Features/MyInfoFeature/Testing/SettingComponentStub.swift @@ -0,0 +1,42 @@ +import AuthDomainInterface +@testable import AuthDomainTesting +import BaseFeatureInterface +@testable import BaseFeatureTesting +@testable import MyInfoFeature +import MyInfoFeatureInterface +import NotificationDomainInterface +import SignInFeatureInterface +@testable import SignInFeatureTesting +import UIKit +import UserDomainInterface +@testable import UserDomainTesting + +public final class SettingComponentStub: SettingFactory { + public func makeView() -> UIViewController { + return SettingViewController.viewController( + reactor: SettingReactor( + withDrawUserInfoUseCase: WithdrawUserInfoUseCaseSpy(), + logoutUseCase: LogoutUseCaseSpy(), + updateNotificationTokenUseCase: UpdateNotificationTokenUseCaseSpy() + ), + textPopupFactory: TextPopupComponentStub(), + signInFactory: SignInComponentStub(), + serviceTermsFactory: ServiceTermComponentStub(), + privacyFactory: PrivacyComponentStub(), + openSourceLicenseFactory: OpenSourceLicenseComponentStub(), + playTypeTogglePopupFactory: PlayTypeTogglePopupComponentStub() + ) + } +} + +final class PlayTypeTogglePopupComponentStub: PlayTypeTogglePopupFactory { + public func makeView( + completion: ((_ selectedItemString: String) -> Void)? = nil, + cancelCompletion: (() -> Void)? = nil + ) -> UIViewController { + return PlayTypeTogglePopupViewController( + completion: completion, + cancelCompletion: cancelCompletion + ) + } +} diff --git a/Projects/Features/MyInfoFeature/Testing/testing.swift b/Projects/Features/MyInfoFeature/Testing/testing.swift new file mode 100644 index 000000000..dae5e363f --- /dev/null +++ b/Projects/Features/MyInfoFeature/Testing/testing.swift @@ -0,0 +1 @@ +// for tuist diff --git a/Projects/Features/MyInfoFeature/Tests/MyInfoTest.swift b/Projects/Features/MyInfoFeature/Tests/MyInfoTest.swift new file mode 100644 index 000000000..4e59365d9 --- /dev/null +++ b/Projects/Features/MyInfoFeature/Tests/MyInfoTest.swift @@ -0,0 +1,11 @@ +import XCTest + +final class MyInfoTests: XCTestCase { + override func setUpWithError() throws {} + + override func tearDownWithError() throws {} + + func testExample() { + XCTAssertEqual(1, 1) + } +} diff --git a/Projects/Features/PlayerFeature/.swiftlint.yml b/Projects/Features/PlayerFeature/.swiftlint.yml deleted file mode 100644 index 6ff4104fa..000000000 --- a/Projects/Features/PlayerFeature/.swiftlint.yml +++ /dev/null @@ -1,21 +0,0 @@ -excluded: - - "**/*/NeedleGenerated.swift" - - "Tuist" - - -force_cast: # From https://realm.github.io/SwiftLint/force_cast.html - warning # 강제 캐스팅은 error에서 warning으로 변경 - -disabled_rules: - - trailing_whitespace - - vertical_whitespace - - colon - - comma - - comment_spacing # 주석 여백 - - mark # //MARK 관련 warning - - opening_brace # 괄호 열 때 줄바꿈을 했는지 안했는지, (안했으면 warning) - - line_length # 한줄에 글자 수 제한 , warning: 120, error: 200 (default) - - statement_position # if는 반드시 else로 끝나야한다. - - identifier_name #변수명 글자 수 제한 - - function_body_length # 함수 줄 수 제한 - diff --git a/Projects/Features/PlayerFeature/Project.swift b/Projects/Features/PlayerFeature/Project.swift deleted file mode 100644 index f9394a50b..000000000 --- a/Projects/Features/PlayerFeature/Project.swift +++ /dev/null @@ -1,10 +0,0 @@ -import ProjectDescription -import ProjectDescriptionHelpers - -let project = Project.makeModule( - name: "PlayerFeature", - product: .staticFramework, - dependencies: [ - .Project.Features.CommonFeature - ] -) diff --git a/Projects/Features/PlayerFeature/Sources/Components/PlayerComponent.swift b/Projects/Features/PlayerFeature/Sources/Components/PlayerComponent.swift deleted file mode 100644 index 926ebe7d5..000000000 --- a/Projects/Features/PlayerFeature/Sources/Components/PlayerComponent.swift +++ /dev/null @@ -1,32 +0,0 @@ -import Foundation -import CommonFeature -import DomainModule -import NeedleFoundation - -public protocol PlayerDependency: Dependency { - var fetchLyricsUseCase: any FetchLyricsUseCase { get } - var addLikeSongUseCase: any AddLikeSongUseCase {get } - var cancelLikeSongUseCase: any CancelLikeSongUseCase { get } - var fetchLikeNumOfSongUseCase: any FetchLikeNumOfSongUseCase { get } - var fetchFavoriteSongsUseCase: any FetchFavoriteSongsUseCase { get } - var postPlaybackLogUseCase: any PostPlaybackLogUseCase { get } - var playlistComponent: PlaylistComponent { get } - var containSongsComponent: ContainSongsComponent { get } -} - -public final class PlayerComponent: Component { - public func makeView() -> PlayerViewController { - return PlayerViewController( - viewModel: .init( - fetchLyricsUseCase: dependency.fetchLyricsUseCase, - addLikeSongUseCase: dependency.addLikeSongUseCase, - cancelLikeSongUseCase: dependency.cancelLikeSongUseCase, - fetchLikeNumOfSongUseCase: dependency.fetchLikeNumOfSongUseCase, - fetchFavoriteSongsUseCase: dependency.fetchFavoriteSongsUseCase, - postPlaybackLogUseCase: dependency.postPlaybackLogUseCase - ), - playlistComponent: dependency.playlistComponent, - containSongsComponent: dependency.containSongsComponent - ) - } -} diff --git a/Projects/Features/PlayerFeature/Sources/Components/PlaylistComponent.swift b/Projects/Features/PlayerFeature/Sources/Components/PlaylistComponent.swift deleted file mode 100644 index cae8f1c46..000000000 --- a/Projects/Features/PlayerFeature/Sources/Components/PlaylistComponent.swift +++ /dev/null @@ -1,25 +0,0 @@ -// -// PlaylistComponent.swift -// PlayerFeature -// -// Created by YoungK on 2023/02/28. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import CommonFeature -import DomainModule -import NeedleFoundation - -public protocol PlaylistDependency: Dependency { - var containSongsComponent: ContainSongsComponent { get } -} - -public final class PlaylistComponent: Component { - public func makeView() -> PlaylistViewController { - return PlaylistViewController( - viewModel: .init(), - containSongsComponent: dependency.containSongsComponent - ) - } -} diff --git a/Projects/Features/PlayerFeature/Sources/ViewControllers/PlayerViewController.swift b/Projects/Features/PlayerFeature/Sources/ViewControllers/PlayerViewController.swift deleted file mode 100644 index 72951548e..000000000 --- a/Projects/Features/PlayerFeature/Sources/ViewControllers/PlayerViewController.swift +++ /dev/null @@ -1,467 +0,0 @@ -// -// PlayerViewController.swift -// PlayerFeature -// -// Created by YoungK on 2023/01/09. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import Utility -import DesignSystem -import SnapKit -import Then -import RxCocoa -import RxSwift -import YouTubePlayerKit -import Combine -import Kingfisher -import PanModal -import CommonFeature - -public class PlayerViewController: UIViewController { - private let disposeBag = DisposeBag() - private var subscription = Set() - var viewModel: PlayerViewModel! - let playState = PlayState.shared - var playerView: PlayerView! - var miniPlayerView: MiniPlayerView! - - lazy var youtubePlayerView = YouTubePlayerHostingView(player: playState.player ?? YouTubePlayer()).then { - $0.isHidden = true - } - - internal var playlistComponent: PlaylistComponent! - internal var containSongsComponent: ContainSongsComponent! - - init(viewModel: PlayerViewModel, playlistComponent: PlaylistComponent, containSongsComponent: ContainSongsComponent) { - self.viewModel = viewModel - self.playlistComponent = playlistComponent - self.containSongsComponent = containSongsComponent - super.init(nibName: nil, bundle: nil) - } - - required init?(coder: NSCoder) { - fatalError("PlayerViewController init(coder:) has not been implemented") - } - - deinit { - DEBUG_LOG("플레이어 뷰컨 deinit") - } - - public override func loadView() { - super.loadView() - playerView = PlayerView(frame: self.view.frame) - miniPlayerView = MiniPlayerView(frame: self.view.frame) - miniPlayerView.layer.opacity = 0 - self.view.addSubview(playerView) - self.view.addSubview(miniPlayerView) - self.view.addSubview(youtubePlayerView) - self.youtubePlayerView.snp.makeConstraints { - $0.centerX.centerY.equalTo(self.playerView.thumbnailImageView) - $0.width.equalTo(self.playerView.thumbnailImageView.snp.width) - $0.height.equalTo(self.playerView.thumbnailImageView.snp.height) - } - } - - public override func viewDidLoad() { - super.viewDidLoad() - DEBUG_LOG("viewDidLoad") - playerView.lyricsTableView.delegate = self - playerView.lyricsTableView.dataSource = self - bindViewModel() - bindNotification() - } - - func showPlaylist() { - let playlistVC = playlistComponent.makeView() - playlistVC.modalPresentationStyle = .overFullScreen - playlistVC.view.frame = self.view.frame - self.present(playlistVC, animated: true) - } -} - -public extension PlayerViewController { - func updateOpacity(value: Float) { - playerView.layer.opacity = value - miniPlayerView.layer.opacity = 1 - value - } -} - -private extension PlayerViewController { - private func bindNotification() { - NotificationCenter.default.rx - .notification(.resetYouTubePlayerHostingView) - .withUnretained(self) - .subscribe(onNext: { (owner, _) in - owner.resetYouTubePlayerHostingView() - }).disposed(by: disposeBag) - } - - private func resetYouTubePlayerHostingView() { - self.youtubePlayerView.removeFromSuperview() - self.youtubePlayerView = YouTubePlayerHostingView(player: self.playState.player ?? YouTubePlayer()) - self.youtubePlayerView.isHidden = true - self.view.addSubview(self.youtubePlayerView) - self.youtubePlayerView.snp.makeConstraints { - $0.centerX.centerY.equalTo(self.playerView.thumbnailImageView) - $0.width.equalTo(self.playerView.thumbnailImageView.snp.width) - $0.height.equalTo(self.playerView.thumbnailImageView.snp.height) - } - PlayState.shared.subscribePlayPublisher() - } - - private func bindViewModel() { - let input = PlayerViewModel.Input( - viewWillAppearEvent: self.rx.methodInvoked(#selector(UIViewController.viewWillAppear)).map {_ in }, - closeButtonDidTapEvent: self.playerView.closeButton.tapPublisher(), - playButtonDidTapEvent: Publishers.Merge( - self.playerView.playButton.tapPublisher(), - self.miniPlayerView.playButton.tapPublisher() - ).eraseToAnyPublisher(), - prevButtonDidTapEvent: self.playerView.prevButton.rx.tap.asObservable(), - nextButtonDidTapEvent: Observable.merge( - self.playerView.nextButton.rx.tap.asObservable(), - self.miniPlayerView.nextButton.rx.tap.asObservable() - ), - sliderValueChangedEvent: self.playerView.playTimeSlider.rx.value.changed.asObservable(), - repeatButtonDidTapEvent: self.playerView.repeatButton.tapPublisher(), - shuffleButtonDidTapEvent: self.playerView.shuffleButton.tapPublisher(), - likeButtonDidTapEvent: self.playerView.likeButton.tapPublisher(), - addPlaylistButtonDidTapEvent: self.playerView.addPlayistButton.tapPublisher(), - playlistButtonDidTapEvent: Publishers.Merge( - self.playerView.playistButton.tapPublisher(), - self.miniPlayerView.playlistButton.tapPublisher() - ).eraseToAnyPublisher(), - miniExtendButtonDidTapEvent: self.miniPlayerView.extendButton.tapPublisher() - ) - let output = self.viewModel.transform(from: input) - - bindPlayButtonImages(output: output) - bindThumbnail(output: output) - bindTitle(output: output) - bindArtist(output: output) - bindCurrentPlayTime(output: output) - bindTotalPlayTime(output: output) - bindMiniPlayerSlider(output: output) - bindlikes(output: output) - bindViews(output: output) - bindLyricsDidChangedEvent(output: output) - bindLyricsTracking(output: output) - bindRepeatMode(output: output) - bindShuffleMode(output: output) - bindShowPlaylist(output: output) - bindShowToastMessage(output: output) - bindShowConfirmModal(output: output) - bindShowContainSongsViewController(output: output) - bindShowTokenModal(output: output) - } - - private func bindShowTokenModal(output: PlayerViewModel.Output){ - output.showTokenModal.sink { [weak self] message in - self?.showPanModal( - content: TextPopupViewController.viewController( - text: message, - cancelButtonIsHidden: true, - completion: { - LOGOUT() - self?.playState.switchPlayerMode(to: .mini) - } - ) - ) - } - .store(in: &subscription) - } - - private func bindPlayButtonImages(output: PlayerViewModel.Output) { - output.playerState.sink { [weak self] state in - guard let self else { return } - switch state { - case .playing: - self.playerView.playButton.setImage(DesignSystemAsset.Player.pause.image, for: .normal) - self.miniPlayerView.playButton.setImage(DesignSystemAsset.Player.miniPause.image, for: .normal) - default: - self.playerView.playButton.setImage(DesignSystemAsset.Player.playLarge.image, for: .normal) - self.miniPlayerView.playButton.setImage(DesignSystemAsset.Player.miniPlay.image, for: .normal) - } - }.store(in: &subscription) - } - - private func bindThumbnail(output: PlayerViewModel.Output) { - output.thumbnailImageURL.sink { [weak self] thumbnailImageURL in - guard let self else { return } - let placeholderImage = DesignSystemAsset.Logo.placeHolderLarge.image - let transitionOptions: KingfisherOptionsInfo = [.transition(.fade(0.2))] - - let hdURL = URL(string: thumbnailImageURL.hdQuality) - let sdURL = URL(string: thumbnailImageURL.sdQuality) - - self.playerView.thumbnailImageView.kf.setImage( - with: hdURL, - placeholder: placeholderImage, - options: transitionOptions, - completionHandler: { [weak self] result in - guard let self = self else { return } - switch result { - case .success: - break - case .failure(let error): - guard error.errorCode == 2002 else { return } //invalidHTTPStatusCode - DEBUG_LOG("👽:: \(thumbnailImageURL.hdQuality)\n\(error.localizedDescription)") - self.playerView.thumbnailImageView.kf.setImage( - with: sdURL, - placeholder: placeholderImage, - options: transitionOptions - ) - } - } - ) - self.playerView.backgroundImageView.kf.setImage( - with: sdURL, - placeholder: placeholderImage, - options: transitionOptions - ) - }.store(in: &subscription) - } - - private func bindTitle(output: PlayerViewModel.Output) { - output.titleText.sink { [weak self] titleText in - guard let self else { return } - self.playerView.titleLabel.text = titleText - self.miniPlayerView.titleLabel.text = titleText - }.store(in: &subscription) - } - - private func bindArtist(output: PlayerViewModel.Output) { - output.artistText.sink { [weak self] artistText in - guard let self else { return } - self.playerView.artistLabel.text = artistText - self.miniPlayerView.artistLabel.text = artistText - } - .store(in: &subscription) - } - - private func bindlikes(output: PlayerViewModel.Output) { - output.likeCountText.sink { [weak self] likeCountText in - guard let self else { return } - self.playerView.likeButton.title = likeCountText - } - .store(in: &subscription) - - output.likeState.sink { [weak self] isLiked in - guard let self else { return } - self.playerView.likeButton.isLiked = isLiked - }.store(in: &subscription) - } - - private func bindViews(output: PlayerViewModel.Output) { - output.viewsCountText.sink { [weak self] viewsCountText in - guard let self else { return } - self.playerView.viewsView.title = viewsCountText - } - .store(in: &subscription) - } - - private func bindCurrentPlayTime(output: PlayerViewModel.Output) { - output.playTimeText.sink { [weak self] currentTimeText in - guard let self else { return } - self.playerView.currentPlayTimeLabel.text = currentTimeText - } - .store(in: &subscription) - - output.playTimeValue.sink { [weak self] value in - guard let self else { return } - self.playerView.playTimeSlider.value = value - } - .store(in: &subscription) - } - - private func bindTotalPlayTime(output: PlayerViewModel.Output) { - output.totalTimeText.sink { [weak self] totalTimeText in - guard let self else { return } - self.playerView.totalPlayTimeLabel.text = totalTimeText - } - .store(in: &subscription) - - output.totalTimeValue.sink { [weak self] value in - guard let self else { return } - self.playerView.playTimeSlider.minimumValue = 0 - self.playerView.playTimeSlider.maximumValue = value - } - .store(in: &subscription) - } - - private func bindMiniPlayerSlider(output: PlayerViewModel.Output) { - output.playTimeValue.combineLatest(output.totalTimeValue) - .map({ (playTimeValue, totalTimeValue) in - return totalTimeValue == 0 ? 0 : playTimeValue / totalTimeValue - }) - .sink { [weak self] newValue in - guard let self else { return } - self.miniPlayerView.currentPlayTimeView.snp.remakeConstraints { - $0.top.left.bottom.equalToSuperview() - $0.width.equalTo(self.miniPlayerView.totalPlayTimeView.snp.width).multipliedBy(newValue) - } - } - .store(in: &subscription) - } - - private func bindLyricsDidChangedEvent(output: PlayerViewModel.Output) { - output.lyricsDidChangedEvent.sink { [weak self] _ in - guard let self else { return } - self.playerView.lyricsTableView.reloadData() - } - .store(in: &subscription) - } - - private func bindLyricsTracking(output: PlayerViewModel.Output) { - output.playTimeValue - .compactMap { [weak self] time -> Int? in - guard let self = self, time > 0, - !self.viewModel.lyricsDict.isEmpty, - !self.viewModel.isLyricsScrolling else { return nil } - return self.viewModel.getCurrentLyricsIndex(time) - } - .sink { [weak self] index in - self?.updateLyricsHighlight(index: index) - } - .store(in: &subscription) - } - - private func bindShowPlaylist(output: PlayerViewModel.Output) { - output.willShowPlaylist.sink { [weak self] _ in - self?.showPlaylist() - }.store(in: &subscription) - } - - private func bindRepeatMode(output: PlayerViewModel.Output) { - output.repeatMode.sink { [weak self] repeatMode in - guard let self else { return } - switch repeatMode { - case .none: - self.playerView.repeatButton.setImage(DesignSystemAsset.Player.repeatOff.image, for: .normal) - case .repeatAll: - self.playerView.repeatButton.setImage(DesignSystemAsset.Player.repeatOnAll.image, for: .normal) - case .repeatOnce: - self.playerView.repeatButton.setImage(DesignSystemAsset.Player.repeatOn1.image, for: .normal) - } - }.store(in: &subscription) - } - - private func bindShuffleMode(output: PlayerViewModel.Output) { - output.shuffleMode.sink { [weak self] shuffleMode in - guard let self else { return } - switch shuffleMode { - case .off: - self.playerView.shuffleButton.setImage(DesignSystemAsset.Player.shuffleOff.image, for: .normal) - case .on: - self.playerView.shuffleButton.setImage(DesignSystemAsset.Player.shuffleOn.image, for: .normal) - } - }.store(in: &subscription) - } - - private func bindShowToastMessage(output: PlayerViewModel.Output) { - output.showToastMessage.sink { [weak self] message in - self?.showToast(text: message, font: DesignSystemFontFamily.Pretendard.light.font(size: 14)) - }.store(in: &subscription) - } - - private func bindShowConfirmModal(output: PlayerViewModel.Output) { - output.showConfirmModal.sink { [weak self] message in - self?.showPanModal(content: TextPopupViewController.viewController(text: message, cancelButtonIsHidden: false, completion: { - NotificationCenter.default.post(name: .movedTab, object: 4) // 보관함 탭으로 이동 - self?.playState.switchPlayerMode(to: .mini) - }, cancelCompletion: { - })) - }.store(in: &subscription) - } - - private func bindShowContainSongsViewController(output: PlayerViewModel.Output) { - output.showContainSongsViewController.sink { [weak self] songId in - guard let self else { return } - let viewController = self.containSongsComponent.makeView(songs: [songId]) - viewController.modalPresentationStyle = .overFullScreen - self.present(viewController, animated: true) - }.store(in: &subscription) - } - - private func updateLyricsHighlight(index: Int) { - if !viewModel.isLyricsScrolling { - playerView.lyricsTableView.scrollToRow(at: IndexPath(row: index, section: 0), at: .middle, animated: true) - } - - // 모든 셀에 대해서 강조 상태 업데이트 - let rows = playerView.lyricsTableView.numberOfRows(inSection: 0) - for row in 0.. Void) { - let centerPoint = CGPoint(x: playerView.lyricsTableView.center.x, - y: playerView.lyricsTableView.contentOffset.y + playerView.lyricsTableView.bounds.height / 2) - // 가운데 셀의 IndexPath를 반환합니다. - guard let centerCellIndexPath = playerView.lyricsTableView.indexPathForRow(at: centerPoint) else { return } - completion(centerCellIndexPath) - } - -} - -extension PlayerViewController: UITableViewDelegate, UITableViewDataSource, UIScrollViewDelegate { - - public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return viewModel.sortedLyrics.count - } - - public func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { - return LyricsTableViewCell.getCellHeight(lyric: viewModel.sortedLyrics[indexPath.row]) - } - - public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - guard let cell = tableView.dequeueReusableCell(withIdentifier: LyricsTableViewCell.identifier, for: indexPath) as? LyricsTableViewCell - else { return UITableViewCell() } - cell.selectionStyle = .none - cell.setLyrics(text: viewModel.sortedLyrics[indexPath.row]) - return cell - } - - /// 스크롤뷰에서 드래그하기 시작할 때 한번만 호출 - public func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { - viewModel.isLyricsScrolling = true - } - - /// 스크롤 중이면 계속 호출 - public func scrollViewDidScroll(_ scrollView: UIScrollView) { - if viewModel.isLyricsScrolling { - findCenterCellIndexPath { centerCellIndexPath in - updateLyricsHighlight(index: centerCellIndexPath.row) - } - } - } - - /// 손을 땠을 때 한번 호출, 테이블 뷰의 스크롤 모션의 감속 여부를 알 수 있다. - public func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { - if !decelerate { - findCenterCellIndexPath { centerCellIndexPath in - if viewModel.lyricsDict.isEmpty { return } - let start = viewModel.lyricsDict.keys.sorted()[centerCellIndexPath.row] - playState.player?.seek(to: Double(start), allowSeekAhead: true) - viewModel.isLyricsScrolling = false - } - } - } - - /// 스크롤이 감속되고 멈춘 후에 작업을 처리 - public func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { - findCenterCellIndexPath { centerCellIndexPath in - if viewModel.lyricsDict.isEmpty { return } - let start = viewModel.lyricsDict.keys.sorted()[centerCellIndexPath.row] - playState.player?.seek(to: Double(start), allowSeekAhead: true) - viewModel.isLyricsScrolling = false - } - } -} diff --git a/Projects/Features/PlayerFeature/Sources/ViewControllers/PlaylistViewController+Delegate.swift b/Projects/Features/PlayerFeature/Sources/ViewControllers/PlaylistViewController+Delegate.swift deleted file mode 100644 index 4957b1510..000000000 --- a/Projects/Features/PlayerFeature/Sources/ViewControllers/PlaylistViewController+Delegate.swift +++ /dev/null @@ -1,97 +0,0 @@ -// -// PlaylistViewController+SongCartViewDelegate.swift -// PlayerFeature -// -// Created by YoungK on 2023/04/07. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import CommonFeature -import DomainModule -import DesignSystem -import Utility - -extension PlaylistViewController: SongCartViewDelegate { - public func buttonTapped(type: SongCartSelectType) { - switch type { - case let .allSelect(flag): - self.isSelectedAllSongs.onNext(flag) - case .addSong: - let songs: [String] = self.playState.playList.list.filter { $0.item.isSelected }.map { $0.item.id } - let viewController = containSongsComponent.makeView(songs: songs) - viewController.delegate = self - viewController.modalPresentationStyle = .overFullScreen - - self.present(viewController, animated: true) { - self.tappedAddPlaylist.onNext(()) - self.hideSongCart() - } - - case .remove: - let count: Int = self.viewModel.countOfSelectedSongs - let popup = TextPopupViewController.viewController( - text: "선택한 내 리스트 \(count)곡이 삭제됩니다.", - cancelButtonIsHidden: false, - completion: { [weak self] () in - guard let self else { return } - self.tappedRemoveSongs.onNext(()) - self.hideSongCart() - }) - self.showPanModal(content: popup) - default: - return - } - } -} - -extension PlaylistViewController: UITableViewDelegate { - - public func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell.EditingStyle { - return .none // 편집모드 시 왼쪽 버튼을 숨기려면 .none을 리턴합니다. - } - - public func tableView(_ tableView: UITableView, shouldIndentWhileEditingRowAt indexPath: IndexPath) -> Bool { - return false // 편집모드 시 셀의 들여쓰기를 없애려면 false를 리턴합니다. - } - - public func tableView(_ tableView: UITableView, dragIndicatorViewForRowAt indexPath: IndexPath) -> UIView? { - // 편집모드 시 나타나는 오른쪽 Drag Indicator를 변경합니다. - let dragIndicatorView = UIImageView(image: DesignSystemAsset.Player.playLarge.image) - dragIndicatorView.frame = .init(x: 0, y: 0, width: 32, height: 32) - return dragIndicatorView - } - - public func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool { - return true // 모든 Cell 을 이동 가능하게 설정합니다. - } - - public func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) { - // 이동할 데이터를 가져와서 새로운 위치에 삽입합니다. - playState.playList.reorderPlaylist(from: sourceIndexPath.row, to: destinationIndexPath.row) - HapticManager.shared.impact(style: .light) - } - - public func tableView(_ tableView: UITableView, targetIndexPathForMoveFromRowAt sourceIndexPath: IndexPath, toProposedIndexPath proposedDestinationIndexPath: IndexPath) -> IndexPath { - // 첫 번째 섹션에서만 이동 가능하게 설정합니다. - if proposedDestinationIndexPath.section != 0 { - return sourceIndexPath - } - return proposedDestinationIndexPath - } - -} - -extension PlaylistViewController: PlaylistTableViewCellDelegate { - func superButtonTapped(index: Int) { - tappedCellIndex.onNext(index) - } - - -} - -extension PlaylistViewController: ContainSongsViewDelegate{ - public func tokenExpired() { - self.dismiss(animated: true) - } -} diff --git a/Projects/Features/PlayerFeature/Sources/ViewControllers/PlaylistViewController.swift b/Projects/Features/PlayerFeature/Sources/ViewControllers/PlaylistViewController.swift deleted file mode 100644 index 1c080eedb..000000000 --- a/Projects/Features/PlayerFeature/Sources/ViewControllers/PlaylistViewController.swift +++ /dev/null @@ -1,381 +0,0 @@ -// -// PlaylistViewController.swift -// PlayerFeature -// -// Created by YoungK on 2023/02/28. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import UIKit -import Combine -import Kingfisher -import SnapKit -import DesignSystem -import Utility -import CommonFeature -import RxSwift -import RxRelay -import RxDataSources -import DomainModule - -public class PlaylistViewController: UIViewController, SongCartViewType { - var viewModel: PlaylistViewModel! - var playlistView: PlaylistView! - var playState = PlayState.shared - var subscription = Set() - var disposeBag = DisposeBag() - - var tappedCellIndex = PublishSubject() - var isSelectedAllSongs = PublishSubject() - var tappedAddPlaylist = PublishSubject() - var tappedRemoveSongs = PublishSubject() - - internal var containSongsComponent: ContainSongsComponent! - - public var songCartView: CommonFeature.SongCartView! - public var bottomSheetView: CommonFeature.BottomSheetView! - - private var panGestureRecognizer: UIPanGestureRecognizer! - - init(viewModel: PlaylistViewModel, containSongsComponent: ContainSongsComponent) { - self.viewModel = viewModel - self.containSongsComponent = containSongsComponent - super.init(nibName: nil, bundle: nil) - } - - deinit { - DEBUG_LOG("❌ PlaylistVC deinit") - } - - required init?(coder: NSCoder) { - fatalError("PlaylistViewController has not been implemented") - } - - public override func loadView() { - super.loadView() - playlistView = PlaylistView(frame: self.view.frame) - self.view.addSubview(playlistView) - } - - public override func viewDidLoad() { - super.viewDidLoad() - playlistView.playlistTableView.rx.setDelegate(self).disposed(by: disposeBag) - bindGesture() - bindViewModel() - bindActions() - } - - public override func viewWillDisappear(_ animated: Bool) { - super.viewWillDisappear(animated) - //Comment: 재생목록 화면이 사라지는 시점에서 DB에 저장된 리스트로 업데이트 - //편집 완료를 했으면 이미 DB가 업데이트 됐을거고, 아니면 이전 DB데이터로 업데이트 - self.playState.playList.list = self.playState.fetchPlayListFromLocalDB() - //Comment: 재생목록 화면이 사라지는 시점에서 곡 담기 팝업이 올라와 있는 상태면 제거 - guard self.songCartView != nil else { return } - self.hideSongCart() - } -} - -private extension PlaylistViewController { - @objc func handlePanGesture(_ gestureRecognizer: UIPanGestureRecognizer) { - let distance = gestureRecognizer.translation(in: self.view) - let screenHeight = Utility.APP_HEIGHT() - - switch gestureRecognizer.state { - case .began: - return - - case .changed: - let distanceY = max(distance.y, 0) - view.frame = CGRect(x: 0, y: distanceY, width: view.frame.width, height: screenHeight) - //let opacity = 1 - (distanceY / screenHeight) - //updateOpacity(value: Float(opacity)) - - case .ended: - let velocity = gestureRecognizer.velocity(in: self.view) - - // 빠르게 드래그하거나 화면의 40% 이상 드래그 했을 경우 dismiss - if velocity.y > 1000 || view.frame.origin.y > (screenHeight * 0.4) { - dismiss(animated: true) - } else { - UIView.animate(withDuration: 0.35, - delay: 0.0, - usingSpringWithDamping: 0.8, - initialSpringVelocity: 0.8, - options: [.curveEaseInOut], - animations: { - self.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: screenHeight) - self.updateOpacity(value : 1) - }) - } - - default: - break - } - } - - func updateOpacity(value: Float) { - playlistView.layer.opacity = value - } -} - -private extension PlaylistViewController { - private func bindGesture() { - panGestureRecognizer = UIPanGestureRecognizer(target: self, - action: #selector(handlePanGesture(_:))) - self.playlistView.titleBarView.addGestureRecognizer(panGestureRecognizer) - } - - private func bindViewModel() { - let input = PlaylistViewModel.Input( - viewWillAppearEvent: self.rx.methodInvoked(#selector(UIViewController.viewWillAppear)).map { _ in }, - closeButtonDidTapEvent: playlistView.closeButton.tapPublisher, - editButtonDidTapEvent: playlistView.editButton.tapPublisher, - repeatButtonDidTapEvent: playlistView.repeatButton.tapPublisher, - prevButtonDidTapEvent: playlistView.prevButton.tapPublisher, - playButtonDidTapEvent: playlistView.playButton.tapPublisher, - nextButtonDidTapEvent: playlistView.nextButton.tapPublisher, - shuffleButtonDidTapEvent: playlistView.shuffleButton.tapPublisher, - playlistTableviewCellDidTapEvent: playlistView.playlistTableView.rx.itemSelected.asObservable(), - playlistTableviewCellDidTapInEditModeEvent: tappedCellIndex.asObservable(), - selectAllSongsButtonDidTapEvent: isSelectedAllSongs.asObservable(), - addPlaylistButtonDidTapEvent: tappedAddPlaylist.asObservable(), - removeSongsButtonDidTapEvent: tappedRemoveSongs.asObservable(), - itemMovedEvent: playlistView.playlistTableView.rx.itemMoved.asObservable() - ) - let output = self.viewModel.transform(from: input) - - bindCountOfSongs(output: output) - bindPlaylistTableView(output: output) - bindSongCart(output: output) - bindCloseButton(output: output) - bindThumbnail(output: output) - bindCurrentPlayTime(output: output) - bindRepeatMode(output: output) - bindShuffleMode(output: output) - bindPlayButtonImages(output: output) - bindwaveStreamAnimationView(output: output) - } - - private func bindCountOfSongs(output: PlaylistViewModel.Output) { - output.countOfSongs.sink { [weak self] count in - guard let self else { return } - self.playlistView.countLabel.text = count == 0 ? "" : String(count) - }.store(in: &subscription) - } - - private func bindPlaylistTableView(output: PlaylistViewModel.Output) { - playlistView.playlistTableView.rx - .sentMessage(#selector(playlistView.playlistTableView.reloadData)) - .throttle(RxTimeInterval.seconds(1), latest: false, scheduler: MainScheduler.instance) - .take(1) - .withLatestFrom(output.dataSource) - .withUnretained(self) - .subscribe(onNext: { (owner, dataSource) in - let dataSource = dataSource.first?.items ?? [] - guard !dataSource.isEmpty else { - DEBUG_LOG("🐛:: 재생목록이 없습니다.") - return - } - - let i = output.currentSongIndex.value - guard dataSource.count > i else { - DEBUG_LOG("🐛:: 포커스 하려는 인덱스가 데이터 범위에 없습니다.") - return - } - - DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(100)) { - owner.playlistView.playlistTableView.scrollToRow( - at: IndexPath(row: i, section: 0), - at: .middle, - animated: false - ) - } - }) - .disposed(by: disposeBag) - - output.editState.sink { [weak self] isEditing in - guard let self else { return } - self.playlistView.titleLabel.text = isEditing ? "재생목록 편집" : "재생목록" - self.playlistView.editButton.setTitle(isEditing ? "완료" : "편집", for: .normal) - self.playlistView.editButton.setColor(isHighlight: isEditing) - self.playlistView.playlistTableView.setEditing(isEditing, animated: true) - self.playlistView.playlistTableView.reloadData() - }.store(in: &subscription) - - output.currentSongIndex.sink { [weak self] _ in - self?.playlistView.playlistTableView.reloadData() - }.store(in: &subscription) - - output.dataSource - .bind(to: playlistView.playlistTableView.rx.items(dataSource: createDatasources(output: output))) - .disposed(by: disposeBag) - - output.dataSource - .filter { $0.first?.items.isEmpty ?? true } - .subscribe { [weak self] _ in - let space = APP_HEIGHT() - STATUS_BAR_HEGHIT() - 48 - 56 - SAFEAREA_BOTTOM_HEIGHT() - let height = space / 3 * 2 - let warningView = WarningView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: height)) - warningView.text = "곡이 없습니다." - self?.playlistView.playlistTableView.tableFooterView = warningView - }.disposed(by: disposeBag) - - output.dataSource - .map { return $0.first?.items.isEmpty ?? true } - .bind(to: playlistView.editButton.rx.isHidden) - .disposed(by: disposeBag) - } - - private func bindSongCart(output: PlaylistViewModel.Output) { - output.indexOfSelectedSongs - .skip(1) - .withLatestFrom(output.dataSource) { ($0, $1) } - .map({ (songs, dataSource) -> (songs: [Int], dataSourceCount: Int) in - return (songs, dataSource.first?.items.count ?? 0) - }) - .subscribe(onNext: { [weak self] (songs, dataSourceCount) in - guard let self = self else { return } - switch songs.isEmpty { - case true : - self.hideSongCart() - case false: - self.showSongCart( - in: self.view, - type: .playList, - selectedSongCount: songs.count, - totalSongCount: dataSourceCount, - useBottomSpace: true - ) - self.songCartView?.delegate = self - } - }).disposed(by: disposeBag) - } - - private func bindCloseButton(output: PlaylistViewModel.Output) { - output.willClosePlaylist.sink { [weak self] _ in - self?.dismiss(animated: true) - }.store(in: &subscription) - } - - private func bindThumbnail(output: PlaylistViewModel.Output) { - output.thumbnailImageURL - .sink { [weak self] thumbnailImageURL in - self?.playlistView.thumbnailImageView.kf.setImage( - with: URL(string: thumbnailImageURL), - placeholder: DesignSystemAsset.Logo.placeHolderSmall.image, - options: [.transition(.fade(0.2))]) - }.store(in: &subscription) - } - - private func bindCurrentPlayTime(output: PlaylistViewModel.Output) { - output.playTimeValue.combineLatest(output.totalTimeValue) - .compactMap { (playTimeValue, totalTimeValue) -> Float? in - guard totalTimeValue > 0 else { return nil } - let newRatio = playTimeValue / totalTimeValue - return newRatio - } - .sink { [weak self] newRatio in - guard let self else { return } - self.playlistView.currentPlayTimeView.snp.remakeConstraints { - $0.top.left.bottom.equalToSuperview() - $0.width.equalTo(self.playlistView.totalPlayTimeView.snp.width).multipliedBy(newRatio) - } - } - .store(in: &subscription) - } - - private func bindRepeatMode(output: PlaylistViewModel.Output) { - output.repeatMode.sink { [weak self] repeatMode in - guard let self else { return } - switch repeatMode { - case .none: - self.playlistView.repeatButton.setImage(DesignSystemAsset.Player.repeatOff.image, for: .normal) - case .repeatAll: - self.playlistView.repeatButton.setImage(DesignSystemAsset.Player.repeatOnAll.image, for: .normal) - case .repeatOnce: - self.playlistView.repeatButton.setImage(DesignSystemAsset.Player.repeatOn1.image, for: .normal) - } - }.store(in: &subscription) - } - - private func bindShuffleMode(output: PlaylistViewModel.Output) { - output.shuffleMode.sink { [weak self] shuffleMode in - guard let self else { return } - switch shuffleMode { - case .off: - self.playlistView.shuffleButton.setImage(DesignSystemAsset.Player.shuffleOff.image, for: .normal) - case .on: - self.playlistView.shuffleButton.setImage(DesignSystemAsset.Player.shuffleOn.image, for: .normal) - } - }.store(in: &subscription) - } - - private func bindPlayButtonImages(output: PlaylistViewModel.Output) { - output.playerState.sink { [weak self] state in - guard let self else { return } - switch state { - case .playing: - self.playlistView.playButton.setImage(DesignSystemAsset.Player.miniPause.image, for: .normal) - default: - self.playlistView.playButton.setImage(DesignSystemAsset.Player.miniPlay.image, for: .normal) - } - }.store(in: &subscription) - } - - private func bindwaveStreamAnimationView(output: PlaylistViewModel.Output) { - output.playerState - .compactMap { [weak self] state -> (PlaylistTableViewCell, Bool)? in - guard let self else { return nil } - guard let index = self.playState.playList.currentPlayIndex else { return nil } - guard let cell = self.playlistView.playlistTableView.cellForRow(at: IndexPath(row: index, section: 0)) as? PlaylistTableViewCell else { return nil } - return (cell, state == .playing) - } - .sink { cell, isAnimating in - if isAnimating { - cell.waveStreamAnimationView.play() - } else { - cell.waveStreamAnimationView.pause() - } - } - .store(in: &subscription) - } -} - -private extension PlaylistViewController { - private func bindActions() { - playlistView.thumbnailImageView.isUserInteractionEnabled = true - playlistView.thumbnailImageView.tapPublisher().sink { [weak self] _ in - self?.dismiss(animated: true) - }.store(in: &subscription) - } -} - -extension PlaylistViewController { - private func createDatasources(output: PlaylistViewModel.Output) -> RxTableViewSectionedReloadDataSource { - let datasource = RxTableViewSectionedReloadDataSource(configureCell: { [weak self] (_ , tableView, indexPath, model) -> UITableViewCell in - guard let self else { return UITableViewCell() } - guard let cell = tableView.dequeueReusableCell(withIdentifier: PlaylistTableViewCell.identifier, for: IndexPath(row: indexPath.row, section: 0)) as? PlaylistTableViewCell - else { return UITableViewCell() } - - cell.delegate = self - cell.selectionStyle = .none - - let index = indexPath.row - let isEditing = output.editState.value - let isPlaying = model.isPlaying - let isAnimating = self.playState.state == .playing - - cell.setContent(song: model.item, index: index, isEditing: isEditing, isPlaying: isPlaying, isAnimating: isAnimating) - return cell - - }, canEditRowAtIndexPath: { (_, _) -> Bool in - return true - }, canMoveRowAtIndexPath: { (_, _) -> Bool in - return true - }) - return datasource - } -} - diff --git a/Projects/Features/PlayerFeature/Sources/ViewModels/PlayerViewModel+API.swift b/Projects/Features/PlayerFeature/Sources/ViewModels/PlayerViewModel+API.swift deleted file mode 100644 index b83f65e1d..000000000 --- a/Projects/Features/PlayerFeature/Sources/ViewModels/PlayerViewModel+API.swift +++ /dev/null @@ -1,166 +0,0 @@ -// -// PlayerViewModel+API.swift -// PlayerFeature -// -// Created by YoungK on 2023/03/31. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import DomainModule -import RxSwift -import Utility - -// MARK: - 뷰모델 내 API를 사용하는 함수들을 모아놓은 곳입니다. -extension PlayerViewModel { - /// 가사 불러오기 - func fetchLyrics(for song: SongEntity, output: Output) { - fetchLyricsUseCase.execute(id: song.id) - .retry(3) - .subscribe { [weak self] lyricsEntityArray in - guard let self else { return } - self.lyricsDict.removeAll() - self.sortedLyrics.removeAll() - lyricsEntityArray.forEach { self.lyricsDict.updateValue($0.text, forKey: Float($0.start)) } - self.sortedLyrics = self.lyricsDict.sorted { $0.key < $1.key }.map { $0.value } - } onFailure: { [weak self] error in - guard let self else { return } - self.lyricsDict.removeAll() - self.sortedLyrics.removeAll() - self.sortedLyrics.append("가사가 없습니다.") - } onDisposed: { - output.lyricsDidChangedEvent.send(true) - }.disposed(by: self.disposeBag) - } - - /// 좋아요 수 가져오기 - func fetchLikeCount(for song: SongEntity, output: Output) { - fetchLikeNumOfSongUseCase.execute(id: song.id) - .retry(3) - .map { [weak self] song in - self?.formatNumber(song.likes) ?? "" - } - .subscribe { likeCountText in - output.likeCountText.send(likeCountText) - } onFailure: { _ in - output.likeCountText.send("좋아요") - }.disposed(by: self.disposeBag) - } - - /// 좋아요 상태 가져오기 - func fetchLikeState(for song: SongEntity, output: Output) { - guard Utility.PreferenceManager.userInfo != nil else { - DEBUG_LOG("💡 비로그인 상태입니다. 로그인 후 가능합니다.") - output.likeState.send(false) - return - } - fetchFavoriteSongsUseCase.execute() - .catchAndReturn([]) - .map { $0.contains { $0.song.id == song.id } } - .subscribe(onSuccess: { isLiked in - output.likeState.send(isLiked ? true : false) - }) - .disposed(by: self.disposeBag) - } - - /// 좋아요 취소 - func cancelLikeSong(for song: SongEntity, output: Output) { - self.cancelLikeSongUseCase.execute(id: song.id) - .catch{ error in - let wmError = error.asWMError - - if wmError == .tokenExpired { - return Single.create { single in - single(.success(LikeEntity(status: 401, likes: 0, description: wmError.errorDescription ?? ""))) - return Disposables.create() - } - } - else { - return Single.create { single in - single(.success(LikeEntity(status: 0, likes: 0, description: error.asWMError.errorDescription ?? ""))) - return Disposables.create() - } - } - } - .map { [weak self] likeEntity in - return ( - likeEntity.status, - self?.formatNumber(likeEntity.likes) ?? "", - likeEntity.description - ) - } - .subscribe(onSuccess: { (status, likeCountText, description) in - - if status == 200 { - output.likeState.send(false) - output.likeCountText.send(likeCountText) - NotificationCenter.default.post(name: .likeListRefresh, object: nil) - } - - else if status == 401 { - output.showTokenModal.send(description) - } - - else { - output.showToastMessage.send(description) - } - }) - .disposed(by: disposeBag) - } - - /// 좋아요 추가 - func addLikeSong(for song: SongEntity, output: Output) { - self.addLikeSongUseCase.execute(id: song.id) - .catch{ error in - let wmError = error.asWMError - - if wmError == .tokenExpired { - return Single.create { single in - single(.success(LikeEntity(status: 401, likes: 0, description: wmError.errorDescription ?? ""))) - return Disposables.create() - } - }else { - return Single.create { single in - single(.success(LikeEntity(status: 0, likes: 0, description: error.asWMError.errorDescription ?? ""))) - return Disposables.create() - } - } - } - .map { [weak self] likeEntity in - return ( - likeEntity.status, - self?.formatNumber(likeEntity.likes) ?? "", - likeEntity.description - ) - } - .subscribe(onSuccess: { (status, likeCountText, description) in - if status == 200 { - output.likeState.send(true) - output.likeCountText.send(likeCountText) - NotificationCenter.default.post(name: .likeListRefresh, object: nil) - }else if status == 401 { - output.showTokenModal.send(description) - }else { - output.showToastMessage.send(description) - } - }) - .disposed(by: self.disposeBag) - } - - /// 재생 로그 전송 - func postPlaybackLog(item: Data) { - self.postPlaybackLogUseCase - .execute(item: item) - .catch { _ in - return Single.create { single in - single(.success(PlaybackLogEntity(id: "", title: "", artist: ""))) - return Disposables.create() - } - } - .asObservable() - .subscribe(onNext: { (entity: PlaybackLogEntity) in - DEBUG_LOG("🎤: \(entity)") - }) - .disposed(by: disposeBag) - } -} diff --git a/Projects/Features/PlayerFeature/Sources/ViewModels/PlayerViewModel+Util.swift b/Projects/Features/PlayerFeature/Sources/ViewModels/PlayerViewModel+Util.swift deleted file mode 100644 index 4dd5d951d..000000000 --- a/Projects/Features/PlayerFeature/Sources/ViewModels/PlayerViewModel+Util.swift +++ /dev/null @@ -1,81 +0,0 @@ -// -// PlayerViewModel+Util.swift -// PlayerFeature -// -// Created by YoungK on 2023/03/31. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -// MARK: - 뷰모델 내 유틸리티 함수들을 모아놓은 곳입니다. -extension PlayerViewModel { - - func formatTime(_ second: Double) -> String { - let second = Int(floor(second)) - let min = second / 60 - let sec = String(format: "%02d", second % 60) - return "\(min):\(sec)" - } - - func formatNumber(_ number: Int) -> String { - let formatter = NumberFormatter() - formatter.numberStyle = .decimal - formatter.groupingSeparator = "" - formatter.decimalSeparator = "." - formatter.maximumFractionDigits = 2 - formatter.minimumFractionDigits = 0 - formatter.roundingMode = .floor - - let correctNumber: Int = max(0, number) - - switch correctNumber { - case 0..<1000: - return String(correctNumber) - case 1000..<10_000: - let thousands = Double(correctNumber) / 1000.0 - return formatter.string(from: NSNumber(value: thousands))! + "천" - case 10_000..<100_000_0: - let tenThousands = Double(correctNumber) / 10000.0 - return formatter.string(from: NSNumber(value: tenThousands))! + "만" - case 100_000_0..<100_000_000: - let tenThousands = Int(correctNumber) / 10000 - return formatter.string(from: NSNumber(value: tenThousands))! + "만" - default: - let millions = Double(correctNumber) / 100000000.0 - return formatter.string(from: NSNumber(value: millions))! + "억" - } - } - - func getCurrentLyricsIndex(_ currentTime: Float) -> Int { - let times = lyricsDict.keys.sorted() - let index = closestIndex(to: currentTime, in: times) - return index - } - - /// target보다 작거나 같은 값 중에서 가장 가까운 값을 찾습니다. O(log n) - func closestIndex(to target: Float, in arr: [Float]) -> Int { - var left = 0 - var right = arr.count - 1 - var closestIndex = 0 - var closestDistance = Float.greatestFiniteMagnitude - - while left <= right { - let mid = (left + right) / 2 - let midValue = arr[mid] - - if midValue <= target { - let distance = target - midValue - if distance < closestDistance { - closestDistance = distance - closestIndex = mid - } - left = mid + 1 - } else { - right = mid - 1 - } - } - - return closestIndex - } -} diff --git a/Projects/Features/PlayerFeature/Sources/ViewModels/PlayerViewModel.swift b/Projects/Features/PlayerFeature/Sources/ViewModels/PlayerViewModel.swift deleted file mode 100644 index 4a50f87e9..000000000 --- a/Projects/Features/PlayerFeature/Sources/ViewModels/PlayerViewModel.swift +++ /dev/null @@ -1,350 +0,0 @@ -// -// PlayerViewModel.swift -// PlayerFeature -// -// Created by YoungK on 2023/01/13. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxCocoa -import RxSwift -import Utility -import BaseFeature -import DomainModule -import Combine -import YouTubePlayerKit -import CommonFeature - -final class PlayerViewModel: ViewModelType { - struct Input { - let viewWillAppearEvent: Observable - let closeButtonDidTapEvent: AnyPublisher - let playButtonDidTapEvent: AnyPublisher - let prevButtonDidTapEvent: Observable - let nextButtonDidTapEvent: Observable - let sliderValueChangedEvent: Observable - let repeatButtonDidTapEvent: AnyPublisher - let shuffleButtonDidTapEvent: AnyPublisher - let likeButtonDidTapEvent: AnyPublisher - let addPlaylistButtonDidTapEvent: AnyPublisher - let playlistButtonDidTapEvent: AnyPublisher - let miniExtendButtonDidTapEvent: AnyPublisher - } - struct Output { - var playerState = CurrentValueSubject(.unstarted) - var titleText = CurrentValueSubject("") - var artistText = CurrentValueSubject("") - var thumbnailImageURL = CurrentValueSubject<(sdQuality: String, hdQuality: String), Never>(("", "")) - var playTimeValue = CurrentValueSubject(0.0) - var totalTimeValue = CurrentValueSubject(0.0) - var playTimeText = CurrentValueSubject("0:00") - var totalTimeText = CurrentValueSubject("0:00") - var likeCountText = CurrentValueSubject("") - var viewsCountText = CurrentValueSubject("") - var repeatMode = CurrentValueSubject(.none) - var shuffleMode = CurrentValueSubject(.off) - var likeState = CurrentValueSubject(false) - var didPlay = PublishRelay() - //var didClose = PublishRelay() - var didPrev = PublishRelay() - var didNext = PublishRelay() - var lyricsDidChangedEvent = PassthroughSubject() - var willShowPlaylist = PassthroughSubject() - var showToastMessage = PassthroughSubject() - var showConfirmModal = PassthroughSubject() - var showContainSongsViewController = PassthroughSubject() - - var showTokenModal = PassthroughSubject() - } - - var fetchLyricsUseCase: FetchLyricsUseCase! - var addLikeSongUseCase: AddLikeSongUseCase! - var cancelLikeSongUseCase: CancelLikeSongUseCase! - var fetchLikeNumOfSongUseCase: FetchLikeNumOfSongUseCase! - var fetchFavoriteSongsUseCase: FetchFavoriteSongsUseCase! - var postPlaybackLogUseCase: PostPlaybackLogUseCase! - - let disposeBag = DisposeBag() - private let playState = PlayState.shared - private var subscription = Set() - internal var lyricsDict = [Float : String]() - internal var sortedLyrics = [String]() - internal var isLyricsScrolling = false - - init( - fetchLyricsUseCase: FetchLyricsUseCase, - addLikeSongUseCase: AddLikeSongUseCase, - cancelLikeSongUseCase: CancelLikeSongUseCase, - fetchLikeNumOfSongUseCase: FetchLikeNumOfSongUseCase, - fetchFavoriteSongsUseCase: FetchFavoriteSongsUseCase, - postPlaybackLogUseCase: PostPlaybackLogUseCase - ) { - self.fetchLyricsUseCase = fetchLyricsUseCase - self.addLikeSongUseCase = addLikeSongUseCase - self.cancelLikeSongUseCase = cancelLikeSongUseCase - self.fetchLikeNumOfSongUseCase = fetchLikeNumOfSongUseCase - self.fetchFavoriteSongsUseCase = fetchFavoriteSongsUseCase - self.postPlaybackLogUseCase = postPlaybackLogUseCase - DEBUG_LOG("✅ PlayerViewModel 생성") - } - - deinit { - DEBUG_LOG("❌ PlayerViewModel deinit") - } - - func transform(from input: Input) -> Output { - let output = Output() - - bindInput(input: input, output: output) - bindPlayStateChanged(output: output) - bindCurrentSongChanged(output: output) - bindProgress(output: output) - bindRepeatMode(output: output) - bindShuffleMode(output: output) - bindLoginStateChanged(output: output) - bindCurrentSongLikeStateChanged(output: output) - bindRequestPlaybackLog() - - return output - } - - private func bindInput(input: Input, output: Output) { - input.playButtonDidTapEvent.sink { [weak self] _ in - guard let self else { return } - let state = self.playState.state - if state == .playing { - self.playState.pause() - }else{ - self.playState.play() - } - }.store(in: &subscription) - - input.closeButtonDidTapEvent.sink { [weak self] _ in - self?.playState.switchPlayerMode(to: .mini) - }.store(in: &subscription) - - input.miniExtendButtonDidTapEvent.sink { [weak self] _ in - self?.playState.switchPlayerMode(to: .full) - }.store(in: &subscription) - - - input.repeatButtonDidTapEvent.sink { [weak self] _ in - guard let self else { return } - self.playState.repeatMode.rotate() - }.store(in: &subscription) - - input.shuffleButtonDidTapEvent.sink { [weak self] _ in - guard let self else { return } - self.playState.shuffleMode.toggle() - }.store(in: &subscription) - - input.prevButtonDidTapEvent.subscribe { [weak self] _ in - guard let self else { return } - switch self.playState.shuffleMode { - case .off: - self.playState.backward() - case .on: - self.playState.shufflePlay() - } - }.disposed(by: disposeBag) - - input.nextButtonDidTapEvent.subscribe { [weak self] _ in - guard let self else { return } - switch self.playState.shuffleMode { - case .off: - self.playState.forward() - case .on: - self.playState.shufflePlay() - } - }.disposed(by: disposeBag) - - input.sliderValueChangedEvent.subscribe { [weak self] value in - guard let self else { return } - self.playState.player?.seek(to: Double(value), allowSeekAhead: true) - }.disposed(by: disposeBag) - - input.likeButtonDidTapEvent - .throttle(for: .seconds(1), scheduler: DispatchQueue.main, latest: true) - .map { - Utility.PreferenceManager.userInfo != nil - } - .sink { [weak self] isLoggedIn in - guard let self else { return } - guard let currentSong = self.playState.currentSong else { return } - let alreadyLiked = output.likeState.value - - if !isLoggedIn { - output.showConfirmModal.send("로그인이 필요한 서비스입니다.\n로그인 하시겠습니까?") - return - } - if alreadyLiked { - self.cancelLikeSong(for: currentSong, output: output) - } else { - self.addLikeSong(for: currentSong, output: output) - } - - }.store(in: &subscription) - - input.addPlaylistButtonDidTapEvent - .map { - Utility.PreferenceManager.userInfo != nil - } - .sink { isLoggedIn in - if !isLoggedIn { - output.showConfirmModal.send("로그인이 필요한 서비스입니다.\n로그인 하시겠습니까?") - return - } - if let currentSong = self.playState.currentSong { - output.showContainSongsViewController.send(currentSong.id) - } - }.store(in: &subscription) - - input.playlistButtonDidTapEvent.sink { _ in - output.willShowPlaylist.send(true) - }.store(in: &subscription) - } - - private func bindLoginStateChanged(output: Output) { - Utility.PreferenceManager.$userInfo - .skip(1) - .subscribe { [weak self] _ in - guard let self else { return } - guard let currentSong = self.playState.currentSong else { return } - self.fetchLikeState(for: currentSong, output: output) - self.fetchLikeCount(for: currentSong, output: output) - }.disposed(by: disposeBag) - } - - private func bindPlayStateChanged(output: Output) { - playState.$state.sink { [weak self] state in - guard let self else { return } - output.playerState.send(state) - if state == .ended { - self.handlePlaybackEnded() - } - }.store(in: &subscription) - } - - private func bindCurrentSongChanged(output: Output) { - playState.$currentSong.sink { [weak self] song in - self?.handleCurrentSongChanged(song: song, output: output) - if let song = song { - self?.fetchLyrics(for: song, output: output) - self?.fetchLikeCount(for: song, output: output) - self?.fetchLikeState(for: song, output: output) - } - }.store(in: &subscription) - } - - private func bindCurrentSongLikeStateChanged(output: Output) { - NotificationCenter.default.publisher(for: .updateCurrentSongLikeState, object: nil) - .compactMap { notification in - return notification.object as? SongEntity - } - .sink { [weak self] currentSong in - guard let self else { return } - self.fetchLikeCount(for: currentSong, output: output) - self.fetchLikeState(for: currentSong, output: output) - }.store(in: &subscription) - } - - private func bindRequestPlaybackLog() { - NotificationCenter.default.publisher(for: .requestPlaybackLog, object: nil) - .compactMap { notification in - return notification.object as? PlayState.PlaybackLog - } - .filter { !$0.prev.songId.isEmpty && $0.prev.songLength > 0 } - .sink { [weak self] (item) in - guard let self else { return } - do { - let jsonData = try JSONEncoder().encode(item) - self.postPlaybackLog(item: jsonData) - }catch { - DEBUG_LOG("🎤: \(error.localizedDescription)") - } - }.store(in: &subscription) - } - - private func bindProgress(output: Output) { - playState.$progress.sink { [weak self] progress in - guard let self else { return } - self.handleProgress(progress: progress, output: output) - }.store(in: &subscription) - } - - private func bindRepeatMode(output: Output) { - playState.$repeatMode.sink { repeatMode in - output.repeatMode.send(repeatMode) - }.store(in: &subscription) - } - - private func bindShuffleMode(output: Output) { - playState.$shuffleMode.sink { shuffleMode in - output.shuffleMode.send(shuffleMode) - }.store(in: &subscription) - } - - private func handlePlaybackEnded() { - if playState.shuffleMode.isOn { - handleShuffleWithRepeatOnce() - } else { - switch playState.repeatMode { - case .none: - handleNoneRepeat() - case .repeatAll: - playState.forward() - case .repeatOnce: - playState.play() - } - } - } - - private func handleShuffleWithRepeatOnce() { - if playState.repeatMode == .repeatOnce { - playState.play() - } else { - playState.shufflePlay() - } - } - - private func handleNoneRepeat() { - if !playState.playList.isLast { - playState.forward() - } - } - - private func handleCurrentSongChanged(song: SongEntity?, output: Output) { - lyricsDict.removeAll() - sortedLyrics.removeAll() - - if let song = song { - let thumbnailSDURL = Utility.WMImageAPI.fetchYoutubeThumbnail(id: song.id).toString - let thumbnailHDURL = Utility.WMImageAPI.fetchYoutubeThumbnailHD(id: song.id).toString - output.thumbnailImageURL.send((thumbnailSDURL, thumbnailHDURL)) - output.titleText.send(song.title) - output.artistText.send(song.artist) - output.viewsCountText.send(self.formatNumber(song.views)) - output.likeCountText.send("준비중") - sortedLyrics.append("가사를 불러오는 중입니다.") - } else { - output.thumbnailImageURL.send(("", "")) - output.titleText.send("") - output.artistText.send("") - output.viewsCountText.send("조회수") - output.likeCountText.send("좋아요") - output.likeState.send(false) - } - - output.lyricsDidChangedEvent.send(true) - - } - - private func handleProgress(progress: PlayProgress, output: Output) { - output.playTimeText.send(self.formatTime(progress.currentProgress)) - output.totalTimeText.send(self.formatTime(progress.endProgress)) - output.playTimeValue.send(Float(progress.currentProgress)) - output.totalTimeValue.send(Float(progress.endProgress)) - } - -} diff --git a/Projects/Features/PlayerFeature/Sources/ViewModels/PlaylistViewModel.swift b/Projects/Features/PlayerFeature/Sources/ViewModels/PlaylistViewModel.swift deleted file mode 100644 index 8caca13d7..000000000 --- a/Projects/Features/PlayerFeature/Sources/ViewModels/PlaylistViewModel.swift +++ /dev/null @@ -1,322 +0,0 @@ -// -// PlaylistViewModel.swift -// PlayerFeature -// -// Created by YoungK on 2023/02/28. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import Combine -import RxSwift -import RxRelay -import RxDataSources -import BaseFeature -import YouTubePlayerKit -import Utility -import CommonFeature -import DomainModule - -internal typealias PlayListSectionModel = SectionModel - -final class PlaylistViewModel: ViewModelType { - struct Input { - let viewWillAppearEvent: Observable - let closeButtonDidTapEvent: AnyPublisher - let editButtonDidTapEvent: AnyPublisher - let repeatButtonDidTapEvent: AnyPublisher - let prevButtonDidTapEvent: AnyPublisher - let playButtonDidTapEvent: AnyPublisher - let nextButtonDidTapEvent: AnyPublisher - let shuffleButtonDidTapEvent: AnyPublisher - let playlistTableviewCellDidTapEvent: Observable - let playlistTableviewCellDidTapInEditModeEvent: Observable - let selectAllSongsButtonDidTapEvent: Observable - let addPlaylistButtonDidTapEvent: Observable - let removeSongsButtonDidTapEvent: Observable - let itemMovedEvent: Observable<(sourceIndex: IndexPath, destinationIndex: IndexPath)> - - } - struct Output { - var playerState = CurrentValueSubject(.unstarted) - var willClosePlaylist = PassthroughSubject() - var editState = CurrentValueSubject(false) - var thumbnailImageURL = CurrentValueSubject("") - var playTimeValue = CurrentValueSubject(0.0) - var totalTimeValue = CurrentValueSubject(0.0) - var currentSongIndex = CurrentValueSubject(0) - var repeatMode = CurrentValueSubject(.none) - var shuffleMode = CurrentValueSubject(.off) - let dataSource: BehaviorRelay<[PlayListSectionModel]> = BehaviorRelay(value: []) - let indexOfSelectedSongs: BehaviorRelay<[Int]> = BehaviorRelay(value: []) - let countOfSongs = CurrentValueSubject(0) - } - - private let playState = PlayState.shared - var isEditing = false - internal var countOfSelectedSongs = 0 - private var subscription = Set() - private var disposeBag = DisposeBag() - - init() { - DEBUG_LOG("✅ PlaylistViewModel 생성") - } - - deinit { - DEBUG_LOG("❌ PlaylistViewModel deinit") - } - - func transform(from input: Input) -> Output { - let output = Output() - - bindInput(input: input, output: output) - bindTableView(output: output) - bindPlayStateChanged(output: output) - bindCurrentSongChanged(output: output) - bindProgress(output: output) - bindRepeatMode(output: output) - bindShuffleMode(output: output) - - output.indexOfSelectedSongs - .map { $0.count } - .subscribe(onNext: { [weak self] count in - self?.countOfSelectedSongs = count - }).disposed(by: disposeBag) - - return output - } - - private func bindInput(input: Input, output: Output) { - input.viewWillAppearEvent.subscribe { [weak self] _ in - guard let self else { return } - let count = self.playState.playList.count - output.countOfSongs.send(count) - }.disposed(by: disposeBag) - - input.closeButtonDidTapEvent.sink { _ in - output.willClosePlaylist.send() - }.store(in: &subscription) - - input.editButtonDidTapEvent.sink { [weak self] _ in - guard let self else { return } - self.isEditing.toggle() - output.editState.send(self.isEditing) - }.store(in: &subscription) - - input.repeatButtonDidTapEvent.sink { [weak self] _ in - guard let self else { return } - self.playState.repeatMode.rotate() - }.store(in: &subscription) - - input.prevButtonDidTapEvent.sink { [weak self] _ in - guard let self else { return } - switch self.playState.shuffleMode { - case .off: - self.playState.backward() - case .on: - self.playState.shufflePlay() - } - }.store(in: &subscription) - - input.playButtonDidTapEvent.sink { [weak self] _ in - guard let self else { return } - let state = self.playState.state - state == .playing ? self.playState.pause() : self.playState.play() - }.store(in: &subscription) - - input.nextButtonDidTapEvent.sink { [weak self] _ in - guard let self else { return } - switch self.playState.shuffleMode { - case .off: - self.playState.forward() - case .on: - self.playState.shufflePlay() - } - }.store(in: &subscription) - - input.shuffleButtonDidTapEvent.sink { [weak self] _ in - guard let self else { return } - self.playState.shuffleMode.toggle() - }.store(in: &subscription) - - input.playlistTableviewCellDidTapEvent - .filter { _ in output.editState.value == false } - .subscribe(onNext: { [weak self] indexPath in - self?.playState.playList.changeCurrentPlayIndex(to: indexPath.row) - self?.playState.loadInPlaylist(at: indexPath.row) - }) - .disposed(by: disposeBag) - - input.playlistTableviewCellDidTapInEditModeEvent - .withLatestFrom(output.indexOfSelectedSongs, resultSelector: { (tappedIndex, selectedSongs) -> [Int] in - if let indexToRemove = selectedSongs.firstIndex(of: tappedIndex) { - var newSelectedSongs = selectedSongs - newSelectedSongs.remove(at: indexToRemove) - return newSelectedSongs - } else { - return selectedSongs + [tappedIndex] - } - }) - .map { $0.sorted { $0 < $1 } } - .bind(to: output.indexOfSelectedSongs) - .disposed(by: disposeBag) - - input.selectAllSongsButtonDidTapEvent - .withLatestFrom(output.dataSource) { ($0, $1) } - .map { (flag, dataSource) -> [Int] in - return flag ? Array(0.. Int in - // 옮기기 시작한 위치와 도착한 위치가 i를 기준으로 앞일 때 아무 영향 없음 - if sourceIndex < i && i > destIndex { return i } - - // 옮기기 시작한 위치는 i 앞, 도착한 위치가 i 또는 i 뒤일 경우 i는 앞으로 한 칸 가야함 - if sourceIndex < i && i <= destIndex { return i - 1 } - - // 옮기기 시작한 위치는 i 뒤, 도착한 위치가 i 또는 i 앞일 경우 i는 뒤로 한칸 가야함 - // 단 옮겨질 위치가 배열의 끝일 경우는 그대로 있음 - if i < sourceIndex && destIndex <= i { return i + 1 } - - // 옮기기 시작한 위치는 i 뒤, 도착한 위치가 i 뒤 일 경우 아무 영향 없음 - if sourceIndex > i && i < destIndex { return i } - - return i - }) - - // 선택된 것을 건드렸으므로 dest 인덱스로 갱신하여 넣어준다 - if sourceIsSelected { selectedIndexs.append(destIndex) } - - selectedIndexs.sort() - - output.indexOfSelectedSongs.accept(selectedIndexs) - }.disposed(by: disposeBag) - - } - - private func bindTableView(output: Output) { - /* - VM.dataSource -> PlayState.playlist.list를 바라보는 구조 - playlist.list에 변경이 일어날 때,list 를 dataSource 에 pull - */ - - // playlist.list에 변경이 일어날 때, 변경사항 pull - playState.playList.listChanged.sink { [weak self] _ in - self?.pullForOriginalPlaylist(output: output) - }.store(in: &subscription) - - // cell 선택 시, cell의 isSelected 속성을 변경시키고 dataSource에 전달 - output.indexOfSelectedSongs - .withLatestFrom(output.dataSource) { ($0, $1) } - .subscribe(onNext: { [weak self] (selectedIndexs, dataSource) in - guard let self else { return } - let copiedList = self.playState.playList.list - let newList = copiedList.enumerated().map { (index, item) -> PlayListItem in - var newItem = item - newItem.item.isSelected = selectedIndexs.contains(index) - return newItem - } - self.playState.playList.list = newList - }).disposed(by: disposeBag) - - // 편집 종료 시, 셀 선택 초기화 - output.editState - .dropFirst() - .filter { $0 == false } - .sink { [weak self] _ in - guard let self else { return } - output.indexOfSelectedSongs.accept([]) - //Comment: 편집모드가 완료 된 시점에서 list를 가져와서 listReordered.send > DB 업데이트 - let list = self.playState.playList.list - self.playState.playList.listReordered.send(list) - }.store(in: &subscription) - } - - private func bindPlayStateChanged(output: Output) { - playState.$state.sink { state in - output.playerState.send(state) - }.store(in: &subscription) - } - - private func bindCurrentSongChanged(output: Output) { - playState.$currentSong.sink { [weak self] song in - guard let self else { return } - guard let song = song else { return } - let thumbnailURL = Utility.WMImageAPI.fetchYoutubeThumbnail(id: song.id).toString - output.thumbnailImageURL.send(thumbnailURL) - guard let currentSongIndex = self.playState.playList.currentPlayIndex else { return } - output.currentSongIndex.send(currentSongIndex) - }.store(in: &subscription) - } - - private func bindProgress(output: Output) { - playState.$progress.sink { progress in - output.playTimeValue.send(Float(progress.currentProgress)) - output.totalTimeValue.send(Float(progress.endProgress)) - }.store(in: &subscription) - } - - private func bindRepeatMode(output: Output) { - playState.$repeatMode.sink { repeatMode in - output.repeatMode.send(repeatMode) - }.store(in: &subscription) - } - - private func bindShuffleMode(output: Output) { - playState.$shuffleMode.sink { shuffleMode in - output.shuffleMode.send(shuffleMode) - }.store(in: &subscription) - } - - private func pullForOriginalPlaylist(output: Output) { - let originalPlaylist = playState.playList.list - let localPlaylist = output.dataSource.value.first?.items ?? [] - - if originalPlaylist != localPlaylist { - output.dataSource.accept([PlayListSectionModel(model: 0, items: originalPlaylist)]) - } - - } - -} diff --git a/Projects/Features/PlayerFeature/Sources/Views/CustomSlider.swift b/Projects/Features/PlayerFeature/Sources/Views/CustomSlider.swift deleted file mode 100644 index 6a064a8d0..000000000 --- a/Projects/Features/PlayerFeature/Sources/Views/CustomSlider.swift +++ /dev/null @@ -1,46 +0,0 @@ -// -// CustomSlider.swift -// PlayerFeature -// -// Created by YoungK on 2023/01/06. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit - -internal protocol CustomSliderDelegate: AnyObject { - func didStartTouches(in slider: CustomSlider) - func didEndTouches(in slider: CustomSlider) -} - -internal class CustomSlider: UISlider { - - public weak var delegate: CustomSliderDelegate? - - @IBInspectable var trackLineHeight: CGFloat = 2.0 - - public override func trackRect(forBounds bound: CGRect) -> CGRect { - var newRect = super.trackRect(forBounds: bounds) - newRect.size.height = trackLineHeight - return newRect - } - - public override func beginTracking(_ touch: UITouch, with event: UIEvent?) -> Bool { - let tapPoint = touch.location(in: self) - let fraction = Float(tapPoint.x / bounds.width) - let newValue = (maximumValue - minimumValue) * fraction + minimumValue - - if newValue != value { - value = newValue - sendActions(for: .valueChanged) - } - - delegate?.didStartTouches(in: self) - - return true - } - - public override func endTracking(_ touch: UITouch?, with event: UIEvent?) { - delegate?.didEndTouches(in: self) - } -} diff --git a/Projects/Features/PlayerFeature/Sources/Views/LyricsTabelViewCell.swift b/Projects/Features/PlayerFeature/Sources/Views/LyricsTabelViewCell.swift deleted file mode 100644 index f39d23a7c..000000000 --- a/Projects/Features/PlayerFeature/Sources/Views/LyricsTabelViewCell.swift +++ /dev/null @@ -1,62 +0,0 @@ -// -// LyricsTabelViewCell.swift -// PlayerFeature -// -// Created by YoungK on 2023/01/11. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import DesignSystem -import SnapKit -import Then -import Utility - -internal class LyricsTableViewCell: UITableViewCell { - static let identifier = "LyricsTableViewCell" - static let lyricMaxWidth: CGFloat = (270 * APP_WIDTH())/375.0 - - private lazy var lyricsLabel = WMLabel(text: "가사", textColor: DesignSystemAsset.GrayColor.gray500.color, font: .t6(weight: .medium), alignment: .center, lineHeight: UIFont.WMFontSystem.t6().lineHeight, kernValue: -0.5).then { - $0.numberOfLines = 0 - $0.preferredMaxLayoutWidth = LyricsTableViewCell.lyricMaxWidth - } - - override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { - super.init(style: style, reuseIdentifier: reuseIdentifier) - configureContents() - } - - required init?(coder: NSCoder) { - fatalError("") - } - - private func configureContents() { - self.backgroundColor = .clear - self.contentView.addSubview(self.lyricsLabel) - lyricsLabel.snp.makeConstraints { - $0.centerX.equalTo(contentView.snp.centerX) - $0.centerY.equalTo(contentView.snp.centerY) - } - } - - override func prepareForReuse() { - highlight(false) - } - - internal func setLyrics(text: String) { - self.lyricsLabel.text = text - } - - internal func highlight(_ isCurrent: Bool) { - lyricsLabel.textColor = isCurrent ? DesignSystemAsset.PrimaryColor.point.color : DesignSystemAsset.GrayColor.gray500.color - } - - static func getCellHeight(lyric: String) -> CGFloat { - let textHeight: CGFloat = lyric.heightConstraintAt( - width: LyricsTableViewCell.lyricMaxWidth, - font: DesignSystemFontFamily.Pretendard.medium.font(size: 14) - ) - let yMargin: CGFloat = 7 - return max(24, textHeight + yMargin) - } -} diff --git a/Projects/Features/PlayerFeature/Sources/Views/MiniPlayerView.swift b/Projects/Features/PlayerFeature/Sources/Views/MiniPlayerView.swift deleted file mode 100644 index 2e2dfe502..000000000 --- a/Projects/Features/PlayerFeature/Sources/Views/MiniPlayerView.swift +++ /dev/null @@ -1,181 +0,0 @@ -// -// MiniPlayerView.swift -// PlayerFeature -// -// Created by YoungK on 2023/01/12. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import SwiftUI -import Utility -import DesignSystem -import SnapKit -import Then -import MarqueeLabel - -final class MiniPlayerView: UIView { - private lazy var blurEffectView = UIVisualEffectView().then { - $0.effect = UIBlurEffect(style: .regular) - } - - private lazy var contentView: UIView = UIView().then { - $0.backgroundColor = UIColor(red: 1, green: 1, blue: 1, alpha: 0.5) - } - - internal lazy var extendButton = UIButton().then { - $0.backgroundColor = .clear - } - - internal lazy var totalPlayTimeView = UIView().then { - $0.backgroundColor = DesignSystemAsset.GrayColor.gray300.color - } - internal lazy var currentPlayTimeView = UIView().then { - $0.backgroundColor = DesignSystemAsset.PrimaryColor.point.color - } - - internal lazy var titleArtistStackView: UIStackView = UIStackView(arrangedSubviews: [titleLabel, artistLabel]).then { - $0.axis = .vertical - $0.distribution = .fill - } - - internal lazy var titleLabel = MarqueeLabel().then { - $0.font = .init(font: DesignSystemFontFamily.Pretendard.medium, size: 14) - $0.textColor = DesignSystemAsset.GrayColor.gray900.color - $0.text = "제목" - $0.setTextWithAttributes(lineHeight: 24, kernValue: -0.5) - $0.leadingBuffer = 0 - $0.trailingBuffer = 35 - $0.fadeLength = 3 - $0.animationDelay = 1 - $0.speed = .rate(30) - } - - internal lazy var artistLabel = MarqueeLabel().then { - $0.font = .init(font: DesignSystemFontFamily.Pretendard.light, size: 12) - $0.textColor = DesignSystemAsset.GrayColor.gray900.color - $0.text = "아티스트" - $0.setTextWithAttributes(lineHeight: 18, kernValue: -0.5) - $0.leadingBuffer = 0 - $0.trailingBuffer = 20 - $0.fadeLength = 3 - $0.animationDelay = 1 - $0.speed = .rate(30) - } - - internal lazy var playButton = UIButton().then { - $0.setImage(DesignSystemAsset.Player.miniPlay.image, for: .normal) - $0.tintColor = .systemGray - } - - internal lazy var nextButton = UIButton().then { - $0.setImage(DesignSystemAsset.Player.nextOn.image, for: .normal) - $0.tintColor = .systemGray - } - - internal lazy var closeButton = UIButton().then { - $0.setImage(DesignSystemAsset.Player.miniClose.image, for: .normal) - $0.tintColor = .systemGray - } - - internal lazy var playlistButton = UIButton().then { - $0.setImage(DesignSystemAsset.Player.playList.image, for: .normal) - } - - override init(frame: CGRect) { - super.init(frame: frame) - configureUI() - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - } - - -} - -private extension MiniPlayerView { - private func configureUI() { - self.configureSubViews() - self.configureBlur() - self.configureContent() - self.configurePlayTime() - self.configureTitleArtist() - self.configurePlayButton() - self.configureNextButton() - self.configurePlaylistButton() - } - - private func configureSubViews() { - self.addSubview(blurEffectView) - self.addSubview(contentView) - self.contentView.addSubview(totalPlayTimeView) - self.totalPlayTimeView.addSubview(currentPlayTimeView) - self.contentView.addSubview(titleArtistStackView) - self.contentView.addSubview(extendButton) - self.contentView.addSubview(playButton) - self.contentView.addSubview(nextButton) - self.contentView.addSubview(playlistButton) - } - - private func configureBlur() { - blurEffectView.snp.makeConstraints { - $0.top.horizontalEdges.equalToSuperview() - $0.height.equalTo(56) - } - } - - private func configureContent() { - contentView.snp.makeConstraints { - $0.top.horizontalEdges.equalToSuperview() - $0.height.equalTo(56) - } - extendButton.snp.makeConstraints { - $0.edges.equalToSuperview() - } - } - - private func configurePlayTime() { - totalPlayTimeView.snp.makeConstraints { - $0.top.left.right.equalToSuperview() - $0.height.equalTo(1) - } - currentPlayTimeView.snp.makeConstraints { - $0.top.left.bottom.equalToSuperview() - $0.width.equalTo(totalPlayTimeView.snp.width).multipliedBy(0.1) - } - } - - private func configureTitleArtist() { - titleArtistStackView.snp.makeConstraints { - $0.top.equalToSuperview().offset(7) - $0.bottom.equalToSuperview().offset(-7) - $0.left.equalToSuperview().offset(20) - $0.right.equalTo(playButton.snp.left).offset(-12) - } - } - - private func configurePlayButton() { - playButton.snp.makeConstraints { - $0.centerY.equalToSuperview() - $0.right.equalTo(nextButton.snp.left).offset(-20) - $0.width.height.equalTo(32) - } - } - - private func configureNextButton() { - nextButton.snp.makeConstraints { - $0.centerY.equalToSuperview() - $0.right.equalTo(playlistButton.snp.left).offset(-20) - $0.width.height.equalTo(32) - } - } - - private func configurePlaylistButton() { - playlistButton.snp.makeConstraints { - $0.centerY.equalToSuperview() - $0.right.equalToSuperview().offset(-16) - $0.width.height.equalTo(32) - } - } -} diff --git a/Projects/Features/PlayerFeature/Sources/Views/PlayerView.swift b/Projects/Features/PlayerFeature/Sources/Views/PlayerView.swift deleted file mode 100644 index 395047b43..000000000 --- a/Projects/Features/PlayerFeature/Sources/Views/PlayerView.swift +++ /dev/null @@ -1,422 +0,0 @@ -// -// PlayerView.swift -// PlayerFeature -// -// Created by YoungK on 2023/01/12. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import SwiftUI -import Utility -import DesignSystem -import SnapKit -import Then -import MarqueeLabel - -public final class PlayerView: UIView { - private lazy var backgroundView = UIView().then { - $0.backgroundColor = DesignSystemAsset.GrayColor.gray100.color - } - - private lazy var blurEffectView = UIVisualEffectView().then { - $0.effect = UIBlurEffect(style: .regular) - } - - internal lazy var backgroundImageView = UIImageView().then { - $0.image = DesignSystemAsset.Player.dummyThumbnailLarge.image - $0.contentMode = .scaleToFill - $0.layer.opacity = 0.6 - $0.clipsToBounds = true - } - - private lazy var contentView: UIView = UIView() - - private lazy var titleBarView: UIView = UIView() - - internal lazy var closeButton = UIButton().then { - $0.setImage(DesignSystemAsset.Navigation.close.image, for: .normal) - $0.tintColor = .systemGray - } - - internal lazy var titleArtistStackView: UIStackView = UIStackView(arrangedSubviews: [titleLabel, artistLabel]).then { - $0.axis = .vertical - $0.distribution = .fill - } - - internal lazy var titleLabel = WMFlowLabel(text: "제목", textColor: DesignSystemAsset.GrayColor.gray900.color, font: .t5(weight: .medium), alignment: .center, lineHeight: UIFont.WMFontSystem.t5().lineHeight, kernValue: -0.5, leadingBuffer: 0, trailingBuffer: 35) - - internal lazy var artistLabel = MarqueeLabel().then { - $0.font = .init(font: DesignSystemFontFamily.Pretendard.medium, size: 14) - $0.textColor = DesignSystemAsset.GrayColor.gray900.color - $0.alpha = 0.6 - $0.text = "아티스트" - $0.setTextWithAttributes(lineHeight: 20, kernValue: -0.5) - $0.textAlignment = .center - $0.leadingBuffer = 0 - $0.trailingBuffer = 20 - $0.fadeLength = 3 - $0.animationDelay = 1 - $0.speed = .rate(30) - } - - internal lazy var thumbnailImageView = UIImageView().then { - $0.image = DesignSystemAsset.Player.dummyThumbnailLarge.image - $0.contentMode = .scaleAspectFill - $0.layer.cornerRadius = 12 - $0.clipsToBounds = true - } - - internal lazy var lyricsTableView = UITableView(frame: .zero, style: .plain).then { - $0.register(LyricsTableViewCell.self, forCellReuseIdentifier: LyricsTableViewCell.identifier) - $0.separatorStyle = .none - $0.rowHeight = 24 - $0.estimatedRowHeight = 24 - $0.backgroundColor = DesignSystemAsset.GrayColor.gray100.color - $0.showsVerticalScrollIndicator = false - } - - internal lazy var playTimeSlider = CustomSlider().then { - let circleSize: CGFloat = 8.0 - let circleImage: UIImage? = makeCircleWith(size: CGSize(width: circleSize, - height: circleSize), - color: DesignSystemAsset.PrimaryColor.point.color, - padding: 20) - $0.layer.cornerRadius = 1 - $0.setThumbImage(circleImage, for: .normal) - $0.setThumbImage(circleImage, for: .highlighted) - $0.maximumTrackTintColor = DesignSystemAsset.GrayColor.gray300.color // 슬라이더 안지나갔을때 컬러 값 - $0.minimumTrackTintColor = DesignSystemAsset.PrimaryColor.point.color - } - - private lazy var playTimeView: UIView = UIView() - - internal lazy var currentPlayTimeLabel = UILabel().then { - $0.font = .init(font: DesignSystemFontFamily.Pretendard.medium, size: 12) - $0.textColor = DesignSystemAsset.PrimaryColor.point.color - $0.text = "-:--" - $0.setTextWithAttributes(lineHeight: 18, kernValue: -0.5, lineHeightMultiple: 1.26) - } - - internal lazy var totalPlayTimeLabel = UILabel().then { - $0.font = .init(font: DesignSystemFontFamily.Pretendard.medium, size: 12) - $0.textColor = DesignSystemAsset.GrayColor.gray400.color - $0.text = "-:--" - $0.setTextWithAttributes(lineHeight: 18, kernValue: -0.5, lineHeightMultiple: 1.26) - } - - private lazy var buttonBarView: UIView = UIView() - - internal lazy var playButton = UIButton().then { - $0.setImage(DesignSystemAsset.Player.playLarge.image, for: .normal) - $0.tintColor = .systemGray - $0.layer.shadowColor = UIColor.gray.withAlphaComponent(0.25).cgColor - $0.layer.shadowOpacity = 1.0 - $0.layer.shadowOffset = CGSize(width: 0, height: 8) - $0.layer.shadowRadius = 40 - } - - internal lazy var prevButton = UIButton().then { - $0.setImage(DesignSystemAsset.Player.prevOn.image, for: .normal) - $0.tintColor = .systemGray - } - - internal lazy var nextButton = UIButton().then { - $0.setImage(DesignSystemAsset.Player.nextOn.image, for: .normal) - $0.tintColor = .systemGray - } - - internal lazy var repeatButton = UIButton().then { - $0.setImage(DesignSystemAsset.Player.repeatOff.image, for: .normal) - $0.tintColor = .systemGray - } - - internal lazy var shuffleButton = UIButton().then { - $0.setImage(DesignSystemAsset.Player.shuffleOff.image, for: .normal) - $0.tintColor = .systemGray - } - - private lazy var bottomBarView: UIView = UIView().then { - $0.backgroundColor = .white - } - - private lazy var bottomBarStackView = UIStackView().then { - $0.axis = .horizontal - $0.spacing = 12 - $0.distribution = .fillEqually - } - - internal lazy var likeButton = LikeButton().then { - $0.titleLabel.font = UIFont(font: DesignSystemFontFamily.Pretendard.medium, size: 12) - $0.title = "좋아요" - $0.titleLabel.setTextWithAttributes(lineHeight: 14, kernValue: -0.5, lineHeightMultiple: 0.98) - $0.isLiked = false - } - - internal lazy var viewsView = VerticalImageButton().then { - $0.image = DesignSystemAsset.Player.views.image - $0.titleLabel.font = UIFont(font: DesignSystemFontFamily.Pretendard.medium, size: 12) - $0.title = "조회수" - $0.titleLabel.setTextWithAttributes(lineHeight: 14, kernValue: -0.5, lineHeightMultiple: 0.98) - $0.titleLabel.textColor = DesignSystemAsset.GrayColor.gray400.color - } - - internal lazy var addPlayistButton = VerticalImageButton().then { - $0.image = DesignSystemAsset.Player.playerMusicAdd.image - $0.title = "노래담기" - $0.titleLabel.font = UIFont(font: DesignSystemFontFamily.Pretendard.medium, size: 12) - $0.titleLabel.setTextWithAttributes(lineHeight: 14, kernValue: -0.5, lineHeightMultiple: 0.98) - $0.titleLabel.textColor = DesignSystemAsset.GrayColor.gray400.color - } - - internal lazy var playistButton = VerticalImageButton().then { - $0.image = DesignSystemAsset.Player.playList.image - $0.title = "재생목록" - $0.titleLabel.font = UIFont(font: DesignSystemFontFamily.Pretendard.medium, size: 12) - $0.titleLabel.setTextWithAttributes(lineHeight: 14, kernValue: -0.5, lineHeightMultiple: 0.98) - $0.titleLabel.textColor = DesignSystemAsset.GrayColor.gray400.color - } - - - private var firstSpacing: CGFloat = 0 - private var secondSpacing: CGFloat = 0 - - - override init(frame: CGRect) { - super.init(frame: frame) - configureUI() - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - } - -} - -private extension PlayerView { - private func configureUI() { - self.backgroundColor = .white - self.updateSpacing() - self.configureSubViews() - self.configureBackground() - self.configureContent() - self.configureTitleBar() - self.configureThumbnail() - self.configureLyrics() - self.configurePlayTimeSlider() - self.configurePlayTime() - self.configureButtonBar() - self.configureBottomBar() - } - - private func configureSubViews() { - self.addSubview(backgroundView) - self.addSubview(contentView) - - self.backgroundView.addSubview(backgroundImageView) - self.backgroundImageView.addSubview(blurEffectView) - - self.contentView.addSubview(titleBarView) - self.contentView.addSubview(thumbnailImageView) - self.contentView.addSubview(lyricsTableView) - self.contentView.addSubview(playTimeSlider) - self.contentView.addSubview(playTimeView) - self.contentView.addSubview(buttonBarView) - self.contentView.addSubview(bottomBarView) - - self.titleBarView.addSubview(closeButton) - self.titleBarView.addSubview(titleArtistStackView) - - self.playTimeView.addSubview(currentPlayTimeLabel) - self.playTimeView.addSubview(totalPlayTimeLabel) - - self.buttonBarView.addSubview(playButton) - self.buttonBarView.addSubview(prevButton) - self.buttonBarView.addSubview(nextButton) - self.buttonBarView.addSubview(repeatButton) - self.buttonBarView.addSubview(shuffleButton) - - self.bottomBarView.addSubview(bottomBarStackView) - - self.bottomBarStackView.addArrangedSubview(likeButton) - self.bottomBarStackView.addArrangedSubview(viewsView) - self.bottomBarStackView.addArrangedSubview(addPlayistButton) - self.bottomBarStackView.addArrangedSubview(playistButton) - - } - - private func configureBackground() { - let safeAreaBottomInset: CGFloat = UIApplication.shared.windows.first?.safeAreaInsets.bottom ?? 0 - backgroundView.snp.makeConstraints { - $0.top.horizontalEdges.equalToSuperview() - $0.bottom.equalToSuperview().offset(-safeAreaBottomInset) - } - backgroundImageView.snp.makeConstraints { - $0.top.horizontalEdges.equalToSuperview() - $0.bottom.equalTo(thumbnailImageView.snp.bottom).offset(-36) - } - blurEffectView.snp.makeConstraints { - $0.edges.equalToSuperview() - } - } - private func configureContent() { - let safeAreaBottomInset: CGFloat = UIApplication.shared.windows.first?.safeAreaInsets.bottom ?? 0 - contentView.snp.makeConstraints { - $0.top.equalTo(Utility.STATUS_BAR_HEGHIT()) - $0.bottom.equalToSuperview().offset(-safeAreaBottomInset) - $0.horizontalEdges.equalToSuperview() - } - } - private func configureTitleBar() { - titleBarView.snp.makeConstraints { - $0.top.left.right.equalToSuperview() - $0.height.equalTo(48) - } - closeButton.snp.makeConstraints { - $0.centerY.equalToSuperview() - $0.left.equalToSuperview().offset(20) - $0.width.height.equalTo(32) - } - titleArtistStackView.snp.makeConstraints { - $0.centerX.centerY.equalToSuperview() - $0.top.equalToSuperview().offset(2) - $0.bottom.equalToSuperview().offset(-2) - $0.left.equalTo(closeButton.snp.right).offset(10) - $0.right.equalToSuperview().offset(-62) - } - } - private func configureThumbnail() { - let width = Utility.APP_WIDTH() - 25 - 25 - let height = width * 9 / 16 - thumbnailImageView.snp.makeConstraints { - $0.top.equalTo(titleBarView.snp.bottom).offset(firstSpacing) - $0.centerX.equalTo(self.snp.centerX) - $0.width.equalTo(width) - $0.height.equalTo(height) - } - thumbnailImageView.backgroundColor = .white - } - private func configureLyrics() { - let isIPhoneXOrAbove = Utility.APP_HEIGHT() >= 812 // iPhone X 이상 기종 - self.lyricsTableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: lyricsTableView.frame.width, height: isIPhoneXOrAbove ? 48 : 24)) - self.lyricsTableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: lyricsTableView.frame.width, height: isIPhoneXOrAbove ? 48 : 24)) - lyricsTableView.snp.makeConstraints { - $0.top.equalTo(thumbnailImageView.snp.bottom).offset(firstSpacing) - $0.centerX.equalTo(self.snp.centerX) - $0.width.equalTo(LyricsTableViewCell.lyricMaxWidth) - $0.height.equalTo(isIPhoneXOrAbove ? 120 : 72) - } - } - private func configurePlayTimeSlider() { - playTimeSlider.snp.makeConstraints { - $0.top.equalTo(lyricsTableView.snp.bottom).offset(firstSpacing) - $0.horizontalEdges.equalTo(self.snp.horizontalEdges).inset(UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)) - } - } - private func configurePlayTime() { - playTimeView.snp.makeConstraints { - $0.top.equalTo(playTimeSlider.snp.bottom).offset(-16) - $0.horizontalEdges.equalTo(playTimeSlider.snp.horizontalEdges) - $0.height.equalTo(18) - } - currentPlayTimeLabel.snp.makeConstraints { - $0.centerY.equalToSuperview() - $0.left.equalToSuperview() - } - totalPlayTimeLabel.snp.makeConstraints { - $0.centerY.equalToSuperview() - $0.right.equalToSuperview() - } - } - private func configureButtonBar() { - buttonBarView.snp.makeConstraints { - $0.height.equalTo(80) - $0.top.equalTo(playTimeView.snp.bottom).offset(secondSpacing) - $0.horizontalEdges.equalTo(self.snp.horizontalEdges).inset(UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)) - } - playButton.snp.makeConstraints { - $0.centerX.centerY.equalToSuperview() - $0.width.height.equalTo(80) - } - let spacing: CGFloat = (APP_WIDTH() < 375) ? 20 : 32 - prevButton.snp.makeConstraints { - $0.centerY.equalToSuperview() - $0.right.equalTo(playButton.snp.left).offset(-spacing) - $0.width.height.equalTo(32) - } - nextButton.snp.makeConstraints { - $0.centerY.equalToSuperview() - $0.left.equalTo(playButton.snp.right).offset(spacing) - $0.width.height.equalTo(32) - } - repeatButton.snp.makeConstraints { - $0.centerY.equalToSuperview() - $0.right.equalTo(prevButton.snp.left).offset(-spacing) - $0.width.height.equalTo(32) - } - shuffleButton.snp.makeConstraints { - $0.centerY.equalToSuperview() - $0.left.equalTo(nextButton.snp.right).offset(spacing) - $0.width.height.equalTo(32) - } - } - private func configureBottomBar() { - bottomBarView.snp.makeConstraints { - $0.bottom.horizontalEdges.equalToSuperview() - $0.height.equalTo(56) - } - bottomBarStackView.snp.makeConstraints { - $0.top.bottom.equalToSuperview() - $0.horizontalEdges.equalToSuperview().inset(22) - } - } - - private func updateSpacing() { - let x = specialValue() - firstSpacing = x * 4 + 4 - secondSpacing = x * 4 - 4 - } - - private func specialValue() -> CGFloat { - let window: UIWindow? = UIApplication.shared.windows.first - let top: CGFloat = window?.safeAreaInsets.top ?? 0 - let bottom: CGFloat = window?.safeAreaInsets.bottom ?? 0 - let left: CGFloat = window?.safeAreaInsets.left ?? 0 - let right: CGFloat = window?.safeAreaInsets.right ?? 0 - let safeAreaWidth: CGFloat = Utility.APP_WIDTH() - left - right - let safeAreaheight: CGFloat = Utility.APP_HEIGHT() - top - bottom - var x: CGFloat = 0 - if Utility.SAFEAREA_BOTTOM_HEIGHT() > 0 { - x = ((safeAreaheight - (safeAreaWidth - 50) / (16/9) - 334 - 18) / 20) - } else { - x = ((safeAreaheight - (safeAreaWidth - 50) / (16/9) - 286 - 18) / 20) - } - return CGFloat(floorf(Float(x))) - } - -// private func makeCircleWith(size: CGSize, color: UIColor) -> UIImage? { -// UIGraphicsBeginImageContextWithOptions(size, false, 0.0) -// let context = UIGraphicsGetCurrentContext() -// context?.setFillColor(color.cgColor) -// context?.setStrokeColor(UIColor.clear.cgColor) -// let bounds = CGRect(origin: .zero, size: size) -// context?.addEllipse(in: bounds) -// context?.drawPath(using: .fill) -// let image = UIGraphicsGetImageFromCurrentImageContext() -// UIGraphicsEndImageContext() -// return image -// } - - private func makeCircleWith(size: CGSize, color: UIColor, padding: CGFloat = 0.0) -> UIImage? { - let rendererSize = CGSize(width: size.width, height: size.height + padding * 2) - let renderer = UIGraphicsImageRenderer(size: rendererSize) - let image = renderer.image { (context) in - let circleRect = CGRect(x: 0, y: padding, width: size.width, height: size.height) - let path = UIBezierPath(ovalIn: circleRect) - context.cgContext.setFillColor(color.cgColor) - context.cgContext.addPath(path.cgPath) - context.cgContext.fillPath() - } - return image.resizableImage(withCapInsets: UIEdgeInsets(top: padding, left: 0, bottom: padding, right: 0)) - } -} diff --git a/Projects/Features/PlayerFeature/Sources/Views/PlaylistTableViewCell.swift b/Projects/Features/PlayerFeature/Sources/Views/PlaylistTableViewCell.swift deleted file mode 100644 index bf2ca22f1..000000000 --- a/Projects/Features/PlayerFeature/Sources/Views/PlaylistTableViewCell.swift +++ /dev/null @@ -1,191 +0,0 @@ -// -// PlaylistTableViewCell.swift -// PlayerFeature -// -// Created by YoungK on 2023/02/28. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import DesignSystem -import DomainModule -import SnapKit -import Then -import Lottie -import Kingfisher -import Utility - -internal protocol PlaylistTableViewCellDelegate: AnyObject { - func superButtonTapped(index: Int) -} - -internal class PlaylistTableViewCell: UITableViewCell { - static let identifier = "PlaylistTableViewCell" - - internal lazy var thumbnailImageView = UIImageView().then { - $0.image = DesignSystemAsset.Player.dummyThumbnailSmall.image - $0.contentMode = .scaleAspectFill - $0.layer.cornerRadius = 4 - $0.clipsToBounds = true - } - - internal lazy var titleArtistStackView = UIStackView(arrangedSubviews: [titleLabel, artistLabel]).then { - $0.axis = .vertical - $0.distribution = .fill - } - - internal lazy var titleLabel = UILabel().then { - $0.font = .init(font: DesignSystemFontFamily.Pretendard.medium, size: 14) - $0.textColor = DesignSystemAsset.GrayColor.gray900.color - $0.text = "곡 제목" - $0.setTextWithAttributes(lineHeight: 24, kernValue: -0.5) - - $0.textAlignment = .left - $0.lineBreakMode = .byTruncatingTail - } - - internal lazy var artistLabel = UILabel().then { - $0.font = .init(font: DesignSystemFontFamily.Pretendard.light, size: 12) - $0.textColor = DesignSystemAsset.GrayColor.gray900.color - $0.text = "아티스트명" - $0.setTextWithAttributes(lineHeight: 18, kernValue: -0.5) - $0.textAlignment = .left - $0.lineBreakMode = .byTruncatingTail - } - - internal lazy var playImageView = UIImageView().then { - $0.image = DesignSystemAsset.Player.playLarge.image - $0.layer.shadowColor = UIColor(red: 0.03, green: 0.06, blue: 0.2, alpha: 0.04).cgColor - $0.layer.shadowOpacity = 1.0 - $0.layer.shadowOffset = CGSize(width: 0, height: 5.33) - $0.layer.shadowRadius = 5.33 - } - - internal lazy var waveStreamAnimationView = - LottieAnimationView(name: "WaveStream", bundle: DesignSystemResources.bundle).then { - $0.loopMode = .loop - $0.contentMode = .scaleAspectFit - } - - internal lazy var superButton = UIButton().then { - $0.addTarget(self, action: #selector(superButtonSelectedAction), for: .touchUpInside) - } - - internal weak var delegate: PlaylistTableViewCellDelegate? - - internal var model: (index: Int, song: SongEntity?) = (0, nil) - - - internal var isPlaying: Bool = false - - internal var isAnimating: Bool = false - - override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { - super.init(style: style, reuseIdentifier: reuseIdentifier) - configureContents() - } - - required init?(coder: NSCoder) { - fatalError("") - } - - override func prepareForReuse() { - super.prepareForReuse() - isPlaying = false - } - - private func configureContents() { - self.backgroundColor = .clear - self.contentView.addSubview(self.thumbnailImageView) - self.contentView.addSubview(self.titleArtistStackView) - self.contentView.addSubview(self.playImageView) - self.contentView.addSubview(self.waveStreamAnimationView) - self.contentView.addSubview(self.superButton) - - let height = 40 - let width = height * 16 / 9 - thumbnailImageView.snp.makeConstraints { - $0.centerY.equalTo(contentView.snp.centerY) - $0.left.equalTo(contentView.snp.left).offset(20) - $0.width.equalTo(width) - $0.height.equalTo(height) - } - - titleArtistStackView.snp.makeConstraints { - $0.top.equalTo(thumbnailImageView.snp.top) - $0.left.equalTo(thumbnailImageView.snp.right).offset(8) - $0.right.equalTo(playImageView.snp.left).offset(-16) - $0.bottom.equalTo(thumbnailImageView.snp.bottom) - } - - playImageView.snp.makeConstraints { - $0.width.height.equalTo(32) - $0.centerY.equalTo(contentView.snp.centerY) - $0.right.equalTo(contentView.snp.right).offset(-20) - } - - waveStreamAnimationView.snp.makeConstraints { - $0.width.height.equalTo(32) - $0.centerY.equalTo(contentView.snp.centerY) - $0.right.equalTo(contentView.snp.right).offset(-20) - } - - superButton.snp.makeConstraints { - $0.left.top.bottom.equalToSuperview() - $0.right.equalToSuperview() - } - } - -} - -extension PlaylistTableViewCell { - internal func setContent(song: SongEntity, index: Int, isEditing: Bool, isPlaying: Bool, isAnimating: Bool) { - self.thumbnailImageView.kf.setImage( - with: URL(string: Utility.WMImageAPI.fetchYoutubeThumbnail(id: song.id).toString), - placeholder: DesignSystemAsset.Logo.placeHolderSmall.image, - options: [.transition(.fade(0.2))] - ) - - self.titleLabel.text = song.title - self.artistLabel.text = song.artist - self.model = (index, song) - self.backgroundColor = song.isSelected ? DesignSystemAsset.GrayColor.gray200.color : UIColor.clear - - self.updateButtonHidden(isEditing: isEditing, isPlaying: isPlaying) - self.updateConstraintPlayImageView(isEditing: isEditing) - self.updateLabelHighlight(isPlaying: isPlaying) - self.updateAnimating(isAnimating: isAnimating) - } - - @objc func superButtonSelectedAction() { - delegate?.superButtonTapped(index: model.index) - } - - private func updateButtonHidden(isEditing: Bool, isPlaying: Bool) { - if isEditing { - playImageView.isHidden = true - waveStreamAnimationView.isHidden = true - } else { - playImageView.isHidden = isPlaying - waveStreamAnimationView.isHidden = !isPlaying - } - superButton.isHidden = !isEditing - } - - private func updateConstraintPlayImageView(isEditing: Bool) { - let offset = isEditing ? 22 : -20 - self.playImageView.snp.updateConstraints { - $0.right.equalToSuperview().offset(offset) - } - } - - private func updateLabelHighlight(isPlaying: Bool) { - titleLabel.textColor = isPlaying ? DesignSystemAsset.PrimaryColor.point.color : DesignSystemAsset.GrayColor.gray900.color - artistLabel.textColor = isPlaying ? DesignSystemAsset.PrimaryColor.point.color : DesignSystemAsset.GrayColor.gray900.color - } - - private func updateAnimating(isAnimating: Bool) { - isAnimating ? self.waveStreamAnimationView.play() : self.waveStreamAnimationView.pause() - } - -} diff --git a/Projects/Features/PlayerFeature/Sources/Views/PlaylistView.swift b/Projects/Features/PlayerFeature/Sources/Views/PlaylistView.swift deleted file mode 100644 index 6290c53c9..000000000 --- a/Projects/Features/PlayerFeature/Sources/Views/PlaylistView.swift +++ /dev/null @@ -1,286 +0,0 @@ -// -// PlaylistView.swift -// PlayerFeature -// -// Created by YoungK on 2023/02/28. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import UIKit -import Utility -import DesignSystem -import SnapKit -import Then - -public final class PlaylistView: UIView { - private lazy var backgroundView = UIView().then { - $0.backgroundColor = DesignSystemAsset.GrayColor.gray100.color - } - - private lazy var contentView = UIView() - - internal lazy var titleBarView = UIView() - - internal lazy var closeButton = UIButton().then { - $0.setImage(DesignSystemAsset.Navigation.close.image, for: .normal) - $0.tintColor = .systemGray - } - - internal lazy var titleCountStackView = UIStackView(arrangedSubviews: [titleLabel, countLabel]).then { - $0.axis = .horizontal - $0.distribution = .fill - $0.spacing = 4 - } - -// internal lazy var titleLabel = UILabel().then { -// $0.font = .init(font: DesignSystemFontFamily.Pretendard.medium, size: 16) -// $0.textColor = DesignSystemAsset.GrayColor.gray900.color -// $0.text = "재생목록" -// $0.setTextWithAttributes(lineHeight: 24, kernValue: -0.5) -// $0.textAlignment = .center -// } - - lazy var titleLabel = WMLabel(text: "재생목록", textColor: DesignSystemAsset.GrayColor.gray900.color, font: .t5(weight: .medium), alignment: .center, lineHeight: 24, kernValue: -0.5) - - internal lazy var countLabel = UILabel().then { - $0.font = .init(font: DesignSystemFontFamily.Pretendard.bold, size: 18) - $0.textColor = DesignSystemAsset.PrimaryColor.point.color - $0.text = "0" - $0.setTextWithAttributes(lineHeight: 28, kernValue: -0.5) - $0.textAlignment = .center - } - - internal lazy var editButton = RectangleButton(type: .custom).then { - $0.setBackgroundColor(.clear, for: .normal) - $0.setColor(isHighlight: false) - $0.setTitle("편집", for: .normal) - $0.titleLabel?.font = .init(font: DesignSystemFontFamily.Pretendard.bold, size: 12) - $0.layer.borderWidth = 1 - $0.layer.cornerRadius = 4 - } - - internal lazy var playlistTableView = UITableView().then { - $0.register(PlaylistTableViewCell.self, forCellReuseIdentifier: PlaylistTableViewCell.identifier) - $0.separatorStyle = .none - $0.rowHeight = 60 - $0.estimatedRowHeight = 60 - $0.backgroundColor = DesignSystemAsset.GrayColor.gray100.color - $0.showsVerticalScrollIndicator = true - } - - private lazy var blurEffectView = UIVisualEffectView().then { - $0.effect = UIBlurEffect(style: .regular) - } - - private lazy var homeIndicatorBackgroundView = UIView().then { - $0.backgroundColor = UIColor(red: 1, green: 1, blue: 1, alpha: 0.5) - } - - internal lazy var miniPlayerView = UIView().then { - $0.backgroundColor = UIColor(red: 1, green: 1, blue: 1, alpha: 0.5) - } - - internal lazy var miniPlayerContentView = UIView() - - internal lazy var miniPlayerStackView = UIStackView().then { - $0.axis = .horizontal - $0.distribution = .fillEqually - $0.spacing = (APP_WIDTH() < 375) ? 10 : 20 - } - - internal lazy var totalPlayTimeView = UIView().then { - $0.backgroundColor = DesignSystemAsset.GrayColor.gray300.color - } - internal lazy var currentPlayTimeView = UIView().then { - $0.backgroundColor = DesignSystemAsset.PrimaryColor.point.color - } - - internal lazy var thumbnailImageView = UIImageView().then { - $0.image = DesignSystemAsset.Player.dummyThumbnailSmall.image - $0.contentMode = .scaleAspectFill - $0.layer.cornerRadius = 4 - $0.clipsToBounds = true - } - - internal lazy var repeatButton = UIButton().then { - $0.setImage(DesignSystemAsset.Player.repeatOff.image, for: .normal) - $0.tintColor = .systemGray - } - - internal lazy var playButton = UIButton().then { - $0.setImage(DesignSystemAsset.Player.miniPlay.image, for: .normal) - $0.tintColor = .systemGray - } - - internal lazy var prevButton = UIButton().then { - $0.setImage(DesignSystemAsset.Player.prevOn.image, for: .normal) - $0.tintColor = .systemGray - } - - internal lazy var nextButton = UIButton().then { - $0.setImage(DesignSystemAsset.Player.nextOn.image, for: .normal) - $0.tintColor = .systemGray - } - - internal lazy var shuffleButton = UIButton().then { - $0.setImage(DesignSystemAsset.Player.shuffleOff.image, for: .normal) - $0.tintColor = .systemGray - } - - override init(frame: CGRect) { - super.init(frame: frame) - configureUI() - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - } -} - -private extension PlaylistView { - private func configureUI() { - self.backgroundColor = .clear // 가장 뒷배경 - self.configureSubViews() - self.configureBackground() - self.configureContent() - self.configureTitleBar() - self.configurePlaylist() - self.configureBlur() - self.configureMiniPlayer() - self.configreHomeIndicatorBackgroundView() - } - - private func configureSubViews() { - self.addSubview(backgroundView) - self.addSubview(contentView) - contentView.addSubview(titleBarView) - titleBarView.addSubview(closeButton) - titleBarView.addSubview(titleCountStackView) - titleBarView.addSubview(editButton) - contentView.addSubview(playlistTableView) - contentView.addSubview(blurEffectView) - contentView.addSubview(miniPlayerView) - contentView.addSubview(homeIndicatorBackgroundView) - miniPlayerView.addSubview(miniPlayerContentView) - miniPlayerContentView.addSubview(thumbnailImageView) - miniPlayerContentView.addSubview(miniPlayerStackView) - miniPlayerView.addSubview(totalPlayTimeView) - totalPlayTimeView.addSubview(currentPlayTimeView) - miniPlayerView.addSubview(repeatButton) - miniPlayerView.addSubview(prevButton) - miniPlayerView.addSubview(playButton) - miniPlayerView.addSubview(nextButton) - miniPlayerView.addSubview(shuffleButton) - } - - private func configureBackground() { - backgroundView.snp.makeConstraints { - $0.top.horizontalEdges.equalToSuperview() - $0.bottom.equalToSuperview().offset(-SAFEAREA_BOTTOM_HEIGHT()) - } - } - - private func configureContent() { - contentView.snp.makeConstraints { - $0.top.equalToSuperview().offset(Utility.STATUS_BAR_HEGHIT()) - $0.bottom.equalToSuperview() - $0.horizontalEdges.equalToSuperview() - } - } - - private func configureTitleBar() { - titleBarView.snp.makeConstraints { - $0.top.left.right.equalToSuperview() - $0.height.equalTo(48) - } - - closeButton.snp.makeConstraints { - $0.width.height.equalTo(32) - $0.left.equalToSuperview().offset(20) - $0.centerY.equalToSuperview() - } - - titleCountStackView.snp.makeConstraints { - $0.centerX.centerY.equalToSuperview() - } - - editButton.snp.makeConstraints { - $0.width.equalTo(45) - $0.height.equalTo(24) - $0.right.equalToSuperview().offset(-20) - $0.centerY.equalToSuperview() - } - - } - - private func configurePlaylist() { - playlistTableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: 56)) - playlistTableView.scrollIndicatorInsets = UIEdgeInsets(top: 0, left: 0, bottom: 56, right: 0) - playlistTableView.snp.makeConstraints { - $0.top.equalTo(titleBarView.snp.bottom) - $0.horizontalEdges.equalToSuperview() - $0.bottom.equalToSuperview() - } - } - - private func configureBlur() { - blurEffectView.snp.makeConstraints { - $0.height.equalTo(56 + SAFEAREA_BOTTOM_HEIGHT()) - $0.bottom.left.right.equalToSuperview() - } - } - - private func configureMiniPlayer() { - miniPlayerView.snp.makeConstraints { - $0.height.equalTo(56) - $0.left.right.equalToSuperview() - $0.bottom.equalToSuperview().offset(-SAFEAREA_BOTTOM_HEIGHT()) - } - - totalPlayTimeView.snp.makeConstraints { - $0.height.equalTo(1) - $0.top.left.right.equalToSuperview() - } - - currentPlayTimeView.snp.makeConstraints { - $0.top.left.bottom.equalToSuperview() - $0.width.equalToSuperview().multipliedBy(0) - } - - miniPlayerContentView.snp.makeConstraints { - $0.top.bottom.equalToSuperview() - $0.horizontalEdges.equalToSuperview().inset(UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 16)) - } - - thumbnailImageView.snp.makeConstraints { - let height = 40 - let width = height * 16 / 9 - $0.centerY.equalToSuperview() - $0.left.equalToSuperview() - $0.width.equalTo(width) - $0.height.equalTo(height) - } - - miniPlayerStackView.snp.makeConstraints { - let spacing: CGFloat = (APP_WIDTH() < 375) ? 15 : 27 - $0.top.bottom.equalToSuperview() - $0.left.equalTo(thumbnailImageView.snp.right).offset(spacing) - $0.right.equalToSuperview() - } - - miniPlayerStackView.addArrangedSubview(repeatButton) - miniPlayerStackView.addArrangedSubview(prevButton) - miniPlayerStackView.addArrangedSubview(playButton) - miniPlayerStackView.addArrangedSubview(nextButton) - miniPlayerStackView.addArrangedSubview(shuffleButton) - - } - - private func configreHomeIndicatorBackgroundView() { - homeIndicatorBackgroundView.snp.makeConstraints { - $0.height.equalTo(SAFEAREA_BOTTOM_HEIGHT()) - $0.left.right.bottom.equalToSuperview() - } - } -} diff --git a/Projects/Features/PlayerFeature/Sources/Views/RectangleButton.swift b/Projects/Features/PlayerFeature/Sources/Views/RectangleButton.swift deleted file mode 100644 index 92986297f..000000000 --- a/Projects/Features/PlayerFeature/Sources/Views/RectangleButton.swift +++ /dev/null @@ -1,27 +0,0 @@ -// -// RectangleButton.swift -// PlayerFeature -// -// Created by YoungK on 2023/02/28. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import DesignSystem - -internal class RectangleButton: UIButton { - - func setColor(isHighlight: Bool) { - let pointColor = DesignSystemAsset.PrimaryColor.point.color - if isHighlight { - self.setColor(title: pointColor, border: pointColor) - } else { - self.setColor(title: DesignSystemAsset.GrayColor.gray400.color, border: DesignSystemAsset.GrayColor.gray300.color) - } - } - - func setColor(title: UIColor, border: UIColor) { - self.setTitleColor(title, for: .normal) - self.layer.borderColor = border.cgColor - } -} diff --git a/Projects/Features/PlayerFeature/Tests/TargetTests.swift b/Projects/Features/PlayerFeature/Tests/TargetTests.swift deleted file mode 100644 index b1cf79405..000000000 --- a/Projects/Features/PlayerFeature/Tests/TargetTests.swift +++ /dev/null @@ -1,17 +0,0 @@ -import XCTest - -class TargetTests: XCTestCase { - - override func setUpWithError() throws { - // Put setup code here. This method is called before the invocation of each test method in the class. - } - - override func tearDownWithError() throws { - // Put teardown code here. This method is called after the invocation of each test method in the class. - } - - func testExample() throws { - XCTAssertEqual("A", "A") - } - -} diff --git a/Projects/Features/PlayerFeature/YoutubePlayerKit/API/YouTubePlayerAPI+Concurrency.swift b/Projects/Features/PlayerFeature/YoutubePlayerKit/API/YouTubePlayerAPI+Concurrency.swift deleted file mode 100644 index 69d588f0a..000000000 --- a/Projects/Features/PlayerFeature/YoutubePlayerKit/API/YouTubePlayerAPI+Concurrency.swift +++ /dev/null @@ -1,174 +0,0 @@ -#if compiler(>=5.5) && canImport(_Concurrency) -import Foundation - -// MARK: - YouTubePlayer360DegreePerspectiveAPI+Concurrency - -public extension YouTubePlayer360DegreePerspectiveAPI { - - /// Retrieves properties that describe the viewer's current perspective - func get360DegreePerspective() async throws -> YouTubePlayer.Perspective360Degree { - try await withCheckedThrowingContinuation { continuation in - self.get360DegreePerspective { result in - continuation.resume(with: result) - } - } - } - -} - -// MARK: - YouTubePlayerPlaylistAPI+Concurrency - -public extension YouTubePlayerPlaylistAPI { - - /// This function returns an array of the video IDs in the playlist as they are currently ordered - func getPlaylist() async throws -> [String] { - try await withCheckedThrowingContinuation { continuation in - self.getPlaylist { result in - continuation.resume(with: result) - } - } - } - - /// This function returns the index of the playlist video that is currently playing. - func getPlaylistIndex() async throws -> Int { - try await withCheckedThrowingContinuation { continuation in - self.getPlaylistIndex { result in - continuation.resume(with: result) - } - } - } - -} - -// MARK: - YouTubePlayerVolumeAPI+Concurrency - -public extension YouTubePlayerVolumeAPI { - - /// Returns Bool value if the player is muted - func isMuted() async throws -> Bool { - try await withCheckedThrowingContinuation { continuation in - self.isMuted { result in - continuation.resume(with: result) - } - } - } - - /// Returns the player's current volume, an integer between 0 and 100 - func getVolume() async throws -> Int { - try await withCheckedThrowingContinuation { continuation in - self.getVolume { result in - continuation.resume(with: result) - } - } - } - -} - -// MARK: - YouTubePlayerPlaybackRateAPI+Concurrency - -public extension YouTubePlayerPlaybackRateAPI { - - /// This function retrieves the playback rate of the currently playing video - func getPlaybackRate() async throws -> YouTubePlayer.PlaybackRate { - try await withCheckedThrowingContinuation { continuation in - self.getPlaybackRate { result in - continuation.resume(with: result) - } - } - } - - /// This function returns the set of playback rates in which the current video is available - func getAvailablePlaybackRates() async throws -> [YouTubePlayer.PlaybackRate] { - try await withCheckedThrowingContinuation { continuation in - self.getAvailablePlaybackRates { result in - continuation.resume(with: result) - } - } - } - -} - -// MARK: - YouTubePlayerPlaybackAPI+Concurrency - -public extension YouTubePlayerPlaybackAPI { - - /// Returns a number between 0 and 1 that specifies the percentage of the video that the player shows as buffered - func getVideoLoadedFraction() async throws -> Double { - try await withCheckedThrowingContinuation { continuation in - self.getVideoLoadedFraction { result in - continuation.resume(with: result) - } - } - } - - /// Returns the PlaybackState of the player video - func getPlaybackState() async throws -> YouTubePlayer.PlaybackState { - try await withCheckedThrowingContinuation { continuation in - self.getPlaybackState { result in - continuation.resume(with: result) - } - } - } - - /// Returns the elapsed time in seconds since the video started playing - func getCurrentTime() async throws -> Double { - try await withCheckedThrowingContinuation { continuation in - self.getCurrentTime { result in - continuation.resume(with: result) - } - } - } - - /// Returns the current PlaybackMetadata - func getPlaybackMetadata() async throws -> YouTubePlayer.PlaybackMetadata { - try await withCheckedThrowingContinuation { continuation in - self.getPlaybackMetadata { result in - continuation.resume(with: result) - } - } - } - -} - -// MARK: - YouTubePlayerVideoInformationAPI+Concurrency - -public extension YouTubePlayerVideoInformationAPI { - - /// Retrieve the YouTubePlayer Information - func getInformation() async throws -> YouTubePlayer.Information { - try await withCheckedThrowingContinuation { continuation in - self.getInformation { result in - continuation.resume(with: result) - } - } - } - - /// Returns the duration in seconds of the currently playing video - func getDuration() async throws -> Double { - try await withCheckedThrowingContinuation { continuation in - self.getDuration { result in - continuation.resume(with: result) - } - } - } - - /// Returns the YouTube.com URL for the currently loaded/playing video - func getVideoURL() async throws -> String { - try await withCheckedThrowingContinuation { continuation in - self.getVideoURL { result in - continuation.resume(with: result) - } - } - } - - /// Returns the embed code for the currently loaded/playing video - func getVideoEmbedCode() async throws -> String { - try await withCheckedThrowingContinuation { continuation in - self.getVideoEmbedCode { result in - continuation.resume(with: result) - } - } - } - -} -#endif diff --git a/Projects/Features/PlayerFeature/YoutubePlayerKit/API/YouTubePlayerAPI+Convenience.swift b/Projects/Features/PlayerFeature/YoutubePlayerKit/API/YouTubePlayerAPI+Convenience.swift deleted file mode 100644 index ca6618bd1..000000000 --- a/Projects/Features/PlayerFeature/YoutubePlayerKit/API/YouTubePlayerAPI+Convenience.swift +++ /dev/null @@ -1,133 +0,0 @@ -import Combine -import Foundation - -// MARK: - YouTubePlayerPlaybackAPI+currentTimePublisher - -public extension YouTubePlayerPlaybackAPI where Self: YouTubePlayerEventAPI { - - /// A Publisher that emits the current elapsed time in seconds since the video started playing - /// - Parameter updateInterval: The update TimeInterval in seconds to retrieve the current elapsed time. Default value `0.5` - func currentTimePublisher( - updateInterval: TimeInterval = 0.5 - ) -> AnyPublisher { - Just( - .init() - ) - .append( - Timer.publish( - every: updateInterval, - on: .main, - in: .common - ) - .autoconnect() - ) - .flatMap { _ in - self.playbackStatePublisher - .filter { $0 == .playing } - .removeDuplicates() - } - .flatMap { _ in - Future { [weak self] promise in - self?.getCurrentTime { result in - guard case .success(let currentTime) = result else { - return - } - promise(.success(currentTime)) - } - } - } - .removeDuplicates() - .eraseToAnyPublisher() - } - -} - -// MARK: - YouTubePlayerPlaybackAPI+videoLoadedFractionPublisher - -public extension YouTubePlayerPlaybackAPI where Self: YouTubePlayerEventAPI { - - /// A Publisher that emits a number between 0 and 1 that specifies - /// the percentage of the video that the player shows as buffered - /// - Parameter updateInterval: The update TimeInterval in seconds to retrieve the percentage that the player shows as buffered. Default value `0.5` - func videoLoadedFractionPublisher( - updateInterval: TimeInterval = 0.5 - ) -> AnyPublisher { - Just( - .init() - ) - .append( - Timer.publish( - every: updateInterval, - on: .main, - in: .common - ) - .autoconnect() - ) - .flatMap { _ in - self.playbackStatePublisher - .filter { $0 == .playing } - .removeDuplicates() - } - .flatMap { _ in - Future { [weak self] promise in - self?.getVideoLoadedFraction { result in - guard case .success(let fraction) = result else { - return - } - promise(.success(fraction)) - } - } - } - .removeDuplicates() - .eraseToAnyPublisher() - } - -} - -// MARK: - YouTubePlayerPlaybackAPI+playbackMetadataPublisher - -public extension YouTubePlayerPlaybackAPI where Self: YouTubePlayerEventAPI { - - /// A Publisher that emits the current PlaybackMetadata - var playbackMetadataPublisher: AnyPublisher { - self.playbackStatePublisher - .filter { $0 == .playing } - .flatMap { _ in - Future { [weak self] promise in - self?.getPlaybackMetadata { result in - guard case .success(let playbackMetadata) = result else { - return - } - promise(.success(playbackMetadata)) - } - } - } - .removeDuplicates() - .eraseToAnyPublisher() - } - -} - -// MARK: - YouTubePlayerVideoInformationAPI+durationPublisher - -public extension YouTubePlayerVideoInformationAPI where Self: YouTubePlayerEventAPI { - - /// A Publisher that emits the duration in seconds of the currently playing video - var durationPublisher: AnyPublisher { - self.playbackStatePublisher - .filter { $0 == .playing } - .flatMap { _ in - Future { [weak self] promise in - self?.getDuration { result in - guard case .success(let duration) = result else { - return - } - promise(.success(duration)) - } - } - } - .removeDuplicates() - .eraseToAnyPublisher() - } - -} diff --git a/Projects/Features/PlayerFeature/YoutubePlayerKit/API/YouTubePlayerAPI.swift b/Projects/Features/PlayerFeature/YoutubePlayerKit/API/YouTubePlayerAPI.swift deleted file mode 100644 index 36380f106..000000000 --- a/Projects/Features/PlayerFeature/YoutubePlayerKit/API/YouTubePlayerAPI.swift +++ /dev/null @@ -1,315 +0,0 @@ -import Combine -import Foundation - -// MARK: - YouTubePlayerAPI - -/// The YouTubePlayerAPI -/// - Read more: https://developers.google.com/youtube/iframe_api_reference#Functions -public typealias YouTubePlayerAPI = YouTubePlayerConfigurationAPI - & YouTubePlayerQueueingAPI - & YouTubePlayerEventAPI - & YouTubePlayerVideoAPI - & YouTubePlayer360DegreePerspectiveAPI - & YouTubePlayerPlaylistAPI - & YouTubePlayerVolumeAPI - & YouTubePlayerPlaybackRateAPI - & YouTubePlayerPlaybackAPI - & YouTubePlayerVideoInformationAPI - -// MARK: - YouTubePlayerConfigurationAPI - -/// The YouTubePlayerConfigurationAPI -/// - Note: A custom YouTubePlayer API definition -public protocol YouTubePlayerConfigurationAPI: AnyObject { - - /// Update YouTubePlayer Configuration - /// - Note: Updating the Configuration will result in a reload of the entire YouTubePlayer - /// - Parameter configuration: The YouTubePlayer Configuration - func update( - configuration: YouTubePlayer.Configuration - ) - -} - -// MARK: - YouTubePlayerQueueingAPI - -/// The YouTubePlayerQueueingAPI -/// - Read more: https://developers.google.com/youtube/iframe_api_reference#Queueing_Functions -public protocol YouTubePlayerQueueingAPI: AnyObject { - - /// Load YouTubePlayer Source - /// - Parameter source: The YouTubePlayer Source to load - func load( - source: YouTubePlayer.Source? - ) - - /// Cue YouTubePlayer Source - /// - Parameter source: The YouTubePlayer Source to cue - func cue( - source: YouTubePlayer.Source? - ) - -} - -// MARK: - YouTubePlayerEventAPI - -/// The YouTubePlayerEventAPI -/// - Read more: https://developers.google.com/youtube/iframe_api_reference#Events -public protocol YouTubePlayerEventAPI: AnyObject { - - /// The current YouTubePlayer State, if available - var state: YouTubePlayer.State? { get } - - /// A Publisher that emits the current YouTubePlayer State - var statePublisher: AnyPublisher { get } - - /// The current YouTubePlayer PlaybackState, if available - var playbackState: YouTubePlayer.PlaybackState? { get } - - /// A Publisher that emits the current YouTubePlayer PlaybackState - var playbackStatePublisher: AnyPublisher { get } - - /// The current YouTubePlayer PlaybackQuality, if available - var playbackQuality: YouTubePlayer.PlaybackQuality? { get } - - /// A Publisher that emits the current YouTubePlayer PlaybackQuality - var playbackQualityPublisher: AnyPublisher { get } - - /// The current YouTubePlayer PlaybackRate, if available - var playbackRate: YouTubePlayer.PlaybackRate? { get } - - /// A Publisher that emits the current YouTubePlayer PlaybackRate - var playbackRatePublisher: AnyPublisher { get } - -} - -// MARK: - YouTubePlayerVideoAPI - -/// The YouTubePlayerVideoAPI -/// Playback controls and player settings -/// - Read more: https://developers.google.com/youtube/iframe_api_reference#Playback_controls -public protocol YouTubePlayerVideoAPI: AnyObject { - - /// Plays the currently cued/loaded video - func play() - - /// Pauses the currently playing video - func pause() - - /// Stops and cancels loading of the current video - func stop() - - /// Seeks to a specified time in the video - /// - Parameters: - /// - seconds: The seconds parameter identifies the time to which the player should advance - /// - allowSeekAhead: Determines whether the player will make a new request to the server - func seek( - to seconds: Double, - allowSeekAhead: Bool - ) - -} - -// MARK: - YouTubePlayer360DegreePerspectiveAPI - -/// The YouTubePlayer360DegreePerspectiveAPI -/// Controlling playback of 360° videos -/// - Read more: https://developers.google.com/youtube/iframe_api_reference#Spherical_Video_Controls -public protocol YouTubePlayer360DegreePerspectiveAPI: AnyObject { - - /// Retrieves properties that describe the viewer's current perspective - /// - Parameter completion: The completion closure - func get360DegreePerspective( - completion: @escaping (Result) -> Void - ) - - /// Sets the video orientation for playback of a 360° video - /// - Parameter perspective360Degree: The Perspective360Degree - func set( - perspective360Degree: YouTubePlayer.Perspective360Degree - ) - -} - -// MARK: - YouTubePlayerPlaylistAPI - -/// The YouTubePlayerPlaylistAPI -/// Playing a video in a playlist, setting playback behavior for playlists and retrieving playlist information -/// - Read more: https://developers.google.com/youtube/iframe_api_reference#playing-a-video-in-a-playlist -public protocol YouTubePlayerPlaylistAPI: AnyObject { - - /// This function loads and plays the next video in the playlist - func nextVideo() - - /// This function loads and plays the previous video in the playlist - func previousVideo() - - /// This function loads and plays the specified video in the playlist - /// - Parameter index: The index of the video that you want to play in the playlist - func playVideo( - at index: Int - ) - - /// This function indicates whether the video player should continuously play a playlist - /// or if it should stop playing after the last video in the playlist ends - /// - Parameter enabled: Bool value if is enabled - func setLoop( - enabled: Bool - ) - - /// This function indicates whether a playlist's videos should be shuffled - /// so that they play back in an order different from the one that the playlist creator designated - /// - Parameter enabled: Bool value if is enabled - func setShuffle( - enabled: Bool - ) - - /// Retrieve an array of the video IDs in the playlist as they are currently ordered - /// - Parameter completion: The completion closure - func getPlaylist( - completion: @escaping (Result<[String], YouTubePlayerAPIError>) -> Void - ) - - /// Retrieve the index of the playlist video that is currently playing. - /// - Parameter completion: The completion closure - func getPlaylistIndex( - completion: @escaping (Result) -> Void - ) - -} - -// MARK: - YouTubePlayerVolumeAPI - -/// The YouTubePlayerVolumeAPI -/// Changing the player volume -/// - Read more: https://developers.google.com/youtube/iframe_api_reference#changing-the-player-volume -public protocol YouTubePlayerVolumeAPI: AnyObject { - - /// Mutes the player - func mute() - - /// Unmutes the player - func unmute() - - /// Retrieve the Bool value if the player is muted - /// - Parameter completion: The completion closure - func isMuted( - completion: @escaping (Result) -> Void - ) - - /// Retrieve the player's current volume, an integer between 0 and 100 - /// - Parameter completion: The completion closure - func getVolume( - completion: @escaping (Result) -> Void - ) - - /// Sets the volume. - /// Accepts an integer between 0 and 100 - /// - Note: This function is part of the official YouTube Player iFrame API - /// but due to limitations and restrictions of the underlying WKWebView - /// the call has no effect on the actual volume of the device - /// - Parameter volume: The volume - func set( - volume: Int - ) - -} - -// MARK: - YouTubePlayerPlaybackRateAPI - -/// The YouTubePlayerPlaybackRateAPI -/// Setting the playback rate -/// - Read more: https://developers.google.com/youtube/iframe_api_reference#Playback_rate -public protocol YouTubePlayerPlaybackRateAPI: AnyObject { - - /// This function retrieves the playback rate of the currently playing video - /// - Parameter completion: The completion closure - func getPlaybackRate( - completion: @escaping (Result) -> Void - ) - - /// This function sets the suggested playback rate for the current video - /// - Parameter playbackRate: The playback rate - func set( - playbackRate: YouTubePlayer.PlaybackRate - ) - - /// Retrieves the set of playback rates in which the current video is available - /// - Parameter completion: The completion closure - func getAvailablePlaybackRates( - completion: @escaping (Result<[YouTubePlayer.PlaybackRate], YouTubePlayerAPIError>) -> Void - ) - -} - -// MARK: - YouTubePlayerPlaybackAPI - -/// The YouTubePlayerPlaybackAPI -/// Playback status -/// - Read more: https://developers.google.com/youtube/iframe_api_reference#Playback_status -public protocol YouTubePlayerPlaybackAPI: AnyObject { - - /// Retrieve a number between 0 and 1 that specifies the percentage of the video that the player shows as buffered - /// - Parameter completion: The completion closure - func getVideoLoadedFraction( - completion: @escaping (Result) -> Void - ) - - /// Retrieve the PlaybackState of the player video - /// - Parameter completion: The completion closure - func getPlaybackState( - completion: @escaping (Result) -> Void - ) - - /// Retrieve the elapsed time in seconds since the video started playing - /// - Parameter completion: The completion closure - func getCurrentTime( - completion: @escaping (Result) -> Void - ) - - /// Retrieve the current PlaybackMetadata - /// - Parameter completion: The completion closure - func getPlaybackMetadata( - completion: @escaping (Result) -> Void - ) - -} - -// MARK: - YouTubePlayerVideoInformationAPI - -/// The YouTubePlayerVideoInformationAPI -/// Retrieving video information -/// - Read more: https://developers.google.com/youtube/iframe_api_reference#Retrieving_video_information -public protocol YouTubePlayerVideoInformationAPI: AnyObject { - - /// Show Stats for Nerds which displays additional video information - func showStatsForNerds() - - /// Hide Stats for Nerds - func hideStatsForNerds() - - /// Retrieve the YouTubePlayer Information - /// - Parameter completion: The completion closure - func getInformation( - completion: @escaping (Result) -> Void - ) - - /// Retrieve the duration in seconds of the currently playing video - /// - Parameter completion: The completion closure - func getDuration( - completion: @escaping (Result) -> Void - ) - - /// Retrieve the YouTube.com URL for the currently loaded/playing video - /// - Parameter completion: The completion closure - func getVideoURL( - completion: @escaping (Result) -> Void - ) - - /// Retrieve the embed code for the currently loaded/playing video - /// - Parameter completion: The completion closure - func getVideoEmbedCode( - completion: @escaping (Result) -> Void - ) - -} diff --git a/Projects/Features/PlayerFeature/YoutubePlayerKit/API/YouTubePlayerAPIError.swift b/Projects/Features/PlayerFeature/YoutubePlayerKit/API/YouTubePlayerAPIError.swift deleted file mode 100644 index 12247402b..000000000 --- a/Projects/Features/PlayerFeature/YoutubePlayerKit/API/YouTubePlayerAPIError.swift +++ /dev/null @@ -1,42 +0,0 @@ -import Foundation - -// MARK: - YouTubePlayerAPIError - -/// A YouTubePlayerAPI Error -public struct YouTubePlayerAPIError: Error { - - // MARK: Properties - - /// The JavaScript that has been executed and caused the Error - public let javaScript: String - - /// The optional JavaScript response object - public let javaScriptResponse: Any? - - /// The optional underlying Error - public let underlyingError: Error? - - /// The optional error reason message - public let reason: String? - - // MARK: Initializer - - /// Creates a new instance of `YouTubePlayerAPIError` - /// - Parameters: - /// - javaScript: The JavaScript that has been executed and caused the Error - /// - javaScriptResponse: The optional JavaScript response object. Default value `nil` - /// - underlyingError: The optional underlying Error. Default value `nil` - /// - reason: The optional error reason message. Default value `nil` - public init( - javaScript: String, - javaScriptResponse: Any? = nil, - underlyingError: Error? = nil, - reason: String? = nil - ) { - self.javaScript = javaScript - self.javaScriptResponse = javaScriptResponse - self.underlyingError = underlyingError - self.reason = reason - } - -} diff --git a/Projects/Features/PlayerFeature/YoutubePlayerKit/Configuration/YouTubePlayer+Configuration+ListType.swift b/Projects/Features/PlayerFeature/YoutubePlayerKit/Configuration/YouTubePlayer+Configuration+ListType.swift deleted file mode 100644 index a9310b305..000000000 --- a/Projects/Features/PlayerFeature/YoutubePlayerKit/Configuration/YouTubePlayer+Configuration+ListType.swift +++ /dev/null @@ -1,15 +0,0 @@ -import Foundation - -// MARK: - YouTubePlayer+Configuration+ListType - -extension YouTubePlayer.Configuration { - - /// The YouTubePlayer Configuration ListType - enum ListType: String, Codable, Hashable, CaseIterable { - /// Playlist - case playlist - /// User uploads / channel - case userUploads = "user_uploads" - } - -} diff --git a/Projects/Features/PlayerFeature/YoutubePlayerKit/Configuration/YouTubePlayer+Configuration+OpenURLAction.swift b/Projects/Features/PlayerFeature/YoutubePlayerKit/Configuration/YouTubePlayer+Configuration+OpenURLAction.swift deleted file mode 100644 index 694d9a554..000000000 --- a/Projects/Features/PlayerFeature/YoutubePlayerKit/Configuration/YouTubePlayer+Configuration+OpenURLAction.swift +++ /dev/null @@ -1,108 +0,0 @@ -#if os(macOS) -import AppKit -#else -import UIKit -#endif - -// MARK: - YouTubePlayer+Configuration+OpenURLAction - -public extension YouTubePlayer.Configuration { - - /// A YouTubePlayer Configuration OpenURLAction - struct OpenURLAction { - - // MARK: Typealias - - /// An OpenURLAction Handler typealias representing a closure - /// which takes in a URL which should be opened - public typealias Handler = (URL) -> Void - - // MARK: Properties - - /// The Handler - private let handler: Handler - - // MARK: Initializer - - /// Creates a new instance of `YouTubePlayer.Configuration.OpenURLAction` - /// - Parameter handler: The handler closure which takes in a URL which should be opened - public init( - handler: @escaping Handler - ) { - self.handler = handler - } - - } - -} - -// MARK: - Call as Function - -public extension YouTubePlayer.Configuration.OpenURLAction { - - /// Call OpenURLAction as function - /// - Parameter url: The URL which should be opened - func callAsFunction( - _ url: URL - ) { - self.handler(url) - } - -} - -// MARK: - Equatable - -extension YouTubePlayer.Configuration.OpenURLAction: Equatable { - - /// Returns a Boolean value indicating whether two `YouTubePlayer.State` are equal - /// - Parameters: - /// - lhs: A value to compare. - /// - rhs: Another value to compare. - public static func == ( - lhs: Self, - rhs: Self - ) -> Bool { - true - } - -} - -// MARK: - Hashable - -extension YouTubePlayer.Configuration.OpenURLAction: Hashable { - - /// Hashes the essential components of this value by feeding them into the given hasher. - /// - Parameter hasher: The hasher to use when combining the components of this instance. - public func hash( - into hasher: inout Hasher - ) {} - -} - -// MARK: - Default - -public extension YouTubePlayer.Configuration.OpenURLAction { - - /// The default OpenURLAction - static let `default` = Self { url in - #if os(macOS) - NSWorkspace - .shared - .open( - [url], - withAppBundleIdentifier: "com.apple.Safari", - options: .init(), - additionalEventParamDescriptor: nil, - launchIdentifiers: nil - ) - #else - UIApplication - .shared - .open( - url, - options: .init() - ) - #endif - } - -} diff --git a/Projects/Features/PlayerFeature/YoutubePlayerKit/Configuration/YouTubePlayer+Configuration+ProgressBarColor.swift b/Projects/Features/PlayerFeature/YoutubePlayerKit/Configuration/YouTubePlayer+Configuration+ProgressBarColor.swift deleted file mode 100644 index a458e1661..000000000 --- a/Projects/Features/PlayerFeature/YoutubePlayerKit/Configuration/YouTubePlayer+Configuration+ProgressBarColor.swift +++ /dev/null @@ -1,15 +0,0 @@ -import Foundation - -// MARK: - YouTubePlayer+Configuration+ProgressBarColor - -public extension YouTubePlayer.Configuration { - - /// The YouTubePlayer Configuration ProgressBar Color - enum ProgressBarColor: String, Codable, Hashable, CaseIterable { - /// YouTube red color - case red - /// White color - case white - } - -} diff --git a/Projects/Features/PlayerFeature/YoutubePlayerKit/Configuration/YouTubePlayer+Configuration.swift b/Projects/Features/PlayerFeature/YoutubePlayerKit/Configuration/YouTubePlayer+Configuration.swift deleted file mode 100644 index 42e2ad229..000000000 --- a/Projects/Features/PlayerFeature/YoutubePlayerKit/Configuration/YouTubePlayer+Configuration.swift +++ /dev/null @@ -1,234 +0,0 @@ -import Foundation - -// MARK: - YouTubePlayer+Configuration - -public extension YouTubePlayer { - - /// A YouTube Player Configuration - /// - Read more: https://developers.google.com/youtube/player_parameters - struct Configuration: Hashable { - - // MARK: Properties - - /// A Boolean value indicating if safe area insets should be added automatically to content insets - /// - Note: This property is excluded from encoding - public var automaticallyAdjustsContentInsets: Bool? - - /// A Boolean value that indicates whether HTML5 videos can play Picture in Picture. - /// - Note: This property is excluded from encoding - public var allowsPictureInPictureMediaPlayback: Bool? - - /// The OpenURLAction - /// - Note: This property is excluded from encoding - public var openURLAction: OpenURLAction - - /// This parameter specifies whether the initial video - /// will automatically start to play when the player loads - public var autoPlay: Bool? - - /// This parameter specifies the default language that the player - /// will use to display captions. Set the parameter's value - /// to an ISO 639-1 two-letter language code. - public var captionLanguage: String? - - /// Setting the parameter's value to true causes closed - /// captions to be shown by default, even if the user has turned captions off - public var showCaptions: Bool? - - /// This parameter specifies the color that will be used in - /// the player's video progress bar to highlight the amount - /// of the video that the viewer has already see - /// - Note: Setting the color parameter to white will disable the modestbranding option. - public var progressBarColor: ProgressBarColor? - - /// This parameter indicates whether the video player controls are displayed - public var showControls: Bool? - - /// Setting the parameter's value to true causes - /// the player to not respond to keyboard controls - public var keyboardControlsDisabled: Bool? - - /// Setting the parameter's value to true enables - /// the player to be controlled via IFrame Player API calls - public var enableJavaScriptAPI: Bool? - - /// This parameter specifies the time, measured in seconds - /// from the start of the video, when the player should stop playing the video - public var endTime: Int? - - /// Setting this parameter to false prevents - /// the fullscreen button from displaying in the player - public var showFullscreenButton: Bool? - - /// Sets the player's interface language. - /// The parameter value is an ISO 639-1 two-letter language code or a fully specified locale - public var language: String? - - /// Setting the parameter's value to false causes video annotations to not be shown - public var showAnnotations: Bool? - - /// In the case of a single video player, a true value causes - /// the player to play the initial video again and again. - /// In the case of a playlist player (or custom player), - /// the player plays the entire playlist and then starts again at the first video. - public var loopEnabled: Bool? - - /// This parameter lets you use a YouTube player that does not show a YouTube logo. - /// Set the parameter value to true to prevent the YouTube logo from displaying in the control bar. - public var useModestBranding: Bool? - - /// This parameter controls whether videos play inline or fullscreen on iOS - public var playInline: Bool? - - /// If the rel parameter is set to false, related videos - /// will come from the same channel as the video that was just played. - public var showRelatedVideos: Bool? - - /// This parameter causes the player to begin playing - /// the video at the given number of seconds from the start of the video - public var startTime: Int? - - /// This parameter identifies the URL where the player is embedded. - /// This value is used in YouTube Analytics reporting when the YouTube player is embedded - public var referrer: String? - - /// An optional custom user agent of the underlying web view - public var customUserAgent: String? - - // MARK: Initializer - - /// Creates a new instance of `YouTubePlayer.Configuration` - public init( - automaticallyAdjustsContentInsets: Bool? = nil, - allowsPictureInPictureMediaPlayback: Bool? = nil, - openURLAction: OpenURLAction = .default, - autoPlay: Bool? = nil, - captionLanguage: String? = nil, - showCaptions: Bool? = nil, - progressBarColor: ProgressBarColor? = nil, - showControls: Bool? = nil, - keyboardControlsDisabled: Bool? = nil, - enableJavaScriptAPI: Bool? = nil, - endTime: Int? = nil, - showFullscreenButton: Bool? = nil, - language: String? = nil, - showAnnotations: Bool? = nil, - loopEnabled: Bool? = nil, - useModestBranding: Bool? = nil, - playInline: Bool? = nil, - showRelatedVideos: Bool? = nil, - startTime: Int? = nil, - referrer: String? = nil, - customUserAgent: String? = nil - ) { - self.automaticallyAdjustsContentInsets = automaticallyAdjustsContentInsets - self.allowsPictureInPictureMediaPlayback = allowsPictureInPictureMediaPlayback - self.openURLAction = openURLAction - self.autoPlay = autoPlay - self.captionLanguage = captionLanguage - self.showCaptions = showCaptions - self.progressBarColor = progressBarColor - self.showControls = showControls - self.keyboardControlsDisabled = keyboardControlsDisabled - self.enableJavaScriptAPI = enableJavaScriptAPI - self.endTime = endTime - self.showFullscreenButton = showFullscreenButton - self.language = language - self.showAnnotations = showAnnotations - self.loopEnabled = loopEnabled - self.useModestBranding = useModestBranding - self.playInline = playInline - self.showRelatedVideos = showRelatedVideos - self.startTime = startTime - self.referrer = referrer - self.customUserAgent = customUserAgent - } - - } - -} - -// MARK: - Configuration+init(configure:) - -public extension YouTubePlayer.Configuration { - - /// Creates a new instance of `YouTubePlayer.Configuration` - /// - Parameter configure: The configure closure - init( - configure: (inout Self) -> Void - ) { - // Initialize mutable YouTubePlayer Configuration - var playerConfiguration = Self() - // Configure Configuration - configure(&playerConfiguration) - // Initialize - self = playerConfiguration - } - -} - -// MARK: - Encodable - -extension YouTubePlayer.Configuration: Encodable { - - /// The CodingKeys - enum CodingKeys: String, CodingKey { - case autoPlay = "autoplay" - case captionLanguage = "cc_lang_pref" - case showCaptions = "cc_load_policy" - case progressBarColor = "color" - case showControls = "controls" - case keyboardControlsDisabled = "disablekb" - case enableJavaScriptAPI = "enablejsapi" - case endTime = "end" - case showFullscreenButton = "fs" - case language = "hl" - case showAnnotations = "iv_load_policy" - case list - case listType - case loopEnabled = "loop" - case useModestBranding = "modestbranding" - case origin - case playInline = "playsinline" - case showRelatedVideos = "rel" - case startTime = "start" - case referrer = "widget_referrer" - } - - /// Encode to Encoder - /// - Parameter encoder: The Encoder - public func encode( - to encoder: Encoder - ) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encodeIfPresent(self.autoPlay?.bit, forKey: .autoPlay) - try container.encodeIfPresent(self.captionLanguage, forKey: .captionLanguage) - try container.encodeIfPresent(self.showCaptions?.bit, forKey: .showCaptions) - try container.encodeIfPresent(self.progressBarColor, forKey: .progressBarColor) - try container.encodeIfPresent(self.showControls?.bit, forKey: .showControls) - try container.encodeIfPresent(self.keyboardControlsDisabled?.bit, forKey: .keyboardControlsDisabled) - try container.encodeIfPresent(self.enableJavaScriptAPI?.bit, forKey: .enableJavaScriptAPI) - try container.encodeIfPresent(self.endTime, forKey: .endTime) - try container.encodeIfPresent(self.showFullscreenButton?.bit, forKey: .showFullscreenButton) - try container.encodeIfPresent(self.language, forKey: .language) - try container.encodeIfPresent(self.showAnnotations.flatMap { $0 ? 1 : 3 }, forKey: .showAnnotations) - try container.encodeIfPresent(self.loopEnabled?.bit, forKey: .loopEnabled) - try container.encodeIfPresent(self.useModestBranding?.bit, forKey: .useModestBranding) - try container.encodeIfPresent(self.playInline?.bit, forKey: .playInline) - try container.encodeIfPresent(self.showRelatedVideos?.bit, forKey: .showRelatedVideos) - try container.encodeIfPresent(self.startTime, forKey: .startTime) - try container.encodeIfPresent(self.referrer, forKey: .referrer) - } - -} - -// MARK: - Bool+bit - -private extension Bool { - - /// The Binary Digit (bit) representation of this Bool value - var bit: Int { - self ? 1 : 0 - } - -} diff --git a/Projects/Features/PlayerFeature/YoutubePlayerKit/Extensions/Dictionary+json.swift b/Projects/Features/PlayerFeature/YoutubePlayerKit/Extensions/Dictionary+json.swift deleted file mode 100644 index 03af93403..000000000 --- a/Projects/Features/PlayerFeature/YoutubePlayerKit/Extensions/Dictionary+json.swift +++ /dev/null @@ -1,38 +0,0 @@ -import Foundation - -// MARK: - Dictionary+jsonData - -extension Dictionary { - - /// Make JSON String - /// - Parameter options: The JSONSerialization WritingOptions. Default value `.init()` - func jsonData( - options: JSONSerialization.WritingOptions = .init() - ) throws -> Data { - try JSONSerialization.data( - withJSONObject: self, - options: options - ) - } - -} - -// MARK: - Dictionary+jsonString - -extension Dictionary { - - /// Make JSON String - /// - Parameter options: The JSONSerialization WritingOptions. Default value `.init()` - func jsonString( - options: JSONSerialization.WritingOptions = .init() - ) throws -> String { - .init( - decoding: try JSONSerialization.data( - withJSONObject: self, - options: options - ), - as: UTF8.self - ) - } - -} diff --git a/Projects/Features/PlayerFeature/YoutubePlayerKit/Extensions/Encodable+json.swift b/Projects/Features/PlayerFeature/YoutubePlayerKit/Extensions/Encodable+json.swift deleted file mode 100644 index ceae66b87..000000000 --- a/Projects/Features/PlayerFeature/YoutubePlayerKit/Extensions/Encodable+json.swift +++ /dev/null @@ -1,55 +0,0 @@ -import Foundation - -// MARK: - Encodable+json - -extension Encodable { - - /// Make JSON Dictionary - /// - Parameter encoder: The JSONEncoder. Default value `.init()` - func json( - encoder: JSONEncoder = .init() - ) throws -> [String: Any] { - // Set without escaping slashes output formatting - encoder.outputFormatting = .withoutEscapingSlashes - // Encode - let jsonData = try encoder.encode(self) - // Serialize to JSON object - let jsonObject = try JSONSerialization.jsonObject( - with: jsonData, - options: .allowFragments - ) - // Verify JSON object can be casted to a Dictionary - guard let jsonDictionary = jsonObject as? [String: Any] else { - // Otherwise throw Error - throw DecodingError.typeMismatch( - [String: Any].self, - .init( - codingPath: .init(), - debugDescription: "Malformed JSON object" - ) - ) - } - // Return JSON Dictionary - return jsonDictionary - } - -} - -// MARK: - Encodable+jsonString - -extension Encodable { - - /// Make JSON String - /// - Parameters: - /// - encoder: The JSONEncoder. Default value `.init()` - /// - options: The JSONSerialization WritingOptions. Default value `.init()` - func jsonString( - encoder: JSONEncoder = .init(), - options: JSONSerialization.WritingOptions = .init() - ) throws -> String { - try self - .json(encoder: encoder) - .jsonString(options: options) - } - -} diff --git a/Projects/Features/PlayerFeature/YoutubePlayerKit/HTML/YouTubePlayer+HTML+PlayerVariableName.swift b/Projects/Features/PlayerFeature/YoutubePlayerKit/HTML/YouTubePlayer+HTML+PlayerVariableName.swift deleted file mode 100644 index d1a03726d..000000000 --- a/Projects/Features/PlayerFeature/YoutubePlayerKit/HTML/YouTubePlayer+HTML+PlayerVariableName.swift +++ /dev/null @@ -1,10 +0,0 @@ -import Foundation - -// MARK: - YouTubePlayer+HTML+playerVariableName - -extension YouTubePlayer.HTML { - - /// The YouTubePlayer variable name. - static let playerVariableName = "player" - -} diff --git a/Projects/Features/PlayerFeature/YoutubePlayerKit/HTML/YouTubePlayer+HTML+Resource.swift b/Projects/Features/PlayerFeature/YoutubePlayerKit/HTML/YouTubePlayer+HTML+Resource.swift deleted file mode 100644 index 32ee1fb57..000000000 --- a/Projects/Features/PlayerFeature/YoutubePlayerKit/HTML/YouTubePlayer+HTML+Resource.swift +++ /dev/null @@ -1,30 +0,0 @@ -import Foundation - -// MARK: - YouTubePlayer+HTML+Resource - -extension YouTubePlayer.HTML { - - /// A YouTubePlayer HTML Resource - struct Resource: Codable, Hashable { - - /// The file name - let fileName: String - - /// The file extension - let fileExtension: String - - } - -} - -// MARK: - Resource+default - -extension YouTubePlayer.HTML.Resource { - - /// The default Resource - static let `default` = Self( - fileName: "YouTubePlayer", - fileExtension: "html" - ) - -} diff --git a/Projects/Features/PlayerFeature/YoutubePlayerKit/HTML/YouTubePlayer+HTML+UnavailableResourceError.swift b/Projects/Features/PlayerFeature/YoutubePlayerKit/HTML/YouTubePlayer+HTML+UnavailableResourceError.swift deleted file mode 100644 index eb8dc5f53..000000000 --- a/Projects/Features/PlayerFeature/YoutubePlayerKit/HTML/YouTubePlayer+HTML+UnavailableResourceError.swift +++ /dev/null @@ -1,15 +0,0 @@ -import Foundation - -// MARK: - YouTubePlayer+HTML+UnavailableResourceError - -extension YouTubePlayer.HTML { - - /// An unavailable Resource Error - struct UnavailableResourceError: Swift.Error, Codable, Hashable { - - /// The Resource that is unavailable - let resource: Resource - - } - -} diff --git a/Projects/Features/PlayerFeature/YoutubePlayerKit/HTML/YouTubePlayer+HTML.swift b/Projects/Features/PlayerFeature/YoutubePlayerKit/HTML/YouTubePlayer+HTML.swift deleted file mode 100644 index cb51877b0..000000000 --- a/Projects/Features/PlayerFeature/YoutubePlayerKit/HTML/YouTubePlayer+HTML.swift +++ /dev/null @@ -1,56 +0,0 @@ -import Foundation - -// MARK: - YouTubePlayer+HTML - -extension YouTubePlayer { - - /// The YouTubePlayer HTML - struct HTML: Hashable { - - /// The HTML contents - let contents: String - - } - -} - -// MARK: - HTML+init - -extension YouTubePlayer.HTML { - - /// Creates a new instance of `YouTubePlayer.HTML` or throws an error - /// - Parameters: - /// - options: The YouTubePlayer Options - /// - bundle: The Bundle. Default value `.module` - /// - resource: The Resource. Default value `.default` - init( - options: YouTubePlayer.Options, - bundle: Bundle = .module, - resource: Resource = .default - ) throws { - // Verify URL for Resource is available - guard let resourceURL = bundle.url( - forResource: resource.fileName, - withExtension: resource.fileExtension - ) else { - // Otherwise throw an UnavailableResourceError - throw UnavailableResourceError( - resource: resource - ) - } - // Retrieve the HTML contents from the resource url - var htmlContents = try String( - contentsOf: resourceURL, - encoding: .utf8 - ) - // Format HTML contents string - // with YouTubePlayer Options JSON - htmlContents = .init( - format: htmlContents, - options.json - ) - // Initialize HTML contents - self.contents = htmlContents - } - -} diff --git a/Projects/Features/PlayerFeature/YoutubePlayerKit/HostingView/YouTubePlayerHostingView.swift b/Projects/Features/PlayerFeature/YoutubePlayerKit/HostingView/YouTubePlayerHostingView.swift deleted file mode 100644 index 3b0da1e66..000000000 --- a/Projects/Features/PlayerFeature/YoutubePlayerKit/HostingView/YouTubePlayerHostingView.swift +++ /dev/null @@ -1,68 +0,0 @@ -#if os(macOS) -import AppKit -#else -import UIKit -#endif - -// MARK: - YouTubePlayerHostingBaseView - -#if os(macOS) -/// The YouTubePlayerHostingBase NSView -public class YouTubePlayerHostingBaseView: NSView {} -#else -/// The YouTubePlayerHostingBase UIView -public class YouTubePlayerHostingBaseView: UIView {} -#endif - -// MARK: - YouTubePlayerHostingView - -/// The YouTubePlayer HostingView -public final class YouTubePlayerHostingView: YouTubePlayerHostingBaseView { - - // MARK: Properties - - /// The YouTubePlayer - public let player: YouTubePlayer - - // MARK: Initializer - - /// Creates a new instance of `YouTubePlayerHostView` - /// - Parameters: - /// - player: The YouTubePlayer - public init( - player: YouTubePlayer - ) { - self.player = player - super.init(frame: .zero) - self.addSubview(self.player.webView) - } - - /// Creates a new instance of `YouTubePlayerHostView` - /// - Parameters: - /// - source: The optional YouTubePlayer Source. Default value `nil` - /// - configuration: The YouTubePlayer Configuration. Default value `.init()` - public convenience init( - source: YouTubePlayer.Source? = nil, - configuration: YouTubePlayer.Configuration = .init() - ) { - self.init( - player: .init( - source: source, - configuration: configuration - ) - ) - } - - /// Initializer with NSCoder is unavailable. - /// Use `init(player:)` - @available(*, unavailable) - public required init?( - coder aDecoder: NSCoder - ) { nil } - - /// Deinit - deinit { - self.player.pause() - } - -} diff --git a/Projects/Features/PlayerFeature/YoutubePlayerKit/JavaScriptEvent/YouTubePlayer+JavaScriptEvent+Handler.swift b/Projects/Features/PlayerFeature/YoutubePlayerKit/JavaScriptEvent/YouTubePlayer+JavaScriptEvent+Handler.swift deleted file mode 100644 index 650756729..000000000 --- a/Projects/Features/PlayerFeature/YoutubePlayerKit/JavaScriptEvent/YouTubePlayer+JavaScriptEvent+Handler.swift +++ /dev/null @@ -1,10 +0,0 @@ -import Foundation - -// MARK: - YouTubePlayer+JavaScriptEvent+Handler - -extension YouTubePlayer.JavaScriptEvent { - - /// A YouTubePlayer JavaScriptEvent Handler closure which takes in a YouTubePlayer JavaScriptEvent - typealias Handler = (YouTubePlayer.JavaScriptEvent) -> Void - -} diff --git a/Projects/Features/PlayerFeature/YoutubePlayerKit/JavaScriptEvent/YouTubePlayer+JavaScriptEvent+Name.swift b/Projects/Features/PlayerFeature/YoutubePlayerKit/JavaScriptEvent/YouTubePlayer+JavaScriptEvent+Name.swift deleted file mode 100644 index 4d0c56a9f..000000000 --- a/Projects/Features/PlayerFeature/YoutubePlayerKit/JavaScriptEvent/YouTubePlayer+JavaScriptEvent+Name.swift +++ /dev/null @@ -1,25 +0,0 @@ -import Foundation - -// MARK: - YouTubePlayer.JavaScriptEvent+Name - -extension YouTubePlayer.JavaScriptEvent { - - /// The YouTubePlayer JavaScriptEvent Name - enum Name: String, Codable, Hashable, CaseIterable { - /// iFrame API is ready - case onIframeAPIReady - /// iFrame API failed to load - case onIframeAPIFailedToLoad - /// Ready - case onReady - /// State change - case onStateChange - /// Playback quality change - case onPlaybackQualityChange - /// Playback rate change - case onPlaybackRateChange - /// Error - case onError - } - -} diff --git a/Projects/Features/PlayerFeature/YoutubePlayerKit/JavaScriptEvent/YouTubePlayer+JavaScriptEvent.swift b/Projects/Features/PlayerFeature/YoutubePlayerKit/JavaScriptEvent/YouTubePlayer+JavaScriptEvent.swift deleted file mode 100644 index f13529c9e..000000000 --- a/Projects/Features/PlayerFeature/YoutubePlayerKit/JavaScriptEvent/YouTubePlayer+JavaScriptEvent.swift +++ /dev/null @@ -1,63 +0,0 @@ -import Foundation - -// MARK: - YouTubePlayer+JavaScriptEvent - -extension YouTubePlayer { - - /// A YouTubePlayer JavaScriptEvent - struct JavaScriptEvent: Codable, Hashable { - - /// The JavaScriptEvent Name - let name: Name - - /// The optional data payload - let data: String? - - } - -} - -// MARK: - JavaScriptEvent+init(url:) - -extension YouTubePlayer.JavaScriptEvent { - - /// The YouTubePlayer JavaScript Event callback URL scheme - private static let eventCallbackURLScheme = "youtubeplayer" - - /// The YouTubePlayer JavaScript Event data parameter name - private static let eventCallbackDataParameterName = "data" - - /// Creates a new instance of `YouTubePlayer.HTML.JavaScriptEvent.Resolved` from an URL, if available - /// - Parameters: - /// - url: The URL - init?(url: URL) { - // Verify scheme matches the JavaScriptEvent callback url scheme - guard url.scheme == Self.eventCallbackURLScheme else { - // Otherwise return nil - return nil - } - // Verify host of URL is available - guard let host = url.host else { - // Otherwise return nil - return nil - } - // Verify JavaScriptEvent Name can be initialized from raw value - guard let name = YouTubePlayer.JavaScriptEvent.Name(rawValue: host) else { - // Otherwise return nil - return nil - } - // Initialize - self.init( - name: name, - data: URLComponents( - url: url, - resolvingAgainstBaseURL: false - )? - .queryItems? - .first { $0.name == Self.eventCallbackDataParameterName }? - .value - .flatMap { $0 == "null" ? nil : $0 } - ) - } - -} diff --git a/Projects/Features/PlayerFeature/YoutubePlayerKit/Models/YouTubePlayer+Error.swift b/Projects/Features/PlayerFeature/YoutubePlayerKit/Models/YouTubePlayer+Error.swift deleted file mode 100644 index 3a5a2a31e..000000000 --- a/Projects/Features/PlayerFeature/YoutubePlayerKit/Models/YouTubePlayer+Error.swift +++ /dev/null @@ -1,59 +0,0 @@ -import Foundation - -// MARK: - YouTubePlayer+Error - -public extension YouTubePlayer { - - /// The YouTubePlayer Error - enum Error: Swift.Error { - /// Player setup failed with Error - case setupFailed(Swift.Error) - /// The web views underlying web content process was terminated - case webContentProcessDidTerminate - /// The YouTube iFrame API JavaScript failed to load - case iFrameAPIFailedToLoad - /// The request contains an invalid parameter value. - /// For example, this error occurs if you specify a video ID that does not have 11 characters, - /// or if the video ID contains invalid characters, such as exclamation points or asterisks. - case invalidSource - /// The requested content cannot be played in an HTML5 player - /// or another error related to the HTML5 player has occurred. - case html5NotSupported - /// The video requested was not found. - /// This error occurs when a video has been removed (for any reason) or has been marked as private. - case notFound - /// The owner of the requested video does not allow it to be played in embedded players. - case embeddedVideoPlayingNotAllowed - } - -} - -// MARK: - Error+init(errorCode:) - -extension YouTubePlayer.Error { - - /// The ErrorCodes Dictionary - private static let errorCodes: [Int: Self] = [ - 2: .invalidSource, - 5: .html5NotSupported, - 100: .notFound, - 101: .embeddedVideoPlayingNotAllowed, - 150: .embeddedVideoPlayingNotAllowed - ] - - /// Creates a new instance of `YouTubePlayer.Error` from a given error code - /// - Parameters: - /// - errorCode: The error code integer value - init?( - errorCode: Int - ) { - // Verify error is available for a given error code - guard let error = Self.errorCodes[errorCode] else { - // Otherwise return nil - return nil - } - // Initialize - self = error - } - -} diff --git a/Projects/Features/PlayerFeature/YoutubePlayerKit/Models/YouTubePlayer+Information.swift b/Projects/Features/PlayerFeature/YoutubePlayerKit/Models/YouTubePlayer+Information.swift deleted file mode 100644 index d762425bc..000000000 --- a/Projects/Features/PlayerFeature/YoutubePlayerKit/Models/YouTubePlayer+Information.swift +++ /dev/null @@ -1,121 +0,0 @@ -import Foundation - -// MARK: - YouTubePlayer+Information - -public extension YouTubePlayer { - - /// The YouTubePlayer Information - struct Information: Codable, Hashable { - - // MARK: Properties - - /// The optional video bytes loaded - public let videoBytesLoaded: Double? - - /// The optional video bytes total - public let videoBytesTotal: Double? - - /// The optional video bytes loaded fraction - public let videoLoadedFraction: Double? - - /// The optional video start bytes - public let videoStartBytes: Double? - - /// The optional playlist - public let playlist: String? - - /// The optional playlist index - public let playlistIndex: Int? - - /// The optional playlist id - public let playlistId: String? - - /// Bool value if is muted - public let muted: Bool - - /// The volume - public let volume: Int - - /// The YouTubePlayer PlaybackState - public let playerState: YouTubePlayer.PlaybackState - - /// The YouTubePlayer PlaybackRate - public let playbackRate: YouTubePlayer.PlaybackRate - - /// The available YouTubePlayer PlaybackRates - public let availablePlaybackRates: [YouTubePlayer.PlaybackRate] - - /// The YouTubePlayer PlaybackQuality - public let playbackQuality: YouTubePlayer.PlaybackQuality - - /// The available YouTubePlayer PlaybackQualities - public let availableQualityLevels: [YouTubePlayer.PlaybackQuality] - - /// The current elapsed time - public let currentTime: Double - - /// The duration - public let duration: Double - - /// The video embed code - public let videoEmbedCode: String - - /// The video url - public let videoUrl: String - - /// The media reference time - public let mediaReferenceTime: Double - - /// The YouTubePlayer PlaybackMetadata - public let videoData: YouTubePlayer.PlaybackMetadata - - // MARK: Initializer - - /// Creates a new instance of `YouTubePlayer.Information` - public init( - videoBytesLoaded: Double?, - videoBytesTotal: Double, - videoLoadedFraction: Double?, - videoStartBytes: Double, - playlist: String?, - playlistIndex: Int?, - playlistId: String?, - muted: Bool, - volume: Int, - playerState: YouTubePlayer.PlaybackState, - playbackRate: YouTubePlayer.PlaybackRate, - availablePlaybackRates: [YouTubePlayer.PlaybackRate], - playbackQuality: YouTubePlayer.PlaybackQuality, - availableQualityLevels: [YouTubePlayer.PlaybackQuality], - currentTime: Double, - duration: Double, - videoEmbedCode: String, - videoUrl: String, - mediaReferenceTime: Double, - videoData: YouTubePlayer.PlaybackMetadata - ) { - self.videoBytesLoaded = videoBytesLoaded - self.videoBytesTotal = videoBytesTotal - self.videoLoadedFraction = videoLoadedFraction - self.videoStartBytes = videoStartBytes - self.playlist = playlist - self.playlistIndex = playlistIndex - self.playlistId = playlistId - self.muted = muted - self.volume = volume - self.playerState = playerState - self.playbackRate = playbackRate - self.availablePlaybackRates = availablePlaybackRates - self.playbackQuality = playbackQuality - self.availableQualityLevels = availableQualityLevels - self.currentTime = currentTime - self.duration = duration - self.videoEmbedCode = videoEmbedCode - self.videoUrl = videoUrl - self.mediaReferenceTime = mediaReferenceTime - self.videoData = videoData - } - - } - -} diff --git a/Projects/Features/PlayerFeature/YoutubePlayerKit/Models/YouTubePlayer+Perspective360Degree.swift b/Projects/Features/PlayerFeature/YoutubePlayerKit/Models/YouTubePlayer+Perspective360Degree.swift deleted file mode 100644 index 9796aeea3..000000000 --- a/Projects/Features/PlayerFeature/YoutubePlayerKit/Models/YouTubePlayer+Perspective360Degree.swift +++ /dev/null @@ -1,49 +0,0 @@ -import Foundation - -// MARK: - YouTubePlayer+Perspective360Degree - -public extension YouTubePlayer { - - /// The 360° YouTube player video playback perspective configuration - struct Perspective360Degree: Codable, Hashable { - - // MARK: Properties - - /// Represents the horizontal angle of the view in degrees, - /// which reflects the extent to which the user turns the view to face further left or right - public let yaw: Int? - - /// Represents the vertical angle of the view in degrees, - /// which reflects the extent to which the user adjusts the view to look up or down - public let pitch: Int? - - /// Represents the clockwise or counterclockwise rotational angle of the view in degrees - public let roll: Int? - - /// Represents the field-of-view of the view in degrees as measured along the longer edge of the viewport - public let fov: Int? - - /// A boolean value that indicates whether the IFrame embed - /// should respond to events that signal changes in a supported device's orientation - public let enableOrientationSensor: Bool? - - // MARK: Initializer - - /// Creates a new instance of `YouTubePlayer.Perspective360Degree` - public init( - yaw: Int? = nil, - pitch: Int? = nil, - roll: Int? = nil, - fov: Int? = nil, - enableOrientationSensor: Bool? = nil - ) { - self.yaw = yaw.flatMap { max(0, min($0, 360)) } - self.pitch = pitch.flatMap { max(-90, min($0, 90)) } - self.roll = roll.flatMap { max(-180, min($0, 180)) } - self.fov = fov.flatMap { max(30, min($0, 120)) } - self.enableOrientationSensor = enableOrientationSensor - } - - } - -} diff --git a/Projects/Features/PlayerFeature/YoutubePlayerKit/Models/YouTubePlayer+PlaybackMetadata.swift b/Projects/Features/PlayerFeature/YoutubePlayerKit/Models/YouTubePlayer+PlaybackMetadata.swift deleted file mode 100644 index 9fd3bd1a5..000000000 --- a/Projects/Features/PlayerFeature/YoutubePlayerKit/Models/YouTubePlayer+PlaybackMetadata.swift +++ /dev/null @@ -1,34 +0,0 @@ -import Foundation - -// MARK: - YouTubePlayer+PlaybackMetadata - -public extension YouTubePlayer { - - /// The YouTubePlayer PlaybackMetadata - struct PlaybackMetadata: Codable, Hashable { - - // MARK: Properties - - /// The title of the playback/video - public let title: String - - /// The optional author/creator of the playback/video - public let author: String? - - // MARK: Initializer - - /// Creates a new instance of `YouTubePlayer.PlaybackMetadata` - /// - Parameters: - /// - title: The title of the playback/video - /// - author: The optional author/creator of the playback/video - public init( - title: String, - author: String? = nil - ) { - self.title = title - self.author = author - } - - } - -} diff --git a/Projects/Features/PlayerFeature/YoutubePlayerKit/Models/YouTubePlayer+PlaybackQuality.swift b/Projects/Features/PlayerFeature/YoutubePlayerKit/Models/YouTubePlayer+PlaybackQuality.swift deleted file mode 100644 index 350826776..000000000 --- a/Projects/Features/PlayerFeature/YoutubePlayerKit/Models/YouTubePlayer+PlaybackQuality.swift +++ /dev/null @@ -1,25 +0,0 @@ -import Foundation - -// MARK: - YouTubePlayer+PlaybackQuality - -public extension YouTubePlayer { - - /// The YouTubePlayer PlaybackQuality - enum PlaybackQuality: String, Codable, Hashable, CaseIterable { - /// Automatic - case auto - /// Small - case small - /// Medium - case medium - /// Large - case large - /// HD720 - case hd720 - /// HD1080 - case hd1080 - /// High resolution - case highResolution = "highres" - } - -} diff --git a/Projects/Features/PlayerFeature/YoutubePlayerKit/Models/YouTubePlayer+PlaybackRate.swift b/Projects/Features/PlayerFeature/YoutubePlayerKit/Models/YouTubePlayer+PlaybackRate.swift deleted file mode 100644 index fb876f299..000000000 --- a/Projects/Features/PlayerFeature/YoutubePlayerKit/Models/YouTubePlayer+PlaybackRate.swift +++ /dev/null @@ -1,10 +0,0 @@ -import Foundation - -// MARK: - YouTubePlayer+PlaybackRate - -public extension YouTubePlayer { - - /// The YouTubePlayer PlaybackRate - typealias PlaybackRate = Double - -} diff --git a/Projects/Features/PlayerFeature/YoutubePlayerKit/Models/YouTubePlayer+PlaybackState.swift b/Projects/Features/PlayerFeature/YoutubePlayerKit/Models/YouTubePlayer+PlaybackState.swift deleted file mode 100644 index ddec01141..000000000 --- a/Projects/Features/PlayerFeature/YoutubePlayerKit/Models/YouTubePlayer+PlaybackState.swift +++ /dev/null @@ -1,23 +0,0 @@ -import Foundation - -// MARK: - YouTubePlayer+PlaybackState - -public extension YouTubePlayer { - - /// The YouTubePlayer PlaybackState - enum PlaybackState: Int, Codable, Hashable, CaseIterable { - /// Unstarted - case unstarted = -1 - /// Ended - case ended = 0 - /// Playing - case playing = 1 - /// Paused - case paused = 2 - /// Buffering - case buffering = 3 - /// Video cued - case cued = 5 - } - -} diff --git a/Projects/Features/PlayerFeature/YoutubePlayerKit/Models/YouTubePlayer+PreferenceKey.swift b/Projects/Features/PlayerFeature/YoutubePlayerKit/Models/YouTubePlayer+PreferenceKey.swift deleted file mode 100644 index fc8aeff4d..000000000 --- a/Projects/Features/PlayerFeature/YoutubePlayerKit/Models/YouTubePlayer+PreferenceKey.swift +++ /dev/null @@ -1,28 +0,0 @@ -import Foundation -import SwiftUI - -// MARK: - YouTubePlayer+PreferenceKey - -public extension YouTubePlayer { - - /// A YouTubePlayer instance produced by a SwiftUI view - struct PreferenceKey: SwiftUI.PreferenceKey { - - /// The default value of the preference. - public static var defaultValue: YouTubePlayer? - - /// Combines a sequence of values by modifying the previously-accumulated - /// value with the result of a closure that provides the next value. - /// - Parameters: - /// - value: The value accumulated through previous calls to this method. - /// - nextValue: A closure that returns the next value in the sequence. - public static func reduce( - value: inout YouTubePlayer?, - nextValue: () -> YouTubePlayer? - ) { - value = nextValue() - } - - } - -} diff --git a/Projects/Features/PlayerFeature/YoutubePlayerKit/Models/YouTubePlayer+Source.swift b/Projects/Features/PlayerFeature/YoutubePlayerKit/Models/YouTubePlayer+Source.swift deleted file mode 100644 index 2d3cbf822..000000000 --- a/Projects/Features/PlayerFeature/YoutubePlayerKit/Models/YouTubePlayer+Source.swift +++ /dev/null @@ -1,150 +0,0 @@ -import Foundation - -// MARK: - YouTubePlayer+Source - -public extension YouTubePlayer { - - /// The YouTubePlayer Source - enum Source: Hashable { - /// Video - case video( - id: String, - startSeconds: Int? = nil, - endSeconds: Int? = nil - ) - /// Playlist - case playlist( - id: String, - index: Int? = nil, - startSeconds: Int? = nil - ) - /// Channel - case channel( - name: String, - index: Int? = nil, - startSeconds: Int? = nil - ) - } - -} - -// MARK: - Identifiable - -extension YouTubePlayer.Source: Identifiable { - - /// The stable identity of the entity associated with this instance - public var id: String { - switch self { - case .video(let id, _, _), - .playlist(let id, _, _), - .channel(let id, _, _): - return id - } - } - -} - -// MARK: - Source+url - -public extension YouTubePlayer.Source { - - /// Creats `YouTubePlayer.Source` from a given URL string, if available - /// - Parameter url: The URL string - static func url( - _ url: String - ) -> Self? { - // Initialize URLComonents from URL string - let urlComponents = URLComponents(string: url) - // Initialize URL from string - let url = URL(string: url) - // Retrieve start seconds from "t" url parameter, if available - let startSeconds = urlComponents?.queryItems?["t"].flatMap(Int.init) - // Initialize PathComponents and drop first which is the leading "/" - let pathComponents = url?.pathComponents.dropFirst() - // Check if URL host has YouTube share url host - if url?.host?.hasSuffix("youtu.be") == true { - // Check if a video id is available - if let videoId = pathComponents?.first { - // Return video source - return .video( - id: videoId, - startSeconds: startSeconds - ) - } - } else { - // Otherwise switch on first path component - switch pathComponents?.first { - case "watch": - // Check if a playlist identifier is available - if let playlistId = urlComponents?.queryItems?["list"] { - // Return playlist source - return .playlist( - id: playlistId - ) - } - // Check if video id is available - if let videoId = urlComponents?.queryItems?["v"] { - // Return video source - return .video( - id: videoId, - startSeconds: startSeconds - ) - } - case "embed": - // Check if a video identifier is available - if let videoId = url?.pathComponents[safe: 2] { - // Return video source - return .video( - id: videoId, - startSeconds: startSeconds - ) - } - case "c", "user": - // Check if a channel name is available - if let channelName = url?.pathComponents[safe: 2] { - // Return channel source - return .channel( - name: channelName - ) - } - case "v": - // Check if a video identifier is available - if let videoId = url?.pathComponents[safe: 2] { - // Return video source - return .video( - id: videoId, - startSeconds: startSeconds - ) - } - default: - break - } - } - // Otherwise return nil - return nil - } - -} - -// MARK: - Sequence+subscribt - -private extension Sequence where Element == URLQueryItem { - - /// Retrieve a URLQueryItem value by a given name, if available - subscript(_ name: String) -> String? { - self.first { $0.name == name }?.value - } - -} - -// MARK: - Collection+Safe - -private extension Collection { - - /// Retrieve an Element at the specified index if it is withing bounds, otherwise return nil. - /// - Parameter index: The Index - subscript(safe index: Index) -> Element? { - self.indices.contains(index) ? self[index] : nil - } - -} diff --git a/Projects/Features/PlayerFeature/YoutubePlayerKit/Models/YouTubePlayer+State.swift b/Projects/Features/PlayerFeature/YoutubePlayerKit/Models/YouTubePlayer+State.swift deleted file mode 100644 index dd42bc3af..000000000 --- a/Projects/Features/PlayerFeature/YoutubePlayerKit/Models/YouTubePlayer+State.swift +++ /dev/null @@ -1,107 +0,0 @@ -import Foundation - -// MARK: - YouTubePlayer+State - -public extension YouTubePlayer { - - /// The YouTubePlayer State - enum State { - /// Idle - case idle - /// Ready - case ready - /// Error - case error(Error) - } - -} - -// MARK: - Equatable - -extension YouTubePlayer.State: Equatable { - - /// Returns a Boolean value indicating whether two `YouTubePlayer.State` are equal - /// - Parameters: - /// - lhs: A `YouTubePlayer.State` to compare. - /// - rhs: Another `YouTubePlayer.State` to compare. - public static func == ( - lhs: Self, - rhs: Self - ) -> Bool { - switch (lhs, rhs) { - case (.idle, idle): - return true - case (.ready, .ready): - return true - case (.error, .error): - return true - default: - return false - } - } - -} - -// MARK: - State+isIdle - -public extension YouTubePlayer.State { - - /// Bool value if is `idle` - var isIdle: Bool { - switch self { - case .idle: - return true - default: - return false - } - } - -} - -// MARK: - State+isReady - -public extension YouTubePlayer.State { - - /// Bool value if is `ready` - var isReady: Bool { - switch self { - case .ready: - return true - default: - return false - } - } - -} - -// MARK: - State+isError - -public extension YouTubePlayer.State { - - /// Bool value if is `error` - var isError: Bool { - switch self { - case .error: - return true - default: - return false - } - } - -} - -// MARK: - State+error - -public extension YouTubePlayer.State { - - /// The YouTubePlayer Error, if available - var error: YouTubePlayer.Error? { - switch self { - case .error(let error): - return error - default: - return nil - } - } - -} diff --git a/Projects/Features/PlayerFeature/YoutubePlayerKit/Options/YouTubePlayer+Options.swift b/Projects/Features/PlayerFeature/YoutubePlayerKit/Options/YouTubePlayer+Options.swift deleted file mode 100644 index 439195dfe..000000000 --- a/Projects/Features/PlayerFeature/YoutubePlayerKit/Options/YouTubePlayer+Options.swift +++ /dev/null @@ -1,114 +0,0 @@ -import Foundation - -// MARK: - YouTubePlayer+Options - -extension YouTubePlayer { - - /// The YouTubePlayer Options - struct Options: Hashable { - - /// The JSON string representation - let json: String - - } - -} - -// MARK: - Options+CodingKeys - -private extension YouTubePlayer.Options { - - /// The CodingKeys - enum CodingKeys: String { - case width - case height - case events - case videoId - case playerVars - } - -} - -// MARK: - Options+init - -extension YouTubePlayer.Options { - - /// Creates a new instance of `YouTubePlayer.Options` - /// - Parameters: - /// - playerSource: The optional YouTubePlayer Source - /// - playerConfiguration: The YouTubePlayer Configuration - /// - originURL: The optional origin URL - /// - Throws: If Options failed to construct - init( - playerSource: YouTubePlayer.Source?, - playerConfiguration: YouTubePlayer.Configuration, - originURL: URL? - ) throws { - // Retrieve Player Configuration as JSON - var playerConfiguration = try playerConfiguration.json() - // Initialize Configuration - var configuration: [String: Any] = [ - CodingKeys.width.rawValue: "100%", - CodingKeys.height.rawValue: "100%", - CodingKeys.events.rawValue: YouTubePlayer - .JavaScriptEvent - .Name - .allCases - .filter { event in - // Exclude onIframeAPIReady and onIframeAPIFailedToLoad - event != .onIframeAPIReady || event != .onIframeAPIFailedToLoad - } - .reduce( - into: [String: String]() - ) { result, event in - result[event.rawValue] = event.rawValue - } - ] - // Switch on Source - switch playerSource { - case .video(let id, let startSeconds, _): - // Set video id - configuration[CodingKeys.videoId.rawValue] = id - // Check if a start seconds are available - if let startSeconds = startSeconds { - // Set start time on player configuration - playerConfiguration[ - YouTubePlayer.Configuration.CodingKeys.startTime.rawValue - ] = startSeconds - } - case .playlist(let id, _, _): - // Set playlist - playerConfiguration[ - YouTubePlayer.Configuration.CodingKeys.listType.rawValue - ] = YouTubePlayer.Configuration.ListType.playlist.rawValue - // Set playlist id - playerConfiguration[ - YouTubePlayer.Configuration.CodingKeys.list.rawValue - ] = id - case .channel(let name, _, _): - // Set user uploads - playerConfiguration[ - YouTubePlayer.Configuration.CodingKeys.listType.rawValue - ] = YouTubePlayer.Configuration.ListType.userUploads.rawValue - // Set channel id - playerConfiguration[ - YouTubePlayer.Configuration.CodingKeys.list.rawValue - ] = name - case nil: - // Simply do nothing - break - } - // Check if an origin URL is available - if let originURL = originURL { - // Set origin URL - playerConfiguration[ - YouTubePlayer.Configuration.CodingKeys.origin.rawValue - ] = originURL.absoluteString - } - // Set Player Configuration - configuration[CodingKeys.playerVars.rawValue] = playerConfiguration - // Make JSON string from Configuration - self.json = try configuration.jsonString() - } - -} diff --git a/Projects/Features/PlayerFeature/YoutubePlayerKit/Resources/YouTubePlayer.html b/Projects/Features/PlayerFeature/YoutubePlayerKit/Resources/YouTubePlayer.html deleted file mode 100644 index 892d142d0..000000000 --- a/Projects/Features/PlayerFeature/YoutubePlayerKit/Resources/YouTubePlayer.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - - - - - -
-
-
- - - - - - - diff --git a/Projects/Features/PlayerFeature/YoutubePlayerKit/View/YouTubePlayerView+Init.swift b/Projects/Features/PlayerFeature/YoutubePlayerKit/View/YouTubePlayerView+Init.swift deleted file mode 100644 index 036d4610f..000000000 --- a/Projects/Features/PlayerFeature/YoutubePlayerKit/View/YouTubePlayerView+Init.swift +++ /dev/null @@ -1,252 +0,0 @@ -import Foundation -import SwiftUI - -// MARK: - Initializer with no Overlay - -public extension YouTubePlayerView where Overlay == EmptyView { - - /// Creates a new instance of `YouTubePlayer.View` - /// - Parameter player: The YouTubePlayer - init( - _ player: YouTubePlayer - ) { - self.init(player) { _ in - EmptyView() - } - } - -} - -// MARK: - Initializer with Placeholder Overlay - -public extension YouTubePlayerView { - - /// Creates a new instance of `YouTubePlayer.View` - /// - Parameters: - /// - player: The YouTube Player - /// - transaction: The transaction to use when the `YouTubePlayer.State` changes. Default value `.init()` - /// - placeholderOverlay: The placeholder overlay which is visible during `idle` and `error` state - init( - _ player: YouTubePlayer, - transaction: Transaction = .init(), - @ViewBuilder - placeholderOverlay: @escaping () -> PlaceholderOverlay - ) where Overlay == _ConditionalContent { - self.init( - player, - transaction: transaction - ) { state in - if state.isReady { - EmptyView() - } else { - placeholderOverlay() - } - } - } - -} - - -// MARK: - Initializer with Idle, Ready and Error Overlay - -public extension YouTubePlayerView { - - /// Creates a new instance of `YouTubePlayer.View` - /// - Parameters: - /// - player: The YouTube Player - /// - transaction: The transaction to use when the `YouTubePlayer.State` changes. Default value `.init()` - /// - idleOverlay: The idle overlay - /// - readyOverlay: The ready overlay - /// - errorOverlay: The error overlay - init( - _ player: YouTubePlayer, - transaction: Transaction = .init(), - @ViewBuilder - idleOverlay: @escaping () -> IdleOverlay, - @ViewBuilder - readyOverlay: @escaping () -> ReadyOverlay, - @ViewBuilder - errorOverlay: @escaping (YouTubePlayer.Error) -> ErrorOverlay - ) where Overlay == _ConditionalContent<_ConditionalContent, ErrorOverlay> { - self.init( - player, - transaction: transaction - ) { state in - switch state { - case .idle: - idleOverlay() - case .ready: - readyOverlay() - case .error(let playerError): - errorOverlay(playerError) - } - } - } - -} - -// MARK: - Initializer with Idle Overlay - -public extension YouTubePlayerView { - - /// Creates a new instance of `YouTubePlayer.View` - /// - Parameters: - /// - player: The YouTube Player - /// - transaction: The transaction to use when the `YouTubePlayer.State` changes. Default value `.init()` - /// - idleOverlay: The idle overlay - init( - _ player: YouTubePlayer, - transaction: Transaction = .init(), - @ViewBuilder - idleOverlay: @escaping () -> IdleOverlay - ) where Overlay == _ConditionalContent<_ConditionalContent, EmptyView> { - self.init( - player, - transaction: transaction - ) { state in - switch state { - case .idle: - idleOverlay() - case .ready: - EmptyView() - case .error: - EmptyView() - } - } - } - -} - -// MARK: - Initializer with Idle and Ready Overlay - -public extension YouTubePlayerView { - - /// Creates a new instance of `YouTubePlayer.View` - /// - Parameters: - /// - player: The YouTube Player - /// - transaction: The transaction to use when the `YouTubePlayer.State` changes. Default value `.init()` - /// - idleOverlay: The idle overlay - /// - readyOverlay: The ready overlay - init( - _ player: YouTubePlayer, - transaction: Transaction = .init(), - @ViewBuilder - idleOverlay: @escaping () -> IdleOverlay, - @ViewBuilder - readyOverlay: @escaping () -> ReadyOverlay - ) where Overlay == _ConditionalContent<_ConditionalContent, EmptyView> { - self.init( - player, - transaction: transaction - ) { state in - switch state { - case .idle: - idleOverlay() - case .ready: - readyOverlay() - case .error: - EmptyView() - } - } - } - -} - -// MARK: - Initializer with Ready Overlay - -public extension YouTubePlayerView { - - /// Creates a new instance of `YouTubePlayer.View` - /// - Parameters: - /// - player: The YouTube Player - /// - transaction: The transaction to use when the `YouTubePlayer.State` changes. Default value `.init()` - /// - readyOverlay: The ready overlay - init( - _ player: YouTubePlayer, - transaction: Transaction = .init(), - @ViewBuilder - readyOverlay: @escaping () -> ReadyOverlay - ) where Overlay == _ConditionalContent<_ConditionalContent, EmptyView> { - self.init( - player, - transaction: transaction - ) { state in - switch state { - case .idle: - EmptyView() - case .ready: - readyOverlay() - case .error: - EmptyView() - } - } - } - -} - -// MARK: - Initializer with Ready and Error Overlay - -public extension YouTubePlayerView { - - /// Creates a new instance of `YouTubePlayer.View` - /// - Parameters: - /// - player: The YouTube Player - /// - transaction: The transaction to use when the `YouTubePlayer.State` changes. Default value `.init()` - /// - readyOverlay: The ready overlay - /// - errorOverlay: The error overlay - init( - _ player: YouTubePlayer, - transaction: Transaction = .init(), - @ViewBuilder - readyOverlay: @escaping () -> ReadyOverlay, - @ViewBuilder - errorOverlay: @escaping (YouTubePlayer.Error) -> ErrorOverlay - ) where Overlay == _ConditionalContent<_ConditionalContent, ErrorOverlay> { - self.init( - player, - transaction: transaction - ) { state in - switch state { - case .idle: - EmptyView() - case .ready: - readyOverlay() - case .error(let playerError): - errorOverlay(playerError) - } - } - } - -} - -// MARK: - Initializer with Error Overlay - -public extension YouTubePlayerView { - - /// Creates a new instance of `YouTubePlayer.View` - /// - Parameters: - /// - player: The YouTube Player - /// - transaction: The transaction to use when the `YouTubePlayer.State` changes. Default value `.init()` - /// - errorOverlay: The error overlay - init( - _ player: YouTubePlayer, - transaction: Transaction = .init(), - @ViewBuilder - errorOverlay: @escaping (YouTubePlayer.Error) -> ErrorOverlay - ) where Overlay == _ConditionalContent<_ConditionalContent, ErrorOverlay> { - self.init( - player, - transaction: transaction - ) { state in - switch state { - case .idle: - EmptyView() - case .ready: - EmptyView() - case .error(let playerError): - errorOverlay(playerError) - } - } - } - -} diff --git a/Projects/Features/PlayerFeature/YoutubePlayerKit/View/YouTubePlayerView.swift b/Projects/Features/PlayerFeature/YoutubePlayerKit/View/YouTubePlayerView.swift deleted file mode 100644 index cb79009b6..000000000 --- a/Projects/Features/PlayerFeature/YoutubePlayerKit/View/YouTubePlayerView.swift +++ /dev/null @@ -1,153 +0,0 @@ -import SwiftUI -import WebKit - -// MARK: - YouTubePlayerView - -/// A YouTubePlayer SwiftUI View -public struct YouTubePlayerView { - - // MARK: Properties - - /// The YouTubePlayer - public let player: YouTubePlayer - - /// The The transaction to use when the `YouTubePlayer.State` changes - public let transaction: Transaction - - /// The Overlay ViewBuilder closure - public let overlay: (YouTubePlayer.State) -> Overlay - - /// The current YouTubePlayer State - @State - private var state: YouTubePlayer.State = .idle - - // MARK: Initializer - - /// Creates a new instance of `YouTubePlayer.View` - /// - Parameters: - /// - player: The YouTubePlayer - /// - transaction: The transaction to use when the `YouTubePlayer.State` changes. Default value `.init()` - /// - overlay: The Overlay ViewBuilder closure - public init( - _ player: YouTubePlayer, - transaction: Transaction = .init(), - @ViewBuilder - overlay: @escaping (YouTubePlayer.State) -> Overlay - ) { - self.player = player - self.transaction = transaction - self.overlay = overlay - } - -} - -// MARK: - View - -extension YouTubePlayerView: View { - - /// The content and behavior of the view - public var body: some View { - YouTubePlayerWebView.Representable( - player: self.player - ) - .overlay( - self.overlay(self.state) - ) - .preference( - key: YouTubePlayer.PreferenceKey.self, - value: self.player - ) - .onReceive( - self.player - .statePublisher - .receive(on: DispatchQueue.main) - ) { state in - withTransaction(self.transaction) { - self.state = state - } - } - } - -} - -// MARK: - YouTubePlayerWebView+Representable - -private extension YouTubePlayerWebView { - - #if !os(macOS) - /// The YouTubePlayer UIView SwiftUI Representable - struct Representable: UIViewRepresentable { - - /// The YouTube Player - let player: YouTubePlayer - - /// Make YouTubePlayerWebView - /// - Parameter context: The Context - /// - Returns: The YouTubePlayerWebView - func makeUIView( - context: Context - ) -> YouTubePlayerWebView { - self.player.webView - } - - /// Update YouTubePlayerWebView - /// - Parameters: - /// - playerWebView: The YouTubePlayerWebView - /// - context: The Context - func updateUIView( - _ playerWebView: YouTubePlayerWebView, - context: Context - ) {} - - /// Dismantle YouTubePlayerWebView - /// - Parameters: - /// - playerWebView: The YouTubePlayerWebView - /// - coordinator: The Coordinaotr - static func dismantleUIView( - _ playerWebView: YouTubePlayerWebView, - coordinator: Void - ) { - playerWebView.player?.pause() - } - - } - #else - /// The YouTubePlayer NSView SwiftUI Representable - struct Representable: NSViewRepresentable { - - /// The YouTube Player - let player: YouTubePlayer - - /// Make YouTubePlayerWebView - /// - Parameter context: The Context - /// - Returns: The YouTubePlayerWebView - func makeNSView( - context: Context - ) -> YouTubePlayerWebView { - self.player.webView - } - - /// Update YouTubePlayerWebView - /// - Parameters: - /// - playerWebView: The YouTubePlayerWebView - /// - context: The Context - func updateNSView( - _ playerWebView: YouTubePlayerWebView, - context: Context - ) {} - - /// Dismantle YouTubePlayerWebView - /// - Parameters: - /// - playerWebView: The YouTubePlayerWebView - /// - coordinator: The Coordinaotr - static func dismantleNSView( - _ playerWebView: YouTubePlayerWebView, - coordinator: Void - ) { - playerWebView.player?.pause() - } - - } - #endif - -} diff --git a/Projects/Features/PlayerFeature/YoutubePlayerKit/ViewController/YouTubePlayerViewController.swift b/Projects/Features/PlayerFeature/YoutubePlayerKit/ViewController/YouTubePlayerViewController.swift deleted file mode 100644 index c33a33f29..000000000 --- a/Projects/Features/PlayerFeature/YoutubePlayerKit/ViewController/YouTubePlayerViewController.swift +++ /dev/null @@ -1,74 +0,0 @@ -#if os(macOS) -import AppKit -#else -import UIKit -#endif - -// MARK: - YouTubePlayerBaseViewController - -#if os(macOS) -/// The YouTubePlayerBase NSViewController -public class YouTubePlayerBaseViewController: NSViewController {} -#else -/// The YouTubePlayerBase UIViewController -public class YouTubePlayerBaseViewController: UIViewController {} -#endif - -// MARK: - YouTubePlayerViewController - -/// The YouTubePlayer ViewController -public final class YouTubePlayerViewController: YouTubePlayerBaseViewController { - - // MARK: Properties - - /// The YouTubePlayer - public let player: YouTubePlayer - - // MARK: Initializer - - /// Creates a new instance of `YouTubePlayerViewController` - /// - Parameters: - /// - player: The YouTubePlayer - public init( - player: YouTubePlayer - ) { - self.player = player - super.init(nibName: nil, bundle: nil) - } - - /// Creates a new instance of `YouTubePlayerViewController` - /// - Parameters: - /// - source: The optional YouTubePlayer Source. Default value `nil` - /// - configuration: The YouTubePlayer Configuration. Default value `.init()` - public convenience init( - source: YouTubePlayer.Source? = nil, - configuration: YouTubePlayer.Configuration = .init() - ) { - self.init( - player: .init( - source: source, - configuration: configuration - ) - ) - } - - /// Initializer with NSCoder is unavailable. - /// Use `init(player:)` - @available(*, unavailable) - public required init?( - coder aDecoder: NSCoder - ) { nil } - - /// Deinit - deinit { - self.player.pause() - } - - // MARK: View-Lifecycle - - /// Creates the view that the controller manages - public override func loadView() { - self.view = self.player.webView - } - -} diff --git a/Projects/Features/PlayerFeature/YoutubePlayerKit/WebView/YouTubePlayerWebView+Evaluate.swift b/Projects/Features/PlayerFeature/YoutubePlayerKit/WebView/YouTubePlayerWebView+Evaluate.swift deleted file mode 100644 index 4850b0d30..000000000 --- a/Projects/Features/PlayerFeature/YoutubePlayerKit/WebView/YouTubePlayerWebView+Evaluate.swift +++ /dev/null @@ -1,344 +0,0 @@ -import Foundation - -// MARK: - YouTubePlayerWebView+JavaScript - -extension YouTubePlayerWebView { - - /// A JavaScript - struct JavaScript: Codable, Hashable { - - // MARK: Properties - - /// The raw value of the JavaScript - let rawValue: String - - // MARK: Initializer - - /// Creates a new instance of `YouTubePlayerWebView.JavaScript` - /// - Parameter rawValue: The JavaScript - init( - _ rawValue: String - ) { - self.rawValue = rawValue.last != ";" ? "\(rawValue);" : rawValue - } - - } - -} - -// MARK: - YouTubePlayerWebView+JavaScript+player - -extension YouTubePlayerWebView.JavaScript { - - /// Bool value if the JavaScript contains a YouTube player usage e.g. function call or property access - var containsPlayerUsage: Bool { - self.rawValue.starts(with: YouTubePlayer.HTML.playerVariableName) - } - - /// Create YouTubePlayer JavaScript - /// - Parameter operator: The operator (function, property) - static func player( - _ operator: String - ) -> Self { - .init("\(YouTubePlayer.HTML.playerVariableName).\(`operator`)") - } - -} - -// MARK: - YouTubePlayerWebView+evaluate - -extension YouTubePlayerWebView { - - /// Evaluates the given JavaScript and converts the JavaScript result - /// by using the supplied `JavaScriptEvaluationResponseConverter` to the given `Response` type - /// - Parameters: - /// - javaScript: The JavaScript that should be evaluated - /// - converter: The JavaScriptEvaluationResponseConverter - /// - completion: The completion closure when the JavaScript has finished executing - func evaluate( - javaScript: JavaScript, - converter: JavaScriptEvaluationResponseConverter, - completion: @escaping (Result) -> Void - ) { - // Initialize evaluate javascript closure - let evaluateJavaScript = { [weak self] in - // Evaluate JavaScript - self?.evaluateJavaScript( - javaScript.rawValue - ) { javaScriptResponse, error in - // Initialize Result - let result: Result = { - // Check if an Error is available - if let error = error { - // Return failure with YouTubePlayerAPIError - return .failure( - .init( - javaScript: javaScript.rawValue, - javaScriptResponse: javaScriptResponse, - underlyingError: error, - reason: (error as NSError) - .userInfo["WKJavaScriptExceptionMessage"] as? String - ) - ) - } else { - // Execute Converter and retrieve Result - return converter( - javaScript, - javaScriptResponse - ) - } - }() - // Invoke completion with Result - completion(result) - } - } - // Initialize execute javascript closure - let executeJavaScript = { - // Check if is main thread - if Thread.isMainThread { - // Evaluate javascript - evaluateJavaScript() - } else { - // Dispatch on main queue - DispatchQueue.main.async { - // Evaluate javascript - evaluateJavaScript() - } - } - } - // Check if JavaScript contains player usage - if javaScript.containsPlayerUsage { - // Switch on player state - switch self.player?.state { - case nil, .idle: - // Subscribe to state publisher - self.player? - .statePublisher - // Only include non idle states - .filter { $0.isIdle == false } - // Receive the first state - .first() - .sink { _ in - // Execute the JavaScript - executeJavaScript() - } - .store(in: &self.cancellables) - case .ready, .error: - // Synchronously execute the JavaScript - executeJavaScript() - } - } else { - // Otherwise synchronously execute the JavaScript - executeJavaScript() - } - } - - /// Evaluates the given JavaScript - /// - Parameter javaScript: The JavaScript that should be evaluated - func evaluate( - javaScript: JavaScript - ) { - // Evaluate JavaScript with `empty` Converter - self.evaluate( - javaScript: javaScript, - converter: .empty, - completion: { _ in } - ) - } - -} - -// MARK: - YouTubePlayerWebView+JavaScriptEvaluationResponseConverter - -extension YouTubePlayerWebView { - - /// A generic JavaScript evaluation response converter - struct JavaScriptEvaluationResponseConverter { - - // MARK: Typealias - - /// The JavaScript Response typealias - typealias JavaScriptResponse = Any? - - /// The Convert closure typealias - typealias Convert = (JavaScript, JavaScriptResponse) -> Result - - // MARK: Properties - - /// The Convert closure - private let convert: Convert - - // MARK: Initializer - - /// Creates a new instance of `JavaScriptEvaluationResponseConverter` - /// - Parameter convert: The Convert closure - init( - convert: @escaping Convert - ) { - self.convert = convert - } - - // MARK: Call-As-Function - - /// Call `JavaScriptEvaluationResponseConverter` as function - /// - Parameters: - /// - javaScript: The JavaScript string - /// - javaScriptResponse: The JavaScriptResponse - /// - Returns: A Result containing the Output or a YouTubePlayerAPIError - func callAsFunction( - _ javaScript: JavaScript, - _ javaScriptResponse: JavaScriptResponse - ) -> Result { - self.convert( - javaScript, - javaScriptResponse - ) - } - - } - -} - -// MARK: - JavaScriptEvaluationResponseConverter+Empty - -extension YouTubePlayerWebView.JavaScriptEvaluationResponseConverter where Output == Void { - - /// An empty JavaScriptEvaluationResponseConverter - static let empty = Self { _, _ in .success(()) } - -} - -// MARK: - JavaScriptEvaluationResponseConverter+typeCast - -extension YouTubePlayerWebView.JavaScriptEvaluationResponseConverter { - - /// Type-Cast the JavaScript Response to a new Output type - /// - Parameters: - /// - newOutputType: The NewOutput Type. Default value `.self` - static func typeCast( - to newOutputType: NewOutput.Type = NewOutput.self - ) -> YouTubePlayerWebView.JavaScriptEvaluationResponseConverter { - .init { javaScript, javaScriptResponse in - // Verify JavaScript response can be casted to NewOutput type - guard let output = javaScriptResponse as? NewOutput else { - // Otherwise return failure - return .failure( - .init( - javaScript: javaScript.rawValue, - javaScriptResponse: javaScriptResponse, - reason: [ - "Type-Cast failed", - "Expected type: \(String(describing: NewOutput.self))", - "But found: \(String(describing: javaScriptResponse))" - ] - .joined(separator: ". ") - ) - ) - } - // Return NewOutput - return .success(output) - } - } - -} - -// MARK: - JavaScriptEvaluationResponseConverter+rawRepresentable - -extension YouTubePlayerWebView.JavaScriptEvaluationResponseConverter { - - /// Convert JavaScript Response to a RawRepresentable type - /// - Parameters: - /// - type: The Representable Type. Default value `.self` - func rawRepresentable( - type: Representable.Type = Representable.self - ) -> YouTubePlayerWebView.JavaScriptEvaluationResponseConverter - where Output == Representable.RawValue { - .init { javaScript, javaScriptResponse in - // Convert current Converter - self(javaScript, javaScriptResponse) - // FlatMap Result - .flatMap { output in - // Verify Representable can be initialized from output value - guard let representable = Representable(rawValue: output) else { - // Otherwise return failure - return .failure( - .init( - javaScript: javaScript.rawValue, - javaScriptResponse: output, - reason: [ - "Unknown", - String(describing: Representable.self), - "RawRepresentable-RawValue:", - "\(output)" - ] - .joined(separator: " ") - ) - ) - } - // Return Representable - return .success(representable) - } - } - } - -} - -// MARK: - JavaScriptEvaluationResponseConverter+decode - -extension YouTubePlayerWebView.JavaScriptEvaluationResponseConverter where Output == [String: Any] { - - /// Convert and Decode JavaScript Response to a Decodable type - /// - Parameters: - /// - type: The Decodable Type. Default value `.self` - /// - decoder: The JSONDecoder. Default value `.init()` - func decode( - as type: D.Type = D.self, - decoder: @autoclosure @escaping () -> JSONDecoder = .init() - ) -> YouTubePlayerWebView.JavaScriptEvaluationResponseConverter { - .init { javaScript, javaScriptResponse in - // Convert current Converter - self(javaScript, javaScriptResponse) - // FlatMap Result - .flatMap { output in - // Declare output Data - let outputData: Data - do { - // Initialize output Data by trying to retrieve JSON Data - outputData = try output.jsonData() - } catch { - // Return failure - return .failure( - .init( - javaScript: javaScript.rawValue, - javaScriptResponse: output, - underlyingError: error, - reason: "Malformed JSON" - ) - ) - } - // Declare Decodable - let decodable: D - do { - // Try to decode output to Decodable type - decodable = try decoder().decode( - D.self, - from: outputData - ) - } catch { - // Return failure - return .failure( - .init( - javaScript: javaScript.rawValue, - javaScriptResponse: output, - underlyingError: error, - reason: "Decoding failed: \(error)" - ) - ) - } - // Return Decodable - return .success(decodable) - } - } - } - -} diff --git a/Projects/Features/PlayerFeature/YoutubePlayerKit/WebView/YouTubePlayerWebView+Event.swift b/Projects/Features/PlayerFeature/YoutubePlayerKit/WebView/YouTubePlayerWebView+Event.swift deleted file mode 100644 index f925d03ed..000000000 --- a/Projects/Features/PlayerFeature/YoutubePlayerKit/WebView/YouTubePlayerWebView+Event.swift +++ /dev/null @@ -1,18 +0,0 @@ -import Foundation - -// MARK: - YouTubePlayerWebView+Event - -extension YouTubePlayerWebView { - - /// A YouTubePlayerWebView Event - enum Event { - /// Received JavaScriptEvent from YouTubePlayer - case receivedJavaScriptEvent(YouTubePlayer.JavaScriptEvent) - /// The frame of the YouTubePlayerWebView changed - case frameChanged(CGRect) - /// Web content process did terminate - case webContentProcessDidTerminate - } - -} - diff --git a/Projects/Features/PlayerFeature/YoutubePlayerKit/WebView/YouTubePlayerWebView+WKNavigationDelegate.swift b/Projects/Features/PlayerFeature/YoutubePlayerKit/WebView/YouTubePlayerWebView+WKNavigationDelegate.swift deleted file mode 100644 index 1d50003d8..000000000 --- a/Projects/Features/PlayerFeature/YoutubePlayerKit/WebView/YouTubePlayerWebView+WKNavigationDelegate.swift +++ /dev/null @@ -1,98 +0,0 @@ -import Foundation -import WebKit - -// MARK: - YouTubePlayerWebView+WKNavigationDelegate - -extension YouTubePlayerWebView: WKNavigationDelegate { - - /// WebView decide policy for NavigationAction - /// - Parameters: - /// - webView: The WKWebView - /// - navigationAction: The WKNavigationAction - /// - decisionHandler: The decision handler - func webView( - _ webView: WKWebView, - decidePolicyFor navigationAction: WKNavigationAction, - decisionHandler: @escaping (WKNavigationActionPolicy) -> Void - ) { - // Verify URL of request is available - guard let url = navigationAction.request.url else { - // Otherwise cancel navigation action - return decisionHandler(.cancel) - } - // Check if a JavaScriptEvent can be initialized from request URL - if let javaScriptEvent = YouTubePlayer.JavaScriptEvent(url: url) { - // Send received JavaScriptEvent - self.eventSubject.send( - .receivedJavaScriptEvent(javaScriptEvent) - ) - // Cancel navigation action - return decisionHandler(.cancel) - } - // Check if Request URL host is equal to origin URL host - if url.host?.lowercased() == self.originURL?.host?.lowercased() { - // Allow navigation action - return decisionHandler(.allow) - } - // Verify URL scheme is http or https - guard url.scheme == "http" || url.scheme == "https" else { - // Otherwise allow navigation action - return decisionHandler(.allow) - } - // For each valid URL RegularExpression - for validURLRegularExpression in Self.validURLRegularExpressions { - // Find first match in URL - let match = validURLRegularExpression.firstMatch( - in: url.absoluteString, - options: .init(), - range: .init( - location: 0, - length: url.absoluteString.count - ) - ) - // Check if a match is available - if match != nil { - // Allow navigation action - return decisionHandler(.allow) - } - } - // Open URL - self.player?.configuration.openURLAction(url) - // Cancel navigation action - decisionHandler(.cancel) - } - - /// Invoked when the web view's web content process is terminated. - /// - Parameter webView: The web view whose underlying web content process was terminated. - func webViewWebContentProcessDidTerminate( - _ webView: WKWebView - ) { - // Send web content process did terminate event - self.eventSubject.send( - .webContentProcessDidTerminate - ) - } - -} - -// MARK: - YouTubePlayerWebView+validURLRegularExpressions - -private extension YouTubePlayerWebView { - - /// The valid URL RegularExpressions - /// Source: https://github.com/youtube/youtube-ios-player-helper/blob/ff5991e6e3188867fe2738aa92913a37127f8f1d/Classes/YTPlayerView.m#L59 - static let validURLRegularExpressions: [NSRegularExpression] = [ - "^http(s)://(www.)youtube.com/embed/(.*)$", - "^http(s)://pubads.g.doubleclick.net/pagead/conversion/", - "^http(s)://accounts.google.com/o/oauth2/(.*)$", - "^https://content.googleapis.com/static/proxy.html(.*)$", - "^https://tpc.googlesyndication.com/sodar/(.*).html$" - ] - .compactMap { pattern in - try? .init( - pattern: pattern, - options: .caseInsensitive - ) - } - -} diff --git a/Projects/Features/PlayerFeature/YoutubePlayerKit/WebView/YouTubePlayerWebView+WKUIDelegate.swift b/Projects/Features/PlayerFeature/YoutubePlayerKit/WebView/YouTubePlayerWebView+WKUIDelegate.swift deleted file mode 100644 index 420d68b41..000000000 --- a/Projects/Features/PlayerFeature/YoutubePlayerKit/WebView/YouTubePlayerWebView+WKUIDelegate.swift +++ /dev/null @@ -1,29 +0,0 @@ -import Foundation -import WebKit - -// MARK: - YouTubePlayerWebView+WKUIDelegate - -extension YouTubePlayerWebView: WKUIDelegate { - - /// WebView create WebView with configuration for navigation action - /// - Parameters: - /// - webView: The WKWebView - /// - configuration: The WKWebViewConfiguration - /// - navigationAction: The WKNavigationAction - /// - windowFeatures: The WKWindowFeatures - func webView( - _ webView: WKWebView, - createWebViewWith configuration: WKWebViewConfiguration, - for navigationAction: WKNavigationAction, - windowFeatures: WKWindowFeatures - ) -> WKWebView? { - // Check if the request url is available - if let url = navigationAction.request.url { - // Open URL - self.player?.configuration.openURLAction(url) - } - // Return nil as the URL has already been handled - return nil - } - -} diff --git a/Projects/Features/PlayerFeature/YoutubePlayerKit/WebView/YouTubePlayerWebView.swift b/Projects/Features/PlayerFeature/YoutubePlayerKit/WebView/YouTubePlayerWebView.swift deleted file mode 100644 index 2e69953f9..000000000 --- a/Projects/Features/PlayerFeature/YoutubePlayerKit/WebView/YouTubePlayerWebView.swift +++ /dev/null @@ -1,199 +0,0 @@ -import Combine -import Foundation -import WebKit - -// MARK: - YouTubePlayerWebView - -/// The YouTubePlayer WebView -final class YouTubePlayerWebView: WKWebView { - - // MARK: Properties - - /// The YouTubePlayer - private(set) weak var player: YouTubePlayer? - - /// The origin URL - private(set) lazy var originURL: URL? = Bundle - .main - .bundleIdentifier - .flatMap { ["https://", $0.lowercased()].joined() } - .flatMap(URL.init) - - /// The YouTubePlayerWebView Event PassthroughSubject - private(set) lazy var eventSubject = PassthroughSubject() - - /// The Layout Lifecycle Subject - private lazy var layoutLifecycleSubject = PassthroughSubject() - - /// The cancellables - var cancellables = Set() - - // MARK: Initializer - - /// Creates a new instance of `YouTubePlayer.WebView` - /// - Parameter player: The YouTubePlayer - init( - player: YouTubePlayer - ) { - // Set player - self.player = player - // Super init - super.init( - frame: .zero, - configuration: { - // Initialize WebView Configuration - let configuration = WKWebViewConfiguration() - #if !os(macOS) - // Allows inline media playback - configuration.allowsInlineMediaPlayback = true - #endif - // No media types requiring user action for playback - configuration.mediaTypesRequiringUserActionForPlayback = [] - // Return configuration - return configuration - }() - ) - // Setup - self.setup() - // Load - self.load(using: player) - } - - /// Initializer with NSCoder is unavailable. - /// Use `init(player:)` - @available(*, unavailable) - required init?( - coder aDecoder: NSCoder - ) { nil } - - // MARK: View-Lifecycle - - #if os(iOS) - /// Layout Subviews - override func layoutSubviews() { - super.layoutSubviews() - // Send frame on Layout Subject - self.layoutLifecycleSubject.send(self.frame) - } - #elseif os(macOS) - /// Perform layout - override func layout() { - super.layout() - // Send frame on Layout Subject - self.layoutLifecycleSubject.send(self.frame) - } - #endif - -} - -// MARK: - Setup - -private extension YouTubePlayerWebView { - - /// Setup YouTubePlayerWebView - func setup() { - // Setup frame observation - self.publisher( - for: \.frame, - options: [.new] - ) - .merge( - with: self.layoutLifecycleSubject - ) - .removeDuplicates() - .sink { [weak self] frame in - // Send frame changed event - self?.eventSubject.send( - .frameChanged(frame) - ) - } - .store(in: &self.cancellables) - // Set navigation delegate - self.navigationDelegate = self - // Set ui delegate - self.uiDelegate = self - #if !os(macOS) - // Set clear background color - self.backgroundColor = .clear - // Disable opaque - self.isOpaque = false - // Set autoresizing masks - self.autoresizingMask = { - #if os(macOS) - return [.width, .height] - #else - return [.flexibleWidth, .flexibleHeight] - #endif - }() - // Disable scrolling - self.scrollView.isScrollEnabled = false - // Disable bounces of ScrollView - self.scrollView.bounces = false - #endif - } - -} - -// MARK: - YouTubePlayerWebView+loadPlayer - -extension YouTubePlayerWebView { - - /// Load the YouTubePlayer to this WKWebView - /// - Returns: A Bool value if the YouTube player has been successfully loaded - @discardableResult - func load( - using player: YouTubePlayer - ) -> Bool { - // Declare YouTubePlayer HTML - let youTubePlayerHTML: YouTubePlayer.HTML - do { - // Try to initialize YouTubePlayer HTML - youTubePlayerHTML = try .init( - options: .init( - playerSource: player.source, - playerConfiguration: player.configuration, - originURL: self.originURL - ) - ) - } catch { - // Send error state - player.playerStateSubject.send( - .error( - .setupFailed(error) - ) - ) - // Return false as setup has failed - return false - } - // Update player - self.player = player - #if !os(macOS) - // Update allows Picture-in-Picture media playback - self.configuration.allowsPictureInPictureMediaPlayback = player - .configuration - .allowsPictureInPictureMediaPlayback ?? true - // Update contentInsetAdjustmentBehavior - self.scrollView.contentInsetAdjustmentBehavior = player - .configuration - .automaticallyAdjustsContentInsets - .flatMap { $0 ? .automatic : .never } - ?? .automatic - #else - // Update automaticallyAdjustsContentInsets - self.enclosingScrollView?.automaticallyAdjustsContentInsets = player - .configuration - .automaticallyAdjustsContentInsets - ?? true - #endif - // Set custom user agent - self.customUserAgent = player.configuration.customUserAgent - // Load HTML string - self.loadHTMLString( - youTubePlayerHTML.contents, - baseURL: self.originURL - ) - // Return success - return true - } - -} diff --git a/Projects/Features/PlayerFeature/YoutubePlayerKit/YouTubePlayer+API.swift b/Projects/Features/PlayerFeature/YoutubePlayerKit/YouTubePlayer+API.swift deleted file mode 100644 index 7a4963b8f..000000000 --- a/Projects/Features/PlayerFeature/YoutubePlayerKit/YouTubePlayer+API.swift +++ /dev/null @@ -1,627 +0,0 @@ -import Combine -import Foundation - -// MARK: - YouTubePlayerConfigurationAPI - -extension YouTubePlayer: YouTubePlayerConfigurationAPI { - - /// Update YouTubePlayer Configuration - /// - Note: Updating the Configuration will result in a reload of the entire YouTubePlayer - /// - Parameter configuration: The YouTubePlayer Configuration - public func update( - configuration: YouTubePlayer.Configuration - ) { - // Stop Player - self.stop() - // Destroy Player - self.webView.evaluate( - javaScript: .player("destroy()"), - converter: .empty - ) { [weak self] _ in - // Update YouTubePlayer Configuration - self?.configuration = configuration - // Check if PlayerState Subject has a current value - if self?.playerStateSubject.value != nil { - // Reset PlayerState Subject current value - self?.playerStateSubject.send(nil) - } - // Check if PlaybackState Subject has a current value - if self?.playbackStateSubject.value != nil { - // Reset PlaybackState Subject current value - self?.playbackStateSubject.send(nil) - } - // Check if PlaybackQuality Subject has a current value - if self?.playbackQualitySubject.value != nil { - // Reset PlaybackQuality Subject current value - self?.playbackQualitySubject.send(nil) - } - // Check if PlaybackRate Subject has a current value - if self?.playbackRateSubject.value != nil { - // Reset PlaybackRate Subject current value - self?.playbackRateSubject.send(nil) - } - // Re-Load Player - self?.webView.load(using: self!) - } - } - -} - -// MARK: - YouTubePlayerQueueingAPI - -extension YouTubePlayer: YouTubePlayerQueueingAPI { - - /// Load YouTubePlayer Source - /// - Parameter source: The YouTubePlayer Source to load - public func load( - source: YouTubePlayer.Source? - ) { - // Verify YouTubePlayer Source is available - guard let source = source else { - // Otherwise return out of function - return - } - // Update Source - self.update( - source: source, - javaScriptFunctionName: { - switch source { - case .video: - return "loadVideoById" - case .playlist, .channel: - return "loadPlaylist" - } - }() - ) - } - - /// Cue YouTubePlayer Source - /// - Parameter source: The YouTubePlayer Source to cue - public func cue( - source: YouTubePlayer.Source? - ) { - // Verify YouTubePlayer Source is available - guard let source = source else { - // Otherwise return out of function - return - } - // Update Source - self.update( - source: source, - javaScriptFunctionName: { - switch source { - case .video: - return "cueVideoById" - case .playlist, .channel: - return "cuePlaylist" - } - }() - ) - } - - /// The LoadVideoById Parameter - private struct LoadVideoByIdParamter: Encodable { - - /// The video identifier - let videoId: String - - /// The optional start seconds - let startSeconds: Int? - - /// The optional end seconds - let endSeconds: Int? - - } - - /// The LoadPlaylist Parameter - private struct LoadPlaylistParameter: Encodable { - - /// The list - let list: String - - /// The ListType - let listType: YouTubePlayer.Configuration.ListType - - /// The optional index - let index: Int? - - /// The optional start seconds - let startSeconds: Int? - - } - - /// Update YouTubePlayer Source with a given JavaScript function name - /// - Parameters: - /// - source: The YouTubePlayer Source - /// - javaScriptFunctionName: The JavaScript function name - private func update( - source: YouTubePlayer.Source, - javaScriptFunctionName: String - ) { - // Update YouTubePlayer Source - self.source = source - // Initialize parameter - let parameter: Encodable = { - switch source { - case .video(let id, let startSeconds, let endSeconds): - return LoadVideoByIdParamter( - videoId: id, - startSeconds: startSeconds, - endSeconds: endSeconds - ) - case .playlist(let id, let index, let startSeconds), - .channel(let id, let index, let startSeconds): - return LoadPlaylistParameter( - list: id, - listType: { - if case .playlist = source { - return .playlist - } else { - return .userUploads - } - }(), - index: index, - startSeconds: startSeconds - ) - } - }() - // Verify parameter can be encoded to a JSON string - guard let parameterJSONString = try? parameter.jsonString() else { - // Otherwise return out of function - return - } - // Evaluate JavaScript - self.webView.evaluate( - javaScript: .player("\(javaScriptFunctionName)(\(parameterJSONString))") - ) - } - -} - -// MARK: - YouTubePlayerEventAPI - -extension YouTubePlayer: YouTubePlayerEventAPI { - - /// The current YouTubePlayer State, if available - public var state: YouTubePlayer.State? { - self.playerStateSubject.value - } - - /// A Publisher that emits the current YouTubePlayer State - public var statePublisher: AnyPublisher { - self.playerStateSubject - .compactMap { $0 } - .removeDuplicates() - .eraseToAnyPublisher() - } - - /// The current YouTubePlayer PlaybackState, if available - public var playbackState: YouTubePlayer.PlaybackState? { - self.playbackStateSubject.value - } - - /// A Publisher that emits the current YouTubePlayer PlaybackState - public var playbackStatePublisher: AnyPublisher { - self.playbackStateSubject - .compactMap { $0 } - .removeDuplicates() - .eraseToAnyPublisher() - } - - /// The current YouTubePlayer PlaybackQuality, if available - public var playbackQuality: YouTubePlayer.PlaybackQuality? { - self.playbackQualitySubject.value - } - - /// A Publisher that emits the current YouTubePlayer PlaybackQuality - public var playbackQualityPublisher: AnyPublisher { - self.playbackQualitySubject - .compactMap { $0 } - .removeDuplicates() - .eraseToAnyPublisher() - } - - /// The current YouTubePlayer PlaybackRate, if available - public var playbackRate: YouTubePlayer.PlaybackRate? { - self.playbackRateSubject.value - } - - /// A Publisher that emits the current YouTubePlayer PlaybackRate - public var playbackRatePublisher: AnyPublisher { - self.playbackRateSubject - .compactMap { $0 } - .removeDuplicates() - .eraseToAnyPublisher() - } - -} - -// MARK: - YouTubePlayerVideoAPI - -extension YouTubePlayer: YouTubePlayerVideoAPI { - - /// Plays the currently cued/loaded video - public func play() { - self.webView.evaluate( - javaScript: .player("playVideo()") - ) - } - - /// Pauses the currently playing video - public func pause() { - self.webView.evaluate( - javaScript: .player("pauseVideo()") - ) - } - - /// Stops and cancels loading of the current video - public func stop() { - self.webView.evaluate( - javaScript: .player("stopVideo()") - ) - } - - /// Seeks to a specified time in the video - /// - Parameters: - /// - seconds: The seconds parameter identifies the time to which the player should advance - /// - allowSeekAhead: Determines whether the player will make a new request to the server - public func seek( - to seconds: Double, - allowSeekAhead: Bool - ) { - self.webView.evaluate( - javaScript: .player("seekTo(\(seconds), \(String(allowSeekAhead)))") - ) - } - -} - -// MARK: - YouTubePlayer360DegreePerspectiveAPI - -extension YouTubePlayer: YouTubePlayer360DegreePerspectiveAPI { - - /// Retrieves properties that describe the viewer's current perspective - /// - Parameter completion: The completion closure - public func get360DegreePerspective( - completion: @escaping (Result) -> Void - ) { - self.webView.evaluate( - javaScript: .player("getSphericalProperties()"), - converter: .typeCast( - to: [String: Any].self - ) - .decode(), - completion: completion - ) - } - - /// Sets the video orientation for playback of a 360° video - /// - Parameter perspective360Degree: The Perspective360Degree - public func set( - perspective360Degree: YouTubePlayer.Perspective360Degree - ) { - // Verify YouTubePlayer Perspective360Degree can be decoded - guard let jsonData = try? JSONEncoder().encode(perspective360Degree) else { - // Otherwise return out of function - return - } - // Initialize JSON string from data - let jsonString = String(decoding: jsonData, as: UTF8.self) - // Evaluate JavaScript - self.webView.evaluate( - javaScript: .player("setSphericalProperties(\(jsonString))") - ) - } - -} - -// MARK: - YouTubePlayerPlaylistAPI - -extension YouTubePlayer: YouTubePlayerPlaylistAPI { - - /// This function loads and plays the next video in the playlist - public func nextVideo() { - self.webView.evaluate( - javaScript: .player("nextVideo()") - ) - } - - /// This function loads and plays the previous video in the playlist - public func previousVideo() { - self.webView.evaluate( - javaScript: .player("previousVideo()") - ) - } - - /// This function loads and plays the specified video in the playlist - /// - Parameter index: The index of the video that you want to play in the playlist - public func playVideo( - at index: Int - ) { - self.webView.evaluate( - javaScript: .player("playVideoAt(\(index))") - ) - } - - /// This function indicates whether the video player should continuously play a playlist - /// or if it should stop playing after the last video in the playlist ends - /// - Parameter enabled: Bool value if is enabled - public func setLoop( - enabled: Bool - ) { - self.webView.evaluate( - javaScript: .player("setLoop(\(String(enabled)))") - ) - } - - /// This function indicates whether a playlist's videos should be shuffled - /// so that they play back in an order different from the one that the playlist creator designated - /// - Parameter enabled: Bool value if is enabled - public func setShuffle( - enabled: Bool - ) { - self.webView.evaluate( - javaScript: .player("setShuffle(\(String(enabled)))") - ) - } - - /// Retrieve an array of the video IDs in the playlist as they are currently ordered - /// - Parameter completion: The completion closure - public func getPlaylist( - completion: @escaping (Result<[String], YouTubePlayerAPIError>) -> Void - ) { - self.webView.evaluate( - javaScript: .player("getPlaylist()"), - converter: .typeCast(), - completion: completion - ) - } - - /// Retrieve the index of the playlist video that is currently playing. - /// - Parameter completion: The completion closure - public func getPlaylistIndex( - completion: @escaping (Result) -> Void - ) { - self.webView.evaluate( - javaScript: .player("getPlaylistIndex()"), - converter: .typeCast(), - completion: completion - ) - } - -} - -// MARK: - YouTubePlayerVolumeAPI - -extension YouTubePlayer: YouTubePlayerVolumeAPI { - - /// Mutes the player - public func mute() { - self.webView.evaluate( - javaScript: .player("mute()") - ) - } - - /// Unmutes the player - public func unmute() { - self.webView.evaluate( - javaScript: .player("unMute()") - ) - } - - /// Retrieve the Bool value if the player is muted - /// - Parameter completion: The completion closure - public func isMuted( - completion: @escaping (Result) -> Void - ) { - self.webView.evaluate( - javaScript: .player("isMuted()"), - converter: .typeCast(), - completion: completion - ) - } - - /// Retrieve the player's current volume, an integer between 0 and 100 - /// - Parameter completion: The completion closure - public func getVolume( - completion: @escaping (Result) -> Void - ) { - self.webView.evaluate( - javaScript: .player("getVolume()"), - converter: .typeCast(), - completion: completion - ) - } - - /// Sets the volume. - /// Accepts an integer between 0 and 100 - /// - Note: This function is part of the official YouTube Player iFrame API - /// but due to limitations and restrictions of the underlying WKWebView - /// the call has no effect on the actual volume of the device - /// - Parameter volume: The volume - public func set( - volume: Int - ) { - #if DEBUG - print( - "[YouTubePlayerKit] Setting the volume will have no effect on the actual volume of the device." - ) - #endif - let volume = max(0, min(volume, 100)) - self.webView.evaluate( - javaScript: .player("setVolume(\(volume))") - ) - } - -} - -// MARK: - YouTubePlayerPlaybackRateAPI - -extension YouTubePlayer: YouTubePlayerPlaybackRateAPI { - - /// This function retrieves the playback rate of the currently playing video - /// - Parameter completion: The completion closure - public func getPlaybackRate( - completion: @escaping (Result) -> Void - ) { - self.webView.evaluate( - javaScript: .player("getPlaybackRate()"), - converter: .typeCast(), - completion: completion - ) - } - - /// This function sets the suggested playback rate for the current video - /// - Parameter playbackRate: The playback rate - public func set( - playbackRate: YouTubePlayer.PlaybackRate - ) { - self.webView.evaluate( - javaScript: .player("setPlaybackRate(\(playbackRate))") - ) - } - - /// Retrieves the set of playback rates in which the current video is available - /// - Parameter completion: The completion closure - public func getAvailablePlaybackRates( - completion: @escaping (Result<[YouTubePlayer.PlaybackRate], YouTubePlayerAPIError>) -> Void - ) { - self.webView.evaluate( - javaScript: .player("getAvailablePlaybackRates()"), - converter: .typeCast(), - completion: completion - ) - } - -} - -// MARK: - YouTubePlayerPlaybackAPI - -extension YouTubePlayer: YouTubePlayerPlaybackAPI { - - /// Retrieve a number between 0 and 1 that specifies the percentage of the video that the player shows as buffered - /// - Parameter completion: The completion closure - public func getVideoLoadedFraction( - completion: @escaping (Result) -> Void - ) { - self.webView.evaluate( - javaScript: .player("getVideoLoadedFraction()"), - converter: .typeCast(), - completion: completion - ) - } - - /// Retrieve the PlaybackState of the player video - /// - Parameter completion: The completion closure - public func getPlaybackState( - completion: @escaping (Result) -> Void - ) { - self.webView.evaluate( - javaScript: .player("getPlayerState()"), - converter: .typeCast( - to: Int.self - ) - .rawRepresentable(), - completion: completion - ) - } - - /// Retrieve the elapsed time in seconds since the video started playing - /// - Parameter completion: The completion closure - public func getCurrentTime( - completion: @escaping (Result) -> Void - ) { - self.webView.evaluate( - javaScript: .player("getCurrentTime()"), - converter: .typeCast(), - completion: completion - ) - } - - /// Retrieve the current PlaybackMetadata - /// - Parameter completion: The completion closure - public func getPlaybackMetadata( - completion: @escaping (Result) -> Void - ) { - self.webView.evaluate( - javaScript: .player("getVideoData()"), - converter: .typeCast( - to: [String: Any].self - ) - .decode(), - completion: completion - ) - } - -} - -// MARK: - YouTubePlayerVideoInformationAPI - -extension YouTubePlayer: YouTubePlayerVideoInformationAPI { - - /// Show Stats for Nerds which displays additional video information - public func showStatsForNerds() { - self.webView.evaluate( - javaScript: .player("showVideoInfo()") - ) - } - - /// Hide Stats for Nerds - public func hideStatsForNerds() { - self.webView.evaluate( - javaScript: .player("hideVideoInfo()") - ) - } - - /// Retrieve the YouTubePlayer Information - /// - Parameter completion: The completion closure - public func getInformation( - completion: @escaping (Result) -> Void - ) { - self.webView.evaluate( - javaScript: .player("playerInfo"), - converter: .typeCast( - to: [String: Any].self - ) - .decode(), - completion: completion - ) - } - - /// Retrieve the duration in seconds of the currently playing video - /// - Parameter completion: The completion closure - public func getDuration( - completion: @escaping (Result) -> Void - ) { - self.webView.evaluate( - javaScript: .player("getDuration()"), - converter: .typeCast(), - completion: completion - ) - } - - /// Retrieve the YouTube.com URL for the currently loaded/playing video - /// - Parameter completion: The completion closure - public func getVideoURL( - completion: @escaping (Result) -> Void - ) { - self.webView.evaluate( - javaScript: .player("getVideoUrl()"), - converter: .typeCast(), - completion: completion - ) - } - - /// Retrieve the embed code for the currently loaded/playing video - /// - Parameter completion: The completion closure - public func getVideoEmbedCode( - completion: @escaping (Result) -> Void - ) { - self.webView.evaluate( - javaScript: .player("getVideoEmbedCode()"), - converter: .typeCast(), - completion: completion - ) - } - -} diff --git a/Projects/Features/PlayerFeature/YoutubePlayerKit/YouTubePlayer+EventHandler.swift b/Projects/Features/PlayerFeature/YoutubePlayerKit/YouTubePlayer+EventHandler.swift deleted file mode 100644 index 93f7fa573..000000000 --- a/Projects/Features/PlayerFeature/YoutubePlayerKit/YouTubePlayer+EventHandler.swift +++ /dev/null @@ -1,128 +0,0 @@ -import Foundation - -// MARK: - YouTubePlayer+handle(webViewEvent:) - -extension YouTubePlayer { - - /// Handle a YouTubePlayerWebView Event - /// - Parameter webViewEvent: The YouTubePlayerWebView Event - func handle( - webViewEvent: YouTubePlayerWebView.Event - ) { - switch webViewEvent { - case .receivedJavaScriptEvent(let javaScriptEvent): - // Handle JavaScriptEvent - self.handle( - javaScriptEvent: javaScriptEvent - ) - case .frameChanged(let frame): - // Initialize parameters - let parameters = [ - frame.size.width, - frame.size.height - ] - .map(String.init) - .joined(separator: ",") - // Set YouTubePlayer Size - self.webView.evaluate( - javaScript: .init("setYouTubePlayerSize(\(parameters));") - ) - case .webContentProcessDidTerminate: - // Send web content process did terminate error - self.playerStateSubject.send( - .error(.webContentProcessDidTerminate) - ) - } - } - -} - -// MARK: - YouTubePlayer+handle(javaScriptEvent:) - -private extension YouTubePlayer { - - /// Handle incoming JavaScriptEvent - /// - Parameter javaScriptEvent: The YouTubePlayer JavaScriptEvent - func handle( - javaScriptEvent: YouTubePlayer.JavaScriptEvent - ) { - // Switch on Resolved JavaScriptEvent Name - switch javaScriptEvent.name { - case .onIframeAPIReady: - // Simply do nothing as we only - // perform action on an `onReady` event - break - case .onIframeAPIFailedToLoad: - // Send error state - self.playerStateSubject.send(.error(.iFrameAPIFailedToLoad)) - case .onReady: - // Send ready state - self.playerStateSubject.send(.ready) - // Check if autoPlay is enabled - if self.configuration.autoPlay == true && self.source != nil { - // Play Video - self.play() - } - // Retrieve the current PlaybackRate - self.getPlaybackRate { [weak self] result in - // Verify PlaybackRate is available - guard case .success(let playbackRate) = result else { - // Otherwise ignore the error and return out of function - return - } - // Send PlaybackRate - self?.playbackRateSubject.send(playbackRate) - } - // Retrieve the current PlaybackState - self.getPlaybackState { [weak self] result in - // Verify PlaybackState is available - guard case .success(let playbackState) = result else { - // Otherwise ignore the error and return out of function - return - } - // Send PlaybackState - self?.playbackStateSubject.send(playbackState) - } - case .onStateChange: - // Verify YouTubePlayer PlaybackState is available - guard let playbackState: YouTubePlayer.PlaybackState? = { - // Verify JavaScript Event Data is available - guard let javaScriptEventData = javaScriptEvent.data else { - // Otherwise return ended state - return .ended - } - // Return PlaybackState from JavaScript Event Code - return Int( - javaScriptEventData - ) - .flatMap(YouTubePlayer.PlaybackState.init) - }() else { - // Otherwise return out of function - return - } - // Send PlaybackState - self.playbackStateSubject.send(playbackState) - case .onPlaybackQualityChange: - // Send PlaybackQuality - javaScriptEvent - .data - .flatMap(YouTubePlayer.PlaybackQuality.init) - .map { self.playbackQualitySubject.send($0) } - case .onPlaybackRateChange: - // Send PlaybackRate - javaScriptEvent - .data - .flatMap(YouTubePlayer.PlaybackRate.init) - .map { self.playbackRateSubject.send($0) } - case .onError: - // Send error state - javaScriptEvent - .data - .flatMap(Int.init) - .flatMap(YouTubePlayer.Error.init) - .map { .error($0) } - .map { self.playerStateSubject.send($0) } - } - } - -} diff --git a/Projects/Features/PlayerFeature/YoutubePlayerKit/YouTubePlayer.swift b/Projects/Features/PlayerFeature/YoutubePlayerKit/YouTubePlayer.swift deleted file mode 100644 index 7e31b21d4..000000000 --- a/Projects/Features/PlayerFeature/YoutubePlayerKit/YouTubePlayer.swift +++ /dev/null @@ -1,136 +0,0 @@ -import Combine -import Foundation - -// MARK: - YouTubePlayer - -/// A YouTubePlayer -public final class YouTubePlayer: ObservableObject { - - // MARK: Properties - - /// The optional YouTubePlayer Source - @Published - public var source: Source? { - didSet { - // Verify Source has changed - guard oldValue != self.source else { - // Otherwise return out of function - return - } - // Load Source - self.load( - source: self.source - ) - } - } - - /// The YouTubePlayer Configuration - @Published - public var configuration: Configuration { - didSet { - // Verify Configuration has changed - guard oldValue != self.configuration else { - // Otherwise return out of function - return - } - // Update Configuration - self.update( - configuration: self.configuration - ) - } - } - - /// The YouTubePlayer State CurrentValueSubject - private(set) lazy var playerStateSubject = CurrentValueSubject(nil) - - /// The YouTubePlayer PlaybackState CurrentValueSubject - private(set) lazy var playbackStateSubject = CurrentValueSubject(nil) - - /// The YouTubePlayer PlaybackQuality CurrentValueSubject - private(set) lazy var playbackQualitySubject = CurrentValueSubject(nil) - - /// The YouTubePlayer PlaybackRate CurrentValueSubject - private(set) lazy var playbackRateSubject = CurrentValueSubject(nil) - - /// The YouTubePlayer WebView - private(set) lazy var webView: YouTubePlayerWebView = { - // Initialize a YouTubePlayerWebView - let webView = YouTubePlayerWebView(player: self) - // Subscribe to YouTubePlayerWebView Event Subject - self.webViewEventSubscription = webView - .eventSubject - .sink { [weak self] event in - // Handle YouTubePlayer WebView Event - self?.handle( - webViewEvent: event - ) - } - return webView - }() - - /// The YouTubePlayer WebView Event Subscription - private var webViewEventSubscription: AnyCancellable? - - // MARK: Initializer - - /// Creates a new instance of `YouTubePlayer` - /// - Parameters: - /// - source: The optional YouTubePlayer Source. Default value `nil` - /// - configuration: The YouTubePlayer Configuration. Default value `.init()` - public init( - source: Source? = nil, - configuration: Configuration = .init() - ) { - self.source = source - self.configuration = configuration - } - -} - -// MARK: - ExpressibleByStringLiteral - -extension YouTubePlayer: ExpressibleByStringLiteral { - - /// Creates an instance initialized to the given string value. - /// - Parameter value: The value of the new instance - public convenience init( - stringLiteral value: String - ) { - self.init( - source: .url(value) - ) - } - -} - -// MARK: - Equatable - -extension YouTubePlayer: Equatable { - - /// Returns a Boolean value indicating whether two values are equal. - /// - Parameters: - /// - lhs: A value to compare. - /// - rhs: Another value to compare. - public static func == ( - lhs: YouTubePlayer, - rhs: YouTubePlayer - ) -> Bool { - lhs.source == rhs.source && lhs.configuration == rhs.configuration - } - -} - -// MARK: - Hashable - -extension YouTubePlayer: Hashable { - - /// Hashes the essential components of this value by feeding them into the given hasher. - /// - Parameter hasher: The hasher to use when combining the components of this instance. - public func hash( - into hasher: inout Hasher - ) { - hasher.combine(self.source) - hasher.combine(self.configuration) - } - -} diff --git a/Projects/Features/PlaylistFeature/Demo/Resources/LaunchScreen.storyboard b/Projects/Features/PlaylistFeature/Demo/Resources/LaunchScreen.storyboard new file mode 100644 index 000000000..865e9329f --- /dev/null +++ b/Projects/Features/PlaylistFeature/Demo/Resources/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Projects/Features/PlaylistFeature/Demo/Sources/AppDelegate.swift b/Projects/Features/PlaylistFeature/Demo/Sources/AppDelegate.swift new file mode 100644 index 000000000..a12fb0c3f --- /dev/null +++ b/Projects/Features/PlaylistFeature/Demo/Sources/AppDelegate.swift @@ -0,0 +1,26 @@ +@testable import BaseFeature +import Inject +@testable import PlaylistFeature +import UIKit + +@main +final class AppDelegate: UIResponder, UIApplicationDelegate { + var window: UIWindow? + + func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil + ) -> Bool { + window = UIWindow(frame: UIScreen.main.bounds) + + let viewController = Inject.ViewControllerHost( + UINavigationController( + rootViewController: UIViewController() + ) + ) + window?.rootViewController = viewController + window?.makeKeyAndVisible() + + return true + } +} diff --git a/Projects/Features/PlaylistFeature/Interface/CheckThumbnailFactory.swift b/Projects/Features/PlaylistFeature/Interface/CheckThumbnailFactory.swift new file mode 100644 index 000000000..f25461848 --- /dev/null +++ b/Projects/Features/PlaylistFeature/Interface/CheckThumbnailFactory.swift @@ -0,0 +1,9 @@ +import UIKit + +public protocol CheckPlaylistCoverDelegate: AnyObject { + func receive(_ imageData: Data) +} + +public protocol CheckPlaylistCoverFactory { + func makeView(delegate: any CheckPlaylistCoverDelegate, imageData: Data) -> UIViewController +} diff --git a/Projects/Features/PlaylistFeature/Interface/DefaultPlaylistImageFactory.swift b/Projects/Features/PlaylistFeature/Interface/DefaultPlaylistImageFactory.swift new file mode 100644 index 000000000..c4b38e682 --- /dev/null +++ b/Projects/Features/PlaylistFeature/Interface/DefaultPlaylistImageFactory.swift @@ -0,0 +1,9 @@ +import UIKit + +public protocol DefaultPlaylistCoverDelegate: AnyObject { + func receive(url: String, imageName: String) +} + +public protocol DefaultPlaylistCoverFactory { + func makeView(_ delegate: any DefaultPlaylistCoverDelegate) -> UIViewController +} diff --git a/Projects/Features/PlaylistFeature/Interface/MyPlaylistDetailFactory.swift b/Projects/Features/PlaylistFeature/Interface/MyPlaylistDetailFactory.swift new file mode 100644 index 000000000..27478f33a --- /dev/null +++ b/Projects/Features/PlaylistFeature/Interface/MyPlaylistDetailFactory.swift @@ -0,0 +1,6 @@ +import BaseFeatureInterface +import UIKit + +public protocol MyPlaylistDetailFactory { + func makeView(key: String) -> UIViewController +} diff --git a/Projects/Features/PlaylistFeature/Interface/PlaylistCoverOptionPopupFactory.swift b/Projects/Features/PlaylistFeature/Interface/PlaylistCoverOptionPopupFactory.swift new file mode 100644 index 000000000..71ee1f231 --- /dev/null +++ b/Projects/Features/PlaylistFeature/Interface/PlaylistCoverOptionPopupFactory.swift @@ -0,0 +1,9 @@ +import UIKit + +public protocol PlaylistCoverOptionPopupDelegate: AnyObject { + func didTap(_ index: Int, _ price: Int) +} + +public protocol PlaylistCoverOptionPopupFactory { + func makeView(delegate: any PlaylistCoverOptionPopupDelegate) -> UIViewController +} diff --git a/Projects/Features/PlaylistFeature/Interface/PlaylistDetailFactory.swift b/Projects/Features/PlaylistFeature/Interface/PlaylistDetailFactory.swift new file mode 100644 index 000000000..0eb7e4541 --- /dev/null +++ b/Projects/Features/PlaylistFeature/Interface/PlaylistDetailFactory.swift @@ -0,0 +1,13 @@ +import BaseFeatureInterface +import UIKit + +public enum PlaylistDetailKind { + case wakmu + case my + case unknown +} + +public protocol PlaylistDetailFactory { + func makeView(key: String) -> UIViewController + func makeWmView(key: String) -> UIViewController +} diff --git a/Projects/Features/PlaylistFeature/Interface/PlaylistDetailNavigator.swift b/Projects/Features/PlaylistFeature/Interface/PlaylistDetailNavigator.swift new file mode 100644 index 000000000..6e50ad01e --- /dev/null +++ b/Projects/Features/PlaylistFeature/Interface/PlaylistDetailNavigator.swift @@ -0,0 +1,24 @@ +import Foundation +import UIKit + +public protocol PlaylistDetailNavigator { + var playlistDetailFactory: any PlaylistDetailFactory { get } + + func navigateWMPlaylistDetail(key: String) + + func navigatePlaylistDetail(key: String) +} + +public extension PlaylistDetailNavigator where Self: UIViewController { + func navigateWMPlaylistDetail(key: String) { + let dest = playlistDetailFactory.makeWmView(key: key) + + self.navigationController?.pushViewController(dest, animated: true) + } + + func navigatePlaylistDetail(key: String) { + let dest = playlistDetailFactory.makeView(key: key) + + self.navigationController?.pushViewController(dest, animated: true) + } +} diff --git a/Projects/Features/PlaylistFeature/Interface/PlaylistFactory.swift b/Projects/Features/PlaylistFeature/Interface/PlaylistFactory.swift new file mode 100644 index 000000000..d6f220472 --- /dev/null +++ b/Projects/Features/PlaylistFeature/Interface/PlaylistFactory.swift @@ -0,0 +1,6 @@ +import UIKit + +public protocol PlaylistFactory { + func makeViewController() -> UIViewController + func makeViewController(currentSongID: String) -> UIViewController +} diff --git a/Projects/Features/PlaylistFeature/Interface/UnknownPlaylistDetailFactory.swift b/Projects/Features/PlaylistFeature/Interface/UnknownPlaylistDetailFactory.swift new file mode 100644 index 000000000..b47d91a29 --- /dev/null +++ b/Projects/Features/PlaylistFeature/Interface/UnknownPlaylistDetailFactory.swift @@ -0,0 +1,6 @@ +import BaseFeatureInterface +import UIKit + +public protocol UnknownPlaylistDetailFactory { + func makeView(key: String) -> UIViewController +} diff --git a/Projects/Features/PlaylistFeature/Interface/WakmusicPlaylistDetailFactory.swift b/Projects/Features/PlaylistFeature/Interface/WakmusicPlaylistDetailFactory.swift new file mode 100644 index 000000000..671ac6e51 --- /dev/null +++ b/Projects/Features/PlaylistFeature/Interface/WakmusicPlaylistDetailFactory.swift @@ -0,0 +1,6 @@ +import BaseFeatureInterface +import UIKit + +public protocol WakmusicPlaylistDetailFactory { + func makeView(key: String) -> UIViewController +} diff --git a/Projects/Features/PlaylistFeature/Project.swift b/Projects/Features/PlaylistFeature/Project.swift new file mode 100644 index 000000000..36180972b --- /dev/null +++ b/Projects/Features/PlaylistFeature/Project.swift @@ -0,0 +1,32 @@ +import DependencyPlugin +import ProjectDescription +import ProjectDescriptionHelpers + +let project = Project.module( + name: ModulePaths.Feature.PlaylistFeature.rawValue, + targets: [ + .interface(module: .feature(.PlaylistFeature), dependencies: [ + .feature(target: .BaseFeature, type: .interface) + + ]), + .implements( + module: .feature(.PlaylistFeature), dependencies: [ + .feature(target: .BaseFeature), + .feature(target: .PlaylistFeature, type: .interface), + .feature(target: .SignInFeature, type: .interface), + .domain(target: .AuthDomain, type: .interface), + .domain(target: .PlaylistDomain, type: .interface), + .domain(target: .ImageDomain, type: .interface) + ] + ), + .testing(module: .feature(.PlaylistFeature), dependencies: [ + .feature(target: .PlaylistFeature, type: .interface) + ]), + .tests(module: .feature(.PlaylistFeature), dependencies: [ + .feature(target: .PlaylistFeature) + ]), + .demo(module: .feature(.PlaylistFeature), dependencies: [ + .feature(target: .PlaylistFeature) + ]) + ] +) diff --git a/Projects/Features/PlaylistFeature/Sources/Activity/PlaylistActivity.swift b/Projects/Features/PlaylistFeature/Sources/Activity/PlaylistActivity.swift new file mode 100644 index 000000000..bf2746572 --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/Activity/PlaylistActivity.swift @@ -0,0 +1,16 @@ +import DesignSystem +import UIKit + +final class PlaylistActivity: UIActivity { + override var activityType: UIActivity.ActivityType { + return UIActivity.ActivityType("com.wakmu.playlist.share.activity") + } + + override var activityTitle: String? { + return "플레이리스트 공유하기" + } + + override var activityImage: UIImage? { + return DesignSystemAsset.Logo.applogo.image + } +} diff --git a/Projects/Features/PlaylistFeature/Sources/Analytics/PlaylistAnalyticsLog.swift b/Projects/Features/PlaylistFeature/Sources/Analytics/PlaylistAnalyticsLog.swift new file mode 100644 index 000000000..bc98f90d3 --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/Analytics/PlaylistAnalyticsLog.swift @@ -0,0 +1,11 @@ +import LogManager + +enum PlaylistAnalyticsLog: AnalyticsLogType { + case clickLockButton(id: String) + case clickPlaylistEditButton + case clickPlaylistShareButton + case clickPlaylistCameraButton + case clickPlaylistImageButton(type: String) + case clickPlaylistPlayButton(type: String, key: String) + case clickPlaylistSubscriptionButton(key: String) +} diff --git a/Projects/Features/PlaylistFeature/Sources/Components/CheckPlaylistCoverComponent.swift b/Projects/Features/PlaylistFeature/Sources/Components/CheckPlaylistCoverComponent.swift new file mode 100644 index 000000000..36d49be6f --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/Components/CheckPlaylistCoverComponent.swift @@ -0,0 +1,21 @@ +import BaseFeature +import BaseFeatureInterface +import NeedleFoundation +import PlaylistFeatureInterface +import UIKit + +public protocol CheckPlaylistCoverDependency: Dependency { + var textPopupFactory: any TextPopupFactory { get } +} + +public final class CheckPlaylistCoverComponent: Component, CheckPlaylistCoverFactory { + public func makeView(delegate: any CheckPlaylistCoverDelegate, imageData: Data) -> UIViewController { + let reactor = CheckPlaylistCoverlReactor(imageData: imageData) + + return CheckPlaylistCoverViewController( + reactor: reactor, + textPopupFactory: dependency.textPopupFactory, + delegate: delegate + ) + } +} diff --git a/Projects/Features/PlaylistFeature/Sources/Components/DefaultPlaylistImageComponent.swift b/Projects/Features/PlaylistFeature/Sources/Components/DefaultPlaylistImageComponent.swift new file mode 100644 index 000000000..fa30e0181 --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/Components/DefaultPlaylistImageComponent.swift @@ -0,0 +1,20 @@ +import BaseFeature +import BaseFeatureInterface +import ImageDomainInterface +import NeedleFoundation +import PlaylistFeatureInterface +import UIKit + +public protocol DefaultPlaylistCoverDependency: Dependency { + var fetchDefaultPlaylistImageUseCase: any FetchDefaultPlaylistImageUseCase { get } +} + +public final class DefaultPlaylistCoverComponent: Component, + DefaultPlaylistCoverFactory { + public func makeView(_ delegate: any DefaultPlaylistCoverDelegate) -> UIViewController { + DefaultPlaylistCoverViewController(delegate: delegate, reactor: DefaultPlaylistCoverReactor( + fetchDefaultPlaylistImageUseCase: dependency.fetchDefaultPlaylistImageUseCase + + )) + } +} diff --git a/Projects/Features/PlaylistFeature/Sources/Components/MyPlaylistDetailComponent.swift b/Projects/Features/PlaylistFeature/Sources/Components/MyPlaylistDetailComponent.swift new file mode 100644 index 000000000..3c84d0dba --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/Components/MyPlaylistDetailComponent.swift @@ -0,0 +1,48 @@ +import AuthDomainInterface +import BaseFeature +import BaseFeatureInterface +import NeedleFoundation +import PlaylistDomainInterface +import PlaylistFeatureInterface +import UIKit + +public protocol MyPlaylistDetailDependency: Dependency { + var fetchPlaylistDetailUseCase: any FetchPlaylistDetailUseCase { get } + var updatePlaylistUseCase: any UpdatePlaylistUseCase { get } + var updateTitleAndPrivateUseCase: any UpdateTitleAndPrivateUseCase { get } + var removeSongsUseCase: any RemoveSongsUseCase { get } + var uploadDefaultPlaylistImageUseCase: any UploadDefaultPlaylistImageUseCase { get } + var logoutUseCase: any LogoutUseCase { get } + var multiPurposePopupFactory: any MultiPurposePopupFactory { get } + var containSongsFactory: any ContainSongsFactory { get } + var playlistCoverOptionPopupFactory: any PlaylistCoverOptionPopupFactory { get } + var checkPlaylistCoverFactory: any CheckPlaylistCoverFactory { get } + var defaultPlaylistCoverFactory: any DefaultPlaylistCoverFactory { get } + var requestCustomImageURLUseCase: any RequestCustomImageURLUseCase { get } + var songDetailPresenter: any SongDetailPresentable { get } + var textPopupFactory: any TextPopupFactory { get } +} + +public final class MyPlaylistDetailComponent: Component, MyPlaylistDetailFactory { + public func makeView(key: String) -> UIViewController { + return MyPlaylistDetailViewController( + reactor: MyPlaylistDetailReactor( + key: key, + fetchPlaylistDetailUseCase: dependency.fetchPlaylistDetailUseCase, + updatePlaylistUseCase: dependency.updatePlaylistUseCase, + updateTitleAndPrivateUseCase: dependency.updateTitleAndPrivateUseCase, + removeSongsUseCase: dependency.removeSongsUseCase, + uploadDefaultPlaylistImageUseCase: dependency.uploadDefaultPlaylistImageUseCase, + requestCustomImageURLUseCase: dependency.requestCustomImageURLUseCase, + logoutUseCase: dependency.logoutUseCase + ), + multiPurposePopupFactory: dependency.multiPurposePopupFactory, + containSongsFactory: dependency.containSongsFactory, + textPopupFactory: dependency.textPopupFactory, + playlistCoverOptionPopupFactory: dependency.playlistCoverOptionPopupFactory, + checkPlaylistCoverFactory: dependency.checkPlaylistCoverFactory, + defaultPlaylistCoverFactory: dependency.defaultPlaylistCoverFactory, + songDetailPresenter: dependency.songDetailPresenter + ) + } +} diff --git a/Projects/Features/PlaylistFeature/Sources/Components/PlaylistComponent.swift b/Projects/Features/PlaylistFeature/Sources/Components/PlaylistComponent.swift new file mode 100644 index 000000000..75fa25e8b --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/Components/PlaylistComponent.swift @@ -0,0 +1,41 @@ +import BaseFeature +import BaseFeatureInterface +import NeedleFoundation +import PlaylistFeatureInterface +import SignInFeatureInterface +import UIKit + +public protocol PlaylistDependency: Dependency { + var containSongsFactory: any ContainSongsFactory { get } + var songDetailPresenter: any SongDetailPresentable { get } + var textPopupFactory: any TextPopupFactory { get } + var signInFactory: any SignInFactory { get } +} + +public final class PlaylistComponent: Component, PlaylistFactory { + public func makeViewController() -> UIViewController { + let viewModel = PlaylistViewModel() + let viewController = PlaylistViewController( + currentSongID: nil, + viewModel: viewModel, + containSongsFactory: dependency.containSongsFactory, + songDetailPresenter: dependency.songDetailPresenter, + textPopupFactory: dependency.textPopupFactory, + signInFactory: dependency.signInFactory + ) + return viewController + } + + public func makeViewController(currentSongID: String) -> UIViewController { + let viewModel = PlaylistViewModel() + let viewController = PlaylistViewController( + currentSongID: currentSongID, + viewModel: viewModel, + containSongsFactory: dependency.containSongsFactory, + songDetailPresenter: dependency.songDetailPresenter, + textPopupFactory: dependency.textPopupFactory, + signInFactory: dependency.signInFactory + ) + return viewController + } +} diff --git a/Projects/Features/PlaylistFeature/Sources/Components/PlaylistCoverOptionPopupComponent.swift b/Projects/Features/PlaylistFeature/Sources/Components/PlaylistCoverOptionPopupComponent.swift new file mode 100644 index 000000000..420993d52 --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/Components/PlaylistCoverOptionPopupComponent.swift @@ -0,0 +1,25 @@ +import AuthDomainInterface +import BaseFeature +import BaseFeatureInterface +import NeedleFoundation +import PlaylistDomainInterface +import PlaylistFeatureInterface +import PriceDomainInterface +import UIKit + +public protocol PlaylistCoverOptionPopupDependency: Dependency { + var fetchPlaylistImagePriceUseCase: any FetchPlaylistImagePriceUseCase { get } +} + +public final class PlaylistCoverOptionPopupComponent: Component, + PlaylistCoverOptionPopupFactory { + public func makeView(delegate: any PlaylistCoverOptionPopupDelegate) -> UIViewController { + PlaylistCoverOptionPopupViewController( + reactor: PlaylistCoverOptionPopupReactor( + fetchPlaylistImagePriceUsecase: dependency + .fetchPlaylistImagePriceUseCase + ), + delegate: delegate + ) + } +} diff --git a/Projects/Features/PlaylistFeature/Sources/Components/PlaylistDetailComponent.swift b/Projects/Features/PlaylistFeature/Sources/Components/PlaylistDetailComponent.swift new file mode 100644 index 000000000..6d9503ad4 --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/Components/PlaylistDetailComponent.swift @@ -0,0 +1,34 @@ +import BaseFeatureInterface +import NeedleFoundation +import PlaylistDomainInterface +import PlaylistFeatureInterface +import UIKit + +public protocol PlaylistDetailFactoryDependency: Dependency { + var myPlaylistDetailFactory: any MyPlaylistDetailFactory { get } + var unknownPlaylistDetailFactory: any UnknownPlaylistDetailFactory { get } + var wakmusicPlaylistDetailFactory: any WakmusicPlaylistDetailFactory { get } + var requestPlaylistOwnerIDUsecase: any RequestPlaylistOwnerIDUsecase { get } + var textPopupFactory: any TextPopupFactory { get } +} + +public final class PlaylistDetailComponent: Component, PlaylistDetailFactory { + public func makeView(key: String) -> UIViewController { + let reactor = PlaylistDetailContainerReactor( + key: key, + requestPlaylistOwnerIDUsecase: dependency.requestPlaylistOwnerIDUsecase + ) + return PlaylistDetailContainerViewController( + reactor: reactor, + key: key, + unknownPlaylistDetailFactory: dependency + .unknownPlaylistDetailFactory, + myPlaylistDetailFactory: dependency.myPlaylistDetailFactory, + textPopupFactory: dependency.textPopupFactory + ) + } + + public func makeWmView(key: String) -> UIViewController { + return dependency.wakmusicPlaylistDetailFactory.makeView(key: key) + } +} diff --git a/Projects/Features/PlaylistFeature/Sources/Components/UnkwonPlaylistDetailComponent.swift b/Projects/Features/PlaylistFeature/Sources/Components/UnkwonPlaylistDetailComponent.swift new file mode 100644 index 000000000..e50ba7d7a --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/Components/UnkwonPlaylistDetailComponent.swift @@ -0,0 +1,37 @@ +import AuthDomainInterface +import BaseFeature +import BaseFeatureInterface +import NeedleFoundation +import PlaylistDomainInterface +import PlaylistFeatureInterface +import SignInFeatureInterface +import UIKit + +public protocol UnknownPlaylistDetailDependency: Dependency { + var fetchPlaylistDetailUseCase: any FetchPlaylistDetailUseCase { get } + var subscribePlaylistUseCase: any SubscribePlaylistUseCase { get } + var checkSubscriptionUseCase: any CheckSubscriptionUseCase { get } + var logoutUseCase: any LogoutUseCase { get } + var containSongsFactory: any ContainSongsFactory { get } + var songDetailPresenter: any SongDetailPresentable { get } + + var signInFactory: any SignInFactory { get } +} + +public final class UnknownPlaylistDetailComponent: Component, + UnknownPlaylistDetailFactory { + public func makeView(key: String) -> UIViewController { + return UnknownPlaylistDetailViewController( + reactor: UnknownPlaylistDetailReactor( + key: key, + fetchPlaylistDetailUseCase: dependency.fetchPlaylistDetailUseCase, + subscribePlaylistUseCase: dependency.subscribePlaylistUseCase, + checkSubscriptionUseCase: dependency.checkSubscriptionUseCase, + logoutUseCase: dependency.logoutUseCase + ), + containSongsFactory: dependency.containSongsFactory, + songDetailPresenter: dependency.songDetailPresenter, + signInFactory: dependency.signInFactory + ) + } +} diff --git a/Projects/Features/PlaylistFeature/Sources/Components/WakmusicPlaylistDetailComponent.swift b/Projects/Features/PlaylistFeature/Sources/Components/WakmusicPlaylistDetailComponent.swift new file mode 100644 index 000000000..f2ccd621b --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/Components/WakmusicPlaylistDetailComponent.swift @@ -0,0 +1,32 @@ +import AuthDomainInterface +import BaseFeature +import BaseFeatureInterface +import NeedleFoundation +import PlaylistDomainInterface +import PlaylistFeatureInterface +import SignInFeatureInterface +import UIKit + +public protocol WakmusicPlaylistDetailDependency: Dependency { + var fetchWMPlaylistDetailUseCase: any FetchWMPlaylistDetailUseCase { get } + var containSongsFactory: any ContainSongsFactory { get } + var textPopupFactory: any TextPopupFactory { get } + var songDetailPresenter: any SongDetailPresentable { get } + var signInFactory: any SignInFactory { get } +} + +public final class WakmusicPlaylistDetailComponent: Component, + WakmusicPlaylistDetailFactory { + public func makeView(key: String) -> UIViewController { + return WakmusicPlaylistDetailViewController( + reactor: WakmusicPlaylistDetailReactor( + key: key, + fetchWMPlaylistDetailUseCase: dependency.fetchWMPlaylistDetailUseCase + ), + containSongsFactory: dependency.containSongsFactory, + textPopupFactory: dependency.textPopupFactory, + songDetailPresenter: dependency.songDetailPresenter, + signInFactory: dependency.signInFactory + ) + } +} diff --git a/Projects/Features/PlaylistFeature/Sources/DataSource/MyPlaylistDetailDataSource.swift b/Projects/Features/PlaylistFeature/Sources/DataSource/MyPlaylistDetailDataSource.swift new file mode 100644 index 000000000..f2e172b48 --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/DataSource/MyPlaylistDetailDataSource.swift @@ -0,0 +1,60 @@ +import SongsDomainInterface +import UIKit + +final class MyPlaylistDetailDataSource: UITableViewDiffableDataSource { + private let reactor: MyPlaylistDetailReactor + + init( + reactor: MyPlaylistDetailReactor, + tableView: UITableView, + cellProvider: @escaping UITableViewDiffableDataSource.CellProvider + ) { + self.reactor = reactor + super.init(tableView: tableView, cellProvider: cellProvider) + } + + override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { + true + } + + override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool { + true + } + + override func tableView( + _ tableView: UITableView, + moveRowAt sourceIndexPath: IndexPath, + to destinationIndexPath: IndexPath + ) { + guard let sourceIdentifier = itemIdentifier(for: sourceIndexPath) else { return } + guard sourceIndexPath != destinationIndexPath else { return } + let destinationIdentifier = itemIdentifier(for: destinationIndexPath) + + #warning("updateDataSource에서 apply해주는데 왜 여기서도 해줘야하지 ?? 질문하기") + var snapshot = self.snapshot() + + // 같은 섹션으로 이동 + if let destinationIdentifier = destinationIdentifier { + if let sourceIndex = snapshot.indexOfItem(sourceIdentifier), + let destinationIndex = snapshot.indexOfItem(destinationIdentifier) { + let isAfter = destinationIndex > sourceIndex && + snapshot.sectionIdentifier(containingItem: sourceIdentifier) == + snapshot.sectionIdentifier(containingItem: destinationIdentifier) + snapshot.deleteItems([sourceIdentifier]) + if isAfter { + snapshot.insertItems([sourceIdentifier], afterItem: destinationIdentifier) + } else { + snapshot.insertItems([sourceIdentifier], beforeItem: destinationIdentifier) + } + } + } else { + // 다른 섹션으로 이동 + let destinationSectionIdentifier = snapshot.sectionIdentifiers[destinationIndexPath.section] + snapshot.deleteItems([sourceIdentifier]) + snapshot.appendItems([sourceIdentifier], toSection: destinationSectionIdentifier) + } + apply(snapshot, animatingDifferences: false) + + reactor.action.onNext(.itemDidMoved(sourceIndexPath.row, destinationIndexPath.row)) + } +} diff --git a/Projects/Features/PlaylistFeature/Sources/DataSource/UnkwonPlaylistDetailDataSource.swift b/Projects/Features/PlaylistFeature/Sources/DataSource/UnkwonPlaylistDetailDataSource.swift new file mode 100644 index 000000000..b8fda3c41 --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/DataSource/UnkwonPlaylistDetailDataSource.swift @@ -0,0 +1,11 @@ +import SongsDomainInterface +import UIKit + +final class UnknownPlaylistDetailDataSource: UITableViewDiffableDataSource { + override init( + tableView: UITableView, + cellProvider: @escaping UITableViewDiffableDataSource.CellProvider + ) { + super.init(tableView: tableView, cellProvider: cellProvider) + } +} diff --git a/Projects/Features/PlaylistFeature/Sources/Model/PlaylistCoverOptionModel.swift b/Projects/Features/PlaylistFeature/Sources/Model/PlaylistCoverOptionModel.swift new file mode 100644 index 000000000..82291f6de --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/Model/PlaylistCoverOptionModel.swift @@ -0,0 +1,11 @@ +import Foundation + +struct PlaylistCoverOptionModel: Hashable { + var title: String + var price: Int + + init(title: String, price: Int) { + self.title = title + self.price = price + } +} diff --git a/Projects/Features/PlaylistFeature/Sources/Model/PlaylistDetailHeaderModel.swift b/Projects/Features/PlaylistFeature/Sources/Model/PlaylistDetailHeaderModel.swift new file mode 100644 index 000000000..3cdeddac7 --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/Model/PlaylistDetailHeaderModel.swift @@ -0,0 +1,35 @@ +import Foundation + +struct PlaylistDetailHeaderModel: Hashable { + var key: String + var title: String + var image: String + var `private`: Bool + var userName: String + var songCount: Int + + init(key: String, title: String, image: String, userName: String, private: Bool, songCount: Int) { + self.key = key + self.title = title + self.image = image + self.userName = userName + self.private = `private` + self.songCount = songCount + } + + mutating func updatePrivate() { + self.private = !self.private + } + + mutating func updateTitle(_ title: String) { + self.title = title + } + + mutating func updateImage(_ image: String) { + self.image = image + } + + mutating func updateSongCount(_ songCount: Int) { + self.songCount = songCount + } +} diff --git a/Projects/Features/PlaylistFeature/Sources/Model/PlaylistImageKind.swift b/Projects/Features/PlaylistFeature/Sources/Model/PlaylistImageKind.swift new file mode 100644 index 000000000..fac399d93 --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/Model/PlaylistImageKind.swift @@ -0,0 +1,6 @@ +import Foundation + +enum PlaylistImageKind { + case `default`(imageName: String) + case custom(data: Data) +} diff --git a/Projects/Features/PlaylistFeature/Sources/Model/PlaylistItemModel.swift b/Projects/Features/PlaylistFeature/Sources/Model/PlaylistItemModel.swift new file mode 100644 index 000000000..eb46b4f41 --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/Model/PlaylistItemModel.swift @@ -0,0 +1,17 @@ +import Foundation + +struct PlaylistItemModel: Hashable, Equatable { + let id: String + let title: String + let artist: String + let isSelected: Bool // selected 판별 방식 전환 고려 + + func updateIsSelected(isSelected: Bool) -> PlaylistItemModel { + PlaylistItemModel( + id: self.id, + title: self.title, + artist: self.artist, + isSelected: isSelected + ) + } +} diff --git a/Projects/Features/PlaylistFeature/Sources/Reactors/CheckPlaylistCoverlReactor.swift b/Projects/Features/PlaylistFeature/Sources/Reactors/CheckPlaylistCoverlReactor.swift new file mode 100644 index 000000000..317cdaceb --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/Reactors/CheckPlaylistCoverlReactor.swift @@ -0,0 +1,26 @@ +import Foundation +import ReactorKit + +final class CheckPlaylistCoverlReactor: Reactor { + enum Action { + case viewDidLoad + } + + enum Mutation { + case updateLoadingState(Bool) + } + + struct State { + var imageData: Data + var guideLines: [String] + var isLoading: Bool + } + + var initialState: State + + init(imageData: Data) { + initialState = State(imageData: imageData, guideLines: [], isLoading: true) + } +} + +extension CheckPlaylistCoverlReactor {} diff --git a/Projects/Features/PlaylistFeature/Sources/Reactors/DefaultPlaylistCoverReactor.swift b/Projects/Features/PlaylistFeature/Sources/Reactors/DefaultPlaylistCoverReactor.swift new file mode 100644 index 000000000..d1d0ff802 --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/Reactors/DefaultPlaylistCoverReactor.swift @@ -0,0 +1,77 @@ +import DesignSystem +import Foundation +import ImageDomainInterface +import ReactorKit +import RxSwift + +#warning("디폴트 이미지 가져오기") +final class DefaultPlaylistCoverReactor: Reactor { + enum Action { + case viewDidload + case selectedIndex(Int) + } + + enum Mutation { + case updateDataSource([DefaultImageEntity]) + case updateSelectedItem(Int) + case updateLoadingState(Bool) + } + + struct State { + var dataSource: [DefaultImageEntity] + var selectedIndex: Int + var isLoading: Bool + } + + private let fetchDefaultPlaylistImageUseCase: any FetchDefaultPlaylistImageUseCase + var initialState: State + + init(fetchDefaultPlaylistImageUseCase: any FetchDefaultPlaylistImageUseCase) { + initialState = State( + dataSource: [], + selectedIndex: 0, + isLoading: true + ) + + self.fetchDefaultPlaylistImageUseCase = fetchDefaultPlaylistImageUseCase + } + + func mutate(action: Action) -> Observable { + switch action { + case .viewDidload: + return updateDataSource() + + case let .selectedIndex(index): + return .just(.updateSelectedItem(index)) + } + } + + func reduce(state: State, mutation: Mutation) -> State { + var newState = state + + switch mutation { + case let .updateDataSource(dataSource): + newState.dataSource = dataSource + case let .updateSelectedItem(id): + newState.selectedIndex = id + case let .updateLoadingState(flag): + newState.isLoading = flag + } + + return newState + } +} + +extension DefaultPlaylistCoverReactor { + func updateDataSource() -> Observable { + return .concat([ + .just(.updateLoadingState(true)), + fetchDefaultPlaylistImageUseCase.execute() + .asObservable() + .flatMap { data -> Observable in + return Observable.just(.updateDataSource(data)) + }, + .just(.updateLoadingState(false)) + ]) + } +} diff --git a/Projects/Features/PlaylistFeature/Sources/Reactors/MyPlaylistDetailReactor.swift b/Projects/Features/PlaylistFeature/Sources/Reactors/MyPlaylistDetailReactor.swift new file mode 100644 index 000000000..b20103107 --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/Reactors/MyPlaylistDetailReactor.swift @@ -0,0 +1,518 @@ +import AuthDomainInterface +import Foundation +import Localization +import PlaylistDomainInterface +import ReactorKit +import RxSwift +import SongsDomainInterface +import Utility + +final class MyPlaylistDetailReactor: Reactor { + enum Action { + case viewDidLoad + case itemDidTap(Int) + case editButtonDidTap + case privateButtonDidTap + case completionButtonDidTap + case restore + case itemDidMoved(Int, Int) + case forceSave + case forceEndEditing + case changeTitle(String) + case selectAll + case deselectAll + case removeSongs + case changeImageData(PlaylistImageKind) + case shareButtonDidTap + case moreButtonDidTap + } + + enum Mutation { + case updateEditingState(Bool) + case updateHeader(PlaylistDetailHeaderModel) + case updatePlaylist([PlaylistItemModel]) + case updateBackUpPlaylist([PlaylistItemModel]) + case updateLoadingState(Bool) + case updateSelectedCount(Int) + case updateImageData(PlaylistImageKind?) + case updateCompletionButtonVisible(Bool) + case updateIsSecondaryLoading(Bool) + case updateShowEditSheet(Bool) + case showToast(String) + case showShareLink(String) + case postNotification(Notification.Name) + } + + struct State { + var isEditing: Bool + var header: PlaylistDetailHeaderModel + var playlistModels: [PlaylistItemModel] + var backupPlaylistModels: [PlaylistItemModel] + var isLoading: Bool + var selectedCount: Int + var imageData: PlaylistImageKind? + var showEditSheet: Bool + var completionButtonVisible: Bool + var isSaveCompletionLoading: Bool + @Pulse var toastMessage: String? + @Pulse var shareLink: String? + @Pulse var notiName: Notification.Name? + } + + internal let key: String + var initialState: State + private let fetchPlaylistDetailUseCase: any FetchPlaylistDetailUseCase + private let updatePlaylistUseCase: any UpdatePlaylistUseCase + private let updateTitleAndPrivateUseCase: any UpdateTitleAndPrivateUseCase + private let removeSongsUseCase: any RemoveSongsUseCase + private let uploadDefaultPlaylistImageUseCase: any UploadDefaultPlaylistImageUseCase + private let requestCustomImageURLUseCase: any RequestCustomImageURLUseCase + + private let logoutUseCase: any LogoutUseCase + private let deepLinkGenerator = WMDeepLinkGenerator() + + init( + key: String, + fetchPlaylistDetailUseCase: any FetchPlaylistDetailUseCase, + updatePlaylistUseCase: any UpdatePlaylistUseCase, + updateTitleAndPrivateUseCase: any UpdateTitleAndPrivateUseCase, + removeSongsUseCase: any RemoveSongsUseCase, + uploadDefaultPlaylistImageUseCase: any UploadDefaultPlaylistImageUseCase, + requestCustomImageURLUseCase: any RequestCustomImageURLUseCase, + logoutUseCase: any LogoutUseCase + + ) { + self.key = key + self.fetchPlaylistDetailUseCase = fetchPlaylistDetailUseCase + self.updatePlaylistUseCase = updatePlaylistUseCase + self.updateTitleAndPrivateUseCase = updateTitleAndPrivateUseCase + self.removeSongsUseCase = removeSongsUseCase + self.uploadDefaultPlaylistImageUseCase = uploadDefaultPlaylistImageUseCase + self.requestCustomImageURLUseCase = requestCustomImageURLUseCase + self.logoutUseCase = logoutUseCase + + self.initialState = State( + isEditing: false, + header: PlaylistDetailHeaderModel( + key: key, + title: "", + image: "", + userName: "", + private: true, + songCount: 0 + ), + playlistModels: [], + backupPlaylistModels: [], + isLoading: true, + selectedCount: 0, + showEditSheet: false, + completionButtonVisible: false, + isSaveCompletionLoading: false, + notiName: nil + ) + } + + func mutate(action: Action) -> Observable { + switch action { + case .viewDidLoad: + return viewDidLoad() + + case .editButtonDidTap: + return beginEditing() + + case .privateButtonDidTap: + return updatePrivate() + + case .forceSave, .completionButtonDidTap: + return endEditingWithSave() + + case .forceEndEditing: + return endEditing() + + case let .itemDidTap(index): + return updateItemSelected(index) + + case .restore: + return restoreDataSource() + case let .itemDidMoved(from, to): + return updateItemPosition(from: from, to: to) + + case let .changeTitle(text): + return updateTitle(text: text) + + case .selectAll: + return selectAll() + + case .deselectAll: + return deselectAll() + + case .removeSongs: + return removeSongs() + + case let .changeImageData(imageData): + return updateImageData(imageData: imageData) + case .shareButtonDidTap: + return updateShareLink() + case .moreButtonDidTap: + return updateShowEditSheet(flag: !self.currentState.showEditSheet) + } + } + + func reduce(state: State, mutation: Mutation) -> State { + var newState = state + + switch mutation { + case let .updateEditingState(flag): + newState.isEditing = flag + + case let .updateHeader(header): + newState.header = header + + case let .updatePlaylist(platylist): + newState.playlistModels = platylist + + case let .updateBackUpPlaylist(dataSource): + newState.backupPlaylistModels = dataSource + + case let .updateLoadingState(isLoading): + newState.isLoading = isLoading + + case let .updateSelectedCount(count): + newState.selectedCount = count + + case let .showToast(message): + newState.toastMessage = message + case let .updateImageData(imageData): + newState.imageData = imageData + + case let .showShareLink(link): + newState.shareLink = link + case let .postNotification(notiName): + newState.notiName = notiName + case let .updateShowEditSheet(flag): + newState.showEditSheet = flag + case let .updateCompletionButtonVisible(flag): + newState.completionButtonVisible = flag + case let .updateIsSecondaryLoading(flag): + newState.isSaveCompletionLoading = flag + } + + return newState + } +} + +private extension MyPlaylistDetailReactor { + func viewDidLoad() -> Observable { + return .concat([ + .just(.updateLoadingState(true)), + fetchPlaylistDetailUseCase.execute(id: key, type: .my) + .asObservable() + .flatMap { data -> Observable in + return .concat([ + Observable.just(Mutation.updateHeader( + PlaylistDetailHeaderModel( + key: data.key, + title: data.title, + image: data.image, + userName: data.userName, + private: data.private, + songCount: data.songs.count + ) + )), + Observable.just( + Mutation.updatePlaylist( + data.songs.map { + PlaylistItemModel( + id: $0.id, + title: $0.title, + artist: $0.artist, + isSelected: false + ) + } + ) + ), + Observable.just( + Mutation.updateBackUpPlaylist( + data.songs.map { + PlaylistItemModel( + id: $0.id, + title: $0.title, + artist: $0.artist, + isSelected: false + ) + } + ) + ) + ]) + } + .catch { error in + let wmErorr = error.asWMError + return Observable.just( + Mutation.showToast(wmErorr.errorDescription ?? LocalizationStrings.unknownErrorWarning) + ) + }, + .just(.updateLoadingState(false)) + ]) + } + + func endEditingWithSave() -> Observable { + let state = currentState + let currentPlaylists = state.playlistModels + + let newPlaylistItemModels = currentPlaylists.map { + return $0.updateIsSelected(isSelected: false) + } + + var mutations: [Observable] = [ + updateComplectionButtonVisible(flag: false), + updateIsSecondaryLoading(flag: true) + ] + + if let imageData = state.imageData { + switch imageData { + case let .default(imageName): + mutations.append( + uploadDefaultPlaylistImageUseCase.execute(key: self.key, model: imageName) + .andThen(.concat([ + postNotification(notiName: .shouldRefreshPlaylist) + ])) // 플리 이미지 갱신 + .catch { error in + let wmErorr = error.asWMError + return Observable.just( + Mutation.showToast(wmErorr.errorDescription ?? LocalizationStrings.unknownErrorWarning) + ) + } + ) + + case let .custom(data): + mutations.append( + requestCustomImageURLUseCase.execute(key: self.key, data: data) + .andThen(.concat([ + postNotification(notiName: .shouldRefreshPlaylist), // 플리 이미지 갱신 + postNotification(notiName: .willRefreshUserInfo) // 열매 갱신 + ])) + .catch { error in + let wmErorr = error.asWMError + return Observable.just( + Mutation.showToast(wmErorr.errorDescription ?? LocalizationStrings.unknownErrorWarning) + ) + } + ) + } + } + if state.backupPlaylistModels == newPlaylistItemModels { + mutations.append(endEditing()) + } else { + mutations.append( + updatePlaylistUseCase.execute(key: key, songs: currentPlaylists.map { $0.id }) + .andThen(endEditing()) + .catch { error in + let wmErorr = error.asWMError + return Observable.just( + Mutation.showToast(wmErorr.errorDescription ?? LocalizationStrings.unknownErrorWarning) + ) + } + ) + } + + mutations.append(updateIsSecondaryLoading(flag: false)) + return .concat(mutations) + } + + func endEditing() -> Observable { + let state = currentState + let currentPlaylists = state.playlistModels + + let updatingPlaylistItemModels = currentPlaylists.map { + return $0.updateIsSelected(isSelected: false) + } + + return .concat([ + .just(.updateEditingState(false)), + .just(.updatePlaylist(updatingPlaylistItemModels)), + .just(.updateBackUpPlaylist(updatingPlaylistItemModels)), + .just(.updateSelectedCount(0)), + .just(.updateImageData(nil)) + ]) + } + + func updatePrivate() -> Observable { + let state = currentState + + var prev = state.header + prev.updatePrivate() + + let message: String = prev.private ? "리스트를 비공개 처리했습니다." : "리스트를 공개 처리했습니다." + + return updateTitleAndPrivateUseCase.execute(key: key, title: nil, isPrivate: prev.private) + .andThen(.concat([ + .just(.updateHeader(prev)), + .just(.showToast(message)), + .just(.postNotification(.shouldRefreshPlaylist)) + + ])) + .catch { error in + let wmErorr = error.asWMError + return Observable.just( + Mutation.showToast(wmErorr.errorDescription ?? LocalizationStrings.unknownErrorWarning) + ) + } + } + + func updateTitle(text: String) -> Observable { + let state = currentState + + var prev = state.header + prev.updateTitle(text) + + return .concat([ + .just(.updateHeader(prev)), + updateTitleAndPrivateUseCase.execute(key: key, title: text, isPrivate: nil) + .andThen(postNotification(notiName: .shouldRefreshPlaylist)) + ]) + } +} + +/// usecase를 사용하지 않는 +private extension MyPlaylistDetailReactor { + func beginEditing() -> Observable { + let state = currentState + let currentPlaylists = state.playlistModels + + return .concat([ + .just(.updateEditingState(true)), + .just(.updateBackUpPlaylist(currentPlaylists)), + updateComplectionButtonVisible(flag: true), + updateShowEditSheet(flag: false), + ]) + } + + func updateItemSelected(_ index: Int) -> Observable { + let state = currentState + var count = state.selectedCount + // 불변성 고려 + var playlists = state.playlistModels + let isSelected = playlists[index].isSelected + + if playlists[index].isSelected { + count -= 1 + } else { + count += 1 + } + playlists[index] = playlists[index].updateIsSelected(isSelected: !isSelected) + + return .concat([ + .just(Mutation.updateSelectedCount(count)), + .just(Mutation.updatePlaylist(playlists)) + ]) + } + + func updateItemPosition(from: Int, to: Int) -> Observable { + let state = currentState + var updatingPlaylists = state.playlistModels + + let item = updatingPlaylists[from] + + updatingPlaylists.remove(at: from) + + updatingPlaylists.insert(item, at: to) + + return .just(Mutation.updatePlaylist(updatingPlaylists)) + } + + func restoreDataSource() -> Observable { + let state = currentState + let backUpPlaylist = state.backupPlaylistModels + + return .concat([ + updateComplectionButtonVisible(flag: false), + .just(Mutation.updateEditingState(false)), + .just(Mutation.updatePlaylist(backUpPlaylist)), + .just(.updateSelectedCount(0)) + ]) + } + + func selectAll() -> Observable { + let state = currentState + var playlist = state.playlistModels + + let updatingPlaylistItemModels = playlist.map { + return $0.updateIsSelected(isSelected: true) + } + + return .concat([ + .just(.updatePlaylist(updatingPlaylistItemModels)), + .just(.updateSelectedCount(updatingPlaylistItemModels.count)) + ]) + } + + func deselectAll() -> Observable { + let state = currentState + var playlist = state.playlistModels + + let updatingPlaylistItemModels = playlist.map { + return $0.updateIsSelected(isSelected: false) + } + + return .concat([ + .just(.updatePlaylist(updatingPlaylistItemModels)), + .just(.updateSelectedCount(0)), + .just(.updateImageData(nil)) + ]) + } + + func removeSongs() -> Observable { + let state = currentState + let playlists = state.playlistModels + + let remainSongs = playlists.filter { !$0.isSelected } + let removeSongs = playlists.filter { $0.isSelected }.map { $0.id } + var prevHeader = currentState.header + prevHeader.updateSongCount(remainSongs.count) + + return removeSongsUseCase.execute(key: key, songs: removeSongs) + .andThen(.concat([ + .just(.updatePlaylist(remainSongs)), + .just(.updateBackUpPlaylist(remainSongs)), + .just(.updateEditingState(false)), + .just(.updateSelectedCount(0)), + .just(.updateHeader(prevHeader)), + .just(.showToast("\(removeSongs.count)개의 곡을 삭제했습니다.")), + postNotification(notiName: .shouldRefreshPlaylist) + + ])) + .catch { error in + let wmErorr = error.asWMError + return Observable.just( + Mutation.showToast(wmErorr.errorDescription ?? LocalizationStrings.unknownErrorWarning) + ) + } + } + + func updateImageData(imageData: PlaylistImageKind?) -> Observable { + return .just(.updateImageData(imageData)) + } + + func postNotification(notiName: Notification.Name) -> Observable { + .just(.postNotification(notiName)) + } + + func updateShareLink() -> Observable { + return .concat([ + .just(.showShareLink(deepLinkGenerator.generatePlaylistDeepLink(key: key))), + updateShowEditSheet(flag: false) + ]) + } + + func updateShowEditSheet(flag: Bool) -> Observable { + return .just(.updateShowEditSheet(flag)) + } + + func updateComplectionButtonVisible(flag: Bool) -> Observable { + return .just(.updateCompletionButtonVisible(flag)) + } + + func updateIsSecondaryLoading(flag: Bool) -> Observable { + return .just(.updateIsSecondaryLoading(flag)) + } +} diff --git a/Projects/Features/PlaylistFeature/Sources/Reactors/PlaylistCoverOptionPopupReactor.swift b/Projects/Features/PlaylistFeature/Sources/Reactors/PlaylistCoverOptionPopupReactor.swift new file mode 100644 index 000000000..b3810085f --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/Reactors/PlaylistCoverOptionPopupReactor.swift @@ -0,0 +1,71 @@ +import PriceDomainInterface +import ReactorKit + +final class PlaylistCoverOptionPopupReactor: Reactor { + enum Action { + case viewDidLoad + } + + enum Mutation { + case updateDataSource([PlaylistCoverOptionModel]) + case updateLoadingState(Bool) + } + + struct State { + var dataSource: [PlaylistCoverOptionModel] + var isLoading: Bool + } + + private let fetchPlaylistImagePriceUsecase: any FetchPlaylistImagePriceUseCase + var initialState: State + + init(fetchPlaylistImagePriceUsecase: any FetchPlaylistImagePriceUseCase) { + self.fetchPlaylistImagePriceUsecase = fetchPlaylistImagePriceUsecase + initialState = State( + dataSource: [], + isLoading: true + ) + } + + func mutate(action: Action) -> Observable { + switch action { + case .viewDidLoad: + return updateDataSource() + } + } + + func reduce(state: State, mutation: Mutation) -> State { + var newState = state + + switch mutation { + case let .updateDataSource(dataSource): + newState.dataSource = dataSource + + case let .updateLoadingState(flag): + newState.isLoading = flag + } + + return newState + } +} + +extension PlaylistCoverOptionPopupReactor { + func updateDataSource() -> Observable { + return .concat([ + .just(.updateLoadingState(true)), + + fetchPlaylistImagePriceUsecase + .execute() + .asObservable() + .flatMap { entity -> Observable in + return Observable.just( + Mutation.updateDataSource([ + PlaylistCoverOptionModel(title: "이미지 선택", price: 0), + PlaylistCoverOptionModel(title: "앨범에서 고르기", price: entity.price) + ]) + ) + }, + .just(.updateLoadingState(false)) + ]) + } +} diff --git a/Projects/Features/PlaylistFeature/Sources/Reactors/PlaylistDetailContainerReactor.swift b/Projects/Features/PlaylistFeature/Sources/Reactors/PlaylistDetailContainerReactor.swift new file mode 100644 index 000000000..b4da71fa0 --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/Reactors/PlaylistDetailContainerReactor.swift @@ -0,0 +1,104 @@ +import Foundation +import PlaylistDomainInterface +import ReactorKit +import RxSwift + +final class PlaylistDetailContainerReactor: Reactor { + enum Action { + case requestOwnerID + case clearOwnerID + } + + enum Mutation { + case updateOwnerID(String?) + case updateLoadingState(Bool) + case showToastMessagae(String) + case updateDetectedNotFound + } + + struct State { + var isLoading: Bool + var ownerID: String? + @Pulse var toastMessgae: String? + @Pulse var detectedNotFound: Void? + } + + private let requestPlaylistOwnerIDUsecase: any RequestPlaylistOwnerIDUsecase + let key: String + var initialState: State + + init(key: String, requestPlaylistOwnerIDUsecase: any RequestPlaylistOwnerIDUsecase) { + self.key = key + initialState = State(isLoading: true) + self.requestPlaylistOwnerIDUsecase = requestPlaylistOwnerIDUsecase + } + + func mutate(action: Action) -> Observable { + switch action { + case .requestOwnerID: + return updateOwnerID() + case .clearOwnerID: + return clearOwnerID() + } + } + + func reduce(state: State, mutation: Mutation) -> State { + var newState = state + + switch mutation { + case let .updateOwnerID(ownerID): + newState.ownerID = ownerID + case let .showToastMessagae(message): + newState.toastMessgae = message + case let .updateLoadingState(flag): + newState.isLoading = flag + case .updateDetectedNotFound: + newState.detectedNotFound = () + } + + return newState + } +} + +extension PlaylistDetailContainerReactor { + func updateOwnerID() -> Observable { + return .concat([ + updateLoadingState(flag: true), + updateOwnerIDMutation(), + updateLoadingState(flag: false) + ]) + } + + func updateOwnerIDMutation() -> Observable { + return requestPlaylistOwnerIDUsecase + .execute(key: key) + .asObservable() + .flatMap { entitiy -> Observable in + return .just(Mutation.updateOwnerID(entitiy.ownerID)) + } + .catch { error in + let wmError = error.asWMError + + if wmError == .notFound { + return self.updateDetectedNotFound() + } + + return .just(Mutation.showToastMessagae(wmError.localizedDescription)) + } + } + + func updateLoadingState(flag: Bool) -> Observable { + return .just(.updateLoadingState(flag)) + } + + func clearOwnerID() -> Observable { + return .concat([ + Observable.just(Mutation.updateOwnerID(nil)), + Observable.just(.updateLoadingState(false)) + ]) + } + + func updateDetectedNotFound() -> Observable { + .just(.updateDetectedNotFound) + } +} diff --git a/Projects/Features/PlaylistFeature/Sources/Reactors/UnknownPlaylistDetailReactor.swift b/Projects/Features/PlaylistFeature/Sources/Reactors/UnknownPlaylistDetailReactor.swift new file mode 100644 index 000000000..9a071ee81 --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/Reactors/UnknownPlaylistDetailReactor.swift @@ -0,0 +1,296 @@ +import AuthDomainInterface +import Foundation +import Localization +import LogManager +import PlaylistDomainInterface +import ReactorKit +import RxSwift +import SongsDomainInterface +import Utility + +final class UnknownPlaylistDetailReactor: Reactor { + let key: String + + enum Action { + case viewDidLoad + case selectAll + case deselectAll + case itemDidTap(Int) + case subscriptionButtonDidTap + case requestLoginRequiredAction(source: LoginRequiredActionSource) + + enum LoginRequiredActionSource { + case addMusics + } + } + + enum Mutation { + case updateHeader(PlaylistDetailHeaderModel) + case updateDataSource([SongEntity]) + case updateLoadingState(Bool) + case updateSelectedCount(Int) + case updateSelectingStateByIndex([SongEntity]) + case updateSubscribeState(Bool) + case showToast(String) + case updateLoginPopupState((Bool, CommonAnalyticsLog.LoginButtonEntry?)) + case updateRefresh + } + + struct State { + var header: PlaylistDetailHeaderModel + var dataSource: [SongEntity] + var isLoading: Bool + var selectedCount: Int + var isSubscribing: Bool + @Pulse var toastMessage: String? + @Pulse var showLoginPopup: (Bool, CommonAnalyticsLog.LoginButtonEntry?) + @Pulse var refresh: Void? + @Pulse var detectedNotFound: Void? + } + + var initialState: State + private let fetchPlaylistDetailUseCase: any FetchPlaylistDetailUseCase + private let subscribePlaylistUseCase: any SubscribePlaylistUseCase + private let checkSubscriptionUseCase: any CheckSubscriptionUseCase + private let playlistCommonService: any PlaylistCommonService + + private let logoutUseCase: any LogoutUseCase + + init( + key: String, + fetchPlaylistDetailUseCase: any FetchPlaylistDetailUseCase, + subscribePlaylistUseCase: any SubscribePlaylistUseCase, + checkSubscriptionUseCase: any CheckSubscriptionUseCase, + logoutUseCase: any LogoutUseCase, + playlistCommonService: any PlaylistCommonService = DefaultPlaylistCommonService.shared + ) { + self.key = key + self.fetchPlaylistDetailUseCase = fetchPlaylistDetailUseCase + self.subscribePlaylistUseCase = subscribePlaylistUseCase + self.checkSubscriptionUseCase = checkSubscriptionUseCase + self.logoutUseCase = logoutUseCase + self.playlistCommonService = playlistCommonService + + self.initialState = State( + header: PlaylistDetailHeaderModel( + key: key, title: "", + image: "", + userName: "", + private: false, + songCount: 0 + ), + dataSource: [], + isLoading: true, + selectedCount: 0, + isSubscribing: false, + showLoginPopup: (false, nil) + ) + } + + func mutate(action: Action) -> Observable { + switch action { + case .viewDidLoad: + return updateDataSource() + + case .subscriptionButtonDidTap: + return askUpdateSubscribing() + + case .selectAll: + return selectAll() + + case .deselectAll: + return deselectAll() + + case let .itemDidTap(index): + return updateItemSelected(index) + + case let .requestLoginRequiredAction(source): + switch source { + case .addMusics: + return .just(.updateLoginPopupState((true, .addMusics))) + } + return .just(.updateLoginPopupState((true, nil))) + } + } + + func reduce(state: State, mutation: Mutation) -> State { + var newState = state + + switch mutation { + case let .updateHeader(header): + newState.header = header + + case let .updateDataSource(dataSource): + newState.dataSource = dataSource + + case let .updateLoadingState(isLoading): + newState.isLoading = isLoading + case let .updateSelectedCount(count): + newState.selectedCount = count + + case let .showToast(message): + newState.toastMessage = message + + case let .updateLoginPopupState(flag): + newState.showLoginPopup = flag + + case let .updateSelectingStateByIndex(dataSource): + newState.dataSource = dataSource + + case let .updateSubscribeState(flag): + newState.isSubscribing = flag + + case .updateRefresh: + newState.refresh = () + } + + return newState + } + + func transform(mutation: Observable) -> Observable { + let removeSubscriptionPlaylistEvent = playlistCommonService.removeSubscriptionPlaylistEvent + .withUnretained(self) + .flatMap { owner, notification -> Observable in + guard let removedPlaylistKeys = notification.object as? [String] else { + return .empty() + } + + return removedPlaylistKeys.contains(owner.key) ? owner.checkSubscription() : .empty() + } + + return Observable.merge(removeSubscriptionPlaylistEvent, mutation) + } +} + +private extension UnknownPlaylistDetailReactor { + func updateDataSource() -> Observable { + return .concat([ + .just(.updateLoadingState(true)), + fetchPlaylistDetailUseCase.execute(id: key, type: .unknown) + .asObservable() + .withUnretained(self) + .flatMap { owner, data -> Observable in + return .concat([ + Observable.just(Mutation.updateHeader( + PlaylistDetailHeaderModel( + key: data.key, + title: data.title, + image: data.image, + userName: data.userName, + private: data.private, + songCount: data.songs.count + ) + )), + Observable.just(Mutation.updateDataSource(data.songs)), + PreferenceManager.userInfo == nil ? .just(.updateSubscribeState(false)) : owner + .checkSubscription() + ]) + } + .catch { [weak self] error in + + guard let self else { return .empty() } + + let wmError = error.asWMError + + return Observable.just( + Mutation.showToast(wmError.errorDescription ?? LocalizationStrings.unknownErrorWarning) + ) + }, + .just(.updateLoadingState(false)) + ]) + } + + func checkSubscription() -> Observable { + return checkSubscriptionUseCase.execute(key: key) + .asObservable() + .flatMap { flag -> Observable in + return .just(.updateSubscribeState(flag)) + } + .catch { error in + let wmErorr = error.asWMError + return Observable.just( + Mutation.showToast(wmErorr.errorDescription ?? LocalizationStrings.unknownErrorWarning) + ) + } + } +} + +/// usecase를 사용하지 않는 +private extension UnknownPlaylistDetailReactor { + func updateItemSelected(_ index: Int) -> Observable { + let state = currentState + var count = state.selectedCount + var prev = state.dataSource + + if prev[index].isSelected { + count -= 1 + } else { + count += 1 + } + prev[index].isSelected = !prev[index].isSelected + + return .concat([ + .just(Mutation.updateSelectedCount(count)), + .just(Mutation.updateSelectingStateByIndex(prev)) + ]) + } + + func selectAll() -> Observable { + let state = currentState + var dataSource = state.dataSource + + for i in 0 ..< dataSource.count { + dataSource[i].isSelected = true + } + + return .concat([ + .just(.updateDataSource(dataSource)), + .just(.updateSelectedCount(dataSource.count)) + ]) + } + + func deselectAll() -> Observable { + let state = currentState + var dataSource = state.dataSource + + for i in 0 ..< dataSource.count { + dataSource[i].isSelected = false + } + + return .concat([ + .just(.updateDataSource(dataSource)), + .just(.updateSelectedCount(0)) + ]) + } + + func askUpdateSubscribing() -> Observable { + let currentState = currentState + + let prev = currentState.isSubscribing + + if PreferenceManager.userInfo == nil { + return .just(.updateLoginPopupState((true, .playlistSubscribe))) + } else { + return subscribePlaylistUseCase.execute(key: key, isSubscribing: prev) + .andThen( + .concat([ + .just(Mutation.updateSubscribeState(!prev)), + .just(Mutation.showToast(prev ? "리스트 구독을 취소 했습니다." : "리스트 구독을 했습니다.")), + updateSendRefreshNoti() + ]) + ) + .catch { error in + let wmError = error.asWMError + return .just(.showToast(wmError.errorDescription!)) + } + } + } + + func updateSubscribeState(_ flag: Bool) -> Observable { + return .just(.updateSubscribeState(flag)) + } + + func updateSendRefreshNoti() -> Observable { + .just(.updateRefresh) + } +} diff --git a/Projects/Features/PlaylistFeature/Sources/Reactors/WakmusicPlaylistDetailReactor.swift b/Projects/Features/PlaylistFeature/Sources/Reactors/WakmusicPlaylistDetailReactor.swift new file mode 100644 index 000000000..77742e99d --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/Reactors/WakmusicPlaylistDetailReactor.swift @@ -0,0 +1,200 @@ +import AuthDomainInterface +import Foundation +import Localization +import PlaylistDomainInterface +import ReactorKit +import RxSwift +import SongsDomainInterface +import Utility + +final class WakmusicPlaylistDetailReactor: Reactor { + let key: String + + var disposeBag = DisposeBag() + + enum Action { + case viewDidLoad + case selectAll + case deselectAll + case itemDidTap(Int) + case requestLoginRequiredAction + } + + enum Mutation { + case updateHeader(PlaylistDetailHeaderModel) + case updateDataSource([SongEntity]) + case updateLoadingState(Bool) + case updateSelectedCount(Int) + case updateSelectingStateByIndex([SongEntity]) + case showToast(String) + case updateLoginPopupState(Bool) + case updatePlaylistURL(String) + } + + struct State { + var header: PlaylistDetailHeaderModel + var dataSource: [SongEntity] + var isLoading: Bool + var selectedCount: Int + var playlistURL: String? + @Pulse var toastMessage: String? + @Pulse var showLoginPopup: Bool + } + + var initialState: State + private let fetchWMPlaylistDetailUseCase: any FetchWMPlaylistDetailUseCase + + init( + key: String, + fetchWMPlaylistDetailUseCase: any FetchWMPlaylistDetailUseCase + + ) { + self.key = key + self.fetchWMPlaylistDetailUseCase = fetchWMPlaylistDetailUseCase + + self.initialState = State( + header: PlaylistDetailHeaderModel( + key: key, title: "", + image: "", + userName: "", + private: false, + songCount: 0 + ), + dataSource: [], + isLoading: true, + selectedCount: 0, + showLoginPopup: false + ) + } + + func mutate(action: Action) -> Observable { + switch action { + case .viewDidLoad: + return updateDataSource() + + case .requestLoginRequiredAction: + return .just(.updateLoginPopupState(true)) + + case .selectAll: + return selectAll() + + case .deselectAll: + return deselectAll() + + case let .itemDidTap(index): + return updateItemSelected(index) + } + } + + func reduce(state: State, mutation: Mutation) -> State { + var newState = state + + switch mutation { + case let .updateHeader(header): + newState.header = header + + case let .updateDataSource(dataSource): + newState.dataSource = dataSource + + case let .updateLoadingState(isLoading): + newState.isLoading = isLoading + case let .updateSelectedCount(count): + newState.selectedCount = count + + case let .showToast(message): + newState.toastMessage = message + + case let .updateSelectingStateByIndex(dataSource): + newState.dataSource = dataSource + case let .updateLoginPopupState(flag): + newState.showLoginPopup = flag + + case let .updatePlaylistURL(URL): + newState.playlistURL = URL + } + + return newState + } +} + +private extension WakmusicPlaylistDetailReactor { + func updateDataSource() -> Observable { + return .concat([ + .just(.updateLoadingState(true)), + fetchWMPlaylistDetailUseCase.execute(id: key) + .asObservable() + .flatMap { data -> Observable in + return .concat([ + Observable.just(Mutation.updateHeader( + PlaylistDetailHeaderModel( + key: data.key, + title: data.title, + image: data.image, + userName: "Wakmu", + private: false, + songCount: data.songs.count + ) + )), + Observable.just(.updatePlaylistURL(data.playlistURL)), + Observable.just(Mutation.updateDataSource(data.songs)) + ]) + } + .catch { error in + let wmErorr = error.asWMError + return Observable.just( + Mutation.showToast(wmErorr.errorDescription ?? LocalizationStrings.unknownErrorWarning) + ) + }, + .just(.updateLoadingState(false)) + ]) + } +} + +/// usecase를 사용하지 않는 +private extension WakmusicPlaylistDetailReactor { + func updateItemSelected(_ index: Int) -> Observable { + let state = currentState + var count = state.selectedCount + var prev = state.dataSource + + if prev[index].isSelected { + count -= 1 + } else { + count += 1 + } + prev[index].isSelected = !prev[index].isSelected + + return .concat([ + .just(Mutation.updateSelectedCount(count)), + .just(Mutation.updateSelectingStateByIndex(prev)) + ]) + } + + func selectAll() -> Observable { + let state = currentState + var dataSource = state.dataSource + + for i in 0 ..< dataSource.count { + dataSource[i].isSelected = true + } + + return .concat([ + .just(.updateDataSource(dataSource)), + .just(.updateSelectedCount(dataSource.count)) + ]) + } + + func deselectAll() -> Observable { + let state = currentState + var dataSource = state.dataSource + + for i in 0 ..< dataSource.count { + dataSource[i].isSelected = false + } + + return .concat([ + .just(.updateDataSource(dataSource)), + .just(.updateSelectedCount(0)) + ]) + } +} diff --git a/Projects/Features/PlaylistFeature/Sources/Service/PlaylistCommonService.swift b/Projects/Features/PlaylistFeature/Sources/Service/PlaylistCommonService.swift new file mode 100644 index 000000000..c712251dc --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/Service/PlaylistCommonService.swift @@ -0,0 +1,14 @@ +import Foundation +import RxSwift +import Utility + +protocol PlaylistCommonService { + var removeSubscriptionPlaylistEvent: Observable { get } +} + +final class DefaultPlaylistCommonService: PlaylistCommonService { + let removeSubscriptionPlaylistEvent: Observable = NotificationCenter.default.rx + .notification(.didRemovedSubscriptionPlaylist) + + static let shared = DefaultPlaylistCommonService() +} diff --git a/Projects/Features/PlaylistFeature/Sources/ViewControllers/CheckPlaylistCoverViewController.swift b/Projects/Features/PlaylistFeature/Sources/ViewControllers/CheckPlaylistCoverViewController.swift new file mode 100644 index 000000000..65e58094c --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/ViewControllers/CheckPlaylistCoverViewController.swift @@ -0,0 +1,227 @@ +import BaseFeature +import BaseFeatureInterface +import DesignSystem +import LogManager +import PlaylistFeatureInterface +import RxCocoa +import RxSwift +import SnapKit +import Then +import UIKit +import Utility + +final class CheckPlaylistCoverViewController: BaseReactorViewController { + weak var delegate: CheckPlaylistCoverDelegate? + + private let textPopupFactory: any TextPopupFactory + + private var wmNavigationbarView: WMNavigationBarView = WMNavigationBarView().then { + $0.setTitle("앨범에서 고르기") + } + + fileprivate let backButton = UIButton().then { + let dismissImage = DesignSystemAsset.Navigation.back.image + .withTintColor(DesignSystemAsset.BlueGrayColor.blueGray900.color, renderingMode: .alwaysOriginal) + $0.setImage(dismissImage, for: .normal) + } + + private var thumnailContainerView: UIView = UIView() + + private lazy var thumbnailImageView: UIImageView = UIImageView().then { + $0.layer.cornerRadius = 32 + $0.clipsToBounds = true + $0.contentMode = .scaleAspectFill + } + + private var guideLineSuperView: UIView = UIView().then { + $0.backgroundColor = DesignSystemAsset.BlueGrayColor.gray100.color + } + + private let guideLineTitleLabel: WMLabel = WMLabel( + text: "유의사항", + textColor: DesignSystemAsset.BlueGrayColor.blueGray600.color, + font: .t5(weight: .medium) + ) + + private lazy var guideLineStackView: UIStackView = UIStackView().then { stackView in + stackView.axis = .vertical + stackView.spacing = 4 + stackView.distribution = .fill + + generateGuideView(guideLines: ["표지를 변경하면 음표 열매가 소모됩니다.", "사진의 용량은 10MB를 초과할 수 없습니다."]).forEach { view in + stackView.addArrangedSubviews(view) + } + } + + private let confirmButton: UIButton = UIButton().then { + $0.setTitle("확인", for: .normal) + $0.setTitleColor(.white, for: .normal) + $0.titleLabel?.font = .setFont(.t4(weight: .medium)) + $0.layer.cornerRadius = 12 + $0.clipsToBounds = true + $0.backgroundColor = DesignSystemAsset.PrimaryColorV2.point.color + } + + deinit { + LogManager.printDebug("❌:: \(Self.self) deinit") + } + + init( + reactor: CheckPlaylistCoverlReactor, + textPopupFactory: any TextPopupFactory, + delegate: any CheckPlaylistCoverDelegate + ) { + self.delegate = delegate + self.textPopupFactory = textPopupFactory + + super.init(reactor: reactor) + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func viewDidLoad() { + super.viewDidLoad() + view.backgroundColor = .white + reactor?.action.onNext(.viewDidLoad) + } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + navigationController?.interactivePopGestureRecognizer?.delegate = self + } + + override func viewDidDisappear(_ animated: Bool) { + super.viewDidDisappear(animated) + navigationController?.interactivePopGestureRecognizer?.delegate = nil + } + + override func addView() { + super.addView() + + view.addSubviews(wmNavigationbarView, thumnailContainerView, guideLineSuperView) + wmNavigationbarView.setLeftViews([backButton]) + thumnailContainerView.addSubviews(thumbnailImageView) + guideLineSuperView.addSubviews(guideLineTitleLabel, guideLineStackView, confirmButton) + } + + override func setLayout() { + super.setLayout() + + wmNavigationbarView.snp.makeConstraints { + $0.top.equalTo(view.safeAreaLayoutGuide) + $0.horizontalEdges.equalToSuperview() + $0.height.equalTo(48) + } + + thumnailContainerView.snp.makeConstraints { + $0.top.equalTo(wmNavigationbarView.snp.bottom) + $0.horizontalEdges.equalToSuperview() + } + + thumbnailImageView.snp.makeConstraints { + $0.leading.trailing.equalToSuperview().inset(20) + $0.height.equalTo(thumbnailImageView.snp.width) + $0.center.equalToSuperview() + } + + guideLineSuperView.snp.makeConstraints { + $0.top.equalTo(thumnailContainerView.snp.bottom) + $0.bottom.horizontalEdges.equalToSuperview() + } + + guideLineTitleLabel.snp.makeConstraints { + $0.top.leading.trailing.equalToSuperview().inset(20) + $0.height.equalTo(24) + } + + guideLineStackView.snp.makeConstraints { + $0.top.equalTo(guideLineTitleLabel.snp.bottom).offset(10) + $0.horizontalEdges.equalToSuperview().inset(20) + } + + confirmButton.snp.makeConstraints { + $0.top.equalTo(guideLineStackView.snp.bottom).offset(20) + $0.horizontalEdges.equalToSuperview().inset(20) + $0.height.equalTo(56) + $0.bottom.equalTo(view.safeAreaLayoutGuide).inset(20) + } + } + + override func bindState(reactor: CheckPlaylistCoverlReactor) { + super.bindState(reactor: reactor) + + let sharedState = reactor.state.share() + + sharedState.map(\.imageData) + .bind(with: self) { owner, data in + owner.thumbnailImageView.image = UIImage(data: data) + } + .disposed(by: disposeBag) + } + + override func bindAction(reactor: CheckPlaylistCoverlReactor) { + super.bindAction(reactor: reactor) + + backButton.rx + .tap + .bind(with: self) { owner, _ in + owner.navigationController?.popViewController(animated: true) + } + .disposed(by: disposeBag) + + confirmButton.rx + .tap + .bind(with: self) { owner, _ in + owner.dismiss(animated: true, completion: { + owner.delegate?.receive(reactor.currentState.imageData) + }) + } + .disposed(by: disposeBag) + } +} + +extension CheckPlaylistCoverViewController { + func generateGuideView(guideLines: [String]) -> [UIView] { + var views: [UIView] = [] + + for gl in guideLines { + let label: WMLabel = WMLabel( + text: "\(gl)", + textColor: DesignSystemAsset.BlueGrayColor.gray500.color, + font: .t7(weight: .light), + alignment: .left, + lineHeight: 18 + ).then { + $0.numberOfLines = 0 + } + + let containerView: UIView = UIView() + let imageView = UIImageView(image: DesignSystemAsset.Playlist.grayDot.image).then { + $0.contentMode = .scaleAspectFit + } + containerView.addSubviews(imageView, label) + + imageView.snp.makeConstraints { + $0.size.equalTo(16) + $0.leading.top.equalToSuperview() + } + label.snp.makeConstraints { + $0.leading.equalTo(imageView.snp.trailing) + $0.top.trailing.bottom.equalToSuperview() + } + + views.append(containerView) + } + + return views + } +} + +extension CheckPlaylistCoverViewController: UIGestureRecognizerDelegate { + func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { + return true + } +} diff --git a/Projects/Features/PlaylistFeature/Sources/ViewControllers/DefaultPlaylistCoverViewController.swift b/Projects/Features/PlaylistFeature/Sources/ViewControllers/DefaultPlaylistCoverViewController.swift new file mode 100644 index 000000000..42f0acae8 --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/ViewControllers/DefaultPlaylistCoverViewController.swift @@ -0,0 +1,227 @@ +import BaseFeature +import DesignSystem +import ImageDomainInterface +import PlaylistFeatureInterface +import SnapKit +import Then +import UIKit + +final class DefaultPlaylistCoverViewController: BaseReactorViewController { + weak var delegate: DefaultPlaylistCoverDelegate? + + private var wmNavigationbarView: WMNavigationBarView = WMNavigationBarView().then { + $0.setTitle("이미지 선택") + } + + private let dismissButton = UIButton().then { + let dismissImage = DesignSystemAsset.MusicDetail.dismiss.image + .withTintColor(DesignSystemAsset.BlueGrayColor.blueGray900.color, renderingMode: .alwaysOriginal) + $0.setImage(dismissImage, for: .normal) + } + + private let shadowImageVIew: UIImageView = UIImageView().then { + $0.contentMode = .scaleToFill + $0.image = DesignSystemAsset.LyricHighlighting.lyricDecoratingBottomShadow.image + } + + private let buttonContainerView: UIView = UIView().then { + $0.backgroundColor = .white + } + + private let confirmButton: UIButton = UIButton().then { + $0.setTitle("확인", for: .normal) + $0.setTitleColor(.white, for: .normal) + $0.titleLabel?.font = .setFont(.t4(weight: .medium)) + $0.layer.cornerRadius = 12 + $0.clipsToBounds = true + $0.backgroundColor = DesignSystemAsset.PrimaryColorV2.point.color + } + + private lazy var collectionView: UICollectionView = createCollectionView() + + private let thumbnailCellRegistration = UICollectionView.CellRegistration< + DefaultThumbnailCell, DefaultImageEntity + > { cell, _, itemIdentifier in + cell.configure(itemIdentifier) + } + + private lazy var thumbnailDiffableDataSource = UICollectionViewDiffableDataSource( + collectionView: collectionView + ) { [thumbnailCellRegistration] collectionView, indexPath, itemIdentifier in + let cell = collectionView.dequeueConfiguredReusableCell( + using: thumbnailCellRegistration, + for: indexPath, + item: itemIdentifier + ) + return cell + } + + init(delegate: DefaultPlaylistCoverDelegate? = nil, reactor: DefaultPlaylistCoverReactor) { + self.delegate = delegate + super.init(reactor: reactor) + } + + override func viewDidLoad() { + super.viewDidLoad() + self.view.backgroundColor = .white + reactor?.action.onNext(.viewDidload) + } + + override func addView() { + super.addView() + + self.view.addSubviews(wmNavigationbarView, collectionView, buttonContainerView) + wmNavigationbarView.setLeftViews([dismissButton]) + + buttonContainerView.addSubviews(shadowImageVIew, confirmButton) + } + + override func setLayout() { + super.setLayout() + + wmNavigationbarView.snp.makeConstraints { + $0.top.equalTo(view.safeAreaLayoutGuide) + $0.horizontalEdges.equalToSuperview() + $0.height.equalTo(48) + } + + collectionView.snp.makeConstraints { + $0.top.equalTo(wmNavigationbarView.snp.bottom) + $0.leading.trailing.equalToSuperview() + } + + buttonContainerView.snp.makeConstraints { + $0.top.equalTo(collectionView.snp.bottom) + $0.bottom.leading.trailing.equalToSuperview() + } + + shadowImageVIew.snp.makeConstraints { + $0.top.equalToSuperview().offset(-14) + $0.leading.trailing.equalToSuperview() + $0.bottom.equalTo(view.snp.bottom) + } + + confirmButton.snp.makeConstraints { + $0.top.equalToSuperview().inset(20) + $0.top.horizontalEdges.equalToSuperview().inset(20) + $0.height.equalTo(56) + $0.bottom.equalTo(view.safeAreaLayoutGuide).inset(20) + } + } + + override func bind(reactor: DefaultPlaylistCoverReactor) { + super.bind(reactor: reactor) + + collectionView.rx + .setDelegate(self) + .disposed(by: disposeBag) + } + + override func bindAction(reactor: DefaultPlaylistCoverReactor) { + super.bindAction(reactor: reactor) + + let sharedState = reactor.state.share() + + dismissButton.rx + .tap + .bind(with: self) { owner, _ in + owner.dismiss(animated: true) + } + .disposed(by: disposeBag) + + confirmButton.rx + .tap + .withLatestFrom(sharedState.map(\.dataSource)) + .withLatestFrom(sharedState.map(\.selectedIndex)) { ($0, $1) } + .bind(with: self) { owner, info in + + let (dataSource, index) = (info.0, info.1) + + let (url, imageName) = (dataSource[index].url, dataSource[index].name) + + owner.dismiss(animated: true) { + owner.delegate?.receive(url: url, imageName: imageName) + } + } + .disposed(by: disposeBag) + } + + override func bindState(reactor: DefaultPlaylistCoverReactor) { + let sharedState = reactor.state.share() + + sharedState.map(\.dataSource) + .distinctUntilChanged() + .filter { !$0.isEmpty } + .bind(with: self) { owner, dataSource in + + var snapShot = NSDiffableDataSourceSnapshot() + + snapShot.appendSections([0]) + + snapShot.appendItems(dataSource) + + owner.thumbnailDiffableDataSource.apply(snapShot) { + owner.collectionView.selectItem( + at: IndexPath(row: 0, section: 0), + animated: false, + scrollPosition: .top + ) + } + } + .disposed(by: disposeBag) + + sharedState.map(\.isLoading) + .distinctUntilChanged() + .bind(with: self) { owner, flag in + + if flag { + owner.indicator.startAnimating() + } else { + owner.indicator.stopAnimating() + } + } + .disposed(by: disposeBag) + } +} + +extension DefaultPlaylistCoverViewController { + private func createCollectionView() -> UICollectionView { + return UICollectionView(frame: .zero, collectionViewLayout: createLayout()) + } + + private func createLayout() -> UICollectionViewLayout { + let layout = UICollectionViewCompositionalLayout { ( + sectionIndex: Int, + layoutEnvironment: NSCollectionLayoutEnvironment + ) -> NSCollectionLayoutSection? in + + let itemSize = NSCollectionLayoutSize( + widthDimension: .fractionalWidth(0.25), + heightDimension: .fractionalWidth(0.25) + ) + + let item = NSCollectionLayoutItem(layoutSize: itemSize) + + let groupSize = NSCollectionLayoutSize( + widthDimension: .fractionalWidth(1.0), + heightDimension: .fractionalWidth(0.25) + ) + + var group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitem: item, count: 4) + + group.interItemSpacing = .fixed(10) + + let section = NSCollectionLayoutSection(group: group) + section.contentInsets = NSDirectionalEdgeInsets(top: 8, leading: 20, bottom: 20, trailing: 20) + + return section + } + return layout + } +} + +extension DefaultPlaylistCoverViewController: UICollectionViewDelegate { + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + reactor?.action.onNext(.selectedIndex(indexPath.row)) + } +} diff --git a/Projects/Features/PlaylistFeature/Sources/ViewControllers/MyPlaylistDetailViewController.swift b/Projects/Features/PlaylistFeature/Sources/ViewControllers/MyPlaylistDetailViewController.swift new file mode 100644 index 000000000..33049bb25 --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/ViewControllers/MyPlaylistDetailViewController.swift @@ -0,0 +1,780 @@ +import BaseFeature +import BaseFeatureInterface +import DesignSystem +import Localization +import LogManager +import NVActivityIndicatorView +import PhotosUI +import PlaylistFeatureInterface +import ReactorKit +import SnapKit +import SongsDomainInterface +import Then +import UIKit +import Utility + +final class MyPlaylistDetailViewController: BaseReactorViewController, + PlaylistEditSheetViewType, SongCartViewType { + private enum Limit { + static let imageSizeLimitPerMB: Double = 10.0 + } + + var playlisteditSheetView: PlaylistEditSheetView! + + var songCartView: SongCartView! + + var bottomSheetView: BottomSheetView! + + private let multiPurposePopupFactory: any MultiPurposePopupFactory + + private let containSongsFactory: any ContainSongsFactory + + private let textPopupFactory: any TextPopupFactory + + private let playlistCoverOptionPopupFactory: any PlaylistCoverOptionPopupFactory + + private let checkPlaylistCoverFactory: any CheckPlaylistCoverFactory + + private let defaultPlaylistCoverFactory: any DefaultPlaylistCoverFactory + + private let songDetailPresenter: any SongDetailPresentable + + private var wmNavigationbarView: WMNavigationBarView = WMNavigationBarView() + + private var lockButton: UIButton = UIButton() + private let lockImage = DesignSystemAsset.Playlist.lock.image + private let unLockImage = DesignSystemAsset.Playlist.unLock.image + + fileprivate let dismissButton = UIButton().then { + let dismissImage = DesignSystemAsset.Navigation.back.image + .withTintColor(DesignSystemAsset.BlueGrayColor.blueGray900.color, renderingMode: .alwaysOriginal) + $0.setImage(dismissImage, for: .normal) + } + + private var moreButton: UIButton = UIButton().then { + $0.setImage(DesignSystemAsset.MyInfo.more.image, for: .normal) + $0.isHidden = true + } + + private var saveCompletionIndicator = NVActivityIndicatorView(frame: .zero).then { + $0.color = DesignSystemAsset.PrimaryColorV2.point.color + $0.type = .circleStrokeSpin + } + + private var headerView: MyPlaylistHeaderView = MyPlaylistHeaderView(frame: .init( + x: .zero, + y: .zero, + width: APP_WIDTH(), + height: 140 + )) + + private lazy var tableView: UITableView = UITableView().then { + $0.backgroundColor = .clear + $0.register(PlaylistTableViewCell.self, forCellReuseIdentifier: PlaylistTableViewCell.identifier) + $0.tableHeaderView = headerView + $0.separatorStyle = .none + $0.contentInset = .init(top: .zero, left: .zero, bottom: 60.0, right: .zero) + } + + private lazy var completionButton: RectangleButton = RectangleButton().then { + $0.setBackgroundColor(.clear, for: .normal) + $0.setColor(isHighlight: true) + $0.setTitle("완료", for: .normal) + $0.titleLabel?.font = .init(font: DesignSystemFontFamily.Pretendard.bold, size: 12) + $0.layer.borderWidth = 1 + $0.layer.cornerRadius = 4 + } + + lazy var dataSource: MyPlaylistDetailDataSource = createDataSource() + + init( + reactor: MyPlaylistDetailReactor, + multiPurposePopupFactory: any MultiPurposePopupFactory, + containSongsFactory: any ContainSongsFactory, + textPopupFactory: any TextPopupFactory, + playlistCoverOptionPopupFactory: any PlaylistCoverOptionPopupFactory, + checkPlaylistCoverFactory: any CheckPlaylistCoverFactory, + defaultPlaylistCoverFactory: any DefaultPlaylistCoverFactory, + songDetailPresenter: any SongDetailPresentable + ) { + self.multiPurposePopupFactory = multiPurposePopupFactory + self.containSongsFactory = containSongsFactory + self.textPopupFactory = textPopupFactory + self.playlistCoverOptionPopupFactory = playlistCoverOptionPopupFactory + self.checkPlaylistCoverFactory = checkPlaylistCoverFactory + self.defaultPlaylistCoverFactory = defaultPlaylistCoverFactory + self.songDetailPresenter = songDetailPresenter + + super.init(reactor: reactor) + } + + deinit { + LogManager.printDebug("❌:: \(Self.self) deinit") + } + + override func viewDidLoad() { + super.viewDidLoad() + LogManager.analytics(CommonAnalyticsLog.viewPage(pageName: .myPlaylistDetail)) + self.view.backgroundColor = DesignSystemAsset.BlueGrayColor.gray100.color + reactor?.action.onNext(.viewDidLoad) + } + + override func viewDidDisappear(_ animated: Bool) { + super.viewDidDisappear(animated) + navigationController?.interactivePopGestureRecognizer?.delegate = nil + hideAll() + } + + override func addView() { + super.addView() + self.view.addSubviews(wmNavigationbarView, tableView, saveCompletionIndicator) + wmNavigationbarView.setLeftViews([dismissButton]) + wmNavigationbarView.setRightViews([lockButton, moreButton, completionButton]) + wmNavigationbarView.addSubview(saveCompletionIndicator) + } + + override func setLayout() { + super.setLayout() + + wmNavigationbarView.snp.makeConstraints { + $0.top.equalTo(view.safeAreaLayoutGuide) + $0.horizontalEdges.equalToSuperview() + $0.height.equalTo(48) + } + + tableView.snp.makeConstraints { + $0.top.equalTo(wmNavigationbarView.snp.bottom).offset(8) + $0.leading.trailing.bottom.equalToSuperview() + } + + completionButton.snp.makeConstraints { + $0.width.equalTo(45) + $0.height.equalTo(24) + } + + saveCompletionIndicator.snp.makeConstraints { + $0.trailing.equalToSuperview().offset(-35) + $0.centerY.equalToSuperview() + $0.size.equalTo(15) + } + } + + override func configureUI() { + super.configureUI() + } + + override func bind(reactor: MyPlaylistDetailReactor) { + super.bind(reactor: reactor) + tableView.rx.setDelegate(self) + .disposed(by: disposeBag) + } + + override func bindAction(reactor: MyPlaylistDetailReactor) { + super.bindAction(reactor: reactor) + + let sharedState = reactor.state.share() + + lockButton.rx + .tap + .asDriver() + .throttle(.seconds(1)) + .drive(onNext: { + LogManager.analytics(PlaylistAnalyticsLog.clickLockButton(id: reactor.key)) + reactor.action.onNext(.privateButtonDidTap) + + }) + .disposed(by: disposeBag) + + dismissButton.rx + .tap + .withLatestFrom(sharedState.map(\.isEditing)) + .bind(with: self) { owner, isEditing in + + let vc = owner.textPopupFactory.makeView( + text: "변경된 내용을 저장할까요?", + cancelButtonIsHidden: false, + confirmButtonText: "확인", + cancelButtonText: "취소" + ) { + reactor.action.onNext(.forceSave) + owner.navigationController?.popViewController(animated: true) + + } cancelCompletion: { + reactor.action.onNext(.restore) + owner.navigationController?.popViewController(animated: true) + } + + if isEditing { + owner.showBottomSheet(content: vc) + } else { + owner.navigationController?.popViewController(animated: true) + } + } + .disposed(by: disposeBag) + + moreButton.rx + .tap + .throttle(.milliseconds(500), latest: false, scheduler: MainScheduler.asyncInstance) + .map { Reactor.Action.moreButtonDidTap } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + completionButton.rx + .tap + .throttle(.seconds(1), latest: false, scheduler: MainScheduler.asyncInstance) + .do(onNext: { _ in + LogManager.analytics(CommonAnalyticsLog.clickEditCompleteButton(location: .playlistDetail)) + }) + .map { Reactor.Action.completionButtonDidTap } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + headerView.rx.editNickNameButtonDidTap + .bind(with: self) { owner, _ in + + guard let reactor = owner.reactor else { + return + } + + let vc = owner.multiPurposePopupFactory.makeView(type: .updatePlaylistTitle, key: reactor.key) { text in + reactor.action.onNext(.changeTitle(text)) + } + + owner.showBottomSheet(content: vc, size: .fixed(296)) + } + .disposed(by: disposeBag) + + headerView.rx.cameraButtonDidTap + .bind(with: self) { owner, _ in + + LogManager.analytics(PlaylistAnalyticsLog.clickPlaylistCameraButton) + let vc = owner.playlistCoverOptionPopupFactory.makeView(delegate: owner) + + owner.showBottomSheet(content: vc, size: .fixed(252 + SAFEAREA_BOTTOM_HEIGHT())) + } + .disposed(by: disposeBag) + + tableView.rx.itemSelected + .bind(with: self) { owner, indexPath in + + guard let model = owner.dataSource.itemIdentifier(for: indexPath) else { return } + + PlayState.shared.append(item: .init(id: model.id, title: model.title, artist: model.artist)) + let playlistIDs = PlayState.shared.currentPlaylist + .map(\.id) + owner.songDetailPresenter.present(ids: playlistIDs, selectedID: model.id) + } + .disposed(by: disposeBag) + } + + override func bindState(reactor: MyPlaylistDetailReactor) { + super.bindState(reactor: reactor) + + let sharedState = reactor.state.share() + let currentState = reactor.currentState + + reactor.pulse(\.$toastMessage) + .bind(with: self) { owner, message in + guard let message = message else { + return + } + owner.showToast( + text: message, + options: currentState.selectedCount == .zero ? [.tabBar] : [.tabBar, .songCart] + ) + } + .disposed(by: disposeBag) + + reactor.pulse(\.$shareLink) + .compactMap { $0 } + .bind(with: self) { owner, link in + + let activityViewController = UIActivityViewController( + activityItems: [URL(string: link)], + applicationActivities: [PlaylistActivity()] + ) + activityViewController.popoverPresentationController?.sourceView = owner.view + activityViewController.popoverPresentationController?.sourceRect = CGRect( + x: owner.view.bounds.midX, + y: owner.view.bounds.midY, + width: 0, + height: 0 + ) + activityViewController.popoverPresentationController?.permittedArrowDirections = [] + owner.present(activityViewController, animated: true) + } + .disposed(by: disposeBag) + + reactor.pulse(\.$notiName) + .compactMap { $0 } + .bind(with: self) { owner, name in + NotificationCenter.default.post(name: name, object: nil) + } + .disposed(by: disposeBag) + + sharedState.map(\.isEditing) + .distinctUntilChanged() + .bind(with: self) { owner, isEditing in + owner.lockButton.isHidden = isEditing + owner.moreButton.isHidden = isEditing + owner.tableView.isEditing = isEditing + owner.headerView.updateEditState(isEditing) + owner.navigationController?.interactivePopGestureRecognizer?.delegate = isEditing ? owner : nil + owner.tableView.reloadData() + + if !isEditing { + owner.hideAll() + } + } + .disposed(by: disposeBag) + + sharedState.map(\.header) + .skip(1) + .distinctUntilChanged() + .bind(with: self) { owner, model in + owner.headerView.updateData(model) + owner.lockButton.setImage(model.private ? owner.lockImage : owner.unLockImage, for: .normal) + } + .disposed(by: disposeBag) + + sharedState.map(\.playlistModels) + .skip(1) + .distinctUntilChanged() + .bind(with: self) { owner, model in + var snapShot = NSDiffableDataSourceSnapshot() + + let warningView = WMWarningView( + text: "리스트에 곡이 없습니다." + ) + + if model.isEmpty { + owner.tableView.setBackgroundView(warningView, APP_HEIGHT() / 3) + } else { + owner.tableView.restore() + } + snapShot.appendSections([0]) + snapShot.appendItems(model) + + owner.dataSource.apply(snapShot, animatingDifferences: false) + } + .disposed(by: disposeBag) + + sharedState.map(\.isLoading) + .distinctUntilChanged() + .bind(with: self) { owner, isLoading in + + if isLoading { + owner.indicator.startAnimating() + owner.tableView.isHidden = true + } else { + owner.indicator.stopAnimating() + owner.tableView.isHidden = false + } + } + .disposed(by: disposeBag) + + sharedState.map(\.isSaveCompletionLoading) + .distinctUntilChanged() + .bind(with: self) { owner, isLoading in + if isLoading { + owner.saveCompletionIndicator.startAnimating() + } else { + owner.saveCompletionIndicator.stopAnimating() + } + } + .disposed(by: disposeBag) + + sharedState.map(\.completionButtonVisible) + .distinctUntilChanged() + .map { !$0 } + .bind(to: completionButton.rx.isHidden) + .disposed(by: disposeBag) + + sharedState.map(\.selectedCount) + .distinctUntilChanged() + .withLatestFrom(sharedState.map(\.header)) { ($0, $1) } + .bind(with: self) { owner, info in + + let (count, limit) = (info.0, info.1.songCount) + + if count == .zero { + owner.hideSongCart() + } else { + owner.showSongCart( + in: owner.view, + type: .myPlaylist, + selectedSongCount: count, + totalSongCount: limit, + useBottomSpace: false + ) + owner.songCartView.delegate = owner + } + } + .disposed(by: disposeBag) + + sharedState.map(\.showEditSheet) + .distinctUntilChanged() + .bind(with: self) { owner, flag in + + if flag { + owner.showplaylistEditSheet(in: owner.view) + owner.playlisteditSheetView?.delegate = owner + } else { + owner.hideplaylistEditSheet() + } + } + .disposed(by: disposeBag) + } +} + +extension MyPlaylistDetailViewController { + func createDataSource() -> MyPlaylistDetailDataSource { + let dataSource = + MyPlaylistDetailDataSource( + reactor: reactor!, + tableView: tableView + ) { + [weak self] tableView, + indexPath, + itemIdentifier in + + guard let self, + let cell = tableView.dequeueReusableCell( + withIdentifier: PlaylistTableViewCell.identifier, + for: indexPath + ) as? PlaylistTableViewCell else { + return UITableViewCell() + } + + cell.delegate = self + cell.setContent( + model: itemIdentifier, + index: indexPath.row, + isEditing: tableView.isEditing, + isSelected: itemIdentifier.isSelected + ) + cell.selectionStyle = .none + + return cell + } + + tableView.dataSource = dataSource + + return dataSource + } + + func hideAll() { + hideplaylistEditSheet() + hideSongCart() + reactor?.action.onNext(.restore) + } + + func navigateToCheckPlaylistCover(imageData: Data) { + if let navigationController = self.presentedViewController as? UINavigationController { + if Double(imageData.count).megabytes > Limit.imageSizeLimitPerMB { + let textPopupVC = self.textPopupFactory.makeView( + text: "사진의 용량은 \(Int(Limit.imageSizeLimitPerMB))MB를 초과할 수 없습니다.\n다른 사진을 선택해 주세요.", + cancelButtonIsHidden: true, + confirmButtonText: nil, + cancelButtonText: nil, + completion: nil, + cancelCompletion: nil + ) + + navigationController.showBottomSheet(content: textPopupVC) + return + } + navigationController.pushViewController( + self.checkPlaylistCoverFactory.makeView(delegate: self, imageData: imageData), + animated: true + ) + } + } +} + +/// 테이블 뷰 델리게이트 +extension MyPlaylistDetailViewController: UITableViewDelegate { + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + return CGFloat(60.0) + } + + func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { + let playbuttonGroupView = PlayButtonGroupView() + playbuttonGroupView.delegate = self + + guard let reactor = reactor else { + return nil + } + + if reactor.currentState.playlistModels.isEmpty { + return nil + } else { + return playbuttonGroupView + } + } + + func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { + guard let reactor = reactor else { + return .zero + } + + if reactor.currentState.playlistModels.isEmpty { + return .zero + } else { + return CGFloat(52.0 + 32.0) + } + } + + func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell + .EditingStyle { + return .none + } + + func tableView(_ tableView: UITableView, shouldIndentWhileEditingRowAt indexPath: IndexPath) -> Bool { + return false // 편집모드 시 셀의 들여쓰기를 없애려면 false를 리턴합니다. + } +} + +/// 전체재생 , 랜덤 재생 델리게이트 +extension MyPlaylistDetailViewController: PlayButtonGroupViewDelegate { + func play(_ event: PlayEvent) { + guard let reactor = reactor else { + return + } + let currentState = reactor.currentState + var songs = currentState.playlistModels + + let playlistName = reactor.currentState.header.title + let title: String + + switch event { + case .allPlay: + LogManager.analytics( + CommonAnalyticsLog.clickPlayButton(location: .playlistDetail, type: .all) + ) + LogManager.analytics(PlaylistAnalyticsLog.clickPlaylistPlayButton(type: "all", key: reactor.key)) + title = "\(playlistName) (전체)" + + case .shufflePlay: + LogManager.analytics( + CommonAnalyticsLog.clickPlayButton(location: .playlistDetail, type: .random) + ) + LogManager.analytics(PlaylistAnalyticsLog.clickPlaylistPlayButton(type: "random", key: reactor.key)) + songs.shuffle() + title = "\(playlistName) (랜덤)" + } + + PlayState.shared.append(contentsOf: songs.map { PlaylistItem(id: $0.id, title: $0.title, artist: $0.artist) }) + + if songs.allSatisfy({ $0.title.isContainShortsTagTitle }) { + WakmusicYoutubePlayer(ids: songs.map { $0.id }, title: "왁타버스 뮤직", playPlatform: .youtube).play() + } else { + WakmusicYoutubePlayer(ids: songs.map { $0.id }, title: "왁타버스 뮤직").play() + } + } +} + +/// 편집모드 시 셀 선택 이벤트 +extension MyPlaylistDetailViewController: PlaylistTableViewCellDelegate { + func playButtonDidTap(model: PlaylistItemModel) { + LogManager.analytics( + CommonAnalyticsLog.clickPlayButton(location: .playlist, type: .single) + ) + WakmusicYoutubePlayer( + id: model.id, + playPlatform: model.title.isContainShortsTagTitle ? .youtube : .automatic + ).play() + } + + func superButtonTapped(index: Int) { + tableView.deselectRow(at: IndexPath(row: index, section: 0), animated: false) + reactor?.action.onNext(.itemDidTap(index)) + } +} + +/// swipe pop 델리게이트 , 편집모드 시 막기 +extension MyPlaylistDetailViewController: UIGestureRecognizerDelegate { + public func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { + return false + } +} + +/// 송카트 델리게이트 +extension MyPlaylistDetailViewController: SongCartViewDelegate { + func buttonTapped(type: SongCartSelectType) { + guard let reactor = reactor else { + return + } + + let currentState = reactor.currentState + + let songs = currentState.playlistModels.filter { $0.isSelected } + + switch type { + case let .allSelect(flag: flag): + if flag { + reactor.action.onNext(.selectAll) + } else { + reactor.action.onNext(.deselectAll) + } + case .addSong: + let log = CommonAnalyticsLog.clickAddMusicsButton(location: .playlistDetail) + LogManager.analytics(log) + + let vc = containSongsFactory + .makeView(songs: songs.map(\.id)) + vc.modalPresentationStyle = .overFullScreen + + self.present(vc, animated: true) + + reactor.action.onNext(.forceEndEditing) + + case .addPlayList: + reactor.action.onNext(.forceEndEditing) + PlayState.shared + .append(contentsOf: songs.map { PlaylistItem(id: $0.id, title: $0.title, artist: $0.artist) }) + showToast( + text: Localization.LocalizationStrings.addList, + options: [.tabBar] + ) + + case .play: + break + case .remove: + + let vc: UIViewController = textPopupFactory.makeView( + text: "\(currentState.selectedCount)곡을 삭제하시겠습니까?", + cancelButtonIsHidden: false, confirmButtonText: "확인", + cancelButtonText: "취소", + completion: { + reactor.action.onNext(.removeSongs) + reactor.action.onNext(.forceEndEditing) + }, cancelCompletion: { + reactor.action.onNext(.forceEndEditing) + } + ) + + self.showBottomSheet(content: vc) + } + } +} + +/// 편집 / 공유 바텀시트 델리게이트 +extension MyPlaylistDetailViewController: PlaylistEditSheetDelegate { + func didTap(_ type: PlaylistEditType) { + switch type { + case .edit: + LogManager.analytics(CommonAnalyticsLog.clickEditButton(location: .playlistDetail)) + reactor?.action.onNext(.editButtonDidTap) + case .share: + LogManager.analytics(PlaylistAnalyticsLog.clickPlaylistShareButton) + reactor?.action.onNext(.shareButtonDidTap) + } + } +} + +extension MyPlaylistDetailViewController: RequestPermissionable { + public func showPhotoLibrary() { + var configuration = PHPickerConfiguration() + configuration.filter = .any(of: [.images]) + configuration.selectionLimit = 1 // 갯수 제한 + + let picker = PHPickerViewController(configuration: configuration) + picker.delegate = self + + let pickerToWrapNavigationController = picker.wrapNavigationController + pickerToWrapNavigationController.modalPresentationStyle = .overFullScreen + pickerToWrapNavigationController.setNavigationBarHidden(true, animated: false) + + self.present(pickerToWrapNavigationController, animated: true) + } +} + +/// 갤러리 신버전 +extension MyPlaylistDetailViewController: PHPickerViewControllerDelegate { + func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) { + if results.isEmpty { + picker.dismiss(animated: true) + return + } + + results.forEach { + let provider = $0.itemProvider + + if provider.canLoadObject(ofClass: UIImage.self) { + provider.loadObject(ofClass: UIImage.self) { [weak self] image, error in + guard let self = self else { return } + if let error = error { + DEBUG_LOG("error: \(error)") + + } else { + DispatchQueue.main.async { + guard let image = image as? UIImage, + let resizeImage = image.customizeForPlaylistCover( + targetSize: CGSize(width: 500, height: 500) + ), + var imageData = resizeImage.jpegData(compressionQuality: 1.0) + else { return } // 80% 압축 + + let sizeMB: Double = Double(imageData.count).megabytes + + if sizeMB > Limit.imageSizeLimitPerMB { + imageData = image.jpegData(compressionQuality: 0.8) ?? imageData + } + self.navigateToCheckPlaylistCover(imageData: imageData) + } + } + } + } + } + } +} + +extension MyPlaylistDetailViewController: PlaylistCoverOptionPopupDelegate { + func didTap(_ index: Int, _ price: Int) { + guard let reactor = reactor else { + return + } + + let state = reactor.currentState + + if index == 0 { + LogManager.analytics(PlaylistAnalyticsLog.clickPlaylistImageButton(type: "default")) + let vc = defaultPlaylistCoverFactory.makeView(self) + vc.modalPresentationStyle = .overFullScreen + + self.present(vc, animated: true) + + } else { + LogManager.analytics( + PlaylistAnalyticsLog.clickPlaylistImageButton(type: "custom") + ) + + guard let user = PreferenceManager.userInfo else { + return + } + + if user.itemCount < price { + showToast( + text: LocalizationStrings.lackOfMoney(price - user.itemCount), options: [.tabBar] + ) + } else { + requestPhotoLibraryPermission() + } + } + } +} + +extension MyPlaylistDetailViewController: CheckPlaylistCoverDelegate { + func receive(_ imageData: Data) { + reactor?.action.onNext(.changeImageData(.custom(data: imageData))) + headerView.updateThumbnailFromGallery(imageData) + } +} + +extension MyPlaylistDetailViewController: DefaultPlaylistCoverDelegate { + func receive(url: String, imageName: String) { + reactor?.action.onNext(.changeImageData(.default(imageName: imageName))) + headerView.updateThumbnailByDefault(url) + } +} diff --git a/Projects/Features/PlaylistFeature/Sources/ViewControllers/PlaylistCoverOptionViewController.swift b/Projects/Features/PlaylistFeature/Sources/ViewControllers/PlaylistCoverOptionViewController.swift new file mode 100644 index 000000000..cf8d93ec1 --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/ViewControllers/PlaylistCoverOptionViewController.swift @@ -0,0 +1,135 @@ +import BaseFeature +import BaseFeatureInterface +import DesignSystem +import PlaylistFeatureInterface +import SnapKit +import Then +import UIKit +import Utility + +final class PlaylistCoverOptionPopupViewController: BaseReactorViewController { + weak var delegate: PlaylistCoverOptionPopupDelegate? + + private let titleLabel: WMLabel = WMLabel( + text: "표지", + textColor: DesignSystemAsset.BlueGrayColor.blueGray900.color, + font: .t2(weight: .bold), + alignment: .center + ) + + private let tableView: UITableView = UITableView().then { + $0.isScrollEnabled = false + $0.register( + PlaylistCoverOptionTableViewCell.self, + forCellReuseIdentifier: PlaylistCoverOptionTableViewCell.identifier + ) + $0.separatorStyle = .none + $0.isHidden = true + } + + private lazy var dataSource: UITableViewDiffableDataSource = createDataSoruce() + + init(reactor: PlaylistCoverOptionPopupReactor, delegate: PlaylistCoverOptionPopupDelegate) { + self.delegate = delegate + super.init(reactor: reactor) + } + + override func viewDidLoad() { + super.viewDidLoad() + view.backgroundColor = .white + tableView.delegate = self + reactor?.action.onNext(.viewDidLoad) + } + + override func addView() { + super.addView() + self.view.addSubviews(titleLabel, tableView) + } + + override func setLayout() { + super.setLayout() + + titleLabel.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview().inset(20) + $0.top.equalToSuperview().inset(32) + $0.height.equalTo(32) + } + + tableView.snp.makeConstraints { + $0.top.equalTo(titleLabel.snp.bottom).offset(16) + $0.horizontalEdges.equalToSuperview() + $0.height.equalTo(80 * 2) + } + } + + override func bindAction(reactor: PlaylistCoverOptionPopupReactor) { + super.bindAction(reactor: reactor) + } + + override func bindState(reactor: PlaylistCoverOptionPopupReactor) { + super.bindState(reactor: reactor) + + let sharedState = reactor.state.share() + + sharedState.map(\.isLoading) + .bind(with: self) { owner, isLoading in + + if isLoading { + owner.indicator.startAnimating() + } else { + owner.indicator.stopAnimating() + } + + owner.tableView.isHidden = isLoading + } + .disposed(by: disposeBag) + + sharedState.map(\.dataSource) + .bind(with: self) { owner, dataSource in + + var snapShot = NSDiffableDataSourceSnapshot() + snapShot.appendSections([0]) + + snapShot.appendItems(dataSource, toSection: 0) + + owner.dataSource.apply(snapShot) + } + .disposed(by: disposeBag) + } +} + +extension PlaylistCoverOptionPopupViewController { + func createDataSoruce() -> UITableViewDiffableDataSource { + return UITableViewDiffableDataSource< + Int, + PlaylistCoverOptionModel + >(tableView: tableView) { tableView, indexPath, itemIdentifier in + guard let cell = tableView.dequeueReusableCell( + withIdentifier: PlaylistCoverOptionTableViewCell.identifier, + for: indexPath + ) as? PlaylistCoverOptionTableViewCell else { + return UITableViewCell() + } + + cell.update(itemIdentifier) + cell.selectionStyle = .none + return cell + } + } +} + +extension PlaylistCoverOptionPopupViewController: UITableViewDelegate { + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + return 80.0 + } + + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + guard let identifier = dataSource.itemIdentifier(for: indexPath) else { + return + } + + self.dismiss(animated: true) { + self.delegate?.didTap(indexPath.row, identifier.price) + } + } +} diff --git a/Projects/Features/PlaylistFeature/Sources/ViewControllers/PlaylistDetailContainerViewController.swift b/Projects/Features/PlaylistFeature/Sources/ViewControllers/PlaylistDetailContainerViewController.swift new file mode 100644 index 000000000..adb200e4e --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/ViewControllers/PlaylistDetailContainerViewController.swift @@ -0,0 +1,159 @@ +import BaseFeature +import BaseFeatureInterface +import DesignSystem +import PlaylistFeatureInterface +import RxSwift +import SnapKit +import Then +import UIKit +import Utility + +final class PlaylistDetailContainerViewController: BaseReactorViewController, + ContainerViewType { + var contentView: UIView! = UIView().then { + $0.backgroundColor = DesignSystemAsset.BlueGrayColor.gray100.color + } + + private var wmNavigationbarView: WMNavigationBarView = WMNavigationBarView() + private let dismissButton = UIButton().then { + let dismissImage = DesignSystemAsset.Navigation.back.image + .withTintColor(DesignSystemAsset.BlueGrayColor.blueGray900.color, renderingMode: .alwaysOriginal) + $0.setImage(dismissImage, for: .normal) + } + + private let unknownPlaylistDetailFactory: any UnknownPlaylistDetailFactory + private let myPlaylistDetailFactory: any MyPlaylistDetailFactory + private let textPopupFactory: any TextPopupFactory + private let key: String + lazy var unknownPlaylistVC = unknownPlaylistDetailFactory.makeView(key: key) + lazy var myPlaylistVC = myPlaylistDetailFactory.makeView(key: key) + + init( + reactor: PlaylistDetailContainerReactor, + key: String, + unknownPlaylistDetailFactory: any UnknownPlaylistDetailFactory, + myPlaylistDetailFactory: any MyPlaylistDetailFactory, + textPopupFactory: any TextPopupFactory + ) { + self.key = key + self.unknownPlaylistDetailFactory = unknownPlaylistDetailFactory + self.myPlaylistDetailFactory = myPlaylistDetailFactory + self.textPopupFactory = textPopupFactory + + super.init(reactor: reactor) + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func viewDidLoad() { + super.viewDidLoad() + } + + override func addView() { + super.addView() + self.view.addSubviews(contentView, wmNavigationbarView) + wmNavigationbarView.setLeftViews([dismissButton]) + } + + override func setLayout() { + super.setLayout() + contentView.snp.makeConstraints { + $0.edges.equalToSuperview() + } + + wmNavigationbarView.snp.makeConstraints { + $0.top.equalTo(view.safeAreaLayoutGuide) + $0.horizontalEdges.equalToSuperview() + $0.height.equalTo(48) + } + } + + override func bind(reactor: PlaylistDetailContainerReactor) { + super.bind(reactor: reactor) + + PreferenceManager.$userInfo + .map(\.?.ID) + .distinctUntilChanged() + .bind(with: self) { owner, userInfo in + + owner.remove(asChildViewController: owner.children.first) + + if userInfo == nil { + reactor.action.onNext(.clearOwnerID) + owner.add(asChildViewController: owner.unknownPlaylistVC) + } else { + reactor.action.onNext(.requestOwnerID) + } + } + .disposed(by: disposeBag) + } + + override func bindAction(reactor: PlaylistDetailContainerReactor) { + super.bindAction(reactor: reactor) + dismissButton.rx + .tap + .bind(with: self) { owner, _ in + owner.navigationController?.popViewController(animated: true) + } + .disposed(by: disposeBag) + } + + override func bindState(reactor: PlaylistDetailContainerReactor) { + super.bindState(reactor: reactor) + + let sharedState = reactor.state.share() + + sharedState.map(\.isLoading) + .distinctUntilChanged() + .bind(with: self) { owner, isLoading in + if isLoading { + owner.indicator.startAnimating() + owner.wmNavigationbarView.isHidden = false + } else { + owner.indicator.stopAnimating() + owner.wmNavigationbarView.isHidden = true + } + }.disposed(by: disposeBag) + + sharedState.map(\.ownerID) + .distinctUntilChanged() + .compactMap { $0 } + .withLatestFrom(PreferenceManager.$userInfo) { ($0, $1) } + .bind(with: self) { owner, info in + + let (ownerID, userInfo) = info + + guard let userInfo else { return } + + owner.remove(asChildViewController: owner.children.first) + + if ownerID == userInfo.decryptedID { + owner.add(asChildViewController: owner.myPlaylistVC) + } else { + owner.add(asChildViewController: owner.unknownPlaylistVC) + } + } + .disposed(by: disposeBag) + + reactor.pulse(\.$detectedNotFound) + .compactMap { $0 } + .bind(with: self) { owner, _ in + let vc = owner.textPopupFactory.makeView( + text: "존재하지 않거나 비공개된 리스트입니다.", + cancelButtonIsHidden: true, + confirmButtonText: "확인", + cancelButtonText: nil, + completion: { + owner.navigationController?.popViewController(animated: true) + }, + cancelCompletion: nil + ) + + owner.showBottomSheet(content: vc, dismissOnOverlayTapAndPull: false) // 드래그로 닫기 불가 + } + .disposed(by: disposeBag) + } +} diff --git a/Projects/Features/PlaylistFeature/Sources/ViewControllers/PlaylistViewController+Delegate.swift b/Projects/Features/PlaylistFeature/Sources/ViewControllers/PlaylistViewController+Delegate.swift new file mode 100644 index 000000000..87eea374e --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/ViewControllers/PlaylistViewController+Delegate.swift @@ -0,0 +1,139 @@ +import BaseFeature +import DesignSystem +import Localization +import LogManager +import UIKit +import Utility + +extension PlaylistViewController: SongCartViewDelegate { + public func buttonTapped(type: SongCartSelectType) { + switch type { + case let .allSelect(flag): + self.isSelectedAllSongs.onNext(flag) + case .addSong: + let log = CommonAnalyticsLog.clickAddMusicsButton(location: .playlist) + LogManager.analytics(log) + + let songs: [String] = Array(output.selectedSongIds.value) + guard let viewController = containSongsFactory.makeView(songs: songs) as? ContainSongsViewController else { + return + } + + let count = songs.count + + if PreferenceManager.userInfo == nil { + let textPopupvc = TextPopupViewController.viewController( + text: LocalizationStrings.needLoginWarning, + cancelButtonIsHidden: false, + completion: { [weak self] in + guard let self else { return } + let log = CommonAnalyticsLog.clickLoginButton(entry: .addMusics) + LogManager.analytics(log) + + let vc = self.signInFactory.makeView() + vc.modalPresentationStyle = .fullScreen + self.present(vc, animated: true) { + self.tappedAddPlaylist.onNext(()) + } + } + ) + self.showBottomSheet(content: textPopupvc) + return + } + viewController.modalPresentationStyle = .overFullScreen + + self.present(viewController, animated: true) { + self.tappedAddPlaylist.onNext(()) + } + + case .remove: + let count: Int = self.viewModel.countOfSelectedSongs + let popup = TextPopupViewController.viewController( + text: "선택한 내 리스트 \(count)곡이 삭제됩니다.", + cancelButtonIsHidden: false, + completion: { [weak self] () in + guard let self else { return } + self.tappedRemoveSongs.onNext(()) + self.hideSongCart() + } + ) + self.showBottomSheet(content: popup) + default: + return + } + } +} + +extension PlaylistViewController: UITableViewDelegate { + public func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell + .EditingStyle { + return .none // 편집모드 시 왼쪽 버튼을 숨기려면 .none을 리턴합니다. + } + + public func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { + 72 + } + + public func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { + let randomPlayButton = RandomPlayButtonHeaderView(frame: .zero) + randomPlayButton.setPlayButtonHandler { [weak self] in + guard let self else { return } + LogManager.analytics( + CommonAnalyticsLog.clickPlayButton(location: .playlist, type: .random) + ) + let songIDs = output.playlists.value + .map(\.id) + .shuffled() + .prefix(50) + if output.playlists.value.allSatisfy({ $0.title.isContainShortsTagTitle }) { + WakmusicYoutubePlayer(ids: Array(songIDs), title: "왁타버스 뮤직 재생목록 (랜덤)", playPlatform: .youtube).play() + } else { + WakmusicYoutubePlayer(ids: Array(songIDs), title: "왁타버스 뮤직 재생목록 (랜덤)").play() + } + } + return randomPlayButton + } + + public func tableView(_ tableView: UITableView, shouldIndentWhileEditingRowAt indexPath: IndexPath) -> Bool { + return false // 편집모드 시 셀의 들여쓰기를 없애려면 false를 리턴합니다. + } + + public func tableView(_ tableView: UITableView, dragIndicatorViewForRowAt indexPath: IndexPath) -> UIView? { + // 편집모드 시 나타나는 오른쪽 Drag Indicator를 변경합니다. + let dragIndicatorView = UIImageView(image: DesignSystemAsset.Player.playLarge.image) + dragIndicatorView.frame = .init(x: 0, y: 0, width: 32, height: 32) + return dragIndicatorView + } + + public func tableView(_ tableView: UITableView, canFocusRowAt indexPath: IndexPath) -> Bool { + return true // 모든 Cell 을 이동 가능하게 설정합니다. + } + + public func tableView( + _ tableView: UITableView, + targetIndexPathForMoveFromRowAt sourceIndexPath: IndexPath, + toProposedIndexPath proposedDestinationIndexPath: IndexPath + ) -> IndexPath { + // 첫 번째 섹션에서만 이동 가능하게 설정합니다. + if proposedDestinationIndexPath.section != 0 { + return sourceIndexPath + } + return proposedDestinationIndexPath + } +} + +extension PlaylistViewController: PlaylistTableViewCellDelegate { + func playButtonDidTap(model: PlaylistItemModel) { + LogManager.analytics( + CommonAnalyticsLog.clickPlayButton(location: .playlist, type: .single) + ) + WakmusicYoutubePlayer( + id: model.id, + playPlatform: model.title.isContainShortsTagTitle ? .youtube : .automatic + ).play() + } + + func superButtonTapped(index: Int) { + tappedCellIndex.onNext(index) + } +} diff --git a/Projects/Features/PlaylistFeature/Sources/ViewControllers/PlaylistViewController.swift b/Projects/Features/PlaylistFeature/Sources/ViewControllers/PlaylistViewController.swift new file mode 100644 index 000000000..2ac0bd8f7 --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/ViewControllers/PlaylistViewController.swift @@ -0,0 +1,314 @@ +import BaseFeature +import BaseFeatureInterface +import Combine +import DesignSystem +import Foundation +import Kingfisher +import LogManager +import RxDataSources +import RxRelay +import RxSwift +import SignInFeatureInterface +import SnapKit +import UIKit +import Utility + +public final class PlaylistViewController: UIViewController, SongCartViewType { + var viewModel: PlaylistViewModel! + var playlistView: PlaylistView! + var playState = PlayState.shared + var subscription = Set() + var disposeBag = DisposeBag() + + var tappedCellIndex = PublishSubject() + var isSelectedAllSongs = PublishSubject() + var tappedAddPlaylist = PublishSubject() + var tappedRemoveSongs = PublishSubject() + + private(set) var containSongsFactory: any ContainSongsFactory + private(set) var songDetailPresenter: any SongDetailPresentable + private(set) var textPopupFactory: any TextPopupFactory + private(set) var signInFactory: any SignInFactory + + public var songCartView: BaseFeature.SongCartView! + public var bottomSheetView: BaseFeature.BottomSheetView! + + private lazy var panGestureRecognizer = UIPanGestureRecognizer( + target: self, + action: #selector(handlePanGesture(_:)) + ) + + lazy var input = PlaylistViewModel.Input( + viewWillAppearEvent: self.rx.methodInvoked(#selector(UIViewController.viewWillAppear)).map { _ in }, + viewWillDisappearEvent: self.rx.methodInvoked(#selector(UIViewController.viewWillDisappear(_:))).map { _ in }, + closeButtonDidTapEvent: playlistView.closeButton.tapPublisher, + editButtonDidTapEvent: playlistView.editButton.tapPublisher, + playlistTableviewCellDidTapEvent: playlistView.playlistTableView.rx.itemSelected.asObservable(), + playlistTableviewCellDidTapInEditModeEvent: tappedCellIndex.asObservable(), + selectAllSongsButtonDidTapEvent: isSelectedAllSongs.asObservable(), + addPlaylistButtonDidTapEvent: tappedAddPlaylist.asObservable(), + removeSongsButtonDidTapEvent: tappedRemoveSongs.asObservable(), + itemMovedEvent: playlistView.playlistTableView.rx.itemMoved.asObservable() + ) + lazy var output = self.viewModel.transform(from: input) + + private let currentSongID: String? + + init( + currentSongID: String?, + viewModel: PlaylistViewModel, + containSongsFactory: ContainSongsFactory, + songDetailPresenter: any SongDetailPresentable, + textPopupFactory: any TextPopupFactory, + signInFactory: any SignInFactory + ) { + self.currentSongID = currentSongID + self.containSongsFactory = containSongsFactory + self.songDetailPresenter = songDetailPresenter + self.signInFactory = signInFactory + self.textPopupFactory = textPopupFactory + self.viewModel = viewModel + super.init(nibName: nil, bundle: nil) + } + + deinit { + LogManager.printDebug("❌ PlaylistVC deinit") + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("PlaylistViewController has not been implemented") + } + + override public func loadView() { + super.loadView() + playlistView = PlaylistView(frame: self.view.frame) + self.view.addSubview(playlistView) + self.playlistView.titleBarView.addGestureRecognizer(panGestureRecognizer) + } + + override public func viewDidLoad() { + super.viewDidLoad() + playlistView.playlistTableView.rx.setDelegate(self).disposed(by: disposeBag) + bindViewModel() + bindActions() + } + + override public func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + let log = CommonAnalyticsLog.viewPage(pageName: .playlist) + LogManager.analytics(log) + } + + override public func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + // Comment: 재생목록 화면이 사라지는 시점에서 DB에 저장된 리스트로 업데이트 + // 편집 완료를 했으면 이미 DB가 업데이트 됐을거고, 아니면 이전 DB데이터로 업데이트 + // Comment: 재생목록 화면이 사라지는 시점에서 곡 담기 팝업이 올라와 있는 상태면 제거 + guard self.songCartView != nil else { return } + self.hideSongCart() + } +} + +private extension PlaylistViewController { + @objc func handlePanGesture(_ gestureRecognizer: UIPanGestureRecognizer) { + let distance = gestureRecognizer.translation(in: self.view) + let screenHeight = Utility.APP_HEIGHT() + + switch gestureRecognizer.state { + case .began: + return + + case .changed: + let distanceY = max(distance.y, 0) + view.frame = CGRect(x: 0, y: distanceY, width: view.frame.width, height: screenHeight) + // let opacity = 1 - (distanceY / screenHeight) + // updateOpacity(value: Float(opacity)) + + case .ended: + let velocity = gestureRecognizer.velocity(in: self.view) + + // 빠르게 드래그하거나 화면의 40% 이상 드래그 했을 경우 dismiss + if velocity.y > 1000 || view.frame.origin.y > (screenHeight * 0.4) { + dismiss(animated: true) + } else { + UIView.animate( + withDuration: 0.35, + delay: 0.0, + usingSpringWithDamping: 0.8, + initialSpringVelocity: 0.8, + options: [.curveEaseInOut], + animations: { + self.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: screenHeight) + self.updateOpacity(value: 1) + } + ) + } + + default: + break + } + } + + func updateOpacity(value: Float) { + playlistView.layer.opacity = value + } +} + +private extension PlaylistViewController { + private func bindViewModel() { + bindCountOfSongs(output: output) + bindPlaylistTableView(output: output) + bindSongCart(output: output) + bindCloseButton(output: output) + } + + private func bindCountOfSongs(output: PlaylistViewModel.Output) { + output.countOfSongs.sink { [weak self] count in + guard let self else { return } + self.playlistView.countLabel.text = count == 0 ? "" : String(count) + }.store(in: &subscription) + } + + private func bindPlaylistTableView(output: PlaylistViewModel.Output) { + output.editState.sink { [weak self] isEditing in + guard let self else { return } + self.playlistView.titleLabel.text = isEditing ? "재생목록 편집" : "재생목록" + self.playlistView.editButton.setTitle(isEditing ? "완료" : "편집", for: .normal) + self.playlistView.editButton.setColor(isHighlight: isEditing) + self.playlistView.playlistTableView.setEditing(isEditing, animated: true) + self.playlistView.playlistTableView.reloadData() + }.store(in: &subscription) + + output.playlists + .map { [PlaylistSectionModel.init(model: 0, items: $0)] } + .do(afterNext: { [currentSongID, tableView = playlistView.playlistTableView] playListSectionModel in + guard let currentSongID else { return } + guard + let sectionIndex = playListSectionModel.firstIndex(where: { model in + model.items.contains(where: { $0.id == currentSongID }) + }), + let itemIndex = playListSectionModel[safe: sectionIndex]?.items + .firstIndex(where: { $0.id == currentSongID }) + else { return } + let index = IndexPath(row: itemIndex, section: sectionIndex) + DispatchQueue.main.async { + tableView.scrollToRow(at: index, at: .middle, animated: false) + } + }) + .bind(to: playlistView.playlistTableView.rx.items(dataSource: createDatasources(output: output))) + .disposed(by: disposeBag) + + output.playlists + .bind(with: playlistView) { playlistView, playlists in + if playlists.isEmpty { + let space = APP_HEIGHT() - STATUS_BAR_HEGHIT() - 48 - 56 - SAFEAREA_BOTTOM_HEIGHT() + let height = space / 3 * 2 + let warningView = WarningView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: height)) + warningView.text = "곡이 없습니다." + playlistView.playlistTableView.tableFooterView = warningView + } else { + playlistView.playlistTableView.tableFooterView = nil + } + } + .disposed(by: disposeBag) + + output.playlists + .map { $0.isEmpty } + .bind(to: playlistView.editButton.rx.isHidden) + .disposed(by: disposeBag) + + playlistView.playlistTableView.rx.itemSelected + .withLatestFrom(output.playlists) { ($0, $1) } + .map { $0.1[$0.0.row] } + .bind(with: self, onNext: { [songDetailPresenter] owner, item in + let currentSongs = output.playlists.value + .map(\.id) + + owner.dismiss(animated: true) { + songDetailPresenter.present( + ids: Array(currentSongs), + selectedID: item.id + ) + } + }) + .disposed(by: disposeBag) + } + + private func bindSongCart(output: PlaylistViewModel.Output) { + output.selectedSongIds + .skip(1) + .withLatestFrom(output.playlists) { ($0, $1) } + .map { songs, dataSource -> (songs: Set, dataSourceCount: Int) in + return (songs, dataSource.count) + } + .subscribe(onNext: { [weak self] songs, dataSourceCount in + guard let self = self else { return } + self.playlistView.playlistTableView.reloadData() + self.playlistView.willShowSongCart(isShow: !songs.isEmpty) + switch songs.isEmpty { + case true: + self.hideSongCart() + case false: + self.showSongCart( + in: self.view, + type: .playlist, + selectedSongCount: songs.count, + totalSongCount: dataSourceCount, + useBottomSpace: true + ) + self.songCartView?.delegate = self + } + }).disposed(by: disposeBag) + } + + private func bindCloseButton(output: PlaylistViewModel.Output) { + output.shouldClosePlaylist.sink { [weak self] _ in + self?.dismiss(animated: true) + }.store(in: &subscription) + } +} + +private extension PlaylistViewController { + private func bindActions() {} +} + +extension PlaylistViewController { + private func createDatasources( + output: PlaylistViewModel + .Output + ) -> RxTableViewSectionedReloadDataSource { + let datasource = RxTableViewSectionedReloadDataSource( + configureCell: { [weak self] _, tableView, indexPath, model -> UITableViewCell in + guard let self else { return UITableViewCell() } + guard let cell = tableView.dequeueReusableCell( + withIdentifier: PlaylistTableViewCell.identifier, + for: IndexPath(row: indexPath.row, section: 0) + ) as? PlaylistTableViewCell + else { return UITableViewCell() } + + cell.delegate = self + cell.selectionStyle = .none + + let index = indexPath.row + let isEditing = output.editState.value + + cell.setContent( + model: model, + index: index, + isEditing: isEditing, + isSelected: output.selectedSongIds.value.contains(model.id) + ) + return cell + + }, + canEditRowAtIndexPath: { _, _ -> Bool in + return true + }, + canMoveRowAtIndexPath: { _, _ -> Bool in + return true + } + ) + return datasource + } +} diff --git a/Projects/Features/PlaylistFeature/Sources/ViewControllers/UnknownPlaylistDetailViewController.swift b/Projects/Features/PlaylistFeature/Sources/ViewControllers/UnknownPlaylistDetailViewController.swift new file mode 100644 index 000000000..bc71b8c9d --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/ViewControllers/UnknownPlaylistDetailViewController.swift @@ -0,0 +1,458 @@ +import BaseFeature +import BaseFeatureInterface +import DesignSystem +import Localization +import LogManager +import PhotosUI +import ReactorKit +import SignInFeatureInterface +import SnapKit +import SongsDomainInterface +import Then +import UIKit +import Utility + +final class UnknownPlaylistDetailViewController: BaseReactorViewController, + SongCartViewType { + var songCartView: SongCartView! + + var bottomSheetView: BottomSheetView! + + private let containSongsFactory: any ContainSongsFactory + + private let songDetailPresenter: any SongDetailPresentable + + private let signInFactory: any SignInFactory + + private var wmNavigationbarView: WMNavigationBarView = WMNavigationBarView() + + fileprivate let dismissButton = UIButton().then { + let dismissImage = DesignSystemAsset.Navigation.back.image + .withTintColor(DesignSystemAsset.BlueGrayColor.blueGray900.color, renderingMode: .alwaysOriginal) + $0.setImage(dismissImage, for: .normal) + } + + private var headerView: UnknownPlaylistHeaderView = UnknownPlaylistHeaderView(frame: .init( + x: .zero, + y: .zero, + width: APP_WIDTH(), + height: 140 + )) + + private lazy var tableView: UITableView = UITableView().then { + $0.backgroundColor = .clear + $0.register(PlaylistDateTableViewCell.self, forCellReuseIdentifier: PlaylistDateTableViewCell.identifier) + $0.tableHeaderView = headerView + $0.separatorStyle = .none + $0.contentInset = .init(top: .zero, left: .zero, bottom: 60.0, right: .zero) + } + + private lazy var subscriptionButton: RectangleButton = RectangleButton().then { + $0.setBackgroundColor(.clear, for: .normal) + $0.setColor(isHighlight: true) + $0.isHidden = true + $0.setTitle("구독", for: .normal) + $0.titleLabel?.font = .setFont(.t7(weight: .bold)) + $0.layer.borderWidth = 1 + $0.layer.cornerRadius = 4 + } + + lazy var dataSource: UnknownPlaylistDetailDataSource = createDataSource() + + init( + reactor: UnknownPlaylistDetailReactor, + containSongsFactory: any ContainSongsFactory, + songDetailPresenter: any SongDetailPresentable, + signInFactory: any SignInFactory + ) { + self.containSongsFactory = containSongsFactory + self.songDetailPresenter = songDetailPresenter + self.signInFactory = signInFactory + super.init(reactor: reactor) + } + + override func viewDidLoad() { + super.viewDidLoad() + self.view.backgroundColor = DesignSystemAsset.BlueGrayColor.gray100.color + reactor?.action.onNext(.viewDidLoad) + } + + override public func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + navigationController?.interactivePopGestureRecognizer?.delegate = nil + LogManager.analytics(CommonAnalyticsLog.viewPage(pageName: .unknownPlaylistDetail)) + } + + override func viewDidDisappear(_ animated: Bool) { + super.viewDidDisappear(animated) + + hideAll() + } + + override func addView() { + super.addView() + self.view.addSubviews(wmNavigationbarView, tableView) + wmNavigationbarView.setLeftViews([dismissButton]) + wmNavigationbarView.setRightViews([subscriptionButton]) + } + + override func setLayout() { + super.setLayout() + + wmNavigationbarView.snp.makeConstraints { + $0.top.equalTo(view.safeAreaLayoutGuide) + $0.horizontalEdges.equalToSuperview() + $0.height.equalTo(48) + } + + tableView.snp.makeConstraints { + $0.top.equalTo(wmNavigationbarView.snp.bottom).offset(8) + $0.leading.trailing.bottom.equalToSuperview() + } + + subscriptionButton.snp.makeConstraints { + $0.width.equalTo(45) + $0.height.equalTo(24) + $0.bottom.equalToSuperview().offset(-5) + } + } + + override func configureUI() { + super.configureUI() + } + + override func bind(reactor: UnknownPlaylistDetailReactor) { + super.bind(reactor: reactor) + tableView.rx.setDelegate(self) + .disposed(by: disposeBag) + } + + override func bindAction(reactor: UnknownPlaylistDetailReactor) { + super.bindAction(reactor: reactor) + + dismissButton.rx + .tap + .bind(with: self) { owner, _ in + owner.navigationController?.popViewController(animated: true) + } + .disposed(by: disposeBag) + + subscriptionButton.rx + .tap + .asDriver() + .throttle(.seconds(1)) + .drive(onNext: { + reactor.action.onNext(.subscriptionButtonDidTap) + LogManager.analytics(PlaylistAnalyticsLog.clickPlaylistSubscriptionButton(key: reactor.key)) + + }) + .disposed(by: disposeBag) + } + + override func bindState(reactor: UnknownPlaylistDetailReactor) { + super.bindState(reactor: reactor) + + let sharedState = reactor.state.share() + + let currentState = reactor.currentState + reactor.pulse(\.$toastMessage) + .bind(with: self) { owner, message in + + guard let message = message else { + return + } + + owner.showToast( + text: message, + options: currentState.selectedCount == .zero ? [.tabBar] : [.tabBar, .songCart] + ) + } + .disposed(by: disposeBag) + + reactor.pulse(\.$showLoginPopup) + .filter { $0.0 } + .bind(with: self) { owner, param in + let vc = TextPopupViewController.viewController( + text: LocalizationStrings.needLoginWarning, + cancelButtonIsHidden: false, + completion: { () in + if let entry = param.1 { + let log = CommonAnalyticsLog.clickLoginButton(entry: entry) + LogManager.analytics(log) + } + + let vc = owner.signInFactory.makeView() + vc.modalPresentationStyle = .fullScreen + owner.present(vc, animated: true) + } + ) + owner.showBottomSheet(content: vc) + } + .disposed(by: disposeBag) + + reactor.pulse(\.$refresh) + .compactMap { $0 } + .bind { _ in + NotificationCenter.default.post(name: .shouldRefreshPlaylist, object: nil) + } + .disposed(by: disposeBag) + + sharedState.map(\.header) + .skip(1) + .distinctUntilChanged() + .bind(with: self) { owner, model in + + owner.headerView.updateData(model) + } + .disposed(by: disposeBag) + + sharedState.map(\.dataSource) + .skip(1) + .distinctUntilChanged() + .bind(with: self) { owner, model in + var snapShot = NSDiffableDataSourceSnapshot() + + let warningView = WMWarningView( + text: "리스트에 곡이 없습니다." + ) + + if model.isEmpty { + owner.tableView.setBackgroundView(warningView, APP_HEIGHT() / 3) + } else { + owner.tableView.restore() + } + snapShot.appendSections([0]) + snapShot.appendItems(model) + + owner.dataSource.apply(snapShot, animatingDifferences: false) + } + .disposed(by: disposeBag) + + sharedState.map(\.isLoading) + .distinctUntilChanged() + .bind(with: self) { owner, isLoading in + + if isLoading { + owner.indicator.startAnimating() + owner.tableView.isHidden = true + } else { + owner.indicator.stopAnimating() + owner.tableView.isHidden = false + owner.subscriptionButton.isHidden = false + } + } + .disposed(by: disposeBag) + + sharedState.map(\.isSubscribing) + .distinctUntilChanged() + .asObservable() + .observe(on: MainScheduler.asyncInstance) + .bind(with: self) { owner, flag in + owner.subscriptionButton.setColor(isHighlight: !flag) + owner.subscriptionButton.snp.updateConstraints { + $0.width.equalTo(!flag ? 45.0 : 57.0) + } + + owner.subscriptionButton.setTitle(flag ? "구독 중" : "구독", for: .normal) + } + .disposed(by: disposeBag) + + sharedState.map(\.selectedCount) + .distinctUntilChanged() + .withLatestFrom(sharedState.map(\.header)) { ($0, $1) } + .bind(with: self) { owner, info in + + let (count, limit) = (info.0, info.1.songCount) + + if count == .zero { + owner.hideSongCart() + } else { + owner.showSongCart( + in: owner.view, + type: .WMPlaylist, + selectedSongCount: count, + totalSongCount: limit, + useBottomSpace: false + ) + owner.songCartView.delegate = owner + } + } + .disposed(by: disposeBag) + } +} + +extension UnknownPlaylistDetailViewController { + func createDataSource() -> UnknownPlaylistDetailDataSource { + let dataSource = + UnknownPlaylistDetailDataSource( + tableView: tableView + ) { [weak self] tableView, indexPath, itemIdentifier in + + guard let self, let cell = tableView.dequeueReusableCell( + withIdentifier: PlaylistDateTableViewCell.identifier, + for: indexPath + ) as? PlaylistDateTableViewCell else { + return UITableViewCell() + } + cell.delegate = self + cell.update(itemIdentifier) + cell.selectionStyle = .none + + return cell + } + + tableView.dataSource = dataSource + + return dataSource + } + + func hideAll() { + hideSongCart() + reactor?.action.onNext(.deselectAll) + } +} + +/// 테이블 뷰 델리게이트 +extension UnknownPlaylistDetailViewController: UITableViewDelegate { + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + return CGFloat(60.0) + } + + func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { + let playbuttonGroupView = PlayButtonGroupView() + playbuttonGroupView.delegate = self + + guard let reactor = reactor else { + return nil + } + + if reactor.currentState.dataSource.isEmpty { + return nil + } else { + return playbuttonGroupView + } + } + + func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { + guard let reactor = reactor else { + return .zero + } + + if reactor.currentState.dataSource.isEmpty { + return .zero + } else { + return CGFloat(52.0 + 32.0) + } + } + + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + reactor?.action.onNext(.itemDidTap(indexPath.row)) + } +} + +extension UnknownPlaylistDetailViewController: PlaylistDateTableViewCellDelegate { + func thumbnailDidTap(key: String) { + guard let tappedSong = reactor?.currentState.dataSource + .first(where: { $0.id == key }) + else { return } + PlayState.shared.append(item: .init(id: tappedSong.id, title: tappedSong.title, artist: tappedSong.artist)) + let playlistIDs = PlayState.shared.currentPlaylist + .map(\.id) + songDetailPresenter.present(ids: playlistIDs, selectedID: key) + } +} + +/// 전체재생 , 랜덤 재생 델리게이트 +extension UnknownPlaylistDetailViewController: PlayButtonGroupViewDelegate { + func play(_ event: PlayEvent) { + guard let reactor = reactor else { + return + } + let currentState = reactor.currentState + var songs = currentState.dataSource + + let playlistName = reactor.currentState.header.title + let title: String + + switch event { + case .allPlay: + LogManager.analytics( + CommonAnalyticsLog.clickPlayButton(location: .playlistDetail, type: .all) + ) + LogManager.analytics(PlaylistAnalyticsLog.clickPlaylistPlayButton(type: "all", key: reactor.key)) + title = "\(playlistName) (전체)" + + case .shufflePlay: + LogManager.analytics( + CommonAnalyticsLog.clickPlayButton(location: .playlistDetail, type: .random) + ) + LogManager.analytics(PlaylistAnalyticsLog.clickPlaylistPlayButton(type: "random", key: reactor.key)) + songs.shuffle() + title = "\(playlistName) (랜덤)" + } + + PlayState.shared.append(contentsOf: songs.map { PlaylistItem(item: $0) }) + if songs.allSatisfy({ $0.title.isContainShortsTagTitle }) { + WakmusicYoutubePlayer(ids: songs.map { $0.id }, title: title, playPlatform: .youtube).play() + } else { + WakmusicYoutubePlayer(ids: songs.map { $0.id }, title: title).play() + } + } +} + +/// 송카트 델리게이트 +extension UnknownPlaylistDetailViewController: SongCartViewDelegate { + func buttonTapped(type: SongCartSelectType) { + guard let reactor = reactor else { + return + } + + let currentState = reactor.currentState + + let songs = currentState.dataSource.filter { $0.isSelected } + + switch type { + case let .allSelect(flag: flag): + if flag { + reactor.action.onNext(.selectAll) + } else { + reactor.action.onNext(.deselectAll) + } + case .addSong: + let log = CommonAnalyticsLog.clickAddMusicsButton(location: .playlistDetail) + LogManager.analytics(log) + + if PreferenceManager.userInfo == nil { + reactor.action.onNext(.requestLoginRequiredAction(source: .addMusics)) + return + } + + let vc = containSongsFactory.makeView(songs: songs.map { $0.id }) + vc.modalPresentationStyle = .fullScreen + self.present(vc, animated: true) + reactor.action.onNext(.deselectAll) + + case .addPlayList: + PlayState.shared.append(contentsOf: songs.map { PlaylistItem(item: $0) }) + reactor.action.onNext(.deselectAll) + showToast( + text: Localization.LocalizationStrings.addList, + options: [.tabBar] + ) + + case .play: + LogManager.analytics( + CommonAnalyticsLog.clickPlayButton(location: .playlistDetail, type: .multiple) + ) + if songs.allSatisfy({ $0.title.isContainShortsTagTitle }) { + WakmusicYoutubePlayer(ids: songs.map { $0.id }, title: "왁타버스 뮤직", playPlatform: .youtube).play() + } else { + WakmusicYoutubePlayer(ids: songs.map { $0.id }, title: "왁타버스 뮤직").play() + } + reactor.action.onNext(.deselectAll) + + case .remove: + break + } + } +} diff --git a/Projects/Features/PlaylistFeature/Sources/ViewControllers/WakmusicPlaylistDetailViewController.swift b/Projects/Features/PlaylistFeature/Sources/ViewControllers/WakmusicPlaylistDetailViewController.swift new file mode 100644 index 000000000..649588138 --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/ViewControllers/WakmusicPlaylistDetailViewController.swift @@ -0,0 +1,413 @@ +import BaseFeature +import BaseFeatureInterface +import DesignSystem +import Localization +import LogManager +import PhotosUI +import ReactorKit +import SignInFeatureInterface +import SnapKit +import SongsDomainInterface +import Then +import UIKit +import Utility + +final class WakmusicPlaylistDetailViewController: BaseReactorViewController, + SongCartViewType { + var songCartView: SongCartView! + + var bottomSheetView: BottomSheetView! + + private let containSongsFactory: any ContainSongsFactory + + private let textPopupFactory: any TextPopupFactory + + private let songDetailPresenter: any SongDetailPresentable + + private let signInFactory: any SignInFactory + + private var wmNavigationbarView: WMNavigationBarView = WMNavigationBarView() + + fileprivate let dismissButton = UIButton().then { + let dismissImage = DesignSystemAsset.Navigation.back.image + .withTintColor(DesignSystemAsset.BlueGrayColor.blueGray900.color, renderingMode: .alwaysOriginal) + $0.setImage(dismissImage, for: .normal) + } + + private var headerView: WakmusicPlaylistHeaderView = WakmusicPlaylistHeaderView(frame: .init( + x: .zero, + y: .zero, + width: APP_WIDTH(), + height: 140 + )) + + private lazy var tableView: UITableView = UITableView().then { + $0.backgroundColor = .clear + $0.register(PlaylistDateTableViewCell.self, forCellReuseIdentifier: PlaylistDateTableViewCell.identifier) + $0.tableHeaderView = headerView + $0.separatorStyle = .none + $0.contentInset = .init(top: .zero, left: .zero, bottom: 60.0, right: .zero) + } + + lazy var dataSource: UnknownPlaylistDetailDataSource = createDataSource() + + init( + reactor: WakmusicPlaylistDetailReactor, + containSongsFactory: any ContainSongsFactory, + textPopupFactory: any TextPopupFactory, + songDetailPresenter: any SongDetailPresentable, + signInFactory: any SignInFactory + ) { + self.containSongsFactory = containSongsFactory + self.textPopupFactory = textPopupFactory + self.songDetailPresenter = songDetailPresenter + self.signInFactory = signInFactory + + super.init(reactor: reactor) + } + + override func viewDidLoad() { + super.viewDidLoad() + self.view.backgroundColor = DesignSystemAsset.BlueGrayColor.gray100.color + reactor?.action.onNext(.viewDidLoad) + } + + override public func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + navigationController?.interactivePopGestureRecognizer?.delegate = nil + LogManager + .analytics(CommonAnalyticsLog.viewPage(pageName: .wakmusicPlaylistDetail)) + } + + override func viewDidDisappear(_ animated: Bool) { + super.viewDidDisappear(animated) + + hideAll() + } + + override func addView() { + super.addView() + self.view.addSubviews(wmNavigationbarView, tableView) + wmNavigationbarView.setLeftViews([dismissButton]) + } + + override func setLayout() { + super.setLayout() + + wmNavigationbarView.snp.makeConstraints { + $0.top.equalTo(view.safeAreaLayoutGuide) + $0.horizontalEdges.equalToSuperview() + $0.height.equalTo(48) + } + + tableView.snp.makeConstraints { + $0.top.equalTo(wmNavigationbarView.snp.bottom).offset(8) + $0.leading.trailing.bottom.equalToSuperview() + } + } + + override func configureUI() { + super.configureUI() + } + + override func bind(reactor: WakmusicPlaylistDetailReactor) { + super.bind(reactor: reactor) + tableView.rx.setDelegate(self) + .disposed(by: disposeBag) + } + + override func bindAction(reactor: WakmusicPlaylistDetailReactor) { + super.bindAction(reactor: reactor) + + let sharedState = reactor.state.share() + + dismissButton.rx + .tap + .bind(with: self) { owner, _ in + owner.navigationController?.popViewController(animated: true) + } + .disposed(by: disposeBag) + } + + override func bindState(reactor: WakmusicPlaylistDetailReactor) { + super.bindState(reactor: reactor) + + let sharedState = reactor.state.share() + + let currentState = reactor.currentState + + reactor.pulse(\.$toastMessage) + .bind(with: self) { owner, message in + + guard let message = message else { + return + } + + owner.showToast( + text: message, + options: currentState.selectedCount == .zero ? [.tabBar] : [.tabBar, .songCart] + ) + } + .disposed(by: disposeBag) + + reactor.pulse(\.$showLoginPopup) + .filter { $0 } + .bind(with: self) { owner, _ in + let vc = TextPopupViewController.viewController( + text: LocalizationStrings.needLoginWarning, + cancelButtonIsHidden: false, + completion: { () in + let vc = owner.signInFactory.makeView() + vc.modalPresentationStyle = .fullScreen + owner.present(vc, animated: true) + } + ) + + owner.showBottomSheet(content: vc) + } + .disposed(by: disposeBag) + + sharedState.map(\.header) + .skip(1) + .distinctUntilChanged() + .bind(with: self) { owner, model in + owner.headerView.updateData(model) + } + .disposed(by: disposeBag) + + sharedState.map(\.dataSource) + .skip(1) + .distinctUntilChanged() + .bind(with: self) { owner, model in + var snapShot = NSDiffableDataSourceSnapshot() + + let warningView = WMWarningView( + text: "리스트에 곡이 없습니다." + ) + + if model.isEmpty { + owner.tableView.setBackgroundView(warningView, APP_HEIGHT() / 3) + } else { + owner.tableView.restore() + } + snapShot.appendSections([0]) + snapShot.appendItems(model) + + owner.dataSource.apply(snapShot, animatingDifferences: false) + } + .disposed(by: disposeBag) + + sharedState.map(\.isLoading) + .distinctUntilChanged() + .bind(with: self) { owner, isLoading in + + if isLoading { + owner.indicator.startAnimating() + owner.tableView.isHidden = true + } else { + owner.indicator.stopAnimating() + owner.tableView.isHidden = false + } + } + .disposed(by: disposeBag) + + sharedState.map(\.selectedCount) + .distinctUntilChanged() + .withLatestFrom(sharedState.map(\.header)) { ($0, $1) } + .bind(with: self) { owner, info in + + let (count, limit) = (info.0, info.1.songCount) + + if count == .zero { + owner.hideSongCart() + } else { + owner.showSongCart( + in: owner.view, + type: .WMPlaylist, + selectedSongCount: count, + totalSongCount: limit, + useBottomSpace: false + ) + owner.songCartView.delegate = owner + } + } + .disposed(by: disposeBag) + } +} + +extension WakmusicPlaylistDetailViewController { + func createDataSource() -> UnknownPlaylistDetailDataSource { + let dataSource = + UnknownPlaylistDetailDataSource( + tableView: tableView + ) { [weak self] tableView, indexPath, itemIdentifier in + + guard let self, let cell = tableView.dequeueReusableCell( + withIdentifier: PlaylistDateTableViewCell.identifier, + for: indexPath + ) as? PlaylistDateTableViewCell else { + return UITableViewCell() + } + + cell.delegate = self + cell.update(itemIdentifier) + cell.selectionStyle = .none + + return cell + } + + tableView.dataSource = dataSource + + return dataSource + } + + func hideAll() { + hideSongCart() + reactor?.action.onNext(.deselectAll) + } +} + +/// 테이블 뷰 델리게이트 +extension WakmusicPlaylistDetailViewController: UITableViewDelegate { + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + return CGFloat(60.0) + } + + func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { + let view = SingleActionButtonView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: 78)) + view.delegate = self + view.setTitleAndImage(text: "전체재생", image: DesignSystemAsset.Chart.allPlay.image) + + guard let reactor = reactor else { + return nil + } + + if reactor.currentState.dataSource.isEmpty { + return nil + } else { + return view + } + } + + func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { + guard let reactor = reactor else { + return .zero + } + + if reactor.currentState.dataSource.isEmpty { + return .zero + } else { + return CGFloat(52.0 + 32.0) + } + } + + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + reactor?.action.onNext(.itemDidTap(indexPath.row)) + } +} + +extension WakmusicPlaylistDetailViewController: SingleActionButtonViewDelegate { + func tappedButtonAction() { + guard let currentState = self.reactor?.currentState, let playlistURL = currentState.playlistURL, + let url = URL(string: playlistURL) else { + showToast(text: "해당 기능은 준비 중입니다.", options: [.tabBar]) + return + } + + let songs = currentState.dataSource + + LogManager.analytics(PlaylistAnalyticsLog.clickPlaylistPlayButton(type: "all", key: reactor?.key ?? "")) + PlayState.shared.append(contentsOf: songs.map { PlaylistItem(item: $0) }) + if let components = URLComponents(url: url, resolvingAgainstBaseURL: false), + let listID = components.queryItems?.first(where: { $0.name == "list" })?.value { + WakmusicYoutubePlayer(listID: listID).play() + } + } +} + +extension WakmusicPlaylistDetailViewController: PlaylistDateTableViewCellDelegate { + func thumbnailDidTap(key: String) { + guard let tappedSong = reactor?.currentState.dataSource + .first(where: { $0.id == key }) + else { return } + PlayState.shared.append(item: .init(id: tappedSong.id, title: tappedSong.title, artist: tappedSong.artist)) + let playlistIDs = PlayState.shared.currentPlaylist + .map(\.id) + songDetailPresenter.present(ids: playlistIDs, selectedID: key) + } +} + +/// 송카트 델리게이트 +extension WakmusicPlaylistDetailViewController: SongCartViewDelegate { + func buttonTapped(type: SongCartSelectType) { + guard let reactor = reactor else { + return + } + + let currentState = reactor.currentState + let songs = currentState.dataSource.filter { $0.isSelected } + let limit = 50 + + switch type { + case let .allSelect(flag: flag): + if flag { + reactor.action.onNext(.selectAll) + } else { + reactor.action.onNext(.deselectAll) + } + case .addSong: + let log = CommonAnalyticsLog.clickAddMusicsButton(location: .playlistDetail) + LogManager.analytics(log) + + guard songs.count <= limit else { + showToast( + text: LocalizationStrings.overFlowContainWarning(songs.count - limit), + options: [.tabBar, .songCart] + ) + return + } + + if PreferenceManager.userInfo == nil { + reactor.action.onNext(.requestLoginRequiredAction) + return + } + + let vc = containSongsFactory.makeView(songs: songs.map { $0.id }) + vc.modalPresentationStyle = .overFullScreen + self.present(vc, animated: true) + reactor.action.onNext(.deselectAll) + + case .addPlayList: + + PlayState.shared.append(contentsOf: songs.map { PlaylistItem(item: $0) }) + reactor.action.onNext(.deselectAll) + showToast( + text: Localization.LocalizationStrings.addList, + options: [.tabBar] + ) + + case .play: + + guard songs.count <= limit else { + showToast( + text: LocalizationStrings.overFlowPlayWarning(songs.count - limit), + options: [.tabBar, .songCart] + ) + return + } + LogManager.analytics( + CommonAnalyticsLog.clickPlayButton(location: .playlistDetail, type: .multiple) + ) + PlayState.shared.append(contentsOf: songs.map { PlaylistItem(item: $0) }) + if songs.allSatisfy({ $0.title.isContainShortsTagTitle }) { + WakmusicYoutubePlayer(ids: songs.map { $0.id }, title: "왁타버스 뮤직", playPlatform: .youtube).play() + } else { + WakmusicYoutubePlayer(ids: songs.map { $0.id }, title: "왁타버스 뮤직").play() + } + reactor.action.onNext(.deselectAll) + + case .remove: + break + } + } +} diff --git a/Projects/Features/PlaylistFeature/Sources/ViewModels/PlaylistViewModel.swift b/Projects/Features/PlaylistFeature/Sources/ViewModels/PlaylistViewModel.swift new file mode 100644 index 000000000..f51be9027 --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/ViewModels/PlaylistViewModel.swift @@ -0,0 +1,216 @@ +import BaseFeature +import Combine +import Foundation +import LogManager +import RxDataSources +import RxRelay +import RxSwift +import Utility + +internal typealias PlaylistSectionModel = SectionModel + +final class PlaylistViewModel: ViewModelType { + struct Input { + let viewWillAppearEvent: Observable + let viewWillDisappearEvent: Observable + let closeButtonDidTapEvent: AnyPublisher + let editButtonDidTapEvent: AnyPublisher + let playlistTableviewCellDidTapEvent: Observable + let playlistTableviewCellDidTapInEditModeEvent: Observable + let selectAllSongsButtonDidTapEvent: Observable + let addPlaylistButtonDidTapEvent: Observable + let removeSongsButtonDidTapEvent: Observable + let itemMovedEvent: Observable<(sourceIndex: IndexPath, destinationIndex: IndexPath)> + } + + struct Output { + var shouldClosePlaylist = PassthroughSubject() + var editState = CurrentValueSubject(false) + let playlists: BehaviorRelay<[PlaylistItemModel]> = BehaviorRelay(value: []) + let selectedSongIds: BehaviorRelay> = BehaviorRelay(value: []) + let countOfSongs = CurrentValueSubject(0) + } + + private let playState = PlayState.shared + var isEditing = false + internal var countOfSelectedSongs = 0 + private var subscription = Set() + private var disposeBag = DisposeBag() + + init() { + LogManager.printDebug("✅ PlaylistViewModel 생성") + } + + deinit { + LogManager.printDebug("❌ PlaylistViewModel deinit") + } + + func transform(from input: Input) -> Output { + let output = Output() + + bindInput(input: input, output: output) + bindTableView(output: output) + + output.selectedSongIds + .map { $0.count } + .subscribe(onNext: { [weak self] count in + self?.countOfSelectedSongs = count + }).disposed(by: disposeBag) + + return output + } + + private func bindInput(input: Input, output: Output) { + input.viewWillAppearEvent.subscribe { [playState] _ in + let currentPlaylist = playState.currentPlaylist + output.playlists.accept(currentPlaylist.toModel(selectedIds: [])) + output.countOfSongs.send(currentPlaylist.count) + }.disposed(by: disposeBag) + + input.closeButtonDidTapEvent.sink { _ in + output.shouldClosePlaylist.send() + }.store(in: &subscription) + + input.editButtonDidTapEvent.sink { [weak self] _ in + guard let self else { return } + let log = if !self.isEditing { + CommonAnalyticsLog.clickEditButton(location: .playlist) + } else { + CommonAnalyticsLog.clickEditCompleteButton(location: .playlist) + } + LogManager.analytics(log) + + self.isEditing.toggle() + output.editState.send(self.isEditing) + }.store(in: &subscription) + + input.playlistTableviewCellDidTapEvent + .filter { _ in output.editState.value == false } + .subscribe(onNext: { indexPath in + }) + .disposed(by: disposeBag) + + input.playlistTableviewCellDidTapInEditModeEvent + .withLatestFrom(output.playlists, resultSelector: { tappedIndex, dataSource in + return dataSource[tappedIndex] + }) + .withLatestFrom(output.selectedSongIds) { selectedPlaylistItem, selectedSongIds in + var mutableSelectedSongIds = selectedSongIds + if mutableSelectedSongIds.contains(selectedPlaylistItem.id) { + mutableSelectedSongIds.remove(selectedPlaylistItem.id) + } else { + mutableSelectedSongIds.insert(selectedPlaylistItem.id) + } + return mutableSelectedSongIds + } + .bind(to: output.selectedSongIds) + .disposed(by: disposeBag) + + input.selectAllSongsButtonDidTapEvent + .withLatestFrom(output.playlists) { ($0, $1) } + .compactMap { flag, dataSource -> [String]? in + return flag ? dataSource.map(\.id) : [] + } + .map { Set($0) } + .bind(to: output.selectedSongIds) + .disposed(by: disposeBag) + + input.addPlaylistButtonDidTapEvent + .withUnretained(self) + .subscribe(onNext: { owner, _ in + output.selectedSongIds.accept([]) + output.editState.send(false) + owner.isEditing = false + }) + .disposed(by: disposeBag) + + input.removeSongsButtonDidTapEvent + .withLatestFrom(output.selectedSongIds) + .withUnretained(self) + .subscribe(onNext: { owner, selectedIds in + if selectedIds.count == output.playlists.value.count { + output.playlists.accept([]) + output.selectedSongIds.accept([]) + output.editState.send(false) + output.shouldClosePlaylist.send() + } else { + let removedPlaylists = output.playlists.value + .filter { !selectedIds.contains($0.id) } + output.playlists.accept(removedPlaylists) + output.selectedSongIds.accept([]) + } + owner.isEditing = false + output.countOfSongs.send(output.playlists.value.count) + }).disposed(by: disposeBag) + + input.itemMovedEvent + .map { (sourceIndex: $0.row, destIndex: $1.row) } + .subscribe { (sourceIndex: Int, destIndex: Int) in + var playlists = output.playlists.value + let movedData = playlists[sourceIndex] + playlists.remove(at: sourceIndex) + playlists.insert(movedData, at: destIndex) + output.playlists.accept(playlists) + }.disposed(by: disposeBag) + } + + private func bindTableView(output: Output) { + /* + VM.dataSource -> PlayState.playlist.list를 바라보는 구조 + playlist.list에 변경이 일어날 때,list 를 dataSource 에 pull + */ + + // playlist.list에 변경이 일어날 때, 변경사항 pull + playState.listChangedPublisher.sink { [weak self] _ in + self?.pullForOriginalPlaylist(output: output) + }.store(in: &subscription) + + // 편집 종료 시, 셀 선택 초기화 + output.editState + .dropFirst() + .filter { $0 == false } + .sink { [playState] _ in + output.selectedSongIds.accept([]) + playState.update(contentsOf: output.playlists.value.toPlayStateItem()) + }.store(in: &subscription) + } + + private func pullForOriginalPlaylist(output: Output) { + let originalPlaylist = playState.currentPlaylist + let playlistModelFromOriginal = originalPlaylist.map { item in + PlaylistItemModel( + id: item.id, + title: item.title, + artist: item.artist, + isSelected: output.selectedSongIds.value.contains(item.id) + ) + } + + let localPlaylist = output.playlists.value + + if playlistModelFromOriginal != localPlaylist { + output.playlists.accept(localPlaylist) + } + } +} + +private extension [BaseFeature.PlaylistItem] { + func toModel(selectedIds: Set) -> [PlaylistItemModel] { + self.map { item in + PlaylistItemModel( + id: item.id, + title: item.title, + artist: item.artist, + isSelected: selectedIds.contains(item.id) + ) + } + } +} + +private extension [PlaylistItemModel] { + func toPlayStateItem() -> [PlaylistItem] { + self.map { item in + PlaylistItem(id: item.id, title: item.title, artist: item.artist) + } + } +} diff --git a/Projects/Features/PlaylistFeature/Sources/Views/DefaultThumbnailCell.swift b/Projects/Features/PlaylistFeature/Sources/Views/DefaultThumbnailCell.swift new file mode 100644 index 000000000..68a23d71e --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/Views/DefaultThumbnailCell.swift @@ -0,0 +1,48 @@ +import DesignSystem +import ImageDomainInterface +import Kingfisher +import SnapKit +import Then +import UIKit + +final class DefaultThumbnailCell: UICollectionViewCell { + override var isSelected: Bool { + willSet(newValue) { + imageView.layer.borderWidth = newValue ? 2 : 0 + } + } + + private let imageView: UIImageView = UIImageView().then { + $0.contentMode = .scaleAspectFill + $0.layer.cornerRadius = 6 + $0.clipsToBounds = true + $0.layer.borderColor = DesignSystemAsset.PrimaryColorV2.point.color.cgColor + } + + override init(frame: CGRect) { + super.init(frame: frame) + addViews() + setLayout() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +extension DefaultThumbnailCell { + private func addViews() { + self.contentView.addSubview(imageView) + } + + private func setLayout() { + imageView.snp.makeConstraints { + $0.edges.equalToSuperview() + } + } + + public func configure(_ model: DefaultImageEntity) { + imageView.kf.setImage(with: URL(string: model.url), options: [.transition(.fade(0.2))]) + } +} diff --git a/Projects/Features/PlaylistFeature/Sources/Views/MyPlaylistHeaderView.swift b/Projects/Features/PlaylistFeature/Sources/Views/MyPlaylistHeaderView.swift new file mode 100644 index 000000000..8b3a73cf5 --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/Views/MyPlaylistHeaderView.swift @@ -0,0 +1,166 @@ +import DesignSystem +import Kingfisher +import RxCocoa +import RxSwift +import SnapKit +import Then +import UIKit + +private protocol MyPlaylistHeaderStateProtocol { + func updateEditState(_ isEditing: Bool) + func updateData(_ model: PlaylistDetailHeaderModel) + func updateThumbnailFromGallery(_ data: Data) + func updateThumbnailByDefault(_ url: String) +} + +private protocol MyPlaylistHeaderActionProtocol { + var editNickNameButtonDidTap: Observable { get } + var cameraButtonDidTap: Observable { get } +} + +final class MyPlaylistHeaderView: UIView { + fileprivate let tapGestureRecognizer = UITapGestureRecognizer() + + private var thumbnailImageView: UIImageView = UIImageView().then { + $0.layer.cornerRadius = 12 + $0.clipsToBounds = true + $0.contentMode = .scaleAspectFill + } + + private let cameraContainerView: UIView = UIView().then { + $0.backgroundColor = DesignSystemAsset.BlueGrayColor.blueGray900.color.withAlphaComponent(0.8) + $0.layer.cornerRadius = 12 + $0.clipsToBounds = true + } + + private let cameraImageView: UIImageView = UIImageView().then { + $0.image = DesignSystemAsset.Storage.camera.image + $0.contentMode = .scaleAspectFill + } + + private let containerView: UIView = UIView().then { + $0.backgroundColor = DesignSystemAsset.BlueGrayColor.blueGray25.color.withAlphaComponent(0.4) + $0.layer.borderWidth = 1 + $0.layer.cornerRadius = 8 + $0.layer.borderColor = UIColor.white.cgColor + $0.clipsToBounds = true + } + + private let titleLabel: WMLabel = WMLabel( + text: "", + textColor: DesignSystemAsset.BlueGrayColor.blueGray900.color, + font: .t3(weight: .bold), + lineHeight: UIFont.WMFontSystem.t3(weight: .bold).lineHeight + ).then { + $0.numberOfLines = 0 + } + + let countLabel: WMLabel = WMLabel( + text: "", + textColor: DesignSystemAsset.BlueGrayColor.blueGray600.color, + font: .t6_1(weight: .light), + lineHeight: UIFont.WMFontSystem.t6_1(weight: .light).lineHeight + ) + + let editNickNameButton: UIButton = UIButton().then { + var image = DesignSystemAsset.Storage.storageEdit.image + $0.setImage(image, for: .normal) + } + + override init(frame: CGRect) { + super.init(frame: frame) + + addView() + setLayout() + bindAction() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +extension MyPlaylistHeaderView { + private func addView() { + self.addSubviews(thumbnailImageView, containerView, cameraContainerView) + cameraContainerView.addSubviews(cameraImageView) + containerView.addSubviews(titleLabel, countLabel, editNickNameButton) + } + + private func setLayout() { + thumbnailImageView.snp.makeConstraints { + $0.width.height.equalTo(140) + $0.top.bottom.equalToSuperview() + $0.leading.equalToSuperview().inset(20) + } + + cameraContainerView.snp.makeConstraints { + $0.width.height.equalTo(140) + $0.verticalEdges.horizontalEdges.equalTo(thumbnailImageView) + } + + cameraImageView.snp.makeConstraints { + $0.width.height.equalTo(32) + $0.center.equalToSuperview() + } + + containerView.snp.makeConstraints { + $0.leading.equalTo(thumbnailImageView.snp.trailing).offset(8) + $0.top.bottom.equalToSuperview() + $0.trailing.equalToSuperview().inset(20) + } + + titleLabel.snp.makeConstraints { + $0.top.equalToSuperview().inset(12) + $0.horizontalEdges.equalToSuperview().inset(16) + } + + countLabel.snp.makeConstraints { + $0.top.equalTo(titleLabel.snp.bottom).offset(8) + $0.leading.equalTo(titleLabel.snp.leading) + } + + editNickNameButton.snp.makeConstraints { + $0.width.height.equalTo(24) + $0.leading.equalTo(countLabel.snp.trailing).offset(4) + $0.centerY.equalTo(countLabel.snp.centerY) + } + } + + private func bindAction() { + cameraContainerView.addGestureRecognizer(tapGestureRecognizer) + cameraImageView.isUserInteractionEnabled = true + } +} + +extension MyPlaylistHeaderView: MyPlaylistHeaderStateProtocol { + func updateData(_ model: PlaylistDetailHeaderModel) { + titleLabel.text = model.title + countLabel.text = "\(model.songCount)곡" + thumbnailImageView.kf.setImage(with: URL(string: model.image)) + } + + func updateEditState(_ isEditing: Bool) { + editNickNameButton.isHidden = !isEditing + cameraContainerView.isHidden = !isEditing + } + + func updateThumbnailFromGallery(_ data: Data) { + thumbnailImageView.image = UIImage(data: data) + } + + func updateThumbnailByDefault(_ url: String) { + thumbnailImageView.kf.setImage(with: URL(string: url)) + } +} + +extension Reactive: MyPlaylistHeaderActionProtocol where Base: MyPlaylistHeaderView { + var editNickNameButtonDidTap: Observable { + base.editNickNameButton.rx.tap.asObservable() + } + + var cameraButtonDidTap: Observable { + base.tapGestureRecognizer.rx.event.map { _ in }.asObservable() + } +} diff --git a/Projects/Features/PlaylistFeature/Sources/Views/PlayListView.swift b/Projects/Features/PlaylistFeature/Sources/Views/PlayListView.swift new file mode 100644 index 000000000..b49ad6757 --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/Views/PlayListView.swift @@ -0,0 +1,157 @@ +// +// PlaylistView.swift +// PlayerFeature +// +// Created by YoungK on 2023/02/28. +// Copyright © 2023 yongbeomkwak. All rights reserved. +// + +import DesignSystem +import Foundation +import SnapKit +import Then +import UIKit +import Utility + +public final class PlaylistView: UIView { + private lazy var backgroundView = UIView().then { + $0.backgroundColor = DesignSystemAsset.BlueGrayColor.gray100.color + } + + private lazy var contentView = UIView() + + internal lazy var titleBarView = UIView() + + internal lazy var closeButton = UIButton().then { + $0.setImage(DesignSystemAsset.Navigation.close.image, for: .normal) + $0.tintColor = .systemGray + } + + internal lazy var titleCountStackView = UIStackView(arrangedSubviews: [titleLabel, countLabel]).then { + $0.axis = .horizontal + $0.distribution = .fill + $0.spacing = 4 + } + + lazy var titleLabel = WMLabel( + text: "재생목록", + textColor: DesignSystemAsset.BlueGrayColor.gray900.color, + font: .t5(weight: .medium), + alignment: .center, + lineHeight: UIFont.WMFontSystem.t5().lineHeight, + kernValue: -0.5 + ) + + lazy var countLabel = WMLabel( + text: "재생목록", + textColor: DesignSystemAsset.PrimaryColor.point.color, + font: .t4(weight: .bold), + alignment: .center, + lineHeight: UIFont.WMFontSystem.t4().lineHeight, + kernValue: -0.5 + ) + + internal lazy var editButton = RectangleButton(type: .custom).then { + $0.setBackgroundColor(.clear, for: .normal) + $0.setColor(isHighlight: false) + $0.setTitle("편집", for: .normal) + $0.titleLabel?.font = .init(font: DesignSystemFontFamily.Pretendard.bold, size: 12) + $0.layer.borderWidth = 1 + $0.layer.cornerRadius = 4 + } + + internal lazy var playlistTableView = UITableView().then { + $0.register(PlaylistTableViewCell.self, forCellReuseIdentifier: PlaylistTableViewCell.identifier) + $0.separatorStyle = .none + $0.rowHeight = 60 + $0.estimatedRowHeight = 60 + $0.sectionHeaderTopPadding = 0 + $0.backgroundColor = DesignSystemAsset.BlueGrayColor.blueGray100.color + $0.showsVerticalScrollIndicator = true + } + + override init(frame: CGRect) { + super.init(frame: frame) + configureUI() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + } +} + +private extension PlaylistView { + private func configureUI() { + self.backgroundColor = .clear // 가장 뒷배경 + self.configureSubViews() + self.configureBackground() + self.configureContent() + self.configureTitleBar() + self.configurePlaylist() + } + + private func configureSubViews() { + self.addSubview(backgroundView) + self.addSubview(contentView) + contentView.addSubview(titleBarView) + titleBarView.addSubview(closeButton) + titleBarView.addSubview(titleCountStackView) + titleBarView.addSubview(editButton) + contentView.addSubview(playlistTableView) + } + + private func configureBackground() { + backgroundView.snp.makeConstraints { + $0.top.horizontalEdges.equalToSuperview() + $0.bottom.equalToSuperview().offset(-SAFEAREA_BOTTOM_HEIGHT()) + } + } + + private func configureContent() { + contentView.snp.makeConstraints { + $0.top.equalToSuperview().offset(Utility.STATUS_BAR_HEGHIT()) + $0.bottom.equalToSuperview() + $0.horizontalEdges.equalToSuperview() + } + } + + private func configureTitleBar() { + titleBarView.snp.makeConstraints { + $0.top.left.right.equalToSuperview() + $0.height.equalTo(48) + } + + closeButton.snp.makeConstraints { + $0.width.height.equalTo(32) + $0.left.equalToSuperview().offset(20) + $0.centerY.equalToSuperview() + } + + titleCountStackView.snp.makeConstraints { + $0.centerX.centerY.equalToSuperview() + } + + editButton.snp.makeConstraints { + $0.width.equalTo(45) + $0.height.equalTo(24) + $0.right.equalToSuperview().offset(-20) + $0.centerY.equalToSuperview() + } + } + + private func configurePlaylist() { + playlistTableView.snp.makeConstraints { + $0.top.equalTo(titleBarView.snp.bottom) + $0.horizontalEdges.equalToSuperview() + $0.bottom.equalToSuperview() + } + } +} + +extension PlaylistView { + func willShowSongCart(isShow: Bool) { + let bottom: CGFloat = isShow ? 56 : 0 + playlistTableView.verticalScrollIndicatorInsets = UIEdgeInsets(top: 0, left: 0, bottom: bottom, right: 0) + playlistTableView.contentInset = .init(top: 0, left: 0, bottom: bottom, right: 0) + } +} diff --git a/Projects/Features/PlaylistFeature/Sources/Views/PlaylistDateTableViewCell.swift b/Projects/Features/PlaylistFeature/Sources/Views/PlaylistDateTableViewCell.swift new file mode 100644 index 000000000..89412273d --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/Views/PlaylistDateTableViewCell.swift @@ -0,0 +1,144 @@ +import DesignSystem +import Kingfisher +import Lottie +import SnapKit +import SongsDomainInterface +import Then +import UIKit +import Utility + +internal protocol PlaylistDateTableViewCellDelegate: AnyObject { + func thumbnailDidTap(key: String) +} + +final class PlaylistDateTableViewCell: UITableViewCell { + static let identifier = "PlaylistTableViewCell" + + private var model: SongEntity? + weak var delegate: PlaylistDateTableViewCellDelegate? + + private lazy var thumbnailImageView = UIImageView().then { + $0.image = DesignSystemAsset.Player.dummyThumbnailSmall.image + $0.contentMode = .scaleAspectFill + $0.layer.cornerRadius = 4 + $0.clipsToBounds = true + } + + private lazy var thumbnailButton = UIButton() + + private lazy var titleArtistStackView = UIStackView(arrangedSubviews: [titleLabel, artistLabel]).then { + $0.axis = .vertical + $0.distribution = .fill + } + + private lazy var titleLabel = WMLabel( + text: "곡 제목", + textColor: DesignSystemAsset.BlueGrayColor.gray900.color, + font: .t6(weight: .medium), + alignment: .left, + lineHeight: UIFont.WMFontSystem.t6().lineHeight, + kernValue: -0.5 + ).then { + $0.lineBreakMode = .byTruncatingTail + } + + private lazy var artistLabel = WMLabel( + text: "아티스트명", + textColor: DesignSystemAsset.BlueGrayColor.gray900.color, + font: .t7(weight: .light), + alignment: .left, + lineHeight: UIFont.WMFontSystem.t7().lineHeight, + kernValue: -0.5 + ).then { + $0.lineBreakMode = .byTruncatingTail + } + + private lazy var dateLabel = WMLabel( + text: "날짜", + textColor: DesignSystemAsset.BlueGrayColor.gray900.color, + font: .t7(weight: .score3Light), + alignment: .right, + lineHeight: UIFont.WMFontSystem.t7().lineHeight, + kernValue: -0.5 + ).then { + $0.lineBreakMode = .byTruncatingTail + } + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + addViews() + setLayout() + addAction() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("") + } + + private func addViews() { + self.contentView.addSubviews( + self.thumbnailImageView, + self.thumbnailButton, + self.titleArtistStackView, + self.dateLabel + ) + } + + private func setLayout() { + let height = 40 + let width = height * 16 / 9 + thumbnailImageView.snp.makeConstraints { + $0.centerY.equalTo(contentView.snp.centerY) + $0.left.equalTo(contentView.snp.left).offset(20) + $0.width.equalTo(width) + $0.height.equalTo(height) + } + + thumbnailButton.snp.makeConstraints { + $0.centerY.equalTo(thumbnailImageView) + $0.left.equalTo(thumbnailImageView) + $0.width.equalTo(width) + $0.height.equalTo(height) + } + + titleArtistStackView.snp.makeConstraints { + $0.top.equalTo(thumbnailImageView.snp.top) + $0.left.equalTo(thumbnailImageView.snp.right).offset(8) + $0.right.equalTo(dateLabel.snp.left).offset(-16) + $0.bottom.equalTo(thumbnailImageView.snp.bottom) + } + + dateLabel.snp.makeConstraints { + $0.width.lessThanOrEqualTo(66) + $0.centerY.equalToSuperview() + $0.trailing.equalToSuperview().inset(20) + } + } + + private func addAction() { + thumbnailButton.addAction { [weak self] in + + guard let model = self?.model else { return } + + self?.delegate?.thumbnailDidTap(key: model.id) + } + } +} + +extension PlaylistDateTableViewCell { + func update(_ model: SongEntity) { + self.model = model + + self.thumbnailImageView.kf.setImage( + with: URL(string: Utility.WMImageAPI.fetchYoutubeThumbnail(id: model.id).toString), + placeholder: DesignSystemAsset.Logo.placeHolderSmall.image, + options: [.transition(.fade(0.2))] + ) + + self.titleLabel.text = model.title + self.artistLabel.text = model.artist + self.dateLabel.text = model.date + self.backgroundColor = model.isSelected ? DesignSystemAsset.BlueGrayColor.gray200.color : UIColor.clear + } +} diff --git a/Projects/Features/PlaylistFeature/Sources/Views/PlaylistTableViewCell.swift b/Projects/Features/PlaylistFeature/Sources/Views/PlaylistTableViewCell.swift new file mode 100644 index 000000000..58c4db485 --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/Views/PlaylistTableViewCell.swift @@ -0,0 +1,175 @@ +import DesignSystem +import Kingfisher +import Lottie +import RxGesture +import RxSwift +import SnapKit +import SongsDomainInterface +import Then +import UIKit +import Utility + +internal protocol PlaylistTableViewCellDelegate: AnyObject { + func superButtonTapped(index: Int) + func playButtonDidTap(model: PlaylistItemModel) +} + +internal class PlaylistTableViewCell: UITableViewCell { + static let identifier = "PlaylistTableViewCell" + + internal lazy var thumbnailImageView = UIImageView().then { + $0.image = DesignSystemAsset.Player.dummyThumbnailSmall.image + $0.contentMode = .scaleAspectFill + $0.layer.cornerRadius = 4 + $0.clipsToBounds = true + } + + internal lazy var titleArtistStackView = UIStackView(arrangedSubviews: [titleLabel, artistLabel]).then { + $0.axis = .vertical + $0.distribution = .fill + } + + lazy var titleLabel = WMLabel( + text: "곡 제목", + textColor: DesignSystemAsset.BlueGrayColor.gray900.color, + font: .t6(weight: .medium), + alignment: .left, + lineHeight: UIFont.WMFontSystem.t6().lineHeight, + kernValue: -0.5 + ).then { + $0.lineBreakMode = .byTruncatingTail + } + + lazy var artistLabel = WMLabel( + text: "아티스트명", + textColor: DesignSystemAsset.BlueGrayColor.gray900.color, + font: .t7(weight: .light), + alignment: .left, + lineHeight: UIFont.WMFontSystem.t7().lineHeight, + kernValue: -0.5 + ).then { + $0.lineBreakMode = .byTruncatingTail + } + + internal lazy var playImageView = UIImageView().then { + $0.image = DesignSystemAsset.Player.playLarge.image + $0.layer.shadowColor = UIColor(red: 0.03, green: 0.06, blue: 0.2, alpha: 0.04).cgColor + $0.layer.shadowOpacity = 1.0 + $0.layer.shadowOffset = CGSize(width: 0, height: 5.33) + $0.layer.shadowRadius = 5.33 + } + + internal lazy var superButton = UIButton() + internal weak var delegate: PlaylistTableViewCellDelegate? + + internal var model: (index: Int, model: PlaylistItemModel?) = (0, nil) + + internal var isAnimating: Bool = false + private let disposeBag = DisposeBag() + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + configureContents() + bindAction() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("") + } + + override func prepareForReuse() { + super.prepareForReuse() + } + + private func configureContents() { + self.backgroundColor = .clear + self.contentView.addSubview(self.thumbnailImageView) + self.contentView.addSubview(self.titleArtistStackView) + self.contentView.addSubview(self.playImageView) + self.contentView.addSubview(self.superButton) + + let height = 40 + let width = height * 16 / 9 + thumbnailImageView.snp.makeConstraints { + $0.centerY.equalTo(contentView.snp.centerY) + $0.left.equalTo(contentView.snp.left).offset(20) + $0.width.equalTo(width) + $0.height.equalTo(height) + } + + titleArtistStackView.snp.makeConstraints { + $0.top.equalTo(thumbnailImageView.snp.top) + $0.left.equalTo(thumbnailImageView.snp.right).offset(8) + $0.right.equalTo(playImageView.snp.left).offset(-16) + $0.bottom.equalTo(thumbnailImageView.snp.bottom) + } + + playImageView.snp.makeConstraints { + $0.width.height.equalTo(32) + $0.centerY.equalTo(contentView.snp.centerY) + $0.right.equalTo(contentView.snp.right).offset(-20) + } + + superButton.snp.makeConstraints { + $0.left.top.bottom.equalToSuperview() + $0.right.equalToSuperview() + } + } +} + +extension PlaylistTableViewCell { + internal func setContent( + model: PlaylistItemModel, + index: Int, + isEditing: Bool, + isSelected: Bool + ) { + self.thumbnailImageView.kf.setImage( + with: URL(string: Utility.WMImageAPI.fetchYoutubeThumbnail(id: model.id).toString), + placeholder: DesignSystemAsset.Logo.placeHolderSmall.image, + options: [.transition(.fade(0.2))] + ) + + self.titleLabel.text = model.title + self.artistLabel.text = model.artist + self.model = (index, model) + self.backgroundColor = isSelected ? DesignSystemAsset.BlueGrayColor.gray200.color : UIColor.clear + + self.updateButtonHidden(isEditing: isEditing) + self.updateConstraintPlayImageView(isEditing: isEditing) + } + + func bindAction() { + playImageView.rx.tapGesture() + .when(.recognized) + .bind(with: self) { owner, _ in + guard let song = owner.model.model else { + return + } + + owner.delegate?.playButtonDidTap(model: song) + } + .disposed(by: disposeBag) + + superButton.addAction { [weak self] in + self?.delegate?.superButtonTapped(index: self?.model.index ?? 0) + } + } + + private func updateButtonHidden(isEditing: Bool) { + if isEditing { + playImageView.isHidden = true + } else { + playImageView.isHidden = false + } + superButton.isHidden = !isEditing + } + + private func updateConstraintPlayImageView(isEditing: Bool) { + let offset = isEditing ? 22 : -20 + self.playImageView.snp.updateConstraints { + $0.right.equalToSuperview().offset(offset) + } + } +} diff --git a/Projects/Features/PlaylistFeature/Sources/Views/RandomPlayButtonGroupView.swift b/Projects/Features/PlaylistFeature/Sources/Views/RandomPlayButtonGroupView.swift new file mode 100644 index 000000000..e65f7236b --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/Views/RandomPlayButtonGroupView.swift @@ -0,0 +1,79 @@ +import DesignSystem +import Localization +import SnapKit +import Then +import UIKit +import Utility + +final class RandomPlayButtonGroupView: UIView { + private let randomPlayButton = RandomPlayButton() + + override init(frame: CGRect) { + super.init(frame: frame) + setupView() + self.backgroundColor = DesignSystemAsset.BlueGrayColor.gray100.color + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func addAction(didTap: @escaping () -> Void) { + randomPlayButton.addAction { + didTap() + } + } + + private func setupView() { + addSubviews(randomPlayButton) + randomPlayButton.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview().inset(20) + $0.verticalEdges.equalToSuperview().inset(12) + } + } +} + +private final class RandomPlayButton: UIButton { + private let randomImageView = UIImageView().then { + $0.image = DesignSystemAsset.Chart.shufflePlay.image + $0.tintColor = DesignSystemAsset.BlueGrayColor.blueGray900.color + $0.contentMode = .scaleAspectFit + } + + private let playLabel = UILabel().then { + $0.text = LocalizationStrings.titleRandomPlay + $0.textColor = DesignSystemAsset.BlueGrayColor.blueGray900.color + $0.font = .setFont(.t6(weight: .medium)) + } + + override init(frame: CGRect) { + super.init(frame: frame) + setupView() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func setupView() { + addSubviews(randomImageView, playLabel) + + randomImageView.snp.makeConstraints { + $0.centerY.equalToSuperview() + $0.leading.equalToSuperview().inset(32) + $0.size.equalTo(32) + } + + playLabel.snp.makeConstraints { + $0.center.equalToSuperview() + } + + layer.borderWidth = 1 + layer.borderColor = DesignSystemAsset.BlueGrayColor.blueGray200.color + .withAlphaComponent(0.4).cgColor + layer.cornerRadius = 8 + backgroundColor = DesignSystemAsset.PrimaryColorV2.white.color + } +} diff --git a/Projects/Features/PlaylistFeature/Sources/Views/RandomPlayButtonHeaderView.swift b/Projects/Features/PlaylistFeature/Sources/Views/RandomPlayButtonHeaderView.swift new file mode 100644 index 000000000..1f1f86cfd --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/Views/RandomPlayButtonHeaderView.swift @@ -0,0 +1,107 @@ +import DesignSystem +import Localization +import SnapKit +import Then +import UIKit +import Utility + +final class RandomPlayButtonHeaderView: UICollectionReusableView { + private let randomPlayButton = RandomPlayButton() + private let blurEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .regular)).then { + $0.layer.cornerRadius = 8 + $0.clipsToBounds = true + } + + private var playButtonHandler: (() -> Void)? + + override init(frame: CGRect) { + super.init(frame: frame) + setupViews() + bind() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func apply(_ layoutAttributes: UICollectionViewLayoutAttributes) { + super.apply(layoutAttributes) + layer.zPosition = 1 + } + + func setPlayButtonHandler(handler: @escaping () -> Void) { + self.playButtonHandler = handler + } + + private func setupViews() { + addSubviews(blurEffectView, randomPlayButton) + blurEffectView.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview().inset(20) + $0.verticalEdges.equalToSuperview().inset(8) + } + + randomPlayButton.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview().inset(20) + $0.verticalEdges.equalToSuperview().inset(8) + } + } + + private func bind() { + randomPlayButton.addAction { [weak self] in + self?.playButtonHandler?() + } + } +} + +private final class RandomPlayButton: UIButton { + private let randomImageView = UIImageView().then { + $0.image = DesignSystemAsset.Chart.shufflePlay.image + $0.tintColor = DesignSystemAsset.BlueGrayColor.blueGray900.color + $0.contentMode = .scaleAspectFit + } + + private let playLabel = UILabel().then { + $0.text = LocalizationStrings.titleRandomPlay + $0.textColor = DesignSystemAsset.BlueGrayColor.blueGray900.color + $0.font = .setFont(.t6(weight: .medium)) + } + + override init(frame: CGRect) { + super.init(frame: frame) + setupView() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func updateTitle(isOverMaximumNumber: Bool) { + playLabel.text = if isOverMaximumNumber { + LocalizationStrings.title50RandomPlay + } else { + LocalizationStrings.titleRandomPlay + } + } + + private func setupView() { + addSubviews(randomImageView, playLabel) + + randomImageView.snp.makeConstraints { + $0.centerY.equalToSuperview() + $0.leading.equalToSuperview().inset(32) + $0.size.equalTo(32) + } + + playLabel.snp.makeConstraints { + $0.center.equalToSuperview() + } + + layer.borderWidth = 1 + layer.borderColor = DesignSystemAsset.BlueGrayColor.blueGray200.color + .withAlphaComponent(0.4).cgColor + layer.cornerRadius = 8 + backgroundColor = DesignSystemAsset.PrimaryColorV2.white.color.withAlphaComponent(0.4) + } +} diff --git a/Projects/Features/PlaylistFeature/Sources/Views/RectangleButton.swift b/Projects/Features/PlaylistFeature/Sources/Views/RectangleButton.swift new file mode 100644 index 000000000..f323a04de --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/Views/RectangleButton.swift @@ -0,0 +1,21 @@ +import DesignSystem +import UIKit + +internal class RectangleButton: UIButton { + func setColor(isHighlight: Bool) { + let pointColor = DesignSystemAsset.PrimaryColor.point.color + if isHighlight { + self.setColor(title: pointColor, border: pointColor) + } else { + self.setColor( + title: DesignSystemAsset.BlueGrayColor.gray400.color, + border: DesignSystemAsset.BlueGrayColor.gray300.color + ) + } + } + + func setColor(title: UIColor, border: UIColor) { + self.setTitleColor(title, for: .normal) + self.layer.borderColor = border.cgColor + } +} diff --git a/Projects/Features/PlaylistFeature/Sources/Views/ThumbnailOptionTableViewCell.swift b/Projects/Features/PlaylistFeature/Sources/Views/ThumbnailOptionTableViewCell.swift new file mode 100644 index 000000000..6263049b2 --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/Views/ThumbnailOptionTableViewCell.swift @@ -0,0 +1,115 @@ +import DesignSystem +import SnapKit +import Then +import UIKit + +final class PlaylistCoverOptionTableViewCell: UITableViewCell { + static let identifier: String = "PlaylistCoverOptionTableViewCell" + + private let superView: UIView = UIView().then { + $0.layer.cornerRadius = 12 + $0.layer.borderWidth = 1 + $0.layer.borderColor = DesignSystemAsset.BlueGrayColor.blueGray100.color.cgColor + $0.backgroundColor = DesignSystemAsset.BlueGrayColor.blueGray50.color + $0.clipsToBounds = true + } + + private let titleLabel: WMLabel = WMLabel( + text: "", + textColor: DesignSystemAsset.BlueGrayColor.blueGray900.color, + font: .t5(weight: .medium) + ).then { + $0.numberOfLines = 2 + } + + private let productView: UIView = UIView().then { + $0.backgroundColor = DesignSystemAsset.PrimaryColorV2.point.color + }.then { + $0.layer.cornerRadius = 4 + $0.clipsToBounds = true + } + + private let noteImageView: UIImageView = UIImageView().then { + $0.contentMode = .scaleAspectFit + $0.image = DesignSystemAsset.Playlist.miniNote.image + } + + private let costLabel: WMLabel = WMLabel( + text: "", + textColor: .white, + font: .t6(weight: .medium), + alignment: .center + ) + + private let productTypeLabel: WMLabel = WMLabel( + text: "", + textColor: .white, + font: .t7(weight: .bold), + alignment: .center + ) + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + addViews() + setLayout() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func addViews() { + self.contentView.addSubviews(superView) + self.superView.addSubviews(titleLabel, productView) + self.productView.addSubviews(noteImageView, costLabel, productTypeLabel) + } + + func setLayout() { + superView.snp.makeConstraints { + $0.top.equalToSuperview() + $0.horizontalEdges.equalToSuperview().inset(20) + $0.bottom.equalToSuperview().inset(8) + } + + titleLabel.snp.makeConstraints { + $0.leading.equalToSuperview().inset(30) + $0.verticalEdges.equalToSuperview() + } + + productView.snp.makeConstraints { + $0.leading.equalTo(titleLabel.snp.trailing).offset(15) + $0.trailing.equalToSuperview().offset(-30) + $0.centerY.equalToSuperview() + $0.width.greaterThanOrEqualTo(72) + $0.height.equalTo(30) + } + + noteImageView.snp.makeConstraints { + $0.leading.equalToSuperview().offset(10) + $0.centerY.equalToSuperview() + $0.size.equalTo(14) + } + + costLabel.snp.makeConstraints { + $0.leading.equalTo(noteImageView.snp.trailing).offset(2) + $0.width.greaterThanOrEqualTo(9) + $0.verticalEdges.equalToSuperview() + } + + productTypeLabel.snp.makeConstraints { + $0.leading.equalTo(costLabel.snp.trailing).offset(6) + $0.trailing.equalToSuperview().offset(-10) + $0.width.equalTo(21) + $0.verticalEdges.equalToSuperview() + } + } +} + +extension PlaylistCoverOptionTableViewCell { + public func update(_ model: PlaylistCoverOptionModel) { + titleLabel.text = model.title + costLabel.text = "\(model.price)" + productTypeLabel.text = model.price == .zero ? "무료" : "구매" + } +} diff --git a/Projects/Features/PlaylistFeature/Sources/Views/UnknownPlaylistHeaderView.swift b/Projects/Features/PlaylistFeature/Sources/Views/UnknownPlaylistHeaderView.swift new file mode 100644 index 000000000..d1d1eb8db --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/Views/UnknownPlaylistHeaderView.swift @@ -0,0 +1,128 @@ +import DesignSystem +import Kingfisher +import RxCocoa +import RxSwift +import SnapKit +import Then +import UIKit + +private protocol UnknownPlaylistHeaderStateProtocol { + func updateData(_ model: PlaylistDetailHeaderModel) +} + +final class UnknownPlaylistHeaderView: UIView { + private var thumbnailImageView: UIImageView = UIImageView().then { + $0.layer.cornerRadius = 12 + $0.clipsToBounds = true + $0.contentMode = .scaleAspectFill + } + + private let scrollView: UIScrollView = UIScrollView().then { + $0.backgroundColor = DesignSystemAsset.BlueGrayColor.blueGray25.color.withAlphaComponent(0.4) + $0.layer.borderWidth = 1 + $0.layer.cornerRadius = 8 + $0.layer.borderColor = UIColor.white.cgColor + $0.clipsToBounds = true + $0.verticalScrollIndicatorInsets = .init(top: 20, left: .zero, bottom: 12, right: 6) + } + + private let stackView: UIStackView = UIStackView().then { + $0.axis = .vertical + } + + private let containerView: UIView = UIView() + + private let titleLabel: WMLabel = WMLabel( + text: "", + textColor: DesignSystemAsset.BlueGrayColor.blueGray900.color, + font: .t3(weight: .bold), + lineHeight: UIFont.WMFontSystem.t3(weight: .bold).lineHeight + ).then { + $0.numberOfLines = .zero + } + + let countLabel: WMLabel = WMLabel( + text: "", + textColor: DesignSystemAsset.BlueGrayColor.blueGray600.color, + font: .t6_1(weight: .light), + lineHeight: UIFont.WMFontSystem.t6_1(weight: .light).lineHeight + ) + + let nickNameLabel: WMLabel = WMLabel( + text: "", + textColor: DesignSystemAsset.BlueGrayColor.blueGray600.color, + font: .t6_1(weight: .medium), + lineHeight: UIFont.WMFontSystem.t6(weight: .medium).lineHeight + ).then { + $0.numberOfLines = .zero + } + + override init(frame: CGRect) { + super.init(frame: frame) + + addView() + setLayout() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +extension UnknownPlaylistHeaderView { + private func addView() { + self.addSubviews(thumbnailImageView, scrollView) + scrollView.addSubview(stackView) + stackView.addArrangedSubview(containerView) + containerView.addSubviews(titleLabel, countLabel, nickNameLabel) + } + + private func setLayout() { + thumbnailImageView.snp.makeConstraints { + $0.width.height.equalTo(140) + $0.top.bottom.equalToSuperview() + $0.leading.equalToSuperview().inset(20) + } + + scrollView.snp.makeConstraints { + $0.leading.equalTo(thumbnailImageView.snp.trailing).offset(8) + $0.verticalEdges.equalToSuperview() + $0.trailing.equalToSuperview().inset(20) + } + + stackView.snp.makeConstraints { + $0.verticalEdges.equalToSuperview() + $0.width.equalTo(scrollView.snp.width) + } + + containerView.snp.makeConstraints { + $0.edges.equalToSuperview() + } + + titleLabel.snp.makeConstraints { + $0.top.equalToSuperview().inset(12) + $0.horizontalEdges.equalToSuperview().inset(16) + } + + countLabel.snp.makeConstraints { + $0.top.equalTo(titleLabel.snp.bottom).offset(8) + $0.horizontalEdges.equalTo(titleLabel) + } + + nickNameLabel.snp.makeConstraints { + $0.top.lessThanOrEqualTo(countLabel.snp.bottom).offset(2) + $0.horizontalEdges.equalTo(titleLabel) + $0.bottom.greaterThanOrEqualToSuperview().inset(12) + } + } +} + +extension UnknownPlaylistHeaderView: UnknownPlaylistHeaderStateProtocol { + func updateData(_ model: PlaylistDetailHeaderModel) { + titleLabel.text = model.title + thumbnailImageView.kf.setImage(with: URL(string: model.image)) + countLabel.text = "\(model.songCount)곡" + nickNameLabel.text = model.userName + } +} diff --git a/Projects/Features/PlaylistFeature/Sources/Views/WakmusicPlaylistHeaderView.swift b/Projects/Features/PlaylistFeature/Sources/Views/WakmusicPlaylistHeaderView.swift new file mode 100644 index 000000000..1b0ac6feb --- /dev/null +++ b/Projects/Features/PlaylistFeature/Sources/Views/WakmusicPlaylistHeaderView.swift @@ -0,0 +1,95 @@ +import DesignSystem +import Kingfisher +import RxCocoa +import RxSwift +import SnapKit +import Then +import UIKit + +private protocol WakmusicPlaylistHeaderStateProtocol { + func updateData(_ model: PlaylistDetailHeaderModel) +} + +final class WakmusicPlaylistHeaderView: UIView { + private var thumbnailImageView: UIImageView = UIImageView().then { + $0.layer.cornerRadius = 12 + $0.clipsToBounds = true + $0.contentMode = .scaleAspectFill + } + + private let containerView: UIView = UIView().then { + $0.backgroundColor = DesignSystemAsset.BlueGrayColor.blueGray25.color.withAlphaComponent(0.4) + $0.layer.borderWidth = 1 + $0.layer.cornerRadius = 8 + $0.layer.borderColor = UIColor.white.cgColor + $0.clipsToBounds = true + } + + private let titleLabel: WMLabel = WMLabel( + text: "", + textColor: DesignSystemAsset.BlueGrayColor.blueGray900.color, + font: .t3(weight: .bold), + lineHeight: UIFont.WMFontSystem.t3(weight: .bold).lineHeight + ).then { + $0.numberOfLines = 0 + } + + let subtitleLabel: WMLabel = WMLabel( + text: "", + textColor: DesignSystemAsset.BlueGrayColor.blueGray600.color, + font: .t6_1(weight: .light), + lineHeight: UIFont.WMFontSystem.t6_1(weight: .light).lineHeight + ) + + override init(frame: CGRect) { + super.init(frame: frame) + + addView() + setLayout() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +extension WakmusicPlaylistHeaderView { + private func addView() { + self.addSubviews(thumbnailImageView, containerView) + containerView.addSubviews(titleLabel, subtitleLabel) + } + + private func setLayout() { + thumbnailImageView.snp.makeConstraints { + $0.width.height.equalTo(140) + $0.top.bottom.equalToSuperview() + $0.leading.equalToSuperview().inset(20) + } + + containerView.snp.makeConstraints { + $0.leading.equalTo(thumbnailImageView.snp.trailing).offset(8) + $0.top.bottom.equalToSuperview() + $0.trailing.equalToSuperview().inset(20) + } + + titleLabel.snp.makeConstraints { + $0.top.equalToSuperview().inset(12) + $0.horizontalEdges.equalToSuperview().inset(16) + } + + subtitleLabel.snp.makeConstraints { + $0.top.equalTo(titleLabel.snp.bottom).offset(8) + $0.leading.equalTo(titleLabel.snp.leading) + } + } +} + +extension WakmusicPlaylistHeaderView: WakmusicPlaylistHeaderStateProtocol { + func updateData(_ model: PlaylistDetailHeaderModel) { + titleLabel.text = model.title + thumbnailImageView.kf.setImage(with: URL(string: model.image)) + + subtitleLabel.text = "\(model.songCount)곡" + } +} diff --git a/Projects/Features/PlaylistFeature/Testing/PlaylistDetailFactoryStub.swift b/Projects/Features/PlaylistFeature/Testing/PlaylistDetailFactoryStub.swift new file mode 100644 index 000000000..6c46eb06d --- /dev/null +++ b/Projects/Features/PlaylistFeature/Testing/PlaylistDetailFactoryStub.swift @@ -0,0 +1,12 @@ +import PlaylistFeatureInterface +import UIKit + +public final class PlaylistDetailFactoryStub: PlaylistDetailFactory { + public func makeView(key: String) -> UIViewController { + return UIViewController() + } + + public func makeWmView(key: String) -> UIViewController { + return UIViewController() + } +} diff --git a/Projects/Features/PlaylistFeature/Tests/MyPlaylistDetailSpec.swift b/Projects/Features/PlaylistFeature/Tests/MyPlaylistDetailSpec.swift new file mode 100644 index 000000000..3e7bf6612 --- /dev/null +++ b/Projects/Features/PlaylistFeature/Tests/MyPlaylistDetailSpec.swift @@ -0,0 +1,9 @@ +import Nimble +@testable import PlaylistFeature +import Quick +import ReactorKit +import XCTest + +final class MyPlaylistDetailSpec: QuickSpec { + override class func spec() {} +} diff --git a/Projects/Features/RootFeature/.swiftlint.yml b/Projects/Features/RootFeature/.swiftlint.yml deleted file mode 100644 index 10c5491ab..000000000 --- a/Projects/Features/RootFeature/.swiftlint.yml +++ /dev/null @@ -1,21 +0,0 @@ -excluded: - - "**/*/NeedleGenerated.swift" - - "Tuist" - - -force_cast: # From https://realm.github.io/SwiftLint/force_cast.html - warning # 강제 캐스팅은 error에서 warning으로 변경 - -disabled_rules: - - trailing_whitespace - - vertical_whitespace - - colon - - comma - - comment_spacing # 주석 여백 - - mark # //MARK 관련 warning - - opening_brace # 괄호 열 때 줄바꿈을 했는지 안했는지, (안했으면 warning) - - line_length # 한줄에 글자 수 제한 , warning: 120, error: 200 (default) - - statement_position # if는 반드시 else로 끝나야한다. - - identifier_name #변수명 글자 수 제한 - - large_tuple # 튜플 갯수 제한 - - function_body_length # 함수 내 라인 제한 diff --git a/Projects/Features/RootFeature/Project.swift b/Projects/Features/RootFeature/Project.swift index 311b9b489..36ea6d03f 100644 --- a/Projects/Features/RootFeature/Project.swift +++ b/Projects/Features/RootFeature/Project.swift @@ -1,12 +1,22 @@ +import DependencyPlugin import ProjectDescription import ProjectDescriptionHelpers -let project = Project.makeModule( - name: "RootFeature", - product: .staticFramework, - dependencies: [ - .Project.Features.BaseFeature, - .Project.Features.MainTabFeature +let project = Project.module( + name: ModulePaths.Feature.RootFeature.rawValue, + targets: [ + .implements( + module: .feature(.RootFeature), + product: .staticFramework, + spec: .init( + resources: ["Resources/**"], + dependencies: [ + .feature(target: .MainTabFeature), + .feature(target: .BaseFeature, type: .interface), + .domain(target: .AppDomain, type: .interface), + .domain(target: .UserDomain, type: .interface) + ] + ) + ) ] - , resources: ["Resources/**"] ) diff --git a/Projects/Features/RootFeature/Resources/Intro.storyboard b/Projects/Features/RootFeature/Resources/Intro.storyboard index 72359a3dc..8b94a94b5 100644 --- a/Projects/Features/RootFeature/Resources/Intro.storyboard +++ b/Projects/Features/RootFeature/Resources/Intro.storyboard @@ -1,9 +1,9 @@ - + - + @@ -73,53 +73,112 @@ - + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + - + @@ -151,18 +209,12 @@ - - + @@ -220,10 +271,7 @@ - + @@ -264,10 +312,7 @@ @@ -179,10 +146,12 @@ - + + + @@ -191,105 +160,19 @@
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + - + diff --git a/Projects/Features/SearchFeature/Sources/After/Components/AfterSearchComponent.swift b/Projects/Features/SearchFeature/Sources/After/Components/AfterSearchComponent.swift new file mode 100644 index 000000000..0fafabecd --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/After/Components/AfterSearchComponent.swift @@ -0,0 +1,23 @@ +import BaseFeature +import BaseFeatureInterface +import Foundation +import NeedleFoundation +import SearchFeatureInterface +import SongsDomainInterface + +public protocol AfterSearchDependency: Dependency { + var songSearchResultFactory: any SongSearchResultFactory { get } + var listSearchResultFactory: any ListSearchResultFactory { get } + var searchGlobalScrollState: any SearchGlobalScrollProtocol { get } +} + +public final class AfterSearchComponent: Component { + public func makeView(text: String) -> AfterSearchViewController { + return AfterSearchViewController.viewController( + songSearchResultFactory: dependency.songSearchResultFactory, + listSearchResultFactory: dependency.listSearchResultFactory, + searchGlobalScrollState: dependency.searchGlobalScrollState, + reactor: .init(text: text) + ) + } +} diff --git a/Projects/Features/SearchFeature/Sources/After/Components/ListSearchResultComponent.swift b/Projects/Features/SearchFeature/Sources/After/Components/ListSearchResultComponent.swift new file mode 100644 index 000000000..df83f4566 --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/After/Components/ListSearchResultComponent.swift @@ -0,0 +1,29 @@ +import BaseFeature +import BaseFeatureInterface +import Foundation +import NeedleFoundation +import PlaylistFeatureInterface +import SearchDomainInterface +import SearchFeatureInterface +import UIKit + +public protocol ListSearchResultDependency: Dependency { + var fetchSearchPlaylistsUseCase: any FetchSearchPlaylistsUseCase { get } + var searchSortOptionComponent: SearchSortOptionComponent { get } + var playlistDetailFactory: any PlaylistDetailFactory { get } + var searchGlobalScrollState: any SearchGlobalScrollProtocol { get } +} + +public final class ListSearchResultComponent: Component, ListSearchResultFactory { + public func makeView(_ text: String) -> UIViewController { + ListSearchResultViewController( + ListSearchResultReactor( + text: text, + fetchSearchPlaylistsUseCase: dependency.fetchSearchPlaylistsUseCase + ), + searchSortOptionComponent: dependency.searchSortOptionComponent, + playlistDetailFactory: dependency.playlistDetailFactory, + searchGlobalScrollState: dependency.searchGlobalScrollState + ) + } +} diff --git a/Projects/Features/SearchFeature/Sources/After/Components/SearchOptionComponent.swift b/Projects/Features/SearchFeature/Sources/After/Components/SearchOptionComponent.swift new file mode 100644 index 000000000..830c99eb0 --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/After/Components/SearchOptionComponent.swift @@ -0,0 +1,10 @@ +import BaseFeatureInterface +import NeedleFoundation +import SearchDomainInterface +import UIKit + +public final class SearchOptionComponent: Component { + public func makeView(_ sortType: SortType) -> UIViewController { + return SearchSortOptionViewController(selectedModel: sortType) + } +} diff --git a/Projects/Features/SearchFeature/Sources/After/Components/SearchSortOptionComponent.swift b/Projects/Features/SearchFeature/Sources/After/Components/SearchSortOptionComponent.swift new file mode 100644 index 000000000..5a039ba75 --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/After/Components/SearchSortOptionComponent.swift @@ -0,0 +1,9 @@ +import NeedleFoundation +import SearchDomainInterface +import UIKit + +public final class SearchSortOptionComponent: Component { + public func makeView(_ selectedModel: SortType) -> UIViewController { + return SearchSortOptionViewController(selectedModel: selectedModel) + } +} diff --git a/Projects/Features/SearchFeature/Sources/After/Components/SongSearchResultComponent.swift b/Projects/Features/SearchFeature/Sources/After/Components/SongSearchResultComponent.swift new file mode 100644 index 000000000..7c836ed38 --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/After/Components/SongSearchResultComponent.swift @@ -0,0 +1,34 @@ +import BaseFeature +import BaseFeatureInterface +import NeedleFoundation +import SearchDomainInterface +import SearchFeatureInterface +import SignInFeatureInterface +import UIKit + +public protocol SongSearchResultDependency: Dependency { + var fetchSearchSongsUseCase: any FetchSearchSongsUseCase { get } + var searchSortOptionComponent: SearchSortOptionComponent { get } + var containSongsFactory: any ContainSongsFactory { get } + var searchGlobalScrollState: any SearchGlobalScrollProtocol { get } + var songDetailPresenter: any SongDetailPresentable { get } + var signInFactory: any SignInFactory { get } + var textPopupFactory: any TextPopupFactory { get } +} + +public final class SongSearchResultComponent: Component, SongSearchResultFactory { + public func makeView(_ text: String) -> UIViewController { + SongSearchResultViewController( + SongSearchResultReactor( + text: text, + fetchSearchSongsUseCase: dependency.fetchSearchSongsUseCase + ), + searchSortOptionComponent: dependency.searchSortOptionComponent, + songDetailPresenter: dependency.songDetailPresenter, + containSongsFactory: dependency.containSongsFactory, + signInFactory: dependency.signInFactory, + textPopupFactory: dependency.textPopupFactory, + searchGlobalScrollState: dependency.searchGlobalScrollState + ) + } +} diff --git a/Projects/Features/SearchFeature/Sources/After/CompositionalLayout/Layout/ListSearchResultCollectionViewLayout.swift b/Projects/Features/SearchFeature/Sources/After/CompositionalLayout/Layout/ListSearchResultCollectionViewLayout.swift new file mode 100644 index 000000000..84b5ff5f7 --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/After/CompositionalLayout/Layout/ListSearchResultCollectionViewLayout.swift @@ -0,0 +1,37 @@ +import UIKit +import Utility + +final class ListSearchResultCollectionViewLayout: UICollectionViewCompositionalLayout { + init() { + super.init { _, _ in + + return ListSearchResultCollectionViewLayout.configureLayout() + } + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +extension ListSearchResultCollectionViewLayout { + private static func configureLayout() -> NSCollectionLayoutSection { + let itemSize = NSCollectionLayoutSize( + widthDimension: .fractionalWidth(1.0), + heightDimension: .fractionalHeight(1.0) + ) + + let item: NSCollectionLayoutItem = NSCollectionLayoutItem(layoutSize: itemSize) + let groupSize = NSCollectionLayoutSize( + widthDimension: .fractionalWidth(1.0), + heightDimension: .absolute(60.0) + ) + let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [item]) + + let section = NSCollectionLayoutSection(group: group) + section.contentInsets = NSDirectionalEdgeInsets(top: .zero, leading: .zero, bottom: 56.0, trailing: .zero) + + return section + } +} diff --git a/Projects/Features/SearchFeature/Sources/After/CompositionalLayout/Layout/SearchFilterOptionCollectionViewLayout.swift b/Projects/Features/SearchFeature/Sources/After/CompositionalLayout/Layout/SearchFilterOptionCollectionViewLayout.swift new file mode 100644 index 000000000..600a3071a --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/After/CompositionalLayout/Layout/SearchFilterOptionCollectionViewLayout.swift @@ -0,0 +1,41 @@ +import UIKit +import Utility + +final class SearchFilterOptionCollectionViewLayout: UICollectionViewCompositionalLayout { + init() { + super.init { _, _ in + return SearchFilterOptionCollectionViewLayout.configureLayout() + } + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +extension SearchFilterOptionCollectionViewLayout { + private static func configureLayout() -> NSCollectionLayoutSection { + let itemSize = NSCollectionLayoutSize( + widthDimension: .estimated(50), + heightDimension: .fractionalHeight(1.0) + ) + + let item: NSCollectionLayoutItem = NSCollectionLayoutItem(layoutSize: itemSize) + + let groupSize = NSCollectionLayoutSize( + widthDimension: .estimated(50), + heightDimension: .fractionalHeight(1.0) + ) + let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [item]) + + let section = NSCollectionLayoutSection(group: group) + + section.interGroupSpacing = 4 + section.contentInsets = .init(top: .zero, leading: 20, bottom: .zero, trailing: 30) + + section.orthogonalScrollingBehavior = .continuous + + return section + } +} diff --git a/Projects/Features/SearchFeature/Sources/After/CompositionalLayout/Layout/SongSearchResultCollectionViewLayout.swift b/Projects/Features/SearchFeature/Sources/After/CompositionalLayout/Layout/SongSearchResultCollectionViewLayout.swift new file mode 100644 index 000000000..d9fa1a697 --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/After/CompositionalLayout/Layout/SongSearchResultCollectionViewLayout.swift @@ -0,0 +1,37 @@ +import UIKit +import Utility + +final class SongSearchResultCollectionViewLayout: UICollectionViewCompositionalLayout { + init() { + super.init { _, _ in + + return SongSearchResultCollectionViewLayout.configureLayout() + } + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +extension SongSearchResultCollectionViewLayout { + private static func configureLayout() -> NSCollectionLayoutSection { + let itemSize = NSCollectionLayoutSize( + widthDimension: .fractionalWidth(1.0), + heightDimension: .fractionalHeight(1.0) + ) + + let item: NSCollectionLayoutItem = NSCollectionLayoutItem(layoutSize: itemSize) + let groupSize = NSCollectionLayoutSize( + widthDimension: .fractionalWidth(1.0), + heightDimension: .absolute(60.0) + ) + let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [item]) + + let section = NSCollectionLayoutSection(group: group) + section.contentInsets = NSDirectionalEdgeInsets(top: .zero, leading: .zero, bottom: 56.0, trailing: .zero) + + return section + } +} diff --git a/Projects/Features/SearchFeature/Sources/After/Reactors/AfterSearchReactor.swift b/Projects/Features/SearchFeature/Sources/After/Reactors/AfterSearchReactor.swift new file mode 100644 index 000000000..df97b33bf --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/After/Reactors/AfterSearchReactor.swift @@ -0,0 +1,51 @@ +import Foundation +import LogManager +import ReactorKit +import RxSwift +import SongsDomainInterface + +public final class AfterSearchReactor: Reactor { + var disposeBag: DisposeBag = DisposeBag() + + private let service: any SearchCommonService + + public enum Action {} + + public enum Mutation { + case updateText(String) + } + + public struct State { + var text: String + } + + public var initialState: State + + init(service: some SearchCommonService = DefaultSearchCommonService.shared, text: String) { + self.initialState = State( + text: text + ) + self.service = service + } + + deinit { + LogManager.printDebug("\(Self.self)") + } + + public func mutate(action: Action) -> Observable {} + + public func reduce(state: State, mutation: Mutation) -> State { + var newState = state + + switch mutation { + case let .updateText(text): + newState.text = text + } + + return newState + } +} + +private extension AfterSearchReactor { + #warning("유즈케이스 주입") +} diff --git a/Projects/Features/SearchFeature/Sources/After/Reactors/ListSearchResultReactor.swift b/Projects/Features/SearchFeature/Sources/After/Reactors/ListSearchResultReactor.swift new file mode 100644 index 000000000..4778fb464 --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/After/Reactors/ListSearchResultReactor.swift @@ -0,0 +1,124 @@ +import Localization +import LogManager +import ReactorKit +import SearchDomainInterface + +final class ListSearchResultReactor: Reactor { + enum Action { + case viewDidLoad + case changeSortType(SortType) + case askLoadMore + } + + enum Mutation { + case updateSortType(SortType) + case updateDataSource(dataSource: [SearchPlaylistEntity], canLoad: Bool) + case updateLoadingState(Bool) + case updateScrollPage(Int) + case showToast(String) + } + + struct State { + var isLoading: Bool + var sortType: SortType + var scrollPage: Int + var dataSource: [SearchPlaylistEntity] + var canLoad: Bool + @Pulse var toastMessage: String? + } + + var initialState: State + private let text: String + private let fetchSearchPlaylistsUseCase: any FetchSearchPlaylistsUseCase + private let limit: Int = 20 + + init(text: String, fetchSearchPlaylistsUseCase: any FetchSearchPlaylistsUseCase) { + self.initialState = State( + isLoading: false, + sortType: .latest, + scrollPage: 1, + dataSource: [], + canLoad: true + ) + + self.text = text + self.fetchSearchPlaylistsUseCase = fetchSearchPlaylistsUseCase + } + + func mutate(action: Action) -> Observable { + let state = self.currentState + + switch action { + case .viewDidLoad, .askLoadMore: + return updateDataSource(order: state.sortType, text: self.text, scrollPage: state.scrollPage) + case let .changeSortType(type): + return updateSortType(type) + } + } + + func reduce(state: State, mutation: Mutation) -> State { + var newState = state + + switch mutation { + case let .updateSortType(type): + newState.sortType = type + case let .updateDataSource(dataSource, canLoad): + newState.dataSource = dataSource + newState.canLoad = canLoad + case let .updateLoadingState(isLoading): + newState.isLoading = isLoading + case let .updateScrollPage(page): + newState.scrollPage = page + case let .showToast(message): + newState.toastMessage = message + } + + return newState + } +} + +extension ListSearchResultReactor { + private func updateSortType(_ type: SortType) -> Observable { + return .concat([ + .just(.updateSortType(type)), + updateDataSource(order: type, text: self.text, scrollPage: 1) + ]) + } + + private func updateDataSource( + order: SortType, + text: String, + scrollPage: Int + ) -> Observable { + let prev: [SearchPlaylistEntity] = scrollPage == 1 ? [] : self.currentState.dataSource + + return .concat([ + .just(Mutation.updateLoadingState(true)), + fetchSearchPlaylistsUseCase + .execute(order: order, text: text, page: scrollPage, limit: limit) + .asObservable() + .map { [weak self] dataSource -> Mutation in + + guard let self else { return .updateDataSource(dataSource: [], canLoad: false) } + + if scrollPage == 1 { + LogManager.analytics(SearchAnalyticsLog.viewSearchResult( + keyword: self.text, + category: "list", + count: dataSource.count + )) + } + + return Mutation.updateDataSource(dataSource: prev + dataSource, canLoad: dataSource.count == limit) + } + .catch { error in + let wmErorr = error.asWMError + return Observable.just( + Mutation.showToast(wmErorr.errorDescription ?? LocalizationStrings.unknownErrorWarning) + ) + }, + .just(Mutation.updateScrollPage(scrollPage + 1)), + .just(Mutation.updateLoadingState(false)) + ]) + } +} diff --git a/Projects/Features/SearchFeature/Sources/After/Reactors/SongSearchResultReactor.swift b/Projects/Features/SearchFeature/Sources/After/Reactors/SongSearchResultReactor.swift new file mode 100644 index 000000000..2f0b280a2 --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/After/Reactors/SongSearchResultReactor.swift @@ -0,0 +1,227 @@ +import Localization +import LogManager +import ReactorKit +import RxCocoa +import RxSwift +import SearchDomainInterface +import SongsDomainInterface + +final class SongSearchResultReactor: Reactor { + enum Action { + case viewDidLoad + case changeSortType(SortType) + case changeFilterType(FilterType) + case askLoadMore + case deselectAll + case itemDidTap(Int) + } + + enum Mutation { + case updateSortType(SortType) + case updateFilterType(FilterType) + case updateDataSource(dataSource: [SongEntity], canLoad: Bool) + case updateLoadingState(Bool) + case updateScrollPage(Int) + case updateSelectedCount(Int) + case updateSelectingStateByIndex([SongEntity]) + case showToast(String) + } + + struct State { + var isLoading: Bool + var sortType: SortType + var filterType: FilterType + var selectedCount: Int + var scrollPage: Int + var dataSource: [SongEntity] + var canLoad: Bool + @Pulse var toastMessage: String? + } + + var initialState: State + + private let fetchSearchSongsUseCase: any FetchSearchSongsUseCase + private let text: String + private let limit: Int = 20 + private var requestDisposeBag = DisposeBag() + private let subject = PublishSubject() + + init(text: String, fetchSearchSongsUseCase: any FetchSearchSongsUseCase) { + self.initialState = State( + isLoading: true, + sortType: .relevance, + filterType: .all, + selectedCount: 0, + scrollPage: 1, + dataSource: [], + canLoad: true + ) + + self.text = text + self.fetchSearchSongsUseCase = fetchSearchSongsUseCase + } + + func mutate(action: Action) -> Observable { + let state = self.currentState + + switch action { + case .viewDidLoad, .askLoadMore: + return updateDataSource( + order: state.sortType, + filter: state.filterType, + text: self.text, + scrollPage: state.scrollPage + ) + + case let .changeSortType(type): + return updateSortType(type) + case let .changeFilterType(type): + return updateFilterType(type) + + case .deselectAll: + return deselectAll() + + case let .itemDidTap(index): + return updateItemSelected(index) + } + } + + func reduce(state: State, mutation: Mutation) -> State { + var newState = state + + switch mutation { + case let .updateSortType(type): + newState.sortType = type + case let .updateFilterType(type): + newState.filterType = type + case let .updateDataSource(dataSource, canLoad): + newState.dataSource = dataSource + newState.canLoad = canLoad + + case let .updateLoadingState(isLoading): + newState.isLoading = isLoading + + case let .updateScrollPage(page): + newState.scrollPage = page + + case let .showToast(message): + newState.toastMessage = message + + case let .updateSelectedCount(count): + newState.selectedCount = count + + case let .updateSelectingStateByIndex(dataSource): + newState.dataSource = dataSource + } + + return newState + } + + func transform(mutation: Observable) -> Observable { + let flatMapMutation = subject + .withUnretained(self) + .flatMap { owner, subjectMutation -> Observable in + return .concat([ + .just(subjectMutation), + .just(Mutation.updateScrollPage(owner.currentState.scrollPage + 1)), + .just(Mutation.updateLoadingState(false)) + ]) + } + + return Observable.merge(mutation, flatMapMutation) + } +} + +extension SongSearchResultReactor { + private func updateSortType(_ type: SortType) -> Observable { + let state = self.currentState + + return .concat([ + .just(.updateSelectedCount(0)), + .just(.updateSortType(type)), + updateDataSource(order: type, filter: state.filterType, text: self.text, scrollPage: 1) + ]) + } + + private func updateFilterType(_ type: FilterType) -> Observable { + let state = self.currentState + + return .concat([ + .just(.updateSelectedCount(0)), + .just(.updateFilterType(type)), + updateDataSource(order: state.sortType, filter: type, text: self.text, scrollPage: 1) + ]) + } + + private func updateDataSource( + order: SortType, + filter: FilterType, + text: String, + scrollPage: Int + ) -> Observable { + requestDisposeBag = DisposeBag() // 기존 작업 캔슬 + + fetchSearchSongsUseCase + .execute(order: order, filter: filter, text: text, page: scrollPage, limit: limit) + .asObservable() + .map { [weak self] dataSource -> Mutation in + + guard let self else { return .updateDataSource(dataSource: [], canLoad: false) } + + let prev: [SongEntity] = scrollPage == 1 ? [] : self.currentState.dataSource + if scrollPage == 1 { + LogManager.analytics(SearchAnalyticsLog.viewSearchResult( + keyword: self.text, + category: "song", + count: dataSource.count + )) + } + + return Mutation.updateDataSource(dataSource: prev + dataSource, canLoad: dataSource.count == limit) + } + .catch { error in + let wmErorr = error.asWMError + return Observable.just( + Mutation.showToast(wmErorr.errorDescription ?? LocalizationStrings.unknownErrorWarning) + ) + } + .bind(with: subject, onNext: { subject, mutation in + subject.onNext(mutation) + }) + .disposed(by: requestDisposeBag) + + return Observable.just(.updateLoadingState(true)) + } + + func updateItemSelected(_ index: Int) -> Observable { + let state = currentState + var count = state.selectedCount + var prev = state.dataSource + + if prev[index].isSelected { + count -= 1 + } else { + count += 1 + } + prev[index].isSelected = !prev[index].isSelected + + return .concat([ + .just(Mutation.updateSelectingStateByIndex(prev)), + .just(Mutation.updateSelectedCount(count)) + ]) + } + + func deselectAll() -> Observable { + let state = currentState + var dataSource = state.dataSource + + for i in 0 ..< dataSource.count { + dataSource[i].isSelected = false + } + + return .concat([ + .just(.updateDataSource(dataSource: dataSource, canLoad: state.canLoad)), + .just(.updateSelectedCount(0)) + ]) + } +} diff --git a/Projects/Features/SearchFeature/Sources/After/View/ListResultCell.swift b/Projects/Features/SearchFeature/Sources/After/View/ListResultCell.swift new file mode 100644 index 000000000..6099fdf84 --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/After/View/ListResultCell.swift @@ -0,0 +1,98 @@ +import DesignSystem +import Kingfisher +import LogManager +import SearchDomainInterface +import UIKit +import Utility + +final class ListResultCell: UICollectionViewCell { + private let thumbnailView: UIImageView = UIImageView().then { + $0.contentMode = .scaleAspectFill + $0.clipsToBounds = true + $0.layer.cornerRadius = 4 + } + + private let titleLabel = WMLabel( + text: "", + textColor: DesignSystemAsset.NewGrayColor.gray900.color, + font: .t6(weight: .medium), + alignment: .left, + lineHeight: UIFont.WMFontSystem.t6().lineHeight, + kernValue: -0.5 + ).then { + $0.numberOfLines = 1 + } + + private let creatorLabel = WMLabel( + text: "", + textColor: DesignSystemAsset.NewGrayColor.gray900.color, + font: .t7(weight: .light), + alignment: .left, + lineHeight: UIFont.WMFontSystem.t7(weight: .light).lineHeight, + kernValue: -0.5 + ).then { + $0.numberOfLines = 1 + } + + private let sharedCountLabel = WMLabel( + text: "", + textColor: DesignSystemAsset.NewGrayColor.gray900.color, + font: .sc7(weight: .score3Light), + alignment: .right, + lineHeight: UIFont.WMFontSystem.t7().lineHeight, + kernValue: -0.5 + ).then { + $0.numberOfLines = 1 + } + + override init(frame: CGRect) { + super.init(frame: frame) + addSubview() + setLayout() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +extension ListResultCell { + private func addSubview() { + self.contentView.addSubviews(thumbnailView, titleLabel, creatorLabel, sharedCountLabel) + } + + private func setLayout() { + thumbnailView.snp.makeConstraints { + $0.width.height.equalTo(40) + $0.top.bottom.equalToSuperview().inset(10) + $0.leading.equalToSuperview().inset(20) + } + + titleLabel.snp.makeConstraints { + $0.top.equalTo(thumbnailView.snp.top).offset(-1) + $0.leading.equalTo(thumbnailView.snp.trailing).offset(8) + } + + creatorLabel.snp.makeConstraints { + $0.top.equalTo(titleLabel.snp.bottom).offset(2) + $0.leading.equalTo(titleLabel.snp.leading) + $0.trailing.equalTo(titleLabel.snp.trailing) + $0.bottom.equalTo(thumbnailView.snp.bottom) + } + + sharedCountLabel.snp.makeConstraints { + $0.width.lessThanOrEqualTo(66) + $0.centerY.equalTo(thumbnailView.snp.centerY) + $0.trailing.equalToSuperview().inset(20) + $0.leading.equalTo(titleLabel.snp.trailing).offset(8) + } + } + + public func update(_ model: SearchPlaylistEntity) { + titleLabel.text = model.title + creatorLabel.text = model.userName + sharedCountLabel.text = "\(model.subscribeCount.formattedWithComma())구독" + thumbnailView.kf.setImage(with: URL(string: model.image), placeholder: nil, options: [.transition(.fade(0.2))]) + } +} diff --git a/Projects/Features/SearchFeature/Sources/After/View/OptionButton.swift b/Projects/Features/SearchFeature/Sources/After/View/OptionButton.swift new file mode 100644 index 000000000..ec6ea7fde --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/After/View/OptionButton.swift @@ -0,0 +1,92 @@ +import DesignSystem +import RxCocoa +import RxSwift +import SearchDomainInterface +import SnapKit +import Then +import UIKit + +private protocol OptionButtonStateProtocol { + func updateSortrState(_ filterType: SortType) +} + +private protocol OptionButtonActionProtocol { + var didTap: Observable { get } +} + +final class OptionButton: UIView { + private let leftLabel = WMLabel( + text: "", + textColor: DesignSystemAsset.NewGrayColor.gray900.color, + font: .t6(weight: .medium), + alignment: .right, + lineHeight: UIFont.WMFontSystem.t6().lineHeight + ).then { + $0.numberOfLines = 1 + } + + private let rightImageView = UIImageView().then { + $0.image = DesignSystemAsset.Search.arrowDown.image + } + + private var sortType: SortType + + fileprivate let tapGestureRecognizer = UITapGestureRecognizer() + + public init(_ sortType: SortType) { + self.sortType = sortType + super.init(frame: .zero) + addSubviews() + setLayout() + configureUI() + bindAction() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +extension OptionButton { + private func addSubviews() { + self.addSubviews( + leftLabel, + rightImageView + ) + } + + private func setLayout() { + leftLabel.snp.makeConstraints { + $0.leading.equalToSuperview() + $0.centerY.equalToSuperview() + } + rightImageView.snp.makeConstraints { + $0.leading.equalTo(leftLabel.snp.trailing).offset(3) + $0.trailing.equalToSuperview() + $0.centerY.equalToSuperview() + } + } + + private func configureUI() { + leftLabel.text = sortType.title + } + + private func bindAction() { + self.addGestureRecognizer(tapGestureRecognizer) + self.isUserInteractionEnabled = true + } +} + +extension OptionButton: OptionButtonStateProtocol { + func updateSortrState(_ type: SortType) { + self.sortType = type + leftLabel.text = sortType.title + } +} + +extension Reactive: OptionButtonActionProtocol where Base: OptionButton { + var didTap: Observable { + return base.tapGestureRecognizer.rx.event.map { _ in }.asObservable() + } +} diff --git a/Projects/Features/SearchFeature/Sources/After/View/SearchFilterCell.swift b/Projects/Features/SearchFeature/Sources/After/View/SearchFilterCell.swift new file mode 100644 index 000000000..a9d7e7c01 --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/After/View/SearchFilterCell.swift @@ -0,0 +1,77 @@ +import DesignSystem +import RxCocoa +import SearchDomainInterface +import SnapKit +import Then +import UIKit + +final class SearchFilterCell: UICollectionViewCell { + override var isSelected: Bool { + willSet(newState) { + if newState == true { + updateSelectState() + } else { + updateDeSelectState() + } + } + } + + private var label: WMLabel = WMLabel( + text: "", + textColor: DesignSystemAsset.BlueGrayColor.blueGray900.color, + font: .t6(weight: .light), + lineHeight: UIFont.WMFontSystem.t6(weight: .light).lineHeight + ) + + override init(frame: CGRect) { + super.init(frame: frame) + addSubviews() + setLayout() + configureUI() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +extension SearchFilterCell { + private func addSubviews() { + self.contentView.addSubview(label) + } + + private func setLayout() { + label.snp.makeConstraints { + $0.leading.trailing.equalToSuperview().inset(16) + $0.top.bottom.equalToSuperview().inset(4) + } + } + + private func configureUI() { + self.backgroundColor = .clear + self.layer.cornerRadius = 15 + self.clipsToBounds = true + updateDeSelectState() + } + + private func updateDeSelectState() { + label.font = .setFont(.t6(weight: .light)) + label.textColor = DesignSystemAsset.BlueGrayColor.blueGray900.color + self.layer.borderColor = DesignSystemAsset.BlueGrayColor.gray200.color.cgColor + self.layer.borderWidth = 1 + self.backgroundColor = .clear + } + + private func updateSelectState() { + self.backgroundColor = DesignSystemAsset.PrimaryColorV2.point.color + label.font = .setFont(.t6(weight: .medium)) + label.textColor = .white + self.layer.borderColor = nil + self.layer.borderWidth = .zero + } + + public func update(_ filterType: FilterType) { + self.label.text = filterType.title + } +} diff --git a/Projects/Features/SearchFeature/Sources/After/View/SearchOptionHeaderView.swift b/Projects/Features/SearchFeature/Sources/After/View/SearchOptionHeaderView.swift new file mode 100644 index 000000000..5dcf98ad5 --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/After/View/SearchOptionHeaderView.swift @@ -0,0 +1,146 @@ +import DesignSystem +import RxSwift +import SearchDomainInterface +import SnapKit +import Then +import UIKit +import Utility + +private protocol SearchOptionHeaderStateProtocol { + func updateSortState(_ sortType: SortType) +} + +private protocol SearchOptionHeaderActionProtocol { + var selectedFilterItem: Observable { get } + var didTapSortButton: Observable { get } +} + +final class SearchOptionHeaderView: UIView { + private let searchFilterCellRegistration = UICollectionView.CellRegistration< + SearchFilterCell, FilterType + > { cell, indexPath, itemIdentifier in + + cell.update(itemIdentifier) + } + + fileprivate let dataSource: [FilterType] = [.all, .title, .artist, .credit] + private var disposeBag = DisposeBag() + private lazy var searchFilterDiffableDataSource = UICollectionViewDiffableDataSource( + collectionView: collectionView + ) { [searchFilterCellRegistration] collectionView, indexPath, itemIdentifier in + let cell = collectionView.dequeueConfiguredReusableCell( + using: searchFilterCellRegistration, + for: indexPath, + item: itemIdentifier + ) + + if indexPath.row == .zero { + cell.isSelected = true + collectionView.selectItem(at: indexPath, animated: false, scrollPosition: .init()) + } + + return cell + } + + fileprivate lazy var collectionView = UICollectionView( + frame: .zero, + collectionViewLayout: SearchFilterOptionCollectionViewLayout() + ).then { + $0.backgroundColor = .clear + $0.bounces = false + } + + private let dimView = UIView() + + fileprivate let sortButton: OptionButton = OptionButton(.latest) + + init(_ isContainFilter: Bool) { + super.init(frame: .zero) + addSubviews() + setLayout() + initDataSource() + bindAction() + dimView.isHidden = !isContainFilter + collectionView.isHidden = !isContainFilter + } + + override func layoutSubviews() { + super.layoutSubviews() + configureUI() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +extension SearchOptionHeaderView { + private func addSubviews() { + self.addSubviews(collectionView, dimView, sortButton) + } + + private func setLayout() { + dimView.snp.makeConstraints { + $0.width.height.equalTo(30) + $0.top.bottom.equalToSuperview() + $0.trailing.equalTo(collectionView.snp.trailing) + } + + collectionView.snp.makeConstraints { + $0.leading.top.bottom.equalToSuperview() + } + + sortButton.snp.makeConstraints { + $0.top.bottom.equalToSuperview() + $0.width.equalTo(70) + $0.leading.equalTo(collectionView.snp.trailing).offset(4) + $0.trailing.equalToSuperview().inset(20) + } + } + + private func configureUI() { + let gradientLayer = CAGradientLayer() + gradientLayer.frame = dimView.bounds + gradientLayer.colors = [colorFromRGB("F2F4F7", alpha: .zero).cgColor, colorFromRGB("F2F4F7").cgColor] + gradientLayer.type = .axial + gradientLayer.startPoint = .init(x: .zero, y: 0.5) + gradientLayer.endPoint = .init(x: 1.0, y: 0.5) + dimView.layer.addSublayer(gradientLayer) + } + + private func initDataSource() { + var snapShot = NSDiffableDataSourceSnapshot() + + snapShot.appendSections([0]) + snapShot.appendItems(dataSource, toSection: 0) + + searchFilterDiffableDataSource.apply(snapShot) + } + + private func bindAction() { + collectionView.rx.itemSelected + .bind(with: self) { owner, indexPath in + owner.collectionView.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true) + } + .disposed(by: disposeBag) + } +} + +extension SearchOptionHeaderView: SearchOptionHeaderStateProtocol { + func updateSortState(_ sortType: SortType) { + sortButton.updateSortrState(sortType) + } +} + +extension Reactive: SearchOptionHeaderActionProtocol where Base: SearchOptionHeaderView { + var selectedFilterItem: Observable { + base.collectionView.rx.itemSelected + .map { base.dataSource[$0.row] } + .asObservable() + } + + var didTapSortButton: Observable { + base.sortButton.rx.didTap + } +} diff --git a/Projects/Features/SearchFeature/Sources/After/View/SearchSortOptionCell.swift b/Projects/Features/SearchFeature/Sources/After/View/SearchSortOptionCell.swift new file mode 100644 index 000000000..bbae90698 --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/After/View/SearchSortOptionCell.swift @@ -0,0 +1,61 @@ +import DesignSystem +import SearchDomainInterface +import SnapKit +import Then +import UIKit + +final class SearchSortOptionCell: UITableViewCell { + static let identifer: String = "SearchOptionCell" + private var label: WMLabel = WMLabel( + text: "", + textColor: DesignSystemAsset.BlueGrayColor.blueGray900.color, + font: .t4(weight: .light) + ) + private var checkImageView: UIImageView = UIImageView().then { + $0.image = DesignSystemAsset.Storage.checkBox.image + $0.contentMode = .scaleAspectFit + } + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + addSubviews() + setLayout() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +extension SearchSortOptionCell { + private func addSubviews() { + self.contentView.addSubviews(label, checkImageView) + } + + private func setLayout() { + label.snp.makeConstraints { + $0.leading.equalToSuperview().inset(20) + $0.top.bottom.equalToSuperview() + $0.trailing.equalTo(checkImageView.snp.leading).offset(-10) + } + + checkImageView.snp.makeConstraints { + $0.height.width.equalTo(25) + $0.centerY.equalTo(label.snp.centerY) + $0.trailing.equalToSuperview().inset(20) + } + } + + public func update(_ model: SortType, _ selectedModel: SortType) { + self.label.text = model.title + + if model == selectedModel { + label.font = .setFont(.t4(weight: .medium)) + } else { + label.font = .setFont(.t4(weight: .light)) + } + + checkImageView.isHidden = model != selectedModel + } +} diff --git a/Projects/Features/SearchFeature/Sources/After/View/SongResultCell.swift b/Projects/Features/SearchFeature/Sources/After/View/SongResultCell.swift new file mode 100644 index 000000000..c89ea9d82 --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/After/View/SongResultCell.swift @@ -0,0 +1,134 @@ +import DesignSystem +import Kingfisher +import LogManager +import SongsDomainInterface +import UIKit +import Utility + +public protocol SongResultCellDelegate: AnyObject { + func thumbnailDidTap(key: String) +} + +final class SongResultCell: UICollectionViewCell { + public weak var delegate: SongResultCellDelegate? + + private var model: SongEntity? + + private let thumbnailView: UIImageView = UIImageView().then { + $0.contentMode = .scaleAspectFill + $0.clipsToBounds = true + $0.layer.cornerRadius = 4 + } + + private let thumnailButton: UIButton = UIButton() + + private let titleLabel = WMLabel( + text: "", + textColor: DesignSystemAsset.NewGrayColor.gray900.color, + font: .t6(weight: .medium), + alignment: .left, + lineHeight: UIFont.WMFontSystem.t6(weight: .medium).lineHeight, + kernValue: -0.5 + ).then { + $0.numberOfLines = 1 + } + + private let artistLabel = WMLabel( + text: "", + textColor: DesignSystemAsset.NewGrayColor.gray900.color, + font: .t7(weight: .light), + alignment: .left, + lineHeight: UIFont.WMFontSystem.t7(weight: .light).lineHeight, + kernValue: -0.5 + ).then { + $0.numberOfLines = 1 + } + + private let dateLabel = WMLabel( + text: "", + textColor: DesignSystemAsset.NewGrayColor.gray900.color, + font: .sc7(weight: .score3Light), + alignment: .right, + lineHeight: UIFont.WMFontSystem.t7().lineHeight, + kernValue: -0.5 + ).then { + $0.numberOfLines = 1 + } + + override init(frame: CGRect) { + super.init(frame: frame) + addSubview() + setLayout() + addEvent() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +extension SongResultCell { + private func addSubview() { + self.contentView.addSubviews(thumbnailView, thumnailButton, titleLabel, artistLabel, dateLabel) + } + + private func setLayout() { + thumbnailView.snp.makeConstraints { + $0.width.equalTo(72) + $0.height.equalTo(40) + $0.top.bottom.equalToSuperview().inset(10) + $0.leading.equalToSuperview().inset(20) + } + + thumnailButton.snp.makeConstraints { + $0.width.equalTo(72) + $0.height.equalTo(40) + $0.horizontalEdges.equalTo(thumbnailView.snp.horizontalEdges) + $0.leading.equalTo(thumbnailView.snp.leading) + } + + titleLabel.snp.makeConstraints { + $0.top.equalTo(thumbnailView.snp.top) + $0.leading.equalTo(thumbnailView.snp.trailing).offset(8) + } + + artistLabel.snp.makeConstraints { + $0.top.equalTo(titleLabel.snp.bottom).offset(2) + $0.leading.equalTo(titleLabel.snp.leading) + $0.trailing.equalTo(titleLabel.snp.trailing) + $0.bottom.equalTo(thumbnailView.snp.bottom) + } + + dateLabel.snp.makeConstraints { + $0.width.lessThanOrEqualTo(66) + $0.centerY.equalTo(thumbnailView.snp.centerY) + $0.trailing.equalToSuperview().inset(20) + $0.leading.equalTo(titleLabel.snp.trailing).offset(8) + } + } + + public func addEvent() { + thumnailButton.addAction { [weak self] in + + guard let model = self?.model else { + return + } + + self?.delegate?.thumbnailDidTap(key: model.id) + } + } + + public func update(_ model: SongEntity) { + self.model = model + thumbnailView.kf.setImage( + with: WMImageAPI.fetchYoutubeThumbnail(id: model.id).toURL, + placeholder: DesignSystemAsset.Logo.placeHolderMedium.image, + options: [.transition(.fade(0.2))] + ) + titleLabel.text = model.title + artistLabel.text = model.artist + dateLabel.text = model.date + self.contentView.backgroundColor = model.isSelected ? DesignSystemAsset.BlueGrayColor.gray200.color : .clear + } +} diff --git a/Projects/Features/SearchFeature/Sources/After/ViewControllers/AfterSearchViewController.swift b/Projects/Features/SearchFeature/Sources/After/ViewControllers/AfterSearchViewController.swift new file mode 100644 index 000000000..e7ea91d74 --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/After/ViewControllers/AfterSearchViewController.swift @@ -0,0 +1,161 @@ +import BaseFeature +import BaseFeatureInterface +import DesignSystem +import LogManager +import NVActivityIndicatorView +import Pageboy +import ReactorKit +import RxSwift +import SearchFeatureInterface +import SongsDomainInterface +import Tabman +import UIKit +import Utility + +public final class AfterSearchViewController: TabmanViewController, ViewControllerFromStoryBoard, StoryboardView { + @IBOutlet weak var tabBarView: UIView! + @IBOutlet weak var fakeView: UIView! + @IBOutlet weak var indicator: NVActivityIndicatorView! + + private var songSearchResultFactory: SongSearchResultFactory! + private var listSearchResultFactory: ListSearchResultFactory! + private var searchGlobalScrollState: SearchGlobalScrollProtocol! + public var disposeBag = DisposeBag() + + private var viewControllers: [UIViewController] = [ + UIViewController(), + UIViewController() + ] + + override public func viewDidLoad() { + super.viewDidLoad() + configureUI() + } + + public static func viewController( + songSearchResultFactory: SongSearchResultFactory, + listSearchResultFactory: ListSearchResultFactory, + searchGlobalScrollState: any SearchGlobalScrollProtocol, + reactor: AfterSearchReactor + ) -> AfterSearchViewController { + let viewController = AfterSearchViewController.viewController(storyBoardName: "Search", bundle: Bundle.module) + viewController.songSearchResultFactory = songSearchResultFactory + viewController.listSearchResultFactory = listSearchResultFactory + viewController.searchGlobalScrollState = searchGlobalScrollState + viewController.reactor = reactor + return viewController + } + + override public func pageboyViewController( + _ pageboyViewController: PageboyViewController, + didScrollToPageAt index: TabmanViewController.PageIndex, + direction: PageboyViewController.NavigationDirection, + animated: Bool + ) { + searchGlobalScrollState.expand() + } + + deinit { + LogManager.printDebug("❌ \(Self.self)") + } + + public func bind(reactor: AfterSearchReactor) { + bindState(reacotr: reactor) + bindAction(reactor: reactor) + } +} + +extension AfterSearchViewController { + func bindState(reacotr: AfterSearchReactor) { + let currentState = reacotr.state.share() + + currentState.map(\.text) + .filter { !$0.isEmpty } + .distinctUntilChanged() + .withUnretained(self) + .bind(onNext: { owner, text in + owner.viewControllers = [ + owner.songSearchResultFactory.makeView(text), + owner.listSearchResultFactory.makeView(text) + ] + owner.reloadData() + }) + .disposed(by: disposeBag) + } + + func bindAction(reactor: AfterSearchReactor) {} + + private func configureUI() { + self.fakeView.backgroundColor = DesignSystemAsset.BlueGrayColor.gray100.color + self.indicator.type = .circleStrokeSpin + self.indicator.color = DesignSystemAsset.PrimaryColorV2.point.color + self.dataSource = self // dateSource + let bar = TMBar.ButtonBar() + + // 배경색 + bar.backgroundView.style = .flat(color: .clear) + + // 간격 설정 + bar.layout.contentInset = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20) + bar.layout.contentMode = .fit + bar.layout.transitionStyle = .progressive + bar.layout.interButtonSpacing = 0 + + // 버튼 글씨 커스텀 + bar.buttons.customize { button in + button.tintColor = DesignSystemAsset.BlueGrayColor.gray400.color + button.selectedTintColor = DesignSystemAsset.BlueGrayColor.gray900.color + button.font = .setFont(.t5(weight: .medium)) + button.selectedFont = DesignSystemFontFamily.Pretendard.bold.font(size: 16) + } + + // indicator + bar.indicator.weight = .custom(value: 2) + bar.indicator.tintColor = DesignSystemAsset.PrimaryColorV2.point.color + bar.indicator.overscrollBehavior = .compress + addBar(bar, dataSource: self, at: .custom(view: tabBarView, layout: nil)) + bar.layer.addBorder( + [.bottom], + color: DesignSystemAsset.BlueGrayColor.gray300.color.withAlphaComponent(0.4), + height: 1 + ) + } +} + +extension AfterSearchViewController: PageboyViewControllerDataSource, TMBarDataSource { + public func numberOfViewControllers(in pageboyViewController: Pageboy.PageboyViewController) -> Int { + 2 + } + + public func viewController( + for pageboyViewController: Pageboy.PageboyViewController, + at index: Pageboy.PageboyViewController.PageIndex + ) -> UIViewController? { + viewControllers[index] + } + + public func defaultPage(for pageboyViewController: Pageboy.PageboyViewController) -> Pageboy.PageboyViewController + .Page? { + nil + } + + public func barItem(for bar: Tabman.TMBar, at index: Int) -> Tabman.TMBarItemable { + switch index { + case 0: + return TMBarItem(title: "노래") + case 1: + return TMBarItem(title: "리스트") + default: + let title = "Page \(index)" + return TMBarItem(title: title) + } + } +} + +extension AfterSearchViewController { + func scrollToTop() { + let current: Int = self.currentIndex ?? 0 + + searchGlobalScrollState.scrollToTop(page: current == 0 ? .song : .list) + } +} diff --git a/Projects/Features/SearchFeature/Sources/After/ViewControllers/ListSearchResultViewController.swift b/Projects/Features/SearchFeature/Sources/After/ViewControllers/ListSearchResultViewController.swift new file mode 100644 index 000000000..f88933871 --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/After/ViewControllers/ListSearchResultViewController.swift @@ -0,0 +1,247 @@ +import BaseFeature +import DesignSystem +import LogManager +import PlaylistFeatureInterface +import RxCocoa +import RxSwift +import SearchDomainInterface +import SnapKit +import SongsDomainInterface +import Then +import UIKit +import Utility + +final class ListSearchResultViewController: BaseReactorViewController, + PlaylistDetailNavigator { + var songCartView: SongCartView! + + var bottomSheetView: BottomSheetView! + + private let searchSortOptionComponent: SearchSortOptionComponent + private (set) var playlistDetailFactory: any PlaylistDetailFactory + + private let searchGlobalScrollState: any SearchGlobalScrollProtocol + + private lazy var collectionView: UICollectionView = createCollectionView().then { + $0.backgroundColor = DesignSystemAsset.BlueGrayColor.gray100.color + $0.isHidden = true + } + + private lazy var headerView: SearchOptionHeaderView = SearchOptionHeaderView(false) + + private lazy var dataSource: UICollectionViewDiffableDataSource< + ListSearchResultSection, + SearchPlaylistEntity + > = createDataSource() + + init( + _ reactor: ListSearchResultReactor, + searchSortOptionComponent: SearchSortOptionComponent, + playlistDetailFactory: any PlaylistDetailFactory, + searchGlobalScrollState: any SearchGlobalScrollProtocol + ) { + self.searchSortOptionComponent = searchSortOptionComponent + self.playlistDetailFactory = playlistDetailFactory + self.searchGlobalScrollState = searchGlobalScrollState + super.init(reactor: reactor) + } + + override func viewDidLoad() { + super.viewDidLoad() + reactor?.action.onNext(.viewDidLoad) + } + + override func bind(reactor: ListSearchResultReactor) { + super.bind(reactor: reactor) + collectionView.rx + .setDelegate(self) + .disposed(by: disposeBag) + + searchGlobalScrollState.listResultScrollToTopObservable + .observe(on: MainScheduler.asyncInstance) + .bind(with: self) { owner, _ in + owner.collectionView.setContentOffset(.zero, animated: true) + } + .disposed(by: disposeBag) + } + + override func bindAction(reactor: ListSearchResultReactor) { + super.bindAction(reactor: reactor) + + let sharedState = reactor.state.share() + + collectionView.rx.willDisplayCell + .map { $1 } + .withLatestFrom( + sharedState.map(\.dataSource), + resultSelector: { indexPath, datasource -> (IndexPath, Int) in + return (indexPath, datasource.count) + } + ) + .filter { $0.0.row == $0.1 - 1 } // 마지막 인덱스 접근 + .withLatestFrom(sharedState.map(\.canLoad)) { $1 } // 더 가져올께 있나? + .filter { $0 } + .map { _ in ListSearchResultReactor.Action.askLoadMore } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + headerView.rx.didTapSortButton + .withLatestFrom(sharedState.map(\.sortType)) + .bind(with: self) { owner, sortType in + guard let vc = owner.searchSortOptionComponent.makeView(sortType) as? SearchSortOptionViewController + else { + return + } + + vc.delegate = owner + + owner.showBottomSheet( + content: vc, + size: .fixed(240 + SAFEAREA_BOTTOM_HEIGHT()) + ) + } + .disposed(by: disposeBag) + } + + override func bindState(reactor: ListSearchResultReactor) { + super.bindState(reactor: reactor) + + let sharedState = reactor.state.share() + + reactor.pulse(\.$toastMessage) + .compactMap { $0 } + .bind(with: self) { owner, message in + owner.showToast(text: message, font: .setFont(.t6(weight: .light))) + } + .disposed(by: disposeBag) + + sharedState.map(\.sortType) + .distinctUntilChanged() + .bind(with: self) { owner, type in + owner.headerView.updateSortState(type) + } + .disposed(by: disposeBag) + + sharedState.map(\.isLoading) + .bind(with: self) { owner, isLoading in + + if isLoading { + owner.indicator.startAnimating() + } else { + owner.collectionView.isHidden = false + owner.indicator.stopAnimating() + } + } + .disposed(by: disposeBag) + + sharedState.map(\.dataSource) + .bind(with: self) { owner, dataSource in + + var snapshot = NSDiffableDataSourceSnapshot() + + snapshot.appendSections([.list]) + + snapshot.appendItems(dataSource, toSection: .list) + owner.dataSource.apply(snapshot, animatingDifferences: false) + + let warningView = WMWarningView( + text: "검색결과가 없습니다." + ) + + if dataSource.isEmpty { + owner.collectionView.setBackgroundView(warningView, 100) + } else { + owner.collectionView.restore() + } + } + .disposed(by: disposeBag) + } + + override func addView() { + super.addView() + self.view.addSubviews(headerView, collectionView) + } + + override func setLayout() { + super.setLayout() + + headerView.snp.makeConstraints { + $0.height.equalTo(30) + $0.top.equalToSuperview().offset(72) // 56 + 16 + $0.leading.trailing.equalToSuperview() + } + + collectionView.snp.makeConstraints { + $0.top.equalTo(headerView.snp.bottom) + $0.bottom.horizontalEdges.equalToSuperview() + } + } + + deinit { + LogManager.printDebug("❌ \(Self.self) 소멸") + } +} + +extension ListSearchResultViewController { + private func createCollectionView() -> UICollectionView { + return UICollectionView(frame: .zero, collectionViewLayout: ListSearchResultCollectionViewLayout()) + } + + private func createDataSource() + -> UICollectionViewDiffableDataSource { + let cellRegistration = UICollectionView + .CellRegistration { cell, _, item in + cell.update(item) + } + + let dataSource = UICollectionViewDiffableDataSource< + ListSearchResultSection, + SearchPlaylistEntity + >(collectionView: collectionView) { ( + collectionView: UICollectionView, + indexPath: IndexPath, + item: SearchPlaylistEntity + ) -> UICollectionViewCell? in + + return collectionView.dequeueConfiguredReusableCell( + using: cellRegistration, + for: indexPath, + item: item + ) + } + + return dataSource + } + + public func scrollToTop() {} +} + +extension ListSearchResultViewController: SearchSortOptionDelegate { + func updateSortType(_ type: SortType) { + LogManager.analytics(SearchAnalyticsLog.selectSearchSort(option: type.rawValue, category: "list")) + if reactor?.currentState.sortType != type { + reactor?.action.onNext(.changeSortType(type)) + } + } +} + +extension ListSearchResultViewController: UICollectionViewDelegate { + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + guard let model = dataSource.itemIdentifier(for: indexPath) else { + return + } + + LogManager.analytics(CommonAnalyticsLog.clickPlaylistItem(location: .searchResult, key: model.key)) + navigatePlaylistDetail(key: model.key) + } + + func scrollViewDidScroll(_ scrollView: UIScrollView) { + guard collectionView.isVerticallyScrollable else { return } + searchGlobalScrollState.scrollTo( + source: ( + scrollView.contentOffset.y, + scrollView.contentSize.height - scrollView.frame.size.height + ) + ) + } +} diff --git a/Projects/Features/SearchFeature/Sources/After/ViewControllers/SearchSortOptionViewController.swift b/Projects/Features/SearchFeature/Sources/After/ViewControllers/SearchSortOptionViewController.swift new file mode 100644 index 000000000..a19c4d2c4 --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/After/ViewControllers/SearchSortOptionViewController.swift @@ -0,0 +1,115 @@ +import BaseFeature +import RxCocoa +import RxSwift +import SearchDomainInterface +import SnapKit +import Then +import UIKit +import Utility + +protocol SearchSortOptionDelegate: AnyObject { + func updateSortType(_ type: SortType) +} + +final class SearchSortOptionViewController: BaseViewController { + weak var delegate: SearchSortOptionDelegate? + + private var disposeBag = DisposeBag() + + private let options: [SortType] = [.relevance, .latest, .oldest, .popular] + + private var selectedModel: SortType + + private lazy var dataSource: UITableViewDiffableDataSource = + createDataSource() + + private lazy var tableView: UITableView = UITableView().then { + $0.register(SearchSortOptionCell.self, forCellReuseIdentifier: SearchSortOptionCell.identifer) + $0.separatorStyle = .none + $0.isScrollEnabled = false + $0.delegate = self + } + + init(selectedModel: SortType) { + self.selectedModel = selectedModel + super.init(nibName: nil, bundle: nil) + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func viewDidLoad() { + super.viewDidLoad() + addSubviews() + setLayout() + configureUI() + initSnapShot() + bindAction() + } +} + +extension SearchSortOptionViewController { + private func addSubviews() { + self.view.addSubviews(tableView) + } + + private func setLayout() { + self.tableView.snp.makeConstraints { + $0.top.equalToSuperview().inset(20) + $0.leading.trailing.bottom.equalToSuperview() + } + } + + private func configureUI() { + self.view.backgroundColor = .white + self.tableView.backgroundColor = .white + } + + private func createDataSource() -> UITableViewDiffableDataSource { + return UITableViewDiffableDataSource(tableView: tableView) { [ + weak self + ] tableView, indexPath, _ -> UITableViewCell in + guard let self, let cell = tableView.dequeueReusableCell( + withIdentifier: SearchSortOptionCell.identifer, + for: indexPath + ) as? SearchSortOptionCell else { + return UITableViewCell() + } + cell.update(self.options[indexPath.row], self.selectedModel) + cell.selectionStyle = .none + return cell + } + } + + private func initSnapShot() { + tableView.dataSource = dataSource + + var snapShot = NSDiffableDataSourceSnapshot() + + snapShot.appendSections([0]) + + snapShot.appendItems(options, toSection: 0) + + dataSource.apply(snapShot) + } + + private func bindAction() { + tableView.rx.itemSelected + .map(\.row) + .bind(with: self) { owner, index in + + owner.dismiss(animated: true) { + owner.delegate?.updateSortType(owner.options[index]) + } + } + .disposed(by: disposeBag) + } +} + +extension SearchSortOptionViewController: UITableViewDelegate { + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + return 52.0 + } +} diff --git a/Projects/Features/SearchFeature/Sources/After/ViewControllers/SongSearchResultViewController.swift b/Projects/Features/SearchFeature/Sources/After/ViewControllers/SongSearchResultViewController.swift new file mode 100644 index 000000000..1f5ebe891 --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/After/ViewControllers/SongSearchResultViewController.swift @@ -0,0 +1,421 @@ +import BaseFeature +import BaseFeatureInterface +import DesignSystem +import Localization +import LogManager +import RxCocoa +import RxSwift +import SearchDomainInterface +import SignInFeatureInterface +import SnapKit +import SongsDomainInterface +import Then +import UIKit +import Utility + +final class SongSearchResultViewController: BaseReactorViewController, SongCartViewType { + var songCartView: SongCartView! + + var bottomSheetView: BottomSheetView! + + private let songDetailPresenter: any SongDetailPresentable + private let containSongsFactory: any ContainSongsFactory + private let signInFactory: any SignInFactory + private let textPopupFactory: any TextPopupFactory + private let searchSortOptionComponent: SearchSortOptionComponent + private let searchGlobalScrollState: any SearchGlobalScrollProtocol + + private lazy var collectionView: UICollectionView = createCollectionView().then { + $0.backgroundColor = DesignSystemAsset.BlueGrayColor.gray100.color + $0.scrollIndicatorInsets = .init(top: .zero, left: .zero, bottom: 56.0, right: .zero) + $0.isHidden = true + } + + private lazy var headerView: SearchOptionHeaderView = SearchOptionHeaderView(true) + + private let songCartContainerView: UIView = UIView().then { + $0.alpha = .zero + } + + private lazy var dataSource: UICollectionViewDiffableDataSource< + SongSearchResultSection, + SongEntity + > = createDataSource() + + init( + _ reactor: SongSearchResultReactor, + searchSortOptionComponent: SearchSortOptionComponent, + songDetailPresenter: any SongDetailPresentable, + containSongsFactory: any ContainSongsFactory, + signInFactory: any SignInFactory, + textPopupFactory: any TextPopupFactory, + searchGlobalScrollState: any SearchGlobalScrollProtocol + ) { + self.searchSortOptionComponent = searchSortOptionComponent + self.containSongsFactory = containSongsFactory + self.songDetailPresenter = songDetailPresenter + self.signInFactory = signInFactory + self.textPopupFactory = textPopupFactory + self.searchGlobalScrollState = searchGlobalScrollState + super.init(reactor: reactor) + } + + override func viewDidLoad() { + super.viewDidLoad() + self.view.backgroundColor = DesignSystemAsset.BlueGrayColor.gray100.color + reactor?.action.onNext(.viewDidLoad) + } + + override func viewDidDisappear(_ animated: Bool) { + super.viewDidDisappear(animated) + reactor?.action.onNext(.deselectAll) + } + + override func bind(reactor: SongSearchResultReactor) { + super.bind(reactor: reactor) + collectionView.rx + .setDelegate(self) + .disposed(by: disposeBag) + + searchGlobalScrollState.songResultScrollToTopObservable + .observe(on: MainScheduler.asyncInstance) + .bind(with: self) { owner, _ in + owner.collectionView.setContentOffset(.zero, animated: true) + } + .disposed(by: disposeBag) + } + + override func bindAction(reactor: SongSearchResultReactor) { + super.bindAction(reactor: reactor) + + let sharedState = reactor.state.share() + + collectionView.rx.willDisplayCell + .map { $1 } + .withLatestFrom( + sharedState.map(\.dataSource), + resultSelector: { indexPath, datasource -> (IndexPath, Int) in + return (indexPath, datasource.count) + } + ) + .filter { $0.0.row == $0.1 - 1 } // 마지막 인덱스 접근 확인 + .map { _ in () } + .withLatestFrom(sharedState.map(\.isLoading)) // 로딩 중 확인 + .filter { !$0 } + .withLatestFrom(sharedState.map(\.canLoad)) { $1 } // 더 가져올께 있나? + .filter { $0 } + .map { _ in SongSearchResultReactor.Action.askLoadMore } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + headerView.rx.didTapSortButton + .withLatestFrom(sharedState.map(\.sortType)) { $1 } + .bind(with: self) { owner, sortType in + guard let vc = owner.searchSortOptionComponent.makeView(sortType) as? SearchSortOptionViewController + else { + return + } + + vc.delegate = owner + + owner.showBottomSheet( + content: vc, + size: .fixed(240 + SAFEAREA_BOTTOM_HEIGHT()) + ) + } + .disposed(by: disposeBag) + + headerView.rx.selectedFilterItem + .distinctUntilChanged() + .bind(with: self) { _, type in + LogManager.analytics(SearchAnalyticsLog.selectSearchFilter(option: type.rawValue)) + reactor.action.onNext(.changeFilterType(type)) + } + .disposed(by: disposeBag) + } + + override func bindState(reactor: SongSearchResultReactor) { + super.bindState(reactor: reactor) + + let sharedState = reactor.state.share() + + reactor.pulse(\.$toastMessage) + .compactMap { $0 } + .withLatestFrom(sharedState.map(\.selectedCount)) { ($0, $1) } + .bind(with: self) { owner, info in + + let(message, count) = (info.0, info.1) + + owner.showToast(text: message, options: count == .zero ? [.tabBar] : [.tabBar, .songCart]) + } + .disposed(by: disposeBag) + + sharedState.map(\.sortType) + .distinctUntilChanged() + .bind(with: self) { owner, type in + owner.headerView.updateSortState(type) + } + .disposed(by: disposeBag) + + sharedState.map(\.isLoading) + .bind(with: self) { owner, isLoading in + + if isLoading { + owner.indicator.startAnimating() + } else { + owner.collectionView.isHidden = false + owner.indicator.stopAnimating() + } + } + .disposed(by: disposeBag) + + sharedState.map { $0.dataSource } + .distinctUntilChanged() + .bind(with: self) { owner, dataSource in + var snapshot = NSDiffableDataSourceSnapshot() + + snapshot.appendSections([.song]) + + snapshot.appendItems(dataSource) + + owner.dataSource.apply(snapshot, animatingDifferences: false) + + let warningView = WMWarningView(text: "검색결과가 없습니다.") + + if dataSource.isEmpty { + owner.collectionView.setBackgroundView(warningView, 100) + } else { + owner.collectionView.restore() + } + } + .disposed(by: disposeBag) + + sharedState.map(\.selectedCount) + .distinctUntilChanged() + .withLatestFrom(sharedState.map(\.dataSource)) { ($0, $1) } + .bind(with: self) { owner, info in + + let (count, limit) = (info.0, info.1.count) + if count == .zero { + UIView.animate(withDuration: 0.5) { + owner.songCartContainerView.alpha = .zero + } + owner.hideSongCart() + } else { + owner.songCartContainerView.alpha = 1.0 + owner.showSongCart( + in: owner.songCartContainerView, + type: .searchSong, + selectedSongCount: count, + totalSongCount: limit, + useBottomSpace: false + ) + owner.songCartView.delegate = owner + } + } + .disposed(by: disposeBag) + } + + override func addView() { + super.addView() + self.view.addSubviews(headerView, collectionView, songCartContainerView) + } + + override func setLayout() { + super.setLayout() + + headerView.snp.makeConstraints { + $0.height.equalTo(30) + $0.top.equalToSuperview().offset(72) // 56 + 16 + $0.leading.trailing.equalToSuperview() + } + + collectionView.snp.makeConstraints { + $0.top.equalTo(headerView.snp.bottom).offset(8) + $0.bottom.horizontalEdges.equalToSuperview() + } + + songCartContainerView.snp.makeConstraints { + $0.height.equalTo(56) + $0.horizontalEdges.equalToSuperview() + $0.bottom.equalToSuperview() + } + } + + override func configureUI() { + super.configureUI() + } + + deinit { + LogManager.printDebug("❌ \(Self.self) 소멸") + } +} + +extension SongSearchResultViewController { + private func createCollectionView() -> UICollectionView { + return UICollectionView(frame: .zero, collectionViewLayout: SongSearchResultCollectionViewLayout()) + } + + private func createDataSource() + -> UICollectionViewDiffableDataSource { + let cellRegistration = UICollectionView + .CellRegistration { [weak self] cell, _, item in + + guard let self else { return } + + cell.delegate = self + cell.update(item) + } + + let dataSource = UICollectionViewDiffableDataSource< + SongSearchResultSection, + SongEntity + >(collectionView: collectionView) { ( + collectionView: UICollectionView, + indexPath: IndexPath, + item: SongEntity + ) -> UICollectionViewCell? in + + return collectionView.dequeueConfiguredReusableCell( + using: cellRegistration, + for: indexPath, + item: item + ) + } + + return dataSource + } + + public func scrollToTop() { + collectionView.scrollToItem(at: IndexPath(row: 0, section: 0), at: .top, animated: true) + } +} + +extension SongSearchResultViewController: UICollectionViewDelegate { + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + reactor?.action.onNext(.itemDidTap(indexPath.row)) + } + + func scrollViewDidScroll(_ scrollView: UIScrollView) { + guard collectionView.isVerticallyScrollable else { return } + searchGlobalScrollState.scrollTo( + source: ( + scrollView.contentOffset.y, + scrollView.contentSize.height - scrollView.frame.size.height + ) + ) + } +} + +extension SongSearchResultViewController: SearchSortOptionDelegate { + func updateSortType(_ type: SortType) { + LogManager.analytics(SearchAnalyticsLog.selectSearchSort(option: type.rawValue, category: "song")) + if reactor?.currentState.sortType != type { + reactor?.action.onNext(.changeSortType(type)) + } + } +} + +extension SongSearchResultViewController: SongResultCellDelegate { + func thumbnailDidTap(key: String) { + guard let tappedSong = reactor?.currentState.dataSource + .first(where: { $0.id == key }) + else { return } + PlayState.shared.append(item: .init(id: tappedSong.id, title: tappedSong.title, artist: tappedSong.artist)) + let playlistIDs = PlayState.shared.currentPlaylist + .map(\.id) + songDetailPresenter.present(ids: playlistIDs, selectedID: key) + } +} + +extension SongSearchResultViewController: SongCartViewDelegate { + func buttonTapped(type: SongCartSelectType) { + guard let reactor = reactor else { + return + } + + let currentState = reactor.currentState + let songs = currentState.dataSource.filter { $0.isSelected } + let limit = 50 + + switch type { + case .allSelect(_): + break + case .addSong: + let log = CommonAnalyticsLog.clickAddMusicsButton(location: .search) + LogManager.analytics(log) + + guard songs.count <= limit else { + showToast( + text: LocalizationStrings.overFlowContainWarning(songs.count - limit), + options: [.tabBar, .songCart] + ) + return + } + + if PreferenceManager.userInfo == nil { + let vc = self.textPopupFactory.makeView( + text: LocalizationStrings.needLoginWarning, + cancelButtonIsHidden: false, + confirmButtonText: nil, + cancelButtonText: nil, + completion: { + let log = CommonAnalyticsLog.clickLoginButton(entry: .addMusics) + LogManager.analytics(log) + + let loginVC = self.signInFactory.makeView() + loginVC.modalPresentationStyle = .fullScreen + self.present(loginVC, animated: true) + }, + cancelCompletion: {} + ) + self.showBottomSheet(content: vc) + return + } + + let vc = containSongsFactory.makeView(songs: songs.map(\.id)) + vc.modalPresentationStyle = .overFullScreen + self.present(vc, animated: true) + reactor.action.onNext(.deselectAll) + + case .addPlayList: + + guard songs.count <= limit else { + showToast( + text: LocalizationStrings.overFlowAddPlaylistWarning(songs.count - limit), + options: [.tabBar, .songCart] + ) + return + } + showToast( + text: Localization.LocalizationStrings.addList, + options: [.tabBar] + ) + PlayState.shared.append(contentsOf: songs.map { PlaylistItem(item: $0) }) + reactor.action.onNext(.deselectAll) + + case .play: + LogManager.analytics( + CommonAnalyticsLog.clickPlayButton(location: .search, type: .multiple) + ) + guard songs.count <= limit else { + showToast( + text: LocalizationStrings.overFlowPlayWarning(songs.count - limit), + options: [.tabBar, .songCart] + ) + return + } + + PlayState.shared.append(contentsOf: songs.map { PlaylistItem(item: $0) }) + if songs.allSatisfy({ $0.title.isContainShortsTagTitle }) { + WakmusicYoutubePlayer(ids: songs.map { $0.id }, title: "왁타버스 뮤직", playPlatform: .youtube).play() + } else { + WakmusicYoutubePlayer(ids: songs.map { $0.id }, title: "왁타버스 뮤직").play() + } + reactor.action.onNext(.deselectAll) + + case .remove: + break + } + } +} diff --git a/Projects/Features/SearchFeature/Sources/Analytics/SearchAnalyticsLog.swift b/Projects/Features/SearchFeature/Sources/Analytics/SearchAnalyticsLog.swift new file mode 100644 index 000000000..f106b6d95 --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/Analytics/SearchAnalyticsLog.swift @@ -0,0 +1,12 @@ +import LogManager + +enum SearchAnalyticsLog: AnalyticsLogType { + /// 검색 전: + case clickRecommendPlaylistMore + case clickLatestWakmuYoutubeVideo + + /// 검색 후: + case viewSearchResult(keyword: String, category: String, count: Int) + case selectSearchFilter(option: String) + case selectSearchSort(option: String, category: String) +} diff --git a/Projects/Features/SearchFeature/Sources/Before/Components/BeforeSearchComponent.swift b/Projects/Features/SearchFeature/Sources/Before/Components/BeforeSearchComponent.swift new file mode 100644 index 000000000..505f41217 --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/Before/Components/BeforeSearchComponent.swift @@ -0,0 +1,30 @@ +import BaseFeature +import BaseFeatureInterface +import ChartDomainInterface +import Foundation +import NeedleFoundation +import PlaylistDomainInterface +import PlaylistFeatureInterface +import UIKit + +public protocol BeforeSearchDependency: Dependency { + var fetchRecommendPlaylistUseCase: any FetchRecommendPlaylistUseCase { get } + var fetchCurrentVideoUseCase: any FetchCurrentVideoUseCase { get } + var wakmusicRecommendComponent: WakmusicRecommendComponent { get } + var textPopupFactory: any TextPopupFactory { get } + var playlistDetailFactory: any PlaylistDetailFactory { get } +} + +public final class BeforeSearchComponent: Component { + public func makeView() -> UIViewController { + return BeforeSearchContentViewController( + wakmusicRecommendComponent: dependency.wakmusicRecommendComponent, + textPopupFactory: dependency.textPopupFactory, + playlistDetailFactory: dependency.playlistDetailFactory, + reactor: BeforeSearchReactor( + fetchCurrentVideoUseCase: dependency.fetchCurrentVideoUseCase, + fetchRecommendPlaylistUseCase: dependency.fetchRecommendPlaylistUseCase + ) + ) + } +} diff --git a/Projects/Features/SearchFeature/Sources/Before/Components/WakmusicRecommendComponent.swift b/Projects/Features/SearchFeature/Sources/Before/Components/WakmusicRecommendComponent.swift new file mode 100644 index 000000000..19ff30e17 --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/Before/Components/WakmusicRecommendComponent.swift @@ -0,0 +1,23 @@ +import Foundation +import NeedleFoundation +import PlaylistDomainInterface +import PlaylistFeatureInterface +import UIKit + +public protocol WakmusicRecommendDependency: Dependency { + var fetchRecommendPlaylistUseCase: any FetchRecommendPlaylistUseCase { get } + var wakmusicPlaylistDetailFactory: any WakmusicPlaylistDetailFactory { get } +} + +public final class WakmusicRecommendComponent: Component { + public func makeView() -> UIViewController { + let reactor = WakmusicRecommendReactor( + fetchRecommendPlaylistUseCase: dependency.fetchRecommendPlaylistUseCase + ) + + return WakmusicRecommendViewController( + wakmusicPlaylistDetailFactory: dependency.wakmusicPlaylistDetailFactory, + reactor: reactor + ) + } +} diff --git a/Projects/Features/SearchFeature/Sources/Before/CompositionalLayout/Enum/DataSource/BeforeVcDataSoruce.swift b/Projects/Features/SearchFeature/Sources/Before/CompositionalLayout/Enum/DataSource/BeforeVcDataSoruce.swift new file mode 100644 index 000000000..1be895d53 --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/Before/CompositionalLayout/Enum/DataSource/BeforeVcDataSoruce.swift @@ -0,0 +1,22 @@ +import ChartDomainInterface +import Foundation +import PlaylistDomainInterface + +#warning("실제 데이터 entity로 바꾸기") + +enum BeforeVcDataSoruce: Hashable { + case youtube(model: CurrentVideoEntity) + case recommend(model: RecommendPlaylistEntity) +// case popularList(model: Model) + #warning("추후 업데이트 시 사용") + var title: String { + switch self { + case let .youtube(model): + return "" + case let .recommend(model): + return model.title +// case let .popularList(model): +// return model.title + } + } +} diff --git a/Projects/Features/SearchFeature/Sources/Before/CompositionalLayout/Enum/Section/BeforeSearchSection.swift b/Projects/Features/SearchFeature/Sources/Before/CompositionalLayout/Enum/Section/BeforeSearchSection.swift new file mode 100644 index 000000000..3f39e97e8 --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/Before/CompositionalLayout/Enum/Section/BeforeSearchSection.swift @@ -0,0 +1,18 @@ +import Foundation + +internal enum BeforeSearchSection: Int { + case youtube + case recommend + case popularList + + var title: String { + switch self { + case .youtube: + return "" + case .recommend: + return "왁뮤팀이 추천하는 리스트" + case .popularList: + return "인기 리스트" + } + } +} diff --git a/Projects/Features/SearchFeature/Sources/Before/CompositionalLayout/Enum/Section/ListSearchResultSection.swift b/Projects/Features/SearchFeature/Sources/Before/CompositionalLayout/Enum/Section/ListSearchResultSection.swift new file mode 100644 index 000000000..68fd8816f --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/Before/CompositionalLayout/Enum/Section/ListSearchResultSection.swift @@ -0,0 +1,12 @@ +import Foundation + +internal enum ListSearchResultSection: Hashable { + case list + + var title: String { + switch self { + case .list: + "노래" + } + } +} diff --git a/Projects/Features/SearchFeature/Sources/Before/CompositionalLayout/Enum/Section/RecommendSection.swift b/Projects/Features/SearchFeature/Sources/Before/CompositionalLayout/Enum/Section/RecommendSection.swift new file mode 100644 index 000000000..e67ef0183 --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/Before/CompositionalLayout/Enum/Section/RecommendSection.swift @@ -0,0 +1,5 @@ +import Foundation + +internal enum RecommendSection: Hashable { + case main +} diff --git a/Projects/Features/SearchFeature/Sources/Before/CompositionalLayout/Enum/Section/SongSearchResultSection.swift b/Projects/Features/SearchFeature/Sources/Before/CompositionalLayout/Enum/Section/SongSearchResultSection.swift new file mode 100644 index 000000000..3ed8c8878 --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/Before/CompositionalLayout/Enum/Section/SongSearchResultSection.swift @@ -0,0 +1,12 @@ +import Foundation + +internal enum SongSearchResultSection: Hashable { + case song + + var title: String { + switch self { + case .song: + "노래" + } + } +} diff --git a/Projects/Features/SearchFeature/Sources/Before/CompositionalLayout/Layout/BeforeSearchCollectionViewLayout.swift b/Projects/Features/SearchFeature/Sources/Before/CompositionalLayout/Layout/BeforeSearchCollectionViewLayout.swift new file mode 100644 index 000000000..e4ae1f1c7 --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/Before/CompositionalLayout/Layout/BeforeSearchCollectionViewLayout.swift @@ -0,0 +1,102 @@ +import UIKit +import Utility + +final class BeforeSearchCollectionViewLayout: UICollectionViewCompositionalLayout { + init() { + super.init { sectionIndex, layoutEnvironment in + + guard let layoutKind = BeforeSearchSection(rawValue: sectionIndex) else { return nil } + + return BeforeSearchCollectionViewLayout.configureLayoutSection(layoutKind) + } + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +extension BeforeSearchCollectionViewLayout { + private static func configureLayoutSection(_ layoutKind: BeforeSearchSection) -> NSCollectionLayoutSection { + let headerLayout = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0), heightDimension: .absolute(30)) + + let header = NSCollectionLayoutBoundarySupplementaryItem( + layoutSize: headerLayout, + elementKind: BeforeSearchSectionHeaderView.kind, + alignment: .top + ) + + let group: NSCollectionLayoutGroup + let section: NSCollectionLayoutSection + + switch layoutKind { + case .youtube: + + let itemSize = NSCollectionLayoutSize( + widthDimension: .fractionalWidth(1.0), + heightDimension: .fractionalHeight(1.0) + ) + + let item: NSCollectionLayoutItem = NSCollectionLayoutItem(layoutSize: itemSize) + + let groupSize = NSCollectionLayoutSize( + widthDimension: .fractionalWidth(1.0), + heightDimension: .fractionalWidth(0.87) + ) + group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [item]) + group.contentInsets = NSDirectionalEdgeInsets(top: 20, leading: 20, bottom: 20, trailing: 20) + section = NSCollectionLayoutSection(group: group) + section.contentInsets = NSDirectionalEdgeInsets(top: .zero, leading: .zero, bottom: 20, trailing: .zero) + + case .recommend: + + let itemSize = NSCollectionLayoutSize( + widthDimension: .fractionalWidth(0.5), + heightDimension: .fractionalWidth(0.2439) + ) + + let item: NSCollectionLayoutItem = NSCollectionLayoutItem(layoutSize: itemSize) + + let groupSize = NSCollectionLayoutSize( + widthDimension: .fractionalWidth(1.0), + heightDimension: .fractionalWidth(0.25) + ) + group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitem: item, count: 2) + + group.interItemSpacing = .fixed(8) + + section = NSCollectionLayoutSection(group: group) + + section.boundarySupplementaryItems = [header] + section.interGroupSpacing = 8.0 + section.contentInsets = NSDirectionalEdgeInsets(top: 20, leading: 20, bottom: 40, trailing: 20) + + case .popularList: + + let itemSize = NSCollectionLayoutSize( + widthDimension: .fractionalWidth(1.0), + heightDimension: .fractionalHeight(1.0) + ) + + let item: NSCollectionLayoutItem = NSCollectionLayoutItem(layoutSize: itemSize) + + #warning("fractional 고민하기") + let groupSize = NSCollectionLayoutSize( + widthDimension: .absolute(140), + heightDimension: .absolute(190) + ) + + group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [item]) + + section = NSCollectionLayoutSection(group: group) + + section.boundarySupplementaryItems = [header] + section.contentInsets = NSDirectionalEdgeInsets(top: 20, leading: 20, bottom: 20, trailing: 20) + section.interGroupSpacing = 8 + section.orthogonalScrollingBehavior = .continuous + } + + return section + } +} diff --git a/Projects/Features/SearchFeature/Sources/Before/CompositionalLayout/Layout/RecommendCollectionViewLayout.swift b/Projects/Features/SearchFeature/Sources/Before/CompositionalLayout/Layout/RecommendCollectionViewLayout.swift new file mode 100644 index 000000000..eca59abdb --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/Before/CompositionalLayout/Layout/RecommendCollectionViewLayout.swift @@ -0,0 +1,41 @@ +import UIKit +import Utility + +final class RecommendCollectionViewLayout: UICollectionViewCompositionalLayout { + init() { + super.init { _, _ in + + return RecommendCollectionViewLayout.configureLayout() + } + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +extension RecommendCollectionViewLayout { + private static func configureLayout() -> NSCollectionLayoutSection { + let itemSize = NSCollectionLayoutSize( + widthDimension: .fractionalWidth(0.5), + heightDimension: .fractionalWidth(0.2439) + ) + + let item: NSCollectionLayoutItem = NSCollectionLayoutItem(layoutSize: itemSize) + + let groupSize = NSCollectionLayoutSize( + widthDimension: .fractionalWidth(1.0), + heightDimension: .fractionalWidth(0.25) + ) + let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitem: item, count: 2) + + group.interItemSpacing = .fixed(8) + + let section = NSCollectionLayoutSection(group: group) + section.interGroupSpacing = 8.0 + section.contentInsets = NSDirectionalEdgeInsets(top: 20, leading: 20, bottom: .zero, trailing: 20) + + return section + } +} diff --git a/Projects/Features/SearchFeature/Sources/Before/Reactors/BeforeSearchReactor.swift b/Projects/Features/SearchFeature/Sources/Before/Reactors/BeforeSearchReactor.swift new file mode 100644 index 000000000..c683c9ac3 --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/Before/Reactors/BeforeSearchReactor.swift @@ -0,0 +1,124 @@ +import ChartDomainInterface +import Foundation +import Localization +import PlaylistDomainInterface +import ReactorKit +import RxSwift +import Utility + +public struct WrapperDataSourceModel { + let currentVideo: CurrentVideoEntity + let recommendPlayList: [RecommendPlaylistEntity] +} + +public final class BeforeSearchReactor: Reactor { + private let disposeBag: DisposeBag = DisposeBag() + + private let fetchRecommendPlaylistUseCase: FetchRecommendPlaylistUseCase + private let fetchCurrentVideoUseCase: FetchCurrentVideoUseCase + + public var initialState: State + + private let service: any SearchCommonService + + public enum Action { + case viewDidLoad + case updateShowRecommend(Bool) + case rencentTextDidTap(String) + } + + public enum Mutation { + case updateDataSource(WrapperDataSourceModel) + case updateShowRecommend(Bool) + case updateLoadingState(Bool) + case showToast(String) + } + + public struct State { + var showRecommend: Bool + var isLoading: Bool + var dataSource: WrapperDataSourceModel + @Pulse var toastMessage: String? + } + + init( + fetchCurrentVideoUseCase: FetchCurrentVideoUseCase, + fetchRecommendPlaylistUseCase: FetchRecommendPlaylistUseCase, + service: some SearchCommonService = DefaultSearchCommonService.shared + ) { + self.fetchCurrentVideoUseCase = fetchCurrentVideoUseCase + self.fetchRecommendPlaylistUseCase = fetchRecommendPlaylistUseCase + self.service = service + self.initialState = State( + showRecommend: true, + isLoading: false, + dataSource: WrapperDataSourceModel(currentVideo: .init(id: ""), recommendPlayList: []) + ) + } + + public func mutate(action: Action) -> Observable { + switch action { + case .viewDidLoad: + return updateDataSource() + case let .updateShowRecommend(flag): + return Observable.just(.updateShowRecommend(flag)) + case let .rencentTextDidTap(text): + return updateRecentText(text) + } + } + + public func reduce(state: State, mutation: Mutation) -> State { + var newState = state + + switch mutation { + case let .updateDataSource(data): + newState.dataSource = data + + case let .updateShowRecommend(flag): + newState.showRecommend = flag + case let .updateLoadingState(isLoading): + newState.isLoading = isLoading + case let .showToast(message): + newState.toastMessage = message + } + + return newState + } + + public func transform(mutation: Observable) -> Observable { + let typingState = service.typingStatus.map { Mutation.updateShowRecommend($0 == .before) } + + return Observable.merge(mutation, typingState) + } +} + +extension BeforeSearchReactor { + func updateDataSource() -> Observable { + return .concat([ + .just(.updateLoadingState(true)), + + Observable.zip( + fetchCurrentVideoUseCase + .execute() + .asObservable(), + fetchRecommendPlaylistUseCase + .execute() + .asObservable() + ).map { Mutation.updateDataSource(WrapperDataSourceModel(currentVideo: $0.0, recommendPlayList: $0.1)) } + .catch { error in + let wmErorr = error.asWMError + return Observable.just( + Mutation.showToast(wmErorr.errorDescription ?? LocalizationStrings.unknownErrorWarning) + ) + }, + .just(.updateLoadingState(false)) + ]) + } + + func updateRecentText(_ text: String) -> Observable { + service.recentText.onNext(text) + service.typingStatus.onNext(.search) + + return .empty() + } +} diff --git a/Projects/Features/SearchFeature/Sources/Before/Reactors/WakmusicRecommendReactor.swift b/Projects/Features/SearchFeature/Sources/Before/Reactors/WakmusicRecommendReactor.swift new file mode 100644 index 000000000..643c49ee0 --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/Before/Reactors/WakmusicRecommendReactor.swift @@ -0,0 +1,88 @@ +import Foundation +import Localization +import LogManager +import PlaylistDomainInterface +import ReactorKit +import RxSwift + +final class WakmusicRecommendReactor: Reactor { + private var disposeBag: DisposeBag = DisposeBag() + private var fetchRecommendPlaylistUseCase: any FetchRecommendPlaylistUseCase + + var initialState: State + + enum Action { + case viewDidLoad + } + + enum Mutation { + case updateDataSource([RecommendPlaylistEntity]) + case updateLodingState(Bool) + case showToast(String) + } + + struct State { + var dataSource: [RecommendPlaylistEntity] + var isLoading: Bool + @Pulse var toastMessage: String? + } + + func mutate(action: Action) -> Observable { + switch action { + case .viewDidLoad: + return updateDataSource() + } + } + + func reduce(state: State, mutation: Mutation) -> State { + var newState = state + + switch mutation { + case let .updateDataSource(dataSource): + newState.dataSource = dataSource + case let .updateLodingState(isLoading): + newState.isLoading = isLoading + + case let .showToast(message): + newState.toastMessage = message + } + + return newState + } + + init(fetchRecommendPlaylistUseCase: any FetchRecommendPlaylistUseCase) { + LogManager.printDebug("✅ \(Self.self)") + self.fetchRecommendPlaylistUseCase = fetchRecommendPlaylistUseCase + self.initialState = State( + dataSource: [], + isLoading: true + ) + } + + deinit { + LogManager.printDebug("❌ \(Self.self)") + } +} + +extension WakmusicRecommendReactor { + func updateDataSource() -> Observable { + return .concat([ + .just(.updateLodingState(true)), + fetchRecommendPlaylistUseCase + .execute() + .asObservable() + .map { Mutation.updateDataSource($0) } + .catch { error in + let wmErorr = error.asWMError + return Observable.just( + Mutation.showToast(wmErorr.errorDescription ?? LocalizationStrings.unknownErrorWarning) + ) + }, + .just(.updateLodingState(false)) + ]) + } + + func updateLoadnigState(isLoading: Bool) -> Observable { + return .just(.updateLodingState(isLoading)) + } +} diff --git a/Projects/Features/SearchFeature/Sources/Before/ViewControllers/BeforeSearchContentViewController.swift b/Projects/Features/SearchFeature/Sources/Before/ViewControllers/BeforeSearchContentViewController.swift new file mode 100644 index 000000000..c2ed84d16 --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/Before/ViewControllers/BeforeSearchContentViewController.swift @@ -0,0 +1,358 @@ +import BaseFeature +import BaseFeatureInterface +import ChartDomainInterface +import DesignSystem +import LogManager +import NeedleFoundation +import NVActivityIndicatorView +import PlaylistDomainInterface +import PlaylistFeatureInterface +import ReactorKit +import RxCocoa +import RxSwift +import UIKit +import Utility + +final class BeforeSearchContentViewController: BaseReactorViewController, PlaylistDetailNavigator { + private let wakmusicRecommendComponent: WakmusicRecommendComponent + private let textPopupFactory: TextPopupFactory + private (set) var playlistDetailFactory: any PlaylistDetailFactory + + private let tableView: UITableView = UITableView().then { + $0.register(RecentRecordTableViewCell.self, forCellReuseIdentifier: "RecentRecordTableViewCell") + $0.separatorStyle = .none + $0.isHidden = true + } + + private lazy var dataSource: UICollectionViewDiffableDataSource = + createDataSource() + + private lazy var collectionView: UICollectionView = createCollectionView().then { + $0.backgroundColor = DesignSystemAsset.BlueGrayColor.blueGray100.color + } + + init( + wakmusicRecommendComponent: WakmusicRecommendComponent, + textPopupFactory: TextPopupFactory, + playlistDetailFactory: any PlaylistDetailFactory, + reactor: BeforeSearchReactor + ) { + self.textPopupFactory = textPopupFactory + self.wakmusicRecommendComponent = wakmusicRecommendComponent + self.playlistDetailFactory = playlistDetailFactory + super.init(reactor: reactor) + } + + deinit { + LogManager.printDebug("❌ \(Self.self)") + } + + override public func viewDidLoad() { + super.viewDidLoad() + reactor?.action.onNext(.viewDidLoad) + } + + override public func addView() { + super.addView() + self.view.addSubviews(collectionView, tableView) + } + + override public func setLayout() { + super.setLayout() + + tableView.snp.makeConstraints { + $0.edges.equalToSuperview() + } + + collectionView.snp.makeConstraints { + $0.edges.equalToSuperview() + } + } + + override public func configureUI() { + super.configureUI() + + self.tableView.backgroundColor = DesignSystemAsset.BlueGrayColor.gray100.color + self.tableView.tableFooterView = UIView(frame: .init(x: 0, y: 0, width: APP_WIDTH(), height: PLAYER_HEIGHT())) + self.tableView.verticalScrollIndicatorInsets = UIEdgeInsets(top: 0, left: 0, bottom: PLAYER_HEIGHT(), right: 0) + } + + override public func bind(reactor: BeforeSearchReactor) { + super.bind(reactor: reactor) + + // 헤더 적용을 위한 델리게이트 + tableView.rx.setDelegate(self) + .disposed(by: disposeBag) + collectionView.delegate = self + } + + override public func bindAction(reactor: BeforeSearchReactor) { + super.bindAction(reactor: reactor) + + tableView.rx.modelSelected(String.self) + .map { Reactor.Action.rencentTextDidTap($0) } + .bind(to: reactor.action) + .disposed(by: disposeBag) + } + + override public func bindState(reactor: BeforeSearchReactor) { + super.bindState(reactor: reactor) + + let sharedState = reactor.state.share() + + reactor.pulse(\.$toastMessage) + .compactMap { $0 } + .bind(with: self) { owner, message in + owner.showToast(text: message, font: .setFont(.t6(weight: .light))) + } + .disposed(by: disposeBag) + + sharedState.map(\.isLoading) + .distinctUntilChanged() + .withUnretained(self) + .bind(onNext: { onwer, isLoading in + + if isLoading { + onwer.indicator.startAnimating() + } else { + onwer.indicator.stopAnimating() + } + }) + .disposed(by: disposeBag) + + // 검색 전, 최근 검색어 스위칭 + sharedState.map(\.showRecommend) + .distinctUntilChanged() + .withUnretained(self) + .bind { owner, flag in + owner.tableView.isHidden = flag + owner.collectionView.isHidden = !flag + } + .disposed(by: disposeBag) + + // 최근 검색어 tableView 셋팅 + Utility.PreferenceManager.$recentRecords + .compactMap { $0 ?? [] } + .bind(to: tableView.rx.items) { ( + tableView: UITableView, + index: Int, + element: String + ) -> RecentRecordTableViewCell in + guard let cell = tableView.dequeueReusableCell( + withIdentifier: "RecentRecordTableViewCell", + for: IndexPath(row: index, section: 0) + ) as? RecentRecordTableViewCell else { + return RecentRecordTableViewCell() + } + cell.backgroundColor = .clear + cell.selectionStyle = .none + cell.update(element) + + return cell + }.disposed(by: disposeBag) + + sharedState.map(\.dataSource) + .bind(with: self) { owner, dataSource in + + var snapShot = NSDiffableDataSourceSnapshot() + snapShot.appendSections([.youtube, .recommend]) + + snapShot.appendItems([.youtube(model: dataSource.currentVideo)], toSection: .youtube) + snapShot.appendItems(dataSource.recommendPlayList.map { .recommend(model: $0) }, toSection: .recommend) + + #warning("추후 업데이트 시 사용") + // snapShot.appendItems(tmp.map { .popularList(model: $0) }, toSection: .popularList) + + owner.dataSource.apply(snapShot, animatingDifferences: false) + } + .disposed(by: disposeBag) + } +} + +extension BeforeSearchContentViewController: UITableViewDelegate { + public func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + return 40 + } + + public func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { + guard let state = reactor?.currentState else { + return .zero + } + + if (Utility.PreferenceManager.recentRecords ?? []).isEmpty { + return (APP_HEIGHT() * 3) / 8 + } else { + return 68 + } + } + + public func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { + let warningView = WarningView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: 300)) + warningView.text = "최근 검색 기록이 없습니다." + + let recentRecordHeaderView = RecentRecordHeaderView() + + // 최근 검색어 전체 삭제 버튼 클릭 이벤트 받는 통로 + recentRecordHeaderView.completionHandler = { [weak self] in + + guard let self = self, let textPopupViewController = self.textPopupFactory.makeView( + text: "전체 내역을 삭제하시겠습니까?", + cancelButtonIsHidden: false, + confirmButtonText: nil, + cancelButtonText: nil, + completion: { Utility.PreferenceManager.recentRecords = nil }, + cancelCompletion: nil + ) as? TextPopupViewController else { + return + } + + self.showBottomSheet(content: textPopupViewController) + } + + if (Utility.PreferenceManager.recentRecords ?? []).isEmpty { + return warningView + + } else { + return recentRecordHeaderView + } + } +} + +// MARK: Compositional +extension BeforeSearchContentViewController { + private func createCollectionView() -> UICollectionView { + return UICollectionView(frame: .zero, collectionViewLayout: BeforeSearchCollectionViewLayout()) + } + + private func createDataSource() -> UICollectionViewDiffableDataSource { + // MARK: Cell + + let youtubeCellRegistration = UICollectionView + .CellRegistration { cell, indexPath, itemIdentifier in + + cell.update(model: itemIdentifier) + } + + let recommendCellRegistration = UICollectionView.CellRegistration< + RecommendPlayListCell, + RecommendPlaylistEntity + >(cellNib: UINib( + nibName: "RecommendPlayListCell", + bundle: BaseFeatureResources.bundle + )) { cell, indexPath, itemIdentifier in + cell.update(model: itemIdentifier) + } + + #warning("추후 업데이트 시 사용") +// let popularListCellRegistration = UICollectionView +// .CellRegistration { cell, indexPath, item in +// +// cell.update(item) +// } + + // MARK: Header + + let headerRegistration = UICollectionView + .SupplementaryRegistration( + elementKind: BeforeSearchSectionHeaderView + .kind + ) { [weak self] supplementaryView, string, indexPath in + + guard let self, let layoutKind = BeforeSearchSection(rawValue: indexPath.section) else { return } + supplementaryView.delegate = self + supplementaryView.update(layoutKind.title, indexPath.section) + } + + let dataSource = UICollectionViewDiffableDataSource< + BeforeSearchSection, + BeforeVcDataSoruce + >(collectionView: collectionView) { + ( + collectionView: UICollectionView, + indexPath: IndexPath, + item: BeforeVcDataSoruce + ) -> UICollectionViewCell? in + + switch item { + case let .youtube(model: model): + return collectionView.dequeueConfiguredReusableCell( + using: youtubeCellRegistration, + for: indexPath, + item: model + ) + case let .recommend(model: model): + return + collectionView.dequeueConfiguredReusableCell( + using: recommendCellRegistration, + for: indexPath, + item: model + ) + +// case let .popularList(model: model): +// break + #warning("추후 업데이트 시 사용") +// return collectionView.dequeueConfiguredReusableCell( +// using: popularListCellRegistration, +// for: indexPath, +// item: model +// ) + } + } + + dataSource.supplementaryViewProvider = { collectionView, kind, index in + return collectionView.dequeueConfiguredReusableSupplementary(using: headerRegistration, for: index) + } + + return dataSource + } +} + +// MARK: CollectionView Deleagate +extension BeforeSearchContentViewController: UICollectionViewDelegate { + public func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + guard let model = dataSource.itemIdentifier(for: indexPath) else { + return + } + + switch model { + case let .youtube(model: model): + // 주간 왁뮤 + WakmusicYoutubePlayer(id: model.id, playPlatform: .youtube).play() + LogManager.analytics(SearchAnalyticsLog.clickLatestWakmuYoutubeVideo) + case let .recommend(model: model): + let log = CommonAnalyticsLog.clickPlaylistItem(location: .search, key: model.key) + LogManager.analytics(log) + navigateWMPlaylistDetail(key: model.key) + + #warning("추후 업데이트 시 사용") +// case let .popularList(model: model): +// LogManager.printDebug("popular \(model)") + } + } +} + +// MARK: 전체보기 +extension BeforeSearchContentViewController: BeforeSearchSectionHeaderViewDelegate { + func tap(_ section: Int?) { + if let section = section, let layoutKind = BeforeSearchSection(rawValue: section) { + switch layoutKind { + case .youtube: + break + case .recommend: +// LogManager.analytics(SearchAnalyticsLog.clickRecommendPlaylistMore) +// self.navigationController?.pushViewController(wakmusicRecommendComponent.makeView(), animated: true) + #warning("추후 업데이트 시 사용") + break + case .popularList: + #warning("추후 업데이트 시 사용") + break + } + } + } +} + +extension BeforeSearchContentViewController { + func scrollToTop() { + collectionView.scroll(to: .top) + } +} diff --git a/Projects/Features/SearchFeature/Sources/Before/ViewControllers/WakmusicRecommendViewController.swift b/Projects/Features/SearchFeature/Sources/Before/ViewControllers/WakmusicRecommendViewController.swift new file mode 100644 index 000000000..d5c5013c5 --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/Before/ViewControllers/WakmusicRecommendViewController.swift @@ -0,0 +1,178 @@ +import BaseFeature +import DesignSystem +import LogManager +import PlaylistDomainInterface +import PlaylistFeatureInterface +import UIKit +import Utility + +final class WakmusicRecommendViewController: BaseReactorViewController { + private let wakmusicPlaylistDetailFactory: any WakmusicPlaylistDetailFactory + + private let wmNavigationbarView = WMNavigationBarView().then { + $0.setTitle("왁뮤팀이 추천하는 리스트") + } + + private let dismissButton = UIButton().then { + let dismissImage = DesignSystemAsset.Navigation.back.image + $0.setImage(dismissImage, for: .normal) + } + + private lazy var collectionView: UICollectionView = createCollectionView().then { + $0.backgroundColor = .clear + } + + private lazy var dataSource: UICollectionViewDiffableDataSource = + createDataSource() + + init(wakmusicPlaylistDetailFactory: any WakmusicPlaylistDetailFactory, reactor: WakmusicRecommendReactor) { + self.wakmusicPlaylistDetailFactory = wakmusicPlaylistDetailFactory + super.init(reactor: reactor) + } + + override func viewDidLoad() { + super.viewDidLoad() + self.view.backgroundColor = DesignSystemAsset.BlueGrayColor.gray100.color + reactor?.action.onNext(.viewDidLoad) + + LogManager.analytics(CommonAnalyticsLog.viewPage(pageName: .wakmusicRecommendPlaylist)) + } + + override public func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + navigationController?.interactivePopGestureRecognizer?.delegate = nil + } + + override func addView() { + super.addView() + self.view.addSubviews(wmNavigationbarView, collectionView) + } + + override func setLayout() { + super.setLayout() + + wmNavigationbarView.snp.makeConstraints { + $0.top.equalToSuperview().offset(STATUS_BAR_HEGHIT()) + $0.horizontalEdges.equalToSuperview() + $0.height.equalTo(48) + } + wmNavigationbarView.setLeftViews([dismissButton]) + + collectionView.snp.makeConstraints { + $0.top.equalTo(wmNavigationbarView.snp.bottom) + $0.horizontalEdges.equalToSuperview() + $0.bottom.equalToSuperview() + } + } + + override func bind(reactor: WakmusicRecommendReactor) { + super.bind(reactor: reactor) + collectionView.delegate = self + } + + override func bindState(reactor: WakmusicRecommendReactor) { + super.bindState(reactor: reactor) + let sharedState = reactor.state.share() + + reactor.pulse(\.$toastMessage) + .compactMap { $0 } + .bind(with: self) { owner, message in + owner.showToast(text: message, font: .setFont(.t6(weight: .light))) + } + .disposed(by: disposeBag) + + sharedState.map(\.dataSource) + .distinctUntilChanged() + .withUnretained(self) + .bind(onNext: { owner, recommendPlaylist in + + var snapShot = owner.dataSource.snapshot(for: .main) + snapShot.append(recommendPlaylist) + owner.dataSource.apply(snapShot, to: .main) + + }) + .disposed(by: disposeBag) + + sharedState.map(\.isLoading) + .distinctUntilChanged() + .withUnretained(self) + .bind { owner, isLoading in + if isLoading { + owner.indicator.startAnimating() + } else { + owner.indicator.stopAnimating() + } + } + .disposed(by: disposeBag) + } + + override func bindAction(reactor: WakmusicRecommendReactor) { + super.bindAction(reactor: reactor) + + dismissButton.rx + .tap + .bind(with: self) { owner, _ in + owner.navigationController?.popViewController(animated: true) + } + .disposed(by: disposeBag) + } +} + +extension WakmusicRecommendViewController { + private func createCollectionView() -> UICollectionView { + return UICollectionView(frame: .zero, collectionViewLayout: RecommendCollectionViewLayout()) + } + + private func createDataSource() -> UICollectionViewDiffableDataSource { + let recommendCellRegistration = UICollectionView.CellRegistration< + RecommendPlayListCell, + RecommendPlaylistEntity + >(cellNib: UINib( + nibName: "RecommendPlayListCell", + bundle: BaseFeatureResources.bundle + )) { cell, indexPath, item in + cell.update( + model: item + ) + } + let dataSource = UICollectionViewDiffableDataSource< + RecommendSection, + RecommendPlaylistEntity + >(collectionView: collectionView) { + ( + collectionView: UICollectionView, indexPath: IndexPath, item: RecommendPlaylistEntity + ) -> UICollectionViewCell? in + + return + collectionView.dequeueConfiguredReusableCell( + using: recommendCellRegistration, + for: indexPath, + item: item + ) + } + + return dataSource + } + + private func initDataSource() { + // initial data + var snapshot = NSDiffableDataSourceSnapshot() + + snapshot.appendSections([.main]) + + dataSource.apply(snapshot, animatingDifferences: false) + } +} + +extension WakmusicRecommendViewController: UICollectionViewDelegate { + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + guard let model = dataSource.itemIdentifier(for: indexPath) else { + return + } + + self.navigationController?.pushViewController( + wakmusicPlaylistDetailFactory.makeView(key: model.key), + animated: true + ) + } +} diff --git a/Projects/Features/SearchFeature/Sources/Before/Views/BeforeSearchSectionHeaderView.swift b/Projects/Features/SearchFeature/Sources/Before/Views/BeforeSearchSectionHeaderView.swift new file mode 100644 index 000000000..8732fd22c --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/Before/Views/BeforeSearchSectionHeaderView.swift @@ -0,0 +1,71 @@ +import DesignSystem +import SnapKit +import Then +import UIKit +import Utility + +protocol BeforeSearchSectionHeaderViewDelegate: AnyObject { + func tap(_ section: Int?) +} + +final class BeforeSearchSectionHeaderView: + UICollectionReusableView { + static let kind = "before-search-section-header" + + weak var delegate: BeforeSearchSectionHeaderViewDelegate? + + var section: Int? + + private let label: WMLabel = WMLabel( + text: "", + textColor: DesignSystemAsset.BlueGrayColor.blueGray900.color, + font: .t5(weight: .bold) + ) + + private let button: UIButton = UIButton().then { + $0.setTitle("전체보기", for: .normal) + + $0.setTitleColor(DesignSystemAsset.BlueGrayColor.gray900.color.withAlphaComponent(0.6), for: .normal) + + $0.titleLabel?.font = DesignSystemFontFamily.Pretendard.medium.font(size: 14) + + #warning("추후 히든 해제") + $0.isHidden = true + } + + override init(frame: CGRect) { + super.init(frame: frame) + + self.addSubviews(label, button) + setLayout() + + button.addAction { [weak self] in + + guard let self else { return } + + self.delegate?.tap(self.section) + } + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +extension BeforeSearchSectionHeaderView { + public func update(_ title: String, _ section: Int) { + label.text = title + self.section = section + } + + private func setLayout() { + label.snp.makeConstraints { + $0.leading.top.bottom.equalToSuperview() + } + + button.snp.makeConstraints { + $0.trailing.top.bottom.equalToSuperview() + } + } +} diff --git a/Projects/Features/SearchFeature/Sources/Before/Views/PopularPlayListCell.swift b/Projects/Features/SearchFeature/Sources/Before/Views/PopularPlayListCell.swift new file mode 100644 index 000000000..a7bec50aa --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/Before/Views/PopularPlayListCell.swift @@ -0,0 +1,68 @@ +import DesignSystem +import UIKit + +final class PopularPlayListCell: UICollectionViewCell { + private let imageView: UIImageView = UIImageView().then { + $0.image = DesignSystemAsset.PlayListTheme.theme10.image + $0.contentMode = .scaleAspectFill + } + + private let titleLabel = WMLabel( + text: "", + textColor: DesignSystemAsset.NewGrayColor.gray900.color, + font: .t6(weight: .medium), + alignment: .left, + lineHeight: UIFont.WMFontSystem.t6().lineHeight, + kernValue: -0.5 + ).then { + $0.numberOfLines = 1 + } + + private let nickNameLabel = WMLabel( + text: "", + textColor: DesignSystemAsset.NewGrayColor.gray900.color, + font: .t7(weight: .light), + alignment: .left, + lineHeight: UIFont.WMFontSystem.t7(weight: .light).lineHeight, + kernValue: -0.5 + ).then { + $0.numberOfLines = 1 + } + + override init(frame: CGRect) { + super.init(frame: frame) + self.contentView.addSubviews(imageView, titleLabel, nickNameLabel) + configureUI() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +extension PopularPlayListCell { + #warning("추후 업데이트 시 사용") +// public func update(_ model: Model) { +// self.titleLabel.text = model.title +// self.nickNameLabel.text = "Hamp" +// } + + private func configureUI() { + imageView.snp.makeConstraints { + $0.top.equalToSuperview() + $0.width.height.equalTo(140) + } + + titleLabel.snp.makeConstraints { + $0.top.equalTo(imageView.snp.bottom).offset(8) + $0.horizontalEdges.equalToSuperview() + } + + nickNameLabel.snp.makeConstraints { + $0.top.equalTo(titleLabel.snp.bottom).offset(2) + $0.horizontalEdges.equalToSuperview() + $0.bottom.equalToSuperview() + } + } +} diff --git a/Projects/Features/SearchFeature/Sources/Before/Views/RecentRecordHeaderView.swift b/Projects/Features/SearchFeature/Sources/Before/Views/RecentRecordHeaderView.swift new file mode 100644 index 000000000..7cd83cdb9 --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/Before/Views/RecentRecordHeaderView.swift @@ -0,0 +1,46 @@ +import DesignSystem +import UIKit +import Utility + +final class RecentRecordHeaderView: UIView { + @IBOutlet weak var removeAllButton: UIButton! + @IBOutlet weak var removeAllLabel: UILabel! + @IBOutlet weak var recentLabel: UILabel! + + /// 1. 넘겨주는 연결통로 + var completionHandler: (() -> Void)? + + @IBAction func removeAll(_ sender: UIButton) { + completionHandler?() + } + + override init(frame: CGRect) { // 코드쪽에서 생성 시 호출 + super.init(frame: frame) + self.configureUI() + } + + required init?(coder aDecoder: NSCoder) { // StoryBoard에서 호출됨 + super.init(coder: aDecoder) + self.configureUI() + } + + private func configureUI() { + if let view = Bundle.module.loadNibNamed("RecentRecordHeaderView", owner: self, options: nil)! + .first as? UIView { + view.frame = self.bounds + view.layoutIfNeeded() // 드로우 사이클을 호출할 때 쓰임 + view.backgroundColor = DesignSystemAsset.BlueGrayColor.gray100.color + self.addSubview(view) + } + + self.recentLabel.text = "최근 검색어" + self.recentLabel.font = DesignSystemFontFamily.Pretendard.bold.font(size: 16) + self.recentLabel.textColor = DesignSystemAsset.NewGrayColor.gray900.color + self.recentLabel.setTextWithAttributes(kernValue: -0.5) + + self.removeAllLabel.text = "전체삭제" + self.removeAllLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 14) + self.removeAllLabel.textColor = DesignSystemAsset.NewGrayColor.gray400.color + self.removeAllLabel.setTextWithAttributes(kernValue: -0.5) + } +} diff --git a/Projects/Features/SearchFeature/Sources/Before/Views/RecentRecordTableViewCell.swift b/Projects/Features/SearchFeature/Sources/Before/Views/RecentRecordTableViewCell.swift new file mode 100644 index 000000000..0f423ac7c --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/Before/Views/RecentRecordTableViewCell.swift @@ -0,0 +1,56 @@ +import DesignSystem +import UIKit +import Utility + +protocol RecentRecordDelegate: AnyObject { + func selectedItems(_ keyword: String) +} + +final class RecentRecordTableViewCell: UITableViewCell { + private let recentLabel = WMLabel( + text: "", + textColor: DesignSystemAsset.NewGrayColor.gray900.color, + font: .t6(weight: .medium), + alignment: .left, + lineHeight: UIFont.WMFontSystem.t6().lineHeight, + kernValue: -0.5 + ).then { + $0.numberOfLines = 1 + } + + private let button: UIButton = UIButton().then { + $0.setImage(DesignSystemAsset.Search.keywordRemove.image, for: .normal) + } + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + + self.contentView.addSubviews(recentLabel, button) + + recentLabel.snp.makeConstraints { + $0.leading.equalToSuperview().inset(20) + $0.centerY.equalToSuperview() + } + + button.snp.makeConstraints { + $0.width.height.equalTo(20) + $0.trailing.equalToSuperview().inset(20) + $0.centerY.equalToSuperview() + } + + button.addAction { + PreferenceManager.shared.removeRecentRecords(word: self.recentLabel.text!) + } + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +extension RecentRecordTableViewCell { + public func update(_ text: String) { + recentLabel.text = text + } +} diff --git a/Projects/Features/SearchFeature/Sources/Before/Views/YoutubeThumbnailCell.swift b/Projects/Features/SearchFeature/Sources/Before/Views/YoutubeThumbnailCell.swift new file mode 100644 index 000000000..41c20e293 --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/Before/Views/YoutubeThumbnailCell.swift @@ -0,0 +1,73 @@ +import ChartDomainInterface +import DesignSystem +import Kingfisher +import Lottie +import SnapKit +import Then +import UIKit +import Utility + +final class YoutubeThumbnailCell: UICollectionViewCell { + private let lottieView = LottieAnimationView(name: "Weekly_WM", bundle: DesignSystemResources.bundle).then { + $0.loopMode = .loop + $0.isHidden = true + } + + private let thumbnailView: UIImageView = UIImageView().then { + $0.contentMode = .scaleAspectFill + $0.clipsToBounds = true + } + + override init(frame: CGRect) { + super.init(frame: frame) + addSubviews() + setLayout() + configureUI() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +extension YoutubeThumbnailCell { + private func addSubviews() { + contentView.addSubviews(thumbnailView, lottieView) + } + + private func setLayout() { + thumbnailView.snp.makeConstraints { + $0.verticalEdges.horizontalEdges.equalToSuperview() + } + + lottieView.snp.makeConstraints { + $0.centerX.equalTo(thumbnailView.snp.centerX) + $0.top.equalTo(thumbnailView).offset(40) + $0.width.height.equalTo(124) + } + } + + private func configureUI() { + #warning("실제 도입 시 frame 변수 제거 고민") + + thumbnailView.layer.cornerRadius = frame.height * 50 / 292 + + lottieView.play() + } + + public func update(model: CurrentVideoEntity) { + let url = WMImageAPI.fetchYoutubeThumbnailHD(id: model.id).toURL + let subUrl = WMImageAPI.fetchYoutubeThumbnail(id: model.id).toURL + + thumbnailView.kf.setImage(with: url) { [lottieView, thumbnailView] result in + + switch result { + case .failure: + thumbnailView.kf.setImage(with: subUrl) + case let .success(_): + lottieView.isHidden = false + } + } + } +} diff --git a/Projects/Features/SearchFeature/Sources/Components/AfterSearchComponent.swift b/Projects/Features/SearchFeature/Sources/Components/AfterSearchComponent.swift deleted file mode 100644 index 499e22073..000000000 --- a/Projects/Features/SearchFeature/Sources/Components/AfterSearchComponent.swift +++ /dev/null @@ -1,28 +0,0 @@ -// -// BeforeSearchComponent.swift -// SearchFeature -// -// Created by yongbeomkwak on 2023/02/10. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import NeedleFoundation -import DomainModule -import CommonFeature - -public protocol AfterSearchDependency: Dependency { - var afterSearchContentComponent: AfterSearchContentComponent {get} - var fetchSearchSongUseCase: any FetchSearchSongUseCase {get} - var containSongsComponent: ContainSongsComponent {get} -} - -public final class AfterSearchComponent: Component { - public func makeView() -> AfterSearchViewController { - return AfterSearchViewController.viewController( - afterSearchContentComponent: dependency.afterSearchContentComponent, - containSongsComponent:dependency.containSongsComponent, - viewModel: .init(fetchSearchSongUseCase: dependency.fetchSearchSongUseCase) - ) - } -} diff --git a/Projects/Features/SearchFeature/Sources/Components/AfterSearchContentComponent.swift b/Projects/Features/SearchFeature/Sources/Components/AfterSearchContentComponent.swift deleted file mode 100644 index 8ea105b4d..000000000 --- a/Projects/Features/SearchFeature/Sources/Components/AfterSearchContentComponent.swift +++ /dev/null @@ -1,29 +0,0 @@ -// -// BeforeSearchComponent.swift -// SearchFeature -// -// Created by yongbeomkwak on 2023/02/10. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import NeedleFoundation -import DomainModule -import CommonFeature - -public protocol AfterSearchComponentDependency: Dependency { -} - -public final class AfterSearchContentComponent: Component { - public func makeView( - type: TabPosition, - dataSource: [SearchSectionModel] - ) -> AfterSearchContentViewController { - return AfterSearchContentViewController.viewController( - viewModel:.init( - type: type, - dataSource: dataSource - ) - ) - } -} diff --git a/Projects/Features/SearchFeature/Sources/Components/BeforeSearchComponent.swift b/Projects/Features/SearchFeature/Sources/Components/BeforeSearchComponent.swift deleted file mode 100644 index 81fede718..000000000 --- a/Projects/Features/SearchFeature/Sources/Components/BeforeSearchComponent.swift +++ /dev/null @@ -1,26 +0,0 @@ -// -// BeforeSearchComponent.swift -// SearchFeature -// -// Created by yongbeomkwak on 2023/02/10. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import NeedleFoundation -import DomainModule -import CommonFeature - -public protocol BeforeSearchDependency: Dependency { - var playListDetailComponent: PlayListDetailComponent { get } - var fetchRecommendPlayListUseCase: any FetchRecommendPlayListUseCase {get} -} - -public final class BeforeSearchComponent: Component { - public func makeView() -> BeforeSearchContentViewController { - return BeforeSearchContentViewController.viewController( - recommendPlayListDetailComponent: dependency.playListDetailComponent, - viewModel: .init(fetchRecommendPlayListUseCase: dependency.fetchRecommendPlayListUseCase) - ) - } -} diff --git a/Projects/Features/SearchFeature/Sources/Components/SearchComponent.swift b/Projects/Features/SearchFeature/Sources/Components/SearchComponent.swift deleted file mode 100644 index b0cff4aaa..000000000 --- a/Projects/Features/SearchFeature/Sources/Components/SearchComponent.swift +++ /dev/null @@ -1,25 +0,0 @@ -// -// SearchComponent.swift -// SearchFeature -// -// Created by yongbeomkwak on 2023/02/10. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import NeedleFoundation - -public protocol SearchDependency: Dependency { - var beforeSearchComponent: BeforeSearchComponent { get } - var afterSearchComponent: AfterSearchComponent { get } -} - -public final class SearchComponent: Component { - public func makeView() -> SearchViewController { - return SearchViewController.viewController( - viewModel: .init(), - beforeSearchComponent: self.dependency.beforeSearchComponent, - afterSearchComponent: self.dependency.afterSearchComponent - ) - } -} diff --git a/Projects/Features/SearchFeature/Sources/Enum/Enum+Search .swift b/Projects/Features/SearchFeature/Sources/Enum/Enum+Search .swift deleted file mode 100644 index 0398821a9..000000000 --- a/Projects/Features/SearchFeature/Sources/Enum/Enum+Search .swift +++ /dev/null @@ -1,20 +0,0 @@ -// -// Enum + Search .swift -// SearchFeature -// -// Created by yongbeomkwak on 2023/02/14. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxDataSources -import DomainModule - -public typealias SearchSectionModel = SectionModel<(TabPosition, Int), SongEntity> - -public enum TabPosition: Int{ - case all = 0 - case song - case artist - case remix -} diff --git a/Projects/Features/SearchFeature/Sources/Root/Components/SearchComponent.swift b/Projects/Features/SearchFeature/Sources/Root/Components/SearchComponent.swift new file mode 100644 index 000000000..54184829f --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/Root/Components/SearchComponent.swift @@ -0,0 +1,24 @@ +import BaseFeatureInterface +import Foundation +import NeedleFoundation +import SearchFeatureInterface +import UIKit + +public protocol SearchDependency: Dependency { + var beforeSearchComponent: BeforeSearchComponent { get } + var afterSearchComponent: AfterSearchComponent { get } + var textPopupFactory: any TextPopupFactory { get } + var searchGlobalScrollState: any SearchGlobalScrollProtocol { get } +} + +public final class SearchComponent: Component, SearchFactory { + public func makeView() -> UIViewController { + return SearchViewController.viewController( + reactor: SearchReactor(), + beforeSearchComponent: self.dependency.beforeSearchComponent, + afterSearchComponent: self.dependency.afterSearchComponent, + textPopupFactory: dependency.textPopupFactory, + searchGlobalScrollState: dependency.searchGlobalScrollState + ) + } +} diff --git a/Projects/Features/SearchFeature/Sources/Root/Reactors/SearchReactor.swift b/Projects/Features/SearchFeature/Sources/Root/Reactors/SearchReactor.swift new file mode 100644 index 000000000..15e93a036 --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/Root/Reactors/SearchReactor.swift @@ -0,0 +1,89 @@ +import BaseFeature +import Foundation +import LogManager +import ReactorKit +import RxRelay +import RxSwift +import SearchFeatureInterface +import Utility + +final class SearchReactor: Reactor { + private var disposeBag: DisposeBag = DisposeBag() + + private let service: any SearchCommonService + + var initialState: State + + enum Action { + case switchTypingState(TypingStatus) + case updateText(String) + case cancelButtonDidTap + } + + enum Mutation { + case updateTypingState(state: TypingStatus) + case updateText(String) + } + + struct State { + var typingState: TypingStatus + var text: String + } + + init(service: some SearchCommonService = DefaultSearchCommonService.shared) { + self.service = service + self.initialState = State( + typingState: .before, + text: "" + ) + } + + deinit { + LogManager.printDebug("❌ \(Self.self) deinit") + } + + func mutate(action: Action) -> Observable { + switch action { + case let .switchTypingState(state): + updateTypingState(state) + case .cancelButtonDidTap: + updateTypingState(.before) + case let .updateText(text): + updateText(text) + } + } + + func reduce(state: State, mutation: Mutation) -> State { + var newState = state + + switch mutation { + case let .updateTypingState(state): + newState.typingState = state + case let .updateText(text): + newState.text = text + } + + return newState + } + + func transform(mutation: Observable) -> Observable { + let servicetypingState = service.typingStatus + .map { Mutation.updateTypingState(state: $0) } + + let recentText = service.recentText.map { Mutation.updateText($0) } + + return Observable.merge(mutation, servicetypingState, recentText) + } +} + +fileprivate extension SearchReactor { + func updateTypingState(_ state: TypingStatus) -> Observable { + service.typingStatus.onNext(state) + + return .just(.updateTypingState(state: state)) + } + + func updateText(_ text: String) -> Observable { + return .just(.updateText(text)) + } +} diff --git a/Projects/Features/SearchFeature/Sources/Root/ViewControllers/SearchViewController.swift b/Projects/Features/SearchFeature/Sources/Root/ViewControllers/SearchViewController.swift new file mode 100644 index 000000000..42f73c301 --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/Root/ViewControllers/SearchViewController.swift @@ -0,0 +1,327 @@ +import BaseFeature +import BaseFeatureInterface +import DesignSystem +import LogManager +import NeedleFoundation +import ReactorKit +import RxCocoa +import RxKeyboard +import RxSwift +import SearchFeatureInterface +import SnapKit +import UIKit +import Utility + +final class SearchViewController: BaseStoryboardReactorViewController, ContainerViewType, + EqualHandleTappedType { + private enum Font { + static let headerFontSize: CGFloat = 16 + } + + private enum Color { + static let pointColor: UIColor = DesignSystemAsset.PrimaryColorV2.point.color + static let grayColor: UIColor = DesignSystemAsset.BlueGrayColor.gray400.color + } + + @IBOutlet weak var searchImageView: UIImageView! + @IBOutlet weak var searchTextFiled: UITextField! + @IBOutlet weak var cancelButton: UIButton! + @IBOutlet weak var searchHeaderView: UIView! + @IBOutlet public weak var contentView: UIView! + @IBOutlet weak var contentViewBottomConstraint: NSLayoutConstraint! + + @IBOutlet weak var searchHeaderViewTopConstraint: NSLayoutConstraint! + @IBOutlet weak var searchHeaderContentView: UIView! + private var beforeSearchComponent: BeforeSearchComponent! + private var afterSearchComponent: AfterSearchComponent! + private var textPopupFactory: TextPopupFactory! + + private lazy var beforeVC = beforeSearchComponent.makeView() + + private var afterVC: AfterSearchViewController? + + private var searchGlobalScrollState: SearchGlobalScrollProtocol! + + private let maxHeight: CGFloat = -56 + private var previousScrollOffset: CGFloat = 0 + + override public func viewDidLoad() { + super.viewDidLoad() + } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + LogManager.analytics(CommonAnalyticsLog.viewPage(pageName: .search)) + } + + public static func viewController( + reactor: SearchReactor, + beforeSearchComponent: BeforeSearchComponent, + afterSearchComponent: AfterSearchComponent, + textPopupFactory: TextPopupFactory, + searchGlobalScrollState: any SearchGlobalScrollProtocol + ) -> SearchViewController { + let viewController = SearchViewController.viewController(storyBoardName: "Search", bundle: Bundle.module) + + viewController.reactor = reactor + viewController.beforeSearchComponent = beforeSearchComponent + viewController.afterSearchComponent = afterSearchComponent + viewController.textPopupFactory = textPopupFactory + viewController.searchGlobalScrollState = searchGlobalScrollState + return viewController + } + + override public func configureUI() { + super.configureUI() + + // MARK: 검색 돋보기 이미지 + self.searchImageView.image = DesignSystemAsset.Search.search.image.withRenderingMode(.alwaysTemplate) + + // MARK: 서치바 + self.searchTextFiled.borderStyle = .none // 텍스트 필드 테두리 제거 + self.searchTextFiled.font = DesignSystemFontFamily.Pretendard.medium.font(size: Font.headerFontSize) + + // MARK: 검색 취소 버튼 + self.cancelButton.titleLabel?.text = "취소" + self.cancelButton.titleLabel?.font = DesignSystemFontFamily.Pretendard.bold.font(size: 12) + self.cancelButton.layer.cornerRadius = 4 + self.cancelButton.layer.borderColor = DesignSystemAsset.BlueGrayColor.blueGray200.color.cgColor + self.cancelButton.layer.borderWidth = 1 + self.cancelButton.backgroundColor = .white + + self.searchTextFiled.tintColor = UIColor.white + self.view.backgroundColor = .clear + + self.add(asChildViewController: beforeVC) + } + + override public func bind(reactor: SearchReactor) { + super.bind(reactor: reactor) + + searchGlobalScrollState.scrollAmountObservable + .observe(on: MainScheduler.asyncInstance) + .bind(with: self, onNext: { owner, source in + + let offsetY: CGFloat = source.0 + let scrollDiff = offsetY - owner.previousScrollOffset + let absoluteTop: CGFloat = 0 + let absoluteBottom: CGFloat = source.1 + let isScrollingDown = scrollDiff > 0 && offsetY > absoluteTop + let isScrollingUp = scrollDiff < 0 && offsetY < absoluteBottom + + guard offsetY < absoluteBottom else { return } + var newHeight = owner.searchHeaderViewTopConstraint.constant + + if isScrollingDown { + newHeight = max(owner.maxHeight, owner.searchHeaderViewTopConstraint.constant - abs(scrollDiff)) + } else if isScrollingUp { + if offsetY <= abs(owner.maxHeight) { + newHeight = min(0, owner.searchHeaderViewTopConstraint.constant + abs(scrollDiff)) + } + } + + if newHeight != owner.searchHeaderViewTopConstraint.constant { + owner.searchHeaderViewTopConstraint.constant = newHeight + owner.updateHeader() + } + owner.view.layoutIfNeeded() + owner.previousScrollOffset = offsetY + }) + .disposed(by: disposeBag) + + searchGlobalScrollState.expandSearchHeaderObservable + .skip(1) + .asDriver(onErrorJustReturn: ()) + .drive(with: self, onNext: { owner, _ in + let openAmount = owner.searchHeaderViewTopConstraint.constant + abs(owner.maxHeight) + let percentage = openAmount / abs(owner.maxHeight) + + guard percentage != 1 else { return } + owner.searchHeaderContentView.alpha = 1 + owner.searchHeaderViewTopConstraint.constant = 0 + owner.searchHeaderView.backgroundColor = .white + }) + .disposed(by: disposeBag) + } + + private func updateHeader() { + // percentage == 1 ? 확장 : 축소 + let openAmount = self.searchHeaderViewTopConstraint.constant + abs(self.maxHeight) + let percentage = openAmount / abs(self.maxHeight) + self.searchHeaderContentView.alpha = percentage + self.searchHeaderView.backgroundColor = percentage == 0 ? + DesignSystemAsset.BlueGrayColor.gray100.color : .white + } + + override public func bindState(reactor: SearchReactor) { + super.bindState(reactor: reactor) + + let sharedState = reactor.state.share() + + sharedState + .map { ($0.typingState, $0.text) } + .withUnretained(self) + .observe(on: MainScheduler.asyncInstance) + .bind { owner, data in + + let (state, text) = data + + owner.cancelButton.alpha = state != .before ? 1.0 : .zero + owner.reactSearchHeader(state) + owner.bindSubView(state: state, text: text) + + guard state == .search else { + return + } + + if text.isWhiteSpace { + guard let textPopupViewController = owner.textPopupFactory.makeView( + text: "검색어를 입력해주세요.", + cancelButtonIsHidden: true, + confirmButtonText: nil, + cancelButtonText: nil, + completion: nil, + cancelCompletion: nil + ) as? TextPopupViewController else { + return + } + owner.showBottomSheet(content: textPopupViewController) + } else { + LogManager.setUserProperty(property: .latestSearchKeyword(keyword: text)) + owner.searchTextFiled.rx.text.onNext(text) + PreferenceManager.shared.addRecentRecords(word: text) + owner.view.endEditing(true) + } + } + .disposed(by: disposeBag) + } + + override public func bindAction(reactor: SearchReactor) { + super.bindAction(reactor: reactor) + + cancelButton.rx.tap + .withUnretained(self) + .do(onNext: { owner, _ in + owner.view.endEditing(true) + owner.searchTextFiled.rx.text.onNext("") + }) + .map { _ in SearchReactor.Action.cancelButtonDidTap } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + searchTextFiled + .rx + .text + .orEmpty + .distinctUntilChanged() + .map { SearchReactor.Action.updateText($0) } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + let editingDidBegin = searchTextFiled.rx.controlEvent(.editingDidBegin) + let editingDidEnd = searchTextFiled.rx.controlEvent(.editingDidEnd) + let editingDidEndOnExit = searchTextFiled.rx.controlEvent(.editingDidEndOnExit) + + let mergeObservable = Observable.merge( + editingDidBegin.map { UIControl.Event.editingDidBegin }, + editingDidEnd.map { UIControl.Event.editingDidEnd }, + editingDidEndOnExit.map { UIControl.Event.editingDidEndOnExit } + ) + + mergeObservable + .withUnretained(self) + .bind { owner, event in + + if event == .editingDidBegin { + NotificationCenter.default.post(name: .willStatusBarEnterDarkBackground, object: nil) + reactor.action.onNext(.switchTypingState(.typing)) + + } else if event == .editingDidEnd { + NotificationCenter.default.post(name: .willStatusBarEnterLightBackground, object: nil) + + } else { + reactor.action.onNext(.switchTypingState(.search)) + } + } + .disposed(by: disposeBag) + + RxKeyboard.instance.visibleHeight // 드라이브: 무조건 메인쓰레드에서 돌아감 + .drive(onNext: { [weak self] keyboardVisibleHeight in + + guard let self = self else { + return + } + // 키보드는 바텀 SafeArea부터 계산되므로 빼야함 + let tmp = keyboardVisibleHeight - SAFEAREA_BOTTOM_HEIGHT() - 56 // 탭바 높이 추가 + self.contentViewBottomConstraint.constant = tmp > 0 ? tmp : 0 + }) + .disposed(by: disposeBag) + } +} + +extension SearchViewController { + private func bindSubView(state: TypingStatus, text: String?) { + if let nowChildVc = children.first as? BeforeSearchContentViewController { + guard state == .search else { + return + } + + guard let text = text, !text.isWhiteSpace else { + return + } + afterVC = afterSearchComponent.makeView(text: text) + + self.remove(asChildViewController: beforeVC) + self.add(asChildViewController: afterVC) + + } else if let nowChildVc = children.first as? AfterSearchViewController { + guard state == .before || state == .typing else { + return + } + self.remove(asChildViewController: afterVC) + afterVC = nil + self.add(asChildViewController: beforeVC) + } + } + + private func reactSearchHeader(_ state: TypingStatus) { + var placeHolderAttributes = [ + NSAttributedString.Key.foregroundColor: Color.grayColor, + NSAttributedString.Key.font: DesignSystemFontFamily.Pretendard.medium.font(size: Font.headerFontSize) + ] + + var bgColor: UIColor = .white + var textColor: UIColor = .black + var tintColor: UIColor = Color.grayColor + + if state == .typing { + placeHolderAttributes[.foregroundColor] = UIColor.white + bgColor = Color.pointColor + textColor = .white + tintColor = .white + } + + self.searchHeaderView.backgroundColor = bgColor + self.searchTextFiled.textColor = textColor + self.searchTextFiled.attributedPlaceholder = NSAttributedString( + string: "검색어를 입력하세요.", + attributes: placeHolderAttributes + ) + self.searchImageView.tintColor = tintColor + } +} + +extension SearchViewController { + public func equalHandleTapped() { + let viewControllersCount: Int = self.navigationController?.viewControllers.count ?? 0 + if viewControllersCount > 1 { + self.navigationController?.popToRootViewController(animated: true) + } else { + if let before = children.first as? BeforeSearchContentViewController { + before.scrollToTop() + } else if let after = children.first as? AfterSearchViewController { + after.scrollToTop() + } + } + } +} diff --git a/Projects/Features/SearchFeature/Sources/Service/SearchCommonService.swift b/Projects/Features/SearchFeature/Sources/Service/SearchCommonService.swift new file mode 100644 index 000000000..5308ac617 --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/Service/SearchCommonService.swift @@ -0,0 +1,16 @@ +import Foundation +import RxSwift +import SearchFeatureInterface + +protocol SearchCommonService { + var typingStatus: BehaviorSubject { get } + var recentText: PublishSubject { get } +} + +final class DefaultSearchCommonService: SearchCommonService { + let typingStatus: BehaviorSubject = .init(value: .before) + + let recentText: PublishSubject = .init() + + static let shared = DefaultSearchCommonService() +} diff --git a/Projects/Features/SearchFeature/Sources/Service/SearchGlobalScrollState.swift b/Projects/Features/SearchFeature/Sources/Service/SearchGlobalScrollState.swift new file mode 100644 index 000000000..650600e14 --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/Service/SearchGlobalScrollState.swift @@ -0,0 +1,61 @@ +import Foundation +import RxSwift + +public enum SearchResultPage { + case song + case list +} + +public protocol SearchGlobalScrollProtocol { + var scrollAmountObservable: Observable<(CGFloat, CGFloat)> { get } + var expandSearchHeaderObservable: Observable { get } + + var songResultScrollToTopObservable: Observable { get } + var listResultScrollToTopObservable: Observable { get } + + func scrollTo(source: (CGFloat, CGFloat)) + func expand() + func scrollToTop(page: SearchResultPage) +} + +public final class SearchGlobalScrollState: SearchGlobalScrollProtocol { + private let scrollAmountSubject = PublishSubject<(CGFloat, CGFloat)>() + private let expandSearchHeaderSubject = PublishSubject() + private let songResultScrollToTopSubject = PublishSubject() + private let listResultScrollToTopSubject = PublishSubject() + + public init() {} + + public var scrollAmountObservable: Observable<(CGFloat, CGFloat)> { + scrollAmountSubject + } + + public func scrollTo(source: (CGFloat, CGFloat)) { + scrollAmountSubject.onNext(source) + } + + public var expandSearchHeaderObservable: Observable { + expandSearchHeaderSubject + } + + public func expand() { + expandSearchHeaderSubject.onNext(()) + } + + public var songResultScrollToTopObservable: Observable { + songResultScrollToTopSubject + } + + public var listResultScrollToTopObservable: Observable { + listResultScrollToTopSubject + } + + public func scrollToTop(page: SearchResultPage) { + switch page { + case .song: + songResultScrollToTopSubject.onNext(()) + case .list: + listResultScrollToTopSubject.onNext(()) + } + } +} diff --git a/Projects/Features/SearchFeature/Sources/View/EntireSectionHeader.swift b/Projects/Features/SearchFeature/Sources/View/EntireSectionHeader.swift deleted file mode 100644 index 886b46b25..000000000 --- a/Projects/Features/SearchFeature/Sources/View/EntireSectionHeader.swift +++ /dev/null @@ -1,80 +0,0 @@ -// -// EntireSectionHeader.swift -// SearchFeature -// -// Created by yongbeomkwak on 2023/01/12. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import DesignSystem - -protocol EntireSectionHeaderDelegate:AnyObject { - func switchTapEvent(_ type:TabPosition) -} - -class EntireSectionHeader: UIView { - @IBOutlet weak var categoryLabel: UILabel! - @IBOutlet weak var moveTabButton: UIButton! - @IBOutlet weak var numberOfSongLabel: UILabel! - @IBOutlet weak var allShowLabel: UILabel! - @IBOutlet weak var allShowArrowImageView: UIImageView! - - weak var delegate: EntireSectionHeaderDelegate? - var type: TabPosition = .all - - @IBAction func switchTabAction(_ sender: Any) { - self.delegate?.switchTapEvent(type) - } - - public override init(frame: CGRect) { - super.init(frame: frame) - self.setupView() - } - - required init?(coder aDecoder: NSCoder) { - super.init(coder: aDecoder) - self.setupView() - } -} - -extension EntireSectionHeader { - private func setupView(){ - if let view = Bundle.module.loadNibNamed("EntireSectionHeader", owner: self,options: nil)!.first as? UIView{ - view.frame = self.bounds - view.layoutIfNeeded() //드로우 사이클을 호출할 때 쓰임 - view.backgroundColor = DesignSystemAsset.GrayColor.gray100.color - self.addSubview(view) - } - configureUI() - } - - public func update(_ type: (TabPosition, Int)) { - self.type = type.0 - self.categoryLabel.text = type.0 == .song ? "노래" : type.0 == .artist ? "가수" : "조교" - let numberOfSong: Int = type.1 - self.numberOfSongLabel.text = String(numberOfSong) - self.allShowLabel.isHidden = numberOfSong <= 3 - self.allShowArrowImageView.isHidden = numberOfSong <= 3 - self.moveTabButton.isHidden = numberOfSong <= 3 - } - - private func configureUI() { - self.categoryLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) - self.categoryLabel.textColor = DesignSystemAsset.GrayColor.gray900.color - self.categoryLabel.setTextWithAttributes(kernValue: -0.5) - - self.numberOfSongLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) - self.numberOfSongLabel.textColor = DesignSystemAsset.PrimaryColor.point.color - self.numberOfSongLabel.setTextWithAttributes(kernValue: -0.5) - - let attrTitle = NSAttributedString( - string: "전체보기", - attributes: [.font: DesignSystemFontFamily.Pretendard.medium.font(size: 12), - .foregroundColor: DesignSystemAsset.GrayColor.gray900.color, - .kern: -0.5] - ) - self.allShowLabel.attributedText = attrTitle - self.allShowArrowImageView.image = DesignSystemAsset.Search.searchArrowRight.image - } -} diff --git a/Projects/Features/SearchFeature/Sources/View/RecentRecordHeaderView.swift b/Projects/Features/SearchFeature/Sources/View/RecentRecordHeaderView.swift deleted file mode 100644 index 8cbb36111..000000000 --- a/Projects/Features/SearchFeature/Sources/View/RecentRecordHeaderView.swift +++ /dev/null @@ -1,54 +0,0 @@ -// -// RecentRecordHeaderView.swift -// SearchFeature -// -// Created by yongbeomkwak on 2023/01/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import DesignSystem -import Utility - -class RecentRecordHeaderView: UIView { - @IBOutlet weak var removeAllButton: UIButton! - @IBOutlet weak var removeAllLabel: UILabel! - @IBOutlet weak var recentLabel: UILabel! - - //1. 넘겨주는 연결통로 - var completionHandler: (() -> ())? - - @IBAction func removeAll(_ sender: UIButton) { - completionHandler?() - } - - override init(frame: CGRect) { //코드쪽에서 생성 시 호출 - super.init(frame: frame) - self.setupView() - } - - required init?(coder aDecoder:NSCoder) { //StoryBoard에서 호출됨 - super.init(coder: aDecoder) - self.setupView() - } - - - private func setupView(){ - if let view = Bundle.module.loadNibNamed("RecentRecordHeaderView", owner: self,options: nil)!.first as? UIView{ - view.frame = self.bounds - view.layoutIfNeeded() //드로우 사이클을 호출할 때 쓰임 - view.backgroundColor = DesignSystemAsset.GrayColor.gray100.color - self.addSubview(view) - } - - self.recentLabel.text = "최근 검색어" - self.recentLabel.font = DesignSystemFontFamily.Pretendard.bold.font(size: 16) - self.recentLabel.textColor = DesignSystemAsset.GrayColor.gray900.color - self.recentLabel.setTextWithAttributes(kernValue: -0.5) - - self.removeAllLabel.text = "전체삭제" - self.removeAllLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 14) - self.removeAllLabel.textColor = DesignSystemAsset.GrayColor.gray400.color - self.removeAllLabel.setTextWithAttributes(kernValue: -0.5) - } -} diff --git a/Projects/Features/SearchFeature/Sources/View/RecentRecordTableViewCell.swift b/Projects/Features/SearchFeature/Sources/View/RecentRecordTableViewCell.swift deleted file mode 100644 index afc40c563..000000000 --- a/Projects/Features/SearchFeature/Sources/View/RecentRecordTableViewCell.swift +++ /dev/null @@ -1,41 +0,0 @@ -// -// RecentRecordTableViewCell.swift -// SearchFeature -// -// Created by yongbeomkwak on 2023/01/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import DesignSystem -import Utility - -protocol RecentRecordDelegate: AnyObject { - func selectedItems(_ keyword: String) -} - -class RecentRecordTableViewCell: UITableViewCell { - /* - 해당 클래스 이름은 , 스토리보드 TableViewCell의 - Class 이름과 Identifier쪽에 모두 넣어줘야함 - 또한 - tableView.dequeueReusableCell(withIdentifier: <#T##String#>) - withIdentifier에도 넣어줘야함 - */ - - @IBOutlet weak var recentLabel: UILabel! - @IBOutlet weak var recentRemoveButton: UIButton! - - override func awakeFromNib() { //View의 DidLoad쪽과 같은 역할 - super.awakeFromNib() - - recentRemoveButton.setImage(DesignSystemAsset.Search.keywordRemove.image, for: .normal) - recentLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 14) - recentLabel.textColor = DesignSystemAsset.GrayColor.gray900.color - recentLabel.setTextWithAttributes(kernValue: -0.5) - } - - @IBAction func pressRemoveAction(_ sender: Any) { - PreferenceManager.shared.removeRecentRecords(word: self.recentLabel.text!) - } -} diff --git a/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchContentViewController.swift b/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchContentViewController.swift deleted file mode 100644 index 4fec2378e..000000000 --- a/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchContentViewController.swift +++ /dev/null @@ -1,180 +0,0 @@ -// -// AfterSearchContentViewController.swift -// SearchFeature -// -// Created by yongbeomkwak on 2023/01/11. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import Utility -import RxCocoa -import RxSwift -import RxDataSources -import DesignSystem -import BaseFeature -import CommonFeature -import DomainModule - -public final class AfterSearchContentViewController: BaseViewController, ViewControllerFromStoryBoard { - @IBOutlet weak var tableView: UITableView! - - var viewModel:AfterSearchContentViewModel! - lazy var input = AfterSearchContentViewModel.Input() - lazy var output = viewModel.transform(from: input) - var disposeBag = DisposeBag() - - public override func viewDidLoad() { - super.viewDidLoad() - configureUI() - bindRx() - bindRxEvent() - requestFromParent() - } - - public static func viewController(viewModel:AfterSearchContentViewModel) -> AfterSearchContentViewController{ - let viewController = AfterSearchContentViewController.viewController(storyBoardName: "Search", bundle: Bundle.module) - viewController.viewModel = viewModel - return viewController - } -} - -extension AfterSearchContentViewController{ - private func bindRx(){ - tableView.rx.setDelegate(self).disposed(by: disposeBag) - - //xib로 만든 UI를 컬렉션 뷰에서 사용하기 위해서는 등록이 필요 - //다른 모듈 시 번들 변경 Bundle.module 사용 X - tableView.register(UINib(nibName:"SongListCell", bundle: CommonFeatureResources.bundle), forCellReuseIdentifier: "SongListCell") - - output.dataSource - .do(onNext: { [weak self] model in - guard let self = self else { return } - self.tableView.isHidden = false // 검색 완료 시 보여줌 - - let warningView = WarningView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: APP_HEIGHT()/2)) - warningView.text = "검색결과가 없습니다." - - if self.viewModel.sectionType == .all { - let allSectionisEmpty: Bool = self.output.dataSource.value.map { $0.items }.flatMap { $0 }.isEmpty - self.tableView.tableHeaderView = allSectionisEmpty ? warningView : nil - - }else{ - let isEmpty = model.first?.items.isEmpty ?? false - self.tableView.tableHeaderView = isEmpty ? warningView : nil - } - }) - .bind(to: tableView.rx.items(dataSource: createDatasource())) - .disposed(by: disposeBag) - } - - private func bindRxEvent(){ - tableView.rx.itemSelected - .bind(to: input.indexPath) - .disposed(by: disposeBag) - - Utility.PreferenceManager.$startPage - .skip(1) - .subscribe(onNext: { [weak self] _ in - guard let self = self, let parent = self.parent?.parent as? AfterSearchViewController else { - return - } - self.input.deSelectedAllSongs.accept(()) - parent.output.songEntityOfSelectedSongs.accept([]) - }).disposed(by: disposeBag) - } - - func requestFromParent(){ - guard let parent = self.parent?.parent as? AfterSearchViewController else { - return - } - let entities = parent.output.songEntityOfSelectedSongs.value - let models = output.dataSource.value - - let indexPaths = entities.map { entity -> IndexPath? in - var indexPath: IndexPath? - - models.enumerated().forEach { (section, model) in - if let row = model.items.firstIndex(where: { $0 == entity }){ - indexPath = IndexPath(row: row, section: section) - } - } - return indexPath - }.compactMap{ $0 } - - input.mandatoryLoadIndexPath.accept(indexPaths) - } - - private func configureUI(){ - self.tableView.backgroundColor = DesignSystemAsset.GrayColor.gray100.color - self.tableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: 56)) - self.tableView.scrollIndicatorInsets = UIEdgeInsets(top: 0, left: 0, bottom: 56, right: 0) - self.view.backgroundColor = DesignSystemAsset.GrayColor.gray100.color - } -} - -extension AfterSearchContentViewController:UITableViewDelegate{ - public func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { - return 60 - } - - public func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { - let songlistHeader = EntireSectionHeader() - - if viewModel.sectionType != .all{ - return nil - } - - let allSectionisEmpty: Bool = self.output.dataSource.value.map { $0.items }.flatMap { $0 }.isEmpty - if allSectionisEmpty{ - return nil - } - songlistHeader.update(self.output.dataSource.value[section].model) - songlistHeader.delegate = self - return songlistHeader - } - - public func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { - if viewModel.sectionType != .all{ - return 0 - } - - let allSectionisEmpty: Bool = self.output.dataSource.value.map { $0.items }.flatMap { $0 }.isEmpty - if allSectionisEmpty{ - return 0 - } - return 44 - } -} - -extension AfterSearchContentViewController{ - func createDatasource() -> RxTableViewSectionedReloadDataSource{ - let datasource = RxTableViewSectionedReloadDataSource(configureCell: { (_, tableView, indexPath, model) -> UITableViewCell in - guard let cell = tableView.dequeueReusableCell(withIdentifier: "SongListCell", for: indexPath) as? SongListCell else{ - return UITableViewCell() - } - cell.update(model) - return cell - }, titleForHeaderInSection: { (_, _) -> String? in - return nil - }) - return datasource - } -} - -extension AfterSearchContentViewController:EntireSectionHeaderDelegate{ - func switchTapEvent(_ type: TabPosition) { - guard let tabMan = parent?.parent as? AfterSearchViewController else { - return - } - tabMan.scrollToPage(.at(index: type.rawValue), animated: true) - } -} - -extension AfterSearchContentViewController { - func scrollToTop() { - let itemIsEmpty: Bool = output.dataSource.value.first?.items.isEmpty ?? true - guard !itemIsEmpty else { return } - tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: true) - } -} diff --git a/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchViewController.swift b/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchViewController.swift deleted file mode 100644 index 674efc515..000000000 --- a/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchViewController.swift +++ /dev/null @@ -1,225 +0,0 @@ -// -// AfterSearchContentViewController.swift -// SearchFeature -// -// Created by yongbeomkwak on 2023/01/11. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import Utility -import DesignSystem -import Pageboy -import Tabman -import RxSwift -import DomainModule -import CommonFeature -import NVActivityIndicatorView - -public final class AfterSearchViewController: TabmanViewController, ViewControllerFromStoryBoard,SongCartViewType { - - @IBOutlet weak var tabBarView: UIView! - @IBOutlet weak var fakeView: UIView! - @IBOutlet weak var indicator: NVActivityIndicatorView! - - var viewModel: AfterSearchViewModel! - var afterSearchContentComponent: AfterSearchContentComponent! - var containSongsComponent: ContainSongsComponent! - let disposeBag = DisposeBag() - - private var viewControllers: [UIViewController] = [UIViewController(), UIViewController(), UIViewController(), UIViewController()] - lazy var input = AfterSearchViewModel.Input() - lazy var output = viewModel.transform(from: input) - - public var songCartView: SongCartView! - public var bottomSheetView: BottomSheetView! - let playState = PlayState.shared - - public override func viewDidLoad() { - super.viewDidLoad() - configureUI() - bindRx() - } - - public override func viewWillAppear(_ animated: Bool) { - super.viewWillAppear(animated) - self.scrollToPage(.at(index: 0), animated: false) - } - - public static func viewController( - afterSearchContentComponent: AfterSearchContentComponent, - containSongsComponent: ContainSongsComponent, - viewModel: AfterSearchViewModel - ) -> AfterSearchViewController { - let viewController = AfterSearchViewController.viewController(storyBoardName: "Search", bundle: Bundle.module) - viewController.viewModel = viewModel - viewController.afterSearchContentComponent = afterSearchContentComponent - viewController.containSongsComponent = containSongsComponent - return viewController - } -} - -extension AfterSearchViewController { - private func configureUI() { - self.fakeView.backgroundColor = DesignSystemAsset.GrayColor.gray100.color - self.indicator.type = .circleStrokeSpin - self.indicator.color = DesignSystemAsset.PrimaryColor.point.color - self.dataSource = self //dateSource - let bar = TMBar.ButtonBar() - - // 배경색 - bar.backgroundView.style = .flat(color:.clear) - - // 간격 설정 - bar.layout.contentInset = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20) - bar.layout.contentMode = .fit - bar.layout.transitionStyle = .progressive - - // 버튼 글씨 커스텀 - bar.buttons.customize { (button) in - button.tintColor = DesignSystemAsset.GrayColor.gray400.color - button.selectedTintColor = DesignSystemAsset.GrayColor.gray900.color - button.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) - button.selectedFont = DesignSystemFontFamily.Pretendard.bold.font(size: 16) - } - - // indicator - bar.indicator.weight = .custom(value: 2) - bar.indicator.tintColor = DesignSystemAsset.PrimaryColor.point.color - bar.indicator.overscrollBehavior = .compress - addBar(bar, dataSource: self, at: .custom(view: tabBarView, layout: nil)) - bar.layer.addBorder([.bottom], color:DesignSystemAsset.GrayColor.gray300.color.withAlphaComponent(0.4), height: 1) - } - - private func bindRx(){ - output.dataSource - .skip(1) - .subscribe(onNext: { [weak self] result in - guard let self = self else{ - return - } - guard let comp = self.afterSearchContentComponent else { - return - } - self.viewControllers = [ - comp.makeView(type: .all, dataSource: result[0]), - comp.makeView(type: .song, dataSource: result[1]), - comp.makeView(type: .artist, dataSource: result[2]), - comp.makeView(type: .remix, dataSource: result[3]) - ] - self.indicator.stopAnimating() - self.reloadData() - }) - .disposed(by: disposeBag) - - output.isFetchStart - .subscribe(onNext: { [weak self] _ in - guard let self = self else{ - return - } - self.indicator.startAnimating() - guard let child = self.viewControllers.first as? AfterSearchContentViewController else { - return - } - child.tableView.isHidden = true // 검색 시작 시 테이블 뷰 숨김 - }) - .disposed(by: disposeBag) - - output.songEntityOfSelectedSongs - .skip(1) - .subscribe(onNext: { [weak self] (songs:[SongEntity]) in - guard let self = self else {return} - if !songs.isEmpty { - self.showSongCart(in: self.view, - type: .searchSong, - selectedSongCount: songs.count, - totalSongCount: 100, - useBottomSpace: false) - self.songCartView.delegate = self - } else { - self.hideSongCart() - } - }) - .disposed(by: disposeBag) - } - - func clearSongCart(){ - self.output.songEntityOfSelectedSongs.accept([]) - self.viewControllers.forEach({ vc in - guard let afterContentVc = vc as? AfterSearchContentViewController else { - return - } - afterContentVc.input.deSelectedAllSongs.accept(()) - }) - } -} - -extension AfterSearchViewController: PageboyViewControllerDataSource, TMBarDataSource { - public func numberOfViewControllers(in pageboyViewController: Pageboy.PageboyViewController) -> Int { - viewControllers.count - } - - public func viewController(for pageboyViewController: Pageboy.PageboyViewController, at index: Pageboy.PageboyViewController.PageIndex) -> UIViewController? { - viewControllers[index] - } - - public func defaultPage(for pageboyViewController: Pageboy.PageboyViewController) -> Pageboy.PageboyViewController.Page? { - nil - } - - public func barItem(for bar: Tabman.TMBar, at index: Int) -> Tabman.TMBarItemable { - switch index { - case 0: - return TMBarItem(title: "전체") - case 1: - return TMBarItem(title: "노래") - case 2: - return TMBarItem(title: "가수") - case 3: - return TMBarItem(title: "조교") - default: - let title = "Page \(index)" - return TMBarItem(title: title) - } - } -} - -extension AfterSearchViewController: SongCartViewDelegate { - public func buttonTapped(type: SongCartSelectType) { - switch type { - case .allSelect(_): - return - - case .addSong: - let songs: [String] = output.songEntityOfSelectedSongs.value.map { $0.id } - let viewController = containSongsComponent.makeView(songs: songs) - viewController.modalPresentationStyle = .overFullScreen - self.present(viewController, animated: true){ [weak self] in - guard let self = self else{return} - self.clearSongCart() - } - - case .addPlayList: - let songs = output.songEntityOfSelectedSongs.value - playState.appendSongsToPlaylist(songs) - self.clearSongCart() - - case .play: - let songs = output.songEntityOfSelectedSongs.value - playState.loadAndAppendSongsToPlaylist(songs) - self.clearSongCart() - - case .remove: - return - } - } -} - -extension AfterSearchViewController { - func scrollToTop() { - let current: Int = self.currentIndex ?? 0 - let searchContent = self.viewControllers.compactMap { $0 as? AfterSearchContentViewController } - guard searchContent.count > current else { return } - searchContent[current].scrollToTop() - } -} diff --git a/Projects/Features/SearchFeature/Sources/ViewControllers/BeforeSearchContentViewController.swift b/Projects/Features/SearchFeature/Sources/ViewControllers/BeforeSearchContentViewController.swift deleted file mode 100644 index aeba8c987..000000000 --- a/Projects/Features/SearchFeature/Sources/ViewControllers/BeforeSearchContentViewController.swift +++ /dev/null @@ -1,185 +0,0 @@ -// -// SearchContentViewController.swift -// SearchFeature -// -// Created by yongbeomkwak on 2023/01/05. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import Utility -import DesignSystem -import RxSwift -import RxCocoa -import BaseFeature -import CommonFeature -import NeedleFoundation -import DomainModule -import NVActivityIndicatorView - -protocol BeforeSearchContentViewDelegate:AnyObject{ - func itemSelected(_ keyword:String) -} - -public final class BeforeSearchContentViewController: BaseViewController,ViewControllerFromStoryBoard { - - @IBOutlet weak var tableView: UITableView! - @IBOutlet weak var indicator: NVActivityIndicatorView! - - weak var delegate: BeforeSearchContentViewDelegate? - var playListDetailComponent: PlayListDetailComponent! - var viewModel: BeforeSearchContentViewModel! - let disposeBag = DisposeBag() - - private lazy var input = viewModel.input - private lazy var output = viewModel.transform(from: input) - - public override func viewDidLoad() { - super.viewDidLoad() - configureUI() - bindTable() - } - - public static func viewController( - recommendPlayListDetailComponent: PlayListDetailComponent, - viewModel: BeforeSearchContentViewModel - ) -> BeforeSearchContentViewController { - let viewController = BeforeSearchContentViewController.viewController(storyBoardName: "Search", bundle: Bundle.module) - viewController.playListDetailComponent = recommendPlayListDetailComponent - viewController.viewModel = viewModel - return viewController - } -} - -extension BeforeSearchContentViewController { - private func configureUI() { - self.tableView.backgroundColor = DesignSystemAsset.GrayColor.gray100.color - self.tableView.tableFooterView = UIView(frame: .init(x: 0, y: 0, width: APP_WIDTH(), height: PLAYER_HEIGHT())) - self.tableView.scrollIndicatorInsets = UIEdgeInsets(top: 0, left: 0, bottom: PLAYER_HEIGHT(), right: 0) - self.indicator.type = .circleStrokeSpin - self.indicator.color = DesignSystemAsset.PrimaryColor.point.color - self.indicator.startAnimating() - } - - private func bindTable() { - // 헤더 적용을 위한 델리게이트 - tableView.rx.setDelegate(self) - .disposed(by: disposeBag) - - //cell 그리기 - let combine = Observable.combineLatest(output.showRecommend, Utility.PreferenceManager.$recentRecords,output.dataSource){ ($0, $1 ?? [] , $2 ) } - //추천 리스트 플래그 와 유저디폴트 기록을 모두 감지 - - combine - .skip(2) - .map({ (showRecommend:Bool,item:[String],_) -> [String] in - if showRecommend { //만약 추천리스트면 검색목록 보여지면 안되므로 빈 배열 - return [] - } - else{ - return item - } - }) - .do(onNext: { [weak self] _ in - guard let self = self else { return } - self.indicator.stopAnimating() - }) - .bind(to: tableView.rx.items) { (tableView: UITableView, index: Int, element: String) -> RecentRecordTableViewCell in - guard let cell = tableView.dequeueReusableCell( - withIdentifier: "RecentRecordTableViewCell", - for: IndexPath(row: index, section: 0) - ) as? RecentRecordTableViewCell else { - return RecentRecordTableViewCell() - } - cell.backgroundColor = .clear - cell.recentLabel.text = element - return cell - }.disposed(by: disposeBag) - - //터치 이벤트 - tableView.rx.modelSelected(String.self) - .subscribe(onNext:{ [weak self] (keyword) in - guard let self = self else{ - return - } - self.delegate?.itemSelected(keyword) - }).disposed(by: disposeBag) - - guard let parent = self.parent as? SearchViewController else { - return - } - - parent.viewModel.output.isFoucused - .withLatestFrom(parent.viewModel.input.textString) {($0,$1)} - .map { (focus:Bool, str:String) -> Bool in - return focus == false && str.isWhiteSpace == true - } - .bind(to: output.showRecommend) - .disposed(by: disposeBag) - } -} - -extension BeforeSearchContentViewController:UITableViewDelegate{ - public func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { - return 40 - } - - public func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { - if output.showRecommend.value{ - return RecommendPlayListView.getViewHeight(model: output.dataSource.value) - - }else if (Utility.PreferenceManager.recentRecords ?? []).count == 0{ - return (APP_HEIGHT() * 3) / 8 - - }else{ - return 68 - } - } - - public func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { - let warningView = WarningView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: 300)) - warningView.text = "최근 검색 기록이 없습니다." - - let recentRecordHeaderView = RecentRecordHeaderView() - - //최근 검색어 전체 삭제 버튼 클릭 이벤트 받는 통로 - recentRecordHeaderView.completionHandler = { - let textPopupViewController = TextPopupViewController.viewController( - text: "전체 내역을 삭제하시겠습니까?", - cancelButtonIsHidden: false, - completion: { //승인 핸들러 - Utility.PreferenceManager.recentRecords = nil - }) - self.showPanModal(content: textPopupViewController) - } - - let recommendView = RecommendPlayListView( - frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: RecommendPlayListView.getViewHeight(model:output.dataSource.value)) - ) - recommendView.dataSource = self.output.dataSource.value - recommendView.delegate = self - - if output.showRecommend.value{ - return recommendView - - }else if (Utility.PreferenceManager.recentRecords ?? []).count == 0{ - return warningView - - }else{ - return recentRecordHeaderView - } - } -} - -extension BeforeSearchContentViewController: RecommendPlayListViewDelegate { - public func itemSelected(model: RecommendPlayListEntity) { - lazy var playListDetailVc = playListDetailComponent.makeView(id:model.key,type: .wmRecommend) - self.navigationController?.pushViewController(playListDetailVc, animated: true) - } -} - -extension BeforeSearchContentViewController { - func scrollToTop() { - tableView.setContentOffset(.zero, animated: true) - } -} diff --git a/Projects/Features/SearchFeature/Sources/ViewControllers/SearchViewController.swift b/Projects/Features/SearchFeature/Sources/ViewControllers/SearchViewController.swift deleted file mode 100644 index 33b562d40..000000000 --- a/Projects/Features/SearchFeature/Sources/ViewControllers/SearchViewController.swift +++ /dev/null @@ -1,287 +0,0 @@ -import UIKit -import CommonFeature -import DomainModule -import NeedleFoundation -import Utility -import DesignSystem -import RxCocoa -import RxSwift -import PanModal -import SnapKit -import RxKeyboard -import BaseFeature - -public final class SearchViewController: BaseViewController, ViewControllerFromStoryBoard,ContainerViewType { - - @IBOutlet weak var searchImageView:UIImageView! - @IBOutlet weak var searchTextFiled:UITextField! - @IBOutlet weak var cancelButton:UIButton! - @IBOutlet weak var searchHeaderView:UIView! - @IBOutlet weak public var contentView:UIView! - @IBOutlet weak var contentViewBottomConstraint: NSLayoutConstraint! - - var viewModel:SearchViewModel! - let disposeBag = DisposeBag() - var beforeSearchComponent: BeforeSearchComponent! - var afterSearchComponent: AfterSearchComponent! - - lazy var beforeVc = beforeSearchComponent.makeView() - lazy var afterVc = afterSearchComponent.makeView() - - public override func viewDidLoad() { - super.viewDidLoad() - configureUI() - rxBindTask() - } - - public override func viewDidAppear(_ animated: Bool) { - super.viewDidAppear(animated) - // navigationController?.interactivePopGestureRecognizer?.delegate = nil // 현재 탭에서 화면이동이 일어날 시 , 빠져나올 때 swipe로 이동 - - } - - - -// override public func viewDidLayoutSubviews() { -// super.viewDidLayoutSubviews() -// -// //guard let child = self.children.first as? BeforeSearchContentViewController else { return } -// //child.view.frame = searchContentView.bounds -// -// guard let child = self.children.first as? AfterSearchViewController else { return } -// child.view.frame = searchContentView.bounds -// -// //오차로 인하여 여기서 설정함 -// /* -// frame != bounds -// - 두개 모두 x,y , width, height 을 갖고 있음 -// - frame의 x,y는 부모의 중심 x,y을 가르킴 -// - bounds의 x,y는 항상 자기자신을 중심으로 찍힘( 언제나 (0,0)) -// -// */ -// -// -// -// } - - public static func viewController( - viewModel:SearchViewModel, - beforeSearchComponent:BeforeSearchComponent, - afterSearchComponent: AfterSearchComponent - ) -> SearchViewController { - let viewController = SearchViewController.viewController(storyBoardName: "Search", bundle: Bundle.module) - viewController.viewModel = viewModel - viewController.beforeSearchComponent = beforeSearchComponent - viewController.afterSearchComponent = afterSearchComponent - return viewController - } - - @IBAction func cancelButtonAction(_ sender: Any) { - self.searchTextFiled.rx.text.onNext("") - self.viewModel.input.textString.accept("") - - if let nowChildVc = self.children.first as? AfterSearchViewController{ - nowChildVc.clearSongCart() - } - - self.bindSubView(false) - self.view.endEditing(true) - self.viewModel.output.isFoucused.accept(false) - } -} - -extension SearchViewController { - private func configureUI() { - // MARK:검색 돋보기 이미지 - self.searchImageView.image = DesignSystemAsset.Search.search.image.withRenderingMode(.alwaysTemplate) - let headerFontSize:CGFloat = 16 - self.searchTextFiled.borderStyle = .none // 텍스트 필드 테두리 제거 - self.searchTextFiled.font = DesignSystemFontFamily.Pretendard.medium.font(size: headerFontSize) - - //MARK: 검색 취소 버튼 - self.cancelButton.titleLabel?.text = "취소" - self.cancelButton.titleLabel?.font = DesignSystemFontFamily.Pretendard.bold.font(size: 12) - self.cancelButton.layer.cornerRadius = 4 - self.cancelButton.layer.borderColor = DesignSystemAsset.GrayColor.gray200.color.cgColor - self.cancelButton.layer.borderWidth = 1 - self.cancelButton.backgroundColor = .white - self.viewModel.output.isFoucused.accept(false) - - self.searchTextFiled.tintColor = UIColor.white - self.view.backgroundColor = .clear//DesignSystemAsset.GrayColor.gray100.color - self.add(asChildViewController: beforeVc) - beforeVc.delegate = self - } - - private func bindSubView(_ afterSearch:Bool) { - /* - A:부모 - B:자식 - - 서브뷰 추가 - A.addChild(B) - A.view.addSubview(B.view) - B.didMove(toParent: A) - - - 서브뷰 삭제 - B.willMove(toParent: nil) // 제거되기 직전에 호출 - B.removeFromParent() // parentVC로 부터 관계 삭제 - B.view.removeFromSuperview() // parentVC.view.addsubView()와 반대 기능 - - */ - - if let nowChildVc = children.first as? BeforeSearchContentViewController{ - if afterSearch == false { - return - - }else{ - self.remove(asChildViewController: beforeVc) - self.add(asChildViewController: afterVc) - afterVc.input.text.accept(viewModel.input.textString.value) - } - }else if let nowChildVc = children.first as? AfterSearchViewController{ - if afterSearch == true{ - return - - }else{ - self.remove(asChildViewController: afterVc) - self.add(asChildViewController: beforeVc) - beforeVc.delegate = self - } - } - } - - //MARK: Rx 작업 - private func rxBindTask(){ - // MARK: 검색바 포커싱 시작 종료 - let editingDidBegin = searchTextFiled.rx.controlEvent(.editingDidBegin) - let editingDidEnd = searchTextFiled.rx.controlEvent(.editingDidEnd) - let editingDidEndOnExit = searchTextFiled.rx.controlEvent(.editingDidEndOnExit) - - let mergeObservable = Observable.merge( - editingDidBegin.map { UIControl.Event.editingDidBegin }, - editingDidEnd.map { UIControl.Event.editingDidEnd }, - editingDidEndOnExit.map { UIControl.Event.editingDidEndOnExit } - ) - - mergeObservable - .asObservable() - .withLatestFrom(viewModel.input.textString) { ($0, $1) } - .subscribe(onNext: { [weak self] (event,str) in - guard let self = self else { - return - } - - if event == .editingDidBegin { - self.viewModel.output.isFoucused.accept(true) - - if let nowChildVc = self.children.first as? AfterSearchViewController{ - nowChildVc.clearSongCart() - } - self.bindSubView(false) - NotificationCenter.default.post(name: .statusBarEnterDarkBackground, object: nil) - - }else if event == .editingDidEnd { - // self.viewModel.output.isFoucused.accept(false) - //self.bindSubView(false) - NotificationCenter.default.post(name: .statusBarEnterLightBackground, object: nil) - - }else {//검색 버튼 눌렀을 때 - DEBUG_LOG("EditingDidEndOnExit") - //유저 디폴트 저장 - if str.isWhiteSpace == true { - self.searchTextFiled.rx.text.onNext("") - let textPopupViewController = TextPopupViewController.viewController( - text: "검색어를 입력해주세요.", - cancelButtonIsHidden: true - ) - self.showPanModal(content: textPopupViewController) - - }else{ - PreferenceManager.shared.addRecentRecords(word: str) - self.bindSubView(true) - UIView.setAnimationsEnabled(false) - self.view.endEditing(true) //바인드 서브 뷰를 먼저 해야 tabMan tabBar가 짤리는 버그를 방지 - UIView.setAnimationsEnabled(true) - } - self.viewModel.output.isFoucused.accept(false) - } - }) - .disposed(by: disposeBag) - - //textField.rx.text 하고 subscirbe하면 옵셔널 타입으로 String? 을 받아오는데, - // 옵셔널 말고 String으로 받아오고 싶으면 orEmpty를 쓰자 -! - self.searchTextFiled.rx.text.orEmpty - .skip(1) //바인드 할 때 발생하는 첫 이벤트를 무시 - .distinctUntilChanged() // 연달아 같은 값이 이어질 때 중복된 값을 막아줍니다 - .bind(to: self.viewModel.input.textString) - .disposed(by: self.disposeBag) - - self.viewModel.output.isFoucused - .withLatestFrom(self.viewModel.input.textString) {($0,$1)} - .subscribe(onNext: { [weak self] (focus:Bool,str:String) in - guard let self = self else{ - return - } - self.reactSearchHeader(focus) - self.cancelButton.alpha = !str.isEmpty||focus ? 1 : 0 - }).disposed(by: disposeBag) - - RxKeyboard.instance.visibleHeight //드라이브: 무조건 메인쓰레드에서 돌아감 - .drive(onNext: { [weak self] keyboardVisibleHeight in - DEBUG_LOG("keyboardVisibleHeight: \(keyboardVisibleHeight)") - guard let self = self else { - return - } - //키보드는 바텀 SafeArea부터 계산되므로 빼야함 - let window: UIWindow? = UIApplication.shared.windows.first - let safeAreaInsetsBottom: CGFloat = window?.safeAreaInsets.bottom ?? 0 - let tmp = keyboardVisibleHeight - safeAreaInsetsBottom - 56 //탭바 높이 추가 - self.contentViewBottomConstraint.constant = tmp > 0 ? tmp : 0 - }) - .disposed(by: disposeBag) - } - - private func reactSearchHeader(_ isfocused:Bool){ - let headerFontSize:CGFloat = 16 - let focusedplaceHolderAttributes = [ - NSAttributedString.Key.foregroundColor: isfocused ? UIColor.white : DesignSystemAsset.GrayColor.gray400.color, - NSAttributedString.Key.font : DesignSystemFontFamily.Pretendard.medium.font(size: headerFontSize) - ] // 포커싱 플레이스홀더 폰트 및 color 설정 - - self.searchHeaderView.backgroundColor = isfocused ? DesignSystemAsset.PrimaryColor.point.color : .white - self.searchTextFiled.textColor = isfocused ? .white : .black - self.searchTextFiled.attributedPlaceholder = NSAttributedString(string: "검색어를 입력하세요.",attributes:focusedplaceHolderAttributes) //플레이스 홀더 설정 - self.searchImageView.tintColor = isfocused ? .white : DesignSystemAsset.GrayColor.gray400.color - } -} - -extension SearchViewController:BeforeSearchContentViewDelegate{ - func itemSelected(_ keyword: String) { - searchTextFiled.rx.text.onNext(keyword) - viewModel.input.textString.accept(keyword) - viewModel.output.isFoucused.accept(false) - PreferenceManager.shared.addRecentRecords(word: keyword) - self.bindSubView(true) - - UIView.setAnimationsEnabled(false) - view.endEditing(true) //바인드 서브 뷰를 먼저 해야 tabMan tabBar가 짤리는 버그를 방지 - UIView.setAnimationsEnabled(true) - } -} - -extension SearchViewController { - public func equalHandleTapped() { - let viewControllersCount: Int = self.navigationController?.viewControllers.count ?? 0 - if viewControllersCount > 1 { - self.navigationController?.popToRootViewController(animated: true) - }else{ - if let before = children.first as? BeforeSearchContentViewController{ - before.scrollToTop() - }else if let after = children.first as? AfterSearchViewController{ - after.scrollToTop() - } - } - } -} diff --git a/Projects/Features/SearchFeature/Sources/ViewModels/AfterSearchContentViewModel.swift b/Projects/Features/SearchFeature/Sources/ViewModels/AfterSearchContentViewModel.swift deleted file mode 100644 index 3e54a646f..000000000 --- a/Projects/Features/SearchFeature/Sources/ViewModels/AfterSearchContentViewModel.swift +++ /dev/null @@ -1,124 +0,0 @@ -// -// SearchViewModel.swift -// SearchFeature -// -// Created by yongbeomkwak on 2023/01/05. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import RxRelay -import BaseFeature -import DomainModule -import Utility -import RxDataSources - -public final class AfterSearchContentViewModel: ViewModelType { - var disposeBag = DisposeBag() - var sectionType: TabPosition! - var dataSource: [SearchSectionModel] - - public init( - type: TabPosition, - dataSource: [SearchSectionModel] - ){ - // AfterSearchContent 를 없애고 AfterSearch 쪽으로 들어감 - DEBUG_LOG("✅ AfterSearchContentViewModel 생성") - self.sectionType = type - self.dataSource = dataSource - } - - public struct Input { - let indexPath: PublishRelay = PublishRelay() - let mandatoryLoadIndexPath: PublishRelay<[IndexPath]> = PublishRelay() - let deSelectedAllSongs: PublishRelay = PublishRelay() - } - - public struct Output { - let dataSource: BehaviorRelay<[SearchSectionModel]> = BehaviorRelay<[SearchSectionModel]>(value: []) - } - - public func transform(from input: Input) -> Output { - let output = Output() - output.dataSource.accept(dataSource) - - input.mandatoryLoadIndexPath - .withLatestFrom(output.dataSource) {($0,$1)} - .map({ (indexPathes, dataSource) -> [SearchSectionModel] in - var newModel = dataSource - for indexPath in indexPathes { - newModel[indexPath.section].items[indexPath.row].isSelected = true - } - return newModel - }) - .bind(to: output.dataSource) - .disposed(by: disposeBag) - - input.indexPath - .withLatestFrom(output.dataSource){($0,$1)} - .map({[weak self] (indexPath, dataSource) -> [SearchSectionModel] in - guard let self = self else{ return [] } - - let song = dataSource[indexPath.section].items[indexPath.row] - NotificationCenter.default.post(name: .selectedSongOnSearch, object: (self.sectionType,song)) - - var newModel = dataSource - newModel[indexPath.section].items[indexPath.row].isSelected = !newModel[indexPath.section].items[indexPath.row].isSelected - - return newModel - }) - .bind(to: output.dataSource) - .disposed(by: disposeBag) - - NotificationCenter.default.rx.notification(.selectedSongOnSearch) - .filter({ [weak self] in - guard let self = self else{return false} - guard let result = $0.object as? (TabPosition,SongEntity) else { - return false - } - return self.sectionType != result.0 - }) - .map({(res) -> SongEntity in - guard let result = res.object as? (TabPosition,SongEntity) else { - return SongEntity(id: "-", title: "", artist: "", remix: "", reaction: "", views: 0, last: 0, date: "") - } - return result.1 - }) - .filter({$0.id != "-"}) - .withLatestFrom(output.dataSource){($0,$1)} - .map{ (song: SongEntity, dataSource: [SearchSectionModel]) -> [SearchSectionModel] in - var indexPath:IndexPath = IndexPath(row: -1, section: 0) // 비어있는 탭 예외 처리 - var models = dataSource - - models.enumerated().forEach { (section, model) in - if let row = model.items.firstIndex(where: { $0 == song }){ - indexPath = IndexPath(row: row, section: section) - } - } - - guard indexPath.row >= 0 else { // 비어있는 탭 예외 처리 - return models - } - - models[indexPath.section].items[indexPath.row].isSelected = !models[indexPath.section].items[indexPath.row].isSelected - return models - } - .bind(to: output.dataSource) - .disposed(by: disposeBag) - - input.deSelectedAllSongs - .withLatestFrom(output.dataSource) - .map({(dataSource) -> [SearchSectionModel] in - return dataSource.map { sectionModel -> SearchSectionModel in - var newItems = sectionModel.items - newItems.indices.forEach { newItems[$0].isSelected = false } - return SearchSectionModel(model: sectionModel.model, items: newItems) - } - }) - .bind(to: output.dataSource) - .disposed(by: disposeBag) - - return output - } -} diff --git a/Projects/Features/SearchFeature/Sources/ViewModels/AfterSearchViewModel.swift b/Projects/Features/SearchFeature/Sources/ViewModels/AfterSearchViewModel.swift deleted file mode 100644 index 967d5564f..000000000 --- a/Projects/Features/SearchFeature/Sources/ViewModels/AfterSearchViewModel.swift +++ /dev/null @@ -1,108 +0,0 @@ -// -// SearchViewModel.swift -// SearchFeature -// -// Created by yongbeomkwak on 2023/01/05. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import RxRelay -import BaseFeature -import DomainModule -import Utility - -public final class AfterSearchViewModel:ViewModelType { - var disposeBag = DisposeBag() - var fetchSearchSongUseCase: FetchSearchSongUseCase! - - public init(fetchSearchSongUseCase: FetchSearchSongUseCase){ - DEBUG_LOG("✅ AfterSearchViewModel 생성") - self.fetchSearchSongUseCase = fetchSearchSongUseCase - } - - public struct Input { - let text: BehaviorRelay = BehaviorRelay(value: "") - let notiResult: PublishRelay = PublishRelay() - } - - public struct Output { - let dataSource: BehaviorRelay<[[SearchSectionModel]]> = BehaviorRelay<[[SearchSectionModel]]>(value: []) - // 검색 후 재 검색 시 남아 있는 데이터 처리를 위한 변수 - let isFetchStart: PublishSubject = PublishSubject() - let songEntityOfSelectedSongs: BehaviorRelay<[SongEntity]> = BehaviorRelay(value: []) - } - - public func transform(from input: Input) -> Output { - let output = Output() - - input.text - .filter({!$0.isEmpty}) //빈 것에 대한 예외 처리 - .do(onNext: { _ in - // 네트워크 시작점을 포착하기 위한 구간 - output.isFetchStart.onNext(()) - }) - .flatMap { [weak self] (str:String) -> Observable<(([SongEntity], [SongEntity]), [SongEntity])> in - guard let self = self else{ - return Observable.empty() - } - let zip = Observable.zip( - self.fetchSearchSongUseCase.execute(type: .title, keyword: str).asObservable().catchAndReturn([]), - self.fetchSearchSongUseCase.execute(type: .artist, keyword: str).asObservable().catchAndReturn([]) - ) - let remix = self.fetchSearchSongUseCase.execute(type: .remix, keyword: str).asObservable().catchAndReturn([]) - let result = Observable.zip(zip, remix) - return result - } - .map{ (res, r3) in - let (r1, r2): ([SongEntity], [SongEntity]) = res - let limitCount: Int = 3 - - let all: [SearchSectionModel] = [ - SearchSectionModel(model: (.song, r1.count), items: r1.count > limitCount ? Array(r1[0...limitCount-1]) : r1), - SearchSectionModel(model: (.artist, r2.count), items: r2.count > limitCount ? Array(r2[0...limitCount-1]) : r2), - SearchSectionModel(model: (.remix, r3.count), items: r3.count > limitCount ? Array(r3[0...limitCount-1]) : r3) - ] - - var results: [[SearchSectionModel]] = [] - results.append(all) - results.append([SearchSectionModel(model: (.song, r1.count), items: r1)]) - results.append([SearchSectionModel(model: (.artist, r2.count), items: r2)]) - results.append([SearchSectionModel(model: (.remix, r3.count), items: r3)]) - - return results - } - .bind(to: output.dataSource) - .disposed(by: disposeBag) - - NotificationCenter.default.rx.notification(.selectedSongOnSearch) - .map({ notification -> SongEntity in - guard let result = notification.object as? (TabPosition,SongEntity) else { - return SongEntity(id: "_", title: "", artist: "", remix: "", reaction: "", views: 0, last: 0, date: "") - } - return result.1 - }) - .filter({$0.id != "_"}) - .bind(to: input.notiResult) - .disposed(by: disposeBag) - - input.notiResult - .withLatestFrom(output.songEntityOfSelectedSongs){ ($0,$1) } - .map({ (song,songs) -> [SongEntity] in - var nextSongs = songs - - if nextSongs.contains(where: {$0 == song}) { - let index = nextSongs.firstIndex(of: song)! - nextSongs.remove(at: index) - }else { - nextSongs.append(song) - } - return nextSongs - }) - .bind(to: output.songEntityOfSelectedSongs) - .disposed(by: disposeBag) - - return output - } -} diff --git a/Projects/Features/SearchFeature/Sources/ViewModels/BeforeSearchContentViewModel.swift b/Projects/Features/SearchFeature/Sources/ViewModels/BeforeSearchContentViewModel.swift deleted file mode 100644 index e3f826d63..000000000 --- a/Projects/Features/SearchFeature/Sources/ViewModels/BeforeSearchContentViewModel.swift +++ /dev/null @@ -1,52 +0,0 @@ -// -// SearchViewModel.swift -// SearchFeature -// -// Created by yongbeomkwak on 2023/01/05. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import RxRelay -import BaseFeature -import DomainModule -import Utility - -public final class BeforeSearchContentViewModel:ViewModelType { - let input = Input() - var disposeBag = DisposeBag() - var fetchRecommendPlayListUseCase: FetchRecommendPlayListUseCase - - public init( - fetchRecommendPlayListUseCase: any FetchRecommendPlayListUseCase - ){ - self.fetchRecommendPlayListUseCase = fetchRecommendPlayListUseCase - DEBUG_LOG("✅ BeforeSearchContentViewModel 생성") - } - - public struct Input { - } - - public struct Output { - let showRecommend: BehaviorRelay - let dataSource: BehaviorRelay<[RecommendPlayListEntity]> - } - - public func transform(from input: Input) -> Output { - let dataSource:BehaviorRelay<[RecommendPlayListEntity]> = BehaviorRelay(value: []) - let showRecommend:BehaviorRelay = BehaviorRelay(value:true) - - fetchRecommendPlayListUseCase - .execute() - .catchAndReturn([]) - .asObservable() - .map({ (model) -> [RecommendPlayListEntity] in - return model - }) - .bind(to: dataSource) - .disposed(by: disposeBag) - - return Output(showRecommend: showRecommend, dataSource: dataSource) - } -} diff --git a/Projects/Features/SearchFeature/Sources/ViewModels/SearchViewModel.swift b/Projects/Features/SearchFeature/Sources/ViewModels/SearchViewModel.swift deleted file mode 100644 index 0a13fd929..000000000 --- a/Projects/Features/SearchFeature/Sources/ViewModels/SearchViewModel.swift +++ /dev/null @@ -1,37 +0,0 @@ -// -// SearchViewModel.swift -// SearchFeature -// -// Created by yongbeomkwak on 2023/01/05. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import RxRelay -import BaseFeature -import DomainModule -import Utility - -public final class SearchViewModel:ViewModelType { - let input = Input() - let output = Output() - var disposeBag = DisposeBag() - - public init(){ - DEBUG_LOG("✅ \(Self.self) 생성") - } - - public struct Input { - let textString:BehaviorRelay = BehaviorRelay(value: "") - } - - public struct Output { - let isFoucused:BehaviorRelay = BehaviorRelay(value:false) - } - - public func transform(from input: Input) -> Output { - let output = Output() - return output - } -} diff --git a/Projects/Features/SearchFeature/Tests/TargetTests.swift b/Projects/Features/SearchFeature/Tests/TargetTests.swift deleted file mode 100644 index b1cf79405..000000000 --- a/Projects/Features/SearchFeature/Tests/TargetTests.swift +++ /dev/null @@ -1,17 +0,0 @@ -import XCTest - -class TargetTests: XCTestCase { - - override func setUpWithError() throws { - // Put setup code here. This method is called before the invocation of each test method in the class. - } - - override func tearDownWithError() throws { - // Put teardown code here. This method is called after the invocation of each test method in the class. - } - - func testExample() throws { - XCTAssertEqual("A", "A") - } - -} diff --git a/Projects/Features/SearchFeature/Tests/WakmusicRecommendTests.swift b/Projects/Features/SearchFeature/Tests/WakmusicRecommendTests.swift new file mode 100644 index 000000000..792c6e875 --- /dev/null +++ b/Projects/Features/SearchFeature/Tests/WakmusicRecommendTests.swift @@ -0,0 +1,17 @@ +import Nimble +import Quick +import XCTest + +class WakmusicRecommendTests: XCTestCase { + override func setUpWithError() throws { + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDownWithError() throws { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testExample() throws { + XCTAssertEqual("A", "A") + } +} diff --git a/Projects/Features/SignInFeature/.swiftlint.yml b/Projects/Features/SignInFeature/.swiftlint.yml deleted file mode 100644 index ff44f9f28..000000000 --- a/Projects/Features/SignInFeature/.swiftlint.yml +++ /dev/null @@ -1,20 +0,0 @@ -excluded: - - "**/*/NeedleGenerated.swift" - - "Tuist" - - -force_cast: # From https://realm.github.io/SwiftLint/force_cast.html - warning # 강제 캐스팅은 error에서 warning으로 변경 - -disabled_rules: - - trailing_whitespace - - vertical_whitespace - - colon - - comma - - comment_spacing # 주석 여백 - - mark # //MARK 관련 warning - - opening_brace # 괄호 열 때 줄바꿈을 했는지 안했는지, (안했으면 warning) - - line_length # 한줄에 글자 수 제한 , warning: 120, error: 200 (default) - - statement_position # if는 반드시 else로 끝나야한다. - - identifier_name #변수명 글자 수 제한 - diff --git a/Projects/Features/SignInFeature/Interface/SignInFactory.swift b/Projects/Features/SignInFeature/Interface/SignInFactory.swift new file mode 100644 index 000000000..3fa1aaf51 --- /dev/null +++ b/Projects/Features/SignInFeature/Interface/SignInFactory.swift @@ -0,0 +1,5 @@ +import UIKit + +public protocol SignInFactory { + func makeView() -> UIViewController +} diff --git a/Projects/Features/SignInFeature/Project.swift b/Projects/Features/SignInFeature/Project.swift index 6721f7459..70a47d97c 100644 --- a/Projects/Features/SignInFeature/Project.swift +++ b/Projects/Features/SignInFeature/Project.swift @@ -1,11 +1,33 @@ +import DependencyPlugin import ProjectDescription import ProjectDescriptionHelpers -let project = Project.makeModule( - name: "SignInFeature", - product: .staticFramework, - dependencies: [ - .Project.Features.PlayerFeature +let project = Project.module( + name: ModulePaths.Feature.SignInFeature.rawValue, + targets: [ + .interface(module: .feature(.SignInFeature)), + .implements( + module: .feature(.SignInFeature), + product: .staticFramework, + spec: .init( + resources: ["Resources/**"], + dependencies: [ + .feature(target: .BaseFeature), + .module(target: .KeychainModule), + .domain(target: .AuthDomain, type: .interface), + .domain(target: .UserDomain, type: .interface), + .feature(target: .SignInFeature, type: .interface) + ] + ) + ), + .testing( + module: .feature(.SignInFeature), + dependencies: [ + .feature(target: .SignInFeature), + .feature(target: .SignInFeature, type: .interface), + .domain(target: .AuthDomain, type: .testing), + .domain(target: .UserDomain, type: .testing) + ] + ) ] - , resources: ["Resources/**"] ) diff --git a/Projects/Features/SignInFeature/Resources/SignIn.storyboard b/Projects/Features/SignInFeature/Resources/SignIn.storyboard index 60464e414..69405f71c 100644 --- a/Projects/Features/SignInFeature/Resources/SignIn.storyboard +++ b/Projects/Features/SignInFeature/Resources/SignIn.storyboard @@ -1,9 +1,9 @@ - + - + @@ -17,27 +17,42 @@ + + + + + + + + + + + - + - + - + - - - - + - + + + + - + @@ -129,14 +147,15 @@ - + + + + - - @@ -144,23 +163,22 @@ - - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - -
diff --git a/Projects/Features/StorageFeature/Resources/Storage.storyboard b/Projects/Features/StorageFeature/Resources/Storage.storyboard index 529019310..806230fe9 100644 --- a/Projects/Features/StorageFeature/Resources/Storage.storyboard +++ b/Projects/Features/StorageFeature/Resources/Storage.storyboard @@ -1,193 +1,93 @@ - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + + + + + + + + + - - + + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - + - - - - - - + + + + + - - - - - - + @@ -195,615 +95,19 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + @@ -874,7 +178,7 @@ - + @@ -897,7 +201,7 @@ - + @@ -921,7 +225,7 @@ - + @@ -1019,7 +323,7 @@ - + @@ -1031,1920 +335,16 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - + + - - - - - - - - - - - - - - - diff --git a/Projects/Features/StorageFeature/Sources/Analytics/StorageAnalyticsLog.swift b/Projects/Features/StorageFeature/Sources/Analytics/StorageAnalyticsLog.swift new file mode 100644 index 000000000..800b0eed1 --- /dev/null +++ b/Projects/Features/StorageFeature/Sources/Analytics/StorageAnalyticsLog.swift @@ -0,0 +1,45 @@ +import LogManager + +enum StorageAnalyticsLog: AnalyticsLogType { + case clickStorageTabbarTab(tab: StorageTab) + case clickCreatePlaylistButton(location: CreatePlaylistLocation) + case clickMyPlaylistEditButton + case clickMyLikeListEditButton + case clickLoginButton(location: LoginLocation) + case clickFruitDrawEntryButton(location: FruitDrawEntryLocation) + case clickMyLikeListMusicButton(id: String) +} + +enum StorageTab: String, AnalyticsLogEnumParametable { + case myPlaylist = "my_playlist" + case myLikeList = "my_like_list" + + var description: String { + self.rawValue + } +} + +enum CreatePlaylistLocation: String, AnalyticsLogEnumParametable { + case myPlaylist = "my_playlist" + + var description: String { + self.rawValue + } +} + +enum FruitDrawEntryLocation: String, AnalyticsLogEnumParametable { + case myPlaylist = "my_playlist" + + var description: String { + self.rawValue + } +} + +enum LoginLocation: String, AnalyticsLogEnumParametable { + case myPlaylist = "my_playlist" + case myLikeList = "my_like_list" + + var description: String { + self.rawValue + } +} diff --git a/Projects/Features/StorageFeature/Sources/Components/AfterLoginComponent.swift b/Projects/Features/StorageFeature/Sources/Components/AfterLoginComponent.swift deleted file mode 100644 index f0463e6dc..000000000 --- a/Projects/Features/StorageFeature/Sources/Components/AfterLoginComponent.swift +++ /dev/null @@ -1,36 +0,0 @@ -// -// SearchComponent.swift -// SearchFeature -// -// Created by yongbeomkwak on 2023/02/10. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import NeedleFoundation -import DomainModule -import CommonFeature - -public protocol AfterLoginDependency: Dependency { - var fetchUserInfoUseCase: any FetchUserInfoUseCase {get} - var requestComponent: RequestComponent {get} - var profilePopComponent: ProfilePopComponent {get} - var myPlayListComponent: MyPlayListComponent {get} - var multiPurposePopComponent: MultiPurposePopComponent {get} - var favoriteComponent : FavoriteComponent {get} -} - -public final class AfterLoginComponent: Component { - public func makeView() -> AfterLoginViewController { - return AfterLoginViewController.viewController( - viewModel: .init( - fetchUserInfoUseCase: dependency.fetchUserInfoUseCase - ), - requestComponent: dependency.requestComponent, - profilePopComponent: dependency.profilePopComponent, - myPlayListComponent: dependency.myPlayListComponent, - multiPurposePopComponent: dependency.multiPurposePopComponent, - favoriteComponent: dependency.favoriteComponent - ) - } -} diff --git a/Projects/Features/StorageFeature/Sources/Components/AskSongComponent.swift b/Projects/Features/StorageFeature/Sources/Components/AskSongComponent.swift deleted file mode 100644 index 04eba8253..000000000 --- a/Projects/Features/StorageFeature/Sources/Components/AskSongComponent.swift +++ /dev/null @@ -1,26 +0,0 @@ -// -// SearchComponent.swift -// SearchFeature -// -// Created by yongbeomkwak on 2023/02/10. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import NeedleFoundation -import DomainModule -import DataMappingModule - -public protocol AskSongDependency: Dependency { - var modifySongUseCase: any ModifySongUseCase { get } -} - -public final class AskSongComponent: Component { - public func makeView(type: SuggestSongModifyType) -> AskSongViewController { - return AskSongViewController.viewController( - viewModel: .init(type: type, - modifySongUseCase: dependency.modifySongUseCase - ) - ) - } -} diff --git a/Projects/Features/StorageFeature/Sources/Components/BugReportComponent.swift b/Projects/Features/StorageFeature/Sources/Components/BugReportComponent.swift deleted file mode 100644 index fdfe94fb5..000000000 --- a/Projects/Features/StorageFeature/Sources/Components/BugReportComponent.swift +++ /dev/null @@ -1,21 +0,0 @@ -// -// SearchComponent.swift -// SearchFeature -// -// Created by yongbeomkwak on 2023/02/10. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import NeedleFoundation -import DomainModule - -public protocol BugReportDependency: Dependency { - var reportBugUseCase: any ReportBugUseCase { get } -} - -public final class BugReportComponent: Component { - public func makeView() -> BugReportViewController { - return BugReportViewController.viewController(viewModel: .init(reportBugUseCase: dependency.reportBugUseCase)) - } -} diff --git a/Projects/Features/StorageFeature/Sources/Components/FavoriteComponent.swift b/Projects/Features/StorageFeature/Sources/Components/FavoriteComponent.swift deleted file mode 100644 index ded5a9c24..000000000 --- a/Projects/Features/StorageFeature/Sources/Components/FavoriteComponent.swift +++ /dev/null @@ -1,33 +0,0 @@ -// -// SearchComponent.swift -// SearchFeature -// -// Created by yongbeomkwak on 2023/02/10. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import NeedleFoundation -import SignInFeature -import DomainModule -import CommonFeature - -public protocol FavoriteDependency: Dependency { - var containSongsComponent: ContainSongsComponent {get} - var fetchFavoriteSongsUseCase: any FetchFavoriteSongsUseCase {get} - var editFavoriteSongsOrderUseCase: any EditFavoriteSongsOrderUseCase {get} - var deleteFavoriteListUseCase: any DeleteFavoriteListUseCase {get} -} - -public final class FavoriteComponent: Component { - public func makeView() -> FavoriteViewController { - return FavoriteViewController.viewController( - viewModel: .init( - fetchFavoriteSongsUseCase: dependency.fetchFavoriteSongsUseCase, - editFavoriteSongsOrderUseCase: dependency.editFavoriteSongsOrderUseCase, - deleteFavoriteListUseCase: dependency.deleteFavoriteListUseCase - ), - containSongsComponent: dependency.containSongsComponent - ) - } -} diff --git a/Projects/Features/StorageFeature/Sources/Components/LikeStorageComponent.swift b/Projects/Features/StorageFeature/Sources/Components/LikeStorageComponent.swift new file mode 100644 index 000000000..11f9c53f5 --- /dev/null +++ b/Projects/Features/StorageFeature/Sources/Components/LikeStorageComponent.swift @@ -0,0 +1,37 @@ +import AuthDomainInterface +import BaseDomainInterface +import BaseFeature +import BaseFeatureInterface +import Foundation +import NeedleFoundation +import SignInFeatureInterface +import UIKit +import UserDomainInterface + +public protocol LikeStorageDependency: Dependency { + var containSongsFactory: any ContainSongsFactory { get } + var fetchFavoriteSongsUseCase: any FetchFavoriteSongsUseCase { get } + var editFavoriteSongsOrderUseCase: any EditFavoriteSongsOrderUseCase { get } + var deleteFavoriteListUseCase: any DeleteFavoriteListUseCase { get } + var logoutUseCase: any LogoutUseCase { get } + var textPopupFactory: any TextPopupFactory { get } + var signInFactory: any SignInFactory { get } + var songDetailPresenter: any SongDetailPresentable { get } +} + +public final class LikeStorageComponent: Component { + public func makeView() -> UIViewController { + return LikeStorageViewController.viewController( + reactor: LikeStorageReactor( + storageCommonService: DefaultStorageCommonService.shared, + fetchFavoriteSongsUseCase: dependency.fetchFavoriteSongsUseCase, + deleteFavoriteListUseCase: dependency.deleteFavoriteListUseCase, + editFavoriteSongsOrderUseCase: dependency.editFavoriteSongsOrderUseCase + ), + containSongsFactory: dependency.containSongsFactory, + textPopupFactory: dependency.textPopupFactory, + signInFactory: dependency.signInFactory, + songDetailPresenter: dependency.songDetailPresenter + ) + } +} diff --git a/Projects/Features/StorageFeature/Sources/Components/ListStorageComponent.swift b/Projects/Features/StorageFeature/Sources/Components/ListStorageComponent.swift new file mode 100644 index 000000000..311867607 --- /dev/null +++ b/Projects/Features/StorageFeature/Sources/Components/ListStorageComponent.swift @@ -0,0 +1,48 @@ +import AuthDomainInterface +import BaseFeature +import BaseFeatureInterface +import Foundation +import FruitDrawFeatureInterface +import NeedleFoundation +import PlaylistDomainInterface +import PlaylistFeatureInterface +import PriceDomainInterface +import SignInFeatureInterface +import UIKit +import UserDomainInterface + +public protocol ListStorageDependency: Dependency { + var multiPurposePopupFactory: any MultiPurposePopupFactory { get } + var playlistDetailFactory: any PlaylistDetailFactory { get } + var createPlaylistUseCase: any CreatePlaylistUseCase { get } + var editPlayListOrderUseCase: any EditPlaylistOrderUseCase { get } + var fetchPlayListUseCase: any FetchPlaylistUseCase { get } + var deletePlayListUseCase: any DeletePlaylistUseCase { get } + var fetchPlaylistSongsUseCase: any FetchPlaylistSongsUseCase { get } + var fetchPlaylistCreationPriceUseCase: any FetchPlaylistCreationPriceUseCase { get } + var logoutUseCase: any LogoutUseCase { get } + var textPopupFactory: any TextPopupFactory { get } + var signInFactory: any SignInFactory { get } + var fruitDrawFactory: any FruitDrawFactory { get } +} + +public final class ListStorageComponent: Component { + public func makeView() -> UIViewController { + return ListStorageViewController( + reactor: ListStorageReactor( + storageCommonService: DefaultStorageCommonService.shared, + createPlaylistUseCase: dependency.createPlaylistUseCase, + fetchPlayListUseCase: dependency.fetchPlayListUseCase, + editPlayListOrderUseCase: dependency.editPlayListOrderUseCase, + deletePlayListUseCase: dependency.deletePlayListUseCase, + fetchPlaylistSongsUseCase: dependency.fetchPlaylistSongsUseCase, + fetchPlaylistCreationPriceUseCase: dependency.fetchPlaylistCreationPriceUseCase + ), + multiPurposePopupFactory: dependency.multiPurposePopupFactory, + textPopupFactory: dependency.textPopupFactory, + playlistDetailFactory: dependency.playlistDetailFactory, + signInFactory: dependency.signInFactory, + fruitDrawFactory: dependency.fruitDrawFactory + ) + } +} diff --git a/Projects/Features/StorageFeature/Sources/Components/MyPlayListComponent.swift b/Projects/Features/StorageFeature/Sources/Components/MyPlayListComponent.swift deleted file mode 100644 index 1afbcfcce..000000000 --- a/Projects/Features/StorageFeature/Sources/Components/MyPlayListComponent.swift +++ /dev/null @@ -1,34 +0,0 @@ -// -// SearchComponent.swift -// SearchFeature -// -// Created by yongbeomkwak on 2023/02/10. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import NeedleFoundation -import CommonFeature -import DomainModule - -public protocol MyPlayListDependency: Dependency { - var multiPurposePopComponent: MultiPurposePopComponent {get} - var playListDetailComponent: PlayListDetailComponent {get} - var fetchPlayListUseCase: any FetchPlayListUseCase {get} - var editPlayListOrderUseCase: any EditPlayListOrderUseCase {get} - var deletePlayListUseCase: any DeletePlayListUseCase {get} -} - -public final class MyPlayListComponent: Component { - public func makeView() -> MyPlayListViewController{ - return MyPlayListViewController.viewController( - viewModel: .init( - fetchPlayListUseCase: dependency.fetchPlayListUseCase, - editPlayListOrderUseCase: dependency.editPlayListOrderUseCase, - deletePlayListUseCase: dependency.deletePlayListUseCase - ), - multiPurposePopComponent: dependency.multiPurposePopComponent, - playListDetailComponent: dependency.playListDetailComponent - ) - } -} diff --git a/Projects/Features/StorageFeature/Sources/Components/NoticeComponent.swift b/Projects/Features/StorageFeature/Sources/Components/NoticeComponent.swift deleted file mode 100644 index 4e7396125..000000000 --- a/Projects/Features/StorageFeature/Sources/Components/NoticeComponent.swift +++ /dev/null @@ -1,27 +0,0 @@ -// -// NoticeComponent.swift -// StorageFeature -// -// Created by KTH on 2023/04/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import NeedleFoundation -import DomainModule - -public protocol NoticeDependency: Dependency { - var fetchNoticeUseCase: any FetchNoticeUseCase {get} - var noticeDetailComponent : NoticeDetailComponent {get} -} - -public final class NoticeComponent: Component { - public func makeView() -> NoticeViewController { - return NoticeViewController.viewController( - viewModel: .init( - fetchNoticeUseCase: dependency.fetchNoticeUseCase - ), - noticeDetailComponent: dependency.noticeDetailComponent - ) - } -} diff --git a/Projects/Features/StorageFeature/Sources/Components/NoticeDetailComponent.swift b/Projects/Features/StorageFeature/Sources/Components/NoticeDetailComponent.swift deleted file mode 100644 index 2ab2a2cd5..000000000 --- a/Projects/Features/StorageFeature/Sources/Components/NoticeDetailComponent.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// NoticeDetailComponent.swift -// StorageFeature -// -// Created by KTH on 2023/04/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import NeedleFoundation -import DomainModule - -public protocol NoticeDetailDependency: Dependency { -} - -public final class NoticeDetailComponent: Component { - public func makeView(model: FetchNoticeEntity) -> NoticeDetailViewController { - return NoticeDetailViewController.viewController( - viewModel: .init( - model: model - ) - ) - } -} diff --git a/Projects/Features/StorageFeature/Sources/Components/QnaComponent.swift b/Projects/Features/StorageFeature/Sources/Components/QnaComponent.swift deleted file mode 100644 index cd4bb0898..000000000 --- a/Projects/Features/StorageFeature/Sources/Components/QnaComponent.swift +++ /dev/null @@ -1,27 +0,0 @@ -// -// SearchComponent.swift -// SearchFeature -// -// Created by yongbeomkwak on 2023/02/10. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import NeedleFoundation -import DomainModule - -public protocol QnaDependency: Dependency { - - - var qnaContentComponent : QnaContentComponent {get} - var fetchQnaCategoriesUseCase : any FetchQnaCategoriesUseCase {get} - var fetchQnaUseCase : any FetchQnaUseCase {get} - - -} - -public final class QnaComponent: Component { - public func makeView() -> QnaViewController { - return QnaViewController.viewController(viewModel: .init(fetchQnaCategoriesUseCase: dependency.fetchQnaCategoriesUseCase,fetchQnaUseCase: dependency.fetchQnaUseCase), qnaContentComponent: dependency.qnaContentComponent) - } -} diff --git a/Projects/Features/StorageFeature/Sources/Components/QnaContentComponent.swift b/Projects/Features/StorageFeature/Sources/Components/QnaContentComponent.swift deleted file mode 100644 index e54d34def..000000000 --- a/Projects/Features/StorageFeature/Sources/Components/QnaContentComponent.swift +++ /dev/null @@ -1,21 +0,0 @@ -// -// SearchComponent.swift -// SearchFeature -// -// Created by yongbeomkwak on 2023/02/10. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import NeedleFoundation -import DomainModule - -public protocol QnaContentDependency: Dependency { - -} - -public final class QnaContentComponent: Component { - public func makeView(dataSource:[QnaEntity]) -> QnaContentViewController { - return QnaContentViewController.viewController(viewModel: .init(dataSource: dataSource)) - } -} diff --git a/Projects/Features/StorageFeature/Sources/Components/QuestionComponent.swift b/Projects/Features/StorageFeature/Sources/Components/QuestionComponent.swift deleted file mode 100644 index fded2cf3e..000000000 --- a/Projects/Features/StorageFeature/Sources/Components/QuestionComponent.swift +++ /dev/null @@ -1,30 +0,0 @@ -// -// SearchComponent.swift -// SearchFeature -// -// Created by yongbeomkwak on 2023/02/10. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import NeedleFoundation -import DomainModule - -public protocol QuestionDependency: Dependency { - var suggestFunctionComponent: SuggestFunctionComponent {get} - var wakMusicFeedbackComponent: WakMusicFeedbackComponent {get} - var askSongComponent : AskSongComponent {get} - var bugReportComponent : BugReportComponent {get} -} - -public final class QuestionComponent: Component { - public func makeView() -> QuestionViewController { - return QuestionViewController.viewController( - viewModel: .init(), - suggestFunctionComponent: dependency.suggestFunctionComponent, - wakMusicFeedbackComponent: dependency.wakMusicFeedbackComponent, - askSongComponent: dependency.askSongComponent, - bugReportComponent: dependency.bugReportComponent - ) - } -} diff --git a/Projects/Features/StorageFeature/Sources/Components/RequestComponent.swift b/Projects/Features/StorageFeature/Sources/Components/RequestComponent.swift deleted file mode 100644 index 0677cfe81..000000000 --- a/Projects/Features/StorageFeature/Sources/Components/RequestComponent.swift +++ /dev/null @@ -1,36 +0,0 @@ -// -// SearchComponent.swift -// SearchFeature -// -// Created by yongbeomkwak on 2023/02/10. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import NeedleFoundation -import DomainModule -import CommonFeature - -public protocol RequestDependency: Dependency { - var withdrawUserInfoUseCase: any WithdrawUserInfoUseCase {get} - var qnaComponent: QnaComponent {get} - var questionComponent: QuestionComponent {get} - var containSongsComponent: ContainSongsComponent {get} - var noticeComponent: NoticeComponent {get} - var serviceInfoComponent: ServiceInfoComponent { get } -} - -public final class RequestComponent: Component { - public func makeView() -> RequestViewController { - return RequestViewController.viewController( - viewModel: .init( - withDrawUserInfoUseCase: dependency.withdrawUserInfoUseCase - ), - qnaComponent:dependency.qnaComponent, - questionComponent: dependency.questionComponent, - containSongsComponent: dependency.containSongsComponent, - noticeComponent: dependency.noticeComponent, - serviceInfoComponent: dependency.serviceInfoComponent - ) - } -} diff --git a/Projects/Features/StorageFeature/Sources/Components/StorageComponent.swift b/Projects/Features/StorageFeature/Sources/Components/StorageComponent.swift index 8ade428ba..5c85727f5 100644 --- a/Projects/Features/StorageFeature/Sources/Components/StorageComponent.swift +++ b/Projects/Features/StorageFeature/Sources/Components/StorageComponent.swift @@ -1,22 +1,31 @@ -// -// SearchComponent.swift -// SearchFeature -// -// Created by yongbeomkwak on 2023/02/10. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - +import BaseFeature +import BaseFeatureInterface import Foundation import NeedleFoundation -import SignInFeature +import SignInFeatureInterface +import StorageFeatureInterface +import UIKit +import UserDomainInterface public protocol StorageDependency: Dependency { - var signInComponent : SignInComponent {get} - var afterLoginComponent : AfterLoginComponent {get} + var signInFactory: any SignInFactory { get } + var textPopupFactory: any TextPopupFactory { get } + var multiPurposePopupFactory: any MultiPurposePopupFactory { get } + var listStorageComponent: ListStorageComponent { get } + var likeStorageComponent: LikeStorageComponent { get } } -public final class StorageComponent: Component { - public func makeView() -> StorageViewController { - return StorageViewController.viewController(signInComponent: dependency.signInComponent,afterLoginComponent: dependency.afterLoginComponent) +public final class StorageComponent: Component, StorageFactory { + public func makeView() -> UIViewController { + return StorageViewController.viewController( + reactor: StorageReactor( + storageCommonService: DefaultStorageCommonService.shared + ), + listStorageComponent: dependency.listStorageComponent, + multiPurposePopupFactory: dependency.multiPurposePopupFactory, + likeStorageComponent: dependency.likeStorageComponent, + textPopupFactory: dependency.textPopupFactory, + signInFactory: dependency.signInFactory + ) } } diff --git a/Projects/Features/StorageFeature/Sources/Components/SuggestFunctionComponent.swift b/Projects/Features/StorageFeature/Sources/Components/SuggestFunctionComponent.swift deleted file mode 100644 index 252a28689..000000000 --- a/Projects/Features/StorageFeature/Sources/Components/SuggestFunctionComponent.swift +++ /dev/null @@ -1,21 +0,0 @@ -// -// SearchComponent.swift -// SearchFeature -// -// Created by yongbeomkwak on 2023/02/10. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import NeedleFoundation -import DomainModule - -public protocol SuggestFunctionDependency: Dependency { - var suggestFunctionUseCase: any SuggestFunctionUseCase { get } -} - -public final class SuggestFunctionComponent: Component { - public func makeView() -> SuggestFunctionViewController { - return SuggestFunctionViewController.viewController(viewModel: .init(suggestFunctionUseCase: dependency.suggestFunctionUseCase)) - } -} diff --git a/Projects/Features/StorageFeature/Sources/Components/WakMusicFeedbackComponent.swift b/Projects/Features/StorageFeature/Sources/Components/WakMusicFeedbackComponent.swift deleted file mode 100644 index 1886b9951..000000000 --- a/Projects/Features/StorageFeature/Sources/Components/WakMusicFeedbackComponent.swift +++ /dev/null @@ -1,21 +0,0 @@ -// -// SearchComponent.swift -// SearchFeature -// -// Created by yongbeomkwak on 2023/02/10. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import NeedleFoundation -import DomainModule - -public protocol WakMusicFeedbackDependency: Dependency { - var inquiryWeeklyChartUseCase: any InquiryWeeklyChartUseCase { get } -} - -public final class WakMusicFeedbackComponent: Component { - public func makeView() -> WakMusicFeedbackViewController { - return WakMusicFeedbackViewController.viewController(viewModel: .init(inquiryWeeklyChartUseCase: dependency.inquiryWeeklyChartUseCase)) - } -} diff --git a/Projects/Features/StorageFeature/Sources/Reactors/LikeStorageReactor.swift b/Projects/Features/StorageFeature/Sources/Reactors/LikeStorageReactor.swift new file mode 100644 index 000000000..4dfabd9f7 --- /dev/null +++ b/Projects/Features/StorageFeature/Sources/Reactors/LikeStorageReactor.swift @@ -0,0 +1,410 @@ +import AuthDomainInterface +import BaseDomainInterface +import BaseFeature +import Foundation +import Localization +import LogManager +import ReactorKit +import RxCocoa +import RxRelay +import RxSwift +import SongsDomainInterface +import UserDomainInterface +import Utility + +final class LikeStorageReactor: Reactor { + enum Action { + case viewDidLoad + case refresh + case itemMoved(ItemMovedEvent) + case songDidTap(Int) + case tapAll(isSelecting: Bool) + case playDidTap(song: FavoriteSongEntity) + case addToPlaylistButtonDidTap // 노래담기 + case presentAddToPlaylistPopup + case addToCurrentPlaylistButtonDidTap // 재생목록추가 + case deleteButtonDidTap + case confirmDeleteButtonDidTap + case loginButtonDidTap + } + + enum Mutation { + case clearDataSource + case updateDataSource([LikeSectionModel]) + case updateBackupDataSource([LikeSectionModel]) + case undoDataSource + case switchEditingState(Bool) + case updateIsLoggedIn(Bool) + case updateIsShowActivityIndicator(Bool) + case showToast(String) + case showLoginAlert + case showAddToPlaylistPopup([String]) + case showDeletePopup(Int) + case hideSongCart + case updateSelectedItemCount(Int) + case updateOrder([FavoriteSongEntity]) + } + + struct State { + var isLoggedIn: Bool + var isEditing: Bool + var dataSource: [LikeSectionModel] + var backupDataSource: [LikeSectionModel] + var selectedItemCount: Int + var isShowActivityIndicator: Bool + @Pulse var showAddToPlaylistPopup: [String]? + @Pulse var showToast: String? + @Pulse var hideSongCart: Void? + @Pulse var showDeletePopup: Int? + @Pulse var showLoginAlert: Void? + } + + var initialState: State + private let storageCommonService: any StorageCommonService + private let fetchFavoriteSongsUseCase: any FetchFavoriteSongsUseCase + private let deleteFavoriteListUseCase: any DeleteFavoriteListUseCase + private let editFavoriteSongsOrderUseCase: any EditFavoriteSongsOrderUseCase + + init( + storageCommonService: any StorageCommonService, + fetchFavoriteSongsUseCase: any FetchFavoriteSongsUseCase, + deleteFavoriteListUseCase: any DeleteFavoriteListUseCase, + editFavoriteSongsOrderUseCase: any EditFavoriteSongsOrderUseCase + ) { + self.initialState = State( + isLoggedIn: false, + isEditing: false, + dataSource: [], + backupDataSource: [], + selectedItemCount: 0, + isShowActivityIndicator: false + ) + + self.storageCommonService = storageCommonService + self.fetchFavoriteSongsUseCase = fetchFavoriteSongsUseCase + self.deleteFavoriteListUseCase = deleteFavoriteListUseCase + self.editFavoriteSongsOrderUseCase = editFavoriteSongsOrderUseCase + } + + deinit { + LogManager.printDebug("❌ Deinit \(Self.self)") + } + + func mutate(action: Action) -> Observable { + switch action { + case .viewDidLoad: + return viewDidLoad() + + case .refresh: + return fetchLikeSongList() + + case let .itemMoved((sourceIndex, destinationIndex)): + return updateOrder(src: sourceIndex.row, dest: destinationIndex.row) + + case let .songDidTap(index): + return changeSelectingState(index) + + case let .playDidTap(song): + return playWithAddToCurrentPlaylist(song: song) + + case let .tapAll(isSelecting): + return tapAll(isSelecting) + + case .addToPlaylistButtonDidTap: + return showAddToPlaylistPopup() + + case .addToCurrentPlaylistButtonDidTap: + return addToCurrentPlaylist() + + case .deleteButtonDidTap: + let itemCount = currentState.selectedItemCount + return .just(.showDeletePopup(itemCount)) + + case .confirmDeleteButtonDidTap: + return deleteSongs() + + case .loginButtonDidTap: + let log = CommonAnalyticsLog.clickLoginButton(entry: .storageLike) + LogManager.analytics(log) + return .just(.showLoginAlert) + + case .presentAddToPlaylistPopup: + return presentAddToPlaylistPopup() + } + } + + func transform(mutation: Observable) -> Observable { + let switchEditingStateMutation = storageCommonService.isEditingState + .skip(1) + .withUnretained(self) + .flatMap { owner, editingState -> Observable in + let log = if !editingState { + CommonAnalyticsLog.clickEditButton(location: .playlist) + } else { + CommonAnalyticsLog.clickEditCompleteButton(location: .playlist) + } + LogManager.analytics(log) + + // 편집이 종료될 때 처리 + if editingState == false { + let new = owner.currentState.dataSource.flatMap { $0.items }.map { $0.songID } + let original = owner.currentState.backupDataSource.flatMap { $0.items }.map { $0.songID } + let isChanged = new != original + if isChanged { + return .concat( + .just(.updateIsShowActivityIndicator(true)), + owner.mutateEditSongsOrderUseCase(), + .just(.updateIsShowActivityIndicator(false)), + .just(.updateSelectedItemCount(0)), + .just(.hideSongCart), + .just(.switchEditingState(false)) + ) + } else { + return .concat( + .just(.updateSelectedItemCount(0)), + .just(.undoDataSource), + .just(.hideSongCart), + .just(.switchEditingState(false)) + ) + } + } else { + return .just(.switchEditingState(editingState)) + } + } + + let updateIsLoggedInMutation = storageCommonService.loginStateDidChangedEvent + .withUnretained(self) + .flatMap { owner, userID -> Observable in + let isLoggedIn = userID != nil + return .concat( + owner.updateIsLoggedIn(isLoggedIn), + owner.fetchLikeSongList() + ) + } + + let refreshLikeSongListMutation = storageCommonService.likeListRefreshEvent + .withUnretained(self) + .flatMap { owner, _ -> Observable in + return owner.fetchLikeSongList() + } + + return Observable.merge( + mutation, + switchEditingStateMutation, + updateIsLoggedInMutation, + refreshLikeSongListMutation + ) + } + + func reduce(state: State, mutation: Mutation) -> State { + var newState = state + + switch mutation { + case let .updateDataSource(dataSource): + newState.dataSource = dataSource + case let .switchEditingState(flag): + newState.isEditing = flag + case let .updateOrder(dataSource): + newState.dataSource = [LikeSectionModel(model: 0, items: dataSource)] + case .clearDataSource: + newState.dataSource = [] + case let .updateBackupDataSource(dataSource): + newState.backupDataSource = dataSource + case .undoDataSource: + newState.dataSource = currentState.backupDataSource + case let .updateIsLoggedIn(isLoggedIn): + newState.isLoggedIn = isLoggedIn + case let .updateIsShowActivityIndicator(isShow): + newState.isShowActivityIndicator = isShow + case let .showToast(isShow): + newState.showToast = isShow + case let .showAddToPlaylistPopup(selectedItemIDs): + newState.showAddToPlaylistPopup = selectedItemIDs + case let .showDeletePopup(itemCount): + newState.showDeletePopup = itemCount + case .hideSongCart: + newState.hideSongCart = () + case let .updateSelectedItemCount(count): + newState.selectedItemCount = count + case .showLoginAlert: + newState.showLoginAlert = () + } + + return newState + } +} + +extension LikeStorageReactor { + func viewDidLoad() -> Observable { + let isLoggedIn = PreferenceManager.userInfo != nil + if !isLoggedIn { return .empty() } + return .concat( + updateIsLoggedIn(isLoggedIn), + .concat( + .just(.updateIsShowActivityIndicator(true)), + fetchLikeSongList(), + .just(.updateIsShowActivityIndicator(false)) + ) + ) + } + + func fetchLikeSongList() -> Observable { + fetchFavoriteSongsUseCase + .execute() + .catchAndReturn([]) + .asObservable() + .map { [LikeSectionModel(model: 0, items: $0)] } + .flatMap { fetchedDataSource -> Observable in + .concat( + .just(.updateDataSource(fetchedDataSource)), + .just(.updateBackupDataSource(fetchedDataSource)) + ) + } + } + + func clearDataSource() -> Observable { + return .just(.clearDataSource) + } + + func deleteSongs() -> Observable { + let selectedItemIDs = currentState.dataSource.flatMap { $0.items.filter { $0.isSelected == true } } + .map { $0.songID } + storageCommonService.isEditingState.onNext(false) + return .concat( + .just(.updateIsShowActivityIndicator(true)), + mutateDeleteSongsUseCase(selectedItemIDs), + .just(.updateIsShowActivityIndicator(false)), + .just(.hideSongCart), + .just(.switchEditingState(false)) + ) + } + + func showAddToPlaylistPopup() -> Observable { + let selectedItemIDs = currentState.dataSource.flatMap { $0.items.filter { $0.isSelected == true } } + .map { $0.songID } + return .just(.showAddToPlaylistPopup(selectedItemIDs)) + } + + func presentAddToPlaylistPopup() -> Observable { + guard var tmp = currentState.dataSource.first?.items else { + LogManager.printError("favorite datasource is empty") + return .empty() + } + for index in tmp.indices { tmp[index].isSelected = false } + + storageCommonService.isEditingState.onNext(false) + return .concat( + .just(.updateDataSource([LikeSectionModel(model: 0, items: tmp)])), + .just(.updateSelectedItemCount(0)) + ) + } + + func addToCurrentPlaylist() -> Observable { + let appendingPlaylisItems = currentState.dataSource + .flatMap { $0.items.filter { $0.isSelected == true } } + .map { PlaylistItem(id: $0.songID, title: $0.title, artist: $0.artist) } + + PlayState.shared.append(contentsOf: appendingPlaylisItems) + return .just(.showToast(LocalizationStrings.addList)) + } + + func playWithAddToCurrentPlaylist(song: FavoriteSongEntity) -> Observable { + let appendingPlaylisItem = PlaylistItem(id: song.songID, title: song.title, artist: song.artist) + PlayState.shared.append(item: appendingPlaylisItem) + WakmusicYoutubePlayer( + id: song.songID, + playPlatform: song.title.isContainShortsTagTitle ? .youtube : .automatic + ).play() + return .empty() + } + + func updateIsLoggedIn(_ isLoggedIn: Bool) -> Observable { + return .just(.updateIsLoggedIn(isLoggedIn)) + } + + /// 순서 변경 + func updateOrder(src: Int, dest: Int) -> Observable { + guard var tmp = currentState.dataSource.first?.items else { + LogManager.printError("favorite datasource is empty") + return .empty() + } + + let target = tmp[src] + tmp.remove(at: src) + tmp.insert(target, at: dest) + return .just(.updateOrder(tmp)) + } + + func changeSelectingState(_ index: Int) -> Observable { + guard var tmp = currentState.dataSource.first?.items else { + LogManager.printError("favorite datasource is empty") + return .empty() + } + + var count = currentState.selectedItemCount + let target = tmp[index] + count = target.isSelected ? count - 1 : count + 1 + tmp[index].isSelected = !tmp[index].isSelected + + return .concat( + .just(.updateDataSource([LikeSectionModel(model: 0, items: tmp)])), + .just(.updateSelectedItemCount(count)) + ) + } + + /// 전체 곡 선택 / 해제 + func tapAll(_ flag: Bool) -> Observable { + guard var tmp = currentState.dataSource.first?.items else { + LogManager.printError("favorite datasource is empty") + return .empty() + } + + let count = flag ? tmp.count : 0 + + for i in 0 ..< tmp.count { + tmp[i].isSelected = flag + } + + return .concat( + .just(.updateDataSource([LikeSectionModel(model: 0, items: tmp)])), + .just(.updateSelectedItemCount(count)) + ) + } +} + +private extension LikeStorageReactor { + func mutateDeleteSongsUseCase(_ ids: [String]) -> Observable { + deleteFavoriteListUseCase.execute(ids: ids) + .andThen( + .concat( + fetchLikeSongList(), + .just(.showToast("\(ids.count)개의 리스트를 삭제했습니다.")) + ) + ) + .catch { error in + let error = error.asWMError + return .concat( + .just(.undoDataSource), + .just(.showToast(error.errorDescription ?? LocalizationStrings.unknownErrorWarning)) + ) + } + } + + func mutateEditSongsOrderUseCase() -> Observable { + let currentDataSource = currentState.dataSource + let songsOrder = currentDataSource.flatMap { $0.items.map { $0.songID } } + return editFavoriteSongsOrderUseCase.execute(ids: songsOrder) + .andThen( + .concat( + .just(Mutation.updateBackupDataSource(currentDataSource)) + ) + ) + .catch { error in + let error = error.asWMError + return Observable.concat([ + .just(.undoDataSource), + .just(.showToast(error.errorDescription ?? LocalizationStrings.unknownErrorWarning)) + ]) + } + } +} diff --git a/Projects/Features/StorageFeature/Sources/Reactors/ListStorageReactor.swift b/Projects/Features/StorageFeature/Sources/Reactors/ListStorageReactor.swift new file mode 100644 index 000000000..6c4564e88 --- /dev/null +++ b/Projects/Features/StorageFeature/Sources/Reactors/ListStorageReactor.swift @@ -0,0 +1,561 @@ +import BaseFeature +import Foundation +import Localization +import LogManager +import PlaylistDomainInterface +import PriceDomainInterface +import ReactorKit +import RxCocoa +import RxSwift +import SongsDomainInterface +import UserDomainInterface +import Utility + +final class ListStorageReactor: Reactor { + enum Action { + case viewDidLoad + case refresh + case itemMoved(ItemMovedEvent) + case cellDidTap(Int) + case listDidTap(IndexPath) + case playDidTap(Int) + case tapAll(isSelecting: Bool) + case loginButtonDidTap + case createListButtonDidTap + case confirmCreatePriceButtonDidTap + case confirmCreateListButtonDidTap(String) + case addToCurrentPlaylistButtonDidTap + case deleteButtonDidTap + case confirmDeleteButtonDidTap + case drawFruitButtonDidTap + case completedFruitDraw + } + + enum Mutation { + case clearDataSource + case updateDataSource([MyPlayListSectionModel]) + case updateBackupDataSource([MyPlayListSectionModel]) + case undoDataSource + case switchEditingState(Bool) + case updateIsLoggedIn(Bool) + case updateIsShowActivityIndicator(Bool) + case showLoginAlert(CommonAnalyticsLog.LoginButtonEntry?) + case showToast(String) + case showCreatePricePopup(Int) + case showCreateListPopup + case showDeletePopup(Int) + case showDetail(key: String) + case hideSongCart + case updateSelectedItemCount(Int) + case showDrawFruitPopup + } + + struct State { + var isLoggedIn: Bool + var isEditing: Bool + var dataSource: [MyPlayListSectionModel] + var backupDataSource: [MyPlayListSectionModel] + var selectedItemCount: Int + var isShowActivityIndicator: Bool + @Pulse var showLoginAlert: CommonAnalyticsLog.LoginButtonEntry? + @Pulse var showToast: String? + @Pulse var hideSongCart: Void? + @Pulse var showCreatePricePopup: Int? + @Pulse var showCreateListPopup: Void? + @Pulse var showDeletePopup: Int? + @Pulse var showDetail: String? + @Pulse var showDrawFruitPopup: Void? + } + + var initialState: State + private var disposeBag = DisposeBag() + private let storageCommonService: any StorageCommonService + private let createPlaylistUseCase: any CreatePlaylistUseCase + private let fetchPlayListUseCase: any FetchPlaylistUseCase + private let editPlayListOrderUseCase: any EditPlaylistOrderUseCase + private let deletePlayListUseCase: any DeletePlaylistUseCase + private let fetchPlaylistSongsUseCase: any FetchPlaylistSongsUseCase + private let fetchPlaylistCreationPriceUseCase: any FetchPlaylistCreationPriceUseCase + + init( + storageCommonService: any StorageCommonService, + createPlaylistUseCase: any CreatePlaylistUseCase, + fetchPlayListUseCase: any FetchPlaylistUseCase, + editPlayListOrderUseCase: any EditPlaylistOrderUseCase, + deletePlayListUseCase: any DeletePlaylistUseCase, + fetchPlaylistSongsUseCase: any FetchPlaylistSongsUseCase, + fetchPlaylistCreationPriceUseCase: any FetchPlaylistCreationPriceUseCase + ) { + self.initialState = State( + isLoggedIn: false, + isEditing: false, + dataSource: [], + backupDataSource: [], + selectedItemCount: 0, + isShowActivityIndicator: false + ) + self.storageCommonService = storageCommonService + self.createPlaylistUseCase = createPlaylistUseCase + self.fetchPlayListUseCase = fetchPlayListUseCase + self.editPlayListOrderUseCase = editPlayListOrderUseCase + self.deletePlayListUseCase = deletePlayListUseCase + self.fetchPlaylistSongsUseCase = fetchPlaylistSongsUseCase + self.fetchPlaylistCreationPriceUseCase = fetchPlaylistCreationPriceUseCase + } + + deinit { + LogManager.printDebug("❌ Deinit \(Self.self)") + } + + func mutate(action: Action) -> Observable { + switch action { + case .viewDidLoad: + return viewDidLoad() + case .refresh: + return fetchDataSource() + + case let .itemMoved((sourceIndex, destinationIndex)): + return updateOrder(src: sourceIndex.row, dest: destinationIndex.row) + + case let .cellDidTap(index): + return changeSelectingState(index) + + case let .listDidTap(indexPath): + return showDetail(indexPath) + + case let .playDidTap(index): + return playWithAddToCurrentPlaylist(index) + + case let .tapAll(isSelecting): + return tapAll(isSelecting) + + case .loginButtonDidTap: + let log = CommonAnalyticsLog.clickLoginButton(entry: .myPlaylist) + LogManager.analytics(log) + return .just(.showLoginAlert(.myPlaylist)) + + case .addToCurrentPlaylistButtonDidTap: + return addToCurrentPlaylist() + + case .createListButtonDidTap: + let log = CommonAnalyticsLog.clickLoginButton(entry: .addMusics) + LogManager.analytics(log) + let isLoggedIn = currentState.isLoggedIn + return isLoggedIn ? mutateFetchPlaylistCreationPrice() : .just(.showLoginAlert(.addMusics)) + + case .confirmCreatePriceButtonDidTap: + return .just(.showCreateListPopup) + + case let .confirmCreateListButtonDidTap(title): + return createList(title) + + case .deleteButtonDidTap: + let itemCount = currentState.selectedItemCount + return .just(.showDeletePopup(itemCount)) + + case .confirmDeleteButtonDidTap: + return deleteList() + + case .drawFruitButtonDidTap: + let isLoggedIn = currentState.isLoggedIn + return isLoggedIn ? .just(.showDrawFruitPopup) : .just(.showLoginAlert(.fruitDraw)) + + case .completedFruitDraw: + return completedFruitDraw() + } + } + + func transform(mutation: Observable) -> Observable { + let switchEditingStateMutation = storageCommonService.isEditingState + .skip(1) + .withUnretained(self) + .flatMap { owner, editingState -> Observable in + let log = if !editingState { + CommonAnalyticsLog.clickEditButton(location: .playlist) + } else { + CommonAnalyticsLog.clickEditCompleteButton(location: .playlist) + } + LogManager.analytics(log) + + // 편집이 종료될 때 처리 + if editingState == false { + let new = owner.currentState.dataSource.flatMap { $0.items }.map { $0.key } + let original = owner.currentState.backupDataSource.flatMap { $0.items }.map { $0.key } + let isChanged = new != original + if isChanged { + return .concat( + .just(.updateIsShowActivityIndicator(true)), + owner.mutateEditPlayListOrder(), + .just(.updateIsShowActivityIndicator(false)), + .just(.updateSelectedItemCount(0)), + .just(.hideSongCart), + .just(.switchEditingState(false)) + ) + } else { + return .concat( + .just(.updateSelectedItemCount(0)), + .just(.undoDataSource), + .just(.hideSongCart), + .just(.switchEditingState(false)) + ) + } + } else { + return .just(.switchEditingState(editingState)) + } + } + + let updateIsLoggedInMutation = storageCommonService.loginStateDidChangedEvent + .withUnretained(self) + .flatMap { owner, userID -> Observable in + let isLoggedIn = userID != nil + return .concat( + owner.updateIsLoggedIn(isLoggedIn), + owner.fetchDataSource() + ) + } + + let playlistRefreshMutation = storageCommonService.playlistRefreshEvent + .withUnretained(self) + .flatMap { owner, _ -> Observable in + return owner.fetchDataSource() + } + + return Observable.merge( + mutation, + switchEditingStateMutation, + updateIsLoggedInMutation, + playlistRefreshMutation + ) + } + + func reduce(state: State, mutation: Mutation) -> State { + var newState = state + + switch mutation { + case let .updateDataSource(dataSource): + newState.dataSource = dataSource + case .updateBackupDataSource: + newState.backupDataSource = currentState.dataSource + case .undoDataSource: + newState.dataSource = currentState.backupDataSource + case .clearDataSource: + newState.dataSource = [] + case let .switchEditingState(flag): + newState.isEditing = flag + case let .updateIsLoggedIn(isLoggedIn): + newState.isLoggedIn = isLoggedIn + case let .showLoginAlert(entry): + newState.showLoginAlert = entry + case let .updateIsShowActivityIndicator(isShow): + newState.isShowActivityIndicator = isShow + case let .showToast(message): + newState.showToast = message + case .hideSongCart: + newState.hideSongCart = () + case .showCreateListPopup: + newState.showCreateListPopup = () + case let .showDeletePopup(itemCount): + newState.showDeletePopup = itemCount + case let .updateSelectedItemCount(count): + newState.selectedItemCount = count + case let .showDetail(key): + newState.showDetail = key + case .showDrawFruitPopup: + newState.showDrawFruitPopup = () + case let .showCreatePricePopup(price): + newState.showCreatePricePopup = price + } + + return newState + } +} + +extension ListStorageReactor { + func viewDidLoad() -> Observable { + let isLoggedIn = PreferenceManager.userInfo != nil + if !isLoggedIn { return .empty() } + return .concat( + updateIsLoggedIn(isLoggedIn), + .concat( + .just(.updateIsShowActivityIndicator(true)), + fetchDataSource(), + .just(.updateIsShowActivityIndicator(false)) + ) + ) + } + + func fetchDataSource() -> Observable { + fetchPlayListUseCase + .execute() + .catchAndReturn([]) + .asObservable() + .map { [MyPlayListSectionModel(model: 0, items: $0)] } + .flatMap { fetchedDataSource -> Observable in + .concat( + .just(.updateDataSource(fetchedDataSource)), + .just(.updateBackupDataSource(fetchedDataSource)) + ) + } + } + + func clearDataSource() -> Observable { + return .just(.clearDataSource) + } + + func completedFruitDraw() -> Observable { + NotificationCenter.default.post(name: .willRefreshUserInfo, object: nil) + return .empty() + } + + func updateIsLoggedIn(_ isLoggedIn: Bool) -> Observable { + return .just(.updateIsLoggedIn(isLoggedIn)) + } + + func createList(_ title: String) -> Observable { + return .concat( + .just(.updateIsShowActivityIndicator(true)), + mutateCreatePlaylist(title), + .just(.updateIsShowActivityIndicator(false)), + .just(.hideSongCart) + ) + } + + func deleteList() -> Observable { + let selectedItemIDs = currentState.dataSource.flatMap { $0.items.filter { $0.isSelected == true } } + storageCommonService.isEditingState.onNext(false) + + return .concat( + .just(.updateIsShowActivityIndicator(true)), + mutateDeletePlaylist(selectedItemIDs), + .just(.updateIsShowActivityIndicator(false)), + .just(.hideSongCart), + .just(.switchEditingState(false)) + ) + } + + func showDetail(_ indexPath: IndexPath) -> Observable { + let selectedList = currentState.dataSource[indexPath.section].items[indexPath.row] + let key = selectedList.key + + return .just(.showDetail(key: key)) + } + + func addToCurrentPlaylist() -> Observable { + let limit = 50 + let selectedPlaylists = currentState.dataSource + .flatMap { $0.items.filter { $0.isSelected == true } } + + let selectedSongCount = selectedPlaylists.map { $0.songCount }.reduce(0, +) + + if selectedSongCount == 0 { + return .just(.showToast("플레이리스트가 비어있습니다.")) + } + + let keys = selectedPlaylists.map { $0.key } + + let observables = keys.map { key in + fetchPlaylistSongsUseCase.execute(key: key).asObservable() + } + + return Observable.concat( + .just(.updateIsShowActivityIndicator(true)), + Observable.zip(observables) + .map { songEntities in + songEntities.flatMap { $0 } + } + .do(onNext: { [weak self] appendingPlaylistItems in + PlayState.shared.appendSongsToPlaylist(appendingPlaylistItems) + self?.storageCommonService.isEditingState.onNext(false) + }) + .flatMap { _ -> Observable in + return .concat( + .just(.hideSongCart), + .just(.showToast(LocalizationStrings.addList)) + ) + }, + .just(.updateIsShowActivityIndicator(false)) + ) + .catch { error in + let error = error.asWMError + return Observable.concat([ + .just(.updateIsShowActivityIndicator(false)), + .just(.showToast(error.errorDescription ?? LocalizationStrings.unknownErrorWarning)) + ]) + } + } + + func playWithAddToCurrentPlaylist(_ index: Int) -> Observable { + let limit = 50 + guard let selectedPlaylist = currentState.dataSource.first?.items[safe: index] else { + return .just(.showToast(LocalizationStrings.unknownErrorWarning)) + } + + if selectedPlaylist.songCount == 0 { + return .just(.showToast("플레이리스트가 비어있습니다.")) + } + return Observable.concat( + .just(.updateIsShowActivityIndicator(true)), + fetchPlaylistSongsUseCase.execute(key: selectedPlaylist.key) + .asObservable() + .do(onNext: { [weak self] appendingPlaylistItems in + PlayState.shared.appendSongsToPlaylist(appendingPlaylistItems) + let ids = appendingPlaylistItems.map { $0.id } + .prefix(50) + if appendingPlaylistItems.allSatisfy({ $0.title.isContainShortsTagTitle }) { + WakmusicYoutubePlayer(ids: Array(ids), title: "왁타버스 뮤직", playPlatform: .youtube).play() + } else { + WakmusicYoutubePlayer(ids: Array(ids), title: "왁타버스 뮤직").play() + } + self?.storageCommonService.isEditingState.onNext(false) + }) + .flatMap { songs -> Observable in + return .just(.showToast(LocalizationStrings.addList)) + }, + .just(.updateIsShowActivityIndicator(false)) + ) + .catch { error in + let error = error.asWMError + return Observable.concat([ + .just(.updateIsShowActivityIndicator(false)), + .just(.showToast(error.errorDescription ?? LocalizationStrings.unknownErrorWarning)) + ]) + } + } + + /// 순서 변경 + func updateOrder(src: Int, dest: Int) -> Observable { + guard var tmp = currentState.dataSource.first?.items else { + LogManager.printError("playlist datasource is empty") + return .empty() + } + + let target = tmp[src] + tmp.remove(at: src) + tmp.insert(target, at: dest) + return .just(.updateDataSource([MyPlayListSectionModel(model: 0, items: tmp)])) + } + + func changeSelectingState(_ index: Int) -> Observable { + guard var tmp = currentState.dataSource.first?.items else { + LogManager.printError("playlist datasource is empty") + return .empty() + } + + var count = currentState.selectedItemCount + let target = tmp[index] + count = target.isSelected ? count - 1 : count + 1 + tmp[index].isSelected = !tmp[index].isSelected + + return .concat( + .just(.updateDataSource([MyPlayListSectionModel(model: 0, items: tmp)])), + .just(.updateSelectedItemCount(count)) + ) + } + + /// 전체 곡 선택 / 해제 + func tapAll(_ flag: Bool) -> Observable { + guard var tmp = currentState.dataSource.first?.items else { + LogManager.printError("playlist datasource is empty") + return .empty() + } + + let count = flag ? tmp.count : 0 + + for i in 0 ..< tmp.count { + tmp[i].isSelected = flag + } + + return .concat( + .just(.updateDataSource([MyPlayListSectionModel(model: 0, items: tmp)])), + .just(.updateSelectedItemCount(count)) + ) + } +} + +private extension ListStorageReactor { + func mutateCreatePlaylist(_ title: String) -> Observable { + return Observable.concat( + .just(.updateIsShowActivityIndicator(true)), + createPlaylistUseCase.execute(title: title) + .asObservable() + .withUnretained(self) + .flatMap { owner, _ -> Observable in + NotificationCenter.default.post(name: .willRefreshUserInfo, object: nil) + return .concat( + owner.fetchDataSource(), + .just(.showToast("리스트를 만들었습니다.")) + ) + } + .catch { error in + let error = error.asWMError + return .just(.showToast(error.errorDescription ?? LocalizationStrings.unknownErrorWarning)) + }, + .just(.updateIsShowActivityIndicator(false)) + ) + } + + func mutateDeletePlaylist(_ playlists: [PlaylistEntity]) -> Observable { + let noti = NotificationCenter.default + let subscribedPlaylistKeys = playlists.filter { $0.userId != PreferenceManager.userInfo?.decryptedID } + .map { $0.key } + let ids = playlists.map { $0.key } + return deletePlayListUseCase.execute(ids: ids) + .do(onCompleted: { + noti.post(name: .didRemovedSubscriptionPlaylist, object: subscribedPlaylistKeys, userInfo: nil) + }) + .andThen( + .concat( + fetchDataSource(), + .just(.showToast("\(ids.count)개의 리스트를 삭제했습니다.")) + ) + ) + .catch { error in + let error = error.asWMError + return .concat( + .just(.undoDataSource), + .just(.showToast(error.errorDescription ?? LocalizationStrings.unknownErrorWarning)) + ) + } + } + + func mutateEditPlayListOrder() -> Observable { + let currentDataSource = currentState.dataSource + let playlistOrder = currentDataSource.flatMap { $0.items.map { $0.key } } + return editPlayListOrderUseCase.execute(ids: playlistOrder) + .andThen( + .concat( + .just(Mutation.updateBackupDataSource(currentDataSource)) + ) + ) + .catch { error in + let error = error.asWMError + return Observable.concat([ + .just(.undoDataSource), + .just(.showToast(error.errorDescription ?? LocalizationStrings.unknownErrorWarning)) + ]) + } + } + + func mutateFetchPlaylistCreationPrice() -> Observable { + return Observable.concat( + .just(.updateIsShowActivityIndicator(true)), + fetchPlaylistCreationPriceUseCase.execute() + .asObservable() + .map { $0.price } + .flatMap { price -> Observable in + guard let userItemCount = PreferenceManager.userInfo?.itemCount else { + return .just(.showToast(LocalizationStrings.unknownErrorWarning)) + } + if userItemCount < price { + return .just(.showToast(LocalizationStrings.lackOfMoney(price - userItemCount))) + } + return .just(.showCreatePricePopup(price)) + } + .catch { error in + let error = error.asWMError + return .just(.showToast(error.errorDescription ?? LocalizationStrings.unknownErrorWarning)) + }, + .just(.updateIsShowActivityIndicator(false)) + ) + } +} diff --git a/Projects/Features/StorageFeature/Sources/Reactors/StorageReactor.swift b/Projects/Features/StorageFeature/Sources/Reactors/StorageReactor.swift new file mode 100644 index 000000000..9dd6afd12 --- /dev/null +++ b/Projects/Features/StorageFeature/Sources/Reactors/StorageReactor.swift @@ -0,0 +1,111 @@ +import Foundation +import LogManager +import ReactorKit +import UserDomainInterface +import Utility + +final class StorageReactor: Reactor { + enum Action { + case viewDidLoad + case switchTab(Int) + case editButtonDidTap + case saveButtonTap + } + + enum Mutation { + case updateIsLoggedIn(Bool) + case switchTabIndex(Int) + case switchEditingState(Bool) + case showLoginAlert(CommonAnalyticsLog.LoginButtonEntry) + } + + struct State { + var isLoggedIn: Bool + var isEditing: Bool + var tabIndex: Int + @Pulse var showLoginAlert: CommonAnalyticsLog.LoginButtonEntry? + } + + let initialState: State + private var disposeBag = DisposeBag() + private let storageCommonService: any StorageCommonService + + init( + storageCommonService: any StorageCommonService + ) { + initialState = State( + isLoggedIn: false, + isEditing: false, + tabIndex: 0 + ) + self.storageCommonService = storageCommonService + } + + func mutate(action: Action) -> Observable { + switch action { + case .viewDidLoad: + return viewDidLoad() + case let .switchTab(index): + return switchTabIndex(index) + case .editButtonDidTap: + if currentState.isLoggedIn { + storageCommonService.isEditingState.onNext(true) + return switchEditingState(true) + } else { + return .just(.showLoginAlert(.myPlaylist)) + } + case .saveButtonTap: + storageCommonService.isEditingState.onNext(false) + return switchEditingState(false) + } + } + + func transform(mutation: Observable) -> Observable { + let switchEditingStateMutation = storageCommonService.isEditingState + .map { Mutation.switchEditingState($0) } + + let updateIsLoggedInMutation = storageCommonService.loginStateDidChangedEvent + .flatMap { userID -> Observable in + let isLoggedIn = userID != nil + return .just(.updateIsLoggedIn(isLoggedIn)) + } + + return Observable.merge( + mutation, + switchEditingStateMutation, + updateIsLoggedInMutation + ) + } + + func reduce(state: State, mutation: Mutation) -> State { + var newState = state + + switch mutation { + case let .switchTabIndex(index): + newState.tabIndex = index + case let .switchEditingState(flag): + newState.isEditing = flag + case let .showLoginAlert(entry): + newState.showLoginAlert = entry + case let .updateIsLoggedIn(isLoggedIn): + newState.isLoggedIn = isLoggedIn + } + + return newState + } +} + +private extension StorageReactor { + func viewDidLoad() -> Observable { + let isLoggedIn = PreferenceManager.userInfo != nil + return .just(.updateIsLoggedIn(isLoggedIn)) + } + + func switchTabIndex(_ index: Int) -> Observable { + return .just(.switchTabIndex(index)) + } + + func switchEditingState(_ flag: Bool) -> Observable { + return .just(.switchEditingState(flag)) + } +} diff --git a/Projects/Features/StorageFeature/Sources/Service/StorageCommonService.swift b/Projects/Features/StorageFeature/Sources/Service/StorageCommonService.swift new file mode 100644 index 000000000..13fd28f04 --- /dev/null +++ b/Projects/Features/StorageFeature/Sources/Service/StorageCommonService.swift @@ -0,0 +1,27 @@ +import Foundation +import RxSwift +import Utility + +protocol StorageCommonService { + var isEditingState: BehaviorSubject { get } + var loginStateDidChangedEvent: Observable { get } + var playlistRefreshEvent: Observable { get } + var likeListRefreshEvent: Observable { get } +} + +final class DefaultStorageCommonService: StorageCommonService { + static let shared = DefaultStorageCommonService() + + let isEditingState: BehaviorSubject + let loginStateDidChangedEvent: Observable + let playlistRefreshEvent: Observable + let likeListRefreshEvent: Observable + + init() { + let notificationCenter = NotificationCenter.default + isEditingState = .init(value: false) + loginStateDidChangedEvent = PreferenceManager.$userInfo.map(\.?.ID).distinctUntilChanged().skip(1) + playlistRefreshEvent = notificationCenter.rx.notification(.shouldRefreshPlaylist) + likeListRefreshEvent = notificationCenter.rx.notification(.shouldRefreshLikeList).map { _ in () } + } +} diff --git a/Projects/Features/StorageFeature/Sources/ViewControllers/AfterLoginViewController.swift b/Projects/Features/StorageFeature/Sources/ViewControllers/AfterLoginViewController.swift deleted file mode 100644 index 86062869d..000000000 --- a/Projects/Features/StorageFeature/Sources/ViewControllers/AfterLoginViewController.swift +++ /dev/null @@ -1,327 +0,0 @@ -// -// AfterLoginViewController.swift -// StorageFeature -// -// Created by yongbeomkwak on 2023/01/26. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import Utility -import DesignSystem -import Pageboy -import Tabman -import RxSwift -import PanModal -import CommonFeature -import KeychainModule -import DataMappingModule -import BaseFeature - -public final class AfterLoginViewController: TabmanViewController, ViewControllerFromStoryBoard, EditSheetViewType { - - @IBOutlet weak var profileLabel: UILabel! - @IBOutlet weak var logoutButton: UIButton! - @IBOutlet weak var requestButton: UIButton! - @IBOutlet weak var tabBarView: UIView! - @IBOutlet weak var editButton: UIButton! - @IBOutlet weak var profileImageView: UIImageView! - @IBOutlet weak var profileButton: UIButton! - @IBOutlet weak var headerFakeView: UIView! - @IBOutlet weak var myPlayListFakeView: UIView! - @IBOutlet weak var favoriteFakeView: UIView! - - @IBAction func pressRequestAction(_ sender: UIButton) { - let viewController = requestComponent.makeView() - self.navigationController?.pushViewController(viewController, animated: true) - } - - @IBAction func pressLogoutAction(_ sender: UIButton) { - let vc = TextPopupViewController.viewController(text:"로그아웃 하시겠습니까?",cancelButtonIsHidden: false, completion: { [weak self] in - guard let self = self else{ - return - } - self.input.pressLogOut.accept(()) - }) - self.showPanModal(content: vc) - } - - public var editSheetView: EditSheetView! - public var bottomSheetView: BottomSheetView! - private var viewControllers: [UIViewController] = [UIViewController(),UIViewController()] - - var requestComponent:RequestComponent! - var profilePopComponent: ProfilePopComponent! - var myPlayListComponent: MyPlayListComponent! - var multiPurposePopComponent : MultiPurposePopComponent! - var favoriteComponent: FavoriteComponent! - - var viewModel:AfterLoginViewModel! - lazy var input = AfterLoginViewModel.Input() - lazy var output = viewModel.transform(from: input) - let disposeBag = DisposeBag() - - public override func viewDidLoad() { - super.viewDidLoad() - configureUI() - bindRx() - bindEditButtonVisable() - } - - public override func viewWillDisappear(_ animated: Bool) { - super.viewWillDisappear(animated) - self.hideEditSheet() - self.profileButton.isSelected = false - } - - //탭맨 페이지 변경 감지 함수 - public override func pageboyViewController(_ pageboyViewController: PageboyViewController, didScrollToPageAt index: TabmanViewController.PageIndex, direction: PageboyViewController.NavigationDirection, animated: Bool) { - - let state = EditState(isEditing: false, force: true) - - if index == 0 { - guard let vc1 = self.viewControllers[0] as? MyPlayListViewController else{ - return - } - vc1.output.state.accept(state) // 이제 돌아오는 곳을 편집 전 으로 , 이게 밑에 bindEditButtonVisable() 에 연관 됨 - editButton.isHidden = (vc1.output.dataSource.value.first?.items ?? []).isEmpty - - }else { - guard let vc2 = self.viewControllers[1] as? FavoriteViewController else{ - return - } - vc2.output.state.accept(state) - editButton.isHidden = (vc2.output.dataSource.value.first?.items ?? []).isEmpty - } - output.state.accept(state) - } - - public static func viewController( - viewModel:AfterLoginViewModel, - requestComponent:RequestComponent, - profilePopComponent: ProfilePopComponent, - myPlayListComponent: MyPlayListComponent, - multiPurposePopComponent : MultiPurposePopComponent, - favoriteComponent : FavoriteComponent - ) -> AfterLoginViewController { - let viewController = AfterLoginViewController.viewController(storyBoardName: "Storage", bundle: Bundle.module) - viewController.viewModel = viewModel - viewController.requestComponent = requestComponent - viewController.profilePopComponent = profilePopComponent - viewController.myPlayListComponent = myPlayListComponent - viewController.multiPurposePopComponent = multiPurposePopComponent - viewController.favoriteComponent = favoriteComponent - viewController.viewControllers = [myPlayListComponent.makeView(),favoriteComponent.makeView()] - return viewController - } -} - -extension AfterLoginViewController{ - private func bindRx(){ - output.state.subscribe { [weak self] state in - guard let self = self else{ - return - } - - let attr = NSMutableAttributedString(string: state.isEditing ? "완료" : "편집", - attributes: [.font: DesignSystemFontFamily.Pretendard.bold.font(size: 12), - .foregroundColor: state.isEditing ? DesignSystemAsset.PrimaryColor.point.color : DesignSystemAsset.GrayColor.gray400.color ]) - self.editButton.layer.borderColor = state.isEditing ? DesignSystemAsset.PrimaryColor.point.color.cgColor : DesignSystemAsset.GrayColor.gray300.color.cgColor - self.editButton.setAttributedTitle(attr, for: .normal) - self.isScrollEnabled = !state.isEditing // 편집 시 , 옆 탭으로 swipe를 막기 위함 - self.headerFakeView.isHidden = !state.isEditing - - if state.isEditing { - self.myPlayListFakeView.isHidden = self.currentIndex == 0 - self.favoriteFakeView.isHidden = self.currentIndex == 1 - }else { - self.myPlayListFakeView.isHidden = true - self.favoriteFakeView.isHidden = true - } - }.disposed(by: disposeBag) - - editButton.rx.tap - .withLatestFrom(output.state) - .map({EditState(isEditing: !$0.isEditing, force: $0.force)}) - .do(onNext: { [weak self] (state:EditState) in - guard let self = self else{ - return - } - - //프로필 편집 팝업을 띄운 상태에서 리스트 편집 시 > 프로필 편집 팝업을 제거 - if self.editSheetView != nil { - self.hideEditSheet() - } - - let nextState = EditState(isEditing: state.isEditing, force: false) - - if self.currentIndex ?? 0 == 0 { - guard let vc = self.viewControllers[0] as? MyPlayListViewController else{ - return - } - vc.output.state.accept(nextState) - }else{ - guard let vc = self.viewControllers[1] as? FavoriteViewController else{ - return - } - vc.output.state.accept(nextState) - } - }) - .bind(to: output.state) - .disposed(by: disposeBag) - - profileButton.rx.tap.subscribe(onNext: { [weak self] in - guard let self = self else{ return } - self.profileButton.isSelected = !self.profileButton.isSelected - - if self.profileButton.isSelected { - self.showEditSheet(in: self.view, type: .profile) - self.editSheetView.delegate = self - }else{ - self.hideEditSheet() - } - }).disposed(by: disposeBag) - - Utility.PreferenceManager.$userInfo - .debug("$userInfo") - .filter { $0 != nil } - .subscribe(onNext: { [weak self] (model) in - guard let self = self, let model = model else { - return - } - self.profileLabel.text = AES256.decrypt(encoded: model.displayName).correctionNickName - self.profileImageView.kf.setImage( - with: URL(string: WMImageAPI.fetchProfile(name: model.profile,version: model.version).toString), - placeholder: nil, - options: [.transition(.fade(0.2))] - ) - }).disposed(by: disposeBag) - } - - func bindEditButtonVisable(){ - guard let vc1 = self.viewControllers[0] as? MyPlayListViewController else{ - return - } - guard let vc2 = self.viewControllers[1] as? FavoriteViewController else{ - return - } - - vc1.output.dataSource - .skip(1) - .filter{ [weak self] _ in - guard let self = self else { return false } - return (self.currentIndex ?? 0) == 0 - } - .map { ($0.first?.items ?? []).isEmpty } - .bind(to: editButton.rx.isHidden) - .disposed(by: disposeBag) - - vc2.output.dataSource - .skip(1) - .filter{ [weak self] _ in - guard let self = self else { return false } - return (self.currentIndex ?? 0) == 1 - } - .map { ($0.first?.items ?? []).isEmpty } - .bind(to: editButton.rx.isHidden) - .disposed(by: disposeBag) - } - - private func configureUI(){ - profileImageView.layer.cornerRadius = 20 - profileLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) - - logoutButton.setImage(DesignSystemAsset.Storage.logout.image, for: .normal) - requestButton.setImage(DesignSystemAsset.Storage.request.image, for: .normal) - - editButton.layer.cornerRadius = 4 - editButton.layer.borderWidth = 1 - editButton.backgroundColor = .clear - editButton.isHidden = true - - myPlayListFakeView.isHidden = true - favoriteFakeView.isHidden = true - - //탭바 설정 - self.dataSource = self - let bar = TMBar.ButtonBar() - - // 배경색 - bar.backgroundView.style = .flat(color: .clear) - - // 간격 설정 - bar.layout.contentInset = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20) - bar.layout.contentMode = .intrinsic - bar.layout.transitionStyle = .progressive - - // 버튼 글씨 커스텀 - bar.buttons.customize { (button) in - button.tintColor = DesignSystemAsset.GrayColor.gray400.color - button.selectedTintColor = DesignSystemAsset.GrayColor.gray900.color - button.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) - button.selectedFont = DesignSystemFontFamily.Pretendard.bold.font(size: 16) - } - - // indicator - bar.indicator.weight = .custom(value: 3) - bar.indicator.tintColor = DesignSystemAsset.PrimaryColor.point.color - bar.indicator.overscrollBehavior = .compress - addBar(bar, dataSource: self, at: .custom(view: tabBarView, layout: nil)) - bar.layer.addBorder([.bottom], color:DesignSystemAsset.GrayColor.gray300.color.withAlphaComponent(0.4), height: 1) - } -} - -extension AfterLoginViewController:EditSheetViewDelegate { - public func buttonTapped(type: EditSheetSelectType) { - switch type { - case .profile: - let profile = self.profilePopComponent.makeView() - self.showPanModal(content: profile) - case .nickname: - let nickname = self.multiPurposePopComponent.makeView(type: .nickname) - self.showEntryKitModal(content: nickname, height: 296) - default: - return - } - self.hideEditSheet() - self.profileButton.isSelected = false - } -} - -extension AfterLoginViewController:PageboyViewControllerDataSource, TMBarDataSource { - public func numberOfViewControllers(in pageboyViewController: Pageboy.PageboyViewController) -> Int { - self.viewControllers.count - } - - public func viewController(for pageboyViewController: Pageboy.PageboyViewController, at index: Pageboy.PageboyViewController.PageIndex) -> UIViewController? { - viewControllers[index] - } - - public func defaultPage(for pageboyViewController: Pageboy.PageboyViewController) -> Pageboy.PageboyViewController.Page? { - nil - } - - public func barItem(for bar: Tabman.TMBar, at index: Int) -> Tabman.TMBarItemable { - switch index{ - case 0: - return TMBarItem(title: "내 리스트") - case 1: - return TMBarItem(title: "좋아요") - default: - let title = "Page \(index)" - return TMBarItem(title: title) - } - } -} - -extension AfterLoginViewController { - func scrollToTop() { - let current: Int = self.currentIndex ?? 0 - guard self.viewControllers.count > current else { return } - if let myPlayList = self.viewControllers[current] as? MyPlayListViewController { - myPlayList.scrollToTop() - }else if let favorite = self.viewControllers[current] as? FavoriteViewController { - favorite.scrollToTop() - } - } -} diff --git a/Projects/Features/StorageFeature/Sources/ViewControllers/AskSongViewController.swift b/Projects/Features/StorageFeature/Sources/ViewControllers/AskSongViewController.swift deleted file mode 100644 index d5bb0d088..000000000 --- a/Projects/Features/StorageFeature/Sources/ViewControllers/AskSongViewController.swift +++ /dev/null @@ -1,409 +0,0 @@ -// -// SuggestFunctionViewController.swift -// StorageFeature -// -// Created by yongbeomkwak on 2023/03/05. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import Utility -import DesignSystem -import RxSwift -import RxKeyboard -import CommonFeature -import SafariServices - -public final class AskSongViewController: UIViewController,ViewControllerFromStoryBoard { - - @IBOutlet weak var titleLabel: UILabel! - @IBOutlet weak var closeButton: UIButton! - @IBOutlet weak var scrollView: UIScrollView! - - @IBOutlet weak var explainContentView1: UIView! - @IBOutlet weak var dotLabel1: UILabel! - @IBOutlet weak var explainLabel1: UILabel! - - @IBOutlet weak var explainContentView2: UIView! - @IBOutlet weak var dotLabel2: UILabel! - @IBOutlet weak var explainLabel2: UILabel! - - @IBOutlet weak var redirectWebContentView: UIView! - @IBOutlet weak var redirectWebButton: UIButton! - - @IBOutlet weak var descriptionLabel1: UILabel! - @IBOutlet weak var textField1: UITextField! - @IBOutlet weak var baseLine1: UIView! - - @IBOutlet weak var descriptionLabel2: UILabel! - @IBOutlet weak var textField2: UITextField! - @IBOutlet weak var baseLine2: UIView! - - @IBOutlet weak var textField3: UITextField! - @IBOutlet weak var descriptionLabel3: UILabel! - @IBOutlet weak var baseLine3: UIView! - - @IBOutlet weak var textView: GrowingTextView! - @IBOutlet weak var descriptionLabel4: UILabel! - @IBOutlet weak var baseLine4: UIView! - @IBOutlet weak var fakeView: UIView! - - @IBOutlet weak var previousButton: UIButton! - @IBOutlet weak var completionButton: UIButton! - @IBOutlet weak var lastBaseLineBottomConstraint: NSLayoutConstraint! - - let unPointColor:UIColor = DesignSystemAsset.GrayColor.gray200.color - let pointColor:UIColor = DesignSystemAsset.PrimaryColor.decrease.color - let placeHolder:String = "내 답변" - - let placeHolderAttributes = [ - NSAttributedString.Key.foregroundColor: DesignSystemAsset.GrayColor.gray400.color, - NSAttributedString.Key.font : DesignSystemFontFamily.Pretendard.medium.font(size: 16) - ] // 포커싱 플레이스홀더 폰트 및 color 설정 - - let disposeBag = DisposeBag() - - var viewModel:AskSongViewModel! - lazy var input = AskSongViewModel.Input() - lazy var output = viewModel.transform(from: input) - var keyboardHeight:CGFloat = 267 - - public override func viewDidLoad() { - super.viewDidLoad() - - configureUI() - configureHeaderUI() - hideKeyboardWhenTappedAround() - bindRx() - bindbuttonEvent() - responseViewbyKeyboard() - } - - public static func viewController(viewModel: AskSongViewModel) -> AskSongViewController { - let viewController = AskSongViewController.viewController(storyBoardName: "Storage", bundle: Bundle.module) - viewController.viewModel = viewModel - return viewController - } -} - -extension AskSongViewController { - private func configureHeaderUI() { - let explain1 = "이세돌 분들이 부르신걸 이파리분들이 개인소장용으로 일부공개한 영상을 올리길 원하시면 ‘은수저’님에게 왁물원 채팅으로 부탁드립니다." - let explain2 = "왁뮤에 들어갈 수 있는 기준을 충족하는지 꼭 확인하시고 추가 요청해 주세요." - let explain3 = "조회수가 이상한 경우는 반응 영상이 포함되어 있을 수 있습니다." - - dotLabel1.layer.cornerRadius = 2 - dotLabel1.clipsToBounds = true - dotLabel1.backgroundColor = DesignSystemAsset.GrayColor.gray400.color - - dotLabel2.layer.cornerRadius = 2 - dotLabel2.clipsToBounds = true - dotLabel2.backgroundColor = DesignSystemAsset.GrayColor.gray400.color - - redirectWebButton.setImage(DesignSystemAsset.Storage.blueArrowRight.image, for: .normal) - redirectWebButton.setAttributedTitle(NSMutableAttributedString( - string: "왁뮤 노래 포함 기준", - attributes: [.font: DesignSystemFontFamily.Pretendard.medium.font(size: 12), - .foregroundColor: DesignSystemAsset.PrimaryColor.decrease.color, - .kern: -0.5] - ), for: .normal - ) - - titleLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) - titleLabel.textColor = DesignSystemAsset.GrayColor.gray900.color - titleLabel.text = viewModel.type == .add ? "노래 추가" : "노래 수정" - titleLabel.setTextWithAttributes(kernValue: -0.5) - - let style = NSMutableParagraphStyle() - style.lineHeightMultiple = 1.35 - - explainLabel1.attributedText = NSMutableAttributedString( - string: viewModel.type == .add ? explain1 : explain3, - attributes: [.font: DesignSystemFontFamily.Pretendard.light.font(size: 12), - .foregroundColor: DesignSystemAsset.GrayColor.gray500.color, - .kern: -0.5, - .paragraphStyle: style] - ) - - explainLabel2.attributedText = NSMutableAttributedString( - string: explain2, - attributes: [.font: DesignSystemFontFamily.Pretendard.light.font(size: 12), - .foregroundColor: DesignSystemAsset.GrayColor.gray500.color, - .kern: -0.5, - .paragraphStyle: style] - ) - - explainContentView2.isHidden = viewModel.type == .update - redirectWebContentView.isHidden = viewModel.type == .update - } - - private func configureUI(){ - let descriptionLabels: [UILabel] = [descriptionLabel1,descriptionLabel2,descriptionLabel3,descriptionLabel4] - let textFields: [UITextField] = [textField1,textField2,textField3] - let baseLines: [UIView] = [baseLine1,baseLine2,baseLine3,baseLine4] - - for i in 0..<4 { - var title:String = "" - - switch i { - case 0 : - title = "아티스트" - case 1 : - title = "노래 제목" - case 2 : - title = "유튜브 링크" - case 3 : - title = "내용" - default : - return - } - - descriptionLabels[i].text = title - descriptionLabels[i].font = DesignSystemFontFamily.Pretendard.medium.font(size: 18) - descriptionLabels[i].textColor = DesignSystemAsset.GrayColor.gray900.color - descriptionLabels[i].setTextWithAttributes(kernValue: -0.5) - - if i < 3 { - textFields[i].attributedPlaceholder = NSAttributedString(string: placeHolder,attributes:placeHolderAttributes) //플레이스 홀더 설정 - textFields[i].font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) - textFields[i].textColor = DesignSystemAsset.GrayColor.gray600.color - } - baseLines[i].backgroundColor = unPointColor - } - - scrollView.delegate = self - textView.delegate = self - textView.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) - textView.placeholder = placeHolder - textView.placeholderColor = DesignSystemAsset.GrayColor.gray400.color - textView.textColor = DesignSystemAsset.GrayColor.gray600.color - textView.minHeight = 32.0 - textView.maxHeight = spaceHeight() - - closeButton.setImage(DesignSystemAsset.Navigation.crossClose.image, for: .normal) - self.completionButton.layer.cornerRadius = 12 - self.completionButton.clipsToBounds = true - self.completionButton.isEnabled = false - self.completionButton.setBackgroundColor(DesignSystemAsset.PrimaryColor.point.color, for: .normal) - self.completionButton.setBackgroundColor(DesignSystemAsset.GrayColor.gray300.color, for: .disabled) - self.completionButton.setAttributedTitle(NSMutableAttributedString(string: "완료", - attributes: [.font: DesignSystemFontFamily.Pretendard.medium.font(size: 18), - .foregroundColor: DesignSystemAsset.GrayColor.gray25.color, - .kern: -0.5]), for: .normal) - - self.previousButton.layer.cornerRadius = 12 - self.previousButton.clipsToBounds = true - self.previousButton.setBackgroundColor(DesignSystemAsset.GrayColor.gray400.color, for: .normal) - self.previousButton.setAttributedTitle(NSMutableAttributedString(string: "이전", - attributes: [.font: DesignSystemFontFamily.Pretendard.medium.font(size: 18), - .foregroundColor: DesignSystemAsset.GrayColor.gray25.color, - .kern: -0.5]), for: .normal) - } - - private func bindbuttonEvent(){ - previousButton.rx.tap.subscribe(onNext: { [weak self] in - guard let self = self else{ - return - } - self.navigationController?.popViewController(animated: true) - }) - .disposed(by: disposeBag) - - closeButton.rx.tap.subscribe(onNext: { [weak self] in - guard let self = self else{ - return - } - self.dismiss(animated: true) - }) - .disposed(by: disposeBag) - - completionButton.rx.tap - .subscribe(onNext: { [weak self] in - guard let self else {return} - let vc = TextPopupViewController.viewController( - text: "작성하신 내용을 등록하시겠습니까?", - cancelButtonIsHidden: false, - completion: { [weak self] in - self?.input.completionButtonTapped.onNext(()) - } - ) - self.showPanModal(content: vc) - }) - .disposed(by: disposeBag) - - redirectWebButton.rx.tap - .subscribe(onNext: { [weak self] () in - guard let URL = URL(string: "https://whimsical.com/E3GQxrTaafVVBrhm55BNBS") else { return } - let safari = SFSafariViewController(url: URL) - self?.present(safari, animated: true) - }) - .disposed(by: disposeBag) - } - - private func bindRx(){ - textField1.rx.text.orEmpty - .distinctUntilChanged() - .bind(to: input.artistString) - .disposed(by: disposeBag) - - textField2.rx.text.orEmpty - .distinctUntilChanged() - .bind(to: input.songTitleString) - .disposed(by: disposeBag) - - textField3.rx.text.orEmpty - .distinctUntilChanged() - .bind(to: input.youtubeString) - .disposed(by: disposeBag) - - textView.rx.text.orEmpty - .distinctUntilChanged() // 연달아 같은 값이 이어질 때 중복된 값을 막아줍니다 - .bind(to: input.contentString) - .disposed(by: disposeBag) - - let tfEditingDidBegin1 = textField1.rx.controlEvent(.editingDidBegin) - let tfEditingDidEnd1 = textField1.rx.controlEvent(.editingDidEnd) - - let mergeObservable1 = Observable.merge(tfEditingDidBegin1.map { UIControl.Event.editingDidBegin }, - tfEditingDidEnd1.map { UIControl.Event.editingDidEnd }) - - let tfEditingDidBegin2 = textField2.rx.controlEvent(.editingDidBegin) - let tfEditingDidEnd2 = textField2.rx.controlEvent(.editingDidEnd) - - let mergeObservable2 = Observable.merge(tfEditingDidBegin2.map { UIControl.Event.editingDidBegin }, - tfEditingDidEnd2.map { UIControl.Event.editingDidEnd }) - - let tfEditingDidBegin3 = textField3.rx.controlEvent(.editingDidBegin) - let tfEditingDidEnd3 = textField3.rx.controlEvent(.editingDidEnd) - - let mergeObservable3 = Observable.merge(tfEditingDidBegin3.map { UIControl.Event.editingDidBegin }, - tfEditingDidEnd3.map { UIControl.Event.editingDidEnd }) - - mergeObservable1 - .asObservable() - .subscribe(onNext: { [weak self] (event) in - guard let self = self else{ - return - } - - if event == .editingDidBegin { - self.baseLine1.backgroundColor = self.pointColor - self.scrollView.scrollToView(view: UIView(frame: .zero)) - } - else { - self.baseLine1.backgroundColor = self.unPointColor - } - }) - .disposed(by: disposeBag) - - mergeObservable2 - .asObservable() - .subscribe(onNext: { [weak self] (event) in - guard let self = self else{ - return - } - if event == .editingDidBegin { - self.baseLine2.backgroundColor = self.pointColor - self.scrollView.scrollToView(view: self.descriptionLabel1) - } - else { - self.baseLine2.backgroundColor = self.unPointColor - } - }) - .disposed(by: disposeBag) - - mergeObservable3 - .asObservable() - .subscribe(onNext: { [weak self] (event) in - guard let self = self else{ - return - } - if event == .editingDidBegin { - self.baseLine3.backgroundColor = self.pointColor - self.scrollView.scrollToView(view: self.descriptionLabel2) - } - else { - self.baseLine3.backgroundColor = self.unPointColor - } - }) - .disposed(by: disposeBag) - - output.enableCompleteButton - .bind(to: completionButton.rx.isEnabled) - .disposed(by: disposeBag) - - output.result.subscribe(onNext: { [weak self] res in - guard let self else {return} - let vc = TextPopupViewController.viewController( - text: res.message ?? "오류가 발생했습니다.", - cancelButtonIsHidden: true, - completion: { - self.dismiss(animated: true) - } - ) - self.showPanModal(content: vc) - }) - .disposed(by: disposeBag) - } - - private func responseViewbyKeyboard(){ - RxKeyboard.instance.visibleHeight - .drive(onNext: { [weak self] keyboardVisibleHeight in - guard let self = self else {return} - let safeAreaInsetsBottom: CGFloat = UIApplication.shared.windows.first?.safeAreaInsets.bottom ?? 0 - let actualKeyboardHeight = max(0, keyboardVisibleHeight - safeAreaInsetsBottom) - self.keyboardHeight = actualKeyboardHeight == .zero ? self.keyboardHeight : 300 - self.view.setNeedsLayout() - - UIView.animate(withDuration: 0, animations: { - self.scrollView.contentInset.bottom = actualKeyboardHeight - self.scrollView.verticalScrollIndicatorInsets.bottom = actualKeyboardHeight - self.view.layoutIfNeeded() - }) - }).disposed(by: disposeBag) - } - - func spaceHeight() -> CGFloat { - return 16 * 5 - } -} - -extension AskSongViewController: UIScrollViewDelegate { - - public func scrollViewDidScroll(_ scrollView: UIScrollView) { - - scrollView.bounces = scrollView.contentOffset.y > 0 - } -// - - -} - -extension AskSongViewController : UITextViewDelegate { - - - - public func textViewDidBeginEditing(_ textView: UITextView) { - - if scrollView.contentOffset.y == 0 { - self.scrollView.scroll(to: .bottom) - } - - self.baseLine4.backgroundColor = self.pointColor - self.view.layoutIfNeeded() - - } - - public func textViewDidEndEditing(_ textView: UITextView) { - - if scrollView.contentOffset.y == 0 { - self.scrollView.scroll(to: .bottom) - } - - self.baseLine4.backgroundColor = self.unPointColor - self.view.layoutIfNeeded() - } - -} - - diff --git a/Projects/Features/StorageFeature/Sources/ViewControllers/BugReportViewController.swift b/Projects/Features/StorageFeature/Sources/ViewControllers/BugReportViewController.swift deleted file mode 100644 index a656b5802..000000000 --- a/Projects/Features/StorageFeature/Sources/ViewControllers/BugReportViewController.swift +++ /dev/null @@ -1,549 +0,0 @@ -// -// SuggestFunctionViewController.swift -// StorageFeature -// -// Created by yongbeomkwak on 2023/03/05. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import Utility -import DesignSystem -import RxSwift -import RxKeyboard -import CommonFeature -import SafariServices -import BaseFeature -import PhotosUI -//import Amplify -import Combine -import NVActivityIndicatorView - -public final class BugReportViewController: UIViewController,ViewControllerFromStoryBoard { - - @IBOutlet weak var titleLabel: UILabel! - @IBOutlet weak var closeButton: UIButton! - @IBOutlet weak var scrollView: UIScrollView! - - @IBOutlet weak var textView: GrowingTextView! - @IBOutlet weak var descriptionLabel1: UILabel! - @IBOutlet weak var baseLine1: UIView! - - @IBOutlet weak var descriptionLabel2: UILabel! - @IBOutlet weak var collectionContentView: UIView! - @IBOutlet weak var collectionView: UICollectionView! - - @IBOutlet weak var attachContentView: UIView! - @IBOutlet weak var attachLabel: UILabel! - @IBOutlet weak var cameraImageView: UIImageView! - @IBOutlet weak var cameraButton: UIButton! - - @IBOutlet weak var descriptionLabel3: UILabel! - - @IBOutlet weak var noticeCheckButton: UIButton! - @IBOutlet weak var noticeSuperView: UIView! - @IBOutlet weak var noticeLabel: UILabel! - @IBOutlet weak var noticeImageView: UIImageView! - - @IBOutlet weak var nickNameContentView: UIView! - @IBOutlet weak var textField: UITextField! - @IBOutlet weak var baseLine2: UIView! - - @IBOutlet weak var dotLabel: UILabel! - @IBOutlet weak var infoLabel: UILabel! - - @IBOutlet weak var previousButton: UIButton! - @IBOutlet weak var completionButton: UIButton! - @IBOutlet weak var loadingView: UIView! - @IBOutlet weak var indicator: NVActivityIndicatorView! - @IBOutlet weak var loadingLabel: UILabel! - - let unPointColor:UIColor = DesignSystemAsset.GrayColor.gray200.color - let pointColor:UIColor = DesignSystemAsset.PrimaryColor.decrease.color - let placeHolder:String = "내 답변" - - let placeHolderAttributes = [ - NSAttributedString.Key.foregroundColor: DesignSystemAsset.GrayColor.gray400.color, - NSAttributedString.Key.font : DesignSystemFontFamily.Pretendard.medium.font(size: 16) - ] // 포커싱 플레이스홀더 폰트 및 color 설정 - - let disposeBag = DisposeBag() - - var viewModel:BugReportViewModel! - lazy var input = BugReportViewModel.Input() - lazy var output = viewModel.transform(from: input) - var keyboardHeight:CGFloat = 267 - var maxAttachedSize: Double = 30 - - deinit { - DEBUG_LOG("❌ \(Self.self) Deinit") - } - - public override func viewDidLoad() { - super.viewDidLoad() - - configureUI() - configureCameraButtonUI() - bindRx() - bindbuttonEvent() - responseViewbyKeyboard() - } - - public static func viewController(viewModel: BugReportViewModel) -> BugReportViewController { - let viewController = BugReportViewController.viewController(storyBoardName: "Storage", bundle: Bundle.module) - viewController.viewModel = viewModel - return viewController - } -} - -extension BugReportViewController { - private func configureCameraButtonUI(){ - let pointColor = DesignSystemAsset.PrimaryColor.decrease.color - let cameraAttributedString = NSMutableAttributedString.init(string: "첨부하기") - cameraAttributedString.addAttributes( - [ - .font: DesignSystemFontFamily.Pretendard.medium.font(size: 16), - .foregroundColor: pointColor, - .kern: -0.5 - ], - range: NSRange(location: 0, length: cameraAttributedString.string.count) - ) - attachLabel.attributedText = cameraAttributedString - cameraImageView.image = DesignSystemAsset.Storage.camera.image - - attachContentView.layer.cornerRadius = 12 - attachContentView.layer.borderColor = pointColor.cgColor - attachContentView.layer.borderWidth = 1 - } - - private func configureUI(){ - collectionView.delegate = self - hideKeyboardWhenTappedAround() - - dotLabel.layer.cornerRadius = 2 - dotLabel.clipsToBounds = true - dotLabel.backgroundColor = DesignSystemAsset.GrayColor.gray400.color - - titleLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) - titleLabel.textColor = DesignSystemAsset.GrayColor.gray900.color - titleLabel.text = "버그제보" - titleLabel.setTextWithAttributes(kernValue: -0.5) - - descriptionLabel1.text = "겪으신 버그에 대해 설명해 주세요." - descriptionLabel1.font = DesignSystemFontFamily.Pretendard.medium.font(size: 18) - descriptionLabel1.textColor = DesignSystemAsset.GrayColor.gray900.color - descriptionLabel1.setTextWithAttributes(kernValue: -0.5) - - baseLine1.backgroundColor = unPointColor - baseLine2.backgroundColor = unPointColor - - descriptionLabel2.text = "버그와 관련된 사진이나 영상을 첨부 해주세요." - descriptionLabel2.font = DesignSystemFontFamily.Pretendard.medium.font(size: 18) - descriptionLabel2.textColor = DesignSystemAsset.GrayColor.gray900.color - descriptionLabel2.setTextWithAttributes(kernValue: -0.5) - - descriptionLabel3.text = "왁물원 닉네임을 알려주세요." - descriptionLabel3.font = DesignSystemFontFamily.Pretendard.medium.font(size: 18) - descriptionLabel3.textColor = DesignSystemAsset.GrayColor.gray900.color - descriptionLabel3.setTextWithAttributes(kernValue: -0.5) - - scrollView.delegate = self - textView.delegate = self - textView.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) - textView.placeholder = placeHolder - textView.placeholderColor = DesignSystemAsset.GrayColor.gray400.color - textView.textColor = DesignSystemAsset.GrayColor.gray600.color - textView.minHeight = 32.0 - textView.maxHeight = spaceHeight() - - closeButton.setImage(DesignSystemAsset.Navigation.crossClose.image, for: .normal) - - noticeSuperView.layer.borderWidth = 1 - noticeSuperView.layer.cornerRadius = 12 - noticeSuperView.layer.borderColor = DesignSystemAsset.GrayColor.gray200.color.cgColor - - noticeLabel.text = "알려주기" - noticeLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) - noticeLabel.textColor = DesignSystemAsset.GrayColor.gray400.color - noticeImageView.image = DesignSystemAsset.Navigation.close.image - noticeLabel.setTextWithAttributes(kernValue: -0.5) - - textField.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) - textField.attributedPlaceholder = NSAttributedString(string: placeHolder,attributes:placeHolderAttributes) - textField.textColor = DesignSystemAsset.GrayColor.gray600.color - self.nickNameContentView.isHidden = true - - infoLabel.text = "닉네임을 알려주시면 피드백을 받으시는 데 도움이 됩니다." - infoLabel.font = DesignSystemFontFamily.Pretendard.light.font(size: 12) - infoLabel.textColor = DesignSystemAsset.GrayColor.gray500.color - infoLabel.setTextWithAttributes(kernValue: -0.5) - - self.completionButton.layer.cornerRadius = 12 - self.completionButton.clipsToBounds = true - self.completionButton.isEnabled = false - self.completionButton.setBackgroundColor(DesignSystemAsset.PrimaryColor.point.color, for: .normal) - self.completionButton.setBackgroundColor(DesignSystemAsset.GrayColor.gray300.color, for: .disabled) - self.completionButton.setAttributedTitle(NSMutableAttributedString(string: "완료", - attributes: [.font: DesignSystemFontFamily.Pretendard.medium.font(size: 18), - .foregroundColor: DesignSystemAsset.GrayColor.gray25.color, - .kern: -0.5]), for: .normal) - - self.previousButton.layer.cornerRadius = 12 - self.previousButton.clipsToBounds = true - self.previousButton.setBackgroundColor(DesignSystemAsset.GrayColor.gray400.color, for: .normal) - self.previousButton.setAttributedTitle(NSMutableAttributedString(string: "이전", - attributes: [.font: DesignSystemFontFamily.Pretendard.medium.font(size: 18), - .foregroundColor: DesignSystemAsset.GrayColor.gray25.color, - .kern: -0.5]), for: .normal) - - self.loadingView.isHidden = true - let loadingAttr = NSMutableAttributedString( - string: "처리 중입니다.", - attributes: [ - .font: DesignSystemFontFamily.Pretendard.medium.font(size: 16), - .foregroundColor: DesignSystemAsset.GrayColor.gray25.color, - .kern: -0.5 - ] - ) - self.loadingLabel.attributedText = loadingAttr - self.indicator.type = .circleStrokeSpin - self.indicator.color = UIColor.white - } - - private func bindbuttonEvent(){ - - previousButton.rx.tap.subscribe(onNext: { [weak self] in - guard let self = self else{ - return - } - self.navigationController?.popViewController(animated: true) - }) - .disposed(by: disposeBag) - - closeButton.rx.tap.subscribe(onNext: { [weak self] in - guard let self = self else{ - return - } - self.dismiss(animated: true) - }) - .disposed(by: disposeBag) - - noticeCheckButton.rx.tap - .withLatestFrom(input.publicNameOption) - .subscribe(onNext: { [weak self] (current) in - guard let self = self else { return } - - let vc = NickNamePopupViewController.viewController(current: current.rawValue, completion: { (description) in - let option = PublicNameOption(rawValue: description) ?? .nonDetermined - self.input.publicNameOption.accept(option) - self.nickNameContentView.isHidden = option != .public - - if option != .public { - self.input.nickNameString.accept("") - self.textField.rx.text.onNext("") - } - }) - self.showPanModal(content: vc) - }) - .disposed(by: disposeBag) - - cameraButton.rx.tap - .withLatestFrom(output.dataSource) - .filter{ [weak self] (dataSource) in - guard let self else { return false } - guard dataSource.count < 5 else { - self.showToast( - text: "첨부 파일은 최대 5개 까지 가능합니다.", - font: DesignSystemFontFamily.Pretendard.light.font(size: 14) - ) - return false - } - return true - } - .subscribe(onNext: { [weak self] _ in - guard let self else {return} - let alert = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet) - let library = UIAlertAction(title: "앨범", style: .default) { _ in - self.requestPhotoLibraryPermission() - } - let camera = UIAlertAction(title: "카메라", style: .default) { _ in - self.requestCameraPermission() - } - let cancel = UIAlertAction(title: "취소", style: .cancel, handler: nil) - - alert.addAction(library) - alert.addAction(camera) - alert.addAction(cancel) - self.present(alert, animated: true, completion: nil) - }) - .disposed(by: disposeBag) - - completionButton.rx.tap - .subscribe(onNext: { [weak self] in - guard let self else { return } - let vc = TextPopupViewController.viewController(text: "작성하신 내용을 등록하시겠습니까?", - cancelButtonIsHidden: false, - completion: { [weak self] in - self?.input.completionButtonTapped.onNext(()) - self?.loadingView.isHidden = false - self?.indicator.startAnimating() - }) - self.showPanModal(content: vc) - }) - .disposed(by: disposeBag) - } - - private func bindRx(){ - - textView.rx.text.orEmpty - .distinctUntilChanged() - .bind(to: input.bugContentString) - .disposed(by: disposeBag) - - let tfEditingDidBegin = textField.rx.controlEvent(.editingDidBegin) - let tfEditingDidEnd = textField.rx.controlEvent(.editingDidEnd) - - let mergeObservable = Observable.merge(tfEditingDidBegin.map { UIControl.Event.editingDidBegin }, - tfEditingDidEnd.map { UIControl.Event.editingDidEnd }) - - textField.rx.text.orEmpty - .distinctUntilChanged() - .bind(to: input.nickNameString) - .disposed(by: disposeBag) - - mergeObservable - .asObservable() - .map{ [weak self] (event) -> UIColor in - guard let self = self else { return self?.unPointColor ?? DesignSystemAsset.GrayColor.gray200.color } - return (event == .editingDidBegin) ? self.pointColor : self.unPointColor - } - .bind(to: baseLine2.rx.backgroundColor) - .disposed(by: disposeBag) - - output.showCollectionView - .bind(to: collectionContentView.rx.isHidden) - .disposed(by: disposeBag) - - input.publicNameOption - .do(onNext: { [weak self] (option) in - guard let self = self else { - return - } - self.noticeLabel.textColor = option == .nonDetermined ? DesignSystemAsset.GrayColor.gray400.color : DesignSystemAsset.GrayColor.gray900.color - }) - .map { $0.rawValue } - .bind(to: noticeLabel.rx.text) - .disposed(by: disposeBag) - - output.enableCompleteButton - .bind(to: completionButton.rx.isEnabled) - .disposed(by: disposeBag) - - output.dataSource - .skip(1) - .bind(to: collectionView.rx.items) { [weak self] (collectionView, index, model) -> UICollectionViewCell in - guard let self else { return UICollectionViewCell() } - let indexPath = IndexPath(item: index, section: 0) - guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "BugReportCollectionViewCell", - for: indexPath) as? BugReportCollectionViewCell else { - return UICollectionViewCell() - } - cell.update(model: model,index: indexPath.row) - cell.delegate = self - return cell - }.disposed(by: disposeBag) - - output.result - .observe(on: MainScheduler.instance) - .subscribe(onNext: { [weak self] res in - guard let self else {return} - self.loadingView.isHidden = true - self.indicator.stopAnimating() - - let vc = TextPopupViewController.viewController(text: res.message ?? "오류가 발생했습니다.",cancelButtonIsHidden: true,completion: { - self.dismiss(animated: true) - }) - self.showPanModal(content: vc) - }) - .disposed(by: disposeBag) - - } - - private func responseViewbyKeyboard(){ - - RxKeyboard.instance.visibleHeight - .drive(onNext: { [weak self] keyboardVisibleHeight in - guard let self = self else {return} - let safeAreaInsetsBottom: CGFloat = UIApplication.shared.windows.first?.safeAreaInsets.bottom ?? 0 - let actualKeyboardHeight = max(0, keyboardVisibleHeight - safeAreaInsetsBottom) - self.keyboardHeight = actualKeyboardHeight == .zero ? self.keyboardHeight : 300 - self.view.setNeedsLayout() - - UIView.animate(withDuration: 0, animations: { - self.scrollView.contentInset.bottom = actualKeyboardHeight - self.scrollView.verticalScrollIndicatorInsets.bottom = actualKeyboardHeight - self.view.layoutIfNeeded() - }) - }).disposed(by: disposeBag) - } - - func spaceHeight() -> CGFloat { - return 16 * 10 - } - - private func showToastWithMaxSize() { - let doubleToInt: Int = Int(self.maxAttachedSize) - DispatchQueue.main.async { - self.showToast( - text: "첨부 파일의 용량은 최대 \(doubleToInt)MB 까지입니다.", - font: DesignSystemFontFamily.Pretendard.light.font(size: 14) - ) - } - } -} - -extension BugReportViewController : UITextViewDelegate { - public func textViewDidBeginEditing(_ textView: UITextView) { - self.baseLine1.backgroundColor = self.pointColor - } - - public func textViewDidEndEditing(_ textView: UITextView) { - self.baseLine1.backgroundColor = self.unPointColor - } -} - -extension BugReportViewController: RequestPermissionable { - public func showCamera() { - let camera = UIImagePickerController() - camera.sourceType = .camera - camera.allowsEditing = true - camera.cameraDevice = .rear - camera.cameraCaptureMode = .photo - camera.delegate = self - self.present(camera, animated: true, completion: nil) - } - - public func showPhotoLibrary() { - var configuration = PHPickerConfiguration() - configuration.filter = .any(of: [.images, .videos]) - let current = self.output.dataSource.value - configuration.selectionLimit = 5-current.count // 갯수 제한 - let picker = PHPickerViewController(configuration: configuration) - picker.delegate = self - picker.modalPresentationStyle = .fullScreen - self.present(picker, animated: true) - } -} - -extension BugReportViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate { - public func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { - guard let image = info[UIImagePickerController.InfoKey.editedImage] as? UIImage else { - return - } - - let imageToData: Data = image.pngData() ?? Data() - let sizeMB: Double = Double(imageToData.count).megabytes - guard sizeMB <= self.maxAttachedSize else { - self.showToastWithMaxSize() - return - } - - let curr = self.input.dataSource.value - self.input.dataSource.accept(curr + [MediaDataType.image(data: imageToData)]) - picker.dismiss(animated: true, completion: nil) - } - - public func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { - picker.dismiss(animated: true, completion: nil) - } -} - -extension BugReportViewController: PHPickerViewControllerDelegate { - public func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) { - picker.dismiss(animated: true) - let maxAttachedSize: Double = self.maxAttachedSize - - results.forEach { - let provider = $0.itemProvider - - if provider.hasItemConformingToTypeIdentifier(UTType.movie.identifier) { // 동영상 - provider.loadFileRepresentation(forTypeIdentifier: UTType.movie.identifier) { [weak self] (fileURL, error) in - guard let self = self, let url = fileURL else { return } - - if let error = error { - DEBUG_LOG("error: \(error)") - - }else{ - DispatchQueue.global(qos: .userInteractive).async { - do { - let data = try Data(contentsOf: url) - DEBUG_LOG("Video: \(data)") - let sizeMB: Double = Double(data.count).megabytes - guard sizeMB <= maxAttachedSize else { - self.showToastWithMaxSize() - return - } - DispatchQueue.main.async { - let curr = self.input.dataSource.value - self.input.dataSource.accept(curr + [MediaDataType.video(data: data, url: url)]) - } - }catch let error { - DEBUG_LOG("error: \(error)") - } - } - } - } - }else if provider.canLoadObject(ofClass: UIImage.self) { // 이미지 - - provider.loadObject(ofClass: UIImage.self) { [weak self] (image, error) in - guard let self = self else { return } - if let error = error { - DEBUG_LOG("error: \(error)") - - }else{ - DispatchQueue.main.async { - guard let image = image as? UIImage, - let imageToData = image.pngData() else { return } - DEBUG_LOG("Image: \(imageToData)") - let sizeMB: Double = Double(imageToData.count).megabytes - guard sizeMB <= maxAttachedSize else { - self.showToastWithMaxSize() - return - } - let curr = self.input.dataSource.value - self.input.dataSource.accept(curr + [MediaDataType.image(data: imageToData)]) - } - } - } - } - } - } -} - -extension BugReportViewController: UICollectionViewDelegate, UICollectionViewDelegateFlowLayout{ - public func collectionView( - _ collectionView: UICollectionView, - layout collectionViewLayout: UICollectionViewLayout, - sizeForItemAt indexPath: IndexPath - ) -> CGSize { - return CGSize(width: 80.0, height: 80.0) - } - - public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets { - return UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 20) //오른쪽 끝까지 왔을 때 , 벽에서 20 만큼 떨어짐 - } - - public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat { - return 4.0 - } - - public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { - return 4.0 - } -} - -extension BugReportViewController:BugReportCollectionViewCellDelegate { - func tapRemove(index: Int) { - self.input.removeIndex.accept(index) - } -} diff --git a/Projects/Features/StorageFeature/Sources/ViewControllers/FavoriteViewController.swift b/Projects/Features/StorageFeature/Sources/ViewControllers/FavoriteViewController.swift deleted file mode 100644 index 54943ea96..000000000 --- a/Projects/Features/StorageFeature/Sources/ViewControllers/FavoriteViewController.swift +++ /dev/null @@ -1,281 +0,0 @@ -// -// FavoriteViewController.swift -// StorageFeature -// -// Created by yongbeomkwak on 2023/01/27. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import Utility -import RxRelay -import DesignSystem -import RxSwift -import BaseFeature -import CommonFeature -import DomainModule -import RxDataSources -import NVActivityIndicatorView - -public typealias FavoriteSectionModel = SectionModel - -public final class FavoriteViewController: BaseViewController, ViewControllerFromStoryBoard, SongCartViewType { - - @IBOutlet weak var tableView: UITableView! - @IBOutlet weak var activityIndicator: NVActivityIndicatorView! - - private var refreshControl = UIRefreshControl() - var viewModel: FavoriteViewModel! - var containSongsComponent: ContainSongsComponent! - - lazy var input = FavoriteViewModel.Input() - lazy var output = viewModel.transform(from: input) - var disposeBag = DisposeBag() - - public var songCartView: SongCartView! - public var bottomSheetView: BottomSheetView! - - let playState = PlayState.shared - - public override func viewDidLoad() { - super.viewDidLoad() - - configureUI() - inputBindRx() - outputBindRx() - } - - public static func viewController( - viewModel: FavoriteViewModel, - containSongsComponent: ContainSongsComponent - ) -> FavoriteViewController { - let viewController = FavoriteViewController.viewController(storyBoardName: "Storage", bundle: Bundle.module) - viewController.viewModel = viewModel - viewController.containSongsComponent = containSongsComponent - return viewController - } -} - -extension FavoriteViewController{ - - private func inputBindRx() { - - refreshControl.rx - .controlEvent(.valueChanged) - .bind(to: input.likeListLoad) - .disposed(by: disposeBag) - - tableView.rx.itemMoved - .bind(to: input.itemMoved) - .disposed(by: disposeBag) - - tableView.rx.itemSelected - .withLatestFrom(output.dataSource) { ($0, $1) } - .withLatestFrom(output.state) { ($0.0, $0.1, $1) } - .filter { $0.2.isEditing == false } - .subscribe(onNext: { (indexPath, dataSource, _) in - let song: SongEntity = dataSource[indexPath.section].items[indexPath.row].song - PlayState.shared.loadAndAppendSongsToPlaylist([song]) - }) - .disposed(by: disposeBag) - } - - private func outputBindRx() { - - tableView.rx.setDelegate(self).disposed(by: disposeBag) - - output.dataSource - .do(onNext: { [weak self] model in - guard let self = self else { - return - } - self.refreshControl.endRefreshing() - self.activityIndicator.stopAnimating() - - let warningView = WarningView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: APP_HEIGHT()/3)) - warningView.text = "좋아요 한 곡이 없습니다." - - let items = model.first?.items ?? [] - self.tableView.tableHeaderView = items.isEmpty ? warningView : nil - }) - .bind(to: tableView.rx.items(dataSource: createDatasources())) - .disposed(by: disposeBag) - - output.state - .skip(1) - .subscribe(onNext: { [weak self] (state) in - guard let self = self else{ - return - } - if state.isEditing == false && state.force == false { // 정상적인 편집 완료 이벤트 - self.input.runEditing.onNext(()) - } - guard let parent = self.parent?.parent as? AfterLoginViewController else{ - return - } - // 탭맨 쪽 편집 변경 - let isEdit: Bool = state.isEditing - parent.output.state.accept(EditState(isEditing: isEdit, force: true)) - self.tableView.refreshControl = isEdit ? nil : self.refreshControl - self.tableView.setEditing(isEdit, animated: true) - self.tableView.reloadData() - }) - .disposed(by: disposeBag) - - output.indexPathOfSelectedLikeLists - .skip(1) - .debug("indexPathOfSelectedLikeLists") - .withLatestFrom(output.dataSource) { ($0, $1) } - .subscribe(onNext: { [weak self] (songs, dataSource) in - guard let self = self else { return } - let items = dataSource.first?.items ?? [] - - switch songs.isEmpty { - case true : - self.hideSongCart() - case false: - self.showSongCart( - in: UIApplication.shared.windows.first?.rootViewController?.view ?? UIView(), - type: .likeSong, - selectedSongCount: songs.count, - totalSongCount: items.count, - useBottomSpace: true - ) - self.songCartView?.delegate = self - } - }).disposed(by: disposeBag) - - output.willAddSongList - .skip(1) - .debug("willAddSongList") - .subscribe(onNext: { [weak self] (songs) in - guard let `self` = self else { return } - let viewController = self.containSongsComponent.makeView(songs: songs) - viewController.modalPresentationStyle = .overFullScreen - self.present(viewController, animated: true) { - self.input.allLikeListSelected.onNext(false) - } - }).disposed(by: disposeBag) - - output.willAddPlayList - .skip(1) - .debug("willAddPlayList") - .subscribe(onNext: { [weak self] (songs) in - guard let self = self else {return} - self.playState.appendSongsToPlaylist(songs) - self.input.allLikeListSelected.onNext(false) - self.output.state.accept(EditState(isEditing: false, force: true)) - self.showToast( - text: "\(songs.count)곡이 재생목록에 추가되었습니다. 중복 곡은 제외됩니다.", - font: DesignSystemFontFamily.Pretendard.light.font(size: 14) - ) - }).disposed(by: disposeBag) - - output.showToast - .subscribe(onNext: { [weak self] (result:BaseEntity) in - guard let self = self else{ return } - - if result.status == 401 { - LOGOUT() - } - - self.showToast( - text: result.description, - font: DesignSystemFontFamily.Pretendard.light.font(size: 14) - ) - }) - .disposed(by: disposeBag) - } - - private func createDatasources() -> RxTableViewSectionedReloadDataSource { - let datasource = RxTableViewSectionedReloadDataSource(configureCell: { [weak self] (_, tableView, indexPath, model) -> UITableViewCell in - guard let self = self, - let cell = tableView.dequeueReusableCell(withIdentifier: "FavoriteTableViewCell", for: IndexPath(row: indexPath.row, section: 0)) as? FavoriteTableViewCell - else { return UITableViewCell() } - - cell.update( - model: model, - isEditing: self.output.state.value.isEditing, - indexPath: indexPath - ) - cell.delegate = self - return cell - - }, canEditRowAtIndexPath: { (_, _) -> Bool in - return true - }, canMoveRowAtIndexPath: { (_, _) -> Bool in - return true - }) - return datasource - } - - private func configureUI() { - self.tableView.refreshControl = self.refreshControl - self.view.backgroundColor = DesignSystemAsset.GrayColor.gray100.color - self.tableView.backgroundColor = .clear - self.tableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: 56)) - self.tableView.scrollIndicatorInsets = UIEdgeInsets(top: 0, left: 0, bottom: 56, right: 0) - self.activityIndicator.type = .circleStrokeSpin - self.activityIndicator.color = DesignSystemAsset.PrimaryColor.point.color - self.activityIndicator.startAnimating() - } -} - -extension FavoriteViewController: SongCartViewDelegate { - public func buttonTapped(type: SongCartSelectType) { - switch type { - case let .allSelect(flag): - input.allLikeListSelected.onNext(flag) - case .addSong: - input.addSongs.onNext(()) - self.output.state.accept(EditState(isEditing: false, force: true)) - self.hideSongCart() - case .addPlayList: - input.addPlayList.onNext(()) - self.hideSongCart() - case .remove: - let count: Int = output.indexPathOfSelectedLikeLists.value.count - let popup = TextPopupViewController.viewController( - text: "선택한 좋아요 리스트 \(count)곡이 삭제됩니다.", - cancelButtonIsHidden: false, - completion: { [weak self] () in - guard let `self` = self else { return } - self.input.deleteLikeList.onNext(()) - self.hideSongCart() - }) - self.showPanModal(content: popup) - default: return - } - } -} - -extension FavoriteViewController: FavoriteTableViewCellDelegate { - public func buttonTapped(type: FavoriteTableViewCellDelegateConstant) { - switch type { - case let .listTapped(indexPath): - input.itemSelected.onNext(indexPath) - case let .playTapped(song): - playState.loadAndAppendSongsToPlaylist([song]) - } - } -} - -extension FavoriteViewController:UITableViewDelegate{ - public func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { - return 60 - } - public func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell.EditingStyle { - return .none // 편집모드 시 왼쪽 버튼을 숨기려면 .none을 리턴합니다. - } - public func tableView(_ tableView: UITableView, shouldIndentWhileEditingRowAt indexPath: IndexPath) -> Bool { - return false // 편집모드 시 셀의 들여쓰기를 없애려면 false를 리턴합니다. - } -} - -extension FavoriteViewController { - func scrollToTop() { - let itemIsEmpty: Bool = output.dataSource.value.first?.items.isEmpty ?? true - guard !itemIsEmpty else { return } - tableView.setContentOffset(.zero, animated: true) - } -} diff --git a/Projects/Features/StorageFeature/Sources/ViewControllers/LikeStorageViewController.swift b/Projects/Features/StorageFeature/Sources/ViewControllers/LikeStorageViewController.swift new file mode 100644 index 000000000..a65b5b347 --- /dev/null +++ b/Projects/Features/StorageFeature/Sources/ViewControllers/LikeStorageViewController.swift @@ -0,0 +1,310 @@ +import BaseFeature +import BaseFeatureInterface +import DesignSystem +import Localization +import LogManager +import NVActivityIndicatorView +import PlaylistFeatureInterface +import RxCocoa +import RxDataSources +import RxRelay +import RxSwift +import SignInFeatureInterface +import SongsDomainInterface +import UIKit +import UserDomainInterface +import Utility + +typealias LikeSectionModel = SectionModel + +final class LikeStorageViewController: BaseReactorViewController, SongCartViewType { + let likeStorageView = LikeStorageView() + + var containSongsFactory: ContainSongsFactory! + var textPopupFactory: TextPopupFactory! + var signInFactory: SignInFactory! + var songDetailPresenter: SongDetailPresentable! + + var songCartView: SongCartView! + var bottomSheetView: BottomSheetView! + + let playState = PlayState.shared + + override func loadView() { + super.loadView() + self.view = likeStorageView + } + + override func viewDidLoad() { + super.viewDidLoad() + setTableView() + } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + LogManager.analytics(CommonAnalyticsLog.viewPage(pageName: .storageLike)) + } + + static func viewController( + reactor: Reactor, + containSongsFactory: ContainSongsFactory, + textPopupFactory: TextPopupFactory, + signInFactory: SignInFactory, + songDetailPresenter: SongDetailPresentable + ) -> LikeStorageViewController { + let viewController = LikeStorageViewController(reactor: reactor) + viewController.containSongsFactory = containSongsFactory + viewController.textPopupFactory = textPopupFactory + viewController.signInFactory = signInFactory + viewController.songDetailPresenter = songDetailPresenter + return viewController + } + + override func configureUI() { + super.configureUI() + reactor?.action.onNext(.viewDidLoad) + } + + private func setTableView() { + likeStorageView.tableView.rx.setDelegate(self).disposed(by: disposeBag) + } + + override func bindState(reactor: LikeStorageReactor) { + super.bindState(reactor: reactor) + let sharedState = reactor.state.share() + + sharedState.map(\.isLoggedIn) + .distinctUntilChanged() + .bind(with: self, onNext: { owner, isLoggedIn in + owner.likeStorageView.updateIsHiddenLoginWarningView(isHidden: isLoggedIn) + }) + .disposed(by: disposeBag) + + sharedState.map(\.isShowActivityIndicator) + .distinctUntilChanged() + .bind(with: self, onNext: { owner, isShow in + owner.likeStorageView.updateActivityIndicatorState(isPlaying: isShow) + }) + .disposed(by: disposeBag) + + reactor.pulse(\.$hideSongCart) + .compactMap { $0 } + .bind(with: self, onNext: { owner, _ in + owner.hideSongCart() + }) + .disposed(by: disposeBag) + + reactor.pulse(\.$showToast) + .compactMap { $0 } + .bind(with: self, onNext: { owner, message in + owner.showToast( + text: message, + font: DesignSystemFontFamily.Pretendard.light.font(size: 14), + options: [.tabBar, .songCart] + ) + }) + .disposed(by: disposeBag) + + reactor.pulse(\.$showAddToPlaylistPopup) + .compactMap { $0 } + .bind(with: self) { owner, songs in + let vc = owner.containSongsFactory.makeView(songs: songs) + vc.modalPresentationStyle = .overFullScreen + owner.present(vc, animated: true) { + owner.reactor?.action.onNext(.presentAddToPlaylistPopup) + } + } + .disposed(by: disposeBag) + + reactor.pulse(\.$showDeletePopup) + .compactMap { $0 } + .bind(with: self, onNext: { owner, itemCount in + guard let vc = owner.textPopupFactory.makeView( + text: "선택한 내 리스트 \(itemCount)개가 삭제됩니다.", + cancelButtonIsHidden: false, + confirmButtonText: nil, + cancelButtonText: nil, + completion: { + owner.reactor?.action.onNext(.confirmDeleteButtonDidTap) + }, + cancelCompletion: {} + ) as? TextPopupViewController else { + return + } + owner.showBottomSheet(content: vc) + }) + .disposed(by: disposeBag) + + reactor.pulse(\.$showLoginAlert) + .compactMap { $0 } + .bind(with: self, onNext: { owner, _ in + let log = CommonAnalyticsLog.clickLoginButton(entry: .storageLike) + LogManager.analytics(log) + + let loginVC = owner.signInFactory.makeView() + loginVC.modalPresentationStyle = .fullScreen + owner.present(loginVC, animated: true) + }) + .disposed(by: disposeBag) + + sharedState.map(\.dataSource) + // .skip(1) + .withUnretained(self) + .withLatestFrom(Utility.PreferenceManager.$userInfo) { ($0.0, $0.1, $1) } + .do(onNext: { owner, dataSource, _ in + owner.likeStorageView.updateRefreshControlState(isPlaying: false) + let dataSourceIsEmpty = dataSource.flatMap { $0.items }.isEmpty + owner.likeStorageView.updateIsHiddenEmptyWarningView(isHidden: !dataSourceIsEmpty) + }) + .map { $0.1 } + .bind(to: likeStorageView.tableView.rx.items(dataSource: createDatasources())) + .disposed(by: disposeBag) + + sharedState.map(\.isEditing) + .distinctUntilChanged() + .withUnretained(self) + .bind { owner, flag in + owner.likeStorageView.tableView.isEditing = flag + owner.likeStorageView.tableView.reloadData() + owner.likeStorageView.updateIsEnabledRefreshControl(isEnabled: !flag) + } + .disposed(by: disposeBag) + + sharedState.map(\.selectedItemCount) + .distinctUntilChanged() + .bind(with: self, onNext: { owner, count in + if count == 0 { + self.hideSongCart() + } else { + owner.showSongCart( + in: (UIApplication.shared.connectedScenes.first as? UIWindowScene)?.windows.first? + .rootViewController?.view ?? UIView(), + type: .likeSong, + selectedSongCount: count, + totalSongCount: owner.reactor?.currentState.dataSource.first?.items.count ?? 0, + useBottomSpace: true + ) + owner.songCartView.delegate = owner + } + }) + .disposed(by: disposeBag) + } + + override func bindAction(reactor: LikeStorageReactor) { + super.bindAction(reactor: reactor) + + likeStorageView.rx.loginButtonDidTap + .do(onNext: { LogManager.analytics(StorageAnalyticsLog.clickLoginButton(location: .myLikeList)) }) + .map { Reactor.Action.loginButtonDidTap } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + likeStorageView.rx.refreshControlValueChanged + .map { Reactor.Action.refresh } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + likeStorageView.tableView.rx.itemMoved + .map { Reactor.Action.itemMoved($0) } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + likeStorageView.tableView.rx.itemSelected + .withLatestFrom(reactor.state.map(\.dataSource)) { ($0, $1) } + .compactMap { $0.1[safe: $0.0.section]?.items[safe: $0.0.row] } + .bind(with: self, onNext: { owner, song in + LogManager.analytics(StorageAnalyticsLog.clickMyLikeListMusicButton(id: song.songID)) + + PlayState.shared.append(item: .init(id: song.songID, title: song.title, artist: song.artist)) + let playlistIDs = PlayState.shared.currentPlaylist + .map(\.id) + owner.songDetailPresenter.present(ids: playlistIDs, selectedID: song.songID) + }) + .disposed(by: disposeBag) + } +} + +extension LikeStorageViewController { + private func createDatasources() -> RxTableViewSectionedReloadDataSource { + let datasource = RxTableViewSectionedReloadDataSource( + configureCell: { [weak self] _, tableView, indexPath, model -> UITableViewCell in + guard let self = self, let reactor = self.reactor else { return UITableViewCell() + } + guard let cell = tableView.dequeueReusableCell( + withIdentifier: LikeStorageTableViewCell.reuseIdentifer, + for: IndexPath(row: indexPath.row, section: 0) + ) as? LikeStorageTableViewCell + else { return UITableViewCell() } + + cell.update( + model: model, + isEditing: reactor.currentState.isEditing, + indexPath: indexPath + ) + cell.delegate = self + cell.selectionStyle = .none + return cell + + }, + canEditRowAtIndexPath: { _, _ -> Bool in + return true + }, + canMoveRowAtIndexPath: { _, _ -> Bool in + return true + } + ) + return datasource + } +} + +extension LikeStorageViewController: SongCartViewDelegate { + public func buttonTapped(type: SongCartSelectType) { + switch type { + case let .allSelect(flag): + reactor?.action.onNext(.tapAll(isSelecting: flag)) + case .addSong: + let log = CommonAnalyticsLog.clickAddMusicsButton(location: .storageLike) + LogManager.analytics(log) + + reactor?.action.onNext(.addToPlaylistButtonDidTap) + case .addPlayList: + reactor?.action.onNext(.addToCurrentPlaylistButtonDidTap) + case .remove: + reactor?.action.onNext(.deleteButtonDidTap) + default: return + } + } +} + +extension LikeStorageViewController: LikeStorageTableViewCellDelegate { + public func buttonTapped(type: LikeStorageTableViewCellDelegateConstant) { + switch type { + case let .cellTapped(indexPath): + self.reactor?.action.onNext(.songDidTap(indexPath.row)) + case let .playTapped(song): + LogManager.analytics(CommonAnalyticsLog.clickPlayButton(location: .storageLike, type: .single)) + self.reactor?.action.onNext(.playDidTap(song: song)) + } + } +} + +extension LikeStorageViewController: UITableViewDelegate { + public func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + return 60 + } + + public func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell + .EditingStyle { + return .none // 편집모드 시 왼쪽 버튼을 숨기려면 .none을 리턴합니다. + } + + public func tableView(_ tableView: UITableView, shouldIndentWhileEditingRowAt indexPath: IndexPath) -> Bool { + return false // 편집모드 시 셀의 들여쓰기를 없애려면 false를 리턴합니다. + } +} + +extension LikeStorageViewController { + func scrollToTop() { + likeStorageView.tableView.setContentOffset(.zero, animated: true) + } +} diff --git a/Projects/Features/StorageFeature/Sources/ViewControllers/ListStorageViewController.swift b/Projects/Features/StorageFeature/Sources/ViewControllers/ListStorageViewController.swift new file mode 100644 index 000000000..dfaece595 --- /dev/null +++ b/Projects/Features/StorageFeature/Sources/ViewControllers/ListStorageViewController.swift @@ -0,0 +1,379 @@ +import BaseFeature +import BaseFeatureInterface +import DesignSystem +import FruitDrawFeatureInterface +import Localization +import LogManager +import NVActivityIndicatorView +import PlaylistFeatureInterface +import RxCocoa +import RxDataSources +import RxRelay +import RxSwift +import SignInFeatureInterface +import SongsDomainInterface +import UIKit +import UserDomainInterface +import Utility + +typealias MyPlayListSectionModel = SectionModel + +final class ListStorageViewController: BaseReactorViewController, SongCartViewType, + PlaylistDetailNavigator { + private let createListButton = CreateListButtonView( + padding: .init( + top: 16, + left: 20, + bottom: 12, + right: 20 + ) + ) + private let listStorageView = ListStorageView() + + var multiPurposePopupFactory: MultiPurposePopupFactory + var textPopupFactory: TextPopupFactory + var playlistDetailFactory: any PlaylistDetailFactory + var signInFactory: SignInFactory + var fruitDrawFactory: FruitDrawFactory + var songCartView: SongCartView! + var bottomSheetView: BottomSheetView! + + init( + reactor: Reactor, + multiPurposePopupFactory: MultiPurposePopupFactory, + textPopupFactory: TextPopupFactory, + playlistDetailFactory: PlaylistDetailFactory, + signInFactory: SignInFactory, + fruitDrawFactory: FruitDrawFactory + ) { + self.multiPurposePopupFactory = multiPurposePopupFactory + self.textPopupFactory = textPopupFactory + self.playlistDetailFactory = playlistDetailFactory + self.signInFactory = signInFactory + self.fruitDrawFactory = fruitDrawFactory + super.init(reactor: reactor) + } + + override func loadView() { + self.view = listStorageView + } + + override public func viewDidLoad() { + super.viewDidLoad() + setTableView() + } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + LogManager.analytics(CommonAnalyticsLog.viewPage(pageName: .storagePlaylist)) + listStorageView.startParticeAnimation() + + // 플리 상세에서 내 리스트로 돌아오는 경우, 플로팅 버튼 올림 + NotificationCenter.default.post( + name: .shouldMovePlaylistFloatingButton, + object: PlaylistFloatingButtonPosition.top + ) + } + + override func viewDidDisappear(_ animated: Bool) { + super.viewDidDisappear(animated) + listStorageView.removeParticeAnimation() + } + + override func configureUI() { + reactor?.action.onNext(.viewDidLoad) + } + + private func setTableView() { + listStorageView.tableView.delegate = self + } + + override func bindState(reactor: ListStorageReactor) { + super.bindState(reactor: reactor) + + let sharedState = reactor.state.share() + + sharedState.map(\.isLoggedIn) + .distinctUntilChanged() + .bind(with: self, onNext: { owner, isLoggedIn in + owner.listStorageView.updateIsHiddenLoginWarningView(isHidden: isLoggedIn) + }) + .disposed(by: disposeBag) + + sharedState.map(\.isShowActivityIndicator) + .distinctUntilChanged() + .bind(with: self, onNext: { owner, isShow in + owner.listStorageView.updateActivityIndicatorState(isPlaying: isShow) + }) + .disposed(by: disposeBag) + + reactor.pulse(\.$showDetail) + .compactMap { $0 } + .bind(with: self, onNext: { owner, key in + // 플리 상세 진입 시, 플로팅 버튼 내림 + NotificationCenter.default.post( + name: .shouldMovePlaylistFloatingButton, + object: PlaylistFloatingButtonPosition.default + ) + owner.navigatePlaylistDetail(key: key) + }) + .disposed(by: disposeBag) + + reactor.pulse(\.$hideSongCart) + .compactMap { $0 } + .bind(with: self, onNext: { owner, _ in + owner.hideSongCart() + }) + .disposed(by: disposeBag) + + reactor.pulse(\.$showToast) + .compactMap { $0 } + .bind(with: self, onNext: { owner, message in + owner.showToast( + text: message, + font: DesignSystemFontFamily.Pretendard.light.font(size: 14), + options: [.tabBar, .songCart] + ) + }) + .disposed(by: disposeBag) + + reactor.pulse(\.$showDrawFruitPopup) + .compactMap { $0 } + .bind(with: self, onNext: { owner, _ in + let vc = owner.fruitDrawFactory.makeView(delegate: owner) + vc.modalPresentationStyle = .fullScreen + owner.present(vc, animated: true) + }) + .disposed(by: disposeBag) + + reactor.pulse(\.$showCreatePricePopup) + .compactMap { $0 } + .bind(with: self) { owner, price in + let text = owner.textPopupFactory.makeView( + text: "리스트를 만들기 위해서는\n음표 열매 \(price)개가 필요합니다.", + cancelButtonIsHidden: false, + confirmButtonText: "\(price)개 사용", + cancelButtonText: "취소", + completion: { + reactor.action.onNext(.confirmCreatePriceButtonDidTap) + }, cancelCompletion: nil + ) + owner.showBottomSheet(content: text) + } + .disposed(by: disposeBag) + + reactor.pulse(\.$showCreateListPopup) + .compactMap { $0 } + .bind(with: self, onNext: { owner, _ in + let vc = owner.multiPurposePopupFactory.makeView(type: .creation, key: "") { title in + owner.reactor?.action.onNext(.confirmCreateListButtonDidTap(title)) + } + owner.showBottomSheet(content: vc, size: .fixed(296)) + }) + .disposed(by: disposeBag) + + reactor.pulse(\.$showDeletePopup) + .compactMap { $0 } + .bind(with: self, onNext: { owner, itemCount in + guard let vc = owner.textPopupFactory.makeView( + text: "선택한 내 리스트 \(itemCount)개가 삭제됩니다.", + cancelButtonIsHidden: false, + confirmButtonText: nil, + cancelButtonText: nil, + completion: { + owner.reactor?.action.onNext(.confirmDeleteButtonDidTap) + }, + cancelCompletion: {} + ) as? TextPopupViewController else { + return + } + owner.showBottomSheet(content: vc) + }) + .disposed(by: disposeBag) + + reactor.pulse(\.$showLoginAlert) + .compactMap { $0 } + .bind(with: self, onNext: { owner, entry in + LogManager.analytics(CommonAnalyticsLog.clickLoginButton(entry: entry)) + + let loginVC = owner.signInFactory.makeView() + loginVC.modalPresentationStyle = .fullScreen + owner.present(loginVC, animated: true) + }) + .disposed(by: disposeBag) + + sharedState.map(\.dataSource) + // .skip(1) + .withUnretained(self) + .withLatestFrom(Utility.PreferenceManager.$userInfo) { ($0.0, $0.1, $1) } + .do(onNext: { owner, dataSource, _ in + owner.listStorageView.updateRefreshControlState(isPlaying: false) + let dataSourceIsEmpty = dataSource.flatMap { $0.items }.isEmpty + owner.listStorageView.updateIsHiddenEmptyWarningView(isHidden: !dataSourceIsEmpty) + }) + .map { $0.1 } + .bind(to: listStorageView.tableView.rx.items(dataSource: createDatasources())) + .disposed(by: disposeBag) + + sharedState.map(\.isEditing) + .distinctUntilChanged() + .withUnretained(self) + .bind { owner, flag in + owner.listStorageView.tableView.isEditing = flag + owner.listStorageView.tableView.reloadData() + owner.listStorageView.updateIsEnabledRefreshControl(isEnabled: !flag) + } + .disposed(by: disposeBag) + + sharedState.map(\.selectedItemCount) + .distinctUntilChanged() + .bind(with: self, onNext: { owner, count in + if count == 0 { + self.hideSongCart() + } else { + owner.showSongCart( + in: (UIApplication.shared.connectedScenes.first as? UIWindowScene)?.windows.first? + .rootViewController?.view ?? UIView(), + type: .playlistStorage, + selectedSongCount: count, + totalSongCount: owner.reactor?.currentState.dataSource.first?.items.count ?? 0, + useBottomSpace: true + ) + owner.songCartView.delegate = owner + } + }) + .disposed(by: disposeBag) + } + + override func bindAction(reactor: ListStorageReactor) { + listStorageView.rx.loginButtonDidTap + .do(onNext: { LogManager.analytics(StorageAnalyticsLog.clickLoginButton(location: .myPlaylist)) }) + .map { Reactor.Action.loginButtonDidTap } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + listStorageView.rx.refreshControlValueChanged + .map { Reactor.Action.refresh } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + listStorageView.rx.drawFruitButtonDidTap + .do(onNext: { LogManager.analytics(StorageAnalyticsLog.clickFruitDrawEntryButton(location: .myPlaylist)) }) + .map { Reactor.Action.drawFruitButtonDidTap } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + createListButton.button.rx.tap + .throttle(.milliseconds(500), latest: false, scheduler: MainScheduler.asyncInstance) + .do(onNext: { LogManager.analytics(StorageAnalyticsLog.clickCreatePlaylistButton(location: .myPlaylist)) }) + .map { Reactor.Action.createListButtonDidTap } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + listStorageView.tableView.rx.itemMoved + .map { Reactor.Action.itemMoved($0) } + .bind(to: reactor.action) + .disposed(by: disposeBag) + } + + private func createDatasources() -> RxTableViewSectionedReloadDataSource { + let datasource = RxTableViewSectionedReloadDataSource( + configureCell: { [weak self] _, tableView, indexPath, model -> UITableViewCell in + guard let self = self, let reactor = self.reactor else { return UITableViewCell() } + + guard let cell = tableView.dequeueReusableCell( + withIdentifier: ListStorageTableViewCell.reuseIdentifer, + for: IndexPath(row: indexPath.row, section: 0) + ) as? ListStorageTableViewCell + else { return UITableViewCell() } + + cell.update( + model: model, + isEditing: reactor.currentState.isEditing, + indexPath: indexPath + ) + cell.delegate = self + cell.selectionStyle = .none + return cell + + }, + canEditRowAtIndexPath: { _, _ -> Bool in + return true + + }, + canMoveRowAtIndexPath: { _, _ -> Bool in + return true + } + ) + return datasource + } +} + +extension ListStorageViewController: SongCartViewDelegate { + public func buttonTapped(type: SongCartSelectType) { + switch type { + case let .allSelect(flag): + reactor?.action.onNext(.tapAll(isSelecting: flag)) + + case .addPlayList: + reactor?.action.onNext(.addToCurrentPlaylistButtonDidTap) + + case .remove: + reactor?.action.onNext(.deleteButtonDidTap) + + default: return + } + } +} + +extension ListStorageViewController: ListStorageTableViewCellDelegate { + public func buttonTapped(type: ListStorageTableViewCellDelegateConstant) { + switch type { + case let .listTapped(passModel): + LogManager.analytics(CommonAnalyticsLog.clickPlaylistItem(location: .storage, key: passModel.key)) + self.reactor?.action.onNext(.listDidTap(passModel.indexPath)) + + case let .playTapped(passModel): + LogManager.analytics(CommonAnalyticsLog.clickPlayButton(location: .storagePlaylist, type: .playlist)) + self.reactor?.action.onNext(.playDidTap(passModel.indexPath.row)) + + case let .cellTapped(passModel): + self.reactor?.action.onNext(.cellDidTap(passModel.indexPath.row)) + } + } +} + +extension ListStorageViewController: UITableViewDelegate { + func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { + return 80 // height(52) + top inset(16) + bottom inset(12) + } + + func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { + return createListButton + } + + public func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + return 60 + } + + public func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell + .EditingStyle { + return .none // 편집모드 시 왼쪽 버튼을 숨기려면 .none을 리턴합니다. + } + + public func tableView(_ tableView: UITableView, shouldIndentWhileEditingRowAt indexPath: IndexPath) -> Bool { + return false // 편집모드 시 셀의 들여쓰기를 없애려면 false를 리턴합니다. + } +} + +extension ListStorageViewController { + func scrollToTop() { + listStorageView.tableView.setContentOffset(.zero, animated: true) + } +} + +extension ListStorageViewController: FruitDrawViewControllerDelegate { + func completedFruitDraw(itemCount: Int) { + reactor?.action.onNext(.completedFruitDraw) + } +} diff --git a/Projects/Features/StorageFeature/Sources/ViewControllers/MyPlayListViewController.swift b/Projects/Features/StorageFeature/Sources/ViewControllers/MyPlayListViewController.swift deleted file mode 100644 index 2a79e2071..000000000 --- a/Projects/Features/StorageFeature/Sources/ViewControllers/MyPlayListViewController.swift +++ /dev/null @@ -1,322 +0,0 @@ -// -// MyPlayListViewController.swift -// StorageFeature -// -// Created by yongbeomkwak on 2023/01/27. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import Utility -import RxSwift -import RxRelay -import RxCocoa -import DesignSystem -import PanModal -import BaseFeature -import CommonFeature -import DomainModule -import RxDataSources -import NVActivityIndicatorView - -public typealias MyPlayListSectionModel = SectionModel - -public final class MyPlayListViewController: BaseViewController, ViewControllerFromStoryBoard, SongCartViewType { - - @IBOutlet weak var tableView: UITableView! - @IBOutlet weak var activityIndicator: NVActivityIndicatorView! - - private var refreshControl = UIRefreshControl() - var multiPurposePopComponent:MultiPurposePopComponent! - var playListDetailComponent :PlayListDetailComponent! - var viewModel:MyPlayListViewModel! - - lazy var input = MyPlayListViewModel.Input() - lazy var output = viewModel.transform(from: input) - var disposeBag = DisposeBag() - - public var songCartView: SongCartView! - public var bottomSheetView: BottomSheetView! - - let playState = PlayState.shared - - public override func viewDidLoad() { - super.viewDidLoad() - configureUI() - inputBindRx() - outputBindRx() - } - - public static func viewController( - viewModel: MyPlayListViewModel, - multiPurposePopComponent: MultiPurposePopComponent, - playListDetailComponent: PlayListDetailComponent - ) -> MyPlayListViewController { - let viewController = MyPlayListViewController.viewController(storyBoardName: "Storage", bundle: Bundle.module) - viewController.viewModel = viewModel - viewController.multiPurposePopComponent = multiPurposePopComponent - viewController.playListDetailComponent = playListDetailComponent - return viewController - } -} - -extension MyPlayListViewController{ - - private func inputBindRx() { - - refreshControl.rx - .controlEvent(.valueChanged) - .bind(to: input.playListLoad) - .disposed(by: disposeBag) - - tableView.rx.itemSelected - .debug() - .withLatestFrom(output.dataSource) { ($0, $1) } - .withLatestFrom(output.state) { ($0.0, $0.1, $1) } - .debug() - .subscribe(onNext: { [weak self] (indexPath, dataSource, state) in - guard let self = self else { return } - - let isEditing: Bool = state.isEditing - - if isEditing { //편집 중일 때, 동작 안함 - self.input.itemSelected.onNext(indexPath) - - }else{ - let id: String = dataSource[indexPath.section].items[indexPath.row].key - let vc = self.playListDetailComponent.makeView(id: id, type: .custom) - self.navigationController?.pushViewController(vc, animated: true) - } - }) - .disposed(by: disposeBag) - - tableView.rx.itemMoved - .debug("itemMoved") - .bind(to: input.itemMoved) - .disposed(by: disposeBag) - } - - private func outputBindRx() { - output.state - .skip(1) - .subscribe(onNext: { [weak self] (state) in - guard let self = self else{ - return - } - if state.isEditing == false && state.force == false { // 정상적인 편집 완료 이벤트 - self.input.runEditing.onNext(()) - } - - guard let parent = self.parent?.parent as? AfterLoginViewController else{ - return - } - - // 탭맨 쪽 편집 변경 - let isEdit: Bool = state.isEditing - parent.output.state.accept(EditState(isEditing: isEdit, force: true)) - self.tableView.refreshControl = isEdit ? nil : self.refreshControl - self.tableView.setEditing(isEdit, animated: true) - - let header = MyPlayListHeaderView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: 140)) - header.delegate = self - self.tableView.tableHeaderView = isEdit ? nil : header - self.tableView.reloadData() - }) - .disposed(by: disposeBag) - - tableView.rx.setDelegate(self).disposed(by: disposeBag) - - output.dataSource - .skip(1) - .do(onNext: { [weak self] model in - guard let self = self else { - return - } - self.refreshControl.endRefreshing() - self.activityIndicator.stopAnimating() - - let warningView = WarningView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: APP_HEIGHT()/3)) - warningView.text = "내 리스트가 없습니다." - - let items = model.first?.items ?? [] - self.tableView.tableFooterView = items.isEmpty ? warningView : UIView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: 56)) - }) - .bind(to: tableView.rx.items(dataSource: createDatasources())) - .disposed(by: disposeBag) - - output.indexPathOfSelectedPlayLists - .skip(1) - .debug("indexPathOfSelectedPlayLists") - .withLatestFrom(output.dataSource) { ($0, $1) } - .subscribe(onNext: { [weak self] (songs, dataSource) in - guard let self = self else { return } - let items = dataSource.first?.items ?? [] - - switch songs.isEmpty { - case true : - self.hideSongCart() - case false: - self.showSongCart( - in: UIApplication.shared.windows.first?.rootViewController?.view ?? UIView(), - type: .myList, - selectedSongCount: songs.count, - totalSongCount: items.count, - useBottomSpace: true - ) - self.songCartView?.delegate = self - } - }).disposed(by: disposeBag) - - output.willAddPlayList - .skip(1) - .debug("willAddPlayList") - .subscribe(onNext: { [weak self] (songs) in - guard let self = self else {return} - if !songs.isEmpty { - self.playState.appendSongsToPlaylist(songs) - } - self.input.allPlayListSelected.onNext(false) - self.output.state.accept(EditState(isEditing: false, force: true)) - let message: String = songs.isEmpty ? - "리스트에 곡이 없습니다." : - "\(songs.count)곡이 재생목록에 추가되었습니다. 중복 곡은 제외됩니다." - self.showToast( - text: message, - font: DesignSystemFontFamily.Pretendard.light.font(size: 14) - ) - }).disposed(by: disposeBag) - - output.showToast - .subscribe(onNext: { [weak self] result in - guard let self = self else{ - return - } - - if result.status == 401 { - LOGOUT() - } - - self.showToast( - text: result.description, - font: DesignSystemFontFamily.Pretendard.light.font(size: 14) - ) - }) - .disposed(by: disposeBag) - } - - private func createDatasources() -> RxTableViewSectionedReloadDataSource { - let datasource = RxTableViewSectionedReloadDataSource(configureCell: { [weak self] (_, tableView, indexPath, model) -> UITableViewCell in - guard let self = self else { return UITableViewCell() } - - guard let cell = tableView.dequeueReusableCell(withIdentifier: "MyPlayListTableViewCell",for: IndexPath(row: indexPath.row, section: 0)) as? MyPlayListTableViewCell - else { return UITableViewCell() } - - cell.update( - model: model, - isEditing: self.output.state.value.isEditing, - indexPath: indexPath - ) - cell.delegate = self - return cell - - }, canEditRowAtIndexPath: { (_, _) -> Bool in - return true - - }, canMoveRowAtIndexPath: { (_, _) -> Bool in - return true - }) - return datasource - } - - private func configureUI() { - self.tableView.refreshControl = self.refreshControl - let header = MyPlayListHeaderView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: 140)) - header.delegate = self - self.tableView.tableHeaderView = header - self.tableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: 56)) - self.tableView.scrollIndicatorInsets = UIEdgeInsets(top: 0, left: 0, bottom: 56, right: 0) - self.activityIndicator.type = .circleStrokeSpin - self.activityIndicator.color = DesignSystemAsset.PrimaryColor.point.color - self.activityIndicator.startAnimating() - } -} - -extension MyPlayListViewController: SongCartViewDelegate { - public func buttonTapped(type: SongCartSelectType) { - switch type { - case let .allSelect(flag): - input.allPlayListSelected.onNext(flag) - - case .addPlayList: - input.addPlayList.onNext(()) - self.hideSongCart() - - case .remove: - let count: Int = output.indexPathOfSelectedPlayLists.value.count - let popup = TextPopupViewController.viewController( - text: "선택한 내 리스트 \(count)개가 삭제됩니다.", - cancelButtonIsHidden: false, - completion: { [weak self] () in - guard let `self` = self else { return } - self.input.deletePlayList.onNext(()) - self.hideSongCart() - }) - self.showPanModal(content: popup) - - default: return - } - } -} - -extension MyPlayListViewController: MyPlayListTableViewCellDelegate { - public func buttonTapped(type: MyPlayListTableViewCellDelegateConstant) { - switch type { - case let .listTapped(indexPath): - input.itemSelected.onNext(indexPath) - case let .playTapped(indexPath): - let songs: [SongEntity] = output.dataSource.value[indexPath.section].items[indexPath.row].songlist - guard !songs.isEmpty else { - self.showToast( - text: "리스트에 곡이 없습니다.", - font: DesignSystemFontFamily.Pretendard.light.font(size: 14) - ) - return - } - self.playState.loadAndAppendSongsToPlaylist(songs) - } - } -} - -extension MyPlayListViewController: UITableViewDelegate{ - - public func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { - return 60 - } - - public func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell.EditingStyle { - return .none // 편집모드 시 왼쪽 버튼을 숨기려면 .none을 리턴합니다. - } - - public func tableView(_ tableView: UITableView, shouldIndentWhileEditingRowAt indexPath: IndexPath) -> Bool { - return false // 편집모드 시 셀의 들여쓰기를 없애려면 false를 리턴합니다. - } -} - -extension MyPlayListViewController: MyPlayListHeaderViewDelegate{ - public func action(_ type: PurposeType) { - if let parent = self.parent?.parent as? AfterLoginViewController { - parent.hideEditSheet() - parent.profileButton.isSelected = false - } - let vc = multiPurposePopComponent.makeView(type: type) - self.showEntryKitModal(content: vc, height: 296) - } -} - -extension MyPlayListViewController { - func scrollToTop() { - let itemIsEmpty: Bool = output.dataSource.value.first?.items.isEmpty ?? true - guard !itemIsEmpty else { return } - tableView.setContentOffset(.zero, animated: true) - } -} diff --git a/Projects/Features/StorageFeature/Sources/ViewControllers/NickNamePopupViewController.swift b/Projects/Features/StorageFeature/Sources/ViewControllers/NickNamePopupViewController.swift deleted file mode 100644 index 57852400b..000000000 --- a/Projects/Features/StorageFeature/Sources/ViewControllers/NickNamePopupViewController.swift +++ /dev/null @@ -1,145 +0,0 @@ -// -// NickNamePopupViewController.swift -// StorageFeature -// -// Created by yongbeomkwak on 2023/03/10. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import UIKit -import Utility -import RxSwift -import RxRelay -import PanModal - -public final class NickNamePopupViewController: UIViewController,ViewControllerFromStoryBoard { - - @IBOutlet weak var tableView: UITableView! - - var completion: ((String) -> Void)? - var dataSource:BehaviorRelay<[NickNameInfo]> = BehaviorRelay(value: [NickNameInfo(description: PublicNameOption.public.rawValue, check: false), - NickNameInfo(description: PublicNameOption.private.rawValue, check: false), - NickNameInfo(description: PublicNameOption.nonSigned.rawValue, check: false)]) - var disposeBag = DisposeBag() - - public override func viewDidLoad() { - super.viewDidLoad() - - configureUI() - - } - - - public static func viewController(current: String, completion: ((String) -> Void)? = nil) -> NickNamePopupViewController { - let viewController = NickNamePopupViewController.viewController(storyBoardName: "Storage", bundle: Bundle.module) - viewController.completion = completion - - var newModel = viewController.dataSource.value - if let index = viewController.dataSource.value.firstIndex(where: { $0.description == current }) { - newModel[index].check = true - } - viewController.dataSource.accept(newModel) - - return viewController - } -} - -extension NickNamePopupViewController { - - private func configureUI() { - - tableView.rx.setDelegate(self).disposed(by: disposeBag) - - - - dataSource - .bind(to: tableView.rx.items) { (tableView, index, model) -> UITableViewCell in - let indexPath: IndexPath = IndexPath(row: index, section: 0) - - guard let cell = tableView.dequeueReusableCell(withIdentifier: "NickNameInfoTableViewCell", for: indexPath) as? NickNameInfoTableViewCell else{ - return UITableViewCell() - } - - cell.update(model: model) - return cell - - } - .disposed(by: disposeBag) - - configureEvent() - - } - - private func configureEvent() { - - tableView.rx.itemSelected - .withLatestFrom(dataSource){($0,$1)} - .map{ (indexPath, models) in - var nextModels:[NickNameInfo] = models - - guard let index = models.firstIndex(where: { $0.check }) else { - nextModels[indexPath.row].check = true - return nextModels - } - nextModels[index].check = false - nextModels[indexPath.row].check = true - return nextModels - } - .do(onNext: { [weak self] (model) in - guard let index = model.firstIndex(where: { $0.check }) else { return } - self?.completion?(model[index].description) - self?.dismiss(animated: true) - }) - .bind(to: dataSource) - .disposed(by: disposeBag) - - } -} - -public struct NickNameInfo { - var description: String - var check: Bool -} - -extension NickNamePopupViewController :UITableViewDelegate{ - - public func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { - return 52 - } - - -} - -extension NickNamePopupViewController: PanModalPresentable { - - public override var preferredStatusBarStyle: UIStatusBarStyle { - return .lightContent - } - - public var panModalBackgroundColor: UIColor { - return colorFromRGB(0x000000, alpha: 0.4) - } - - public var panScrollable: UIScrollView? { - return nil - } - - public var longFormHeight: PanModalHeight { - - - return PanModalHeight.contentHeight(228) - } - - public var cornerRadius: CGFloat { - return 24.0 - } - - public var allowsExtendedPanScrolling: Bool { - return true - } - - public var showDragIndicator: Bool { - return false - } -} diff --git a/Projects/Features/StorageFeature/Sources/ViewControllers/NoticeDetailViewController.swift b/Projects/Features/StorageFeature/Sources/ViewControllers/NoticeDetailViewController.swift deleted file mode 100644 index f3c31ee74..000000000 --- a/Projects/Features/StorageFeature/Sources/ViewControllers/NoticeDetailViewController.swift +++ /dev/null @@ -1,151 +0,0 @@ -// -// NoticeDetailViewController.swift -// StorageFeature -// -// Created by KTH on 2023/04/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import Utility -import RxSwift -import RxCocoa -import DesignSystem -import RxDataSources -import DomainModule -import CommonFeature -import NVActivityIndicatorView - -typealias NoticeDetailSectionModel = SectionModel - -public class NoticeDetailViewController: UIViewController, ViewControllerFromStoryBoard { - - @IBOutlet weak var titleStringLabel: UILabel! - @IBOutlet weak var closeButton: UIButton! - @IBOutlet weak var collectionView: UICollectionView! - @IBOutlet weak var indicator: NVActivityIndicatorView! - - var viewModel: NoticeDetailViewModel! - var disposeBag = DisposeBag() - - deinit { - DEBUG_LOG("❌ \(Self.self) Deinit") - } - - public override func viewDidLoad() { - super.viewDidLoad() - configureUI() - outputBind() - inputBind() - } - - public static func viewController( - viewModel: NoticeDetailViewModel - ) -> NoticeDetailViewController { - let viewController = NoticeDetailViewController.viewController(storyBoardName: "Storage", bundle: Bundle.module) - viewController.viewModel = viewModel - return viewController - } - - @IBAction func closeButtonAction(_ sender: Any) { - dismiss(animated: true) - } -} - -extension NoticeDetailViewController { - private func inputBind() { - viewModel.input.fetchNoticeDetail.onNext(()) - } - - private func outputBind() { - viewModel.output.dataSource - .bind(to: collectionView.rx.items(dataSource: createDataSource())) - .disposed(by: disposeBag) - - viewModel.output.imageSizes - .skip(1) - .subscribe(onNext: { [weak self] _ in - self?.indicator.stopAnimating() - }) - .disposed(by: disposeBag) - } - - private func createDataSource() -> RxCollectionViewSectionedReloadDataSource { - let dataSource = RxCollectionViewSectionedReloadDataSource(configureCell: { (_, collectionView, indexPath, item) -> UICollectionViewCell in - guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "NoticeCollectionViewCell", for: indexPath) as? NoticeCollectionViewCell else { return UICollectionViewCell() } - cell.update(model: item) - return cell - - }, configureSupplementaryView: { (dataSource, collectionView, elementKind, indexPath) -> UICollectionReusableView in - switch elementKind { - case UICollectionView.elementKindSectionHeader: - if let header = collectionView.dequeueReusableSupplementaryView(ofKind: elementKind, - withReuseIdentifier: "NoticeDetailHeaderView", - for: indexPath) as? NoticeDetailHeaderView { - header.update(model: dataSource[indexPath.section].model) - return header - - } else { return UICollectionReusableView() } - - default: - return UICollectionReusableView() - } - }) - return dataSource - } - - private func configureUI() { - self.view.backgroundColor = DesignSystemAsset.GrayColor.gray100.color - closeButton.setImage(DesignSystemAsset.Navigation.crossClose.image, for: .normal) - - let attributedString: NSAttributedString = NSAttributedString( - string: "공지사항", - attributes: [.font: DesignSystemFontFamily.Pretendard.medium.font(size: 16), - .foregroundColor: DesignSystemAsset.GrayColor.gray900.color, - .kern: -0.5] - ) - self.titleStringLabel.attributedText = attributedString - - collectionView.register(UINib(nibName: "NoticeCollectionViewCell", bundle: CommonFeatureResources.bundle), - forCellWithReuseIdentifier: "NoticeCollectionViewCell") - collectionView.rx.setDelegate(self).disposed(by: disposeBag) - collectionView.bounces = false - - self.indicator.type = .circleStrokeSpin - self.indicator.color = DesignSystemAsset.PrimaryColor.point.color - self.indicator.startAnimating() - } -} - -extension NoticeDetailViewController: UICollectionViewDelegate, UICollectionViewDelegateFlowLayout { - public func collectionView(_ collectionView: UICollectionView, - layout collectionViewLayout: UICollectionViewLayout, - sizeForItemAt indexPath: IndexPath) -> CGSize { - let imageSize: CGSize = viewModel.output.imageSizes.value[indexPath.row] - let width: CGFloat = APP_WIDTH() - let height: CGFloat = (imageSize.height * width) / max(1.0, imageSize.width) - return CGSize(width: width, height: height) - } - - public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets { - let sideSpace: CGFloat = 20 - return UIEdgeInsets(top: sideSpace, left: 0, bottom: 0, right: 0) - } - - public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat { - return 20 - } - - public func collectionView(_ collectionView: UICollectionView, - layout collectionViewLayout: UICollectionViewLayout, - minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { - return 20 - } - - public func collectionView(_ collectionView: UICollectionView, - layout collectionViewLayout: UICollectionViewLayout, - referenceSizeForHeaderInSection section: Int) -> CGSize{ - let model: FetchNoticeEntity = viewModel.output.dataSource.value[section].model - return CGSize(width: APP_WIDTH(), height: NoticeDetailHeaderView.getCellHeight(model: model)) - } -} diff --git a/Projects/Features/StorageFeature/Sources/ViewControllers/NoticeViewController.swift b/Projects/Features/StorageFeature/Sources/ViewControllers/NoticeViewController.swift deleted file mode 100644 index c5b8e8af5..000000000 --- a/Projects/Features/StorageFeature/Sources/ViewControllers/NoticeViewController.swift +++ /dev/null @@ -1,105 +0,0 @@ -// -// NoticeViewController.swift -// StorageFeature -// -// Created by KTH on 2023/04/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import Utility -import RxSwift -import RxCocoa -import DesignSystem -import NVActivityIndicatorView -import CommonFeature - -public class NoticeViewController: UIViewController, ViewControllerFromStoryBoard { - - @IBOutlet weak var titleStringLabel: UILabel! - @IBOutlet weak var tableView: UITableView! - @IBOutlet weak var backButton: UIButton! - @IBOutlet weak var indicator: NVActivityIndicatorView! - - var viewModel: NoticeViewModel! - var noticeDetailComponent: NoticeDetailComponent! - var disposeBag = DisposeBag() - - public override func viewDidLoad() { - super.viewDidLoad() - configureUI() - bind() - } - - public static func viewController( - viewModel: NoticeViewModel, - noticeDetailComponent: NoticeDetailComponent - ) -> NoticeViewController { - let viewController = NoticeViewController.viewController(storyBoardName: "Storage", bundle: Bundle.module) - viewController.viewModel = viewModel - viewController.noticeDetailComponent = noticeDetailComponent - return viewController - } - - @IBAction func backButtonAction(_ sender: Any) { - self.navigationController?.popViewController(animated: true) - } -} - -extension NoticeViewController { - private func bind() { - tableView.rx.setDelegate(self).disposed(by: disposeBag) - - viewModel.output.dataSource - .skip(1) - .do(onNext: { [weak self] (model) in - self?.indicator.stopAnimating() - let space = APP_HEIGHT() - 48 - STATUS_BAR_HEGHIT() - SAFEAREA_BOTTOM_HEIGHT() - let height = space / 3 * 2 - let warningView = WarningView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: height)) - warningView.text = "공지사항이 없습니다." - self?.tableView.tableFooterView = model.isEmpty ? warningView : UIView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: 56)) - }) - .bind(to: tableView.rx.items) { (tableView, index, model) -> UITableViewCell in - let indexPath: IndexPath = IndexPath(row: index, section: 0) - guard let cell = tableView.dequeueReusableCell(withIdentifier: "NoticeListCell", for: indexPath) as? NoticeListCell else{ - return UITableViewCell() - } - cell.update(model: model) - return cell - }.disposed(by: disposeBag) - - tableView.rx.itemSelected - .withLatestFrom(viewModel.output.dataSource) { ($0, $1) } - .subscribe(onNext: { [weak self] (indexPath, model) in - guard let self = self else { return } - self.tableView.deselectRow(at: indexPath, animated: true) - let viewController = self.noticeDetailComponent.makeView(model: model[indexPath.row]) - viewController.modalPresentationStyle = .overFullScreen - self.present(viewController, animated: true) - }).disposed(by: disposeBag) - } - - private func configureUI() { - self.view.backgroundColor = DesignSystemAsset.GrayColor.gray100.color - self.tableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: 56)) - self.tableView.scrollIndicatorInsets = UIEdgeInsets(top: 0, left: 0, bottom: 56, right: 0) - self.backButton.setImage(DesignSystemAsset.Navigation.back.image, for: .normal) - let attributedString: NSAttributedString = NSAttributedString( - string: "공지사항", - attributes: [.font: DesignSystemFontFamily.Pretendard.medium.font(size: 16), - .foregroundColor: DesignSystemAsset.GrayColor.gray900.color, - .kern: -0.5] - ) - self.titleStringLabel.attributedText = attributedString - self.indicator.type = .circleStrokeSpin - self.indicator.color = DesignSystemAsset.PrimaryColor.point.color - self.indicator.startAnimating() - } -} - -extension NoticeViewController: UITableViewDelegate { - public func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { - return UITableView.automaticDimension - } -} diff --git a/Projects/Features/StorageFeature/Sources/ViewControllers/QnaContentViewController.swift b/Projects/Features/StorageFeature/Sources/ViewControllers/QnaContentViewController.swift deleted file mode 100644 index f1e97b43e..000000000 --- a/Projects/Features/StorageFeature/Sources/ViewControllers/QnaContentViewController.swift +++ /dev/null @@ -1,126 +0,0 @@ -// -// QnaContentViewController.swift -// StorageFeature -// -// Created by yongbeomkwak on 2023/01/29. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import Utility -import RxSwift -import RxCocoa -import RxRelay -import CommonFeature - -public final class QnaContentViewController: UIViewController, ViewControllerFromStoryBoard { - @IBOutlet weak var tableView: UITableView! - - var viewModel:QnaContentViewModel! - - public override func viewDidLoad() { - super.viewDidLoad() - configureUI() - } - - public override func viewDidAppear(_ animated: Bool) { - super.viewDidAppear(animated) - navigationController?.interactivePopGestureRecognizer?.delegate = nil //스와이프로 뒤로가기 - } - - public static func viewController(viewModel: QnaContentViewModel) -> QnaContentViewController { - let viewController = QnaContentViewController.viewController(storyBoardName: "Storage", bundle: Bundle.module) - viewController.viewModel = viewModel - return viewController - } -} - -extension QnaContentViewController{ - private func configureUI(){ - tableView.dataSource = self - tableView.delegate = self - let space = APP_HEIGHT() - 106 - STATUS_BAR_HEGHIT() - SAFEAREA_BOTTOM_HEIGHT() - let height = space / 3 * 2 - let warningView = WarningView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: height)) - warningView.text = "자주 묻는 질문이 없습니다." - tableView.tableFooterView = viewModel.dataSource.isEmpty ? warningView : UIView(frame: CGRect(x: 0, y: 0, width: APP_WIDTH(), height: 56)) - tableView.scrollIndicatorInsets = UIEdgeInsets(top: 0, left: 0, bottom: 56, right: 0) - tableView.reloadData() - } - - private func scrollToBottom(indexPath:IndexPath){ - DispatchQueue.main.async { - self.tableView.scrollToRow(at: indexPath, at: .middle, animated: true) - } - } -} - -extension QnaContentViewController:UITableViewDataSource{ - public func numberOfSections(in tableView: UITableView) -> Int { - return viewModel.dataSource.count - } - - public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - var data = viewModel.dataSource[section] - var count:Int = 0 - - if data.isOpen { - count = 2 - }else{ - count = 1 - } - return count - } - - public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - guard let Qcell = tableView.dequeueReusableCell(withIdentifier: "QuestionTableViewCell", for: indexPath) as? QuestionTableViewCell else{ - return UITableViewCell() - } - guard let Acell = tableView.dequeueReusableCell(withIdentifier: "AnswerTableViewCell", for: indexPath) as? AnswerTableViewCell else { - return UITableViewCell() - } - - var data = viewModel.dataSource - - Qcell.update(model: data[indexPath.section]) - Qcell.selectionStyle = .none // 선택 시 깜빡임 방지 - Acell.update(model: data[indexPath.section]) - Acell.selectionStyle = .none - - // 왜 Row는 인덱스 개념이다 0 부터 시작?? - if indexPath.row == 0 { - return Qcell - }else { - return Acell - } - } -} - -extension QnaContentViewController:UITableViewDelegate{ - - public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - - tableView.deselectRow(at: indexPath, animated: true) - - var data = viewModel.dataSource - - data[indexPath.section].isOpen = !data[indexPath.section].isOpen - - viewModel.dataSource = data - - tableView.reloadSections([indexPath.section], with: .none) - - - let next = IndexPath(row: 1, section: indexPath.section ) //row 1이 답변 쪽 - - - if data[indexPath.section].isOpen - { - self.scrollToBottom(indexPath: next) - } - } - - public func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { - return UITableView.automaticDimension - } -} diff --git a/Projects/Features/StorageFeature/Sources/ViewControllers/QnaViewController.swift b/Projects/Features/StorageFeature/Sources/ViewControllers/QnaViewController.swift deleted file mode 100644 index 949164ef2..000000000 --- a/Projects/Features/StorageFeature/Sources/ViewControllers/QnaViewController.swift +++ /dev/null @@ -1,141 +0,0 @@ -// -// QnAViewController.swift -// StorageFeature -// -// Created by yongbeomkwak on 2023/01/29. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import Utility -import Tabman -import Pageboy -import DesignSystem -import RxSwift -import NVActivityIndicatorView - -public final class QnaViewController: TabmanViewController, ViewControllerFromStoryBoard { - - - @IBOutlet weak var backButton: UIButton! - @IBOutlet weak var titleLabel: UILabel! - @IBOutlet weak var tabBarView: UIView! - @IBOutlet weak var activityIndicator: NVActivityIndicatorView! - - @IBAction func pressBackAction(_ sender: UIButton) { - self.navigationController?.popViewController(animated: true) - } - - public override func viewDidLoad() { - super.viewDidLoad() - configureUI() - bindRx() - } - - public override func viewDidAppear(_ animated: Bool) { - super.viewDidAppear(animated) - navigationController?.interactivePopGestureRecognizer?.delegate = nil //스와이프로 뒤로가기 - } - - var disposeBag = DisposeBag() - var viewModel:QnaViewModel! - var qnaContentComponent:QnaContentComponent! - lazy var input = QnaViewModel.Input() - lazy var output = viewModel.transform(from: input) - - var viewControllers:[UIViewController] = [] - - public static func viewController(viewModel:QnaViewModel,qnaContentComponent:QnaContentComponent) -> QnaViewController { - let viewController = QnaViewController.viewController(storyBoardName: "Storage", bundle: Bundle.module) - viewController.viewModel = viewModel - viewController.qnaContentComponent = qnaContentComponent - return viewController - } -} - -extension QnaViewController { - - private func configureUI(){ - self.backButton.setImage(DesignSystemAsset.Navigation.back.image, for: .normal) - self.titleLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) - self.activityIndicator.type = .circleStrokeSpin - self.activityIndicator.color = DesignSystemAsset.PrimaryColor.point.color - self.activityIndicator.startAnimating() - - //탭바 설정 - self.dataSource = self - let bar = TMBar.ButtonBar() - - // 배경색 - bar.backgroundView.style = .flat(color: colorFromRGB(0xF0F3F6)) - - // 간격 설정 - bar.layout.contentInset = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20) - bar.layout.contentMode = .intrinsic - bar.layout.transitionStyle = .progressive - - // 버튼 글씨 커스텀 - bar.buttons.customize { (button) in - button.tintColor = DesignSystemAsset.GrayColor.gray400.color - button.selectedTintColor = DesignSystemAsset.GrayColor.gray900.color - button.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) - button.selectedFont = DesignSystemFontFamily.Pretendard.bold.font(size: 16) - } - - // indicator - bar.indicator.weight = .custom(value: 2) - bar.indicator.tintColor = DesignSystemAsset.PrimaryColor.point.color - bar.indicator.overscrollBehavior = .compress - addBar(bar, dataSource: self, at: .custom(view: tabBarView,layout: nil)) - - //회색 구분선 추가 - bar.layer.addBorder([.bottom], color:DesignSystemAsset.GrayColor.gray300.color.withAlphaComponent(0.4), height: 1) - } - - func bindRx(){ - - output.dataSource - .skip(1) - .do(onNext: { [weak self] (_, _) in - self?.activityIndicator.stopAnimating() - }) - .subscribe { [weak self] (categories, qna) in - guard let self = self else{ - return - } - guard let comp = self.qnaContentComponent else{ - return - } - - self.viewControllers = categories.enumerated().map { (i,c) in - if i == 0 { - return comp.makeView(dataSource: qna ) - }else { - return comp.makeView(dataSource: qna.filter({ - $0.category.replacingOccurrences(of: " ", with: "") == c.category.replacingOccurrences(of: " ", with: "") - })) - } - } - self.reloadData() - }.disposed(by: disposeBag) - } -} - -extension QnaViewController:PageboyViewControllerDataSource, TMBarDataSource { - public func numberOfViewControllers(in pageboyViewController: Pageboy.PageboyViewController) -> Int { - DEBUG_LOG(self.viewControllers.count) - return self.viewControllers.count - } - - public func viewController(for pageboyViewController: Pageboy.PageboyViewController, at index: Pageboy.PageboyViewController.PageIndex) -> UIViewController? { - viewControllers[index] - } - - public func defaultPage(for pageboyViewController: Pageboy.PageboyViewController) -> Pageboy.PageboyViewController.Page? { - nil - } - - public func barItem(for bar: Tabman.TMBar, at index: Int) -> Tabman.TMBarItemable { - return TMBarItem(title: output.dataSource.value.0[index].category) - } -} diff --git a/Projects/Features/StorageFeature/Sources/ViewControllers/QuestionViewController.swift b/Projects/Features/StorageFeature/Sources/ViewControllers/QuestionViewController.swift deleted file mode 100644 index f569eb083..000000000 --- a/Projects/Features/StorageFeature/Sources/ViewControllers/QuestionViewController.swift +++ /dev/null @@ -1,324 +0,0 @@ -// -// QuestionViewController.swift -// StorageFeature -// -// Created by yongbeomkwak on 2023/03/04. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import DesignSystem -import RxSwift -import Utility -import BaseFeature -import DataMappingModule -import MessageUI -import CommonFeature -import SafariServices - -public final class QuestionViewController: BaseViewController,ViewControllerFromStoryBoard { - - @IBOutlet weak var titleLabel: UILabel! - @IBOutlet weak var closeButton: UIButton! - @IBOutlet weak var descriptionLabel: UILabel! - @IBOutlet weak var bugReportSuperView: UIView! - @IBOutlet weak var bugReportButton: UIButton! - @IBOutlet weak var bugReportCheckImageView: UIImageView! - - @IBOutlet weak var suggestFunctionSuperView: UIView! - @IBOutlet weak var suggestFunctionButton: UIButton! - @IBOutlet weak var suggestFunctionCheckImageView: UIImageView! - - @IBOutlet weak var addSongSuperView: UIView! - @IBOutlet weak var addSongButton: UIButton! - @IBOutlet weak var addSongCheckImageView: UIImageView! - - @IBOutlet weak var editSongSuperView: UIView! - @IBOutlet weak var editSongButton: UIButton! - @IBOutlet weak var editSongCheckImageView: UIImageView! - - @IBOutlet weak var wakMusicFeedbackSuperView: UIView! - @IBOutlet weak var wakMusicFeedbackButton: UIButton! - @IBOutlet weak var wakMusicFeedbackCheckImageView: UIImageView! - @IBOutlet weak var nextButton: UIButton! - - let selectedColor:UIColor = DesignSystemAsset.PrimaryColor.decrease.color - let unSelectedTextColor:UIColor = DesignSystemAsset.GrayColor.gray900.color - let unSelectedColor:UIColor = DesignSystemAsset.GrayColor.gray200.color - let disposeBag = DisposeBag() - var viewModel:QuestionViewModel! - lazy var input = QuestionViewModel.Input() - lazy var output = viewModel.transform(from: input) - - var suggestFunctionComponent:SuggestFunctionComponent! - var wakMusicFeedbackComponent: WakMusicFeedbackComponent! - var askSongComponent: AskSongComponent! - var bugReportComponent: BugReportComponent! - - deinit { - DEBUG_LOG("❌ \(Self.self) 소멸") - } - - public override func viewDidLoad() { - super.viewDidLoad() - configureUI() - bindRx() - } - - public static func viewController( - viewModel:QuestionViewModel, - suggestFunctionComponent: SuggestFunctionComponent, - wakMusicFeedbackComponent: WakMusicFeedbackComponent, - askSongComponent: AskSongComponent, - bugReportComponent: BugReportComponent - ) -> QuestionViewController { - let viewController = QuestionViewController.viewController(storyBoardName: "Storage", bundle: Bundle.module) - viewController.viewModel = viewModel - viewController.suggestFunctionComponent = suggestFunctionComponent - viewController.wakMusicFeedbackComponent = wakMusicFeedbackComponent - viewController.askSongComponent = askSongComponent - viewController.bugReportComponent = bugReportComponent - return viewController - } -} - -extension QuestionViewController { - private func configureUI(){ - self.titleLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) - self.titleLabel.textColor = DesignSystemAsset.GrayColor.gray900.color - self.titleLabel.text = "문의하기" - self.titleLabel.setTextWithAttributes(kernValue: -0.5) - - self.closeButton.setImage(DesignSystemAsset.Navigation.crossClose.image, for: .normal) - - self.descriptionLabel.text = "어떤 것 관련해서 문의주셨나요?" - self.descriptionLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 20) - self.descriptionLabel.textColor = DesignSystemAsset.GrayColor.gray900.color - self.descriptionLabel.setTextWithAttributes(kernValue: -0.5) - - self.nextButton.layer.cornerRadius = 12 - self.nextButton.clipsToBounds = true - self.nextButton.isEnabled = false - self.nextButton.setBackgroundColor(DesignSystemAsset.PrimaryColor.point.color, for: .normal) - self.nextButton.setBackgroundColor(DesignSystemAsset.GrayColor.gray300.color, for: .disabled) - self.nextButton.setAttributedTitle( - NSMutableAttributedString( - string: "다음", - attributes: [ - .font: DesignSystemFontFamily.Pretendard.medium.font(size: 18), - .foregroundColor: DesignSystemAsset.GrayColor.gray25.color, - .kern: -0.5 - ] - ), for: .normal - ) - - let superViews:[UIView] = [self.bugReportSuperView, - self.suggestFunctionSuperView, - self.addSongSuperView, - self.editSongSuperView, - self.wakMusicFeedbackSuperView] - - let buttons:[UIButton] = [self.bugReportButton, - self.suggestFunctionButton, - self.addSongButton, - self.editSongButton, - self.wakMusicFeedbackButton] - - let imageViews:[UIImageView] = [self.bugReportCheckImageView, - self.suggestFunctionCheckImageView, - self.addSongCheckImageView, - self.editSongCheckImageView, - self.wakMusicFeedbackCheckImageView] - - for i in 0.. Int in 0 }, - suggestFunctionButton.rx.tap.map { _ -> Int in 1 }, - addSongButton.rx.tap.map { _ -> Int in 2 }, - editSongButton.rx.tap.map { _ -> Int in 3 }, - wakMusicFeedbackButton.rx.tap.map{ _ -> Int in 4 } - ) - .bind(to: input.selectedIndex) - .disposed(by: disposeBag) - - output.mailSource - .filter { $0 != .unknown } - .map { $0.rawValue } - .subscribe(onNext: { [weak self] (index: Int) in - guard let self = self else{ - return - } - - if !self.nextButton.isEnabled { - self.nextButton.isEnabled = true - } - let superViews:[UIView] = [self.bugReportSuperView, - self.suggestFunctionSuperView, - self.addSongSuperView, - self.editSongSuperView, - self.wakMusicFeedbackSuperView] - - let buttons:[UIButton] = [self.bugReportButton, - self.suggestFunctionButton, - self.addSongButton, - self.editSongButton, - self.wakMusicFeedbackButton] - - let imageViews:[UIImageView] = [self.bugReportCheckImageView, - self.suggestFunctionCheckImageView, - self.addSongCheckImageView, - self.editSongCheckImageView, - self.wakMusicFeedbackCheckImageView] - - for i in 0.. Mail 앱 > 계정을 설정해주세요.", - cancelButtonIsHidden: true, - confirmButtonText: "확인" - ) - self.showPanModal(content: vc) - } - } -} - -extension QuestionViewController : MFMailComposeViewControllerDelegate { - public func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) { - controller.dismiss(animated: true) { - if let error = error { - self.input.mailComposeResult.onNext(.failure(error)) - }else{ - self.input.mailComposeResult.onNext(.success(result)) - } - } - } -} diff --git a/Projects/Features/StorageFeature/Sources/ViewControllers/RequestViewController.swift b/Projects/Features/StorageFeature/Sources/ViewControllers/RequestViewController.swift deleted file mode 100644 index 4bbd919f9..000000000 --- a/Projects/Features/StorageFeature/Sources/ViewControllers/RequestViewController.swift +++ /dev/null @@ -1,228 +0,0 @@ -// -// RequestViewController.swift -// StorageFeature -// -// Created by yongbeomkwak on 2023/01/28. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import Utility -import DesignSystem -import CommonFeature -import RxSwift - -public final class RequestViewController: UIViewController, ViewControllerFromStoryBoard { - - @IBOutlet weak var backButton: UIButton! - @IBOutlet weak var titleLabel: UILabel! - - @IBOutlet weak var questionImageview: UIImageView! - @IBOutlet weak var questionButton: UIButton! - @IBOutlet weak var questionSuperView: UIView! - - @IBOutlet weak var qnaSuperView: UIView! - @IBOutlet weak var qnaSuperImageview: UIImageView! - @IBOutlet weak var qnaButton: UIButton! - - @IBOutlet weak var noticeSuperView: UIView! - @IBOutlet weak var noticeButton: UIButton! - @IBOutlet weak var noticeImageView: UIImageView! - - @IBOutlet weak var serviceSuperView: UIView! - @IBOutlet weak var serviceButton: UIButton! - @IBOutlet weak var serviceImageView: UIImageView! - - //폭탄 - @IBOutlet weak var bombSuperView: UIView! - @IBOutlet weak var bombButton: UIButton! - @IBOutlet weak var bombImageView: UIImageView! - - @IBOutlet weak var dotLabel: UILabel! - @IBOutlet weak var descriptionLabel: UILabel! - - @IBOutlet weak var fakeViewHeight: NSLayoutConstraint! - @IBOutlet weak var withdrawButton: UIButton! - - @IBAction func pressBackAction(_ sender: UIButton) { - self.navigationController?.popViewController(animated: true) - } - - @IBAction func moveQnaAction(_ sender: UIButton) { - let vc = qnaComponent.makeView() - self.navigationController?.pushViewController(vc, animated: true) - } - - @IBAction func moveQuestionAction(_ sender: Any) { - let vc = questionComponent.makeView().wrapNavigationController - vc.modalPresentationStyle = .overFullScreen - self.present(vc, animated: true) - } - - @IBAction func movenoticeAction(_ sender: Any) { - let viewController = noticeComponent.makeView() - self.navigationController?.pushViewController(viewController, animated: true) - } - - @IBAction func presswithDrawAction(_ sender: UIButton) { - let secondConfirmVc = TextPopupViewController.viewController(text: "정말 탈퇴하시겠습니까?", cancelButtonIsHidden: false,completion: { - // 회원탈퇴 작업 - self.input.pressWithdraw.onNext(()) - }) - let firstConfirmVc = TextPopupViewController.viewController(text: "회원탈퇴 신청을 하시겠습니까?", cancelButtonIsHidden: false,completion: { - self.showPanModal(content: secondConfirmVc) - }) - self.showPanModal(content: firstConfirmVc) - } - - var viewModel:RequestViewModel! - lazy var input = RequestViewModel.Input() - lazy var output = viewModel.transform(from: input) - - var qnaComponent:QnaComponent! - var questionComponent:QuestionComponent! - var containSongsComponent: ContainSongsComponent! - var noticeComponent: NoticeComponent! - var serviceInfoComponent: ServiceInfoComponent! - - var disposeBag = DisposeBag() - deinit { DEBUG_LOG("❌ \(Self.self) Deinit") } - - public override func viewDidLoad() { - super.viewDidLoad() - configureUI() - bindRx() - } - - public override func viewDidAppear(_ animated: Bool) { - super.viewDidAppear(animated) - navigationController?.interactivePopGestureRecognizer?.delegate = nil //스와이프로 뒤로가기 - } - - public static func viewController( - viewModel:RequestViewModel, - qnaComponent: QnaComponent, - questionComponent: QuestionComponent, - containSongsComponent: ContainSongsComponent, - noticeComponent: NoticeComponent, - serviceInfoComponent: ServiceInfoComponent - ) -> RequestViewController { - let viewController = RequestViewController.viewController(storyBoardName: "Storage", bundle: Bundle.module) - viewController.viewModel = viewModel - viewController.qnaComponent = qnaComponent - viewController.questionComponent = questionComponent - viewController.containSongsComponent = containSongsComponent - viewController.noticeComponent = noticeComponent - viewController.serviceInfoComponent = serviceInfoComponent - return viewController - } -} - -extension RequestViewController{ - - private func configureUI(){ - self.backButton.setImage(DesignSystemAsset.Navigation.back.image, for: .normal) - self.titleLabel.text = "건의사항" - self.titleLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) - self.titleLabel.setTextWithAttributes(kernValue: -0.5) - - let buttons: [UIButton] = [self.questionButton, self.qnaButton, self.noticeButton, self.serviceButton, self.bombButton] - let superViews: [UIView] = [self.questionSuperView, self.qnaSuperView, self.noticeSuperView, self.serviceSuperView, self.bombSuperView] - let imageViews: [UIImageView] = [self.questionImageview, self.qnaSuperImageview, self.noticeImageView, self.serviceImageView, self.bombImageView] - - for i in 0.. StorageViewController { - let viewController = StorageViewController.viewController(storyBoardName: "Storage", bundle: Bundle.module) - viewController.signInComponent = signInComponent - viewController.afterLoginComponent = afterLoginComponent + override public func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + navigationController?.interactivePopGestureRecognizer?.delegate = self + } + + override public func viewDidDisappear(_ animated: Bool) { + super.viewDidDisappear(animated) + navigationController?.interactivePopGestureRecognizer?.delegate = nil + } + + public static func viewController( + reactor: Reactor, + listStorageComponent: ListStorageComponent, + multiPurposePopupFactory: MultiPurposePopupFactory, + likeStorageComponent: LikeStorageComponent, + textPopupFactory: TextPopupFactory, + signInFactory: SignInFactory + ) -> StorageViewController { + let viewController = StorageViewController(reactor: reactor) + + viewController.listStorageComponent = listStorageComponent + viewController.multiPurposePopupFactory = multiPurposePopupFactory + viewController.likeStorageComponent = likeStorageComponent + viewController.viewControllers = [listStorageComponent.makeView(), likeStorageComponent.makeView()] + viewController.textPopupFactory = textPopupFactory + viewController.signInFactory = signInFactory return viewController } + + /// 탭맨 페이지 변경 감지 함수 + override public func pageboyViewController( + _ pageboyViewController: PageboyViewController, + didScrollToPageAt index: TabmanViewController.PageIndex, + direction: PageboyViewController.NavigationDirection, + animated: Bool + ) { + self.reactor?.action.onNext(.switchTab(index)) + // 탭 이동 간 플로팅 버튼 위치 조정 + NotificationCenter.default.post( + name: .shouldMovePlaylistFloatingButton, + object: index == 0 ? + PlaylistFloatingButtonPosition.top : + PlaylistFloatingButtonPosition.default + ) + } + + /// 탭맨 탭 터치 이벤트 감지 함수 + override func bar(_ bar: any TMBar, didRequestScrollTo index: PageboyViewController.PageIndex) { + super.bar(bar, didRequestScrollTo: index) + + guard let viewController = viewControllers[safe: index] else { return } + switch viewController { + case is ListStorageViewController: + LogManager.analytics(StorageAnalyticsLog.clickStorageTabbarTab(tab: .myPlaylist)) + case is LikeStorageViewController: + LogManager.analytics(StorageAnalyticsLog.clickStorageTabbarTab(tab: .myLikeList)) + default: + break + } + } } -extension StorageViewController{ - private func configureUI() { - bindRx() +extension StorageViewController { + func bind(reactor: Reactor) { + bindAction(reactor: reactor) + bindState(reactor: reactor) } - - private func bindRx() { - Utility.PreferenceManager.$userInfo - .map { $0 != nil } - .subscribe(onNext: { [weak self] (isLogin) in - guard let self = self else{ + + func bindState(reactor: Reactor) { + reactor.state.map(\.isEditing) + .distinctUntilChanged() + .bind(with: self) { owner, isEditing in + owner.storageView.updateIsHiddenEditButton(isHidden: isEditing) + owner.isScrollEnabled = isEditing ? false : true + owner.bar.isUserInteractionEnabled = isEditing ? false : true + } + .disposed(by: disposeBag) + + reactor.pulse(\.$showLoginAlert) + .compactMap { $0 } + .bind(with: self, onNext: { owner, entry in + guard let vc = owner.textPopupFactory.makeView( + text: LocalizationStrings.needLoginWarning, + cancelButtonIsHidden: false, + confirmButtonText: nil, + cancelButtonText: nil, + completion: { + let log = CommonAnalyticsLog.clickLoginButton(entry: entry) + LogManager.analytics(log) + + let loginVC = owner.signInFactory.makeView() + loginVC.modalPresentationStyle = .fullScreen + owner.present(loginVC, animated: true) + }, + cancelCompletion: {} + ) as? TextPopupViewController else { return } - DEBUG_LOG(isLogin) - - if isLogin{ - if let _ = self.children.first as? LoginViewController { - self.remove(asChildViewController: self.bfLoginView) - } - self.add(asChildViewController: self.afLoginView) - - }else{ - if let _ = self.children.first as? AfterLoginViewController { - self.remove(asChildViewController: self.afLoginView) - } - self.add(asChildViewController:self.bfLoginView) + owner.showBottomSheet(content: vc) + }) + .disposed(by: disposeBag) + } + + func bindAction(reactor: Reactor) { + storageView.rx.editButtonDidTap + .do(onNext: { + let tabIndex = reactor.currentState.tabIndex + switch tabIndex { + case 0: LogManager.analytics(StorageAnalyticsLog.clickMyPlaylistEditButton) + case 1: LogManager.analytics(StorageAnalyticsLog.clickMyLikeListEditButton) + default: break } - }).disposed(by: disposeBag) + }) + .map { Reactor.Action.editButtonDidTap } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + storageView.rx.saveButtonDidTap + .map { Reactor.Action.saveButtonTap } + .bind(to: reactor.action) + .disposed(by: disposeBag) } } -extension StorageViewController { +private extension StorageViewController { + func configureUI() { + self.navigationController?.setNavigationBarHidden(true, animated: false) + + // 탭바 설정 + self.dataSource = self + + // 배경색 + bar.backgroundView.style = .flat(color: .clear) + + // 간격 설정 + bar.layout.contentInset = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20) + + bar.layout.contentMode = .intrinsic + bar.layout.transitionStyle = .progressive + bar.layout.interButtonSpacing = 24 + + // 버튼 글씨 커스텀 + bar.buttons.customize { button in + button.tintColor = DesignSystemAsset.BlueGrayColor.blueGray400.color + button.selectedTintColor = DesignSystemAsset.BlueGrayColor.blueGray900.color + button.font = .WMFontSystem.t5(weight: .medium).font + button.selectedFont = .WMFontSystem.t5(weight: .bold).font + } + + // indicator + bar.indicator.weight = .custom(value: 2) + bar.indicator.tintColor = DesignSystemAsset.PrimaryColor.point.color + bar.indicator.overscrollBehavior = .compress + addBar(bar, dataSource: self, at: .custom(view: storageView.tabBarView, layout: nil)) + } +} + +extension StorageViewController: PageboyViewControllerDataSource, TMBarDataSource { + public func numberOfViewControllers(in pageboyViewController: Pageboy.PageboyViewController) -> Int { + self.viewControllers.count + } + + public func viewController( + for pageboyViewController: Pageboy.PageboyViewController, + at index: Pageboy.PageboyViewController.PageIndex + ) -> UIViewController? { + return viewControllers[safe: index] + } + + public func defaultPage(for pageboyViewController: Pageboy.PageboyViewController) -> Pageboy.PageboyViewController + .Page? { + nil + } + + public func barItem(for bar: Tabman.TMBar, at index: Int) -> Tabman.TMBarItemable { + switch index { + case 0: + return TMBarItem(title: "내 리스트") + case 1: + return TMBarItem(title: "좋아요") + default: + let title = "Page \(index)" + return TMBarItem(title: title) + } + } +} + +extension StorageViewController: EqualHandleTappedType { + func scrollToTop() { + let current: Int = self.currentIndex ?? 0 + guard self.viewControllers.count > current else { return } + if let listVC = self.viewControllers[current] as? ListStorageViewController { + listVC.scrollToTop() + } else if let likeVC = self.viewControllers[current] as? LikeStorageViewController { + likeVC.scrollToTop() + } + } + public func equalHandleTapped() { let viewControllersCount: Int = self.navigationController?.viewControllers.count ?? 0 if viewControllersCount > 1 { self.navigationController?.popToRootViewController(animated: true) - }else{ - if let nonLogin = children.first as? LoginViewController{ - nonLogin.scrollToTop() - }else if let isLogin = children.first as? AfterLoginViewController{ - isLogin.scrollToTop() - } + } else { + scrollToTop() } } } + +extension StorageViewController: UIGestureRecognizerDelegate { + public func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { + return false + } +} diff --git a/Projects/Features/StorageFeature/Sources/ViewControllers/SuggestFunctionViewController.swift b/Projects/Features/StorageFeature/Sources/ViewControllers/SuggestFunctionViewController.swift deleted file mode 100644 index b086f050b..000000000 --- a/Projects/Features/StorageFeature/Sources/ViewControllers/SuggestFunctionViewController.swift +++ /dev/null @@ -1,286 +0,0 @@ -// -// SuggestFunctionViewController.swift -// StorageFeature -// -// Created by yongbeomkwak on 2023/03/05. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import Utility -import DesignSystem -import RxSwift -import RxKeyboard -import CommonFeature - -public final class SuggestFunctionViewController: UIViewController,ViewControllerFromStoryBoard { - - @IBOutlet weak var titleLabel: UILabel! - @IBOutlet weak var closeButton: UIButton! - @IBOutlet weak var descriptionLabel1: UILabel! - @IBOutlet weak var textView: GrowingTextView! - @IBOutlet weak var baseLineView: UIView! - @IBOutlet weak var descriptionLabel2: UILabel! - @IBOutlet weak var mobileAppSuperView: UIView! - @IBOutlet weak var mobileAppButton: UIButton! - @IBOutlet weak var mobileAppCheckImageView: UIImageView! - @IBOutlet weak var webSiteSuperView: UIView! - @IBOutlet weak var webSiteButton: UIButton! - @IBOutlet weak var webSiteCheckImageView: UIImageView! - @IBOutlet weak var previousButton: UIButton! - @IBOutlet weak var completionButton: UIButton! - - let unPointColor:UIColor = DesignSystemAsset.GrayColor.gray200.color - let pointColor:UIColor = DesignSystemAsset.PrimaryColor.decrease.color - let unSelectedTextColor:UIColor = DesignSystemAsset.GrayColor.gray900.color - let textViewPlaceHolder:String = "내 답변" - - let disposeBag = DisposeBag() - var viewModel:SuggestFunctionViewModel! - lazy var input = SuggestFunctionViewModel.Input() - lazy var output = viewModel.transform(from: input) - - public override func viewDidLoad() { - super.viewDidLoad() - configureUI() - hideKeyboardWhenTappedAround() - responseViewbyKeyboard() - bindRx() - bindbuttonEvent() - } - - public static func viewController(viewModel: SuggestFunctionViewModel) -> SuggestFunctionViewController { - let viewController = SuggestFunctionViewController.viewController(storyBoardName: "Storage", bundle: Bundle.module) - viewController.viewModel = viewModel - return viewController - } -} - -extension SuggestFunctionViewController { - private func configureUI(){ - titleLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) - titleLabel.textColor = DesignSystemAsset.GrayColor.gray900.color - titleLabel.setTextWithAttributes(kernValue: -0.5) - - closeButton.setImage(DesignSystemAsset.Navigation.crossClose.image, for: .normal) - - descriptionLabel1.text = "제안해 주고 싶은 기능에 대해 설명해 주세요." - descriptionLabel1.font = DesignSystemFontFamily.Pretendard.medium.font(size: 18) - descriptionLabel1.textColor = DesignSystemAsset.GrayColor.gray900.color - descriptionLabel1.setTextWithAttributes(kernValue: -0.5) - - textView.delegate = self - textView.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) - textView.placeholder = textViewPlaceHolder - textView.placeholderColor = DesignSystemAsset.GrayColor.gray400.color - textView.textColor = DesignSystemAsset.GrayColor.gray600.color - textView.minHeight = 32.0 - textView.maxHeight = spaceHeight() - - baseLineView.backgroundColor = unPointColor - - descriptionLabel2.text = "어떤 플랫폼과 관련된 기능인가요?" - descriptionLabel2.font = DesignSystemFontFamily.Pretendard.medium.font(size: 18) - descriptionLabel2.textColor = DesignSystemAsset.GrayColor.gray900.color - descriptionLabel2.setTextWithAttributes(kernValue: -0.5) - - let superViews: [UIView] = [self.mobileAppSuperView, self.webSiteSuperView] - let buttons: [UIButton] = [self.mobileAppButton, self.webSiteButton] - let imageViews: [UIImageView] = [self.mobileAppCheckImageView, self.webSiteCheckImageView] - - for i in 0.. CGFloat { - return APP_HEIGHT() - (STATUS_BAR_HEGHIT() + SAFEAREA_BOTTOM_HEIGHT() + 48 + 20 + 28 + 16 + 51 + 28 + 12 + 48 + 66 + 10) // 마지막 10은 여유 공간 - } -} - -extension SuggestFunctionViewController : UITextViewDelegate { - public func textViewDidBeginEditing(_ textView: UITextView) { - self.baseLineView.backgroundColor = self.pointColor - } - public func textViewDidEndEditing(_ textView: UITextView) { - self.baseLineView.backgroundColor = self.unPointColor - } -} diff --git a/Projects/Features/StorageFeature/Sources/ViewControllers/WakMusicFeedbackViewController.swift b/Projects/Features/StorageFeature/Sources/ViewControllers/WakMusicFeedbackViewController.swift deleted file mode 100644 index e82d8ea48..000000000 --- a/Projects/Features/StorageFeature/Sources/ViewControllers/WakMusicFeedbackViewController.swift +++ /dev/null @@ -1,179 +0,0 @@ -// -// SuggestFunctionViewController.swift -// StorageFeature -// -// Created by yongbeomkwak on 2023/03/05. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import Utility -import DesignSystem -import RxSwift -import RxKeyboard -import CommonFeature - -public final class WakMusicFeedbackViewController: UIViewController,ViewControllerFromStoryBoard { - @IBOutlet weak var titleLabel: UILabel! - @IBOutlet weak var closeButton: UIButton! - @IBOutlet weak var descriptionLabel1: UILabel! - @IBOutlet weak var textView: GrowingTextView! - @IBOutlet weak var baseLineView: UIView! - @IBOutlet weak var previousButton: UIButton! - @IBOutlet weak var completionButton: UIButton! - - let unPointColor: UIColor = DesignSystemAsset.GrayColor.gray200.color - let pointColor: UIColor = DesignSystemAsset.PrimaryColor.decrease.color - let textViewPlaceHolder: String = "내 답변" - - let disposeBag = DisposeBag() - var viewModel:WakMusicFeedbackViewModel! - lazy var input = WakMusicFeedbackViewModel.Input() - lazy var output = viewModel.transform(from: input) - - public override func viewDidLoad() { - super.viewDidLoad() - configureUI() - hideKeyboardWhenTappedAround() - responseViewbyKeyboard() - bindRx() - bindbuttonEvent() - } - - public static func viewController(viewModel: WakMusicFeedbackViewModel) -> WakMusicFeedbackViewController { - let viewController = WakMusicFeedbackViewController.viewController(storyBoardName: "Storage", bundle: Bundle.module) - viewController.viewModel = viewModel - return viewController - } -} - -extension WakMusicFeedbackViewController { - private func configureUI(){ - titleLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) - titleLabel.textColor = DesignSystemAsset.GrayColor.gray900.color - titleLabel.setTextWithAttributes(kernValue: -0.5) - - closeButton.setImage(DesignSystemAsset.Navigation.crossClose.image, for: .normal) - - descriptionLabel1.text = "문의하실 내용을 적어주세요." - descriptionLabel1.font = DesignSystemFontFamily.Pretendard.medium.font(size: 18) - descriptionLabel1.textColor = DesignSystemAsset.GrayColor.gray900.color - descriptionLabel1.setTextWithAttributes(kernValue: -0.5) - - textView.delegate = self - textView.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) - textView.placeholder = textViewPlaceHolder - textView.placeholderColor = DesignSystemAsset.GrayColor.gray400.color - textView.textColor = DesignSystemAsset.GrayColor.gray600.color - textView.minHeight = 32.0 - textView.maxHeight = spaceHeight() - - baseLineView.backgroundColor = unPointColor - - self.completionButton.layer.cornerRadius = 12 - self.completionButton.clipsToBounds = true - self.completionButton.isEnabled = false - self.completionButton.setBackgroundColor(DesignSystemAsset.PrimaryColor.point.color, for: .normal) - self.completionButton.setBackgroundColor(DesignSystemAsset.GrayColor.gray300.color, for: .disabled) - self.completionButton.setAttributedTitle(NSMutableAttributedString(string: "완료", - attributes: [.font: DesignSystemFontFamily.Pretendard.medium.font(size: 18), - .foregroundColor: DesignSystemAsset.GrayColor.gray25.color, - .kern: -0.5]), for: .normal) - - self.previousButton.layer.cornerRadius = 12 - self.previousButton.clipsToBounds = true - self.previousButton.setBackgroundColor(DesignSystemAsset.GrayColor.gray400.color, for: .normal) - self.previousButton.setAttributedTitle(NSMutableAttributedString(string: "이전", - attributes: [.font: DesignSystemFontFamily.Pretendard.medium.font(size: 18), - .foregroundColor: DesignSystemAsset.GrayColor.gray25.color, - .kern: -0.5]), for: .normal) - } - - private func bindbuttonEvent(){ - previousButton.rx.tap.subscribe(onNext: { [weak self] in - guard let self = self else{ - return - } - self.navigationController?.popViewController(animated: true) - }) - .disposed(by: disposeBag) - - closeButton.rx.tap.subscribe(onNext: { [weak self] in - guard let self = self else{ - return - } - self.dismiss(animated: true) - }) - .disposed(by: disposeBag) - - completionButton.rx.tap - .subscribe(onNext: { [weak self] in - guard let self else {return} - - let vc = TextPopupViewController.viewController( - text: "작성하신 내용을 등록하시겠습니까?", - cancelButtonIsHidden: false, - completion: { [weak self] in - self?.input.completionButtonTapped.onNext(()) - } - ) - self.showPanModal(content: vc) - }) - .disposed(by: disposeBag) - } - - private func bindRx(){ - textView.rx.text.orEmpty - // .skip(1) //바인드 할 때 발생하는 첫 이벤트를 무시 - .distinctUntilChanged() // 연달아 같은 값이 이어질 때 중복된 값을 막아줍니다 - .bind(to: input.textString) - .disposed(by: disposeBag) - - input.textString.subscribe(onNext: { [weak self] (text) in - guard let self else { return } - self.completionButton.isEnabled = !text.isWhiteSpace - }).disposed(by: disposeBag) - - output.result.subscribe(onNext: { [weak self] res in - guard let self else {return} - let vc = TextPopupViewController.viewController( - text: res.message ?? "오류가 발생했습니다.", - cancelButtonIsHidden: true, - completion: { - self.dismiss(animated: true) - } - ) - self.showPanModal(content: vc) - }) - .disposed(by: disposeBag) - } - - private func responseViewbyKeyboard(){ - RxKeyboard.instance.visibleHeight //드라이브: 무조건 메인쓰레드에서 돌아감 - .drive(onNext: { [weak self] keyboardVisibleHeight in - guard let self = self else { - return - } - self.textView.maxHeight = keyboardVisibleHeight == .zero ? self.spaceHeight() : - self.spaceHeight() - keyboardVisibleHeight + SAFEAREA_BOTTOM_HEIGHT() + 56 - //키보드에서 바텀이 빼지면서 2번 빠짐 - - DEBUG_LOG("\(self.spaceHeight()) \(SAFEAREA_BOTTOM_HEIGHT()) \(keyboardVisibleHeight) \(self.spaceHeight() - keyboardVisibleHeight + SAFEAREA_BOTTOM_HEIGHT()) ") - self.view.layoutIfNeeded() //제약조건 바뀌었으므로 알려줌 - }).disposed(by: disposeBag) - } - - func spaceHeight() -> CGFloat { - return APP_HEIGHT() - (STATUS_BAR_HEGHIT() + SAFEAREA_BOTTOM_HEIGHT() + 48 + 20 + 28 + 16 + 66 + 10) // 마지막 10은 여유 공간 - } -} - -extension WakMusicFeedbackViewController : UITextViewDelegate { - public func textViewDidBeginEditing(_ textView: UITextView) { - self.baseLineView.backgroundColor = self.pointColor - } - - public func textViewDidEndEditing(_ textView: UITextView) { - self.baseLineView.backgroundColor = self.unPointColor - } -} diff --git a/Projects/Features/StorageFeature/Sources/ViewModels/AfterLoginStorageViewModel.swift b/Projects/Features/StorageFeature/Sources/ViewModels/AfterLoginStorageViewModel.swift deleted file mode 100644 index bcda14a32..000000000 --- a/Projects/Features/StorageFeature/Sources/ViewModels/AfterLoginStorageViewModel.swift +++ /dev/null @@ -1,87 +0,0 @@ -// -// AfterLoginStorageViewModel.swift -// StorageFeature -// -// Created by yongbeomkwak on 2023/01/26. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import Utility -import RxSwift -import RxRelay -import DomainModule -import BaseFeature -import CommonFeature -import NaverThirdPartyLogin -import KeychainModule - -final public class AfterLoginViewModel: ViewModelType { - - var disposeBag = DisposeBag() - var fetchUserInfoUseCase : FetchUserInfoUseCase! - let naverLoginInstance = NaverThirdPartyLoginConnection.getSharedInstance() - - public struct Input { - let textString: BehaviorRelay = BehaviorRelay(value: "") - let pressLogOut: PublishRelay = PublishRelay() - } - - public struct Output { - let state: BehaviorRelay = BehaviorRelay(value:EditState(isEditing: false, force: true)) - let userInfo: BehaviorRelay = BehaviorRelay(value: nil) - } - - public init( - fetchUserInfoUseCase: FetchUserInfoUseCase - ) { - self.fetchUserInfoUseCase = fetchUserInfoUseCase - DEBUG_LOG("✅ \(Self.self) 생성") - } - - public func transform(from input: Input) -> Output { - let output = Output() - - //MARK: 앱 접속 후 최초 1회는 서버에서 유저 정보를 가져와 동기화 한다. 삭제 후 재설치 한 경우는 제외 함. - Utility.PreferenceManager.$userInfo - .filter { $0 != nil } - .take(1) - .flatMap { [weak self] _ -> Observable in - guard let self = self else { return Observable.empty() } - return self.fetchUserInfoUseCase.execute() - .asObservable() - } - .subscribe(onNext: { - PreferenceManager.shared.setUserInfo( - ID: AES256.encrypt(string: $0.id), - platform: $0.platform, - profile: $0.profile, - displayName: AES256.encrypt(string: $0.displayName), - firstLoginTime: $0.first_login_time, - first: $0.first, - version: $0.version - ) - }).disposed(by: disposeBag) - - - input.pressLogOut.subscribe(onNext: { [weak self] in - guard let self = self else{ - return - } - let platform = Utility.PreferenceManager.userInfo?.platform - - if platform == "naver" { - self.naverLoginInstance?.resetToken() - }else if platform == "apple" { - - }else{ - - } - let keychain = KeychainImpl() - keychain.delete(type: .accessToken) - Utility.PreferenceManager.userInfo = nil - }).disposed(by: disposeBag) - - return output - } -} diff --git a/Projects/Features/StorageFeature/Sources/ViewModels/AskSongViewModel.swift b/Projects/Features/StorageFeature/Sources/ViewModels/AskSongViewModel.swift deleted file mode 100644 index 44f34998f..000000000 --- a/Projects/Features/StorageFeature/Sources/ViewModels/AskSongViewModel.swift +++ /dev/null @@ -1,90 +0,0 @@ -// -// AfterLoginStorageViewModel.swift -// StorageFeature -// -// Created by yongbeomkwak on 2023/01/26. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import Utility -import RxSwift -import RxRelay -import DomainModule -import BaseFeature -import KeychainModule -import DataMappingModule - -public final class AskSongViewModel: ViewModelType { - var type: SuggestSongModifyType! - var modifySongUseCase: ModifySongUseCase - var disposeBag = DisposeBag() - - public struct Input { - var artistString: PublishRelay = PublishRelay() - var songTitleString: PublishRelay = PublishRelay() - var youtubeString: PublishRelay = PublishRelay() - var contentString: PublishRelay = PublishRelay() - var completionButtonTapped: PublishSubject = PublishSubject() - } - - public struct Output { - var enableCompleteButton: BehaviorRelay - var result:PublishSubject - } - - public init(type: SuggestSongModifyType, modifySongUseCase: ModifySongUseCase){ - self.type = type - self.modifySongUseCase = modifySongUseCase - } - - deinit { - DEBUG_LOG("❌ \(Self.self) 소멸") - } - - public func transform(from input: Input) -> Output { - let enableCompleteButton: BehaviorRelay = BehaviorRelay(value: false) - let result:PublishSubject = PublishSubject() - let combineObservable = Observable.combineLatest( - input.artistString, - input.songTitleString, - input.youtubeString, - input.contentString - ){ - return ($0, $1, $2, $3) - } - - combineObservable - .debug("askSong combine") - .map { return !($0.isWhiteSpace || $1.isWhiteSpace || $2.isWhiteSpace || $3.isWhiteSpace) } - .bind(to: enableCompleteButton) - .disposed(by: disposeBag) - - input.completionButtonTapped - .withLatestFrom(combineObservable) - .debug("completionButtonTapped") - .flatMap({ [weak self] (artist, song, youtube, content) -> Observable in - guard let self else {return Observable.empty()} - let userId = AES256.decrypt(encoded: Utility.PreferenceManager.userInfo?.ID ?? "") - - return self.modifySongUseCase.execute(type: self.type, userID: userId, artist: artist, songTitle: song, youtubeLink: youtube, content: content) - .catch({ (error:Error) in - return Single.create { single in - single(.success(ModifySongEntity(status: 404, message: error.asWMError.errorDescription ?? ""))) - return Disposables.create {} - } - }) - .asObservable() - .map{ - ModifySongEntity(status: $0.status ,message: $0.message) - } - }) - .bind(to: result) - .disposed(by: disposeBag) - - return Output( - enableCompleteButton: enableCompleteButton, - result: result - ) - } -} diff --git a/Projects/Features/StorageFeature/Sources/ViewModels/BugReportViewModel.swift b/Projects/Features/StorageFeature/Sources/ViewModels/BugReportViewModel.swift deleted file mode 100644 index 373b0f350..000000000 --- a/Projects/Features/StorageFeature/Sources/ViewModels/BugReportViewModel.swift +++ /dev/null @@ -1,200 +0,0 @@ -// -// AfterLoginStorageViewModel.swift -// StorageFeature -// -// Created by yongbeomkwak on 2023/01/26. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import Utility -import RxSwift -import RxRelay -import DomainModule -import BaseFeature -import KeychainModule -//import Amplify -import ErrorModule - -enum MediaDataType { - case image(data: Data) - case video(data: Data, url: URL) -} - -enum PublicNameOption: String { - case nonDetermined = "선택" - case nonSigned = "가입안함" - case `public` = "알려주기" - case `private` = "비공개" -} - -public final class BugReportViewModel:ViewModelType { - var disposeBag = DisposeBag() - var reportBugUseCase: ReportBugUseCase - - public struct Input { - var publicNameOption:BehaviorRelay = BehaviorRelay(value: .nonDetermined) - var bugContentString:PublishRelay = PublishRelay() - var nickNameString:PublishRelay = PublishRelay() - var completionButtonTapped: PublishSubject = PublishSubject() - var dataSource:BehaviorRelay<[MediaDataType]> = BehaviorRelay(value: []) - var removeIndex:PublishRelay = PublishRelay() - } - - public struct Output { - var enableCompleteButton: BehaviorRelay = BehaviorRelay(value: false) - var showCollectionView: BehaviorRelay = BehaviorRelay(value: true) - var dataSource: BehaviorRelay<[MediaDataType]> = BehaviorRelay(value: []) - var result: PublishSubject = PublishSubject() - } - - public init(reportBugUseCase: ReportBugUseCase){ - self.reportBugUseCase = reportBugUseCase - } - - deinit { - DEBUG_LOG("❌ \(Self.self) Deinit") - } - - public func transform(from input: Input) -> Output { - let output = Output() - - let combineObservable = Observable.combineLatest( - input.publicNameOption, - input.nickNameString, - input.bugContentString - ){ - return ($0, $1, $2) - } - - combineObservable - .map{ (option, nickName, content) -> Bool in - switch option { - case .nonDetermined: - return false - case .nonSigned, .private: - return !content.isWhiteSpace - case .public: - return !nickName.isWhiteSpace && !content.isWhiteSpace - } - } - .bind(to: output.enableCompleteButton) - .disposed(by: disposeBag) - - input.completionButtonTapped - .withLatestFrom(input.dataSource) - .flatMap{ [weak self] (attaches) -> Observable<[String]> in - guard let self = self else { return Observable.empty() } - - if attaches.isEmpty { - return Observable.just([]) - }else{ - return AsyncStream { [weak self] continuation in - guard let self = self else { return } - Task.detached { - for i in 0.. Observable in - guard let self else { return Observable.empty() } - let userId = AES256.decrypt(encoded: Utility.PreferenceManager.userInfo?.ID ?? "") - return self.reportBugUseCase - .execute(userID: userId, nickname: (option == .public) ? nickName : "", attaches: attaches, content: content) - .debug("reportBugUseCase") - .catch({ (error:Error) in - return Single.create { single in - single(.success(ReportBugEntity(status: 404, message: error.asWMError.errorDescription ?? ""))) - return Disposables.create {} - } - }) - .asObservable() - .map{ (model) -> ReportBugEntity in - return ReportBugEntity(status: model.status ,message: model.message) - } - }) - .bind(to: output.result) - .disposed(by: disposeBag) - - input.dataSource - .bind(to: output.dataSource) - .disposed(by: disposeBag) - - input.dataSource - .map({$0.isEmpty}) - .bind(to: output.showCollectionView) - .disposed(by: disposeBag) - - input.removeIndex - .withLatestFrom(input.dataSource){($0,$1)} - .map{ (index,dataSource) -> [MediaDataType] in - var next = dataSource - next.remove(at: index) - return next - } - .bind(to: input.dataSource) - .disposed(by: disposeBag) - - return output - } -} - -extension BugReportViewModel { -// private func uploadImage(media: MediaDataType) async throws -> URL { -// let str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" -// let size = 5 -// let fileName = str.createRandomStr(length: size) + "_" + Date().dateToString(format: "yyyyMMddHHmmss") -// var data: Data? -// var ext: String = "" -// -// switch media { -// case let .image(model): -// data = model -// ext = "jpg" -// case let .video(model, _): -// data = model -// ext = "mp4" -// } -// -// let uploadTask = Amplify.Storage.uploadData( -// key: "\(fileName).\(ext)", -// data: data ?? Data() -// ) -// Task { -// for await progress in await uploadTask.progress { -// DEBUG_LOG("Progress: \(progress)") -// } -// } -// let value = try await uploadTask.value -// DEBUG_LOG("uploadTask Completed: \(value)") -// return try await getURL(fileName: fileName, ext: ext) -// } -// -// private func getURL(fileName: String, ext: String) async throws -> URL { -// let url = try await Amplify.Storage.getURL(key: "\(fileName).\(ext)") -// if var components = URLComponents(string: url.absoluteString) { -// components.query = nil -// return components.url ?? url -// } else { -// return url -// } -// } -} diff --git a/Projects/Features/StorageFeature/Sources/ViewModels/FavoriteViewModel.swift b/Projects/Features/StorageFeature/Sources/ViewModels/FavoriteViewModel.swift deleted file mode 100644 index 81e55d365..000000000 --- a/Projects/Features/StorageFeature/Sources/ViewModels/FavoriteViewModel.swift +++ /dev/null @@ -1,288 +0,0 @@ -// -// FavoriteViewModel.swift -// StorageFeature -// -// Created by yongbeomkwak on 2023/01/27. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import RxRelay -import RxCocoa -import BaseFeature -import DomainModule -import Utility -import CommonFeature - -public final class FavoriteViewModel:ViewModelType { - - var disposeBag = DisposeBag() - var fetchFavoriteSongsUseCase: FetchFavoriteSongsUseCase! - var editFavoriteSongsOrderUseCase: EditFavoriteSongsOrderUseCase! - var deleteFavoriteListUseCase: DeleteFavoriteListUseCase! - var tempDeleteLikeListIds: [String] = [] - - public struct Input { - let likeListLoad: BehaviorRelay = BehaviorRelay(value: ()) - let itemMoved: PublishSubject = PublishSubject() - let itemSelected: PublishSubject = PublishSubject() - let allLikeListSelected: PublishSubject = PublishSubject() - let addSongs: PublishSubject = PublishSubject() - let addPlayList: PublishSubject = PublishSubject() - let deleteLikeList: PublishSubject = PublishSubject() - let runEditing: PublishSubject = PublishSubject() - } - - public struct Output { - let state: BehaviorRelay = BehaviorRelay(value: EditState(isEditing: false, force: true)) - let dataSource: BehaviorRelay<[FavoriteSectionModel]> = BehaviorRelay(value: []) - let backUpdataSource:BehaviorRelay<[FavoriteSectionModel]> = BehaviorRelay(value: []) - let indexPathOfSelectedLikeLists: BehaviorRelay<[IndexPath]> = BehaviorRelay(value: []) - let willAddSongList: BehaviorRelay<[String]> = BehaviorRelay(value: []) - let willAddPlayList: BehaviorRelay<[SongEntity]> = BehaviorRelay(value: []) - let showToast: PublishRelay = PublishRelay() - } - - init( - fetchFavoriteSongsUseCase: FetchFavoriteSongsUseCase, - editFavoriteSongsOrderUseCase: EditFavoriteSongsOrderUseCase, - deleteFavoriteListUseCase: DeleteFavoriteListUseCase - ) { - DEBUG_LOG("✅ \(Self.self) 생성") - self.fetchFavoriteSongsUseCase = fetchFavoriteSongsUseCase - self.editFavoriteSongsOrderUseCase = editFavoriteSongsOrderUseCase - self.deleteFavoriteListUseCase = deleteFavoriteListUseCase - } - - public func transform(from input: Input) -> Output { - let output = Output() - - Utility.PreferenceManager.$userInfo - .skip(1) - .filter { $0 != nil } - .map { _ in () } - .bind(to: input.likeListLoad) - .disposed(by: disposeBag) - - NotificationCenter.default.rx.notification(.likeListRefresh) - .map{ _ in () } - .bind(to: input.likeListLoad) - .disposed(by: disposeBag) - - input.likeListLoad - .flatMap { [weak self] _ -> Observable<[FavoriteSongEntity]> in - guard let self = self else{ return Observable.empty() } - return self.fetchFavoriteSongsUseCase.execute() - .catchAndReturn([]) - .asObservable() - } - .map { [FavoriteSectionModel(model: 0, items: $0)] } - .bind(to: output.dataSource, output.backUpdataSource) - .disposed(by: disposeBag) - - input.itemSelected - .withLatestFrom(output.indexPathOfSelectedLikeLists, resultSelector: { (indexPath, selectedLikeLists) -> [IndexPath] in - if selectedLikeLists.contains(indexPath) { - guard let removeTargetIndex = selectedLikeLists.firstIndex(where: { $0 == indexPath }) else { return selectedLikeLists } - var newSelectedPlayLists = selectedLikeLists - newSelectedPlayLists.remove(at: removeTargetIndex) - return newSelectedPlayLists - - }else{ - return selectedLikeLists + [indexPath] - } - }) - .map { $0.sorted { $0 < $1 } } - .bind(to: output.indexPathOfSelectedLikeLists) - .disposed(by: disposeBag) - - input.itemMoved - .withLatestFrom(output.dataSource) { ($0.sourceIndex, $0.destinationIndex, $1) } - .withLatestFrom(output.indexPathOfSelectedLikeLists) { ($0.0, $0.1, $0.2, $1) } - .map { (sourceIndexPath, destinationIndexPath, dataSource, selectedLikeLists) -> [FavoriteSectionModel] in - //데이터 소스의 이동 - var newModel = dataSource.first?.items ?? [] - let temp = newModel[sourceIndexPath.row] - newModel.remove(at: sourceIndexPath.row) - newModel.insert(temp, at: destinationIndexPath.row) - - //선택 된 플레이리스트 인덱스 패스 변경 - var newSelectedPlayLists: [IndexPath] = [] - for i in 0.. [IndexPath] in - if flag { - let itemCount = (dataSource.first?.items ?? []).count - return Array(0.. Bool in - let beforeIds: [String] = output.backUpdataSource.value.first?.items.map { $0.song.id } ?? [] - let elementsEqual: Bool = beforeIds.elementsEqual(ids) - DEBUG_LOG(elementsEqual ? "❌ 변경된 내용이 없습니다." : "✅ 리스트가 변경되었습니다.") - return elementsEqual == false - } - .flatMap{ [weak self] (ids: [String]) -> Observable in - guard let self = self else{ - return Observable.empty() - } - return self.editFavoriteSongsOrderUseCase.execute(ids: ids) - .catch({ (error:Error) in - let wmError = error.asWMError - - if wmError == .tokenExpired { - return Single.create { single in - single(.success(BaseEntity(status: 401,description: wmError.errorDescription ?? ""))) - return Disposables.create() - } - } - - else { - return Single.create{ single in - single(.success(BaseEntity(status: 400, description: "서버에서 문제가 발생하였습니다.\n잠시 후 다시 시도해주세요!"))) - return Disposables.create() - } - } - }) - .asObservable() - } - .filter{ (model) in - guard model.status == 200 else { - output.showToast.accept(model) - return false - } - return true - } - .withLatestFrom(output.dataSource) - .bind(to: output.backUpdataSource) - .disposed(by: disposeBag) - - //노래담기 - input.addSongs - .withLatestFrom(output.indexPathOfSelectedLikeLists) - .withLatestFrom(output.dataSource) { ($0, $1) } - .map{ (indexPathes, dataSource) -> [String] in - let ids = indexPathes.map { - dataSource[$0.section].items[$0.row].song.id - } - return ids - } - .bind(to: output.willAddSongList) - .disposed(by: disposeBag) - - //재생목록추가 - input.addPlayList - .withLatestFrom(output.indexPathOfSelectedLikeLists) - .withLatestFrom(output.dataSource) { ($0, $1) } - .map{ (indexPathes, dataSource) -> [SongEntity] in - let songs = indexPathes.map { - dataSource[$0.section].items[$0.row].song - } - return songs - } - .bind(to: output.willAddPlayList) - .disposed(by: disposeBag) - - input.deleteLikeList - .withLatestFrom(output.indexPathOfSelectedLikeLists) - .withLatestFrom(output.dataSource) { ($0, $1) } - .map{ (indexPathes, dataSource) -> [String] in - return indexPathes.map { - dataSource[$0.section].items[$0.row].song.id - } - } - .filter { !$0.isEmpty } - .flatMap({ [weak self] (ids) -> Observable in - guard let `self` = self else { return Observable.empty() } - self.tempDeleteLikeListIds = ids - return self.deleteFavoriteListUseCase.execute(ids: ids) - .catch({ (error:Error) in - let wmError = error.asWMError - - if wmError == .tokenExpired { - return Single.create { single in - single(.success(BaseEntity(status: 401,description: wmError.errorDescription ?? ""))) - return Disposables.create() - } - } - - else { - return Single.create{ single in - single(.success(BaseEntity(status: 400, description: "서버에서 문제가 발생하였습니다.\n잠시 후 다시 시도해주세요!"))) - return Disposables.create() - } - } - }) - .asObservable() - }) - .do(onNext: { [weak self] (model) in - guard let `self` = self else { return } - output.state.accept(EditState(isEditing: false, force: true)) - output.indexPathOfSelectedLikeLists.accept([]) - - if model.status == 200 { - output.showToast.accept(BaseEntity(status: 200,description: "좋아요 리스트에서 삭제되었습니다.")) - //좋아요 삭제 시 > 노티피케이션 - guard let currentSong: SongEntity = PlayState.shared.currentSong else { return } - let currentSongID: String = currentSong.id - if self.tempDeleteLikeListIds.contains(currentSongID) { - - NotificationCenter.default.post(name: .updateCurrentSongLikeState, object: currentSong) - } - }else{ - output.showToast.accept(model) - } - }) - .map { _ in () } - .bind(to: input.likeListLoad) - .disposed(by: disposeBag) - - output.indexPathOfSelectedLikeLists - .withLatestFrom(output.dataSource) { ($0, $1) } - .map { (selectedLikeLists, dataSource) in - var newModel = dataSource - for i in 0.. = BehaviorRelay(value: ()) - let itemMoved: PublishSubject = PublishSubject() - let itemSelected: PublishSubject = PublishSubject() - let allPlayListSelected: PublishSubject = PublishSubject() - let addPlayList: PublishSubject = PublishSubject() - let deletePlayList: PublishSubject = PublishSubject() - let runEditing: PublishSubject = PublishSubject() - } - - public struct Output { - let state: BehaviorRelay = BehaviorRelay(value: EditState(isEditing: false, force: true)) - let dataSource: BehaviorRelay<[MyPlayListSectionModel]> = BehaviorRelay(value: []) - let backUpdataSource: BehaviorRelay<[MyPlayListSectionModel]> = BehaviorRelay(value: []) - let indexPathOfSelectedPlayLists: BehaviorRelay<[IndexPath]> = BehaviorRelay(value: []) - let willAddPlayList: BehaviorRelay<[SongEntity]> = BehaviorRelay(value: []) - let showToast: PublishRelay = PublishRelay() - } - - init( - fetchPlayListUseCase: FetchPlayListUseCase, - editPlayListOrderUseCase: EditPlayListOrderUseCase, - deletePlayListUseCase: DeletePlayListUseCase - ) { - self.fetchPlayListUseCase = fetchPlayListUseCase - self.editPlayListOrderUseCase = editPlayListOrderUseCase - self.deletePlayListUseCase = deletePlayListUseCase - DEBUG_LOG("✅ \(Self.self) 생성") - } - - public func transform(from input: Input) -> Output { - let output = Output() - - Utility.PreferenceManager.$userInfo - .skip(1) - .filter { $0 != nil } - .map { _ in () } - .bind(to: input.playListLoad) - .disposed(by: disposeBag) - - NotificationCenter.default.rx.notification(.playListRefresh) - .map{ _ in () } - .bind(to: input.playListLoad) - .disposed(by: disposeBag) - - input.playListLoad - .flatMap{ [weak self] () -> Observable<[PlayListEntity]> in - guard let self = self else{ - return Observable.empty() - } - return self.fetchPlayListUseCase.execute() - .asObservable() - .catchAndReturn([]) - } - .map { [MyPlayListSectionModel(model: 0, items: $0)] } - .bind(to: output.dataSource, output.backUpdataSource) - .disposed(by: disposeBag) - - input.itemSelected - .withLatestFrom(output.indexPathOfSelectedPlayLists, resultSelector: { (indexPath, selectedPlayLists) -> [IndexPath] in - if selectedPlayLists.contains(indexPath) { - guard let removeTargetIndex = selectedPlayLists.firstIndex(where: { $0 == indexPath }) else { return selectedPlayLists } - var newSelectedPlayLists = selectedPlayLists - newSelectedPlayLists.remove(at: removeTargetIndex) - return newSelectedPlayLists - - }else{ - return selectedPlayLists + [indexPath] - } - }) - .map { $0.sorted { $0 < $1 } } - .bind(to: output.indexPathOfSelectedPlayLists) - .disposed(by: disposeBag) - - input.itemMoved - .withLatestFrom(output.dataSource) { ($0.sourceIndex, $0.destinationIndex, $1) } - .withLatestFrom(output.indexPathOfSelectedPlayLists) { ($0.0, $0.1, $0.2, $1) } - .map { (sourceIndexPath, destinationIndexPath, dataSource, selectedPlayLists) -> [MyPlayListSectionModel] in - //데이터 소스의 이동 - var newModel = dataSource.first?.items ?? [] - let temp = newModel[sourceIndexPath.row] - newModel.remove(at: sourceIndexPath.row) - newModel.insert(temp, at: destinationIndexPath.row) - - //선택 된 플레이리스트 인덱스 패스 변경 - var newSelectedPlayLists: [IndexPath] = [] - for i in 0.. [IndexPath] in - if flag { - let itemCount = (dataSource.first?.items ?? []).count - return Array(0.. Bool in - let beforeIds: [String] = output.backUpdataSource.value.first?.items.map { $0.key } ?? [] - let elementsEqual: Bool = beforeIds.elementsEqual(ids) - DEBUG_LOG(elementsEqual ? "❌ 변경된 내용이 없습니다." : "✅ 리스트가 변경되었습니다.") - return elementsEqual == false - } - .flatMap{ [weak self] (ids: [String]) -> Observable in - guard let self = self else{ - return Observable.empty() - } - return self.editPlayListOrderUseCase.execute(ids: ids) - .catch({ (error:Error) in - let wmError = error.asWMError - if wmError == .tokenExpired { - return Single.create { single in - single(.success(BaseEntity(status: 401,description: wmError.errorDescription ?? ""))) - return Disposables.create() - } - } - else { - return Single.create{ single in - single(.success(BaseEntity(status: 400, description: "서버에서 문제가 발생하였습니다.\n잠시 후 다시 시도해주세요!"))) - return Disposables.create() - } - } - }) - .asObservable() - } - .filter{ (model) in - guard model.status == 200 else { - output.showToast.accept(model) - return false - } - return true - } - .withLatestFrom(output.dataSource) - .bind(to: output.backUpdataSource) - .disposed(by: disposeBag) - - input.addPlayList - .withLatestFrom(output.indexPathOfSelectedPlayLists) - .withLatestFrom(output.dataSource) { ($0, $1) } - .map{ (indexPathes, dataSource) -> [SongEntity] in - let songs = indexPathes.map { - return dataSource[$0.section].items[$0.row].songlist - }.flatMap { $0 } - return songs - } - .bind(to: output.willAddPlayList) - .disposed(by: disposeBag) - - input.deletePlayList - .withLatestFrom(output.indexPathOfSelectedPlayLists) - .withLatestFrom(output.dataSource) { ($0, $1) } - .map{ (indexPathes, dataSource) -> [String] in - return indexPathes.map { - dataSource[$0.section].items[$0.row].key - } - } - .filter { !$0.isEmpty } - .flatMap({ [weak self] (ids) -> Observable in - guard let `self` = self else { return Observable.empty() } - return self.deletePlayListUseCase.execute(ids: ids) - .catch({ (error:Error) in - let wmError = error.asWMError - if wmError == .tokenExpired { - return Single.create { single in - single(.success(BaseEntity(status: 401,description: wmError.errorDescription ?? ""))) - return Disposables.create() - } - } - else { - return Single.create{ single in - single(.success(BaseEntity(status: 400, description: "존재하지 않는 리스트입니다."))) - return Disposables.create() - } - } - }) - .asObservable() - }) - .do(onNext: { (model) in - if model.status == 200 { - output.state.accept(EditState(isEditing: false, force: true)) - output.indexPathOfSelectedPlayLists.accept([]) - output.showToast.accept(BaseEntity(status: 200,description: "리스트가 삭제되었습니다.")) - }else{ - output.state.accept(EditState(isEditing: false, force: true)) - output.indexPathOfSelectedPlayLists.accept([]) - output.showToast.accept(model) - } - }) - .map { _ in () } - .bind(to: input.playListLoad) - .disposed(by: disposeBag) - - output.indexPathOfSelectedPlayLists - .withLatestFrom(output.dataSource) { ($0, $1) } - .map { (selectedPlayLists, dataSource) in - var newModel = dataSource - for i in 0.. = PublishSubject() - } - - public struct Output { - var dataSource: BehaviorRelay<[NoticeDetailSectionModel]> = BehaviorRelay(value: []) - var imageSizes: BehaviorRelay<[CGSize]> = BehaviorRelay(value: []) - } - - public init( - model: FetchNoticeEntity - ) { - let sectionModel = [NoticeDetailSectionModel(model: model, - items: model.images)] - - let imageURLs: [URL] = - model.images.map { - WMImageAPI.fetchNotice(id: $0).toURL - } - .compactMap { $0 } - - input.fetchNoticeDetail - .flatMap { [weak self] _ -> Observable<[CGSize]> in - guard let self else { return Observable.empty() } - return imageURLs.isEmpty ? Observable.just([]) : self.downloadImage(urls: imageURLs) - } - .subscribe(onNext: { [weak self] (imageSizes) in - self?.output.imageSizes.accept(imageSizes) - self?.output.dataSource.accept(sectionModel) - }) - .disposed(by: disposeBag) - } -} - -extension NoticeDetailViewModel { - private func downloadImage(urls: [URL]) -> Observable<[CGSize]> { - var sizes: [CGSize] = [] - return Observable.create{ (observer) -> Disposable in - urls.forEach { - KingfisherManager.shared.retrieveImage( - with: $0, - completionHandler: { (result) in - switch result { - case let .success(value): - sizes.append(CGSize(width: value.image.size.width, height: value.image.size.height)) - if urls.count == sizes.count { - observer.onNext(sizes) - observer.onCompleted() - } - case let .failure(error): - DEBUG_LOG(error.localizedDescription) - sizes.append(.zero) - if urls.count == sizes.count { - observer.onNext(sizes) - observer.onCompleted() - } - } - } - ) - } - return Disposables.create {} - } - } -} diff --git a/Projects/Features/StorageFeature/Sources/ViewModels/NoticeViewModel.swift b/Projects/Features/StorageFeature/Sources/ViewModels/NoticeViewModel.swift deleted file mode 100644 index c1ad3b288..000000000 --- a/Projects/Features/StorageFeature/Sources/ViewModels/NoticeViewModel.swift +++ /dev/null @@ -1,42 +0,0 @@ -// -// NoticeViewModel.swift -// StorageFeature -// -// Created by KTH on 2023/04/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import RxCocoa -import BaseFeature -import DomainModule -import DataMappingModule -import Utility - -public class NoticeViewModel { - - let input = Input() - let output = Output() - var disposeBag = DisposeBag() - var fetchNoticeUseCase: FetchNoticeUseCase - - public struct Input { - } - - public struct Output { - var dataSource: BehaviorRelay<[FetchNoticeEntity]> = BehaviorRelay(value: []) - } - - public init( - fetchNoticeUseCase: any FetchNoticeUseCase - ){ - self.fetchNoticeUseCase = fetchNoticeUseCase - - self.fetchNoticeUseCase.execute(type: .all) - .catchAndReturn([]) - .asObservable() - .bind(to: output.dataSource) - .disposed(by: disposeBag) - } -} diff --git a/Projects/Features/StorageFeature/Sources/ViewModels/QnaContentViewModel.swift b/Projects/Features/StorageFeature/Sources/ViewModels/QnaContentViewModel.swift deleted file mode 100644 index c895fbd57..000000000 --- a/Projects/Features/StorageFeature/Sources/ViewModels/QnaContentViewModel.swift +++ /dev/null @@ -1,38 +0,0 @@ -// -// AfterLoginStorageViewModel.swift -// StorageFeature -// -// Created by yongbeomkwak on 2023/01/26. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import Utility -import RxSwift -import RxRelay -import DomainModule -import BaseFeature -import KeychainModule - -final public class QnaContentViewModel:ViewModelType { - var disposeBag = DisposeBag() - var dataSource:[QnaEntity] - - public struct Input { - } - - public struct Output { - } - - public init( - dataSource:[QnaEntity] - ) { - DEBUG_LOG("✅ \(Self.self) 생성") - self.dataSource = dataSource - } - - public func transform(from input: Input) -> Output { - let output = Output() - return output - } -} diff --git a/Projects/Features/StorageFeature/Sources/ViewModels/QnaViewModel.swift b/Projects/Features/StorageFeature/Sources/ViewModels/QnaViewModel.swift deleted file mode 100644 index fe59a8ca9..000000000 --- a/Projects/Features/StorageFeature/Sources/ViewModels/QnaViewModel.swift +++ /dev/null @@ -1,65 +0,0 @@ -// -// AfterLoginStorageViewModel.swift -// StorageFeature -// -// Created by yongbeomkwak on 2023/01/26. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import Utility -import RxSwift -import RxRelay -import DomainModule -import BaseFeature -import KeychainModule - -final public class QnaViewModel:ViewModelType { - var disposeBag = DisposeBag() - var fetchQnaCategoriesUseCase: FetchQnaCategoriesUseCase! - var fetchQnaUseCase: FetchQnaUseCase! - - public struct Input { - } - - public struct Output { - let dataSource:BehaviorRelay<([QnaCategoryEntity], [QnaEntity])> = BehaviorRelay(value: ([], [])) - } - - public init( - fetchQnaCategoriesUseCase: FetchQnaCategoriesUseCase, - fetchQnaUseCase: FetchQnaUseCase - ) { - DEBUG_LOG("✅ \(Self.self) 생성") - self.fetchQnaCategoriesUseCase = fetchQnaCategoriesUseCase - self.fetchQnaUseCase = fetchQnaUseCase - } - - public func transform(from input: Input) -> Output { - let output = Output() - - let zip1 = fetchQnaCategoriesUseCase.execute().catchAndReturn([]) - .map({ - var result:[QnaCategoryEntity] = [QnaCategoryEntity(category: "전체 ")] - - result += $0 - .map({ - $0.category.count < 6 ? - QnaCategoryEntity(category: $0.category + String(repeating: " ", count: 6 - $0.category.count)) : - $0 }) - - DEBUG_LOG(result) - return result - }) - .asObservable() - - let zip2 = fetchQnaUseCase.execute().catchAndReturn([]) - .asObservable() - - Observable.zip(zip1, zip2) - .bind(to: output.dataSource) - .disposed(by: disposeBag) - - return output - } -} diff --git a/Projects/Features/StorageFeature/Sources/ViewModels/RequestViewModel.swift b/Projects/Features/StorageFeature/Sources/ViewModels/RequestViewModel.swift deleted file mode 100644 index c4fa0d2aa..000000000 --- a/Projects/Features/StorageFeature/Sources/ViewModels/RequestViewModel.swift +++ /dev/null @@ -1,72 +0,0 @@ -// -// AfterLoginStorageViewModel.swift -// StorageFeature -// -// Created by yongbeomkwak on 2023/01/26. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import Utility -import RxSwift -import RxRelay -import DomainModule -import BaseFeature -import KeychainModule -import NaverThirdPartyLogin - -final public class RequestViewModel:ViewModelType { - - var disposeBag = DisposeBag() - var withDrawUserInfoUseCase: WithdrawUserInfoUseCase - let naverLoginInstance = NaverThirdPartyLoginConnection.getSharedInstance() - - public struct Input { - let pressWithdraw: PublishSubject = PublishSubject() - } - - public struct Output { - let withDrawResult: PublishSubject = PublishSubject() - } - - public init( - withDrawUserInfoUseCase: WithdrawUserInfoUseCase - ) { - self.withDrawUserInfoUseCase = withDrawUserInfoUseCase - DEBUG_LOG("✅ \(Self.self) 생성") - } - - public func transform(from input: Input) -> Output { - let output = Output() - - input.pressWithdraw - .debug("pressWithdraw") - .flatMap{ [weak self] () -> Observable in - guard let self = self else { - return Observable.empty() - } - return self.withDrawUserInfoUseCase.execute() - .catch{ (error) in - return Single.create { single in - single(.success(BaseEntity(status: 0, description: error.asWMError.errorDescription ?? ""))) - return Disposables.create {} - } - }.asObservable() - } - .do(onNext: { _ in - let platform = Utility.PreferenceManager.userInfo?.platform - - if platform == "naver" { - self.naverLoginInstance?.requestDeleteToken() - } - - let keychain = KeychainImpl() - keychain.delete(type: .accessToken) - Utility.PreferenceManager.userInfo = nil - }) - .bind(to: output.withDrawResult) - .disposed(by: disposeBag) - - return output - } -} diff --git a/Projects/Features/StorageFeature/Sources/ViewModels/SuggestFunctionViewModel.swift b/Projects/Features/StorageFeature/Sources/ViewModels/SuggestFunctionViewModel.swift deleted file mode 100644 index 15b5a614a..000000000 --- a/Projects/Features/StorageFeature/Sources/ViewModels/SuggestFunctionViewModel.swift +++ /dev/null @@ -1,70 +0,0 @@ -// -// AfterLoginStorageViewModel.swift -// StorageFeature -// -// Created by yongbeomkwak on 2023/01/26. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import Utility -import RxSwift -import RxRelay -import DomainModule -import BaseFeature -import KeychainModule - -public final class SuggestFunctionViewModel:ViewModelType { - - var disposeBag = DisposeBag() - var suggestFunctionUseCase: SuggestFunctionUseCase - - public struct Input { - var textString:PublishRelay = PublishRelay() - var tabConfirm:PublishSubject = PublishSubject() - } - - public struct Output { - var selectedIndex:BehaviorRelay = BehaviorRelay(value: -2) - var result:PublishSubject = PublishSubject() - } - - public init( - suggestFunctionUseCase: SuggestFunctionUseCase - ) { - self.suggestFunctionUseCase = suggestFunctionUseCase - } - - deinit { - DEBUG_LOG("❌ \(Self.self) 소멸") - } - - public func transform(from input: Input) -> Output { - let output = Output() - - let resultObservable = Observable.combineLatest(input.textString, output.selectedIndex) - input.tabConfirm - .withLatestFrom(resultObservable) - .flatMap {[weak self] (text:String, service:Int) -> Observable in - guard let self else {return Observable.empty() } - let userId = AES256.decrypt(encoded: Utility.PreferenceManager.userInfo?.ID ?? "") - - return self.suggestFunctionUseCase - .execute(type: (service == 0) ? .mobile : .pc , userID: userId , content: text) - .catch({ (error:Error) in - return Single.create { single in - single(.success(SuggestFunctionEntity(status: 404, message: error.asWMError.errorDescription ?? ""))) - return Disposables.create {} - } - }) - .asObservable() - .map({ - SuggestFunctionEntity(status: $0.status ,message: $0.message) - }) - } - .bind(to: output.result) - .disposed(by: disposeBag) - - return output - } -} diff --git a/Projects/Features/StorageFeature/Sources/ViewModels/WakMusicFeedbackViewModel.swift b/Projects/Features/StorageFeature/Sources/ViewModels/WakMusicFeedbackViewModel.swift deleted file mode 100644 index b80f56202..000000000 --- a/Projects/Features/StorageFeature/Sources/ViewModels/WakMusicFeedbackViewModel.swift +++ /dev/null @@ -1,68 +0,0 @@ -// -// AfterLoginStorageViewModel.swift -// StorageFeature -// -// Created by yongbeomkwak on 2023/01/26. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import Utility -import RxSwift -import RxRelay -import DomainModule -import BaseFeature -import KeychainModule - -public final class WakMusicFeedbackViewModel:ViewModelType { - - var disposeBag = DisposeBag() - var inquiryWeeklyChartUseCase: InquiryWeeklyChartUseCase - - public struct Input { - var textString: PublishRelay = PublishRelay() - var completionButtonTapped: PublishSubject = PublishSubject() - } - - public struct Output { - var result: PublishSubject = PublishSubject() - } - - public init( - inquiryWeeklyChartUseCase: InquiryWeeklyChartUseCase - ) { - self.inquiryWeeklyChartUseCase = inquiryWeeklyChartUseCase - } - - deinit { - DEBUG_LOG("❌ \(Self.self) 소멸") - } - - public func transform(from input: Input) -> Output { - let output = Output() - - input.completionButtonTapped - .withLatestFrom(input.textString) - .debug("completionButtonTapped") - .flatMap({ [weak self] (content) -> Observable in - guard let self else {return Observable.empty()} - let userId = AES256.decrypt(encoded: Utility.PreferenceManager.userInfo?.ID ?? "") - - return self.inquiryWeeklyChartUseCase.execute(userID: userId, content: content) - .catch({ (error:Error) in - return Single.create { single in - single(.success(InquiryWeeklyChartEntity(status: 404, message: error.asWMError.errorDescription ?? ""))) - return Disposables.create {} - } - }) - .asObservable() - .map{ - InquiryWeeklyChartEntity(status: $0.status ,message: $0.message) - } - }) - .bind(to: output.result) - .disposed(by: disposeBag) - - return output - } -} diff --git a/Projects/Features/StorageFeature/Sources/Views/AnswerTableViewCell.swift b/Projects/Features/StorageFeature/Sources/Views/AnswerTableViewCell.swift deleted file mode 100644 index f6efa2f36..000000000 --- a/Projects/Features/StorageFeature/Sources/Views/AnswerTableViewCell.swift +++ /dev/null @@ -1,30 +0,0 @@ -// -// AnswerTableViewCell.swift -// StorageFeature -// -// Created by yongbeomkwak on 2023/01/30. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import DesignSystem -import DomainModule - -class AnswerTableViewCell: UITableViewCell { - - - @IBOutlet weak var answerLabel: UILabel! - - override func awakeFromNib() { - super.awakeFromNib() - answerLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 14) - answerLabel.setTextWithAttributes(kernValue: -0.5, lineSpacing: 6) - - } -} - -extension AnswerTableViewCell{ - public func update(model:QnaEntity){ - answerLabel.text = model.description - } -} diff --git a/Projects/Features/StorageFeature/Sources/Views/BugReportCollectionViewCell.swift b/Projects/Features/StorageFeature/Sources/Views/BugReportCollectionViewCell.swift deleted file mode 100644 index 85ec4ad6c..000000000 --- a/Projects/Features/StorageFeature/Sources/Views/BugReportCollectionViewCell.swift +++ /dev/null @@ -1,61 +0,0 @@ -// -// BugReportCollectionViewCell.swift -// StorageFeature -// -// Created by yongbeomkwak on 2023/04/15. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import DesignSystem -import Kingfisher -import Utility -import AVFoundation - -protocol BugReportCollectionViewCellDelegate: AnyObject { - func tapRemove(index: Int) -} - -class BugReportCollectionViewCell: UICollectionViewCell { - - @IBOutlet weak var imageView: UIImageView! - @IBOutlet weak var deleteButton: UIButton! - @IBOutlet weak var videoImageView: UIImageView! - @IBOutlet weak var deemView: UIView! - - @IBAction func removeAction(_ sender: Any) { - self.delegate?.tapRemove(index: index) - } - weak var delegate: BugReportCollectionViewCellDelegate? - var index: Int = 0 - - override func awakeFromNib() { - super.awakeFromNib() - - self.contentView.layer.cornerRadius = 8 - self.contentView.layer.borderColor = DesignSystemAsset.GrayColor.gray100.color.cgColor - self.contentView.clipsToBounds = true - self.deleteButton.setImage(DesignSystemAsset.Storage.attachRemove.image, for: .normal) - self.imageView.contentMode = .scaleAspectFill - self.videoImageView.image = DesignSystemAsset.Storage.playVideo.image - self.videoImageView.contentMode = .scaleAspectFit - } -} - -extension BugReportCollectionViewCell { - func update(model: MediaDataType, index: Int) { - self.index = index - - switch model { - case .image(data: let data): - imageView.image = UIImage(data: data) - videoImageView.isHidden = true - deemView.backgroundColor = UIColor.clear - - case let .video(data, _): - imageView.image = data.extractThumbnail() - videoImageView.isHidden = false - deemView.backgroundColor = UIColor.black.withAlphaComponent(0.4) - } - } -} diff --git a/Projects/Features/StorageFeature/Sources/Views/CreateListButton.swift b/Projects/Features/StorageFeature/Sources/Views/CreateListButton.swift new file mode 100644 index 000000000..80c7114e8 --- /dev/null +++ b/Projects/Features/StorageFeature/Sources/Views/CreateListButton.swift @@ -0,0 +1,89 @@ +import DesignSystem +import SnapKit +import Then +import UIKit +import Utility + +final class CreateListButtonView: UIView { + private let baseView = UIView().then { + $0.layer.cornerRadius = 8 + $0.layer.borderColor = DesignSystemAsset.BlueGrayColor.blueGray200.color.withAlphaComponent(0.4).cgColor + $0.layer.borderWidth = 1 + $0.backgroundColor = .white.withAlphaComponent(0.4) + $0.clipsToBounds = true + } + + private let translucentView = UIVisualEffectView(effect: UIBlurEffect(style: .regular)).then { + $0.layer.cornerRadius = 8 + } + + private let image = UIImageView().then { + $0.image = DesignSystemAsset.Storage.storageNewPlaylistAdd.image + } + + private let title = WMLabel( + text: "리스트 만들기", + textColor: DesignSystemAsset.BlueGrayColor.blueGray900.color, + font: .t6(weight: .medium), + alignment: .center, + kernValue: -0.5 + ) + + let button = UIButton() + + private let padding: UIEdgeInsets + + init(padding: UIEdgeInsets = .zero) { + self.padding = padding + super.init(frame: .zero) + addView() + setLayout() + configureUI() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func addView() { + self.addSubview(baseView) + baseView.addSubviews( + translucentView, + image, + title, + button + ) + } + + private func setLayout() { + baseView.snp.makeConstraints { + $0.top.equalToSuperview().inset(padding.top) + $0.leading.equalToSuperview().inset(padding.left) + $0.trailing.equalToSuperview().inset(padding.right) + $0.bottom.equalToSuperview().inset(padding.bottom) + } + + translucentView.snp.makeConstraints { + $0.edges.equalToSuperview() + } + + image.snp.makeConstraints { + $0.width.height.equalTo(32) + $0.centerY.equalToSuperview() + $0.left.equalToSuperview().inset(32) + } + + title.snp.makeConstraints { + $0.center.equalToSuperview() + } + + button.snp.makeConstraints { + $0.edges.equalToSuperview() + } + } + + private func configureUI() { + self.backgroundColor = .clear + } +} diff --git a/Projects/Features/StorageFeature/Sources/Views/FavoriteTableViewCell.swift b/Projects/Features/StorageFeature/Sources/Views/FavoriteTableViewCell.swift deleted file mode 100644 index 8ee55f698..000000000 --- a/Projects/Features/StorageFeature/Sources/Views/FavoriteTableViewCell.swift +++ /dev/null @@ -1,77 +0,0 @@ -// -// FavoriteTableViewCell.swift -// StorageFeature -// -// Created by yongbeomkwak on 2023/01/27. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import DesignSystem -import CommonFeature -import DomainModule -import Utility - -public protocol FavoriteTableViewCellDelegate: AnyObject { - func buttonTapped(type: FavoriteTableViewCellDelegateConstant) -} - -public enum FavoriteTableViewCellDelegateConstant { - case listTapped(indexPath: IndexPath) - case playTapped(song: SongEntity) -} - -class FavoriteTableViewCell: UITableViewCell { - - @IBOutlet weak var albumImageView: UIImageView! - @IBOutlet weak var titleLabel: UILabel! - @IBOutlet weak var artistLabel: UILabel! - @IBOutlet weak var playButton: UIButton! - @IBOutlet weak var playButtonTrailingConstraint: NSLayoutConstraint! - @IBOutlet weak var listSelectButton: UIButton! - - @IBAction func playButtonAction(_ sender: UIButton) { - guard let song = self.passToModel.1 else { return } - delegate?.buttonTapped(type: .playTapped(song: song)) - } - - @IBAction func listSelectButtonAction(_ sender: Any) { - delegate?.buttonTapped(type: .listTapped(indexPath: passToModel.0)) - } - - weak var delegate: FavoriteTableViewCellDelegate? - var passToModel: (IndexPath, SongEntity?) = (IndexPath(row: 0, section: 0), nil) - - override func awakeFromNib() { - super.awakeFromNib() - - self.backgroundColor = .clear - self.albumImageView.layer.cornerRadius = 4 - self.titleLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 14) - self.artistLabel.font = DesignSystemFontFamily.Pretendard.light.font(size: 12) - self.titleLabel.textColor = DesignSystemAsset.GrayColor.gray900.color - self.artistLabel.textColor = DesignSystemAsset.GrayColor.gray900.color - playButton.setImage(DesignSystemAsset.Storage.play.image, for: .normal) - } -} - -extension FavoriteTableViewCell { - - func update(model: FavoriteSongEntity, isEditing: Bool, indexPath: IndexPath) { - - self.passToModel = (indexPath, model.song) - - self.albumImageView.kf.setImage( - with: WMImageAPI.fetchYoutubeThumbnail(id: model.song.id).toURL, - placeholder: DesignSystemAsset.Logo.placeHolderSmall.image, - options: [.transition(.fade(0.2))] - ) - self.titleLabel.text = model.song.title - self.artistLabel.text = model.song.artist - - self.backgroundColor = model.isSelected ? DesignSystemAsset.GrayColor.gray200.color : UIColor.clear - self.listSelectButton.isHidden = !isEditing - self.playButton.isHidden = isEditing - self.playButtonTrailingConstraint.constant = isEditing ? -24 : 20 - } -} diff --git a/Projects/Features/StorageFeature/Sources/Views/LikeStorageTableViewCell.swift b/Projects/Features/StorageFeature/Sources/Views/LikeStorageTableViewCell.swift new file mode 100644 index 000000000..822f1a1ac --- /dev/null +++ b/Projects/Features/StorageFeature/Sources/Views/LikeStorageTableViewCell.swift @@ -0,0 +1,167 @@ +import BaseFeature +import DesignSystem +import SnapKit +import SongsDomainInterface +import Then +import UIKit +import UserDomainInterface +import Utility + +public protocol LikeStorageTableViewCellDelegate: AnyObject { + func buttonTapped(type: LikeStorageTableViewCellDelegateConstant) +} + +public enum LikeStorageTableViewCellDelegateConstant { + case cellTapped(indexPath: IndexPath) + case playTapped(song: FavoriteSongEntity) +} + +class LikeStorageTableViewCell: UITableViewCell { + static let reuseIdentifer = "LikeStorageTableViewCell" + + private let albumImageView = UIImageView().then { + $0.layer.cornerRadius = 4 + $0.clipsToBounds = true + $0.isUserInteractionEnabled = true + } + + private let verticalStackView = UIStackView().then { + $0.axis = .vertical + $0.spacing = 2 + } + + private let titleLabel = WMLabel( + text: "", + textColor: DesignSystemAsset.BlueGrayColor.blueGray900.color, + font: .t6(weight: .medium), + kernValue: -0.5 + ).then { + $0.lineBreakMode = .byTruncatingTail + } + + private let artistLabel = WMLabel( + text: "", + textColor: DesignSystemAsset.BlueGrayColor.blueGray900.color, + font: .t7(weight: .light), + kernValue: -0.5 + ).then { + $0.lineBreakMode = .byTruncatingTail + } + + private let playButton = UIButton().then { + $0.setImage(DesignSystemAsset.Player.playLarge.image, for: .normal) + $0.layer.addShadow( + color: UIColor(hex: "#080F34"), + alpha: 0.04, + x: 0, + y: 6, + blur: 6, + spread: 0 + ) + } + + private let cellSelectButton = UIButton() + + weak var delegate: LikeStorageTableViewCellDelegate? + var indexPath: IndexPath? + var model: FavoriteSongEntity? + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + addView() + setLayout() + setAction() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +extension LikeStorageTableViewCell { + func update(model: FavoriteSongEntity, isEditing: Bool, indexPath: IndexPath) { + self.indexPath = indexPath + self.model = model + + self.albumImageView.kf.setImage( + with: WMImageAPI.fetchYoutubeThumbnail(id: model.songID).toURL, + placeholder: DesignSystemAsset.Logo.placeHolderSmall.image, + options: [.transition(.fade(0.2))] + ) + self.titleLabel.text = model.title + self.artistLabel.text = model.artist + + self.backgroundColor = model.isSelected ? DesignSystemAsset.BlueGrayColor.blueGray200.color : UIColor.clear + self.cellSelectButton.isHidden = !isEditing + self.playButton.isHidden = isEditing + + self.playButton.snp.updateConstraints { + $0.right.equalToSuperview().inset(isEditing ? -24 : 20) + } + } +} + +private extension LikeStorageTableViewCell { + func addView() { + self.contentView.addSubviews( + albumImageView, + verticalStackView, + cellSelectButton, + playButton + ) + verticalStackView.addArrangedSubviews(titleLabel, artistLabel) + } + + func setLayout() { + albumImageView.snp.makeConstraints { + $0.width.equalTo(72) + $0.height.equalTo(40) + $0.left.equalToSuperview().inset(20) + $0.centerY.equalToSuperview() + } + + verticalStackView.snp.makeConstraints { + $0.left.equalTo(albumImageView.snp.right).offset(8) + $0.right.equalTo(playButton.snp.left).offset(-16) + $0.centerY.equalToSuperview() + } + + playButton.snp.makeConstraints { + $0.width.height.equalTo(32) + $0.right.equalToSuperview().inset(20) + $0.centerY.equalToSuperview() + } + + titleLabel.snp.makeConstraints { + $0.height.equalTo(22) + } + + artistLabel.snp.makeConstraints { + $0.height.equalTo(18) + } + + cellSelectButton.snp.makeConstraints { + $0.verticalEdges.equalToSuperview() + $0.left.equalToSuperview() + $0.right.equalTo(verticalStackView.snp.right) + } + } + + func setAction() { + self.cellSelectButton.addTarget(self, action: #selector(cellSelectButtonAction), for: .touchUpInside) + self.playButton.addTarget(self, action: #selector(playButtonAction), for: .touchUpInside) + } +} + +private extension LikeStorageTableViewCell { + @objc func playButtonAction() { + guard let model else { return } + delegate?.buttonTapped(type: .playTapped(song: model)) + } + + @objc func cellSelectButtonAction() { + guard let indexPath else { return } + delegate?.buttonTapped(type: .cellTapped(indexPath: indexPath)) + } +} diff --git a/Projects/Features/StorageFeature/Sources/Views/LikeStorageView.swift b/Projects/Features/StorageFeature/Sources/Views/LikeStorageView.swift new file mode 100644 index 000000000..e8c10dfd5 --- /dev/null +++ b/Projects/Features/StorageFeature/Sources/Views/LikeStorageView.swift @@ -0,0 +1,144 @@ +import BaseFeature +import BaseFeatureInterface +import DesignSystem +import LogManager +import NVActivityIndicatorView +import PlaylistFeatureInterface +import RxCocoa +import RxDataSources +import RxRelay +import RxSwift +import SignInFeatureInterface +import SongsDomainInterface +import UIKit +import UserDomainInterface +import Utility + +private protocol LikeStorageStateProtocol { + func updateActivityIndicatorState(isPlaying: Bool) + func updateRefreshControlState(isPlaying: Bool) + func updateIsEnabledRefreshControl(isEnabled: Bool) + func updateIsHiddenLoginWarningView(isHidden: Bool) + func updateIsHiddenEmptyWarningView(isHidden: Bool) +} + +private protocol LikeStorageActionProtocol { + var loginButtonDidTap: Observable { get } + var refreshControlValueChanged: Observable { get } +} + +final class LikeStorageView: UIView { + let tableView = UITableView().then { + $0.backgroundColor = .clear + $0.register(LikeStorageTableViewCell.self, forCellReuseIdentifier: LikeStorageTableViewCell.reuseIdentifer) + $0.separatorStyle = .none + } + + fileprivate let loginWarningView = LoginWarningView(text: "로그인 하고\n좋아요를 확인해보세요.") { return } + + private let activityIndicator = NVActivityIndicatorView( + frame: .zero, + type: .circleStrokeSpin, + color: DesignSystemAsset.PrimaryColor.point.color + ) + + fileprivate let refreshControl = UIRefreshControl() + + init() { + super.init(frame: .zero) + addView() + setLayout() + configureUI() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func addView() { + self.addSubviews( + tableView, + loginWarningView, + activityIndicator + ) + } + + func setLayout() { + tableView.snp.makeConstraints { + $0.top.equalTo(safeAreaLayoutGuide).offset(52) + $0.horizontalEdges.equalToSuperview() + $0.bottom.equalToSuperview() + } + loginWarningView.snp.makeConstraints { + $0.width.equalTo(164) + $0.height.equalTo(176) + $0.top.equalTo(tableView.snp.top).offset(148) + $0.centerX.equalToSuperview() + } + activityIndicator.snp.makeConstraints { + $0.width.height.equalTo(30) + $0.center.equalToSuperview() + } + } + + func configureUI() { + backgroundColor = DesignSystemAsset.BlueGrayColor.blueGray100.color + tableView.refreshControl = refreshControl + tableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 56, right: 0) + loginWarningView.isHidden = true + activityIndicator.isHidden = true + activityIndicator.stopAnimating() + } +} + +extension LikeStorageView: LikeStorageStateProtocol { + func updateIsHiddenEmptyWarningView(isHidden: Bool) { + if tableView.frame.size == .zero { return } + let isLoggedIn = loginWarningView.isHidden + + let warningView = WMWarningView( + text: "좋아요한 곡이 없습니다." + ) + + if !isHidden && isLoggedIn { + tableView.setBackgroundView(warningView, tableView.frame.height / 3 - 40) + } else { + tableView.restore() + } + } + + func updateIsEnabledRefreshControl(isEnabled: Bool) { + self.tableView.refreshControl = isEnabled ? refreshControl : nil + } + + func updateIsHiddenLoginWarningView(isHidden: Bool) { + self.loginWarningView.isHidden = isHidden + } + + func updateRefreshControlState(isPlaying: Bool) { + if isPlaying { + self.refreshControl.beginRefreshing() + } else { + self.refreshControl.endRefreshing() + } + } + + func updateActivityIndicatorState(isPlaying: Bool) { + if isPlaying { + self.activityIndicator.startAnimating() + } else { + self.activityIndicator.stopAnimating() + } + } +} + +extension Reactive: LikeStorageActionProtocol where Base: LikeStorageView { + var loginButtonDidTap: Observable { + base.loginWarningView.loginButtonDidTapSubject.asObservable() + } + + var refreshControlValueChanged: Observable { + base.refreshControl.rx.controlEvent(.valueChanged).map { () }.asObservable() + } +} diff --git a/Projects/Features/StorageFeature/Sources/Views/ListStorageTableViewCell.swift b/Projects/Features/StorageFeature/Sources/Views/ListStorageTableViewCell.swift new file mode 100644 index 000000000..b24e9adf8 --- /dev/null +++ b/Projects/Features/StorageFeature/Sources/Views/ListStorageTableViewCell.swift @@ -0,0 +1,212 @@ +import DesignSystem +import Kingfisher +import RxCocoa +import RxSwift +import SnapKit +import Then +import UIKit +import UserDomainInterface +import Utility + +public protocol ListStorageTableViewCellDelegate: AnyObject { + func buttonTapped(type: ListStorageTableViewCellDelegateConstant) +} + +public enum ListStorageTableViewCellDelegateConstant { + case cellTapped((indexPath: IndexPath, key: String)) + case listTapped((indexPath: IndexPath, key: String)) + case playTapped((indexPath: IndexPath, key: String)) +} + +class ListStorageTableViewCell: UITableViewCell { + static let reuseIdentifer = "ListStorageTableViewCell" + + private let playlistImageView = UIImageView().then { + $0.layer.cornerRadius = 4 + $0.clipsToBounds = true + } + + private let nameLabel = WMLabel( + text: "", + textColor: DesignSystemAsset.BlueGrayColor.blueGray900.color, + font: .t6(weight: .medium), + kernValue: -0.5 + ).then { + $0.lineBreakMode = .byTruncatingTail + } + + private let verticalStackView = UIStackView().then { + $0.axis = .vertical + } + + private let playButton = UIButton().then { + $0.setImage(DesignSystemAsset.Player.playLarge.image, for: .normal) + $0.layer.addShadow( + color: UIColor(hex: "#080F34"), + alpha: 0.04, + x: 0, + y: 6, + blur: 6, + spread: 0 + ) + } + + private let lockImageView: UIImageView = UIImageView().then { + $0.image = DesignSystemAsset.Storage.storageClose.image + $0.isHidden = true + } + + private let countLabel = WMLabel( + text: "", + textColor: DesignSystemAsset.BlueGrayColor.blueGray300.color, + font: .t7(weight: .light), + kernValue: -0.5 + ) + + private let countContainerView: UIView = UIView() + + private let cellSelectButton = UIButton() + private let listSelectButton = UIButton() + + weak var delegate: ListStorageTableViewCellDelegate? + var passToModel: (IndexPath, String) = (IndexPath(row: 0, section: 0), "") + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + addView() + setLayout() + setAction() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +extension ListStorageTableViewCell { + func addView() { + self.contentView.addSubviews( + playlistImageView, + verticalStackView, + playButton, + cellSelectButton, + listSelectButton + ) + verticalStackView.addArrangedSubviews(nameLabel, countContainerView) + countContainerView.addSubviews(countLabel, lockImageView) + } + + func setLayout() { + playlistImageView.snp.makeConstraints { + $0.width.height.equalTo(40) + $0.centerY.equalToSuperview() + $0.left.equalToSuperview().inset(20) + } + + verticalStackView.snp.makeConstraints { + $0.centerY.equalToSuperview() + $0.left.equalTo(playlistImageView.snp.right).offset(8) + $0.right.equalTo(playButton.snp.left).offset(-16) + } + + playButton.snp.makeConstraints { + $0.width.height.equalTo(32) + $0.centerY.equalToSuperview() + $0.right.equalToSuperview().inset(20) + } + + cellSelectButton.snp.makeConstraints { + $0.verticalEdges.equalToSuperview() + $0.left.equalToSuperview() + $0.right.equalTo(verticalStackView.snp.right) + } + + listSelectButton.snp.makeConstraints { + $0.verticalEdges.equalToSuperview() + $0.left.equalToSuperview() + $0.right.equalTo(verticalStackView.snp.right) + } + + nameLabel.snp.makeConstraints { + $0.height.equalTo(22) + } + + countLabel.snp.makeConstraints { + $0.height.equalTo(18) + $0.top.bottom.equalToSuperview() + $0.leading.equalToSuperview() + } + + lockImageView.snp.makeConstraints { + $0.leading.equalTo(countLabel.snp.trailing) + $0.width.height.equalTo(16) + $0.bottom.equalToSuperview().offset(-1) + } + } + + func setAction() { + self.cellSelectButton.addTarget(self, action: #selector(cellSelectButtonAction), for: .touchUpInside) + self.listSelectButton.addTarget(self, action: #selector(listSelectButtonAction), for: .touchUpInside) + self.playButton.addTarget(self, action: #selector(playButtonAction), for: .touchUpInside) + } + + func update(model: PlaylistEntity, isEditing: Bool, indexPath: IndexPath) { + self.passToModel = (indexPath, model.key) + + self.playlistImageView.kf.setImage( + with: URL(string: model.image), + placeholder: nil, + options: [.transition(.fade(0.2))] + ) + + self.nameLabel.attributedText = getAttributedString( + text: model.title, + font: DesignSystemFontFamily.Pretendard.medium.font(size: 14) + ) + + self.countLabel.attributedText = getAttributedString( + text: "\(model.songCount)곡", + font: DesignSystemFontFamily.Pretendard.light.font(size: 12) + ) + + self.backgroundColor = model.isSelected ? DesignSystemAsset.BlueGrayColor.blueGray200.color : UIColor.clear + self.cellSelectButton.isHidden = !isEditing + self.listSelectButton.isHidden = isEditing + self.playButton.isHidden = isEditing + self.lockImageView.isHidden = !model.private + + self.playButton.snp.updateConstraints { + $0.right.equalToSuperview().inset(isEditing ? -24 : 20) + } + } + + private func getAttributedString( + text: String, + font: UIFont + ) -> NSMutableAttributedString { + let attributedString = NSMutableAttributedString( + string: text, + attributes: [ + .font: font, + .foregroundColor: DesignSystemAsset.BlueGrayColor.blueGray900.color, + .kern: -0.5 + ] + ) + return attributedString + } +} + +extension ListStorageTableViewCell { + @objc func cellSelectButtonAction() { + delegate?.buttonTapped(type: .cellTapped(passToModel)) + } + + @objc func listSelectButtonAction() { + delegate?.buttonTapped(type: .listTapped(passToModel)) + } + + @objc func playButtonAction() { + delegate?.buttonTapped(type: .playTapped(passToModel)) + } +} diff --git a/Projects/Features/StorageFeature/Sources/Views/ListStorageView.swift b/Projects/Features/StorageFeature/Sources/Views/ListStorageView.swift new file mode 100644 index 000000000..5aae9c258 --- /dev/null +++ b/Projects/Features/StorageFeature/Sources/Views/ListStorageView.swift @@ -0,0 +1,204 @@ +import BaseFeature +import BaseFeatureInterface +import DesignSystem +import LogManager +import NVActivityIndicatorView +import PlaylistFeatureInterface +import RxCocoa +import RxDataSources +import RxRelay +import RxSwift +import SignInFeatureInterface +import SongsDomainInterface +import UIKit +import UserDomainInterface +import Utility + +private protocol ListStorageStateProtocol { + func updateActivityIndicatorState(isPlaying: Bool) + func updateRefreshControlState(isPlaying: Bool) + func updateIsEnabledRefreshControl(isEnabled: Bool) + func updateIsHiddenLoginWarningView(isHidden: Bool) + func updateIsHiddenEmptyWarningView(isHidden: Bool) + func startParticeAnimation() + func removeParticeAnimation() +} + +private protocol ListStorageActionProtocol { + var loginButtonDidTap: Observable { get } + var refreshControlValueChanged: Observable { get } + var drawFruitButtonDidTap: Observable { get } +} + +final class ListStorageView: UIView { + let tableView = UITableView().then { + $0.backgroundColor = .clear + $0.register(ListStorageTableViewCell.self, forCellReuseIdentifier: ListStorageTableViewCell.reuseIdentifer) + $0.separatorStyle = .none + } + + fileprivate let drawFruitButton = UIButton().then { + $0.setTitle("음표 열매 뽑기", for: .normal) + } + + private let particleAnimationView = ParticleAnimationView() + + fileprivate let loginWarningView = LoginWarningView(text: "로그인 하고\n리스트를 확인해보세요.") { return } + + private let activityIndicator = NVActivityIndicatorView( + frame: .zero, + type: .circleStrokeSpin, + color: DesignSystemAsset.PrimaryColor.point.color + ) + + fileprivate let refreshControl = UIRefreshControl() + + private var gradientLayer = CAGradientLayer() + + init() { + super.init(frame: .zero) + addView() + setLayout() + configureUI() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func layoutSubviews() { + super.layoutSubviews() + gradientLayer.frame = drawFruitButton.bounds + } +} + +private extension ListStorageView { + func addView() { + self.addSubviews( + tableView, + drawFruitButton, + particleAnimationView, + loginWarningView, + activityIndicator + ) + } + + func setLayout() { + tableView.snp.makeConstraints { + $0.top.equalTo(safeAreaLayoutGuide).offset(68 - 16) + $0.horizontalEdges.equalToSuperview() + $0.bottom.equalTo(drawFruitButton.snp.top) + } + drawFruitButton.snp.makeConstraints { + $0.height.equalTo(56) + $0.horizontalEdges.equalToSuperview() + $0.bottom.equalToSuperview() + } + particleAnimationView.snp.makeConstraints { + $0.height.equalTo(80) + $0.horizontalEdges.equalToSuperview() + $0.bottom.equalToSuperview() + } + loginWarningView.snp.makeConstraints { + $0.width.equalTo(164) + $0.height.equalTo(176) + $0.top.equalTo(tableView.snp.top).offset(56 + 80) + $0.centerX.equalToSuperview() + } + activityIndicator.snp.makeConstraints { + $0.width.height.equalTo(30) + $0.center.equalToSuperview() + } + } + + func configureUI() { + backgroundColor = DesignSystemAsset.BlueGrayColor.blueGray100.color + tableView.refreshControl = refreshControl + tableView.verticalScrollIndicatorInsets = UIEdgeInsets(top: 0, left: 0, bottom: 56, right: 0) + tableView.sectionHeaderTopPadding = 0 + + loginWarningView.isHidden = true + activityIndicator.isHidden = true + activityIndicator.stopAnimating() + + drawFruitButton.setAttributedTitle( + NSAttributedString( + string: "음표 열매 뽑기", + attributes: [ + .kern: -0.5, + .font: UIFont.WMFontSystem.t4(weight: .bold).font, + .foregroundColor: UIColor.white + ] + ), + for: .normal + ) + gradientLayer.colors = [UIColor(hex: "#0098E5").cgColor, UIColor(hex: "#968FE8").cgColor] + gradientLayer.startPoint = CGPoint(x: 0, y: 0.5) + gradientLayer.endPoint = CGPoint(x: 1, y: 0.5) + drawFruitButton.layer.addSublayer(gradientLayer) + } +} + +extension ListStorageView: ListStorageStateProtocol { + func startParticeAnimation() { + particleAnimationView.startAnimation() + } + + func removeParticeAnimation() { + particleAnimationView.removeAnimation() + } + + func updateIsHiddenEmptyWarningView(isHidden: Bool) { + if tableView.frame.size == .zero { return } + let isLoggedIn = loginWarningView.isHidden + + let warningView = WMWarningView( + text: "리스트가 없습니다." + ) + + if !isHidden && isLoggedIn { + tableView.setBackgroundView(warningView, tableView.frame.height / 3 - 40) + } else { + tableView.restore() + } + } + + func updateIsEnabledRefreshControl(isEnabled: Bool) { + self.tableView.refreshControl = isEnabled ? refreshControl : nil + } + + func updateIsHiddenLoginWarningView(isHidden: Bool) { + self.loginWarningView.isHidden = isHidden + } + + func updateRefreshControlState(isPlaying: Bool) { + if isPlaying { + self.refreshControl.beginRefreshing() + } else { + self.refreshControl.endRefreshing() + } + } + + func updateActivityIndicatorState(isPlaying: Bool) { + if isPlaying { + self.activityIndicator.startAnimating() + } else { + self.activityIndicator.stopAnimating() + } + } +} + +extension Reactive: ListStorageActionProtocol where Base: ListStorageView { + var loginButtonDidTap: Observable { + base.loginWarningView.loginButtonDidTapSubject.asObservable() + } + + var drawFruitButtonDidTap: Observable { + base.drawFruitButton.rx.tap.asObservable() + } + + var refreshControlValueChanged: Observable { + base.refreshControl.rx.controlEvent(.valueChanged).map { () }.asObservable() + } +} diff --git a/Projects/Features/StorageFeature/Sources/Views/MyPlayListHeaderView.swift b/Projects/Features/StorageFeature/Sources/Views/MyPlayListHeaderView.swift deleted file mode 100644 index ad0591b37..000000000 --- a/Projects/Features/StorageFeature/Sources/Views/MyPlayListHeaderView.swift +++ /dev/null @@ -1,106 +0,0 @@ -// -// MyPlayListHeaderView.swift -// StorageFeature -// -// Created by yongbeomkwak on 2023/01/27. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import DesignSystem -import CommonFeature - - -public protocol MyPlayListHeaderViewDelegate : AnyObject { - - func action(_ type:PurposeType ) - -} - - -class MyPlayListHeaderView: UIView { - - - @IBOutlet weak var createPlayListImageView: UIImageView! - @IBOutlet weak var createPlayListButton: UIButton! - @IBOutlet weak var createSuperView: UIView! - - - - @IBOutlet weak var loadSuperView: UIView! - @IBOutlet weak var loadPlayListImageView: UIImageView! - @IBOutlet weak var loadPlayListButton: UIButton! - - - - - weak var delegate:MyPlayListHeaderViewDelegate? - - - - @IBAction func createPlayListAction(_ sender: UIButton) { - delegate?.action(.creation) - } - - - - @IBAction func loadPlayListAction(_ sender: UIButton) { - delegate?.action(.load) - } - - - override init(frame: CGRect) { //코드쪽에서 생성 시 호출 - super.init(frame: frame) - self.setupView() - } - - required init?(coder aDecoder:NSCoder) //StoryBoard에서 호출됨 - { - super.init(coder: aDecoder) - self.setupView() - } - - - private func setupView() - { - if let view = Bundle.module.loadNibNamed("MyPlayListHeader", owner: self,options: nil)!.first as? UIView{ - view.frame = self.bounds - view.layoutIfNeeded() //드로우 사이클을 호출할 때 쓰임 - // view.backgroundColor = DesignSystemAsset.GrayColor.gray100.color - self.addSubview(view) - } - - - self.createPlayListImageView.image = DesignSystemAsset.Storage.storageNewPlaylistAdd.image - self.loadPlayListImageView.image = DesignSystemAsset.Storage.share.image - - let createAttr = NSMutableAttributedString(string: "리스트 만들기", - attributes: [.font: DesignSystemFontFamily.Pretendard.medium.font(size: 14), - .foregroundColor: DesignSystemAsset.GrayColor.gray900.color ]) - let loadAttr = NSMutableAttributedString(string: "리스트 가져오기", - attributes: [.font: DesignSystemFontFamily.Pretendard.medium.font(size: 14), - .foregroundColor: DesignSystemAsset.GrayColor.gray900.color ]) - - - for view in [self.createSuperView,self.loadSuperView] { - - view?.backgroundColor = .white.withAlphaComponent(0.4) - view?.layer.cornerRadius = 8 - view?.layer.borderColor = DesignSystemAsset.GrayColor.gray200.color.cgColor - view?.layer.borderWidth = 1 - } - - - - - self.createPlayListButton.setAttributedTitle(createAttr, for: .normal) - self.loadPlayListButton.setAttributedTitle(loadAttr, for: .normal) - - - - - - - - } -} diff --git a/Projects/Features/StorageFeature/Sources/Views/MyPlayListTableViewCell.swift b/Projects/Features/StorageFeature/Sources/Views/MyPlayListTableViewCell.swift deleted file mode 100644 index 52a806253..000000000 --- a/Projects/Features/StorageFeature/Sources/Views/MyPlayListTableViewCell.swift +++ /dev/null @@ -1,90 +0,0 @@ -// -// MyPlayListTableViewCell.swift -// StorageFeature -// -// Created by yongbeomkwak on 2023/01/27. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import DesignSystem -import DomainModule -import Kingfisher -import Utility - -public protocol MyPlayListTableViewCellDelegate: AnyObject { - func buttonTapped(type: MyPlayListTableViewCellDelegateConstant) -} - -public enum MyPlayListTableViewCellDelegateConstant { - case listTapped(indexPath: IndexPath) - case playTapped(indexPath: IndexPath) -} - -class MyPlayListTableViewCell: UITableViewCell { - - @IBOutlet weak var playListImageView: UIImageView! - @IBOutlet weak var playListNameLabel: UILabel! - @IBOutlet weak var playListCountLabel: UILabel! - @IBOutlet weak var playButton: UIButton! - @IBOutlet weak var playButtonTrailingConstraint: NSLayoutConstraint! - @IBOutlet weak var listSelectButton: UIButton! - - @IBAction func playButtonAction(_ sender: UIButton) { - delegate?.buttonTapped(type: .playTapped(indexPath: passToModel.0)) - } - - @IBAction func listSelectButtonAction(_ sender: Any) { - delegate?.buttonTapped(type: .listTapped(indexPath: passToModel.0)) - } - - weak var delegate: MyPlayListTableViewCellDelegate? - var passToModel: (IndexPath, String) = (IndexPath(row: 0, section: 0), "") - - override func awakeFromNib() { - super.awakeFromNib() - - self.backgroundColor = .clear - self.playListImageView.layer.cornerRadius = 4 - self.playButton.setImage(DesignSystemAsset.Storage.play.image , for: .normal) - } -} - -extension MyPlayListTableViewCell { - - func update(model: PlayListEntity, isEditing: Bool, indexPath: IndexPath){ - - self.passToModel = (indexPath, model.key) - - self.playListImageView.kf.setImage( - with: WMImageAPI.fetchPlayList(id: String(model.image),version: model.image_version).toURL, - placeholder: nil, - options: [.transition(.fade(0.2))]) - - self.playListNameLabel.attributedText = getAttributedString(text: model.title, font: DesignSystemFontFamily.Pretendard.medium.font(size: 14)) - - self.playListCountLabel.attributedText = getAttributedString(text: "\(model.songlist.count)곡", font: DesignSystemFontFamily.Pretendard.light.font(size: 12)) - - - self.backgroundColor = model.isSelected ? DesignSystemAsset.GrayColor.gray200.color : UIColor.clear - self.listSelectButton.isHidden = !isEditing - self.playButton.isHidden = isEditing - self.playButtonTrailingConstraint.constant = isEditing ? -24 : 20 - } - - - private func getAttributedString( - text: String, - font: UIFont - ) -> NSMutableAttributedString { - let attributedString = NSMutableAttributedString( - string: text, - attributes: [ - .font: font, - .foregroundColor: DesignSystemAsset.GrayColor.gray900.color, - .kern: -0.5 - ] - ) - return attributedString - } -} diff --git a/Projects/Features/StorageFeature/Sources/Views/NickNameInfoTableViewCell.swift b/Projects/Features/StorageFeature/Sources/Views/NickNameInfoTableViewCell.swift deleted file mode 100644 index faa5c8a56..000000000 --- a/Projects/Features/StorageFeature/Sources/Views/NickNameInfoTableViewCell.swift +++ /dev/null @@ -1,42 +0,0 @@ -// -// NickNameInfoTableViewCell.swift -// StorageFeature -// -// Created by yongbeomkwak on 2023/03/10. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import DesignSystem - -class NickNameInfoTableViewCell: UITableViewCell { - - @IBOutlet weak var descriptionLabel: UILabel! - - @IBOutlet weak var checkImageView: UIImageView! - override func awakeFromNib() { - super.awakeFromNib() - // Initialization code - - descriptionLabel.textColor = DesignSystemAsset.GrayColor.gray900.color - - } - - -} - -extension NickNameInfoTableViewCell { - - public func update(model:NickNameInfo){ - - - descriptionLabel.font = model.check ? DesignSystemFontFamily.Pretendard.medium.font(size: 18) : DesignSystemFontFamily.Pretendard.light.font(size: 18) - - descriptionLabel.text = model.description - - checkImageView.image = model.check ? DesignSystemAsset.Storage.checkBox.image : nil - - - } - -} diff --git a/Projects/Features/StorageFeature/Sources/Views/NoticeDetailHeaderView.swift b/Projects/Features/StorageFeature/Sources/Views/NoticeDetailHeaderView.swift deleted file mode 100644 index 33cf0ff7b..000000000 --- a/Projects/Features/StorageFeature/Sources/Views/NoticeDetailHeaderView.swift +++ /dev/null @@ -1,78 +0,0 @@ -// -// NoticeDetailHeaderView.swift -// StorageFeature -// -// Created by KTH on 2023/04/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import DomainModule -import DesignSystem -import Utility - -class NoticeDetailHeaderView: UICollectionReusableView { - - @IBOutlet weak var titleStringLabel: UILabel! - @IBOutlet weak var dateLabel: UILabel! - @IBOutlet weak var timeLabel: UILabel! - @IBOutlet weak var contentStringLabel: UILabel! - - override func awakeFromNib() { - super.awakeFromNib() - - titleStringLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 18) - titleStringLabel.textColor = DesignSystemAsset.GrayColor.gray900.color - titleStringLabel.setTextWithAttributes(kernValue: -0.5, lineSpacing: 0, lineHeightMultiple: 1.26) - - dateLabel.font = DesignSystemFontFamily.Pretendard.light.font(size: 12) - dateLabel.textColor = DesignSystemAsset.GrayColor.gray500.color - dateLabel.setTextWithAttributes(kernValue: -0.5, lineSpacing: 0, lineHeightMultiple: 0) - - timeLabel.font = DesignSystemFontFamily.Pretendard.light.font(size: 12) - timeLabel.textColor = DesignSystemAsset.GrayColor.gray500.color - timeLabel.setTextWithAttributes(kernValue: -0.5, lineSpacing: 0, lineHeightMultiple: 0) - - contentStringLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 14) - contentStringLabel.textColor = DesignSystemAsset.GrayColor.gray900.color - contentStringLabel.setTextWithAttributes(kernValue: -0.5, lineSpacing: 0, lineHeightMultiple: 1.26) - } -} - -extension NoticeDetailHeaderView { - - static func getCellHeight(model: FetchNoticeEntity) -> CGFloat { - let availableWidth: CGFloat = APP_WIDTH()-40 - let paragraphStyle = NSMutableParagraphStyle() - paragraphStyle.lineHeightMultiple = 1.26 - - let titleAttributedString = NSMutableAttributedString( - string: model.title, - attributes: [.font: DesignSystemFontFamily.Pretendard.medium.font(size: 18), - .foregroundColor: DesignSystemAsset.GrayColor.gray900.color, - .kern: -0.5, - .paragraphStyle: paragraphStyle] - ) - let titleHeight: CGFloat = max(28, titleAttributedString.height(containerWidth: availableWidth)) - - let contentString: String = model.content ?? "팬치들 스샷 참고하세요! 🥰" - let contentAttributedString = NSMutableAttributedString( - string: contentString, - attributes: [.font: DesignSystemFontFamily.Pretendard.medium.font(size: 14), - .foregroundColor: DesignSystemAsset.GrayColor.gray900.color, - .kern: -0.5, - .paragraphStyle: paragraphStyle] - ) - let contentHeight: CGFloat = contentString.isEmpty ? 0 : contentAttributedString.height(containerWidth: availableWidth) - - let baseHeight: CGFloat = 12 + 3 + 18 + 20 + 1 + 20 - return titleHeight + contentHeight + baseHeight - } - - func update(model: FetchNoticeEntity) { - titleStringLabel.text = model.title - dateLabel.text = (model.createAt/1000.0).unixTimeToDate.dateToString(format: "yy.MM.dd") - timeLabel.text = (model.createAt/1000.0).unixTimeToDate.dateToString(format: "HH:mm") - contentStringLabel.text = model.content ?? "팬치들 스샷 참고하세요! 🥰" - } -} diff --git a/Projects/Features/StorageFeature/Sources/Views/NoticeListCell.swift b/Projects/Features/StorageFeature/Sources/Views/NoticeListCell.swift deleted file mode 100644 index 33db60670..000000000 --- a/Projects/Features/StorageFeature/Sources/Views/NoticeListCell.swift +++ /dev/null @@ -1,45 +0,0 @@ -// -// NoticeListCell.swift -// StorageFeature -// -// Created by KTH on 2023/04/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import DomainModule -import Utility -import DesignSystem - -class NoticeListCell: UITableViewCell { - - @IBOutlet weak var titleStringLabel: UILabel! - @IBOutlet weak var dayLabel: UILabel! - @IBOutlet weak var timeLabel: UILabel! - - override func awakeFromNib() { - super.awakeFromNib() - self.backgroundColor = .clear - self.contentView.backgroundColor = .clear - - titleStringLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) - titleStringLabel.textColor = DesignSystemAsset.GrayColor.gray900.color - titleStringLabel.setTextWithAttributes(kernValue: -0.5, lineSpacing: 0, lineHeightMultiple: 1.26) - - dayLabel.font = DesignSystemFontFamily.Pretendard.light.font(size: 12) - dayLabel.textColor = DesignSystemAsset.GrayColor.gray500.color - dayLabel.setTextWithAttributes(kernValue: -0.5, lineSpacing: 0, lineHeightMultiple: 0) - - timeLabel.font = DesignSystemFontFamily.Pretendard.light.font(size: 12) - timeLabel.textColor = DesignSystemAsset.GrayColor.gray500.color - timeLabel.setTextWithAttributes(kernValue: -0.5, lineSpacing: 0, lineHeightMultiple: 0) - } -} - -extension NoticeListCell { - func update(model: FetchNoticeEntity) { - titleStringLabel.text = model.title - dayLabel.text = (model.createAt/1000.0).unixTimeToDate.dateToString(format: "yy.MM.dd") - timeLabel.text = (model.createAt/1000.0).unixTimeToDate.dateToString(format: "HH:mm") - } -} diff --git a/Projects/Features/StorageFeature/Sources/Views/ParticleAnimationView.swift b/Projects/Features/StorageFeature/Sources/Views/ParticleAnimationView.swift new file mode 100644 index 000000000..c406a7b67 --- /dev/null +++ b/Projects/Features/StorageFeature/Sources/Views/ParticleAnimationView.swift @@ -0,0 +1,170 @@ +import DesignSystem +import RxSwift +import SnapKit +import Then +import UIKit +import Utility + +private protocol ParticleAnimationStateProtocol { + func startAnimation() +} + +final class ParticleAnimationView: UIView { + private let isEnabledTouchEvent: Bool + + private let greenHeartImageView = UIImageView().then { + $0.contentMode = .scaleAspectFill + $0.image = DesignSystemAsset.Storage.heartGreen.image + } + + private let grayNoteImage = UIImageView().then { + $0.contentMode = .scaleAspectFill + $0.image = DesignSystemAsset.Storage.noteGray.image + } + + private let leftMediumParticleIamge = UIImageView().then { + $0.contentMode = .scaleAspectFill + $0.image = DesignSystemAsset.Storage.particleMedium.image + } + + private let leftSmallParticeImage = UIImageView().then { + $0.contentMode = .scaleAspectFill + $0.image = DesignSystemAsset.Storage.particleSmall.image + } + + private let purpleHeartImage = UIImageView().then { + $0.contentMode = .scaleAspectFill + $0.image = DesignSystemAsset.Storage.heartPurple.image + } + + private let blueHeartImage = UIImageView().then { + $0.contentMode = .scaleAspectFill + $0.image = DesignSystemAsset.Storage.heartBlue.image + } + + private let yellowHeartImage = UIImageView().then { + $0.contentMode = .scaleAspectFill + $0.image = DesignSystemAsset.Storage.heartYellow.image + } + + private let rightMediumParticleIamge = UIImageView().then { + $0.contentMode = .scaleAspectFill + $0.image = DesignSystemAsset.Storage.particleMedium.image + } + + private let rightSmallParticeImage = UIImageView().then { + $0.contentMode = .scaleAspectFill + $0.image = DesignSystemAsset.Storage.particleSmall.image + } + + init(isEnabledTouchEvent: Bool = false) { + self.isEnabledTouchEvent = isEnabledTouchEvent + super.init(frame: .zero) + addView() + setLayout() + configureUI() + bindNotification() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { + return isEnabledTouchEvent ? self : nil + } +} + +private extension ParticleAnimationView { + func addView() { + self.addSubviews( + greenHeartImageView, + grayNoteImage, + leftMediumParticleIamge, + leftSmallParticeImage, + purpleHeartImage, + blueHeartImage, + yellowHeartImage, + rightMediumParticleIamge, + rightSmallParticeImage + ) + } + + func setLayout() { + greenHeartImageView.snp.makeConstraints { + $0.left.equalToSuperview().inset(24.0.correctLeading) + $0.top.equalToSuperview().offset(34.0.correctTop) + } + grayNoteImage.snp.makeConstraints { + $0.left.equalToSuperview().inset(38.0.correctLeading) + $0.top.equalToSuperview().offset(27.0.correctTop) + } + leftMediumParticleIamge.snp.makeConstraints { + $0.left.equalToSuperview().inset(82.0.correctLeading) + $0.top.equalToSuperview().offset(47.0.correctTop) + } + leftSmallParticeImage.snp.makeConstraints { + $0.left.equalToSuperview().inset(91.0.correctLeading) + $0.top.equalToSuperview().offset(42.0.correctTop) + } + purpleHeartImage.snp.makeConstraints { + $0.left.equalToSuperview().inset(97.0.correctLeading) + $0.top.equalToSuperview().offset(8.0.correctTop) + } + blueHeartImage.snp.makeConstraints { + $0.left.equalToSuperview().inset(251.0.correctLeading) + $0.top.equalToSuperview().offset(15.0.correctTop) + } + rightSmallParticeImage.snp.makeConstraints { + $0.left.equalToSuperview().inset(297.0.correctLeading) + $0.top.equalToSuperview().offset(42.0.correctTop) + } + yellowHeartImage.snp.makeConstraints { + $0.left.equalToSuperview().inset(309.0.correctLeading) + $0.top.equalToSuperview().offset(37.0.correctTop) + } + rightMediumParticleIamge.snp.makeConstraints { + $0.left.equalToSuperview().inset(345.0.correctLeading) + $0.top.equalToSuperview().offset(42.0.correctTop) + } + } + + func configureUI() { + self.backgroundColor = .clear + } + + func bindNotification() { + NotificationCenter.default.addObserver( + self, + selector: #selector(removeAnimation), + name: UIApplication.didEnterBackgroundNotification, + object: nil + ) + + NotificationCenter.default.addObserver( + self, + selector: #selector(startAnimation), + name: UIApplication.didBecomeActiveNotification, + object: nil + ) + } +} + +extension ParticleAnimationView: ParticleAnimationStateProtocol { + @objc func removeAnimation() { + self.subviews.forEach { $0.removeAllAnimations() } + } + + @objc func startAnimation() { + greenHeartImageView.moveAnimate(duration: 2.0, amount: 20, direction: .up) + [grayNoteImage, leftMediumParticleIamge, leftSmallParticeImage].forEach { + $0.moveAnimate(duration: 2.0, amount: 10, direction: .up) + } + purpleHeartImage.moveAnimate(duration: 2.0, amount: 8, direction: .down) + blueHeartImage.moveAnimate(duration: 2.0, amount: 15, direction: .up) + [rightSmallParticeImage, yellowHeartImage, rightMediumParticleIamge].forEach { + $0.moveAnimate(duration: 3.0, amount: 15, direction: .up) + } + } +} diff --git a/Projects/Features/StorageFeature/Sources/Views/QuestionTableViewCell.swift b/Projects/Features/StorageFeature/Sources/Views/QuestionTableViewCell.swift deleted file mode 100644 index 51571203e..000000000 --- a/Projects/Features/StorageFeature/Sources/Views/QuestionTableViewCell.swift +++ /dev/null @@ -1,35 +0,0 @@ -// -// QuestionTableViewCell.swift -// StorageFeature -// -// Created by yongbeomkwak on 2023/01/30. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit -import DesignSystem -import DomainModule - -class QuestionTableViewCell: UITableViewCell { - - @IBOutlet weak var categoryLabel: UILabel! - @IBOutlet weak var titleLabel: UILabel! - @IBOutlet weak var expandImageView: UIImageView! - - - override func awakeFromNib() { - super.awakeFromNib() - categoryLabel.font = DesignSystemFontFamily.Pretendard.light.font(size: 12) - categoryLabel.setTextWithAttributes(kernValue: -0.5) - titleLabel.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) - titleLabel.setTextWithAttributes(kernValue: -0.5, lineSpacing: 5) - } -} - -extension QuestionTableViewCell{ - public func update(model:QnaEntity){ - categoryLabel.text = model.category - titleLabel.text = model.question - expandImageView.image = model.isOpen ? DesignSystemAsset.Navigation.fold.image : DesignSystemAsset.Navigation.close.image - } -} diff --git a/Projects/Features/StorageFeature/Sources/Views/StorageView.swift b/Projects/Features/StorageFeature/Sources/Views/StorageView.swift new file mode 100644 index 000000000..7f17c65b1 --- /dev/null +++ b/Projects/Features/StorageFeature/Sources/Views/StorageView.swift @@ -0,0 +1,132 @@ +import DesignSystem +import RxCocoa +import RxSwift +import SnapKit +import Then +import UIKit +import Utility + +private protocol StorageStateProtocol { + func updateIsHiddenEditButton(isHidden: Bool) +} + +private protocol StorageActionProtocol { + var editButtonDidTap: Observable { get } + var saveButtonDidTap: Observable { get } +} + +private enum ButtonAttributed { + static let edit = NSMutableAttributedString( + string: "편집", + attributes: [ + .font: DesignSystemFontFamily.Pretendard.bold.font(size: 12), + .foregroundColor: DesignSystemAsset.BlueGrayColor.blueGray400.color + ] + ) + static let save = NSMutableAttributedString( + string: "완료", + attributes: [ + .font: DesignSystemFontFamily.Pretendard.bold.font(size: 12), + .foregroundColor: DesignSystemAsset.PrimaryColor.point.color + ] + ) +} + +final class StorageView: UIView { + public let tabBarView = UIView() + + public let lineView = UIView() + + fileprivate let editButton = UIButton().then { + $0.setTitle("편집", for: .normal) + } + + fileprivate let saveButton = UIButton().then { + $0.setTitle("저장", for: .normal) + } + + init() { + super.init(frame: .zero) + addView() + setLayout() + configureUI() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func addView() { + self.addSubviews( + tabBarView, + editButton, + saveButton + ) + tabBarView.addSubview(lineView) + } + + func setLayout() { + tabBarView.snp.makeConstraints { + $0.top.equalTo(safeAreaLayoutGuide).offset(16) + $0.horizontalEdges.equalToSuperview().priority(999) + $0.height.equalTo(36) + } + + lineView.snp.makeConstraints { + $0.height.equalTo(1) + $0.bottom.equalToSuperview() + $0.horizontalEdges.equalToSuperview() + } + + editButton.snp.makeConstraints { + $0.width.equalTo(45) + $0.height.equalTo(24) + $0.bottom.equalTo(lineView.snp.top).offset(-8) + $0.right.equalToSuperview().inset(20) + } + + saveButton.snp.makeConstraints { + $0.width.equalTo(45) + $0.height.equalTo(24) + $0.bottom.equalTo(lineView.snp.top).offset(-8) + $0.right.equalToSuperview().inset(20) + } + } + + func configureUI() { + backgroundColor = DesignSystemAsset.BlueGrayColor.blueGray100.color + + lineView.backgroundColor = DesignSystemAsset.BlueGrayColor.blueGray200.color + + editButton.layer.cornerRadius = 4 + editButton.layer.borderWidth = 1 + editButton.backgroundColor = DesignSystemAsset.BlueGrayColor.blueGray100.color + editButton.layer.borderColor = DesignSystemAsset.BlueGrayColor.blueGray300.color.cgColor + editButton.setAttributedTitle(ButtonAttributed.edit, for: .normal) + + saveButton.isHidden = true + saveButton.layer.cornerRadius = 4 + saveButton.layer.borderWidth = 1 + saveButton.backgroundColor = DesignSystemAsset.BlueGrayColor.blueGray100.color + saveButton.layer.borderColor = DesignSystemAsset.PrimaryColor.point.color.cgColor + saveButton.setAttributedTitle(ButtonAttributed.save, for: .normal) + } +} + +extension StorageView: StorageStateProtocol { + func updateIsHiddenEditButton(isHidden: Bool) { + self.editButton.isHidden = isHidden + self.saveButton.isHidden = !isHidden + } +} + +extension Reactive: StorageActionProtocol where Base: StorageView { + var editButtonDidTap: Observable { + base.editButton.rx.tap.asObservable() + } + + var saveButtonDidTap: Observable { + base.saveButton.rx.tap.asObservable() + } +} diff --git a/Projects/Features/StorageFeature/Tests/TargetTests.swift b/Projects/Features/StorageFeature/Tests/TargetTests.swift index b1cf79405..147c29d2f 100644 --- a/Projects/Features/StorageFeature/Tests/TargetTests.swift +++ b/Projects/Features/StorageFeature/Tests/TargetTests.swift @@ -1,7 +1,6 @@ import XCTest class TargetTests: XCTestCase { - override func setUpWithError() throws { // Put setup code here. This method is called before the invocation of each test method in the class. } @@ -13,5 +12,4 @@ class TargetTests: XCTestCase { func testExample() throws { XCTAssertEqual("A", "A") } - } diff --git a/Projects/Features/StorageFeature/interface/StorageFactory.swift b/Projects/Features/StorageFeature/interface/StorageFactory.swift new file mode 100644 index 000000000..f478f0d2f --- /dev/null +++ b/Projects/Features/StorageFeature/interface/StorageFactory.swift @@ -0,0 +1,5 @@ +import UIKit + +public protocol StorageFactory { + func makeView() -> UIViewController +} diff --git a/Projects/Features/TeamFeature/Demo/Resources/LaunchScreen.storyboard b/Projects/Features/TeamFeature/Demo/Resources/LaunchScreen.storyboard new file mode 100644 index 000000000..865e9329f --- /dev/null +++ b/Projects/Features/TeamFeature/Demo/Resources/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Projects/Features/TeamFeature/Demo/Sources/AppDelegate.swift b/Projects/Features/TeamFeature/Demo/Sources/AppDelegate.swift new file mode 100644 index 000000000..ef2bae045 --- /dev/null +++ b/Projects/Features/TeamFeature/Demo/Sources/AppDelegate.swift @@ -0,0 +1,19 @@ +import UIKit + +@main +final class AppDelegate: UIResponder, UIApplicationDelegate { + var window: UIWindow? + + func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil + ) -> Bool { + window = UIWindow(frame: UIScreen.main.bounds) + let viewController = UIViewController() + viewController.view.backgroundColor = .yellow + window?.rootViewController = viewController + window?.makeKeyAndVisible() + + return true + } +} diff --git a/Projects/Features/TeamFeature/Interface/TeamInfoFactory.swift b/Projects/Features/TeamFeature/Interface/TeamInfoFactory.swift new file mode 100644 index 000000000..82a3b2b09 --- /dev/null +++ b/Projects/Features/TeamFeature/Interface/TeamInfoFactory.swift @@ -0,0 +1,5 @@ +import UIKit + +public protocol TeamInfoFactory { + func makeView() -> UIViewController +} diff --git a/Projects/Features/TeamFeature/Interface/TeamInfoModel.swift b/Projects/Features/TeamFeature/Interface/TeamInfoModel.swift new file mode 100644 index 000000000..610998448 --- /dev/null +++ b/Projects/Features/TeamFeature/Interface/TeamInfoModel.swift @@ -0,0 +1,14 @@ +import Foundation +import TeamDomainInterface + +public typealias TeamInfoSectionModel = (title: String, model: TeamInfoModel) + +public struct TeamInfoModel { + public let members: [TeamListEntity] + public var isOpen: Bool + + public init(members: [TeamListEntity], isOpen: Bool) { + self.members = members + self.isOpen = isOpen + } +} diff --git a/Projects/Features/TeamFeature/Interface/TeamInfoType.swift b/Projects/Features/TeamFeature/Interface/TeamInfoType.swift new file mode 100644 index 000000000..07c4162ac --- /dev/null +++ b/Projects/Features/TeamFeature/Interface/TeamInfoType.swift @@ -0,0 +1,7 @@ +import Foundation + +public enum TeamInfoType: String { + case develop = "개발팀" + case weeklyWM = "주간 왁뮤팀" + case unknown = "" +} diff --git a/Projects/Features/TeamFeature/Project.swift b/Projects/Features/TeamFeature/Project.swift new file mode 100644 index 000000000..bdeb4b2b3 --- /dev/null +++ b/Projects/Features/TeamFeature/Project.swift @@ -0,0 +1,29 @@ +import DependencyPlugin +import ProjectDescription +import ProjectDescriptionHelpers + +let project = Project.module( + name: ModulePaths.Feature.TeamFeature.rawValue, + targets: [ + .interface( + module: .feature(.TeamFeature), + dependencies: [ + .domain(target: .TeamDomain, type: .interface) + ] + ), + .implements( + module: .feature(.TeamFeature), + dependencies: [ + .feature(target: .TeamFeature, type: .interface), + .feature(target: .BaseFeature), + .domain(target: .TeamDomain, type: .interface) + ] + ), + .demo( + module: .feature(.TeamFeature), + dependencies: [ + .feature(target: .TeamFeature) + ] + ) + ] +) diff --git a/Projects/Features/TeamFeature/Sources/Components/TeamInfoComponent.swift b/Projects/Features/TeamFeature/Sources/Components/TeamInfoComponent.swift new file mode 100644 index 000000000..03f93e461 --- /dev/null +++ b/Projects/Features/TeamFeature/Sources/Components/TeamInfoComponent.swift @@ -0,0 +1,18 @@ +import NeedleFoundation +import TeamDomainInterface +import TeamFeatureInterface +import UIKit + +public protocol TeamInfoDependency: Dependency { + var fetchTeamListUseCase: any FetchTeamListUseCase { get } +} + +public final class TeamInfoComponent: Component, TeamInfoFactory { + public func makeView() -> UIViewController { + return TeamInfoViewController( + viewModel: .init( + fetchTeamListUseCase: dependency.fetchTeamListUseCase + ) + ) + } +} diff --git a/Projects/Features/TeamFeature/Sources/ViewControllers/TeamInfoContentViewController.swift b/Projects/Features/TeamFeature/Sources/ViewControllers/TeamInfoContentViewController.swift new file mode 100644 index 000000000..7ad7780a6 --- /dev/null +++ b/Projects/Features/TeamFeature/Sources/ViewControllers/TeamInfoContentViewController.swift @@ -0,0 +1,167 @@ +import BaseFeature +import DesignSystem +import Foundation +import LogManager +import RxCocoa +import RxSwift +import SnapKit +import Then +import UIKit +import Utility + +final class TeamInfoContentViewController: UIViewController { + private let tableView = UITableView().then { + $0.register(TeamInfoListCell.self, forCellReuseIdentifier: "\(TeamInfoListCell.self)") + $0.register(TeamInfoSectionView.self, forHeaderFooterViewReuseIdentifier: "\(TeamInfoSectionView.self)") + $0.separatorStyle = .none + $0.backgroundColor = .clear + $0.sectionHeaderTopPadding = 0 + $0.allowsSelection = false + } + + private let warningView = WarningView(frame: .zero).then { + $0.text = "팀 데이터가 없습니다." + $0.isHidden = true + } + + private let viewModel: TeamInfoContentViewModel + lazy var input = TeamInfoContentViewModel.Input() + lazy var output = viewModel.transform(from: input) + private let disposeBag = DisposeBag() + + deinit { + LogManager.printDebug("❌:: \(Self.self) deinit") + } + + public init(viewModel: TeamInfoContentViewModel) { + self.viewModel = viewModel + super.init(nibName: nil, bundle: nil) + } + + @available(*, unavailable) + public required init?(coder: NSCoder) { + fatalError("\(Self.self) has not been implemented") + } + + override func viewDidLoad() { + super.viewDidLoad() + addSubviews() + setLayout() + configureUI() + outputBind() + inputBind() + } +} + +private extension TeamInfoContentViewController { + func outputBind() { + output.dataSource + .skip(1) + .take(1) + .bind(with: self, onNext: { owner, source in + if owner.output.updateManager.value == nil { + owner.tableView.tableHeaderView = nil + } else { + let header = TeamInfoHeaderView(frame: .init(x: 0, y: 0, width: APP_WIDTH(), height: 140)) + header.update(entity: owner.output.updateManager.value) + owner.tableView.tableHeaderView = header + } + + let footer = TeamInfoFooterView(frame: .init(x: 0, y: 0, width: APP_WIDTH(), height: 88)) + owner.tableView.tableFooterView = footer + + owner.warningView.isHidden = !source.isEmpty + owner.tableView.isHidden = !owner.warningView.isHidden + owner.tableView.reloadData() + }) + .disposed(by: disposeBag) + } + + func inputBind() { + input.combineTeamList.onNext(()) + } +} + +private extension TeamInfoContentViewController { + func addSubviews() { + view.addSubviews(tableView, warningView) + } + + func setLayout() { + tableView.snp.makeConstraints { + $0.top.equalTo(view.safeAreaLayoutGuide).offset(output.type.value == .weeklyWM ? 100 : 104) + $0.horizontalEdges.bottom.equalToSuperview() + } + + warningView.snp.makeConstraints { + $0.center.equalToSuperview() + $0.width.equalTo(APP_WIDTH()) + $0.height.equalTo(tableView.frame.height / 3 * 2) + } + } + + func configureUI() { + tableView.delegate = self + tableView.dataSource = self + } +} + +extension TeamInfoContentViewController: TeamInfoSectionViewDelegate { + func toggleSection(header: TeamInfoSectionView, section: Int) { + var newDataSource = output.dataSource.value + newDataSource[section].model.isOpen = !newDataSource[section].model.isOpen + output.dataSource.accept(newDataSource) + header.rotate(isOpen: newDataSource[section].model.isOpen) + tableView.reloadSections(IndexSet(integer: section), with: .automatic) + } +} + +extension TeamInfoContentViewController: UITableViewDelegate, UITableViewDataSource { + func numberOfSections(in tableView: UITableView) -> Int { + return output.dataSource.value.count + } + + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return output.dataSource.value[section].model.isOpen ? + output.dataSource.value[section].model.members.count : 0 + } + + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + let members = output.dataSource.value[indexPath.section].model.members + return TeamInfoListCell.cellHeight(index: indexPath.row, totalCount: members.count) + } + + func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { + return 58 + } + + func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { + guard let sectionView = tableView.dequeueReusableHeaderFooterView( + withIdentifier: "\(TeamInfoSectionView.self)" + ) as? TeamInfoSectionView else { + return nil + } + sectionView.delegate = self + sectionView.update( + section: section, + title: output.dataSource.value[section].title, + isOpen: output.dataSource.value[section].model.isOpen + ) + return sectionView + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + guard let cell = tableView.dequeueReusableCell( + withIdentifier: "\(TeamInfoListCell.self)", + for: indexPath + ) as? TeamInfoListCell else { + return UITableViewCell() + } + cell.update( + entity: output.dataSource.value[indexPath.section].model.members[indexPath.row], + index: indexPath.row, + totalCount: output.dataSource.value[indexPath.section].model.members.count + ) + return cell + } +} diff --git a/Projects/Features/TeamFeature/Sources/ViewControllers/TeamInfoViewController.swift b/Projects/Features/TeamFeature/Sources/ViewControllers/TeamInfoViewController.swift new file mode 100644 index 000000000..b24112176 --- /dev/null +++ b/Projects/Features/TeamFeature/Sources/ViewControllers/TeamInfoViewController.swift @@ -0,0 +1,192 @@ +import BaseFeature +import DesignSystem +import Foundation +import LogManager +import NVActivityIndicatorView +import Pageboy +import RxCocoa +import RxSwift +import SnapKit +import Tabman +import TeamDomainInterface +import TeamFeatureInterface +import Then +import UIKit +import Utility + +public final class TeamInfoViewController: TabmanViewController { + private let navigationbarView = WMNavigationBarView() + + private let backButton = UIButton().then { + $0.setImage(DesignSystemAsset.Navigation.back.image, for: .normal) + } + + private let tabContentView = UIView() + + private let singleLineLabel = UILabel().then { + $0.backgroundColor = DesignSystemAsset.BlueGrayColor.gray300.color.withAlphaComponent(0.4) + } + + private lazy var activityIndicator = NVActivityIndicatorView(frame: .zero).then { + $0.color = DesignSystemAsset.PrimaryColorV2.point.color + $0.type = .circleStrokeSpin + } + + private lazy var viewControllers: [UIViewController] = { + return [] + }() + + private let viewModel: TeamInfoViewModel + lazy var input = TeamInfoViewModel.Input() + lazy var output = viewModel.transform(from: input) + private let disposeBag = DisposeBag() + + deinit { + LogManager.printDebug("❌:: \(Self.self) deinit") + } + + public init( + viewModel: TeamInfoViewModel + ) { + self.viewModel = viewModel + super.init(nibName: nil, bundle: nil) + } + + @available(*, unavailable) + public required init?(coder: NSCoder) { + fatalError("\(Self.self) has not been implemented") + } + + override public func viewDidLoad() { + super.viewDidLoad() + addSubviews() + setLayout() + configureUI() + configureTab() + outputBind() + inputBind() + } +} + +private extension TeamInfoViewController { + func outputBind() { + output.dataSource + .skip(1) + .bind(with: self, onNext: { owner, source in + let teams: [String] = owner.output.teams.value + let viewControllers = teams.map { team -> TeamInfoContentViewController in + return TeamInfoContentViewController( + viewModel: .init( + type: TeamInfoType(rawValue: team) ?? .unknown, + entities: source.filter { $0.team == team } + ) + ) + } + owner.viewControllers = viewControllers + owner.reloadData() + owner.activityIndicator.stopAnimating() + }) + .disposed(by: disposeBag) + } + + func inputBind() { + input.fetchTeamList.onNext(()) + + backButton.rx.tap + .bind(with: self) { owner, _ in + owner.navigationController?.popViewController(animated: true) + } + .disposed(by: disposeBag) + } +} + +private extension TeamInfoViewController { + func addSubviews() { + view.addSubviews(navigationbarView, tabContentView, activityIndicator) + tabContentView.addSubview(singleLineLabel) + navigationbarView.setLeftViews([backButton]) + navigationbarView.setTitle("팀 소개", textColor: DesignSystemAsset.BlueGrayColor.blueGray900.color) + } + + func setLayout() { + navigationbarView.snp.makeConstraints { + $0.top.equalTo(view.safeAreaLayoutGuide) + $0.horizontalEdges.equalToSuperview() + $0.height.equalTo(48) + } + + tabContentView.snp.makeConstraints { + $0.top.equalTo(navigationbarView.snp.bottom).offset(16 + 2) + $0.horizontalEdges.equalToSuperview() + $0.height.equalTo(36 - 2) + } + + singleLineLabel.snp.makeConstraints { + $0.bottom.equalToSuperview() + $0.horizontalEdges.equalToSuperview() + $0.height.equalTo(1) + } + + activityIndicator.snp.makeConstraints { + $0.center.equalToSuperview() + $0.size.equalTo(30) + } + } + + func configureUI() { + view.backgroundColor = DesignSystemAsset.BlueGrayColor.blueGray100.color + activityIndicator.startAnimating() + } +} + +private extension TeamInfoViewController { + func configureTab() { + self.dataSource = self + let bar = TMBar.ButtonBar() + + // 배경색 + bar.backgroundView.style = .clear + + // 간격 설정 + bar.layout.contentInset = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20) + bar.layout.contentMode = .fit + bar.layout.transitionStyle = .progressive + bar.layout.interButtonSpacing = 0 + + // 버튼 글씨 커스텀 + bar.buttons.customize { button in + button.tintColor = DesignSystemAsset.BlueGrayColor.gray400.color + button.selectedTintColor = DesignSystemAsset.BlueGrayColor.gray900.color + button.font = DesignSystemFontFamily.Pretendard.medium.font(size: 16) + button.selectedFont = DesignSystemFontFamily.Pretendard.bold.font(size: 16) + } + + // indicator + bar.indicator.weight = .custom(value: 2) + bar.indicator.tintColor = DesignSystemAsset.PrimaryColor.point.color + bar.indicator.overscrollBehavior = .compress + + addBar(bar, dataSource: self, at: .custom(view: tabContentView, layout: nil)) + } +} + +extension TeamInfoViewController: PageboyViewControllerDataSource, TMBarDataSource { + public func barItem(for bar: TMBar, at index: Int) -> TMBarItemable { + return TMBarItem(title: output.teams.value[index]) + } + + public func numberOfViewControllers(in pageboyViewController: PageboyViewController) -> Int { + return viewControllers.count + } + + public func viewController( + for pageboyViewController: PageboyViewController, + at index: PageboyViewController.PageIndex + ) -> UIViewController? { + return viewControllers[index] + } + + public func defaultPage(for pageboyViewController: PageboyViewController) -> PageboyViewController.Page? { + return nil + } +} diff --git a/Projects/Features/TeamFeature/Sources/ViewModels/TeamInfoContentViewModel.swift b/Projects/Features/TeamFeature/Sources/ViewModels/TeamInfoContentViewModel.swift new file mode 100644 index 000000000..ac820acbd --- /dev/null +++ b/Projects/Features/TeamFeature/Sources/ViewModels/TeamInfoContentViewModel.swift @@ -0,0 +1,58 @@ +import BaseFeature +import Foundation +import LogManager +import RxRelay +import RxSwift +import TeamDomainInterface +import TeamFeatureInterface + +public final class TeamInfoContentViewModel: ViewModelType { + private let type: TeamInfoType + private let entities: [TeamListEntity] + private let disposeBag = DisposeBag() + + deinit { + LogManager.printDebug("❌:: \(Self.self) deinit") + } + + public init(type: TeamInfoType, entities: [TeamListEntity]) { + self.type = type + self.entities = entities + } + + public struct Input { + let combineTeamList: PublishSubject = .init() + } + + public struct Output { + let dataSource: BehaviorRelay<[TeamInfoSectionModel]> = .init(value: []) + let updateManager: BehaviorRelay = BehaviorRelay(value: nil) + let type: BehaviorRelay = .init(value: .develop) + } + + public func transform(from input: Input) -> Output { + let output = Output() + let entities = self.entities + let parts = entities.map { $0.part }.filter { $0 != "총괄" }.uniqueElements + + output.updateManager.accept(entities.filter { $0.isManager }.first) + output.type.accept(type) + + input.combineTeamList + .map { _ -> [TeamInfoSectionModel] in + return parts.map { part -> TeamInfoSectionModel in + return TeamInfoSectionModel( + title: part, + model: TeamInfoModel( + members: entities.filter { $0.part == part }, + isOpen: true + ) + ) + } + } + .bind(to: output.dataSource) + .disposed(by: disposeBag) + + return output + } +} diff --git a/Projects/Features/TeamFeature/Sources/ViewModels/TeamInfoViewModel.swift b/Projects/Features/TeamFeature/Sources/ViewModels/TeamInfoViewModel.swift new file mode 100644 index 000000000..29db26a21 --- /dev/null +++ b/Projects/Features/TeamFeature/Sources/ViewModels/TeamInfoViewModel.swift @@ -0,0 +1,50 @@ +import BaseFeature +import Foundation +import LogManager +import RxRelay +import RxSwift +import TeamDomainInterface + +public final class TeamInfoViewModel: ViewModelType { + private let fetchTeamListUseCase: FetchTeamListUseCase + private let disposeBag = DisposeBag() + + deinit { + LogManager.printDebug("❌:: \(Self.self) deinit") + } + + public init( + fetchTeamListUseCase: any FetchTeamListUseCase + ) { + self.fetchTeamListUseCase = fetchTeamListUseCase + } + + public struct Input { + let fetchTeamList: PublishSubject = PublishSubject() + } + + public struct Output { + let dataSource: BehaviorRelay<[TeamListEntity]> = .init(value: []) + let teams: BehaviorRelay<[String]> = .init(value: []) + } + + public func transform(from input: Input) -> Output { + let output = Output() + + input.fetchTeamList + .flatMap { [weak self] _ -> Observable<[TeamListEntity]> in + guard let self = self else { return .never() } + return self.fetchTeamListUseCase.execute() + .asObservable() + .catchAndReturn([]) + } + .do(onNext: { source in + let teams: [String] = source.map { $0.team }.uniqueElements + output.teams.accept(teams) + }) + .bind(to: output.dataSource) + .disposed(by: disposeBag) + + return output + } +} diff --git a/Projects/Features/TeamFeature/Sources/Views/TeamInfoFooterView.swift b/Projects/Features/TeamFeature/Sources/Views/TeamInfoFooterView.swift new file mode 100644 index 000000000..dca9f057c --- /dev/null +++ b/Projects/Features/TeamFeature/Sources/Views/TeamInfoFooterView.swift @@ -0,0 +1,63 @@ +import DesignSystem +import Foundation +import UIKit +import Utility + +final class TeamInfoFooterView: UIView { + private let dotContentView = UIView() + + private let dotLabel = UILabel().then { + $0.backgroundColor = DesignSystemAsset.BlueGrayColor.blueGray400.color + $0.layer.cornerRadius = 2 + $0.clipsToBounds = true + } + + private let descriptionLabel = WMLabel( + text: "왁타버스 뮤직 팀에 속한 모든 팀원들은 부아내비 (부려먹는 게 아니라 내가 비빈 거다)라는 모토를 가슴에 새기고 일하고 있습니다.", + textColor: DesignSystemAsset.BlueGrayColor.blueGray500.color, + font: .t7(weight: .light), + lineHeight: UIFont.WMFontSystem.t7(weight: .light).lineHeight + ).then { + $0.numberOfLines = 0 + $0.preferredMaxLayoutWidth = APP_WIDTH() - 20 - 16 - 20 + } + + override init(frame: CGRect) { + super.init(frame: frame) + addSubViews() + setLayout() + configureUI() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +private extension TeamInfoFooterView { + func addSubViews() { + addSubviews(dotContentView, descriptionLabel) + dotContentView.addSubview(dotLabel) + } + + func setLayout() { + dotContentView.snp.makeConstraints { + $0.top.equalToSuperview().offset(12) + $0.leading.equalToSuperview().offset(20) + $0.size.equalTo(16) + } + + dotLabel.snp.makeConstraints { + $0.center.equalToSuperview() + $0.size.equalTo(4) + } + + descriptionLabel.snp.makeConstraints { + $0.top.equalTo(dotContentView.snp.top) + $0.leading.equalTo(dotContentView.snp.trailing) + } + } + + func configureUI() {} +} diff --git a/Projects/Features/TeamFeature/Sources/Views/TeamInfoHeaderView.swift b/Projects/Features/TeamFeature/Sources/Views/TeamInfoHeaderView.swift new file mode 100644 index 000000000..71c1794a3 --- /dev/null +++ b/Projects/Features/TeamFeature/Sources/Views/TeamInfoHeaderView.swift @@ -0,0 +1,96 @@ +import DesignSystem +import Foundation +import TeamDomainInterface +import UIKit +import Utility + +final class TeamInfoHeaderView: UIView { + private let profileImageView = UIImageView().then { + $0.contentMode = .scaleAspectFill + $0.layer.cornerRadius = 28 + $0.clipsToBounds = true + } + + private let crownImageView = UIImageView().then { + $0.contentMode = .scaleAspectFit + $0.image = DesignSystemAsset.Team.crown.image + } + + private let descriptionLabel = UILabel().then { + $0.textAlignment = .center + $0.preferredMaxLayoutWidth = APP_WIDTH() - 40 + } + + override init(frame: CGRect) { + super.init(frame: frame) + addSubViews() + setLayout() + configureUI() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +extension TeamInfoHeaderView { + func update(entity: TeamListEntity?) { + let target = "총괄" + let descriptionString = "\(target) · \(entity?.name ?? "")" + let attributedString = NSMutableAttributedString( + string: descriptionString, + attributes: [ + .font: UIFont.WMFontSystem.t5(weight: .medium).font, + .foregroundColor: DesignSystemAsset.BlueGrayColor.blueGray900.color, + .kern: -0.5 + ] + ) + + attributedString.addAttributes( + [ + .font: UIFont.WMFontSystem.t5(weight: .light).font, + .foregroundColor: DesignSystemAsset.BlueGrayColor.blueGray900.color, + .kern: -0.5 + ], + range: NSRange(location: 0, length: target.count) + ) + descriptionLabel.attributedText = attributedString + + profileImageView.kf.setImage( + with: URL(string: entity?.profile ?? ""), + placeholder: nil, + options: [.transition(.fade(0.2))] + ) + } +} + +private extension TeamInfoHeaderView { + func addSubViews() { + addSubviews(profileImageView, crownImageView, descriptionLabel) + } + + func setLayout() { + profileImageView.snp.makeConstraints { + $0.top.equalToSuperview().offset(33) + $0.centerX.equalToSuperview() + $0.size.equalTo(56) + } + + crownImageView.snp.makeConstraints { + $0.top.equalToSuperview().offset(15) + $0.centerX.equalToSuperview() + $0.size.equalTo(24) + } + + descriptionLabel.snp.makeConstraints { + $0.top.equalTo(profileImageView.snp.bottom).offset(4) + $0.centerX.equalToSuperview() + $0.height.equalTo(24) + } + } + + func configureUI() { + backgroundColor = colorFromRGB(0xE4E7EC).withAlphaComponent(0.5) + } +} diff --git a/Projects/Features/TeamFeature/Sources/Views/TeamInfoListCell.swift b/Projects/Features/TeamFeature/Sources/Views/TeamInfoListCell.swift new file mode 100644 index 000000000..25d88cf5e --- /dev/null +++ b/Projects/Features/TeamFeature/Sources/Views/TeamInfoListCell.swift @@ -0,0 +1,172 @@ +import DesignSystem +import Foundation +import TeamDomainInterface +import UIKit +import Utility + +final class TeamInfoListCell: UITableViewCell { + private let outsideStackView = UIStackView().then { + $0.axis = .vertical + $0.spacing = 0 + } + + private let topSpacingView = UIView() + private let outsideView = UIView() + private let bottomSpacingView = UIView() + + private let leadLabel = WMLabel( + text: "팀장", + textColor: .white, + font: .t8(weight: .medium), + alignment: .center + ).then { + $0.backgroundColor = DesignSystemAsset.PrimaryColorV2.sub1.color + $0.layer.cornerRadius = 12 + $0.clipsToBounds = true + } + + private let profileImageView = UIImageView().then { + $0.contentMode = .scaleAspectFill + $0.layer.cornerRadius = 16 + $0.clipsToBounds = true + } + + private let descriptionStackView = UIStackView().then { + $0.axis = .vertical + $0.spacing = 0 + } + + private let nameLabel = WMLabel( + text: "", + textColor: DesignSystemAsset.BlueGrayColor.blueGray900.color, + font: .t6(weight: .medium) + ) + + private let positionLabel = WMLabel( + text: "", + textColor: DesignSystemAsset.BlueGrayColor.blueGray900.color, + font: .t7(weight: .light) + ) + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + addSubViews() + setLayout() + configureUI() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +extension TeamInfoListCell { + static func cellHeight(index: Int, totalCount: Int) -> CGFloat { + if totalCount == 1 { + return 12 + 40 + 12 + + } else { + if index == 0 { + return 8 + 4 + 40 + 4 + + } else if index == totalCount - 1 { + return 4 + 40 + 4 + 8 + + } else { + return 4 + 40 + 4 + } + } + } + + func update(entity: TeamListEntity, index: Int, totalCount: Int) { + leadLabel.isHidden = !entity.isLead + nameLabel.text = entity.name + positionLabel.text = entity.position + + if totalCount == 1 { + topSpacingView.isHidden = false + bottomSpacingView.isHidden = false + + } else { + if index == 0 { + topSpacingView.isHidden = false + bottomSpacingView.isHidden = true + + } else if index == totalCount - 1 { + topSpacingView.isHidden = true + bottomSpacingView.isHidden = false + + } else { + topSpacingView.isHidden = true + bottomSpacingView.isHidden = true + } + } + + profileImageView.kf.setImage( + with: URL(string: entity.profile), + placeholder: nil, + options: [.transition(.fade(0.2))] + ) + } +} + +private extension TeamInfoListCell { + func addSubViews() { + contentView.addSubviews(outsideStackView) + outsideStackView.addArrangedSubviews(topSpacingView, outsideView, bottomSpacingView) + outsideView.addSubviews(leadLabel, profileImageView, descriptionStackView) + descriptionStackView.addArrangedSubviews(nameLabel, positionLabel) + } + + func setLayout() { + outsideStackView.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview() + $0.centerY.equalToSuperview() + } + + topSpacingView.snp.makeConstraints { + $0.height.equalTo(8) + } + + outsideView.snp.makeConstraints { + $0.height.equalTo(4 + 40 + 4) + } + + bottomSpacingView.snp.makeConstraints { + $0.height.equalTo(8) + } + + leadLabel.snp.makeConstraints { + $0.leading.equalToSuperview().offset(20) + $0.centerY.equalToSuperview() + $0.width.equalTo(39) + $0.height.equalTo(24) + } + + profileImageView.snp.makeConstraints { + $0.leading.equalTo(leadLabel.snp.trailing).offset(9) + $0.centerY.equalTo(leadLabel.snp.centerY) + $0.size.equalTo(32) + } + + descriptionStackView.snp.makeConstraints { + $0.leading.equalTo(profileImageView.snp.trailing).offset(8) + $0.centerY.equalTo(leadLabel.snp.centerY) + $0.trailing.equalToSuperview().offset(-20) + } + + nameLabel.snp.makeConstraints { + $0.height.equalTo(22) + } + + positionLabel.snp.makeConstraints { + $0.height.equalTo(18) + } + } + + func configureUI() { + backgroundColor = UIColor.clear + contentView.backgroundColor = colorFromRGB(0xE4E7EC).withAlphaComponent(0.5) + } +} diff --git a/Projects/Features/TeamFeature/Sources/Views/TeamInfoSectionView.swift b/Projects/Features/TeamFeature/Sources/Views/TeamInfoSectionView.swift new file mode 100644 index 000000000..181a37bc1 --- /dev/null +++ b/Projects/Features/TeamFeature/Sources/Views/TeamInfoSectionView.swift @@ -0,0 +1,101 @@ +import DesignSystem +import UIKit +import Utility + +protocol TeamInfoSectionViewDelegate: AnyObject { + func toggleSection(header: TeamInfoSectionView, section: Int) +} + +final class TeamInfoSectionView: UITableViewHeaderFooterView { + private let folderImageView = UIImageView().then { + $0.image = DesignSystemAsset.Team.folderOn.image + $0.contentMode = .scaleAspectFit + } + + private let titleLabel = WMLabel( + text: "", + textColor: DesignSystemAsset.BlueGrayColor.blueGray900.color, + font: .t5(weight: .medium) + ).then { + $0.numberOfLines = 2 + } + + private let arrowImageView = UIImageView().then { + $0.image = DesignSystemAsset.Team.arrowTop.image + $0.contentMode = .scaleAspectFit + } + + private var section: Int = 0 + weak var delegate: TeamInfoSectionViewDelegate? + + override init(reuseIdentifier: String?) { + super.init(reuseIdentifier: reuseIdentifier) + addSubViews() + setLayout() + configureUI() + addTapGestureRecognizers() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +extension TeamInfoSectionView { + func update(section: Int, title: String, isOpen: Bool) { + self.section = section + titleLabel.text = title + folderImageView.image = isOpen ? + DesignSystemAsset.Team.folderOn.image : DesignSystemAsset.Team.folderOff.image + arrowImageView.image = isOpen ? + DesignSystemAsset.Team.arrowTop.image : DesignSystemAsset.Team.arrowBottom.image + } + + func rotate(isOpen: Bool) { + arrowImageView.rotate(.pi) + } +} + +private extension TeamInfoSectionView { + func addTapGestureRecognizers() { + let gesture = UITapGestureRecognizer(target: self, action: #selector(sectionTapped(_:))) + addGestureRecognizer(gesture) + isUserInteractionEnabled = true + } + + @objc func sectionTapped(_ sender: UITapGestureRecognizer) { + guard let header = sender.view as? TeamInfoSectionView else { + return + } + delegate?.toggleSection(header: header, section: section) + } + + func addSubViews() { + addSubviews(folderImageView, titleLabel, arrowImageView) + } + + func setLayout() { + folderImageView.snp.makeConstraints { + $0.leading.equalToSuperview().offset(20) + $0.centerY.equalToSuperview() + $0.size.equalTo(40) + } + + arrowImageView.snp.makeConstraints { + $0.trailing.equalToSuperview().offset(-20) + $0.size.equalTo(24) + $0.centerY.equalToSuperview() + } + + titleLabel.snp.makeConstraints { + $0.leading.equalTo(folderImageView.snp.trailing).offset(8) + $0.trailing.equalTo(arrowImageView.snp.leading).offset(-10) + $0.verticalEdges.equalToSuperview() + } + } + + func configureUI() { + contentView.backgroundColor = colorFromRGB(0xF2F4F7) + } +} diff --git a/Projects/Modules/ErrorModule/Project.swift b/Projects/Modules/ErrorModule/Project.swift index 87345b953..ae16c0f6a 100644 --- a/Projects/Modules/ErrorModule/Project.swift +++ b/Projects/Modules/ErrorModule/Project.swift @@ -1,7 +1,10 @@ +import DependencyPlugin import ProjectDescription import ProjectDescriptionHelpers -let project = Project.makeModule( - name: "ErrorModule", - product: .staticFramework +let project = Project.module( + name: ModulePaths.Module.ErrorModule.rawValue, + targets: [ + .implements(module: .module(.ErrorModule), product: .framework) + ] ) diff --git a/Projects/Modules/ErrorModule/Tests/TargetTest.swift b/Projects/Modules/ErrorModule/Tests/TargetTest.swift index b1cf79405..147c29d2f 100644 --- a/Projects/Modules/ErrorModule/Tests/TargetTest.swift +++ b/Projects/Modules/ErrorModule/Tests/TargetTest.swift @@ -1,7 +1,6 @@ import XCTest class TargetTests: XCTestCase { - override func setUpWithError() throws { // Put setup code here. This method is called before the invocation of each test method in the class. } @@ -13,5 +12,4 @@ class TargetTests: XCTestCase { func testExample() throws { XCTAssertEqual("A", "A") } - } diff --git a/Projects/Modules/FeatureThirdPartyLib/.swiftlint.yml b/Projects/Modules/FeatureThirdPartyLib/.swiftlint.yml deleted file mode 100644 index ff44f9f28..000000000 --- a/Projects/Modules/FeatureThirdPartyLib/.swiftlint.yml +++ /dev/null @@ -1,20 +0,0 @@ -excluded: - - "**/*/NeedleGenerated.swift" - - "Tuist" - - -force_cast: # From https://realm.github.io/SwiftLint/force_cast.html - warning # 강제 캐스팅은 error에서 warning으로 변경 - -disabled_rules: - - trailing_whitespace - - vertical_whitespace - - colon - - comma - - comment_spacing # 주석 여백 - - mark # //MARK 관련 warning - - opening_brace # 괄호 열 때 줄바꿈을 했는지 안했는지, (안했으면 warning) - - line_length # 한줄에 글자 수 제한 , warning: 120, error: 200 (default) - - statement_position # if는 반드시 else로 끝나야한다. - - identifier_name #변수명 글자 수 제한 - diff --git a/Projects/Modules/FeatureThirdPartyLib/Project.swift b/Projects/Modules/FeatureThirdPartyLib/Project.swift index 7ce85577a..407cc787d 100644 --- a/Projects/Modules/FeatureThirdPartyLib/Project.swift +++ b/Projects/Modules/FeatureThirdPartyLib/Project.swift @@ -1,29 +1,26 @@ +import DependencyPlugin import ProjectDescription import ProjectDescriptionHelpers -import UtilityPlugin -let project = Project.makeModule( - name: "FeatureThirdPartyLib", - product: .framework, - packages: [ - .YouTubePlayerKit - ], - dependencies: [ - .SPM.Needle, - .SPM.PanModal, - .SPM.Lottie, - .SPM.RxSwift, - .SPM.RxCocoa, - .SPM.SnapKit, - .SPM.Then, - .SPM.Kingfisher, - .SPM.Tabman, - .SPM.RxDataSources, - .SPM.RxKeyboard, - .SPM.SwiftEntryKit, - .SPM.CryptoSwift, - .SPM.YouTubePlayerKit, - .SPM.MarqueeLabel, - .SPM.NVActivityIndicatorView +let project = Project.module( + name: ModulePaths.Module.FeatureThirdPartyLib.rawValue, + packages: [], + targets: [ + .implements(module: .module(.FeatureThirdPartyLib), product: .framework, dependencies: [ + .SPM.Needle, + .SPM.FittedSheets, + .SPM.Lottie, + .SPM.RxSwift, + .SPM.RxCocoa, + .SPM.SnapKit, + .SPM.Then, + .SPM.Kingfisher, + .SPM.Tabman, + .SPM.ReactorKit, + .SPM.RxDataSources, + .SPM.RxKeyboard, + .SPM.SwiftEntryKit, + .SPM.NVActivityIndicatorView + ]) ] ) diff --git a/Projects/Modules/FeatureThirdPartyLib/Tests/TargetTest.swift b/Projects/Modules/FeatureThirdPartyLib/Tests/TargetTest.swift index b1cf79405..147c29d2f 100644 --- a/Projects/Modules/FeatureThirdPartyLib/Tests/TargetTest.swift +++ b/Projects/Modules/FeatureThirdPartyLib/Tests/TargetTest.swift @@ -1,7 +1,6 @@ import XCTest class TargetTests: XCTestCase { - override func setUpWithError() throws { // Put setup code here. This method is called before the invocation of each test method in the class. } @@ -13,5 +12,4 @@ class TargetTests: XCTestCase { func testExample() throws { XCTAssertEqual("A", "A") } - } diff --git a/Projects/Modules/KeychainModule/Project.swift b/Projects/Modules/KeychainModule/Project.swift index 58d5689d2..fc9365b83 100644 --- a/Projects/Modules/KeychainModule/Project.swift +++ b/Projects/Modules/KeychainModule/Project.swift @@ -1,7 +1,10 @@ +import DependencyPlugin import ProjectDescription import ProjectDescriptionHelpers -let project = Project.makeModule( - name: "KeychainModule", - product: .staticFramework +let project = Project.module( + name: ModulePaths.Module.KeychainModule.rawValue, + targets: [ + .implements(module: .module(.KeychainModule), product: .framework) + ] ) diff --git a/Projects/Modules/KeychainModule/Sources/Keychain.swift b/Projects/Modules/KeychainModule/Sources/Keychain.swift index 182c1770a..1d016e50f 100644 --- a/Projects/Modules/KeychainModule/Sources/Keychain.swift +++ b/Projects/Modules/KeychainModule/Sources/Keychain.swift @@ -1,5 +1,8 @@ public enum KeychainType: String { case accessToken = "ACCESS-TOKEN" + case refreshToken = "REFRESH-TOKEN" + case accessExpiresIn = "ACCESS-EXPIRES-IN" // 토큰이 만료될 시간을 Miliseconds(timestamp)로 저장해요 + case deviceID = "DEVICE-ID" } public protocol Keychain { diff --git a/Projects/Modules/KeychainModule/Tests/TargetTest.swift b/Projects/Modules/KeychainModule/Tests/TargetTest.swift index b1cf79405..147c29d2f 100644 --- a/Projects/Modules/KeychainModule/Tests/TargetTest.swift +++ b/Projects/Modules/KeychainModule/Tests/TargetTest.swift @@ -1,7 +1,6 @@ import XCTest class TargetTests: XCTestCase { - override func setUpWithError() throws { // Put setup code here. This method is called before the invocation of each test method in the class. } @@ -13,5 +12,4 @@ class TargetTests: XCTestCase { func testExample() throws { XCTAssertEqual("A", "A") } - } diff --git a/Projects/Modules/Localization/Project.swift b/Projects/Modules/Localization/Project.swift new file mode 100644 index 000000000..9f97fa5c0 --- /dev/null +++ b/Projects/Modules/Localization/Project.swift @@ -0,0 +1,17 @@ +import DependencyPlugin +import ProjectDescription +import ProjectDescriptionHelpers + +let project = Project.module( + name: ModulePaths.Module.Localization.rawValue, + targets: [ + .implements( + module: .module(.Localization), + product: .staticFramework, + spec: .init( + resources: ["Resources/**"], + dependencies: [] + ) + ), + ] +) diff --git a/Projects/Modules/Localization/Resources/en.lproj/Localizable.strings b/Projects/Modules/Localization/Resources/en.lproj/Localizable.strings new file mode 100644 index 000000000..4f358a84d --- /dev/null +++ b/Projects/Modules/Localization/Resources/en.lproj/Localizable.strings @@ -0,0 +1,11 @@ +"OVER_FLOW_PLAY_WARNING" = "재생은 최대 50곡까지 가능합니다.\n현재 %@곡이 초과됐습니다."; +"OVER_FLOW_CONTAIN_WARNING" = "노래담기는 최대 50곡까지 가능합니다.\n현재 %@이 초과됐습니다."; +"OVER_FLOW_ADD_PLAYLIST_WARNING" = "재생목록추가는 최대 50곡까지 가능합니다.\n현재 %@곡이 초과됐습니다."; +"ADD_LIST" = "재생목록에 추가했습니다."; +"TITLE_CREDIT_LIST" = "참여 정보"; +"TITLE_RANDOM_PLAY" = "랜덤재생"; +"TITLE_50_RANDOM_PLAY" = "50곡 랜덤재생"; +"NEED_LOGIN_WARNING" = "로그인이 필요한 서비스입니다.\n로그인 하시겠습니까?"; +"LACK_OF_MONEY" = "음표 열매가 %@개가 부족합니다."; +"UNKNOWN_ERROR_WARNING" = "알 수 없는 오류가 발생하였습니다."; +"TITLE_RETRY" = "재시도"; diff --git a/Projects/Modules/Localization/Resources/ko.lproj/Localizable.strings b/Projects/Modules/Localization/Resources/ko.lproj/Localizable.strings new file mode 100644 index 000000000..4f358a84d --- /dev/null +++ b/Projects/Modules/Localization/Resources/ko.lproj/Localizable.strings @@ -0,0 +1,11 @@ +"OVER_FLOW_PLAY_WARNING" = "재생은 최대 50곡까지 가능합니다.\n현재 %@곡이 초과됐습니다."; +"OVER_FLOW_CONTAIN_WARNING" = "노래담기는 최대 50곡까지 가능합니다.\n현재 %@이 초과됐습니다."; +"OVER_FLOW_ADD_PLAYLIST_WARNING" = "재생목록추가는 최대 50곡까지 가능합니다.\n현재 %@곡이 초과됐습니다."; +"ADD_LIST" = "재생목록에 추가했습니다."; +"TITLE_CREDIT_LIST" = "참여 정보"; +"TITLE_RANDOM_PLAY" = "랜덤재생"; +"TITLE_50_RANDOM_PLAY" = "50곡 랜덤재생"; +"NEED_LOGIN_WARNING" = "로그인이 필요한 서비스입니다.\n로그인 하시겠습니까?"; +"LACK_OF_MONEY" = "음표 열매가 %@개가 부족합니다."; +"UNKNOWN_ERROR_WARNING" = "알 수 없는 오류가 발생하였습니다."; +"TITLE_RETRY" = "재시도"; diff --git a/Projects/Modules/Localization/Sources/Sources.swift b/Projects/Modules/Localization/Sources/Sources.swift new file mode 100644 index 000000000..8337712ea --- /dev/null +++ b/Projects/Modules/Localization/Sources/Sources.swift @@ -0,0 +1 @@ +// diff --git a/Projects/Modules/LogManager/Project.swift b/Projects/Modules/LogManager/Project.swift new file mode 100644 index 000000000..046340c11 --- /dev/null +++ b/Projects/Modules/LogManager/Project.swift @@ -0,0 +1,12 @@ +import DependencyPlugin +import ProjectDescription +import ProjectDescriptionHelpers + +let project = Project.module( + name: ModulePaths.Module.LogManager.rawValue, + targets: [ + .implements(module: .module(.LogManager), product: .framework, dependencies: [ + .module(target: .ThirdPartyLib) + ]) + ] +) diff --git a/Projects/Modules/LogManager/Sources/AnalyticsLogManager.swift b/Projects/Modules/LogManager/Sources/AnalyticsLogManager.swift new file mode 100644 index 000000000..264276b68 --- /dev/null +++ b/Projects/Modules/LogManager/Sources/AnalyticsLogManager.swift @@ -0,0 +1,196 @@ +import FirebaseAnalytics +import FirebaseCrashlytics +import FirebaseCrashlyticsSwift +import Foundation +import OSLog +import ThirdPartyLib + +fileprivate extension OSLog { + static let subSystem = Bundle.main.bundleIdentifier ?? "" + static let debug = OSLog(subsystem: subSystem, category: "DEBUG") + static let analytics = OSLog(subsystem: subSystem, category: "ANALYTICS") + static let error = OSLog(subsystem: subSystem, category: "ERROR") +} + +private extension LogManager { + static func log( + _ message: Any, + level: Level, + file: String = #file, + function: String = #function, + line: Int = #line + ) { + #if DEBUG || QA + let logger = Logger(subsystem: OSLog.subSystem, category: level.category) + + let fileName = file.components(separatedBy: "/").last ?? "unknown.swift" + let functionName = function.components(separatedBy: "(").first ?? "unknown" + let footerMessage = "\(fileName) | \(functionName):\(line)" + + let logMessage = "[\(level.symbol) \(level.category)] > \(message)\n-> \(footerMessage)" + switch level { + case .debug: + logger.debug("\(logMessage)") + case .analytics: + logger.info("\(logMessage)") + case .error: + logger.error("\(logMessage)") + } + #endif + } +} + +public enum LogManager { + fileprivate enum Level { + case debug + case analytics + case error + + fileprivate var symbol: String { + switch self { + case .debug: "🔵" + case .analytics: "🟡" + case .error: "🔴" + } + } + + fileprivate var category: String { + switch self { + case .debug: "DEBUG" + case .analytics: "ANALYTICS" + case .error: "ERROR" + } + } + } +} + +public extension LogManager { + static func setUserID( + userID: String?, + file: String = #file, + function: String = #function, + line: Int = #line + ) { + Analytics.setUserID(userID) + Crashlytics.crashlytics().setUserID(userID) + + LogManager.printDebug( + "Set Analytics UserID : \(String(describing: userID))", + file: file, + function: function, + line: line + ) + } + + static func setUserProperty( + property: AnalyticsUserProperty, + file: String = #file, + function: String = #function, + line: Int = #line + ) { + Analytics.setUserProperty(property.value, forName: property.key) + + LogManager.printDebug( + "Set User Property : [ \(property.key) = \(String(describing: property.value)) ]", + file: file, + function: function, + line: line + ) + } + + static func clearUserProperty( + property: AnalyticsUserProperty, + file: String = #file, + function: String = #function, + line: Int = #line + ) { + Analytics.setUserProperty(nil, forName: property.key) + + LogManager.printDebug( + "Set User Property : [ \(property.key) = nil ]", + file: file, + function: function, + line: line + ) + } + + static func printDebug( + _ message: Any, + file: String = #file, + function: String = #function, + line: Int = #line + ) { + LogManager.log( + message, + level: .debug, + file: file, + function: function, + line: line + ) + } + + static func analytics( + _ log: any AnalyticsLogType + ) { + #if RELEASE + Analytics.logEvent(log.name, parameters: log.params) + #elseif DEBUG + LogHistoryStorage.shared.appendHistory(log: log) + #elseif QA + Analytics.logEvent(log.name, parameters: log.params) + LogHistoryStorage.shared.appendHistory(log: log) + #endif + let message = """ + \(log.name) logged + parameters : \(log.params) + """ + LogManager.log(message, level: .analytics) + } + + static func printError( + _ message: Any, + file: String = #file, + function: String = #function, + line: Int = #line + ) { + LogManager.log( + message, + level: .error, + file: file, + function: function, + line: line + ) + } + + static func sendError( + message: String, + file: String = #file, + function: String = #function, + line: Int = #line + ) { + Crashlytics.crashlytics().log(message) + LogManager.log( + message, + level: .error, + file: file, + function: function, + line: line + ) + } + + static func sendError( + error: any Error, + file: String = #file, + function: String = #function, + line: Int = #line + ) { + Crashlytics.crashlytics().record(error: error) + LogManager.log( + error, + level: .error, + file: file, + function: function, + line: line + ) + } +} diff --git a/Projects/Modules/LogManager/Sources/AnalyticsLogType.swift b/Projects/Modules/LogManager/Sources/AnalyticsLogType.swift new file mode 100644 index 000000000..2ec2917be --- /dev/null +++ b/Projects/Modules/LogManager/Sources/AnalyticsLogType.swift @@ -0,0 +1,70 @@ +import Foundation + +public protocol AnalyticsLogType { + var name: String { get } + var params: [String: Any] { get } +} + +public extension AnalyticsLogType { + var name: String { + Mirror(reflecting: self) + .children + .first? + .label? + .toSnakeCase() ?? String(describing: self).toSnakeCase() + } + + var params: [String: Any] { + var dict: [String: Any] = [:] + + let enumMirror = Mirror(reflecting: self) + + guard let associated = enumMirror.children.first else { return dict } + + for enumParams in Mirror(reflecting: associated.value).children { + guard let label = enumParams.label?.toSnakeCase() else { continue } + dict[label] = enumParams.value + } + + return dict + } +} + +private extension String { + func toSnakeCase() -> String { + var result = "" + var previousStringWasCapitalized = false + var previousStringWasNumber = false + + for (index, string) in self.enumerated() { + var mutableString = String(string) + + if !mutableString.isAlphabet { + if index != 0, + !previousStringWasNumber { + mutableString = "_" + mutableString + } + previousStringWasNumber = true + } else if mutableString == mutableString.uppercased() { + mutableString = mutableString.lowercased() + + // e.g. JSON으로 오면 j_s_o_n 이런식이 아닌 json 이렇게 바뀌도록 + if index != 0, + !previousStringWasCapitalized { + mutableString = "_" + mutableString + } + previousStringWasCapitalized = true + } else { + previousStringWasCapitalized = false + previousStringWasNumber = false + } + result += mutableString + } + return result + } + + var isAlphabet: Bool { + let alphabetSet = CharacterSet.uppercaseLetters.union(.lowercaseLetters).union(.whitespacesAndNewlines) + return self.rangeOfCharacter(from: alphabetSet.inverted) == nil + } +} diff --git a/Projects/Modules/LogManager/Sources/AnalyticsUserProperty.swift b/Projects/Modules/LogManager/Sources/AnalyticsUserProperty.swift new file mode 100644 index 000000000..c4994fb33 --- /dev/null +++ b/Projects/Modules/LogManager/Sources/AnalyticsUserProperty.swift @@ -0,0 +1,73 @@ +import Foundation + +public protocol UserPropertyRepresentable { + var key: String { get } + var value: String? { get } +} + +public enum AnalyticsUserProperty { + case loginPlatform(platform: String) + case fruitTotal(count: Int) + case playlistSongTotal(count: Int) + case latestSearchKeyword(keyword: String) + case songPlayPlatform(platform: String) +} + +extension AnalyticsUserProperty: UserPropertyRepresentable { + public var key: String { + Mirror(reflecting: self) + .children + .first? + .label? + .toSnakeCase() ?? String(describing: self).toSnakeCase() + } + + public var value: String? { + switch self { + case let .loginPlatform(platform): return platform + case let .fruitTotal(count): return "\(count)" + case let .playlistSongTotal(count): return "\(count)" + case let .latestSearchKeyword(keyword): return keyword + case let .songPlayPlatform(platform): return platform + } + } +} + +private extension String { + func toSnakeCase() -> String { + var result = "" + var previousStringWasCapitalized = false + var previousStringWasNumber = false + + for (index, string) in self.enumerated() { + var mutableString = String(string) + + if !mutableString.isAlphabet { + if index != 0, + !previousStringWasNumber { + mutableString = "_" + mutableString + } + previousStringWasNumber = true + } else if mutableString == mutableString.uppercased() { + mutableString = mutableString.lowercased() + + // e.g. JSON으로 오면 j_s_o_n 이런식이 아닌 json 이렇게 바뀌도록 + if index != 0, + !previousStringWasCapitalized { + mutableString = "_" + mutableString + } + previousStringWasCapitalized = true + } else { + previousStringWasCapitalized = false + previousStringWasNumber = false + } + result += mutableString + } + return result + } + + var isAlphabet: Bool { + let alphabetSet = CharacterSet.uppercaseLetters.union(.lowercaseLetters).union(.whitespacesAndNewlines) + return self.rangeOfCharacter(from: alphabetSet.inverted) == nil + } +} diff --git a/Projects/Modules/LogManager/Sources/CommonAnalyticsLog.swift b/Projects/Modules/LogManager/Sources/CommonAnalyticsLog.swift new file mode 100644 index 000000000..11ae089f0 --- /dev/null +++ b/Projects/Modules/LogManager/Sources/CommonAnalyticsLog.swift @@ -0,0 +1,115 @@ +import Foundation + +public protocol AnalyticsLogEnumParametable: RawRepresentable, CustomStringConvertible + where RawValue == String {} + +public extension AnalyticsLogEnumParametable { + var description: String { + self.rawValue + } +} + +public enum CommonAnalyticsLog: AnalyticsLogType { + case viewPage(pageName: PageName) + case clickPlaylistItem(location: PlaylistItemLocation, key: String) + case clickPlayButton(location: PlayButtonLocation, type: PlayButtonType) + case clickAddMusicsButton(location: AddMusicLocation) + case clickEditButton(location: EditButtonLocation) + case clickEditCompleteButton(location: EditButtonLocation) + case clickLoginButton(entry: LoginButtonEntry) +} + +public extension CommonAnalyticsLog { + enum PageName: String, AnalyticsLogEnumParametable { + case home + case musicDetail = "music_detail" + case musicLyrics = "music_lyrics" + case recentMusic = "recent_music" + case wakmusicRecommendPlaylist = "wakmusic_recommend_playlist" + case wakmusicPlaylistDetail = "wakmusic_playlist_detail" + case unknownPlaylistDetail = "unknown_playlist_detail" + case myPlaylistDetail = "my_playlist_detail" + case chart + case artist + case storagePlaylist = "storage_playlist" + case storageLike = "storage_like" + case search + case fruitDraw = "fruit_draw" // 열매 뽑기 + case playlist + case myPage = "my_page" + case setting + case login + case songCredit = "song_credit" + case creditSongList = "credit_song_list" + case noticePopup = "notice_popup" + + public var description: String { + self.rawValue + } + } + + enum PlaylistItemLocation: String, AnalyticsLogEnumParametable { + case home + case storage + case search + case searchResult = "search_result" + + public var description: String { + self.rawValue + } + } + + enum PlayButtonLocation: String, AnalyticsLogEnumParametable { + case home + case search + case artist + case playlist + case storagePlaylist = "storage_playlist" + case storageLike = "storage_like" + case playlistDetail = "playlist_detail" + case chart + case recentMusic = "recent_music" + case musicDetail = "music_detail" + case creditSongList = "credit_song_list" + } + + enum PlayButtonType: String, AnalyticsLogEnumParametable { + case single + case multiple + case all + case random + case range1to50 + case range50to100 + case playlist + } + + enum AddMusicLocation: String, AnalyticsLogEnumParametable { + case songDetail = "song_detail" + case search + case chart + case recentMusic = "recent_music" + case artist + case playlist + case playlistDetail = "playlist_detail" + case storageLike = "storage_like" + } + + enum EditButtonLocation: String, AnalyticsLogEnumParametable { + case playlistDetail = "playlist_detail" + case myPlaylist = "my_playlist" + case storageLike = "storage_like" + case playlist + } + + enum LoginButtonEntry: String, AnalyticsLogEnumParametable { + case myPlaylist = "my_playlist" + case storageLike = "storage_like" + case mypage + case fruitStorage = "fruit_storage" + case fruitDraw = "fruit_draw" + case songLike = "song_like" + case addMusics = "add_musics" + case playlistSubscribe = "playlist_subscribe" + case artistSubscribe = "artist_subscribe" + } +} diff --git a/Projects/Modules/LogManager/Sources/LogHistory/LogHistoryCell.swift b/Projects/Modules/LogManager/Sources/LogHistory/LogHistoryCell.swift new file mode 100644 index 000000000..f7ba1c80c --- /dev/null +++ b/Projects/Modules/LogManager/Sources/LogHistory/LogHistoryCell.swift @@ -0,0 +1,67 @@ +#if DEBUG || QA + import UIKit + + final class LogHistoryCell: UITableViewCell { + static let reuseIdentifier = String(describing: LogHistoryCell.self) + + private let logStackView: UIStackView = { + let stackView = UIStackView() + stackView.axis = .vertical + stackView.spacing = 8 + stackView.alignment = .leading + stackView.translatesAutoresizingMaskIntoConstraints = false + return stackView + }() + + private let logTitleLabel: UILabel = { + let titleLabel = UILabel() + titleLabel.font = .systemFont(ofSize: 20) + titleLabel.numberOfLines = 0 + return titleLabel + }() + + private let logParametersLabel: UILabel = { + let titleLabel = UILabel() + titleLabel.font = .systemFont(ofSize: 16) + titleLabel.textColor = .gray + titleLabel.numberOfLines = 0 + return titleLabel + }() + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + addView() + setLayout() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func configure(log: any AnalyticsLogType) { + logTitleLabel.text = log.name + logParametersLabel.text = log.params + .map { "- \($0) : \($1)" } + .joined(separator: "\n") + } + } + + private extension LogHistoryCell { + func addView() { + contentView.addSubview(logStackView) + logStackView.addArrangedSubview(logTitleLabel) + logStackView.addArrangedSubview(logParametersLabel) + } + + func setLayout() { + NSLayoutConstraint.activate([ + logStackView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 8), + logStackView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor), + logStackView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor), + logStackView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -8) + ]) + } + } + +#endif diff --git a/Projects/Modules/LogManager/Sources/LogHistory/LogHistorySectionItem.swift b/Projects/Modules/LogManager/Sources/LogHistory/LogHistorySectionItem.swift new file mode 100644 index 000000000..616e7f704 --- /dev/null +++ b/Projects/Modules/LogManager/Sources/LogHistory/LogHistorySectionItem.swift @@ -0,0 +1,17 @@ +#if DEBUG || QA + import Foundation + + struct LogHistorySectionItem: Hashable, Equatable { + let index: Int + let log: any AnalyticsLogType + + func hash(into hasher: inout Hasher) { + hasher.combine(index) + hasher.combine(log.name) + } + + static func == (lhs: LogHistorySectionItem, rhs: LogHistorySectionItem) -> Bool { + lhs.index == rhs.index && lhs.log.name == rhs.log.name + } + } +#endif diff --git a/Projects/Modules/LogManager/Sources/LogHistory/LogHistoryStorage.swift b/Projects/Modules/LogManager/Sources/LogHistory/LogHistoryStorage.swift new file mode 100644 index 000000000..0b3d8f41d --- /dev/null +++ b/Projects/Modules/LogManager/Sources/LogHistory/LogHistoryStorage.swift @@ -0,0 +1,14 @@ +#if DEBUG || QA + import Foundation + + final class LogHistoryStorage { + static let shared = LogHistoryStorage() + + private(set) var logHistory: [any AnalyticsLogType] = [] + + func appendHistory(log: any AnalyticsLogType) { + logHistory.append(log) + } + } + +#endif diff --git a/Projects/Modules/LogManager/Sources/LogHistory/LogHistoryViewController.swift b/Projects/Modules/LogManager/Sources/LogHistory/LogHistoryViewController.swift new file mode 100644 index 000000000..bde99e2ee --- /dev/null +++ b/Projects/Modules/LogManager/Sources/LogHistory/LogHistoryViewController.swift @@ -0,0 +1,80 @@ +#if DEBUG || QA + import UIKit + + public final class LogHistoryViewController: UIViewController { + private let logHistoryTableView: UITableView = { + let tableView = UITableView() + tableView.separatorInset = .init(top: 8, left: 0, bottom: 8, right: 0) + tableView.register(LogHistoryCell.self, forCellReuseIdentifier: LogHistoryCell.reuseIdentifier) + return tableView + }() + + private lazy var logHistoryTableViewDiffableDataSource = UITableViewDiffableDataSource< + Int, + LogHistorySectionItem + >( + tableView: logHistoryTableView + ) { tableView, indexPath, itemIdentifier in + guard let cell = tableView.dequeueReusableCell( + withIdentifier: LogHistoryCell.reuseIdentifier, + for: indexPath + ) as? LogHistoryCell + else { + return UITableViewCell() + } + cell.configure(log: itemIdentifier.log) + return cell + } + + public init() { + super.init(nibName: nil, bundle: nil) + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override public func viewDidLoad() { + super.viewDidLoad() + addView() + setLayout() + view.backgroundColor = .white + + let logs = LogHistoryStorage.shared.logHistory + .enumerated() + .map { LogHistorySectionItem(index: $0.offset, log: $0.element) } + + var snapshot = logHistoryTableViewDiffableDataSource.snapshot() + snapshot.appendSections([0]) + snapshot.appendItems(logs, toSection: 0) + + logHistoryTableViewDiffableDataSource.apply(snapshot, animatingDifferences: true) + + navigationItem.title = "애널리틱스 히스토리" + } + } + + private extension LogHistoryViewController { + func addView() { + view.addSubview(logHistoryTableView) + logHistoryTableView.translatesAutoresizingMaskIntoConstraints = false + } + + func setLayout() { + NSLayoutConstraint.activate([ + logHistoryTableView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 16), + logHistoryTableView.leadingAnchor.constraint( + equalTo: view.safeAreaLayoutGuide.leadingAnchor, + constant: 16 + ), + logHistoryTableView.trailingAnchor.constraint( + equalTo: view.safeAreaLayoutGuide.trailingAnchor, + constant: -16 + ), + logHistoryTableView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -16) + ]) + } + } + +#endif diff --git a/Projects/Modules/ThirdPartyLib/.swiftlint.yml b/Projects/Modules/ThirdPartyLib/.swiftlint.yml deleted file mode 100644 index ff44f9f28..000000000 --- a/Projects/Modules/ThirdPartyLib/.swiftlint.yml +++ /dev/null @@ -1,20 +0,0 @@ -excluded: - - "**/*/NeedleGenerated.swift" - - "Tuist" - - -force_cast: # From https://realm.github.io/SwiftLint/force_cast.html - warning # 강제 캐스팅은 error에서 warning으로 변경 - -disabled_rules: - - trailing_whitespace - - vertical_whitespace - - colon - - comma - - comment_spacing # 주석 여백 - - mark # //MARK 관련 warning - - opening_brace # 괄호 열 때 줄바꿈을 했는지 안했는지, (안했으면 warning) - - line_length # 한줄에 글자 수 제한 , warning: 120, error: 200 (default) - - statement_position # if는 반드시 else로 끝나야한다. - - identifier_name #변수명 글자 수 제한 - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/Info.plist b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/Info.plist deleted file mode 100644 index c3cd3bb38..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/Info.plist +++ /dev/null @@ -1,172 +0,0 @@ - - - - - AvailableLibraries - - - BinaryPath - Realm.framework/Realm - LibraryIdentifier - xros-arm64_x86_64-simulator - LibraryPath - Realm.framework - SupportedArchitectures - - arm64 - x86_64 - - SupportedPlatform - xros - SupportedPlatformVariant - simulator - - - BinaryPath - Realm.framework/Realm - LibraryIdentifier - ios-arm64 - LibraryPath - Realm.framework - SupportedArchitectures - - arm64 - - SupportedPlatform - ios - - - BinaryPath - Realm.framework/Realm - LibraryIdentifier - xros-arm64 - LibraryPath - Realm.framework - SupportedArchitectures - - arm64 - - SupportedPlatform - xros - - - BinaryPath - Realm.framework/Versions/A/Realm - LibraryIdentifier - ios-arm64_x86_64-maccatalyst - LibraryPath - Realm.framework - SupportedArchitectures - - arm64 - x86_64 - - SupportedPlatform - ios - SupportedPlatformVariant - maccatalyst - - - BinaryPath - Realm.framework/Realm - LibraryIdentifier - watchos-arm64_i386_x86_64-simulator - LibraryPath - Realm.framework - SupportedArchitectures - - arm64 - i386 - x86_64 - - SupportedPlatform - watchos - SupportedPlatformVariant - simulator - - - BinaryPath - Realm.framework/Versions/A/Realm - LibraryIdentifier - macos-arm64_x86_64 - LibraryPath - Realm.framework - SupportedArchitectures - - arm64 - x86_64 - - SupportedPlatform - macos - - - BinaryPath - Realm.framework/Realm - LibraryIdentifier - watchos-arm64_arm64_32_armv7k - LibraryPath - Realm.framework - SupportedArchitectures - - arm64 - arm64_32 - armv7k - - SupportedPlatform - watchos - - - BinaryPath - Realm.framework/Realm - LibraryIdentifier - tvos-arm64 - LibraryPath - Realm.framework - SupportedArchitectures - - arm64 - - SupportedPlatform - tvos - - - BinaryPath - Realm.framework/Realm - LibraryIdentifier - ios-arm64_x86_64-simulator - LibraryPath - Realm.framework - SupportedArchitectures - - arm64 - x86_64 - - SupportedPlatform - ios - SupportedPlatformVariant - simulator - - - BinaryPath - Realm.framework/Realm - LibraryIdentifier - tvos-arm64_x86_64-simulator - LibraryPath - Realm.framework - SupportedArchitectures - - arm64 - x86_64 - - SupportedPlatform - tvos - SupportedPlatformVariant - simulator - - - CFBundlePackageType - XFWK - XCFrameworkFormatVersion - 1.0 - - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/CHANGELOG.md b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/CHANGELOG.md deleted file mode 100644 index 00cc01244..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/CHANGELOG.md +++ /dev/null @@ -1,9539 +0,0 @@ -10.42.3 Release notes (2023-09-18) -============================================================= - -### Enhancements - -* Update packaging for the Xcode 15.0 release. Carthage release and obj-c - binaries are now built with Xcode 15. - -### Fixed - -* The prebuilt Realm.xcframework for SPM was packaged incorrectly and did not - work ([#8361](https://github.com/realm/realm-swift/issues/8361), since v10.42.1). - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 15.0.0. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15.0.0. - -10.42.2 Release notes (2023-09-13) -============================================================= - -### Enhancements - -* Add support for logging messages sent by the server. - ([Core #6476](https://github.com/realm/realm-core/pull/6476)) -* Unknown protocol errors received from the baas server will no longer cause - the application to crash if a valid error action is also received. Unknown - error actions will be treated as an ApplicationBug error action and will - cause sync to fail with an error via the sync error handler. - ([Core #6885](https://github.com/realm/realm-core/pull/6885)) -* Some sync error messages now contain more information about what went wrong. - -### Fixed - -* The `MultipleSyncAgents` exception from opening a synchronized Realm in - multiple processes at once no longer leaves the sync client in an invalid - state. ([Core #6868](https://github.com/realm/realm-core/pull/6868), since v10.36.0) -* Testing the size of a collection of links against zero would sometimes fail - (sometimes = "difficult to explain"). In particular: - ([Core #6850](https://github.com/realm/realm-core/issues/6850), since v10.41.0) -* When async writes triggered a file compaction some internal state could be - corrupted, leading to later crashes in the slab allocator. This typically - resulted in the "ref + size <= next->first" assertion failure, but other - failures were possible. Many issues reported; see [Core #6340](https://github.com/realm/realm-core/issues/6340). - (since 10.35.0) -* `Realm.Configuration.maximumNumberOfActiveVersions` now handles intermediate - versions which have been cleaned up correctly and checks the number of live - versions rather than the number of versions between the oldest live version - and current version (since 10.35.0). -* If the client disconnected between uploading a change to flexible sync - subscriptions and receiving the new object data from the server resulting - from that subscription change, the next connection to the server would - sometimes result in a client reset - ([Core #6966](https://github.com/realm/realm-core/issues/6966), since v10.21.1). - -### Deprecations - -* `RLMApp` has `localAppName` and `localAppVersion` fields which never ended up - being used for anything and are now deprecated. -* `RLMSyncAuthError` has not been used since v10.0.0 and is now deprecated. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 7. - -### Internal - -* Upgraded realm-core from 13.17.1 to 13.20.1 - -10.42.1 Release notes (2023-08-28) -============================================================= - -### Fixed - -* The names of the prebuilt zips for SPM have changed to avoid having Carthage - download them instead of the intended Carthage zip - ([#8326](https://github.com/realm/realm-swift/issues/8326), since v10.42.0). -* The prebuild Realm.xcframework for SwiftPM now has all platforms other than - visionOS built with Xcode 14 to comply with app store rules - ([#8339](https://github.com/realm/realm-swift/issues/8339), since 10.42.0). -* Fix visionOS compilation with Xcode beta 7. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 7. - -10.42.0 Release notes (2023-07-30) -============================================================= - -### Enhancements - -* Add support for building for visionOS and add Xcode 15 binaries to the - release package. visionOS currently requires installing Realm via either - Swift Package Manager or by using a XCFramework as CocoaPods and Carthage do - not yet support it. -* Zips compatible with SPM's `.binaryTarget()` are now published as part of the - releases on Github. -* Prebuilt XCFrameworks are now built with LTO enabled. This has insignificant - performance benefits, but cuts the size of the library by ~15%. - -### Fixed - -* Fix nested properties observation on a `Projections` not notifying when there is a property change. - ([#8276](https://github.com/realm/realm-swift/issues/8276), since v10.34.0). -* Fix undefined symbol error for `UIKit` when linking Realm to a framework using SPM. - ([#8308](https://github.com/realm/realm-swift/issues/8308), since v10.41.0) -* If the app crashed at exactly the wrong time while opening a freshly - compacted Realm the file could be left in an invalid state - ([Core #6807](https://github.com/realm/realm-core/pull/6807), since v10.33.0). -* Sync progress for DOWNLOAD messages was sometimes stored incorrectly, - resulting in an extra round trip to the server. - ([Core #6827](https://github.com/realm/realm-core/issues/6827), since v10.31.0) - -### Breaking Changes - -* Legacy non-xcframework Carthage installations are no longer supported. Please - ensure you are using `--use-xcframeworks` if installing via Carthage. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 5. - -### Internal - -* Upgraded realm-core from 13.17.0 to 13.17.1 -* Release packages were being uploaded to several static.realm.io URLs which - are no longer linked to anywhere. These are no longer being updated, and - release packages are now only being uploaded to Github. - -10.41.1 Release notes (2023-07-17) -============================================================= - -### Enhancements - -* Filesystem errors now include more information in the error message. -* Sync connection and session reconnect timing/backoff logic has been reworked - and unified into a single implementation. Previously some categories of errors - would cause an hour-long wait before attempting to reconnect, while others - would use an exponential backoff strategy. All errors now result in the sync - client waiting for 1 second before retrying, doubling the wait after each - subsequent failure up to a maximum of five minutes. If the cause of the error - changes, the backoff will be reset. If the sync client voluntarily disconnects, - no backoff will be used. ([Core #6526]((https://github.com/realm/realm-core/pull/6526))) - -### Fixed - -* Removed warnings for deprecated APIs internal use. - ([#8251](https://github.com/realm/realm-swift/issues/8251), since v10.39.0) -* Fix an error during async open and client reset if properties have been added - to the schema. This fix also applies to partition-based to flexible sync - migration if async open is used. ([Core #6707](https://github.com/realm/realm-core/issues/6707), since v10.28.2) - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 4. - -### Internal - -* Upgraded realm-core from 13.15.1 to 13.17.0 -* The location where prebuilt core binaries are published has changed slightly. - If you are using `REALM_BASE_URL` to mirror the binaries, you may need to - adjust your mirroring logic. - -10.41.0 Release notes (2023-06-26) -============================================================= - -### Enhancements - -* Add support for multiplexing sync connections. When enabled (the default), a single - connection is used per sync user rather than one per synchronized Realm. This - reduces resource consumption when multiple Realms are opened and will - typically improve performance ([PR #8282](https://github.com/realm/realm-swift/pull/8282)). -* Sync timeout options can now be set on `RLMAppConfiguration` along with the - other app-wide configuration settings ([PR #8282](https://github.com/realm/realm-swift/pull/8282)). - -### Fixed - -* Import as `RLMRealm_Private.h` as a module would cause issues when using Realm as a subdependency. - ([#8164](https://github.com/realm/realm-swift/issues/8164), since 10.37.0) -* Disable setting a custom logger by default on the sync client when the sync manager is created. - This was overriding the default logger set using `RLMLogger.defaultLogger`. (since v10.39.0). - -### Breaking Changes - -* The `RLMSyncTimeouts.appConfiguration` property has been removed. This was an - unimplemented read-only property which did not make any sense on the - containing type ([PR #8282](https://github.com/realm/realm-swift/pull/8282)). - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 2. - -### Internal - -* Upgraded realm-core from 13.15.0 to 13.15.1 - -10.40.2 Release notes (2023-06-09) -============================================================= - -### Enhancements - -* `Actor.preconditionIsolated()` is now used for runtime actor checking when - available (i.e. building with Xcode 15 and running on iOS 17) rather than the - less reliable workaround. - -### Fixed - -* If downloading the fresh Realm file failed during a client reset on a - flexible sync Realm, the sync client would crash the next time the Realm was - opened. ([Core #6494](https://github.com/realm/realm-core/issues/6494), since v10.28.2) -* If the order of properties in the local class definitions did not match the - order in the server-side schema, the before-reset Realm argument passed to a - client reset handler would have an invalid schema and likely crash if any - data was read from it. ([Core #6693](https://github.com/realm/realm-core/issues/6693), since v10.40.0) - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 1. - -### Internal - -* Upgraded realm-core from 13.13.0 to 13.15.0. -* The prebuilt library used for CocoaPods installations is now built with Xcode - 14. This should not have any observable effects other than the download being - much smaller due to no longer including bitcode. - -10.40.1 Release notes (2023-06-06) -============================================================= - -### Enhancements - -* Fix compilation with Xcode 15. Note that iOS 12 is the minimum supported - deployment target when using Xcode 15. -* Switch to building the Carthage release with Xcode 14.3.1. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 1. - -### Internal - -* Overhauled SDK metrics collection to better drive future development efforts. - -10.40.0 Release notes (2023-05-26) -============================================================= - -Drop support for Xcode 13 and add Xcode 14.3.1. Xcode 14.1 is now the minimum -supported version. - -### Enhancements - -* Adjust the error message for private `Object` subclasses and subclasses - nested inside other types to explain how to make them work rather than state - that it's impossible. ([#5662](https://github.com/realm/realm-cocoa/issues/5662)). -* Improve performance of SectionedResults. With a single section it is now ~10% - faster, and the runtime of sectioning no longer scales significantly with - section count, giving >100% speedups when there are large numbers of sections - ([Core #6606](https://github.com/realm/realm-core/pull/6606)). -* Very slightly improve performance of runtime thread checking on the main - thread. ([Core #6606](https://github.com/realm/realm-core/pull/6606)) - -### Fixed - -* Allow support for implicit boolean queries on Swift's Type Safe Queries API - ([#8212](https://github.com/realm/realm-swift/issues/8212)). -* Fixed a fatal error (reported to the sync error handler) during client reset - or automatic partition-based to flexible sync migration if the reset has been - triggered during an async open and the schema being applied has added new - classes. Due to this bug automatic flexibly sync migration has been disabled - for older releases and this is now the minimum version required. - ([#6601](https://github.com/realm/realm-core/issues/6601), since automatic - client resets were introduced in v10.25.0) -* Dictionaries sometimes failed to map unresolved links to nil. If the target - of a link in a dictionary was deleted by another sync client, reading that - field from the dictionary would sometimes give an invalid object rather than - nil. In addition, queries on dictionaries would sometimes have incorrect - results. ([Core #6644](https://github.com/realm/realm-core/pull/6644), since v10.8.0) -* Older versions of Realm would sometimes fail to properly mark objects as - being the target of an incoming link from another object. When this happened, - deleting the target object would hit an assertion failure due to the - inconsistent state. We now reconstruct a valid state rather than crashing. - ([Core #6585](https://github.com/realm/realm-core/issues/6585), since v5.0.0) -* Fix several UBSan failures which did not appear to result in functional bugs - ([Core #6649](https://github.com/realm/realm-core/pull/6649)). -* Using both synchronous and asynchronous transactions on the same thread or - scheduler could hit the assertion failure "!realm.is_in_transaction()" if one - of the callbacks for an asynchronous transaction happened to be scheduled - during a synchronous transaction - ([Core #6659](https://github.com/realm/realm-core/issues/6659), since v10.26.0) -* The stored deployment location for Apps was not being updated correctly after - receiving a redirect response from the server, resulting in every connection - attempting to connect to the old URL and getting redirected rather than only - the first connection after the deployment location changed. - ([Core #6630](https://github.com/realm/realm-core/issues/6630), since v10.38.2) - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-14.3.1. - -### Internal - -* Upgraded realm-core from 13.10.1 to 13.13.0. - -10.39.1 Release notes (2023-05-05) -============================================================= - -### Enhancements - -* New notifiers can now be registered in write transactions until changes have - actually been made in the write transaction. This makes it so that new - notifications can be registered inside change notifications triggered by - beginning a write transaction (unless a previous callback performed writes). - ([#4818](https://github.com/realm/realm-swift/issues/4818)). -* Reduce the memory footprint of an automatic (discard or recover) client reset - when there are large incoming changes from the server. - ([Core #6567](https://github.com/realm/realm-core/issues/6567)). - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from 13.10.0 to 13.10.1. - -10.39.0 Release notes (2023-05-03) -============================================================= - -### Enhancements - -* Add support for actor-isolated Realms, opened with `try await Realm(actor: actor)`. - - Rather than being confined to the current thread or a dispatch queue, - actor-isolated Realms are isolated to an actor. This means that they can be - used from any thread as long as it's within a function isolated to that - actor, and they remain valid over suspension points where a task may hop - between threads. Actor-isolated Realms can be used with either global or - local actors: - - ```swift - @MainActor function mainThreadFunction() async throws { - // These are identical: the async init continues to produce a - // MainActor-confined Realm if no actor is supplied - let realm1 = try await Realm() - let realm2 = try await Realm(MainActor.shared) - } - - // A simple example of a custom global actor - @globalActor actor BackgroundActor: GlobalActor { - static var shared = BackgroundActor() - } - - @BackgroundActor backgroundThreadFunction() async throws { - // Explicitly specifying the actor is required for everything but MainActor - let realm = try await Realm(actor: BackgroundActor.shared) - try await realm.write { - _ = realm.create(MyObject.self) - } - // Thread-confined Realms would sometimes throw an exception here, as we - // may end up on a different thread after an `await` - print("\(realm.objects(MyObject.self).count)") - } - - actor MyActor { - // An implicitly-unwrapped optional is used here to let us pass `self` to - // `Realm(actor:)` within `init` - var realm: Realm! - init() async throws { - realm = try await Realm(actor: self) - } - - var count: Int { - realm.objects(MyObject.self).count - } - - func create() async throws { - try await realm.asyncWrite { - realm.create(MyObject.self) - } - } - } - - // This function isn't isolated to the actor, so each operation has to be async - func createObjects() async throws { - let actor = try await MyActor() - for _ in 0..<5 { - await actor.create() - } - print("\(await actor.count)") - } - - // In an isolated function, an actor-isolated Realm can be used synchronously - func createObjects(in actor: isolated MyActor) async throws { - await actor.realm.write { - actor.realm.create(MyObject.self) - } - print("\(actor.realm.objects(MyObject.self).count)") - } - ``` - - Actor-isolated Realms come with a more convenient syntax for asynchronous - writes. `try await realm.write { ... }` will suspend the current task, - acquire the write lock without blocking the current thread, and then invoke - the block. The actual data is then written to disk on a background thread, - and the task is resumed once that completes. As this does not block the - calling thread while waiting to write and does not perform i/o on the calling - thread, this will often be safe to use from `@MainActor` functions without - blocking the UI. Sufficiently large writes may still benefit from being done - on a background thread. - - Asynchronous writes are only supported for actor-isolated Realms or in - `@MainActor` functions. - - Actor-isolated Realms require Swift 5.8 (Xcode 14.3). Enabling both strict - concurrency checking (`SWIFT_STRICT_CONCURRENCY=complete` in Xcode) and - runtime actor data race detection (`OTHER_SWIFT_FLAGS=-Xfrontend - -enable-actor-data-race-checks`) is strongly recommended when using - actor-isolated Realms. -* Add support for automatic partition-based to flexible sync migration. - Connecting to a server-side app configured to use flexible sync with a - client-side partition-based sync configuration is now supported, and will - automatically create the appropriate flexible sync subscriptions to subscribe - to the requested partition. This allows changing the configuration on the - server from partition-based to flexible without breaking existing clients. - ([Core #6554](https://github.com/realm/realm-core/issues/6554)) -* Now you can use an array `[["_id": 1], ["breed": 0]]` as sorting option for a - MongoCollection. This new API fixes the issue where the resulting documents - when using more than one sort parameter were not consistent between calls. - ([#7188](https://github.com/realm/realm-swift/issues/7188), since v10.0.0). -* Add support for adding a user created default logger, which allows implementing your own logging logic - and the log threshold level. - You can define your own logger creating an instance of `Logger` and define the log function which will be - invoked whenever there is a log message. - - ```swift - let logger = Logger(level: .all) { level, message in - print("Realm Log - \(level): \(message)") - } - ``` - - Set this custom logger as Realm default logger using `Logger.shared`. - ```swift - Logger.shared = logger - ``` -* It is now possible to change the default log threshold level at any point of the application's lifetime. - ```swift - Logger.shared.logLevel = .debug - ``` - This will override the log level set anytime before by a user created logger. -* We have set `.info` as the default log threshold level for Realm. You will now see some - log message in your console. To disable use `Logger.shared.level = .off`. - -### Fixed - -* Several schema initialization functions had incorrect `@MainActor` - annotations, resulting in runtime warnings if the first time a Realm was - opened was on a background thread - ([#8222](https://github.com/realm/realm-swift/issues/8222), since v10.34.0). - -### Deprecations - -* `App.SyncManager.logLevel` and `App.SyncManager.logFunction` are deprecated in favour of - setting a default logger. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from v13.9.4 to v13.10.0. - -10.38.3 Release notes (2023-04-28) -============================================================= - -### Enhancements - -* Improve performance of cancelling a write transactions after making changes. - If no KVO observers are used this is now constant time rather than taking - time proportional to the number of changes to be rolled back. Cancelling a - write transaction with KVO observers is 10-20% faster. ([Core PR #6513](https://github.com/realm/realm-core/pull/6513)). - -### Fixed - -* Performing a large number of queries without ever performing a write resulted - in steadily increasing memory usage, some of which was never fully freed due - to an unbounded cache ([#7978](https://github.com/realm/realm-swift/issues/7978), since v10.27.0). - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from 13.9.3 to 13.9.4 - -10.38.2 Release notes (2023-04-25) -============================================================= - -### Enhancements - -* Improve performance of equality queries on a non-indexed AnyRealmValue - property by about 30%. ([Core #6506](https://github.com/realm/realm-core/issues/6506)) - -### Fixed - -* SSL handshake errors were treated as fatal errors rather than errors which - should be retried. ([Core #6434](https://github.com/realm/realm-core/issues/6434), since v10.35.0) - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from 13.9.0 to 13.9.3. - -10.38.1 Release notes (2023-04-25) -============================================================= - -### Fixed - -* The error handler set on EventsConfiguration was not actually used (since v10.26.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -10.38.0 Release notes (2023-03-31) -============================================================= - -Switch to building the Carthage release with Xcode 14.3. - -### Enhancements - -* Add Xcode 14.3 binaries to the release package. Note that CocoaPods 1.12.0 - does not support Xcode 14.3. -* Add support for sharing encrypted Realms between multiple processes. - ([Core #1845](https://github.com/realm/realm-core/issues/1845)) - -### Fixed - -* Fix a memory leak reported by Instruments on `URL.path` in - `Realm.Configuration.fileURL` when using a string partition key in Partition - Based Sync ([#8195](https://github.com/realm/realm-swift/pull/8195)), since v10.0.0). -* Fix a data race in version management. If one thread committed a write - transaction which increased the number of live versions above the previous - highest seen during the current session at the same time as another thread - began a read, the reading thread could read from a no-longer-valid memory - mapping. This could potentially result in strange crashes when opening, - refreshing, freezing or thawing a Realm - ([Core #6411](https://github.com/realm/realm-core/pull/6411), since v10.35.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from 13.8.0 to 13.9.0. - -10.37.2 Release notes (2023-03-29) -============================================================= - -### Fixed - -* Copying a `RLMRealmConfiguration` failed to copy several fields. This - resulted in migrations being passed the incorrect object type in Swift when - using the default configuration (since v10.34.0) or async open (since - v10.37.0). This also broke using the Events API in those two scenarios (since - v10.26.0 for default configuration and v10.37.0 for async open). ([#8190](https://github.com/realm/realm-swift/issues/8190)) - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -10.37.1 Release notes (2023-03-27) -============================================================= - -### Enhancements - -* Performance improvement for the following queries ([Core #6376](https://github.com/realm/realm-core/issues/6376)): - * Significant (~75%) improvement when counting (`Results.count`) the number - of exact matches (with no other query conditions) on a - string/int/UUID/ObjectID property that has an index. This improvement - will be especially noticiable if there are a large number of results - returned (duplicate values). - * Significant (~99%) improvement when querying for an exact match on a Date - property that has an index. - * Significant (~99%) improvement when querying for a case insensitive match - on an AnyRealmValue property that has an index. - * Moderate (~25%) improvement when querying for an exact match on a Bool - property that has an index. - * Small (~5%) improvement when querying for a case insensitive match on an - AnyRealmValue property that does not have an index. - -### Fixed - -* Add missing `@Sendable` annotations to several sync and app services related - callbacks ([PR #8169](https://github.com/realm/realm-swift/pull/8169), since v10.34.0). -* Fix some bugs in handling task cancellation for async Realm init. Some very - specific timing windows could cause crashes, and the download would not be - cancelled if the Realm was already open ([PR #8178](https://github.com/realm/realm-swift/pull/8178), since v10.37.0). -* Fix a crash when querying an AnyRealmValue property with a string operator - (contains/like/beginswith/endswith) or with case insensitivity. - ([Core #6376](https://github.com/realm/realm-core/issues/6376), since v10.8.0) -* Querying for case-sensitive equality of a string on an indexed AnyRealmValue - property was returning case insensitive matches. For example querying for - `myIndexedAny == "Foo"` would incorrectly match on values of "foo" or "FOO" etc. - ([Core #6376](https://github.com/realm/realm-core/issues/6376), since v10.8.0) -* Adding an index to an AnyRealmValue property when objects of that type - already existed would crash with an assertion. - ([Core #6376](https://github.com/realm/realm-core/issues/6376), since v10.8.0). -* Fix a bug that may have resulted in arrays being in different orders on - different devices. Some cases of “Invalid prior_size” may be fixed too. - ([Core #6191](https://github.com/realm/realm-core/issues/6191), since v10.25.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -### Internal - -* Upgraded realm-core from 13.6.0 to 13.8.0 - -10.37.0 Release notes (2023-03-09) -============================================================= - -### Enhancements - -* `MongoCollection.watch().subscribe(on:)` now supports any swift Scheduler - rather than only dispatch queues ([PR #8131](https://github.com/realm/realm-swift/pull/8130)). -* Add an async sequence wrapper for `MongoCollection.watch()`, allowing you to - do `for try await change in collection.changeEvents { ... }` - ([PR #8131](https://github.com/realm/realm-swift/pull/8130)). -* The internals of error handling and reporting have been significantly - reworked. The visible effects of this are that some errors which previously - had unhelpful error messages now include more detail about what went wrong, - and App errors now expose a much more complete set of error codes - ([PR #8002](https://github.com/realm/realm-swift/pull/8002)). -* Expose compensating write error information. When the server rejects a - modification made by the client (such as if the user does not have the - required permissions), a `SyncError` is delivered to the sync error handler - with the code `.writeRejected` and a non-nil `compensatingWriteInfo` field - which contains information about what was rejected and why. This information - is intended primarily for debugging and logging purposes and may not have a - stable format. ([PR #8002](https://github.com/realm/realm-swift/pull/8002)) -* Async `Realm.init()` now handles Task cancellation and will cancel the async - open if the Task is cancelled ([PR #8148](https://github.com/realm/realm-swift/pull/8148)). -* Cancelling async opens now has more consistent behavior. The previously - intended and documented behavior was that cancelling an async open would - result in the callback associated with the specific task that was cancelled - never being called, and all other pending callbacks would be invoked with an - ECANCELED error. This never actually worked correctly, and the callback which - was not supposed to be invoked at all sometimes would be. We now - unconditionally invoke all of the exactly once, passing ECANCELED to all of - them ([PR #8148](https://github.com/realm/realm-swift/pull/8148)). - -### Fixed - -* `UserPublisher` incorrectly bounced all notifications to the main thread instead - of setting up the Combine publisher to correctly receive on the main thread. - ([#8132](https://github.com/realm/realm-swift/issues/8132), since 10.21.0) -* Fix warnings when building with Xcode 14.3 beta 2. -* Errors in async open resulting from invalid queries in `initialSubscriptions` - would result in the callback being invoked with both a non-nil Realm and a - non-nil Error even though the Realm was in an invalid state. Now only the - error is passed to the callback ([PR #8148](https://github.com/realm/realm-swift/pull/8148), since v10.28.0). -* Converting a local realm to a synced realm would crash if an embedded object - was null ([Core #6294](https://github.com/realm/realm-core/issues/6294), since v10.22.0). -* Subqueries on indexed properties performed extremely poorly. ([Core #6327](https://github.com/realm/realm-core/issues/6327), since v5.0.0) -* Fix a crash when a SSL read successfully read a non-zero number of bytes and - also reported an error. ([Core #5435](https://github.com/realm/realm-core/issues/5435), since 10.0.0) -* The sync client could get stuck in an infinite loop if the server sent an - invalid changeset which caused a transform error. This now results in a - client reset instead. ([Core #6051](https://github.com/realm/realm-core/issues/6051), since v10.0.0) -* Strings in queries which contained any characters which required multiple - bytes when encoded as utf-8 were incorrectly encoded as binary data when - serializing the query to send it to the server for a flexible sync - subscription, resulting the server rejecting the query - ([Core #6350](https://github.com/realm/realm-core/issues/6350), since 10.22.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -### Internal - -* Upgraded realm-core from 13.4.1 to 13.6.0 - -10.36.0 Release notes (2023-02-15) -============================================================= - -### Enhancements - -* Add support for multiple overlapping or nested event scopes. - `Events.beginScope()` now returns a `Scope` object which is used to commit or - cancel that scope, and if more than one scope is active at a time events are - reported to all active scopes. - -### Fixed - -* Fix moving `List` items to a higher index in SwiftUI results in wrong destination index - ([#7956](https://github.com/realm/realm-swift/issues/7956), since v10.6.0). -* Using the `searchable` view modifier with `@ObservedResults` in iOS 16 would - cause the collection observation subscription to cancel. - ([#8096](https://github.com/realm/realm-swift/issues/8096), since 10.21.0) -* Client reset with recovery would sometimes crash if the recovery resurrected - a dangling link ([Core #6292](https://github.com/realm/realm-core/issues/6292), since v10.32.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -### Internal - -* Upgraded realm-core from 13.4.0 to 13.4.1 - -10.35.1 Release notes (2023-02-10) -============================================================= - -### Fixed - -* Client reset with recovery would crash if a client reset occurred the very - first time the Realm was opened with async open. The client reset callbacks - are now not called if the Realm had never been opened before - ([PR #8125](https://github.com/realm/realm-swift/pull/8125), since 10.32.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -10.35.0 Release notes (2023-02-07) -============================================================= - -This version bumps the Realm file format version to 23. Realm files written by -this version cannot be read by older versions of Realm. - -### Enhancements - -* The Realm file is now automatically shrunk if the file size is larger than - needed to store all of the data. ([Core PR #5755](https://github.com/realm/realm-core/pull/5755)) -* Pinning old versions (either with frozen Realms or with Realms on background - threads that simply don't get refreshed) now only prevents overwriting the - data needed by that version, rather than the data needed by that version and - all later versions. In addition, frozen Realms no longer pin the transaction - logs used to drive change notifications. This mostly eliminates the file size - growth caused by pinning versions. ([Core PR #5440](https://github.com/realm/realm-core/pull/5440)) -* Rework how Dictionaries/Maps are stored in the Realm file. The new design uses - less space and is typically significantly faster. This changes the iteration - order of Maps, so any code relying on that may be broken. We continue - to make no guarantees about iteration order on Maps ([Core #5764](https://github.com/realm/realm-core/issues/5764)). -* Improve performance of freezing Realms ([Core PR #6211](https://github.com/realm/realm-core/pull/6211)). - -### Fixed - -* Fix a crash when using client reset with recovery and flexible sync with a - single subscription ([Core #6070](https://github.com/realm/realm-core/issues/6070), since v10.28.2) -* Encrypted Realm files could not be opened on devices with a larger page size - than the one which originally wrote the file. - ([#8030](https://github.com/realm/realm-swift/issues/8030), since v10.32.1) -* Creating multiple flexible sync subscriptions at once could hit an assertion - failure if the server reported an error for any of them other than the last - one ([Core #6038](https://github.com/realm/realm-core/issues/6038), since v10.21.1). -* `Set` and `List` considered a string and binary - data containing that string encoded as UTF-8 to be equivalent. This could - result in a List entry not changing type on assignment and for the client be - inconsistent with the server if a string and some binary data with equivalent - content was inserted from Atlas. - ([Core #4860](https://github.com/realm/realm-core/issues/4860) and - [Core #6201](https://github.com/realm/realm-core/issues/6201), since v10.8.0) -* Querying for NaN on Decimal128 properties did not match any objects - ([Core #6182](https://github.com/realm/realm-core/issues/6182), since v10.8.0). -* When client reset with recovery is used and the recovery did not need to - make any changes to the local Realm, the sync client could incorrectly think - the recovery failed and report the error "A fatal error occured during client - reset: 'A previous 'Recovery' mode reset from did not succeed, - giving up on 'Recovery' mode to prevent a cycle'". - ([Core #6195](https://github.com/realm/realm-core/issues/6195), since v10.32.0) -* Fix a crash when using client reset with recovery and flexible sync with a - single subscription ([Core #6070](https://github.com/realm/realm-core/issues/6070), since v10.28.2) -* Writing to newly in-view objects while a flexible sync bootstrap was in - progress would not synchronize those changes to the server - ([Core #5804](https://github.com/realm/realm-core/issues/5804), since v10.21.1). -* If a client reset with recovery or discard local was interrupted while the - "fresh" realm was being downloaded, the sync client could crash with a - MultpleSyncAgents exception ([Core #6217](https://github.com/realm/realm-core/issues/6217), since v10.25.0). -* Sharing Realm files between a Catalyst app and Realm Studio did not properly - synchronize access to the Realm file ([Core #6258](https://github.com/realm/realm-core/pull/6258), since v10.0.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -### Internal - -* Upgraded realm-core from 12.13.0 to 13.4.0 - -10.34.1 Release notes (2023-01-20) -============================================================= - -### Fixed - -* Add some missing `@preconcurrency` annotations which lead to build failures - with Xcode 14.0 when importing via SPM or CocoaPods - ([#8104](https://github.com/realm/realm-swift/issues/8104), since v10.34.0). - -### Compatibility - -* Realm Studio: 11.0.0 - 12.0.0. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -10.34.0 Release notes (2023-01-13) -============================================================= - -Swift 5.5 is no longer supported. Swift 5.6 (Xcode 13.3) is now the minimum -supported version. - -The prebuilt binary for Carthage is now build with Xcode 14.2. - -### Enhancements - -* Improve performance of creating Projection objects and of change - notifications on projections ([PR #8050](https://github.com/realm/realm-swift/pull/8050)). -* Allow initialising any sync configuration with `cancelAsyncOpenOnNonFatalErrors`. -* Improve performance of Combine value publishers which do not use the - object/collection changesets a little. -* All public types have been audited for sendability and are now marked as - Sendable when applicable. A few types which were incidentally not thread-safe - but make sense to use from multiple threads are now thread-safe. -* Add support for building Realm with strict concurrency checking enabled. - -### Fixed - -* Fix bad memory access exception that can occur when watching change streams. - [PR #8039](https://github.com/realm/realm-swift/pull/8039). -* Object change notifications on projections only included the first projected - property for each source property ([PR #8050](https://github.com/realm/realm-swift/pull/8050), since v10.21.0). -* `@AutoOpen` failed to open flexible sync Realms while offline - ([#7986](https://github.com/realm/realm-swift/issues/7986), since v10.27.0). -* Fix "Publishing changes from within view updates is not allowed" warnings - when using `@ObservedResults` or `@ObservedSectionedResults` - ([#7908](https://github.com/realm/realm-swift/issues/7908)). -* Fix "Publishing changes from within view updates is not allowed" warnings - when using `@AutoOpen` or `@AsyncOpen`. - ([#7908](https://github.com/realm/realm-swift/issues/7908)). -* Defer `Realm.asyncOpen` execution on `@AsyncOpen` and `@AutoOpen` property - wrappers until all the environment values are set. This will guarantee the - configuration and partition value are set set before opening the realm. - ([#7931](https://github.com/realm/realm-swift/issues/7931), since v10.12.0). -* `@ObservedResults.remove()` could delete the wrong object if a write on a - background thread which changed the index of the object being removed - occurred at a very specific time (since v10.6.0). - -### Compatibility - -* Realm Studio: 11.0.0 - 12.0.0. 13.0.0 is currently incompatible. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -10.33.0 Release notes (2022-12-01) -============================================================= - -### Enhancements - -* Flexible sync subscription state will change to - `SyncSubscriptionState.pending` (`RLMSyncSubscriptionStatePending`) while - waiting for the server to have sent all pending history after a bootstrap and - before marking a subscription as Complete. - ([#5795](https://github.com/realm/realm-core/pull/5795)) -* Add custom column names API, which allows to set a different column name in the realm - from the one used in your object declaration. - ```swift - class Person: Object { - @Persisted var firstName: String - @Persisted var birthDate: Date - @Persisted var age: Int - - override class public func propertiesMapping() -> [String: String] { - ["firstName": "first_name", - "birthDate": "birth_date"] - } - } - ``` - This is very helpful in cases where you want to name a property differently - from your `Device Sync` JSON schema. - This API is only available for old and modern object declaration syntax on the - `RealmSwift` SDK. -* Flexible sync bootstraps now apply 1MB of changesets per write transaction - rather than applying all of them in a single write transaction. - ([Core PR #5999](https://github.com/realm/realm-core/pull/5999)). - -### Fixed - -* Fix a race condition which could result in "operation cancelled" errors being - delivered to async open callbacks rather than the actual sync error which - caused things to fail ([Core PR #5968](https://github.com/realm/realm-core/pull/5968), since the introduction of async open). -* Fix database corruption issues which could happen if an application was - terminated at a certain point in the process of comitting a write - transaciton. ([Core PR #5993](https://github.com/realm/realm-core/pull/5993), since v10.21.1) -* `@AsyncOpen` and `@AutoOpen` would begin and then cancel a second async open - operation ([PR #8038](https://github.com/realm/realm-swift/pull/8038), since v10.12.0). -* Changing the search text when using the searchable SwiftUI extension would - trigger multiple updates on the View for each change - ([PR #8038](https://github.com/realm/realm-swift/pull/8038), since v10.19.0). -* Changing the filter or search properties of an `@ObservedResults` or - `@ObservedSectionedResults` would trigger up to three updates on the View - ([PR #8038](https://github.com/realm/realm-swift/pull/8038), since v10.6.0). -* Fetching a user's profile while the user logs out would result in an - assertion failure. ([Core PR #6017](https://github.com/realm/realm-core/issues/5571), since v10.8.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -### Internal - -* Upgraded realm-core from 12.11.0 to 12.13.0 - -10.32.3 Release notes (2022-11-10) -============================================================= - -### Fixed - -* Fix name lookup errors when importing Realm Swift built in library evolution - mode (([#8014](https://github.com/realm/realm-swift/issues/8014)). -* The prebuilt watchOS library in the objective-c release package was missing - an arm64 slice. The Swift release package was uneffected - ([PR #8016](https://github.com/realm/realm-swift/pull/8016)). -* Fix issue where `RLMUserAPIKey.key`/`UserAPIKey.key` incorrectly returned the name of the API - key instead of the key itself. ([#8021](https://github.com/realm/realm-swift/issues/8021), since v10.0.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -10.32.2 Release notes (2022-11-01) -============================================================= - -Switch to building the Carthage release with Xcode 14.1. - -### Fixed - -* Fix linker errors when building a release build with Xcode 14.1 when - installing via SPM ([#7995](https://github.com/realm/realm-swift/issues/7995)). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -10.32.1 Release notes (2022-10-25) -============================================================= - -### Enhancements - -* Improve performance of client reset with automatic recovery and converting - top-level tables into embedded tables ([Core #5897](https://github.com/realm/realm-core/pull/5897)). -* `Realm.Error` is now a typealias for `RLMError` rather than a - manually-defined version of what the automatic bridging produces. This should - have no effect on existing working code, but the manual definition was - missing a few things supplied by the automatic bridging. -* Some sync errors sent by the server include a link to the server-side logs - associated with that error. This link is now exposed in the `serverLogURL` - property on `SyncError` (or `RLMServerLogURLKey` userInfo field when using NSError). - -### Fixed - -* Many sync and app errors were reported using undocumented internal error - codes and/or domains and could not be progammatically handled. Some notable - things which now have public error codes instead of unstable internal ones: - - `Realm.Error.subscriptionFailed`: The server rejected a flexible sync subscription. - - `AppError.invalidPassword`: A login attempt failed due to a bad password. - - `AppError.accountNameInUse`: A registration attempt failed due to the account name being in use. - - `AppError.httpRequestFailed`: A HTTP request to Atlas App Services - completed with an error HTTP code. The failing code is available in the - `httpStatusCode` property. - - Many other less common error codes have been added to `AppError`. - - All sync errors other than `SyncError.clientResetError` reported incorrect - error codes. - (since v10.0.0). -* `UserAPIKey.objectId` was incorrectly bridged to Swift as `RLMObjectId` to - `ObjectId`. This may produce warnings about an unneccesary cast if you were - previously casting it to the correct type (since v10.0.0). -* Fixed an assertion failure when observing change notifications on a sectioned - result, if the first modification was to a linked property that did not cause - the state of the sections to change. - ([Core #5912](https://github.com/realm/realm-core/issues/5912), - since the introduction of sectioned results in v10.29.0) -* Fix a use-after-free if the last external reference to an encrypted - synchronized Realm was closed between when a client reset error was received - and when the download of the new Realm began. - ([Core #5949](https://github.com/realm/realm-core/pull/5949), since 10.28.4). -* Fix an assertion failure during client reset with recovery when recovering - a list operation on an embedded object that has a link column in the path - prefix to the list from the top level object. - ([Core #5957](https://github.com/realm/realm-core/issues/5957), - since introduction of automatic recovery in v10.32.0). -* Creating a write transaction which is rejected by the server due to it - exceeding the maximum transaction size now results in a client reset error - instead of synchronization breaking and becoming stuck forever - ([Core #5209](https://github.com/realm/realm-core/issues/5209), since v10). -* Opening an unencrypted file with an encryption key would sometimes report a - misleading error message that indicated that the problem was something other - than a decryption failure ([Core #5915](https://github.com/realm/realm-core/pull/5915), since 0.89.0). -* Fix a rare deadlock which could occur when closing a synchronized Realm - immediately after committing a write transaction when the sync worker thread - has also just finished processing a changeset from the server - ([Core #5948](https://github.com/realm/realm-core/pull/5948)). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.0.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -### Internal - -* Upgraded realm-core from 12.9.0 to 12.11.0. - -10.32.0 Release notes (2022-10-10) -============================================================= - -### Enhancements - -* Add `.recoverUnsyncedChanges` (`RLMClientResetModeRecoverUnsyncedChanges`) and -`.recoverOrDiscardUnsyncedChanges` (`RLMClientResetModeRecoverOrDiscardUnsyncedChanges`) behaviors to `ClientResetMode` (`RLMClientResetMode`). - - The newly added recover modes function by downloading a realm which reflects the latest - state of the server after a client reset. A recovery process is run locally in an - attempt to integrate the server state with any local changes from before the - client reset occurred. - The changes are integrated with the following rules: - 1. Objects created locally that were not synced before client reset, will be integrated. - 2. If an object has been deleted on the server, but was modified on the client, the delete takes precedence and the update is discarded. - 3. If an object was deleted on the client, but not the server, then the client delete instruction is applied. - 4. In the case of conflicting updates to the same field, the client update is applied. - - The client reset process will fallback to `ClientResetMode.discardUnsyncedChanges` if the recovery process fails in `.recoverOrDiscardUnsyncedChanges`. - - The client reset process will fallback to `ClientResetMode.manual` if the recovery process fails in `.recoverUnsyncedChanges`. - - The two new swift recovery modes support client reset callbacks: `.recoverUnsyncedChanges(beforeReset: ((Realm) -> Void)? = nil, afterReset: ((Realm, Realm) -> Void)? = nil)`. - - The two new Obj-C recovery modes support client reset callbacks in `notifyBeforeReset` - and `notifyAfterReset`for both `[RLMUser configurationWithPartitionValue]` and `[RLMUser flexibleSyncConfigurationWithClientResetMode]` - For more detail on client reset callbacks, see `ClientResetMode`, `RLMClientResetBeforeBlock`, - `RLMClientResetAfterBlock`, and the 10.25.0 changelog entry. -* Add two new additional interfaces to define a manual client reset handler: - - Add a manual callback handler to `ClientResetMode.manual` -> `ClientResetMode.manual(ErrorReportingBlock? = nil)`. - - Add the `RLMSyncConfiguration.manualClientResetHandler` property (type `RLMSyncErrorReportingBlock`). - - These error reporting blocks are invoked in the event of a `RLMSyncErrorClientResetError`. - - See `ErrorReportingBlock` (`RLMSyncErrorReportingBlock`), and `ClientResetInfo` for more detail. - - Previously, manual client resets were handled only through the `SyncManager.ErrorHandler`. You have the - option, but not the requirement, to define manual reset handler in these interfaces. - Otherwise, the `SyncManager.ErrorHandler` is still invoked during the manual client reset process. - - These new interfaces are only invoked during a `RLMSyncErrorClientResetError`. All other sync errors - are still handled in the `SyncManager.ErrorHandler`. - - See 'Breaking Changes' for information how these interfaces interact with an already existing - `SyncManager.ErrorHandler`. - -### Breaking Changes - -* The default `clientResetMode` (`RLMClientResetMode`) is switched from `.manual` (`RLMClientResetModeManual`) - to `.recoverUnsyncedChanges` (`RLMClientResetModeRecoverUnsyncedChanges`). - - If you are currently using `.manual` and continue to do so, the only change - you must explicitly make is designating manual mode in - your `Realm.Configuration.SyncConfiguration`s, since they will now default to `.recoverUnsyncedChanges`. - - You may choose to define your manual client reset handler in the newly - introduced `manual(ErrorReportingBlock? = nil)` - or `RLMSyncConfiguration.manualClientResetHandler`, but this is not required. - The `SyncManager.errorHandler` will still be invoked during a client reset if - no callback is passed into these new interfaces. - -### Deprecations - -* `ClientResetMode.discardLocal` is deprecated in favor of `ClientResetMode.discardUnsyncedChanges`. - The reasoning is that the name better reflects the effect of this reset mode. There is no actual - difference in behavior. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.0.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -10.31.0 Release notes (2022-10-05) -============================================================= - -The prebuilt binary for Carthage is now build with Xcode 14.0.1. - -### Enhancements - -* Cut the runtime of aggregate operations on large dictionaries in half - ([Core #5864](https://github.com/realm/realm-core/pull/5864)). -* Improve performance of aggregate operations on collections of objects by 2x - to 10x ([Core #5864](https://github.com/realm/realm-core/pull/5864)). - Greatly improve the performance of sorting or distincting a Dictionary's keys - or values. The most expensive operation is now performed O(log N) rather than - O(N log N) times, and large Dictionaries can see upwards of 99% reduction in - time to sort. ([Core #5166](https://github.com/realm/realm-core/pulls/5166)) -* Add support for changing the deployment location for Atlas Apps. Previously - this was assumed to be immutable ([Core #5648](https://github.com/realm/realm-core/issues/5648)). -* The sync client will now yield the write lock to other threads which are - waiting to perform a write transaction even if it still has remaining work to - do, rather than always applying all changesets received from the server even - when other threads are trying to write. ([Core #5844](https://github.com/realm/realm-core/pull/5844)). -* The sync client no longer writes an unused temporary copy of the changesets - received from the server to the Realm file ([Core #5844](https://github.com/realm/realm-core/pull/5844)). - -### Fixed - -* Setting a `List` property with `Results` no longer throws an unrecognized - selector exception (since 10.8.0-beta.2) -* `RLMProgressNotificationToken` and `ProgressNotificationToken` now hold a - strong reference to the sync session, keeping it alive until the token is - deallocated or invalidated, as the other notification tokens do. - ([#7831](https://github.com/realm/realm-swift/issues/7831), since v2.3.0). -* Results permitted some nonsensical aggregate operations on column types which - do not make sense to aggregate, giving garbage results rather than reporting - an error ([Core #5876](https://github.com/realm/realm-core/pull/5876), since v5.0.0). -* Upserting a document in a Mongo collection would crash if the document's id - type was anything other than ObjectId (since v10.0.0). -* Fix a use-after-free when a sync session is closed and the app is destroyed - at the same time ([Core #5752](https://github.com/realm/realm-core/issues/5752), - since v10.19.0). - -### Deprecations - -* `RLMUpdateResult.objectId` has been deprecated in favor of - `RLMUpdateResult.documentId` to support reporting document ids which are not - object ids. -### Breaking Changes -* Private API `_realmColumnNames` has been renamed to a new public API - called `propertiesMapping()`. This change only affects the Swift API - and doesn't have any effects in the obj-c API. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.0.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -### Internal - -* Upgraded realm-core from 12.7.0 to 12.9.0 - -10.30.0 Release notes (2022-09-20) -============================================================= - -### Fixed - -* Incoming links from `RealmAny` properties were not handled correctly when - migrating an object type from top-level to embedded. `RealmAny` properties - currently cannot link to embedded objects. - ([Core #5796](https://github.com/realm/realm-core/pull/5796), since 10.8.0). -* `Realm.refresh()` sometimes did not actually advance to the latest version. - It attempted to be semi-non-blocking in a very confusing way which resulted - in it sometimes advancing to a newer version that is not the latest version, - and sometimes blocking until notifiers are ready so that it could advance to - the latest version. This behavior was undocumented and didn't work correctly, - so it now always blocks if needed to advance to the latest version. - ([#7625](https://github.com/realm/realm-swift/issues/7625), since v0.98.0). -* Fix the most common cause of thread priority inversions when performing - writes on the main thread. If beginning the write transaction has to wait for - the background notification calculations to complete, that wait is now done - in a QoS-aware way. ([#7902](https://github.com/realm/realm-swift/issues/7902)) -* Subscribing to link properties in a flexible sync Realm did not work due to a - mismatch between what the client sent and what the server needed. - ([Core #5409](https://github.com/realm/realm-core/issues/5409)) -* Attempting to use `AsymmetricObject` with partition-based sync now reports a - sensible error much earlier in the process. Asymmetric sync requires using - flexible sync. ([Core #5691](https://github.com/realm/realm-core/issues/5691), since 10.29.0). -* Case-insensitive but diacritic-sensitive queries would crash on 4-byte UTF-8 - characters ([Core #5825](https://github.com/realm/realm-core/issues/5825), since v2.2.0) -* Accented characters are now handled by case-insensitive but - diacritic-sensitive queries. ([Core #5825](https://github.com/realm/realm-core/issues/5825), since v2.2.0) - -### Breaking Changes - -* `-[RLMASLoginDelegate authenticationDidCompleteWithError:]` has been renamed - to `-[RLMASLoginDelegate authenticationDidFailWithError:]` to comply with new - app store requirements. This only effects the obj-c API. - ([#7945](https://github.com/realm/realm-swift/issues/7945)) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1 - 14. - -### Internal - -* Upgraded realm-core from 12.6.0 to 12.7.0 - -10.29.0 Release notes (2022-09-09) -============================================================= - -### Enhancements - -* Add support for asymmetric sync. When a class inherits from - `AsymmetricObject`, objects created are synced unidirectionally to the server - and cannot be queried or read locally. - -```swift - class PersonObject: AsymmetricObject { - @Persisted(primaryKey: true) var _id: ObjectId - @Persisted var name: String - @Persisted var age: Int - } - - try realm.write { - // This will create the object on the server but not locally. - realm.create(PersonObject.self, value: ["_id": ObjectId.generate(), - "name": "Dylan", - "age": 20]) - } -``` -* Add ability to section a collection which conforms to `RealmCollection`, `RLMCollection`. - Collections can be sectioned by a unique key retrieved from a keyPath or a callback and will return an instance of `SectionedResults`/`RLMSectionedResults`. - Each section in the collection will be an instance of `ResultsSection`/`RLMSection` which gives access to the elements corresponding to the section key. - `SectionedResults`/`RLMSectionedResults` and `ResultsSection`/`RLMSection` have the ability to be observed. - ```swift - class DemoObject: Object { - @Persisted var title: String - @Persisted var date: Date - var firstLetter: String { - return title.first.map(String.init(_:)) ?? "" - } - } - var sectionedResults: SectionedResults - // ... - sectionedResults = realm.objects(DemoObject.self) - .sectioned(by: \.firstLetter, ascending: true) - ``` -* Add `@ObservedSectionedResults` for SwiftUI support. This property wrapper type retrieves sectioned results - from a Realm using a keyPath or callback to determine the section key. - ```swift - struct DemoView: View { - @ObservedSectionedResults(DemoObject.self, - sectionKeyPath: \.firstLetter) var demoObjects - - var body: some View { - VStack { - List { - ForEach(demoObjects) { section in - Section(header: Text(section.key)) { - ForEach(section) { object in - MyRowView(object: object) - } - } - } - } - } - } - } - ``` -* Add automatic handing for changing top-level objects to embedded objects in - migrations. Any objects of the now-embedded type which have zero incoming - links are deleted, and objects with multiple incoming links are duplicated. - This happens after the migration callback function completes, so there is no - functional change if you already have migration logic which correctly handles - this. ([Core #5737](https://github.com/realm/realm-core/pull/5737)). -* Improve performance when a new Realm file connects to the server for the - first time, especially when significant amounts of data has been written - while offline. ([Core #5772](https://github.com/realm/realm-core/pull/5772)) -* Shift more of the work done on the sync worker thread out of the write - transaction used to apply server changes, reducing how long it blocks other - threads from writing. ([Core #5772](https://github.com/realm/realm-core/pull/5772)) -* Improve the performance of the sync changeset parser, which speeds up - applying changesets from the server. ([Core #5772](https://github.com/realm/realm-core/pull/5772)) - -### Fixed - -* Fix all of the UBSan failures hit by our tests. It is unclear if any of these - manifested as visible bugs. ([Core #5665](https://github.com/realm/realm-core/pull/5665)) -* Upload completion callbacks were sometimes called before the final step of - interally marking the upload as complete, which could result in calling - `Realm.writeCopy()` from the completion callback failing due to there being - unuploaded changes. ([Core #4865](https://github.com/realm/realm-core/issues/4865)). -* Writing to a Realm stored on an exFAT drive threw the exception "fcntl() with - F_BARRIERFSYNC failed: Inappropriate ioctl for device" when a write - transaction needed to expand the file. - ([Core #5789](https://github.com/realm/realm-core/issues/5789), since 10.27.0) -* Syncing a Decimal128 with big significand could result in a crash. - ([Core #5728](https://github.com/realm/realm-core/issues/5728)) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 RC. - -### Internal - -* Upgraded realm-core from 12.5.1 to 12.6.0 - -10.28.7 Release notes (2022-09-02) -============================================================= - -### Enhancements - -* Add prebuilt binaries for Xcode 14 to the release package. - -### Fixed - -* Fix archiving watchOS release builds with Xcode 14. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 6. - -10.28.6 Release notes (2022-08-19) -============================================================= - -### Fixed - -* Fixed an issue where having realm-swift as SPM sub-target dependency leads to - missing symbols error during iOS archiving ([Core #7645](https://github.com/realm/realm-core/pull/7645)). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 5. - -### Internal - -* Upgraded realm-core from 12.5.0 to 12.5.1 - -10.28.5 Release notes (2022-08-09) -============================================================= - -### Enhancements - -* Improve performance of accessing `SubscriptionSet` properties when no writes - have been made to the Realm since the last access. - -### Fixed - -* A use-after-free could occur if a Realm with audit events enabled was - destroyed while processing an upload completion for the events Realm on a - different thread. ([Core PR #5714](https://github.com/realm/realm-core/pull/5714)) -* Opening a read-only synchronized Realm for the first time via asyncOpen did - not set the schema version, which could lead to `m_schema_version != - ObjectStore::NotVersioned` assertion failures later on. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 4. - -### Internal - -* Upgraded realm-core from 12.4.0 to 12.5.0 - -10.28.4 Release notes (2022-08-03) -============================================================= - -### Enhancements - -* Add support for building arm64 watchOS when installing Realm via CocoaPods. -* Reduce the amount of virtual address space used - ([Core #5645](https://github.com/realm/realm-core/pull/5645)). - -### Fixed - -* Fix some warnings when building with Xcode 14 - ([Core #5577](https://github.com/realm/realm-core/pull/5577)). -* Fix compilation failures on watchOS platforms which do not support thread-local storage. - ([#7694](https://github.com/realm/realm-swift/issues/7694), [#7695](https://github.com/realm/realm-swift/issues/7695) since v10.21.1) -* Fix a data race when committing a transaction while multiple threads are - waiting to begin write transactions. This appears to not have caused any - functional problems. -* Fix a data race when writing audit events which could occur if the sync - client thread was busy with other work when the event Realm was opened. -* Fix some cases of running out of virtual address space (seen/reported as mmap - failures) ([Core #5645](https://github.com/realm/realm-core/pull/5645)). -* Audit event scopes containing only write events and no read events would - occasionally throw a `BadVersion` exception when a write transaction was - committed (since v10.26.0). -* The client reset callbacks for the DiscardLocal mode would be passed invalid - Realm instances if the callback was invoked at a point where the Realm was - not otherwise open. ([Core #5654](https://github.com/realm/realm-core/pull/5654), since the introduction of DiscardLocal reset mode in v10.25.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 4. - -### Internal - -* Upgraded realm-core from 12.3.0 to 12.4.0. - -10.28.3 Release notes (2022-07-27) -============================================================= - -### Enhancements - -* Greatly improve the performance of obtaining cached Realm instances in Swift - when using a sync configuration. - -### Fixed - -* Add missing `initialSubscription` and `rerunOnOpen` to copyWithZone method on - `RLMRealmConfiguration`. This resulted in incorrect values when using - `RLMRealmConfiguration.defaultConfiguration`. -* The sync error handler did not hold a strong reference to the sync session - while dispatching the error from the worker thread to the main thread, - resulting in the session passed to the error handler being invalid if there - were no other remaining strong references elsewhere. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 3. - -10.28.2 Release notes (2022-06-30) -============================================================= - -### Fixed - -* Using `seedFilePath` threw an exception if the Realm file being opened - already existed ([#7840](https://github.com/realm/realm-swift/issues/7840), - since v10.26.0). -* The `intialSubscriptions` callback was invoked every time a Realm was opened - regardless of the value of `rerunOnOpen` and if the Realm was already open on - another thread (since v10.28.0). -* Allow using `RLMSupport.Swift` from RealmSwift's Cocoapods - ([#6886](https://github.com/realm/realm-swift/pull/6886)). -* Fix a UBSan failure when mapping encrypted pages. Fixing this did not change - the resulting assembly, so there were probably no functional problems - resulting from this (since v5.0.0). -* Improved performance of sync clients during integration of changesets with - many small strings (totalling > 1024 bytes per changeset) on iOS 14, and - devices which have restrictive or fragmented memory. - ([Core #5614](https://github.com/realm/realm-core/issues/5614)) -* Fix a data race when opening a flexible sync Realm (since v10.28.0). -* Add a missing backlink removal when assigning null or a non-link value to an - `AnyRealmValue` property which previously linked to an object. - This could have resulted in "key not found" exceptions or assertion failures - such as `mixed.hpp:165: [realm-core-12.1.0] Assertion failed: m_type` when - removing the destination link object. - ([Core #5574](https://github.com/realm/realm-core/pull/5573), since the introduction of AnyRealmValue in v10.8.0) - -### Compatibility - -* Realm Studio: 12.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 2. - -### Internal - -* Upgraded realm-core from 12.1.0 to 12.3.0. - -10.28.1 Release notes (2022-06-10) -============================================================= - -### Enhancements - -* Add support for Xcode 14. When building with Xcode 14, the minimum deployment - target is now iOS 11. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 1. - -10.28.0 Release notes (2022-06-03) -============================================================= - -### Enhancements - -* Replace mentions of 'MongoDB Realm' with 'Atlas App Services' in the documentation and update appropriate links to documentation. -* Allow adding a subscription querying for all documents of a type in swift for flexible sync. -``` - try await subscriptions.update { - subscriptions.append(QuerySubscription(name: "all_people")) - } -``` -* Add Combine API support for flexible sync beta. -* Add an `initialSubscriptions` parameter when retrieving the flexible sync configuration from a user, - which allows to specify a subscription update block, to bootstrap a set of flexible sync subscriptions - when the Realm is first opened. - There is an additional optional parameter flag `rerunOnOpen`, which allows to run this initial - subscriptions on every app startup. - -```swift - let config = user.flexibleSyncConfiguration(initialSubscriptions: { subs in - subs.append(QuerySubscription(name: "people_10") { - $0.age > 10 - }) - }, rerunOnOpen: true) - let realm = try Realm(configuration: config) -``` -* The sync client error handler will report an error, with detailed info about which object caused it, when writing an object to a flexible sync Realm outside of any query subscription. ([#5528](https://github.com/realm/realm-core/pull/5528)) -* Adding an object to a flexible sync Realm for a type that is not within a query subscription will now throw an exception. ([#5488](https://github.com/realm/realm-core/pull/5488)). - -### Fixed - -* Flexible Sync query subscriptions will correctly complete when data is synced to the local Realm. ([#5553](https://github.com/realm/realm-core/pull/5553), since v12.0.0) - -### Breaking Changes - -* Rename `SyncSubscriptionSet.write` to `SyncSubscriptionSet.update` to avoid confusion with `Realm.write`. -* Rename `SyncSubscription.update` to `SyncSubscription.updateQuery` to avoid confusion with `SyncSubscriptionSet.update`. -* Rename `RLMSyncSubscriptionSet.write` to `RLMSyncSubscriptionSet.update` to align it with swift API. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-13.4. - -### Internal - -* Upgraded realm-core from 12.0.0 to 12.1.0. - -10.27.0 Release notes (2022-05-26) -============================================================= - -### Enhancements - -* `@AsyncOpen`/`@AutoOpen` property wrappers can be used with flexible sync. - -### Fixed - -* When installing via SPM, debug builds could potentially hit an assertion - failure during flexible sync bootstrapping. ([Core #5527](https://github.com/realm/realm-core/pull/5527)) -* Flexible sync now only applies bootstrap data if the entire bootstrap is - received. Previously orphaned objects could result from the read snapshot on - the server changing. ([Core #5331](https://github.com/realm/realm-core/pull/5331)) -* Partially fix a performance regression in write performance introduced in - v10.21.1. v10.21.1 fixed a case where a kernel panic or device's battery - dying at the wrong point in a write transaction could potentially result in a - corrected Realm file, but at the cost of a severe performance hit. This - version adjusts how file synchronization is done to provide the same safety - at a much smaller performance hit. ([#7740](https://github.com/realm/realm-swift/issues/7740)). - -### Compatibility - -* Realm Studio: 11.0.0 or later (but see note below). -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-13.4. - -### Internal - -* Upgraded realm-core from 11.17.0 to 12.0.0. -* Bump the version number for the lockfile used for interprocess - synchronization. This has no effect on persistent data, but means that - versions of Realm which use pre-12.0.0 realm-core cannot open Realm files at - the same time as they are opened by this version. Notably this includes Realm - Studio, and v11.1.2 (the latest at the time of this release) cannot open - Realm files which are simultaneously open in the simulator. - -10.26.0 Release notes (2022-05-19) -============================================================= - -Xcode 13.1 is now the minimum supported version of Xcode, as Apple no longer -allows submitting to the app store with Xcode 12. - -### Enhancements - -* Add Xcode 13.4 binaries to the release package. -* Add Swift API for asynchronous transactions -```swift - try? realm.writeAsync { - realm.create(SwiftStringObject.self, value: ["string"]) - } onComplete: { error in - // optional handling on write complete - } - - try? realm.beginAsyncWrite { - realm.create(SwiftStringObject.self, value: ["string"]) - realm.commitAsyncWrite() - } - - let asyncTransactionId = try? realm.beginAsyncWrite { - // ... - } - try! realm.cancelAsyncWrite(asyncTransactionId) -``` -* Add Obj-C API for asynchronous transactions -``` - [realm asyncTransactionWithBlock:^{ - [StringObject createInRealm:realm withValue:@[@"string"]]; - } onComplete:^(NSError *error) { - // optional handling - }]; - - [realm beginAsyncWriteTransaction:^{ - [StringObject createInRealm:realm withValue:@[@"string"]]; - [realm commitAsyncWriteTransaction]; - }]; - - RLMAsyncTransactionId asyncTransactionId = [realm beginAsyncWriteTransaction:^{ - // ... - }]; - [realm cancelAsyncTransaction:asyncTransactionId]; -``` -* Improve performance of opening a Realm with `objectClasses`/`objectTypes` set - in the configuration. -* Implement the Realm event recording API for reporting reads and writes on a - Realm file to Atlas. - -### Fixed - -* Lower minimum OS version for `async` login and FunctionCallables to match the - rest of the `async` functions. ([#7791]https://github.com/realm/realm-swift/issues/7791) -* Consuming a RealmSwift XCFramework with library evolution enabled would give the error - `'Failed to build module 'RealmSwift'; this SDK is not supported by the compiler'` - when the XCFramework was built with an older XCode version and is - then consumed with a later version. ([#7313](https://github.com/realm/realm-swift/issues/7313), since v3.18.0) -* A data race would occur when opening a synchronized Realm with the client - reset mode set to `discardLocal` on one thread at the same time as a client - reset was being processed on another thread. This probably did not cause any - functional problems in practice and the broken timing window was very tight (since 10.25.0). -* If an async open of a Realm triggered a client reset, the callbacks for - `discardLocal` could theoretically fail to be called due to a race condition. - The timing for this was probably not possible to hit in practice (since 10.25.0). -* Calling `[RLMRealm freeze]`/`Realm.freeze` on a Realm which had been created from `writeCopy` - would not produce a frozen Realm. ([#7697](https://github.com/realm/realm-swift/issues/7697), since v5.0.0) -* Using the dynamic subscript API on unmanaged objects before first opening a - Realm or if `objectTypes` was set when opening a Realm would throw an - exception ([#7786](https://github.com/realm/realm-swift/issues/7786)). -* The sync client may have sent a corrupted upload cursor leading to a fatal - error from the server due to an uninitialized variable. - ([#5460](https://github.com/realm/realm-core/pull/5460), since v10.25.1) -* Flexible sync would not correctly resume syncing if a bootstrap was interrupted - ([#5466](https://github.com/realm/realm-core/pull/5466), since v10.21.1). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-13.4. - -### Internal - -* Upgraded realm-core from v11.15.0 to v11.17.0 - -10.25.2 Release notes (2022-04-27) -============================================================= - -### Enhancements - -* Replace Xcode 13.3 binaries with 13.3.1 binaries. - -### Fixed - -* `List` would contain an invalidated object instead of null when - the object linked to was deleted by a difference sync client - ([Core #5215](https://github.com/realm/realm-core/pull/5215), since v10.8.0). -* Adding an object to a Set, deleting the parent object of the Set, and then - deleting the object which was added to the Set would crash - ([Core #5387](https://github.com/realm/realm-core/issues/5387), since v10.8.0). -* Synchronized Realm files which were first created using v10.0.0-beta.3 would - be redownloaded instead of using the existing file, possibly resulting in the - loss of any unsynchronized data in those files (since v10.20.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3.1. - -### Internal - -* Upgraded realm-core from v11.14.0 to v11.15.0 - -10.25.1 Release notes (2022-04-11) -============================================================= - -### Fixed - -* Fixed various memory corruption bugs when encryption is used caused by not - locking a mutex when needed. - ([#7640](https://github.com/realm/realm-swift/issues/7640), [#7659](https://github.com/realm/realm-swift/issues/7659), since v10.21.1) -* Changeset upload batching did not calculate the accumulated size correctly, - resulting in “error reading body failed to read: read limited at 16777217 - bytes” errors from the server when writing large amounts of data - ([Core #5373](https://github.com/realm/realm-core/pull/5373), since 10.25.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3. - -### Internal - -* Upgraded realm-core from v11.13.0 to v11.14.0. - -10.25.0 Release notes (2022-03-29) -============================================================= - -Synchronized Realm files written by this version cannot be opened by older -versions of Realm. Existing files will be automatically upgraded when opened. - -Non-synchronized Realm files remain backwards-compatible. - -### Enhancements - -* Add ability to use Swift Query syntax in `@ObservedResults`, which allows you - to filter results using the `where` parameter. -* Add ability to use `MutableSet` with `StateRealmObject` in SwiftUI. -* Async/Await extensions are now compatible with iOS 13 and above when building - with Xcode 13.3. -* Sync changesets waiting to be uploaded to the server are now compressed, - reducing the disk space needed when large write transactions are performed - while offline or limited in bandwidth.([Core #5260](https://github.com/realm/realm-core/pull/5260)). -* Added new `SyncConfiguration.clientResetMode` and `RLMSyncConfiguration.clientResetMode` properties. - - The values of these properties will dictate client behavior in the event of a [client reset](https://docs.mongodb.com/realm/sync/error-handling/client-resets/). - - See below for information on `ClientResetMode` values. - - `clientResetMode` defaults to `.manual` if not set otherwise. -* Added new `ClientResetMode` and `RLMClientResetMode` enums. - - These enums represent possible client reset behavior for `SyncConfiguration.clientResetMode` and `RLMSyncConfiguration.clientResetMode`, respectively. - - `.manual` and `RLMClientResetModeManual` - - The local copy of the Realm is copied into a recovery - directory for safekeeping, and then deleted from the original location. The next time - the Realm for that partition value is opened, the Realm will automatically be re-downloaded from - MongoDB Realm, and can be used as normal. - - Data written to the Realm after the local copy of the Realm diverged from the backup - remote copy will be present in the local recovery copy of the Realm file. The - re-downloaded Realm will initially contain only the data present at the time the Realm - was backed up on the server. - - `rlmSync_clientResetBackedUpRealmPath` and `SyncError.clientResetInfo()` are used for accessing the recovery directory. - - `.discardLocal` and `RLMClientResetDiscardLocal` - - All unsynchronized local changes are automatically discarded and the local state is - automatically reverted to the most recent state from the server. Unsynchronized changes - can then be recovered in a post-client-reset callback block (See changelog below for more details). - - If RLMClientResetModeDiscardLocal is enabled but the client reset operation is unable to complete - then the client reset process reverts to manual mode. - - The realm's underlying object accessors remain bound so the UI may be updated in a non-disruptive way. -* Added support for client reset notification blocks for `.discardLocal` and `RLMClientResetDiscardLocal` - - **RealmSwift implementation**: `discardLocal(((Realm) -> Void)? = nil, ((Realm, Realm) -> Void)? = nil)` - - RealmSwift client reset blocks are set when initializing the user configuration - ```swift - var configuration = user.configuration(partitionValue: "myPartition", clientResetMode: .discardLocal(beforeClientResetBlock, afterClientResetBlock)) - ``` - - The before client reset block -- `((Realm) -> Void)? = nil` -- is executed prior to a client reset. Possible usage includes: - ```swift - let beforeClientResetBlock: (Realm) -> Void = { beforeRealm in - var recoveryConfig = Realm.Configuration() - recoveryConfig.fileURL = myRecoveryPath - do { - beforeRealm.writeCopy(configuration: recoveryConfig) - /* The copied realm could be used later for recovery, debugging, reporting, etc. */ - } catch { - /* handle error */ - } - } - ``` - - The after client reset block -- `((Realm, Realm) -> Void)? = nil)` -- is executed after a client reset. Possible usage includes: - ```Swift - let afterClientResetBlock: (Realm, Realm) -> Void = { before, after in - /* This block could be used to add custom recovery logic, back-up a realm file, send reporting, etc. */ - for object in before.objects(myClass.self) { - let res = after.objects(myClass.self) - if (res.filter("primaryKey == %@", object.primaryKey).first != nil) { - /* ...custom recovery logic... */ - } else { - /* ...custom recovery logic... */ - } - } - ``` - - **Realm Obj-c implementation**: Both before and after client reset callbacks exist as properties on `RLMSyncConfiguration` and are set at initialization. - ```objective-c - RLMRealmConfiguration *config = [user configurationWithPartitionValue:partitionValue - clientResetMode:RLMClientResetModeDiscardLocal - notifyBeforeReset:beforeBlock - notifyAfterReset:afterBlock]; - ``` - where `beforeBlock` is of type `RLMClientResetBeforeBlock`. And `afterBlock` is of type `RLMClientResetAfterBlock`. - -### Breaking Changes - -* Xcode 13.2 is no longer supported when building with Async/Await functions. Use - Xcode 13.3 to build with Async/Await functionality. - -### Fixed - -* Adding a Realm Object to a `ObservedResults` or a collections using - `StateRealmObject` that is managed by the same Realm would throw if the - Object was frozen and not thawed before hand. -* Setting a Realm Configuration for @ObservedResults using it's initializer - would be overrode by the Realm Configuration stored in - `.environment(\.realmConfiguration, ...)` if they did not match - ([Cocoa #7463](https://github.com/realm/realm-swift/issues/7463), since v10.6.0). -* Fix searchable component filter overriding the initial filter on `@ObservedResults`, (since v10.23.0). -* Comparing `Results`, `LinkingObjects` or `AnyRealmCollection` when using Realm via XCFramework - would result in compile time errors ([Cocoa #7615](https://github.com/realm/realm-swift/issues/7615), since v10.21.0) -* Opening an encrypted Realm while the keychain is locked on macOS would crash - ([#7438](https://github.com/realm/realm-swift/issues/7438)). -* Updating subscriptions while refreshing the access token would crash - ([Core #5343](https://github.com/realm/realm-core/issues/5343), since v10.22.0) -* Fix several race conditions in `SyncSession` related to setting - `customRequestHeaders` while using the `SyncSession` on a different thread. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3. - -### Internal - -* Upgraded realm-core from v11.12.0 to v11.13.0 - -10.24.2 Release notes (2022-03-18) -============================================================= - -### Fixed - -* Application would sometimes crash with exceptions like 'KeyNotFound' or - assertion "has_refs()". Other issues indicating file corruption may also be - fixed by this. The one mentioned here is the one that lead to solving the - problem. - ([Core #5283](https://github.com/realm/realm-core/issues/5283), since v5.0.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3. - -### Internal - -* Upgraded realm-core from 11.11.0 to 11.12.0 - -10.24.1 Release notes (2022-03-14) -============================================================= - -Switch to building the Carthage binary with Xcode 13.3. This release contains -no functional changes from 10.24.0. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3. - -10.24.0 Release notes (2022-03-05) -============================================================= - -### Enhancements - -* Add ability to use Swift Query syntax in `@ObservedResults`, which allows you - to filter results using the `where` parameter. - -### Fixed - -* If a list of objects contains links to objects not included in the - synchronized partition, collection change notifications for that list could - be incorrect ([Core #5164](https://github.com/realm/realm-core/issues/5164), since v10.0.0). -* Adding a new flexible sync subscription could crash with - "Assertion failed: !m_unbind_message_sent" in very specific timing scenarios - ([Core #5149](https://github.com/realm/realm-core/pull/5149), since v10.22.0). -* Converting floats/doubles into Decimal128 would yield imprecise results - ([Core #5184](https://github.com/realm/realm-core/pull/5184), since v10.0.0) -* Using accented characters in class and field names in a synchronized Realm - could result in sync errors ([Core #5196](https://github.com/realm/realm-core/pull/5196), since v10.0.0). -* Calling `Realm.invalidate()` from inside a Realm change notification could - result in the write transaction which produced the notification not being - persisted to disk (since v10.22.0). -* When a client reset error which results in the current Realm file being - backed up and then deleted, deletion errors were ignored as long as the copy - succeeded. When this happens the deletion of the old file is now scheduled - for the next launch of the app. ([Core #5180](https://github.com/realm/realm-core/issues/5180), since v2.0.0) -* Fix an error when compiling a watchOS Simulator target not supporting - Thread-local storage ([#7623](https://github.com/realm/realm-swift/issues/7623), since v10.21.0). -* Add a validation check to report a sensible error if a Realm configuration - indicates that an in-memory Realm should be encrypted. ([Core #5195](https://github.com/realm/realm-core/issues/5195)) -* The Swift package set the linker flags on the wrong target, resulting in - linker errors when SPM decides to build the core library as a dynamic library - ([#7266](https://github.com/realm/realm-swift/issues/7266)). -* The download-core task failed if run in an environment without TMPDIR set - ([#7688](https://github.com/realm/realm-swift/issues/7688), since v10.23.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3 beta 3. - -### Internal - -* Upgraded realm-core from 11.9.0 to 11.11.0 - -10.23.0 Release notes (2022-02-28) -============================================================= - -### Enhancements - -* Add `Realm.writeCopy(configuration:)`/`[RLMRealm writeCopyForConfiguration:]` which gives the - following functionality: - - Export a local non-sync Realm to be used with MongoDB Realm Sync - when the configuration is derived from a sync `RLMUser`/`User`. - - Write a copy of a local Realm to a destination specified in the configuration. - - Write a copy of a synced Realm in use with user A, and open it with user B. - - Note that migrations may be required when using a local realm configuration to open a realm file that - was copied from a synchronized realm. - - An exception will be thrown if a Realm exists at the destination. -* Add a `seedFilePath` option to `RLMRealmConfiguration` and `Configuration`. If this - option is set then instead of creating an empty Realm, the realm at the `seedFilePath` will - be copied to the `fileURL` of the new Realm. If a Realm file already exists at the - desitnation path, the seed file will not be copied and the already existing Realm - will be opened instead. Note that to use this parameter with a synced Realm configuration - the seed Realm must be appropriately copied to a destination with - `Realm.writeCopy(configuration:)`/`[RLMRealm writeCopyForConfiguration:]` first. -* Add ability to permanently delete a User from a MongoDB Realm app. This can - be invoked with `User.delete()`/`[RLMUser deleteWithCompletion:]`. -* Add `NSCopying` conformance to `RLMDecimal128` and `RLMObjectId`. -* Add Xcode 13.3 binaries to the release package (and remove 13.0). - -### Fixed - -* Add support of arm64 in Carthage build ([#7154](https://github.com/realm/realm-cocoa/issues/7154) -* Adding missing support for `IN` queries to primitives types on Type Safe Queries. - ```swift - let persons = realm.objects(Person.self).where { - let acceptableNames = ["Tom", "James", "Tyler"] - $0.name.in([acceptableNames]) - } - ``` - ([Cocoa #7633](https://github.com/realm/realm-swift/issues/7633), since v10.19.0) -* Work around a compiler crash when building with Swift 5.6 / Xcode 13.3. - CustomPersistable's PersistedType must now always be a built-in type rather - than possibly another CustomPersistable type as Swift 5.6 has removed support - for infinitely-recursive associated types ([#7654](https://github.com/realm/realm-swift/issues/7654)). -* Fix redundant call to filter on `@ObservedResults` from `searchable` - component (since v10.19.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3 beta 3. - -10.22.0 Release notes (2022-01-25) -============================================================= - -### Enhancements - -* Add beta support for flexible sync. See the [backend](https://docs.mongodb.com/realm/sync/data-access-patterns/flexible-sync/) and [SDK](https://docs.mongodb.com/realm/sdk/swift/examples/flexible-sync/) documentation for more information. Please report any issues with the beta through Github. - -### Fixed - -* UserIdentity metadata table grows indefinitely. ([#5152](https://github.com/realm/realm-core/issues/5152), since v10.20.0) -* We now report a useful error message when opening a sync Realm in non-sync mode or vice-versa.([#5161](https://github.com/realm/realm-core/pull/5161), since v5.0.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.2.1. - -### Internal - -* Upgraded realm-core from 11.8.0 to 11.9.0 - -10.21.1 Release notes (2022-01-12) -============================================================= - -### Fixed - -* The sync client will now drain the receive queue when a send fails with - ECONNRESET, ensuring that any error message from the server gets received and - processed. ([#5078](https://github.com/realm/realm-core/pull/5078)) -* Schema validation was missing for embedded objects in sets, resulting in an - unhelpful error being thrown if a Realm object subclass contained one (since v10.0.0). -* Opening a Realm with a schema that has an orphaned embedded object type - performed an extra empty write transaction (since v10.0.0). -* Freezing a Realm with a schema that has orphaned embedded object types threw - a "Wrong transactional state" exception (since v10.19.0). -* `@sum` and `@avg` queries on Dictionaries of floats or doubles used too much - precision for intermediates, resulting in incorrect rounding (since v10.5.0). -* Change the exception message for calling refresh on an immutable Realm from - "Continuous transaction through DB object without history information." to - "Can't refresh a read-only Realm." - ([#5061](https://github.com/realm/realm-core/issues/5061), since v10.8.0). -* Queries of the form "link.collection.@sum = 0" where `link` is null matched - when `collection` was a List or Set, but not a Dictionary - ([#5080](https://github.com/realm/realm-core/pull/5080), since v10.8.0). -* Types which require custom obj-c bridging (such as `PersistableEnum` or - `CustomPersistable`) would crash with exceptions mentioning `__SwiftValue` in - a variety of places on iOS versions older than iOS 14 - ([#7604](https://github.com/realm/realm-swift/issues/7604), since v10.21.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.2.1. - -### Internal - -* Upgraded realm-core from 11.6.1 to 11.8.0. - -10.21.0 Release notes (2022-01-10) -============================================================= - -### Enhancements - -* Add `metadata` property to `RLMUserProfile`/`UserProfile`. -* Add class `Projection` to allow creation of light weight view models out of Realm Objects. -```swift -public class Person: Object { - @Persisted var firstName = "" - @Persisted var lastName = "" - @Persisted var address: Address? = nil - @Persisted var friends = List() -} - -public class Address: EmbeddedObject { - @Persisted var city: String = "" - @Persisted var country = "" -} - -class PersonProjection: Projection { - // `Person.firstName` will have same name and type - @Projected(\Person.firstName) var firstName - // There will be the only String for `city` of the original object `Address` - @Projected(\Person.address.city) var homeCity - // List will be mapped to list of firstNames - @Projected(\Person.friends.projectTo.firstName) var firstFriendsName: ProjectedCollection -} - -// `people` will contain projections for every `Person` object in the `realm` -let people: Results = realm.objects(PersonProjection.self) -``` -* Greatly improve performance of reading AnyRealmValue and enum types from - Realm collections. -* Allow using Swift enums which conform to `PersistableEnum` as the value type - for all Realm collections. -* `AnyRealmCollection` now conforms to `Encodable`. -* AnyRealmValue and PersistableEnum values can now be passed directly to an - NSPredicate used in a filter() call rather than having to pass the rawValue - (the rawValue is still allowed). -* Queries on collections of PersistableEnums can now be performed with `where()`. -* Add support for querying on the rawValue of an enum with `where()`. -* `.count` is supported for Maps of all types rather than just numeric types in `where()`. -* Add support for querying on the properties of objects contained in - dictionaries (e.g. "dictProperty.@allValues.name CONTAINS 'a'"). -* Improve the error message for many types of invalid predicates in queries. -* Add support for comparing `@allKeys` to another property on the same object. -* Add `Numeric` conformance to `Decimal128`. -* Make some invalid property declarations such as `List` a - compile-time error instead of a runtime error. -* Calling `.sorted(byKeyPath:)` on a collection with an Element type which does - not support sorting by keypaths is now a compile-time error instead of a - runtime error. -* `RealmCollection.sorted(ascending:)` can now be called on all - non-Object/EmbeddedObject collections rather than only ones where the - `Element` conforms to `Comparable`. -* Add support for using user-defined types with `@Persistable` and in Realm - collections by defining a mapping to and from a type which Realm knows how to - store. For example, `URL` can be made persistable with: - ```swift - extension URL: FailableCustomPersistable { - // Store URL values as a String in Realm - public typealias PersistedType = String - // Convert a String to a URL - public init?(persistedValue: String) { self.init(string: persistedValue) } - // Convert a URL to a String - public var persistableValue: String { self.absoluteString } - } - ``` - After doing this, `@Persisted var url: URL` is a valid property declaration - on a Realm object. More advanced mappings can be done by mapping to an - EmbeddedObject which can store multiple values. - -### Fixed - -* Accessing a non object collection inside a migration would cause a crash -* [#5633](https://github.com/realm/realm-cocoa/issues/5633). -* Accessing a `Map` of objects dynamically would not handle nulled values correctly (since v10.8.0). -* `where()` allowed constructing some nonsensical queries due to boolean - comparisons returning `Query` rather than `Query` (since v10.19.0). -* `@allValues` queries on dictionaries accidentally did not require "ANY". -* Case-insensitive and diacritic-insensitive modifiers were ignored when - comparing the result of an aggregate operation to another property in a - query. -* `Object.init(value:)` did not allow initializing `RLMDictionary`/`Map` - properties with null values for map entries (since v10.8.0). -* `@ObservedResults` did not refresh when changes were made to the observed - collection. (since v10.6.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.2.1. - -10.20.1 Release notes (2021-12-14) -============================================================= - -Xcode 12.4 is now the minimum supported version of Xcode. - -### Fixed - -* Add missing `Indexable` support for UUID. - ([Cocoa #7545](https://github.com/realm/realm-swift/issues/7545), since v10.10.0) - -### Breaking Changes - -* All `async` functions now require Xcode 13.2 to work around an App - Store/TestFlight bug that results in apps built with 13.0/13.1 which do not - use libConcurrency but link a library which does crashing on startup. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.2. - -10.20.0 Release notes (2021-11-16) -============================================================= - -### Enhancements - -* Conform `@ThreadSafe` and `ThreadSafeReference` to `Sendable`. -* Allow using Swift enums which conform to `PersistableEnum` as the value type - for all Realm collections. -* `AnyRealmCollection` now conforms to `Encodable`. -* Greatly improve performance of reading AnyRealmValue and enum types from - Realm collections. -* `AnyRealmCollection` now conforms to `Encodable`. - -### Fixed - -* `@AutoOpen` will open the existing local Realm file on any connection error - rather than only when the connection specifically times out. -* Do not allow `progress` state changes for `@AutoOpen` and `@AsyncOpen` after - changing state to `open(let realm)` or `error(let error)`. -* Logging out a sync user failed to remove the local Realm file for partitions - with very long partition values that would have exceeded the maximum path - length. ([Core #4187](https://github.com/realm/realm-core/issues/4187), since v10.0.0) -* Don't keep trying to refresh the access token if the client's clock is more - than 30 minutes fast. ([Core #4941](https://github.com/realm/realm-core/issues/4941)) -* Failed auth requests used a fixed long sleep rather than exponential backoff - like other sync requests, which could result in very delayed reconnects after - a device was offline long enough for the access token to expire (since v10.0.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.1. - -### Internal - -* Upgraded realm-core from 11.6.0 to 11.6.1. - -10.19.0 Release notes (2021-11-04) -============================================================= - -### Enhancements - -* Add `.searchable()` SwiftUI View Modifier which allows filtering - `@ObservedResult` results from a search field component by a key path. - ```swift - List { - ForEach(reminders) { reminder in - ReminderRowView(reminder: reminder) - } - }.searchable(text: $searchFilter, - collection: $reminders, - keyPath: \.name) { - ForEach(reminders) { remindersFiltered in - Text(remindersFiltered.name).searchCompletion(remindersFiltered.name) - } - } - ``` -* Add an API for a type safe query syntax. This allows you to filter a Realm - and collections managed by a Realm with Swift style expressions. Here is a - brief example: - ```swift - class Person: Object { - @Persisted var name: String - @Persisted var hobbies: MutableSet - @Persisted var pets: List - } - class Pet: Object { - @Persisted var name: String - @Persisted var age: Int - } - - let persons = realm.objects(Person.self).where { - $0.hobbies.contains("music") || $0.hobbies.contains("baseball") - } - - persons = realm.objects(Person.self).where { - ($0.pets.age >= 2) && $0.pets.name.starts(with: "L") - } - ``` - ([#7419](https://github.com/realm/realm-swift/pull/7419)) -* Add support for dictionary subscript expressions - (e.g. `"phoneNumbers['Jane'] == '123-3456-123'"`) when querying with an - NSPredicate. -* Add UserProfile to User. This contains metadata from social logins with MongoDB Realm. -* Slightly reduce the peak memory usage when processing sync changesets. - -### Fixed - -* Change default request timeout for `RLMApp` from 6 seconds to 60 seconds. -* Async `Realm` init would often give a Realm instance which could not actually - be used and would throw incorrect thread exceptions. It now is `@MainActor` - and gives a Realm instance which always works on the main actor. The - non-functional `queue:` parameter has been removed (since v10.15.0). -* Restore the pre-v10.12.0 behavior of calling `writeCopy()` on a synchronized - Realm which produced a local non-synchronized Realm - ([#7513](https://github.com/realm/realm-swift/issues/7513)). -* Decimal128 did not properly normalize the value before hashing and so could - have multiple values which are equal but had different hash values (since v10.8.0). -* Fix a rare assertion failure or deadlock when a sync session is racing to - close at the same time that external reference to the Realm is being - released. ([Core #4931](https://github.com/realm/realm-core/issues/4931)) -* Fix a assertion failure when opening a sync Realm with a user who had been - removed. Instead an exception will be thrown. ([Core #4937](https://github.com/realm/realm-core/issues/4937), since v10.0.0) -* Fixed a rare segfault which could trigger if a user was being logged out - while the access token refresh response comes in. - ([Core #4944](https://github.com/realm/realm-core/issues/4944), since v10.0.0) -* Fixed a bug where progress notifiers on an AsyncOpenTask could be called - after the open completed. ([Core #4919](https://github.com/realm/realm-core/issues/4919)) -* SecureTransport was not enabled for macCatalyst builds when installing via - SPM, resulting in `'SSL/TLS protocol not supported'` exceptions when using - Realm Sync. ([#7474](https://github.com/realm/realm-swift/issues/7474)) -* Users were left in the logged in state when their refresh token expired. - ([Core #4882](https://github.com/realm/realm-core/issues/4882), since v10) -* Calling `.count` on a distinct collection would return the total number of - objects in the collection rather than the distinct count the first time it is - called. ([#7481](https://github.com/realm/realm-swift/issues/7481), since v10.8.0). -* `realm.delete(collection.distinct(...))` would delete all objects in the - collection rather than just the first object with each distinct value in the - property being distincted on, unless the distinct Results were read from at - least once first (since v10.8.0). -* Calling `.distinct()` on a collection, accessing the Results, then passing - the Results to `realm.delete()` would delete the correct objects, but - afterwards report a count of zero even if there were still objects in the - Results (since v10.8.0). -* Download compaction could result in non-streaming sync download notifiers - never reporting completion (since v10.0.0, - [Core #4989](https://github.com/realm/realm-core/pull/4989)). -* Fix a deadlock in SyncManager that was probably not possible to hit in - real-world code (since v10.0.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.2. - -### Internal - -* Upgraded realm-core from v11.4.1 to v11.6.0 - -10.18.0 Release notes (2021-10-25) -============================================================= - -### Enhancements - -* Add support for using multiple users with `@AsyncOpen` and `@AutoOpen`. - Setting the current user to a new user will now automatically reopen the - Realm with the new user. -* Add prebuilt binary for Xcode 13.1 to the release package. - -### Fixed - -* Fix `@AsyncOpen` and `@AutoOpen` using `defaultConfiguration` by default if - the user's doesn't provide one, will set an incorrect path which doesn't - correspond to the users configuration one. (since v10.12.0) -* Adding missing subscription completion for `AsyncOpenPublisher` after - successfully returning a realm. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.1. - -10.17.0 Release notes (2021-10-06) -============================================================= - -### Enhancements - -* Add a new `@ThreadSafe` property wrapper. Objects and collections wrapped by `@ThreadSafe` may be passed between threads. It's - intended to allow local variables and function parameters to be used across - threads when needed. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.0. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0. - -10.16.0 Release notes (2021-09-29) -============================================================= - -### Enhancements - -* Add `async` versions of `EmailPasswordAuth.callResetPasswordFunction` and -r `User.linkUser` methods. -* Add `async` version of `MongoCollection` methods. -* Add `async` support for user functions. - -### Fixed - -* A race condition in Realm.asyncOpen() sometimes resulted in subsequent writes - from Realm Sync failing to produce notifications - ([#7447](https://github.com/realm/realm-swift/issues/7447), - [#7453](https://github.com/realm/realm-swift/issues/7453), - [Core #4909](https://github.com/realm/realm-core/issues/4909), since v10.15.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.0. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0. - -10.15.1 Release notes (2021-09-15) -============================================================= - -### Enhancements - -* Switch to building the Carthage release with Xcode 13. - -### Fixed - -* Fix compilation error where Swift 5.5 is available but the macOS 12 SDK was - not. This was notable for the Xcode 13 RC. This fix adds a #canImport check - for the `_Concurrency` module that was not available before the macOS 12 SDK. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.0. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0. - -10.15.0 Release notes (2021-09-10) -============================================================= - -### Enhancements - -* Add `async` versions of the `Realm.asyncOpen` and `App.login` methods. -* ThreadSafeReference no longer pins the source transaction version for - anything other than a Results created by filtering a collection. This means - that holding on to thread-safe references to other things (such as Objects) - will no longer cause file size growth. -* A ThreadSafeReference to a Results backed by a collection can now be created - inside a write transaction as long as the collection was not created in the - current write transaction. -* Synchronized Realms are no longer opened twice, cutting the address space and - file descriptors used in half. - ([Core #4839](https://github.com/realm/realm-core/pull/4839)) -* When using the SwiftUI helper types (@ObservedRealmObject and friends) to - bind to an Equatable property, self-assignment no longer performs a pointless - write transaction. SwiftUI appears to sometimes call a Binding's set function - multiple times for a single UI action, so this results in significantly fewer - writes being performed. - -### Fixed - -* Adding an unmanaged object to a Realm that was declared with - `@StateRealmObject` would throw the exception `"Cannot add an object with - observers to a Realm"`. -* The `RealmCollectionChange` docs refered to indicies in modifications as the - 'new' collection. This is incorrect and the docs now state that modifications - refer to the previous version of the collection. ([Cocoa #7390](https://github.com/realm/realm-swift/issues/7390)) -* Fix crash in `RLMSyncConfiguration.initWithUser` error mapping when a user is disabled/deleted from MongoDB Realm dashboard. - ([Cocoa #7399](https://github.com/realm/realm-swift/issues/7399), since v10.0.0) -* If the application crashed at the wrong point when logging a user in, the - next run of the application could hit the assertion failure "m_state == - SyncUser::State::LoggedIn" when a synchronized Realm is opened with that - user. ([Core #4875](https://github.com/realm/realm-core/issues/4875), since v10.0.0) -* The `keyPaths:` parameter to `@ObservedResults` did not work (since v10.12.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 5. - -### Internal - -* Upgraded realm-core from 11.3.1 to 11.4.1 - -10.14.0 Release notes (2021-09-03) -============================================================= - -### Enhancements - -* Add additional `observe` methods for Objects and RealmCollections which take - a `PartialKeyPath` type key path parameter. -* The release package once again contains Xcode 13 binaries. -* `PersistableEnum` properties can now be indexed or used as the primary key if - the RawValue is an indexable or primary key type. - -### Fixed - -* `Map` did not conform to `Codable`. - ([Cocoa #7418](https://github.com/realm/realm-swift/pull/7418), since v10.8.0) -* Fixed "Invalid data type" assertion failure in the sync client when the - client recieved an AddColumn instruction from the server for an AnyRealmValue - property when that property already exists locally. ([Core #4873](https://github.com/realm/realm-core/issues/4873), since v10.8.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 5. - -### Internal - -* Upgraded realm-core from 11.3.0 to 11.3.1. - -10.13.0 Release notes (2021-08-26) -============================================================= - -### Enhancements - -* Sync logs now contain information about what object/changeset was being applied when the exception was thrown. - ([Core #4836](https://github.com/realm/realm-core/issues/4836)) -* Added ServiceErrorCode for wrong username/password when using '`App.login`. - ([Core #7380](https://github.com/realm/realm-swift/issues/7380) - -### Fixed - -* Fix crash in `MongoCollection.findOneDocument(filter:)` that occurred when no results were - found for a given filter. - ([Cocoa #7380](https://github.com/realm/realm-swift/issues/7380), since v10.0.0) -* Some of the SwiftUI property wrappers incorrectly required objects to conform - to ObjectKeyIdentifiable rather than Identifiable. - ([Cocoa #7372](https://github.com/realm/realm-swift/issues/7372), since v10.6.0) -* Work around Xcode 13 beta 3+ shipping a broken swiftinterface file for Combine on 32-bit iOS. - ([Cocoa #7368](https://github.com/realm/realm-swift/issues/7368)) -* Fixes history corruption when replacing an embedded object in a list. - ([Core #4845](https://github.com/realm/realm-core/issues/4845)), since v10.0.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 5. - -### Internal - -* Upgraded realm-core from 11.2.0 to 11.3.0 - -10.12.0 Release notes (2021-08-03) -============================================================= - -### Enhancements - -* `Object.observe()` and `RealmCollection.observe()` now include an optional - `keyPaths` parameter which filters change notifications to those only - occurring on the provided key path or key paths. See method documentation - for extended detail on filtering behavior. -* `ObservedResults` now includes an optional `keyPaths` parameter - which filters change notifications to those only occurring on the provided - key path or key paths. ex) `@ObservedResults(MyObject.self, keyPaths: ["myList.property"])` -* Add two new property wrappers for opening a Realm asynchronously in a - SwiftUI View: - - `AsyncOpen` is a property wrapper that initiates Realm.asyncOpen - for the current user, notifying the view when there is a change in Realm asyncOpen state. - - `AutoOpen` behaves similarly to `AsyncOpen`, but in the case of no internet - connection this will return an opened realm. -* Add `EnvironmentValues.partitionValue`. This value can be injected into any view using one of - our new property wrappers `AsyncOpen` and `AutoOpen`: - `MyView().environment(\.partitionValue, "partitionValue")`. -* Shift more of the work done when first initializing a collection notifier to - the background worker thread rather than doing it on the main thread. - -### Fixed - -* `configuration(partitionValue: AnyBSON)` would always set a nil partition value - for the user sync configuration. -* Decoding a `@Persisted` property would incorrectly throw a `DecodingError.keyNotFound` - for an optional property if the key is missing. - ([Cocoa #7358](https://github.com/realm/realm-swift/issues/7358), since v10.10.0) -* Fixed a symlink which prevented Realm from building on case sensitive file systems. - ([#7344](https://github.com/realm/realm-swift/issues/7344), since v10.8.0) -* Removing a change callback from a Results would sometimes block the calling - thread while the query for that Results was running on the background worker - thread (since v10.11.0). -* Object observers did not handle the object being deleted properly, which - could result in assertion failures mentioning "m_table" in ObjectNotifier - ([Core #4824](https://github.com/realm/realm-core/issues/4824), since v10.11.0). -* Fixed a crash when delivering notifications over a nested hierarchy of lists - of Mixed that contain links. ([Core #4803](https://github.com/realm/realm-core/issues/4803), since v10.8.0) -* Fixed a crash when an object which is linked to by a Mixed is deleted via - sync. ([Core #4828](https://github.com/realm/realm-core/pull/4828), since v10.8.0) -* Fixed a rare crash when setting a mixed link for the first time which would - trigger if the link was to the same table and adding the backlink column - caused a BPNode split. ([Core #4828](https://github.com/realm/realm-core/pull/4828), since v10.8.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 4. On iOS Xcode 13 beta 2 is the latest supported - version due to betas 3 and 4 having a broken Combine.framework. - -### Internal - -* Upgraded realm-core from v11.1.1 to v11.2.0 - -10.11.0 Release notes (2021-07-22) -============================================================= - -### Enhancements - -* Add type safe methods for: - - `RealmCollection.min(of:)` - - `RealmCollection.max(of:)` - - `RealmCollection.average(of:)` - - `RealmCollection.sum(of:)` - - `RealmCollection.sorted(by:ascending:)` - - `RealmKeyedCollection.min(of:)` - - `RealmKeyedCollection.max(of:)` - - `RealmKeyedCollection.average(of:)` - - `RealmKeyedCollection.sum(of:)` - - `RealmKeyedCollection.sorted(by:ascending:)` - - `Results.distinct(by:)` - - `SortDescriptor(keyPath:ascending:) - - Calling these methods can now be done via Swift keyPaths, like so: - ```swift - class Person: Object { - @Persisted var name: String - @Persisted var age: Int - } - - let persons = realm.objects(Person.self) - persons.min(of: \.age) - persons.max(of: \.age) - persons.average(of: \.age) - persons.sum(of: \.age) - persons.sorted(by: \.age) - persons.sorted(by: [SortDescriptor(keyPath: \Person.age)]) - persons.distinct(by: [\Person.age]) - ``` -* Add `List.objects(at indexes:)` in Swift and `[RLMCollection objectsAtIndexes:]` in Objective-C. - This allows you to select elements in a collection with a given IndexSet ([#7298](https://github.com/realm/realm-swift/issues/7298)). -* Add `App.emailPasswordAuth.retryCustomConfirmation(email:completion:)` and `[App.emailPasswordAuth retryCustomConfirmation:completion:]`. - These functions support retrying a [custom confirmation](https://docs.mongodb.com/realm/authentication/email-password/#run-a-confirmation-function) function. -* Improve performance of creating collection notifiers for Realms with a complex schema. - This means that the first run of a query or first call to observe() on a collection will - do significantly less work on the calling thread. -* Improve performance of calculating changesets for notifications, particularly - for deeply nested object graphs and objects which have List or Set properties - with small numbers of objects in the collection. - -### Fixed - -* `RealmProperty` would crash when decoding a `null` json value. - ([Cocoa #7323](https://github.com/realm/realm-swift/issues/7323), since v10.8.0) -* `@Persisted` would crash when decoding a `null` value. - ([#7332](https://github.com/realm/realm-swift/issues/7332), since v10.10.0). -* Fixed an issue where `Realm.Configuration` would be set after views have been laid out - when using `.environment(\.realmConfiguration, ...)` in SwiftUI. This would cause issues if you are - required to bump your schema version and are using `@ObservedResults`. -* Sync user profiles now correctly persist between runs. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 3. Note that this release does not contain Xcode 13 - beta binaries as beta 3 does not include a working version of - Combine.framework for iOS. - -### Internal - -* Upgraded realm-core from 11.0.4 to 11.1.1 - -10.10.0 Release notes (2021-07-07) -============================================================= - -### Enhancements - -* Add a new property wrapper-based declaration syntax for properties on Realm - Swift object classes. Rather than using `@objc dynamic` or the - `RealmProperty` wrapper type, properties can now be declared with `@Persisted - var property: T`, where `T` is any of the supported property types, including - optional numbers and collections. This has a few benefits: - - - All property types are now declared in the same way. No more remembering - that this type requires `@objc dynamic var` while this other type - requires `let`, and the `RealmProperty` or `RealmOptional` helper is no - longer needed for types not supported by Objective-C. - - No more overriding class methods like `primaryKey()`, - `indexedProperties()` or `ignoredProperties()`. The primary key and - indexed flags are set directly in the property declaration with - `@Persisted(primaryKey: true) var _id: ObjectId` or `@Persisted(indexed: - true) var indexedProperty: Int`. If any `@Persisted` properties are present, - all other properties are implicitly ignored. - - Some performance problems have been fixed. Declaring collection - properties as `let listProp = List()` resulted in the `List` object - being created eagerly when the parent object is read, which could cause - performance problems if a class has a large number of `List` or - `RealmOptional` properties. `@Persisted var list: List` allows us to - defer creating the `List` until it's accessed, improving performance - when looping over objects and using only some of the properties. - - Similarly, `let _id = ObjectId.generate()` was a convenient way to - declare a sync-compatible primary key, but resulted in new ObjectIds - being generated in some scenarios where the value would never actually be - used. `@Persisted var _id: ObjectId` has the same behavior of - automatically generating primary keys, but allows us to only generate it - when actually needed. - - More types of enums are supported. Any `RawRepresentable` enum whose raw - type is a type supported by Realm can be stored in an `@Persisted` - project, rather than just `@objc` enums. Enums must be declared as - conforming to the `PersistableEnum` protocol, and still cannot (yet) be - used in collections. - - `willSet` and `didSet` can be used with `@Persistable` properties, while - they previously did not work on managed Realm objects. - - While we expect the switch to the new syntax to be very simple for most - users, we plan to support the existing objc-based declaration syntax for the - foreseeable future. The new style and old style cannot be mixed within a - single class, but new classes can use the new syntax while existing classes - continue to use the old syntax. Updating an existing class to the new syntax - does not change what data is stored in the Realm file and so does not require - a migration (as long as you don't also change the schema in the process, of - course). -* Add `Map.merge()`, which adds the key-value pairs from another Map or - Dictionary to the map. -* Add `Map.asKeyValueSequence()` which returns an adaptor that can be used with - generic functions that operate on Dictionary-styled sequences. - -### Fixed -* AnyRealmValue enum values are now supported in more places when creating - objects. -* Declaring a property as `RealmProperty` will now report an - error during schema discovery rather than doing broken things when the - property is used. -* Observing the `invalidated` property of `RLMDictionary`/`Map` via KVO did not - set old/new values correctly in the notification (since 10.8.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 2. - -10.9.0 Release notes (2021-07-01) -============================================================= - -### Enhancements - -* Add `App.emailPasswordAuth.retryCustomConfirmation(email:completion:)` and - `[App.emailPasswordAuth retryCustomConfirmation:completion:]`. These - functions support retrying a [custom confirmation](https://docs.mongodb.com/realm/authentication/email-password/#run-a-confirmation-function) - function. -* Improve performance of many Dictionary operations, especially when KVO is being used. - -### Fixed - -* Calling `-[RLMRealm deleteObjects:]` on a `RLMDictionary` cleared the - dictionary but did not actually delete the objects in the dictionary (since v10.8.0). -* Rix an assertion failure when observing a `List` contains - object links. ([Core #4767](https://github.com/realm/realm-core/issues/4767), since v10.8.0) -* Fix an assertion failure when observing a `RLMDictionary`/`Map` which links - to an object which was deleting by a different sync client. - ([Core #4770](https://github.com/realm/realm-core/pull/4770), since v10.8.0) -* Fix an endless recursive loop that could cause a stack overflow when - computing changes on a set of objects which contained cycles. - ([Core #4770](https://github.com/realm/realm-core/pull/4770), since v10.8.0). -* Hash collisions in dictionaries were not handled properly. - ([Core #4776](https://github.com/realm/realm-core/issues/4776), since v10.8.0). -* Fix a crash after clearing a list or set of AnyRealmValue containing links to - objects ([Core #4774](https://github.com/realm/realm-core/issues/4774), since v10.8.0) -* Trying to refresh a user token which had been revoked by an admin lead to an - infinite loop and then a crash. This situation now properly logs the user out - and reports an error. ([Core #4745](https://github.com/realm/realm-core/issues/4745), since v10.0.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 2. - -### Internal - -* Upgraded realm-core from v11.0.3 to v11.0.4 - -10.8.1 Release notes (2021-06-22) -============================================================= - -### Enhancements - -* Update Xcode 12.5 to Xcode 12.5.1. -* Create fewer dynamic classes at runtime, improving memory usage and startup time slightly. - -### Fixed - -* Importing the Realm swift package produced several warnings about excluded - files not existing. Note that one warning will still remain after this change. - ([#7295](https://github.com/realm/realm-swift/issues/7295), since v10.8.0). -* Update the root URL for the API docs so that the links go to the place where - new versions of the docs are being published. - ([#7299](https://github.com/realm/realm-swift/issues/7299), since v10.6.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. Note that this version of Realm Studio has not - yet been released at the time of this release. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 1. - -10.8.0 Release notes (2021-06-14) -============================================================= - -NOTE: This version upgrades the Realm file format version to add support for -the new data types and to adjust how primary keys are handled. Realm files -opened will be automatically upgraded and cannot be read by versions older than -v10.8.0. This upgrade should be a fairly fast one. Note that we now -automatically create a backup of the pre-upgrade Realm. - -### Enhancements - -* Add support for the `UUID` and `NSUUID` data types. These types can be used - for the primary key property of Object classes. -* Add two new collection types to complement the existing `RLMArray`/`List` type: - - `RLMSet` in Objective-C and `MutableSet` in Swift are mutable - unordered collections of distinct objects, similar to the built-in - `NSMutableSet` and `Set`. The values in a set may be any non-collection - type which can be stored as a Realm property. Sets are guaranteed to never - contain two objects which compare equal to each other, including when - conflicting writes are merged by sync. - - `RLMDictionary` in Objective-C and `Map` are - mutable key-value dictionaries, similar to the built-in - `NSMutableDictionary` and `Dictionary`. The values in a dictionary may be - any non-collection type which can be stored as a Realm property. The keys - must currently always be a string. -* Add support for dynamically typed properties which can store a value of any - of the non-collection types supported by Realm, including Object subclasses - (but not EmbeddedObject subclasses). These are declared with - `@property id propertyName;` in Objective-C and - `let propertyName = RealmProperty()` in Swift. - -### Fixed - -* Setting a collection with a nullable value type to null via one of the - dynamic interfaces would hit an assertion failure instead of clearing the - collection. -* Fixed an incorrect detection of multiple incoming links in a migration when - changing a table to embedded and removing a link to it at the same time. - ([#4694](https://github.com/realm/realm-core/issues/4694) since v10.0.0-beta.2) -* Fixed a divergent merge on Set when one client clears the Set and another - client inserts and deletes objects. - ([#4720](https://github.com/realm/realm-core/issues/4720)) -* Partially revert to pre-v5.0.0 handling of primary keys to fix a performance - regression. v5.0.0 made primary keys determine the position in the low-level - table where newly added objects would be inserted, which eliminated the need - for a separate index on the primary key. This made some use patterns slightly - faster, but also made some reasonable things dramatically slower. - ([#4522](https://github.com/realm/realm-core/issues/4522)) -* Fixed an incorrect detection of multiple incoming links in a migration when - changing a table to embedded and removing a link to it at the same time. - ([#4694](https://github.com/realm/realm-core/issues/4694) since v10.0.0-beta.2) -* Fix collection notification reporting for modifications. This could be - observed by receiving the wrong indices of modifications on sorted or - distinct results, or notification blocks sometimes not being called when only - modifications have occured. - ([#4573](https://github.com/realm/realm-core/pull/4573) since v5.0.0). -* Fix incorrect sync instruction emission when replacing an existing embedded - object with another embedded object.([Core #4740](https://github.com/realm/realm-core/issues/4740) - -### Deprecations - -* `RealmOptional` has been deprecated in favor of `RealmProperty`. - `RealmProperty` is functionality identical to `RealmOptional` when storing - optional numeric types, but can also store the new `AnyRealmValue` type. - -### Compatibility - -* Realm Studio: 11.0.0 or later. Note that this version of Realm Studio has not - yet been released at the time of this release. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 1. - -### Internal - -* Upgraded realm-core from v10.7.2 to v11.0.3 - -10.8.0-beta.2 Release notes (2021-06-01) -============================================================= - -### Enhancements - -* Add `RLMDictionary`/`Map<>` datatype. This is a Dictionary collection type used for storing key-value pairs in a collection. - -### Compatibility - -* Realm Studio: 11.0.0-beta.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v11.0.0-beta.4 to v11.0.0-beta.6 - -10.8.0-beta.0 Release notes (2021-05-07) -============================================================= - -### Enhancements - -* Add `RLMSet`/`MutableSet<>` datatype. This is a Set collection type used for storing distinct values in a collection. -* Add support for `id`/`AnyRealmValue`. -* Add support for `UUID`/`NSUUID` data type. - -### Fixed - -* None. - -### Deprecations - -* `RealmOptional` has been deprecated in favor of `RealmProperty`. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.7.2 to v10.8.0-beta.5 - -10.7.7 Release notes (2021-06-10) -============================================================= - -Xcode 12.2 is now the minimum supported version. - -### Enhancements - -* Add Xcode 13 beta 1 binaries to the release package. - -### Fixed - -* Fix a runtime crash which happens in some Xcode version (Xcode < 12, reported - in Xcode 12.5), where SwiftUI is not weak linked by default. This fix only - works for Cocoapods projects. - ([#7234](https://github.com/realm/realm-swift/issues/7234) -* Fix warnings when building with Xcode 13 beta 1. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 1. - -10.7.6 Release notes (2021-05-13) -============================================================= - -### Enhancements - -* Realms opened in read-only mode can now be invalidated (although it is - unlikely to be useful to do so). - -### Fixed - -* Fix an availability warning when building Realm. The code path which gave the - warning can not currently be hit, so this did not cause any runtime problems - ([#7219](https://github.com/realm/realm-swift/issues/7219), since 10.7.3). -* Proactively check the expiry time on the access token and refresh it before - attempting to initiate a sync session. This prevents some error logs from - appearing on the client such as: "ERROR: Connection[1]: Websocket: Expected - HTTP response 101 Switching Protocols, but received: HTTP/1.1 401 - Unauthorized" ([RCORE-473](https://jira.mongodb.org/browse/RCORE-473), since v10.0.0) -* Fix a race condition which could result in a skipping notifications failing - to skip if several commits using notification skipping were made in - succession (since v5.0.0). -* Fix a crash on exit inside TableRecycler which could happen if Realms were - open on background threads when the app exited. - ([Core #4600](https://github.com/realm/realm-core/issues/4600), since v5.0.0) -* Fix errors related to "uncaught exception in notifier thread: - N5realm11KeyNotFoundE: No such object" which could happen on sycnronized - Realms if a linked object was deleted by another client. - ([JS #3611](https://github.com/realm/realm-js/issues/3611), since v10.0.0). -* Reading a link to an object which has been deleted by a different client via - a string-based interface (such as value(forKey:) or the subscript operator on - DynamicObject) could return an invalid object rather than nil. - ([Core #4687](https://github.com/realm/realm-core/pull/4687), since v10.0.0) -* Recreate the sync metadata Realm if the encryption key for it is missing from - the keychain rather than crashing. This can happen if a device is restored - from an unencrypted backup, which restores app data but not the app's - keychain entries, and results in all cached logics for sync users being - discarded but no data being lost. - [Core #4285](https://github.com/realm/realm-core/pull/4285) -* Thread-safe references can now be created for read-only Realms. - ([#5475](https://github.com/realm/realm-swift/issues/5475)). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.6.0 to v10.7.2 - -10.7.5 Release notes (2021-05-07) -============================================================= - -### Fixed - -* Iterating over frozen collections on multiple threads at the same time could - throw a "count underflow" NSInternalInconsistencyException. - ([#7237](https://github.com/realm/realm-swift/issues/7237), since v5.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. - -10.7.4 Release notes (2021-04-26) -============================================================= - -### Enhancements - -* Add Xcode 12.5 binaries to the release package. - -### Fixed - -* Add the Info.plist file to the XCFrameworks in the Carthage xcframwork - package ([#7216](https://github.com/realm/realm-swift/issues/7216), since 10.7.3). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. - -10.7.3 Release notes (2021-04-22) -============================================================= - -### Enhancements - -* Package a prebuilt XCFramework for Carthage. Carthage 0.38 and later will - download this instead of the old frameworks when using `--use-xcframeworks`. -* We now make a backup of the realm file prior to any file format upgrade. The - backup is retained for 3 months. Backups from before a file format upgrade - allows for better analysis of any upgrade failure. We also restore a backup, - if a) an attempt is made to open a realm file whith a "future" file format - and b) a backup file exist that fits the current file format. - ([Core #4166](https://github.com/realm/realm-core/pull/4166)) -* The error message when the intial steps of opening a Realm file fails is now - more descriptive. -* Make conversion of Decimal128 to/from string work for numbers with more than - 19 significant digits. This means that Decimal128's initializer which takes a - string will now never throw, as it previously threw only for out-of-bounds - values. The initializer is still marked as `throws` for - backwards compatibility. - ([#4548](https://github.com/realm/realm-core/issues/4548)) - -### Fixed - -* Adjust the header paths for the podspec to avoid accidentally finding a file - which isn't part of the pod that produced warnings when importing the - framework. ([#7113](https://github.com/realm/realm-swift/issues/7113), since 10.5.2). -* Fixed a crash that would occur when observing unmanaged Objects in multiple - views in SwiftUI. When using `@StateRealmObject` or `@ObservedObject` across - multiple views with an unmanaged object, each view would subscribe to the - object. As each view unsubscribed (generally when trailing back through the - view stack), our propertyWrappers would attempt to remove the KVOs for each - cancellation, when it should only be done once. We now correctly remove KVOs - only once. ([#7131](https://github.com/realm/realm-swift/issues/7131)) -* Fixed `isInvalidated` not returning correct value after object deletion from - Realm when using a custom schema. The object's Object Schema was not updated - when the object was added to the realm. We now correctly update the object - schema when adding it to the realm. - ([#7181](https://github.com/realm/realm-swift/issues/7181)) -* Syncing large Decimal128 values would cause "Assertion failed: cx.w[1] == 0" - ([Core #4519](https://github.com/realm/realm-core/issues/4519), since v10.0.0). -* Potential/unconfirmed fix for crashes associated with failure to memory map - (low on memory, low on virtual address space). For example - ([#4514](https://github.com/realm/realm-core/issues/4514), since v5.0.0). -* Fix assertion failures such as "!m_notifier_skip_version.version" or - "m_notifier_sg->get_version() + 1 == new_version.version" when performing - writes inside change notification callbacks. Previously refreshing the Realm - by beginning a write transaction would skip delivering notifications, leaving - things in an inconsistent state. Notifications are now delivered recursively - when needed instead. ([Cocoa #7165](https://github.com/realm/realm-swift/issues/7165)). -* Fix collection notification reporting for modifications. This could be - observed by receiving the wrong indices of modifications on sorted or - distinct results, or notification blocks sometimes not being called when only - modifications have occured. - ([#4573](https://github.com/realm/realm-core/pull/4573) since v5.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.5.5 to v10.6.0 -* Add additional debug validation to file map management that will hopefully - catch cases where we unmap something which is still in use. - -10.7.2 Release notes (2021-03-08) -============================================================= - -### Fixed - -* During integration of a large amount of data from the server, you may get - "Assertion failed: !fields.has_missing_parent_update()" - ([Core #4497](https://github.com/realm/realm-core/issues/4497), since v6.0.0) - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.5.4 to v10.5.5 - -10.7.1 Release notes (2021-03-05) -============================================================= - -### Fixed - -* Queries of the form "a.b.c == nil" would match objects where `b` is `nil` if - `c` did not have an index and did not if `c` was indexed. Both will now match - to align with NSPredicate's behavior. ([Core #4460]https://github.com/realm/realm-core/pull/4460), since 4.3.0). -* Restore support for upgrading files from file format 5 (Realm Cocoa 1.x). - ([Core #7089](https://github.com/realm/realm-swift/issues/7089), since v5.0.0) -* On 32bit devices you may get exception with "No such object" when upgrading - to v10.* ([Java #7314](https://github.com/realm/realm-java/issues/7314), since v5.0.0) -* The notification worker thread would rerun queries after every commit rather - than only commits which modified tables which could effect the query results - if the table had any outgoing links to tables not used in the query. - ([Core #4456](https://github.com/realm/realm-core/pull/4456), since v5.0.0). -* Fix "Invalid ref translation entry [16045690984833335023, 78187493520]" - assertion failure which could occur when using sync or multiple processes - writing to a single Realm file. - ([#7086](https://github.com/realm/realm-swift/issues/7086), since v5.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.5.3 to v10.5.4 - -10.7.0 Release notes (2021-02-23) -============================================================= - -### Enhancements - -* Add support for some missing query operations on data propertys: - - Data properties can be compared to other data properties - (e.g. "dataProperty1 == dataProperty2"). - - Case and diacritic-insensitive queries can be performed on data properties. - This will only have meaningful results if the data property contains UTF-8 - string data. - - Data properties on linked objects can be queried - (e.g. "link.dataProperty CONTAINS %@") -* Implement queries which filter on lists other than object links (lists of - objects were already supported). All supported operators for normal - properties are now supported for lists (e.g. "ANY intList = 5" or "ANY - stringList BEGINSWITH 'prefix'"), as well as aggregate operations on the - lists (such as "intArray.@sum > 100"). -* Performance of sorting on more than one property has been improved. - Especially important if many elements match on the first property. Mitigates - ([#7092](https://github.com/realm/realm-swift/issues/7092)) - -### Fixed - -* Fixed a bug that prevented an object type with incoming links from being - marked as embedded during migrations. ([Core #4414](https://github.com/realm/realm-core/pull/4414)) -* The Realm notification listener thread could sometimes hit the assertion - failure "!skip_version.version" if a write transaction was committed at a - very specific time (since v10.5.0). -* Added workaround for a case where upgrading an old file with illegal string - would crash ([#7111](https://github.com/realm/realm-swift/issues/7111)) -* Fixed a conflict resolution bug related to the ArrayMove instruction, which - could sometimes cause an "Invalid prior_size" exception to prevent - synchronization (since v10.5.0). -* Skipping a change notification in the first write transaction after the - observer was added could potentially fail to skip the notification (since v10.5.1). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.5.0 to v10.5.3 - -10.6.0 Release notes (2021-02-15) -============================================================= - -### Enhancements - -* Add `@StateRealmObject` for SwiftUI support. This property wrapper type instantiates an observable object on a View. - Use in place of `SwiftUI.StateObject` for Realm `Object`, `List`, and `EmbeddedObject` types. -* Add `@ObservedRealmObject` for SwiftUI support. This property wrapper type subscribes to an observable object - and invalidates a view whenever the observable object changes. Use in place of `SwiftUI.ObservedObject` for - Realm `Object`, `List`, or `EmbeddedObject` types. -* Add `@ObservedResults` for SwiftUI support. This property wrapper type retrieves results from a Realm. - The results use the realm configuration provided by the environment value `EnvironmentValues.realmConfiguration`. -* Add `EnvironmentValues.realm` and `EnvironmentValues.realmConfiguration` for `Realm` - and `Realm.Configuration` types respectively. Values can be injected into views using the `View.environment` method, e.g., `MyView().environment(\.realmConfiguration, Realm.Configuration(fileURL: URL(fileURLWithPath: "myRealmPath.realm")))`. - The value can then be declared on the example `MyView` as `@Environment(\.realm) var realm`. -* Add `SwiftUI.Binding` extensions where `Value` is of type `Object`, `List`, or `EmbeddedObject`. - These extensions expose methods for wrapped write transactions, to avoid boilerplate within - views, e.g., `TextField("name", $personObject.name)` or `$personList.append(Person())`. -* Add `Object.bind` and `EmbeddedObject.bind` for SwiftUI support. This allows you to create - bindings of realm properties when a propertyWrapper is not available for you to do so, e.g., `TextField("name", personObject.bind(\.name))`. -* The Sync client now logs error messages received from server rather than just - the size of the error message. -* Errors returned from the server when sync WebSockets get closed are now - captured and surfaced as a SyncError. -* Improve performance of sequential reads on a Results backed directly by a - Table (i.e. `realm.object(ClasSName.self)` with no filter/sort/etc.) by 50x. -* Orphaned embedded object types which are not linked to by any top-level types - are now better handled. Previously the server would reject the schema, - resulting in delayed and confusing error reporting. Explicitly including an - orphan in `objectTypes` is now immediately reported as an error when opening - the Realm, and orphans are automatically excluded from the auto-discovered - schema when `objectTypes` is not specified. - -### Fixed - -* Reading from a Results backed directly by a Table (i.e. - `realm.object(ClasSName.self)` with no filter/sort/etc.) would give incorrect - results if the Results was constructed and accessed before creating a new - object with a primary key less than the smallest primary key which previously - existed. ([#7014](https://github.com/realm/realm-swift/issues/7014), since v5.0.0). -* During synchronization you might experience crash with - "Assertion failed: ref + size <= next->first". - ([Core #4388](https://github.com/realm/realm-core/issues/4388)) - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.4.0 to v10.5.0 - -10.5.2 Release notes (2021-02-09) -============================================================= - -### Enhancements - -* Add support for "thawing" objects. `Realm`, `Results`, `List` and `Object` - now have `thaw()` methods which return a live copy of the frozen object. This - enables app behvaior where a frozen object can be made live again in order to - mutate values. For example, first freezing an object passed into UI view, - then thawing the object in the view to update values. -* Add Xcode 12.4 binaries to the release package. - -### Fixed - -* Inserting a date into a synced collection via `AnyBSON.datetime(...)` would - be of type `Timestamp` and not `Date`. This could break synced objects with a - `Date` property. - ([#6654](https://github.com/realm/realm-swift/issues/6654), since v10.0.0). -* Fixed an issue where creating an object after file format upgrade may fail - with assertion "Assertion failed: lo() <= std::numeric_limits::max()" - ([#4295](https://github.com/realm/realm-core/issues/4295), since v5.0.0) -* Allow enumerating objects in migrations with types which are no longer - present in the schema. -* Add `RLMResponse.customStatusCode`. This fixes timeout exceptions that were - occurring with a poor connection. ([#4188](https://github.com/realm/realm-core/issues/4188)) -* Limit availability of ObjectKeyIdentifiable to platforms which support - Combine to match the change made in the Xcode 12.5 SDK. - ([#7083](https://github.com/realm/realm-swift/issues/7083)) - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.3.3 to v10.4.0 - -10.5.1 Release notes (2021-01-15) -============================================================= - -### Enhancements - -* Add Xcode 12.3 binary to release package. -* Add support for queries which have nil on the left side and a keypath on the - right side (e.g. "nil == name" rather than "name == nil" as was previously - required). - -### Fixed -* Timeouts when calling server functions via App would sometimes crash rather - than report an error. -* Fix a race condition which would lead to "uncaught exception in notifier - thread: N5realm15InvalidTableRefE: transaction_ended" and a crash when the - source Realm was closed or invalidated at a very specific time during the - first run of a collection notifier - ([#3761](https://github.com/realm/realm-core/issues/3761), since v5.0.0). -* Deleting and recreating objects with embedded objects may fail. - ([Core PR #4240](https://github.com/realm/realm-core/pull/4240), since v10.0.0) -* Fast-enumerating a List after deleting the parent object would crash with an - assertion failure rather than a more appropriate exception. - ([Core #4114](https://github.com/realm/realm-core/issues/4114), since v5.0.0). -* Fix an issue where calling a MongoDB Realm Function would never be performed as the reference to the weak `User` was lost. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.3. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.3.2 to v10.3.3 - -10.5.0 Release notes (2020-12-14) -============================================================= - -### Enhancements - -* MongoDB Realm is now supported when installing Realm via Swift Package Manager. - -### Fixed - -* The user identifier was added to the file path for synchronized Realms twice - and an extra level of escaping was performed on the partition value. This did - not cause functional problems, but made file names more confusing than they - needed to be. Existing Realm files will continue to be located at the old - path, while newly created files will be created at a shorter path. (Since v10.0.0). -* Fix a race condition which could potentially allow queries on frozen Realms - to access an uninitialized structure for search indexes (since v5.0.0). -* Fix several data races in App and SyncSession initialization. These could - possibly have caused strange errors the first time a synchronized Realm was - opened (since v10.0.0). -* Fix a use of a dangling reference when refreshing a user’s custom data that - could lead to a crash (since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.1.4 to v10.3.2 - -10.4.0 Release notes (2020-12-10) -============================================================= - -### Enhancements - -* Add Combine support for App and User. These two types now have a - `objectWillChange` property that emits each time the state of the object has - changed (such as due to the user logging in or out). ([PR #6977](https://github.com/realm/realm-swift/pull/6977)). - -### Fixed - -* Integrating changesets from the server would sometimes hit the assertion - failure "n != realm::npos" inside Table::create_object_with_primary_key() - when creating an object with a primary key which previously had been used and - had incoming links. ([Core PR #4180](https://github.com/realm/realm-core/pull/4180), since v10.0.0). -* The arm64 simulator slices were not actually included in the XCFramework - release package. ([PR #6982](https://github.com/realm/realm-swift/pull/6982), since v10.2.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.1.3 to v10.1.4 -* Upgraded realm-sync from v10.1.4 to v10.1.5 - -10.3.0 Release notes (2020-12-08) -============================================================= - -### Enhancements - -* Add Google OpenID Connect Credentials, an alternative login credential to the - Google OAuth 2.0 credential. - -### Fixed - -* Fixed a bug that would prevent eventual consistency during conflict - resolution. Affected clients would experience data divergence and potentially - consistency errors as a result if they experienced conflict resolution - between cycles of Create-Erase-Create for objects with primary keys (since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-sync from v10.1.3 to v10.1.4 - -10.2.0 Release notes (2020-12-02) -============================================================= - -### Enhancements - -* The prebuilt binaries are now packaged as XCFrameworks. This adds support for - Catalyst and arm64 simulators when using them to install Realm, removes the - need for the strip-frameworks build step, and should simplify installation. -* The support functionality for using the Objective C API from Swift is now - included in Realm Swift and now includes all of the required wrappers for - MongoDB Realm types. In mixed Objective C/Swift projects, we recommend - continuing to use the Objective C types, but import both Realm and RealmSwift - in your Swift files. - -### Fixed - -* The user identifier was added to the file path for synchronized Realms twice - and an extra level of escaping was performed on the partition value. This did - not cause functional problems, but made file names more confusing than they - needed to be. Existing Realm files will continue to be located at the old - path, while newly created files will be created at a shorter path. (Since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -10.1.4 Release notes (2020-11-16) -============================================================= - -### Enhancements - -* Add arm64 slices to the macOS builds. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.0.1 to v10.1.3 -* Upgraded realm-sync from v10.0.1 to v10.1.3 - -10.1.3 Release notes (2020-11-13) -============================================================= - -### Enhancements - -* Add Xcode 12.2 binaries to the release package. - -### Fixed - -* Disallow setting - `RLMRealmConfiguration.deleteRealmIfMigrationNeeded`/`Realm.Config.deleteRealmIfMigrationNeeded` - when sync is enabled. This did not actually work as it does not delete the - relevant server state and broke in confusing ways ([PR #6931](https://github.com/realm/realm-swift/pull/6931)). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.1. -* CocoaPods: 1.10 or later. - -10.1.2 Release notes (2020-11-06) -============================================================= - -### Enhancements - -* Some error states which previously threw a misleading "NoSuchTable" exception - now throw a more descriptive exception. - -### Fixed - -* One of the Swift packages did not have the minimum deployment target set, - resulting in errors when archiving an app which imported Realm via SPM. -* Reenable filelock emulation on watchOS so that the OS does not kill the app - when it is suspended while a Realm is open on watchOS 7 ([#6861](https://github.com/realm/realm-swift/issues/6861), since v5.4.8 -* Fix crash in case insensitive query on indexed string columns when nothing - matches ([#6836](https://github.com/realm/realm-swift/issues/6836), since v5.0.0). -* Null values in a `List` or `List` were incorrectly treated - as non-null in some places. It is unknown if this caused any functional - problems when using the public API. ([Core PR #3987](https://github.com/realm/realm-core/pull/3987), since v5.0.0). -* Deleting an entry in a list in two different clients could end deleting the - wrong entry in one client when the changes are merged (since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.1. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.0.0 to v10.1.1 -* Upgraded realm-sync from v10.0.0 to v10.1.1 - -10.1.1 Release notes (2020-10-27) -============================================================= - -### Enhancements - -* Set the minimum CocoaPods version in the podspec so that trying to install - with older versions gives a more useful error ([PR #6892](https://github.com/realm/realm-swift/pull/6892)). - -### Fixed - -* Embedded objects could not be marked as `ObjectKeyIdentifable` - ([PR #6890](https://github.com/realm/realm-swift/pull/6890), since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.1. -* CocoaPods: 1.10 or later. - -10.1.0 Release notes (2020-10-22) -============================================================= - -CocoaPods 1.10 or later is now required to install Realm. - -### Enhancements - -* Throw an exception for Objects that have none of its properties marked with @objc. -* Mac Catalyst and arm64 simulators are now supported when integrating via Cocoapods. -* Add Xcode 12.1 binaries to the release package. -* Add Combine support for `Realm.asyncOpen()`. - -### Fixed - -* Implement precise and unbatched notification of sync completion events. This - avoids a race condition where an earlier upload completion event will notify - a later waiter whose changes haven't been uploaded yet. - ([#1118](https://github.com/realm/realm-object-store/pull/1118)). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.1. - -10.0.0 Release notes (2020-10-16) -============================================================= - -This release is functionally identical to v10.0.0-rc.2. - -NOTE: This version upgrades the Realm file format version to add support for -new data types. Realm files opened will be automatically upgraded and cannot be -read by versions older than v10.0.0. - -### Breaking Changes - -* Rename Realm.Publishers to RealmPublishers to avoid confusion with Combine.Publishers. -* Remove `[RLMSyncManager shared]`. This is now instatiated as a property on App/RLMApp. -* `RLMSyncManager.pinnedCertificatePaths` has been removed. -* Classes `RLMUserAccountInfo` & `RLMUserInfo` (swift: `UserInfo`, `UserAccountInfo`) have been removed. -* `RLMSyncUser`/`SyncUser` has been renamed to `RLMUser`/`User`. -* We no longer support Realm Cloud (legacy), but instead the new "MongoDB - Realm" Cloud. MongoDB Realm is a serverless platform that enables developers - to quickly build applications without having to set up server infrastructure. - MongoDB Realm is built on top of MongoDB Atlas, automatically integrating the - connection to your database. -* Remove support for Query-based sync, including the configuration parameters - and the `RLMSyncSubscription` and `SyncSubscription` types ([#6437](https://github.com/realm/realm-swift/pull/6437)). -* Remove everything related to sync permissions, including both the path-based - permission system and the object-level privileges for query-based sync. - Permissions are now configured via MongoDB Atlas. - ([#6445](https://github.com/realm/realm-swift/pulls/6445)) -* Remove support for Realm Object Server. -* Non-embedded objects in synchronized Realms must always have a primary key - named "_id". -* All Swift callbacks for asynchronous operations which can fail are now passed - a `Result` parameter instead of two separate `Value?` and - `Error?` parameters. - -### Enhancements - -* Add support for next generation sync. Support for syncing to MongoDB instead - of Realm Object Server. Applications must be created at realm.mongodb.com -* The memory mapping scheme for Realm files has changed to better support - opening very large files. -* Add support for the ObjectId data type. This is an automatically-generated - unique identifier similar to a GUID or a UUID. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for the Decimal128 data type. This is a 128-bit IEEE 754 decimal - floating point number similar to NSDecimalNumber. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for embedded objects. Embedded objects are objects which are - owned by a single parent object, and are deleted when that parent object is - deleted. They are defined by subclassing `EmbeddedObject` / - `RLMEmbeddedObject` rather than `Object` / `RLMObject`. -* Add `-[RLMUser customData]`/`User.customData`. Custom data is - configured in your MongoDB Realm App. -* Add `-[RLMUser callFunctionNamed:arguments:completion:]`/`User.functions`. - This is the entry point for calling Remote MongoDB Realm functions. Functions - allow you to define and execute server-side logic for your application. - Functions are written in modern JavaScript (ES6+) and execute in a serverless - manner. When you call a function, you can dynamically access components of - the current application as well as information about the request to execute - the function and the logged in user that sent the request. -* Add `-[RLMUser mongoClientWithServiceName:]`/`User.mongoClient`. This is - the entry point for calling your Remote MongoDB Service. The read operations - are `-[RLMMongoCollection findWhere:completion:]`, `-[RLMMongoCollection - countWhere:completion:]`and `-[RLMMongoCollection - aggregateWithPipeline:completion:]`. The write operations are - `-[RLMMongoCollection insertOneDocument:completion:]`, `-[RLMMongoCollection - insertManyDocuments:completion:]`, `-[RLMMongoCollection - updateOneDocument:completion:]`, `-[RLMMongoCollection - updateManyDocuments:completion:]`, `-[RLMMongoCollection - deleteOneDocument:completion:]`, and `-[RLMMongoCollection - deleteManyDocuments:completion:]`. If you are already familiar with MongoDB - drivers, it is important to understand that the remote MongoCollection only - provides access to the operations available in MongoDB Realm. -* Obtaining a Realm configuration from a user is now done with `[RLMUser - configurationWithPartitionValue:]`/`User.configuration(partitionValue:)`. - Partition values can currently be of types `String`, `Int`, or `ObjectId`, - and fill a similar role to Realm URLs did with Realm Cloud. The main - difference is that partitions are meant to be more closely associated with - your data. For example, if you are running a `Dog` kennel, and have a field - `breed` that acts as your partition key, you could open up realms based on - the breed of the dogs. -* Add ability to stream change events on a remote MongoDB collection with - `[RLMMongoCollection watch:delegate:delegateQueue:]`, - `MongoCollection.watch(delegate:)`. When calling `watch(delegate:)` you will be - given a `RLMChangeStream` (`ChangeStream`) which can be used to end watching - by calling `close()`. Change events can also be streamed using the - `MongoCollection.watch` Combine publisher that will stream change events each - time the remote MongoDB collection is updated. -* Add the ability to listen for when a Watch Change Stream is opened when using - Combine. Use `onOpen(event:)` directly after opening a `WatchPublisher` to - register a callback to be invoked once the change stream is opened. -* Objects with integer primary keys no longer require a separate index for the -* primary key column, improving insert performance and slightly reducing file - size. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* Carthage release for Swift is built with Xcode 12 - -### Internal - -* Upgraded realm-core from v6.1.4 to v10.0.0 -* Upgraded realm-sync from v5.0.29 to v10.0.0 - -10.0.0-rc.2 Release notes (2020-10-15) -============================================================= - -### Enhancements - -* Add the ability to listen for when a Watch Change Stream is opened when using - Combine. Use `onOpen(event:)` directly after opening a `WatchPublisher` to - register a callback to be invoked once the change stream is opened. - -### Breaking Changes - -* The insert operations on Mongo collections now report the inserted documents' - IDs as BSON rather than ObjectId. -* Embedded objects can no longer form cycles at the schema level. For example, - type A can no longer have an object property of type A, or an object property - of type B if type B links to type A. This was always rejected by the server, - but previously was allowed in non-synchronized Realms. -* Primary key properties are once again marked as being indexed. This reflects - an internal change to how primary keys are handled that should not have any - other visible effects. -* Change paired return types from Swift completion handlers to return `Result`. -* Adjust how RealmSwift.Object is defined to add support for Swift Library - Evolution mode. This should normally not have any effect, but you may need to - add `override` to initializers of object subclasses. -* Add `.null` type to AnyBSON. This creates a distinction between null values - and properly absent BSON types. - -### Fixed - -* Set the precision correctly when serializing doubles in extended json. -* Reading the `objectTypes` array from a Realm Configuration would not include - the embedded object types which were set in the array. -* Reject loops in embedded objects as part of local schema validation rather - than as a server error. -* Although MongoClient is obtained from a User, it was actually using the - User's App's current user rather than the User it was obtained from to make - requests. - - -This release also contains the following changes from 5.4.7 - 5.5.0 - -### Enhancements - -* Add the ability to capture a NotificationToken when using a Combine publisher - that observes a Realm Object or Collection. The user will call - `saveToken(on:at:)` directly after invoking the publisher to use the feature. - -### Fixed - -* When using `Realm.write(withoutNotifying:)` there was a chance that the - supplied observation blocks would not be skipped when in a write transaction. - ([Object Store #1103](https://github.com/realm/realm-object-store/pull/1103)) -* Comparing two identical unmanaged `List<>`/`RLMArray` objects would fail. - ([#5665](https://github.com/realm/realm-swift/issues/5665)). -* Case-insensitive equality queries on indexed string properties failed to - clear some internal state when rerunning the query. This could manifest as - duplicate results or "key not found" errors. - ([#6830](https://github.com/realm/realm-swift/issues/6830), [#6694](https://github.com/realm/realm-swift/issues/6694), since 5.0.0). -* Equality queries on indexed string properties would sometimes throw "key not - found" exceptions if the hash of the string happened to have bit 62 set. - ([.NET #2025](https://github.com/realm/realm-dotnet/issues/2025), since v5.0.0). -* Queries comparing non-optional int properties to nil would behave as if they - were comparing against zero instead (since v5.0.0). - -### Compatibility - -* File format: Generates Realms with format v12 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v10.0.0-beta.9 to v10.0.0 -* Upgraded realm-sync from v10.0.0-beta.14 to v10.0.0 - -10.0.0-rc.1 Release notes (2020-10-01) -============================================================= - -### Breaking Changes - -* Change the following methods on RLMUser to properties: - - `[RLMUser emailPasswordAuth]` => `RLMUser.emailPasswordAuth` - - `[RLMUser identities]` => `RLMUser.identities` - - `[RLMUser allSessions]` => `RLMUser.allSessions` - - `[RLMUser apiKeysAuth]` => `RLMUser.apiKeysAuth` -* Other changes to RLMUser: - - `nullable` has been removed from `RLMUser.identifier` - - `nullable` has been removed from `RLMUser.customData` -* Change the following methods on RLMApp to properties: - - `[RLMApp allUsers]` => `RLMApp.allUsers` - - `[RLMApp currentUser]` => `RLMApp.currentUser` - - `[RLMApp emailPasswordAuth]` => `RLMApp.emailPasswordAuth` -* Define `RealmSwift.Credentials` as an enum instead of a `typealias`. Example - usage has changed from `Credentials(googleAuthCode: "token")` to - `Credentials.google(serverAuthCode: "serverAuthCode")`, and - `Credentials(facebookToken: "token")` to `Credentials.facebook(accessToken: "accessToken")`, etc. -* Remove error parameter and redefine payload in - `+ (instancetype)credentialsWithFunctionPayload:(NSDictionary *)payload error:(NSError **)error;`. - It is now defined as `+ (instancetype)credentialsWithFunctionPayload:(NSDictionary> *)payload;` - -### Compatibility - -* File format: Generates Realms with format v12 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12. - -10.0.0-beta.6 Release notes (2020-09-30) -============================================================= - -### Breaking Changes - -* Change Google Credential parameter names to better reflect the required auth code: - - `Credentials(googleToken:)` => `Credentials(googleAuthCode:)` - - `[RLMCredentials credentialsWithGoogleToken:]` => `[RLMCredentials credentialsWithGoogleAuthCode:]` -* Rename Realm.Publishers to RealmPublishers to avoid confusion with Combine.Publishers - -### Fixed - -* Deleting objects could sometimes change the ObjectId remaining objects from - null to ObjectId("deaddeaddeaddeaddeaddead") when there are more than 1000 - objects. (Since v10.0.0-alpha.1) -* Fixed an assertion failure when adding an index to a nullable ObjectId - property that contains nulls. (since v10.0.0-alpha.1). - -This release also contains the following changes from 5.4.0 - 5.4.6: - -### Enhancements - -* Add prebuilt binary for Xcode 11.7 to the release package. -* Add prebuilt binary for Xcode 12 to the release package. -* Improve the asymtotic performance of NOT IN queries on indexed properties. It - is now O(Number of Rows) rather than O(Number of Rows \* Number of values in IN clause.) -* Slightly (<5%) improve the performance of most operations which involve - reading from a Realm file. - -### Fixed - -* Upgrading pre-5.x files with string primary keys would result in a file where - `realm.object(ofType:forPrimaryKey:)` would fail to find the object. - ([#6716](https://github.com/realm/realm-swift/issues/6716), since 5.2.0) -* A write transaction which modifies an object with more than 16 managed - properties and causes the Realm file to grow larger than 2 GB could cause an - assertion failure mentioning "m_has_refs". ([JS #3194](https://github.com/realm/realm-js/issues/3194), since 5.0.0). -* Objects with more than 32 properties could corrupt the Realm file and result - in a variety of crashes. ([Java #7057](https://github.com/realm/realm-java/issues/7057), since 5.0.0). -* Fix deadlocks when opening a Realm file in both the iOS simulator and Realm - Studio ([#6743](https://github.com/realm/realm-swift/issues/6743), since 5.3.6). -* Fix Springboard deadlocking when an app is unsuspended while it has an open - Realm file which is stored in an app group on iOS 10-12 - ([#6749](https://github.com/realm/realm-swift/issues/6749), since 5.3.6). -* If you use encryption your application cound crash with a message like - "Opening Realm files of format version 0 is not supported by this version of - Realm". ([#6889](https://github.com/realm/realm-java/issues/6889) among others, since 5.0.0) -* Confining a Realm to a serial queue would throw an error claiming that the - queue was not a serial queue on iOS versions older than 12. - ([#6735](https://github.com/realm/realm-swift/issues/6735), since 5.0.0). -* Results would sometimes give stale results inside a write transaction if a - write which should have updated the Results was made before the first access - of a pre-existing Results object. - ([#6721](https://github.com/realm/realm-swift/issues/6721), since 5.0.0) -* Fix Archiving the Realm and RealmSwift frameworks with Xcode 12. - ([#6774](https://github.com/realm/realm-swift/issues/6774)) -* Fix compilation via Carthage when using Xcode 12 ([#6717](https://github.com/realm/realm-swift/issues/6717)). -* Fix a crash inside `realm::Array(Type)::init_from_mem()` which would - sometimes occur when running a query over links immediately after creating - objects of the queried type. - ([#6789](https://github.com/realm/realm-swift/issues/6789) and possibly others, since 5.0.0). -* Possibly fix problems when changing the type of the primary key of an object - from optional to non-optional. -* Rerunning a equality query on an indexed string property would give incorrect - results if a previous run of the query matched multiple objects and it now - matches one object. This could manifest as either finding a non-matching - object or a "key not found" exception being thrown. - ([#6536](https://github.com/realm/realm-swift/issues/6536), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v12 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v10.0.0-beta.7 to v10.0.0-beta.9 -* Upgraded realm-sync from v10.0.0-beta.11 to v10.0.0-beta.14 - -10.0.0-beta.5 Release notes (2020-09-15) -============================================================= - -### Enhancements - -* Add `User.loggedIn`. -* Add support for multiple Realm Apps. -* Remove `[RLMSyncManager shared]`. This is now instatiated as a property on - the app itself. -* Add Combine support for: - * PushClient - * APIKeyAuth - * User - * MongoCollection - * EmailPasswordAuth - * App.login - -### Fixed - -* Fix `MongoCollection.watch` to consistently deliver events on a given queue. -* Fix `[RLMUser logOutWithCompletion]` and `User.logOut` to now log out the - correct user. -* Fix crash on startup on iOS versions older than 13 (since v10.0.0-beta.3). - -### Breaking Changes - -* `RLMSyncManager.pinnedCertificatePaths` has been removed. -* Classes `RLMUserAccountInfo` & `RLMUserInfo` (swift: `UserInfo`, - `UserAccountInfo`) have been removed. -* The following functionality has been renamed to align Cocoa with the other - Realm SDKs: - -| Old API | New API | -|:-------------------------------------------------------------|:---------------------------------------------------------------| -| `RLMUser.identity` | `RLMUser.identifier` | -| `User.identity` | `User.id` | -| `-[RLMCredentials credentialsWithUsername:password:]` | `-[RLMCredentials credentialsWithEmail:password:]` | -| `Credentials(username:password:)` | `Credentials(email:password:)` | -| -`[RLMUser apiKeyAuth]` | `-[RLMUser apiKeysAuth]` | -| `User.apiKeyAuth()` | `User.apiKeysAuth()` | -| `-[RLMEmailPasswordAuth registerEmail:password:completion:]` | `-[RLMEmailPasswordAuth registerUserWithEmail:password:completion:]` | -| `App.emailPasswordAuth().registerEmail(email:password:)` | `App.emailPasswordAuth().registerUser(email:password:)` | - -### Compatibility - -* File format: Generates Realms with format v12 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v10.0.0-beta.6 to v10.0.0-beta.7 -* Upgraded realm-sync from v10.0.0-beta.10 to v10.0.0-beta.11 - -10.0.0-beta.4 Release notes (2020-08-28) -============================================================= - -### Enhancements - -* Add support for the 64-bit watchOS simulator added in Xcode 12. -* Add ability to stream change events on a remote MongoDB collection with - `[RLMMongoCollection watch:delegate:delegateQueue]`, - `MongoCollection.watch(delegate)`. When calling `watch(delegate)` you will be - given a `RLMChangeStream` (`ChangeStream`), this will be used to invalidate - and stop the streaming session by calling `[RLMChangeStream close]` - (`ChangeStream.close()`) when needed. -* Add `MongoCollection.watch`, which is a Combine publisher that will stream - change events each time the remote MongoDB collection is updated. -* Add ability to open a synced Realm with a `nil` partition value. - -### Fixed - -* Realm.Configuration.objectTypes now accepts embedded objects -* Ports fixes from 5.3.5 - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the v10.0.0-beta.x series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v10.0.0-beta.1 to v10.0.0-beta.6 -* Upgraded realm-sync from v10.0.0-beta.2 to v10.0.0-beta.10 - -10.0.0-beta.3 Release notes (2020-08-17) -============================================================= - -This release also contains all changes from 5.3.2. - -### Breaking Changes -* The following classes & aliases have been renamed to align Cocoa with the other Realm SDKs: - -| Old API | New API | -|:------------------------------------------------------------|:---------------------------------------------------------------| -| `RLMSyncUser` | `RLMUser` | -| `SyncUser` | `User` | -| `RLMAppCredential` | `RLMCredential` | -| `AppCredential` | `Credential` | -| `RealmApp` | `App` | -| `RLMUserAPIKeyProviderClient` | `RLMAPIKeyAuth` | -| `RLMUsernamePasswordProviderClient` | `RLMEmailPasswordAuth` | -| `UsernamePasswordProviderClient` | `EmailPasswordAuth` | -| `UserAPIKeyProviderClient` | `APIKeyAuth` | - -* The following functionality has also moved to the User - -| Old API | New API | -|:-------------------------------------------------------------|:--------------------------------------------------------------| -| `[RLMApp callFunctionNamed:]` | `[RLMUser callFunctionNamed:]` | -| `App.functions` | `User.functions` | -| `[RLMApp mongoClientWithServiceName:]` | `[RLMUser mongoClientWithServiceName:]` | -| `App.mongoClient(serviceName)` | `User.mongoClient(serviceName)` | -| `[RLMApp userAPIKeyProviderClient]` | `[RLMUser apiKeyAuth]` | -| `App.userAPIKeyProviderClient` | `App.apiKeyAuth()` | -| `[RLMApp logOut:]` | `[RLMUser logOut]` | -| `App.logOut(user)` | `User.logOut()` | -| `[RLMApp removeUser:]` | `[RLMUser remove]` | -| `App.remove(user)` | `User.remove()` | -| `[RLMApp linkUser:credentials:]` | `[RLMUser linkWithCredentials:]` | -| `App.linkUser(user, credentials)` | `User.link(credentials)` | - -* `refreshCustomData()` on User now returns void and passes the custom data to the callback on success. - -### Compatibility -* This release introduces breaking changes w.r.t some sync classes and MongoDB Realm Cloud functionality. -(See the breaking changes section for the full list) -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* Carthage release for Swift is built with Xcode 11.5. - -10.0.0-beta.2 Release notes (2020-06-09) -============================================================= -Xcode 11.3 and iOS 9 are now the minimum supported versions. - -### Enhancements -* Add support for building with Xcode 12 beta 1. watchOS currently requires - removing x86_64 from the supported architectures. Support for the new 64-bit - watch simulator will come in a future release. - -### Fixed -* Opening a SyncSession with LOCAL app deployments would not use the correct endpoints. -* Linking from embedded objects to top-level objects was incorrectly disallowed. -* Opening a Realm file in file format v6 (created by Realm Cocoa versions - between 2.4 and 2.10) would crash. (Since 5.0.0, [Core #3764](https://github.com/realm/realm-core/issues/3764)). -* Upgrading v9 (pre-5.0) Realm files would create a redundant search index for - primary key properties. This index would then be removed the next time the - Realm was opened, resulting in some extra i/o in the upgrade process. - (Since 5.0.0, [Core #3787](https://github.com/realm/realm-core/issues/3787)). -* Fixed a performance issue with upgrading v9 files with search indexes on - non-primary-key properties. (Since 5.0.0, [Core #3767](https://github.com/realm/realm-core/issues/3767)). - -### Compatibility -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 - -10.0.0-beta.1 Release notes (2020-06-08) -============================================================= - -NOTE: This version bumps the Realm file format to version 11. It is not -possible to downgrade to earlier versions. Older files will automatically be -upgraded to the new file format. Only [Realm Studio -10.0.0](https://github.com/realm/realm-studio/releases/tag/v10.0.0-beta.1) or -later will be able to open the new file format. - -### Enhancements - -* Add support for next generation sync. Support for syncing to MongoDB instead - of Realm Object Server. Applications must be created at realm.mongodb.com -* The memory mapping scheme for Realm files has changed to better support - opening very large files. -* Add support for the ObjectId data type. This is an automatically-generated - unique identifier similar to a GUID or a UUID. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for the Decimal128 data type. This is a 128-bit IEEE 754 decimal - floating point number similar to NSDecimalNumber. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for embedded objects. Embedded objects are objects which are - owned by a single parent object, and are deleted when that parent object is - deleted. They are defined by subclassing `EmbeddedObject` / - `RLMEmbeddedObject` rather than `Object` / `RLMObject`. -* Add `-[RLMSyncUser customData]`/`SyncUser.customData`. Custom data is - configured in your MongoDB Realm App. -* Add `-[RLMApp callFunctionNamed:arguments]`/`RealmApp.functions`. This is the - entry point for calling Remote MongoDB Realm functions. Functions allow you - to define and execute server-side logic for your application. Functions are - written in modern JavaScript (ES6+) and execute in a serverless manner. When - you call a function, you can dynamically access components of the current - application as well as information about the request to execute the function - and the logged in user that sent the request. -* Add `-[RLMApp mongoClientWithServiceName]`/`RealmApp.mongoClient`. This is - the entry point for calling your Remote MongoDB Service. The read operations - are `-[RLMMongoCollection findWhere:completion:]`, `-[RLMMongoCollection - countWhere:completion:]`and `-[RLMMongoCollection - aggregateWithPipeline:completion:]`. The write operations are - `-[RLMMongoCollection insertOneDocument:completion:]`, `-[RLMMongoCollection - insertManyDocuments:completion:]`, `-[RLMMongoCollection - updateOneDocument:completion:]`, `-[RLMMongoCollection - updateManyDocuments:completion:]`, `-[RLMMongoCollection - deleteOneDocument:completion:]`, and `-[RLMMongoCollection - deleteManyDocuments:completion:]`. If you are already familiar with MongoDB - drivers, it is important to understand that the remote MongoCollection only - provides access to the operations available in MongoDB Realm. -* Change `[RLMSyncUser - configurationWithPartitionValue:]`/`SyncUser.configuration(with:)` to accept - all BSON types. Partition values can currently be of types `String`, `Int`, - or `ObjectId`. Opening a realm by partition value is the equivalent of - previously opening a realm by URL. In this case, partitions are meant to be - more closely associated with your data. E.g., if you are running a `Dog` - kennel, and have a field `breed` that acts as your partition key, you could - open up realms based on the breed of the dogs. - -### Breaking Changes - -* We no longer support Realm Cloud (legacy), but instead the new "MongoDB - Realm" Cloud. MongoDB Realm is a serverless platform that enables developers - to quickly build applications without having to set up server infrastructure. - MongoDB Realm is built on top of MongoDB Atlas, automatically integrating the - connection to your database. -* Remove support for Query-based sync, including the configuration parameters - and the `RLMSyncSubscription` and `SyncSubscription` types ([#6437](https://github.com/realm/realm-swift/pull/6437)). -* Primary key properties are no longer marked as being indexed. This reflects - an internal change to how primary keys are handled that should not have any - other visible effects. ([#6440](https://github.com/realm/realm-swift/pull/6440)). -* Remove everything related to sync permissions, including both the path-based - permission system and the object-level privileges for query-based sync. ([#6445](https://github.com/realm/realm-swift/pulls/6445)) -* Primary key uniqueness is now enforced when creating new objects during - migrations, rather than only at the end of migrations. Previously new objects - could be created with duplicate primary keys during a migration as long as - the property was changed to a unique value before the end of the migration, - but now a unique value must be supplied when creating the object. -* Remove support for Realm Object Server. - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 - -5.5.0 Release notes (2020-10-12) -============================================================= - -### Enhancements - -* Add the ability to capture a NotificationToken when using a Combine publisher - that observes a Realm Object or Collection. The user will call - `saveToken(on:at:)` directly after invoking the publisher to use the feature. - -### Fixed - -* When using `Realm.write(withoutNotifying:)` there was a chance that the - supplied observation blocks would not be skipped when in a write transaction. - ([Object Store #1103](https://github.com/realm/realm-object-store/pull/1103)) -* Comparing two identical unmanaged `List<>`/`RLMArray` objects would fail. - ([#5665](https://github.com/realm/realm-swift/issues/5665)). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -5.4.8 Release notes (2020-10-05) -============================================================= - -### Fixed - -* Case-insensitive equality queries on indexed string properties failed to - clear some internal state when rerunning the query. This could manifest as - duplicate results or "key not found" errors. - ([#6830](https://github.com/realm/realm-swift/issues/6830), [#6694](https://github.com/realm/realm-swift/issues/6694), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v6.1.3 to v6.1.4 -* Upgraded realm-sync from v5.0.28 to v5.0.29 - -5.4.7 Release notes (2020-09-30) -============================================================= - -### Fixed - -* Equality queries on indexed string properties would sometimes throw "key not - found" exceptions if the hash of the string happened to have bit 62 set. - ([.NET #2025](https://github.com/realm/realm-dotnet/issues/2025), since v5.0.0). -* Queries comparing non-optional int properties to nil would behave as if they - were comparing against zero instead (since v5.0.0). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v6.1.2 to v6.1.3 -* Upgraded realm-sync from v5.0.27 to v5.0.28 - -5.4.6 Release notes (2020-09-29) -============================================================= - -5.4.5 failed to actually update the core version for installation methods other -than SPM. All changes listed there actually happened in this version for -non-SPM installation methods. - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-sync from v5.0.26 to v5.0.27 - -5.4.5 Release notes (2020-09-28) -============================================================= - -### Enhancements - -* Slightly (<5%) improve the performance of most operations which involve - reading from a Realm file. - -### Fixed - -* Rerunning a equality query on an indexed string property would give incorrect - results if a previous run of the query matched multiple objects and it now - matches one object. This could manifest as either finding a non-matching - object or a "key not found" exception being thrown. - ([#6536](https://github.com/realm/realm-swift/issues/6536), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v6.1.1 to v6.1.2 -* Upgraded realm-sync from v5.0.25 to v5.0.26 - -5.4.4 Release notes (2020-09-25) -============================================================= - -### Enhancements -* Improve the asymtotic performance of NOT IN queries on indexed properties. It - is now O(Number of Rows) rather than O(Number of Rows \* Number of values in IN clause.) - -### Fixed - -* Fix a crash inside `realm::Array(Type)::init_from_mem()` which would - sometimes occur when running a query over links immediately after creating - objects of the queried type. - ([#6789](https://github.com/realm/realm-swift/issues/6789) and possibly others, since 5.0.0). -* Possibly fix problems when changing the type of the primary key of an object - from optional to non-optional. - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v6.0.26 to v6.1.1 -* Upgraded realm-sync from v5.0.23 to v5.0.25 - -5.4.3 Release notes (2020-09-21) -============================================================= - -### Fixed - -* Fix compilation via Carthage when using Xcode 12 ([#6717](https://github.com/realm/realm-swift/issues/6717)). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.12 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -5.4.2 Release notes (2020-09-17) -============================================================= - -### Enhancements - -* Add prebuilt binary for Xcode 12 to the release package. - -### Fixed - -* Fix Archiving the Realm and RealmSwift frameworks with Xcode 12. - ([#6774](https://github.com/realm/realm-swift/issues/6774)) - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.12 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -5.4.1 Release notes (2020-09-16) -============================================================= - -### Enhancements - -* Add prebuilt binary for Xcode 11.7 to the release package. - -### Fixed - -* Fix deadlocks when opening a Realm file in both the iOS simulator and Realm - Studio ([#6743](https://github.com/realm/realm-swift/issues/6743), since 5.3.6). -* Fix Springboard deadlocking when an app is unsuspended while it has an open - Realm file which is stored in an app group on iOS 10-12 - ([#6749](https://github.com/realm/realm-swift/issues/6749), since 5.3.6). -* If you use encryption your application cound crash with a message like - "Opening Realm files of format version 0 is not supported by this version of - Realm". ([#6889](https://github.com/realm/realm-java/issues/6889) among others, since 5.0.0) -* Confining a Realm to a serial queue would throw an error claiming that the - queue was not a serial queue on iOS versions older than 12. - ([#6735](https://github.com/realm/realm-swift/issues/6735), since 5.0.0). -* Results would sometimes give stale results inside a write transaction if a - write which should have updated the Results was made before the first access - of a pre-existing Results object. - ([#6721](https://github.com/realm/realm-swift/issues/6721), since 5.0.0) - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.12 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.7. - -### Internal - -* Upgraded realm-core from v6.0.25 to v6.0.26 -* Upgraded realm-sync from v5.0.22 to v5.0.23 - -5.4.0 Release notes (2020-09-09) -============================================================= - -This version bumps the Realm file format version. This means that older -versions of Realm will be unable to open Realm files written by this version, -and a new version of Realm Studio will be required. There are no actual format -changes and the version bump is just to force a re-migration of incorrectly -upgraded Realms. - -### Fixed - -* Upgrading pre-5.x files with string primary keys would result in a file where - `realm.object(ofType:forPrimaryKey:)` would fail to find the object. - ([#6716](https://github.com/realm/realm-swift/issues/6716), since 5.2.0) -* A write transaction which modifies an object with more than 16 managed - properties and causes the Realm file to grow larger than 2 GB could cause an - assertion failure mentioning "m_has_refs". ([JS #3194](https://github.com/realm/realm-js/issues/3194), since 5.0.0). -* Objects with more than 32 properties could corrupt the Realm file and result - in a variety of crashes. ([Java #7057](https://github.com/realm/realm-java/issues/7057), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.12 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.23 to v6.0.25 -* Upgraded realm-sync from v5.0.20 to v5.0.22 - -5.3.6 Release notes (2020-09-02) -============================================================= - -### Fixed - -* Work around iOS 14 no longer allowing the use of file locks in shared - containers, which resulted in the OS killing an app which entered the - background while a Realm was open ([#6671](https://github.com/realm/realm-swift/issues/6671)). -* If an attempt to upgrade a realm has ended with a crash with "migrate_links()" - in the call stack, the realm was left in an invalid state. The migration - logic now handles this state and can complete upgrading files which were - incompletely upgraded by pre-5.3.4 versions. -* Fix deadlocks when writing to a Realm file on an exFAT partition from macOS. - ([#6691](https://github.com/realm/realm-swift/issues/6691)). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.19 to v6.0.23 -* Upgraded realm-sync from v5.0.16 to v5.0.20 - -5.3.5 Release notes (2020-08-20) -============================================================= - -### Fixed - -* Opening Realms on background threads could produce spurious Incorrect Thread - exceptions when a cached Realm existed for a previously existing thread with - the same thread ID as the current thread. - ([#6659](https://github.com/realm/realm-swift/issues/6659), - [#6689](https://github.com/realm/realm-swift/issues/6689), - [#6712](https://github.com/realm/realm-swift/issues/6712), since 5.0.0). -* Upgrading a table with incoming links but no properties would crash. This was - probably not possible to hit in practice as we reject object types with no - properties. -* Upgrading a non-nullable List which nonetheless contained null values would - crash. This was possible due to missing error-checking in some older versions - of Realm. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.18 to v6.0.19 -* Upgraded realm-sync from v5.0.15 to v5.0.16 - -5.3.4 Release notes (2020-08-17) -============================================================= - -### Fixed - -* Accessing a Realm after calling `deleteAll()` would sometimes throw an - exception with the reason 'ConstIterator copy failed'. ([#6597](https://github.com/realm/realm-swift/issues/6597), since 5.0.0). -* Fix an assertion failure inside the `migrate_links()` function when upgrading - a pre-5.0 Realm file. -* Fix a bug in memory mapping management. This bug could result in multiple - different asserts as well as segfaults. In many cases stack backtraces would - include members of the EncyptedFileMapping near the top - even if encryption - was not used at all. In other cases asserts or crashes would be in methods - reading an array header or array element. In all cases the application would - terminate immediately. ([Core #3838](https://github.com/realm/realm-core/pull/3838), since v5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.14 to v6.0.18 -* Upgraded realm-sync from v5.0.14 to v5.0.15 - -5.3.3 Release notes (2020-07-30) -============================================================= - -### Enhancements - -* Add support for the x86_64 watchOS simulator added in Xcode 12. - -### Fixed - -* (RLM)Results objects would incorrectly pin old read transaction versions - until they were accessed after a Realm was refreshed, resulting in the Realm - file growing to large sizes if a Results was retained but not accessed after - every write. ([#6677](https://github.com/realm/realm-swift/issues/6677), since 5.0.0). -* Fix linker errors when using SwiftUI previews with Xcode 12 when Realm was - installed via Swift Package Manager. ([#6625](https://github.com/realm/realm-swift/issues/6625)) - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.12 to v6.0.14 -* Upgraded realm-sync from v5.0.12 to v5.0.14 - -5.3.2 Release notes (2020-07-21) -============================================================= - -### Fixed - -* Fix a file format upgrade bug when opening older Realm files. Could cause - assertions like "Assertion failed: ref != 0" during opning of a Realm. - ([Core #6644](https://github.com/realm/realm-swift/issues/6644), since 5.2.0) -* A use-after-free would occur if a Realm was compacted, opened on multiple - threads prior to the first write, then written to while reads were happening - on other threads. This could result in a variety of crashes, often inside - realm::util::EncryptedFileMapping::read_barrier. - (Since v5.0.0, [#6626](https://github.com/realm/realm-swift/issues/6626), - [#6628](https://github.com/realm/realm-swift/issues/6628), - [#6652](https://github.com/realm/realm-swift/issues/6652), - [#6655](https://github.com/realm/realm-swift/issues/6555), - [#6656](https://github.com/realm/realm-swift/issues/6656)). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.11 to v6.0.12 -* Upgraded realm-sync from v5.0.11 to v5.0.12 - -5.3.1 Release notes (2020-07-17) -============================================================= - -### Enhancements - -* Add prebuilt binary for Xcode 11.6 to the release package. - -### Fixed - -* Creating an object inside migration which changed that object type's primary - key would hit an assertion failure mentioning primary_key_col - ([#6613](https://github.com/realm/realm-swift/issues/6613), since 5.0.0). -* Modifying the value of a string primary key property inside a migration with - a Realm file which was upgraded from pre-5.0 would corrupt the property's - index, typically resulting in crashes. ([Core #3765](https://github.com/realm/realm-core/issues/3765), since 5.0.0). -* Some Realm files which hit assertion failures when upgrading from the pre-5.0 - file format should now upgrade correctly (Since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.9 to v6.0.11 -* Upgraded realm-sync from v5.0.8 to v5.0.11 - -5.3.0 Release notes (2020-07-14) -============================================================= - -### Enhancements - -* Add `Realm.objectWillChange`, which is a Combine publisher that will emit a - notification each time the Realm is refreshed or a write transaction is - commited. - -### Fixed - -* Fix the spelling of `ObjectKeyIdentifiable`. The old spelling is available - and deprecated for compatibility. -* Rename `RealmCollection.publisher` to `RealmCollection.collectionPublisher`. - The old name interacted with the `publisher` defined by `Sequence` in very - confusing ways, so we need to use a different name. The `publisher` name is - still available for compatibility. ([#6516](https://github.com/realm/realm-swift/issues/6516)) -* Work around "xcodebuild timed out while trying to read - SwiftPackageManagerExample.xcodeproj" errors when installing Realm via - Carthage. ([#6549](https://github.com/realm/realm-swift/issues/6549)). -* Fix a performance regression when using change notifications. (Since 5.0.0, - [#6629](https://github.com/realm/realm-swift/issues/6629)). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v6.0.8 to v6.0.9 -* Upgraded realm-sync from v5.0.7 to v5.0.8 - -5.2.0 Release notes (2020-06-30) -============================================================= - -### Fixed -* Opening a SyncSession with LOCAL app deployments would not use the correct endpoints. -This release also contains all changes from 5.0.3 and 5.1.0. - -### Breaking Changes -* The following classes & aliases have been renamed to align Cocoa with the other Realm SDKs: - -| Old API | New API | -|:------------------------------------------------------------|:---------------------------------------------------------------| -| `RLMSyncUser` | `RLMUser` | -| `SyncUser` | `User` | -| `RLMAppCredential` | `RLMCredential` | -| `AppCredential` | `Credential` | -| `RealmApp` | `App` | -| `RLMUserAPIKeyProviderClient` | `RLMAPIKeyAuth` | -| `RLMUsernamePasswordProviderClient` | `RLMEmailPasswordAuth` | -| `UsernamePasswordProviderClient` | `EmailPasswordAuth` | -| `UserAPIKeyProviderClient` | `APIKeyAuth` | - -* The following functionality has also moved to the User: - -| Old API | New API | -|:-------------------------------------------------------------|:--------------------------------------------------------------| -| `[RLMApp callFunctionNamed:]` | `[RLMUser callFunctionNamed:]` | -| `App.functions` | `User.functions` | -| `[RLMApp mongoClientWithServiceName:]` | `[RLMUser mongoClientWithServiceName:]` | -| `App.mongoClient(serviceName)` | `User.mongoClient(serviceName)` | -| `[RLMApp userAPIKeyProviderClient]` | `[RLMUser apiKeyAuth]` | -| `App.userAPIKeyProviderClient` | `App.apiKeyAuth()` | -| `[RLMApp logOut:]` | `[RLMUser logOut]` | -| `App.logOut(user)` | `User.logOut()` | -| `[RLMApp removeUser:]` | `[RLMUser remove]` | -| `App.remove(user)` | `User.remove()` | -| `[RLMApp linkUser:credentials:]` | `[RLMUser linkWithCredentials:]` | -| `App.linkUser(user, credentials)` | `User.link(credentials)` | - -* The argument labels in Swift have changed for several methods: -| Old API | New API | -|:-------------------------------------------------------------|:--------------------------------------------------------------| -| `APIKeyAuth.createApiKey(withName:completion:)` | `APIKeyAuth.createApiKey(named:completion:)` | -| `App.login(withCredential:completion:) | `App.login(credentials:completion:)` | -| `App.pushClient(withServiceName:)` | `App.pushClient(serviceName:)` | -| `MongoClient.database(withName:)` | `MongoClient.database(named:)` | - -* `refreshCustomData()` on User now returns void and passes the custom data to the callback on success. - -### Compatibility -* This release introduces breaking changes w.r.t some sync classes and MongoDB Realm Cloud functionality. - (See the breaking changes section for the full list) -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* Realm Studio: 10.0.0 or later. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 - -10.0.0-beta.2 Release notes (2020-06-09) -============================================================= -Xcode 11.3 and iOS 9 are now the minimum supported versions. - -### Enhancements - -* Add support for building with Xcode 12 beta 1. watchOS currently requires - removing x86_64 from the supported architectures. Support for the new 64-bit - watch simulator will come in a future release. - -### Fixed -* Opening a SyncSession with LOCAL app deployments would not use the correct endpoints. -* Linking from embedded objects to top-level objects was incorrectly disallowed. - -* Opening a Realm file in file format v6 (created by Realm Cocoa versions - between 2.4 and 2.10) would crash. (Since 5.0.0, [Core #3764](https://github.com/realm/realm-core/issues/3764)). -* Upgrading v9 (pre-5.0) Realm files would create a redundant search index for - primary key properties. This index would then be removed the next time the - Realm was opened, resulting in some extra i/o in the upgrade process. - (Since 5.0.0, [Core #3787](https://github.com/realm/realm-core/issues/3787)). -* Fixed a performance issue with upgrading v9 files with search indexes on - non-primary-key properties. (Since 5.0.0, [Core #3767](https://github.com/realm/realm-core/issues/3767)). - -### Compatibility -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 - -10.0.0-beta.1 Release notes (2020-06-08) -============================================================= - -NOTE: This version bumps the Realm file format to version 11. It is not -possible to downgrade to earlier versions. Older files will automatically be -upgraded to the new file format. Only [Realm Studio -10.0.0](https://github.com/realm/realm-studio/releases/tag/v10.0.0-beta.1) or -later will be able to open the new file format. - -### Enhancements - -* Add support for next generation sync. Support for syncing to MongoDB instead - of Realm Object Server. Applications must be created at realm.mongodb.com -* The memory mapping scheme for Realm files has changed to better support - opening very large files. -* Add support for the ObjectId data type. This is an automatically-generated - unique identifier similar to a GUID or a UUID. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for the Decimal128 data type. This is a 128-bit IEEE 754 decimal - floating point number similar to NSDecimalNumber. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for embedded objects. Embedded objects are objects which are - owned by a single parent object, and are deleted when that parent object is - deleted. They are defined by subclassing `EmbeddedObject` / - `RLMEmbeddedObject` rather than `Object` / `RLMObject`. -* Add `-[RLMSyncUser customData]`/`SyncUser.customData`. Custom data is - configured in your MongoDB Realm App. -* Add `-[RLMApp callFunctionNamed:arguments]`/`RealmApp.functions`. This is the - entry point for calling Remote MongoDB Realm functions. Functions allow you - to define and execute server-side logic for your application. Functions are - written in modern JavaScript (ES6+) and execute in a serverless manner. When - you call a function, you can dynamically access components of the current - application as well as information about the request to execute the function - and the logged in user that sent the request. -* Add `-[RLMApp mongoClientWithServiceName]`/`RealmApp.mongoClient`. This is - the entry point for calling your Remote MongoDB Service. The read operations - are `-[RLMMongoCollection findWhere:completion:]`, `-[RLMMongoCollection - countWhere:completion:]`and `-[RLMMongoCollection - aggregateWithPipeline:completion:]`. The write operations are - `-[RLMMongoCollection insertOneDocument:completion:]`, `-[RLMMongoCollection - insertManyDocuments:completion:]`, `-[RLMMongoCollection - updateOneDocument:completion:]`, `-[RLMMongoCollection - updateManyDocuments:completion:]`, `-[RLMMongoCollection - deleteOneDocument:completion:]`, and `-[RLMMongoCollection - deleteManyDocuments:completion:]`. If you are already familiar with MongoDB - drivers, it is important to understand that the remote MongoCollection only - provides access to the operations available in MongoDB Realm. -* Change `[RLMSyncUser - configurationWithPartitionValue:]`/`SyncUser.configuration(with:)` to accept - all BSON types. Partition values can currently be of types `String`, `Int`, - or `ObjectId`. Opening a realm by partition value is the equivalent of - previously opening a realm by URL. In this case, partitions are meant to be - more closely associated with your data. E.g., if you are running a `Dog` - kennel, and have a field `breed` that acts as your partition key, you could - open up realms based on the breed of the dogs. - -### Breaking Changes - -* We no longer support Realm Cloud (legacy), but instead the new "MongoDB - Realm" Cloud. MongoDB Realm is a serverless platform that enables developers - to quickly build applications without having to set up server infrastructure. - MongoDB Realm is built on top of MongoDB Atlas, automatically integrating the - connection to your database. -* Remove support for Query-based sync, including the configuration parameters - and the `RLMSyncSubscription` and `SyncSubscription` types ([#6437](https://github.com/realm/realm-swift/pull/6437)). -* Primary key properties are no longer marked as being indexed. This reflects - an internal change to how primary keys are handled that should not have any - other visible effects. ([#6440](https://github.com/realm/realm-swift/pull/6440)). -* Remove everything related to sync permissions, including both the path-based - permission system and the object-level privileges for query-based sync. ([#6445](https://github.com/realm/realm-swift/pulls/6445)) -* Primary key uniqueness is now enforced when creating new objects during - migrations, rather than only at the end of migrations. Previously new objects - could be created with duplicate primary keys during a migration as long as - the property was changed to a unique value before the end of the migration, - but now a unique value must be supplied when creating the object. -* Remove support for Realm Object Server. - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* `List.index(of:)` would give incorrect results if it was the very first thing - called on that List after a Realm was refreshed following a write which - modified the List. (Since 5.0.0, [#6606](https://github.com/realm/realm-swift/issues/6606)). -* If a ThreadSafeReference was the only remaining reference to a Realm, - multiple copies of the file could end up mapped into memory at once. This - probably did not have any symptoms other than increased memory usage. (Since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 -* Upgraded realm-core from v6.0.6 to v6.0.7 -* Upgraded realm-sync from v5.0.5 to v5.0.6 -* Upgraded realm-core from v6.0.6 to v6.0.8 -* Upgraded realm-sync from v5.0.5 to v5.0.7 - -5.1.0 Release notes (2020-06-22) -============================================================= - -### Enhancements - -* Allow opening full-sync Realms in read-only mode. This disables local schema - initialization, which makes it possible to open a Realm which the user does - not have write access to without using asyncOpen. In addition, it will report - errors immediately when an operation would require writing to the Realm - rather than reporting it via the sync error handler only after the server - rejects the write. - -### Fixed - -* Opening a Realm using a configuration object read from an existing Realm - would incorrectly bind the new Realm to the original Realm's thread/queue, - resulting in "Realm accessed from incorrect thread." exceptions. - ([#6574](https://github.com/realm/realm-swift/issues/6574), - [#6559](https://github.com/realm/realm-swift/issues/6559), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -5.0.3 Release notes (2020-06-10) -============================================================= - -### Fixed - -* `-[RLMObject isFrozen]` always returned false. ([#6568](https://github.com/realm/realm-swift/issues/6568), since 5.0.0). -* Freezing an object within the write transaction that the object was created - in now throws an exception rather than crashing when the object is first - used. -* The schema for frozen Realms was not properly initialized, leading to crashes - when accessing a RLMLinkingObjects property. - ([#6568](https://github.com/realm/realm-swift/issues/6568), since 5.0.0). -* Observing `Object.isInvalidated` via a keypath literal would produce a - warning in Swift 5.2 due to the property not being marked as @objc. - ([#6554](https://github.com/realm/realm-swift/issues/6554)) - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -5.0.2 Release notes (2020-06-02) -============================================================= - -### Fixed - -* Fix errSecDuplicateItem (-25299) errors when opening a synchronized Realm - when upgrading from pre-5.0 versions of Realm. - ([#6538](https://github.com/realm/realm-swift/issues/6538), [#6494](https://github.com/realm/realm-swift/issues/6494), since 5.0.0). -* Opening Realms stored on filesystems which do not support preallocation (such - as ExFAT) would give "Operation not supported" exceptions. - ([#6508](https://github.com/realm/realm-swift/issues/6508), since 3.2.0). -* 'NoSuchTable' exceptions would sometimes be thrown after upgrading a Relam - file to the v10 format. ([Core #3701](https://github.com/realm/realm-core/issues/3701), since 5.0.0) -* If the upgrade process was interrupted/killed for various reasons, the - following run could stop with some assertions failing. No instances of this - happening were reported to us. (Since 5.0.0). -* Queries filtering a `List` where the query was on an indexed property over a - link would sometimes give incomplete results. - ([#6540](https://github.com/realm/realm-swift/issues/6540), since 4.1.0 but - more common since 5.0.0) -* Opening a file in read-only mode would attempt to make a spurious write to - the file, causing errors if the file was in read-only storage (since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v6.0.4 to v6.0.6 -* Upgraded realm-sync from v5.0.3 to v5.0.5 - -5.0.1 Release notes (2020-05-27) -============================================================= - -### Enhancements - -* Add prebuilt binary for Xcode 11.5 to the release package. - -### Fixed - -* Fix linker error when building a xcframework for Catalyst. - ([#6511](https://github.com/realm/realm-swift/issues/6511), since 4.3.1). -* Fix building for iOS devices when using Swift Package Manager - ([#6522](https://github.com/realm/realm-swift/issues/6522), since 5.0.0). -* `List` and `RealmOptional` properties on frozen objects were not initialized - correctly and would always report `nil` or an empty list. - ([#6527](https://github.com/realm/realm-swift/issues/6527), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -5.0.0 Release notes (2020-05-15) -============================================================= - -NOTE: This version bumps the Realm file format to version 10. It is not -possible to downgrade version 9 or earlier. Files created with older versions -of Realm will be automatically upgraded. Only -[Studio 3.11](https://github.com/realm/realm-studio/releases/tag/v3.11.0) or later will be able -to open the new file format. - -### Enhancements - -* Storing large binary blobs in Realm files no longer forces the file to be at - least 8x the size of the largest blob. -* Reduce the size of transaction logs stored inside the Realm file, reducing - file size growth from large transactions. -* Add support for frozen objects. `Realm`, `Results`, `List` and `Object` now - have `freeze()` methods which return a frozen copy of the object. These - objects behave similarly to creating unmanaged deep copies of the source - objects. They can be read from any thread and do not update when writes are - made to the Realm, but creating frozen objects does not actually copy data - out of the Realm and so can be much faster and use less memory. Frozen - objects cannot be mutated or observed for changes (as they never change). - ([PR #6427](https://github.com/realm/realm-swift/pull/6427)). -* Add the `isFrozen` property to `Realm`, `Results`, `List` and `Object`. -* Add `Realm.Configuration.maxNumberOfActiveVersions`. Each time a write - transaction is performed, a new version is created inside the Realm, and then - any versions which are no longer in use are cleaned up. If too many versions - are kept alive while performing writes (either due to a background thread - performing a long operation that doesn't let the Realm on that thread - refresh, or due to holding onto frozen versions for a long time) the Realm - file will grow in size, potentially to the point where it is too large to be - opened. Setting this configuration option will make write transactions which - would cause the live version count to exceed the limit to instead fail. -* Add support for queue-confined Realms. Rather than being bound to a specific - thread, queue-confined Realms are bound to a serial dispatch queue and can be - used within blocks dispatched to that queue regardless of what thread they - happen to run on. In addition, change notifications will be delivered to that - queue rather than the thread's run loop. ([PR #6478](https://github.com/realm/realm-swift/pull/6478)). -* Add an option to deliver object and collection notifications to a specific - serial queue rather than the current thread. ([PR #6478](https://github.com/realm/realm-swift/pull/6478)). -* Add Combine publishers for Realm types. Realm collections have a `.publisher` - property which publishes the collection each time it changes, and a - `.changesetPublisher` which publishes a `RealmCollectionChange` each time the - collection changes. Corresponding publishers for Realm Objects can be - obtained with the `publisher()` and `changesetPublisher()` global functions. -* Extend Combine publishers which output Realm types with a `.freeze()` - function which will make the publisher instead output frozen objects. -* String primary keys no longer require a separate index, improving insertion - and deletion performance without hurting lookup performance. -* Reduce the encrypted page reclaimer's impact on battery life when encryption - is used. ([Core #3461](https://github.com/realm/realm-core/pull/3461)). - -### Fixed - -* The uploaded bytes in sync progress notifications was sometimes incorrect and - wouldn't exactly equal the uploadable bytes when the uploaded completed. -* macOS binaries were built with the incorrect deployment target (10.14 rather - than 10.9), resulting in linker warnings. ([#6299](https://github.com/realm/realm-swift/issues/6299), since 3.18.0). -* An internal datastructure for List properties could be double-deleted if the - last reference was released from a thread other than the one which the List - was created on at the wrong time. This would typically manifest as - "pthread_mutex_destroy() failed", but could also result in other kinds of - crashes. ([#6333](https://github.com/realm/realm-swift/issues/6333)). -* Sorting on float or double properties containing NaN values had inconsistent - results and would sometimes crash due to out-of-bounds memory accesses. - ([#6357](https://github.com/realm/realm-swift/issues/6357)). - -### Breaking Changes - -* The ObjectChange type in Swift is now generic and includes a reference to the - object which changed. When using `observe(on:)` to receive notifications on a - dispatch queue, the object will be confined to that queue. -* The Realm instance passed in the callback to asyncOpen() is now confined to - the callback queue passed to asyncOpen() rather than the thread which the - callback happens to be called on. This means that the Realm instance may be - stored and reused in further blocks dispatched to that queue, but the queue - must now be a serial queue. -* Files containing Date properties written by version of Realm prior to 1.0 can - no longer be opened. -* Files containing Any properties can no longer be opened. This property type - was never documented and was deprecated in 1.0. -* Deleting objects now preserves the order of objects reported by unsorted - Results rather than performing a swap operation before the delete. Note that - it is still not safe to assume that the order of objects in an unsorted - Results is the order that the objects were created in. -* The minimum supported deployment target for iOS when using Swift Package - Manager to install Realm is now iOS 11. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.4.1. - -### Internal - -* Upgraded realm-core from v5.23.8 to v6.0.4 -* Upgraded realm-sync from v4.9.5 to v5.0.3 - -5.0.0-beta.6 Release notes (2020-05-08) -============================================================= - -### Enhancements - -* Add support for queue-confined Realms. Rather than being bound to a specific - thread, queue-confined Realms are bound to a serial dispatch queue and can be - used within blocks dispatched to that queue regardless of what thread they - happen to run on. In addition, change notifications will be delivered to that - queue rather than the thread's run loop. ([PR #6478](https://github.com/realm/realm-swift/pull/6478)). -* Add an option to deliver object and collection notifications to a specific - serial queue rather than the current thread. ([PR #6478](https://github.com/realm/realm-swift/pull/6478)). - -### Fixed - -* The uploaded bytes in sync progress notifications was sometimes incorrect and - wouldn't exactly equal the uploadable bytes when the uploaded completed. - -### Breaking Changes - -* The Realm instance passed in the callback to asyncOpen() is now confined to - the callback queue passed to asyncOpen() rather than the thread which the - callback happens to be called on. This means that the Realm instance may be - stored and reused in further blocks dispatched to that queue, but the queue - must now be a serial queue. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.4.1. - -### Internal - -* Upgraded realm-core from v6.0.3 to v6.0.4 -* Upgraded realm-sync from v5.0.1 to v5.0.3 - -4.4.1 Release notes (2020-04-16) -============================================================= - -### Enhancements - -* Upgrade Xcode 11.4 binaries to Xcode 11.4.1. - -### Fixed - -* Fix a "previous <= m_schema_transaction_version_max" assertion failure caused - by a race condition that could occur after performing a migration. (Since 3.0.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.4.1. - -5.0.0-beta.3 Release notes (2020-02-26) -============================================================= - -Based on 4.3.2 and also includes all changes since 4.3.0. - -### Enhancements - -* Add support for frozen objects. `Realm`, `Results`, `List` and `Object` now - have `freeze()` methods which return a frozen copy of the object. These - objects behave similarly to creating unmanaged deep copies of the source - objects. They can be read from any thread and do not update when writes are - made to the Realm, but creating frozen objects does not actually copy data - out of the Realm and so can be much faster and use less memory. Frozen - objects cannot be mutated or observed for changes (as they never change). - ([PR #6427](https://github.com/realm/realm-swift/pull/6427)). -* Add the `isFrozen` property to `Realm`, `Results`, `List` and `Object`. -* Add `Realm.Configuration.maxNumberOfActiveVersions`. Each time a write - transaction is performed, a new version is created inside the Realm, and then - any versions which are no longer in use are cleaned up. If too many versions - are kept alive while performing writes (either due to a background thread - performing a long operation that doesn't let the Realm on that thread - refresh, or due to holding onto frozen versions for a long time) the Realm - file will grow in size, potentially to the point where it is too large to be - opened. Setting this configuration option will make write transactions which - would cause the live version count to exceed the limit to instead fail. - - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-core from v6.0.0-beta.3 to v6.0.3 -* Upgraded realm-sync from v5.0.0-beta.2 to v5.0.1 - -5.0.0-beta.2 Release notes (2020-01-13) -============================================================= - -Based on 4.3.0 and also includes all changes since 4.1.1. - -### Fixed - -* Fix compilation when using CocoaPods targeting iOS versions older than 11 (since 5.0.0-alpha). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-core from v6.0.0-beta.2 to v6.0.0-beta.3 -* Upgraded realm-sync from v5.0.0-beta.1 to v5.0.0-beta.2 - -5.0.0-beta.1 Release notes (2019-12-13) -============================================================= - -Based on 4.1.1 and also includes all changes since 4.1.0. - -NOTE: This version bumps the Realm file format to version 10. It is not possible to downgrade version 9 or earlier. Files created with older versions of Realm will be automatically upgraded. - -### Enhancements - -* String primary keys no longer require a separate index, improving insertion - and deletion performance without hurting lookup performance. -* Reduce the encrypted page reclaimer's impact on battery life when encryption - is used. ([Core #3461](https://github.com/realm/realm-core/pull/3461)). - -### Fixed - -* Fix an error when a table-backed Results was accessed immediately after - deleting the object previously at the index being accessed (since - 5.0.0-alpha.1). -* macOS binaries were built with the incorrect deployment target (10.14 rather - than 10.9), resulting in linker warnings. ([#6299](https://github.com/realm/realm-swift/issues/6299), since 3.18.0). -* An internal datastructure for List properties could be double-deleted if the - last reference was released from a thread other than the one which the List - was created on at the wrong time. This would typically manifest as - "pthread_mutex_destroy() failed", but could also result in other kinds of - crashes. ([#6333](https://github.com/realm/realm-swift/issues/6333)). -* Sorting on float or double properties containing NaN values had inconsistent - results and would sometimes crash due to out-of-bounds memory accesses. - ([#6357](https://github.com/realm/realm-swift/issues/6357)). - -### Known Issues - -* Changing which property of an object is the primary key in a migration will - break incoming links to objects of that type. -* Changing the primary key of an object with Data properties in a migration - will crash. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-core from v6.0.0-alpha.24 to v6.0.0-beta.2 -* Upgraded realm-sync from 4.7.1-core6.5 to v5.0.0-beta.1 - -5.0.0-alpha.1 Release notes (2019-11-14) -============================================================= - -Based on 4.1.0. - -### Enhancements - -* Add `-[RLMRealm fileExistsForConfiguration:]`/`Realm.fileExists(for:)`, - which checks if a local Realm file exists for the given configuration. -* Add `-[RLMRealm deleteFilesForConfiguration:]`/`Realm.deleteFiles(for:)` - to delete the Realm file and all auxiliary files for the given configuration. -* Storing large binary blobs in Realm files no longer forces the file to be at - least 8x the size of the largest blob. -* Reduce the size of transaction logs stored inside the Realm file, reducing - file size growth from large transactions. - -NOTE: This version bumps the Realm file format to version 10. It is not -possible to downgrade version 9 or earlier. Files created with older versions -of Realm will be automatically upgraded. This automatic upgrade process is not -yet well tested. Do not open Realm files with data you care about with this -alpha version. - -### Breaking Changes - -* Files containing Date properties written by version of Realm prior to 1.0 can - no longer be opened. -* Files containing Any properties can no longer be opened. This property type - was never documented and was deprecated in 1.0. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades v9) -* Realm Object Server: 3.21.0 or later. -* APIs are backwards compatible with all previous releases in the 4.x.y series. -* Carthage release for Swift is built with Xcode 11.3. -* Carthage release for Swift is built with Xcode 11.2.1. - -### Internal - -* Upgraded realm-core from 5.23.6 to v6.0.0-alpha.24. -* Upgraded realm-sync from 4.8.2 to 4.7.1-core6.5. - -4.4.0 Release notes (2020-03-26) -============================================================= - -Swift 4.0 and Xcode 10.3 are now the minimum supported versions. - -### Enhancements - -* Allow setting the `fileUrl` for synchronized Realms. An appropriate local - path based on the sync URL will still be used if it is not overridden. - ([PR #6454](https://github.com/realm/realm-swift/pull/6454)). -* Add Xcode 11.4 binaries to the release package. - -### Fixed - -* None. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.4. - -4.3.2 Release notes (2020-02-06) -============================================================= - -### Enhancements - -* Similar to `autoreleasepool()`, `realm.write()` now returns the value which - the block passed to it returns. Returning `Void` from the block is still allowed. - -### Fixed - -* Fix a memory leak attributed to `property_copyAttributeList` the first time a - Realm is opened when using Realm Swift. ([#6409](https://github.com/realm/realm-swift/issues/6409), since 4.0.0). -* Connecting to a `realms:` sync URL would crash at runtime on iOS 11 (and no - other iOS versions) inside the SSL validation code. (Since 4.3.1). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-sync from 4.9.4 to 4.9.5. - -4.3.1 Release notes (2020-01-16) -============================================================= - -### Enhancements - -* Reduce the encrypted page reclaimer's impact on battery life when encryption - is used. ([Core #3461](https://github.com/realm/realm-core/pull/3461)). - -### Fixed - -* macOS binaries were built with the incorrect deployment target (10.14 rather - than 10.9), resulting in linker warnings. ([#6299](https://github.com/realm/realm-swift/issues/6299), since 3.18.0). -* An internal datastructure for List properties could be double-deleted if the - last reference was released from a thread other than the one which the List - was created on at the wrong time. This would typically manifest as - "pthread_mutex_destroy() failed", but could also result in other kinds of - crashes. ([#6333](https://github.com/realm/realm-swift/issues/6333)). -* Sorting on float or double properties containing NaN values had inconsistent - results and would sometimes crash due to out-of-bounds memory accesses. - ([#6357](https://github.com/realm/realm-swift/issues/6357)). -* A NOT query on a `List` which happened to have the objects in a - different order than the underlying table would sometimes include the object - immediately before an object which matches the query. ([#6289](https://github.com/realm/realm-swift/issues/6289), since 0.90.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-core from 5.23.6 to 5.23.8. -* Upgraded realm-sync from 4.9.0 to 4.9.4. - -4.3.0 Release notes (2019-12-19) -============================================================= - -### Enhancements - -* Add the ability to set a custom logger function on `RLMSyncManager` which is - called instead of the default NSLog-based logger. -* Expose configuration options for the various types of sync connection - timeouts and heartbeat intervals on `RLMSyncManager`. -* Add an option to have `Realm.asyncOpen()` report an error if the connection - times out rather than swallowing the error and attempting to reconnect until - it succeeds. - -### Fixed - -* Fix a crash when using value(forKey:) on a LinkingObjects property (including - when doing so indirectly, such as by querying on that property). - ([#6366](https://github.com/realm/realm-swift/issues/6366), since 4.0.0). -* Fix a rare crash in `ClientHistoryImpl::integrate_server_changesets()` which - would only happen in Debug builds (since v3.0.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-sync from 4.8.2 to 4.9.0. - -4.2.0 Release notes (2019-12-16) -============================================================= - -### Enhancements - -* Add `-[RLMRealm fileExistsForConfiguration:]`/`Realm.fileExists(for:)`, - which checks if a local Realm file exists for the given configuration. -* Add `-[RLMRealm deleteFilesForConfiguration:]`/`Realm.deleteFiles(for:)` - to delete the Realm file and all auxiliary files for the given configuration. - -### Fixed - -* None. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.3. - -4.1.1 Release notes (2019-11-18) -============================================================= - -### Fixed - -* The UpdatePolicy passed to `realm.add()` or `realm.create()` was not properly - propagated when adding objects within a `List`, which could result in - spurious change notifications when using `.modified`. - ([#6321](https://github.com/realm/realm-swift/issues/6321), since v3.16.0) -* Fix a rare deadlock when a Realm collection or object was observed, then - `refresh()` was explicitly called, and then the NotificationToken from the - observation was destroyed on a different thread (since 0.98.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.2. - -4.1.0 Release notes (2019-11-13) -============================================================= - -### Enhancements - -* Improve performance of queries over a link where the final target property - has an index. -* Restore support for storing `@objc enum` properties on RealmSwift.Object - subclasses (broken in 4.0.0), and add support for storing them in - RealmOptional properties. - -### Fixed - -* The sync client would fail to reconnect after failing to integrate a - changeset. The bug would lead to further corruption of the client’s Realm - file. ([RSYNC-48](https://jira.mongodb.org/browse/RSYNC-48), since v3.2.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.2. - -### Internal - -* Upgraded realm-core from 5.23.5 to 5.23.6. -* Upgraded realm-sync from 4.7.11 to 4.8.2 - -4.0.0 Release notes (2019-11-08) -============================================================= - -### Breaking Changes - -* All previously deprecated functionality has now been removed entirely. -* The schema discovery logic for RealmSwift.Object subclasses has been - rewritten in Swift. This should not have any effect on valid class - definitions, but there may be types of invalid definitions which previously - worked by coincidence and no longer do. -* `SyncSubscription` no longer has a generic type parameter, as the type was - not actually used for anything. -* The following Swift types have changed from `final class` to `struct`: - - AnyRealmCollection - - LinkingObjects - - ObjectiveCSupport - - Realm - - Results - - SyncSubscription - - ThreadSafeReference - There is no intended change in semantics from this, but certain edge cases - may behave differently. -* The designated initializers defined by RLMObject and Object other than - zero-argument `init` have been replaced with convenience initializers. -* The implementation of the path-based permissions API has been redesigned to - accomodate changes to the server. This should be mostly a transparent change, - with two main exceptions: - 1. SyncPermission objects are no longer live Realm objects, and retrieving - permissions gives an Array rather than Results. - Getting up-to-date permissions now requires calling retrievePermissions() again - rather than observing the permissions. - 2. The error codes for permissions functions have changed. Rather than a - separate error type and set of error codes, permission functions now produce - SyncAuthErrors. - -### Enhancements - -* Improve performance of initializing Realm objects with List properties. - -### Fixed - -* None. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.2. - -3.21.0 Release notes (2019-11-04) -============================================================= - -### Enhancements - -* Add prebuilt binaries for Xcode 11.2. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.2. - -3.20.0 Release notes (2019-10-21) -============================================================= - -### Enhancements - -* Add support for custom refresh token authentication. This allows a user to be - authorized with an externally-issued refresh token when ROS is configured to - recognize the external issuer as a refresh token validator. - ([PR #6311](https://github.com/realm/realm-swift/pull/6311)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11. - -3.19.1 Release notes (2019-10-17) -============================================================= - -### Enhancements - -* Improve performance of sync changeset integration. Transactions involving a - very large number of objects and cheap operations on each object are as much - as 20% faster. - -### Fixed - -* Fix a crash when a RLMArray/List of primitives was observed and then the - containing object was deleted before the first time that the background - notifier could run. - ([Issue #6234](https://github.com/realm/realm-swift/issues/6234, since 3.0.0)). -* Remove an incorrect assertion that would cause crashes inside - `TableInfoCache::get_table_info()`, with messages like "Assertion failed: info.object_id_index == 0 [3, 0]". - (Since 3.18.0, [#6268](https://github.com/realm/realm-swift/issues/6268) and [#6257](https://github.com/realm/realm-swift/issues/6257)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.0. - -### Internal - -* Upgrade to REALM_SYNC_VERSION=4.7.11 - -3.19.0 Release notes (2019-09-27) -============================================================= - -### Enhancements - -* Expose ObjectSchema.objectClass in Swift as looking up the class via - NSClassFromString() can be complicated for Swift types. - ([PR #6244](https://github.com/realm/realm-swift/pull/6244)). -* Add support for suppressing notifications using closure-based write/transaction methods. - ([PR #6252](https://github.com/realm/realm-swift/pull/6252)). - -### Fixed - -* IN or chained OR equals queries on an unindexed string column would fail to - match some results if any of the strings were 64 bytes or longer. - ([Core #3386](https://github.com/realm/realm-core/pull/3386), since 3.14.2). -* Query Based Sync subscriptions for queries involving a null timestamp were - not sent to the server correctly and would match no objects. - ([Core #3389](https://github.com/realm/realm-core/pull/3388), since 3.17.3). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.0. - -### Internal - -* Upgrade to REALM_CORE_VERSION=5.23.5 -* Upgrade to REALM_SYNC_VERSION=4.7.8 - -3.18.0 Release notes (2019-09-13) -============================================================= - -The file format for synchronized Realms has changed. Old Realms will be -automatically upgraded when they are opened. Once upgraded, the files will not -be openable by older versions of Realm. The upgrade should not take a -significant amount of time to run or run any risk of errors. - -This does not effect non-synchronized Realms. - -### Enhancements - -* Improve performance of queries on Date properties - ([Core #3344](https://github.com/realm/realm-core/pull/3344), [Core #3351](https://github.com/realm/realm-core/pull/3351)). -* Syncronized Realms are now more aggressive about trimming local history that - is no longer needed. This should reduce file size growth in write-heavy - workloads. ([Sync #3007](https://github.com/realm/realm-sync/issues/3007)). -* Add support for building Realm as an xcframework. - ([PR #6238](https://github.com/realm/realm-swift/pull/6238)). -* Add prebuilt libraries for Xcode 11 to the release package. - ([PR #6248](https://github.com/realm/realm-swift/pull/6248)). -* Add a prebuilt library for Catalyst/UIKit For Mac to the release package - ([PR #6248](https://github.com/realm/realm-swift/pull/6248)). - -### Fixed - -* If a signal interrupted a msync() call, Realm would throw an exception and - the write transaction would fail. This behavior has new been changed to retry - the system call instead. ([Core #3352](https://github.com/realm/realm-core/issues/3352)) -* Queries on the sum or average of an integer property would sometimes give - incorrect results. ([Core #3356](https://github.com/realm/realm-core/pull/3356)). -* Opening query-based synchronized Realms with a small number of subscriptions - performed an unneccesary write transaction. ([ObjectStore #815](https://github.com/realm/realm-object-store/pull/815)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.0 - -### Deprecations - -* `RLMIdentityProviderNickname` has been deprecated in favor of `RLMIdentityProviderUsernamePassword`. -* `+[RLMIdentityProvider credentialsWithNickname]` has been deprecated in favor of `+[RLMIdentityProvider credentialsWithUsername]`. -* `Sync.nickname(String, Bool)` has been deprecated in favor of `Sync.usernamePassword(String, String, Bool)`. - -3.17.3 Release notes (2019-07-24) -============================================================= - -### Enhancements - -* Add Xcode 10.3 binaries to the release package. Remove the Xcode 9.2 and 9.3 binaries. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.3. - -3.17.1 Release notes (2019-07-10) -============================================================= - -### Enhancements - -* Add support for canceling asynchronous opens using a new AsyncOpenTask - returned from the asyncOpen() call. ([PR #6193](https://github.com/realm/realm-swift/pull/6193)). -* Importing the Realm SPM package can now be done by pinning to a version - rather than a branch. - -### Fixed - -* Queries on a List/RLMArray which checked an indexed int property would - sometimes give incorrect results. - ([#6154](https://github.com/realm/realm-swift/issues/6154)), since v3.15.0) -* Queries involving an indexed int property had a memory leak if run multiple - times. ([#6186](https://github.com/realm/realm-swift/issues/6186)), since v3.15.0) -* Creating a subscription with `includeLinkingObjects:` performed unneccesary - comparisons, making it extremely slow when large numbers of objects were - involved. ([Core #3311](https://github.com/realm/realm-core/issues/3311), since v3.15.0) - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.17.0 Release notes (2019-06-28) -============================================================= - -### Enhancements - -* Add support for including Realm via Swift Package Manager. This currently - requires depending on the branch "master" rather than pinning to a version - (i.e. `.package(url: "https://github.com/realm/realm-swift", .branch("master"))`). - ([#6187](https://github.com/realm/realm-swift/pull/6187)). -* Add Codable conformance to RealmOptional and List, and Encodable conformance to Results. - ([PR #6172](https://github.com/realm/realm-swift/pull/6172)). - -### Fixed - -* Attempting to observe an unmanaged LinkingObjects object crashed rather than - throwing an approriate exception (since v0.100.0). -* Opening an encrypted Realm could potentially report that a valid file was - corrupted if the system was low on free memory. - (since 3.14.0, [Core #3267](https://github.com/realm/realm-core/issues/3267)) -* Calling `Realm.asyncOpen()` on multiple Realms at once would sometimes crash - due to a `FileNotFound` exception being thrown on a background worker thread. - (since 3.16.0, [ObjectStore #806](https://github.com/realm/realm-object-store/pull/806)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.16.2 Release notes (2019-06-14) -============================================================= - -### Enhancements - -* Add support for Xcode 11 Beta 1. Xcode betas are only supported when building - from source, and not when using a prebuilt framework. - ([PR #6164](https://github.com/realm/realm-swift/pull/6164)). - -### Fixed - -* Using asyncOpen on query-based Realms which didn't already exist on the local - device would fail with error 214. - ([#6178](https://github.com/realm/realm-swift/issues/6178), since 3.16.0). -* asyncOpen on query-based Realms did not wait for the server-created - permission objects to be downloaded, resulting in crashes if modifications to - the permissions were made before creating a subscription for the first time (since 3.0.0). -* EINTR was not handled correctly in the notification worker, which may have - resulted in inconsistent and rare assertion failures in - `ExternalCommitHelper::listen()` when building with assertions enabled. - (PR: [#804](https://github.com/realm/realm-object-store/pull/804), since 0.91.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.16.1 Release notes (2019-05-31) -============================================================= - -### Fixed - -* The static type passed at compile time to `realm.create()` was checked for a - primary key rather than the actual type passed at runtime, resulting in - exceptions like "''RealmSwiftObject' does not have a primary key and can not - be updated'" being thrown even if the object type being created has a primary - key. (since 3.16.0, [#6159](https://github.com/realm/realm-swift/issues/6159)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.16.0 Release notes (2019-05-29) -============================================================= - -### Enhancements - -* Add an option to only set the properties which have values different from the - existing ones when updating an existing object with - `Realm.create()`/`-[RLMObject createOrUpdateInRealm:withValue:]`. This makes - notifications report only the properties which have actually changed, and - improves Object Server performance by reducing the number of operations to - merge. (Issue: [#5970](https://github.com/realm/realm-swift/issues/5970), - PR: [#6149](https://github.com/realm/realm-swift/pull/6149)). -* Using `-[RLMRealm asyncOpenWithConfiguration:callbackQueue:]`/`Realm.asyncOpen()` to open a - synchronized Realm which does not exist on the local device now uses an - optimized transfer method to download the initial data for the Realm, greatly - speeding up the first start time for applications which use full - synchronization. This is currently not applicable to query-based - synchronization. (PR: [#6106](https://github.com/realm/realm-swift/pull/6106)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.15.0 Release notes (2019-05-06) -============================================================= - -The minimum version of Realm Object Server has been increased to 3.21.0 and -attempting to connect to older versions will produce protocol mismatch errors. -Realm Cloud has already been upgraded to this version, and users using that do -not need to worry about this. - -### Enhancements - -* Add `createdAt`, `updatedAt`, `expiresAt` and `timeToLive` properties to - `RLMSyncSubscription`/`SyncSubscription`. These properties will be `nil` for - subscriptions created with older versions of Realm, but will be automatically - populated for newly-created subscriptions. -* Add support for transient subscriptions by setting the `timeToLive` when - creating the subscription. The next time a subscription is created or updated - after that time has elapsed the subscription will be automatically removed. -* Add support for updating existing subscriptions with a new query or limit. - This is done by passing `update: true` (in swift) or setting - `options.overwriteExisting = YES` (in obj-c) when creating the subscription, - which will make it update the existing subscription with the same name rather - than failing if one already exists with that name. -* Add an option to include the objects from - `RLMLinkingObjects`/`LinkingObjects` properties in sync subscriptions, - similarly to how `RLMArray`/`List` automatically pull in the contained - objects. -* Improve query performance for chains of OR conditions (or an IN condition) on - an unindexed integer or string property. - ([Core PR #2888](https://github.com/realm/realm-core/pull/2888) and - [Core PR #3250](https://github.com/realm/realm-core/pull/3250)). -* Improve query performance for equality conditions on indexed integer properties. - ([Core PR #3272](https://github.com/realm/realm-core/pull/3272)). -* Adjust the file allocation algorithm to reduce fragmentation caused by large - numbers of small blocks. -* Improve file allocator logic to reduce fragmentation and improve commit - performance after many writes. ([Core PR #3278](https://github.com/realm/realm-core/pull/3278)). - -### Fixed - -* Making a query that compares two integer properties could cause a - segmentation fault on x86 (i.e. macOS only). - ([Core PR #3253](https://github.com/realm/realm-core/pull/3256)). -* The `downloadable_bytes` parameter passed to sync progress callbacks reported - a value which correlated to the amount of data left to download, but not - actually the number of bytes which would be downloaded. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.14.2 Release notes (2019-04-25) -============================================================= - -### Enhancements - -* Updating `RLMSyncManager.customRequestHeaders` will immediately update all - currently active sync session with the new headers rather than requiring - manually closing the Realm and reopening it. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.14.1 Release notes (2019-04-04) -============================================================= - -### Fixed - -* Fix "Cannot find interface declaration for 'RealmSwiftObject', superclass of - 'MyRealmObjectClass'" errors when building for a simulator with Xcode 10.2 - with "Install Objective-C Compatibility Header" enabled. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. -* Carthage release for Swift is built with Xcode 10.2. - -3.14.0 Release notes (2019-03-27) -============================================================= - -### Enhancements - -* Reduce memory usage when committing write transactions. -* Improve performance of compacting encrypted Realm files. - ([PR #3221](https://github.com/realm/realm-core/pull/3221)). -* Add a Xcode 10.2 build to the release package. - -### Fixed - -* Fix a memory leak whenever Realm makes a HTTP(s) request to the Realm Object - Server (Issue [#6058](https://github.com/realm/realm-swift/issues/6058), since 3.8.0). -* Fix an assertion failure when creating an object in a synchronized Realm - after creating an object with a null int primary key in the same write - transaction. - ([PR #3227](https://github.com/realm/realm-core/pull/3227)). -* Fix some new warnings when building with Xcode 10.2 beta. -* Properly clean up sync sessions when the last Realm object using the session - is deallocated while the session is explicitly suspended (since 3.9.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. -* Carthage release for Swift is built with Xcode 10.2. - -### Internal - -* Throw an exception rather than crashing with an assertion failure in more - cases when opening invalid Realm files. -* Upgrade to REALM_CORE_VERSION=5.14.0 -* Upgrade to REALM_SYNC_VERSION=3.15.1 - -3.13.1 Release notes (2019-01-03) -============================================================= - -### Fixed - -* Fix a crash when iterating over `Realm.subscriptions()` using for-in. - (Since 3.13.0, PR [#6050](https://github.com/realm/realm-swift/pull/6050)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -3.13.0 Release notes (2018-12-14) -============================================================= - -### Enhancements - -* Add `Realm.subscriptions()`/`-[RLMRealm subscriptions]` and - `Realm.subscription(named:)`/`-[RLMRealm subscriptionWithName:]` to enable - looking up existing query-based sync subscriptions. - (PR: https://github.com/realm/realm-swift/pull/6029). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -3.12.0 Release notes (2018-11-26) -============================================================= - -### Enhancements - -* Add a User-Agent header to HTTP requests made to the Realm Object Server. By - default, this contains information about the Realm library version and your - app's bundle ID. The application identifier can be customized by setting - `RLMSyncManager.sharedManager.userAgent`/`SyncManager.shared.userAgent` prior - to opening a synchronized Realm. - (PR: https://github.com/realm/realm-swift/pull/6007). -* Add Xcode 10.1 binary to the prebuilt package. - -### Fixed - -* None. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -### Internal - -* None. - - -3.11.2 Release notes (2018-11-15) -============================================================= - -### Enhancements - -* Improve the performance of the merge algorithm used for integrating remote - changes from the server. In particular, changesets involving many objects - which all link to a single object should be greatly improved. - -### Fixed - -* Fix a memory leak when removing notification blocks from collections. - PR: [#702](https://github.com/realm/realm-object-store/pull/702), since 1.1.0. -* Fix re-sorting or distincting an already-sorted Results using values from - linked objects. Previously the unsorted order was used to read the values - from the linked objects. - PR [#3102](https://github.com/realm/realm-core/pull/3102), since 3.1.0. -* Fix a set of bugs which could lead to bad changeset assertions when using - sync. The assertions would look something like the following: - `[realm-core-5.10.0] Assertion failed: ndx < size() with (ndx, size()) = [742, 742]`. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -### Internal - -* None. - - -3.11.1 Release notes (2018-10-19) -============================================================= - -### Enhancements - -* None. - -### Fixed - -* Fix `SyncUser.requestEmailConfirmation` not triggering the email confirmation - flow on ROS. (PR [#5953](https://github.com/realm/realm-swift/pull/5953), since 3.5.0) -* Add some missing validation in the getters and setters of properties on - managed Realm objects, which would sometimes result in an application - crashing with a segfault rather than the appropriate exception being thrown - when trying to write to an object which has been deleted. - (PR [#5952](https://github.com/realm/realm-swift/pull/5952), since 2.8.0) - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -### Internal - -* None. - - -3.11.0 Release notes (2018-10-04) -============================================================= - -### Enhancements -* Reduce memory usage when integrating synchronized changes sent by ROS. -* Devices will now report download progress for read-only Realms, allowing the - server to compact Realms more aggressively and reducing the amount of - server-side storage space required. - -### Fixed -* Fix a crash when adding an object with a non-`@objc` `String?` property which - has not been explicitly ignored to a Realm on watchOS 5 (and possibly other - platforms when building with Xcode 10). - (Issue: [5929](https://github.com/realm/realm-swift/issues/5929)). -* Fix some merge algorithm bugs which could result in `BadChangesetError` - being thrown when integrating changes sent by the server. - -### Compatibility -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* **NOTE!!! - You will need to upgrade your Realm Object Server to at least version 3.11.0 - or use [Realm Cloud](https://cloud.realm.io). - If you try to connect to a ROS v3.10.x or previous, you will see an error - like `Wrong protocol version in Sync HTTP request, client protocol version = 25, - server protocol version = 24`.** - -### Internal -* Update to Sync 3.12.2. - - -3.10.0 Release notes (2018-09-19) -============================================================= - -Prebuilt binaries are now built for Xcode 9.2, 9.3, 9.4 and 10.0. - -Older versions of Xcode are still supported when building from source, but you -should be migrating to at least Xcode 9.2 as soon as possible. - -### Enhancements - -* Add support for Watch Series 4 by adding an arm64_32 slice to the library. - -3.9.0 Release notes (2018-09-10) -============================================================= - -### Enhancements - -* Expose RLMSyncUser.refreshToken publicly so that it can be used for custom - HTTP requests to Realm Object Server. -* Add RLMSyncSession.connectionState, which reports whether the session is - currently connected to the Realm Object Server or if it is offline. -* Add `-suspend` and `-resume` methods to `RLMSyncSession` to enable manually - pausing data synchronization. -* Add support for limiting the number of objects matched by a query-based sync - subscription. This requires a server running ROS 3.10.1 or newer. - -### Bugfixes - -* Fix crash when getting the description of a `MigrationObject` which has - `List` properties. -* Fix crash when calling `dynamicList()` on a `MigrationObject`. - -3.8.0 Release notes (2018-09-05) -============================================================= - -### Enhancements - -* Remove some old and no longer applicable migration logic which created an - unencrypted file in the sync metadata directory containing a list of ROS URLs - connected to. -* Add support for pinning SSL certificates used for https and realms - connections by setting `RLMSyncManager.sharedManager.pinnedCertificatePaths` - in obj-c and `SyncManager.shared.pinnedCertificatePaths` in Swift. - -### Bugfixes - -* Fix warnings when building Realm as a static framework with CocoaPods. - -3.7.6 Release notes (2018-08-08) -============================================================= - -### Enhancements - -* Speed up the actual compaction when using compact-on-launch. -* Reduce memory usage when locally merging changes from sync. -* When first connecting to a server, wait to begin uploading changes until - after all changes have been downloaded to reduce the server-side load for - query-based sync. - -3.7.5 Release notes (2018-07-23) -============================================================= - -### Enhancements - -* Improve performance of applying remote changesets from sync. -* Improve performance of creating objects with string primary keys. -* Improve performance of large write transactions. -* Adjust file space allocation strategy to reduce fragmentation, producing - smaller Realm files and typically better performance. -* Close network connections immediately when a sync session is destroyed. -* Report more information in `InvalidDatabase` exceptions. - -### Bugfixes - -* Fix permission denied errors for RLMPlatform.h when building with CocoaPods - and Xcode 10 beta 3. -* Fix a use-after-free when canceling a write transaction which could result in - incorrect "before" values in KVO observations (typically `nil` when a non-nil - value is expected). -* Fix several bugs in the merge algorithm that could lead to memory corruption - and crashes with errors like "bad changeset" and "unreachable code". - -3.7.4 Release notes (2018-06-19) -============================================================= - -### Bugfixes - -* Fix a bug which could potentially flood Realm Object Server with PING - messages after a client device comes back online. - -3.7.3 Release notes (2018-06-18) -============================================================= - -### Enhancements - -* Avoid performing potentially large amounts of pointless background work for - LinkingObjects instances which are accessed and then not immediate deallocated. - -### Bugfixes - -* Fix crashes which could result from extremely fragmented Realm files. -* Fix a bug that could result in a crash with the message "bad changeset error" - when merging changesets from the server. - -3.7.2 Release notes (2018-06-13) -============================================================= - -### Enhancements - -* Add some additional consistency checks that will hopefully produce better - errors when the "prev_ref + prev_size <= ref" assertion failure occurs. - -### Bugfixes - -* Fix a problem in the changeset indexing algorithm that would sometimes - cause "bad permission object" and "bad changeset" errors. -* Fix a large number of linking warnings about symbol visibility by aligning - compiler flags used. -* Fix large increase in size of files produced by `Realm.writeCopy()` introduced in 3.6.0. - -3.7.1 Release notes (2018-06-07) -============================================================= - -* Add support for compiling Realm Swift with Xcode 10 beta 1. - -3.7.0 Release notes (2018-06-06) -============================================================= - -The feature known as Partial Sync has been renamed to Query-based -Synchronization. This has impacted a number of API's. See below for the -details. - -### Deprecations - -* `+[RLMSyncConfiguration initWithUser] has been deprecated in favor of `-[RLMSyncUser configurationWithURL:url]. -* `+[RLMSyncConfiguration automaticConfiguration] has been deprecated in favor of `-[RLMSyncUser configuration]. -* `+[RLMSyncConfiguration automaticConfigurationForUser] has been deprecated in favor of `-[RLMSyncUser configuration]. -* `-[RLMSyncConfiguration isPartial] has been deprecated in favor of `-[RLMSyncConfiguration fullSynchronization]`. - -### Enhancements - -* Add `-[RLMRealm syncSession]` and `Realm.syncSession` to obtain the session used for a synchronized Realm. -* Add `-[RLMSyncUser configuration]`. Query-based sync is the default sync mode for this configuration. -* Add `-[RLMSyncUser configurationWithURL:url]`. Query-based sync is the default sync mode for this configuration. - -3.6.0 Release notes (2018-05-29) -============================================================= - -### Enhancements - -* Improve performance of sync metadata operations and resolving thread-safe - references. -* `shouldCompactOnLaunch` is now supported for compacting the local data of - synchronized Realms. - -### Bugfixes - -* Fix a potential deadlock when a sync session progress callback held the last - strong reference to the sync session. -* Fix some cases where comparisons to `nil` in queries were not properly - serialized when subscribing to a query. -* Don't delete objects added during a migration after a call to `-[RLMMigration - deleteDataForClassName:]`. -* Fix incorrect results and/or crashes when multiple `-[RLMMigration - enumerateObjects:block:]` blocks deleted objects of the same type. -* Fix some edge-cases where `-[RLMMigration enumerateObjects:block:]` - enumerated the incorrect objects following deletions. -* Restore the pre-3.5.0 behavior for Swift optional properties missing an ivar - rather than crashing. - -3.5.0 Release notes (2018-04-25) -============================================================= - -### Enhancements - -* Add wrapper functions for email confirmation and password reset to `SyncUser`. - -### Bugfixes - -* Fix incorrect results when using optional chaining to access a RealmOptional - property in Release builds, or otherwise interacting with a RealmOptional - object after the owning Object has been deallocated. - -3.4.0 Release notes (2018-04-19) -============================================================= - -The prebuilt binary for Carthage is now built for Swift 4.1. - -### Enhancements - -* Expose `RLMSyncManager.authorizationHeaderName`/`SyncManager.authorizationHeaderName` - as a way to override the transport header for Realm Object Server authorization. -* Expose `RLMSyncManager.customRequestHeaders`/`SyncManager.customRequestHeaders` - which allows custom HTTP headers to be appended on requests to the Realm Object Server. -* Expose `RLMSSyncConfiguration.urlPrefix`/`SyncConfiguration.urlPrefix` as a mechanism - to replace the default path prefix in Realm Sync WebSocket requests. - -3.3.2 Release notes (2018-04-03) -============================================================= - -Add a prebuilt binary for Xcode 9.3. - -3.3.1 Release notes (2018-03-28) -============================================================= - -Realm Object Server v3.0.0 or newer is required when using synchronized Realms. - -### Enhancements - -* Expose `RLMObject.object(forPrimaryKey:)` as a factory method for Swift so - that it is callable with recent versions of Swift. - -### Bugfixes - -* Exclude the RLMObject-derived Permissions classes from the types repored by - `Realm.Configuration.defaultConfiguration.objectTypes` to avoid a failed - cast. -* Cancel pending `Realm.asyncOpen()` calls when authentication fails with a - non-transient error such as missing the Realm path in the URL. -* Fix "fcntl() inside prealloc()" errors on APFS. - -3.3.0 Release notes (2018-03-19) -============================================================= - -Realm Object Server v3.0.0 or newer is required when using synchronized Realms. - -### Enhancements - -* Add `Realm.permissions`, `Realm.permissions(forType:)`, and `Realm.permissions(forClassNamed:)` as convenience - methods for accessing the permissions of the Realm or a type. - -### Bugfixes - -* Fix `+[RLMClassPermission objectInRealm:forClass:]` to work for classes that are part of the permissions API, - such as `RLMPermissionRole`. -* Fix runtime errors when applications define an `Object` subclass with the - same name as one of the Permissions object types. - -3.2.0 Release notes (2018-03-15) -============================================================= - -Realm Object Server v3.0.0 or newer is required when using synchronized Realms. - -### Enhancements - -* Added an improved API for adding subscriptions in partially-synchronized Realms. `Results.subscribe()` can be - used to subscribe to any result set, and the returned `SyncSubscription` object can be used to observe the state - of the subscription and ultimately to remove the subscription. See the documentation for more information - (). -* Added a fine-grained permissions system for use with partially-synchronized Realms. This allows permissions to be - defined at the level of individual objects or classes. See the documentation for more information - (). -* Added `SyncConfiguration.automatic()` and `SyncConfiguration.automatic(user:)`. - These methods return a `Realm.Configuration` appropriate for syncing with the default - synced Realm for the current (or specified) user. These should be considered the preferred methods - for accessing synced Realms going forwards. -* Added `+[RLMSyncSession sessionForRealm:]` to retrieve the sync session corresponding to a `RLMRealm`. - -### Bugfixes - -* Fix incorrect initalization of `RLMSyncManager` that made it impossible to - set `errorHandler`. -* Fix compiler warnings when building with Xcode 9.3. -* Fix some warnings when running with UBsan. - -3.2.0-rc.1 Release notes (2018-03-14) -============================================================= - -Realm Object Server v3.0.0-rc.1 or newer is required when using synchronized Realms. - -### Enhancements - -* Added `SyncConfiguration.automatic()` and `SyncConfiguration.automatic(user:)`. - These methods return a `Realm.Configuration` appropriate for syncing with the default - synced Realm for the current (or specified). These should be considered the preferred methods - for accessing synced Realms going forwards. -* A role is now automatically created for each user with that user as its only member. - This simplifies the common use case of restricting access to specific objects to a single user. - This role can be accessed at `PermissionUser.role`. -* Improved error reporting when the server rejects a schema change due to a lack of permissions. - -### Bugfixes - -* Fix incorrect initalization of `RLMSyncManager` that made it impossible to - set `errorHandler`. -* Fix compiler warnings when building with Xcode 9.3. - -3.2.0-beta.3 Release notes (2018-03-01) -============================================================= - -Realm Object Server v3.0.0-alpha.9 or newer is required when using synchronized Realms. - -### Bugfixes - -* Fix a crash that would occur when using partial sync with Realm Object Server v3.0.0-alpha.9. - -3.2.0-beta.2 Release notes (2018-02-28) -============================================================= - -Realm Object Server v3.0.0-alpha.8 or newer is required when using synchronized Realms. - -### Enhancements - -* Added `findOrCreate(forRoleNamed:)` and `findOrCreate(forRole:)` to `List` - to simplify the process of adding permissions for a role. -* Added `+permissionForRoleNamed:inArray:`, `+permissionForRoleNamed:onRealm:`, - `+permissionForRoleNamed:onClass:realm:`, `+permissionForRoleNamed:onClassNamed:realm:`, - and `+permissionForRoleNamed:onObject:` to `RLMSyncPermission` to simplify the process - of adding permissions for a role. -* Added `+[RLMSyncSession sessionForRealm:]` to retrieve the sync session corresponding to a `RLMRealm`. - -### Bugfixes - -* `PermissionRole.users` and `PermissionUser.roles` are now public as intended. -* Fixed the handling of `setPermissions` in `-[RLMRealm privilegesForRealm]` and related methods. - -3.2.0-beta.1 Release notes (2018-02-19) -============================================================= - -### Enhancements - -* Added an improved API for adding subscriptions in partially-synchronized Realms. `Results.subscribe()` can be - used to subscribe to any result set, and the returned `SyncSubscription` object can be used to observe the state - of the subscription and ultimately to remove the subscription. -* Added a fine-grained permissions system for use with partially-synchronized Realms. This allows permissions to be - defined at the level of individual objects or classes. See `Permission` and related types for more information. - -### Bugfixes - -* Fix some warnings when running with UBsan. - -3.1.1 Release notes (2018-02-03) -============================================================= - -Prebuilt Swift frameworks for Carthage are now built with Xcode 9.2. - -### Bugfixes - -* Fix a memory leak when opening Realms with an explicit `objectTypes` array - from Swift. - -3.1.0 Release notes (2018-01-16) -============================================================= - -* Prebuilt frameworks are now included for Swift 3.2.3 and 4.0.3. -* Prebuilt frameworks are no longer included for Swift 3.0.x. -* Building from source with Xcode versions prior to Xcode 8.3 is no longer supported. - -### Enhancements - -* Add `Results.distinct(by:)` / `-[RLMResults distinctResultsUsingKeyPaths:]`, which return a `Results` - containing only objects with unique values at the given key paths. -* Improve performance of change checking for notifications in certain cases. -* Realm Object Server errors not explicitly recognized by the client are now reported to the application - regardless. -* Add support for JSON Web Token as a sync credential source. -* Add support for Nickname and Anonymous Auth as a sync credential source. -* Improve allocator performance when writing to a highly fragmented file. This - should significantly improve performance when inserting large numbers of - objects which have indexed properties. -* Improve write performance for complex object graphs involving many classes - linking to each other. - -### Bugfixes - -* Add a missing check for a run loop in the permission API methods which - require one. -* Fix some cases where non-fatal sync errors were being treated as fatal errors. - -3.0.2 Release notes (2017-11-08) -============================================================= - -Prebuilt frameworks are now included for Swift 3.2.2 and 4.0.2. - -### Bugfixes - -* Fix a crash when a linking objects property is retrieved from a model object instance via - Swift subscripting. -* Fix incorrect behavior if a call to `posix_fallocate` is interrupted. - -3.0.1 Release notes (2017-10-26) -============================================================= - -### Bugfixes - -* Explicitly exclude KVO-generated object subclasses from the schema. -* Fix regression where the type of a Realm model class is not properly determined, causing crashes - when a type value derived at runtime by `type(of:)` is passed into certain APIs. -* Fix a crash when an `Object` subclass has implicitly ignored `let` - properties. -* Fix several cases where adding a notification block from within a - notification callback could produce incorrect results. - -3.0.0 Release notes (2017-10-16) -============================================================= - -### Breaking Changes -* iOS 7 is no longer supported. -* Synchronized Realms require a server running Realm Object Server v2.0 or higher. -* Computed properties on Realm object types are detected and no - longer added to the automatically generated schema. -* The Objective-C and Swift `create(_:, value: update:)` APIs now - correctly nil out nullable properties when updating an existing - object when the `value` argument specifies nil or `NSNull` for - the property value. -* `-[RLMRealm addOrUpdateObjects:]` and `-[RLMRealm deleteObjects:]` now - require their argument to conform to `NSFastEnumeration`, to match similar - APIs that also take collections. -* The way interactive sync errors (client reset and permission denied) - are delivered to the user has been changed. Instead of a block which can - be invoked to immediately delete the offending Realm file, an opaque - token object of type `RLMSyncErrorActionToken` will be returned in the - error object's `userInfo` dictionary. This error object can be passed - into the new `+[RLMSyncSession immediatelyHandleError:]` API to delete - the files. -* The return types of the `SyncError.clientResetInfo()` and - `SyncError.deleteRealmUserInfo()` APIs have been changed. They now return - `RLMSyncErrorActionToken`s or `SyncError.ActionToken`s instead of closures. -* The class methods `Object.className()`, `Object.objectUtilClass()`, and - the property `Object.isInvalidated` can no longer be overriden. -* The callback which runs when a sync user login succeeds or fails - now runs on the main queue by default, or can be explicitly specified - by a new `callbackQueue` parameter on the `{RLM}SyncUser.logIn(...)` API. -* Fix empty strings, binary data, and null on the right side of `BEGINSWITH`, - `ENDSWITH` and `CONTAINS` operators in predicates to match Foundation's - semantics of never matching any strings or data. -* Swift `Object` comparison and hashing behavior now works the same way as - that of `RLMObject` (objects are now only considered equatable if their - model class defines a primary key). -* Fix the way the hash property works on `Object` when the object model has - no primary key. -* Fix an issue where if a Swift model class defined non-generic managed - properties after generic Realm properties (like `List`), the schema - would be constructed incorrectly. Fixes an issue where creating such - models from an array could fail. -* Loosen `RLMArray` and `RLMResults`'s generic constraint from `RLMObject` to - `NSObject`. This may result in having to add some casts to disambiguate - types. -* Remove `RLMSyncPermissionResults`. `RLMSyncPermission`s are now vended out - using a `RLMResults`. This results collection supports all normal collection - operations except for setting values using key-value coding (since - `RLMSyncPermission`s are immutable) and the property aggregation operations. -* `RLMSyncUserInfo` has been significantly enhanced. It now contains metadata - about a user stored on the Realm Object Server, as well as a list of all user account - data associated with that user. -* Starting with Swift 4, `List` now conforms to `MutableCollection` instead of - `RangeReplaceableCollection`. For Swift 4, the empty collection initializer has been - removed, and default implementations of range replaceable collection methods that - make sense for `List` have been added. -* `List.removeLast()` now throws an exception if the list is empty, to more closely match - the behavior of the standard library's `Collection.removeLast()` implementation. -* `RealmCollection`'s associated type `Element` has been renamed `ElementType`. -* The following APIs have been renamed: - -| Old API | New API | -|:------------------------------------------------------------|:---------------------------------------------------------------| -| `NotificationToken.stop()` | `NotificationToken.invalidate()` | -| `-[RLMNotificationToken stop]` | `-[RLMNotificationToken invalidate]` | -| `RealmCollection.addNotificationBlock(_:)` | `RealmCollection.observe(_:)` | -| `RLMSyncProgress` | `RLMSyncProgressMode` | -| `List.remove(objectAtIndex:)` | `List.remove(at:)` | -| `List.swap(_:_:)` | `List.swapAt(_:_:)` | -| `SyncPermissionValue` | `SyncPermission` | -| `RLMSyncPermissionValue` | `RLMSyncPermission` | -| `-[RLMSyncPermission initWithRealmPath:userID:accessLevel]` | `-[RLMSyncPermission initWithRealmPath:identity:accessLevel:]` | -| `RLMSyncPermission.userId` | `RLMSyncPermission.identity` | -| `-[RLMRealm addOrUpdateObjectsInArray:]` | `-[RLMRealm addOrUpdateObjects:]` | - -* The following APIs have been removed: - -| Removed API | Replacement | -|:-------------------------------------------------------------|:------------------------------------------------------------------------------------------| -| `Object.className` | None, was erroneously present. | -| `RLMPropertyTypeArray` | `RLMProperty.array` | -| `PropertyType.array` | `Property.array` | -| `-[RLMArray sortedResultsUsingProperty:ascending:]` | `-[RLMArray sortedResultsUsingKeyPath:ascending:]` | -| `-[RLMCollection sortedResultsUsingProperty:ascending:]` | `-[RLMCollection sortedResultsUsingKeyPath:ascending:]` | -| `-[RLMResults sortedResultsUsingProperty:ascending:]` | `-[RLMResults sortedResultsUsingKeyPath:ascending:]` | -| `+[RLMSortDescriptor sortDescriptorWithProperty:ascending:]` | `+[RLMSortDescriptor sortDescriptorWithKeyPath:ascending:]` | -| `RLMSortDescriptor.property` | `RLMSortDescriptor.keyPath` | -| `AnyRealmCollection.sorted(byProperty:ascending:)` | `AnyRealmCollection.sorted(byKeyPath:ascending:)` | -| `List.sorted(byProperty:ascending:)` | `List.sorted(byKeyPath:ascending:)` | -| `LinkingObjects.sorted(byProperty:ascending:)` | `LinkingObjects.sorted(byKeyPath:ascending:)` | -| `Results.sorted(byProperty:ascending:)` | `Results.sorted(byKeyPath:ascending:)` | -| `SortDescriptor.init(property:ascending:)` | `SortDescriptor.init(keyPath:ascending:)` | -| `SortDescriptor.property` | `SortDescriptor.keyPath` | -| `+[RLMRealm migrateRealm:configuration:]` | `+[RLMRealm performMigrationForConfiguration:error:]` | -| `RLMSyncManager.disableSSLValidation` | `RLMSyncConfiguration.enableSSLValidation` | -| `SyncManager.disableSSLValidation` | `SyncConfiguration.enableSSLValidation` | -| `RLMSyncErrorBadResponse` | `RLMSyncAuthErrorBadResponse` | -| `RLMSyncPermissionResults` | `RLMResults` | -| `SyncPermissionResults` | `Results` | -| `RLMSyncPermissionChange` | `-[RLMSyncUser applyPermission:callback]` / `-[RLMSyncUser deletePermission:callback:]` | -| `-[RLMSyncUser permissionRealmWithError:]` | `-[RLMSyncUser retrievePermissionsWithCallback:]` | -| `RLMSyncPermissionOffer` | `-[RLMSyncUser createOfferForRealmAtURL:accessLevel:expiration:callback:]` | -| `RLMSyncPermissionOfferResponse` | `-[RLMSyncUser acceptOfferForToken:callback:]` | -| `-[NSError rlmSync_clientResetBlock]` | `-[NSError rlmSync_errorActionToken]` / `-[NSError rlmSync_clientResetBackedUpRealmPath]` | -| `-[NSError rlmSync_deleteRealmBlock]` | `-[NSError rlmSync_errorActionToken]` | - -### Enhancements -* `List` can now contain values of types `Bool`, `Int`, `Int8`, `Int16`, - `Int32`, `Int64`, `Float`, `Double`, `String`, `Data`, and `Date` (and - optional versions of all of these) in addition to `Object` subclasses. - Querying `List`s containing values other than `Object` subclasses is not yet - implemented. -* `RLMArray` can now be constrained with the protocols `RLMBool`, `RLMInt`, - `RLMFloat`, `RLMDouble`, `RLMString`, `RLMData`, and `RLMDate` in addition to - protocols defined with `RLM_ARRAY_TYPE`. By default `RLMArray`s of - non-`RLMObject` types can contain null. Indicating that the property is - required (by overriding `+requiredProperties:`) will instead make the values - within the array required. Querying `RLMArray`s containing values other than - `RLMObject` subclasses is not yet implemented. -* Add a new error code to denote 'permission denied' errors when working - with synchronized Realms, as well as an accompanying block that can be - called to inform the binding that the offending Realm's files should be - deleted immediately. This allows recovering from 'permission denied' - errors in a more robust manner. See the documentation for - `RLMSyncErrorPermissionDeniedError` for more information. -* Add Swift `Object.isSameObject(as:_)` API to perform the same function as - the existing Objective-C API `-[RLMObject isEqualToObject:]`. -* Opening a synced Realm whose local copy was created with an older version of - Realm Mobile Platfrom when a migration is not possible to the current version - will result in an `RLMErrorIncompatibleSyncedFile` / `incompatibleSyncedFile` - error. When such an error occurs, the original file is moved to a backup - location, and future attempts to open the synchronized Realm will result in a new - file being created. If you wish to migrate any data from the backup Realm you can - open it using the backup Realm configuration available on the error object. -* Add a preview of partial synchronization. Partial synchronization allows a - synchronized Realm to be opened in such a way that only objects requested by - the user are synchronized to the device. You can use it by setting the - `isPartial` property on a `SyncConfiguration`, opening the Realm, and then - calling `Realm.subscribe(to:where:callback:)` with the type of object you're - interested in, a string containing a query determining which objects you want - to subscribe to, and a callback which will report the results. You may add as - many subscriptions to a synced Realm as necessary. - -### Bugfixes -* Realm no longer throws an "unsupported instruction" exception in some cases - when opening a synced Realm asynchronously. -* Realm Swift APIs that filter or look up the index of an object based on a - format string now properly handle optional arguments in their variadic argument - list. -* `-[RLMResults indexOfObject:]` now properly accounts for access - level. -* Fix a race condition that could lead to a crash accessing to the freed configuration object - if a default configuration was set from a different thread. -* Fixed an issue that crash when enumerating after clearing data during migration. -* Fix a bug where a synced Realm couldn't be reopened even after a successful client reset - in some cases. -* Fix a bug where the sync subsystem waited too long in certain cases to reconnect to the server. -* Fix a bug where encrypted sync-related metadata was incorrectly deleted from upgrading users, - resulting in all users being logged out. -* Fix a bug where permission-related data continued to be synced to a client even after the user - that data belonged to logged out. -* Fix an issue where collection notifications might be delivered inconsistently if a notification - callback was added within another callback for the same collection. - -3.0.0-rc.2 Release notes (2017-10-14) -============================================================= - -### Enhancements -* Reinstate `RLMSyncPermissionSortPropertyUserID` to allow users to sort permissions - to their own Realms they've granted to others. - -### Bugfixes -* `-[RLMResults indexOfObject:]` now properly accounts for access - level. -* Fix a race condition that could lead to a crash accessing to the freed configuration object - if a default configuration was set from a different thread. -* Fixed an issue that crash when enumerating after clearing data during migration. -* Fix a bug where a synced Realm couldn't be reopened even after a successful client reset - in some cases. -* Fix a bug where the sync subsystem waited too long in certain cases to reconnect to the server. -* Fix a bug where encrypted sync-related metadata was incorrectly deleted from upgrading users, - resulting in all users being logged out. -* Fix a bug where permission-related data continued to be synced to a client even after the user - that data belonged to logged out. -* Fix an issue where collection notifications might be delivered inconsistently if a notification - callback was added within another callback for the same collection. - -3.0.0-rc.1 Release notes (2017-10-03) -============================================================= - -### Breaking Changes -* Remove `RLMSyncPermissionSortPropertyUserID` to reflect changes in how the - Realm Object Server reports permissions for a user. -* Remove `RLMSyncPermissionOffer` and `RLMSyncPermissionOfferResponse` classes - and associated helper methods and functions. Use the - `-[RLMSyncUser createOfferForRealmAtURL:accessLevel:expiration:callback:]` - and `-[RLMSyncUser acceptOfferForToken:callback:]` methods instead. - -### Bugfixes - -* The keychain item name used by Realm to manage the encryption keys for - sync-related metadata is now set to a per-app name based on the bundle - identifier. Keys that were previously stored within the single, shared Realm - keychain item will be transparently migrated to the per-application keychain - item. -* Fix downloading of the Realm core binaries when Xcode's command-line tools are - set as the active developer directory for command-line interactions. -* Fix a crash that could occur when resolving a ThreadSafeReference to a `List` - whose parent object had since been deleted. - -3.0.0-beta.4 Release notes (2017-09-22) -============================================================= - -### Breaking Changes - -* Rename `List.remove(objectAtIndex:)` to `List.remove(at:)` to match the name - used by 'RangeReplaceableCollection'. -* Rename `List.swap()` to `List.swapAt()` to match the name used by 'Array'. -* Loosen `RLMArray` and `RLMResults`'s generic constraint from `RLMObject` to - `NSObject`. This may result in having to add some casts to disambiguate - types. -* Remove `RLMPropertyTypeArray` in favor of a separate bool `array` property on - `RLMProperty`/`Property`. -* Remove `RLMSyncPermissionResults`. `RLMSyncPermission`s are now vended out - using a `RLMResults`. This results collection supports all normal collection - operations except for setting values using KVO (since `RLMSyncPermission`s are - immutable) and the property aggregation operations. -* `RealmCollection`'s associated type `Element` has been renamed `ElementType`. -* Realm Swift collection types (`List`, `Results`, `AnyRealmCollection`, and - `LinkingObjects` have had their generic type parameter changed from `T` to - `Element`). -* `RealmOptional`'s generic type parameter has been changed from `T` to `Value`. -* `RLMSyncUserInfo` has been significantly enhanced. It now contains metadata - about a user stored on the Realm Object Server, as well as a list of all user account - data associated with that user. -* Starting with Swift 4, `List` now conforms to `MutableCollection` instead of - `RangeReplaceableCollection`. For Swift 4, the empty collection initializer has been - removed, and default implementations of range replaceable collection methods that - make sense for `List` have been added. -* `List.removeLast()` now throws an exception if the list is empty, to more closely match - the behavior of the standard library's `Collection.removeLast()` implementation. - -### Enhancements - -* `List` can now contain values of types `Bool`, `Int`, `Int8`, `Int16`, - `Int32`, `Int64`, `Float`, `Double`, `String`, `Data`, and `Date` (and - optional versions of all of these) in addition to `Object` subclasses. - Querying `List`s containing values other than `Object` subclasses is not yet - implemented. -* `RLMArray` can now be constrained with the protocols `RLMBool`, `RLMInt`, - `RLMFloat`, `RLMDouble`, `RLMString`, `RLMData`, and `RLMDate` in addition to - protocols defined with `RLM_ARRAY_TYPE`. By default `RLMArray`s of - non-`RLMObject` types can contain null. Indicating that the property is - required (by overriding `+requiredProperties:`) will instead make the values - within the array required. Querying `RLMArray`s containing values other than - `RLMObject` subclasses is not yet implemented. -* Opening a synced Realm whose local copy was created with an older version of - Realm Mobile Platfrom when a migration is not possible to the current version - will result in an `RLMErrorIncompatibleSyncedFile` / `incompatibleSyncedFile` - error. When such an error occurs, the original file is moved to a backup - location, and future attempts to open the synchronized Realm will result in a new - file being created. If you wish to migrate any data from the backup Realm you can - open it using the backup Realm configuration available on the error object. -* Add preview support for partial synchronization. Partial synchronization is - allows a synchronized Realm to be opened in such a way that only objects - requested by the user are synchronized to the device. You can use it by setting - the `isPartial` property on a `SyncConfiguration`, opening the Realm, and then - calling `Realm.subscribe(to:where:callback:)` with the type of object you're - interested in, a string containing a query determining which objects you want - to subscribe to, and a callback which will report the results. You may add as - many subscriptions to a synced Realm as necessary. - -### Bugfixes - -* Realm Swift APIs that filter or look up the index of an object based on a - format string now properly handle optional arguments in their variadic argument - list. - -3.0.0-beta.3 Release notes (2017-08-23) -============================================================= - -### Breaking Changes - -* iOS 7 is no longer supported. -* Computed properties on Realm object types are detected and no - longer added to the automatically generated schema. -* `-[RLMRealm addOrUpdateObjectsInArray:]` has been renamed to - `-[RLMRealm addOrUpdateObjects:]` for consistency with similar methods - that add or delete objects. -* `-[RLMRealm addOrUpdateObjects:]` and `-[RLMRealm deleteObjects:]` now - require their argument to conform to `NSFastEnumeration`, to match similar - APIs that also take collections. -* Remove deprecated `{RLM}SyncPermission` and `{RLM}SyncPermissionChange` - classes. -* `{RLM}SyncPermissionValue` has been renamed to just `{RLM}SyncPermission`. - Its `userId` property has been renamed `identity`, and its - `-initWithRealmPath:userID:accessLevel:` initializer has been renamed - `-initWithRealmPath:identity:accessLevel:`. -* Remove deprecated `-[RLMSyncUser permissionRealmWithError:]` and - `SyncUser.permissionRealm()` APIs. Use the new permissions system. -* Remove deprecated error `RLMSyncErrorBadResponse`. Use - `RLMSyncAuthErrorBadResponse` instead. -* The way interactive sync errors (client reset and permission denied) - are delivered to the user has been changed. Instead of a block which can - be invoked to immediately delete the offending Realm file, an opaque - token object of type `RLMSyncErrorActionToken` will be returned in the - error object's `userInfo` dictionary. This error object can be passed - into the new `+[RLMSyncSession immediatelyHandleError:]` API to delete - the files. -* Remove `-[NSError rlmSync_clientResetBlock]` and - `-[NSError rlmSync_deleteRealmBlock]` APIs. -* The return types of the `SyncError.clientResetInfo()` and - `SyncError.deleteRealmUserInfo()` APIs have been changed. They now return - `RLMSyncErrorActionToken`s or `SyncError.ActionToken`s instead of closures. -* The (erroneously added) instance property `Object.className` has been - removed. -* The class methods `Object.className()`, `Object.objectUtilClass()`, and - the property `Object.isInvalidated` can no longer be overriden. -* The callback which runs when a sync user login succeeds or fails - now runs on the main queue by default, or can be explicitly specified - by a new `callbackQueue` parameter on the `{RLM}SyncUser.logIn(...)` API. -* Rename `{RLM}NotificationToken.stop()` to `invalidate()` and - `{RealmCollection,SyncPermissionResults}.addNotificationBlock(_:)` to - `observe(_:)` to mirror Foundation's new KVO APIs. -* The `RLMSyncProgress` enum has been renamed `RLMSyncProgressMode`. -* Remove deprecated `{RLM}SyncManager.disableSSLValidation` property. Disable - SSL validation on a per-Realm basis by setting the `enableSSLValidation` - property on `{RLM}SyncConfiguration` instead. -* Fix empty strings, binary data, and null on the right side of `BEGINSWITH`, - `ENDSWITH` and `CONTAINS` operators in predicates to match Foundation's - semantics of never matching any strings or data. -* Swift `Object` comparison and hashing behavior now works the same way as - that of `RLMObject` (objects are now only considered equatable if their - model class defines a primary key). -* Fix the way the hash property works on `Object` when the object model has - no primary key. -* Fix an issue where if a Swift model class defined non-generic managed - properties after generic Realm properties (like `List`), the schema - would be constructed incorrectly. Fixes an issue where creating such - models from an array could fail. - -### Enhancements - -* Add Swift `Object.isSameObject(as:_)` API to perform the same function as - the existing Objective-C API `-[RLMObject isEqualToObject:]`. -* Expose additional authentication-related errors that might be reported by - a Realm Object Server. -* An error handler can now be registered on `{RLM}SyncUser`s in order to - report authentication-related errors that affect the user. - -### Bugfixes - -* Sync users are now automatically logged out upon receiving certain types - of errors that indicate they are no longer logged into the server. For - example, users who are authenticated using third-party credentials will find - themselves logged out of the Realm Object Server if the third-party identity - service indicates that their credential is no longer valid. -* Address high CPU usage and hangs in certain cases when processing collection - notifications in highly-connected object graphs. - -3.0.0-beta.2 Release notes (2017-07-26) -============================================================= - -### Breaking Changes - -* Remove the following deprecated Objective-C APIs: - `-[RLMArray sortedResultsUsingProperty:ascending:]`, - `-[RLMCollection sortedResultsUsingProperty:ascending:]`, - `-[RLMResults sortedResultsUsingProperty:ascending:]`, - `+[RLMSortDescriptor sortDescriptorWithProperty:ascending:]`, - `RLMSortDescriptor.property`. - These APIs have been superseded by equivalent APIs that take - or return key paths instead of property names. -* Remove the following deprecated Objective-C API: - `+[RLMRealm migrateRealm:configuration:]`. - Please use `+[RLMRealm performMigrationForConfiguration:error:]` instead. -* Remove the following deprecated Swift APIs: - `AnyRealmCollection.sorted(byProperty:, ascending:)`, - `LinkingObjects.sorted(byProperty:, ascending:)`, - `List.sorted(byProperty:, ascending:)`, - `Results.sorted(byProperty:, ascending:)`, - `SortDescriptor.init(property:, ascending:)`, - `SortDescriptor.property`. - These APIs have been superseded by equivalent APIs that take - or return key paths instead of property names. -* The Objective-C and Swift `create(_:, value: update:)` APIs now - correctly nil out nullable properties when updating an existing - object when the `value` argument specifies nil or `NSNull` for - the property value. - -### Enhancements - -* It is now possible to create and log in multiple Realm Object Server users - with the same identity if they originate from different servers. Note that - if the URLs are different aliases for the same authentication server each - user will still be treated as separate (e.g. they will have their own copy - of each synchronized Realm opened using them). It is highly encouraged that - users defined using the access token credential type be logged in with an - authentication server URL specified; this parameter will become mandatory - in a future version of the SDK. -* Add `-[RLMSyncUser retrieveInfoForUser:identityProvider:completion:]` - API allowing administrator users to retrieve information about a user based - on their provider identity (for example, a username). Requires any edition - of the Realm Object Server 1.8.2 or later. - -### Bugfixes - -* Realm no longer throws an "unsupported instruction" exception in some cases - when opening a synced Realm asynchronously. - -3.0.0-beta Release notes (2017-07-14) -============================================================= - -### Breaking Changes - -* Synchronized Realms require a server running Realm Object Server v2.0 or higher. - -### Enhancements - -* Add a new error code to denote 'permission denied' errors when working - with synchronized Realms, as well as an accompanying block that can be - called to inform the binding that the offending Realm's files should be - deleted immediately. This allows recovering from 'permission denied' - errors in a more robust manner. See the documentation for - `RLMSyncErrorPermissionDeniedError` for more information. -* Add `-[RLMSyncPermissionValue initWithRealmPath:username:accessLevel:]` - API allowing permissions to be applied to a user based on their username - (usually, an email address). Requires any edition of the Realm Object - Server 1.6.0 or later. -* Improve performance of creating Swift objects which contain at least one List - property. - -### Bugfixes - -* `List.description` now reports the correct types for nested lists. -* Fix unmanaged object initialization when a nested property type returned - `false` from `Object.shouldIncludeInDefaultSchema()`. -* Don't clear RLMArrays on self-assignment. - -2.10.2 Release notes (2017-09-27) -============================================================= - -### Bugfixes - -* The keychain item name used by Realm to manage the encryption keys for - sync-related metadata is now set to a per-app name based on the bundle - identifier. Keys that were previously stored within the single, shared Realm - keychain item will be transparently migrated to the per-application keychain - item. -* Fix downloading of the Realm core binaries when Xcode's command-line tools are - set as the active developer directory for command-line interactions. -* Fix a crash that could occur when resolving a ThreadSafeReference to a `List` - whose parent object had since been deleted. - -2.10.1 Release notes (2017-09-14) -============================================================= - -Swift binaries are now produced for Swift 3.0, 3.0.1, 3.0.2, 3.1, 3.2 and 4.0. - -### Enhancements - -* Auxiliary files are excluded from backup by default. - -### Bugfixes - -* Fix more cases where assigning an RLMArray property to itself would clear the - RLMArray. - -2.10.0 Release notes (2017-08-21) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Expose additional authentication-related errors that might be reported by - a Realm Object Server. -* An error handler can now be registered on `{RLM}SyncUser`s in order to - report authentication-related errors that affect the user. - -### Bugfixes - -* Sorting Realm collection types no longer throws an exception on iOS 7. -* Sync users are now automatically logged out upon receiving certain types - of errors that indicate they are no longer logged into the server. For - example, users who are authenticated using third-party credentials will find - themselves logged out of the Realm Object Server if the third-party identity - service indicates that their credential is no longer valid. -* Address high CPU usage and hangs in certain cases when processing collection - notifications in highly-connected object graphs. - -2.9.1 Release notes (2017-08-01) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* The `shouldCompactOnLaunch` block is no longer invoked if the Realm at that - path is already open on other threads. -* Fix an assertion failure in collection notifications when changes are made to - the schema via sync while the notification block is active. - -2.9.0 Release notes (2017-07-26) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Add a new error code to denote 'permission denied' errors when working - with synchronized Realms, as well as an accompanying block that can be - called to inform the binding that the offending Realm's files should be - deleted immediately. This allows recovering from 'permission denied' - errors in a more robust manner. See the documentation for - `RLMSyncErrorPermissionDeniedError` for more information. -* Add `-[RLMSyncPermissionValue initWithRealmPath:username:accessLevel:]` - API allowing permissions to be applied to a user based on their username - (usually, an email address). Requires any edition of the Realm Object - Server 1.6.0 or later. -* Improve performance of creating Swift objects which contain at least one List - property. -* It is now possible to create and log in multiple Realm Object Server users - with the same identity if they originate from different servers. Note that - if the URLs are different aliases for the same authentication server each - user will still be treated as separate (e.g. they will have their own copy - of each synchronized Realm opened using them). It is highly encouraged that - users defined using the access token credential type be logged in with an - authentication server URL specified; this parameter will become mandatory - in a future version of the SDK. -* Add `-[RLMSyncUser retrieveInfoForUser:identityProvider:completion:]` - API allowing administrator users to retrieve information about a user based - on their provider identity (for example, a username). Requires any edition - of the Realm Object Server 1.8.2 or later. - -### Bugfixes - -* `List.description` now reports the correct types for nested lists. -* Fix unmanaged object initialization when a nested property type returned - `false` from `Object.shouldIncludeInDefaultSchema()`. -* Don't clear RLMArrays on self-assignment. - -2.8.3 Release notes (2017-06-20) -============================================================= - -### Bugfixes - -* Properly update RealmOptional properties when adding an object with `add(update: true)`. -* Add some missing quotes in error messages. -* Fix a performance regression when creating objects with primary keys. - -2.8.2 Release notes (2017-06-16) -============================================================= - -### Bugfixes - -* Fix an issue where synchronized Realms would eventually disconnect from the - remote server if the user object used to define their sync configuration - was destroyed. -* Restore support for changing primary keys in migrations (broken in 2.8.0). -* Revert handling of adding objects with nil properties to a Realm to the - pre-2.8.0 behavior. - -2.8.1 Release notes (2017-06-12) -============================================================= - -Add support for building with Xcode 9 Beta 1. - -### Bugfixes - -* Fix setting a float property to NaN. -* Fix a crash when using compact on launch in combination with collection - notifications. - -2.8.0 Release notes (2017-06-02) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Enable encryption on watchOS. -* Add `-[RLMSyncUser changePassword:forUserID:completion:]` API to change an - arbitrary user's password if the current user has administrative privileges - and using Realm's 'password' authentication provider. - Requires any edition of the Realm Object Server 1.6.0 or later. - -### Bugfixes - -* Suppress `-Wdocumentation` warnings in Realm C++ headers when using CocoaPods - with Xcode 8.3.2. -* Throw an appropriate error rather than crashing when an RLMArray is assigned - to an RLMArray property of a different type. -* Fix crash in large (>4GB) encrypted Realm files. -* Improve accuracy of sync progress notifications. -* Fix an issue where synchronized Realms did not connect to the remote server - in certain situations, such as when an application was offline when the Realms - were opened but later regained network connectivity. - -2.7.0 Release notes (2017-05-03) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Use reachability API to minimize the reconnection delay if the network - connection was lost. -* Add `-[RLMSyncUser changePassword:completion:]` API to change the current - user's password if using Realm's 'password' authentication provider. - Requires any edition of the Realm Object Server 1.4.0 or later. -* `{RLM}SyncConfiguration` now has an `enableSSLValidation` property - (and default parameter in the Swift initializer) to allow SSL validation - to be specified on a per-server basis. -* Transactions between a synced Realm and a Realm Object Server can now - exceed 16 MB in size. -* Add new APIs for changing and retrieving permissions for synchronized Realms. - These APIs are intended to replace the existing Realm Object-based permissions - system. Requires any edition of the Realm Object Server 1.1.0 or later. - -### Bugfixes - -* Support Realm model classes defined in Swift with overridden Objective-C - names (e.g. `@objc(Foo) class SwiftFoo: Object {}`). -* Fix `-[RLMMigration enumerateObjects:block:]` returning incorrect `oldObject` - objects when enumerating a class name after previously deleting a `newObject`. -* Fix an issue where `Realm.asyncOpen(...)` would fail to work when opening a - synchronized Realm for which the user only had read permissions. -* Using KVC to set a `List` property to `nil` now clears it to match the - behavior of `RLMArray` properties. -* Fix crash from `!m_awaiting_pong` assertion failure when using synced Realms. -* Fix poor performance or hangs when performing case-insensitive queries on - indexed string properties that contain many characters that don't differ - between upper and lower case (e.g., numbers, punctuation). - -2.6.2 Release notes (2017-04-21) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix an issue where calling `Realm.asyncOpen(...)` with a synchronized Realm - configuration would fail with an "Operation canceled" error. -* Fix initial collection notification sometimes not being delivered for synced - Realms. -* Fix circular links sometimes resulting in objects not being marked as - modified in change notifications. - -2.6.1 Release notes (2017-04-18) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix an issue where calling `Realm.asyncOpen(...)` with a synchronized Realm - configuration would crash in error cases rather than report the error. - This is a small source breaking change if you were relying on the error - being reported to be a `Realm.Error`. - -2.6.0 Release notes (2017-04-18) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Add a `{RLM}SyncUser.isAdmin` property indicating whether a user is a Realm - Object Server administrator. -* Add an API to asynchronously open a Realm and deliver it to a block on a - given queue. This performs all work needed to get the Realm to - a usable state (such as running potentially time-consuming migrations) on a - background thread before dispatching to the given queue. In addition, - synchronized Realms wait for all remote content available at the time the - operation began to be downloaded and available locally. -* Add `shouldCompactOnLaunch` block property when configuring a Realm to - determine if it should be compacted before being returned. -* Speed up case-insensitive queries on indexed string properties. -* Add RLMResults's collection aggregate methods to RLMArray. -* Add support for calling the aggregate methods on unmanaged Lists. - -### Bugfixes - -* Fix a deadlock when multiple processes open a Realm at the same time. -* Fix `value(forKey:)`/`value(forKeyPath:)` returning incorrect values for `List` properties. - -2.5.1 Release notes (2017-04-05) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix CocoaPods installation with static libraries and multiple platforms. -* Fix uncaught "Bad version number" exceptions on the notification worker thread - followed by deadlocks when Realms refresh. - -2.5.0 Release notes (2017-03-28) -============================================================= - -Files written by Realm this version cannot be read by earlier versions of Realm. -Old files can still be opened and files open in read-only mode will not be -modified. - -If using synchronized Realms, the Realm Object Server must be running version -1.3.0 or later. - -Swift binaries are now produced for Swift 3.0, 3.0.1, 3.0.2 and 3.1. - -### API Breaking Changes - -* None. - -### Enhancements - -* Add support for multi-level object equality comparisons against `NULL`. -* Add support for the `[d]` modifier on string comparison operators to perform - diacritic-insensitive comparisons. -* Explicitly mark `[[RLMRealm alloc] init]` as unavailable. -* Include the name of the problematic class in the error message when an - invalid property type is marked as the primary key. - -### Bugfixes - -* Fix incorrect column type assertions which could occur after schemas were - merged by sync. -* Eliminate an empty write transaction when opening a synced Realm. -* Support encrypting synchronized Realms by respecting the `encryptionKey` value - of the Realm's configuration. -* Fix crash when setting an `{NS}Data` property close to 16MB. -* Fix for reading `{NS}Data` properties incorrectly returning `nil`. -* Reduce file size growth in cases where Realm versions were pinned while - starting write transactions. -* Fix an assertion failure when writing to large `RLMArray`/`List` properties. -* Fix uncaught `BadTransactLog` exceptions when pulling invalid changesets from - synchronized Realms. -* Fix an assertion failure when an observed `RLMArray`/`List` is deleted after - being modified. - -2.4.4 Release notes (2017-03-13) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Add `(RLM)SyncPermission` class to allow reviewing access permissions for - Realms. Requires any edition of the Realm Object Server 1.1.0 or later. -* Further reduce the number of files opened per thread-specific Realm on macOS, - iOS and watchOS. - -### Bugfixes - -* Fix a crash that could occur if new Realm instances were created while the - application was exiting. -* Fix a bug that could lead to bad version number errors when delivering - change notifications. -* Fix a potential use-after-free bug when checking validity of results. -* Fix an issue where a sync session might not close properly if it receives - an error while being torn down. -* Fix some issues where a sync session might not reconnect to the server properly - or get into an inconsistent state if revived after invalidation. -* Fix an issue where notifications might not fire when the children of an - observed object are changed. -* Fix an issue where progress notifications on sync sessions might incorrectly - report out-of-date values. -* Fix an issue where multiple threads accessing encrypted data could result in - corrupted data or crashes. -* Fix an issue where certain `LIKE` queries could hang. -* Fix an issue where `-[RLMRealm writeCopyToURL:encryptionKey:error]` could create - a corrupt Realm file. -* Fix an issue where incrementing a synced Realm's schema version without actually - changing the schema could cause a crash. - -2.4.3 Release notes (2017-02-20) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Avoid copying copy-on-write data structures, which can grow the file, when the - write does not actually change existing values. -* Improve performance of deleting all objects in an RLMResults. -* Reduce the number of files opened per thread-specific Realm on macOS. -* Improve startup performance with large numbers of `RLMObject`/`Object` - subclasses. - -### Bugfixes - -* Fix synchronized Realms not downloading remote changes when an access token - expires and there are no local changes to upload. -* Fix an issue where values set on a Realm object using `setValue(value:, forKey:)` - that were not themselves Realm objects were not properly converted into Realm - objects or checked for validity. -* Fix an issue where `-[RLMSyncUser sessionForURL:]` could erroneously return a - non-nil value when passed in an invalid URL. -* `SyncSession.Progress.fractionTransferred` now returns 1 if there are no - transferrable bytes. -* Fix sync progress notifications registered on background threads by always - dispatching on a dedicated background queue. -* Fix compilation issues with Xcode 8.3 beta 2. -* Fix incorrect sync progress notification values for Realms originally created - using a version of Realm prior to 2.3.0. -* Fix LLDB integration to be able to display summaries of `RLMResults` once more. -* Reject Swift properties with names which cause them to fall in to ARC method - families rather than crashing when they are accessed. -* Fix sorting by key path when the declared property order doesn't match the order - of properties in the Realm file, which can happen when properties are added in - different schema versions. - -2.4.2 Release notes (2017-01-30) -============================================================= - -### Bugfixes - -* Fix an issue where RLMRealm instances could end up in the autorelease pool - for other threads. - -2.4.1 Release notes (2017-01-27) -============================================================= - -### Bugfixes - -* Fix an issue where authentication tokens were not properly refreshed - automatically before expiring. - -2.4.0 Release notes (2017-01-26) -============================================================= - -This release drops support for compiling with Swift 2.x. -Swift 3.0.0 is now the minimum Swift version supported. - -### API Breaking Changes - -* None. - -### Enhancements - -* Add change notifications for individual objects with an API similar to that - of collection notifications. - -### Bugfixes - -* Fix Realm Objective-C compilation errors with Xcode 8.3 beta 1. -* Fix several error handling issues when renewing expired authentication - tokens for synchronized Realms. -* Fix a race condition leading to bad_version exceptions being thrown in - Realm's background worker thread. - -2.3.0 Release notes (2017-01-19) -============================================================= - -### Sync Breaking Changes - -* Make `PermissionChange`'s `id` property a primary key. - -### API Breaking Changes - -* None. - -### Enhancements - -* Add `SyncPermissionOffer` and `SyncPermissionOfferResponse` classes to allow - creating and accepting permission change events to synchronized Realms between - different users. -* Support monitoring sync transfer progress by registering notification blocks - on `SyncSession`. Specify the transfer direction (`.upload`/`.download`) and - mode (`.reportIndefinitely`/`.forCurrentlyOutstandingWork`) to monitor. - -### Bugfixes - -* Fix a call to `commitWrite(withoutNotifying:)` committing a transaction that - would not have triggered a notification incorrectly skipping the next - notification. -* Fix incorrect results and crashes when conflicting object insertions are - merged by the synchronization mechanism when there is a collection - notification registered for that object type. - -2.2.0 Release notes (2017-01-12) -============================================================= - -### Sync Breaking Changes (In Beta) - -* Sync-related error reporting behavior has been changed. Errors not related - to a particular user or session are only reported if they are classed as - 'fatal' by the underlying sync engine. -* Added `RLMSyncErrorClientResetError` to `RLMSyncError` enum. - -### API Breaking Changes - -* The following Objective-C APIs have been deprecated in favor of newer or preferred versions: - -| Deprecated API | New API | -|:------------------------------------------------------------|:------------------------------------------------------------| -| `-[RLMArray sortedResultsUsingProperty:]` | `-[RLMArray sortedResultsUsingKeyPath:]` | -| `-[RLMCollection sortedResultsUsingProperty:]` | `-[RLMCollection sortedResultsUsingKeyPath:]` | -| `-[RLMResults sortedResultsUsingProperty:]` | `-[RLMResults sortedResultsUsingKeyPath:]` | -| `+[RLMSortDescriptor sortDescriptorWithProperty:ascending]` | `+[RLMSortDescriptor sortDescriptorWithKeyPath:ascending:]` | -| `RLMSortDescriptor.property` | `RLMSortDescriptor.keyPath` | - -* The following Swift APIs have been deprecated in favor of newer or preferred versions: - -| Deprecated API | New API | -|:------------------------------------------------------|:-------------------------------------------------| -| `LinkingObjects.sorted(byProperty:ascending:)` | `LinkingObjects.sorted(byKeyPath:ascending:)` | -| `List.sorted(byProperty:ascending:)` | `List.sorted(byKeyPath:ascending:)` | -| `RealmCollection.sorted(byProperty:ascending:)` | `RealmCollection.sorted(byKeyPath:ascending:)` | -| `Results.sorted(byProperty:ascending:)` | `Results.sorted(byKeyPath:ascending:)` | -| `SortDescriptor(property:ascending:)` | `SortDescriptor(keyPath:ascending:)` | -| `SortDescriptor.property` | `SortDescriptor.keyPath` | - -### Enhancements - -* Introduce APIs for safely passing objects between threads. Create a - thread-safe reference to a thread-confined object by passing it to the - `+[RLMThreadSafeReference referenceWithThreadConfined:]`/`ThreadSafeReference(to:)` - constructor, which you can then safely pass to another thread to resolve in - the new Realm with `-[RLMRealm resolveThreadSafeReference:]`/`Realm.resolve(_:)`. -* Realm collections can now be sorted by properties over to-one relationships. -* Optimized `CONTAINS` queries to use Boyer-Moore algorithm - (around 10x speedup on large datasets). - -### Bugfixes - -* Setting `deleteRealmIfMigrationNeeded` now also deletes the Realm if a file - format migration is required, such as when moving from a file last accessed - with Realm 0.x to 1.x, or 1.x to 2.x. -* Fix queries containing nested `SUBQUERY` expressions. -* Fix spurious incorrect thread exceptions when a thread id happens to be - reused while an RLMRealm instance from the old thread still exists. -* Fixed various bugs in aggregate methods (max, min, avg, sum). - -2.1.2 Release notes (2016--12-19) -============================================================= - -This release adds binary versions of Swift 3.0.2 frameworks built with Xcode 8.2. - -### Sync Breaking Changes (In Beta) - -* Rename occurences of "iCloud" with "CloudKit" in APIs and comments to match - naming in the Realm Object Server. - -### API Breaking Changes - -* None. - -### Enhancements - -* Add support for 'LIKE' queries (wildcard matching). - -### Bugfixes - -* Fix authenticating with CloudKit. -* Fix linker warning about "Direct access to global weak symbol". - -2.1.1 Release notes (2016-12-02) -============================================================= - -### Enhancements - -* Add `RealmSwift.ObjectiveCSupport.convert(object:)` methods to help write - code that interoperates between Realm Objective-C and Realm Swift APIs. -* Throw exceptions when opening a Realm with an incorrect configuration, like: - * `readOnly` set with a sync configuration. - * `readOnly` set with a migration block. - * migration block set with a sync configuration. -* Greatly improve performance of write transactions which make a large number of - changes to indexed properties, including the automatic migration when opening - files written by Realm 1.x. - -### Bugfixes - -* Reset sync metadata Realm in case of decryption error. -* Fix issue preventing using synchronized Realms in Xcode Playgrounds. -* Fix assertion failure when migrating a model property from object type to - `RLMLinkingObjects` type. -* Fix a `LogicError: Bad version number` exception when using `RLMResults` with - no notification blocks and explicitly called `-[RLMRealm refresh]` from that - thread. -* Logged-out users are no longer returned from `+[RLMSyncUser currentUser]` or - `+[RLMSyncUser allUsers]`. -* Fix several issues which could occur when the 1001st object of a given type - was created or added to an RLMArray/List, including crashes when rerunning - existing queries and possibly data corruption. -* Fix a potential crash when the application exits due to a race condition in - the destruction of global static variables. -* Fix race conditions when waiting for sync uploads or downloads to complete - which could result in crashes or the callback being called too early. - -2.1.0 Release notes (2016-11-18) -============================================================= - -### Sync Breaking Changes (In Beta) - -* None. - -### API breaking changes - -* None. - -### Enhancements - -* Add the ability to skip calling specific notification blocks when committing - a write transaction. - -### Bugfixes - -* Deliver collection notifications when beginning a write transaction which - advances the read version of a Realm (previously only Realm-level - notifications were sent). -* Fix some scenarios which would lead to inconsistent states when using - collection notifications. -* Fix several race conditions in the notification functionality. -* Don't send Realm change notifications when canceling a write transaction. - -2.0.4 Release notes (2016-11-14) -============================================================= - -### Sync Breaking Changes (In Beta) - -* Remove `RLMAuthenticationActions` and replace - `+[RLMSyncCredential credentialWithUsername:password:actions:]` with - `+[RLMSyncCredential credentialsWithUsername:password:register:]`. -* Rename `+[RLMSyncUser authenticateWithCredential:]` to - `+[RLMSyncUser logInWithCredentials:]`. -* Rename "credential"-related types and methods to - `RLMSyncCredentials`/`SyncCredentials` and consistently refer to credentials - in the plural form. -* Change `+[RLMSyncUser all]` to return a dictionary of identifiers to users and - rename to: - * `+[RLMSyncUser allUsers]` in Objective-C. - * `SyncUser.allUsers()` in Swift 2. - * `SyncUser.all` in Swift 3. -* Rename `SyncManager.sharedManager()` to `SyncManager.shared` in Swift 3. -* Change `Realm.Configuration.syncConfiguration` to take a `SyncConfiguration` - struct rather than a named tuple. -* `+[RLMSyncUser logInWithCredentials:]` now invokes its callback block on a - background queue. - -### API breaking changes - -* None. - -### Enhancements - -* Add `+[RLMSyncUser currentUser]`. -* Add the ability to change read, write and management permissions for - synchronized Realms using the management Realm obtained via the - `-[RLMSyncUser managementRealmWithError:]` API and the - `RLMSyncPermissionChange` class. - -### Bugfixes - -* None. - -2.0.3 Release notes (2016-10-27) -============================================================= - -This release adds binary versions of Swift 3.0.1 frameworks built with Xcode 8.1 -GM seed. - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix a `BadVersion` exception caused by a race condition when delivering - collection change notifications. -* Fix an assertion failure when additional model classes are added and - `deleteRealmIfMigrationNeeded` is enabled. -* Fix a `BadTransactLog` exception when deleting an `RLMResults` in a synced - Realm. -* Fix an assertion failure when a write transaction is in progress at the point - of process termination. -* Fix a crash that could occur when working with a `RLMLinkingObject` property - of an unmanaged object. - -2.0.2 Release notes (2016-10-05) -============================================================= - -This release is not protocol-compatible with previous version of the Realm -Mobile Platform. - -### API breaking changes - -* Rename Realm Swift's `User` to `SyncUser` to make clear that it relates to the - Realm Mobile Platform, and to avoid potential conflicts with other `User` types. - -### Bugfixes - -* Fix Realm headers to be compatible with pre-C++11 dialects of Objective-C++. -* Fix incorrect merging of RLMArray/List changes when objects with the same - primary key are created on multiple devices. -* Fix bad transaction log errors after deleting objects on a different device. -* Fix a BadVersion error when a background worker finishes running while older - results from that worker are being delivered to a different thread. - -2.0.1 Release notes (2016-09-29) -============================================================= - -### Bugfixes - -* Fix an assertion failure when opening a Realm file written by a 1.x version - of Realm which has an indexed nullable int or bool property. - -2.0.0 Release notes (2016-09-27) -============================================================= - -This release introduces support for the Realm Mobile Platform! -See for an overview -of these great new features. - -### API breaking changes - -* By popular demand, `RealmSwift.Error` has been moved from the top-level - namespace into a `Realm` extension and is now `Realm.Error`, so that it no - longer conflicts with `Swift.Error`. -* Files written by Realm 2.0 cannot be read by 1.x or earlier versions. Old - files can still be opened. - -### Enhancements - -* The .log, .log_a and .log_b files no longer exist and the state tracked in - them has been moved to the main Realm file. This reduces the number of open - files needed by Realm, improves performance of both opening and writing to - Realms, and eliminates a small window where committing write transactions - would prevent other processes from opening the file. - -### Bugfixes - -* Fix an assertion failure when sorting by zero properties. -* Fix a mid-commit crash in one process also crashing all other processes with - the same Realm open. -* Properly initialize new nullable float and double properties added to - existing objects to null rather than 0. -* Fix a stack overflow when objects with indexed string properties had very - long common prefixes. -* Fix a race condition which could lead to crashes when using async queries or - collection notifications. -* Fix a bug which could lead to incorrect state when an object which links to - itself is deleted from the Realm. - -1.1.0 Release notes (2016-09-16) -============================================================= - -This release brings official support for Xcode 8, Swift 2.3 and Swift 3.0. -Prebuilt frameworks are now built with Xcode 7.3.1 and Xcode 8.0. - -### API breaking changes - -* Deprecate `migrateRealm:` in favor of new `performMigrationForConfiguration:error:` method - that follows Cocoa's NSError conventions. -* Fix issue where `RLMResults` used `id `instead of its generic type as the return - type of subscript. - -### Enhancements - -* Improve error message when using NSNumber incorrectly in Swift models. -* Further reduce the download size of the prebuilt static libraries. -* Improve sort performance, especially on non-nullable columns. -* Allow partial initialization of object by `initWithValue:`, deferring - required property checks until object is added to Realm. - -### Bugfixes - -* Fix incorrect truncation of the constant value for queries of the form - `column < value` for `float` and `double` columns. -* Fix crash when an aggregate is accessed as an `Int8`, `Int16`, `Int32`, or `Int64`. -* Fix a race condition that could lead to a crash if an RLMArray or List was - deallocated on a different thread than it was created on. -* Fix a crash when the last reference to an observed object is released from - within the observation. -* Fix a crash when `initWithValue:` is used to create a nested object for a class - with an uninitialized schema. -* Enforce uniqueness for `RealmOptional` primary keys when using the `value` setter. - -1.0.2 Release notes (2016-07-13) -============================================================= - -### API breaking changes - -* Attempting to add an object with no properties to a Realm now throws rather than silently - doing nothing. - -### Enhancements - -* Swift: A `write` block may now `throw`, reverting any changes already made in - the transaction. -* Reduce address space used when committing write transactions. -* Significantly reduce the download size of prebuilt binaries and slightly - reduce the final size contribution of Realm to applications. -* Improve performance of accessing RLMArray properties and creating objects - with List properties. - -### Bugfixes - -* Fix a crash when reading the shared schema from an observed Swift object. -* Fix crashes or incorrect results when passing an array of values to - `createOrUpdate` after reordering the class's properties. -* Ensure that the initial call of a Results notification block is always passed - .Initial even if there is a write transaction between when the notification - is added and when the first notification is delivered. -* Fix a crash when deleting all objects in a Realm while fast-enumerating query - results from that Realm. -* Handle EINTR from flock() rather than crashing. -* Fix incorrect behavior following a call to `[RLMRealm compact]`. -* Fix live updating and notifications for Results created from a predicate involving - an inverse relationship to be triggered when an object at the other end of the relationship - is modified. - -1.0.1 Release notes (2016-06-12) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Significantly improve performance of opening Realm files, and slightly - improve performance of committing write transactions. - -### Bugfixes - -* Swift: Fix an error thrown when trying to create or update `Object` instances via - `add(:_update:)` with a primary key property of type `RealmOptional`. -* Xcode playground in Swift release zip now runs successfully. -* The `key` parameter of `Realm.objectForPrimaryKey(_:key:)`/ `Realm.dynamicObjectForPrimaryKey(_:key:)` - is now marked as optional. -* Fix a potential memory leak when closing Realms after a Realm file has been - opened on multiple threads which are running in active run loops. -* Fix notifications breaking on tvOS after a very large number of write - transactions have been committed. -* Fix a "Destruction of mutex in use" assertion failure after an error while - opening a file. -* Realm now throws an exception if an `Object` subclass is defined with a managed Swift `lazy` property. - Objects with ignored `lazy` properties should now work correctly. -* Update the LLDB script to work with recent changes to the implementation of `RLMResults`. -* Fix an assertion failure when a Realm file is deleted while it is still open, - and then a new Realm is opened at the same path. Note that this is still not - a supported scenario, and may break in other ways. - -1.0.0 Release notes (2016-05-25) -============================================================= - -No changes since 0.103.2. - -0.103.2 Release notes (2016-05-24) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Improve the error messages when an I/O error occurs in `writeCopyToURL`. - -### Bugfixes - -* Fix an assertion failure which could occur when opening a Realm after opening - that Realm failed previously in some specific ways in the same run of the - application. -* Reading optional integers, floats, and doubles from within a migration block - now correctly returns `nil` rather than 0 when the stored value is `nil`. - -0.103.1 Release notes (2016-05-19) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix a bug that sometimes resulted in a single object's NSData properties - changing from `nil` to a zero-length non-`nil` NSData when a different object - of the same type was deleted. - -0.103.0 Release notes (2016-05-18) -============================================================= - -### API breaking changes - -* All functionality deprecated in previous releases has been removed entirely. -* Support for Xcode 6.x & Swift prior to 2.2 has been completely removed. -* `RLMResults`/`Results` now become empty when a `RLMArray`/`List` or object - they depend on is deleted, rather than throwing an exception when accessed. -* Migrations are no longer run when `deleteRealmIfMigrationNeeded` is set, - recreating the file instead. - -### Enhancements - -* Added `invalidated` properties to `RLMResults`/`Results`, `RLMLinkingObjects`/`LinkingObjects`, - `RealmCollectionType` and `AnyRealmCollection`. These properties report whether the Realm - the object is associated with has been invalidated. -* Some `NSError`s created by Realm now have more descriptive user info payloads. - -### Bugfixes - -* None. - -0.102.1 Release notes (2016-05-13) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Return `RLMErrorSchemaMismatch` error rather than the more generic `RLMErrorFail` - when a migration is required. -* Improve the performance of allocating instances of `Object` subclasses - that have `LinkingObjects` properties. - -### Bugfixes - -* `RLMLinkingObjects` properties declared in Swift subclasses of `RLMObject` - now work correctly. -* Fix an assertion failure when deleting all objects of a type, inserting more - objects, and then deleting some of the newly inserted objects within a single - write transaction when there is an active notification block for a different - object type which links to the objects being deleted. -* Fix crashes and/or incorrect results when querying over multiple levels of - `LinkingObjects` properties. -* Fix opening read-only Realms on multiple threads at once. -* Fix a `BadTransactLog` exception when storing dates before the unix epoch (1970-01-01). - -0.102.0 Release notes (2016-05-09) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Add a method to rename properties during migrations: - * Swift: `Migration.renamePropertyForClass(_:oldName:newName:)` - * Objective-C: `-[RLMMigration renamePropertyForClass:oldName:newName:]` -* Add `deleteRealmIfMigrationNeeded` to - `RLMRealmConfiguration`/`Realm.Configuration`. When this is set to `true`, - the Realm file will be automatically deleted and recreated when there is a - schema mismatch rather than migrated to the new schema. - -### Bugfixes - -* Fix `BETWEEN` queries that traverse `RLMArray`/`List` properties to ensure that - a single related object satisfies the `BETWEEN` criteria, rather than allowing - different objects in the array to satisfy the lower and upper bounds. -* Fix a race condition when a Realm is opened on one thread while it is in the - middle of being closed on another thread which could result in crashes. -* Fix a bug which could result in changes made on one thread being applied - incorrectly on other threads when those threads are refreshed. -* Fix crash when migrating to the new date format introduced in 0.101.0. -* Fix crash when querying inverse relationships when objects are deleted. - -0.101.0 Release notes (2016-05-04) -============================================================= - -### API breaking changes - -* Files written by this version of Realm cannot be read by older versions of - Realm. Existing files will automatically be upgraded when they are opened. - -### Enhancements - -* Greatly improve performance of collection change calculation for complex - object graphs, especially for ones with cycles. -* NSDate properties now support nanoseconds precision. -* Opening a single Realm file on multiple threads now shares a single memory - mapping of the file for all threads, significantly reducing the memory - required to work with large files. -* Crashing while in the middle of a write transaction no longer blocks other - processes from performing write transactions on the same file. -* Improve the performance of refreshing a Realm (including via autorefresh) - when there are live Results/RLMResults objects for that Realm. - -### Bugfixes - -* Fix an assertion failure of "!more_before || index >= std::prev(it)->second)" - in `IndexSet::do_add()`. -* Fix a crash when an `RLMArray` or `List` object is destroyed from the wrong - thread. - -0.100.0 Release notes (2016-04-29) -============================================================= - -### API breaking changes - -* `-[RLMObject linkingObjectsOfClass:forProperty]` and `Object.linkingObjects(_:forProperty:)` - are deprecated in favor of properties of type `RLMLinkingObjects` / `LinkingObjects`. - -### Enhancements - -* The automatically-maintained inverse direction of relationships can now be exposed as - properties of type `RLMLinkingObjects` / `LinkingObjects`. These properties automatically - update to reflect the objects that link to the target object, can be used in queries, and - can be filtered like other Realm collection types. -* Queries that compare objects for equality now support multi-level key paths. - -### Bugfixes - -* Fix an assertion failure when a second write transaction is committed after a - write transaction deleted the object containing an RLMArray/List which had an - active notification block. -* Queries that compare `RLMArray` / `List` properties using != now give the correct results. - -0.99.1 Release notes (2016-04-26) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix a scenario that could lead to the assertion failure - "m_advancer_sg->get_version_of_current_transaction() == - new_notifiers.front()->version()". - -0.99.0 Release notes (2016-04-22) -============================================================= - -### API breaking changes - -* Deprecate properties of type `id`/`AnyObject`. This type was rarely used, - rarely useful and unsupported in every other Realm binding. -* The block for `-[RLMArray addNotificationBlock:]` and - `-[RLMResults addNotificationBlock:]` now takes another parameter. -* The following Objective-C APIs have been deprecated in favor of newer or preferred versions: - -| Deprecated API | New API | -|:-------------------------------------------------------|:------------------------------------------------------| -| `-[RLMRealm removeNotification:]` | `-[RLMNotificationToken stop]` | -| `RLMRealmConfiguration.path` | `RLMRealmConfiguration.fileURL` | -| `RLMRealm.path` | `RLMRealmConfiguration.fileURL` | -| `RLMRealm.readOnly` | `RLMRealmConfiguration.readOnly` | -| `+[RLMRealm realmWithPath:]` | `+[RLMRealm realmWithURL:]` | -| `+[RLMRealm writeCopyToPath:error:]` | `+[RLMRealm writeCopyToURL:encryptionKey:error:]` | -| `+[RLMRealm writeCopyToPath:encryptionKey:error:]` | `+[RLMRealm writeCopyToURL:encryptionKey:error:]` | -| `+[RLMRealm schemaVersionAtPath:error:]` | `+[RLMRealm schemaVersionAtURL:encryptionKey:error:]` | -| `+[RLMRealm schemaVersionAtPath:encryptionKey:error:]` | `+[RLMRealm schemaVersionAtURL:encryptionKey:error:]` | - -* The following Swift APIs have been deprecated in favor of newer or preferred versions: - -| Deprecated API | New API | -|:----------------------------------------------|:-----------------------------------------| -| `Realm.removeNotification(_:)` | `NotificationToken.stop()` | -| `Realm.Configuration.path` | `Realm.Configuration.fileURL` | -| `Realm.path` | `Realm.Configuration.fileURL` | -| `Realm.readOnly` | `Realm.Configuration.readOnly` | -| `Realm.writeCopyToPath(_:encryptionKey:)` | `Realm.writeCopyToURL(_:encryptionKey:)` | -| `schemaVersionAtPath(_:encryptionKey:error:)` | `schemaVersionAtURL(_:encryptionKey:)` | - -### Enhancements - -* Add information about what rows were added, removed, or modified to the - notifications sent to the Realm collections. -* Improve error when illegally appending to an `RLMArray` / `List` property from a default value - or the standalone initializer (`init()`) before the schema is ready. - -### Bugfixes - -* Fix a use-after-free when an associated object's dealloc method is used to - remove observers from an RLMObject. -* Fix a small memory leak each time a Realm file is opened. -* Return a recoverable `RLMErrorAddressSpaceExhausted` error rather than - crash when there is insufficient available address space on Realm - initialization or write commit. - -0.98.8 Release notes (2016-04-15) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fixed a bug that caused some encrypted files created using - `-[RLMRealm writeCopyToPath:encryptionKey:error:]` to fail to open. - -0.98.7 Release notes (2016-04-13) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Mark further initializers in Objective-C as NS_DESIGNATED_INITIALIZER to prevent that these aren't - correctly defined in Swift Object subclasses, which don't qualify for auto-inheriting the required initializers. -* `-[RLMResults indexOfObjectWithPredicate:]` now returns correct results - for `RLMResults` instances that were created by filtering an `RLMArray`. -* Adjust how RLMObjects are destroyed in order to support using an associated - object on an RLMObject to remove KVO observers from that RLMObject. -* `-[RLMResults indexOfObjectWithPredicate:]` now returns the index of the first matching object for a - sorted `RLMResults`, matching its documented behavior. -* Fix a crash when canceling a transaction that set a relationship. -* Fix a crash when a query referenced a deleted object. - -0.98.6 Release notes (2016-03-25) -============================================================= - -Prebuilt frameworks are now built with Xcode 7.3. - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix running unit tests on iOS simulators and devices with Xcode 7.3. - -0.98.5 Release notes (2016-03-14) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix a crash when opening a Realm on 32-bit iOS devices. - -0.98.4 Release notes (2016-03-10) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Properly report changes made by adding an object to a Realm with - addOrUpdate:/createOrUpdate: to KVO observers for existing objects with that - primary key. -* Fix crashes and assorted issues when a migration which added object link - properties is rolled back due to an error in the migration block. -* Fix assertion failures when deleting objects within a migration block of a - type which had an object link property added in that migration. -* Fix an assertion failure in `Query::apply_patch` when updating certain kinds - of queries after a write transaction is committed. - -0.98.3 Release notes (2016-02-26) -============================================================= - -### Enhancements - -* Initializing the shared schema is 3x faster. - -### Bugfixes - -* Using Realm Objective-C from Swift while having Realm Swift linked no longer causes that the - declared `ignoredProperties` are not taken into account. -* Fix assertion failures when rolling back a migration which added Object link - properties to a class. -* Fix potential errors when cancelling a write transaction which modified - multiple `RLMArray`/`List` properties. -* Report the correct value for inWriteTransaction after attempting to commit a - write transaction fails. -* Support CocoaPods 1.0 beginning from prerelease 1.0.0.beta.4 while retaining - backwards compatibility with 0.39. - -0.98.2 Release notes (2016-02-18) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Aggregate operations (`ANY`, `NONE`, `@count`, `SUBQUERY`, etc.) are now supported for key paths - that begin with an object relationship so long as there is a `RLMArray`/`List` property at some - point in a key path. -* Predicates of the form `%@ IN arrayProperty` are now supported. - -### Bugfixes - -* Use of KVC collection operators on Swift collection types no longer throws an exception. -* Fix reporting of inWriteTransaction in notifications triggered by - `beginWriteTransaction`. -* The contents of `List` and `Optional` properties are now correctly preserved when copying - a Swift object from one Realm to another, and performing other operations that result in a - Swift object graph being recursively traversed from Objective-C. -* Fix a deadlock when queries are performed within a Realm notification block. -* The `ANY` / `SOME` / `NONE` qualifiers are now required in comparisons involving a key path that - traverse a `RLMArray`/`List` property. Previously they were only required if the first key in the - key path was an `RLMArray`/`List` property. -* Fix several scenarios where the default schema would be initialized - incorrectly if the first Realm opened used a restricted class subset (via - `objectClasses`/`objectTypes`). - -0.98.1 Release notes (2016-02-10) -============================================================= - -### Bugfixes - -* Fix crashes when deleting an object containing an `RLMArray`/`List` which had - previously been queried. -* Fix a crash when deleting an object containing an `RLMArray`/`List` with - active notification blocks. -* Fix duplicate file warnings when building via CocoaPods. -* Fix crash or incorrect results when calling `indexOfObject:` on an - `RLMResults` derived from an `RLMArray`. - -0.98.0 Release notes (2016-02-04) -============================================================= - -### API breaking changes - -* `+[RLMRealm realmWithPath:]`/`Realm.init(path:)` now inherits from the default - configuration. -* Swift 1.2 is no longer supported. - -### Enhancements - -* Add `addNotificationBlock` to `RLMResults`, `Results`, `RLMArray`, and - `List`, which calls the given block whenever the collection changes. -* Do a lot of the work for keeping `RLMResults`/`Results` up-to-date after - write transactions on a background thread to help avoid blocking the main - thread. -* `NSPredicate`'s `SUBQUERY` operator is now supported. It has the following limitations: - * `@count` is the only operator that may be applied to the `SUBQUERY` expression. - * The `SUBQUERY(…).@count` expression must be compared with a constant. - * Correlated subqueries are not yet supported. - -### Bugfixes - -* None. - -0.97.1 Release notes (2016-01-29) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Swift: Added `Error` enum allowing to catch errors e.g. thrown on initializing - `RLMRealm`/`Realm` instances. -* Fail with `RLMErrorFileNotFound` instead of the more generic `RLMErrorFileAccess`, - if no file was found when a realm was opened as read-only or if the directory part - of the specified path was not found when a copy should be written. -* Greatly improve performance when deleting objects with one or more indexed - properties. -* Indexing `BOOL`/`Bool` and `NSDate` properties are now supported. -* Swift: Add support for indexing optional properties. - -### Bugfixes - -* Fix incorrect results or crashes when using `-[RLMResults setValue:forKey:]` - on an RLMResults which was filtered on the key being set. -* Fix crashes when an RLMRealm is deallocated from the wrong thread. -* Fix incorrect results from aggregate methods on `Results`/`RLMResults` after - objects which were previously in the results are deleted. -* Fix a crash when adding a new property to an existing class with over a - million objects in the Realm. -* Fix errors when opening encrypted Realm files created with writeCopyToPath. -* Fix crashes or incorrect results for queries that use relationship equality - in cases where the `RLMResults` is kept alive and instances of the target class - of the relationship are deleted. - -0.97.0 Release notes (2015-12-17) -============================================================= - -### API breaking changes - -* All functionality deprecated in previous releases has been removed entirely. -* Add generic type annotations to NSArrays and NSDictionaries in public APIs. -* Adding a Realm notification block on a thread not currently running from - within a run loop throws an exception rather than silently never calling the - notification block. - -### Enhancements - -* Support for tvOS. -* Support for building Realm Swift from source when using Carthage. -* The block parameter of `-[RLMRealm transactionWithBlock:]`/`Realm.write(_:)` is - now marked as `__attribute__((noescape))`/`@noescape`. -* Many forms of queries with key paths on both sides of the comparison operator - are now supported. -* Add support for KVC collection operators in `RLMResults` and `RLMArray`. -* Fail instead of deadlocking in `+[RLMRealm sharedSchema]`, if a Swift property is initialized - to a computed value, which attempts to open a Realm on its own. - -### Bugfixes - -* Fix poor performance when calling `-[RLMRealm deleteObjects:]` on an - `RLMResults` which filtered the objects when there are other classes linking - to the type of the deleted objects. -* An exception is now thrown when defining `Object` properties of an unsupported - type. - -0.96.3 Release notes (2015-12-04) -============================================================= - -### Enhancements - -* Queries are no longer limited to 16 levels of grouping. -* Rework the implementation of encrypted Realms to no longer interfere with - debuggers. - -### Bugfixes - -* Fix crash when trying to retrieve object instances via `dynamicObjects`. -* Throw an exception when querying on a link providing objects, which are from a different Realm. -* Return empty results when querying on a link providing an unattached object. -* Fix crashes or incorrect results when calling `-[RLMRealm refresh]` during - fast enumeration. -* Add `Int8` support for `RealmOptional`, `MinMaxType` and `AddableType`. -* Set the default value for newly added non-optional NSData properties to a - zero-byte NSData rather than nil. -* Fix a potential crash when deleting all objects of a class. -* Fix performance problems when creating large numbers of objects with - `RLMArray`/`List` properties. -* Fix memory leak when using Object(value:) for subclasses with - `List` or `RealmOptional` properties. -* Fix a crash when computing the average of an optional integer property. -* Fix incorrect search results for some queries on integer properties. -* Add error-checking for nil realm parameters in many methods such as - `+[RLMObject allObjectsInRealm:]`. -* Fix a race condition between commits and opening Realm files on new threads - that could lead to a crash. -* Fix several crashes when opening Realm files. -* `-[RLMObject createInRealm:withValue:]`, `-[RLMObject createOrUpdateInRealm:withValue:]`, and - their variants for the default Realm now always match the contents of an `NSArray` against properties - in the same order as they are defined in the model. - -0.96.2 Release notes (2015-10-26) -============================================================= - -Prebuilt frameworks are now built with Xcode 7.1. - -### Bugfixes - -* Fix ignoring optional properties in Swift. -* Fix CocoaPods installation on case-sensitive file systems. - -0.96.1 Release notes (2015-10-20) -============================================================= - -### Bugfixes - -* Support assigning `Results` to `List` properties via KVC. -* Honor the schema version set in the configuration in `+[RLMRealm migrateRealm:]`. -* Fix crash when using optional Int16/Int32/Int64 properties in Swift. - -0.96.0 Release notes (2015-10-14) -============================================================= - -* No functional changes since beta2. - -0.96.0-beta2 Release notes (2015-10-08) -============================================================= - -### Bugfixes - -* Add RLMOptionalBase.h to the podspec. - -0.96.0-beta Release notes (2015-10-07) -============================================================= - -### API breaking changes - -* CocoaPods v0.38 or greater is now required to install Realm and RealmSwift - as pods. - -### Enhancements - -* Functionality common to both `List` and `Results` is now declared in a - `RealmCollectionType` protocol that both types conform to. -* `Results.realm` now returns an `Optional` in order to conform to - `RealmCollectionType`, but will always return `.Some()` since a `Results` - cannot exist independently from a `Realm`. -* Aggregate operations are now available on `List`: `min`, `max`, `sum`, - `average`. -* Committing write transactions (via `commitWrite` / `commitWriteTransaction` and - `write` / `transactionWithBlock`) now optionally allow for handling errors when - the disk is out of space. -* Added `isEmpty` property on `RLMRealm`/`Realm` to indicate if it contains any - objects. -* The `@count`, `@min`, `@max`, `@sum` and `@avg` collection operators are now - supported in queries. - -### Bugfixes - -* Fix assertion failure when inserting NSData between 8MB and 16MB in size. -* Fix assertion failure when rolling back a migration which removed an object - link or `RLMArray`/`List` property. -* Add the path of the file being opened to file open errors. -* Fix a crash that could be triggered by rapidly opening and closing a Realm - many times on multiple threads at once. -* Fix several places where exception messages included the name of the wrong - function which failed. - -0.95.3 Release notes (2015-10-05) -============================================================= - -### Bugfixes - -* Compile iOS Simulator framework architectures with `-fembed-bitcode-marker`. -* Fix crashes when the first Realm opened uses a class subset and later Realms - opened do not. -* Fix inconsistent errors when `Object(value: ...)` is used to initialize the - default value of a property of an `Object` subclass. -* Throw an exception when a class subset has objects with array or object - properties of a type that are not part of the class subset. - -0.95.2 Release notes (2015-09-24) -============================================================= - -* Enable bitcode for iOS and watchOS frameworks. -* Build libraries with Xcode 7 final rather than the GM. - -0.95.1 Release notes (2015-09-23) -============================================================= - -### Enhancements - -* Add missing KVO handling for moving and exchanging objects in `RLMArray` and - `List`. - -### Bugfixes - -* Setting the primary key property on persisted `RLMObject`s / `Object`s - via subscripting or key-value coding will cause an exception to be thrown. -* Fix crash due to race condition in `RLMRealmConfiguration` where the default - configuration was in the process of being copied in one thread, while - released in another. -* Fix crash when a migration which removed an object or array property is - rolled back due to an error. - -0.95.0 Release notes (2015-08-25) -============================================================= - -### API breaking changes - -* The following APIs have been deprecated in favor of the new `RLMRealmConfiguration` class in Realm Objective-C: - -| Deprecated API | New API | -|:------------------------------------------------------------------|:---------------------------------------------------------------------------------| -| `+[RLMRealm realmWithPath:readOnly:error:]` | `+[RLMRealm realmWithConfiguration:error:]` | -| `+[RLMRealm realmWithPath:encryptionKey:readOnly:error:]` | `+[RLMRealm realmWithConfiguration:error:]` | -| `+[RLMRealm setEncryptionKey:forRealmsAtPath:]` | `-[RLMRealmConfiguration setEncryptionKey:]` | -| `+[RLMRealm inMemoryRealmWithIdentifier:]` | `+[RLMRealm realmWithConfiguration:error:]` | -| `+[RLMRealm defaultRealmPath]` | `+[RLMRealmConfiguration defaultConfiguration]` | -| `+[RLMRealm setDefaultRealmPath:]` | `+[RLMRealmConfiguration setDefaultConfiguration:]` | -| `+[RLMRealm setDefaultRealmSchemaVersion:withMigrationBlock]` | `RLMRealmConfiguration.schemaVersion` and `RLMRealmConfiguration.migrationBlock` | -| `+[RLMRealm setSchemaVersion:forRealmAtPath:withMigrationBlock:]` | `RLMRealmConfiguration.schemaVersion` and `RLMRealmConfiguration.migrationBlock` | -| `+[RLMRealm migrateRealmAtPath:]` | `+[RLMRealm migrateRealm:]` | -| `+[RLMRealm migrateRealmAtPath:encryptionKey:]` | `+[RLMRealm migrateRealm:]` | - -* The following APIs have been deprecated in favor of the new `Realm.Configuration` struct in Realm Swift for Swift 1.2: - -| Deprecated API | New API | -|:--------------------------------------------------------------|:-----------------------------------------------------------------------------| -| `Realm.defaultPath` | `Realm.Configuration.defaultConfiguration` | -| `Realm(path:readOnly:encryptionKey:error:)` | `Realm(configuration:error:)` | -| `Realm(inMemoryIdentifier:)` | `Realm(configuration:error:)` | -| `Realm.setEncryptionKey(:forPath:)` | `Realm(configuration:error:)` | -| `setDefaultRealmSchemaVersion(schemaVersion:migrationBlock:)` | `Realm.Configuration.schemaVersion` and `Realm.Configuration.migrationBlock` | -| `setSchemaVersion(schemaVersion:realmPath:migrationBlock:)` | `Realm.Configuration.schemaVersion` and `Realm.Configuration.migrationBlock` | -| `migrateRealm(path:encryptionKey:)` | `migrateRealm(configuration:)` | - -* The following APIs have been deprecated in favor of the new `Realm.Configuration` struct in Realm Swift for Swift 2.0: - -| Deprecated API | New API | -|:--------------------------------------------------------------|:-----------------------------------------------------------------------------| -| `Realm.defaultPath` | `Realm.Configuration.defaultConfiguration` | -| `Realm(path:readOnly:encryptionKey:) throws` | `Realm(configuration:) throws` | -| `Realm(inMemoryIdentifier:)` | `Realm(configuration:) throws` | -| `Realm.setEncryptionKey(:forPath:)` | `Realm(configuration:) throws` | -| `setDefaultRealmSchemaVersion(schemaVersion:migrationBlock:)` | `Realm.Configuration.schemaVersion` and `Realm.Configuration.migrationBlock` | -| `setSchemaVersion(schemaVersion:realmPath:migrationBlock:)` | `Realm.Configuration.schemaVersion` and `Realm.Configuration.migrationBlock` | -| `migrateRealm(path:encryptionKey:)` | `migrateRealm(configuration:)` | - -* `List.extend` in Realm Swift for Swift 2.0 has been replaced with `List.appendContentsOf`, - mirroring changes to `RangeReplaceableCollectionType`. - -* Object properties on `Object` subclasses in Realm Swift must be marked as optional, - otherwise a runtime exception will be thrown. - -### Enhancements - -* Persisted properties of `RLMObject`/`Object` subclasses are now Key-Value - Observing compliant. -* The different options used to create Realm instances have been consolidated - into a single `RLMRealmConfiguration`/`Realm.Configuration` object. -* Enumerating Realm collections (`RLMArray`, `RLMResults`, `List<>`, - `Results<>`) now enumerates over a copy of the collection, making it no - longer an error to modify a collection during enumeration (either directly, - or indirectly by modifying objects to make them no longer match a query). -* Improve performance of object insertion in Swift to bring it roughly in line - with Objective-C. -* Allow specifying a specific list of `RLMObject` / `Object` subclasses to include - in a given Realm via `RLMRealmConfiguration.objectClasses` / `Realm.Configuration.objectTypes`. - -### Bugfixes - -* Subscripting on `RLMObject` is now marked as nullable. - -0.94.1 Release notes (2015-08-10) -============================================================= - -### API breaking changes - -* Building for watchOS requires Xcode 7 beta 5. - -### Enhancements - -* `Object.className` is now marked as `final`. - -### Bugfixes - -* Fix crash when adding a property to a model without updating the schema - version. -* Fix unnecessary redownloading of the core library when building from source. -* Fix crash when sorting by an integer or floating-point property on iOS 7. - -0.94.0 Release notes (2015-07-29) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Reduce the amount of memory used by RLMRealm notification listener threads. -* Avoid evaluating results eagerly when filtering and sorting. -* Add nullability annotations to the Objective-C API to provide enhanced compiler - warnings and bridging to Swift. -* Make `RLMResult`s and `RLMArray`s support Objective-C generics. -* Add support for building watchOS and bitcode-compatible apps. -* Make the exceptions thrown in getters and setters more informative. -* Add `-[RLMArray exchangeObjectAtIndex:withObjectAtIndex]` and `List.swap(_:_:)` - to allow exchanging the location of two objects in the given `RLMArray` / `List`. -* Added anonymous analytics on simulator/debugger runs. -* Add `-[RLMArray moveObjectAtIndex:toIndex:]` and `List.move(from:to:)` to - allow moving objects in the given `RLMArray` / `List`. - -### Bugfixes - -* Processes crashing due to an uncaught exception inside a write transaction will - no longer cause other processes using the same Realm to hang indefinitely. -* Fix incorrect results when querying for < or <= on ints that - require 64 bits to represent with a CPU that supports SSE 4.2. -* An exception will no longer be thrown when attempting to reset the schema - version or encryption key on an open Realm to the current value. -* Date properties on 32 bit devices will retain 64 bit second precision. -* Wrap calls to the block passed to `enumerate` in an autoreleasepool to reduce - memory growth when migrating a large amount of objects. -* In-memory realms no longer write to the Documents directory on iOS or - Application Support on OS X. - -0.93.2 Release notes (2015-06-12) -============================================================= - -### Bugfixes - -* Fixed an issue where the packaged OS X Realm.framework was built with - `GCC_GENERATE_TEST_COVERAGE_FILES` and `GCC_INSTRUMENT_PROGRAM_FLOW_ARCS` - enabled. -* Fix a memory leak when constructing standalone Swift objects with NSDate - properties. -* Throw an exception rather than asserting when an invalidated object is added - to an RLMArray. -* Fix a case where data loss would occur if a device was hard-powered-off - shortly after a write transaction was committed which had to expand the Realm - file. - -0.93.1 Release notes (2015-05-29) -============================================================= - -### Bugfixes - -* Objects are no longer copied into standalone objects during object creation. This fixes an issue where - nested objects with a primary key are sometimes duplicated rather than updated. -* Comparison predicates with a constant on the left of the operator and key path on the right now give - correct results. An exception is now thrown for predicates that do not yet support this ordering. -* Fix some crashes in `index_string.cpp` with int primary keys or indexed int properties. - -0.93.0 Release notes (2015-05-27) -============================================================= - -### API breaking changes - -* Schema versions are now represented as `uint64_t` (Objective-C) and `UInt64` (Swift) so that they have - the same representation on all architectures. - -### Enhancements - -* Swift: `Results` now conforms to `CVarArgType` so it can - now be passed as an argument to `Results.filter(_:...)` - and `List.filter(_:...)`. -* Swift: Made `SortDescriptor` conform to the `Equatable` and - `StringLiteralConvertible` protocols. -* Int primary keys are once again automatically indexed. -* Improve error reporting when attempting to mark a property of a type that - cannot be indexed as indexed. - -### Bugfixes - -* Swift: `RealmSwift.framework` no longer embeds `Realm.framework`, - which now allows apps using it to pass iTunes Connect validation. - -0.92.4 Release notes (2015-05-22) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Swift: Made `Object.init()` a required initializer. -* `RLMObject`, `RLMResults`, `Object` and `Results` can now be safely - deallocated (but still not used) from any thread. -* Improve performance of `-[RLMArray indexOfObjectWhere:]` and `-[RLMArray - indexOfObjectWithPredicate:]`, and implement them for standalone RLMArrays. -* Improved performance of most simple queries. - -### Bugfixes - -* The interprocess notification mechanism no longer uses dispatch worker threads, preventing it from - starving other GCD clients of the opportunity to execute blocks when dozens of Realms are open at once. - -0.92.3 Release notes (2015-05-13) -============================================================= - -### API breaking changes - -* Swift: `Results.average(_:)` now returns an optional, which is `nil` if and only if the results - set is empty. - -### Enhancements - -* Swift: Added `List.invalidated`, which returns if the given `List` is no longer - safe to be accessed, and is analogous to `-[RLMArray isInvalidated]`. -* Assertion messages are automatically logged to Crashlytics if it's loaded - into the current process to make it easier to diagnose crashes. - -### Bugfixes - -* Swift: Enumerating through a standalone `List` whose objects themselves - have list properties won't crash. -* Swift: Using a subclass of `RealmSwift.Object` in an aggregate operator of a predicate - no longer throws a spurious type error. -* Fix incorrect results for when using OR in a query on a `RLMArray`/`List<>`. -* Fix incorrect values from `[RLMResults count]`/`Results.count` when using - `!=` on an int property with no other query conditions. -* Lower the maximum doubling threshold for Realm file sizes from 128MB to 16MB - to reduce the amount of wasted space. - -0.92.2 Release notes (2015-05-08) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Exceptions raised when incorrect object types are used with predicates now contain more detailed information. -* Added `-[RLMMigration deleteDataForClassName:]` and `Migration.deleteData(_:)` - to enable cleaning up after removing object subclasses - -### Bugfixes - -* Prevent debugging of an application using an encrypted Realm to work around - frequent LLDB hangs. Until the underlying issue is addressed you may set - REALM_DISABLE_ENCRYPTION=YES in your application's environment variables to - have requests to open an encrypted Realm treated as a request for an - unencrypted Realm. -* Linked objects are properly updated in `createOrUpdateInRealm:withValue:`. -* List properties on Objects are now properly initialized during fast enumeration. - -0.92.1 Release notes (2015-05-06) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* `-[RLMRealm inWriteTransaction]` is now public. -* Realm Swift is now available on CoocaPods. - -### Bugfixes - -* Force code re-signing after stripping architectures in `strip-frameworks.sh`. - -0.92.0 Release notes (2015-05-05) -============================================================= - -### API breaking changes - -* Migration blocks are no longer called when a Realm file is first created. -* The following APIs have been deprecated in favor of newer method names: - -| Deprecated API | New API | -|:-------------------------------------------------------|:------------------------------------------------------| -| `-[RLMMigration createObject:withObject:]` | `-[RLMMigration createObject:withValue:]` | -| `-[RLMObject initWithObject:]` | `-[RLMObject initWithValue:]` | -| `+[RLMObject createInDefaultRealmWithObject:]` | `+[RLMObject createInDefaultRealmWithValue:]` | -| `+[RLMObject createInRealm:withObject:]` | `+[RLMObject createInRealm:withValue:]` | -| `+[RLMObject createOrUpdateInDefaultRealmWithObject:]` | `+[RLMObject createOrUpdateInDefaultRealmWithValue:]` | -| `+[RLMObject createOrUpdateInRealm:withObject:]` | `+[RLMObject createOrUpdateInRealm:withValue:]` | - -### Enhancements - -* `Int8` properties defined in Swift are now treated as integers, rather than - booleans. -* NSPredicates created using `+predicateWithValue:` are now supported. - -### Bugfixes - -* Compound AND predicates with no subpredicates now correctly match all objects. - -0.91.5 Release notes (2015-04-28) -============================================================= - -### Bugfixes - -* Fix issues with removing search indexes and re-enable it. - -0.91.4 Release notes (2015-04-27) -============================================================= - -### Bugfixes - -* Temporarily disable removing indexes from existing columns due to bugs. - -0.91.3 Release notes (2015-04-17) -============================================================= - -### Bugfixes - -* Fix `Extra argument 'objectClassName' in call` errors when building via - CocoaPods. - -0.91.2 Release notes (2015-04-16) -============================================================= - -* Migration blocks are no longer called when a Realm file is first created. - -### Enhancements - -* `RLMCollection` supports collection KVC operations. -* Sorting `RLMResults` is 2-5x faster (typically closer to 2x). -* Refreshing `RLMRealm` after a write transaction which inserts or modifies - strings or `NSData` is committed on another thread is significantly faster. -* Indexes are now added and removed from existing properties when a Realm file - is opened, rather than only when properties are first added. - -### Bugfixes - -* `+[RLMSchema dynamicSchemaForRealm:]` now respects search indexes. -* `+[RLMProperty isEqualToProperty:]` now checks for equal `indexed` properties. - -0.91.1 Release notes (2015-03-12) -============================================================= - -### Enhancements - -* The browser will automatically refresh when the Realm has been modified - from another process. -* Allow using Realm in an embedded framework by setting - `APPLICATION_EXTENSION_API_ONLY` to YES. - -### Bugfixes - -* Fix a crash in CFRunLoopSourceInvalidate. - -0.91.0 Release notes (2015-03-10) -============================================================= - -### API breaking changes - -* `attributesForProperty:` has been removed from `RLMObject`. You now specify indexed - properties by implementing the `indexedProperties` method. -* An exception will be thrown when calling `setEncryptionKey:forRealmsAtPath:`, - `setSchemaVersion:forRealmAtPath:withMigrationBlock:`, and `migrateRealmAtPath:` - when a Realm at the given path is already open. -* Object and array properties of type `RLMObject` will no longer be allowed. - -### Enhancements - -* Add support for sharing Realm files between processes. -* The browser will no longer show objects that have no persisted properties. -* `RLMSchema`, `RLMObjectSchema`, and `RLMProperty` now have more useful descriptions. -* Opening an encrypted Realm while a debugger is attached to the process no - longer throws an exception. -* `RLMArray` now exposes an `isInvalidated` property to indicate if it can no - longer be accessed. - -### Bugfixes - -* An exception will now be thrown when calling `-beginWriteTransaction` from within a notification - triggered by calling `-beginWriteTransaction` elsewhere. -* When calling `delete:` we now verify that the object being deleted is persisted in the target Realm. -* Fix crash when calling `createOrUpdate:inRealm` with nested linked objects. -* Use the key from `+[RLMRealm setEncryptionKey:forRealmsAtPath:]` in - `-writeCopyToPath:error:` and `+migrateRealmAtPath:`. -* Comparing an RLMObject to a non-RLMObject using `-[RLMObject isEqual:]` or - `-isEqualToObject:` now returns NO instead of crashing. -* Improved error message when an `RLMObject` subclass is defined nested within - another Swift declaration. -* Fix crash when the process is terminated by the OS on iOS while encrypted realms are open. -* Fix crash after large commits to encrypted realms. - -0.90.6 Release notes (2015-02-20) -============================================================= - -### Enhancements - -* Improve compatibility of encrypted Realms with third-party crash reporters. - -### Bugfixes - -* Fix incorrect results when using aggregate functions on sorted RLMResults. -* Fix data corruption when using writeCopyToPath:encryptionKey:. -* Maybe fix some assertion failures. - -0.90.5 Release notes (2015-02-04) -============================================================= - -### Bugfixes - -* Fix for crashes when encryption is enabled on 64-bit iOS devices. - -0.90.4 Release notes (2015-01-29) -============================================================= - -### Bugfixes - -* Fix bug that resulted in columns being dropped and recreated during migrations. - -0.90.3 Release notes (2015-01-27) -============================================================= - -### Enhancements - -* Calling `createInDefaultRealmWithObject:`, `createInRealm:withObject:`, - `createOrUpdateInDefaultRealmWithObject:` or `createOrUpdateInRealm:withObject:` - is a no-op if the argument is an RLMObject of the same type as the receiver - and is already backed by the target realm. - -### Bugfixes - -* Fix incorrect column type assertions when the first Realm file opened is a - read-only file that is missing tables. -* Throw an exception when adding an invalidated or deleted object as a link. -* Throw an exception when calling `createOrUpdateInRealm:withObject:` when the - receiver has no primary key defined. - -0.90.1 Release notes (2015-01-22) -============================================================= - -### Bugfixes - -* Fix for RLMObject being treated as a model object class and showing up in the browser. -* Fix compilation from the podspec. -* Fix for crash when calling `objectsWhere:` with grouping in the query on `allObjects`. - -0.90.0 Release notes (2015-01-21) -============================================================= - -### API breaking changes - -* Rename `-[RLMRealm encryptedRealmWithPath:key:readOnly:error:]` to - `-[RLMRealm realmWithPath:encryptionKey:readOnly:error:]`. -* `-[RLMRealm setSchemaVersion:withMigrationBlock]` is no longer global and must be called - for each individual Realm path used. You can now call `-[RLMRealm setDefaultRealmSchemaVersion:withMigrationBlock]` - for the default Realm and `-[RLMRealm setSchemaVersion:forRealmAtPath:withMigrationBlock:]` for all others; - -### Enhancements - -* Add `-[RLMRealm writeCopyToPath:encryptionKey:error:]`. -* Add support for comparing string columns to other string columns in queries. - -### Bugfixes - -* Roll back changes made when an exception is thrown during a migration. -* Throw an exception if the number of items in a RLMResults or RLMArray changes - while it's being fast-enumerated. -* Also encrypt the temporary files used when encryption is enabled for a Realm. -* Fixed crash in JSONImport example on OS X with non-en_US locale. -* Fixed infinite loop when opening a Realm file in the Browser at the same time - as it is open in a 32-bit simulator. -* Fixed a crash when adding primary keys to older realm files with no primary - keys on any objects. -* Fixed a crash when removing a primary key in a migration. -* Fixed a crash when multiple write transactions with no changes followed by a - write transaction with changes were committed without the main thread - RLMRealm getting a chance to refresh. -* Fixed incomplete results when querying for non-null relationships. -* Improve the error message when a Realm file is opened in multiple processes - at once. - -0.89.2 Release notes (2015-01-02) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix an assertion failure when invalidating a Realm which is in a write - transaction, has already been invalidated, or has never been used. -* Fix an assertion failure when sorting an empty RLMArray property. -* Fix a bug resulting in the browser never becoming visible on 10.9. -* Write UTF-8 when generating class files from a realm file in the Browser. - -0.89.1 Release notes (2014-12-22) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Improve the error message when a Realm can't be opened due to lacking write - permissions. - -### Bugfixes - -* Fix an assertion failure when inserting rows after calling `deleteAllObjects` - on a Realm. -* Separate dynamic frameworks are now built for the simulator and devices to - work around App Store submission errors due to the simulator version not - being automatically stripped from dynamic libraries. - -0.89.0 Release notes (2014-12-18) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Add support for encrypting Realm files on disk. -* Support using KVC-compliant objects without getters or with custom getter - names to initialize RLMObjects with `createObjectInRealm` and friends. - -### Bugfixes - -* Merge native Swift default property values with defaultPropertyValues(). -* Don't leave the database schema partially updated when opening a realm fails - due to a migration being needed. -* Fixed issue where objects with custom getter names couldn't be used to - initialize other objects. -* Fix a major performance regression on queries on string properties. -* Fix a memory leak when circularly linked objects are added to a Realm. - -0.88.0 Release notes (2014-12-02) -============================================================= - -### API breaking changes - -* Deallocating an RLMRealm instance in a write transaction lacking an explicit - commit/cancel will now be automatically cancelled instead of committed. -* `-[RLMObject isDeletedFromRealm]` has been renamed to `-[RLMObject isInvalidated]`. - -### Enhancements - -* Add `-[RLMRealm writeCopyToPath:]` to write a compacted copy of the Realm - another file. -* Add support for case insensitive, BEGINSWITH, ENDSWITH and CONTAINS string - queries on array properties. -* Make fast enumeration of `RLMArray` and `RLMResults` ~30% faster and - `objectAtIndex:` ~55% faster. -* Added a lldb visualizer script for displaying the contents of persisted - RLMObjects when debugging. -* Added method `-setDefaultRealmPath:` to change the default Realm path. -* Add `-[RLMRealm invalidate]` to release data locked by the current thread. - -### Bugfixes - -* Fix for crash when running many simultaneous write transactions on background threads. -* Fix for crashes caused by opening Realms at multiple paths simultaneously which have had - properties re-ordered during migration. -* Don't run the query twice when `firstObject` or `lastObject` are called on an - `RLMResults` which has not had its results accessed already. -* Fix for bug where schema version is 0 for new Realm created at the latest version. -* Fix for error message where no migration block is specified when required. - -0.87.4 Release notes (2014-11-07) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix browser location in release zip. - -0.87.3 Release notes (2014-11-06) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Added method `-linkingObjectsOfClass:forProperty:` to RLMObject to expose inverse - relationships/backlinks. - -### Bugfixes - -* Fix for crash due to missing search index when migrating an object with a string primary key - in a database created using an older versions (0.86.3 and earlier). -* Throw an exception when passing an array containing a - non-RLMObject to -[RLMRealm addObjects:]. -* Fix for crash when deleting an object from multiple threads. - -0.87.0 Release notes (2014-10-21) -============================================================= - -### API breaking changes - -* RLMArray has been split into two classes, `RLMArray` and `RLMResults`. RLMArray is - used for object properties as in previous releases. Moving forward all methods used to - enumerate, query, and sort objects return an instance of a new class `RLMResults`. This - change was made to support diverging apis and the future addition of change notifications - for queries. -* The api for migrations has changed. You now call `setSchemaVersion:withMigrationBlock:` to - register a global migration block and associated version. This block is applied to Realms as - needed when opened for Realms at a previous version. The block can be applied manually if - desired by calling `migrateRealmAtPath:`. -* `arraySortedByProperty:ascending:` was renamed to `sortedResultsUsingProperty:ascending` -* `addObjectsFromArray:` on both `RLMRealm` and `RLMArray` has been renamed to `addObjects:` - and now accepts any container class which implements `NSFastEnumeration` -* Building with Swift support now requires Xcode 6.1 - -### Enhancements - -* Add support for sorting `RLMArray`s by multiple columns with `sortedResultsUsingDescriptors:` -* Added method `deleteAllObjects` on `RLMRealm` to clear a Realm. -* Added method `createObject:withObject:` on `RLMMigration` which allows object creation during migrations. -* Added method `deleteObject:` on `RLMMigration` which allows object deletion during migrations. -* Updating to core library version 0.85.0. -* Implement `objectsWhere:` and `objectsWithPredicate:` for array properties. -* Add `cancelWriteTransaction` to revert all changes made in a write transaction and end the transaction. -* Make creating `RLMRealm` instances on background threads when an instance - exists on another thread take a fifth of the time. -* Support for partial updates when calling `createOrUpdateWithObject:` and `addOrUpdateObject:` -* Re-enable Swift support on OS X - -### Bugfixes - -* Fix exceptions when trying to set `RLMObject` properties after rearranging - the properties in a `RLMObject` subclass. -* Fix crash on IN query with several thousand items. -* Fix crash when querying indexed `NSString` properties. -* Fixed an issue which prevented in-memory Realms from being used accross multiple threads. -* Preserve the sort order when querying a sorted `RLMResults`. -* Fixed an issue with migrations where if a Realm file is deleted after a Realm is initialized, - the newly created Realm can be initialized with an incorrect schema version. -* Fix crash in `RLMSuperSet` when assigning to a `RLMArray` property on a standalone object. -* Add an error message when the protocol for an `RLMArray` property is not a - valid object type. -* Add an error message when an `RLMObject` subclass is defined nested within - another Swift class. - -0.86.3 Release notes (2014-10-09) -============================================================= - -### Enhancements - -* Add support for != in queries on object relationships. - -### Bugfixes - -* Re-adding an object to its Realm no longer throws an exception and is now a no-op - (as it was previously). -* Fix another bug which would sometimes result in subclassing RLMObject - subclasses not working. - -0.86.2 Release notes (2014-10-06) -============================================================= - -### Bugfixes - -* Fixed issues with packaging "Realm Browser.app" for release. - -0.86.1 Release notes (2014-10-03) -============================================================= - -### Bugfixes - -* Fix a bug which would sometimes result in subclassing RLMObject subclasses - not working. - -0.86.0 Release notes (2014-10-03) -============================================================= - -### API breaking changes - -* Xcode 6 is now supported from the main Xcode project `Realm.xcodeproj`. - Xcode 5 is no longer supported. - -### Enhancements - -* Support subclassing RLMObject models. Although you can now persist subclasses, - polymorphic behavior is not supported (i.e. setting a property to an - instance of its subclass). -* Add support for sorting RLMArray properties. -* Speed up inserting objects with `addObject:` by ~20%. -* `readonly` properties are automatically ignored rather than having to be - added to `ignoredProperties`. -* Updating to core library version 0.83.1. -* Return "[deleted object]" rather than throwing an exception when - `-description` is called on a deleted RLMObject. -* Significantly improve performance of very large queries. -* Allow passing any enumerable to IN clauses rather than just NSArray. -* Add `objectForPrimaryKey:` and `objectInRealm:forPrimaryKey:` convenience - methods to fetch an object by primary key. - -### Bugfixes - -* Fix error about not being able to persist property 'hash' with incompatible - type when building for devices with Xcode 6. -* Fix spurious notifications of new versions of Realm. -* Fix for updating nested objects where some types do not have primary keys. -* Fix for inserting objects from JSON with NSNull values when default values - should be used. -* Trying to add a persisted RLMObject to a different Realm now throws an - exception rather than creating an uninitialized object. -* Fix validation errors when using IN on array properties. -* Fix errors when an IN clause has zero items. -* Fix for chained queries ignoring all but the last query's conditions. - -0.85.0 Release notes (2014-09-15) -============================================================= - -### API breaking changes - -* Notifications for a refresh being needed (when autorefresh is off) now send - the notification type RLMRealmRefreshRequiredNotification rather than - RLMRealmDidChangeNotification. - -### Enhancements - -* Updating to core library version 0.83.0. -* Support for primary key properties (for int and string columns). Declaring a property - to be the primary key ensures uniqueness for that property for all objects of a given type. - At the moment indexes on primary keys are not yet supported but this will be added in a future - release. -* Added methods to update or insert (upsert) for objects with primary keys defined. -* `[RLMObject initWithObject:]` and `[RLMObject createInRealmWithObject:]` now support - any object type with kvc properties. -* The Swift support has been reworked to work around Swift not being supported - in Frameworks on iOS 7. -* Improve performance when getting the count of items matching a query but not - reading any of the objects in the results. -* Add a return value to `-[RLMRealm refresh]` that indicates whether or not - there was anything to refresh. -* Add the class name to the error message when an RLMObject is missing a value - for a property without a default. -* Add support for opening Realms in read-only mode. -* Add an automatic check for updates when using Realm in a simulator (the - checker code is not compiled into device builds). This can be disabled by - setting the REALM_DISABLE_UPDATE_CHECKER environment variable to any value. -* Add support for Int16 and Int64 properties in Swift classes. - -### Bugfixes - -* Realm change notifications when beginning a write transaction are now sent - after updating rather than before, to match refresh. -* `-isEqual:` now uses the default `NSObject` implementation unless a primary key - is specified for an RLMObject. When a primary key is specified, `-isEqual:` calls - `-isEqualToObject:` and a corresponding implementation for `-hash` is also implemented. - -0.84.0 Release notes (2014-08-28) -============================================================= - -### API breaking changes - -* The timer used to trigger notifications has been removed. Notifications are now - only triggered by commits made in other threads, and can not currently be triggered - by changes made by other processes. Interprocess notifications will be re-added in - a future commit with an improved design. - -### Enhancements - -* Updating to core library version 0.82.2. -* Add property `deletedFromRealm` to RLMObject to indicate objects which have been deleted. -* Add support for the IN operator in predicates. -* Add support for the BETWEEN operator in link queries. -* Add support for multi-level link queries in predicates (e.g. `foo.bar.baz = 5`). -* Switch to building the SDK from source when using CocoaPods and add a - Realm.Headers subspec for use in targets that should not link a copy of Realm - (such as test targets). -* Allow unregistering from change notifications in the change notification - handler block. -* Significant performance improvements when holding onto large numbers of RLMObjects. -* Realm-Xcode6.xcodeproj now only builds using Xcode6-Beta6. -* Improved performance during RLMArray iteration, especially when mutating - contained objects. - -### Bugfixes - -* Fix crashes and assorted bugs when sorting or querying a RLMArray returned - from a query. -* Notifications are no longer sent when initializing new RLMRealm instances on background - threads. -* Handle object cycles in -[RLMObject description] and -[RLMArray description]. -* Lowered the deployment target for the Xcode 6 projects and Swift examples to - iOS 7.0, as they didn't actually require 8.0. -* Support setting model properties starting with the letter 'z' -* Fixed crashes that could result from switching between Debug and Relase - builds of Realm. - -0.83.0 Release notes (2014-08-13) -============================================================= - -### API breaking changes - -* Realm-Xcode6.xcodeproj now only builds using Xcode6-Beta5. -* Properties to be persisted in Swift classes must be explicitly declared as `dynamic`. -* Subclasses of RLMObject subclasses now throw an exception on startup, rather - than when added to a Realm. - -### Enhancements - -* Add support for querying for nil object properties. -* Improve error message when specifying invalid literals when creating or - initializing RLMObjects. -* Throw an exception when an RLMObject is used from the incorrect thread rather - than crashing in confusing ways. -* Speed up RLMRealm instantiation and array property iteration. -* Allow array and objection relation properties to be missing or null when - creating a RLMObject from a NSDictionary. - -### Bugfixes - -* Fixed a memory leak when querying for objects. -* Fixed initializing array properties on standalone Swift RLMObject subclasses. -* Fix for queries on 64bit integers. - -0.82.0 Release notes (2014-08-05) -============================================================= - -### API breaking changes - -* Realm-Xcode6.xcodeproj now only builds using Xcode6-Beta4. - -### Enhancements - -* Updating to core library version 0.80.5. -* Now support disabling the `autorefresh` property on RLMRealm instances. -* Building Realm-Xcode6 for iOS now builds a universal framework for Simulator & Device. -* Using NSNumber properties (unsupported) now throws a more informative exception. -* Added `[RLMRealm defaultRealmPath]` -* Proper implementation for [RLMArray indexOfObjectWhere:] -* The default Realm path on OS X is now ~/Library/Application Support/[bundle - identifier]/default.realm rather than ~/Documents -* We now check that the correct framework (ios or osx) is used at compile time. - -### Bugfixes - -* Fixed rapid growth of the realm file size. -* Fixed a bug which could cause a crash during RLMArray destruction after a query. -* Fixed bug related to querying on float properties: `floatProperty = 1.7` now works. -* Fixed potential bug related to the handling of array properties (RLMArray). -* Fixed bug where array properties accessed the wrong property. -* Fixed bug that prevented objects with custom getters to be added to a Realm. -* Fixed a bug where initializing a standalone object with an array literal would - trigger an exception. -* Clarified exception messages when using unsupported NSPredicate operators. -* Clarified exception messages when using unsupported property types on RLMObject subclasses. -* Fixed a memory leak when breaking out of a for-in loop on RLMArray. -* Fixed a memory leak when removing objects from a RLMArray property. -* Fixed a memory leak when querying for objects. - - -0.81.0 Release notes (2014-07-22) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Updating to core library version 0.80.3. -* Added support for basic querying of RLMObject and RLMArray properties (one-to-one and one-to-many relationships). - e.g. `[Person objectsWhere:@"dog.name == 'Alfonso'"]` or `[Person objectsWhere:@"ANY dogs.name == 'Alfonso'"]` - Supports all normal operators for numeric and date types. Does not support NSData properties or `BEGINSWITH`, `ENDSWITH`, `CONTAINS` - and other options for string properties. -* Added support for querying for object equality in RLMObject and RLMArray properties (one-to-one and one-to-many relationships). - e.g. `[Person objectsWhere:@"dog == %@", myDog]` `[Person objectsWhere:@"ANY dogs == %@", myDog]` `[Person objectsWhere:@"ANY friends.dog == %@", dog]` - Only supports comparing objects for equality (i.e. ==) -* Added a helper method to RLMRealm to perform a block inside a transaction. -* OSX framework now supported in CocoaPods. - -### Bugfixes - -* Fixed Unicode support in property names and string contents (Chinese, Russian, etc.). Closing #612 and #604. -* Fixed bugs related to migration when properties are removed. -* Fixed keyed subscripting for standalone RLMObjects. -* Fixed bug related to double clicking on a .realm file to launch the Realm Browser (thanks to Dean Moore). - - -0.80.0 Release notes (2014-07-15) -============================================================= - -### API breaking changes - -* Rename migration methods to -migrateDefaultRealmWithBlock: and -migrateRealmAtPath:withBlock: -* Moved Realm specific query methods from RLMRealm to class methods on RLMObject (-allObjects: to +allObjectsInRealm: ect.) - -### Enhancements - -* Added +createInDefaultRealmWithObject: method to RLMObject. -* Added support for array and object literals when calling -createWithObject: and -initWithObject: variants. -* Added method -deleteObjects: to batch delete objects from a Realm -* Support for defining RLMObject models entirely in Swift (experimental, see known issues). -* RLMArrays in Swift support Sequence-style enumeration (for obj in array). -* Implemented -indexOfObject: for RLMArray - -### Known Issues for Swift-defined models - -* Properties other than String, NSData and NSDate require a default value in the model. This can be an empty (but typed) array for array properties. -* The previous caveat also implies that not all models defined in Objective-C can be used for object properties. Only Objective-C models with only implicit (i.e. primitives) or explicit default values can be used. However, any Objective-C model object can be used in a Swift array property. -* Array property accessors don't work until its parent object has been added to a realm. -* Realm-Bridging-Header.h is temporarily exposed as a public header. This is temporary and will be private again once rdar://17633863 is fixed. -* Does not leverage Swift generics and still uses RLM-prefix everywhere. This is coming in #549. - - -0.22.0 Release notes -============================================================= - -### API breaking changes - -* Rename schemaForObject: to schemaForClassName: on RLMSchema -* Removed -objects:where: and -objects:orderedBy:where: from RLMRealm -* Removed -indexOfObjectWhere:, -objectsWhere: and -objectsOrderedBy:where: from RLMArray -* Removed +objectsWhere: and +objectsOrderedBy:where: from RLMObject - -### Enhancements - -* New Xcode 6 project for experimental swift support. -* New Realm Editor app for reading and editing Realm db files. -* Added support for migrations. -* Added support for RLMArray properties on objects. -* Added support for creating in-memory default Realm. -* Added -objectsWithClassName:predicateFormat: and -objectsWithClassName:predicate: to RLMRealm -* Added -indexOfObjectWithPredicateFormat:, -indexOfObjectWithPredicate:, -objectsWithPredicateFormat:, -objectsWithPredi -* Added +objectsWithPredicateFormat: and +objectsWithPredicate: to RLMObject -* Now allows predicates comparing two object properties of the same type. - - -0.20.0 Release notes (2014-05-28) -============================================================= - -Completely rewritten to be much more object oriented. - -### API breaking changes - -* Everything - -### Enhancements - -* None. - -### Bugfixes - -* None. - - -0.11.0 Release notes (not released) -============================================================= - -The Objective-C API has been updated and your code will break! - -### API breaking changes - -* `RLMTable` objects can only be created with an `RLMRealm` object. -* Renamed `RLMContext` to `RLMTransactionManager` -* Renamed `RLMContextDidChangeNotification` to `RLMRealmDidChangeNotification` -* Renamed `contextWithDefaultPersistence` to `managerForDefaultRealm` -* Renamed `contextPersistedAtPath:` to `managerForRealmWithPath:` -* Renamed `realmWithDefaultPersistence` to `defaultRealm` -* Renamed `realmWithDefaultPersistenceAndInitBlock` to `defaultRealmWithInitBlock` -* Renamed `find:` to `firstWhere:` -* Renamed `where:` to `allWhere:` -* Renamed `where:orderBy:` to `allWhere:orderBy:` - -### Enhancements - -* Added `countWhere:` on `RLMTable` -* Added `sumOfColumn:where:` on `RLMTable` -* Added `averageOfColumn:where:` on `RLMTable` -* Added `minOfProperty:where:` on `RLMTable` -* Added `maxOfProperty:where:` on `RLMTable` -* Added `toJSONString` on `RLMRealm`, `RLMTable` and `RLMView` -* Added support for `NOT` operator in predicates -* Added support for default values -* Added validation support in `createInRealm:withObject:` - -### Bugfixes - -* None. - - -0.10.0 Release notes (2014-04-23) -============================================================= - -TightDB is now Realm! The Objective-C API has been updated -and your code will break! - -### API breaking changes - -* All references to TightDB have been changed to Realm. -* All prefixes changed from `TDB` to `RLM`. -* `TDBTransaction` and `TDBSmartContext` have merged into `RLMRealm`. -* Write transactions now take an optional rollback parameter (rather than needing to return a boolean). -* `addColumnWithName:` and variant methods now return the index of the newly created column if successful, `NSNotFound` otherwise. - -### Enhancements - -* `createTableWithName:columns:` has been added to `RLMRealm`. -* Added keyed subscripting for RLMTable's first column if column is of type RLMPropertyTypeString. -* `setRow:atIndex:` has been added to `RLMTable`. -* `RLMRealm` constructors now have variants that take an writable initialization block -* New object interface - tables created/retrieved using `tableWithName:objectClass:` return custom objects - -### Bugfixes - -* None. - - -0.6.0 Release notes (2014-04-11) -============================================================= - -### API breaking changes - -* `contextWithPersistenceToFile:error:` renamed to `contextPersistedAtPath:error:` in `TDBContext` -* `readWithBlock:` renamed to `readUsingBlock:` in `TDBContext` -* `writeWithBlock:error:` renamed to `writeUsingBlock:error:` in `TDBContext` -* `readTable:withBlock:` renamed to `readTable:usingBlock:` in `TDBContext` -* `writeTable:withBlock:error:` renamed to `writeTable:usingBlock:error:` in `TDBContext` -* `findFirstRow` renamed to `indexOfFirstMatchingRow` on `TDBQuery`. -* `findFirstRowFromIndex:` renamed to `indexOfFirstMatchingRowFromIndex:` on `TDBQuery`. -* Return `NSNotFound` instead of -1 when appropriate. -* Renamed `castClass` to `castToTytpedTableClass` on `TDBTable`. -* `removeAllRows`, `removeRowAtIndex`, `removeLastRow`, `addRow` and `insertRow` methods - on table now return void instead of BOOL. - -### Enhancements -* A `TDBTable` can now be queried using `where:` and `where:orderBy:` taking - `NSPredicate` and `NSSortDescriptor` as arguments. -* Added `find:` method on `TDBTable` to find first row matching predicate. -* `contextWithDefaultPersistence` class method added to `TDBContext`. Will create a context persisted - to a file in app/documents folder. -* `renameColumnWithIndex:to:` has been added to `TDBTable`. -* `distinctValuesInColumnWithIndex` has been added to `TDBTable`. -* `dateIsBetween::`, `doubleIsBetween::`, `floatIsBetween::` and `intIsBetween::` - have been added to `TDBQuery`. -* Column names in Typed Tables can begin with non-capital letters too. The generated `addX` - selector can look odd. For example, a table with one column with name `age`, - appending a new row will look like `[table addage:7]`. -* Mixed typed values are better validated when rows are added, inserted, - or modified as object literals. -* `addRow`, `insertRow`, and row updates can be done using objects - derived from `NSObject`. -* `where` has been added to `TDBView`and `TDBViewProtocol`. -* Adding support for "smart" contexts (`TDBSmartContext`). - -### Bugfixes - -* Modifications of a `TDBView` and `TDBQuery` now throw an exception in a readtransaction. - - -0.5.0 Release notes (2014-04-02) -============================================================= - -The Objective-C API has been updated and your code will break! -Of notable changes a fast interface has been added. -This interface includes specific methods to get and set values into Tightdb. -To use these methods import ``. - -### API breaking changes - -* `getTableWithName:` renamed to `tableWithName:` in `TDBTransaction`. -* `addColumnWithName:andType:` renamed to `addColumnWithName:type:` in `TDBTable`. -* `columnTypeOfColumn:` renamed to `columnTypeOfColumnWithIndex` in `TDBTable`. -* `columnNameOfColumn:` renamed to `nameOfColumnWithIndex:` in `TDBTable`. -* `addColumnWithName:andType:` renamed to `addColumnWithName:type:` in `TDBDescriptor`. -* Fast getters and setters moved from `TDBRow.h` to `TDBRowFast.h`. - -### Enhancements - -* Added `minDateInColumnWithIndex` and `maxDateInColumnWithIndex` to `TDBQuery`. -* Transactions can now be started directly on named tables. -* You can create dynamic tables with initial schema. -* `TDBTable` and `TDBView` now have a shared protocol so they can easier be used interchangeably. - -### Bugfixes - -* Fixed bug in 64 bit iOS when inserting BOOL as NSNumber. - - -0.4.0 Release notes (2014-03-26) -============================================================= - -### API breaking changes - -* Typed interface Cursor has now been renamed to Row. -* TDBGroup has been renamed to TDBTransaction. -* Header files are renamed so names match class names. -* Underscore (_) removed from generated typed table classes. -* TDBBinary has been removed; use NSData instead. -* Underscope (_) removed from generated typed table classes. -* Constructor for TDBContext has been renamed to contextWithPersistenceToFile: -* Table findFirstRow and min/max/sum/avg operations has been hidden. -* Table.appendRow has been renamed to addRow. -* getOrCreateTable on Transaction has been removed. -* set*:inColumnWithIndex:atRowIndex: methods have been prefixed with TDB -* *:inColumnWithIndex:atRowIndex: methods have been prefixed with TDB -* addEmptyRow on table has been removed. Use [table addRow:nil] instead. -* TDBMixed removed. Use id and NSObject instead. -* insertEmptyRow has been removed from table. Use insertRow:nil atIndex:index instead. - -#### Enhancements - -* Added firstRow, lastRow selectors on view. -* firstRow and lastRow on table now return nil if table is empty. -* getTableWithName selector added on group. -* getting and creating table methods on group no longer take error argument. -* [TDBQuery parent] and [TDBQuery subtable:] selectors now return self. -* createTable method added on Transaction. Throws exception if table with same name already exists. -* Experimental support for pinning transactions on Context. -* TDBView now has support for object subscripting. - -### Bugfixes - -* None. - - -0.3.0 Release notes (2014-03-14) -============================================================= - -The Objective-C API has been updated and your code will break! - -### API breaking changes - -* Most selectors have been renamed in the binding! -* Prepend TDB-prefix on all classes and types. - -### Enhancements - -* Return types and parameters changed from size_t to NSUInteger. -* Adding setObject to TightdbTable (t[2] = @[@1, @"Hello"] is possible). -* Adding insertRow to TightdbTable. -* Extending appendRow to accept NSDictionary. - -### Bugfixes - -* None. - - -0.2.0 Release notes (2014-03-07) -============================================================= - -The Objective-C API has been updated and your code will break! - -### API breaking changes - -* addRow renamed to addEmptyRow - -### Enhancements - -* Adding a simple class for version numbering. -* Adding get-version and set-version targets to build.sh. -* tableview now supports sort on column with column type bool, date and int -* tableview has method for checking the column type of a specified column -* tableview has method for getting the number of columns -* Adding methods getVersion, getCoreVersion and isAtLeast. -* Adding appendRow to TightdbTable. -* Adding object subscripting. -* Adding method removeColumn on table. - -### Bugfixes - -* None. diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/NSError+RLMSync.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/NSError+RLMSync.h deleted file mode 100644 index 5ef323a24..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/NSError+RLMSync.h +++ /dev/null @@ -1,46 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2017 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@class RLMSyncErrorActionToken; - -/// NSError category extension providing methods to get data out of Realm's -/// "client reset" error. -@interface NSError (RLMSync) - -/** - Given an appropriate Atlas App Services error, return the token that - can be passed into `+[RLMSyncSession immediatelyHandleError:]` to - immediately perform error clean-up work, or nil if the error isn't of - a type that provides a token. - */ -- (nullable RLMSyncErrorActionToken *)rlmSync_errorActionToken NS_REFINED_FOR_SWIFT; - -/** - Given an Atlas App Services client reset error, return the path where the - backup copy of the Realm will be placed once the client reset process is - complete. - */ -- (nullable NSString *)rlmSync_clientResetBackedUpRealmPath NS_SWIFT_UNAVAILABLE(""); - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMAPIKeyAuth.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMAPIKeyAuth.h deleted file mode 100644 index 642bdd95d..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMAPIKeyAuth.h +++ /dev/null @@ -1,95 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMUserAPIKey, RLMObjectId; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// Provider client for user API keys. -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMAPIKeyAuth : RLMProviderClient - -/// A block type used to report an error -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMAPIKeyAuthOptionalErrorBlock)(NSError * _Nullable); - -/// A block type used to return an `RLMUserAPIKey` on success, or an `NSError` on failure -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMOptionalUserAPIKeyBlock)(RLMUserAPIKey * _Nullable, NSError * _Nullable); - -/// A block type used to return an array of `RLMUserAPIKey` on success, or an `NSError` on failure -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMUserAPIKeysBlock)(NSArray * _Nullable, NSError * _Nullable); - -/** - Creates a user API key that can be used to authenticate as the current user. - - @param name The name of the API key to be created. - @param completion A callback to be invoked once the call is complete. -*/ -- (void)createAPIKeyWithName:(NSString *)name - completion:(RLMOptionalUserAPIKeyBlock)completion NS_SWIFT_NAME(createAPIKey(named:completion:)); - -/** - Fetches a user API key associated with the current user. - - @param objectId The ObjectId of the API key to fetch. - @param completion A callback to be invoked once the call is complete. - */ -- (void)fetchAPIKey:(RLMObjectId *)objectId - completion:(RLMOptionalUserAPIKeyBlock)completion; - -/** - Fetches the user API keys associated with the current user. - - @param completion A callback to be invoked once the call is complete. - */ -- (void)fetchAPIKeysWithCompletion:(RLMUserAPIKeysBlock)completion; - -/** - Deletes a user API key associated with the current user. - - @param objectId The ObjectId of the API key to delete. - @param completion A callback to be invoked once the call is complete. - */ -- (void)deleteAPIKey:(RLMObjectId *)objectId - completion:(RLMAPIKeyAuthOptionalErrorBlock)completion; - -/** - Enables a user API key associated with the current user. - - @param objectId The ObjectId of the API key to enable. - @param completion A callback to be invoked once the call is complete. - */ -- (void)enableAPIKey:(RLMObjectId *)objectId - completion:(RLMAPIKeyAuthOptionalErrorBlock)completion; - -/** - Disables a user API key associated with the current user. - - @param objectId The ObjectId of the API key to disable. - @param completion A callback to be invoked once the call is complete. - */ -- (void)disableAPIKey:(RLMObjectId *)objectId - completion:(RLMAPIKeyAuthOptionalErrorBlock)completion; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMApp.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMApp.h deleted file mode 100644 index 2228232e8..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMApp.h +++ /dev/null @@ -1,235 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@protocol RLMNetworkTransport, RLMBSON; - -@class RLMUser, RLMCredentials, RLMSyncManager, RLMEmailPasswordAuth, RLMPushClient, RLMSyncTimeoutOptions; - -/// A block type used for APIs which asynchronously vend an `RLMUser`. -typedef void(^RLMUserCompletionBlock)(RLMUser * _Nullable, NSError * _Nullable); - -/// A block type used to report an error -typedef void(^RLMOptionalErrorBlock)(NSError * _Nullable); - -#pragma mark RLMAppConfiguration - -/// Properties representing the configuration of a client -/// that communicate with a particular Realm application. -@interface RLMAppConfiguration : NSObject - -/// A custom base URL to request against. -@property (nonatomic, strong, nullable) NSString *baseURL; - -/// The custom transport for network calls to the server. -@property (nonatomic, strong, nullable) id transport; - -/// :nodoc: -@property (nonatomic, strong, nullable) NSString *localAppName - __attribute__((deprecated("This field is not used"))); -/// :nodoc: -@property (nonatomic, strong, nullable) NSString *localAppVersion - __attribute__((deprecated("This field is not used"))); - -/// The default timeout for network requests. -@property (nonatomic, assign) NSUInteger defaultRequestTimeoutMS; - -/// If enabled (the default), a single connection is used for all Realms opened -/// with a single sync user. If disabled, a separate connection is used for each -/// Realm. -/// -/// Session multiplexing reduces resources used and typically improves -/// performance. When multiplexing is enabled, the connection is not immediately -/// closed when the last session is closed, and instead remains open for -/// ``RLMSyncTimeoutOptions.connectionLingerTime`` milliseconds (30 seconds by -/// default). -@property (nonatomic, assign) BOOL enableSessionMultiplexing; - -/** - Options for the assorted types of connection timeouts for sync connections. - - If nil default values for all timeouts are used instead. - */ -@property (nonatomic, nullable, copy) RLMSyncTimeoutOptions *syncTimeouts; - -/// :nodoc: -- (instancetype)initWithBaseURL:(nullable NSString *)baseURL - transport:(nullable id)transport - localAppName:(nullable NSString *)localAppName - localAppVersion:(nullable NSString *)localAppVersion -__attribute__((deprecated("localAppName and localAppVersion are unused"))); - -/// :nodoc: -- (instancetype)initWithBaseURL:(nullable NSString *) baseURL - transport:(nullable id)transport - localAppName:(nullable NSString *)localAppName - localAppVersion:(nullable NSString *)localAppVersion - defaultRequestTimeoutMS:(NSUInteger)defaultRequestTimeoutMS -__attribute__((deprecated("localAppName and localAppVersion are unused"))); - -/** -Create a new Realm App configuration. - -@param baseURL A custom base URL to request against. -@param transport A custom network transport. -*/ -- (instancetype)initWithBaseURL:(nullable NSString *)baseURL - transport:(nullable id)transport; - -/** - Create a new Realm App configuration. - - @param baseURL A custom base URL to request against. - @param transport A custom network transport. - @param defaultRequestTimeoutMS A custom default timeout for network requests. - */ -- (instancetype)initWithBaseURL:(nullable NSString *) baseURL - transport:(nullable id)transport - defaultRequestTimeoutMS:(NSUInteger)defaultRequestTimeoutMS; - -@end - -#pragma mark RLMApp - -/** - The `RLMApp` has the fundamental set of methods for communicating with a Realm - application backend. - - This interface provides access to login and authentication. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // internally thread-safe -@interface RLMApp : NSObject - -/// The configuration for this Realm app. -@property (nonatomic, readonly) RLMAppConfiguration *configuration; - -/// The `RLMSyncManager` for this Realm app. -@property (nonatomic, readonly) RLMSyncManager *syncManager; - -/// Get a dictionary containing all users keyed on id. -@property (nonatomic, readonly) NSDictionary *allUsers; - -/// Get the current user logged into the Realm app. -@property (nonatomic, readonly, nullable) RLMUser *currentUser; - -/// The app ID for this Realm app. -@property (nonatomic, readonly) NSString *appId; - -/** - A client for the email/password authentication provider which - can be used to obtain a credential for logging in. - - Used to perform requests specifically related to the email/password provider. -*/ -@property (nonatomic, readonly) RLMEmailPasswordAuth *emailPasswordAuth; - -/** - Get an application with a given appId and configuration. - - @param appId The unique identifier of your Realm app. - */ -+ (instancetype)appWithId:(NSString *)appId; - -/** - Get an application with a given appId and configuration. - - @param appId The unique identifier of your Realm app. - @param configuration A configuration object to configure this client. - */ -+ (instancetype)appWithId:(NSString *)appId - configuration:(nullable RLMAppConfiguration *)configuration; - -/** - Login to a user for the Realm app. - - @param credentials The credentials identifying the user. - @param completion A callback invoked after completion. - */ -- (void)loginWithCredential:(RLMCredentials *)credentials - completion:(RLMUserCompletionBlock)completion NS_REFINED_FOR_SWIFT; - -/** - Switches the active user to the specified user. - - This sets which user is used by all RLMApp operations which require a user. This is a local operation which does not access the network. - An exception will be throw if the user is not valid. The current user will remain logged in. - - @param syncUser The user to switch to. - @returns The user you intend to switch to - */ -- (RLMUser *)switchToUser:(RLMUser *)syncUser; - -/** - A client which can be used to register devices with the server to receive push notificatons - */ -- (RLMPushClient *)pushClientWithServiceName:(NSString *)serviceName - NS_SWIFT_NAME(pushClient(serviceName:)); - -/** - RLMApp instances are cached internally by Realm and cannot be created directly. - - Use `+[RLMRealm appWithId]` or `+[RLMRealm appWithId:configuration:]` - to obtain a reference to an RLMApp. - */ -- (instancetype)init __attribute__((unavailable("Use +appWithId or appWithId:configuration:."))); - -/** -RLMApp instances are cached internally by Realm and cannot be created directly. - -Use `+[RLMRealm appWithId]` or `+[RLMRealm appWithId:configuration:]` -to obtain a reference to an RLMApp. -*/ -+ (instancetype)new __attribute__((unavailable("Use +appWithId or appWithId:configuration:."))); - -@end - -#pragma mark - Sign In With Apple Extension - -API_AVAILABLE(ios(13.0), macos(10.15), tvos(13.0), watchos(6.0)) -/// Use this delegate to be provided a callback once authentication has succeed or failed -@protocol RLMASLoginDelegate - -/// Callback that is invoked should the authentication fail. -/// @param error An error describing the authentication failure. -- (void)authenticationDidFailWithError:(NSError *)error NS_SWIFT_NAME(authenticationDidComplete(error:)); - -/// Callback that is invoked should the authentication succeed. -/// @param user The newly authenticated user. -- (void)authenticationDidCompleteWithUser:(RLMUser *)user NS_SWIFT_NAME(authenticationDidComplete(user:)); - -@end - -API_AVAILABLE(ios(13.0), macos(10.15), tvos(13.0), watchos(6.0)) -/// Category extension that deals with Sign In With Apple authentication. -/// This is only available on OS's that support `AuthenticationServices` -@interface RLMApp (ASLogin) - -/// Use this delegate to be provided a callback once authentication has succeed or failed. -@property (nonatomic, weak, nullable) id authorizationDelegate; - -/// Sets the ASAuthorizationControllerDelegate to be handled by `RLMApp` -/// @param controller The ASAuthorizationController in which you want `RLMApp` to consume its delegate. -- (void)setASAuthorizationControllerDelegateForController:(ASAuthorizationController *)controller NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMArray.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMArray.h deleted file mode 100644 index b2c6c1664..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMArray.h +++ /dev/null @@ -1,652 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObject, RLMResults; - -/** - `RLMArray` is the container type in Realm used to define to-many relationships. - - Unlike an `NSArray`, `RLMArray`s hold a single type, specified by the `objectClassName` property. - This is referred to in these docs as the “type” of the array. - - When declaring an `RLMArray` property, the type must be marked as conforming to a - protocol by the same name as the objects it should contain (see the - `RLM_COLLECTION_TYPE` macro). In addition, the property can be declared using Objective-C - generics for better compile-time type safety. - - RLM_COLLECTION_TYPE(ObjectType) - ... - @property RLMArray *arrayOfObjectTypes; - - `RLMArray`s can be queried with the same predicates as `RLMObject` and `RLMResult`s. - - `RLMArray`s cannot be created directly. `RLMArray` properties on `RLMObject`s are - lazily created when accessed, or can be obtained by querying a Realm. - - ### Key-Value Observing - - `RLMArray` supports array key-value observing on `RLMArray` properties on `RLMObject` - subclasses, and the `invalidated` property on `RLMArray` instances themselves is - key-value observing compliant when the `RLMArray` is attached to a managed - `RLMObject` (`RLMArray`s on unmanaged `RLMObject`s will never become invalidated). - - Because `RLMArray`s are attached to the object which they are a property of, they - do not require using the mutable collection proxy objects from - `-mutableArrayValueForKey:` or KVC-compatible mutation methods on the containing - object. Instead, you can call the mutation methods on the `RLMArray` directly. - */ - -@interface RLMArray : NSObject - -#pragma mark - Properties - -/** - The number of objects in the array. - */ -@property (nonatomic, readonly, assign) NSUInteger count; - -/** - The type of the objects in the array. - */ -@property (nonatomic, readonly, assign) RLMPropertyType type; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readonly, getter = isOptional) BOOL optional; - -/** - The class name of the objects contained in the array. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages the array. Returns `nil` for unmanaged arrays. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - Indicates if the array can no longer be accessed. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if the array is frozen. - - Frozen arrays are immutable and can be accessed from any thread. Frozen arrays - are created by calling `-freeze` on a managed live array. Unmanaged arrays are - never frozen. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Accessing Objects from an Array - -/** - Returns the object at the index specified. - - @param index The index to look up. - - @return An object of the type contained in the array. - */ -- (RLMObjectType)objectAtIndex:(NSUInteger)index; - -/** - Returns an array containing the objects in the array at the indexes specified by a given index set. - `nil` will be returned if the index set contains an index out of the arrays bounds. - - @param indexes The indexes in the array to retrieve objects from. - - @return The objects at the specified indexes. - */ -- (nullable NSArray *)objectsAtIndexes:(NSIndexSet *)indexes; - -/** - Returns the first object in the array. - - Returns `nil` if called on an empty array. - - @return An object of the type contained in the array. - */ -- (nullable RLMObjectType)firstObject; - -/** - Returns the last object in the array. - - Returns `nil` if called on an empty array. - - @return An object of the type contained in the array. - */ -- (nullable RLMObjectType)lastObject; - - - -#pragma mark - Adding, Removing, and Replacing Objects in an Array - -/** - Adds an object to the end of the array. - - @warning This method may only be called during a write transaction. - - @param object An object of the type contained in the array. - */ -- (void)addObject:(RLMObjectType)object; - -/** - Adds an array of objects to the end of the array. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable object such as `NSArray` or `RLMResults` which contains objects of the - same class as the array. - */ -- (void)addObjects:(id)objects; - -/** - Inserts an object at the given index. - - Throws an exception if the index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param anObject An object of the type contained in the array. - @param index The index at which to insert the object. - */ -- (void)insertObject:(RLMObjectType)anObject atIndex:(NSUInteger)index; - -/** - Removes an object at the given index. - - Throws an exception if the index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param index The array index identifying the object to be removed. - */ -- (void)removeObjectAtIndex:(NSUInteger)index; - -/** - Removes the last object in the array. - - This is a no-op if the array is already empty. - - @warning This method may only be called during a write transaction. -*/ -- (void)removeLastObject; - -/** - Removes all objects from the array. - - @warning This method may only be called during a write transaction. - */ -- (void)removeAllObjects; - -/** - Replaces an object at the given index with a new object. - - Throws an exception if the index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param index The index of the object to be replaced. - @param anObject An object (of the same type as returned from the `objectClassName` selector). - */ -- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(RLMObjectType)anObject; - -/** - Moves the object at the given source index to the given destination index. - - Throws an exception if the index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param sourceIndex The index of the object to be moved. - @param destinationIndex The index to which the object at `sourceIndex` should be moved. - */ -- (void)moveObjectAtIndex:(NSUInteger)sourceIndex toIndex:(NSUInteger)destinationIndex; - -/** - Exchanges the objects in the array at given indices. - - Throws an exception if either index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param index1 The index of the object which should replace the object at index `index2`. - @param index2 The index of the object which should replace the object at index `index1`. - */ -- (void)exchangeObjectAtIndex:(NSUInteger)index1 withObjectAtIndex:(NSUInteger)index2; - -#pragma mark - Querying an Array - -/** - Returns the index of an object in the array. - - Returns `NSNotFound` if the object is not found in the array. - - @param object An object (of the same type as returned from the `objectClassName` selector). - */ -- (NSUInteger)indexOfObject:(RLMObjectType)object; - -/** - Returns the index of the first object in the array matching the predicate. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return The index of the object, or `NSNotFound` if the object is not found in the array. - */ -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns the index of the first object in the array matching the predicate. - - @param predicate The predicate with which to filter the objects. - - @return The index of the object, or `NSNotFound` if the object is not found in the array. - */ -- (NSUInteger)indexOfObjectWithPredicate:(NSPredicate *)predicate; - -/** - Returns all the objects matching the given predicate in the array. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` of objects that match the given predicate. - */ -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all the objects matching the given predicate in the array. - - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` of objects that match the given predicate - */ -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/** - Returns a sorted `RLMResults` from the array. - - @param keyPath The key path to sort by. - @param ascending The direction to sort in. - - @return An `RLMResults` sorted by the specified key path. - */ -- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a sorted `RLMResults` from the array. - - @param properties An array of `RLMSortDescriptor`s to sort by. - - @return An `RLMResults` sorted by the specified properties. - */ -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/** - Returns a distinct `RLMResults` from the array. - - @param keyPaths The key paths to distinct on. - - @return An `RLMResults` with the distinct values of the keypath(s). - */ -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -/// :nodoc: -- (RLMObjectType)objectAtIndexedSubscript:(NSUInteger)index; - -/// :nodoc: -- (void)setObject:(RLMObjectType)newValue atIndexedSubscript:(NSUInteger)index; - -#pragma mark - Sectioning an Array - -/** - Sorts and sections this collection from a given property key path, returning the result - as an instance of `RLMSectionedResults`. - - @param keyPath The property key path to sort on. - @param ascending The direction to sort in. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsSortedUsingKeyPath:(NSString *)keyPath - ascending:(BOOL)ascending - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -/** - Sorts and sections this collection from a given array of sort descriptors, returning the result - as an instance of `RLMSectionedResults`. - - @param sortDescriptors An array of `RLMSortDescriptor`s to sort by. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @note The primary sort descriptor must be responsible for determining the section key. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsUsingSortDescriptors:(NSArray *)sortDescriptors - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - - -#pragma mark - Notifications - -/** - Registers a block to be called each time the array changes. - - The block will be asynchronously called with the initial array, and then - called again after each write transaction which changes any of the objects in - the array, which objects are in the results, or the order of the objects in the - array. - - The `changes` parameter will be `nil` the first time the block is called. For - each call after that, it will contain information about which rows in the - array were added, removed or modified. If a write transaction did not modify - any objects in the array, the block is not called at all. See the - `RLMCollectionChange` documentation for information on how the changes are - reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - Person *person = [[Person allObjectsInRealm:realm] firstObject]; - NSLog(@"person.dogs.count: %zu", person.dogs.count); // => 0 - self.token = [person.dogs addNotificationBlock(RLMArray *dogs, - RLMCollectionChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count) // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - [person.dogs addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a non-frozen managed array. - - @param block The block to be called each time the array changes. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMArray *_Nullable array, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the array changes. - - The block will be asynchronously called with the initial array, and then - called again after each write transaction which changes any of the objects in - the array, which objects are in the results, or the order of the objects in the - array. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the array were added, removed or modified. If a write transaction - did not modify any objects in the array, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMArray *_Nullable array, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the array changes. - - The block will be asynchronously called with the initial array, and then - called again after each write transaction which changes any of the objects in - the array, which objects are in the results, or the order of the objects in the - array. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the array were added, removed or modified. If a write transaction - did not modify any objects in the array, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMArray *_Nullable array, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the array changes. - - The block will be asynchronously called with the initial array, and then - called again after each write transaction which changes any of the objects in - the array, which objects are in the results, or the order of the objects in the - array. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the array were added, removed or modified. If a write transaction - did not modify any objects in the array, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMArray *_Nullable array, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths -__attribute__((warn_unused_result)); - -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the objects in the array. - - NSNumber *min = [object.arrayProperty minOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The minimum value of the property, or `nil` if the array is empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects in the array. - - NSNumber *max = [object.arrayProperty maxOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose maximum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The maximum value of the property, or `nil` if the array is empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of the values of a given property over all the objects in the array. - - NSNumber *sum = [object.arrayProperty sumOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose values should be summed. Only properties of - types `int`, `float`, and `double` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects in the array. - - NSNumber *average = [object.arrayProperty averageOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose average value should be calculated. Only - properties of types `int`, `float`, and `double` are supported. - - @return The average value of the given property, or `nil` if the array is empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this array. - - The frozen copy is an immutable array which contains the same data as this - array currently contains, but will not update when writes are made to the - containing Realm. Unlike live arrays, frozen arrays can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a managed array. - @warning Holding onto a frozen array for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -#pragma mark - Unavailable Methods - -/** - `-[RLMArray init]` is not available because `RLMArray`s cannot be created directly. - `RLMArray` properties on `RLMObject`s are lazily created when accessed. - */ -- (instancetype)init __attribute__((unavailable("RLMArrays cannot be created directly"))); - -/** - `+[RLMArray new]` is not available because `RLMArray`s cannot be created directly. - `RLMArray` properties on `RLMObject`s are lazily created when accessed. - */ -+ (instancetype)new __attribute__((unavailable("RLMArrays cannot be created directly"))); - -@end - -/// :nodoc: -@interface RLMArray (Swift) -// for use only in Swift class definitions -- (instancetype)initWithObjectClassName:(NSString *)objectClassName; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMAsymmetricObject.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMAsymmetricObject.h deleted file mode 100644 index 09deb787e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMAsymmetricObject.h +++ /dev/null @@ -1,98 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2022 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectSchema, RLMPropertyDescriptor, RLMRealm; -/** - `RLMAsymmetricObject` is a base class used to define asymmetric Realm objects. - - Asymmetric objects can only be created using the `createInRealm:` - function, and cannot be added, removed or queried. - When created, asymmetric objects will be synced unidirectionally to the MongoDB - database and cannot be accessed locally. - - Linking an asymmetric object within an `Object` is not allowed and will throw an error. - - The property types supported on `RLMAsymmetricObject` are the same as for `RLMObject`, - except for that asymmetric objects can only link to embedded objects, so `RLMObject` - and `RLMArray` properties are not supported (`RLMEmbeddedObject` and - `RLMArray` *are*). - */ -@interface RLMAsymmetricObject : RLMObjectBase - -#pragma mark - Creating & Initializing Objects - -/** - Creates an unmanaged instance of a Realm object. - */ -- (instancetype)init NS_DESIGNATED_INITIALIZER; - -/** - Creates an unmanaged instance of a Realm object. - - Pass in an `NSArray` or `NSDictionary` instance to set the values of the object's properties. - */ -- (instancetype)initWithValue:(id)value; - -/** - Returns the class name for a Realm object subclass. - - @warning Do not override. Realm relies on this method returning the exact class - name. - - @return The class name for the model class. - */ -+ (NSString *)className; - -/** - Creates an Asymmetric object, which will be synced unidirectionally and - cannot be queried locally. - - Objects created using this method will not be added to the Realm. - - @warning This method may only be called during a write transaction. - @warning This method always returns nil. - - @param realm The Realm to be used to create the asymmetric object.. - @param value The value used to populate the object. - - @return Returns `nil` - */ -+ (instancetype)createInRealm:(RLMRealm *)realm withValue:(id)value; - -#pragma mark - Properties - -/** - The object schema which lists the managed properties for the object. - */ -@property (nonatomic, readonly) RLMObjectSchema *objectSchema; - -#pragma mark - Dynamic Accessors - -/// :nodoc: -- (nullable id)objectForKeyedSubscript:(NSString *)key; - -/// :nodoc: -- (void)setObject:(nullable id)obj forKeyedSubscript:(NSString *)key; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMAsyncTask.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMAsyncTask.h deleted file mode 100644 index 9f7dc58da..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMAsyncTask.h +++ /dev/null @@ -1,67 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A task object which can be used to observe or cancel an async open. - - When a synchronized Realm is opened asynchronously, the latest state of the - Realm is downloaded from the server before the completion callback is invoked. - This task object can be used to observe the state of the download or to cancel - it. This should be used instead of trying to observe the download via the sync - session as the sync session itself is created asynchronously, and may not exist - yet when -[RLMRealm asyncOpenWithConfiguration:completion:] returns. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMAsyncOpenTask : NSObject -/** - Register a progress notification block. - - Each registered progress notification block is called whenever the sync - subsystem has new progress data to report until the task is either cancelled - or the completion callback is called. Progress notifications are delivered on - the main queue. - */ -- (void)addProgressNotificationBlock:(RLMProgressNotificationBlock)block; - -/** - Register a progress notification block which is called on the given queue. - - Each registered progress notification block is called whenever the sync - subsystem has new progress data to report until the task is either cancelled - or the completion callback is called. Progress notifications are delivered on - the supplied queue. - */ -- (void)addProgressNotificationOnQueue:(dispatch_queue_t)queue - block:(RLMProgressNotificationBlock)block; - -/** - Cancel the asynchronous open. - - Any download in progress will be cancelled, and the completion block for this - async open will never be called. If multiple async opens on the same Realm are - happening concurrently, all other opens will fail with the error "operation cancelled". - */ -- (void)cancel; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMBSON.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMBSON.h deleted file mode 100644 index 41750fd57..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMBSON.h +++ /dev/null @@ -1,174 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -#pragma mark RLMBSONType - -/** - Allowed BSON types. - */ -typedef NS_ENUM(NSUInteger, RLMBSONType) { - /// BSON Null type - RLMBSONTypeNull, - /// BSON Int32 type - RLMBSONTypeInt32, - /// BSON Int64 type - RLMBSONTypeInt64, - /// BSON Bool type - RLMBSONTypeBool, - /// BSON Double type - RLMBSONTypeDouble, - /// BSON String type - RLMBSONTypeString, - /// BSON Binary type - RLMBSONTypeBinary, - /// BSON Timestamp type - RLMBSONTypeTimestamp, - /// BSON Datetime type - RLMBSONTypeDatetime, - /// BSON ObjectId type - RLMBSONTypeObjectId, - /// BSON Decimal128 type - RLMBSONTypeDecimal128, - /// BSON RegularExpression type - RLMBSONTypeRegularExpression, - /// BSON MaxKey type - RLMBSONTypeMaxKey, - /// BSON MinKey type - RLMBSONTypeMinKey, - /// BSON Document type - RLMBSONTypeDocument, - /// BSON Array type - RLMBSONTypeArray, - /// BSON UUID type - RLMBSONTypeUUID -}; - -#pragma mark RLMBSON - -/** - Protocol representing a BSON value. BSON is a computer data interchange format. - The name "BSON" is based on the term JSON and stands for "Binary JSON". - - The following types conform to RLMBSON: - - `NSNull` - `NSNumber` - `NSString` - `NSData` - `NSDateInterval` - `NSDate` - `RLMObjectId` - `RLMDecimal128` - `NSRegularExpression` - `RLMMaxKey` - `RLMMinKey` - `NSDictionary` - `NSArray` - `NSUUID` - - @see RLMBSONType - @see bsonspec.org - */ -@protocol RLMBSON - -/** - The BSON type for the conforming interface. - */ -@property (readonly) RLMBSONType bsonType NS_REFINED_FOR_SWIFT; - -/** - Whether or not this BSON is equal to another. - - @param other The BSON to compare to - */ -- (BOOL)isEqual:(_Nullable id)other; - -@end - -/// :nodoc: -@interface NSNull (RLMBSON) -@end - -/// :nodoc: -@interface NSNumber (RLMBSON) -@end - -/// :nodoc: -@interface NSString (RLMBSON) -@end - -/// :nodoc: -@interface NSData (RLMBSON) -@end - -/// :nodoc: -@interface NSDateInterval (RLMBSON) -@end - -/// :nodoc: -@interface NSDate (RLMBSON) -@end - -/// :nodoc: -@interface RLMObjectId (RLMBSON) -@end - -/// :nodoc: -@interface RLMDecimal128 (RLMBSON) -@end - -/// :nodoc: -@interface NSRegularExpression (RLMBSON) -@end - -/// MaxKey will always be the greatest value when comparing to other BSON types -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMMaxKey : NSObject -@end - -/// MinKey will always be the smallest value when comparing to other BSON types -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMMinKey : NSObject -@end - -/// :nodoc: -@interface RLMMaxKey (RLMBSON) -@end - -/// :nodoc: -@interface RLMMinKey (RLMBSON) -@end - -/// :nodoc: -@interface NSDictionary (RLMBSON) -@end - -/// :nodoc: -@interface NSMutableArray (RLMBSON) -@end - -/// :nodoc: -@interface NSArray (RLMBSON) -@end - -/// :nodoc: -@interface NSUUID (RLMBSON) -@end diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMCollection.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMCollection.h deleted file mode 100644 index eac117f17..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMCollection.h +++ /dev/null @@ -1,613 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@protocol RLMValue; -@class RLMRealm, RLMResults, RLMSortDescriptor, RLMNotificationToken, RLMCollectionChange, RLMSectionedResults; -typedef RLM_CLOSED_ENUM(int32_t, RLMPropertyType); -/// A callback which is invoked on each element in the Results collection which returns the section key. -typedef id _Nullable(^RLMSectionedResultsKeyBlock)(id); - -/** - A homogenous collection of Realm-managed objects. Examples of conforming types - include `RLMArray`, `RLMSet`, `RLMResults`, and `RLMLinkingObjects`. - */ -@protocol RLMCollection - -#pragma mark - Properties - -/** - The number of objects in the collection. - */ -@property (nonatomic, readonly) NSUInteger count; - -/** - The type of the objects in the collection. - */ -@property (nonatomic, readonly) RLMPropertyType type; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readonly, getter = isOptional) BOOL optional; - -/** - The class name of the objects contained in the collection. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages this collection, if any. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - Indicates if the collection is no longer valid. - - The collection becomes invalid if `invalidate` is called on the managing - Realm. Unmanaged collections are never invalidated. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -#pragma mark - Accessing Objects from a Collection - -/** - Returns the object at the index specified. - - @param index The index to look up. - - @return An object of the type contained in the collection. - */ -- (id)objectAtIndex:(NSUInteger)index; - -@optional - -/** - Returns an array containing the objects in the collection at the indexes - specified by a given index set. `nil` will be returned if the index set - contains an index out of the collections bounds. - - @param indexes The indexes in the collection to retrieve objects from. - - @return The objects at the specified indexes. - */ -- (nullable NSArray *)objectsAtIndexes:(NSIndexSet *)indexes; - -/** - Returns the first object in the collection. - - RLMSet is not ordered, and so for sets this will return an arbitrary object in - the set. It is not guaraneed to be a different object from what `lastObject` - gives even if the set has multiple objects in it. - - Returns `nil` if called on an empty collection. - - @return An object of the type contained in the collection. - */ -- (nullable id)firstObject; - -/** - Returns the last object in the collection. - - RLMSet is not ordered, and so for sets this will return an arbitrary object in - the set. It is not guaraneed to be a different object from what `firstObject` - gives even if the set has multiple objects in it. - - Returns `nil` if called on an empty collection. - - @return An object of the type contained in the collection. - */ -- (nullable id)lastObject; - -/// :nodoc: -- (id)objectAtIndexedSubscript:(NSUInteger)index; - -/** - Returns the index of an object in the collection. - - Returns `NSNotFound` if the object is not found in the collection. - - @param object An object (of the same type as returned from the `objectClassName` selector). - */ -- (NSUInteger)indexOfObject:(id)object; - -/** - Returns the index of the first object in the collection matching the predicate. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return The index of the object, or `NSNotFound` if the object is not found in the collection. - */ -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns the index of the first object in the collection matching the predicate. - - @param predicate The predicate with which to filter the objects. - - @return The index of the object, or `NSNotFound` if the object is not found in the collection. - */ -- (NSUInteger)indexOfObjectWithPredicate:(NSPredicate *)predicate; - -@required - -#pragma mark - Querying a Collection - -/** - Returns all objects matching the given predicate in the collection. - - This is only supported for managed collections. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - @return An `RLMResults` containing objects that match the given predicate. - */ -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all objects matching the given predicate in the collection. - - This is only supported for managed collections. - - @param predicate The predicate with which to filter the objects. - @return An `RLMResults` containing objects that match the given predicate. - */ -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/** - Returns a sorted `RLMResults` from the collection. - - This is only supported for managed collections. - - @param keyPath The keyPath to sort by. - @param ascending The direction to sort in. - @return An `RLMResults` sorted by the specified key path. - */ -- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a sorted `RLMResults` from the collection. - - This is only supported for managed collections. - - @param properties An array of `RLMSortDescriptor`s to sort by. - @return An `RLMResults` sorted by the specified properties. - */ -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/** - Returns a distinct `RLMResults` from the collection. - - This is only supported for managed collections. - - @param keyPaths The key paths used produce distinct results - @return An `RLMResults` made distinct based on the specified key paths - */ -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -/** - Returns an `NSArray` containing the results of invoking `valueForKey:` using - `key` on each of the collection's objects. - - @param key The name of the property. - - @return An `NSArray` containing results. - */ -- (nullable id)valueForKey:(NSString *)key; - -/** - Returns the value for the derived property identified by a given key path. - - @param keyPath A key path of the form relationship.property (with one or more relationships). - - @return The value for the derived property identified by keyPath. - */ -- (nullable id)valueForKeyPath:(NSString *)keyPath; - -/** - Invokes `setValue:forKey:` on each of the collection's objects using the specified `value` and `key`. - - @warning This method may only be called during a write transaction. - - @param value The object value. - @param key The name of the property. - */ -- (void)setValue:(nullable id)value forKey:(NSString *)key; - -#pragma mark - Notifications - -/** -Registers a block to be called each time the collection changes. - -The block will be asynchronously called with the initial collection, -and then called again after each write transaction which changes either any -of the objects in the collection, or which objects are in the collection. - -The `change` parameter will be `nil` the first time the block is called. -For each call after that, it will contain information about -which rows in the collection were added, removed or modified. If a -write transaction did not modify any objects in the results collection, -the block is not called at all. See the `RLMCollectionChange` documentation for -information on how the changes are reported and an example of updating a -`UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - -At the time when the block is called, the collection object will be fully -evaluated and up-to-date, and as long as you do not perform a write transaction -on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will -never perform blocking work. - -Notifications are delivered via the standard run loop, and so can't be -delivered while the run loop is blocked by other activity. When -notifications can't be delivered instantly, multiple notifications may be -coalesced into a single notification. This can include the notification -with the initial results. For example, the following code performs a write -transaction immediately after adding the notification block, so there is no -opportunity for the initial notification to be delivered first. As a -result, the initial notification will reflect the state of the Realm after -the write transaction. - - RLMResults *results = [Dog allObjects]; - NSLog(@"dogs.count: %zu", dogs.count); // => 0 - self.token = [results addNotificationBlock:^(RLMResults *dogs, - RLMCollectionChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - [realm addObject:dog]; - }]; - // end of run loop execution context - -You must retain the returned token for as long as you want updates to continue -to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - -@warning This method cannot be called during a write transaction, or when the - containing Realm is read-only or frozen. - -@param block The block to be called whenever a change occurs. -@return A token which must be held for as long as you want updates to be delivered. -*/ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** -Registers a block to be called each time the collection changes. - -The block will be asynchronously called with the initial collection, -and then called again after each write transaction which changes either any -of the objects in the collection, or which objects are in the collection. - -The `change` parameter will be `nil` the first time the block is called. -For each call after that, it will contain information about -which rows in the collection were added, removed or modified. If a -write transaction did not modify any objects in the results collection, -the block is not called at all. See the `RLMCollectionChange` documentation for -information on how the changes are reported and an example of updating a -`UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - -At the time when the block is called, the collection object will be fully -evaluated and up-to-date, and as long as you do not perform a write transaction -on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will -never perform blocking work. - -Notifications are delivered on the given queue. If the queue is blocked and -notifications can't be delivered instantly, multiple notifications may be -coalesced into a single notification. - -You must retain the returned token for as long as you want updates to continue -to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - -@warning This method cannot be called when the containing Realm is read-only or frozen. -@warning The queue must be a serial queue. - -@param block The block to be called whenever a change occurs. -@param queue The serial queue to deliver notifications to. -@return A token which must be held for as long as you want updates to be delivered. -*/ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** -Registers a block to be called each time the collection changes. - -The block will be asynchronously called with the initial collection, -and then called again after each write transaction which changes either any -of the objects in the collection, or which objects are in the collection. - -The `change` parameter will be `nil` the first time the block is called. -For each call after that, it will contain information about -which rows in the collection were added, removed or modified. If a -write transaction did not modify any objects in the results collection, -the block is not called at all. See the `RLMCollectionChange` documentation for -information on how the changes are reported and an example of updating a -`UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - -At the time when the block is called, the collection object will be fully -evaluated and up-to-date, and as long as you do not perform a write transaction -on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will -never perform blocking work. - -Notifications are delivered on the given queue. If the queue is blocked and -notifications can't be delivered instantly, multiple notifications may be -coalesced into a single notification. - -You must retain the returned token for as long as you want updates to continue -to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - -@warning This method cannot be called when the containing Realm is read-only or frozen. -@warning The queue must be a serial queue. - -@param block The block to be called whenever a change occurs. -@param queue The serial queue to deliver notifications to. -@param keyPaths The block will be called for changes occurring on these keypaths. If no -key paths are given, notifications are delivered for every property key path. -@return A token which must be held for as long as you want updates to be delivered. -*/ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -#pragma mark - Sectioned Results - -/** - Sorts and sections this collection from a given property key path, returning the result - as an instance of `RLMSectionedResults`. - - @param keyPath The property key path to sort on. - @param ascending The direction to sort in. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsSortedUsingKeyPath:(NSString *)keyPath - ascending:(BOOL)ascending - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -/** - Sorts and sections this collection from a given array of sort descriptors, returning the result - as an instance of `RLMSectionedResults`. - - @param sortDescriptors An array of `RLMSortDescriptor`s to sort by. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @note The primary sort descriptor must be responsible for determining the section key. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsUsingSortDescriptors:(NSArray *)sortDescriptors - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the objects - in the collection. - - NSNumber *min = [results minOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The minimum value of the property, or `nil` if the Results are empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects - in the collection. - - NSNumber *max = [results maxOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose maximum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The maximum value of the property, or `nil` if the Results are empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of the values of a given property over all the objects in the collection. - - NSNumber *sum = [results sumOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose values should be summed. Only properties of - types `int`, `float`, and `double` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects in the collection. - - NSNumber *average = [results averageOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose average value should be calculated. Only - properties of types `int`, `float`, and `double` are supported. - - @return The average value of the given property, or `nil` if the Results are empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -#pragma mark - Freeze - -/** - Indicates if the collection is frozen. - - Frozen collections are immutable and can be accessed from any thread. The - objects read from a frozen collection will also be frozen. - */ -@property (nonatomic, readonly, getter=isFrozen) BOOL frozen; - -/** - Returns a frozen (immutable) snapshot of this collection. - - The frozen copy is an immutable collection which contains the same data as - this collection currently contains, but will not update when writes are made - to the containing Realm. Unlike live collections, frozen collections can be - accessed from any thread. - - @warning This method cannot be called during a write transaction, or when the containing Realm is read-only. - @warning Holding onto a frozen collection for an extended period while - performing write transaction on the Realm may result in the Realm - file growing to large sizes. See - `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -@end - -/** - An `RLMSortDescriptor` stores a property name and a sort order for use with - `sortedResultsUsingDescriptors:`. It is similar to `NSSortDescriptor`, but supports - only the subset of functionality which can be efficiently run by Realm's query - engine. - - `RLMSortDescriptor` instances are immutable. - */ -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMSortDescriptor : NSObject - -#pragma mark - Properties - -/** - The key path which the sort descriptor orders results by. - */ -@property (nonatomic, readonly) NSString *keyPath; - -/** - Whether the descriptor sorts in ascending or descending order. - */ -@property (nonatomic, readonly) BOOL ascending; - -#pragma mark - Methods - -/** - Returns a new sort descriptor for the given key path and sort direction. - */ -+ (instancetype)sortDescriptorWithKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a copy of the receiver with the sort direction reversed. - */ -- (instancetype)reversedSortDescriptor; - -@end - -/** - A `RLMCollectionChange` object encapsulates information about changes to collections - that are reported by Realm notifications. - - `RLMCollectionChange` is passed to the notification blocks registered with - `-addNotificationBlock` on `RLMArray` and `RLMResults`, and reports what rows in the - collection changed since the last time the notification block was called. - - The change information is available in two formats: a simple array of row - indices in the collection for each type of change, and an array of index paths - in a requested section suitable for passing directly to `UITableView`'s batch - update methods. A complete example of updating a `UITableView` named `tv`: - - [tv beginUpdates]; - [tv deleteRowsAtIndexPaths:[changes deletionsInSection:0] withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv insertRowsAtIndexPaths:[changes insertionsInSection:0] withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv reloadRowsAtIndexPaths:[changes modificationsInSection:0] withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv endUpdates]; - - All of the arrays in an `RLMCollectionChange` are always sorted in ascending order. - */ -@interface RLMCollectionChange : NSObject -/// The indices of objects in the previous version of the collection which have -/// been removed from this one. -@property (nonatomic, readonly) NSArray *deletions; - -/// The indices in the new version of the collection which were newly inserted. -@property (nonatomic, readonly) NSArray *insertions; - -/** - The indices in the new version of the collection which were modified. - - For `RLMResults`, this means that one or more of the properties of the object at - that index were modified (or an object linked to by that object was - modified). - - For `RLMArray`, the array itself being modified to contain a - different object at that index will also be reported as a modification. - */ -@property (nonatomic, readonly) NSArray *modifications; - -/// Returns the index paths of the deletion indices in the given section. -- (NSArray *)deletionsInSection:(NSUInteger)section; - -/// Returns the index paths of the insertion indices in the given section. -- (NSArray *)insertionsInSection:(NSUInteger)section; - -/// Returns the index paths of the modification indices in the given section. -- (NSArray *)modificationsInSection:(NSUInteger)section; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMConstants.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMConstants.h deleted file mode 100644 index 0bc8db972..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMConstants.h +++ /dev/null @@ -1,156 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#define RLM_HEADER_AUDIT_BEGIN NS_HEADER_AUDIT_BEGIN -#define RLM_HEADER_AUDIT_END NS_HEADER_AUDIT_END - -#define RLM_SWIFT_SENDABLE NS_SWIFT_SENDABLE - -#define RLM_FINAL __attribute__((objc_subclassing_restricted)) - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -// Swift 5 considers NS_ENUM to be "open", meaning there could be values present -// other than the defined cases (which allows adding more cases later without -// it being a breaking change), while older versions consider it "closed". -#ifdef NS_CLOSED_ENUM -#define RLM_CLOSED_ENUM NS_CLOSED_ENUM -#else -#define RLM_CLOSED_ENUM NS_ENUM -#endif - -#if __has_attribute(ns_error_domain) && (!defined(__cplusplus) || !__cplusplus || __cplusplus >= 201103L) -#define RLM_ERROR_ENUM(type, name, domain) \ - _Pragma("clang diagnostic push") \ - _Pragma("clang diagnostic ignored \"-Wignored-attributes\"") \ - NS_ENUM(type, __attribute__((ns_error_domain(domain))) name) \ - _Pragma("clang diagnostic pop") -#else -#define RLM_ERROR_ENUM(type, name, domain) NS_ENUM(type, name) -#endif - -#define RLM_HIDDEN __attribute__((visibility("hidden"))) -#define RLM_VISIBLE __attribute__((visibility("default"))) -#define RLM_HIDDEN_BEGIN _Pragma("GCC visibility push(hidden)") -#define RLM_HIDDEN_END _Pragma("GCC visibility pop") -#define RLM_DIRECT __attribute__((objc_direct)) -#define RLM_DIRECT_MEMBERS __attribute__((objc_direct_members)) - -#pragma mark - Enums - -/** - `RLMPropertyType` is an enumeration describing all property types supported in Realm models. - - For more information, see [Realm Models](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/object-models-and-schemas/). - */ -typedef RLM_CLOSED_ENUM(int32_t, RLMPropertyType) { - -#pragma mark - Primitive types - /** Integers: `NSInteger`, `int`, `long`, `Int` (Swift) */ - RLMPropertyTypeInt = 0, - /** Booleans: `BOOL`, `bool`, `Bool` (Swift) */ - RLMPropertyTypeBool = 1, - /** Floating-point numbers: `float`, `Float` (Swift) */ - RLMPropertyTypeFloat = 5, - /** Double-precision floating-point numbers: `double`, `Double` (Swift) */ - RLMPropertyTypeDouble = 6, - /** NSUUID, UUID */ - RLMPropertyTypeUUID = 12, - -#pragma mark - Object types - - /** Strings: `NSString`, `String` (Swift) */ - RLMPropertyTypeString = 2, - /** Binary data: `NSData` */ - RLMPropertyTypeData = 3, - /** Any type: `id`, `AnyRealmValue` (Swift) */ - RLMPropertyTypeAny = 9, - /** Dates: `NSDate` */ - RLMPropertyTypeDate = 4, - -#pragma mark - Linked object types - - /** Realm model objects. See [Realm Models](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/object-models-and-schemas/) for more information. */ - RLMPropertyTypeObject = 7, - /** Realm linking objects. See [Realm Models](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/relationships/#inverse-relationship) for more information. */ - RLMPropertyTypeLinkingObjects = 8, - - RLMPropertyTypeObjectId = 10, - RLMPropertyTypeDecimal128 = 11 -}; - -#pragma mark - Notification Constants - -/** - A notification indicating that changes were made to a Realm. -*/ -typedef NSString * RLMNotification NS_EXTENSIBLE_STRING_ENUM; - -/** - This notification is posted when a write transaction has been committed to a Realm on a different thread for - the same file. - - It is not posted if `autorefresh` is enabled, or if the Realm is refreshed before the notification has a chance - to run. - - Realms with autorefresh disabled should normally install a handler for this notification which calls - `-[RLMRealm refresh]` after doing some work. Refreshing the Realm is optional, but not refreshing the Realm may lead to - large Realm files. This is because an extra copy of the data must be kept for the stale Realm. - */ -extern RLMNotification const RLMRealmRefreshRequiredNotification NS_SWIFT_NAME(RefreshRequired); - -/** - This notification is posted by a Realm when a write transaction has been - committed to a Realm on a different thread for the same file. - - It is not posted if `-[RLMRealm autorefresh]` is enabled, or if the Realm is - refreshed before the notification has a chance to run. - - Realms with autorefresh disabled should normally install a handler for this - notification which calls `-[RLMRealm refresh]` after doing some work. Refreshing - the Realm is optional, but not refreshing the Realm may lead to large Realm - files. This is because Realm must keep an extra copy of the data for the stale - Realm. - */ -extern RLMNotification const RLMRealmDidChangeNotification NS_SWIFT_NAME(DidChange); - -#pragma mark - Error keys - -/** Key to identify the associated backup Realm configuration in an error's `userInfo` dictionary */ -extern NSString * const RLMBackupRealmConfigurationErrorKey; - -#pragma mark - Other Constants - -/** The schema version used for uninitialized Realms */ -extern const uint64_t RLMNotVersioned; - -/** The corresponding value is the name of an exception thrown by Realm. */ -extern NSString * const RLMExceptionName; - -/** The corresponding value is a Realm file version. */ -extern NSString * const RLMRealmVersionKey; - -/** The corresponding key is the version of the underlying database engine. */ -extern NSString * const RLMRealmCoreVersionKey; - -/** The corresponding key is the Realm invalidated property name. */ -extern NSString * const RLMInvalidatedKey; - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMCredentials.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMCredentials.h deleted file mode 100644 index adff4e7e9..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMCredentials.h +++ /dev/null @@ -1,126 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) -@protocol RLMBSON; - -/// A token representing an identity provider's credentials. -typedef NSString *RLMCredentialsToken; - -/// A type representing the unique identifier of an Atlas App Services identity provider. -typedef NSString *RLMIdentityProvider NS_EXTENSIBLE_STRING_ENUM; - -/// The username/password identity provider. User accounts are handled by Atlas App Services directly without the -/// involvement of a third-party identity provider. -extern RLMIdentityProvider const RLMIdentityProviderUsernamePassword; - -/// A Facebook account as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderFacebook; - -/// A Google account as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderGoogle; - -/// An Apple account as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderApple; - -/// A JSON Web Token as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderJWT; - -/// An Anonymous account as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderAnonymous; - -/// An Realm Cloud function as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderFunction; - -/// A user api key as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderUserAPIKey; - -/// A server api key as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderServerAPIKey; - -/** - Opaque credentials representing a specific Realm App user. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMCredentials : NSObject - -/// The name of the identity provider which generated the credentials token. -@property (nonatomic, readonly) RLMIdentityProvider provider; - -/** - Construct and return credentials from a Facebook account token. - */ -+ (instancetype)credentialsWithFacebookToken:(RLMCredentialsToken)token; - -/** - Construct and return credentials from a Google account token. - */ -+ (instancetype)credentialsWithGoogleAuthCode:(RLMCredentialsToken)token; - -/** - Construct and return credentials from a Google id token. - */ -+ (instancetype)credentialsWithGoogleIdToken:(RLMCredentialsToken)token; - -/** - Construct and return credentials from an Apple account token. - */ -+ (instancetype)credentialsWithAppleToken:(RLMCredentialsToken)token; - -/** - Construct and return credentials for an Atlas App Services function using a mongodb document as a json payload. -*/ -+ (instancetype)credentialsWithFunctionPayload:(NSDictionary> *)payload; - -/** - Construct and return credentials from a user api key. -*/ -+ (instancetype)credentialsWithUserAPIKey:(NSString *)apiKey; - -/** - Construct and return credentials from a server api key. -*/ -+ (instancetype)credentialsWithServerAPIKey:(NSString *)apiKey; - -/** - Construct and return Atlas App Services credentials from an email and password. - */ -+ (instancetype)credentialsWithEmail:(NSString *)email - password:(NSString *)password; - -/** - Construct and return credentials from a JSON Web Token. - */ -+ (instancetype)credentialsWithJWT:(NSString *)token; - -/** - Construct and return anonymous credentials - */ -+ (instancetype)anonymousCredentials; - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("RLMAppCredentials cannot be created directly"))); - -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("RLMAppCredentials cannot be created directly"))); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMDecimal128.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMDecimal128.h deleted file mode 100644 index f6224bbf2..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMDecimal128.h +++ /dev/null @@ -1,110 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A 128-bit IEEE 754-2008 decimal floating point number. - - This type is similar to Swift's built-in Decimal type, but allocates bits - differently, resulting in a different representable range. (NS)Decimal stores a - significand of up to 38 digits long and an exponent from -128 to 127, while - this type stores up to 34 digits of significand and an exponent from -6143 to - 6144. - */ -RLM_SWIFT_SENDABLE // immutable -@interface RLMDecimal128 : NSObject -/// Creates a new zero-initialized decimal128. -- (instancetype)init; - -/// Converts the given value to a RLMDecimal128. -/// -/// The following types can be converted to RLMDecimal128: -/// - NSNumber -/// - NSString -/// - NSDecimalNumber -/// -/// Passing a value with a type not in this list is a fatal error. Passing a -/// string which cannot be parsed as a valid Decimal128 is a fatal error. -- (instancetype)initWithValue:(id)value; - -/// Converts the given number to a RLMDecimal128. -- (instancetype)initWithNumber:(NSNumber *)number; - -/// Parses the given string to a RLMDecimal128. -/// -/// Returns a decimal where `isNaN` is `YES` if the string cannot be parsed as a decimal. `error` is never set -/// and this will never actually return `nil`. -- (nullable instancetype)initWithString:(NSString *)string error:(NSError **)error; - -/// Converts the given number to a RLMDecimal128. -+ (instancetype)decimalWithNumber:(NSNumber *)number; - -/// The minimum value for RLMDecimal128. -@property (class, readonly, copy) RLMDecimal128 *minimumDecimalNumber NS_REFINED_FOR_SWIFT; - -/// The maximum value for RLMDecimal128. -@property (class, readonly, copy) RLMDecimal128 *maximumDecimalNumber NS_REFINED_FOR_SWIFT; - -/// Convert this value to a double. This is a lossy conversion. -@property (nonatomic, readonly) double doubleValue; - -/// Convert this value to a NSDecimal. This may be a lossy conversion. -@property (nonatomic, readonly) NSDecimal decimalValue; - -/// Convert this value to a string. -@property (nonatomic, readonly) NSString *stringValue; - -/// Gets if this Decimal128 represents a NaN value. -@property (nonatomic, readonly) BOOL isNaN; - -/// The magnitude of this RLMDecimal128. -@property (nonatomic, readonly) RLMDecimal128 *magnitude NS_REFINED_FOR_SWIFT; - -/// Replaces this RLMDecimal128 value with its additive inverse. -- (void)negate; - -/// Adds the right hand side to the current value and returns the result. -- (RLMDecimal128 *)decimalNumberByAdding:(RLMDecimal128 *)decimalNumber; - -/// Divides the right hand side to the current value and returns the result. -- (RLMDecimal128 *)decimalNumberByDividingBy:(RLMDecimal128 *)decimalNumber; - -/// Subtracts the right hand side to the current value and returns the result. -- (RLMDecimal128 *)decimalNumberBySubtracting:(RLMDecimal128 *)decimalNumber; - -/// Multiply the right hand side to the current value and returns the result. -- (RLMDecimal128 *)decimalNumberByMultiplyingBy:(RLMDecimal128 *)decimalNumber; - -/// Comparision operator to check if the right hand side is greater than the current value. -- (BOOL)isGreaterThan:(nullable RLMDecimal128 *)decimalNumber; - -/// Comparision operator to check if the right hand side is greater than or equal to the current value. -- (BOOL)isGreaterThanOrEqualTo:(nullable RLMDecimal128 *)decimalNumber; - -/// Comparision operator to check if the right hand side is less than the current value. -- (BOOL)isLessThan:(nullable RLMDecimal128 *)decimalNumber; - -/// Comparision operator to check if the right hand side is less than or equal to the current value. -- (BOOL)isLessThanOrEqualTo:(nullable RLMDecimal128 *)decimalNumber; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMDictionary.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMDictionary.h deleted file mode 100644 index 9c8cac538..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMDictionary.h +++ /dev/null @@ -1,559 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObject, RLMResults, RLMDictionaryChange; - -/** - `RLMDictionary` is a container type in Realm representing a dynamic collection of key-value pairs. - - Unlike `NSDictionary`, `RLMDictionary`s hold a single key and value type. - This is referred to in these docs as the “type” and “keyType” of the dictionary. - - When declaring an `RLMDictionary` property, the object type and keyType must be marked as conforming to a - protocol by the same name as the objects it should contain. - - RLM_COLLECTION_TYPE(ObjectType) - ... - @property RLMDictionary *objectTypeDictionary; - - `RLMDictionary`s can be queried with the same predicates as `RLMObject` and `RLMResult`s. - - `RLMDictionary`s cannot be created directly. `RLMDictionary` properties on `RLMObject`s are - lazily created when accessed, or can be obtained by querying a Realm. - - `RLMDictionary` only supports `NSString` as a key. Realm disallows the use of `.` or `$` characters within a dictionary key. - - ### Key-Value Observing - - `RLMDictionary` supports dictionary key-value observing on `RLMDictionary` properties on `RLMObject` - subclasses, and the `invalidated` property on `RLMDictionary` instances themselves is - key-value observing compliant when the `RLMDictionary` is attached to a managed - `RLMObject` (`RLMDictionary`s on unmanaged `RLMObject`s will never become invalidated). - */ -@interface RLMDictionary: NSObject - -#pragma mark - Properties - -/** - The number of entries in the dictionary. - */ -@property (nonatomic, readonly, assign) NSUInteger count; - -/** - The type of the objects in the dictionary. - */ -@property (nonatomic, readonly, assign) RLMPropertyType type; - -/** - The type of the key used in this dictionary. - */ -@property (nonatomic, readonly, assign) RLMPropertyType keyType; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readonly, getter = isOptional) BOOL optional; - -/** - The class name of the objects contained in the dictionary. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages the dictionary. Returns `nil` for unmanaged dictionary. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - Indicates if the dictionary can no longer be accessed. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if the dictionary is frozen. - - Frozen dictionaries are immutable and can be accessed from any thread. Frozen dictionaries - are created by calling `-freeze` on a managed live dictionary. Unmanaged dictionaries are - never frozen. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Accessing Objects from a Dictionary - -/** - Returns the value associated with a given key. - - @param key The name of the property. - - @discussion If key does not start with “@”, invokes object(forKey:). If key does start - with “@”, strips the “@” and invokes [super valueForKey:] with the rest of the key. - - @return A value associated with a given key or `nil`. - */ -- (nullable id)valueForKey:(nonnull RLMKeyType)key; - -/** - Returns an array containing the dictionary’s keys. - - @note The order of the elements in the array is not defined. - */ -@property(readonly, copy) NSArray *allKeys; - -/** - Returns an array containing the dictionary’s values. - - @note The order of the elements in the array is not defined. - */ -@property(readonly, copy) NSArray *allValues; - -/** - Returns the value associated with a given key. - - @note `nil` will be returned if no value is associated with a given key. NSNull will be returned - where null is associated with the key. - - @param key The key for which to return the corresponding value. - - @return The value associated with key. - */ -- (nullable RLMObjectType)objectForKey:(nonnull RLMKeyType)key; - -/** - Returns the value associated with a given key. - - @note `nil` will be returned if no value is associated with a given key. NSNull will be returned - where null is associated with the key. - - @param key The key for which to return the corresponding value. - - @return The value associated with key. - */ -- (nullable RLMObjectType)objectForKeyedSubscript:(RLMKeyType)key; - -/** - Applies a given block object to the each key-value pair of the dictionary. - - @param block A block object to operate on entries in the dictionary. - - @note If the block sets *stop to YES, the enumeration stops. - */ -- (void)enumerateKeysAndObjectsUsingBlock:(void (^)(RLMKeyType key, RLMObjectType obj, BOOL *stop))block; - -#pragma mark - Adding, Removing, and Replacing Objects in a Dictionary - -/** - Replace the contents of a dictionary with the contents of another dictionary - NSDictionary or RLMDictionary. - - This will remove all elements in this dictionary and then apply each element from the given dictionary. - - @warning This method may only be called during a write transaction. - @warning If otherDictionary is self this will result in an empty dictionary. - */ -- (void)setDictionary:(id)otherDictionary; - -/** - Removes all contents in the dictionary. - - @warning This method may only be called during a write transaction. - */ -- (void)removeAllObjects; - -/** - Removes from the dictionary entries specified by elements in a given array. If a given key does not - exist, no mutation will happen for that key. - - @warning This method may only be called during a write transaction. - */ -- (void)removeObjectsForKeys:(NSArray *)keyArray; - -/** - Removes a given key and its associated value from the dictionary. If the key does not exist the dictionary - will not be modified. - - @warning This method may only be called during a write transaction. - */ -- (void)removeObjectForKey:(RLMKeyType)key; - -/** - Adds a given key-value pair to the dictionary if the key is not present, or updates the value for the given key - if the key already present. - - @warning This method may only be called during a write transaction. - */ -- (void)setObject:(nullable RLMObjectType)obj forKeyedSubscript:(RLMKeyType)key; - -/** - Adds a given key-value pair to the dictionary if the key is not present, or updates the value for the given key - if the key already present. - - @warning This method may only be called during a write transaction. - */ -- (void)setObject:(nullable RLMObjectType)anObject forKey:(RLMKeyType)aKey; - -/** - Adds to the receiving dictionary the entries from another dictionary. - - @note If the receiving dictionary contains the same key(s) as the otherDictionary, then - the receiving dictionary will update each key-value pair for the matching key. - - @warning This method may only be called during a write transaction. - - @param otherDictionary An enumerable object such as `NSDictionary` or `RLMDictionary` which contains objects of the - same type as the receiving dictionary. - */ -- (void)addEntriesFromDictionary:(id )otherDictionary; - -#pragma mark - Querying a Dictionary - -/** - Returns all the values matching the given predicate in the dictionary. - - @note The keys in the dictionary are ignored when quering values, and they will not be returned in the `RLMResults`. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` of objects that match the given predicate. - */ -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all the values matching the given predicate in the dictionary. - - @note The keys in the dictionary are ignored when quering values, and they will not be returned in the `RLMResults`. - - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` of objects that match the given predicate - */ -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/** - Returns a sorted RLMResults of all values in the dictionary. - - @note The keys in the dictionary are ignored when sorting values, and they will not be returned in the `RLMResults`. - - @param keyPath The key path to sort by. - @param ascending The direction to sort in. - - @return An `RLMResults` sorted by the specified key path. - */- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a sorted RLMResults of all values in the dictionary. - - @note The keys in the dictionary are ignored when sorting values, and they will not be returned in the `RLMResults`. - - @param properties An array of `RLMSortDescriptor`s to sort by. - - @return An `RLMResults` sorted by the specified properties. - */ -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/** - Returns a distinct `RLMResults` from all values in the dictionary. - - @note The keys in the dictionary are ignored, and they will not be returned in the `RLMResults`. - - @param keyPaths The key paths to distinct on. - - @return An `RLMResults` with the distinct values of the keypath(s). - */ -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the values in the dictionary. - - NSNumber *min = [object.dictionaryProperty minOfProperty:@"age"]; - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, `NSDate`, `RLMValue` and `RLMDecimal128` are supported. - - @return The minimum value of the property, or `nil` if the dictionary is empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects in the dictionary. - - NSNumber *max = [object.dictionaryProperty maxOfProperty:@"age"]; - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, `NSDate`, `RLMValue` and `RLMDecimal128` are supported. - - @return The maximum value of the property, or `nil` if the dictionary is empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of distinct values of a given property over all the objects in the dictionary. - - NSNumber *sum = [object.dictionaryProperty sumOfProperty:@"age"]; - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, `RLMValue` and `RLMDecimal128` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects in the dictionary. - - NSNumber *average = [object.dictionaryProperty averageOfProperty:@"age"]; - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, `NSDate`, `RLMValue` and `RLMDecimal128` are supported. - - @return The average value of the given property, or `nil` if the dictionary is empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -#pragma mark - Notifications - -/** - Registers a block to be called each time the dictionary changes. - - The block will be asynchronously called with the initial dictionary, and then - called again after each write transaction which changes any of the keys or values - within the dictionary. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which keys in the dictionary were added, modified or deleted. If a write transaction - did not modify any keys or values in the dictionary, the block is not called at all. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - Person *person = [[Person allObjectsInRealm:realm] firstObject]; - NSLog(@"person.dogs.count: %zu", person.dogs.count); // => 0 - self.token = [person.dogs addNotificationBlock(RLMDictionary *dogs, - RLMDictionaryChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - person.dogs[@"frenchBulldog"] = dog; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a non-frozen managed dictionary. - - @param block The block to be called each time the dictionary changes. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMDictionary *_Nullable dictionary, - RLMDictionaryChange *_Nullable changes, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the dictionary changes. - - The block will be asynchronously called with the initial dictionary, and then - called again after each write transaction which changes any of the key-value in - the dictionary or which objects are in the results. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which keys in the dictionary were added or modified. If a write transaction - did not modify any objects in the dictionary, the block is not called at all. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMDictionary *_Nullable dictionary, - RLMDictionaryChange *_Nullable changes, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the dictionary changes. - - The block will be asynchronously called with the initial dictionary, and then - called again after each write transaction which changes any of the key-value in - the dictionary or which objects are in the results. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which keys in the dictionary were added or modified. If a write transaction - did not modify any objects in the dictionary, the block is not called at all. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMDictionary *_Nullable dictionary, - RLMDictionaryChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the dictionary changes. - - The block will be asynchronously called with the initial dictionary, and then - called again after each write transaction which changes any of the key-value in - the dictionary or which objects are in the results. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which keys in the dictionary were added or modified. If a write transaction - did not modify any objects in the dictionary, the block is not called at all. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMDictionary *_Nullable dictionary, - RLMDictionaryChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths -__attribute__((warn_unused_result)); - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of a dictionary. - - The frozen copy is an immutable dictionary which contains the same data as this - dictionary currently contains, but will not update when writes are made to the - containing Realm. Unlike live dictionaries, frozen dictionaries can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a managed dictionary. - @warning Holding onto a frozen dictionary for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -#pragma mark - Unavailable Methods -/** - `-[RLMDictionary init]` is not available because `RLMDictionary`s cannot be created directly. - `RLMDictionary` properties on `RLMObject`s are lazily created when accessed. - */ -- (instancetype)init __attribute__((unavailable("RLMDictionary cannot be created directly"))); -/** - `+[RLMDictionary new]` is not available because `RLMDictionary`s cannot be created directly. - `RLMDictionary` properties on `RLMObject`s are lazily created when accessed. - */ -+ (instancetype)new __attribute__((unavailable("RLMDictionary cannot be created directly"))); - -@end - -/** - A `RLMDictionaryChange` object encapsulates information about changes to dictionaries - that are reported by Realm notifications. - - `RLMDictionaryChange` is passed to the notification blocks registered with - `-addNotificationBlock` on `RLMDictionary`, and reports what keys in the - dictionary changed since the last time the notification block was called. - */ -@interface RLMDictionaryChange : NSObject -/// The keys in the new version of the dictionary which were newly inserted. -@property (nonatomic, readonly) NSArray *insertions; - -/// The keys in the new version of the dictionary which were modified. -@property (nonatomic, readonly) NSArray *modifications; - -/// The keys which were deleted from the old version. -@property (nonatomic, readonly) NSArray *deletions; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMEmailPasswordAuth.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMEmailPasswordAuth.h deleted file mode 100644 index 748eb26af..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMEmailPasswordAuth.h +++ /dev/null @@ -1,120 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@protocol RLMBSON; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// A block type used to report an error -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMEmailPasswordAuthOptionalErrorBlock)(NSError * _Nullable); - -/** - A client for the email/password authentication provider which - can be used to obtain a credential for logging in, - and to perform requests specifically related to the email/password provider. -*/ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMEmailPasswordAuth : RLMProviderClient - -/** - Registers a new email identity with the email/password provider, - and sends a confirmation email to the provided address. - - @param email The email address of the user to register. - @param password The password that the user created for the new email/password identity. - @param completionHandler A callback to be invoked once the call is complete. -*/ - -- (void)registerUserWithEmail:(NSString *)email - password:(NSString *)password - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler NS_SWIFT_NAME(registerUser(email:password:completion:)); - -/** - Confirms an email identity with the email/password provider. - - @param token The confirmation token that was emailed to the user. - @param tokenId The confirmation token id that was emailed to the user. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)confirmUser:(NSString *)token - tokenId:(NSString *)tokenId - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Re-sends a confirmation email to a user that has registered but - not yet confirmed their email address. - - @param email The email address of the user to re-send a confirmation for. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)resendConfirmationEmail:(NSString *)email - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Retries custom confirmation function for a given email address. - - @param email The email address of the user to retry custom confirmation logic. - @param completionHandler A callback to be invoked once the call is complete. - */ -- (void)retryCustomConfirmation:(NSString *)email - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Sends a password reset email to the given email address. - - @param email The email address of the user to send a password reset email for. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)sendResetPasswordEmail:(NSString *)email - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Resets the password of an email identity using the - password reset token emailed to a user. - - @param password The new password. - @param token The password reset token that was emailed to the user. - @param tokenId The password reset token id that was emailed to the user. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)resetPasswordTo:(NSString *)password - token:(NSString *)token - tokenId:(NSString *)tokenId - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Resets the password of an email identity using the - password reset function set up in the application. - - @param email The email address of the user. - @param password The desired new password. - @param args A list of arguments passed in as a BSON array. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)callResetPasswordFunction:(NSString *)email - password:(NSString *)password - args:(NSArray> *)args - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMEmbeddedObject.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMEmbeddedObject.h deleted file mode 100644 index 4db6248ca..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMEmbeddedObject.h +++ /dev/null @@ -1,367 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectSchema, RLMPropertyDescriptor, RLMRealm, RLMNotificationToken, RLMPropertyChange; -typedef void (^RLMObjectChangeBlock)(BOOL deleted, - NSArray *_Nullable changes, - NSError *_Nullable error); -/** - `RLMEmbeddedObject` is a base class used to define Realm model objects. - - Embedded objects work similarly to normal objects, but are owned by a single - parent Object (which itself may be embedded). Unlike normal top-level objects, - embedded objects cannot be directly created in or added to a Realm. Instead, - they can only be created as part of a parent object, or by assigning an - unmanaged object to a parent object's property. Embedded objects are - automatically deleted when the parent object is deleted or when the parent is - modified to no longer point at the embedded object, either by reassigning an - RLMObject property or by removing the embedded object from the array containing - it. - - Embedded objects can only ever have a single parent object which links to them, - and attempting to link to an existing managed embedded object will throw an - exception. - - The property types supported on `RLMEmbeddedObject` are the same as for - `RLMObject`, except for that embedded objects cannot link to top-level objects, - so `RLMObject` and `RLMArray` properties are not supported - (`RLMEmbeddedObject` and `RLMArray` *are*). - - Embedded objects cannot have primary keys or indexed properties. - */ - -@interface RLMEmbeddedObject : RLMObjectBase - -#pragma mark - Creating & Initializing Objects - -/** - Creates an unmanaged instance of a Realm object. - - Unmanaged embedded objects can be added to a Realm by assigning them to an - object property of a managed Realm object or by adding them to a managed - RLMArray. - */ -- (instancetype)init NS_DESIGNATED_INITIALIZER; - -/** - Creates an unmanaged instance of a Realm object. - - Pass in an `NSArray` or `NSDictionary` instance to set the values of the object's properties. - - Unmanaged embedded objects can be added to a Realm by assigning them to an - object property of a managed Realm object or by adding them to a managed - RLMArray. - */ -- (instancetype)initWithValue:(id)value; - -/** - Returns the class name for a Realm object subclass. - - @warning Do not override. Realm relies on this method returning the exact class - name. - - @return The class name for the model class. - */ -+ (NSString *)className; - -#pragma mark - Properties - -/** - The Realm which manages the object, or `nil` if the object is unmanaged. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - The object schema which lists the managed properties for the object. - */ -@property (nonatomic, readonly) RLMObjectSchema *objectSchema; - -/** - Indicates if the object can no longer be accessed because it is now invalid. - - An object can no longer be accessed if the object has been deleted from the Realm that manages it, or - if `invalidate` is called on that Realm. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if this object is frozen. - - @see `-[RLMEmbeddedObject freeze]` - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Customizing your Objects - -/** - Override this method to specify the default values to be used for each property. - - @return A dictionary mapping property names to their default values. - */ -+ (nullable NSDictionary *)defaultPropertyValues; - -/** - Override this method to specify the names of properties to ignore. These properties will not be managed by the Realm - that manages the object. - - @return An array of property names to ignore. - */ -+ (nullable NSArray *)ignoredProperties; - -/** - Override this method to specify the names of properties that are non-optional (i.e. cannot be assigned a `nil` value). - - By default, all properties of a type whose values can be set to `nil` are - considered optional properties. To require that an object in a Realm always - store a non-`nil` value for a property, add the name of the property to the - array returned from this method. - - Properties of `RLMEmbeddedObject` type cannot be non-optional. Array and - `NSNumber` properties can be non-optional, but there is no reason to do so: - arrays do not support storing nil, and if you want a non-optional number you - should instead use the primitive type. - - @return An array of property names that are required. - */ -+ (NSArray *)requiredProperties; - -/** - Override this method to provide information related to properties containing linking objects. - - Each property of type `RLMLinkingObjects` must have a key in the dictionary returned by this method consisting - of the property name. The corresponding value must be an instance of `RLMPropertyDescriptor` that describes the class - and property that the property is linked to. - - return @{ @"owners": [RLMPropertyDescriptor descriptorWithClass:Owner.class propertyName:@"dogs"] }; - - @return A dictionary mapping property names to `RLMPropertyDescriptor` instances. - */ -+ (NSDictionary *)linkingObjectsProperties; - -#pragma mark - Notifications - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in differen - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When notifications - can't be delivered instantly, multiple notifications may be coalesced into a - single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - - @param block The block to be called whenever a change occurs. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block queue:(dispatch_queue_t)queue; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block keyPaths:(NSArray *)keyPaths queue:(dispatch_queue_t)queue; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block keyPaths:(NSArray *)keyPaths; - -#pragma mark - Other Instance Methods - -/** - Returns YES if another Realm object instance points to the same object as the - receiver in the Realm managing the receiver. - - For frozen objects and object types with a primary key, `isEqual:` is - overridden to use the same logic as this method (along with a corresponding - implementation for `hash`). Non-frozen objects without primary keys use - pointer identity for `isEqual:` and `hash`. - - @param object The object to compare the receiver to. - - @return Whether the object represents the same object as the receiver. - */ -- (BOOL)isEqualToObject:(RLMEmbeddedObject *)object; - -/** - Returns a frozen (immutable) snapshot of this object. - - The frozen copy is an immutable object which contains the same data as this - object currently contains, but will not update when writes are made to the - containing Realm. Unlike live objects, frozen objects can be accessed from any - thread. - - - warning: Holding onto a frozen object for an extended period while performing write - transaction on the Realm may result in the Realm file growing to large sizes. See - `Realm.Configuration.maximumNumberOfActiveVersions` for more information. - - warning: This method can only be called on a managed object. - */ -- (instancetype)freeze NS_RETURNS_RETAINED; - -/** - Returns a live (mutable) reference of this object. - - This method creates a managed accessor to a live copy of the same frozen object. - Will return self if called on an already live object. - */ -- (instancetype)thaw; - -#pragma mark - Dynamic Accessors - -/// :nodoc: -- (nullable id)objectForKeyedSubscript:(NSString *)key; - -/// :nodoc: -- (void)setObject:(nullable id)obj forKeyedSubscript:(NSString *)key; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMError.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMError.h deleted file mode 100644 index 514ceee3f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMError.h +++ /dev/null @@ -1,442 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2022 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@protocol RLMValue; - -#pragma mark - Error Domains - -/** Error code is a value from the RLMError enum. */ -extern NSString *const RLMErrorDomain; - -/** An error domain identifying non-specific system errors. */ -extern NSString *const RLMUnknownSystemErrorDomain; - -/** - The error domain string for all SDK errors related to errors reported - by the synchronization manager error handler, as well as general sync - errors that don't fall into any of the other categories. - */ -extern NSString *const RLMSyncErrorDomain; - -/** - The error domain string for all SDK errors related to the authentication - endpoint. - */ -extern NSString *const RLMSyncAuthErrorDomain; - -/** -The error domain string for all SDK errors related to the Atlas App Services -endpoint. -*/ -extern NSString *const RLMAppErrorDomain; - -#pragma mark - RLMError - -/// A user info key containing the error code. This is provided for backwards -/// compatibility only and should not be used. -extern NSString *const RLMErrorCodeKey __attribute((deprecated("use -[NSError code]"))); - -/// A user info key containing the name of the error code. This is for -/// debugging purposes only and should not be relied on. -extern NSString *const RLMErrorCodeNameKey; - -/// A user info key present in sync errors which originate from the server, -/// containing the URL of the server-side logs associated with the error. -extern NSString * const RLMServerLogURLKey; - -/// A user info key containing a HTTP status code. Some ``RLMAppError`` codes -/// include this, most notably ``RLMAppErrorHttpRequestFailed``. -extern NSString * const RLMHTTPStatusCodeKey; - -/// A user info key containing a `RLMCompensatingWriteInfo` which includes -/// further details about what was reverted by the server. -extern NSString *const RLMCompensatingWriteInfoKey; - -/** - `RLMError` is an enumeration representing all recoverable errors. It is - associated with the Realm error domain specified in `RLMErrorDomain`. - */ -typedef RLM_ERROR_ENUM(NSInteger, RLMError, RLMErrorDomain) { - /** Denotes a general error that occurred when trying to open a Realm. */ - RLMErrorFail = 1, - - /** Denotes a file I/O error that occurred when trying to open a Realm. */ - RLMErrorFileAccess = 2, - - /** - Denotes a file permission error that occurred when trying to open a Realm. - - This error can occur if the user does not have permission to open or create - the specified file in the specified access mode when opening a Realm. - */ - RLMErrorFilePermissionDenied = 3, - - /** - Denotes an error where a file was to be written to disk, but another - file with the same name already exists. - */ - RLMErrorFileExists = 4, - - /** - Denotes an error that occurs if a file could not be found. - - This error may occur if a Realm file could not be found on disk when - trying to open a Realm as read-only, or if the directory part of the - specified path was not found when trying to write a copy. - */ - RLMErrorFileNotFound = 5, - - /** - Denotes an error that occurs if a file format upgrade is required to open - the file, but upgrades were explicitly disabled or the file is being open - in read-only mode. - */ - RLMErrorFileFormatUpgradeRequired = 6, - - /** - Denotes an error that occurs if the database file is currently open in - another process which cannot share with the current process due to an - architecture mismatch. - - This error may occur if trying to share a Realm file between an i386 - (32-bit) iOS Simulator and the Realm Studio application. In this case, - please use the 64-bit version of the iOS Simulator. - */ - RLMErrorIncompatibleLockFile = 8, - - /** - Denotes an error that occurs when there is insufficient available address - space to mmap the Realm file. - */ - RLMErrorAddressSpaceExhausted = 9, - - /** - Denotes an error that occurs if there is a schema version mismatch and a - migration is required. - */ - RLMErrorSchemaMismatch = 10, - - /** - Denotes an error where an operation was requested which cannot be - performed on an open file. - */ - RLMErrorAlreadyOpen = 12, - - /// Denotes an error where an input value was invalid. - RLMErrorInvalidInput = 13, - - /// Denotes an error where a write failed due to insufficient disk space. - RLMErrorOutOfDiskSpace = 14, - - /** - Denotes an error where a Realm file could not be opened because another - process has opened the same file in a way incompatible with inter-process - sharing. For example, this can result from opening the backing file for an - in-memory Realm in non-in-memory mode. - */ - RLMErrorIncompatibleSession = 15, - - /** - Denotes an error that occurs if the file is a valid Realm file, but has a - file format version which is not supported by this version of Realm. This - typically means that the file was written by a newer version of Realm, but - may also mean that it is from a pre-1.0 version of Realm (or for - synchronized files, pre-10.0). - */ - RLMErrorUnsupportedFileFormatVersion = 16, - - /** - Denotes an error that occurs if a synchronized Realm is opened in more - than one process at once. - */ - RLMErrorMultipleSyncAgents = 17, - - /// A subscription was rejected by the server. - RLMErrorSubscriptionFailed = 18, - - /// A file operation failed in a way which does not have a more specific error code. - RLMErrorFileOperationFailed = 19, - - /** - Denotes an error that occurs if the file being opened is not a valid Realm - file. Some of the possible causes of this are: - 1. The file at the given URL simply isn't a Realm file at all. - 2. The wrong encryption key was given. - 3. The Realm file is encrypted and no encryption key was given. - 4. The Realm file isn't encrypted but an encryption key was given. - 5. The file on disk has become corrupted. - */ - RLMErrorInvalidDatabase = 20, - - /** - Denotes an error that occurs if a Realm is opened in the wrong history - mode. Typically this means that either a local Realm is being opened as a - synchronized Realm or vice versa. - */ - RLMErrorIncompatibleHistories = 21, - - /** - Denotes an error that occurs if objects were written to a flexible sync - Realm without any active subscriptions for that object type. All objects - created in flexible sync Realms must match at least one active - subscription or the server will reject the write. - */ - RLMErrorNoSubscriptionForWrite = 22, -}; - -#pragma mark - RLMSyncError - -/// A user info key for use with `RLMSyncErrorClientResetError`. -extern NSString *const kRLMSyncPathOfRealmBackupCopyKey; - -/// A user info key for use with certain error types. -extern NSString *const kRLMSyncErrorActionTokenKey; - -/** - An error related to a problem that might be reported by the synchronization manager - error handler, or a callback on a sync-related API that performs asynchronous work. - */ -typedef RLM_ERROR_ENUM(NSInteger, RLMSyncError, RLMSyncErrorDomain) { - /// An error that indicates a problem with the session (a specific Realm opened for sync). - RLMSyncErrorClientSessionError = 4, - - /// An error that indicates a problem with a specific user. - RLMSyncErrorClientUserError = 5, - - /** - An error that indicates an internal, unrecoverable problem - with the underlying synchronization engine. - */ - RLMSyncErrorClientInternalError = 6, - - /** - An error that indicates the Realm needs to be reset. - - A synced Realm may need to be reset because Atlas App Services encountered an - error and had to be restored from a backup. If the backup copy of the remote Realm - is of an earlier version than the local copy of the Realm, the server will ask the - client to reset the Realm. - - The reset process is as follows: the local copy of the Realm is copied into a recovery - directory for safekeeping, and then deleted from the original location. The next time - the Realm for that partition value is opened, the Realm will automatically be re-downloaded from - Atlas App Services, and can be used as normal. - - Data written to the Realm after the local copy of the Realm diverged from the backup - remote copy will be present in the local recovery copy of the Realm file. The - re-downloaded Realm will initially contain only the data present at the time the Realm - was backed up on the server. - - The client reset process can be initiated in one of two ways. - - The `userInfo` dictionary contains an opaque token object under the key - `kRLMSyncErrorActionTokenKey`. This token can be passed into - `+[RLMSyncSession immediatelyHandleError:]` in order to immediately perform the client - reset process. This should only be done after your app closes and invalidates every - instance of the offending Realm on all threads (note that autorelease pools may make this - difficult to guarantee). - - If `+[RLMSyncSession immediatelyHandleError:]` is not called, the client reset process - will be automatically carried out the next time the app is launched and the - `RLMSyncManager` is accessed. - - The value for the `kRLMSyncPathOfRealmBackupCopyKey` key in the `userInfo` dictionary - describes the path of the recovered copy of the Realm. This copy will not actually be - created until the client reset process is initiated. - - @see `-[NSError rlmSync_errorActionToken]`, `-[NSError rlmSync_clientResetBackedUpRealmPath]` - */ - RLMSyncErrorClientResetError = 7, - - /// :nodoc: - RLMSyncErrorUnderlyingAuthError = 8, - - /** - An error that indicates the user does not have permission to perform an operation - upon a synced Realm. For example, a user may receive this error if they attempt to - open a Realm they do not have at least read access to, or write to a Realm they only - have read access to. - - This error may also occur if a user incorrectly opens a Realm they have read-only - permissions to without using the `asyncOpen()` APIs. - - A Realm that suffers a permission denied error is, by default, flagged so that its - local copy will be deleted the next time the application starts. - - The `userInfo` dictionary contains an opaque token object under the key - `kRLMSyncErrorActionTokenKey`. This token can be passed into - `+[RLMSyncSession immediatelyHandleError:]` in order to immediately delete the local - copy. This should only be done after your app closes and invalidates every instance - of the offending Realm on all threads (note that autorelease pools may make this - difficult to guarantee). - - @warning It is strongly recommended that, if a Realm has encountered a permission denied - error, its files be deleted before attempting to re-open it. - - @see `-[NSError rlmSync_errorActionToken]` - */ - RLMSyncErrorPermissionDeniedError = 9, - - /** - An error that indicates that the server has rejected the requested flexible sync subscriptions. - */ - RLMSyncErrorInvalidFlexibleSyncSubscriptions = 10, - - /** - An error that indicates that the server has reverted a write made by this - client. This can happen due to not having write permission, or because an - object was created in a flexible sync Realm which does not match any - active subscriptions. - - This error is informational and does not require any explicit handling. - */ - RLMSyncErrorWriteRejected = 11, - - /** - A connection error without a more specific error code occurred. - - Realm internally handles retrying connections with appropriate backoffs, - so connection errors are normally logged and not reported to the error - handler. The exception is if - ``RLMSyncConfiguration.cancelAsyncOpenOnNonFatalErrors`` is set to `true`, - in which case async opens will be canceled on connection failures and the - error will be reported to the completion handler. - - Note that connection timeouts are reported as - (errorDomain: NSPosixErrorDomain, error: ETIMEDOUT) - and not as one of these error codes. - */ - RLMSyncErrorConnectionFailed = 12, - - /** - Connecting to the server failed due to a TLS issue such as an invalid certificate. - */ - RLMSyncErrorTLSHandshakeFailed = 13, -}; - -#pragma mark - RLMSyncAuthError - -// NEXT-MAJOR: This was a ROS thing and should have been removed in v10 -/// :nodoc: -typedef RLM_ERROR_ENUM(NSInteger, RLMSyncAuthError, RLMSyncAuthErrorDomain) { - RLMSyncAuthErrorBadResponse = 1, - RLMSyncAuthErrorBadRemoteRealmPath = 2, - RLMSyncAuthErrorHTTPStatusCodeError = 3, - RLMSyncAuthErrorClientSessionError = 4, - RLMSyncAuthErrorInvalidParameters = 601, - RLMSyncAuthErrorMissingPath = 602, - RLMSyncAuthErrorInvalidCredential = 611, - RLMSyncAuthErrorUserDoesNotExist = 612, - RLMSyncAuthErrorUserAlreadyExists = 613, - RLMSyncAuthErrorAccessDeniedOrInvalidPath = 614, - RLMSyncAuthErrorInvalidAccessToken = 615, - RLMSyncAuthErrorFileCannotBeShared = 703, -} __attribute__((deprecated("Errors of this type are no longer reported"))); - -#pragma mark - RLMSyncAppError - -/// An error which occurred when making a request to Atlas App Services. -typedef RLM_ERROR_ENUM(NSInteger, RLMAppError, RLMAppErrorDomain) { - /// An unknown error has occurred - RLMAppErrorUnknown = -1, - - /// A HTTP request completed with an error status code. The failing status - /// code can be found in the ``RLMHTTPStatusCodeKey`` key of the userInfo - /// dictionary. - RLMAppErrorHttpRequestFailed = 1, - - /// A user's session is in an invalid state. Logging out and back in may rectify this. - RLMAppErrorInvalidSession, - /// A request sent to the server was malformed in some way. - RLMAppErrorBadRequest, - /// A request was made using a nonexistent user. - RLMAppErrorUserNotFound, - /// A request was made against an App using a User which does not belong to that App. - RLMAppErrorUserAppDomainMismatch, - /// The auth provider has limited the domain names which can be used for email addresses, and the given one is not allowed. - RLMAppErrorDomainNotAllowed, - /// The request body size exceeded a server-configured limit. - RLMAppErrorReadSizeLimitExceeded, - /// A request had an invalid parameter. - RLMAppErrorInvalidParameter, - /// A request was missing a required parameter. - RLMAppErrorMissingParameter, - /// Executing the requested server function failed with an error. - RLMAppErrorFunctionExecutionError, - /// The server encountered an internal error. - RLMAppErrorInternalServerError, - /// Authentication failed due to the request auth provider not existing. - RLMAppErrorAuthProviderNotFound, - /// The requested value does not exist. - RLMAppErrorValueNotFound, - /// The value being created already exists. - RLMAppErrorValueAlreadyExists, - /// A value with the same name as the value being created already exists. - RLMAppErrorValueDuplicateName, - /// The called server function does not exist. - RLMAppErrorFunctionNotFound, - /// The called server function has a syntax error. - RLMAppErrorFunctionSyntaxError, - /// The called server function is invalid in some way. - RLMAppErrorFunctionInvalid, - /// Registering an API key with the auth provider failed due to it already existing. - RLMAppErrorAPIKeyAlreadyExists, - /// The operation failed due to exceeding the server-configured time limit. - RLMAppErrorExecutionTimeLimitExceeded, - /// The body of the called function does not define a callable thing. - RLMAppErrorNotCallable, - /// Email confirmation failed for a user because the user has already confirmed their email. - RLMAppErrorUserAlreadyConfirmed, - /// The user cannot be used because it has been disabled. - RLMAppErrorUserDisabled, - /// An auth error occurred which does not have a more specific error code. - RLMAppErrorAuthError, - /// Account registration failed due to the user name already being taken. - RLMAppErrorAccountNameInUse, - /// A login request failed due to an invalid password. - RLMAppErrorInvalidPassword, - /// Operation failed due to server-side maintenance. - RLMAppErrorMaintenanceInProgress, - /// Operation failed due to an error reported by MongoDB. - RLMAppErrorMongoDBError, -}; - -/// Extended information about a write which was rejected by the server. -/// -/// The server will sometimes reject writes made by the client for reasons such -/// as permissions, additional server-side validation failing, or because the -/// object didn't match any flexible sync subscriptions. When this happens, a -/// ``RLMSyncErrorWriteRejected`` error is reported which contains an array of -/// `RLMCompensatingWriteInfo` objects in the ``RLMCompensatingWriteInfoKey`` -/// userInfo key with information about what writes were rejected and why. -/// -/// This information is intended for debugging and logging purposes only. The -/// `reason` strings are generated by the server and are not guaranteed to be -/// stable, so attempting to programmatically do anything with them will break -/// without warning. -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMCompensatingWriteInfo : NSObject -/// The class name of the object being written to. -@property (nonatomic, readonly) NSString *objectType; -/// The primary key of the object being written to. -@property (nonatomic, readonly) id primaryKey NS_REFINED_FOR_SWIFT; -/// A human-readable string describing why the write was rejected. -@property (nonatomic, readonly) NSString *reason; -@end diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMFindOneAndModifyOptions.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMFindOneAndModifyOptions.h deleted file mode 100644 index 3cce99f23..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMFindOneAndModifyOptions.h +++ /dev/null @@ -1,80 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) -@protocol RLMBSON; -@class RLMSortDescriptor; - -/// Options to use when executing a `findOneAndUpdate`, `findOneAndReplace`, -/// or `findOneAndDelete` command on a `RLMMongoCollection`. -@interface RLMFindOneAndModifyOptions : NSObject - -/// Limits the fields to return for all matching documents. -@property (nonatomic, nullable) id projection NS_REFINED_FOR_SWIFT; - -/// The order in which to return matching documents. -@property (nonatomic, nullable) id sort NS_REFINED_FOR_SWIFT -__attribute__((deprecated("Use `sorting` instead, which correctly sort more than one sort attribute", "sorting"))); - -/// The order in which to return matching documents. -@property (nonatomic) NSArray> *sorting NS_REFINED_FOR_SWIFT; - - -/// Whether or not to perform an upsert, default is false -/// (only available for find_one_and_replace and find_one_and_update) -@property (nonatomic) BOOL upsert; - -/// When true then the new document is returned, -/// Otherwise the old document is returned (default) -/// (only available for findOneAndReplace and findOneAndUpdate) -@property (nonatomic) BOOL shouldReturnNewDocument; - -/// Options to use when executing a `findOneAndUpdate`, `findOneAndReplace`, -/// or `findOneAndDelete` command on a `RLMMongoCollection`. -/// @param projection Limits the fields to return for all matching documents. -/// @param sort The order in which to return matching documents. -/// @param upsert Whether or not to perform an upsert, default is false -/// (only available for findOneAndReplace and findOneAndUpdate) -/// @param shouldReturnNewDocument When true then the new document is returned, -/// Otherwise the old document is returned (default), -/// (only available for findOneAndReplace and findOneAndUpdate) -- (instancetype)initWithProjection:(id _Nullable)projection - sort:(id _Nullable)sort - upsert:(BOOL)upsert - shouldReturnNewDocument:(BOOL)shouldReturnNewDocument -__attribute__((deprecated("Please use `initWithProjection:sorting:upsert:shouldReturnNewDocument:`"))) - NS_SWIFT_UNAVAILABLE("Please see FindOneAndModifyOptions"); - -/// Options to use when executing a `findOneAndUpdate`, `findOneAndReplace`, -/// or `findOneAndDelete` command on a `RLMMongoCollection`. -/// @param projection Limits the fields to return for all matching documents. -/// @param sorting The order in which to return matching documents. -/// @param upsert Whether or not to perform an upsert, default is false -/// (only available for findOneAndReplace and findOneAndUpdate) -/// @param shouldReturnNewDocument When true then the new document is returned, -/// Otherwise the old document is returned (default), -/// (only available for findOneAndReplace and findOneAndUpdate) -- (instancetype)initWithProjection:(id _Nullable)projection - sorting:(NSArray> *)sorting - upsert:(BOOL)upsert - shouldReturnNewDocument:(BOOL)shouldReturnNewDocument; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMFindOptions.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMFindOptions.h deleted file mode 100644 index 043a85374..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMFindOptions.h +++ /dev/null @@ -1,77 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@protocol RLMBSON; - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -@interface RLMFindOptions : NSObject - -/// The maximum number of documents to return. Specifying 0 will return all documents. -@property (nonatomic) NSInteger limit; - -/// Limits the fields to return for all matching documents. -@property (nonatomic, nullable) id projection NS_REFINED_FOR_SWIFT; - -/// The order in which to return matching documents. -@property (nonatomic, nullable) id sort NS_REFINED_FOR_SWIFT -__attribute__((deprecated("Use `sorting` instead, which correctly sort more than one sort attribute", "sorting"))); - -/// The order in which to return matching documents. -@property (nonatomic) NSArray> *sorting NS_REFINED_FOR_SWIFT; - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -/// @param limit The maximum number of documents to return. Specifying 0 will return all documents. -/// @param projection Limits the fields to return for all matching documents. -/// @param sort The order in which to return matching documents. -- (instancetype)initWithLimit:(NSInteger)limit - projection:(id _Nullable)projection - sort:(id _Nullable)sort -__attribute__((deprecated("Please use `initWithLimit:projection:sorting:`"))) - NS_SWIFT_UNAVAILABLE("Please see FindOption"); - - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -/// @param projection Limits the fields to return for all matching documents. -/// @param sort The order in which to return matching documents. -- (instancetype)initWithProjection:(id _Nullable)projection - sort:(id _Nullable)sort __deprecated -__attribute__((deprecated("Please use `initWithProjection:sorting:`"))) - NS_SWIFT_UNAVAILABLE("Please see FindOption"); - - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -/// @param limit The maximum number of documents to return. Specifying 0 will return all documents. -/// @param projection Limits the fields to return for all matching documents. -/// @param sorting The order in which to return matching documents. -- (instancetype)initWithLimit:(NSInteger)limit - projection:(id _Nullable)projection - sorting:(NSArray> *)sorting; - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -/// @param projection Limits the fields to return for all matching documents. -/// @param sorting The order in which to return matching documents. -- (instancetype)initWithProjection:(id _Nullable)projection - sorting:(NSArray> *)sorting; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMLogger.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMLogger.h deleted file mode 100644 index 96ab91967..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMLogger.h +++ /dev/null @@ -1,99 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -/// An enum representing different levels of sync-related logging that can be configured. -typedef RLM_CLOSED_ENUM(NSUInteger, RLMLogLevel) { - /// Nothing will ever be logged. - RLMLogLevelOff, - /// Only fatal errors will be logged. - RLMLogLevelFatal, - /// Only errors will be logged. - RLMLogLevelError, - /// Warnings and errors will be logged. - RLMLogLevelWarn, - /// Information about sync events will be logged. Fewer events will be logged in order to avoid overhead. - RLMLogLevelInfo, - /// Information about sync events will be logged. More events will be logged than with `RLMLogLevelInfo`. - RLMLogLevelDetail, - /// Log information that can aid in debugging. - /// - /// - warning: Will incur a measurable performance impact. - RLMLogLevelDebug, - /// Log information that can aid in debugging. More events will be logged than with `RLMLogLevelDebug`. - /// - /// - warning: Will incur a measurable performance impact. - RLMLogLevelTrace, - /// Log information that can aid in debugging. More events will be logged than with `RLMLogLevelTrace`. - /// - /// - warning: Will incur a measurable performance impact. - RLMLogLevelAll -} NS_SWIFT_NAME(LogLevel); - -/// A log callback function which can be set on RLMLogger. -/// -/// The log function may be called from multiple threads simultaneously, and is -/// responsible for performing its own synchronization if any is required. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void (^RLMLogFunction)(RLMLogLevel level, NSString *message); - -/** - `RLMLogger` is used for creating your own custom logging logic. - - You can define your own logger creating an instance of `RLMLogger` and define the log function which will be - invoked whenever there is a log message. - Set this custom logger as you default logger using `setDefaultLogger`. - - RLMLogger.defaultLogger = [[RLMLogger alloc] initWithLevel:RLMLogLevelDebug - logFunction:^(RLMLogLevel level, NSString * message) { - NSLog(@"Realm Log - %lu, %@", (unsigned long)level, message); - }]; - - @note By default default log threshold level is `RLMLogLevelInfo`, and logging strings are output to Apple System Logger. -*/ -@interface RLMLogger : NSObject - -/** - Gets the logging threshold level used by the logger. - */ -@property (nonatomic) RLMLogLevel level; - -/// :nodoc: -- (instancetype)init NS_UNAVAILABLE; - -/** - Creates a logger with the associated log level and the logic function to define your own logging logic. - - @param level The log level to be set for the logger. - @param logFunction The log function which will be invoked whenever there is a log message. -*/ -- (instancetype)initWithLevel:(RLMLogLevel)level logFunction:(RLMLogFunction)logFunction; - -#pragma mark RLMLogger Default Logger API - -/** - The current default logger. When setting a logger as default, this logger will be used whenever information must be logged. - */ -@property (class) RLMLogger *defaultLogger NS_SWIFT_NAME(shared); - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMMigration.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMMigration.h deleted file mode 100644 index 4a6652a19..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMMigration.h +++ /dev/null @@ -1,129 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMSchema; -@class RLMArray; -@class RLMObject; - -/** - A block type which provides both the old and new versions of an object in the Realm. Object - properties can only be accessed using keyed subscripting. - - @see `-[RLMMigration enumerateObjects:block:]` - - @param oldObject The object from the original Realm (read-only). - @param newObject The object from the migrated Realm (read-write). -*/ -typedef void (^RLMObjectMigrationBlock)(RLMObject * __nullable oldObject, RLMObject * __nullable newObject); - -/** - `RLMMigration` instances encapsulate information intended to facilitate a schema migration. - - A `RLMMigration` instance is passed into a user-defined `RLMMigrationBlock` block when updating - the version of a Realm. This instance provides access to the old and new database schemas, the - objects in the Realm, and provides functionality for modifying the Realm during the migration. - */ -@interface RLMMigration : NSObject - -#pragma mark - Properties - -/** - Returns the old `RLMSchema`. This is the schema which describes the Realm before the - migration is applied. - */ -@property (nonatomic, readonly) RLMSchema *oldSchema NS_REFINED_FOR_SWIFT; - -/** - Returns the new `RLMSchema`. This is the schema which describes the Realm after the - migration is applied. - */ -@property (nonatomic, readonly) RLMSchema *newSchema NS_REFINED_FOR_SWIFT; - - -#pragma mark - Altering Objects during a Migration - -/** - Enumerates all the objects of a given type in the Realm, providing both the old and new versions - of each object. Within the block, object properties can only be accessed using keyed subscripting. - - @param className The name of the `RLMObject` class to enumerate. - - @warning All objects returned are of a type specific to the current migration and should not be cast - to `className`. Instead, treat them as `RLMObject`s and use keyed subscripting to access - properties. - */ -- (void)enumerateObjects:(NSString *)className - block:(__attribute__((noescape)) RLMObjectMigrationBlock)block NS_REFINED_FOR_SWIFT; - -/** - Creates and returns an `RLMObject` instance of type `className` in the Realm being migrated. - - The `value` argument is used to populate the object. It can be a key-value coding compliant object, an array or - dictionary returned from the methods in `NSJSONSerialization`, or an array containing one element for each managed - property. An exception will be thrown if any required properties are not present and those properties were not defined - with default values. - - When passing in an `NSArray` as the `value` argument, all properties must be present, valid and in the same order as - the properties defined in the model. - - @param className The name of the `RLMObject` class to create. - @param value The value used to populate the object. - */ -- (RLMObject *)createObject:(NSString *)className withValue:(id)value NS_REFINED_FOR_SWIFT; - -/** - Deletes an object from a Realm during a migration. - - It is permitted to call this method from within the block passed to `-[enumerateObjects:block:]`. - - @param object Object to be deleted from the Realm being migrated. - */ -- (void)deleteObject:(RLMObject *)object NS_REFINED_FOR_SWIFT; - -/** - Deletes the data for the class with the given name. - - All objects of the given class will be deleted. If the `RLMObject` subclass no longer exists in your program, - any remaining metadata for the class will be removed from the Realm file. - - @param name The name of the `RLMObject` class to delete. - - @return A Boolean value indicating whether there was any data to delete. - */ -- (BOOL)deleteDataForClassName:(NSString *)name NS_REFINED_FOR_SWIFT; - -/** - Renames a property of the given class from `oldName` to `newName`. - - @param className The name of the class whose property should be renamed. This class must be present - in both the old and new Realm schemas. - @param oldName The old persisted property name for the property to be renamed. There must not be a property with this name in the - class as defined by the new Realm schema. - @param newName The new persisted property name for the property to be renamed. There must not be a property with this name in the - class as defined by the old Realm schema. - */ -- (void)renamePropertyForClass:(NSString *)className oldName:(NSString *)oldName - newName:(NSString *)newName NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMMongoClient.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMMongoClient.h deleted file mode 100644 index 50a1c226d..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMMongoClient.h +++ /dev/null @@ -1,47 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMApp; - -/// The `RLMMongoClient` enables reading and writing on a MongoDB database via the Realm Cloud service. -/// -/// It provides access to instances of `RLMMongoDatabase`, which in turn provide access to specific -/// `RLMMongoCollection`s that hold your data. -/// -/// - Note: -/// Before you can read or write data, a user must log in. -/// -/// - SeeAlso: -/// `RLMApp`, `RLMMongoDatabase`, `RLMMongoCollection` -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMMongoClient : NSObject - -/// The name of the client -@property (nonatomic, readonly) NSString *name; - -/// Gets a `RLMMongoDatabase` instance for the given database name. -/// @param name the name of the database to retrieve -- (RLMMongoDatabase *)databaseWithName:(NSString *)name NS_SWIFT_NAME(database(named:)); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMMongoCollection.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMMongoCollection.h deleted file mode 100644 index 0feae60ac..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMMongoCollection.h +++ /dev/null @@ -1,330 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) -@protocol RLMBSON; - -@class RLMFindOptions, RLMFindOneAndModifyOptions, RLMUpdateResult, RLMChangeStream, RLMObjectId; - -/// Delegate which is used for subscribing to changes on a `[RLMMongoCollection watch]` stream. -@protocol RLMChangeEventDelegate -/// The stream was opened. -/// @param changeStream The RLMChangeStream subscribing to the stream changes. -- (void)changeStreamDidOpen:(RLMChangeStream *)changeStream; -/// The stream has been closed. -/// @param error If an error occured when closing the stream, an error will be passed. -- (void)changeStreamDidCloseWithError:(nullable NSError *)error; -/// A error has occured while streaming. -/// @param error The streaming error. -- (void)changeStreamDidReceiveError:(NSError *)error; -/// Invoked when a change event has been received. -/// @param changeEvent The change event in BSON format. -- (void)changeStreamDidReceiveChangeEvent:(id)changeEvent; -@end - -/// Acts as a middleman and processes events with WatchStream -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMChangeStream : NSObject -/// Stops a watch streaming session. -- (void)close; -/// :nodoc: -- (instancetype)init NS_UNAVAILABLE; -@end - -/// The `RLMMongoCollection` represents a MongoDB collection. -/// -/// You can get an instance from a `RLMMongoDatabase`. -/// -/// Create, read, update, and delete methods are available. -/// -/// Operations against the Realm Cloud server are performed asynchronously. -/// -/// - Note: -/// Before you can read or write data, a user must log in. -/// - Usage: -/// RLMMongoClient *client = [self.app mongoClient:@"mongodb1"]; -/// RLMMongoDatabase *database = [client databaseWithName:@"test_data"]; -/// RLMMongoCollection *collection = [database collectionWithName:@"Dog"]; -/// [collection insertOneDocument:@{@"name": @"fido", @"breed": @"cane corso"} completion:...]; -/// -/// - SeeAlso: -/// `RLMMongoClient`, `RLMMongoDatabase` -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMMongoCollection : NSObject -/// Block which returns an object id on a successful insert, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoInsertBlock)(id _Nullable, NSError * _Nullable); -/// Block which returns an array of object ids on a successful insertMany, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoInsertManyBlock)(NSArray> * _Nullable, NSError * _Nullable); -/// Block which returns an array of Documents on a successful find operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoFindBlock)(NSArray> *> * _Nullable, - NSError * _Nullable); -/// Block which returns a Document on a successful findOne operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoFindOneBlock)(NSDictionary> * _Nullable_result, - NSError * _Nullable); -/// Block which returns the number of Documents in a collection on a successful count operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoCountBlock)(NSInteger, NSError * _Nullable); -/// Block which returns an RLMUpdateResult on a successful update operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoUpdateBlock)(RLMUpdateResult * _Nullable, NSError * _Nullable); -/// Block which returns the deleted Document on a successful delete operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoDeleteBlock)(NSDictionary> * _Nullable_result, - NSError * _Nullable); - -/// The name of this mongodb collection. -@property (nonatomic, readonly) NSString *name; - -/// Encodes the provided value to BSON and inserts it. If the value is missing an identifier, one will be -/// generated for it. -/// @param document A `Document` value to insert. -/// @param completion The result of attempting to perform the insert. An Id will be returned for the inserted object on sucess -- (void)insertOneDocument:(NSDictionary> *)document - completion:(RLMMongoInsertBlock)completion NS_REFINED_FOR_SWIFT; - -/// Encodes the provided values to BSON and inserts them. If any values are missing identifiers, -/// they will be generated. -/// @param documents The `Document` values in a bson array to insert. -/// @param completion The result of the insert, returns an array inserted document ids in order -- (void)insertManyDocuments:(NSArray> *> *)documents - completion:(RLMMongoInsertManyBlock)completion NS_REFINED_FOR_SWIFT; - -/// Finds the documents in this collection which match the provided filter. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param options `RLMFindOptions` to use when executing the command. -/// @param completion The resulting bson array of documents or error if one occurs -- (void)findWhere:(NSDictionary> *)filterDocument - options:(RLMFindOptions *)options - completion:(RLMMongoFindBlock)completion NS_REFINED_FOR_SWIFT; - -/// Finds the documents in this collection which match the provided filter. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param completion The resulting bson array as a string or error if one occurs -- (void)findWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoFindBlock)completion NS_REFINED_FOR_SWIFT; - -/// Returns one document from a collection or view which matches the -/// provided filter. If multiple documents satisfy the query, this method -/// returns the first document according to the query's sort order or natural -/// order. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param options `RLMFindOptions` to use when executing the command. -/// @param completion The resulting bson or error if one occurs -- (void)findOneDocumentWhere:(NSDictionary> *)filterDocument - options:(RLMFindOptions *)options - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Returns one document from a collection or view which matches the -/// provided filter. If multiple documents satisfy the query, this method -/// returns the first document according to the query's sort order or natural -/// order. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param completion The resulting bson or error if one occurs -- (void)findOneDocumentWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Runs an aggregation framework pipeline against this collection. -/// @param pipeline A bson array made up of `Documents` containing the pipeline of aggregation operations to perform. -/// @param completion The resulting bson array of documents or error if one occurs -- (void)aggregateWithPipeline:(NSArray> *> *)pipeline - completion:(RLMMongoFindBlock)completion NS_REFINED_FOR_SWIFT; - -/// Counts the number of documents in this collection matching the provided filter. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param limit The max amount of documents to count -/// @param completion Returns the count of the documents that matched the filter. -- (void)countWhere:(NSDictionary> *)filterDocument - limit:(NSInteger)limit - completion:(RLMMongoCountBlock)completion NS_REFINED_FOR_SWIFT; - -/// Counts the number of documents in this collection matching the provided filter. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param completion Returns the count of the documents that matched the filter. -- (void)countWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoCountBlock)completion NS_REFINED_FOR_SWIFT; - -/// Deletes a single matching document from the collection. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param completion The result of performing the deletion. Returns the count of deleted objects -- (void)deleteOneDocumentWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoCountBlock)completion NS_REFINED_FOR_SWIFT; - -/// Deletes multiple documents -/// @param filterDocument Document representing the match criteria -/// @param completion The result of performing the deletion. Returns the count of the deletion -- (void)deleteManyDocumentsWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoCountBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates a single document matching the provided filter in this collection. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param upsert When true, creates a new document if no document matches the query. -/// @param completion The result of the attempt to update a document. -- (void)updateOneDocumentWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - upsert:(BOOL)upsert - completion:(RLMMongoUpdateBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates a single document matching the provided filter in this collection. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param completion The result of the attempt to update a document. -- (void)updateOneDocumentWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - completion:(RLMMongoUpdateBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates multiple documents matching the provided filter in this collection. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param upsert When true, creates a new document if no document matches the query. -/// @param completion The result of the attempt to update a document. -- (void)updateManyDocumentsWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - upsert:(BOOL)upsert - completion:(RLMMongoUpdateBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates multiple documents matching the provided filter in this collection. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param completion The result of the attempt to update a document. -- (void)updateManyDocumentsWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - completion:(RLMMongoUpdateBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates a single document in a collection based on a query filter and -/// returns the document in either its pre-update or post-update form. Unlike -/// `updateOneDocument`, this action allows you to atomically find, update, and -/// return a document with the same command. This avoids the risk of other -/// update operations changing the document between separate find and update -/// operations. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param options `RemoteFindOneAndModifyOptions` to use when executing the command. -/// @param completion The result of the attempt to update a document. -- (void)findOneAndUpdateWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - options:(RLMFindOneAndModifyOptions *)options - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates a single document in a collection based on a query filter and -/// returns the document in either its pre-update or post-update form. Unlike -/// `updateOneDocument`, this action allows you to atomically find, update, and -/// return a document with the same command. This avoids the risk of other -/// update operations changing the document between separate find and update -/// operations. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param completion The result of the attempt to update a document. -- (void)findOneAndUpdateWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Overwrites a single document in a collection based on a query filter and -/// returns the document in either its pre-replacement or post-replacement -/// form. Unlike `updateOneDocument`, this action allows you to atomically find, -/// replace, and return a document with the same command. This avoids the -/// risk of other update operations changing the document between separate -/// find and update operations. -/// @param filterDocument A `Document` that should match the query. -/// @param replacementDocument A `Document` describing the replacement. -/// @param options `RLMFindOneAndModifyOptions` to use when executing the command. -/// @param completion The result of the attempt to replace a document. -- (void)findOneAndReplaceWhere:(NSDictionary> *)filterDocument - replacementDocument:(NSDictionary> *)replacementDocument - options:(RLMFindOneAndModifyOptions *)options - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Overwrites a single document in a collection based on a query filter and -/// returns the document in either its pre-replacement or post-replacement -/// form. Unlike `updateOneDocument`, this action allows you to atomically find, -/// replace, and return a document with the same command. This avoids the -/// risk of other update operations changing the document between separate -/// find and update operations. -/// @param filterDocument A `Document` that should match the query. -/// @param replacementDocument A `Document` describing the update. -/// @param completion The result of the attempt to replace a document. -- (void)findOneAndReplaceWhere:(NSDictionary> *)filterDocument - replacementDocument:(NSDictionary> *)replacementDocument - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Removes a single document from a collection based on a query filter and -/// returns a document with the same form as the document immediately before -/// it was deleted. Unlike `deleteOneDocument`, this action allows you to atomically -/// find and delete a document with the same command. This avoids the risk of -/// other update operations changing the document between separate find and -/// delete operations. -/// @param filterDocument A `Document` that should match the query. -/// @param options `RLMFindOneAndModifyOptions` to use when executing the command. -/// @param completion The result of the attempt to delete a document. -- (void)findOneAndDeleteWhere:(NSDictionary> *)filterDocument - options:(RLMFindOneAndModifyOptions *)options - completion:(RLMMongoDeleteBlock)completion NS_REFINED_FOR_SWIFT; - -/// Removes a single document from a collection based on a query filter and -/// returns a document with the same form as the document immediately before -/// it was deleted. Unlike `deleteOneDocument`, this action allows you to atomically -/// find and delete a document with the same command. This avoids the risk of -/// other update operations changing the document between separate find and -/// delete operations. -/// @param filterDocument A `Document` that should match the query. -/// @param completion The result of the attempt to delete a document. -- (void)findOneAndDeleteWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoDeleteBlock)completion NS_REFINED_FOR_SWIFT; - -/// Opens a MongoDB change stream against the collection to watch for changes. The resulting stream will be notified -/// of all events on this collection that the active user is authorized to see based on the configured MongoDB -/// rules. -/// @param delegate The delegate that will react to events and errors from the resulting change stream. -/// @param queue Dispatches streaming events to an optional queue, if no queue is provided the main queue is used -- (RLMChangeStream *)watchWithDelegate:(id)delegate - delegateQueue:(nullable dispatch_queue_t)queue NS_REFINED_FOR_SWIFT; - -/// Opens a MongoDB change stream against the collection to watch for changes -/// made to specific documents. The documents to watch must be explicitly -/// specified by their _id. -/// @param filterIds The list of _ids in the collection to watch. -/// @param delegate The delegate that will react to events and errors from the resulting change stream. -/// @param queue Dispatches streaming events to an optional queue, if no queue is provided the main queue is used -- (RLMChangeStream *)watchWithFilterIds:(NSArray *)filterIds - delegate:(id)delegate - delegateQueue:(nullable dispatch_queue_t)queue NS_REFINED_FOR_SWIFT; - -/// Opens a MongoDB change stream against the collection to watch for changes. The provided BSON document will be -/// used as a match expression filter on the change events coming from the stream. -/// -/// See https://docs.mongodb.com/manual/reference/operator/aggregation/match/ for documentation around how to define -/// a match filter. -/// -/// Defining the match expression to filter ChangeEvents is similar to defining the match expression for triggers: -/// https://docs.mongodb.com/realm/triggers/database-triggers/ -/// @param matchFilter The $match filter to apply to incoming change events -/// @param delegate The delegate that will react to events and errors from the resulting change stream. -/// @param queue Dispatches streaming events to an optional queue, if no queue is provided the main queue is used -- (RLMChangeStream *)watchWithMatchFilter:(NSDictionary> *)matchFilter - delegate:(id)delegate - delegateQueue:(nullable dispatch_queue_t)queue NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMMongoDatabase.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMMongoDatabase.h deleted file mode 100644 index 177fbc1b8..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMMongoDatabase.h +++ /dev/null @@ -1,51 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMMongoCollection; - -/// The `RLMMongoDatabase` represents a MongoDB database, which holds a group -/// of collections that contain your data. -/// -/// It can be retrieved from the `RLMMongoClient`. -/// -/// Use it to get `RLMMongoCollection`s for reading and writing data. -/// -/// - Note: -/// Before you can read or write data, a user must log in`. -/// -/// - SeeAlso: -/// `RLMMongoClient`, `RLMMongoCollection` -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMMongoDatabase : NSObject - -/// The name of this database -@property (nonatomic, readonly) NSString *name; - -/// Gets a collection. -/// @param name The name of the collection to return -/// @returns The collection -- (RLMMongoCollection *)collectionWithName:(NSString *)name; -// NEXT-MAJOR: NS_SWIFT_NAME(collection(named:)) - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMNetworkTransport.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMNetworkTransport.h deleted file mode 100644 index 2884b4296..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMNetworkTransport.h +++ /dev/null @@ -1,132 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// Allowed HTTP methods to be used with `RLMNetworkTransport`. -typedef RLM_CLOSED_ENUM(int32_t, RLMHTTPMethod) { - /// GET is used to request data from a specified resource. - RLMHTTPMethodGET = 0, - /// POST is used to send data to a server to create/update a resource. - RLMHTTPMethodPOST = 1, - /// PATCH is used to send data to a server to update a resource. - RLMHTTPMethodPATCH = 2, - /// PUT is used to send data to a server to create/update a resource. - RLMHTTPMethodPUT = 3, - /// The DELETE method deletes the specified resource. - RLMHTTPMethodDELETE = 4 -}; - -/// An HTTP request that can be made to an arbitrary server. -@interface RLMRequest : NSObject - -/// The HTTP method of this request. -@property (nonatomic, assign) RLMHTTPMethod method; - -/// The URL to which this request will be made. -@property (nonatomic, strong) NSString *url; - -/// The number of milliseconds that the underlying transport should spend on an -/// HTTP round trip before failing with an error. -@property (nonatomic, assign) NSTimeInterval timeout; - -/// The HTTP headers of this request. -@property (nonatomic, strong) NSDictionary* headers; - -/// The body of the request. -@property (nonatomic, strong) NSString* body; - -@end - -/// The contents of an HTTP response. -@interface RLMResponse : NSObject - -/// The status code of the HTTP response. -@property (nonatomic, assign) NSInteger httpStatusCode; - -/// A custom status code provided by the SDK. -@property (nonatomic, assign) NSInteger customStatusCode; - -/// The headers of the HTTP response. -@property (nonatomic, strong) NSDictionary* headers; - -/// The body of the HTTP response. -@property (nonatomic, strong) NSString *body; - -@end - -/// Delegate which is used for subscribing to changes. -@protocol RLMEventDelegate -/// Invoked when a change event has been received. -/// @param event The change event encoded as NSData -- (void)didReceiveEvent:(NSData *)event; -/// A error has occurred while subscribing to changes. -/// @param error The error that has occurred. -- (void)didReceiveError:(NSError *)error; -/// The stream was opened. -- (void)didOpen; -/// The stream has been closed. -/// @param error The error that has occurred. -- (void)didCloseWithError:(NSError *_Nullable)error; -@end - -/// A block for receiving an `RLMResponse` from the `RLMNetworkTransport`. -RLM_SWIFT_SENDABLE // invoked on a backgroun thread -typedef void(^RLMNetworkTransportCompletionBlock)(RLMResponse *); - -/// Transporting protocol for foreign interfaces. Allows for custom -/// request/response handling. -RLM_SWIFT_SENDABLE // used from multiple threads so must be internally thread-safe -@protocol RLMNetworkTransport - -/** - Sends a request to a given endpoint. - - @param request The request to send. - @param completionBlock A callback invoked on completion of the request. -*/ -- (void)sendRequestToServer:(RLMRequest *)request - completion:(RLMNetworkTransportCompletionBlock)completionBlock; - -/// Starts an event stream request. -/// @param request The RLMRequest to start. -/// @param subscriber The RLMEventDelegate which will subscribe to changes from the server. -- (NSURLSession *)doStreamRequest:(RLMRequest *)request - eventSubscriber:(id)subscriber; - -@end - -/// Transporting protocol for foreign interfaces. Allows for custom -/// request/response handling. -RLM_SWIFT_SENDABLE // is internally thread-safe -@interface RLMNetworkTransport : NSObject - -/** - Sends a request to a given endpoint. - - @param request The request to send. - @param completionBlock A callback invoked on completion of the request. -*/ -- (void)sendRequestToServer:(RLMRequest *) request - completion:(RLMNetworkTransportCompletionBlock)completionBlock; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMObject.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMObject.h deleted file mode 100644 index 9bcfbe310..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMObject.h +++ /dev/null @@ -1,811 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMNotificationToken; -@class RLMObjectSchema; -@class RLMPropertyChange; -@class RLMPropertyDescriptor; -@class RLMRealm; -@class RLMResults; - -/** - `RLMObject` is a base class for model objects representing data stored in Realms. - - Define your model classes by subclassing `RLMObject` and adding properties to be managed. - Then instantiate and use your custom subclasses instead of using the `RLMObject` class directly. - - // Dog.h - @interface Dog : RLMObject - @property NSString *name; - @property BOOL adopted; - @end - - // Dog.m - @implementation Dog - @end //none needed - - ### Supported property types - - - `NSString` - - `NSInteger`, `int`, `long`, `float`, and `double` - - `BOOL` or `bool` - - `NSDate` - - `NSData` - - `NSNumber`, where `X` is one of `RLMInt`, `RLMFloat`, `RLMDouble` or `RLMBool`, for optional number properties - - `RLMObject` subclasses, to model many-to-one relationships. - - `RLMArray`, where `X` is an `RLMObject` subclass, to model many-to-many relationships. - - ### Querying - - You can initiate queries directly via the class methods: `allObjects`, `objectsWhere:`, and `objectsWithPredicate:`. - These methods allow you to easily query a custom subclass for instances of that class in the default Realm. - - To search in a Realm other than the default Realm, use the `allObjectsInRealm:`, `objectsInRealm:where:`, - and `objectsInRealm:withPredicate:` class methods. - - @see `RLMRealm` - - ### Relationships - - See our [Realm Swift Documentation](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/relationships/#relationships) for more details. - - ### Key-Value Observing - - All `RLMObject` properties (including properties you create in subclasses) are - [Key-Value Observing compliant](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/KeyValueObserving/KeyValueObserving.html), - except for `realm` and `objectSchema`. - - Keep the following tips in mind when observing Realm objects: - - 1. Unlike `NSMutableArray` properties, `RLMArray` properties do not require - using the proxy object returned from `-mutableArrayValueForKey:`, or defining - KVC mutation methods on the containing class. You can simply call methods on - the `RLMArray` directly; any changes will be automatically observed by the containing - object. - 2. Unmanaged `RLMObject` instances cannot be added to a Realm while they have any - observed properties. - 3. Modifying managed `RLMObject`s within `-observeValueForKeyPath:ofObject:change:context:` - is not recommended. Properties may change even when the Realm is not in a write - transaction (for example, when `-[RLMRealm refresh]` is called after changes - are made on a different thread), and notifications sent prior to the change - being applied (when `NSKeyValueObservingOptionPrior` is used) may be sent at - times when you *cannot* begin a write transaction. - */ - -@interface RLMObject : RLMObjectBase - -#pragma mark - Creating & Initializing Objects - -/** - Creates an unmanaged instance of a Realm object. - - Call `addObject:` on an `RLMRealm` instance to add an unmanaged object into that Realm. - - @see `[RLMRealm addObject:]` - */ -- (instancetype)init NS_DESIGNATED_INITIALIZER; - - -/** - Creates an unmanaged instance of a Realm object. - - Pass in an `NSArray` or `NSDictionary` instance to set the values of the object's properties. - - Call `addObject:` on an `RLMRealm` instance to add an unmanaged object into that Realm. - - @see `[RLMRealm addObject:]` - */ -- (instancetype)initWithValue:(id)value; - - -/** - Returns the class name for a Realm object subclass. - - @warning Do not override. Realm relies on this method returning the exact class - name. - - @return The class name for the model class. - */ -+ (NSString *)className; - -/** - Creates an instance of a Realm object with a given value, and adds it to the default Realm. - - If nested objects are included in the argument, `createInDefaultRealmWithValue:` will be recursively called - on them. - - The `value` argument can be a key-value coding compliant object, an array or dictionary returned from the methods in - `NSJSONSerialization`, or an array containing one element for each managed property. - - An exception will be thrown if any required properties are not present and those properties - were not defined with default values. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param value The value used to populate the object. - - @see `defaultPropertyValues` - */ -+ (instancetype)createInDefaultRealmWithValue:(id)value; - -/** - Creates an instance of a Realm object with a given value, and adds it to the specified Realm. - - If nested objects are included in the argument, `createInRealm:withValue:` will be recursively called - on them. - - The `value` argument can be a key-value coding compliant object, an array or dictionary returned from the methods in - `NSJSONSerialization`, or an array containing one element for each managed property. - - An exception will be thrown if any required properties are not present and those properties - were not defined with default values. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param realm The Realm which should manage the newly-created object. - @param value The value used to populate the object. - - @see `defaultPropertyValues` - */ -+ (instancetype)createInRealm:(RLMRealm *)realm withValue:(id)value; - -/** - Creates or updates a Realm object within the default Realm. - - This method may only be called on Realm object types with a primary key defined. If there is already - an object with the same primary key value in the default Realm, its values are updated and the object - is returned. Otherwise, this method creates and populates a new instance of the object in the default Realm. - - If nested objects are included in the argument, `createOrUpdateInDefaultRealmWithValue:` will be - recursively called on them if they have primary keys, `createInDefaultRealmWithValue:` if they do not. - - The `value` argument is used to populate the object. It can be a Realm object, a key-value coding - compliant object, an array or dictionary returned from the methods in `NSJSONSerialization`, or an - array containing one element for each managed property. - - If the object is being created, an exception will be thrown if any required properties - are not present and those properties were not defined with default values. - - If the `value` argument is a Realm object already managed by the default Realm, the - argument's type is the same as the receiver, and the objects have identical values for - their managed properties, this method does nothing. - - If the object is being updated, each property defined in its schema will be set by copying from - `value` using key-value coding. If the `value` argument does not respond to `valueForKey:` for a - given property name (or getter name, if defined), that value will remain untouched. - Nullable properties on the object can be set to nil by using `NSNull` as the updated value. - Each property is set even if the existing value is the same as the new value being set, and - notifications will report them all being changed. See `createOrUpdateModifiedInDefaultRealmWithValue:` - for a version of this function which only sets the values which have changed. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param value The value used to populate the object. - - @see `defaultPropertyValues`, `primaryKey` - */ -+ (instancetype)createOrUpdateInDefaultRealmWithValue:(id)value; - -/** - Creates or updates a Realm object within the default Realm. - - This method may only be called on Realm object types with a primary key defined. If there is already - an object with the same primary key value in the default Realm, its values are updated and the object - is returned. Otherwise, this method creates and populates a new instance of the object in the default Realm. - - If nested objects are included in the argument, `createOrUpdateModifiedInDefaultRealmWithValue:` will be - recursively called on them if they have primary keys, `createInDefaultRealmWithValue:` if they do not. - - The `value` argument is used to populate the object. It can be a Realm object, a key-value coding - compliant object, an array or dictionary returned from the methods in `NSJSONSerialization`, or an - array containing one element for each managed property. - - If the object is being created, an exception will be thrown if any required properties - are not present and those properties were not defined with default values. - - If the `value` argument is a Realm object already managed by the default Realm, the - argument's type is the same as the receiver, and the objects have identical values for - their managed properties, this method does nothing. - - If the object is being updated, each property defined in its schema will be set by copying from - `value` using key-value coding. If the `value` argument does not respond to `valueForKey:` for a - given property name (or getter name, if defined), that value will remain untouched. - Nullable properties on the object can be set to nil by using `NSNull` as the updated value. - Unlike `createOrUpdateInDefaultRealmWithValue:`, only properties which have changed in value are - set, and any change notifications produced by this call will report only which properies have - actually changed. - - Checking which properties have changed imposes a small amount of overhead, and so this method - may be slower when all or nearly all of the properties being set have changed. If most or all - of the properties being set have not changed, this method will be much faster than unconditionally - setting all of them, and will also reduce how much data has to be written to the Realm, saving - both i/o time and disk space. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param value The value used to populate the object. - - @see `defaultPropertyValues`, `primaryKey` - */ -+ (instancetype)createOrUpdateModifiedInDefaultRealmWithValue:(id)value; - -/** - Creates or updates an Realm object within a specified Realm. - - This method may only be called on Realm object types with a primary key defined. If there is already - an object with the same primary key value in the given Realm, its values are updated and the object - is returned. Otherwise this method creates and populates a new instance of this object in the given Realm. - - If nested objects are included in the argument, `createOrUpdateInRealm:withValue:` will be - recursively called on them if they have primary keys, `createInRealm:withValue:` if they do not. - - The `value` argument is used to populate the object. It can be a Realm object, a key-value coding - compliant object, an array or dictionary returned from the methods in `NSJSONSerialization`, or an - array containing one element for each managed property. - - If the object is being created, an exception will be thrown if any required properties - are not present and those properties were not defined with default values. - - If the `value` argument is a Realm object already managed by the given Realm, the - argument's type is the same as the receiver, and the objects have identical values for - their managed properties, this method does nothing. - - If the object is being updated, each property defined in its schema will be set by copying from - `value` using key-value coding. If the `value` argument does not respond to `valueForKey:` for a - given property name (or getter name, if defined), that value will remain untouched. - Nullable properties on the object can be set to nil by using `NSNull` as the updated value. - Each property is set even if the existing value is the same as the new value being set, and - notifications will report them all being changed. See `createOrUpdateModifiedInRealm:withValue:` - for a version of this function which only sets the values which have changed. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param realm The Realm which should own the object. - @param value The value used to populate the object. - - @see `defaultPropertyValues`, `primaryKey` - */ -+ (instancetype)createOrUpdateInRealm:(RLMRealm *)realm withValue:(id)value; - -/** - Creates or updates an Realm object within a specified Realm. - - This method may only be called on Realm object types with a primary key defined. If there is already - an object with the same primary key value in the given Realm, its values are updated and the object - is returned. Otherwise this method creates and populates a new instance of this object in the given Realm. - - If nested objects are included in the argument, `createOrUpdateInRealm:withValue:` will be - recursively called on them if they have primary keys, `createInRealm:withValue:` if they do not. - - The `value` argument is used to populate the object. It can be a Realm object, a key-value coding - compliant object, an array or dictionary returned from the methods in `NSJSONSerialization`, or an - array containing one element for each managed property. - - If the object is being created, an exception will be thrown if any required properties - are not present and those properties were not defined with default values. - - If the `value` argument is a Realm object already managed by the given Realm, the - argument's type is the same as the receiver, and the objects have identical values for - their managed properties, this method does nothing. - - If the object is being updated, each property defined in its schema will be set by copying from - `value` using key-value coding. If the `value` argument does not respond to `valueForKey:` for a - given property name (or getter name, if defined), that value will remain untouched. - Nullable properties on the object can be set to nil by using `NSNull` as the updated value. - Unlike `createOrUpdateInRealm:withValue:`, only properties which have changed in value are - set, and any change notifications produced by this call will report only which properies have - actually changed. - - Checking which properties have changed imposes a small amount of overhead, and so this method - may be slower when all or nearly all of the properties being set have changed. If most or all - of the properties being set have not changed, this method will be much faster than unconditionally - setting all of them, and will also reduce how much data has to be written to the Realm, saving - both i/o time and disk space. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param realm The Realm which should own the object. - @param value The value used to populate the object. - - @see `defaultPropertyValues`, `primaryKey` - */ -+ (instancetype)createOrUpdateModifiedInRealm:(RLMRealm *)realm withValue:(id)value; - -#pragma mark - Properties - -/** - The Realm which manages the object, or `nil` if the object is unmanaged. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - The object schema which lists the managed properties for the object. - */ -@property (nonatomic, readonly) RLMObjectSchema *objectSchema; - -/** - Indicates if the object can no longer be accessed because it is now invalid. - - An object can no longer be accessed if the object has been deleted from the Realm that manages it, or - if `invalidate` is called on that Realm. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if this object is frozen. - - @see `-[RLMObject freeze]` - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - - -#pragma mark - Customizing your Objects - -/** - Returns an array of property names for properties which should be indexed. - - Only string, integer, boolean, and `NSDate` properties are supported. - - @return An array of property names. - */ -+ (NSArray *)indexedProperties; - -/** - Override this method to specify the default values to be used for each property. - - @return A dictionary mapping property names to their default values. - */ -+ (nullable NSDictionary *)defaultPropertyValues; - -/** - Override this method to specify the name of a property to be used as the primary key. - - Only properties of types `RLMPropertyTypeString` and `RLMPropertyTypeInt` can be designated as the primary key. - Primary key properties enforce uniqueness for each value whenever the property is set, which incurs minor overhead. - Indexes are created automatically for primary key properties. - - @return The name of the property designated as the primary key. - */ -+ (nullable NSString *)primaryKey; - -/** - Override this method to specify the names of properties to ignore. These properties will not be managed by the Realm - that manages the object. - - @return An array of property names to ignore. - */ -+ (nullable NSArray *)ignoredProperties; - -/** - Override this method to specify the names of properties that are non-optional (i.e. cannot be assigned a `nil` value). - - By default, all properties of a type whose values can be set to `nil` are considered optional properties. - To require that an object in a Realm always store a non-`nil` value for a property, - add the name of the property to the array returned from this method. - - Properties of `RLMObject` type cannot be non-optional. Array and `NSNumber` properties - can be non-optional, but there is no reason to do so: arrays do not support storing nil, and - if you want a non-optional number you should instead use the primitive type. - - @return An array of property names that are required. - */ -+ (NSArray *)requiredProperties; - -/** - Override this method to provide information related to properties containing linking objects. - - Each property of type `RLMLinkingObjects` must have a key in the dictionary returned by this method consisting - of the property name. The corresponding value must be an instance of `RLMPropertyDescriptor` that describes the class - and property that the property is linked to. - - return @{ @"owners": [RLMPropertyDescriptor descriptorWithClass:Owner.class propertyName:@"dogs"] }; - - @return A dictionary mapping property names to `RLMPropertyDescriptor` instances. - */ -+ (NSDictionary *)linkingObjectsProperties; - -#pragma mark - Getting & Querying Objects from the Default Realm - -/** - Returns all objects of this object type from the default Realm. - - @return An `RLMResults` containing all objects of this type in the default Realm. - */ -+ (RLMResults *)allObjects; - -/** - Returns all objects of this object type matching the given predicate from the default Realm. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` containing all objects of this type in the default Realm that match the given predicate. - */ -+ (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -+ (RLMResults<__kindof RLMObject *> *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - - -/** - Returns all objects of this object type matching the given predicate from the default Realm. - - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` containing all objects of this type in the default Realm that match the given predicate. - */ -+ (RLMResults *)objectsWithPredicate:(nullable NSPredicate *)predicate; - -/** - Retrieves the single instance of this object type with the given primary key from the default Realm. - - Returns the object from the default Realm which has the given primary key, or - `nil` if the object does not exist. This is slightly faster than the otherwise - equivalent `[[SubclassName objectsWhere:@"primaryKeyPropertyName = %@", key] firstObject]`. - - This method requires that `primaryKey` be overridden on the receiving subclass. - - @return An object of this object type, or `nil` if an object with the given primary key does not exist. - @see `-primaryKey` - */ -+ (nullable instancetype)objectForPrimaryKey:(nullable id)primaryKey NS_SWIFT_NAME(object(forPrimaryKey:)); - - -#pragma mark - Querying Specific Realms - -/** - Returns all objects of this object type from the specified Realm. - - @param realm The Realm to query. - - @return An `RLMResults` containing all objects of this type in the specified Realm. - */ -+ (RLMResults *)allObjectsInRealm:(RLMRealm *)realm; - -/** - Returns all objects of this object type matching the given predicate from the specified Realm. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - @param realm The Realm to query. - - @return An `RLMResults` containing all objects of this type in the specified Realm that match the given predicate. - */ -+ (RLMResults *)objectsInRealm:(RLMRealm *)realm where:(NSString *)predicateFormat, ...; - -/// :nodoc: -+ (RLMResults<__kindof RLMObject *> *)objectsInRealm:(RLMRealm *)realm where:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all objects of this object type matching the given predicate from the specified Realm. - - @param predicate A predicate to use to filter the elements. - @param realm The Realm to query. - - @return An `RLMResults` containing all objects of this type in the specified Realm that match the given predicate. - */ -+ (RLMResults *)objectsInRealm:(RLMRealm *)realm withPredicate:(nullable NSPredicate *)predicate; - -/** - Retrieves the single instance of this object type with the given primary key from the specified Realm. - - Returns the object from the specified Realm which has the given primary key, or - `nil` if the object does not exist. This is slightly faster than the otherwise - equivalent `[[SubclassName objectsInRealm:realm where:@"primaryKeyPropertyName = %@", key] firstObject]`. - - This method requires that `primaryKey` be overridden on the receiving subclass. - - @return An object of this object type, or `nil` if an object with the given primary key does not exist. - @see `-primaryKey` - */ -+ (nullable instancetype)objectInRealm:(RLMRealm *)realm forPrimaryKey:(nullable id)primaryKey NS_SWIFT_NAME(object(in:forPrimaryKey:)); - -#pragma mark - Notifications - -/** - A callback block for `RLMObject` notifications. - - If the object is deleted from the managing Realm, the block is called with - `deleted` set to `YES` and the other two arguments are `nil`. The block will - never be called again after this. - - If the object is modified, the block will be called with `deleted` set to - `NO`, a `nil` error, and an array of `RLMPropertyChange` objects which - indicate which properties of the objects were modified. - - `error` is always `nil` and will be removed in a future version. - */ -typedef void (^RLMObjectChangeBlock)(BOOL deleted, - NSArray *_Nullable changes, - NSError *_Nullable error); - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When notifications - can't be delivered instantly, multiple notifications may be coalesced into a - single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - - @param block The block to be called whenever a change occurs. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block queue:(dispatch_queue_t)queue; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block keyPaths:(NSArray *)keyPaths queue:(dispatch_queue_t)queue; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block keyPaths:(NSArray *)keyPaths; - - -#pragma mark - Other Instance Methods - -/** - Returns YES if another Realm object instance points to the same object as the receiver in the Realm managing - the receiver. - - For frozen objects and object types with a primary key, `isEqual:` is - overridden to use the same logic as this method (along with a corresponding - implementation for `hash`). Non-frozen objects without primary keys use - pointer identity for `isEqual:` and `hash`. - - @param object The object to compare the receiver to. - - @return Whether the object represents the same object as the receiver. - */ -- (BOOL)isEqualToObject:(RLMObject *)object; - -/** - Returns a frozen (immutable) snapshot of this object. - - The frozen copy is an immutable object which contains the same data as this - object currently contains, but will not update when writes are made to the - containing Realm. Unlike live objects, frozen objects can be accessed from any - thread. - - - warning: Holding onto a frozen object for an extended period while performing write - transaction on the Realm may result in the Realm file growing to large sizes. See - `Realm.Configuration.maximumNumberOfActiveVersions` for more information. - - warning: This method can only be called on a managed object. - */ -- (instancetype)freeze NS_RETURNS_RETAINED; - -/** - Returns a live (mutable) reference of this object. - - This method creates a managed accessor to a live copy of the same frozen object. - Will return self if called on an already live object. - */ -- (instancetype)thaw; - -#pragma mark - Dynamic Accessors - -/// :nodoc: -- (nullable id)objectForKeyedSubscript:(NSString *)key; - -/// :nodoc: -- (void)setObject:(nullable id)obj forKeyedSubscript:(NSString *)key; - -@end - -/** - Information about a specific property which changed in an `RLMObject` change notification. - */ -@interface RLMPropertyChange : NSObject - -/** - The name of the property which changed. - */ -@property (nonatomic, readonly, strong) NSString *name; - -/** - The value of the property before the change occurred. This will always be `nil` - if the change happened on the same thread as the notification and for `RLMArray` - properties. - - For object properties this will give the object which was previously linked to, - but that object will have its new values and not the values it had before the - changes. This means that `previousValue` may be a deleted object, and you will - need to check `invalidated` before accessing any of its properties. - */ -@property (nonatomic, readonly, strong, nullable) id previousValue; - -/** - The value of the property after the change occurred. This will always be `nil` - for `RLMArray` properties. - */ -@property (nonatomic, readonly, strong, nullable) id value; -@end - -#pragma mark - RLMArray Property Declaration - -/** - Properties on `RLMObject`s of type `RLMArray` must have an associated type. A type is associated - with an `RLMArray` property by defining a protocol for the object type that the array should contain. - To define the protocol for an object, you can use the macro RLM_ARRAY_TYPE: - - RLM_ARRAY_TYPE(ObjectType) - ... - @property RLMArray *arrayOfObjectTypes; - */ -#define RLM_ARRAY_TYPE(RLM_OBJECT_SUBCLASS)\ -__attribute__((deprecated("RLM_ARRAY_TYPE has been deprecated. Use RLM_COLLECTION_TYPE instead."))) \ -@protocol RLM_OBJECT_SUBCLASS \ -@end - -/** - Properties on `RLMObject`s of type `RLMSet` / `RLMArray` must have an associated type. A type is associated - with an `RLMSet` / `RLMArray` property by defining a protocol for the object type that the array should contain. - To define the protocol for an object, you can use the macro RLM_COLLECTION_TYPE: - - RLM_COLLECTION_TYPE(ObjectType) - ... - @property RLMSet *setOfObjectTypes; - @property RLMArray *arrayOfObjectTypes; - */ -#define RLM_COLLECTION_TYPE(RLM_OBJECT_SUBCLASS)\ -@protocol RLM_OBJECT_SUBCLASS \ -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMObjectBase.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMObjectBase.h deleted file mode 100644 index 7e9c83c8f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMObjectBase.h +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// :nodoc: -@interface RLMObjectBase : NSObject - -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -- (instancetype)init NS_DESIGNATED_INITIALIZER; - -+ (NSString *)className; - -// Returns whether the class is included in the default set of classes managed by a Realm. -+ (BOOL)shouldIncludeInDefaultSchema; - -+ (nullable NSString *)_realmObjectName; -+ (nullable NSDictionary *)_realmColumnNames; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMObjectBase_Dynamic.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMObjectBase_Dynamic.h deleted file mode 100644 index fb74a5b27..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMObjectBase_Dynamic.h +++ /dev/null @@ -1,82 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectSchema, RLMRealm; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -/** - Returns the Realm that manages the object, if one exists. - - @warning This function is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is - recommended to retrieve the Realm that manages the object via `RLMObject`. - - @param object An `RLMObjectBase` obtained via a Swift `Object` or `RLMObject`. - - @return The Realm which manages this object. Returns `nil `for unmanaged objects. - */ -FOUNDATION_EXTERN RLMRealm * _Nullable RLMObjectBaseRealm(RLMObjectBase * _Nullable object); - -/** - Returns an `RLMObjectSchema` which describes the managed properties of the object. - - @warning This function is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is - recommended to retrieve `objectSchema` via `RLMObject`. - - @param object An `RLMObjectBase` obtained via a Swift `Object` or `RLMObject`. - - @return The object schema which lists the managed properties for the object. - */ -FOUNDATION_EXTERN RLMObjectSchema * _Nullable RLMObjectBaseObjectSchema(RLMObjectBase * _Nullable object); - -/** - Returns the object corresponding to a key value. - - @warning This function is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is - recommended to retrieve key values via `RLMObject`. - - @warning Will throw an `NSUndefinedKeyException` if `key` is not present on the object. - - @param object An `RLMObjectBase` obtained via a Swift `Object` or `RLMObject`. - @param key The name of the property. - - @return The object for the property requested. - */ -FOUNDATION_EXTERN id _Nullable RLMObjectBaseObjectForKeyedSubscript(RLMObjectBase * _Nullable object, NSString *key); - -/** - Sets a value for a key on the object. - - @warning This function is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is - recommended to set key values via `RLMObject`. - - @warning Will throw an `NSUndefinedKeyException` if `key` is not present on the object. - - @param object An `RLMObjectBase` obtained via a Swift `Object` or `RLMObject`. - @param key The name of the property. - @param obj The object to set as the value of the key. - */ -FOUNDATION_EXTERN void RLMObjectBaseSetObjectForKeyedSubscript(RLMObjectBase * _Nullable object, NSString *key, id _Nullable obj); - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMObjectId.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMObjectId.h deleted file mode 100644 index 32ef7b047..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMObjectId.h +++ /dev/null @@ -1,79 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A 12-byte (probably) unique object identifier. - - ObjectIds are similar to a GUID or a UUID, and can be used to uniquely identify - objects without a centralized ID generator. An ObjectID consists of: - - 1. A 4 byte timestamp measuring the creation time of the ObjectId in seconds - since the Unix epoch. - 2. A 5 byte random value - 3. A 3 byte counter, initialized to a random value. - - ObjectIds are intended to be fast to generate. Sorting by an ObjectId field - will typically result in the objects being sorted in creation order. - */ -RLM_SWIFT_SENDABLE // immutable -@interface RLMObjectId : NSObject -/// Creates a new randomly-initialized ObjectId. -+ (nonnull instancetype)objectId NS_SWIFT_NAME(generate()); - -/// Creates a new zero-initialized ObjectId. -- (instancetype)init; - -/// Creates a new ObjectId from the given 24-byte hexadecimal string. -/// -/// Returns `nil` and sets `error` if the string is not 24 characters long or -/// contains any characters other than 0-9a-fA-F. -/// -/// @param string The string to parse. -- (nullable instancetype)initWithString:(NSString *)string - error:(NSError **)error; - -/// Creates a new ObjectId using the given date, machine identifier, process identifier. -/// -/// @param timestamp A timestamp as NSDate. -/// @param machineIdentifier The machine identifier. -/// @param processIdentifier The process identifier. -- (instancetype)initWithTimestamp:(NSDate *)timestamp - machineIdentifier:(int)machineIdentifier - processIdentifier:(int)processIdentifier; - -/// Comparision operator to check if the right hand side is greater than the current value. -- (BOOL)isGreaterThan:(nullable RLMObjectId *)objectId; -/// Comparision operator to check if the right hand side is greater than or equal to the current value. -- (BOOL)isGreaterThanOrEqualTo:(nullable RLMObjectId *)objectId; -/// Comparision operator to check if the right hand side is less than the current value. -- (BOOL)isLessThan:(nullable RLMObjectId *)objectId; -/// Comparision operator to check if the right hand side is less than or equal to the current value. -- (BOOL)isLessThanOrEqualTo:(nullable RLMObjectId *)objectId; - -/// Get the ObjectId as a 24-character hexadecimal string. -@property (nonatomic, readonly) NSString *stringValue; -/// Get the timestamp for the RLMObjectId -@property (nonatomic, readonly) NSDate *timestamp; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMObjectSchema.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMObjectSchema.h deleted file mode 100644 index 9c4666b7c..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMObjectSchema.h +++ /dev/null @@ -1,83 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMProperty; - -/** - This class represents Realm model object schemas. - - When using Realm, `RLMObjectSchema` instances allow performing migrations and - introspecting the database's schema. - - Object schemas map to tables in the core database. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // not actually immutable, but the public API kinda is -@interface RLMObjectSchema : NSObject - -#pragma mark - Properties - -/** - An array of `RLMProperty` instances representing the managed properties of a class described by the schema. - - @see `RLMProperty` - */ -@property (nonatomic, readonly, copy) NSArray *properties; - -/** - The name of the class the schema describes. - */ -@property (nonatomic, readonly) NSString *className; - -/** - The property which serves as the primary key for the class the schema describes, if any. - */ -@property (nonatomic, readonly, nullable) RLMProperty *primaryKeyProperty; - -/** - Whether this object type is embedded. - */ -@property (nonatomic, readonly) BOOL isEmbedded; - -/** - Whether this object is asymmetric. - */ -@property (nonatomic, readonly) BOOL isAsymmetric; - -#pragma mark - Methods - -/** - Retrieves an `RLMProperty` object by the property name. - - @param propertyName The property's name. - - @return An `RLMProperty` object, or `nil` if there is no property with the given name. - */ -- (nullable RLMProperty *)objectForKeyedSubscript:(NSString *)propertyName; - -/** - Returns whether two `RLMObjectSchema` instances are equal. - */ -- (BOOL)isEqualToObjectSchema:(RLMObjectSchema *)objectSchema; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMProperty.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMProperty.h deleted file mode 100644 index 7f2594d3b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMProperty.h +++ /dev/null @@ -1,149 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// :nodoc: -@protocol RLMInt @end -/// :nodoc: -@protocol RLMBool @end -/// :nodoc: -@protocol RLMDouble @end -/// :nodoc: -@protocol RLMFloat @end -/// :nodoc: -@protocol RLMString @end -/// :nodoc: -@protocol RLMDate @end -/// :nodoc: -@protocol RLMData @end -/// :nodoc: -@protocol RLMDecimal128 @end -/// :nodoc: -@protocol RLMObjectId @end -/// :nodoc: -@protocol RLMUUID @end - -/// :nodoc: -@interface NSNumber () -@end - -/** - `RLMProperty` instances represent properties managed by a Realm in the context - of an object schema. Such properties may be persisted to a Realm file or - computed from other data from the Realm. - - When using Realm, `RLMProperty` instances allow performing migrations and - introspecting the database's schema. - - These property instances map to columns in the core database. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // not actually immutable, but the public API kinda is -@interface RLMProperty : NSObject - -#pragma mark - Properties - -/** - The name of the property. - */ -@property (nonatomic, readonly) NSString *name; - -/** - The type of the property. - - @see `RLMPropertyType` - */ -@property (nonatomic, readonly) RLMPropertyType type; - -/** - Indicates whether this property is indexed. - - @see `RLMObject` - */ -@property (nonatomic, readonly) BOOL indexed; - -/** - For `RLMObject` and `RLMCollection` properties, the name of the class of object stored in the property. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - For linking objects properties, the property name of the property the linking objects property is linked to. - */ -@property (nonatomic, readonly, copy, nullable) NSString *linkOriginPropertyName; - -/** - Indicates whether this property is optional. - */ -@property (nonatomic, readonly) BOOL optional; - -/** - Indicates whether this property is an array. - */ -@property (nonatomic, readonly) BOOL array; - -/** - Indicates whether this property is a set. - */ -@property (nonatomic, readonly) BOOL set; - -/** - Indicates whether this property is a dictionary. - */ -@property (nonatomic, readonly) BOOL dictionary; - -/** - Indicates whether this property is an array or set. - */ -@property (nonatomic, readonly) BOOL collection; - -#pragma mark - Methods - -/** - Returns whether a given property object is equal to the receiver. - */ -- (BOOL)isEqualToProperty:(RLMProperty *)property; - -@end - - -/** - An `RLMPropertyDescriptor` instance represents a specific property on a given class. - */ -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMPropertyDescriptor : NSObject - -/** - Creates and returns a property descriptor. - - @param objectClass The class of this property descriptor. - @param propertyName The name of this property descriptor. - */ -+ (instancetype)descriptorWithClass:(Class)objectClass propertyName:(NSString *)propertyName; - -/// The class of the property. -@property (nonatomic, readonly) Class objectClass; - -/// The name of the property. -@property (nonatomic, readonly) NSString *propertyName; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMProviderClient.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMProviderClient.h deleted file mode 100644 index ac649960a..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMProviderClient.h +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMApp; - -/// Base provider client interface. -RLM_SWIFT_SENDABLE -@interface RLMProviderClient : NSObject - -/// The app associated with this provider client. -@property (nonatomic, strong, readonly) RLMApp *app; - -/** - Initialize a provider client with a given app. - @param app The app for this provider client. - */ -- (instancetype)initWithApp:(RLMApp *)app; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMPushClient.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMPushClient.h deleted file mode 100644 index 0628c3ada..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMPushClient.h +++ /dev/null @@ -1,47 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMApp, RLMUser; - -/// A block type used to report an error -RLM_SWIFT_SENDABLE // invoked on a backgroun thread -typedef void(^RLMOptionalErrorBlock)(NSError * _Nullable); - -/// A client which can be used to register devices with the server to receive push notificatons -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMPushClient : NSObject - -/// The push notification service name the device will be registered with on the server -@property (nonatomic, readonly, nonnull) NSString *serviceName; - -/// Request to register device token to the server -- (void)registerDeviceWithToken:(NSString *)token - user:(RLMUser *)user - completion:(RLMOptionalErrorBlock)completion NS_SWIFT_NAME(registerDevice(token:user:completion:)); - -/// Request to deregister a device for a user -- (void)deregisterDeviceForUser:(RLMUser *)user - completion:(RLMOptionalErrorBlock)completion NS_SWIFT_NAME(deregisterDevice(user:completion:)); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMRealm+Sync.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMRealm+Sync.h deleted file mode 100644 index ff20e43c2..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMRealm+Sync.h +++ /dev/null @@ -1,38 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2017 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -@class RLMResults, RLMSyncSession; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -/// -@interface RLMRealm (Sync) - -/** - Get the RLMSyncSession used by this Realm. Will be nil if this is not a - synchronized Realm. -*/ -@property (nonatomic, nullable, readonly) RLMSyncSession *syncSession; - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMRealm.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMRealm.h deleted file mode 100644 index 0935e5301..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMRealm.h +++ /dev/null @@ -1,962 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMRealmConfiguration, RLMRealm, RLMObject, RLMSchema, RLMMigration, RLMNotificationToken, RLMThreadSafeReference, RLMAsyncOpenTask, RLMSyncSubscriptionSet; - -/** - A callback block for opening Realms asynchronously. - - Returns the Realm if the open was successful, or an error otherwise. - */ -typedef void(^RLMAsyncOpenRealmCallback)(RLMRealm * _Nullable realm, NSError * _Nullable error); - -/// The Id of the asynchronous transaction. -typedef unsigned RLMAsyncTransactionId; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - An `RLMRealm` instance (also referred to as "a Realm") represents a Realm - database. - - Realms can either be stored on disk (see `+[RLMRealm realmWithURL:]`) or in - memory (see `RLMRealmConfiguration`). - - `RLMRealm` instances are cached internally, and constructing equivalent `RLMRealm` - objects (for example, by using the same path or identifier) multiple times on a single thread - within a single iteration of the run loop will normally return the same - `RLMRealm` object. - - If you specifically want to ensure an `RLMRealm` instance is - destroyed (for example, if you wish to open a Realm, check some property, and - then possibly delete the Realm file and re-open it), place the code which uses - the Realm within an `@autoreleasepool {}` and ensure you have no other - strong references to it. - - @warning Non-frozen `RLMRealm` instances are thread-confined and cannot be - shared across threads or dispatch queues. Trying to do so will cause an - exception to be thrown. You must call this method on each thread you want to - interact with the Realm on. For dispatch queues, this means that you must call - it in each block which is dispatched, as a queue is not guaranteed to run all - of its blocks on the same thread. - */ - -@interface RLMRealm : NSObject - -#pragma mark - Creating & Initializing a Realm - -/** - Obtains an instance of the default Realm. - - The default Realm is used by the `RLMObject` class methods - which do not take an `RLMRealm` parameter, but is otherwise not special. The - default Realm is persisted as *default.realm* under the *Documents* directory of - your Application on iOS, in your application's *Application Support* - directory on macOS, and in the *Cache* directory on tvOS. - - The default Realm is created using the default `RLMRealmConfiguration`, which - can be changed via `+[RLMRealmConfiguration setDefaultConfiguration:]`. - - @return The default `RLMRealm` instance for the current thread. - */ -+ (instancetype)defaultRealm; - -/** - Obtains an instance of the default Realm bound to the given queue. - - Rather than being confined to the thread they are opened on, queue-bound - RLMRealms are confined to the given queue. They can be accessed from any - thread as long as it is from within a block dispatch to the queue, and - notifications will be delivered to the queue instead of a thread's run loop. - - Realms can only be confined to a serial queue. Queue-confined RLMRealm - instances can be obtained when not on that queue, but attempting to do - anything with that instance without first dispatching to the queue will throw - an incorrect thread exception. - - The default Realm is created using the default `RLMRealmConfiguration`, which - can be changed via `+[RLMRealmConfiguration setDefaultConfiguration:]`. - - @param queue A serial dispatch queue to confine the Realm to. - @return The default `RLMRealm` instance for the given queue. - */ -+ (instancetype)defaultRealmForQueue:(dispatch_queue_t)queue; - -/** - Obtains an `RLMRealm` instance with the given configuration. - - @param configuration A configuration object to use when creating the Realm. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return An `RLMRealm` instance. - */ -+ (nullable instancetype)realmWithConfiguration:(RLMRealmConfiguration *)configuration error:(NSError **)error; - -/** - Obtains an `RLMRealm` instance with the given configuration bound to the given queue. - - Rather than being confined to the thread they are opened on, queue-bound - RLMRealms are confined to the given queue. They can be accessed from any - thread as long as it is from within a block dispatch to the queue, and - notifications will be delivered to the queue instead of a thread's run loop. - - Realms can only be confined to a serial queue. Queue-confined RLMRealm - instances can be obtained when not on that queue, but attempting to do - anything with that instance without first dispatching to the queue will throw - an incorrect thread exception. - - @param configuration A configuration object to use when creating the Realm. - @param queue A serial dispatch queue to confine the Realm to. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return An `RLMRealm` instance. - */ -+ (nullable instancetype)realmWithConfiguration:(RLMRealmConfiguration *)configuration - queue:(nullable dispatch_queue_t)queue - error:(NSError **)error; - -/** - Obtains an `RLMRealm` instance persisted at a specified file URL. - - @param fileURL The local URL of the file the Realm should be saved at. - - @return An `RLMRealm` instance. - */ -+ (instancetype)realmWithURL:(NSURL *)fileURL; - -/** - Asynchronously open a Realm and deliver it to a block on the given queue. - - Opening a Realm asynchronously will perform all work needed to get the Realm to - a usable state (such as running potentially time-consuming migrations) on a - background thread before dispatching to the given queue. In addition, - synchronized Realms wait for all remote content available at the time the - operation began to be downloaded and available locally. - - The Realm passed to the callback function is confined to the callback queue as - if `-[RLMRealm realmWithConfiguration:queue:error]` was used. - - @param configuration A configuration object to use when opening the Realm. - @param callbackQueue The serial dispatch queue on which the callback should be run. - @param callback A callback block. If the Realm was successfully opened, - it will be passed in as an argument. - Otherwise, an `NSError` describing what went wrong will be - passed to the block instead. - */ -+ (RLMAsyncOpenTask *)asyncOpenWithConfiguration:(RLMRealmConfiguration *)configuration - callbackQueue:(dispatch_queue_t)callbackQueue - callback:(RLMAsyncOpenRealmCallback)callback; - -/** - The `RLMSchema` used by the Realm. - */ -@property (nonatomic, readonly) RLMSchema *schema; - -/** - Indicates if the Realm is currently engaged in a write transaction. - - @warning Do not simply check this property and then start a write transaction whenever an object needs to be - created, updated, or removed. Doing so might cause a large number of write transactions to be created, - degrading performance. Instead, always prefer performing multiple updates during a single transaction. - */ -@property (nonatomic, readonly) BOOL inWriteTransaction; - -/** - The `RLMRealmConfiguration` object that was used to create this `RLMRealm` instance. - */ -@property (nonatomic, readonly) RLMRealmConfiguration *configuration; - -/** - Indicates if this Realm contains any objects. - */ -@property (nonatomic, readonly) BOOL isEmpty; - -/** - Indicates if this Realm is frozen. - - @see `-[RLMRealm freeze]` - */ -@property (nonatomic, readonly, getter=isFrozen) BOOL frozen; - -/** - Returns a frozen (immutable) snapshot of this Realm. - - A frozen Realm is an immutable snapshot view of a particular version of a - Realm's data. Unlike normal RLMRealm instances, it does not live-update to - reflect writes made to the Realm, and can be accessed from any thread. Writing - to a frozen Realm is not allowed, and attempting to begin a write transaction - will throw an exception. - - All objects and collections read from a frozen Realm will also be frozen. - */ -- (RLMRealm *)freeze NS_RETURNS_RETAINED; - -/** - Returns a live reference of this Realm. - - All objects and collections read from the returned Realm will no longer be frozen. - This method will return `self` if it is not already frozen. - */ -- (RLMRealm *)thaw; - -#pragma mark - File Management - -/** - Writes a compacted and optionally encrypted copy of the Realm to the given local URL. - - The destination file cannot already exist. - - Note that if this method is called from within a write transaction, the - *current* data is written, not the data from the point when the previous write - transaction was committed. - - @param fileURL Local URL to save the Realm to. - @param key Optional 64-byte encryption key to encrypt the new file with. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return `YES` if the Realm was successfully written to disk, `NO` if an error occurred. - */ -- (BOOL)writeCopyToURL:(NSURL *)fileURL encryptionKey:(nullable NSData *)key error:(NSError **)error; - -/** - Writes a copy of the Realm to a given location specified by a given configuration. - - If the configuration supplied is derived from a `RLMUser` then this Realm will be copied with - sync functionality enabled. - - The destination file cannot already exist. - - @param configuration A Realm Configuration. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return `YES` if the Realm was successfully written to disk, `NO` if an error occurred. - */ -- (BOOL)writeCopyForConfiguration:(RLMRealmConfiguration *)configuration error:(NSError **)error; - -/** - Checks if the Realm file for the given configuration exists locally on disk. - - For non-synchronized, non-in-memory Realms, this is equivalent to - `-[NSFileManager.defaultManager fileExistsAtPath:config.path]`. For - synchronized Realms, it takes care of computing the actual path on disk based - on the server, virtual path, and user as is done when opening the Realm. - - @param config A Realm configuration to check the existence of. - @return YES if the Realm file for the given configuration exists on disk, NO otherwise. - */ -+ (BOOL)fileExistsForConfiguration:(RLMRealmConfiguration *)config; - -/** - Deletes the local Realm file and associated temporary files for the given configuration. - - This deletes the ".realm", ".note" and ".management" files which would be - created by opening the Realm with the given configuration. It does not delete - the ".lock" file (which contains no persisted data and is recreated from - scratch every time the Realm file is opened). - - The Realm must not be currently open on any thread or in another process. If - it is, this will return NO and report the error RLMErrorAlreadyOpen. Attempting to open - the Realm on another thread while the deletion is happening will block (and - then create a new Realm and open that afterwards). - - If the Realm already does not exist this will return `NO` and report the error NSFileNoSuchFileError; - - @param config A Realm configuration identifying the Realm to be deleted. - @return YES if any files were deleted, NO otherwise. - */ -+ (BOOL)deleteFilesForConfiguration:(RLMRealmConfiguration *)config error:(NSError **)error - __attribute__((swift_error(nonnull_error))); - -#pragma mark - Notifications - -/** - The type of a block to run whenever the data within the Realm is modified. - - @see `-[RLMRealm addNotificationBlock:]` - */ -typedef void (^RLMNotificationBlock)(RLMNotification notification, RLMRealm *realm); - -#pragma mark - Receiving Notification when a Realm Changes - -/** - Adds a notification handler for changes in this Realm, and returns a notification token. - - Notification handlers are called after each write transaction is committed, - either on the current thread or other threads. - - Handler blocks are called on the same thread that they were added on, and may - only be added on threads which are currently within a run loop. Unless you are - specifically creating and running a run loop on a background thread, this will - normally only be the main thread. - - The block has the following definition: - - typedef void(^RLMNotificationBlock)(RLMNotification notification, RLMRealm *realm); - - It receives the following parameters: - - - `NSString` \***notification**: The name of the incoming notification. See - `RLMRealmNotification` for information on what - notifications are sent. - - `RLMRealm` \***realm**: The Realm for which this notification occurred. - - @param block A block which is called to process Realm notifications. - - @return A token object which must be retained as long as you wish to continue - receiving change notifications. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMNotificationBlock)block __attribute__((warn_unused_result)); - -#pragma mark - Writing to a Realm - -/** - Begins a write transaction on the Realm. - - Only one write transaction can be open at a time for each Realm file. Write - transactions cannot be nested, and trying to begin a write transaction on a - Realm which is already in a write transaction will throw an exception. Calls to - `beginWriteTransaction` from `RLMRealm` instances for the same Realm file in - other threads or other processes will block until the current write transaction - completes or is cancelled. - - Before beginning the write transaction, `beginWriteTransaction` updates the - `RLMRealm` instance to the latest Realm version, as if `refresh` had been - called, and generates notifications if applicable. This has no effect if the - Realm was already up to date. - - It is rarely a good idea to have write transactions span multiple cycles of - the run loop, but if you do wish to do so you will need to ensure that the - Realm participating in the write transaction is kept alive until the write - transaction is committed. - */ -- (void)beginWriteTransaction; - -/** - Commits all write operations in the current write transaction, and ends the - transaction. - - After saving the changes, all notification blocks registered on this specific - `RLMRealm` instance are invoked synchronously. Notification blocks registered - on other threads or on collections are invoked asynchronously. If you do not - want to receive a specific notification for this write tranaction, see - `commitWriteTransactionWithoutNotifying:error:`. - - This method can fail if there is insufficient disk space available to save the - writes made, or due to unexpected i/o errors. This version of the method throws - an exception when errors occur. Use the version with a `NSError` out parameter - instead if you wish to handle errors. - - @warning This method may only be called during a write transaction. - */ -- (void)commitWriteTransaction NS_SWIFT_UNAVAILABLE(""); - -/** - Commits all write operations in the current write transaction, and ends the - transaction. - - After saving the changes, all notification blocks registered on this specific - `RLMRealm` instance are invoked synchronously. Notification blocks registered - on other threads or on collections are invoked asynchronously. If you do not - want to receive a specific notification for this write tranaction, see - `commitWriteTransactionWithoutNotifying:error:`. - - This method can fail if there is insufficient disk space available to save the - writes made, or due to unexpected i/o errors. - - @warning This method may only be called during a write transaction. - - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return Whether the transaction succeeded. - */ -- (BOOL)commitWriteTransaction:(NSError **)error; - -/** - Commits all write operations in the current write transaction, without - notifying specific notification blocks of the changes. - - After saving the changes, all notification blocks registered on this specific - `RLMRealm` instance are invoked synchronously. Notification blocks registered - on other threads or on collections are scheduled to be invoked asynchronously. - - You can skip notifiying specific notification blocks about the changes made - in this write transaction by passing in their associated notification tokens. - This is primarily useful when the write transaction is saving changes already - made in the UI and you do not want to have the notification block attempt to - re-apply the same changes. - - The tokens passed to this method must be for notifications for this specific - `RLMRealm` instance. Notifications for different threads cannot be skipped - using this method. - - This method can fail if there is insufficient disk space available to save the - writes made, or due to unexpected i/o errors. - - @warning This method may only be called during a write transaction. - - @param tokens An array of notification tokens which were returned from adding - callbacks which you do not want to be notified for the changes - made in this write transaction. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return Whether the transaction succeeded. - */ -- (BOOL)commitWriteTransactionWithoutNotifying:(NSArray *)tokens error:(NSError **)error; - -/** - Reverts all writes made during the current write transaction and ends the transaction. - - This rolls back all objects in the Realm to the state they were in at the - beginning of the write transaction, and then ends the transaction. - - This restores the data for deleted objects, but does not revive invalidated - object instances. Any `RLMObject`s which were added to the Realm will be - invalidated rather than becoming unmanaged. - Given the following code: - - ObjectType *oldObject = [[ObjectType objectsWhere:@"..."] firstObject]; - ObjectType *newObject = [[ObjectType alloc] init]; - - [realm beginWriteTransaction]; - [realm addObject:newObject]; - [realm deleteObject:oldObject]; - [realm cancelWriteTransaction]; - - Both `oldObject` and `newObject` will return `YES` for `isInvalidated`, - but re-running the query which provided `oldObject` will once again return - the valid object. - - KVO observers on any objects which were modified during the transaction will - be notified about the change back to their initial values, but no other - notifications are produced by a cancelled write transaction. - - @warning This method may only be called during a write transaction. - */ -- (void)cancelWriteTransaction; - -/** - Performs actions contained within the given block inside a write transaction. - - @see `[RLMRealm transactionWithoutNotifying:block:error:]` - */ -- (void)transactionWithBlock:(__attribute__((noescape)) void(^)(void))block NS_SWIFT_UNAVAILABLE(""); - -/** - Performs actions contained within the given block inside a write transaction. - - @see `[RLMRealm transactionWithoutNotifying:block:error:]` - */ -- (BOOL)transactionWithBlock:(__attribute__((noescape)) void(^)(void))block error:(NSError **)error; - -/** - Performs actions contained within the given block inside a write transaction. - - @see `[RLMRealm transactionWithoutNotifying:block:error:]` - */ -- (void)transactionWithoutNotifying:(NSArray *)tokens block:(__attribute__((noescape)) void(^)(void))block; - -/** - Performs actions contained within the given block inside a write transaction. - - Write transactions cannot be nested, and trying to execute a write transaction - on a Realm which is already participating in a write transaction will throw an - exception. Calls to `transactionWithBlock:` from `RLMRealm` instances in other - threads will block until the current write transaction completes. - - Before beginning the write transaction, `transactionWithBlock:` updates the - `RLMRealm` instance to the latest Realm version, as if `refresh` had been called, and - generates notifications if applicable. This has no effect if the Realm - was already up to date. - - You can skip notifiying specific notification blocks about the changes made - in this write transaction by passing in their associated notification tokens. - This is primarily useful when the write transaction is saving changes already - made in the UI and you do not want to have the notification block attempt to - re-apply the same changes. - - The tokens passed to this method must be for notifications for this specific - `RLMRealm` instance. Notifications for different threads cannot be skipped - using this method. - - @param tokens An array of notification tokens which were returned from adding - callbacks which you do not want to be notified for the changes - made in this write transaction. - @param block The block containing actions to perform. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return Whether the transaction succeeded. - */ -- (BOOL)transactionWithoutNotifying:(NSArray *)tokens block:(__attribute__((noescape)) void(^)(void))block error:(NSError **)error; - -/** - Indicates if the Realm is currently performing async write operations. - This becomes YES following a call to `beginAsyncWriteTransaction`, - `commitAsyncWriteTransaction`, or `asyncTransactionWithBlock:`, and remains so - until all scheduled async write work has completed. - - @warning If this is `YES`, closing or invalidating the Realm will block until scheduled work has completed. - */ -@property (nonatomic, readonly) BOOL isPerformingAsynchronousWriteOperations; - -/** - Begins an asynchronous write transaction. - This function asynchronously begins a write transaction on a background - thread, and then invokes the block on the original thread or queue once the - transaction has begun. Unlike `beginWriteTransaction`, this does not block the - calling thread if another thread is current inside a write transaction, and - will always return immediately. - Multiple calls to this function (or the other functions which perform - asynchronous write transactions) will queue the blocks to be called in the - same order as they were queued. This includes calls from inside a write - transaction block, which unlike with synchronous transactions are allowed. - - @param block The block containing actions to perform inside the write transaction. - `block` should end by calling `commitAsyncWriteTransaction`, - `commitWriteTransaction` or `cancelWriteTransaction`. - Returning without one of these calls is equivalent to calling `cancelWriteTransaction`. - - @return An id identifying the asynchronous transaction which can be passed to - `cancelAsyncTransaction:` prior to the block being called to cancel - the pending invocation of the block. - */ -- (RLMAsyncTransactionId)beginAsyncWriteTransaction:(void(^)(void))block; - -/** - Asynchronously commits a write transaction. - The call returns immediately allowing the caller to proceed while the I/O is - performed on a dedicated background thread. This can be used regardless of if - the write transaction was begun with `beginWriteTransaction` or - `beginAsyncWriteTransaction`. - - @param completionBlock A block which will be called on the source thread or - queue once the commit has either completed or failed - with an error. - - @param allowGrouping If `YES`, multiple sequential calls to - `commitAsyncWriteTransaction:` may be batched together - and persisted to stable storage in one group. This - improves write performance, particularly when the - individual transactions being batched are small. In the - event of a crash or power failure, either all of the - grouped transactions will be lost or none will, rather - than the usual guarantee that data has been persisted as - soon as a call to commit has returned. - - @return An id identifying the asynchronous transaction commit can be passed to - `cancelAsyncTransaction:` prior to the completion block being called - to cancel the pending invocation of the block. Note that this does - *not* cancel the commit itself. -*/ -- (RLMAsyncTransactionId)commitAsyncWriteTransaction:(nullable void(^)(NSError *_Nullable))completionBlock - allowGrouping:(BOOL)allowGrouping; - -/** - Asynchronously commits a write transaction. - The call returns immediately allowing the caller to proceed while the I/O is - performed on a dedicated background thread. This can be used regardless of if - the write transaction was begun with `beginWriteTransaction` or - `beginAsyncWriteTransaction`. - - @param completionBlock A block which will be called on the source thread or - queue once the commit has either completed or failed - with an error. - - @return An id identifying the asynchronous transaction commit can be passed to - `cancelAsyncTransaction:` prior to the completion block being called - to cancel the pending invocation of the block. Note that this does - *not* cancel the commit itself. -*/ -- (RLMAsyncTransactionId)commitAsyncWriteTransaction:(void(^)(NSError *_Nullable))completionBlock; - -/** - Asynchronously commits a write transaction. - The call returns immediately allowing the caller to proceed while the I/O is - performed on a dedicated background thread. This can be used regardless of if - the write transaction was begun with `beginWriteTransaction` or - `beginAsyncWriteTransaction`. - - @return An id identifying the asynchronous transaction commit can be passed to - `cancelAsyncTransaction:` prior to the completion block being called - to cancel the pending invocation of the block. Note that this does - *not* cancel the commit itself. -*/ -- (RLMAsyncTransactionId)commitAsyncWriteTransaction; - -/** - Cancels a queued block for an asynchronous transaction. - This can cancel a block passed to either an asynchronous begin or an - asynchronous commit. Canceling a begin cancels that transaction entirely, - while canceling a commit merely cancels the invocation of the completion - callback, and the commit will still happen. - Transactions can only be canceled before the block is invoked, and calling - `cancelAsyncTransaction:` from within the block is a no-op. - - @param asyncTransactionId A transaction id from either `beginAsyncWriteTransaction:` or `commitAsyncWriteTransaction:`. -*/ -- (void)cancelAsyncTransaction:(RLMAsyncTransactionId)asyncTransactionId; - -/** - Asynchronously performs actions contained within the given block inside a - write transaction. - The write transaction is begun asynchronously as if calling - `beginAsyncWriteTransaction:`, and by default the transaction is commited - asynchronously after the block completes. You can also explicitly call - `commitWriteTransaction` or `cancelWriteTransaction` from within the block to - synchronously commit or cancel the write transaction. - - @param block The block containing actions to perform. - - @param completionBlock A block which will be called on the source thread or - queue once the commit has either completed or failed - with an error. - - @return An id identifying the asynchronous transaction which can be passed to - `cancelAsyncTransaction:` prior to the block being called to cancel - the pending invocation of the block. -*/ -- (RLMAsyncTransactionId)asyncTransactionWithBlock:(void(^)(void))block onComplete:(nullable void(^)(NSError *))completionBlock; - -/** - Asynchronously performs actions contained within the given block inside a - write transaction. - The write transaction is begun asynchronously as if calling - `beginAsyncWriteTransaction:`, and by default the transaction is commited - asynchronously after the block completes. You can also explicitly call - `commitWriteTransaction` or `cancelWriteTransaction` from within the block to - synchronously commit or cancel the write transaction. - - @param block The block containing actions to perform. - - @return An id identifying the asynchronous transaction which can be passed to - `cancelAsyncTransaction:` prior to the block being called to cancel - the pending invocation of the block. -*/ -- (RLMAsyncTransactionId)asyncTransactionWithBlock:(void(^)(void))block; - -/** - Updates the Realm and outstanding objects managed by the Realm to point to the - most recent data. - - If the version of the Realm is actually changed, Realm and collection - notifications will be sent to reflect the changes. This may take some time, as - collection notifications are prepared on a background thread. As a result, - calling this method on the main thread is not advisable. - - @return Whether there were any updates for the Realm. Note that `YES` may be - returned even if no data actually changed. - */ -- (BOOL)refresh; - -/** - Set this property to `YES` to automatically update this Realm when changes - happen in other threads. - - If set to `YES` (the default), changes made on other threads will be reflected - in this Realm on the next cycle of the run loop after the changes are - committed. If set to `NO`, you must manually call `-refresh` on the Realm to - update it to get the latest data. - - Note that by default, background threads do not have an active run loop and you - will need to manually call `-refresh` in order to update to the latest version, - even if `autorefresh` is set to `YES`. - - Even with this property enabled, you can still call `-refresh` at any time to - update the Realm before the automatic refresh would occur. - - Write transactions will still always advance a Realm to the latest version and - produce local notifications on commit even if autorefresh is disabled. - - Disabling `autorefresh` on a Realm without any strong references to it will not - have any effect, and `autorefresh` will revert back to `YES` the next time the - Realm is created. This is normally irrelevant as it means that there is nothing - to refresh (as managed `RLMObject`s, `RLMArray`s, and `RLMResults` have strong - references to the Realm that manages them), but it means that setting - `RLMRealm.defaultRealm.autorefresh = NO` in - `application:didFinishLaunchingWithOptions:` and only later storing Realm - objects will not work. - - Defaults to `YES`. - */ -@property (nonatomic) BOOL autorefresh; - -/** - Invalidates all `RLMObject`s, `RLMResults`, `RLMLinkingObjects`, and `RLMArray`s managed by the Realm. - - A Realm holds a read lock on the version of the data accessed by it, so - that changes made to the Realm on different threads do not modify or delete the - data seen by this Realm. Calling this method releases the read lock, - allowing the space used on disk to be reused by later write transactions rather - than growing the file. This method should be called before performing long - blocking operations on a background thread on which you previously read data - from the Realm which you no longer need. - - All `RLMObject`, `RLMResults` and `RLMArray` instances obtained from this - `RLMRealm` instance on the current thread are invalidated. `RLMObject`s and `RLMArray`s - cannot be used. `RLMResults` will become empty. The Realm itself remains valid, - and a new read transaction is implicitly begun the next time data is read from the Realm. - - Calling this method multiple times in a row without reading any data from the - Realm, or before ever reading any data from the Realm, is a no-op. - */ -- (void)invalidate; - -#pragma mark - Accessing Objects - -/** - Returns the same object as the one referenced when the `RLMThreadSafeReference` was first created, - but resolved for the current Realm for this thread. Returns `nil` if this object was deleted after - the reference was created. - - @param reference The thread-safe reference to the thread-confined object to resolve in this Realm. - - @warning A `RLMThreadSafeReference` object must be resolved at most once. - Failing to resolve a `RLMThreadSafeReference` will result in the source version of the - Realm being pinned until the reference is deallocated. - An exception will be thrown if a reference is resolved more than once. - - @warning Cannot call within a write transaction. - - @note Will refresh this Realm if the source Realm was at a later version than this one. - - @see `+[RLMThreadSafeReference referenceWithThreadConfined:]` - */ -- (nullable id)resolveThreadSafeReference:(RLMThreadSafeReference *)reference -NS_REFINED_FOR_SWIFT; - -#pragma mark - Adding and Removing Objects from a Realm - -/** - Adds an object to the Realm. - - Once added, this object is considered to be managed by the Realm. It can be retrieved - using the `objectsWhere:` selectors on `RLMRealm` and on subclasses of `RLMObject`. - - When added, all child relationships referenced by this object will also be added to - the Realm if they are not already in it. - - If the object or any related objects are already being managed by a different Realm - an exception will be thrown. Use `-[RLMObject createInRealm:withObject:]` to insert a copy of a managed object - into a different Realm. - - The object to be added must be valid and cannot have been previously deleted - from a Realm (i.e. `isInvalidated` must be `NO`). - - @warning This method may only be called during a write transaction. - - @param object The object to be added to this Realm. - */ -- (void)addObject:(RLMObject *)object; - -/** - Adds all the objects in a collection to the Realm. - - This is the equivalent of calling `addObject:` for every object in a collection. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable collection such as `NSArray`, `RLMArray`, or `RLMResults`, - containing Realm objects to be added to the Realm. - - @see `addObject:` - */ -- (void)addObjects:(id)objects; - -/** - Adds or updates an existing object into the Realm. - - The object provided must have a designated primary key. If no objects exist in the Realm - with the same primary key value, the object is inserted. Otherwise, the existing object is - updated with any changed values. - - As with `addObject:`, the object cannot already be managed by a different - Realm. Use `-[RLMObject createOrUpdateInRealm:withValue:]` to copy values to - a different Realm. - - If there is a property or KVC value on `object` whose value is nil, and it corresponds - to a nullable property on an existing object being updated, that nullable property will - be set to nil. - - @warning This method may only be called during a write transaction. - - @param object The object to be added or updated. - */ -- (void)addOrUpdateObject:(RLMObject *)object; - -/** - Adds or updates all the objects in a collection into the Realm. - - This is the equivalent of calling `addOrUpdateObject:` for every object in a collection. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable collection such as `NSArray`, `RLMArray`, or `RLMResults`, - containing Realm objects to be added to or updated within the Realm. - - @see `addOrUpdateObject:` - */ -- (void)addOrUpdateObjects:(id)objects; - -/** - Deletes an object from the Realm. Once the object is deleted it is considered invalidated. - - @warning This method may only be called during a write transaction. - - @param object The object to be deleted. - */ -- (void)deleteObject:(RLMObject *)object; - -/** - Deletes one or more objects from the Realm. - - This is the equivalent of calling `deleteObject:` for every object in a collection. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable collection such as `NSArray`, `RLMArray`, or `RLMResults`, - containing objects to be deleted from the Realm. - - @see `deleteObject:` - */ -- (void)deleteObjects:(id)objects; - -/** - Deletes all objects from the Realm. - - @warning This method may only be called during a write transaction. - - @see `deleteObject:` - */ -- (void)deleteAllObjects; - -#pragma mark - Sync Subscriptions - -/** - Represents the active subscriptions for this realm, which can be used to add/remove/update - and search flexible sync subscriptions. - Getting the subscriptions from a local or partition-based configured realm will thrown an exception. - - @warning This feature is currently in beta and its API is subject to change. - */ -@property (nonatomic, readonly, nonnull) RLMSyncSubscriptionSet *subscriptions; - - -#pragma mark - Migrations - -/** - The type of a migration block used to migrate a Realm. - - @param migration A `RLMMigration` object used to perform the migration. The - migration object allows you to enumerate and alter any - existing objects which require migration. - - @param oldSchemaVersion The schema version of the Realm being migrated. - */ -RLM_SWIFT_SENDABLE -typedef void (^RLMMigrationBlock)(RLMMigration *migration, uint64_t oldSchemaVersion); - -/** - Returns the schema version for a Realm at a given local URL. - - @param fileURL Local URL to a Realm file. - @param key 64-byte key used to encrypt the file, or `nil` if it is unencrypted. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return The version of the Realm at `fileURL`, or `RLMNotVersioned` if the version cannot be read. - */ -+ (uint64_t)schemaVersionAtURL:(NSURL *)fileURL encryptionKey:(nullable NSData *)key - error:(NSError **)error -NS_REFINED_FOR_SWIFT; - -/** - Performs the given Realm configuration's migration block on a Realm at the given path. - - This method is called automatically when opening a Realm for the first time and does - not need to be called explicitly. You can choose to call this method to control - exactly when and how migrations are performed. - - @param configuration The Realm configuration used to open and migrate the Realm. - @return The error that occurred while applying the migration, if any. - - @see RLMMigration - */ -+ (BOOL)performMigrationForConfiguration:(RLMRealmConfiguration *)configuration error:(NSError **)error; - -#pragma mark - Unavailable Methods - -/** - RLMRealm instances are cached internally by Realm and cannot be created directly. - - Use `+[RLMRealm defaultRealm]`, `+[RLMRealm realmWithConfiguration:error:]` or - `+[RLMRealm realmWithURL]` to obtain a reference to an RLMRealm. - */ -- (instancetype)init __attribute__((unavailable("Use +defaultRealm, +realmWithConfiguration: or +realmWithURL:."))); - -/** - RLMRealm instances are cached internally by Realm and cannot be created directly. - - Use `+[RLMRealm defaultRealm]`, `+[RLMRealm realmWithConfiguration:error:]` or - `+[RLMRealm realmWithURL]` to obtain a reference to an RLMRealm. - */ -+ (instancetype)new __attribute__((unavailable("Use +defaultRealm, +realmWithConfiguration: or +realmWithURL:."))); - -/// :nodoc: -- (void)addOrUpdateObjectsFromArray:(id)array __attribute__((unavailable("Renamed to -addOrUpdateObjects:."))); - -@end - -// MARK: - RLMNotificationToken - -/** - A token which is returned from methods which subscribe to changes to a Realm. - - Change subscriptions in Realm return an `RLMNotificationToken` instance, - which can be used to unsubscribe from the changes. You must store a strong - reference to the token for as long as you want to continue to receive notifications. - When you wish to stop, call the `-invalidate` method. Notifications are also stopped if - the token is deallocated. - */ -RLM_SWIFT_SENDABLE // is internally thread-safe -@interface RLMNotificationToken : NSObject -/// Stops notifications for the change subscription that returned this token. -/// -/// @return True if the token was previously valid, and false if it was already invalidated. -- (bool)invalidate; - -/// Stops notifications for the change subscription that returned this token. -- (void)stop __attribute__((unavailable("Renamed to -invalidate."))) NS_REFINED_FOR_SWIFT; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMRealmConfiguration.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMRealmConfiguration.h deleted file mode 100644 index d09e5c215..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMRealmConfiguration.h +++ /dev/null @@ -1,197 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2015 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMEventConfiguration, RLMSyncConfiguration; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A block called when opening a Realm for the first time during the life - of a process to determine if it should be compacted before being returned - to the user. It is passed the total file size (data + free space) and the total - bytes used by data in the file. - - Return `YES` to indicate that an attempt to compact the file should be made. - The compaction will be skipped if another process is accessing it. - */ -RLM_SWIFT_SENDABLE -typedef BOOL (^RLMShouldCompactOnLaunchBlock)(NSUInteger totalBytes, NSUInteger bytesUsed); - -/** - A block which receives a subscription set instance, that can be used to add an initial set of subscriptions which will be executed - when the Realm is first opened. - */ -RLM_SWIFT_SENDABLE -typedef void(^RLMFlexibleSyncInitialSubscriptionsBlock)(RLMSyncSubscriptionSet * _Nonnull subscriptions); - -/** - An `RLMRealmConfiguration` instance describes the different options used to - create an instance of a Realm. - - `RLMRealmConfiguration` instances are just plain `NSObject`s. Unlike `RLMRealm`s - and `RLMObject`s, they can be freely shared between threads as long as you do not - mutate them. - - Creating configuration objects for class subsets (by setting the - `objectClasses` property) can be expensive. Because of this, you will normally want to - cache and reuse a single configuration object for each distinct configuration rather than - creating a new object each time you open a Realm. - */ -@interface RLMRealmConfiguration : NSObject - -#pragma mark - Default Configuration - -/** - Returns the default configuration used to create Realms when no other - configuration is explicitly specified (i.e. `+[RLMRealm defaultRealm]`). - - @return The default Realm configuration. - */ -+ (instancetype)defaultConfiguration; - -/** - Sets the default configuration to the given `RLMRealmConfiguration`. - - @param configuration The new default Realm configuration. - */ -+ (void)setDefaultConfiguration:(RLMRealmConfiguration *)configuration; - -#pragma mark - Properties - -/// The local URL of the Realm file. Mutually exclusive with `inMemoryIdentifier`; -/// setting one of the two properties will automatically nil out the other. -@property (nonatomic, copy, nullable) NSURL *fileURL; - -/// A string used to identify a particular in-memory Realm. Mutually exclusive with `fileURL`, -/// `seedFilePath`and `syncConfiguration`; -/// setting any one of the three properties will automatically nil out the other two. -@property (nonatomic, copy, nullable) NSString *inMemoryIdentifier; - -/// A 64-byte key to use to encrypt the data, or `nil` if encryption is not enabled. -@property (nonatomic, copy, nullable) NSData *encryptionKey; - -/// Whether to open the Realm in read-only mode. -/// -/// For non-synchronized Realms, this is required to be able to open Realm -/// files which are not writeable or are in a directory which is not writeable. -/// This should only be used on files which will not be modified by anyone -/// while they are open, and not just to get a read-only view of a file which -/// may be written to by another thread or process. Opening in read-only mode -/// requires disabling Realm's reader/writer coordination, so committing a -/// write transaction from another process will result in crashes. -/// -/// Syncronized Realms must always be writeable (as otherwise no -/// synchronization could happen), and this instead merely disallows performing -/// write transactions on the Realm. In addition, it will skip some automatic -/// writes made to the Realm, such as to initialize the Realm's schema. Setting -/// `readOnly = YES` is not strictly required for Realms which the sync user -/// does not have write access to, but is highly recommended as it will improve -/// error reporting and catch some errors earlier. -/// -/// Realms using query-based sync cannot be opened in read-only mode. -@property (nonatomic) BOOL readOnly; - -/// The current schema version. -@property (nonatomic) uint64_t schemaVersion; - -/// The block which migrates the Realm to the current version. -@property (nonatomic, copy, nullable) RLMMigrationBlock migrationBlock; - -/** - Whether to recreate the Realm file with the provided schema if a migration is required. - This is the case when the stored schema differs from the provided schema or - the stored schema version differs from the version on this configuration. - Setting this property to `YES` deletes the file if a migration would otherwise be required or executed. - - @note Setting this property to `YES` doesn't disable file format migrations. - */ -@property (nonatomic) BOOL deleteRealmIfMigrationNeeded; - -/** - A block called when opening a Realm for the first time during the life - of a process to determine if it should be compacted before being returned - to the user. It is passed the total file size (data + free space) and the total - bytes used by data in the file. - - Return `YES` to indicate that an attempt to compact the file should be made. - The compaction will be skipped if another process is accessing it. - */ -@property (nonatomic, copy, nullable) RLMShouldCompactOnLaunchBlock shouldCompactOnLaunch; - -/// The classes managed by the Realm. -@property (nonatomic, copy, nullable) NSArray *objectClasses; - -/** - The maximum number of live versions in the Realm file before an exception will - be thrown when attempting to start a write transaction. - - Realm provides MVCC snapshot isolation, meaning that writes on one thread do - not overwrite data being read on another thread, and instead write a new copy - of that data. When a Realm refreshes it updates to the latest version of the - data and releases the old versions, allowing them to be overwritten by - subsequent write transactions. - - Under normal circumstances this is not a problem, but if the number of active - versions grow too large, it will have a negative effect on the filesize on - disk. This can happen when performing writes on many different threads at - once, when holding on to frozen objects for an extended time, or when - performing long operations on background threads which do not allow the Realm - to refresh. - - Setting this property to a non-zero value makes it so that exceeding the set - number of versions will instead throw an exception. This can be used with a - low value during development to help identify places that may be problematic, - or in production use to cause the app to crash rather than produce a Realm - file which is too large to be opened. - - */ -@property (nonatomic) NSUInteger maximumNumberOfActiveVersions; - -/** - When opening the Realm for the first time, instead of creating an empty file, - the Realm file will be copied from the provided seed file path and used instead. - This can be used to open a Realm file with pre-populated data. - - If a realm file already exists at the configuration's destination path, the seed file - will not be copied and the already existing realm will be opened instead. - - Note that to use this parameter with a synced Realm configuration - the seed Realm must be appropriately copied to a destination with - `[RLMRealm writeCopyForConfiguration:]` first. - - This option is mutually exclusive with `inMemoryIdentifier`. Setting a `seedFilePath` - will nil out the `inMemoryIdentifier`. - */ -@property (nonatomic, copy, nullable) NSURL *seedFilePath; - -/** - A configuration object representing configuration state for Realms intended - to sync with Atlas Device Sync. - - This property is mutually exclusive with both `inMemoryIdentifier` and `fileURL`; - setting any one of the three properties will automatically nil out the other two. - - @see `RLMSyncConfiguration` - */ -@property (nullable, nonatomic) RLMSyncConfiguration *syncConfiguration; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMRealm_Dynamic.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMRealm_Dynamic.h deleted file mode 100644 index bea162775..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMRealm_Dynamic.h +++ /dev/null @@ -1,118 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import -#import - -@class RLMResults; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMRealm (Dynamic) - -#pragma mark - Getting Objects from a Realm - -/** - Returns all objects of a given type from the Realm. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. The preferred way to get objects of a single class is to use the class - methods on `RLMObject`. - - @param className The name of the `RLMObject` subclass to retrieve on (e.g. `MyClass.className`). - - @return An `RLMResults` containing all objects in the Realm of the given type. - - @see `+[RLMObject allObjects]` - */ -- (RLMResults *)allObjects:(NSString *)className; - -/** - Returns all objects matching the given predicate from the Realm. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. The preferred way to get objects of a single class is to use the class - methods on `RLMObject`. - - @param className The type of objects you are looking for (name of the class). - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` containing results matching the given predicate. - - @see `+[RLMObject objectsWhere:]` - */ -- (RLMResults *)objects:(NSString *)className where:(NSString *)predicateFormat, ...; - -/** - Returns all objects matching the given predicate from the Realm. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. The preferred way to get objects of a single class is to use the class - methods on `RLMObject`. - - @param className The type of objects you are looking for (name of the class). - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` containing results matching the given predicate. - - @see `+[RLMObject objectsWhere:]` - */ -- (RLMResults *)objects:(NSString *)className withPredicate:(NSPredicate *)predicate; - -/** - Returns the object of the given type with the given primary key from the Realm. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. The preferred way to get an object of a single class is to use the class - methods on `RLMObject`. - - @param className The class name for the object you are looking for. - @param primaryKey The primary key value for the object you are looking for. - - @return An object, or `nil` if an object with the given primary key does not exist. - - @see `+[RLMObject objectForPrimaryKey:]` - */ -- (nullable RLMObject *)objectWithClassName:(NSString *)className forPrimaryKey:(id)primaryKey; - -/** - Creates an `RLMObject` instance of type `className` in the Realm, and populates it using a given object. - - The `value` argument is used to populate the object. It can be a key-value coding compliant object, an array or - dictionary returned from the methods in `NSJSONSerialization`, or an array containing one element for each managed - property. An exception will be thrown if any required properties are not present and those properties were not defined - with default values. - - When passing in an array as the `value` argument, all properties must be present, valid and in the same order as the - properties defined in the model. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is recommended to - use `[RLMObject createInDefaultRealmWithValue:]`. - - @param value The value used to populate the object. - - @return An `RLMObject` instance of type `className`. - */ --(RLMObject *)createObject:(NSString *)className withValue:(id)value; - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMResults.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMResults.h deleted file mode 100644 index 5911e666a..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMResults.h +++ /dev/null @@ -1,567 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObject; - -/** - `RLMResults` is an auto-updating container type in Realm returned from object - queries. It represents the results of the query in the form of a collection of objects. - - `RLMResults` can be queried using the same predicates as `RLMObject` and `RLMArray`, - and you can chain queries to further filter results. - - `RLMResults` always reflect the current state of the Realm on the current thread, - including during write transactions on the current thread. The one exception to - this is when using `for...in` fast enumeration, which will always enumerate - over the objects which matched the query when the enumeration is begun, even if - some of them are deleted or modified to be excluded by the filter during the - enumeration. - - `RLMResults` are lazily evaluated the first time they are accessed; they only - run queries when the result of the query is requested. This means that - chaining several temporary `RLMResults` to sort and filter your data does not - perform any extra work processing the intermediate state. - - Once the results have been evaluated or a notification block has been added, - the results are eagerly kept up-to-date, with the work done to keep them - up-to-date done on a background thread whenever possible. - - `RLMResults` cannot be directly instantiated. - */ -@interface RLMResults : NSObject - -#pragma mark - Properties - -/** - The number of objects in the results collection. - */ -@property (nonatomic, readonly, assign) NSUInteger count; - -/** - The type of the objects in the results collection. - */ -@property (nonatomic, readonly, assign) RLMPropertyType type; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readwrite, getter = isOptional) BOOL optional; - -/** - The class name of the objects contained in the results collection. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages this results collection. - */ -@property (nonatomic, readonly) RLMRealm *realm; - -/** - Indicates if the results collection is no longer valid. - - The results collection becomes invalid if `invalidate` is called on the containing `realm`. - An invalidated results collection can be accessed, but will always be empty. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -#pragma mark - Accessing Objects from an RLMResults - -/** - Returns the object at the index specified. - - @param index The index to look up. - - @return An object of the type contained in the results collection. - */ -- (RLMObjectType)objectAtIndex:(NSUInteger)index; - -/** - Returns an array containing the objects in the results at the indexes specified by a given index set. - `nil` will be returned if the index set contains an index out of the arrays bounds. - - @param indexes The indexes in the results to retrieve objects from. - - @return The objects at the specified indexes. - */ -- (nullable NSArray *)objectsAtIndexes:(NSIndexSet *)indexes; - -/** - Returns the first object in the results collection. - - Returns `nil` if called on an empty results collection. - - @return An object of the type contained in the results collection. - */ -- (nullable RLMObjectType)firstObject; - -/** - Returns the last object in the results collection. - - Returns `nil` if called on an empty results collection. - - @return An object of the type contained in the results collection. - */ -- (nullable RLMObjectType)lastObject; - -#pragma mark - Querying Results - -/** - Returns the index of an object in the results collection. - - Returns `NSNotFound` if the object is not found in the results collection. - - @param object An object (of the same type as returned from the `objectClassName` selector). - */ -- (NSUInteger)indexOfObject:(RLMObjectType)object; - -/** - Returns the index of the first object in the results collection matching the predicate. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return The index of the object, or `NSNotFound` if the object is not found in the results collection. - */ -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns the index of the first object in the results collection matching the predicate. - - @param predicate The predicate with which to filter the objects. - - @return The index of the object, or `NSNotFound` if the object is not found in the results collection. - */ -- (NSUInteger)indexOfObjectWithPredicate:(NSPredicate *)predicate; - -/** - Returns all the objects matching the given predicate in the results collection. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` of objects that match the given predicate. - */ -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all the objects matching the given predicate in the results collection. - - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` of objects that match the given predicate. - */ -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/** - Returns a sorted `RLMResults` from an existing results collection. - - @param keyPath The key path to sort by. - @param ascending The direction to sort in. - - @return An `RLMResults` sorted by the specified key path. - */ -- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a sorted `RLMResults` from an existing results collection. - - @param properties An array of `RLMSortDescriptor`s to sort by. - - @return An `RLMResults` sorted by the specified properties. - */ -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/** - Returns a distinct `RLMResults` from an existing results collection. - - @param keyPaths The key paths used produce distinct results - - @return An `RLMResults` made distinct based on the specified key paths - */ -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -#pragma mark - Notifications - -/** - Registers a block to be called each time the results collection changes. - - The block will be asynchronously called with the initial results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the results collection were added, removed or modified. If a - write transaction did not modify any objects in the results collection, - the block is not called at all. See the `RLMCollectionChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - At the time when the block is called, the `RLMResults` object will be fully - evaluated and up-to-date, and as long as you do not perform a write transaction - on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will - never perform blocking work. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - NSLog(@"dogs.count: %zu", dogs.count); // => 0 - self.token = [results addNotificationBlock:^(RLMResults *dogs, - RLMCollectionChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - - @param block The block to be called whenever a change occurs. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the results collection changes. - - The block will be asynchronously called with the initial results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the results collection were added, removed or modified. If a - write transaction did not modify any objects in the results collection, - the block is not called at all. See the `RLMCollectionChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - At the time when the block is called, the `RLMResults` object will be fully - evaluated and up-to-date, and as long as you do not perform a write transaction - on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will - never perform blocking work. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the results collection changes. - - The block will be asynchronously called with the initial results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the results collection were added, removed or modified. If a - write transaction did not modify any objects in the results collection, - the block is not called at all. See the `RLMCollectionChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - At the time when the block is called, the `RLMResults` object will be fully - evaluated and up-to-date, and as long as you do not perform a write transaction - on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will - never perform blocking work. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the results collection changes. - - The block will be asynchronously called with the initial results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the results collection were added, removed or modified. If a - write transaction did not modify any objects in the results collection, - the block is not called at all. See the `RLMCollectionChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - At the time when the block is called, the `RLMResults` object will be fully - evaluated and up-to-date, and as long as you do not perform a write transaction - on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will - never perform blocking work. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths -__attribute__((warn_unused_result)); -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the objects - represented by the results collection. - - NSNumber *min = [results minOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose minimum value is desired. Only properties of types `int`, `float`, `double`, and - `NSDate` are supported. - - @return The minimum value of the property, or `nil` if the Results are empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects represented by the results collection. - - NSNumber *max = [results maxOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose maximum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The maximum value of the property, or `nil` if the Results are empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of the values of a given property over all the objects represented by the results collection. - - NSNumber *sum = [results sumOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose values should be summed. Only properties of - types `int`, `float`, and `double` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects represented by the results collection. - - NSNumber *average = [results averageOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose average value should be calculated. Only - properties of types `int`, `float`, and `double` are supported. - - @return The average value of the given property, or `nil` if the Results are empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -/// :nodoc: -- (RLMObjectType)objectAtIndexedSubscript:(NSUInteger)index; - -#pragma mark - Sectioned Results - -/** - Sorts and sections this collection from a given property key path, returning the result - as an instance of `RLMSectionedResults`. - - @param keyPath The property key path to sort on. - @param ascending The direction to sort in. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsSortedUsingKeyPath:(NSString *)keyPath - ascending:(BOOL)ascending - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -/** - Sorts and sections this collection from a given array of sort descriptors, returning the result - as an instance of `RLMSectionedResults`. - - @param sortDescriptors An array of `RLMSortDescriptor`s to sort by. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @note The primary sort descriptor must be responsible for determining the section key. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsUsingSortDescriptors:(NSArray *)sortDescriptors - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -#pragma mark - Freeze - -/** - Indicates if the result are frozen. - - Frozen Results are immutable and can be accessed from any thread.The objects - read from a frozen Results will also be frozen. - */ -@property (nonatomic, readonly, getter=isFrozen) BOOL frozen; - -/** - Returns a frozen (immutable) snapshot of these results. - - The frozen copy is an immutable collection which contains the same data as - this collection currently contains, but will not update when writes are made - to the containing Realm. Unlike live Results, frozen Results can be accessed - from any thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning Holding onto a frozen collection for an extended period while - performing write transaction on the Realm may result in the Realm - file growing to large sizes. See - `RLMRealmConfiguration.maximumNumberOfActiveVersions` for more - information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -#pragma mark - Unavailable Methods - -/** - `-[RLMResults init]` is not available because `RLMResults` cannot be created directly. - `RLMResults` can be obtained by querying a Realm. - */ -- (instancetype)init __attribute__((unavailable("RLMResults cannot be created directly"))); - -/** - `+[RLMResults new]` is not available because `RLMResults` cannot be created directly. - `RLMResults` can be obtained by querying a Realm. - */ -+ (instancetype)new __attribute__((unavailable("RLMResults cannot be created directly"))); - -@end - -/** - `RLMLinkingObjects` is an auto-updating container type. It represents a collection of objects that link to its - parent object. - - For more information, please see the "Inverse Relationships" section in the - [documentation](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/relationships/#relationships). - */ -@interface RLMLinkingObjects : RLMResults -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMSchema.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMSchema.h deleted file mode 100644 index fe46f6d47..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMSchema.h +++ /dev/null @@ -1,78 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectSchema; - -/** - `RLMSchema` instances represent collections of model object schemas managed by a Realm. - - When using Realm, `RLMSchema` instances allow performing migrations and - introspecting the database's schema. - - Schemas map to collections of tables in the core database. - */ -RLM_SWIFT_SENDABLE // not actually immutable, but the public API kinda is -@interface RLMSchema : NSObject - -#pragma mark - Properties - -/** - An `NSArray` containing `RLMObjectSchema`s for all object types in the Realm. - - This property is intended to be used during migrations for dynamic introspection. - - @see `RLMObjectSchema` - */ -@property (nonatomic, readonly, copy) NSArray *objectSchema; - -#pragma mark - Methods - -/** - Returns an `RLMObjectSchema` for the given class name in the schema. - - @param className The object class name. - @return An `RLMObjectSchema` for the given class in the schema. - - @see `RLMObjectSchema` - */ -- (nullable RLMObjectSchema *)schemaForClassName:(NSString *)className; - -/** - Looks up and returns an `RLMObjectSchema` for the given class name in the Realm. - - If there is no object of type `className` in the schema, an exception will be thrown. - - @param className The object class name. - @return An `RLMObjectSchema` for the given class in this Realm. - - @see `RLMObjectSchema` - */ -- (RLMObjectSchema *)objectForKeyedSubscript:(NSString *)className; - -/** - Returns whether two `RLMSchema` instances are equivalent. - */ -- (BOOL)isEqualToSchema:(RLMSchema *)schema; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMSectionedResults.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMSectionedResults.h deleted file mode 100644 index 4ee236b94..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMSectionedResults.h +++ /dev/null @@ -1,921 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2022 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@protocol RLMValue; -@class RLMResults; - -/** - A `RLMSectionedResultsChange` object encapsulates information about changes to sectioned - results that are reported by Realm notifications. - - `RLMSectionedResultsChange` is passed to the notification blocks registered with - `-addNotificationBlock` on `RLMSectionedResults`, and reports what sections and rows in the - collection changed since the last time the notification block was called. - - A complete example of updating a `UITableView` named `tv`: - - [tv beginUpdates]; - [tv deleteRowsAtIndexPaths:changes.deletions withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv insertRowsAtIndexPaths:changes.insertions withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv reloadRowsAtIndexPaths:changes.modifications withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv insertSections:changes.sectionsToInsert withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv deleteSections:changes.sectionsToRemove withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv endUpdates]; - - All of the arrays in an `RLMSectionedResultsChange` are always sorted in ascending order. - */ -@interface RLMSectionedResultsChange : NSObject -/// The index paths of objects in the previous version of the collection which have -/// been removed from this one. -@property (nonatomic, readonly) NSArray *deletions; -/// The index paths in the new version of the collection which were newly inserted. -@property (nonatomic, readonly) NSArray *insertions; -/// The index paths in the old version of the collection which were modified. -@property (nonatomic, readonly) NSArray *modifications; -/// The indices of the sections to be inserted. -@property (nonatomic, readonly) NSIndexSet *sectionsToInsert; -/// The indices of the sections to be removed. -@property (nonatomic, readonly) NSIndexSet *sectionsToRemove; -/// Returns the index paths of the deletion indices in the given section. -- (NSArray *)deletionsInSection:(NSUInteger)section; -/// Returns the index paths of the insertion indices in the given section. -- (NSArray *)insertionsInSection:(NSUInteger)section; -/// Returns the index paths of the modification indices in the given section. -- (NSArray *)modificationsInSection:(NSUInteger)section; -@end - - -/// The `RLMSectionedResult` protocol defines properties and methods common to both `RLMSectionedResults and RLMSection` -@protocol RLMSectionedResult - -#pragma mark - Object Access - -/// The count of objects in the collection. -@property (nonatomic, readonly) NSUInteger count; -/// Returns the object for a given index in the collection. -- (id)objectAtIndexedSubscript:(NSUInteger)index; -/// Returns the object for a given index in the collection. -- (id)objectAtIndex:(NSUInteger)index; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this collection. - - The frozen copy is an immutable collection which contains the same data as this - collection currently contains, but will not update when writes are made to the - containing Realm. Unlike live arrays, frozen collections can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning Holding onto a frozen collection for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; -/** - Indicates if the underlying collection is frozen. - - Frozen collections are immutable and can be accessed from any thread. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Sectioned Results Notifications - -/** - Registers a block to be called each time the collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` / `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(id, RLMSectionedResultsChange *))block __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` / `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(id, RLMSectionedResultsChange *))block - queue:(dispatch_queue_t)queue __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` / `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(id, RLMSectionedResultsChange *))block - keyPaths:(NSArray *)keyPaths __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` / `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(id, RLMSectionedResultsChange *))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue __attribute__((warn_unused_result)); - -@end - -/// An RLMSection contains the objects which belong to a specified section key. -@interface RLMSection, RLMObjectType> : NSObject -/// The value that represents the key in this section. -@property (nonatomic, readonly) RLMKeyType key; -/// The count of objects in the section. -@property (nonatomic, readonly) NSUInteger count; -/// Returns the object for a given index in the section. -- (RLMObjectType)objectAtIndexedSubscript:(NSUInteger)index; -/// Returns the object for a given index in the section. -- (RLMObjectType)objectAtIndex:(NSUInteger)index; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this section. - - The frozen copy is an immutable section which contains the same data as this - section currently contains, but will not update when writes are made to the - containing Realm. Unlike live arrays, frozen collections can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning Holding onto a frozen section for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; -/** - Returns a live version of this frozen section. - - This method resolves a reference to a live copy of the same frozen section. - If called on a live section, will return itself. -*/ -- (instancetype)thaw; -/** - Indicates if the underlying section is frozen. - - Frozen sections are immutable and can be accessed from any thread. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Section Notifications - -/** - Registers a block to be called each time the section changes. - - The block will be asynchronously called with the initial section, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - RLMSection *section = sectionedResults[0] // section with dogs aged '5' already exists. - - self.token = [section addNotificationBlock:^(RLMSection *section, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"section.count: %zu", section.count); // => 2 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSection *, RLMSectionedResultsChange *))block __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the section changes. - - The block will be asynchronously called with the initial section, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - RLMSection *section = sectionedResults[0] // section with dogs aged '5' already exists. - - self.token = [section addNotificationBlock:^(RLMSection *section, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"section.count: %zu", section.count); // => 2 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSection *, RLMSectionedResultsChange *))block - queue:(dispatch_queue_t)queue __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the section changes. - - The block will be asynchronously called with the initial section, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - RLMSection *section = sectionedResults[0] // section with dogs aged '5' already exists. - - self.token = [section addNotificationBlock:^(RLMSection *section, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"section.count: %zu", section.count); // => 2 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSection *, RLMSectionedResultsChange *))block - keyPaths:(NSArray *)keyPaths __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the section changes. - - The block will be asynchronously called with the initial section, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - RLMSection *section = sectionedResults[0] // section with dogs aged '5' already exists. - - self.token = [section addNotificationBlock:^(RLMSection *section, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"section.count: %zu", section.count); // => 2 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSection *, RLMSectionedResultsChange *))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue __attribute__((warn_unused_result)); -@end - -/// A lazily evaluated collection that holds elements in sections determined by a section key. -@interface RLMSectionedResults, RLMObjectType: id> : NSObject -/// An array of all keys in the sectioned results collection. -@property (nonatomic) NSArray *allKeys; -/// The total amount of sections in this collection. -@property (nonatomic, readonly, assign) NSUInteger count; -/// Returns the section at a given index. -- (RLMSection *)objectAtIndexedSubscript:(NSUInteger)index; -/// Returns the section at a given index. -- (RLMSection *)objectAtIndex:(NSUInteger)index; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this sectioned results collection. - - The frozen copy is an immutable sectioned results collection which contains the same data as this - sectioned results collection currently contains, but will not update when writes are made to the - containing Realm. Unlike live sectioned results collections, frozen sectioned results collection - can be accessed from any thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning Holding onto a frozen sectioned results collection for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; -/** - Returns a live version of this frozen sectioned results collection. - - This method resolves a reference to a live copy of the same frozen sectioned results collection. - If called on a live section, will return itself. -*/ -- (instancetype)thaw; -/** - Indicates if the underlying sectioned results collection is frozen. - - Frozen sectioned results collections are immutable and can be accessed from any thread. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Sectioned Results Notifications - -/** - Registers a block to be called each time the sectioned results collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSectionedResults *, RLMSectionedResultsChange *))block __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the sectioned results collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSectionedResults *, RLMSectionedResultsChange *))block - queue:(dispatch_queue_t)queue __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the sectioned results collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSectionedResults *, RLMSectionedResultsChange *))block - keyPaths:(NSArray *)keyPaths __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the sectioned results collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSectionedResults *, RLMSectionedResultsChange *))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue __attribute__((warn_unused_result)); -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMSet.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMSet.h deleted file mode 100644 index fead2e005..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMSet.h +++ /dev/null @@ -1,535 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObject, RLMResults; - -/** - A collection datatype used for storing distinct objects. - - - Note: - `RLMSet` supports storing primitive and `RLMObject` types. `RLMSet` does not support storing - Embedded Realm Objects. - */ -@interface RLMSet : NSObject - -#pragma mark - Properties - -/** - The number of objects in the set. - */ -@property (nonatomic, readonly, assign) NSUInteger count; - -/** - The type of the objects in the set. - */ -@property (nonatomic, readonly, assign) RLMPropertyType type; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readonly, getter = isOptional) BOOL optional; - -/** - The objects in the RLMSet as an NSArray value. - */ -@property (nonatomic, readonly) NSArray *allObjects; - -/** - The class name of the objects contained in the set. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages the set. Returns `nil` for unmanaged set. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - Indicates if the set can no longer be accessed. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if the set is frozen. - - Frozen sets are immutable and can be accessed from any thread. Frozen sets - are created by calling `-freeze` on a managed live set. Unmanaged sets are - never frozen. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Adding, Removing, and Replacing Objects in a Set - -/** - Adds an object to the set if it is not already present. - - @warning This method may only be called during a write transaction. - - @param object An object of the type contained in the set. - */ -- (void)addObject:(RLMObjectType)object; - -/** - Adds an array of distinct objects to the set. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable object such as `NSArray`, `NSSet` or `RLMResults` which contains objects of the - same class as the set. - */ -- (void)addObjects:(id)objects; - -/** - Removes a given object from the set. - - @warning This method may only be called during a write transaction. - - @param object The object in the set that you want to remove. - */ -- (void)removeObject:(RLMObjectType)object; - -/** - Removes all objects from the set. - - @warning This method may only be called during a write transaction. - */ -- (void)removeAllObjects; - -/** - Empties the receiving set, then adds each object contained in another given set. - - @warning This method may only be called during a write transaction. - - @param set The RLMSet whose members replace the receiving set's content. - */ -- (void)setSet:(RLMSet *)set; - -/** - Removes from the receiving set each object that isn’t a member of another given set. - - @warning This method may only be called during a write transaction. - - @param set The RLMSet with which to perform the intersection. - */ -- (void)intersectSet:(RLMSet *)set; - -/** - Removes each object in another given set from the receiving set, if present. - - @warning This method may only be called during a write transaction. - - @param set The set of objects to remove from the receiving set. - */ -- (void)minusSet:(RLMSet *)set; - -/** - Adds each object in another given set to the receiving set, if not present. - - @warning This method may only be called during a write transaction. - - @param set The set of objects to add to the receiving set. - */ -- (void)unionSet:(RLMSet *)set; - -#pragma mark - Querying a Set - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/// :nodoc: -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/// :nodoc: -- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/// :nodoc: -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/// :nodoc: -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -/** - Returns a Boolean value that indicates whether at least one object in the receiving set is also present in another given set. - - @param set The RLMSet to compare the receiving set to. - - @return YES if at least one object in the receiving set is also present in otherSet, otherwise NO. - */ -- (BOOL)intersectsSet:(RLMSet *)set; - -/** - Returns a Boolean value that indicates whether every object in the receiving set is also present in another given set. - - @param set The RLMSet to compare the receiving set to. - - @return YES if every object in the receiving set is also present in otherSet, otherwise NO. - */ -- (BOOL)isSubsetOfSet:(RLMSet *)set; - -/** - Returns a Boolean value that indicates whether a given object is present in the set. - - @param anObject An object to look for in the set. - - @return YES if anObject is present in the set, otherwise NO. - */ -- (BOOL)containsObject:(RLMObjectType)anObject; - -/** - Compares the receiving set to another set. - - @param otherSet The set with which to compare the receiving set. - - @return YES if the contents of otherSet are equal to the contents of the receiving set, otherwise NO. - */ -- (BOOL)isEqualToSet:(RLMSet *)otherSet; - -#pragma mark - Sectioning a Set - -/** - Sorts and sections this collection from a given property key path, returning the result - as an instance of `RLMSectionedResults`. - - @param keyPath The property key path to sort on. - @param ascending The direction to sort in. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsSortedUsingKeyPath:(NSString *)keyPath - ascending:(BOOL)ascending - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -/** - Sorts and sections this collection from a given array of sort descriptors, returning the result - as an instance of `RLMSectionedResults`. - - @param sortDescriptors An array of `RLMSortDescriptor`s to sort by. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @note The primary sort descriptor must be responsible for determining the section key. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsUsingSortDescriptors:(NSArray *)sortDescriptors - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - - -#pragma mark - Notifications - -/** - Registers a block to be called each time the set changes. - - The block will be asynchronously called with the initial set, and then - called again after each write transaction which changes any of the objects in - the set, which objects are in the results, or the order of the objects in the - set. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the set were added, removed or modified. If a write transaction - did not modify any objects in the set, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - Person *person = [[Person allObjectsInRealm:realm] firstObject]; - NSLog(@"person.dogs.count: %zu", person.dogs.count); // => 0 - self.token = [person.dogs addNotificationBlock(RLMSet *dogs, - RLMCollectionChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count) // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - [person.dogs addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a non-frozen managed set. - - @param block The block to be called each time the set changes. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSet *_Nullable set, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the set changes. - - The block will be asynchronously called with the initial set, and then - called again after each write transaction which changes any of the objects in - the set, which objects are in the results, or the order of the objects in the - set. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the set were added, removed or modified. If a write transaction - did not modify any objects in the set, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSet *_Nullable set, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the set changes. - - The block will be asynchronously called with the initial set, and then - called again after each write transaction which changes any of the objects in - the set, which objects are in the results, or the order of the objects in the - set. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the set were added, removed or modified. If a write transaction - did not modify any objects in the set, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSet *_Nullable set, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the set changes. - - The block will be asynchronously called with the initial set, and then - called again after each write transaction which changes any of the objects in - the set, which objects are in the results, or the order of the objects in the - set. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the set were added, removed or modified. If a write transaction - did not modify any objects in the set, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSet *_Nullable set, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths -__attribute__((warn_unused_result)); - -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the objects in the set. - - NSNumber *min = [object.setProperty minOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, `RLMSet`, and `NSData` properties. - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The minimum value of the property, or `nil` if the set is empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects in the set. - - NSNumber *max = [object.setProperty maxOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, `RLMSet`, and `NSData` properties. - - @param property The property whose maximum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The maximum value of the property, or `nil` if the set is empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of distinct values of a given property over all the objects in the set. - - NSNumber *sum = [object.setProperty sumOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, `RLMSet and `NSData` properties. - - @param property The property whose values should be summed. Only properties of - types `int`, `float`, and `double` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects in the set. - - NSNumber *average = [object.setProperty averageOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMSet`, `RLMArray`, and `NSData` properties. - - @param property The property whose average value should be calculated. Only - properties of types `int`, `float`, and `double` are supported. - - @return The average value of the given property, or `nil` if the set is empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this set. - - The frozen copy is an immutable set which contains the same data as this - et currently contains, but will not update when writes are made to the - containing Realm. Unlike live sets, frozen sets can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a managed set. - @warning Holding onto a frozen set for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -#pragma mark - Unavailable Methods - -/** - `-[RLMSet init]` is not available because `RLMSet`s cannot be created directly. - ``RLMSet` properties on `RLMObject`s are lazily created when accessed. - */ -- (instancetype)init __attribute__((unavailable("RLMSets cannot be created directly"))); - -/** - `+[RLMSet new]` is not available because `RLMSet`s cannot be created directly. - `RLMSet` properties on `RLMObject`s are lazily created when accessed. - */ -+ (instancetype)new __attribute__((unavailable("RLMSet cannot be created directly"))); - -@end - -/// :nodoc: -@interface RLMSet (Swift) -// for use only in Swift class definitions -- (instancetype)initWithObjectClassName:(NSString *)objectClassName; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMSwiftObject.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMSwiftObject.h deleted file mode 100644 index 7ea764016..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMSwiftObject.h +++ /dev/null @@ -1,142 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) -/** - `Object` is a class used to define Realm model objects. - - In Realm you define your model classes by subclassing `Object` and adding properties to be managed. - You then instantiate and use your custom subclasses instead of using the `Object` class directly. - - ```swift - class Dog: Object { - @objc dynamic var name: String = "" - @objc dynamic var adopted: Bool = false - let siblings = List() - } - ``` - - ### Supported property types - - - `String`, `NSString` - - `Int` - - `Int8`, `Int16`, `Int32`, `Int64` - - `Float` - - `Double` - - `Bool` - - `Date`, `NSDate` - - `Data`, `NSData` - - `Decimal128` - - `ObjectId` - - `@objc enum` which has been delcared as conforming to `RealmEnum`. - - `RealmOptional` for optional numeric properties - - `Object` subclasses, to model many-to-one relationships - - `EmbeddedObject` subclasses, to model owning one-to-one relationships - - `List`, to model many-to-many relationships - - `String`, `NSString`, `Date`, `NSDate`, `Data`, `NSData`, `Decimal128`, and `ObjectId` properties - can be declared as optional. `Object` and `EmbeddedObject` subclasses *must* be declared as optional. - `Int`, `Int8`, `Int16`, `Int32`, `Int64`, `Float`, `Double`, `Bool`, enum, and `List` properties cannot. - To store an optional number, use `RealmOptional`, `RealmOptional`, `RealmOptional`, or - `RealmOptional` instead, which wraps an optional numeric value. Lists cannot be optional at all. - - All property types except for `List` and `RealmOptional` *must* be declared as `@objc dynamic var`. `List` and - `RealmOptional` properties must be declared as non-dynamic `let` properties. Swift `lazy` properties are not allowed. - - Note that none of the restrictions listed above apply to properties that are configured to be ignored by Realm. - - ### Querying - - You can retrieve all objects of a given type from a Realm by calling the `objects(_:)` instance method. - - ### Relationships - - See our [Objective-C guide](https://docs.mongodb.com/realm/sdk/swift/fundamentals/relationships/) for more details. - */ -@interface RealmSwiftObject : RLMObjectBase -@end - -/** - `EmbeddedObject` is a base class used to define embedded Realm model objects. - - Embedded objects work similarly to normal objects, but are owned by a single - parent Object (which itself may be embedded). Unlike normal top-level objects, - embedded objects cannot be directly created in or added to a Realm. Instead, - they can only be created as part of a parent object, or by assigning an - unmanaged object to a parent object's property. Embedded objects are - automatically deleted when the parent object is deleted or when the parent is - modified to no longer point at the embedded object, either by reassigning an - Object property or by removing the embedded object from the List containing it. - - Embedded objects can only ever have a single parent object which links to - them, and attempting to link to an existing managed embedded object will throw - an exception. - - The property types supported on `EmbeddedObject` are the same as for `Object`, - except for that embedded objects cannot link to top-level objects, so `Object` - and `List` properties are not supported (`EmbeddedObject` and - `List` *are*). - - Embedded objects cannot have primary keys or indexed properties. - - ```swift - class Owner: Object { - @objc dynamic var name: String = "" - let dogs = List() - } - class Dog: EmbeddedObject { - @objc dynamic var name: String = "" - @objc dynamic var adopted: Bool = false - let owner = LinkingObjects(fromType: Owner.self, property: "dogs") - } - ``` - */ -@interface RealmSwiftEmbeddedObject : RLMObjectBase -@end - -/** - `AsymmetricObject` is a base class used to define asymmetric Realm objects. - - Asymmetric objects can only be created using the `create(_ object:)` - function, and cannot be added, removed or queried. - When created, asymmetric objects will be synced unidirectionally to the MongoDB - database and cannot be accessed locally. - - Incoming links from any asymmetric table are not allowed, meaning embedding - an asymmetric object within an `Object` will throw an error. - - The property types supported on `AsymmetricObject` are the same as for `Object`, - except for that asymmetric objects can only link to embedded objects, so `Object` - and `List` properties are not supported (`EmbeddedObject` and - `List` *are*). - - ```swift - class Person: AsymmetricObject { - @Persisted(primaryKey: true) var _id: ObjectId = ObjectId.generate() - @Persisted var name: String - @Persisted var age: Int - } - ``` - */ -@interface RealmSwiftAsymmetricObject : RLMObjectBase -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMSwiftProperty.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMSwiftProperty.h deleted file mode 100644 index ea071927c..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMSwiftProperty.h +++ /dev/null @@ -1,71 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -@class RLMObjectBase, RLMArray, RLMSet; - -#ifdef __cplusplus -extern "C" { -#endif - -RLM_HEADER_AUDIT_BEGIN(nullability) - -#define REALM_FOR_EACH_SWIFT_PRIMITIVE_TYPE(macro) \ - macro(bool, Bool, bool) \ - macro(double, Double, double) \ - macro(float, Float, float) \ - macro(int64_t, Int64, int) - -#define REALM_FOR_EACH_SWIFT_OBJECT_TYPE(macro) \ - macro(NSString, String, string) \ - macro(NSDate, Date, date) \ - macro(NSData, Data, data) \ - macro(NSUUID, UUID, uuid) \ - macro(RLMDecimal128, Decimal128, decimal128) \ - macro(RLMObjectId, ObjectId, objectId) - -#define REALM_SWIFT_PROPERTY_ACCESSOR(objc, swift, rlmtype) \ - objc RLMGetSwiftProperty##swift(RLMObjectBase *, uint16_t); \ - objc RLMGetSwiftProperty##swift##Optional(RLMObjectBase *, uint16_t, bool *); \ - void RLMSetSwiftProperty##swift(RLMObjectBase *, uint16_t, objc); -REALM_FOR_EACH_SWIFT_PRIMITIVE_TYPE(REALM_SWIFT_PROPERTY_ACCESSOR) -#undef REALM_SWIFT_PROPERTY_ACCESSOR - -#define REALM_SWIFT_PROPERTY_ACCESSOR(objc, swift, rlmtype) \ - objc *_Nullable RLMGetSwiftProperty##swift(RLMObjectBase *, uint16_t); \ - void RLMSetSwiftProperty##swift(RLMObjectBase *, uint16_t, objc *_Nullable); -REALM_FOR_EACH_SWIFT_OBJECT_TYPE(REALM_SWIFT_PROPERTY_ACCESSOR) -#undef REALM_SWIFT_PROPERTY_ACCESSOR - -id _Nullable RLMGetSwiftPropertyAny(RLMObjectBase *, uint16_t); -void RLMSetSwiftPropertyAny(RLMObjectBase *, uint16_t, id); -RLMObjectBase *_Nullable RLMGetSwiftPropertyObject(RLMObjectBase *, uint16_t); -void RLMSetSwiftPropertyNil(RLMObjectBase *, uint16_t); -void RLMSetSwiftPropertyObject(RLMObjectBase *, uint16_t, RLMObjectBase *_Nullable); - -RLMArray *_Nonnull RLMGetSwiftPropertyArray(RLMObjectBase *obj, uint16_t); -RLMSet *_Nonnull RLMGetSwiftPropertySet(RLMObjectBase *obj, uint16_t); -RLMDictionary *_Nonnull RLMGetSwiftPropertyMap(RLMObjectBase *obj, uint16_t); - -RLM_HEADER_AUDIT_END(nullability) - -#ifdef __cplusplus -} // extern "C" -#endif diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMSyncConfiguration.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMSyncConfiguration.h deleted file mode 100644 index 54ea2ecfc..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMSyncConfiguration.h +++ /dev/null @@ -1,196 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -@class RLMApp; -@class RLMRealm; -@class RLMRealmConfiguration; -@class RLMUser; -@protocol RLMBSON; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** Determines file behavior during a client reset. - - @see: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ -*/ -typedef NS_ENUM(NSUInteger, RLMClientResetMode) { - /// The local copy of the Realm is copied into a recovery - /// directory for safekeeping, and then deleted from the original location. The next time - /// the Realm for that partition value is opened, the Realm will automatically be re-downloaded from - /// Atlas App Services, and can be used as normal. - - /// Data written to the Realm after the local copy of the Realm diverged from the backup - /// remote copy will be present in the local recovery copy of the Realm file. The - /// re-downloaded Realm will initially contain only the data present at the time the Realm - /// was backed up on the server. - /// - /// @see: ``rlmSync_clientResetBackedUpRealmPath`` and ``RLMSyncErrorActionToken`` for more information on accessing the recovery directory and error information. - /// - /// The manual client reset mode handler can be set in two places: - /// 1. As an ErrorReportingBlock argument at ``RLMSyncConfiguration.manualClientResetHandler``. - /// 2. As an ErrorReportingBlock in the ``RLMSyncManager.errorHandler`` property. - /// @see: ``RLMSyncManager.errorHandler`` - /// - /// When an ``RLMSyncErrorClientResetError`` is thrown, the following rules determine which block is executed: - /// - If an error reporting block is set in ``.manualClientResetHandler`` and the ``RLMSyncManager.errorHandler``, the ``.manualClientResetHandler`` block will be executed. - /// - If an error reporting block is set in either the ``.manualClientResetHandler`` or the ``RLMSyncManager``, but not both, the single block will execute. - /// - If no block is set in either location, the client reset will not be handled. The application will likely need to be restarted and unsynced local changes may be lost. - /// @note: The ``RLMSyncManager.errorHandler`` is still invoked under all ``RLMSyncError``s *other than* ``RLMSyncErrorClientResetError``. - /// @see ``RLMSyncError`` for an exhaustive list. - RLMClientResetModeManual = 0, - /// All unsynchronized local changes are automatically discarded and the local state is - /// automatically reverted to the most recent state from the server. Unsynchronized changes - /// can then be recovered in the post-client-reset callback block. - /// - /// If ``RLMClientResetModeDiscardLocal`` is enabled but the client reset operation is unable to complete - /// then the client reset process reverts to manual mode. Example) During a destructive schema change this - /// mode will fail and invoke the manual client reset handler. - /// - /// The RLMClientResetModeDiscardLocal mode supports two client reset callbacks -- ``RLMClientResetBeforeBlock``, ``RLMClientResetAfterBlock`` -- which can be passed as arguments when creating the ``RLMSyncConfiguration``. - /// @see: ``RLMClientResetAfterBlock`` and ``RLMClientResetBeforeBlock`` - RLMClientResetModeDiscardLocal __deprecated_enum_msg("Use RLMClientResetModeDiscardUnsyncedChanges") = 1, - /// All unsynchronized local changes are automatically discarded and the local state is - /// automatically reverted to the most recent state from the server. Unsynchronized changes - /// can then be recovered in the post-client-reset callback block. - /// - /// If ``RLMClientResetModeDiscardUnsyncedChanges`` is enabled but the client reset operation is unable to complete - /// then the client reset process reverts to manual mode. Example) During a destructive schema change this - /// mode will fail and invoke the manual client reset handler. - /// - /// The RLMClientResetModeDiscardUnsyncedChanges mode supports two client reset callbacks -- ``RLMClientResetBeforeBlock``, ``RLMClientResetAfterBlock`` -- which can be passed as arguments when creating the ``RLMSyncConfiguration``. - /// @see: ``RLMClientResetAfterBlock`` and ``RLMClientResetBeforeBlock`` - RLMClientResetModeDiscardUnsyncedChanges = 1, - /// The client device will download a realm realm which reflects the latest - /// state of the server after a client reset. A recovery process is run locally in - /// an attempt to integrate the server version with any local changes from - /// before the client reset occurred. - /// - /// The changes are integrated with the following rules: - /// 1. Objects created locally that were not synced before client reset will be integrated. - /// 2. If an object has been deleted on the server, but was modified on the client, the delete takes precedence and the update is discarded - /// 3. If an object was deleted on the client, but not the server, then the client delete instruction is applied. - /// 4. In the case of conflicting updates to the same field, the client update is applied. - /// - /// If the recovery integration fails, the client reset process falls back to ``RLMClientResetModeManual``. - /// The recovery integration will fail if the "Client Recovery" setting is not enabled on the server. - /// Integration may also fail in the event of an incompatible schema change. - /// - /// The RLMClientResetModeRecoverUnsyncedChanges mode supports two client reset callbacks -- ``RLMClientResetBeforeBlock``, ``RLMClientResetAfterBlock`` -- which can be passed as arguments when creating the ``RLMSyncConfiguration``. - /// @see: ``RLMClientResetAfterBlock`` and ``RLMClientResetBeforeBlock`` - RLMClientResetModeRecoverUnsyncedChanges = 2, - /// The client device will download a realm with objects reflecting the latest version of the server. A recovery - /// process is run locally in an attempt to integrate the server version with any local changes from before the - /// client reset occurred. - /// - /// The changes are integrated with the following rules: - /// 1. Objects created locally that were not synced before client reset will be integrated. - /// 2. If an object has been deleted on the server, but was modified on the client, the delete takes precedence and the update is discarded - /// 3. If an object was deleted on the client, but not the server, then the client delete instruction is applied. - /// 4. In the case of conflicting updates to the same field, the client update is applied. - /// - /// If the recovery integration fails, the client reset process falls back to ``RLMClientResetModeDiscardUnsyncedChanges``. - /// The recovery integration will fail if the "Client Recovery" setting is not enabled on the server. - /// Integration may also fail in the event of an incompatible schema change. - /// - /// The RLMClientResetModeRecoverOrDiscardUnsyncedChanges mode supports two client reset callbacks -- ``RLMClientResetBeforeBlock``, ``RLMClientResetAfterBlock`` -- which can be passed as arguments when creating the ``RLMSyncConfiguration``. - /// @see: ``RLMClientResetAfterBlock`` and ``RLMClientResetBeforeBlock`` - RLMClientResetModeRecoverOrDiscardUnsyncedChanges = 3 -}; - -/** - A block type used to report before a client reset will occur. - The `beforeFrozen` is a frozen copy of the local state prior to client reset. - */ -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMClientResetBeforeBlock)(RLMRealm * _Nonnull beforeFrozen); - -/** - A block type used to report after a client reset occurred. - The `beforeFrozen` argument is a frozen copy of the local state prior to client reset. - The `after` argument contains the local database state after the client reset occurred. - */ -RLM_SWIFT_SENDABLE // invoked on a backgroun thread -typedef void(^RLMClientResetAfterBlock)(RLMRealm * _Nonnull beforeFrozen, RLMRealm * _Nonnull after); - -/** - A configuration object representing configuration state for a Realm which is intended to sync with a Realm Object - Server. - */ -@interface RLMSyncConfiguration : NSObject - -/// The user to which the remote Realm belongs. -@property (nonatomic, readonly) RLMUser *user; - -/** - The value this Realm is partitioned on. The partition key is a property defined in - Atlas App Services. All classes with a property with this value will be synchronized to the - Realm. - */ -@property (nonatomic, readonly) id partitionValue; - -/** - An enum which determines file recovery behavior in the event of a client reset. - @note: Defaults to `RLMClientResetModeRecoverUnsyncedChanges` - - @see: `RLMClientResetMode` - @see: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ -*/ -@property (nonatomic) RLMClientResetMode clientResetMode; - -/** - A callback which notifies prior to prior to a client reset occurring. - @see: `RLMClientResetBeforeBlock` - */ -@property (nonatomic, nullable) RLMClientResetBeforeBlock beforeClientReset; - -/** - A callback which notifies after a client reset has occurred. - @see: `RLMClientResetAfterBlock` - */ -@property (nonatomic, nullable) RLMClientResetAfterBlock afterClientReset; - -/** - A callback that's executed when an `RLMSyncErrorClientResetError` is encountered. - @See RLMSyncErrorReportingBlock and RLMSyncErrorClientResetError for more - details on handling a client reset manually. - */ -@property (nonatomic, nullable) RLMSyncErrorReportingBlock manualClientResetHandler; - - -/** - Whether nonfatal connection errors should cancel async opens. - - By default, if a nonfatal connection error such as a connection timing out occurs, any currently pending asyncOpen operations will ignore the error and continue to retry until it succeeds. If this is set to true, the open will instead fail and report the error. - - NEXT-MAJOR: This should be true by default. - */ -@property (nonatomic) bool cancelAsyncOpenOnNonFatalErrors; - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("This type cannot be created directly"))); - -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("This type cannot be created directly"))); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMSyncManager.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMSyncManager.h deleted file mode 100644 index 1dee453d0..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMSyncManager.h +++ /dev/null @@ -1,223 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMSyncSession, RLMSyncTimeoutOptions, RLMAppConfiguration; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -// NEXT-MAJOR: This enum needs to be removed when access to the logger is removed -// from the sync manager. -/// An enum representing different levels of sync-related logging that can be configured. -typedef RLM_CLOSED_ENUM(NSUInteger, RLMSyncLogLevel) { - /// Nothing will ever be logged. - RLMSyncLogLevelOff, - /// Only fatal errors will be logged. - RLMSyncLogLevelFatal, - /// Only errors will be logged. - RLMSyncLogLevelError, - /// Warnings and errors will be logged. - RLMSyncLogLevelWarn, - /// Information about sync events will be logged. Fewer events will be logged in order to avoid overhead. - RLMSyncLogLevelInfo, - /// Information about sync events will be logged. More events will be logged than with `RLMSyncLogLevelInfo`. - RLMSyncLogLevelDetail, - /// Log information that can aid in debugging. - /// - /// - warning: Will incur a measurable performance impact. - RLMSyncLogLevelDebug, - /// Log information that can aid in debugging. More events will be logged than with `RLMSyncLogLevelDebug`. - /// - /// - warning: Will incur a measurable performance impact. - RLMSyncLogLevelTrace, - /// Log information that can aid in debugging. More events will be logged than with `RLMSyncLogLevelTrace`. - /// - /// - warning: Will incur a measurable performance impact. - RLMSyncLogLevelAll -}; - -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" -/// A log callback function which can be set on RLMSyncManager. -/// -/// The log function may be called from multiple threads simultaneously, and is -/// responsible for performing its own synchronization if any is required. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void (^RLMSyncLogFunction)(RLMSyncLogLevel level, NSString *message); -#pragma clang diagnostic pop - -/// A block type representing a block which can be used to report a sync-related error to the application. If the error -/// pertains to a specific session, that session will also be passed into the block. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMSyncErrorReportingBlock)(NSError *, RLMSyncSession * _Nullable); - -/** - A manager which serves as a central point for sync-related configuration. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMSyncManager : NSObject - -/** - A block which can optionally be set to report sync-related errors to your application. - - Any error reported through this block will be of the `RLMSyncError` type, and marked - with the `RLMSyncErrorDomain` domain. - - Errors reported through this mechanism are fatal, with several exceptions. Please consult - `RLMSyncError` for information about the types of errors that can be reported through - the block, and for for suggestions on handling recoverable error codes. - - @see `RLMSyncError` - */ -@property (nullable, atomic, copy) RLMSyncErrorReportingBlock errorHandler; - -/// :nodoc: -@property (nonatomic, copy) NSString *appID -__attribute__((deprecated("This property is not used for anything"))); - -/** - A string identifying this application which is included in the User-Agent - header of sync connections. By default, this will be the application's bundle - identifier. - - This property must be set prior to opening a synchronized Realm for the first - time. Any modifications made after opening a Realm will be ignored. - */ -@property (atomic, copy) NSString *userAgent; - -/** - The logging threshold which newly opened synced Realms will use. Defaults to - `RLMSyncLogLevelInfo`. - - By default logging strings are output to Apple System Logger. Set `logger` to - perform custom logging logic instead. - - @warning This property must be set before any synced Realms are opened. Setting it after - opening any synced Realm will do nothing. - */ -@property (atomic) RLMSyncLogLevel logLevel -__attribute__((deprecated("Use `RLMLogger.default.level`/`Logger.shared.level` to set/get the default logger threshold level."))); - -/** - The function which will be invoked whenever the sync client has a log message. - - If nil, log strings are output to Apple System Logger instead. - - @warning This property must be set before any synced Realms are opened. Setting - it after opening any synced Realm will do nothing. - */ -@property (atomic, nullable) RLMSyncLogFunction logger -__attribute__((deprecated("Use `RLMLogger.default`/`Logger.shared` to set/get the default logger."))); - -/** - The name of the HTTP header to send authorization data in when making requests to Atlas App Services which has - been configured to expect a custom authorization header. - */ -@property (nullable, atomic, copy) NSString *authorizationHeaderName; - -/** - Extra HTTP headers to append to every request to Atlas App Services. - - Modifying this property while sync sessions are active will result in all - sessions disconnecting and reconnecting using the new headers. - */ -@property (nullable, atomic, copy) NSDictionary *customRequestHeaders; - -/** - Options for the assorted types of connection timeouts for sync connections. - - If nil default values for all timeouts are used instead. - - @warning This property must be set before any synced Realms are opened. Setting - it after opening any synced Realm will do nothing. - */ -@property (nullable, atomic, copy) RLMSyncTimeoutOptions *timeoutOptions; - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("RLMSyncManager cannot be created directly"))); - -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("RLMSyncManager cannot be created directly"))); - -@end - -/** - Options for configuring timeouts and intervals in the sync client. - */ -@interface RLMSyncTimeoutOptions : NSObject -/// The maximum number of milliseconds to allow for a connection to -/// become fully established. This includes the time to resolve the -/// network address, the TCP connect operation, the SSL handshake, and -/// the WebSocket handshake. -/// -/// Defaults to 2 minutes. -@property (nonatomic) NSUInteger connectTimeout; - -/// The number of milliseconds to keep a connection open after all -/// sessions have been abandoned. -/// -/// After all synchronized Realms have been closed for a given server, the -/// connection is kept open until the linger time has expired to avoid the -/// overhead of reestablishing the connection when Realms are being closed and -/// reopened. -/// -/// Defaults to 30 seconds. -@property (nonatomic) NSUInteger connectionLingerTime; - -/// The number of milliseconds between each heartbeat ping message. -/// -/// The client periodically sends ping messages to the server to check if the -/// connection is still alive. Shorter periods make connection state change -/// notifications more responsive at the cost of battery life (as the antenna -/// will have to wake up more often). -/// -/// Defaults to 1 minute. -@property (nonatomic) NSUInteger pingKeepalivePeriod; - -/// How long in milliseconds to wait for a reponse to a heartbeat ping before -/// concluding that the connection has dropped. -/// -/// Shorter values will make connection state change notifications more -/// responsive as it will only change to `disconnected` after this much time has -/// elapsed, but overly short values may result in spurious disconnection -/// notifications when the server is simply taking a long time to respond. -/// -/// Defaults to 2 minutes. -@property (nonatomic) NSUInteger pongKeepaliveTimeout; - -/// The maximum amount of time, in milliseconds, since the loss of a -/// prior connection, for a new connection to be considered a "fast -/// reconnect". -/// -/// When a client first connects to the server, it defers uploading any local -/// changes until it has downloaded all changesets from the server. This -/// typically reduces the total amount of merging that has to be done, and is -/// particularly beneficial the first time that a specific client ever connects -/// to the server. -/// -/// When an existing client disconnects and then reconnects within the "fact -/// reconnect" time this is skipped and any local changes are uploaded -/// immediately without waiting for downloads, just as if the client was online -/// the whole time. -/// -/// Defaults to 1 minute. -@property (nonatomic) NSUInteger fastReconnectLimit; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMSyncSession.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMSyncSession.h deleted file mode 100644 index 31677ce9c..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMSyncSession.h +++ /dev/null @@ -1,234 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -/** - The current state of the session represented by a session object. - */ -typedef NS_ENUM(NSUInteger, RLMSyncSessionState) { - /// The sync session is actively communicating or attempting to communicate - /// with Atlas App Services. A session is considered Active even if - /// it is not currently connected. Check the connection state instead if you - /// wish to know if the connection is currently online. - RLMSyncSessionStateActive, - /// The sync session is not attempting to communicate with MongoDB - /// Realm due to the user logging out or synchronization being paused. - RLMSyncSessionStateInactive, - /// The sync session encountered a fatal error and is permanently invalid; it should be discarded. - RLMSyncSessionStateInvalid -}; - -/** - The current state of a sync session's connection. Sessions which are not in - the Active state will always be Disconnected. - */ -typedef NS_ENUM(NSUInteger, RLMSyncConnectionState) { - /// The sync session is not connected to the server, and is not attempting - /// to connect, either because the session is inactive or because it is - /// waiting to retry after a failed connection. - RLMSyncConnectionStateDisconnected, - /// The sync session is attempting to connect to Atlas App Services. - RLMSyncConnectionStateConnecting, - /// The sync session is currently connected to Atlas App Services. - RLMSyncConnectionStateConnected, -}; - -/** - The transfer direction (upload or download) tracked by a given progress notification block. - - Progress notification blocks can be registered on sessions if your app wishes to be informed - how many bytes have been uploaded or downloaded, for example to show progress indicator UIs. - */ -typedef RLM_CLOSED_ENUM(NSUInteger, RLMSyncProgressDirection) { - /// For monitoring upload progress. - RLMSyncProgressDirectionUpload, - /// For monitoring download progress. - RLMSyncProgressDirectionDownload, -}; - -/** - The desired behavior of a progress notification block. - - Progress notification blocks can be registered on sessions if your app wishes to be informed - how many bytes have been uploaded or downloaded, for example to show progress indicator UIs. - */ -typedef NS_ENUM(NSUInteger, RLMSyncProgressMode) { - /** - The block will be called indefinitely, or until it is unregistered by calling - `-[RLMProgressNotificationToken invalidate]`. - - Notifications will always report the latest number of transferred bytes, and the - most up-to-date number of total transferrable bytes. - */ - RLMSyncProgressModeReportIndefinitely, - /** - The block will, upon registration, store the total number of bytes - to be transferred. When invoked, it will always report the most up-to-date number - of transferrable bytes out of that original number of transferrable bytes. - - When the number of transferred bytes reaches or exceeds the - number of transferrable bytes, the block will be unregistered. - */ - RLMSyncProgressModeForCurrentlyOutstandingWork, -}; - -@class RLMUser, RLMSyncConfiguration, RLMSyncErrorActionToken, RLMSyncManager; - -/** - The type of a progress notification block intended for reporting a session's network - activity to the user. - - `transferredBytes` refers to the number of bytes that have been uploaded or downloaded. - `transferrableBytes` refers to the total number of bytes transferred, and pending transfer. - */ -typedef void(^RLMProgressNotificationBlock)(NSUInteger transferredBytes, NSUInteger transferrableBytes); - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A token object corresponding to a progress notification block on a session object. - - To stop notifications manually, call `-invalidate` on it. Notifications should be stopped before - the token goes out of scope or is destroyed. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMProgressNotificationToken : RLMNotificationToken -@end - -/** - An object encapsulating an Atlas App Services "session". Sessions represent the - communication between the client (and a local Realm file on disk), and the server - (and a remote Realm with a given partition value stored on Atlas App Services). - - Sessions are always created by the SDK and vended out through various APIs. The - lifespans of sessions associated with Realms are managed automatically. Session - objects can be accessed from any thread. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMSyncSession : NSObject - -/// The session's current state. -/// -/// This property is not KVO-compliant. -@property (nonatomic, readonly) RLMSyncSessionState state; - -/// The session's current connection state. -/// -/// This property is KVO-compliant and can be observed to be notified of changes. -/// Be warned that KVO observers for this property may be called on a background -/// thread. -@property (atomic, readonly) RLMSyncConnectionState connectionState; - -/// The user that owns this session. -- (nullable RLMUser *)parentUser; - -/** - If the session is valid, return a sync configuration that can be used to open the Realm - associated with this session. - */ -- (nullable RLMSyncConfiguration *)configuration; - -/** - Temporarily suspend syncronization and disconnect from the server. - - The session will not attempt to connect to Atlas App Services until `resume` - is called or the Realm file is closed and re-opened. - */ -- (void)suspend; - -/** - Resume syncronization and reconnect to Atlas App Services after suspending. - - This is a no-op if the session was already active or if the session is invalid. - Newly created sessions begin in the Active state and do not need to be resumed. - */ -- (void)resume; - -/** - Register a progress notification block. - - Multiple blocks can be registered with the same session at once. Each block - will be invoked on a side queue devoted to progress notifications. - - If the session has already received progress information from the - synchronization subsystem, the block will be called immediately. Otherwise, it - will be called as soon as progress information becomes available. - - The token returned by this method must be retained as long as progress - notifications are desired, and the `-invalidate` method should be called on it - when notifications are no longer needed and before the token is destroyed. - - If no token is returned, the notification block will never be called again. - There are a number of reasons this might be true. If the session has previously - experienced a fatal error it will not accept progress notification blocks. If - the block was configured in the `RLMSyncProgressForCurrentlyOutstandingWork` - mode but there is no additional progress to report (for example, the number - of transferrable bytes and transferred bytes are equal), the block will not be - called again. - - @param direction The transfer direction (upload or download) to track in this progress notification block. - @param mode The desired behavior of this progress notification block. - @param block The block to invoke when notifications are available. - - @return A token which must be held for as long as you want notifications to be delivered. - - @see `RLMSyncProgressDirection`, `RLMSyncProgress`, `RLMProgressNotificationBlock`, `RLMProgressNotificationToken` - */ -- (nullable RLMProgressNotificationToken *)addProgressNotificationForDirection:(RLMSyncProgressDirection)direction - mode:(RLMSyncProgressMode)mode - block:(RLMProgressNotificationBlock)block -NS_REFINED_FOR_SWIFT; - -/** - Given an error action token, immediately handle the corresponding action. - - @see `RLMSyncErrorClientResetError`, `RLMSyncErrorPermissionDeniedError` - */ -+ (void)immediatelyHandleError:(RLMSyncErrorActionToken *)token syncManager:(RLMSyncManager *)syncManager; - -/** - Get the sync session for the given Realm if it is a synchronized Realm, or `nil` - if it is not. - */ -+ (nullable RLMSyncSession *)sessionForRealm:(RLMRealm *)realm; - -@end - -// MARK: - Error action token - -#pragma mark - Error action token - -/** - An opaque token returned as part of certain errors. It can be - passed into certain APIs to perform certain actions. - - @see `RLMSyncErrorClientResetError`, `RLMSyncErrorPermissionDeniedError` - */ -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMSyncErrorActionToken : NSObject - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("This type cannot be created directly"))); - -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("This type cannot be created directly"))); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMSyncSubscription.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMSyncSubscription.h deleted file mode 100644 index d35be19d0..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMSyncSubscription.h +++ /dev/null @@ -1,346 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectId; - -#pragma mark - Subscription States - -/// The current state of the subscription. This can be used for ensuring that -/// the subscriptions are not errored and that it has been successfully -/// synced to the server. -typedef NS_ENUM(NSUInteger, RLMSyncSubscriptionState) { - /// The subscription is complete and the server has sent all the data that matched the subscription - /// queries at the time the subscription set was updated. The server is now in a steady-state - /// synchronization mode where it will stream update as they come. - RLMSyncSubscriptionStateComplete, - /// The subscription encountered an error and synchronization is paused for this Realm. You can - /// find the error calling error in the subscription set to get a description of the error. You can - /// still use the current subscription set to write a subscription. - RLMSyncSubscriptionStateError, - /// The subscription is persisted locally but not yet processed by the server, which means - /// the server hasn't yet returned all the data that matched the updated subscription queries. - RLMSyncSubscriptionStatePending, - /// The subscription set has been super-ceded by an updated one, this typically means that - /// someone is trying to write a subscription on a different instance of the subscription set. - /// You should not use a superseded subscription set and instead obtain a new instance of - /// the subscription set to write a subscription. - RLMSyncSubscriptionStateSuperseded -}; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - `RLMSyncSubscription` is used to define a Flexible Sync subscription obtained from querying a - subscription set, which can be used to read or remove/update a committed subscription. - */ -@interface RLMSyncSubscription : NSObject - -/// Name of the subscription. If not specified it will return nil. -@property (nonatomic, readonly, nullable) NSString *name; - -/// When the subscription was created. Recorded automatically. -@property (nonatomic, readonly) NSDate *createdAt; - -/// When the subscription was last updated. Recorded automatically. -@property (nonatomic, readonly) NSDate *updatedAt; - -/** - Updates a Flexible Sync's subscription query with an allowed query which will be used to bootstrap data - from the server when committed. - - @warning This method may only be called during a write subscription block. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - */ -- (void)updateSubscriptionWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (void)updateSubscriptionWhere:(NSString *)predicateFormat - args:(va_list)args; - -/** - Updates a Flexible Sync's subscription query with an allowed query which will be used to bootstrap data - from the server when committed. - - @warning This method may only be called during a write subscription block. - - @param predicate The predicate with which to filter the objects on the server. - */ -- (void)updateSubscriptionWithPredicate:(NSPredicate *)predicate; - -@end - -/** - `RLMSyncSubscriptionSet` is a collection of `RLMSyncSubscription`s. This is the entry point - for adding and removing `RLMSyncSubscription`s. - */ -@interface RLMSyncSubscriptionSet : NSObject - -/// The number of subscriptions in the subscription set. -@property (readonly) NSUInteger count; - -/// Gets the error associated to the subscription set. This will be non-nil in case the current -/// state of the subscription set is `RLMSyncSubscriptionStateError`. -@property (nonatomic, readonly, nullable) NSError *error; - -/// Gets the state associated to the subscription set. -@property (nonatomic, readonly) RLMSyncSubscriptionState state; - -#pragma mark - Batch Update subscriptions - -/** - Synchronously performs any transactions (add/remove/update) to the subscription set within the block, - this will not wait for the server to acknowledge and see all the data associated with this collection of subscriptions, - and will return after committing the subscription transactions. - - @param block The block containing actions to perform to the subscription set. - */ -- (void)update:(__attribute__((noescape)) void(^)(void))block; -/// :nodoc: -- (void)write:(__attribute__((noescape)) void(^)(void))block __attribute__((unavailable("Renamed to -update"))); - -/** - Synchronously performs any transactions (add/remove/update) to the subscription set within the block, - this will not wait for the server to acknowledge and see all the data associated with this collection of subscriptions, - and will return after committing the subscription transactions. - - @param block The block containing actions to perform to the subscription set. - @param onComplete A block which is called upon synchronization of - subscriptions to the server. The block will be passed `nil` - if the update succeeded, and an error describing the problem - otherwise. - */ -- (void)update:(__attribute__((noescape)) void(^)(void))block - onComplete:(nullable void(^RLM_SWIFT_SENDABLE)(NSError *_Nullable))onComplete - __attribute__((swift_async(not_swift_private, 2))) - __attribute__((swift_attr("@_unsafeInheritExecutor"))); -/// :nodoc: -- (void)write:(__attribute__((noescape)) void(^)(void))block - onComplete:(void(^)(NSError * _Nullable))onComplete __attribute__((unavailable("Renamed to -update:onComplete."))); - -#pragma mark - Find subscription - -/** - Finds a subscription by the specified name. - - @param name The name used to identify the subscription. - - @return A subscription for the given name. - */ -- (nullable RLMSyncSubscription *)subscriptionWithName:(NSString *)name; - -/** - Finds a subscription by the query for the specified object class name. - - @param objectClassName The class name for the model class to be queried. - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return A subscription for the given query.. - */ -- (nullable RLMSyncSubscription *)subscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (nullable RLMSyncSubscription *)subscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat - args:(va_list)args; - -/** - Finds a subscription by the query for the specified object class name. - - @param objectClassName The class name for the model class to be queried. - @param predicate The predicate used to to filter the objects on the server. - - @return A subscription for the given query.. - */ -- (nullable RLMSyncSubscription *)subscriptionWithClassName:(NSString *)objectClassName - predicate:(NSPredicate *)predicate; - -#pragma mark - Add a Subscription - -/** - Adds a new subscription to the subscription set which will be sent to the server when - committed at the end of a write subscription block. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - */ -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat - args:(va_list)args; - -/** - Adds a new subscription to the subscription set which will be sent to the server when - committed at the end of a write subscription block. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param name The name used the identify the subscription. - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - */ -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - subscriptionName:(NSString *)name - where:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - subscriptionName:(NSString *)name - where:(NSString *)predicateFormat - args:(va_list)args; - -/** - Adds a new subscription to the subscription set which will be sent to the server when - committed at the end of a write subscription block. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param predicate The predicate defining the query for the subscription. - */ -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - predicate:(NSPredicate *)predicate; - -/** - Adds a new subscription to the subscription set which will be sent to the server when - committed at the end of a write subscription block. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param name The name used to identify the subscription. - @param predicate The predicate defining the query for the subscription. - */ -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - subscriptionName:(nullable NSString *)name - predicate:(NSPredicate *)predicate; - -#pragma mark - Remove Subscription - -/** - Removes a subscription with the specified name from the subscription set. - - @warning This method may only be called during a write subscription block. - - @param name The name used the identify the subscription. - */ -- (void)removeSubscriptionWithName:(NSString *)name; - -/** - Removes a subscription with the specified query for the object class from the subscription set. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - */ -- (void)removeSubscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (void)removeSubscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat - args:(va_list)args; - -/** - Removes a subscription with the specified query for the object class from the subscription set. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param predicate The predicate which will be used to identify the subscription to be removed. - */ -- (void)removeSubscriptionWithClassName:(NSString *)objectClassName - predicate:(NSPredicate *)predicate; - -/** - Removes the subscription from the subscription set. - - @warning This method may only be called during a write subscription block. - - @param subscription An instance of the subscription to be removed. - */ -- (void)removeSubscription:(RLMSyncSubscription *)subscription; - -#pragma mark - Remove Subscriptions - -/** - Removes all subscription from the subscription set. - - @warning This method may only be called during a write subscription block. - @warning Removing all subscriptions will result in an error if no new subscription is added. Server should - acknowledge at least one subscription. - */ -- (void)removeAllSubscriptions; - -/** - Removes all subscription with the specified class name. - - @param className The class name for the model class to be queried. - - @warning This method may only be called during a write subscription block. - */ -- (void)removeAllSubscriptionsWithClassName:(NSString *)className; - -#pragma mark - SubscriptionSet Collection - -/** - Returns the subscription at the given `index`. - - @param index The index. - - @return A subscription for the given index in the subscription set. - */ -- (nullable RLMSyncSubscription *)objectAtIndex:(NSUInteger)index; - -/** - Returns the first object in the subscription set list, or `nil` if the subscriptions are empty. - - @return A subscription. - */ -- (nullable RLMSyncSubscription *)firstObject; - -/** - Returns the last object in the subscription set, or `nil` if the subscriptions are empty. - - @return A subscription. - */ -- (nullable RLMSyncSubscription *)lastObject; - -#pragma mark - Subscript - -/** - Returns the subscription at the given `index`. - - @param index The index. - - @return A subscription for the given index in the subscription set. - */ -- (id)objectAtIndexedSubscript:(NSUInteger)index; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMThreadSafeReference.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMThreadSafeReference.h deleted file mode 100644 index 9472942ed..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMThreadSafeReference.h +++ /dev/null @@ -1,107 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMRealm; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - Objects of types which conform to `RLMThreadConfined` can be managed by a Realm, which will make - them bound to a thread-specific `RLMRealm` instance. Managed objects must be explicitly exported - and imported to be passed between threads. - - Managed instances of objects conforming to this protocol can be converted to a thread-safe - reference for transport between threads by passing to the - `+[RLMThreadSafeReference referenceWithThreadConfined:]` constructor. - - Note that only types defined by Realm can meaningfully conform to this protocol, and defining new - classes which attempt to conform to it will not make them work with `RLMThreadSafeReference`. - */ -@protocol RLMThreadConfined -// Conformance to the `RLMThreadConfined_Private` protocol will be enforced at runtime. - -/** - The Realm which manages the object, or `nil` if the object is unmanaged. - - Unmanaged objects are not confined to a thread and cannot be passed to methods expecting a - `RLMThreadConfined` object. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/// Indicates if the object can no longer be accessed because it is now invalid. -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -@end - -/** - An object intended to be passed between threads containing a thread-safe reference to its - thread-confined object. - - To resolve a thread-safe reference on a target Realm on a different thread, pass to - `-[RLMRealm resolveThreadSafeReference:]`. - - @warning A `RLMThreadSafeReference` object must be resolved at most once. - Failing to resolve a `RLMThreadSafeReference` will result in the source version of the - Realm being pinned until the reference is deallocated. - - @note Prefer short-lived `RLMThreadSafeReference`s as the data for the version of the source Realm - will be retained until all references have been resolved or deallocated. - - @see `RLMThreadConfined` - @see `-[RLMRealm resolveThreadSafeReference:]` - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMThreadSafeReference<__covariant Confined : id> : NSObject - -/** - Create a thread-safe reference to the thread-confined object. - - @param threadConfined The thread-confined object to create a thread-safe reference to. - - @note You may continue to use and access the thread-confined object after passing it to this - constructor. - */ -+ (instancetype)referenceWithThreadConfined:(Confined)threadConfined; - -/** - Indicates if the reference can no longer be resolved because an attempt to resolve it has already - occurred. References can only be resolved once. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -#pragma mark - Unavailable Methods - -/** - `-[RLMThreadSafeReference init]` is not available because `RLMThreadSafeReference` cannot be - created directly. `RLMThreadSafeReference` instances must be obtained by calling - `-[RLMRealm resolveThreadSafeReference:]`. - */ -- (instancetype)init __attribute__((unavailable("RLMThreadSafeReference cannot be created directly"))); - -/** - `-[RLMThreadSafeReference new]` is not available because `RLMThreadSafeReference` cannot be - created directly. `RLMThreadSafeReference` instances must be obtained by calling - `-[RLMRealm resolveThreadSafeReference:]`. - */ -+ (instancetype)new __attribute__((unavailable("RLMThreadSafeReference cannot be created directly"))); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMUpdateResult.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMUpdateResult.h deleted file mode 100644 index df0b237e3..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMUpdateResult.h +++ /dev/null @@ -1,45 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectId; -@protocol RLMBSON; - -/// The result of an `updateOne` or `updateMany` operation a `RLMMongoCollection`. -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMUpdateResult : NSObject - -/// The number of documents that matched the filter. -@property (nonatomic, readonly) NSUInteger matchedCount; - -/// The number of documents modified. -@property (nonatomic, readonly) NSUInteger modifiedCount; - -/// The identifier of the inserted document if an upsert took place and the document's primary key is an `ObjectId`. -@property (nonatomic, nullable, readonly) RLMObjectId *objectId -__attribute__((deprecated("Use documentId instead, which support all BSON types", "documentId"))); - -/// The identifier of the inserted document if an upsert took place. -@property (nonatomic, nullable, readonly) id documentId; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMUser.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMUser.h deleted file mode 100644 index 436350f9b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMUser.h +++ /dev/null @@ -1,447 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import -#import -#import - -@class RLMUser, RLMSyncSession, RLMRealm, RLMUserIdentity, RLMAPIKeyAuth, RLMMongoClient, RLMMongoDatabase, RLMMongoCollection, RLMUserProfile; -@protocol RLMBSON; - -/** - The state of the user object. - */ -typedef NS_ENUM(NSUInteger, RLMUserState) { - /// The user is logged out. Call `logInWithCredentials:...` with valid credentials to log the user back in. - RLMUserStateLoggedOut, - /// The user is logged in, and any Realms associated with it are syncing with Atlas App Services. - RLMUserStateLoggedIn, - /// The user has been removed, and cannot be used. - RLMUserStateRemoved -}; - -/// A block type used to report an error related to a specific user. -RLM_SWIFT_SENDABLE -typedef void(^RLMOptionalUserBlock)(RLMUser * _Nullable, NSError * _Nullable); - -/// A block type used to report an error on a network request from the user. -RLM_SWIFT_SENDABLE -typedef void(^RLMUserOptionalErrorBlock)(NSError * _Nullable); - -/// A block which returns a dictionary should there be any custom data set for a user -RLM_SWIFT_SENDABLE -typedef void(^RLMUserCustomDataBlock)(NSDictionary * _Nullable, NSError * _Nullable); - -/// A block type for returning from function calls. -RLM_SWIFT_SENDABLE -typedef void(^RLMCallFunctionCompletionBlock)(id _Nullable, NSError * _Nullable); - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A `RLMUser` instance represents a single Realm App user account. - - A user may have one or more credentials associated with it. These credentials - uniquely identify the user to the authentication provider, and are used to sign - into an Atlas App Services user account. - - Note that user objects are only vended out via SDK APIs, and cannot be directly - initialized. User objects can be accessed from any thread. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // internally thread-safe -@interface RLMUser : NSObject - -/** - The unique Atlas App Services string identifying this user. - Note this is different from an identity: A user may have multiple identities but has a single identifier. See RLMUserIdentity. - */ -@property (nonatomic, readonly) NSString *identifier NS_SWIFT_NAME(id); - -/// Returns an array of identities currently linked to a user. -@property (nonatomic, readonly) NSArray *identities; - -/** - The user's refresh token used to access App Services. - - By default, refresh tokens expire 60 days after they are issued. - You can configure this time for your App's refresh tokens to be - anywhere between 30 minutes and 180 days. - - You can configure the refresh token expiration time for all sessions in - an App from the Admin UI or Admin API. -*/ -@property (nullable, nonatomic, readonly) NSString *refreshToken; - -/** - The user's access token used to access App Services. - - This is required to make HTTP requests to Atlas App Services like the Data API or GraphQL. - It should be treated as sensitive data. - - The Realm SDK automatically manages access tokens and refreshes them - when they expire. - */ -@property (nullable, nonatomic, readonly) NSString *accessToken; - -/** - The current state of the user. - */ -@property (nonatomic, readonly) RLMUserState state; - -/** - Indicates if the user is logged in or not. Returns true if the access token and refresh token are not empty. - */ -@property (nonatomic, readonly) BOOL isLoggedIn; - -#pragma mark - Lifecycle - -/** - Create a partition-based sync configuration instance for the given partition value. - - @param partitionValue The `RLMBSON` value the Realm is partitioned on. - @return A default configuration object with the sync configuration set to use the given partition value. - */ -- (RLMRealmConfiguration *)configurationWithPartitionValue:(nullable id)partitionValue NS_REFINED_FOR_SWIFT; - -/** - Create a partition-based sync configuration instance for the given partition value. - - @param partitionValue The `RLMBSON` value the Realm is partitioned on. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - - @return A configuration object with the sync configuration set to use the given partition value. - */ -- (RLMRealmConfiguration *)configurationWithPartitionValue:(nullable id)partitionValue - clientResetMode:(RLMClientResetMode)clientResetMode NS_REFINED_FOR_SWIFT; - -/** - Create a partition-based sync configuration instance for the given partition value. - - @param partitionValue The `RLMBSON` value the Realm is partitioned on. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param beforeResetBlock A callback which notifies prior to a client reset occurring. See: `RLMClientResetBeforeBlock` - @param afterResetBlock A callback which notifies after a client reset has occurred. See: `RLMClientResetAfterBlock` - - @return A configuration object with the sync configuration set to use the given partition value. - */ -- (RLMRealmConfiguration *)configurationWithPartitionValue:(nullable id)partitionValue - clientResetMode:(RLMClientResetMode)clientResetMode - notifyBeforeReset:(nullable RLMClientResetBeforeBlock)beforeResetBlock - notifyAfterReset:(nullable RLMClientResetAfterBlock)afterResetBlock NS_REFINED_FOR_SWIFT; - -/** - Create a partition-based sync configuration instance for the given partition value. - - @param partitionValue The `RLMBSON` value the Realm is partitioned on. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param manualClientResetHandler An error reporting block that is invoked during a client reset. - @See ``RLMSyncErrorReportingBlock`` and ``RLMClientResetInfo`` - - @return A configuration object with the sync configuration set to use the given partition value. - */ -- (RLMRealmConfiguration *)configurationWithPartitionValue:(nullable id)partitionValue - clientResetMode:(RLMClientResetMode)clientResetMode - manualClientResetHandler:(nullable RLMSyncErrorReportingBlock)manualClientResetHandler NS_REFINED_FOR_SWIFT; - -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @return A ``RLMRealmConfiguration`` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfiguration NS_REFINED_FOR_SWIFT; - -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param beforeResetBlock A callback which notifies prior to a client reset occurring. See: `RLMClientResetBeforeBlock` - @param afterResetBlock A callback which notifies after a client reset has occurred. See: `RLMClientResetAfterBlock` - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithClientResetMode:(RLMClientResetMode)clientResetMode - notifyBeforeReset:(nullable RLMClientResetBeforeBlock)beforeResetBlock - notifyAfterReset:(nullable RLMClientResetAfterBlock)afterResetBlock NS_REFINED_FOR_SWIFT; -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param manualClientResetHandler An error reporting block that is invoked during a client reset. - @See `RLMSyncErrorReportingBlock` and `RLMClientResetInfo` - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithClientResetMode:(RLMClientResetMode)clientResetMode - manualClientResetHandler:(nullable RLMSyncErrorReportingBlock)manualClientResetHandler NS_REFINED_FOR_SWIFT; - -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param initialSubscriptions A block which receives a subscription set instance, that can be - used to add an initial set of subscriptions which will be executed - when the Realm is first opened. - @param rerunOnOpen If true, allows to run the initial set of subscriptions specified, on every app startup. - This can be used to re-run dynamic time ranges and other queries that require a - re-computation of a static variable. - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithInitialSubscriptions:(RLMFlexibleSyncInitialSubscriptionsBlock)initialSubscriptions - rerunOnOpen:(BOOL)rerunOnOpen NS_REFINED_FOR_SWIFT; -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param initialSubscriptions A block which receives a subscription set instance, that can be - used to add an initial set of subscriptions which will be executed - when the Realm is first opened. - @param rerunOnOpen If true, allows to run the initial set of subscriptions specified, on every app startup. - This can be used to re-run dynamic time ranges and other queries that require a - re-computation of a static variable. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param beforeResetBlock A callback which notifies prior to a client reset occurring. See: `RLMClientResetBeforeBlock` - @param afterResetBlock A callback which notifies after a client reset has occurred. See: `RLMClientResetAfterBlock` - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithInitialSubscriptions:(RLMFlexibleSyncInitialSubscriptionsBlock)initialSubscriptions - rerunOnOpen:(BOOL)rerunOnOpen - clientResetMode:(RLMClientResetMode)clientResetMode - notifyBeforeReset:(nullable RLMClientResetBeforeBlock)beforeResetBlock - notifyAfterReset:(nullable RLMClientResetAfterBlock)afterResetBlock NS_REFINED_FOR_SWIFT; - -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param initialSubscriptions A block which receives a subscription set instance, that can be - used to add an initial set of subscriptions which will be executed - when the Realm is first opened. - @param rerunOnOpen If true, allows to run the initial set of subscriptions specified, on every app startup. - This can be used to re-run dynamic time ranges and other queries that require a - re-computation of a static variable. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param manualClientResetHandler An error reporting block that is invoked during a client reset. - @See `RLMSyncErrorReportingBlock` and `RLMClientResetInfo` - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithInitialSubscriptions:(RLMFlexibleSyncInitialSubscriptionsBlock)initialSubscriptions - rerunOnOpen:(BOOL)rerunOnOpen - clientResetMode:(RLMClientResetMode)clientResetMode - manualClientResetHandler:(nullable RLMSyncErrorReportingBlock)manualClientResetHandler NS_REFINED_FOR_SWIFT; - -#pragma mark - Sessions - -/** - Retrieve a valid session object belonging to this user for a given URL, or `nil` - if no such object exists. - */ -- (nullable RLMSyncSession *)sessionForPartitionValue:(id)partitionValue; - -/// Retrieve all the valid sessions belonging to this user. -@property (nonatomic, readonly) NSArray *allSessions; - -#pragma mark - Custom Data - -/** - The custom data of the user. - This is configured in your Atlas App Services app. - */ -@property (nonatomic, readonly) NSDictionary *customData NS_REFINED_FOR_SWIFT; - -/** - The profile of the user. - */ -@property (nonatomic, readonly) RLMUserProfile *profile; - -/** - Refresh a user's custom data. This will, in effect, refresh the user's auth session. - */ -- (void)refreshCustomDataWithCompletion:(RLMUserCustomDataBlock)completion; - -/** - Links the currently authenticated user with a new identity, where the identity is defined by the credential - specified as a parameter. This will only be successful if this `RLMUser` is the currently authenticated - with the client from which it was created. On success a new user will be returned with the new linked credentials. - - @param credentials The `RLMCredentials` used to link the user to a new identity. - @param completion The completion handler to call when the linking is complete. - If the operation is successful, the result will contain a new - `RLMUser` object representing the currently logged in user. -*/ -- (void)linkUserWithCredentials:(RLMCredentials *)credentials - completion:(RLMOptionalUserBlock)completion NS_REFINED_FOR_SWIFT; - -/** - Removes the user - - This logs out and destroys the session related to this user. The completion block will return an error - if the user is not found or is already removed. - - @param completion A callback invoked on completion -*/ -- (void)removeWithCompletion:(RLMUserOptionalErrorBlock)completion; - -/** - Permanently deletes this user from your Atlas App Services app. - - The users state will be set to `Removed` and the session will be destroyed. - If the delete request fails, the local authentication state will be untouched. - - @param completion A callback invoked on completion -*/ -- (void)deleteWithCompletion:(RLMUserOptionalErrorBlock)completion; - -/** - Logs out the current user - - The users state will be set to `Removed` is they are an anonymous user or `LoggedOut` if they are authenticated by an email / password or third party auth clients - If the logout request fails, this method will still clear local authentication state. - - @param completion A callback invoked on completion -*/ -- (void)logOutWithCompletion:(RLMUserOptionalErrorBlock)completion; - -/** - A client for the user API key authentication provider which - can be used to create and modify user API keys. - - This client should only be used by an authenticated user. -*/ -@property (nonatomic, readonly) RLMAPIKeyAuth *apiKeysAuth; - -/// A client for interacting with a remote MongoDB instance -/// @param serviceName The name of the MongoDB service -- (RLMMongoClient *)mongoClientWithServiceName:(NSString *)serviceName NS_REFINED_FOR_SWIFT; - -/** - Calls the Atlas App Services function with the provided name and arguments. - - @param name The name of the Atlas App Services function to be called. - @param arguments The `BSONArray` of arguments to be provided to the function. - @param completion The completion handler to call when the function call is complete. - This handler is executed on a non-main global `DispatchQueue`. -*/ -- (void)callFunctionNamed:(NSString *)name - arguments:(NSArray> *)arguments - completionBlock:(RLMCallFunctionCompletionBlock)completion NS_REFINED_FOR_SWIFT; - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("RLMUser cannot be created directly"))); -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("RLMUser cannot be created directly"))); - -@end - -#pragma mark - User info classes - -/** - An identity of a user. A user can have multiple identities, usually associated with multiple providers. - Note this is different from a user's unique identifier string. - @seeAlso `RLMUser.identifier` - */ -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMUserIdentity : NSObject - -/** - The associated provider type - */ -@property (nonatomic, readonly) NSString *providerType; - -/** - The string which identifies the RLMUserIdentity - */ -@property (nonatomic, readonly) NSString *identifier; - -/** - Initialize an RLMUserIdentity for the given identifier and provider type. - @param providerType the associated provider type - @param identifier the identifier of the identity - */ -- (instancetype)initUserIdentityWithProviderType:(NSString *)providerType - identifier:(NSString *)identifier; - -@end - -/** - A profile for a given User. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMUserProfile : NSObject - -/// The full name of the user. -@property (nonatomic, readonly, nullable) NSString *name; -/// The email address of the user. -@property (nonatomic, readonly, nullable) NSString *email; -/// A URL to the user's profile picture. -@property (nonatomic, readonly, nullable) NSString *pictureURL; -/// The first name of the user. -@property (nonatomic, readonly, nullable) NSString *firstName; -/// The last name of the user. -@property (nonatomic, readonly, nullable) NSString *lastName; -/// The gender of the user. -@property (nonatomic, readonly, nullable) NSString *gender; -/// The birthdate of the user. -@property (nonatomic, readonly, nullable) NSString *birthday; -/// The minimum age of the user. -@property (nonatomic, readonly, nullable) NSString *minAge; -/// The maximum age of the user. -@property (nonatomic, readonly, nullable) NSString *maxAge; -/// The BSON dictionary of metadata associated with this user. -@property (nonatomic, readonly) NSDictionary *metadata NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMUserAPIKey.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMUserAPIKey.h deleted file mode 100644 index 2cdd82b2a..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMUserAPIKey.h +++ /dev/null @@ -1,43 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// UserAPIKey model for APIKeys recevied from the server. -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMUserAPIKey : NSObject - -/// Indicates if the API key is disabled or not -@property (nonatomic, readonly) BOOL disabled; - -/// The name of the key. -@property (nonatomic, readonly) NSString *name; - -/// The actual key. Will only be included in -/// the response when an API key is first created. -@property (nonatomic, readonly, nullable) NSString *key; - -/// The ObjectId of the API key -@property (nonatomic, readonly) RLMObjectId *objectId NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMValue.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMValue.h deleted file mode 100644 index ac1f10ee4..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/RLMValue.h +++ /dev/null @@ -1,97 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import -#import -#import -#import -#import - -#pragma mark RLMValue - -/** - RLMValue is a property type which represents a polymorphic Realm value. This is similar to the usage of - `AnyObject` / `Any` in Swift. -``` - // A property on `MyObject` - @property (nonatomic) id myAnyValue; - - // A property on `AnotherObject` - @property (nonatomic) id myAnyValue; - - MyObject *myObject = [MyObject createInRealm:realm withValue:@[]]; - myObject.myAnyValue = @1234; // underlying type is NSNumber. - myObject.myAnyValue = @"hello"; // underlying type is NSString. - AnotherObject *anotherObject = [AnotherObject createInRealm:realm withValue:@[]]; - myObject.myAnyValue = anotherObject; // underlying type is RLMObject. -``` - The following types conform to RLMValue: - - `NSData` - `NSDate` - `NSNull` - `NSNumber` - `NSUUID` - `NSString` - `RLMObject - `RLMObjectId` - `RLMDecimal128` - */ -@protocol RLMValue - -/// Describes the type of property stored. -@property (readonly) RLMPropertyType rlm_valueType; - -@end - -/// :nodoc: -@interface NSNull (RLMValue) -@end - -/// :nodoc: -@interface NSNumber (RLMValue) -@end - -/// :nodoc: -@interface NSString (RLMValue) -@end - -/// :nodoc: -@interface NSData (RLMValue) -@end - -/// :nodoc: -@interface NSDate (RLMValue) -@end - -/// :nodoc: -@interface NSUUID (RLMValue) -@end - -/// :nodoc: -@interface RLMDecimal128 (RLMValue) -@end - -/// :nodoc: -@interface RLMObjectBase (RLMValue) -@end - -/// :nodoc: -@interface RLMObjectId (RLMValue) -@end diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/Realm.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/Realm.h deleted file mode 100644 index 245596393..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Headers/Realm.h +++ /dev/null @@ -1,63 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import - -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Info.plist b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Info.plist deleted file mode 100644 index e830776f7..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Info.plist and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/LICENSE b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/LICENSE deleted file mode 100644 index 66a27ec5f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/LICENSE +++ /dev/null @@ -1,177 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Modules/module.modulemap b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Modules/module.modulemap deleted file mode 100644 index 519ddc20b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Modules/module.modulemap +++ /dev/null @@ -1,88 +0,0 @@ -framework module Realm { - export Foundation - - umbrella header "Realm.h" - - header "RLMArray.h" - header "RLMAsymmetricObject.h" - header "RLMDecimal128.h" - header "RLMDictionary.h" - header "RLMEmbeddedObject.h" - header "RLMLogger.h" - header "RLMMigration.h" - header "RLMObject.h" - header "RLMObjectId.h" - header "RLMObjectSchema.h" - header "RLMProperty.h" - header "RLMProviderClient.h" - header "RLMRealm+Sync.h" - header "RLMRealm.h" - header "RLMRealmConfiguration.h" - header "RLMResults.h" - header "RLMSchema.h" - header "RLMSectionedResults.h" - header "RLMSet.h" - header "RLMValue.h" - - header "RLMApp.h" - header "RLMCredentials.h" - header "RLMNetworkTransport.h" - header "RLMPushClient.h" - header "RLMRealm+Sync.h" - header "RLMSyncConfiguration.h" - header "RLMSyncManager.h" - header "RLMSyncSession.h" - header "RLMUser.h" - header "RLMUserAPIKey.h" - header "RLMAPIKeyAuth.h" - header "RLMEmailPasswordAuth.h" - header "NSError+RLMSync.h" - header "RLMBSON.h" - header "RLMMongoClient.h" - header "RLMMongoDatabase.h" - header "RLMMongoCollection.h" - header "RLMUpdateResult.h" - header "RLMFindOptions.h" - header "RLMFindOneAndModifyOptions.h" - header "RLMSyncSubscription.h" - - explicit module Private { - header "RLMAccessor.h" - header "RLMApp_Private.h" - header "RLMArray_Private.h" - header "RLMAsyncTask_Private.h" - header "RLMCollection_Private.h" - header "RLMDictionary_Private.h" - header "RLMLogger_Private.h" - header "RLMEvent.h" - header "RLMMongoCollection_Private.h" - header "RLMObjectBase_Dynamic.h" - header "RLMObjectBase_Private.h" - header "RLMObjectSchema_Private.h" - header "RLMObjectStore.h" - header "RLMObject_Private.h" - header "RLMProperty_Private.h" - header "RLMRealmConfiguration_Private.h" - header "RLMRealm_Private.h" - header "RLMResults_Private.h" - header "RLMScheduler.h" - header "RLMSchema_Private.h" - header "RLMSectionedResults.h" - header "RLMSet_Private.h" - header "RLMSwiftCollectionBase.h" - header "RLMSwiftProperty.h" - header "RLMSwiftValueStorage.h" - header "RLMSyncConfiguration_Private.h" - header "RLMSyncSubscription_Private.h" - header "RLMUser_Private.h" - } - - explicit module Dynamic { - header "RLMRealm_Dynamic.h" - header "RLMObjectBase_Dynamic.h" - } - - explicit module Swift { - header "RLMSwiftObject.h" - } -} diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMAccessor.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMAccessor.h deleted file mode 100644 index db915ca7c..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMAccessor.h +++ /dev/null @@ -1,53 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectSchema, RLMProperty, RLMObjectBase; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -// -// Accessors Class Creation/Caching -// - -// get accessor classes for an object class - generates classes if not cached -Class RLMManagedAccessorClassForObjectClass(Class objectClass, RLMObjectSchema *schema, const char *name); -Class RLMUnmanagedAccessorClassForObjectClass(Class objectClass, RLMObjectSchema *schema); - -// -// Dynamic getters/setters -// -FOUNDATION_EXTERN void RLMDynamicValidatedSet(RLMObjectBase *obj, NSString *propName, id __nullable val); -FOUNDATION_EXTERN id __nullable RLMDynamicGet(RLMObjectBase *obj, RLMProperty *prop); -FOUNDATION_EXTERN id __nullable RLMDynamicGetByName(RLMObjectBase *obj, NSString *propName); - -// by property/column -void RLMDynamicSet(RLMObjectBase *obj, RLMProperty *prop, id val); - -// -// Class modification -// - -// Replace className method for the given class -void RLMReplaceClassNameMethod(Class accessorClass, NSString *className); - -// Replace sharedSchema method for the given class -void RLMReplaceSharedSchemaMethod(Class accessorClass, RLMObjectSchema * __nullable schema); - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMApp_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMApp_Private.h deleted file mode 100644 index 5da5c3c7a..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMApp_Private.h +++ /dev/null @@ -1,50 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// Observer block for app notifications. -typedef void(^RLMAppNotificationBlock)(RLMApp *); - -/// Token that identifies an observer. Unsubscribes when deconstructed to -/// avoid dangling observers, therefore this must be retained to hold -/// onto a subscription. -@interface RLMAppSubscriptionToken : NSObject -- (void)unsubscribe; -@end - -@interface RLMApp () -/// Returns all currently cached Apps -+ (NSArray *)allApps; -/// Subscribe to notifications for this RLMApp. -- (RLMAppSubscriptionToken *)subscribe:(RLMAppNotificationBlock)block; - -+ (instancetype)appWithConfiguration:(RLMAppConfiguration *)configuration; - -+ (void)resetAppCache; -@end - -@interface RLMAppConfiguration () -@property (nonatomic) NSString *appId; -@property (nonatomic) BOOL encryptMetadata; -@property (nonatomic) NSURL *rootDirectory; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMArray_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMArray_Private.h deleted file mode 100644 index 1a37f010e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMArray_Private.h +++ /dev/null @@ -1,44 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -@class RLMObjectBase, RLMProperty; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMArray () -- (instancetype)initWithObjectClassName:(NSString *)objectClassName; -- (instancetype)initWithObjectType:(RLMPropertyType)type optional:(BOOL)optional; -- (NSString *)descriptionWithMaxDepth:(NSUInteger)depth; -- (void)setParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -- (void)replaceAllObjectsWithObjects:(NSArray *)objects; -// YES if the property is declared with old property syntax. -@property (nonatomic, readonly) BOOL isLegacyProperty; -// The name of the property which this collection represents -@property (nonatomic, readonly) NSString *propertyKey; -@end - -@interface RLMManagedArray : RLMArray -- (instancetype)initWithParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -@end - -void RLMArrayValidateMatchingObjectType(RLMArray *array, id value); - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMAsyncTask_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMAsyncTask_Private.h deleted file mode 100644 index 3cce89441..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMAsyncTask_Private.h +++ /dev/null @@ -1,71 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import "RLMRealm_Private.h" - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMAsyncOpenTask () -@property (nonatomic, nullable) RLMRealm *localRealm; - -- (instancetype)initWithConfiguration:(RLMRealmConfiguration *)configuration - confinedTo:(RLMScheduler *)confinement - download:(bool)waitForDownloadCompletion - completion:(RLMAsyncOpenRealmCallback)completion -__attribute__((objc_direct)); - -- (instancetype)initWithConfiguration:(RLMRealmConfiguration *)configuration - confinedTo:(RLMScheduler *)confinement - download:(bool)waitForDownloadCompletion; - -- (void)waitWithCompletion:(void (^)(NSError *_Nullable))completion; -- (void)waitForOpen:(RLMAsyncOpenRealmCallback)completion __attribute__((objc_direct)); -@end - -// A cancellable task for waiting for downloads on an already-open Realm. -RLM_SWIFT_SENDABLE -@interface RLMAsyncDownloadTask : NSObject -- (instancetype)initWithRealm:(RLMRealm *)realm; -- (void)cancel; -- (void)waitWithCompletion:(void (^)(NSError *_Nullable))completion; -@end - -// A cancellable task for beginning an async write -RLM_SWIFT_SENDABLE -@interface RLMAsyncWriteTask : NSObject -// Must only be called from within the Actor -- (instancetype)initWithRealm:(RLMRealm *)realm; -- (void)setTransactionId:(RLMAsyncTransactionId)transactionID; -- (void)complete:(bool)cancel; - -// Can be called from any thread -- (void)wait:(void (^)(void))completion; -@end - -typedef void (^RLMAsyncRefreshCompletion)(bool); -// A cancellable task for refreshing a Realm -RLM_SWIFT_SENDABLE -@interface RLMAsyncRefreshTask : NSObject -- (void)complete:(bool)didRefresh; -- (void)wait:(RLMAsyncRefreshCompletion)completion; -+ (RLMAsyncRefreshTask *)completedRefresh; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMBSON_Private.hpp b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMBSON_Private.hpp deleted file mode 100644 index c5cc1a410..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMBSON_Private.hpp +++ /dev/null @@ -1,32 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -namespace realm::bson { -class Bson; -template class IndexedMap; -using BsonDocument = IndexedMap; -} - -realm::bson::Bson RLMConvertRLMBSONToBson(id b); -realm::bson::BsonDocument RLMConvertRLMBSONArrayToBsonDocument(NSArray> *array); -id RLMConvertBsonToRLMBSON(const realm::bson::Bson& b); -id RLMConvertBsonDocumentToRLMBSON(std::optional b); -NSArray> *RLMConvertBsonDocumentToRLMBSONArray(std::optional b); diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMCollection_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMCollection_Private.h deleted file mode 100644 index 7d31bd3f0..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMCollection_Private.h +++ /dev/null @@ -1,42 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@protocol RLMCollectionPrivate; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -NSUInteger RLMUnmanagedFastEnumerate(id collection, NSFastEnumerationState *); -void RLMCollectionSetValueForKey(id collection, NSString *key, id _Nullable value); -FOUNDATION_EXTERN NSString *RLMDescriptionWithMaxDepth(NSString *name, id collection, NSUInteger depth); -FOUNDATION_EXTERN void RLMAssignToCollection(id collection, id value); -FOUNDATION_EXTERN void RLMSetSwiftBridgeCallback(id _Nullable (*_Nonnull)(id)); - -FOUNDATION_EXTERN -RLMNotificationToken *RLMAddNotificationBlock(id collection, id block, - NSArray *_Nullable keyPaths, - dispatch_queue_t _Nullable queue); - -typedef RLM_CLOSED_ENUM(int32_t, RLMCollectionType) { - RLMCollectionTypeArray = 0, - RLMCollectionTypeSet = 1, - RLMCollectionTypeDictionary = 2 -}; - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMDictionary_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMDictionary_Private.h deleted file mode 100644 index 37ff740c7..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMDictionary_Private.h +++ /dev/null @@ -1,46 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectBase, RLMProperty; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMDictionary () -- (instancetype)initWithObjectClassName:(NSString *)objectClassName keyType:(RLMPropertyType)keyType; -- (instancetype)initWithObjectType:(RLMPropertyType)type optional:(BOOL)optional keyType:(RLMPropertyType)keyType; -- (NSString *)descriptionWithMaxDepth:(NSUInteger)depth; -- (void)setParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -// YES if the property is declared with old property syntax. -@property (nonatomic, readonly) BOOL isLegacyProperty; -// The name of the property which this collection represents -@property (nonatomic, readonly) NSString *propertyKey; -@end - -@interface RLMManagedDictionary : RLMDictionary -- (instancetype)initWithParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -@end - -FOUNDATION_EXTERN NSString *RLMDictionaryDescriptionWithMaxDepth(NSString *name, - RLMDictionary *dictionary, - NSUInteger depth); -id RLMDictionaryKey(RLMDictionary *dictionary, id key) RLM_HIDDEN; -id RLMDictionaryValue(RLMDictionary *dictionary, id value) RLM_HIDDEN; - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMEvent.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMEvent.h deleted file mode 100644 index 9a6acb1a6..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMEvent.h +++ /dev/null @@ -1,64 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2022 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#ifdef __cplusplus -#include - -namespace realm { -struct AuditConfig; -} -#endif - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMRealm, RLMUser, RLMRealmConfiguration; -typedef RLM_CLOSED_ENUM(NSUInteger, RLMSyncLogLevel); - -struct RLMEventContext; -typedef void (^RLMEventCompletion)(NSError *_Nullable); - -FOUNDATION_EXTERN struct RLMEventContext *_Nullable RLMEventGetContext(RLMRealm *realm); -FOUNDATION_EXTERN uint64_t RLMEventBeginScope(struct RLMEventContext *context, NSString *activity); -FOUNDATION_EXTERN void RLMEventCommitScope(struct RLMEventContext *context, uint64_t scope_id, - RLMEventCompletion _Nullable completion); -FOUNDATION_EXTERN void RLMEventCancelScope(struct RLMEventContext *context, uint64_t scope_id); -FOUNDATION_EXTERN bool RLMEventIsActive(struct RLMEventContext *context, uint64_t scope_id); -FOUNDATION_EXTERN void RLMEventRecordEvent(struct RLMEventContext *context, NSString *activity, - NSString *_Nullable event, NSString *_Nullable data, - RLMEventCompletion _Nullable completion); -FOUNDATION_EXTERN void RLMEventUpdateMetadata(struct RLMEventContext *context, - NSDictionary *newMetadata); - -@interface RLMEventConfiguration : NSObject -@property (nonatomic) NSString *partitionPrefix; -@property (nonatomic, nullable) RLMUser *syncUser; -@property (nonatomic, nullable) NSDictionary *metadata; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" -@property (nonatomic, nullable) void (^logger)(RLMSyncLogLevel, NSString *); -#pragma clang diagnostic pop -@property (nonatomic, nullable) RLM_SWIFT_SENDABLE void (^errorHandler)(NSError *); - -#ifdef __cplusplus -- (std::shared_ptr)auditConfigWithRealmConfiguration:(RLMRealmConfiguration *)realmConfig; -#endif -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMLogger_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMLogger_Private.h deleted file mode 100644 index 08f8c591e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMLogger_Private.h +++ /dev/null @@ -1,36 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMLogger() - -/** - Log a message to the supplied level. - - @param logLevel The log level for the message. - @param message The message to log. - */ -- (void)logWithLevel:(RLMLogLevel)logLevel message:(NSString *)message, ... NS_SWIFT_UNAVAILABLE(""); -- (void)logLevel:(RLMLogLevel)logLevel message:(NSString *)message; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMMigration_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMMigration_Private.h deleted file mode 100644 index 393f41184..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMMigration_Private.h +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import -#import - -namespace realm { - class Schema; -} - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMMigration () - -@property (nonatomic, strong) RLMRealm *oldRealm; -@property (nonatomic, strong) RLMRealm *realm; - -- (instancetype)initWithRealm:(RLMRealm *)realm oldRealm:(RLMRealm *)oldRealm schema:(realm::Schema &)schema; - -- (void)execute:(RLMMigrationBlock)block objectClass:(_Nullable Class)cls; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMMongoCollection_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMMongoCollection_Private.h deleted file mode 100644 index 77bbf9752..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMMongoCollection_Private.h +++ /dev/null @@ -1,37 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@class RLMUser; - -@interface RLMMongoCollection () -- (instancetype)initWithUser:(RLMUser *)user - serviceName:(NSString *)serviceName - databaseName:(NSString *)databaseName - collectionName:(NSString *)collectionName; - -- (RLMChangeStream *)watchWithMatchFilter:(nullable id)matchFilter - idFilter:(nullable id)idFilter - delegate:(id)delegate - scheduler:(void (^)(dispatch_block_t))scheduler; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMObjectBase_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMObjectBase_Private.h deleted file mode 100644 index af547b17e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMObjectBase_Private.h +++ /dev/null @@ -1,34 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2017 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMArray; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -// RLMObjectBase private -@interface RLMObjectBase () -@property (nonatomic, nullable) NSMutableArray *lastAccessedNames; - -+ (void)initializeLinkedObjectSchemas; -+ (bool)isEmbedded; -+ (bool)isAsymmetric; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMObjectSchema_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMObjectSchema_Private.h deleted file mode 100644 index 08855a82b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMObjectSchema_Private.h +++ /dev/null @@ -1,75 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -// RLMObjectSchema private -@interface RLMObjectSchema () { -@public - bool _isSwiftClass; -} - -/// The object type name reported to the object store and core. -@property (nonatomic, readonly) NSString *objectName; - -// writable redeclaration -@property (nonatomic, readwrite, copy) NSArray *properties; -@property (nonatomic, readwrite, assign) bool isSwiftClass; -@property (nonatomic, readwrite, assign) BOOL isEmbedded; -@property (nonatomic, readwrite, assign) BOOL isAsymmetric; - -// class used for this object schema -@property (nonatomic, readwrite, assign) Class objectClass; -@property (nonatomic, readwrite, assign) Class accessorClass; -@property (nonatomic, readwrite, assign) Class unmanagedClass; - -@property (nonatomic, readwrite, assign) bool hasCustomEventSerialization; - -@property (nonatomic, readwrite, nullable) RLMProperty *primaryKeyProperty; - -@property (nonatomic, copy) NSArray *computedProperties; -@property (nonatomic, readonly, nullable) NSArray *swiftGenericProperties; - -// returns a cached or new schema for a given object class -+ (instancetype)schemaForObjectClass:(Class)objectClass; -@end - -@interface RLMObjectSchema (Dynamic) -/** - This method is useful only in specialized circumstances, for example, when accessing objects - in a Realm produced externally. If you are simply building an app on Realm, it is not recommended - to use this method as an [RLMObjectSchema](RLMObjectSchema) is generated automatically for every [RLMObject](RLMObject) subclass. - - Initialize an RLMObjectSchema with classname, objectClass, and an array of properties - - @warning This method is useful only in specialized circumstances. - - @param objectClassName The name of the class used to refer to objects of this type. - @param objectClass The Objective-C class used when creating instances of this type. - @param properties An array of RLMProperty instances describing the managed properties for this type. - - @return An initialized instance of RLMObjectSchema. - */ -- (instancetype)initWithClassName:(NSString *)objectClassName objectClass:(Class)objectClass properties:(NSArray *)properties; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMObjectStore.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMObjectStore.h deleted file mode 100644 index 6045f1e8e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMObjectStore.h +++ /dev/null @@ -1,98 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#ifdef __cplusplus -extern "C" { -#endif - -@class RLMRealm, RLMSchema, RLMObjectBase, RLMResults, RLMProperty; - -typedef NS_ENUM(NSUInteger, RLMUpdatePolicy) { - RLMUpdatePolicyError = 1, - RLMUpdatePolicyUpdateChanged = 3, - RLMUpdatePolicyUpdateAll = 2, -}; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -void RLMVerifyHasPrimaryKey(Class cls); - -void RLMVerifyInWriteTransaction(RLMRealm *const realm); - -// -// Adding, Removing, Getting Objects -// - -// add an object to the given realm -void RLMAddObjectToRealm(RLMObjectBase *object, RLMRealm *realm, RLMUpdatePolicy); - -// delete an object from its realm -void RLMDeleteObjectFromRealm(RLMObjectBase *object, RLMRealm *realm); - -// deletes all objects from a realm -void RLMDeleteAllObjectsFromRealm(RLMRealm *realm); - -// get objects of a given class -RLMResults *RLMGetObjects(RLMRealm *realm, NSString *objectClassName, NSPredicate * _Nullable predicate) -NS_RETURNS_RETAINED; - -// get an object with the given primary key -id _Nullable RLMGetObject(RLMRealm *realm, NSString *objectClassName, id _Nullable key) NS_RETURNS_RETAINED; - -// create object from array or dictionary -RLMObjectBase *RLMCreateObjectInRealmWithValue(RLMRealm *realm, NSString *className, - id _Nullable value, RLMUpdatePolicy updatePolicy) -NS_RETURNS_RETAINED; - -// creates an asymmetric object and doesn't return -void RLMCreateAsymmetricObjectInRealm(RLMRealm *realm, NSString *className, id value); - -// -// Accessor Creation -// - - -// Perform the per-property accessor initialization for a managed RealmSwiftObject -// promotingExisting should be true if the object was previously used as an -// unmanaged object, and false if it is a newly created object. -void RLMInitializeSwiftAccessor(RLMObjectBase *object, bool promotingExisting); - -#ifdef __cplusplus -} - -namespace realm { - class Obj; - class Table; - struct ColKey; - struct ObjLink; -} -class RLMClassInfo; - -// get an object with a given table & object key -RLMObjectBase *RLMObjectFromObjLink(RLMRealm *realm, - realm::ObjLink&& objLink, - bool parentIsSwiftObject) NS_RETURNS_RETAINED; - -// Create accessors -RLMObjectBase *RLMCreateObjectAccessor(RLMClassInfo& info, int64_t key) NS_RETURNS_RETAINED; -RLMObjectBase *RLMCreateObjectAccessor(RLMClassInfo& info, const realm::Obj& obj) NS_RETURNS_RETAINED; -#endif - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMObject_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMObject_Private.h deleted file mode 100644 index 8ccdbf576..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMObject_Private.h +++ /dev/null @@ -1,110 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMProperty, RLMArray, RLMSchema; -typedef NS_ENUM(int32_t, RLMPropertyType); - -FOUNDATION_EXTERN void RLMInitializeWithValue(RLMObjectBase *, id, RLMSchema *); - -typedef void (^RLMObjectNotificationCallback)(RLMObjectBase *_Nullable object, - NSArray *_Nullable propertyNames, - NSArray *_Nullable oldValues, - NSArray *_Nullable newValues, - NSError *_Nullable error); - -// RLMObject accessor and read/write realm -@interface RLMObjectBase () { -@public - RLMRealm *_realm; - __unsafe_unretained RLMObjectSchema *_objectSchema; -} - -// shared schema for this class -+ (nullable RLMObjectSchema *)sharedSchema; - -+ (nullable NSArray *)_getProperties; -+ (bool)_realmIgnoreClass; - -// This enables to override the propertiesMapping in Swift, it is not to be used in Objective-C API. -+ (NSDictionary *)propertiesMapping; -@end - -@interface RLMDynamicObject : RLMObject - -@end - -// Calls valueForKey: and re-raises NSUndefinedKeyExceptions -FOUNDATION_EXTERN id _Nullable RLMValidatedValueForProperty(id object, NSString *key, NSString *className); - -// Compare two RLObjectBases -FOUNDATION_EXTERN BOOL RLMObjectBaseAreEqual(RLMObjectBase * _Nullable o1, RLMObjectBase * _Nullable o2); - -FOUNDATION_EXTERN RLMNotificationToken *RLMObjectBaseAddNotificationBlock(RLMObjectBase *obj, - NSArray *_Nullable keyPaths, - dispatch_queue_t _Nullable queue, - RLMObjectNotificationCallback block); - -RLMNotificationToken *RLMObjectAddNotificationBlock(RLMObjectBase *obj, - RLMObjectChangeBlock block, - NSArray *_Nullable keyPaths, - dispatch_queue_t _Nullable queue); - -// Returns whether the class is a descendent of RLMObjectBase -FOUNDATION_EXTERN BOOL RLMIsObjectOrSubclass(Class klass); - -// Returns whether the class is an indirect descendant of RLMObjectBase -FOUNDATION_EXTERN BOOL RLMIsObjectSubclass(Class klass); - -FOUNDATION_EXTERN const NSUInteger RLMDescriptionMaxDepth; - -FOUNDATION_EXTERN id RLMObjectFreeze(RLMObjectBase *obj) NS_RETURNS_RETAINED; - -FOUNDATION_EXTERN id RLMObjectThaw(RLMObjectBase *obj); - -// Gets an object identifier suitable for use with Combine. This value may -// change when an unmanaged object is added to the Realm. -FOUNDATION_EXTERN uint64_t RLMObjectBaseGetCombineId(RLMObjectBase *); - -// An accessor object which is used to interact with Swift properties from obj-c -@interface RLMManagedPropertyAccessor : NSObject -// Perform any initialization required for KVO on a *unmanaged* object -+ (void)observe:(RLMProperty *)property on:(RLMObjectBase *)parent; -// Initialize the given property on a *managed* object which previous was unmanaged -+ (void)promote:(RLMProperty *)property on:(RLMObjectBase *)parent; -// Initialize the given property on a newly created *managed* object -+ (void)initialize:(RLMProperty *)property on:(RLMObjectBase *)parent; -// Read the value of the property, on either kind of object -+ (id)get:(RLMProperty *)property on:(RLMObjectBase *)parent; -// Set the property to the given value, on either kind of object -+ (void)set:(RLMProperty *)property on:(RLMObjectBase *)parent to:(id)value; -@end - -@interface RLMObjectNotificationToken : RLMNotificationToken -- (void)observe:(RLMObjectBase *)obj - keyPaths:(nullable NSArray *)keyPaths - block:(RLMObjectNotificationCallback)block; -- (void)registrationComplete:(void (^)(void))completion; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMProperty_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMProperty_Private.h deleted file mode 100644 index 6a87ced63..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMProperty_Private.h +++ /dev/null @@ -1,139 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -@class RLMObjectBase; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -BOOL RLMPropertyTypeIsComputed(RLMPropertyType propertyType); -FOUNDATION_EXTERN void RLMValidateSwiftPropertyName(NSString *name); - -// Translate an rlmtype to a string representation -static inline NSString *RLMTypeToString(RLMPropertyType type) { - switch (type) { - case RLMPropertyTypeString: - return @"string"; - case RLMPropertyTypeInt: - return @"int"; - case RLMPropertyTypeBool: - return @"bool"; - case RLMPropertyTypeDate: - return @"date"; - case RLMPropertyTypeData: - return @"data"; - case RLMPropertyTypeDouble: - return @"double"; - case RLMPropertyTypeFloat: - return @"float"; - case RLMPropertyTypeAny: - return @"mixed"; - case RLMPropertyTypeObject: - return @"object"; - case RLMPropertyTypeLinkingObjects: - return @"linking objects"; - case RLMPropertyTypeDecimal128: - return @"decimal128"; - case RLMPropertyTypeObjectId: - return @"object id"; - case RLMPropertyTypeUUID: - return @"uuid"; - } - return @"Unknown"; -} - -// private property interface -@interface RLMProperty () { -@public - RLMPropertyType _type; -} - -- (instancetype)initWithName:(NSString *)name - indexed:(BOOL)indexed - linkPropertyDescriptor:(nullable RLMPropertyDescriptor *)linkPropertyDescriptor - property:(objc_property_t)property; - -- (instancetype)initSwiftPropertyWithName:(NSString *)name - indexed:(BOOL)indexed - linkPropertyDescriptor:(nullable RLMPropertyDescriptor *)linkPropertyDescriptor - property:(objc_property_t)property - instance:(RLMObjectBase *)objectInstance; - -- (void)updateAccessors; - -// private setters -@property (nonatomic, readwrite) NSString *name; -@property (nonatomic, readwrite, assign) RLMPropertyType type; -@property (nonatomic, readwrite) BOOL indexed; -@property (nonatomic, readwrite) BOOL optional; -@property (nonatomic, readwrite) BOOL array; -@property (nonatomic, readwrite) BOOL set; -@property (nonatomic, readwrite) BOOL dictionary; -@property (nonatomic, copy, nullable) NSString *objectClassName; -@property (nonatomic, copy, nullable) NSString *linkOriginPropertyName; - -// private properties -@property (nonatomic, readwrite, nullable) NSString *columnName; -@property (nonatomic, assign) NSUInteger index; -@property (nonatomic, assign) BOOL isPrimary; -@property (nonatomic, assign) BOOL isLegacy; -@property (nonatomic, assign) ptrdiff_t swiftIvar; -@property (nonatomic, assign, nullable) Class swiftAccessor; -@property (nonatomic, readwrite, assign) RLMPropertyType dictionaryKeyType; -@property (nonatomic, readwrite) BOOL customMappingIsOptional; - -// getter and setter names -@property (nonatomic, copy) NSString *getterName; -@property (nonatomic, copy) NSString *setterName; -@property (nonatomic, nullable) SEL getterSel; -@property (nonatomic, nullable) SEL setterSel; - -- (RLMProperty *)copyWithNewName:(NSString *)name; -- (NSString *)typeName; - -@end - -@interface RLMProperty (Dynamic) -/** - This method is useful only in specialized circumstances, for example, in conjunction with - +[RLMObjectSchema initWithClassName:objectClass:properties:]. If you are simply building an - app on Realm, it is not recommended to use this method. - - Initialize an RLMProperty - - @warning This method is useful only in specialized circumstances. - - @param name The property name. - @param type The property type. - @param objectClassName The object type used for Object and Array types. - @param linkOriginPropertyName The property name of the origin of a link. Used for linking objects properties. - - @return An initialized instance of RLMProperty. - */ -- (instancetype)initWithName:(NSString *)name - type:(RLMPropertyType)type - objectClassName:(nullable NSString *)objectClassName - linkOriginPropertyName:(nullable NSString *)linkOriginPropertyName - indexed:(BOOL)indexed - optional:(BOOL)optional; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMPushClient_Private.hpp b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMPushClient_Private.hpp deleted file mode 100644 index 44304c9c3..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMPushClient_Private.hpp +++ /dev/null @@ -1,28 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import "RLMPushClient.h" - -namespace realm::app { -class PushClient; -} - -RLM_DIRECT_MEMBERS -@interface RLMPushClient () -- (instancetype)initWithPushClient:(realm::app::PushClient&&)pushClient; -@end diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMRealmConfiguration_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMRealmConfiguration_Private.h deleted file mode 100644 index 12b09676d..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMRealmConfiguration_Private.h +++ /dev/null @@ -1,52 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2015 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMSchema, RLMEventConfiguration; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMRealmConfiguration () - -@property (nonatomic, readwrite) bool cache; -@property (nonatomic, readwrite) bool dynamic; -@property (nonatomic, readwrite) bool disableFormatUpgrade; -@property (nonatomic, copy, nullable) RLMSchema *customSchema; -@property (nonatomic, copy) NSString *pathOnDisk; -@property (nonatomic, retain, nullable) RLMEventConfiguration *eventConfiguration; -@property (nonatomic, nullable) Class migrationObjectClass; -@property (nonatomic) bool disableAutomaticChangeNotifications; - -// Flexible Sync -@property (nonatomic, readwrite, nullable) RLMFlexibleSyncInitialSubscriptionsBlock initialSubscriptions; -@property (nonatomic, readwrite) BOOL rerunOnOpen; - -// Get the default configuration without copying it -+ (RLMRealmConfiguration *)rawDefaultConfiguration; - -+ (void)resetRealmConfigurationState; - -- (void)setCustomSchemaWithoutCopying:(nullable RLMSchema *)schema; -@end - -// Get a path in the platform-appropriate documents directory with the given filename -FOUNDATION_EXTERN NSString *RLMRealmPathForFile(NSString *fileName); -FOUNDATION_EXTERN NSString *RLMRealmPathForFileAndBundleIdentifier(NSString *fileName, NSString *mainBundleIdentifier); - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMRealm_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMRealm_Private.h deleted file mode 100644 index 95841491f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMRealm_Private.h +++ /dev/null @@ -1,94 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMFastEnumerator, RLMScheduler, RLMAsyncRefreshTask, RLMAsyncWriteTask; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -// Disable syncing files to disk. Cannot be re-enabled. Use only for tests. -FOUNDATION_EXTERN void RLMDisableSyncToDisk(void); -// Set whether the skip backup attribute should be set on temporary files. -FOUNDATION_EXTERN void RLMSetSkipBackupAttribute(bool value); - -FOUNDATION_EXTERN NSData * _Nullable RLMRealmValidatedEncryptionKey(NSData *key); - -// Set the queue used for async open. For testing purposes only. -FOUNDATION_EXTERN void RLMSetAsyncOpenQueue(dispatch_queue_t queue); - -// Translate an in-flight exception resulting from an operation on a SharedGroup to -// an NSError or NSException (if error is nil) -void RLMRealmTranslateException(NSError **error); - -// Block until the Realm at the given path is closed. -FOUNDATION_EXTERN void RLMWaitForRealmToClose(NSString *path); -BOOL RLMIsRealmCachedAtPath(NSString *path); - -// Register a block to be called from the next before_notify() invocation -FOUNDATION_EXTERN void RLMAddBeforeNotifyBlock(RLMRealm *realm, dispatch_block_t block); - -// Test hook to run the async notifiers for a Realm which has the background thread disabled -FOUNDATION_EXTERN void RLMRunAsyncNotifiers(NSString *path); - -// Get the cached Realm for the given configuration and scheduler, if any -FOUNDATION_EXTERN RLMRealm *_Nullable RLMGetCachedRealm(RLMRealmConfiguration *, RLMScheduler *) NS_RETURNS_RETAINED; -// Get a cached Realm for the given configuration and any scheduler. The returned -// Realm is not confined to the current thread, so very few operations are safe -// to perform on it -FOUNDATION_EXTERN RLMRealm *_Nullable RLMGetAnyCachedRealm(RLMRealmConfiguration *) NS_RETURNS_RETAINED; - -// Scheduler an async refresh for the given Realm -FOUNDATION_EXTERN RLMAsyncRefreshTask *_Nullable RLMRealmRefreshAsync(RLMRealm *rlmRealm) NS_RETURNS_RETAINED; - -// RLMRealm private members -@interface RLMRealm () -@property (nonatomic, readonly) BOOL dynamic; -@property (nonatomic, readwrite) RLMSchema *schema; -@property (nonatomic, readonly, nullable) id actor; -@property (nonatomic, readonly) bool isFlexibleSync; - -+ (void)resetRealmState; - -- (void)registerEnumerator:(RLMFastEnumerator *)enumerator; -- (void)unregisterEnumerator:(RLMFastEnumerator *)enumerator; -- (void)detachAllEnumerators; - -- (void)sendNotifications:(RLMNotification)notification; -- (void)verifyThread; -- (void)verifyNotificationsAreSupported:(bool)isCollection; - -- (RLMRealm *)frozenCopy NS_RETURNS_RETAINED; - -+ (nullable instancetype)realmWithConfiguration:(RLMRealmConfiguration *)configuration - confinedTo:(RLMScheduler *)options - error:(NSError **)error; - -- (RLMAsyncWriteTask *)beginAsyncWrite NS_RETURNS_RETAINED; -- (void)commitAsyncWriteWithGrouping:(bool)allowGrouping - completion:(void(^)(NSError *_Nullable))completion; -@end - -@interface RLMPinnedRealm : NSObject -@property (nonatomic, readonly) RLMRealmConfiguration *configuration; - -- (instancetype)initWithRealm:(RLMRealm *)realm; -- (void)unpin; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMResults_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMResults_Private.h deleted file mode 100644 index c7e29bebb..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMResults_Private.h +++ /dev/null @@ -1,33 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectSchema; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMResults () -@property (nonatomic, readonly, getter=isAttached) BOOL attached; - -+ (instancetype)emptyDetachedResults; -- (RLMResults *)snapshot; - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMScheduler.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMScheduler.h deleted file mode 100644 index 3c1b9874b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMScheduler.h +++ /dev/null @@ -1,63 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#ifdef __cplusplus -#include -namespace realm::util { -class Scheduler; -} -#endif - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -// A serial work queue of some sort which represents a thread-confinement context -// of some sort which blocks can be invoked inside. Realms are confined to a -// scheduler, which can be a thread (actually a run loop), a dispatch queue, or -// an actor. The scheduler ensures that the Realm is only used on one thread at -// a time, and allows us to dispatch work to the thread where we can access the -// Realm safely. -RLM_SWIFT_SENDABLE // is immutable -@interface RLMScheduler : NSObject -+ (RLMScheduler *)mainRunLoop __attribute__((objc_direct)); -+ (RLMScheduler *)currentRunLoop __attribute__((objc_direct)); -// A scheduler for the given queue if it's non-nil, and currentRunLoop otherwise -+ (RLMScheduler *)dispatchQueue:(nullable dispatch_queue_t)queue; -+ (RLMScheduler *)actor:(id)actor invoke:(void (^)(dispatch_block_t))invoke - verify:(void (^)(void))verify; - -// Invoke the block on this scheduler. Currently not actually implement for run -// loop schedulers. -- (void)invoke:(dispatch_block_t)block; - -// Cache key for this scheduler suitable for use with NSMapTable. Only valid -// when called from the current scheduler. -- (void *)cacheKey; - -- (nullable id)actor; - -#ifdef __cplusplus -// The object store Scheduler corresponding to this scheduler -- (std::shared_ptr)osScheduler; -#endif -@end - -FOUNDATION_EXTERN void RLMSetMainActor(id actor); - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMSchema_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMSchema_Private.h deleted file mode 100644 index f4f63c9f8..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMSchema_Private.h +++ /dev/null @@ -1,58 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@class RLMRealm; - -// -// RLMSchema private interface -// -@interface RLMSchema () - -/** - Returns an `RLMSchema` containing only the given `RLMObject` subclasses. - - @param classes The classes to be included in the schema. - - @return An `RLMSchema` containing only the given classes. - */ -+ (instancetype)schemaWithObjectClasses:(NSArray *)classes; - -@property (nonatomic, readwrite, copy) NSArray *objectSchema; - -// schema based on runtime objects -+ (instancetype)sharedSchema; - -// schema based upon all currently registered object classes -+ (instancetype)partialSharedSchema; - -// private schema based upon all currently registered object classes. -// includes classes that are excluded from the default schema. -+ (instancetype)partialPrivateSharedSchema; - -// class for string -+ (nullable Class)classForString:(NSString *)className; - -+ (nullable RLMObjectSchema *)sharedSchemaForClass:(Class)cls; - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMSet_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMSet_Private.h deleted file mode 100644 index 1053e0a0f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMSet_Private.h +++ /dev/null @@ -1,43 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -@class RLMObjectBase, RLMProperty; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMSet () -- (instancetype)initWithObjectClassName:(NSString *)objectClassName; -- (instancetype)initWithObjectType:(RLMPropertyType)type optional:(BOOL)optional; -- (NSString *)descriptionWithMaxDepth:(NSUInteger)depth; -- (void)setParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -// YES if the property is declared with old property syntax. -@property (nonatomic, readonly) BOOL isLegacyProperty; -// The name of the property which this collection represents -@property (nonatomic, readonly) NSString *propertyKey; -@end - -void RLMSetValidateMatchingObjectType(RLMSet *set, id value); - -@interface RLMManagedSet : RLMSet -- (instancetype)initWithParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMSwiftCollectionBase.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMSwiftCollectionBase.h deleted file mode 100644 index a4f864282..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMSwiftCollectionBase.h +++ /dev/null @@ -1,46 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectBase, RLMResults, RLMProperty, RLMLinkingObjects; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMSwiftCollectionBase : NSProxy -@property (nonatomic, strong) id _rlmCollection; - -- (instancetype)init; -+ (Class)_backingCollectionType; -- (instancetype)initWithCollection:(id)collection; - -- (nullable id)valueForKey:(NSString *)key; -- (nullable id)valueForKeyPath:(NSString *)keyPath; -- (BOOL)isEqual:(nullable id)object; -@end - -@interface RLMLinkingObjectsHandle : NSObject -- (instancetype)initWithObject:(RLMObjectBase *)object property:(RLMProperty *)property; -- (instancetype)initWithLinkingObjects:(RLMResults *)linkingObjects; - -@property (nonatomic, readonly) RLMLinkingObjects *results; -@property (nonatomic, readonly) NSString *_propertyKey; -@property (nonatomic, readonly) BOOL _isLegacyProperty; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMSwiftSupport.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMSwiftSupport.h deleted file mode 100644 index 530f0edbf..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMSwiftSupport.h +++ /dev/null @@ -1,30 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMSwiftSupport : NSObject - -+ (BOOL)isSwiftClassName:(NSString *)className; -+ (NSString *)demangleClassName:(NSString *)className; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMSwiftValueStorage.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMSwiftValueStorage.h deleted file mode 100644 index ef3efc610..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMSwiftValueStorage.h +++ /dev/null @@ -1,53 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectBase, RLMProperty; - -/// This class implements the backing storage for `RealmProperty<>` and `RealmOptional<>`. -/// This class should not be subclassed or used directly. -@interface RLMSwiftValueStorage : NSProxy -- (instancetype)init; -@end -/// Retrieves the value that is stored, or nil if it is empty. -FOUNDATION_EXTERN id _Nullable RLMGetSwiftValueStorage(RLMSwiftValueStorage *); -/// Sets a value on the property this instance represents for an object. -FOUNDATION_EXTERN void RLMSetSwiftValueStorage(RLMSwiftValueStorage *, id _Nullable); - -/// Initialises managed accessors on an instance of `RLMSwiftValueStorage` -/// @param parent The enclosing parent object. -/// @param prop The property which this class represents. -FOUNDATION_EXTERN void RLMInitializeManagedSwiftValueStorage(RLMSwiftValueStorage *, - RLMObjectBase *parent, - RLMProperty *prop); - -/// Initialises unmanaged accessors on an instance of `RLMSwiftValueStorage` -/// @param parent The enclosing parent object. -/// @param prop The property which this class represents. -FOUNDATION_EXTERN void RLMInitializeUnmanagedSwiftValueStorage(RLMSwiftValueStorage *, - RLMObjectBase *parent, - RLMProperty *prop); - -/// Gets the property name for the RealmProperty instance. This is required for tracing the key path on -/// objects that use the legacy property declaration syntax. -FOUNDATION_EXTERN NSString *RLMSwiftValueStorageGetPropertyName(RLMSwiftValueStorage *); - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMSyncConfiguration_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMSyncConfiguration_Private.h deleted file mode 100644 index 62d0e1f1f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMSyncConfiguration_Private.h +++ /dev/null @@ -1,47 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -typedef RLM_CLOSED_ENUM(NSUInteger, RLMSyncStopPolicy) { - RLMSyncStopPolicyImmediately, - RLMSyncStopPolicyLiveIndefinitely, - RLMSyncStopPolicyAfterChangesUploaded, -}; - - -@class RLMSchema; - -@interface RLMSyncConfiguration () - -// Flexible sync -- (instancetype)initWithUser:(RLMUser *)user; -// Partition-based sync -- (instancetype)initWithUser:(RLMUser *)user - partitionValue:(nullable id)partitionValue; - -// Internal-only APIs -@property (nonatomic, readwrite) RLMSyncStopPolicy stopPolicy; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMSyncSubscription_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMSyncSubscription_Private.h deleted file mode 100644 index dc438a20e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMSyncSubscription_Private.h +++ /dev/null @@ -1,70 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -#pragma mark - Subscription - -@interface RLMSyncSubscription () - -@property (nonatomic, readonly) RLMObjectId *identifier; - -@property (nonatomic, readonly) NSString *queryString; - -@property (nonatomic, readonly) NSString *objectClassName; - -@end - -#pragma mark - SubscriptionSet - -@interface RLMSyncSubscriptionEnumerator : NSObject - -@property (nonatomic, readonly) RLMSyncSubscriptionSet *subscriptionSet; - -- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state - count:(NSUInteger)len; - -- (instancetype)initWithSubscriptionSet:(RLMSyncSubscriptionSet *)subscriptionSet; - -@end - -@interface RLMSyncSubscriptionSet () - -@property (readonly) uint64_t version; - -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - subscriptionName:(nullable NSString *)name - predicate:(NSPredicate *)predicate - updateExisting:(BOOL)updateExisting; - -- (void)waitForSynchronizationOnQueue:(nullable dispatch_queue_t)queue - completionBlock:(void(^)(NSError *))completionBlock; - -- (RLMSyncSubscriptionEnumerator *)fastEnumerator; - -NSUInteger RLMFastEnumerate(NSFastEnumerationState *state, - NSUInteger len, - RLMSyncSubscriptionSet *collection); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMUser_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMUser_Private.h deleted file mode 100644 index f62c9a940..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/PrivateHeaders/RLMUser_Private.h +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// Observer block for user notifications. -typedef void(^RLMUserNotificationBlock)(RLMUser *); - -/// Token that identifies an observer. Unsubscribes when deconstructed to -/// avoid dangling observers, therefore this must be retained to hold -/// onto a subscription. -@interface RLMUserSubscriptionToken : NSObject -- (void)unsubscribe; -@end - -@interface RLMUser () -/// Subscribe to notifications for this RLMUser. -- (RLMUserSubscriptionToken *)subscribe:(RLMUserNotificationBlock)block; - -- (void)logOut; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Realm b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Realm deleted file mode 100755 index bc8aec43f..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64/Realm.framework/Realm and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Headers b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Headers deleted file mode 120000 index a177d2a6b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Headers +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/Headers \ No newline at end of file diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Modules b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Modules deleted file mode 120000 index 5736f3186..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Modules +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/Modules \ No newline at end of file diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/PrivateHeaders b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/PrivateHeaders deleted file mode 120000 index d8e564526..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/PrivateHeaders +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/PrivateHeaders \ No newline at end of file diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Realm b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Realm deleted file mode 120000 index d12855ef9..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Realm +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/Realm \ No newline at end of file diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Resources b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Resources deleted file mode 120000 index 953ee36f3..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Resources +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/Resources \ No newline at end of file diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/NSError+RLMSync.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/NSError+RLMSync.h deleted file mode 100644 index 5ef323a24..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/NSError+RLMSync.h +++ /dev/null @@ -1,46 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2017 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@class RLMSyncErrorActionToken; - -/// NSError category extension providing methods to get data out of Realm's -/// "client reset" error. -@interface NSError (RLMSync) - -/** - Given an appropriate Atlas App Services error, return the token that - can be passed into `+[RLMSyncSession immediatelyHandleError:]` to - immediately perform error clean-up work, or nil if the error isn't of - a type that provides a token. - */ -- (nullable RLMSyncErrorActionToken *)rlmSync_errorActionToken NS_REFINED_FOR_SWIFT; - -/** - Given an Atlas App Services client reset error, return the path where the - backup copy of the Realm will be placed once the client reset process is - complete. - */ -- (nullable NSString *)rlmSync_clientResetBackedUpRealmPath NS_SWIFT_UNAVAILABLE(""); - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMAPIKeyAuth.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMAPIKeyAuth.h deleted file mode 100644 index 642bdd95d..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMAPIKeyAuth.h +++ /dev/null @@ -1,95 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMUserAPIKey, RLMObjectId; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// Provider client for user API keys. -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMAPIKeyAuth : RLMProviderClient - -/// A block type used to report an error -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMAPIKeyAuthOptionalErrorBlock)(NSError * _Nullable); - -/// A block type used to return an `RLMUserAPIKey` on success, or an `NSError` on failure -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMOptionalUserAPIKeyBlock)(RLMUserAPIKey * _Nullable, NSError * _Nullable); - -/// A block type used to return an array of `RLMUserAPIKey` on success, or an `NSError` on failure -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMUserAPIKeysBlock)(NSArray * _Nullable, NSError * _Nullable); - -/** - Creates a user API key that can be used to authenticate as the current user. - - @param name The name of the API key to be created. - @param completion A callback to be invoked once the call is complete. -*/ -- (void)createAPIKeyWithName:(NSString *)name - completion:(RLMOptionalUserAPIKeyBlock)completion NS_SWIFT_NAME(createAPIKey(named:completion:)); - -/** - Fetches a user API key associated with the current user. - - @param objectId The ObjectId of the API key to fetch. - @param completion A callback to be invoked once the call is complete. - */ -- (void)fetchAPIKey:(RLMObjectId *)objectId - completion:(RLMOptionalUserAPIKeyBlock)completion; - -/** - Fetches the user API keys associated with the current user. - - @param completion A callback to be invoked once the call is complete. - */ -- (void)fetchAPIKeysWithCompletion:(RLMUserAPIKeysBlock)completion; - -/** - Deletes a user API key associated with the current user. - - @param objectId The ObjectId of the API key to delete. - @param completion A callback to be invoked once the call is complete. - */ -- (void)deleteAPIKey:(RLMObjectId *)objectId - completion:(RLMAPIKeyAuthOptionalErrorBlock)completion; - -/** - Enables a user API key associated with the current user. - - @param objectId The ObjectId of the API key to enable. - @param completion A callback to be invoked once the call is complete. - */ -- (void)enableAPIKey:(RLMObjectId *)objectId - completion:(RLMAPIKeyAuthOptionalErrorBlock)completion; - -/** - Disables a user API key associated with the current user. - - @param objectId The ObjectId of the API key to disable. - @param completion A callback to be invoked once the call is complete. - */ -- (void)disableAPIKey:(RLMObjectId *)objectId - completion:(RLMAPIKeyAuthOptionalErrorBlock)completion; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMApp.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMApp.h deleted file mode 100644 index 2228232e8..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMApp.h +++ /dev/null @@ -1,235 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@protocol RLMNetworkTransport, RLMBSON; - -@class RLMUser, RLMCredentials, RLMSyncManager, RLMEmailPasswordAuth, RLMPushClient, RLMSyncTimeoutOptions; - -/// A block type used for APIs which asynchronously vend an `RLMUser`. -typedef void(^RLMUserCompletionBlock)(RLMUser * _Nullable, NSError * _Nullable); - -/// A block type used to report an error -typedef void(^RLMOptionalErrorBlock)(NSError * _Nullable); - -#pragma mark RLMAppConfiguration - -/// Properties representing the configuration of a client -/// that communicate with a particular Realm application. -@interface RLMAppConfiguration : NSObject - -/// A custom base URL to request against. -@property (nonatomic, strong, nullable) NSString *baseURL; - -/// The custom transport for network calls to the server. -@property (nonatomic, strong, nullable) id transport; - -/// :nodoc: -@property (nonatomic, strong, nullable) NSString *localAppName - __attribute__((deprecated("This field is not used"))); -/// :nodoc: -@property (nonatomic, strong, nullable) NSString *localAppVersion - __attribute__((deprecated("This field is not used"))); - -/// The default timeout for network requests. -@property (nonatomic, assign) NSUInteger defaultRequestTimeoutMS; - -/// If enabled (the default), a single connection is used for all Realms opened -/// with a single sync user. If disabled, a separate connection is used for each -/// Realm. -/// -/// Session multiplexing reduces resources used and typically improves -/// performance. When multiplexing is enabled, the connection is not immediately -/// closed when the last session is closed, and instead remains open for -/// ``RLMSyncTimeoutOptions.connectionLingerTime`` milliseconds (30 seconds by -/// default). -@property (nonatomic, assign) BOOL enableSessionMultiplexing; - -/** - Options for the assorted types of connection timeouts for sync connections. - - If nil default values for all timeouts are used instead. - */ -@property (nonatomic, nullable, copy) RLMSyncTimeoutOptions *syncTimeouts; - -/// :nodoc: -- (instancetype)initWithBaseURL:(nullable NSString *)baseURL - transport:(nullable id)transport - localAppName:(nullable NSString *)localAppName - localAppVersion:(nullable NSString *)localAppVersion -__attribute__((deprecated("localAppName and localAppVersion are unused"))); - -/// :nodoc: -- (instancetype)initWithBaseURL:(nullable NSString *) baseURL - transport:(nullable id)transport - localAppName:(nullable NSString *)localAppName - localAppVersion:(nullable NSString *)localAppVersion - defaultRequestTimeoutMS:(NSUInteger)defaultRequestTimeoutMS -__attribute__((deprecated("localAppName and localAppVersion are unused"))); - -/** -Create a new Realm App configuration. - -@param baseURL A custom base URL to request against. -@param transport A custom network transport. -*/ -- (instancetype)initWithBaseURL:(nullable NSString *)baseURL - transport:(nullable id)transport; - -/** - Create a new Realm App configuration. - - @param baseURL A custom base URL to request against. - @param transport A custom network transport. - @param defaultRequestTimeoutMS A custom default timeout for network requests. - */ -- (instancetype)initWithBaseURL:(nullable NSString *) baseURL - transport:(nullable id)transport - defaultRequestTimeoutMS:(NSUInteger)defaultRequestTimeoutMS; - -@end - -#pragma mark RLMApp - -/** - The `RLMApp` has the fundamental set of methods for communicating with a Realm - application backend. - - This interface provides access to login and authentication. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // internally thread-safe -@interface RLMApp : NSObject - -/// The configuration for this Realm app. -@property (nonatomic, readonly) RLMAppConfiguration *configuration; - -/// The `RLMSyncManager` for this Realm app. -@property (nonatomic, readonly) RLMSyncManager *syncManager; - -/// Get a dictionary containing all users keyed on id. -@property (nonatomic, readonly) NSDictionary *allUsers; - -/// Get the current user logged into the Realm app. -@property (nonatomic, readonly, nullable) RLMUser *currentUser; - -/// The app ID for this Realm app. -@property (nonatomic, readonly) NSString *appId; - -/** - A client for the email/password authentication provider which - can be used to obtain a credential for logging in. - - Used to perform requests specifically related to the email/password provider. -*/ -@property (nonatomic, readonly) RLMEmailPasswordAuth *emailPasswordAuth; - -/** - Get an application with a given appId and configuration. - - @param appId The unique identifier of your Realm app. - */ -+ (instancetype)appWithId:(NSString *)appId; - -/** - Get an application with a given appId and configuration. - - @param appId The unique identifier of your Realm app. - @param configuration A configuration object to configure this client. - */ -+ (instancetype)appWithId:(NSString *)appId - configuration:(nullable RLMAppConfiguration *)configuration; - -/** - Login to a user for the Realm app. - - @param credentials The credentials identifying the user. - @param completion A callback invoked after completion. - */ -- (void)loginWithCredential:(RLMCredentials *)credentials - completion:(RLMUserCompletionBlock)completion NS_REFINED_FOR_SWIFT; - -/** - Switches the active user to the specified user. - - This sets which user is used by all RLMApp operations which require a user. This is a local operation which does not access the network. - An exception will be throw if the user is not valid. The current user will remain logged in. - - @param syncUser The user to switch to. - @returns The user you intend to switch to - */ -- (RLMUser *)switchToUser:(RLMUser *)syncUser; - -/** - A client which can be used to register devices with the server to receive push notificatons - */ -- (RLMPushClient *)pushClientWithServiceName:(NSString *)serviceName - NS_SWIFT_NAME(pushClient(serviceName:)); - -/** - RLMApp instances are cached internally by Realm and cannot be created directly. - - Use `+[RLMRealm appWithId]` or `+[RLMRealm appWithId:configuration:]` - to obtain a reference to an RLMApp. - */ -- (instancetype)init __attribute__((unavailable("Use +appWithId or appWithId:configuration:."))); - -/** -RLMApp instances are cached internally by Realm and cannot be created directly. - -Use `+[RLMRealm appWithId]` or `+[RLMRealm appWithId:configuration:]` -to obtain a reference to an RLMApp. -*/ -+ (instancetype)new __attribute__((unavailable("Use +appWithId or appWithId:configuration:."))); - -@end - -#pragma mark - Sign In With Apple Extension - -API_AVAILABLE(ios(13.0), macos(10.15), tvos(13.0), watchos(6.0)) -/// Use this delegate to be provided a callback once authentication has succeed or failed -@protocol RLMASLoginDelegate - -/// Callback that is invoked should the authentication fail. -/// @param error An error describing the authentication failure. -- (void)authenticationDidFailWithError:(NSError *)error NS_SWIFT_NAME(authenticationDidComplete(error:)); - -/// Callback that is invoked should the authentication succeed. -/// @param user The newly authenticated user. -- (void)authenticationDidCompleteWithUser:(RLMUser *)user NS_SWIFT_NAME(authenticationDidComplete(user:)); - -@end - -API_AVAILABLE(ios(13.0), macos(10.15), tvos(13.0), watchos(6.0)) -/// Category extension that deals with Sign In With Apple authentication. -/// This is only available on OS's that support `AuthenticationServices` -@interface RLMApp (ASLogin) - -/// Use this delegate to be provided a callback once authentication has succeed or failed. -@property (nonatomic, weak, nullable) id authorizationDelegate; - -/// Sets the ASAuthorizationControllerDelegate to be handled by `RLMApp` -/// @param controller The ASAuthorizationController in which you want `RLMApp` to consume its delegate. -- (void)setASAuthorizationControllerDelegateForController:(ASAuthorizationController *)controller NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMArray.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMArray.h deleted file mode 100644 index b2c6c1664..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMArray.h +++ /dev/null @@ -1,652 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObject, RLMResults; - -/** - `RLMArray` is the container type in Realm used to define to-many relationships. - - Unlike an `NSArray`, `RLMArray`s hold a single type, specified by the `objectClassName` property. - This is referred to in these docs as the “type” of the array. - - When declaring an `RLMArray` property, the type must be marked as conforming to a - protocol by the same name as the objects it should contain (see the - `RLM_COLLECTION_TYPE` macro). In addition, the property can be declared using Objective-C - generics for better compile-time type safety. - - RLM_COLLECTION_TYPE(ObjectType) - ... - @property RLMArray *arrayOfObjectTypes; - - `RLMArray`s can be queried with the same predicates as `RLMObject` and `RLMResult`s. - - `RLMArray`s cannot be created directly. `RLMArray` properties on `RLMObject`s are - lazily created when accessed, or can be obtained by querying a Realm. - - ### Key-Value Observing - - `RLMArray` supports array key-value observing on `RLMArray` properties on `RLMObject` - subclasses, and the `invalidated` property on `RLMArray` instances themselves is - key-value observing compliant when the `RLMArray` is attached to a managed - `RLMObject` (`RLMArray`s on unmanaged `RLMObject`s will never become invalidated). - - Because `RLMArray`s are attached to the object which they are a property of, they - do not require using the mutable collection proxy objects from - `-mutableArrayValueForKey:` or KVC-compatible mutation methods on the containing - object. Instead, you can call the mutation methods on the `RLMArray` directly. - */ - -@interface RLMArray : NSObject - -#pragma mark - Properties - -/** - The number of objects in the array. - */ -@property (nonatomic, readonly, assign) NSUInteger count; - -/** - The type of the objects in the array. - */ -@property (nonatomic, readonly, assign) RLMPropertyType type; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readonly, getter = isOptional) BOOL optional; - -/** - The class name of the objects contained in the array. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages the array. Returns `nil` for unmanaged arrays. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - Indicates if the array can no longer be accessed. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if the array is frozen. - - Frozen arrays are immutable and can be accessed from any thread. Frozen arrays - are created by calling `-freeze` on a managed live array. Unmanaged arrays are - never frozen. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Accessing Objects from an Array - -/** - Returns the object at the index specified. - - @param index The index to look up. - - @return An object of the type contained in the array. - */ -- (RLMObjectType)objectAtIndex:(NSUInteger)index; - -/** - Returns an array containing the objects in the array at the indexes specified by a given index set. - `nil` will be returned if the index set contains an index out of the arrays bounds. - - @param indexes The indexes in the array to retrieve objects from. - - @return The objects at the specified indexes. - */ -- (nullable NSArray *)objectsAtIndexes:(NSIndexSet *)indexes; - -/** - Returns the first object in the array. - - Returns `nil` if called on an empty array. - - @return An object of the type contained in the array. - */ -- (nullable RLMObjectType)firstObject; - -/** - Returns the last object in the array. - - Returns `nil` if called on an empty array. - - @return An object of the type contained in the array. - */ -- (nullable RLMObjectType)lastObject; - - - -#pragma mark - Adding, Removing, and Replacing Objects in an Array - -/** - Adds an object to the end of the array. - - @warning This method may only be called during a write transaction. - - @param object An object of the type contained in the array. - */ -- (void)addObject:(RLMObjectType)object; - -/** - Adds an array of objects to the end of the array. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable object such as `NSArray` or `RLMResults` which contains objects of the - same class as the array. - */ -- (void)addObjects:(id)objects; - -/** - Inserts an object at the given index. - - Throws an exception if the index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param anObject An object of the type contained in the array. - @param index The index at which to insert the object. - */ -- (void)insertObject:(RLMObjectType)anObject atIndex:(NSUInteger)index; - -/** - Removes an object at the given index. - - Throws an exception if the index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param index The array index identifying the object to be removed. - */ -- (void)removeObjectAtIndex:(NSUInteger)index; - -/** - Removes the last object in the array. - - This is a no-op if the array is already empty. - - @warning This method may only be called during a write transaction. -*/ -- (void)removeLastObject; - -/** - Removes all objects from the array. - - @warning This method may only be called during a write transaction. - */ -- (void)removeAllObjects; - -/** - Replaces an object at the given index with a new object. - - Throws an exception if the index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param index The index of the object to be replaced. - @param anObject An object (of the same type as returned from the `objectClassName` selector). - */ -- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(RLMObjectType)anObject; - -/** - Moves the object at the given source index to the given destination index. - - Throws an exception if the index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param sourceIndex The index of the object to be moved. - @param destinationIndex The index to which the object at `sourceIndex` should be moved. - */ -- (void)moveObjectAtIndex:(NSUInteger)sourceIndex toIndex:(NSUInteger)destinationIndex; - -/** - Exchanges the objects in the array at given indices. - - Throws an exception if either index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param index1 The index of the object which should replace the object at index `index2`. - @param index2 The index of the object which should replace the object at index `index1`. - */ -- (void)exchangeObjectAtIndex:(NSUInteger)index1 withObjectAtIndex:(NSUInteger)index2; - -#pragma mark - Querying an Array - -/** - Returns the index of an object in the array. - - Returns `NSNotFound` if the object is not found in the array. - - @param object An object (of the same type as returned from the `objectClassName` selector). - */ -- (NSUInteger)indexOfObject:(RLMObjectType)object; - -/** - Returns the index of the first object in the array matching the predicate. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return The index of the object, or `NSNotFound` if the object is not found in the array. - */ -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns the index of the first object in the array matching the predicate. - - @param predicate The predicate with which to filter the objects. - - @return The index of the object, or `NSNotFound` if the object is not found in the array. - */ -- (NSUInteger)indexOfObjectWithPredicate:(NSPredicate *)predicate; - -/** - Returns all the objects matching the given predicate in the array. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` of objects that match the given predicate. - */ -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all the objects matching the given predicate in the array. - - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` of objects that match the given predicate - */ -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/** - Returns a sorted `RLMResults` from the array. - - @param keyPath The key path to sort by. - @param ascending The direction to sort in. - - @return An `RLMResults` sorted by the specified key path. - */ -- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a sorted `RLMResults` from the array. - - @param properties An array of `RLMSortDescriptor`s to sort by. - - @return An `RLMResults` sorted by the specified properties. - */ -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/** - Returns a distinct `RLMResults` from the array. - - @param keyPaths The key paths to distinct on. - - @return An `RLMResults` with the distinct values of the keypath(s). - */ -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -/// :nodoc: -- (RLMObjectType)objectAtIndexedSubscript:(NSUInteger)index; - -/// :nodoc: -- (void)setObject:(RLMObjectType)newValue atIndexedSubscript:(NSUInteger)index; - -#pragma mark - Sectioning an Array - -/** - Sorts and sections this collection from a given property key path, returning the result - as an instance of `RLMSectionedResults`. - - @param keyPath The property key path to sort on. - @param ascending The direction to sort in. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsSortedUsingKeyPath:(NSString *)keyPath - ascending:(BOOL)ascending - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -/** - Sorts and sections this collection from a given array of sort descriptors, returning the result - as an instance of `RLMSectionedResults`. - - @param sortDescriptors An array of `RLMSortDescriptor`s to sort by. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @note The primary sort descriptor must be responsible for determining the section key. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsUsingSortDescriptors:(NSArray *)sortDescriptors - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - - -#pragma mark - Notifications - -/** - Registers a block to be called each time the array changes. - - The block will be asynchronously called with the initial array, and then - called again after each write transaction which changes any of the objects in - the array, which objects are in the results, or the order of the objects in the - array. - - The `changes` parameter will be `nil` the first time the block is called. For - each call after that, it will contain information about which rows in the - array were added, removed or modified. If a write transaction did not modify - any objects in the array, the block is not called at all. See the - `RLMCollectionChange` documentation for information on how the changes are - reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - Person *person = [[Person allObjectsInRealm:realm] firstObject]; - NSLog(@"person.dogs.count: %zu", person.dogs.count); // => 0 - self.token = [person.dogs addNotificationBlock(RLMArray *dogs, - RLMCollectionChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count) // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - [person.dogs addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a non-frozen managed array. - - @param block The block to be called each time the array changes. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMArray *_Nullable array, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the array changes. - - The block will be asynchronously called with the initial array, and then - called again after each write transaction which changes any of the objects in - the array, which objects are in the results, or the order of the objects in the - array. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the array were added, removed or modified. If a write transaction - did not modify any objects in the array, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMArray *_Nullable array, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the array changes. - - The block will be asynchronously called with the initial array, and then - called again after each write transaction which changes any of the objects in - the array, which objects are in the results, or the order of the objects in the - array. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the array were added, removed or modified. If a write transaction - did not modify any objects in the array, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMArray *_Nullable array, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the array changes. - - The block will be asynchronously called with the initial array, and then - called again after each write transaction which changes any of the objects in - the array, which objects are in the results, or the order of the objects in the - array. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the array were added, removed or modified. If a write transaction - did not modify any objects in the array, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMArray *_Nullable array, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths -__attribute__((warn_unused_result)); - -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the objects in the array. - - NSNumber *min = [object.arrayProperty minOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The minimum value of the property, or `nil` if the array is empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects in the array. - - NSNumber *max = [object.arrayProperty maxOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose maximum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The maximum value of the property, or `nil` if the array is empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of the values of a given property over all the objects in the array. - - NSNumber *sum = [object.arrayProperty sumOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose values should be summed. Only properties of - types `int`, `float`, and `double` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects in the array. - - NSNumber *average = [object.arrayProperty averageOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose average value should be calculated. Only - properties of types `int`, `float`, and `double` are supported. - - @return The average value of the given property, or `nil` if the array is empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this array. - - The frozen copy is an immutable array which contains the same data as this - array currently contains, but will not update when writes are made to the - containing Realm. Unlike live arrays, frozen arrays can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a managed array. - @warning Holding onto a frozen array for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -#pragma mark - Unavailable Methods - -/** - `-[RLMArray init]` is not available because `RLMArray`s cannot be created directly. - `RLMArray` properties on `RLMObject`s are lazily created when accessed. - */ -- (instancetype)init __attribute__((unavailable("RLMArrays cannot be created directly"))); - -/** - `+[RLMArray new]` is not available because `RLMArray`s cannot be created directly. - `RLMArray` properties on `RLMObject`s are lazily created when accessed. - */ -+ (instancetype)new __attribute__((unavailable("RLMArrays cannot be created directly"))); - -@end - -/// :nodoc: -@interface RLMArray (Swift) -// for use only in Swift class definitions -- (instancetype)initWithObjectClassName:(NSString *)objectClassName; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMAsymmetricObject.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMAsymmetricObject.h deleted file mode 100644 index 09deb787e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMAsymmetricObject.h +++ /dev/null @@ -1,98 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2022 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectSchema, RLMPropertyDescriptor, RLMRealm; -/** - `RLMAsymmetricObject` is a base class used to define asymmetric Realm objects. - - Asymmetric objects can only be created using the `createInRealm:` - function, and cannot be added, removed or queried. - When created, asymmetric objects will be synced unidirectionally to the MongoDB - database and cannot be accessed locally. - - Linking an asymmetric object within an `Object` is not allowed and will throw an error. - - The property types supported on `RLMAsymmetricObject` are the same as for `RLMObject`, - except for that asymmetric objects can only link to embedded objects, so `RLMObject` - and `RLMArray` properties are not supported (`RLMEmbeddedObject` and - `RLMArray` *are*). - */ -@interface RLMAsymmetricObject : RLMObjectBase - -#pragma mark - Creating & Initializing Objects - -/** - Creates an unmanaged instance of a Realm object. - */ -- (instancetype)init NS_DESIGNATED_INITIALIZER; - -/** - Creates an unmanaged instance of a Realm object. - - Pass in an `NSArray` or `NSDictionary` instance to set the values of the object's properties. - */ -- (instancetype)initWithValue:(id)value; - -/** - Returns the class name for a Realm object subclass. - - @warning Do not override. Realm relies on this method returning the exact class - name. - - @return The class name for the model class. - */ -+ (NSString *)className; - -/** - Creates an Asymmetric object, which will be synced unidirectionally and - cannot be queried locally. - - Objects created using this method will not be added to the Realm. - - @warning This method may only be called during a write transaction. - @warning This method always returns nil. - - @param realm The Realm to be used to create the asymmetric object.. - @param value The value used to populate the object. - - @return Returns `nil` - */ -+ (instancetype)createInRealm:(RLMRealm *)realm withValue:(id)value; - -#pragma mark - Properties - -/** - The object schema which lists the managed properties for the object. - */ -@property (nonatomic, readonly) RLMObjectSchema *objectSchema; - -#pragma mark - Dynamic Accessors - -/// :nodoc: -- (nullable id)objectForKeyedSubscript:(NSString *)key; - -/// :nodoc: -- (void)setObject:(nullable id)obj forKeyedSubscript:(NSString *)key; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMAsyncTask.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMAsyncTask.h deleted file mode 100644 index 9f7dc58da..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMAsyncTask.h +++ /dev/null @@ -1,67 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A task object which can be used to observe or cancel an async open. - - When a synchronized Realm is opened asynchronously, the latest state of the - Realm is downloaded from the server before the completion callback is invoked. - This task object can be used to observe the state of the download or to cancel - it. This should be used instead of trying to observe the download via the sync - session as the sync session itself is created asynchronously, and may not exist - yet when -[RLMRealm asyncOpenWithConfiguration:completion:] returns. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMAsyncOpenTask : NSObject -/** - Register a progress notification block. - - Each registered progress notification block is called whenever the sync - subsystem has new progress data to report until the task is either cancelled - or the completion callback is called. Progress notifications are delivered on - the main queue. - */ -- (void)addProgressNotificationBlock:(RLMProgressNotificationBlock)block; - -/** - Register a progress notification block which is called on the given queue. - - Each registered progress notification block is called whenever the sync - subsystem has new progress data to report until the task is either cancelled - or the completion callback is called. Progress notifications are delivered on - the supplied queue. - */ -- (void)addProgressNotificationOnQueue:(dispatch_queue_t)queue - block:(RLMProgressNotificationBlock)block; - -/** - Cancel the asynchronous open. - - Any download in progress will be cancelled, and the completion block for this - async open will never be called. If multiple async opens on the same Realm are - happening concurrently, all other opens will fail with the error "operation cancelled". - */ -- (void)cancel; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMBSON.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMBSON.h deleted file mode 100644 index 41750fd57..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMBSON.h +++ /dev/null @@ -1,174 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -#pragma mark RLMBSONType - -/** - Allowed BSON types. - */ -typedef NS_ENUM(NSUInteger, RLMBSONType) { - /// BSON Null type - RLMBSONTypeNull, - /// BSON Int32 type - RLMBSONTypeInt32, - /// BSON Int64 type - RLMBSONTypeInt64, - /// BSON Bool type - RLMBSONTypeBool, - /// BSON Double type - RLMBSONTypeDouble, - /// BSON String type - RLMBSONTypeString, - /// BSON Binary type - RLMBSONTypeBinary, - /// BSON Timestamp type - RLMBSONTypeTimestamp, - /// BSON Datetime type - RLMBSONTypeDatetime, - /// BSON ObjectId type - RLMBSONTypeObjectId, - /// BSON Decimal128 type - RLMBSONTypeDecimal128, - /// BSON RegularExpression type - RLMBSONTypeRegularExpression, - /// BSON MaxKey type - RLMBSONTypeMaxKey, - /// BSON MinKey type - RLMBSONTypeMinKey, - /// BSON Document type - RLMBSONTypeDocument, - /// BSON Array type - RLMBSONTypeArray, - /// BSON UUID type - RLMBSONTypeUUID -}; - -#pragma mark RLMBSON - -/** - Protocol representing a BSON value. BSON is a computer data interchange format. - The name "BSON" is based on the term JSON and stands for "Binary JSON". - - The following types conform to RLMBSON: - - `NSNull` - `NSNumber` - `NSString` - `NSData` - `NSDateInterval` - `NSDate` - `RLMObjectId` - `RLMDecimal128` - `NSRegularExpression` - `RLMMaxKey` - `RLMMinKey` - `NSDictionary` - `NSArray` - `NSUUID` - - @see RLMBSONType - @see bsonspec.org - */ -@protocol RLMBSON - -/** - The BSON type for the conforming interface. - */ -@property (readonly) RLMBSONType bsonType NS_REFINED_FOR_SWIFT; - -/** - Whether or not this BSON is equal to another. - - @param other The BSON to compare to - */ -- (BOOL)isEqual:(_Nullable id)other; - -@end - -/// :nodoc: -@interface NSNull (RLMBSON) -@end - -/// :nodoc: -@interface NSNumber (RLMBSON) -@end - -/// :nodoc: -@interface NSString (RLMBSON) -@end - -/// :nodoc: -@interface NSData (RLMBSON) -@end - -/// :nodoc: -@interface NSDateInterval (RLMBSON) -@end - -/// :nodoc: -@interface NSDate (RLMBSON) -@end - -/// :nodoc: -@interface RLMObjectId (RLMBSON) -@end - -/// :nodoc: -@interface RLMDecimal128 (RLMBSON) -@end - -/// :nodoc: -@interface NSRegularExpression (RLMBSON) -@end - -/// MaxKey will always be the greatest value when comparing to other BSON types -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMMaxKey : NSObject -@end - -/// MinKey will always be the smallest value when comparing to other BSON types -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMMinKey : NSObject -@end - -/// :nodoc: -@interface RLMMaxKey (RLMBSON) -@end - -/// :nodoc: -@interface RLMMinKey (RLMBSON) -@end - -/// :nodoc: -@interface NSDictionary (RLMBSON) -@end - -/// :nodoc: -@interface NSMutableArray (RLMBSON) -@end - -/// :nodoc: -@interface NSArray (RLMBSON) -@end - -/// :nodoc: -@interface NSUUID (RLMBSON) -@end diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMCollection.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMCollection.h deleted file mode 100644 index eac117f17..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMCollection.h +++ /dev/null @@ -1,613 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@protocol RLMValue; -@class RLMRealm, RLMResults, RLMSortDescriptor, RLMNotificationToken, RLMCollectionChange, RLMSectionedResults; -typedef RLM_CLOSED_ENUM(int32_t, RLMPropertyType); -/// A callback which is invoked on each element in the Results collection which returns the section key. -typedef id _Nullable(^RLMSectionedResultsKeyBlock)(id); - -/** - A homogenous collection of Realm-managed objects. Examples of conforming types - include `RLMArray`, `RLMSet`, `RLMResults`, and `RLMLinkingObjects`. - */ -@protocol RLMCollection - -#pragma mark - Properties - -/** - The number of objects in the collection. - */ -@property (nonatomic, readonly) NSUInteger count; - -/** - The type of the objects in the collection. - */ -@property (nonatomic, readonly) RLMPropertyType type; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readonly, getter = isOptional) BOOL optional; - -/** - The class name of the objects contained in the collection. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages this collection, if any. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - Indicates if the collection is no longer valid. - - The collection becomes invalid if `invalidate` is called on the managing - Realm. Unmanaged collections are never invalidated. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -#pragma mark - Accessing Objects from a Collection - -/** - Returns the object at the index specified. - - @param index The index to look up. - - @return An object of the type contained in the collection. - */ -- (id)objectAtIndex:(NSUInteger)index; - -@optional - -/** - Returns an array containing the objects in the collection at the indexes - specified by a given index set. `nil` will be returned if the index set - contains an index out of the collections bounds. - - @param indexes The indexes in the collection to retrieve objects from. - - @return The objects at the specified indexes. - */ -- (nullable NSArray *)objectsAtIndexes:(NSIndexSet *)indexes; - -/** - Returns the first object in the collection. - - RLMSet is not ordered, and so for sets this will return an arbitrary object in - the set. It is not guaraneed to be a different object from what `lastObject` - gives even if the set has multiple objects in it. - - Returns `nil` if called on an empty collection. - - @return An object of the type contained in the collection. - */ -- (nullable id)firstObject; - -/** - Returns the last object in the collection. - - RLMSet is not ordered, and so for sets this will return an arbitrary object in - the set. It is not guaraneed to be a different object from what `firstObject` - gives even if the set has multiple objects in it. - - Returns `nil` if called on an empty collection. - - @return An object of the type contained in the collection. - */ -- (nullable id)lastObject; - -/// :nodoc: -- (id)objectAtIndexedSubscript:(NSUInteger)index; - -/** - Returns the index of an object in the collection. - - Returns `NSNotFound` if the object is not found in the collection. - - @param object An object (of the same type as returned from the `objectClassName` selector). - */ -- (NSUInteger)indexOfObject:(id)object; - -/** - Returns the index of the first object in the collection matching the predicate. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return The index of the object, or `NSNotFound` if the object is not found in the collection. - */ -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns the index of the first object in the collection matching the predicate. - - @param predicate The predicate with which to filter the objects. - - @return The index of the object, or `NSNotFound` if the object is not found in the collection. - */ -- (NSUInteger)indexOfObjectWithPredicate:(NSPredicate *)predicate; - -@required - -#pragma mark - Querying a Collection - -/** - Returns all objects matching the given predicate in the collection. - - This is only supported for managed collections. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - @return An `RLMResults` containing objects that match the given predicate. - */ -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all objects matching the given predicate in the collection. - - This is only supported for managed collections. - - @param predicate The predicate with which to filter the objects. - @return An `RLMResults` containing objects that match the given predicate. - */ -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/** - Returns a sorted `RLMResults` from the collection. - - This is only supported for managed collections. - - @param keyPath The keyPath to sort by. - @param ascending The direction to sort in. - @return An `RLMResults` sorted by the specified key path. - */ -- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a sorted `RLMResults` from the collection. - - This is only supported for managed collections. - - @param properties An array of `RLMSortDescriptor`s to sort by. - @return An `RLMResults` sorted by the specified properties. - */ -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/** - Returns a distinct `RLMResults` from the collection. - - This is only supported for managed collections. - - @param keyPaths The key paths used produce distinct results - @return An `RLMResults` made distinct based on the specified key paths - */ -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -/** - Returns an `NSArray` containing the results of invoking `valueForKey:` using - `key` on each of the collection's objects. - - @param key The name of the property. - - @return An `NSArray` containing results. - */ -- (nullable id)valueForKey:(NSString *)key; - -/** - Returns the value for the derived property identified by a given key path. - - @param keyPath A key path of the form relationship.property (with one or more relationships). - - @return The value for the derived property identified by keyPath. - */ -- (nullable id)valueForKeyPath:(NSString *)keyPath; - -/** - Invokes `setValue:forKey:` on each of the collection's objects using the specified `value` and `key`. - - @warning This method may only be called during a write transaction. - - @param value The object value. - @param key The name of the property. - */ -- (void)setValue:(nullable id)value forKey:(NSString *)key; - -#pragma mark - Notifications - -/** -Registers a block to be called each time the collection changes. - -The block will be asynchronously called with the initial collection, -and then called again after each write transaction which changes either any -of the objects in the collection, or which objects are in the collection. - -The `change` parameter will be `nil` the first time the block is called. -For each call after that, it will contain information about -which rows in the collection were added, removed or modified. If a -write transaction did not modify any objects in the results collection, -the block is not called at all. See the `RLMCollectionChange` documentation for -information on how the changes are reported and an example of updating a -`UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - -At the time when the block is called, the collection object will be fully -evaluated and up-to-date, and as long as you do not perform a write transaction -on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will -never perform blocking work. - -Notifications are delivered via the standard run loop, and so can't be -delivered while the run loop is blocked by other activity. When -notifications can't be delivered instantly, multiple notifications may be -coalesced into a single notification. This can include the notification -with the initial results. For example, the following code performs a write -transaction immediately after adding the notification block, so there is no -opportunity for the initial notification to be delivered first. As a -result, the initial notification will reflect the state of the Realm after -the write transaction. - - RLMResults *results = [Dog allObjects]; - NSLog(@"dogs.count: %zu", dogs.count); // => 0 - self.token = [results addNotificationBlock:^(RLMResults *dogs, - RLMCollectionChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - [realm addObject:dog]; - }]; - // end of run loop execution context - -You must retain the returned token for as long as you want updates to continue -to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - -@warning This method cannot be called during a write transaction, or when the - containing Realm is read-only or frozen. - -@param block The block to be called whenever a change occurs. -@return A token which must be held for as long as you want updates to be delivered. -*/ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** -Registers a block to be called each time the collection changes. - -The block will be asynchronously called with the initial collection, -and then called again after each write transaction which changes either any -of the objects in the collection, or which objects are in the collection. - -The `change` parameter will be `nil` the first time the block is called. -For each call after that, it will contain information about -which rows in the collection were added, removed or modified. If a -write transaction did not modify any objects in the results collection, -the block is not called at all. See the `RLMCollectionChange` documentation for -information on how the changes are reported and an example of updating a -`UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - -At the time when the block is called, the collection object will be fully -evaluated and up-to-date, and as long as you do not perform a write transaction -on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will -never perform blocking work. - -Notifications are delivered on the given queue. If the queue is blocked and -notifications can't be delivered instantly, multiple notifications may be -coalesced into a single notification. - -You must retain the returned token for as long as you want updates to continue -to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - -@warning This method cannot be called when the containing Realm is read-only or frozen. -@warning The queue must be a serial queue. - -@param block The block to be called whenever a change occurs. -@param queue The serial queue to deliver notifications to. -@return A token which must be held for as long as you want updates to be delivered. -*/ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** -Registers a block to be called each time the collection changes. - -The block will be asynchronously called with the initial collection, -and then called again after each write transaction which changes either any -of the objects in the collection, or which objects are in the collection. - -The `change` parameter will be `nil` the first time the block is called. -For each call after that, it will contain information about -which rows in the collection were added, removed or modified. If a -write transaction did not modify any objects in the results collection, -the block is not called at all. See the `RLMCollectionChange` documentation for -information on how the changes are reported and an example of updating a -`UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - -At the time when the block is called, the collection object will be fully -evaluated and up-to-date, and as long as you do not perform a write transaction -on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will -never perform blocking work. - -Notifications are delivered on the given queue. If the queue is blocked and -notifications can't be delivered instantly, multiple notifications may be -coalesced into a single notification. - -You must retain the returned token for as long as you want updates to continue -to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - -@warning This method cannot be called when the containing Realm is read-only or frozen. -@warning The queue must be a serial queue. - -@param block The block to be called whenever a change occurs. -@param queue The serial queue to deliver notifications to. -@param keyPaths The block will be called for changes occurring on these keypaths. If no -key paths are given, notifications are delivered for every property key path. -@return A token which must be held for as long as you want updates to be delivered. -*/ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -#pragma mark - Sectioned Results - -/** - Sorts and sections this collection from a given property key path, returning the result - as an instance of `RLMSectionedResults`. - - @param keyPath The property key path to sort on. - @param ascending The direction to sort in. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsSortedUsingKeyPath:(NSString *)keyPath - ascending:(BOOL)ascending - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -/** - Sorts and sections this collection from a given array of sort descriptors, returning the result - as an instance of `RLMSectionedResults`. - - @param sortDescriptors An array of `RLMSortDescriptor`s to sort by. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @note The primary sort descriptor must be responsible for determining the section key. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsUsingSortDescriptors:(NSArray *)sortDescriptors - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the objects - in the collection. - - NSNumber *min = [results minOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The minimum value of the property, or `nil` if the Results are empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects - in the collection. - - NSNumber *max = [results maxOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose maximum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The maximum value of the property, or `nil` if the Results are empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of the values of a given property over all the objects in the collection. - - NSNumber *sum = [results sumOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose values should be summed. Only properties of - types `int`, `float`, and `double` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects in the collection. - - NSNumber *average = [results averageOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose average value should be calculated. Only - properties of types `int`, `float`, and `double` are supported. - - @return The average value of the given property, or `nil` if the Results are empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -#pragma mark - Freeze - -/** - Indicates if the collection is frozen. - - Frozen collections are immutable and can be accessed from any thread. The - objects read from a frozen collection will also be frozen. - */ -@property (nonatomic, readonly, getter=isFrozen) BOOL frozen; - -/** - Returns a frozen (immutable) snapshot of this collection. - - The frozen copy is an immutable collection which contains the same data as - this collection currently contains, but will not update when writes are made - to the containing Realm. Unlike live collections, frozen collections can be - accessed from any thread. - - @warning This method cannot be called during a write transaction, or when the containing Realm is read-only. - @warning Holding onto a frozen collection for an extended period while - performing write transaction on the Realm may result in the Realm - file growing to large sizes. See - `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -@end - -/** - An `RLMSortDescriptor` stores a property name and a sort order for use with - `sortedResultsUsingDescriptors:`. It is similar to `NSSortDescriptor`, but supports - only the subset of functionality which can be efficiently run by Realm's query - engine. - - `RLMSortDescriptor` instances are immutable. - */ -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMSortDescriptor : NSObject - -#pragma mark - Properties - -/** - The key path which the sort descriptor orders results by. - */ -@property (nonatomic, readonly) NSString *keyPath; - -/** - Whether the descriptor sorts in ascending or descending order. - */ -@property (nonatomic, readonly) BOOL ascending; - -#pragma mark - Methods - -/** - Returns a new sort descriptor for the given key path and sort direction. - */ -+ (instancetype)sortDescriptorWithKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a copy of the receiver with the sort direction reversed. - */ -- (instancetype)reversedSortDescriptor; - -@end - -/** - A `RLMCollectionChange` object encapsulates information about changes to collections - that are reported by Realm notifications. - - `RLMCollectionChange` is passed to the notification blocks registered with - `-addNotificationBlock` on `RLMArray` and `RLMResults`, and reports what rows in the - collection changed since the last time the notification block was called. - - The change information is available in two formats: a simple array of row - indices in the collection for each type of change, and an array of index paths - in a requested section suitable for passing directly to `UITableView`'s batch - update methods. A complete example of updating a `UITableView` named `tv`: - - [tv beginUpdates]; - [tv deleteRowsAtIndexPaths:[changes deletionsInSection:0] withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv insertRowsAtIndexPaths:[changes insertionsInSection:0] withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv reloadRowsAtIndexPaths:[changes modificationsInSection:0] withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv endUpdates]; - - All of the arrays in an `RLMCollectionChange` are always sorted in ascending order. - */ -@interface RLMCollectionChange : NSObject -/// The indices of objects in the previous version of the collection which have -/// been removed from this one. -@property (nonatomic, readonly) NSArray *deletions; - -/// The indices in the new version of the collection which were newly inserted. -@property (nonatomic, readonly) NSArray *insertions; - -/** - The indices in the new version of the collection which were modified. - - For `RLMResults`, this means that one or more of the properties of the object at - that index were modified (or an object linked to by that object was - modified). - - For `RLMArray`, the array itself being modified to contain a - different object at that index will also be reported as a modification. - */ -@property (nonatomic, readonly) NSArray *modifications; - -/// Returns the index paths of the deletion indices in the given section. -- (NSArray *)deletionsInSection:(NSUInteger)section; - -/// Returns the index paths of the insertion indices in the given section. -- (NSArray *)insertionsInSection:(NSUInteger)section; - -/// Returns the index paths of the modification indices in the given section. -- (NSArray *)modificationsInSection:(NSUInteger)section; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMConstants.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMConstants.h deleted file mode 100644 index 0bc8db972..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMConstants.h +++ /dev/null @@ -1,156 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#define RLM_HEADER_AUDIT_BEGIN NS_HEADER_AUDIT_BEGIN -#define RLM_HEADER_AUDIT_END NS_HEADER_AUDIT_END - -#define RLM_SWIFT_SENDABLE NS_SWIFT_SENDABLE - -#define RLM_FINAL __attribute__((objc_subclassing_restricted)) - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -// Swift 5 considers NS_ENUM to be "open", meaning there could be values present -// other than the defined cases (which allows adding more cases later without -// it being a breaking change), while older versions consider it "closed". -#ifdef NS_CLOSED_ENUM -#define RLM_CLOSED_ENUM NS_CLOSED_ENUM -#else -#define RLM_CLOSED_ENUM NS_ENUM -#endif - -#if __has_attribute(ns_error_domain) && (!defined(__cplusplus) || !__cplusplus || __cplusplus >= 201103L) -#define RLM_ERROR_ENUM(type, name, domain) \ - _Pragma("clang diagnostic push") \ - _Pragma("clang diagnostic ignored \"-Wignored-attributes\"") \ - NS_ENUM(type, __attribute__((ns_error_domain(domain))) name) \ - _Pragma("clang diagnostic pop") -#else -#define RLM_ERROR_ENUM(type, name, domain) NS_ENUM(type, name) -#endif - -#define RLM_HIDDEN __attribute__((visibility("hidden"))) -#define RLM_VISIBLE __attribute__((visibility("default"))) -#define RLM_HIDDEN_BEGIN _Pragma("GCC visibility push(hidden)") -#define RLM_HIDDEN_END _Pragma("GCC visibility pop") -#define RLM_DIRECT __attribute__((objc_direct)) -#define RLM_DIRECT_MEMBERS __attribute__((objc_direct_members)) - -#pragma mark - Enums - -/** - `RLMPropertyType` is an enumeration describing all property types supported in Realm models. - - For more information, see [Realm Models](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/object-models-and-schemas/). - */ -typedef RLM_CLOSED_ENUM(int32_t, RLMPropertyType) { - -#pragma mark - Primitive types - /** Integers: `NSInteger`, `int`, `long`, `Int` (Swift) */ - RLMPropertyTypeInt = 0, - /** Booleans: `BOOL`, `bool`, `Bool` (Swift) */ - RLMPropertyTypeBool = 1, - /** Floating-point numbers: `float`, `Float` (Swift) */ - RLMPropertyTypeFloat = 5, - /** Double-precision floating-point numbers: `double`, `Double` (Swift) */ - RLMPropertyTypeDouble = 6, - /** NSUUID, UUID */ - RLMPropertyTypeUUID = 12, - -#pragma mark - Object types - - /** Strings: `NSString`, `String` (Swift) */ - RLMPropertyTypeString = 2, - /** Binary data: `NSData` */ - RLMPropertyTypeData = 3, - /** Any type: `id`, `AnyRealmValue` (Swift) */ - RLMPropertyTypeAny = 9, - /** Dates: `NSDate` */ - RLMPropertyTypeDate = 4, - -#pragma mark - Linked object types - - /** Realm model objects. See [Realm Models](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/object-models-and-schemas/) for more information. */ - RLMPropertyTypeObject = 7, - /** Realm linking objects. See [Realm Models](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/relationships/#inverse-relationship) for more information. */ - RLMPropertyTypeLinkingObjects = 8, - - RLMPropertyTypeObjectId = 10, - RLMPropertyTypeDecimal128 = 11 -}; - -#pragma mark - Notification Constants - -/** - A notification indicating that changes were made to a Realm. -*/ -typedef NSString * RLMNotification NS_EXTENSIBLE_STRING_ENUM; - -/** - This notification is posted when a write transaction has been committed to a Realm on a different thread for - the same file. - - It is not posted if `autorefresh` is enabled, or if the Realm is refreshed before the notification has a chance - to run. - - Realms with autorefresh disabled should normally install a handler for this notification which calls - `-[RLMRealm refresh]` after doing some work. Refreshing the Realm is optional, but not refreshing the Realm may lead to - large Realm files. This is because an extra copy of the data must be kept for the stale Realm. - */ -extern RLMNotification const RLMRealmRefreshRequiredNotification NS_SWIFT_NAME(RefreshRequired); - -/** - This notification is posted by a Realm when a write transaction has been - committed to a Realm on a different thread for the same file. - - It is not posted if `-[RLMRealm autorefresh]` is enabled, or if the Realm is - refreshed before the notification has a chance to run. - - Realms with autorefresh disabled should normally install a handler for this - notification which calls `-[RLMRealm refresh]` after doing some work. Refreshing - the Realm is optional, but not refreshing the Realm may lead to large Realm - files. This is because Realm must keep an extra copy of the data for the stale - Realm. - */ -extern RLMNotification const RLMRealmDidChangeNotification NS_SWIFT_NAME(DidChange); - -#pragma mark - Error keys - -/** Key to identify the associated backup Realm configuration in an error's `userInfo` dictionary */ -extern NSString * const RLMBackupRealmConfigurationErrorKey; - -#pragma mark - Other Constants - -/** The schema version used for uninitialized Realms */ -extern const uint64_t RLMNotVersioned; - -/** The corresponding value is the name of an exception thrown by Realm. */ -extern NSString * const RLMExceptionName; - -/** The corresponding value is a Realm file version. */ -extern NSString * const RLMRealmVersionKey; - -/** The corresponding key is the version of the underlying database engine. */ -extern NSString * const RLMRealmCoreVersionKey; - -/** The corresponding key is the Realm invalidated property name. */ -extern NSString * const RLMInvalidatedKey; - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMCredentials.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMCredentials.h deleted file mode 100644 index adff4e7e9..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMCredentials.h +++ /dev/null @@ -1,126 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) -@protocol RLMBSON; - -/// A token representing an identity provider's credentials. -typedef NSString *RLMCredentialsToken; - -/// A type representing the unique identifier of an Atlas App Services identity provider. -typedef NSString *RLMIdentityProvider NS_EXTENSIBLE_STRING_ENUM; - -/// The username/password identity provider. User accounts are handled by Atlas App Services directly without the -/// involvement of a third-party identity provider. -extern RLMIdentityProvider const RLMIdentityProviderUsernamePassword; - -/// A Facebook account as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderFacebook; - -/// A Google account as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderGoogle; - -/// An Apple account as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderApple; - -/// A JSON Web Token as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderJWT; - -/// An Anonymous account as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderAnonymous; - -/// An Realm Cloud function as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderFunction; - -/// A user api key as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderUserAPIKey; - -/// A server api key as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderServerAPIKey; - -/** - Opaque credentials representing a specific Realm App user. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMCredentials : NSObject - -/// The name of the identity provider which generated the credentials token. -@property (nonatomic, readonly) RLMIdentityProvider provider; - -/** - Construct and return credentials from a Facebook account token. - */ -+ (instancetype)credentialsWithFacebookToken:(RLMCredentialsToken)token; - -/** - Construct and return credentials from a Google account token. - */ -+ (instancetype)credentialsWithGoogleAuthCode:(RLMCredentialsToken)token; - -/** - Construct and return credentials from a Google id token. - */ -+ (instancetype)credentialsWithGoogleIdToken:(RLMCredentialsToken)token; - -/** - Construct and return credentials from an Apple account token. - */ -+ (instancetype)credentialsWithAppleToken:(RLMCredentialsToken)token; - -/** - Construct and return credentials for an Atlas App Services function using a mongodb document as a json payload. -*/ -+ (instancetype)credentialsWithFunctionPayload:(NSDictionary> *)payload; - -/** - Construct and return credentials from a user api key. -*/ -+ (instancetype)credentialsWithUserAPIKey:(NSString *)apiKey; - -/** - Construct and return credentials from a server api key. -*/ -+ (instancetype)credentialsWithServerAPIKey:(NSString *)apiKey; - -/** - Construct and return Atlas App Services credentials from an email and password. - */ -+ (instancetype)credentialsWithEmail:(NSString *)email - password:(NSString *)password; - -/** - Construct and return credentials from a JSON Web Token. - */ -+ (instancetype)credentialsWithJWT:(NSString *)token; - -/** - Construct and return anonymous credentials - */ -+ (instancetype)anonymousCredentials; - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("RLMAppCredentials cannot be created directly"))); - -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("RLMAppCredentials cannot be created directly"))); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMDecimal128.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMDecimal128.h deleted file mode 100644 index f6224bbf2..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMDecimal128.h +++ /dev/null @@ -1,110 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A 128-bit IEEE 754-2008 decimal floating point number. - - This type is similar to Swift's built-in Decimal type, but allocates bits - differently, resulting in a different representable range. (NS)Decimal stores a - significand of up to 38 digits long and an exponent from -128 to 127, while - this type stores up to 34 digits of significand and an exponent from -6143 to - 6144. - */ -RLM_SWIFT_SENDABLE // immutable -@interface RLMDecimal128 : NSObject -/// Creates a new zero-initialized decimal128. -- (instancetype)init; - -/// Converts the given value to a RLMDecimal128. -/// -/// The following types can be converted to RLMDecimal128: -/// - NSNumber -/// - NSString -/// - NSDecimalNumber -/// -/// Passing a value with a type not in this list is a fatal error. Passing a -/// string which cannot be parsed as a valid Decimal128 is a fatal error. -- (instancetype)initWithValue:(id)value; - -/// Converts the given number to a RLMDecimal128. -- (instancetype)initWithNumber:(NSNumber *)number; - -/// Parses the given string to a RLMDecimal128. -/// -/// Returns a decimal where `isNaN` is `YES` if the string cannot be parsed as a decimal. `error` is never set -/// and this will never actually return `nil`. -- (nullable instancetype)initWithString:(NSString *)string error:(NSError **)error; - -/// Converts the given number to a RLMDecimal128. -+ (instancetype)decimalWithNumber:(NSNumber *)number; - -/// The minimum value for RLMDecimal128. -@property (class, readonly, copy) RLMDecimal128 *minimumDecimalNumber NS_REFINED_FOR_SWIFT; - -/// The maximum value for RLMDecimal128. -@property (class, readonly, copy) RLMDecimal128 *maximumDecimalNumber NS_REFINED_FOR_SWIFT; - -/// Convert this value to a double. This is a lossy conversion. -@property (nonatomic, readonly) double doubleValue; - -/// Convert this value to a NSDecimal. This may be a lossy conversion. -@property (nonatomic, readonly) NSDecimal decimalValue; - -/// Convert this value to a string. -@property (nonatomic, readonly) NSString *stringValue; - -/// Gets if this Decimal128 represents a NaN value. -@property (nonatomic, readonly) BOOL isNaN; - -/// The magnitude of this RLMDecimal128. -@property (nonatomic, readonly) RLMDecimal128 *magnitude NS_REFINED_FOR_SWIFT; - -/// Replaces this RLMDecimal128 value with its additive inverse. -- (void)negate; - -/// Adds the right hand side to the current value and returns the result. -- (RLMDecimal128 *)decimalNumberByAdding:(RLMDecimal128 *)decimalNumber; - -/// Divides the right hand side to the current value and returns the result. -- (RLMDecimal128 *)decimalNumberByDividingBy:(RLMDecimal128 *)decimalNumber; - -/// Subtracts the right hand side to the current value and returns the result. -- (RLMDecimal128 *)decimalNumberBySubtracting:(RLMDecimal128 *)decimalNumber; - -/// Multiply the right hand side to the current value and returns the result. -- (RLMDecimal128 *)decimalNumberByMultiplyingBy:(RLMDecimal128 *)decimalNumber; - -/// Comparision operator to check if the right hand side is greater than the current value. -- (BOOL)isGreaterThan:(nullable RLMDecimal128 *)decimalNumber; - -/// Comparision operator to check if the right hand side is greater than or equal to the current value. -- (BOOL)isGreaterThanOrEqualTo:(nullable RLMDecimal128 *)decimalNumber; - -/// Comparision operator to check if the right hand side is less than the current value. -- (BOOL)isLessThan:(nullable RLMDecimal128 *)decimalNumber; - -/// Comparision operator to check if the right hand side is less than or equal to the current value. -- (BOOL)isLessThanOrEqualTo:(nullable RLMDecimal128 *)decimalNumber; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMDictionary.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMDictionary.h deleted file mode 100644 index 9c8cac538..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMDictionary.h +++ /dev/null @@ -1,559 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObject, RLMResults, RLMDictionaryChange; - -/** - `RLMDictionary` is a container type in Realm representing a dynamic collection of key-value pairs. - - Unlike `NSDictionary`, `RLMDictionary`s hold a single key and value type. - This is referred to in these docs as the “type” and “keyType” of the dictionary. - - When declaring an `RLMDictionary` property, the object type and keyType must be marked as conforming to a - protocol by the same name as the objects it should contain. - - RLM_COLLECTION_TYPE(ObjectType) - ... - @property RLMDictionary *objectTypeDictionary; - - `RLMDictionary`s can be queried with the same predicates as `RLMObject` and `RLMResult`s. - - `RLMDictionary`s cannot be created directly. `RLMDictionary` properties on `RLMObject`s are - lazily created when accessed, or can be obtained by querying a Realm. - - `RLMDictionary` only supports `NSString` as a key. Realm disallows the use of `.` or `$` characters within a dictionary key. - - ### Key-Value Observing - - `RLMDictionary` supports dictionary key-value observing on `RLMDictionary` properties on `RLMObject` - subclasses, and the `invalidated` property on `RLMDictionary` instances themselves is - key-value observing compliant when the `RLMDictionary` is attached to a managed - `RLMObject` (`RLMDictionary`s on unmanaged `RLMObject`s will never become invalidated). - */ -@interface RLMDictionary: NSObject - -#pragma mark - Properties - -/** - The number of entries in the dictionary. - */ -@property (nonatomic, readonly, assign) NSUInteger count; - -/** - The type of the objects in the dictionary. - */ -@property (nonatomic, readonly, assign) RLMPropertyType type; - -/** - The type of the key used in this dictionary. - */ -@property (nonatomic, readonly, assign) RLMPropertyType keyType; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readonly, getter = isOptional) BOOL optional; - -/** - The class name of the objects contained in the dictionary. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages the dictionary. Returns `nil` for unmanaged dictionary. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - Indicates if the dictionary can no longer be accessed. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if the dictionary is frozen. - - Frozen dictionaries are immutable and can be accessed from any thread. Frozen dictionaries - are created by calling `-freeze` on a managed live dictionary. Unmanaged dictionaries are - never frozen. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Accessing Objects from a Dictionary - -/** - Returns the value associated with a given key. - - @param key The name of the property. - - @discussion If key does not start with “@”, invokes object(forKey:). If key does start - with “@”, strips the “@” and invokes [super valueForKey:] with the rest of the key. - - @return A value associated with a given key or `nil`. - */ -- (nullable id)valueForKey:(nonnull RLMKeyType)key; - -/** - Returns an array containing the dictionary’s keys. - - @note The order of the elements in the array is not defined. - */ -@property(readonly, copy) NSArray *allKeys; - -/** - Returns an array containing the dictionary’s values. - - @note The order of the elements in the array is not defined. - */ -@property(readonly, copy) NSArray *allValues; - -/** - Returns the value associated with a given key. - - @note `nil` will be returned if no value is associated with a given key. NSNull will be returned - where null is associated with the key. - - @param key The key for which to return the corresponding value. - - @return The value associated with key. - */ -- (nullable RLMObjectType)objectForKey:(nonnull RLMKeyType)key; - -/** - Returns the value associated with a given key. - - @note `nil` will be returned if no value is associated with a given key. NSNull will be returned - where null is associated with the key. - - @param key The key for which to return the corresponding value. - - @return The value associated with key. - */ -- (nullable RLMObjectType)objectForKeyedSubscript:(RLMKeyType)key; - -/** - Applies a given block object to the each key-value pair of the dictionary. - - @param block A block object to operate on entries in the dictionary. - - @note If the block sets *stop to YES, the enumeration stops. - */ -- (void)enumerateKeysAndObjectsUsingBlock:(void (^)(RLMKeyType key, RLMObjectType obj, BOOL *stop))block; - -#pragma mark - Adding, Removing, and Replacing Objects in a Dictionary - -/** - Replace the contents of a dictionary with the contents of another dictionary - NSDictionary or RLMDictionary. - - This will remove all elements in this dictionary and then apply each element from the given dictionary. - - @warning This method may only be called during a write transaction. - @warning If otherDictionary is self this will result in an empty dictionary. - */ -- (void)setDictionary:(id)otherDictionary; - -/** - Removes all contents in the dictionary. - - @warning This method may only be called during a write transaction. - */ -- (void)removeAllObjects; - -/** - Removes from the dictionary entries specified by elements in a given array. If a given key does not - exist, no mutation will happen for that key. - - @warning This method may only be called during a write transaction. - */ -- (void)removeObjectsForKeys:(NSArray *)keyArray; - -/** - Removes a given key and its associated value from the dictionary. If the key does not exist the dictionary - will not be modified. - - @warning This method may only be called during a write transaction. - */ -- (void)removeObjectForKey:(RLMKeyType)key; - -/** - Adds a given key-value pair to the dictionary if the key is not present, or updates the value for the given key - if the key already present. - - @warning This method may only be called during a write transaction. - */ -- (void)setObject:(nullable RLMObjectType)obj forKeyedSubscript:(RLMKeyType)key; - -/** - Adds a given key-value pair to the dictionary if the key is not present, or updates the value for the given key - if the key already present. - - @warning This method may only be called during a write transaction. - */ -- (void)setObject:(nullable RLMObjectType)anObject forKey:(RLMKeyType)aKey; - -/** - Adds to the receiving dictionary the entries from another dictionary. - - @note If the receiving dictionary contains the same key(s) as the otherDictionary, then - the receiving dictionary will update each key-value pair for the matching key. - - @warning This method may only be called during a write transaction. - - @param otherDictionary An enumerable object such as `NSDictionary` or `RLMDictionary` which contains objects of the - same type as the receiving dictionary. - */ -- (void)addEntriesFromDictionary:(id )otherDictionary; - -#pragma mark - Querying a Dictionary - -/** - Returns all the values matching the given predicate in the dictionary. - - @note The keys in the dictionary are ignored when quering values, and they will not be returned in the `RLMResults`. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` of objects that match the given predicate. - */ -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all the values matching the given predicate in the dictionary. - - @note The keys in the dictionary are ignored when quering values, and they will not be returned in the `RLMResults`. - - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` of objects that match the given predicate - */ -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/** - Returns a sorted RLMResults of all values in the dictionary. - - @note The keys in the dictionary are ignored when sorting values, and they will not be returned in the `RLMResults`. - - @param keyPath The key path to sort by. - @param ascending The direction to sort in. - - @return An `RLMResults` sorted by the specified key path. - */- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a sorted RLMResults of all values in the dictionary. - - @note The keys in the dictionary are ignored when sorting values, and they will not be returned in the `RLMResults`. - - @param properties An array of `RLMSortDescriptor`s to sort by. - - @return An `RLMResults` sorted by the specified properties. - */ -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/** - Returns a distinct `RLMResults` from all values in the dictionary. - - @note The keys in the dictionary are ignored, and they will not be returned in the `RLMResults`. - - @param keyPaths The key paths to distinct on. - - @return An `RLMResults` with the distinct values of the keypath(s). - */ -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the values in the dictionary. - - NSNumber *min = [object.dictionaryProperty minOfProperty:@"age"]; - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, `NSDate`, `RLMValue` and `RLMDecimal128` are supported. - - @return The minimum value of the property, or `nil` if the dictionary is empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects in the dictionary. - - NSNumber *max = [object.dictionaryProperty maxOfProperty:@"age"]; - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, `NSDate`, `RLMValue` and `RLMDecimal128` are supported. - - @return The maximum value of the property, or `nil` if the dictionary is empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of distinct values of a given property over all the objects in the dictionary. - - NSNumber *sum = [object.dictionaryProperty sumOfProperty:@"age"]; - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, `RLMValue` and `RLMDecimal128` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects in the dictionary. - - NSNumber *average = [object.dictionaryProperty averageOfProperty:@"age"]; - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, `NSDate`, `RLMValue` and `RLMDecimal128` are supported. - - @return The average value of the given property, or `nil` if the dictionary is empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -#pragma mark - Notifications - -/** - Registers a block to be called each time the dictionary changes. - - The block will be asynchronously called with the initial dictionary, and then - called again after each write transaction which changes any of the keys or values - within the dictionary. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which keys in the dictionary were added, modified or deleted. If a write transaction - did not modify any keys or values in the dictionary, the block is not called at all. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - Person *person = [[Person allObjectsInRealm:realm] firstObject]; - NSLog(@"person.dogs.count: %zu", person.dogs.count); // => 0 - self.token = [person.dogs addNotificationBlock(RLMDictionary *dogs, - RLMDictionaryChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - person.dogs[@"frenchBulldog"] = dog; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a non-frozen managed dictionary. - - @param block The block to be called each time the dictionary changes. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMDictionary *_Nullable dictionary, - RLMDictionaryChange *_Nullable changes, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the dictionary changes. - - The block will be asynchronously called with the initial dictionary, and then - called again after each write transaction which changes any of the key-value in - the dictionary or which objects are in the results. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which keys in the dictionary were added or modified. If a write transaction - did not modify any objects in the dictionary, the block is not called at all. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMDictionary *_Nullable dictionary, - RLMDictionaryChange *_Nullable changes, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the dictionary changes. - - The block will be asynchronously called with the initial dictionary, and then - called again after each write transaction which changes any of the key-value in - the dictionary or which objects are in the results. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which keys in the dictionary were added or modified. If a write transaction - did not modify any objects in the dictionary, the block is not called at all. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMDictionary *_Nullable dictionary, - RLMDictionaryChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the dictionary changes. - - The block will be asynchronously called with the initial dictionary, and then - called again after each write transaction which changes any of the key-value in - the dictionary or which objects are in the results. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which keys in the dictionary were added or modified. If a write transaction - did not modify any objects in the dictionary, the block is not called at all. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMDictionary *_Nullable dictionary, - RLMDictionaryChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths -__attribute__((warn_unused_result)); - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of a dictionary. - - The frozen copy is an immutable dictionary which contains the same data as this - dictionary currently contains, but will not update when writes are made to the - containing Realm. Unlike live dictionaries, frozen dictionaries can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a managed dictionary. - @warning Holding onto a frozen dictionary for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -#pragma mark - Unavailable Methods -/** - `-[RLMDictionary init]` is not available because `RLMDictionary`s cannot be created directly. - `RLMDictionary` properties on `RLMObject`s are lazily created when accessed. - */ -- (instancetype)init __attribute__((unavailable("RLMDictionary cannot be created directly"))); -/** - `+[RLMDictionary new]` is not available because `RLMDictionary`s cannot be created directly. - `RLMDictionary` properties on `RLMObject`s are lazily created when accessed. - */ -+ (instancetype)new __attribute__((unavailable("RLMDictionary cannot be created directly"))); - -@end - -/** - A `RLMDictionaryChange` object encapsulates information about changes to dictionaries - that are reported by Realm notifications. - - `RLMDictionaryChange` is passed to the notification blocks registered with - `-addNotificationBlock` on `RLMDictionary`, and reports what keys in the - dictionary changed since the last time the notification block was called. - */ -@interface RLMDictionaryChange : NSObject -/// The keys in the new version of the dictionary which were newly inserted. -@property (nonatomic, readonly) NSArray *insertions; - -/// The keys in the new version of the dictionary which were modified. -@property (nonatomic, readonly) NSArray *modifications; - -/// The keys which were deleted from the old version. -@property (nonatomic, readonly) NSArray *deletions; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMEmailPasswordAuth.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMEmailPasswordAuth.h deleted file mode 100644 index 748eb26af..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMEmailPasswordAuth.h +++ /dev/null @@ -1,120 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@protocol RLMBSON; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// A block type used to report an error -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMEmailPasswordAuthOptionalErrorBlock)(NSError * _Nullable); - -/** - A client for the email/password authentication provider which - can be used to obtain a credential for logging in, - and to perform requests specifically related to the email/password provider. -*/ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMEmailPasswordAuth : RLMProviderClient - -/** - Registers a new email identity with the email/password provider, - and sends a confirmation email to the provided address. - - @param email The email address of the user to register. - @param password The password that the user created for the new email/password identity. - @param completionHandler A callback to be invoked once the call is complete. -*/ - -- (void)registerUserWithEmail:(NSString *)email - password:(NSString *)password - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler NS_SWIFT_NAME(registerUser(email:password:completion:)); - -/** - Confirms an email identity with the email/password provider. - - @param token The confirmation token that was emailed to the user. - @param tokenId The confirmation token id that was emailed to the user. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)confirmUser:(NSString *)token - tokenId:(NSString *)tokenId - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Re-sends a confirmation email to a user that has registered but - not yet confirmed their email address. - - @param email The email address of the user to re-send a confirmation for. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)resendConfirmationEmail:(NSString *)email - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Retries custom confirmation function for a given email address. - - @param email The email address of the user to retry custom confirmation logic. - @param completionHandler A callback to be invoked once the call is complete. - */ -- (void)retryCustomConfirmation:(NSString *)email - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Sends a password reset email to the given email address. - - @param email The email address of the user to send a password reset email for. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)sendResetPasswordEmail:(NSString *)email - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Resets the password of an email identity using the - password reset token emailed to a user. - - @param password The new password. - @param token The password reset token that was emailed to the user. - @param tokenId The password reset token id that was emailed to the user. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)resetPasswordTo:(NSString *)password - token:(NSString *)token - tokenId:(NSString *)tokenId - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Resets the password of an email identity using the - password reset function set up in the application. - - @param email The email address of the user. - @param password The desired new password. - @param args A list of arguments passed in as a BSON array. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)callResetPasswordFunction:(NSString *)email - password:(NSString *)password - args:(NSArray> *)args - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMEmbeddedObject.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMEmbeddedObject.h deleted file mode 100644 index 4db6248ca..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMEmbeddedObject.h +++ /dev/null @@ -1,367 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectSchema, RLMPropertyDescriptor, RLMRealm, RLMNotificationToken, RLMPropertyChange; -typedef void (^RLMObjectChangeBlock)(BOOL deleted, - NSArray *_Nullable changes, - NSError *_Nullable error); -/** - `RLMEmbeddedObject` is a base class used to define Realm model objects. - - Embedded objects work similarly to normal objects, but are owned by a single - parent Object (which itself may be embedded). Unlike normal top-level objects, - embedded objects cannot be directly created in or added to a Realm. Instead, - they can only be created as part of a parent object, or by assigning an - unmanaged object to a parent object's property. Embedded objects are - automatically deleted when the parent object is deleted or when the parent is - modified to no longer point at the embedded object, either by reassigning an - RLMObject property or by removing the embedded object from the array containing - it. - - Embedded objects can only ever have a single parent object which links to them, - and attempting to link to an existing managed embedded object will throw an - exception. - - The property types supported on `RLMEmbeddedObject` are the same as for - `RLMObject`, except for that embedded objects cannot link to top-level objects, - so `RLMObject` and `RLMArray` properties are not supported - (`RLMEmbeddedObject` and `RLMArray` *are*). - - Embedded objects cannot have primary keys or indexed properties. - */ - -@interface RLMEmbeddedObject : RLMObjectBase - -#pragma mark - Creating & Initializing Objects - -/** - Creates an unmanaged instance of a Realm object. - - Unmanaged embedded objects can be added to a Realm by assigning them to an - object property of a managed Realm object or by adding them to a managed - RLMArray. - */ -- (instancetype)init NS_DESIGNATED_INITIALIZER; - -/** - Creates an unmanaged instance of a Realm object. - - Pass in an `NSArray` or `NSDictionary` instance to set the values of the object's properties. - - Unmanaged embedded objects can be added to a Realm by assigning them to an - object property of a managed Realm object or by adding them to a managed - RLMArray. - */ -- (instancetype)initWithValue:(id)value; - -/** - Returns the class name for a Realm object subclass. - - @warning Do not override. Realm relies on this method returning the exact class - name. - - @return The class name for the model class. - */ -+ (NSString *)className; - -#pragma mark - Properties - -/** - The Realm which manages the object, or `nil` if the object is unmanaged. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - The object schema which lists the managed properties for the object. - */ -@property (nonatomic, readonly) RLMObjectSchema *objectSchema; - -/** - Indicates if the object can no longer be accessed because it is now invalid. - - An object can no longer be accessed if the object has been deleted from the Realm that manages it, or - if `invalidate` is called on that Realm. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if this object is frozen. - - @see `-[RLMEmbeddedObject freeze]` - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Customizing your Objects - -/** - Override this method to specify the default values to be used for each property. - - @return A dictionary mapping property names to their default values. - */ -+ (nullable NSDictionary *)defaultPropertyValues; - -/** - Override this method to specify the names of properties to ignore. These properties will not be managed by the Realm - that manages the object. - - @return An array of property names to ignore. - */ -+ (nullable NSArray *)ignoredProperties; - -/** - Override this method to specify the names of properties that are non-optional (i.e. cannot be assigned a `nil` value). - - By default, all properties of a type whose values can be set to `nil` are - considered optional properties. To require that an object in a Realm always - store a non-`nil` value for a property, add the name of the property to the - array returned from this method. - - Properties of `RLMEmbeddedObject` type cannot be non-optional. Array and - `NSNumber` properties can be non-optional, but there is no reason to do so: - arrays do not support storing nil, and if you want a non-optional number you - should instead use the primitive type. - - @return An array of property names that are required. - */ -+ (NSArray *)requiredProperties; - -/** - Override this method to provide information related to properties containing linking objects. - - Each property of type `RLMLinkingObjects` must have a key in the dictionary returned by this method consisting - of the property name. The corresponding value must be an instance of `RLMPropertyDescriptor` that describes the class - and property that the property is linked to. - - return @{ @"owners": [RLMPropertyDescriptor descriptorWithClass:Owner.class propertyName:@"dogs"] }; - - @return A dictionary mapping property names to `RLMPropertyDescriptor` instances. - */ -+ (NSDictionary *)linkingObjectsProperties; - -#pragma mark - Notifications - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in differen - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When notifications - can't be delivered instantly, multiple notifications may be coalesced into a - single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - - @param block The block to be called whenever a change occurs. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block queue:(dispatch_queue_t)queue; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block keyPaths:(NSArray *)keyPaths queue:(dispatch_queue_t)queue; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block keyPaths:(NSArray *)keyPaths; - -#pragma mark - Other Instance Methods - -/** - Returns YES if another Realm object instance points to the same object as the - receiver in the Realm managing the receiver. - - For frozen objects and object types with a primary key, `isEqual:` is - overridden to use the same logic as this method (along with a corresponding - implementation for `hash`). Non-frozen objects without primary keys use - pointer identity for `isEqual:` and `hash`. - - @param object The object to compare the receiver to. - - @return Whether the object represents the same object as the receiver. - */ -- (BOOL)isEqualToObject:(RLMEmbeddedObject *)object; - -/** - Returns a frozen (immutable) snapshot of this object. - - The frozen copy is an immutable object which contains the same data as this - object currently contains, but will not update when writes are made to the - containing Realm. Unlike live objects, frozen objects can be accessed from any - thread. - - - warning: Holding onto a frozen object for an extended period while performing write - transaction on the Realm may result in the Realm file growing to large sizes. See - `Realm.Configuration.maximumNumberOfActiveVersions` for more information. - - warning: This method can only be called on a managed object. - */ -- (instancetype)freeze NS_RETURNS_RETAINED; - -/** - Returns a live (mutable) reference of this object. - - This method creates a managed accessor to a live copy of the same frozen object. - Will return self if called on an already live object. - */ -- (instancetype)thaw; - -#pragma mark - Dynamic Accessors - -/// :nodoc: -- (nullable id)objectForKeyedSubscript:(NSString *)key; - -/// :nodoc: -- (void)setObject:(nullable id)obj forKeyedSubscript:(NSString *)key; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMError.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMError.h deleted file mode 100644 index 514ceee3f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMError.h +++ /dev/null @@ -1,442 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2022 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@protocol RLMValue; - -#pragma mark - Error Domains - -/** Error code is a value from the RLMError enum. */ -extern NSString *const RLMErrorDomain; - -/** An error domain identifying non-specific system errors. */ -extern NSString *const RLMUnknownSystemErrorDomain; - -/** - The error domain string for all SDK errors related to errors reported - by the synchronization manager error handler, as well as general sync - errors that don't fall into any of the other categories. - */ -extern NSString *const RLMSyncErrorDomain; - -/** - The error domain string for all SDK errors related to the authentication - endpoint. - */ -extern NSString *const RLMSyncAuthErrorDomain; - -/** -The error domain string for all SDK errors related to the Atlas App Services -endpoint. -*/ -extern NSString *const RLMAppErrorDomain; - -#pragma mark - RLMError - -/// A user info key containing the error code. This is provided for backwards -/// compatibility only and should not be used. -extern NSString *const RLMErrorCodeKey __attribute((deprecated("use -[NSError code]"))); - -/// A user info key containing the name of the error code. This is for -/// debugging purposes only and should not be relied on. -extern NSString *const RLMErrorCodeNameKey; - -/// A user info key present in sync errors which originate from the server, -/// containing the URL of the server-side logs associated with the error. -extern NSString * const RLMServerLogURLKey; - -/// A user info key containing a HTTP status code. Some ``RLMAppError`` codes -/// include this, most notably ``RLMAppErrorHttpRequestFailed``. -extern NSString * const RLMHTTPStatusCodeKey; - -/// A user info key containing a `RLMCompensatingWriteInfo` which includes -/// further details about what was reverted by the server. -extern NSString *const RLMCompensatingWriteInfoKey; - -/** - `RLMError` is an enumeration representing all recoverable errors. It is - associated with the Realm error domain specified in `RLMErrorDomain`. - */ -typedef RLM_ERROR_ENUM(NSInteger, RLMError, RLMErrorDomain) { - /** Denotes a general error that occurred when trying to open a Realm. */ - RLMErrorFail = 1, - - /** Denotes a file I/O error that occurred when trying to open a Realm. */ - RLMErrorFileAccess = 2, - - /** - Denotes a file permission error that occurred when trying to open a Realm. - - This error can occur if the user does not have permission to open or create - the specified file in the specified access mode when opening a Realm. - */ - RLMErrorFilePermissionDenied = 3, - - /** - Denotes an error where a file was to be written to disk, but another - file with the same name already exists. - */ - RLMErrorFileExists = 4, - - /** - Denotes an error that occurs if a file could not be found. - - This error may occur if a Realm file could not be found on disk when - trying to open a Realm as read-only, or if the directory part of the - specified path was not found when trying to write a copy. - */ - RLMErrorFileNotFound = 5, - - /** - Denotes an error that occurs if a file format upgrade is required to open - the file, but upgrades were explicitly disabled or the file is being open - in read-only mode. - */ - RLMErrorFileFormatUpgradeRequired = 6, - - /** - Denotes an error that occurs if the database file is currently open in - another process which cannot share with the current process due to an - architecture mismatch. - - This error may occur if trying to share a Realm file between an i386 - (32-bit) iOS Simulator and the Realm Studio application. In this case, - please use the 64-bit version of the iOS Simulator. - */ - RLMErrorIncompatibleLockFile = 8, - - /** - Denotes an error that occurs when there is insufficient available address - space to mmap the Realm file. - */ - RLMErrorAddressSpaceExhausted = 9, - - /** - Denotes an error that occurs if there is a schema version mismatch and a - migration is required. - */ - RLMErrorSchemaMismatch = 10, - - /** - Denotes an error where an operation was requested which cannot be - performed on an open file. - */ - RLMErrorAlreadyOpen = 12, - - /// Denotes an error where an input value was invalid. - RLMErrorInvalidInput = 13, - - /// Denotes an error where a write failed due to insufficient disk space. - RLMErrorOutOfDiskSpace = 14, - - /** - Denotes an error where a Realm file could not be opened because another - process has opened the same file in a way incompatible with inter-process - sharing. For example, this can result from opening the backing file for an - in-memory Realm in non-in-memory mode. - */ - RLMErrorIncompatibleSession = 15, - - /** - Denotes an error that occurs if the file is a valid Realm file, but has a - file format version which is not supported by this version of Realm. This - typically means that the file was written by a newer version of Realm, but - may also mean that it is from a pre-1.0 version of Realm (or for - synchronized files, pre-10.0). - */ - RLMErrorUnsupportedFileFormatVersion = 16, - - /** - Denotes an error that occurs if a synchronized Realm is opened in more - than one process at once. - */ - RLMErrorMultipleSyncAgents = 17, - - /// A subscription was rejected by the server. - RLMErrorSubscriptionFailed = 18, - - /// A file operation failed in a way which does not have a more specific error code. - RLMErrorFileOperationFailed = 19, - - /** - Denotes an error that occurs if the file being opened is not a valid Realm - file. Some of the possible causes of this are: - 1. The file at the given URL simply isn't a Realm file at all. - 2. The wrong encryption key was given. - 3. The Realm file is encrypted and no encryption key was given. - 4. The Realm file isn't encrypted but an encryption key was given. - 5. The file on disk has become corrupted. - */ - RLMErrorInvalidDatabase = 20, - - /** - Denotes an error that occurs if a Realm is opened in the wrong history - mode. Typically this means that either a local Realm is being opened as a - synchronized Realm or vice versa. - */ - RLMErrorIncompatibleHistories = 21, - - /** - Denotes an error that occurs if objects were written to a flexible sync - Realm without any active subscriptions for that object type. All objects - created in flexible sync Realms must match at least one active - subscription or the server will reject the write. - */ - RLMErrorNoSubscriptionForWrite = 22, -}; - -#pragma mark - RLMSyncError - -/// A user info key for use with `RLMSyncErrorClientResetError`. -extern NSString *const kRLMSyncPathOfRealmBackupCopyKey; - -/// A user info key for use with certain error types. -extern NSString *const kRLMSyncErrorActionTokenKey; - -/** - An error related to a problem that might be reported by the synchronization manager - error handler, or a callback on a sync-related API that performs asynchronous work. - */ -typedef RLM_ERROR_ENUM(NSInteger, RLMSyncError, RLMSyncErrorDomain) { - /// An error that indicates a problem with the session (a specific Realm opened for sync). - RLMSyncErrorClientSessionError = 4, - - /// An error that indicates a problem with a specific user. - RLMSyncErrorClientUserError = 5, - - /** - An error that indicates an internal, unrecoverable problem - with the underlying synchronization engine. - */ - RLMSyncErrorClientInternalError = 6, - - /** - An error that indicates the Realm needs to be reset. - - A synced Realm may need to be reset because Atlas App Services encountered an - error and had to be restored from a backup. If the backup copy of the remote Realm - is of an earlier version than the local copy of the Realm, the server will ask the - client to reset the Realm. - - The reset process is as follows: the local copy of the Realm is copied into a recovery - directory for safekeeping, and then deleted from the original location. The next time - the Realm for that partition value is opened, the Realm will automatically be re-downloaded from - Atlas App Services, and can be used as normal. - - Data written to the Realm after the local copy of the Realm diverged from the backup - remote copy will be present in the local recovery copy of the Realm file. The - re-downloaded Realm will initially contain only the data present at the time the Realm - was backed up on the server. - - The client reset process can be initiated in one of two ways. - - The `userInfo` dictionary contains an opaque token object under the key - `kRLMSyncErrorActionTokenKey`. This token can be passed into - `+[RLMSyncSession immediatelyHandleError:]` in order to immediately perform the client - reset process. This should only be done after your app closes and invalidates every - instance of the offending Realm on all threads (note that autorelease pools may make this - difficult to guarantee). - - If `+[RLMSyncSession immediatelyHandleError:]` is not called, the client reset process - will be automatically carried out the next time the app is launched and the - `RLMSyncManager` is accessed. - - The value for the `kRLMSyncPathOfRealmBackupCopyKey` key in the `userInfo` dictionary - describes the path of the recovered copy of the Realm. This copy will not actually be - created until the client reset process is initiated. - - @see `-[NSError rlmSync_errorActionToken]`, `-[NSError rlmSync_clientResetBackedUpRealmPath]` - */ - RLMSyncErrorClientResetError = 7, - - /// :nodoc: - RLMSyncErrorUnderlyingAuthError = 8, - - /** - An error that indicates the user does not have permission to perform an operation - upon a synced Realm. For example, a user may receive this error if they attempt to - open a Realm they do not have at least read access to, or write to a Realm they only - have read access to. - - This error may also occur if a user incorrectly opens a Realm they have read-only - permissions to without using the `asyncOpen()` APIs. - - A Realm that suffers a permission denied error is, by default, flagged so that its - local copy will be deleted the next time the application starts. - - The `userInfo` dictionary contains an opaque token object under the key - `kRLMSyncErrorActionTokenKey`. This token can be passed into - `+[RLMSyncSession immediatelyHandleError:]` in order to immediately delete the local - copy. This should only be done after your app closes and invalidates every instance - of the offending Realm on all threads (note that autorelease pools may make this - difficult to guarantee). - - @warning It is strongly recommended that, if a Realm has encountered a permission denied - error, its files be deleted before attempting to re-open it. - - @see `-[NSError rlmSync_errorActionToken]` - */ - RLMSyncErrorPermissionDeniedError = 9, - - /** - An error that indicates that the server has rejected the requested flexible sync subscriptions. - */ - RLMSyncErrorInvalidFlexibleSyncSubscriptions = 10, - - /** - An error that indicates that the server has reverted a write made by this - client. This can happen due to not having write permission, or because an - object was created in a flexible sync Realm which does not match any - active subscriptions. - - This error is informational and does not require any explicit handling. - */ - RLMSyncErrorWriteRejected = 11, - - /** - A connection error without a more specific error code occurred. - - Realm internally handles retrying connections with appropriate backoffs, - so connection errors are normally logged and not reported to the error - handler. The exception is if - ``RLMSyncConfiguration.cancelAsyncOpenOnNonFatalErrors`` is set to `true`, - in which case async opens will be canceled on connection failures and the - error will be reported to the completion handler. - - Note that connection timeouts are reported as - (errorDomain: NSPosixErrorDomain, error: ETIMEDOUT) - and not as one of these error codes. - */ - RLMSyncErrorConnectionFailed = 12, - - /** - Connecting to the server failed due to a TLS issue such as an invalid certificate. - */ - RLMSyncErrorTLSHandshakeFailed = 13, -}; - -#pragma mark - RLMSyncAuthError - -// NEXT-MAJOR: This was a ROS thing and should have been removed in v10 -/// :nodoc: -typedef RLM_ERROR_ENUM(NSInteger, RLMSyncAuthError, RLMSyncAuthErrorDomain) { - RLMSyncAuthErrorBadResponse = 1, - RLMSyncAuthErrorBadRemoteRealmPath = 2, - RLMSyncAuthErrorHTTPStatusCodeError = 3, - RLMSyncAuthErrorClientSessionError = 4, - RLMSyncAuthErrorInvalidParameters = 601, - RLMSyncAuthErrorMissingPath = 602, - RLMSyncAuthErrorInvalidCredential = 611, - RLMSyncAuthErrorUserDoesNotExist = 612, - RLMSyncAuthErrorUserAlreadyExists = 613, - RLMSyncAuthErrorAccessDeniedOrInvalidPath = 614, - RLMSyncAuthErrorInvalidAccessToken = 615, - RLMSyncAuthErrorFileCannotBeShared = 703, -} __attribute__((deprecated("Errors of this type are no longer reported"))); - -#pragma mark - RLMSyncAppError - -/// An error which occurred when making a request to Atlas App Services. -typedef RLM_ERROR_ENUM(NSInteger, RLMAppError, RLMAppErrorDomain) { - /// An unknown error has occurred - RLMAppErrorUnknown = -1, - - /// A HTTP request completed with an error status code. The failing status - /// code can be found in the ``RLMHTTPStatusCodeKey`` key of the userInfo - /// dictionary. - RLMAppErrorHttpRequestFailed = 1, - - /// A user's session is in an invalid state. Logging out and back in may rectify this. - RLMAppErrorInvalidSession, - /// A request sent to the server was malformed in some way. - RLMAppErrorBadRequest, - /// A request was made using a nonexistent user. - RLMAppErrorUserNotFound, - /// A request was made against an App using a User which does not belong to that App. - RLMAppErrorUserAppDomainMismatch, - /// The auth provider has limited the domain names which can be used for email addresses, and the given one is not allowed. - RLMAppErrorDomainNotAllowed, - /// The request body size exceeded a server-configured limit. - RLMAppErrorReadSizeLimitExceeded, - /// A request had an invalid parameter. - RLMAppErrorInvalidParameter, - /// A request was missing a required parameter. - RLMAppErrorMissingParameter, - /// Executing the requested server function failed with an error. - RLMAppErrorFunctionExecutionError, - /// The server encountered an internal error. - RLMAppErrorInternalServerError, - /// Authentication failed due to the request auth provider not existing. - RLMAppErrorAuthProviderNotFound, - /// The requested value does not exist. - RLMAppErrorValueNotFound, - /// The value being created already exists. - RLMAppErrorValueAlreadyExists, - /// A value with the same name as the value being created already exists. - RLMAppErrorValueDuplicateName, - /// The called server function does not exist. - RLMAppErrorFunctionNotFound, - /// The called server function has a syntax error. - RLMAppErrorFunctionSyntaxError, - /// The called server function is invalid in some way. - RLMAppErrorFunctionInvalid, - /// Registering an API key with the auth provider failed due to it already existing. - RLMAppErrorAPIKeyAlreadyExists, - /// The operation failed due to exceeding the server-configured time limit. - RLMAppErrorExecutionTimeLimitExceeded, - /// The body of the called function does not define a callable thing. - RLMAppErrorNotCallable, - /// Email confirmation failed for a user because the user has already confirmed their email. - RLMAppErrorUserAlreadyConfirmed, - /// The user cannot be used because it has been disabled. - RLMAppErrorUserDisabled, - /// An auth error occurred which does not have a more specific error code. - RLMAppErrorAuthError, - /// Account registration failed due to the user name already being taken. - RLMAppErrorAccountNameInUse, - /// A login request failed due to an invalid password. - RLMAppErrorInvalidPassword, - /// Operation failed due to server-side maintenance. - RLMAppErrorMaintenanceInProgress, - /// Operation failed due to an error reported by MongoDB. - RLMAppErrorMongoDBError, -}; - -/// Extended information about a write which was rejected by the server. -/// -/// The server will sometimes reject writes made by the client for reasons such -/// as permissions, additional server-side validation failing, or because the -/// object didn't match any flexible sync subscriptions. When this happens, a -/// ``RLMSyncErrorWriteRejected`` error is reported which contains an array of -/// `RLMCompensatingWriteInfo` objects in the ``RLMCompensatingWriteInfoKey`` -/// userInfo key with information about what writes were rejected and why. -/// -/// This information is intended for debugging and logging purposes only. The -/// `reason` strings are generated by the server and are not guaranteed to be -/// stable, so attempting to programmatically do anything with them will break -/// without warning. -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMCompensatingWriteInfo : NSObject -/// The class name of the object being written to. -@property (nonatomic, readonly) NSString *objectType; -/// The primary key of the object being written to. -@property (nonatomic, readonly) id primaryKey NS_REFINED_FOR_SWIFT; -/// A human-readable string describing why the write was rejected. -@property (nonatomic, readonly) NSString *reason; -@end diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMFindOneAndModifyOptions.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMFindOneAndModifyOptions.h deleted file mode 100644 index 3cce99f23..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMFindOneAndModifyOptions.h +++ /dev/null @@ -1,80 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) -@protocol RLMBSON; -@class RLMSortDescriptor; - -/// Options to use when executing a `findOneAndUpdate`, `findOneAndReplace`, -/// or `findOneAndDelete` command on a `RLMMongoCollection`. -@interface RLMFindOneAndModifyOptions : NSObject - -/// Limits the fields to return for all matching documents. -@property (nonatomic, nullable) id projection NS_REFINED_FOR_SWIFT; - -/// The order in which to return matching documents. -@property (nonatomic, nullable) id sort NS_REFINED_FOR_SWIFT -__attribute__((deprecated("Use `sorting` instead, which correctly sort more than one sort attribute", "sorting"))); - -/// The order in which to return matching documents. -@property (nonatomic) NSArray> *sorting NS_REFINED_FOR_SWIFT; - - -/// Whether or not to perform an upsert, default is false -/// (only available for find_one_and_replace and find_one_and_update) -@property (nonatomic) BOOL upsert; - -/// When true then the new document is returned, -/// Otherwise the old document is returned (default) -/// (only available for findOneAndReplace and findOneAndUpdate) -@property (nonatomic) BOOL shouldReturnNewDocument; - -/// Options to use when executing a `findOneAndUpdate`, `findOneAndReplace`, -/// or `findOneAndDelete` command on a `RLMMongoCollection`. -/// @param projection Limits the fields to return for all matching documents. -/// @param sort The order in which to return matching documents. -/// @param upsert Whether or not to perform an upsert, default is false -/// (only available for findOneAndReplace and findOneAndUpdate) -/// @param shouldReturnNewDocument When true then the new document is returned, -/// Otherwise the old document is returned (default), -/// (only available for findOneAndReplace and findOneAndUpdate) -- (instancetype)initWithProjection:(id _Nullable)projection - sort:(id _Nullable)sort - upsert:(BOOL)upsert - shouldReturnNewDocument:(BOOL)shouldReturnNewDocument -__attribute__((deprecated("Please use `initWithProjection:sorting:upsert:shouldReturnNewDocument:`"))) - NS_SWIFT_UNAVAILABLE("Please see FindOneAndModifyOptions"); - -/// Options to use when executing a `findOneAndUpdate`, `findOneAndReplace`, -/// or `findOneAndDelete` command on a `RLMMongoCollection`. -/// @param projection Limits the fields to return for all matching documents. -/// @param sorting The order in which to return matching documents. -/// @param upsert Whether or not to perform an upsert, default is false -/// (only available for findOneAndReplace and findOneAndUpdate) -/// @param shouldReturnNewDocument When true then the new document is returned, -/// Otherwise the old document is returned (default), -/// (only available for findOneAndReplace and findOneAndUpdate) -- (instancetype)initWithProjection:(id _Nullable)projection - sorting:(NSArray> *)sorting - upsert:(BOOL)upsert - shouldReturnNewDocument:(BOOL)shouldReturnNewDocument; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMFindOptions.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMFindOptions.h deleted file mode 100644 index 043a85374..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMFindOptions.h +++ /dev/null @@ -1,77 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@protocol RLMBSON; - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -@interface RLMFindOptions : NSObject - -/// The maximum number of documents to return. Specifying 0 will return all documents. -@property (nonatomic) NSInteger limit; - -/// Limits the fields to return for all matching documents. -@property (nonatomic, nullable) id projection NS_REFINED_FOR_SWIFT; - -/// The order in which to return matching documents. -@property (nonatomic, nullable) id sort NS_REFINED_FOR_SWIFT -__attribute__((deprecated("Use `sorting` instead, which correctly sort more than one sort attribute", "sorting"))); - -/// The order in which to return matching documents. -@property (nonatomic) NSArray> *sorting NS_REFINED_FOR_SWIFT; - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -/// @param limit The maximum number of documents to return. Specifying 0 will return all documents. -/// @param projection Limits the fields to return for all matching documents. -/// @param sort The order in which to return matching documents. -- (instancetype)initWithLimit:(NSInteger)limit - projection:(id _Nullable)projection - sort:(id _Nullable)sort -__attribute__((deprecated("Please use `initWithLimit:projection:sorting:`"))) - NS_SWIFT_UNAVAILABLE("Please see FindOption"); - - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -/// @param projection Limits the fields to return for all matching documents. -/// @param sort The order in which to return matching documents. -- (instancetype)initWithProjection:(id _Nullable)projection - sort:(id _Nullable)sort __deprecated -__attribute__((deprecated("Please use `initWithProjection:sorting:`"))) - NS_SWIFT_UNAVAILABLE("Please see FindOption"); - - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -/// @param limit The maximum number of documents to return. Specifying 0 will return all documents. -/// @param projection Limits the fields to return for all matching documents. -/// @param sorting The order in which to return matching documents. -- (instancetype)initWithLimit:(NSInteger)limit - projection:(id _Nullable)projection - sorting:(NSArray> *)sorting; - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -/// @param projection Limits the fields to return for all matching documents. -/// @param sorting The order in which to return matching documents. -- (instancetype)initWithProjection:(id _Nullable)projection - sorting:(NSArray> *)sorting; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMLogger.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMLogger.h deleted file mode 100644 index 96ab91967..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMLogger.h +++ /dev/null @@ -1,99 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -/// An enum representing different levels of sync-related logging that can be configured. -typedef RLM_CLOSED_ENUM(NSUInteger, RLMLogLevel) { - /// Nothing will ever be logged. - RLMLogLevelOff, - /// Only fatal errors will be logged. - RLMLogLevelFatal, - /// Only errors will be logged. - RLMLogLevelError, - /// Warnings and errors will be logged. - RLMLogLevelWarn, - /// Information about sync events will be logged. Fewer events will be logged in order to avoid overhead. - RLMLogLevelInfo, - /// Information about sync events will be logged. More events will be logged than with `RLMLogLevelInfo`. - RLMLogLevelDetail, - /// Log information that can aid in debugging. - /// - /// - warning: Will incur a measurable performance impact. - RLMLogLevelDebug, - /// Log information that can aid in debugging. More events will be logged than with `RLMLogLevelDebug`. - /// - /// - warning: Will incur a measurable performance impact. - RLMLogLevelTrace, - /// Log information that can aid in debugging. More events will be logged than with `RLMLogLevelTrace`. - /// - /// - warning: Will incur a measurable performance impact. - RLMLogLevelAll -} NS_SWIFT_NAME(LogLevel); - -/// A log callback function which can be set on RLMLogger. -/// -/// The log function may be called from multiple threads simultaneously, and is -/// responsible for performing its own synchronization if any is required. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void (^RLMLogFunction)(RLMLogLevel level, NSString *message); - -/** - `RLMLogger` is used for creating your own custom logging logic. - - You can define your own logger creating an instance of `RLMLogger` and define the log function which will be - invoked whenever there is a log message. - Set this custom logger as you default logger using `setDefaultLogger`. - - RLMLogger.defaultLogger = [[RLMLogger alloc] initWithLevel:RLMLogLevelDebug - logFunction:^(RLMLogLevel level, NSString * message) { - NSLog(@"Realm Log - %lu, %@", (unsigned long)level, message); - }]; - - @note By default default log threshold level is `RLMLogLevelInfo`, and logging strings are output to Apple System Logger. -*/ -@interface RLMLogger : NSObject - -/** - Gets the logging threshold level used by the logger. - */ -@property (nonatomic) RLMLogLevel level; - -/// :nodoc: -- (instancetype)init NS_UNAVAILABLE; - -/** - Creates a logger with the associated log level and the logic function to define your own logging logic. - - @param level The log level to be set for the logger. - @param logFunction The log function which will be invoked whenever there is a log message. -*/ -- (instancetype)initWithLevel:(RLMLogLevel)level logFunction:(RLMLogFunction)logFunction; - -#pragma mark RLMLogger Default Logger API - -/** - The current default logger. When setting a logger as default, this logger will be used whenever information must be logged. - */ -@property (class) RLMLogger *defaultLogger NS_SWIFT_NAME(shared); - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMMigration.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMMigration.h deleted file mode 100644 index 4a6652a19..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMMigration.h +++ /dev/null @@ -1,129 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMSchema; -@class RLMArray; -@class RLMObject; - -/** - A block type which provides both the old and new versions of an object in the Realm. Object - properties can only be accessed using keyed subscripting. - - @see `-[RLMMigration enumerateObjects:block:]` - - @param oldObject The object from the original Realm (read-only). - @param newObject The object from the migrated Realm (read-write). -*/ -typedef void (^RLMObjectMigrationBlock)(RLMObject * __nullable oldObject, RLMObject * __nullable newObject); - -/** - `RLMMigration` instances encapsulate information intended to facilitate a schema migration. - - A `RLMMigration` instance is passed into a user-defined `RLMMigrationBlock` block when updating - the version of a Realm. This instance provides access to the old and new database schemas, the - objects in the Realm, and provides functionality for modifying the Realm during the migration. - */ -@interface RLMMigration : NSObject - -#pragma mark - Properties - -/** - Returns the old `RLMSchema`. This is the schema which describes the Realm before the - migration is applied. - */ -@property (nonatomic, readonly) RLMSchema *oldSchema NS_REFINED_FOR_SWIFT; - -/** - Returns the new `RLMSchema`. This is the schema which describes the Realm after the - migration is applied. - */ -@property (nonatomic, readonly) RLMSchema *newSchema NS_REFINED_FOR_SWIFT; - - -#pragma mark - Altering Objects during a Migration - -/** - Enumerates all the objects of a given type in the Realm, providing both the old and new versions - of each object. Within the block, object properties can only be accessed using keyed subscripting. - - @param className The name of the `RLMObject` class to enumerate. - - @warning All objects returned are of a type specific to the current migration and should not be cast - to `className`. Instead, treat them as `RLMObject`s and use keyed subscripting to access - properties. - */ -- (void)enumerateObjects:(NSString *)className - block:(__attribute__((noescape)) RLMObjectMigrationBlock)block NS_REFINED_FOR_SWIFT; - -/** - Creates and returns an `RLMObject` instance of type `className` in the Realm being migrated. - - The `value` argument is used to populate the object. It can be a key-value coding compliant object, an array or - dictionary returned from the methods in `NSJSONSerialization`, or an array containing one element for each managed - property. An exception will be thrown if any required properties are not present and those properties were not defined - with default values. - - When passing in an `NSArray` as the `value` argument, all properties must be present, valid and in the same order as - the properties defined in the model. - - @param className The name of the `RLMObject` class to create. - @param value The value used to populate the object. - */ -- (RLMObject *)createObject:(NSString *)className withValue:(id)value NS_REFINED_FOR_SWIFT; - -/** - Deletes an object from a Realm during a migration. - - It is permitted to call this method from within the block passed to `-[enumerateObjects:block:]`. - - @param object Object to be deleted from the Realm being migrated. - */ -- (void)deleteObject:(RLMObject *)object NS_REFINED_FOR_SWIFT; - -/** - Deletes the data for the class with the given name. - - All objects of the given class will be deleted. If the `RLMObject` subclass no longer exists in your program, - any remaining metadata for the class will be removed from the Realm file. - - @param name The name of the `RLMObject` class to delete. - - @return A Boolean value indicating whether there was any data to delete. - */ -- (BOOL)deleteDataForClassName:(NSString *)name NS_REFINED_FOR_SWIFT; - -/** - Renames a property of the given class from `oldName` to `newName`. - - @param className The name of the class whose property should be renamed. This class must be present - in both the old and new Realm schemas. - @param oldName The old persisted property name for the property to be renamed. There must not be a property with this name in the - class as defined by the new Realm schema. - @param newName The new persisted property name for the property to be renamed. There must not be a property with this name in the - class as defined by the old Realm schema. - */ -- (void)renamePropertyForClass:(NSString *)className oldName:(NSString *)oldName - newName:(NSString *)newName NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMMongoClient.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMMongoClient.h deleted file mode 100644 index 50a1c226d..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMMongoClient.h +++ /dev/null @@ -1,47 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMApp; - -/// The `RLMMongoClient` enables reading and writing on a MongoDB database via the Realm Cloud service. -/// -/// It provides access to instances of `RLMMongoDatabase`, which in turn provide access to specific -/// `RLMMongoCollection`s that hold your data. -/// -/// - Note: -/// Before you can read or write data, a user must log in. -/// -/// - SeeAlso: -/// `RLMApp`, `RLMMongoDatabase`, `RLMMongoCollection` -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMMongoClient : NSObject - -/// The name of the client -@property (nonatomic, readonly) NSString *name; - -/// Gets a `RLMMongoDatabase` instance for the given database name. -/// @param name the name of the database to retrieve -- (RLMMongoDatabase *)databaseWithName:(NSString *)name NS_SWIFT_NAME(database(named:)); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMMongoCollection.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMMongoCollection.h deleted file mode 100644 index 0feae60ac..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMMongoCollection.h +++ /dev/null @@ -1,330 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) -@protocol RLMBSON; - -@class RLMFindOptions, RLMFindOneAndModifyOptions, RLMUpdateResult, RLMChangeStream, RLMObjectId; - -/// Delegate which is used for subscribing to changes on a `[RLMMongoCollection watch]` stream. -@protocol RLMChangeEventDelegate -/// The stream was opened. -/// @param changeStream The RLMChangeStream subscribing to the stream changes. -- (void)changeStreamDidOpen:(RLMChangeStream *)changeStream; -/// The stream has been closed. -/// @param error If an error occured when closing the stream, an error will be passed. -- (void)changeStreamDidCloseWithError:(nullable NSError *)error; -/// A error has occured while streaming. -/// @param error The streaming error. -- (void)changeStreamDidReceiveError:(NSError *)error; -/// Invoked when a change event has been received. -/// @param changeEvent The change event in BSON format. -- (void)changeStreamDidReceiveChangeEvent:(id)changeEvent; -@end - -/// Acts as a middleman and processes events with WatchStream -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMChangeStream : NSObject -/// Stops a watch streaming session. -- (void)close; -/// :nodoc: -- (instancetype)init NS_UNAVAILABLE; -@end - -/// The `RLMMongoCollection` represents a MongoDB collection. -/// -/// You can get an instance from a `RLMMongoDatabase`. -/// -/// Create, read, update, and delete methods are available. -/// -/// Operations against the Realm Cloud server are performed asynchronously. -/// -/// - Note: -/// Before you can read or write data, a user must log in. -/// - Usage: -/// RLMMongoClient *client = [self.app mongoClient:@"mongodb1"]; -/// RLMMongoDatabase *database = [client databaseWithName:@"test_data"]; -/// RLMMongoCollection *collection = [database collectionWithName:@"Dog"]; -/// [collection insertOneDocument:@{@"name": @"fido", @"breed": @"cane corso"} completion:...]; -/// -/// - SeeAlso: -/// `RLMMongoClient`, `RLMMongoDatabase` -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMMongoCollection : NSObject -/// Block which returns an object id on a successful insert, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoInsertBlock)(id _Nullable, NSError * _Nullable); -/// Block which returns an array of object ids on a successful insertMany, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoInsertManyBlock)(NSArray> * _Nullable, NSError * _Nullable); -/// Block which returns an array of Documents on a successful find operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoFindBlock)(NSArray> *> * _Nullable, - NSError * _Nullable); -/// Block which returns a Document on a successful findOne operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoFindOneBlock)(NSDictionary> * _Nullable_result, - NSError * _Nullable); -/// Block which returns the number of Documents in a collection on a successful count operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoCountBlock)(NSInteger, NSError * _Nullable); -/// Block which returns an RLMUpdateResult on a successful update operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoUpdateBlock)(RLMUpdateResult * _Nullable, NSError * _Nullable); -/// Block which returns the deleted Document on a successful delete operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoDeleteBlock)(NSDictionary> * _Nullable_result, - NSError * _Nullable); - -/// The name of this mongodb collection. -@property (nonatomic, readonly) NSString *name; - -/// Encodes the provided value to BSON and inserts it. If the value is missing an identifier, one will be -/// generated for it. -/// @param document A `Document` value to insert. -/// @param completion The result of attempting to perform the insert. An Id will be returned for the inserted object on sucess -- (void)insertOneDocument:(NSDictionary> *)document - completion:(RLMMongoInsertBlock)completion NS_REFINED_FOR_SWIFT; - -/// Encodes the provided values to BSON and inserts them. If any values are missing identifiers, -/// they will be generated. -/// @param documents The `Document` values in a bson array to insert. -/// @param completion The result of the insert, returns an array inserted document ids in order -- (void)insertManyDocuments:(NSArray> *> *)documents - completion:(RLMMongoInsertManyBlock)completion NS_REFINED_FOR_SWIFT; - -/// Finds the documents in this collection which match the provided filter. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param options `RLMFindOptions` to use when executing the command. -/// @param completion The resulting bson array of documents or error if one occurs -- (void)findWhere:(NSDictionary> *)filterDocument - options:(RLMFindOptions *)options - completion:(RLMMongoFindBlock)completion NS_REFINED_FOR_SWIFT; - -/// Finds the documents in this collection which match the provided filter. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param completion The resulting bson array as a string or error if one occurs -- (void)findWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoFindBlock)completion NS_REFINED_FOR_SWIFT; - -/// Returns one document from a collection or view which matches the -/// provided filter. If multiple documents satisfy the query, this method -/// returns the first document according to the query's sort order or natural -/// order. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param options `RLMFindOptions` to use when executing the command. -/// @param completion The resulting bson or error if one occurs -- (void)findOneDocumentWhere:(NSDictionary> *)filterDocument - options:(RLMFindOptions *)options - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Returns one document from a collection or view which matches the -/// provided filter. If multiple documents satisfy the query, this method -/// returns the first document according to the query's sort order or natural -/// order. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param completion The resulting bson or error if one occurs -- (void)findOneDocumentWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Runs an aggregation framework pipeline against this collection. -/// @param pipeline A bson array made up of `Documents` containing the pipeline of aggregation operations to perform. -/// @param completion The resulting bson array of documents or error if one occurs -- (void)aggregateWithPipeline:(NSArray> *> *)pipeline - completion:(RLMMongoFindBlock)completion NS_REFINED_FOR_SWIFT; - -/// Counts the number of documents in this collection matching the provided filter. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param limit The max amount of documents to count -/// @param completion Returns the count of the documents that matched the filter. -- (void)countWhere:(NSDictionary> *)filterDocument - limit:(NSInteger)limit - completion:(RLMMongoCountBlock)completion NS_REFINED_FOR_SWIFT; - -/// Counts the number of documents in this collection matching the provided filter. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param completion Returns the count of the documents that matched the filter. -- (void)countWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoCountBlock)completion NS_REFINED_FOR_SWIFT; - -/// Deletes a single matching document from the collection. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param completion The result of performing the deletion. Returns the count of deleted objects -- (void)deleteOneDocumentWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoCountBlock)completion NS_REFINED_FOR_SWIFT; - -/// Deletes multiple documents -/// @param filterDocument Document representing the match criteria -/// @param completion The result of performing the deletion. Returns the count of the deletion -- (void)deleteManyDocumentsWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoCountBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates a single document matching the provided filter in this collection. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param upsert When true, creates a new document if no document matches the query. -/// @param completion The result of the attempt to update a document. -- (void)updateOneDocumentWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - upsert:(BOOL)upsert - completion:(RLMMongoUpdateBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates a single document matching the provided filter in this collection. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param completion The result of the attempt to update a document. -- (void)updateOneDocumentWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - completion:(RLMMongoUpdateBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates multiple documents matching the provided filter in this collection. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param upsert When true, creates a new document if no document matches the query. -/// @param completion The result of the attempt to update a document. -- (void)updateManyDocumentsWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - upsert:(BOOL)upsert - completion:(RLMMongoUpdateBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates multiple documents matching the provided filter in this collection. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param completion The result of the attempt to update a document. -- (void)updateManyDocumentsWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - completion:(RLMMongoUpdateBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates a single document in a collection based on a query filter and -/// returns the document in either its pre-update or post-update form. Unlike -/// `updateOneDocument`, this action allows you to atomically find, update, and -/// return a document with the same command. This avoids the risk of other -/// update operations changing the document between separate find and update -/// operations. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param options `RemoteFindOneAndModifyOptions` to use when executing the command. -/// @param completion The result of the attempt to update a document. -- (void)findOneAndUpdateWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - options:(RLMFindOneAndModifyOptions *)options - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates a single document in a collection based on a query filter and -/// returns the document in either its pre-update or post-update form. Unlike -/// `updateOneDocument`, this action allows you to atomically find, update, and -/// return a document with the same command. This avoids the risk of other -/// update operations changing the document between separate find and update -/// operations. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param completion The result of the attempt to update a document. -- (void)findOneAndUpdateWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Overwrites a single document in a collection based on a query filter and -/// returns the document in either its pre-replacement or post-replacement -/// form. Unlike `updateOneDocument`, this action allows you to atomically find, -/// replace, and return a document with the same command. This avoids the -/// risk of other update operations changing the document between separate -/// find and update operations. -/// @param filterDocument A `Document` that should match the query. -/// @param replacementDocument A `Document` describing the replacement. -/// @param options `RLMFindOneAndModifyOptions` to use when executing the command. -/// @param completion The result of the attempt to replace a document. -- (void)findOneAndReplaceWhere:(NSDictionary> *)filterDocument - replacementDocument:(NSDictionary> *)replacementDocument - options:(RLMFindOneAndModifyOptions *)options - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Overwrites a single document in a collection based on a query filter and -/// returns the document in either its pre-replacement or post-replacement -/// form. Unlike `updateOneDocument`, this action allows you to atomically find, -/// replace, and return a document with the same command. This avoids the -/// risk of other update operations changing the document between separate -/// find and update operations. -/// @param filterDocument A `Document` that should match the query. -/// @param replacementDocument A `Document` describing the update. -/// @param completion The result of the attempt to replace a document. -- (void)findOneAndReplaceWhere:(NSDictionary> *)filterDocument - replacementDocument:(NSDictionary> *)replacementDocument - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Removes a single document from a collection based on a query filter and -/// returns a document with the same form as the document immediately before -/// it was deleted. Unlike `deleteOneDocument`, this action allows you to atomically -/// find and delete a document with the same command. This avoids the risk of -/// other update operations changing the document between separate find and -/// delete operations. -/// @param filterDocument A `Document` that should match the query. -/// @param options `RLMFindOneAndModifyOptions` to use when executing the command. -/// @param completion The result of the attempt to delete a document. -- (void)findOneAndDeleteWhere:(NSDictionary> *)filterDocument - options:(RLMFindOneAndModifyOptions *)options - completion:(RLMMongoDeleteBlock)completion NS_REFINED_FOR_SWIFT; - -/// Removes a single document from a collection based on a query filter and -/// returns a document with the same form as the document immediately before -/// it was deleted. Unlike `deleteOneDocument`, this action allows you to atomically -/// find and delete a document with the same command. This avoids the risk of -/// other update operations changing the document between separate find and -/// delete operations. -/// @param filterDocument A `Document` that should match the query. -/// @param completion The result of the attempt to delete a document. -- (void)findOneAndDeleteWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoDeleteBlock)completion NS_REFINED_FOR_SWIFT; - -/// Opens a MongoDB change stream against the collection to watch for changes. The resulting stream will be notified -/// of all events on this collection that the active user is authorized to see based on the configured MongoDB -/// rules. -/// @param delegate The delegate that will react to events and errors from the resulting change stream. -/// @param queue Dispatches streaming events to an optional queue, if no queue is provided the main queue is used -- (RLMChangeStream *)watchWithDelegate:(id)delegate - delegateQueue:(nullable dispatch_queue_t)queue NS_REFINED_FOR_SWIFT; - -/// Opens a MongoDB change stream against the collection to watch for changes -/// made to specific documents. The documents to watch must be explicitly -/// specified by their _id. -/// @param filterIds The list of _ids in the collection to watch. -/// @param delegate The delegate that will react to events and errors from the resulting change stream. -/// @param queue Dispatches streaming events to an optional queue, if no queue is provided the main queue is used -- (RLMChangeStream *)watchWithFilterIds:(NSArray *)filterIds - delegate:(id)delegate - delegateQueue:(nullable dispatch_queue_t)queue NS_REFINED_FOR_SWIFT; - -/// Opens a MongoDB change stream against the collection to watch for changes. The provided BSON document will be -/// used as a match expression filter on the change events coming from the stream. -/// -/// See https://docs.mongodb.com/manual/reference/operator/aggregation/match/ for documentation around how to define -/// a match filter. -/// -/// Defining the match expression to filter ChangeEvents is similar to defining the match expression for triggers: -/// https://docs.mongodb.com/realm/triggers/database-triggers/ -/// @param matchFilter The $match filter to apply to incoming change events -/// @param delegate The delegate that will react to events and errors from the resulting change stream. -/// @param queue Dispatches streaming events to an optional queue, if no queue is provided the main queue is used -- (RLMChangeStream *)watchWithMatchFilter:(NSDictionary> *)matchFilter - delegate:(id)delegate - delegateQueue:(nullable dispatch_queue_t)queue NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMMongoDatabase.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMMongoDatabase.h deleted file mode 100644 index 177fbc1b8..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMMongoDatabase.h +++ /dev/null @@ -1,51 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMMongoCollection; - -/// The `RLMMongoDatabase` represents a MongoDB database, which holds a group -/// of collections that contain your data. -/// -/// It can be retrieved from the `RLMMongoClient`. -/// -/// Use it to get `RLMMongoCollection`s for reading and writing data. -/// -/// - Note: -/// Before you can read or write data, a user must log in`. -/// -/// - SeeAlso: -/// `RLMMongoClient`, `RLMMongoCollection` -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMMongoDatabase : NSObject - -/// The name of this database -@property (nonatomic, readonly) NSString *name; - -/// Gets a collection. -/// @param name The name of the collection to return -/// @returns The collection -- (RLMMongoCollection *)collectionWithName:(NSString *)name; -// NEXT-MAJOR: NS_SWIFT_NAME(collection(named:)) - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMNetworkTransport.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMNetworkTransport.h deleted file mode 100644 index 2884b4296..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMNetworkTransport.h +++ /dev/null @@ -1,132 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// Allowed HTTP methods to be used with `RLMNetworkTransport`. -typedef RLM_CLOSED_ENUM(int32_t, RLMHTTPMethod) { - /// GET is used to request data from a specified resource. - RLMHTTPMethodGET = 0, - /// POST is used to send data to a server to create/update a resource. - RLMHTTPMethodPOST = 1, - /// PATCH is used to send data to a server to update a resource. - RLMHTTPMethodPATCH = 2, - /// PUT is used to send data to a server to create/update a resource. - RLMHTTPMethodPUT = 3, - /// The DELETE method deletes the specified resource. - RLMHTTPMethodDELETE = 4 -}; - -/// An HTTP request that can be made to an arbitrary server. -@interface RLMRequest : NSObject - -/// The HTTP method of this request. -@property (nonatomic, assign) RLMHTTPMethod method; - -/// The URL to which this request will be made. -@property (nonatomic, strong) NSString *url; - -/// The number of milliseconds that the underlying transport should spend on an -/// HTTP round trip before failing with an error. -@property (nonatomic, assign) NSTimeInterval timeout; - -/// The HTTP headers of this request. -@property (nonatomic, strong) NSDictionary* headers; - -/// The body of the request. -@property (nonatomic, strong) NSString* body; - -@end - -/// The contents of an HTTP response. -@interface RLMResponse : NSObject - -/// The status code of the HTTP response. -@property (nonatomic, assign) NSInteger httpStatusCode; - -/// A custom status code provided by the SDK. -@property (nonatomic, assign) NSInteger customStatusCode; - -/// The headers of the HTTP response. -@property (nonatomic, strong) NSDictionary* headers; - -/// The body of the HTTP response. -@property (nonatomic, strong) NSString *body; - -@end - -/// Delegate which is used for subscribing to changes. -@protocol RLMEventDelegate -/// Invoked when a change event has been received. -/// @param event The change event encoded as NSData -- (void)didReceiveEvent:(NSData *)event; -/// A error has occurred while subscribing to changes. -/// @param error The error that has occurred. -- (void)didReceiveError:(NSError *)error; -/// The stream was opened. -- (void)didOpen; -/// The stream has been closed. -/// @param error The error that has occurred. -- (void)didCloseWithError:(NSError *_Nullable)error; -@end - -/// A block for receiving an `RLMResponse` from the `RLMNetworkTransport`. -RLM_SWIFT_SENDABLE // invoked on a backgroun thread -typedef void(^RLMNetworkTransportCompletionBlock)(RLMResponse *); - -/// Transporting protocol for foreign interfaces. Allows for custom -/// request/response handling. -RLM_SWIFT_SENDABLE // used from multiple threads so must be internally thread-safe -@protocol RLMNetworkTransport - -/** - Sends a request to a given endpoint. - - @param request The request to send. - @param completionBlock A callback invoked on completion of the request. -*/ -- (void)sendRequestToServer:(RLMRequest *)request - completion:(RLMNetworkTransportCompletionBlock)completionBlock; - -/// Starts an event stream request. -/// @param request The RLMRequest to start. -/// @param subscriber The RLMEventDelegate which will subscribe to changes from the server. -- (NSURLSession *)doStreamRequest:(RLMRequest *)request - eventSubscriber:(id)subscriber; - -@end - -/// Transporting protocol for foreign interfaces. Allows for custom -/// request/response handling. -RLM_SWIFT_SENDABLE // is internally thread-safe -@interface RLMNetworkTransport : NSObject - -/** - Sends a request to a given endpoint. - - @param request The request to send. - @param completionBlock A callback invoked on completion of the request. -*/ -- (void)sendRequestToServer:(RLMRequest *) request - completion:(RLMNetworkTransportCompletionBlock)completionBlock; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMObject.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMObject.h deleted file mode 100644 index 9bcfbe310..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMObject.h +++ /dev/null @@ -1,811 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMNotificationToken; -@class RLMObjectSchema; -@class RLMPropertyChange; -@class RLMPropertyDescriptor; -@class RLMRealm; -@class RLMResults; - -/** - `RLMObject` is a base class for model objects representing data stored in Realms. - - Define your model classes by subclassing `RLMObject` and adding properties to be managed. - Then instantiate and use your custom subclasses instead of using the `RLMObject` class directly. - - // Dog.h - @interface Dog : RLMObject - @property NSString *name; - @property BOOL adopted; - @end - - // Dog.m - @implementation Dog - @end //none needed - - ### Supported property types - - - `NSString` - - `NSInteger`, `int`, `long`, `float`, and `double` - - `BOOL` or `bool` - - `NSDate` - - `NSData` - - `NSNumber`, where `X` is one of `RLMInt`, `RLMFloat`, `RLMDouble` or `RLMBool`, for optional number properties - - `RLMObject` subclasses, to model many-to-one relationships. - - `RLMArray`, where `X` is an `RLMObject` subclass, to model many-to-many relationships. - - ### Querying - - You can initiate queries directly via the class methods: `allObjects`, `objectsWhere:`, and `objectsWithPredicate:`. - These methods allow you to easily query a custom subclass for instances of that class in the default Realm. - - To search in a Realm other than the default Realm, use the `allObjectsInRealm:`, `objectsInRealm:where:`, - and `objectsInRealm:withPredicate:` class methods. - - @see `RLMRealm` - - ### Relationships - - See our [Realm Swift Documentation](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/relationships/#relationships) for more details. - - ### Key-Value Observing - - All `RLMObject` properties (including properties you create in subclasses) are - [Key-Value Observing compliant](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/KeyValueObserving/KeyValueObserving.html), - except for `realm` and `objectSchema`. - - Keep the following tips in mind when observing Realm objects: - - 1. Unlike `NSMutableArray` properties, `RLMArray` properties do not require - using the proxy object returned from `-mutableArrayValueForKey:`, or defining - KVC mutation methods on the containing class. You can simply call methods on - the `RLMArray` directly; any changes will be automatically observed by the containing - object. - 2. Unmanaged `RLMObject` instances cannot be added to a Realm while they have any - observed properties. - 3. Modifying managed `RLMObject`s within `-observeValueForKeyPath:ofObject:change:context:` - is not recommended. Properties may change even when the Realm is not in a write - transaction (for example, when `-[RLMRealm refresh]` is called after changes - are made on a different thread), and notifications sent prior to the change - being applied (when `NSKeyValueObservingOptionPrior` is used) may be sent at - times when you *cannot* begin a write transaction. - */ - -@interface RLMObject : RLMObjectBase - -#pragma mark - Creating & Initializing Objects - -/** - Creates an unmanaged instance of a Realm object. - - Call `addObject:` on an `RLMRealm` instance to add an unmanaged object into that Realm. - - @see `[RLMRealm addObject:]` - */ -- (instancetype)init NS_DESIGNATED_INITIALIZER; - - -/** - Creates an unmanaged instance of a Realm object. - - Pass in an `NSArray` or `NSDictionary` instance to set the values of the object's properties. - - Call `addObject:` on an `RLMRealm` instance to add an unmanaged object into that Realm. - - @see `[RLMRealm addObject:]` - */ -- (instancetype)initWithValue:(id)value; - - -/** - Returns the class name for a Realm object subclass. - - @warning Do not override. Realm relies on this method returning the exact class - name. - - @return The class name for the model class. - */ -+ (NSString *)className; - -/** - Creates an instance of a Realm object with a given value, and adds it to the default Realm. - - If nested objects are included in the argument, `createInDefaultRealmWithValue:` will be recursively called - on them. - - The `value` argument can be a key-value coding compliant object, an array or dictionary returned from the methods in - `NSJSONSerialization`, or an array containing one element for each managed property. - - An exception will be thrown if any required properties are not present and those properties - were not defined with default values. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param value The value used to populate the object. - - @see `defaultPropertyValues` - */ -+ (instancetype)createInDefaultRealmWithValue:(id)value; - -/** - Creates an instance of a Realm object with a given value, and adds it to the specified Realm. - - If nested objects are included in the argument, `createInRealm:withValue:` will be recursively called - on them. - - The `value` argument can be a key-value coding compliant object, an array or dictionary returned from the methods in - `NSJSONSerialization`, or an array containing one element for each managed property. - - An exception will be thrown if any required properties are not present and those properties - were not defined with default values. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param realm The Realm which should manage the newly-created object. - @param value The value used to populate the object. - - @see `defaultPropertyValues` - */ -+ (instancetype)createInRealm:(RLMRealm *)realm withValue:(id)value; - -/** - Creates or updates a Realm object within the default Realm. - - This method may only be called on Realm object types with a primary key defined. If there is already - an object with the same primary key value in the default Realm, its values are updated and the object - is returned. Otherwise, this method creates and populates a new instance of the object in the default Realm. - - If nested objects are included in the argument, `createOrUpdateInDefaultRealmWithValue:` will be - recursively called on them if they have primary keys, `createInDefaultRealmWithValue:` if they do not. - - The `value` argument is used to populate the object. It can be a Realm object, a key-value coding - compliant object, an array or dictionary returned from the methods in `NSJSONSerialization`, or an - array containing one element for each managed property. - - If the object is being created, an exception will be thrown if any required properties - are not present and those properties were not defined with default values. - - If the `value` argument is a Realm object already managed by the default Realm, the - argument's type is the same as the receiver, and the objects have identical values for - their managed properties, this method does nothing. - - If the object is being updated, each property defined in its schema will be set by copying from - `value` using key-value coding. If the `value` argument does not respond to `valueForKey:` for a - given property name (or getter name, if defined), that value will remain untouched. - Nullable properties on the object can be set to nil by using `NSNull` as the updated value. - Each property is set even if the existing value is the same as the new value being set, and - notifications will report them all being changed. See `createOrUpdateModifiedInDefaultRealmWithValue:` - for a version of this function which only sets the values which have changed. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param value The value used to populate the object. - - @see `defaultPropertyValues`, `primaryKey` - */ -+ (instancetype)createOrUpdateInDefaultRealmWithValue:(id)value; - -/** - Creates or updates a Realm object within the default Realm. - - This method may only be called on Realm object types with a primary key defined. If there is already - an object with the same primary key value in the default Realm, its values are updated and the object - is returned. Otherwise, this method creates and populates a new instance of the object in the default Realm. - - If nested objects are included in the argument, `createOrUpdateModifiedInDefaultRealmWithValue:` will be - recursively called on them if they have primary keys, `createInDefaultRealmWithValue:` if they do not. - - The `value` argument is used to populate the object. It can be a Realm object, a key-value coding - compliant object, an array or dictionary returned from the methods in `NSJSONSerialization`, or an - array containing one element for each managed property. - - If the object is being created, an exception will be thrown if any required properties - are not present and those properties were not defined with default values. - - If the `value` argument is a Realm object already managed by the default Realm, the - argument's type is the same as the receiver, and the objects have identical values for - their managed properties, this method does nothing. - - If the object is being updated, each property defined in its schema will be set by copying from - `value` using key-value coding. If the `value` argument does not respond to `valueForKey:` for a - given property name (or getter name, if defined), that value will remain untouched. - Nullable properties on the object can be set to nil by using `NSNull` as the updated value. - Unlike `createOrUpdateInDefaultRealmWithValue:`, only properties which have changed in value are - set, and any change notifications produced by this call will report only which properies have - actually changed. - - Checking which properties have changed imposes a small amount of overhead, and so this method - may be slower when all or nearly all of the properties being set have changed. If most or all - of the properties being set have not changed, this method will be much faster than unconditionally - setting all of them, and will also reduce how much data has to be written to the Realm, saving - both i/o time and disk space. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param value The value used to populate the object. - - @see `defaultPropertyValues`, `primaryKey` - */ -+ (instancetype)createOrUpdateModifiedInDefaultRealmWithValue:(id)value; - -/** - Creates or updates an Realm object within a specified Realm. - - This method may only be called on Realm object types with a primary key defined. If there is already - an object with the same primary key value in the given Realm, its values are updated and the object - is returned. Otherwise this method creates and populates a new instance of this object in the given Realm. - - If nested objects are included in the argument, `createOrUpdateInRealm:withValue:` will be - recursively called on them if they have primary keys, `createInRealm:withValue:` if they do not. - - The `value` argument is used to populate the object. It can be a Realm object, a key-value coding - compliant object, an array or dictionary returned from the methods in `NSJSONSerialization`, or an - array containing one element for each managed property. - - If the object is being created, an exception will be thrown if any required properties - are not present and those properties were not defined with default values. - - If the `value` argument is a Realm object already managed by the given Realm, the - argument's type is the same as the receiver, and the objects have identical values for - their managed properties, this method does nothing. - - If the object is being updated, each property defined in its schema will be set by copying from - `value` using key-value coding. If the `value` argument does not respond to `valueForKey:` for a - given property name (or getter name, if defined), that value will remain untouched. - Nullable properties on the object can be set to nil by using `NSNull` as the updated value. - Each property is set even if the existing value is the same as the new value being set, and - notifications will report them all being changed. See `createOrUpdateModifiedInRealm:withValue:` - for a version of this function which only sets the values which have changed. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param realm The Realm which should own the object. - @param value The value used to populate the object. - - @see `defaultPropertyValues`, `primaryKey` - */ -+ (instancetype)createOrUpdateInRealm:(RLMRealm *)realm withValue:(id)value; - -/** - Creates or updates an Realm object within a specified Realm. - - This method may only be called on Realm object types with a primary key defined. If there is already - an object with the same primary key value in the given Realm, its values are updated and the object - is returned. Otherwise this method creates and populates a new instance of this object in the given Realm. - - If nested objects are included in the argument, `createOrUpdateInRealm:withValue:` will be - recursively called on them if they have primary keys, `createInRealm:withValue:` if they do not. - - The `value` argument is used to populate the object. It can be a Realm object, a key-value coding - compliant object, an array or dictionary returned from the methods in `NSJSONSerialization`, or an - array containing one element for each managed property. - - If the object is being created, an exception will be thrown if any required properties - are not present and those properties were not defined with default values. - - If the `value` argument is a Realm object already managed by the given Realm, the - argument's type is the same as the receiver, and the objects have identical values for - their managed properties, this method does nothing. - - If the object is being updated, each property defined in its schema will be set by copying from - `value` using key-value coding. If the `value` argument does not respond to `valueForKey:` for a - given property name (or getter name, if defined), that value will remain untouched. - Nullable properties on the object can be set to nil by using `NSNull` as the updated value. - Unlike `createOrUpdateInRealm:withValue:`, only properties which have changed in value are - set, and any change notifications produced by this call will report only which properies have - actually changed. - - Checking which properties have changed imposes a small amount of overhead, and so this method - may be slower when all or nearly all of the properties being set have changed. If most or all - of the properties being set have not changed, this method will be much faster than unconditionally - setting all of them, and will also reduce how much data has to be written to the Realm, saving - both i/o time and disk space. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param realm The Realm which should own the object. - @param value The value used to populate the object. - - @see `defaultPropertyValues`, `primaryKey` - */ -+ (instancetype)createOrUpdateModifiedInRealm:(RLMRealm *)realm withValue:(id)value; - -#pragma mark - Properties - -/** - The Realm which manages the object, or `nil` if the object is unmanaged. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - The object schema which lists the managed properties for the object. - */ -@property (nonatomic, readonly) RLMObjectSchema *objectSchema; - -/** - Indicates if the object can no longer be accessed because it is now invalid. - - An object can no longer be accessed if the object has been deleted from the Realm that manages it, or - if `invalidate` is called on that Realm. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if this object is frozen. - - @see `-[RLMObject freeze]` - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - - -#pragma mark - Customizing your Objects - -/** - Returns an array of property names for properties which should be indexed. - - Only string, integer, boolean, and `NSDate` properties are supported. - - @return An array of property names. - */ -+ (NSArray *)indexedProperties; - -/** - Override this method to specify the default values to be used for each property. - - @return A dictionary mapping property names to their default values. - */ -+ (nullable NSDictionary *)defaultPropertyValues; - -/** - Override this method to specify the name of a property to be used as the primary key. - - Only properties of types `RLMPropertyTypeString` and `RLMPropertyTypeInt` can be designated as the primary key. - Primary key properties enforce uniqueness for each value whenever the property is set, which incurs minor overhead. - Indexes are created automatically for primary key properties. - - @return The name of the property designated as the primary key. - */ -+ (nullable NSString *)primaryKey; - -/** - Override this method to specify the names of properties to ignore. These properties will not be managed by the Realm - that manages the object. - - @return An array of property names to ignore. - */ -+ (nullable NSArray *)ignoredProperties; - -/** - Override this method to specify the names of properties that are non-optional (i.e. cannot be assigned a `nil` value). - - By default, all properties of a type whose values can be set to `nil` are considered optional properties. - To require that an object in a Realm always store a non-`nil` value for a property, - add the name of the property to the array returned from this method. - - Properties of `RLMObject` type cannot be non-optional. Array and `NSNumber` properties - can be non-optional, but there is no reason to do so: arrays do not support storing nil, and - if you want a non-optional number you should instead use the primitive type. - - @return An array of property names that are required. - */ -+ (NSArray *)requiredProperties; - -/** - Override this method to provide information related to properties containing linking objects. - - Each property of type `RLMLinkingObjects` must have a key in the dictionary returned by this method consisting - of the property name. The corresponding value must be an instance of `RLMPropertyDescriptor` that describes the class - and property that the property is linked to. - - return @{ @"owners": [RLMPropertyDescriptor descriptorWithClass:Owner.class propertyName:@"dogs"] }; - - @return A dictionary mapping property names to `RLMPropertyDescriptor` instances. - */ -+ (NSDictionary *)linkingObjectsProperties; - -#pragma mark - Getting & Querying Objects from the Default Realm - -/** - Returns all objects of this object type from the default Realm. - - @return An `RLMResults` containing all objects of this type in the default Realm. - */ -+ (RLMResults *)allObjects; - -/** - Returns all objects of this object type matching the given predicate from the default Realm. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` containing all objects of this type in the default Realm that match the given predicate. - */ -+ (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -+ (RLMResults<__kindof RLMObject *> *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - - -/** - Returns all objects of this object type matching the given predicate from the default Realm. - - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` containing all objects of this type in the default Realm that match the given predicate. - */ -+ (RLMResults *)objectsWithPredicate:(nullable NSPredicate *)predicate; - -/** - Retrieves the single instance of this object type with the given primary key from the default Realm. - - Returns the object from the default Realm which has the given primary key, or - `nil` if the object does not exist. This is slightly faster than the otherwise - equivalent `[[SubclassName objectsWhere:@"primaryKeyPropertyName = %@", key] firstObject]`. - - This method requires that `primaryKey` be overridden on the receiving subclass. - - @return An object of this object type, or `nil` if an object with the given primary key does not exist. - @see `-primaryKey` - */ -+ (nullable instancetype)objectForPrimaryKey:(nullable id)primaryKey NS_SWIFT_NAME(object(forPrimaryKey:)); - - -#pragma mark - Querying Specific Realms - -/** - Returns all objects of this object type from the specified Realm. - - @param realm The Realm to query. - - @return An `RLMResults` containing all objects of this type in the specified Realm. - */ -+ (RLMResults *)allObjectsInRealm:(RLMRealm *)realm; - -/** - Returns all objects of this object type matching the given predicate from the specified Realm. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - @param realm The Realm to query. - - @return An `RLMResults` containing all objects of this type in the specified Realm that match the given predicate. - */ -+ (RLMResults *)objectsInRealm:(RLMRealm *)realm where:(NSString *)predicateFormat, ...; - -/// :nodoc: -+ (RLMResults<__kindof RLMObject *> *)objectsInRealm:(RLMRealm *)realm where:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all objects of this object type matching the given predicate from the specified Realm. - - @param predicate A predicate to use to filter the elements. - @param realm The Realm to query. - - @return An `RLMResults` containing all objects of this type in the specified Realm that match the given predicate. - */ -+ (RLMResults *)objectsInRealm:(RLMRealm *)realm withPredicate:(nullable NSPredicate *)predicate; - -/** - Retrieves the single instance of this object type with the given primary key from the specified Realm. - - Returns the object from the specified Realm which has the given primary key, or - `nil` if the object does not exist. This is slightly faster than the otherwise - equivalent `[[SubclassName objectsInRealm:realm where:@"primaryKeyPropertyName = %@", key] firstObject]`. - - This method requires that `primaryKey` be overridden on the receiving subclass. - - @return An object of this object type, or `nil` if an object with the given primary key does not exist. - @see `-primaryKey` - */ -+ (nullable instancetype)objectInRealm:(RLMRealm *)realm forPrimaryKey:(nullable id)primaryKey NS_SWIFT_NAME(object(in:forPrimaryKey:)); - -#pragma mark - Notifications - -/** - A callback block for `RLMObject` notifications. - - If the object is deleted from the managing Realm, the block is called with - `deleted` set to `YES` and the other two arguments are `nil`. The block will - never be called again after this. - - If the object is modified, the block will be called with `deleted` set to - `NO`, a `nil` error, and an array of `RLMPropertyChange` objects which - indicate which properties of the objects were modified. - - `error` is always `nil` and will be removed in a future version. - */ -typedef void (^RLMObjectChangeBlock)(BOOL deleted, - NSArray *_Nullable changes, - NSError *_Nullable error); - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When notifications - can't be delivered instantly, multiple notifications may be coalesced into a - single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - - @param block The block to be called whenever a change occurs. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block queue:(dispatch_queue_t)queue; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block keyPaths:(NSArray *)keyPaths queue:(dispatch_queue_t)queue; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block keyPaths:(NSArray *)keyPaths; - - -#pragma mark - Other Instance Methods - -/** - Returns YES if another Realm object instance points to the same object as the receiver in the Realm managing - the receiver. - - For frozen objects and object types with a primary key, `isEqual:` is - overridden to use the same logic as this method (along with a corresponding - implementation for `hash`). Non-frozen objects without primary keys use - pointer identity for `isEqual:` and `hash`. - - @param object The object to compare the receiver to. - - @return Whether the object represents the same object as the receiver. - */ -- (BOOL)isEqualToObject:(RLMObject *)object; - -/** - Returns a frozen (immutable) snapshot of this object. - - The frozen copy is an immutable object which contains the same data as this - object currently contains, but will not update when writes are made to the - containing Realm. Unlike live objects, frozen objects can be accessed from any - thread. - - - warning: Holding onto a frozen object for an extended period while performing write - transaction on the Realm may result in the Realm file growing to large sizes. See - `Realm.Configuration.maximumNumberOfActiveVersions` for more information. - - warning: This method can only be called on a managed object. - */ -- (instancetype)freeze NS_RETURNS_RETAINED; - -/** - Returns a live (mutable) reference of this object. - - This method creates a managed accessor to a live copy of the same frozen object. - Will return self if called on an already live object. - */ -- (instancetype)thaw; - -#pragma mark - Dynamic Accessors - -/// :nodoc: -- (nullable id)objectForKeyedSubscript:(NSString *)key; - -/// :nodoc: -- (void)setObject:(nullable id)obj forKeyedSubscript:(NSString *)key; - -@end - -/** - Information about a specific property which changed in an `RLMObject` change notification. - */ -@interface RLMPropertyChange : NSObject - -/** - The name of the property which changed. - */ -@property (nonatomic, readonly, strong) NSString *name; - -/** - The value of the property before the change occurred. This will always be `nil` - if the change happened on the same thread as the notification and for `RLMArray` - properties. - - For object properties this will give the object which was previously linked to, - but that object will have its new values and not the values it had before the - changes. This means that `previousValue` may be a deleted object, and you will - need to check `invalidated` before accessing any of its properties. - */ -@property (nonatomic, readonly, strong, nullable) id previousValue; - -/** - The value of the property after the change occurred. This will always be `nil` - for `RLMArray` properties. - */ -@property (nonatomic, readonly, strong, nullable) id value; -@end - -#pragma mark - RLMArray Property Declaration - -/** - Properties on `RLMObject`s of type `RLMArray` must have an associated type. A type is associated - with an `RLMArray` property by defining a protocol for the object type that the array should contain. - To define the protocol for an object, you can use the macro RLM_ARRAY_TYPE: - - RLM_ARRAY_TYPE(ObjectType) - ... - @property RLMArray *arrayOfObjectTypes; - */ -#define RLM_ARRAY_TYPE(RLM_OBJECT_SUBCLASS)\ -__attribute__((deprecated("RLM_ARRAY_TYPE has been deprecated. Use RLM_COLLECTION_TYPE instead."))) \ -@protocol RLM_OBJECT_SUBCLASS \ -@end - -/** - Properties on `RLMObject`s of type `RLMSet` / `RLMArray` must have an associated type. A type is associated - with an `RLMSet` / `RLMArray` property by defining a protocol for the object type that the array should contain. - To define the protocol for an object, you can use the macro RLM_COLLECTION_TYPE: - - RLM_COLLECTION_TYPE(ObjectType) - ... - @property RLMSet *setOfObjectTypes; - @property RLMArray *arrayOfObjectTypes; - */ -#define RLM_COLLECTION_TYPE(RLM_OBJECT_SUBCLASS)\ -@protocol RLM_OBJECT_SUBCLASS \ -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMObjectBase.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMObjectBase.h deleted file mode 100644 index 7e9c83c8f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMObjectBase.h +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// :nodoc: -@interface RLMObjectBase : NSObject - -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -- (instancetype)init NS_DESIGNATED_INITIALIZER; - -+ (NSString *)className; - -// Returns whether the class is included in the default set of classes managed by a Realm. -+ (BOOL)shouldIncludeInDefaultSchema; - -+ (nullable NSString *)_realmObjectName; -+ (nullable NSDictionary *)_realmColumnNames; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMObjectBase_Dynamic.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMObjectBase_Dynamic.h deleted file mode 100644 index fb74a5b27..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMObjectBase_Dynamic.h +++ /dev/null @@ -1,82 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectSchema, RLMRealm; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -/** - Returns the Realm that manages the object, if one exists. - - @warning This function is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is - recommended to retrieve the Realm that manages the object via `RLMObject`. - - @param object An `RLMObjectBase` obtained via a Swift `Object` or `RLMObject`. - - @return The Realm which manages this object. Returns `nil `for unmanaged objects. - */ -FOUNDATION_EXTERN RLMRealm * _Nullable RLMObjectBaseRealm(RLMObjectBase * _Nullable object); - -/** - Returns an `RLMObjectSchema` which describes the managed properties of the object. - - @warning This function is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is - recommended to retrieve `objectSchema` via `RLMObject`. - - @param object An `RLMObjectBase` obtained via a Swift `Object` or `RLMObject`. - - @return The object schema which lists the managed properties for the object. - */ -FOUNDATION_EXTERN RLMObjectSchema * _Nullable RLMObjectBaseObjectSchema(RLMObjectBase * _Nullable object); - -/** - Returns the object corresponding to a key value. - - @warning This function is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is - recommended to retrieve key values via `RLMObject`. - - @warning Will throw an `NSUndefinedKeyException` if `key` is not present on the object. - - @param object An `RLMObjectBase` obtained via a Swift `Object` or `RLMObject`. - @param key The name of the property. - - @return The object for the property requested. - */ -FOUNDATION_EXTERN id _Nullable RLMObjectBaseObjectForKeyedSubscript(RLMObjectBase * _Nullable object, NSString *key); - -/** - Sets a value for a key on the object. - - @warning This function is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is - recommended to set key values via `RLMObject`. - - @warning Will throw an `NSUndefinedKeyException` if `key` is not present on the object. - - @param object An `RLMObjectBase` obtained via a Swift `Object` or `RLMObject`. - @param key The name of the property. - @param obj The object to set as the value of the key. - */ -FOUNDATION_EXTERN void RLMObjectBaseSetObjectForKeyedSubscript(RLMObjectBase * _Nullable object, NSString *key, id _Nullable obj); - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMObjectId.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMObjectId.h deleted file mode 100644 index 32ef7b047..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMObjectId.h +++ /dev/null @@ -1,79 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A 12-byte (probably) unique object identifier. - - ObjectIds are similar to a GUID or a UUID, and can be used to uniquely identify - objects without a centralized ID generator. An ObjectID consists of: - - 1. A 4 byte timestamp measuring the creation time of the ObjectId in seconds - since the Unix epoch. - 2. A 5 byte random value - 3. A 3 byte counter, initialized to a random value. - - ObjectIds are intended to be fast to generate. Sorting by an ObjectId field - will typically result in the objects being sorted in creation order. - */ -RLM_SWIFT_SENDABLE // immutable -@interface RLMObjectId : NSObject -/// Creates a new randomly-initialized ObjectId. -+ (nonnull instancetype)objectId NS_SWIFT_NAME(generate()); - -/// Creates a new zero-initialized ObjectId. -- (instancetype)init; - -/// Creates a new ObjectId from the given 24-byte hexadecimal string. -/// -/// Returns `nil` and sets `error` if the string is not 24 characters long or -/// contains any characters other than 0-9a-fA-F. -/// -/// @param string The string to parse. -- (nullable instancetype)initWithString:(NSString *)string - error:(NSError **)error; - -/// Creates a new ObjectId using the given date, machine identifier, process identifier. -/// -/// @param timestamp A timestamp as NSDate. -/// @param machineIdentifier The machine identifier. -/// @param processIdentifier The process identifier. -- (instancetype)initWithTimestamp:(NSDate *)timestamp - machineIdentifier:(int)machineIdentifier - processIdentifier:(int)processIdentifier; - -/// Comparision operator to check if the right hand side is greater than the current value. -- (BOOL)isGreaterThan:(nullable RLMObjectId *)objectId; -/// Comparision operator to check if the right hand side is greater than or equal to the current value. -- (BOOL)isGreaterThanOrEqualTo:(nullable RLMObjectId *)objectId; -/// Comparision operator to check if the right hand side is less than the current value. -- (BOOL)isLessThan:(nullable RLMObjectId *)objectId; -/// Comparision operator to check if the right hand side is less than or equal to the current value. -- (BOOL)isLessThanOrEqualTo:(nullable RLMObjectId *)objectId; - -/// Get the ObjectId as a 24-character hexadecimal string. -@property (nonatomic, readonly) NSString *stringValue; -/// Get the timestamp for the RLMObjectId -@property (nonatomic, readonly) NSDate *timestamp; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMObjectSchema.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMObjectSchema.h deleted file mode 100644 index 9c4666b7c..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMObjectSchema.h +++ /dev/null @@ -1,83 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMProperty; - -/** - This class represents Realm model object schemas. - - When using Realm, `RLMObjectSchema` instances allow performing migrations and - introspecting the database's schema. - - Object schemas map to tables in the core database. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // not actually immutable, but the public API kinda is -@interface RLMObjectSchema : NSObject - -#pragma mark - Properties - -/** - An array of `RLMProperty` instances representing the managed properties of a class described by the schema. - - @see `RLMProperty` - */ -@property (nonatomic, readonly, copy) NSArray *properties; - -/** - The name of the class the schema describes. - */ -@property (nonatomic, readonly) NSString *className; - -/** - The property which serves as the primary key for the class the schema describes, if any. - */ -@property (nonatomic, readonly, nullable) RLMProperty *primaryKeyProperty; - -/** - Whether this object type is embedded. - */ -@property (nonatomic, readonly) BOOL isEmbedded; - -/** - Whether this object is asymmetric. - */ -@property (nonatomic, readonly) BOOL isAsymmetric; - -#pragma mark - Methods - -/** - Retrieves an `RLMProperty` object by the property name. - - @param propertyName The property's name. - - @return An `RLMProperty` object, or `nil` if there is no property with the given name. - */ -- (nullable RLMProperty *)objectForKeyedSubscript:(NSString *)propertyName; - -/** - Returns whether two `RLMObjectSchema` instances are equal. - */ -- (BOOL)isEqualToObjectSchema:(RLMObjectSchema *)objectSchema; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMProperty.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMProperty.h deleted file mode 100644 index 7f2594d3b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMProperty.h +++ /dev/null @@ -1,149 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// :nodoc: -@protocol RLMInt @end -/// :nodoc: -@protocol RLMBool @end -/// :nodoc: -@protocol RLMDouble @end -/// :nodoc: -@protocol RLMFloat @end -/// :nodoc: -@protocol RLMString @end -/// :nodoc: -@protocol RLMDate @end -/// :nodoc: -@protocol RLMData @end -/// :nodoc: -@protocol RLMDecimal128 @end -/// :nodoc: -@protocol RLMObjectId @end -/// :nodoc: -@protocol RLMUUID @end - -/// :nodoc: -@interface NSNumber () -@end - -/** - `RLMProperty` instances represent properties managed by a Realm in the context - of an object schema. Such properties may be persisted to a Realm file or - computed from other data from the Realm. - - When using Realm, `RLMProperty` instances allow performing migrations and - introspecting the database's schema. - - These property instances map to columns in the core database. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // not actually immutable, but the public API kinda is -@interface RLMProperty : NSObject - -#pragma mark - Properties - -/** - The name of the property. - */ -@property (nonatomic, readonly) NSString *name; - -/** - The type of the property. - - @see `RLMPropertyType` - */ -@property (nonatomic, readonly) RLMPropertyType type; - -/** - Indicates whether this property is indexed. - - @see `RLMObject` - */ -@property (nonatomic, readonly) BOOL indexed; - -/** - For `RLMObject` and `RLMCollection` properties, the name of the class of object stored in the property. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - For linking objects properties, the property name of the property the linking objects property is linked to. - */ -@property (nonatomic, readonly, copy, nullable) NSString *linkOriginPropertyName; - -/** - Indicates whether this property is optional. - */ -@property (nonatomic, readonly) BOOL optional; - -/** - Indicates whether this property is an array. - */ -@property (nonatomic, readonly) BOOL array; - -/** - Indicates whether this property is a set. - */ -@property (nonatomic, readonly) BOOL set; - -/** - Indicates whether this property is a dictionary. - */ -@property (nonatomic, readonly) BOOL dictionary; - -/** - Indicates whether this property is an array or set. - */ -@property (nonatomic, readonly) BOOL collection; - -#pragma mark - Methods - -/** - Returns whether a given property object is equal to the receiver. - */ -- (BOOL)isEqualToProperty:(RLMProperty *)property; - -@end - - -/** - An `RLMPropertyDescriptor` instance represents a specific property on a given class. - */ -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMPropertyDescriptor : NSObject - -/** - Creates and returns a property descriptor. - - @param objectClass The class of this property descriptor. - @param propertyName The name of this property descriptor. - */ -+ (instancetype)descriptorWithClass:(Class)objectClass propertyName:(NSString *)propertyName; - -/// The class of the property. -@property (nonatomic, readonly) Class objectClass; - -/// The name of the property. -@property (nonatomic, readonly) NSString *propertyName; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMProviderClient.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMProviderClient.h deleted file mode 100644 index ac649960a..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMProviderClient.h +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMApp; - -/// Base provider client interface. -RLM_SWIFT_SENDABLE -@interface RLMProviderClient : NSObject - -/// The app associated with this provider client. -@property (nonatomic, strong, readonly) RLMApp *app; - -/** - Initialize a provider client with a given app. - @param app The app for this provider client. - */ -- (instancetype)initWithApp:(RLMApp *)app; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMPushClient.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMPushClient.h deleted file mode 100644 index 0628c3ada..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMPushClient.h +++ /dev/null @@ -1,47 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMApp, RLMUser; - -/// A block type used to report an error -RLM_SWIFT_SENDABLE // invoked on a backgroun thread -typedef void(^RLMOptionalErrorBlock)(NSError * _Nullable); - -/// A client which can be used to register devices with the server to receive push notificatons -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMPushClient : NSObject - -/// The push notification service name the device will be registered with on the server -@property (nonatomic, readonly, nonnull) NSString *serviceName; - -/// Request to register device token to the server -- (void)registerDeviceWithToken:(NSString *)token - user:(RLMUser *)user - completion:(RLMOptionalErrorBlock)completion NS_SWIFT_NAME(registerDevice(token:user:completion:)); - -/// Request to deregister a device for a user -- (void)deregisterDeviceForUser:(RLMUser *)user - completion:(RLMOptionalErrorBlock)completion NS_SWIFT_NAME(deregisterDevice(user:completion:)); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMRealm+Sync.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMRealm+Sync.h deleted file mode 100644 index ff20e43c2..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMRealm+Sync.h +++ /dev/null @@ -1,38 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2017 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -@class RLMResults, RLMSyncSession; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -/// -@interface RLMRealm (Sync) - -/** - Get the RLMSyncSession used by this Realm. Will be nil if this is not a - synchronized Realm. -*/ -@property (nonatomic, nullable, readonly) RLMSyncSession *syncSession; - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMRealm.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMRealm.h deleted file mode 100644 index 0935e5301..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMRealm.h +++ /dev/null @@ -1,962 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMRealmConfiguration, RLMRealm, RLMObject, RLMSchema, RLMMigration, RLMNotificationToken, RLMThreadSafeReference, RLMAsyncOpenTask, RLMSyncSubscriptionSet; - -/** - A callback block for opening Realms asynchronously. - - Returns the Realm if the open was successful, or an error otherwise. - */ -typedef void(^RLMAsyncOpenRealmCallback)(RLMRealm * _Nullable realm, NSError * _Nullable error); - -/// The Id of the asynchronous transaction. -typedef unsigned RLMAsyncTransactionId; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - An `RLMRealm` instance (also referred to as "a Realm") represents a Realm - database. - - Realms can either be stored on disk (see `+[RLMRealm realmWithURL:]`) or in - memory (see `RLMRealmConfiguration`). - - `RLMRealm` instances are cached internally, and constructing equivalent `RLMRealm` - objects (for example, by using the same path or identifier) multiple times on a single thread - within a single iteration of the run loop will normally return the same - `RLMRealm` object. - - If you specifically want to ensure an `RLMRealm` instance is - destroyed (for example, if you wish to open a Realm, check some property, and - then possibly delete the Realm file and re-open it), place the code which uses - the Realm within an `@autoreleasepool {}` and ensure you have no other - strong references to it. - - @warning Non-frozen `RLMRealm` instances are thread-confined and cannot be - shared across threads or dispatch queues. Trying to do so will cause an - exception to be thrown. You must call this method on each thread you want to - interact with the Realm on. For dispatch queues, this means that you must call - it in each block which is dispatched, as a queue is not guaranteed to run all - of its blocks on the same thread. - */ - -@interface RLMRealm : NSObject - -#pragma mark - Creating & Initializing a Realm - -/** - Obtains an instance of the default Realm. - - The default Realm is used by the `RLMObject` class methods - which do not take an `RLMRealm` parameter, but is otherwise not special. The - default Realm is persisted as *default.realm* under the *Documents* directory of - your Application on iOS, in your application's *Application Support* - directory on macOS, and in the *Cache* directory on tvOS. - - The default Realm is created using the default `RLMRealmConfiguration`, which - can be changed via `+[RLMRealmConfiguration setDefaultConfiguration:]`. - - @return The default `RLMRealm` instance for the current thread. - */ -+ (instancetype)defaultRealm; - -/** - Obtains an instance of the default Realm bound to the given queue. - - Rather than being confined to the thread they are opened on, queue-bound - RLMRealms are confined to the given queue. They can be accessed from any - thread as long as it is from within a block dispatch to the queue, and - notifications will be delivered to the queue instead of a thread's run loop. - - Realms can only be confined to a serial queue. Queue-confined RLMRealm - instances can be obtained when not on that queue, but attempting to do - anything with that instance without first dispatching to the queue will throw - an incorrect thread exception. - - The default Realm is created using the default `RLMRealmConfiguration`, which - can be changed via `+[RLMRealmConfiguration setDefaultConfiguration:]`. - - @param queue A serial dispatch queue to confine the Realm to. - @return The default `RLMRealm` instance for the given queue. - */ -+ (instancetype)defaultRealmForQueue:(dispatch_queue_t)queue; - -/** - Obtains an `RLMRealm` instance with the given configuration. - - @param configuration A configuration object to use when creating the Realm. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return An `RLMRealm` instance. - */ -+ (nullable instancetype)realmWithConfiguration:(RLMRealmConfiguration *)configuration error:(NSError **)error; - -/** - Obtains an `RLMRealm` instance with the given configuration bound to the given queue. - - Rather than being confined to the thread they are opened on, queue-bound - RLMRealms are confined to the given queue. They can be accessed from any - thread as long as it is from within a block dispatch to the queue, and - notifications will be delivered to the queue instead of a thread's run loop. - - Realms can only be confined to a serial queue. Queue-confined RLMRealm - instances can be obtained when not on that queue, but attempting to do - anything with that instance without first dispatching to the queue will throw - an incorrect thread exception. - - @param configuration A configuration object to use when creating the Realm. - @param queue A serial dispatch queue to confine the Realm to. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return An `RLMRealm` instance. - */ -+ (nullable instancetype)realmWithConfiguration:(RLMRealmConfiguration *)configuration - queue:(nullable dispatch_queue_t)queue - error:(NSError **)error; - -/** - Obtains an `RLMRealm` instance persisted at a specified file URL. - - @param fileURL The local URL of the file the Realm should be saved at. - - @return An `RLMRealm` instance. - */ -+ (instancetype)realmWithURL:(NSURL *)fileURL; - -/** - Asynchronously open a Realm and deliver it to a block on the given queue. - - Opening a Realm asynchronously will perform all work needed to get the Realm to - a usable state (such as running potentially time-consuming migrations) on a - background thread before dispatching to the given queue. In addition, - synchronized Realms wait for all remote content available at the time the - operation began to be downloaded and available locally. - - The Realm passed to the callback function is confined to the callback queue as - if `-[RLMRealm realmWithConfiguration:queue:error]` was used. - - @param configuration A configuration object to use when opening the Realm. - @param callbackQueue The serial dispatch queue on which the callback should be run. - @param callback A callback block. If the Realm was successfully opened, - it will be passed in as an argument. - Otherwise, an `NSError` describing what went wrong will be - passed to the block instead. - */ -+ (RLMAsyncOpenTask *)asyncOpenWithConfiguration:(RLMRealmConfiguration *)configuration - callbackQueue:(dispatch_queue_t)callbackQueue - callback:(RLMAsyncOpenRealmCallback)callback; - -/** - The `RLMSchema` used by the Realm. - */ -@property (nonatomic, readonly) RLMSchema *schema; - -/** - Indicates if the Realm is currently engaged in a write transaction. - - @warning Do not simply check this property and then start a write transaction whenever an object needs to be - created, updated, or removed. Doing so might cause a large number of write transactions to be created, - degrading performance. Instead, always prefer performing multiple updates during a single transaction. - */ -@property (nonatomic, readonly) BOOL inWriteTransaction; - -/** - The `RLMRealmConfiguration` object that was used to create this `RLMRealm` instance. - */ -@property (nonatomic, readonly) RLMRealmConfiguration *configuration; - -/** - Indicates if this Realm contains any objects. - */ -@property (nonatomic, readonly) BOOL isEmpty; - -/** - Indicates if this Realm is frozen. - - @see `-[RLMRealm freeze]` - */ -@property (nonatomic, readonly, getter=isFrozen) BOOL frozen; - -/** - Returns a frozen (immutable) snapshot of this Realm. - - A frozen Realm is an immutable snapshot view of a particular version of a - Realm's data. Unlike normal RLMRealm instances, it does not live-update to - reflect writes made to the Realm, and can be accessed from any thread. Writing - to a frozen Realm is not allowed, and attempting to begin a write transaction - will throw an exception. - - All objects and collections read from a frozen Realm will also be frozen. - */ -- (RLMRealm *)freeze NS_RETURNS_RETAINED; - -/** - Returns a live reference of this Realm. - - All objects and collections read from the returned Realm will no longer be frozen. - This method will return `self` if it is not already frozen. - */ -- (RLMRealm *)thaw; - -#pragma mark - File Management - -/** - Writes a compacted and optionally encrypted copy of the Realm to the given local URL. - - The destination file cannot already exist. - - Note that if this method is called from within a write transaction, the - *current* data is written, not the data from the point when the previous write - transaction was committed. - - @param fileURL Local URL to save the Realm to. - @param key Optional 64-byte encryption key to encrypt the new file with. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return `YES` if the Realm was successfully written to disk, `NO` if an error occurred. - */ -- (BOOL)writeCopyToURL:(NSURL *)fileURL encryptionKey:(nullable NSData *)key error:(NSError **)error; - -/** - Writes a copy of the Realm to a given location specified by a given configuration. - - If the configuration supplied is derived from a `RLMUser` then this Realm will be copied with - sync functionality enabled. - - The destination file cannot already exist. - - @param configuration A Realm Configuration. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return `YES` if the Realm was successfully written to disk, `NO` if an error occurred. - */ -- (BOOL)writeCopyForConfiguration:(RLMRealmConfiguration *)configuration error:(NSError **)error; - -/** - Checks if the Realm file for the given configuration exists locally on disk. - - For non-synchronized, non-in-memory Realms, this is equivalent to - `-[NSFileManager.defaultManager fileExistsAtPath:config.path]`. For - synchronized Realms, it takes care of computing the actual path on disk based - on the server, virtual path, and user as is done when opening the Realm. - - @param config A Realm configuration to check the existence of. - @return YES if the Realm file for the given configuration exists on disk, NO otherwise. - */ -+ (BOOL)fileExistsForConfiguration:(RLMRealmConfiguration *)config; - -/** - Deletes the local Realm file and associated temporary files for the given configuration. - - This deletes the ".realm", ".note" and ".management" files which would be - created by opening the Realm with the given configuration. It does not delete - the ".lock" file (which contains no persisted data and is recreated from - scratch every time the Realm file is opened). - - The Realm must not be currently open on any thread or in another process. If - it is, this will return NO and report the error RLMErrorAlreadyOpen. Attempting to open - the Realm on another thread while the deletion is happening will block (and - then create a new Realm and open that afterwards). - - If the Realm already does not exist this will return `NO` and report the error NSFileNoSuchFileError; - - @param config A Realm configuration identifying the Realm to be deleted. - @return YES if any files were deleted, NO otherwise. - */ -+ (BOOL)deleteFilesForConfiguration:(RLMRealmConfiguration *)config error:(NSError **)error - __attribute__((swift_error(nonnull_error))); - -#pragma mark - Notifications - -/** - The type of a block to run whenever the data within the Realm is modified. - - @see `-[RLMRealm addNotificationBlock:]` - */ -typedef void (^RLMNotificationBlock)(RLMNotification notification, RLMRealm *realm); - -#pragma mark - Receiving Notification when a Realm Changes - -/** - Adds a notification handler for changes in this Realm, and returns a notification token. - - Notification handlers are called after each write transaction is committed, - either on the current thread or other threads. - - Handler blocks are called on the same thread that they were added on, and may - only be added on threads which are currently within a run loop. Unless you are - specifically creating and running a run loop on a background thread, this will - normally only be the main thread. - - The block has the following definition: - - typedef void(^RLMNotificationBlock)(RLMNotification notification, RLMRealm *realm); - - It receives the following parameters: - - - `NSString` \***notification**: The name of the incoming notification. See - `RLMRealmNotification` for information on what - notifications are sent. - - `RLMRealm` \***realm**: The Realm for which this notification occurred. - - @param block A block which is called to process Realm notifications. - - @return A token object which must be retained as long as you wish to continue - receiving change notifications. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMNotificationBlock)block __attribute__((warn_unused_result)); - -#pragma mark - Writing to a Realm - -/** - Begins a write transaction on the Realm. - - Only one write transaction can be open at a time for each Realm file. Write - transactions cannot be nested, and trying to begin a write transaction on a - Realm which is already in a write transaction will throw an exception. Calls to - `beginWriteTransaction` from `RLMRealm` instances for the same Realm file in - other threads or other processes will block until the current write transaction - completes or is cancelled. - - Before beginning the write transaction, `beginWriteTransaction` updates the - `RLMRealm` instance to the latest Realm version, as if `refresh` had been - called, and generates notifications if applicable. This has no effect if the - Realm was already up to date. - - It is rarely a good idea to have write transactions span multiple cycles of - the run loop, but if you do wish to do so you will need to ensure that the - Realm participating in the write transaction is kept alive until the write - transaction is committed. - */ -- (void)beginWriteTransaction; - -/** - Commits all write operations in the current write transaction, and ends the - transaction. - - After saving the changes, all notification blocks registered on this specific - `RLMRealm` instance are invoked synchronously. Notification blocks registered - on other threads or on collections are invoked asynchronously. If you do not - want to receive a specific notification for this write tranaction, see - `commitWriteTransactionWithoutNotifying:error:`. - - This method can fail if there is insufficient disk space available to save the - writes made, or due to unexpected i/o errors. This version of the method throws - an exception when errors occur. Use the version with a `NSError` out parameter - instead if you wish to handle errors. - - @warning This method may only be called during a write transaction. - */ -- (void)commitWriteTransaction NS_SWIFT_UNAVAILABLE(""); - -/** - Commits all write operations in the current write transaction, and ends the - transaction. - - After saving the changes, all notification blocks registered on this specific - `RLMRealm` instance are invoked synchronously. Notification blocks registered - on other threads or on collections are invoked asynchronously. If you do not - want to receive a specific notification for this write tranaction, see - `commitWriteTransactionWithoutNotifying:error:`. - - This method can fail if there is insufficient disk space available to save the - writes made, or due to unexpected i/o errors. - - @warning This method may only be called during a write transaction. - - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return Whether the transaction succeeded. - */ -- (BOOL)commitWriteTransaction:(NSError **)error; - -/** - Commits all write operations in the current write transaction, without - notifying specific notification blocks of the changes. - - After saving the changes, all notification blocks registered on this specific - `RLMRealm` instance are invoked synchronously. Notification blocks registered - on other threads or on collections are scheduled to be invoked asynchronously. - - You can skip notifiying specific notification blocks about the changes made - in this write transaction by passing in their associated notification tokens. - This is primarily useful when the write transaction is saving changes already - made in the UI and you do not want to have the notification block attempt to - re-apply the same changes. - - The tokens passed to this method must be for notifications for this specific - `RLMRealm` instance. Notifications for different threads cannot be skipped - using this method. - - This method can fail if there is insufficient disk space available to save the - writes made, or due to unexpected i/o errors. - - @warning This method may only be called during a write transaction. - - @param tokens An array of notification tokens which were returned from adding - callbacks which you do not want to be notified for the changes - made in this write transaction. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return Whether the transaction succeeded. - */ -- (BOOL)commitWriteTransactionWithoutNotifying:(NSArray *)tokens error:(NSError **)error; - -/** - Reverts all writes made during the current write transaction and ends the transaction. - - This rolls back all objects in the Realm to the state they were in at the - beginning of the write transaction, and then ends the transaction. - - This restores the data for deleted objects, but does not revive invalidated - object instances. Any `RLMObject`s which were added to the Realm will be - invalidated rather than becoming unmanaged. - Given the following code: - - ObjectType *oldObject = [[ObjectType objectsWhere:@"..."] firstObject]; - ObjectType *newObject = [[ObjectType alloc] init]; - - [realm beginWriteTransaction]; - [realm addObject:newObject]; - [realm deleteObject:oldObject]; - [realm cancelWriteTransaction]; - - Both `oldObject` and `newObject` will return `YES` for `isInvalidated`, - but re-running the query which provided `oldObject` will once again return - the valid object. - - KVO observers on any objects which were modified during the transaction will - be notified about the change back to their initial values, but no other - notifications are produced by a cancelled write transaction. - - @warning This method may only be called during a write transaction. - */ -- (void)cancelWriteTransaction; - -/** - Performs actions contained within the given block inside a write transaction. - - @see `[RLMRealm transactionWithoutNotifying:block:error:]` - */ -- (void)transactionWithBlock:(__attribute__((noescape)) void(^)(void))block NS_SWIFT_UNAVAILABLE(""); - -/** - Performs actions contained within the given block inside a write transaction. - - @see `[RLMRealm transactionWithoutNotifying:block:error:]` - */ -- (BOOL)transactionWithBlock:(__attribute__((noescape)) void(^)(void))block error:(NSError **)error; - -/** - Performs actions contained within the given block inside a write transaction. - - @see `[RLMRealm transactionWithoutNotifying:block:error:]` - */ -- (void)transactionWithoutNotifying:(NSArray *)tokens block:(__attribute__((noescape)) void(^)(void))block; - -/** - Performs actions contained within the given block inside a write transaction. - - Write transactions cannot be nested, and trying to execute a write transaction - on a Realm which is already participating in a write transaction will throw an - exception. Calls to `transactionWithBlock:` from `RLMRealm` instances in other - threads will block until the current write transaction completes. - - Before beginning the write transaction, `transactionWithBlock:` updates the - `RLMRealm` instance to the latest Realm version, as if `refresh` had been called, and - generates notifications if applicable. This has no effect if the Realm - was already up to date. - - You can skip notifiying specific notification blocks about the changes made - in this write transaction by passing in their associated notification tokens. - This is primarily useful when the write transaction is saving changes already - made in the UI and you do not want to have the notification block attempt to - re-apply the same changes. - - The tokens passed to this method must be for notifications for this specific - `RLMRealm` instance. Notifications for different threads cannot be skipped - using this method. - - @param tokens An array of notification tokens which were returned from adding - callbacks which you do not want to be notified for the changes - made in this write transaction. - @param block The block containing actions to perform. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return Whether the transaction succeeded. - */ -- (BOOL)transactionWithoutNotifying:(NSArray *)tokens block:(__attribute__((noescape)) void(^)(void))block error:(NSError **)error; - -/** - Indicates if the Realm is currently performing async write operations. - This becomes YES following a call to `beginAsyncWriteTransaction`, - `commitAsyncWriteTransaction`, or `asyncTransactionWithBlock:`, and remains so - until all scheduled async write work has completed. - - @warning If this is `YES`, closing or invalidating the Realm will block until scheduled work has completed. - */ -@property (nonatomic, readonly) BOOL isPerformingAsynchronousWriteOperations; - -/** - Begins an asynchronous write transaction. - This function asynchronously begins a write transaction on a background - thread, and then invokes the block on the original thread or queue once the - transaction has begun. Unlike `beginWriteTransaction`, this does not block the - calling thread if another thread is current inside a write transaction, and - will always return immediately. - Multiple calls to this function (or the other functions which perform - asynchronous write transactions) will queue the blocks to be called in the - same order as they were queued. This includes calls from inside a write - transaction block, which unlike with synchronous transactions are allowed. - - @param block The block containing actions to perform inside the write transaction. - `block` should end by calling `commitAsyncWriteTransaction`, - `commitWriteTransaction` or `cancelWriteTransaction`. - Returning without one of these calls is equivalent to calling `cancelWriteTransaction`. - - @return An id identifying the asynchronous transaction which can be passed to - `cancelAsyncTransaction:` prior to the block being called to cancel - the pending invocation of the block. - */ -- (RLMAsyncTransactionId)beginAsyncWriteTransaction:(void(^)(void))block; - -/** - Asynchronously commits a write transaction. - The call returns immediately allowing the caller to proceed while the I/O is - performed on a dedicated background thread. This can be used regardless of if - the write transaction was begun with `beginWriteTransaction` or - `beginAsyncWriteTransaction`. - - @param completionBlock A block which will be called on the source thread or - queue once the commit has either completed or failed - with an error. - - @param allowGrouping If `YES`, multiple sequential calls to - `commitAsyncWriteTransaction:` may be batched together - and persisted to stable storage in one group. This - improves write performance, particularly when the - individual transactions being batched are small. In the - event of a crash or power failure, either all of the - grouped transactions will be lost or none will, rather - than the usual guarantee that data has been persisted as - soon as a call to commit has returned. - - @return An id identifying the asynchronous transaction commit can be passed to - `cancelAsyncTransaction:` prior to the completion block being called - to cancel the pending invocation of the block. Note that this does - *not* cancel the commit itself. -*/ -- (RLMAsyncTransactionId)commitAsyncWriteTransaction:(nullable void(^)(NSError *_Nullable))completionBlock - allowGrouping:(BOOL)allowGrouping; - -/** - Asynchronously commits a write transaction. - The call returns immediately allowing the caller to proceed while the I/O is - performed on a dedicated background thread. This can be used regardless of if - the write transaction was begun with `beginWriteTransaction` or - `beginAsyncWriteTransaction`. - - @param completionBlock A block which will be called on the source thread or - queue once the commit has either completed or failed - with an error. - - @return An id identifying the asynchronous transaction commit can be passed to - `cancelAsyncTransaction:` prior to the completion block being called - to cancel the pending invocation of the block. Note that this does - *not* cancel the commit itself. -*/ -- (RLMAsyncTransactionId)commitAsyncWriteTransaction:(void(^)(NSError *_Nullable))completionBlock; - -/** - Asynchronously commits a write transaction. - The call returns immediately allowing the caller to proceed while the I/O is - performed on a dedicated background thread. This can be used regardless of if - the write transaction was begun with `beginWriteTransaction` or - `beginAsyncWriteTransaction`. - - @return An id identifying the asynchronous transaction commit can be passed to - `cancelAsyncTransaction:` prior to the completion block being called - to cancel the pending invocation of the block. Note that this does - *not* cancel the commit itself. -*/ -- (RLMAsyncTransactionId)commitAsyncWriteTransaction; - -/** - Cancels a queued block for an asynchronous transaction. - This can cancel a block passed to either an asynchronous begin or an - asynchronous commit. Canceling a begin cancels that transaction entirely, - while canceling a commit merely cancels the invocation of the completion - callback, and the commit will still happen. - Transactions can only be canceled before the block is invoked, and calling - `cancelAsyncTransaction:` from within the block is a no-op. - - @param asyncTransactionId A transaction id from either `beginAsyncWriteTransaction:` or `commitAsyncWriteTransaction:`. -*/ -- (void)cancelAsyncTransaction:(RLMAsyncTransactionId)asyncTransactionId; - -/** - Asynchronously performs actions contained within the given block inside a - write transaction. - The write transaction is begun asynchronously as if calling - `beginAsyncWriteTransaction:`, and by default the transaction is commited - asynchronously after the block completes. You can also explicitly call - `commitWriteTransaction` or `cancelWriteTransaction` from within the block to - synchronously commit or cancel the write transaction. - - @param block The block containing actions to perform. - - @param completionBlock A block which will be called on the source thread or - queue once the commit has either completed or failed - with an error. - - @return An id identifying the asynchronous transaction which can be passed to - `cancelAsyncTransaction:` prior to the block being called to cancel - the pending invocation of the block. -*/ -- (RLMAsyncTransactionId)asyncTransactionWithBlock:(void(^)(void))block onComplete:(nullable void(^)(NSError *))completionBlock; - -/** - Asynchronously performs actions contained within the given block inside a - write transaction. - The write transaction is begun asynchronously as if calling - `beginAsyncWriteTransaction:`, and by default the transaction is commited - asynchronously after the block completes. You can also explicitly call - `commitWriteTransaction` or `cancelWriteTransaction` from within the block to - synchronously commit or cancel the write transaction. - - @param block The block containing actions to perform. - - @return An id identifying the asynchronous transaction which can be passed to - `cancelAsyncTransaction:` prior to the block being called to cancel - the pending invocation of the block. -*/ -- (RLMAsyncTransactionId)asyncTransactionWithBlock:(void(^)(void))block; - -/** - Updates the Realm and outstanding objects managed by the Realm to point to the - most recent data. - - If the version of the Realm is actually changed, Realm and collection - notifications will be sent to reflect the changes. This may take some time, as - collection notifications are prepared on a background thread. As a result, - calling this method on the main thread is not advisable. - - @return Whether there were any updates for the Realm. Note that `YES` may be - returned even if no data actually changed. - */ -- (BOOL)refresh; - -/** - Set this property to `YES` to automatically update this Realm when changes - happen in other threads. - - If set to `YES` (the default), changes made on other threads will be reflected - in this Realm on the next cycle of the run loop after the changes are - committed. If set to `NO`, you must manually call `-refresh` on the Realm to - update it to get the latest data. - - Note that by default, background threads do not have an active run loop and you - will need to manually call `-refresh` in order to update to the latest version, - even if `autorefresh` is set to `YES`. - - Even with this property enabled, you can still call `-refresh` at any time to - update the Realm before the automatic refresh would occur. - - Write transactions will still always advance a Realm to the latest version and - produce local notifications on commit even if autorefresh is disabled. - - Disabling `autorefresh` on a Realm without any strong references to it will not - have any effect, and `autorefresh` will revert back to `YES` the next time the - Realm is created. This is normally irrelevant as it means that there is nothing - to refresh (as managed `RLMObject`s, `RLMArray`s, and `RLMResults` have strong - references to the Realm that manages them), but it means that setting - `RLMRealm.defaultRealm.autorefresh = NO` in - `application:didFinishLaunchingWithOptions:` and only later storing Realm - objects will not work. - - Defaults to `YES`. - */ -@property (nonatomic) BOOL autorefresh; - -/** - Invalidates all `RLMObject`s, `RLMResults`, `RLMLinkingObjects`, and `RLMArray`s managed by the Realm. - - A Realm holds a read lock on the version of the data accessed by it, so - that changes made to the Realm on different threads do not modify or delete the - data seen by this Realm. Calling this method releases the read lock, - allowing the space used on disk to be reused by later write transactions rather - than growing the file. This method should be called before performing long - blocking operations on a background thread on which you previously read data - from the Realm which you no longer need. - - All `RLMObject`, `RLMResults` and `RLMArray` instances obtained from this - `RLMRealm` instance on the current thread are invalidated. `RLMObject`s and `RLMArray`s - cannot be used. `RLMResults` will become empty. The Realm itself remains valid, - and a new read transaction is implicitly begun the next time data is read from the Realm. - - Calling this method multiple times in a row without reading any data from the - Realm, or before ever reading any data from the Realm, is a no-op. - */ -- (void)invalidate; - -#pragma mark - Accessing Objects - -/** - Returns the same object as the one referenced when the `RLMThreadSafeReference` was first created, - but resolved for the current Realm for this thread. Returns `nil` if this object was deleted after - the reference was created. - - @param reference The thread-safe reference to the thread-confined object to resolve in this Realm. - - @warning A `RLMThreadSafeReference` object must be resolved at most once. - Failing to resolve a `RLMThreadSafeReference` will result in the source version of the - Realm being pinned until the reference is deallocated. - An exception will be thrown if a reference is resolved more than once. - - @warning Cannot call within a write transaction. - - @note Will refresh this Realm if the source Realm was at a later version than this one. - - @see `+[RLMThreadSafeReference referenceWithThreadConfined:]` - */ -- (nullable id)resolveThreadSafeReference:(RLMThreadSafeReference *)reference -NS_REFINED_FOR_SWIFT; - -#pragma mark - Adding and Removing Objects from a Realm - -/** - Adds an object to the Realm. - - Once added, this object is considered to be managed by the Realm. It can be retrieved - using the `objectsWhere:` selectors on `RLMRealm` and on subclasses of `RLMObject`. - - When added, all child relationships referenced by this object will also be added to - the Realm if they are not already in it. - - If the object or any related objects are already being managed by a different Realm - an exception will be thrown. Use `-[RLMObject createInRealm:withObject:]` to insert a copy of a managed object - into a different Realm. - - The object to be added must be valid and cannot have been previously deleted - from a Realm (i.e. `isInvalidated` must be `NO`). - - @warning This method may only be called during a write transaction. - - @param object The object to be added to this Realm. - */ -- (void)addObject:(RLMObject *)object; - -/** - Adds all the objects in a collection to the Realm. - - This is the equivalent of calling `addObject:` for every object in a collection. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable collection such as `NSArray`, `RLMArray`, or `RLMResults`, - containing Realm objects to be added to the Realm. - - @see `addObject:` - */ -- (void)addObjects:(id)objects; - -/** - Adds or updates an existing object into the Realm. - - The object provided must have a designated primary key. If no objects exist in the Realm - with the same primary key value, the object is inserted. Otherwise, the existing object is - updated with any changed values. - - As with `addObject:`, the object cannot already be managed by a different - Realm. Use `-[RLMObject createOrUpdateInRealm:withValue:]` to copy values to - a different Realm. - - If there is a property or KVC value on `object` whose value is nil, and it corresponds - to a nullable property on an existing object being updated, that nullable property will - be set to nil. - - @warning This method may only be called during a write transaction. - - @param object The object to be added or updated. - */ -- (void)addOrUpdateObject:(RLMObject *)object; - -/** - Adds or updates all the objects in a collection into the Realm. - - This is the equivalent of calling `addOrUpdateObject:` for every object in a collection. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable collection such as `NSArray`, `RLMArray`, or `RLMResults`, - containing Realm objects to be added to or updated within the Realm. - - @see `addOrUpdateObject:` - */ -- (void)addOrUpdateObjects:(id)objects; - -/** - Deletes an object from the Realm. Once the object is deleted it is considered invalidated. - - @warning This method may only be called during a write transaction. - - @param object The object to be deleted. - */ -- (void)deleteObject:(RLMObject *)object; - -/** - Deletes one or more objects from the Realm. - - This is the equivalent of calling `deleteObject:` for every object in a collection. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable collection such as `NSArray`, `RLMArray`, or `RLMResults`, - containing objects to be deleted from the Realm. - - @see `deleteObject:` - */ -- (void)deleteObjects:(id)objects; - -/** - Deletes all objects from the Realm. - - @warning This method may only be called during a write transaction. - - @see `deleteObject:` - */ -- (void)deleteAllObjects; - -#pragma mark - Sync Subscriptions - -/** - Represents the active subscriptions for this realm, which can be used to add/remove/update - and search flexible sync subscriptions. - Getting the subscriptions from a local or partition-based configured realm will thrown an exception. - - @warning This feature is currently in beta and its API is subject to change. - */ -@property (nonatomic, readonly, nonnull) RLMSyncSubscriptionSet *subscriptions; - - -#pragma mark - Migrations - -/** - The type of a migration block used to migrate a Realm. - - @param migration A `RLMMigration` object used to perform the migration. The - migration object allows you to enumerate and alter any - existing objects which require migration. - - @param oldSchemaVersion The schema version of the Realm being migrated. - */ -RLM_SWIFT_SENDABLE -typedef void (^RLMMigrationBlock)(RLMMigration *migration, uint64_t oldSchemaVersion); - -/** - Returns the schema version for a Realm at a given local URL. - - @param fileURL Local URL to a Realm file. - @param key 64-byte key used to encrypt the file, or `nil` if it is unencrypted. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return The version of the Realm at `fileURL`, or `RLMNotVersioned` if the version cannot be read. - */ -+ (uint64_t)schemaVersionAtURL:(NSURL *)fileURL encryptionKey:(nullable NSData *)key - error:(NSError **)error -NS_REFINED_FOR_SWIFT; - -/** - Performs the given Realm configuration's migration block on a Realm at the given path. - - This method is called automatically when opening a Realm for the first time and does - not need to be called explicitly. You can choose to call this method to control - exactly when and how migrations are performed. - - @param configuration The Realm configuration used to open and migrate the Realm. - @return The error that occurred while applying the migration, if any. - - @see RLMMigration - */ -+ (BOOL)performMigrationForConfiguration:(RLMRealmConfiguration *)configuration error:(NSError **)error; - -#pragma mark - Unavailable Methods - -/** - RLMRealm instances are cached internally by Realm and cannot be created directly. - - Use `+[RLMRealm defaultRealm]`, `+[RLMRealm realmWithConfiguration:error:]` or - `+[RLMRealm realmWithURL]` to obtain a reference to an RLMRealm. - */ -- (instancetype)init __attribute__((unavailable("Use +defaultRealm, +realmWithConfiguration: or +realmWithURL:."))); - -/** - RLMRealm instances are cached internally by Realm and cannot be created directly. - - Use `+[RLMRealm defaultRealm]`, `+[RLMRealm realmWithConfiguration:error:]` or - `+[RLMRealm realmWithURL]` to obtain a reference to an RLMRealm. - */ -+ (instancetype)new __attribute__((unavailable("Use +defaultRealm, +realmWithConfiguration: or +realmWithURL:."))); - -/// :nodoc: -- (void)addOrUpdateObjectsFromArray:(id)array __attribute__((unavailable("Renamed to -addOrUpdateObjects:."))); - -@end - -// MARK: - RLMNotificationToken - -/** - A token which is returned from methods which subscribe to changes to a Realm. - - Change subscriptions in Realm return an `RLMNotificationToken` instance, - which can be used to unsubscribe from the changes. You must store a strong - reference to the token for as long as you want to continue to receive notifications. - When you wish to stop, call the `-invalidate` method. Notifications are also stopped if - the token is deallocated. - */ -RLM_SWIFT_SENDABLE // is internally thread-safe -@interface RLMNotificationToken : NSObject -/// Stops notifications for the change subscription that returned this token. -/// -/// @return True if the token was previously valid, and false if it was already invalidated. -- (bool)invalidate; - -/// Stops notifications for the change subscription that returned this token. -- (void)stop __attribute__((unavailable("Renamed to -invalidate."))) NS_REFINED_FOR_SWIFT; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMRealmConfiguration.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMRealmConfiguration.h deleted file mode 100644 index d09e5c215..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMRealmConfiguration.h +++ /dev/null @@ -1,197 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2015 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMEventConfiguration, RLMSyncConfiguration; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A block called when opening a Realm for the first time during the life - of a process to determine if it should be compacted before being returned - to the user. It is passed the total file size (data + free space) and the total - bytes used by data in the file. - - Return `YES` to indicate that an attempt to compact the file should be made. - The compaction will be skipped if another process is accessing it. - */ -RLM_SWIFT_SENDABLE -typedef BOOL (^RLMShouldCompactOnLaunchBlock)(NSUInteger totalBytes, NSUInteger bytesUsed); - -/** - A block which receives a subscription set instance, that can be used to add an initial set of subscriptions which will be executed - when the Realm is first opened. - */ -RLM_SWIFT_SENDABLE -typedef void(^RLMFlexibleSyncInitialSubscriptionsBlock)(RLMSyncSubscriptionSet * _Nonnull subscriptions); - -/** - An `RLMRealmConfiguration` instance describes the different options used to - create an instance of a Realm. - - `RLMRealmConfiguration` instances are just plain `NSObject`s. Unlike `RLMRealm`s - and `RLMObject`s, they can be freely shared between threads as long as you do not - mutate them. - - Creating configuration objects for class subsets (by setting the - `objectClasses` property) can be expensive. Because of this, you will normally want to - cache and reuse a single configuration object for each distinct configuration rather than - creating a new object each time you open a Realm. - */ -@interface RLMRealmConfiguration : NSObject - -#pragma mark - Default Configuration - -/** - Returns the default configuration used to create Realms when no other - configuration is explicitly specified (i.e. `+[RLMRealm defaultRealm]`). - - @return The default Realm configuration. - */ -+ (instancetype)defaultConfiguration; - -/** - Sets the default configuration to the given `RLMRealmConfiguration`. - - @param configuration The new default Realm configuration. - */ -+ (void)setDefaultConfiguration:(RLMRealmConfiguration *)configuration; - -#pragma mark - Properties - -/// The local URL of the Realm file. Mutually exclusive with `inMemoryIdentifier`; -/// setting one of the two properties will automatically nil out the other. -@property (nonatomic, copy, nullable) NSURL *fileURL; - -/// A string used to identify a particular in-memory Realm. Mutually exclusive with `fileURL`, -/// `seedFilePath`and `syncConfiguration`; -/// setting any one of the three properties will automatically nil out the other two. -@property (nonatomic, copy, nullable) NSString *inMemoryIdentifier; - -/// A 64-byte key to use to encrypt the data, or `nil` if encryption is not enabled. -@property (nonatomic, copy, nullable) NSData *encryptionKey; - -/// Whether to open the Realm in read-only mode. -/// -/// For non-synchronized Realms, this is required to be able to open Realm -/// files which are not writeable or are in a directory which is not writeable. -/// This should only be used on files which will not be modified by anyone -/// while they are open, and not just to get a read-only view of a file which -/// may be written to by another thread or process. Opening in read-only mode -/// requires disabling Realm's reader/writer coordination, so committing a -/// write transaction from another process will result in crashes. -/// -/// Syncronized Realms must always be writeable (as otherwise no -/// synchronization could happen), and this instead merely disallows performing -/// write transactions on the Realm. In addition, it will skip some automatic -/// writes made to the Realm, such as to initialize the Realm's schema. Setting -/// `readOnly = YES` is not strictly required for Realms which the sync user -/// does not have write access to, but is highly recommended as it will improve -/// error reporting and catch some errors earlier. -/// -/// Realms using query-based sync cannot be opened in read-only mode. -@property (nonatomic) BOOL readOnly; - -/// The current schema version. -@property (nonatomic) uint64_t schemaVersion; - -/// The block which migrates the Realm to the current version. -@property (nonatomic, copy, nullable) RLMMigrationBlock migrationBlock; - -/** - Whether to recreate the Realm file with the provided schema if a migration is required. - This is the case when the stored schema differs from the provided schema or - the stored schema version differs from the version on this configuration. - Setting this property to `YES` deletes the file if a migration would otherwise be required or executed. - - @note Setting this property to `YES` doesn't disable file format migrations. - */ -@property (nonatomic) BOOL deleteRealmIfMigrationNeeded; - -/** - A block called when opening a Realm for the first time during the life - of a process to determine if it should be compacted before being returned - to the user. It is passed the total file size (data + free space) and the total - bytes used by data in the file. - - Return `YES` to indicate that an attempt to compact the file should be made. - The compaction will be skipped if another process is accessing it. - */ -@property (nonatomic, copy, nullable) RLMShouldCompactOnLaunchBlock shouldCompactOnLaunch; - -/// The classes managed by the Realm. -@property (nonatomic, copy, nullable) NSArray *objectClasses; - -/** - The maximum number of live versions in the Realm file before an exception will - be thrown when attempting to start a write transaction. - - Realm provides MVCC snapshot isolation, meaning that writes on one thread do - not overwrite data being read on another thread, and instead write a new copy - of that data. When a Realm refreshes it updates to the latest version of the - data and releases the old versions, allowing them to be overwritten by - subsequent write transactions. - - Under normal circumstances this is not a problem, but if the number of active - versions grow too large, it will have a negative effect on the filesize on - disk. This can happen when performing writes on many different threads at - once, when holding on to frozen objects for an extended time, or when - performing long operations on background threads which do not allow the Realm - to refresh. - - Setting this property to a non-zero value makes it so that exceeding the set - number of versions will instead throw an exception. This can be used with a - low value during development to help identify places that may be problematic, - or in production use to cause the app to crash rather than produce a Realm - file which is too large to be opened. - - */ -@property (nonatomic) NSUInteger maximumNumberOfActiveVersions; - -/** - When opening the Realm for the first time, instead of creating an empty file, - the Realm file will be copied from the provided seed file path and used instead. - This can be used to open a Realm file with pre-populated data. - - If a realm file already exists at the configuration's destination path, the seed file - will not be copied and the already existing realm will be opened instead. - - Note that to use this parameter with a synced Realm configuration - the seed Realm must be appropriately copied to a destination with - `[RLMRealm writeCopyForConfiguration:]` first. - - This option is mutually exclusive with `inMemoryIdentifier`. Setting a `seedFilePath` - will nil out the `inMemoryIdentifier`. - */ -@property (nonatomic, copy, nullable) NSURL *seedFilePath; - -/** - A configuration object representing configuration state for Realms intended - to sync with Atlas Device Sync. - - This property is mutually exclusive with both `inMemoryIdentifier` and `fileURL`; - setting any one of the three properties will automatically nil out the other two. - - @see `RLMSyncConfiguration` - */ -@property (nullable, nonatomic) RLMSyncConfiguration *syncConfiguration; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMRealm_Dynamic.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMRealm_Dynamic.h deleted file mode 100644 index bea162775..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMRealm_Dynamic.h +++ /dev/null @@ -1,118 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import -#import - -@class RLMResults; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMRealm (Dynamic) - -#pragma mark - Getting Objects from a Realm - -/** - Returns all objects of a given type from the Realm. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. The preferred way to get objects of a single class is to use the class - methods on `RLMObject`. - - @param className The name of the `RLMObject` subclass to retrieve on (e.g. `MyClass.className`). - - @return An `RLMResults` containing all objects in the Realm of the given type. - - @see `+[RLMObject allObjects]` - */ -- (RLMResults *)allObjects:(NSString *)className; - -/** - Returns all objects matching the given predicate from the Realm. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. The preferred way to get objects of a single class is to use the class - methods on `RLMObject`. - - @param className The type of objects you are looking for (name of the class). - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` containing results matching the given predicate. - - @see `+[RLMObject objectsWhere:]` - */ -- (RLMResults *)objects:(NSString *)className where:(NSString *)predicateFormat, ...; - -/** - Returns all objects matching the given predicate from the Realm. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. The preferred way to get objects of a single class is to use the class - methods on `RLMObject`. - - @param className The type of objects you are looking for (name of the class). - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` containing results matching the given predicate. - - @see `+[RLMObject objectsWhere:]` - */ -- (RLMResults *)objects:(NSString *)className withPredicate:(NSPredicate *)predicate; - -/** - Returns the object of the given type with the given primary key from the Realm. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. The preferred way to get an object of a single class is to use the class - methods on `RLMObject`. - - @param className The class name for the object you are looking for. - @param primaryKey The primary key value for the object you are looking for. - - @return An object, or `nil` if an object with the given primary key does not exist. - - @see `+[RLMObject objectForPrimaryKey:]` - */ -- (nullable RLMObject *)objectWithClassName:(NSString *)className forPrimaryKey:(id)primaryKey; - -/** - Creates an `RLMObject` instance of type `className` in the Realm, and populates it using a given object. - - The `value` argument is used to populate the object. It can be a key-value coding compliant object, an array or - dictionary returned from the methods in `NSJSONSerialization`, or an array containing one element for each managed - property. An exception will be thrown if any required properties are not present and those properties were not defined - with default values. - - When passing in an array as the `value` argument, all properties must be present, valid and in the same order as the - properties defined in the model. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is recommended to - use `[RLMObject createInDefaultRealmWithValue:]`. - - @param value The value used to populate the object. - - @return An `RLMObject` instance of type `className`. - */ --(RLMObject *)createObject:(NSString *)className withValue:(id)value; - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMResults.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMResults.h deleted file mode 100644 index 5911e666a..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMResults.h +++ /dev/null @@ -1,567 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObject; - -/** - `RLMResults` is an auto-updating container type in Realm returned from object - queries. It represents the results of the query in the form of a collection of objects. - - `RLMResults` can be queried using the same predicates as `RLMObject` and `RLMArray`, - and you can chain queries to further filter results. - - `RLMResults` always reflect the current state of the Realm on the current thread, - including during write transactions on the current thread. The one exception to - this is when using `for...in` fast enumeration, which will always enumerate - over the objects which matched the query when the enumeration is begun, even if - some of them are deleted or modified to be excluded by the filter during the - enumeration. - - `RLMResults` are lazily evaluated the first time they are accessed; they only - run queries when the result of the query is requested. This means that - chaining several temporary `RLMResults` to sort and filter your data does not - perform any extra work processing the intermediate state. - - Once the results have been evaluated or a notification block has been added, - the results are eagerly kept up-to-date, with the work done to keep them - up-to-date done on a background thread whenever possible. - - `RLMResults` cannot be directly instantiated. - */ -@interface RLMResults : NSObject - -#pragma mark - Properties - -/** - The number of objects in the results collection. - */ -@property (nonatomic, readonly, assign) NSUInteger count; - -/** - The type of the objects in the results collection. - */ -@property (nonatomic, readonly, assign) RLMPropertyType type; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readwrite, getter = isOptional) BOOL optional; - -/** - The class name of the objects contained in the results collection. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages this results collection. - */ -@property (nonatomic, readonly) RLMRealm *realm; - -/** - Indicates if the results collection is no longer valid. - - The results collection becomes invalid if `invalidate` is called on the containing `realm`. - An invalidated results collection can be accessed, but will always be empty. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -#pragma mark - Accessing Objects from an RLMResults - -/** - Returns the object at the index specified. - - @param index The index to look up. - - @return An object of the type contained in the results collection. - */ -- (RLMObjectType)objectAtIndex:(NSUInteger)index; - -/** - Returns an array containing the objects in the results at the indexes specified by a given index set. - `nil` will be returned if the index set contains an index out of the arrays bounds. - - @param indexes The indexes in the results to retrieve objects from. - - @return The objects at the specified indexes. - */ -- (nullable NSArray *)objectsAtIndexes:(NSIndexSet *)indexes; - -/** - Returns the first object in the results collection. - - Returns `nil` if called on an empty results collection. - - @return An object of the type contained in the results collection. - */ -- (nullable RLMObjectType)firstObject; - -/** - Returns the last object in the results collection. - - Returns `nil` if called on an empty results collection. - - @return An object of the type contained in the results collection. - */ -- (nullable RLMObjectType)lastObject; - -#pragma mark - Querying Results - -/** - Returns the index of an object in the results collection. - - Returns `NSNotFound` if the object is not found in the results collection. - - @param object An object (of the same type as returned from the `objectClassName` selector). - */ -- (NSUInteger)indexOfObject:(RLMObjectType)object; - -/** - Returns the index of the first object in the results collection matching the predicate. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return The index of the object, or `NSNotFound` if the object is not found in the results collection. - */ -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns the index of the first object in the results collection matching the predicate. - - @param predicate The predicate with which to filter the objects. - - @return The index of the object, or `NSNotFound` if the object is not found in the results collection. - */ -- (NSUInteger)indexOfObjectWithPredicate:(NSPredicate *)predicate; - -/** - Returns all the objects matching the given predicate in the results collection. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` of objects that match the given predicate. - */ -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all the objects matching the given predicate in the results collection. - - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` of objects that match the given predicate. - */ -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/** - Returns a sorted `RLMResults` from an existing results collection. - - @param keyPath The key path to sort by. - @param ascending The direction to sort in. - - @return An `RLMResults` sorted by the specified key path. - */ -- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a sorted `RLMResults` from an existing results collection. - - @param properties An array of `RLMSortDescriptor`s to sort by. - - @return An `RLMResults` sorted by the specified properties. - */ -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/** - Returns a distinct `RLMResults` from an existing results collection. - - @param keyPaths The key paths used produce distinct results - - @return An `RLMResults` made distinct based on the specified key paths - */ -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -#pragma mark - Notifications - -/** - Registers a block to be called each time the results collection changes. - - The block will be asynchronously called with the initial results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the results collection were added, removed or modified. If a - write transaction did not modify any objects in the results collection, - the block is not called at all. See the `RLMCollectionChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - At the time when the block is called, the `RLMResults` object will be fully - evaluated and up-to-date, and as long as you do not perform a write transaction - on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will - never perform blocking work. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - NSLog(@"dogs.count: %zu", dogs.count); // => 0 - self.token = [results addNotificationBlock:^(RLMResults *dogs, - RLMCollectionChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - - @param block The block to be called whenever a change occurs. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the results collection changes. - - The block will be asynchronously called with the initial results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the results collection were added, removed or modified. If a - write transaction did not modify any objects in the results collection, - the block is not called at all. See the `RLMCollectionChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - At the time when the block is called, the `RLMResults` object will be fully - evaluated and up-to-date, and as long as you do not perform a write transaction - on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will - never perform blocking work. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the results collection changes. - - The block will be asynchronously called with the initial results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the results collection were added, removed or modified. If a - write transaction did not modify any objects in the results collection, - the block is not called at all. See the `RLMCollectionChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - At the time when the block is called, the `RLMResults` object will be fully - evaluated and up-to-date, and as long as you do not perform a write transaction - on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will - never perform blocking work. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the results collection changes. - - The block will be asynchronously called with the initial results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the results collection were added, removed or modified. If a - write transaction did not modify any objects in the results collection, - the block is not called at all. See the `RLMCollectionChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - At the time when the block is called, the `RLMResults` object will be fully - evaluated and up-to-date, and as long as you do not perform a write transaction - on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will - never perform blocking work. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths -__attribute__((warn_unused_result)); -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the objects - represented by the results collection. - - NSNumber *min = [results minOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose minimum value is desired. Only properties of types `int`, `float`, `double`, and - `NSDate` are supported. - - @return The minimum value of the property, or `nil` if the Results are empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects represented by the results collection. - - NSNumber *max = [results maxOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose maximum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The maximum value of the property, or `nil` if the Results are empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of the values of a given property over all the objects represented by the results collection. - - NSNumber *sum = [results sumOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose values should be summed. Only properties of - types `int`, `float`, and `double` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects represented by the results collection. - - NSNumber *average = [results averageOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose average value should be calculated. Only - properties of types `int`, `float`, and `double` are supported. - - @return The average value of the given property, or `nil` if the Results are empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -/// :nodoc: -- (RLMObjectType)objectAtIndexedSubscript:(NSUInteger)index; - -#pragma mark - Sectioned Results - -/** - Sorts and sections this collection from a given property key path, returning the result - as an instance of `RLMSectionedResults`. - - @param keyPath The property key path to sort on. - @param ascending The direction to sort in. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsSortedUsingKeyPath:(NSString *)keyPath - ascending:(BOOL)ascending - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -/** - Sorts and sections this collection from a given array of sort descriptors, returning the result - as an instance of `RLMSectionedResults`. - - @param sortDescriptors An array of `RLMSortDescriptor`s to sort by. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @note The primary sort descriptor must be responsible for determining the section key. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsUsingSortDescriptors:(NSArray *)sortDescriptors - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -#pragma mark - Freeze - -/** - Indicates if the result are frozen. - - Frozen Results are immutable and can be accessed from any thread.The objects - read from a frozen Results will also be frozen. - */ -@property (nonatomic, readonly, getter=isFrozen) BOOL frozen; - -/** - Returns a frozen (immutable) snapshot of these results. - - The frozen copy is an immutable collection which contains the same data as - this collection currently contains, but will not update when writes are made - to the containing Realm. Unlike live Results, frozen Results can be accessed - from any thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning Holding onto a frozen collection for an extended period while - performing write transaction on the Realm may result in the Realm - file growing to large sizes. See - `RLMRealmConfiguration.maximumNumberOfActiveVersions` for more - information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -#pragma mark - Unavailable Methods - -/** - `-[RLMResults init]` is not available because `RLMResults` cannot be created directly. - `RLMResults` can be obtained by querying a Realm. - */ -- (instancetype)init __attribute__((unavailable("RLMResults cannot be created directly"))); - -/** - `+[RLMResults new]` is not available because `RLMResults` cannot be created directly. - `RLMResults` can be obtained by querying a Realm. - */ -+ (instancetype)new __attribute__((unavailable("RLMResults cannot be created directly"))); - -@end - -/** - `RLMLinkingObjects` is an auto-updating container type. It represents a collection of objects that link to its - parent object. - - For more information, please see the "Inverse Relationships" section in the - [documentation](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/relationships/#relationships). - */ -@interface RLMLinkingObjects : RLMResults -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMSchema.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMSchema.h deleted file mode 100644 index fe46f6d47..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMSchema.h +++ /dev/null @@ -1,78 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectSchema; - -/** - `RLMSchema` instances represent collections of model object schemas managed by a Realm. - - When using Realm, `RLMSchema` instances allow performing migrations and - introspecting the database's schema. - - Schemas map to collections of tables in the core database. - */ -RLM_SWIFT_SENDABLE // not actually immutable, but the public API kinda is -@interface RLMSchema : NSObject - -#pragma mark - Properties - -/** - An `NSArray` containing `RLMObjectSchema`s for all object types in the Realm. - - This property is intended to be used during migrations for dynamic introspection. - - @see `RLMObjectSchema` - */ -@property (nonatomic, readonly, copy) NSArray *objectSchema; - -#pragma mark - Methods - -/** - Returns an `RLMObjectSchema` for the given class name in the schema. - - @param className The object class name. - @return An `RLMObjectSchema` for the given class in the schema. - - @see `RLMObjectSchema` - */ -- (nullable RLMObjectSchema *)schemaForClassName:(NSString *)className; - -/** - Looks up and returns an `RLMObjectSchema` for the given class name in the Realm. - - If there is no object of type `className` in the schema, an exception will be thrown. - - @param className The object class name. - @return An `RLMObjectSchema` for the given class in this Realm. - - @see `RLMObjectSchema` - */ -- (RLMObjectSchema *)objectForKeyedSubscript:(NSString *)className; - -/** - Returns whether two `RLMSchema` instances are equivalent. - */ -- (BOOL)isEqualToSchema:(RLMSchema *)schema; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMSectionedResults.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMSectionedResults.h deleted file mode 100644 index 4ee236b94..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMSectionedResults.h +++ /dev/null @@ -1,921 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2022 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@protocol RLMValue; -@class RLMResults; - -/** - A `RLMSectionedResultsChange` object encapsulates information about changes to sectioned - results that are reported by Realm notifications. - - `RLMSectionedResultsChange` is passed to the notification blocks registered with - `-addNotificationBlock` on `RLMSectionedResults`, and reports what sections and rows in the - collection changed since the last time the notification block was called. - - A complete example of updating a `UITableView` named `tv`: - - [tv beginUpdates]; - [tv deleteRowsAtIndexPaths:changes.deletions withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv insertRowsAtIndexPaths:changes.insertions withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv reloadRowsAtIndexPaths:changes.modifications withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv insertSections:changes.sectionsToInsert withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv deleteSections:changes.sectionsToRemove withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv endUpdates]; - - All of the arrays in an `RLMSectionedResultsChange` are always sorted in ascending order. - */ -@interface RLMSectionedResultsChange : NSObject -/// The index paths of objects in the previous version of the collection which have -/// been removed from this one. -@property (nonatomic, readonly) NSArray *deletions; -/// The index paths in the new version of the collection which were newly inserted. -@property (nonatomic, readonly) NSArray *insertions; -/// The index paths in the old version of the collection which were modified. -@property (nonatomic, readonly) NSArray *modifications; -/// The indices of the sections to be inserted. -@property (nonatomic, readonly) NSIndexSet *sectionsToInsert; -/// The indices of the sections to be removed. -@property (nonatomic, readonly) NSIndexSet *sectionsToRemove; -/// Returns the index paths of the deletion indices in the given section. -- (NSArray *)deletionsInSection:(NSUInteger)section; -/// Returns the index paths of the insertion indices in the given section. -- (NSArray *)insertionsInSection:(NSUInteger)section; -/// Returns the index paths of the modification indices in the given section. -- (NSArray *)modificationsInSection:(NSUInteger)section; -@end - - -/// The `RLMSectionedResult` protocol defines properties and methods common to both `RLMSectionedResults and RLMSection` -@protocol RLMSectionedResult - -#pragma mark - Object Access - -/// The count of objects in the collection. -@property (nonatomic, readonly) NSUInteger count; -/// Returns the object for a given index in the collection. -- (id)objectAtIndexedSubscript:(NSUInteger)index; -/// Returns the object for a given index in the collection. -- (id)objectAtIndex:(NSUInteger)index; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this collection. - - The frozen copy is an immutable collection which contains the same data as this - collection currently contains, but will not update when writes are made to the - containing Realm. Unlike live arrays, frozen collections can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning Holding onto a frozen collection for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; -/** - Indicates if the underlying collection is frozen. - - Frozen collections are immutable and can be accessed from any thread. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Sectioned Results Notifications - -/** - Registers a block to be called each time the collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` / `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(id, RLMSectionedResultsChange *))block __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` / `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(id, RLMSectionedResultsChange *))block - queue:(dispatch_queue_t)queue __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` / `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(id, RLMSectionedResultsChange *))block - keyPaths:(NSArray *)keyPaths __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` / `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(id, RLMSectionedResultsChange *))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue __attribute__((warn_unused_result)); - -@end - -/// An RLMSection contains the objects which belong to a specified section key. -@interface RLMSection, RLMObjectType> : NSObject -/// The value that represents the key in this section. -@property (nonatomic, readonly) RLMKeyType key; -/// The count of objects in the section. -@property (nonatomic, readonly) NSUInteger count; -/// Returns the object for a given index in the section. -- (RLMObjectType)objectAtIndexedSubscript:(NSUInteger)index; -/// Returns the object for a given index in the section. -- (RLMObjectType)objectAtIndex:(NSUInteger)index; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this section. - - The frozen copy is an immutable section which contains the same data as this - section currently contains, but will not update when writes are made to the - containing Realm. Unlike live arrays, frozen collections can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning Holding onto a frozen section for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; -/** - Returns a live version of this frozen section. - - This method resolves a reference to a live copy of the same frozen section. - If called on a live section, will return itself. -*/ -- (instancetype)thaw; -/** - Indicates if the underlying section is frozen. - - Frozen sections are immutable and can be accessed from any thread. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Section Notifications - -/** - Registers a block to be called each time the section changes. - - The block will be asynchronously called with the initial section, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - RLMSection *section = sectionedResults[0] // section with dogs aged '5' already exists. - - self.token = [section addNotificationBlock:^(RLMSection *section, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"section.count: %zu", section.count); // => 2 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSection *, RLMSectionedResultsChange *))block __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the section changes. - - The block will be asynchronously called with the initial section, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - RLMSection *section = sectionedResults[0] // section with dogs aged '5' already exists. - - self.token = [section addNotificationBlock:^(RLMSection *section, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"section.count: %zu", section.count); // => 2 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSection *, RLMSectionedResultsChange *))block - queue:(dispatch_queue_t)queue __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the section changes. - - The block will be asynchronously called with the initial section, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - RLMSection *section = sectionedResults[0] // section with dogs aged '5' already exists. - - self.token = [section addNotificationBlock:^(RLMSection *section, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"section.count: %zu", section.count); // => 2 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSection *, RLMSectionedResultsChange *))block - keyPaths:(NSArray *)keyPaths __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the section changes. - - The block will be asynchronously called with the initial section, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - RLMSection *section = sectionedResults[0] // section with dogs aged '5' already exists. - - self.token = [section addNotificationBlock:^(RLMSection *section, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"section.count: %zu", section.count); // => 2 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSection *, RLMSectionedResultsChange *))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue __attribute__((warn_unused_result)); -@end - -/// A lazily evaluated collection that holds elements in sections determined by a section key. -@interface RLMSectionedResults, RLMObjectType: id> : NSObject -/// An array of all keys in the sectioned results collection. -@property (nonatomic) NSArray *allKeys; -/// The total amount of sections in this collection. -@property (nonatomic, readonly, assign) NSUInteger count; -/// Returns the section at a given index. -- (RLMSection *)objectAtIndexedSubscript:(NSUInteger)index; -/// Returns the section at a given index. -- (RLMSection *)objectAtIndex:(NSUInteger)index; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this sectioned results collection. - - The frozen copy is an immutable sectioned results collection which contains the same data as this - sectioned results collection currently contains, but will not update when writes are made to the - containing Realm. Unlike live sectioned results collections, frozen sectioned results collection - can be accessed from any thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning Holding onto a frozen sectioned results collection for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; -/** - Returns a live version of this frozen sectioned results collection. - - This method resolves a reference to a live copy of the same frozen sectioned results collection. - If called on a live section, will return itself. -*/ -- (instancetype)thaw; -/** - Indicates if the underlying sectioned results collection is frozen. - - Frozen sectioned results collections are immutable and can be accessed from any thread. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Sectioned Results Notifications - -/** - Registers a block to be called each time the sectioned results collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSectionedResults *, RLMSectionedResultsChange *))block __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the sectioned results collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSectionedResults *, RLMSectionedResultsChange *))block - queue:(dispatch_queue_t)queue __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the sectioned results collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSectionedResults *, RLMSectionedResultsChange *))block - keyPaths:(NSArray *)keyPaths __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the sectioned results collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSectionedResults *, RLMSectionedResultsChange *))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue __attribute__((warn_unused_result)); -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMSet.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMSet.h deleted file mode 100644 index fead2e005..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMSet.h +++ /dev/null @@ -1,535 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObject, RLMResults; - -/** - A collection datatype used for storing distinct objects. - - - Note: - `RLMSet` supports storing primitive and `RLMObject` types. `RLMSet` does not support storing - Embedded Realm Objects. - */ -@interface RLMSet : NSObject - -#pragma mark - Properties - -/** - The number of objects in the set. - */ -@property (nonatomic, readonly, assign) NSUInteger count; - -/** - The type of the objects in the set. - */ -@property (nonatomic, readonly, assign) RLMPropertyType type; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readonly, getter = isOptional) BOOL optional; - -/** - The objects in the RLMSet as an NSArray value. - */ -@property (nonatomic, readonly) NSArray *allObjects; - -/** - The class name of the objects contained in the set. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages the set. Returns `nil` for unmanaged set. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - Indicates if the set can no longer be accessed. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if the set is frozen. - - Frozen sets are immutable and can be accessed from any thread. Frozen sets - are created by calling `-freeze` on a managed live set. Unmanaged sets are - never frozen. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Adding, Removing, and Replacing Objects in a Set - -/** - Adds an object to the set if it is not already present. - - @warning This method may only be called during a write transaction. - - @param object An object of the type contained in the set. - */ -- (void)addObject:(RLMObjectType)object; - -/** - Adds an array of distinct objects to the set. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable object such as `NSArray`, `NSSet` or `RLMResults` which contains objects of the - same class as the set. - */ -- (void)addObjects:(id)objects; - -/** - Removes a given object from the set. - - @warning This method may only be called during a write transaction. - - @param object The object in the set that you want to remove. - */ -- (void)removeObject:(RLMObjectType)object; - -/** - Removes all objects from the set. - - @warning This method may only be called during a write transaction. - */ -- (void)removeAllObjects; - -/** - Empties the receiving set, then adds each object contained in another given set. - - @warning This method may only be called during a write transaction. - - @param set The RLMSet whose members replace the receiving set's content. - */ -- (void)setSet:(RLMSet *)set; - -/** - Removes from the receiving set each object that isn’t a member of another given set. - - @warning This method may only be called during a write transaction. - - @param set The RLMSet with which to perform the intersection. - */ -- (void)intersectSet:(RLMSet *)set; - -/** - Removes each object in another given set from the receiving set, if present. - - @warning This method may only be called during a write transaction. - - @param set The set of objects to remove from the receiving set. - */ -- (void)minusSet:(RLMSet *)set; - -/** - Adds each object in another given set to the receiving set, if not present. - - @warning This method may only be called during a write transaction. - - @param set The set of objects to add to the receiving set. - */ -- (void)unionSet:(RLMSet *)set; - -#pragma mark - Querying a Set - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/// :nodoc: -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/// :nodoc: -- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/// :nodoc: -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/// :nodoc: -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -/** - Returns a Boolean value that indicates whether at least one object in the receiving set is also present in another given set. - - @param set The RLMSet to compare the receiving set to. - - @return YES if at least one object in the receiving set is also present in otherSet, otherwise NO. - */ -- (BOOL)intersectsSet:(RLMSet *)set; - -/** - Returns a Boolean value that indicates whether every object in the receiving set is also present in another given set. - - @param set The RLMSet to compare the receiving set to. - - @return YES if every object in the receiving set is also present in otherSet, otherwise NO. - */ -- (BOOL)isSubsetOfSet:(RLMSet *)set; - -/** - Returns a Boolean value that indicates whether a given object is present in the set. - - @param anObject An object to look for in the set. - - @return YES if anObject is present in the set, otherwise NO. - */ -- (BOOL)containsObject:(RLMObjectType)anObject; - -/** - Compares the receiving set to another set. - - @param otherSet The set with which to compare the receiving set. - - @return YES if the contents of otherSet are equal to the contents of the receiving set, otherwise NO. - */ -- (BOOL)isEqualToSet:(RLMSet *)otherSet; - -#pragma mark - Sectioning a Set - -/** - Sorts and sections this collection from a given property key path, returning the result - as an instance of `RLMSectionedResults`. - - @param keyPath The property key path to sort on. - @param ascending The direction to sort in. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsSortedUsingKeyPath:(NSString *)keyPath - ascending:(BOOL)ascending - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -/** - Sorts and sections this collection from a given array of sort descriptors, returning the result - as an instance of `RLMSectionedResults`. - - @param sortDescriptors An array of `RLMSortDescriptor`s to sort by. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @note The primary sort descriptor must be responsible for determining the section key. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsUsingSortDescriptors:(NSArray *)sortDescriptors - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - - -#pragma mark - Notifications - -/** - Registers a block to be called each time the set changes. - - The block will be asynchronously called with the initial set, and then - called again after each write transaction which changes any of the objects in - the set, which objects are in the results, or the order of the objects in the - set. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the set were added, removed or modified. If a write transaction - did not modify any objects in the set, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - Person *person = [[Person allObjectsInRealm:realm] firstObject]; - NSLog(@"person.dogs.count: %zu", person.dogs.count); // => 0 - self.token = [person.dogs addNotificationBlock(RLMSet *dogs, - RLMCollectionChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count) // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - [person.dogs addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a non-frozen managed set. - - @param block The block to be called each time the set changes. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSet *_Nullable set, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the set changes. - - The block will be asynchronously called with the initial set, and then - called again after each write transaction which changes any of the objects in - the set, which objects are in the results, or the order of the objects in the - set. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the set were added, removed or modified. If a write transaction - did not modify any objects in the set, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSet *_Nullable set, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the set changes. - - The block will be asynchronously called with the initial set, and then - called again after each write transaction which changes any of the objects in - the set, which objects are in the results, or the order of the objects in the - set. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the set were added, removed or modified. If a write transaction - did not modify any objects in the set, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSet *_Nullable set, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the set changes. - - The block will be asynchronously called with the initial set, and then - called again after each write transaction which changes any of the objects in - the set, which objects are in the results, or the order of the objects in the - set. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the set were added, removed or modified. If a write transaction - did not modify any objects in the set, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSet *_Nullable set, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths -__attribute__((warn_unused_result)); - -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the objects in the set. - - NSNumber *min = [object.setProperty minOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, `RLMSet`, and `NSData` properties. - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The minimum value of the property, or `nil` if the set is empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects in the set. - - NSNumber *max = [object.setProperty maxOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, `RLMSet`, and `NSData` properties. - - @param property The property whose maximum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The maximum value of the property, or `nil` if the set is empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of distinct values of a given property over all the objects in the set. - - NSNumber *sum = [object.setProperty sumOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, `RLMSet and `NSData` properties. - - @param property The property whose values should be summed. Only properties of - types `int`, `float`, and `double` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects in the set. - - NSNumber *average = [object.setProperty averageOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMSet`, `RLMArray`, and `NSData` properties. - - @param property The property whose average value should be calculated. Only - properties of types `int`, `float`, and `double` are supported. - - @return The average value of the given property, or `nil` if the set is empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this set. - - The frozen copy is an immutable set which contains the same data as this - et currently contains, but will not update when writes are made to the - containing Realm. Unlike live sets, frozen sets can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a managed set. - @warning Holding onto a frozen set for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -#pragma mark - Unavailable Methods - -/** - `-[RLMSet init]` is not available because `RLMSet`s cannot be created directly. - ``RLMSet` properties on `RLMObject`s are lazily created when accessed. - */ -- (instancetype)init __attribute__((unavailable("RLMSets cannot be created directly"))); - -/** - `+[RLMSet new]` is not available because `RLMSet`s cannot be created directly. - `RLMSet` properties on `RLMObject`s are lazily created when accessed. - */ -+ (instancetype)new __attribute__((unavailable("RLMSet cannot be created directly"))); - -@end - -/// :nodoc: -@interface RLMSet (Swift) -// for use only in Swift class definitions -- (instancetype)initWithObjectClassName:(NSString *)objectClassName; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMSwiftObject.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMSwiftObject.h deleted file mode 100644 index 7ea764016..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMSwiftObject.h +++ /dev/null @@ -1,142 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) -/** - `Object` is a class used to define Realm model objects. - - In Realm you define your model classes by subclassing `Object` and adding properties to be managed. - You then instantiate and use your custom subclasses instead of using the `Object` class directly. - - ```swift - class Dog: Object { - @objc dynamic var name: String = "" - @objc dynamic var adopted: Bool = false - let siblings = List() - } - ``` - - ### Supported property types - - - `String`, `NSString` - - `Int` - - `Int8`, `Int16`, `Int32`, `Int64` - - `Float` - - `Double` - - `Bool` - - `Date`, `NSDate` - - `Data`, `NSData` - - `Decimal128` - - `ObjectId` - - `@objc enum` which has been delcared as conforming to `RealmEnum`. - - `RealmOptional` for optional numeric properties - - `Object` subclasses, to model many-to-one relationships - - `EmbeddedObject` subclasses, to model owning one-to-one relationships - - `List`, to model many-to-many relationships - - `String`, `NSString`, `Date`, `NSDate`, `Data`, `NSData`, `Decimal128`, and `ObjectId` properties - can be declared as optional. `Object` and `EmbeddedObject` subclasses *must* be declared as optional. - `Int`, `Int8`, `Int16`, `Int32`, `Int64`, `Float`, `Double`, `Bool`, enum, and `List` properties cannot. - To store an optional number, use `RealmOptional`, `RealmOptional`, `RealmOptional`, or - `RealmOptional` instead, which wraps an optional numeric value. Lists cannot be optional at all. - - All property types except for `List` and `RealmOptional` *must* be declared as `@objc dynamic var`. `List` and - `RealmOptional` properties must be declared as non-dynamic `let` properties. Swift `lazy` properties are not allowed. - - Note that none of the restrictions listed above apply to properties that are configured to be ignored by Realm. - - ### Querying - - You can retrieve all objects of a given type from a Realm by calling the `objects(_:)` instance method. - - ### Relationships - - See our [Objective-C guide](https://docs.mongodb.com/realm/sdk/swift/fundamentals/relationships/) for more details. - */ -@interface RealmSwiftObject : RLMObjectBase -@end - -/** - `EmbeddedObject` is a base class used to define embedded Realm model objects. - - Embedded objects work similarly to normal objects, but are owned by a single - parent Object (which itself may be embedded). Unlike normal top-level objects, - embedded objects cannot be directly created in or added to a Realm. Instead, - they can only be created as part of a parent object, or by assigning an - unmanaged object to a parent object's property. Embedded objects are - automatically deleted when the parent object is deleted or when the parent is - modified to no longer point at the embedded object, either by reassigning an - Object property or by removing the embedded object from the List containing it. - - Embedded objects can only ever have a single parent object which links to - them, and attempting to link to an existing managed embedded object will throw - an exception. - - The property types supported on `EmbeddedObject` are the same as for `Object`, - except for that embedded objects cannot link to top-level objects, so `Object` - and `List` properties are not supported (`EmbeddedObject` and - `List` *are*). - - Embedded objects cannot have primary keys or indexed properties. - - ```swift - class Owner: Object { - @objc dynamic var name: String = "" - let dogs = List() - } - class Dog: EmbeddedObject { - @objc dynamic var name: String = "" - @objc dynamic var adopted: Bool = false - let owner = LinkingObjects(fromType: Owner.self, property: "dogs") - } - ``` - */ -@interface RealmSwiftEmbeddedObject : RLMObjectBase -@end - -/** - `AsymmetricObject` is a base class used to define asymmetric Realm objects. - - Asymmetric objects can only be created using the `create(_ object:)` - function, and cannot be added, removed or queried. - When created, asymmetric objects will be synced unidirectionally to the MongoDB - database and cannot be accessed locally. - - Incoming links from any asymmetric table are not allowed, meaning embedding - an asymmetric object within an `Object` will throw an error. - - The property types supported on `AsymmetricObject` are the same as for `Object`, - except for that asymmetric objects can only link to embedded objects, so `Object` - and `List` properties are not supported (`EmbeddedObject` and - `List` *are*). - - ```swift - class Person: AsymmetricObject { - @Persisted(primaryKey: true) var _id: ObjectId = ObjectId.generate() - @Persisted var name: String - @Persisted var age: Int - } - ``` - */ -@interface RealmSwiftAsymmetricObject : RLMObjectBase -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMSwiftProperty.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMSwiftProperty.h deleted file mode 100644 index ea071927c..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMSwiftProperty.h +++ /dev/null @@ -1,71 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -@class RLMObjectBase, RLMArray, RLMSet; - -#ifdef __cplusplus -extern "C" { -#endif - -RLM_HEADER_AUDIT_BEGIN(nullability) - -#define REALM_FOR_EACH_SWIFT_PRIMITIVE_TYPE(macro) \ - macro(bool, Bool, bool) \ - macro(double, Double, double) \ - macro(float, Float, float) \ - macro(int64_t, Int64, int) - -#define REALM_FOR_EACH_SWIFT_OBJECT_TYPE(macro) \ - macro(NSString, String, string) \ - macro(NSDate, Date, date) \ - macro(NSData, Data, data) \ - macro(NSUUID, UUID, uuid) \ - macro(RLMDecimal128, Decimal128, decimal128) \ - macro(RLMObjectId, ObjectId, objectId) - -#define REALM_SWIFT_PROPERTY_ACCESSOR(objc, swift, rlmtype) \ - objc RLMGetSwiftProperty##swift(RLMObjectBase *, uint16_t); \ - objc RLMGetSwiftProperty##swift##Optional(RLMObjectBase *, uint16_t, bool *); \ - void RLMSetSwiftProperty##swift(RLMObjectBase *, uint16_t, objc); -REALM_FOR_EACH_SWIFT_PRIMITIVE_TYPE(REALM_SWIFT_PROPERTY_ACCESSOR) -#undef REALM_SWIFT_PROPERTY_ACCESSOR - -#define REALM_SWIFT_PROPERTY_ACCESSOR(objc, swift, rlmtype) \ - objc *_Nullable RLMGetSwiftProperty##swift(RLMObjectBase *, uint16_t); \ - void RLMSetSwiftProperty##swift(RLMObjectBase *, uint16_t, objc *_Nullable); -REALM_FOR_EACH_SWIFT_OBJECT_TYPE(REALM_SWIFT_PROPERTY_ACCESSOR) -#undef REALM_SWIFT_PROPERTY_ACCESSOR - -id _Nullable RLMGetSwiftPropertyAny(RLMObjectBase *, uint16_t); -void RLMSetSwiftPropertyAny(RLMObjectBase *, uint16_t, id); -RLMObjectBase *_Nullable RLMGetSwiftPropertyObject(RLMObjectBase *, uint16_t); -void RLMSetSwiftPropertyNil(RLMObjectBase *, uint16_t); -void RLMSetSwiftPropertyObject(RLMObjectBase *, uint16_t, RLMObjectBase *_Nullable); - -RLMArray *_Nonnull RLMGetSwiftPropertyArray(RLMObjectBase *obj, uint16_t); -RLMSet *_Nonnull RLMGetSwiftPropertySet(RLMObjectBase *obj, uint16_t); -RLMDictionary *_Nonnull RLMGetSwiftPropertyMap(RLMObjectBase *obj, uint16_t); - -RLM_HEADER_AUDIT_END(nullability) - -#ifdef __cplusplus -} // extern "C" -#endif diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMSyncConfiguration.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMSyncConfiguration.h deleted file mode 100644 index 54ea2ecfc..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMSyncConfiguration.h +++ /dev/null @@ -1,196 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -@class RLMApp; -@class RLMRealm; -@class RLMRealmConfiguration; -@class RLMUser; -@protocol RLMBSON; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** Determines file behavior during a client reset. - - @see: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ -*/ -typedef NS_ENUM(NSUInteger, RLMClientResetMode) { - /// The local copy of the Realm is copied into a recovery - /// directory for safekeeping, and then deleted from the original location. The next time - /// the Realm for that partition value is opened, the Realm will automatically be re-downloaded from - /// Atlas App Services, and can be used as normal. - - /// Data written to the Realm after the local copy of the Realm diverged from the backup - /// remote copy will be present in the local recovery copy of the Realm file. The - /// re-downloaded Realm will initially contain only the data present at the time the Realm - /// was backed up on the server. - /// - /// @see: ``rlmSync_clientResetBackedUpRealmPath`` and ``RLMSyncErrorActionToken`` for more information on accessing the recovery directory and error information. - /// - /// The manual client reset mode handler can be set in two places: - /// 1. As an ErrorReportingBlock argument at ``RLMSyncConfiguration.manualClientResetHandler``. - /// 2. As an ErrorReportingBlock in the ``RLMSyncManager.errorHandler`` property. - /// @see: ``RLMSyncManager.errorHandler`` - /// - /// When an ``RLMSyncErrorClientResetError`` is thrown, the following rules determine which block is executed: - /// - If an error reporting block is set in ``.manualClientResetHandler`` and the ``RLMSyncManager.errorHandler``, the ``.manualClientResetHandler`` block will be executed. - /// - If an error reporting block is set in either the ``.manualClientResetHandler`` or the ``RLMSyncManager``, but not both, the single block will execute. - /// - If no block is set in either location, the client reset will not be handled. The application will likely need to be restarted and unsynced local changes may be lost. - /// @note: The ``RLMSyncManager.errorHandler`` is still invoked under all ``RLMSyncError``s *other than* ``RLMSyncErrorClientResetError``. - /// @see ``RLMSyncError`` for an exhaustive list. - RLMClientResetModeManual = 0, - /// All unsynchronized local changes are automatically discarded and the local state is - /// automatically reverted to the most recent state from the server. Unsynchronized changes - /// can then be recovered in the post-client-reset callback block. - /// - /// If ``RLMClientResetModeDiscardLocal`` is enabled but the client reset operation is unable to complete - /// then the client reset process reverts to manual mode. Example) During a destructive schema change this - /// mode will fail and invoke the manual client reset handler. - /// - /// The RLMClientResetModeDiscardLocal mode supports two client reset callbacks -- ``RLMClientResetBeforeBlock``, ``RLMClientResetAfterBlock`` -- which can be passed as arguments when creating the ``RLMSyncConfiguration``. - /// @see: ``RLMClientResetAfterBlock`` and ``RLMClientResetBeforeBlock`` - RLMClientResetModeDiscardLocal __deprecated_enum_msg("Use RLMClientResetModeDiscardUnsyncedChanges") = 1, - /// All unsynchronized local changes are automatically discarded and the local state is - /// automatically reverted to the most recent state from the server. Unsynchronized changes - /// can then be recovered in the post-client-reset callback block. - /// - /// If ``RLMClientResetModeDiscardUnsyncedChanges`` is enabled but the client reset operation is unable to complete - /// then the client reset process reverts to manual mode. Example) During a destructive schema change this - /// mode will fail and invoke the manual client reset handler. - /// - /// The RLMClientResetModeDiscardUnsyncedChanges mode supports two client reset callbacks -- ``RLMClientResetBeforeBlock``, ``RLMClientResetAfterBlock`` -- which can be passed as arguments when creating the ``RLMSyncConfiguration``. - /// @see: ``RLMClientResetAfterBlock`` and ``RLMClientResetBeforeBlock`` - RLMClientResetModeDiscardUnsyncedChanges = 1, - /// The client device will download a realm realm which reflects the latest - /// state of the server after a client reset. A recovery process is run locally in - /// an attempt to integrate the server version with any local changes from - /// before the client reset occurred. - /// - /// The changes are integrated with the following rules: - /// 1. Objects created locally that were not synced before client reset will be integrated. - /// 2. If an object has been deleted on the server, but was modified on the client, the delete takes precedence and the update is discarded - /// 3. If an object was deleted on the client, but not the server, then the client delete instruction is applied. - /// 4. In the case of conflicting updates to the same field, the client update is applied. - /// - /// If the recovery integration fails, the client reset process falls back to ``RLMClientResetModeManual``. - /// The recovery integration will fail if the "Client Recovery" setting is not enabled on the server. - /// Integration may also fail in the event of an incompatible schema change. - /// - /// The RLMClientResetModeRecoverUnsyncedChanges mode supports two client reset callbacks -- ``RLMClientResetBeforeBlock``, ``RLMClientResetAfterBlock`` -- which can be passed as arguments when creating the ``RLMSyncConfiguration``. - /// @see: ``RLMClientResetAfterBlock`` and ``RLMClientResetBeforeBlock`` - RLMClientResetModeRecoverUnsyncedChanges = 2, - /// The client device will download a realm with objects reflecting the latest version of the server. A recovery - /// process is run locally in an attempt to integrate the server version with any local changes from before the - /// client reset occurred. - /// - /// The changes are integrated with the following rules: - /// 1. Objects created locally that were not synced before client reset will be integrated. - /// 2. If an object has been deleted on the server, but was modified on the client, the delete takes precedence and the update is discarded - /// 3. If an object was deleted on the client, but not the server, then the client delete instruction is applied. - /// 4. In the case of conflicting updates to the same field, the client update is applied. - /// - /// If the recovery integration fails, the client reset process falls back to ``RLMClientResetModeDiscardUnsyncedChanges``. - /// The recovery integration will fail if the "Client Recovery" setting is not enabled on the server. - /// Integration may also fail in the event of an incompatible schema change. - /// - /// The RLMClientResetModeRecoverOrDiscardUnsyncedChanges mode supports two client reset callbacks -- ``RLMClientResetBeforeBlock``, ``RLMClientResetAfterBlock`` -- which can be passed as arguments when creating the ``RLMSyncConfiguration``. - /// @see: ``RLMClientResetAfterBlock`` and ``RLMClientResetBeforeBlock`` - RLMClientResetModeRecoverOrDiscardUnsyncedChanges = 3 -}; - -/** - A block type used to report before a client reset will occur. - The `beforeFrozen` is a frozen copy of the local state prior to client reset. - */ -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMClientResetBeforeBlock)(RLMRealm * _Nonnull beforeFrozen); - -/** - A block type used to report after a client reset occurred. - The `beforeFrozen` argument is a frozen copy of the local state prior to client reset. - The `after` argument contains the local database state after the client reset occurred. - */ -RLM_SWIFT_SENDABLE // invoked on a backgroun thread -typedef void(^RLMClientResetAfterBlock)(RLMRealm * _Nonnull beforeFrozen, RLMRealm * _Nonnull after); - -/** - A configuration object representing configuration state for a Realm which is intended to sync with a Realm Object - Server. - */ -@interface RLMSyncConfiguration : NSObject - -/// The user to which the remote Realm belongs. -@property (nonatomic, readonly) RLMUser *user; - -/** - The value this Realm is partitioned on. The partition key is a property defined in - Atlas App Services. All classes with a property with this value will be synchronized to the - Realm. - */ -@property (nonatomic, readonly) id partitionValue; - -/** - An enum which determines file recovery behavior in the event of a client reset. - @note: Defaults to `RLMClientResetModeRecoverUnsyncedChanges` - - @see: `RLMClientResetMode` - @see: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ -*/ -@property (nonatomic) RLMClientResetMode clientResetMode; - -/** - A callback which notifies prior to prior to a client reset occurring. - @see: `RLMClientResetBeforeBlock` - */ -@property (nonatomic, nullable) RLMClientResetBeforeBlock beforeClientReset; - -/** - A callback which notifies after a client reset has occurred. - @see: `RLMClientResetAfterBlock` - */ -@property (nonatomic, nullable) RLMClientResetAfterBlock afterClientReset; - -/** - A callback that's executed when an `RLMSyncErrorClientResetError` is encountered. - @See RLMSyncErrorReportingBlock and RLMSyncErrorClientResetError for more - details on handling a client reset manually. - */ -@property (nonatomic, nullable) RLMSyncErrorReportingBlock manualClientResetHandler; - - -/** - Whether nonfatal connection errors should cancel async opens. - - By default, if a nonfatal connection error such as a connection timing out occurs, any currently pending asyncOpen operations will ignore the error and continue to retry until it succeeds. If this is set to true, the open will instead fail and report the error. - - NEXT-MAJOR: This should be true by default. - */ -@property (nonatomic) bool cancelAsyncOpenOnNonFatalErrors; - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("This type cannot be created directly"))); - -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("This type cannot be created directly"))); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMSyncManager.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMSyncManager.h deleted file mode 100644 index 1dee453d0..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMSyncManager.h +++ /dev/null @@ -1,223 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMSyncSession, RLMSyncTimeoutOptions, RLMAppConfiguration; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -// NEXT-MAJOR: This enum needs to be removed when access to the logger is removed -// from the sync manager. -/// An enum representing different levels of sync-related logging that can be configured. -typedef RLM_CLOSED_ENUM(NSUInteger, RLMSyncLogLevel) { - /// Nothing will ever be logged. - RLMSyncLogLevelOff, - /// Only fatal errors will be logged. - RLMSyncLogLevelFatal, - /// Only errors will be logged. - RLMSyncLogLevelError, - /// Warnings and errors will be logged. - RLMSyncLogLevelWarn, - /// Information about sync events will be logged. Fewer events will be logged in order to avoid overhead. - RLMSyncLogLevelInfo, - /// Information about sync events will be logged. More events will be logged than with `RLMSyncLogLevelInfo`. - RLMSyncLogLevelDetail, - /// Log information that can aid in debugging. - /// - /// - warning: Will incur a measurable performance impact. - RLMSyncLogLevelDebug, - /// Log information that can aid in debugging. More events will be logged than with `RLMSyncLogLevelDebug`. - /// - /// - warning: Will incur a measurable performance impact. - RLMSyncLogLevelTrace, - /// Log information that can aid in debugging. More events will be logged than with `RLMSyncLogLevelTrace`. - /// - /// - warning: Will incur a measurable performance impact. - RLMSyncLogLevelAll -}; - -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" -/// A log callback function which can be set on RLMSyncManager. -/// -/// The log function may be called from multiple threads simultaneously, and is -/// responsible for performing its own synchronization if any is required. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void (^RLMSyncLogFunction)(RLMSyncLogLevel level, NSString *message); -#pragma clang diagnostic pop - -/// A block type representing a block which can be used to report a sync-related error to the application. If the error -/// pertains to a specific session, that session will also be passed into the block. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMSyncErrorReportingBlock)(NSError *, RLMSyncSession * _Nullable); - -/** - A manager which serves as a central point for sync-related configuration. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMSyncManager : NSObject - -/** - A block which can optionally be set to report sync-related errors to your application. - - Any error reported through this block will be of the `RLMSyncError` type, and marked - with the `RLMSyncErrorDomain` domain. - - Errors reported through this mechanism are fatal, with several exceptions. Please consult - `RLMSyncError` for information about the types of errors that can be reported through - the block, and for for suggestions on handling recoverable error codes. - - @see `RLMSyncError` - */ -@property (nullable, atomic, copy) RLMSyncErrorReportingBlock errorHandler; - -/// :nodoc: -@property (nonatomic, copy) NSString *appID -__attribute__((deprecated("This property is not used for anything"))); - -/** - A string identifying this application which is included in the User-Agent - header of sync connections. By default, this will be the application's bundle - identifier. - - This property must be set prior to opening a synchronized Realm for the first - time. Any modifications made after opening a Realm will be ignored. - */ -@property (atomic, copy) NSString *userAgent; - -/** - The logging threshold which newly opened synced Realms will use. Defaults to - `RLMSyncLogLevelInfo`. - - By default logging strings are output to Apple System Logger. Set `logger` to - perform custom logging logic instead. - - @warning This property must be set before any synced Realms are opened. Setting it after - opening any synced Realm will do nothing. - */ -@property (atomic) RLMSyncLogLevel logLevel -__attribute__((deprecated("Use `RLMLogger.default.level`/`Logger.shared.level` to set/get the default logger threshold level."))); - -/** - The function which will be invoked whenever the sync client has a log message. - - If nil, log strings are output to Apple System Logger instead. - - @warning This property must be set before any synced Realms are opened. Setting - it after opening any synced Realm will do nothing. - */ -@property (atomic, nullable) RLMSyncLogFunction logger -__attribute__((deprecated("Use `RLMLogger.default`/`Logger.shared` to set/get the default logger."))); - -/** - The name of the HTTP header to send authorization data in when making requests to Atlas App Services which has - been configured to expect a custom authorization header. - */ -@property (nullable, atomic, copy) NSString *authorizationHeaderName; - -/** - Extra HTTP headers to append to every request to Atlas App Services. - - Modifying this property while sync sessions are active will result in all - sessions disconnecting and reconnecting using the new headers. - */ -@property (nullable, atomic, copy) NSDictionary *customRequestHeaders; - -/** - Options for the assorted types of connection timeouts for sync connections. - - If nil default values for all timeouts are used instead. - - @warning This property must be set before any synced Realms are opened. Setting - it after opening any synced Realm will do nothing. - */ -@property (nullable, atomic, copy) RLMSyncTimeoutOptions *timeoutOptions; - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("RLMSyncManager cannot be created directly"))); - -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("RLMSyncManager cannot be created directly"))); - -@end - -/** - Options for configuring timeouts and intervals in the sync client. - */ -@interface RLMSyncTimeoutOptions : NSObject -/// The maximum number of milliseconds to allow for a connection to -/// become fully established. This includes the time to resolve the -/// network address, the TCP connect operation, the SSL handshake, and -/// the WebSocket handshake. -/// -/// Defaults to 2 minutes. -@property (nonatomic) NSUInteger connectTimeout; - -/// The number of milliseconds to keep a connection open after all -/// sessions have been abandoned. -/// -/// After all synchronized Realms have been closed for a given server, the -/// connection is kept open until the linger time has expired to avoid the -/// overhead of reestablishing the connection when Realms are being closed and -/// reopened. -/// -/// Defaults to 30 seconds. -@property (nonatomic) NSUInteger connectionLingerTime; - -/// The number of milliseconds between each heartbeat ping message. -/// -/// The client periodically sends ping messages to the server to check if the -/// connection is still alive. Shorter periods make connection state change -/// notifications more responsive at the cost of battery life (as the antenna -/// will have to wake up more often). -/// -/// Defaults to 1 minute. -@property (nonatomic) NSUInteger pingKeepalivePeriod; - -/// How long in milliseconds to wait for a reponse to a heartbeat ping before -/// concluding that the connection has dropped. -/// -/// Shorter values will make connection state change notifications more -/// responsive as it will only change to `disconnected` after this much time has -/// elapsed, but overly short values may result in spurious disconnection -/// notifications when the server is simply taking a long time to respond. -/// -/// Defaults to 2 minutes. -@property (nonatomic) NSUInteger pongKeepaliveTimeout; - -/// The maximum amount of time, in milliseconds, since the loss of a -/// prior connection, for a new connection to be considered a "fast -/// reconnect". -/// -/// When a client first connects to the server, it defers uploading any local -/// changes until it has downloaded all changesets from the server. This -/// typically reduces the total amount of merging that has to be done, and is -/// particularly beneficial the first time that a specific client ever connects -/// to the server. -/// -/// When an existing client disconnects and then reconnects within the "fact -/// reconnect" time this is skipped and any local changes are uploaded -/// immediately without waiting for downloads, just as if the client was online -/// the whole time. -/// -/// Defaults to 1 minute. -@property (nonatomic) NSUInteger fastReconnectLimit; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMSyncSession.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMSyncSession.h deleted file mode 100644 index 31677ce9c..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMSyncSession.h +++ /dev/null @@ -1,234 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -/** - The current state of the session represented by a session object. - */ -typedef NS_ENUM(NSUInteger, RLMSyncSessionState) { - /// The sync session is actively communicating or attempting to communicate - /// with Atlas App Services. A session is considered Active even if - /// it is not currently connected. Check the connection state instead if you - /// wish to know if the connection is currently online. - RLMSyncSessionStateActive, - /// The sync session is not attempting to communicate with MongoDB - /// Realm due to the user logging out or synchronization being paused. - RLMSyncSessionStateInactive, - /// The sync session encountered a fatal error and is permanently invalid; it should be discarded. - RLMSyncSessionStateInvalid -}; - -/** - The current state of a sync session's connection. Sessions which are not in - the Active state will always be Disconnected. - */ -typedef NS_ENUM(NSUInteger, RLMSyncConnectionState) { - /// The sync session is not connected to the server, and is not attempting - /// to connect, either because the session is inactive or because it is - /// waiting to retry after a failed connection. - RLMSyncConnectionStateDisconnected, - /// The sync session is attempting to connect to Atlas App Services. - RLMSyncConnectionStateConnecting, - /// The sync session is currently connected to Atlas App Services. - RLMSyncConnectionStateConnected, -}; - -/** - The transfer direction (upload or download) tracked by a given progress notification block. - - Progress notification blocks can be registered on sessions if your app wishes to be informed - how many bytes have been uploaded or downloaded, for example to show progress indicator UIs. - */ -typedef RLM_CLOSED_ENUM(NSUInteger, RLMSyncProgressDirection) { - /// For monitoring upload progress. - RLMSyncProgressDirectionUpload, - /// For monitoring download progress. - RLMSyncProgressDirectionDownload, -}; - -/** - The desired behavior of a progress notification block. - - Progress notification blocks can be registered on sessions if your app wishes to be informed - how many bytes have been uploaded or downloaded, for example to show progress indicator UIs. - */ -typedef NS_ENUM(NSUInteger, RLMSyncProgressMode) { - /** - The block will be called indefinitely, or until it is unregistered by calling - `-[RLMProgressNotificationToken invalidate]`. - - Notifications will always report the latest number of transferred bytes, and the - most up-to-date number of total transferrable bytes. - */ - RLMSyncProgressModeReportIndefinitely, - /** - The block will, upon registration, store the total number of bytes - to be transferred. When invoked, it will always report the most up-to-date number - of transferrable bytes out of that original number of transferrable bytes. - - When the number of transferred bytes reaches or exceeds the - number of transferrable bytes, the block will be unregistered. - */ - RLMSyncProgressModeForCurrentlyOutstandingWork, -}; - -@class RLMUser, RLMSyncConfiguration, RLMSyncErrorActionToken, RLMSyncManager; - -/** - The type of a progress notification block intended for reporting a session's network - activity to the user. - - `transferredBytes` refers to the number of bytes that have been uploaded or downloaded. - `transferrableBytes` refers to the total number of bytes transferred, and pending transfer. - */ -typedef void(^RLMProgressNotificationBlock)(NSUInteger transferredBytes, NSUInteger transferrableBytes); - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A token object corresponding to a progress notification block on a session object. - - To stop notifications manually, call `-invalidate` on it. Notifications should be stopped before - the token goes out of scope or is destroyed. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMProgressNotificationToken : RLMNotificationToken -@end - -/** - An object encapsulating an Atlas App Services "session". Sessions represent the - communication between the client (and a local Realm file on disk), and the server - (and a remote Realm with a given partition value stored on Atlas App Services). - - Sessions are always created by the SDK and vended out through various APIs. The - lifespans of sessions associated with Realms are managed automatically. Session - objects can be accessed from any thread. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMSyncSession : NSObject - -/// The session's current state. -/// -/// This property is not KVO-compliant. -@property (nonatomic, readonly) RLMSyncSessionState state; - -/// The session's current connection state. -/// -/// This property is KVO-compliant and can be observed to be notified of changes. -/// Be warned that KVO observers for this property may be called on a background -/// thread. -@property (atomic, readonly) RLMSyncConnectionState connectionState; - -/// The user that owns this session. -- (nullable RLMUser *)parentUser; - -/** - If the session is valid, return a sync configuration that can be used to open the Realm - associated with this session. - */ -- (nullable RLMSyncConfiguration *)configuration; - -/** - Temporarily suspend syncronization and disconnect from the server. - - The session will not attempt to connect to Atlas App Services until `resume` - is called or the Realm file is closed and re-opened. - */ -- (void)suspend; - -/** - Resume syncronization and reconnect to Atlas App Services after suspending. - - This is a no-op if the session was already active or if the session is invalid. - Newly created sessions begin in the Active state and do not need to be resumed. - */ -- (void)resume; - -/** - Register a progress notification block. - - Multiple blocks can be registered with the same session at once. Each block - will be invoked on a side queue devoted to progress notifications. - - If the session has already received progress information from the - synchronization subsystem, the block will be called immediately. Otherwise, it - will be called as soon as progress information becomes available. - - The token returned by this method must be retained as long as progress - notifications are desired, and the `-invalidate` method should be called on it - when notifications are no longer needed and before the token is destroyed. - - If no token is returned, the notification block will never be called again. - There are a number of reasons this might be true. If the session has previously - experienced a fatal error it will not accept progress notification blocks. If - the block was configured in the `RLMSyncProgressForCurrentlyOutstandingWork` - mode but there is no additional progress to report (for example, the number - of transferrable bytes and transferred bytes are equal), the block will not be - called again. - - @param direction The transfer direction (upload or download) to track in this progress notification block. - @param mode The desired behavior of this progress notification block. - @param block The block to invoke when notifications are available. - - @return A token which must be held for as long as you want notifications to be delivered. - - @see `RLMSyncProgressDirection`, `RLMSyncProgress`, `RLMProgressNotificationBlock`, `RLMProgressNotificationToken` - */ -- (nullable RLMProgressNotificationToken *)addProgressNotificationForDirection:(RLMSyncProgressDirection)direction - mode:(RLMSyncProgressMode)mode - block:(RLMProgressNotificationBlock)block -NS_REFINED_FOR_SWIFT; - -/** - Given an error action token, immediately handle the corresponding action. - - @see `RLMSyncErrorClientResetError`, `RLMSyncErrorPermissionDeniedError` - */ -+ (void)immediatelyHandleError:(RLMSyncErrorActionToken *)token syncManager:(RLMSyncManager *)syncManager; - -/** - Get the sync session for the given Realm if it is a synchronized Realm, or `nil` - if it is not. - */ -+ (nullable RLMSyncSession *)sessionForRealm:(RLMRealm *)realm; - -@end - -// MARK: - Error action token - -#pragma mark - Error action token - -/** - An opaque token returned as part of certain errors. It can be - passed into certain APIs to perform certain actions. - - @see `RLMSyncErrorClientResetError`, `RLMSyncErrorPermissionDeniedError` - */ -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMSyncErrorActionToken : NSObject - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("This type cannot be created directly"))); - -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("This type cannot be created directly"))); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMSyncSubscription.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMSyncSubscription.h deleted file mode 100644 index d35be19d0..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMSyncSubscription.h +++ /dev/null @@ -1,346 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectId; - -#pragma mark - Subscription States - -/// The current state of the subscription. This can be used for ensuring that -/// the subscriptions are not errored and that it has been successfully -/// synced to the server. -typedef NS_ENUM(NSUInteger, RLMSyncSubscriptionState) { - /// The subscription is complete and the server has sent all the data that matched the subscription - /// queries at the time the subscription set was updated. The server is now in a steady-state - /// synchronization mode where it will stream update as they come. - RLMSyncSubscriptionStateComplete, - /// The subscription encountered an error and synchronization is paused for this Realm. You can - /// find the error calling error in the subscription set to get a description of the error. You can - /// still use the current subscription set to write a subscription. - RLMSyncSubscriptionStateError, - /// The subscription is persisted locally but not yet processed by the server, which means - /// the server hasn't yet returned all the data that matched the updated subscription queries. - RLMSyncSubscriptionStatePending, - /// The subscription set has been super-ceded by an updated one, this typically means that - /// someone is trying to write a subscription on a different instance of the subscription set. - /// You should not use a superseded subscription set and instead obtain a new instance of - /// the subscription set to write a subscription. - RLMSyncSubscriptionStateSuperseded -}; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - `RLMSyncSubscription` is used to define a Flexible Sync subscription obtained from querying a - subscription set, which can be used to read or remove/update a committed subscription. - */ -@interface RLMSyncSubscription : NSObject - -/// Name of the subscription. If not specified it will return nil. -@property (nonatomic, readonly, nullable) NSString *name; - -/// When the subscription was created. Recorded automatically. -@property (nonatomic, readonly) NSDate *createdAt; - -/// When the subscription was last updated. Recorded automatically. -@property (nonatomic, readonly) NSDate *updatedAt; - -/** - Updates a Flexible Sync's subscription query with an allowed query which will be used to bootstrap data - from the server when committed. - - @warning This method may only be called during a write subscription block. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - */ -- (void)updateSubscriptionWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (void)updateSubscriptionWhere:(NSString *)predicateFormat - args:(va_list)args; - -/** - Updates a Flexible Sync's subscription query with an allowed query which will be used to bootstrap data - from the server when committed. - - @warning This method may only be called during a write subscription block. - - @param predicate The predicate with which to filter the objects on the server. - */ -- (void)updateSubscriptionWithPredicate:(NSPredicate *)predicate; - -@end - -/** - `RLMSyncSubscriptionSet` is a collection of `RLMSyncSubscription`s. This is the entry point - for adding and removing `RLMSyncSubscription`s. - */ -@interface RLMSyncSubscriptionSet : NSObject - -/// The number of subscriptions in the subscription set. -@property (readonly) NSUInteger count; - -/// Gets the error associated to the subscription set. This will be non-nil in case the current -/// state of the subscription set is `RLMSyncSubscriptionStateError`. -@property (nonatomic, readonly, nullable) NSError *error; - -/// Gets the state associated to the subscription set. -@property (nonatomic, readonly) RLMSyncSubscriptionState state; - -#pragma mark - Batch Update subscriptions - -/** - Synchronously performs any transactions (add/remove/update) to the subscription set within the block, - this will not wait for the server to acknowledge and see all the data associated with this collection of subscriptions, - and will return after committing the subscription transactions. - - @param block The block containing actions to perform to the subscription set. - */ -- (void)update:(__attribute__((noescape)) void(^)(void))block; -/// :nodoc: -- (void)write:(__attribute__((noescape)) void(^)(void))block __attribute__((unavailable("Renamed to -update"))); - -/** - Synchronously performs any transactions (add/remove/update) to the subscription set within the block, - this will not wait for the server to acknowledge and see all the data associated with this collection of subscriptions, - and will return after committing the subscription transactions. - - @param block The block containing actions to perform to the subscription set. - @param onComplete A block which is called upon synchronization of - subscriptions to the server. The block will be passed `nil` - if the update succeeded, and an error describing the problem - otherwise. - */ -- (void)update:(__attribute__((noescape)) void(^)(void))block - onComplete:(nullable void(^RLM_SWIFT_SENDABLE)(NSError *_Nullable))onComplete - __attribute__((swift_async(not_swift_private, 2))) - __attribute__((swift_attr("@_unsafeInheritExecutor"))); -/// :nodoc: -- (void)write:(__attribute__((noescape)) void(^)(void))block - onComplete:(void(^)(NSError * _Nullable))onComplete __attribute__((unavailable("Renamed to -update:onComplete."))); - -#pragma mark - Find subscription - -/** - Finds a subscription by the specified name. - - @param name The name used to identify the subscription. - - @return A subscription for the given name. - */ -- (nullable RLMSyncSubscription *)subscriptionWithName:(NSString *)name; - -/** - Finds a subscription by the query for the specified object class name. - - @param objectClassName The class name for the model class to be queried. - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return A subscription for the given query.. - */ -- (nullable RLMSyncSubscription *)subscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (nullable RLMSyncSubscription *)subscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat - args:(va_list)args; - -/** - Finds a subscription by the query for the specified object class name. - - @param objectClassName The class name for the model class to be queried. - @param predicate The predicate used to to filter the objects on the server. - - @return A subscription for the given query.. - */ -- (nullable RLMSyncSubscription *)subscriptionWithClassName:(NSString *)objectClassName - predicate:(NSPredicate *)predicate; - -#pragma mark - Add a Subscription - -/** - Adds a new subscription to the subscription set which will be sent to the server when - committed at the end of a write subscription block. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - */ -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat - args:(va_list)args; - -/** - Adds a new subscription to the subscription set which will be sent to the server when - committed at the end of a write subscription block. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param name The name used the identify the subscription. - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - */ -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - subscriptionName:(NSString *)name - where:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - subscriptionName:(NSString *)name - where:(NSString *)predicateFormat - args:(va_list)args; - -/** - Adds a new subscription to the subscription set which will be sent to the server when - committed at the end of a write subscription block. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param predicate The predicate defining the query for the subscription. - */ -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - predicate:(NSPredicate *)predicate; - -/** - Adds a new subscription to the subscription set which will be sent to the server when - committed at the end of a write subscription block. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param name The name used to identify the subscription. - @param predicate The predicate defining the query for the subscription. - */ -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - subscriptionName:(nullable NSString *)name - predicate:(NSPredicate *)predicate; - -#pragma mark - Remove Subscription - -/** - Removes a subscription with the specified name from the subscription set. - - @warning This method may only be called during a write subscription block. - - @param name The name used the identify the subscription. - */ -- (void)removeSubscriptionWithName:(NSString *)name; - -/** - Removes a subscription with the specified query for the object class from the subscription set. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - */ -- (void)removeSubscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (void)removeSubscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat - args:(va_list)args; - -/** - Removes a subscription with the specified query for the object class from the subscription set. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param predicate The predicate which will be used to identify the subscription to be removed. - */ -- (void)removeSubscriptionWithClassName:(NSString *)objectClassName - predicate:(NSPredicate *)predicate; - -/** - Removes the subscription from the subscription set. - - @warning This method may only be called during a write subscription block. - - @param subscription An instance of the subscription to be removed. - */ -- (void)removeSubscription:(RLMSyncSubscription *)subscription; - -#pragma mark - Remove Subscriptions - -/** - Removes all subscription from the subscription set. - - @warning This method may only be called during a write subscription block. - @warning Removing all subscriptions will result in an error if no new subscription is added. Server should - acknowledge at least one subscription. - */ -- (void)removeAllSubscriptions; - -/** - Removes all subscription with the specified class name. - - @param className The class name for the model class to be queried. - - @warning This method may only be called during a write subscription block. - */ -- (void)removeAllSubscriptionsWithClassName:(NSString *)className; - -#pragma mark - SubscriptionSet Collection - -/** - Returns the subscription at the given `index`. - - @param index The index. - - @return A subscription for the given index in the subscription set. - */ -- (nullable RLMSyncSubscription *)objectAtIndex:(NSUInteger)index; - -/** - Returns the first object in the subscription set list, or `nil` if the subscriptions are empty. - - @return A subscription. - */ -- (nullable RLMSyncSubscription *)firstObject; - -/** - Returns the last object in the subscription set, or `nil` if the subscriptions are empty. - - @return A subscription. - */ -- (nullable RLMSyncSubscription *)lastObject; - -#pragma mark - Subscript - -/** - Returns the subscription at the given `index`. - - @param index The index. - - @return A subscription for the given index in the subscription set. - */ -- (id)objectAtIndexedSubscript:(NSUInteger)index; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMThreadSafeReference.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMThreadSafeReference.h deleted file mode 100644 index 9472942ed..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMThreadSafeReference.h +++ /dev/null @@ -1,107 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMRealm; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - Objects of types which conform to `RLMThreadConfined` can be managed by a Realm, which will make - them bound to a thread-specific `RLMRealm` instance. Managed objects must be explicitly exported - and imported to be passed between threads. - - Managed instances of objects conforming to this protocol can be converted to a thread-safe - reference for transport between threads by passing to the - `+[RLMThreadSafeReference referenceWithThreadConfined:]` constructor. - - Note that only types defined by Realm can meaningfully conform to this protocol, and defining new - classes which attempt to conform to it will not make them work with `RLMThreadSafeReference`. - */ -@protocol RLMThreadConfined -// Conformance to the `RLMThreadConfined_Private` protocol will be enforced at runtime. - -/** - The Realm which manages the object, or `nil` if the object is unmanaged. - - Unmanaged objects are not confined to a thread and cannot be passed to methods expecting a - `RLMThreadConfined` object. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/// Indicates if the object can no longer be accessed because it is now invalid. -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -@end - -/** - An object intended to be passed between threads containing a thread-safe reference to its - thread-confined object. - - To resolve a thread-safe reference on a target Realm on a different thread, pass to - `-[RLMRealm resolveThreadSafeReference:]`. - - @warning A `RLMThreadSafeReference` object must be resolved at most once. - Failing to resolve a `RLMThreadSafeReference` will result in the source version of the - Realm being pinned until the reference is deallocated. - - @note Prefer short-lived `RLMThreadSafeReference`s as the data for the version of the source Realm - will be retained until all references have been resolved or deallocated. - - @see `RLMThreadConfined` - @see `-[RLMRealm resolveThreadSafeReference:]` - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMThreadSafeReference<__covariant Confined : id> : NSObject - -/** - Create a thread-safe reference to the thread-confined object. - - @param threadConfined The thread-confined object to create a thread-safe reference to. - - @note You may continue to use and access the thread-confined object after passing it to this - constructor. - */ -+ (instancetype)referenceWithThreadConfined:(Confined)threadConfined; - -/** - Indicates if the reference can no longer be resolved because an attempt to resolve it has already - occurred. References can only be resolved once. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -#pragma mark - Unavailable Methods - -/** - `-[RLMThreadSafeReference init]` is not available because `RLMThreadSafeReference` cannot be - created directly. `RLMThreadSafeReference` instances must be obtained by calling - `-[RLMRealm resolveThreadSafeReference:]`. - */ -- (instancetype)init __attribute__((unavailable("RLMThreadSafeReference cannot be created directly"))); - -/** - `-[RLMThreadSafeReference new]` is not available because `RLMThreadSafeReference` cannot be - created directly. `RLMThreadSafeReference` instances must be obtained by calling - `-[RLMRealm resolveThreadSafeReference:]`. - */ -+ (instancetype)new __attribute__((unavailable("RLMThreadSafeReference cannot be created directly"))); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMUpdateResult.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMUpdateResult.h deleted file mode 100644 index df0b237e3..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMUpdateResult.h +++ /dev/null @@ -1,45 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectId; -@protocol RLMBSON; - -/// The result of an `updateOne` or `updateMany` operation a `RLMMongoCollection`. -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMUpdateResult : NSObject - -/// The number of documents that matched the filter. -@property (nonatomic, readonly) NSUInteger matchedCount; - -/// The number of documents modified. -@property (nonatomic, readonly) NSUInteger modifiedCount; - -/// The identifier of the inserted document if an upsert took place and the document's primary key is an `ObjectId`. -@property (nonatomic, nullable, readonly) RLMObjectId *objectId -__attribute__((deprecated("Use documentId instead, which support all BSON types", "documentId"))); - -/// The identifier of the inserted document if an upsert took place. -@property (nonatomic, nullable, readonly) id documentId; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMUser.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMUser.h deleted file mode 100644 index 436350f9b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMUser.h +++ /dev/null @@ -1,447 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import -#import -#import - -@class RLMUser, RLMSyncSession, RLMRealm, RLMUserIdentity, RLMAPIKeyAuth, RLMMongoClient, RLMMongoDatabase, RLMMongoCollection, RLMUserProfile; -@protocol RLMBSON; - -/** - The state of the user object. - */ -typedef NS_ENUM(NSUInteger, RLMUserState) { - /// The user is logged out. Call `logInWithCredentials:...` with valid credentials to log the user back in. - RLMUserStateLoggedOut, - /// The user is logged in, and any Realms associated with it are syncing with Atlas App Services. - RLMUserStateLoggedIn, - /// The user has been removed, and cannot be used. - RLMUserStateRemoved -}; - -/// A block type used to report an error related to a specific user. -RLM_SWIFT_SENDABLE -typedef void(^RLMOptionalUserBlock)(RLMUser * _Nullable, NSError * _Nullable); - -/// A block type used to report an error on a network request from the user. -RLM_SWIFT_SENDABLE -typedef void(^RLMUserOptionalErrorBlock)(NSError * _Nullable); - -/// A block which returns a dictionary should there be any custom data set for a user -RLM_SWIFT_SENDABLE -typedef void(^RLMUserCustomDataBlock)(NSDictionary * _Nullable, NSError * _Nullable); - -/// A block type for returning from function calls. -RLM_SWIFT_SENDABLE -typedef void(^RLMCallFunctionCompletionBlock)(id _Nullable, NSError * _Nullable); - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A `RLMUser` instance represents a single Realm App user account. - - A user may have one or more credentials associated with it. These credentials - uniquely identify the user to the authentication provider, and are used to sign - into an Atlas App Services user account. - - Note that user objects are only vended out via SDK APIs, and cannot be directly - initialized. User objects can be accessed from any thread. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // internally thread-safe -@interface RLMUser : NSObject - -/** - The unique Atlas App Services string identifying this user. - Note this is different from an identity: A user may have multiple identities but has a single identifier. See RLMUserIdentity. - */ -@property (nonatomic, readonly) NSString *identifier NS_SWIFT_NAME(id); - -/// Returns an array of identities currently linked to a user. -@property (nonatomic, readonly) NSArray *identities; - -/** - The user's refresh token used to access App Services. - - By default, refresh tokens expire 60 days after they are issued. - You can configure this time for your App's refresh tokens to be - anywhere between 30 minutes and 180 days. - - You can configure the refresh token expiration time for all sessions in - an App from the Admin UI or Admin API. -*/ -@property (nullable, nonatomic, readonly) NSString *refreshToken; - -/** - The user's access token used to access App Services. - - This is required to make HTTP requests to Atlas App Services like the Data API or GraphQL. - It should be treated as sensitive data. - - The Realm SDK automatically manages access tokens and refreshes them - when they expire. - */ -@property (nullable, nonatomic, readonly) NSString *accessToken; - -/** - The current state of the user. - */ -@property (nonatomic, readonly) RLMUserState state; - -/** - Indicates if the user is logged in or not. Returns true if the access token and refresh token are not empty. - */ -@property (nonatomic, readonly) BOOL isLoggedIn; - -#pragma mark - Lifecycle - -/** - Create a partition-based sync configuration instance for the given partition value. - - @param partitionValue The `RLMBSON` value the Realm is partitioned on. - @return A default configuration object with the sync configuration set to use the given partition value. - */ -- (RLMRealmConfiguration *)configurationWithPartitionValue:(nullable id)partitionValue NS_REFINED_FOR_SWIFT; - -/** - Create a partition-based sync configuration instance for the given partition value. - - @param partitionValue The `RLMBSON` value the Realm is partitioned on. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - - @return A configuration object with the sync configuration set to use the given partition value. - */ -- (RLMRealmConfiguration *)configurationWithPartitionValue:(nullable id)partitionValue - clientResetMode:(RLMClientResetMode)clientResetMode NS_REFINED_FOR_SWIFT; - -/** - Create a partition-based sync configuration instance for the given partition value. - - @param partitionValue The `RLMBSON` value the Realm is partitioned on. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param beforeResetBlock A callback which notifies prior to a client reset occurring. See: `RLMClientResetBeforeBlock` - @param afterResetBlock A callback which notifies after a client reset has occurred. See: `RLMClientResetAfterBlock` - - @return A configuration object with the sync configuration set to use the given partition value. - */ -- (RLMRealmConfiguration *)configurationWithPartitionValue:(nullable id)partitionValue - clientResetMode:(RLMClientResetMode)clientResetMode - notifyBeforeReset:(nullable RLMClientResetBeforeBlock)beforeResetBlock - notifyAfterReset:(nullable RLMClientResetAfterBlock)afterResetBlock NS_REFINED_FOR_SWIFT; - -/** - Create a partition-based sync configuration instance for the given partition value. - - @param partitionValue The `RLMBSON` value the Realm is partitioned on. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param manualClientResetHandler An error reporting block that is invoked during a client reset. - @See ``RLMSyncErrorReportingBlock`` and ``RLMClientResetInfo`` - - @return A configuration object with the sync configuration set to use the given partition value. - */ -- (RLMRealmConfiguration *)configurationWithPartitionValue:(nullable id)partitionValue - clientResetMode:(RLMClientResetMode)clientResetMode - manualClientResetHandler:(nullable RLMSyncErrorReportingBlock)manualClientResetHandler NS_REFINED_FOR_SWIFT; - -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @return A ``RLMRealmConfiguration`` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfiguration NS_REFINED_FOR_SWIFT; - -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param beforeResetBlock A callback which notifies prior to a client reset occurring. See: `RLMClientResetBeforeBlock` - @param afterResetBlock A callback which notifies after a client reset has occurred. See: `RLMClientResetAfterBlock` - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithClientResetMode:(RLMClientResetMode)clientResetMode - notifyBeforeReset:(nullable RLMClientResetBeforeBlock)beforeResetBlock - notifyAfterReset:(nullable RLMClientResetAfterBlock)afterResetBlock NS_REFINED_FOR_SWIFT; -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param manualClientResetHandler An error reporting block that is invoked during a client reset. - @See `RLMSyncErrorReportingBlock` and `RLMClientResetInfo` - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithClientResetMode:(RLMClientResetMode)clientResetMode - manualClientResetHandler:(nullable RLMSyncErrorReportingBlock)manualClientResetHandler NS_REFINED_FOR_SWIFT; - -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param initialSubscriptions A block which receives a subscription set instance, that can be - used to add an initial set of subscriptions which will be executed - when the Realm is first opened. - @param rerunOnOpen If true, allows to run the initial set of subscriptions specified, on every app startup. - This can be used to re-run dynamic time ranges and other queries that require a - re-computation of a static variable. - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithInitialSubscriptions:(RLMFlexibleSyncInitialSubscriptionsBlock)initialSubscriptions - rerunOnOpen:(BOOL)rerunOnOpen NS_REFINED_FOR_SWIFT; -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param initialSubscriptions A block which receives a subscription set instance, that can be - used to add an initial set of subscriptions which will be executed - when the Realm is first opened. - @param rerunOnOpen If true, allows to run the initial set of subscriptions specified, on every app startup. - This can be used to re-run dynamic time ranges and other queries that require a - re-computation of a static variable. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param beforeResetBlock A callback which notifies prior to a client reset occurring. See: `RLMClientResetBeforeBlock` - @param afterResetBlock A callback which notifies after a client reset has occurred. See: `RLMClientResetAfterBlock` - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithInitialSubscriptions:(RLMFlexibleSyncInitialSubscriptionsBlock)initialSubscriptions - rerunOnOpen:(BOOL)rerunOnOpen - clientResetMode:(RLMClientResetMode)clientResetMode - notifyBeforeReset:(nullable RLMClientResetBeforeBlock)beforeResetBlock - notifyAfterReset:(nullable RLMClientResetAfterBlock)afterResetBlock NS_REFINED_FOR_SWIFT; - -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param initialSubscriptions A block which receives a subscription set instance, that can be - used to add an initial set of subscriptions which will be executed - when the Realm is first opened. - @param rerunOnOpen If true, allows to run the initial set of subscriptions specified, on every app startup. - This can be used to re-run dynamic time ranges and other queries that require a - re-computation of a static variable. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param manualClientResetHandler An error reporting block that is invoked during a client reset. - @See `RLMSyncErrorReportingBlock` and `RLMClientResetInfo` - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithInitialSubscriptions:(RLMFlexibleSyncInitialSubscriptionsBlock)initialSubscriptions - rerunOnOpen:(BOOL)rerunOnOpen - clientResetMode:(RLMClientResetMode)clientResetMode - manualClientResetHandler:(nullable RLMSyncErrorReportingBlock)manualClientResetHandler NS_REFINED_FOR_SWIFT; - -#pragma mark - Sessions - -/** - Retrieve a valid session object belonging to this user for a given URL, or `nil` - if no such object exists. - */ -- (nullable RLMSyncSession *)sessionForPartitionValue:(id)partitionValue; - -/// Retrieve all the valid sessions belonging to this user. -@property (nonatomic, readonly) NSArray *allSessions; - -#pragma mark - Custom Data - -/** - The custom data of the user. - This is configured in your Atlas App Services app. - */ -@property (nonatomic, readonly) NSDictionary *customData NS_REFINED_FOR_SWIFT; - -/** - The profile of the user. - */ -@property (nonatomic, readonly) RLMUserProfile *profile; - -/** - Refresh a user's custom data. This will, in effect, refresh the user's auth session. - */ -- (void)refreshCustomDataWithCompletion:(RLMUserCustomDataBlock)completion; - -/** - Links the currently authenticated user with a new identity, where the identity is defined by the credential - specified as a parameter. This will only be successful if this `RLMUser` is the currently authenticated - with the client from which it was created. On success a new user will be returned with the new linked credentials. - - @param credentials The `RLMCredentials` used to link the user to a new identity. - @param completion The completion handler to call when the linking is complete. - If the operation is successful, the result will contain a new - `RLMUser` object representing the currently logged in user. -*/ -- (void)linkUserWithCredentials:(RLMCredentials *)credentials - completion:(RLMOptionalUserBlock)completion NS_REFINED_FOR_SWIFT; - -/** - Removes the user - - This logs out and destroys the session related to this user. The completion block will return an error - if the user is not found or is already removed. - - @param completion A callback invoked on completion -*/ -- (void)removeWithCompletion:(RLMUserOptionalErrorBlock)completion; - -/** - Permanently deletes this user from your Atlas App Services app. - - The users state will be set to `Removed` and the session will be destroyed. - If the delete request fails, the local authentication state will be untouched. - - @param completion A callback invoked on completion -*/ -- (void)deleteWithCompletion:(RLMUserOptionalErrorBlock)completion; - -/** - Logs out the current user - - The users state will be set to `Removed` is they are an anonymous user or `LoggedOut` if they are authenticated by an email / password or third party auth clients - If the logout request fails, this method will still clear local authentication state. - - @param completion A callback invoked on completion -*/ -- (void)logOutWithCompletion:(RLMUserOptionalErrorBlock)completion; - -/** - A client for the user API key authentication provider which - can be used to create and modify user API keys. - - This client should only be used by an authenticated user. -*/ -@property (nonatomic, readonly) RLMAPIKeyAuth *apiKeysAuth; - -/// A client for interacting with a remote MongoDB instance -/// @param serviceName The name of the MongoDB service -- (RLMMongoClient *)mongoClientWithServiceName:(NSString *)serviceName NS_REFINED_FOR_SWIFT; - -/** - Calls the Atlas App Services function with the provided name and arguments. - - @param name The name of the Atlas App Services function to be called. - @param arguments The `BSONArray` of arguments to be provided to the function. - @param completion The completion handler to call when the function call is complete. - This handler is executed on a non-main global `DispatchQueue`. -*/ -- (void)callFunctionNamed:(NSString *)name - arguments:(NSArray> *)arguments - completionBlock:(RLMCallFunctionCompletionBlock)completion NS_REFINED_FOR_SWIFT; - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("RLMUser cannot be created directly"))); -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("RLMUser cannot be created directly"))); - -@end - -#pragma mark - User info classes - -/** - An identity of a user. A user can have multiple identities, usually associated with multiple providers. - Note this is different from a user's unique identifier string. - @seeAlso `RLMUser.identifier` - */ -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMUserIdentity : NSObject - -/** - The associated provider type - */ -@property (nonatomic, readonly) NSString *providerType; - -/** - The string which identifies the RLMUserIdentity - */ -@property (nonatomic, readonly) NSString *identifier; - -/** - Initialize an RLMUserIdentity for the given identifier and provider type. - @param providerType the associated provider type - @param identifier the identifier of the identity - */ -- (instancetype)initUserIdentityWithProviderType:(NSString *)providerType - identifier:(NSString *)identifier; - -@end - -/** - A profile for a given User. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMUserProfile : NSObject - -/// The full name of the user. -@property (nonatomic, readonly, nullable) NSString *name; -/// The email address of the user. -@property (nonatomic, readonly, nullable) NSString *email; -/// A URL to the user's profile picture. -@property (nonatomic, readonly, nullable) NSString *pictureURL; -/// The first name of the user. -@property (nonatomic, readonly, nullable) NSString *firstName; -/// The last name of the user. -@property (nonatomic, readonly, nullable) NSString *lastName; -/// The gender of the user. -@property (nonatomic, readonly, nullable) NSString *gender; -/// The birthdate of the user. -@property (nonatomic, readonly, nullable) NSString *birthday; -/// The minimum age of the user. -@property (nonatomic, readonly, nullable) NSString *minAge; -/// The maximum age of the user. -@property (nonatomic, readonly, nullable) NSString *maxAge; -/// The BSON dictionary of metadata associated with this user. -@property (nonatomic, readonly) NSDictionary *metadata NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMUserAPIKey.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMUserAPIKey.h deleted file mode 100644 index 2cdd82b2a..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMUserAPIKey.h +++ /dev/null @@ -1,43 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// UserAPIKey model for APIKeys recevied from the server. -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMUserAPIKey : NSObject - -/// Indicates if the API key is disabled or not -@property (nonatomic, readonly) BOOL disabled; - -/// The name of the key. -@property (nonatomic, readonly) NSString *name; - -/// The actual key. Will only be included in -/// the response when an API key is first created. -@property (nonatomic, readonly, nullable) NSString *key; - -/// The ObjectId of the API key -@property (nonatomic, readonly) RLMObjectId *objectId NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMValue.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMValue.h deleted file mode 100644 index ac1f10ee4..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/RLMValue.h +++ /dev/null @@ -1,97 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import -#import -#import -#import -#import - -#pragma mark RLMValue - -/** - RLMValue is a property type which represents a polymorphic Realm value. This is similar to the usage of - `AnyObject` / `Any` in Swift. -``` - // A property on `MyObject` - @property (nonatomic) id myAnyValue; - - // A property on `AnotherObject` - @property (nonatomic) id myAnyValue; - - MyObject *myObject = [MyObject createInRealm:realm withValue:@[]]; - myObject.myAnyValue = @1234; // underlying type is NSNumber. - myObject.myAnyValue = @"hello"; // underlying type is NSString. - AnotherObject *anotherObject = [AnotherObject createInRealm:realm withValue:@[]]; - myObject.myAnyValue = anotherObject; // underlying type is RLMObject. -``` - The following types conform to RLMValue: - - `NSData` - `NSDate` - `NSNull` - `NSNumber` - `NSUUID` - `NSString` - `RLMObject - `RLMObjectId` - `RLMDecimal128` - */ -@protocol RLMValue - -/// Describes the type of property stored. -@property (readonly) RLMPropertyType rlm_valueType; - -@end - -/// :nodoc: -@interface NSNull (RLMValue) -@end - -/// :nodoc: -@interface NSNumber (RLMValue) -@end - -/// :nodoc: -@interface NSString (RLMValue) -@end - -/// :nodoc: -@interface NSData (RLMValue) -@end - -/// :nodoc: -@interface NSDate (RLMValue) -@end - -/// :nodoc: -@interface NSUUID (RLMValue) -@end - -/// :nodoc: -@interface RLMDecimal128 (RLMValue) -@end - -/// :nodoc: -@interface RLMObjectBase (RLMValue) -@end - -/// :nodoc: -@interface RLMObjectId (RLMValue) -@end diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/Realm.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/Realm.h deleted file mode 100644 index 245596393..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Headers/Realm.h +++ /dev/null @@ -1,63 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import - -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Modules/module.modulemap b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Modules/module.modulemap deleted file mode 100644 index 519ddc20b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Modules/module.modulemap +++ /dev/null @@ -1,88 +0,0 @@ -framework module Realm { - export Foundation - - umbrella header "Realm.h" - - header "RLMArray.h" - header "RLMAsymmetricObject.h" - header "RLMDecimal128.h" - header "RLMDictionary.h" - header "RLMEmbeddedObject.h" - header "RLMLogger.h" - header "RLMMigration.h" - header "RLMObject.h" - header "RLMObjectId.h" - header "RLMObjectSchema.h" - header "RLMProperty.h" - header "RLMProviderClient.h" - header "RLMRealm+Sync.h" - header "RLMRealm.h" - header "RLMRealmConfiguration.h" - header "RLMResults.h" - header "RLMSchema.h" - header "RLMSectionedResults.h" - header "RLMSet.h" - header "RLMValue.h" - - header "RLMApp.h" - header "RLMCredentials.h" - header "RLMNetworkTransport.h" - header "RLMPushClient.h" - header "RLMRealm+Sync.h" - header "RLMSyncConfiguration.h" - header "RLMSyncManager.h" - header "RLMSyncSession.h" - header "RLMUser.h" - header "RLMUserAPIKey.h" - header "RLMAPIKeyAuth.h" - header "RLMEmailPasswordAuth.h" - header "NSError+RLMSync.h" - header "RLMBSON.h" - header "RLMMongoClient.h" - header "RLMMongoDatabase.h" - header "RLMMongoCollection.h" - header "RLMUpdateResult.h" - header "RLMFindOptions.h" - header "RLMFindOneAndModifyOptions.h" - header "RLMSyncSubscription.h" - - explicit module Private { - header "RLMAccessor.h" - header "RLMApp_Private.h" - header "RLMArray_Private.h" - header "RLMAsyncTask_Private.h" - header "RLMCollection_Private.h" - header "RLMDictionary_Private.h" - header "RLMLogger_Private.h" - header "RLMEvent.h" - header "RLMMongoCollection_Private.h" - header "RLMObjectBase_Dynamic.h" - header "RLMObjectBase_Private.h" - header "RLMObjectSchema_Private.h" - header "RLMObjectStore.h" - header "RLMObject_Private.h" - header "RLMProperty_Private.h" - header "RLMRealmConfiguration_Private.h" - header "RLMRealm_Private.h" - header "RLMResults_Private.h" - header "RLMScheduler.h" - header "RLMSchema_Private.h" - header "RLMSectionedResults.h" - header "RLMSet_Private.h" - header "RLMSwiftCollectionBase.h" - header "RLMSwiftProperty.h" - header "RLMSwiftValueStorage.h" - header "RLMSyncConfiguration_Private.h" - header "RLMSyncSubscription_Private.h" - header "RLMUser_Private.h" - } - - explicit module Dynamic { - header "RLMRealm_Dynamic.h" - header "RLMObjectBase_Dynamic.h" - } - - explicit module Swift { - header "RLMSwiftObject.h" - } -} diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMAccessor.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMAccessor.h deleted file mode 100644 index db915ca7c..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMAccessor.h +++ /dev/null @@ -1,53 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectSchema, RLMProperty, RLMObjectBase; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -// -// Accessors Class Creation/Caching -// - -// get accessor classes for an object class - generates classes if not cached -Class RLMManagedAccessorClassForObjectClass(Class objectClass, RLMObjectSchema *schema, const char *name); -Class RLMUnmanagedAccessorClassForObjectClass(Class objectClass, RLMObjectSchema *schema); - -// -// Dynamic getters/setters -// -FOUNDATION_EXTERN void RLMDynamicValidatedSet(RLMObjectBase *obj, NSString *propName, id __nullable val); -FOUNDATION_EXTERN id __nullable RLMDynamicGet(RLMObjectBase *obj, RLMProperty *prop); -FOUNDATION_EXTERN id __nullable RLMDynamicGetByName(RLMObjectBase *obj, NSString *propName); - -// by property/column -void RLMDynamicSet(RLMObjectBase *obj, RLMProperty *prop, id val); - -// -// Class modification -// - -// Replace className method for the given class -void RLMReplaceClassNameMethod(Class accessorClass, NSString *className); - -// Replace sharedSchema method for the given class -void RLMReplaceSharedSchemaMethod(Class accessorClass, RLMObjectSchema * __nullable schema); - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMApp_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMApp_Private.h deleted file mode 100644 index 5da5c3c7a..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMApp_Private.h +++ /dev/null @@ -1,50 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// Observer block for app notifications. -typedef void(^RLMAppNotificationBlock)(RLMApp *); - -/// Token that identifies an observer. Unsubscribes when deconstructed to -/// avoid dangling observers, therefore this must be retained to hold -/// onto a subscription. -@interface RLMAppSubscriptionToken : NSObject -- (void)unsubscribe; -@end - -@interface RLMApp () -/// Returns all currently cached Apps -+ (NSArray *)allApps; -/// Subscribe to notifications for this RLMApp. -- (RLMAppSubscriptionToken *)subscribe:(RLMAppNotificationBlock)block; - -+ (instancetype)appWithConfiguration:(RLMAppConfiguration *)configuration; - -+ (void)resetAppCache; -@end - -@interface RLMAppConfiguration () -@property (nonatomic) NSString *appId; -@property (nonatomic) BOOL encryptMetadata; -@property (nonatomic) NSURL *rootDirectory; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMArray_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMArray_Private.h deleted file mode 100644 index 1a37f010e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMArray_Private.h +++ /dev/null @@ -1,44 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -@class RLMObjectBase, RLMProperty; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMArray () -- (instancetype)initWithObjectClassName:(NSString *)objectClassName; -- (instancetype)initWithObjectType:(RLMPropertyType)type optional:(BOOL)optional; -- (NSString *)descriptionWithMaxDepth:(NSUInteger)depth; -- (void)setParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -- (void)replaceAllObjectsWithObjects:(NSArray *)objects; -// YES if the property is declared with old property syntax. -@property (nonatomic, readonly) BOOL isLegacyProperty; -// The name of the property which this collection represents -@property (nonatomic, readonly) NSString *propertyKey; -@end - -@interface RLMManagedArray : RLMArray -- (instancetype)initWithParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -@end - -void RLMArrayValidateMatchingObjectType(RLMArray *array, id value); - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMAsyncTask_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMAsyncTask_Private.h deleted file mode 100644 index 3cce89441..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMAsyncTask_Private.h +++ /dev/null @@ -1,71 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import "RLMRealm_Private.h" - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMAsyncOpenTask () -@property (nonatomic, nullable) RLMRealm *localRealm; - -- (instancetype)initWithConfiguration:(RLMRealmConfiguration *)configuration - confinedTo:(RLMScheduler *)confinement - download:(bool)waitForDownloadCompletion - completion:(RLMAsyncOpenRealmCallback)completion -__attribute__((objc_direct)); - -- (instancetype)initWithConfiguration:(RLMRealmConfiguration *)configuration - confinedTo:(RLMScheduler *)confinement - download:(bool)waitForDownloadCompletion; - -- (void)waitWithCompletion:(void (^)(NSError *_Nullable))completion; -- (void)waitForOpen:(RLMAsyncOpenRealmCallback)completion __attribute__((objc_direct)); -@end - -// A cancellable task for waiting for downloads on an already-open Realm. -RLM_SWIFT_SENDABLE -@interface RLMAsyncDownloadTask : NSObject -- (instancetype)initWithRealm:(RLMRealm *)realm; -- (void)cancel; -- (void)waitWithCompletion:(void (^)(NSError *_Nullable))completion; -@end - -// A cancellable task for beginning an async write -RLM_SWIFT_SENDABLE -@interface RLMAsyncWriteTask : NSObject -// Must only be called from within the Actor -- (instancetype)initWithRealm:(RLMRealm *)realm; -- (void)setTransactionId:(RLMAsyncTransactionId)transactionID; -- (void)complete:(bool)cancel; - -// Can be called from any thread -- (void)wait:(void (^)(void))completion; -@end - -typedef void (^RLMAsyncRefreshCompletion)(bool); -// A cancellable task for refreshing a Realm -RLM_SWIFT_SENDABLE -@interface RLMAsyncRefreshTask : NSObject -- (void)complete:(bool)didRefresh; -- (void)wait:(RLMAsyncRefreshCompletion)completion; -+ (RLMAsyncRefreshTask *)completedRefresh; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMBSON_Private.hpp b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMBSON_Private.hpp deleted file mode 100644 index c5cc1a410..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMBSON_Private.hpp +++ /dev/null @@ -1,32 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -namespace realm::bson { -class Bson; -template class IndexedMap; -using BsonDocument = IndexedMap; -} - -realm::bson::Bson RLMConvertRLMBSONToBson(id b); -realm::bson::BsonDocument RLMConvertRLMBSONArrayToBsonDocument(NSArray> *array); -id RLMConvertBsonToRLMBSON(const realm::bson::Bson& b); -id RLMConvertBsonDocumentToRLMBSON(std::optional b); -NSArray> *RLMConvertBsonDocumentToRLMBSONArray(std::optional b); diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMCollection_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMCollection_Private.h deleted file mode 100644 index 7d31bd3f0..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMCollection_Private.h +++ /dev/null @@ -1,42 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@protocol RLMCollectionPrivate; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -NSUInteger RLMUnmanagedFastEnumerate(id collection, NSFastEnumerationState *); -void RLMCollectionSetValueForKey(id collection, NSString *key, id _Nullable value); -FOUNDATION_EXTERN NSString *RLMDescriptionWithMaxDepth(NSString *name, id collection, NSUInteger depth); -FOUNDATION_EXTERN void RLMAssignToCollection(id collection, id value); -FOUNDATION_EXTERN void RLMSetSwiftBridgeCallback(id _Nullable (*_Nonnull)(id)); - -FOUNDATION_EXTERN -RLMNotificationToken *RLMAddNotificationBlock(id collection, id block, - NSArray *_Nullable keyPaths, - dispatch_queue_t _Nullable queue); - -typedef RLM_CLOSED_ENUM(int32_t, RLMCollectionType) { - RLMCollectionTypeArray = 0, - RLMCollectionTypeSet = 1, - RLMCollectionTypeDictionary = 2 -}; - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMDictionary_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMDictionary_Private.h deleted file mode 100644 index 37ff740c7..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMDictionary_Private.h +++ /dev/null @@ -1,46 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectBase, RLMProperty; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMDictionary () -- (instancetype)initWithObjectClassName:(NSString *)objectClassName keyType:(RLMPropertyType)keyType; -- (instancetype)initWithObjectType:(RLMPropertyType)type optional:(BOOL)optional keyType:(RLMPropertyType)keyType; -- (NSString *)descriptionWithMaxDepth:(NSUInteger)depth; -- (void)setParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -// YES if the property is declared with old property syntax. -@property (nonatomic, readonly) BOOL isLegacyProperty; -// The name of the property which this collection represents -@property (nonatomic, readonly) NSString *propertyKey; -@end - -@interface RLMManagedDictionary : RLMDictionary -- (instancetype)initWithParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -@end - -FOUNDATION_EXTERN NSString *RLMDictionaryDescriptionWithMaxDepth(NSString *name, - RLMDictionary *dictionary, - NSUInteger depth); -id RLMDictionaryKey(RLMDictionary *dictionary, id key) RLM_HIDDEN; -id RLMDictionaryValue(RLMDictionary *dictionary, id value) RLM_HIDDEN; - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMEvent.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMEvent.h deleted file mode 100644 index 9a6acb1a6..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMEvent.h +++ /dev/null @@ -1,64 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2022 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#ifdef __cplusplus -#include - -namespace realm { -struct AuditConfig; -} -#endif - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMRealm, RLMUser, RLMRealmConfiguration; -typedef RLM_CLOSED_ENUM(NSUInteger, RLMSyncLogLevel); - -struct RLMEventContext; -typedef void (^RLMEventCompletion)(NSError *_Nullable); - -FOUNDATION_EXTERN struct RLMEventContext *_Nullable RLMEventGetContext(RLMRealm *realm); -FOUNDATION_EXTERN uint64_t RLMEventBeginScope(struct RLMEventContext *context, NSString *activity); -FOUNDATION_EXTERN void RLMEventCommitScope(struct RLMEventContext *context, uint64_t scope_id, - RLMEventCompletion _Nullable completion); -FOUNDATION_EXTERN void RLMEventCancelScope(struct RLMEventContext *context, uint64_t scope_id); -FOUNDATION_EXTERN bool RLMEventIsActive(struct RLMEventContext *context, uint64_t scope_id); -FOUNDATION_EXTERN void RLMEventRecordEvent(struct RLMEventContext *context, NSString *activity, - NSString *_Nullable event, NSString *_Nullable data, - RLMEventCompletion _Nullable completion); -FOUNDATION_EXTERN void RLMEventUpdateMetadata(struct RLMEventContext *context, - NSDictionary *newMetadata); - -@interface RLMEventConfiguration : NSObject -@property (nonatomic) NSString *partitionPrefix; -@property (nonatomic, nullable) RLMUser *syncUser; -@property (nonatomic, nullable) NSDictionary *metadata; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" -@property (nonatomic, nullable) void (^logger)(RLMSyncLogLevel, NSString *); -#pragma clang diagnostic pop -@property (nonatomic, nullable) RLM_SWIFT_SENDABLE void (^errorHandler)(NSError *); - -#ifdef __cplusplus -- (std::shared_ptr)auditConfigWithRealmConfiguration:(RLMRealmConfiguration *)realmConfig; -#endif -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMLogger_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMLogger_Private.h deleted file mode 100644 index 08f8c591e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMLogger_Private.h +++ /dev/null @@ -1,36 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMLogger() - -/** - Log a message to the supplied level. - - @param logLevel The log level for the message. - @param message The message to log. - */ -- (void)logWithLevel:(RLMLogLevel)logLevel message:(NSString *)message, ... NS_SWIFT_UNAVAILABLE(""); -- (void)logLevel:(RLMLogLevel)logLevel message:(NSString *)message; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMMigration_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMMigration_Private.h deleted file mode 100644 index 393f41184..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMMigration_Private.h +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import -#import - -namespace realm { - class Schema; -} - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMMigration () - -@property (nonatomic, strong) RLMRealm *oldRealm; -@property (nonatomic, strong) RLMRealm *realm; - -- (instancetype)initWithRealm:(RLMRealm *)realm oldRealm:(RLMRealm *)oldRealm schema:(realm::Schema &)schema; - -- (void)execute:(RLMMigrationBlock)block objectClass:(_Nullable Class)cls; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMMongoCollection_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMMongoCollection_Private.h deleted file mode 100644 index 77bbf9752..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMMongoCollection_Private.h +++ /dev/null @@ -1,37 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@class RLMUser; - -@interface RLMMongoCollection () -- (instancetype)initWithUser:(RLMUser *)user - serviceName:(NSString *)serviceName - databaseName:(NSString *)databaseName - collectionName:(NSString *)collectionName; - -- (RLMChangeStream *)watchWithMatchFilter:(nullable id)matchFilter - idFilter:(nullable id)idFilter - delegate:(id)delegate - scheduler:(void (^)(dispatch_block_t))scheduler; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMObjectBase_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMObjectBase_Private.h deleted file mode 100644 index af547b17e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMObjectBase_Private.h +++ /dev/null @@ -1,34 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2017 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMArray; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -// RLMObjectBase private -@interface RLMObjectBase () -@property (nonatomic, nullable) NSMutableArray *lastAccessedNames; - -+ (void)initializeLinkedObjectSchemas; -+ (bool)isEmbedded; -+ (bool)isAsymmetric; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMObjectSchema_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMObjectSchema_Private.h deleted file mode 100644 index 08855a82b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMObjectSchema_Private.h +++ /dev/null @@ -1,75 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -// RLMObjectSchema private -@interface RLMObjectSchema () { -@public - bool _isSwiftClass; -} - -/// The object type name reported to the object store and core. -@property (nonatomic, readonly) NSString *objectName; - -// writable redeclaration -@property (nonatomic, readwrite, copy) NSArray *properties; -@property (nonatomic, readwrite, assign) bool isSwiftClass; -@property (nonatomic, readwrite, assign) BOOL isEmbedded; -@property (nonatomic, readwrite, assign) BOOL isAsymmetric; - -// class used for this object schema -@property (nonatomic, readwrite, assign) Class objectClass; -@property (nonatomic, readwrite, assign) Class accessorClass; -@property (nonatomic, readwrite, assign) Class unmanagedClass; - -@property (nonatomic, readwrite, assign) bool hasCustomEventSerialization; - -@property (nonatomic, readwrite, nullable) RLMProperty *primaryKeyProperty; - -@property (nonatomic, copy) NSArray *computedProperties; -@property (nonatomic, readonly, nullable) NSArray *swiftGenericProperties; - -// returns a cached or new schema for a given object class -+ (instancetype)schemaForObjectClass:(Class)objectClass; -@end - -@interface RLMObjectSchema (Dynamic) -/** - This method is useful only in specialized circumstances, for example, when accessing objects - in a Realm produced externally. If you are simply building an app on Realm, it is not recommended - to use this method as an [RLMObjectSchema](RLMObjectSchema) is generated automatically for every [RLMObject](RLMObject) subclass. - - Initialize an RLMObjectSchema with classname, objectClass, and an array of properties - - @warning This method is useful only in specialized circumstances. - - @param objectClassName The name of the class used to refer to objects of this type. - @param objectClass The Objective-C class used when creating instances of this type. - @param properties An array of RLMProperty instances describing the managed properties for this type. - - @return An initialized instance of RLMObjectSchema. - */ -- (instancetype)initWithClassName:(NSString *)objectClassName objectClass:(Class)objectClass properties:(NSArray *)properties; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMObjectStore.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMObjectStore.h deleted file mode 100644 index 6045f1e8e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMObjectStore.h +++ /dev/null @@ -1,98 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#ifdef __cplusplus -extern "C" { -#endif - -@class RLMRealm, RLMSchema, RLMObjectBase, RLMResults, RLMProperty; - -typedef NS_ENUM(NSUInteger, RLMUpdatePolicy) { - RLMUpdatePolicyError = 1, - RLMUpdatePolicyUpdateChanged = 3, - RLMUpdatePolicyUpdateAll = 2, -}; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -void RLMVerifyHasPrimaryKey(Class cls); - -void RLMVerifyInWriteTransaction(RLMRealm *const realm); - -// -// Adding, Removing, Getting Objects -// - -// add an object to the given realm -void RLMAddObjectToRealm(RLMObjectBase *object, RLMRealm *realm, RLMUpdatePolicy); - -// delete an object from its realm -void RLMDeleteObjectFromRealm(RLMObjectBase *object, RLMRealm *realm); - -// deletes all objects from a realm -void RLMDeleteAllObjectsFromRealm(RLMRealm *realm); - -// get objects of a given class -RLMResults *RLMGetObjects(RLMRealm *realm, NSString *objectClassName, NSPredicate * _Nullable predicate) -NS_RETURNS_RETAINED; - -// get an object with the given primary key -id _Nullable RLMGetObject(RLMRealm *realm, NSString *objectClassName, id _Nullable key) NS_RETURNS_RETAINED; - -// create object from array or dictionary -RLMObjectBase *RLMCreateObjectInRealmWithValue(RLMRealm *realm, NSString *className, - id _Nullable value, RLMUpdatePolicy updatePolicy) -NS_RETURNS_RETAINED; - -// creates an asymmetric object and doesn't return -void RLMCreateAsymmetricObjectInRealm(RLMRealm *realm, NSString *className, id value); - -// -// Accessor Creation -// - - -// Perform the per-property accessor initialization for a managed RealmSwiftObject -// promotingExisting should be true if the object was previously used as an -// unmanaged object, and false if it is a newly created object. -void RLMInitializeSwiftAccessor(RLMObjectBase *object, bool promotingExisting); - -#ifdef __cplusplus -} - -namespace realm { - class Obj; - class Table; - struct ColKey; - struct ObjLink; -} -class RLMClassInfo; - -// get an object with a given table & object key -RLMObjectBase *RLMObjectFromObjLink(RLMRealm *realm, - realm::ObjLink&& objLink, - bool parentIsSwiftObject) NS_RETURNS_RETAINED; - -// Create accessors -RLMObjectBase *RLMCreateObjectAccessor(RLMClassInfo& info, int64_t key) NS_RETURNS_RETAINED; -RLMObjectBase *RLMCreateObjectAccessor(RLMClassInfo& info, const realm::Obj& obj) NS_RETURNS_RETAINED; -#endif - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMObject_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMObject_Private.h deleted file mode 100644 index 8ccdbf576..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMObject_Private.h +++ /dev/null @@ -1,110 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMProperty, RLMArray, RLMSchema; -typedef NS_ENUM(int32_t, RLMPropertyType); - -FOUNDATION_EXTERN void RLMInitializeWithValue(RLMObjectBase *, id, RLMSchema *); - -typedef void (^RLMObjectNotificationCallback)(RLMObjectBase *_Nullable object, - NSArray *_Nullable propertyNames, - NSArray *_Nullable oldValues, - NSArray *_Nullable newValues, - NSError *_Nullable error); - -// RLMObject accessor and read/write realm -@interface RLMObjectBase () { -@public - RLMRealm *_realm; - __unsafe_unretained RLMObjectSchema *_objectSchema; -} - -// shared schema for this class -+ (nullable RLMObjectSchema *)sharedSchema; - -+ (nullable NSArray *)_getProperties; -+ (bool)_realmIgnoreClass; - -// This enables to override the propertiesMapping in Swift, it is not to be used in Objective-C API. -+ (NSDictionary *)propertiesMapping; -@end - -@interface RLMDynamicObject : RLMObject - -@end - -// Calls valueForKey: and re-raises NSUndefinedKeyExceptions -FOUNDATION_EXTERN id _Nullable RLMValidatedValueForProperty(id object, NSString *key, NSString *className); - -// Compare two RLObjectBases -FOUNDATION_EXTERN BOOL RLMObjectBaseAreEqual(RLMObjectBase * _Nullable o1, RLMObjectBase * _Nullable o2); - -FOUNDATION_EXTERN RLMNotificationToken *RLMObjectBaseAddNotificationBlock(RLMObjectBase *obj, - NSArray *_Nullable keyPaths, - dispatch_queue_t _Nullable queue, - RLMObjectNotificationCallback block); - -RLMNotificationToken *RLMObjectAddNotificationBlock(RLMObjectBase *obj, - RLMObjectChangeBlock block, - NSArray *_Nullable keyPaths, - dispatch_queue_t _Nullable queue); - -// Returns whether the class is a descendent of RLMObjectBase -FOUNDATION_EXTERN BOOL RLMIsObjectOrSubclass(Class klass); - -// Returns whether the class is an indirect descendant of RLMObjectBase -FOUNDATION_EXTERN BOOL RLMIsObjectSubclass(Class klass); - -FOUNDATION_EXTERN const NSUInteger RLMDescriptionMaxDepth; - -FOUNDATION_EXTERN id RLMObjectFreeze(RLMObjectBase *obj) NS_RETURNS_RETAINED; - -FOUNDATION_EXTERN id RLMObjectThaw(RLMObjectBase *obj); - -// Gets an object identifier suitable for use with Combine. This value may -// change when an unmanaged object is added to the Realm. -FOUNDATION_EXTERN uint64_t RLMObjectBaseGetCombineId(RLMObjectBase *); - -// An accessor object which is used to interact with Swift properties from obj-c -@interface RLMManagedPropertyAccessor : NSObject -// Perform any initialization required for KVO on a *unmanaged* object -+ (void)observe:(RLMProperty *)property on:(RLMObjectBase *)parent; -// Initialize the given property on a *managed* object which previous was unmanaged -+ (void)promote:(RLMProperty *)property on:(RLMObjectBase *)parent; -// Initialize the given property on a newly created *managed* object -+ (void)initialize:(RLMProperty *)property on:(RLMObjectBase *)parent; -// Read the value of the property, on either kind of object -+ (id)get:(RLMProperty *)property on:(RLMObjectBase *)parent; -// Set the property to the given value, on either kind of object -+ (void)set:(RLMProperty *)property on:(RLMObjectBase *)parent to:(id)value; -@end - -@interface RLMObjectNotificationToken : RLMNotificationToken -- (void)observe:(RLMObjectBase *)obj - keyPaths:(nullable NSArray *)keyPaths - block:(RLMObjectNotificationCallback)block; -- (void)registrationComplete:(void (^)(void))completion; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMProperty_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMProperty_Private.h deleted file mode 100644 index 6a87ced63..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMProperty_Private.h +++ /dev/null @@ -1,139 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -@class RLMObjectBase; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -BOOL RLMPropertyTypeIsComputed(RLMPropertyType propertyType); -FOUNDATION_EXTERN void RLMValidateSwiftPropertyName(NSString *name); - -// Translate an rlmtype to a string representation -static inline NSString *RLMTypeToString(RLMPropertyType type) { - switch (type) { - case RLMPropertyTypeString: - return @"string"; - case RLMPropertyTypeInt: - return @"int"; - case RLMPropertyTypeBool: - return @"bool"; - case RLMPropertyTypeDate: - return @"date"; - case RLMPropertyTypeData: - return @"data"; - case RLMPropertyTypeDouble: - return @"double"; - case RLMPropertyTypeFloat: - return @"float"; - case RLMPropertyTypeAny: - return @"mixed"; - case RLMPropertyTypeObject: - return @"object"; - case RLMPropertyTypeLinkingObjects: - return @"linking objects"; - case RLMPropertyTypeDecimal128: - return @"decimal128"; - case RLMPropertyTypeObjectId: - return @"object id"; - case RLMPropertyTypeUUID: - return @"uuid"; - } - return @"Unknown"; -} - -// private property interface -@interface RLMProperty () { -@public - RLMPropertyType _type; -} - -- (instancetype)initWithName:(NSString *)name - indexed:(BOOL)indexed - linkPropertyDescriptor:(nullable RLMPropertyDescriptor *)linkPropertyDescriptor - property:(objc_property_t)property; - -- (instancetype)initSwiftPropertyWithName:(NSString *)name - indexed:(BOOL)indexed - linkPropertyDescriptor:(nullable RLMPropertyDescriptor *)linkPropertyDescriptor - property:(objc_property_t)property - instance:(RLMObjectBase *)objectInstance; - -- (void)updateAccessors; - -// private setters -@property (nonatomic, readwrite) NSString *name; -@property (nonatomic, readwrite, assign) RLMPropertyType type; -@property (nonatomic, readwrite) BOOL indexed; -@property (nonatomic, readwrite) BOOL optional; -@property (nonatomic, readwrite) BOOL array; -@property (nonatomic, readwrite) BOOL set; -@property (nonatomic, readwrite) BOOL dictionary; -@property (nonatomic, copy, nullable) NSString *objectClassName; -@property (nonatomic, copy, nullable) NSString *linkOriginPropertyName; - -// private properties -@property (nonatomic, readwrite, nullable) NSString *columnName; -@property (nonatomic, assign) NSUInteger index; -@property (nonatomic, assign) BOOL isPrimary; -@property (nonatomic, assign) BOOL isLegacy; -@property (nonatomic, assign) ptrdiff_t swiftIvar; -@property (nonatomic, assign, nullable) Class swiftAccessor; -@property (nonatomic, readwrite, assign) RLMPropertyType dictionaryKeyType; -@property (nonatomic, readwrite) BOOL customMappingIsOptional; - -// getter and setter names -@property (nonatomic, copy) NSString *getterName; -@property (nonatomic, copy) NSString *setterName; -@property (nonatomic, nullable) SEL getterSel; -@property (nonatomic, nullable) SEL setterSel; - -- (RLMProperty *)copyWithNewName:(NSString *)name; -- (NSString *)typeName; - -@end - -@interface RLMProperty (Dynamic) -/** - This method is useful only in specialized circumstances, for example, in conjunction with - +[RLMObjectSchema initWithClassName:objectClass:properties:]. If you are simply building an - app on Realm, it is not recommended to use this method. - - Initialize an RLMProperty - - @warning This method is useful only in specialized circumstances. - - @param name The property name. - @param type The property type. - @param objectClassName The object type used for Object and Array types. - @param linkOriginPropertyName The property name of the origin of a link. Used for linking objects properties. - - @return An initialized instance of RLMProperty. - */ -- (instancetype)initWithName:(NSString *)name - type:(RLMPropertyType)type - objectClassName:(nullable NSString *)objectClassName - linkOriginPropertyName:(nullable NSString *)linkOriginPropertyName - indexed:(BOOL)indexed - optional:(BOOL)optional; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMPushClient_Private.hpp b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMPushClient_Private.hpp deleted file mode 100644 index 44304c9c3..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMPushClient_Private.hpp +++ /dev/null @@ -1,28 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import "RLMPushClient.h" - -namespace realm::app { -class PushClient; -} - -RLM_DIRECT_MEMBERS -@interface RLMPushClient () -- (instancetype)initWithPushClient:(realm::app::PushClient&&)pushClient; -@end diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMRealmConfiguration_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMRealmConfiguration_Private.h deleted file mode 100644 index 12b09676d..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMRealmConfiguration_Private.h +++ /dev/null @@ -1,52 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2015 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMSchema, RLMEventConfiguration; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMRealmConfiguration () - -@property (nonatomic, readwrite) bool cache; -@property (nonatomic, readwrite) bool dynamic; -@property (nonatomic, readwrite) bool disableFormatUpgrade; -@property (nonatomic, copy, nullable) RLMSchema *customSchema; -@property (nonatomic, copy) NSString *pathOnDisk; -@property (nonatomic, retain, nullable) RLMEventConfiguration *eventConfiguration; -@property (nonatomic, nullable) Class migrationObjectClass; -@property (nonatomic) bool disableAutomaticChangeNotifications; - -// Flexible Sync -@property (nonatomic, readwrite, nullable) RLMFlexibleSyncInitialSubscriptionsBlock initialSubscriptions; -@property (nonatomic, readwrite) BOOL rerunOnOpen; - -// Get the default configuration without copying it -+ (RLMRealmConfiguration *)rawDefaultConfiguration; - -+ (void)resetRealmConfigurationState; - -- (void)setCustomSchemaWithoutCopying:(nullable RLMSchema *)schema; -@end - -// Get a path in the platform-appropriate documents directory with the given filename -FOUNDATION_EXTERN NSString *RLMRealmPathForFile(NSString *fileName); -FOUNDATION_EXTERN NSString *RLMRealmPathForFileAndBundleIdentifier(NSString *fileName, NSString *mainBundleIdentifier); - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMRealm_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMRealm_Private.h deleted file mode 100644 index 95841491f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMRealm_Private.h +++ /dev/null @@ -1,94 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMFastEnumerator, RLMScheduler, RLMAsyncRefreshTask, RLMAsyncWriteTask; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -// Disable syncing files to disk. Cannot be re-enabled. Use only for tests. -FOUNDATION_EXTERN void RLMDisableSyncToDisk(void); -// Set whether the skip backup attribute should be set on temporary files. -FOUNDATION_EXTERN void RLMSetSkipBackupAttribute(bool value); - -FOUNDATION_EXTERN NSData * _Nullable RLMRealmValidatedEncryptionKey(NSData *key); - -// Set the queue used for async open. For testing purposes only. -FOUNDATION_EXTERN void RLMSetAsyncOpenQueue(dispatch_queue_t queue); - -// Translate an in-flight exception resulting from an operation on a SharedGroup to -// an NSError or NSException (if error is nil) -void RLMRealmTranslateException(NSError **error); - -// Block until the Realm at the given path is closed. -FOUNDATION_EXTERN void RLMWaitForRealmToClose(NSString *path); -BOOL RLMIsRealmCachedAtPath(NSString *path); - -// Register a block to be called from the next before_notify() invocation -FOUNDATION_EXTERN void RLMAddBeforeNotifyBlock(RLMRealm *realm, dispatch_block_t block); - -// Test hook to run the async notifiers for a Realm which has the background thread disabled -FOUNDATION_EXTERN void RLMRunAsyncNotifiers(NSString *path); - -// Get the cached Realm for the given configuration and scheduler, if any -FOUNDATION_EXTERN RLMRealm *_Nullable RLMGetCachedRealm(RLMRealmConfiguration *, RLMScheduler *) NS_RETURNS_RETAINED; -// Get a cached Realm for the given configuration and any scheduler. The returned -// Realm is not confined to the current thread, so very few operations are safe -// to perform on it -FOUNDATION_EXTERN RLMRealm *_Nullable RLMGetAnyCachedRealm(RLMRealmConfiguration *) NS_RETURNS_RETAINED; - -// Scheduler an async refresh for the given Realm -FOUNDATION_EXTERN RLMAsyncRefreshTask *_Nullable RLMRealmRefreshAsync(RLMRealm *rlmRealm) NS_RETURNS_RETAINED; - -// RLMRealm private members -@interface RLMRealm () -@property (nonatomic, readonly) BOOL dynamic; -@property (nonatomic, readwrite) RLMSchema *schema; -@property (nonatomic, readonly, nullable) id actor; -@property (nonatomic, readonly) bool isFlexibleSync; - -+ (void)resetRealmState; - -- (void)registerEnumerator:(RLMFastEnumerator *)enumerator; -- (void)unregisterEnumerator:(RLMFastEnumerator *)enumerator; -- (void)detachAllEnumerators; - -- (void)sendNotifications:(RLMNotification)notification; -- (void)verifyThread; -- (void)verifyNotificationsAreSupported:(bool)isCollection; - -- (RLMRealm *)frozenCopy NS_RETURNS_RETAINED; - -+ (nullable instancetype)realmWithConfiguration:(RLMRealmConfiguration *)configuration - confinedTo:(RLMScheduler *)options - error:(NSError **)error; - -- (RLMAsyncWriteTask *)beginAsyncWrite NS_RETURNS_RETAINED; -- (void)commitAsyncWriteWithGrouping:(bool)allowGrouping - completion:(void(^)(NSError *_Nullable))completion; -@end - -@interface RLMPinnedRealm : NSObject -@property (nonatomic, readonly) RLMRealmConfiguration *configuration; - -- (instancetype)initWithRealm:(RLMRealm *)realm; -- (void)unpin; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMResults_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMResults_Private.h deleted file mode 100644 index c7e29bebb..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMResults_Private.h +++ /dev/null @@ -1,33 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectSchema; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMResults () -@property (nonatomic, readonly, getter=isAttached) BOOL attached; - -+ (instancetype)emptyDetachedResults; -- (RLMResults *)snapshot; - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMScheduler.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMScheduler.h deleted file mode 100644 index 3c1b9874b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMScheduler.h +++ /dev/null @@ -1,63 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#ifdef __cplusplus -#include -namespace realm::util { -class Scheduler; -} -#endif - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -// A serial work queue of some sort which represents a thread-confinement context -// of some sort which blocks can be invoked inside. Realms are confined to a -// scheduler, which can be a thread (actually a run loop), a dispatch queue, or -// an actor. The scheduler ensures that the Realm is only used on one thread at -// a time, and allows us to dispatch work to the thread where we can access the -// Realm safely. -RLM_SWIFT_SENDABLE // is immutable -@interface RLMScheduler : NSObject -+ (RLMScheduler *)mainRunLoop __attribute__((objc_direct)); -+ (RLMScheduler *)currentRunLoop __attribute__((objc_direct)); -// A scheduler for the given queue if it's non-nil, and currentRunLoop otherwise -+ (RLMScheduler *)dispatchQueue:(nullable dispatch_queue_t)queue; -+ (RLMScheduler *)actor:(id)actor invoke:(void (^)(dispatch_block_t))invoke - verify:(void (^)(void))verify; - -// Invoke the block on this scheduler. Currently not actually implement for run -// loop schedulers. -- (void)invoke:(dispatch_block_t)block; - -// Cache key for this scheduler suitable for use with NSMapTable. Only valid -// when called from the current scheduler. -- (void *)cacheKey; - -- (nullable id)actor; - -#ifdef __cplusplus -// The object store Scheduler corresponding to this scheduler -- (std::shared_ptr)osScheduler; -#endif -@end - -FOUNDATION_EXTERN void RLMSetMainActor(id actor); - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMSchema_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMSchema_Private.h deleted file mode 100644 index f4f63c9f8..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMSchema_Private.h +++ /dev/null @@ -1,58 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@class RLMRealm; - -// -// RLMSchema private interface -// -@interface RLMSchema () - -/** - Returns an `RLMSchema` containing only the given `RLMObject` subclasses. - - @param classes The classes to be included in the schema. - - @return An `RLMSchema` containing only the given classes. - */ -+ (instancetype)schemaWithObjectClasses:(NSArray *)classes; - -@property (nonatomic, readwrite, copy) NSArray *objectSchema; - -// schema based on runtime objects -+ (instancetype)sharedSchema; - -// schema based upon all currently registered object classes -+ (instancetype)partialSharedSchema; - -// private schema based upon all currently registered object classes. -// includes classes that are excluded from the default schema. -+ (instancetype)partialPrivateSharedSchema; - -// class for string -+ (nullable Class)classForString:(NSString *)className; - -+ (nullable RLMObjectSchema *)sharedSchemaForClass:(Class)cls; - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMSet_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMSet_Private.h deleted file mode 100644 index 1053e0a0f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMSet_Private.h +++ /dev/null @@ -1,43 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -@class RLMObjectBase, RLMProperty; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMSet () -- (instancetype)initWithObjectClassName:(NSString *)objectClassName; -- (instancetype)initWithObjectType:(RLMPropertyType)type optional:(BOOL)optional; -- (NSString *)descriptionWithMaxDepth:(NSUInteger)depth; -- (void)setParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -// YES if the property is declared with old property syntax. -@property (nonatomic, readonly) BOOL isLegacyProperty; -// The name of the property which this collection represents -@property (nonatomic, readonly) NSString *propertyKey; -@end - -void RLMSetValidateMatchingObjectType(RLMSet *set, id value); - -@interface RLMManagedSet : RLMSet -- (instancetype)initWithParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMSwiftCollectionBase.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMSwiftCollectionBase.h deleted file mode 100644 index a4f864282..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMSwiftCollectionBase.h +++ /dev/null @@ -1,46 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectBase, RLMResults, RLMProperty, RLMLinkingObjects; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMSwiftCollectionBase : NSProxy -@property (nonatomic, strong) id _rlmCollection; - -- (instancetype)init; -+ (Class)_backingCollectionType; -- (instancetype)initWithCollection:(id)collection; - -- (nullable id)valueForKey:(NSString *)key; -- (nullable id)valueForKeyPath:(NSString *)keyPath; -- (BOOL)isEqual:(nullable id)object; -@end - -@interface RLMLinkingObjectsHandle : NSObject -- (instancetype)initWithObject:(RLMObjectBase *)object property:(RLMProperty *)property; -- (instancetype)initWithLinkingObjects:(RLMResults *)linkingObjects; - -@property (nonatomic, readonly) RLMLinkingObjects *results; -@property (nonatomic, readonly) NSString *_propertyKey; -@property (nonatomic, readonly) BOOL _isLegacyProperty; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMSwiftSupport.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMSwiftSupport.h deleted file mode 100644 index 530f0edbf..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMSwiftSupport.h +++ /dev/null @@ -1,30 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMSwiftSupport : NSObject - -+ (BOOL)isSwiftClassName:(NSString *)className; -+ (NSString *)demangleClassName:(NSString *)className; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMSwiftValueStorage.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMSwiftValueStorage.h deleted file mode 100644 index ef3efc610..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMSwiftValueStorage.h +++ /dev/null @@ -1,53 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectBase, RLMProperty; - -/// This class implements the backing storage for `RealmProperty<>` and `RealmOptional<>`. -/// This class should not be subclassed or used directly. -@interface RLMSwiftValueStorage : NSProxy -- (instancetype)init; -@end -/// Retrieves the value that is stored, or nil if it is empty. -FOUNDATION_EXTERN id _Nullable RLMGetSwiftValueStorage(RLMSwiftValueStorage *); -/// Sets a value on the property this instance represents for an object. -FOUNDATION_EXTERN void RLMSetSwiftValueStorage(RLMSwiftValueStorage *, id _Nullable); - -/// Initialises managed accessors on an instance of `RLMSwiftValueStorage` -/// @param parent The enclosing parent object. -/// @param prop The property which this class represents. -FOUNDATION_EXTERN void RLMInitializeManagedSwiftValueStorage(RLMSwiftValueStorage *, - RLMObjectBase *parent, - RLMProperty *prop); - -/// Initialises unmanaged accessors on an instance of `RLMSwiftValueStorage` -/// @param parent The enclosing parent object. -/// @param prop The property which this class represents. -FOUNDATION_EXTERN void RLMInitializeUnmanagedSwiftValueStorage(RLMSwiftValueStorage *, - RLMObjectBase *parent, - RLMProperty *prop); - -/// Gets the property name for the RealmProperty instance. This is required for tracing the key path on -/// objects that use the legacy property declaration syntax. -FOUNDATION_EXTERN NSString *RLMSwiftValueStorageGetPropertyName(RLMSwiftValueStorage *); - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMSyncConfiguration_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMSyncConfiguration_Private.h deleted file mode 100644 index 62d0e1f1f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMSyncConfiguration_Private.h +++ /dev/null @@ -1,47 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -typedef RLM_CLOSED_ENUM(NSUInteger, RLMSyncStopPolicy) { - RLMSyncStopPolicyImmediately, - RLMSyncStopPolicyLiveIndefinitely, - RLMSyncStopPolicyAfterChangesUploaded, -}; - - -@class RLMSchema; - -@interface RLMSyncConfiguration () - -// Flexible sync -- (instancetype)initWithUser:(RLMUser *)user; -// Partition-based sync -- (instancetype)initWithUser:(RLMUser *)user - partitionValue:(nullable id)partitionValue; - -// Internal-only APIs -@property (nonatomic, readwrite) RLMSyncStopPolicy stopPolicy; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMSyncSubscription_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMSyncSubscription_Private.h deleted file mode 100644 index dc438a20e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMSyncSubscription_Private.h +++ /dev/null @@ -1,70 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -#pragma mark - Subscription - -@interface RLMSyncSubscription () - -@property (nonatomic, readonly) RLMObjectId *identifier; - -@property (nonatomic, readonly) NSString *queryString; - -@property (nonatomic, readonly) NSString *objectClassName; - -@end - -#pragma mark - SubscriptionSet - -@interface RLMSyncSubscriptionEnumerator : NSObject - -@property (nonatomic, readonly) RLMSyncSubscriptionSet *subscriptionSet; - -- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state - count:(NSUInteger)len; - -- (instancetype)initWithSubscriptionSet:(RLMSyncSubscriptionSet *)subscriptionSet; - -@end - -@interface RLMSyncSubscriptionSet () - -@property (readonly) uint64_t version; - -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - subscriptionName:(nullable NSString *)name - predicate:(NSPredicate *)predicate - updateExisting:(BOOL)updateExisting; - -- (void)waitForSynchronizationOnQueue:(nullable dispatch_queue_t)queue - completionBlock:(void(^)(NSError *))completionBlock; - -- (RLMSyncSubscriptionEnumerator *)fastEnumerator; - -NSUInteger RLMFastEnumerate(NSFastEnumerationState *state, - NSUInteger len, - RLMSyncSubscriptionSet *collection); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMUser_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMUser_Private.h deleted file mode 100644 index f62c9a940..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/PrivateHeaders/RLMUser_Private.h +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// Observer block for user notifications. -typedef void(^RLMUserNotificationBlock)(RLMUser *); - -/// Token that identifies an observer. Unsubscribes when deconstructed to -/// avoid dangling observers, therefore this must be retained to hold -/// onto a subscription. -@interface RLMUserSubscriptionToken : NSObject -- (void)unsubscribe; -@end - -@interface RLMUser () -/// Subscribe to notifications for this RLMUser. -- (RLMUserSubscriptionToken *)subscribe:(RLMUserNotificationBlock)block; - -- (void)logOut; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Realm b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Realm deleted file mode 100755 index f1245c188..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Realm and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Resources/CHANGELOG.md b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Resources/CHANGELOG.md deleted file mode 100644 index 00cc01244..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Resources/CHANGELOG.md +++ /dev/null @@ -1,9539 +0,0 @@ -10.42.3 Release notes (2023-09-18) -============================================================= - -### Enhancements - -* Update packaging for the Xcode 15.0 release. Carthage release and obj-c - binaries are now built with Xcode 15. - -### Fixed - -* The prebuilt Realm.xcframework for SPM was packaged incorrectly and did not - work ([#8361](https://github.com/realm/realm-swift/issues/8361), since v10.42.1). - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 15.0.0. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15.0.0. - -10.42.2 Release notes (2023-09-13) -============================================================= - -### Enhancements - -* Add support for logging messages sent by the server. - ([Core #6476](https://github.com/realm/realm-core/pull/6476)) -* Unknown protocol errors received from the baas server will no longer cause - the application to crash if a valid error action is also received. Unknown - error actions will be treated as an ApplicationBug error action and will - cause sync to fail with an error via the sync error handler. - ([Core #6885](https://github.com/realm/realm-core/pull/6885)) -* Some sync error messages now contain more information about what went wrong. - -### Fixed - -* The `MultipleSyncAgents` exception from opening a synchronized Realm in - multiple processes at once no longer leaves the sync client in an invalid - state. ([Core #6868](https://github.com/realm/realm-core/pull/6868), since v10.36.0) -* Testing the size of a collection of links against zero would sometimes fail - (sometimes = "difficult to explain"). In particular: - ([Core #6850](https://github.com/realm/realm-core/issues/6850), since v10.41.0) -* When async writes triggered a file compaction some internal state could be - corrupted, leading to later crashes in the slab allocator. This typically - resulted in the "ref + size <= next->first" assertion failure, but other - failures were possible. Many issues reported; see [Core #6340](https://github.com/realm/realm-core/issues/6340). - (since 10.35.0) -* `Realm.Configuration.maximumNumberOfActiveVersions` now handles intermediate - versions which have been cleaned up correctly and checks the number of live - versions rather than the number of versions between the oldest live version - and current version (since 10.35.0). -* If the client disconnected between uploading a change to flexible sync - subscriptions and receiving the new object data from the server resulting - from that subscription change, the next connection to the server would - sometimes result in a client reset - ([Core #6966](https://github.com/realm/realm-core/issues/6966), since v10.21.1). - -### Deprecations - -* `RLMApp` has `localAppName` and `localAppVersion` fields which never ended up - being used for anything and are now deprecated. -* `RLMSyncAuthError` has not been used since v10.0.0 and is now deprecated. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 7. - -### Internal - -* Upgraded realm-core from 13.17.1 to 13.20.1 - -10.42.1 Release notes (2023-08-28) -============================================================= - -### Fixed - -* The names of the prebuilt zips for SPM have changed to avoid having Carthage - download them instead of the intended Carthage zip - ([#8326](https://github.com/realm/realm-swift/issues/8326), since v10.42.0). -* The prebuild Realm.xcframework for SwiftPM now has all platforms other than - visionOS built with Xcode 14 to comply with app store rules - ([#8339](https://github.com/realm/realm-swift/issues/8339), since 10.42.0). -* Fix visionOS compilation with Xcode beta 7. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 7. - -10.42.0 Release notes (2023-07-30) -============================================================= - -### Enhancements - -* Add support for building for visionOS and add Xcode 15 binaries to the - release package. visionOS currently requires installing Realm via either - Swift Package Manager or by using a XCFramework as CocoaPods and Carthage do - not yet support it. -* Zips compatible with SPM's `.binaryTarget()` are now published as part of the - releases on Github. -* Prebuilt XCFrameworks are now built with LTO enabled. This has insignificant - performance benefits, but cuts the size of the library by ~15%. - -### Fixed - -* Fix nested properties observation on a `Projections` not notifying when there is a property change. - ([#8276](https://github.com/realm/realm-swift/issues/8276), since v10.34.0). -* Fix undefined symbol error for `UIKit` when linking Realm to a framework using SPM. - ([#8308](https://github.com/realm/realm-swift/issues/8308), since v10.41.0) -* If the app crashed at exactly the wrong time while opening a freshly - compacted Realm the file could be left in an invalid state - ([Core #6807](https://github.com/realm/realm-core/pull/6807), since v10.33.0). -* Sync progress for DOWNLOAD messages was sometimes stored incorrectly, - resulting in an extra round trip to the server. - ([Core #6827](https://github.com/realm/realm-core/issues/6827), since v10.31.0) - -### Breaking Changes - -* Legacy non-xcframework Carthage installations are no longer supported. Please - ensure you are using `--use-xcframeworks` if installing via Carthage. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 5. - -### Internal - -* Upgraded realm-core from 13.17.0 to 13.17.1 -* Release packages were being uploaded to several static.realm.io URLs which - are no longer linked to anywhere. These are no longer being updated, and - release packages are now only being uploaded to Github. - -10.41.1 Release notes (2023-07-17) -============================================================= - -### Enhancements - -* Filesystem errors now include more information in the error message. -* Sync connection and session reconnect timing/backoff logic has been reworked - and unified into a single implementation. Previously some categories of errors - would cause an hour-long wait before attempting to reconnect, while others - would use an exponential backoff strategy. All errors now result in the sync - client waiting for 1 second before retrying, doubling the wait after each - subsequent failure up to a maximum of five minutes. If the cause of the error - changes, the backoff will be reset. If the sync client voluntarily disconnects, - no backoff will be used. ([Core #6526]((https://github.com/realm/realm-core/pull/6526))) - -### Fixed - -* Removed warnings for deprecated APIs internal use. - ([#8251](https://github.com/realm/realm-swift/issues/8251), since v10.39.0) -* Fix an error during async open and client reset if properties have been added - to the schema. This fix also applies to partition-based to flexible sync - migration if async open is used. ([Core #6707](https://github.com/realm/realm-core/issues/6707), since v10.28.2) - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 4. - -### Internal - -* Upgraded realm-core from 13.15.1 to 13.17.0 -* The location where prebuilt core binaries are published has changed slightly. - If you are using `REALM_BASE_URL` to mirror the binaries, you may need to - adjust your mirroring logic. - -10.41.0 Release notes (2023-06-26) -============================================================= - -### Enhancements - -* Add support for multiplexing sync connections. When enabled (the default), a single - connection is used per sync user rather than one per synchronized Realm. This - reduces resource consumption when multiple Realms are opened and will - typically improve performance ([PR #8282](https://github.com/realm/realm-swift/pull/8282)). -* Sync timeout options can now be set on `RLMAppConfiguration` along with the - other app-wide configuration settings ([PR #8282](https://github.com/realm/realm-swift/pull/8282)). - -### Fixed - -* Import as `RLMRealm_Private.h` as a module would cause issues when using Realm as a subdependency. - ([#8164](https://github.com/realm/realm-swift/issues/8164), since 10.37.0) -* Disable setting a custom logger by default on the sync client when the sync manager is created. - This was overriding the default logger set using `RLMLogger.defaultLogger`. (since v10.39.0). - -### Breaking Changes - -* The `RLMSyncTimeouts.appConfiguration` property has been removed. This was an - unimplemented read-only property which did not make any sense on the - containing type ([PR #8282](https://github.com/realm/realm-swift/pull/8282)). - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 2. - -### Internal - -* Upgraded realm-core from 13.15.0 to 13.15.1 - -10.40.2 Release notes (2023-06-09) -============================================================= - -### Enhancements - -* `Actor.preconditionIsolated()` is now used for runtime actor checking when - available (i.e. building with Xcode 15 and running on iOS 17) rather than the - less reliable workaround. - -### Fixed - -* If downloading the fresh Realm file failed during a client reset on a - flexible sync Realm, the sync client would crash the next time the Realm was - opened. ([Core #6494](https://github.com/realm/realm-core/issues/6494), since v10.28.2) -* If the order of properties in the local class definitions did not match the - order in the server-side schema, the before-reset Realm argument passed to a - client reset handler would have an invalid schema and likely crash if any - data was read from it. ([Core #6693](https://github.com/realm/realm-core/issues/6693), since v10.40.0) - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 1. - -### Internal - -* Upgraded realm-core from 13.13.0 to 13.15.0. -* The prebuilt library used for CocoaPods installations is now built with Xcode - 14. This should not have any observable effects other than the download being - much smaller due to no longer including bitcode. - -10.40.1 Release notes (2023-06-06) -============================================================= - -### Enhancements - -* Fix compilation with Xcode 15. Note that iOS 12 is the minimum supported - deployment target when using Xcode 15. -* Switch to building the Carthage release with Xcode 14.3.1. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 1. - -### Internal - -* Overhauled SDK metrics collection to better drive future development efforts. - -10.40.0 Release notes (2023-05-26) -============================================================= - -Drop support for Xcode 13 and add Xcode 14.3.1. Xcode 14.1 is now the minimum -supported version. - -### Enhancements - -* Adjust the error message for private `Object` subclasses and subclasses - nested inside other types to explain how to make them work rather than state - that it's impossible. ([#5662](https://github.com/realm/realm-cocoa/issues/5662)). -* Improve performance of SectionedResults. With a single section it is now ~10% - faster, and the runtime of sectioning no longer scales significantly with - section count, giving >100% speedups when there are large numbers of sections - ([Core #6606](https://github.com/realm/realm-core/pull/6606)). -* Very slightly improve performance of runtime thread checking on the main - thread. ([Core #6606](https://github.com/realm/realm-core/pull/6606)) - -### Fixed - -* Allow support for implicit boolean queries on Swift's Type Safe Queries API - ([#8212](https://github.com/realm/realm-swift/issues/8212)). -* Fixed a fatal error (reported to the sync error handler) during client reset - or automatic partition-based to flexible sync migration if the reset has been - triggered during an async open and the schema being applied has added new - classes. Due to this bug automatic flexibly sync migration has been disabled - for older releases and this is now the minimum version required. - ([#6601](https://github.com/realm/realm-core/issues/6601), since automatic - client resets were introduced in v10.25.0) -* Dictionaries sometimes failed to map unresolved links to nil. If the target - of a link in a dictionary was deleted by another sync client, reading that - field from the dictionary would sometimes give an invalid object rather than - nil. In addition, queries on dictionaries would sometimes have incorrect - results. ([Core #6644](https://github.com/realm/realm-core/pull/6644), since v10.8.0) -* Older versions of Realm would sometimes fail to properly mark objects as - being the target of an incoming link from another object. When this happened, - deleting the target object would hit an assertion failure due to the - inconsistent state. We now reconstruct a valid state rather than crashing. - ([Core #6585](https://github.com/realm/realm-core/issues/6585), since v5.0.0) -* Fix several UBSan failures which did not appear to result in functional bugs - ([Core #6649](https://github.com/realm/realm-core/pull/6649)). -* Using both synchronous and asynchronous transactions on the same thread or - scheduler could hit the assertion failure "!realm.is_in_transaction()" if one - of the callbacks for an asynchronous transaction happened to be scheduled - during a synchronous transaction - ([Core #6659](https://github.com/realm/realm-core/issues/6659), since v10.26.0) -* The stored deployment location for Apps was not being updated correctly after - receiving a redirect response from the server, resulting in every connection - attempting to connect to the old URL and getting redirected rather than only - the first connection after the deployment location changed. - ([Core #6630](https://github.com/realm/realm-core/issues/6630), since v10.38.2) - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-14.3.1. - -### Internal - -* Upgraded realm-core from 13.10.1 to 13.13.0. - -10.39.1 Release notes (2023-05-05) -============================================================= - -### Enhancements - -* New notifiers can now be registered in write transactions until changes have - actually been made in the write transaction. This makes it so that new - notifications can be registered inside change notifications triggered by - beginning a write transaction (unless a previous callback performed writes). - ([#4818](https://github.com/realm/realm-swift/issues/4818)). -* Reduce the memory footprint of an automatic (discard or recover) client reset - when there are large incoming changes from the server. - ([Core #6567](https://github.com/realm/realm-core/issues/6567)). - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from 13.10.0 to 13.10.1. - -10.39.0 Release notes (2023-05-03) -============================================================= - -### Enhancements - -* Add support for actor-isolated Realms, opened with `try await Realm(actor: actor)`. - - Rather than being confined to the current thread or a dispatch queue, - actor-isolated Realms are isolated to an actor. This means that they can be - used from any thread as long as it's within a function isolated to that - actor, and they remain valid over suspension points where a task may hop - between threads. Actor-isolated Realms can be used with either global or - local actors: - - ```swift - @MainActor function mainThreadFunction() async throws { - // These are identical: the async init continues to produce a - // MainActor-confined Realm if no actor is supplied - let realm1 = try await Realm() - let realm2 = try await Realm(MainActor.shared) - } - - // A simple example of a custom global actor - @globalActor actor BackgroundActor: GlobalActor { - static var shared = BackgroundActor() - } - - @BackgroundActor backgroundThreadFunction() async throws { - // Explicitly specifying the actor is required for everything but MainActor - let realm = try await Realm(actor: BackgroundActor.shared) - try await realm.write { - _ = realm.create(MyObject.self) - } - // Thread-confined Realms would sometimes throw an exception here, as we - // may end up on a different thread after an `await` - print("\(realm.objects(MyObject.self).count)") - } - - actor MyActor { - // An implicitly-unwrapped optional is used here to let us pass `self` to - // `Realm(actor:)` within `init` - var realm: Realm! - init() async throws { - realm = try await Realm(actor: self) - } - - var count: Int { - realm.objects(MyObject.self).count - } - - func create() async throws { - try await realm.asyncWrite { - realm.create(MyObject.self) - } - } - } - - // This function isn't isolated to the actor, so each operation has to be async - func createObjects() async throws { - let actor = try await MyActor() - for _ in 0..<5 { - await actor.create() - } - print("\(await actor.count)") - } - - // In an isolated function, an actor-isolated Realm can be used synchronously - func createObjects(in actor: isolated MyActor) async throws { - await actor.realm.write { - actor.realm.create(MyObject.self) - } - print("\(actor.realm.objects(MyObject.self).count)") - } - ``` - - Actor-isolated Realms come with a more convenient syntax for asynchronous - writes. `try await realm.write { ... }` will suspend the current task, - acquire the write lock without blocking the current thread, and then invoke - the block. The actual data is then written to disk on a background thread, - and the task is resumed once that completes. As this does not block the - calling thread while waiting to write and does not perform i/o on the calling - thread, this will often be safe to use from `@MainActor` functions without - blocking the UI. Sufficiently large writes may still benefit from being done - on a background thread. - - Asynchronous writes are only supported for actor-isolated Realms or in - `@MainActor` functions. - - Actor-isolated Realms require Swift 5.8 (Xcode 14.3). Enabling both strict - concurrency checking (`SWIFT_STRICT_CONCURRENCY=complete` in Xcode) and - runtime actor data race detection (`OTHER_SWIFT_FLAGS=-Xfrontend - -enable-actor-data-race-checks`) is strongly recommended when using - actor-isolated Realms. -* Add support for automatic partition-based to flexible sync migration. - Connecting to a server-side app configured to use flexible sync with a - client-side partition-based sync configuration is now supported, and will - automatically create the appropriate flexible sync subscriptions to subscribe - to the requested partition. This allows changing the configuration on the - server from partition-based to flexible without breaking existing clients. - ([Core #6554](https://github.com/realm/realm-core/issues/6554)) -* Now you can use an array `[["_id": 1], ["breed": 0]]` as sorting option for a - MongoCollection. This new API fixes the issue where the resulting documents - when using more than one sort parameter were not consistent between calls. - ([#7188](https://github.com/realm/realm-swift/issues/7188), since v10.0.0). -* Add support for adding a user created default logger, which allows implementing your own logging logic - and the log threshold level. - You can define your own logger creating an instance of `Logger` and define the log function which will be - invoked whenever there is a log message. - - ```swift - let logger = Logger(level: .all) { level, message in - print("Realm Log - \(level): \(message)") - } - ``` - - Set this custom logger as Realm default logger using `Logger.shared`. - ```swift - Logger.shared = logger - ``` -* It is now possible to change the default log threshold level at any point of the application's lifetime. - ```swift - Logger.shared.logLevel = .debug - ``` - This will override the log level set anytime before by a user created logger. -* We have set `.info` as the default log threshold level for Realm. You will now see some - log message in your console. To disable use `Logger.shared.level = .off`. - -### Fixed - -* Several schema initialization functions had incorrect `@MainActor` - annotations, resulting in runtime warnings if the first time a Realm was - opened was on a background thread - ([#8222](https://github.com/realm/realm-swift/issues/8222), since v10.34.0). - -### Deprecations - -* `App.SyncManager.logLevel` and `App.SyncManager.logFunction` are deprecated in favour of - setting a default logger. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from v13.9.4 to v13.10.0. - -10.38.3 Release notes (2023-04-28) -============================================================= - -### Enhancements - -* Improve performance of cancelling a write transactions after making changes. - If no KVO observers are used this is now constant time rather than taking - time proportional to the number of changes to be rolled back. Cancelling a - write transaction with KVO observers is 10-20% faster. ([Core PR #6513](https://github.com/realm/realm-core/pull/6513)). - -### Fixed - -* Performing a large number of queries without ever performing a write resulted - in steadily increasing memory usage, some of which was never fully freed due - to an unbounded cache ([#7978](https://github.com/realm/realm-swift/issues/7978), since v10.27.0). - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from 13.9.3 to 13.9.4 - -10.38.2 Release notes (2023-04-25) -============================================================= - -### Enhancements - -* Improve performance of equality queries on a non-indexed AnyRealmValue - property by about 30%. ([Core #6506](https://github.com/realm/realm-core/issues/6506)) - -### Fixed - -* SSL handshake errors were treated as fatal errors rather than errors which - should be retried. ([Core #6434](https://github.com/realm/realm-core/issues/6434), since v10.35.0) - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from 13.9.0 to 13.9.3. - -10.38.1 Release notes (2023-04-25) -============================================================= - -### Fixed - -* The error handler set on EventsConfiguration was not actually used (since v10.26.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -10.38.0 Release notes (2023-03-31) -============================================================= - -Switch to building the Carthage release with Xcode 14.3. - -### Enhancements - -* Add Xcode 14.3 binaries to the release package. Note that CocoaPods 1.12.0 - does not support Xcode 14.3. -* Add support for sharing encrypted Realms between multiple processes. - ([Core #1845](https://github.com/realm/realm-core/issues/1845)) - -### Fixed - -* Fix a memory leak reported by Instruments on `URL.path` in - `Realm.Configuration.fileURL` when using a string partition key in Partition - Based Sync ([#8195](https://github.com/realm/realm-swift/pull/8195)), since v10.0.0). -* Fix a data race in version management. If one thread committed a write - transaction which increased the number of live versions above the previous - highest seen during the current session at the same time as another thread - began a read, the reading thread could read from a no-longer-valid memory - mapping. This could potentially result in strange crashes when opening, - refreshing, freezing or thawing a Realm - ([Core #6411](https://github.com/realm/realm-core/pull/6411), since v10.35.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from 13.8.0 to 13.9.0. - -10.37.2 Release notes (2023-03-29) -============================================================= - -### Fixed - -* Copying a `RLMRealmConfiguration` failed to copy several fields. This - resulted in migrations being passed the incorrect object type in Swift when - using the default configuration (since v10.34.0) or async open (since - v10.37.0). This also broke using the Events API in those two scenarios (since - v10.26.0 for default configuration and v10.37.0 for async open). ([#8190](https://github.com/realm/realm-swift/issues/8190)) - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -10.37.1 Release notes (2023-03-27) -============================================================= - -### Enhancements - -* Performance improvement for the following queries ([Core #6376](https://github.com/realm/realm-core/issues/6376)): - * Significant (~75%) improvement when counting (`Results.count`) the number - of exact matches (with no other query conditions) on a - string/int/UUID/ObjectID property that has an index. This improvement - will be especially noticiable if there are a large number of results - returned (duplicate values). - * Significant (~99%) improvement when querying for an exact match on a Date - property that has an index. - * Significant (~99%) improvement when querying for a case insensitive match - on an AnyRealmValue property that has an index. - * Moderate (~25%) improvement when querying for an exact match on a Bool - property that has an index. - * Small (~5%) improvement when querying for a case insensitive match on an - AnyRealmValue property that does not have an index. - -### Fixed - -* Add missing `@Sendable` annotations to several sync and app services related - callbacks ([PR #8169](https://github.com/realm/realm-swift/pull/8169), since v10.34.0). -* Fix some bugs in handling task cancellation for async Realm init. Some very - specific timing windows could cause crashes, and the download would not be - cancelled if the Realm was already open ([PR #8178](https://github.com/realm/realm-swift/pull/8178), since v10.37.0). -* Fix a crash when querying an AnyRealmValue property with a string operator - (contains/like/beginswith/endswith) or with case insensitivity. - ([Core #6376](https://github.com/realm/realm-core/issues/6376), since v10.8.0) -* Querying for case-sensitive equality of a string on an indexed AnyRealmValue - property was returning case insensitive matches. For example querying for - `myIndexedAny == "Foo"` would incorrectly match on values of "foo" or "FOO" etc. - ([Core #6376](https://github.com/realm/realm-core/issues/6376), since v10.8.0) -* Adding an index to an AnyRealmValue property when objects of that type - already existed would crash with an assertion. - ([Core #6376](https://github.com/realm/realm-core/issues/6376), since v10.8.0). -* Fix a bug that may have resulted in arrays being in different orders on - different devices. Some cases of “Invalid prior_size” may be fixed too. - ([Core #6191](https://github.com/realm/realm-core/issues/6191), since v10.25.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -### Internal - -* Upgraded realm-core from 13.6.0 to 13.8.0 - -10.37.0 Release notes (2023-03-09) -============================================================= - -### Enhancements - -* `MongoCollection.watch().subscribe(on:)` now supports any swift Scheduler - rather than only dispatch queues ([PR #8131](https://github.com/realm/realm-swift/pull/8130)). -* Add an async sequence wrapper for `MongoCollection.watch()`, allowing you to - do `for try await change in collection.changeEvents { ... }` - ([PR #8131](https://github.com/realm/realm-swift/pull/8130)). -* The internals of error handling and reporting have been significantly - reworked. The visible effects of this are that some errors which previously - had unhelpful error messages now include more detail about what went wrong, - and App errors now expose a much more complete set of error codes - ([PR #8002](https://github.com/realm/realm-swift/pull/8002)). -* Expose compensating write error information. When the server rejects a - modification made by the client (such as if the user does not have the - required permissions), a `SyncError` is delivered to the sync error handler - with the code `.writeRejected` and a non-nil `compensatingWriteInfo` field - which contains information about what was rejected and why. This information - is intended primarily for debugging and logging purposes and may not have a - stable format. ([PR #8002](https://github.com/realm/realm-swift/pull/8002)) -* Async `Realm.init()` now handles Task cancellation and will cancel the async - open if the Task is cancelled ([PR #8148](https://github.com/realm/realm-swift/pull/8148)). -* Cancelling async opens now has more consistent behavior. The previously - intended and documented behavior was that cancelling an async open would - result in the callback associated with the specific task that was cancelled - never being called, and all other pending callbacks would be invoked with an - ECANCELED error. This never actually worked correctly, and the callback which - was not supposed to be invoked at all sometimes would be. We now - unconditionally invoke all of the exactly once, passing ECANCELED to all of - them ([PR #8148](https://github.com/realm/realm-swift/pull/8148)). - -### Fixed - -* `UserPublisher` incorrectly bounced all notifications to the main thread instead - of setting up the Combine publisher to correctly receive on the main thread. - ([#8132](https://github.com/realm/realm-swift/issues/8132), since 10.21.0) -* Fix warnings when building with Xcode 14.3 beta 2. -* Errors in async open resulting from invalid queries in `initialSubscriptions` - would result in the callback being invoked with both a non-nil Realm and a - non-nil Error even though the Realm was in an invalid state. Now only the - error is passed to the callback ([PR #8148](https://github.com/realm/realm-swift/pull/8148), since v10.28.0). -* Converting a local realm to a synced realm would crash if an embedded object - was null ([Core #6294](https://github.com/realm/realm-core/issues/6294), since v10.22.0). -* Subqueries on indexed properties performed extremely poorly. ([Core #6327](https://github.com/realm/realm-core/issues/6327), since v5.0.0) -* Fix a crash when a SSL read successfully read a non-zero number of bytes and - also reported an error. ([Core #5435](https://github.com/realm/realm-core/issues/5435), since 10.0.0) -* The sync client could get stuck in an infinite loop if the server sent an - invalid changeset which caused a transform error. This now results in a - client reset instead. ([Core #6051](https://github.com/realm/realm-core/issues/6051), since v10.0.0) -* Strings in queries which contained any characters which required multiple - bytes when encoded as utf-8 were incorrectly encoded as binary data when - serializing the query to send it to the server for a flexible sync - subscription, resulting the server rejecting the query - ([Core #6350](https://github.com/realm/realm-core/issues/6350), since 10.22.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -### Internal - -* Upgraded realm-core from 13.4.1 to 13.6.0 - -10.36.0 Release notes (2023-02-15) -============================================================= - -### Enhancements - -* Add support for multiple overlapping or nested event scopes. - `Events.beginScope()` now returns a `Scope` object which is used to commit or - cancel that scope, and if more than one scope is active at a time events are - reported to all active scopes. - -### Fixed - -* Fix moving `List` items to a higher index in SwiftUI results in wrong destination index - ([#7956](https://github.com/realm/realm-swift/issues/7956), since v10.6.0). -* Using the `searchable` view modifier with `@ObservedResults` in iOS 16 would - cause the collection observation subscription to cancel. - ([#8096](https://github.com/realm/realm-swift/issues/8096), since 10.21.0) -* Client reset with recovery would sometimes crash if the recovery resurrected - a dangling link ([Core #6292](https://github.com/realm/realm-core/issues/6292), since v10.32.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -### Internal - -* Upgraded realm-core from 13.4.0 to 13.4.1 - -10.35.1 Release notes (2023-02-10) -============================================================= - -### Fixed - -* Client reset with recovery would crash if a client reset occurred the very - first time the Realm was opened with async open. The client reset callbacks - are now not called if the Realm had never been opened before - ([PR #8125](https://github.com/realm/realm-swift/pull/8125), since 10.32.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -10.35.0 Release notes (2023-02-07) -============================================================= - -This version bumps the Realm file format version to 23. Realm files written by -this version cannot be read by older versions of Realm. - -### Enhancements - -* The Realm file is now automatically shrunk if the file size is larger than - needed to store all of the data. ([Core PR #5755](https://github.com/realm/realm-core/pull/5755)) -* Pinning old versions (either with frozen Realms or with Realms on background - threads that simply don't get refreshed) now only prevents overwriting the - data needed by that version, rather than the data needed by that version and - all later versions. In addition, frozen Realms no longer pin the transaction - logs used to drive change notifications. This mostly eliminates the file size - growth caused by pinning versions. ([Core PR #5440](https://github.com/realm/realm-core/pull/5440)) -* Rework how Dictionaries/Maps are stored in the Realm file. The new design uses - less space and is typically significantly faster. This changes the iteration - order of Maps, so any code relying on that may be broken. We continue - to make no guarantees about iteration order on Maps ([Core #5764](https://github.com/realm/realm-core/issues/5764)). -* Improve performance of freezing Realms ([Core PR #6211](https://github.com/realm/realm-core/pull/6211)). - -### Fixed - -* Fix a crash when using client reset with recovery and flexible sync with a - single subscription ([Core #6070](https://github.com/realm/realm-core/issues/6070), since v10.28.2) -* Encrypted Realm files could not be opened on devices with a larger page size - than the one which originally wrote the file. - ([#8030](https://github.com/realm/realm-swift/issues/8030), since v10.32.1) -* Creating multiple flexible sync subscriptions at once could hit an assertion - failure if the server reported an error for any of them other than the last - one ([Core #6038](https://github.com/realm/realm-core/issues/6038), since v10.21.1). -* `Set` and `List` considered a string and binary - data containing that string encoded as UTF-8 to be equivalent. This could - result in a List entry not changing type on assignment and for the client be - inconsistent with the server if a string and some binary data with equivalent - content was inserted from Atlas. - ([Core #4860](https://github.com/realm/realm-core/issues/4860) and - [Core #6201](https://github.com/realm/realm-core/issues/6201), since v10.8.0) -* Querying for NaN on Decimal128 properties did not match any objects - ([Core #6182](https://github.com/realm/realm-core/issues/6182), since v10.8.0). -* When client reset with recovery is used and the recovery did not need to - make any changes to the local Realm, the sync client could incorrectly think - the recovery failed and report the error "A fatal error occured during client - reset: 'A previous 'Recovery' mode reset from did not succeed, - giving up on 'Recovery' mode to prevent a cycle'". - ([Core #6195](https://github.com/realm/realm-core/issues/6195), since v10.32.0) -* Fix a crash when using client reset with recovery and flexible sync with a - single subscription ([Core #6070](https://github.com/realm/realm-core/issues/6070), since v10.28.2) -* Writing to newly in-view objects while a flexible sync bootstrap was in - progress would not synchronize those changes to the server - ([Core #5804](https://github.com/realm/realm-core/issues/5804), since v10.21.1). -* If a client reset with recovery or discard local was interrupted while the - "fresh" realm was being downloaded, the sync client could crash with a - MultpleSyncAgents exception ([Core #6217](https://github.com/realm/realm-core/issues/6217), since v10.25.0). -* Sharing Realm files between a Catalyst app and Realm Studio did not properly - synchronize access to the Realm file ([Core #6258](https://github.com/realm/realm-core/pull/6258), since v10.0.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -### Internal - -* Upgraded realm-core from 12.13.0 to 13.4.0 - -10.34.1 Release notes (2023-01-20) -============================================================= - -### Fixed - -* Add some missing `@preconcurrency` annotations which lead to build failures - with Xcode 14.0 when importing via SPM or CocoaPods - ([#8104](https://github.com/realm/realm-swift/issues/8104), since v10.34.0). - -### Compatibility - -* Realm Studio: 11.0.0 - 12.0.0. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -10.34.0 Release notes (2023-01-13) -============================================================= - -Swift 5.5 is no longer supported. Swift 5.6 (Xcode 13.3) is now the minimum -supported version. - -The prebuilt binary for Carthage is now build with Xcode 14.2. - -### Enhancements - -* Improve performance of creating Projection objects and of change - notifications on projections ([PR #8050](https://github.com/realm/realm-swift/pull/8050)). -* Allow initialising any sync configuration with `cancelAsyncOpenOnNonFatalErrors`. -* Improve performance of Combine value publishers which do not use the - object/collection changesets a little. -* All public types have been audited for sendability and are now marked as - Sendable when applicable. A few types which were incidentally not thread-safe - but make sense to use from multiple threads are now thread-safe. -* Add support for building Realm with strict concurrency checking enabled. - -### Fixed - -* Fix bad memory access exception that can occur when watching change streams. - [PR #8039](https://github.com/realm/realm-swift/pull/8039). -* Object change notifications on projections only included the first projected - property for each source property ([PR #8050](https://github.com/realm/realm-swift/pull/8050), since v10.21.0). -* `@AutoOpen` failed to open flexible sync Realms while offline - ([#7986](https://github.com/realm/realm-swift/issues/7986), since v10.27.0). -* Fix "Publishing changes from within view updates is not allowed" warnings - when using `@ObservedResults` or `@ObservedSectionedResults` - ([#7908](https://github.com/realm/realm-swift/issues/7908)). -* Fix "Publishing changes from within view updates is not allowed" warnings - when using `@AutoOpen` or `@AsyncOpen`. - ([#7908](https://github.com/realm/realm-swift/issues/7908)). -* Defer `Realm.asyncOpen` execution on `@AsyncOpen` and `@AutoOpen` property - wrappers until all the environment values are set. This will guarantee the - configuration and partition value are set set before opening the realm. - ([#7931](https://github.com/realm/realm-swift/issues/7931), since v10.12.0). -* `@ObservedResults.remove()` could delete the wrong object if a write on a - background thread which changed the index of the object being removed - occurred at a very specific time (since v10.6.0). - -### Compatibility - -* Realm Studio: 11.0.0 - 12.0.0. 13.0.0 is currently incompatible. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -10.33.0 Release notes (2022-12-01) -============================================================= - -### Enhancements - -* Flexible sync subscription state will change to - `SyncSubscriptionState.pending` (`RLMSyncSubscriptionStatePending`) while - waiting for the server to have sent all pending history after a bootstrap and - before marking a subscription as Complete. - ([#5795](https://github.com/realm/realm-core/pull/5795)) -* Add custom column names API, which allows to set a different column name in the realm - from the one used in your object declaration. - ```swift - class Person: Object { - @Persisted var firstName: String - @Persisted var birthDate: Date - @Persisted var age: Int - - override class public func propertiesMapping() -> [String: String] { - ["firstName": "first_name", - "birthDate": "birth_date"] - } - } - ``` - This is very helpful in cases where you want to name a property differently - from your `Device Sync` JSON schema. - This API is only available for old and modern object declaration syntax on the - `RealmSwift` SDK. -* Flexible sync bootstraps now apply 1MB of changesets per write transaction - rather than applying all of them in a single write transaction. - ([Core PR #5999](https://github.com/realm/realm-core/pull/5999)). - -### Fixed - -* Fix a race condition which could result in "operation cancelled" errors being - delivered to async open callbacks rather than the actual sync error which - caused things to fail ([Core PR #5968](https://github.com/realm/realm-core/pull/5968), since the introduction of async open). -* Fix database corruption issues which could happen if an application was - terminated at a certain point in the process of comitting a write - transaciton. ([Core PR #5993](https://github.com/realm/realm-core/pull/5993), since v10.21.1) -* `@AsyncOpen` and `@AutoOpen` would begin and then cancel a second async open - operation ([PR #8038](https://github.com/realm/realm-swift/pull/8038), since v10.12.0). -* Changing the search text when using the searchable SwiftUI extension would - trigger multiple updates on the View for each change - ([PR #8038](https://github.com/realm/realm-swift/pull/8038), since v10.19.0). -* Changing the filter or search properties of an `@ObservedResults` or - `@ObservedSectionedResults` would trigger up to three updates on the View - ([PR #8038](https://github.com/realm/realm-swift/pull/8038), since v10.6.0). -* Fetching a user's profile while the user logs out would result in an - assertion failure. ([Core PR #6017](https://github.com/realm/realm-core/issues/5571), since v10.8.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -### Internal - -* Upgraded realm-core from 12.11.0 to 12.13.0 - -10.32.3 Release notes (2022-11-10) -============================================================= - -### Fixed - -* Fix name lookup errors when importing Realm Swift built in library evolution - mode (([#8014](https://github.com/realm/realm-swift/issues/8014)). -* The prebuilt watchOS library in the objective-c release package was missing - an arm64 slice. The Swift release package was uneffected - ([PR #8016](https://github.com/realm/realm-swift/pull/8016)). -* Fix issue where `RLMUserAPIKey.key`/`UserAPIKey.key` incorrectly returned the name of the API - key instead of the key itself. ([#8021](https://github.com/realm/realm-swift/issues/8021), since v10.0.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -10.32.2 Release notes (2022-11-01) -============================================================= - -Switch to building the Carthage release with Xcode 14.1. - -### Fixed - -* Fix linker errors when building a release build with Xcode 14.1 when - installing via SPM ([#7995](https://github.com/realm/realm-swift/issues/7995)). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -10.32.1 Release notes (2022-10-25) -============================================================= - -### Enhancements - -* Improve performance of client reset with automatic recovery and converting - top-level tables into embedded tables ([Core #5897](https://github.com/realm/realm-core/pull/5897)). -* `Realm.Error` is now a typealias for `RLMError` rather than a - manually-defined version of what the automatic bridging produces. This should - have no effect on existing working code, but the manual definition was - missing a few things supplied by the automatic bridging. -* Some sync errors sent by the server include a link to the server-side logs - associated with that error. This link is now exposed in the `serverLogURL` - property on `SyncError` (or `RLMServerLogURLKey` userInfo field when using NSError). - -### Fixed - -* Many sync and app errors were reported using undocumented internal error - codes and/or domains and could not be progammatically handled. Some notable - things which now have public error codes instead of unstable internal ones: - - `Realm.Error.subscriptionFailed`: The server rejected a flexible sync subscription. - - `AppError.invalidPassword`: A login attempt failed due to a bad password. - - `AppError.accountNameInUse`: A registration attempt failed due to the account name being in use. - - `AppError.httpRequestFailed`: A HTTP request to Atlas App Services - completed with an error HTTP code. The failing code is available in the - `httpStatusCode` property. - - Many other less common error codes have been added to `AppError`. - - All sync errors other than `SyncError.clientResetError` reported incorrect - error codes. - (since v10.0.0). -* `UserAPIKey.objectId` was incorrectly bridged to Swift as `RLMObjectId` to - `ObjectId`. This may produce warnings about an unneccesary cast if you were - previously casting it to the correct type (since v10.0.0). -* Fixed an assertion failure when observing change notifications on a sectioned - result, if the first modification was to a linked property that did not cause - the state of the sections to change. - ([Core #5912](https://github.com/realm/realm-core/issues/5912), - since the introduction of sectioned results in v10.29.0) -* Fix a use-after-free if the last external reference to an encrypted - synchronized Realm was closed between when a client reset error was received - and when the download of the new Realm began. - ([Core #5949](https://github.com/realm/realm-core/pull/5949), since 10.28.4). -* Fix an assertion failure during client reset with recovery when recovering - a list operation on an embedded object that has a link column in the path - prefix to the list from the top level object. - ([Core #5957](https://github.com/realm/realm-core/issues/5957), - since introduction of automatic recovery in v10.32.0). -* Creating a write transaction which is rejected by the server due to it - exceeding the maximum transaction size now results in a client reset error - instead of synchronization breaking and becoming stuck forever - ([Core #5209](https://github.com/realm/realm-core/issues/5209), since v10). -* Opening an unencrypted file with an encryption key would sometimes report a - misleading error message that indicated that the problem was something other - than a decryption failure ([Core #5915](https://github.com/realm/realm-core/pull/5915), since 0.89.0). -* Fix a rare deadlock which could occur when closing a synchronized Realm - immediately after committing a write transaction when the sync worker thread - has also just finished processing a changeset from the server - ([Core #5948](https://github.com/realm/realm-core/pull/5948)). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.0.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -### Internal - -* Upgraded realm-core from 12.9.0 to 12.11.0. - -10.32.0 Release notes (2022-10-10) -============================================================= - -### Enhancements - -* Add `.recoverUnsyncedChanges` (`RLMClientResetModeRecoverUnsyncedChanges`) and -`.recoverOrDiscardUnsyncedChanges` (`RLMClientResetModeRecoverOrDiscardUnsyncedChanges`) behaviors to `ClientResetMode` (`RLMClientResetMode`). - - The newly added recover modes function by downloading a realm which reflects the latest - state of the server after a client reset. A recovery process is run locally in an - attempt to integrate the server state with any local changes from before the - client reset occurred. - The changes are integrated with the following rules: - 1. Objects created locally that were not synced before client reset, will be integrated. - 2. If an object has been deleted on the server, but was modified on the client, the delete takes precedence and the update is discarded. - 3. If an object was deleted on the client, but not the server, then the client delete instruction is applied. - 4. In the case of conflicting updates to the same field, the client update is applied. - - The client reset process will fallback to `ClientResetMode.discardUnsyncedChanges` if the recovery process fails in `.recoverOrDiscardUnsyncedChanges`. - - The client reset process will fallback to `ClientResetMode.manual` if the recovery process fails in `.recoverUnsyncedChanges`. - - The two new swift recovery modes support client reset callbacks: `.recoverUnsyncedChanges(beforeReset: ((Realm) -> Void)? = nil, afterReset: ((Realm, Realm) -> Void)? = nil)`. - - The two new Obj-C recovery modes support client reset callbacks in `notifyBeforeReset` - and `notifyAfterReset`for both `[RLMUser configurationWithPartitionValue]` and `[RLMUser flexibleSyncConfigurationWithClientResetMode]` - For more detail on client reset callbacks, see `ClientResetMode`, `RLMClientResetBeforeBlock`, - `RLMClientResetAfterBlock`, and the 10.25.0 changelog entry. -* Add two new additional interfaces to define a manual client reset handler: - - Add a manual callback handler to `ClientResetMode.manual` -> `ClientResetMode.manual(ErrorReportingBlock? = nil)`. - - Add the `RLMSyncConfiguration.manualClientResetHandler` property (type `RLMSyncErrorReportingBlock`). - - These error reporting blocks are invoked in the event of a `RLMSyncErrorClientResetError`. - - See `ErrorReportingBlock` (`RLMSyncErrorReportingBlock`), and `ClientResetInfo` for more detail. - - Previously, manual client resets were handled only through the `SyncManager.ErrorHandler`. You have the - option, but not the requirement, to define manual reset handler in these interfaces. - Otherwise, the `SyncManager.ErrorHandler` is still invoked during the manual client reset process. - - These new interfaces are only invoked during a `RLMSyncErrorClientResetError`. All other sync errors - are still handled in the `SyncManager.ErrorHandler`. - - See 'Breaking Changes' for information how these interfaces interact with an already existing - `SyncManager.ErrorHandler`. - -### Breaking Changes - -* The default `clientResetMode` (`RLMClientResetMode`) is switched from `.manual` (`RLMClientResetModeManual`) - to `.recoverUnsyncedChanges` (`RLMClientResetModeRecoverUnsyncedChanges`). - - If you are currently using `.manual` and continue to do so, the only change - you must explicitly make is designating manual mode in - your `Realm.Configuration.SyncConfiguration`s, since they will now default to `.recoverUnsyncedChanges`. - - You may choose to define your manual client reset handler in the newly - introduced `manual(ErrorReportingBlock? = nil)` - or `RLMSyncConfiguration.manualClientResetHandler`, but this is not required. - The `SyncManager.errorHandler` will still be invoked during a client reset if - no callback is passed into these new interfaces. - -### Deprecations - -* `ClientResetMode.discardLocal` is deprecated in favor of `ClientResetMode.discardUnsyncedChanges`. - The reasoning is that the name better reflects the effect of this reset mode. There is no actual - difference in behavior. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.0.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -10.31.0 Release notes (2022-10-05) -============================================================= - -The prebuilt binary for Carthage is now build with Xcode 14.0.1. - -### Enhancements - -* Cut the runtime of aggregate operations on large dictionaries in half - ([Core #5864](https://github.com/realm/realm-core/pull/5864)). -* Improve performance of aggregate operations on collections of objects by 2x - to 10x ([Core #5864](https://github.com/realm/realm-core/pull/5864)). - Greatly improve the performance of sorting or distincting a Dictionary's keys - or values. The most expensive operation is now performed O(log N) rather than - O(N log N) times, and large Dictionaries can see upwards of 99% reduction in - time to sort. ([Core #5166](https://github.com/realm/realm-core/pulls/5166)) -* Add support for changing the deployment location for Atlas Apps. Previously - this was assumed to be immutable ([Core #5648](https://github.com/realm/realm-core/issues/5648)). -* The sync client will now yield the write lock to other threads which are - waiting to perform a write transaction even if it still has remaining work to - do, rather than always applying all changesets received from the server even - when other threads are trying to write. ([Core #5844](https://github.com/realm/realm-core/pull/5844)). -* The sync client no longer writes an unused temporary copy of the changesets - received from the server to the Realm file ([Core #5844](https://github.com/realm/realm-core/pull/5844)). - -### Fixed - -* Setting a `List` property with `Results` no longer throws an unrecognized - selector exception (since 10.8.0-beta.2) -* `RLMProgressNotificationToken` and `ProgressNotificationToken` now hold a - strong reference to the sync session, keeping it alive until the token is - deallocated or invalidated, as the other notification tokens do. - ([#7831](https://github.com/realm/realm-swift/issues/7831), since v2.3.0). -* Results permitted some nonsensical aggregate operations on column types which - do not make sense to aggregate, giving garbage results rather than reporting - an error ([Core #5876](https://github.com/realm/realm-core/pull/5876), since v5.0.0). -* Upserting a document in a Mongo collection would crash if the document's id - type was anything other than ObjectId (since v10.0.0). -* Fix a use-after-free when a sync session is closed and the app is destroyed - at the same time ([Core #5752](https://github.com/realm/realm-core/issues/5752), - since v10.19.0). - -### Deprecations - -* `RLMUpdateResult.objectId` has been deprecated in favor of - `RLMUpdateResult.documentId` to support reporting document ids which are not - object ids. -### Breaking Changes -* Private API `_realmColumnNames` has been renamed to a new public API - called `propertiesMapping()`. This change only affects the Swift API - and doesn't have any effects in the obj-c API. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.0.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -### Internal - -* Upgraded realm-core from 12.7.0 to 12.9.0 - -10.30.0 Release notes (2022-09-20) -============================================================= - -### Fixed - -* Incoming links from `RealmAny` properties were not handled correctly when - migrating an object type from top-level to embedded. `RealmAny` properties - currently cannot link to embedded objects. - ([Core #5796](https://github.com/realm/realm-core/pull/5796), since 10.8.0). -* `Realm.refresh()` sometimes did not actually advance to the latest version. - It attempted to be semi-non-blocking in a very confusing way which resulted - in it sometimes advancing to a newer version that is not the latest version, - and sometimes blocking until notifiers are ready so that it could advance to - the latest version. This behavior was undocumented and didn't work correctly, - so it now always blocks if needed to advance to the latest version. - ([#7625](https://github.com/realm/realm-swift/issues/7625), since v0.98.0). -* Fix the most common cause of thread priority inversions when performing - writes on the main thread. If beginning the write transaction has to wait for - the background notification calculations to complete, that wait is now done - in a QoS-aware way. ([#7902](https://github.com/realm/realm-swift/issues/7902)) -* Subscribing to link properties in a flexible sync Realm did not work due to a - mismatch between what the client sent and what the server needed. - ([Core #5409](https://github.com/realm/realm-core/issues/5409)) -* Attempting to use `AsymmetricObject` with partition-based sync now reports a - sensible error much earlier in the process. Asymmetric sync requires using - flexible sync. ([Core #5691](https://github.com/realm/realm-core/issues/5691), since 10.29.0). -* Case-insensitive but diacritic-sensitive queries would crash on 4-byte UTF-8 - characters ([Core #5825](https://github.com/realm/realm-core/issues/5825), since v2.2.0) -* Accented characters are now handled by case-insensitive but - diacritic-sensitive queries. ([Core #5825](https://github.com/realm/realm-core/issues/5825), since v2.2.0) - -### Breaking Changes - -* `-[RLMASLoginDelegate authenticationDidCompleteWithError:]` has been renamed - to `-[RLMASLoginDelegate authenticationDidFailWithError:]` to comply with new - app store requirements. This only effects the obj-c API. - ([#7945](https://github.com/realm/realm-swift/issues/7945)) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1 - 14. - -### Internal - -* Upgraded realm-core from 12.6.0 to 12.7.0 - -10.29.0 Release notes (2022-09-09) -============================================================= - -### Enhancements - -* Add support for asymmetric sync. When a class inherits from - `AsymmetricObject`, objects created are synced unidirectionally to the server - and cannot be queried or read locally. - -```swift - class PersonObject: AsymmetricObject { - @Persisted(primaryKey: true) var _id: ObjectId - @Persisted var name: String - @Persisted var age: Int - } - - try realm.write { - // This will create the object on the server but not locally. - realm.create(PersonObject.self, value: ["_id": ObjectId.generate(), - "name": "Dylan", - "age": 20]) - } -``` -* Add ability to section a collection which conforms to `RealmCollection`, `RLMCollection`. - Collections can be sectioned by a unique key retrieved from a keyPath or a callback and will return an instance of `SectionedResults`/`RLMSectionedResults`. - Each section in the collection will be an instance of `ResultsSection`/`RLMSection` which gives access to the elements corresponding to the section key. - `SectionedResults`/`RLMSectionedResults` and `ResultsSection`/`RLMSection` have the ability to be observed. - ```swift - class DemoObject: Object { - @Persisted var title: String - @Persisted var date: Date - var firstLetter: String { - return title.first.map(String.init(_:)) ?? "" - } - } - var sectionedResults: SectionedResults - // ... - sectionedResults = realm.objects(DemoObject.self) - .sectioned(by: \.firstLetter, ascending: true) - ``` -* Add `@ObservedSectionedResults` for SwiftUI support. This property wrapper type retrieves sectioned results - from a Realm using a keyPath or callback to determine the section key. - ```swift - struct DemoView: View { - @ObservedSectionedResults(DemoObject.self, - sectionKeyPath: \.firstLetter) var demoObjects - - var body: some View { - VStack { - List { - ForEach(demoObjects) { section in - Section(header: Text(section.key)) { - ForEach(section) { object in - MyRowView(object: object) - } - } - } - } - } - } - } - ``` -* Add automatic handing for changing top-level objects to embedded objects in - migrations. Any objects of the now-embedded type which have zero incoming - links are deleted, and objects with multiple incoming links are duplicated. - This happens after the migration callback function completes, so there is no - functional change if you already have migration logic which correctly handles - this. ([Core #5737](https://github.com/realm/realm-core/pull/5737)). -* Improve performance when a new Realm file connects to the server for the - first time, especially when significant amounts of data has been written - while offline. ([Core #5772](https://github.com/realm/realm-core/pull/5772)) -* Shift more of the work done on the sync worker thread out of the write - transaction used to apply server changes, reducing how long it blocks other - threads from writing. ([Core #5772](https://github.com/realm/realm-core/pull/5772)) -* Improve the performance of the sync changeset parser, which speeds up - applying changesets from the server. ([Core #5772](https://github.com/realm/realm-core/pull/5772)) - -### Fixed - -* Fix all of the UBSan failures hit by our tests. It is unclear if any of these - manifested as visible bugs. ([Core #5665](https://github.com/realm/realm-core/pull/5665)) -* Upload completion callbacks were sometimes called before the final step of - interally marking the upload as complete, which could result in calling - `Realm.writeCopy()` from the completion callback failing due to there being - unuploaded changes. ([Core #4865](https://github.com/realm/realm-core/issues/4865)). -* Writing to a Realm stored on an exFAT drive threw the exception "fcntl() with - F_BARRIERFSYNC failed: Inappropriate ioctl for device" when a write - transaction needed to expand the file. - ([Core #5789](https://github.com/realm/realm-core/issues/5789), since 10.27.0) -* Syncing a Decimal128 with big significand could result in a crash. - ([Core #5728](https://github.com/realm/realm-core/issues/5728)) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 RC. - -### Internal - -* Upgraded realm-core from 12.5.1 to 12.6.0 - -10.28.7 Release notes (2022-09-02) -============================================================= - -### Enhancements - -* Add prebuilt binaries for Xcode 14 to the release package. - -### Fixed - -* Fix archiving watchOS release builds with Xcode 14. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 6. - -10.28.6 Release notes (2022-08-19) -============================================================= - -### Fixed - -* Fixed an issue where having realm-swift as SPM sub-target dependency leads to - missing symbols error during iOS archiving ([Core #7645](https://github.com/realm/realm-core/pull/7645)). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 5. - -### Internal - -* Upgraded realm-core from 12.5.0 to 12.5.1 - -10.28.5 Release notes (2022-08-09) -============================================================= - -### Enhancements - -* Improve performance of accessing `SubscriptionSet` properties when no writes - have been made to the Realm since the last access. - -### Fixed - -* A use-after-free could occur if a Realm with audit events enabled was - destroyed while processing an upload completion for the events Realm on a - different thread. ([Core PR #5714](https://github.com/realm/realm-core/pull/5714)) -* Opening a read-only synchronized Realm for the first time via asyncOpen did - not set the schema version, which could lead to `m_schema_version != - ObjectStore::NotVersioned` assertion failures later on. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 4. - -### Internal - -* Upgraded realm-core from 12.4.0 to 12.5.0 - -10.28.4 Release notes (2022-08-03) -============================================================= - -### Enhancements - -* Add support for building arm64 watchOS when installing Realm via CocoaPods. -* Reduce the amount of virtual address space used - ([Core #5645](https://github.com/realm/realm-core/pull/5645)). - -### Fixed - -* Fix some warnings when building with Xcode 14 - ([Core #5577](https://github.com/realm/realm-core/pull/5577)). -* Fix compilation failures on watchOS platforms which do not support thread-local storage. - ([#7694](https://github.com/realm/realm-swift/issues/7694), [#7695](https://github.com/realm/realm-swift/issues/7695) since v10.21.1) -* Fix a data race when committing a transaction while multiple threads are - waiting to begin write transactions. This appears to not have caused any - functional problems. -* Fix a data race when writing audit events which could occur if the sync - client thread was busy with other work when the event Realm was opened. -* Fix some cases of running out of virtual address space (seen/reported as mmap - failures) ([Core #5645](https://github.com/realm/realm-core/pull/5645)). -* Audit event scopes containing only write events and no read events would - occasionally throw a `BadVersion` exception when a write transaction was - committed (since v10.26.0). -* The client reset callbacks for the DiscardLocal mode would be passed invalid - Realm instances if the callback was invoked at a point where the Realm was - not otherwise open. ([Core #5654](https://github.com/realm/realm-core/pull/5654), since the introduction of DiscardLocal reset mode in v10.25.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 4. - -### Internal - -* Upgraded realm-core from 12.3.0 to 12.4.0. - -10.28.3 Release notes (2022-07-27) -============================================================= - -### Enhancements - -* Greatly improve the performance of obtaining cached Realm instances in Swift - when using a sync configuration. - -### Fixed - -* Add missing `initialSubscription` and `rerunOnOpen` to copyWithZone method on - `RLMRealmConfiguration`. This resulted in incorrect values when using - `RLMRealmConfiguration.defaultConfiguration`. -* The sync error handler did not hold a strong reference to the sync session - while dispatching the error from the worker thread to the main thread, - resulting in the session passed to the error handler being invalid if there - were no other remaining strong references elsewhere. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 3. - -10.28.2 Release notes (2022-06-30) -============================================================= - -### Fixed - -* Using `seedFilePath` threw an exception if the Realm file being opened - already existed ([#7840](https://github.com/realm/realm-swift/issues/7840), - since v10.26.0). -* The `intialSubscriptions` callback was invoked every time a Realm was opened - regardless of the value of `rerunOnOpen` and if the Realm was already open on - another thread (since v10.28.0). -* Allow using `RLMSupport.Swift` from RealmSwift's Cocoapods - ([#6886](https://github.com/realm/realm-swift/pull/6886)). -* Fix a UBSan failure when mapping encrypted pages. Fixing this did not change - the resulting assembly, so there were probably no functional problems - resulting from this (since v5.0.0). -* Improved performance of sync clients during integration of changesets with - many small strings (totalling > 1024 bytes per changeset) on iOS 14, and - devices which have restrictive or fragmented memory. - ([Core #5614](https://github.com/realm/realm-core/issues/5614)) -* Fix a data race when opening a flexible sync Realm (since v10.28.0). -* Add a missing backlink removal when assigning null or a non-link value to an - `AnyRealmValue` property which previously linked to an object. - This could have resulted in "key not found" exceptions or assertion failures - such as `mixed.hpp:165: [realm-core-12.1.0] Assertion failed: m_type` when - removing the destination link object. - ([Core #5574](https://github.com/realm/realm-core/pull/5573), since the introduction of AnyRealmValue in v10.8.0) - -### Compatibility - -* Realm Studio: 12.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 2. - -### Internal - -* Upgraded realm-core from 12.1.0 to 12.3.0. - -10.28.1 Release notes (2022-06-10) -============================================================= - -### Enhancements - -* Add support for Xcode 14. When building with Xcode 14, the minimum deployment - target is now iOS 11. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 1. - -10.28.0 Release notes (2022-06-03) -============================================================= - -### Enhancements - -* Replace mentions of 'MongoDB Realm' with 'Atlas App Services' in the documentation and update appropriate links to documentation. -* Allow adding a subscription querying for all documents of a type in swift for flexible sync. -``` - try await subscriptions.update { - subscriptions.append(QuerySubscription(name: "all_people")) - } -``` -* Add Combine API support for flexible sync beta. -* Add an `initialSubscriptions` parameter when retrieving the flexible sync configuration from a user, - which allows to specify a subscription update block, to bootstrap a set of flexible sync subscriptions - when the Realm is first opened. - There is an additional optional parameter flag `rerunOnOpen`, which allows to run this initial - subscriptions on every app startup. - -```swift - let config = user.flexibleSyncConfiguration(initialSubscriptions: { subs in - subs.append(QuerySubscription(name: "people_10") { - $0.age > 10 - }) - }, rerunOnOpen: true) - let realm = try Realm(configuration: config) -``` -* The sync client error handler will report an error, with detailed info about which object caused it, when writing an object to a flexible sync Realm outside of any query subscription. ([#5528](https://github.com/realm/realm-core/pull/5528)) -* Adding an object to a flexible sync Realm for a type that is not within a query subscription will now throw an exception. ([#5488](https://github.com/realm/realm-core/pull/5488)). - -### Fixed - -* Flexible Sync query subscriptions will correctly complete when data is synced to the local Realm. ([#5553](https://github.com/realm/realm-core/pull/5553), since v12.0.0) - -### Breaking Changes - -* Rename `SyncSubscriptionSet.write` to `SyncSubscriptionSet.update` to avoid confusion with `Realm.write`. -* Rename `SyncSubscription.update` to `SyncSubscription.updateQuery` to avoid confusion with `SyncSubscriptionSet.update`. -* Rename `RLMSyncSubscriptionSet.write` to `RLMSyncSubscriptionSet.update` to align it with swift API. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-13.4. - -### Internal - -* Upgraded realm-core from 12.0.0 to 12.1.0. - -10.27.0 Release notes (2022-05-26) -============================================================= - -### Enhancements - -* `@AsyncOpen`/`@AutoOpen` property wrappers can be used with flexible sync. - -### Fixed - -* When installing via SPM, debug builds could potentially hit an assertion - failure during flexible sync bootstrapping. ([Core #5527](https://github.com/realm/realm-core/pull/5527)) -* Flexible sync now only applies bootstrap data if the entire bootstrap is - received. Previously orphaned objects could result from the read snapshot on - the server changing. ([Core #5331](https://github.com/realm/realm-core/pull/5331)) -* Partially fix a performance regression in write performance introduced in - v10.21.1. v10.21.1 fixed a case where a kernel panic or device's battery - dying at the wrong point in a write transaction could potentially result in a - corrected Realm file, but at the cost of a severe performance hit. This - version adjusts how file synchronization is done to provide the same safety - at a much smaller performance hit. ([#7740](https://github.com/realm/realm-swift/issues/7740)). - -### Compatibility - -* Realm Studio: 11.0.0 or later (but see note below). -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-13.4. - -### Internal - -* Upgraded realm-core from 11.17.0 to 12.0.0. -* Bump the version number for the lockfile used for interprocess - synchronization. This has no effect on persistent data, but means that - versions of Realm which use pre-12.0.0 realm-core cannot open Realm files at - the same time as they are opened by this version. Notably this includes Realm - Studio, and v11.1.2 (the latest at the time of this release) cannot open - Realm files which are simultaneously open in the simulator. - -10.26.0 Release notes (2022-05-19) -============================================================= - -Xcode 13.1 is now the minimum supported version of Xcode, as Apple no longer -allows submitting to the app store with Xcode 12. - -### Enhancements - -* Add Xcode 13.4 binaries to the release package. -* Add Swift API for asynchronous transactions -```swift - try? realm.writeAsync { - realm.create(SwiftStringObject.self, value: ["string"]) - } onComplete: { error in - // optional handling on write complete - } - - try? realm.beginAsyncWrite { - realm.create(SwiftStringObject.self, value: ["string"]) - realm.commitAsyncWrite() - } - - let asyncTransactionId = try? realm.beginAsyncWrite { - // ... - } - try! realm.cancelAsyncWrite(asyncTransactionId) -``` -* Add Obj-C API for asynchronous transactions -``` - [realm asyncTransactionWithBlock:^{ - [StringObject createInRealm:realm withValue:@[@"string"]]; - } onComplete:^(NSError *error) { - // optional handling - }]; - - [realm beginAsyncWriteTransaction:^{ - [StringObject createInRealm:realm withValue:@[@"string"]]; - [realm commitAsyncWriteTransaction]; - }]; - - RLMAsyncTransactionId asyncTransactionId = [realm beginAsyncWriteTransaction:^{ - // ... - }]; - [realm cancelAsyncTransaction:asyncTransactionId]; -``` -* Improve performance of opening a Realm with `objectClasses`/`objectTypes` set - in the configuration. -* Implement the Realm event recording API for reporting reads and writes on a - Realm file to Atlas. - -### Fixed - -* Lower minimum OS version for `async` login and FunctionCallables to match the - rest of the `async` functions. ([#7791]https://github.com/realm/realm-swift/issues/7791) -* Consuming a RealmSwift XCFramework with library evolution enabled would give the error - `'Failed to build module 'RealmSwift'; this SDK is not supported by the compiler'` - when the XCFramework was built with an older XCode version and is - then consumed with a later version. ([#7313](https://github.com/realm/realm-swift/issues/7313), since v3.18.0) -* A data race would occur when opening a synchronized Realm with the client - reset mode set to `discardLocal` on one thread at the same time as a client - reset was being processed on another thread. This probably did not cause any - functional problems in practice and the broken timing window was very tight (since 10.25.0). -* If an async open of a Realm triggered a client reset, the callbacks for - `discardLocal` could theoretically fail to be called due to a race condition. - The timing for this was probably not possible to hit in practice (since 10.25.0). -* Calling `[RLMRealm freeze]`/`Realm.freeze` on a Realm which had been created from `writeCopy` - would not produce a frozen Realm. ([#7697](https://github.com/realm/realm-swift/issues/7697), since v5.0.0) -* Using the dynamic subscript API on unmanaged objects before first opening a - Realm or if `objectTypes` was set when opening a Realm would throw an - exception ([#7786](https://github.com/realm/realm-swift/issues/7786)). -* The sync client may have sent a corrupted upload cursor leading to a fatal - error from the server due to an uninitialized variable. - ([#5460](https://github.com/realm/realm-core/pull/5460), since v10.25.1) -* Flexible sync would not correctly resume syncing if a bootstrap was interrupted - ([#5466](https://github.com/realm/realm-core/pull/5466), since v10.21.1). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-13.4. - -### Internal - -* Upgraded realm-core from v11.15.0 to v11.17.0 - -10.25.2 Release notes (2022-04-27) -============================================================= - -### Enhancements - -* Replace Xcode 13.3 binaries with 13.3.1 binaries. - -### Fixed - -* `List` would contain an invalidated object instead of null when - the object linked to was deleted by a difference sync client - ([Core #5215](https://github.com/realm/realm-core/pull/5215), since v10.8.0). -* Adding an object to a Set, deleting the parent object of the Set, and then - deleting the object which was added to the Set would crash - ([Core #5387](https://github.com/realm/realm-core/issues/5387), since v10.8.0). -* Synchronized Realm files which were first created using v10.0.0-beta.3 would - be redownloaded instead of using the existing file, possibly resulting in the - loss of any unsynchronized data in those files (since v10.20.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3.1. - -### Internal - -* Upgraded realm-core from v11.14.0 to v11.15.0 - -10.25.1 Release notes (2022-04-11) -============================================================= - -### Fixed - -* Fixed various memory corruption bugs when encryption is used caused by not - locking a mutex when needed. - ([#7640](https://github.com/realm/realm-swift/issues/7640), [#7659](https://github.com/realm/realm-swift/issues/7659), since v10.21.1) -* Changeset upload batching did not calculate the accumulated size correctly, - resulting in “error reading body failed to read: read limited at 16777217 - bytes” errors from the server when writing large amounts of data - ([Core #5373](https://github.com/realm/realm-core/pull/5373), since 10.25.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3. - -### Internal - -* Upgraded realm-core from v11.13.0 to v11.14.0. - -10.25.0 Release notes (2022-03-29) -============================================================= - -Synchronized Realm files written by this version cannot be opened by older -versions of Realm. Existing files will be automatically upgraded when opened. - -Non-synchronized Realm files remain backwards-compatible. - -### Enhancements - -* Add ability to use Swift Query syntax in `@ObservedResults`, which allows you - to filter results using the `where` parameter. -* Add ability to use `MutableSet` with `StateRealmObject` in SwiftUI. -* Async/Await extensions are now compatible with iOS 13 and above when building - with Xcode 13.3. -* Sync changesets waiting to be uploaded to the server are now compressed, - reducing the disk space needed when large write transactions are performed - while offline or limited in bandwidth.([Core #5260](https://github.com/realm/realm-core/pull/5260)). -* Added new `SyncConfiguration.clientResetMode` and `RLMSyncConfiguration.clientResetMode` properties. - - The values of these properties will dictate client behavior in the event of a [client reset](https://docs.mongodb.com/realm/sync/error-handling/client-resets/). - - See below for information on `ClientResetMode` values. - - `clientResetMode` defaults to `.manual` if not set otherwise. -* Added new `ClientResetMode` and `RLMClientResetMode` enums. - - These enums represent possible client reset behavior for `SyncConfiguration.clientResetMode` and `RLMSyncConfiguration.clientResetMode`, respectively. - - `.manual` and `RLMClientResetModeManual` - - The local copy of the Realm is copied into a recovery - directory for safekeeping, and then deleted from the original location. The next time - the Realm for that partition value is opened, the Realm will automatically be re-downloaded from - MongoDB Realm, and can be used as normal. - - Data written to the Realm after the local copy of the Realm diverged from the backup - remote copy will be present in the local recovery copy of the Realm file. The - re-downloaded Realm will initially contain only the data present at the time the Realm - was backed up on the server. - - `rlmSync_clientResetBackedUpRealmPath` and `SyncError.clientResetInfo()` are used for accessing the recovery directory. - - `.discardLocal` and `RLMClientResetDiscardLocal` - - All unsynchronized local changes are automatically discarded and the local state is - automatically reverted to the most recent state from the server. Unsynchronized changes - can then be recovered in a post-client-reset callback block (See changelog below for more details). - - If RLMClientResetModeDiscardLocal is enabled but the client reset operation is unable to complete - then the client reset process reverts to manual mode. - - The realm's underlying object accessors remain bound so the UI may be updated in a non-disruptive way. -* Added support for client reset notification blocks for `.discardLocal` and `RLMClientResetDiscardLocal` - - **RealmSwift implementation**: `discardLocal(((Realm) -> Void)? = nil, ((Realm, Realm) -> Void)? = nil)` - - RealmSwift client reset blocks are set when initializing the user configuration - ```swift - var configuration = user.configuration(partitionValue: "myPartition", clientResetMode: .discardLocal(beforeClientResetBlock, afterClientResetBlock)) - ``` - - The before client reset block -- `((Realm) -> Void)? = nil` -- is executed prior to a client reset. Possible usage includes: - ```swift - let beforeClientResetBlock: (Realm) -> Void = { beforeRealm in - var recoveryConfig = Realm.Configuration() - recoveryConfig.fileURL = myRecoveryPath - do { - beforeRealm.writeCopy(configuration: recoveryConfig) - /* The copied realm could be used later for recovery, debugging, reporting, etc. */ - } catch { - /* handle error */ - } - } - ``` - - The after client reset block -- `((Realm, Realm) -> Void)? = nil)` -- is executed after a client reset. Possible usage includes: - ```Swift - let afterClientResetBlock: (Realm, Realm) -> Void = { before, after in - /* This block could be used to add custom recovery logic, back-up a realm file, send reporting, etc. */ - for object in before.objects(myClass.self) { - let res = after.objects(myClass.self) - if (res.filter("primaryKey == %@", object.primaryKey).first != nil) { - /* ...custom recovery logic... */ - } else { - /* ...custom recovery logic... */ - } - } - ``` - - **Realm Obj-c implementation**: Both before and after client reset callbacks exist as properties on `RLMSyncConfiguration` and are set at initialization. - ```objective-c - RLMRealmConfiguration *config = [user configurationWithPartitionValue:partitionValue - clientResetMode:RLMClientResetModeDiscardLocal - notifyBeforeReset:beforeBlock - notifyAfterReset:afterBlock]; - ``` - where `beforeBlock` is of type `RLMClientResetBeforeBlock`. And `afterBlock` is of type `RLMClientResetAfterBlock`. - -### Breaking Changes - -* Xcode 13.2 is no longer supported when building with Async/Await functions. Use - Xcode 13.3 to build with Async/Await functionality. - -### Fixed - -* Adding a Realm Object to a `ObservedResults` or a collections using - `StateRealmObject` that is managed by the same Realm would throw if the - Object was frozen and not thawed before hand. -* Setting a Realm Configuration for @ObservedResults using it's initializer - would be overrode by the Realm Configuration stored in - `.environment(\.realmConfiguration, ...)` if they did not match - ([Cocoa #7463](https://github.com/realm/realm-swift/issues/7463), since v10.6.0). -* Fix searchable component filter overriding the initial filter on `@ObservedResults`, (since v10.23.0). -* Comparing `Results`, `LinkingObjects` or `AnyRealmCollection` when using Realm via XCFramework - would result in compile time errors ([Cocoa #7615](https://github.com/realm/realm-swift/issues/7615), since v10.21.0) -* Opening an encrypted Realm while the keychain is locked on macOS would crash - ([#7438](https://github.com/realm/realm-swift/issues/7438)). -* Updating subscriptions while refreshing the access token would crash - ([Core #5343](https://github.com/realm/realm-core/issues/5343), since v10.22.0) -* Fix several race conditions in `SyncSession` related to setting - `customRequestHeaders` while using the `SyncSession` on a different thread. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3. - -### Internal - -* Upgraded realm-core from v11.12.0 to v11.13.0 - -10.24.2 Release notes (2022-03-18) -============================================================= - -### Fixed - -* Application would sometimes crash with exceptions like 'KeyNotFound' or - assertion "has_refs()". Other issues indicating file corruption may also be - fixed by this. The one mentioned here is the one that lead to solving the - problem. - ([Core #5283](https://github.com/realm/realm-core/issues/5283), since v5.0.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3. - -### Internal - -* Upgraded realm-core from 11.11.0 to 11.12.0 - -10.24.1 Release notes (2022-03-14) -============================================================= - -Switch to building the Carthage binary with Xcode 13.3. This release contains -no functional changes from 10.24.0. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3. - -10.24.0 Release notes (2022-03-05) -============================================================= - -### Enhancements - -* Add ability to use Swift Query syntax in `@ObservedResults`, which allows you - to filter results using the `where` parameter. - -### Fixed - -* If a list of objects contains links to objects not included in the - synchronized partition, collection change notifications for that list could - be incorrect ([Core #5164](https://github.com/realm/realm-core/issues/5164), since v10.0.0). -* Adding a new flexible sync subscription could crash with - "Assertion failed: !m_unbind_message_sent" in very specific timing scenarios - ([Core #5149](https://github.com/realm/realm-core/pull/5149), since v10.22.0). -* Converting floats/doubles into Decimal128 would yield imprecise results - ([Core #5184](https://github.com/realm/realm-core/pull/5184), since v10.0.0) -* Using accented characters in class and field names in a synchronized Realm - could result in sync errors ([Core #5196](https://github.com/realm/realm-core/pull/5196), since v10.0.0). -* Calling `Realm.invalidate()` from inside a Realm change notification could - result in the write transaction which produced the notification not being - persisted to disk (since v10.22.0). -* When a client reset error which results in the current Realm file being - backed up and then deleted, deletion errors were ignored as long as the copy - succeeded. When this happens the deletion of the old file is now scheduled - for the next launch of the app. ([Core #5180](https://github.com/realm/realm-core/issues/5180), since v2.0.0) -* Fix an error when compiling a watchOS Simulator target not supporting - Thread-local storage ([#7623](https://github.com/realm/realm-swift/issues/7623), since v10.21.0). -* Add a validation check to report a sensible error if a Realm configuration - indicates that an in-memory Realm should be encrypted. ([Core #5195](https://github.com/realm/realm-core/issues/5195)) -* The Swift package set the linker flags on the wrong target, resulting in - linker errors when SPM decides to build the core library as a dynamic library - ([#7266](https://github.com/realm/realm-swift/issues/7266)). -* The download-core task failed if run in an environment without TMPDIR set - ([#7688](https://github.com/realm/realm-swift/issues/7688), since v10.23.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3 beta 3. - -### Internal - -* Upgraded realm-core from 11.9.0 to 11.11.0 - -10.23.0 Release notes (2022-02-28) -============================================================= - -### Enhancements - -* Add `Realm.writeCopy(configuration:)`/`[RLMRealm writeCopyForConfiguration:]` which gives the - following functionality: - - Export a local non-sync Realm to be used with MongoDB Realm Sync - when the configuration is derived from a sync `RLMUser`/`User`. - - Write a copy of a local Realm to a destination specified in the configuration. - - Write a copy of a synced Realm in use with user A, and open it with user B. - - Note that migrations may be required when using a local realm configuration to open a realm file that - was copied from a synchronized realm. - - An exception will be thrown if a Realm exists at the destination. -* Add a `seedFilePath` option to `RLMRealmConfiguration` and `Configuration`. If this - option is set then instead of creating an empty Realm, the realm at the `seedFilePath` will - be copied to the `fileURL` of the new Realm. If a Realm file already exists at the - desitnation path, the seed file will not be copied and the already existing Realm - will be opened instead. Note that to use this parameter with a synced Realm configuration - the seed Realm must be appropriately copied to a destination with - `Realm.writeCopy(configuration:)`/`[RLMRealm writeCopyForConfiguration:]` first. -* Add ability to permanently delete a User from a MongoDB Realm app. This can - be invoked with `User.delete()`/`[RLMUser deleteWithCompletion:]`. -* Add `NSCopying` conformance to `RLMDecimal128` and `RLMObjectId`. -* Add Xcode 13.3 binaries to the release package (and remove 13.0). - -### Fixed - -* Add support of arm64 in Carthage build ([#7154](https://github.com/realm/realm-cocoa/issues/7154) -* Adding missing support for `IN` queries to primitives types on Type Safe Queries. - ```swift - let persons = realm.objects(Person.self).where { - let acceptableNames = ["Tom", "James", "Tyler"] - $0.name.in([acceptableNames]) - } - ``` - ([Cocoa #7633](https://github.com/realm/realm-swift/issues/7633), since v10.19.0) -* Work around a compiler crash when building with Swift 5.6 / Xcode 13.3. - CustomPersistable's PersistedType must now always be a built-in type rather - than possibly another CustomPersistable type as Swift 5.6 has removed support - for infinitely-recursive associated types ([#7654](https://github.com/realm/realm-swift/issues/7654)). -* Fix redundant call to filter on `@ObservedResults` from `searchable` - component (since v10.19.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3 beta 3. - -10.22.0 Release notes (2022-01-25) -============================================================= - -### Enhancements - -* Add beta support for flexible sync. See the [backend](https://docs.mongodb.com/realm/sync/data-access-patterns/flexible-sync/) and [SDK](https://docs.mongodb.com/realm/sdk/swift/examples/flexible-sync/) documentation for more information. Please report any issues with the beta through Github. - -### Fixed - -* UserIdentity metadata table grows indefinitely. ([#5152](https://github.com/realm/realm-core/issues/5152), since v10.20.0) -* We now report a useful error message when opening a sync Realm in non-sync mode or vice-versa.([#5161](https://github.com/realm/realm-core/pull/5161), since v5.0.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.2.1. - -### Internal - -* Upgraded realm-core from 11.8.0 to 11.9.0 - -10.21.1 Release notes (2022-01-12) -============================================================= - -### Fixed - -* The sync client will now drain the receive queue when a send fails with - ECONNRESET, ensuring that any error message from the server gets received and - processed. ([#5078](https://github.com/realm/realm-core/pull/5078)) -* Schema validation was missing for embedded objects in sets, resulting in an - unhelpful error being thrown if a Realm object subclass contained one (since v10.0.0). -* Opening a Realm with a schema that has an orphaned embedded object type - performed an extra empty write transaction (since v10.0.0). -* Freezing a Realm with a schema that has orphaned embedded object types threw - a "Wrong transactional state" exception (since v10.19.0). -* `@sum` and `@avg` queries on Dictionaries of floats or doubles used too much - precision for intermediates, resulting in incorrect rounding (since v10.5.0). -* Change the exception message for calling refresh on an immutable Realm from - "Continuous transaction through DB object without history information." to - "Can't refresh a read-only Realm." - ([#5061](https://github.com/realm/realm-core/issues/5061), since v10.8.0). -* Queries of the form "link.collection.@sum = 0" where `link` is null matched - when `collection` was a List or Set, but not a Dictionary - ([#5080](https://github.com/realm/realm-core/pull/5080), since v10.8.0). -* Types which require custom obj-c bridging (such as `PersistableEnum` or - `CustomPersistable`) would crash with exceptions mentioning `__SwiftValue` in - a variety of places on iOS versions older than iOS 14 - ([#7604](https://github.com/realm/realm-swift/issues/7604), since v10.21.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.2.1. - -### Internal - -* Upgraded realm-core from 11.6.1 to 11.8.0. - -10.21.0 Release notes (2022-01-10) -============================================================= - -### Enhancements - -* Add `metadata` property to `RLMUserProfile`/`UserProfile`. -* Add class `Projection` to allow creation of light weight view models out of Realm Objects. -```swift -public class Person: Object { - @Persisted var firstName = "" - @Persisted var lastName = "" - @Persisted var address: Address? = nil - @Persisted var friends = List() -} - -public class Address: EmbeddedObject { - @Persisted var city: String = "" - @Persisted var country = "" -} - -class PersonProjection: Projection { - // `Person.firstName` will have same name and type - @Projected(\Person.firstName) var firstName - // There will be the only String for `city` of the original object `Address` - @Projected(\Person.address.city) var homeCity - // List will be mapped to list of firstNames - @Projected(\Person.friends.projectTo.firstName) var firstFriendsName: ProjectedCollection -} - -// `people` will contain projections for every `Person` object in the `realm` -let people: Results = realm.objects(PersonProjection.self) -``` -* Greatly improve performance of reading AnyRealmValue and enum types from - Realm collections. -* Allow using Swift enums which conform to `PersistableEnum` as the value type - for all Realm collections. -* `AnyRealmCollection` now conforms to `Encodable`. -* AnyRealmValue and PersistableEnum values can now be passed directly to an - NSPredicate used in a filter() call rather than having to pass the rawValue - (the rawValue is still allowed). -* Queries on collections of PersistableEnums can now be performed with `where()`. -* Add support for querying on the rawValue of an enum with `where()`. -* `.count` is supported for Maps of all types rather than just numeric types in `where()`. -* Add support for querying on the properties of objects contained in - dictionaries (e.g. "dictProperty.@allValues.name CONTAINS 'a'"). -* Improve the error message for many types of invalid predicates in queries. -* Add support for comparing `@allKeys` to another property on the same object. -* Add `Numeric` conformance to `Decimal128`. -* Make some invalid property declarations such as `List` a - compile-time error instead of a runtime error. -* Calling `.sorted(byKeyPath:)` on a collection with an Element type which does - not support sorting by keypaths is now a compile-time error instead of a - runtime error. -* `RealmCollection.sorted(ascending:)` can now be called on all - non-Object/EmbeddedObject collections rather than only ones where the - `Element` conforms to `Comparable`. -* Add support for using user-defined types with `@Persistable` and in Realm - collections by defining a mapping to and from a type which Realm knows how to - store. For example, `URL` can be made persistable with: - ```swift - extension URL: FailableCustomPersistable { - // Store URL values as a String in Realm - public typealias PersistedType = String - // Convert a String to a URL - public init?(persistedValue: String) { self.init(string: persistedValue) } - // Convert a URL to a String - public var persistableValue: String { self.absoluteString } - } - ``` - After doing this, `@Persisted var url: URL` is a valid property declaration - on a Realm object. More advanced mappings can be done by mapping to an - EmbeddedObject which can store multiple values. - -### Fixed - -* Accessing a non object collection inside a migration would cause a crash -* [#5633](https://github.com/realm/realm-cocoa/issues/5633). -* Accessing a `Map` of objects dynamically would not handle nulled values correctly (since v10.8.0). -* `where()` allowed constructing some nonsensical queries due to boolean - comparisons returning `Query` rather than `Query` (since v10.19.0). -* `@allValues` queries on dictionaries accidentally did not require "ANY". -* Case-insensitive and diacritic-insensitive modifiers were ignored when - comparing the result of an aggregate operation to another property in a - query. -* `Object.init(value:)` did not allow initializing `RLMDictionary`/`Map` - properties with null values for map entries (since v10.8.0). -* `@ObservedResults` did not refresh when changes were made to the observed - collection. (since v10.6.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.2.1. - -10.20.1 Release notes (2021-12-14) -============================================================= - -Xcode 12.4 is now the minimum supported version of Xcode. - -### Fixed - -* Add missing `Indexable` support for UUID. - ([Cocoa #7545](https://github.com/realm/realm-swift/issues/7545), since v10.10.0) - -### Breaking Changes - -* All `async` functions now require Xcode 13.2 to work around an App - Store/TestFlight bug that results in apps built with 13.0/13.1 which do not - use libConcurrency but link a library which does crashing on startup. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.2. - -10.20.0 Release notes (2021-11-16) -============================================================= - -### Enhancements - -* Conform `@ThreadSafe` and `ThreadSafeReference` to `Sendable`. -* Allow using Swift enums which conform to `PersistableEnum` as the value type - for all Realm collections. -* `AnyRealmCollection` now conforms to `Encodable`. -* Greatly improve performance of reading AnyRealmValue and enum types from - Realm collections. -* `AnyRealmCollection` now conforms to `Encodable`. - -### Fixed - -* `@AutoOpen` will open the existing local Realm file on any connection error - rather than only when the connection specifically times out. -* Do not allow `progress` state changes for `@AutoOpen` and `@AsyncOpen` after - changing state to `open(let realm)` or `error(let error)`. -* Logging out a sync user failed to remove the local Realm file for partitions - with very long partition values that would have exceeded the maximum path - length. ([Core #4187](https://github.com/realm/realm-core/issues/4187), since v10.0.0) -* Don't keep trying to refresh the access token if the client's clock is more - than 30 minutes fast. ([Core #4941](https://github.com/realm/realm-core/issues/4941)) -* Failed auth requests used a fixed long sleep rather than exponential backoff - like other sync requests, which could result in very delayed reconnects after - a device was offline long enough for the access token to expire (since v10.0.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.1. - -### Internal - -* Upgraded realm-core from 11.6.0 to 11.6.1. - -10.19.0 Release notes (2021-11-04) -============================================================= - -### Enhancements - -* Add `.searchable()` SwiftUI View Modifier which allows filtering - `@ObservedResult` results from a search field component by a key path. - ```swift - List { - ForEach(reminders) { reminder in - ReminderRowView(reminder: reminder) - } - }.searchable(text: $searchFilter, - collection: $reminders, - keyPath: \.name) { - ForEach(reminders) { remindersFiltered in - Text(remindersFiltered.name).searchCompletion(remindersFiltered.name) - } - } - ``` -* Add an API for a type safe query syntax. This allows you to filter a Realm - and collections managed by a Realm with Swift style expressions. Here is a - brief example: - ```swift - class Person: Object { - @Persisted var name: String - @Persisted var hobbies: MutableSet - @Persisted var pets: List - } - class Pet: Object { - @Persisted var name: String - @Persisted var age: Int - } - - let persons = realm.objects(Person.self).where { - $0.hobbies.contains("music") || $0.hobbies.contains("baseball") - } - - persons = realm.objects(Person.self).where { - ($0.pets.age >= 2) && $0.pets.name.starts(with: "L") - } - ``` - ([#7419](https://github.com/realm/realm-swift/pull/7419)) -* Add support for dictionary subscript expressions - (e.g. `"phoneNumbers['Jane'] == '123-3456-123'"`) when querying with an - NSPredicate. -* Add UserProfile to User. This contains metadata from social logins with MongoDB Realm. -* Slightly reduce the peak memory usage when processing sync changesets. - -### Fixed - -* Change default request timeout for `RLMApp` from 6 seconds to 60 seconds. -* Async `Realm` init would often give a Realm instance which could not actually - be used and would throw incorrect thread exceptions. It now is `@MainActor` - and gives a Realm instance which always works on the main actor. The - non-functional `queue:` parameter has been removed (since v10.15.0). -* Restore the pre-v10.12.0 behavior of calling `writeCopy()` on a synchronized - Realm which produced a local non-synchronized Realm - ([#7513](https://github.com/realm/realm-swift/issues/7513)). -* Decimal128 did not properly normalize the value before hashing and so could - have multiple values which are equal but had different hash values (since v10.8.0). -* Fix a rare assertion failure or deadlock when a sync session is racing to - close at the same time that external reference to the Realm is being - released. ([Core #4931](https://github.com/realm/realm-core/issues/4931)) -* Fix a assertion failure when opening a sync Realm with a user who had been - removed. Instead an exception will be thrown. ([Core #4937](https://github.com/realm/realm-core/issues/4937), since v10.0.0) -* Fixed a rare segfault which could trigger if a user was being logged out - while the access token refresh response comes in. - ([Core #4944](https://github.com/realm/realm-core/issues/4944), since v10.0.0) -* Fixed a bug where progress notifiers on an AsyncOpenTask could be called - after the open completed. ([Core #4919](https://github.com/realm/realm-core/issues/4919)) -* SecureTransport was not enabled for macCatalyst builds when installing via - SPM, resulting in `'SSL/TLS protocol not supported'` exceptions when using - Realm Sync. ([#7474](https://github.com/realm/realm-swift/issues/7474)) -* Users were left in the logged in state when their refresh token expired. - ([Core #4882](https://github.com/realm/realm-core/issues/4882), since v10) -* Calling `.count` on a distinct collection would return the total number of - objects in the collection rather than the distinct count the first time it is - called. ([#7481](https://github.com/realm/realm-swift/issues/7481), since v10.8.0). -* `realm.delete(collection.distinct(...))` would delete all objects in the - collection rather than just the first object with each distinct value in the - property being distincted on, unless the distinct Results were read from at - least once first (since v10.8.0). -* Calling `.distinct()` on a collection, accessing the Results, then passing - the Results to `realm.delete()` would delete the correct objects, but - afterwards report a count of zero even if there were still objects in the - Results (since v10.8.0). -* Download compaction could result in non-streaming sync download notifiers - never reporting completion (since v10.0.0, - [Core #4989](https://github.com/realm/realm-core/pull/4989)). -* Fix a deadlock in SyncManager that was probably not possible to hit in - real-world code (since v10.0.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.2. - -### Internal - -* Upgraded realm-core from v11.4.1 to v11.6.0 - -10.18.0 Release notes (2021-10-25) -============================================================= - -### Enhancements - -* Add support for using multiple users with `@AsyncOpen` and `@AutoOpen`. - Setting the current user to a new user will now automatically reopen the - Realm with the new user. -* Add prebuilt binary for Xcode 13.1 to the release package. - -### Fixed - -* Fix `@AsyncOpen` and `@AutoOpen` using `defaultConfiguration` by default if - the user's doesn't provide one, will set an incorrect path which doesn't - correspond to the users configuration one. (since v10.12.0) -* Adding missing subscription completion for `AsyncOpenPublisher` after - successfully returning a realm. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.1. - -10.17.0 Release notes (2021-10-06) -============================================================= - -### Enhancements - -* Add a new `@ThreadSafe` property wrapper. Objects and collections wrapped by `@ThreadSafe` may be passed between threads. It's - intended to allow local variables and function parameters to be used across - threads when needed. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.0. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0. - -10.16.0 Release notes (2021-09-29) -============================================================= - -### Enhancements - -* Add `async` versions of `EmailPasswordAuth.callResetPasswordFunction` and -r `User.linkUser` methods. -* Add `async` version of `MongoCollection` methods. -* Add `async` support for user functions. - -### Fixed - -* A race condition in Realm.asyncOpen() sometimes resulted in subsequent writes - from Realm Sync failing to produce notifications - ([#7447](https://github.com/realm/realm-swift/issues/7447), - [#7453](https://github.com/realm/realm-swift/issues/7453), - [Core #4909](https://github.com/realm/realm-core/issues/4909), since v10.15.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.0. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0. - -10.15.1 Release notes (2021-09-15) -============================================================= - -### Enhancements - -* Switch to building the Carthage release with Xcode 13. - -### Fixed - -* Fix compilation error where Swift 5.5 is available but the macOS 12 SDK was - not. This was notable for the Xcode 13 RC. This fix adds a #canImport check - for the `_Concurrency` module that was not available before the macOS 12 SDK. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.0. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0. - -10.15.0 Release notes (2021-09-10) -============================================================= - -### Enhancements - -* Add `async` versions of the `Realm.asyncOpen` and `App.login` methods. -* ThreadSafeReference no longer pins the source transaction version for - anything other than a Results created by filtering a collection. This means - that holding on to thread-safe references to other things (such as Objects) - will no longer cause file size growth. -* A ThreadSafeReference to a Results backed by a collection can now be created - inside a write transaction as long as the collection was not created in the - current write transaction. -* Synchronized Realms are no longer opened twice, cutting the address space and - file descriptors used in half. - ([Core #4839](https://github.com/realm/realm-core/pull/4839)) -* When using the SwiftUI helper types (@ObservedRealmObject and friends) to - bind to an Equatable property, self-assignment no longer performs a pointless - write transaction. SwiftUI appears to sometimes call a Binding's set function - multiple times for a single UI action, so this results in significantly fewer - writes being performed. - -### Fixed - -* Adding an unmanaged object to a Realm that was declared with - `@StateRealmObject` would throw the exception `"Cannot add an object with - observers to a Realm"`. -* The `RealmCollectionChange` docs refered to indicies in modifications as the - 'new' collection. This is incorrect and the docs now state that modifications - refer to the previous version of the collection. ([Cocoa #7390](https://github.com/realm/realm-swift/issues/7390)) -* Fix crash in `RLMSyncConfiguration.initWithUser` error mapping when a user is disabled/deleted from MongoDB Realm dashboard. - ([Cocoa #7399](https://github.com/realm/realm-swift/issues/7399), since v10.0.0) -* If the application crashed at the wrong point when logging a user in, the - next run of the application could hit the assertion failure "m_state == - SyncUser::State::LoggedIn" when a synchronized Realm is opened with that - user. ([Core #4875](https://github.com/realm/realm-core/issues/4875), since v10.0.0) -* The `keyPaths:` parameter to `@ObservedResults` did not work (since v10.12.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 5. - -### Internal - -* Upgraded realm-core from 11.3.1 to 11.4.1 - -10.14.0 Release notes (2021-09-03) -============================================================= - -### Enhancements - -* Add additional `observe` methods for Objects and RealmCollections which take - a `PartialKeyPath` type key path parameter. -* The release package once again contains Xcode 13 binaries. -* `PersistableEnum` properties can now be indexed or used as the primary key if - the RawValue is an indexable or primary key type. - -### Fixed - -* `Map` did not conform to `Codable`. - ([Cocoa #7418](https://github.com/realm/realm-swift/pull/7418), since v10.8.0) -* Fixed "Invalid data type" assertion failure in the sync client when the - client recieved an AddColumn instruction from the server for an AnyRealmValue - property when that property already exists locally. ([Core #4873](https://github.com/realm/realm-core/issues/4873), since v10.8.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 5. - -### Internal - -* Upgraded realm-core from 11.3.0 to 11.3.1. - -10.13.0 Release notes (2021-08-26) -============================================================= - -### Enhancements - -* Sync logs now contain information about what object/changeset was being applied when the exception was thrown. - ([Core #4836](https://github.com/realm/realm-core/issues/4836)) -* Added ServiceErrorCode for wrong username/password when using '`App.login`. - ([Core #7380](https://github.com/realm/realm-swift/issues/7380) - -### Fixed - -* Fix crash in `MongoCollection.findOneDocument(filter:)` that occurred when no results were - found for a given filter. - ([Cocoa #7380](https://github.com/realm/realm-swift/issues/7380), since v10.0.0) -* Some of the SwiftUI property wrappers incorrectly required objects to conform - to ObjectKeyIdentifiable rather than Identifiable. - ([Cocoa #7372](https://github.com/realm/realm-swift/issues/7372), since v10.6.0) -* Work around Xcode 13 beta 3+ shipping a broken swiftinterface file for Combine on 32-bit iOS. - ([Cocoa #7368](https://github.com/realm/realm-swift/issues/7368)) -* Fixes history corruption when replacing an embedded object in a list. - ([Core #4845](https://github.com/realm/realm-core/issues/4845)), since v10.0.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 5. - -### Internal - -* Upgraded realm-core from 11.2.0 to 11.3.0 - -10.12.0 Release notes (2021-08-03) -============================================================= - -### Enhancements - -* `Object.observe()` and `RealmCollection.observe()` now include an optional - `keyPaths` parameter which filters change notifications to those only - occurring on the provided key path or key paths. See method documentation - for extended detail on filtering behavior. -* `ObservedResults` now includes an optional `keyPaths` parameter - which filters change notifications to those only occurring on the provided - key path or key paths. ex) `@ObservedResults(MyObject.self, keyPaths: ["myList.property"])` -* Add two new property wrappers for opening a Realm asynchronously in a - SwiftUI View: - - `AsyncOpen` is a property wrapper that initiates Realm.asyncOpen - for the current user, notifying the view when there is a change in Realm asyncOpen state. - - `AutoOpen` behaves similarly to `AsyncOpen`, but in the case of no internet - connection this will return an opened realm. -* Add `EnvironmentValues.partitionValue`. This value can be injected into any view using one of - our new property wrappers `AsyncOpen` and `AutoOpen`: - `MyView().environment(\.partitionValue, "partitionValue")`. -* Shift more of the work done when first initializing a collection notifier to - the background worker thread rather than doing it on the main thread. - -### Fixed - -* `configuration(partitionValue: AnyBSON)` would always set a nil partition value - for the user sync configuration. -* Decoding a `@Persisted` property would incorrectly throw a `DecodingError.keyNotFound` - for an optional property if the key is missing. - ([Cocoa #7358](https://github.com/realm/realm-swift/issues/7358), since v10.10.0) -* Fixed a symlink which prevented Realm from building on case sensitive file systems. - ([#7344](https://github.com/realm/realm-swift/issues/7344), since v10.8.0) -* Removing a change callback from a Results would sometimes block the calling - thread while the query for that Results was running on the background worker - thread (since v10.11.0). -* Object observers did not handle the object being deleted properly, which - could result in assertion failures mentioning "m_table" in ObjectNotifier - ([Core #4824](https://github.com/realm/realm-core/issues/4824), since v10.11.0). -* Fixed a crash when delivering notifications over a nested hierarchy of lists - of Mixed that contain links. ([Core #4803](https://github.com/realm/realm-core/issues/4803), since v10.8.0) -* Fixed a crash when an object which is linked to by a Mixed is deleted via - sync. ([Core #4828](https://github.com/realm/realm-core/pull/4828), since v10.8.0) -* Fixed a rare crash when setting a mixed link for the first time which would - trigger if the link was to the same table and adding the backlink column - caused a BPNode split. ([Core #4828](https://github.com/realm/realm-core/pull/4828), since v10.8.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 4. On iOS Xcode 13 beta 2 is the latest supported - version due to betas 3 and 4 having a broken Combine.framework. - -### Internal - -* Upgraded realm-core from v11.1.1 to v11.2.0 - -10.11.0 Release notes (2021-07-22) -============================================================= - -### Enhancements - -* Add type safe methods for: - - `RealmCollection.min(of:)` - - `RealmCollection.max(of:)` - - `RealmCollection.average(of:)` - - `RealmCollection.sum(of:)` - - `RealmCollection.sorted(by:ascending:)` - - `RealmKeyedCollection.min(of:)` - - `RealmKeyedCollection.max(of:)` - - `RealmKeyedCollection.average(of:)` - - `RealmKeyedCollection.sum(of:)` - - `RealmKeyedCollection.sorted(by:ascending:)` - - `Results.distinct(by:)` - - `SortDescriptor(keyPath:ascending:) - - Calling these methods can now be done via Swift keyPaths, like so: - ```swift - class Person: Object { - @Persisted var name: String - @Persisted var age: Int - } - - let persons = realm.objects(Person.self) - persons.min(of: \.age) - persons.max(of: \.age) - persons.average(of: \.age) - persons.sum(of: \.age) - persons.sorted(by: \.age) - persons.sorted(by: [SortDescriptor(keyPath: \Person.age)]) - persons.distinct(by: [\Person.age]) - ``` -* Add `List.objects(at indexes:)` in Swift and `[RLMCollection objectsAtIndexes:]` in Objective-C. - This allows you to select elements in a collection with a given IndexSet ([#7298](https://github.com/realm/realm-swift/issues/7298)). -* Add `App.emailPasswordAuth.retryCustomConfirmation(email:completion:)` and `[App.emailPasswordAuth retryCustomConfirmation:completion:]`. - These functions support retrying a [custom confirmation](https://docs.mongodb.com/realm/authentication/email-password/#run-a-confirmation-function) function. -* Improve performance of creating collection notifiers for Realms with a complex schema. - This means that the first run of a query or first call to observe() on a collection will - do significantly less work on the calling thread. -* Improve performance of calculating changesets for notifications, particularly - for deeply nested object graphs and objects which have List or Set properties - with small numbers of objects in the collection. - -### Fixed - -* `RealmProperty` would crash when decoding a `null` json value. - ([Cocoa #7323](https://github.com/realm/realm-swift/issues/7323), since v10.8.0) -* `@Persisted` would crash when decoding a `null` value. - ([#7332](https://github.com/realm/realm-swift/issues/7332), since v10.10.0). -* Fixed an issue where `Realm.Configuration` would be set after views have been laid out - when using `.environment(\.realmConfiguration, ...)` in SwiftUI. This would cause issues if you are - required to bump your schema version and are using `@ObservedResults`. -* Sync user profiles now correctly persist between runs. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 3. Note that this release does not contain Xcode 13 - beta binaries as beta 3 does not include a working version of - Combine.framework for iOS. - -### Internal - -* Upgraded realm-core from 11.0.4 to 11.1.1 - -10.10.0 Release notes (2021-07-07) -============================================================= - -### Enhancements - -* Add a new property wrapper-based declaration syntax for properties on Realm - Swift object classes. Rather than using `@objc dynamic` or the - `RealmProperty` wrapper type, properties can now be declared with `@Persisted - var property: T`, where `T` is any of the supported property types, including - optional numbers and collections. This has a few benefits: - - - All property types are now declared in the same way. No more remembering - that this type requires `@objc dynamic var` while this other type - requires `let`, and the `RealmProperty` or `RealmOptional` helper is no - longer needed for types not supported by Objective-C. - - No more overriding class methods like `primaryKey()`, - `indexedProperties()` or `ignoredProperties()`. The primary key and - indexed flags are set directly in the property declaration with - `@Persisted(primaryKey: true) var _id: ObjectId` or `@Persisted(indexed: - true) var indexedProperty: Int`. If any `@Persisted` properties are present, - all other properties are implicitly ignored. - - Some performance problems have been fixed. Declaring collection - properties as `let listProp = List()` resulted in the `List` object - being created eagerly when the parent object is read, which could cause - performance problems if a class has a large number of `List` or - `RealmOptional` properties. `@Persisted var list: List` allows us to - defer creating the `List` until it's accessed, improving performance - when looping over objects and using only some of the properties. - - Similarly, `let _id = ObjectId.generate()` was a convenient way to - declare a sync-compatible primary key, but resulted in new ObjectIds - being generated in some scenarios where the value would never actually be - used. `@Persisted var _id: ObjectId` has the same behavior of - automatically generating primary keys, but allows us to only generate it - when actually needed. - - More types of enums are supported. Any `RawRepresentable` enum whose raw - type is a type supported by Realm can be stored in an `@Persisted` - project, rather than just `@objc` enums. Enums must be declared as - conforming to the `PersistableEnum` protocol, and still cannot (yet) be - used in collections. - - `willSet` and `didSet` can be used with `@Persistable` properties, while - they previously did not work on managed Realm objects. - - While we expect the switch to the new syntax to be very simple for most - users, we plan to support the existing objc-based declaration syntax for the - foreseeable future. The new style and old style cannot be mixed within a - single class, but new classes can use the new syntax while existing classes - continue to use the old syntax. Updating an existing class to the new syntax - does not change what data is stored in the Realm file and so does not require - a migration (as long as you don't also change the schema in the process, of - course). -* Add `Map.merge()`, which adds the key-value pairs from another Map or - Dictionary to the map. -* Add `Map.asKeyValueSequence()` which returns an adaptor that can be used with - generic functions that operate on Dictionary-styled sequences. - -### Fixed -* AnyRealmValue enum values are now supported in more places when creating - objects. -* Declaring a property as `RealmProperty` will now report an - error during schema discovery rather than doing broken things when the - property is used. -* Observing the `invalidated` property of `RLMDictionary`/`Map` via KVO did not - set old/new values correctly in the notification (since 10.8.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 2. - -10.9.0 Release notes (2021-07-01) -============================================================= - -### Enhancements - -* Add `App.emailPasswordAuth.retryCustomConfirmation(email:completion:)` and - `[App.emailPasswordAuth retryCustomConfirmation:completion:]`. These - functions support retrying a [custom confirmation](https://docs.mongodb.com/realm/authentication/email-password/#run-a-confirmation-function) - function. -* Improve performance of many Dictionary operations, especially when KVO is being used. - -### Fixed - -* Calling `-[RLMRealm deleteObjects:]` on a `RLMDictionary` cleared the - dictionary but did not actually delete the objects in the dictionary (since v10.8.0). -* Rix an assertion failure when observing a `List` contains - object links. ([Core #4767](https://github.com/realm/realm-core/issues/4767), since v10.8.0) -* Fix an assertion failure when observing a `RLMDictionary`/`Map` which links - to an object which was deleting by a different sync client. - ([Core #4770](https://github.com/realm/realm-core/pull/4770), since v10.8.0) -* Fix an endless recursive loop that could cause a stack overflow when - computing changes on a set of objects which contained cycles. - ([Core #4770](https://github.com/realm/realm-core/pull/4770), since v10.8.0). -* Hash collisions in dictionaries were not handled properly. - ([Core #4776](https://github.com/realm/realm-core/issues/4776), since v10.8.0). -* Fix a crash after clearing a list or set of AnyRealmValue containing links to - objects ([Core #4774](https://github.com/realm/realm-core/issues/4774), since v10.8.0) -* Trying to refresh a user token which had been revoked by an admin lead to an - infinite loop and then a crash. This situation now properly logs the user out - and reports an error. ([Core #4745](https://github.com/realm/realm-core/issues/4745), since v10.0.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 2. - -### Internal - -* Upgraded realm-core from v11.0.3 to v11.0.4 - -10.8.1 Release notes (2021-06-22) -============================================================= - -### Enhancements - -* Update Xcode 12.5 to Xcode 12.5.1. -* Create fewer dynamic classes at runtime, improving memory usage and startup time slightly. - -### Fixed - -* Importing the Realm swift package produced several warnings about excluded - files not existing. Note that one warning will still remain after this change. - ([#7295](https://github.com/realm/realm-swift/issues/7295), since v10.8.0). -* Update the root URL for the API docs so that the links go to the place where - new versions of the docs are being published. - ([#7299](https://github.com/realm/realm-swift/issues/7299), since v10.6.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. Note that this version of Realm Studio has not - yet been released at the time of this release. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 1. - -10.8.0 Release notes (2021-06-14) -============================================================= - -NOTE: This version upgrades the Realm file format version to add support for -the new data types and to adjust how primary keys are handled. Realm files -opened will be automatically upgraded and cannot be read by versions older than -v10.8.0. This upgrade should be a fairly fast one. Note that we now -automatically create a backup of the pre-upgrade Realm. - -### Enhancements - -* Add support for the `UUID` and `NSUUID` data types. These types can be used - for the primary key property of Object classes. -* Add two new collection types to complement the existing `RLMArray`/`List` type: - - `RLMSet` in Objective-C and `MutableSet` in Swift are mutable - unordered collections of distinct objects, similar to the built-in - `NSMutableSet` and `Set`. The values in a set may be any non-collection - type which can be stored as a Realm property. Sets are guaranteed to never - contain two objects which compare equal to each other, including when - conflicting writes are merged by sync. - - `RLMDictionary` in Objective-C and `Map` are - mutable key-value dictionaries, similar to the built-in - `NSMutableDictionary` and `Dictionary`. The values in a dictionary may be - any non-collection type which can be stored as a Realm property. The keys - must currently always be a string. -* Add support for dynamically typed properties which can store a value of any - of the non-collection types supported by Realm, including Object subclasses - (but not EmbeddedObject subclasses). These are declared with - `@property id propertyName;` in Objective-C and - `let propertyName = RealmProperty()` in Swift. - -### Fixed - -* Setting a collection with a nullable value type to null via one of the - dynamic interfaces would hit an assertion failure instead of clearing the - collection. -* Fixed an incorrect detection of multiple incoming links in a migration when - changing a table to embedded and removing a link to it at the same time. - ([#4694](https://github.com/realm/realm-core/issues/4694) since v10.0.0-beta.2) -* Fixed a divergent merge on Set when one client clears the Set and another - client inserts and deletes objects. - ([#4720](https://github.com/realm/realm-core/issues/4720)) -* Partially revert to pre-v5.0.0 handling of primary keys to fix a performance - regression. v5.0.0 made primary keys determine the position in the low-level - table where newly added objects would be inserted, which eliminated the need - for a separate index on the primary key. This made some use patterns slightly - faster, but also made some reasonable things dramatically slower. - ([#4522](https://github.com/realm/realm-core/issues/4522)) -* Fixed an incorrect detection of multiple incoming links in a migration when - changing a table to embedded and removing a link to it at the same time. - ([#4694](https://github.com/realm/realm-core/issues/4694) since v10.0.0-beta.2) -* Fix collection notification reporting for modifications. This could be - observed by receiving the wrong indices of modifications on sorted or - distinct results, or notification blocks sometimes not being called when only - modifications have occured. - ([#4573](https://github.com/realm/realm-core/pull/4573) since v5.0.0). -* Fix incorrect sync instruction emission when replacing an existing embedded - object with another embedded object.([Core #4740](https://github.com/realm/realm-core/issues/4740) - -### Deprecations - -* `RealmOptional` has been deprecated in favor of `RealmProperty`. - `RealmProperty` is functionality identical to `RealmOptional` when storing - optional numeric types, but can also store the new `AnyRealmValue` type. - -### Compatibility - -* Realm Studio: 11.0.0 or later. Note that this version of Realm Studio has not - yet been released at the time of this release. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 1. - -### Internal - -* Upgraded realm-core from v10.7.2 to v11.0.3 - -10.8.0-beta.2 Release notes (2021-06-01) -============================================================= - -### Enhancements - -* Add `RLMDictionary`/`Map<>` datatype. This is a Dictionary collection type used for storing key-value pairs in a collection. - -### Compatibility - -* Realm Studio: 11.0.0-beta.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v11.0.0-beta.4 to v11.0.0-beta.6 - -10.8.0-beta.0 Release notes (2021-05-07) -============================================================= - -### Enhancements - -* Add `RLMSet`/`MutableSet<>` datatype. This is a Set collection type used for storing distinct values in a collection. -* Add support for `id`/`AnyRealmValue`. -* Add support for `UUID`/`NSUUID` data type. - -### Fixed - -* None. - -### Deprecations - -* `RealmOptional` has been deprecated in favor of `RealmProperty`. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.7.2 to v10.8.0-beta.5 - -10.7.7 Release notes (2021-06-10) -============================================================= - -Xcode 12.2 is now the minimum supported version. - -### Enhancements - -* Add Xcode 13 beta 1 binaries to the release package. - -### Fixed - -* Fix a runtime crash which happens in some Xcode version (Xcode < 12, reported - in Xcode 12.5), where SwiftUI is not weak linked by default. This fix only - works for Cocoapods projects. - ([#7234](https://github.com/realm/realm-swift/issues/7234) -* Fix warnings when building with Xcode 13 beta 1. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 1. - -10.7.6 Release notes (2021-05-13) -============================================================= - -### Enhancements - -* Realms opened in read-only mode can now be invalidated (although it is - unlikely to be useful to do so). - -### Fixed - -* Fix an availability warning when building Realm. The code path which gave the - warning can not currently be hit, so this did not cause any runtime problems - ([#7219](https://github.com/realm/realm-swift/issues/7219), since 10.7.3). -* Proactively check the expiry time on the access token and refresh it before - attempting to initiate a sync session. This prevents some error logs from - appearing on the client such as: "ERROR: Connection[1]: Websocket: Expected - HTTP response 101 Switching Protocols, but received: HTTP/1.1 401 - Unauthorized" ([RCORE-473](https://jira.mongodb.org/browse/RCORE-473), since v10.0.0) -* Fix a race condition which could result in a skipping notifications failing - to skip if several commits using notification skipping were made in - succession (since v5.0.0). -* Fix a crash on exit inside TableRecycler which could happen if Realms were - open on background threads when the app exited. - ([Core #4600](https://github.com/realm/realm-core/issues/4600), since v5.0.0) -* Fix errors related to "uncaught exception in notifier thread: - N5realm11KeyNotFoundE: No such object" which could happen on sycnronized - Realms if a linked object was deleted by another client. - ([JS #3611](https://github.com/realm/realm-js/issues/3611), since v10.0.0). -* Reading a link to an object which has been deleted by a different client via - a string-based interface (such as value(forKey:) or the subscript operator on - DynamicObject) could return an invalid object rather than nil. - ([Core #4687](https://github.com/realm/realm-core/pull/4687), since v10.0.0) -* Recreate the sync metadata Realm if the encryption key for it is missing from - the keychain rather than crashing. This can happen if a device is restored - from an unencrypted backup, which restores app data but not the app's - keychain entries, and results in all cached logics for sync users being - discarded but no data being lost. - [Core #4285](https://github.com/realm/realm-core/pull/4285) -* Thread-safe references can now be created for read-only Realms. - ([#5475](https://github.com/realm/realm-swift/issues/5475)). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.6.0 to v10.7.2 - -10.7.5 Release notes (2021-05-07) -============================================================= - -### Fixed - -* Iterating over frozen collections on multiple threads at the same time could - throw a "count underflow" NSInternalInconsistencyException. - ([#7237](https://github.com/realm/realm-swift/issues/7237), since v5.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. - -10.7.4 Release notes (2021-04-26) -============================================================= - -### Enhancements - -* Add Xcode 12.5 binaries to the release package. - -### Fixed - -* Add the Info.plist file to the XCFrameworks in the Carthage xcframwork - package ([#7216](https://github.com/realm/realm-swift/issues/7216), since 10.7.3). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. - -10.7.3 Release notes (2021-04-22) -============================================================= - -### Enhancements - -* Package a prebuilt XCFramework for Carthage. Carthage 0.38 and later will - download this instead of the old frameworks when using `--use-xcframeworks`. -* We now make a backup of the realm file prior to any file format upgrade. The - backup is retained for 3 months. Backups from before a file format upgrade - allows for better analysis of any upgrade failure. We also restore a backup, - if a) an attempt is made to open a realm file whith a "future" file format - and b) a backup file exist that fits the current file format. - ([Core #4166](https://github.com/realm/realm-core/pull/4166)) -* The error message when the intial steps of opening a Realm file fails is now - more descriptive. -* Make conversion of Decimal128 to/from string work for numbers with more than - 19 significant digits. This means that Decimal128's initializer which takes a - string will now never throw, as it previously threw only for out-of-bounds - values. The initializer is still marked as `throws` for - backwards compatibility. - ([#4548](https://github.com/realm/realm-core/issues/4548)) - -### Fixed - -* Adjust the header paths for the podspec to avoid accidentally finding a file - which isn't part of the pod that produced warnings when importing the - framework. ([#7113](https://github.com/realm/realm-swift/issues/7113), since 10.5.2). -* Fixed a crash that would occur when observing unmanaged Objects in multiple - views in SwiftUI. When using `@StateRealmObject` or `@ObservedObject` across - multiple views with an unmanaged object, each view would subscribe to the - object. As each view unsubscribed (generally when trailing back through the - view stack), our propertyWrappers would attempt to remove the KVOs for each - cancellation, when it should only be done once. We now correctly remove KVOs - only once. ([#7131](https://github.com/realm/realm-swift/issues/7131)) -* Fixed `isInvalidated` not returning correct value after object deletion from - Realm when using a custom schema. The object's Object Schema was not updated - when the object was added to the realm. We now correctly update the object - schema when adding it to the realm. - ([#7181](https://github.com/realm/realm-swift/issues/7181)) -* Syncing large Decimal128 values would cause "Assertion failed: cx.w[1] == 0" - ([Core #4519](https://github.com/realm/realm-core/issues/4519), since v10.0.0). -* Potential/unconfirmed fix for crashes associated with failure to memory map - (low on memory, low on virtual address space). For example - ([#4514](https://github.com/realm/realm-core/issues/4514), since v5.0.0). -* Fix assertion failures such as "!m_notifier_skip_version.version" or - "m_notifier_sg->get_version() + 1 == new_version.version" when performing - writes inside change notification callbacks. Previously refreshing the Realm - by beginning a write transaction would skip delivering notifications, leaving - things in an inconsistent state. Notifications are now delivered recursively - when needed instead. ([Cocoa #7165](https://github.com/realm/realm-swift/issues/7165)). -* Fix collection notification reporting for modifications. This could be - observed by receiving the wrong indices of modifications on sorted or - distinct results, or notification blocks sometimes not being called when only - modifications have occured. - ([#4573](https://github.com/realm/realm-core/pull/4573) since v5.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.5.5 to v10.6.0 -* Add additional debug validation to file map management that will hopefully - catch cases where we unmap something which is still in use. - -10.7.2 Release notes (2021-03-08) -============================================================= - -### Fixed - -* During integration of a large amount of data from the server, you may get - "Assertion failed: !fields.has_missing_parent_update()" - ([Core #4497](https://github.com/realm/realm-core/issues/4497), since v6.0.0) - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.5.4 to v10.5.5 - -10.7.1 Release notes (2021-03-05) -============================================================= - -### Fixed - -* Queries of the form "a.b.c == nil" would match objects where `b` is `nil` if - `c` did not have an index and did not if `c` was indexed. Both will now match - to align with NSPredicate's behavior. ([Core #4460]https://github.com/realm/realm-core/pull/4460), since 4.3.0). -* Restore support for upgrading files from file format 5 (Realm Cocoa 1.x). - ([Core #7089](https://github.com/realm/realm-swift/issues/7089), since v5.0.0) -* On 32bit devices you may get exception with "No such object" when upgrading - to v10.* ([Java #7314](https://github.com/realm/realm-java/issues/7314), since v5.0.0) -* The notification worker thread would rerun queries after every commit rather - than only commits which modified tables which could effect the query results - if the table had any outgoing links to tables not used in the query. - ([Core #4456](https://github.com/realm/realm-core/pull/4456), since v5.0.0). -* Fix "Invalid ref translation entry [16045690984833335023, 78187493520]" - assertion failure which could occur when using sync or multiple processes - writing to a single Realm file. - ([#7086](https://github.com/realm/realm-swift/issues/7086), since v5.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.5.3 to v10.5.4 - -10.7.0 Release notes (2021-02-23) -============================================================= - -### Enhancements - -* Add support for some missing query operations on data propertys: - - Data properties can be compared to other data properties - (e.g. "dataProperty1 == dataProperty2"). - - Case and diacritic-insensitive queries can be performed on data properties. - This will only have meaningful results if the data property contains UTF-8 - string data. - - Data properties on linked objects can be queried - (e.g. "link.dataProperty CONTAINS %@") -* Implement queries which filter on lists other than object links (lists of - objects were already supported). All supported operators for normal - properties are now supported for lists (e.g. "ANY intList = 5" or "ANY - stringList BEGINSWITH 'prefix'"), as well as aggregate operations on the - lists (such as "intArray.@sum > 100"). -* Performance of sorting on more than one property has been improved. - Especially important if many elements match on the first property. Mitigates - ([#7092](https://github.com/realm/realm-swift/issues/7092)) - -### Fixed - -* Fixed a bug that prevented an object type with incoming links from being - marked as embedded during migrations. ([Core #4414](https://github.com/realm/realm-core/pull/4414)) -* The Realm notification listener thread could sometimes hit the assertion - failure "!skip_version.version" if a write transaction was committed at a - very specific time (since v10.5.0). -* Added workaround for a case where upgrading an old file with illegal string - would crash ([#7111](https://github.com/realm/realm-swift/issues/7111)) -* Fixed a conflict resolution bug related to the ArrayMove instruction, which - could sometimes cause an "Invalid prior_size" exception to prevent - synchronization (since v10.5.0). -* Skipping a change notification in the first write transaction after the - observer was added could potentially fail to skip the notification (since v10.5.1). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.5.0 to v10.5.3 - -10.6.0 Release notes (2021-02-15) -============================================================= - -### Enhancements - -* Add `@StateRealmObject` for SwiftUI support. This property wrapper type instantiates an observable object on a View. - Use in place of `SwiftUI.StateObject` for Realm `Object`, `List`, and `EmbeddedObject` types. -* Add `@ObservedRealmObject` for SwiftUI support. This property wrapper type subscribes to an observable object - and invalidates a view whenever the observable object changes. Use in place of `SwiftUI.ObservedObject` for - Realm `Object`, `List`, or `EmbeddedObject` types. -* Add `@ObservedResults` for SwiftUI support. This property wrapper type retrieves results from a Realm. - The results use the realm configuration provided by the environment value `EnvironmentValues.realmConfiguration`. -* Add `EnvironmentValues.realm` and `EnvironmentValues.realmConfiguration` for `Realm` - and `Realm.Configuration` types respectively. Values can be injected into views using the `View.environment` method, e.g., `MyView().environment(\.realmConfiguration, Realm.Configuration(fileURL: URL(fileURLWithPath: "myRealmPath.realm")))`. - The value can then be declared on the example `MyView` as `@Environment(\.realm) var realm`. -* Add `SwiftUI.Binding` extensions where `Value` is of type `Object`, `List`, or `EmbeddedObject`. - These extensions expose methods for wrapped write transactions, to avoid boilerplate within - views, e.g., `TextField("name", $personObject.name)` or `$personList.append(Person())`. -* Add `Object.bind` and `EmbeddedObject.bind` for SwiftUI support. This allows you to create - bindings of realm properties when a propertyWrapper is not available for you to do so, e.g., `TextField("name", personObject.bind(\.name))`. -* The Sync client now logs error messages received from server rather than just - the size of the error message. -* Errors returned from the server when sync WebSockets get closed are now - captured and surfaced as a SyncError. -* Improve performance of sequential reads on a Results backed directly by a - Table (i.e. `realm.object(ClasSName.self)` with no filter/sort/etc.) by 50x. -* Orphaned embedded object types which are not linked to by any top-level types - are now better handled. Previously the server would reject the schema, - resulting in delayed and confusing error reporting. Explicitly including an - orphan in `objectTypes` is now immediately reported as an error when opening - the Realm, and orphans are automatically excluded from the auto-discovered - schema when `objectTypes` is not specified. - -### Fixed - -* Reading from a Results backed directly by a Table (i.e. - `realm.object(ClasSName.self)` with no filter/sort/etc.) would give incorrect - results if the Results was constructed and accessed before creating a new - object with a primary key less than the smallest primary key which previously - existed. ([#7014](https://github.com/realm/realm-swift/issues/7014), since v5.0.0). -* During synchronization you might experience crash with - "Assertion failed: ref + size <= next->first". - ([Core #4388](https://github.com/realm/realm-core/issues/4388)) - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.4.0 to v10.5.0 - -10.5.2 Release notes (2021-02-09) -============================================================= - -### Enhancements - -* Add support for "thawing" objects. `Realm`, `Results`, `List` and `Object` - now have `thaw()` methods which return a live copy of the frozen object. This - enables app behvaior where a frozen object can be made live again in order to - mutate values. For example, first freezing an object passed into UI view, - then thawing the object in the view to update values. -* Add Xcode 12.4 binaries to the release package. - -### Fixed - -* Inserting a date into a synced collection via `AnyBSON.datetime(...)` would - be of type `Timestamp` and not `Date`. This could break synced objects with a - `Date` property. - ([#6654](https://github.com/realm/realm-swift/issues/6654), since v10.0.0). -* Fixed an issue where creating an object after file format upgrade may fail - with assertion "Assertion failed: lo() <= std::numeric_limits::max()" - ([#4295](https://github.com/realm/realm-core/issues/4295), since v5.0.0) -* Allow enumerating objects in migrations with types which are no longer - present in the schema. -* Add `RLMResponse.customStatusCode`. This fixes timeout exceptions that were - occurring with a poor connection. ([#4188](https://github.com/realm/realm-core/issues/4188)) -* Limit availability of ObjectKeyIdentifiable to platforms which support - Combine to match the change made in the Xcode 12.5 SDK. - ([#7083](https://github.com/realm/realm-swift/issues/7083)) - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.3.3 to v10.4.0 - -10.5.1 Release notes (2021-01-15) -============================================================= - -### Enhancements - -* Add Xcode 12.3 binary to release package. -* Add support for queries which have nil on the left side and a keypath on the - right side (e.g. "nil == name" rather than "name == nil" as was previously - required). - -### Fixed -* Timeouts when calling server functions via App would sometimes crash rather - than report an error. -* Fix a race condition which would lead to "uncaught exception in notifier - thread: N5realm15InvalidTableRefE: transaction_ended" and a crash when the - source Realm was closed or invalidated at a very specific time during the - first run of a collection notifier - ([#3761](https://github.com/realm/realm-core/issues/3761), since v5.0.0). -* Deleting and recreating objects with embedded objects may fail. - ([Core PR #4240](https://github.com/realm/realm-core/pull/4240), since v10.0.0) -* Fast-enumerating a List after deleting the parent object would crash with an - assertion failure rather than a more appropriate exception. - ([Core #4114](https://github.com/realm/realm-core/issues/4114), since v5.0.0). -* Fix an issue where calling a MongoDB Realm Function would never be performed as the reference to the weak `User` was lost. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.3. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.3.2 to v10.3.3 - -10.5.0 Release notes (2020-12-14) -============================================================= - -### Enhancements - -* MongoDB Realm is now supported when installing Realm via Swift Package Manager. - -### Fixed - -* The user identifier was added to the file path for synchronized Realms twice - and an extra level of escaping was performed on the partition value. This did - not cause functional problems, but made file names more confusing than they - needed to be. Existing Realm files will continue to be located at the old - path, while newly created files will be created at a shorter path. (Since v10.0.0). -* Fix a race condition which could potentially allow queries on frozen Realms - to access an uninitialized structure for search indexes (since v5.0.0). -* Fix several data races in App and SyncSession initialization. These could - possibly have caused strange errors the first time a synchronized Realm was - opened (since v10.0.0). -* Fix a use of a dangling reference when refreshing a user’s custom data that - could lead to a crash (since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.1.4 to v10.3.2 - -10.4.0 Release notes (2020-12-10) -============================================================= - -### Enhancements - -* Add Combine support for App and User. These two types now have a - `objectWillChange` property that emits each time the state of the object has - changed (such as due to the user logging in or out). ([PR #6977](https://github.com/realm/realm-swift/pull/6977)). - -### Fixed - -* Integrating changesets from the server would sometimes hit the assertion - failure "n != realm::npos" inside Table::create_object_with_primary_key() - when creating an object with a primary key which previously had been used and - had incoming links. ([Core PR #4180](https://github.com/realm/realm-core/pull/4180), since v10.0.0). -* The arm64 simulator slices were not actually included in the XCFramework - release package. ([PR #6982](https://github.com/realm/realm-swift/pull/6982), since v10.2.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.1.3 to v10.1.4 -* Upgraded realm-sync from v10.1.4 to v10.1.5 - -10.3.0 Release notes (2020-12-08) -============================================================= - -### Enhancements - -* Add Google OpenID Connect Credentials, an alternative login credential to the - Google OAuth 2.0 credential. - -### Fixed - -* Fixed a bug that would prevent eventual consistency during conflict - resolution. Affected clients would experience data divergence and potentially - consistency errors as a result if they experienced conflict resolution - between cycles of Create-Erase-Create for objects with primary keys (since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-sync from v10.1.3 to v10.1.4 - -10.2.0 Release notes (2020-12-02) -============================================================= - -### Enhancements - -* The prebuilt binaries are now packaged as XCFrameworks. This adds support for - Catalyst and arm64 simulators when using them to install Realm, removes the - need for the strip-frameworks build step, and should simplify installation. -* The support functionality for using the Objective C API from Swift is now - included in Realm Swift and now includes all of the required wrappers for - MongoDB Realm types. In mixed Objective C/Swift projects, we recommend - continuing to use the Objective C types, but import both Realm and RealmSwift - in your Swift files. - -### Fixed - -* The user identifier was added to the file path for synchronized Realms twice - and an extra level of escaping was performed on the partition value. This did - not cause functional problems, but made file names more confusing than they - needed to be. Existing Realm files will continue to be located at the old - path, while newly created files will be created at a shorter path. (Since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -10.1.4 Release notes (2020-11-16) -============================================================= - -### Enhancements - -* Add arm64 slices to the macOS builds. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.0.1 to v10.1.3 -* Upgraded realm-sync from v10.0.1 to v10.1.3 - -10.1.3 Release notes (2020-11-13) -============================================================= - -### Enhancements - -* Add Xcode 12.2 binaries to the release package. - -### Fixed - -* Disallow setting - `RLMRealmConfiguration.deleteRealmIfMigrationNeeded`/`Realm.Config.deleteRealmIfMigrationNeeded` - when sync is enabled. This did not actually work as it does not delete the - relevant server state and broke in confusing ways ([PR #6931](https://github.com/realm/realm-swift/pull/6931)). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.1. -* CocoaPods: 1.10 or later. - -10.1.2 Release notes (2020-11-06) -============================================================= - -### Enhancements - -* Some error states which previously threw a misleading "NoSuchTable" exception - now throw a more descriptive exception. - -### Fixed - -* One of the Swift packages did not have the minimum deployment target set, - resulting in errors when archiving an app which imported Realm via SPM. -* Reenable filelock emulation on watchOS so that the OS does not kill the app - when it is suspended while a Realm is open on watchOS 7 ([#6861](https://github.com/realm/realm-swift/issues/6861), since v5.4.8 -* Fix crash in case insensitive query on indexed string columns when nothing - matches ([#6836](https://github.com/realm/realm-swift/issues/6836), since v5.0.0). -* Null values in a `List` or `List` were incorrectly treated - as non-null in some places. It is unknown if this caused any functional - problems when using the public API. ([Core PR #3987](https://github.com/realm/realm-core/pull/3987), since v5.0.0). -* Deleting an entry in a list in two different clients could end deleting the - wrong entry in one client when the changes are merged (since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.1. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.0.0 to v10.1.1 -* Upgraded realm-sync from v10.0.0 to v10.1.1 - -10.1.1 Release notes (2020-10-27) -============================================================= - -### Enhancements - -* Set the minimum CocoaPods version in the podspec so that trying to install - with older versions gives a more useful error ([PR #6892](https://github.com/realm/realm-swift/pull/6892)). - -### Fixed - -* Embedded objects could not be marked as `ObjectKeyIdentifable` - ([PR #6890](https://github.com/realm/realm-swift/pull/6890), since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.1. -* CocoaPods: 1.10 or later. - -10.1.0 Release notes (2020-10-22) -============================================================= - -CocoaPods 1.10 or later is now required to install Realm. - -### Enhancements - -* Throw an exception for Objects that have none of its properties marked with @objc. -* Mac Catalyst and arm64 simulators are now supported when integrating via Cocoapods. -* Add Xcode 12.1 binaries to the release package. -* Add Combine support for `Realm.asyncOpen()`. - -### Fixed - -* Implement precise and unbatched notification of sync completion events. This - avoids a race condition where an earlier upload completion event will notify - a later waiter whose changes haven't been uploaded yet. - ([#1118](https://github.com/realm/realm-object-store/pull/1118)). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.1. - -10.0.0 Release notes (2020-10-16) -============================================================= - -This release is functionally identical to v10.0.0-rc.2. - -NOTE: This version upgrades the Realm file format version to add support for -new data types. Realm files opened will be automatically upgraded and cannot be -read by versions older than v10.0.0. - -### Breaking Changes - -* Rename Realm.Publishers to RealmPublishers to avoid confusion with Combine.Publishers. -* Remove `[RLMSyncManager shared]`. This is now instatiated as a property on App/RLMApp. -* `RLMSyncManager.pinnedCertificatePaths` has been removed. -* Classes `RLMUserAccountInfo` & `RLMUserInfo` (swift: `UserInfo`, `UserAccountInfo`) have been removed. -* `RLMSyncUser`/`SyncUser` has been renamed to `RLMUser`/`User`. -* We no longer support Realm Cloud (legacy), but instead the new "MongoDB - Realm" Cloud. MongoDB Realm is a serverless platform that enables developers - to quickly build applications without having to set up server infrastructure. - MongoDB Realm is built on top of MongoDB Atlas, automatically integrating the - connection to your database. -* Remove support for Query-based sync, including the configuration parameters - and the `RLMSyncSubscription` and `SyncSubscription` types ([#6437](https://github.com/realm/realm-swift/pull/6437)). -* Remove everything related to sync permissions, including both the path-based - permission system and the object-level privileges for query-based sync. - Permissions are now configured via MongoDB Atlas. - ([#6445](https://github.com/realm/realm-swift/pulls/6445)) -* Remove support for Realm Object Server. -* Non-embedded objects in synchronized Realms must always have a primary key - named "_id". -* All Swift callbacks for asynchronous operations which can fail are now passed - a `Result` parameter instead of two separate `Value?` and - `Error?` parameters. - -### Enhancements - -* Add support for next generation sync. Support for syncing to MongoDB instead - of Realm Object Server. Applications must be created at realm.mongodb.com -* The memory mapping scheme for Realm files has changed to better support - opening very large files. -* Add support for the ObjectId data type. This is an automatically-generated - unique identifier similar to a GUID or a UUID. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for the Decimal128 data type. This is a 128-bit IEEE 754 decimal - floating point number similar to NSDecimalNumber. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for embedded objects. Embedded objects are objects which are - owned by a single parent object, and are deleted when that parent object is - deleted. They are defined by subclassing `EmbeddedObject` / - `RLMEmbeddedObject` rather than `Object` / `RLMObject`. -* Add `-[RLMUser customData]`/`User.customData`. Custom data is - configured in your MongoDB Realm App. -* Add `-[RLMUser callFunctionNamed:arguments:completion:]`/`User.functions`. - This is the entry point for calling Remote MongoDB Realm functions. Functions - allow you to define and execute server-side logic for your application. - Functions are written in modern JavaScript (ES6+) and execute in a serverless - manner. When you call a function, you can dynamically access components of - the current application as well as information about the request to execute - the function and the logged in user that sent the request. -* Add `-[RLMUser mongoClientWithServiceName:]`/`User.mongoClient`. This is - the entry point for calling your Remote MongoDB Service. The read operations - are `-[RLMMongoCollection findWhere:completion:]`, `-[RLMMongoCollection - countWhere:completion:]`and `-[RLMMongoCollection - aggregateWithPipeline:completion:]`. The write operations are - `-[RLMMongoCollection insertOneDocument:completion:]`, `-[RLMMongoCollection - insertManyDocuments:completion:]`, `-[RLMMongoCollection - updateOneDocument:completion:]`, `-[RLMMongoCollection - updateManyDocuments:completion:]`, `-[RLMMongoCollection - deleteOneDocument:completion:]`, and `-[RLMMongoCollection - deleteManyDocuments:completion:]`. If you are already familiar with MongoDB - drivers, it is important to understand that the remote MongoCollection only - provides access to the operations available in MongoDB Realm. -* Obtaining a Realm configuration from a user is now done with `[RLMUser - configurationWithPartitionValue:]`/`User.configuration(partitionValue:)`. - Partition values can currently be of types `String`, `Int`, or `ObjectId`, - and fill a similar role to Realm URLs did with Realm Cloud. The main - difference is that partitions are meant to be more closely associated with - your data. For example, if you are running a `Dog` kennel, and have a field - `breed` that acts as your partition key, you could open up realms based on - the breed of the dogs. -* Add ability to stream change events on a remote MongoDB collection with - `[RLMMongoCollection watch:delegate:delegateQueue:]`, - `MongoCollection.watch(delegate:)`. When calling `watch(delegate:)` you will be - given a `RLMChangeStream` (`ChangeStream`) which can be used to end watching - by calling `close()`. Change events can also be streamed using the - `MongoCollection.watch` Combine publisher that will stream change events each - time the remote MongoDB collection is updated. -* Add the ability to listen for when a Watch Change Stream is opened when using - Combine. Use `onOpen(event:)` directly after opening a `WatchPublisher` to - register a callback to be invoked once the change stream is opened. -* Objects with integer primary keys no longer require a separate index for the -* primary key column, improving insert performance and slightly reducing file - size. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* Carthage release for Swift is built with Xcode 12 - -### Internal - -* Upgraded realm-core from v6.1.4 to v10.0.0 -* Upgraded realm-sync from v5.0.29 to v10.0.0 - -10.0.0-rc.2 Release notes (2020-10-15) -============================================================= - -### Enhancements - -* Add the ability to listen for when a Watch Change Stream is opened when using - Combine. Use `onOpen(event:)` directly after opening a `WatchPublisher` to - register a callback to be invoked once the change stream is opened. - -### Breaking Changes - -* The insert operations on Mongo collections now report the inserted documents' - IDs as BSON rather than ObjectId. -* Embedded objects can no longer form cycles at the schema level. For example, - type A can no longer have an object property of type A, or an object property - of type B if type B links to type A. This was always rejected by the server, - but previously was allowed in non-synchronized Realms. -* Primary key properties are once again marked as being indexed. This reflects - an internal change to how primary keys are handled that should not have any - other visible effects. -* Change paired return types from Swift completion handlers to return `Result`. -* Adjust how RealmSwift.Object is defined to add support for Swift Library - Evolution mode. This should normally not have any effect, but you may need to - add `override` to initializers of object subclasses. -* Add `.null` type to AnyBSON. This creates a distinction between null values - and properly absent BSON types. - -### Fixed - -* Set the precision correctly when serializing doubles in extended json. -* Reading the `objectTypes` array from a Realm Configuration would not include - the embedded object types which were set in the array. -* Reject loops in embedded objects as part of local schema validation rather - than as a server error. -* Although MongoClient is obtained from a User, it was actually using the - User's App's current user rather than the User it was obtained from to make - requests. - - -This release also contains the following changes from 5.4.7 - 5.5.0 - -### Enhancements - -* Add the ability to capture a NotificationToken when using a Combine publisher - that observes a Realm Object or Collection. The user will call - `saveToken(on:at:)` directly after invoking the publisher to use the feature. - -### Fixed - -* When using `Realm.write(withoutNotifying:)` there was a chance that the - supplied observation blocks would not be skipped when in a write transaction. - ([Object Store #1103](https://github.com/realm/realm-object-store/pull/1103)) -* Comparing two identical unmanaged `List<>`/`RLMArray` objects would fail. - ([#5665](https://github.com/realm/realm-swift/issues/5665)). -* Case-insensitive equality queries on indexed string properties failed to - clear some internal state when rerunning the query. This could manifest as - duplicate results or "key not found" errors. - ([#6830](https://github.com/realm/realm-swift/issues/6830), [#6694](https://github.com/realm/realm-swift/issues/6694), since 5.0.0). -* Equality queries on indexed string properties would sometimes throw "key not - found" exceptions if the hash of the string happened to have bit 62 set. - ([.NET #2025](https://github.com/realm/realm-dotnet/issues/2025), since v5.0.0). -* Queries comparing non-optional int properties to nil would behave as if they - were comparing against zero instead (since v5.0.0). - -### Compatibility - -* File format: Generates Realms with format v12 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v10.0.0-beta.9 to v10.0.0 -* Upgraded realm-sync from v10.0.0-beta.14 to v10.0.0 - -10.0.0-rc.1 Release notes (2020-10-01) -============================================================= - -### Breaking Changes - -* Change the following methods on RLMUser to properties: - - `[RLMUser emailPasswordAuth]` => `RLMUser.emailPasswordAuth` - - `[RLMUser identities]` => `RLMUser.identities` - - `[RLMUser allSessions]` => `RLMUser.allSessions` - - `[RLMUser apiKeysAuth]` => `RLMUser.apiKeysAuth` -* Other changes to RLMUser: - - `nullable` has been removed from `RLMUser.identifier` - - `nullable` has been removed from `RLMUser.customData` -* Change the following methods on RLMApp to properties: - - `[RLMApp allUsers]` => `RLMApp.allUsers` - - `[RLMApp currentUser]` => `RLMApp.currentUser` - - `[RLMApp emailPasswordAuth]` => `RLMApp.emailPasswordAuth` -* Define `RealmSwift.Credentials` as an enum instead of a `typealias`. Example - usage has changed from `Credentials(googleAuthCode: "token")` to - `Credentials.google(serverAuthCode: "serverAuthCode")`, and - `Credentials(facebookToken: "token")` to `Credentials.facebook(accessToken: "accessToken")`, etc. -* Remove error parameter and redefine payload in - `+ (instancetype)credentialsWithFunctionPayload:(NSDictionary *)payload error:(NSError **)error;`. - It is now defined as `+ (instancetype)credentialsWithFunctionPayload:(NSDictionary> *)payload;` - -### Compatibility - -* File format: Generates Realms with format v12 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12. - -10.0.0-beta.6 Release notes (2020-09-30) -============================================================= - -### Breaking Changes - -* Change Google Credential parameter names to better reflect the required auth code: - - `Credentials(googleToken:)` => `Credentials(googleAuthCode:)` - - `[RLMCredentials credentialsWithGoogleToken:]` => `[RLMCredentials credentialsWithGoogleAuthCode:]` -* Rename Realm.Publishers to RealmPublishers to avoid confusion with Combine.Publishers - -### Fixed - -* Deleting objects could sometimes change the ObjectId remaining objects from - null to ObjectId("deaddeaddeaddeaddeaddead") when there are more than 1000 - objects. (Since v10.0.0-alpha.1) -* Fixed an assertion failure when adding an index to a nullable ObjectId - property that contains nulls. (since v10.0.0-alpha.1). - -This release also contains the following changes from 5.4.0 - 5.4.6: - -### Enhancements - -* Add prebuilt binary for Xcode 11.7 to the release package. -* Add prebuilt binary for Xcode 12 to the release package. -* Improve the asymtotic performance of NOT IN queries on indexed properties. It - is now O(Number of Rows) rather than O(Number of Rows \* Number of values in IN clause.) -* Slightly (<5%) improve the performance of most operations which involve - reading from a Realm file. - -### Fixed - -* Upgrading pre-5.x files with string primary keys would result in a file where - `realm.object(ofType:forPrimaryKey:)` would fail to find the object. - ([#6716](https://github.com/realm/realm-swift/issues/6716), since 5.2.0) -* A write transaction which modifies an object with more than 16 managed - properties and causes the Realm file to grow larger than 2 GB could cause an - assertion failure mentioning "m_has_refs". ([JS #3194](https://github.com/realm/realm-js/issues/3194), since 5.0.0). -* Objects with more than 32 properties could corrupt the Realm file and result - in a variety of crashes. ([Java #7057](https://github.com/realm/realm-java/issues/7057), since 5.0.0). -* Fix deadlocks when opening a Realm file in both the iOS simulator and Realm - Studio ([#6743](https://github.com/realm/realm-swift/issues/6743), since 5.3.6). -* Fix Springboard deadlocking when an app is unsuspended while it has an open - Realm file which is stored in an app group on iOS 10-12 - ([#6749](https://github.com/realm/realm-swift/issues/6749), since 5.3.6). -* If you use encryption your application cound crash with a message like - "Opening Realm files of format version 0 is not supported by this version of - Realm". ([#6889](https://github.com/realm/realm-java/issues/6889) among others, since 5.0.0) -* Confining a Realm to a serial queue would throw an error claiming that the - queue was not a serial queue on iOS versions older than 12. - ([#6735](https://github.com/realm/realm-swift/issues/6735), since 5.0.0). -* Results would sometimes give stale results inside a write transaction if a - write which should have updated the Results was made before the first access - of a pre-existing Results object. - ([#6721](https://github.com/realm/realm-swift/issues/6721), since 5.0.0) -* Fix Archiving the Realm and RealmSwift frameworks with Xcode 12. - ([#6774](https://github.com/realm/realm-swift/issues/6774)) -* Fix compilation via Carthage when using Xcode 12 ([#6717](https://github.com/realm/realm-swift/issues/6717)). -* Fix a crash inside `realm::Array(Type)::init_from_mem()` which would - sometimes occur when running a query over links immediately after creating - objects of the queried type. - ([#6789](https://github.com/realm/realm-swift/issues/6789) and possibly others, since 5.0.0). -* Possibly fix problems when changing the type of the primary key of an object - from optional to non-optional. -* Rerunning a equality query on an indexed string property would give incorrect - results if a previous run of the query matched multiple objects and it now - matches one object. This could manifest as either finding a non-matching - object or a "key not found" exception being thrown. - ([#6536](https://github.com/realm/realm-swift/issues/6536), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v12 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v10.0.0-beta.7 to v10.0.0-beta.9 -* Upgraded realm-sync from v10.0.0-beta.11 to v10.0.0-beta.14 - -10.0.0-beta.5 Release notes (2020-09-15) -============================================================= - -### Enhancements - -* Add `User.loggedIn`. -* Add support for multiple Realm Apps. -* Remove `[RLMSyncManager shared]`. This is now instatiated as a property on - the app itself. -* Add Combine support for: - * PushClient - * APIKeyAuth - * User - * MongoCollection - * EmailPasswordAuth - * App.login - -### Fixed - -* Fix `MongoCollection.watch` to consistently deliver events on a given queue. -* Fix `[RLMUser logOutWithCompletion]` and `User.logOut` to now log out the - correct user. -* Fix crash on startup on iOS versions older than 13 (since v10.0.0-beta.3). - -### Breaking Changes - -* `RLMSyncManager.pinnedCertificatePaths` has been removed. -* Classes `RLMUserAccountInfo` & `RLMUserInfo` (swift: `UserInfo`, - `UserAccountInfo`) have been removed. -* The following functionality has been renamed to align Cocoa with the other - Realm SDKs: - -| Old API | New API | -|:-------------------------------------------------------------|:---------------------------------------------------------------| -| `RLMUser.identity` | `RLMUser.identifier` | -| `User.identity` | `User.id` | -| `-[RLMCredentials credentialsWithUsername:password:]` | `-[RLMCredentials credentialsWithEmail:password:]` | -| `Credentials(username:password:)` | `Credentials(email:password:)` | -| -`[RLMUser apiKeyAuth]` | `-[RLMUser apiKeysAuth]` | -| `User.apiKeyAuth()` | `User.apiKeysAuth()` | -| `-[RLMEmailPasswordAuth registerEmail:password:completion:]` | `-[RLMEmailPasswordAuth registerUserWithEmail:password:completion:]` | -| `App.emailPasswordAuth().registerEmail(email:password:)` | `App.emailPasswordAuth().registerUser(email:password:)` | - -### Compatibility - -* File format: Generates Realms with format v12 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v10.0.0-beta.6 to v10.0.0-beta.7 -* Upgraded realm-sync from v10.0.0-beta.10 to v10.0.0-beta.11 - -10.0.0-beta.4 Release notes (2020-08-28) -============================================================= - -### Enhancements - -* Add support for the 64-bit watchOS simulator added in Xcode 12. -* Add ability to stream change events on a remote MongoDB collection with - `[RLMMongoCollection watch:delegate:delegateQueue]`, - `MongoCollection.watch(delegate)`. When calling `watch(delegate)` you will be - given a `RLMChangeStream` (`ChangeStream`), this will be used to invalidate - and stop the streaming session by calling `[RLMChangeStream close]` - (`ChangeStream.close()`) when needed. -* Add `MongoCollection.watch`, which is a Combine publisher that will stream - change events each time the remote MongoDB collection is updated. -* Add ability to open a synced Realm with a `nil` partition value. - -### Fixed - -* Realm.Configuration.objectTypes now accepts embedded objects -* Ports fixes from 5.3.5 - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the v10.0.0-beta.x series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v10.0.0-beta.1 to v10.0.0-beta.6 -* Upgraded realm-sync from v10.0.0-beta.2 to v10.0.0-beta.10 - -10.0.0-beta.3 Release notes (2020-08-17) -============================================================= - -This release also contains all changes from 5.3.2. - -### Breaking Changes -* The following classes & aliases have been renamed to align Cocoa with the other Realm SDKs: - -| Old API | New API | -|:------------------------------------------------------------|:---------------------------------------------------------------| -| `RLMSyncUser` | `RLMUser` | -| `SyncUser` | `User` | -| `RLMAppCredential` | `RLMCredential` | -| `AppCredential` | `Credential` | -| `RealmApp` | `App` | -| `RLMUserAPIKeyProviderClient` | `RLMAPIKeyAuth` | -| `RLMUsernamePasswordProviderClient` | `RLMEmailPasswordAuth` | -| `UsernamePasswordProviderClient` | `EmailPasswordAuth` | -| `UserAPIKeyProviderClient` | `APIKeyAuth` | - -* The following functionality has also moved to the User - -| Old API | New API | -|:-------------------------------------------------------------|:--------------------------------------------------------------| -| `[RLMApp callFunctionNamed:]` | `[RLMUser callFunctionNamed:]` | -| `App.functions` | `User.functions` | -| `[RLMApp mongoClientWithServiceName:]` | `[RLMUser mongoClientWithServiceName:]` | -| `App.mongoClient(serviceName)` | `User.mongoClient(serviceName)` | -| `[RLMApp userAPIKeyProviderClient]` | `[RLMUser apiKeyAuth]` | -| `App.userAPIKeyProviderClient` | `App.apiKeyAuth()` | -| `[RLMApp logOut:]` | `[RLMUser logOut]` | -| `App.logOut(user)` | `User.logOut()` | -| `[RLMApp removeUser:]` | `[RLMUser remove]` | -| `App.remove(user)` | `User.remove()` | -| `[RLMApp linkUser:credentials:]` | `[RLMUser linkWithCredentials:]` | -| `App.linkUser(user, credentials)` | `User.link(credentials)` | - -* `refreshCustomData()` on User now returns void and passes the custom data to the callback on success. - -### Compatibility -* This release introduces breaking changes w.r.t some sync classes and MongoDB Realm Cloud functionality. -(See the breaking changes section for the full list) -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* Carthage release for Swift is built with Xcode 11.5. - -10.0.0-beta.2 Release notes (2020-06-09) -============================================================= -Xcode 11.3 and iOS 9 are now the minimum supported versions. - -### Enhancements -* Add support for building with Xcode 12 beta 1. watchOS currently requires - removing x86_64 from the supported architectures. Support for the new 64-bit - watch simulator will come in a future release. - -### Fixed -* Opening a SyncSession with LOCAL app deployments would not use the correct endpoints. -* Linking from embedded objects to top-level objects was incorrectly disallowed. -* Opening a Realm file in file format v6 (created by Realm Cocoa versions - between 2.4 and 2.10) would crash. (Since 5.0.0, [Core #3764](https://github.com/realm/realm-core/issues/3764)). -* Upgrading v9 (pre-5.0) Realm files would create a redundant search index for - primary key properties. This index would then be removed the next time the - Realm was opened, resulting in some extra i/o in the upgrade process. - (Since 5.0.0, [Core #3787](https://github.com/realm/realm-core/issues/3787)). -* Fixed a performance issue with upgrading v9 files with search indexes on - non-primary-key properties. (Since 5.0.0, [Core #3767](https://github.com/realm/realm-core/issues/3767)). - -### Compatibility -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 - -10.0.0-beta.1 Release notes (2020-06-08) -============================================================= - -NOTE: This version bumps the Realm file format to version 11. It is not -possible to downgrade to earlier versions. Older files will automatically be -upgraded to the new file format. Only [Realm Studio -10.0.0](https://github.com/realm/realm-studio/releases/tag/v10.0.0-beta.1) or -later will be able to open the new file format. - -### Enhancements - -* Add support for next generation sync. Support for syncing to MongoDB instead - of Realm Object Server. Applications must be created at realm.mongodb.com -* The memory mapping scheme for Realm files has changed to better support - opening very large files. -* Add support for the ObjectId data type. This is an automatically-generated - unique identifier similar to a GUID or a UUID. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for the Decimal128 data type. This is a 128-bit IEEE 754 decimal - floating point number similar to NSDecimalNumber. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for embedded objects. Embedded objects are objects which are - owned by a single parent object, and are deleted when that parent object is - deleted. They are defined by subclassing `EmbeddedObject` / - `RLMEmbeddedObject` rather than `Object` / `RLMObject`. -* Add `-[RLMSyncUser customData]`/`SyncUser.customData`. Custom data is - configured in your MongoDB Realm App. -* Add `-[RLMApp callFunctionNamed:arguments]`/`RealmApp.functions`. This is the - entry point for calling Remote MongoDB Realm functions. Functions allow you - to define and execute server-side logic for your application. Functions are - written in modern JavaScript (ES6+) and execute in a serverless manner. When - you call a function, you can dynamically access components of the current - application as well as information about the request to execute the function - and the logged in user that sent the request. -* Add `-[RLMApp mongoClientWithServiceName]`/`RealmApp.mongoClient`. This is - the entry point for calling your Remote MongoDB Service. The read operations - are `-[RLMMongoCollection findWhere:completion:]`, `-[RLMMongoCollection - countWhere:completion:]`and `-[RLMMongoCollection - aggregateWithPipeline:completion:]`. The write operations are - `-[RLMMongoCollection insertOneDocument:completion:]`, `-[RLMMongoCollection - insertManyDocuments:completion:]`, `-[RLMMongoCollection - updateOneDocument:completion:]`, `-[RLMMongoCollection - updateManyDocuments:completion:]`, `-[RLMMongoCollection - deleteOneDocument:completion:]`, and `-[RLMMongoCollection - deleteManyDocuments:completion:]`. If you are already familiar with MongoDB - drivers, it is important to understand that the remote MongoCollection only - provides access to the operations available in MongoDB Realm. -* Change `[RLMSyncUser - configurationWithPartitionValue:]`/`SyncUser.configuration(with:)` to accept - all BSON types. Partition values can currently be of types `String`, `Int`, - or `ObjectId`. Opening a realm by partition value is the equivalent of - previously opening a realm by URL. In this case, partitions are meant to be - more closely associated with your data. E.g., if you are running a `Dog` - kennel, and have a field `breed` that acts as your partition key, you could - open up realms based on the breed of the dogs. - -### Breaking Changes - -* We no longer support Realm Cloud (legacy), but instead the new "MongoDB - Realm" Cloud. MongoDB Realm is a serverless platform that enables developers - to quickly build applications without having to set up server infrastructure. - MongoDB Realm is built on top of MongoDB Atlas, automatically integrating the - connection to your database. -* Remove support for Query-based sync, including the configuration parameters - and the `RLMSyncSubscription` and `SyncSubscription` types ([#6437](https://github.com/realm/realm-swift/pull/6437)). -* Primary key properties are no longer marked as being indexed. This reflects - an internal change to how primary keys are handled that should not have any - other visible effects. ([#6440](https://github.com/realm/realm-swift/pull/6440)). -* Remove everything related to sync permissions, including both the path-based - permission system and the object-level privileges for query-based sync. ([#6445](https://github.com/realm/realm-swift/pulls/6445)) -* Primary key uniqueness is now enforced when creating new objects during - migrations, rather than only at the end of migrations. Previously new objects - could be created with duplicate primary keys during a migration as long as - the property was changed to a unique value before the end of the migration, - but now a unique value must be supplied when creating the object. -* Remove support for Realm Object Server. - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 - -5.5.0 Release notes (2020-10-12) -============================================================= - -### Enhancements - -* Add the ability to capture a NotificationToken when using a Combine publisher - that observes a Realm Object or Collection. The user will call - `saveToken(on:at:)` directly after invoking the publisher to use the feature. - -### Fixed - -* When using `Realm.write(withoutNotifying:)` there was a chance that the - supplied observation blocks would not be skipped when in a write transaction. - ([Object Store #1103](https://github.com/realm/realm-object-store/pull/1103)) -* Comparing two identical unmanaged `List<>`/`RLMArray` objects would fail. - ([#5665](https://github.com/realm/realm-swift/issues/5665)). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -5.4.8 Release notes (2020-10-05) -============================================================= - -### Fixed - -* Case-insensitive equality queries on indexed string properties failed to - clear some internal state when rerunning the query. This could manifest as - duplicate results or "key not found" errors. - ([#6830](https://github.com/realm/realm-swift/issues/6830), [#6694](https://github.com/realm/realm-swift/issues/6694), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v6.1.3 to v6.1.4 -* Upgraded realm-sync from v5.0.28 to v5.0.29 - -5.4.7 Release notes (2020-09-30) -============================================================= - -### Fixed - -* Equality queries on indexed string properties would sometimes throw "key not - found" exceptions if the hash of the string happened to have bit 62 set. - ([.NET #2025](https://github.com/realm/realm-dotnet/issues/2025), since v5.0.0). -* Queries comparing non-optional int properties to nil would behave as if they - were comparing against zero instead (since v5.0.0). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v6.1.2 to v6.1.3 -* Upgraded realm-sync from v5.0.27 to v5.0.28 - -5.4.6 Release notes (2020-09-29) -============================================================= - -5.4.5 failed to actually update the core version for installation methods other -than SPM. All changes listed there actually happened in this version for -non-SPM installation methods. - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-sync from v5.0.26 to v5.0.27 - -5.4.5 Release notes (2020-09-28) -============================================================= - -### Enhancements - -* Slightly (<5%) improve the performance of most operations which involve - reading from a Realm file. - -### Fixed - -* Rerunning a equality query on an indexed string property would give incorrect - results if a previous run of the query matched multiple objects and it now - matches one object. This could manifest as either finding a non-matching - object or a "key not found" exception being thrown. - ([#6536](https://github.com/realm/realm-swift/issues/6536), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v6.1.1 to v6.1.2 -* Upgraded realm-sync from v5.0.25 to v5.0.26 - -5.4.4 Release notes (2020-09-25) -============================================================= - -### Enhancements -* Improve the asymtotic performance of NOT IN queries on indexed properties. It - is now O(Number of Rows) rather than O(Number of Rows \* Number of values in IN clause.) - -### Fixed - -* Fix a crash inside `realm::Array(Type)::init_from_mem()` which would - sometimes occur when running a query over links immediately after creating - objects of the queried type. - ([#6789](https://github.com/realm/realm-swift/issues/6789) and possibly others, since 5.0.0). -* Possibly fix problems when changing the type of the primary key of an object - from optional to non-optional. - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v6.0.26 to v6.1.1 -* Upgraded realm-sync from v5.0.23 to v5.0.25 - -5.4.3 Release notes (2020-09-21) -============================================================= - -### Fixed - -* Fix compilation via Carthage when using Xcode 12 ([#6717](https://github.com/realm/realm-swift/issues/6717)). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.12 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -5.4.2 Release notes (2020-09-17) -============================================================= - -### Enhancements - -* Add prebuilt binary for Xcode 12 to the release package. - -### Fixed - -* Fix Archiving the Realm and RealmSwift frameworks with Xcode 12. - ([#6774](https://github.com/realm/realm-swift/issues/6774)) - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.12 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -5.4.1 Release notes (2020-09-16) -============================================================= - -### Enhancements - -* Add prebuilt binary for Xcode 11.7 to the release package. - -### Fixed - -* Fix deadlocks when opening a Realm file in both the iOS simulator and Realm - Studio ([#6743](https://github.com/realm/realm-swift/issues/6743), since 5.3.6). -* Fix Springboard deadlocking when an app is unsuspended while it has an open - Realm file which is stored in an app group on iOS 10-12 - ([#6749](https://github.com/realm/realm-swift/issues/6749), since 5.3.6). -* If you use encryption your application cound crash with a message like - "Opening Realm files of format version 0 is not supported by this version of - Realm". ([#6889](https://github.com/realm/realm-java/issues/6889) among others, since 5.0.0) -* Confining a Realm to a serial queue would throw an error claiming that the - queue was not a serial queue on iOS versions older than 12. - ([#6735](https://github.com/realm/realm-swift/issues/6735), since 5.0.0). -* Results would sometimes give stale results inside a write transaction if a - write which should have updated the Results was made before the first access - of a pre-existing Results object. - ([#6721](https://github.com/realm/realm-swift/issues/6721), since 5.0.0) - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.12 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.7. - -### Internal - -* Upgraded realm-core from v6.0.25 to v6.0.26 -* Upgraded realm-sync from v5.0.22 to v5.0.23 - -5.4.0 Release notes (2020-09-09) -============================================================= - -This version bumps the Realm file format version. This means that older -versions of Realm will be unable to open Realm files written by this version, -and a new version of Realm Studio will be required. There are no actual format -changes and the version bump is just to force a re-migration of incorrectly -upgraded Realms. - -### Fixed - -* Upgrading pre-5.x files with string primary keys would result in a file where - `realm.object(ofType:forPrimaryKey:)` would fail to find the object. - ([#6716](https://github.com/realm/realm-swift/issues/6716), since 5.2.0) -* A write transaction which modifies an object with more than 16 managed - properties and causes the Realm file to grow larger than 2 GB could cause an - assertion failure mentioning "m_has_refs". ([JS #3194](https://github.com/realm/realm-js/issues/3194), since 5.0.0). -* Objects with more than 32 properties could corrupt the Realm file and result - in a variety of crashes. ([Java #7057](https://github.com/realm/realm-java/issues/7057), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.12 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.23 to v6.0.25 -* Upgraded realm-sync from v5.0.20 to v5.0.22 - -5.3.6 Release notes (2020-09-02) -============================================================= - -### Fixed - -* Work around iOS 14 no longer allowing the use of file locks in shared - containers, which resulted in the OS killing an app which entered the - background while a Realm was open ([#6671](https://github.com/realm/realm-swift/issues/6671)). -* If an attempt to upgrade a realm has ended with a crash with "migrate_links()" - in the call stack, the realm was left in an invalid state. The migration - logic now handles this state and can complete upgrading files which were - incompletely upgraded by pre-5.3.4 versions. -* Fix deadlocks when writing to a Realm file on an exFAT partition from macOS. - ([#6691](https://github.com/realm/realm-swift/issues/6691)). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.19 to v6.0.23 -* Upgraded realm-sync from v5.0.16 to v5.0.20 - -5.3.5 Release notes (2020-08-20) -============================================================= - -### Fixed - -* Opening Realms on background threads could produce spurious Incorrect Thread - exceptions when a cached Realm existed for a previously existing thread with - the same thread ID as the current thread. - ([#6659](https://github.com/realm/realm-swift/issues/6659), - [#6689](https://github.com/realm/realm-swift/issues/6689), - [#6712](https://github.com/realm/realm-swift/issues/6712), since 5.0.0). -* Upgrading a table with incoming links but no properties would crash. This was - probably not possible to hit in practice as we reject object types with no - properties. -* Upgrading a non-nullable List which nonetheless contained null values would - crash. This was possible due to missing error-checking in some older versions - of Realm. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.18 to v6.0.19 -* Upgraded realm-sync from v5.0.15 to v5.0.16 - -5.3.4 Release notes (2020-08-17) -============================================================= - -### Fixed - -* Accessing a Realm after calling `deleteAll()` would sometimes throw an - exception with the reason 'ConstIterator copy failed'. ([#6597](https://github.com/realm/realm-swift/issues/6597), since 5.0.0). -* Fix an assertion failure inside the `migrate_links()` function when upgrading - a pre-5.0 Realm file. -* Fix a bug in memory mapping management. This bug could result in multiple - different asserts as well as segfaults. In many cases stack backtraces would - include members of the EncyptedFileMapping near the top - even if encryption - was not used at all. In other cases asserts or crashes would be in methods - reading an array header or array element. In all cases the application would - terminate immediately. ([Core #3838](https://github.com/realm/realm-core/pull/3838), since v5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.14 to v6.0.18 -* Upgraded realm-sync from v5.0.14 to v5.0.15 - -5.3.3 Release notes (2020-07-30) -============================================================= - -### Enhancements - -* Add support for the x86_64 watchOS simulator added in Xcode 12. - -### Fixed - -* (RLM)Results objects would incorrectly pin old read transaction versions - until they were accessed after a Realm was refreshed, resulting in the Realm - file growing to large sizes if a Results was retained but not accessed after - every write. ([#6677](https://github.com/realm/realm-swift/issues/6677), since 5.0.0). -* Fix linker errors when using SwiftUI previews with Xcode 12 when Realm was - installed via Swift Package Manager. ([#6625](https://github.com/realm/realm-swift/issues/6625)) - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.12 to v6.0.14 -* Upgraded realm-sync from v5.0.12 to v5.0.14 - -5.3.2 Release notes (2020-07-21) -============================================================= - -### Fixed - -* Fix a file format upgrade bug when opening older Realm files. Could cause - assertions like "Assertion failed: ref != 0" during opning of a Realm. - ([Core #6644](https://github.com/realm/realm-swift/issues/6644), since 5.2.0) -* A use-after-free would occur if a Realm was compacted, opened on multiple - threads prior to the first write, then written to while reads were happening - on other threads. This could result in a variety of crashes, often inside - realm::util::EncryptedFileMapping::read_barrier. - (Since v5.0.0, [#6626](https://github.com/realm/realm-swift/issues/6626), - [#6628](https://github.com/realm/realm-swift/issues/6628), - [#6652](https://github.com/realm/realm-swift/issues/6652), - [#6655](https://github.com/realm/realm-swift/issues/6555), - [#6656](https://github.com/realm/realm-swift/issues/6656)). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.11 to v6.0.12 -* Upgraded realm-sync from v5.0.11 to v5.0.12 - -5.3.1 Release notes (2020-07-17) -============================================================= - -### Enhancements - -* Add prebuilt binary for Xcode 11.6 to the release package. - -### Fixed - -* Creating an object inside migration which changed that object type's primary - key would hit an assertion failure mentioning primary_key_col - ([#6613](https://github.com/realm/realm-swift/issues/6613), since 5.0.0). -* Modifying the value of a string primary key property inside a migration with - a Realm file which was upgraded from pre-5.0 would corrupt the property's - index, typically resulting in crashes. ([Core #3765](https://github.com/realm/realm-core/issues/3765), since 5.0.0). -* Some Realm files which hit assertion failures when upgrading from the pre-5.0 - file format should now upgrade correctly (Since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.9 to v6.0.11 -* Upgraded realm-sync from v5.0.8 to v5.0.11 - -5.3.0 Release notes (2020-07-14) -============================================================= - -### Enhancements - -* Add `Realm.objectWillChange`, which is a Combine publisher that will emit a - notification each time the Realm is refreshed or a write transaction is - commited. - -### Fixed - -* Fix the spelling of `ObjectKeyIdentifiable`. The old spelling is available - and deprecated for compatibility. -* Rename `RealmCollection.publisher` to `RealmCollection.collectionPublisher`. - The old name interacted with the `publisher` defined by `Sequence` in very - confusing ways, so we need to use a different name. The `publisher` name is - still available for compatibility. ([#6516](https://github.com/realm/realm-swift/issues/6516)) -* Work around "xcodebuild timed out while trying to read - SwiftPackageManagerExample.xcodeproj" errors when installing Realm via - Carthage. ([#6549](https://github.com/realm/realm-swift/issues/6549)). -* Fix a performance regression when using change notifications. (Since 5.0.0, - [#6629](https://github.com/realm/realm-swift/issues/6629)). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v6.0.8 to v6.0.9 -* Upgraded realm-sync from v5.0.7 to v5.0.8 - -5.2.0 Release notes (2020-06-30) -============================================================= - -### Fixed -* Opening a SyncSession with LOCAL app deployments would not use the correct endpoints. -This release also contains all changes from 5.0.3 and 5.1.0. - -### Breaking Changes -* The following classes & aliases have been renamed to align Cocoa with the other Realm SDKs: - -| Old API | New API | -|:------------------------------------------------------------|:---------------------------------------------------------------| -| `RLMSyncUser` | `RLMUser` | -| `SyncUser` | `User` | -| `RLMAppCredential` | `RLMCredential` | -| `AppCredential` | `Credential` | -| `RealmApp` | `App` | -| `RLMUserAPIKeyProviderClient` | `RLMAPIKeyAuth` | -| `RLMUsernamePasswordProviderClient` | `RLMEmailPasswordAuth` | -| `UsernamePasswordProviderClient` | `EmailPasswordAuth` | -| `UserAPIKeyProviderClient` | `APIKeyAuth` | - -* The following functionality has also moved to the User: - -| Old API | New API | -|:-------------------------------------------------------------|:--------------------------------------------------------------| -| `[RLMApp callFunctionNamed:]` | `[RLMUser callFunctionNamed:]` | -| `App.functions` | `User.functions` | -| `[RLMApp mongoClientWithServiceName:]` | `[RLMUser mongoClientWithServiceName:]` | -| `App.mongoClient(serviceName)` | `User.mongoClient(serviceName)` | -| `[RLMApp userAPIKeyProviderClient]` | `[RLMUser apiKeyAuth]` | -| `App.userAPIKeyProviderClient` | `App.apiKeyAuth()` | -| `[RLMApp logOut:]` | `[RLMUser logOut]` | -| `App.logOut(user)` | `User.logOut()` | -| `[RLMApp removeUser:]` | `[RLMUser remove]` | -| `App.remove(user)` | `User.remove()` | -| `[RLMApp linkUser:credentials:]` | `[RLMUser linkWithCredentials:]` | -| `App.linkUser(user, credentials)` | `User.link(credentials)` | - -* The argument labels in Swift have changed for several methods: -| Old API | New API | -|:-------------------------------------------------------------|:--------------------------------------------------------------| -| `APIKeyAuth.createApiKey(withName:completion:)` | `APIKeyAuth.createApiKey(named:completion:)` | -| `App.login(withCredential:completion:) | `App.login(credentials:completion:)` | -| `App.pushClient(withServiceName:)` | `App.pushClient(serviceName:)` | -| `MongoClient.database(withName:)` | `MongoClient.database(named:)` | - -* `refreshCustomData()` on User now returns void and passes the custom data to the callback on success. - -### Compatibility -* This release introduces breaking changes w.r.t some sync classes and MongoDB Realm Cloud functionality. - (See the breaking changes section for the full list) -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* Realm Studio: 10.0.0 or later. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 - -10.0.0-beta.2 Release notes (2020-06-09) -============================================================= -Xcode 11.3 and iOS 9 are now the minimum supported versions. - -### Enhancements - -* Add support for building with Xcode 12 beta 1. watchOS currently requires - removing x86_64 from the supported architectures. Support for the new 64-bit - watch simulator will come in a future release. - -### Fixed -* Opening a SyncSession with LOCAL app deployments would not use the correct endpoints. -* Linking from embedded objects to top-level objects was incorrectly disallowed. - -* Opening a Realm file in file format v6 (created by Realm Cocoa versions - between 2.4 and 2.10) would crash. (Since 5.0.0, [Core #3764](https://github.com/realm/realm-core/issues/3764)). -* Upgrading v9 (pre-5.0) Realm files would create a redundant search index for - primary key properties. This index would then be removed the next time the - Realm was opened, resulting in some extra i/o in the upgrade process. - (Since 5.0.0, [Core #3787](https://github.com/realm/realm-core/issues/3787)). -* Fixed a performance issue with upgrading v9 files with search indexes on - non-primary-key properties. (Since 5.0.0, [Core #3767](https://github.com/realm/realm-core/issues/3767)). - -### Compatibility -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 - -10.0.0-beta.1 Release notes (2020-06-08) -============================================================= - -NOTE: This version bumps the Realm file format to version 11. It is not -possible to downgrade to earlier versions. Older files will automatically be -upgraded to the new file format. Only [Realm Studio -10.0.0](https://github.com/realm/realm-studio/releases/tag/v10.0.0-beta.1) or -later will be able to open the new file format. - -### Enhancements - -* Add support for next generation sync. Support for syncing to MongoDB instead - of Realm Object Server. Applications must be created at realm.mongodb.com -* The memory mapping scheme for Realm files has changed to better support - opening very large files. -* Add support for the ObjectId data type. This is an automatically-generated - unique identifier similar to a GUID or a UUID. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for the Decimal128 data type. This is a 128-bit IEEE 754 decimal - floating point number similar to NSDecimalNumber. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for embedded objects. Embedded objects are objects which are - owned by a single parent object, and are deleted when that parent object is - deleted. They are defined by subclassing `EmbeddedObject` / - `RLMEmbeddedObject` rather than `Object` / `RLMObject`. -* Add `-[RLMSyncUser customData]`/`SyncUser.customData`. Custom data is - configured in your MongoDB Realm App. -* Add `-[RLMApp callFunctionNamed:arguments]`/`RealmApp.functions`. This is the - entry point for calling Remote MongoDB Realm functions. Functions allow you - to define and execute server-side logic for your application. Functions are - written in modern JavaScript (ES6+) and execute in a serverless manner. When - you call a function, you can dynamically access components of the current - application as well as information about the request to execute the function - and the logged in user that sent the request. -* Add `-[RLMApp mongoClientWithServiceName]`/`RealmApp.mongoClient`. This is - the entry point for calling your Remote MongoDB Service. The read operations - are `-[RLMMongoCollection findWhere:completion:]`, `-[RLMMongoCollection - countWhere:completion:]`and `-[RLMMongoCollection - aggregateWithPipeline:completion:]`. The write operations are - `-[RLMMongoCollection insertOneDocument:completion:]`, `-[RLMMongoCollection - insertManyDocuments:completion:]`, `-[RLMMongoCollection - updateOneDocument:completion:]`, `-[RLMMongoCollection - updateManyDocuments:completion:]`, `-[RLMMongoCollection - deleteOneDocument:completion:]`, and `-[RLMMongoCollection - deleteManyDocuments:completion:]`. If you are already familiar with MongoDB - drivers, it is important to understand that the remote MongoCollection only - provides access to the operations available in MongoDB Realm. -* Change `[RLMSyncUser - configurationWithPartitionValue:]`/`SyncUser.configuration(with:)` to accept - all BSON types. Partition values can currently be of types `String`, `Int`, - or `ObjectId`. Opening a realm by partition value is the equivalent of - previously opening a realm by URL. In this case, partitions are meant to be - more closely associated with your data. E.g., if you are running a `Dog` - kennel, and have a field `breed` that acts as your partition key, you could - open up realms based on the breed of the dogs. - -### Breaking Changes - -* We no longer support Realm Cloud (legacy), but instead the new "MongoDB - Realm" Cloud. MongoDB Realm is a serverless platform that enables developers - to quickly build applications without having to set up server infrastructure. - MongoDB Realm is built on top of MongoDB Atlas, automatically integrating the - connection to your database. -* Remove support for Query-based sync, including the configuration parameters - and the `RLMSyncSubscription` and `SyncSubscription` types ([#6437](https://github.com/realm/realm-swift/pull/6437)). -* Primary key properties are no longer marked as being indexed. This reflects - an internal change to how primary keys are handled that should not have any - other visible effects. ([#6440](https://github.com/realm/realm-swift/pull/6440)). -* Remove everything related to sync permissions, including both the path-based - permission system and the object-level privileges for query-based sync. ([#6445](https://github.com/realm/realm-swift/pulls/6445)) -* Primary key uniqueness is now enforced when creating new objects during - migrations, rather than only at the end of migrations. Previously new objects - could be created with duplicate primary keys during a migration as long as - the property was changed to a unique value before the end of the migration, - but now a unique value must be supplied when creating the object. -* Remove support for Realm Object Server. - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* `List.index(of:)` would give incorrect results if it was the very first thing - called on that List after a Realm was refreshed following a write which - modified the List. (Since 5.0.0, [#6606](https://github.com/realm/realm-swift/issues/6606)). -* If a ThreadSafeReference was the only remaining reference to a Realm, - multiple copies of the file could end up mapped into memory at once. This - probably did not have any symptoms other than increased memory usage. (Since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 -* Upgraded realm-core from v6.0.6 to v6.0.7 -* Upgraded realm-sync from v5.0.5 to v5.0.6 -* Upgraded realm-core from v6.0.6 to v6.0.8 -* Upgraded realm-sync from v5.0.5 to v5.0.7 - -5.1.0 Release notes (2020-06-22) -============================================================= - -### Enhancements - -* Allow opening full-sync Realms in read-only mode. This disables local schema - initialization, which makes it possible to open a Realm which the user does - not have write access to without using asyncOpen. In addition, it will report - errors immediately when an operation would require writing to the Realm - rather than reporting it via the sync error handler only after the server - rejects the write. - -### Fixed - -* Opening a Realm using a configuration object read from an existing Realm - would incorrectly bind the new Realm to the original Realm's thread/queue, - resulting in "Realm accessed from incorrect thread." exceptions. - ([#6574](https://github.com/realm/realm-swift/issues/6574), - [#6559](https://github.com/realm/realm-swift/issues/6559), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -5.0.3 Release notes (2020-06-10) -============================================================= - -### Fixed - -* `-[RLMObject isFrozen]` always returned false. ([#6568](https://github.com/realm/realm-swift/issues/6568), since 5.0.0). -* Freezing an object within the write transaction that the object was created - in now throws an exception rather than crashing when the object is first - used. -* The schema for frozen Realms was not properly initialized, leading to crashes - when accessing a RLMLinkingObjects property. - ([#6568](https://github.com/realm/realm-swift/issues/6568), since 5.0.0). -* Observing `Object.isInvalidated` via a keypath literal would produce a - warning in Swift 5.2 due to the property not being marked as @objc. - ([#6554](https://github.com/realm/realm-swift/issues/6554)) - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -5.0.2 Release notes (2020-06-02) -============================================================= - -### Fixed - -* Fix errSecDuplicateItem (-25299) errors when opening a synchronized Realm - when upgrading from pre-5.0 versions of Realm. - ([#6538](https://github.com/realm/realm-swift/issues/6538), [#6494](https://github.com/realm/realm-swift/issues/6494), since 5.0.0). -* Opening Realms stored on filesystems which do not support preallocation (such - as ExFAT) would give "Operation not supported" exceptions. - ([#6508](https://github.com/realm/realm-swift/issues/6508), since 3.2.0). -* 'NoSuchTable' exceptions would sometimes be thrown after upgrading a Relam - file to the v10 format. ([Core #3701](https://github.com/realm/realm-core/issues/3701), since 5.0.0) -* If the upgrade process was interrupted/killed for various reasons, the - following run could stop with some assertions failing. No instances of this - happening were reported to us. (Since 5.0.0). -* Queries filtering a `List` where the query was on an indexed property over a - link would sometimes give incomplete results. - ([#6540](https://github.com/realm/realm-swift/issues/6540), since 4.1.0 but - more common since 5.0.0) -* Opening a file in read-only mode would attempt to make a spurious write to - the file, causing errors if the file was in read-only storage (since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v6.0.4 to v6.0.6 -* Upgraded realm-sync from v5.0.3 to v5.0.5 - -5.0.1 Release notes (2020-05-27) -============================================================= - -### Enhancements - -* Add prebuilt binary for Xcode 11.5 to the release package. - -### Fixed - -* Fix linker error when building a xcframework for Catalyst. - ([#6511](https://github.com/realm/realm-swift/issues/6511), since 4.3.1). -* Fix building for iOS devices when using Swift Package Manager - ([#6522](https://github.com/realm/realm-swift/issues/6522), since 5.0.0). -* `List` and `RealmOptional` properties on frozen objects were not initialized - correctly and would always report `nil` or an empty list. - ([#6527](https://github.com/realm/realm-swift/issues/6527), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -5.0.0 Release notes (2020-05-15) -============================================================= - -NOTE: This version bumps the Realm file format to version 10. It is not -possible to downgrade version 9 or earlier. Files created with older versions -of Realm will be automatically upgraded. Only -[Studio 3.11](https://github.com/realm/realm-studio/releases/tag/v3.11.0) or later will be able -to open the new file format. - -### Enhancements - -* Storing large binary blobs in Realm files no longer forces the file to be at - least 8x the size of the largest blob. -* Reduce the size of transaction logs stored inside the Realm file, reducing - file size growth from large transactions. -* Add support for frozen objects. `Realm`, `Results`, `List` and `Object` now - have `freeze()` methods which return a frozen copy of the object. These - objects behave similarly to creating unmanaged deep copies of the source - objects. They can be read from any thread and do not update when writes are - made to the Realm, but creating frozen objects does not actually copy data - out of the Realm and so can be much faster and use less memory. Frozen - objects cannot be mutated or observed for changes (as they never change). - ([PR #6427](https://github.com/realm/realm-swift/pull/6427)). -* Add the `isFrozen` property to `Realm`, `Results`, `List` and `Object`. -* Add `Realm.Configuration.maxNumberOfActiveVersions`. Each time a write - transaction is performed, a new version is created inside the Realm, and then - any versions which are no longer in use are cleaned up. If too many versions - are kept alive while performing writes (either due to a background thread - performing a long operation that doesn't let the Realm on that thread - refresh, or due to holding onto frozen versions for a long time) the Realm - file will grow in size, potentially to the point where it is too large to be - opened. Setting this configuration option will make write transactions which - would cause the live version count to exceed the limit to instead fail. -* Add support for queue-confined Realms. Rather than being bound to a specific - thread, queue-confined Realms are bound to a serial dispatch queue and can be - used within blocks dispatched to that queue regardless of what thread they - happen to run on. In addition, change notifications will be delivered to that - queue rather than the thread's run loop. ([PR #6478](https://github.com/realm/realm-swift/pull/6478)). -* Add an option to deliver object and collection notifications to a specific - serial queue rather than the current thread. ([PR #6478](https://github.com/realm/realm-swift/pull/6478)). -* Add Combine publishers for Realm types. Realm collections have a `.publisher` - property which publishes the collection each time it changes, and a - `.changesetPublisher` which publishes a `RealmCollectionChange` each time the - collection changes. Corresponding publishers for Realm Objects can be - obtained with the `publisher()` and `changesetPublisher()` global functions. -* Extend Combine publishers which output Realm types with a `.freeze()` - function which will make the publisher instead output frozen objects. -* String primary keys no longer require a separate index, improving insertion - and deletion performance without hurting lookup performance. -* Reduce the encrypted page reclaimer's impact on battery life when encryption - is used. ([Core #3461](https://github.com/realm/realm-core/pull/3461)). - -### Fixed - -* The uploaded bytes in sync progress notifications was sometimes incorrect and - wouldn't exactly equal the uploadable bytes when the uploaded completed. -* macOS binaries were built with the incorrect deployment target (10.14 rather - than 10.9), resulting in linker warnings. ([#6299](https://github.com/realm/realm-swift/issues/6299), since 3.18.0). -* An internal datastructure for List properties could be double-deleted if the - last reference was released from a thread other than the one which the List - was created on at the wrong time. This would typically manifest as - "pthread_mutex_destroy() failed", but could also result in other kinds of - crashes. ([#6333](https://github.com/realm/realm-swift/issues/6333)). -* Sorting on float or double properties containing NaN values had inconsistent - results and would sometimes crash due to out-of-bounds memory accesses. - ([#6357](https://github.com/realm/realm-swift/issues/6357)). - -### Breaking Changes - -* The ObjectChange type in Swift is now generic and includes a reference to the - object which changed. When using `observe(on:)` to receive notifications on a - dispatch queue, the object will be confined to that queue. -* The Realm instance passed in the callback to asyncOpen() is now confined to - the callback queue passed to asyncOpen() rather than the thread which the - callback happens to be called on. This means that the Realm instance may be - stored and reused in further blocks dispatched to that queue, but the queue - must now be a serial queue. -* Files containing Date properties written by version of Realm prior to 1.0 can - no longer be opened. -* Files containing Any properties can no longer be opened. This property type - was never documented and was deprecated in 1.0. -* Deleting objects now preserves the order of objects reported by unsorted - Results rather than performing a swap operation before the delete. Note that - it is still not safe to assume that the order of objects in an unsorted - Results is the order that the objects were created in. -* The minimum supported deployment target for iOS when using Swift Package - Manager to install Realm is now iOS 11. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.4.1. - -### Internal - -* Upgraded realm-core from v5.23.8 to v6.0.4 -* Upgraded realm-sync from v4.9.5 to v5.0.3 - -5.0.0-beta.6 Release notes (2020-05-08) -============================================================= - -### Enhancements - -* Add support for queue-confined Realms. Rather than being bound to a specific - thread, queue-confined Realms are bound to a serial dispatch queue and can be - used within blocks dispatched to that queue regardless of what thread they - happen to run on. In addition, change notifications will be delivered to that - queue rather than the thread's run loop. ([PR #6478](https://github.com/realm/realm-swift/pull/6478)). -* Add an option to deliver object and collection notifications to a specific - serial queue rather than the current thread. ([PR #6478](https://github.com/realm/realm-swift/pull/6478)). - -### Fixed - -* The uploaded bytes in sync progress notifications was sometimes incorrect and - wouldn't exactly equal the uploadable bytes when the uploaded completed. - -### Breaking Changes - -* The Realm instance passed in the callback to asyncOpen() is now confined to - the callback queue passed to asyncOpen() rather than the thread which the - callback happens to be called on. This means that the Realm instance may be - stored and reused in further blocks dispatched to that queue, but the queue - must now be a serial queue. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.4.1. - -### Internal - -* Upgraded realm-core from v6.0.3 to v6.0.4 -* Upgraded realm-sync from v5.0.1 to v5.0.3 - -4.4.1 Release notes (2020-04-16) -============================================================= - -### Enhancements - -* Upgrade Xcode 11.4 binaries to Xcode 11.4.1. - -### Fixed - -* Fix a "previous <= m_schema_transaction_version_max" assertion failure caused - by a race condition that could occur after performing a migration. (Since 3.0.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.4.1. - -5.0.0-beta.3 Release notes (2020-02-26) -============================================================= - -Based on 4.3.2 and also includes all changes since 4.3.0. - -### Enhancements - -* Add support for frozen objects. `Realm`, `Results`, `List` and `Object` now - have `freeze()` methods which return a frozen copy of the object. These - objects behave similarly to creating unmanaged deep copies of the source - objects. They can be read from any thread and do not update when writes are - made to the Realm, but creating frozen objects does not actually copy data - out of the Realm and so can be much faster and use less memory. Frozen - objects cannot be mutated or observed for changes (as they never change). - ([PR #6427](https://github.com/realm/realm-swift/pull/6427)). -* Add the `isFrozen` property to `Realm`, `Results`, `List` and `Object`. -* Add `Realm.Configuration.maxNumberOfActiveVersions`. Each time a write - transaction is performed, a new version is created inside the Realm, and then - any versions which are no longer in use are cleaned up. If too many versions - are kept alive while performing writes (either due to a background thread - performing a long operation that doesn't let the Realm on that thread - refresh, or due to holding onto frozen versions for a long time) the Realm - file will grow in size, potentially to the point where it is too large to be - opened. Setting this configuration option will make write transactions which - would cause the live version count to exceed the limit to instead fail. - - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-core from v6.0.0-beta.3 to v6.0.3 -* Upgraded realm-sync from v5.0.0-beta.2 to v5.0.1 - -5.0.0-beta.2 Release notes (2020-01-13) -============================================================= - -Based on 4.3.0 and also includes all changes since 4.1.1. - -### Fixed - -* Fix compilation when using CocoaPods targeting iOS versions older than 11 (since 5.0.0-alpha). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-core from v6.0.0-beta.2 to v6.0.0-beta.3 -* Upgraded realm-sync from v5.0.0-beta.1 to v5.0.0-beta.2 - -5.0.0-beta.1 Release notes (2019-12-13) -============================================================= - -Based on 4.1.1 and also includes all changes since 4.1.0. - -NOTE: This version bumps the Realm file format to version 10. It is not possible to downgrade version 9 or earlier. Files created with older versions of Realm will be automatically upgraded. - -### Enhancements - -* String primary keys no longer require a separate index, improving insertion - and deletion performance without hurting lookup performance. -* Reduce the encrypted page reclaimer's impact on battery life when encryption - is used. ([Core #3461](https://github.com/realm/realm-core/pull/3461)). - -### Fixed - -* Fix an error when a table-backed Results was accessed immediately after - deleting the object previously at the index being accessed (since - 5.0.0-alpha.1). -* macOS binaries were built with the incorrect deployment target (10.14 rather - than 10.9), resulting in linker warnings. ([#6299](https://github.com/realm/realm-swift/issues/6299), since 3.18.0). -* An internal datastructure for List properties could be double-deleted if the - last reference was released from a thread other than the one which the List - was created on at the wrong time. This would typically manifest as - "pthread_mutex_destroy() failed", but could also result in other kinds of - crashes. ([#6333](https://github.com/realm/realm-swift/issues/6333)). -* Sorting on float or double properties containing NaN values had inconsistent - results and would sometimes crash due to out-of-bounds memory accesses. - ([#6357](https://github.com/realm/realm-swift/issues/6357)). - -### Known Issues - -* Changing which property of an object is the primary key in a migration will - break incoming links to objects of that type. -* Changing the primary key of an object with Data properties in a migration - will crash. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-core from v6.0.0-alpha.24 to v6.0.0-beta.2 -* Upgraded realm-sync from 4.7.1-core6.5 to v5.0.0-beta.1 - -5.0.0-alpha.1 Release notes (2019-11-14) -============================================================= - -Based on 4.1.0. - -### Enhancements - -* Add `-[RLMRealm fileExistsForConfiguration:]`/`Realm.fileExists(for:)`, - which checks if a local Realm file exists for the given configuration. -* Add `-[RLMRealm deleteFilesForConfiguration:]`/`Realm.deleteFiles(for:)` - to delete the Realm file and all auxiliary files for the given configuration. -* Storing large binary blobs in Realm files no longer forces the file to be at - least 8x the size of the largest blob. -* Reduce the size of transaction logs stored inside the Realm file, reducing - file size growth from large transactions. - -NOTE: This version bumps the Realm file format to version 10. It is not -possible to downgrade version 9 or earlier. Files created with older versions -of Realm will be automatically upgraded. This automatic upgrade process is not -yet well tested. Do not open Realm files with data you care about with this -alpha version. - -### Breaking Changes - -* Files containing Date properties written by version of Realm prior to 1.0 can - no longer be opened. -* Files containing Any properties can no longer be opened. This property type - was never documented and was deprecated in 1.0. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades v9) -* Realm Object Server: 3.21.0 or later. -* APIs are backwards compatible with all previous releases in the 4.x.y series. -* Carthage release for Swift is built with Xcode 11.3. -* Carthage release for Swift is built with Xcode 11.2.1. - -### Internal - -* Upgraded realm-core from 5.23.6 to v6.0.0-alpha.24. -* Upgraded realm-sync from 4.8.2 to 4.7.1-core6.5. - -4.4.0 Release notes (2020-03-26) -============================================================= - -Swift 4.0 and Xcode 10.3 are now the minimum supported versions. - -### Enhancements - -* Allow setting the `fileUrl` for synchronized Realms. An appropriate local - path based on the sync URL will still be used if it is not overridden. - ([PR #6454](https://github.com/realm/realm-swift/pull/6454)). -* Add Xcode 11.4 binaries to the release package. - -### Fixed - -* None. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.4. - -4.3.2 Release notes (2020-02-06) -============================================================= - -### Enhancements - -* Similar to `autoreleasepool()`, `realm.write()` now returns the value which - the block passed to it returns. Returning `Void` from the block is still allowed. - -### Fixed - -* Fix a memory leak attributed to `property_copyAttributeList` the first time a - Realm is opened when using Realm Swift. ([#6409](https://github.com/realm/realm-swift/issues/6409), since 4.0.0). -* Connecting to a `realms:` sync URL would crash at runtime on iOS 11 (and no - other iOS versions) inside the SSL validation code. (Since 4.3.1). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-sync from 4.9.4 to 4.9.5. - -4.3.1 Release notes (2020-01-16) -============================================================= - -### Enhancements - -* Reduce the encrypted page reclaimer's impact on battery life when encryption - is used. ([Core #3461](https://github.com/realm/realm-core/pull/3461)). - -### Fixed - -* macOS binaries were built with the incorrect deployment target (10.14 rather - than 10.9), resulting in linker warnings. ([#6299](https://github.com/realm/realm-swift/issues/6299), since 3.18.0). -* An internal datastructure for List properties could be double-deleted if the - last reference was released from a thread other than the one which the List - was created on at the wrong time. This would typically manifest as - "pthread_mutex_destroy() failed", but could also result in other kinds of - crashes. ([#6333](https://github.com/realm/realm-swift/issues/6333)). -* Sorting on float or double properties containing NaN values had inconsistent - results and would sometimes crash due to out-of-bounds memory accesses. - ([#6357](https://github.com/realm/realm-swift/issues/6357)). -* A NOT query on a `List` which happened to have the objects in a - different order than the underlying table would sometimes include the object - immediately before an object which matches the query. ([#6289](https://github.com/realm/realm-swift/issues/6289), since 0.90.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-core from 5.23.6 to 5.23.8. -* Upgraded realm-sync from 4.9.0 to 4.9.4. - -4.3.0 Release notes (2019-12-19) -============================================================= - -### Enhancements - -* Add the ability to set a custom logger function on `RLMSyncManager` which is - called instead of the default NSLog-based logger. -* Expose configuration options for the various types of sync connection - timeouts and heartbeat intervals on `RLMSyncManager`. -* Add an option to have `Realm.asyncOpen()` report an error if the connection - times out rather than swallowing the error and attempting to reconnect until - it succeeds. - -### Fixed - -* Fix a crash when using value(forKey:) on a LinkingObjects property (including - when doing so indirectly, such as by querying on that property). - ([#6366](https://github.com/realm/realm-swift/issues/6366), since 4.0.0). -* Fix a rare crash in `ClientHistoryImpl::integrate_server_changesets()` which - would only happen in Debug builds (since v3.0.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-sync from 4.8.2 to 4.9.0. - -4.2.0 Release notes (2019-12-16) -============================================================= - -### Enhancements - -* Add `-[RLMRealm fileExistsForConfiguration:]`/`Realm.fileExists(for:)`, - which checks if a local Realm file exists for the given configuration. -* Add `-[RLMRealm deleteFilesForConfiguration:]`/`Realm.deleteFiles(for:)` - to delete the Realm file and all auxiliary files for the given configuration. - -### Fixed - -* None. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.3. - -4.1.1 Release notes (2019-11-18) -============================================================= - -### Fixed - -* The UpdatePolicy passed to `realm.add()` or `realm.create()` was not properly - propagated when adding objects within a `List`, which could result in - spurious change notifications when using `.modified`. - ([#6321](https://github.com/realm/realm-swift/issues/6321), since v3.16.0) -* Fix a rare deadlock when a Realm collection or object was observed, then - `refresh()` was explicitly called, and then the NotificationToken from the - observation was destroyed on a different thread (since 0.98.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.2. - -4.1.0 Release notes (2019-11-13) -============================================================= - -### Enhancements - -* Improve performance of queries over a link where the final target property - has an index. -* Restore support for storing `@objc enum` properties on RealmSwift.Object - subclasses (broken in 4.0.0), and add support for storing them in - RealmOptional properties. - -### Fixed - -* The sync client would fail to reconnect after failing to integrate a - changeset. The bug would lead to further corruption of the client’s Realm - file. ([RSYNC-48](https://jira.mongodb.org/browse/RSYNC-48), since v3.2.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.2. - -### Internal - -* Upgraded realm-core from 5.23.5 to 5.23.6. -* Upgraded realm-sync from 4.7.11 to 4.8.2 - -4.0.0 Release notes (2019-11-08) -============================================================= - -### Breaking Changes - -* All previously deprecated functionality has now been removed entirely. -* The schema discovery logic for RealmSwift.Object subclasses has been - rewritten in Swift. This should not have any effect on valid class - definitions, but there may be types of invalid definitions which previously - worked by coincidence and no longer do. -* `SyncSubscription` no longer has a generic type parameter, as the type was - not actually used for anything. -* The following Swift types have changed from `final class` to `struct`: - - AnyRealmCollection - - LinkingObjects - - ObjectiveCSupport - - Realm - - Results - - SyncSubscription - - ThreadSafeReference - There is no intended change in semantics from this, but certain edge cases - may behave differently. -* The designated initializers defined by RLMObject and Object other than - zero-argument `init` have been replaced with convenience initializers. -* The implementation of the path-based permissions API has been redesigned to - accomodate changes to the server. This should be mostly a transparent change, - with two main exceptions: - 1. SyncPermission objects are no longer live Realm objects, and retrieving - permissions gives an Array rather than Results. - Getting up-to-date permissions now requires calling retrievePermissions() again - rather than observing the permissions. - 2. The error codes for permissions functions have changed. Rather than a - separate error type and set of error codes, permission functions now produce - SyncAuthErrors. - -### Enhancements - -* Improve performance of initializing Realm objects with List properties. - -### Fixed - -* None. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.2. - -3.21.0 Release notes (2019-11-04) -============================================================= - -### Enhancements - -* Add prebuilt binaries for Xcode 11.2. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.2. - -3.20.0 Release notes (2019-10-21) -============================================================= - -### Enhancements - -* Add support for custom refresh token authentication. This allows a user to be - authorized with an externally-issued refresh token when ROS is configured to - recognize the external issuer as a refresh token validator. - ([PR #6311](https://github.com/realm/realm-swift/pull/6311)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11. - -3.19.1 Release notes (2019-10-17) -============================================================= - -### Enhancements - -* Improve performance of sync changeset integration. Transactions involving a - very large number of objects and cheap operations on each object are as much - as 20% faster. - -### Fixed - -* Fix a crash when a RLMArray/List of primitives was observed and then the - containing object was deleted before the first time that the background - notifier could run. - ([Issue #6234](https://github.com/realm/realm-swift/issues/6234, since 3.0.0)). -* Remove an incorrect assertion that would cause crashes inside - `TableInfoCache::get_table_info()`, with messages like "Assertion failed: info.object_id_index == 0 [3, 0]". - (Since 3.18.0, [#6268](https://github.com/realm/realm-swift/issues/6268) and [#6257](https://github.com/realm/realm-swift/issues/6257)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.0. - -### Internal - -* Upgrade to REALM_SYNC_VERSION=4.7.11 - -3.19.0 Release notes (2019-09-27) -============================================================= - -### Enhancements - -* Expose ObjectSchema.objectClass in Swift as looking up the class via - NSClassFromString() can be complicated for Swift types. - ([PR #6244](https://github.com/realm/realm-swift/pull/6244)). -* Add support for suppressing notifications using closure-based write/transaction methods. - ([PR #6252](https://github.com/realm/realm-swift/pull/6252)). - -### Fixed - -* IN or chained OR equals queries on an unindexed string column would fail to - match some results if any of the strings were 64 bytes or longer. - ([Core #3386](https://github.com/realm/realm-core/pull/3386), since 3.14.2). -* Query Based Sync subscriptions for queries involving a null timestamp were - not sent to the server correctly and would match no objects. - ([Core #3389](https://github.com/realm/realm-core/pull/3388), since 3.17.3). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.0. - -### Internal - -* Upgrade to REALM_CORE_VERSION=5.23.5 -* Upgrade to REALM_SYNC_VERSION=4.7.8 - -3.18.0 Release notes (2019-09-13) -============================================================= - -The file format for synchronized Realms has changed. Old Realms will be -automatically upgraded when they are opened. Once upgraded, the files will not -be openable by older versions of Realm. The upgrade should not take a -significant amount of time to run or run any risk of errors. - -This does not effect non-synchronized Realms. - -### Enhancements - -* Improve performance of queries on Date properties - ([Core #3344](https://github.com/realm/realm-core/pull/3344), [Core #3351](https://github.com/realm/realm-core/pull/3351)). -* Syncronized Realms are now more aggressive about trimming local history that - is no longer needed. This should reduce file size growth in write-heavy - workloads. ([Sync #3007](https://github.com/realm/realm-sync/issues/3007)). -* Add support for building Realm as an xcframework. - ([PR #6238](https://github.com/realm/realm-swift/pull/6238)). -* Add prebuilt libraries for Xcode 11 to the release package. - ([PR #6248](https://github.com/realm/realm-swift/pull/6248)). -* Add a prebuilt library for Catalyst/UIKit For Mac to the release package - ([PR #6248](https://github.com/realm/realm-swift/pull/6248)). - -### Fixed - -* If a signal interrupted a msync() call, Realm would throw an exception and - the write transaction would fail. This behavior has new been changed to retry - the system call instead. ([Core #3352](https://github.com/realm/realm-core/issues/3352)) -* Queries on the sum or average of an integer property would sometimes give - incorrect results. ([Core #3356](https://github.com/realm/realm-core/pull/3356)). -* Opening query-based synchronized Realms with a small number of subscriptions - performed an unneccesary write transaction. ([ObjectStore #815](https://github.com/realm/realm-object-store/pull/815)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.0 - -### Deprecations - -* `RLMIdentityProviderNickname` has been deprecated in favor of `RLMIdentityProviderUsernamePassword`. -* `+[RLMIdentityProvider credentialsWithNickname]` has been deprecated in favor of `+[RLMIdentityProvider credentialsWithUsername]`. -* `Sync.nickname(String, Bool)` has been deprecated in favor of `Sync.usernamePassword(String, String, Bool)`. - -3.17.3 Release notes (2019-07-24) -============================================================= - -### Enhancements - -* Add Xcode 10.3 binaries to the release package. Remove the Xcode 9.2 and 9.3 binaries. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.3. - -3.17.1 Release notes (2019-07-10) -============================================================= - -### Enhancements - -* Add support for canceling asynchronous opens using a new AsyncOpenTask - returned from the asyncOpen() call. ([PR #6193](https://github.com/realm/realm-swift/pull/6193)). -* Importing the Realm SPM package can now be done by pinning to a version - rather than a branch. - -### Fixed - -* Queries on a List/RLMArray which checked an indexed int property would - sometimes give incorrect results. - ([#6154](https://github.com/realm/realm-swift/issues/6154)), since v3.15.0) -* Queries involving an indexed int property had a memory leak if run multiple - times. ([#6186](https://github.com/realm/realm-swift/issues/6186)), since v3.15.0) -* Creating a subscription with `includeLinkingObjects:` performed unneccesary - comparisons, making it extremely slow when large numbers of objects were - involved. ([Core #3311](https://github.com/realm/realm-core/issues/3311), since v3.15.0) - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.17.0 Release notes (2019-06-28) -============================================================= - -### Enhancements - -* Add support for including Realm via Swift Package Manager. This currently - requires depending on the branch "master" rather than pinning to a version - (i.e. `.package(url: "https://github.com/realm/realm-swift", .branch("master"))`). - ([#6187](https://github.com/realm/realm-swift/pull/6187)). -* Add Codable conformance to RealmOptional and List, and Encodable conformance to Results. - ([PR #6172](https://github.com/realm/realm-swift/pull/6172)). - -### Fixed - -* Attempting to observe an unmanaged LinkingObjects object crashed rather than - throwing an approriate exception (since v0.100.0). -* Opening an encrypted Realm could potentially report that a valid file was - corrupted if the system was low on free memory. - (since 3.14.0, [Core #3267](https://github.com/realm/realm-core/issues/3267)) -* Calling `Realm.asyncOpen()` on multiple Realms at once would sometimes crash - due to a `FileNotFound` exception being thrown on a background worker thread. - (since 3.16.0, [ObjectStore #806](https://github.com/realm/realm-object-store/pull/806)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.16.2 Release notes (2019-06-14) -============================================================= - -### Enhancements - -* Add support for Xcode 11 Beta 1. Xcode betas are only supported when building - from source, and not when using a prebuilt framework. - ([PR #6164](https://github.com/realm/realm-swift/pull/6164)). - -### Fixed - -* Using asyncOpen on query-based Realms which didn't already exist on the local - device would fail with error 214. - ([#6178](https://github.com/realm/realm-swift/issues/6178), since 3.16.0). -* asyncOpen on query-based Realms did not wait for the server-created - permission objects to be downloaded, resulting in crashes if modifications to - the permissions were made before creating a subscription for the first time (since 3.0.0). -* EINTR was not handled correctly in the notification worker, which may have - resulted in inconsistent and rare assertion failures in - `ExternalCommitHelper::listen()` when building with assertions enabled. - (PR: [#804](https://github.com/realm/realm-object-store/pull/804), since 0.91.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.16.1 Release notes (2019-05-31) -============================================================= - -### Fixed - -* The static type passed at compile time to `realm.create()` was checked for a - primary key rather than the actual type passed at runtime, resulting in - exceptions like "''RealmSwiftObject' does not have a primary key and can not - be updated'" being thrown even if the object type being created has a primary - key. (since 3.16.0, [#6159](https://github.com/realm/realm-swift/issues/6159)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.16.0 Release notes (2019-05-29) -============================================================= - -### Enhancements - -* Add an option to only set the properties which have values different from the - existing ones when updating an existing object with - `Realm.create()`/`-[RLMObject createOrUpdateInRealm:withValue:]`. This makes - notifications report only the properties which have actually changed, and - improves Object Server performance by reducing the number of operations to - merge. (Issue: [#5970](https://github.com/realm/realm-swift/issues/5970), - PR: [#6149](https://github.com/realm/realm-swift/pull/6149)). -* Using `-[RLMRealm asyncOpenWithConfiguration:callbackQueue:]`/`Realm.asyncOpen()` to open a - synchronized Realm which does not exist on the local device now uses an - optimized transfer method to download the initial data for the Realm, greatly - speeding up the first start time for applications which use full - synchronization. This is currently not applicable to query-based - synchronization. (PR: [#6106](https://github.com/realm/realm-swift/pull/6106)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.15.0 Release notes (2019-05-06) -============================================================= - -The minimum version of Realm Object Server has been increased to 3.21.0 and -attempting to connect to older versions will produce protocol mismatch errors. -Realm Cloud has already been upgraded to this version, and users using that do -not need to worry about this. - -### Enhancements - -* Add `createdAt`, `updatedAt`, `expiresAt` and `timeToLive` properties to - `RLMSyncSubscription`/`SyncSubscription`. These properties will be `nil` for - subscriptions created with older versions of Realm, but will be automatically - populated for newly-created subscriptions. -* Add support for transient subscriptions by setting the `timeToLive` when - creating the subscription. The next time a subscription is created or updated - after that time has elapsed the subscription will be automatically removed. -* Add support for updating existing subscriptions with a new query or limit. - This is done by passing `update: true` (in swift) or setting - `options.overwriteExisting = YES` (in obj-c) when creating the subscription, - which will make it update the existing subscription with the same name rather - than failing if one already exists with that name. -* Add an option to include the objects from - `RLMLinkingObjects`/`LinkingObjects` properties in sync subscriptions, - similarly to how `RLMArray`/`List` automatically pull in the contained - objects. -* Improve query performance for chains of OR conditions (or an IN condition) on - an unindexed integer or string property. - ([Core PR #2888](https://github.com/realm/realm-core/pull/2888) and - [Core PR #3250](https://github.com/realm/realm-core/pull/3250)). -* Improve query performance for equality conditions on indexed integer properties. - ([Core PR #3272](https://github.com/realm/realm-core/pull/3272)). -* Adjust the file allocation algorithm to reduce fragmentation caused by large - numbers of small blocks. -* Improve file allocator logic to reduce fragmentation and improve commit - performance after many writes. ([Core PR #3278](https://github.com/realm/realm-core/pull/3278)). - -### Fixed - -* Making a query that compares two integer properties could cause a - segmentation fault on x86 (i.e. macOS only). - ([Core PR #3253](https://github.com/realm/realm-core/pull/3256)). -* The `downloadable_bytes` parameter passed to sync progress callbacks reported - a value which correlated to the amount of data left to download, but not - actually the number of bytes which would be downloaded. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.14.2 Release notes (2019-04-25) -============================================================= - -### Enhancements - -* Updating `RLMSyncManager.customRequestHeaders` will immediately update all - currently active sync session with the new headers rather than requiring - manually closing the Realm and reopening it. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.14.1 Release notes (2019-04-04) -============================================================= - -### Fixed - -* Fix "Cannot find interface declaration for 'RealmSwiftObject', superclass of - 'MyRealmObjectClass'" errors when building for a simulator with Xcode 10.2 - with "Install Objective-C Compatibility Header" enabled. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. -* Carthage release for Swift is built with Xcode 10.2. - -3.14.0 Release notes (2019-03-27) -============================================================= - -### Enhancements - -* Reduce memory usage when committing write transactions. -* Improve performance of compacting encrypted Realm files. - ([PR #3221](https://github.com/realm/realm-core/pull/3221)). -* Add a Xcode 10.2 build to the release package. - -### Fixed - -* Fix a memory leak whenever Realm makes a HTTP(s) request to the Realm Object - Server (Issue [#6058](https://github.com/realm/realm-swift/issues/6058), since 3.8.0). -* Fix an assertion failure when creating an object in a synchronized Realm - after creating an object with a null int primary key in the same write - transaction. - ([PR #3227](https://github.com/realm/realm-core/pull/3227)). -* Fix some new warnings when building with Xcode 10.2 beta. -* Properly clean up sync sessions when the last Realm object using the session - is deallocated while the session is explicitly suspended (since 3.9.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. -* Carthage release for Swift is built with Xcode 10.2. - -### Internal - -* Throw an exception rather than crashing with an assertion failure in more - cases when opening invalid Realm files. -* Upgrade to REALM_CORE_VERSION=5.14.0 -* Upgrade to REALM_SYNC_VERSION=3.15.1 - -3.13.1 Release notes (2019-01-03) -============================================================= - -### Fixed - -* Fix a crash when iterating over `Realm.subscriptions()` using for-in. - (Since 3.13.0, PR [#6050](https://github.com/realm/realm-swift/pull/6050)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -3.13.0 Release notes (2018-12-14) -============================================================= - -### Enhancements - -* Add `Realm.subscriptions()`/`-[RLMRealm subscriptions]` and - `Realm.subscription(named:)`/`-[RLMRealm subscriptionWithName:]` to enable - looking up existing query-based sync subscriptions. - (PR: https://github.com/realm/realm-swift/pull/6029). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -3.12.0 Release notes (2018-11-26) -============================================================= - -### Enhancements - -* Add a User-Agent header to HTTP requests made to the Realm Object Server. By - default, this contains information about the Realm library version and your - app's bundle ID. The application identifier can be customized by setting - `RLMSyncManager.sharedManager.userAgent`/`SyncManager.shared.userAgent` prior - to opening a synchronized Realm. - (PR: https://github.com/realm/realm-swift/pull/6007). -* Add Xcode 10.1 binary to the prebuilt package. - -### Fixed - -* None. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -### Internal - -* None. - - -3.11.2 Release notes (2018-11-15) -============================================================= - -### Enhancements - -* Improve the performance of the merge algorithm used for integrating remote - changes from the server. In particular, changesets involving many objects - which all link to a single object should be greatly improved. - -### Fixed - -* Fix a memory leak when removing notification blocks from collections. - PR: [#702](https://github.com/realm/realm-object-store/pull/702), since 1.1.0. -* Fix re-sorting or distincting an already-sorted Results using values from - linked objects. Previously the unsorted order was used to read the values - from the linked objects. - PR [#3102](https://github.com/realm/realm-core/pull/3102), since 3.1.0. -* Fix a set of bugs which could lead to bad changeset assertions when using - sync. The assertions would look something like the following: - `[realm-core-5.10.0] Assertion failed: ndx < size() with (ndx, size()) = [742, 742]`. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -### Internal - -* None. - - -3.11.1 Release notes (2018-10-19) -============================================================= - -### Enhancements - -* None. - -### Fixed - -* Fix `SyncUser.requestEmailConfirmation` not triggering the email confirmation - flow on ROS. (PR [#5953](https://github.com/realm/realm-swift/pull/5953), since 3.5.0) -* Add some missing validation in the getters and setters of properties on - managed Realm objects, which would sometimes result in an application - crashing with a segfault rather than the appropriate exception being thrown - when trying to write to an object which has been deleted. - (PR [#5952](https://github.com/realm/realm-swift/pull/5952), since 2.8.0) - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -### Internal - -* None. - - -3.11.0 Release notes (2018-10-04) -============================================================= - -### Enhancements -* Reduce memory usage when integrating synchronized changes sent by ROS. -* Devices will now report download progress for read-only Realms, allowing the - server to compact Realms more aggressively and reducing the amount of - server-side storage space required. - -### Fixed -* Fix a crash when adding an object with a non-`@objc` `String?` property which - has not been explicitly ignored to a Realm on watchOS 5 (and possibly other - platforms when building with Xcode 10). - (Issue: [5929](https://github.com/realm/realm-swift/issues/5929)). -* Fix some merge algorithm bugs which could result in `BadChangesetError` - being thrown when integrating changes sent by the server. - -### Compatibility -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* **NOTE!!! - You will need to upgrade your Realm Object Server to at least version 3.11.0 - or use [Realm Cloud](https://cloud.realm.io). - If you try to connect to a ROS v3.10.x or previous, you will see an error - like `Wrong protocol version in Sync HTTP request, client protocol version = 25, - server protocol version = 24`.** - -### Internal -* Update to Sync 3.12.2. - - -3.10.0 Release notes (2018-09-19) -============================================================= - -Prebuilt binaries are now built for Xcode 9.2, 9.3, 9.4 and 10.0. - -Older versions of Xcode are still supported when building from source, but you -should be migrating to at least Xcode 9.2 as soon as possible. - -### Enhancements - -* Add support for Watch Series 4 by adding an arm64_32 slice to the library. - -3.9.0 Release notes (2018-09-10) -============================================================= - -### Enhancements - -* Expose RLMSyncUser.refreshToken publicly so that it can be used for custom - HTTP requests to Realm Object Server. -* Add RLMSyncSession.connectionState, which reports whether the session is - currently connected to the Realm Object Server or if it is offline. -* Add `-suspend` and `-resume` methods to `RLMSyncSession` to enable manually - pausing data synchronization. -* Add support for limiting the number of objects matched by a query-based sync - subscription. This requires a server running ROS 3.10.1 or newer. - -### Bugfixes - -* Fix crash when getting the description of a `MigrationObject` which has - `List` properties. -* Fix crash when calling `dynamicList()` on a `MigrationObject`. - -3.8.0 Release notes (2018-09-05) -============================================================= - -### Enhancements - -* Remove some old and no longer applicable migration logic which created an - unencrypted file in the sync metadata directory containing a list of ROS URLs - connected to. -* Add support for pinning SSL certificates used for https and realms - connections by setting `RLMSyncManager.sharedManager.pinnedCertificatePaths` - in obj-c and `SyncManager.shared.pinnedCertificatePaths` in Swift. - -### Bugfixes - -* Fix warnings when building Realm as a static framework with CocoaPods. - -3.7.6 Release notes (2018-08-08) -============================================================= - -### Enhancements - -* Speed up the actual compaction when using compact-on-launch. -* Reduce memory usage when locally merging changes from sync. -* When first connecting to a server, wait to begin uploading changes until - after all changes have been downloaded to reduce the server-side load for - query-based sync. - -3.7.5 Release notes (2018-07-23) -============================================================= - -### Enhancements - -* Improve performance of applying remote changesets from sync. -* Improve performance of creating objects with string primary keys. -* Improve performance of large write transactions. -* Adjust file space allocation strategy to reduce fragmentation, producing - smaller Realm files and typically better performance. -* Close network connections immediately when a sync session is destroyed. -* Report more information in `InvalidDatabase` exceptions. - -### Bugfixes - -* Fix permission denied errors for RLMPlatform.h when building with CocoaPods - and Xcode 10 beta 3. -* Fix a use-after-free when canceling a write transaction which could result in - incorrect "before" values in KVO observations (typically `nil` when a non-nil - value is expected). -* Fix several bugs in the merge algorithm that could lead to memory corruption - and crashes with errors like "bad changeset" and "unreachable code". - -3.7.4 Release notes (2018-06-19) -============================================================= - -### Bugfixes - -* Fix a bug which could potentially flood Realm Object Server with PING - messages after a client device comes back online. - -3.7.3 Release notes (2018-06-18) -============================================================= - -### Enhancements - -* Avoid performing potentially large amounts of pointless background work for - LinkingObjects instances which are accessed and then not immediate deallocated. - -### Bugfixes - -* Fix crashes which could result from extremely fragmented Realm files. -* Fix a bug that could result in a crash with the message "bad changeset error" - when merging changesets from the server. - -3.7.2 Release notes (2018-06-13) -============================================================= - -### Enhancements - -* Add some additional consistency checks that will hopefully produce better - errors when the "prev_ref + prev_size <= ref" assertion failure occurs. - -### Bugfixes - -* Fix a problem in the changeset indexing algorithm that would sometimes - cause "bad permission object" and "bad changeset" errors. -* Fix a large number of linking warnings about symbol visibility by aligning - compiler flags used. -* Fix large increase in size of files produced by `Realm.writeCopy()` introduced in 3.6.0. - -3.7.1 Release notes (2018-06-07) -============================================================= - -* Add support for compiling Realm Swift with Xcode 10 beta 1. - -3.7.0 Release notes (2018-06-06) -============================================================= - -The feature known as Partial Sync has been renamed to Query-based -Synchronization. This has impacted a number of API's. See below for the -details. - -### Deprecations - -* `+[RLMSyncConfiguration initWithUser] has been deprecated in favor of `-[RLMSyncUser configurationWithURL:url]. -* `+[RLMSyncConfiguration automaticConfiguration] has been deprecated in favor of `-[RLMSyncUser configuration]. -* `+[RLMSyncConfiguration automaticConfigurationForUser] has been deprecated in favor of `-[RLMSyncUser configuration]. -* `-[RLMSyncConfiguration isPartial] has been deprecated in favor of `-[RLMSyncConfiguration fullSynchronization]`. - -### Enhancements - -* Add `-[RLMRealm syncSession]` and `Realm.syncSession` to obtain the session used for a synchronized Realm. -* Add `-[RLMSyncUser configuration]`. Query-based sync is the default sync mode for this configuration. -* Add `-[RLMSyncUser configurationWithURL:url]`. Query-based sync is the default sync mode for this configuration. - -3.6.0 Release notes (2018-05-29) -============================================================= - -### Enhancements - -* Improve performance of sync metadata operations and resolving thread-safe - references. -* `shouldCompactOnLaunch` is now supported for compacting the local data of - synchronized Realms. - -### Bugfixes - -* Fix a potential deadlock when a sync session progress callback held the last - strong reference to the sync session. -* Fix some cases where comparisons to `nil` in queries were not properly - serialized when subscribing to a query. -* Don't delete objects added during a migration after a call to `-[RLMMigration - deleteDataForClassName:]`. -* Fix incorrect results and/or crashes when multiple `-[RLMMigration - enumerateObjects:block:]` blocks deleted objects of the same type. -* Fix some edge-cases where `-[RLMMigration enumerateObjects:block:]` - enumerated the incorrect objects following deletions. -* Restore the pre-3.5.0 behavior for Swift optional properties missing an ivar - rather than crashing. - -3.5.0 Release notes (2018-04-25) -============================================================= - -### Enhancements - -* Add wrapper functions for email confirmation and password reset to `SyncUser`. - -### Bugfixes - -* Fix incorrect results when using optional chaining to access a RealmOptional - property in Release builds, or otherwise interacting with a RealmOptional - object after the owning Object has been deallocated. - -3.4.0 Release notes (2018-04-19) -============================================================= - -The prebuilt binary for Carthage is now built for Swift 4.1. - -### Enhancements - -* Expose `RLMSyncManager.authorizationHeaderName`/`SyncManager.authorizationHeaderName` - as a way to override the transport header for Realm Object Server authorization. -* Expose `RLMSyncManager.customRequestHeaders`/`SyncManager.customRequestHeaders` - which allows custom HTTP headers to be appended on requests to the Realm Object Server. -* Expose `RLMSSyncConfiguration.urlPrefix`/`SyncConfiguration.urlPrefix` as a mechanism - to replace the default path prefix in Realm Sync WebSocket requests. - -3.3.2 Release notes (2018-04-03) -============================================================= - -Add a prebuilt binary for Xcode 9.3. - -3.3.1 Release notes (2018-03-28) -============================================================= - -Realm Object Server v3.0.0 or newer is required when using synchronized Realms. - -### Enhancements - -* Expose `RLMObject.object(forPrimaryKey:)` as a factory method for Swift so - that it is callable with recent versions of Swift. - -### Bugfixes - -* Exclude the RLMObject-derived Permissions classes from the types repored by - `Realm.Configuration.defaultConfiguration.objectTypes` to avoid a failed - cast. -* Cancel pending `Realm.asyncOpen()` calls when authentication fails with a - non-transient error such as missing the Realm path in the URL. -* Fix "fcntl() inside prealloc()" errors on APFS. - -3.3.0 Release notes (2018-03-19) -============================================================= - -Realm Object Server v3.0.0 or newer is required when using synchronized Realms. - -### Enhancements - -* Add `Realm.permissions`, `Realm.permissions(forType:)`, and `Realm.permissions(forClassNamed:)` as convenience - methods for accessing the permissions of the Realm or a type. - -### Bugfixes - -* Fix `+[RLMClassPermission objectInRealm:forClass:]` to work for classes that are part of the permissions API, - such as `RLMPermissionRole`. -* Fix runtime errors when applications define an `Object` subclass with the - same name as one of the Permissions object types. - -3.2.0 Release notes (2018-03-15) -============================================================= - -Realm Object Server v3.0.0 or newer is required when using synchronized Realms. - -### Enhancements - -* Added an improved API for adding subscriptions in partially-synchronized Realms. `Results.subscribe()` can be - used to subscribe to any result set, and the returned `SyncSubscription` object can be used to observe the state - of the subscription and ultimately to remove the subscription. See the documentation for more information - (). -* Added a fine-grained permissions system for use with partially-synchronized Realms. This allows permissions to be - defined at the level of individual objects or classes. See the documentation for more information - (). -* Added `SyncConfiguration.automatic()` and `SyncConfiguration.automatic(user:)`. - These methods return a `Realm.Configuration` appropriate for syncing with the default - synced Realm for the current (or specified) user. These should be considered the preferred methods - for accessing synced Realms going forwards. -* Added `+[RLMSyncSession sessionForRealm:]` to retrieve the sync session corresponding to a `RLMRealm`. - -### Bugfixes - -* Fix incorrect initalization of `RLMSyncManager` that made it impossible to - set `errorHandler`. -* Fix compiler warnings when building with Xcode 9.3. -* Fix some warnings when running with UBsan. - -3.2.0-rc.1 Release notes (2018-03-14) -============================================================= - -Realm Object Server v3.0.0-rc.1 or newer is required when using synchronized Realms. - -### Enhancements - -* Added `SyncConfiguration.automatic()` and `SyncConfiguration.automatic(user:)`. - These methods return a `Realm.Configuration` appropriate for syncing with the default - synced Realm for the current (or specified). These should be considered the preferred methods - for accessing synced Realms going forwards. -* A role is now automatically created for each user with that user as its only member. - This simplifies the common use case of restricting access to specific objects to a single user. - This role can be accessed at `PermissionUser.role`. -* Improved error reporting when the server rejects a schema change due to a lack of permissions. - -### Bugfixes - -* Fix incorrect initalization of `RLMSyncManager` that made it impossible to - set `errorHandler`. -* Fix compiler warnings when building with Xcode 9.3. - -3.2.0-beta.3 Release notes (2018-03-01) -============================================================= - -Realm Object Server v3.0.0-alpha.9 or newer is required when using synchronized Realms. - -### Bugfixes - -* Fix a crash that would occur when using partial sync with Realm Object Server v3.0.0-alpha.9. - -3.2.0-beta.2 Release notes (2018-02-28) -============================================================= - -Realm Object Server v3.0.0-alpha.8 or newer is required when using synchronized Realms. - -### Enhancements - -* Added `findOrCreate(forRoleNamed:)` and `findOrCreate(forRole:)` to `List` - to simplify the process of adding permissions for a role. -* Added `+permissionForRoleNamed:inArray:`, `+permissionForRoleNamed:onRealm:`, - `+permissionForRoleNamed:onClass:realm:`, `+permissionForRoleNamed:onClassNamed:realm:`, - and `+permissionForRoleNamed:onObject:` to `RLMSyncPermission` to simplify the process - of adding permissions for a role. -* Added `+[RLMSyncSession sessionForRealm:]` to retrieve the sync session corresponding to a `RLMRealm`. - -### Bugfixes - -* `PermissionRole.users` and `PermissionUser.roles` are now public as intended. -* Fixed the handling of `setPermissions` in `-[RLMRealm privilegesForRealm]` and related methods. - -3.2.0-beta.1 Release notes (2018-02-19) -============================================================= - -### Enhancements - -* Added an improved API for adding subscriptions in partially-synchronized Realms. `Results.subscribe()` can be - used to subscribe to any result set, and the returned `SyncSubscription` object can be used to observe the state - of the subscription and ultimately to remove the subscription. -* Added a fine-grained permissions system for use with partially-synchronized Realms. This allows permissions to be - defined at the level of individual objects or classes. See `Permission` and related types for more information. - -### Bugfixes - -* Fix some warnings when running with UBsan. - -3.1.1 Release notes (2018-02-03) -============================================================= - -Prebuilt Swift frameworks for Carthage are now built with Xcode 9.2. - -### Bugfixes - -* Fix a memory leak when opening Realms with an explicit `objectTypes` array - from Swift. - -3.1.0 Release notes (2018-01-16) -============================================================= - -* Prebuilt frameworks are now included for Swift 3.2.3 and 4.0.3. -* Prebuilt frameworks are no longer included for Swift 3.0.x. -* Building from source with Xcode versions prior to Xcode 8.3 is no longer supported. - -### Enhancements - -* Add `Results.distinct(by:)` / `-[RLMResults distinctResultsUsingKeyPaths:]`, which return a `Results` - containing only objects with unique values at the given key paths. -* Improve performance of change checking for notifications in certain cases. -* Realm Object Server errors not explicitly recognized by the client are now reported to the application - regardless. -* Add support for JSON Web Token as a sync credential source. -* Add support for Nickname and Anonymous Auth as a sync credential source. -* Improve allocator performance when writing to a highly fragmented file. This - should significantly improve performance when inserting large numbers of - objects which have indexed properties. -* Improve write performance for complex object graphs involving many classes - linking to each other. - -### Bugfixes - -* Add a missing check for a run loop in the permission API methods which - require one. -* Fix some cases where non-fatal sync errors were being treated as fatal errors. - -3.0.2 Release notes (2017-11-08) -============================================================= - -Prebuilt frameworks are now included for Swift 3.2.2 and 4.0.2. - -### Bugfixes - -* Fix a crash when a linking objects property is retrieved from a model object instance via - Swift subscripting. -* Fix incorrect behavior if a call to `posix_fallocate` is interrupted. - -3.0.1 Release notes (2017-10-26) -============================================================= - -### Bugfixes - -* Explicitly exclude KVO-generated object subclasses from the schema. -* Fix regression where the type of a Realm model class is not properly determined, causing crashes - when a type value derived at runtime by `type(of:)` is passed into certain APIs. -* Fix a crash when an `Object` subclass has implicitly ignored `let` - properties. -* Fix several cases where adding a notification block from within a - notification callback could produce incorrect results. - -3.0.0 Release notes (2017-10-16) -============================================================= - -### Breaking Changes -* iOS 7 is no longer supported. -* Synchronized Realms require a server running Realm Object Server v2.0 or higher. -* Computed properties on Realm object types are detected and no - longer added to the automatically generated schema. -* The Objective-C and Swift `create(_:, value: update:)` APIs now - correctly nil out nullable properties when updating an existing - object when the `value` argument specifies nil or `NSNull` for - the property value. -* `-[RLMRealm addOrUpdateObjects:]` and `-[RLMRealm deleteObjects:]` now - require their argument to conform to `NSFastEnumeration`, to match similar - APIs that also take collections. -* The way interactive sync errors (client reset and permission denied) - are delivered to the user has been changed. Instead of a block which can - be invoked to immediately delete the offending Realm file, an opaque - token object of type `RLMSyncErrorActionToken` will be returned in the - error object's `userInfo` dictionary. This error object can be passed - into the new `+[RLMSyncSession immediatelyHandleError:]` API to delete - the files. -* The return types of the `SyncError.clientResetInfo()` and - `SyncError.deleteRealmUserInfo()` APIs have been changed. They now return - `RLMSyncErrorActionToken`s or `SyncError.ActionToken`s instead of closures. -* The class methods `Object.className()`, `Object.objectUtilClass()`, and - the property `Object.isInvalidated` can no longer be overriden. -* The callback which runs when a sync user login succeeds or fails - now runs on the main queue by default, or can be explicitly specified - by a new `callbackQueue` parameter on the `{RLM}SyncUser.logIn(...)` API. -* Fix empty strings, binary data, and null on the right side of `BEGINSWITH`, - `ENDSWITH` and `CONTAINS` operators in predicates to match Foundation's - semantics of never matching any strings or data. -* Swift `Object` comparison and hashing behavior now works the same way as - that of `RLMObject` (objects are now only considered equatable if their - model class defines a primary key). -* Fix the way the hash property works on `Object` when the object model has - no primary key. -* Fix an issue where if a Swift model class defined non-generic managed - properties after generic Realm properties (like `List`), the schema - would be constructed incorrectly. Fixes an issue where creating such - models from an array could fail. -* Loosen `RLMArray` and `RLMResults`'s generic constraint from `RLMObject` to - `NSObject`. This may result in having to add some casts to disambiguate - types. -* Remove `RLMSyncPermissionResults`. `RLMSyncPermission`s are now vended out - using a `RLMResults`. This results collection supports all normal collection - operations except for setting values using key-value coding (since - `RLMSyncPermission`s are immutable) and the property aggregation operations. -* `RLMSyncUserInfo` has been significantly enhanced. It now contains metadata - about a user stored on the Realm Object Server, as well as a list of all user account - data associated with that user. -* Starting with Swift 4, `List` now conforms to `MutableCollection` instead of - `RangeReplaceableCollection`. For Swift 4, the empty collection initializer has been - removed, and default implementations of range replaceable collection methods that - make sense for `List` have been added. -* `List.removeLast()` now throws an exception if the list is empty, to more closely match - the behavior of the standard library's `Collection.removeLast()` implementation. -* `RealmCollection`'s associated type `Element` has been renamed `ElementType`. -* The following APIs have been renamed: - -| Old API | New API | -|:------------------------------------------------------------|:---------------------------------------------------------------| -| `NotificationToken.stop()` | `NotificationToken.invalidate()` | -| `-[RLMNotificationToken stop]` | `-[RLMNotificationToken invalidate]` | -| `RealmCollection.addNotificationBlock(_:)` | `RealmCollection.observe(_:)` | -| `RLMSyncProgress` | `RLMSyncProgressMode` | -| `List.remove(objectAtIndex:)` | `List.remove(at:)` | -| `List.swap(_:_:)` | `List.swapAt(_:_:)` | -| `SyncPermissionValue` | `SyncPermission` | -| `RLMSyncPermissionValue` | `RLMSyncPermission` | -| `-[RLMSyncPermission initWithRealmPath:userID:accessLevel]` | `-[RLMSyncPermission initWithRealmPath:identity:accessLevel:]` | -| `RLMSyncPermission.userId` | `RLMSyncPermission.identity` | -| `-[RLMRealm addOrUpdateObjectsInArray:]` | `-[RLMRealm addOrUpdateObjects:]` | - -* The following APIs have been removed: - -| Removed API | Replacement | -|:-------------------------------------------------------------|:------------------------------------------------------------------------------------------| -| `Object.className` | None, was erroneously present. | -| `RLMPropertyTypeArray` | `RLMProperty.array` | -| `PropertyType.array` | `Property.array` | -| `-[RLMArray sortedResultsUsingProperty:ascending:]` | `-[RLMArray sortedResultsUsingKeyPath:ascending:]` | -| `-[RLMCollection sortedResultsUsingProperty:ascending:]` | `-[RLMCollection sortedResultsUsingKeyPath:ascending:]` | -| `-[RLMResults sortedResultsUsingProperty:ascending:]` | `-[RLMResults sortedResultsUsingKeyPath:ascending:]` | -| `+[RLMSortDescriptor sortDescriptorWithProperty:ascending:]` | `+[RLMSortDescriptor sortDescriptorWithKeyPath:ascending:]` | -| `RLMSortDescriptor.property` | `RLMSortDescriptor.keyPath` | -| `AnyRealmCollection.sorted(byProperty:ascending:)` | `AnyRealmCollection.sorted(byKeyPath:ascending:)` | -| `List.sorted(byProperty:ascending:)` | `List.sorted(byKeyPath:ascending:)` | -| `LinkingObjects.sorted(byProperty:ascending:)` | `LinkingObjects.sorted(byKeyPath:ascending:)` | -| `Results.sorted(byProperty:ascending:)` | `Results.sorted(byKeyPath:ascending:)` | -| `SortDescriptor.init(property:ascending:)` | `SortDescriptor.init(keyPath:ascending:)` | -| `SortDescriptor.property` | `SortDescriptor.keyPath` | -| `+[RLMRealm migrateRealm:configuration:]` | `+[RLMRealm performMigrationForConfiguration:error:]` | -| `RLMSyncManager.disableSSLValidation` | `RLMSyncConfiguration.enableSSLValidation` | -| `SyncManager.disableSSLValidation` | `SyncConfiguration.enableSSLValidation` | -| `RLMSyncErrorBadResponse` | `RLMSyncAuthErrorBadResponse` | -| `RLMSyncPermissionResults` | `RLMResults` | -| `SyncPermissionResults` | `Results` | -| `RLMSyncPermissionChange` | `-[RLMSyncUser applyPermission:callback]` / `-[RLMSyncUser deletePermission:callback:]` | -| `-[RLMSyncUser permissionRealmWithError:]` | `-[RLMSyncUser retrievePermissionsWithCallback:]` | -| `RLMSyncPermissionOffer` | `-[RLMSyncUser createOfferForRealmAtURL:accessLevel:expiration:callback:]` | -| `RLMSyncPermissionOfferResponse` | `-[RLMSyncUser acceptOfferForToken:callback:]` | -| `-[NSError rlmSync_clientResetBlock]` | `-[NSError rlmSync_errorActionToken]` / `-[NSError rlmSync_clientResetBackedUpRealmPath]` | -| `-[NSError rlmSync_deleteRealmBlock]` | `-[NSError rlmSync_errorActionToken]` | - -### Enhancements -* `List` can now contain values of types `Bool`, `Int`, `Int8`, `Int16`, - `Int32`, `Int64`, `Float`, `Double`, `String`, `Data`, and `Date` (and - optional versions of all of these) in addition to `Object` subclasses. - Querying `List`s containing values other than `Object` subclasses is not yet - implemented. -* `RLMArray` can now be constrained with the protocols `RLMBool`, `RLMInt`, - `RLMFloat`, `RLMDouble`, `RLMString`, `RLMData`, and `RLMDate` in addition to - protocols defined with `RLM_ARRAY_TYPE`. By default `RLMArray`s of - non-`RLMObject` types can contain null. Indicating that the property is - required (by overriding `+requiredProperties:`) will instead make the values - within the array required. Querying `RLMArray`s containing values other than - `RLMObject` subclasses is not yet implemented. -* Add a new error code to denote 'permission denied' errors when working - with synchronized Realms, as well as an accompanying block that can be - called to inform the binding that the offending Realm's files should be - deleted immediately. This allows recovering from 'permission denied' - errors in a more robust manner. See the documentation for - `RLMSyncErrorPermissionDeniedError` for more information. -* Add Swift `Object.isSameObject(as:_)` API to perform the same function as - the existing Objective-C API `-[RLMObject isEqualToObject:]`. -* Opening a synced Realm whose local copy was created with an older version of - Realm Mobile Platfrom when a migration is not possible to the current version - will result in an `RLMErrorIncompatibleSyncedFile` / `incompatibleSyncedFile` - error. When such an error occurs, the original file is moved to a backup - location, and future attempts to open the synchronized Realm will result in a new - file being created. If you wish to migrate any data from the backup Realm you can - open it using the backup Realm configuration available on the error object. -* Add a preview of partial synchronization. Partial synchronization allows a - synchronized Realm to be opened in such a way that only objects requested by - the user are synchronized to the device. You can use it by setting the - `isPartial` property on a `SyncConfiguration`, opening the Realm, and then - calling `Realm.subscribe(to:where:callback:)` with the type of object you're - interested in, a string containing a query determining which objects you want - to subscribe to, and a callback which will report the results. You may add as - many subscriptions to a synced Realm as necessary. - -### Bugfixes -* Realm no longer throws an "unsupported instruction" exception in some cases - when opening a synced Realm asynchronously. -* Realm Swift APIs that filter or look up the index of an object based on a - format string now properly handle optional arguments in their variadic argument - list. -* `-[RLMResults indexOfObject:]` now properly accounts for access - level. -* Fix a race condition that could lead to a crash accessing to the freed configuration object - if a default configuration was set from a different thread. -* Fixed an issue that crash when enumerating after clearing data during migration. -* Fix a bug where a synced Realm couldn't be reopened even after a successful client reset - in some cases. -* Fix a bug where the sync subsystem waited too long in certain cases to reconnect to the server. -* Fix a bug where encrypted sync-related metadata was incorrectly deleted from upgrading users, - resulting in all users being logged out. -* Fix a bug where permission-related data continued to be synced to a client even after the user - that data belonged to logged out. -* Fix an issue where collection notifications might be delivered inconsistently if a notification - callback was added within another callback for the same collection. - -3.0.0-rc.2 Release notes (2017-10-14) -============================================================= - -### Enhancements -* Reinstate `RLMSyncPermissionSortPropertyUserID` to allow users to sort permissions - to their own Realms they've granted to others. - -### Bugfixes -* `-[RLMResults indexOfObject:]` now properly accounts for access - level. -* Fix a race condition that could lead to a crash accessing to the freed configuration object - if a default configuration was set from a different thread. -* Fixed an issue that crash when enumerating after clearing data during migration. -* Fix a bug where a synced Realm couldn't be reopened even after a successful client reset - in some cases. -* Fix a bug where the sync subsystem waited too long in certain cases to reconnect to the server. -* Fix a bug where encrypted sync-related metadata was incorrectly deleted from upgrading users, - resulting in all users being logged out. -* Fix a bug where permission-related data continued to be synced to a client even after the user - that data belonged to logged out. -* Fix an issue where collection notifications might be delivered inconsistently if a notification - callback was added within another callback for the same collection. - -3.0.0-rc.1 Release notes (2017-10-03) -============================================================= - -### Breaking Changes -* Remove `RLMSyncPermissionSortPropertyUserID` to reflect changes in how the - Realm Object Server reports permissions for a user. -* Remove `RLMSyncPermissionOffer` and `RLMSyncPermissionOfferResponse` classes - and associated helper methods and functions. Use the - `-[RLMSyncUser createOfferForRealmAtURL:accessLevel:expiration:callback:]` - and `-[RLMSyncUser acceptOfferForToken:callback:]` methods instead. - -### Bugfixes - -* The keychain item name used by Realm to manage the encryption keys for - sync-related metadata is now set to a per-app name based on the bundle - identifier. Keys that were previously stored within the single, shared Realm - keychain item will be transparently migrated to the per-application keychain - item. -* Fix downloading of the Realm core binaries when Xcode's command-line tools are - set as the active developer directory for command-line interactions. -* Fix a crash that could occur when resolving a ThreadSafeReference to a `List` - whose parent object had since been deleted. - -3.0.0-beta.4 Release notes (2017-09-22) -============================================================= - -### Breaking Changes - -* Rename `List.remove(objectAtIndex:)` to `List.remove(at:)` to match the name - used by 'RangeReplaceableCollection'. -* Rename `List.swap()` to `List.swapAt()` to match the name used by 'Array'. -* Loosen `RLMArray` and `RLMResults`'s generic constraint from `RLMObject` to - `NSObject`. This may result in having to add some casts to disambiguate - types. -* Remove `RLMPropertyTypeArray` in favor of a separate bool `array` property on - `RLMProperty`/`Property`. -* Remove `RLMSyncPermissionResults`. `RLMSyncPermission`s are now vended out - using a `RLMResults`. This results collection supports all normal collection - operations except for setting values using KVO (since `RLMSyncPermission`s are - immutable) and the property aggregation operations. -* `RealmCollection`'s associated type `Element` has been renamed `ElementType`. -* Realm Swift collection types (`List`, `Results`, `AnyRealmCollection`, and - `LinkingObjects` have had their generic type parameter changed from `T` to - `Element`). -* `RealmOptional`'s generic type parameter has been changed from `T` to `Value`. -* `RLMSyncUserInfo` has been significantly enhanced. It now contains metadata - about a user stored on the Realm Object Server, as well as a list of all user account - data associated with that user. -* Starting with Swift 4, `List` now conforms to `MutableCollection` instead of - `RangeReplaceableCollection`. For Swift 4, the empty collection initializer has been - removed, and default implementations of range replaceable collection methods that - make sense for `List` have been added. -* `List.removeLast()` now throws an exception if the list is empty, to more closely match - the behavior of the standard library's `Collection.removeLast()` implementation. - -### Enhancements - -* `List` can now contain values of types `Bool`, `Int`, `Int8`, `Int16`, - `Int32`, `Int64`, `Float`, `Double`, `String`, `Data`, and `Date` (and - optional versions of all of these) in addition to `Object` subclasses. - Querying `List`s containing values other than `Object` subclasses is not yet - implemented. -* `RLMArray` can now be constrained with the protocols `RLMBool`, `RLMInt`, - `RLMFloat`, `RLMDouble`, `RLMString`, `RLMData`, and `RLMDate` in addition to - protocols defined with `RLM_ARRAY_TYPE`. By default `RLMArray`s of - non-`RLMObject` types can contain null. Indicating that the property is - required (by overriding `+requiredProperties:`) will instead make the values - within the array required. Querying `RLMArray`s containing values other than - `RLMObject` subclasses is not yet implemented. -* Opening a synced Realm whose local copy was created with an older version of - Realm Mobile Platfrom when a migration is not possible to the current version - will result in an `RLMErrorIncompatibleSyncedFile` / `incompatibleSyncedFile` - error. When such an error occurs, the original file is moved to a backup - location, and future attempts to open the synchronized Realm will result in a new - file being created. If you wish to migrate any data from the backup Realm you can - open it using the backup Realm configuration available on the error object. -* Add preview support for partial synchronization. Partial synchronization is - allows a synchronized Realm to be opened in such a way that only objects - requested by the user are synchronized to the device. You can use it by setting - the `isPartial` property on a `SyncConfiguration`, opening the Realm, and then - calling `Realm.subscribe(to:where:callback:)` with the type of object you're - interested in, a string containing a query determining which objects you want - to subscribe to, and a callback which will report the results. You may add as - many subscriptions to a synced Realm as necessary. - -### Bugfixes - -* Realm Swift APIs that filter or look up the index of an object based on a - format string now properly handle optional arguments in their variadic argument - list. - -3.0.0-beta.3 Release notes (2017-08-23) -============================================================= - -### Breaking Changes - -* iOS 7 is no longer supported. -* Computed properties on Realm object types are detected and no - longer added to the automatically generated schema. -* `-[RLMRealm addOrUpdateObjectsInArray:]` has been renamed to - `-[RLMRealm addOrUpdateObjects:]` for consistency with similar methods - that add or delete objects. -* `-[RLMRealm addOrUpdateObjects:]` and `-[RLMRealm deleteObjects:]` now - require their argument to conform to `NSFastEnumeration`, to match similar - APIs that also take collections. -* Remove deprecated `{RLM}SyncPermission` and `{RLM}SyncPermissionChange` - classes. -* `{RLM}SyncPermissionValue` has been renamed to just `{RLM}SyncPermission`. - Its `userId` property has been renamed `identity`, and its - `-initWithRealmPath:userID:accessLevel:` initializer has been renamed - `-initWithRealmPath:identity:accessLevel:`. -* Remove deprecated `-[RLMSyncUser permissionRealmWithError:]` and - `SyncUser.permissionRealm()` APIs. Use the new permissions system. -* Remove deprecated error `RLMSyncErrorBadResponse`. Use - `RLMSyncAuthErrorBadResponse` instead. -* The way interactive sync errors (client reset and permission denied) - are delivered to the user has been changed. Instead of a block which can - be invoked to immediately delete the offending Realm file, an opaque - token object of type `RLMSyncErrorActionToken` will be returned in the - error object's `userInfo` dictionary. This error object can be passed - into the new `+[RLMSyncSession immediatelyHandleError:]` API to delete - the files. -* Remove `-[NSError rlmSync_clientResetBlock]` and - `-[NSError rlmSync_deleteRealmBlock]` APIs. -* The return types of the `SyncError.clientResetInfo()` and - `SyncError.deleteRealmUserInfo()` APIs have been changed. They now return - `RLMSyncErrorActionToken`s or `SyncError.ActionToken`s instead of closures. -* The (erroneously added) instance property `Object.className` has been - removed. -* The class methods `Object.className()`, `Object.objectUtilClass()`, and - the property `Object.isInvalidated` can no longer be overriden. -* The callback which runs when a sync user login succeeds or fails - now runs on the main queue by default, or can be explicitly specified - by a new `callbackQueue` parameter on the `{RLM}SyncUser.logIn(...)` API. -* Rename `{RLM}NotificationToken.stop()` to `invalidate()` and - `{RealmCollection,SyncPermissionResults}.addNotificationBlock(_:)` to - `observe(_:)` to mirror Foundation's new KVO APIs. -* The `RLMSyncProgress` enum has been renamed `RLMSyncProgressMode`. -* Remove deprecated `{RLM}SyncManager.disableSSLValidation` property. Disable - SSL validation on a per-Realm basis by setting the `enableSSLValidation` - property on `{RLM}SyncConfiguration` instead. -* Fix empty strings, binary data, and null on the right side of `BEGINSWITH`, - `ENDSWITH` and `CONTAINS` operators in predicates to match Foundation's - semantics of never matching any strings or data. -* Swift `Object` comparison and hashing behavior now works the same way as - that of `RLMObject` (objects are now only considered equatable if their - model class defines a primary key). -* Fix the way the hash property works on `Object` when the object model has - no primary key. -* Fix an issue where if a Swift model class defined non-generic managed - properties after generic Realm properties (like `List`), the schema - would be constructed incorrectly. Fixes an issue where creating such - models from an array could fail. - -### Enhancements - -* Add Swift `Object.isSameObject(as:_)` API to perform the same function as - the existing Objective-C API `-[RLMObject isEqualToObject:]`. -* Expose additional authentication-related errors that might be reported by - a Realm Object Server. -* An error handler can now be registered on `{RLM}SyncUser`s in order to - report authentication-related errors that affect the user. - -### Bugfixes - -* Sync users are now automatically logged out upon receiving certain types - of errors that indicate they are no longer logged into the server. For - example, users who are authenticated using third-party credentials will find - themselves logged out of the Realm Object Server if the third-party identity - service indicates that their credential is no longer valid. -* Address high CPU usage and hangs in certain cases when processing collection - notifications in highly-connected object graphs. - -3.0.0-beta.2 Release notes (2017-07-26) -============================================================= - -### Breaking Changes - -* Remove the following deprecated Objective-C APIs: - `-[RLMArray sortedResultsUsingProperty:ascending:]`, - `-[RLMCollection sortedResultsUsingProperty:ascending:]`, - `-[RLMResults sortedResultsUsingProperty:ascending:]`, - `+[RLMSortDescriptor sortDescriptorWithProperty:ascending:]`, - `RLMSortDescriptor.property`. - These APIs have been superseded by equivalent APIs that take - or return key paths instead of property names. -* Remove the following deprecated Objective-C API: - `+[RLMRealm migrateRealm:configuration:]`. - Please use `+[RLMRealm performMigrationForConfiguration:error:]` instead. -* Remove the following deprecated Swift APIs: - `AnyRealmCollection.sorted(byProperty:, ascending:)`, - `LinkingObjects.sorted(byProperty:, ascending:)`, - `List.sorted(byProperty:, ascending:)`, - `Results.sorted(byProperty:, ascending:)`, - `SortDescriptor.init(property:, ascending:)`, - `SortDescriptor.property`. - These APIs have been superseded by equivalent APIs that take - or return key paths instead of property names. -* The Objective-C and Swift `create(_:, value: update:)` APIs now - correctly nil out nullable properties when updating an existing - object when the `value` argument specifies nil or `NSNull` for - the property value. - -### Enhancements - -* It is now possible to create and log in multiple Realm Object Server users - with the same identity if they originate from different servers. Note that - if the URLs are different aliases for the same authentication server each - user will still be treated as separate (e.g. they will have their own copy - of each synchronized Realm opened using them). It is highly encouraged that - users defined using the access token credential type be logged in with an - authentication server URL specified; this parameter will become mandatory - in a future version of the SDK. -* Add `-[RLMSyncUser retrieveInfoForUser:identityProvider:completion:]` - API allowing administrator users to retrieve information about a user based - on their provider identity (for example, a username). Requires any edition - of the Realm Object Server 1.8.2 or later. - -### Bugfixes - -* Realm no longer throws an "unsupported instruction" exception in some cases - when opening a synced Realm asynchronously. - -3.0.0-beta Release notes (2017-07-14) -============================================================= - -### Breaking Changes - -* Synchronized Realms require a server running Realm Object Server v2.0 or higher. - -### Enhancements - -* Add a new error code to denote 'permission denied' errors when working - with synchronized Realms, as well as an accompanying block that can be - called to inform the binding that the offending Realm's files should be - deleted immediately. This allows recovering from 'permission denied' - errors in a more robust manner. See the documentation for - `RLMSyncErrorPermissionDeniedError` for more information. -* Add `-[RLMSyncPermissionValue initWithRealmPath:username:accessLevel:]` - API allowing permissions to be applied to a user based on their username - (usually, an email address). Requires any edition of the Realm Object - Server 1.6.0 or later. -* Improve performance of creating Swift objects which contain at least one List - property. - -### Bugfixes - -* `List.description` now reports the correct types for nested lists. -* Fix unmanaged object initialization when a nested property type returned - `false` from `Object.shouldIncludeInDefaultSchema()`. -* Don't clear RLMArrays on self-assignment. - -2.10.2 Release notes (2017-09-27) -============================================================= - -### Bugfixes - -* The keychain item name used by Realm to manage the encryption keys for - sync-related metadata is now set to a per-app name based on the bundle - identifier. Keys that were previously stored within the single, shared Realm - keychain item will be transparently migrated to the per-application keychain - item. -* Fix downloading of the Realm core binaries when Xcode's command-line tools are - set as the active developer directory for command-line interactions. -* Fix a crash that could occur when resolving a ThreadSafeReference to a `List` - whose parent object had since been deleted. - -2.10.1 Release notes (2017-09-14) -============================================================= - -Swift binaries are now produced for Swift 3.0, 3.0.1, 3.0.2, 3.1, 3.2 and 4.0. - -### Enhancements - -* Auxiliary files are excluded from backup by default. - -### Bugfixes - -* Fix more cases where assigning an RLMArray property to itself would clear the - RLMArray. - -2.10.0 Release notes (2017-08-21) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Expose additional authentication-related errors that might be reported by - a Realm Object Server. -* An error handler can now be registered on `{RLM}SyncUser`s in order to - report authentication-related errors that affect the user. - -### Bugfixes - -* Sorting Realm collection types no longer throws an exception on iOS 7. -* Sync users are now automatically logged out upon receiving certain types - of errors that indicate they are no longer logged into the server. For - example, users who are authenticated using third-party credentials will find - themselves logged out of the Realm Object Server if the third-party identity - service indicates that their credential is no longer valid. -* Address high CPU usage and hangs in certain cases when processing collection - notifications in highly-connected object graphs. - -2.9.1 Release notes (2017-08-01) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* The `shouldCompactOnLaunch` block is no longer invoked if the Realm at that - path is already open on other threads. -* Fix an assertion failure in collection notifications when changes are made to - the schema via sync while the notification block is active. - -2.9.0 Release notes (2017-07-26) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Add a new error code to denote 'permission denied' errors when working - with synchronized Realms, as well as an accompanying block that can be - called to inform the binding that the offending Realm's files should be - deleted immediately. This allows recovering from 'permission denied' - errors in a more robust manner. See the documentation for - `RLMSyncErrorPermissionDeniedError` for more information. -* Add `-[RLMSyncPermissionValue initWithRealmPath:username:accessLevel:]` - API allowing permissions to be applied to a user based on their username - (usually, an email address). Requires any edition of the Realm Object - Server 1.6.0 or later. -* Improve performance of creating Swift objects which contain at least one List - property. -* It is now possible to create and log in multiple Realm Object Server users - with the same identity if they originate from different servers. Note that - if the URLs are different aliases for the same authentication server each - user will still be treated as separate (e.g. they will have their own copy - of each synchronized Realm opened using them). It is highly encouraged that - users defined using the access token credential type be logged in with an - authentication server URL specified; this parameter will become mandatory - in a future version of the SDK. -* Add `-[RLMSyncUser retrieveInfoForUser:identityProvider:completion:]` - API allowing administrator users to retrieve information about a user based - on their provider identity (for example, a username). Requires any edition - of the Realm Object Server 1.8.2 or later. - -### Bugfixes - -* `List.description` now reports the correct types for nested lists. -* Fix unmanaged object initialization when a nested property type returned - `false` from `Object.shouldIncludeInDefaultSchema()`. -* Don't clear RLMArrays on self-assignment. - -2.8.3 Release notes (2017-06-20) -============================================================= - -### Bugfixes - -* Properly update RealmOptional properties when adding an object with `add(update: true)`. -* Add some missing quotes in error messages. -* Fix a performance regression when creating objects with primary keys. - -2.8.2 Release notes (2017-06-16) -============================================================= - -### Bugfixes - -* Fix an issue where synchronized Realms would eventually disconnect from the - remote server if the user object used to define their sync configuration - was destroyed. -* Restore support for changing primary keys in migrations (broken in 2.8.0). -* Revert handling of adding objects with nil properties to a Realm to the - pre-2.8.0 behavior. - -2.8.1 Release notes (2017-06-12) -============================================================= - -Add support for building with Xcode 9 Beta 1. - -### Bugfixes - -* Fix setting a float property to NaN. -* Fix a crash when using compact on launch in combination with collection - notifications. - -2.8.0 Release notes (2017-06-02) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Enable encryption on watchOS. -* Add `-[RLMSyncUser changePassword:forUserID:completion:]` API to change an - arbitrary user's password if the current user has administrative privileges - and using Realm's 'password' authentication provider. - Requires any edition of the Realm Object Server 1.6.0 or later. - -### Bugfixes - -* Suppress `-Wdocumentation` warnings in Realm C++ headers when using CocoaPods - with Xcode 8.3.2. -* Throw an appropriate error rather than crashing when an RLMArray is assigned - to an RLMArray property of a different type. -* Fix crash in large (>4GB) encrypted Realm files. -* Improve accuracy of sync progress notifications. -* Fix an issue where synchronized Realms did not connect to the remote server - in certain situations, such as when an application was offline when the Realms - were opened but later regained network connectivity. - -2.7.0 Release notes (2017-05-03) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Use reachability API to minimize the reconnection delay if the network - connection was lost. -* Add `-[RLMSyncUser changePassword:completion:]` API to change the current - user's password if using Realm's 'password' authentication provider. - Requires any edition of the Realm Object Server 1.4.0 or later. -* `{RLM}SyncConfiguration` now has an `enableSSLValidation` property - (and default parameter in the Swift initializer) to allow SSL validation - to be specified on a per-server basis. -* Transactions between a synced Realm and a Realm Object Server can now - exceed 16 MB in size. -* Add new APIs for changing and retrieving permissions for synchronized Realms. - These APIs are intended to replace the existing Realm Object-based permissions - system. Requires any edition of the Realm Object Server 1.1.0 or later. - -### Bugfixes - -* Support Realm model classes defined in Swift with overridden Objective-C - names (e.g. `@objc(Foo) class SwiftFoo: Object {}`). -* Fix `-[RLMMigration enumerateObjects:block:]` returning incorrect `oldObject` - objects when enumerating a class name after previously deleting a `newObject`. -* Fix an issue where `Realm.asyncOpen(...)` would fail to work when opening a - synchronized Realm for which the user only had read permissions. -* Using KVC to set a `List` property to `nil` now clears it to match the - behavior of `RLMArray` properties. -* Fix crash from `!m_awaiting_pong` assertion failure when using synced Realms. -* Fix poor performance or hangs when performing case-insensitive queries on - indexed string properties that contain many characters that don't differ - between upper and lower case (e.g., numbers, punctuation). - -2.6.2 Release notes (2017-04-21) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix an issue where calling `Realm.asyncOpen(...)` with a synchronized Realm - configuration would fail with an "Operation canceled" error. -* Fix initial collection notification sometimes not being delivered for synced - Realms. -* Fix circular links sometimes resulting in objects not being marked as - modified in change notifications. - -2.6.1 Release notes (2017-04-18) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix an issue where calling `Realm.asyncOpen(...)` with a synchronized Realm - configuration would crash in error cases rather than report the error. - This is a small source breaking change if you were relying on the error - being reported to be a `Realm.Error`. - -2.6.0 Release notes (2017-04-18) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Add a `{RLM}SyncUser.isAdmin` property indicating whether a user is a Realm - Object Server administrator. -* Add an API to asynchronously open a Realm and deliver it to a block on a - given queue. This performs all work needed to get the Realm to - a usable state (such as running potentially time-consuming migrations) on a - background thread before dispatching to the given queue. In addition, - synchronized Realms wait for all remote content available at the time the - operation began to be downloaded and available locally. -* Add `shouldCompactOnLaunch` block property when configuring a Realm to - determine if it should be compacted before being returned. -* Speed up case-insensitive queries on indexed string properties. -* Add RLMResults's collection aggregate methods to RLMArray. -* Add support for calling the aggregate methods on unmanaged Lists. - -### Bugfixes - -* Fix a deadlock when multiple processes open a Realm at the same time. -* Fix `value(forKey:)`/`value(forKeyPath:)` returning incorrect values for `List` properties. - -2.5.1 Release notes (2017-04-05) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix CocoaPods installation with static libraries and multiple platforms. -* Fix uncaught "Bad version number" exceptions on the notification worker thread - followed by deadlocks when Realms refresh. - -2.5.0 Release notes (2017-03-28) -============================================================= - -Files written by Realm this version cannot be read by earlier versions of Realm. -Old files can still be opened and files open in read-only mode will not be -modified. - -If using synchronized Realms, the Realm Object Server must be running version -1.3.0 or later. - -Swift binaries are now produced for Swift 3.0, 3.0.1, 3.0.2 and 3.1. - -### API Breaking Changes - -* None. - -### Enhancements - -* Add support for multi-level object equality comparisons against `NULL`. -* Add support for the `[d]` modifier on string comparison operators to perform - diacritic-insensitive comparisons. -* Explicitly mark `[[RLMRealm alloc] init]` as unavailable. -* Include the name of the problematic class in the error message when an - invalid property type is marked as the primary key. - -### Bugfixes - -* Fix incorrect column type assertions which could occur after schemas were - merged by sync. -* Eliminate an empty write transaction when opening a synced Realm. -* Support encrypting synchronized Realms by respecting the `encryptionKey` value - of the Realm's configuration. -* Fix crash when setting an `{NS}Data` property close to 16MB. -* Fix for reading `{NS}Data` properties incorrectly returning `nil`. -* Reduce file size growth in cases where Realm versions were pinned while - starting write transactions. -* Fix an assertion failure when writing to large `RLMArray`/`List` properties. -* Fix uncaught `BadTransactLog` exceptions when pulling invalid changesets from - synchronized Realms. -* Fix an assertion failure when an observed `RLMArray`/`List` is deleted after - being modified. - -2.4.4 Release notes (2017-03-13) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Add `(RLM)SyncPermission` class to allow reviewing access permissions for - Realms. Requires any edition of the Realm Object Server 1.1.0 or later. -* Further reduce the number of files opened per thread-specific Realm on macOS, - iOS and watchOS. - -### Bugfixes - -* Fix a crash that could occur if new Realm instances were created while the - application was exiting. -* Fix a bug that could lead to bad version number errors when delivering - change notifications. -* Fix a potential use-after-free bug when checking validity of results. -* Fix an issue where a sync session might not close properly if it receives - an error while being torn down. -* Fix some issues where a sync session might not reconnect to the server properly - or get into an inconsistent state if revived after invalidation. -* Fix an issue where notifications might not fire when the children of an - observed object are changed. -* Fix an issue where progress notifications on sync sessions might incorrectly - report out-of-date values. -* Fix an issue where multiple threads accessing encrypted data could result in - corrupted data or crashes. -* Fix an issue where certain `LIKE` queries could hang. -* Fix an issue where `-[RLMRealm writeCopyToURL:encryptionKey:error]` could create - a corrupt Realm file. -* Fix an issue where incrementing a synced Realm's schema version without actually - changing the schema could cause a crash. - -2.4.3 Release notes (2017-02-20) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Avoid copying copy-on-write data structures, which can grow the file, when the - write does not actually change existing values. -* Improve performance of deleting all objects in an RLMResults. -* Reduce the number of files opened per thread-specific Realm on macOS. -* Improve startup performance with large numbers of `RLMObject`/`Object` - subclasses. - -### Bugfixes - -* Fix synchronized Realms not downloading remote changes when an access token - expires and there are no local changes to upload. -* Fix an issue where values set on a Realm object using `setValue(value:, forKey:)` - that were not themselves Realm objects were not properly converted into Realm - objects or checked for validity. -* Fix an issue where `-[RLMSyncUser sessionForURL:]` could erroneously return a - non-nil value when passed in an invalid URL. -* `SyncSession.Progress.fractionTransferred` now returns 1 if there are no - transferrable bytes. -* Fix sync progress notifications registered on background threads by always - dispatching on a dedicated background queue. -* Fix compilation issues with Xcode 8.3 beta 2. -* Fix incorrect sync progress notification values for Realms originally created - using a version of Realm prior to 2.3.0. -* Fix LLDB integration to be able to display summaries of `RLMResults` once more. -* Reject Swift properties with names which cause them to fall in to ARC method - families rather than crashing when they are accessed. -* Fix sorting by key path when the declared property order doesn't match the order - of properties in the Realm file, which can happen when properties are added in - different schema versions. - -2.4.2 Release notes (2017-01-30) -============================================================= - -### Bugfixes - -* Fix an issue where RLMRealm instances could end up in the autorelease pool - for other threads. - -2.4.1 Release notes (2017-01-27) -============================================================= - -### Bugfixes - -* Fix an issue where authentication tokens were not properly refreshed - automatically before expiring. - -2.4.0 Release notes (2017-01-26) -============================================================= - -This release drops support for compiling with Swift 2.x. -Swift 3.0.0 is now the minimum Swift version supported. - -### API Breaking Changes - -* None. - -### Enhancements - -* Add change notifications for individual objects with an API similar to that - of collection notifications. - -### Bugfixes - -* Fix Realm Objective-C compilation errors with Xcode 8.3 beta 1. -* Fix several error handling issues when renewing expired authentication - tokens for synchronized Realms. -* Fix a race condition leading to bad_version exceptions being thrown in - Realm's background worker thread. - -2.3.0 Release notes (2017-01-19) -============================================================= - -### Sync Breaking Changes - -* Make `PermissionChange`'s `id` property a primary key. - -### API Breaking Changes - -* None. - -### Enhancements - -* Add `SyncPermissionOffer` and `SyncPermissionOfferResponse` classes to allow - creating and accepting permission change events to synchronized Realms between - different users. -* Support monitoring sync transfer progress by registering notification blocks - on `SyncSession`. Specify the transfer direction (`.upload`/`.download`) and - mode (`.reportIndefinitely`/`.forCurrentlyOutstandingWork`) to monitor. - -### Bugfixes - -* Fix a call to `commitWrite(withoutNotifying:)` committing a transaction that - would not have triggered a notification incorrectly skipping the next - notification. -* Fix incorrect results and crashes when conflicting object insertions are - merged by the synchronization mechanism when there is a collection - notification registered for that object type. - -2.2.0 Release notes (2017-01-12) -============================================================= - -### Sync Breaking Changes (In Beta) - -* Sync-related error reporting behavior has been changed. Errors not related - to a particular user or session are only reported if they are classed as - 'fatal' by the underlying sync engine. -* Added `RLMSyncErrorClientResetError` to `RLMSyncError` enum. - -### API Breaking Changes - -* The following Objective-C APIs have been deprecated in favor of newer or preferred versions: - -| Deprecated API | New API | -|:------------------------------------------------------------|:------------------------------------------------------------| -| `-[RLMArray sortedResultsUsingProperty:]` | `-[RLMArray sortedResultsUsingKeyPath:]` | -| `-[RLMCollection sortedResultsUsingProperty:]` | `-[RLMCollection sortedResultsUsingKeyPath:]` | -| `-[RLMResults sortedResultsUsingProperty:]` | `-[RLMResults sortedResultsUsingKeyPath:]` | -| `+[RLMSortDescriptor sortDescriptorWithProperty:ascending]` | `+[RLMSortDescriptor sortDescriptorWithKeyPath:ascending:]` | -| `RLMSortDescriptor.property` | `RLMSortDescriptor.keyPath` | - -* The following Swift APIs have been deprecated in favor of newer or preferred versions: - -| Deprecated API | New API | -|:------------------------------------------------------|:-------------------------------------------------| -| `LinkingObjects.sorted(byProperty:ascending:)` | `LinkingObjects.sorted(byKeyPath:ascending:)` | -| `List.sorted(byProperty:ascending:)` | `List.sorted(byKeyPath:ascending:)` | -| `RealmCollection.sorted(byProperty:ascending:)` | `RealmCollection.sorted(byKeyPath:ascending:)` | -| `Results.sorted(byProperty:ascending:)` | `Results.sorted(byKeyPath:ascending:)` | -| `SortDescriptor(property:ascending:)` | `SortDescriptor(keyPath:ascending:)` | -| `SortDescriptor.property` | `SortDescriptor.keyPath` | - -### Enhancements - -* Introduce APIs for safely passing objects between threads. Create a - thread-safe reference to a thread-confined object by passing it to the - `+[RLMThreadSafeReference referenceWithThreadConfined:]`/`ThreadSafeReference(to:)` - constructor, which you can then safely pass to another thread to resolve in - the new Realm with `-[RLMRealm resolveThreadSafeReference:]`/`Realm.resolve(_:)`. -* Realm collections can now be sorted by properties over to-one relationships. -* Optimized `CONTAINS` queries to use Boyer-Moore algorithm - (around 10x speedup on large datasets). - -### Bugfixes - -* Setting `deleteRealmIfMigrationNeeded` now also deletes the Realm if a file - format migration is required, such as when moving from a file last accessed - with Realm 0.x to 1.x, or 1.x to 2.x. -* Fix queries containing nested `SUBQUERY` expressions. -* Fix spurious incorrect thread exceptions when a thread id happens to be - reused while an RLMRealm instance from the old thread still exists. -* Fixed various bugs in aggregate methods (max, min, avg, sum). - -2.1.2 Release notes (2016--12-19) -============================================================= - -This release adds binary versions of Swift 3.0.2 frameworks built with Xcode 8.2. - -### Sync Breaking Changes (In Beta) - -* Rename occurences of "iCloud" with "CloudKit" in APIs and comments to match - naming in the Realm Object Server. - -### API Breaking Changes - -* None. - -### Enhancements - -* Add support for 'LIKE' queries (wildcard matching). - -### Bugfixes - -* Fix authenticating with CloudKit. -* Fix linker warning about "Direct access to global weak symbol". - -2.1.1 Release notes (2016-12-02) -============================================================= - -### Enhancements - -* Add `RealmSwift.ObjectiveCSupport.convert(object:)` methods to help write - code that interoperates between Realm Objective-C and Realm Swift APIs. -* Throw exceptions when opening a Realm with an incorrect configuration, like: - * `readOnly` set with a sync configuration. - * `readOnly` set with a migration block. - * migration block set with a sync configuration. -* Greatly improve performance of write transactions which make a large number of - changes to indexed properties, including the automatic migration when opening - files written by Realm 1.x. - -### Bugfixes - -* Reset sync metadata Realm in case of decryption error. -* Fix issue preventing using synchronized Realms in Xcode Playgrounds. -* Fix assertion failure when migrating a model property from object type to - `RLMLinkingObjects` type. -* Fix a `LogicError: Bad version number` exception when using `RLMResults` with - no notification blocks and explicitly called `-[RLMRealm refresh]` from that - thread. -* Logged-out users are no longer returned from `+[RLMSyncUser currentUser]` or - `+[RLMSyncUser allUsers]`. -* Fix several issues which could occur when the 1001st object of a given type - was created or added to an RLMArray/List, including crashes when rerunning - existing queries and possibly data corruption. -* Fix a potential crash when the application exits due to a race condition in - the destruction of global static variables. -* Fix race conditions when waiting for sync uploads or downloads to complete - which could result in crashes or the callback being called too early. - -2.1.0 Release notes (2016-11-18) -============================================================= - -### Sync Breaking Changes (In Beta) - -* None. - -### API breaking changes - -* None. - -### Enhancements - -* Add the ability to skip calling specific notification blocks when committing - a write transaction. - -### Bugfixes - -* Deliver collection notifications when beginning a write transaction which - advances the read version of a Realm (previously only Realm-level - notifications were sent). -* Fix some scenarios which would lead to inconsistent states when using - collection notifications. -* Fix several race conditions in the notification functionality. -* Don't send Realm change notifications when canceling a write transaction. - -2.0.4 Release notes (2016-11-14) -============================================================= - -### Sync Breaking Changes (In Beta) - -* Remove `RLMAuthenticationActions` and replace - `+[RLMSyncCredential credentialWithUsername:password:actions:]` with - `+[RLMSyncCredential credentialsWithUsername:password:register:]`. -* Rename `+[RLMSyncUser authenticateWithCredential:]` to - `+[RLMSyncUser logInWithCredentials:]`. -* Rename "credential"-related types and methods to - `RLMSyncCredentials`/`SyncCredentials` and consistently refer to credentials - in the plural form. -* Change `+[RLMSyncUser all]` to return a dictionary of identifiers to users and - rename to: - * `+[RLMSyncUser allUsers]` in Objective-C. - * `SyncUser.allUsers()` in Swift 2. - * `SyncUser.all` in Swift 3. -* Rename `SyncManager.sharedManager()` to `SyncManager.shared` in Swift 3. -* Change `Realm.Configuration.syncConfiguration` to take a `SyncConfiguration` - struct rather than a named tuple. -* `+[RLMSyncUser logInWithCredentials:]` now invokes its callback block on a - background queue. - -### API breaking changes - -* None. - -### Enhancements - -* Add `+[RLMSyncUser currentUser]`. -* Add the ability to change read, write and management permissions for - synchronized Realms using the management Realm obtained via the - `-[RLMSyncUser managementRealmWithError:]` API and the - `RLMSyncPermissionChange` class. - -### Bugfixes - -* None. - -2.0.3 Release notes (2016-10-27) -============================================================= - -This release adds binary versions of Swift 3.0.1 frameworks built with Xcode 8.1 -GM seed. - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix a `BadVersion` exception caused by a race condition when delivering - collection change notifications. -* Fix an assertion failure when additional model classes are added and - `deleteRealmIfMigrationNeeded` is enabled. -* Fix a `BadTransactLog` exception when deleting an `RLMResults` in a synced - Realm. -* Fix an assertion failure when a write transaction is in progress at the point - of process termination. -* Fix a crash that could occur when working with a `RLMLinkingObject` property - of an unmanaged object. - -2.0.2 Release notes (2016-10-05) -============================================================= - -This release is not protocol-compatible with previous version of the Realm -Mobile Platform. - -### API breaking changes - -* Rename Realm Swift's `User` to `SyncUser` to make clear that it relates to the - Realm Mobile Platform, and to avoid potential conflicts with other `User` types. - -### Bugfixes - -* Fix Realm headers to be compatible with pre-C++11 dialects of Objective-C++. -* Fix incorrect merging of RLMArray/List changes when objects with the same - primary key are created on multiple devices. -* Fix bad transaction log errors after deleting objects on a different device. -* Fix a BadVersion error when a background worker finishes running while older - results from that worker are being delivered to a different thread. - -2.0.1 Release notes (2016-09-29) -============================================================= - -### Bugfixes - -* Fix an assertion failure when opening a Realm file written by a 1.x version - of Realm which has an indexed nullable int or bool property. - -2.0.0 Release notes (2016-09-27) -============================================================= - -This release introduces support for the Realm Mobile Platform! -See for an overview -of these great new features. - -### API breaking changes - -* By popular demand, `RealmSwift.Error` has been moved from the top-level - namespace into a `Realm` extension and is now `Realm.Error`, so that it no - longer conflicts with `Swift.Error`. -* Files written by Realm 2.0 cannot be read by 1.x or earlier versions. Old - files can still be opened. - -### Enhancements - -* The .log, .log_a and .log_b files no longer exist and the state tracked in - them has been moved to the main Realm file. This reduces the number of open - files needed by Realm, improves performance of both opening and writing to - Realms, and eliminates a small window where committing write transactions - would prevent other processes from opening the file. - -### Bugfixes - -* Fix an assertion failure when sorting by zero properties. -* Fix a mid-commit crash in one process also crashing all other processes with - the same Realm open. -* Properly initialize new nullable float and double properties added to - existing objects to null rather than 0. -* Fix a stack overflow when objects with indexed string properties had very - long common prefixes. -* Fix a race condition which could lead to crashes when using async queries or - collection notifications. -* Fix a bug which could lead to incorrect state when an object which links to - itself is deleted from the Realm. - -1.1.0 Release notes (2016-09-16) -============================================================= - -This release brings official support for Xcode 8, Swift 2.3 and Swift 3.0. -Prebuilt frameworks are now built with Xcode 7.3.1 and Xcode 8.0. - -### API breaking changes - -* Deprecate `migrateRealm:` in favor of new `performMigrationForConfiguration:error:` method - that follows Cocoa's NSError conventions. -* Fix issue where `RLMResults` used `id `instead of its generic type as the return - type of subscript. - -### Enhancements - -* Improve error message when using NSNumber incorrectly in Swift models. -* Further reduce the download size of the prebuilt static libraries. -* Improve sort performance, especially on non-nullable columns. -* Allow partial initialization of object by `initWithValue:`, deferring - required property checks until object is added to Realm. - -### Bugfixes - -* Fix incorrect truncation of the constant value for queries of the form - `column < value` for `float` and `double` columns. -* Fix crash when an aggregate is accessed as an `Int8`, `Int16`, `Int32`, or `Int64`. -* Fix a race condition that could lead to a crash if an RLMArray or List was - deallocated on a different thread than it was created on. -* Fix a crash when the last reference to an observed object is released from - within the observation. -* Fix a crash when `initWithValue:` is used to create a nested object for a class - with an uninitialized schema. -* Enforce uniqueness for `RealmOptional` primary keys when using the `value` setter. - -1.0.2 Release notes (2016-07-13) -============================================================= - -### API breaking changes - -* Attempting to add an object with no properties to a Realm now throws rather than silently - doing nothing. - -### Enhancements - -* Swift: A `write` block may now `throw`, reverting any changes already made in - the transaction. -* Reduce address space used when committing write transactions. -* Significantly reduce the download size of prebuilt binaries and slightly - reduce the final size contribution of Realm to applications. -* Improve performance of accessing RLMArray properties and creating objects - with List properties. - -### Bugfixes - -* Fix a crash when reading the shared schema from an observed Swift object. -* Fix crashes or incorrect results when passing an array of values to - `createOrUpdate` after reordering the class's properties. -* Ensure that the initial call of a Results notification block is always passed - .Initial even if there is a write transaction between when the notification - is added and when the first notification is delivered. -* Fix a crash when deleting all objects in a Realm while fast-enumerating query - results from that Realm. -* Handle EINTR from flock() rather than crashing. -* Fix incorrect behavior following a call to `[RLMRealm compact]`. -* Fix live updating and notifications for Results created from a predicate involving - an inverse relationship to be triggered when an object at the other end of the relationship - is modified. - -1.0.1 Release notes (2016-06-12) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Significantly improve performance of opening Realm files, and slightly - improve performance of committing write transactions. - -### Bugfixes - -* Swift: Fix an error thrown when trying to create or update `Object` instances via - `add(:_update:)` with a primary key property of type `RealmOptional`. -* Xcode playground in Swift release zip now runs successfully. -* The `key` parameter of `Realm.objectForPrimaryKey(_:key:)`/ `Realm.dynamicObjectForPrimaryKey(_:key:)` - is now marked as optional. -* Fix a potential memory leak when closing Realms after a Realm file has been - opened on multiple threads which are running in active run loops. -* Fix notifications breaking on tvOS after a very large number of write - transactions have been committed. -* Fix a "Destruction of mutex in use" assertion failure after an error while - opening a file. -* Realm now throws an exception if an `Object` subclass is defined with a managed Swift `lazy` property. - Objects with ignored `lazy` properties should now work correctly. -* Update the LLDB script to work with recent changes to the implementation of `RLMResults`. -* Fix an assertion failure when a Realm file is deleted while it is still open, - and then a new Realm is opened at the same path. Note that this is still not - a supported scenario, and may break in other ways. - -1.0.0 Release notes (2016-05-25) -============================================================= - -No changes since 0.103.2. - -0.103.2 Release notes (2016-05-24) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Improve the error messages when an I/O error occurs in `writeCopyToURL`. - -### Bugfixes - -* Fix an assertion failure which could occur when opening a Realm after opening - that Realm failed previously in some specific ways in the same run of the - application. -* Reading optional integers, floats, and doubles from within a migration block - now correctly returns `nil` rather than 0 when the stored value is `nil`. - -0.103.1 Release notes (2016-05-19) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix a bug that sometimes resulted in a single object's NSData properties - changing from `nil` to a zero-length non-`nil` NSData when a different object - of the same type was deleted. - -0.103.0 Release notes (2016-05-18) -============================================================= - -### API breaking changes - -* All functionality deprecated in previous releases has been removed entirely. -* Support for Xcode 6.x & Swift prior to 2.2 has been completely removed. -* `RLMResults`/`Results` now become empty when a `RLMArray`/`List` or object - they depend on is deleted, rather than throwing an exception when accessed. -* Migrations are no longer run when `deleteRealmIfMigrationNeeded` is set, - recreating the file instead. - -### Enhancements - -* Added `invalidated` properties to `RLMResults`/`Results`, `RLMLinkingObjects`/`LinkingObjects`, - `RealmCollectionType` and `AnyRealmCollection`. These properties report whether the Realm - the object is associated with has been invalidated. -* Some `NSError`s created by Realm now have more descriptive user info payloads. - -### Bugfixes - -* None. - -0.102.1 Release notes (2016-05-13) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Return `RLMErrorSchemaMismatch` error rather than the more generic `RLMErrorFail` - when a migration is required. -* Improve the performance of allocating instances of `Object` subclasses - that have `LinkingObjects` properties. - -### Bugfixes - -* `RLMLinkingObjects` properties declared in Swift subclasses of `RLMObject` - now work correctly. -* Fix an assertion failure when deleting all objects of a type, inserting more - objects, and then deleting some of the newly inserted objects within a single - write transaction when there is an active notification block for a different - object type which links to the objects being deleted. -* Fix crashes and/or incorrect results when querying over multiple levels of - `LinkingObjects` properties. -* Fix opening read-only Realms on multiple threads at once. -* Fix a `BadTransactLog` exception when storing dates before the unix epoch (1970-01-01). - -0.102.0 Release notes (2016-05-09) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Add a method to rename properties during migrations: - * Swift: `Migration.renamePropertyForClass(_:oldName:newName:)` - * Objective-C: `-[RLMMigration renamePropertyForClass:oldName:newName:]` -* Add `deleteRealmIfMigrationNeeded` to - `RLMRealmConfiguration`/`Realm.Configuration`. When this is set to `true`, - the Realm file will be automatically deleted and recreated when there is a - schema mismatch rather than migrated to the new schema. - -### Bugfixes - -* Fix `BETWEEN` queries that traverse `RLMArray`/`List` properties to ensure that - a single related object satisfies the `BETWEEN` criteria, rather than allowing - different objects in the array to satisfy the lower and upper bounds. -* Fix a race condition when a Realm is opened on one thread while it is in the - middle of being closed on another thread which could result in crashes. -* Fix a bug which could result in changes made on one thread being applied - incorrectly on other threads when those threads are refreshed. -* Fix crash when migrating to the new date format introduced in 0.101.0. -* Fix crash when querying inverse relationships when objects are deleted. - -0.101.0 Release notes (2016-05-04) -============================================================= - -### API breaking changes - -* Files written by this version of Realm cannot be read by older versions of - Realm. Existing files will automatically be upgraded when they are opened. - -### Enhancements - -* Greatly improve performance of collection change calculation for complex - object graphs, especially for ones with cycles. -* NSDate properties now support nanoseconds precision. -* Opening a single Realm file on multiple threads now shares a single memory - mapping of the file for all threads, significantly reducing the memory - required to work with large files. -* Crashing while in the middle of a write transaction no longer blocks other - processes from performing write transactions on the same file. -* Improve the performance of refreshing a Realm (including via autorefresh) - when there are live Results/RLMResults objects for that Realm. - -### Bugfixes - -* Fix an assertion failure of "!more_before || index >= std::prev(it)->second)" - in `IndexSet::do_add()`. -* Fix a crash when an `RLMArray` or `List` object is destroyed from the wrong - thread. - -0.100.0 Release notes (2016-04-29) -============================================================= - -### API breaking changes - -* `-[RLMObject linkingObjectsOfClass:forProperty]` and `Object.linkingObjects(_:forProperty:)` - are deprecated in favor of properties of type `RLMLinkingObjects` / `LinkingObjects`. - -### Enhancements - -* The automatically-maintained inverse direction of relationships can now be exposed as - properties of type `RLMLinkingObjects` / `LinkingObjects`. These properties automatically - update to reflect the objects that link to the target object, can be used in queries, and - can be filtered like other Realm collection types. -* Queries that compare objects for equality now support multi-level key paths. - -### Bugfixes - -* Fix an assertion failure when a second write transaction is committed after a - write transaction deleted the object containing an RLMArray/List which had an - active notification block. -* Queries that compare `RLMArray` / `List` properties using != now give the correct results. - -0.99.1 Release notes (2016-04-26) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix a scenario that could lead to the assertion failure - "m_advancer_sg->get_version_of_current_transaction() == - new_notifiers.front()->version()". - -0.99.0 Release notes (2016-04-22) -============================================================= - -### API breaking changes - -* Deprecate properties of type `id`/`AnyObject`. This type was rarely used, - rarely useful and unsupported in every other Realm binding. -* The block for `-[RLMArray addNotificationBlock:]` and - `-[RLMResults addNotificationBlock:]` now takes another parameter. -* The following Objective-C APIs have been deprecated in favor of newer or preferred versions: - -| Deprecated API | New API | -|:-------------------------------------------------------|:------------------------------------------------------| -| `-[RLMRealm removeNotification:]` | `-[RLMNotificationToken stop]` | -| `RLMRealmConfiguration.path` | `RLMRealmConfiguration.fileURL` | -| `RLMRealm.path` | `RLMRealmConfiguration.fileURL` | -| `RLMRealm.readOnly` | `RLMRealmConfiguration.readOnly` | -| `+[RLMRealm realmWithPath:]` | `+[RLMRealm realmWithURL:]` | -| `+[RLMRealm writeCopyToPath:error:]` | `+[RLMRealm writeCopyToURL:encryptionKey:error:]` | -| `+[RLMRealm writeCopyToPath:encryptionKey:error:]` | `+[RLMRealm writeCopyToURL:encryptionKey:error:]` | -| `+[RLMRealm schemaVersionAtPath:error:]` | `+[RLMRealm schemaVersionAtURL:encryptionKey:error:]` | -| `+[RLMRealm schemaVersionAtPath:encryptionKey:error:]` | `+[RLMRealm schemaVersionAtURL:encryptionKey:error:]` | - -* The following Swift APIs have been deprecated in favor of newer or preferred versions: - -| Deprecated API | New API | -|:----------------------------------------------|:-----------------------------------------| -| `Realm.removeNotification(_:)` | `NotificationToken.stop()` | -| `Realm.Configuration.path` | `Realm.Configuration.fileURL` | -| `Realm.path` | `Realm.Configuration.fileURL` | -| `Realm.readOnly` | `Realm.Configuration.readOnly` | -| `Realm.writeCopyToPath(_:encryptionKey:)` | `Realm.writeCopyToURL(_:encryptionKey:)` | -| `schemaVersionAtPath(_:encryptionKey:error:)` | `schemaVersionAtURL(_:encryptionKey:)` | - -### Enhancements - -* Add information about what rows were added, removed, or modified to the - notifications sent to the Realm collections. -* Improve error when illegally appending to an `RLMArray` / `List` property from a default value - or the standalone initializer (`init()`) before the schema is ready. - -### Bugfixes - -* Fix a use-after-free when an associated object's dealloc method is used to - remove observers from an RLMObject. -* Fix a small memory leak each time a Realm file is opened. -* Return a recoverable `RLMErrorAddressSpaceExhausted` error rather than - crash when there is insufficient available address space on Realm - initialization or write commit. - -0.98.8 Release notes (2016-04-15) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fixed a bug that caused some encrypted files created using - `-[RLMRealm writeCopyToPath:encryptionKey:error:]` to fail to open. - -0.98.7 Release notes (2016-04-13) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Mark further initializers in Objective-C as NS_DESIGNATED_INITIALIZER to prevent that these aren't - correctly defined in Swift Object subclasses, which don't qualify for auto-inheriting the required initializers. -* `-[RLMResults indexOfObjectWithPredicate:]` now returns correct results - for `RLMResults` instances that were created by filtering an `RLMArray`. -* Adjust how RLMObjects are destroyed in order to support using an associated - object on an RLMObject to remove KVO observers from that RLMObject. -* `-[RLMResults indexOfObjectWithPredicate:]` now returns the index of the first matching object for a - sorted `RLMResults`, matching its documented behavior. -* Fix a crash when canceling a transaction that set a relationship. -* Fix a crash when a query referenced a deleted object. - -0.98.6 Release notes (2016-03-25) -============================================================= - -Prebuilt frameworks are now built with Xcode 7.3. - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix running unit tests on iOS simulators and devices with Xcode 7.3. - -0.98.5 Release notes (2016-03-14) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix a crash when opening a Realm on 32-bit iOS devices. - -0.98.4 Release notes (2016-03-10) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Properly report changes made by adding an object to a Realm with - addOrUpdate:/createOrUpdate: to KVO observers for existing objects with that - primary key. -* Fix crashes and assorted issues when a migration which added object link - properties is rolled back due to an error in the migration block. -* Fix assertion failures when deleting objects within a migration block of a - type which had an object link property added in that migration. -* Fix an assertion failure in `Query::apply_patch` when updating certain kinds - of queries after a write transaction is committed. - -0.98.3 Release notes (2016-02-26) -============================================================= - -### Enhancements - -* Initializing the shared schema is 3x faster. - -### Bugfixes - -* Using Realm Objective-C from Swift while having Realm Swift linked no longer causes that the - declared `ignoredProperties` are not taken into account. -* Fix assertion failures when rolling back a migration which added Object link - properties to a class. -* Fix potential errors when cancelling a write transaction which modified - multiple `RLMArray`/`List` properties. -* Report the correct value for inWriteTransaction after attempting to commit a - write transaction fails. -* Support CocoaPods 1.0 beginning from prerelease 1.0.0.beta.4 while retaining - backwards compatibility with 0.39. - -0.98.2 Release notes (2016-02-18) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Aggregate operations (`ANY`, `NONE`, `@count`, `SUBQUERY`, etc.) are now supported for key paths - that begin with an object relationship so long as there is a `RLMArray`/`List` property at some - point in a key path. -* Predicates of the form `%@ IN arrayProperty` are now supported. - -### Bugfixes - -* Use of KVC collection operators on Swift collection types no longer throws an exception. -* Fix reporting of inWriteTransaction in notifications triggered by - `beginWriteTransaction`. -* The contents of `List` and `Optional` properties are now correctly preserved when copying - a Swift object from one Realm to another, and performing other operations that result in a - Swift object graph being recursively traversed from Objective-C. -* Fix a deadlock when queries are performed within a Realm notification block. -* The `ANY` / `SOME` / `NONE` qualifiers are now required in comparisons involving a key path that - traverse a `RLMArray`/`List` property. Previously they were only required if the first key in the - key path was an `RLMArray`/`List` property. -* Fix several scenarios where the default schema would be initialized - incorrectly if the first Realm opened used a restricted class subset (via - `objectClasses`/`objectTypes`). - -0.98.1 Release notes (2016-02-10) -============================================================= - -### Bugfixes - -* Fix crashes when deleting an object containing an `RLMArray`/`List` which had - previously been queried. -* Fix a crash when deleting an object containing an `RLMArray`/`List` with - active notification blocks. -* Fix duplicate file warnings when building via CocoaPods. -* Fix crash or incorrect results when calling `indexOfObject:` on an - `RLMResults` derived from an `RLMArray`. - -0.98.0 Release notes (2016-02-04) -============================================================= - -### API breaking changes - -* `+[RLMRealm realmWithPath:]`/`Realm.init(path:)` now inherits from the default - configuration. -* Swift 1.2 is no longer supported. - -### Enhancements - -* Add `addNotificationBlock` to `RLMResults`, `Results`, `RLMArray`, and - `List`, which calls the given block whenever the collection changes. -* Do a lot of the work for keeping `RLMResults`/`Results` up-to-date after - write transactions on a background thread to help avoid blocking the main - thread. -* `NSPredicate`'s `SUBQUERY` operator is now supported. It has the following limitations: - * `@count` is the only operator that may be applied to the `SUBQUERY` expression. - * The `SUBQUERY(…).@count` expression must be compared with a constant. - * Correlated subqueries are not yet supported. - -### Bugfixes - -* None. - -0.97.1 Release notes (2016-01-29) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Swift: Added `Error` enum allowing to catch errors e.g. thrown on initializing - `RLMRealm`/`Realm` instances. -* Fail with `RLMErrorFileNotFound` instead of the more generic `RLMErrorFileAccess`, - if no file was found when a realm was opened as read-only or if the directory part - of the specified path was not found when a copy should be written. -* Greatly improve performance when deleting objects with one or more indexed - properties. -* Indexing `BOOL`/`Bool` and `NSDate` properties are now supported. -* Swift: Add support for indexing optional properties. - -### Bugfixes - -* Fix incorrect results or crashes when using `-[RLMResults setValue:forKey:]` - on an RLMResults which was filtered on the key being set. -* Fix crashes when an RLMRealm is deallocated from the wrong thread. -* Fix incorrect results from aggregate methods on `Results`/`RLMResults` after - objects which were previously in the results are deleted. -* Fix a crash when adding a new property to an existing class with over a - million objects in the Realm. -* Fix errors when opening encrypted Realm files created with writeCopyToPath. -* Fix crashes or incorrect results for queries that use relationship equality - in cases where the `RLMResults` is kept alive and instances of the target class - of the relationship are deleted. - -0.97.0 Release notes (2015-12-17) -============================================================= - -### API breaking changes - -* All functionality deprecated in previous releases has been removed entirely. -* Add generic type annotations to NSArrays and NSDictionaries in public APIs. -* Adding a Realm notification block on a thread not currently running from - within a run loop throws an exception rather than silently never calling the - notification block. - -### Enhancements - -* Support for tvOS. -* Support for building Realm Swift from source when using Carthage. -* The block parameter of `-[RLMRealm transactionWithBlock:]`/`Realm.write(_:)` is - now marked as `__attribute__((noescape))`/`@noescape`. -* Many forms of queries with key paths on both sides of the comparison operator - are now supported. -* Add support for KVC collection operators in `RLMResults` and `RLMArray`. -* Fail instead of deadlocking in `+[RLMRealm sharedSchema]`, if a Swift property is initialized - to a computed value, which attempts to open a Realm on its own. - -### Bugfixes - -* Fix poor performance when calling `-[RLMRealm deleteObjects:]` on an - `RLMResults` which filtered the objects when there are other classes linking - to the type of the deleted objects. -* An exception is now thrown when defining `Object` properties of an unsupported - type. - -0.96.3 Release notes (2015-12-04) -============================================================= - -### Enhancements - -* Queries are no longer limited to 16 levels of grouping. -* Rework the implementation of encrypted Realms to no longer interfere with - debuggers. - -### Bugfixes - -* Fix crash when trying to retrieve object instances via `dynamicObjects`. -* Throw an exception when querying on a link providing objects, which are from a different Realm. -* Return empty results when querying on a link providing an unattached object. -* Fix crashes or incorrect results when calling `-[RLMRealm refresh]` during - fast enumeration. -* Add `Int8` support for `RealmOptional`, `MinMaxType` and `AddableType`. -* Set the default value for newly added non-optional NSData properties to a - zero-byte NSData rather than nil. -* Fix a potential crash when deleting all objects of a class. -* Fix performance problems when creating large numbers of objects with - `RLMArray`/`List` properties. -* Fix memory leak when using Object(value:) for subclasses with - `List` or `RealmOptional` properties. -* Fix a crash when computing the average of an optional integer property. -* Fix incorrect search results for some queries on integer properties. -* Add error-checking for nil realm parameters in many methods such as - `+[RLMObject allObjectsInRealm:]`. -* Fix a race condition between commits and opening Realm files on new threads - that could lead to a crash. -* Fix several crashes when opening Realm files. -* `-[RLMObject createInRealm:withValue:]`, `-[RLMObject createOrUpdateInRealm:withValue:]`, and - their variants for the default Realm now always match the contents of an `NSArray` against properties - in the same order as they are defined in the model. - -0.96.2 Release notes (2015-10-26) -============================================================= - -Prebuilt frameworks are now built with Xcode 7.1. - -### Bugfixes - -* Fix ignoring optional properties in Swift. -* Fix CocoaPods installation on case-sensitive file systems. - -0.96.1 Release notes (2015-10-20) -============================================================= - -### Bugfixes - -* Support assigning `Results` to `List` properties via KVC. -* Honor the schema version set in the configuration in `+[RLMRealm migrateRealm:]`. -* Fix crash when using optional Int16/Int32/Int64 properties in Swift. - -0.96.0 Release notes (2015-10-14) -============================================================= - -* No functional changes since beta2. - -0.96.0-beta2 Release notes (2015-10-08) -============================================================= - -### Bugfixes - -* Add RLMOptionalBase.h to the podspec. - -0.96.0-beta Release notes (2015-10-07) -============================================================= - -### API breaking changes - -* CocoaPods v0.38 or greater is now required to install Realm and RealmSwift - as pods. - -### Enhancements - -* Functionality common to both `List` and `Results` is now declared in a - `RealmCollectionType` protocol that both types conform to. -* `Results.realm` now returns an `Optional` in order to conform to - `RealmCollectionType`, but will always return `.Some()` since a `Results` - cannot exist independently from a `Realm`. -* Aggregate operations are now available on `List`: `min`, `max`, `sum`, - `average`. -* Committing write transactions (via `commitWrite` / `commitWriteTransaction` and - `write` / `transactionWithBlock`) now optionally allow for handling errors when - the disk is out of space. -* Added `isEmpty` property on `RLMRealm`/`Realm` to indicate if it contains any - objects. -* The `@count`, `@min`, `@max`, `@sum` and `@avg` collection operators are now - supported in queries. - -### Bugfixes - -* Fix assertion failure when inserting NSData between 8MB and 16MB in size. -* Fix assertion failure when rolling back a migration which removed an object - link or `RLMArray`/`List` property. -* Add the path of the file being opened to file open errors. -* Fix a crash that could be triggered by rapidly opening and closing a Realm - many times on multiple threads at once. -* Fix several places where exception messages included the name of the wrong - function which failed. - -0.95.3 Release notes (2015-10-05) -============================================================= - -### Bugfixes - -* Compile iOS Simulator framework architectures with `-fembed-bitcode-marker`. -* Fix crashes when the first Realm opened uses a class subset and later Realms - opened do not. -* Fix inconsistent errors when `Object(value: ...)` is used to initialize the - default value of a property of an `Object` subclass. -* Throw an exception when a class subset has objects with array or object - properties of a type that are not part of the class subset. - -0.95.2 Release notes (2015-09-24) -============================================================= - -* Enable bitcode for iOS and watchOS frameworks. -* Build libraries with Xcode 7 final rather than the GM. - -0.95.1 Release notes (2015-09-23) -============================================================= - -### Enhancements - -* Add missing KVO handling for moving and exchanging objects in `RLMArray` and - `List`. - -### Bugfixes - -* Setting the primary key property on persisted `RLMObject`s / `Object`s - via subscripting or key-value coding will cause an exception to be thrown. -* Fix crash due to race condition in `RLMRealmConfiguration` where the default - configuration was in the process of being copied in one thread, while - released in another. -* Fix crash when a migration which removed an object or array property is - rolled back due to an error. - -0.95.0 Release notes (2015-08-25) -============================================================= - -### API breaking changes - -* The following APIs have been deprecated in favor of the new `RLMRealmConfiguration` class in Realm Objective-C: - -| Deprecated API | New API | -|:------------------------------------------------------------------|:---------------------------------------------------------------------------------| -| `+[RLMRealm realmWithPath:readOnly:error:]` | `+[RLMRealm realmWithConfiguration:error:]` | -| `+[RLMRealm realmWithPath:encryptionKey:readOnly:error:]` | `+[RLMRealm realmWithConfiguration:error:]` | -| `+[RLMRealm setEncryptionKey:forRealmsAtPath:]` | `-[RLMRealmConfiguration setEncryptionKey:]` | -| `+[RLMRealm inMemoryRealmWithIdentifier:]` | `+[RLMRealm realmWithConfiguration:error:]` | -| `+[RLMRealm defaultRealmPath]` | `+[RLMRealmConfiguration defaultConfiguration]` | -| `+[RLMRealm setDefaultRealmPath:]` | `+[RLMRealmConfiguration setDefaultConfiguration:]` | -| `+[RLMRealm setDefaultRealmSchemaVersion:withMigrationBlock]` | `RLMRealmConfiguration.schemaVersion` and `RLMRealmConfiguration.migrationBlock` | -| `+[RLMRealm setSchemaVersion:forRealmAtPath:withMigrationBlock:]` | `RLMRealmConfiguration.schemaVersion` and `RLMRealmConfiguration.migrationBlock` | -| `+[RLMRealm migrateRealmAtPath:]` | `+[RLMRealm migrateRealm:]` | -| `+[RLMRealm migrateRealmAtPath:encryptionKey:]` | `+[RLMRealm migrateRealm:]` | - -* The following APIs have been deprecated in favor of the new `Realm.Configuration` struct in Realm Swift for Swift 1.2: - -| Deprecated API | New API | -|:--------------------------------------------------------------|:-----------------------------------------------------------------------------| -| `Realm.defaultPath` | `Realm.Configuration.defaultConfiguration` | -| `Realm(path:readOnly:encryptionKey:error:)` | `Realm(configuration:error:)` | -| `Realm(inMemoryIdentifier:)` | `Realm(configuration:error:)` | -| `Realm.setEncryptionKey(:forPath:)` | `Realm(configuration:error:)` | -| `setDefaultRealmSchemaVersion(schemaVersion:migrationBlock:)` | `Realm.Configuration.schemaVersion` and `Realm.Configuration.migrationBlock` | -| `setSchemaVersion(schemaVersion:realmPath:migrationBlock:)` | `Realm.Configuration.schemaVersion` and `Realm.Configuration.migrationBlock` | -| `migrateRealm(path:encryptionKey:)` | `migrateRealm(configuration:)` | - -* The following APIs have been deprecated in favor of the new `Realm.Configuration` struct in Realm Swift for Swift 2.0: - -| Deprecated API | New API | -|:--------------------------------------------------------------|:-----------------------------------------------------------------------------| -| `Realm.defaultPath` | `Realm.Configuration.defaultConfiguration` | -| `Realm(path:readOnly:encryptionKey:) throws` | `Realm(configuration:) throws` | -| `Realm(inMemoryIdentifier:)` | `Realm(configuration:) throws` | -| `Realm.setEncryptionKey(:forPath:)` | `Realm(configuration:) throws` | -| `setDefaultRealmSchemaVersion(schemaVersion:migrationBlock:)` | `Realm.Configuration.schemaVersion` and `Realm.Configuration.migrationBlock` | -| `setSchemaVersion(schemaVersion:realmPath:migrationBlock:)` | `Realm.Configuration.schemaVersion` and `Realm.Configuration.migrationBlock` | -| `migrateRealm(path:encryptionKey:)` | `migrateRealm(configuration:)` | - -* `List.extend` in Realm Swift for Swift 2.0 has been replaced with `List.appendContentsOf`, - mirroring changes to `RangeReplaceableCollectionType`. - -* Object properties on `Object` subclasses in Realm Swift must be marked as optional, - otherwise a runtime exception will be thrown. - -### Enhancements - -* Persisted properties of `RLMObject`/`Object` subclasses are now Key-Value - Observing compliant. -* The different options used to create Realm instances have been consolidated - into a single `RLMRealmConfiguration`/`Realm.Configuration` object. -* Enumerating Realm collections (`RLMArray`, `RLMResults`, `List<>`, - `Results<>`) now enumerates over a copy of the collection, making it no - longer an error to modify a collection during enumeration (either directly, - or indirectly by modifying objects to make them no longer match a query). -* Improve performance of object insertion in Swift to bring it roughly in line - with Objective-C. -* Allow specifying a specific list of `RLMObject` / `Object` subclasses to include - in a given Realm via `RLMRealmConfiguration.objectClasses` / `Realm.Configuration.objectTypes`. - -### Bugfixes - -* Subscripting on `RLMObject` is now marked as nullable. - -0.94.1 Release notes (2015-08-10) -============================================================= - -### API breaking changes - -* Building for watchOS requires Xcode 7 beta 5. - -### Enhancements - -* `Object.className` is now marked as `final`. - -### Bugfixes - -* Fix crash when adding a property to a model without updating the schema - version. -* Fix unnecessary redownloading of the core library when building from source. -* Fix crash when sorting by an integer or floating-point property on iOS 7. - -0.94.0 Release notes (2015-07-29) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Reduce the amount of memory used by RLMRealm notification listener threads. -* Avoid evaluating results eagerly when filtering and sorting. -* Add nullability annotations to the Objective-C API to provide enhanced compiler - warnings and bridging to Swift. -* Make `RLMResult`s and `RLMArray`s support Objective-C generics. -* Add support for building watchOS and bitcode-compatible apps. -* Make the exceptions thrown in getters and setters more informative. -* Add `-[RLMArray exchangeObjectAtIndex:withObjectAtIndex]` and `List.swap(_:_:)` - to allow exchanging the location of two objects in the given `RLMArray` / `List`. -* Added anonymous analytics on simulator/debugger runs. -* Add `-[RLMArray moveObjectAtIndex:toIndex:]` and `List.move(from:to:)` to - allow moving objects in the given `RLMArray` / `List`. - -### Bugfixes - -* Processes crashing due to an uncaught exception inside a write transaction will - no longer cause other processes using the same Realm to hang indefinitely. -* Fix incorrect results when querying for < or <= on ints that - require 64 bits to represent with a CPU that supports SSE 4.2. -* An exception will no longer be thrown when attempting to reset the schema - version or encryption key on an open Realm to the current value. -* Date properties on 32 bit devices will retain 64 bit second precision. -* Wrap calls to the block passed to `enumerate` in an autoreleasepool to reduce - memory growth when migrating a large amount of objects. -* In-memory realms no longer write to the Documents directory on iOS or - Application Support on OS X. - -0.93.2 Release notes (2015-06-12) -============================================================= - -### Bugfixes - -* Fixed an issue where the packaged OS X Realm.framework was built with - `GCC_GENERATE_TEST_COVERAGE_FILES` and `GCC_INSTRUMENT_PROGRAM_FLOW_ARCS` - enabled. -* Fix a memory leak when constructing standalone Swift objects with NSDate - properties. -* Throw an exception rather than asserting when an invalidated object is added - to an RLMArray. -* Fix a case where data loss would occur if a device was hard-powered-off - shortly after a write transaction was committed which had to expand the Realm - file. - -0.93.1 Release notes (2015-05-29) -============================================================= - -### Bugfixes - -* Objects are no longer copied into standalone objects during object creation. This fixes an issue where - nested objects with a primary key are sometimes duplicated rather than updated. -* Comparison predicates with a constant on the left of the operator and key path on the right now give - correct results. An exception is now thrown for predicates that do not yet support this ordering. -* Fix some crashes in `index_string.cpp` with int primary keys or indexed int properties. - -0.93.0 Release notes (2015-05-27) -============================================================= - -### API breaking changes - -* Schema versions are now represented as `uint64_t` (Objective-C) and `UInt64` (Swift) so that they have - the same representation on all architectures. - -### Enhancements - -* Swift: `Results` now conforms to `CVarArgType` so it can - now be passed as an argument to `Results.filter(_:...)` - and `List.filter(_:...)`. -* Swift: Made `SortDescriptor` conform to the `Equatable` and - `StringLiteralConvertible` protocols. -* Int primary keys are once again automatically indexed. -* Improve error reporting when attempting to mark a property of a type that - cannot be indexed as indexed. - -### Bugfixes - -* Swift: `RealmSwift.framework` no longer embeds `Realm.framework`, - which now allows apps using it to pass iTunes Connect validation. - -0.92.4 Release notes (2015-05-22) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Swift: Made `Object.init()` a required initializer. -* `RLMObject`, `RLMResults`, `Object` and `Results` can now be safely - deallocated (but still not used) from any thread. -* Improve performance of `-[RLMArray indexOfObjectWhere:]` and `-[RLMArray - indexOfObjectWithPredicate:]`, and implement them for standalone RLMArrays. -* Improved performance of most simple queries. - -### Bugfixes - -* The interprocess notification mechanism no longer uses dispatch worker threads, preventing it from - starving other GCD clients of the opportunity to execute blocks when dozens of Realms are open at once. - -0.92.3 Release notes (2015-05-13) -============================================================= - -### API breaking changes - -* Swift: `Results.average(_:)` now returns an optional, which is `nil` if and only if the results - set is empty. - -### Enhancements - -* Swift: Added `List.invalidated`, which returns if the given `List` is no longer - safe to be accessed, and is analogous to `-[RLMArray isInvalidated]`. -* Assertion messages are automatically logged to Crashlytics if it's loaded - into the current process to make it easier to diagnose crashes. - -### Bugfixes - -* Swift: Enumerating through a standalone `List` whose objects themselves - have list properties won't crash. -* Swift: Using a subclass of `RealmSwift.Object` in an aggregate operator of a predicate - no longer throws a spurious type error. -* Fix incorrect results for when using OR in a query on a `RLMArray`/`List<>`. -* Fix incorrect values from `[RLMResults count]`/`Results.count` when using - `!=` on an int property with no other query conditions. -* Lower the maximum doubling threshold for Realm file sizes from 128MB to 16MB - to reduce the amount of wasted space. - -0.92.2 Release notes (2015-05-08) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Exceptions raised when incorrect object types are used with predicates now contain more detailed information. -* Added `-[RLMMigration deleteDataForClassName:]` and `Migration.deleteData(_:)` - to enable cleaning up after removing object subclasses - -### Bugfixes - -* Prevent debugging of an application using an encrypted Realm to work around - frequent LLDB hangs. Until the underlying issue is addressed you may set - REALM_DISABLE_ENCRYPTION=YES in your application's environment variables to - have requests to open an encrypted Realm treated as a request for an - unencrypted Realm. -* Linked objects are properly updated in `createOrUpdateInRealm:withValue:`. -* List properties on Objects are now properly initialized during fast enumeration. - -0.92.1 Release notes (2015-05-06) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* `-[RLMRealm inWriteTransaction]` is now public. -* Realm Swift is now available on CoocaPods. - -### Bugfixes - -* Force code re-signing after stripping architectures in `strip-frameworks.sh`. - -0.92.0 Release notes (2015-05-05) -============================================================= - -### API breaking changes - -* Migration blocks are no longer called when a Realm file is first created. -* The following APIs have been deprecated in favor of newer method names: - -| Deprecated API | New API | -|:-------------------------------------------------------|:------------------------------------------------------| -| `-[RLMMigration createObject:withObject:]` | `-[RLMMigration createObject:withValue:]` | -| `-[RLMObject initWithObject:]` | `-[RLMObject initWithValue:]` | -| `+[RLMObject createInDefaultRealmWithObject:]` | `+[RLMObject createInDefaultRealmWithValue:]` | -| `+[RLMObject createInRealm:withObject:]` | `+[RLMObject createInRealm:withValue:]` | -| `+[RLMObject createOrUpdateInDefaultRealmWithObject:]` | `+[RLMObject createOrUpdateInDefaultRealmWithValue:]` | -| `+[RLMObject createOrUpdateInRealm:withObject:]` | `+[RLMObject createOrUpdateInRealm:withValue:]` | - -### Enhancements - -* `Int8` properties defined in Swift are now treated as integers, rather than - booleans. -* NSPredicates created using `+predicateWithValue:` are now supported. - -### Bugfixes - -* Compound AND predicates with no subpredicates now correctly match all objects. - -0.91.5 Release notes (2015-04-28) -============================================================= - -### Bugfixes - -* Fix issues with removing search indexes and re-enable it. - -0.91.4 Release notes (2015-04-27) -============================================================= - -### Bugfixes - -* Temporarily disable removing indexes from existing columns due to bugs. - -0.91.3 Release notes (2015-04-17) -============================================================= - -### Bugfixes - -* Fix `Extra argument 'objectClassName' in call` errors when building via - CocoaPods. - -0.91.2 Release notes (2015-04-16) -============================================================= - -* Migration blocks are no longer called when a Realm file is first created. - -### Enhancements - -* `RLMCollection` supports collection KVC operations. -* Sorting `RLMResults` is 2-5x faster (typically closer to 2x). -* Refreshing `RLMRealm` after a write transaction which inserts or modifies - strings or `NSData` is committed on another thread is significantly faster. -* Indexes are now added and removed from existing properties when a Realm file - is opened, rather than only when properties are first added. - -### Bugfixes - -* `+[RLMSchema dynamicSchemaForRealm:]` now respects search indexes. -* `+[RLMProperty isEqualToProperty:]` now checks for equal `indexed` properties. - -0.91.1 Release notes (2015-03-12) -============================================================= - -### Enhancements - -* The browser will automatically refresh when the Realm has been modified - from another process. -* Allow using Realm in an embedded framework by setting - `APPLICATION_EXTENSION_API_ONLY` to YES. - -### Bugfixes - -* Fix a crash in CFRunLoopSourceInvalidate. - -0.91.0 Release notes (2015-03-10) -============================================================= - -### API breaking changes - -* `attributesForProperty:` has been removed from `RLMObject`. You now specify indexed - properties by implementing the `indexedProperties` method. -* An exception will be thrown when calling `setEncryptionKey:forRealmsAtPath:`, - `setSchemaVersion:forRealmAtPath:withMigrationBlock:`, and `migrateRealmAtPath:` - when a Realm at the given path is already open. -* Object and array properties of type `RLMObject` will no longer be allowed. - -### Enhancements - -* Add support for sharing Realm files between processes. -* The browser will no longer show objects that have no persisted properties. -* `RLMSchema`, `RLMObjectSchema`, and `RLMProperty` now have more useful descriptions. -* Opening an encrypted Realm while a debugger is attached to the process no - longer throws an exception. -* `RLMArray` now exposes an `isInvalidated` property to indicate if it can no - longer be accessed. - -### Bugfixes - -* An exception will now be thrown when calling `-beginWriteTransaction` from within a notification - triggered by calling `-beginWriteTransaction` elsewhere. -* When calling `delete:` we now verify that the object being deleted is persisted in the target Realm. -* Fix crash when calling `createOrUpdate:inRealm` with nested linked objects. -* Use the key from `+[RLMRealm setEncryptionKey:forRealmsAtPath:]` in - `-writeCopyToPath:error:` and `+migrateRealmAtPath:`. -* Comparing an RLMObject to a non-RLMObject using `-[RLMObject isEqual:]` or - `-isEqualToObject:` now returns NO instead of crashing. -* Improved error message when an `RLMObject` subclass is defined nested within - another Swift declaration. -* Fix crash when the process is terminated by the OS on iOS while encrypted realms are open. -* Fix crash after large commits to encrypted realms. - -0.90.6 Release notes (2015-02-20) -============================================================= - -### Enhancements - -* Improve compatibility of encrypted Realms with third-party crash reporters. - -### Bugfixes - -* Fix incorrect results when using aggregate functions on sorted RLMResults. -* Fix data corruption when using writeCopyToPath:encryptionKey:. -* Maybe fix some assertion failures. - -0.90.5 Release notes (2015-02-04) -============================================================= - -### Bugfixes - -* Fix for crashes when encryption is enabled on 64-bit iOS devices. - -0.90.4 Release notes (2015-01-29) -============================================================= - -### Bugfixes - -* Fix bug that resulted in columns being dropped and recreated during migrations. - -0.90.3 Release notes (2015-01-27) -============================================================= - -### Enhancements - -* Calling `createInDefaultRealmWithObject:`, `createInRealm:withObject:`, - `createOrUpdateInDefaultRealmWithObject:` or `createOrUpdateInRealm:withObject:` - is a no-op if the argument is an RLMObject of the same type as the receiver - and is already backed by the target realm. - -### Bugfixes - -* Fix incorrect column type assertions when the first Realm file opened is a - read-only file that is missing tables. -* Throw an exception when adding an invalidated or deleted object as a link. -* Throw an exception when calling `createOrUpdateInRealm:withObject:` when the - receiver has no primary key defined. - -0.90.1 Release notes (2015-01-22) -============================================================= - -### Bugfixes - -* Fix for RLMObject being treated as a model object class and showing up in the browser. -* Fix compilation from the podspec. -* Fix for crash when calling `objectsWhere:` with grouping in the query on `allObjects`. - -0.90.0 Release notes (2015-01-21) -============================================================= - -### API breaking changes - -* Rename `-[RLMRealm encryptedRealmWithPath:key:readOnly:error:]` to - `-[RLMRealm realmWithPath:encryptionKey:readOnly:error:]`. -* `-[RLMRealm setSchemaVersion:withMigrationBlock]` is no longer global and must be called - for each individual Realm path used. You can now call `-[RLMRealm setDefaultRealmSchemaVersion:withMigrationBlock]` - for the default Realm and `-[RLMRealm setSchemaVersion:forRealmAtPath:withMigrationBlock:]` for all others; - -### Enhancements - -* Add `-[RLMRealm writeCopyToPath:encryptionKey:error:]`. -* Add support for comparing string columns to other string columns in queries. - -### Bugfixes - -* Roll back changes made when an exception is thrown during a migration. -* Throw an exception if the number of items in a RLMResults or RLMArray changes - while it's being fast-enumerated. -* Also encrypt the temporary files used when encryption is enabled for a Realm. -* Fixed crash in JSONImport example on OS X with non-en_US locale. -* Fixed infinite loop when opening a Realm file in the Browser at the same time - as it is open in a 32-bit simulator. -* Fixed a crash when adding primary keys to older realm files with no primary - keys on any objects. -* Fixed a crash when removing a primary key in a migration. -* Fixed a crash when multiple write transactions with no changes followed by a - write transaction with changes were committed without the main thread - RLMRealm getting a chance to refresh. -* Fixed incomplete results when querying for non-null relationships. -* Improve the error message when a Realm file is opened in multiple processes - at once. - -0.89.2 Release notes (2015-01-02) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix an assertion failure when invalidating a Realm which is in a write - transaction, has already been invalidated, or has never been used. -* Fix an assertion failure when sorting an empty RLMArray property. -* Fix a bug resulting in the browser never becoming visible on 10.9. -* Write UTF-8 when generating class files from a realm file in the Browser. - -0.89.1 Release notes (2014-12-22) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Improve the error message when a Realm can't be opened due to lacking write - permissions. - -### Bugfixes - -* Fix an assertion failure when inserting rows after calling `deleteAllObjects` - on a Realm. -* Separate dynamic frameworks are now built for the simulator and devices to - work around App Store submission errors due to the simulator version not - being automatically stripped from dynamic libraries. - -0.89.0 Release notes (2014-12-18) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Add support for encrypting Realm files on disk. -* Support using KVC-compliant objects without getters or with custom getter - names to initialize RLMObjects with `createObjectInRealm` and friends. - -### Bugfixes - -* Merge native Swift default property values with defaultPropertyValues(). -* Don't leave the database schema partially updated when opening a realm fails - due to a migration being needed. -* Fixed issue where objects with custom getter names couldn't be used to - initialize other objects. -* Fix a major performance regression on queries on string properties. -* Fix a memory leak when circularly linked objects are added to a Realm. - -0.88.0 Release notes (2014-12-02) -============================================================= - -### API breaking changes - -* Deallocating an RLMRealm instance in a write transaction lacking an explicit - commit/cancel will now be automatically cancelled instead of committed. -* `-[RLMObject isDeletedFromRealm]` has been renamed to `-[RLMObject isInvalidated]`. - -### Enhancements - -* Add `-[RLMRealm writeCopyToPath:]` to write a compacted copy of the Realm - another file. -* Add support for case insensitive, BEGINSWITH, ENDSWITH and CONTAINS string - queries on array properties. -* Make fast enumeration of `RLMArray` and `RLMResults` ~30% faster and - `objectAtIndex:` ~55% faster. -* Added a lldb visualizer script for displaying the contents of persisted - RLMObjects when debugging. -* Added method `-setDefaultRealmPath:` to change the default Realm path. -* Add `-[RLMRealm invalidate]` to release data locked by the current thread. - -### Bugfixes - -* Fix for crash when running many simultaneous write transactions on background threads. -* Fix for crashes caused by opening Realms at multiple paths simultaneously which have had - properties re-ordered during migration. -* Don't run the query twice when `firstObject` or `lastObject` are called on an - `RLMResults` which has not had its results accessed already. -* Fix for bug where schema version is 0 for new Realm created at the latest version. -* Fix for error message where no migration block is specified when required. - -0.87.4 Release notes (2014-11-07) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix browser location in release zip. - -0.87.3 Release notes (2014-11-06) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Added method `-linkingObjectsOfClass:forProperty:` to RLMObject to expose inverse - relationships/backlinks. - -### Bugfixes - -* Fix for crash due to missing search index when migrating an object with a string primary key - in a database created using an older versions (0.86.3 and earlier). -* Throw an exception when passing an array containing a - non-RLMObject to -[RLMRealm addObjects:]. -* Fix for crash when deleting an object from multiple threads. - -0.87.0 Release notes (2014-10-21) -============================================================= - -### API breaking changes - -* RLMArray has been split into two classes, `RLMArray` and `RLMResults`. RLMArray is - used for object properties as in previous releases. Moving forward all methods used to - enumerate, query, and sort objects return an instance of a new class `RLMResults`. This - change was made to support diverging apis and the future addition of change notifications - for queries. -* The api for migrations has changed. You now call `setSchemaVersion:withMigrationBlock:` to - register a global migration block and associated version. This block is applied to Realms as - needed when opened for Realms at a previous version. The block can be applied manually if - desired by calling `migrateRealmAtPath:`. -* `arraySortedByProperty:ascending:` was renamed to `sortedResultsUsingProperty:ascending` -* `addObjectsFromArray:` on both `RLMRealm` and `RLMArray` has been renamed to `addObjects:` - and now accepts any container class which implements `NSFastEnumeration` -* Building with Swift support now requires Xcode 6.1 - -### Enhancements - -* Add support for sorting `RLMArray`s by multiple columns with `sortedResultsUsingDescriptors:` -* Added method `deleteAllObjects` on `RLMRealm` to clear a Realm. -* Added method `createObject:withObject:` on `RLMMigration` which allows object creation during migrations. -* Added method `deleteObject:` on `RLMMigration` which allows object deletion during migrations. -* Updating to core library version 0.85.0. -* Implement `objectsWhere:` and `objectsWithPredicate:` for array properties. -* Add `cancelWriteTransaction` to revert all changes made in a write transaction and end the transaction. -* Make creating `RLMRealm` instances on background threads when an instance - exists on another thread take a fifth of the time. -* Support for partial updates when calling `createOrUpdateWithObject:` and `addOrUpdateObject:` -* Re-enable Swift support on OS X - -### Bugfixes - -* Fix exceptions when trying to set `RLMObject` properties after rearranging - the properties in a `RLMObject` subclass. -* Fix crash on IN query with several thousand items. -* Fix crash when querying indexed `NSString` properties. -* Fixed an issue which prevented in-memory Realms from being used accross multiple threads. -* Preserve the sort order when querying a sorted `RLMResults`. -* Fixed an issue with migrations where if a Realm file is deleted after a Realm is initialized, - the newly created Realm can be initialized with an incorrect schema version. -* Fix crash in `RLMSuperSet` when assigning to a `RLMArray` property on a standalone object. -* Add an error message when the protocol for an `RLMArray` property is not a - valid object type. -* Add an error message when an `RLMObject` subclass is defined nested within - another Swift class. - -0.86.3 Release notes (2014-10-09) -============================================================= - -### Enhancements - -* Add support for != in queries on object relationships. - -### Bugfixes - -* Re-adding an object to its Realm no longer throws an exception and is now a no-op - (as it was previously). -* Fix another bug which would sometimes result in subclassing RLMObject - subclasses not working. - -0.86.2 Release notes (2014-10-06) -============================================================= - -### Bugfixes - -* Fixed issues with packaging "Realm Browser.app" for release. - -0.86.1 Release notes (2014-10-03) -============================================================= - -### Bugfixes - -* Fix a bug which would sometimes result in subclassing RLMObject subclasses - not working. - -0.86.0 Release notes (2014-10-03) -============================================================= - -### API breaking changes - -* Xcode 6 is now supported from the main Xcode project `Realm.xcodeproj`. - Xcode 5 is no longer supported. - -### Enhancements - -* Support subclassing RLMObject models. Although you can now persist subclasses, - polymorphic behavior is not supported (i.e. setting a property to an - instance of its subclass). -* Add support for sorting RLMArray properties. -* Speed up inserting objects with `addObject:` by ~20%. -* `readonly` properties are automatically ignored rather than having to be - added to `ignoredProperties`. -* Updating to core library version 0.83.1. -* Return "[deleted object]" rather than throwing an exception when - `-description` is called on a deleted RLMObject. -* Significantly improve performance of very large queries. -* Allow passing any enumerable to IN clauses rather than just NSArray. -* Add `objectForPrimaryKey:` and `objectInRealm:forPrimaryKey:` convenience - methods to fetch an object by primary key. - -### Bugfixes - -* Fix error about not being able to persist property 'hash' with incompatible - type when building for devices with Xcode 6. -* Fix spurious notifications of new versions of Realm. -* Fix for updating nested objects where some types do not have primary keys. -* Fix for inserting objects from JSON with NSNull values when default values - should be used. -* Trying to add a persisted RLMObject to a different Realm now throws an - exception rather than creating an uninitialized object. -* Fix validation errors when using IN on array properties. -* Fix errors when an IN clause has zero items. -* Fix for chained queries ignoring all but the last query's conditions. - -0.85.0 Release notes (2014-09-15) -============================================================= - -### API breaking changes - -* Notifications for a refresh being needed (when autorefresh is off) now send - the notification type RLMRealmRefreshRequiredNotification rather than - RLMRealmDidChangeNotification. - -### Enhancements - -* Updating to core library version 0.83.0. -* Support for primary key properties (for int and string columns). Declaring a property - to be the primary key ensures uniqueness for that property for all objects of a given type. - At the moment indexes on primary keys are not yet supported but this will be added in a future - release. -* Added methods to update or insert (upsert) for objects with primary keys defined. -* `[RLMObject initWithObject:]` and `[RLMObject createInRealmWithObject:]` now support - any object type with kvc properties. -* The Swift support has been reworked to work around Swift not being supported - in Frameworks on iOS 7. -* Improve performance when getting the count of items matching a query but not - reading any of the objects in the results. -* Add a return value to `-[RLMRealm refresh]` that indicates whether or not - there was anything to refresh. -* Add the class name to the error message when an RLMObject is missing a value - for a property without a default. -* Add support for opening Realms in read-only mode. -* Add an automatic check for updates when using Realm in a simulator (the - checker code is not compiled into device builds). This can be disabled by - setting the REALM_DISABLE_UPDATE_CHECKER environment variable to any value. -* Add support for Int16 and Int64 properties in Swift classes. - -### Bugfixes - -* Realm change notifications when beginning a write transaction are now sent - after updating rather than before, to match refresh. -* `-isEqual:` now uses the default `NSObject` implementation unless a primary key - is specified for an RLMObject. When a primary key is specified, `-isEqual:` calls - `-isEqualToObject:` and a corresponding implementation for `-hash` is also implemented. - -0.84.0 Release notes (2014-08-28) -============================================================= - -### API breaking changes - -* The timer used to trigger notifications has been removed. Notifications are now - only triggered by commits made in other threads, and can not currently be triggered - by changes made by other processes. Interprocess notifications will be re-added in - a future commit with an improved design. - -### Enhancements - -* Updating to core library version 0.82.2. -* Add property `deletedFromRealm` to RLMObject to indicate objects which have been deleted. -* Add support for the IN operator in predicates. -* Add support for the BETWEEN operator in link queries. -* Add support for multi-level link queries in predicates (e.g. `foo.bar.baz = 5`). -* Switch to building the SDK from source when using CocoaPods and add a - Realm.Headers subspec for use in targets that should not link a copy of Realm - (such as test targets). -* Allow unregistering from change notifications in the change notification - handler block. -* Significant performance improvements when holding onto large numbers of RLMObjects. -* Realm-Xcode6.xcodeproj now only builds using Xcode6-Beta6. -* Improved performance during RLMArray iteration, especially when mutating - contained objects. - -### Bugfixes - -* Fix crashes and assorted bugs when sorting or querying a RLMArray returned - from a query. -* Notifications are no longer sent when initializing new RLMRealm instances on background - threads. -* Handle object cycles in -[RLMObject description] and -[RLMArray description]. -* Lowered the deployment target for the Xcode 6 projects and Swift examples to - iOS 7.0, as they didn't actually require 8.0. -* Support setting model properties starting with the letter 'z' -* Fixed crashes that could result from switching between Debug and Relase - builds of Realm. - -0.83.0 Release notes (2014-08-13) -============================================================= - -### API breaking changes - -* Realm-Xcode6.xcodeproj now only builds using Xcode6-Beta5. -* Properties to be persisted in Swift classes must be explicitly declared as `dynamic`. -* Subclasses of RLMObject subclasses now throw an exception on startup, rather - than when added to a Realm. - -### Enhancements - -* Add support for querying for nil object properties. -* Improve error message when specifying invalid literals when creating or - initializing RLMObjects. -* Throw an exception when an RLMObject is used from the incorrect thread rather - than crashing in confusing ways. -* Speed up RLMRealm instantiation and array property iteration. -* Allow array and objection relation properties to be missing or null when - creating a RLMObject from a NSDictionary. - -### Bugfixes - -* Fixed a memory leak when querying for objects. -* Fixed initializing array properties on standalone Swift RLMObject subclasses. -* Fix for queries on 64bit integers. - -0.82.0 Release notes (2014-08-05) -============================================================= - -### API breaking changes - -* Realm-Xcode6.xcodeproj now only builds using Xcode6-Beta4. - -### Enhancements - -* Updating to core library version 0.80.5. -* Now support disabling the `autorefresh` property on RLMRealm instances. -* Building Realm-Xcode6 for iOS now builds a universal framework for Simulator & Device. -* Using NSNumber properties (unsupported) now throws a more informative exception. -* Added `[RLMRealm defaultRealmPath]` -* Proper implementation for [RLMArray indexOfObjectWhere:] -* The default Realm path on OS X is now ~/Library/Application Support/[bundle - identifier]/default.realm rather than ~/Documents -* We now check that the correct framework (ios or osx) is used at compile time. - -### Bugfixes - -* Fixed rapid growth of the realm file size. -* Fixed a bug which could cause a crash during RLMArray destruction after a query. -* Fixed bug related to querying on float properties: `floatProperty = 1.7` now works. -* Fixed potential bug related to the handling of array properties (RLMArray). -* Fixed bug where array properties accessed the wrong property. -* Fixed bug that prevented objects with custom getters to be added to a Realm. -* Fixed a bug where initializing a standalone object with an array literal would - trigger an exception. -* Clarified exception messages when using unsupported NSPredicate operators. -* Clarified exception messages when using unsupported property types on RLMObject subclasses. -* Fixed a memory leak when breaking out of a for-in loop on RLMArray. -* Fixed a memory leak when removing objects from a RLMArray property. -* Fixed a memory leak when querying for objects. - - -0.81.0 Release notes (2014-07-22) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Updating to core library version 0.80.3. -* Added support for basic querying of RLMObject and RLMArray properties (one-to-one and one-to-many relationships). - e.g. `[Person objectsWhere:@"dog.name == 'Alfonso'"]` or `[Person objectsWhere:@"ANY dogs.name == 'Alfonso'"]` - Supports all normal operators for numeric and date types. Does not support NSData properties or `BEGINSWITH`, `ENDSWITH`, `CONTAINS` - and other options for string properties. -* Added support for querying for object equality in RLMObject and RLMArray properties (one-to-one and one-to-many relationships). - e.g. `[Person objectsWhere:@"dog == %@", myDog]` `[Person objectsWhere:@"ANY dogs == %@", myDog]` `[Person objectsWhere:@"ANY friends.dog == %@", dog]` - Only supports comparing objects for equality (i.e. ==) -* Added a helper method to RLMRealm to perform a block inside a transaction. -* OSX framework now supported in CocoaPods. - -### Bugfixes - -* Fixed Unicode support in property names and string contents (Chinese, Russian, etc.). Closing #612 and #604. -* Fixed bugs related to migration when properties are removed. -* Fixed keyed subscripting for standalone RLMObjects. -* Fixed bug related to double clicking on a .realm file to launch the Realm Browser (thanks to Dean Moore). - - -0.80.0 Release notes (2014-07-15) -============================================================= - -### API breaking changes - -* Rename migration methods to -migrateDefaultRealmWithBlock: and -migrateRealmAtPath:withBlock: -* Moved Realm specific query methods from RLMRealm to class methods on RLMObject (-allObjects: to +allObjectsInRealm: ect.) - -### Enhancements - -* Added +createInDefaultRealmWithObject: method to RLMObject. -* Added support for array and object literals when calling -createWithObject: and -initWithObject: variants. -* Added method -deleteObjects: to batch delete objects from a Realm -* Support for defining RLMObject models entirely in Swift (experimental, see known issues). -* RLMArrays in Swift support Sequence-style enumeration (for obj in array). -* Implemented -indexOfObject: for RLMArray - -### Known Issues for Swift-defined models - -* Properties other than String, NSData and NSDate require a default value in the model. This can be an empty (but typed) array for array properties. -* The previous caveat also implies that not all models defined in Objective-C can be used for object properties. Only Objective-C models with only implicit (i.e. primitives) or explicit default values can be used. However, any Objective-C model object can be used in a Swift array property. -* Array property accessors don't work until its parent object has been added to a realm. -* Realm-Bridging-Header.h is temporarily exposed as a public header. This is temporary and will be private again once rdar://17633863 is fixed. -* Does not leverage Swift generics and still uses RLM-prefix everywhere. This is coming in #549. - - -0.22.0 Release notes -============================================================= - -### API breaking changes - -* Rename schemaForObject: to schemaForClassName: on RLMSchema -* Removed -objects:where: and -objects:orderedBy:where: from RLMRealm -* Removed -indexOfObjectWhere:, -objectsWhere: and -objectsOrderedBy:where: from RLMArray -* Removed +objectsWhere: and +objectsOrderedBy:where: from RLMObject - -### Enhancements - -* New Xcode 6 project for experimental swift support. -* New Realm Editor app for reading and editing Realm db files. -* Added support for migrations. -* Added support for RLMArray properties on objects. -* Added support for creating in-memory default Realm. -* Added -objectsWithClassName:predicateFormat: and -objectsWithClassName:predicate: to RLMRealm -* Added -indexOfObjectWithPredicateFormat:, -indexOfObjectWithPredicate:, -objectsWithPredicateFormat:, -objectsWithPredi -* Added +objectsWithPredicateFormat: and +objectsWithPredicate: to RLMObject -* Now allows predicates comparing two object properties of the same type. - - -0.20.0 Release notes (2014-05-28) -============================================================= - -Completely rewritten to be much more object oriented. - -### API breaking changes - -* Everything - -### Enhancements - -* None. - -### Bugfixes - -* None. - - -0.11.0 Release notes (not released) -============================================================= - -The Objective-C API has been updated and your code will break! - -### API breaking changes - -* `RLMTable` objects can only be created with an `RLMRealm` object. -* Renamed `RLMContext` to `RLMTransactionManager` -* Renamed `RLMContextDidChangeNotification` to `RLMRealmDidChangeNotification` -* Renamed `contextWithDefaultPersistence` to `managerForDefaultRealm` -* Renamed `contextPersistedAtPath:` to `managerForRealmWithPath:` -* Renamed `realmWithDefaultPersistence` to `defaultRealm` -* Renamed `realmWithDefaultPersistenceAndInitBlock` to `defaultRealmWithInitBlock` -* Renamed `find:` to `firstWhere:` -* Renamed `where:` to `allWhere:` -* Renamed `where:orderBy:` to `allWhere:orderBy:` - -### Enhancements - -* Added `countWhere:` on `RLMTable` -* Added `sumOfColumn:where:` on `RLMTable` -* Added `averageOfColumn:where:` on `RLMTable` -* Added `minOfProperty:where:` on `RLMTable` -* Added `maxOfProperty:where:` on `RLMTable` -* Added `toJSONString` on `RLMRealm`, `RLMTable` and `RLMView` -* Added support for `NOT` operator in predicates -* Added support for default values -* Added validation support in `createInRealm:withObject:` - -### Bugfixes - -* None. - - -0.10.0 Release notes (2014-04-23) -============================================================= - -TightDB is now Realm! The Objective-C API has been updated -and your code will break! - -### API breaking changes - -* All references to TightDB have been changed to Realm. -* All prefixes changed from `TDB` to `RLM`. -* `TDBTransaction` and `TDBSmartContext` have merged into `RLMRealm`. -* Write transactions now take an optional rollback parameter (rather than needing to return a boolean). -* `addColumnWithName:` and variant methods now return the index of the newly created column if successful, `NSNotFound` otherwise. - -### Enhancements - -* `createTableWithName:columns:` has been added to `RLMRealm`. -* Added keyed subscripting for RLMTable's first column if column is of type RLMPropertyTypeString. -* `setRow:atIndex:` has been added to `RLMTable`. -* `RLMRealm` constructors now have variants that take an writable initialization block -* New object interface - tables created/retrieved using `tableWithName:objectClass:` return custom objects - -### Bugfixes - -* None. - - -0.6.0 Release notes (2014-04-11) -============================================================= - -### API breaking changes - -* `contextWithPersistenceToFile:error:` renamed to `contextPersistedAtPath:error:` in `TDBContext` -* `readWithBlock:` renamed to `readUsingBlock:` in `TDBContext` -* `writeWithBlock:error:` renamed to `writeUsingBlock:error:` in `TDBContext` -* `readTable:withBlock:` renamed to `readTable:usingBlock:` in `TDBContext` -* `writeTable:withBlock:error:` renamed to `writeTable:usingBlock:error:` in `TDBContext` -* `findFirstRow` renamed to `indexOfFirstMatchingRow` on `TDBQuery`. -* `findFirstRowFromIndex:` renamed to `indexOfFirstMatchingRowFromIndex:` on `TDBQuery`. -* Return `NSNotFound` instead of -1 when appropriate. -* Renamed `castClass` to `castToTytpedTableClass` on `TDBTable`. -* `removeAllRows`, `removeRowAtIndex`, `removeLastRow`, `addRow` and `insertRow` methods - on table now return void instead of BOOL. - -### Enhancements -* A `TDBTable` can now be queried using `where:` and `where:orderBy:` taking - `NSPredicate` and `NSSortDescriptor` as arguments. -* Added `find:` method on `TDBTable` to find first row matching predicate. -* `contextWithDefaultPersistence` class method added to `TDBContext`. Will create a context persisted - to a file in app/documents folder. -* `renameColumnWithIndex:to:` has been added to `TDBTable`. -* `distinctValuesInColumnWithIndex` has been added to `TDBTable`. -* `dateIsBetween::`, `doubleIsBetween::`, `floatIsBetween::` and `intIsBetween::` - have been added to `TDBQuery`. -* Column names in Typed Tables can begin with non-capital letters too. The generated `addX` - selector can look odd. For example, a table with one column with name `age`, - appending a new row will look like `[table addage:7]`. -* Mixed typed values are better validated when rows are added, inserted, - or modified as object literals. -* `addRow`, `insertRow`, and row updates can be done using objects - derived from `NSObject`. -* `where` has been added to `TDBView`and `TDBViewProtocol`. -* Adding support for "smart" contexts (`TDBSmartContext`). - -### Bugfixes - -* Modifications of a `TDBView` and `TDBQuery` now throw an exception in a readtransaction. - - -0.5.0 Release notes (2014-04-02) -============================================================= - -The Objective-C API has been updated and your code will break! -Of notable changes a fast interface has been added. -This interface includes specific methods to get and set values into Tightdb. -To use these methods import ``. - -### API breaking changes - -* `getTableWithName:` renamed to `tableWithName:` in `TDBTransaction`. -* `addColumnWithName:andType:` renamed to `addColumnWithName:type:` in `TDBTable`. -* `columnTypeOfColumn:` renamed to `columnTypeOfColumnWithIndex` in `TDBTable`. -* `columnNameOfColumn:` renamed to `nameOfColumnWithIndex:` in `TDBTable`. -* `addColumnWithName:andType:` renamed to `addColumnWithName:type:` in `TDBDescriptor`. -* Fast getters and setters moved from `TDBRow.h` to `TDBRowFast.h`. - -### Enhancements - -* Added `minDateInColumnWithIndex` and `maxDateInColumnWithIndex` to `TDBQuery`. -* Transactions can now be started directly on named tables. -* You can create dynamic tables with initial schema. -* `TDBTable` and `TDBView` now have a shared protocol so they can easier be used interchangeably. - -### Bugfixes - -* Fixed bug in 64 bit iOS when inserting BOOL as NSNumber. - - -0.4.0 Release notes (2014-03-26) -============================================================= - -### API breaking changes - -* Typed interface Cursor has now been renamed to Row. -* TDBGroup has been renamed to TDBTransaction. -* Header files are renamed so names match class names. -* Underscore (_) removed from generated typed table classes. -* TDBBinary has been removed; use NSData instead. -* Underscope (_) removed from generated typed table classes. -* Constructor for TDBContext has been renamed to contextWithPersistenceToFile: -* Table findFirstRow and min/max/sum/avg operations has been hidden. -* Table.appendRow has been renamed to addRow. -* getOrCreateTable on Transaction has been removed. -* set*:inColumnWithIndex:atRowIndex: methods have been prefixed with TDB -* *:inColumnWithIndex:atRowIndex: methods have been prefixed with TDB -* addEmptyRow on table has been removed. Use [table addRow:nil] instead. -* TDBMixed removed. Use id and NSObject instead. -* insertEmptyRow has been removed from table. Use insertRow:nil atIndex:index instead. - -#### Enhancements - -* Added firstRow, lastRow selectors on view. -* firstRow and lastRow on table now return nil if table is empty. -* getTableWithName selector added on group. -* getting and creating table methods on group no longer take error argument. -* [TDBQuery parent] and [TDBQuery subtable:] selectors now return self. -* createTable method added on Transaction. Throws exception if table with same name already exists. -* Experimental support for pinning transactions on Context. -* TDBView now has support for object subscripting. - -### Bugfixes - -* None. - - -0.3.0 Release notes (2014-03-14) -============================================================= - -The Objective-C API has been updated and your code will break! - -### API breaking changes - -* Most selectors have been renamed in the binding! -* Prepend TDB-prefix on all classes and types. - -### Enhancements - -* Return types and parameters changed from size_t to NSUInteger. -* Adding setObject to TightdbTable (t[2] = @[@1, @"Hello"] is possible). -* Adding insertRow to TightdbTable. -* Extending appendRow to accept NSDictionary. - -### Bugfixes - -* None. - - -0.2.0 Release notes (2014-03-07) -============================================================= - -The Objective-C API has been updated and your code will break! - -### API breaking changes - -* addRow renamed to addEmptyRow - -### Enhancements - -* Adding a simple class for version numbering. -* Adding get-version and set-version targets to build.sh. -* tableview now supports sort on column with column type bool, date and int -* tableview has method for checking the column type of a specified column -* tableview has method for getting the number of columns -* Adding methods getVersion, getCoreVersion and isAtLeast. -* Adding appendRow to TightdbTable. -* Adding object subscripting. -* Adding method removeColumn on table. - -### Bugfixes - -* None. diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Resources/Info.plist b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Resources/Info.plist deleted file mode 100644 index 17afd5bea..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Resources/Info.plist +++ /dev/null @@ -1,55 +0,0 @@ - - - - - BuildMachineOSBuild - 22G91 - CFBundleDevelopmentRegion - English - CFBundleExecutable - Realm - CFBundleIdentifier - io.Realm.Realm - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - Realm - CFBundlePackageType - FMWK - CFBundleShortVersionString - 10.42.3 - CFBundleSignature - ???? - CFBundleSupportedPlatforms - - MacOSX - - CFBundleVersion - 10.42.3 - DTCompiler - com.apple.compilers.llvm.clang.1_0 - DTPlatformBuild - - DTPlatformName - macosx - DTPlatformVersion - 14.0 - DTSDKBuild - 23A5326c - DTSDKName - macosx14.0 - DTXcode - 1500 - DTXcodeBuild - 15A5229h - LSMinimumSystemVersion - 10.15 - NSHumanReadableCopyright - Copyright © 2014-2021 Realm. All rights reserved. - UIDeviceFamily - - 2 - 6 - - - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Resources/LICENSE b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Resources/LICENSE deleted file mode 100644 index 66a27ec5f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/A/Resources/LICENSE +++ /dev/null @@ -1,177 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/Current b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/Current deleted file mode 120000 index 8c7e5a667..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-maccatalyst/Realm.framework/Versions/Current +++ /dev/null @@ -1 +0,0 @@ -A \ No newline at end of file diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/CHANGELOG.md b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/CHANGELOG.md deleted file mode 100644 index 00cc01244..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/CHANGELOG.md +++ /dev/null @@ -1,9539 +0,0 @@ -10.42.3 Release notes (2023-09-18) -============================================================= - -### Enhancements - -* Update packaging for the Xcode 15.0 release. Carthage release and obj-c - binaries are now built with Xcode 15. - -### Fixed - -* The prebuilt Realm.xcframework for SPM was packaged incorrectly and did not - work ([#8361](https://github.com/realm/realm-swift/issues/8361), since v10.42.1). - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 15.0.0. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15.0.0. - -10.42.2 Release notes (2023-09-13) -============================================================= - -### Enhancements - -* Add support for logging messages sent by the server. - ([Core #6476](https://github.com/realm/realm-core/pull/6476)) -* Unknown protocol errors received from the baas server will no longer cause - the application to crash if a valid error action is also received. Unknown - error actions will be treated as an ApplicationBug error action and will - cause sync to fail with an error via the sync error handler. - ([Core #6885](https://github.com/realm/realm-core/pull/6885)) -* Some sync error messages now contain more information about what went wrong. - -### Fixed - -* The `MultipleSyncAgents` exception from opening a synchronized Realm in - multiple processes at once no longer leaves the sync client in an invalid - state. ([Core #6868](https://github.com/realm/realm-core/pull/6868), since v10.36.0) -* Testing the size of a collection of links against zero would sometimes fail - (sometimes = "difficult to explain"). In particular: - ([Core #6850](https://github.com/realm/realm-core/issues/6850), since v10.41.0) -* When async writes triggered a file compaction some internal state could be - corrupted, leading to later crashes in the slab allocator. This typically - resulted in the "ref + size <= next->first" assertion failure, but other - failures were possible. Many issues reported; see [Core #6340](https://github.com/realm/realm-core/issues/6340). - (since 10.35.0) -* `Realm.Configuration.maximumNumberOfActiveVersions` now handles intermediate - versions which have been cleaned up correctly and checks the number of live - versions rather than the number of versions between the oldest live version - and current version (since 10.35.0). -* If the client disconnected between uploading a change to flexible sync - subscriptions and receiving the new object data from the server resulting - from that subscription change, the next connection to the server would - sometimes result in a client reset - ([Core #6966](https://github.com/realm/realm-core/issues/6966), since v10.21.1). - -### Deprecations - -* `RLMApp` has `localAppName` and `localAppVersion` fields which never ended up - being used for anything and are now deprecated. -* `RLMSyncAuthError` has not been used since v10.0.0 and is now deprecated. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 7. - -### Internal - -* Upgraded realm-core from 13.17.1 to 13.20.1 - -10.42.1 Release notes (2023-08-28) -============================================================= - -### Fixed - -* The names of the prebuilt zips for SPM have changed to avoid having Carthage - download them instead of the intended Carthage zip - ([#8326](https://github.com/realm/realm-swift/issues/8326), since v10.42.0). -* The prebuild Realm.xcframework for SwiftPM now has all platforms other than - visionOS built with Xcode 14 to comply with app store rules - ([#8339](https://github.com/realm/realm-swift/issues/8339), since 10.42.0). -* Fix visionOS compilation with Xcode beta 7. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 7. - -10.42.0 Release notes (2023-07-30) -============================================================= - -### Enhancements - -* Add support for building for visionOS and add Xcode 15 binaries to the - release package. visionOS currently requires installing Realm via either - Swift Package Manager or by using a XCFramework as CocoaPods and Carthage do - not yet support it. -* Zips compatible with SPM's `.binaryTarget()` are now published as part of the - releases on Github. -* Prebuilt XCFrameworks are now built with LTO enabled. This has insignificant - performance benefits, but cuts the size of the library by ~15%. - -### Fixed - -* Fix nested properties observation on a `Projections` not notifying when there is a property change. - ([#8276](https://github.com/realm/realm-swift/issues/8276), since v10.34.0). -* Fix undefined symbol error for `UIKit` when linking Realm to a framework using SPM. - ([#8308](https://github.com/realm/realm-swift/issues/8308), since v10.41.0) -* If the app crashed at exactly the wrong time while opening a freshly - compacted Realm the file could be left in an invalid state - ([Core #6807](https://github.com/realm/realm-core/pull/6807), since v10.33.0). -* Sync progress for DOWNLOAD messages was sometimes stored incorrectly, - resulting in an extra round trip to the server. - ([Core #6827](https://github.com/realm/realm-core/issues/6827), since v10.31.0) - -### Breaking Changes - -* Legacy non-xcframework Carthage installations are no longer supported. Please - ensure you are using `--use-xcframeworks` if installing via Carthage. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 5. - -### Internal - -* Upgraded realm-core from 13.17.0 to 13.17.1 -* Release packages were being uploaded to several static.realm.io URLs which - are no longer linked to anywhere. These are no longer being updated, and - release packages are now only being uploaded to Github. - -10.41.1 Release notes (2023-07-17) -============================================================= - -### Enhancements - -* Filesystem errors now include more information in the error message. -* Sync connection and session reconnect timing/backoff logic has been reworked - and unified into a single implementation. Previously some categories of errors - would cause an hour-long wait before attempting to reconnect, while others - would use an exponential backoff strategy. All errors now result in the sync - client waiting for 1 second before retrying, doubling the wait after each - subsequent failure up to a maximum of five minutes. If the cause of the error - changes, the backoff will be reset. If the sync client voluntarily disconnects, - no backoff will be used. ([Core #6526]((https://github.com/realm/realm-core/pull/6526))) - -### Fixed - -* Removed warnings for deprecated APIs internal use. - ([#8251](https://github.com/realm/realm-swift/issues/8251), since v10.39.0) -* Fix an error during async open and client reset if properties have been added - to the schema. This fix also applies to partition-based to flexible sync - migration if async open is used. ([Core #6707](https://github.com/realm/realm-core/issues/6707), since v10.28.2) - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 4. - -### Internal - -* Upgraded realm-core from 13.15.1 to 13.17.0 -* The location where prebuilt core binaries are published has changed slightly. - If you are using `REALM_BASE_URL` to mirror the binaries, you may need to - adjust your mirroring logic. - -10.41.0 Release notes (2023-06-26) -============================================================= - -### Enhancements - -* Add support for multiplexing sync connections. When enabled (the default), a single - connection is used per sync user rather than one per synchronized Realm. This - reduces resource consumption when multiple Realms are opened and will - typically improve performance ([PR #8282](https://github.com/realm/realm-swift/pull/8282)). -* Sync timeout options can now be set on `RLMAppConfiguration` along with the - other app-wide configuration settings ([PR #8282](https://github.com/realm/realm-swift/pull/8282)). - -### Fixed - -* Import as `RLMRealm_Private.h` as a module would cause issues when using Realm as a subdependency. - ([#8164](https://github.com/realm/realm-swift/issues/8164), since 10.37.0) -* Disable setting a custom logger by default on the sync client when the sync manager is created. - This was overriding the default logger set using `RLMLogger.defaultLogger`. (since v10.39.0). - -### Breaking Changes - -* The `RLMSyncTimeouts.appConfiguration` property has been removed. This was an - unimplemented read-only property which did not make any sense on the - containing type ([PR #8282](https://github.com/realm/realm-swift/pull/8282)). - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 2. - -### Internal - -* Upgraded realm-core from 13.15.0 to 13.15.1 - -10.40.2 Release notes (2023-06-09) -============================================================= - -### Enhancements - -* `Actor.preconditionIsolated()` is now used for runtime actor checking when - available (i.e. building with Xcode 15 and running on iOS 17) rather than the - less reliable workaround. - -### Fixed - -* If downloading the fresh Realm file failed during a client reset on a - flexible sync Realm, the sync client would crash the next time the Realm was - opened. ([Core #6494](https://github.com/realm/realm-core/issues/6494), since v10.28.2) -* If the order of properties in the local class definitions did not match the - order in the server-side schema, the before-reset Realm argument passed to a - client reset handler would have an invalid schema and likely crash if any - data was read from it. ([Core #6693](https://github.com/realm/realm-core/issues/6693), since v10.40.0) - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 1. - -### Internal - -* Upgraded realm-core from 13.13.0 to 13.15.0. -* The prebuilt library used for CocoaPods installations is now built with Xcode - 14. This should not have any observable effects other than the download being - much smaller due to no longer including bitcode. - -10.40.1 Release notes (2023-06-06) -============================================================= - -### Enhancements - -* Fix compilation with Xcode 15. Note that iOS 12 is the minimum supported - deployment target when using Xcode 15. -* Switch to building the Carthage release with Xcode 14.3.1. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 1. - -### Internal - -* Overhauled SDK metrics collection to better drive future development efforts. - -10.40.0 Release notes (2023-05-26) -============================================================= - -Drop support for Xcode 13 and add Xcode 14.3.1. Xcode 14.1 is now the minimum -supported version. - -### Enhancements - -* Adjust the error message for private `Object` subclasses and subclasses - nested inside other types to explain how to make them work rather than state - that it's impossible. ([#5662](https://github.com/realm/realm-cocoa/issues/5662)). -* Improve performance of SectionedResults. With a single section it is now ~10% - faster, and the runtime of sectioning no longer scales significantly with - section count, giving >100% speedups when there are large numbers of sections - ([Core #6606](https://github.com/realm/realm-core/pull/6606)). -* Very slightly improve performance of runtime thread checking on the main - thread. ([Core #6606](https://github.com/realm/realm-core/pull/6606)) - -### Fixed - -* Allow support for implicit boolean queries on Swift's Type Safe Queries API - ([#8212](https://github.com/realm/realm-swift/issues/8212)). -* Fixed a fatal error (reported to the sync error handler) during client reset - or automatic partition-based to flexible sync migration if the reset has been - triggered during an async open and the schema being applied has added new - classes. Due to this bug automatic flexibly sync migration has been disabled - for older releases and this is now the minimum version required. - ([#6601](https://github.com/realm/realm-core/issues/6601), since automatic - client resets were introduced in v10.25.0) -* Dictionaries sometimes failed to map unresolved links to nil. If the target - of a link in a dictionary was deleted by another sync client, reading that - field from the dictionary would sometimes give an invalid object rather than - nil. In addition, queries on dictionaries would sometimes have incorrect - results. ([Core #6644](https://github.com/realm/realm-core/pull/6644), since v10.8.0) -* Older versions of Realm would sometimes fail to properly mark objects as - being the target of an incoming link from another object. When this happened, - deleting the target object would hit an assertion failure due to the - inconsistent state. We now reconstruct a valid state rather than crashing. - ([Core #6585](https://github.com/realm/realm-core/issues/6585), since v5.0.0) -* Fix several UBSan failures which did not appear to result in functional bugs - ([Core #6649](https://github.com/realm/realm-core/pull/6649)). -* Using both synchronous and asynchronous transactions on the same thread or - scheduler could hit the assertion failure "!realm.is_in_transaction()" if one - of the callbacks for an asynchronous transaction happened to be scheduled - during a synchronous transaction - ([Core #6659](https://github.com/realm/realm-core/issues/6659), since v10.26.0) -* The stored deployment location for Apps was not being updated correctly after - receiving a redirect response from the server, resulting in every connection - attempting to connect to the old URL and getting redirected rather than only - the first connection after the deployment location changed. - ([Core #6630](https://github.com/realm/realm-core/issues/6630), since v10.38.2) - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-14.3.1. - -### Internal - -* Upgraded realm-core from 13.10.1 to 13.13.0. - -10.39.1 Release notes (2023-05-05) -============================================================= - -### Enhancements - -* New notifiers can now be registered in write transactions until changes have - actually been made in the write transaction. This makes it so that new - notifications can be registered inside change notifications triggered by - beginning a write transaction (unless a previous callback performed writes). - ([#4818](https://github.com/realm/realm-swift/issues/4818)). -* Reduce the memory footprint of an automatic (discard or recover) client reset - when there are large incoming changes from the server. - ([Core #6567](https://github.com/realm/realm-core/issues/6567)). - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from 13.10.0 to 13.10.1. - -10.39.0 Release notes (2023-05-03) -============================================================= - -### Enhancements - -* Add support for actor-isolated Realms, opened with `try await Realm(actor: actor)`. - - Rather than being confined to the current thread or a dispatch queue, - actor-isolated Realms are isolated to an actor. This means that they can be - used from any thread as long as it's within a function isolated to that - actor, and they remain valid over suspension points where a task may hop - between threads. Actor-isolated Realms can be used with either global or - local actors: - - ```swift - @MainActor function mainThreadFunction() async throws { - // These are identical: the async init continues to produce a - // MainActor-confined Realm if no actor is supplied - let realm1 = try await Realm() - let realm2 = try await Realm(MainActor.shared) - } - - // A simple example of a custom global actor - @globalActor actor BackgroundActor: GlobalActor { - static var shared = BackgroundActor() - } - - @BackgroundActor backgroundThreadFunction() async throws { - // Explicitly specifying the actor is required for everything but MainActor - let realm = try await Realm(actor: BackgroundActor.shared) - try await realm.write { - _ = realm.create(MyObject.self) - } - // Thread-confined Realms would sometimes throw an exception here, as we - // may end up on a different thread after an `await` - print("\(realm.objects(MyObject.self).count)") - } - - actor MyActor { - // An implicitly-unwrapped optional is used here to let us pass `self` to - // `Realm(actor:)` within `init` - var realm: Realm! - init() async throws { - realm = try await Realm(actor: self) - } - - var count: Int { - realm.objects(MyObject.self).count - } - - func create() async throws { - try await realm.asyncWrite { - realm.create(MyObject.self) - } - } - } - - // This function isn't isolated to the actor, so each operation has to be async - func createObjects() async throws { - let actor = try await MyActor() - for _ in 0..<5 { - await actor.create() - } - print("\(await actor.count)") - } - - // In an isolated function, an actor-isolated Realm can be used synchronously - func createObjects(in actor: isolated MyActor) async throws { - await actor.realm.write { - actor.realm.create(MyObject.self) - } - print("\(actor.realm.objects(MyObject.self).count)") - } - ``` - - Actor-isolated Realms come with a more convenient syntax for asynchronous - writes. `try await realm.write { ... }` will suspend the current task, - acquire the write lock without blocking the current thread, and then invoke - the block. The actual data is then written to disk on a background thread, - and the task is resumed once that completes. As this does not block the - calling thread while waiting to write and does not perform i/o on the calling - thread, this will often be safe to use from `@MainActor` functions without - blocking the UI. Sufficiently large writes may still benefit from being done - on a background thread. - - Asynchronous writes are only supported for actor-isolated Realms or in - `@MainActor` functions. - - Actor-isolated Realms require Swift 5.8 (Xcode 14.3). Enabling both strict - concurrency checking (`SWIFT_STRICT_CONCURRENCY=complete` in Xcode) and - runtime actor data race detection (`OTHER_SWIFT_FLAGS=-Xfrontend - -enable-actor-data-race-checks`) is strongly recommended when using - actor-isolated Realms. -* Add support for automatic partition-based to flexible sync migration. - Connecting to a server-side app configured to use flexible sync with a - client-side partition-based sync configuration is now supported, and will - automatically create the appropriate flexible sync subscriptions to subscribe - to the requested partition. This allows changing the configuration on the - server from partition-based to flexible without breaking existing clients. - ([Core #6554](https://github.com/realm/realm-core/issues/6554)) -* Now you can use an array `[["_id": 1], ["breed": 0]]` as sorting option for a - MongoCollection. This new API fixes the issue where the resulting documents - when using more than one sort parameter were not consistent between calls. - ([#7188](https://github.com/realm/realm-swift/issues/7188), since v10.0.0). -* Add support for adding a user created default logger, which allows implementing your own logging logic - and the log threshold level. - You can define your own logger creating an instance of `Logger` and define the log function which will be - invoked whenever there is a log message. - - ```swift - let logger = Logger(level: .all) { level, message in - print("Realm Log - \(level): \(message)") - } - ``` - - Set this custom logger as Realm default logger using `Logger.shared`. - ```swift - Logger.shared = logger - ``` -* It is now possible to change the default log threshold level at any point of the application's lifetime. - ```swift - Logger.shared.logLevel = .debug - ``` - This will override the log level set anytime before by a user created logger. -* We have set `.info` as the default log threshold level for Realm. You will now see some - log message in your console. To disable use `Logger.shared.level = .off`. - -### Fixed - -* Several schema initialization functions had incorrect `@MainActor` - annotations, resulting in runtime warnings if the first time a Realm was - opened was on a background thread - ([#8222](https://github.com/realm/realm-swift/issues/8222), since v10.34.0). - -### Deprecations - -* `App.SyncManager.logLevel` and `App.SyncManager.logFunction` are deprecated in favour of - setting a default logger. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from v13.9.4 to v13.10.0. - -10.38.3 Release notes (2023-04-28) -============================================================= - -### Enhancements - -* Improve performance of cancelling a write transactions after making changes. - If no KVO observers are used this is now constant time rather than taking - time proportional to the number of changes to be rolled back. Cancelling a - write transaction with KVO observers is 10-20% faster. ([Core PR #6513](https://github.com/realm/realm-core/pull/6513)). - -### Fixed - -* Performing a large number of queries without ever performing a write resulted - in steadily increasing memory usage, some of which was never fully freed due - to an unbounded cache ([#7978](https://github.com/realm/realm-swift/issues/7978), since v10.27.0). - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from 13.9.3 to 13.9.4 - -10.38.2 Release notes (2023-04-25) -============================================================= - -### Enhancements - -* Improve performance of equality queries on a non-indexed AnyRealmValue - property by about 30%. ([Core #6506](https://github.com/realm/realm-core/issues/6506)) - -### Fixed - -* SSL handshake errors were treated as fatal errors rather than errors which - should be retried. ([Core #6434](https://github.com/realm/realm-core/issues/6434), since v10.35.0) - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from 13.9.0 to 13.9.3. - -10.38.1 Release notes (2023-04-25) -============================================================= - -### Fixed - -* The error handler set on EventsConfiguration was not actually used (since v10.26.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -10.38.0 Release notes (2023-03-31) -============================================================= - -Switch to building the Carthage release with Xcode 14.3. - -### Enhancements - -* Add Xcode 14.3 binaries to the release package. Note that CocoaPods 1.12.0 - does not support Xcode 14.3. -* Add support for sharing encrypted Realms between multiple processes. - ([Core #1845](https://github.com/realm/realm-core/issues/1845)) - -### Fixed - -* Fix a memory leak reported by Instruments on `URL.path` in - `Realm.Configuration.fileURL` when using a string partition key in Partition - Based Sync ([#8195](https://github.com/realm/realm-swift/pull/8195)), since v10.0.0). -* Fix a data race in version management. If one thread committed a write - transaction which increased the number of live versions above the previous - highest seen during the current session at the same time as another thread - began a read, the reading thread could read from a no-longer-valid memory - mapping. This could potentially result in strange crashes when opening, - refreshing, freezing or thawing a Realm - ([Core #6411](https://github.com/realm/realm-core/pull/6411), since v10.35.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from 13.8.0 to 13.9.0. - -10.37.2 Release notes (2023-03-29) -============================================================= - -### Fixed - -* Copying a `RLMRealmConfiguration` failed to copy several fields. This - resulted in migrations being passed the incorrect object type in Swift when - using the default configuration (since v10.34.0) or async open (since - v10.37.0). This also broke using the Events API in those two scenarios (since - v10.26.0 for default configuration and v10.37.0 for async open). ([#8190](https://github.com/realm/realm-swift/issues/8190)) - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -10.37.1 Release notes (2023-03-27) -============================================================= - -### Enhancements - -* Performance improvement for the following queries ([Core #6376](https://github.com/realm/realm-core/issues/6376)): - * Significant (~75%) improvement when counting (`Results.count`) the number - of exact matches (with no other query conditions) on a - string/int/UUID/ObjectID property that has an index. This improvement - will be especially noticiable if there are a large number of results - returned (duplicate values). - * Significant (~99%) improvement when querying for an exact match on a Date - property that has an index. - * Significant (~99%) improvement when querying for a case insensitive match - on an AnyRealmValue property that has an index. - * Moderate (~25%) improvement when querying for an exact match on a Bool - property that has an index. - * Small (~5%) improvement when querying for a case insensitive match on an - AnyRealmValue property that does not have an index. - -### Fixed - -* Add missing `@Sendable` annotations to several sync and app services related - callbacks ([PR #8169](https://github.com/realm/realm-swift/pull/8169), since v10.34.0). -* Fix some bugs in handling task cancellation for async Realm init. Some very - specific timing windows could cause crashes, and the download would not be - cancelled if the Realm was already open ([PR #8178](https://github.com/realm/realm-swift/pull/8178), since v10.37.0). -* Fix a crash when querying an AnyRealmValue property with a string operator - (contains/like/beginswith/endswith) or with case insensitivity. - ([Core #6376](https://github.com/realm/realm-core/issues/6376), since v10.8.0) -* Querying for case-sensitive equality of a string on an indexed AnyRealmValue - property was returning case insensitive matches. For example querying for - `myIndexedAny == "Foo"` would incorrectly match on values of "foo" or "FOO" etc. - ([Core #6376](https://github.com/realm/realm-core/issues/6376), since v10.8.0) -* Adding an index to an AnyRealmValue property when objects of that type - already existed would crash with an assertion. - ([Core #6376](https://github.com/realm/realm-core/issues/6376), since v10.8.0). -* Fix a bug that may have resulted in arrays being in different orders on - different devices. Some cases of “Invalid prior_size” may be fixed too. - ([Core #6191](https://github.com/realm/realm-core/issues/6191), since v10.25.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -### Internal - -* Upgraded realm-core from 13.6.0 to 13.8.0 - -10.37.0 Release notes (2023-03-09) -============================================================= - -### Enhancements - -* `MongoCollection.watch().subscribe(on:)` now supports any swift Scheduler - rather than only dispatch queues ([PR #8131](https://github.com/realm/realm-swift/pull/8130)). -* Add an async sequence wrapper for `MongoCollection.watch()`, allowing you to - do `for try await change in collection.changeEvents { ... }` - ([PR #8131](https://github.com/realm/realm-swift/pull/8130)). -* The internals of error handling and reporting have been significantly - reworked. The visible effects of this are that some errors which previously - had unhelpful error messages now include more detail about what went wrong, - and App errors now expose a much more complete set of error codes - ([PR #8002](https://github.com/realm/realm-swift/pull/8002)). -* Expose compensating write error information. When the server rejects a - modification made by the client (such as if the user does not have the - required permissions), a `SyncError` is delivered to the sync error handler - with the code `.writeRejected` and a non-nil `compensatingWriteInfo` field - which contains information about what was rejected and why. This information - is intended primarily for debugging and logging purposes and may not have a - stable format. ([PR #8002](https://github.com/realm/realm-swift/pull/8002)) -* Async `Realm.init()` now handles Task cancellation and will cancel the async - open if the Task is cancelled ([PR #8148](https://github.com/realm/realm-swift/pull/8148)). -* Cancelling async opens now has more consistent behavior. The previously - intended and documented behavior was that cancelling an async open would - result in the callback associated with the specific task that was cancelled - never being called, and all other pending callbacks would be invoked with an - ECANCELED error. This never actually worked correctly, and the callback which - was not supposed to be invoked at all sometimes would be. We now - unconditionally invoke all of the exactly once, passing ECANCELED to all of - them ([PR #8148](https://github.com/realm/realm-swift/pull/8148)). - -### Fixed - -* `UserPublisher` incorrectly bounced all notifications to the main thread instead - of setting up the Combine publisher to correctly receive on the main thread. - ([#8132](https://github.com/realm/realm-swift/issues/8132), since 10.21.0) -* Fix warnings when building with Xcode 14.3 beta 2. -* Errors in async open resulting from invalid queries in `initialSubscriptions` - would result in the callback being invoked with both a non-nil Realm and a - non-nil Error even though the Realm was in an invalid state. Now only the - error is passed to the callback ([PR #8148](https://github.com/realm/realm-swift/pull/8148), since v10.28.0). -* Converting a local realm to a synced realm would crash if an embedded object - was null ([Core #6294](https://github.com/realm/realm-core/issues/6294), since v10.22.0). -* Subqueries on indexed properties performed extremely poorly. ([Core #6327](https://github.com/realm/realm-core/issues/6327), since v5.0.0) -* Fix a crash when a SSL read successfully read a non-zero number of bytes and - also reported an error. ([Core #5435](https://github.com/realm/realm-core/issues/5435), since 10.0.0) -* The sync client could get stuck in an infinite loop if the server sent an - invalid changeset which caused a transform error. This now results in a - client reset instead. ([Core #6051](https://github.com/realm/realm-core/issues/6051), since v10.0.0) -* Strings in queries which contained any characters which required multiple - bytes when encoded as utf-8 were incorrectly encoded as binary data when - serializing the query to send it to the server for a flexible sync - subscription, resulting the server rejecting the query - ([Core #6350](https://github.com/realm/realm-core/issues/6350), since 10.22.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -### Internal - -* Upgraded realm-core from 13.4.1 to 13.6.0 - -10.36.0 Release notes (2023-02-15) -============================================================= - -### Enhancements - -* Add support for multiple overlapping or nested event scopes. - `Events.beginScope()` now returns a `Scope` object which is used to commit or - cancel that scope, and if more than one scope is active at a time events are - reported to all active scopes. - -### Fixed - -* Fix moving `List` items to a higher index in SwiftUI results in wrong destination index - ([#7956](https://github.com/realm/realm-swift/issues/7956), since v10.6.0). -* Using the `searchable` view modifier with `@ObservedResults` in iOS 16 would - cause the collection observation subscription to cancel. - ([#8096](https://github.com/realm/realm-swift/issues/8096), since 10.21.0) -* Client reset with recovery would sometimes crash if the recovery resurrected - a dangling link ([Core #6292](https://github.com/realm/realm-core/issues/6292), since v10.32.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -### Internal - -* Upgraded realm-core from 13.4.0 to 13.4.1 - -10.35.1 Release notes (2023-02-10) -============================================================= - -### Fixed - -* Client reset with recovery would crash if a client reset occurred the very - first time the Realm was opened with async open. The client reset callbacks - are now not called if the Realm had never been opened before - ([PR #8125](https://github.com/realm/realm-swift/pull/8125), since 10.32.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -10.35.0 Release notes (2023-02-07) -============================================================= - -This version bumps the Realm file format version to 23. Realm files written by -this version cannot be read by older versions of Realm. - -### Enhancements - -* The Realm file is now automatically shrunk if the file size is larger than - needed to store all of the data. ([Core PR #5755](https://github.com/realm/realm-core/pull/5755)) -* Pinning old versions (either with frozen Realms or with Realms on background - threads that simply don't get refreshed) now only prevents overwriting the - data needed by that version, rather than the data needed by that version and - all later versions. In addition, frozen Realms no longer pin the transaction - logs used to drive change notifications. This mostly eliminates the file size - growth caused by pinning versions. ([Core PR #5440](https://github.com/realm/realm-core/pull/5440)) -* Rework how Dictionaries/Maps are stored in the Realm file. The new design uses - less space and is typically significantly faster. This changes the iteration - order of Maps, so any code relying on that may be broken. We continue - to make no guarantees about iteration order on Maps ([Core #5764](https://github.com/realm/realm-core/issues/5764)). -* Improve performance of freezing Realms ([Core PR #6211](https://github.com/realm/realm-core/pull/6211)). - -### Fixed - -* Fix a crash when using client reset with recovery and flexible sync with a - single subscription ([Core #6070](https://github.com/realm/realm-core/issues/6070), since v10.28.2) -* Encrypted Realm files could not be opened on devices with a larger page size - than the one which originally wrote the file. - ([#8030](https://github.com/realm/realm-swift/issues/8030), since v10.32.1) -* Creating multiple flexible sync subscriptions at once could hit an assertion - failure if the server reported an error for any of them other than the last - one ([Core #6038](https://github.com/realm/realm-core/issues/6038), since v10.21.1). -* `Set` and `List` considered a string and binary - data containing that string encoded as UTF-8 to be equivalent. This could - result in a List entry not changing type on assignment and for the client be - inconsistent with the server if a string and some binary data with equivalent - content was inserted from Atlas. - ([Core #4860](https://github.com/realm/realm-core/issues/4860) and - [Core #6201](https://github.com/realm/realm-core/issues/6201), since v10.8.0) -* Querying for NaN on Decimal128 properties did not match any objects - ([Core #6182](https://github.com/realm/realm-core/issues/6182), since v10.8.0). -* When client reset with recovery is used and the recovery did not need to - make any changes to the local Realm, the sync client could incorrectly think - the recovery failed and report the error "A fatal error occured during client - reset: 'A previous 'Recovery' mode reset from did not succeed, - giving up on 'Recovery' mode to prevent a cycle'". - ([Core #6195](https://github.com/realm/realm-core/issues/6195), since v10.32.0) -* Fix a crash when using client reset with recovery and flexible sync with a - single subscription ([Core #6070](https://github.com/realm/realm-core/issues/6070), since v10.28.2) -* Writing to newly in-view objects while a flexible sync bootstrap was in - progress would not synchronize those changes to the server - ([Core #5804](https://github.com/realm/realm-core/issues/5804), since v10.21.1). -* If a client reset with recovery or discard local was interrupted while the - "fresh" realm was being downloaded, the sync client could crash with a - MultpleSyncAgents exception ([Core #6217](https://github.com/realm/realm-core/issues/6217), since v10.25.0). -* Sharing Realm files between a Catalyst app and Realm Studio did not properly - synchronize access to the Realm file ([Core #6258](https://github.com/realm/realm-core/pull/6258), since v10.0.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -### Internal - -* Upgraded realm-core from 12.13.0 to 13.4.0 - -10.34.1 Release notes (2023-01-20) -============================================================= - -### Fixed - -* Add some missing `@preconcurrency` annotations which lead to build failures - with Xcode 14.0 when importing via SPM or CocoaPods - ([#8104](https://github.com/realm/realm-swift/issues/8104), since v10.34.0). - -### Compatibility - -* Realm Studio: 11.0.0 - 12.0.0. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -10.34.0 Release notes (2023-01-13) -============================================================= - -Swift 5.5 is no longer supported. Swift 5.6 (Xcode 13.3) is now the minimum -supported version. - -The prebuilt binary for Carthage is now build with Xcode 14.2. - -### Enhancements - -* Improve performance of creating Projection objects and of change - notifications on projections ([PR #8050](https://github.com/realm/realm-swift/pull/8050)). -* Allow initialising any sync configuration with `cancelAsyncOpenOnNonFatalErrors`. -* Improve performance of Combine value publishers which do not use the - object/collection changesets a little. -* All public types have been audited for sendability and are now marked as - Sendable when applicable. A few types which were incidentally not thread-safe - but make sense to use from multiple threads are now thread-safe. -* Add support for building Realm with strict concurrency checking enabled. - -### Fixed - -* Fix bad memory access exception that can occur when watching change streams. - [PR #8039](https://github.com/realm/realm-swift/pull/8039). -* Object change notifications on projections only included the first projected - property for each source property ([PR #8050](https://github.com/realm/realm-swift/pull/8050), since v10.21.0). -* `@AutoOpen` failed to open flexible sync Realms while offline - ([#7986](https://github.com/realm/realm-swift/issues/7986), since v10.27.0). -* Fix "Publishing changes from within view updates is not allowed" warnings - when using `@ObservedResults` or `@ObservedSectionedResults` - ([#7908](https://github.com/realm/realm-swift/issues/7908)). -* Fix "Publishing changes from within view updates is not allowed" warnings - when using `@AutoOpen` or `@AsyncOpen`. - ([#7908](https://github.com/realm/realm-swift/issues/7908)). -* Defer `Realm.asyncOpen` execution on `@AsyncOpen` and `@AutoOpen` property - wrappers until all the environment values are set. This will guarantee the - configuration and partition value are set set before opening the realm. - ([#7931](https://github.com/realm/realm-swift/issues/7931), since v10.12.0). -* `@ObservedResults.remove()` could delete the wrong object if a write on a - background thread which changed the index of the object being removed - occurred at a very specific time (since v10.6.0). - -### Compatibility - -* Realm Studio: 11.0.0 - 12.0.0. 13.0.0 is currently incompatible. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -10.33.0 Release notes (2022-12-01) -============================================================= - -### Enhancements - -* Flexible sync subscription state will change to - `SyncSubscriptionState.pending` (`RLMSyncSubscriptionStatePending`) while - waiting for the server to have sent all pending history after a bootstrap and - before marking a subscription as Complete. - ([#5795](https://github.com/realm/realm-core/pull/5795)) -* Add custom column names API, which allows to set a different column name in the realm - from the one used in your object declaration. - ```swift - class Person: Object { - @Persisted var firstName: String - @Persisted var birthDate: Date - @Persisted var age: Int - - override class public func propertiesMapping() -> [String: String] { - ["firstName": "first_name", - "birthDate": "birth_date"] - } - } - ``` - This is very helpful in cases where you want to name a property differently - from your `Device Sync` JSON schema. - This API is only available for old and modern object declaration syntax on the - `RealmSwift` SDK. -* Flexible sync bootstraps now apply 1MB of changesets per write transaction - rather than applying all of them in a single write transaction. - ([Core PR #5999](https://github.com/realm/realm-core/pull/5999)). - -### Fixed - -* Fix a race condition which could result in "operation cancelled" errors being - delivered to async open callbacks rather than the actual sync error which - caused things to fail ([Core PR #5968](https://github.com/realm/realm-core/pull/5968), since the introduction of async open). -* Fix database corruption issues which could happen if an application was - terminated at a certain point in the process of comitting a write - transaciton. ([Core PR #5993](https://github.com/realm/realm-core/pull/5993), since v10.21.1) -* `@AsyncOpen` and `@AutoOpen` would begin and then cancel a second async open - operation ([PR #8038](https://github.com/realm/realm-swift/pull/8038), since v10.12.0). -* Changing the search text when using the searchable SwiftUI extension would - trigger multiple updates on the View for each change - ([PR #8038](https://github.com/realm/realm-swift/pull/8038), since v10.19.0). -* Changing the filter or search properties of an `@ObservedResults` or - `@ObservedSectionedResults` would trigger up to three updates on the View - ([PR #8038](https://github.com/realm/realm-swift/pull/8038), since v10.6.0). -* Fetching a user's profile while the user logs out would result in an - assertion failure. ([Core PR #6017](https://github.com/realm/realm-core/issues/5571), since v10.8.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -### Internal - -* Upgraded realm-core from 12.11.0 to 12.13.0 - -10.32.3 Release notes (2022-11-10) -============================================================= - -### Fixed - -* Fix name lookup errors when importing Realm Swift built in library evolution - mode (([#8014](https://github.com/realm/realm-swift/issues/8014)). -* The prebuilt watchOS library in the objective-c release package was missing - an arm64 slice. The Swift release package was uneffected - ([PR #8016](https://github.com/realm/realm-swift/pull/8016)). -* Fix issue where `RLMUserAPIKey.key`/`UserAPIKey.key` incorrectly returned the name of the API - key instead of the key itself. ([#8021](https://github.com/realm/realm-swift/issues/8021), since v10.0.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -10.32.2 Release notes (2022-11-01) -============================================================= - -Switch to building the Carthage release with Xcode 14.1. - -### Fixed - -* Fix linker errors when building a release build with Xcode 14.1 when - installing via SPM ([#7995](https://github.com/realm/realm-swift/issues/7995)). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -10.32.1 Release notes (2022-10-25) -============================================================= - -### Enhancements - -* Improve performance of client reset with automatic recovery and converting - top-level tables into embedded tables ([Core #5897](https://github.com/realm/realm-core/pull/5897)). -* `Realm.Error` is now a typealias for `RLMError` rather than a - manually-defined version of what the automatic bridging produces. This should - have no effect on existing working code, but the manual definition was - missing a few things supplied by the automatic bridging. -* Some sync errors sent by the server include a link to the server-side logs - associated with that error. This link is now exposed in the `serverLogURL` - property on `SyncError` (or `RLMServerLogURLKey` userInfo field when using NSError). - -### Fixed - -* Many sync and app errors were reported using undocumented internal error - codes and/or domains and could not be progammatically handled. Some notable - things which now have public error codes instead of unstable internal ones: - - `Realm.Error.subscriptionFailed`: The server rejected a flexible sync subscription. - - `AppError.invalidPassword`: A login attempt failed due to a bad password. - - `AppError.accountNameInUse`: A registration attempt failed due to the account name being in use. - - `AppError.httpRequestFailed`: A HTTP request to Atlas App Services - completed with an error HTTP code. The failing code is available in the - `httpStatusCode` property. - - Many other less common error codes have been added to `AppError`. - - All sync errors other than `SyncError.clientResetError` reported incorrect - error codes. - (since v10.0.0). -* `UserAPIKey.objectId` was incorrectly bridged to Swift as `RLMObjectId` to - `ObjectId`. This may produce warnings about an unneccesary cast if you were - previously casting it to the correct type (since v10.0.0). -* Fixed an assertion failure when observing change notifications on a sectioned - result, if the first modification was to a linked property that did not cause - the state of the sections to change. - ([Core #5912](https://github.com/realm/realm-core/issues/5912), - since the introduction of sectioned results in v10.29.0) -* Fix a use-after-free if the last external reference to an encrypted - synchronized Realm was closed between when a client reset error was received - and when the download of the new Realm began. - ([Core #5949](https://github.com/realm/realm-core/pull/5949), since 10.28.4). -* Fix an assertion failure during client reset with recovery when recovering - a list operation on an embedded object that has a link column in the path - prefix to the list from the top level object. - ([Core #5957](https://github.com/realm/realm-core/issues/5957), - since introduction of automatic recovery in v10.32.0). -* Creating a write transaction which is rejected by the server due to it - exceeding the maximum transaction size now results in a client reset error - instead of synchronization breaking and becoming stuck forever - ([Core #5209](https://github.com/realm/realm-core/issues/5209), since v10). -* Opening an unencrypted file with an encryption key would sometimes report a - misleading error message that indicated that the problem was something other - than a decryption failure ([Core #5915](https://github.com/realm/realm-core/pull/5915), since 0.89.0). -* Fix a rare deadlock which could occur when closing a synchronized Realm - immediately after committing a write transaction when the sync worker thread - has also just finished processing a changeset from the server - ([Core #5948](https://github.com/realm/realm-core/pull/5948)). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.0.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -### Internal - -* Upgraded realm-core from 12.9.0 to 12.11.0. - -10.32.0 Release notes (2022-10-10) -============================================================= - -### Enhancements - -* Add `.recoverUnsyncedChanges` (`RLMClientResetModeRecoverUnsyncedChanges`) and -`.recoverOrDiscardUnsyncedChanges` (`RLMClientResetModeRecoverOrDiscardUnsyncedChanges`) behaviors to `ClientResetMode` (`RLMClientResetMode`). - - The newly added recover modes function by downloading a realm which reflects the latest - state of the server after a client reset. A recovery process is run locally in an - attempt to integrate the server state with any local changes from before the - client reset occurred. - The changes are integrated with the following rules: - 1. Objects created locally that were not synced before client reset, will be integrated. - 2. If an object has been deleted on the server, but was modified on the client, the delete takes precedence and the update is discarded. - 3. If an object was deleted on the client, but not the server, then the client delete instruction is applied. - 4. In the case of conflicting updates to the same field, the client update is applied. - - The client reset process will fallback to `ClientResetMode.discardUnsyncedChanges` if the recovery process fails in `.recoverOrDiscardUnsyncedChanges`. - - The client reset process will fallback to `ClientResetMode.manual` if the recovery process fails in `.recoverUnsyncedChanges`. - - The two new swift recovery modes support client reset callbacks: `.recoverUnsyncedChanges(beforeReset: ((Realm) -> Void)? = nil, afterReset: ((Realm, Realm) -> Void)? = nil)`. - - The two new Obj-C recovery modes support client reset callbacks in `notifyBeforeReset` - and `notifyAfterReset`for both `[RLMUser configurationWithPartitionValue]` and `[RLMUser flexibleSyncConfigurationWithClientResetMode]` - For more detail on client reset callbacks, see `ClientResetMode`, `RLMClientResetBeforeBlock`, - `RLMClientResetAfterBlock`, and the 10.25.0 changelog entry. -* Add two new additional interfaces to define a manual client reset handler: - - Add a manual callback handler to `ClientResetMode.manual` -> `ClientResetMode.manual(ErrorReportingBlock? = nil)`. - - Add the `RLMSyncConfiguration.manualClientResetHandler` property (type `RLMSyncErrorReportingBlock`). - - These error reporting blocks are invoked in the event of a `RLMSyncErrorClientResetError`. - - See `ErrorReportingBlock` (`RLMSyncErrorReportingBlock`), and `ClientResetInfo` for more detail. - - Previously, manual client resets were handled only through the `SyncManager.ErrorHandler`. You have the - option, but not the requirement, to define manual reset handler in these interfaces. - Otherwise, the `SyncManager.ErrorHandler` is still invoked during the manual client reset process. - - These new interfaces are only invoked during a `RLMSyncErrorClientResetError`. All other sync errors - are still handled in the `SyncManager.ErrorHandler`. - - See 'Breaking Changes' for information how these interfaces interact with an already existing - `SyncManager.ErrorHandler`. - -### Breaking Changes - -* The default `clientResetMode` (`RLMClientResetMode`) is switched from `.manual` (`RLMClientResetModeManual`) - to `.recoverUnsyncedChanges` (`RLMClientResetModeRecoverUnsyncedChanges`). - - If you are currently using `.manual` and continue to do so, the only change - you must explicitly make is designating manual mode in - your `Realm.Configuration.SyncConfiguration`s, since they will now default to `.recoverUnsyncedChanges`. - - You may choose to define your manual client reset handler in the newly - introduced `manual(ErrorReportingBlock? = nil)` - or `RLMSyncConfiguration.manualClientResetHandler`, but this is not required. - The `SyncManager.errorHandler` will still be invoked during a client reset if - no callback is passed into these new interfaces. - -### Deprecations - -* `ClientResetMode.discardLocal` is deprecated in favor of `ClientResetMode.discardUnsyncedChanges`. - The reasoning is that the name better reflects the effect of this reset mode. There is no actual - difference in behavior. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.0.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -10.31.0 Release notes (2022-10-05) -============================================================= - -The prebuilt binary for Carthage is now build with Xcode 14.0.1. - -### Enhancements - -* Cut the runtime of aggregate operations on large dictionaries in half - ([Core #5864](https://github.com/realm/realm-core/pull/5864)). -* Improve performance of aggregate operations on collections of objects by 2x - to 10x ([Core #5864](https://github.com/realm/realm-core/pull/5864)). - Greatly improve the performance of sorting or distincting a Dictionary's keys - or values. The most expensive operation is now performed O(log N) rather than - O(N log N) times, and large Dictionaries can see upwards of 99% reduction in - time to sort. ([Core #5166](https://github.com/realm/realm-core/pulls/5166)) -* Add support for changing the deployment location for Atlas Apps. Previously - this was assumed to be immutable ([Core #5648](https://github.com/realm/realm-core/issues/5648)). -* The sync client will now yield the write lock to other threads which are - waiting to perform a write transaction even if it still has remaining work to - do, rather than always applying all changesets received from the server even - when other threads are trying to write. ([Core #5844](https://github.com/realm/realm-core/pull/5844)). -* The sync client no longer writes an unused temporary copy of the changesets - received from the server to the Realm file ([Core #5844](https://github.com/realm/realm-core/pull/5844)). - -### Fixed - -* Setting a `List` property with `Results` no longer throws an unrecognized - selector exception (since 10.8.0-beta.2) -* `RLMProgressNotificationToken` and `ProgressNotificationToken` now hold a - strong reference to the sync session, keeping it alive until the token is - deallocated or invalidated, as the other notification tokens do. - ([#7831](https://github.com/realm/realm-swift/issues/7831), since v2.3.0). -* Results permitted some nonsensical aggregate operations on column types which - do not make sense to aggregate, giving garbage results rather than reporting - an error ([Core #5876](https://github.com/realm/realm-core/pull/5876), since v5.0.0). -* Upserting a document in a Mongo collection would crash if the document's id - type was anything other than ObjectId (since v10.0.0). -* Fix a use-after-free when a sync session is closed and the app is destroyed - at the same time ([Core #5752](https://github.com/realm/realm-core/issues/5752), - since v10.19.0). - -### Deprecations - -* `RLMUpdateResult.objectId` has been deprecated in favor of - `RLMUpdateResult.documentId` to support reporting document ids which are not - object ids. -### Breaking Changes -* Private API `_realmColumnNames` has been renamed to a new public API - called `propertiesMapping()`. This change only affects the Swift API - and doesn't have any effects in the obj-c API. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.0.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -### Internal - -* Upgraded realm-core from 12.7.0 to 12.9.0 - -10.30.0 Release notes (2022-09-20) -============================================================= - -### Fixed - -* Incoming links from `RealmAny` properties were not handled correctly when - migrating an object type from top-level to embedded. `RealmAny` properties - currently cannot link to embedded objects. - ([Core #5796](https://github.com/realm/realm-core/pull/5796), since 10.8.0). -* `Realm.refresh()` sometimes did not actually advance to the latest version. - It attempted to be semi-non-blocking in a very confusing way which resulted - in it sometimes advancing to a newer version that is not the latest version, - and sometimes blocking until notifiers are ready so that it could advance to - the latest version. This behavior was undocumented and didn't work correctly, - so it now always blocks if needed to advance to the latest version. - ([#7625](https://github.com/realm/realm-swift/issues/7625), since v0.98.0). -* Fix the most common cause of thread priority inversions when performing - writes on the main thread. If beginning the write transaction has to wait for - the background notification calculations to complete, that wait is now done - in a QoS-aware way. ([#7902](https://github.com/realm/realm-swift/issues/7902)) -* Subscribing to link properties in a flexible sync Realm did not work due to a - mismatch between what the client sent and what the server needed. - ([Core #5409](https://github.com/realm/realm-core/issues/5409)) -* Attempting to use `AsymmetricObject` with partition-based sync now reports a - sensible error much earlier in the process. Asymmetric sync requires using - flexible sync. ([Core #5691](https://github.com/realm/realm-core/issues/5691), since 10.29.0). -* Case-insensitive but diacritic-sensitive queries would crash on 4-byte UTF-8 - characters ([Core #5825](https://github.com/realm/realm-core/issues/5825), since v2.2.0) -* Accented characters are now handled by case-insensitive but - diacritic-sensitive queries. ([Core #5825](https://github.com/realm/realm-core/issues/5825), since v2.2.0) - -### Breaking Changes - -* `-[RLMASLoginDelegate authenticationDidCompleteWithError:]` has been renamed - to `-[RLMASLoginDelegate authenticationDidFailWithError:]` to comply with new - app store requirements. This only effects the obj-c API. - ([#7945](https://github.com/realm/realm-swift/issues/7945)) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1 - 14. - -### Internal - -* Upgraded realm-core from 12.6.0 to 12.7.0 - -10.29.0 Release notes (2022-09-09) -============================================================= - -### Enhancements - -* Add support for asymmetric sync. When a class inherits from - `AsymmetricObject`, objects created are synced unidirectionally to the server - and cannot be queried or read locally. - -```swift - class PersonObject: AsymmetricObject { - @Persisted(primaryKey: true) var _id: ObjectId - @Persisted var name: String - @Persisted var age: Int - } - - try realm.write { - // This will create the object on the server but not locally. - realm.create(PersonObject.self, value: ["_id": ObjectId.generate(), - "name": "Dylan", - "age": 20]) - } -``` -* Add ability to section a collection which conforms to `RealmCollection`, `RLMCollection`. - Collections can be sectioned by a unique key retrieved from a keyPath or a callback and will return an instance of `SectionedResults`/`RLMSectionedResults`. - Each section in the collection will be an instance of `ResultsSection`/`RLMSection` which gives access to the elements corresponding to the section key. - `SectionedResults`/`RLMSectionedResults` and `ResultsSection`/`RLMSection` have the ability to be observed. - ```swift - class DemoObject: Object { - @Persisted var title: String - @Persisted var date: Date - var firstLetter: String { - return title.first.map(String.init(_:)) ?? "" - } - } - var sectionedResults: SectionedResults - // ... - sectionedResults = realm.objects(DemoObject.self) - .sectioned(by: \.firstLetter, ascending: true) - ``` -* Add `@ObservedSectionedResults` for SwiftUI support. This property wrapper type retrieves sectioned results - from a Realm using a keyPath or callback to determine the section key. - ```swift - struct DemoView: View { - @ObservedSectionedResults(DemoObject.self, - sectionKeyPath: \.firstLetter) var demoObjects - - var body: some View { - VStack { - List { - ForEach(demoObjects) { section in - Section(header: Text(section.key)) { - ForEach(section) { object in - MyRowView(object: object) - } - } - } - } - } - } - } - ``` -* Add automatic handing for changing top-level objects to embedded objects in - migrations. Any objects of the now-embedded type which have zero incoming - links are deleted, and objects with multiple incoming links are duplicated. - This happens after the migration callback function completes, so there is no - functional change if you already have migration logic which correctly handles - this. ([Core #5737](https://github.com/realm/realm-core/pull/5737)). -* Improve performance when a new Realm file connects to the server for the - first time, especially when significant amounts of data has been written - while offline. ([Core #5772](https://github.com/realm/realm-core/pull/5772)) -* Shift more of the work done on the sync worker thread out of the write - transaction used to apply server changes, reducing how long it blocks other - threads from writing. ([Core #5772](https://github.com/realm/realm-core/pull/5772)) -* Improve the performance of the sync changeset parser, which speeds up - applying changesets from the server. ([Core #5772](https://github.com/realm/realm-core/pull/5772)) - -### Fixed - -* Fix all of the UBSan failures hit by our tests. It is unclear if any of these - manifested as visible bugs. ([Core #5665](https://github.com/realm/realm-core/pull/5665)) -* Upload completion callbacks were sometimes called before the final step of - interally marking the upload as complete, which could result in calling - `Realm.writeCopy()` from the completion callback failing due to there being - unuploaded changes. ([Core #4865](https://github.com/realm/realm-core/issues/4865)). -* Writing to a Realm stored on an exFAT drive threw the exception "fcntl() with - F_BARRIERFSYNC failed: Inappropriate ioctl for device" when a write - transaction needed to expand the file. - ([Core #5789](https://github.com/realm/realm-core/issues/5789), since 10.27.0) -* Syncing a Decimal128 with big significand could result in a crash. - ([Core #5728](https://github.com/realm/realm-core/issues/5728)) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 RC. - -### Internal - -* Upgraded realm-core from 12.5.1 to 12.6.0 - -10.28.7 Release notes (2022-09-02) -============================================================= - -### Enhancements - -* Add prebuilt binaries for Xcode 14 to the release package. - -### Fixed - -* Fix archiving watchOS release builds with Xcode 14. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 6. - -10.28.6 Release notes (2022-08-19) -============================================================= - -### Fixed - -* Fixed an issue where having realm-swift as SPM sub-target dependency leads to - missing symbols error during iOS archiving ([Core #7645](https://github.com/realm/realm-core/pull/7645)). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 5. - -### Internal - -* Upgraded realm-core from 12.5.0 to 12.5.1 - -10.28.5 Release notes (2022-08-09) -============================================================= - -### Enhancements - -* Improve performance of accessing `SubscriptionSet` properties when no writes - have been made to the Realm since the last access. - -### Fixed - -* A use-after-free could occur if a Realm with audit events enabled was - destroyed while processing an upload completion for the events Realm on a - different thread. ([Core PR #5714](https://github.com/realm/realm-core/pull/5714)) -* Opening a read-only synchronized Realm for the first time via asyncOpen did - not set the schema version, which could lead to `m_schema_version != - ObjectStore::NotVersioned` assertion failures later on. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 4. - -### Internal - -* Upgraded realm-core from 12.4.0 to 12.5.0 - -10.28.4 Release notes (2022-08-03) -============================================================= - -### Enhancements - -* Add support for building arm64 watchOS when installing Realm via CocoaPods. -* Reduce the amount of virtual address space used - ([Core #5645](https://github.com/realm/realm-core/pull/5645)). - -### Fixed - -* Fix some warnings when building with Xcode 14 - ([Core #5577](https://github.com/realm/realm-core/pull/5577)). -* Fix compilation failures on watchOS platforms which do not support thread-local storage. - ([#7694](https://github.com/realm/realm-swift/issues/7694), [#7695](https://github.com/realm/realm-swift/issues/7695) since v10.21.1) -* Fix a data race when committing a transaction while multiple threads are - waiting to begin write transactions. This appears to not have caused any - functional problems. -* Fix a data race when writing audit events which could occur if the sync - client thread was busy with other work when the event Realm was opened. -* Fix some cases of running out of virtual address space (seen/reported as mmap - failures) ([Core #5645](https://github.com/realm/realm-core/pull/5645)). -* Audit event scopes containing only write events and no read events would - occasionally throw a `BadVersion` exception when a write transaction was - committed (since v10.26.0). -* The client reset callbacks for the DiscardLocal mode would be passed invalid - Realm instances if the callback was invoked at a point where the Realm was - not otherwise open. ([Core #5654](https://github.com/realm/realm-core/pull/5654), since the introduction of DiscardLocal reset mode in v10.25.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 4. - -### Internal - -* Upgraded realm-core from 12.3.0 to 12.4.0. - -10.28.3 Release notes (2022-07-27) -============================================================= - -### Enhancements - -* Greatly improve the performance of obtaining cached Realm instances in Swift - when using a sync configuration. - -### Fixed - -* Add missing `initialSubscription` and `rerunOnOpen` to copyWithZone method on - `RLMRealmConfiguration`. This resulted in incorrect values when using - `RLMRealmConfiguration.defaultConfiguration`. -* The sync error handler did not hold a strong reference to the sync session - while dispatching the error from the worker thread to the main thread, - resulting in the session passed to the error handler being invalid if there - were no other remaining strong references elsewhere. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 3. - -10.28.2 Release notes (2022-06-30) -============================================================= - -### Fixed - -* Using `seedFilePath` threw an exception if the Realm file being opened - already existed ([#7840](https://github.com/realm/realm-swift/issues/7840), - since v10.26.0). -* The `intialSubscriptions` callback was invoked every time a Realm was opened - regardless of the value of `rerunOnOpen` and if the Realm was already open on - another thread (since v10.28.0). -* Allow using `RLMSupport.Swift` from RealmSwift's Cocoapods - ([#6886](https://github.com/realm/realm-swift/pull/6886)). -* Fix a UBSan failure when mapping encrypted pages. Fixing this did not change - the resulting assembly, so there were probably no functional problems - resulting from this (since v5.0.0). -* Improved performance of sync clients during integration of changesets with - many small strings (totalling > 1024 bytes per changeset) on iOS 14, and - devices which have restrictive or fragmented memory. - ([Core #5614](https://github.com/realm/realm-core/issues/5614)) -* Fix a data race when opening a flexible sync Realm (since v10.28.0). -* Add a missing backlink removal when assigning null or a non-link value to an - `AnyRealmValue` property which previously linked to an object. - This could have resulted in "key not found" exceptions or assertion failures - such as `mixed.hpp:165: [realm-core-12.1.0] Assertion failed: m_type` when - removing the destination link object. - ([Core #5574](https://github.com/realm/realm-core/pull/5573), since the introduction of AnyRealmValue in v10.8.0) - -### Compatibility - -* Realm Studio: 12.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 2. - -### Internal - -* Upgraded realm-core from 12.1.0 to 12.3.0. - -10.28.1 Release notes (2022-06-10) -============================================================= - -### Enhancements - -* Add support for Xcode 14. When building with Xcode 14, the minimum deployment - target is now iOS 11. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 1. - -10.28.0 Release notes (2022-06-03) -============================================================= - -### Enhancements - -* Replace mentions of 'MongoDB Realm' with 'Atlas App Services' in the documentation and update appropriate links to documentation. -* Allow adding a subscription querying for all documents of a type in swift for flexible sync. -``` - try await subscriptions.update { - subscriptions.append(QuerySubscription(name: "all_people")) - } -``` -* Add Combine API support for flexible sync beta. -* Add an `initialSubscriptions` parameter when retrieving the flexible sync configuration from a user, - which allows to specify a subscription update block, to bootstrap a set of flexible sync subscriptions - when the Realm is first opened. - There is an additional optional parameter flag `rerunOnOpen`, which allows to run this initial - subscriptions on every app startup. - -```swift - let config = user.flexibleSyncConfiguration(initialSubscriptions: { subs in - subs.append(QuerySubscription(name: "people_10") { - $0.age > 10 - }) - }, rerunOnOpen: true) - let realm = try Realm(configuration: config) -``` -* The sync client error handler will report an error, with detailed info about which object caused it, when writing an object to a flexible sync Realm outside of any query subscription. ([#5528](https://github.com/realm/realm-core/pull/5528)) -* Adding an object to a flexible sync Realm for a type that is not within a query subscription will now throw an exception. ([#5488](https://github.com/realm/realm-core/pull/5488)). - -### Fixed - -* Flexible Sync query subscriptions will correctly complete when data is synced to the local Realm. ([#5553](https://github.com/realm/realm-core/pull/5553), since v12.0.0) - -### Breaking Changes - -* Rename `SyncSubscriptionSet.write` to `SyncSubscriptionSet.update` to avoid confusion with `Realm.write`. -* Rename `SyncSubscription.update` to `SyncSubscription.updateQuery` to avoid confusion with `SyncSubscriptionSet.update`. -* Rename `RLMSyncSubscriptionSet.write` to `RLMSyncSubscriptionSet.update` to align it with swift API. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-13.4. - -### Internal - -* Upgraded realm-core from 12.0.0 to 12.1.0. - -10.27.0 Release notes (2022-05-26) -============================================================= - -### Enhancements - -* `@AsyncOpen`/`@AutoOpen` property wrappers can be used with flexible sync. - -### Fixed - -* When installing via SPM, debug builds could potentially hit an assertion - failure during flexible sync bootstrapping. ([Core #5527](https://github.com/realm/realm-core/pull/5527)) -* Flexible sync now only applies bootstrap data if the entire bootstrap is - received. Previously orphaned objects could result from the read snapshot on - the server changing. ([Core #5331](https://github.com/realm/realm-core/pull/5331)) -* Partially fix a performance regression in write performance introduced in - v10.21.1. v10.21.1 fixed a case where a kernel panic or device's battery - dying at the wrong point in a write transaction could potentially result in a - corrected Realm file, but at the cost of a severe performance hit. This - version adjusts how file synchronization is done to provide the same safety - at a much smaller performance hit. ([#7740](https://github.com/realm/realm-swift/issues/7740)). - -### Compatibility - -* Realm Studio: 11.0.0 or later (but see note below). -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-13.4. - -### Internal - -* Upgraded realm-core from 11.17.0 to 12.0.0. -* Bump the version number for the lockfile used for interprocess - synchronization. This has no effect on persistent data, but means that - versions of Realm which use pre-12.0.0 realm-core cannot open Realm files at - the same time as they are opened by this version. Notably this includes Realm - Studio, and v11.1.2 (the latest at the time of this release) cannot open - Realm files which are simultaneously open in the simulator. - -10.26.0 Release notes (2022-05-19) -============================================================= - -Xcode 13.1 is now the minimum supported version of Xcode, as Apple no longer -allows submitting to the app store with Xcode 12. - -### Enhancements - -* Add Xcode 13.4 binaries to the release package. -* Add Swift API for asynchronous transactions -```swift - try? realm.writeAsync { - realm.create(SwiftStringObject.self, value: ["string"]) - } onComplete: { error in - // optional handling on write complete - } - - try? realm.beginAsyncWrite { - realm.create(SwiftStringObject.self, value: ["string"]) - realm.commitAsyncWrite() - } - - let asyncTransactionId = try? realm.beginAsyncWrite { - // ... - } - try! realm.cancelAsyncWrite(asyncTransactionId) -``` -* Add Obj-C API for asynchronous transactions -``` - [realm asyncTransactionWithBlock:^{ - [StringObject createInRealm:realm withValue:@[@"string"]]; - } onComplete:^(NSError *error) { - // optional handling - }]; - - [realm beginAsyncWriteTransaction:^{ - [StringObject createInRealm:realm withValue:@[@"string"]]; - [realm commitAsyncWriteTransaction]; - }]; - - RLMAsyncTransactionId asyncTransactionId = [realm beginAsyncWriteTransaction:^{ - // ... - }]; - [realm cancelAsyncTransaction:asyncTransactionId]; -``` -* Improve performance of opening a Realm with `objectClasses`/`objectTypes` set - in the configuration. -* Implement the Realm event recording API for reporting reads and writes on a - Realm file to Atlas. - -### Fixed - -* Lower minimum OS version for `async` login and FunctionCallables to match the - rest of the `async` functions. ([#7791]https://github.com/realm/realm-swift/issues/7791) -* Consuming a RealmSwift XCFramework with library evolution enabled would give the error - `'Failed to build module 'RealmSwift'; this SDK is not supported by the compiler'` - when the XCFramework was built with an older XCode version and is - then consumed with a later version. ([#7313](https://github.com/realm/realm-swift/issues/7313), since v3.18.0) -* A data race would occur when opening a synchronized Realm with the client - reset mode set to `discardLocal` on one thread at the same time as a client - reset was being processed on another thread. This probably did not cause any - functional problems in practice and the broken timing window was very tight (since 10.25.0). -* If an async open of a Realm triggered a client reset, the callbacks for - `discardLocal` could theoretically fail to be called due to a race condition. - The timing for this was probably not possible to hit in practice (since 10.25.0). -* Calling `[RLMRealm freeze]`/`Realm.freeze` on a Realm which had been created from `writeCopy` - would not produce a frozen Realm. ([#7697](https://github.com/realm/realm-swift/issues/7697), since v5.0.0) -* Using the dynamic subscript API on unmanaged objects before first opening a - Realm or if `objectTypes` was set when opening a Realm would throw an - exception ([#7786](https://github.com/realm/realm-swift/issues/7786)). -* The sync client may have sent a corrupted upload cursor leading to a fatal - error from the server due to an uninitialized variable. - ([#5460](https://github.com/realm/realm-core/pull/5460), since v10.25.1) -* Flexible sync would not correctly resume syncing if a bootstrap was interrupted - ([#5466](https://github.com/realm/realm-core/pull/5466), since v10.21.1). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-13.4. - -### Internal - -* Upgraded realm-core from v11.15.0 to v11.17.0 - -10.25.2 Release notes (2022-04-27) -============================================================= - -### Enhancements - -* Replace Xcode 13.3 binaries with 13.3.1 binaries. - -### Fixed - -* `List` would contain an invalidated object instead of null when - the object linked to was deleted by a difference sync client - ([Core #5215](https://github.com/realm/realm-core/pull/5215), since v10.8.0). -* Adding an object to a Set, deleting the parent object of the Set, and then - deleting the object which was added to the Set would crash - ([Core #5387](https://github.com/realm/realm-core/issues/5387), since v10.8.0). -* Synchronized Realm files which were first created using v10.0.0-beta.3 would - be redownloaded instead of using the existing file, possibly resulting in the - loss of any unsynchronized data in those files (since v10.20.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3.1. - -### Internal - -* Upgraded realm-core from v11.14.0 to v11.15.0 - -10.25.1 Release notes (2022-04-11) -============================================================= - -### Fixed - -* Fixed various memory corruption bugs when encryption is used caused by not - locking a mutex when needed. - ([#7640](https://github.com/realm/realm-swift/issues/7640), [#7659](https://github.com/realm/realm-swift/issues/7659), since v10.21.1) -* Changeset upload batching did not calculate the accumulated size correctly, - resulting in “error reading body failed to read: read limited at 16777217 - bytes” errors from the server when writing large amounts of data - ([Core #5373](https://github.com/realm/realm-core/pull/5373), since 10.25.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3. - -### Internal - -* Upgraded realm-core from v11.13.0 to v11.14.0. - -10.25.0 Release notes (2022-03-29) -============================================================= - -Synchronized Realm files written by this version cannot be opened by older -versions of Realm. Existing files will be automatically upgraded when opened. - -Non-synchronized Realm files remain backwards-compatible. - -### Enhancements - -* Add ability to use Swift Query syntax in `@ObservedResults`, which allows you - to filter results using the `where` parameter. -* Add ability to use `MutableSet` with `StateRealmObject` in SwiftUI. -* Async/Await extensions are now compatible with iOS 13 and above when building - with Xcode 13.3. -* Sync changesets waiting to be uploaded to the server are now compressed, - reducing the disk space needed when large write transactions are performed - while offline or limited in bandwidth.([Core #5260](https://github.com/realm/realm-core/pull/5260)). -* Added new `SyncConfiguration.clientResetMode` and `RLMSyncConfiguration.clientResetMode` properties. - - The values of these properties will dictate client behavior in the event of a [client reset](https://docs.mongodb.com/realm/sync/error-handling/client-resets/). - - See below for information on `ClientResetMode` values. - - `clientResetMode` defaults to `.manual` if not set otherwise. -* Added new `ClientResetMode` and `RLMClientResetMode` enums. - - These enums represent possible client reset behavior for `SyncConfiguration.clientResetMode` and `RLMSyncConfiguration.clientResetMode`, respectively. - - `.manual` and `RLMClientResetModeManual` - - The local copy of the Realm is copied into a recovery - directory for safekeeping, and then deleted from the original location. The next time - the Realm for that partition value is opened, the Realm will automatically be re-downloaded from - MongoDB Realm, and can be used as normal. - - Data written to the Realm after the local copy of the Realm diverged from the backup - remote copy will be present in the local recovery copy of the Realm file. The - re-downloaded Realm will initially contain only the data present at the time the Realm - was backed up on the server. - - `rlmSync_clientResetBackedUpRealmPath` and `SyncError.clientResetInfo()` are used for accessing the recovery directory. - - `.discardLocal` and `RLMClientResetDiscardLocal` - - All unsynchronized local changes are automatically discarded and the local state is - automatically reverted to the most recent state from the server. Unsynchronized changes - can then be recovered in a post-client-reset callback block (See changelog below for more details). - - If RLMClientResetModeDiscardLocal is enabled but the client reset operation is unable to complete - then the client reset process reverts to manual mode. - - The realm's underlying object accessors remain bound so the UI may be updated in a non-disruptive way. -* Added support for client reset notification blocks for `.discardLocal` and `RLMClientResetDiscardLocal` - - **RealmSwift implementation**: `discardLocal(((Realm) -> Void)? = nil, ((Realm, Realm) -> Void)? = nil)` - - RealmSwift client reset blocks are set when initializing the user configuration - ```swift - var configuration = user.configuration(partitionValue: "myPartition", clientResetMode: .discardLocal(beforeClientResetBlock, afterClientResetBlock)) - ``` - - The before client reset block -- `((Realm) -> Void)? = nil` -- is executed prior to a client reset. Possible usage includes: - ```swift - let beforeClientResetBlock: (Realm) -> Void = { beforeRealm in - var recoveryConfig = Realm.Configuration() - recoveryConfig.fileURL = myRecoveryPath - do { - beforeRealm.writeCopy(configuration: recoveryConfig) - /* The copied realm could be used later for recovery, debugging, reporting, etc. */ - } catch { - /* handle error */ - } - } - ``` - - The after client reset block -- `((Realm, Realm) -> Void)? = nil)` -- is executed after a client reset. Possible usage includes: - ```Swift - let afterClientResetBlock: (Realm, Realm) -> Void = { before, after in - /* This block could be used to add custom recovery logic, back-up a realm file, send reporting, etc. */ - for object in before.objects(myClass.self) { - let res = after.objects(myClass.self) - if (res.filter("primaryKey == %@", object.primaryKey).first != nil) { - /* ...custom recovery logic... */ - } else { - /* ...custom recovery logic... */ - } - } - ``` - - **Realm Obj-c implementation**: Both before and after client reset callbacks exist as properties on `RLMSyncConfiguration` and are set at initialization. - ```objective-c - RLMRealmConfiguration *config = [user configurationWithPartitionValue:partitionValue - clientResetMode:RLMClientResetModeDiscardLocal - notifyBeforeReset:beforeBlock - notifyAfterReset:afterBlock]; - ``` - where `beforeBlock` is of type `RLMClientResetBeforeBlock`. And `afterBlock` is of type `RLMClientResetAfterBlock`. - -### Breaking Changes - -* Xcode 13.2 is no longer supported when building with Async/Await functions. Use - Xcode 13.3 to build with Async/Await functionality. - -### Fixed - -* Adding a Realm Object to a `ObservedResults` or a collections using - `StateRealmObject` that is managed by the same Realm would throw if the - Object was frozen and not thawed before hand. -* Setting a Realm Configuration for @ObservedResults using it's initializer - would be overrode by the Realm Configuration stored in - `.environment(\.realmConfiguration, ...)` if they did not match - ([Cocoa #7463](https://github.com/realm/realm-swift/issues/7463), since v10.6.0). -* Fix searchable component filter overriding the initial filter on `@ObservedResults`, (since v10.23.0). -* Comparing `Results`, `LinkingObjects` or `AnyRealmCollection` when using Realm via XCFramework - would result in compile time errors ([Cocoa #7615](https://github.com/realm/realm-swift/issues/7615), since v10.21.0) -* Opening an encrypted Realm while the keychain is locked on macOS would crash - ([#7438](https://github.com/realm/realm-swift/issues/7438)). -* Updating subscriptions while refreshing the access token would crash - ([Core #5343](https://github.com/realm/realm-core/issues/5343), since v10.22.0) -* Fix several race conditions in `SyncSession` related to setting - `customRequestHeaders` while using the `SyncSession` on a different thread. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3. - -### Internal - -* Upgraded realm-core from v11.12.0 to v11.13.0 - -10.24.2 Release notes (2022-03-18) -============================================================= - -### Fixed - -* Application would sometimes crash with exceptions like 'KeyNotFound' or - assertion "has_refs()". Other issues indicating file corruption may also be - fixed by this. The one mentioned here is the one that lead to solving the - problem. - ([Core #5283](https://github.com/realm/realm-core/issues/5283), since v5.0.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3. - -### Internal - -* Upgraded realm-core from 11.11.0 to 11.12.0 - -10.24.1 Release notes (2022-03-14) -============================================================= - -Switch to building the Carthage binary with Xcode 13.3. This release contains -no functional changes from 10.24.0. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3. - -10.24.0 Release notes (2022-03-05) -============================================================= - -### Enhancements - -* Add ability to use Swift Query syntax in `@ObservedResults`, which allows you - to filter results using the `where` parameter. - -### Fixed - -* If a list of objects contains links to objects not included in the - synchronized partition, collection change notifications for that list could - be incorrect ([Core #5164](https://github.com/realm/realm-core/issues/5164), since v10.0.0). -* Adding a new flexible sync subscription could crash with - "Assertion failed: !m_unbind_message_sent" in very specific timing scenarios - ([Core #5149](https://github.com/realm/realm-core/pull/5149), since v10.22.0). -* Converting floats/doubles into Decimal128 would yield imprecise results - ([Core #5184](https://github.com/realm/realm-core/pull/5184), since v10.0.0) -* Using accented characters in class and field names in a synchronized Realm - could result in sync errors ([Core #5196](https://github.com/realm/realm-core/pull/5196), since v10.0.0). -* Calling `Realm.invalidate()` from inside a Realm change notification could - result in the write transaction which produced the notification not being - persisted to disk (since v10.22.0). -* When a client reset error which results in the current Realm file being - backed up and then deleted, deletion errors were ignored as long as the copy - succeeded. When this happens the deletion of the old file is now scheduled - for the next launch of the app. ([Core #5180](https://github.com/realm/realm-core/issues/5180), since v2.0.0) -* Fix an error when compiling a watchOS Simulator target not supporting - Thread-local storage ([#7623](https://github.com/realm/realm-swift/issues/7623), since v10.21.0). -* Add a validation check to report a sensible error if a Realm configuration - indicates that an in-memory Realm should be encrypted. ([Core #5195](https://github.com/realm/realm-core/issues/5195)) -* The Swift package set the linker flags on the wrong target, resulting in - linker errors when SPM decides to build the core library as a dynamic library - ([#7266](https://github.com/realm/realm-swift/issues/7266)). -* The download-core task failed if run in an environment without TMPDIR set - ([#7688](https://github.com/realm/realm-swift/issues/7688), since v10.23.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3 beta 3. - -### Internal - -* Upgraded realm-core from 11.9.0 to 11.11.0 - -10.23.0 Release notes (2022-02-28) -============================================================= - -### Enhancements - -* Add `Realm.writeCopy(configuration:)`/`[RLMRealm writeCopyForConfiguration:]` which gives the - following functionality: - - Export a local non-sync Realm to be used with MongoDB Realm Sync - when the configuration is derived from a sync `RLMUser`/`User`. - - Write a copy of a local Realm to a destination specified in the configuration. - - Write a copy of a synced Realm in use with user A, and open it with user B. - - Note that migrations may be required when using a local realm configuration to open a realm file that - was copied from a synchronized realm. - - An exception will be thrown if a Realm exists at the destination. -* Add a `seedFilePath` option to `RLMRealmConfiguration` and `Configuration`. If this - option is set then instead of creating an empty Realm, the realm at the `seedFilePath` will - be copied to the `fileURL` of the new Realm. If a Realm file already exists at the - desitnation path, the seed file will not be copied and the already existing Realm - will be opened instead. Note that to use this parameter with a synced Realm configuration - the seed Realm must be appropriately copied to a destination with - `Realm.writeCopy(configuration:)`/`[RLMRealm writeCopyForConfiguration:]` first. -* Add ability to permanently delete a User from a MongoDB Realm app. This can - be invoked with `User.delete()`/`[RLMUser deleteWithCompletion:]`. -* Add `NSCopying` conformance to `RLMDecimal128` and `RLMObjectId`. -* Add Xcode 13.3 binaries to the release package (and remove 13.0). - -### Fixed - -* Add support of arm64 in Carthage build ([#7154](https://github.com/realm/realm-cocoa/issues/7154) -* Adding missing support for `IN` queries to primitives types on Type Safe Queries. - ```swift - let persons = realm.objects(Person.self).where { - let acceptableNames = ["Tom", "James", "Tyler"] - $0.name.in([acceptableNames]) - } - ``` - ([Cocoa #7633](https://github.com/realm/realm-swift/issues/7633), since v10.19.0) -* Work around a compiler crash when building with Swift 5.6 / Xcode 13.3. - CustomPersistable's PersistedType must now always be a built-in type rather - than possibly another CustomPersistable type as Swift 5.6 has removed support - for infinitely-recursive associated types ([#7654](https://github.com/realm/realm-swift/issues/7654)). -* Fix redundant call to filter on `@ObservedResults` from `searchable` - component (since v10.19.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3 beta 3. - -10.22.0 Release notes (2022-01-25) -============================================================= - -### Enhancements - -* Add beta support for flexible sync. See the [backend](https://docs.mongodb.com/realm/sync/data-access-patterns/flexible-sync/) and [SDK](https://docs.mongodb.com/realm/sdk/swift/examples/flexible-sync/) documentation for more information. Please report any issues with the beta through Github. - -### Fixed - -* UserIdentity metadata table grows indefinitely. ([#5152](https://github.com/realm/realm-core/issues/5152), since v10.20.0) -* We now report a useful error message when opening a sync Realm in non-sync mode or vice-versa.([#5161](https://github.com/realm/realm-core/pull/5161), since v5.0.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.2.1. - -### Internal - -* Upgraded realm-core from 11.8.0 to 11.9.0 - -10.21.1 Release notes (2022-01-12) -============================================================= - -### Fixed - -* The sync client will now drain the receive queue when a send fails with - ECONNRESET, ensuring that any error message from the server gets received and - processed. ([#5078](https://github.com/realm/realm-core/pull/5078)) -* Schema validation was missing for embedded objects in sets, resulting in an - unhelpful error being thrown if a Realm object subclass contained one (since v10.0.0). -* Opening a Realm with a schema that has an orphaned embedded object type - performed an extra empty write transaction (since v10.0.0). -* Freezing a Realm with a schema that has orphaned embedded object types threw - a "Wrong transactional state" exception (since v10.19.0). -* `@sum` and `@avg` queries on Dictionaries of floats or doubles used too much - precision for intermediates, resulting in incorrect rounding (since v10.5.0). -* Change the exception message for calling refresh on an immutable Realm from - "Continuous transaction through DB object without history information." to - "Can't refresh a read-only Realm." - ([#5061](https://github.com/realm/realm-core/issues/5061), since v10.8.0). -* Queries of the form "link.collection.@sum = 0" where `link` is null matched - when `collection` was a List or Set, but not a Dictionary - ([#5080](https://github.com/realm/realm-core/pull/5080), since v10.8.0). -* Types which require custom obj-c bridging (such as `PersistableEnum` or - `CustomPersistable`) would crash with exceptions mentioning `__SwiftValue` in - a variety of places on iOS versions older than iOS 14 - ([#7604](https://github.com/realm/realm-swift/issues/7604), since v10.21.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.2.1. - -### Internal - -* Upgraded realm-core from 11.6.1 to 11.8.0. - -10.21.0 Release notes (2022-01-10) -============================================================= - -### Enhancements - -* Add `metadata` property to `RLMUserProfile`/`UserProfile`. -* Add class `Projection` to allow creation of light weight view models out of Realm Objects. -```swift -public class Person: Object { - @Persisted var firstName = "" - @Persisted var lastName = "" - @Persisted var address: Address? = nil - @Persisted var friends = List() -} - -public class Address: EmbeddedObject { - @Persisted var city: String = "" - @Persisted var country = "" -} - -class PersonProjection: Projection { - // `Person.firstName` will have same name and type - @Projected(\Person.firstName) var firstName - // There will be the only String for `city` of the original object `Address` - @Projected(\Person.address.city) var homeCity - // List will be mapped to list of firstNames - @Projected(\Person.friends.projectTo.firstName) var firstFriendsName: ProjectedCollection -} - -// `people` will contain projections for every `Person` object in the `realm` -let people: Results = realm.objects(PersonProjection.self) -``` -* Greatly improve performance of reading AnyRealmValue and enum types from - Realm collections. -* Allow using Swift enums which conform to `PersistableEnum` as the value type - for all Realm collections. -* `AnyRealmCollection` now conforms to `Encodable`. -* AnyRealmValue and PersistableEnum values can now be passed directly to an - NSPredicate used in a filter() call rather than having to pass the rawValue - (the rawValue is still allowed). -* Queries on collections of PersistableEnums can now be performed with `where()`. -* Add support for querying on the rawValue of an enum with `where()`. -* `.count` is supported for Maps of all types rather than just numeric types in `where()`. -* Add support for querying on the properties of objects contained in - dictionaries (e.g. "dictProperty.@allValues.name CONTAINS 'a'"). -* Improve the error message for many types of invalid predicates in queries. -* Add support for comparing `@allKeys` to another property on the same object. -* Add `Numeric` conformance to `Decimal128`. -* Make some invalid property declarations such as `List` a - compile-time error instead of a runtime error. -* Calling `.sorted(byKeyPath:)` on a collection with an Element type which does - not support sorting by keypaths is now a compile-time error instead of a - runtime error. -* `RealmCollection.sorted(ascending:)` can now be called on all - non-Object/EmbeddedObject collections rather than only ones where the - `Element` conforms to `Comparable`. -* Add support for using user-defined types with `@Persistable` and in Realm - collections by defining a mapping to and from a type which Realm knows how to - store. For example, `URL` can be made persistable with: - ```swift - extension URL: FailableCustomPersistable { - // Store URL values as a String in Realm - public typealias PersistedType = String - // Convert a String to a URL - public init?(persistedValue: String) { self.init(string: persistedValue) } - // Convert a URL to a String - public var persistableValue: String { self.absoluteString } - } - ``` - After doing this, `@Persisted var url: URL` is a valid property declaration - on a Realm object. More advanced mappings can be done by mapping to an - EmbeddedObject which can store multiple values. - -### Fixed - -* Accessing a non object collection inside a migration would cause a crash -* [#5633](https://github.com/realm/realm-cocoa/issues/5633). -* Accessing a `Map` of objects dynamically would not handle nulled values correctly (since v10.8.0). -* `where()` allowed constructing some nonsensical queries due to boolean - comparisons returning `Query` rather than `Query` (since v10.19.0). -* `@allValues` queries on dictionaries accidentally did not require "ANY". -* Case-insensitive and diacritic-insensitive modifiers were ignored when - comparing the result of an aggregate operation to another property in a - query. -* `Object.init(value:)` did not allow initializing `RLMDictionary`/`Map` - properties with null values for map entries (since v10.8.0). -* `@ObservedResults` did not refresh when changes were made to the observed - collection. (since v10.6.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.2.1. - -10.20.1 Release notes (2021-12-14) -============================================================= - -Xcode 12.4 is now the minimum supported version of Xcode. - -### Fixed - -* Add missing `Indexable` support for UUID. - ([Cocoa #7545](https://github.com/realm/realm-swift/issues/7545), since v10.10.0) - -### Breaking Changes - -* All `async` functions now require Xcode 13.2 to work around an App - Store/TestFlight bug that results in apps built with 13.0/13.1 which do not - use libConcurrency but link a library which does crashing on startup. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.2. - -10.20.0 Release notes (2021-11-16) -============================================================= - -### Enhancements - -* Conform `@ThreadSafe` and `ThreadSafeReference` to `Sendable`. -* Allow using Swift enums which conform to `PersistableEnum` as the value type - for all Realm collections. -* `AnyRealmCollection` now conforms to `Encodable`. -* Greatly improve performance of reading AnyRealmValue and enum types from - Realm collections. -* `AnyRealmCollection` now conforms to `Encodable`. - -### Fixed - -* `@AutoOpen` will open the existing local Realm file on any connection error - rather than only when the connection specifically times out. -* Do not allow `progress` state changes for `@AutoOpen` and `@AsyncOpen` after - changing state to `open(let realm)` or `error(let error)`. -* Logging out a sync user failed to remove the local Realm file for partitions - with very long partition values that would have exceeded the maximum path - length. ([Core #4187](https://github.com/realm/realm-core/issues/4187), since v10.0.0) -* Don't keep trying to refresh the access token if the client's clock is more - than 30 minutes fast. ([Core #4941](https://github.com/realm/realm-core/issues/4941)) -* Failed auth requests used a fixed long sleep rather than exponential backoff - like other sync requests, which could result in very delayed reconnects after - a device was offline long enough for the access token to expire (since v10.0.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.1. - -### Internal - -* Upgraded realm-core from 11.6.0 to 11.6.1. - -10.19.0 Release notes (2021-11-04) -============================================================= - -### Enhancements - -* Add `.searchable()` SwiftUI View Modifier which allows filtering - `@ObservedResult` results from a search field component by a key path. - ```swift - List { - ForEach(reminders) { reminder in - ReminderRowView(reminder: reminder) - } - }.searchable(text: $searchFilter, - collection: $reminders, - keyPath: \.name) { - ForEach(reminders) { remindersFiltered in - Text(remindersFiltered.name).searchCompletion(remindersFiltered.name) - } - } - ``` -* Add an API for a type safe query syntax. This allows you to filter a Realm - and collections managed by a Realm with Swift style expressions. Here is a - brief example: - ```swift - class Person: Object { - @Persisted var name: String - @Persisted var hobbies: MutableSet - @Persisted var pets: List - } - class Pet: Object { - @Persisted var name: String - @Persisted var age: Int - } - - let persons = realm.objects(Person.self).where { - $0.hobbies.contains("music") || $0.hobbies.contains("baseball") - } - - persons = realm.objects(Person.self).where { - ($0.pets.age >= 2) && $0.pets.name.starts(with: "L") - } - ``` - ([#7419](https://github.com/realm/realm-swift/pull/7419)) -* Add support for dictionary subscript expressions - (e.g. `"phoneNumbers['Jane'] == '123-3456-123'"`) when querying with an - NSPredicate. -* Add UserProfile to User. This contains metadata from social logins with MongoDB Realm. -* Slightly reduce the peak memory usage when processing sync changesets. - -### Fixed - -* Change default request timeout for `RLMApp` from 6 seconds to 60 seconds. -* Async `Realm` init would often give a Realm instance which could not actually - be used and would throw incorrect thread exceptions. It now is `@MainActor` - and gives a Realm instance which always works on the main actor. The - non-functional `queue:` parameter has been removed (since v10.15.0). -* Restore the pre-v10.12.0 behavior of calling `writeCopy()` on a synchronized - Realm which produced a local non-synchronized Realm - ([#7513](https://github.com/realm/realm-swift/issues/7513)). -* Decimal128 did not properly normalize the value before hashing and so could - have multiple values which are equal but had different hash values (since v10.8.0). -* Fix a rare assertion failure or deadlock when a sync session is racing to - close at the same time that external reference to the Realm is being - released. ([Core #4931](https://github.com/realm/realm-core/issues/4931)) -* Fix a assertion failure when opening a sync Realm with a user who had been - removed. Instead an exception will be thrown. ([Core #4937](https://github.com/realm/realm-core/issues/4937), since v10.0.0) -* Fixed a rare segfault which could trigger if a user was being logged out - while the access token refresh response comes in. - ([Core #4944](https://github.com/realm/realm-core/issues/4944), since v10.0.0) -* Fixed a bug where progress notifiers on an AsyncOpenTask could be called - after the open completed. ([Core #4919](https://github.com/realm/realm-core/issues/4919)) -* SecureTransport was not enabled for macCatalyst builds when installing via - SPM, resulting in `'SSL/TLS protocol not supported'` exceptions when using - Realm Sync. ([#7474](https://github.com/realm/realm-swift/issues/7474)) -* Users were left in the logged in state when their refresh token expired. - ([Core #4882](https://github.com/realm/realm-core/issues/4882), since v10) -* Calling `.count` on a distinct collection would return the total number of - objects in the collection rather than the distinct count the first time it is - called. ([#7481](https://github.com/realm/realm-swift/issues/7481), since v10.8.0). -* `realm.delete(collection.distinct(...))` would delete all objects in the - collection rather than just the first object with each distinct value in the - property being distincted on, unless the distinct Results were read from at - least once first (since v10.8.0). -* Calling `.distinct()` on a collection, accessing the Results, then passing - the Results to `realm.delete()` would delete the correct objects, but - afterwards report a count of zero even if there were still objects in the - Results (since v10.8.0). -* Download compaction could result in non-streaming sync download notifiers - never reporting completion (since v10.0.0, - [Core #4989](https://github.com/realm/realm-core/pull/4989)). -* Fix a deadlock in SyncManager that was probably not possible to hit in - real-world code (since v10.0.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.2. - -### Internal - -* Upgraded realm-core from v11.4.1 to v11.6.0 - -10.18.0 Release notes (2021-10-25) -============================================================= - -### Enhancements - -* Add support for using multiple users with `@AsyncOpen` and `@AutoOpen`. - Setting the current user to a new user will now automatically reopen the - Realm with the new user. -* Add prebuilt binary for Xcode 13.1 to the release package. - -### Fixed - -* Fix `@AsyncOpen` and `@AutoOpen` using `defaultConfiguration` by default if - the user's doesn't provide one, will set an incorrect path which doesn't - correspond to the users configuration one. (since v10.12.0) -* Adding missing subscription completion for `AsyncOpenPublisher` after - successfully returning a realm. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.1. - -10.17.0 Release notes (2021-10-06) -============================================================= - -### Enhancements - -* Add a new `@ThreadSafe` property wrapper. Objects and collections wrapped by `@ThreadSafe` may be passed between threads. It's - intended to allow local variables and function parameters to be used across - threads when needed. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.0. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0. - -10.16.0 Release notes (2021-09-29) -============================================================= - -### Enhancements - -* Add `async` versions of `EmailPasswordAuth.callResetPasswordFunction` and -r `User.linkUser` methods. -* Add `async` version of `MongoCollection` methods. -* Add `async` support for user functions. - -### Fixed - -* A race condition in Realm.asyncOpen() sometimes resulted in subsequent writes - from Realm Sync failing to produce notifications - ([#7447](https://github.com/realm/realm-swift/issues/7447), - [#7453](https://github.com/realm/realm-swift/issues/7453), - [Core #4909](https://github.com/realm/realm-core/issues/4909), since v10.15.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.0. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0. - -10.15.1 Release notes (2021-09-15) -============================================================= - -### Enhancements - -* Switch to building the Carthage release with Xcode 13. - -### Fixed - -* Fix compilation error where Swift 5.5 is available but the macOS 12 SDK was - not. This was notable for the Xcode 13 RC. This fix adds a #canImport check - for the `_Concurrency` module that was not available before the macOS 12 SDK. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.0. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0. - -10.15.0 Release notes (2021-09-10) -============================================================= - -### Enhancements - -* Add `async` versions of the `Realm.asyncOpen` and `App.login` methods. -* ThreadSafeReference no longer pins the source transaction version for - anything other than a Results created by filtering a collection. This means - that holding on to thread-safe references to other things (such as Objects) - will no longer cause file size growth. -* A ThreadSafeReference to a Results backed by a collection can now be created - inside a write transaction as long as the collection was not created in the - current write transaction. -* Synchronized Realms are no longer opened twice, cutting the address space and - file descriptors used in half. - ([Core #4839](https://github.com/realm/realm-core/pull/4839)) -* When using the SwiftUI helper types (@ObservedRealmObject and friends) to - bind to an Equatable property, self-assignment no longer performs a pointless - write transaction. SwiftUI appears to sometimes call a Binding's set function - multiple times for a single UI action, so this results in significantly fewer - writes being performed. - -### Fixed - -* Adding an unmanaged object to a Realm that was declared with - `@StateRealmObject` would throw the exception `"Cannot add an object with - observers to a Realm"`. -* The `RealmCollectionChange` docs refered to indicies in modifications as the - 'new' collection. This is incorrect and the docs now state that modifications - refer to the previous version of the collection. ([Cocoa #7390](https://github.com/realm/realm-swift/issues/7390)) -* Fix crash in `RLMSyncConfiguration.initWithUser` error mapping when a user is disabled/deleted from MongoDB Realm dashboard. - ([Cocoa #7399](https://github.com/realm/realm-swift/issues/7399), since v10.0.0) -* If the application crashed at the wrong point when logging a user in, the - next run of the application could hit the assertion failure "m_state == - SyncUser::State::LoggedIn" when a synchronized Realm is opened with that - user. ([Core #4875](https://github.com/realm/realm-core/issues/4875), since v10.0.0) -* The `keyPaths:` parameter to `@ObservedResults` did not work (since v10.12.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 5. - -### Internal - -* Upgraded realm-core from 11.3.1 to 11.4.1 - -10.14.0 Release notes (2021-09-03) -============================================================= - -### Enhancements - -* Add additional `observe` methods for Objects and RealmCollections which take - a `PartialKeyPath` type key path parameter. -* The release package once again contains Xcode 13 binaries. -* `PersistableEnum` properties can now be indexed or used as the primary key if - the RawValue is an indexable or primary key type. - -### Fixed - -* `Map` did not conform to `Codable`. - ([Cocoa #7418](https://github.com/realm/realm-swift/pull/7418), since v10.8.0) -* Fixed "Invalid data type" assertion failure in the sync client when the - client recieved an AddColumn instruction from the server for an AnyRealmValue - property when that property already exists locally. ([Core #4873](https://github.com/realm/realm-core/issues/4873), since v10.8.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 5. - -### Internal - -* Upgraded realm-core from 11.3.0 to 11.3.1. - -10.13.0 Release notes (2021-08-26) -============================================================= - -### Enhancements - -* Sync logs now contain information about what object/changeset was being applied when the exception was thrown. - ([Core #4836](https://github.com/realm/realm-core/issues/4836)) -* Added ServiceErrorCode for wrong username/password when using '`App.login`. - ([Core #7380](https://github.com/realm/realm-swift/issues/7380) - -### Fixed - -* Fix crash in `MongoCollection.findOneDocument(filter:)` that occurred when no results were - found for a given filter. - ([Cocoa #7380](https://github.com/realm/realm-swift/issues/7380), since v10.0.0) -* Some of the SwiftUI property wrappers incorrectly required objects to conform - to ObjectKeyIdentifiable rather than Identifiable. - ([Cocoa #7372](https://github.com/realm/realm-swift/issues/7372), since v10.6.0) -* Work around Xcode 13 beta 3+ shipping a broken swiftinterface file for Combine on 32-bit iOS. - ([Cocoa #7368](https://github.com/realm/realm-swift/issues/7368)) -* Fixes history corruption when replacing an embedded object in a list. - ([Core #4845](https://github.com/realm/realm-core/issues/4845)), since v10.0.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 5. - -### Internal - -* Upgraded realm-core from 11.2.0 to 11.3.0 - -10.12.0 Release notes (2021-08-03) -============================================================= - -### Enhancements - -* `Object.observe()` and `RealmCollection.observe()` now include an optional - `keyPaths` parameter which filters change notifications to those only - occurring on the provided key path or key paths. See method documentation - for extended detail on filtering behavior. -* `ObservedResults` now includes an optional `keyPaths` parameter - which filters change notifications to those only occurring on the provided - key path or key paths. ex) `@ObservedResults(MyObject.self, keyPaths: ["myList.property"])` -* Add two new property wrappers for opening a Realm asynchronously in a - SwiftUI View: - - `AsyncOpen` is a property wrapper that initiates Realm.asyncOpen - for the current user, notifying the view when there is a change in Realm asyncOpen state. - - `AutoOpen` behaves similarly to `AsyncOpen`, but in the case of no internet - connection this will return an opened realm. -* Add `EnvironmentValues.partitionValue`. This value can be injected into any view using one of - our new property wrappers `AsyncOpen` and `AutoOpen`: - `MyView().environment(\.partitionValue, "partitionValue")`. -* Shift more of the work done when first initializing a collection notifier to - the background worker thread rather than doing it on the main thread. - -### Fixed - -* `configuration(partitionValue: AnyBSON)` would always set a nil partition value - for the user sync configuration. -* Decoding a `@Persisted` property would incorrectly throw a `DecodingError.keyNotFound` - for an optional property if the key is missing. - ([Cocoa #7358](https://github.com/realm/realm-swift/issues/7358), since v10.10.0) -* Fixed a symlink which prevented Realm from building on case sensitive file systems. - ([#7344](https://github.com/realm/realm-swift/issues/7344), since v10.8.0) -* Removing a change callback from a Results would sometimes block the calling - thread while the query for that Results was running on the background worker - thread (since v10.11.0). -* Object observers did not handle the object being deleted properly, which - could result in assertion failures mentioning "m_table" in ObjectNotifier - ([Core #4824](https://github.com/realm/realm-core/issues/4824), since v10.11.0). -* Fixed a crash when delivering notifications over a nested hierarchy of lists - of Mixed that contain links. ([Core #4803](https://github.com/realm/realm-core/issues/4803), since v10.8.0) -* Fixed a crash when an object which is linked to by a Mixed is deleted via - sync. ([Core #4828](https://github.com/realm/realm-core/pull/4828), since v10.8.0) -* Fixed a rare crash when setting a mixed link for the first time which would - trigger if the link was to the same table and adding the backlink column - caused a BPNode split. ([Core #4828](https://github.com/realm/realm-core/pull/4828), since v10.8.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 4. On iOS Xcode 13 beta 2 is the latest supported - version due to betas 3 and 4 having a broken Combine.framework. - -### Internal - -* Upgraded realm-core from v11.1.1 to v11.2.0 - -10.11.0 Release notes (2021-07-22) -============================================================= - -### Enhancements - -* Add type safe methods for: - - `RealmCollection.min(of:)` - - `RealmCollection.max(of:)` - - `RealmCollection.average(of:)` - - `RealmCollection.sum(of:)` - - `RealmCollection.sorted(by:ascending:)` - - `RealmKeyedCollection.min(of:)` - - `RealmKeyedCollection.max(of:)` - - `RealmKeyedCollection.average(of:)` - - `RealmKeyedCollection.sum(of:)` - - `RealmKeyedCollection.sorted(by:ascending:)` - - `Results.distinct(by:)` - - `SortDescriptor(keyPath:ascending:) - - Calling these methods can now be done via Swift keyPaths, like so: - ```swift - class Person: Object { - @Persisted var name: String - @Persisted var age: Int - } - - let persons = realm.objects(Person.self) - persons.min(of: \.age) - persons.max(of: \.age) - persons.average(of: \.age) - persons.sum(of: \.age) - persons.sorted(by: \.age) - persons.sorted(by: [SortDescriptor(keyPath: \Person.age)]) - persons.distinct(by: [\Person.age]) - ``` -* Add `List.objects(at indexes:)` in Swift and `[RLMCollection objectsAtIndexes:]` in Objective-C. - This allows you to select elements in a collection with a given IndexSet ([#7298](https://github.com/realm/realm-swift/issues/7298)). -* Add `App.emailPasswordAuth.retryCustomConfirmation(email:completion:)` and `[App.emailPasswordAuth retryCustomConfirmation:completion:]`. - These functions support retrying a [custom confirmation](https://docs.mongodb.com/realm/authentication/email-password/#run-a-confirmation-function) function. -* Improve performance of creating collection notifiers for Realms with a complex schema. - This means that the first run of a query or first call to observe() on a collection will - do significantly less work on the calling thread. -* Improve performance of calculating changesets for notifications, particularly - for deeply nested object graphs and objects which have List or Set properties - with small numbers of objects in the collection. - -### Fixed - -* `RealmProperty` would crash when decoding a `null` json value. - ([Cocoa #7323](https://github.com/realm/realm-swift/issues/7323), since v10.8.0) -* `@Persisted` would crash when decoding a `null` value. - ([#7332](https://github.com/realm/realm-swift/issues/7332), since v10.10.0). -* Fixed an issue where `Realm.Configuration` would be set after views have been laid out - when using `.environment(\.realmConfiguration, ...)` in SwiftUI. This would cause issues if you are - required to bump your schema version and are using `@ObservedResults`. -* Sync user profiles now correctly persist between runs. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 3. Note that this release does not contain Xcode 13 - beta binaries as beta 3 does not include a working version of - Combine.framework for iOS. - -### Internal - -* Upgraded realm-core from 11.0.4 to 11.1.1 - -10.10.0 Release notes (2021-07-07) -============================================================= - -### Enhancements - -* Add a new property wrapper-based declaration syntax for properties on Realm - Swift object classes. Rather than using `@objc dynamic` or the - `RealmProperty` wrapper type, properties can now be declared with `@Persisted - var property: T`, where `T` is any of the supported property types, including - optional numbers and collections. This has a few benefits: - - - All property types are now declared in the same way. No more remembering - that this type requires `@objc dynamic var` while this other type - requires `let`, and the `RealmProperty` or `RealmOptional` helper is no - longer needed for types not supported by Objective-C. - - No more overriding class methods like `primaryKey()`, - `indexedProperties()` or `ignoredProperties()`. The primary key and - indexed flags are set directly in the property declaration with - `@Persisted(primaryKey: true) var _id: ObjectId` or `@Persisted(indexed: - true) var indexedProperty: Int`. If any `@Persisted` properties are present, - all other properties are implicitly ignored. - - Some performance problems have been fixed. Declaring collection - properties as `let listProp = List()` resulted in the `List` object - being created eagerly when the parent object is read, which could cause - performance problems if a class has a large number of `List` or - `RealmOptional` properties. `@Persisted var list: List` allows us to - defer creating the `List` until it's accessed, improving performance - when looping over objects and using only some of the properties. - - Similarly, `let _id = ObjectId.generate()` was a convenient way to - declare a sync-compatible primary key, but resulted in new ObjectIds - being generated in some scenarios where the value would never actually be - used. `@Persisted var _id: ObjectId` has the same behavior of - automatically generating primary keys, but allows us to only generate it - when actually needed. - - More types of enums are supported. Any `RawRepresentable` enum whose raw - type is a type supported by Realm can be stored in an `@Persisted` - project, rather than just `@objc` enums. Enums must be declared as - conforming to the `PersistableEnum` protocol, and still cannot (yet) be - used in collections. - - `willSet` and `didSet` can be used with `@Persistable` properties, while - they previously did not work on managed Realm objects. - - While we expect the switch to the new syntax to be very simple for most - users, we plan to support the existing objc-based declaration syntax for the - foreseeable future. The new style and old style cannot be mixed within a - single class, but new classes can use the new syntax while existing classes - continue to use the old syntax. Updating an existing class to the new syntax - does not change what data is stored in the Realm file and so does not require - a migration (as long as you don't also change the schema in the process, of - course). -* Add `Map.merge()`, which adds the key-value pairs from another Map or - Dictionary to the map. -* Add `Map.asKeyValueSequence()` which returns an adaptor that can be used with - generic functions that operate on Dictionary-styled sequences. - -### Fixed -* AnyRealmValue enum values are now supported in more places when creating - objects. -* Declaring a property as `RealmProperty` will now report an - error during schema discovery rather than doing broken things when the - property is used. -* Observing the `invalidated` property of `RLMDictionary`/`Map` via KVO did not - set old/new values correctly in the notification (since 10.8.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 2. - -10.9.0 Release notes (2021-07-01) -============================================================= - -### Enhancements - -* Add `App.emailPasswordAuth.retryCustomConfirmation(email:completion:)` and - `[App.emailPasswordAuth retryCustomConfirmation:completion:]`. These - functions support retrying a [custom confirmation](https://docs.mongodb.com/realm/authentication/email-password/#run-a-confirmation-function) - function. -* Improve performance of many Dictionary operations, especially when KVO is being used. - -### Fixed - -* Calling `-[RLMRealm deleteObjects:]` on a `RLMDictionary` cleared the - dictionary but did not actually delete the objects in the dictionary (since v10.8.0). -* Rix an assertion failure when observing a `List` contains - object links. ([Core #4767](https://github.com/realm/realm-core/issues/4767), since v10.8.0) -* Fix an assertion failure when observing a `RLMDictionary`/`Map` which links - to an object which was deleting by a different sync client. - ([Core #4770](https://github.com/realm/realm-core/pull/4770), since v10.8.0) -* Fix an endless recursive loop that could cause a stack overflow when - computing changes on a set of objects which contained cycles. - ([Core #4770](https://github.com/realm/realm-core/pull/4770), since v10.8.0). -* Hash collisions in dictionaries were not handled properly. - ([Core #4776](https://github.com/realm/realm-core/issues/4776), since v10.8.0). -* Fix a crash after clearing a list or set of AnyRealmValue containing links to - objects ([Core #4774](https://github.com/realm/realm-core/issues/4774), since v10.8.0) -* Trying to refresh a user token which had been revoked by an admin lead to an - infinite loop and then a crash. This situation now properly logs the user out - and reports an error. ([Core #4745](https://github.com/realm/realm-core/issues/4745), since v10.0.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 2. - -### Internal - -* Upgraded realm-core from v11.0.3 to v11.0.4 - -10.8.1 Release notes (2021-06-22) -============================================================= - -### Enhancements - -* Update Xcode 12.5 to Xcode 12.5.1. -* Create fewer dynamic classes at runtime, improving memory usage and startup time slightly. - -### Fixed - -* Importing the Realm swift package produced several warnings about excluded - files not existing. Note that one warning will still remain after this change. - ([#7295](https://github.com/realm/realm-swift/issues/7295), since v10.8.0). -* Update the root URL for the API docs so that the links go to the place where - new versions of the docs are being published. - ([#7299](https://github.com/realm/realm-swift/issues/7299), since v10.6.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. Note that this version of Realm Studio has not - yet been released at the time of this release. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 1. - -10.8.0 Release notes (2021-06-14) -============================================================= - -NOTE: This version upgrades the Realm file format version to add support for -the new data types and to adjust how primary keys are handled. Realm files -opened will be automatically upgraded and cannot be read by versions older than -v10.8.0. This upgrade should be a fairly fast one. Note that we now -automatically create a backup of the pre-upgrade Realm. - -### Enhancements - -* Add support for the `UUID` and `NSUUID` data types. These types can be used - for the primary key property of Object classes. -* Add two new collection types to complement the existing `RLMArray`/`List` type: - - `RLMSet` in Objective-C and `MutableSet` in Swift are mutable - unordered collections of distinct objects, similar to the built-in - `NSMutableSet` and `Set`. The values in a set may be any non-collection - type which can be stored as a Realm property. Sets are guaranteed to never - contain two objects which compare equal to each other, including when - conflicting writes are merged by sync. - - `RLMDictionary` in Objective-C and `Map` are - mutable key-value dictionaries, similar to the built-in - `NSMutableDictionary` and `Dictionary`. The values in a dictionary may be - any non-collection type which can be stored as a Realm property. The keys - must currently always be a string. -* Add support for dynamically typed properties which can store a value of any - of the non-collection types supported by Realm, including Object subclasses - (but not EmbeddedObject subclasses). These are declared with - `@property id propertyName;` in Objective-C and - `let propertyName = RealmProperty()` in Swift. - -### Fixed - -* Setting a collection with a nullable value type to null via one of the - dynamic interfaces would hit an assertion failure instead of clearing the - collection. -* Fixed an incorrect detection of multiple incoming links in a migration when - changing a table to embedded and removing a link to it at the same time. - ([#4694](https://github.com/realm/realm-core/issues/4694) since v10.0.0-beta.2) -* Fixed a divergent merge on Set when one client clears the Set and another - client inserts and deletes objects. - ([#4720](https://github.com/realm/realm-core/issues/4720)) -* Partially revert to pre-v5.0.0 handling of primary keys to fix a performance - regression. v5.0.0 made primary keys determine the position in the low-level - table where newly added objects would be inserted, which eliminated the need - for a separate index on the primary key. This made some use patterns slightly - faster, but also made some reasonable things dramatically slower. - ([#4522](https://github.com/realm/realm-core/issues/4522)) -* Fixed an incorrect detection of multiple incoming links in a migration when - changing a table to embedded and removing a link to it at the same time. - ([#4694](https://github.com/realm/realm-core/issues/4694) since v10.0.0-beta.2) -* Fix collection notification reporting for modifications. This could be - observed by receiving the wrong indices of modifications on sorted or - distinct results, or notification blocks sometimes not being called when only - modifications have occured. - ([#4573](https://github.com/realm/realm-core/pull/4573) since v5.0.0). -* Fix incorrect sync instruction emission when replacing an existing embedded - object with another embedded object.([Core #4740](https://github.com/realm/realm-core/issues/4740) - -### Deprecations - -* `RealmOptional` has been deprecated in favor of `RealmProperty`. - `RealmProperty` is functionality identical to `RealmOptional` when storing - optional numeric types, but can also store the new `AnyRealmValue` type. - -### Compatibility - -* Realm Studio: 11.0.0 or later. Note that this version of Realm Studio has not - yet been released at the time of this release. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 1. - -### Internal - -* Upgraded realm-core from v10.7.2 to v11.0.3 - -10.8.0-beta.2 Release notes (2021-06-01) -============================================================= - -### Enhancements - -* Add `RLMDictionary`/`Map<>` datatype. This is a Dictionary collection type used for storing key-value pairs in a collection. - -### Compatibility - -* Realm Studio: 11.0.0-beta.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v11.0.0-beta.4 to v11.0.0-beta.6 - -10.8.0-beta.0 Release notes (2021-05-07) -============================================================= - -### Enhancements - -* Add `RLMSet`/`MutableSet<>` datatype. This is a Set collection type used for storing distinct values in a collection. -* Add support for `id`/`AnyRealmValue`. -* Add support for `UUID`/`NSUUID` data type. - -### Fixed - -* None. - -### Deprecations - -* `RealmOptional` has been deprecated in favor of `RealmProperty`. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.7.2 to v10.8.0-beta.5 - -10.7.7 Release notes (2021-06-10) -============================================================= - -Xcode 12.2 is now the minimum supported version. - -### Enhancements - -* Add Xcode 13 beta 1 binaries to the release package. - -### Fixed - -* Fix a runtime crash which happens in some Xcode version (Xcode < 12, reported - in Xcode 12.5), where SwiftUI is not weak linked by default. This fix only - works for Cocoapods projects. - ([#7234](https://github.com/realm/realm-swift/issues/7234) -* Fix warnings when building with Xcode 13 beta 1. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 1. - -10.7.6 Release notes (2021-05-13) -============================================================= - -### Enhancements - -* Realms opened in read-only mode can now be invalidated (although it is - unlikely to be useful to do so). - -### Fixed - -* Fix an availability warning when building Realm. The code path which gave the - warning can not currently be hit, so this did not cause any runtime problems - ([#7219](https://github.com/realm/realm-swift/issues/7219), since 10.7.3). -* Proactively check the expiry time on the access token and refresh it before - attempting to initiate a sync session. This prevents some error logs from - appearing on the client such as: "ERROR: Connection[1]: Websocket: Expected - HTTP response 101 Switching Protocols, but received: HTTP/1.1 401 - Unauthorized" ([RCORE-473](https://jira.mongodb.org/browse/RCORE-473), since v10.0.0) -* Fix a race condition which could result in a skipping notifications failing - to skip if several commits using notification skipping were made in - succession (since v5.0.0). -* Fix a crash on exit inside TableRecycler which could happen if Realms were - open on background threads when the app exited. - ([Core #4600](https://github.com/realm/realm-core/issues/4600), since v5.0.0) -* Fix errors related to "uncaught exception in notifier thread: - N5realm11KeyNotFoundE: No such object" which could happen on sycnronized - Realms if a linked object was deleted by another client. - ([JS #3611](https://github.com/realm/realm-js/issues/3611), since v10.0.0). -* Reading a link to an object which has been deleted by a different client via - a string-based interface (such as value(forKey:) or the subscript operator on - DynamicObject) could return an invalid object rather than nil. - ([Core #4687](https://github.com/realm/realm-core/pull/4687), since v10.0.0) -* Recreate the sync metadata Realm if the encryption key for it is missing from - the keychain rather than crashing. This can happen if a device is restored - from an unencrypted backup, which restores app data but not the app's - keychain entries, and results in all cached logics for sync users being - discarded but no data being lost. - [Core #4285](https://github.com/realm/realm-core/pull/4285) -* Thread-safe references can now be created for read-only Realms. - ([#5475](https://github.com/realm/realm-swift/issues/5475)). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.6.0 to v10.7.2 - -10.7.5 Release notes (2021-05-07) -============================================================= - -### Fixed - -* Iterating over frozen collections on multiple threads at the same time could - throw a "count underflow" NSInternalInconsistencyException. - ([#7237](https://github.com/realm/realm-swift/issues/7237), since v5.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. - -10.7.4 Release notes (2021-04-26) -============================================================= - -### Enhancements - -* Add Xcode 12.5 binaries to the release package. - -### Fixed - -* Add the Info.plist file to the XCFrameworks in the Carthage xcframwork - package ([#7216](https://github.com/realm/realm-swift/issues/7216), since 10.7.3). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. - -10.7.3 Release notes (2021-04-22) -============================================================= - -### Enhancements - -* Package a prebuilt XCFramework for Carthage. Carthage 0.38 and later will - download this instead of the old frameworks when using `--use-xcframeworks`. -* We now make a backup of the realm file prior to any file format upgrade. The - backup is retained for 3 months. Backups from before a file format upgrade - allows for better analysis of any upgrade failure. We also restore a backup, - if a) an attempt is made to open a realm file whith a "future" file format - and b) a backup file exist that fits the current file format. - ([Core #4166](https://github.com/realm/realm-core/pull/4166)) -* The error message when the intial steps of opening a Realm file fails is now - more descriptive. -* Make conversion of Decimal128 to/from string work for numbers with more than - 19 significant digits. This means that Decimal128's initializer which takes a - string will now never throw, as it previously threw only for out-of-bounds - values. The initializer is still marked as `throws` for - backwards compatibility. - ([#4548](https://github.com/realm/realm-core/issues/4548)) - -### Fixed - -* Adjust the header paths for the podspec to avoid accidentally finding a file - which isn't part of the pod that produced warnings when importing the - framework. ([#7113](https://github.com/realm/realm-swift/issues/7113), since 10.5.2). -* Fixed a crash that would occur when observing unmanaged Objects in multiple - views in SwiftUI. When using `@StateRealmObject` or `@ObservedObject` across - multiple views with an unmanaged object, each view would subscribe to the - object. As each view unsubscribed (generally when trailing back through the - view stack), our propertyWrappers would attempt to remove the KVOs for each - cancellation, when it should only be done once. We now correctly remove KVOs - only once. ([#7131](https://github.com/realm/realm-swift/issues/7131)) -* Fixed `isInvalidated` not returning correct value after object deletion from - Realm when using a custom schema. The object's Object Schema was not updated - when the object was added to the realm. We now correctly update the object - schema when adding it to the realm. - ([#7181](https://github.com/realm/realm-swift/issues/7181)) -* Syncing large Decimal128 values would cause "Assertion failed: cx.w[1] == 0" - ([Core #4519](https://github.com/realm/realm-core/issues/4519), since v10.0.0). -* Potential/unconfirmed fix for crashes associated with failure to memory map - (low on memory, low on virtual address space). For example - ([#4514](https://github.com/realm/realm-core/issues/4514), since v5.0.0). -* Fix assertion failures such as "!m_notifier_skip_version.version" or - "m_notifier_sg->get_version() + 1 == new_version.version" when performing - writes inside change notification callbacks. Previously refreshing the Realm - by beginning a write transaction would skip delivering notifications, leaving - things in an inconsistent state. Notifications are now delivered recursively - when needed instead. ([Cocoa #7165](https://github.com/realm/realm-swift/issues/7165)). -* Fix collection notification reporting for modifications. This could be - observed by receiving the wrong indices of modifications on sorted or - distinct results, or notification blocks sometimes not being called when only - modifications have occured. - ([#4573](https://github.com/realm/realm-core/pull/4573) since v5.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.5.5 to v10.6.0 -* Add additional debug validation to file map management that will hopefully - catch cases where we unmap something which is still in use. - -10.7.2 Release notes (2021-03-08) -============================================================= - -### Fixed - -* During integration of a large amount of data from the server, you may get - "Assertion failed: !fields.has_missing_parent_update()" - ([Core #4497](https://github.com/realm/realm-core/issues/4497), since v6.0.0) - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.5.4 to v10.5.5 - -10.7.1 Release notes (2021-03-05) -============================================================= - -### Fixed - -* Queries of the form "a.b.c == nil" would match objects where `b` is `nil` if - `c` did not have an index and did not if `c` was indexed. Both will now match - to align with NSPredicate's behavior. ([Core #4460]https://github.com/realm/realm-core/pull/4460), since 4.3.0). -* Restore support for upgrading files from file format 5 (Realm Cocoa 1.x). - ([Core #7089](https://github.com/realm/realm-swift/issues/7089), since v5.0.0) -* On 32bit devices you may get exception with "No such object" when upgrading - to v10.* ([Java #7314](https://github.com/realm/realm-java/issues/7314), since v5.0.0) -* The notification worker thread would rerun queries after every commit rather - than only commits which modified tables which could effect the query results - if the table had any outgoing links to tables not used in the query. - ([Core #4456](https://github.com/realm/realm-core/pull/4456), since v5.0.0). -* Fix "Invalid ref translation entry [16045690984833335023, 78187493520]" - assertion failure which could occur when using sync or multiple processes - writing to a single Realm file. - ([#7086](https://github.com/realm/realm-swift/issues/7086), since v5.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.5.3 to v10.5.4 - -10.7.0 Release notes (2021-02-23) -============================================================= - -### Enhancements - -* Add support for some missing query operations on data propertys: - - Data properties can be compared to other data properties - (e.g. "dataProperty1 == dataProperty2"). - - Case and diacritic-insensitive queries can be performed on data properties. - This will only have meaningful results if the data property contains UTF-8 - string data. - - Data properties on linked objects can be queried - (e.g. "link.dataProperty CONTAINS %@") -* Implement queries which filter on lists other than object links (lists of - objects were already supported). All supported operators for normal - properties are now supported for lists (e.g. "ANY intList = 5" or "ANY - stringList BEGINSWITH 'prefix'"), as well as aggregate operations on the - lists (such as "intArray.@sum > 100"). -* Performance of sorting on more than one property has been improved. - Especially important if many elements match on the first property. Mitigates - ([#7092](https://github.com/realm/realm-swift/issues/7092)) - -### Fixed - -* Fixed a bug that prevented an object type with incoming links from being - marked as embedded during migrations. ([Core #4414](https://github.com/realm/realm-core/pull/4414)) -* The Realm notification listener thread could sometimes hit the assertion - failure "!skip_version.version" if a write transaction was committed at a - very specific time (since v10.5.0). -* Added workaround for a case where upgrading an old file with illegal string - would crash ([#7111](https://github.com/realm/realm-swift/issues/7111)) -* Fixed a conflict resolution bug related to the ArrayMove instruction, which - could sometimes cause an "Invalid prior_size" exception to prevent - synchronization (since v10.5.0). -* Skipping a change notification in the first write transaction after the - observer was added could potentially fail to skip the notification (since v10.5.1). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.5.0 to v10.5.3 - -10.6.0 Release notes (2021-02-15) -============================================================= - -### Enhancements - -* Add `@StateRealmObject` for SwiftUI support. This property wrapper type instantiates an observable object on a View. - Use in place of `SwiftUI.StateObject` for Realm `Object`, `List`, and `EmbeddedObject` types. -* Add `@ObservedRealmObject` for SwiftUI support. This property wrapper type subscribes to an observable object - and invalidates a view whenever the observable object changes. Use in place of `SwiftUI.ObservedObject` for - Realm `Object`, `List`, or `EmbeddedObject` types. -* Add `@ObservedResults` for SwiftUI support. This property wrapper type retrieves results from a Realm. - The results use the realm configuration provided by the environment value `EnvironmentValues.realmConfiguration`. -* Add `EnvironmentValues.realm` and `EnvironmentValues.realmConfiguration` for `Realm` - and `Realm.Configuration` types respectively. Values can be injected into views using the `View.environment` method, e.g., `MyView().environment(\.realmConfiguration, Realm.Configuration(fileURL: URL(fileURLWithPath: "myRealmPath.realm")))`. - The value can then be declared on the example `MyView` as `@Environment(\.realm) var realm`. -* Add `SwiftUI.Binding` extensions where `Value` is of type `Object`, `List`, or `EmbeddedObject`. - These extensions expose methods for wrapped write transactions, to avoid boilerplate within - views, e.g., `TextField("name", $personObject.name)` or `$personList.append(Person())`. -* Add `Object.bind` and `EmbeddedObject.bind` for SwiftUI support. This allows you to create - bindings of realm properties when a propertyWrapper is not available for you to do so, e.g., `TextField("name", personObject.bind(\.name))`. -* The Sync client now logs error messages received from server rather than just - the size of the error message. -* Errors returned from the server when sync WebSockets get closed are now - captured and surfaced as a SyncError. -* Improve performance of sequential reads on a Results backed directly by a - Table (i.e. `realm.object(ClasSName.self)` with no filter/sort/etc.) by 50x. -* Orphaned embedded object types which are not linked to by any top-level types - are now better handled. Previously the server would reject the schema, - resulting in delayed and confusing error reporting. Explicitly including an - orphan in `objectTypes` is now immediately reported as an error when opening - the Realm, and orphans are automatically excluded from the auto-discovered - schema when `objectTypes` is not specified. - -### Fixed - -* Reading from a Results backed directly by a Table (i.e. - `realm.object(ClasSName.self)` with no filter/sort/etc.) would give incorrect - results if the Results was constructed and accessed before creating a new - object with a primary key less than the smallest primary key which previously - existed. ([#7014](https://github.com/realm/realm-swift/issues/7014), since v5.0.0). -* During synchronization you might experience crash with - "Assertion failed: ref + size <= next->first". - ([Core #4388](https://github.com/realm/realm-core/issues/4388)) - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.4.0 to v10.5.0 - -10.5.2 Release notes (2021-02-09) -============================================================= - -### Enhancements - -* Add support for "thawing" objects. `Realm`, `Results`, `List` and `Object` - now have `thaw()` methods which return a live copy of the frozen object. This - enables app behvaior where a frozen object can be made live again in order to - mutate values. For example, first freezing an object passed into UI view, - then thawing the object in the view to update values. -* Add Xcode 12.4 binaries to the release package. - -### Fixed - -* Inserting a date into a synced collection via `AnyBSON.datetime(...)` would - be of type `Timestamp` and not `Date`. This could break synced objects with a - `Date` property. - ([#6654](https://github.com/realm/realm-swift/issues/6654), since v10.0.0). -* Fixed an issue where creating an object after file format upgrade may fail - with assertion "Assertion failed: lo() <= std::numeric_limits::max()" - ([#4295](https://github.com/realm/realm-core/issues/4295), since v5.0.0) -* Allow enumerating objects in migrations with types which are no longer - present in the schema. -* Add `RLMResponse.customStatusCode`. This fixes timeout exceptions that were - occurring with a poor connection. ([#4188](https://github.com/realm/realm-core/issues/4188)) -* Limit availability of ObjectKeyIdentifiable to platforms which support - Combine to match the change made in the Xcode 12.5 SDK. - ([#7083](https://github.com/realm/realm-swift/issues/7083)) - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.3.3 to v10.4.0 - -10.5.1 Release notes (2021-01-15) -============================================================= - -### Enhancements - -* Add Xcode 12.3 binary to release package. -* Add support for queries which have nil on the left side and a keypath on the - right side (e.g. "nil == name" rather than "name == nil" as was previously - required). - -### Fixed -* Timeouts when calling server functions via App would sometimes crash rather - than report an error. -* Fix a race condition which would lead to "uncaught exception in notifier - thread: N5realm15InvalidTableRefE: transaction_ended" and a crash when the - source Realm was closed or invalidated at a very specific time during the - first run of a collection notifier - ([#3761](https://github.com/realm/realm-core/issues/3761), since v5.0.0). -* Deleting and recreating objects with embedded objects may fail. - ([Core PR #4240](https://github.com/realm/realm-core/pull/4240), since v10.0.0) -* Fast-enumerating a List after deleting the parent object would crash with an - assertion failure rather than a more appropriate exception. - ([Core #4114](https://github.com/realm/realm-core/issues/4114), since v5.0.0). -* Fix an issue where calling a MongoDB Realm Function would never be performed as the reference to the weak `User` was lost. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.3. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.3.2 to v10.3.3 - -10.5.0 Release notes (2020-12-14) -============================================================= - -### Enhancements - -* MongoDB Realm is now supported when installing Realm via Swift Package Manager. - -### Fixed - -* The user identifier was added to the file path for synchronized Realms twice - and an extra level of escaping was performed on the partition value. This did - not cause functional problems, but made file names more confusing than they - needed to be. Existing Realm files will continue to be located at the old - path, while newly created files will be created at a shorter path. (Since v10.0.0). -* Fix a race condition which could potentially allow queries on frozen Realms - to access an uninitialized structure for search indexes (since v5.0.0). -* Fix several data races in App and SyncSession initialization. These could - possibly have caused strange errors the first time a synchronized Realm was - opened (since v10.0.0). -* Fix a use of a dangling reference when refreshing a user’s custom data that - could lead to a crash (since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.1.4 to v10.3.2 - -10.4.0 Release notes (2020-12-10) -============================================================= - -### Enhancements - -* Add Combine support for App and User. These two types now have a - `objectWillChange` property that emits each time the state of the object has - changed (such as due to the user logging in or out). ([PR #6977](https://github.com/realm/realm-swift/pull/6977)). - -### Fixed - -* Integrating changesets from the server would sometimes hit the assertion - failure "n != realm::npos" inside Table::create_object_with_primary_key() - when creating an object with a primary key which previously had been used and - had incoming links. ([Core PR #4180](https://github.com/realm/realm-core/pull/4180), since v10.0.0). -* The arm64 simulator slices were not actually included in the XCFramework - release package. ([PR #6982](https://github.com/realm/realm-swift/pull/6982), since v10.2.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.1.3 to v10.1.4 -* Upgraded realm-sync from v10.1.4 to v10.1.5 - -10.3.0 Release notes (2020-12-08) -============================================================= - -### Enhancements - -* Add Google OpenID Connect Credentials, an alternative login credential to the - Google OAuth 2.0 credential. - -### Fixed - -* Fixed a bug that would prevent eventual consistency during conflict - resolution. Affected clients would experience data divergence and potentially - consistency errors as a result if they experienced conflict resolution - between cycles of Create-Erase-Create for objects with primary keys (since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-sync from v10.1.3 to v10.1.4 - -10.2.0 Release notes (2020-12-02) -============================================================= - -### Enhancements - -* The prebuilt binaries are now packaged as XCFrameworks. This adds support for - Catalyst and arm64 simulators when using them to install Realm, removes the - need for the strip-frameworks build step, and should simplify installation. -* The support functionality for using the Objective C API from Swift is now - included in Realm Swift and now includes all of the required wrappers for - MongoDB Realm types. In mixed Objective C/Swift projects, we recommend - continuing to use the Objective C types, but import both Realm and RealmSwift - in your Swift files. - -### Fixed - -* The user identifier was added to the file path for synchronized Realms twice - and an extra level of escaping was performed on the partition value. This did - not cause functional problems, but made file names more confusing than they - needed to be. Existing Realm files will continue to be located at the old - path, while newly created files will be created at a shorter path. (Since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -10.1.4 Release notes (2020-11-16) -============================================================= - -### Enhancements - -* Add arm64 slices to the macOS builds. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.0.1 to v10.1.3 -* Upgraded realm-sync from v10.0.1 to v10.1.3 - -10.1.3 Release notes (2020-11-13) -============================================================= - -### Enhancements - -* Add Xcode 12.2 binaries to the release package. - -### Fixed - -* Disallow setting - `RLMRealmConfiguration.deleteRealmIfMigrationNeeded`/`Realm.Config.deleteRealmIfMigrationNeeded` - when sync is enabled. This did not actually work as it does not delete the - relevant server state and broke in confusing ways ([PR #6931](https://github.com/realm/realm-swift/pull/6931)). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.1. -* CocoaPods: 1.10 or later. - -10.1.2 Release notes (2020-11-06) -============================================================= - -### Enhancements - -* Some error states which previously threw a misleading "NoSuchTable" exception - now throw a more descriptive exception. - -### Fixed - -* One of the Swift packages did not have the minimum deployment target set, - resulting in errors when archiving an app which imported Realm via SPM. -* Reenable filelock emulation on watchOS so that the OS does not kill the app - when it is suspended while a Realm is open on watchOS 7 ([#6861](https://github.com/realm/realm-swift/issues/6861), since v5.4.8 -* Fix crash in case insensitive query on indexed string columns when nothing - matches ([#6836](https://github.com/realm/realm-swift/issues/6836), since v5.0.0). -* Null values in a `List` or `List` were incorrectly treated - as non-null in some places. It is unknown if this caused any functional - problems when using the public API. ([Core PR #3987](https://github.com/realm/realm-core/pull/3987), since v5.0.0). -* Deleting an entry in a list in two different clients could end deleting the - wrong entry in one client when the changes are merged (since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.1. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.0.0 to v10.1.1 -* Upgraded realm-sync from v10.0.0 to v10.1.1 - -10.1.1 Release notes (2020-10-27) -============================================================= - -### Enhancements - -* Set the minimum CocoaPods version in the podspec so that trying to install - with older versions gives a more useful error ([PR #6892](https://github.com/realm/realm-swift/pull/6892)). - -### Fixed - -* Embedded objects could not be marked as `ObjectKeyIdentifable` - ([PR #6890](https://github.com/realm/realm-swift/pull/6890), since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.1. -* CocoaPods: 1.10 or later. - -10.1.0 Release notes (2020-10-22) -============================================================= - -CocoaPods 1.10 or later is now required to install Realm. - -### Enhancements - -* Throw an exception for Objects that have none of its properties marked with @objc. -* Mac Catalyst and arm64 simulators are now supported when integrating via Cocoapods. -* Add Xcode 12.1 binaries to the release package. -* Add Combine support for `Realm.asyncOpen()`. - -### Fixed - -* Implement precise and unbatched notification of sync completion events. This - avoids a race condition where an earlier upload completion event will notify - a later waiter whose changes haven't been uploaded yet. - ([#1118](https://github.com/realm/realm-object-store/pull/1118)). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.1. - -10.0.0 Release notes (2020-10-16) -============================================================= - -This release is functionally identical to v10.0.0-rc.2. - -NOTE: This version upgrades the Realm file format version to add support for -new data types. Realm files opened will be automatically upgraded and cannot be -read by versions older than v10.0.0. - -### Breaking Changes - -* Rename Realm.Publishers to RealmPublishers to avoid confusion with Combine.Publishers. -* Remove `[RLMSyncManager shared]`. This is now instatiated as a property on App/RLMApp. -* `RLMSyncManager.pinnedCertificatePaths` has been removed. -* Classes `RLMUserAccountInfo` & `RLMUserInfo` (swift: `UserInfo`, `UserAccountInfo`) have been removed. -* `RLMSyncUser`/`SyncUser` has been renamed to `RLMUser`/`User`. -* We no longer support Realm Cloud (legacy), but instead the new "MongoDB - Realm" Cloud. MongoDB Realm is a serverless platform that enables developers - to quickly build applications without having to set up server infrastructure. - MongoDB Realm is built on top of MongoDB Atlas, automatically integrating the - connection to your database. -* Remove support for Query-based sync, including the configuration parameters - and the `RLMSyncSubscription` and `SyncSubscription` types ([#6437](https://github.com/realm/realm-swift/pull/6437)). -* Remove everything related to sync permissions, including both the path-based - permission system and the object-level privileges for query-based sync. - Permissions are now configured via MongoDB Atlas. - ([#6445](https://github.com/realm/realm-swift/pulls/6445)) -* Remove support for Realm Object Server. -* Non-embedded objects in synchronized Realms must always have a primary key - named "_id". -* All Swift callbacks for asynchronous operations which can fail are now passed - a `Result` parameter instead of two separate `Value?` and - `Error?` parameters. - -### Enhancements - -* Add support for next generation sync. Support for syncing to MongoDB instead - of Realm Object Server. Applications must be created at realm.mongodb.com -* The memory mapping scheme for Realm files has changed to better support - opening very large files. -* Add support for the ObjectId data type. This is an automatically-generated - unique identifier similar to a GUID or a UUID. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for the Decimal128 data type. This is a 128-bit IEEE 754 decimal - floating point number similar to NSDecimalNumber. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for embedded objects. Embedded objects are objects which are - owned by a single parent object, and are deleted when that parent object is - deleted. They are defined by subclassing `EmbeddedObject` / - `RLMEmbeddedObject` rather than `Object` / `RLMObject`. -* Add `-[RLMUser customData]`/`User.customData`. Custom data is - configured in your MongoDB Realm App. -* Add `-[RLMUser callFunctionNamed:arguments:completion:]`/`User.functions`. - This is the entry point for calling Remote MongoDB Realm functions. Functions - allow you to define and execute server-side logic for your application. - Functions are written in modern JavaScript (ES6+) and execute in a serverless - manner. When you call a function, you can dynamically access components of - the current application as well as information about the request to execute - the function and the logged in user that sent the request. -* Add `-[RLMUser mongoClientWithServiceName:]`/`User.mongoClient`. This is - the entry point for calling your Remote MongoDB Service. The read operations - are `-[RLMMongoCollection findWhere:completion:]`, `-[RLMMongoCollection - countWhere:completion:]`and `-[RLMMongoCollection - aggregateWithPipeline:completion:]`. The write operations are - `-[RLMMongoCollection insertOneDocument:completion:]`, `-[RLMMongoCollection - insertManyDocuments:completion:]`, `-[RLMMongoCollection - updateOneDocument:completion:]`, `-[RLMMongoCollection - updateManyDocuments:completion:]`, `-[RLMMongoCollection - deleteOneDocument:completion:]`, and `-[RLMMongoCollection - deleteManyDocuments:completion:]`. If you are already familiar with MongoDB - drivers, it is important to understand that the remote MongoCollection only - provides access to the operations available in MongoDB Realm. -* Obtaining a Realm configuration from a user is now done with `[RLMUser - configurationWithPartitionValue:]`/`User.configuration(partitionValue:)`. - Partition values can currently be of types `String`, `Int`, or `ObjectId`, - and fill a similar role to Realm URLs did with Realm Cloud. The main - difference is that partitions are meant to be more closely associated with - your data. For example, if you are running a `Dog` kennel, and have a field - `breed` that acts as your partition key, you could open up realms based on - the breed of the dogs. -* Add ability to stream change events on a remote MongoDB collection with - `[RLMMongoCollection watch:delegate:delegateQueue:]`, - `MongoCollection.watch(delegate:)`. When calling `watch(delegate:)` you will be - given a `RLMChangeStream` (`ChangeStream`) which can be used to end watching - by calling `close()`. Change events can also be streamed using the - `MongoCollection.watch` Combine publisher that will stream change events each - time the remote MongoDB collection is updated. -* Add the ability to listen for when a Watch Change Stream is opened when using - Combine. Use `onOpen(event:)` directly after opening a `WatchPublisher` to - register a callback to be invoked once the change stream is opened. -* Objects with integer primary keys no longer require a separate index for the -* primary key column, improving insert performance and slightly reducing file - size. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* Carthage release for Swift is built with Xcode 12 - -### Internal - -* Upgraded realm-core from v6.1.4 to v10.0.0 -* Upgraded realm-sync from v5.0.29 to v10.0.0 - -10.0.0-rc.2 Release notes (2020-10-15) -============================================================= - -### Enhancements - -* Add the ability to listen for when a Watch Change Stream is opened when using - Combine. Use `onOpen(event:)` directly after opening a `WatchPublisher` to - register a callback to be invoked once the change stream is opened. - -### Breaking Changes - -* The insert operations on Mongo collections now report the inserted documents' - IDs as BSON rather than ObjectId. -* Embedded objects can no longer form cycles at the schema level. For example, - type A can no longer have an object property of type A, or an object property - of type B if type B links to type A. This was always rejected by the server, - but previously was allowed in non-synchronized Realms. -* Primary key properties are once again marked as being indexed. This reflects - an internal change to how primary keys are handled that should not have any - other visible effects. -* Change paired return types from Swift completion handlers to return `Result`. -* Adjust how RealmSwift.Object is defined to add support for Swift Library - Evolution mode. This should normally not have any effect, but you may need to - add `override` to initializers of object subclasses. -* Add `.null` type to AnyBSON. This creates a distinction between null values - and properly absent BSON types. - -### Fixed - -* Set the precision correctly when serializing doubles in extended json. -* Reading the `objectTypes` array from a Realm Configuration would not include - the embedded object types which were set in the array. -* Reject loops in embedded objects as part of local schema validation rather - than as a server error. -* Although MongoClient is obtained from a User, it was actually using the - User's App's current user rather than the User it was obtained from to make - requests. - - -This release also contains the following changes from 5.4.7 - 5.5.0 - -### Enhancements - -* Add the ability to capture a NotificationToken when using a Combine publisher - that observes a Realm Object or Collection. The user will call - `saveToken(on:at:)` directly after invoking the publisher to use the feature. - -### Fixed - -* When using `Realm.write(withoutNotifying:)` there was a chance that the - supplied observation blocks would not be skipped when in a write transaction. - ([Object Store #1103](https://github.com/realm/realm-object-store/pull/1103)) -* Comparing two identical unmanaged `List<>`/`RLMArray` objects would fail. - ([#5665](https://github.com/realm/realm-swift/issues/5665)). -* Case-insensitive equality queries on indexed string properties failed to - clear some internal state when rerunning the query. This could manifest as - duplicate results or "key not found" errors. - ([#6830](https://github.com/realm/realm-swift/issues/6830), [#6694](https://github.com/realm/realm-swift/issues/6694), since 5.0.0). -* Equality queries on indexed string properties would sometimes throw "key not - found" exceptions if the hash of the string happened to have bit 62 set. - ([.NET #2025](https://github.com/realm/realm-dotnet/issues/2025), since v5.0.0). -* Queries comparing non-optional int properties to nil would behave as if they - were comparing against zero instead (since v5.0.0). - -### Compatibility - -* File format: Generates Realms with format v12 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v10.0.0-beta.9 to v10.0.0 -* Upgraded realm-sync from v10.0.0-beta.14 to v10.0.0 - -10.0.0-rc.1 Release notes (2020-10-01) -============================================================= - -### Breaking Changes - -* Change the following methods on RLMUser to properties: - - `[RLMUser emailPasswordAuth]` => `RLMUser.emailPasswordAuth` - - `[RLMUser identities]` => `RLMUser.identities` - - `[RLMUser allSessions]` => `RLMUser.allSessions` - - `[RLMUser apiKeysAuth]` => `RLMUser.apiKeysAuth` -* Other changes to RLMUser: - - `nullable` has been removed from `RLMUser.identifier` - - `nullable` has been removed from `RLMUser.customData` -* Change the following methods on RLMApp to properties: - - `[RLMApp allUsers]` => `RLMApp.allUsers` - - `[RLMApp currentUser]` => `RLMApp.currentUser` - - `[RLMApp emailPasswordAuth]` => `RLMApp.emailPasswordAuth` -* Define `RealmSwift.Credentials` as an enum instead of a `typealias`. Example - usage has changed from `Credentials(googleAuthCode: "token")` to - `Credentials.google(serverAuthCode: "serverAuthCode")`, and - `Credentials(facebookToken: "token")` to `Credentials.facebook(accessToken: "accessToken")`, etc. -* Remove error parameter and redefine payload in - `+ (instancetype)credentialsWithFunctionPayload:(NSDictionary *)payload error:(NSError **)error;`. - It is now defined as `+ (instancetype)credentialsWithFunctionPayload:(NSDictionary> *)payload;` - -### Compatibility - -* File format: Generates Realms with format v12 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12. - -10.0.0-beta.6 Release notes (2020-09-30) -============================================================= - -### Breaking Changes - -* Change Google Credential parameter names to better reflect the required auth code: - - `Credentials(googleToken:)` => `Credentials(googleAuthCode:)` - - `[RLMCredentials credentialsWithGoogleToken:]` => `[RLMCredentials credentialsWithGoogleAuthCode:]` -* Rename Realm.Publishers to RealmPublishers to avoid confusion with Combine.Publishers - -### Fixed - -* Deleting objects could sometimes change the ObjectId remaining objects from - null to ObjectId("deaddeaddeaddeaddeaddead") when there are more than 1000 - objects. (Since v10.0.0-alpha.1) -* Fixed an assertion failure when adding an index to a nullable ObjectId - property that contains nulls. (since v10.0.0-alpha.1). - -This release also contains the following changes from 5.4.0 - 5.4.6: - -### Enhancements - -* Add prebuilt binary for Xcode 11.7 to the release package. -* Add prebuilt binary for Xcode 12 to the release package. -* Improve the asymtotic performance of NOT IN queries on indexed properties. It - is now O(Number of Rows) rather than O(Number of Rows \* Number of values in IN clause.) -* Slightly (<5%) improve the performance of most operations which involve - reading from a Realm file. - -### Fixed - -* Upgrading pre-5.x files with string primary keys would result in a file where - `realm.object(ofType:forPrimaryKey:)` would fail to find the object. - ([#6716](https://github.com/realm/realm-swift/issues/6716), since 5.2.0) -* A write transaction which modifies an object with more than 16 managed - properties and causes the Realm file to grow larger than 2 GB could cause an - assertion failure mentioning "m_has_refs". ([JS #3194](https://github.com/realm/realm-js/issues/3194), since 5.0.0). -* Objects with more than 32 properties could corrupt the Realm file and result - in a variety of crashes. ([Java #7057](https://github.com/realm/realm-java/issues/7057), since 5.0.0). -* Fix deadlocks when opening a Realm file in both the iOS simulator and Realm - Studio ([#6743](https://github.com/realm/realm-swift/issues/6743), since 5.3.6). -* Fix Springboard deadlocking when an app is unsuspended while it has an open - Realm file which is stored in an app group on iOS 10-12 - ([#6749](https://github.com/realm/realm-swift/issues/6749), since 5.3.6). -* If you use encryption your application cound crash with a message like - "Opening Realm files of format version 0 is not supported by this version of - Realm". ([#6889](https://github.com/realm/realm-java/issues/6889) among others, since 5.0.0) -* Confining a Realm to a serial queue would throw an error claiming that the - queue was not a serial queue on iOS versions older than 12. - ([#6735](https://github.com/realm/realm-swift/issues/6735), since 5.0.0). -* Results would sometimes give stale results inside a write transaction if a - write which should have updated the Results was made before the first access - of a pre-existing Results object. - ([#6721](https://github.com/realm/realm-swift/issues/6721), since 5.0.0) -* Fix Archiving the Realm and RealmSwift frameworks with Xcode 12. - ([#6774](https://github.com/realm/realm-swift/issues/6774)) -* Fix compilation via Carthage when using Xcode 12 ([#6717](https://github.com/realm/realm-swift/issues/6717)). -* Fix a crash inside `realm::Array(Type)::init_from_mem()` which would - sometimes occur when running a query over links immediately after creating - objects of the queried type. - ([#6789](https://github.com/realm/realm-swift/issues/6789) and possibly others, since 5.0.0). -* Possibly fix problems when changing the type of the primary key of an object - from optional to non-optional. -* Rerunning a equality query on an indexed string property would give incorrect - results if a previous run of the query matched multiple objects and it now - matches one object. This could manifest as either finding a non-matching - object or a "key not found" exception being thrown. - ([#6536](https://github.com/realm/realm-swift/issues/6536), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v12 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v10.0.0-beta.7 to v10.0.0-beta.9 -* Upgraded realm-sync from v10.0.0-beta.11 to v10.0.0-beta.14 - -10.0.0-beta.5 Release notes (2020-09-15) -============================================================= - -### Enhancements - -* Add `User.loggedIn`. -* Add support for multiple Realm Apps. -* Remove `[RLMSyncManager shared]`. This is now instatiated as a property on - the app itself. -* Add Combine support for: - * PushClient - * APIKeyAuth - * User - * MongoCollection - * EmailPasswordAuth - * App.login - -### Fixed - -* Fix `MongoCollection.watch` to consistently deliver events on a given queue. -* Fix `[RLMUser logOutWithCompletion]` and `User.logOut` to now log out the - correct user. -* Fix crash on startup on iOS versions older than 13 (since v10.0.0-beta.3). - -### Breaking Changes - -* `RLMSyncManager.pinnedCertificatePaths` has been removed. -* Classes `RLMUserAccountInfo` & `RLMUserInfo` (swift: `UserInfo`, - `UserAccountInfo`) have been removed. -* The following functionality has been renamed to align Cocoa with the other - Realm SDKs: - -| Old API | New API | -|:-------------------------------------------------------------|:---------------------------------------------------------------| -| `RLMUser.identity` | `RLMUser.identifier` | -| `User.identity` | `User.id` | -| `-[RLMCredentials credentialsWithUsername:password:]` | `-[RLMCredentials credentialsWithEmail:password:]` | -| `Credentials(username:password:)` | `Credentials(email:password:)` | -| -`[RLMUser apiKeyAuth]` | `-[RLMUser apiKeysAuth]` | -| `User.apiKeyAuth()` | `User.apiKeysAuth()` | -| `-[RLMEmailPasswordAuth registerEmail:password:completion:]` | `-[RLMEmailPasswordAuth registerUserWithEmail:password:completion:]` | -| `App.emailPasswordAuth().registerEmail(email:password:)` | `App.emailPasswordAuth().registerUser(email:password:)` | - -### Compatibility - -* File format: Generates Realms with format v12 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v10.0.0-beta.6 to v10.0.0-beta.7 -* Upgraded realm-sync from v10.0.0-beta.10 to v10.0.0-beta.11 - -10.0.0-beta.4 Release notes (2020-08-28) -============================================================= - -### Enhancements - -* Add support for the 64-bit watchOS simulator added in Xcode 12. -* Add ability to stream change events on a remote MongoDB collection with - `[RLMMongoCollection watch:delegate:delegateQueue]`, - `MongoCollection.watch(delegate)`. When calling `watch(delegate)` you will be - given a `RLMChangeStream` (`ChangeStream`), this will be used to invalidate - and stop the streaming session by calling `[RLMChangeStream close]` - (`ChangeStream.close()`) when needed. -* Add `MongoCollection.watch`, which is a Combine publisher that will stream - change events each time the remote MongoDB collection is updated. -* Add ability to open a synced Realm with a `nil` partition value. - -### Fixed - -* Realm.Configuration.objectTypes now accepts embedded objects -* Ports fixes from 5.3.5 - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the v10.0.0-beta.x series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v10.0.0-beta.1 to v10.0.0-beta.6 -* Upgraded realm-sync from v10.0.0-beta.2 to v10.0.0-beta.10 - -10.0.0-beta.3 Release notes (2020-08-17) -============================================================= - -This release also contains all changes from 5.3.2. - -### Breaking Changes -* The following classes & aliases have been renamed to align Cocoa with the other Realm SDKs: - -| Old API | New API | -|:------------------------------------------------------------|:---------------------------------------------------------------| -| `RLMSyncUser` | `RLMUser` | -| `SyncUser` | `User` | -| `RLMAppCredential` | `RLMCredential` | -| `AppCredential` | `Credential` | -| `RealmApp` | `App` | -| `RLMUserAPIKeyProviderClient` | `RLMAPIKeyAuth` | -| `RLMUsernamePasswordProviderClient` | `RLMEmailPasswordAuth` | -| `UsernamePasswordProviderClient` | `EmailPasswordAuth` | -| `UserAPIKeyProviderClient` | `APIKeyAuth` | - -* The following functionality has also moved to the User - -| Old API | New API | -|:-------------------------------------------------------------|:--------------------------------------------------------------| -| `[RLMApp callFunctionNamed:]` | `[RLMUser callFunctionNamed:]` | -| `App.functions` | `User.functions` | -| `[RLMApp mongoClientWithServiceName:]` | `[RLMUser mongoClientWithServiceName:]` | -| `App.mongoClient(serviceName)` | `User.mongoClient(serviceName)` | -| `[RLMApp userAPIKeyProviderClient]` | `[RLMUser apiKeyAuth]` | -| `App.userAPIKeyProviderClient` | `App.apiKeyAuth()` | -| `[RLMApp logOut:]` | `[RLMUser logOut]` | -| `App.logOut(user)` | `User.logOut()` | -| `[RLMApp removeUser:]` | `[RLMUser remove]` | -| `App.remove(user)` | `User.remove()` | -| `[RLMApp linkUser:credentials:]` | `[RLMUser linkWithCredentials:]` | -| `App.linkUser(user, credentials)` | `User.link(credentials)` | - -* `refreshCustomData()` on User now returns void and passes the custom data to the callback on success. - -### Compatibility -* This release introduces breaking changes w.r.t some sync classes and MongoDB Realm Cloud functionality. -(See the breaking changes section for the full list) -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* Carthage release for Swift is built with Xcode 11.5. - -10.0.0-beta.2 Release notes (2020-06-09) -============================================================= -Xcode 11.3 and iOS 9 are now the minimum supported versions. - -### Enhancements -* Add support for building with Xcode 12 beta 1. watchOS currently requires - removing x86_64 from the supported architectures. Support for the new 64-bit - watch simulator will come in a future release. - -### Fixed -* Opening a SyncSession with LOCAL app deployments would not use the correct endpoints. -* Linking from embedded objects to top-level objects was incorrectly disallowed. -* Opening a Realm file in file format v6 (created by Realm Cocoa versions - between 2.4 and 2.10) would crash. (Since 5.0.0, [Core #3764](https://github.com/realm/realm-core/issues/3764)). -* Upgrading v9 (pre-5.0) Realm files would create a redundant search index for - primary key properties. This index would then be removed the next time the - Realm was opened, resulting in some extra i/o in the upgrade process. - (Since 5.0.0, [Core #3787](https://github.com/realm/realm-core/issues/3787)). -* Fixed a performance issue with upgrading v9 files with search indexes on - non-primary-key properties. (Since 5.0.0, [Core #3767](https://github.com/realm/realm-core/issues/3767)). - -### Compatibility -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 - -10.0.0-beta.1 Release notes (2020-06-08) -============================================================= - -NOTE: This version bumps the Realm file format to version 11. It is not -possible to downgrade to earlier versions. Older files will automatically be -upgraded to the new file format. Only [Realm Studio -10.0.0](https://github.com/realm/realm-studio/releases/tag/v10.0.0-beta.1) or -later will be able to open the new file format. - -### Enhancements - -* Add support for next generation sync. Support for syncing to MongoDB instead - of Realm Object Server. Applications must be created at realm.mongodb.com -* The memory mapping scheme for Realm files has changed to better support - opening very large files. -* Add support for the ObjectId data type. This is an automatically-generated - unique identifier similar to a GUID or a UUID. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for the Decimal128 data type. This is a 128-bit IEEE 754 decimal - floating point number similar to NSDecimalNumber. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for embedded objects. Embedded objects are objects which are - owned by a single parent object, and are deleted when that parent object is - deleted. They are defined by subclassing `EmbeddedObject` / - `RLMEmbeddedObject` rather than `Object` / `RLMObject`. -* Add `-[RLMSyncUser customData]`/`SyncUser.customData`. Custom data is - configured in your MongoDB Realm App. -* Add `-[RLMApp callFunctionNamed:arguments]`/`RealmApp.functions`. This is the - entry point for calling Remote MongoDB Realm functions. Functions allow you - to define and execute server-side logic for your application. Functions are - written in modern JavaScript (ES6+) and execute in a serverless manner. When - you call a function, you can dynamically access components of the current - application as well as information about the request to execute the function - and the logged in user that sent the request. -* Add `-[RLMApp mongoClientWithServiceName]`/`RealmApp.mongoClient`. This is - the entry point for calling your Remote MongoDB Service. The read operations - are `-[RLMMongoCollection findWhere:completion:]`, `-[RLMMongoCollection - countWhere:completion:]`and `-[RLMMongoCollection - aggregateWithPipeline:completion:]`. The write operations are - `-[RLMMongoCollection insertOneDocument:completion:]`, `-[RLMMongoCollection - insertManyDocuments:completion:]`, `-[RLMMongoCollection - updateOneDocument:completion:]`, `-[RLMMongoCollection - updateManyDocuments:completion:]`, `-[RLMMongoCollection - deleteOneDocument:completion:]`, and `-[RLMMongoCollection - deleteManyDocuments:completion:]`. If you are already familiar with MongoDB - drivers, it is important to understand that the remote MongoCollection only - provides access to the operations available in MongoDB Realm. -* Change `[RLMSyncUser - configurationWithPartitionValue:]`/`SyncUser.configuration(with:)` to accept - all BSON types. Partition values can currently be of types `String`, `Int`, - or `ObjectId`. Opening a realm by partition value is the equivalent of - previously opening a realm by URL. In this case, partitions are meant to be - more closely associated with your data. E.g., if you are running a `Dog` - kennel, and have a field `breed` that acts as your partition key, you could - open up realms based on the breed of the dogs. - -### Breaking Changes - -* We no longer support Realm Cloud (legacy), but instead the new "MongoDB - Realm" Cloud. MongoDB Realm is a serverless platform that enables developers - to quickly build applications without having to set up server infrastructure. - MongoDB Realm is built on top of MongoDB Atlas, automatically integrating the - connection to your database. -* Remove support for Query-based sync, including the configuration parameters - and the `RLMSyncSubscription` and `SyncSubscription` types ([#6437](https://github.com/realm/realm-swift/pull/6437)). -* Primary key properties are no longer marked as being indexed. This reflects - an internal change to how primary keys are handled that should not have any - other visible effects. ([#6440](https://github.com/realm/realm-swift/pull/6440)). -* Remove everything related to sync permissions, including both the path-based - permission system and the object-level privileges for query-based sync. ([#6445](https://github.com/realm/realm-swift/pulls/6445)) -* Primary key uniqueness is now enforced when creating new objects during - migrations, rather than only at the end of migrations. Previously new objects - could be created with duplicate primary keys during a migration as long as - the property was changed to a unique value before the end of the migration, - but now a unique value must be supplied when creating the object. -* Remove support for Realm Object Server. - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 - -5.5.0 Release notes (2020-10-12) -============================================================= - -### Enhancements - -* Add the ability to capture a NotificationToken when using a Combine publisher - that observes a Realm Object or Collection. The user will call - `saveToken(on:at:)` directly after invoking the publisher to use the feature. - -### Fixed - -* When using `Realm.write(withoutNotifying:)` there was a chance that the - supplied observation blocks would not be skipped when in a write transaction. - ([Object Store #1103](https://github.com/realm/realm-object-store/pull/1103)) -* Comparing two identical unmanaged `List<>`/`RLMArray` objects would fail. - ([#5665](https://github.com/realm/realm-swift/issues/5665)). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -5.4.8 Release notes (2020-10-05) -============================================================= - -### Fixed - -* Case-insensitive equality queries on indexed string properties failed to - clear some internal state when rerunning the query. This could manifest as - duplicate results or "key not found" errors. - ([#6830](https://github.com/realm/realm-swift/issues/6830), [#6694](https://github.com/realm/realm-swift/issues/6694), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v6.1.3 to v6.1.4 -* Upgraded realm-sync from v5.0.28 to v5.0.29 - -5.4.7 Release notes (2020-09-30) -============================================================= - -### Fixed - -* Equality queries on indexed string properties would sometimes throw "key not - found" exceptions if the hash of the string happened to have bit 62 set. - ([.NET #2025](https://github.com/realm/realm-dotnet/issues/2025), since v5.0.0). -* Queries comparing non-optional int properties to nil would behave as if they - were comparing against zero instead (since v5.0.0). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v6.1.2 to v6.1.3 -* Upgraded realm-sync from v5.0.27 to v5.0.28 - -5.4.6 Release notes (2020-09-29) -============================================================= - -5.4.5 failed to actually update the core version for installation methods other -than SPM. All changes listed there actually happened in this version for -non-SPM installation methods. - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-sync from v5.0.26 to v5.0.27 - -5.4.5 Release notes (2020-09-28) -============================================================= - -### Enhancements - -* Slightly (<5%) improve the performance of most operations which involve - reading from a Realm file. - -### Fixed - -* Rerunning a equality query on an indexed string property would give incorrect - results if a previous run of the query matched multiple objects and it now - matches one object. This could manifest as either finding a non-matching - object or a "key not found" exception being thrown. - ([#6536](https://github.com/realm/realm-swift/issues/6536), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v6.1.1 to v6.1.2 -* Upgraded realm-sync from v5.0.25 to v5.0.26 - -5.4.4 Release notes (2020-09-25) -============================================================= - -### Enhancements -* Improve the asymtotic performance of NOT IN queries on indexed properties. It - is now O(Number of Rows) rather than O(Number of Rows \* Number of values in IN clause.) - -### Fixed - -* Fix a crash inside `realm::Array(Type)::init_from_mem()` which would - sometimes occur when running a query over links immediately after creating - objects of the queried type. - ([#6789](https://github.com/realm/realm-swift/issues/6789) and possibly others, since 5.0.0). -* Possibly fix problems when changing the type of the primary key of an object - from optional to non-optional. - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v6.0.26 to v6.1.1 -* Upgraded realm-sync from v5.0.23 to v5.0.25 - -5.4.3 Release notes (2020-09-21) -============================================================= - -### Fixed - -* Fix compilation via Carthage when using Xcode 12 ([#6717](https://github.com/realm/realm-swift/issues/6717)). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.12 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -5.4.2 Release notes (2020-09-17) -============================================================= - -### Enhancements - -* Add prebuilt binary for Xcode 12 to the release package. - -### Fixed - -* Fix Archiving the Realm and RealmSwift frameworks with Xcode 12. - ([#6774](https://github.com/realm/realm-swift/issues/6774)) - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.12 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -5.4.1 Release notes (2020-09-16) -============================================================= - -### Enhancements - -* Add prebuilt binary for Xcode 11.7 to the release package. - -### Fixed - -* Fix deadlocks when opening a Realm file in both the iOS simulator and Realm - Studio ([#6743](https://github.com/realm/realm-swift/issues/6743), since 5.3.6). -* Fix Springboard deadlocking when an app is unsuspended while it has an open - Realm file which is stored in an app group on iOS 10-12 - ([#6749](https://github.com/realm/realm-swift/issues/6749), since 5.3.6). -* If you use encryption your application cound crash with a message like - "Opening Realm files of format version 0 is not supported by this version of - Realm". ([#6889](https://github.com/realm/realm-java/issues/6889) among others, since 5.0.0) -* Confining a Realm to a serial queue would throw an error claiming that the - queue was not a serial queue on iOS versions older than 12. - ([#6735](https://github.com/realm/realm-swift/issues/6735), since 5.0.0). -* Results would sometimes give stale results inside a write transaction if a - write which should have updated the Results was made before the first access - of a pre-existing Results object. - ([#6721](https://github.com/realm/realm-swift/issues/6721), since 5.0.0) - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.12 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.7. - -### Internal - -* Upgraded realm-core from v6.0.25 to v6.0.26 -* Upgraded realm-sync from v5.0.22 to v5.0.23 - -5.4.0 Release notes (2020-09-09) -============================================================= - -This version bumps the Realm file format version. This means that older -versions of Realm will be unable to open Realm files written by this version, -and a new version of Realm Studio will be required. There are no actual format -changes and the version bump is just to force a re-migration of incorrectly -upgraded Realms. - -### Fixed - -* Upgrading pre-5.x files with string primary keys would result in a file where - `realm.object(ofType:forPrimaryKey:)` would fail to find the object. - ([#6716](https://github.com/realm/realm-swift/issues/6716), since 5.2.0) -* A write transaction which modifies an object with more than 16 managed - properties and causes the Realm file to grow larger than 2 GB could cause an - assertion failure mentioning "m_has_refs". ([JS #3194](https://github.com/realm/realm-js/issues/3194), since 5.0.0). -* Objects with more than 32 properties could corrupt the Realm file and result - in a variety of crashes. ([Java #7057](https://github.com/realm/realm-java/issues/7057), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.12 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.23 to v6.0.25 -* Upgraded realm-sync from v5.0.20 to v5.0.22 - -5.3.6 Release notes (2020-09-02) -============================================================= - -### Fixed - -* Work around iOS 14 no longer allowing the use of file locks in shared - containers, which resulted in the OS killing an app which entered the - background while a Realm was open ([#6671](https://github.com/realm/realm-swift/issues/6671)). -* If an attempt to upgrade a realm has ended with a crash with "migrate_links()" - in the call stack, the realm was left in an invalid state. The migration - logic now handles this state and can complete upgrading files which were - incompletely upgraded by pre-5.3.4 versions. -* Fix deadlocks when writing to a Realm file on an exFAT partition from macOS. - ([#6691](https://github.com/realm/realm-swift/issues/6691)). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.19 to v6.0.23 -* Upgraded realm-sync from v5.0.16 to v5.0.20 - -5.3.5 Release notes (2020-08-20) -============================================================= - -### Fixed - -* Opening Realms on background threads could produce spurious Incorrect Thread - exceptions when a cached Realm existed for a previously existing thread with - the same thread ID as the current thread. - ([#6659](https://github.com/realm/realm-swift/issues/6659), - [#6689](https://github.com/realm/realm-swift/issues/6689), - [#6712](https://github.com/realm/realm-swift/issues/6712), since 5.0.0). -* Upgrading a table with incoming links but no properties would crash. This was - probably not possible to hit in practice as we reject object types with no - properties. -* Upgrading a non-nullable List which nonetheless contained null values would - crash. This was possible due to missing error-checking in some older versions - of Realm. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.18 to v6.0.19 -* Upgraded realm-sync from v5.0.15 to v5.0.16 - -5.3.4 Release notes (2020-08-17) -============================================================= - -### Fixed - -* Accessing a Realm after calling `deleteAll()` would sometimes throw an - exception with the reason 'ConstIterator copy failed'. ([#6597](https://github.com/realm/realm-swift/issues/6597), since 5.0.0). -* Fix an assertion failure inside the `migrate_links()` function when upgrading - a pre-5.0 Realm file. -* Fix a bug in memory mapping management. This bug could result in multiple - different asserts as well as segfaults. In many cases stack backtraces would - include members of the EncyptedFileMapping near the top - even if encryption - was not used at all. In other cases asserts or crashes would be in methods - reading an array header or array element. In all cases the application would - terminate immediately. ([Core #3838](https://github.com/realm/realm-core/pull/3838), since v5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.14 to v6.0.18 -* Upgraded realm-sync from v5.0.14 to v5.0.15 - -5.3.3 Release notes (2020-07-30) -============================================================= - -### Enhancements - -* Add support for the x86_64 watchOS simulator added in Xcode 12. - -### Fixed - -* (RLM)Results objects would incorrectly pin old read transaction versions - until they were accessed after a Realm was refreshed, resulting in the Realm - file growing to large sizes if a Results was retained but not accessed after - every write. ([#6677](https://github.com/realm/realm-swift/issues/6677), since 5.0.0). -* Fix linker errors when using SwiftUI previews with Xcode 12 when Realm was - installed via Swift Package Manager. ([#6625](https://github.com/realm/realm-swift/issues/6625)) - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.12 to v6.0.14 -* Upgraded realm-sync from v5.0.12 to v5.0.14 - -5.3.2 Release notes (2020-07-21) -============================================================= - -### Fixed - -* Fix a file format upgrade bug when opening older Realm files. Could cause - assertions like "Assertion failed: ref != 0" during opning of a Realm. - ([Core #6644](https://github.com/realm/realm-swift/issues/6644), since 5.2.0) -* A use-after-free would occur if a Realm was compacted, opened on multiple - threads prior to the first write, then written to while reads were happening - on other threads. This could result in a variety of crashes, often inside - realm::util::EncryptedFileMapping::read_barrier. - (Since v5.0.0, [#6626](https://github.com/realm/realm-swift/issues/6626), - [#6628](https://github.com/realm/realm-swift/issues/6628), - [#6652](https://github.com/realm/realm-swift/issues/6652), - [#6655](https://github.com/realm/realm-swift/issues/6555), - [#6656](https://github.com/realm/realm-swift/issues/6656)). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.11 to v6.0.12 -* Upgraded realm-sync from v5.0.11 to v5.0.12 - -5.3.1 Release notes (2020-07-17) -============================================================= - -### Enhancements - -* Add prebuilt binary for Xcode 11.6 to the release package. - -### Fixed - -* Creating an object inside migration which changed that object type's primary - key would hit an assertion failure mentioning primary_key_col - ([#6613](https://github.com/realm/realm-swift/issues/6613), since 5.0.0). -* Modifying the value of a string primary key property inside a migration with - a Realm file which was upgraded from pre-5.0 would corrupt the property's - index, typically resulting in crashes. ([Core #3765](https://github.com/realm/realm-core/issues/3765), since 5.0.0). -* Some Realm files which hit assertion failures when upgrading from the pre-5.0 - file format should now upgrade correctly (Since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.9 to v6.0.11 -* Upgraded realm-sync from v5.0.8 to v5.0.11 - -5.3.0 Release notes (2020-07-14) -============================================================= - -### Enhancements - -* Add `Realm.objectWillChange`, which is a Combine publisher that will emit a - notification each time the Realm is refreshed or a write transaction is - commited. - -### Fixed - -* Fix the spelling of `ObjectKeyIdentifiable`. The old spelling is available - and deprecated for compatibility. -* Rename `RealmCollection.publisher` to `RealmCollection.collectionPublisher`. - The old name interacted with the `publisher` defined by `Sequence` in very - confusing ways, so we need to use a different name. The `publisher` name is - still available for compatibility. ([#6516](https://github.com/realm/realm-swift/issues/6516)) -* Work around "xcodebuild timed out while trying to read - SwiftPackageManagerExample.xcodeproj" errors when installing Realm via - Carthage. ([#6549](https://github.com/realm/realm-swift/issues/6549)). -* Fix a performance regression when using change notifications. (Since 5.0.0, - [#6629](https://github.com/realm/realm-swift/issues/6629)). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v6.0.8 to v6.0.9 -* Upgraded realm-sync from v5.0.7 to v5.0.8 - -5.2.0 Release notes (2020-06-30) -============================================================= - -### Fixed -* Opening a SyncSession with LOCAL app deployments would not use the correct endpoints. -This release also contains all changes from 5.0.3 and 5.1.0. - -### Breaking Changes -* The following classes & aliases have been renamed to align Cocoa with the other Realm SDKs: - -| Old API | New API | -|:------------------------------------------------------------|:---------------------------------------------------------------| -| `RLMSyncUser` | `RLMUser` | -| `SyncUser` | `User` | -| `RLMAppCredential` | `RLMCredential` | -| `AppCredential` | `Credential` | -| `RealmApp` | `App` | -| `RLMUserAPIKeyProviderClient` | `RLMAPIKeyAuth` | -| `RLMUsernamePasswordProviderClient` | `RLMEmailPasswordAuth` | -| `UsernamePasswordProviderClient` | `EmailPasswordAuth` | -| `UserAPIKeyProviderClient` | `APIKeyAuth` | - -* The following functionality has also moved to the User: - -| Old API | New API | -|:-------------------------------------------------------------|:--------------------------------------------------------------| -| `[RLMApp callFunctionNamed:]` | `[RLMUser callFunctionNamed:]` | -| `App.functions` | `User.functions` | -| `[RLMApp mongoClientWithServiceName:]` | `[RLMUser mongoClientWithServiceName:]` | -| `App.mongoClient(serviceName)` | `User.mongoClient(serviceName)` | -| `[RLMApp userAPIKeyProviderClient]` | `[RLMUser apiKeyAuth]` | -| `App.userAPIKeyProviderClient` | `App.apiKeyAuth()` | -| `[RLMApp logOut:]` | `[RLMUser logOut]` | -| `App.logOut(user)` | `User.logOut()` | -| `[RLMApp removeUser:]` | `[RLMUser remove]` | -| `App.remove(user)` | `User.remove()` | -| `[RLMApp linkUser:credentials:]` | `[RLMUser linkWithCredentials:]` | -| `App.linkUser(user, credentials)` | `User.link(credentials)` | - -* The argument labels in Swift have changed for several methods: -| Old API | New API | -|:-------------------------------------------------------------|:--------------------------------------------------------------| -| `APIKeyAuth.createApiKey(withName:completion:)` | `APIKeyAuth.createApiKey(named:completion:)` | -| `App.login(withCredential:completion:) | `App.login(credentials:completion:)` | -| `App.pushClient(withServiceName:)` | `App.pushClient(serviceName:)` | -| `MongoClient.database(withName:)` | `MongoClient.database(named:)` | - -* `refreshCustomData()` on User now returns void and passes the custom data to the callback on success. - -### Compatibility -* This release introduces breaking changes w.r.t some sync classes and MongoDB Realm Cloud functionality. - (See the breaking changes section for the full list) -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* Realm Studio: 10.0.0 or later. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 - -10.0.0-beta.2 Release notes (2020-06-09) -============================================================= -Xcode 11.3 and iOS 9 are now the minimum supported versions. - -### Enhancements - -* Add support for building with Xcode 12 beta 1. watchOS currently requires - removing x86_64 from the supported architectures. Support for the new 64-bit - watch simulator will come in a future release. - -### Fixed -* Opening a SyncSession with LOCAL app deployments would not use the correct endpoints. -* Linking from embedded objects to top-level objects was incorrectly disallowed. - -* Opening a Realm file in file format v6 (created by Realm Cocoa versions - between 2.4 and 2.10) would crash. (Since 5.0.0, [Core #3764](https://github.com/realm/realm-core/issues/3764)). -* Upgrading v9 (pre-5.0) Realm files would create a redundant search index for - primary key properties. This index would then be removed the next time the - Realm was opened, resulting in some extra i/o in the upgrade process. - (Since 5.0.0, [Core #3787](https://github.com/realm/realm-core/issues/3787)). -* Fixed a performance issue with upgrading v9 files with search indexes on - non-primary-key properties. (Since 5.0.0, [Core #3767](https://github.com/realm/realm-core/issues/3767)). - -### Compatibility -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 - -10.0.0-beta.1 Release notes (2020-06-08) -============================================================= - -NOTE: This version bumps the Realm file format to version 11. It is not -possible to downgrade to earlier versions. Older files will automatically be -upgraded to the new file format. Only [Realm Studio -10.0.0](https://github.com/realm/realm-studio/releases/tag/v10.0.0-beta.1) or -later will be able to open the new file format. - -### Enhancements - -* Add support for next generation sync. Support for syncing to MongoDB instead - of Realm Object Server. Applications must be created at realm.mongodb.com -* The memory mapping scheme for Realm files has changed to better support - opening very large files. -* Add support for the ObjectId data type. This is an automatically-generated - unique identifier similar to a GUID or a UUID. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for the Decimal128 data type. This is a 128-bit IEEE 754 decimal - floating point number similar to NSDecimalNumber. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for embedded objects. Embedded objects are objects which are - owned by a single parent object, and are deleted when that parent object is - deleted. They are defined by subclassing `EmbeddedObject` / - `RLMEmbeddedObject` rather than `Object` / `RLMObject`. -* Add `-[RLMSyncUser customData]`/`SyncUser.customData`. Custom data is - configured in your MongoDB Realm App. -* Add `-[RLMApp callFunctionNamed:arguments]`/`RealmApp.functions`. This is the - entry point for calling Remote MongoDB Realm functions. Functions allow you - to define and execute server-side logic for your application. Functions are - written in modern JavaScript (ES6+) and execute in a serverless manner. When - you call a function, you can dynamically access components of the current - application as well as information about the request to execute the function - and the logged in user that sent the request. -* Add `-[RLMApp mongoClientWithServiceName]`/`RealmApp.mongoClient`. This is - the entry point for calling your Remote MongoDB Service. The read operations - are `-[RLMMongoCollection findWhere:completion:]`, `-[RLMMongoCollection - countWhere:completion:]`and `-[RLMMongoCollection - aggregateWithPipeline:completion:]`. The write operations are - `-[RLMMongoCollection insertOneDocument:completion:]`, `-[RLMMongoCollection - insertManyDocuments:completion:]`, `-[RLMMongoCollection - updateOneDocument:completion:]`, `-[RLMMongoCollection - updateManyDocuments:completion:]`, `-[RLMMongoCollection - deleteOneDocument:completion:]`, and `-[RLMMongoCollection - deleteManyDocuments:completion:]`. If you are already familiar with MongoDB - drivers, it is important to understand that the remote MongoCollection only - provides access to the operations available in MongoDB Realm. -* Change `[RLMSyncUser - configurationWithPartitionValue:]`/`SyncUser.configuration(with:)` to accept - all BSON types. Partition values can currently be of types `String`, `Int`, - or `ObjectId`. Opening a realm by partition value is the equivalent of - previously opening a realm by URL. In this case, partitions are meant to be - more closely associated with your data. E.g., if you are running a `Dog` - kennel, and have a field `breed` that acts as your partition key, you could - open up realms based on the breed of the dogs. - -### Breaking Changes - -* We no longer support Realm Cloud (legacy), but instead the new "MongoDB - Realm" Cloud. MongoDB Realm is a serverless platform that enables developers - to quickly build applications without having to set up server infrastructure. - MongoDB Realm is built on top of MongoDB Atlas, automatically integrating the - connection to your database. -* Remove support for Query-based sync, including the configuration parameters - and the `RLMSyncSubscription` and `SyncSubscription` types ([#6437](https://github.com/realm/realm-swift/pull/6437)). -* Primary key properties are no longer marked as being indexed. This reflects - an internal change to how primary keys are handled that should not have any - other visible effects. ([#6440](https://github.com/realm/realm-swift/pull/6440)). -* Remove everything related to sync permissions, including both the path-based - permission system and the object-level privileges for query-based sync. ([#6445](https://github.com/realm/realm-swift/pulls/6445)) -* Primary key uniqueness is now enforced when creating new objects during - migrations, rather than only at the end of migrations. Previously new objects - could be created with duplicate primary keys during a migration as long as - the property was changed to a unique value before the end of the migration, - but now a unique value must be supplied when creating the object. -* Remove support for Realm Object Server. - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* `List.index(of:)` would give incorrect results if it was the very first thing - called on that List after a Realm was refreshed following a write which - modified the List. (Since 5.0.0, [#6606](https://github.com/realm/realm-swift/issues/6606)). -* If a ThreadSafeReference was the only remaining reference to a Realm, - multiple copies of the file could end up mapped into memory at once. This - probably did not have any symptoms other than increased memory usage. (Since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 -* Upgraded realm-core from v6.0.6 to v6.0.7 -* Upgraded realm-sync from v5.0.5 to v5.0.6 -* Upgraded realm-core from v6.0.6 to v6.0.8 -* Upgraded realm-sync from v5.0.5 to v5.0.7 - -5.1.0 Release notes (2020-06-22) -============================================================= - -### Enhancements - -* Allow opening full-sync Realms in read-only mode. This disables local schema - initialization, which makes it possible to open a Realm which the user does - not have write access to without using asyncOpen. In addition, it will report - errors immediately when an operation would require writing to the Realm - rather than reporting it via the sync error handler only after the server - rejects the write. - -### Fixed - -* Opening a Realm using a configuration object read from an existing Realm - would incorrectly bind the new Realm to the original Realm's thread/queue, - resulting in "Realm accessed from incorrect thread." exceptions. - ([#6574](https://github.com/realm/realm-swift/issues/6574), - [#6559](https://github.com/realm/realm-swift/issues/6559), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -5.0.3 Release notes (2020-06-10) -============================================================= - -### Fixed - -* `-[RLMObject isFrozen]` always returned false. ([#6568](https://github.com/realm/realm-swift/issues/6568), since 5.0.0). -* Freezing an object within the write transaction that the object was created - in now throws an exception rather than crashing when the object is first - used. -* The schema for frozen Realms was not properly initialized, leading to crashes - when accessing a RLMLinkingObjects property. - ([#6568](https://github.com/realm/realm-swift/issues/6568), since 5.0.0). -* Observing `Object.isInvalidated` via a keypath literal would produce a - warning in Swift 5.2 due to the property not being marked as @objc. - ([#6554](https://github.com/realm/realm-swift/issues/6554)) - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -5.0.2 Release notes (2020-06-02) -============================================================= - -### Fixed - -* Fix errSecDuplicateItem (-25299) errors when opening a synchronized Realm - when upgrading from pre-5.0 versions of Realm. - ([#6538](https://github.com/realm/realm-swift/issues/6538), [#6494](https://github.com/realm/realm-swift/issues/6494), since 5.0.0). -* Opening Realms stored on filesystems which do not support preallocation (such - as ExFAT) would give "Operation not supported" exceptions. - ([#6508](https://github.com/realm/realm-swift/issues/6508), since 3.2.0). -* 'NoSuchTable' exceptions would sometimes be thrown after upgrading a Relam - file to the v10 format. ([Core #3701](https://github.com/realm/realm-core/issues/3701), since 5.0.0) -* If the upgrade process was interrupted/killed for various reasons, the - following run could stop with some assertions failing. No instances of this - happening were reported to us. (Since 5.0.0). -* Queries filtering a `List` where the query was on an indexed property over a - link would sometimes give incomplete results. - ([#6540](https://github.com/realm/realm-swift/issues/6540), since 4.1.0 but - more common since 5.0.0) -* Opening a file in read-only mode would attempt to make a spurious write to - the file, causing errors if the file was in read-only storage (since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v6.0.4 to v6.0.6 -* Upgraded realm-sync from v5.0.3 to v5.0.5 - -5.0.1 Release notes (2020-05-27) -============================================================= - -### Enhancements - -* Add prebuilt binary for Xcode 11.5 to the release package. - -### Fixed - -* Fix linker error when building a xcframework for Catalyst. - ([#6511](https://github.com/realm/realm-swift/issues/6511), since 4.3.1). -* Fix building for iOS devices when using Swift Package Manager - ([#6522](https://github.com/realm/realm-swift/issues/6522), since 5.0.0). -* `List` and `RealmOptional` properties on frozen objects were not initialized - correctly and would always report `nil` or an empty list. - ([#6527](https://github.com/realm/realm-swift/issues/6527), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -5.0.0 Release notes (2020-05-15) -============================================================= - -NOTE: This version bumps the Realm file format to version 10. It is not -possible to downgrade version 9 or earlier. Files created with older versions -of Realm will be automatically upgraded. Only -[Studio 3.11](https://github.com/realm/realm-studio/releases/tag/v3.11.0) or later will be able -to open the new file format. - -### Enhancements - -* Storing large binary blobs in Realm files no longer forces the file to be at - least 8x the size of the largest blob. -* Reduce the size of transaction logs stored inside the Realm file, reducing - file size growth from large transactions. -* Add support for frozen objects. `Realm`, `Results`, `List` and `Object` now - have `freeze()` methods which return a frozen copy of the object. These - objects behave similarly to creating unmanaged deep copies of the source - objects. They can be read from any thread and do not update when writes are - made to the Realm, but creating frozen objects does not actually copy data - out of the Realm and so can be much faster and use less memory. Frozen - objects cannot be mutated or observed for changes (as they never change). - ([PR #6427](https://github.com/realm/realm-swift/pull/6427)). -* Add the `isFrozen` property to `Realm`, `Results`, `List` and `Object`. -* Add `Realm.Configuration.maxNumberOfActiveVersions`. Each time a write - transaction is performed, a new version is created inside the Realm, and then - any versions which are no longer in use are cleaned up. If too many versions - are kept alive while performing writes (either due to a background thread - performing a long operation that doesn't let the Realm on that thread - refresh, or due to holding onto frozen versions for a long time) the Realm - file will grow in size, potentially to the point where it is too large to be - opened. Setting this configuration option will make write transactions which - would cause the live version count to exceed the limit to instead fail. -* Add support for queue-confined Realms. Rather than being bound to a specific - thread, queue-confined Realms are bound to a serial dispatch queue and can be - used within blocks dispatched to that queue regardless of what thread they - happen to run on. In addition, change notifications will be delivered to that - queue rather than the thread's run loop. ([PR #6478](https://github.com/realm/realm-swift/pull/6478)). -* Add an option to deliver object and collection notifications to a specific - serial queue rather than the current thread. ([PR #6478](https://github.com/realm/realm-swift/pull/6478)). -* Add Combine publishers for Realm types. Realm collections have a `.publisher` - property which publishes the collection each time it changes, and a - `.changesetPublisher` which publishes a `RealmCollectionChange` each time the - collection changes. Corresponding publishers for Realm Objects can be - obtained with the `publisher()` and `changesetPublisher()` global functions. -* Extend Combine publishers which output Realm types with a `.freeze()` - function which will make the publisher instead output frozen objects. -* String primary keys no longer require a separate index, improving insertion - and deletion performance without hurting lookup performance. -* Reduce the encrypted page reclaimer's impact on battery life when encryption - is used. ([Core #3461](https://github.com/realm/realm-core/pull/3461)). - -### Fixed - -* The uploaded bytes in sync progress notifications was sometimes incorrect and - wouldn't exactly equal the uploadable bytes when the uploaded completed. -* macOS binaries were built with the incorrect deployment target (10.14 rather - than 10.9), resulting in linker warnings. ([#6299](https://github.com/realm/realm-swift/issues/6299), since 3.18.0). -* An internal datastructure for List properties could be double-deleted if the - last reference was released from a thread other than the one which the List - was created on at the wrong time. This would typically manifest as - "pthread_mutex_destroy() failed", but could also result in other kinds of - crashes. ([#6333](https://github.com/realm/realm-swift/issues/6333)). -* Sorting on float or double properties containing NaN values had inconsistent - results and would sometimes crash due to out-of-bounds memory accesses. - ([#6357](https://github.com/realm/realm-swift/issues/6357)). - -### Breaking Changes - -* The ObjectChange type in Swift is now generic and includes a reference to the - object which changed. When using `observe(on:)` to receive notifications on a - dispatch queue, the object will be confined to that queue. -* The Realm instance passed in the callback to asyncOpen() is now confined to - the callback queue passed to asyncOpen() rather than the thread which the - callback happens to be called on. This means that the Realm instance may be - stored and reused in further blocks dispatched to that queue, but the queue - must now be a serial queue. -* Files containing Date properties written by version of Realm prior to 1.0 can - no longer be opened. -* Files containing Any properties can no longer be opened. This property type - was never documented and was deprecated in 1.0. -* Deleting objects now preserves the order of objects reported by unsorted - Results rather than performing a swap operation before the delete. Note that - it is still not safe to assume that the order of objects in an unsorted - Results is the order that the objects were created in. -* The minimum supported deployment target for iOS when using Swift Package - Manager to install Realm is now iOS 11. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.4.1. - -### Internal - -* Upgraded realm-core from v5.23.8 to v6.0.4 -* Upgraded realm-sync from v4.9.5 to v5.0.3 - -5.0.0-beta.6 Release notes (2020-05-08) -============================================================= - -### Enhancements - -* Add support for queue-confined Realms. Rather than being bound to a specific - thread, queue-confined Realms are bound to a serial dispatch queue and can be - used within blocks dispatched to that queue regardless of what thread they - happen to run on. In addition, change notifications will be delivered to that - queue rather than the thread's run loop. ([PR #6478](https://github.com/realm/realm-swift/pull/6478)). -* Add an option to deliver object and collection notifications to a specific - serial queue rather than the current thread. ([PR #6478](https://github.com/realm/realm-swift/pull/6478)). - -### Fixed - -* The uploaded bytes in sync progress notifications was sometimes incorrect and - wouldn't exactly equal the uploadable bytes when the uploaded completed. - -### Breaking Changes - -* The Realm instance passed in the callback to asyncOpen() is now confined to - the callback queue passed to asyncOpen() rather than the thread which the - callback happens to be called on. This means that the Realm instance may be - stored and reused in further blocks dispatched to that queue, but the queue - must now be a serial queue. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.4.1. - -### Internal - -* Upgraded realm-core from v6.0.3 to v6.0.4 -* Upgraded realm-sync from v5.0.1 to v5.0.3 - -4.4.1 Release notes (2020-04-16) -============================================================= - -### Enhancements - -* Upgrade Xcode 11.4 binaries to Xcode 11.4.1. - -### Fixed - -* Fix a "previous <= m_schema_transaction_version_max" assertion failure caused - by a race condition that could occur after performing a migration. (Since 3.0.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.4.1. - -5.0.0-beta.3 Release notes (2020-02-26) -============================================================= - -Based on 4.3.2 and also includes all changes since 4.3.0. - -### Enhancements - -* Add support for frozen objects. `Realm`, `Results`, `List` and `Object` now - have `freeze()` methods which return a frozen copy of the object. These - objects behave similarly to creating unmanaged deep copies of the source - objects. They can be read from any thread and do not update when writes are - made to the Realm, but creating frozen objects does not actually copy data - out of the Realm and so can be much faster and use less memory. Frozen - objects cannot be mutated or observed for changes (as they never change). - ([PR #6427](https://github.com/realm/realm-swift/pull/6427)). -* Add the `isFrozen` property to `Realm`, `Results`, `List` and `Object`. -* Add `Realm.Configuration.maxNumberOfActiveVersions`. Each time a write - transaction is performed, a new version is created inside the Realm, and then - any versions which are no longer in use are cleaned up. If too many versions - are kept alive while performing writes (either due to a background thread - performing a long operation that doesn't let the Realm on that thread - refresh, or due to holding onto frozen versions for a long time) the Realm - file will grow in size, potentially to the point where it is too large to be - opened. Setting this configuration option will make write transactions which - would cause the live version count to exceed the limit to instead fail. - - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-core from v6.0.0-beta.3 to v6.0.3 -* Upgraded realm-sync from v5.0.0-beta.2 to v5.0.1 - -5.0.0-beta.2 Release notes (2020-01-13) -============================================================= - -Based on 4.3.0 and also includes all changes since 4.1.1. - -### Fixed - -* Fix compilation when using CocoaPods targeting iOS versions older than 11 (since 5.0.0-alpha). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-core from v6.0.0-beta.2 to v6.0.0-beta.3 -* Upgraded realm-sync from v5.0.0-beta.1 to v5.0.0-beta.2 - -5.0.0-beta.1 Release notes (2019-12-13) -============================================================= - -Based on 4.1.1 and also includes all changes since 4.1.0. - -NOTE: This version bumps the Realm file format to version 10. It is not possible to downgrade version 9 or earlier. Files created with older versions of Realm will be automatically upgraded. - -### Enhancements - -* String primary keys no longer require a separate index, improving insertion - and deletion performance without hurting lookup performance. -* Reduce the encrypted page reclaimer's impact on battery life when encryption - is used. ([Core #3461](https://github.com/realm/realm-core/pull/3461)). - -### Fixed - -* Fix an error when a table-backed Results was accessed immediately after - deleting the object previously at the index being accessed (since - 5.0.0-alpha.1). -* macOS binaries were built with the incorrect deployment target (10.14 rather - than 10.9), resulting in linker warnings. ([#6299](https://github.com/realm/realm-swift/issues/6299), since 3.18.0). -* An internal datastructure for List properties could be double-deleted if the - last reference was released from a thread other than the one which the List - was created on at the wrong time. This would typically manifest as - "pthread_mutex_destroy() failed", but could also result in other kinds of - crashes. ([#6333](https://github.com/realm/realm-swift/issues/6333)). -* Sorting on float or double properties containing NaN values had inconsistent - results and would sometimes crash due to out-of-bounds memory accesses. - ([#6357](https://github.com/realm/realm-swift/issues/6357)). - -### Known Issues - -* Changing which property of an object is the primary key in a migration will - break incoming links to objects of that type. -* Changing the primary key of an object with Data properties in a migration - will crash. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-core from v6.0.0-alpha.24 to v6.0.0-beta.2 -* Upgraded realm-sync from 4.7.1-core6.5 to v5.0.0-beta.1 - -5.0.0-alpha.1 Release notes (2019-11-14) -============================================================= - -Based on 4.1.0. - -### Enhancements - -* Add `-[RLMRealm fileExistsForConfiguration:]`/`Realm.fileExists(for:)`, - which checks if a local Realm file exists for the given configuration. -* Add `-[RLMRealm deleteFilesForConfiguration:]`/`Realm.deleteFiles(for:)` - to delete the Realm file and all auxiliary files for the given configuration. -* Storing large binary blobs in Realm files no longer forces the file to be at - least 8x the size of the largest blob. -* Reduce the size of transaction logs stored inside the Realm file, reducing - file size growth from large transactions. - -NOTE: This version bumps the Realm file format to version 10. It is not -possible to downgrade version 9 or earlier. Files created with older versions -of Realm will be automatically upgraded. This automatic upgrade process is not -yet well tested. Do not open Realm files with data you care about with this -alpha version. - -### Breaking Changes - -* Files containing Date properties written by version of Realm prior to 1.0 can - no longer be opened. -* Files containing Any properties can no longer be opened. This property type - was never documented and was deprecated in 1.0. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades v9) -* Realm Object Server: 3.21.0 or later. -* APIs are backwards compatible with all previous releases in the 4.x.y series. -* Carthage release for Swift is built with Xcode 11.3. -* Carthage release for Swift is built with Xcode 11.2.1. - -### Internal - -* Upgraded realm-core from 5.23.6 to v6.0.0-alpha.24. -* Upgraded realm-sync from 4.8.2 to 4.7.1-core6.5. - -4.4.0 Release notes (2020-03-26) -============================================================= - -Swift 4.0 and Xcode 10.3 are now the minimum supported versions. - -### Enhancements - -* Allow setting the `fileUrl` for synchronized Realms. An appropriate local - path based on the sync URL will still be used if it is not overridden. - ([PR #6454](https://github.com/realm/realm-swift/pull/6454)). -* Add Xcode 11.4 binaries to the release package. - -### Fixed - -* None. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.4. - -4.3.2 Release notes (2020-02-06) -============================================================= - -### Enhancements - -* Similar to `autoreleasepool()`, `realm.write()` now returns the value which - the block passed to it returns. Returning `Void` from the block is still allowed. - -### Fixed - -* Fix a memory leak attributed to `property_copyAttributeList` the first time a - Realm is opened when using Realm Swift. ([#6409](https://github.com/realm/realm-swift/issues/6409), since 4.0.0). -* Connecting to a `realms:` sync URL would crash at runtime on iOS 11 (and no - other iOS versions) inside the SSL validation code. (Since 4.3.1). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-sync from 4.9.4 to 4.9.5. - -4.3.1 Release notes (2020-01-16) -============================================================= - -### Enhancements - -* Reduce the encrypted page reclaimer's impact on battery life when encryption - is used. ([Core #3461](https://github.com/realm/realm-core/pull/3461)). - -### Fixed - -* macOS binaries were built with the incorrect deployment target (10.14 rather - than 10.9), resulting in linker warnings. ([#6299](https://github.com/realm/realm-swift/issues/6299), since 3.18.0). -* An internal datastructure for List properties could be double-deleted if the - last reference was released from a thread other than the one which the List - was created on at the wrong time. This would typically manifest as - "pthread_mutex_destroy() failed", but could also result in other kinds of - crashes. ([#6333](https://github.com/realm/realm-swift/issues/6333)). -* Sorting on float or double properties containing NaN values had inconsistent - results and would sometimes crash due to out-of-bounds memory accesses. - ([#6357](https://github.com/realm/realm-swift/issues/6357)). -* A NOT query on a `List` which happened to have the objects in a - different order than the underlying table would sometimes include the object - immediately before an object which matches the query. ([#6289](https://github.com/realm/realm-swift/issues/6289), since 0.90.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-core from 5.23.6 to 5.23.8. -* Upgraded realm-sync from 4.9.0 to 4.9.4. - -4.3.0 Release notes (2019-12-19) -============================================================= - -### Enhancements - -* Add the ability to set a custom logger function on `RLMSyncManager` which is - called instead of the default NSLog-based logger. -* Expose configuration options for the various types of sync connection - timeouts and heartbeat intervals on `RLMSyncManager`. -* Add an option to have `Realm.asyncOpen()` report an error if the connection - times out rather than swallowing the error and attempting to reconnect until - it succeeds. - -### Fixed - -* Fix a crash when using value(forKey:) on a LinkingObjects property (including - when doing so indirectly, such as by querying on that property). - ([#6366](https://github.com/realm/realm-swift/issues/6366), since 4.0.0). -* Fix a rare crash in `ClientHistoryImpl::integrate_server_changesets()` which - would only happen in Debug builds (since v3.0.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-sync from 4.8.2 to 4.9.0. - -4.2.0 Release notes (2019-12-16) -============================================================= - -### Enhancements - -* Add `-[RLMRealm fileExistsForConfiguration:]`/`Realm.fileExists(for:)`, - which checks if a local Realm file exists for the given configuration. -* Add `-[RLMRealm deleteFilesForConfiguration:]`/`Realm.deleteFiles(for:)` - to delete the Realm file and all auxiliary files for the given configuration. - -### Fixed - -* None. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.3. - -4.1.1 Release notes (2019-11-18) -============================================================= - -### Fixed - -* The UpdatePolicy passed to `realm.add()` or `realm.create()` was not properly - propagated when adding objects within a `List`, which could result in - spurious change notifications when using `.modified`. - ([#6321](https://github.com/realm/realm-swift/issues/6321), since v3.16.0) -* Fix a rare deadlock when a Realm collection or object was observed, then - `refresh()` was explicitly called, and then the NotificationToken from the - observation was destroyed on a different thread (since 0.98.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.2. - -4.1.0 Release notes (2019-11-13) -============================================================= - -### Enhancements - -* Improve performance of queries over a link where the final target property - has an index. -* Restore support for storing `@objc enum` properties on RealmSwift.Object - subclasses (broken in 4.0.0), and add support for storing them in - RealmOptional properties. - -### Fixed - -* The sync client would fail to reconnect after failing to integrate a - changeset. The bug would lead to further corruption of the client’s Realm - file. ([RSYNC-48](https://jira.mongodb.org/browse/RSYNC-48), since v3.2.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.2. - -### Internal - -* Upgraded realm-core from 5.23.5 to 5.23.6. -* Upgraded realm-sync from 4.7.11 to 4.8.2 - -4.0.0 Release notes (2019-11-08) -============================================================= - -### Breaking Changes - -* All previously deprecated functionality has now been removed entirely. -* The schema discovery logic for RealmSwift.Object subclasses has been - rewritten in Swift. This should not have any effect on valid class - definitions, but there may be types of invalid definitions which previously - worked by coincidence and no longer do. -* `SyncSubscription` no longer has a generic type parameter, as the type was - not actually used for anything. -* The following Swift types have changed from `final class` to `struct`: - - AnyRealmCollection - - LinkingObjects - - ObjectiveCSupport - - Realm - - Results - - SyncSubscription - - ThreadSafeReference - There is no intended change in semantics from this, but certain edge cases - may behave differently. -* The designated initializers defined by RLMObject and Object other than - zero-argument `init` have been replaced with convenience initializers. -* The implementation of the path-based permissions API has been redesigned to - accomodate changes to the server. This should be mostly a transparent change, - with two main exceptions: - 1. SyncPermission objects are no longer live Realm objects, and retrieving - permissions gives an Array rather than Results. - Getting up-to-date permissions now requires calling retrievePermissions() again - rather than observing the permissions. - 2. The error codes for permissions functions have changed. Rather than a - separate error type and set of error codes, permission functions now produce - SyncAuthErrors. - -### Enhancements - -* Improve performance of initializing Realm objects with List properties. - -### Fixed - -* None. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.2. - -3.21.0 Release notes (2019-11-04) -============================================================= - -### Enhancements - -* Add prebuilt binaries for Xcode 11.2. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.2. - -3.20.0 Release notes (2019-10-21) -============================================================= - -### Enhancements - -* Add support for custom refresh token authentication. This allows a user to be - authorized with an externally-issued refresh token when ROS is configured to - recognize the external issuer as a refresh token validator. - ([PR #6311](https://github.com/realm/realm-swift/pull/6311)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11. - -3.19.1 Release notes (2019-10-17) -============================================================= - -### Enhancements - -* Improve performance of sync changeset integration. Transactions involving a - very large number of objects and cheap operations on each object are as much - as 20% faster. - -### Fixed - -* Fix a crash when a RLMArray/List of primitives was observed and then the - containing object was deleted before the first time that the background - notifier could run. - ([Issue #6234](https://github.com/realm/realm-swift/issues/6234, since 3.0.0)). -* Remove an incorrect assertion that would cause crashes inside - `TableInfoCache::get_table_info()`, with messages like "Assertion failed: info.object_id_index == 0 [3, 0]". - (Since 3.18.0, [#6268](https://github.com/realm/realm-swift/issues/6268) and [#6257](https://github.com/realm/realm-swift/issues/6257)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.0. - -### Internal - -* Upgrade to REALM_SYNC_VERSION=4.7.11 - -3.19.0 Release notes (2019-09-27) -============================================================= - -### Enhancements - -* Expose ObjectSchema.objectClass in Swift as looking up the class via - NSClassFromString() can be complicated for Swift types. - ([PR #6244](https://github.com/realm/realm-swift/pull/6244)). -* Add support for suppressing notifications using closure-based write/transaction methods. - ([PR #6252](https://github.com/realm/realm-swift/pull/6252)). - -### Fixed - -* IN or chained OR equals queries on an unindexed string column would fail to - match some results if any of the strings were 64 bytes or longer. - ([Core #3386](https://github.com/realm/realm-core/pull/3386), since 3.14.2). -* Query Based Sync subscriptions for queries involving a null timestamp were - not sent to the server correctly and would match no objects. - ([Core #3389](https://github.com/realm/realm-core/pull/3388), since 3.17.3). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.0. - -### Internal - -* Upgrade to REALM_CORE_VERSION=5.23.5 -* Upgrade to REALM_SYNC_VERSION=4.7.8 - -3.18.0 Release notes (2019-09-13) -============================================================= - -The file format for synchronized Realms has changed. Old Realms will be -automatically upgraded when they are opened. Once upgraded, the files will not -be openable by older versions of Realm. The upgrade should not take a -significant amount of time to run or run any risk of errors. - -This does not effect non-synchronized Realms. - -### Enhancements - -* Improve performance of queries on Date properties - ([Core #3344](https://github.com/realm/realm-core/pull/3344), [Core #3351](https://github.com/realm/realm-core/pull/3351)). -* Syncronized Realms are now more aggressive about trimming local history that - is no longer needed. This should reduce file size growth in write-heavy - workloads. ([Sync #3007](https://github.com/realm/realm-sync/issues/3007)). -* Add support for building Realm as an xcframework. - ([PR #6238](https://github.com/realm/realm-swift/pull/6238)). -* Add prebuilt libraries for Xcode 11 to the release package. - ([PR #6248](https://github.com/realm/realm-swift/pull/6248)). -* Add a prebuilt library for Catalyst/UIKit For Mac to the release package - ([PR #6248](https://github.com/realm/realm-swift/pull/6248)). - -### Fixed - -* If a signal interrupted a msync() call, Realm would throw an exception and - the write transaction would fail. This behavior has new been changed to retry - the system call instead. ([Core #3352](https://github.com/realm/realm-core/issues/3352)) -* Queries on the sum or average of an integer property would sometimes give - incorrect results. ([Core #3356](https://github.com/realm/realm-core/pull/3356)). -* Opening query-based synchronized Realms with a small number of subscriptions - performed an unneccesary write transaction. ([ObjectStore #815](https://github.com/realm/realm-object-store/pull/815)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.0 - -### Deprecations - -* `RLMIdentityProviderNickname` has been deprecated in favor of `RLMIdentityProviderUsernamePassword`. -* `+[RLMIdentityProvider credentialsWithNickname]` has been deprecated in favor of `+[RLMIdentityProvider credentialsWithUsername]`. -* `Sync.nickname(String, Bool)` has been deprecated in favor of `Sync.usernamePassword(String, String, Bool)`. - -3.17.3 Release notes (2019-07-24) -============================================================= - -### Enhancements - -* Add Xcode 10.3 binaries to the release package. Remove the Xcode 9.2 and 9.3 binaries. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.3. - -3.17.1 Release notes (2019-07-10) -============================================================= - -### Enhancements - -* Add support for canceling asynchronous opens using a new AsyncOpenTask - returned from the asyncOpen() call. ([PR #6193](https://github.com/realm/realm-swift/pull/6193)). -* Importing the Realm SPM package can now be done by pinning to a version - rather than a branch. - -### Fixed - -* Queries on a List/RLMArray which checked an indexed int property would - sometimes give incorrect results. - ([#6154](https://github.com/realm/realm-swift/issues/6154)), since v3.15.0) -* Queries involving an indexed int property had a memory leak if run multiple - times. ([#6186](https://github.com/realm/realm-swift/issues/6186)), since v3.15.0) -* Creating a subscription with `includeLinkingObjects:` performed unneccesary - comparisons, making it extremely slow when large numbers of objects were - involved. ([Core #3311](https://github.com/realm/realm-core/issues/3311), since v3.15.0) - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.17.0 Release notes (2019-06-28) -============================================================= - -### Enhancements - -* Add support for including Realm via Swift Package Manager. This currently - requires depending on the branch "master" rather than pinning to a version - (i.e. `.package(url: "https://github.com/realm/realm-swift", .branch("master"))`). - ([#6187](https://github.com/realm/realm-swift/pull/6187)). -* Add Codable conformance to RealmOptional and List, and Encodable conformance to Results. - ([PR #6172](https://github.com/realm/realm-swift/pull/6172)). - -### Fixed - -* Attempting to observe an unmanaged LinkingObjects object crashed rather than - throwing an approriate exception (since v0.100.0). -* Opening an encrypted Realm could potentially report that a valid file was - corrupted if the system was low on free memory. - (since 3.14.0, [Core #3267](https://github.com/realm/realm-core/issues/3267)) -* Calling `Realm.asyncOpen()` on multiple Realms at once would sometimes crash - due to a `FileNotFound` exception being thrown on a background worker thread. - (since 3.16.0, [ObjectStore #806](https://github.com/realm/realm-object-store/pull/806)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.16.2 Release notes (2019-06-14) -============================================================= - -### Enhancements - -* Add support for Xcode 11 Beta 1. Xcode betas are only supported when building - from source, and not when using a prebuilt framework. - ([PR #6164](https://github.com/realm/realm-swift/pull/6164)). - -### Fixed - -* Using asyncOpen on query-based Realms which didn't already exist on the local - device would fail with error 214. - ([#6178](https://github.com/realm/realm-swift/issues/6178), since 3.16.0). -* asyncOpen on query-based Realms did not wait for the server-created - permission objects to be downloaded, resulting in crashes if modifications to - the permissions were made before creating a subscription for the first time (since 3.0.0). -* EINTR was not handled correctly in the notification worker, which may have - resulted in inconsistent and rare assertion failures in - `ExternalCommitHelper::listen()` when building with assertions enabled. - (PR: [#804](https://github.com/realm/realm-object-store/pull/804), since 0.91.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.16.1 Release notes (2019-05-31) -============================================================= - -### Fixed - -* The static type passed at compile time to `realm.create()` was checked for a - primary key rather than the actual type passed at runtime, resulting in - exceptions like "''RealmSwiftObject' does not have a primary key and can not - be updated'" being thrown even if the object type being created has a primary - key. (since 3.16.0, [#6159](https://github.com/realm/realm-swift/issues/6159)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.16.0 Release notes (2019-05-29) -============================================================= - -### Enhancements - -* Add an option to only set the properties which have values different from the - existing ones when updating an existing object with - `Realm.create()`/`-[RLMObject createOrUpdateInRealm:withValue:]`. This makes - notifications report only the properties which have actually changed, and - improves Object Server performance by reducing the number of operations to - merge. (Issue: [#5970](https://github.com/realm/realm-swift/issues/5970), - PR: [#6149](https://github.com/realm/realm-swift/pull/6149)). -* Using `-[RLMRealm asyncOpenWithConfiguration:callbackQueue:]`/`Realm.asyncOpen()` to open a - synchronized Realm which does not exist on the local device now uses an - optimized transfer method to download the initial data for the Realm, greatly - speeding up the first start time for applications which use full - synchronization. This is currently not applicable to query-based - synchronization. (PR: [#6106](https://github.com/realm/realm-swift/pull/6106)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.15.0 Release notes (2019-05-06) -============================================================= - -The minimum version of Realm Object Server has been increased to 3.21.0 and -attempting to connect to older versions will produce protocol mismatch errors. -Realm Cloud has already been upgraded to this version, and users using that do -not need to worry about this. - -### Enhancements - -* Add `createdAt`, `updatedAt`, `expiresAt` and `timeToLive` properties to - `RLMSyncSubscription`/`SyncSubscription`. These properties will be `nil` for - subscriptions created with older versions of Realm, but will be automatically - populated for newly-created subscriptions. -* Add support for transient subscriptions by setting the `timeToLive` when - creating the subscription. The next time a subscription is created or updated - after that time has elapsed the subscription will be automatically removed. -* Add support for updating existing subscriptions with a new query or limit. - This is done by passing `update: true` (in swift) or setting - `options.overwriteExisting = YES` (in obj-c) when creating the subscription, - which will make it update the existing subscription with the same name rather - than failing if one already exists with that name. -* Add an option to include the objects from - `RLMLinkingObjects`/`LinkingObjects` properties in sync subscriptions, - similarly to how `RLMArray`/`List` automatically pull in the contained - objects. -* Improve query performance for chains of OR conditions (or an IN condition) on - an unindexed integer or string property. - ([Core PR #2888](https://github.com/realm/realm-core/pull/2888) and - [Core PR #3250](https://github.com/realm/realm-core/pull/3250)). -* Improve query performance for equality conditions on indexed integer properties. - ([Core PR #3272](https://github.com/realm/realm-core/pull/3272)). -* Adjust the file allocation algorithm to reduce fragmentation caused by large - numbers of small blocks. -* Improve file allocator logic to reduce fragmentation and improve commit - performance after many writes. ([Core PR #3278](https://github.com/realm/realm-core/pull/3278)). - -### Fixed - -* Making a query that compares two integer properties could cause a - segmentation fault on x86 (i.e. macOS only). - ([Core PR #3253](https://github.com/realm/realm-core/pull/3256)). -* The `downloadable_bytes` parameter passed to sync progress callbacks reported - a value which correlated to the amount of data left to download, but not - actually the number of bytes which would be downloaded. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.14.2 Release notes (2019-04-25) -============================================================= - -### Enhancements - -* Updating `RLMSyncManager.customRequestHeaders` will immediately update all - currently active sync session with the new headers rather than requiring - manually closing the Realm and reopening it. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.14.1 Release notes (2019-04-04) -============================================================= - -### Fixed - -* Fix "Cannot find interface declaration for 'RealmSwiftObject', superclass of - 'MyRealmObjectClass'" errors when building for a simulator with Xcode 10.2 - with "Install Objective-C Compatibility Header" enabled. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. -* Carthage release for Swift is built with Xcode 10.2. - -3.14.0 Release notes (2019-03-27) -============================================================= - -### Enhancements - -* Reduce memory usage when committing write transactions. -* Improve performance of compacting encrypted Realm files. - ([PR #3221](https://github.com/realm/realm-core/pull/3221)). -* Add a Xcode 10.2 build to the release package. - -### Fixed - -* Fix a memory leak whenever Realm makes a HTTP(s) request to the Realm Object - Server (Issue [#6058](https://github.com/realm/realm-swift/issues/6058), since 3.8.0). -* Fix an assertion failure when creating an object in a synchronized Realm - after creating an object with a null int primary key in the same write - transaction. - ([PR #3227](https://github.com/realm/realm-core/pull/3227)). -* Fix some new warnings when building with Xcode 10.2 beta. -* Properly clean up sync sessions when the last Realm object using the session - is deallocated while the session is explicitly suspended (since 3.9.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. -* Carthage release for Swift is built with Xcode 10.2. - -### Internal - -* Throw an exception rather than crashing with an assertion failure in more - cases when opening invalid Realm files. -* Upgrade to REALM_CORE_VERSION=5.14.0 -* Upgrade to REALM_SYNC_VERSION=3.15.1 - -3.13.1 Release notes (2019-01-03) -============================================================= - -### Fixed - -* Fix a crash when iterating over `Realm.subscriptions()` using for-in. - (Since 3.13.0, PR [#6050](https://github.com/realm/realm-swift/pull/6050)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -3.13.0 Release notes (2018-12-14) -============================================================= - -### Enhancements - -* Add `Realm.subscriptions()`/`-[RLMRealm subscriptions]` and - `Realm.subscription(named:)`/`-[RLMRealm subscriptionWithName:]` to enable - looking up existing query-based sync subscriptions. - (PR: https://github.com/realm/realm-swift/pull/6029). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -3.12.0 Release notes (2018-11-26) -============================================================= - -### Enhancements - -* Add a User-Agent header to HTTP requests made to the Realm Object Server. By - default, this contains information about the Realm library version and your - app's bundle ID. The application identifier can be customized by setting - `RLMSyncManager.sharedManager.userAgent`/`SyncManager.shared.userAgent` prior - to opening a synchronized Realm. - (PR: https://github.com/realm/realm-swift/pull/6007). -* Add Xcode 10.1 binary to the prebuilt package. - -### Fixed - -* None. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -### Internal - -* None. - - -3.11.2 Release notes (2018-11-15) -============================================================= - -### Enhancements - -* Improve the performance of the merge algorithm used for integrating remote - changes from the server. In particular, changesets involving many objects - which all link to a single object should be greatly improved. - -### Fixed - -* Fix a memory leak when removing notification blocks from collections. - PR: [#702](https://github.com/realm/realm-object-store/pull/702), since 1.1.0. -* Fix re-sorting or distincting an already-sorted Results using values from - linked objects. Previously the unsorted order was used to read the values - from the linked objects. - PR [#3102](https://github.com/realm/realm-core/pull/3102), since 3.1.0. -* Fix a set of bugs which could lead to bad changeset assertions when using - sync. The assertions would look something like the following: - `[realm-core-5.10.0] Assertion failed: ndx < size() with (ndx, size()) = [742, 742]`. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -### Internal - -* None. - - -3.11.1 Release notes (2018-10-19) -============================================================= - -### Enhancements - -* None. - -### Fixed - -* Fix `SyncUser.requestEmailConfirmation` not triggering the email confirmation - flow on ROS. (PR [#5953](https://github.com/realm/realm-swift/pull/5953), since 3.5.0) -* Add some missing validation in the getters and setters of properties on - managed Realm objects, which would sometimes result in an application - crashing with a segfault rather than the appropriate exception being thrown - when trying to write to an object which has been deleted. - (PR [#5952](https://github.com/realm/realm-swift/pull/5952), since 2.8.0) - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -### Internal - -* None. - - -3.11.0 Release notes (2018-10-04) -============================================================= - -### Enhancements -* Reduce memory usage when integrating synchronized changes sent by ROS. -* Devices will now report download progress for read-only Realms, allowing the - server to compact Realms more aggressively and reducing the amount of - server-side storage space required. - -### Fixed -* Fix a crash when adding an object with a non-`@objc` `String?` property which - has not been explicitly ignored to a Realm on watchOS 5 (and possibly other - platforms when building with Xcode 10). - (Issue: [5929](https://github.com/realm/realm-swift/issues/5929)). -* Fix some merge algorithm bugs which could result in `BadChangesetError` - being thrown when integrating changes sent by the server. - -### Compatibility -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* **NOTE!!! - You will need to upgrade your Realm Object Server to at least version 3.11.0 - or use [Realm Cloud](https://cloud.realm.io). - If you try to connect to a ROS v3.10.x or previous, you will see an error - like `Wrong protocol version in Sync HTTP request, client protocol version = 25, - server protocol version = 24`.** - -### Internal -* Update to Sync 3.12.2. - - -3.10.0 Release notes (2018-09-19) -============================================================= - -Prebuilt binaries are now built for Xcode 9.2, 9.3, 9.4 and 10.0. - -Older versions of Xcode are still supported when building from source, but you -should be migrating to at least Xcode 9.2 as soon as possible. - -### Enhancements - -* Add support for Watch Series 4 by adding an arm64_32 slice to the library. - -3.9.0 Release notes (2018-09-10) -============================================================= - -### Enhancements - -* Expose RLMSyncUser.refreshToken publicly so that it can be used for custom - HTTP requests to Realm Object Server. -* Add RLMSyncSession.connectionState, which reports whether the session is - currently connected to the Realm Object Server or if it is offline. -* Add `-suspend` and `-resume` methods to `RLMSyncSession` to enable manually - pausing data synchronization. -* Add support for limiting the number of objects matched by a query-based sync - subscription. This requires a server running ROS 3.10.1 or newer. - -### Bugfixes - -* Fix crash when getting the description of a `MigrationObject` which has - `List` properties. -* Fix crash when calling `dynamicList()` on a `MigrationObject`. - -3.8.0 Release notes (2018-09-05) -============================================================= - -### Enhancements - -* Remove some old and no longer applicable migration logic which created an - unencrypted file in the sync metadata directory containing a list of ROS URLs - connected to. -* Add support for pinning SSL certificates used for https and realms - connections by setting `RLMSyncManager.sharedManager.pinnedCertificatePaths` - in obj-c and `SyncManager.shared.pinnedCertificatePaths` in Swift. - -### Bugfixes - -* Fix warnings when building Realm as a static framework with CocoaPods. - -3.7.6 Release notes (2018-08-08) -============================================================= - -### Enhancements - -* Speed up the actual compaction when using compact-on-launch. -* Reduce memory usage when locally merging changes from sync. -* When first connecting to a server, wait to begin uploading changes until - after all changes have been downloaded to reduce the server-side load for - query-based sync. - -3.7.5 Release notes (2018-07-23) -============================================================= - -### Enhancements - -* Improve performance of applying remote changesets from sync. -* Improve performance of creating objects with string primary keys. -* Improve performance of large write transactions. -* Adjust file space allocation strategy to reduce fragmentation, producing - smaller Realm files and typically better performance. -* Close network connections immediately when a sync session is destroyed. -* Report more information in `InvalidDatabase` exceptions. - -### Bugfixes - -* Fix permission denied errors for RLMPlatform.h when building with CocoaPods - and Xcode 10 beta 3. -* Fix a use-after-free when canceling a write transaction which could result in - incorrect "before" values in KVO observations (typically `nil` when a non-nil - value is expected). -* Fix several bugs in the merge algorithm that could lead to memory corruption - and crashes with errors like "bad changeset" and "unreachable code". - -3.7.4 Release notes (2018-06-19) -============================================================= - -### Bugfixes - -* Fix a bug which could potentially flood Realm Object Server with PING - messages after a client device comes back online. - -3.7.3 Release notes (2018-06-18) -============================================================= - -### Enhancements - -* Avoid performing potentially large amounts of pointless background work for - LinkingObjects instances which are accessed and then not immediate deallocated. - -### Bugfixes - -* Fix crashes which could result from extremely fragmented Realm files. -* Fix a bug that could result in a crash with the message "bad changeset error" - when merging changesets from the server. - -3.7.2 Release notes (2018-06-13) -============================================================= - -### Enhancements - -* Add some additional consistency checks that will hopefully produce better - errors when the "prev_ref + prev_size <= ref" assertion failure occurs. - -### Bugfixes - -* Fix a problem in the changeset indexing algorithm that would sometimes - cause "bad permission object" and "bad changeset" errors. -* Fix a large number of linking warnings about symbol visibility by aligning - compiler flags used. -* Fix large increase in size of files produced by `Realm.writeCopy()` introduced in 3.6.0. - -3.7.1 Release notes (2018-06-07) -============================================================= - -* Add support for compiling Realm Swift with Xcode 10 beta 1. - -3.7.0 Release notes (2018-06-06) -============================================================= - -The feature known as Partial Sync has been renamed to Query-based -Synchronization. This has impacted a number of API's. See below for the -details. - -### Deprecations - -* `+[RLMSyncConfiguration initWithUser] has been deprecated in favor of `-[RLMSyncUser configurationWithURL:url]. -* `+[RLMSyncConfiguration automaticConfiguration] has been deprecated in favor of `-[RLMSyncUser configuration]. -* `+[RLMSyncConfiguration automaticConfigurationForUser] has been deprecated in favor of `-[RLMSyncUser configuration]. -* `-[RLMSyncConfiguration isPartial] has been deprecated in favor of `-[RLMSyncConfiguration fullSynchronization]`. - -### Enhancements - -* Add `-[RLMRealm syncSession]` and `Realm.syncSession` to obtain the session used for a synchronized Realm. -* Add `-[RLMSyncUser configuration]`. Query-based sync is the default sync mode for this configuration. -* Add `-[RLMSyncUser configurationWithURL:url]`. Query-based sync is the default sync mode for this configuration. - -3.6.0 Release notes (2018-05-29) -============================================================= - -### Enhancements - -* Improve performance of sync metadata operations and resolving thread-safe - references. -* `shouldCompactOnLaunch` is now supported for compacting the local data of - synchronized Realms. - -### Bugfixes - -* Fix a potential deadlock when a sync session progress callback held the last - strong reference to the sync session. -* Fix some cases where comparisons to `nil` in queries were not properly - serialized when subscribing to a query. -* Don't delete objects added during a migration after a call to `-[RLMMigration - deleteDataForClassName:]`. -* Fix incorrect results and/or crashes when multiple `-[RLMMigration - enumerateObjects:block:]` blocks deleted objects of the same type. -* Fix some edge-cases where `-[RLMMigration enumerateObjects:block:]` - enumerated the incorrect objects following deletions. -* Restore the pre-3.5.0 behavior for Swift optional properties missing an ivar - rather than crashing. - -3.5.0 Release notes (2018-04-25) -============================================================= - -### Enhancements - -* Add wrapper functions for email confirmation and password reset to `SyncUser`. - -### Bugfixes - -* Fix incorrect results when using optional chaining to access a RealmOptional - property in Release builds, or otherwise interacting with a RealmOptional - object after the owning Object has been deallocated. - -3.4.0 Release notes (2018-04-19) -============================================================= - -The prebuilt binary for Carthage is now built for Swift 4.1. - -### Enhancements - -* Expose `RLMSyncManager.authorizationHeaderName`/`SyncManager.authorizationHeaderName` - as a way to override the transport header for Realm Object Server authorization. -* Expose `RLMSyncManager.customRequestHeaders`/`SyncManager.customRequestHeaders` - which allows custom HTTP headers to be appended on requests to the Realm Object Server. -* Expose `RLMSSyncConfiguration.urlPrefix`/`SyncConfiguration.urlPrefix` as a mechanism - to replace the default path prefix in Realm Sync WebSocket requests. - -3.3.2 Release notes (2018-04-03) -============================================================= - -Add a prebuilt binary for Xcode 9.3. - -3.3.1 Release notes (2018-03-28) -============================================================= - -Realm Object Server v3.0.0 or newer is required when using synchronized Realms. - -### Enhancements - -* Expose `RLMObject.object(forPrimaryKey:)` as a factory method for Swift so - that it is callable with recent versions of Swift. - -### Bugfixes - -* Exclude the RLMObject-derived Permissions classes from the types repored by - `Realm.Configuration.defaultConfiguration.objectTypes` to avoid a failed - cast. -* Cancel pending `Realm.asyncOpen()` calls when authentication fails with a - non-transient error such as missing the Realm path in the URL. -* Fix "fcntl() inside prealloc()" errors on APFS. - -3.3.0 Release notes (2018-03-19) -============================================================= - -Realm Object Server v3.0.0 or newer is required when using synchronized Realms. - -### Enhancements - -* Add `Realm.permissions`, `Realm.permissions(forType:)`, and `Realm.permissions(forClassNamed:)` as convenience - methods for accessing the permissions of the Realm or a type. - -### Bugfixes - -* Fix `+[RLMClassPermission objectInRealm:forClass:]` to work for classes that are part of the permissions API, - such as `RLMPermissionRole`. -* Fix runtime errors when applications define an `Object` subclass with the - same name as one of the Permissions object types. - -3.2.0 Release notes (2018-03-15) -============================================================= - -Realm Object Server v3.0.0 or newer is required when using synchronized Realms. - -### Enhancements - -* Added an improved API for adding subscriptions in partially-synchronized Realms. `Results.subscribe()` can be - used to subscribe to any result set, and the returned `SyncSubscription` object can be used to observe the state - of the subscription and ultimately to remove the subscription. See the documentation for more information - (). -* Added a fine-grained permissions system for use with partially-synchronized Realms. This allows permissions to be - defined at the level of individual objects or classes. See the documentation for more information - (). -* Added `SyncConfiguration.automatic()` and `SyncConfiguration.automatic(user:)`. - These methods return a `Realm.Configuration` appropriate for syncing with the default - synced Realm for the current (or specified) user. These should be considered the preferred methods - for accessing synced Realms going forwards. -* Added `+[RLMSyncSession sessionForRealm:]` to retrieve the sync session corresponding to a `RLMRealm`. - -### Bugfixes - -* Fix incorrect initalization of `RLMSyncManager` that made it impossible to - set `errorHandler`. -* Fix compiler warnings when building with Xcode 9.3. -* Fix some warnings when running with UBsan. - -3.2.0-rc.1 Release notes (2018-03-14) -============================================================= - -Realm Object Server v3.0.0-rc.1 or newer is required when using synchronized Realms. - -### Enhancements - -* Added `SyncConfiguration.automatic()` and `SyncConfiguration.automatic(user:)`. - These methods return a `Realm.Configuration` appropriate for syncing with the default - synced Realm for the current (or specified). These should be considered the preferred methods - for accessing synced Realms going forwards. -* A role is now automatically created for each user with that user as its only member. - This simplifies the common use case of restricting access to specific objects to a single user. - This role can be accessed at `PermissionUser.role`. -* Improved error reporting when the server rejects a schema change due to a lack of permissions. - -### Bugfixes - -* Fix incorrect initalization of `RLMSyncManager` that made it impossible to - set `errorHandler`. -* Fix compiler warnings when building with Xcode 9.3. - -3.2.0-beta.3 Release notes (2018-03-01) -============================================================= - -Realm Object Server v3.0.0-alpha.9 or newer is required when using synchronized Realms. - -### Bugfixes - -* Fix a crash that would occur when using partial sync with Realm Object Server v3.0.0-alpha.9. - -3.2.0-beta.2 Release notes (2018-02-28) -============================================================= - -Realm Object Server v3.0.0-alpha.8 or newer is required when using synchronized Realms. - -### Enhancements - -* Added `findOrCreate(forRoleNamed:)` and `findOrCreate(forRole:)` to `List` - to simplify the process of adding permissions for a role. -* Added `+permissionForRoleNamed:inArray:`, `+permissionForRoleNamed:onRealm:`, - `+permissionForRoleNamed:onClass:realm:`, `+permissionForRoleNamed:onClassNamed:realm:`, - and `+permissionForRoleNamed:onObject:` to `RLMSyncPermission` to simplify the process - of adding permissions for a role. -* Added `+[RLMSyncSession sessionForRealm:]` to retrieve the sync session corresponding to a `RLMRealm`. - -### Bugfixes - -* `PermissionRole.users` and `PermissionUser.roles` are now public as intended. -* Fixed the handling of `setPermissions` in `-[RLMRealm privilegesForRealm]` and related methods. - -3.2.0-beta.1 Release notes (2018-02-19) -============================================================= - -### Enhancements - -* Added an improved API for adding subscriptions in partially-synchronized Realms. `Results.subscribe()` can be - used to subscribe to any result set, and the returned `SyncSubscription` object can be used to observe the state - of the subscription and ultimately to remove the subscription. -* Added a fine-grained permissions system for use with partially-synchronized Realms. This allows permissions to be - defined at the level of individual objects or classes. See `Permission` and related types for more information. - -### Bugfixes - -* Fix some warnings when running with UBsan. - -3.1.1 Release notes (2018-02-03) -============================================================= - -Prebuilt Swift frameworks for Carthage are now built with Xcode 9.2. - -### Bugfixes - -* Fix a memory leak when opening Realms with an explicit `objectTypes` array - from Swift. - -3.1.0 Release notes (2018-01-16) -============================================================= - -* Prebuilt frameworks are now included for Swift 3.2.3 and 4.0.3. -* Prebuilt frameworks are no longer included for Swift 3.0.x. -* Building from source with Xcode versions prior to Xcode 8.3 is no longer supported. - -### Enhancements - -* Add `Results.distinct(by:)` / `-[RLMResults distinctResultsUsingKeyPaths:]`, which return a `Results` - containing only objects with unique values at the given key paths. -* Improve performance of change checking for notifications in certain cases. -* Realm Object Server errors not explicitly recognized by the client are now reported to the application - regardless. -* Add support for JSON Web Token as a sync credential source. -* Add support for Nickname and Anonymous Auth as a sync credential source. -* Improve allocator performance when writing to a highly fragmented file. This - should significantly improve performance when inserting large numbers of - objects which have indexed properties. -* Improve write performance for complex object graphs involving many classes - linking to each other. - -### Bugfixes - -* Add a missing check for a run loop in the permission API methods which - require one. -* Fix some cases where non-fatal sync errors were being treated as fatal errors. - -3.0.2 Release notes (2017-11-08) -============================================================= - -Prebuilt frameworks are now included for Swift 3.2.2 and 4.0.2. - -### Bugfixes - -* Fix a crash when a linking objects property is retrieved from a model object instance via - Swift subscripting. -* Fix incorrect behavior if a call to `posix_fallocate` is interrupted. - -3.0.1 Release notes (2017-10-26) -============================================================= - -### Bugfixes - -* Explicitly exclude KVO-generated object subclasses from the schema. -* Fix regression where the type of a Realm model class is not properly determined, causing crashes - when a type value derived at runtime by `type(of:)` is passed into certain APIs. -* Fix a crash when an `Object` subclass has implicitly ignored `let` - properties. -* Fix several cases where adding a notification block from within a - notification callback could produce incorrect results. - -3.0.0 Release notes (2017-10-16) -============================================================= - -### Breaking Changes -* iOS 7 is no longer supported. -* Synchronized Realms require a server running Realm Object Server v2.0 or higher. -* Computed properties on Realm object types are detected and no - longer added to the automatically generated schema. -* The Objective-C and Swift `create(_:, value: update:)` APIs now - correctly nil out nullable properties when updating an existing - object when the `value` argument specifies nil or `NSNull` for - the property value. -* `-[RLMRealm addOrUpdateObjects:]` and `-[RLMRealm deleteObjects:]` now - require their argument to conform to `NSFastEnumeration`, to match similar - APIs that also take collections. -* The way interactive sync errors (client reset and permission denied) - are delivered to the user has been changed. Instead of a block which can - be invoked to immediately delete the offending Realm file, an opaque - token object of type `RLMSyncErrorActionToken` will be returned in the - error object's `userInfo` dictionary. This error object can be passed - into the new `+[RLMSyncSession immediatelyHandleError:]` API to delete - the files. -* The return types of the `SyncError.clientResetInfo()` and - `SyncError.deleteRealmUserInfo()` APIs have been changed. They now return - `RLMSyncErrorActionToken`s or `SyncError.ActionToken`s instead of closures. -* The class methods `Object.className()`, `Object.objectUtilClass()`, and - the property `Object.isInvalidated` can no longer be overriden. -* The callback which runs when a sync user login succeeds or fails - now runs on the main queue by default, or can be explicitly specified - by a new `callbackQueue` parameter on the `{RLM}SyncUser.logIn(...)` API. -* Fix empty strings, binary data, and null on the right side of `BEGINSWITH`, - `ENDSWITH` and `CONTAINS` operators in predicates to match Foundation's - semantics of never matching any strings or data. -* Swift `Object` comparison and hashing behavior now works the same way as - that of `RLMObject` (objects are now only considered equatable if their - model class defines a primary key). -* Fix the way the hash property works on `Object` when the object model has - no primary key. -* Fix an issue where if a Swift model class defined non-generic managed - properties after generic Realm properties (like `List`), the schema - would be constructed incorrectly. Fixes an issue where creating such - models from an array could fail. -* Loosen `RLMArray` and `RLMResults`'s generic constraint from `RLMObject` to - `NSObject`. This may result in having to add some casts to disambiguate - types. -* Remove `RLMSyncPermissionResults`. `RLMSyncPermission`s are now vended out - using a `RLMResults`. This results collection supports all normal collection - operations except for setting values using key-value coding (since - `RLMSyncPermission`s are immutable) and the property aggregation operations. -* `RLMSyncUserInfo` has been significantly enhanced. It now contains metadata - about a user stored on the Realm Object Server, as well as a list of all user account - data associated with that user. -* Starting with Swift 4, `List` now conforms to `MutableCollection` instead of - `RangeReplaceableCollection`. For Swift 4, the empty collection initializer has been - removed, and default implementations of range replaceable collection methods that - make sense for `List` have been added. -* `List.removeLast()` now throws an exception if the list is empty, to more closely match - the behavior of the standard library's `Collection.removeLast()` implementation. -* `RealmCollection`'s associated type `Element` has been renamed `ElementType`. -* The following APIs have been renamed: - -| Old API | New API | -|:------------------------------------------------------------|:---------------------------------------------------------------| -| `NotificationToken.stop()` | `NotificationToken.invalidate()` | -| `-[RLMNotificationToken stop]` | `-[RLMNotificationToken invalidate]` | -| `RealmCollection.addNotificationBlock(_:)` | `RealmCollection.observe(_:)` | -| `RLMSyncProgress` | `RLMSyncProgressMode` | -| `List.remove(objectAtIndex:)` | `List.remove(at:)` | -| `List.swap(_:_:)` | `List.swapAt(_:_:)` | -| `SyncPermissionValue` | `SyncPermission` | -| `RLMSyncPermissionValue` | `RLMSyncPermission` | -| `-[RLMSyncPermission initWithRealmPath:userID:accessLevel]` | `-[RLMSyncPermission initWithRealmPath:identity:accessLevel:]` | -| `RLMSyncPermission.userId` | `RLMSyncPermission.identity` | -| `-[RLMRealm addOrUpdateObjectsInArray:]` | `-[RLMRealm addOrUpdateObjects:]` | - -* The following APIs have been removed: - -| Removed API | Replacement | -|:-------------------------------------------------------------|:------------------------------------------------------------------------------------------| -| `Object.className` | None, was erroneously present. | -| `RLMPropertyTypeArray` | `RLMProperty.array` | -| `PropertyType.array` | `Property.array` | -| `-[RLMArray sortedResultsUsingProperty:ascending:]` | `-[RLMArray sortedResultsUsingKeyPath:ascending:]` | -| `-[RLMCollection sortedResultsUsingProperty:ascending:]` | `-[RLMCollection sortedResultsUsingKeyPath:ascending:]` | -| `-[RLMResults sortedResultsUsingProperty:ascending:]` | `-[RLMResults sortedResultsUsingKeyPath:ascending:]` | -| `+[RLMSortDescriptor sortDescriptorWithProperty:ascending:]` | `+[RLMSortDescriptor sortDescriptorWithKeyPath:ascending:]` | -| `RLMSortDescriptor.property` | `RLMSortDescriptor.keyPath` | -| `AnyRealmCollection.sorted(byProperty:ascending:)` | `AnyRealmCollection.sorted(byKeyPath:ascending:)` | -| `List.sorted(byProperty:ascending:)` | `List.sorted(byKeyPath:ascending:)` | -| `LinkingObjects.sorted(byProperty:ascending:)` | `LinkingObjects.sorted(byKeyPath:ascending:)` | -| `Results.sorted(byProperty:ascending:)` | `Results.sorted(byKeyPath:ascending:)` | -| `SortDescriptor.init(property:ascending:)` | `SortDescriptor.init(keyPath:ascending:)` | -| `SortDescriptor.property` | `SortDescriptor.keyPath` | -| `+[RLMRealm migrateRealm:configuration:]` | `+[RLMRealm performMigrationForConfiguration:error:]` | -| `RLMSyncManager.disableSSLValidation` | `RLMSyncConfiguration.enableSSLValidation` | -| `SyncManager.disableSSLValidation` | `SyncConfiguration.enableSSLValidation` | -| `RLMSyncErrorBadResponse` | `RLMSyncAuthErrorBadResponse` | -| `RLMSyncPermissionResults` | `RLMResults` | -| `SyncPermissionResults` | `Results` | -| `RLMSyncPermissionChange` | `-[RLMSyncUser applyPermission:callback]` / `-[RLMSyncUser deletePermission:callback:]` | -| `-[RLMSyncUser permissionRealmWithError:]` | `-[RLMSyncUser retrievePermissionsWithCallback:]` | -| `RLMSyncPermissionOffer` | `-[RLMSyncUser createOfferForRealmAtURL:accessLevel:expiration:callback:]` | -| `RLMSyncPermissionOfferResponse` | `-[RLMSyncUser acceptOfferForToken:callback:]` | -| `-[NSError rlmSync_clientResetBlock]` | `-[NSError rlmSync_errorActionToken]` / `-[NSError rlmSync_clientResetBackedUpRealmPath]` | -| `-[NSError rlmSync_deleteRealmBlock]` | `-[NSError rlmSync_errorActionToken]` | - -### Enhancements -* `List` can now contain values of types `Bool`, `Int`, `Int8`, `Int16`, - `Int32`, `Int64`, `Float`, `Double`, `String`, `Data`, and `Date` (and - optional versions of all of these) in addition to `Object` subclasses. - Querying `List`s containing values other than `Object` subclasses is not yet - implemented. -* `RLMArray` can now be constrained with the protocols `RLMBool`, `RLMInt`, - `RLMFloat`, `RLMDouble`, `RLMString`, `RLMData`, and `RLMDate` in addition to - protocols defined with `RLM_ARRAY_TYPE`. By default `RLMArray`s of - non-`RLMObject` types can contain null. Indicating that the property is - required (by overriding `+requiredProperties:`) will instead make the values - within the array required. Querying `RLMArray`s containing values other than - `RLMObject` subclasses is not yet implemented. -* Add a new error code to denote 'permission denied' errors when working - with synchronized Realms, as well as an accompanying block that can be - called to inform the binding that the offending Realm's files should be - deleted immediately. This allows recovering from 'permission denied' - errors in a more robust manner. See the documentation for - `RLMSyncErrorPermissionDeniedError` for more information. -* Add Swift `Object.isSameObject(as:_)` API to perform the same function as - the existing Objective-C API `-[RLMObject isEqualToObject:]`. -* Opening a synced Realm whose local copy was created with an older version of - Realm Mobile Platfrom when a migration is not possible to the current version - will result in an `RLMErrorIncompatibleSyncedFile` / `incompatibleSyncedFile` - error. When such an error occurs, the original file is moved to a backup - location, and future attempts to open the synchronized Realm will result in a new - file being created. If you wish to migrate any data from the backup Realm you can - open it using the backup Realm configuration available on the error object. -* Add a preview of partial synchronization. Partial synchronization allows a - synchronized Realm to be opened in such a way that only objects requested by - the user are synchronized to the device. You can use it by setting the - `isPartial` property on a `SyncConfiguration`, opening the Realm, and then - calling `Realm.subscribe(to:where:callback:)` with the type of object you're - interested in, a string containing a query determining which objects you want - to subscribe to, and a callback which will report the results. You may add as - many subscriptions to a synced Realm as necessary. - -### Bugfixes -* Realm no longer throws an "unsupported instruction" exception in some cases - when opening a synced Realm asynchronously. -* Realm Swift APIs that filter or look up the index of an object based on a - format string now properly handle optional arguments in their variadic argument - list. -* `-[RLMResults indexOfObject:]` now properly accounts for access - level. -* Fix a race condition that could lead to a crash accessing to the freed configuration object - if a default configuration was set from a different thread. -* Fixed an issue that crash when enumerating after clearing data during migration. -* Fix a bug where a synced Realm couldn't be reopened even after a successful client reset - in some cases. -* Fix a bug where the sync subsystem waited too long in certain cases to reconnect to the server. -* Fix a bug where encrypted sync-related metadata was incorrectly deleted from upgrading users, - resulting in all users being logged out. -* Fix a bug where permission-related data continued to be synced to a client even after the user - that data belonged to logged out. -* Fix an issue where collection notifications might be delivered inconsistently if a notification - callback was added within another callback for the same collection. - -3.0.0-rc.2 Release notes (2017-10-14) -============================================================= - -### Enhancements -* Reinstate `RLMSyncPermissionSortPropertyUserID` to allow users to sort permissions - to their own Realms they've granted to others. - -### Bugfixes -* `-[RLMResults indexOfObject:]` now properly accounts for access - level. -* Fix a race condition that could lead to a crash accessing to the freed configuration object - if a default configuration was set from a different thread. -* Fixed an issue that crash when enumerating after clearing data during migration. -* Fix a bug where a synced Realm couldn't be reopened even after a successful client reset - in some cases. -* Fix a bug where the sync subsystem waited too long in certain cases to reconnect to the server. -* Fix a bug where encrypted sync-related metadata was incorrectly deleted from upgrading users, - resulting in all users being logged out. -* Fix a bug where permission-related data continued to be synced to a client even after the user - that data belonged to logged out. -* Fix an issue where collection notifications might be delivered inconsistently if a notification - callback was added within another callback for the same collection. - -3.0.0-rc.1 Release notes (2017-10-03) -============================================================= - -### Breaking Changes -* Remove `RLMSyncPermissionSortPropertyUserID` to reflect changes in how the - Realm Object Server reports permissions for a user. -* Remove `RLMSyncPermissionOffer` and `RLMSyncPermissionOfferResponse` classes - and associated helper methods and functions. Use the - `-[RLMSyncUser createOfferForRealmAtURL:accessLevel:expiration:callback:]` - and `-[RLMSyncUser acceptOfferForToken:callback:]` methods instead. - -### Bugfixes - -* The keychain item name used by Realm to manage the encryption keys for - sync-related metadata is now set to a per-app name based on the bundle - identifier. Keys that were previously stored within the single, shared Realm - keychain item will be transparently migrated to the per-application keychain - item. -* Fix downloading of the Realm core binaries when Xcode's command-line tools are - set as the active developer directory for command-line interactions. -* Fix a crash that could occur when resolving a ThreadSafeReference to a `List` - whose parent object had since been deleted. - -3.0.0-beta.4 Release notes (2017-09-22) -============================================================= - -### Breaking Changes - -* Rename `List.remove(objectAtIndex:)` to `List.remove(at:)` to match the name - used by 'RangeReplaceableCollection'. -* Rename `List.swap()` to `List.swapAt()` to match the name used by 'Array'. -* Loosen `RLMArray` and `RLMResults`'s generic constraint from `RLMObject` to - `NSObject`. This may result in having to add some casts to disambiguate - types. -* Remove `RLMPropertyTypeArray` in favor of a separate bool `array` property on - `RLMProperty`/`Property`. -* Remove `RLMSyncPermissionResults`. `RLMSyncPermission`s are now vended out - using a `RLMResults`. This results collection supports all normal collection - operations except for setting values using KVO (since `RLMSyncPermission`s are - immutable) and the property aggregation operations. -* `RealmCollection`'s associated type `Element` has been renamed `ElementType`. -* Realm Swift collection types (`List`, `Results`, `AnyRealmCollection`, and - `LinkingObjects` have had their generic type parameter changed from `T` to - `Element`). -* `RealmOptional`'s generic type parameter has been changed from `T` to `Value`. -* `RLMSyncUserInfo` has been significantly enhanced. It now contains metadata - about a user stored on the Realm Object Server, as well as a list of all user account - data associated with that user. -* Starting with Swift 4, `List` now conforms to `MutableCollection` instead of - `RangeReplaceableCollection`. For Swift 4, the empty collection initializer has been - removed, and default implementations of range replaceable collection methods that - make sense for `List` have been added. -* `List.removeLast()` now throws an exception if the list is empty, to more closely match - the behavior of the standard library's `Collection.removeLast()` implementation. - -### Enhancements - -* `List` can now contain values of types `Bool`, `Int`, `Int8`, `Int16`, - `Int32`, `Int64`, `Float`, `Double`, `String`, `Data`, and `Date` (and - optional versions of all of these) in addition to `Object` subclasses. - Querying `List`s containing values other than `Object` subclasses is not yet - implemented. -* `RLMArray` can now be constrained with the protocols `RLMBool`, `RLMInt`, - `RLMFloat`, `RLMDouble`, `RLMString`, `RLMData`, and `RLMDate` in addition to - protocols defined with `RLM_ARRAY_TYPE`. By default `RLMArray`s of - non-`RLMObject` types can contain null. Indicating that the property is - required (by overriding `+requiredProperties:`) will instead make the values - within the array required. Querying `RLMArray`s containing values other than - `RLMObject` subclasses is not yet implemented. -* Opening a synced Realm whose local copy was created with an older version of - Realm Mobile Platfrom when a migration is not possible to the current version - will result in an `RLMErrorIncompatibleSyncedFile` / `incompatibleSyncedFile` - error. When such an error occurs, the original file is moved to a backup - location, and future attempts to open the synchronized Realm will result in a new - file being created. If you wish to migrate any data from the backup Realm you can - open it using the backup Realm configuration available on the error object. -* Add preview support for partial synchronization. Partial synchronization is - allows a synchronized Realm to be opened in such a way that only objects - requested by the user are synchronized to the device. You can use it by setting - the `isPartial` property on a `SyncConfiguration`, opening the Realm, and then - calling `Realm.subscribe(to:where:callback:)` with the type of object you're - interested in, a string containing a query determining which objects you want - to subscribe to, and a callback which will report the results. You may add as - many subscriptions to a synced Realm as necessary. - -### Bugfixes - -* Realm Swift APIs that filter or look up the index of an object based on a - format string now properly handle optional arguments in their variadic argument - list. - -3.0.0-beta.3 Release notes (2017-08-23) -============================================================= - -### Breaking Changes - -* iOS 7 is no longer supported. -* Computed properties on Realm object types are detected and no - longer added to the automatically generated schema. -* `-[RLMRealm addOrUpdateObjectsInArray:]` has been renamed to - `-[RLMRealm addOrUpdateObjects:]` for consistency with similar methods - that add or delete objects. -* `-[RLMRealm addOrUpdateObjects:]` and `-[RLMRealm deleteObjects:]` now - require their argument to conform to `NSFastEnumeration`, to match similar - APIs that also take collections. -* Remove deprecated `{RLM}SyncPermission` and `{RLM}SyncPermissionChange` - classes. -* `{RLM}SyncPermissionValue` has been renamed to just `{RLM}SyncPermission`. - Its `userId` property has been renamed `identity`, and its - `-initWithRealmPath:userID:accessLevel:` initializer has been renamed - `-initWithRealmPath:identity:accessLevel:`. -* Remove deprecated `-[RLMSyncUser permissionRealmWithError:]` and - `SyncUser.permissionRealm()` APIs. Use the new permissions system. -* Remove deprecated error `RLMSyncErrorBadResponse`. Use - `RLMSyncAuthErrorBadResponse` instead. -* The way interactive sync errors (client reset and permission denied) - are delivered to the user has been changed. Instead of a block which can - be invoked to immediately delete the offending Realm file, an opaque - token object of type `RLMSyncErrorActionToken` will be returned in the - error object's `userInfo` dictionary. This error object can be passed - into the new `+[RLMSyncSession immediatelyHandleError:]` API to delete - the files. -* Remove `-[NSError rlmSync_clientResetBlock]` and - `-[NSError rlmSync_deleteRealmBlock]` APIs. -* The return types of the `SyncError.clientResetInfo()` and - `SyncError.deleteRealmUserInfo()` APIs have been changed. They now return - `RLMSyncErrorActionToken`s or `SyncError.ActionToken`s instead of closures. -* The (erroneously added) instance property `Object.className` has been - removed. -* The class methods `Object.className()`, `Object.objectUtilClass()`, and - the property `Object.isInvalidated` can no longer be overriden. -* The callback which runs when a sync user login succeeds or fails - now runs on the main queue by default, or can be explicitly specified - by a new `callbackQueue` parameter on the `{RLM}SyncUser.logIn(...)` API. -* Rename `{RLM}NotificationToken.stop()` to `invalidate()` and - `{RealmCollection,SyncPermissionResults}.addNotificationBlock(_:)` to - `observe(_:)` to mirror Foundation's new KVO APIs. -* The `RLMSyncProgress` enum has been renamed `RLMSyncProgressMode`. -* Remove deprecated `{RLM}SyncManager.disableSSLValidation` property. Disable - SSL validation on a per-Realm basis by setting the `enableSSLValidation` - property on `{RLM}SyncConfiguration` instead. -* Fix empty strings, binary data, and null on the right side of `BEGINSWITH`, - `ENDSWITH` and `CONTAINS` operators in predicates to match Foundation's - semantics of never matching any strings or data. -* Swift `Object` comparison and hashing behavior now works the same way as - that of `RLMObject` (objects are now only considered equatable if their - model class defines a primary key). -* Fix the way the hash property works on `Object` when the object model has - no primary key. -* Fix an issue where if a Swift model class defined non-generic managed - properties after generic Realm properties (like `List`), the schema - would be constructed incorrectly. Fixes an issue where creating such - models from an array could fail. - -### Enhancements - -* Add Swift `Object.isSameObject(as:_)` API to perform the same function as - the existing Objective-C API `-[RLMObject isEqualToObject:]`. -* Expose additional authentication-related errors that might be reported by - a Realm Object Server. -* An error handler can now be registered on `{RLM}SyncUser`s in order to - report authentication-related errors that affect the user. - -### Bugfixes - -* Sync users are now automatically logged out upon receiving certain types - of errors that indicate they are no longer logged into the server. For - example, users who are authenticated using third-party credentials will find - themselves logged out of the Realm Object Server if the third-party identity - service indicates that their credential is no longer valid. -* Address high CPU usage and hangs in certain cases when processing collection - notifications in highly-connected object graphs. - -3.0.0-beta.2 Release notes (2017-07-26) -============================================================= - -### Breaking Changes - -* Remove the following deprecated Objective-C APIs: - `-[RLMArray sortedResultsUsingProperty:ascending:]`, - `-[RLMCollection sortedResultsUsingProperty:ascending:]`, - `-[RLMResults sortedResultsUsingProperty:ascending:]`, - `+[RLMSortDescriptor sortDescriptorWithProperty:ascending:]`, - `RLMSortDescriptor.property`. - These APIs have been superseded by equivalent APIs that take - or return key paths instead of property names. -* Remove the following deprecated Objective-C API: - `+[RLMRealm migrateRealm:configuration:]`. - Please use `+[RLMRealm performMigrationForConfiguration:error:]` instead. -* Remove the following deprecated Swift APIs: - `AnyRealmCollection.sorted(byProperty:, ascending:)`, - `LinkingObjects.sorted(byProperty:, ascending:)`, - `List.sorted(byProperty:, ascending:)`, - `Results.sorted(byProperty:, ascending:)`, - `SortDescriptor.init(property:, ascending:)`, - `SortDescriptor.property`. - These APIs have been superseded by equivalent APIs that take - or return key paths instead of property names. -* The Objective-C and Swift `create(_:, value: update:)` APIs now - correctly nil out nullable properties when updating an existing - object when the `value` argument specifies nil or `NSNull` for - the property value. - -### Enhancements - -* It is now possible to create and log in multiple Realm Object Server users - with the same identity if they originate from different servers. Note that - if the URLs are different aliases for the same authentication server each - user will still be treated as separate (e.g. they will have their own copy - of each synchronized Realm opened using them). It is highly encouraged that - users defined using the access token credential type be logged in with an - authentication server URL specified; this parameter will become mandatory - in a future version of the SDK. -* Add `-[RLMSyncUser retrieveInfoForUser:identityProvider:completion:]` - API allowing administrator users to retrieve information about a user based - on their provider identity (for example, a username). Requires any edition - of the Realm Object Server 1.8.2 or later. - -### Bugfixes - -* Realm no longer throws an "unsupported instruction" exception in some cases - when opening a synced Realm asynchronously. - -3.0.0-beta Release notes (2017-07-14) -============================================================= - -### Breaking Changes - -* Synchronized Realms require a server running Realm Object Server v2.0 or higher. - -### Enhancements - -* Add a new error code to denote 'permission denied' errors when working - with synchronized Realms, as well as an accompanying block that can be - called to inform the binding that the offending Realm's files should be - deleted immediately. This allows recovering from 'permission denied' - errors in a more robust manner. See the documentation for - `RLMSyncErrorPermissionDeniedError` for more information. -* Add `-[RLMSyncPermissionValue initWithRealmPath:username:accessLevel:]` - API allowing permissions to be applied to a user based on their username - (usually, an email address). Requires any edition of the Realm Object - Server 1.6.0 or later. -* Improve performance of creating Swift objects which contain at least one List - property. - -### Bugfixes - -* `List.description` now reports the correct types for nested lists. -* Fix unmanaged object initialization when a nested property type returned - `false` from `Object.shouldIncludeInDefaultSchema()`. -* Don't clear RLMArrays on self-assignment. - -2.10.2 Release notes (2017-09-27) -============================================================= - -### Bugfixes - -* The keychain item name used by Realm to manage the encryption keys for - sync-related metadata is now set to a per-app name based on the bundle - identifier. Keys that were previously stored within the single, shared Realm - keychain item will be transparently migrated to the per-application keychain - item. -* Fix downloading of the Realm core binaries when Xcode's command-line tools are - set as the active developer directory for command-line interactions. -* Fix a crash that could occur when resolving a ThreadSafeReference to a `List` - whose parent object had since been deleted. - -2.10.1 Release notes (2017-09-14) -============================================================= - -Swift binaries are now produced for Swift 3.0, 3.0.1, 3.0.2, 3.1, 3.2 and 4.0. - -### Enhancements - -* Auxiliary files are excluded from backup by default. - -### Bugfixes - -* Fix more cases where assigning an RLMArray property to itself would clear the - RLMArray. - -2.10.0 Release notes (2017-08-21) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Expose additional authentication-related errors that might be reported by - a Realm Object Server. -* An error handler can now be registered on `{RLM}SyncUser`s in order to - report authentication-related errors that affect the user. - -### Bugfixes - -* Sorting Realm collection types no longer throws an exception on iOS 7. -* Sync users are now automatically logged out upon receiving certain types - of errors that indicate they are no longer logged into the server. For - example, users who are authenticated using third-party credentials will find - themselves logged out of the Realm Object Server if the third-party identity - service indicates that their credential is no longer valid. -* Address high CPU usage and hangs in certain cases when processing collection - notifications in highly-connected object graphs. - -2.9.1 Release notes (2017-08-01) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* The `shouldCompactOnLaunch` block is no longer invoked if the Realm at that - path is already open on other threads. -* Fix an assertion failure in collection notifications when changes are made to - the schema via sync while the notification block is active. - -2.9.0 Release notes (2017-07-26) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Add a new error code to denote 'permission denied' errors when working - with synchronized Realms, as well as an accompanying block that can be - called to inform the binding that the offending Realm's files should be - deleted immediately. This allows recovering from 'permission denied' - errors in a more robust manner. See the documentation for - `RLMSyncErrorPermissionDeniedError` for more information. -* Add `-[RLMSyncPermissionValue initWithRealmPath:username:accessLevel:]` - API allowing permissions to be applied to a user based on their username - (usually, an email address). Requires any edition of the Realm Object - Server 1.6.0 or later. -* Improve performance of creating Swift objects which contain at least one List - property. -* It is now possible to create and log in multiple Realm Object Server users - with the same identity if they originate from different servers. Note that - if the URLs are different aliases for the same authentication server each - user will still be treated as separate (e.g. they will have their own copy - of each synchronized Realm opened using them). It is highly encouraged that - users defined using the access token credential type be logged in with an - authentication server URL specified; this parameter will become mandatory - in a future version of the SDK. -* Add `-[RLMSyncUser retrieveInfoForUser:identityProvider:completion:]` - API allowing administrator users to retrieve information about a user based - on their provider identity (for example, a username). Requires any edition - of the Realm Object Server 1.8.2 or later. - -### Bugfixes - -* `List.description` now reports the correct types for nested lists. -* Fix unmanaged object initialization when a nested property type returned - `false` from `Object.shouldIncludeInDefaultSchema()`. -* Don't clear RLMArrays on self-assignment. - -2.8.3 Release notes (2017-06-20) -============================================================= - -### Bugfixes - -* Properly update RealmOptional properties when adding an object with `add(update: true)`. -* Add some missing quotes in error messages. -* Fix a performance regression when creating objects with primary keys. - -2.8.2 Release notes (2017-06-16) -============================================================= - -### Bugfixes - -* Fix an issue where synchronized Realms would eventually disconnect from the - remote server if the user object used to define their sync configuration - was destroyed. -* Restore support for changing primary keys in migrations (broken in 2.8.0). -* Revert handling of adding objects with nil properties to a Realm to the - pre-2.8.0 behavior. - -2.8.1 Release notes (2017-06-12) -============================================================= - -Add support for building with Xcode 9 Beta 1. - -### Bugfixes - -* Fix setting a float property to NaN. -* Fix a crash when using compact on launch in combination with collection - notifications. - -2.8.0 Release notes (2017-06-02) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Enable encryption on watchOS. -* Add `-[RLMSyncUser changePassword:forUserID:completion:]` API to change an - arbitrary user's password if the current user has administrative privileges - and using Realm's 'password' authentication provider. - Requires any edition of the Realm Object Server 1.6.0 or later. - -### Bugfixes - -* Suppress `-Wdocumentation` warnings in Realm C++ headers when using CocoaPods - with Xcode 8.3.2. -* Throw an appropriate error rather than crashing when an RLMArray is assigned - to an RLMArray property of a different type. -* Fix crash in large (>4GB) encrypted Realm files. -* Improve accuracy of sync progress notifications. -* Fix an issue where synchronized Realms did not connect to the remote server - in certain situations, such as when an application was offline when the Realms - were opened but later regained network connectivity. - -2.7.0 Release notes (2017-05-03) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Use reachability API to minimize the reconnection delay if the network - connection was lost. -* Add `-[RLMSyncUser changePassword:completion:]` API to change the current - user's password if using Realm's 'password' authentication provider. - Requires any edition of the Realm Object Server 1.4.0 or later. -* `{RLM}SyncConfiguration` now has an `enableSSLValidation` property - (and default parameter in the Swift initializer) to allow SSL validation - to be specified on a per-server basis. -* Transactions between a synced Realm and a Realm Object Server can now - exceed 16 MB in size. -* Add new APIs for changing and retrieving permissions for synchronized Realms. - These APIs are intended to replace the existing Realm Object-based permissions - system. Requires any edition of the Realm Object Server 1.1.0 or later. - -### Bugfixes - -* Support Realm model classes defined in Swift with overridden Objective-C - names (e.g. `@objc(Foo) class SwiftFoo: Object {}`). -* Fix `-[RLMMigration enumerateObjects:block:]` returning incorrect `oldObject` - objects when enumerating a class name after previously deleting a `newObject`. -* Fix an issue where `Realm.asyncOpen(...)` would fail to work when opening a - synchronized Realm for which the user only had read permissions. -* Using KVC to set a `List` property to `nil` now clears it to match the - behavior of `RLMArray` properties. -* Fix crash from `!m_awaiting_pong` assertion failure when using synced Realms. -* Fix poor performance or hangs when performing case-insensitive queries on - indexed string properties that contain many characters that don't differ - between upper and lower case (e.g., numbers, punctuation). - -2.6.2 Release notes (2017-04-21) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix an issue where calling `Realm.asyncOpen(...)` with a synchronized Realm - configuration would fail with an "Operation canceled" error. -* Fix initial collection notification sometimes not being delivered for synced - Realms. -* Fix circular links sometimes resulting in objects not being marked as - modified in change notifications. - -2.6.1 Release notes (2017-04-18) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix an issue where calling `Realm.asyncOpen(...)` with a synchronized Realm - configuration would crash in error cases rather than report the error. - This is a small source breaking change if you were relying on the error - being reported to be a `Realm.Error`. - -2.6.0 Release notes (2017-04-18) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Add a `{RLM}SyncUser.isAdmin` property indicating whether a user is a Realm - Object Server administrator. -* Add an API to asynchronously open a Realm and deliver it to a block on a - given queue. This performs all work needed to get the Realm to - a usable state (such as running potentially time-consuming migrations) on a - background thread before dispatching to the given queue. In addition, - synchronized Realms wait for all remote content available at the time the - operation began to be downloaded and available locally. -* Add `shouldCompactOnLaunch` block property when configuring a Realm to - determine if it should be compacted before being returned. -* Speed up case-insensitive queries on indexed string properties. -* Add RLMResults's collection aggregate methods to RLMArray. -* Add support for calling the aggregate methods on unmanaged Lists. - -### Bugfixes - -* Fix a deadlock when multiple processes open a Realm at the same time. -* Fix `value(forKey:)`/`value(forKeyPath:)` returning incorrect values for `List` properties. - -2.5.1 Release notes (2017-04-05) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix CocoaPods installation with static libraries and multiple platforms. -* Fix uncaught "Bad version number" exceptions on the notification worker thread - followed by deadlocks when Realms refresh. - -2.5.0 Release notes (2017-03-28) -============================================================= - -Files written by Realm this version cannot be read by earlier versions of Realm. -Old files can still be opened and files open in read-only mode will not be -modified. - -If using synchronized Realms, the Realm Object Server must be running version -1.3.0 or later. - -Swift binaries are now produced for Swift 3.0, 3.0.1, 3.0.2 and 3.1. - -### API Breaking Changes - -* None. - -### Enhancements - -* Add support for multi-level object equality comparisons against `NULL`. -* Add support for the `[d]` modifier on string comparison operators to perform - diacritic-insensitive comparisons. -* Explicitly mark `[[RLMRealm alloc] init]` as unavailable. -* Include the name of the problematic class in the error message when an - invalid property type is marked as the primary key. - -### Bugfixes - -* Fix incorrect column type assertions which could occur after schemas were - merged by sync. -* Eliminate an empty write transaction when opening a synced Realm. -* Support encrypting synchronized Realms by respecting the `encryptionKey` value - of the Realm's configuration. -* Fix crash when setting an `{NS}Data` property close to 16MB. -* Fix for reading `{NS}Data` properties incorrectly returning `nil`. -* Reduce file size growth in cases where Realm versions were pinned while - starting write transactions. -* Fix an assertion failure when writing to large `RLMArray`/`List` properties. -* Fix uncaught `BadTransactLog` exceptions when pulling invalid changesets from - synchronized Realms. -* Fix an assertion failure when an observed `RLMArray`/`List` is deleted after - being modified. - -2.4.4 Release notes (2017-03-13) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Add `(RLM)SyncPermission` class to allow reviewing access permissions for - Realms. Requires any edition of the Realm Object Server 1.1.0 or later. -* Further reduce the number of files opened per thread-specific Realm on macOS, - iOS and watchOS. - -### Bugfixes - -* Fix a crash that could occur if new Realm instances were created while the - application was exiting. -* Fix a bug that could lead to bad version number errors when delivering - change notifications. -* Fix a potential use-after-free bug when checking validity of results. -* Fix an issue where a sync session might not close properly if it receives - an error while being torn down. -* Fix some issues where a sync session might not reconnect to the server properly - or get into an inconsistent state if revived after invalidation. -* Fix an issue where notifications might not fire when the children of an - observed object are changed. -* Fix an issue where progress notifications on sync sessions might incorrectly - report out-of-date values. -* Fix an issue where multiple threads accessing encrypted data could result in - corrupted data or crashes. -* Fix an issue where certain `LIKE` queries could hang. -* Fix an issue where `-[RLMRealm writeCopyToURL:encryptionKey:error]` could create - a corrupt Realm file. -* Fix an issue where incrementing a synced Realm's schema version without actually - changing the schema could cause a crash. - -2.4.3 Release notes (2017-02-20) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Avoid copying copy-on-write data structures, which can grow the file, when the - write does not actually change existing values. -* Improve performance of deleting all objects in an RLMResults. -* Reduce the number of files opened per thread-specific Realm on macOS. -* Improve startup performance with large numbers of `RLMObject`/`Object` - subclasses. - -### Bugfixes - -* Fix synchronized Realms not downloading remote changes when an access token - expires and there are no local changes to upload. -* Fix an issue where values set on a Realm object using `setValue(value:, forKey:)` - that were not themselves Realm objects were not properly converted into Realm - objects or checked for validity. -* Fix an issue where `-[RLMSyncUser sessionForURL:]` could erroneously return a - non-nil value when passed in an invalid URL. -* `SyncSession.Progress.fractionTransferred` now returns 1 if there are no - transferrable bytes. -* Fix sync progress notifications registered on background threads by always - dispatching on a dedicated background queue. -* Fix compilation issues with Xcode 8.3 beta 2. -* Fix incorrect sync progress notification values for Realms originally created - using a version of Realm prior to 2.3.0. -* Fix LLDB integration to be able to display summaries of `RLMResults` once more. -* Reject Swift properties with names which cause them to fall in to ARC method - families rather than crashing when they are accessed. -* Fix sorting by key path when the declared property order doesn't match the order - of properties in the Realm file, which can happen when properties are added in - different schema versions. - -2.4.2 Release notes (2017-01-30) -============================================================= - -### Bugfixes - -* Fix an issue where RLMRealm instances could end up in the autorelease pool - for other threads. - -2.4.1 Release notes (2017-01-27) -============================================================= - -### Bugfixes - -* Fix an issue where authentication tokens were not properly refreshed - automatically before expiring. - -2.4.0 Release notes (2017-01-26) -============================================================= - -This release drops support for compiling with Swift 2.x. -Swift 3.0.0 is now the minimum Swift version supported. - -### API Breaking Changes - -* None. - -### Enhancements - -* Add change notifications for individual objects with an API similar to that - of collection notifications. - -### Bugfixes - -* Fix Realm Objective-C compilation errors with Xcode 8.3 beta 1. -* Fix several error handling issues when renewing expired authentication - tokens for synchronized Realms. -* Fix a race condition leading to bad_version exceptions being thrown in - Realm's background worker thread. - -2.3.0 Release notes (2017-01-19) -============================================================= - -### Sync Breaking Changes - -* Make `PermissionChange`'s `id` property a primary key. - -### API Breaking Changes - -* None. - -### Enhancements - -* Add `SyncPermissionOffer` and `SyncPermissionOfferResponse` classes to allow - creating and accepting permission change events to synchronized Realms between - different users. -* Support monitoring sync transfer progress by registering notification blocks - on `SyncSession`. Specify the transfer direction (`.upload`/`.download`) and - mode (`.reportIndefinitely`/`.forCurrentlyOutstandingWork`) to monitor. - -### Bugfixes - -* Fix a call to `commitWrite(withoutNotifying:)` committing a transaction that - would not have triggered a notification incorrectly skipping the next - notification. -* Fix incorrect results and crashes when conflicting object insertions are - merged by the synchronization mechanism when there is a collection - notification registered for that object type. - -2.2.0 Release notes (2017-01-12) -============================================================= - -### Sync Breaking Changes (In Beta) - -* Sync-related error reporting behavior has been changed. Errors not related - to a particular user or session are only reported if they are classed as - 'fatal' by the underlying sync engine. -* Added `RLMSyncErrorClientResetError` to `RLMSyncError` enum. - -### API Breaking Changes - -* The following Objective-C APIs have been deprecated in favor of newer or preferred versions: - -| Deprecated API | New API | -|:------------------------------------------------------------|:------------------------------------------------------------| -| `-[RLMArray sortedResultsUsingProperty:]` | `-[RLMArray sortedResultsUsingKeyPath:]` | -| `-[RLMCollection sortedResultsUsingProperty:]` | `-[RLMCollection sortedResultsUsingKeyPath:]` | -| `-[RLMResults sortedResultsUsingProperty:]` | `-[RLMResults sortedResultsUsingKeyPath:]` | -| `+[RLMSortDescriptor sortDescriptorWithProperty:ascending]` | `+[RLMSortDescriptor sortDescriptorWithKeyPath:ascending:]` | -| `RLMSortDescriptor.property` | `RLMSortDescriptor.keyPath` | - -* The following Swift APIs have been deprecated in favor of newer or preferred versions: - -| Deprecated API | New API | -|:------------------------------------------------------|:-------------------------------------------------| -| `LinkingObjects.sorted(byProperty:ascending:)` | `LinkingObjects.sorted(byKeyPath:ascending:)` | -| `List.sorted(byProperty:ascending:)` | `List.sorted(byKeyPath:ascending:)` | -| `RealmCollection.sorted(byProperty:ascending:)` | `RealmCollection.sorted(byKeyPath:ascending:)` | -| `Results.sorted(byProperty:ascending:)` | `Results.sorted(byKeyPath:ascending:)` | -| `SortDescriptor(property:ascending:)` | `SortDescriptor(keyPath:ascending:)` | -| `SortDescriptor.property` | `SortDescriptor.keyPath` | - -### Enhancements - -* Introduce APIs for safely passing objects between threads. Create a - thread-safe reference to a thread-confined object by passing it to the - `+[RLMThreadSafeReference referenceWithThreadConfined:]`/`ThreadSafeReference(to:)` - constructor, which you can then safely pass to another thread to resolve in - the new Realm with `-[RLMRealm resolveThreadSafeReference:]`/`Realm.resolve(_:)`. -* Realm collections can now be sorted by properties over to-one relationships. -* Optimized `CONTAINS` queries to use Boyer-Moore algorithm - (around 10x speedup on large datasets). - -### Bugfixes - -* Setting `deleteRealmIfMigrationNeeded` now also deletes the Realm if a file - format migration is required, such as when moving from a file last accessed - with Realm 0.x to 1.x, or 1.x to 2.x. -* Fix queries containing nested `SUBQUERY` expressions. -* Fix spurious incorrect thread exceptions when a thread id happens to be - reused while an RLMRealm instance from the old thread still exists. -* Fixed various bugs in aggregate methods (max, min, avg, sum). - -2.1.2 Release notes (2016--12-19) -============================================================= - -This release adds binary versions of Swift 3.0.2 frameworks built with Xcode 8.2. - -### Sync Breaking Changes (In Beta) - -* Rename occurences of "iCloud" with "CloudKit" in APIs and comments to match - naming in the Realm Object Server. - -### API Breaking Changes - -* None. - -### Enhancements - -* Add support for 'LIKE' queries (wildcard matching). - -### Bugfixes - -* Fix authenticating with CloudKit. -* Fix linker warning about "Direct access to global weak symbol". - -2.1.1 Release notes (2016-12-02) -============================================================= - -### Enhancements - -* Add `RealmSwift.ObjectiveCSupport.convert(object:)` methods to help write - code that interoperates between Realm Objective-C and Realm Swift APIs. -* Throw exceptions when opening a Realm with an incorrect configuration, like: - * `readOnly` set with a sync configuration. - * `readOnly` set with a migration block. - * migration block set with a sync configuration. -* Greatly improve performance of write transactions which make a large number of - changes to indexed properties, including the automatic migration when opening - files written by Realm 1.x. - -### Bugfixes - -* Reset sync metadata Realm in case of decryption error. -* Fix issue preventing using synchronized Realms in Xcode Playgrounds. -* Fix assertion failure when migrating a model property from object type to - `RLMLinkingObjects` type. -* Fix a `LogicError: Bad version number` exception when using `RLMResults` with - no notification blocks and explicitly called `-[RLMRealm refresh]` from that - thread. -* Logged-out users are no longer returned from `+[RLMSyncUser currentUser]` or - `+[RLMSyncUser allUsers]`. -* Fix several issues which could occur when the 1001st object of a given type - was created or added to an RLMArray/List, including crashes when rerunning - existing queries and possibly data corruption. -* Fix a potential crash when the application exits due to a race condition in - the destruction of global static variables. -* Fix race conditions when waiting for sync uploads or downloads to complete - which could result in crashes or the callback being called too early. - -2.1.0 Release notes (2016-11-18) -============================================================= - -### Sync Breaking Changes (In Beta) - -* None. - -### API breaking changes - -* None. - -### Enhancements - -* Add the ability to skip calling specific notification blocks when committing - a write transaction. - -### Bugfixes - -* Deliver collection notifications when beginning a write transaction which - advances the read version of a Realm (previously only Realm-level - notifications were sent). -* Fix some scenarios which would lead to inconsistent states when using - collection notifications. -* Fix several race conditions in the notification functionality. -* Don't send Realm change notifications when canceling a write transaction. - -2.0.4 Release notes (2016-11-14) -============================================================= - -### Sync Breaking Changes (In Beta) - -* Remove `RLMAuthenticationActions` and replace - `+[RLMSyncCredential credentialWithUsername:password:actions:]` with - `+[RLMSyncCredential credentialsWithUsername:password:register:]`. -* Rename `+[RLMSyncUser authenticateWithCredential:]` to - `+[RLMSyncUser logInWithCredentials:]`. -* Rename "credential"-related types and methods to - `RLMSyncCredentials`/`SyncCredentials` and consistently refer to credentials - in the plural form. -* Change `+[RLMSyncUser all]` to return a dictionary of identifiers to users and - rename to: - * `+[RLMSyncUser allUsers]` in Objective-C. - * `SyncUser.allUsers()` in Swift 2. - * `SyncUser.all` in Swift 3. -* Rename `SyncManager.sharedManager()` to `SyncManager.shared` in Swift 3. -* Change `Realm.Configuration.syncConfiguration` to take a `SyncConfiguration` - struct rather than a named tuple. -* `+[RLMSyncUser logInWithCredentials:]` now invokes its callback block on a - background queue. - -### API breaking changes - -* None. - -### Enhancements - -* Add `+[RLMSyncUser currentUser]`. -* Add the ability to change read, write and management permissions for - synchronized Realms using the management Realm obtained via the - `-[RLMSyncUser managementRealmWithError:]` API and the - `RLMSyncPermissionChange` class. - -### Bugfixes - -* None. - -2.0.3 Release notes (2016-10-27) -============================================================= - -This release adds binary versions of Swift 3.0.1 frameworks built with Xcode 8.1 -GM seed. - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix a `BadVersion` exception caused by a race condition when delivering - collection change notifications. -* Fix an assertion failure when additional model classes are added and - `deleteRealmIfMigrationNeeded` is enabled. -* Fix a `BadTransactLog` exception when deleting an `RLMResults` in a synced - Realm. -* Fix an assertion failure when a write transaction is in progress at the point - of process termination. -* Fix a crash that could occur when working with a `RLMLinkingObject` property - of an unmanaged object. - -2.0.2 Release notes (2016-10-05) -============================================================= - -This release is not protocol-compatible with previous version of the Realm -Mobile Platform. - -### API breaking changes - -* Rename Realm Swift's `User` to `SyncUser` to make clear that it relates to the - Realm Mobile Platform, and to avoid potential conflicts with other `User` types. - -### Bugfixes - -* Fix Realm headers to be compatible with pre-C++11 dialects of Objective-C++. -* Fix incorrect merging of RLMArray/List changes when objects with the same - primary key are created on multiple devices. -* Fix bad transaction log errors after deleting objects on a different device. -* Fix a BadVersion error when a background worker finishes running while older - results from that worker are being delivered to a different thread. - -2.0.1 Release notes (2016-09-29) -============================================================= - -### Bugfixes - -* Fix an assertion failure when opening a Realm file written by a 1.x version - of Realm which has an indexed nullable int or bool property. - -2.0.0 Release notes (2016-09-27) -============================================================= - -This release introduces support for the Realm Mobile Platform! -See for an overview -of these great new features. - -### API breaking changes - -* By popular demand, `RealmSwift.Error` has been moved from the top-level - namespace into a `Realm` extension and is now `Realm.Error`, so that it no - longer conflicts with `Swift.Error`. -* Files written by Realm 2.0 cannot be read by 1.x or earlier versions. Old - files can still be opened. - -### Enhancements - -* The .log, .log_a and .log_b files no longer exist and the state tracked in - them has been moved to the main Realm file. This reduces the number of open - files needed by Realm, improves performance of both opening and writing to - Realms, and eliminates a small window where committing write transactions - would prevent other processes from opening the file. - -### Bugfixes - -* Fix an assertion failure when sorting by zero properties. -* Fix a mid-commit crash in one process also crashing all other processes with - the same Realm open. -* Properly initialize new nullable float and double properties added to - existing objects to null rather than 0. -* Fix a stack overflow when objects with indexed string properties had very - long common prefixes. -* Fix a race condition which could lead to crashes when using async queries or - collection notifications. -* Fix a bug which could lead to incorrect state when an object which links to - itself is deleted from the Realm. - -1.1.0 Release notes (2016-09-16) -============================================================= - -This release brings official support for Xcode 8, Swift 2.3 and Swift 3.0. -Prebuilt frameworks are now built with Xcode 7.3.1 and Xcode 8.0. - -### API breaking changes - -* Deprecate `migrateRealm:` in favor of new `performMigrationForConfiguration:error:` method - that follows Cocoa's NSError conventions. -* Fix issue where `RLMResults` used `id `instead of its generic type as the return - type of subscript. - -### Enhancements - -* Improve error message when using NSNumber incorrectly in Swift models. -* Further reduce the download size of the prebuilt static libraries. -* Improve sort performance, especially on non-nullable columns. -* Allow partial initialization of object by `initWithValue:`, deferring - required property checks until object is added to Realm. - -### Bugfixes - -* Fix incorrect truncation of the constant value for queries of the form - `column < value` for `float` and `double` columns. -* Fix crash when an aggregate is accessed as an `Int8`, `Int16`, `Int32`, or `Int64`. -* Fix a race condition that could lead to a crash if an RLMArray or List was - deallocated on a different thread than it was created on. -* Fix a crash when the last reference to an observed object is released from - within the observation. -* Fix a crash when `initWithValue:` is used to create a nested object for a class - with an uninitialized schema. -* Enforce uniqueness for `RealmOptional` primary keys when using the `value` setter. - -1.0.2 Release notes (2016-07-13) -============================================================= - -### API breaking changes - -* Attempting to add an object with no properties to a Realm now throws rather than silently - doing nothing. - -### Enhancements - -* Swift: A `write` block may now `throw`, reverting any changes already made in - the transaction. -* Reduce address space used when committing write transactions. -* Significantly reduce the download size of prebuilt binaries and slightly - reduce the final size contribution of Realm to applications. -* Improve performance of accessing RLMArray properties and creating objects - with List properties. - -### Bugfixes - -* Fix a crash when reading the shared schema from an observed Swift object. -* Fix crashes or incorrect results when passing an array of values to - `createOrUpdate` after reordering the class's properties. -* Ensure that the initial call of a Results notification block is always passed - .Initial even if there is a write transaction between when the notification - is added and when the first notification is delivered. -* Fix a crash when deleting all objects in a Realm while fast-enumerating query - results from that Realm. -* Handle EINTR from flock() rather than crashing. -* Fix incorrect behavior following a call to `[RLMRealm compact]`. -* Fix live updating and notifications for Results created from a predicate involving - an inverse relationship to be triggered when an object at the other end of the relationship - is modified. - -1.0.1 Release notes (2016-06-12) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Significantly improve performance of opening Realm files, and slightly - improve performance of committing write transactions. - -### Bugfixes - -* Swift: Fix an error thrown when trying to create or update `Object` instances via - `add(:_update:)` with a primary key property of type `RealmOptional`. -* Xcode playground in Swift release zip now runs successfully. -* The `key` parameter of `Realm.objectForPrimaryKey(_:key:)`/ `Realm.dynamicObjectForPrimaryKey(_:key:)` - is now marked as optional. -* Fix a potential memory leak when closing Realms after a Realm file has been - opened on multiple threads which are running in active run loops. -* Fix notifications breaking on tvOS after a very large number of write - transactions have been committed. -* Fix a "Destruction of mutex in use" assertion failure after an error while - opening a file. -* Realm now throws an exception if an `Object` subclass is defined with a managed Swift `lazy` property. - Objects with ignored `lazy` properties should now work correctly. -* Update the LLDB script to work with recent changes to the implementation of `RLMResults`. -* Fix an assertion failure when a Realm file is deleted while it is still open, - and then a new Realm is opened at the same path. Note that this is still not - a supported scenario, and may break in other ways. - -1.0.0 Release notes (2016-05-25) -============================================================= - -No changes since 0.103.2. - -0.103.2 Release notes (2016-05-24) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Improve the error messages when an I/O error occurs in `writeCopyToURL`. - -### Bugfixes - -* Fix an assertion failure which could occur when opening a Realm after opening - that Realm failed previously in some specific ways in the same run of the - application. -* Reading optional integers, floats, and doubles from within a migration block - now correctly returns `nil` rather than 0 when the stored value is `nil`. - -0.103.1 Release notes (2016-05-19) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix a bug that sometimes resulted in a single object's NSData properties - changing from `nil` to a zero-length non-`nil` NSData when a different object - of the same type was deleted. - -0.103.0 Release notes (2016-05-18) -============================================================= - -### API breaking changes - -* All functionality deprecated in previous releases has been removed entirely. -* Support for Xcode 6.x & Swift prior to 2.2 has been completely removed. -* `RLMResults`/`Results` now become empty when a `RLMArray`/`List` or object - they depend on is deleted, rather than throwing an exception when accessed. -* Migrations are no longer run when `deleteRealmIfMigrationNeeded` is set, - recreating the file instead. - -### Enhancements - -* Added `invalidated` properties to `RLMResults`/`Results`, `RLMLinkingObjects`/`LinkingObjects`, - `RealmCollectionType` and `AnyRealmCollection`. These properties report whether the Realm - the object is associated with has been invalidated. -* Some `NSError`s created by Realm now have more descriptive user info payloads. - -### Bugfixes - -* None. - -0.102.1 Release notes (2016-05-13) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Return `RLMErrorSchemaMismatch` error rather than the more generic `RLMErrorFail` - when a migration is required. -* Improve the performance of allocating instances of `Object` subclasses - that have `LinkingObjects` properties. - -### Bugfixes - -* `RLMLinkingObjects` properties declared in Swift subclasses of `RLMObject` - now work correctly. -* Fix an assertion failure when deleting all objects of a type, inserting more - objects, and then deleting some of the newly inserted objects within a single - write transaction when there is an active notification block for a different - object type which links to the objects being deleted. -* Fix crashes and/or incorrect results when querying over multiple levels of - `LinkingObjects` properties. -* Fix opening read-only Realms on multiple threads at once. -* Fix a `BadTransactLog` exception when storing dates before the unix epoch (1970-01-01). - -0.102.0 Release notes (2016-05-09) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Add a method to rename properties during migrations: - * Swift: `Migration.renamePropertyForClass(_:oldName:newName:)` - * Objective-C: `-[RLMMigration renamePropertyForClass:oldName:newName:]` -* Add `deleteRealmIfMigrationNeeded` to - `RLMRealmConfiguration`/`Realm.Configuration`. When this is set to `true`, - the Realm file will be automatically deleted and recreated when there is a - schema mismatch rather than migrated to the new schema. - -### Bugfixes - -* Fix `BETWEEN` queries that traverse `RLMArray`/`List` properties to ensure that - a single related object satisfies the `BETWEEN` criteria, rather than allowing - different objects in the array to satisfy the lower and upper bounds. -* Fix a race condition when a Realm is opened on one thread while it is in the - middle of being closed on another thread which could result in crashes. -* Fix a bug which could result in changes made on one thread being applied - incorrectly on other threads when those threads are refreshed. -* Fix crash when migrating to the new date format introduced in 0.101.0. -* Fix crash when querying inverse relationships when objects are deleted. - -0.101.0 Release notes (2016-05-04) -============================================================= - -### API breaking changes - -* Files written by this version of Realm cannot be read by older versions of - Realm. Existing files will automatically be upgraded when they are opened. - -### Enhancements - -* Greatly improve performance of collection change calculation for complex - object graphs, especially for ones with cycles. -* NSDate properties now support nanoseconds precision. -* Opening a single Realm file on multiple threads now shares a single memory - mapping of the file for all threads, significantly reducing the memory - required to work with large files. -* Crashing while in the middle of a write transaction no longer blocks other - processes from performing write transactions on the same file. -* Improve the performance of refreshing a Realm (including via autorefresh) - when there are live Results/RLMResults objects for that Realm. - -### Bugfixes - -* Fix an assertion failure of "!more_before || index >= std::prev(it)->second)" - in `IndexSet::do_add()`. -* Fix a crash when an `RLMArray` or `List` object is destroyed from the wrong - thread. - -0.100.0 Release notes (2016-04-29) -============================================================= - -### API breaking changes - -* `-[RLMObject linkingObjectsOfClass:forProperty]` and `Object.linkingObjects(_:forProperty:)` - are deprecated in favor of properties of type `RLMLinkingObjects` / `LinkingObjects`. - -### Enhancements - -* The automatically-maintained inverse direction of relationships can now be exposed as - properties of type `RLMLinkingObjects` / `LinkingObjects`. These properties automatically - update to reflect the objects that link to the target object, can be used in queries, and - can be filtered like other Realm collection types. -* Queries that compare objects for equality now support multi-level key paths. - -### Bugfixes - -* Fix an assertion failure when a second write transaction is committed after a - write transaction deleted the object containing an RLMArray/List which had an - active notification block. -* Queries that compare `RLMArray` / `List` properties using != now give the correct results. - -0.99.1 Release notes (2016-04-26) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix a scenario that could lead to the assertion failure - "m_advancer_sg->get_version_of_current_transaction() == - new_notifiers.front()->version()". - -0.99.0 Release notes (2016-04-22) -============================================================= - -### API breaking changes - -* Deprecate properties of type `id`/`AnyObject`. This type was rarely used, - rarely useful and unsupported in every other Realm binding. -* The block for `-[RLMArray addNotificationBlock:]` and - `-[RLMResults addNotificationBlock:]` now takes another parameter. -* The following Objective-C APIs have been deprecated in favor of newer or preferred versions: - -| Deprecated API | New API | -|:-------------------------------------------------------|:------------------------------------------------------| -| `-[RLMRealm removeNotification:]` | `-[RLMNotificationToken stop]` | -| `RLMRealmConfiguration.path` | `RLMRealmConfiguration.fileURL` | -| `RLMRealm.path` | `RLMRealmConfiguration.fileURL` | -| `RLMRealm.readOnly` | `RLMRealmConfiguration.readOnly` | -| `+[RLMRealm realmWithPath:]` | `+[RLMRealm realmWithURL:]` | -| `+[RLMRealm writeCopyToPath:error:]` | `+[RLMRealm writeCopyToURL:encryptionKey:error:]` | -| `+[RLMRealm writeCopyToPath:encryptionKey:error:]` | `+[RLMRealm writeCopyToURL:encryptionKey:error:]` | -| `+[RLMRealm schemaVersionAtPath:error:]` | `+[RLMRealm schemaVersionAtURL:encryptionKey:error:]` | -| `+[RLMRealm schemaVersionAtPath:encryptionKey:error:]` | `+[RLMRealm schemaVersionAtURL:encryptionKey:error:]` | - -* The following Swift APIs have been deprecated in favor of newer or preferred versions: - -| Deprecated API | New API | -|:----------------------------------------------|:-----------------------------------------| -| `Realm.removeNotification(_:)` | `NotificationToken.stop()` | -| `Realm.Configuration.path` | `Realm.Configuration.fileURL` | -| `Realm.path` | `Realm.Configuration.fileURL` | -| `Realm.readOnly` | `Realm.Configuration.readOnly` | -| `Realm.writeCopyToPath(_:encryptionKey:)` | `Realm.writeCopyToURL(_:encryptionKey:)` | -| `schemaVersionAtPath(_:encryptionKey:error:)` | `schemaVersionAtURL(_:encryptionKey:)` | - -### Enhancements - -* Add information about what rows were added, removed, or modified to the - notifications sent to the Realm collections. -* Improve error when illegally appending to an `RLMArray` / `List` property from a default value - or the standalone initializer (`init()`) before the schema is ready. - -### Bugfixes - -* Fix a use-after-free when an associated object's dealloc method is used to - remove observers from an RLMObject. -* Fix a small memory leak each time a Realm file is opened. -* Return a recoverable `RLMErrorAddressSpaceExhausted` error rather than - crash when there is insufficient available address space on Realm - initialization or write commit. - -0.98.8 Release notes (2016-04-15) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fixed a bug that caused some encrypted files created using - `-[RLMRealm writeCopyToPath:encryptionKey:error:]` to fail to open. - -0.98.7 Release notes (2016-04-13) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Mark further initializers in Objective-C as NS_DESIGNATED_INITIALIZER to prevent that these aren't - correctly defined in Swift Object subclasses, which don't qualify for auto-inheriting the required initializers. -* `-[RLMResults indexOfObjectWithPredicate:]` now returns correct results - for `RLMResults` instances that were created by filtering an `RLMArray`. -* Adjust how RLMObjects are destroyed in order to support using an associated - object on an RLMObject to remove KVO observers from that RLMObject. -* `-[RLMResults indexOfObjectWithPredicate:]` now returns the index of the first matching object for a - sorted `RLMResults`, matching its documented behavior. -* Fix a crash when canceling a transaction that set a relationship. -* Fix a crash when a query referenced a deleted object. - -0.98.6 Release notes (2016-03-25) -============================================================= - -Prebuilt frameworks are now built with Xcode 7.3. - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix running unit tests on iOS simulators and devices with Xcode 7.3. - -0.98.5 Release notes (2016-03-14) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix a crash when opening a Realm on 32-bit iOS devices. - -0.98.4 Release notes (2016-03-10) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Properly report changes made by adding an object to a Realm with - addOrUpdate:/createOrUpdate: to KVO observers for existing objects with that - primary key. -* Fix crashes and assorted issues when a migration which added object link - properties is rolled back due to an error in the migration block. -* Fix assertion failures when deleting objects within a migration block of a - type which had an object link property added in that migration. -* Fix an assertion failure in `Query::apply_patch` when updating certain kinds - of queries after a write transaction is committed. - -0.98.3 Release notes (2016-02-26) -============================================================= - -### Enhancements - -* Initializing the shared schema is 3x faster. - -### Bugfixes - -* Using Realm Objective-C from Swift while having Realm Swift linked no longer causes that the - declared `ignoredProperties` are not taken into account. -* Fix assertion failures when rolling back a migration which added Object link - properties to a class. -* Fix potential errors when cancelling a write transaction which modified - multiple `RLMArray`/`List` properties. -* Report the correct value for inWriteTransaction after attempting to commit a - write transaction fails. -* Support CocoaPods 1.0 beginning from prerelease 1.0.0.beta.4 while retaining - backwards compatibility with 0.39. - -0.98.2 Release notes (2016-02-18) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Aggregate operations (`ANY`, `NONE`, `@count`, `SUBQUERY`, etc.) are now supported for key paths - that begin with an object relationship so long as there is a `RLMArray`/`List` property at some - point in a key path. -* Predicates of the form `%@ IN arrayProperty` are now supported. - -### Bugfixes - -* Use of KVC collection operators on Swift collection types no longer throws an exception. -* Fix reporting of inWriteTransaction in notifications triggered by - `beginWriteTransaction`. -* The contents of `List` and `Optional` properties are now correctly preserved when copying - a Swift object from one Realm to another, and performing other operations that result in a - Swift object graph being recursively traversed from Objective-C. -* Fix a deadlock when queries are performed within a Realm notification block. -* The `ANY` / `SOME` / `NONE` qualifiers are now required in comparisons involving a key path that - traverse a `RLMArray`/`List` property. Previously they were only required if the first key in the - key path was an `RLMArray`/`List` property. -* Fix several scenarios where the default schema would be initialized - incorrectly if the first Realm opened used a restricted class subset (via - `objectClasses`/`objectTypes`). - -0.98.1 Release notes (2016-02-10) -============================================================= - -### Bugfixes - -* Fix crashes when deleting an object containing an `RLMArray`/`List` which had - previously been queried. -* Fix a crash when deleting an object containing an `RLMArray`/`List` with - active notification blocks. -* Fix duplicate file warnings when building via CocoaPods. -* Fix crash or incorrect results when calling `indexOfObject:` on an - `RLMResults` derived from an `RLMArray`. - -0.98.0 Release notes (2016-02-04) -============================================================= - -### API breaking changes - -* `+[RLMRealm realmWithPath:]`/`Realm.init(path:)` now inherits from the default - configuration. -* Swift 1.2 is no longer supported. - -### Enhancements - -* Add `addNotificationBlock` to `RLMResults`, `Results`, `RLMArray`, and - `List`, which calls the given block whenever the collection changes. -* Do a lot of the work for keeping `RLMResults`/`Results` up-to-date after - write transactions on a background thread to help avoid blocking the main - thread. -* `NSPredicate`'s `SUBQUERY` operator is now supported. It has the following limitations: - * `@count` is the only operator that may be applied to the `SUBQUERY` expression. - * The `SUBQUERY(…).@count` expression must be compared with a constant. - * Correlated subqueries are not yet supported. - -### Bugfixes - -* None. - -0.97.1 Release notes (2016-01-29) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Swift: Added `Error` enum allowing to catch errors e.g. thrown on initializing - `RLMRealm`/`Realm` instances. -* Fail with `RLMErrorFileNotFound` instead of the more generic `RLMErrorFileAccess`, - if no file was found when a realm was opened as read-only or if the directory part - of the specified path was not found when a copy should be written. -* Greatly improve performance when deleting objects with one or more indexed - properties. -* Indexing `BOOL`/`Bool` and `NSDate` properties are now supported. -* Swift: Add support for indexing optional properties. - -### Bugfixes - -* Fix incorrect results or crashes when using `-[RLMResults setValue:forKey:]` - on an RLMResults which was filtered on the key being set. -* Fix crashes when an RLMRealm is deallocated from the wrong thread. -* Fix incorrect results from aggregate methods on `Results`/`RLMResults` after - objects which were previously in the results are deleted. -* Fix a crash when adding a new property to an existing class with over a - million objects in the Realm. -* Fix errors when opening encrypted Realm files created with writeCopyToPath. -* Fix crashes or incorrect results for queries that use relationship equality - in cases where the `RLMResults` is kept alive and instances of the target class - of the relationship are deleted. - -0.97.0 Release notes (2015-12-17) -============================================================= - -### API breaking changes - -* All functionality deprecated in previous releases has been removed entirely. -* Add generic type annotations to NSArrays and NSDictionaries in public APIs. -* Adding a Realm notification block on a thread not currently running from - within a run loop throws an exception rather than silently never calling the - notification block. - -### Enhancements - -* Support for tvOS. -* Support for building Realm Swift from source when using Carthage. -* The block parameter of `-[RLMRealm transactionWithBlock:]`/`Realm.write(_:)` is - now marked as `__attribute__((noescape))`/`@noescape`. -* Many forms of queries with key paths on both sides of the comparison operator - are now supported. -* Add support for KVC collection operators in `RLMResults` and `RLMArray`. -* Fail instead of deadlocking in `+[RLMRealm sharedSchema]`, if a Swift property is initialized - to a computed value, which attempts to open a Realm on its own. - -### Bugfixes - -* Fix poor performance when calling `-[RLMRealm deleteObjects:]` on an - `RLMResults` which filtered the objects when there are other classes linking - to the type of the deleted objects. -* An exception is now thrown when defining `Object` properties of an unsupported - type. - -0.96.3 Release notes (2015-12-04) -============================================================= - -### Enhancements - -* Queries are no longer limited to 16 levels of grouping. -* Rework the implementation of encrypted Realms to no longer interfere with - debuggers. - -### Bugfixes - -* Fix crash when trying to retrieve object instances via `dynamicObjects`. -* Throw an exception when querying on a link providing objects, which are from a different Realm. -* Return empty results when querying on a link providing an unattached object. -* Fix crashes or incorrect results when calling `-[RLMRealm refresh]` during - fast enumeration. -* Add `Int8` support for `RealmOptional`, `MinMaxType` and `AddableType`. -* Set the default value for newly added non-optional NSData properties to a - zero-byte NSData rather than nil. -* Fix a potential crash when deleting all objects of a class. -* Fix performance problems when creating large numbers of objects with - `RLMArray`/`List` properties. -* Fix memory leak when using Object(value:) for subclasses with - `List` or `RealmOptional` properties. -* Fix a crash when computing the average of an optional integer property. -* Fix incorrect search results for some queries on integer properties. -* Add error-checking for nil realm parameters in many methods such as - `+[RLMObject allObjectsInRealm:]`. -* Fix a race condition between commits and opening Realm files on new threads - that could lead to a crash. -* Fix several crashes when opening Realm files. -* `-[RLMObject createInRealm:withValue:]`, `-[RLMObject createOrUpdateInRealm:withValue:]`, and - their variants for the default Realm now always match the contents of an `NSArray` against properties - in the same order as they are defined in the model. - -0.96.2 Release notes (2015-10-26) -============================================================= - -Prebuilt frameworks are now built with Xcode 7.1. - -### Bugfixes - -* Fix ignoring optional properties in Swift. -* Fix CocoaPods installation on case-sensitive file systems. - -0.96.1 Release notes (2015-10-20) -============================================================= - -### Bugfixes - -* Support assigning `Results` to `List` properties via KVC. -* Honor the schema version set in the configuration in `+[RLMRealm migrateRealm:]`. -* Fix crash when using optional Int16/Int32/Int64 properties in Swift. - -0.96.0 Release notes (2015-10-14) -============================================================= - -* No functional changes since beta2. - -0.96.0-beta2 Release notes (2015-10-08) -============================================================= - -### Bugfixes - -* Add RLMOptionalBase.h to the podspec. - -0.96.0-beta Release notes (2015-10-07) -============================================================= - -### API breaking changes - -* CocoaPods v0.38 or greater is now required to install Realm and RealmSwift - as pods. - -### Enhancements - -* Functionality common to both `List` and `Results` is now declared in a - `RealmCollectionType` protocol that both types conform to. -* `Results.realm` now returns an `Optional` in order to conform to - `RealmCollectionType`, but will always return `.Some()` since a `Results` - cannot exist independently from a `Realm`. -* Aggregate operations are now available on `List`: `min`, `max`, `sum`, - `average`. -* Committing write transactions (via `commitWrite` / `commitWriteTransaction` and - `write` / `transactionWithBlock`) now optionally allow for handling errors when - the disk is out of space. -* Added `isEmpty` property on `RLMRealm`/`Realm` to indicate if it contains any - objects. -* The `@count`, `@min`, `@max`, `@sum` and `@avg` collection operators are now - supported in queries. - -### Bugfixes - -* Fix assertion failure when inserting NSData between 8MB and 16MB in size. -* Fix assertion failure when rolling back a migration which removed an object - link or `RLMArray`/`List` property. -* Add the path of the file being opened to file open errors. -* Fix a crash that could be triggered by rapidly opening and closing a Realm - many times on multiple threads at once. -* Fix several places where exception messages included the name of the wrong - function which failed. - -0.95.3 Release notes (2015-10-05) -============================================================= - -### Bugfixes - -* Compile iOS Simulator framework architectures with `-fembed-bitcode-marker`. -* Fix crashes when the first Realm opened uses a class subset and later Realms - opened do not. -* Fix inconsistent errors when `Object(value: ...)` is used to initialize the - default value of a property of an `Object` subclass. -* Throw an exception when a class subset has objects with array or object - properties of a type that are not part of the class subset. - -0.95.2 Release notes (2015-09-24) -============================================================= - -* Enable bitcode for iOS and watchOS frameworks. -* Build libraries with Xcode 7 final rather than the GM. - -0.95.1 Release notes (2015-09-23) -============================================================= - -### Enhancements - -* Add missing KVO handling for moving and exchanging objects in `RLMArray` and - `List`. - -### Bugfixes - -* Setting the primary key property on persisted `RLMObject`s / `Object`s - via subscripting or key-value coding will cause an exception to be thrown. -* Fix crash due to race condition in `RLMRealmConfiguration` where the default - configuration was in the process of being copied in one thread, while - released in another. -* Fix crash when a migration which removed an object or array property is - rolled back due to an error. - -0.95.0 Release notes (2015-08-25) -============================================================= - -### API breaking changes - -* The following APIs have been deprecated in favor of the new `RLMRealmConfiguration` class in Realm Objective-C: - -| Deprecated API | New API | -|:------------------------------------------------------------------|:---------------------------------------------------------------------------------| -| `+[RLMRealm realmWithPath:readOnly:error:]` | `+[RLMRealm realmWithConfiguration:error:]` | -| `+[RLMRealm realmWithPath:encryptionKey:readOnly:error:]` | `+[RLMRealm realmWithConfiguration:error:]` | -| `+[RLMRealm setEncryptionKey:forRealmsAtPath:]` | `-[RLMRealmConfiguration setEncryptionKey:]` | -| `+[RLMRealm inMemoryRealmWithIdentifier:]` | `+[RLMRealm realmWithConfiguration:error:]` | -| `+[RLMRealm defaultRealmPath]` | `+[RLMRealmConfiguration defaultConfiguration]` | -| `+[RLMRealm setDefaultRealmPath:]` | `+[RLMRealmConfiguration setDefaultConfiguration:]` | -| `+[RLMRealm setDefaultRealmSchemaVersion:withMigrationBlock]` | `RLMRealmConfiguration.schemaVersion` and `RLMRealmConfiguration.migrationBlock` | -| `+[RLMRealm setSchemaVersion:forRealmAtPath:withMigrationBlock:]` | `RLMRealmConfiguration.schemaVersion` and `RLMRealmConfiguration.migrationBlock` | -| `+[RLMRealm migrateRealmAtPath:]` | `+[RLMRealm migrateRealm:]` | -| `+[RLMRealm migrateRealmAtPath:encryptionKey:]` | `+[RLMRealm migrateRealm:]` | - -* The following APIs have been deprecated in favor of the new `Realm.Configuration` struct in Realm Swift for Swift 1.2: - -| Deprecated API | New API | -|:--------------------------------------------------------------|:-----------------------------------------------------------------------------| -| `Realm.defaultPath` | `Realm.Configuration.defaultConfiguration` | -| `Realm(path:readOnly:encryptionKey:error:)` | `Realm(configuration:error:)` | -| `Realm(inMemoryIdentifier:)` | `Realm(configuration:error:)` | -| `Realm.setEncryptionKey(:forPath:)` | `Realm(configuration:error:)` | -| `setDefaultRealmSchemaVersion(schemaVersion:migrationBlock:)` | `Realm.Configuration.schemaVersion` and `Realm.Configuration.migrationBlock` | -| `setSchemaVersion(schemaVersion:realmPath:migrationBlock:)` | `Realm.Configuration.schemaVersion` and `Realm.Configuration.migrationBlock` | -| `migrateRealm(path:encryptionKey:)` | `migrateRealm(configuration:)` | - -* The following APIs have been deprecated in favor of the new `Realm.Configuration` struct in Realm Swift for Swift 2.0: - -| Deprecated API | New API | -|:--------------------------------------------------------------|:-----------------------------------------------------------------------------| -| `Realm.defaultPath` | `Realm.Configuration.defaultConfiguration` | -| `Realm(path:readOnly:encryptionKey:) throws` | `Realm(configuration:) throws` | -| `Realm(inMemoryIdentifier:)` | `Realm(configuration:) throws` | -| `Realm.setEncryptionKey(:forPath:)` | `Realm(configuration:) throws` | -| `setDefaultRealmSchemaVersion(schemaVersion:migrationBlock:)` | `Realm.Configuration.schemaVersion` and `Realm.Configuration.migrationBlock` | -| `setSchemaVersion(schemaVersion:realmPath:migrationBlock:)` | `Realm.Configuration.schemaVersion` and `Realm.Configuration.migrationBlock` | -| `migrateRealm(path:encryptionKey:)` | `migrateRealm(configuration:)` | - -* `List.extend` in Realm Swift for Swift 2.0 has been replaced with `List.appendContentsOf`, - mirroring changes to `RangeReplaceableCollectionType`. - -* Object properties on `Object` subclasses in Realm Swift must be marked as optional, - otherwise a runtime exception will be thrown. - -### Enhancements - -* Persisted properties of `RLMObject`/`Object` subclasses are now Key-Value - Observing compliant. -* The different options used to create Realm instances have been consolidated - into a single `RLMRealmConfiguration`/`Realm.Configuration` object. -* Enumerating Realm collections (`RLMArray`, `RLMResults`, `List<>`, - `Results<>`) now enumerates over a copy of the collection, making it no - longer an error to modify a collection during enumeration (either directly, - or indirectly by modifying objects to make them no longer match a query). -* Improve performance of object insertion in Swift to bring it roughly in line - with Objective-C. -* Allow specifying a specific list of `RLMObject` / `Object` subclasses to include - in a given Realm via `RLMRealmConfiguration.objectClasses` / `Realm.Configuration.objectTypes`. - -### Bugfixes - -* Subscripting on `RLMObject` is now marked as nullable. - -0.94.1 Release notes (2015-08-10) -============================================================= - -### API breaking changes - -* Building for watchOS requires Xcode 7 beta 5. - -### Enhancements - -* `Object.className` is now marked as `final`. - -### Bugfixes - -* Fix crash when adding a property to a model without updating the schema - version. -* Fix unnecessary redownloading of the core library when building from source. -* Fix crash when sorting by an integer or floating-point property on iOS 7. - -0.94.0 Release notes (2015-07-29) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Reduce the amount of memory used by RLMRealm notification listener threads. -* Avoid evaluating results eagerly when filtering and sorting. -* Add nullability annotations to the Objective-C API to provide enhanced compiler - warnings and bridging to Swift. -* Make `RLMResult`s and `RLMArray`s support Objective-C generics. -* Add support for building watchOS and bitcode-compatible apps. -* Make the exceptions thrown in getters and setters more informative. -* Add `-[RLMArray exchangeObjectAtIndex:withObjectAtIndex]` and `List.swap(_:_:)` - to allow exchanging the location of two objects in the given `RLMArray` / `List`. -* Added anonymous analytics on simulator/debugger runs. -* Add `-[RLMArray moveObjectAtIndex:toIndex:]` and `List.move(from:to:)` to - allow moving objects in the given `RLMArray` / `List`. - -### Bugfixes - -* Processes crashing due to an uncaught exception inside a write transaction will - no longer cause other processes using the same Realm to hang indefinitely. -* Fix incorrect results when querying for < or <= on ints that - require 64 bits to represent with a CPU that supports SSE 4.2. -* An exception will no longer be thrown when attempting to reset the schema - version or encryption key on an open Realm to the current value. -* Date properties on 32 bit devices will retain 64 bit second precision. -* Wrap calls to the block passed to `enumerate` in an autoreleasepool to reduce - memory growth when migrating a large amount of objects. -* In-memory realms no longer write to the Documents directory on iOS or - Application Support on OS X. - -0.93.2 Release notes (2015-06-12) -============================================================= - -### Bugfixes - -* Fixed an issue where the packaged OS X Realm.framework was built with - `GCC_GENERATE_TEST_COVERAGE_FILES` and `GCC_INSTRUMENT_PROGRAM_FLOW_ARCS` - enabled. -* Fix a memory leak when constructing standalone Swift objects with NSDate - properties. -* Throw an exception rather than asserting when an invalidated object is added - to an RLMArray. -* Fix a case where data loss would occur if a device was hard-powered-off - shortly after a write transaction was committed which had to expand the Realm - file. - -0.93.1 Release notes (2015-05-29) -============================================================= - -### Bugfixes - -* Objects are no longer copied into standalone objects during object creation. This fixes an issue where - nested objects with a primary key are sometimes duplicated rather than updated. -* Comparison predicates with a constant on the left of the operator and key path on the right now give - correct results. An exception is now thrown for predicates that do not yet support this ordering. -* Fix some crashes in `index_string.cpp` with int primary keys or indexed int properties. - -0.93.0 Release notes (2015-05-27) -============================================================= - -### API breaking changes - -* Schema versions are now represented as `uint64_t` (Objective-C) and `UInt64` (Swift) so that they have - the same representation on all architectures. - -### Enhancements - -* Swift: `Results` now conforms to `CVarArgType` so it can - now be passed as an argument to `Results.filter(_:...)` - and `List.filter(_:...)`. -* Swift: Made `SortDescriptor` conform to the `Equatable` and - `StringLiteralConvertible` protocols. -* Int primary keys are once again automatically indexed. -* Improve error reporting when attempting to mark a property of a type that - cannot be indexed as indexed. - -### Bugfixes - -* Swift: `RealmSwift.framework` no longer embeds `Realm.framework`, - which now allows apps using it to pass iTunes Connect validation. - -0.92.4 Release notes (2015-05-22) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Swift: Made `Object.init()` a required initializer. -* `RLMObject`, `RLMResults`, `Object` and `Results` can now be safely - deallocated (but still not used) from any thread. -* Improve performance of `-[RLMArray indexOfObjectWhere:]` and `-[RLMArray - indexOfObjectWithPredicate:]`, and implement them for standalone RLMArrays. -* Improved performance of most simple queries. - -### Bugfixes - -* The interprocess notification mechanism no longer uses dispatch worker threads, preventing it from - starving other GCD clients of the opportunity to execute blocks when dozens of Realms are open at once. - -0.92.3 Release notes (2015-05-13) -============================================================= - -### API breaking changes - -* Swift: `Results.average(_:)` now returns an optional, which is `nil` if and only if the results - set is empty. - -### Enhancements - -* Swift: Added `List.invalidated`, which returns if the given `List` is no longer - safe to be accessed, and is analogous to `-[RLMArray isInvalidated]`. -* Assertion messages are automatically logged to Crashlytics if it's loaded - into the current process to make it easier to diagnose crashes. - -### Bugfixes - -* Swift: Enumerating through a standalone `List` whose objects themselves - have list properties won't crash. -* Swift: Using a subclass of `RealmSwift.Object` in an aggregate operator of a predicate - no longer throws a spurious type error. -* Fix incorrect results for when using OR in a query on a `RLMArray`/`List<>`. -* Fix incorrect values from `[RLMResults count]`/`Results.count` when using - `!=` on an int property with no other query conditions. -* Lower the maximum doubling threshold for Realm file sizes from 128MB to 16MB - to reduce the amount of wasted space. - -0.92.2 Release notes (2015-05-08) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Exceptions raised when incorrect object types are used with predicates now contain more detailed information. -* Added `-[RLMMigration deleteDataForClassName:]` and `Migration.deleteData(_:)` - to enable cleaning up after removing object subclasses - -### Bugfixes - -* Prevent debugging of an application using an encrypted Realm to work around - frequent LLDB hangs. Until the underlying issue is addressed you may set - REALM_DISABLE_ENCRYPTION=YES in your application's environment variables to - have requests to open an encrypted Realm treated as a request for an - unencrypted Realm. -* Linked objects are properly updated in `createOrUpdateInRealm:withValue:`. -* List properties on Objects are now properly initialized during fast enumeration. - -0.92.1 Release notes (2015-05-06) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* `-[RLMRealm inWriteTransaction]` is now public. -* Realm Swift is now available on CoocaPods. - -### Bugfixes - -* Force code re-signing after stripping architectures in `strip-frameworks.sh`. - -0.92.0 Release notes (2015-05-05) -============================================================= - -### API breaking changes - -* Migration blocks are no longer called when a Realm file is first created. -* The following APIs have been deprecated in favor of newer method names: - -| Deprecated API | New API | -|:-------------------------------------------------------|:------------------------------------------------------| -| `-[RLMMigration createObject:withObject:]` | `-[RLMMigration createObject:withValue:]` | -| `-[RLMObject initWithObject:]` | `-[RLMObject initWithValue:]` | -| `+[RLMObject createInDefaultRealmWithObject:]` | `+[RLMObject createInDefaultRealmWithValue:]` | -| `+[RLMObject createInRealm:withObject:]` | `+[RLMObject createInRealm:withValue:]` | -| `+[RLMObject createOrUpdateInDefaultRealmWithObject:]` | `+[RLMObject createOrUpdateInDefaultRealmWithValue:]` | -| `+[RLMObject createOrUpdateInRealm:withObject:]` | `+[RLMObject createOrUpdateInRealm:withValue:]` | - -### Enhancements - -* `Int8` properties defined in Swift are now treated as integers, rather than - booleans. -* NSPredicates created using `+predicateWithValue:` are now supported. - -### Bugfixes - -* Compound AND predicates with no subpredicates now correctly match all objects. - -0.91.5 Release notes (2015-04-28) -============================================================= - -### Bugfixes - -* Fix issues with removing search indexes and re-enable it. - -0.91.4 Release notes (2015-04-27) -============================================================= - -### Bugfixes - -* Temporarily disable removing indexes from existing columns due to bugs. - -0.91.3 Release notes (2015-04-17) -============================================================= - -### Bugfixes - -* Fix `Extra argument 'objectClassName' in call` errors when building via - CocoaPods. - -0.91.2 Release notes (2015-04-16) -============================================================= - -* Migration blocks are no longer called when a Realm file is first created. - -### Enhancements - -* `RLMCollection` supports collection KVC operations. -* Sorting `RLMResults` is 2-5x faster (typically closer to 2x). -* Refreshing `RLMRealm` after a write transaction which inserts or modifies - strings or `NSData` is committed on another thread is significantly faster. -* Indexes are now added and removed from existing properties when a Realm file - is opened, rather than only when properties are first added. - -### Bugfixes - -* `+[RLMSchema dynamicSchemaForRealm:]` now respects search indexes. -* `+[RLMProperty isEqualToProperty:]` now checks for equal `indexed` properties. - -0.91.1 Release notes (2015-03-12) -============================================================= - -### Enhancements - -* The browser will automatically refresh when the Realm has been modified - from another process. -* Allow using Realm in an embedded framework by setting - `APPLICATION_EXTENSION_API_ONLY` to YES. - -### Bugfixes - -* Fix a crash in CFRunLoopSourceInvalidate. - -0.91.0 Release notes (2015-03-10) -============================================================= - -### API breaking changes - -* `attributesForProperty:` has been removed from `RLMObject`. You now specify indexed - properties by implementing the `indexedProperties` method. -* An exception will be thrown when calling `setEncryptionKey:forRealmsAtPath:`, - `setSchemaVersion:forRealmAtPath:withMigrationBlock:`, and `migrateRealmAtPath:` - when a Realm at the given path is already open. -* Object and array properties of type `RLMObject` will no longer be allowed. - -### Enhancements - -* Add support for sharing Realm files between processes. -* The browser will no longer show objects that have no persisted properties. -* `RLMSchema`, `RLMObjectSchema`, and `RLMProperty` now have more useful descriptions. -* Opening an encrypted Realm while a debugger is attached to the process no - longer throws an exception. -* `RLMArray` now exposes an `isInvalidated` property to indicate if it can no - longer be accessed. - -### Bugfixes - -* An exception will now be thrown when calling `-beginWriteTransaction` from within a notification - triggered by calling `-beginWriteTransaction` elsewhere. -* When calling `delete:` we now verify that the object being deleted is persisted in the target Realm. -* Fix crash when calling `createOrUpdate:inRealm` with nested linked objects. -* Use the key from `+[RLMRealm setEncryptionKey:forRealmsAtPath:]` in - `-writeCopyToPath:error:` and `+migrateRealmAtPath:`. -* Comparing an RLMObject to a non-RLMObject using `-[RLMObject isEqual:]` or - `-isEqualToObject:` now returns NO instead of crashing. -* Improved error message when an `RLMObject` subclass is defined nested within - another Swift declaration. -* Fix crash when the process is terminated by the OS on iOS while encrypted realms are open. -* Fix crash after large commits to encrypted realms. - -0.90.6 Release notes (2015-02-20) -============================================================= - -### Enhancements - -* Improve compatibility of encrypted Realms with third-party crash reporters. - -### Bugfixes - -* Fix incorrect results when using aggregate functions on sorted RLMResults. -* Fix data corruption when using writeCopyToPath:encryptionKey:. -* Maybe fix some assertion failures. - -0.90.5 Release notes (2015-02-04) -============================================================= - -### Bugfixes - -* Fix for crashes when encryption is enabled on 64-bit iOS devices. - -0.90.4 Release notes (2015-01-29) -============================================================= - -### Bugfixes - -* Fix bug that resulted in columns being dropped and recreated during migrations. - -0.90.3 Release notes (2015-01-27) -============================================================= - -### Enhancements - -* Calling `createInDefaultRealmWithObject:`, `createInRealm:withObject:`, - `createOrUpdateInDefaultRealmWithObject:` or `createOrUpdateInRealm:withObject:` - is a no-op if the argument is an RLMObject of the same type as the receiver - and is already backed by the target realm. - -### Bugfixes - -* Fix incorrect column type assertions when the first Realm file opened is a - read-only file that is missing tables. -* Throw an exception when adding an invalidated or deleted object as a link. -* Throw an exception when calling `createOrUpdateInRealm:withObject:` when the - receiver has no primary key defined. - -0.90.1 Release notes (2015-01-22) -============================================================= - -### Bugfixes - -* Fix for RLMObject being treated as a model object class and showing up in the browser. -* Fix compilation from the podspec. -* Fix for crash when calling `objectsWhere:` with grouping in the query on `allObjects`. - -0.90.0 Release notes (2015-01-21) -============================================================= - -### API breaking changes - -* Rename `-[RLMRealm encryptedRealmWithPath:key:readOnly:error:]` to - `-[RLMRealm realmWithPath:encryptionKey:readOnly:error:]`. -* `-[RLMRealm setSchemaVersion:withMigrationBlock]` is no longer global and must be called - for each individual Realm path used. You can now call `-[RLMRealm setDefaultRealmSchemaVersion:withMigrationBlock]` - for the default Realm and `-[RLMRealm setSchemaVersion:forRealmAtPath:withMigrationBlock:]` for all others; - -### Enhancements - -* Add `-[RLMRealm writeCopyToPath:encryptionKey:error:]`. -* Add support for comparing string columns to other string columns in queries. - -### Bugfixes - -* Roll back changes made when an exception is thrown during a migration. -* Throw an exception if the number of items in a RLMResults or RLMArray changes - while it's being fast-enumerated. -* Also encrypt the temporary files used when encryption is enabled for a Realm. -* Fixed crash in JSONImport example on OS X with non-en_US locale. -* Fixed infinite loop when opening a Realm file in the Browser at the same time - as it is open in a 32-bit simulator. -* Fixed a crash when adding primary keys to older realm files with no primary - keys on any objects. -* Fixed a crash when removing a primary key in a migration. -* Fixed a crash when multiple write transactions with no changes followed by a - write transaction with changes were committed without the main thread - RLMRealm getting a chance to refresh. -* Fixed incomplete results when querying for non-null relationships. -* Improve the error message when a Realm file is opened in multiple processes - at once. - -0.89.2 Release notes (2015-01-02) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix an assertion failure when invalidating a Realm which is in a write - transaction, has already been invalidated, or has never been used. -* Fix an assertion failure when sorting an empty RLMArray property. -* Fix a bug resulting in the browser never becoming visible on 10.9. -* Write UTF-8 when generating class files from a realm file in the Browser. - -0.89.1 Release notes (2014-12-22) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Improve the error message when a Realm can't be opened due to lacking write - permissions. - -### Bugfixes - -* Fix an assertion failure when inserting rows after calling `deleteAllObjects` - on a Realm. -* Separate dynamic frameworks are now built for the simulator and devices to - work around App Store submission errors due to the simulator version not - being automatically stripped from dynamic libraries. - -0.89.0 Release notes (2014-12-18) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Add support for encrypting Realm files on disk. -* Support using KVC-compliant objects without getters or with custom getter - names to initialize RLMObjects with `createObjectInRealm` and friends. - -### Bugfixes - -* Merge native Swift default property values with defaultPropertyValues(). -* Don't leave the database schema partially updated when opening a realm fails - due to a migration being needed. -* Fixed issue where objects with custom getter names couldn't be used to - initialize other objects. -* Fix a major performance regression on queries on string properties. -* Fix a memory leak when circularly linked objects are added to a Realm. - -0.88.0 Release notes (2014-12-02) -============================================================= - -### API breaking changes - -* Deallocating an RLMRealm instance in a write transaction lacking an explicit - commit/cancel will now be automatically cancelled instead of committed. -* `-[RLMObject isDeletedFromRealm]` has been renamed to `-[RLMObject isInvalidated]`. - -### Enhancements - -* Add `-[RLMRealm writeCopyToPath:]` to write a compacted copy of the Realm - another file. -* Add support for case insensitive, BEGINSWITH, ENDSWITH and CONTAINS string - queries on array properties. -* Make fast enumeration of `RLMArray` and `RLMResults` ~30% faster and - `objectAtIndex:` ~55% faster. -* Added a lldb visualizer script for displaying the contents of persisted - RLMObjects when debugging. -* Added method `-setDefaultRealmPath:` to change the default Realm path. -* Add `-[RLMRealm invalidate]` to release data locked by the current thread. - -### Bugfixes - -* Fix for crash when running many simultaneous write transactions on background threads. -* Fix for crashes caused by opening Realms at multiple paths simultaneously which have had - properties re-ordered during migration. -* Don't run the query twice when `firstObject` or `lastObject` are called on an - `RLMResults` which has not had its results accessed already. -* Fix for bug where schema version is 0 for new Realm created at the latest version. -* Fix for error message where no migration block is specified when required. - -0.87.4 Release notes (2014-11-07) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix browser location in release zip. - -0.87.3 Release notes (2014-11-06) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Added method `-linkingObjectsOfClass:forProperty:` to RLMObject to expose inverse - relationships/backlinks. - -### Bugfixes - -* Fix for crash due to missing search index when migrating an object with a string primary key - in a database created using an older versions (0.86.3 and earlier). -* Throw an exception when passing an array containing a - non-RLMObject to -[RLMRealm addObjects:]. -* Fix for crash when deleting an object from multiple threads. - -0.87.0 Release notes (2014-10-21) -============================================================= - -### API breaking changes - -* RLMArray has been split into two classes, `RLMArray` and `RLMResults`. RLMArray is - used for object properties as in previous releases. Moving forward all methods used to - enumerate, query, and sort objects return an instance of a new class `RLMResults`. This - change was made to support diverging apis and the future addition of change notifications - for queries. -* The api for migrations has changed. You now call `setSchemaVersion:withMigrationBlock:` to - register a global migration block and associated version. This block is applied to Realms as - needed when opened for Realms at a previous version. The block can be applied manually if - desired by calling `migrateRealmAtPath:`. -* `arraySortedByProperty:ascending:` was renamed to `sortedResultsUsingProperty:ascending` -* `addObjectsFromArray:` on both `RLMRealm` and `RLMArray` has been renamed to `addObjects:` - and now accepts any container class which implements `NSFastEnumeration` -* Building with Swift support now requires Xcode 6.1 - -### Enhancements - -* Add support for sorting `RLMArray`s by multiple columns with `sortedResultsUsingDescriptors:` -* Added method `deleteAllObjects` on `RLMRealm` to clear a Realm. -* Added method `createObject:withObject:` on `RLMMigration` which allows object creation during migrations. -* Added method `deleteObject:` on `RLMMigration` which allows object deletion during migrations. -* Updating to core library version 0.85.0. -* Implement `objectsWhere:` and `objectsWithPredicate:` for array properties. -* Add `cancelWriteTransaction` to revert all changes made in a write transaction and end the transaction. -* Make creating `RLMRealm` instances on background threads when an instance - exists on another thread take a fifth of the time. -* Support for partial updates when calling `createOrUpdateWithObject:` and `addOrUpdateObject:` -* Re-enable Swift support on OS X - -### Bugfixes - -* Fix exceptions when trying to set `RLMObject` properties after rearranging - the properties in a `RLMObject` subclass. -* Fix crash on IN query with several thousand items. -* Fix crash when querying indexed `NSString` properties. -* Fixed an issue which prevented in-memory Realms from being used accross multiple threads. -* Preserve the sort order when querying a sorted `RLMResults`. -* Fixed an issue with migrations where if a Realm file is deleted after a Realm is initialized, - the newly created Realm can be initialized with an incorrect schema version. -* Fix crash in `RLMSuperSet` when assigning to a `RLMArray` property on a standalone object. -* Add an error message when the protocol for an `RLMArray` property is not a - valid object type. -* Add an error message when an `RLMObject` subclass is defined nested within - another Swift class. - -0.86.3 Release notes (2014-10-09) -============================================================= - -### Enhancements - -* Add support for != in queries on object relationships. - -### Bugfixes - -* Re-adding an object to its Realm no longer throws an exception and is now a no-op - (as it was previously). -* Fix another bug which would sometimes result in subclassing RLMObject - subclasses not working. - -0.86.2 Release notes (2014-10-06) -============================================================= - -### Bugfixes - -* Fixed issues with packaging "Realm Browser.app" for release. - -0.86.1 Release notes (2014-10-03) -============================================================= - -### Bugfixes - -* Fix a bug which would sometimes result in subclassing RLMObject subclasses - not working. - -0.86.0 Release notes (2014-10-03) -============================================================= - -### API breaking changes - -* Xcode 6 is now supported from the main Xcode project `Realm.xcodeproj`. - Xcode 5 is no longer supported. - -### Enhancements - -* Support subclassing RLMObject models. Although you can now persist subclasses, - polymorphic behavior is not supported (i.e. setting a property to an - instance of its subclass). -* Add support for sorting RLMArray properties. -* Speed up inserting objects with `addObject:` by ~20%. -* `readonly` properties are automatically ignored rather than having to be - added to `ignoredProperties`. -* Updating to core library version 0.83.1. -* Return "[deleted object]" rather than throwing an exception when - `-description` is called on a deleted RLMObject. -* Significantly improve performance of very large queries. -* Allow passing any enumerable to IN clauses rather than just NSArray. -* Add `objectForPrimaryKey:` and `objectInRealm:forPrimaryKey:` convenience - methods to fetch an object by primary key. - -### Bugfixes - -* Fix error about not being able to persist property 'hash' with incompatible - type when building for devices with Xcode 6. -* Fix spurious notifications of new versions of Realm. -* Fix for updating nested objects where some types do not have primary keys. -* Fix for inserting objects from JSON with NSNull values when default values - should be used. -* Trying to add a persisted RLMObject to a different Realm now throws an - exception rather than creating an uninitialized object. -* Fix validation errors when using IN on array properties. -* Fix errors when an IN clause has zero items. -* Fix for chained queries ignoring all but the last query's conditions. - -0.85.0 Release notes (2014-09-15) -============================================================= - -### API breaking changes - -* Notifications for a refresh being needed (when autorefresh is off) now send - the notification type RLMRealmRefreshRequiredNotification rather than - RLMRealmDidChangeNotification. - -### Enhancements - -* Updating to core library version 0.83.0. -* Support for primary key properties (for int and string columns). Declaring a property - to be the primary key ensures uniqueness for that property for all objects of a given type. - At the moment indexes on primary keys are not yet supported but this will be added in a future - release. -* Added methods to update or insert (upsert) for objects with primary keys defined. -* `[RLMObject initWithObject:]` and `[RLMObject createInRealmWithObject:]` now support - any object type with kvc properties. -* The Swift support has been reworked to work around Swift not being supported - in Frameworks on iOS 7. -* Improve performance when getting the count of items matching a query but not - reading any of the objects in the results. -* Add a return value to `-[RLMRealm refresh]` that indicates whether or not - there was anything to refresh. -* Add the class name to the error message when an RLMObject is missing a value - for a property without a default. -* Add support for opening Realms in read-only mode. -* Add an automatic check for updates when using Realm in a simulator (the - checker code is not compiled into device builds). This can be disabled by - setting the REALM_DISABLE_UPDATE_CHECKER environment variable to any value. -* Add support for Int16 and Int64 properties in Swift classes. - -### Bugfixes - -* Realm change notifications when beginning a write transaction are now sent - after updating rather than before, to match refresh. -* `-isEqual:` now uses the default `NSObject` implementation unless a primary key - is specified for an RLMObject. When a primary key is specified, `-isEqual:` calls - `-isEqualToObject:` and a corresponding implementation for `-hash` is also implemented. - -0.84.0 Release notes (2014-08-28) -============================================================= - -### API breaking changes - -* The timer used to trigger notifications has been removed. Notifications are now - only triggered by commits made in other threads, and can not currently be triggered - by changes made by other processes. Interprocess notifications will be re-added in - a future commit with an improved design. - -### Enhancements - -* Updating to core library version 0.82.2. -* Add property `deletedFromRealm` to RLMObject to indicate objects which have been deleted. -* Add support for the IN operator in predicates. -* Add support for the BETWEEN operator in link queries. -* Add support for multi-level link queries in predicates (e.g. `foo.bar.baz = 5`). -* Switch to building the SDK from source when using CocoaPods and add a - Realm.Headers subspec for use in targets that should not link a copy of Realm - (such as test targets). -* Allow unregistering from change notifications in the change notification - handler block. -* Significant performance improvements when holding onto large numbers of RLMObjects. -* Realm-Xcode6.xcodeproj now only builds using Xcode6-Beta6. -* Improved performance during RLMArray iteration, especially when mutating - contained objects. - -### Bugfixes - -* Fix crashes and assorted bugs when sorting or querying a RLMArray returned - from a query. -* Notifications are no longer sent when initializing new RLMRealm instances on background - threads. -* Handle object cycles in -[RLMObject description] and -[RLMArray description]. -* Lowered the deployment target for the Xcode 6 projects and Swift examples to - iOS 7.0, as they didn't actually require 8.0. -* Support setting model properties starting with the letter 'z' -* Fixed crashes that could result from switching between Debug and Relase - builds of Realm. - -0.83.0 Release notes (2014-08-13) -============================================================= - -### API breaking changes - -* Realm-Xcode6.xcodeproj now only builds using Xcode6-Beta5. -* Properties to be persisted in Swift classes must be explicitly declared as `dynamic`. -* Subclasses of RLMObject subclasses now throw an exception on startup, rather - than when added to a Realm. - -### Enhancements - -* Add support for querying for nil object properties. -* Improve error message when specifying invalid literals when creating or - initializing RLMObjects. -* Throw an exception when an RLMObject is used from the incorrect thread rather - than crashing in confusing ways. -* Speed up RLMRealm instantiation and array property iteration. -* Allow array and objection relation properties to be missing or null when - creating a RLMObject from a NSDictionary. - -### Bugfixes - -* Fixed a memory leak when querying for objects. -* Fixed initializing array properties on standalone Swift RLMObject subclasses. -* Fix for queries on 64bit integers. - -0.82.0 Release notes (2014-08-05) -============================================================= - -### API breaking changes - -* Realm-Xcode6.xcodeproj now only builds using Xcode6-Beta4. - -### Enhancements - -* Updating to core library version 0.80.5. -* Now support disabling the `autorefresh` property on RLMRealm instances. -* Building Realm-Xcode6 for iOS now builds a universal framework for Simulator & Device. -* Using NSNumber properties (unsupported) now throws a more informative exception. -* Added `[RLMRealm defaultRealmPath]` -* Proper implementation for [RLMArray indexOfObjectWhere:] -* The default Realm path on OS X is now ~/Library/Application Support/[bundle - identifier]/default.realm rather than ~/Documents -* We now check that the correct framework (ios or osx) is used at compile time. - -### Bugfixes - -* Fixed rapid growth of the realm file size. -* Fixed a bug which could cause a crash during RLMArray destruction after a query. -* Fixed bug related to querying on float properties: `floatProperty = 1.7` now works. -* Fixed potential bug related to the handling of array properties (RLMArray). -* Fixed bug where array properties accessed the wrong property. -* Fixed bug that prevented objects with custom getters to be added to a Realm. -* Fixed a bug where initializing a standalone object with an array literal would - trigger an exception. -* Clarified exception messages when using unsupported NSPredicate operators. -* Clarified exception messages when using unsupported property types on RLMObject subclasses. -* Fixed a memory leak when breaking out of a for-in loop on RLMArray. -* Fixed a memory leak when removing objects from a RLMArray property. -* Fixed a memory leak when querying for objects. - - -0.81.0 Release notes (2014-07-22) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Updating to core library version 0.80.3. -* Added support for basic querying of RLMObject and RLMArray properties (one-to-one and one-to-many relationships). - e.g. `[Person objectsWhere:@"dog.name == 'Alfonso'"]` or `[Person objectsWhere:@"ANY dogs.name == 'Alfonso'"]` - Supports all normal operators for numeric and date types. Does not support NSData properties or `BEGINSWITH`, `ENDSWITH`, `CONTAINS` - and other options for string properties. -* Added support for querying for object equality in RLMObject and RLMArray properties (one-to-one and one-to-many relationships). - e.g. `[Person objectsWhere:@"dog == %@", myDog]` `[Person objectsWhere:@"ANY dogs == %@", myDog]` `[Person objectsWhere:@"ANY friends.dog == %@", dog]` - Only supports comparing objects for equality (i.e. ==) -* Added a helper method to RLMRealm to perform a block inside a transaction. -* OSX framework now supported in CocoaPods. - -### Bugfixes - -* Fixed Unicode support in property names and string contents (Chinese, Russian, etc.). Closing #612 and #604. -* Fixed bugs related to migration when properties are removed. -* Fixed keyed subscripting for standalone RLMObjects. -* Fixed bug related to double clicking on a .realm file to launch the Realm Browser (thanks to Dean Moore). - - -0.80.0 Release notes (2014-07-15) -============================================================= - -### API breaking changes - -* Rename migration methods to -migrateDefaultRealmWithBlock: and -migrateRealmAtPath:withBlock: -* Moved Realm specific query methods from RLMRealm to class methods on RLMObject (-allObjects: to +allObjectsInRealm: ect.) - -### Enhancements - -* Added +createInDefaultRealmWithObject: method to RLMObject. -* Added support for array and object literals when calling -createWithObject: and -initWithObject: variants. -* Added method -deleteObjects: to batch delete objects from a Realm -* Support for defining RLMObject models entirely in Swift (experimental, see known issues). -* RLMArrays in Swift support Sequence-style enumeration (for obj in array). -* Implemented -indexOfObject: for RLMArray - -### Known Issues for Swift-defined models - -* Properties other than String, NSData and NSDate require a default value in the model. This can be an empty (but typed) array for array properties. -* The previous caveat also implies that not all models defined in Objective-C can be used for object properties. Only Objective-C models with only implicit (i.e. primitives) or explicit default values can be used. However, any Objective-C model object can be used in a Swift array property. -* Array property accessors don't work until its parent object has been added to a realm. -* Realm-Bridging-Header.h is temporarily exposed as a public header. This is temporary and will be private again once rdar://17633863 is fixed. -* Does not leverage Swift generics and still uses RLM-prefix everywhere. This is coming in #549. - - -0.22.0 Release notes -============================================================= - -### API breaking changes - -* Rename schemaForObject: to schemaForClassName: on RLMSchema -* Removed -objects:where: and -objects:orderedBy:where: from RLMRealm -* Removed -indexOfObjectWhere:, -objectsWhere: and -objectsOrderedBy:where: from RLMArray -* Removed +objectsWhere: and +objectsOrderedBy:where: from RLMObject - -### Enhancements - -* New Xcode 6 project for experimental swift support. -* New Realm Editor app for reading and editing Realm db files. -* Added support for migrations. -* Added support for RLMArray properties on objects. -* Added support for creating in-memory default Realm. -* Added -objectsWithClassName:predicateFormat: and -objectsWithClassName:predicate: to RLMRealm -* Added -indexOfObjectWithPredicateFormat:, -indexOfObjectWithPredicate:, -objectsWithPredicateFormat:, -objectsWithPredi -* Added +objectsWithPredicateFormat: and +objectsWithPredicate: to RLMObject -* Now allows predicates comparing two object properties of the same type. - - -0.20.0 Release notes (2014-05-28) -============================================================= - -Completely rewritten to be much more object oriented. - -### API breaking changes - -* Everything - -### Enhancements - -* None. - -### Bugfixes - -* None. - - -0.11.0 Release notes (not released) -============================================================= - -The Objective-C API has been updated and your code will break! - -### API breaking changes - -* `RLMTable` objects can only be created with an `RLMRealm` object. -* Renamed `RLMContext` to `RLMTransactionManager` -* Renamed `RLMContextDidChangeNotification` to `RLMRealmDidChangeNotification` -* Renamed `contextWithDefaultPersistence` to `managerForDefaultRealm` -* Renamed `contextPersistedAtPath:` to `managerForRealmWithPath:` -* Renamed `realmWithDefaultPersistence` to `defaultRealm` -* Renamed `realmWithDefaultPersistenceAndInitBlock` to `defaultRealmWithInitBlock` -* Renamed `find:` to `firstWhere:` -* Renamed `where:` to `allWhere:` -* Renamed `where:orderBy:` to `allWhere:orderBy:` - -### Enhancements - -* Added `countWhere:` on `RLMTable` -* Added `sumOfColumn:where:` on `RLMTable` -* Added `averageOfColumn:where:` on `RLMTable` -* Added `minOfProperty:where:` on `RLMTable` -* Added `maxOfProperty:where:` on `RLMTable` -* Added `toJSONString` on `RLMRealm`, `RLMTable` and `RLMView` -* Added support for `NOT` operator in predicates -* Added support for default values -* Added validation support in `createInRealm:withObject:` - -### Bugfixes - -* None. - - -0.10.0 Release notes (2014-04-23) -============================================================= - -TightDB is now Realm! The Objective-C API has been updated -and your code will break! - -### API breaking changes - -* All references to TightDB have been changed to Realm. -* All prefixes changed from `TDB` to `RLM`. -* `TDBTransaction` and `TDBSmartContext` have merged into `RLMRealm`. -* Write transactions now take an optional rollback parameter (rather than needing to return a boolean). -* `addColumnWithName:` and variant methods now return the index of the newly created column if successful, `NSNotFound` otherwise. - -### Enhancements - -* `createTableWithName:columns:` has been added to `RLMRealm`. -* Added keyed subscripting for RLMTable's first column if column is of type RLMPropertyTypeString. -* `setRow:atIndex:` has been added to `RLMTable`. -* `RLMRealm` constructors now have variants that take an writable initialization block -* New object interface - tables created/retrieved using `tableWithName:objectClass:` return custom objects - -### Bugfixes - -* None. - - -0.6.0 Release notes (2014-04-11) -============================================================= - -### API breaking changes - -* `contextWithPersistenceToFile:error:` renamed to `contextPersistedAtPath:error:` in `TDBContext` -* `readWithBlock:` renamed to `readUsingBlock:` in `TDBContext` -* `writeWithBlock:error:` renamed to `writeUsingBlock:error:` in `TDBContext` -* `readTable:withBlock:` renamed to `readTable:usingBlock:` in `TDBContext` -* `writeTable:withBlock:error:` renamed to `writeTable:usingBlock:error:` in `TDBContext` -* `findFirstRow` renamed to `indexOfFirstMatchingRow` on `TDBQuery`. -* `findFirstRowFromIndex:` renamed to `indexOfFirstMatchingRowFromIndex:` on `TDBQuery`. -* Return `NSNotFound` instead of -1 when appropriate. -* Renamed `castClass` to `castToTytpedTableClass` on `TDBTable`. -* `removeAllRows`, `removeRowAtIndex`, `removeLastRow`, `addRow` and `insertRow` methods - on table now return void instead of BOOL. - -### Enhancements -* A `TDBTable` can now be queried using `where:` and `where:orderBy:` taking - `NSPredicate` and `NSSortDescriptor` as arguments. -* Added `find:` method on `TDBTable` to find first row matching predicate. -* `contextWithDefaultPersistence` class method added to `TDBContext`. Will create a context persisted - to a file in app/documents folder. -* `renameColumnWithIndex:to:` has been added to `TDBTable`. -* `distinctValuesInColumnWithIndex` has been added to `TDBTable`. -* `dateIsBetween::`, `doubleIsBetween::`, `floatIsBetween::` and `intIsBetween::` - have been added to `TDBQuery`. -* Column names in Typed Tables can begin with non-capital letters too. The generated `addX` - selector can look odd. For example, a table with one column with name `age`, - appending a new row will look like `[table addage:7]`. -* Mixed typed values are better validated when rows are added, inserted, - or modified as object literals. -* `addRow`, `insertRow`, and row updates can be done using objects - derived from `NSObject`. -* `where` has been added to `TDBView`and `TDBViewProtocol`. -* Adding support for "smart" contexts (`TDBSmartContext`). - -### Bugfixes - -* Modifications of a `TDBView` and `TDBQuery` now throw an exception in a readtransaction. - - -0.5.0 Release notes (2014-04-02) -============================================================= - -The Objective-C API has been updated and your code will break! -Of notable changes a fast interface has been added. -This interface includes specific methods to get and set values into Tightdb. -To use these methods import ``. - -### API breaking changes - -* `getTableWithName:` renamed to `tableWithName:` in `TDBTransaction`. -* `addColumnWithName:andType:` renamed to `addColumnWithName:type:` in `TDBTable`. -* `columnTypeOfColumn:` renamed to `columnTypeOfColumnWithIndex` in `TDBTable`. -* `columnNameOfColumn:` renamed to `nameOfColumnWithIndex:` in `TDBTable`. -* `addColumnWithName:andType:` renamed to `addColumnWithName:type:` in `TDBDescriptor`. -* Fast getters and setters moved from `TDBRow.h` to `TDBRowFast.h`. - -### Enhancements - -* Added `minDateInColumnWithIndex` and `maxDateInColumnWithIndex` to `TDBQuery`. -* Transactions can now be started directly on named tables. -* You can create dynamic tables with initial schema. -* `TDBTable` and `TDBView` now have a shared protocol so they can easier be used interchangeably. - -### Bugfixes - -* Fixed bug in 64 bit iOS when inserting BOOL as NSNumber. - - -0.4.0 Release notes (2014-03-26) -============================================================= - -### API breaking changes - -* Typed interface Cursor has now been renamed to Row. -* TDBGroup has been renamed to TDBTransaction. -* Header files are renamed so names match class names. -* Underscore (_) removed from generated typed table classes. -* TDBBinary has been removed; use NSData instead. -* Underscope (_) removed from generated typed table classes. -* Constructor for TDBContext has been renamed to contextWithPersistenceToFile: -* Table findFirstRow and min/max/sum/avg operations has been hidden. -* Table.appendRow has been renamed to addRow. -* getOrCreateTable on Transaction has been removed. -* set*:inColumnWithIndex:atRowIndex: methods have been prefixed with TDB -* *:inColumnWithIndex:atRowIndex: methods have been prefixed with TDB -* addEmptyRow on table has been removed. Use [table addRow:nil] instead. -* TDBMixed removed. Use id and NSObject instead. -* insertEmptyRow has been removed from table. Use insertRow:nil atIndex:index instead. - -#### Enhancements - -* Added firstRow, lastRow selectors on view. -* firstRow and lastRow on table now return nil if table is empty. -* getTableWithName selector added on group. -* getting and creating table methods on group no longer take error argument. -* [TDBQuery parent] and [TDBQuery subtable:] selectors now return self. -* createTable method added on Transaction. Throws exception if table with same name already exists. -* Experimental support for pinning transactions on Context. -* TDBView now has support for object subscripting. - -### Bugfixes - -* None. - - -0.3.0 Release notes (2014-03-14) -============================================================= - -The Objective-C API has been updated and your code will break! - -### API breaking changes - -* Most selectors have been renamed in the binding! -* Prepend TDB-prefix on all classes and types. - -### Enhancements - -* Return types and parameters changed from size_t to NSUInteger. -* Adding setObject to TightdbTable (t[2] = @[@1, @"Hello"] is possible). -* Adding insertRow to TightdbTable. -* Extending appendRow to accept NSDictionary. - -### Bugfixes - -* None. - - -0.2.0 Release notes (2014-03-07) -============================================================= - -The Objective-C API has been updated and your code will break! - -### API breaking changes - -* addRow renamed to addEmptyRow - -### Enhancements - -* Adding a simple class for version numbering. -* Adding get-version and set-version targets to build.sh. -* tableview now supports sort on column with column type bool, date and int -* tableview has method for checking the column type of a specified column -* tableview has method for getting the number of columns -* Adding methods getVersion, getCoreVersion and isAtLeast. -* Adding appendRow to TightdbTable. -* Adding object subscripting. -* Adding method removeColumn on table. - -### Bugfixes - -* None. diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/NSError+RLMSync.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/NSError+RLMSync.h deleted file mode 100644 index 5ef323a24..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/NSError+RLMSync.h +++ /dev/null @@ -1,46 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2017 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@class RLMSyncErrorActionToken; - -/// NSError category extension providing methods to get data out of Realm's -/// "client reset" error. -@interface NSError (RLMSync) - -/** - Given an appropriate Atlas App Services error, return the token that - can be passed into `+[RLMSyncSession immediatelyHandleError:]` to - immediately perform error clean-up work, or nil if the error isn't of - a type that provides a token. - */ -- (nullable RLMSyncErrorActionToken *)rlmSync_errorActionToken NS_REFINED_FOR_SWIFT; - -/** - Given an Atlas App Services client reset error, return the path where the - backup copy of the Realm will be placed once the client reset process is - complete. - */ -- (nullable NSString *)rlmSync_clientResetBackedUpRealmPath NS_SWIFT_UNAVAILABLE(""); - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMAPIKeyAuth.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMAPIKeyAuth.h deleted file mode 100644 index 642bdd95d..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMAPIKeyAuth.h +++ /dev/null @@ -1,95 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMUserAPIKey, RLMObjectId; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// Provider client for user API keys. -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMAPIKeyAuth : RLMProviderClient - -/// A block type used to report an error -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMAPIKeyAuthOptionalErrorBlock)(NSError * _Nullable); - -/// A block type used to return an `RLMUserAPIKey` on success, or an `NSError` on failure -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMOptionalUserAPIKeyBlock)(RLMUserAPIKey * _Nullable, NSError * _Nullable); - -/// A block type used to return an array of `RLMUserAPIKey` on success, or an `NSError` on failure -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMUserAPIKeysBlock)(NSArray * _Nullable, NSError * _Nullable); - -/** - Creates a user API key that can be used to authenticate as the current user. - - @param name The name of the API key to be created. - @param completion A callback to be invoked once the call is complete. -*/ -- (void)createAPIKeyWithName:(NSString *)name - completion:(RLMOptionalUserAPIKeyBlock)completion NS_SWIFT_NAME(createAPIKey(named:completion:)); - -/** - Fetches a user API key associated with the current user. - - @param objectId The ObjectId of the API key to fetch. - @param completion A callback to be invoked once the call is complete. - */ -- (void)fetchAPIKey:(RLMObjectId *)objectId - completion:(RLMOptionalUserAPIKeyBlock)completion; - -/** - Fetches the user API keys associated with the current user. - - @param completion A callback to be invoked once the call is complete. - */ -- (void)fetchAPIKeysWithCompletion:(RLMUserAPIKeysBlock)completion; - -/** - Deletes a user API key associated with the current user. - - @param objectId The ObjectId of the API key to delete. - @param completion A callback to be invoked once the call is complete. - */ -- (void)deleteAPIKey:(RLMObjectId *)objectId - completion:(RLMAPIKeyAuthOptionalErrorBlock)completion; - -/** - Enables a user API key associated with the current user. - - @param objectId The ObjectId of the API key to enable. - @param completion A callback to be invoked once the call is complete. - */ -- (void)enableAPIKey:(RLMObjectId *)objectId - completion:(RLMAPIKeyAuthOptionalErrorBlock)completion; - -/** - Disables a user API key associated with the current user. - - @param objectId The ObjectId of the API key to disable. - @param completion A callback to be invoked once the call is complete. - */ -- (void)disableAPIKey:(RLMObjectId *)objectId - completion:(RLMAPIKeyAuthOptionalErrorBlock)completion; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMApp.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMApp.h deleted file mode 100644 index 2228232e8..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMApp.h +++ /dev/null @@ -1,235 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@protocol RLMNetworkTransport, RLMBSON; - -@class RLMUser, RLMCredentials, RLMSyncManager, RLMEmailPasswordAuth, RLMPushClient, RLMSyncTimeoutOptions; - -/// A block type used for APIs which asynchronously vend an `RLMUser`. -typedef void(^RLMUserCompletionBlock)(RLMUser * _Nullable, NSError * _Nullable); - -/// A block type used to report an error -typedef void(^RLMOptionalErrorBlock)(NSError * _Nullable); - -#pragma mark RLMAppConfiguration - -/// Properties representing the configuration of a client -/// that communicate with a particular Realm application. -@interface RLMAppConfiguration : NSObject - -/// A custom base URL to request against. -@property (nonatomic, strong, nullable) NSString *baseURL; - -/// The custom transport for network calls to the server. -@property (nonatomic, strong, nullable) id transport; - -/// :nodoc: -@property (nonatomic, strong, nullable) NSString *localAppName - __attribute__((deprecated("This field is not used"))); -/// :nodoc: -@property (nonatomic, strong, nullable) NSString *localAppVersion - __attribute__((deprecated("This field is not used"))); - -/// The default timeout for network requests. -@property (nonatomic, assign) NSUInteger defaultRequestTimeoutMS; - -/// If enabled (the default), a single connection is used for all Realms opened -/// with a single sync user. If disabled, a separate connection is used for each -/// Realm. -/// -/// Session multiplexing reduces resources used and typically improves -/// performance. When multiplexing is enabled, the connection is not immediately -/// closed when the last session is closed, and instead remains open for -/// ``RLMSyncTimeoutOptions.connectionLingerTime`` milliseconds (30 seconds by -/// default). -@property (nonatomic, assign) BOOL enableSessionMultiplexing; - -/** - Options for the assorted types of connection timeouts for sync connections. - - If nil default values for all timeouts are used instead. - */ -@property (nonatomic, nullable, copy) RLMSyncTimeoutOptions *syncTimeouts; - -/// :nodoc: -- (instancetype)initWithBaseURL:(nullable NSString *)baseURL - transport:(nullable id)transport - localAppName:(nullable NSString *)localAppName - localAppVersion:(nullable NSString *)localAppVersion -__attribute__((deprecated("localAppName and localAppVersion are unused"))); - -/// :nodoc: -- (instancetype)initWithBaseURL:(nullable NSString *) baseURL - transport:(nullable id)transport - localAppName:(nullable NSString *)localAppName - localAppVersion:(nullable NSString *)localAppVersion - defaultRequestTimeoutMS:(NSUInteger)defaultRequestTimeoutMS -__attribute__((deprecated("localAppName and localAppVersion are unused"))); - -/** -Create a new Realm App configuration. - -@param baseURL A custom base URL to request against. -@param transport A custom network transport. -*/ -- (instancetype)initWithBaseURL:(nullable NSString *)baseURL - transport:(nullable id)transport; - -/** - Create a new Realm App configuration. - - @param baseURL A custom base URL to request against. - @param transport A custom network transport. - @param defaultRequestTimeoutMS A custom default timeout for network requests. - */ -- (instancetype)initWithBaseURL:(nullable NSString *) baseURL - transport:(nullable id)transport - defaultRequestTimeoutMS:(NSUInteger)defaultRequestTimeoutMS; - -@end - -#pragma mark RLMApp - -/** - The `RLMApp` has the fundamental set of methods for communicating with a Realm - application backend. - - This interface provides access to login and authentication. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // internally thread-safe -@interface RLMApp : NSObject - -/// The configuration for this Realm app. -@property (nonatomic, readonly) RLMAppConfiguration *configuration; - -/// The `RLMSyncManager` for this Realm app. -@property (nonatomic, readonly) RLMSyncManager *syncManager; - -/// Get a dictionary containing all users keyed on id. -@property (nonatomic, readonly) NSDictionary *allUsers; - -/// Get the current user logged into the Realm app. -@property (nonatomic, readonly, nullable) RLMUser *currentUser; - -/// The app ID for this Realm app. -@property (nonatomic, readonly) NSString *appId; - -/** - A client for the email/password authentication provider which - can be used to obtain a credential for logging in. - - Used to perform requests specifically related to the email/password provider. -*/ -@property (nonatomic, readonly) RLMEmailPasswordAuth *emailPasswordAuth; - -/** - Get an application with a given appId and configuration. - - @param appId The unique identifier of your Realm app. - */ -+ (instancetype)appWithId:(NSString *)appId; - -/** - Get an application with a given appId and configuration. - - @param appId The unique identifier of your Realm app. - @param configuration A configuration object to configure this client. - */ -+ (instancetype)appWithId:(NSString *)appId - configuration:(nullable RLMAppConfiguration *)configuration; - -/** - Login to a user for the Realm app. - - @param credentials The credentials identifying the user. - @param completion A callback invoked after completion. - */ -- (void)loginWithCredential:(RLMCredentials *)credentials - completion:(RLMUserCompletionBlock)completion NS_REFINED_FOR_SWIFT; - -/** - Switches the active user to the specified user. - - This sets which user is used by all RLMApp operations which require a user. This is a local operation which does not access the network. - An exception will be throw if the user is not valid. The current user will remain logged in. - - @param syncUser The user to switch to. - @returns The user you intend to switch to - */ -- (RLMUser *)switchToUser:(RLMUser *)syncUser; - -/** - A client which can be used to register devices with the server to receive push notificatons - */ -- (RLMPushClient *)pushClientWithServiceName:(NSString *)serviceName - NS_SWIFT_NAME(pushClient(serviceName:)); - -/** - RLMApp instances are cached internally by Realm and cannot be created directly. - - Use `+[RLMRealm appWithId]` or `+[RLMRealm appWithId:configuration:]` - to obtain a reference to an RLMApp. - */ -- (instancetype)init __attribute__((unavailable("Use +appWithId or appWithId:configuration:."))); - -/** -RLMApp instances are cached internally by Realm and cannot be created directly. - -Use `+[RLMRealm appWithId]` or `+[RLMRealm appWithId:configuration:]` -to obtain a reference to an RLMApp. -*/ -+ (instancetype)new __attribute__((unavailable("Use +appWithId or appWithId:configuration:."))); - -@end - -#pragma mark - Sign In With Apple Extension - -API_AVAILABLE(ios(13.0), macos(10.15), tvos(13.0), watchos(6.0)) -/// Use this delegate to be provided a callback once authentication has succeed or failed -@protocol RLMASLoginDelegate - -/// Callback that is invoked should the authentication fail. -/// @param error An error describing the authentication failure. -- (void)authenticationDidFailWithError:(NSError *)error NS_SWIFT_NAME(authenticationDidComplete(error:)); - -/// Callback that is invoked should the authentication succeed. -/// @param user The newly authenticated user. -- (void)authenticationDidCompleteWithUser:(RLMUser *)user NS_SWIFT_NAME(authenticationDidComplete(user:)); - -@end - -API_AVAILABLE(ios(13.0), macos(10.15), tvos(13.0), watchos(6.0)) -/// Category extension that deals with Sign In With Apple authentication. -/// This is only available on OS's that support `AuthenticationServices` -@interface RLMApp (ASLogin) - -/// Use this delegate to be provided a callback once authentication has succeed or failed. -@property (nonatomic, weak, nullable) id authorizationDelegate; - -/// Sets the ASAuthorizationControllerDelegate to be handled by `RLMApp` -/// @param controller The ASAuthorizationController in which you want `RLMApp` to consume its delegate. -- (void)setASAuthorizationControllerDelegateForController:(ASAuthorizationController *)controller NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMArray.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMArray.h deleted file mode 100644 index b2c6c1664..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMArray.h +++ /dev/null @@ -1,652 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObject, RLMResults; - -/** - `RLMArray` is the container type in Realm used to define to-many relationships. - - Unlike an `NSArray`, `RLMArray`s hold a single type, specified by the `objectClassName` property. - This is referred to in these docs as the “type” of the array. - - When declaring an `RLMArray` property, the type must be marked as conforming to a - protocol by the same name as the objects it should contain (see the - `RLM_COLLECTION_TYPE` macro). In addition, the property can be declared using Objective-C - generics for better compile-time type safety. - - RLM_COLLECTION_TYPE(ObjectType) - ... - @property RLMArray *arrayOfObjectTypes; - - `RLMArray`s can be queried with the same predicates as `RLMObject` and `RLMResult`s. - - `RLMArray`s cannot be created directly. `RLMArray` properties on `RLMObject`s are - lazily created when accessed, or can be obtained by querying a Realm. - - ### Key-Value Observing - - `RLMArray` supports array key-value observing on `RLMArray` properties on `RLMObject` - subclasses, and the `invalidated` property on `RLMArray` instances themselves is - key-value observing compliant when the `RLMArray` is attached to a managed - `RLMObject` (`RLMArray`s on unmanaged `RLMObject`s will never become invalidated). - - Because `RLMArray`s are attached to the object which they are a property of, they - do not require using the mutable collection proxy objects from - `-mutableArrayValueForKey:` or KVC-compatible mutation methods on the containing - object. Instead, you can call the mutation methods on the `RLMArray` directly. - */ - -@interface RLMArray : NSObject - -#pragma mark - Properties - -/** - The number of objects in the array. - */ -@property (nonatomic, readonly, assign) NSUInteger count; - -/** - The type of the objects in the array. - */ -@property (nonatomic, readonly, assign) RLMPropertyType type; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readonly, getter = isOptional) BOOL optional; - -/** - The class name of the objects contained in the array. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages the array. Returns `nil` for unmanaged arrays. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - Indicates if the array can no longer be accessed. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if the array is frozen. - - Frozen arrays are immutable and can be accessed from any thread. Frozen arrays - are created by calling `-freeze` on a managed live array. Unmanaged arrays are - never frozen. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Accessing Objects from an Array - -/** - Returns the object at the index specified. - - @param index The index to look up. - - @return An object of the type contained in the array. - */ -- (RLMObjectType)objectAtIndex:(NSUInteger)index; - -/** - Returns an array containing the objects in the array at the indexes specified by a given index set. - `nil` will be returned if the index set contains an index out of the arrays bounds. - - @param indexes The indexes in the array to retrieve objects from. - - @return The objects at the specified indexes. - */ -- (nullable NSArray *)objectsAtIndexes:(NSIndexSet *)indexes; - -/** - Returns the first object in the array. - - Returns `nil` if called on an empty array. - - @return An object of the type contained in the array. - */ -- (nullable RLMObjectType)firstObject; - -/** - Returns the last object in the array. - - Returns `nil` if called on an empty array. - - @return An object of the type contained in the array. - */ -- (nullable RLMObjectType)lastObject; - - - -#pragma mark - Adding, Removing, and Replacing Objects in an Array - -/** - Adds an object to the end of the array. - - @warning This method may only be called during a write transaction. - - @param object An object of the type contained in the array. - */ -- (void)addObject:(RLMObjectType)object; - -/** - Adds an array of objects to the end of the array. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable object such as `NSArray` or `RLMResults` which contains objects of the - same class as the array. - */ -- (void)addObjects:(id)objects; - -/** - Inserts an object at the given index. - - Throws an exception if the index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param anObject An object of the type contained in the array. - @param index The index at which to insert the object. - */ -- (void)insertObject:(RLMObjectType)anObject atIndex:(NSUInteger)index; - -/** - Removes an object at the given index. - - Throws an exception if the index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param index The array index identifying the object to be removed. - */ -- (void)removeObjectAtIndex:(NSUInteger)index; - -/** - Removes the last object in the array. - - This is a no-op if the array is already empty. - - @warning This method may only be called during a write transaction. -*/ -- (void)removeLastObject; - -/** - Removes all objects from the array. - - @warning This method may only be called during a write transaction. - */ -- (void)removeAllObjects; - -/** - Replaces an object at the given index with a new object. - - Throws an exception if the index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param index The index of the object to be replaced. - @param anObject An object (of the same type as returned from the `objectClassName` selector). - */ -- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(RLMObjectType)anObject; - -/** - Moves the object at the given source index to the given destination index. - - Throws an exception if the index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param sourceIndex The index of the object to be moved. - @param destinationIndex The index to which the object at `sourceIndex` should be moved. - */ -- (void)moveObjectAtIndex:(NSUInteger)sourceIndex toIndex:(NSUInteger)destinationIndex; - -/** - Exchanges the objects in the array at given indices. - - Throws an exception if either index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param index1 The index of the object which should replace the object at index `index2`. - @param index2 The index of the object which should replace the object at index `index1`. - */ -- (void)exchangeObjectAtIndex:(NSUInteger)index1 withObjectAtIndex:(NSUInteger)index2; - -#pragma mark - Querying an Array - -/** - Returns the index of an object in the array. - - Returns `NSNotFound` if the object is not found in the array. - - @param object An object (of the same type as returned from the `objectClassName` selector). - */ -- (NSUInteger)indexOfObject:(RLMObjectType)object; - -/** - Returns the index of the first object in the array matching the predicate. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return The index of the object, or `NSNotFound` if the object is not found in the array. - */ -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns the index of the first object in the array matching the predicate. - - @param predicate The predicate with which to filter the objects. - - @return The index of the object, or `NSNotFound` if the object is not found in the array. - */ -- (NSUInteger)indexOfObjectWithPredicate:(NSPredicate *)predicate; - -/** - Returns all the objects matching the given predicate in the array. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` of objects that match the given predicate. - */ -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all the objects matching the given predicate in the array. - - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` of objects that match the given predicate - */ -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/** - Returns a sorted `RLMResults` from the array. - - @param keyPath The key path to sort by. - @param ascending The direction to sort in. - - @return An `RLMResults` sorted by the specified key path. - */ -- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a sorted `RLMResults` from the array. - - @param properties An array of `RLMSortDescriptor`s to sort by. - - @return An `RLMResults` sorted by the specified properties. - */ -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/** - Returns a distinct `RLMResults` from the array. - - @param keyPaths The key paths to distinct on. - - @return An `RLMResults` with the distinct values of the keypath(s). - */ -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -/// :nodoc: -- (RLMObjectType)objectAtIndexedSubscript:(NSUInteger)index; - -/// :nodoc: -- (void)setObject:(RLMObjectType)newValue atIndexedSubscript:(NSUInteger)index; - -#pragma mark - Sectioning an Array - -/** - Sorts and sections this collection from a given property key path, returning the result - as an instance of `RLMSectionedResults`. - - @param keyPath The property key path to sort on. - @param ascending The direction to sort in. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsSortedUsingKeyPath:(NSString *)keyPath - ascending:(BOOL)ascending - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -/** - Sorts and sections this collection from a given array of sort descriptors, returning the result - as an instance of `RLMSectionedResults`. - - @param sortDescriptors An array of `RLMSortDescriptor`s to sort by. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @note The primary sort descriptor must be responsible for determining the section key. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsUsingSortDescriptors:(NSArray *)sortDescriptors - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - - -#pragma mark - Notifications - -/** - Registers a block to be called each time the array changes. - - The block will be asynchronously called with the initial array, and then - called again after each write transaction which changes any of the objects in - the array, which objects are in the results, or the order of the objects in the - array. - - The `changes` parameter will be `nil` the first time the block is called. For - each call after that, it will contain information about which rows in the - array were added, removed or modified. If a write transaction did not modify - any objects in the array, the block is not called at all. See the - `RLMCollectionChange` documentation for information on how the changes are - reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - Person *person = [[Person allObjectsInRealm:realm] firstObject]; - NSLog(@"person.dogs.count: %zu", person.dogs.count); // => 0 - self.token = [person.dogs addNotificationBlock(RLMArray *dogs, - RLMCollectionChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count) // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - [person.dogs addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a non-frozen managed array. - - @param block The block to be called each time the array changes. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMArray *_Nullable array, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the array changes. - - The block will be asynchronously called with the initial array, and then - called again after each write transaction which changes any of the objects in - the array, which objects are in the results, or the order of the objects in the - array. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the array were added, removed or modified. If a write transaction - did not modify any objects in the array, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMArray *_Nullable array, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the array changes. - - The block will be asynchronously called with the initial array, and then - called again after each write transaction which changes any of the objects in - the array, which objects are in the results, or the order of the objects in the - array. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the array were added, removed or modified. If a write transaction - did not modify any objects in the array, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMArray *_Nullable array, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the array changes. - - The block will be asynchronously called with the initial array, and then - called again after each write transaction which changes any of the objects in - the array, which objects are in the results, or the order of the objects in the - array. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the array were added, removed or modified. If a write transaction - did not modify any objects in the array, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMArray *_Nullable array, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths -__attribute__((warn_unused_result)); - -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the objects in the array. - - NSNumber *min = [object.arrayProperty minOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The minimum value of the property, or `nil` if the array is empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects in the array. - - NSNumber *max = [object.arrayProperty maxOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose maximum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The maximum value of the property, or `nil` if the array is empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of the values of a given property over all the objects in the array. - - NSNumber *sum = [object.arrayProperty sumOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose values should be summed. Only properties of - types `int`, `float`, and `double` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects in the array. - - NSNumber *average = [object.arrayProperty averageOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose average value should be calculated. Only - properties of types `int`, `float`, and `double` are supported. - - @return The average value of the given property, or `nil` if the array is empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this array. - - The frozen copy is an immutable array which contains the same data as this - array currently contains, but will not update when writes are made to the - containing Realm. Unlike live arrays, frozen arrays can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a managed array. - @warning Holding onto a frozen array for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -#pragma mark - Unavailable Methods - -/** - `-[RLMArray init]` is not available because `RLMArray`s cannot be created directly. - `RLMArray` properties on `RLMObject`s are lazily created when accessed. - */ -- (instancetype)init __attribute__((unavailable("RLMArrays cannot be created directly"))); - -/** - `+[RLMArray new]` is not available because `RLMArray`s cannot be created directly. - `RLMArray` properties on `RLMObject`s are lazily created when accessed. - */ -+ (instancetype)new __attribute__((unavailable("RLMArrays cannot be created directly"))); - -@end - -/// :nodoc: -@interface RLMArray (Swift) -// for use only in Swift class definitions -- (instancetype)initWithObjectClassName:(NSString *)objectClassName; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMAsymmetricObject.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMAsymmetricObject.h deleted file mode 100644 index 09deb787e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMAsymmetricObject.h +++ /dev/null @@ -1,98 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2022 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectSchema, RLMPropertyDescriptor, RLMRealm; -/** - `RLMAsymmetricObject` is a base class used to define asymmetric Realm objects. - - Asymmetric objects can only be created using the `createInRealm:` - function, and cannot be added, removed or queried. - When created, asymmetric objects will be synced unidirectionally to the MongoDB - database and cannot be accessed locally. - - Linking an asymmetric object within an `Object` is not allowed and will throw an error. - - The property types supported on `RLMAsymmetricObject` are the same as for `RLMObject`, - except for that asymmetric objects can only link to embedded objects, so `RLMObject` - and `RLMArray` properties are not supported (`RLMEmbeddedObject` and - `RLMArray` *are*). - */ -@interface RLMAsymmetricObject : RLMObjectBase - -#pragma mark - Creating & Initializing Objects - -/** - Creates an unmanaged instance of a Realm object. - */ -- (instancetype)init NS_DESIGNATED_INITIALIZER; - -/** - Creates an unmanaged instance of a Realm object. - - Pass in an `NSArray` or `NSDictionary` instance to set the values of the object's properties. - */ -- (instancetype)initWithValue:(id)value; - -/** - Returns the class name for a Realm object subclass. - - @warning Do not override. Realm relies on this method returning the exact class - name. - - @return The class name for the model class. - */ -+ (NSString *)className; - -/** - Creates an Asymmetric object, which will be synced unidirectionally and - cannot be queried locally. - - Objects created using this method will not be added to the Realm. - - @warning This method may only be called during a write transaction. - @warning This method always returns nil. - - @param realm The Realm to be used to create the asymmetric object.. - @param value The value used to populate the object. - - @return Returns `nil` - */ -+ (instancetype)createInRealm:(RLMRealm *)realm withValue:(id)value; - -#pragma mark - Properties - -/** - The object schema which lists the managed properties for the object. - */ -@property (nonatomic, readonly) RLMObjectSchema *objectSchema; - -#pragma mark - Dynamic Accessors - -/// :nodoc: -- (nullable id)objectForKeyedSubscript:(NSString *)key; - -/// :nodoc: -- (void)setObject:(nullable id)obj forKeyedSubscript:(NSString *)key; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMAsyncTask.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMAsyncTask.h deleted file mode 100644 index 9f7dc58da..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMAsyncTask.h +++ /dev/null @@ -1,67 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A task object which can be used to observe or cancel an async open. - - When a synchronized Realm is opened asynchronously, the latest state of the - Realm is downloaded from the server before the completion callback is invoked. - This task object can be used to observe the state of the download or to cancel - it. This should be used instead of trying to observe the download via the sync - session as the sync session itself is created asynchronously, and may not exist - yet when -[RLMRealm asyncOpenWithConfiguration:completion:] returns. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMAsyncOpenTask : NSObject -/** - Register a progress notification block. - - Each registered progress notification block is called whenever the sync - subsystem has new progress data to report until the task is either cancelled - or the completion callback is called. Progress notifications are delivered on - the main queue. - */ -- (void)addProgressNotificationBlock:(RLMProgressNotificationBlock)block; - -/** - Register a progress notification block which is called on the given queue. - - Each registered progress notification block is called whenever the sync - subsystem has new progress data to report until the task is either cancelled - or the completion callback is called. Progress notifications are delivered on - the supplied queue. - */ -- (void)addProgressNotificationOnQueue:(dispatch_queue_t)queue - block:(RLMProgressNotificationBlock)block; - -/** - Cancel the asynchronous open. - - Any download in progress will be cancelled, and the completion block for this - async open will never be called. If multiple async opens on the same Realm are - happening concurrently, all other opens will fail with the error "operation cancelled". - */ -- (void)cancel; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMBSON.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMBSON.h deleted file mode 100644 index 41750fd57..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMBSON.h +++ /dev/null @@ -1,174 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -#pragma mark RLMBSONType - -/** - Allowed BSON types. - */ -typedef NS_ENUM(NSUInteger, RLMBSONType) { - /// BSON Null type - RLMBSONTypeNull, - /// BSON Int32 type - RLMBSONTypeInt32, - /// BSON Int64 type - RLMBSONTypeInt64, - /// BSON Bool type - RLMBSONTypeBool, - /// BSON Double type - RLMBSONTypeDouble, - /// BSON String type - RLMBSONTypeString, - /// BSON Binary type - RLMBSONTypeBinary, - /// BSON Timestamp type - RLMBSONTypeTimestamp, - /// BSON Datetime type - RLMBSONTypeDatetime, - /// BSON ObjectId type - RLMBSONTypeObjectId, - /// BSON Decimal128 type - RLMBSONTypeDecimal128, - /// BSON RegularExpression type - RLMBSONTypeRegularExpression, - /// BSON MaxKey type - RLMBSONTypeMaxKey, - /// BSON MinKey type - RLMBSONTypeMinKey, - /// BSON Document type - RLMBSONTypeDocument, - /// BSON Array type - RLMBSONTypeArray, - /// BSON UUID type - RLMBSONTypeUUID -}; - -#pragma mark RLMBSON - -/** - Protocol representing a BSON value. BSON is a computer data interchange format. - The name "BSON" is based on the term JSON and stands for "Binary JSON". - - The following types conform to RLMBSON: - - `NSNull` - `NSNumber` - `NSString` - `NSData` - `NSDateInterval` - `NSDate` - `RLMObjectId` - `RLMDecimal128` - `NSRegularExpression` - `RLMMaxKey` - `RLMMinKey` - `NSDictionary` - `NSArray` - `NSUUID` - - @see RLMBSONType - @see bsonspec.org - */ -@protocol RLMBSON - -/** - The BSON type for the conforming interface. - */ -@property (readonly) RLMBSONType bsonType NS_REFINED_FOR_SWIFT; - -/** - Whether or not this BSON is equal to another. - - @param other The BSON to compare to - */ -- (BOOL)isEqual:(_Nullable id)other; - -@end - -/// :nodoc: -@interface NSNull (RLMBSON) -@end - -/// :nodoc: -@interface NSNumber (RLMBSON) -@end - -/// :nodoc: -@interface NSString (RLMBSON) -@end - -/// :nodoc: -@interface NSData (RLMBSON) -@end - -/// :nodoc: -@interface NSDateInterval (RLMBSON) -@end - -/// :nodoc: -@interface NSDate (RLMBSON) -@end - -/// :nodoc: -@interface RLMObjectId (RLMBSON) -@end - -/// :nodoc: -@interface RLMDecimal128 (RLMBSON) -@end - -/// :nodoc: -@interface NSRegularExpression (RLMBSON) -@end - -/// MaxKey will always be the greatest value when comparing to other BSON types -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMMaxKey : NSObject -@end - -/// MinKey will always be the smallest value when comparing to other BSON types -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMMinKey : NSObject -@end - -/// :nodoc: -@interface RLMMaxKey (RLMBSON) -@end - -/// :nodoc: -@interface RLMMinKey (RLMBSON) -@end - -/// :nodoc: -@interface NSDictionary (RLMBSON) -@end - -/// :nodoc: -@interface NSMutableArray (RLMBSON) -@end - -/// :nodoc: -@interface NSArray (RLMBSON) -@end - -/// :nodoc: -@interface NSUUID (RLMBSON) -@end diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMCollection.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMCollection.h deleted file mode 100644 index eac117f17..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMCollection.h +++ /dev/null @@ -1,613 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@protocol RLMValue; -@class RLMRealm, RLMResults, RLMSortDescriptor, RLMNotificationToken, RLMCollectionChange, RLMSectionedResults; -typedef RLM_CLOSED_ENUM(int32_t, RLMPropertyType); -/// A callback which is invoked on each element in the Results collection which returns the section key. -typedef id _Nullable(^RLMSectionedResultsKeyBlock)(id); - -/** - A homogenous collection of Realm-managed objects. Examples of conforming types - include `RLMArray`, `RLMSet`, `RLMResults`, and `RLMLinkingObjects`. - */ -@protocol RLMCollection - -#pragma mark - Properties - -/** - The number of objects in the collection. - */ -@property (nonatomic, readonly) NSUInteger count; - -/** - The type of the objects in the collection. - */ -@property (nonatomic, readonly) RLMPropertyType type; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readonly, getter = isOptional) BOOL optional; - -/** - The class name of the objects contained in the collection. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages this collection, if any. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - Indicates if the collection is no longer valid. - - The collection becomes invalid if `invalidate` is called on the managing - Realm. Unmanaged collections are never invalidated. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -#pragma mark - Accessing Objects from a Collection - -/** - Returns the object at the index specified. - - @param index The index to look up. - - @return An object of the type contained in the collection. - */ -- (id)objectAtIndex:(NSUInteger)index; - -@optional - -/** - Returns an array containing the objects in the collection at the indexes - specified by a given index set. `nil` will be returned if the index set - contains an index out of the collections bounds. - - @param indexes The indexes in the collection to retrieve objects from. - - @return The objects at the specified indexes. - */ -- (nullable NSArray *)objectsAtIndexes:(NSIndexSet *)indexes; - -/** - Returns the first object in the collection. - - RLMSet is not ordered, and so for sets this will return an arbitrary object in - the set. It is not guaraneed to be a different object from what `lastObject` - gives even if the set has multiple objects in it. - - Returns `nil` if called on an empty collection. - - @return An object of the type contained in the collection. - */ -- (nullable id)firstObject; - -/** - Returns the last object in the collection. - - RLMSet is not ordered, and so for sets this will return an arbitrary object in - the set. It is not guaraneed to be a different object from what `firstObject` - gives even if the set has multiple objects in it. - - Returns `nil` if called on an empty collection. - - @return An object of the type contained in the collection. - */ -- (nullable id)lastObject; - -/// :nodoc: -- (id)objectAtIndexedSubscript:(NSUInteger)index; - -/** - Returns the index of an object in the collection. - - Returns `NSNotFound` if the object is not found in the collection. - - @param object An object (of the same type as returned from the `objectClassName` selector). - */ -- (NSUInteger)indexOfObject:(id)object; - -/** - Returns the index of the first object in the collection matching the predicate. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return The index of the object, or `NSNotFound` if the object is not found in the collection. - */ -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns the index of the first object in the collection matching the predicate. - - @param predicate The predicate with which to filter the objects. - - @return The index of the object, or `NSNotFound` if the object is not found in the collection. - */ -- (NSUInteger)indexOfObjectWithPredicate:(NSPredicate *)predicate; - -@required - -#pragma mark - Querying a Collection - -/** - Returns all objects matching the given predicate in the collection. - - This is only supported for managed collections. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - @return An `RLMResults` containing objects that match the given predicate. - */ -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all objects matching the given predicate in the collection. - - This is only supported for managed collections. - - @param predicate The predicate with which to filter the objects. - @return An `RLMResults` containing objects that match the given predicate. - */ -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/** - Returns a sorted `RLMResults` from the collection. - - This is only supported for managed collections. - - @param keyPath The keyPath to sort by. - @param ascending The direction to sort in. - @return An `RLMResults` sorted by the specified key path. - */ -- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a sorted `RLMResults` from the collection. - - This is only supported for managed collections. - - @param properties An array of `RLMSortDescriptor`s to sort by. - @return An `RLMResults` sorted by the specified properties. - */ -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/** - Returns a distinct `RLMResults` from the collection. - - This is only supported for managed collections. - - @param keyPaths The key paths used produce distinct results - @return An `RLMResults` made distinct based on the specified key paths - */ -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -/** - Returns an `NSArray` containing the results of invoking `valueForKey:` using - `key` on each of the collection's objects. - - @param key The name of the property. - - @return An `NSArray` containing results. - */ -- (nullable id)valueForKey:(NSString *)key; - -/** - Returns the value for the derived property identified by a given key path. - - @param keyPath A key path of the form relationship.property (with one or more relationships). - - @return The value for the derived property identified by keyPath. - */ -- (nullable id)valueForKeyPath:(NSString *)keyPath; - -/** - Invokes `setValue:forKey:` on each of the collection's objects using the specified `value` and `key`. - - @warning This method may only be called during a write transaction. - - @param value The object value. - @param key The name of the property. - */ -- (void)setValue:(nullable id)value forKey:(NSString *)key; - -#pragma mark - Notifications - -/** -Registers a block to be called each time the collection changes. - -The block will be asynchronously called with the initial collection, -and then called again after each write transaction which changes either any -of the objects in the collection, or which objects are in the collection. - -The `change` parameter will be `nil` the first time the block is called. -For each call after that, it will contain information about -which rows in the collection were added, removed or modified. If a -write transaction did not modify any objects in the results collection, -the block is not called at all. See the `RLMCollectionChange` documentation for -information on how the changes are reported and an example of updating a -`UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - -At the time when the block is called, the collection object will be fully -evaluated and up-to-date, and as long as you do not perform a write transaction -on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will -never perform blocking work. - -Notifications are delivered via the standard run loop, and so can't be -delivered while the run loop is blocked by other activity. When -notifications can't be delivered instantly, multiple notifications may be -coalesced into a single notification. This can include the notification -with the initial results. For example, the following code performs a write -transaction immediately after adding the notification block, so there is no -opportunity for the initial notification to be delivered first. As a -result, the initial notification will reflect the state of the Realm after -the write transaction. - - RLMResults *results = [Dog allObjects]; - NSLog(@"dogs.count: %zu", dogs.count); // => 0 - self.token = [results addNotificationBlock:^(RLMResults *dogs, - RLMCollectionChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - [realm addObject:dog]; - }]; - // end of run loop execution context - -You must retain the returned token for as long as you want updates to continue -to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - -@warning This method cannot be called during a write transaction, or when the - containing Realm is read-only or frozen. - -@param block The block to be called whenever a change occurs. -@return A token which must be held for as long as you want updates to be delivered. -*/ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** -Registers a block to be called each time the collection changes. - -The block will be asynchronously called with the initial collection, -and then called again after each write transaction which changes either any -of the objects in the collection, or which objects are in the collection. - -The `change` parameter will be `nil` the first time the block is called. -For each call after that, it will contain information about -which rows in the collection were added, removed or modified. If a -write transaction did not modify any objects in the results collection, -the block is not called at all. See the `RLMCollectionChange` documentation for -information on how the changes are reported and an example of updating a -`UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - -At the time when the block is called, the collection object will be fully -evaluated and up-to-date, and as long as you do not perform a write transaction -on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will -never perform blocking work. - -Notifications are delivered on the given queue. If the queue is blocked and -notifications can't be delivered instantly, multiple notifications may be -coalesced into a single notification. - -You must retain the returned token for as long as you want updates to continue -to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - -@warning This method cannot be called when the containing Realm is read-only or frozen. -@warning The queue must be a serial queue. - -@param block The block to be called whenever a change occurs. -@param queue The serial queue to deliver notifications to. -@return A token which must be held for as long as you want updates to be delivered. -*/ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** -Registers a block to be called each time the collection changes. - -The block will be asynchronously called with the initial collection, -and then called again after each write transaction which changes either any -of the objects in the collection, or which objects are in the collection. - -The `change` parameter will be `nil` the first time the block is called. -For each call after that, it will contain information about -which rows in the collection were added, removed or modified. If a -write transaction did not modify any objects in the results collection, -the block is not called at all. See the `RLMCollectionChange` documentation for -information on how the changes are reported and an example of updating a -`UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - -At the time when the block is called, the collection object will be fully -evaluated and up-to-date, and as long as you do not perform a write transaction -on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will -never perform blocking work. - -Notifications are delivered on the given queue. If the queue is blocked and -notifications can't be delivered instantly, multiple notifications may be -coalesced into a single notification. - -You must retain the returned token for as long as you want updates to continue -to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - -@warning This method cannot be called when the containing Realm is read-only or frozen. -@warning The queue must be a serial queue. - -@param block The block to be called whenever a change occurs. -@param queue The serial queue to deliver notifications to. -@param keyPaths The block will be called for changes occurring on these keypaths. If no -key paths are given, notifications are delivered for every property key path. -@return A token which must be held for as long as you want updates to be delivered. -*/ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -#pragma mark - Sectioned Results - -/** - Sorts and sections this collection from a given property key path, returning the result - as an instance of `RLMSectionedResults`. - - @param keyPath The property key path to sort on. - @param ascending The direction to sort in. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsSortedUsingKeyPath:(NSString *)keyPath - ascending:(BOOL)ascending - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -/** - Sorts and sections this collection from a given array of sort descriptors, returning the result - as an instance of `RLMSectionedResults`. - - @param sortDescriptors An array of `RLMSortDescriptor`s to sort by. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @note The primary sort descriptor must be responsible for determining the section key. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsUsingSortDescriptors:(NSArray *)sortDescriptors - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the objects - in the collection. - - NSNumber *min = [results minOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The minimum value of the property, or `nil` if the Results are empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects - in the collection. - - NSNumber *max = [results maxOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose maximum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The maximum value of the property, or `nil` if the Results are empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of the values of a given property over all the objects in the collection. - - NSNumber *sum = [results sumOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose values should be summed. Only properties of - types `int`, `float`, and `double` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects in the collection. - - NSNumber *average = [results averageOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose average value should be calculated. Only - properties of types `int`, `float`, and `double` are supported. - - @return The average value of the given property, or `nil` if the Results are empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -#pragma mark - Freeze - -/** - Indicates if the collection is frozen. - - Frozen collections are immutable and can be accessed from any thread. The - objects read from a frozen collection will also be frozen. - */ -@property (nonatomic, readonly, getter=isFrozen) BOOL frozen; - -/** - Returns a frozen (immutable) snapshot of this collection. - - The frozen copy is an immutable collection which contains the same data as - this collection currently contains, but will not update when writes are made - to the containing Realm. Unlike live collections, frozen collections can be - accessed from any thread. - - @warning This method cannot be called during a write transaction, or when the containing Realm is read-only. - @warning Holding onto a frozen collection for an extended period while - performing write transaction on the Realm may result in the Realm - file growing to large sizes. See - `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -@end - -/** - An `RLMSortDescriptor` stores a property name and a sort order for use with - `sortedResultsUsingDescriptors:`. It is similar to `NSSortDescriptor`, but supports - only the subset of functionality which can be efficiently run by Realm's query - engine. - - `RLMSortDescriptor` instances are immutable. - */ -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMSortDescriptor : NSObject - -#pragma mark - Properties - -/** - The key path which the sort descriptor orders results by. - */ -@property (nonatomic, readonly) NSString *keyPath; - -/** - Whether the descriptor sorts in ascending or descending order. - */ -@property (nonatomic, readonly) BOOL ascending; - -#pragma mark - Methods - -/** - Returns a new sort descriptor for the given key path and sort direction. - */ -+ (instancetype)sortDescriptorWithKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a copy of the receiver with the sort direction reversed. - */ -- (instancetype)reversedSortDescriptor; - -@end - -/** - A `RLMCollectionChange` object encapsulates information about changes to collections - that are reported by Realm notifications. - - `RLMCollectionChange` is passed to the notification blocks registered with - `-addNotificationBlock` on `RLMArray` and `RLMResults`, and reports what rows in the - collection changed since the last time the notification block was called. - - The change information is available in two formats: a simple array of row - indices in the collection for each type of change, and an array of index paths - in a requested section suitable for passing directly to `UITableView`'s batch - update methods. A complete example of updating a `UITableView` named `tv`: - - [tv beginUpdates]; - [tv deleteRowsAtIndexPaths:[changes deletionsInSection:0] withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv insertRowsAtIndexPaths:[changes insertionsInSection:0] withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv reloadRowsAtIndexPaths:[changes modificationsInSection:0] withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv endUpdates]; - - All of the arrays in an `RLMCollectionChange` are always sorted in ascending order. - */ -@interface RLMCollectionChange : NSObject -/// The indices of objects in the previous version of the collection which have -/// been removed from this one. -@property (nonatomic, readonly) NSArray *deletions; - -/// The indices in the new version of the collection which were newly inserted. -@property (nonatomic, readonly) NSArray *insertions; - -/** - The indices in the new version of the collection which were modified. - - For `RLMResults`, this means that one or more of the properties of the object at - that index were modified (or an object linked to by that object was - modified). - - For `RLMArray`, the array itself being modified to contain a - different object at that index will also be reported as a modification. - */ -@property (nonatomic, readonly) NSArray *modifications; - -/// Returns the index paths of the deletion indices in the given section. -- (NSArray *)deletionsInSection:(NSUInteger)section; - -/// Returns the index paths of the insertion indices in the given section. -- (NSArray *)insertionsInSection:(NSUInteger)section; - -/// Returns the index paths of the modification indices in the given section. -- (NSArray *)modificationsInSection:(NSUInteger)section; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMConstants.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMConstants.h deleted file mode 100644 index 0bc8db972..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMConstants.h +++ /dev/null @@ -1,156 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#define RLM_HEADER_AUDIT_BEGIN NS_HEADER_AUDIT_BEGIN -#define RLM_HEADER_AUDIT_END NS_HEADER_AUDIT_END - -#define RLM_SWIFT_SENDABLE NS_SWIFT_SENDABLE - -#define RLM_FINAL __attribute__((objc_subclassing_restricted)) - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -// Swift 5 considers NS_ENUM to be "open", meaning there could be values present -// other than the defined cases (which allows adding more cases later without -// it being a breaking change), while older versions consider it "closed". -#ifdef NS_CLOSED_ENUM -#define RLM_CLOSED_ENUM NS_CLOSED_ENUM -#else -#define RLM_CLOSED_ENUM NS_ENUM -#endif - -#if __has_attribute(ns_error_domain) && (!defined(__cplusplus) || !__cplusplus || __cplusplus >= 201103L) -#define RLM_ERROR_ENUM(type, name, domain) \ - _Pragma("clang diagnostic push") \ - _Pragma("clang diagnostic ignored \"-Wignored-attributes\"") \ - NS_ENUM(type, __attribute__((ns_error_domain(domain))) name) \ - _Pragma("clang diagnostic pop") -#else -#define RLM_ERROR_ENUM(type, name, domain) NS_ENUM(type, name) -#endif - -#define RLM_HIDDEN __attribute__((visibility("hidden"))) -#define RLM_VISIBLE __attribute__((visibility("default"))) -#define RLM_HIDDEN_BEGIN _Pragma("GCC visibility push(hidden)") -#define RLM_HIDDEN_END _Pragma("GCC visibility pop") -#define RLM_DIRECT __attribute__((objc_direct)) -#define RLM_DIRECT_MEMBERS __attribute__((objc_direct_members)) - -#pragma mark - Enums - -/** - `RLMPropertyType` is an enumeration describing all property types supported in Realm models. - - For more information, see [Realm Models](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/object-models-and-schemas/). - */ -typedef RLM_CLOSED_ENUM(int32_t, RLMPropertyType) { - -#pragma mark - Primitive types - /** Integers: `NSInteger`, `int`, `long`, `Int` (Swift) */ - RLMPropertyTypeInt = 0, - /** Booleans: `BOOL`, `bool`, `Bool` (Swift) */ - RLMPropertyTypeBool = 1, - /** Floating-point numbers: `float`, `Float` (Swift) */ - RLMPropertyTypeFloat = 5, - /** Double-precision floating-point numbers: `double`, `Double` (Swift) */ - RLMPropertyTypeDouble = 6, - /** NSUUID, UUID */ - RLMPropertyTypeUUID = 12, - -#pragma mark - Object types - - /** Strings: `NSString`, `String` (Swift) */ - RLMPropertyTypeString = 2, - /** Binary data: `NSData` */ - RLMPropertyTypeData = 3, - /** Any type: `id`, `AnyRealmValue` (Swift) */ - RLMPropertyTypeAny = 9, - /** Dates: `NSDate` */ - RLMPropertyTypeDate = 4, - -#pragma mark - Linked object types - - /** Realm model objects. See [Realm Models](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/object-models-and-schemas/) for more information. */ - RLMPropertyTypeObject = 7, - /** Realm linking objects. See [Realm Models](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/relationships/#inverse-relationship) for more information. */ - RLMPropertyTypeLinkingObjects = 8, - - RLMPropertyTypeObjectId = 10, - RLMPropertyTypeDecimal128 = 11 -}; - -#pragma mark - Notification Constants - -/** - A notification indicating that changes were made to a Realm. -*/ -typedef NSString * RLMNotification NS_EXTENSIBLE_STRING_ENUM; - -/** - This notification is posted when a write transaction has been committed to a Realm on a different thread for - the same file. - - It is not posted if `autorefresh` is enabled, or if the Realm is refreshed before the notification has a chance - to run. - - Realms with autorefresh disabled should normally install a handler for this notification which calls - `-[RLMRealm refresh]` after doing some work. Refreshing the Realm is optional, but not refreshing the Realm may lead to - large Realm files. This is because an extra copy of the data must be kept for the stale Realm. - */ -extern RLMNotification const RLMRealmRefreshRequiredNotification NS_SWIFT_NAME(RefreshRequired); - -/** - This notification is posted by a Realm when a write transaction has been - committed to a Realm on a different thread for the same file. - - It is not posted if `-[RLMRealm autorefresh]` is enabled, or if the Realm is - refreshed before the notification has a chance to run. - - Realms with autorefresh disabled should normally install a handler for this - notification which calls `-[RLMRealm refresh]` after doing some work. Refreshing - the Realm is optional, but not refreshing the Realm may lead to large Realm - files. This is because Realm must keep an extra copy of the data for the stale - Realm. - */ -extern RLMNotification const RLMRealmDidChangeNotification NS_SWIFT_NAME(DidChange); - -#pragma mark - Error keys - -/** Key to identify the associated backup Realm configuration in an error's `userInfo` dictionary */ -extern NSString * const RLMBackupRealmConfigurationErrorKey; - -#pragma mark - Other Constants - -/** The schema version used for uninitialized Realms */ -extern const uint64_t RLMNotVersioned; - -/** The corresponding value is the name of an exception thrown by Realm. */ -extern NSString * const RLMExceptionName; - -/** The corresponding value is a Realm file version. */ -extern NSString * const RLMRealmVersionKey; - -/** The corresponding key is the version of the underlying database engine. */ -extern NSString * const RLMRealmCoreVersionKey; - -/** The corresponding key is the Realm invalidated property name. */ -extern NSString * const RLMInvalidatedKey; - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMCredentials.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMCredentials.h deleted file mode 100644 index adff4e7e9..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMCredentials.h +++ /dev/null @@ -1,126 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) -@protocol RLMBSON; - -/// A token representing an identity provider's credentials. -typedef NSString *RLMCredentialsToken; - -/// A type representing the unique identifier of an Atlas App Services identity provider. -typedef NSString *RLMIdentityProvider NS_EXTENSIBLE_STRING_ENUM; - -/// The username/password identity provider. User accounts are handled by Atlas App Services directly without the -/// involvement of a third-party identity provider. -extern RLMIdentityProvider const RLMIdentityProviderUsernamePassword; - -/// A Facebook account as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderFacebook; - -/// A Google account as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderGoogle; - -/// An Apple account as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderApple; - -/// A JSON Web Token as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderJWT; - -/// An Anonymous account as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderAnonymous; - -/// An Realm Cloud function as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderFunction; - -/// A user api key as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderUserAPIKey; - -/// A server api key as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderServerAPIKey; - -/** - Opaque credentials representing a specific Realm App user. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMCredentials : NSObject - -/// The name of the identity provider which generated the credentials token. -@property (nonatomic, readonly) RLMIdentityProvider provider; - -/** - Construct and return credentials from a Facebook account token. - */ -+ (instancetype)credentialsWithFacebookToken:(RLMCredentialsToken)token; - -/** - Construct and return credentials from a Google account token. - */ -+ (instancetype)credentialsWithGoogleAuthCode:(RLMCredentialsToken)token; - -/** - Construct and return credentials from a Google id token. - */ -+ (instancetype)credentialsWithGoogleIdToken:(RLMCredentialsToken)token; - -/** - Construct and return credentials from an Apple account token. - */ -+ (instancetype)credentialsWithAppleToken:(RLMCredentialsToken)token; - -/** - Construct and return credentials for an Atlas App Services function using a mongodb document as a json payload. -*/ -+ (instancetype)credentialsWithFunctionPayload:(NSDictionary> *)payload; - -/** - Construct and return credentials from a user api key. -*/ -+ (instancetype)credentialsWithUserAPIKey:(NSString *)apiKey; - -/** - Construct and return credentials from a server api key. -*/ -+ (instancetype)credentialsWithServerAPIKey:(NSString *)apiKey; - -/** - Construct and return Atlas App Services credentials from an email and password. - */ -+ (instancetype)credentialsWithEmail:(NSString *)email - password:(NSString *)password; - -/** - Construct and return credentials from a JSON Web Token. - */ -+ (instancetype)credentialsWithJWT:(NSString *)token; - -/** - Construct and return anonymous credentials - */ -+ (instancetype)anonymousCredentials; - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("RLMAppCredentials cannot be created directly"))); - -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("RLMAppCredentials cannot be created directly"))); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMDecimal128.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMDecimal128.h deleted file mode 100644 index f6224bbf2..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMDecimal128.h +++ /dev/null @@ -1,110 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A 128-bit IEEE 754-2008 decimal floating point number. - - This type is similar to Swift's built-in Decimal type, but allocates bits - differently, resulting in a different representable range. (NS)Decimal stores a - significand of up to 38 digits long and an exponent from -128 to 127, while - this type stores up to 34 digits of significand and an exponent from -6143 to - 6144. - */ -RLM_SWIFT_SENDABLE // immutable -@interface RLMDecimal128 : NSObject -/// Creates a new zero-initialized decimal128. -- (instancetype)init; - -/// Converts the given value to a RLMDecimal128. -/// -/// The following types can be converted to RLMDecimal128: -/// - NSNumber -/// - NSString -/// - NSDecimalNumber -/// -/// Passing a value with a type not in this list is a fatal error. Passing a -/// string which cannot be parsed as a valid Decimal128 is a fatal error. -- (instancetype)initWithValue:(id)value; - -/// Converts the given number to a RLMDecimal128. -- (instancetype)initWithNumber:(NSNumber *)number; - -/// Parses the given string to a RLMDecimal128. -/// -/// Returns a decimal where `isNaN` is `YES` if the string cannot be parsed as a decimal. `error` is never set -/// and this will never actually return `nil`. -- (nullable instancetype)initWithString:(NSString *)string error:(NSError **)error; - -/// Converts the given number to a RLMDecimal128. -+ (instancetype)decimalWithNumber:(NSNumber *)number; - -/// The minimum value for RLMDecimal128. -@property (class, readonly, copy) RLMDecimal128 *minimumDecimalNumber NS_REFINED_FOR_SWIFT; - -/// The maximum value for RLMDecimal128. -@property (class, readonly, copy) RLMDecimal128 *maximumDecimalNumber NS_REFINED_FOR_SWIFT; - -/// Convert this value to a double. This is a lossy conversion. -@property (nonatomic, readonly) double doubleValue; - -/// Convert this value to a NSDecimal. This may be a lossy conversion. -@property (nonatomic, readonly) NSDecimal decimalValue; - -/// Convert this value to a string. -@property (nonatomic, readonly) NSString *stringValue; - -/// Gets if this Decimal128 represents a NaN value. -@property (nonatomic, readonly) BOOL isNaN; - -/// The magnitude of this RLMDecimal128. -@property (nonatomic, readonly) RLMDecimal128 *magnitude NS_REFINED_FOR_SWIFT; - -/// Replaces this RLMDecimal128 value with its additive inverse. -- (void)negate; - -/// Adds the right hand side to the current value and returns the result. -- (RLMDecimal128 *)decimalNumberByAdding:(RLMDecimal128 *)decimalNumber; - -/// Divides the right hand side to the current value and returns the result. -- (RLMDecimal128 *)decimalNumberByDividingBy:(RLMDecimal128 *)decimalNumber; - -/// Subtracts the right hand side to the current value and returns the result. -- (RLMDecimal128 *)decimalNumberBySubtracting:(RLMDecimal128 *)decimalNumber; - -/// Multiply the right hand side to the current value and returns the result. -- (RLMDecimal128 *)decimalNumberByMultiplyingBy:(RLMDecimal128 *)decimalNumber; - -/// Comparision operator to check if the right hand side is greater than the current value. -- (BOOL)isGreaterThan:(nullable RLMDecimal128 *)decimalNumber; - -/// Comparision operator to check if the right hand side is greater than or equal to the current value. -- (BOOL)isGreaterThanOrEqualTo:(nullable RLMDecimal128 *)decimalNumber; - -/// Comparision operator to check if the right hand side is less than the current value. -- (BOOL)isLessThan:(nullable RLMDecimal128 *)decimalNumber; - -/// Comparision operator to check if the right hand side is less than or equal to the current value. -- (BOOL)isLessThanOrEqualTo:(nullable RLMDecimal128 *)decimalNumber; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMDictionary.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMDictionary.h deleted file mode 100644 index 9c8cac538..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMDictionary.h +++ /dev/null @@ -1,559 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObject, RLMResults, RLMDictionaryChange; - -/** - `RLMDictionary` is a container type in Realm representing a dynamic collection of key-value pairs. - - Unlike `NSDictionary`, `RLMDictionary`s hold a single key and value type. - This is referred to in these docs as the “type” and “keyType” of the dictionary. - - When declaring an `RLMDictionary` property, the object type and keyType must be marked as conforming to a - protocol by the same name as the objects it should contain. - - RLM_COLLECTION_TYPE(ObjectType) - ... - @property RLMDictionary *objectTypeDictionary; - - `RLMDictionary`s can be queried with the same predicates as `RLMObject` and `RLMResult`s. - - `RLMDictionary`s cannot be created directly. `RLMDictionary` properties on `RLMObject`s are - lazily created when accessed, or can be obtained by querying a Realm. - - `RLMDictionary` only supports `NSString` as a key. Realm disallows the use of `.` or `$` characters within a dictionary key. - - ### Key-Value Observing - - `RLMDictionary` supports dictionary key-value observing on `RLMDictionary` properties on `RLMObject` - subclasses, and the `invalidated` property on `RLMDictionary` instances themselves is - key-value observing compliant when the `RLMDictionary` is attached to a managed - `RLMObject` (`RLMDictionary`s on unmanaged `RLMObject`s will never become invalidated). - */ -@interface RLMDictionary: NSObject - -#pragma mark - Properties - -/** - The number of entries in the dictionary. - */ -@property (nonatomic, readonly, assign) NSUInteger count; - -/** - The type of the objects in the dictionary. - */ -@property (nonatomic, readonly, assign) RLMPropertyType type; - -/** - The type of the key used in this dictionary. - */ -@property (nonatomic, readonly, assign) RLMPropertyType keyType; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readonly, getter = isOptional) BOOL optional; - -/** - The class name of the objects contained in the dictionary. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages the dictionary. Returns `nil` for unmanaged dictionary. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - Indicates if the dictionary can no longer be accessed. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if the dictionary is frozen. - - Frozen dictionaries are immutable and can be accessed from any thread. Frozen dictionaries - are created by calling `-freeze` on a managed live dictionary. Unmanaged dictionaries are - never frozen. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Accessing Objects from a Dictionary - -/** - Returns the value associated with a given key. - - @param key The name of the property. - - @discussion If key does not start with “@”, invokes object(forKey:). If key does start - with “@”, strips the “@” and invokes [super valueForKey:] with the rest of the key. - - @return A value associated with a given key or `nil`. - */ -- (nullable id)valueForKey:(nonnull RLMKeyType)key; - -/** - Returns an array containing the dictionary’s keys. - - @note The order of the elements in the array is not defined. - */ -@property(readonly, copy) NSArray *allKeys; - -/** - Returns an array containing the dictionary’s values. - - @note The order of the elements in the array is not defined. - */ -@property(readonly, copy) NSArray *allValues; - -/** - Returns the value associated with a given key. - - @note `nil` will be returned if no value is associated with a given key. NSNull will be returned - where null is associated with the key. - - @param key The key for which to return the corresponding value. - - @return The value associated with key. - */ -- (nullable RLMObjectType)objectForKey:(nonnull RLMKeyType)key; - -/** - Returns the value associated with a given key. - - @note `nil` will be returned if no value is associated with a given key. NSNull will be returned - where null is associated with the key. - - @param key The key for which to return the corresponding value. - - @return The value associated with key. - */ -- (nullable RLMObjectType)objectForKeyedSubscript:(RLMKeyType)key; - -/** - Applies a given block object to the each key-value pair of the dictionary. - - @param block A block object to operate on entries in the dictionary. - - @note If the block sets *stop to YES, the enumeration stops. - */ -- (void)enumerateKeysAndObjectsUsingBlock:(void (^)(RLMKeyType key, RLMObjectType obj, BOOL *stop))block; - -#pragma mark - Adding, Removing, and Replacing Objects in a Dictionary - -/** - Replace the contents of a dictionary with the contents of another dictionary - NSDictionary or RLMDictionary. - - This will remove all elements in this dictionary and then apply each element from the given dictionary. - - @warning This method may only be called during a write transaction. - @warning If otherDictionary is self this will result in an empty dictionary. - */ -- (void)setDictionary:(id)otherDictionary; - -/** - Removes all contents in the dictionary. - - @warning This method may only be called during a write transaction. - */ -- (void)removeAllObjects; - -/** - Removes from the dictionary entries specified by elements in a given array. If a given key does not - exist, no mutation will happen for that key. - - @warning This method may only be called during a write transaction. - */ -- (void)removeObjectsForKeys:(NSArray *)keyArray; - -/** - Removes a given key and its associated value from the dictionary. If the key does not exist the dictionary - will not be modified. - - @warning This method may only be called during a write transaction. - */ -- (void)removeObjectForKey:(RLMKeyType)key; - -/** - Adds a given key-value pair to the dictionary if the key is not present, or updates the value for the given key - if the key already present. - - @warning This method may only be called during a write transaction. - */ -- (void)setObject:(nullable RLMObjectType)obj forKeyedSubscript:(RLMKeyType)key; - -/** - Adds a given key-value pair to the dictionary if the key is not present, or updates the value for the given key - if the key already present. - - @warning This method may only be called during a write transaction. - */ -- (void)setObject:(nullable RLMObjectType)anObject forKey:(RLMKeyType)aKey; - -/** - Adds to the receiving dictionary the entries from another dictionary. - - @note If the receiving dictionary contains the same key(s) as the otherDictionary, then - the receiving dictionary will update each key-value pair for the matching key. - - @warning This method may only be called during a write transaction. - - @param otherDictionary An enumerable object such as `NSDictionary` or `RLMDictionary` which contains objects of the - same type as the receiving dictionary. - */ -- (void)addEntriesFromDictionary:(id )otherDictionary; - -#pragma mark - Querying a Dictionary - -/** - Returns all the values matching the given predicate in the dictionary. - - @note The keys in the dictionary are ignored when quering values, and they will not be returned in the `RLMResults`. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` of objects that match the given predicate. - */ -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all the values matching the given predicate in the dictionary. - - @note The keys in the dictionary are ignored when quering values, and they will not be returned in the `RLMResults`. - - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` of objects that match the given predicate - */ -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/** - Returns a sorted RLMResults of all values in the dictionary. - - @note The keys in the dictionary are ignored when sorting values, and they will not be returned in the `RLMResults`. - - @param keyPath The key path to sort by. - @param ascending The direction to sort in. - - @return An `RLMResults` sorted by the specified key path. - */- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a sorted RLMResults of all values in the dictionary. - - @note The keys in the dictionary are ignored when sorting values, and they will not be returned in the `RLMResults`. - - @param properties An array of `RLMSortDescriptor`s to sort by. - - @return An `RLMResults` sorted by the specified properties. - */ -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/** - Returns a distinct `RLMResults` from all values in the dictionary. - - @note The keys in the dictionary are ignored, and they will not be returned in the `RLMResults`. - - @param keyPaths The key paths to distinct on. - - @return An `RLMResults` with the distinct values of the keypath(s). - */ -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the values in the dictionary. - - NSNumber *min = [object.dictionaryProperty minOfProperty:@"age"]; - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, `NSDate`, `RLMValue` and `RLMDecimal128` are supported. - - @return The minimum value of the property, or `nil` if the dictionary is empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects in the dictionary. - - NSNumber *max = [object.dictionaryProperty maxOfProperty:@"age"]; - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, `NSDate`, `RLMValue` and `RLMDecimal128` are supported. - - @return The maximum value of the property, or `nil` if the dictionary is empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of distinct values of a given property over all the objects in the dictionary. - - NSNumber *sum = [object.dictionaryProperty sumOfProperty:@"age"]; - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, `RLMValue` and `RLMDecimal128` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects in the dictionary. - - NSNumber *average = [object.dictionaryProperty averageOfProperty:@"age"]; - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, `NSDate`, `RLMValue` and `RLMDecimal128` are supported. - - @return The average value of the given property, or `nil` if the dictionary is empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -#pragma mark - Notifications - -/** - Registers a block to be called each time the dictionary changes. - - The block will be asynchronously called with the initial dictionary, and then - called again after each write transaction which changes any of the keys or values - within the dictionary. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which keys in the dictionary were added, modified or deleted. If a write transaction - did not modify any keys or values in the dictionary, the block is not called at all. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - Person *person = [[Person allObjectsInRealm:realm] firstObject]; - NSLog(@"person.dogs.count: %zu", person.dogs.count); // => 0 - self.token = [person.dogs addNotificationBlock(RLMDictionary *dogs, - RLMDictionaryChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - person.dogs[@"frenchBulldog"] = dog; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a non-frozen managed dictionary. - - @param block The block to be called each time the dictionary changes. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMDictionary *_Nullable dictionary, - RLMDictionaryChange *_Nullable changes, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the dictionary changes. - - The block will be asynchronously called with the initial dictionary, and then - called again after each write transaction which changes any of the key-value in - the dictionary or which objects are in the results. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which keys in the dictionary were added or modified. If a write transaction - did not modify any objects in the dictionary, the block is not called at all. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMDictionary *_Nullable dictionary, - RLMDictionaryChange *_Nullable changes, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the dictionary changes. - - The block will be asynchronously called with the initial dictionary, and then - called again after each write transaction which changes any of the key-value in - the dictionary or which objects are in the results. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which keys in the dictionary were added or modified. If a write transaction - did not modify any objects in the dictionary, the block is not called at all. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMDictionary *_Nullable dictionary, - RLMDictionaryChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the dictionary changes. - - The block will be asynchronously called with the initial dictionary, and then - called again after each write transaction which changes any of the key-value in - the dictionary or which objects are in the results. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which keys in the dictionary were added or modified. If a write transaction - did not modify any objects in the dictionary, the block is not called at all. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMDictionary *_Nullable dictionary, - RLMDictionaryChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths -__attribute__((warn_unused_result)); - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of a dictionary. - - The frozen copy is an immutable dictionary which contains the same data as this - dictionary currently contains, but will not update when writes are made to the - containing Realm. Unlike live dictionaries, frozen dictionaries can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a managed dictionary. - @warning Holding onto a frozen dictionary for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -#pragma mark - Unavailable Methods -/** - `-[RLMDictionary init]` is not available because `RLMDictionary`s cannot be created directly. - `RLMDictionary` properties on `RLMObject`s are lazily created when accessed. - */ -- (instancetype)init __attribute__((unavailable("RLMDictionary cannot be created directly"))); -/** - `+[RLMDictionary new]` is not available because `RLMDictionary`s cannot be created directly. - `RLMDictionary` properties on `RLMObject`s are lazily created when accessed. - */ -+ (instancetype)new __attribute__((unavailable("RLMDictionary cannot be created directly"))); - -@end - -/** - A `RLMDictionaryChange` object encapsulates information about changes to dictionaries - that are reported by Realm notifications. - - `RLMDictionaryChange` is passed to the notification blocks registered with - `-addNotificationBlock` on `RLMDictionary`, and reports what keys in the - dictionary changed since the last time the notification block was called. - */ -@interface RLMDictionaryChange : NSObject -/// The keys in the new version of the dictionary which were newly inserted. -@property (nonatomic, readonly) NSArray *insertions; - -/// The keys in the new version of the dictionary which were modified. -@property (nonatomic, readonly) NSArray *modifications; - -/// The keys which were deleted from the old version. -@property (nonatomic, readonly) NSArray *deletions; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMEmailPasswordAuth.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMEmailPasswordAuth.h deleted file mode 100644 index 748eb26af..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMEmailPasswordAuth.h +++ /dev/null @@ -1,120 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@protocol RLMBSON; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// A block type used to report an error -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMEmailPasswordAuthOptionalErrorBlock)(NSError * _Nullable); - -/** - A client for the email/password authentication provider which - can be used to obtain a credential for logging in, - and to perform requests specifically related to the email/password provider. -*/ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMEmailPasswordAuth : RLMProviderClient - -/** - Registers a new email identity with the email/password provider, - and sends a confirmation email to the provided address. - - @param email The email address of the user to register. - @param password The password that the user created for the new email/password identity. - @param completionHandler A callback to be invoked once the call is complete. -*/ - -- (void)registerUserWithEmail:(NSString *)email - password:(NSString *)password - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler NS_SWIFT_NAME(registerUser(email:password:completion:)); - -/** - Confirms an email identity with the email/password provider. - - @param token The confirmation token that was emailed to the user. - @param tokenId The confirmation token id that was emailed to the user. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)confirmUser:(NSString *)token - tokenId:(NSString *)tokenId - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Re-sends a confirmation email to a user that has registered but - not yet confirmed their email address. - - @param email The email address of the user to re-send a confirmation for. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)resendConfirmationEmail:(NSString *)email - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Retries custom confirmation function for a given email address. - - @param email The email address of the user to retry custom confirmation logic. - @param completionHandler A callback to be invoked once the call is complete. - */ -- (void)retryCustomConfirmation:(NSString *)email - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Sends a password reset email to the given email address. - - @param email The email address of the user to send a password reset email for. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)sendResetPasswordEmail:(NSString *)email - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Resets the password of an email identity using the - password reset token emailed to a user. - - @param password The new password. - @param token The password reset token that was emailed to the user. - @param tokenId The password reset token id that was emailed to the user. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)resetPasswordTo:(NSString *)password - token:(NSString *)token - tokenId:(NSString *)tokenId - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Resets the password of an email identity using the - password reset function set up in the application. - - @param email The email address of the user. - @param password The desired new password. - @param args A list of arguments passed in as a BSON array. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)callResetPasswordFunction:(NSString *)email - password:(NSString *)password - args:(NSArray> *)args - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMEmbeddedObject.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMEmbeddedObject.h deleted file mode 100644 index 4db6248ca..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMEmbeddedObject.h +++ /dev/null @@ -1,367 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectSchema, RLMPropertyDescriptor, RLMRealm, RLMNotificationToken, RLMPropertyChange; -typedef void (^RLMObjectChangeBlock)(BOOL deleted, - NSArray *_Nullable changes, - NSError *_Nullable error); -/** - `RLMEmbeddedObject` is a base class used to define Realm model objects. - - Embedded objects work similarly to normal objects, but are owned by a single - parent Object (which itself may be embedded). Unlike normal top-level objects, - embedded objects cannot be directly created in or added to a Realm. Instead, - they can only be created as part of a parent object, or by assigning an - unmanaged object to a parent object's property. Embedded objects are - automatically deleted when the parent object is deleted or when the parent is - modified to no longer point at the embedded object, either by reassigning an - RLMObject property or by removing the embedded object from the array containing - it. - - Embedded objects can only ever have a single parent object which links to them, - and attempting to link to an existing managed embedded object will throw an - exception. - - The property types supported on `RLMEmbeddedObject` are the same as for - `RLMObject`, except for that embedded objects cannot link to top-level objects, - so `RLMObject` and `RLMArray` properties are not supported - (`RLMEmbeddedObject` and `RLMArray` *are*). - - Embedded objects cannot have primary keys or indexed properties. - */ - -@interface RLMEmbeddedObject : RLMObjectBase - -#pragma mark - Creating & Initializing Objects - -/** - Creates an unmanaged instance of a Realm object. - - Unmanaged embedded objects can be added to a Realm by assigning them to an - object property of a managed Realm object or by adding them to a managed - RLMArray. - */ -- (instancetype)init NS_DESIGNATED_INITIALIZER; - -/** - Creates an unmanaged instance of a Realm object. - - Pass in an `NSArray` or `NSDictionary` instance to set the values of the object's properties. - - Unmanaged embedded objects can be added to a Realm by assigning them to an - object property of a managed Realm object or by adding them to a managed - RLMArray. - */ -- (instancetype)initWithValue:(id)value; - -/** - Returns the class name for a Realm object subclass. - - @warning Do not override. Realm relies on this method returning the exact class - name. - - @return The class name for the model class. - */ -+ (NSString *)className; - -#pragma mark - Properties - -/** - The Realm which manages the object, or `nil` if the object is unmanaged. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - The object schema which lists the managed properties for the object. - */ -@property (nonatomic, readonly) RLMObjectSchema *objectSchema; - -/** - Indicates if the object can no longer be accessed because it is now invalid. - - An object can no longer be accessed if the object has been deleted from the Realm that manages it, or - if `invalidate` is called on that Realm. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if this object is frozen. - - @see `-[RLMEmbeddedObject freeze]` - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Customizing your Objects - -/** - Override this method to specify the default values to be used for each property. - - @return A dictionary mapping property names to their default values. - */ -+ (nullable NSDictionary *)defaultPropertyValues; - -/** - Override this method to specify the names of properties to ignore. These properties will not be managed by the Realm - that manages the object. - - @return An array of property names to ignore. - */ -+ (nullable NSArray *)ignoredProperties; - -/** - Override this method to specify the names of properties that are non-optional (i.e. cannot be assigned a `nil` value). - - By default, all properties of a type whose values can be set to `nil` are - considered optional properties. To require that an object in a Realm always - store a non-`nil` value for a property, add the name of the property to the - array returned from this method. - - Properties of `RLMEmbeddedObject` type cannot be non-optional. Array and - `NSNumber` properties can be non-optional, but there is no reason to do so: - arrays do not support storing nil, and if you want a non-optional number you - should instead use the primitive type. - - @return An array of property names that are required. - */ -+ (NSArray *)requiredProperties; - -/** - Override this method to provide information related to properties containing linking objects. - - Each property of type `RLMLinkingObjects` must have a key in the dictionary returned by this method consisting - of the property name. The corresponding value must be an instance of `RLMPropertyDescriptor` that describes the class - and property that the property is linked to. - - return @{ @"owners": [RLMPropertyDescriptor descriptorWithClass:Owner.class propertyName:@"dogs"] }; - - @return A dictionary mapping property names to `RLMPropertyDescriptor` instances. - */ -+ (NSDictionary *)linkingObjectsProperties; - -#pragma mark - Notifications - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in differen - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When notifications - can't be delivered instantly, multiple notifications may be coalesced into a - single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - - @param block The block to be called whenever a change occurs. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block queue:(dispatch_queue_t)queue; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block keyPaths:(NSArray *)keyPaths queue:(dispatch_queue_t)queue; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block keyPaths:(NSArray *)keyPaths; - -#pragma mark - Other Instance Methods - -/** - Returns YES if another Realm object instance points to the same object as the - receiver in the Realm managing the receiver. - - For frozen objects and object types with a primary key, `isEqual:` is - overridden to use the same logic as this method (along with a corresponding - implementation for `hash`). Non-frozen objects without primary keys use - pointer identity for `isEqual:` and `hash`. - - @param object The object to compare the receiver to. - - @return Whether the object represents the same object as the receiver. - */ -- (BOOL)isEqualToObject:(RLMEmbeddedObject *)object; - -/** - Returns a frozen (immutable) snapshot of this object. - - The frozen copy is an immutable object which contains the same data as this - object currently contains, but will not update when writes are made to the - containing Realm. Unlike live objects, frozen objects can be accessed from any - thread. - - - warning: Holding onto a frozen object for an extended period while performing write - transaction on the Realm may result in the Realm file growing to large sizes. See - `Realm.Configuration.maximumNumberOfActiveVersions` for more information. - - warning: This method can only be called on a managed object. - */ -- (instancetype)freeze NS_RETURNS_RETAINED; - -/** - Returns a live (mutable) reference of this object. - - This method creates a managed accessor to a live copy of the same frozen object. - Will return self if called on an already live object. - */ -- (instancetype)thaw; - -#pragma mark - Dynamic Accessors - -/// :nodoc: -- (nullable id)objectForKeyedSubscript:(NSString *)key; - -/// :nodoc: -- (void)setObject:(nullable id)obj forKeyedSubscript:(NSString *)key; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMError.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMError.h deleted file mode 100644 index 514ceee3f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMError.h +++ /dev/null @@ -1,442 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2022 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@protocol RLMValue; - -#pragma mark - Error Domains - -/** Error code is a value from the RLMError enum. */ -extern NSString *const RLMErrorDomain; - -/** An error domain identifying non-specific system errors. */ -extern NSString *const RLMUnknownSystemErrorDomain; - -/** - The error domain string for all SDK errors related to errors reported - by the synchronization manager error handler, as well as general sync - errors that don't fall into any of the other categories. - */ -extern NSString *const RLMSyncErrorDomain; - -/** - The error domain string for all SDK errors related to the authentication - endpoint. - */ -extern NSString *const RLMSyncAuthErrorDomain; - -/** -The error domain string for all SDK errors related to the Atlas App Services -endpoint. -*/ -extern NSString *const RLMAppErrorDomain; - -#pragma mark - RLMError - -/// A user info key containing the error code. This is provided for backwards -/// compatibility only and should not be used. -extern NSString *const RLMErrorCodeKey __attribute((deprecated("use -[NSError code]"))); - -/// A user info key containing the name of the error code. This is for -/// debugging purposes only and should not be relied on. -extern NSString *const RLMErrorCodeNameKey; - -/// A user info key present in sync errors which originate from the server, -/// containing the URL of the server-side logs associated with the error. -extern NSString * const RLMServerLogURLKey; - -/// A user info key containing a HTTP status code. Some ``RLMAppError`` codes -/// include this, most notably ``RLMAppErrorHttpRequestFailed``. -extern NSString * const RLMHTTPStatusCodeKey; - -/// A user info key containing a `RLMCompensatingWriteInfo` which includes -/// further details about what was reverted by the server. -extern NSString *const RLMCompensatingWriteInfoKey; - -/** - `RLMError` is an enumeration representing all recoverable errors. It is - associated with the Realm error domain specified in `RLMErrorDomain`. - */ -typedef RLM_ERROR_ENUM(NSInteger, RLMError, RLMErrorDomain) { - /** Denotes a general error that occurred when trying to open a Realm. */ - RLMErrorFail = 1, - - /** Denotes a file I/O error that occurred when trying to open a Realm. */ - RLMErrorFileAccess = 2, - - /** - Denotes a file permission error that occurred when trying to open a Realm. - - This error can occur if the user does not have permission to open or create - the specified file in the specified access mode when opening a Realm. - */ - RLMErrorFilePermissionDenied = 3, - - /** - Denotes an error where a file was to be written to disk, but another - file with the same name already exists. - */ - RLMErrorFileExists = 4, - - /** - Denotes an error that occurs if a file could not be found. - - This error may occur if a Realm file could not be found on disk when - trying to open a Realm as read-only, or if the directory part of the - specified path was not found when trying to write a copy. - */ - RLMErrorFileNotFound = 5, - - /** - Denotes an error that occurs if a file format upgrade is required to open - the file, but upgrades were explicitly disabled or the file is being open - in read-only mode. - */ - RLMErrorFileFormatUpgradeRequired = 6, - - /** - Denotes an error that occurs if the database file is currently open in - another process which cannot share with the current process due to an - architecture mismatch. - - This error may occur if trying to share a Realm file between an i386 - (32-bit) iOS Simulator and the Realm Studio application. In this case, - please use the 64-bit version of the iOS Simulator. - */ - RLMErrorIncompatibleLockFile = 8, - - /** - Denotes an error that occurs when there is insufficient available address - space to mmap the Realm file. - */ - RLMErrorAddressSpaceExhausted = 9, - - /** - Denotes an error that occurs if there is a schema version mismatch and a - migration is required. - */ - RLMErrorSchemaMismatch = 10, - - /** - Denotes an error where an operation was requested which cannot be - performed on an open file. - */ - RLMErrorAlreadyOpen = 12, - - /// Denotes an error where an input value was invalid. - RLMErrorInvalidInput = 13, - - /// Denotes an error where a write failed due to insufficient disk space. - RLMErrorOutOfDiskSpace = 14, - - /** - Denotes an error where a Realm file could not be opened because another - process has opened the same file in a way incompatible with inter-process - sharing. For example, this can result from opening the backing file for an - in-memory Realm in non-in-memory mode. - */ - RLMErrorIncompatibleSession = 15, - - /** - Denotes an error that occurs if the file is a valid Realm file, but has a - file format version which is not supported by this version of Realm. This - typically means that the file was written by a newer version of Realm, but - may also mean that it is from a pre-1.0 version of Realm (or for - synchronized files, pre-10.0). - */ - RLMErrorUnsupportedFileFormatVersion = 16, - - /** - Denotes an error that occurs if a synchronized Realm is opened in more - than one process at once. - */ - RLMErrorMultipleSyncAgents = 17, - - /// A subscription was rejected by the server. - RLMErrorSubscriptionFailed = 18, - - /// A file operation failed in a way which does not have a more specific error code. - RLMErrorFileOperationFailed = 19, - - /** - Denotes an error that occurs if the file being opened is not a valid Realm - file. Some of the possible causes of this are: - 1. The file at the given URL simply isn't a Realm file at all. - 2. The wrong encryption key was given. - 3. The Realm file is encrypted and no encryption key was given. - 4. The Realm file isn't encrypted but an encryption key was given. - 5. The file on disk has become corrupted. - */ - RLMErrorInvalidDatabase = 20, - - /** - Denotes an error that occurs if a Realm is opened in the wrong history - mode. Typically this means that either a local Realm is being opened as a - synchronized Realm or vice versa. - */ - RLMErrorIncompatibleHistories = 21, - - /** - Denotes an error that occurs if objects were written to a flexible sync - Realm without any active subscriptions for that object type. All objects - created in flexible sync Realms must match at least one active - subscription or the server will reject the write. - */ - RLMErrorNoSubscriptionForWrite = 22, -}; - -#pragma mark - RLMSyncError - -/// A user info key for use with `RLMSyncErrorClientResetError`. -extern NSString *const kRLMSyncPathOfRealmBackupCopyKey; - -/// A user info key for use with certain error types. -extern NSString *const kRLMSyncErrorActionTokenKey; - -/** - An error related to a problem that might be reported by the synchronization manager - error handler, or a callback on a sync-related API that performs asynchronous work. - */ -typedef RLM_ERROR_ENUM(NSInteger, RLMSyncError, RLMSyncErrorDomain) { - /// An error that indicates a problem with the session (a specific Realm opened for sync). - RLMSyncErrorClientSessionError = 4, - - /// An error that indicates a problem with a specific user. - RLMSyncErrorClientUserError = 5, - - /** - An error that indicates an internal, unrecoverable problem - with the underlying synchronization engine. - */ - RLMSyncErrorClientInternalError = 6, - - /** - An error that indicates the Realm needs to be reset. - - A synced Realm may need to be reset because Atlas App Services encountered an - error and had to be restored from a backup. If the backup copy of the remote Realm - is of an earlier version than the local copy of the Realm, the server will ask the - client to reset the Realm. - - The reset process is as follows: the local copy of the Realm is copied into a recovery - directory for safekeeping, and then deleted from the original location. The next time - the Realm for that partition value is opened, the Realm will automatically be re-downloaded from - Atlas App Services, and can be used as normal. - - Data written to the Realm after the local copy of the Realm diverged from the backup - remote copy will be present in the local recovery copy of the Realm file. The - re-downloaded Realm will initially contain only the data present at the time the Realm - was backed up on the server. - - The client reset process can be initiated in one of two ways. - - The `userInfo` dictionary contains an opaque token object under the key - `kRLMSyncErrorActionTokenKey`. This token can be passed into - `+[RLMSyncSession immediatelyHandleError:]` in order to immediately perform the client - reset process. This should only be done after your app closes and invalidates every - instance of the offending Realm on all threads (note that autorelease pools may make this - difficult to guarantee). - - If `+[RLMSyncSession immediatelyHandleError:]` is not called, the client reset process - will be automatically carried out the next time the app is launched and the - `RLMSyncManager` is accessed. - - The value for the `kRLMSyncPathOfRealmBackupCopyKey` key in the `userInfo` dictionary - describes the path of the recovered copy of the Realm. This copy will not actually be - created until the client reset process is initiated. - - @see `-[NSError rlmSync_errorActionToken]`, `-[NSError rlmSync_clientResetBackedUpRealmPath]` - */ - RLMSyncErrorClientResetError = 7, - - /// :nodoc: - RLMSyncErrorUnderlyingAuthError = 8, - - /** - An error that indicates the user does not have permission to perform an operation - upon a synced Realm. For example, a user may receive this error if they attempt to - open a Realm they do not have at least read access to, or write to a Realm they only - have read access to. - - This error may also occur if a user incorrectly opens a Realm they have read-only - permissions to without using the `asyncOpen()` APIs. - - A Realm that suffers a permission denied error is, by default, flagged so that its - local copy will be deleted the next time the application starts. - - The `userInfo` dictionary contains an opaque token object under the key - `kRLMSyncErrorActionTokenKey`. This token can be passed into - `+[RLMSyncSession immediatelyHandleError:]` in order to immediately delete the local - copy. This should only be done after your app closes and invalidates every instance - of the offending Realm on all threads (note that autorelease pools may make this - difficult to guarantee). - - @warning It is strongly recommended that, if a Realm has encountered a permission denied - error, its files be deleted before attempting to re-open it. - - @see `-[NSError rlmSync_errorActionToken]` - */ - RLMSyncErrorPermissionDeniedError = 9, - - /** - An error that indicates that the server has rejected the requested flexible sync subscriptions. - */ - RLMSyncErrorInvalidFlexibleSyncSubscriptions = 10, - - /** - An error that indicates that the server has reverted a write made by this - client. This can happen due to not having write permission, or because an - object was created in a flexible sync Realm which does not match any - active subscriptions. - - This error is informational and does not require any explicit handling. - */ - RLMSyncErrorWriteRejected = 11, - - /** - A connection error without a more specific error code occurred. - - Realm internally handles retrying connections with appropriate backoffs, - so connection errors are normally logged and not reported to the error - handler. The exception is if - ``RLMSyncConfiguration.cancelAsyncOpenOnNonFatalErrors`` is set to `true`, - in which case async opens will be canceled on connection failures and the - error will be reported to the completion handler. - - Note that connection timeouts are reported as - (errorDomain: NSPosixErrorDomain, error: ETIMEDOUT) - and not as one of these error codes. - */ - RLMSyncErrorConnectionFailed = 12, - - /** - Connecting to the server failed due to a TLS issue such as an invalid certificate. - */ - RLMSyncErrorTLSHandshakeFailed = 13, -}; - -#pragma mark - RLMSyncAuthError - -// NEXT-MAJOR: This was a ROS thing and should have been removed in v10 -/// :nodoc: -typedef RLM_ERROR_ENUM(NSInteger, RLMSyncAuthError, RLMSyncAuthErrorDomain) { - RLMSyncAuthErrorBadResponse = 1, - RLMSyncAuthErrorBadRemoteRealmPath = 2, - RLMSyncAuthErrorHTTPStatusCodeError = 3, - RLMSyncAuthErrorClientSessionError = 4, - RLMSyncAuthErrorInvalidParameters = 601, - RLMSyncAuthErrorMissingPath = 602, - RLMSyncAuthErrorInvalidCredential = 611, - RLMSyncAuthErrorUserDoesNotExist = 612, - RLMSyncAuthErrorUserAlreadyExists = 613, - RLMSyncAuthErrorAccessDeniedOrInvalidPath = 614, - RLMSyncAuthErrorInvalidAccessToken = 615, - RLMSyncAuthErrorFileCannotBeShared = 703, -} __attribute__((deprecated("Errors of this type are no longer reported"))); - -#pragma mark - RLMSyncAppError - -/// An error which occurred when making a request to Atlas App Services. -typedef RLM_ERROR_ENUM(NSInteger, RLMAppError, RLMAppErrorDomain) { - /// An unknown error has occurred - RLMAppErrorUnknown = -1, - - /// A HTTP request completed with an error status code. The failing status - /// code can be found in the ``RLMHTTPStatusCodeKey`` key of the userInfo - /// dictionary. - RLMAppErrorHttpRequestFailed = 1, - - /// A user's session is in an invalid state. Logging out and back in may rectify this. - RLMAppErrorInvalidSession, - /// A request sent to the server was malformed in some way. - RLMAppErrorBadRequest, - /// A request was made using a nonexistent user. - RLMAppErrorUserNotFound, - /// A request was made against an App using a User which does not belong to that App. - RLMAppErrorUserAppDomainMismatch, - /// The auth provider has limited the domain names which can be used for email addresses, and the given one is not allowed. - RLMAppErrorDomainNotAllowed, - /// The request body size exceeded a server-configured limit. - RLMAppErrorReadSizeLimitExceeded, - /// A request had an invalid parameter. - RLMAppErrorInvalidParameter, - /// A request was missing a required parameter. - RLMAppErrorMissingParameter, - /// Executing the requested server function failed with an error. - RLMAppErrorFunctionExecutionError, - /// The server encountered an internal error. - RLMAppErrorInternalServerError, - /// Authentication failed due to the request auth provider not existing. - RLMAppErrorAuthProviderNotFound, - /// The requested value does not exist. - RLMAppErrorValueNotFound, - /// The value being created already exists. - RLMAppErrorValueAlreadyExists, - /// A value with the same name as the value being created already exists. - RLMAppErrorValueDuplicateName, - /// The called server function does not exist. - RLMAppErrorFunctionNotFound, - /// The called server function has a syntax error. - RLMAppErrorFunctionSyntaxError, - /// The called server function is invalid in some way. - RLMAppErrorFunctionInvalid, - /// Registering an API key with the auth provider failed due to it already existing. - RLMAppErrorAPIKeyAlreadyExists, - /// The operation failed due to exceeding the server-configured time limit. - RLMAppErrorExecutionTimeLimitExceeded, - /// The body of the called function does not define a callable thing. - RLMAppErrorNotCallable, - /// Email confirmation failed for a user because the user has already confirmed their email. - RLMAppErrorUserAlreadyConfirmed, - /// The user cannot be used because it has been disabled. - RLMAppErrorUserDisabled, - /// An auth error occurred which does not have a more specific error code. - RLMAppErrorAuthError, - /// Account registration failed due to the user name already being taken. - RLMAppErrorAccountNameInUse, - /// A login request failed due to an invalid password. - RLMAppErrorInvalidPassword, - /// Operation failed due to server-side maintenance. - RLMAppErrorMaintenanceInProgress, - /// Operation failed due to an error reported by MongoDB. - RLMAppErrorMongoDBError, -}; - -/// Extended information about a write which was rejected by the server. -/// -/// The server will sometimes reject writes made by the client for reasons such -/// as permissions, additional server-side validation failing, or because the -/// object didn't match any flexible sync subscriptions. When this happens, a -/// ``RLMSyncErrorWriteRejected`` error is reported which contains an array of -/// `RLMCompensatingWriteInfo` objects in the ``RLMCompensatingWriteInfoKey`` -/// userInfo key with information about what writes were rejected and why. -/// -/// This information is intended for debugging and logging purposes only. The -/// `reason` strings are generated by the server and are not guaranteed to be -/// stable, so attempting to programmatically do anything with them will break -/// without warning. -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMCompensatingWriteInfo : NSObject -/// The class name of the object being written to. -@property (nonatomic, readonly) NSString *objectType; -/// The primary key of the object being written to. -@property (nonatomic, readonly) id primaryKey NS_REFINED_FOR_SWIFT; -/// A human-readable string describing why the write was rejected. -@property (nonatomic, readonly) NSString *reason; -@end diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMFindOneAndModifyOptions.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMFindOneAndModifyOptions.h deleted file mode 100644 index 3cce99f23..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMFindOneAndModifyOptions.h +++ /dev/null @@ -1,80 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) -@protocol RLMBSON; -@class RLMSortDescriptor; - -/// Options to use when executing a `findOneAndUpdate`, `findOneAndReplace`, -/// or `findOneAndDelete` command on a `RLMMongoCollection`. -@interface RLMFindOneAndModifyOptions : NSObject - -/// Limits the fields to return for all matching documents. -@property (nonatomic, nullable) id projection NS_REFINED_FOR_SWIFT; - -/// The order in which to return matching documents. -@property (nonatomic, nullable) id sort NS_REFINED_FOR_SWIFT -__attribute__((deprecated("Use `sorting` instead, which correctly sort more than one sort attribute", "sorting"))); - -/// The order in which to return matching documents. -@property (nonatomic) NSArray> *sorting NS_REFINED_FOR_SWIFT; - - -/// Whether or not to perform an upsert, default is false -/// (only available for find_one_and_replace and find_one_and_update) -@property (nonatomic) BOOL upsert; - -/// When true then the new document is returned, -/// Otherwise the old document is returned (default) -/// (only available for findOneAndReplace and findOneAndUpdate) -@property (nonatomic) BOOL shouldReturnNewDocument; - -/// Options to use when executing a `findOneAndUpdate`, `findOneAndReplace`, -/// or `findOneAndDelete` command on a `RLMMongoCollection`. -/// @param projection Limits the fields to return for all matching documents. -/// @param sort The order in which to return matching documents. -/// @param upsert Whether or not to perform an upsert, default is false -/// (only available for findOneAndReplace and findOneAndUpdate) -/// @param shouldReturnNewDocument When true then the new document is returned, -/// Otherwise the old document is returned (default), -/// (only available for findOneAndReplace and findOneAndUpdate) -- (instancetype)initWithProjection:(id _Nullable)projection - sort:(id _Nullable)sort - upsert:(BOOL)upsert - shouldReturnNewDocument:(BOOL)shouldReturnNewDocument -__attribute__((deprecated("Please use `initWithProjection:sorting:upsert:shouldReturnNewDocument:`"))) - NS_SWIFT_UNAVAILABLE("Please see FindOneAndModifyOptions"); - -/// Options to use when executing a `findOneAndUpdate`, `findOneAndReplace`, -/// or `findOneAndDelete` command on a `RLMMongoCollection`. -/// @param projection Limits the fields to return for all matching documents. -/// @param sorting The order in which to return matching documents. -/// @param upsert Whether or not to perform an upsert, default is false -/// (only available for findOneAndReplace and findOneAndUpdate) -/// @param shouldReturnNewDocument When true then the new document is returned, -/// Otherwise the old document is returned (default), -/// (only available for findOneAndReplace and findOneAndUpdate) -- (instancetype)initWithProjection:(id _Nullable)projection - sorting:(NSArray> *)sorting - upsert:(BOOL)upsert - shouldReturnNewDocument:(BOOL)shouldReturnNewDocument; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMFindOptions.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMFindOptions.h deleted file mode 100644 index 043a85374..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMFindOptions.h +++ /dev/null @@ -1,77 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@protocol RLMBSON; - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -@interface RLMFindOptions : NSObject - -/// The maximum number of documents to return. Specifying 0 will return all documents. -@property (nonatomic) NSInteger limit; - -/// Limits the fields to return for all matching documents. -@property (nonatomic, nullable) id projection NS_REFINED_FOR_SWIFT; - -/// The order in which to return matching documents. -@property (nonatomic, nullable) id sort NS_REFINED_FOR_SWIFT -__attribute__((deprecated("Use `sorting` instead, which correctly sort more than one sort attribute", "sorting"))); - -/// The order in which to return matching documents. -@property (nonatomic) NSArray> *sorting NS_REFINED_FOR_SWIFT; - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -/// @param limit The maximum number of documents to return. Specifying 0 will return all documents. -/// @param projection Limits the fields to return for all matching documents. -/// @param sort The order in which to return matching documents. -- (instancetype)initWithLimit:(NSInteger)limit - projection:(id _Nullable)projection - sort:(id _Nullable)sort -__attribute__((deprecated("Please use `initWithLimit:projection:sorting:`"))) - NS_SWIFT_UNAVAILABLE("Please see FindOption"); - - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -/// @param projection Limits the fields to return for all matching documents. -/// @param sort The order in which to return matching documents. -- (instancetype)initWithProjection:(id _Nullable)projection - sort:(id _Nullable)sort __deprecated -__attribute__((deprecated("Please use `initWithProjection:sorting:`"))) - NS_SWIFT_UNAVAILABLE("Please see FindOption"); - - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -/// @param limit The maximum number of documents to return. Specifying 0 will return all documents. -/// @param projection Limits the fields to return for all matching documents. -/// @param sorting The order in which to return matching documents. -- (instancetype)initWithLimit:(NSInteger)limit - projection:(id _Nullable)projection - sorting:(NSArray> *)sorting; - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -/// @param projection Limits the fields to return for all matching documents. -/// @param sorting The order in which to return matching documents. -- (instancetype)initWithProjection:(id _Nullable)projection - sorting:(NSArray> *)sorting; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMLogger.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMLogger.h deleted file mode 100644 index 96ab91967..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMLogger.h +++ /dev/null @@ -1,99 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -/// An enum representing different levels of sync-related logging that can be configured. -typedef RLM_CLOSED_ENUM(NSUInteger, RLMLogLevel) { - /// Nothing will ever be logged. - RLMLogLevelOff, - /// Only fatal errors will be logged. - RLMLogLevelFatal, - /// Only errors will be logged. - RLMLogLevelError, - /// Warnings and errors will be logged. - RLMLogLevelWarn, - /// Information about sync events will be logged. Fewer events will be logged in order to avoid overhead. - RLMLogLevelInfo, - /// Information about sync events will be logged. More events will be logged than with `RLMLogLevelInfo`. - RLMLogLevelDetail, - /// Log information that can aid in debugging. - /// - /// - warning: Will incur a measurable performance impact. - RLMLogLevelDebug, - /// Log information that can aid in debugging. More events will be logged than with `RLMLogLevelDebug`. - /// - /// - warning: Will incur a measurable performance impact. - RLMLogLevelTrace, - /// Log information that can aid in debugging. More events will be logged than with `RLMLogLevelTrace`. - /// - /// - warning: Will incur a measurable performance impact. - RLMLogLevelAll -} NS_SWIFT_NAME(LogLevel); - -/// A log callback function which can be set on RLMLogger. -/// -/// The log function may be called from multiple threads simultaneously, and is -/// responsible for performing its own synchronization if any is required. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void (^RLMLogFunction)(RLMLogLevel level, NSString *message); - -/** - `RLMLogger` is used for creating your own custom logging logic. - - You can define your own logger creating an instance of `RLMLogger` and define the log function which will be - invoked whenever there is a log message. - Set this custom logger as you default logger using `setDefaultLogger`. - - RLMLogger.defaultLogger = [[RLMLogger alloc] initWithLevel:RLMLogLevelDebug - logFunction:^(RLMLogLevel level, NSString * message) { - NSLog(@"Realm Log - %lu, %@", (unsigned long)level, message); - }]; - - @note By default default log threshold level is `RLMLogLevelInfo`, and logging strings are output to Apple System Logger. -*/ -@interface RLMLogger : NSObject - -/** - Gets the logging threshold level used by the logger. - */ -@property (nonatomic) RLMLogLevel level; - -/// :nodoc: -- (instancetype)init NS_UNAVAILABLE; - -/** - Creates a logger with the associated log level and the logic function to define your own logging logic. - - @param level The log level to be set for the logger. - @param logFunction The log function which will be invoked whenever there is a log message. -*/ -- (instancetype)initWithLevel:(RLMLogLevel)level logFunction:(RLMLogFunction)logFunction; - -#pragma mark RLMLogger Default Logger API - -/** - The current default logger. When setting a logger as default, this logger will be used whenever information must be logged. - */ -@property (class) RLMLogger *defaultLogger NS_SWIFT_NAME(shared); - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMMigration.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMMigration.h deleted file mode 100644 index 4a6652a19..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMMigration.h +++ /dev/null @@ -1,129 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMSchema; -@class RLMArray; -@class RLMObject; - -/** - A block type which provides both the old and new versions of an object in the Realm. Object - properties can only be accessed using keyed subscripting. - - @see `-[RLMMigration enumerateObjects:block:]` - - @param oldObject The object from the original Realm (read-only). - @param newObject The object from the migrated Realm (read-write). -*/ -typedef void (^RLMObjectMigrationBlock)(RLMObject * __nullable oldObject, RLMObject * __nullable newObject); - -/** - `RLMMigration` instances encapsulate information intended to facilitate a schema migration. - - A `RLMMigration` instance is passed into a user-defined `RLMMigrationBlock` block when updating - the version of a Realm. This instance provides access to the old and new database schemas, the - objects in the Realm, and provides functionality for modifying the Realm during the migration. - */ -@interface RLMMigration : NSObject - -#pragma mark - Properties - -/** - Returns the old `RLMSchema`. This is the schema which describes the Realm before the - migration is applied. - */ -@property (nonatomic, readonly) RLMSchema *oldSchema NS_REFINED_FOR_SWIFT; - -/** - Returns the new `RLMSchema`. This is the schema which describes the Realm after the - migration is applied. - */ -@property (nonatomic, readonly) RLMSchema *newSchema NS_REFINED_FOR_SWIFT; - - -#pragma mark - Altering Objects during a Migration - -/** - Enumerates all the objects of a given type in the Realm, providing both the old and new versions - of each object. Within the block, object properties can only be accessed using keyed subscripting. - - @param className The name of the `RLMObject` class to enumerate. - - @warning All objects returned are of a type specific to the current migration and should not be cast - to `className`. Instead, treat them as `RLMObject`s and use keyed subscripting to access - properties. - */ -- (void)enumerateObjects:(NSString *)className - block:(__attribute__((noescape)) RLMObjectMigrationBlock)block NS_REFINED_FOR_SWIFT; - -/** - Creates and returns an `RLMObject` instance of type `className` in the Realm being migrated. - - The `value` argument is used to populate the object. It can be a key-value coding compliant object, an array or - dictionary returned from the methods in `NSJSONSerialization`, or an array containing one element for each managed - property. An exception will be thrown if any required properties are not present and those properties were not defined - with default values. - - When passing in an `NSArray` as the `value` argument, all properties must be present, valid and in the same order as - the properties defined in the model. - - @param className The name of the `RLMObject` class to create. - @param value The value used to populate the object. - */ -- (RLMObject *)createObject:(NSString *)className withValue:(id)value NS_REFINED_FOR_SWIFT; - -/** - Deletes an object from a Realm during a migration. - - It is permitted to call this method from within the block passed to `-[enumerateObjects:block:]`. - - @param object Object to be deleted from the Realm being migrated. - */ -- (void)deleteObject:(RLMObject *)object NS_REFINED_FOR_SWIFT; - -/** - Deletes the data for the class with the given name. - - All objects of the given class will be deleted. If the `RLMObject` subclass no longer exists in your program, - any remaining metadata for the class will be removed from the Realm file. - - @param name The name of the `RLMObject` class to delete. - - @return A Boolean value indicating whether there was any data to delete. - */ -- (BOOL)deleteDataForClassName:(NSString *)name NS_REFINED_FOR_SWIFT; - -/** - Renames a property of the given class from `oldName` to `newName`. - - @param className The name of the class whose property should be renamed. This class must be present - in both the old and new Realm schemas. - @param oldName The old persisted property name for the property to be renamed. There must not be a property with this name in the - class as defined by the new Realm schema. - @param newName The new persisted property name for the property to be renamed. There must not be a property with this name in the - class as defined by the old Realm schema. - */ -- (void)renamePropertyForClass:(NSString *)className oldName:(NSString *)oldName - newName:(NSString *)newName NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMMongoClient.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMMongoClient.h deleted file mode 100644 index 50a1c226d..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMMongoClient.h +++ /dev/null @@ -1,47 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMApp; - -/// The `RLMMongoClient` enables reading and writing on a MongoDB database via the Realm Cloud service. -/// -/// It provides access to instances of `RLMMongoDatabase`, which in turn provide access to specific -/// `RLMMongoCollection`s that hold your data. -/// -/// - Note: -/// Before you can read or write data, a user must log in. -/// -/// - SeeAlso: -/// `RLMApp`, `RLMMongoDatabase`, `RLMMongoCollection` -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMMongoClient : NSObject - -/// The name of the client -@property (nonatomic, readonly) NSString *name; - -/// Gets a `RLMMongoDatabase` instance for the given database name. -/// @param name the name of the database to retrieve -- (RLMMongoDatabase *)databaseWithName:(NSString *)name NS_SWIFT_NAME(database(named:)); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMMongoCollection.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMMongoCollection.h deleted file mode 100644 index 0feae60ac..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMMongoCollection.h +++ /dev/null @@ -1,330 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) -@protocol RLMBSON; - -@class RLMFindOptions, RLMFindOneAndModifyOptions, RLMUpdateResult, RLMChangeStream, RLMObjectId; - -/// Delegate which is used for subscribing to changes on a `[RLMMongoCollection watch]` stream. -@protocol RLMChangeEventDelegate -/// The stream was opened. -/// @param changeStream The RLMChangeStream subscribing to the stream changes. -- (void)changeStreamDidOpen:(RLMChangeStream *)changeStream; -/// The stream has been closed. -/// @param error If an error occured when closing the stream, an error will be passed. -- (void)changeStreamDidCloseWithError:(nullable NSError *)error; -/// A error has occured while streaming. -/// @param error The streaming error. -- (void)changeStreamDidReceiveError:(NSError *)error; -/// Invoked when a change event has been received. -/// @param changeEvent The change event in BSON format. -- (void)changeStreamDidReceiveChangeEvent:(id)changeEvent; -@end - -/// Acts as a middleman and processes events with WatchStream -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMChangeStream : NSObject -/// Stops a watch streaming session. -- (void)close; -/// :nodoc: -- (instancetype)init NS_UNAVAILABLE; -@end - -/// The `RLMMongoCollection` represents a MongoDB collection. -/// -/// You can get an instance from a `RLMMongoDatabase`. -/// -/// Create, read, update, and delete methods are available. -/// -/// Operations against the Realm Cloud server are performed asynchronously. -/// -/// - Note: -/// Before you can read or write data, a user must log in. -/// - Usage: -/// RLMMongoClient *client = [self.app mongoClient:@"mongodb1"]; -/// RLMMongoDatabase *database = [client databaseWithName:@"test_data"]; -/// RLMMongoCollection *collection = [database collectionWithName:@"Dog"]; -/// [collection insertOneDocument:@{@"name": @"fido", @"breed": @"cane corso"} completion:...]; -/// -/// - SeeAlso: -/// `RLMMongoClient`, `RLMMongoDatabase` -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMMongoCollection : NSObject -/// Block which returns an object id on a successful insert, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoInsertBlock)(id _Nullable, NSError * _Nullable); -/// Block which returns an array of object ids on a successful insertMany, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoInsertManyBlock)(NSArray> * _Nullable, NSError * _Nullable); -/// Block which returns an array of Documents on a successful find operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoFindBlock)(NSArray> *> * _Nullable, - NSError * _Nullable); -/// Block which returns a Document on a successful findOne operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoFindOneBlock)(NSDictionary> * _Nullable_result, - NSError * _Nullable); -/// Block which returns the number of Documents in a collection on a successful count operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoCountBlock)(NSInteger, NSError * _Nullable); -/// Block which returns an RLMUpdateResult on a successful update operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoUpdateBlock)(RLMUpdateResult * _Nullable, NSError * _Nullable); -/// Block which returns the deleted Document on a successful delete operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoDeleteBlock)(NSDictionary> * _Nullable_result, - NSError * _Nullable); - -/// The name of this mongodb collection. -@property (nonatomic, readonly) NSString *name; - -/// Encodes the provided value to BSON and inserts it. If the value is missing an identifier, one will be -/// generated for it. -/// @param document A `Document` value to insert. -/// @param completion The result of attempting to perform the insert. An Id will be returned for the inserted object on sucess -- (void)insertOneDocument:(NSDictionary> *)document - completion:(RLMMongoInsertBlock)completion NS_REFINED_FOR_SWIFT; - -/// Encodes the provided values to BSON and inserts them. If any values are missing identifiers, -/// they will be generated. -/// @param documents The `Document` values in a bson array to insert. -/// @param completion The result of the insert, returns an array inserted document ids in order -- (void)insertManyDocuments:(NSArray> *> *)documents - completion:(RLMMongoInsertManyBlock)completion NS_REFINED_FOR_SWIFT; - -/// Finds the documents in this collection which match the provided filter. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param options `RLMFindOptions` to use when executing the command. -/// @param completion The resulting bson array of documents or error if one occurs -- (void)findWhere:(NSDictionary> *)filterDocument - options:(RLMFindOptions *)options - completion:(RLMMongoFindBlock)completion NS_REFINED_FOR_SWIFT; - -/// Finds the documents in this collection which match the provided filter. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param completion The resulting bson array as a string or error if one occurs -- (void)findWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoFindBlock)completion NS_REFINED_FOR_SWIFT; - -/// Returns one document from a collection or view which matches the -/// provided filter. If multiple documents satisfy the query, this method -/// returns the first document according to the query's sort order or natural -/// order. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param options `RLMFindOptions` to use when executing the command. -/// @param completion The resulting bson or error if one occurs -- (void)findOneDocumentWhere:(NSDictionary> *)filterDocument - options:(RLMFindOptions *)options - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Returns one document from a collection or view which matches the -/// provided filter. If multiple documents satisfy the query, this method -/// returns the first document according to the query's sort order or natural -/// order. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param completion The resulting bson or error if one occurs -- (void)findOneDocumentWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Runs an aggregation framework pipeline against this collection. -/// @param pipeline A bson array made up of `Documents` containing the pipeline of aggregation operations to perform. -/// @param completion The resulting bson array of documents or error if one occurs -- (void)aggregateWithPipeline:(NSArray> *> *)pipeline - completion:(RLMMongoFindBlock)completion NS_REFINED_FOR_SWIFT; - -/// Counts the number of documents in this collection matching the provided filter. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param limit The max amount of documents to count -/// @param completion Returns the count of the documents that matched the filter. -- (void)countWhere:(NSDictionary> *)filterDocument - limit:(NSInteger)limit - completion:(RLMMongoCountBlock)completion NS_REFINED_FOR_SWIFT; - -/// Counts the number of documents in this collection matching the provided filter. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param completion Returns the count of the documents that matched the filter. -- (void)countWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoCountBlock)completion NS_REFINED_FOR_SWIFT; - -/// Deletes a single matching document from the collection. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param completion The result of performing the deletion. Returns the count of deleted objects -- (void)deleteOneDocumentWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoCountBlock)completion NS_REFINED_FOR_SWIFT; - -/// Deletes multiple documents -/// @param filterDocument Document representing the match criteria -/// @param completion The result of performing the deletion. Returns the count of the deletion -- (void)deleteManyDocumentsWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoCountBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates a single document matching the provided filter in this collection. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param upsert When true, creates a new document if no document matches the query. -/// @param completion The result of the attempt to update a document. -- (void)updateOneDocumentWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - upsert:(BOOL)upsert - completion:(RLMMongoUpdateBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates a single document matching the provided filter in this collection. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param completion The result of the attempt to update a document. -- (void)updateOneDocumentWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - completion:(RLMMongoUpdateBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates multiple documents matching the provided filter in this collection. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param upsert When true, creates a new document if no document matches the query. -/// @param completion The result of the attempt to update a document. -- (void)updateManyDocumentsWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - upsert:(BOOL)upsert - completion:(RLMMongoUpdateBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates multiple documents matching the provided filter in this collection. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param completion The result of the attempt to update a document. -- (void)updateManyDocumentsWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - completion:(RLMMongoUpdateBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates a single document in a collection based on a query filter and -/// returns the document in either its pre-update or post-update form. Unlike -/// `updateOneDocument`, this action allows you to atomically find, update, and -/// return a document with the same command. This avoids the risk of other -/// update operations changing the document between separate find and update -/// operations. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param options `RemoteFindOneAndModifyOptions` to use when executing the command. -/// @param completion The result of the attempt to update a document. -- (void)findOneAndUpdateWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - options:(RLMFindOneAndModifyOptions *)options - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates a single document in a collection based on a query filter and -/// returns the document in either its pre-update or post-update form. Unlike -/// `updateOneDocument`, this action allows you to atomically find, update, and -/// return a document with the same command. This avoids the risk of other -/// update operations changing the document between separate find and update -/// operations. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param completion The result of the attempt to update a document. -- (void)findOneAndUpdateWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Overwrites a single document in a collection based on a query filter and -/// returns the document in either its pre-replacement or post-replacement -/// form. Unlike `updateOneDocument`, this action allows you to atomically find, -/// replace, and return a document with the same command. This avoids the -/// risk of other update operations changing the document between separate -/// find and update operations. -/// @param filterDocument A `Document` that should match the query. -/// @param replacementDocument A `Document` describing the replacement. -/// @param options `RLMFindOneAndModifyOptions` to use when executing the command. -/// @param completion The result of the attempt to replace a document. -- (void)findOneAndReplaceWhere:(NSDictionary> *)filterDocument - replacementDocument:(NSDictionary> *)replacementDocument - options:(RLMFindOneAndModifyOptions *)options - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Overwrites a single document in a collection based on a query filter and -/// returns the document in either its pre-replacement or post-replacement -/// form. Unlike `updateOneDocument`, this action allows you to atomically find, -/// replace, and return a document with the same command. This avoids the -/// risk of other update operations changing the document between separate -/// find and update operations. -/// @param filterDocument A `Document` that should match the query. -/// @param replacementDocument A `Document` describing the update. -/// @param completion The result of the attempt to replace a document. -- (void)findOneAndReplaceWhere:(NSDictionary> *)filterDocument - replacementDocument:(NSDictionary> *)replacementDocument - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Removes a single document from a collection based on a query filter and -/// returns a document with the same form as the document immediately before -/// it was deleted. Unlike `deleteOneDocument`, this action allows you to atomically -/// find and delete a document with the same command. This avoids the risk of -/// other update operations changing the document between separate find and -/// delete operations. -/// @param filterDocument A `Document` that should match the query. -/// @param options `RLMFindOneAndModifyOptions` to use when executing the command. -/// @param completion The result of the attempt to delete a document. -- (void)findOneAndDeleteWhere:(NSDictionary> *)filterDocument - options:(RLMFindOneAndModifyOptions *)options - completion:(RLMMongoDeleteBlock)completion NS_REFINED_FOR_SWIFT; - -/// Removes a single document from a collection based on a query filter and -/// returns a document with the same form as the document immediately before -/// it was deleted. Unlike `deleteOneDocument`, this action allows you to atomically -/// find and delete a document with the same command. This avoids the risk of -/// other update operations changing the document between separate find and -/// delete operations. -/// @param filterDocument A `Document` that should match the query. -/// @param completion The result of the attempt to delete a document. -- (void)findOneAndDeleteWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoDeleteBlock)completion NS_REFINED_FOR_SWIFT; - -/// Opens a MongoDB change stream against the collection to watch for changes. The resulting stream will be notified -/// of all events on this collection that the active user is authorized to see based on the configured MongoDB -/// rules. -/// @param delegate The delegate that will react to events and errors from the resulting change stream. -/// @param queue Dispatches streaming events to an optional queue, if no queue is provided the main queue is used -- (RLMChangeStream *)watchWithDelegate:(id)delegate - delegateQueue:(nullable dispatch_queue_t)queue NS_REFINED_FOR_SWIFT; - -/// Opens a MongoDB change stream against the collection to watch for changes -/// made to specific documents. The documents to watch must be explicitly -/// specified by their _id. -/// @param filterIds The list of _ids in the collection to watch. -/// @param delegate The delegate that will react to events and errors from the resulting change stream. -/// @param queue Dispatches streaming events to an optional queue, if no queue is provided the main queue is used -- (RLMChangeStream *)watchWithFilterIds:(NSArray *)filterIds - delegate:(id)delegate - delegateQueue:(nullable dispatch_queue_t)queue NS_REFINED_FOR_SWIFT; - -/// Opens a MongoDB change stream against the collection to watch for changes. The provided BSON document will be -/// used as a match expression filter on the change events coming from the stream. -/// -/// See https://docs.mongodb.com/manual/reference/operator/aggregation/match/ for documentation around how to define -/// a match filter. -/// -/// Defining the match expression to filter ChangeEvents is similar to defining the match expression for triggers: -/// https://docs.mongodb.com/realm/triggers/database-triggers/ -/// @param matchFilter The $match filter to apply to incoming change events -/// @param delegate The delegate that will react to events and errors from the resulting change stream. -/// @param queue Dispatches streaming events to an optional queue, if no queue is provided the main queue is used -- (RLMChangeStream *)watchWithMatchFilter:(NSDictionary> *)matchFilter - delegate:(id)delegate - delegateQueue:(nullable dispatch_queue_t)queue NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMMongoDatabase.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMMongoDatabase.h deleted file mode 100644 index 177fbc1b8..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMMongoDatabase.h +++ /dev/null @@ -1,51 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMMongoCollection; - -/// The `RLMMongoDatabase` represents a MongoDB database, which holds a group -/// of collections that contain your data. -/// -/// It can be retrieved from the `RLMMongoClient`. -/// -/// Use it to get `RLMMongoCollection`s for reading and writing data. -/// -/// - Note: -/// Before you can read or write data, a user must log in`. -/// -/// - SeeAlso: -/// `RLMMongoClient`, `RLMMongoCollection` -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMMongoDatabase : NSObject - -/// The name of this database -@property (nonatomic, readonly) NSString *name; - -/// Gets a collection. -/// @param name The name of the collection to return -/// @returns The collection -- (RLMMongoCollection *)collectionWithName:(NSString *)name; -// NEXT-MAJOR: NS_SWIFT_NAME(collection(named:)) - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMNetworkTransport.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMNetworkTransport.h deleted file mode 100644 index 2884b4296..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMNetworkTransport.h +++ /dev/null @@ -1,132 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// Allowed HTTP methods to be used with `RLMNetworkTransport`. -typedef RLM_CLOSED_ENUM(int32_t, RLMHTTPMethod) { - /// GET is used to request data from a specified resource. - RLMHTTPMethodGET = 0, - /// POST is used to send data to a server to create/update a resource. - RLMHTTPMethodPOST = 1, - /// PATCH is used to send data to a server to update a resource. - RLMHTTPMethodPATCH = 2, - /// PUT is used to send data to a server to create/update a resource. - RLMHTTPMethodPUT = 3, - /// The DELETE method deletes the specified resource. - RLMHTTPMethodDELETE = 4 -}; - -/// An HTTP request that can be made to an arbitrary server. -@interface RLMRequest : NSObject - -/// The HTTP method of this request. -@property (nonatomic, assign) RLMHTTPMethod method; - -/// The URL to which this request will be made. -@property (nonatomic, strong) NSString *url; - -/// The number of milliseconds that the underlying transport should spend on an -/// HTTP round trip before failing with an error. -@property (nonatomic, assign) NSTimeInterval timeout; - -/// The HTTP headers of this request. -@property (nonatomic, strong) NSDictionary* headers; - -/// The body of the request. -@property (nonatomic, strong) NSString* body; - -@end - -/// The contents of an HTTP response. -@interface RLMResponse : NSObject - -/// The status code of the HTTP response. -@property (nonatomic, assign) NSInteger httpStatusCode; - -/// A custom status code provided by the SDK. -@property (nonatomic, assign) NSInteger customStatusCode; - -/// The headers of the HTTP response. -@property (nonatomic, strong) NSDictionary* headers; - -/// The body of the HTTP response. -@property (nonatomic, strong) NSString *body; - -@end - -/// Delegate which is used for subscribing to changes. -@protocol RLMEventDelegate -/// Invoked when a change event has been received. -/// @param event The change event encoded as NSData -- (void)didReceiveEvent:(NSData *)event; -/// A error has occurred while subscribing to changes. -/// @param error The error that has occurred. -- (void)didReceiveError:(NSError *)error; -/// The stream was opened. -- (void)didOpen; -/// The stream has been closed. -/// @param error The error that has occurred. -- (void)didCloseWithError:(NSError *_Nullable)error; -@end - -/// A block for receiving an `RLMResponse` from the `RLMNetworkTransport`. -RLM_SWIFT_SENDABLE // invoked on a backgroun thread -typedef void(^RLMNetworkTransportCompletionBlock)(RLMResponse *); - -/// Transporting protocol for foreign interfaces. Allows for custom -/// request/response handling. -RLM_SWIFT_SENDABLE // used from multiple threads so must be internally thread-safe -@protocol RLMNetworkTransport - -/** - Sends a request to a given endpoint. - - @param request The request to send. - @param completionBlock A callback invoked on completion of the request. -*/ -- (void)sendRequestToServer:(RLMRequest *)request - completion:(RLMNetworkTransportCompletionBlock)completionBlock; - -/// Starts an event stream request. -/// @param request The RLMRequest to start. -/// @param subscriber The RLMEventDelegate which will subscribe to changes from the server. -- (NSURLSession *)doStreamRequest:(RLMRequest *)request - eventSubscriber:(id)subscriber; - -@end - -/// Transporting protocol for foreign interfaces. Allows for custom -/// request/response handling. -RLM_SWIFT_SENDABLE // is internally thread-safe -@interface RLMNetworkTransport : NSObject - -/** - Sends a request to a given endpoint. - - @param request The request to send. - @param completionBlock A callback invoked on completion of the request. -*/ -- (void)sendRequestToServer:(RLMRequest *) request - completion:(RLMNetworkTransportCompletionBlock)completionBlock; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMObject.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMObject.h deleted file mode 100644 index 9bcfbe310..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMObject.h +++ /dev/null @@ -1,811 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMNotificationToken; -@class RLMObjectSchema; -@class RLMPropertyChange; -@class RLMPropertyDescriptor; -@class RLMRealm; -@class RLMResults; - -/** - `RLMObject` is a base class for model objects representing data stored in Realms. - - Define your model classes by subclassing `RLMObject` and adding properties to be managed. - Then instantiate and use your custom subclasses instead of using the `RLMObject` class directly. - - // Dog.h - @interface Dog : RLMObject - @property NSString *name; - @property BOOL adopted; - @end - - // Dog.m - @implementation Dog - @end //none needed - - ### Supported property types - - - `NSString` - - `NSInteger`, `int`, `long`, `float`, and `double` - - `BOOL` or `bool` - - `NSDate` - - `NSData` - - `NSNumber`, where `X` is one of `RLMInt`, `RLMFloat`, `RLMDouble` or `RLMBool`, for optional number properties - - `RLMObject` subclasses, to model many-to-one relationships. - - `RLMArray`, where `X` is an `RLMObject` subclass, to model many-to-many relationships. - - ### Querying - - You can initiate queries directly via the class methods: `allObjects`, `objectsWhere:`, and `objectsWithPredicate:`. - These methods allow you to easily query a custom subclass for instances of that class in the default Realm. - - To search in a Realm other than the default Realm, use the `allObjectsInRealm:`, `objectsInRealm:where:`, - and `objectsInRealm:withPredicate:` class methods. - - @see `RLMRealm` - - ### Relationships - - See our [Realm Swift Documentation](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/relationships/#relationships) for more details. - - ### Key-Value Observing - - All `RLMObject` properties (including properties you create in subclasses) are - [Key-Value Observing compliant](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/KeyValueObserving/KeyValueObserving.html), - except for `realm` and `objectSchema`. - - Keep the following tips in mind when observing Realm objects: - - 1. Unlike `NSMutableArray` properties, `RLMArray` properties do not require - using the proxy object returned from `-mutableArrayValueForKey:`, or defining - KVC mutation methods on the containing class. You can simply call methods on - the `RLMArray` directly; any changes will be automatically observed by the containing - object. - 2. Unmanaged `RLMObject` instances cannot be added to a Realm while they have any - observed properties. - 3. Modifying managed `RLMObject`s within `-observeValueForKeyPath:ofObject:change:context:` - is not recommended. Properties may change even when the Realm is not in a write - transaction (for example, when `-[RLMRealm refresh]` is called after changes - are made on a different thread), and notifications sent prior to the change - being applied (when `NSKeyValueObservingOptionPrior` is used) may be sent at - times when you *cannot* begin a write transaction. - */ - -@interface RLMObject : RLMObjectBase - -#pragma mark - Creating & Initializing Objects - -/** - Creates an unmanaged instance of a Realm object. - - Call `addObject:` on an `RLMRealm` instance to add an unmanaged object into that Realm. - - @see `[RLMRealm addObject:]` - */ -- (instancetype)init NS_DESIGNATED_INITIALIZER; - - -/** - Creates an unmanaged instance of a Realm object. - - Pass in an `NSArray` or `NSDictionary` instance to set the values of the object's properties. - - Call `addObject:` on an `RLMRealm` instance to add an unmanaged object into that Realm. - - @see `[RLMRealm addObject:]` - */ -- (instancetype)initWithValue:(id)value; - - -/** - Returns the class name for a Realm object subclass. - - @warning Do not override. Realm relies on this method returning the exact class - name. - - @return The class name for the model class. - */ -+ (NSString *)className; - -/** - Creates an instance of a Realm object with a given value, and adds it to the default Realm. - - If nested objects are included in the argument, `createInDefaultRealmWithValue:` will be recursively called - on them. - - The `value` argument can be a key-value coding compliant object, an array or dictionary returned from the methods in - `NSJSONSerialization`, or an array containing one element for each managed property. - - An exception will be thrown if any required properties are not present and those properties - were not defined with default values. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param value The value used to populate the object. - - @see `defaultPropertyValues` - */ -+ (instancetype)createInDefaultRealmWithValue:(id)value; - -/** - Creates an instance of a Realm object with a given value, and adds it to the specified Realm. - - If nested objects are included in the argument, `createInRealm:withValue:` will be recursively called - on them. - - The `value` argument can be a key-value coding compliant object, an array or dictionary returned from the methods in - `NSJSONSerialization`, or an array containing one element for each managed property. - - An exception will be thrown if any required properties are not present and those properties - were not defined with default values. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param realm The Realm which should manage the newly-created object. - @param value The value used to populate the object. - - @see `defaultPropertyValues` - */ -+ (instancetype)createInRealm:(RLMRealm *)realm withValue:(id)value; - -/** - Creates or updates a Realm object within the default Realm. - - This method may only be called on Realm object types with a primary key defined. If there is already - an object with the same primary key value in the default Realm, its values are updated and the object - is returned. Otherwise, this method creates and populates a new instance of the object in the default Realm. - - If nested objects are included in the argument, `createOrUpdateInDefaultRealmWithValue:` will be - recursively called on them if they have primary keys, `createInDefaultRealmWithValue:` if they do not. - - The `value` argument is used to populate the object. It can be a Realm object, a key-value coding - compliant object, an array or dictionary returned from the methods in `NSJSONSerialization`, or an - array containing one element for each managed property. - - If the object is being created, an exception will be thrown if any required properties - are not present and those properties were not defined with default values. - - If the `value` argument is a Realm object already managed by the default Realm, the - argument's type is the same as the receiver, and the objects have identical values for - their managed properties, this method does nothing. - - If the object is being updated, each property defined in its schema will be set by copying from - `value` using key-value coding. If the `value` argument does not respond to `valueForKey:` for a - given property name (or getter name, if defined), that value will remain untouched. - Nullable properties on the object can be set to nil by using `NSNull` as the updated value. - Each property is set even if the existing value is the same as the new value being set, and - notifications will report them all being changed. See `createOrUpdateModifiedInDefaultRealmWithValue:` - for a version of this function which only sets the values which have changed. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param value The value used to populate the object. - - @see `defaultPropertyValues`, `primaryKey` - */ -+ (instancetype)createOrUpdateInDefaultRealmWithValue:(id)value; - -/** - Creates or updates a Realm object within the default Realm. - - This method may only be called on Realm object types with a primary key defined. If there is already - an object with the same primary key value in the default Realm, its values are updated and the object - is returned. Otherwise, this method creates and populates a new instance of the object in the default Realm. - - If nested objects are included in the argument, `createOrUpdateModifiedInDefaultRealmWithValue:` will be - recursively called on them if they have primary keys, `createInDefaultRealmWithValue:` if they do not. - - The `value` argument is used to populate the object. It can be a Realm object, a key-value coding - compliant object, an array or dictionary returned from the methods in `NSJSONSerialization`, or an - array containing one element for each managed property. - - If the object is being created, an exception will be thrown if any required properties - are not present and those properties were not defined with default values. - - If the `value` argument is a Realm object already managed by the default Realm, the - argument's type is the same as the receiver, and the objects have identical values for - their managed properties, this method does nothing. - - If the object is being updated, each property defined in its schema will be set by copying from - `value` using key-value coding. If the `value` argument does not respond to `valueForKey:` for a - given property name (or getter name, if defined), that value will remain untouched. - Nullable properties on the object can be set to nil by using `NSNull` as the updated value. - Unlike `createOrUpdateInDefaultRealmWithValue:`, only properties which have changed in value are - set, and any change notifications produced by this call will report only which properies have - actually changed. - - Checking which properties have changed imposes a small amount of overhead, and so this method - may be slower when all or nearly all of the properties being set have changed. If most or all - of the properties being set have not changed, this method will be much faster than unconditionally - setting all of them, and will also reduce how much data has to be written to the Realm, saving - both i/o time and disk space. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param value The value used to populate the object. - - @see `defaultPropertyValues`, `primaryKey` - */ -+ (instancetype)createOrUpdateModifiedInDefaultRealmWithValue:(id)value; - -/** - Creates or updates an Realm object within a specified Realm. - - This method may only be called on Realm object types with a primary key defined. If there is already - an object with the same primary key value in the given Realm, its values are updated and the object - is returned. Otherwise this method creates and populates a new instance of this object in the given Realm. - - If nested objects are included in the argument, `createOrUpdateInRealm:withValue:` will be - recursively called on them if they have primary keys, `createInRealm:withValue:` if they do not. - - The `value` argument is used to populate the object. It can be a Realm object, a key-value coding - compliant object, an array or dictionary returned from the methods in `NSJSONSerialization`, or an - array containing one element for each managed property. - - If the object is being created, an exception will be thrown if any required properties - are not present and those properties were not defined with default values. - - If the `value` argument is a Realm object already managed by the given Realm, the - argument's type is the same as the receiver, and the objects have identical values for - their managed properties, this method does nothing. - - If the object is being updated, each property defined in its schema will be set by copying from - `value` using key-value coding. If the `value` argument does not respond to `valueForKey:` for a - given property name (or getter name, if defined), that value will remain untouched. - Nullable properties on the object can be set to nil by using `NSNull` as the updated value. - Each property is set even if the existing value is the same as the new value being set, and - notifications will report them all being changed. See `createOrUpdateModifiedInRealm:withValue:` - for a version of this function which only sets the values which have changed. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param realm The Realm which should own the object. - @param value The value used to populate the object. - - @see `defaultPropertyValues`, `primaryKey` - */ -+ (instancetype)createOrUpdateInRealm:(RLMRealm *)realm withValue:(id)value; - -/** - Creates or updates an Realm object within a specified Realm. - - This method may only be called on Realm object types with a primary key defined. If there is already - an object with the same primary key value in the given Realm, its values are updated and the object - is returned. Otherwise this method creates and populates a new instance of this object in the given Realm. - - If nested objects are included in the argument, `createOrUpdateInRealm:withValue:` will be - recursively called on them if they have primary keys, `createInRealm:withValue:` if they do not. - - The `value` argument is used to populate the object. It can be a Realm object, a key-value coding - compliant object, an array or dictionary returned from the methods in `NSJSONSerialization`, or an - array containing one element for each managed property. - - If the object is being created, an exception will be thrown if any required properties - are not present and those properties were not defined with default values. - - If the `value` argument is a Realm object already managed by the given Realm, the - argument's type is the same as the receiver, and the objects have identical values for - their managed properties, this method does nothing. - - If the object is being updated, each property defined in its schema will be set by copying from - `value` using key-value coding. If the `value` argument does not respond to `valueForKey:` for a - given property name (or getter name, if defined), that value will remain untouched. - Nullable properties on the object can be set to nil by using `NSNull` as the updated value. - Unlike `createOrUpdateInRealm:withValue:`, only properties which have changed in value are - set, and any change notifications produced by this call will report only which properies have - actually changed. - - Checking which properties have changed imposes a small amount of overhead, and so this method - may be slower when all or nearly all of the properties being set have changed. If most or all - of the properties being set have not changed, this method will be much faster than unconditionally - setting all of them, and will also reduce how much data has to be written to the Realm, saving - both i/o time and disk space. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param realm The Realm which should own the object. - @param value The value used to populate the object. - - @see `defaultPropertyValues`, `primaryKey` - */ -+ (instancetype)createOrUpdateModifiedInRealm:(RLMRealm *)realm withValue:(id)value; - -#pragma mark - Properties - -/** - The Realm which manages the object, or `nil` if the object is unmanaged. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - The object schema which lists the managed properties for the object. - */ -@property (nonatomic, readonly) RLMObjectSchema *objectSchema; - -/** - Indicates if the object can no longer be accessed because it is now invalid. - - An object can no longer be accessed if the object has been deleted from the Realm that manages it, or - if `invalidate` is called on that Realm. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if this object is frozen. - - @see `-[RLMObject freeze]` - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - - -#pragma mark - Customizing your Objects - -/** - Returns an array of property names for properties which should be indexed. - - Only string, integer, boolean, and `NSDate` properties are supported. - - @return An array of property names. - */ -+ (NSArray *)indexedProperties; - -/** - Override this method to specify the default values to be used for each property. - - @return A dictionary mapping property names to their default values. - */ -+ (nullable NSDictionary *)defaultPropertyValues; - -/** - Override this method to specify the name of a property to be used as the primary key. - - Only properties of types `RLMPropertyTypeString` and `RLMPropertyTypeInt` can be designated as the primary key. - Primary key properties enforce uniqueness for each value whenever the property is set, which incurs minor overhead. - Indexes are created automatically for primary key properties. - - @return The name of the property designated as the primary key. - */ -+ (nullable NSString *)primaryKey; - -/** - Override this method to specify the names of properties to ignore. These properties will not be managed by the Realm - that manages the object. - - @return An array of property names to ignore. - */ -+ (nullable NSArray *)ignoredProperties; - -/** - Override this method to specify the names of properties that are non-optional (i.e. cannot be assigned a `nil` value). - - By default, all properties of a type whose values can be set to `nil` are considered optional properties. - To require that an object in a Realm always store a non-`nil` value for a property, - add the name of the property to the array returned from this method. - - Properties of `RLMObject` type cannot be non-optional. Array and `NSNumber` properties - can be non-optional, but there is no reason to do so: arrays do not support storing nil, and - if you want a non-optional number you should instead use the primitive type. - - @return An array of property names that are required. - */ -+ (NSArray *)requiredProperties; - -/** - Override this method to provide information related to properties containing linking objects. - - Each property of type `RLMLinkingObjects` must have a key in the dictionary returned by this method consisting - of the property name. The corresponding value must be an instance of `RLMPropertyDescriptor` that describes the class - and property that the property is linked to. - - return @{ @"owners": [RLMPropertyDescriptor descriptorWithClass:Owner.class propertyName:@"dogs"] }; - - @return A dictionary mapping property names to `RLMPropertyDescriptor` instances. - */ -+ (NSDictionary *)linkingObjectsProperties; - -#pragma mark - Getting & Querying Objects from the Default Realm - -/** - Returns all objects of this object type from the default Realm. - - @return An `RLMResults` containing all objects of this type in the default Realm. - */ -+ (RLMResults *)allObjects; - -/** - Returns all objects of this object type matching the given predicate from the default Realm. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` containing all objects of this type in the default Realm that match the given predicate. - */ -+ (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -+ (RLMResults<__kindof RLMObject *> *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - - -/** - Returns all objects of this object type matching the given predicate from the default Realm. - - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` containing all objects of this type in the default Realm that match the given predicate. - */ -+ (RLMResults *)objectsWithPredicate:(nullable NSPredicate *)predicate; - -/** - Retrieves the single instance of this object type with the given primary key from the default Realm. - - Returns the object from the default Realm which has the given primary key, or - `nil` if the object does not exist. This is slightly faster than the otherwise - equivalent `[[SubclassName objectsWhere:@"primaryKeyPropertyName = %@", key] firstObject]`. - - This method requires that `primaryKey` be overridden on the receiving subclass. - - @return An object of this object type, or `nil` if an object with the given primary key does not exist. - @see `-primaryKey` - */ -+ (nullable instancetype)objectForPrimaryKey:(nullable id)primaryKey NS_SWIFT_NAME(object(forPrimaryKey:)); - - -#pragma mark - Querying Specific Realms - -/** - Returns all objects of this object type from the specified Realm. - - @param realm The Realm to query. - - @return An `RLMResults` containing all objects of this type in the specified Realm. - */ -+ (RLMResults *)allObjectsInRealm:(RLMRealm *)realm; - -/** - Returns all objects of this object type matching the given predicate from the specified Realm. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - @param realm The Realm to query. - - @return An `RLMResults` containing all objects of this type in the specified Realm that match the given predicate. - */ -+ (RLMResults *)objectsInRealm:(RLMRealm *)realm where:(NSString *)predicateFormat, ...; - -/// :nodoc: -+ (RLMResults<__kindof RLMObject *> *)objectsInRealm:(RLMRealm *)realm where:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all objects of this object type matching the given predicate from the specified Realm. - - @param predicate A predicate to use to filter the elements. - @param realm The Realm to query. - - @return An `RLMResults` containing all objects of this type in the specified Realm that match the given predicate. - */ -+ (RLMResults *)objectsInRealm:(RLMRealm *)realm withPredicate:(nullable NSPredicate *)predicate; - -/** - Retrieves the single instance of this object type with the given primary key from the specified Realm. - - Returns the object from the specified Realm which has the given primary key, or - `nil` if the object does not exist. This is slightly faster than the otherwise - equivalent `[[SubclassName objectsInRealm:realm where:@"primaryKeyPropertyName = %@", key] firstObject]`. - - This method requires that `primaryKey` be overridden on the receiving subclass. - - @return An object of this object type, or `nil` if an object with the given primary key does not exist. - @see `-primaryKey` - */ -+ (nullable instancetype)objectInRealm:(RLMRealm *)realm forPrimaryKey:(nullable id)primaryKey NS_SWIFT_NAME(object(in:forPrimaryKey:)); - -#pragma mark - Notifications - -/** - A callback block for `RLMObject` notifications. - - If the object is deleted from the managing Realm, the block is called with - `deleted` set to `YES` and the other two arguments are `nil`. The block will - never be called again after this. - - If the object is modified, the block will be called with `deleted` set to - `NO`, a `nil` error, and an array of `RLMPropertyChange` objects which - indicate which properties of the objects were modified. - - `error` is always `nil` and will be removed in a future version. - */ -typedef void (^RLMObjectChangeBlock)(BOOL deleted, - NSArray *_Nullable changes, - NSError *_Nullable error); - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When notifications - can't be delivered instantly, multiple notifications may be coalesced into a - single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - - @param block The block to be called whenever a change occurs. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block queue:(dispatch_queue_t)queue; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block keyPaths:(NSArray *)keyPaths queue:(dispatch_queue_t)queue; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block keyPaths:(NSArray *)keyPaths; - - -#pragma mark - Other Instance Methods - -/** - Returns YES if another Realm object instance points to the same object as the receiver in the Realm managing - the receiver. - - For frozen objects and object types with a primary key, `isEqual:` is - overridden to use the same logic as this method (along with a corresponding - implementation for `hash`). Non-frozen objects without primary keys use - pointer identity for `isEqual:` and `hash`. - - @param object The object to compare the receiver to. - - @return Whether the object represents the same object as the receiver. - */ -- (BOOL)isEqualToObject:(RLMObject *)object; - -/** - Returns a frozen (immutable) snapshot of this object. - - The frozen copy is an immutable object which contains the same data as this - object currently contains, but will not update when writes are made to the - containing Realm. Unlike live objects, frozen objects can be accessed from any - thread. - - - warning: Holding onto a frozen object for an extended period while performing write - transaction on the Realm may result in the Realm file growing to large sizes. See - `Realm.Configuration.maximumNumberOfActiveVersions` for more information. - - warning: This method can only be called on a managed object. - */ -- (instancetype)freeze NS_RETURNS_RETAINED; - -/** - Returns a live (mutable) reference of this object. - - This method creates a managed accessor to a live copy of the same frozen object. - Will return self if called on an already live object. - */ -- (instancetype)thaw; - -#pragma mark - Dynamic Accessors - -/// :nodoc: -- (nullable id)objectForKeyedSubscript:(NSString *)key; - -/// :nodoc: -- (void)setObject:(nullable id)obj forKeyedSubscript:(NSString *)key; - -@end - -/** - Information about a specific property which changed in an `RLMObject` change notification. - */ -@interface RLMPropertyChange : NSObject - -/** - The name of the property which changed. - */ -@property (nonatomic, readonly, strong) NSString *name; - -/** - The value of the property before the change occurred. This will always be `nil` - if the change happened on the same thread as the notification and for `RLMArray` - properties. - - For object properties this will give the object which was previously linked to, - but that object will have its new values and not the values it had before the - changes. This means that `previousValue` may be a deleted object, and you will - need to check `invalidated` before accessing any of its properties. - */ -@property (nonatomic, readonly, strong, nullable) id previousValue; - -/** - The value of the property after the change occurred. This will always be `nil` - for `RLMArray` properties. - */ -@property (nonatomic, readonly, strong, nullable) id value; -@end - -#pragma mark - RLMArray Property Declaration - -/** - Properties on `RLMObject`s of type `RLMArray` must have an associated type. A type is associated - with an `RLMArray` property by defining a protocol for the object type that the array should contain. - To define the protocol for an object, you can use the macro RLM_ARRAY_TYPE: - - RLM_ARRAY_TYPE(ObjectType) - ... - @property RLMArray *arrayOfObjectTypes; - */ -#define RLM_ARRAY_TYPE(RLM_OBJECT_SUBCLASS)\ -__attribute__((deprecated("RLM_ARRAY_TYPE has been deprecated. Use RLM_COLLECTION_TYPE instead."))) \ -@protocol RLM_OBJECT_SUBCLASS \ -@end - -/** - Properties on `RLMObject`s of type `RLMSet` / `RLMArray` must have an associated type. A type is associated - with an `RLMSet` / `RLMArray` property by defining a protocol for the object type that the array should contain. - To define the protocol for an object, you can use the macro RLM_COLLECTION_TYPE: - - RLM_COLLECTION_TYPE(ObjectType) - ... - @property RLMSet *setOfObjectTypes; - @property RLMArray *arrayOfObjectTypes; - */ -#define RLM_COLLECTION_TYPE(RLM_OBJECT_SUBCLASS)\ -@protocol RLM_OBJECT_SUBCLASS \ -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMObjectBase.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMObjectBase.h deleted file mode 100644 index 7e9c83c8f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMObjectBase.h +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// :nodoc: -@interface RLMObjectBase : NSObject - -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -- (instancetype)init NS_DESIGNATED_INITIALIZER; - -+ (NSString *)className; - -// Returns whether the class is included in the default set of classes managed by a Realm. -+ (BOOL)shouldIncludeInDefaultSchema; - -+ (nullable NSString *)_realmObjectName; -+ (nullable NSDictionary *)_realmColumnNames; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMObjectBase_Dynamic.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMObjectBase_Dynamic.h deleted file mode 100644 index fb74a5b27..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMObjectBase_Dynamic.h +++ /dev/null @@ -1,82 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectSchema, RLMRealm; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -/** - Returns the Realm that manages the object, if one exists. - - @warning This function is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is - recommended to retrieve the Realm that manages the object via `RLMObject`. - - @param object An `RLMObjectBase` obtained via a Swift `Object` or `RLMObject`. - - @return The Realm which manages this object. Returns `nil `for unmanaged objects. - */ -FOUNDATION_EXTERN RLMRealm * _Nullable RLMObjectBaseRealm(RLMObjectBase * _Nullable object); - -/** - Returns an `RLMObjectSchema` which describes the managed properties of the object. - - @warning This function is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is - recommended to retrieve `objectSchema` via `RLMObject`. - - @param object An `RLMObjectBase` obtained via a Swift `Object` or `RLMObject`. - - @return The object schema which lists the managed properties for the object. - */ -FOUNDATION_EXTERN RLMObjectSchema * _Nullable RLMObjectBaseObjectSchema(RLMObjectBase * _Nullable object); - -/** - Returns the object corresponding to a key value. - - @warning This function is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is - recommended to retrieve key values via `RLMObject`. - - @warning Will throw an `NSUndefinedKeyException` if `key` is not present on the object. - - @param object An `RLMObjectBase` obtained via a Swift `Object` or `RLMObject`. - @param key The name of the property. - - @return The object for the property requested. - */ -FOUNDATION_EXTERN id _Nullable RLMObjectBaseObjectForKeyedSubscript(RLMObjectBase * _Nullable object, NSString *key); - -/** - Sets a value for a key on the object. - - @warning This function is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is - recommended to set key values via `RLMObject`. - - @warning Will throw an `NSUndefinedKeyException` if `key` is not present on the object. - - @param object An `RLMObjectBase` obtained via a Swift `Object` or `RLMObject`. - @param key The name of the property. - @param obj The object to set as the value of the key. - */ -FOUNDATION_EXTERN void RLMObjectBaseSetObjectForKeyedSubscript(RLMObjectBase * _Nullable object, NSString *key, id _Nullable obj); - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMObjectId.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMObjectId.h deleted file mode 100644 index 32ef7b047..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMObjectId.h +++ /dev/null @@ -1,79 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A 12-byte (probably) unique object identifier. - - ObjectIds are similar to a GUID or a UUID, and can be used to uniquely identify - objects without a centralized ID generator. An ObjectID consists of: - - 1. A 4 byte timestamp measuring the creation time of the ObjectId in seconds - since the Unix epoch. - 2. A 5 byte random value - 3. A 3 byte counter, initialized to a random value. - - ObjectIds are intended to be fast to generate. Sorting by an ObjectId field - will typically result in the objects being sorted in creation order. - */ -RLM_SWIFT_SENDABLE // immutable -@interface RLMObjectId : NSObject -/// Creates a new randomly-initialized ObjectId. -+ (nonnull instancetype)objectId NS_SWIFT_NAME(generate()); - -/// Creates a new zero-initialized ObjectId. -- (instancetype)init; - -/// Creates a new ObjectId from the given 24-byte hexadecimal string. -/// -/// Returns `nil` and sets `error` if the string is not 24 characters long or -/// contains any characters other than 0-9a-fA-F. -/// -/// @param string The string to parse. -- (nullable instancetype)initWithString:(NSString *)string - error:(NSError **)error; - -/// Creates a new ObjectId using the given date, machine identifier, process identifier. -/// -/// @param timestamp A timestamp as NSDate. -/// @param machineIdentifier The machine identifier. -/// @param processIdentifier The process identifier. -- (instancetype)initWithTimestamp:(NSDate *)timestamp - machineIdentifier:(int)machineIdentifier - processIdentifier:(int)processIdentifier; - -/// Comparision operator to check if the right hand side is greater than the current value. -- (BOOL)isGreaterThan:(nullable RLMObjectId *)objectId; -/// Comparision operator to check if the right hand side is greater than or equal to the current value. -- (BOOL)isGreaterThanOrEqualTo:(nullable RLMObjectId *)objectId; -/// Comparision operator to check if the right hand side is less than the current value. -- (BOOL)isLessThan:(nullable RLMObjectId *)objectId; -/// Comparision operator to check if the right hand side is less than or equal to the current value. -- (BOOL)isLessThanOrEqualTo:(nullable RLMObjectId *)objectId; - -/// Get the ObjectId as a 24-character hexadecimal string. -@property (nonatomic, readonly) NSString *stringValue; -/// Get the timestamp for the RLMObjectId -@property (nonatomic, readonly) NSDate *timestamp; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMObjectSchema.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMObjectSchema.h deleted file mode 100644 index 9c4666b7c..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMObjectSchema.h +++ /dev/null @@ -1,83 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMProperty; - -/** - This class represents Realm model object schemas. - - When using Realm, `RLMObjectSchema` instances allow performing migrations and - introspecting the database's schema. - - Object schemas map to tables in the core database. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // not actually immutable, but the public API kinda is -@interface RLMObjectSchema : NSObject - -#pragma mark - Properties - -/** - An array of `RLMProperty` instances representing the managed properties of a class described by the schema. - - @see `RLMProperty` - */ -@property (nonatomic, readonly, copy) NSArray *properties; - -/** - The name of the class the schema describes. - */ -@property (nonatomic, readonly) NSString *className; - -/** - The property which serves as the primary key for the class the schema describes, if any. - */ -@property (nonatomic, readonly, nullable) RLMProperty *primaryKeyProperty; - -/** - Whether this object type is embedded. - */ -@property (nonatomic, readonly) BOOL isEmbedded; - -/** - Whether this object is asymmetric. - */ -@property (nonatomic, readonly) BOOL isAsymmetric; - -#pragma mark - Methods - -/** - Retrieves an `RLMProperty` object by the property name. - - @param propertyName The property's name. - - @return An `RLMProperty` object, or `nil` if there is no property with the given name. - */ -- (nullable RLMProperty *)objectForKeyedSubscript:(NSString *)propertyName; - -/** - Returns whether two `RLMObjectSchema` instances are equal. - */ -- (BOOL)isEqualToObjectSchema:(RLMObjectSchema *)objectSchema; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMProperty.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMProperty.h deleted file mode 100644 index 7f2594d3b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMProperty.h +++ /dev/null @@ -1,149 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// :nodoc: -@protocol RLMInt @end -/// :nodoc: -@protocol RLMBool @end -/// :nodoc: -@protocol RLMDouble @end -/// :nodoc: -@protocol RLMFloat @end -/// :nodoc: -@protocol RLMString @end -/// :nodoc: -@protocol RLMDate @end -/// :nodoc: -@protocol RLMData @end -/// :nodoc: -@protocol RLMDecimal128 @end -/// :nodoc: -@protocol RLMObjectId @end -/// :nodoc: -@protocol RLMUUID @end - -/// :nodoc: -@interface NSNumber () -@end - -/** - `RLMProperty` instances represent properties managed by a Realm in the context - of an object schema. Such properties may be persisted to a Realm file or - computed from other data from the Realm. - - When using Realm, `RLMProperty` instances allow performing migrations and - introspecting the database's schema. - - These property instances map to columns in the core database. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // not actually immutable, but the public API kinda is -@interface RLMProperty : NSObject - -#pragma mark - Properties - -/** - The name of the property. - */ -@property (nonatomic, readonly) NSString *name; - -/** - The type of the property. - - @see `RLMPropertyType` - */ -@property (nonatomic, readonly) RLMPropertyType type; - -/** - Indicates whether this property is indexed. - - @see `RLMObject` - */ -@property (nonatomic, readonly) BOOL indexed; - -/** - For `RLMObject` and `RLMCollection` properties, the name of the class of object stored in the property. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - For linking objects properties, the property name of the property the linking objects property is linked to. - */ -@property (nonatomic, readonly, copy, nullable) NSString *linkOriginPropertyName; - -/** - Indicates whether this property is optional. - */ -@property (nonatomic, readonly) BOOL optional; - -/** - Indicates whether this property is an array. - */ -@property (nonatomic, readonly) BOOL array; - -/** - Indicates whether this property is a set. - */ -@property (nonatomic, readonly) BOOL set; - -/** - Indicates whether this property is a dictionary. - */ -@property (nonatomic, readonly) BOOL dictionary; - -/** - Indicates whether this property is an array or set. - */ -@property (nonatomic, readonly) BOOL collection; - -#pragma mark - Methods - -/** - Returns whether a given property object is equal to the receiver. - */ -- (BOOL)isEqualToProperty:(RLMProperty *)property; - -@end - - -/** - An `RLMPropertyDescriptor` instance represents a specific property on a given class. - */ -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMPropertyDescriptor : NSObject - -/** - Creates and returns a property descriptor. - - @param objectClass The class of this property descriptor. - @param propertyName The name of this property descriptor. - */ -+ (instancetype)descriptorWithClass:(Class)objectClass propertyName:(NSString *)propertyName; - -/// The class of the property. -@property (nonatomic, readonly) Class objectClass; - -/// The name of the property. -@property (nonatomic, readonly) NSString *propertyName; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMProviderClient.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMProviderClient.h deleted file mode 100644 index ac649960a..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMProviderClient.h +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMApp; - -/// Base provider client interface. -RLM_SWIFT_SENDABLE -@interface RLMProviderClient : NSObject - -/// The app associated with this provider client. -@property (nonatomic, strong, readonly) RLMApp *app; - -/** - Initialize a provider client with a given app. - @param app The app for this provider client. - */ -- (instancetype)initWithApp:(RLMApp *)app; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMPushClient.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMPushClient.h deleted file mode 100644 index 0628c3ada..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMPushClient.h +++ /dev/null @@ -1,47 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMApp, RLMUser; - -/// A block type used to report an error -RLM_SWIFT_SENDABLE // invoked on a backgroun thread -typedef void(^RLMOptionalErrorBlock)(NSError * _Nullable); - -/// A client which can be used to register devices with the server to receive push notificatons -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMPushClient : NSObject - -/// The push notification service name the device will be registered with on the server -@property (nonatomic, readonly, nonnull) NSString *serviceName; - -/// Request to register device token to the server -- (void)registerDeviceWithToken:(NSString *)token - user:(RLMUser *)user - completion:(RLMOptionalErrorBlock)completion NS_SWIFT_NAME(registerDevice(token:user:completion:)); - -/// Request to deregister a device for a user -- (void)deregisterDeviceForUser:(RLMUser *)user - completion:(RLMOptionalErrorBlock)completion NS_SWIFT_NAME(deregisterDevice(user:completion:)); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMRealm+Sync.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMRealm+Sync.h deleted file mode 100644 index ff20e43c2..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMRealm+Sync.h +++ /dev/null @@ -1,38 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2017 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -@class RLMResults, RLMSyncSession; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -/// -@interface RLMRealm (Sync) - -/** - Get the RLMSyncSession used by this Realm. Will be nil if this is not a - synchronized Realm. -*/ -@property (nonatomic, nullable, readonly) RLMSyncSession *syncSession; - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMRealm.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMRealm.h deleted file mode 100644 index 0935e5301..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMRealm.h +++ /dev/null @@ -1,962 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMRealmConfiguration, RLMRealm, RLMObject, RLMSchema, RLMMigration, RLMNotificationToken, RLMThreadSafeReference, RLMAsyncOpenTask, RLMSyncSubscriptionSet; - -/** - A callback block for opening Realms asynchronously. - - Returns the Realm if the open was successful, or an error otherwise. - */ -typedef void(^RLMAsyncOpenRealmCallback)(RLMRealm * _Nullable realm, NSError * _Nullable error); - -/// The Id of the asynchronous transaction. -typedef unsigned RLMAsyncTransactionId; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - An `RLMRealm` instance (also referred to as "a Realm") represents a Realm - database. - - Realms can either be stored on disk (see `+[RLMRealm realmWithURL:]`) or in - memory (see `RLMRealmConfiguration`). - - `RLMRealm` instances are cached internally, and constructing equivalent `RLMRealm` - objects (for example, by using the same path or identifier) multiple times on a single thread - within a single iteration of the run loop will normally return the same - `RLMRealm` object. - - If you specifically want to ensure an `RLMRealm` instance is - destroyed (for example, if you wish to open a Realm, check some property, and - then possibly delete the Realm file and re-open it), place the code which uses - the Realm within an `@autoreleasepool {}` and ensure you have no other - strong references to it. - - @warning Non-frozen `RLMRealm` instances are thread-confined and cannot be - shared across threads or dispatch queues. Trying to do so will cause an - exception to be thrown. You must call this method on each thread you want to - interact with the Realm on. For dispatch queues, this means that you must call - it in each block which is dispatched, as a queue is not guaranteed to run all - of its blocks on the same thread. - */ - -@interface RLMRealm : NSObject - -#pragma mark - Creating & Initializing a Realm - -/** - Obtains an instance of the default Realm. - - The default Realm is used by the `RLMObject` class methods - which do not take an `RLMRealm` parameter, but is otherwise not special. The - default Realm is persisted as *default.realm* under the *Documents* directory of - your Application on iOS, in your application's *Application Support* - directory on macOS, and in the *Cache* directory on tvOS. - - The default Realm is created using the default `RLMRealmConfiguration`, which - can be changed via `+[RLMRealmConfiguration setDefaultConfiguration:]`. - - @return The default `RLMRealm` instance for the current thread. - */ -+ (instancetype)defaultRealm; - -/** - Obtains an instance of the default Realm bound to the given queue. - - Rather than being confined to the thread they are opened on, queue-bound - RLMRealms are confined to the given queue. They can be accessed from any - thread as long as it is from within a block dispatch to the queue, and - notifications will be delivered to the queue instead of a thread's run loop. - - Realms can only be confined to a serial queue. Queue-confined RLMRealm - instances can be obtained when not on that queue, but attempting to do - anything with that instance without first dispatching to the queue will throw - an incorrect thread exception. - - The default Realm is created using the default `RLMRealmConfiguration`, which - can be changed via `+[RLMRealmConfiguration setDefaultConfiguration:]`. - - @param queue A serial dispatch queue to confine the Realm to. - @return The default `RLMRealm` instance for the given queue. - */ -+ (instancetype)defaultRealmForQueue:(dispatch_queue_t)queue; - -/** - Obtains an `RLMRealm` instance with the given configuration. - - @param configuration A configuration object to use when creating the Realm. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return An `RLMRealm` instance. - */ -+ (nullable instancetype)realmWithConfiguration:(RLMRealmConfiguration *)configuration error:(NSError **)error; - -/** - Obtains an `RLMRealm` instance with the given configuration bound to the given queue. - - Rather than being confined to the thread they are opened on, queue-bound - RLMRealms are confined to the given queue. They can be accessed from any - thread as long as it is from within a block dispatch to the queue, and - notifications will be delivered to the queue instead of a thread's run loop. - - Realms can only be confined to a serial queue. Queue-confined RLMRealm - instances can be obtained when not on that queue, but attempting to do - anything with that instance without first dispatching to the queue will throw - an incorrect thread exception. - - @param configuration A configuration object to use when creating the Realm. - @param queue A serial dispatch queue to confine the Realm to. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return An `RLMRealm` instance. - */ -+ (nullable instancetype)realmWithConfiguration:(RLMRealmConfiguration *)configuration - queue:(nullable dispatch_queue_t)queue - error:(NSError **)error; - -/** - Obtains an `RLMRealm` instance persisted at a specified file URL. - - @param fileURL The local URL of the file the Realm should be saved at. - - @return An `RLMRealm` instance. - */ -+ (instancetype)realmWithURL:(NSURL *)fileURL; - -/** - Asynchronously open a Realm and deliver it to a block on the given queue. - - Opening a Realm asynchronously will perform all work needed to get the Realm to - a usable state (such as running potentially time-consuming migrations) on a - background thread before dispatching to the given queue. In addition, - synchronized Realms wait for all remote content available at the time the - operation began to be downloaded and available locally. - - The Realm passed to the callback function is confined to the callback queue as - if `-[RLMRealm realmWithConfiguration:queue:error]` was used. - - @param configuration A configuration object to use when opening the Realm. - @param callbackQueue The serial dispatch queue on which the callback should be run. - @param callback A callback block. If the Realm was successfully opened, - it will be passed in as an argument. - Otherwise, an `NSError` describing what went wrong will be - passed to the block instead. - */ -+ (RLMAsyncOpenTask *)asyncOpenWithConfiguration:(RLMRealmConfiguration *)configuration - callbackQueue:(dispatch_queue_t)callbackQueue - callback:(RLMAsyncOpenRealmCallback)callback; - -/** - The `RLMSchema` used by the Realm. - */ -@property (nonatomic, readonly) RLMSchema *schema; - -/** - Indicates if the Realm is currently engaged in a write transaction. - - @warning Do not simply check this property and then start a write transaction whenever an object needs to be - created, updated, or removed. Doing so might cause a large number of write transactions to be created, - degrading performance. Instead, always prefer performing multiple updates during a single transaction. - */ -@property (nonatomic, readonly) BOOL inWriteTransaction; - -/** - The `RLMRealmConfiguration` object that was used to create this `RLMRealm` instance. - */ -@property (nonatomic, readonly) RLMRealmConfiguration *configuration; - -/** - Indicates if this Realm contains any objects. - */ -@property (nonatomic, readonly) BOOL isEmpty; - -/** - Indicates if this Realm is frozen. - - @see `-[RLMRealm freeze]` - */ -@property (nonatomic, readonly, getter=isFrozen) BOOL frozen; - -/** - Returns a frozen (immutable) snapshot of this Realm. - - A frozen Realm is an immutable snapshot view of a particular version of a - Realm's data. Unlike normal RLMRealm instances, it does not live-update to - reflect writes made to the Realm, and can be accessed from any thread. Writing - to a frozen Realm is not allowed, and attempting to begin a write transaction - will throw an exception. - - All objects and collections read from a frozen Realm will also be frozen. - */ -- (RLMRealm *)freeze NS_RETURNS_RETAINED; - -/** - Returns a live reference of this Realm. - - All objects and collections read from the returned Realm will no longer be frozen. - This method will return `self` if it is not already frozen. - */ -- (RLMRealm *)thaw; - -#pragma mark - File Management - -/** - Writes a compacted and optionally encrypted copy of the Realm to the given local URL. - - The destination file cannot already exist. - - Note that if this method is called from within a write transaction, the - *current* data is written, not the data from the point when the previous write - transaction was committed. - - @param fileURL Local URL to save the Realm to. - @param key Optional 64-byte encryption key to encrypt the new file with. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return `YES` if the Realm was successfully written to disk, `NO` if an error occurred. - */ -- (BOOL)writeCopyToURL:(NSURL *)fileURL encryptionKey:(nullable NSData *)key error:(NSError **)error; - -/** - Writes a copy of the Realm to a given location specified by a given configuration. - - If the configuration supplied is derived from a `RLMUser` then this Realm will be copied with - sync functionality enabled. - - The destination file cannot already exist. - - @param configuration A Realm Configuration. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return `YES` if the Realm was successfully written to disk, `NO` if an error occurred. - */ -- (BOOL)writeCopyForConfiguration:(RLMRealmConfiguration *)configuration error:(NSError **)error; - -/** - Checks if the Realm file for the given configuration exists locally on disk. - - For non-synchronized, non-in-memory Realms, this is equivalent to - `-[NSFileManager.defaultManager fileExistsAtPath:config.path]`. For - synchronized Realms, it takes care of computing the actual path on disk based - on the server, virtual path, and user as is done when opening the Realm. - - @param config A Realm configuration to check the existence of. - @return YES if the Realm file for the given configuration exists on disk, NO otherwise. - */ -+ (BOOL)fileExistsForConfiguration:(RLMRealmConfiguration *)config; - -/** - Deletes the local Realm file and associated temporary files for the given configuration. - - This deletes the ".realm", ".note" and ".management" files which would be - created by opening the Realm with the given configuration. It does not delete - the ".lock" file (which contains no persisted data and is recreated from - scratch every time the Realm file is opened). - - The Realm must not be currently open on any thread or in another process. If - it is, this will return NO and report the error RLMErrorAlreadyOpen. Attempting to open - the Realm on another thread while the deletion is happening will block (and - then create a new Realm and open that afterwards). - - If the Realm already does not exist this will return `NO` and report the error NSFileNoSuchFileError; - - @param config A Realm configuration identifying the Realm to be deleted. - @return YES if any files were deleted, NO otherwise. - */ -+ (BOOL)deleteFilesForConfiguration:(RLMRealmConfiguration *)config error:(NSError **)error - __attribute__((swift_error(nonnull_error))); - -#pragma mark - Notifications - -/** - The type of a block to run whenever the data within the Realm is modified. - - @see `-[RLMRealm addNotificationBlock:]` - */ -typedef void (^RLMNotificationBlock)(RLMNotification notification, RLMRealm *realm); - -#pragma mark - Receiving Notification when a Realm Changes - -/** - Adds a notification handler for changes in this Realm, and returns a notification token. - - Notification handlers are called after each write transaction is committed, - either on the current thread or other threads. - - Handler blocks are called on the same thread that they were added on, and may - only be added on threads which are currently within a run loop. Unless you are - specifically creating and running a run loop on a background thread, this will - normally only be the main thread. - - The block has the following definition: - - typedef void(^RLMNotificationBlock)(RLMNotification notification, RLMRealm *realm); - - It receives the following parameters: - - - `NSString` \***notification**: The name of the incoming notification. See - `RLMRealmNotification` for information on what - notifications are sent. - - `RLMRealm` \***realm**: The Realm for which this notification occurred. - - @param block A block which is called to process Realm notifications. - - @return A token object which must be retained as long as you wish to continue - receiving change notifications. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMNotificationBlock)block __attribute__((warn_unused_result)); - -#pragma mark - Writing to a Realm - -/** - Begins a write transaction on the Realm. - - Only one write transaction can be open at a time for each Realm file. Write - transactions cannot be nested, and trying to begin a write transaction on a - Realm which is already in a write transaction will throw an exception. Calls to - `beginWriteTransaction` from `RLMRealm` instances for the same Realm file in - other threads or other processes will block until the current write transaction - completes or is cancelled. - - Before beginning the write transaction, `beginWriteTransaction` updates the - `RLMRealm` instance to the latest Realm version, as if `refresh` had been - called, and generates notifications if applicable. This has no effect if the - Realm was already up to date. - - It is rarely a good idea to have write transactions span multiple cycles of - the run loop, but if you do wish to do so you will need to ensure that the - Realm participating in the write transaction is kept alive until the write - transaction is committed. - */ -- (void)beginWriteTransaction; - -/** - Commits all write operations in the current write transaction, and ends the - transaction. - - After saving the changes, all notification blocks registered on this specific - `RLMRealm` instance are invoked synchronously. Notification blocks registered - on other threads or on collections are invoked asynchronously. If you do not - want to receive a specific notification for this write tranaction, see - `commitWriteTransactionWithoutNotifying:error:`. - - This method can fail if there is insufficient disk space available to save the - writes made, or due to unexpected i/o errors. This version of the method throws - an exception when errors occur. Use the version with a `NSError` out parameter - instead if you wish to handle errors. - - @warning This method may only be called during a write transaction. - */ -- (void)commitWriteTransaction NS_SWIFT_UNAVAILABLE(""); - -/** - Commits all write operations in the current write transaction, and ends the - transaction. - - After saving the changes, all notification blocks registered on this specific - `RLMRealm` instance are invoked synchronously. Notification blocks registered - on other threads or on collections are invoked asynchronously. If you do not - want to receive a specific notification for this write tranaction, see - `commitWriteTransactionWithoutNotifying:error:`. - - This method can fail if there is insufficient disk space available to save the - writes made, or due to unexpected i/o errors. - - @warning This method may only be called during a write transaction. - - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return Whether the transaction succeeded. - */ -- (BOOL)commitWriteTransaction:(NSError **)error; - -/** - Commits all write operations in the current write transaction, without - notifying specific notification blocks of the changes. - - After saving the changes, all notification blocks registered on this specific - `RLMRealm` instance are invoked synchronously. Notification blocks registered - on other threads or on collections are scheduled to be invoked asynchronously. - - You can skip notifiying specific notification blocks about the changes made - in this write transaction by passing in their associated notification tokens. - This is primarily useful when the write transaction is saving changes already - made in the UI and you do not want to have the notification block attempt to - re-apply the same changes. - - The tokens passed to this method must be for notifications for this specific - `RLMRealm` instance. Notifications for different threads cannot be skipped - using this method. - - This method can fail if there is insufficient disk space available to save the - writes made, or due to unexpected i/o errors. - - @warning This method may only be called during a write transaction. - - @param tokens An array of notification tokens which were returned from adding - callbacks which you do not want to be notified for the changes - made in this write transaction. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return Whether the transaction succeeded. - */ -- (BOOL)commitWriteTransactionWithoutNotifying:(NSArray *)tokens error:(NSError **)error; - -/** - Reverts all writes made during the current write transaction and ends the transaction. - - This rolls back all objects in the Realm to the state they were in at the - beginning of the write transaction, and then ends the transaction. - - This restores the data for deleted objects, but does not revive invalidated - object instances. Any `RLMObject`s which were added to the Realm will be - invalidated rather than becoming unmanaged. - Given the following code: - - ObjectType *oldObject = [[ObjectType objectsWhere:@"..."] firstObject]; - ObjectType *newObject = [[ObjectType alloc] init]; - - [realm beginWriteTransaction]; - [realm addObject:newObject]; - [realm deleteObject:oldObject]; - [realm cancelWriteTransaction]; - - Both `oldObject` and `newObject` will return `YES` for `isInvalidated`, - but re-running the query which provided `oldObject` will once again return - the valid object. - - KVO observers on any objects which were modified during the transaction will - be notified about the change back to their initial values, but no other - notifications are produced by a cancelled write transaction. - - @warning This method may only be called during a write transaction. - */ -- (void)cancelWriteTransaction; - -/** - Performs actions contained within the given block inside a write transaction. - - @see `[RLMRealm transactionWithoutNotifying:block:error:]` - */ -- (void)transactionWithBlock:(__attribute__((noescape)) void(^)(void))block NS_SWIFT_UNAVAILABLE(""); - -/** - Performs actions contained within the given block inside a write transaction. - - @see `[RLMRealm transactionWithoutNotifying:block:error:]` - */ -- (BOOL)transactionWithBlock:(__attribute__((noescape)) void(^)(void))block error:(NSError **)error; - -/** - Performs actions contained within the given block inside a write transaction. - - @see `[RLMRealm transactionWithoutNotifying:block:error:]` - */ -- (void)transactionWithoutNotifying:(NSArray *)tokens block:(__attribute__((noescape)) void(^)(void))block; - -/** - Performs actions contained within the given block inside a write transaction. - - Write transactions cannot be nested, and trying to execute a write transaction - on a Realm which is already participating in a write transaction will throw an - exception. Calls to `transactionWithBlock:` from `RLMRealm` instances in other - threads will block until the current write transaction completes. - - Before beginning the write transaction, `transactionWithBlock:` updates the - `RLMRealm` instance to the latest Realm version, as if `refresh` had been called, and - generates notifications if applicable. This has no effect if the Realm - was already up to date. - - You can skip notifiying specific notification blocks about the changes made - in this write transaction by passing in their associated notification tokens. - This is primarily useful when the write transaction is saving changes already - made in the UI and you do not want to have the notification block attempt to - re-apply the same changes. - - The tokens passed to this method must be for notifications for this specific - `RLMRealm` instance. Notifications for different threads cannot be skipped - using this method. - - @param tokens An array of notification tokens which were returned from adding - callbacks which you do not want to be notified for the changes - made in this write transaction. - @param block The block containing actions to perform. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return Whether the transaction succeeded. - */ -- (BOOL)transactionWithoutNotifying:(NSArray *)tokens block:(__attribute__((noescape)) void(^)(void))block error:(NSError **)error; - -/** - Indicates if the Realm is currently performing async write operations. - This becomes YES following a call to `beginAsyncWriteTransaction`, - `commitAsyncWriteTransaction`, or `asyncTransactionWithBlock:`, and remains so - until all scheduled async write work has completed. - - @warning If this is `YES`, closing or invalidating the Realm will block until scheduled work has completed. - */ -@property (nonatomic, readonly) BOOL isPerformingAsynchronousWriteOperations; - -/** - Begins an asynchronous write transaction. - This function asynchronously begins a write transaction on a background - thread, and then invokes the block on the original thread or queue once the - transaction has begun. Unlike `beginWriteTransaction`, this does not block the - calling thread if another thread is current inside a write transaction, and - will always return immediately. - Multiple calls to this function (or the other functions which perform - asynchronous write transactions) will queue the blocks to be called in the - same order as they were queued. This includes calls from inside a write - transaction block, which unlike with synchronous transactions are allowed. - - @param block The block containing actions to perform inside the write transaction. - `block` should end by calling `commitAsyncWriteTransaction`, - `commitWriteTransaction` or `cancelWriteTransaction`. - Returning without one of these calls is equivalent to calling `cancelWriteTransaction`. - - @return An id identifying the asynchronous transaction which can be passed to - `cancelAsyncTransaction:` prior to the block being called to cancel - the pending invocation of the block. - */ -- (RLMAsyncTransactionId)beginAsyncWriteTransaction:(void(^)(void))block; - -/** - Asynchronously commits a write transaction. - The call returns immediately allowing the caller to proceed while the I/O is - performed on a dedicated background thread. This can be used regardless of if - the write transaction was begun with `beginWriteTransaction` or - `beginAsyncWriteTransaction`. - - @param completionBlock A block which will be called on the source thread or - queue once the commit has either completed or failed - with an error. - - @param allowGrouping If `YES`, multiple sequential calls to - `commitAsyncWriteTransaction:` may be batched together - and persisted to stable storage in one group. This - improves write performance, particularly when the - individual transactions being batched are small. In the - event of a crash or power failure, either all of the - grouped transactions will be lost or none will, rather - than the usual guarantee that data has been persisted as - soon as a call to commit has returned. - - @return An id identifying the asynchronous transaction commit can be passed to - `cancelAsyncTransaction:` prior to the completion block being called - to cancel the pending invocation of the block. Note that this does - *not* cancel the commit itself. -*/ -- (RLMAsyncTransactionId)commitAsyncWriteTransaction:(nullable void(^)(NSError *_Nullable))completionBlock - allowGrouping:(BOOL)allowGrouping; - -/** - Asynchronously commits a write transaction. - The call returns immediately allowing the caller to proceed while the I/O is - performed on a dedicated background thread. This can be used regardless of if - the write transaction was begun with `beginWriteTransaction` or - `beginAsyncWriteTransaction`. - - @param completionBlock A block which will be called on the source thread or - queue once the commit has either completed or failed - with an error. - - @return An id identifying the asynchronous transaction commit can be passed to - `cancelAsyncTransaction:` prior to the completion block being called - to cancel the pending invocation of the block. Note that this does - *not* cancel the commit itself. -*/ -- (RLMAsyncTransactionId)commitAsyncWriteTransaction:(void(^)(NSError *_Nullable))completionBlock; - -/** - Asynchronously commits a write transaction. - The call returns immediately allowing the caller to proceed while the I/O is - performed on a dedicated background thread. This can be used regardless of if - the write transaction was begun with `beginWriteTransaction` or - `beginAsyncWriteTransaction`. - - @return An id identifying the asynchronous transaction commit can be passed to - `cancelAsyncTransaction:` prior to the completion block being called - to cancel the pending invocation of the block. Note that this does - *not* cancel the commit itself. -*/ -- (RLMAsyncTransactionId)commitAsyncWriteTransaction; - -/** - Cancels a queued block for an asynchronous transaction. - This can cancel a block passed to either an asynchronous begin or an - asynchronous commit. Canceling a begin cancels that transaction entirely, - while canceling a commit merely cancels the invocation of the completion - callback, and the commit will still happen. - Transactions can only be canceled before the block is invoked, and calling - `cancelAsyncTransaction:` from within the block is a no-op. - - @param asyncTransactionId A transaction id from either `beginAsyncWriteTransaction:` or `commitAsyncWriteTransaction:`. -*/ -- (void)cancelAsyncTransaction:(RLMAsyncTransactionId)asyncTransactionId; - -/** - Asynchronously performs actions contained within the given block inside a - write transaction. - The write transaction is begun asynchronously as if calling - `beginAsyncWriteTransaction:`, and by default the transaction is commited - asynchronously after the block completes. You can also explicitly call - `commitWriteTransaction` or `cancelWriteTransaction` from within the block to - synchronously commit or cancel the write transaction. - - @param block The block containing actions to perform. - - @param completionBlock A block which will be called on the source thread or - queue once the commit has either completed or failed - with an error. - - @return An id identifying the asynchronous transaction which can be passed to - `cancelAsyncTransaction:` prior to the block being called to cancel - the pending invocation of the block. -*/ -- (RLMAsyncTransactionId)asyncTransactionWithBlock:(void(^)(void))block onComplete:(nullable void(^)(NSError *))completionBlock; - -/** - Asynchronously performs actions contained within the given block inside a - write transaction. - The write transaction is begun asynchronously as if calling - `beginAsyncWriteTransaction:`, and by default the transaction is commited - asynchronously after the block completes. You can also explicitly call - `commitWriteTransaction` or `cancelWriteTransaction` from within the block to - synchronously commit or cancel the write transaction. - - @param block The block containing actions to perform. - - @return An id identifying the asynchronous transaction which can be passed to - `cancelAsyncTransaction:` prior to the block being called to cancel - the pending invocation of the block. -*/ -- (RLMAsyncTransactionId)asyncTransactionWithBlock:(void(^)(void))block; - -/** - Updates the Realm and outstanding objects managed by the Realm to point to the - most recent data. - - If the version of the Realm is actually changed, Realm and collection - notifications will be sent to reflect the changes. This may take some time, as - collection notifications are prepared on a background thread. As a result, - calling this method on the main thread is not advisable. - - @return Whether there were any updates for the Realm. Note that `YES` may be - returned even if no data actually changed. - */ -- (BOOL)refresh; - -/** - Set this property to `YES` to automatically update this Realm when changes - happen in other threads. - - If set to `YES` (the default), changes made on other threads will be reflected - in this Realm on the next cycle of the run loop after the changes are - committed. If set to `NO`, you must manually call `-refresh` on the Realm to - update it to get the latest data. - - Note that by default, background threads do not have an active run loop and you - will need to manually call `-refresh` in order to update to the latest version, - even if `autorefresh` is set to `YES`. - - Even with this property enabled, you can still call `-refresh` at any time to - update the Realm before the automatic refresh would occur. - - Write transactions will still always advance a Realm to the latest version and - produce local notifications on commit even if autorefresh is disabled. - - Disabling `autorefresh` on a Realm without any strong references to it will not - have any effect, and `autorefresh` will revert back to `YES` the next time the - Realm is created. This is normally irrelevant as it means that there is nothing - to refresh (as managed `RLMObject`s, `RLMArray`s, and `RLMResults` have strong - references to the Realm that manages them), but it means that setting - `RLMRealm.defaultRealm.autorefresh = NO` in - `application:didFinishLaunchingWithOptions:` and only later storing Realm - objects will not work. - - Defaults to `YES`. - */ -@property (nonatomic) BOOL autorefresh; - -/** - Invalidates all `RLMObject`s, `RLMResults`, `RLMLinkingObjects`, and `RLMArray`s managed by the Realm. - - A Realm holds a read lock on the version of the data accessed by it, so - that changes made to the Realm on different threads do not modify or delete the - data seen by this Realm. Calling this method releases the read lock, - allowing the space used on disk to be reused by later write transactions rather - than growing the file. This method should be called before performing long - blocking operations on a background thread on which you previously read data - from the Realm which you no longer need. - - All `RLMObject`, `RLMResults` and `RLMArray` instances obtained from this - `RLMRealm` instance on the current thread are invalidated. `RLMObject`s and `RLMArray`s - cannot be used. `RLMResults` will become empty. The Realm itself remains valid, - and a new read transaction is implicitly begun the next time data is read from the Realm. - - Calling this method multiple times in a row without reading any data from the - Realm, or before ever reading any data from the Realm, is a no-op. - */ -- (void)invalidate; - -#pragma mark - Accessing Objects - -/** - Returns the same object as the one referenced when the `RLMThreadSafeReference` was first created, - but resolved for the current Realm for this thread. Returns `nil` if this object was deleted after - the reference was created. - - @param reference The thread-safe reference to the thread-confined object to resolve in this Realm. - - @warning A `RLMThreadSafeReference` object must be resolved at most once. - Failing to resolve a `RLMThreadSafeReference` will result in the source version of the - Realm being pinned until the reference is deallocated. - An exception will be thrown if a reference is resolved more than once. - - @warning Cannot call within a write transaction. - - @note Will refresh this Realm if the source Realm was at a later version than this one. - - @see `+[RLMThreadSafeReference referenceWithThreadConfined:]` - */ -- (nullable id)resolveThreadSafeReference:(RLMThreadSafeReference *)reference -NS_REFINED_FOR_SWIFT; - -#pragma mark - Adding and Removing Objects from a Realm - -/** - Adds an object to the Realm. - - Once added, this object is considered to be managed by the Realm. It can be retrieved - using the `objectsWhere:` selectors on `RLMRealm` and on subclasses of `RLMObject`. - - When added, all child relationships referenced by this object will also be added to - the Realm if they are not already in it. - - If the object or any related objects are already being managed by a different Realm - an exception will be thrown. Use `-[RLMObject createInRealm:withObject:]` to insert a copy of a managed object - into a different Realm. - - The object to be added must be valid and cannot have been previously deleted - from a Realm (i.e. `isInvalidated` must be `NO`). - - @warning This method may only be called during a write transaction. - - @param object The object to be added to this Realm. - */ -- (void)addObject:(RLMObject *)object; - -/** - Adds all the objects in a collection to the Realm. - - This is the equivalent of calling `addObject:` for every object in a collection. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable collection such as `NSArray`, `RLMArray`, or `RLMResults`, - containing Realm objects to be added to the Realm. - - @see `addObject:` - */ -- (void)addObjects:(id)objects; - -/** - Adds or updates an existing object into the Realm. - - The object provided must have a designated primary key. If no objects exist in the Realm - with the same primary key value, the object is inserted. Otherwise, the existing object is - updated with any changed values. - - As with `addObject:`, the object cannot already be managed by a different - Realm. Use `-[RLMObject createOrUpdateInRealm:withValue:]` to copy values to - a different Realm. - - If there is a property or KVC value on `object` whose value is nil, and it corresponds - to a nullable property on an existing object being updated, that nullable property will - be set to nil. - - @warning This method may only be called during a write transaction. - - @param object The object to be added or updated. - */ -- (void)addOrUpdateObject:(RLMObject *)object; - -/** - Adds or updates all the objects in a collection into the Realm. - - This is the equivalent of calling `addOrUpdateObject:` for every object in a collection. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable collection such as `NSArray`, `RLMArray`, or `RLMResults`, - containing Realm objects to be added to or updated within the Realm. - - @see `addOrUpdateObject:` - */ -- (void)addOrUpdateObjects:(id)objects; - -/** - Deletes an object from the Realm. Once the object is deleted it is considered invalidated. - - @warning This method may only be called during a write transaction. - - @param object The object to be deleted. - */ -- (void)deleteObject:(RLMObject *)object; - -/** - Deletes one or more objects from the Realm. - - This is the equivalent of calling `deleteObject:` for every object in a collection. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable collection such as `NSArray`, `RLMArray`, or `RLMResults`, - containing objects to be deleted from the Realm. - - @see `deleteObject:` - */ -- (void)deleteObjects:(id)objects; - -/** - Deletes all objects from the Realm. - - @warning This method may only be called during a write transaction. - - @see `deleteObject:` - */ -- (void)deleteAllObjects; - -#pragma mark - Sync Subscriptions - -/** - Represents the active subscriptions for this realm, which can be used to add/remove/update - and search flexible sync subscriptions. - Getting the subscriptions from a local or partition-based configured realm will thrown an exception. - - @warning This feature is currently in beta and its API is subject to change. - */ -@property (nonatomic, readonly, nonnull) RLMSyncSubscriptionSet *subscriptions; - - -#pragma mark - Migrations - -/** - The type of a migration block used to migrate a Realm. - - @param migration A `RLMMigration` object used to perform the migration. The - migration object allows you to enumerate and alter any - existing objects which require migration. - - @param oldSchemaVersion The schema version of the Realm being migrated. - */ -RLM_SWIFT_SENDABLE -typedef void (^RLMMigrationBlock)(RLMMigration *migration, uint64_t oldSchemaVersion); - -/** - Returns the schema version for a Realm at a given local URL. - - @param fileURL Local URL to a Realm file. - @param key 64-byte key used to encrypt the file, or `nil` if it is unencrypted. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return The version of the Realm at `fileURL`, or `RLMNotVersioned` if the version cannot be read. - */ -+ (uint64_t)schemaVersionAtURL:(NSURL *)fileURL encryptionKey:(nullable NSData *)key - error:(NSError **)error -NS_REFINED_FOR_SWIFT; - -/** - Performs the given Realm configuration's migration block on a Realm at the given path. - - This method is called automatically when opening a Realm for the first time and does - not need to be called explicitly. You can choose to call this method to control - exactly when and how migrations are performed. - - @param configuration The Realm configuration used to open and migrate the Realm. - @return The error that occurred while applying the migration, if any. - - @see RLMMigration - */ -+ (BOOL)performMigrationForConfiguration:(RLMRealmConfiguration *)configuration error:(NSError **)error; - -#pragma mark - Unavailable Methods - -/** - RLMRealm instances are cached internally by Realm and cannot be created directly. - - Use `+[RLMRealm defaultRealm]`, `+[RLMRealm realmWithConfiguration:error:]` or - `+[RLMRealm realmWithURL]` to obtain a reference to an RLMRealm. - */ -- (instancetype)init __attribute__((unavailable("Use +defaultRealm, +realmWithConfiguration: or +realmWithURL:."))); - -/** - RLMRealm instances are cached internally by Realm and cannot be created directly. - - Use `+[RLMRealm defaultRealm]`, `+[RLMRealm realmWithConfiguration:error:]` or - `+[RLMRealm realmWithURL]` to obtain a reference to an RLMRealm. - */ -+ (instancetype)new __attribute__((unavailable("Use +defaultRealm, +realmWithConfiguration: or +realmWithURL:."))); - -/// :nodoc: -- (void)addOrUpdateObjectsFromArray:(id)array __attribute__((unavailable("Renamed to -addOrUpdateObjects:."))); - -@end - -// MARK: - RLMNotificationToken - -/** - A token which is returned from methods which subscribe to changes to a Realm. - - Change subscriptions in Realm return an `RLMNotificationToken` instance, - which can be used to unsubscribe from the changes. You must store a strong - reference to the token for as long as you want to continue to receive notifications. - When you wish to stop, call the `-invalidate` method. Notifications are also stopped if - the token is deallocated. - */ -RLM_SWIFT_SENDABLE // is internally thread-safe -@interface RLMNotificationToken : NSObject -/// Stops notifications for the change subscription that returned this token. -/// -/// @return True if the token was previously valid, and false if it was already invalidated. -- (bool)invalidate; - -/// Stops notifications for the change subscription that returned this token. -- (void)stop __attribute__((unavailable("Renamed to -invalidate."))) NS_REFINED_FOR_SWIFT; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMRealmConfiguration.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMRealmConfiguration.h deleted file mode 100644 index d09e5c215..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMRealmConfiguration.h +++ /dev/null @@ -1,197 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2015 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMEventConfiguration, RLMSyncConfiguration; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A block called when opening a Realm for the first time during the life - of a process to determine if it should be compacted before being returned - to the user. It is passed the total file size (data + free space) and the total - bytes used by data in the file. - - Return `YES` to indicate that an attempt to compact the file should be made. - The compaction will be skipped if another process is accessing it. - */ -RLM_SWIFT_SENDABLE -typedef BOOL (^RLMShouldCompactOnLaunchBlock)(NSUInteger totalBytes, NSUInteger bytesUsed); - -/** - A block which receives a subscription set instance, that can be used to add an initial set of subscriptions which will be executed - when the Realm is first opened. - */ -RLM_SWIFT_SENDABLE -typedef void(^RLMFlexibleSyncInitialSubscriptionsBlock)(RLMSyncSubscriptionSet * _Nonnull subscriptions); - -/** - An `RLMRealmConfiguration` instance describes the different options used to - create an instance of a Realm. - - `RLMRealmConfiguration` instances are just plain `NSObject`s. Unlike `RLMRealm`s - and `RLMObject`s, they can be freely shared between threads as long as you do not - mutate them. - - Creating configuration objects for class subsets (by setting the - `objectClasses` property) can be expensive. Because of this, you will normally want to - cache and reuse a single configuration object for each distinct configuration rather than - creating a new object each time you open a Realm. - */ -@interface RLMRealmConfiguration : NSObject - -#pragma mark - Default Configuration - -/** - Returns the default configuration used to create Realms when no other - configuration is explicitly specified (i.e. `+[RLMRealm defaultRealm]`). - - @return The default Realm configuration. - */ -+ (instancetype)defaultConfiguration; - -/** - Sets the default configuration to the given `RLMRealmConfiguration`. - - @param configuration The new default Realm configuration. - */ -+ (void)setDefaultConfiguration:(RLMRealmConfiguration *)configuration; - -#pragma mark - Properties - -/// The local URL of the Realm file. Mutually exclusive with `inMemoryIdentifier`; -/// setting one of the two properties will automatically nil out the other. -@property (nonatomic, copy, nullable) NSURL *fileURL; - -/// A string used to identify a particular in-memory Realm. Mutually exclusive with `fileURL`, -/// `seedFilePath`and `syncConfiguration`; -/// setting any one of the three properties will automatically nil out the other two. -@property (nonatomic, copy, nullable) NSString *inMemoryIdentifier; - -/// A 64-byte key to use to encrypt the data, or `nil` if encryption is not enabled. -@property (nonatomic, copy, nullable) NSData *encryptionKey; - -/// Whether to open the Realm in read-only mode. -/// -/// For non-synchronized Realms, this is required to be able to open Realm -/// files which are not writeable or are in a directory which is not writeable. -/// This should only be used on files which will not be modified by anyone -/// while they are open, and not just to get a read-only view of a file which -/// may be written to by another thread or process. Opening in read-only mode -/// requires disabling Realm's reader/writer coordination, so committing a -/// write transaction from another process will result in crashes. -/// -/// Syncronized Realms must always be writeable (as otherwise no -/// synchronization could happen), and this instead merely disallows performing -/// write transactions on the Realm. In addition, it will skip some automatic -/// writes made to the Realm, such as to initialize the Realm's schema. Setting -/// `readOnly = YES` is not strictly required for Realms which the sync user -/// does not have write access to, but is highly recommended as it will improve -/// error reporting and catch some errors earlier. -/// -/// Realms using query-based sync cannot be opened in read-only mode. -@property (nonatomic) BOOL readOnly; - -/// The current schema version. -@property (nonatomic) uint64_t schemaVersion; - -/// The block which migrates the Realm to the current version. -@property (nonatomic, copy, nullable) RLMMigrationBlock migrationBlock; - -/** - Whether to recreate the Realm file with the provided schema if a migration is required. - This is the case when the stored schema differs from the provided schema or - the stored schema version differs from the version on this configuration. - Setting this property to `YES` deletes the file if a migration would otherwise be required or executed. - - @note Setting this property to `YES` doesn't disable file format migrations. - */ -@property (nonatomic) BOOL deleteRealmIfMigrationNeeded; - -/** - A block called when opening a Realm for the first time during the life - of a process to determine if it should be compacted before being returned - to the user. It is passed the total file size (data + free space) and the total - bytes used by data in the file. - - Return `YES` to indicate that an attempt to compact the file should be made. - The compaction will be skipped if another process is accessing it. - */ -@property (nonatomic, copy, nullable) RLMShouldCompactOnLaunchBlock shouldCompactOnLaunch; - -/// The classes managed by the Realm. -@property (nonatomic, copy, nullable) NSArray *objectClasses; - -/** - The maximum number of live versions in the Realm file before an exception will - be thrown when attempting to start a write transaction. - - Realm provides MVCC snapshot isolation, meaning that writes on one thread do - not overwrite data being read on another thread, and instead write a new copy - of that data. When a Realm refreshes it updates to the latest version of the - data and releases the old versions, allowing them to be overwritten by - subsequent write transactions. - - Under normal circumstances this is not a problem, but if the number of active - versions grow too large, it will have a negative effect on the filesize on - disk. This can happen when performing writes on many different threads at - once, when holding on to frozen objects for an extended time, or when - performing long operations on background threads which do not allow the Realm - to refresh. - - Setting this property to a non-zero value makes it so that exceeding the set - number of versions will instead throw an exception. This can be used with a - low value during development to help identify places that may be problematic, - or in production use to cause the app to crash rather than produce a Realm - file which is too large to be opened. - - */ -@property (nonatomic) NSUInteger maximumNumberOfActiveVersions; - -/** - When opening the Realm for the first time, instead of creating an empty file, - the Realm file will be copied from the provided seed file path and used instead. - This can be used to open a Realm file with pre-populated data. - - If a realm file already exists at the configuration's destination path, the seed file - will not be copied and the already existing realm will be opened instead. - - Note that to use this parameter with a synced Realm configuration - the seed Realm must be appropriately copied to a destination with - `[RLMRealm writeCopyForConfiguration:]` first. - - This option is mutually exclusive with `inMemoryIdentifier`. Setting a `seedFilePath` - will nil out the `inMemoryIdentifier`. - */ -@property (nonatomic, copy, nullable) NSURL *seedFilePath; - -/** - A configuration object representing configuration state for Realms intended - to sync with Atlas Device Sync. - - This property is mutually exclusive with both `inMemoryIdentifier` and `fileURL`; - setting any one of the three properties will automatically nil out the other two. - - @see `RLMSyncConfiguration` - */ -@property (nullable, nonatomic) RLMSyncConfiguration *syncConfiguration; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMRealm_Dynamic.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMRealm_Dynamic.h deleted file mode 100644 index bea162775..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMRealm_Dynamic.h +++ /dev/null @@ -1,118 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import -#import - -@class RLMResults; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMRealm (Dynamic) - -#pragma mark - Getting Objects from a Realm - -/** - Returns all objects of a given type from the Realm. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. The preferred way to get objects of a single class is to use the class - methods on `RLMObject`. - - @param className The name of the `RLMObject` subclass to retrieve on (e.g. `MyClass.className`). - - @return An `RLMResults` containing all objects in the Realm of the given type. - - @see `+[RLMObject allObjects]` - */ -- (RLMResults *)allObjects:(NSString *)className; - -/** - Returns all objects matching the given predicate from the Realm. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. The preferred way to get objects of a single class is to use the class - methods on `RLMObject`. - - @param className The type of objects you are looking for (name of the class). - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` containing results matching the given predicate. - - @see `+[RLMObject objectsWhere:]` - */ -- (RLMResults *)objects:(NSString *)className where:(NSString *)predicateFormat, ...; - -/** - Returns all objects matching the given predicate from the Realm. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. The preferred way to get objects of a single class is to use the class - methods on `RLMObject`. - - @param className The type of objects you are looking for (name of the class). - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` containing results matching the given predicate. - - @see `+[RLMObject objectsWhere:]` - */ -- (RLMResults *)objects:(NSString *)className withPredicate:(NSPredicate *)predicate; - -/** - Returns the object of the given type with the given primary key from the Realm. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. The preferred way to get an object of a single class is to use the class - methods on `RLMObject`. - - @param className The class name for the object you are looking for. - @param primaryKey The primary key value for the object you are looking for. - - @return An object, or `nil` if an object with the given primary key does not exist. - - @see `+[RLMObject objectForPrimaryKey:]` - */ -- (nullable RLMObject *)objectWithClassName:(NSString *)className forPrimaryKey:(id)primaryKey; - -/** - Creates an `RLMObject` instance of type `className` in the Realm, and populates it using a given object. - - The `value` argument is used to populate the object. It can be a key-value coding compliant object, an array or - dictionary returned from the methods in `NSJSONSerialization`, or an array containing one element for each managed - property. An exception will be thrown if any required properties are not present and those properties were not defined - with default values. - - When passing in an array as the `value` argument, all properties must be present, valid and in the same order as the - properties defined in the model. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is recommended to - use `[RLMObject createInDefaultRealmWithValue:]`. - - @param value The value used to populate the object. - - @return An `RLMObject` instance of type `className`. - */ --(RLMObject *)createObject:(NSString *)className withValue:(id)value; - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMResults.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMResults.h deleted file mode 100644 index 5911e666a..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMResults.h +++ /dev/null @@ -1,567 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObject; - -/** - `RLMResults` is an auto-updating container type in Realm returned from object - queries. It represents the results of the query in the form of a collection of objects. - - `RLMResults` can be queried using the same predicates as `RLMObject` and `RLMArray`, - and you can chain queries to further filter results. - - `RLMResults` always reflect the current state of the Realm on the current thread, - including during write transactions on the current thread. The one exception to - this is when using `for...in` fast enumeration, which will always enumerate - over the objects which matched the query when the enumeration is begun, even if - some of them are deleted or modified to be excluded by the filter during the - enumeration. - - `RLMResults` are lazily evaluated the first time they are accessed; they only - run queries when the result of the query is requested. This means that - chaining several temporary `RLMResults` to sort and filter your data does not - perform any extra work processing the intermediate state. - - Once the results have been evaluated or a notification block has been added, - the results are eagerly kept up-to-date, with the work done to keep them - up-to-date done on a background thread whenever possible. - - `RLMResults` cannot be directly instantiated. - */ -@interface RLMResults : NSObject - -#pragma mark - Properties - -/** - The number of objects in the results collection. - */ -@property (nonatomic, readonly, assign) NSUInteger count; - -/** - The type of the objects in the results collection. - */ -@property (nonatomic, readonly, assign) RLMPropertyType type; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readwrite, getter = isOptional) BOOL optional; - -/** - The class name of the objects contained in the results collection. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages this results collection. - */ -@property (nonatomic, readonly) RLMRealm *realm; - -/** - Indicates if the results collection is no longer valid. - - The results collection becomes invalid if `invalidate` is called on the containing `realm`. - An invalidated results collection can be accessed, but will always be empty. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -#pragma mark - Accessing Objects from an RLMResults - -/** - Returns the object at the index specified. - - @param index The index to look up. - - @return An object of the type contained in the results collection. - */ -- (RLMObjectType)objectAtIndex:(NSUInteger)index; - -/** - Returns an array containing the objects in the results at the indexes specified by a given index set. - `nil` will be returned if the index set contains an index out of the arrays bounds. - - @param indexes The indexes in the results to retrieve objects from. - - @return The objects at the specified indexes. - */ -- (nullable NSArray *)objectsAtIndexes:(NSIndexSet *)indexes; - -/** - Returns the first object in the results collection. - - Returns `nil` if called on an empty results collection. - - @return An object of the type contained in the results collection. - */ -- (nullable RLMObjectType)firstObject; - -/** - Returns the last object in the results collection. - - Returns `nil` if called on an empty results collection. - - @return An object of the type contained in the results collection. - */ -- (nullable RLMObjectType)lastObject; - -#pragma mark - Querying Results - -/** - Returns the index of an object in the results collection. - - Returns `NSNotFound` if the object is not found in the results collection. - - @param object An object (of the same type as returned from the `objectClassName` selector). - */ -- (NSUInteger)indexOfObject:(RLMObjectType)object; - -/** - Returns the index of the first object in the results collection matching the predicate. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return The index of the object, or `NSNotFound` if the object is not found in the results collection. - */ -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns the index of the first object in the results collection matching the predicate. - - @param predicate The predicate with which to filter the objects. - - @return The index of the object, or `NSNotFound` if the object is not found in the results collection. - */ -- (NSUInteger)indexOfObjectWithPredicate:(NSPredicate *)predicate; - -/** - Returns all the objects matching the given predicate in the results collection. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` of objects that match the given predicate. - */ -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all the objects matching the given predicate in the results collection. - - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` of objects that match the given predicate. - */ -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/** - Returns a sorted `RLMResults` from an existing results collection. - - @param keyPath The key path to sort by. - @param ascending The direction to sort in. - - @return An `RLMResults` sorted by the specified key path. - */ -- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a sorted `RLMResults` from an existing results collection. - - @param properties An array of `RLMSortDescriptor`s to sort by. - - @return An `RLMResults` sorted by the specified properties. - */ -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/** - Returns a distinct `RLMResults` from an existing results collection. - - @param keyPaths The key paths used produce distinct results - - @return An `RLMResults` made distinct based on the specified key paths - */ -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -#pragma mark - Notifications - -/** - Registers a block to be called each time the results collection changes. - - The block will be asynchronously called with the initial results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the results collection were added, removed or modified. If a - write transaction did not modify any objects in the results collection, - the block is not called at all. See the `RLMCollectionChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - At the time when the block is called, the `RLMResults` object will be fully - evaluated and up-to-date, and as long as you do not perform a write transaction - on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will - never perform blocking work. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - NSLog(@"dogs.count: %zu", dogs.count); // => 0 - self.token = [results addNotificationBlock:^(RLMResults *dogs, - RLMCollectionChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - - @param block The block to be called whenever a change occurs. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the results collection changes. - - The block will be asynchronously called with the initial results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the results collection were added, removed or modified. If a - write transaction did not modify any objects in the results collection, - the block is not called at all. See the `RLMCollectionChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - At the time when the block is called, the `RLMResults` object will be fully - evaluated and up-to-date, and as long as you do not perform a write transaction - on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will - never perform blocking work. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the results collection changes. - - The block will be asynchronously called with the initial results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the results collection were added, removed or modified. If a - write transaction did not modify any objects in the results collection, - the block is not called at all. See the `RLMCollectionChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - At the time when the block is called, the `RLMResults` object will be fully - evaluated and up-to-date, and as long as you do not perform a write transaction - on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will - never perform blocking work. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the results collection changes. - - The block will be asynchronously called with the initial results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the results collection were added, removed or modified. If a - write transaction did not modify any objects in the results collection, - the block is not called at all. See the `RLMCollectionChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - At the time when the block is called, the `RLMResults` object will be fully - evaluated and up-to-date, and as long as you do not perform a write transaction - on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will - never perform blocking work. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths -__attribute__((warn_unused_result)); -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the objects - represented by the results collection. - - NSNumber *min = [results minOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose minimum value is desired. Only properties of types `int`, `float`, `double`, and - `NSDate` are supported. - - @return The minimum value of the property, or `nil` if the Results are empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects represented by the results collection. - - NSNumber *max = [results maxOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose maximum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The maximum value of the property, or `nil` if the Results are empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of the values of a given property over all the objects represented by the results collection. - - NSNumber *sum = [results sumOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose values should be summed. Only properties of - types `int`, `float`, and `double` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects represented by the results collection. - - NSNumber *average = [results averageOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose average value should be calculated. Only - properties of types `int`, `float`, and `double` are supported. - - @return The average value of the given property, or `nil` if the Results are empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -/// :nodoc: -- (RLMObjectType)objectAtIndexedSubscript:(NSUInteger)index; - -#pragma mark - Sectioned Results - -/** - Sorts and sections this collection from a given property key path, returning the result - as an instance of `RLMSectionedResults`. - - @param keyPath The property key path to sort on. - @param ascending The direction to sort in. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsSortedUsingKeyPath:(NSString *)keyPath - ascending:(BOOL)ascending - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -/** - Sorts and sections this collection from a given array of sort descriptors, returning the result - as an instance of `RLMSectionedResults`. - - @param sortDescriptors An array of `RLMSortDescriptor`s to sort by. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @note The primary sort descriptor must be responsible for determining the section key. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsUsingSortDescriptors:(NSArray *)sortDescriptors - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -#pragma mark - Freeze - -/** - Indicates if the result are frozen. - - Frozen Results are immutable and can be accessed from any thread.The objects - read from a frozen Results will also be frozen. - */ -@property (nonatomic, readonly, getter=isFrozen) BOOL frozen; - -/** - Returns a frozen (immutable) snapshot of these results. - - The frozen copy is an immutable collection which contains the same data as - this collection currently contains, but will not update when writes are made - to the containing Realm. Unlike live Results, frozen Results can be accessed - from any thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning Holding onto a frozen collection for an extended period while - performing write transaction on the Realm may result in the Realm - file growing to large sizes. See - `RLMRealmConfiguration.maximumNumberOfActiveVersions` for more - information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -#pragma mark - Unavailable Methods - -/** - `-[RLMResults init]` is not available because `RLMResults` cannot be created directly. - `RLMResults` can be obtained by querying a Realm. - */ -- (instancetype)init __attribute__((unavailable("RLMResults cannot be created directly"))); - -/** - `+[RLMResults new]` is not available because `RLMResults` cannot be created directly. - `RLMResults` can be obtained by querying a Realm. - */ -+ (instancetype)new __attribute__((unavailable("RLMResults cannot be created directly"))); - -@end - -/** - `RLMLinkingObjects` is an auto-updating container type. It represents a collection of objects that link to its - parent object. - - For more information, please see the "Inverse Relationships" section in the - [documentation](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/relationships/#relationships). - */ -@interface RLMLinkingObjects : RLMResults -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMSchema.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMSchema.h deleted file mode 100644 index fe46f6d47..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMSchema.h +++ /dev/null @@ -1,78 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectSchema; - -/** - `RLMSchema` instances represent collections of model object schemas managed by a Realm. - - When using Realm, `RLMSchema` instances allow performing migrations and - introspecting the database's schema. - - Schemas map to collections of tables in the core database. - */ -RLM_SWIFT_SENDABLE // not actually immutable, but the public API kinda is -@interface RLMSchema : NSObject - -#pragma mark - Properties - -/** - An `NSArray` containing `RLMObjectSchema`s for all object types in the Realm. - - This property is intended to be used during migrations for dynamic introspection. - - @see `RLMObjectSchema` - */ -@property (nonatomic, readonly, copy) NSArray *objectSchema; - -#pragma mark - Methods - -/** - Returns an `RLMObjectSchema` for the given class name in the schema. - - @param className The object class name. - @return An `RLMObjectSchema` for the given class in the schema. - - @see `RLMObjectSchema` - */ -- (nullable RLMObjectSchema *)schemaForClassName:(NSString *)className; - -/** - Looks up and returns an `RLMObjectSchema` for the given class name in the Realm. - - If there is no object of type `className` in the schema, an exception will be thrown. - - @param className The object class name. - @return An `RLMObjectSchema` for the given class in this Realm. - - @see `RLMObjectSchema` - */ -- (RLMObjectSchema *)objectForKeyedSubscript:(NSString *)className; - -/** - Returns whether two `RLMSchema` instances are equivalent. - */ -- (BOOL)isEqualToSchema:(RLMSchema *)schema; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMSectionedResults.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMSectionedResults.h deleted file mode 100644 index 4ee236b94..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMSectionedResults.h +++ /dev/null @@ -1,921 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2022 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@protocol RLMValue; -@class RLMResults; - -/** - A `RLMSectionedResultsChange` object encapsulates information about changes to sectioned - results that are reported by Realm notifications. - - `RLMSectionedResultsChange` is passed to the notification blocks registered with - `-addNotificationBlock` on `RLMSectionedResults`, and reports what sections and rows in the - collection changed since the last time the notification block was called. - - A complete example of updating a `UITableView` named `tv`: - - [tv beginUpdates]; - [tv deleteRowsAtIndexPaths:changes.deletions withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv insertRowsAtIndexPaths:changes.insertions withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv reloadRowsAtIndexPaths:changes.modifications withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv insertSections:changes.sectionsToInsert withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv deleteSections:changes.sectionsToRemove withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv endUpdates]; - - All of the arrays in an `RLMSectionedResultsChange` are always sorted in ascending order. - */ -@interface RLMSectionedResultsChange : NSObject -/// The index paths of objects in the previous version of the collection which have -/// been removed from this one. -@property (nonatomic, readonly) NSArray *deletions; -/// The index paths in the new version of the collection which were newly inserted. -@property (nonatomic, readonly) NSArray *insertions; -/// The index paths in the old version of the collection which were modified. -@property (nonatomic, readonly) NSArray *modifications; -/// The indices of the sections to be inserted. -@property (nonatomic, readonly) NSIndexSet *sectionsToInsert; -/// The indices of the sections to be removed. -@property (nonatomic, readonly) NSIndexSet *sectionsToRemove; -/// Returns the index paths of the deletion indices in the given section. -- (NSArray *)deletionsInSection:(NSUInteger)section; -/// Returns the index paths of the insertion indices in the given section. -- (NSArray *)insertionsInSection:(NSUInteger)section; -/// Returns the index paths of the modification indices in the given section. -- (NSArray *)modificationsInSection:(NSUInteger)section; -@end - - -/// The `RLMSectionedResult` protocol defines properties and methods common to both `RLMSectionedResults and RLMSection` -@protocol RLMSectionedResult - -#pragma mark - Object Access - -/// The count of objects in the collection. -@property (nonatomic, readonly) NSUInteger count; -/// Returns the object for a given index in the collection. -- (id)objectAtIndexedSubscript:(NSUInteger)index; -/// Returns the object for a given index in the collection. -- (id)objectAtIndex:(NSUInteger)index; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this collection. - - The frozen copy is an immutable collection which contains the same data as this - collection currently contains, but will not update when writes are made to the - containing Realm. Unlike live arrays, frozen collections can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning Holding onto a frozen collection for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; -/** - Indicates if the underlying collection is frozen. - - Frozen collections are immutable and can be accessed from any thread. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Sectioned Results Notifications - -/** - Registers a block to be called each time the collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` / `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(id, RLMSectionedResultsChange *))block __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` / `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(id, RLMSectionedResultsChange *))block - queue:(dispatch_queue_t)queue __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` / `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(id, RLMSectionedResultsChange *))block - keyPaths:(NSArray *)keyPaths __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` / `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(id, RLMSectionedResultsChange *))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue __attribute__((warn_unused_result)); - -@end - -/// An RLMSection contains the objects which belong to a specified section key. -@interface RLMSection, RLMObjectType> : NSObject -/// The value that represents the key in this section. -@property (nonatomic, readonly) RLMKeyType key; -/// The count of objects in the section. -@property (nonatomic, readonly) NSUInteger count; -/// Returns the object for a given index in the section. -- (RLMObjectType)objectAtIndexedSubscript:(NSUInteger)index; -/// Returns the object for a given index in the section. -- (RLMObjectType)objectAtIndex:(NSUInteger)index; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this section. - - The frozen copy is an immutable section which contains the same data as this - section currently contains, but will not update when writes are made to the - containing Realm. Unlike live arrays, frozen collections can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning Holding onto a frozen section for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; -/** - Returns a live version of this frozen section. - - This method resolves a reference to a live copy of the same frozen section. - If called on a live section, will return itself. -*/ -- (instancetype)thaw; -/** - Indicates if the underlying section is frozen. - - Frozen sections are immutable and can be accessed from any thread. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Section Notifications - -/** - Registers a block to be called each time the section changes. - - The block will be asynchronously called with the initial section, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - RLMSection *section = sectionedResults[0] // section with dogs aged '5' already exists. - - self.token = [section addNotificationBlock:^(RLMSection *section, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"section.count: %zu", section.count); // => 2 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSection *, RLMSectionedResultsChange *))block __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the section changes. - - The block will be asynchronously called with the initial section, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - RLMSection *section = sectionedResults[0] // section with dogs aged '5' already exists. - - self.token = [section addNotificationBlock:^(RLMSection *section, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"section.count: %zu", section.count); // => 2 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSection *, RLMSectionedResultsChange *))block - queue:(dispatch_queue_t)queue __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the section changes. - - The block will be asynchronously called with the initial section, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - RLMSection *section = sectionedResults[0] // section with dogs aged '5' already exists. - - self.token = [section addNotificationBlock:^(RLMSection *section, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"section.count: %zu", section.count); // => 2 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSection *, RLMSectionedResultsChange *))block - keyPaths:(NSArray *)keyPaths __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the section changes. - - The block will be asynchronously called with the initial section, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - RLMSection *section = sectionedResults[0] // section with dogs aged '5' already exists. - - self.token = [section addNotificationBlock:^(RLMSection *section, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"section.count: %zu", section.count); // => 2 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSection *, RLMSectionedResultsChange *))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue __attribute__((warn_unused_result)); -@end - -/// A lazily evaluated collection that holds elements in sections determined by a section key. -@interface RLMSectionedResults, RLMObjectType: id> : NSObject -/// An array of all keys in the sectioned results collection. -@property (nonatomic) NSArray *allKeys; -/// The total amount of sections in this collection. -@property (nonatomic, readonly, assign) NSUInteger count; -/// Returns the section at a given index. -- (RLMSection *)objectAtIndexedSubscript:(NSUInteger)index; -/// Returns the section at a given index. -- (RLMSection *)objectAtIndex:(NSUInteger)index; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this sectioned results collection. - - The frozen copy is an immutable sectioned results collection which contains the same data as this - sectioned results collection currently contains, but will not update when writes are made to the - containing Realm. Unlike live sectioned results collections, frozen sectioned results collection - can be accessed from any thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning Holding onto a frozen sectioned results collection for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; -/** - Returns a live version of this frozen sectioned results collection. - - This method resolves a reference to a live copy of the same frozen sectioned results collection. - If called on a live section, will return itself. -*/ -- (instancetype)thaw; -/** - Indicates if the underlying sectioned results collection is frozen. - - Frozen sectioned results collections are immutable and can be accessed from any thread. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Sectioned Results Notifications - -/** - Registers a block to be called each time the sectioned results collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSectionedResults *, RLMSectionedResultsChange *))block __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the sectioned results collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSectionedResults *, RLMSectionedResultsChange *))block - queue:(dispatch_queue_t)queue __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the sectioned results collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSectionedResults *, RLMSectionedResultsChange *))block - keyPaths:(NSArray *)keyPaths __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the sectioned results collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSectionedResults *, RLMSectionedResultsChange *))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue __attribute__((warn_unused_result)); -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMSet.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMSet.h deleted file mode 100644 index fead2e005..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMSet.h +++ /dev/null @@ -1,535 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObject, RLMResults; - -/** - A collection datatype used for storing distinct objects. - - - Note: - `RLMSet` supports storing primitive and `RLMObject` types. `RLMSet` does not support storing - Embedded Realm Objects. - */ -@interface RLMSet : NSObject - -#pragma mark - Properties - -/** - The number of objects in the set. - */ -@property (nonatomic, readonly, assign) NSUInteger count; - -/** - The type of the objects in the set. - */ -@property (nonatomic, readonly, assign) RLMPropertyType type; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readonly, getter = isOptional) BOOL optional; - -/** - The objects in the RLMSet as an NSArray value. - */ -@property (nonatomic, readonly) NSArray *allObjects; - -/** - The class name of the objects contained in the set. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages the set. Returns `nil` for unmanaged set. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - Indicates if the set can no longer be accessed. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if the set is frozen. - - Frozen sets are immutable and can be accessed from any thread. Frozen sets - are created by calling `-freeze` on a managed live set. Unmanaged sets are - never frozen. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Adding, Removing, and Replacing Objects in a Set - -/** - Adds an object to the set if it is not already present. - - @warning This method may only be called during a write transaction. - - @param object An object of the type contained in the set. - */ -- (void)addObject:(RLMObjectType)object; - -/** - Adds an array of distinct objects to the set. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable object such as `NSArray`, `NSSet` or `RLMResults` which contains objects of the - same class as the set. - */ -- (void)addObjects:(id)objects; - -/** - Removes a given object from the set. - - @warning This method may only be called during a write transaction. - - @param object The object in the set that you want to remove. - */ -- (void)removeObject:(RLMObjectType)object; - -/** - Removes all objects from the set. - - @warning This method may only be called during a write transaction. - */ -- (void)removeAllObjects; - -/** - Empties the receiving set, then adds each object contained in another given set. - - @warning This method may only be called during a write transaction. - - @param set The RLMSet whose members replace the receiving set's content. - */ -- (void)setSet:(RLMSet *)set; - -/** - Removes from the receiving set each object that isn’t a member of another given set. - - @warning This method may only be called during a write transaction. - - @param set The RLMSet with which to perform the intersection. - */ -- (void)intersectSet:(RLMSet *)set; - -/** - Removes each object in another given set from the receiving set, if present. - - @warning This method may only be called during a write transaction. - - @param set The set of objects to remove from the receiving set. - */ -- (void)minusSet:(RLMSet *)set; - -/** - Adds each object in another given set to the receiving set, if not present. - - @warning This method may only be called during a write transaction. - - @param set The set of objects to add to the receiving set. - */ -- (void)unionSet:(RLMSet *)set; - -#pragma mark - Querying a Set - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/// :nodoc: -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/// :nodoc: -- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/// :nodoc: -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/// :nodoc: -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -/** - Returns a Boolean value that indicates whether at least one object in the receiving set is also present in another given set. - - @param set The RLMSet to compare the receiving set to. - - @return YES if at least one object in the receiving set is also present in otherSet, otherwise NO. - */ -- (BOOL)intersectsSet:(RLMSet *)set; - -/** - Returns a Boolean value that indicates whether every object in the receiving set is also present in another given set. - - @param set The RLMSet to compare the receiving set to. - - @return YES if every object in the receiving set is also present in otherSet, otherwise NO. - */ -- (BOOL)isSubsetOfSet:(RLMSet *)set; - -/** - Returns a Boolean value that indicates whether a given object is present in the set. - - @param anObject An object to look for in the set. - - @return YES if anObject is present in the set, otherwise NO. - */ -- (BOOL)containsObject:(RLMObjectType)anObject; - -/** - Compares the receiving set to another set. - - @param otherSet The set with which to compare the receiving set. - - @return YES if the contents of otherSet are equal to the contents of the receiving set, otherwise NO. - */ -- (BOOL)isEqualToSet:(RLMSet *)otherSet; - -#pragma mark - Sectioning a Set - -/** - Sorts and sections this collection from a given property key path, returning the result - as an instance of `RLMSectionedResults`. - - @param keyPath The property key path to sort on. - @param ascending The direction to sort in. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsSortedUsingKeyPath:(NSString *)keyPath - ascending:(BOOL)ascending - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -/** - Sorts and sections this collection from a given array of sort descriptors, returning the result - as an instance of `RLMSectionedResults`. - - @param sortDescriptors An array of `RLMSortDescriptor`s to sort by. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @note The primary sort descriptor must be responsible for determining the section key. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsUsingSortDescriptors:(NSArray *)sortDescriptors - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - - -#pragma mark - Notifications - -/** - Registers a block to be called each time the set changes. - - The block will be asynchronously called with the initial set, and then - called again after each write transaction which changes any of the objects in - the set, which objects are in the results, or the order of the objects in the - set. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the set were added, removed or modified. If a write transaction - did not modify any objects in the set, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - Person *person = [[Person allObjectsInRealm:realm] firstObject]; - NSLog(@"person.dogs.count: %zu", person.dogs.count); // => 0 - self.token = [person.dogs addNotificationBlock(RLMSet *dogs, - RLMCollectionChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count) // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - [person.dogs addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a non-frozen managed set. - - @param block The block to be called each time the set changes. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSet *_Nullable set, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the set changes. - - The block will be asynchronously called with the initial set, and then - called again after each write transaction which changes any of the objects in - the set, which objects are in the results, or the order of the objects in the - set. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the set were added, removed or modified. If a write transaction - did not modify any objects in the set, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSet *_Nullable set, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the set changes. - - The block will be asynchronously called with the initial set, and then - called again after each write transaction which changes any of the objects in - the set, which objects are in the results, or the order of the objects in the - set. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the set were added, removed or modified. If a write transaction - did not modify any objects in the set, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSet *_Nullable set, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the set changes. - - The block will be asynchronously called with the initial set, and then - called again after each write transaction which changes any of the objects in - the set, which objects are in the results, or the order of the objects in the - set. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the set were added, removed or modified. If a write transaction - did not modify any objects in the set, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSet *_Nullable set, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths -__attribute__((warn_unused_result)); - -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the objects in the set. - - NSNumber *min = [object.setProperty minOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, `RLMSet`, and `NSData` properties. - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The minimum value of the property, or `nil` if the set is empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects in the set. - - NSNumber *max = [object.setProperty maxOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, `RLMSet`, and `NSData` properties. - - @param property The property whose maximum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The maximum value of the property, or `nil` if the set is empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of distinct values of a given property over all the objects in the set. - - NSNumber *sum = [object.setProperty sumOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, `RLMSet and `NSData` properties. - - @param property The property whose values should be summed. Only properties of - types `int`, `float`, and `double` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects in the set. - - NSNumber *average = [object.setProperty averageOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMSet`, `RLMArray`, and `NSData` properties. - - @param property The property whose average value should be calculated. Only - properties of types `int`, `float`, and `double` are supported. - - @return The average value of the given property, or `nil` if the set is empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this set. - - The frozen copy is an immutable set which contains the same data as this - et currently contains, but will not update when writes are made to the - containing Realm. Unlike live sets, frozen sets can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a managed set. - @warning Holding onto a frozen set for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -#pragma mark - Unavailable Methods - -/** - `-[RLMSet init]` is not available because `RLMSet`s cannot be created directly. - ``RLMSet` properties on `RLMObject`s are lazily created when accessed. - */ -- (instancetype)init __attribute__((unavailable("RLMSets cannot be created directly"))); - -/** - `+[RLMSet new]` is not available because `RLMSet`s cannot be created directly. - `RLMSet` properties on `RLMObject`s are lazily created when accessed. - */ -+ (instancetype)new __attribute__((unavailable("RLMSet cannot be created directly"))); - -@end - -/// :nodoc: -@interface RLMSet (Swift) -// for use only in Swift class definitions -- (instancetype)initWithObjectClassName:(NSString *)objectClassName; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMSwiftObject.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMSwiftObject.h deleted file mode 100644 index 7ea764016..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMSwiftObject.h +++ /dev/null @@ -1,142 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) -/** - `Object` is a class used to define Realm model objects. - - In Realm you define your model classes by subclassing `Object` and adding properties to be managed. - You then instantiate and use your custom subclasses instead of using the `Object` class directly. - - ```swift - class Dog: Object { - @objc dynamic var name: String = "" - @objc dynamic var adopted: Bool = false - let siblings = List() - } - ``` - - ### Supported property types - - - `String`, `NSString` - - `Int` - - `Int8`, `Int16`, `Int32`, `Int64` - - `Float` - - `Double` - - `Bool` - - `Date`, `NSDate` - - `Data`, `NSData` - - `Decimal128` - - `ObjectId` - - `@objc enum` which has been delcared as conforming to `RealmEnum`. - - `RealmOptional` for optional numeric properties - - `Object` subclasses, to model many-to-one relationships - - `EmbeddedObject` subclasses, to model owning one-to-one relationships - - `List`, to model many-to-many relationships - - `String`, `NSString`, `Date`, `NSDate`, `Data`, `NSData`, `Decimal128`, and `ObjectId` properties - can be declared as optional. `Object` and `EmbeddedObject` subclasses *must* be declared as optional. - `Int`, `Int8`, `Int16`, `Int32`, `Int64`, `Float`, `Double`, `Bool`, enum, and `List` properties cannot. - To store an optional number, use `RealmOptional`, `RealmOptional`, `RealmOptional`, or - `RealmOptional` instead, which wraps an optional numeric value. Lists cannot be optional at all. - - All property types except for `List` and `RealmOptional` *must* be declared as `@objc dynamic var`. `List` and - `RealmOptional` properties must be declared as non-dynamic `let` properties. Swift `lazy` properties are not allowed. - - Note that none of the restrictions listed above apply to properties that are configured to be ignored by Realm. - - ### Querying - - You can retrieve all objects of a given type from a Realm by calling the `objects(_:)` instance method. - - ### Relationships - - See our [Objective-C guide](https://docs.mongodb.com/realm/sdk/swift/fundamentals/relationships/) for more details. - */ -@interface RealmSwiftObject : RLMObjectBase -@end - -/** - `EmbeddedObject` is a base class used to define embedded Realm model objects. - - Embedded objects work similarly to normal objects, but are owned by a single - parent Object (which itself may be embedded). Unlike normal top-level objects, - embedded objects cannot be directly created in or added to a Realm. Instead, - they can only be created as part of a parent object, or by assigning an - unmanaged object to a parent object's property. Embedded objects are - automatically deleted when the parent object is deleted or when the parent is - modified to no longer point at the embedded object, either by reassigning an - Object property or by removing the embedded object from the List containing it. - - Embedded objects can only ever have a single parent object which links to - them, and attempting to link to an existing managed embedded object will throw - an exception. - - The property types supported on `EmbeddedObject` are the same as for `Object`, - except for that embedded objects cannot link to top-level objects, so `Object` - and `List` properties are not supported (`EmbeddedObject` and - `List` *are*). - - Embedded objects cannot have primary keys or indexed properties. - - ```swift - class Owner: Object { - @objc dynamic var name: String = "" - let dogs = List() - } - class Dog: EmbeddedObject { - @objc dynamic var name: String = "" - @objc dynamic var adopted: Bool = false - let owner = LinkingObjects(fromType: Owner.self, property: "dogs") - } - ``` - */ -@interface RealmSwiftEmbeddedObject : RLMObjectBase -@end - -/** - `AsymmetricObject` is a base class used to define asymmetric Realm objects. - - Asymmetric objects can only be created using the `create(_ object:)` - function, and cannot be added, removed or queried. - When created, asymmetric objects will be synced unidirectionally to the MongoDB - database and cannot be accessed locally. - - Incoming links from any asymmetric table are not allowed, meaning embedding - an asymmetric object within an `Object` will throw an error. - - The property types supported on `AsymmetricObject` are the same as for `Object`, - except for that asymmetric objects can only link to embedded objects, so `Object` - and `List` properties are not supported (`EmbeddedObject` and - `List` *are*). - - ```swift - class Person: AsymmetricObject { - @Persisted(primaryKey: true) var _id: ObjectId = ObjectId.generate() - @Persisted var name: String - @Persisted var age: Int - } - ``` - */ -@interface RealmSwiftAsymmetricObject : RLMObjectBase -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMSwiftProperty.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMSwiftProperty.h deleted file mode 100644 index ea071927c..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMSwiftProperty.h +++ /dev/null @@ -1,71 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -@class RLMObjectBase, RLMArray, RLMSet; - -#ifdef __cplusplus -extern "C" { -#endif - -RLM_HEADER_AUDIT_BEGIN(nullability) - -#define REALM_FOR_EACH_SWIFT_PRIMITIVE_TYPE(macro) \ - macro(bool, Bool, bool) \ - macro(double, Double, double) \ - macro(float, Float, float) \ - macro(int64_t, Int64, int) - -#define REALM_FOR_EACH_SWIFT_OBJECT_TYPE(macro) \ - macro(NSString, String, string) \ - macro(NSDate, Date, date) \ - macro(NSData, Data, data) \ - macro(NSUUID, UUID, uuid) \ - macro(RLMDecimal128, Decimal128, decimal128) \ - macro(RLMObjectId, ObjectId, objectId) - -#define REALM_SWIFT_PROPERTY_ACCESSOR(objc, swift, rlmtype) \ - objc RLMGetSwiftProperty##swift(RLMObjectBase *, uint16_t); \ - objc RLMGetSwiftProperty##swift##Optional(RLMObjectBase *, uint16_t, bool *); \ - void RLMSetSwiftProperty##swift(RLMObjectBase *, uint16_t, objc); -REALM_FOR_EACH_SWIFT_PRIMITIVE_TYPE(REALM_SWIFT_PROPERTY_ACCESSOR) -#undef REALM_SWIFT_PROPERTY_ACCESSOR - -#define REALM_SWIFT_PROPERTY_ACCESSOR(objc, swift, rlmtype) \ - objc *_Nullable RLMGetSwiftProperty##swift(RLMObjectBase *, uint16_t); \ - void RLMSetSwiftProperty##swift(RLMObjectBase *, uint16_t, objc *_Nullable); -REALM_FOR_EACH_SWIFT_OBJECT_TYPE(REALM_SWIFT_PROPERTY_ACCESSOR) -#undef REALM_SWIFT_PROPERTY_ACCESSOR - -id _Nullable RLMGetSwiftPropertyAny(RLMObjectBase *, uint16_t); -void RLMSetSwiftPropertyAny(RLMObjectBase *, uint16_t, id); -RLMObjectBase *_Nullable RLMGetSwiftPropertyObject(RLMObjectBase *, uint16_t); -void RLMSetSwiftPropertyNil(RLMObjectBase *, uint16_t); -void RLMSetSwiftPropertyObject(RLMObjectBase *, uint16_t, RLMObjectBase *_Nullable); - -RLMArray *_Nonnull RLMGetSwiftPropertyArray(RLMObjectBase *obj, uint16_t); -RLMSet *_Nonnull RLMGetSwiftPropertySet(RLMObjectBase *obj, uint16_t); -RLMDictionary *_Nonnull RLMGetSwiftPropertyMap(RLMObjectBase *obj, uint16_t); - -RLM_HEADER_AUDIT_END(nullability) - -#ifdef __cplusplus -} // extern "C" -#endif diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMSyncConfiguration.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMSyncConfiguration.h deleted file mode 100644 index 54ea2ecfc..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMSyncConfiguration.h +++ /dev/null @@ -1,196 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -@class RLMApp; -@class RLMRealm; -@class RLMRealmConfiguration; -@class RLMUser; -@protocol RLMBSON; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** Determines file behavior during a client reset. - - @see: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ -*/ -typedef NS_ENUM(NSUInteger, RLMClientResetMode) { - /// The local copy of the Realm is copied into a recovery - /// directory for safekeeping, and then deleted from the original location. The next time - /// the Realm for that partition value is opened, the Realm will automatically be re-downloaded from - /// Atlas App Services, and can be used as normal. - - /// Data written to the Realm after the local copy of the Realm diverged from the backup - /// remote copy will be present in the local recovery copy of the Realm file. The - /// re-downloaded Realm will initially contain only the data present at the time the Realm - /// was backed up on the server. - /// - /// @see: ``rlmSync_clientResetBackedUpRealmPath`` and ``RLMSyncErrorActionToken`` for more information on accessing the recovery directory and error information. - /// - /// The manual client reset mode handler can be set in two places: - /// 1. As an ErrorReportingBlock argument at ``RLMSyncConfiguration.manualClientResetHandler``. - /// 2. As an ErrorReportingBlock in the ``RLMSyncManager.errorHandler`` property. - /// @see: ``RLMSyncManager.errorHandler`` - /// - /// When an ``RLMSyncErrorClientResetError`` is thrown, the following rules determine which block is executed: - /// - If an error reporting block is set in ``.manualClientResetHandler`` and the ``RLMSyncManager.errorHandler``, the ``.manualClientResetHandler`` block will be executed. - /// - If an error reporting block is set in either the ``.manualClientResetHandler`` or the ``RLMSyncManager``, but not both, the single block will execute. - /// - If no block is set in either location, the client reset will not be handled. The application will likely need to be restarted and unsynced local changes may be lost. - /// @note: The ``RLMSyncManager.errorHandler`` is still invoked under all ``RLMSyncError``s *other than* ``RLMSyncErrorClientResetError``. - /// @see ``RLMSyncError`` for an exhaustive list. - RLMClientResetModeManual = 0, - /// All unsynchronized local changes are automatically discarded and the local state is - /// automatically reverted to the most recent state from the server. Unsynchronized changes - /// can then be recovered in the post-client-reset callback block. - /// - /// If ``RLMClientResetModeDiscardLocal`` is enabled but the client reset operation is unable to complete - /// then the client reset process reverts to manual mode. Example) During a destructive schema change this - /// mode will fail and invoke the manual client reset handler. - /// - /// The RLMClientResetModeDiscardLocal mode supports two client reset callbacks -- ``RLMClientResetBeforeBlock``, ``RLMClientResetAfterBlock`` -- which can be passed as arguments when creating the ``RLMSyncConfiguration``. - /// @see: ``RLMClientResetAfterBlock`` and ``RLMClientResetBeforeBlock`` - RLMClientResetModeDiscardLocal __deprecated_enum_msg("Use RLMClientResetModeDiscardUnsyncedChanges") = 1, - /// All unsynchronized local changes are automatically discarded and the local state is - /// automatically reverted to the most recent state from the server. Unsynchronized changes - /// can then be recovered in the post-client-reset callback block. - /// - /// If ``RLMClientResetModeDiscardUnsyncedChanges`` is enabled but the client reset operation is unable to complete - /// then the client reset process reverts to manual mode. Example) During a destructive schema change this - /// mode will fail and invoke the manual client reset handler. - /// - /// The RLMClientResetModeDiscardUnsyncedChanges mode supports two client reset callbacks -- ``RLMClientResetBeforeBlock``, ``RLMClientResetAfterBlock`` -- which can be passed as arguments when creating the ``RLMSyncConfiguration``. - /// @see: ``RLMClientResetAfterBlock`` and ``RLMClientResetBeforeBlock`` - RLMClientResetModeDiscardUnsyncedChanges = 1, - /// The client device will download a realm realm which reflects the latest - /// state of the server after a client reset. A recovery process is run locally in - /// an attempt to integrate the server version with any local changes from - /// before the client reset occurred. - /// - /// The changes are integrated with the following rules: - /// 1. Objects created locally that were not synced before client reset will be integrated. - /// 2. If an object has been deleted on the server, but was modified on the client, the delete takes precedence and the update is discarded - /// 3. If an object was deleted on the client, but not the server, then the client delete instruction is applied. - /// 4. In the case of conflicting updates to the same field, the client update is applied. - /// - /// If the recovery integration fails, the client reset process falls back to ``RLMClientResetModeManual``. - /// The recovery integration will fail if the "Client Recovery" setting is not enabled on the server. - /// Integration may also fail in the event of an incompatible schema change. - /// - /// The RLMClientResetModeRecoverUnsyncedChanges mode supports two client reset callbacks -- ``RLMClientResetBeforeBlock``, ``RLMClientResetAfterBlock`` -- which can be passed as arguments when creating the ``RLMSyncConfiguration``. - /// @see: ``RLMClientResetAfterBlock`` and ``RLMClientResetBeforeBlock`` - RLMClientResetModeRecoverUnsyncedChanges = 2, - /// The client device will download a realm with objects reflecting the latest version of the server. A recovery - /// process is run locally in an attempt to integrate the server version with any local changes from before the - /// client reset occurred. - /// - /// The changes are integrated with the following rules: - /// 1. Objects created locally that were not synced before client reset will be integrated. - /// 2. If an object has been deleted on the server, but was modified on the client, the delete takes precedence and the update is discarded - /// 3. If an object was deleted on the client, but not the server, then the client delete instruction is applied. - /// 4. In the case of conflicting updates to the same field, the client update is applied. - /// - /// If the recovery integration fails, the client reset process falls back to ``RLMClientResetModeDiscardUnsyncedChanges``. - /// The recovery integration will fail if the "Client Recovery" setting is not enabled on the server. - /// Integration may also fail in the event of an incompatible schema change. - /// - /// The RLMClientResetModeRecoverOrDiscardUnsyncedChanges mode supports two client reset callbacks -- ``RLMClientResetBeforeBlock``, ``RLMClientResetAfterBlock`` -- which can be passed as arguments when creating the ``RLMSyncConfiguration``. - /// @see: ``RLMClientResetAfterBlock`` and ``RLMClientResetBeforeBlock`` - RLMClientResetModeRecoverOrDiscardUnsyncedChanges = 3 -}; - -/** - A block type used to report before a client reset will occur. - The `beforeFrozen` is a frozen copy of the local state prior to client reset. - */ -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMClientResetBeforeBlock)(RLMRealm * _Nonnull beforeFrozen); - -/** - A block type used to report after a client reset occurred. - The `beforeFrozen` argument is a frozen copy of the local state prior to client reset. - The `after` argument contains the local database state after the client reset occurred. - */ -RLM_SWIFT_SENDABLE // invoked on a backgroun thread -typedef void(^RLMClientResetAfterBlock)(RLMRealm * _Nonnull beforeFrozen, RLMRealm * _Nonnull after); - -/** - A configuration object representing configuration state for a Realm which is intended to sync with a Realm Object - Server. - */ -@interface RLMSyncConfiguration : NSObject - -/// The user to which the remote Realm belongs. -@property (nonatomic, readonly) RLMUser *user; - -/** - The value this Realm is partitioned on. The partition key is a property defined in - Atlas App Services. All classes with a property with this value will be synchronized to the - Realm. - */ -@property (nonatomic, readonly) id partitionValue; - -/** - An enum which determines file recovery behavior in the event of a client reset. - @note: Defaults to `RLMClientResetModeRecoverUnsyncedChanges` - - @see: `RLMClientResetMode` - @see: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ -*/ -@property (nonatomic) RLMClientResetMode clientResetMode; - -/** - A callback which notifies prior to prior to a client reset occurring. - @see: `RLMClientResetBeforeBlock` - */ -@property (nonatomic, nullable) RLMClientResetBeforeBlock beforeClientReset; - -/** - A callback which notifies after a client reset has occurred. - @see: `RLMClientResetAfterBlock` - */ -@property (nonatomic, nullable) RLMClientResetAfterBlock afterClientReset; - -/** - A callback that's executed when an `RLMSyncErrorClientResetError` is encountered. - @See RLMSyncErrorReportingBlock and RLMSyncErrorClientResetError for more - details on handling a client reset manually. - */ -@property (nonatomic, nullable) RLMSyncErrorReportingBlock manualClientResetHandler; - - -/** - Whether nonfatal connection errors should cancel async opens. - - By default, if a nonfatal connection error such as a connection timing out occurs, any currently pending asyncOpen operations will ignore the error and continue to retry until it succeeds. If this is set to true, the open will instead fail and report the error. - - NEXT-MAJOR: This should be true by default. - */ -@property (nonatomic) bool cancelAsyncOpenOnNonFatalErrors; - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("This type cannot be created directly"))); - -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("This type cannot be created directly"))); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMSyncManager.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMSyncManager.h deleted file mode 100644 index 1dee453d0..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMSyncManager.h +++ /dev/null @@ -1,223 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMSyncSession, RLMSyncTimeoutOptions, RLMAppConfiguration; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -// NEXT-MAJOR: This enum needs to be removed when access to the logger is removed -// from the sync manager. -/// An enum representing different levels of sync-related logging that can be configured. -typedef RLM_CLOSED_ENUM(NSUInteger, RLMSyncLogLevel) { - /// Nothing will ever be logged. - RLMSyncLogLevelOff, - /// Only fatal errors will be logged. - RLMSyncLogLevelFatal, - /// Only errors will be logged. - RLMSyncLogLevelError, - /// Warnings and errors will be logged. - RLMSyncLogLevelWarn, - /// Information about sync events will be logged. Fewer events will be logged in order to avoid overhead. - RLMSyncLogLevelInfo, - /// Information about sync events will be logged. More events will be logged than with `RLMSyncLogLevelInfo`. - RLMSyncLogLevelDetail, - /// Log information that can aid in debugging. - /// - /// - warning: Will incur a measurable performance impact. - RLMSyncLogLevelDebug, - /// Log information that can aid in debugging. More events will be logged than with `RLMSyncLogLevelDebug`. - /// - /// - warning: Will incur a measurable performance impact. - RLMSyncLogLevelTrace, - /// Log information that can aid in debugging. More events will be logged than with `RLMSyncLogLevelTrace`. - /// - /// - warning: Will incur a measurable performance impact. - RLMSyncLogLevelAll -}; - -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" -/// A log callback function which can be set on RLMSyncManager. -/// -/// The log function may be called from multiple threads simultaneously, and is -/// responsible for performing its own synchronization if any is required. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void (^RLMSyncLogFunction)(RLMSyncLogLevel level, NSString *message); -#pragma clang diagnostic pop - -/// A block type representing a block which can be used to report a sync-related error to the application. If the error -/// pertains to a specific session, that session will also be passed into the block. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMSyncErrorReportingBlock)(NSError *, RLMSyncSession * _Nullable); - -/** - A manager which serves as a central point for sync-related configuration. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMSyncManager : NSObject - -/** - A block which can optionally be set to report sync-related errors to your application. - - Any error reported through this block will be of the `RLMSyncError` type, and marked - with the `RLMSyncErrorDomain` domain. - - Errors reported through this mechanism are fatal, with several exceptions. Please consult - `RLMSyncError` for information about the types of errors that can be reported through - the block, and for for suggestions on handling recoverable error codes. - - @see `RLMSyncError` - */ -@property (nullable, atomic, copy) RLMSyncErrorReportingBlock errorHandler; - -/// :nodoc: -@property (nonatomic, copy) NSString *appID -__attribute__((deprecated("This property is not used for anything"))); - -/** - A string identifying this application which is included in the User-Agent - header of sync connections. By default, this will be the application's bundle - identifier. - - This property must be set prior to opening a synchronized Realm for the first - time. Any modifications made after opening a Realm will be ignored. - */ -@property (atomic, copy) NSString *userAgent; - -/** - The logging threshold which newly opened synced Realms will use. Defaults to - `RLMSyncLogLevelInfo`. - - By default logging strings are output to Apple System Logger. Set `logger` to - perform custom logging logic instead. - - @warning This property must be set before any synced Realms are opened. Setting it after - opening any synced Realm will do nothing. - */ -@property (atomic) RLMSyncLogLevel logLevel -__attribute__((deprecated("Use `RLMLogger.default.level`/`Logger.shared.level` to set/get the default logger threshold level."))); - -/** - The function which will be invoked whenever the sync client has a log message. - - If nil, log strings are output to Apple System Logger instead. - - @warning This property must be set before any synced Realms are opened. Setting - it after opening any synced Realm will do nothing. - */ -@property (atomic, nullable) RLMSyncLogFunction logger -__attribute__((deprecated("Use `RLMLogger.default`/`Logger.shared` to set/get the default logger."))); - -/** - The name of the HTTP header to send authorization data in when making requests to Atlas App Services which has - been configured to expect a custom authorization header. - */ -@property (nullable, atomic, copy) NSString *authorizationHeaderName; - -/** - Extra HTTP headers to append to every request to Atlas App Services. - - Modifying this property while sync sessions are active will result in all - sessions disconnecting and reconnecting using the new headers. - */ -@property (nullable, atomic, copy) NSDictionary *customRequestHeaders; - -/** - Options for the assorted types of connection timeouts for sync connections. - - If nil default values for all timeouts are used instead. - - @warning This property must be set before any synced Realms are opened. Setting - it after opening any synced Realm will do nothing. - */ -@property (nullable, atomic, copy) RLMSyncTimeoutOptions *timeoutOptions; - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("RLMSyncManager cannot be created directly"))); - -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("RLMSyncManager cannot be created directly"))); - -@end - -/** - Options for configuring timeouts and intervals in the sync client. - */ -@interface RLMSyncTimeoutOptions : NSObject -/// The maximum number of milliseconds to allow for a connection to -/// become fully established. This includes the time to resolve the -/// network address, the TCP connect operation, the SSL handshake, and -/// the WebSocket handshake. -/// -/// Defaults to 2 minutes. -@property (nonatomic) NSUInteger connectTimeout; - -/// The number of milliseconds to keep a connection open after all -/// sessions have been abandoned. -/// -/// After all synchronized Realms have been closed for a given server, the -/// connection is kept open until the linger time has expired to avoid the -/// overhead of reestablishing the connection when Realms are being closed and -/// reopened. -/// -/// Defaults to 30 seconds. -@property (nonatomic) NSUInteger connectionLingerTime; - -/// The number of milliseconds between each heartbeat ping message. -/// -/// The client periodically sends ping messages to the server to check if the -/// connection is still alive. Shorter periods make connection state change -/// notifications more responsive at the cost of battery life (as the antenna -/// will have to wake up more often). -/// -/// Defaults to 1 minute. -@property (nonatomic) NSUInteger pingKeepalivePeriod; - -/// How long in milliseconds to wait for a reponse to a heartbeat ping before -/// concluding that the connection has dropped. -/// -/// Shorter values will make connection state change notifications more -/// responsive as it will only change to `disconnected` after this much time has -/// elapsed, but overly short values may result in spurious disconnection -/// notifications when the server is simply taking a long time to respond. -/// -/// Defaults to 2 minutes. -@property (nonatomic) NSUInteger pongKeepaliveTimeout; - -/// The maximum amount of time, in milliseconds, since the loss of a -/// prior connection, for a new connection to be considered a "fast -/// reconnect". -/// -/// When a client first connects to the server, it defers uploading any local -/// changes until it has downloaded all changesets from the server. This -/// typically reduces the total amount of merging that has to be done, and is -/// particularly beneficial the first time that a specific client ever connects -/// to the server. -/// -/// When an existing client disconnects and then reconnects within the "fact -/// reconnect" time this is skipped and any local changes are uploaded -/// immediately without waiting for downloads, just as if the client was online -/// the whole time. -/// -/// Defaults to 1 minute. -@property (nonatomic) NSUInteger fastReconnectLimit; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMSyncSession.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMSyncSession.h deleted file mode 100644 index 31677ce9c..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMSyncSession.h +++ /dev/null @@ -1,234 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -/** - The current state of the session represented by a session object. - */ -typedef NS_ENUM(NSUInteger, RLMSyncSessionState) { - /// The sync session is actively communicating or attempting to communicate - /// with Atlas App Services. A session is considered Active even if - /// it is not currently connected. Check the connection state instead if you - /// wish to know if the connection is currently online. - RLMSyncSessionStateActive, - /// The sync session is not attempting to communicate with MongoDB - /// Realm due to the user logging out or synchronization being paused. - RLMSyncSessionStateInactive, - /// The sync session encountered a fatal error and is permanently invalid; it should be discarded. - RLMSyncSessionStateInvalid -}; - -/** - The current state of a sync session's connection. Sessions which are not in - the Active state will always be Disconnected. - */ -typedef NS_ENUM(NSUInteger, RLMSyncConnectionState) { - /// The sync session is not connected to the server, and is not attempting - /// to connect, either because the session is inactive or because it is - /// waiting to retry after a failed connection. - RLMSyncConnectionStateDisconnected, - /// The sync session is attempting to connect to Atlas App Services. - RLMSyncConnectionStateConnecting, - /// The sync session is currently connected to Atlas App Services. - RLMSyncConnectionStateConnected, -}; - -/** - The transfer direction (upload or download) tracked by a given progress notification block. - - Progress notification blocks can be registered on sessions if your app wishes to be informed - how many bytes have been uploaded or downloaded, for example to show progress indicator UIs. - */ -typedef RLM_CLOSED_ENUM(NSUInteger, RLMSyncProgressDirection) { - /// For monitoring upload progress. - RLMSyncProgressDirectionUpload, - /// For monitoring download progress. - RLMSyncProgressDirectionDownload, -}; - -/** - The desired behavior of a progress notification block. - - Progress notification blocks can be registered on sessions if your app wishes to be informed - how many bytes have been uploaded or downloaded, for example to show progress indicator UIs. - */ -typedef NS_ENUM(NSUInteger, RLMSyncProgressMode) { - /** - The block will be called indefinitely, or until it is unregistered by calling - `-[RLMProgressNotificationToken invalidate]`. - - Notifications will always report the latest number of transferred bytes, and the - most up-to-date number of total transferrable bytes. - */ - RLMSyncProgressModeReportIndefinitely, - /** - The block will, upon registration, store the total number of bytes - to be transferred. When invoked, it will always report the most up-to-date number - of transferrable bytes out of that original number of transferrable bytes. - - When the number of transferred bytes reaches or exceeds the - number of transferrable bytes, the block will be unregistered. - */ - RLMSyncProgressModeForCurrentlyOutstandingWork, -}; - -@class RLMUser, RLMSyncConfiguration, RLMSyncErrorActionToken, RLMSyncManager; - -/** - The type of a progress notification block intended for reporting a session's network - activity to the user. - - `transferredBytes` refers to the number of bytes that have been uploaded or downloaded. - `transferrableBytes` refers to the total number of bytes transferred, and pending transfer. - */ -typedef void(^RLMProgressNotificationBlock)(NSUInteger transferredBytes, NSUInteger transferrableBytes); - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A token object corresponding to a progress notification block on a session object. - - To stop notifications manually, call `-invalidate` on it. Notifications should be stopped before - the token goes out of scope or is destroyed. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMProgressNotificationToken : RLMNotificationToken -@end - -/** - An object encapsulating an Atlas App Services "session". Sessions represent the - communication between the client (and a local Realm file on disk), and the server - (and a remote Realm with a given partition value stored on Atlas App Services). - - Sessions are always created by the SDK and vended out through various APIs. The - lifespans of sessions associated with Realms are managed automatically. Session - objects can be accessed from any thread. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMSyncSession : NSObject - -/// The session's current state. -/// -/// This property is not KVO-compliant. -@property (nonatomic, readonly) RLMSyncSessionState state; - -/// The session's current connection state. -/// -/// This property is KVO-compliant and can be observed to be notified of changes. -/// Be warned that KVO observers for this property may be called on a background -/// thread. -@property (atomic, readonly) RLMSyncConnectionState connectionState; - -/// The user that owns this session. -- (nullable RLMUser *)parentUser; - -/** - If the session is valid, return a sync configuration that can be used to open the Realm - associated with this session. - */ -- (nullable RLMSyncConfiguration *)configuration; - -/** - Temporarily suspend syncronization and disconnect from the server. - - The session will not attempt to connect to Atlas App Services until `resume` - is called or the Realm file is closed and re-opened. - */ -- (void)suspend; - -/** - Resume syncronization and reconnect to Atlas App Services after suspending. - - This is a no-op if the session was already active or if the session is invalid. - Newly created sessions begin in the Active state and do not need to be resumed. - */ -- (void)resume; - -/** - Register a progress notification block. - - Multiple blocks can be registered with the same session at once. Each block - will be invoked on a side queue devoted to progress notifications. - - If the session has already received progress information from the - synchronization subsystem, the block will be called immediately. Otherwise, it - will be called as soon as progress information becomes available. - - The token returned by this method must be retained as long as progress - notifications are desired, and the `-invalidate` method should be called on it - when notifications are no longer needed and before the token is destroyed. - - If no token is returned, the notification block will never be called again. - There are a number of reasons this might be true. If the session has previously - experienced a fatal error it will not accept progress notification blocks. If - the block was configured in the `RLMSyncProgressForCurrentlyOutstandingWork` - mode but there is no additional progress to report (for example, the number - of transferrable bytes and transferred bytes are equal), the block will not be - called again. - - @param direction The transfer direction (upload or download) to track in this progress notification block. - @param mode The desired behavior of this progress notification block. - @param block The block to invoke when notifications are available. - - @return A token which must be held for as long as you want notifications to be delivered. - - @see `RLMSyncProgressDirection`, `RLMSyncProgress`, `RLMProgressNotificationBlock`, `RLMProgressNotificationToken` - */ -- (nullable RLMProgressNotificationToken *)addProgressNotificationForDirection:(RLMSyncProgressDirection)direction - mode:(RLMSyncProgressMode)mode - block:(RLMProgressNotificationBlock)block -NS_REFINED_FOR_SWIFT; - -/** - Given an error action token, immediately handle the corresponding action. - - @see `RLMSyncErrorClientResetError`, `RLMSyncErrorPermissionDeniedError` - */ -+ (void)immediatelyHandleError:(RLMSyncErrorActionToken *)token syncManager:(RLMSyncManager *)syncManager; - -/** - Get the sync session for the given Realm if it is a synchronized Realm, or `nil` - if it is not. - */ -+ (nullable RLMSyncSession *)sessionForRealm:(RLMRealm *)realm; - -@end - -// MARK: - Error action token - -#pragma mark - Error action token - -/** - An opaque token returned as part of certain errors. It can be - passed into certain APIs to perform certain actions. - - @see `RLMSyncErrorClientResetError`, `RLMSyncErrorPermissionDeniedError` - */ -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMSyncErrorActionToken : NSObject - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("This type cannot be created directly"))); - -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("This type cannot be created directly"))); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMSyncSubscription.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMSyncSubscription.h deleted file mode 100644 index d35be19d0..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMSyncSubscription.h +++ /dev/null @@ -1,346 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectId; - -#pragma mark - Subscription States - -/// The current state of the subscription. This can be used for ensuring that -/// the subscriptions are not errored and that it has been successfully -/// synced to the server. -typedef NS_ENUM(NSUInteger, RLMSyncSubscriptionState) { - /// The subscription is complete and the server has sent all the data that matched the subscription - /// queries at the time the subscription set was updated. The server is now in a steady-state - /// synchronization mode where it will stream update as they come. - RLMSyncSubscriptionStateComplete, - /// The subscription encountered an error and synchronization is paused for this Realm. You can - /// find the error calling error in the subscription set to get a description of the error. You can - /// still use the current subscription set to write a subscription. - RLMSyncSubscriptionStateError, - /// The subscription is persisted locally but not yet processed by the server, which means - /// the server hasn't yet returned all the data that matched the updated subscription queries. - RLMSyncSubscriptionStatePending, - /// The subscription set has been super-ceded by an updated one, this typically means that - /// someone is trying to write a subscription on a different instance of the subscription set. - /// You should not use a superseded subscription set and instead obtain a new instance of - /// the subscription set to write a subscription. - RLMSyncSubscriptionStateSuperseded -}; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - `RLMSyncSubscription` is used to define a Flexible Sync subscription obtained from querying a - subscription set, which can be used to read or remove/update a committed subscription. - */ -@interface RLMSyncSubscription : NSObject - -/// Name of the subscription. If not specified it will return nil. -@property (nonatomic, readonly, nullable) NSString *name; - -/// When the subscription was created. Recorded automatically. -@property (nonatomic, readonly) NSDate *createdAt; - -/// When the subscription was last updated. Recorded automatically. -@property (nonatomic, readonly) NSDate *updatedAt; - -/** - Updates a Flexible Sync's subscription query with an allowed query which will be used to bootstrap data - from the server when committed. - - @warning This method may only be called during a write subscription block. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - */ -- (void)updateSubscriptionWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (void)updateSubscriptionWhere:(NSString *)predicateFormat - args:(va_list)args; - -/** - Updates a Flexible Sync's subscription query with an allowed query which will be used to bootstrap data - from the server when committed. - - @warning This method may only be called during a write subscription block. - - @param predicate The predicate with which to filter the objects on the server. - */ -- (void)updateSubscriptionWithPredicate:(NSPredicate *)predicate; - -@end - -/** - `RLMSyncSubscriptionSet` is a collection of `RLMSyncSubscription`s. This is the entry point - for adding and removing `RLMSyncSubscription`s. - */ -@interface RLMSyncSubscriptionSet : NSObject - -/// The number of subscriptions in the subscription set. -@property (readonly) NSUInteger count; - -/// Gets the error associated to the subscription set. This will be non-nil in case the current -/// state of the subscription set is `RLMSyncSubscriptionStateError`. -@property (nonatomic, readonly, nullable) NSError *error; - -/// Gets the state associated to the subscription set. -@property (nonatomic, readonly) RLMSyncSubscriptionState state; - -#pragma mark - Batch Update subscriptions - -/** - Synchronously performs any transactions (add/remove/update) to the subscription set within the block, - this will not wait for the server to acknowledge and see all the data associated with this collection of subscriptions, - and will return after committing the subscription transactions. - - @param block The block containing actions to perform to the subscription set. - */ -- (void)update:(__attribute__((noescape)) void(^)(void))block; -/// :nodoc: -- (void)write:(__attribute__((noescape)) void(^)(void))block __attribute__((unavailable("Renamed to -update"))); - -/** - Synchronously performs any transactions (add/remove/update) to the subscription set within the block, - this will not wait for the server to acknowledge and see all the data associated with this collection of subscriptions, - and will return after committing the subscription transactions. - - @param block The block containing actions to perform to the subscription set. - @param onComplete A block which is called upon synchronization of - subscriptions to the server. The block will be passed `nil` - if the update succeeded, and an error describing the problem - otherwise. - */ -- (void)update:(__attribute__((noescape)) void(^)(void))block - onComplete:(nullable void(^RLM_SWIFT_SENDABLE)(NSError *_Nullable))onComplete - __attribute__((swift_async(not_swift_private, 2))) - __attribute__((swift_attr("@_unsafeInheritExecutor"))); -/// :nodoc: -- (void)write:(__attribute__((noescape)) void(^)(void))block - onComplete:(void(^)(NSError * _Nullable))onComplete __attribute__((unavailable("Renamed to -update:onComplete."))); - -#pragma mark - Find subscription - -/** - Finds a subscription by the specified name. - - @param name The name used to identify the subscription. - - @return A subscription for the given name. - */ -- (nullable RLMSyncSubscription *)subscriptionWithName:(NSString *)name; - -/** - Finds a subscription by the query for the specified object class name. - - @param objectClassName The class name for the model class to be queried. - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return A subscription for the given query.. - */ -- (nullable RLMSyncSubscription *)subscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (nullable RLMSyncSubscription *)subscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat - args:(va_list)args; - -/** - Finds a subscription by the query for the specified object class name. - - @param objectClassName The class name for the model class to be queried. - @param predicate The predicate used to to filter the objects on the server. - - @return A subscription for the given query.. - */ -- (nullable RLMSyncSubscription *)subscriptionWithClassName:(NSString *)objectClassName - predicate:(NSPredicate *)predicate; - -#pragma mark - Add a Subscription - -/** - Adds a new subscription to the subscription set which will be sent to the server when - committed at the end of a write subscription block. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - */ -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat - args:(va_list)args; - -/** - Adds a new subscription to the subscription set which will be sent to the server when - committed at the end of a write subscription block. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param name The name used the identify the subscription. - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - */ -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - subscriptionName:(NSString *)name - where:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - subscriptionName:(NSString *)name - where:(NSString *)predicateFormat - args:(va_list)args; - -/** - Adds a new subscription to the subscription set which will be sent to the server when - committed at the end of a write subscription block. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param predicate The predicate defining the query for the subscription. - */ -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - predicate:(NSPredicate *)predicate; - -/** - Adds a new subscription to the subscription set which will be sent to the server when - committed at the end of a write subscription block. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param name The name used to identify the subscription. - @param predicate The predicate defining the query for the subscription. - */ -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - subscriptionName:(nullable NSString *)name - predicate:(NSPredicate *)predicate; - -#pragma mark - Remove Subscription - -/** - Removes a subscription with the specified name from the subscription set. - - @warning This method may only be called during a write subscription block. - - @param name The name used the identify the subscription. - */ -- (void)removeSubscriptionWithName:(NSString *)name; - -/** - Removes a subscription with the specified query for the object class from the subscription set. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - */ -- (void)removeSubscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (void)removeSubscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat - args:(va_list)args; - -/** - Removes a subscription with the specified query for the object class from the subscription set. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param predicate The predicate which will be used to identify the subscription to be removed. - */ -- (void)removeSubscriptionWithClassName:(NSString *)objectClassName - predicate:(NSPredicate *)predicate; - -/** - Removes the subscription from the subscription set. - - @warning This method may only be called during a write subscription block. - - @param subscription An instance of the subscription to be removed. - */ -- (void)removeSubscription:(RLMSyncSubscription *)subscription; - -#pragma mark - Remove Subscriptions - -/** - Removes all subscription from the subscription set. - - @warning This method may only be called during a write subscription block. - @warning Removing all subscriptions will result in an error if no new subscription is added. Server should - acknowledge at least one subscription. - */ -- (void)removeAllSubscriptions; - -/** - Removes all subscription with the specified class name. - - @param className The class name for the model class to be queried. - - @warning This method may only be called during a write subscription block. - */ -- (void)removeAllSubscriptionsWithClassName:(NSString *)className; - -#pragma mark - SubscriptionSet Collection - -/** - Returns the subscription at the given `index`. - - @param index The index. - - @return A subscription for the given index in the subscription set. - */ -- (nullable RLMSyncSubscription *)objectAtIndex:(NSUInteger)index; - -/** - Returns the first object in the subscription set list, or `nil` if the subscriptions are empty. - - @return A subscription. - */ -- (nullable RLMSyncSubscription *)firstObject; - -/** - Returns the last object in the subscription set, or `nil` if the subscriptions are empty. - - @return A subscription. - */ -- (nullable RLMSyncSubscription *)lastObject; - -#pragma mark - Subscript - -/** - Returns the subscription at the given `index`. - - @param index The index. - - @return A subscription for the given index in the subscription set. - */ -- (id)objectAtIndexedSubscript:(NSUInteger)index; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMThreadSafeReference.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMThreadSafeReference.h deleted file mode 100644 index 9472942ed..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMThreadSafeReference.h +++ /dev/null @@ -1,107 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMRealm; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - Objects of types which conform to `RLMThreadConfined` can be managed by a Realm, which will make - them bound to a thread-specific `RLMRealm` instance. Managed objects must be explicitly exported - and imported to be passed between threads. - - Managed instances of objects conforming to this protocol can be converted to a thread-safe - reference for transport between threads by passing to the - `+[RLMThreadSafeReference referenceWithThreadConfined:]` constructor. - - Note that only types defined by Realm can meaningfully conform to this protocol, and defining new - classes which attempt to conform to it will not make them work with `RLMThreadSafeReference`. - */ -@protocol RLMThreadConfined -// Conformance to the `RLMThreadConfined_Private` protocol will be enforced at runtime. - -/** - The Realm which manages the object, or `nil` if the object is unmanaged. - - Unmanaged objects are not confined to a thread and cannot be passed to methods expecting a - `RLMThreadConfined` object. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/// Indicates if the object can no longer be accessed because it is now invalid. -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -@end - -/** - An object intended to be passed between threads containing a thread-safe reference to its - thread-confined object. - - To resolve a thread-safe reference on a target Realm on a different thread, pass to - `-[RLMRealm resolveThreadSafeReference:]`. - - @warning A `RLMThreadSafeReference` object must be resolved at most once. - Failing to resolve a `RLMThreadSafeReference` will result in the source version of the - Realm being pinned until the reference is deallocated. - - @note Prefer short-lived `RLMThreadSafeReference`s as the data for the version of the source Realm - will be retained until all references have been resolved or deallocated. - - @see `RLMThreadConfined` - @see `-[RLMRealm resolveThreadSafeReference:]` - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMThreadSafeReference<__covariant Confined : id> : NSObject - -/** - Create a thread-safe reference to the thread-confined object. - - @param threadConfined The thread-confined object to create a thread-safe reference to. - - @note You may continue to use and access the thread-confined object after passing it to this - constructor. - */ -+ (instancetype)referenceWithThreadConfined:(Confined)threadConfined; - -/** - Indicates if the reference can no longer be resolved because an attempt to resolve it has already - occurred. References can only be resolved once. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -#pragma mark - Unavailable Methods - -/** - `-[RLMThreadSafeReference init]` is not available because `RLMThreadSafeReference` cannot be - created directly. `RLMThreadSafeReference` instances must be obtained by calling - `-[RLMRealm resolveThreadSafeReference:]`. - */ -- (instancetype)init __attribute__((unavailable("RLMThreadSafeReference cannot be created directly"))); - -/** - `-[RLMThreadSafeReference new]` is not available because `RLMThreadSafeReference` cannot be - created directly. `RLMThreadSafeReference` instances must be obtained by calling - `-[RLMRealm resolveThreadSafeReference:]`. - */ -+ (instancetype)new __attribute__((unavailable("RLMThreadSafeReference cannot be created directly"))); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMUpdateResult.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMUpdateResult.h deleted file mode 100644 index df0b237e3..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMUpdateResult.h +++ /dev/null @@ -1,45 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectId; -@protocol RLMBSON; - -/// The result of an `updateOne` or `updateMany` operation a `RLMMongoCollection`. -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMUpdateResult : NSObject - -/// The number of documents that matched the filter. -@property (nonatomic, readonly) NSUInteger matchedCount; - -/// The number of documents modified. -@property (nonatomic, readonly) NSUInteger modifiedCount; - -/// The identifier of the inserted document if an upsert took place and the document's primary key is an `ObjectId`. -@property (nonatomic, nullable, readonly) RLMObjectId *objectId -__attribute__((deprecated("Use documentId instead, which support all BSON types", "documentId"))); - -/// The identifier of the inserted document if an upsert took place. -@property (nonatomic, nullable, readonly) id documentId; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMUser.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMUser.h deleted file mode 100644 index 436350f9b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMUser.h +++ /dev/null @@ -1,447 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import -#import -#import - -@class RLMUser, RLMSyncSession, RLMRealm, RLMUserIdentity, RLMAPIKeyAuth, RLMMongoClient, RLMMongoDatabase, RLMMongoCollection, RLMUserProfile; -@protocol RLMBSON; - -/** - The state of the user object. - */ -typedef NS_ENUM(NSUInteger, RLMUserState) { - /// The user is logged out. Call `logInWithCredentials:...` with valid credentials to log the user back in. - RLMUserStateLoggedOut, - /// The user is logged in, and any Realms associated with it are syncing with Atlas App Services. - RLMUserStateLoggedIn, - /// The user has been removed, and cannot be used. - RLMUserStateRemoved -}; - -/// A block type used to report an error related to a specific user. -RLM_SWIFT_SENDABLE -typedef void(^RLMOptionalUserBlock)(RLMUser * _Nullable, NSError * _Nullable); - -/// A block type used to report an error on a network request from the user. -RLM_SWIFT_SENDABLE -typedef void(^RLMUserOptionalErrorBlock)(NSError * _Nullable); - -/// A block which returns a dictionary should there be any custom data set for a user -RLM_SWIFT_SENDABLE -typedef void(^RLMUserCustomDataBlock)(NSDictionary * _Nullable, NSError * _Nullable); - -/// A block type for returning from function calls. -RLM_SWIFT_SENDABLE -typedef void(^RLMCallFunctionCompletionBlock)(id _Nullable, NSError * _Nullable); - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A `RLMUser` instance represents a single Realm App user account. - - A user may have one or more credentials associated with it. These credentials - uniquely identify the user to the authentication provider, and are used to sign - into an Atlas App Services user account. - - Note that user objects are only vended out via SDK APIs, and cannot be directly - initialized. User objects can be accessed from any thread. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // internally thread-safe -@interface RLMUser : NSObject - -/** - The unique Atlas App Services string identifying this user. - Note this is different from an identity: A user may have multiple identities but has a single identifier. See RLMUserIdentity. - */ -@property (nonatomic, readonly) NSString *identifier NS_SWIFT_NAME(id); - -/// Returns an array of identities currently linked to a user. -@property (nonatomic, readonly) NSArray *identities; - -/** - The user's refresh token used to access App Services. - - By default, refresh tokens expire 60 days after they are issued. - You can configure this time for your App's refresh tokens to be - anywhere between 30 minutes and 180 days. - - You can configure the refresh token expiration time for all sessions in - an App from the Admin UI or Admin API. -*/ -@property (nullable, nonatomic, readonly) NSString *refreshToken; - -/** - The user's access token used to access App Services. - - This is required to make HTTP requests to Atlas App Services like the Data API or GraphQL. - It should be treated as sensitive data. - - The Realm SDK automatically manages access tokens and refreshes them - when they expire. - */ -@property (nullable, nonatomic, readonly) NSString *accessToken; - -/** - The current state of the user. - */ -@property (nonatomic, readonly) RLMUserState state; - -/** - Indicates if the user is logged in or not. Returns true if the access token and refresh token are not empty. - */ -@property (nonatomic, readonly) BOOL isLoggedIn; - -#pragma mark - Lifecycle - -/** - Create a partition-based sync configuration instance for the given partition value. - - @param partitionValue The `RLMBSON` value the Realm is partitioned on. - @return A default configuration object with the sync configuration set to use the given partition value. - */ -- (RLMRealmConfiguration *)configurationWithPartitionValue:(nullable id)partitionValue NS_REFINED_FOR_SWIFT; - -/** - Create a partition-based sync configuration instance for the given partition value. - - @param partitionValue The `RLMBSON` value the Realm is partitioned on. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - - @return A configuration object with the sync configuration set to use the given partition value. - */ -- (RLMRealmConfiguration *)configurationWithPartitionValue:(nullable id)partitionValue - clientResetMode:(RLMClientResetMode)clientResetMode NS_REFINED_FOR_SWIFT; - -/** - Create a partition-based sync configuration instance for the given partition value. - - @param partitionValue The `RLMBSON` value the Realm is partitioned on. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param beforeResetBlock A callback which notifies prior to a client reset occurring. See: `RLMClientResetBeforeBlock` - @param afterResetBlock A callback which notifies after a client reset has occurred. See: `RLMClientResetAfterBlock` - - @return A configuration object with the sync configuration set to use the given partition value. - */ -- (RLMRealmConfiguration *)configurationWithPartitionValue:(nullable id)partitionValue - clientResetMode:(RLMClientResetMode)clientResetMode - notifyBeforeReset:(nullable RLMClientResetBeforeBlock)beforeResetBlock - notifyAfterReset:(nullable RLMClientResetAfterBlock)afterResetBlock NS_REFINED_FOR_SWIFT; - -/** - Create a partition-based sync configuration instance for the given partition value. - - @param partitionValue The `RLMBSON` value the Realm is partitioned on. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param manualClientResetHandler An error reporting block that is invoked during a client reset. - @See ``RLMSyncErrorReportingBlock`` and ``RLMClientResetInfo`` - - @return A configuration object with the sync configuration set to use the given partition value. - */ -- (RLMRealmConfiguration *)configurationWithPartitionValue:(nullable id)partitionValue - clientResetMode:(RLMClientResetMode)clientResetMode - manualClientResetHandler:(nullable RLMSyncErrorReportingBlock)manualClientResetHandler NS_REFINED_FOR_SWIFT; - -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @return A ``RLMRealmConfiguration`` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfiguration NS_REFINED_FOR_SWIFT; - -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param beforeResetBlock A callback which notifies prior to a client reset occurring. See: `RLMClientResetBeforeBlock` - @param afterResetBlock A callback which notifies after a client reset has occurred. See: `RLMClientResetAfterBlock` - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithClientResetMode:(RLMClientResetMode)clientResetMode - notifyBeforeReset:(nullable RLMClientResetBeforeBlock)beforeResetBlock - notifyAfterReset:(nullable RLMClientResetAfterBlock)afterResetBlock NS_REFINED_FOR_SWIFT; -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param manualClientResetHandler An error reporting block that is invoked during a client reset. - @See `RLMSyncErrorReportingBlock` and `RLMClientResetInfo` - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithClientResetMode:(RLMClientResetMode)clientResetMode - manualClientResetHandler:(nullable RLMSyncErrorReportingBlock)manualClientResetHandler NS_REFINED_FOR_SWIFT; - -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param initialSubscriptions A block which receives a subscription set instance, that can be - used to add an initial set of subscriptions which will be executed - when the Realm is first opened. - @param rerunOnOpen If true, allows to run the initial set of subscriptions specified, on every app startup. - This can be used to re-run dynamic time ranges and other queries that require a - re-computation of a static variable. - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithInitialSubscriptions:(RLMFlexibleSyncInitialSubscriptionsBlock)initialSubscriptions - rerunOnOpen:(BOOL)rerunOnOpen NS_REFINED_FOR_SWIFT; -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param initialSubscriptions A block which receives a subscription set instance, that can be - used to add an initial set of subscriptions which will be executed - when the Realm is first opened. - @param rerunOnOpen If true, allows to run the initial set of subscriptions specified, on every app startup. - This can be used to re-run dynamic time ranges and other queries that require a - re-computation of a static variable. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param beforeResetBlock A callback which notifies prior to a client reset occurring. See: `RLMClientResetBeforeBlock` - @param afterResetBlock A callback which notifies after a client reset has occurred. See: `RLMClientResetAfterBlock` - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithInitialSubscriptions:(RLMFlexibleSyncInitialSubscriptionsBlock)initialSubscriptions - rerunOnOpen:(BOOL)rerunOnOpen - clientResetMode:(RLMClientResetMode)clientResetMode - notifyBeforeReset:(nullable RLMClientResetBeforeBlock)beforeResetBlock - notifyAfterReset:(nullable RLMClientResetAfterBlock)afterResetBlock NS_REFINED_FOR_SWIFT; - -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param initialSubscriptions A block which receives a subscription set instance, that can be - used to add an initial set of subscriptions which will be executed - when the Realm is first opened. - @param rerunOnOpen If true, allows to run the initial set of subscriptions specified, on every app startup. - This can be used to re-run dynamic time ranges and other queries that require a - re-computation of a static variable. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param manualClientResetHandler An error reporting block that is invoked during a client reset. - @See `RLMSyncErrorReportingBlock` and `RLMClientResetInfo` - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithInitialSubscriptions:(RLMFlexibleSyncInitialSubscriptionsBlock)initialSubscriptions - rerunOnOpen:(BOOL)rerunOnOpen - clientResetMode:(RLMClientResetMode)clientResetMode - manualClientResetHandler:(nullable RLMSyncErrorReportingBlock)manualClientResetHandler NS_REFINED_FOR_SWIFT; - -#pragma mark - Sessions - -/** - Retrieve a valid session object belonging to this user for a given URL, or `nil` - if no such object exists. - */ -- (nullable RLMSyncSession *)sessionForPartitionValue:(id)partitionValue; - -/// Retrieve all the valid sessions belonging to this user. -@property (nonatomic, readonly) NSArray *allSessions; - -#pragma mark - Custom Data - -/** - The custom data of the user. - This is configured in your Atlas App Services app. - */ -@property (nonatomic, readonly) NSDictionary *customData NS_REFINED_FOR_SWIFT; - -/** - The profile of the user. - */ -@property (nonatomic, readonly) RLMUserProfile *profile; - -/** - Refresh a user's custom data. This will, in effect, refresh the user's auth session. - */ -- (void)refreshCustomDataWithCompletion:(RLMUserCustomDataBlock)completion; - -/** - Links the currently authenticated user with a new identity, where the identity is defined by the credential - specified as a parameter. This will only be successful if this `RLMUser` is the currently authenticated - with the client from which it was created. On success a new user will be returned with the new linked credentials. - - @param credentials The `RLMCredentials` used to link the user to a new identity. - @param completion The completion handler to call when the linking is complete. - If the operation is successful, the result will contain a new - `RLMUser` object representing the currently logged in user. -*/ -- (void)linkUserWithCredentials:(RLMCredentials *)credentials - completion:(RLMOptionalUserBlock)completion NS_REFINED_FOR_SWIFT; - -/** - Removes the user - - This logs out and destroys the session related to this user. The completion block will return an error - if the user is not found or is already removed. - - @param completion A callback invoked on completion -*/ -- (void)removeWithCompletion:(RLMUserOptionalErrorBlock)completion; - -/** - Permanently deletes this user from your Atlas App Services app. - - The users state will be set to `Removed` and the session will be destroyed. - If the delete request fails, the local authentication state will be untouched. - - @param completion A callback invoked on completion -*/ -- (void)deleteWithCompletion:(RLMUserOptionalErrorBlock)completion; - -/** - Logs out the current user - - The users state will be set to `Removed` is they are an anonymous user or `LoggedOut` if they are authenticated by an email / password or third party auth clients - If the logout request fails, this method will still clear local authentication state. - - @param completion A callback invoked on completion -*/ -- (void)logOutWithCompletion:(RLMUserOptionalErrorBlock)completion; - -/** - A client for the user API key authentication provider which - can be used to create and modify user API keys. - - This client should only be used by an authenticated user. -*/ -@property (nonatomic, readonly) RLMAPIKeyAuth *apiKeysAuth; - -/// A client for interacting with a remote MongoDB instance -/// @param serviceName The name of the MongoDB service -- (RLMMongoClient *)mongoClientWithServiceName:(NSString *)serviceName NS_REFINED_FOR_SWIFT; - -/** - Calls the Atlas App Services function with the provided name and arguments. - - @param name The name of the Atlas App Services function to be called. - @param arguments The `BSONArray` of arguments to be provided to the function. - @param completion The completion handler to call when the function call is complete. - This handler is executed on a non-main global `DispatchQueue`. -*/ -- (void)callFunctionNamed:(NSString *)name - arguments:(NSArray> *)arguments - completionBlock:(RLMCallFunctionCompletionBlock)completion NS_REFINED_FOR_SWIFT; - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("RLMUser cannot be created directly"))); -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("RLMUser cannot be created directly"))); - -@end - -#pragma mark - User info classes - -/** - An identity of a user. A user can have multiple identities, usually associated with multiple providers. - Note this is different from a user's unique identifier string. - @seeAlso `RLMUser.identifier` - */ -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMUserIdentity : NSObject - -/** - The associated provider type - */ -@property (nonatomic, readonly) NSString *providerType; - -/** - The string which identifies the RLMUserIdentity - */ -@property (nonatomic, readonly) NSString *identifier; - -/** - Initialize an RLMUserIdentity for the given identifier and provider type. - @param providerType the associated provider type - @param identifier the identifier of the identity - */ -- (instancetype)initUserIdentityWithProviderType:(NSString *)providerType - identifier:(NSString *)identifier; - -@end - -/** - A profile for a given User. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMUserProfile : NSObject - -/// The full name of the user. -@property (nonatomic, readonly, nullable) NSString *name; -/// The email address of the user. -@property (nonatomic, readonly, nullable) NSString *email; -/// A URL to the user's profile picture. -@property (nonatomic, readonly, nullable) NSString *pictureURL; -/// The first name of the user. -@property (nonatomic, readonly, nullable) NSString *firstName; -/// The last name of the user. -@property (nonatomic, readonly, nullable) NSString *lastName; -/// The gender of the user. -@property (nonatomic, readonly, nullable) NSString *gender; -/// The birthdate of the user. -@property (nonatomic, readonly, nullable) NSString *birthday; -/// The minimum age of the user. -@property (nonatomic, readonly, nullable) NSString *minAge; -/// The maximum age of the user. -@property (nonatomic, readonly, nullable) NSString *maxAge; -/// The BSON dictionary of metadata associated with this user. -@property (nonatomic, readonly) NSDictionary *metadata NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMUserAPIKey.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMUserAPIKey.h deleted file mode 100644 index 2cdd82b2a..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMUserAPIKey.h +++ /dev/null @@ -1,43 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// UserAPIKey model for APIKeys recevied from the server. -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMUserAPIKey : NSObject - -/// Indicates if the API key is disabled or not -@property (nonatomic, readonly) BOOL disabled; - -/// The name of the key. -@property (nonatomic, readonly) NSString *name; - -/// The actual key. Will only be included in -/// the response when an API key is first created. -@property (nonatomic, readonly, nullable) NSString *key; - -/// The ObjectId of the API key -@property (nonatomic, readonly) RLMObjectId *objectId NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMValue.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMValue.h deleted file mode 100644 index ac1f10ee4..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/RLMValue.h +++ /dev/null @@ -1,97 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import -#import -#import -#import -#import - -#pragma mark RLMValue - -/** - RLMValue is a property type which represents a polymorphic Realm value. This is similar to the usage of - `AnyObject` / `Any` in Swift. -``` - // A property on `MyObject` - @property (nonatomic) id myAnyValue; - - // A property on `AnotherObject` - @property (nonatomic) id myAnyValue; - - MyObject *myObject = [MyObject createInRealm:realm withValue:@[]]; - myObject.myAnyValue = @1234; // underlying type is NSNumber. - myObject.myAnyValue = @"hello"; // underlying type is NSString. - AnotherObject *anotherObject = [AnotherObject createInRealm:realm withValue:@[]]; - myObject.myAnyValue = anotherObject; // underlying type is RLMObject. -``` - The following types conform to RLMValue: - - `NSData` - `NSDate` - `NSNull` - `NSNumber` - `NSUUID` - `NSString` - `RLMObject - `RLMObjectId` - `RLMDecimal128` - */ -@protocol RLMValue - -/// Describes the type of property stored. -@property (readonly) RLMPropertyType rlm_valueType; - -@end - -/// :nodoc: -@interface NSNull (RLMValue) -@end - -/// :nodoc: -@interface NSNumber (RLMValue) -@end - -/// :nodoc: -@interface NSString (RLMValue) -@end - -/// :nodoc: -@interface NSData (RLMValue) -@end - -/// :nodoc: -@interface NSDate (RLMValue) -@end - -/// :nodoc: -@interface NSUUID (RLMValue) -@end - -/// :nodoc: -@interface RLMDecimal128 (RLMValue) -@end - -/// :nodoc: -@interface RLMObjectBase (RLMValue) -@end - -/// :nodoc: -@interface RLMObjectId (RLMValue) -@end diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/Realm.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/Realm.h deleted file mode 100644 index 245596393..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Headers/Realm.h +++ /dev/null @@ -1,63 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import - -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Info.plist b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Info.plist deleted file mode 100644 index 5e6b75327..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Info.plist and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/LICENSE b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/LICENSE deleted file mode 100644 index 66a27ec5f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/LICENSE +++ /dev/null @@ -1,177 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Modules/module.modulemap b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Modules/module.modulemap deleted file mode 100644 index 519ddc20b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Modules/module.modulemap +++ /dev/null @@ -1,88 +0,0 @@ -framework module Realm { - export Foundation - - umbrella header "Realm.h" - - header "RLMArray.h" - header "RLMAsymmetricObject.h" - header "RLMDecimal128.h" - header "RLMDictionary.h" - header "RLMEmbeddedObject.h" - header "RLMLogger.h" - header "RLMMigration.h" - header "RLMObject.h" - header "RLMObjectId.h" - header "RLMObjectSchema.h" - header "RLMProperty.h" - header "RLMProviderClient.h" - header "RLMRealm+Sync.h" - header "RLMRealm.h" - header "RLMRealmConfiguration.h" - header "RLMResults.h" - header "RLMSchema.h" - header "RLMSectionedResults.h" - header "RLMSet.h" - header "RLMValue.h" - - header "RLMApp.h" - header "RLMCredentials.h" - header "RLMNetworkTransport.h" - header "RLMPushClient.h" - header "RLMRealm+Sync.h" - header "RLMSyncConfiguration.h" - header "RLMSyncManager.h" - header "RLMSyncSession.h" - header "RLMUser.h" - header "RLMUserAPIKey.h" - header "RLMAPIKeyAuth.h" - header "RLMEmailPasswordAuth.h" - header "NSError+RLMSync.h" - header "RLMBSON.h" - header "RLMMongoClient.h" - header "RLMMongoDatabase.h" - header "RLMMongoCollection.h" - header "RLMUpdateResult.h" - header "RLMFindOptions.h" - header "RLMFindOneAndModifyOptions.h" - header "RLMSyncSubscription.h" - - explicit module Private { - header "RLMAccessor.h" - header "RLMApp_Private.h" - header "RLMArray_Private.h" - header "RLMAsyncTask_Private.h" - header "RLMCollection_Private.h" - header "RLMDictionary_Private.h" - header "RLMLogger_Private.h" - header "RLMEvent.h" - header "RLMMongoCollection_Private.h" - header "RLMObjectBase_Dynamic.h" - header "RLMObjectBase_Private.h" - header "RLMObjectSchema_Private.h" - header "RLMObjectStore.h" - header "RLMObject_Private.h" - header "RLMProperty_Private.h" - header "RLMRealmConfiguration_Private.h" - header "RLMRealm_Private.h" - header "RLMResults_Private.h" - header "RLMScheduler.h" - header "RLMSchema_Private.h" - header "RLMSectionedResults.h" - header "RLMSet_Private.h" - header "RLMSwiftCollectionBase.h" - header "RLMSwiftProperty.h" - header "RLMSwiftValueStorage.h" - header "RLMSyncConfiguration_Private.h" - header "RLMSyncSubscription_Private.h" - header "RLMUser_Private.h" - } - - explicit module Dynamic { - header "RLMRealm_Dynamic.h" - header "RLMObjectBase_Dynamic.h" - } - - explicit module Swift { - header "RLMSwiftObject.h" - } -} diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMAccessor.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMAccessor.h deleted file mode 100644 index db915ca7c..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMAccessor.h +++ /dev/null @@ -1,53 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectSchema, RLMProperty, RLMObjectBase; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -// -// Accessors Class Creation/Caching -// - -// get accessor classes for an object class - generates classes if not cached -Class RLMManagedAccessorClassForObjectClass(Class objectClass, RLMObjectSchema *schema, const char *name); -Class RLMUnmanagedAccessorClassForObjectClass(Class objectClass, RLMObjectSchema *schema); - -// -// Dynamic getters/setters -// -FOUNDATION_EXTERN void RLMDynamicValidatedSet(RLMObjectBase *obj, NSString *propName, id __nullable val); -FOUNDATION_EXTERN id __nullable RLMDynamicGet(RLMObjectBase *obj, RLMProperty *prop); -FOUNDATION_EXTERN id __nullable RLMDynamicGetByName(RLMObjectBase *obj, NSString *propName); - -// by property/column -void RLMDynamicSet(RLMObjectBase *obj, RLMProperty *prop, id val); - -// -// Class modification -// - -// Replace className method for the given class -void RLMReplaceClassNameMethod(Class accessorClass, NSString *className); - -// Replace sharedSchema method for the given class -void RLMReplaceSharedSchemaMethod(Class accessorClass, RLMObjectSchema * __nullable schema); - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMApp_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMApp_Private.h deleted file mode 100644 index 5da5c3c7a..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMApp_Private.h +++ /dev/null @@ -1,50 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// Observer block for app notifications. -typedef void(^RLMAppNotificationBlock)(RLMApp *); - -/// Token that identifies an observer. Unsubscribes when deconstructed to -/// avoid dangling observers, therefore this must be retained to hold -/// onto a subscription. -@interface RLMAppSubscriptionToken : NSObject -- (void)unsubscribe; -@end - -@interface RLMApp () -/// Returns all currently cached Apps -+ (NSArray *)allApps; -/// Subscribe to notifications for this RLMApp. -- (RLMAppSubscriptionToken *)subscribe:(RLMAppNotificationBlock)block; - -+ (instancetype)appWithConfiguration:(RLMAppConfiguration *)configuration; - -+ (void)resetAppCache; -@end - -@interface RLMAppConfiguration () -@property (nonatomic) NSString *appId; -@property (nonatomic) BOOL encryptMetadata; -@property (nonatomic) NSURL *rootDirectory; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMArray_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMArray_Private.h deleted file mode 100644 index 1a37f010e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMArray_Private.h +++ /dev/null @@ -1,44 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -@class RLMObjectBase, RLMProperty; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMArray () -- (instancetype)initWithObjectClassName:(NSString *)objectClassName; -- (instancetype)initWithObjectType:(RLMPropertyType)type optional:(BOOL)optional; -- (NSString *)descriptionWithMaxDepth:(NSUInteger)depth; -- (void)setParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -- (void)replaceAllObjectsWithObjects:(NSArray *)objects; -// YES if the property is declared with old property syntax. -@property (nonatomic, readonly) BOOL isLegacyProperty; -// The name of the property which this collection represents -@property (nonatomic, readonly) NSString *propertyKey; -@end - -@interface RLMManagedArray : RLMArray -- (instancetype)initWithParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -@end - -void RLMArrayValidateMatchingObjectType(RLMArray *array, id value); - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMAsyncTask_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMAsyncTask_Private.h deleted file mode 100644 index 3cce89441..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMAsyncTask_Private.h +++ /dev/null @@ -1,71 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import "RLMRealm_Private.h" - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMAsyncOpenTask () -@property (nonatomic, nullable) RLMRealm *localRealm; - -- (instancetype)initWithConfiguration:(RLMRealmConfiguration *)configuration - confinedTo:(RLMScheduler *)confinement - download:(bool)waitForDownloadCompletion - completion:(RLMAsyncOpenRealmCallback)completion -__attribute__((objc_direct)); - -- (instancetype)initWithConfiguration:(RLMRealmConfiguration *)configuration - confinedTo:(RLMScheduler *)confinement - download:(bool)waitForDownloadCompletion; - -- (void)waitWithCompletion:(void (^)(NSError *_Nullable))completion; -- (void)waitForOpen:(RLMAsyncOpenRealmCallback)completion __attribute__((objc_direct)); -@end - -// A cancellable task for waiting for downloads on an already-open Realm. -RLM_SWIFT_SENDABLE -@interface RLMAsyncDownloadTask : NSObject -- (instancetype)initWithRealm:(RLMRealm *)realm; -- (void)cancel; -- (void)waitWithCompletion:(void (^)(NSError *_Nullable))completion; -@end - -// A cancellable task for beginning an async write -RLM_SWIFT_SENDABLE -@interface RLMAsyncWriteTask : NSObject -// Must only be called from within the Actor -- (instancetype)initWithRealm:(RLMRealm *)realm; -- (void)setTransactionId:(RLMAsyncTransactionId)transactionID; -- (void)complete:(bool)cancel; - -// Can be called from any thread -- (void)wait:(void (^)(void))completion; -@end - -typedef void (^RLMAsyncRefreshCompletion)(bool); -// A cancellable task for refreshing a Realm -RLM_SWIFT_SENDABLE -@interface RLMAsyncRefreshTask : NSObject -- (void)complete:(bool)didRefresh; -- (void)wait:(RLMAsyncRefreshCompletion)completion; -+ (RLMAsyncRefreshTask *)completedRefresh; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMBSON_Private.hpp b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMBSON_Private.hpp deleted file mode 100644 index c5cc1a410..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMBSON_Private.hpp +++ /dev/null @@ -1,32 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -namespace realm::bson { -class Bson; -template class IndexedMap; -using BsonDocument = IndexedMap; -} - -realm::bson::Bson RLMConvertRLMBSONToBson(id b); -realm::bson::BsonDocument RLMConvertRLMBSONArrayToBsonDocument(NSArray> *array); -id RLMConvertBsonToRLMBSON(const realm::bson::Bson& b); -id RLMConvertBsonDocumentToRLMBSON(std::optional b); -NSArray> *RLMConvertBsonDocumentToRLMBSONArray(std::optional b); diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMCollection_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMCollection_Private.h deleted file mode 100644 index 7d31bd3f0..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMCollection_Private.h +++ /dev/null @@ -1,42 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@protocol RLMCollectionPrivate; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -NSUInteger RLMUnmanagedFastEnumerate(id collection, NSFastEnumerationState *); -void RLMCollectionSetValueForKey(id collection, NSString *key, id _Nullable value); -FOUNDATION_EXTERN NSString *RLMDescriptionWithMaxDepth(NSString *name, id collection, NSUInteger depth); -FOUNDATION_EXTERN void RLMAssignToCollection(id collection, id value); -FOUNDATION_EXTERN void RLMSetSwiftBridgeCallback(id _Nullable (*_Nonnull)(id)); - -FOUNDATION_EXTERN -RLMNotificationToken *RLMAddNotificationBlock(id collection, id block, - NSArray *_Nullable keyPaths, - dispatch_queue_t _Nullable queue); - -typedef RLM_CLOSED_ENUM(int32_t, RLMCollectionType) { - RLMCollectionTypeArray = 0, - RLMCollectionTypeSet = 1, - RLMCollectionTypeDictionary = 2 -}; - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMDictionary_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMDictionary_Private.h deleted file mode 100644 index 37ff740c7..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMDictionary_Private.h +++ /dev/null @@ -1,46 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectBase, RLMProperty; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMDictionary () -- (instancetype)initWithObjectClassName:(NSString *)objectClassName keyType:(RLMPropertyType)keyType; -- (instancetype)initWithObjectType:(RLMPropertyType)type optional:(BOOL)optional keyType:(RLMPropertyType)keyType; -- (NSString *)descriptionWithMaxDepth:(NSUInteger)depth; -- (void)setParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -// YES if the property is declared with old property syntax. -@property (nonatomic, readonly) BOOL isLegacyProperty; -// The name of the property which this collection represents -@property (nonatomic, readonly) NSString *propertyKey; -@end - -@interface RLMManagedDictionary : RLMDictionary -- (instancetype)initWithParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -@end - -FOUNDATION_EXTERN NSString *RLMDictionaryDescriptionWithMaxDepth(NSString *name, - RLMDictionary *dictionary, - NSUInteger depth); -id RLMDictionaryKey(RLMDictionary *dictionary, id key) RLM_HIDDEN; -id RLMDictionaryValue(RLMDictionary *dictionary, id value) RLM_HIDDEN; - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMEvent.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMEvent.h deleted file mode 100644 index 9a6acb1a6..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMEvent.h +++ /dev/null @@ -1,64 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2022 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#ifdef __cplusplus -#include - -namespace realm { -struct AuditConfig; -} -#endif - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMRealm, RLMUser, RLMRealmConfiguration; -typedef RLM_CLOSED_ENUM(NSUInteger, RLMSyncLogLevel); - -struct RLMEventContext; -typedef void (^RLMEventCompletion)(NSError *_Nullable); - -FOUNDATION_EXTERN struct RLMEventContext *_Nullable RLMEventGetContext(RLMRealm *realm); -FOUNDATION_EXTERN uint64_t RLMEventBeginScope(struct RLMEventContext *context, NSString *activity); -FOUNDATION_EXTERN void RLMEventCommitScope(struct RLMEventContext *context, uint64_t scope_id, - RLMEventCompletion _Nullable completion); -FOUNDATION_EXTERN void RLMEventCancelScope(struct RLMEventContext *context, uint64_t scope_id); -FOUNDATION_EXTERN bool RLMEventIsActive(struct RLMEventContext *context, uint64_t scope_id); -FOUNDATION_EXTERN void RLMEventRecordEvent(struct RLMEventContext *context, NSString *activity, - NSString *_Nullable event, NSString *_Nullable data, - RLMEventCompletion _Nullable completion); -FOUNDATION_EXTERN void RLMEventUpdateMetadata(struct RLMEventContext *context, - NSDictionary *newMetadata); - -@interface RLMEventConfiguration : NSObject -@property (nonatomic) NSString *partitionPrefix; -@property (nonatomic, nullable) RLMUser *syncUser; -@property (nonatomic, nullable) NSDictionary *metadata; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" -@property (nonatomic, nullable) void (^logger)(RLMSyncLogLevel, NSString *); -#pragma clang diagnostic pop -@property (nonatomic, nullable) RLM_SWIFT_SENDABLE void (^errorHandler)(NSError *); - -#ifdef __cplusplus -- (std::shared_ptr)auditConfigWithRealmConfiguration:(RLMRealmConfiguration *)realmConfig; -#endif -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMLogger_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMLogger_Private.h deleted file mode 100644 index 08f8c591e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMLogger_Private.h +++ /dev/null @@ -1,36 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMLogger() - -/** - Log a message to the supplied level. - - @param logLevel The log level for the message. - @param message The message to log. - */ -- (void)logWithLevel:(RLMLogLevel)logLevel message:(NSString *)message, ... NS_SWIFT_UNAVAILABLE(""); -- (void)logLevel:(RLMLogLevel)logLevel message:(NSString *)message; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMMigration_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMMigration_Private.h deleted file mode 100644 index 393f41184..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMMigration_Private.h +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import -#import - -namespace realm { - class Schema; -} - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMMigration () - -@property (nonatomic, strong) RLMRealm *oldRealm; -@property (nonatomic, strong) RLMRealm *realm; - -- (instancetype)initWithRealm:(RLMRealm *)realm oldRealm:(RLMRealm *)oldRealm schema:(realm::Schema &)schema; - -- (void)execute:(RLMMigrationBlock)block objectClass:(_Nullable Class)cls; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMMongoCollection_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMMongoCollection_Private.h deleted file mode 100644 index 77bbf9752..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMMongoCollection_Private.h +++ /dev/null @@ -1,37 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@class RLMUser; - -@interface RLMMongoCollection () -- (instancetype)initWithUser:(RLMUser *)user - serviceName:(NSString *)serviceName - databaseName:(NSString *)databaseName - collectionName:(NSString *)collectionName; - -- (RLMChangeStream *)watchWithMatchFilter:(nullable id)matchFilter - idFilter:(nullable id)idFilter - delegate:(id)delegate - scheduler:(void (^)(dispatch_block_t))scheduler; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObjectBase_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObjectBase_Private.h deleted file mode 100644 index af547b17e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObjectBase_Private.h +++ /dev/null @@ -1,34 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2017 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMArray; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -// RLMObjectBase private -@interface RLMObjectBase () -@property (nonatomic, nullable) NSMutableArray *lastAccessedNames; - -+ (void)initializeLinkedObjectSchemas; -+ (bool)isEmbedded; -+ (bool)isAsymmetric; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObjectSchema_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObjectSchema_Private.h deleted file mode 100644 index 08855a82b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObjectSchema_Private.h +++ /dev/null @@ -1,75 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -// RLMObjectSchema private -@interface RLMObjectSchema () { -@public - bool _isSwiftClass; -} - -/// The object type name reported to the object store and core. -@property (nonatomic, readonly) NSString *objectName; - -// writable redeclaration -@property (nonatomic, readwrite, copy) NSArray *properties; -@property (nonatomic, readwrite, assign) bool isSwiftClass; -@property (nonatomic, readwrite, assign) BOOL isEmbedded; -@property (nonatomic, readwrite, assign) BOOL isAsymmetric; - -// class used for this object schema -@property (nonatomic, readwrite, assign) Class objectClass; -@property (nonatomic, readwrite, assign) Class accessorClass; -@property (nonatomic, readwrite, assign) Class unmanagedClass; - -@property (nonatomic, readwrite, assign) bool hasCustomEventSerialization; - -@property (nonatomic, readwrite, nullable) RLMProperty *primaryKeyProperty; - -@property (nonatomic, copy) NSArray *computedProperties; -@property (nonatomic, readonly, nullable) NSArray *swiftGenericProperties; - -// returns a cached or new schema for a given object class -+ (instancetype)schemaForObjectClass:(Class)objectClass; -@end - -@interface RLMObjectSchema (Dynamic) -/** - This method is useful only in specialized circumstances, for example, when accessing objects - in a Realm produced externally. If you are simply building an app on Realm, it is not recommended - to use this method as an [RLMObjectSchema](RLMObjectSchema) is generated automatically for every [RLMObject](RLMObject) subclass. - - Initialize an RLMObjectSchema with classname, objectClass, and an array of properties - - @warning This method is useful only in specialized circumstances. - - @param objectClassName The name of the class used to refer to objects of this type. - @param objectClass The Objective-C class used when creating instances of this type. - @param properties An array of RLMProperty instances describing the managed properties for this type. - - @return An initialized instance of RLMObjectSchema. - */ -- (instancetype)initWithClassName:(NSString *)objectClassName objectClass:(Class)objectClass properties:(NSArray *)properties; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObjectStore.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObjectStore.h deleted file mode 100644 index 6045f1e8e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObjectStore.h +++ /dev/null @@ -1,98 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#ifdef __cplusplus -extern "C" { -#endif - -@class RLMRealm, RLMSchema, RLMObjectBase, RLMResults, RLMProperty; - -typedef NS_ENUM(NSUInteger, RLMUpdatePolicy) { - RLMUpdatePolicyError = 1, - RLMUpdatePolicyUpdateChanged = 3, - RLMUpdatePolicyUpdateAll = 2, -}; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -void RLMVerifyHasPrimaryKey(Class cls); - -void RLMVerifyInWriteTransaction(RLMRealm *const realm); - -// -// Adding, Removing, Getting Objects -// - -// add an object to the given realm -void RLMAddObjectToRealm(RLMObjectBase *object, RLMRealm *realm, RLMUpdatePolicy); - -// delete an object from its realm -void RLMDeleteObjectFromRealm(RLMObjectBase *object, RLMRealm *realm); - -// deletes all objects from a realm -void RLMDeleteAllObjectsFromRealm(RLMRealm *realm); - -// get objects of a given class -RLMResults *RLMGetObjects(RLMRealm *realm, NSString *objectClassName, NSPredicate * _Nullable predicate) -NS_RETURNS_RETAINED; - -// get an object with the given primary key -id _Nullable RLMGetObject(RLMRealm *realm, NSString *objectClassName, id _Nullable key) NS_RETURNS_RETAINED; - -// create object from array or dictionary -RLMObjectBase *RLMCreateObjectInRealmWithValue(RLMRealm *realm, NSString *className, - id _Nullable value, RLMUpdatePolicy updatePolicy) -NS_RETURNS_RETAINED; - -// creates an asymmetric object and doesn't return -void RLMCreateAsymmetricObjectInRealm(RLMRealm *realm, NSString *className, id value); - -// -// Accessor Creation -// - - -// Perform the per-property accessor initialization for a managed RealmSwiftObject -// promotingExisting should be true if the object was previously used as an -// unmanaged object, and false if it is a newly created object. -void RLMInitializeSwiftAccessor(RLMObjectBase *object, bool promotingExisting); - -#ifdef __cplusplus -} - -namespace realm { - class Obj; - class Table; - struct ColKey; - struct ObjLink; -} -class RLMClassInfo; - -// get an object with a given table & object key -RLMObjectBase *RLMObjectFromObjLink(RLMRealm *realm, - realm::ObjLink&& objLink, - bool parentIsSwiftObject) NS_RETURNS_RETAINED; - -// Create accessors -RLMObjectBase *RLMCreateObjectAccessor(RLMClassInfo& info, int64_t key) NS_RETURNS_RETAINED; -RLMObjectBase *RLMCreateObjectAccessor(RLMClassInfo& info, const realm::Obj& obj) NS_RETURNS_RETAINED; -#endif - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObject_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObject_Private.h deleted file mode 100644 index 8ccdbf576..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObject_Private.h +++ /dev/null @@ -1,110 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMProperty, RLMArray, RLMSchema; -typedef NS_ENUM(int32_t, RLMPropertyType); - -FOUNDATION_EXTERN void RLMInitializeWithValue(RLMObjectBase *, id, RLMSchema *); - -typedef void (^RLMObjectNotificationCallback)(RLMObjectBase *_Nullable object, - NSArray *_Nullable propertyNames, - NSArray *_Nullable oldValues, - NSArray *_Nullable newValues, - NSError *_Nullable error); - -// RLMObject accessor and read/write realm -@interface RLMObjectBase () { -@public - RLMRealm *_realm; - __unsafe_unretained RLMObjectSchema *_objectSchema; -} - -// shared schema for this class -+ (nullable RLMObjectSchema *)sharedSchema; - -+ (nullable NSArray *)_getProperties; -+ (bool)_realmIgnoreClass; - -// This enables to override the propertiesMapping in Swift, it is not to be used in Objective-C API. -+ (NSDictionary *)propertiesMapping; -@end - -@interface RLMDynamicObject : RLMObject - -@end - -// Calls valueForKey: and re-raises NSUndefinedKeyExceptions -FOUNDATION_EXTERN id _Nullable RLMValidatedValueForProperty(id object, NSString *key, NSString *className); - -// Compare two RLObjectBases -FOUNDATION_EXTERN BOOL RLMObjectBaseAreEqual(RLMObjectBase * _Nullable o1, RLMObjectBase * _Nullable o2); - -FOUNDATION_EXTERN RLMNotificationToken *RLMObjectBaseAddNotificationBlock(RLMObjectBase *obj, - NSArray *_Nullable keyPaths, - dispatch_queue_t _Nullable queue, - RLMObjectNotificationCallback block); - -RLMNotificationToken *RLMObjectAddNotificationBlock(RLMObjectBase *obj, - RLMObjectChangeBlock block, - NSArray *_Nullable keyPaths, - dispatch_queue_t _Nullable queue); - -// Returns whether the class is a descendent of RLMObjectBase -FOUNDATION_EXTERN BOOL RLMIsObjectOrSubclass(Class klass); - -// Returns whether the class is an indirect descendant of RLMObjectBase -FOUNDATION_EXTERN BOOL RLMIsObjectSubclass(Class klass); - -FOUNDATION_EXTERN const NSUInteger RLMDescriptionMaxDepth; - -FOUNDATION_EXTERN id RLMObjectFreeze(RLMObjectBase *obj) NS_RETURNS_RETAINED; - -FOUNDATION_EXTERN id RLMObjectThaw(RLMObjectBase *obj); - -// Gets an object identifier suitable for use with Combine. This value may -// change when an unmanaged object is added to the Realm. -FOUNDATION_EXTERN uint64_t RLMObjectBaseGetCombineId(RLMObjectBase *); - -// An accessor object which is used to interact with Swift properties from obj-c -@interface RLMManagedPropertyAccessor : NSObject -// Perform any initialization required for KVO on a *unmanaged* object -+ (void)observe:(RLMProperty *)property on:(RLMObjectBase *)parent; -// Initialize the given property on a *managed* object which previous was unmanaged -+ (void)promote:(RLMProperty *)property on:(RLMObjectBase *)parent; -// Initialize the given property on a newly created *managed* object -+ (void)initialize:(RLMProperty *)property on:(RLMObjectBase *)parent; -// Read the value of the property, on either kind of object -+ (id)get:(RLMProperty *)property on:(RLMObjectBase *)parent; -// Set the property to the given value, on either kind of object -+ (void)set:(RLMProperty *)property on:(RLMObjectBase *)parent to:(id)value; -@end - -@interface RLMObjectNotificationToken : RLMNotificationToken -- (void)observe:(RLMObjectBase *)obj - keyPaths:(nullable NSArray *)keyPaths - block:(RLMObjectNotificationCallback)block; -- (void)registrationComplete:(void (^)(void))completion; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMProperty_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMProperty_Private.h deleted file mode 100644 index 6a87ced63..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMProperty_Private.h +++ /dev/null @@ -1,139 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -@class RLMObjectBase; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -BOOL RLMPropertyTypeIsComputed(RLMPropertyType propertyType); -FOUNDATION_EXTERN void RLMValidateSwiftPropertyName(NSString *name); - -// Translate an rlmtype to a string representation -static inline NSString *RLMTypeToString(RLMPropertyType type) { - switch (type) { - case RLMPropertyTypeString: - return @"string"; - case RLMPropertyTypeInt: - return @"int"; - case RLMPropertyTypeBool: - return @"bool"; - case RLMPropertyTypeDate: - return @"date"; - case RLMPropertyTypeData: - return @"data"; - case RLMPropertyTypeDouble: - return @"double"; - case RLMPropertyTypeFloat: - return @"float"; - case RLMPropertyTypeAny: - return @"mixed"; - case RLMPropertyTypeObject: - return @"object"; - case RLMPropertyTypeLinkingObjects: - return @"linking objects"; - case RLMPropertyTypeDecimal128: - return @"decimal128"; - case RLMPropertyTypeObjectId: - return @"object id"; - case RLMPropertyTypeUUID: - return @"uuid"; - } - return @"Unknown"; -} - -// private property interface -@interface RLMProperty () { -@public - RLMPropertyType _type; -} - -- (instancetype)initWithName:(NSString *)name - indexed:(BOOL)indexed - linkPropertyDescriptor:(nullable RLMPropertyDescriptor *)linkPropertyDescriptor - property:(objc_property_t)property; - -- (instancetype)initSwiftPropertyWithName:(NSString *)name - indexed:(BOOL)indexed - linkPropertyDescriptor:(nullable RLMPropertyDescriptor *)linkPropertyDescriptor - property:(objc_property_t)property - instance:(RLMObjectBase *)objectInstance; - -- (void)updateAccessors; - -// private setters -@property (nonatomic, readwrite) NSString *name; -@property (nonatomic, readwrite, assign) RLMPropertyType type; -@property (nonatomic, readwrite) BOOL indexed; -@property (nonatomic, readwrite) BOOL optional; -@property (nonatomic, readwrite) BOOL array; -@property (nonatomic, readwrite) BOOL set; -@property (nonatomic, readwrite) BOOL dictionary; -@property (nonatomic, copy, nullable) NSString *objectClassName; -@property (nonatomic, copy, nullable) NSString *linkOriginPropertyName; - -// private properties -@property (nonatomic, readwrite, nullable) NSString *columnName; -@property (nonatomic, assign) NSUInteger index; -@property (nonatomic, assign) BOOL isPrimary; -@property (nonatomic, assign) BOOL isLegacy; -@property (nonatomic, assign) ptrdiff_t swiftIvar; -@property (nonatomic, assign, nullable) Class swiftAccessor; -@property (nonatomic, readwrite, assign) RLMPropertyType dictionaryKeyType; -@property (nonatomic, readwrite) BOOL customMappingIsOptional; - -// getter and setter names -@property (nonatomic, copy) NSString *getterName; -@property (nonatomic, copy) NSString *setterName; -@property (nonatomic, nullable) SEL getterSel; -@property (nonatomic, nullable) SEL setterSel; - -- (RLMProperty *)copyWithNewName:(NSString *)name; -- (NSString *)typeName; - -@end - -@interface RLMProperty (Dynamic) -/** - This method is useful only in specialized circumstances, for example, in conjunction with - +[RLMObjectSchema initWithClassName:objectClass:properties:]. If you are simply building an - app on Realm, it is not recommended to use this method. - - Initialize an RLMProperty - - @warning This method is useful only in specialized circumstances. - - @param name The property name. - @param type The property type. - @param objectClassName The object type used for Object and Array types. - @param linkOriginPropertyName The property name of the origin of a link. Used for linking objects properties. - - @return An initialized instance of RLMProperty. - */ -- (instancetype)initWithName:(NSString *)name - type:(RLMPropertyType)type - objectClassName:(nullable NSString *)objectClassName - linkOriginPropertyName:(nullable NSString *)linkOriginPropertyName - indexed:(BOOL)indexed - optional:(BOOL)optional; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMPushClient_Private.hpp b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMPushClient_Private.hpp deleted file mode 100644 index 44304c9c3..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMPushClient_Private.hpp +++ /dev/null @@ -1,28 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import "RLMPushClient.h" - -namespace realm::app { -class PushClient; -} - -RLM_DIRECT_MEMBERS -@interface RLMPushClient () -- (instancetype)initWithPushClient:(realm::app::PushClient&&)pushClient; -@end diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMRealmConfiguration_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMRealmConfiguration_Private.h deleted file mode 100644 index 12b09676d..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMRealmConfiguration_Private.h +++ /dev/null @@ -1,52 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2015 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMSchema, RLMEventConfiguration; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMRealmConfiguration () - -@property (nonatomic, readwrite) bool cache; -@property (nonatomic, readwrite) bool dynamic; -@property (nonatomic, readwrite) bool disableFormatUpgrade; -@property (nonatomic, copy, nullable) RLMSchema *customSchema; -@property (nonatomic, copy) NSString *pathOnDisk; -@property (nonatomic, retain, nullable) RLMEventConfiguration *eventConfiguration; -@property (nonatomic, nullable) Class migrationObjectClass; -@property (nonatomic) bool disableAutomaticChangeNotifications; - -// Flexible Sync -@property (nonatomic, readwrite, nullable) RLMFlexibleSyncInitialSubscriptionsBlock initialSubscriptions; -@property (nonatomic, readwrite) BOOL rerunOnOpen; - -// Get the default configuration without copying it -+ (RLMRealmConfiguration *)rawDefaultConfiguration; - -+ (void)resetRealmConfigurationState; - -- (void)setCustomSchemaWithoutCopying:(nullable RLMSchema *)schema; -@end - -// Get a path in the platform-appropriate documents directory with the given filename -FOUNDATION_EXTERN NSString *RLMRealmPathForFile(NSString *fileName); -FOUNDATION_EXTERN NSString *RLMRealmPathForFileAndBundleIdentifier(NSString *fileName, NSString *mainBundleIdentifier); - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMRealm_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMRealm_Private.h deleted file mode 100644 index 95841491f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMRealm_Private.h +++ /dev/null @@ -1,94 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMFastEnumerator, RLMScheduler, RLMAsyncRefreshTask, RLMAsyncWriteTask; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -// Disable syncing files to disk. Cannot be re-enabled. Use only for tests. -FOUNDATION_EXTERN void RLMDisableSyncToDisk(void); -// Set whether the skip backup attribute should be set on temporary files. -FOUNDATION_EXTERN void RLMSetSkipBackupAttribute(bool value); - -FOUNDATION_EXTERN NSData * _Nullable RLMRealmValidatedEncryptionKey(NSData *key); - -// Set the queue used for async open. For testing purposes only. -FOUNDATION_EXTERN void RLMSetAsyncOpenQueue(dispatch_queue_t queue); - -// Translate an in-flight exception resulting from an operation on a SharedGroup to -// an NSError or NSException (if error is nil) -void RLMRealmTranslateException(NSError **error); - -// Block until the Realm at the given path is closed. -FOUNDATION_EXTERN void RLMWaitForRealmToClose(NSString *path); -BOOL RLMIsRealmCachedAtPath(NSString *path); - -// Register a block to be called from the next before_notify() invocation -FOUNDATION_EXTERN void RLMAddBeforeNotifyBlock(RLMRealm *realm, dispatch_block_t block); - -// Test hook to run the async notifiers for a Realm which has the background thread disabled -FOUNDATION_EXTERN void RLMRunAsyncNotifiers(NSString *path); - -// Get the cached Realm for the given configuration and scheduler, if any -FOUNDATION_EXTERN RLMRealm *_Nullable RLMGetCachedRealm(RLMRealmConfiguration *, RLMScheduler *) NS_RETURNS_RETAINED; -// Get a cached Realm for the given configuration and any scheduler. The returned -// Realm is not confined to the current thread, so very few operations are safe -// to perform on it -FOUNDATION_EXTERN RLMRealm *_Nullable RLMGetAnyCachedRealm(RLMRealmConfiguration *) NS_RETURNS_RETAINED; - -// Scheduler an async refresh for the given Realm -FOUNDATION_EXTERN RLMAsyncRefreshTask *_Nullable RLMRealmRefreshAsync(RLMRealm *rlmRealm) NS_RETURNS_RETAINED; - -// RLMRealm private members -@interface RLMRealm () -@property (nonatomic, readonly) BOOL dynamic; -@property (nonatomic, readwrite) RLMSchema *schema; -@property (nonatomic, readonly, nullable) id actor; -@property (nonatomic, readonly) bool isFlexibleSync; - -+ (void)resetRealmState; - -- (void)registerEnumerator:(RLMFastEnumerator *)enumerator; -- (void)unregisterEnumerator:(RLMFastEnumerator *)enumerator; -- (void)detachAllEnumerators; - -- (void)sendNotifications:(RLMNotification)notification; -- (void)verifyThread; -- (void)verifyNotificationsAreSupported:(bool)isCollection; - -- (RLMRealm *)frozenCopy NS_RETURNS_RETAINED; - -+ (nullable instancetype)realmWithConfiguration:(RLMRealmConfiguration *)configuration - confinedTo:(RLMScheduler *)options - error:(NSError **)error; - -- (RLMAsyncWriteTask *)beginAsyncWrite NS_RETURNS_RETAINED; -- (void)commitAsyncWriteWithGrouping:(bool)allowGrouping - completion:(void(^)(NSError *_Nullable))completion; -@end - -@interface RLMPinnedRealm : NSObject -@property (nonatomic, readonly) RLMRealmConfiguration *configuration; - -- (instancetype)initWithRealm:(RLMRealm *)realm; -- (void)unpin; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMResults_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMResults_Private.h deleted file mode 100644 index c7e29bebb..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMResults_Private.h +++ /dev/null @@ -1,33 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectSchema; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMResults () -@property (nonatomic, readonly, getter=isAttached) BOOL attached; - -+ (instancetype)emptyDetachedResults; -- (RLMResults *)snapshot; - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMScheduler.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMScheduler.h deleted file mode 100644 index 3c1b9874b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMScheduler.h +++ /dev/null @@ -1,63 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#ifdef __cplusplus -#include -namespace realm::util { -class Scheduler; -} -#endif - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -// A serial work queue of some sort which represents a thread-confinement context -// of some sort which blocks can be invoked inside. Realms are confined to a -// scheduler, which can be a thread (actually a run loop), a dispatch queue, or -// an actor. The scheduler ensures that the Realm is only used on one thread at -// a time, and allows us to dispatch work to the thread where we can access the -// Realm safely. -RLM_SWIFT_SENDABLE // is immutable -@interface RLMScheduler : NSObject -+ (RLMScheduler *)mainRunLoop __attribute__((objc_direct)); -+ (RLMScheduler *)currentRunLoop __attribute__((objc_direct)); -// A scheduler for the given queue if it's non-nil, and currentRunLoop otherwise -+ (RLMScheduler *)dispatchQueue:(nullable dispatch_queue_t)queue; -+ (RLMScheduler *)actor:(id)actor invoke:(void (^)(dispatch_block_t))invoke - verify:(void (^)(void))verify; - -// Invoke the block on this scheduler. Currently not actually implement for run -// loop schedulers. -- (void)invoke:(dispatch_block_t)block; - -// Cache key for this scheduler suitable for use with NSMapTable. Only valid -// when called from the current scheduler. -- (void *)cacheKey; - -- (nullable id)actor; - -#ifdef __cplusplus -// The object store Scheduler corresponding to this scheduler -- (std::shared_ptr)osScheduler; -#endif -@end - -FOUNDATION_EXTERN void RLMSetMainActor(id actor); - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSchema_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSchema_Private.h deleted file mode 100644 index f4f63c9f8..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSchema_Private.h +++ /dev/null @@ -1,58 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@class RLMRealm; - -// -// RLMSchema private interface -// -@interface RLMSchema () - -/** - Returns an `RLMSchema` containing only the given `RLMObject` subclasses. - - @param classes The classes to be included in the schema. - - @return An `RLMSchema` containing only the given classes. - */ -+ (instancetype)schemaWithObjectClasses:(NSArray *)classes; - -@property (nonatomic, readwrite, copy) NSArray *objectSchema; - -// schema based on runtime objects -+ (instancetype)sharedSchema; - -// schema based upon all currently registered object classes -+ (instancetype)partialSharedSchema; - -// private schema based upon all currently registered object classes. -// includes classes that are excluded from the default schema. -+ (instancetype)partialPrivateSharedSchema; - -// class for string -+ (nullable Class)classForString:(NSString *)className; - -+ (nullable RLMObjectSchema *)sharedSchemaForClass:(Class)cls; - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSet_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSet_Private.h deleted file mode 100644 index 1053e0a0f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSet_Private.h +++ /dev/null @@ -1,43 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -@class RLMObjectBase, RLMProperty; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMSet () -- (instancetype)initWithObjectClassName:(NSString *)objectClassName; -- (instancetype)initWithObjectType:(RLMPropertyType)type optional:(BOOL)optional; -- (NSString *)descriptionWithMaxDepth:(NSUInteger)depth; -- (void)setParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -// YES if the property is declared with old property syntax. -@property (nonatomic, readonly) BOOL isLegacyProperty; -// The name of the property which this collection represents -@property (nonatomic, readonly) NSString *propertyKey; -@end - -void RLMSetValidateMatchingObjectType(RLMSet *set, id value); - -@interface RLMManagedSet : RLMSet -- (instancetype)initWithParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSwiftCollectionBase.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSwiftCollectionBase.h deleted file mode 100644 index a4f864282..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSwiftCollectionBase.h +++ /dev/null @@ -1,46 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectBase, RLMResults, RLMProperty, RLMLinkingObjects; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMSwiftCollectionBase : NSProxy -@property (nonatomic, strong) id _rlmCollection; - -- (instancetype)init; -+ (Class)_backingCollectionType; -- (instancetype)initWithCollection:(id)collection; - -- (nullable id)valueForKey:(NSString *)key; -- (nullable id)valueForKeyPath:(NSString *)keyPath; -- (BOOL)isEqual:(nullable id)object; -@end - -@interface RLMLinkingObjectsHandle : NSObject -- (instancetype)initWithObject:(RLMObjectBase *)object property:(RLMProperty *)property; -- (instancetype)initWithLinkingObjects:(RLMResults *)linkingObjects; - -@property (nonatomic, readonly) RLMLinkingObjects *results; -@property (nonatomic, readonly) NSString *_propertyKey; -@property (nonatomic, readonly) BOOL _isLegacyProperty; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSwiftSupport.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSwiftSupport.h deleted file mode 100644 index 530f0edbf..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSwiftSupport.h +++ /dev/null @@ -1,30 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMSwiftSupport : NSObject - -+ (BOOL)isSwiftClassName:(NSString *)className; -+ (NSString *)demangleClassName:(NSString *)className; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSwiftValueStorage.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSwiftValueStorage.h deleted file mode 100644 index ef3efc610..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSwiftValueStorage.h +++ /dev/null @@ -1,53 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectBase, RLMProperty; - -/// This class implements the backing storage for `RealmProperty<>` and `RealmOptional<>`. -/// This class should not be subclassed or used directly. -@interface RLMSwiftValueStorage : NSProxy -- (instancetype)init; -@end -/// Retrieves the value that is stored, or nil if it is empty. -FOUNDATION_EXTERN id _Nullable RLMGetSwiftValueStorage(RLMSwiftValueStorage *); -/// Sets a value on the property this instance represents for an object. -FOUNDATION_EXTERN void RLMSetSwiftValueStorage(RLMSwiftValueStorage *, id _Nullable); - -/// Initialises managed accessors on an instance of `RLMSwiftValueStorage` -/// @param parent The enclosing parent object. -/// @param prop The property which this class represents. -FOUNDATION_EXTERN void RLMInitializeManagedSwiftValueStorage(RLMSwiftValueStorage *, - RLMObjectBase *parent, - RLMProperty *prop); - -/// Initialises unmanaged accessors on an instance of `RLMSwiftValueStorage` -/// @param parent The enclosing parent object. -/// @param prop The property which this class represents. -FOUNDATION_EXTERN void RLMInitializeUnmanagedSwiftValueStorage(RLMSwiftValueStorage *, - RLMObjectBase *parent, - RLMProperty *prop); - -/// Gets the property name for the RealmProperty instance. This is required for tracing the key path on -/// objects that use the legacy property declaration syntax. -FOUNDATION_EXTERN NSString *RLMSwiftValueStorageGetPropertyName(RLMSwiftValueStorage *); - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSyncConfiguration_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSyncConfiguration_Private.h deleted file mode 100644 index 62d0e1f1f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSyncConfiguration_Private.h +++ /dev/null @@ -1,47 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -typedef RLM_CLOSED_ENUM(NSUInteger, RLMSyncStopPolicy) { - RLMSyncStopPolicyImmediately, - RLMSyncStopPolicyLiveIndefinitely, - RLMSyncStopPolicyAfterChangesUploaded, -}; - - -@class RLMSchema; - -@interface RLMSyncConfiguration () - -// Flexible sync -- (instancetype)initWithUser:(RLMUser *)user; -// Partition-based sync -- (instancetype)initWithUser:(RLMUser *)user - partitionValue:(nullable id)partitionValue; - -// Internal-only APIs -@property (nonatomic, readwrite) RLMSyncStopPolicy stopPolicy; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSyncSubscription_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSyncSubscription_Private.h deleted file mode 100644 index dc438a20e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSyncSubscription_Private.h +++ /dev/null @@ -1,70 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -#pragma mark - Subscription - -@interface RLMSyncSubscription () - -@property (nonatomic, readonly) RLMObjectId *identifier; - -@property (nonatomic, readonly) NSString *queryString; - -@property (nonatomic, readonly) NSString *objectClassName; - -@end - -#pragma mark - SubscriptionSet - -@interface RLMSyncSubscriptionEnumerator : NSObject - -@property (nonatomic, readonly) RLMSyncSubscriptionSet *subscriptionSet; - -- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state - count:(NSUInteger)len; - -- (instancetype)initWithSubscriptionSet:(RLMSyncSubscriptionSet *)subscriptionSet; - -@end - -@interface RLMSyncSubscriptionSet () - -@property (readonly) uint64_t version; - -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - subscriptionName:(nullable NSString *)name - predicate:(NSPredicate *)predicate - updateExisting:(BOOL)updateExisting; - -- (void)waitForSynchronizationOnQueue:(nullable dispatch_queue_t)queue - completionBlock:(void(^)(NSError *))completionBlock; - -- (RLMSyncSubscriptionEnumerator *)fastEnumerator; - -NSUInteger RLMFastEnumerate(NSFastEnumerationState *state, - NSUInteger len, - RLMSyncSubscriptionSet *collection); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMUser_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMUser_Private.h deleted file mode 100644 index f62c9a940..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMUser_Private.h +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// Observer block for user notifications. -typedef void(^RLMUserNotificationBlock)(RLMUser *); - -/// Token that identifies an observer. Unsubscribes when deconstructed to -/// avoid dangling observers, therefore this must be retained to hold -/// onto a subscription. -@interface RLMUserSubscriptionToken : NSObject -- (void)unsubscribe; -@end - -@interface RLMUser () -/// Subscribe to notifications for this RLMUser. -- (RLMUserSubscriptionToken *)subscribe:(RLMUserNotificationBlock)block; - -- (void)logOut; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Realm b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Realm deleted file mode 100755 index c6b0a13ea..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/Realm and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/_CodeSignature/CodeResources b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/_CodeSignature/CodeResources deleted file mode 100644 index 5d86f8b27..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/ios-arm64_x86_64-simulator/Realm.framework/_CodeSignature/CodeResources +++ /dev/null @@ -1,1015 +0,0 @@ - - - - - files - - CHANGELOG.md - - Zv1aE8lgTnRPKTg4+FZa+hYQQNM= - - Headers/NSError+RLMSync.h - - 02q4InRTrAKLrV8lPlx32J0V1Ko= - - Headers/RLMAPIKeyAuth.h - - 1jiv26oYx54zXYdhCKJkfQgUCZ8= - - Headers/RLMApp.h - - Ld28y6nHFgdYCwgko5F6L9mRTCc= - - Headers/RLMArray.h - - SxnXSBzghc13RDA5GoX65htp0Jc= - - Headers/RLMAsymmetricObject.h - - WI4FoMYUXUw5Jgvy2eN4FBgPf3c= - - Headers/RLMAsyncTask.h - - gBGrbdQ+f9PpOJWHbVRh5Zgrcj4= - - Headers/RLMBSON.h - - GxfhbpWdUsi0bAu035zq0wBE47k= - - Headers/RLMCollection.h - - HRgDEwlbCpYK0KE4nKT3aPeVt8Y= - - Headers/RLMConstants.h - - X7tUrKW39pKREt/52svrJ/kN+ZU= - - Headers/RLMCredentials.h - - 5r4wtUdLa9Sk0U2eqOShqRrLI3o= - - Headers/RLMDecimal128.h - - W9LoTzurbOFC6l/vu0W1s6NqP/8= - - Headers/RLMDictionary.h - - J4dcvrLymwvq7wa1sgBJejF2lnk= - - Headers/RLMEmailPasswordAuth.h - - qfpoumflL/1gL/z13dVqmA19PLk= - - Headers/RLMEmbeddedObject.h - - P6AmwHOiZF/Q9/w6LRANmqDu01g= - - Headers/RLMError.h - - f/fmbab1ht8EdLMSS3f0NXW1ejg= - - Headers/RLMFindOneAndModifyOptions.h - - NiYNYX+E6fXAZefMtarr31btYSs= - - Headers/RLMFindOptions.h - - nVYUhdeFVo2/ogMj0swOyCup1LY= - - Headers/RLMLogger.h - - xRxc1g20RrrsSVEhSHPTjV7wUrM= - - Headers/RLMMigration.h - - ek93LcGxSB4AWXYxDtK7lSLIUZA= - - Headers/RLMMongoClient.h - - JRIy+dSIlbOnrRU/zjhrjH/sXTQ= - - Headers/RLMMongoCollection.h - - zKZ75q5wJK1K7basKszSka/XDlE= - - Headers/RLMMongoDatabase.h - - 0+ymiybJvLDiWbH4UgOpF5kK7JA= - - Headers/RLMNetworkTransport.h - - NkHxyI4VoqVug1wJFXOSIPd4/n8= - - Headers/RLMObject.h - - 2XkBjhUx/DUZMHptinJRuCSuN5w= - - Headers/RLMObjectBase.h - - 6+LtdM5Zd9OGUBHLtOy0mNzlGNg= - - Headers/RLMObjectBase_Dynamic.h - - lN/ItPF2L4asyDrzvE9tb2NWeQU= - - Headers/RLMObjectId.h - - FAhiEJMRgGhU/STMYxb6Cat31Ns= - - Headers/RLMObjectSchema.h - - yasl78Lq+PvN6f/sBDQAG9IiiwU= - - Headers/RLMProperty.h - - QyE/WKZTEZokOC4HNpIuGWTo3V8= - - Headers/RLMProviderClient.h - - KI1gAsi16P1iZdUTVEJSXAZF+VQ= - - Headers/RLMPushClient.h - - ZXzPubk1A63/oe83WFy6s80UAdY= - - Headers/RLMRealm+Sync.h - - bRbsIAkomXsV+zAaLltmyzxBMvk= - - Headers/RLMRealm.h - - tXxGw5mHQm9c6gM5XAu3/1zO/F8= - - Headers/RLMRealmConfiguration.h - - tACtbQrCi+eN56JH+gH60N0lXOQ= - - Headers/RLMRealm_Dynamic.h - - 0cVBS7WHOS7nUFs7Zr0DQHRc7I0= - - Headers/RLMResults.h - - OeV5SVo3AWcXxIeYr3YYc/Iu7tw= - - Headers/RLMSchema.h - - iJLLK3FYqubxFLoT7EHwmGOnbGU= - - Headers/RLMSectionedResults.h - - +n3MZjJSPd30hm1WNfqQoj1gx44= - - Headers/RLMSet.h - - wCO5ODFhqKDzuFdZZfmBnsgScdM= - - Headers/RLMSwiftObject.h - - TyJjSFDM4ZAekB3cZKc+Fv89CqU= - - Headers/RLMSwiftProperty.h - - /CqEDrE+WN75hOjEyKoDOFTM5cI= - - Headers/RLMSyncConfiguration.h - - 0U9O9AfTO5SB6TJryUm8di9tn5Y= - - Headers/RLMSyncManager.h - - YkhlSPT2hNZyA//Lf07+5rkaTsc= - - Headers/RLMSyncSession.h - - ENN75q8RC4BNpH67LE7NiUtO08U= - - Headers/RLMSyncSubscription.h - - x1LOw7ekOPIKEzT7r93iFXMpvHo= - - Headers/RLMThreadSafeReference.h - - TFdISOKXlf2bIyLYEAbzQg2nMy0= - - Headers/RLMUpdateResult.h - - Mv08aMtnTA3wP3RetaDB4sHtOGU= - - Headers/RLMUser.h - - j5Zpgb+g0lIwk90bDaauU6Y1Fbk= - - Headers/RLMUserAPIKey.h - - cIVGNVxydkLjfkIoehfmqwwGd0w= - - Headers/RLMValue.h - - PQWyj9ZNWsNAy1kGw6ENnNfTQ7c= - - Headers/Realm.h - - fDREEG2URHEbKjZ2nfKq+7M/7m8= - - Info.plist - - NDthP8IGAbod/DoVrdChQyBHybo= - - LICENSE - - htlQ0eA7QbvmaoSv/b3yVb0Yvsc= - - Modules/module.modulemap - - A28J5rfl2ooZX6nLmKAtWsKyoFg= - - PrivateHeaders/RLMAccessor.h - - khE1Bhu30Ou7L9/AFJKc/IJcRuU= - - PrivateHeaders/RLMApp_Private.h - - fw57ZhMCNGsWCpB/lCMaKqf0gek= - - PrivateHeaders/RLMArray_Private.h - - oA6RhNNa1GlEp9Z1dIc6yAXL91g= - - PrivateHeaders/RLMAsyncTask_Private.h - - ayc2eXD44f0/BptRlmZc+ocrzs8= - - PrivateHeaders/RLMBSON_Private.hpp - - Ku6rvqGFX5xk7aXxX4/93IoUJIw= - - PrivateHeaders/RLMCollection_Private.h - - CjigFgVyD/CQlglvVOv3mgmYhmM= - - PrivateHeaders/RLMDictionary_Private.h - - 9jGJQrUJ13oF7wuVyURhFJvDa48= - - PrivateHeaders/RLMEvent.h - - Z1CXQWPXt3itYLuQPrnDE2DOCIQ= - - PrivateHeaders/RLMLogger_Private.h - - vXtWFbH2FmBySg6psXIsF4xTyVw= - - PrivateHeaders/RLMMigration_Private.h - - Rkv9PVKy4D9WpE91+PF5fG8dqb4= - - PrivateHeaders/RLMMongoCollection_Private.h - - SxxQvypVsEBDtC0poogA7IuabvY= - - PrivateHeaders/RLMObjectBase_Private.h - - PQsL4hvY5WGKrm+ENzb3IzoLFMI= - - PrivateHeaders/RLMObjectSchema_Private.h - - 87hjm4eoCqM0JdgW0yVzYipgCv0= - - PrivateHeaders/RLMObjectStore.h - - LH3NYAHYk37ukx3w36l3VfRkWLY= - - PrivateHeaders/RLMObject_Private.h - - fSysuPyok9rS8jBVWujPT5ZYPkw= - - PrivateHeaders/RLMProperty_Private.h - - YrwESqK7Bp+VJPR2q1unO0HC1n4= - - PrivateHeaders/RLMPushClient_Private.hpp - - VB6WiIHnxZ2GvtGB/Dt8BukU3g8= - - PrivateHeaders/RLMRealmConfiguration_Private.h - - fDc6xRp+/ItxCAWyzEto1dXyZDU= - - PrivateHeaders/RLMRealm_Private.h - - FQ45UlPks0oI4fN23S8KH3+cY4U= - - PrivateHeaders/RLMResults_Private.h - - pYrkP89R066MUPthppAiIF6icJ0= - - PrivateHeaders/RLMScheduler.h - - bmnqRPRwLoqjOIHXTAATSTi2Uzs= - - PrivateHeaders/RLMSchema_Private.h - - W3h50q1OLVJcyk0pNZ6qMcSbW0U= - - PrivateHeaders/RLMSet_Private.h - - 1UAOTMK/IHQOq44rH3GVRul1lT0= - - PrivateHeaders/RLMSwiftCollectionBase.h - - g/qYcSeOq1sDRrlomok4rP7w7gA= - - PrivateHeaders/RLMSwiftSupport.h - - 4T1N9038YMMHtsxSBDLu6RQ+Lpo= - - PrivateHeaders/RLMSwiftValueStorage.h - - yk9OQJHakSFzvm/0GWEw3L/IYdg= - - PrivateHeaders/RLMSyncConfiguration_Private.h - - Uq5Fv8y5c2BeibZeqe/OqOfQumI= - - PrivateHeaders/RLMSyncSubscription_Private.h - - MNGSKmrqPPyhHcOtu/BqSSURYXM= - - PrivateHeaders/RLMUser_Private.h - - j+PpsIBJsBM3k2htqZGM/y4Fw3M= - - - files2 - - CHANGELOG.md - - hash2 - - wt8p9tw4OPVj/LtpO9d+DXFoOnRQ6hRaxf/hS2NxDRg= - - - Headers/NSError+RLMSync.h - - hash2 - - 6nK1lw6vBPSTrCi83gbHTMykzmdmX0MlMrq6LmJk94I= - - - Headers/RLMAPIKeyAuth.h - - hash2 - - FwweqLeo/BZi7cBnkDu+AdBgnukrjAbjicdVQJ3PVV8= - - - Headers/RLMApp.h - - hash2 - - fmHB8oywmfycQqOzXoYB99LpOLE7akGn0ZrJtqviiTs= - - - Headers/RLMArray.h - - hash2 - - KaucaZvTcO+xDUtNo4JYySrZMCq6E8OiSYOMG3/LBxE= - - - Headers/RLMAsymmetricObject.h - - hash2 - - +liD/ke74W4Loa4OKvFBITIRTkZRZbItMxN6R4eU7wY= - - - Headers/RLMAsyncTask.h - - hash2 - - iyHi4LWQgTu2yYDS23OZ1wfdZt3ouoY5VoI0aEsHOm0= - - - Headers/RLMBSON.h - - hash2 - - W+5lc5SCRmNbVF2Pu9Zd2v46R+WALQ7xoNCOYC1Swnw= - - - Headers/RLMCollection.h - - hash2 - - womyBrMRt2s1UKKkPo++KwOv6DtP6q48hcBi1jfM2hI= - - - Headers/RLMConstants.h - - hash2 - - QntrtgpnRkkfsRAPt4SY8+3rscdQDbqztCyWdLS0vsU= - - - Headers/RLMCredentials.h - - hash2 - - ObUBKMWeTU0zI7Q4Ts9H5trRs4y4T3bCUY808oTm0bY= - - - Headers/RLMDecimal128.h - - hash2 - - Ubfmc9QWzsK+AcqbQRwaiXdylBV0LgqlyqeMBY1+LyQ= - - - Headers/RLMDictionary.h - - hash2 - - 7zN2nXgEwGfrPRtbgqtfoLrwJbwqohcVvU/OyA/07Lk= - - - Headers/RLMEmailPasswordAuth.h - - hash2 - - kPgBdHJePj/cHAbWCVhZlW1gCQP5jXtJ7XudO0PWjJc= - - - Headers/RLMEmbeddedObject.h - - hash2 - - ixHqXedHxkS6e1f2hOY4TR7NWMyNq34b4/nm8SR0Oxc= - - - Headers/RLMError.h - - hash2 - - 6duvM3p0FRf6fZ+aS57vHkf7WvV1KPoz7PcIZA48WTU= - - - Headers/RLMFindOneAndModifyOptions.h - - hash2 - - eBuQnRLTeMBzF7m2R9PMJor8N0HG8BATxdCptRT1l9M= - - - Headers/RLMFindOptions.h - - hash2 - - P8MSaPFACOtAPsGYinSqt6NMIsXKcWkHpFTlly2GBYo= - - - Headers/RLMLogger.h - - hash2 - - Rc5dqT87eP/gD3kVZ1e7cRwI9Mkt5r6CFn/coM+9wNw= - - - Headers/RLMMigration.h - - hash2 - - /CXq+e7CtzaXdrGoLya2a56Zz6xWRH73N3RzyMcQrgs= - - - Headers/RLMMongoClient.h - - hash2 - - mcINEnrePRx0xfRaNvOmeXYRadQMzwLngLrJ1OVyopc= - - - Headers/RLMMongoCollection.h - - hash2 - - E0fX0BjuJ0j4c8TuCPbwnLNKz673nghSyUN4BYN/+Io= - - - Headers/RLMMongoDatabase.h - - hash2 - - wnJWmMW0z3xO9KVRJKpiE+xkaKkzXBXiH5j+8eaFmcA= - - - Headers/RLMNetworkTransport.h - - hash2 - - AicqavQF04Q9MIj7DC5P9gBz6OuViFiiAmXdjlFnDHg= - - - Headers/RLMObject.h - - hash2 - - OiikDToZtuVXIwxkh+yGFMFCP0c/2M6A8cIP77/xvcU= - - - Headers/RLMObjectBase.h - - hash2 - - 0IkNkedPyHNJuPYD0PmVx4Bg/+mH8tv2PNXD2m9hWV8= - - - Headers/RLMObjectBase_Dynamic.h - - hash2 - - MhHocXkaDJWhg+kvj9Hqqy9FG4zTtna2Np2i7p4l/mA= - - - Headers/RLMObjectId.h - - hash2 - - Y7IcVMBjUeMCgI/orPGngNh0qcgC7R7fwx2STYYTC2g= - - - Headers/RLMObjectSchema.h - - hash2 - - 8oCJihoGgigIF170SRk/yU5RLDNX9TYQUrXxLjYrtuM= - - - Headers/RLMProperty.h - - hash2 - - nV0mZEIKVaPW2/FVbUaWuXy+nEV5iB30UZ55i0VVCno= - - - Headers/RLMProviderClient.h - - hash2 - - aOPxwbDKabtIt2wbqZ4Wb/le1H43X9HXrNkONHiEX2M= - - - Headers/RLMPushClient.h - - hash2 - - vLfYK+JyPmkHz32A9v/JPJGPKAL9QTKDDjuzAvbp+oQ= - - - Headers/RLMRealm+Sync.h - - hash2 - - WcmSf38ttMQ4awjqOn4zkmpysaf44aAT0GgECwvPPTA= - - - Headers/RLMRealm.h - - hash2 - - DMk8xOvPhlnZalU0C2E5O60eqhA67YErgxkj3mI4jXc= - - - Headers/RLMRealmConfiguration.h - - hash2 - - j5GiT0/nxORHqliXnJv/kkbOOqZX33xDbk8OTR7zDwU= - - - Headers/RLMRealm_Dynamic.h - - hash2 - - S14hbsZJZN4uVtz+HI326QGjnxKdSRlU6Ogf/zRhn3I= - - - Headers/RLMResults.h - - hash2 - - qZJ0imHeOKCxk0VNEkVldju7BQHiZ2hohjwCeU6aZTg= - - - Headers/RLMSchema.h - - hash2 - - Da+xBUjLeHl2hcOCpSFRylZchf6KtXuqqjscXH1jJQM= - - - Headers/RLMSectionedResults.h - - hash2 - - sXdD7rSZHJKtS62ScBNQhWdpGkKW1aDVK0qCzOouJIs= - - - Headers/RLMSet.h - - hash2 - - GJyUsZbhXDGgjqOQlfqqef9XjQnvB5nCRPHtZJWGa3w= - - - Headers/RLMSwiftObject.h - - hash2 - - Mp9akxBWxbrBunN7cH8rKSLxSps0tbV78UDSheKAlcU= - - - Headers/RLMSwiftProperty.h - - hash2 - - 9FsxWX7jcaks+2ZmTf4cgN0zvirLeNQHSB6BYAO1EYI= - - - Headers/RLMSyncConfiguration.h - - hash2 - - Qd1NmY+Z/yEGUpaaue7NEJ5fPWaRdhGPZwdhliidIpY= - - - Headers/RLMSyncManager.h - - hash2 - - rFV4QDsBonA29YqdZXsYhNSVewEYkrafSLPWBGaEhqI= - - - Headers/RLMSyncSession.h - - hash2 - - nvtBHH3xJsThO0B4IC70G3oFD2TAm3ylKbmewSOosI4= - - - Headers/RLMSyncSubscription.h - - hash2 - - bLLVFGHhtBca6vgsFZmW1oNaoYQlrjFELS/wESp9AbM= - - - Headers/RLMThreadSafeReference.h - - hash2 - - UMODRNRT6SDDKzmYIElQuKxojpiUtxhb0o/KbUM9BiA= - - - Headers/RLMUpdateResult.h - - hash2 - - lAHF8rLoAYtBCB3iqPCJEeSAijx4p/TLf2Q/B/qh5lY= - - - Headers/RLMUser.h - - hash2 - - wTq72vEeK8F3E3s/3DWLNz76GPbIMmApC5KfRF6m0ro= - - - Headers/RLMUserAPIKey.h - - hash2 - - 1QyqOo1U0h/D83T3jmF2rcq87+P6CHZvXh5dNLZQV00= - - - Headers/RLMValue.h - - hash2 - - kTEM0oJVWJv89s6/r6s0AHQoO1bJZsYB8IHZKbPtddY= - - - Headers/Realm.h - - hash2 - - kjoP0TvFhg49q7sxVEgPoNFg+zqo9bCE2Uh0YOpDpbE= - - - LICENSE - - hash2 - - aYSSIb+5AFPeITTvXm1UAoe0uYBiMmSS8flvXaaFUks= - - - Modules/module.modulemap - - hash2 - - KdpbsAGrxax/jx81TZ93YswnCwT1BZTor6VwIHvgRUs= - - - PrivateHeaders/RLMAccessor.h - - hash2 - - SPn/lNQWueENJmkQ4wtBIhfjYt6+nmmT97X3fzuAJC0= - - - PrivateHeaders/RLMApp_Private.h - - hash2 - - 4pd3636NRX7kQgsEy7dv7IQH/AyZMKjQvA2nmK97Vq0= - - - PrivateHeaders/RLMArray_Private.h - - hash2 - - 2N5vpeRBFWpvYEVWixFuVwigDP3cRo9i7S0qyB7fCZE= - - - PrivateHeaders/RLMAsyncTask_Private.h - - hash2 - - vD90SYI5658JDp88stHbsxALdVNhs0Tojcld9hVORHE= - - - PrivateHeaders/RLMBSON_Private.hpp - - hash2 - - BbwPX5lPL+B+5GRik9KiI5HcYoKNH/Tsciqyo3dZwBw= - - - PrivateHeaders/RLMCollection_Private.h - - hash2 - - Ez5JFCGYAGERpmwzK44V9Wu5NkwdLOrl1iHqFvur6r4= - - - PrivateHeaders/RLMDictionary_Private.h - - hash2 - - L46EZOdftwGMzm9VC/4u3hkjsshqrE1MqRXoAkJqsOg= - - - PrivateHeaders/RLMEvent.h - - hash2 - - 5QzhSVhLCncN5PArOpGSswyWYU5jSvmLJ64E6SIAYdw= - - - PrivateHeaders/RLMLogger_Private.h - - hash2 - - FcXRklemoAfn0U01YWdTuUgt0i183/x1v71EplpuujM= - - - PrivateHeaders/RLMMigration_Private.h - - hash2 - - ffQpfBvMLXuV8NocpO5ksVSmYUATypSSGr91LEfzT6o= - - - PrivateHeaders/RLMMongoCollection_Private.h - - hash2 - - PihL2Vx/JsPS4RvQXdpvaQ+VxmtmdOwaYgtH6f9wNQs= - - - PrivateHeaders/RLMObjectBase_Private.h - - hash2 - - qSCecm7kZ3JIPZlhy4bqSwWYGpxP6cO+4XEUgSvdUTY= - - - PrivateHeaders/RLMObjectSchema_Private.h - - hash2 - - YULa8m2pbU/ji4KozUqn/FNoRTWwO71lgKeJiAbPRYA= - - - PrivateHeaders/RLMObjectStore.h - - hash2 - - 0KjmazUjg/mYvymGTJ74ChBgvrqN2Lc9O0TqcYF/Mic= - - - PrivateHeaders/RLMObject_Private.h - - hash2 - - +H8SMf9eYajdgBd1CmVWutUX5RsEHIsqKiruzH9R/Ok= - - - PrivateHeaders/RLMProperty_Private.h - - hash2 - - SCHY8+Qpt8utNhA5fwnUlOZ4Lg3O4Ubp5JrNuf01QIA= - - - PrivateHeaders/RLMPushClient_Private.hpp - - hash2 - - 2Os6mvA+v08M/g6mBUU8xUYAJvdOf9G/Fe1c0QuXlVg= - - - PrivateHeaders/RLMRealmConfiguration_Private.h - - hash2 - - syVrRHUbHQtVS/Dn94ZFKgu8iSJM1m17S0xnMCK9yEg= - - - PrivateHeaders/RLMRealm_Private.h - - hash2 - - Iwvw9zZudHE58doxwpdgpZqHaiCFT0Vn256EkmeFzIw= - - - PrivateHeaders/RLMResults_Private.h - - hash2 - - 7XS2lKYYaVQEMQ+lyOes++x+RIKDsVc8K2ZyTCf2NgE= - - - PrivateHeaders/RLMScheduler.h - - hash2 - - k60PzA5BmG/FSt34q+UmdeQWecO5OhB+uZnq99H1Fzc= - - - PrivateHeaders/RLMSchema_Private.h - - hash2 - - xuglEVxHTOiGP9pVTJ8oLhSTM1SRk38dn7uPHqUQ93Y= - - - PrivateHeaders/RLMSet_Private.h - - hash2 - - Fo+6TD0oovdpdflJ6GyRvXgCOWHSSjd2bAR+j7Fs88U= - - - PrivateHeaders/RLMSwiftCollectionBase.h - - hash2 - - bDV50WQPz5wCRCcFfCQLob/JPetY8XeEOZOJXoLtGKs= - - - PrivateHeaders/RLMSwiftSupport.h - - hash2 - - bDHCy6fOU4zn5MSi6CAVRmKQsc7GJgx6X4RNHbuI8Ws= - - - PrivateHeaders/RLMSwiftValueStorage.h - - hash2 - - D9eklFNwtXSh83+sMaYU1SNzeidnyKUXZV2PLWt+Ank= - - - PrivateHeaders/RLMSyncConfiguration_Private.h - - hash2 - - neftVth2HwCuILURLXm1nMY/GZCeo0G5/yYCIS8gz3Q= - - - PrivateHeaders/RLMSyncSubscription_Private.h - - hash2 - - Y9ySSatKNxy/XkESWScAioTpFet/83QmLhrE1VUIgmU= - - - PrivateHeaders/RLMUser_Private.h - - hash2 - - 4DKpP+7zxmcfnitz1DhLK2fhsChCk2aPWbG0B85100o= - - - - rules - - ^.* - - ^.*\.lproj/ - - optional - - weight - 1000 - - ^.*\.lproj/locversion.plist$ - - omit - - weight - 1100 - - ^Base\.lproj/ - - weight - 1010 - - ^version.plist$ - - - rules2 - - .*\.dSYM($|/) - - weight - 11 - - ^(.*/)?\.DS_Store$ - - omit - - weight - 2000 - - ^.* - - ^.*\.lproj/ - - optional - - weight - 1000 - - ^.*\.lproj/locversion.plist$ - - omit - - weight - 1100 - - ^Base\.lproj/ - - weight - 1010 - - ^Info\.plist$ - - omit - - weight - 20 - - ^PkgInfo$ - - omit - - weight - 20 - - ^embedded\.provisionprofile$ - - weight - 20 - - ^version\.plist$ - - weight - 20 - - - - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Headers b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Headers deleted file mode 120000 index a177d2a6b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Headers +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/Headers \ No newline at end of file diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Modules b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Modules deleted file mode 120000 index 5736f3186..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Modules +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/Modules \ No newline at end of file diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/PrivateHeaders b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/PrivateHeaders deleted file mode 120000 index d8e564526..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/PrivateHeaders +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/PrivateHeaders \ No newline at end of file diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Realm b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Realm deleted file mode 120000 index d12855ef9..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Realm +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/Realm \ No newline at end of file diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Resources b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Resources deleted file mode 120000 index 953ee36f3..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Resources +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/Resources \ No newline at end of file diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/NSError+RLMSync.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/NSError+RLMSync.h deleted file mode 100644 index 5ef323a24..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/NSError+RLMSync.h +++ /dev/null @@ -1,46 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2017 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@class RLMSyncErrorActionToken; - -/// NSError category extension providing methods to get data out of Realm's -/// "client reset" error. -@interface NSError (RLMSync) - -/** - Given an appropriate Atlas App Services error, return the token that - can be passed into `+[RLMSyncSession immediatelyHandleError:]` to - immediately perform error clean-up work, or nil if the error isn't of - a type that provides a token. - */ -- (nullable RLMSyncErrorActionToken *)rlmSync_errorActionToken NS_REFINED_FOR_SWIFT; - -/** - Given an Atlas App Services client reset error, return the path where the - backup copy of the Realm will be placed once the client reset process is - complete. - */ -- (nullable NSString *)rlmSync_clientResetBackedUpRealmPath NS_SWIFT_UNAVAILABLE(""); - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMAPIKeyAuth.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMAPIKeyAuth.h deleted file mode 100644 index 642bdd95d..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMAPIKeyAuth.h +++ /dev/null @@ -1,95 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMUserAPIKey, RLMObjectId; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// Provider client for user API keys. -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMAPIKeyAuth : RLMProviderClient - -/// A block type used to report an error -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMAPIKeyAuthOptionalErrorBlock)(NSError * _Nullable); - -/// A block type used to return an `RLMUserAPIKey` on success, or an `NSError` on failure -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMOptionalUserAPIKeyBlock)(RLMUserAPIKey * _Nullable, NSError * _Nullable); - -/// A block type used to return an array of `RLMUserAPIKey` on success, or an `NSError` on failure -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMUserAPIKeysBlock)(NSArray * _Nullable, NSError * _Nullable); - -/** - Creates a user API key that can be used to authenticate as the current user. - - @param name The name of the API key to be created. - @param completion A callback to be invoked once the call is complete. -*/ -- (void)createAPIKeyWithName:(NSString *)name - completion:(RLMOptionalUserAPIKeyBlock)completion NS_SWIFT_NAME(createAPIKey(named:completion:)); - -/** - Fetches a user API key associated with the current user. - - @param objectId The ObjectId of the API key to fetch. - @param completion A callback to be invoked once the call is complete. - */ -- (void)fetchAPIKey:(RLMObjectId *)objectId - completion:(RLMOptionalUserAPIKeyBlock)completion; - -/** - Fetches the user API keys associated with the current user. - - @param completion A callback to be invoked once the call is complete. - */ -- (void)fetchAPIKeysWithCompletion:(RLMUserAPIKeysBlock)completion; - -/** - Deletes a user API key associated with the current user. - - @param objectId The ObjectId of the API key to delete. - @param completion A callback to be invoked once the call is complete. - */ -- (void)deleteAPIKey:(RLMObjectId *)objectId - completion:(RLMAPIKeyAuthOptionalErrorBlock)completion; - -/** - Enables a user API key associated with the current user. - - @param objectId The ObjectId of the API key to enable. - @param completion A callback to be invoked once the call is complete. - */ -- (void)enableAPIKey:(RLMObjectId *)objectId - completion:(RLMAPIKeyAuthOptionalErrorBlock)completion; - -/** - Disables a user API key associated with the current user. - - @param objectId The ObjectId of the API key to disable. - @param completion A callback to be invoked once the call is complete. - */ -- (void)disableAPIKey:(RLMObjectId *)objectId - completion:(RLMAPIKeyAuthOptionalErrorBlock)completion; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMApp.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMApp.h deleted file mode 100644 index 2228232e8..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMApp.h +++ /dev/null @@ -1,235 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@protocol RLMNetworkTransport, RLMBSON; - -@class RLMUser, RLMCredentials, RLMSyncManager, RLMEmailPasswordAuth, RLMPushClient, RLMSyncTimeoutOptions; - -/// A block type used for APIs which asynchronously vend an `RLMUser`. -typedef void(^RLMUserCompletionBlock)(RLMUser * _Nullable, NSError * _Nullable); - -/// A block type used to report an error -typedef void(^RLMOptionalErrorBlock)(NSError * _Nullable); - -#pragma mark RLMAppConfiguration - -/// Properties representing the configuration of a client -/// that communicate with a particular Realm application. -@interface RLMAppConfiguration : NSObject - -/// A custom base URL to request against. -@property (nonatomic, strong, nullable) NSString *baseURL; - -/// The custom transport for network calls to the server. -@property (nonatomic, strong, nullable) id transport; - -/// :nodoc: -@property (nonatomic, strong, nullable) NSString *localAppName - __attribute__((deprecated("This field is not used"))); -/// :nodoc: -@property (nonatomic, strong, nullable) NSString *localAppVersion - __attribute__((deprecated("This field is not used"))); - -/// The default timeout for network requests. -@property (nonatomic, assign) NSUInteger defaultRequestTimeoutMS; - -/// If enabled (the default), a single connection is used for all Realms opened -/// with a single sync user. If disabled, a separate connection is used for each -/// Realm. -/// -/// Session multiplexing reduces resources used and typically improves -/// performance. When multiplexing is enabled, the connection is not immediately -/// closed when the last session is closed, and instead remains open for -/// ``RLMSyncTimeoutOptions.connectionLingerTime`` milliseconds (30 seconds by -/// default). -@property (nonatomic, assign) BOOL enableSessionMultiplexing; - -/** - Options for the assorted types of connection timeouts for sync connections. - - If nil default values for all timeouts are used instead. - */ -@property (nonatomic, nullable, copy) RLMSyncTimeoutOptions *syncTimeouts; - -/// :nodoc: -- (instancetype)initWithBaseURL:(nullable NSString *)baseURL - transport:(nullable id)transport - localAppName:(nullable NSString *)localAppName - localAppVersion:(nullable NSString *)localAppVersion -__attribute__((deprecated("localAppName and localAppVersion are unused"))); - -/// :nodoc: -- (instancetype)initWithBaseURL:(nullable NSString *) baseURL - transport:(nullable id)transport - localAppName:(nullable NSString *)localAppName - localAppVersion:(nullable NSString *)localAppVersion - defaultRequestTimeoutMS:(NSUInteger)defaultRequestTimeoutMS -__attribute__((deprecated("localAppName and localAppVersion are unused"))); - -/** -Create a new Realm App configuration. - -@param baseURL A custom base URL to request against. -@param transport A custom network transport. -*/ -- (instancetype)initWithBaseURL:(nullable NSString *)baseURL - transport:(nullable id)transport; - -/** - Create a new Realm App configuration. - - @param baseURL A custom base URL to request against. - @param transport A custom network transport. - @param defaultRequestTimeoutMS A custom default timeout for network requests. - */ -- (instancetype)initWithBaseURL:(nullable NSString *) baseURL - transport:(nullable id)transport - defaultRequestTimeoutMS:(NSUInteger)defaultRequestTimeoutMS; - -@end - -#pragma mark RLMApp - -/** - The `RLMApp` has the fundamental set of methods for communicating with a Realm - application backend. - - This interface provides access to login and authentication. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // internally thread-safe -@interface RLMApp : NSObject - -/// The configuration for this Realm app. -@property (nonatomic, readonly) RLMAppConfiguration *configuration; - -/// The `RLMSyncManager` for this Realm app. -@property (nonatomic, readonly) RLMSyncManager *syncManager; - -/// Get a dictionary containing all users keyed on id. -@property (nonatomic, readonly) NSDictionary *allUsers; - -/// Get the current user logged into the Realm app. -@property (nonatomic, readonly, nullable) RLMUser *currentUser; - -/// The app ID for this Realm app. -@property (nonatomic, readonly) NSString *appId; - -/** - A client for the email/password authentication provider which - can be used to obtain a credential for logging in. - - Used to perform requests specifically related to the email/password provider. -*/ -@property (nonatomic, readonly) RLMEmailPasswordAuth *emailPasswordAuth; - -/** - Get an application with a given appId and configuration. - - @param appId The unique identifier of your Realm app. - */ -+ (instancetype)appWithId:(NSString *)appId; - -/** - Get an application with a given appId and configuration. - - @param appId The unique identifier of your Realm app. - @param configuration A configuration object to configure this client. - */ -+ (instancetype)appWithId:(NSString *)appId - configuration:(nullable RLMAppConfiguration *)configuration; - -/** - Login to a user for the Realm app. - - @param credentials The credentials identifying the user. - @param completion A callback invoked after completion. - */ -- (void)loginWithCredential:(RLMCredentials *)credentials - completion:(RLMUserCompletionBlock)completion NS_REFINED_FOR_SWIFT; - -/** - Switches the active user to the specified user. - - This sets which user is used by all RLMApp operations which require a user. This is a local operation which does not access the network. - An exception will be throw if the user is not valid. The current user will remain logged in. - - @param syncUser The user to switch to. - @returns The user you intend to switch to - */ -- (RLMUser *)switchToUser:(RLMUser *)syncUser; - -/** - A client which can be used to register devices with the server to receive push notificatons - */ -- (RLMPushClient *)pushClientWithServiceName:(NSString *)serviceName - NS_SWIFT_NAME(pushClient(serviceName:)); - -/** - RLMApp instances are cached internally by Realm and cannot be created directly. - - Use `+[RLMRealm appWithId]` or `+[RLMRealm appWithId:configuration:]` - to obtain a reference to an RLMApp. - */ -- (instancetype)init __attribute__((unavailable("Use +appWithId or appWithId:configuration:."))); - -/** -RLMApp instances are cached internally by Realm and cannot be created directly. - -Use `+[RLMRealm appWithId]` or `+[RLMRealm appWithId:configuration:]` -to obtain a reference to an RLMApp. -*/ -+ (instancetype)new __attribute__((unavailable("Use +appWithId or appWithId:configuration:."))); - -@end - -#pragma mark - Sign In With Apple Extension - -API_AVAILABLE(ios(13.0), macos(10.15), tvos(13.0), watchos(6.0)) -/// Use this delegate to be provided a callback once authentication has succeed or failed -@protocol RLMASLoginDelegate - -/// Callback that is invoked should the authentication fail. -/// @param error An error describing the authentication failure. -- (void)authenticationDidFailWithError:(NSError *)error NS_SWIFT_NAME(authenticationDidComplete(error:)); - -/// Callback that is invoked should the authentication succeed. -/// @param user The newly authenticated user. -- (void)authenticationDidCompleteWithUser:(RLMUser *)user NS_SWIFT_NAME(authenticationDidComplete(user:)); - -@end - -API_AVAILABLE(ios(13.0), macos(10.15), tvos(13.0), watchos(6.0)) -/// Category extension that deals with Sign In With Apple authentication. -/// This is only available on OS's that support `AuthenticationServices` -@interface RLMApp (ASLogin) - -/// Use this delegate to be provided a callback once authentication has succeed or failed. -@property (nonatomic, weak, nullable) id authorizationDelegate; - -/// Sets the ASAuthorizationControllerDelegate to be handled by `RLMApp` -/// @param controller The ASAuthorizationController in which you want `RLMApp` to consume its delegate. -- (void)setASAuthorizationControllerDelegateForController:(ASAuthorizationController *)controller NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMArray.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMArray.h deleted file mode 100644 index b2c6c1664..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMArray.h +++ /dev/null @@ -1,652 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObject, RLMResults; - -/** - `RLMArray` is the container type in Realm used to define to-many relationships. - - Unlike an `NSArray`, `RLMArray`s hold a single type, specified by the `objectClassName` property. - This is referred to in these docs as the “type” of the array. - - When declaring an `RLMArray` property, the type must be marked as conforming to a - protocol by the same name as the objects it should contain (see the - `RLM_COLLECTION_TYPE` macro). In addition, the property can be declared using Objective-C - generics for better compile-time type safety. - - RLM_COLLECTION_TYPE(ObjectType) - ... - @property RLMArray *arrayOfObjectTypes; - - `RLMArray`s can be queried with the same predicates as `RLMObject` and `RLMResult`s. - - `RLMArray`s cannot be created directly. `RLMArray` properties on `RLMObject`s are - lazily created when accessed, or can be obtained by querying a Realm. - - ### Key-Value Observing - - `RLMArray` supports array key-value observing on `RLMArray` properties on `RLMObject` - subclasses, and the `invalidated` property on `RLMArray` instances themselves is - key-value observing compliant when the `RLMArray` is attached to a managed - `RLMObject` (`RLMArray`s on unmanaged `RLMObject`s will never become invalidated). - - Because `RLMArray`s are attached to the object which they are a property of, they - do not require using the mutable collection proxy objects from - `-mutableArrayValueForKey:` or KVC-compatible mutation methods on the containing - object. Instead, you can call the mutation methods on the `RLMArray` directly. - */ - -@interface RLMArray : NSObject - -#pragma mark - Properties - -/** - The number of objects in the array. - */ -@property (nonatomic, readonly, assign) NSUInteger count; - -/** - The type of the objects in the array. - */ -@property (nonatomic, readonly, assign) RLMPropertyType type; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readonly, getter = isOptional) BOOL optional; - -/** - The class name of the objects contained in the array. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages the array. Returns `nil` for unmanaged arrays. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - Indicates if the array can no longer be accessed. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if the array is frozen. - - Frozen arrays are immutable and can be accessed from any thread. Frozen arrays - are created by calling `-freeze` on a managed live array. Unmanaged arrays are - never frozen. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Accessing Objects from an Array - -/** - Returns the object at the index specified. - - @param index The index to look up. - - @return An object of the type contained in the array. - */ -- (RLMObjectType)objectAtIndex:(NSUInteger)index; - -/** - Returns an array containing the objects in the array at the indexes specified by a given index set. - `nil` will be returned if the index set contains an index out of the arrays bounds. - - @param indexes The indexes in the array to retrieve objects from. - - @return The objects at the specified indexes. - */ -- (nullable NSArray *)objectsAtIndexes:(NSIndexSet *)indexes; - -/** - Returns the first object in the array. - - Returns `nil` if called on an empty array. - - @return An object of the type contained in the array. - */ -- (nullable RLMObjectType)firstObject; - -/** - Returns the last object in the array. - - Returns `nil` if called on an empty array. - - @return An object of the type contained in the array. - */ -- (nullable RLMObjectType)lastObject; - - - -#pragma mark - Adding, Removing, and Replacing Objects in an Array - -/** - Adds an object to the end of the array. - - @warning This method may only be called during a write transaction. - - @param object An object of the type contained in the array. - */ -- (void)addObject:(RLMObjectType)object; - -/** - Adds an array of objects to the end of the array. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable object such as `NSArray` or `RLMResults` which contains objects of the - same class as the array. - */ -- (void)addObjects:(id)objects; - -/** - Inserts an object at the given index. - - Throws an exception if the index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param anObject An object of the type contained in the array. - @param index The index at which to insert the object. - */ -- (void)insertObject:(RLMObjectType)anObject atIndex:(NSUInteger)index; - -/** - Removes an object at the given index. - - Throws an exception if the index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param index The array index identifying the object to be removed. - */ -- (void)removeObjectAtIndex:(NSUInteger)index; - -/** - Removes the last object in the array. - - This is a no-op if the array is already empty. - - @warning This method may only be called during a write transaction. -*/ -- (void)removeLastObject; - -/** - Removes all objects from the array. - - @warning This method may only be called during a write transaction. - */ -- (void)removeAllObjects; - -/** - Replaces an object at the given index with a new object. - - Throws an exception if the index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param index The index of the object to be replaced. - @param anObject An object (of the same type as returned from the `objectClassName` selector). - */ -- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(RLMObjectType)anObject; - -/** - Moves the object at the given source index to the given destination index. - - Throws an exception if the index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param sourceIndex The index of the object to be moved. - @param destinationIndex The index to which the object at `sourceIndex` should be moved. - */ -- (void)moveObjectAtIndex:(NSUInteger)sourceIndex toIndex:(NSUInteger)destinationIndex; - -/** - Exchanges the objects in the array at given indices. - - Throws an exception if either index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param index1 The index of the object which should replace the object at index `index2`. - @param index2 The index of the object which should replace the object at index `index1`. - */ -- (void)exchangeObjectAtIndex:(NSUInteger)index1 withObjectAtIndex:(NSUInteger)index2; - -#pragma mark - Querying an Array - -/** - Returns the index of an object in the array. - - Returns `NSNotFound` if the object is not found in the array. - - @param object An object (of the same type as returned from the `objectClassName` selector). - */ -- (NSUInteger)indexOfObject:(RLMObjectType)object; - -/** - Returns the index of the first object in the array matching the predicate. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return The index of the object, or `NSNotFound` if the object is not found in the array. - */ -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns the index of the first object in the array matching the predicate. - - @param predicate The predicate with which to filter the objects. - - @return The index of the object, or `NSNotFound` if the object is not found in the array. - */ -- (NSUInteger)indexOfObjectWithPredicate:(NSPredicate *)predicate; - -/** - Returns all the objects matching the given predicate in the array. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` of objects that match the given predicate. - */ -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all the objects matching the given predicate in the array. - - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` of objects that match the given predicate - */ -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/** - Returns a sorted `RLMResults` from the array. - - @param keyPath The key path to sort by. - @param ascending The direction to sort in. - - @return An `RLMResults` sorted by the specified key path. - */ -- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a sorted `RLMResults` from the array. - - @param properties An array of `RLMSortDescriptor`s to sort by. - - @return An `RLMResults` sorted by the specified properties. - */ -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/** - Returns a distinct `RLMResults` from the array. - - @param keyPaths The key paths to distinct on. - - @return An `RLMResults` with the distinct values of the keypath(s). - */ -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -/// :nodoc: -- (RLMObjectType)objectAtIndexedSubscript:(NSUInteger)index; - -/// :nodoc: -- (void)setObject:(RLMObjectType)newValue atIndexedSubscript:(NSUInteger)index; - -#pragma mark - Sectioning an Array - -/** - Sorts and sections this collection from a given property key path, returning the result - as an instance of `RLMSectionedResults`. - - @param keyPath The property key path to sort on. - @param ascending The direction to sort in. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsSortedUsingKeyPath:(NSString *)keyPath - ascending:(BOOL)ascending - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -/** - Sorts and sections this collection from a given array of sort descriptors, returning the result - as an instance of `RLMSectionedResults`. - - @param sortDescriptors An array of `RLMSortDescriptor`s to sort by. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @note The primary sort descriptor must be responsible for determining the section key. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsUsingSortDescriptors:(NSArray *)sortDescriptors - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - - -#pragma mark - Notifications - -/** - Registers a block to be called each time the array changes. - - The block will be asynchronously called with the initial array, and then - called again after each write transaction which changes any of the objects in - the array, which objects are in the results, or the order of the objects in the - array. - - The `changes` parameter will be `nil` the first time the block is called. For - each call after that, it will contain information about which rows in the - array were added, removed or modified. If a write transaction did not modify - any objects in the array, the block is not called at all. See the - `RLMCollectionChange` documentation for information on how the changes are - reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - Person *person = [[Person allObjectsInRealm:realm] firstObject]; - NSLog(@"person.dogs.count: %zu", person.dogs.count); // => 0 - self.token = [person.dogs addNotificationBlock(RLMArray *dogs, - RLMCollectionChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count) // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - [person.dogs addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a non-frozen managed array. - - @param block The block to be called each time the array changes. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMArray *_Nullable array, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the array changes. - - The block will be asynchronously called with the initial array, and then - called again after each write transaction which changes any of the objects in - the array, which objects are in the results, or the order of the objects in the - array. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the array were added, removed or modified. If a write transaction - did not modify any objects in the array, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMArray *_Nullable array, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the array changes. - - The block will be asynchronously called with the initial array, and then - called again after each write transaction which changes any of the objects in - the array, which objects are in the results, or the order of the objects in the - array. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the array were added, removed or modified. If a write transaction - did not modify any objects in the array, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMArray *_Nullable array, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the array changes. - - The block will be asynchronously called with the initial array, and then - called again after each write transaction which changes any of the objects in - the array, which objects are in the results, or the order of the objects in the - array. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the array were added, removed or modified. If a write transaction - did not modify any objects in the array, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMArray *_Nullable array, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths -__attribute__((warn_unused_result)); - -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the objects in the array. - - NSNumber *min = [object.arrayProperty minOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The minimum value of the property, or `nil` if the array is empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects in the array. - - NSNumber *max = [object.arrayProperty maxOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose maximum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The maximum value of the property, or `nil` if the array is empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of the values of a given property over all the objects in the array. - - NSNumber *sum = [object.arrayProperty sumOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose values should be summed. Only properties of - types `int`, `float`, and `double` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects in the array. - - NSNumber *average = [object.arrayProperty averageOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose average value should be calculated. Only - properties of types `int`, `float`, and `double` are supported. - - @return The average value of the given property, or `nil` if the array is empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this array. - - The frozen copy is an immutable array which contains the same data as this - array currently contains, but will not update when writes are made to the - containing Realm. Unlike live arrays, frozen arrays can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a managed array. - @warning Holding onto a frozen array for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -#pragma mark - Unavailable Methods - -/** - `-[RLMArray init]` is not available because `RLMArray`s cannot be created directly. - `RLMArray` properties on `RLMObject`s are lazily created when accessed. - */ -- (instancetype)init __attribute__((unavailable("RLMArrays cannot be created directly"))); - -/** - `+[RLMArray new]` is not available because `RLMArray`s cannot be created directly. - `RLMArray` properties on `RLMObject`s are lazily created when accessed. - */ -+ (instancetype)new __attribute__((unavailable("RLMArrays cannot be created directly"))); - -@end - -/// :nodoc: -@interface RLMArray (Swift) -// for use only in Swift class definitions -- (instancetype)initWithObjectClassName:(NSString *)objectClassName; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMAsymmetricObject.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMAsymmetricObject.h deleted file mode 100644 index 09deb787e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMAsymmetricObject.h +++ /dev/null @@ -1,98 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2022 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectSchema, RLMPropertyDescriptor, RLMRealm; -/** - `RLMAsymmetricObject` is a base class used to define asymmetric Realm objects. - - Asymmetric objects can only be created using the `createInRealm:` - function, and cannot be added, removed or queried. - When created, asymmetric objects will be synced unidirectionally to the MongoDB - database and cannot be accessed locally. - - Linking an asymmetric object within an `Object` is not allowed and will throw an error. - - The property types supported on `RLMAsymmetricObject` are the same as for `RLMObject`, - except for that asymmetric objects can only link to embedded objects, so `RLMObject` - and `RLMArray` properties are not supported (`RLMEmbeddedObject` and - `RLMArray` *are*). - */ -@interface RLMAsymmetricObject : RLMObjectBase - -#pragma mark - Creating & Initializing Objects - -/** - Creates an unmanaged instance of a Realm object. - */ -- (instancetype)init NS_DESIGNATED_INITIALIZER; - -/** - Creates an unmanaged instance of a Realm object. - - Pass in an `NSArray` or `NSDictionary` instance to set the values of the object's properties. - */ -- (instancetype)initWithValue:(id)value; - -/** - Returns the class name for a Realm object subclass. - - @warning Do not override. Realm relies on this method returning the exact class - name. - - @return The class name for the model class. - */ -+ (NSString *)className; - -/** - Creates an Asymmetric object, which will be synced unidirectionally and - cannot be queried locally. - - Objects created using this method will not be added to the Realm. - - @warning This method may only be called during a write transaction. - @warning This method always returns nil. - - @param realm The Realm to be used to create the asymmetric object.. - @param value The value used to populate the object. - - @return Returns `nil` - */ -+ (instancetype)createInRealm:(RLMRealm *)realm withValue:(id)value; - -#pragma mark - Properties - -/** - The object schema which lists the managed properties for the object. - */ -@property (nonatomic, readonly) RLMObjectSchema *objectSchema; - -#pragma mark - Dynamic Accessors - -/// :nodoc: -- (nullable id)objectForKeyedSubscript:(NSString *)key; - -/// :nodoc: -- (void)setObject:(nullable id)obj forKeyedSubscript:(NSString *)key; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMAsyncTask.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMAsyncTask.h deleted file mode 100644 index 9f7dc58da..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMAsyncTask.h +++ /dev/null @@ -1,67 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A task object which can be used to observe or cancel an async open. - - When a synchronized Realm is opened asynchronously, the latest state of the - Realm is downloaded from the server before the completion callback is invoked. - This task object can be used to observe the state of the download or to cancel - it. This should be used instead of trying to observe the download via the sync - session as the sync session itself is created asynchronously, and may not exist - yet when -[RLMRealm asyncOpenWithConfiguration:completion:] returns. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMAsyncOpenTask : NSObject -/** - Register a progress notification block. - - Each registered progress notification block is called whenever the sync - subsystem has new progress data to report until the task is either cancelled - or the completion callback is called. Progress notifications are delivered on - the main queue. - */ -- (void)addProgressNotificationBlock:(RLMProgressNotificationBlock)block; - -/** - Register a progress notification block which is called on the given queue. - - Each registered progress notification block is called whenever the sync - subsystem has new progress data to report until the task is either cancelled - or the completion callback is called. Progress notifications are delivered on - the supplied queue. - */ -- (void)addProgressNotificationOnQueue:(dispatch_queue_t)queue - block:(RLMProgressNotificationBlock)block; - -/** - Cancel the asynchronous open. - - Any download in progress will be cancelled, and the completion block for this - async open will never be called. If multiple async opens on the same Realm are - happening concurrently, all other opens will fail with the error "operation cancelled". - */ -- (void)cancel; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMBSON.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMBSON.h deleted file mode 100644 index 41750fd57..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMBSON.h +++ /dev/null @@ -1,174 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -#pragma mark RLMBSONType - -/** - Allowed BSON types. - */ -typedef NS_ENUM(NSUInteger, RLMBSONType) { - /// BSON Null type - RLMBSONTypeNull, - /// BSON Int32 type - RLMBSONTypeInt32, - /// BSON Int64 type - RLMBSONTypeInt64, - /// BSON Bool type - RLMBSONTypeBool, - /// BSON Double type - RLMBSONTypeDouble, - /// BSON String type - RLMBSONTypeString, - /// BSON Binary type - RLMBSONTypeBinary, - /// BSON Timestamp type - RLMBSONTypeTimestamp, - /// BSON Datetime type - RLMBSONTypeDatetime, - /// BSON ObjectId type - RLMBSONTypeObjectId, - /// BSON Decimal128 type - RLMBSONTypeDecimal128, - /// BSON RegularExpression type - RLMBSONTypeRegularExpression, - /// BSON MaxKey type - RLMBSONTypeMaxKey, - /// BSON MinKey type - RLMBSONTypeMinKey, - /// BSON Document type - RLMBSONTypeDocument, - /// BSON Array type - RLMBSONTypeArray, - /// BSON UUID type - RLMBSONTypeUUID -}; - -#pragma mark RLMBSON - -/** - Protocol representing a BSON value. BSON is a computer data interchange format. - The name "BSON" is based on the term JSON and stands for "Binary JSON". - - The following types conform to RLMBSON: - - `NSNull` - `NSNumber` - `NSString` - `NSData` - `NSDateInterval` - `NSDate` - `RLMObjectId` - `RLMDecimal128` - `NSRegularExpression` - `RLMMaxKey` - `RLMMinKey` - `NSDictionary` - `NSArray` - `NSUUID` - - @see RLMBSONType - @see bsonspec.org - */ -@protocol RLMBSON - -/** - The BSON type for the conforming interface. - */ -@property (readonly) RLMBSONType bsonType NS_REFINED_FOR_SWIFT; - -/** - Whether or not this BSON is equal to another. - - @param other The BSON to compare to - */ -- (BOOL)isEqual:(_Nullable id)other; - -@end - -/// :nodoc: -@interface NSNull (RLMBSON) -@end - -/// :nodoc: -@interface NSNumber (RLMBSON) -@end - -/// :nodoc: -@interface NSString (RLMBSON) -@end - -/// :nodoc: -@interface NSData (RLMBSON) -@end - -/// :nodoc: -@interface NSDateInterval (RLMBSON) -@end - -/// :nodoc: -@interface NSDate (RLMBSON) -@end - -/// :nodoc: -@interface RLMObjectId (RLMBSON) -@end - -/// :nodoc: -@interface RLMDecimal128 (RLMBSON) -@end - -/// :nodoc: -@interface NSRegularExpression (RLMBSON) -@end - -/// MaxKey will always be the greatest value when comparing to other BSON types -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMMaxKey : NSObject -@end - -/// MinKey will always be the smallest value when comparing to other BSON types -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMMinKey : NSObject -@end - -/// :nodoc: -@interface RLMMaxKey (RLMBSON) -@end - -/// :nodoc: -@interface RLMMinKey (RLMBSON) -@end - -/// :nodoc: -@interface NSDictionary (RLMBSON) -@end - -/// :nodoc: -@interface NSMutableArray (RLMBSON) -@end - -/// :nodoc: -@interface NSArray (RLMBSON) -@end - -/// :nodoc: -@interface NSUUID (RLMBSON) -@end diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMCollection.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMCollection.h deleted file mode 100644 index eac117f17..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMCollection.h +++ /dev/null @@ -1,613 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@protocol RLMValue; -@class RLMRealm, RLMResults, RLMSortDescriptor, RLMNotificationToken, RLMCollectionChange, RLMSectionedResults; -typedef RLM_CLOSED_ENUM(int32_t, RLMPropertyType); -/// A callback which is invoked on each element in the Results collection which returns the section key. -typedef id _Nullable(^RLMSectionedResultsKeyBlock)(id); - -/** - A homogenous collection of Realm-managed objects. Examples of conforming types - include `RLMArray`, `RLMSet`, `RLMResults`, and `RLMLinkingObjects`. - */ -@protocol RLMCollection - -#pragma mark - Properties - -/** - The number of objects in the collection. - */ -@property (nonatomic, readonly) NSUInteger count; - -/** - The type of the objects in the collection. - */ -@property (nonatomic, readonly) RLMPropertyType type; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readonly, getter = isOptional) BOOL optional; - -/** - The class name of the objects contained in the collection. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages this collection, if any. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - Indicates if the collection is no longer valid. - - The collection becomes invalid if `invalidate` is called on the managing - Realm. Unmanaged collections are never invalidated. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -#pragma mark - Accessing Objects from a Collection - -/** - Returns the object at the index specified. - - @param index The index to look up. - - @return An object of the type contained in the collection. - */ -- (id)objectAtIndex:(NSUInteger)index; - -@optional - -/** - Returns an array containing the objects in the collection at the indexes - specified by a given index set. `nil` will be returned if the index set - contains an index out of the collections bounds. - - @param indexes The indexes in the collection to retrieve objects from. - - @return The objects at the specified indexes. - */ -- (nullable NSArray *)objectsAtIndexes:(NSIndexSet *)indexes; - -/** - Returns the first object in the collection. - - RLMSet is not ordered, and so for sets this will return an arbitrary object in - the set. It is not guaraneed to be a different object from what `lastObject` - gives even if the set has multiple objects in it. - - Returns `nil` if called on an empty collection. - - @return An object of the type contained in the collection. - */ -- (nullable id)firstObject; - -/** - Returns the last object in the collection. - - RLMSet is not ordered, and so for sets this will return an arbitrary object in - the set. It is not guaraneed to be a different object from what `firstObject` - gives even if the set has multiple objects in it. - - Returns `nil` if called on an empty collection. - - @return An object of the type contained in the collection. - */ -- (nullable id)lastObject; - -/// :nodoc: -- (id)objectAtIndexedSubscript:(NSUInteger)index; - -/** - Returns the index of an object in the collection. - - Returns `NSNotFound` if the object is not found in the collection. - - @param object An object (of the same type as returned from the `objectClassName` selector). - */ -- (NSUInteger)indexOfObject:(id)object; - -/** - Returns the index of the first object in the collection matching the predicate. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return The index of the object, or `NSNotFound` if the object is not found in the collection. - */ -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns the index of the first object in the collection matching the predicate. - - @param predicate The predicate with which to filter the objects. - - @return The index of the object, or `NSNotFound` if the object is not found in the collection. - */ -- (NSUInteger)indexOfObjectWithPredicate:(NSPredicate *)predicate; - -@required - -#pragma mark - Querying a Collection - -/** - Returns all objects matching the given predicate in the collection. - - This is only supported for managed collections. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - @return An `RLMResults` containing objects that match the given predicate. - */ -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all objects matching the given predicate in the collection. - - This is only supported for managed collections. - - @param predicate The predicate with which to filter the objects. - @return An `RLMResults` containing objects that match the given predicate. - */ -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/** - Returns a sorted `RLMResults` from the collection. - - This is only supported for managed collections. - - @param keyPath The keyPath to sort by. - @param ascending The direction to sort in. - @return An `RLMResults` sorted by the specified key path. - */ -- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a sorted `RLMResults` from the collection. - - This is only supported for managed collections. - - @param properties An array of `RLMSortDescriptor`s to sort by. - @return An `RLMResults` sorted by the specified properties. - */ -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/** - Returns a distinct `RLMResults` from the collection. - - This is only supported for managed collections. - - @param keyPaths The key paths used produce distinct results - @return An `RLMResults` made distinct based on the specified key paths - */ -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -/** - Returns an `NSArray` containing the results of invoking `valueForKey:` using - `key` on each of the collection's objects. - - @param key The name of the property. - - @return An `NSArray` containing results. - */ -- (nullable id)valueForKey:(NSString *)key; - -/** - Returns the value for the derived property identified by a given key path. - - @param keyPath A key path of the form relationship.property (with one or more relationships). - - @return The value for the derived property identified by keyPath. - */ -- (nullable id)valueForKeyPath:(NSString *)keyPath; - -/** - Invokes `setValue:forKey:` on each of the collection's objects using the specified `value` and `key`. - - @warning This method may only be called during a write transaction. - - @param value The object value. - @param key The name of the property. - */ -- (void)setValue:(nullable id)value forKey:(NSString *)key; - -#pragma mark - Notifications - -/** -Registers a block to be called each time the collection changes. - -The block will be asynchronously called with the initial collection, -and then called again after each write transaction which changes either any -of the objects in the collection, or which objects are in the collection. - -The `change` parameter will be `nil` the first time the block is called. -For each call after that, it will contain information about -which rows in the collection were added, removed or modified. If a -write transaction did not modify any objects in the results collection, -the block is not called at all. See the `RLMCollectionChange` documentation for -information on how the changes are reported and an example of updating a -`UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - -At the time when the block is called, the collection object will be fully -evaluated and up-to-date, and as long as you do not perform a write transaction -on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will -never perform blocking work. - -Notifications are delivered via the standard run loop, and so can't be -delivered while the run loop is blocked by other activity. When -notifications can't be delivered instantly, multiple notifications may be -coalesced into a single notification. This can include the notification -with the initial results. For example, the following code performs a write -transaction immediately after adding the notification block, so there is no -opportunity for the initial notification to be delivered first. As a -result, the initial notification will reflect the state of the Realm after -the write transaction. - - RLMResults *results = [Dog allObjects]; - NSLog(@"dogs.count: %zu", dogs.count); // => 0 - self.token = [results addNotificationBlock:^(RLMResults *dogs, - RLMCollectionChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - [realm addObject:dog]; - }]; - // end of run loop execution context - -You must retain the returned token for as long as you want updates to continue -to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - -@warning This method cannot be called during a write transaction, or when the - containing Realm is read-only or frozen. - -@param block The block to be called whenever a change occurs. -@return A token which must be held for as long as you want updates to be delivered. -*/ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** -Registers a block to be called each time the collection changes. - -The block will be asynchronously called with the initial collection, -and then called again after each write transaction which changes either any -of the objects in the collection, or which objects are in the collection. - -The `change` parameter will be `nil` the first time the block is called. -For each call after that, it will contain information about -which rows in the collection were added, removed or modified. If a -write transaction did not modify any objects in the results collection, -the block is not called at all. See the `RLMCollectionChange` documentation for -information on how the changes are reported and an example of updating a -`UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - -At the time when the block is called, the collection object will be fully -evaluated and up-to-date, and as long as you do not perform a write transaction -on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will -never perform blocking work. - -Notifications are delivered on the given queue. If the queue is blocked and -notifications can't be delivered instantly, multiple notifications may be -coalesced into a single notification. - -You must retain the returned token for as long as you want updates to continue -to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - -@warning This method cannot be called when the containing Realm is read-only or frozen. -@warning The queue must be a serial queue. - -@param block The block to be called whenever a change occurs. -@param queue The serial queue to deliver notifications to. -@return A token which must be held for as long as you want updates to be delivered. -*/ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** -Registers a block to be called each time the collection changes. - -The block will be asynchronously called with the initial collection, -and then called again after each write transaction which changes either any -of the objects in the collection, or which objects are in the collection. - -The `change` parameter will be `nil` the first time the block is called. -For each call after that, it will contain information about -which rows in the collection were added, removed or modified. If a -write transaction did not modify any objects in the results collection, -the block is not called at all. See the `RLMCollectionChange` documentation for -information on how the changes are reported and an example of updating a -`UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - -At the time when the block is called, the collection object will be fully -evaluated and up-to-date, and as long as you do not perform a write transaction -on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will -never perform blocking work. - -Notifications are delivered on the given queue. If the queue is blocked and -notifications can't be delivered instantly, multiple notifications may be -coalesced into a single notification. - -You must retain the returned token for as long as you want updates to continue -to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - -@warning This method cannot be called when the containing Realm is read-only or frozen. -@warning The queue must be a serial queue. - -@param block The block to be called whenever a change occurs. -@param queue The serial queue to deliver notifications to. -@param keyPaths The block will be called for changes occurring on these keypaths. If no -key paths are given, notifications are delivered for every property key path. -@return A token which must be held for as long as you want updates to be delivered. -*/ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -#pragma mark - Sectioned Results - -/** - Sorts and sections this collection from a given property key path, returning the result - as an instance of `RLMSectionedResults`. - - @param keyPath The property key path to sort on. - @param ascending The direction to sort in. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsSortedUsingKeyPath:(NSString *)keyPath - ascending:(BOOL)ascending - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -/** - Sorts and sections this collection from a given array of sort descriptors, returning the result - as an instance of `RLMSectionedResults`. - - @param sortDescriptors An array of `RLMSortDescriptor`s to sort by. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @note The primary sort descriptor must be responsible for determining the section key. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsUsingSortDescriptors:(NSArray *)sortDescriptors - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the objects - in the collection. - - NSNumber *min = [results minOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The minimum value of the property, or `nil` if the Results are empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects - in the collection. - - NSNumber *max = [results maxOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose maximum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The maximum value of the property, or `nil` if the Results are empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of the values of a given property over all the objects in the collection. - - NSNumber *sum = [results sumOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose values should be summed. Only properties of - types `int`, `float`, and `double` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects in the collection. - - NSNumber *average = [results averageOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose average value should be calculated. Only - properties of types `int`, `float`, and `double` are supported. - - @return The average value of the given property, or `nil` if the Results are empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -#pragma mark - Freeze - -/** - Indicates if the collection is frozen. - - Frozen collections are immutable and can be accessed from any thread. The - objects read from a frozen collection will also be frozen. - */ -@property (nonatomic, readonly, getter=isFrozen) BOOL frozen; - -/** - Returns a frozen (immutable) snapshot of this collection. - - The frozen copy is an immutable collection which contains the same data as - this collection currently contains, but will not update when writes are made - to the containing Realm. Unlike live collections, frozen collections can be - accessed from any thread. - - @warning This method cannot be called during a write transaction, or when the containing Realm is read-only. - @warning Holding onto a frozen collection for an extended period while - performing write transaction on the Realm may result in the Realm - file growing to large sizes. See - `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -@end - -/** - An `RLMSortDescriptor` stores a property name and a sort order for use with - `sortedResultsUsingDescriptors:`. It is similar to `NSSortDescriptor`, but supports - only the subset of functionality which can be efficiently run by Realm's query - engine. - - `RLMSortDescriptor` instances are immutable. - */ -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMSortDescriptor : NSObject - -#pragma mark - Properties - -/** - The key path which the sort descriptor orders results by. - */ -@property (nonatomic, readonly) NSString *keyPath; - -/** - Whether the descriptor sorts in ascending or descending order. - */ -@property (nonatomic, readonly) BOOL ascending; - -#pragma mark - Methods - -/** - Returns a new sort descriptor for the given key path and sort direction. - */ -+ (instancetype)sortDescriptorWithKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a copy of the receiver with the sort direction reversed. - */ -- (instancetype)reversedSortDescriptor; - -@end - -/** - A `RLMCollectionChange` object encapsulates information about changes to collections - that are reported by Realm notifications. - - `RLMCollectionChange` is passed to the notification blocks registered with - `-addNotificationBlock` on `RLMArray` and `RLMResults`, and reports what rows in the - collection changed since the last time the notification block was called. - - The change information is available in two formats: a simple array of row - indices in the collection for each type of change, and an array of index paths - in a requested section suitable for passing directly to `UITableView`'s batch - update methods. A complete example of updating a `UITableView` named `tv`: - - [tv beginUpdates]; - [tv deleteRowsAtIndexPaths:[changes deletionsInSection:0] withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv insertRowsAtIndexPaths:[changes insertionsInSection:0] withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv reloadRowsAtIndexPaths:[changes modificationsInSection:0] withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv endUpdates]; - - All of the arrays in an `RLMCollectionChange` are always sorted in ascending order. - */ -@interface RLMCollectionChange : NSObject -/// The indices of objects in the previous version of the collection which have -/// been removed from this one. -@property (nonatomic, readonly) NSArray *deletions; - -/// The indices in the new version of the collection which were newly inserted. -@property (nonatomic, readonly) NSArray *insertions; - -/** - The indices in the new version of the collection which were modified. - - For `RLMResults`, this means that one or more of the properties of the object at - that index were modified (or an object linked to by that object was - modified). - - For `RLMArray`, the array itself being modified to contain a - different object at that index will also be reported as a modification. - */ -@property (nonatomic, readonly) NSArray *modifications; - -/// Returns the index paths of the deletion indices in the given section. -- (NSArray *)deletionsInSection:(NSUInteger)section; - -/// Returns the index paths of the insertion indices in the given section. -- (NSArray *)insertionsInSection:(NSUInteger)section; - -/// Returns the index paths of the modification indices in the given section. -- (NSArray *)modificationsInSection:(NSUInteger)section; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMConstants.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMConstants.h deleted file mode 100644 index 0bc8db972..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMConstants.h +++ /dev/null @@ -1,156 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#define RLM_HEADER_AUDIT_BEGIN NS_HEADER_AUDIT_BEGIN -#define RLM_HEADER_AUDIT_END NS_HEADER_AUDIT_END - -#define RLM_SWIFT_SENDABLE NS_SWIFT_SENDABLE - -#define RLM_FINAL __attribute__((objc_subclassing_restricted)) - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -// Swift 5 considers NS_ENUM to be "open", meaning there could be values present -// other than the defined cases (which allows adding more cases later without -// it being a breaking change), while older versions consider it "closed". -#ifdef NS_CLOSED_ENUM -#define RLM_CLOSED_ENUM NS_CLOSED_ENUM -#else -#define RLM_CLOSED_ENUM NS_ENUM -#endif - -#if __has_attribute(ns_error_domain) && (!defined(__cplusplus) || !__cplusplus || __cplusplus >= 201103L) -#define RLM_ERROR_ENUM(type, name, domain) \ - _Pragma("clang diagnostic push") \ - _Pragma("clang diagnostic ignored \"-Wignored-attributes\"") \ - NS_ENUM(type, __attribute__((ns_error_domain(domain))) name) \ - _Pragma("clang diagnostic pop") -#else -#define RLM_ERROR_ENUM(type, name, domain) NS_ENUM(type, name) -#endif - -#define RLM_HIDDEN __attribute__((visibility("hidden"))) -#define RLM_VISIBLE __attribute__((visibility("default"))) -#define RLM_HIDDEN_BEGIN _Pragma("GCC visibility push(hidden)") -#define RLM_HIDDEN_END _Pragma("GCC visibility pop") -#define RLM_DIRECT __attribute__((objc_direct)) -#define RLM_DIRECT_MEMBERS __attribute__((objc_direct_members)) - -#pragma mark - Enums - -/** - `RLMPropertyType` is an enumeration describing all property types supported in Realm models. - - For more information, see [Realm Models](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/object-models-and-schemas/). - */ -typedef RLM_CLOSED_ENUM(int32_t, RLMPropertyType) { - -#pragma mark - Primitive types - /** Integers: `NSInteger`, `int`, `long`, `Int` (Swift) */ - RLMPropertyTypeInt = 0, - /** Booleans: `BOOL`, `bool`, `Bool` (Swift) */ - RLMPropertyTypeBool = 1, - /** Floating-point numbers: `float`, `Float` (Swift) */ - RLMPropertyTypeFloat = 5, - /** Double-precision floating-point numbers: `double`, `Double` (Swift) */ - RLMPropertyTypeDouble = 6, - /** NSUUID, UUID */ - RLMPropertyTypeUUID = 12, - -#pragma mark - Object types - - /** Strings: `NSString`, `String` (Swift) */ - RLMPropertyTypeString = 2, - /** Binary data: `NSData` */ - RLMPropertyTypeData = 3, - /** Any type: `id`, `AnyRealmValue` (Swift) */ - RLMPropertyTypeAny = 9, - /** Dates: `NSDate` */ - RLMPropertyTypeDate = 4, - -#pragma mark - Linked object types - - /** Realm model objects. See [Realm Models](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/object-models-and-schemas/) for more information. */ - RLMPropertyTypeObject = 7, - /** Realm linking objects. See [Realm Models](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/relationships/#inverse-relationship) for more information. */ - RLMPropertyTypeLinkingObjects = 8, - - RLMPropertyTypeObjectId = 10, - RLMPropertyTypeDecimal128 = 11 -}; - -#pragma mark - Notification Constants - -/** - A notification indicating that changes were made to a Realm. -*/ -typedef NSString * RLMNotification NS_EXTENSIBLE_STRING_ENUM; - -/** - This notification is posted when a write transaction has been committed to a Realm on a different thread for - the same file. - - It is not posted if `autorefresh` is enabled, or if the Realm is refreshed before the notification has a chance - to run. - - Realms with autorefresh disabled should normally install a handler for this notification which calls - `-[RLMRealm refresh]` after doing some work. Refreshing the Realm is optional, but not refreshing the Realm may lead to - large Realm files. This is because an extra copy of the data must be kept for the stale Realm. - */ -extern RLMNotification const RLMRealmRefreshRequiredNotification NS_SWIFT_NAME(RefreshRequired); - -/** - This notification is posted by a Realm when a write transaction has been - committed to a Realm on a different thread for the same file. - - It is not posted if `-[RLMRealm autorefresh]` is enabled, or if the Realm is - refreshed before the notification has a chance to run. - - Realms with autorefresh disabled should normally install a handler for this - notification which calls `-[RLMRealm refresh]` after doing some work. Refreshing - the Realm is optional, but not refreshing the Realm may lead to large Realm - files. This is because Realm must keep an extra copy of the data for the stale - Realm. - */ -extern RLMNotification const RLMRealmDidChangeNotification NS_SWIFT_NAME(DidChange); - -#pragma mark - Error keys - -/** Key to identify the associated backup Realm configuration in an error's `userInfo` dictionary */ -extern NSString * const RLMBackupRealmConfigurationErrorKey; - -#pragma mark - Other Constants - -/** The schema version used for uninitialized Realms */ -extern const uint64_t RLMNotVersioned; - -/** The corresponding value is the name of an exception thrown by Realm. */ -extern NSString * const RLMExceptionName; - -/** The corresponding value is a Realm file version. */ -extern NSString * const RLMRealmVersionKey; - -/** The corresponding key is the version of the underlying database engine. */ -extern NSString * const RLMRealmCoreVersionKey; - -/** The corresponding key is the Realm invalidated property name. */ -extern NSString * const RLMInvalidatedKey; - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMCredentials.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMCredentials.h deleted file mode 100644 index adff4e7e9..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMCredentials.h +++ /dev/null @@ -1,126 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) -@protocol RLMBSON; - -/// A token representing an identity provider's credentials. -typedef NSString *RLMCredentialsToken; - -/// A type representing the unique identifier of an Atlas App Services identity provider. -typedef NSString *RLMIdentityProvider NS_EXTENSIBLE_STRING_ENUM; - -/// The username/password identity provider. User accounts are handled by Atlas App Services directly without the -/// involvement of a third-party identity provider. -extern RLMIdentityProvider const RLMIdentityProviderUsernamePassword; - -/// A Facebook account as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderFacebook; - -/// A Google account as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderGoogle; - -/// An Apple account as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderApple; - -/// A JSON Web Token as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderJWT; - -/// An Anonymous account as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderAnonymous; - -/// An Realm Cloud function as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderFunction; - -/// A user api key as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderUserAPIKey; - -/// A server api key as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderServerAPIKey; - -/** - Opaque credentials representing a specific Realm App user. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMCredentials : NSObject - -/// The name of the identity provider which generated the credentials token. -@property (nonatomic, readonly) RLMIdentityProvider provider; - -/** - Construct and return credentials from a Facebook account token. - */ -+ (instancetype)credentialsWithFacebookToken:(RLMCredentialsToken)token; - -/** - Construct and return credentials from a Google account token. - */ -+ (instancetype)credentialsWithGoogleAuthCode:(RLMCredentialsToken)token; - -/** - Construct and return credentials from a Google id token. - */ -+ (instancetype)credentialsWithGoogleIdToken:(RLMCredentialsToken)token; - -/** - Construct and return credentials from an Apple account token. - */ -+ (instancetype)credentialsWithAppleToken:(RLMCredentialsToken)token; - -/** - Construct and return credentials for an Atlas App Services function using a mongodb document as a json payload. -*/ -+ (instancetype)credentialsWithFunctionPayload:(NSDictionary> *)payload; - -/** - Construct and return credentials from a user api key. -*/ -+ (instancetype)credentialsWithUserAPIKey:(NSString *)apiKey; - -/** - Construct and return credentials from a server api key. -*/ -+ (instancetype)credentialsWithServerAPIKey:(NSString *)apiKey; - -/** - Construct and return Atlas App Services credentials from an email and password. - */ -+ (instancetype)credentialsWithEmail:(NSString *)email - password:(NSString *)password; - -/** - Construct and return credentials from a JSON Web Token. - */ -+ (instancetype)credentialsWithJWT:(NSString *)token; - -/** - Construct and return anonymous credentials - */ -+ (instancetype)anonymousCredentials; - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("RLMAppCredentials cannot be created directly"))); - -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("RLMAppCredentials cannot be created directly"))); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMDecimal128.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMDecimal128.h deleted file mode 100644 index f6224bbf2..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMDecimal128.h +++ /dev/null @@ -1,110 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A 128-bit IEEE 754-2008 decimal floating point number. - - This type is similar to Swift's built-in Decimal type, but allocates bits - differently, resulting in a different representable range. (NS)Decimal stores a - significand of up to 38 digits long and an exponent from -128 to 127, while - this type stores up to 34 digits of significand and an exponent from -6143 to - 6144. - */ -RLM_SWIFT_SENDABLE // immutable -@interface RLMDecimal128 : NSObject -/// Creates a new zero-initialized decimal128. -- (instancetype)init; - -/// Converts the given value to a RLMDecimal128. -/// -/// The following types can be converted to RLMDecimal128: -/// - NSNumber -/// - NSString -/// - NSDecimalNumber -/// -/// Passing a value with a type not in this list is a fatal error. Passing a -/// string which cannot be parsed as a valid Decimal128 is a fatal error. -- (instancetype)initWithValue:(id)value; - -/// Converts the given number to a RLMDecimal128. -- (instancetype)initWithNumber:(NSNumber *)number; - -/// Parses the given string to a RLMDecimal128. -/// -/// Returns a decimal where `isNaN` is `YES` if the string cannot be parsed as a decimal. `error` is never set -/// and this will never actually return `nil`. -- (nullable instancetype)initWithString:(NSString *)string error:(NSError **)error; - -/// Converts the given number to a RLMDecimal128. -+ (instancetype)decimalWithNumber:(NSNumber *)number; - -/// The minimum value for RLMDecimal128. -@property (class, readonly, copy) RLMDecimal128 *minimumDecimalNumber NS_REFINED_FOR_SWIFT; - -/// The maximum value for RLMDecimal128. -@property (class, readonly, copy) RLMDecimal128 *maximumDecimalNumber NS_REFINED_FOR_SWIFT; - -/// Convert this value to a double. This is a lossy conversion. -@property (nonatomic, readonly) double doubleValue; - -/// Convert this value to a NSDecimal. This may be a lossy conversion. -@property (nonatomic, readonly) NSDecimal decimalValue; - -/// Convert this value to a string. -@property (nonatomic, readonly) NSString *stringValue; - -/// Gets if this Decimal128 represents a NaN value. -@property (nonatomic, readonly) BOOL isNaN; - -/// The magnitude of this RLMDecimal128. -@property (nonatomic, readonly) RLMDecimal128 *magnitude NS_REFINED_FOR_SWIFT; - -/// Replaces this RLMDecimal128 value with its additive inverse. -- (void)negate; - -/// Adds the right hand side to the current value and returns the result. -- (RLMDecimal128 *)decimalNumberByAdding:(RLMDecimal128 *)decimalNumber; - -/// Divides the right hand side to the current value and returns the result. -- (RLMDecimal128 *)decimalNumberByDividingBy:(RLMDecimal128 *)decimalNumber; - -/// Subtracts the right hand side to the current value and returns the result. -- (RLMDecimal128 *)decimalNumberBySubtracting:(RLMDecimal128 *)decimalNumber; - -/// Multiply the right hand side to the current value and returns the result. -- (RLMDecimal128 *)decimalNumberByMultiplyingBy:(RLMDecimal128 *)decimalNumber; - -/// Comparision operator to check if the right hand side is greater than the current value. -- (BOOL)isGreaterThan:(nullable RLMDecimal128 *)decimalNumber; - -/// Comparision operator to check if the right hand side is greater than or equal to the current value. -- (BOOL)isGreaterThanOrEqualTo:(nullable RLMDecimal128 *)decimalNumber; - -/// Comparision operator to check if the right hand side is less than the current value. -- (BOOL)isLessThan:(nullable RLMDecimal128 *)decimalNumber; - -/// Comparision operator to check if the right hand side is less than or equal to the current value. -- (BOOL)isLessThanOrEqualTo:(nullable RLMDecimal128 *)decimalNumber; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMDictionary.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMDictionary.h deleted file mode 100644 index 9c8cac538..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMDictionary.h +++ /dev/null @@ -1,559 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObject, RLMResults, RLMDictionaryChange; - -/** - `RLMDictionary` is a container type in Realm representing a dynamic collection of key-value pairs. - - Unlike `NSDictionary`, `RLMDictionary`s hold a single key and value type. - This is referred to in these docs as the “type” and “keyType” of the dictionary. - - When declaring an `RLMDictionary` property, the object type and keyType must be marked as conforming to a - protocol by the same name as the objects it should contain. - - RLM_COLLECTION_TYPE(ObjectType) - ... - @property RLMDictionary *objectTypeDictionary; - - `RLMDictionary`s can be queried with the same predicates as `RLMObject` and `RLMResult`s. - - `RLMDictionary`s cannot be created directly. `RLMDictionary` properties on `RLMObject`s are - lazily created when accessed, or can be obtained by querying a Realm. - - `RLMDictionary` only supports `NSString` as a key. Realm disallows the use of `.` or `$` characters within a dictionary key. - - ### Key-Value Observing - - `RLMDictionary` supports dictionary key-value observing on `RLMDictionary` properties on `RLMObject` - subclasses, and the `invalidated` property on `RLMDictionary` instances themselves is - key-value observing compliant when the `RLMDictionary` is attached to a managed - `RLMObject` (`RLMDictionary`s on unmanaged `RLMObject`s will never become invalidated). - */ -@interface RLMDictionary: NSObject - -#pragma mark - Properties - -/** - The number of entries in the dictionary. - */ -@property (nonatomic, readonly, assign) NSUInteger count; - -/** - The type of the objects in the dictionary. - */ -@property (nonatomic, readonly, assign) RLMPropertyType type; - -/** - The type of the key used in this dictionary. - */ -@property (nonatomic, readonly, assign) RLMPropertyType keyType; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readonly, getter = isOptional) BOOL optional; - -/** - The class name of the objects contained in the dictionary. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages the dictionary. Returns `nil` for unmanaged dictionary. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - Indicates if the dictionary can no longer be accessed. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if the dictionary is frozen. - - Frozen dictionaries are immutable and can be accessed from any thread. Frozen dictionaries - are created by calling `-freeze` on a managed live dictionary. Unmanaged dictionaries are - never frozen. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Accessing Objects from a Dictionary - -/** - Returns the value associated with a given key. - - @param key The name of the property. - - @discussion If key does not start with “@”, invokes object(forKey:). If key does start - with “@”, strips the “@” and invokes [super valueForKey:] with the rest of the key. - - @return A value associated with a given key or `nil`. - */ -- (nullable id)valueForKey:(nonnull RLMKeyType)key; - -/** - Returns an array containing the dictionary’s keys. - - @note The order of the elements in the array is not defined. - */ -@property(readonly, copy) NSArray *allKeys; - -/** - Returns an array containing the dictionary’s values. - - @note The order of the elements in the array is not defined. - */ -@property(readonly, copy) NSArray *allValues; - -/** - Returns the value associated with a given key. - - @note `nil` will be returned if no value is associated with a given key. NSNull will be returned - where null is associated with the key. - - @param key The key for which to return the corresponding value. - - @return The value associated with key. - */ -- (nullable RLMObjectType)objectForKey:(nonnull RLMKeyType)key; - -/** - Returns the value associated with a given key. - - @note `nil` will be returned if no value is associated with a given key. NSNull will be returned - where null is associated with the key. - - @param key The key for which to return the corresponding value. - - @return The value associated with key. - */ -- (nullable RLMObjectType)objectForKeyedSubscript:(RLMKeyType)key; - -/** - Applies a given block object to the each key-value pair of the dictionary. - - @param block A block object to operate on entries in the dictionary. - - @note If the block sets *stop to YES, the enumeration stops. - */ -- (void)enumerateKeysAndObjectsUsingBlock:(void (^)(RLMKeyType key, RLMObjectType obj, BOOL *stop))block; - -#pragma mark - Adding, Removing, and Replacing Objects in a Dictionary - -/** - Replace the contents of a dictionary with the contents of another dictionary - NSDictionary or RLMDictionary. - - This will remove all elements in this dictionary and then apply each element from the given dictionary. - - @warning This method may only be called during a write transaction. - @warning If otherDictionary is self this will result in an empty dictionary. - */ -- (void)setDictionary:(id)otherDictionary; - -/** - Removes all contents in the dictionary. - - @warning This method may only be called during a write transaction. - */ -- (void)removeAllObjects; - -/** - Removes from the dictionary entries specified by elements in a given array. If a given key does not - exist, no mutation will happen for that key. - - @warning This method may only be called during a write transaction. - */ -- (void)removeObjectsForKeys:(NSArray *)keyArray; - -/** - Removes a given key and its associated value from the dictionary. If the key does not exist the dictionary - will not be modified. - - @warning This method may only be called during a write transaction. - */ -- (void)removeObjectForKey:(RLMKeyType)key; - -/** - Adds a given key-value pair to the dictionary if the key is not present, or updates the value for the given key - if the key already present. - - @warning This method may only be called during a write transaction. - */ -- (void)setObject:(nullable RLMObjectType)obj forKeyedSubscript:(RLMKeyType)key; - -/** - Adds a given key-value pair to the dictionary if the key is not present, or updates the value for the given key - if the key already present. - - @warning This method may only be called during a write transaction. - */ -- (void)setObject:(nullable RLMObjectType)anObject forKey:(RLMKeyType)aKey; - -/** - Adds to the receiving dictionary the entries from another dictionary. - - @note If the receiving dictionary contains the same key(s) as the otherDictionary, then - the receiving dictionary will update each key-value pair for the matching key. - - @warning This method may only be called during a write transaction. - - @param otherDictionary An enumerable object such as `NSDictionary` or `RLMDictionary` which contains objects of the - same type as the receiving dictionary. - */ -- (void)addEntriesFromDictionary:(id )otherDictionary; - -#pragma mark - Querying a Dictionary - -/** - Returns all the values matching the given predicate in the dictionary. - - @note The keys in the dictionary are ignored when quering values, and they will not be returned in the `RLMResults`. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` of objects that match the given predicate. - */ -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all the values matching the given predicate in the dictionary. - - @note The keys in the dictionary are ignored when quering values, and they will not be returned in the `RLMResults`. - - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` of objects that match the given predicate - */ -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/** - Returns a sorted RLMResults of all values in the dictionary. - - @note The keys in the dictionary are ignored when sorting values, and they will not be returned in the `RLMResults`. - - @param keyPath The key path to sort by. - @param ascending The direction to sort in. - - @return An `RLMResults` sorted by the specified key path. - */- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a sorted RLMResults of all values in the dictionary. - - @note The keys in the dictionary are ignored when sorting values, and they will not be returned in the `RLMResults`. - - @param properties An array of `RLMSortDescriptor`s to sort by. - - @return An `RLMResults` sorted by the specified properties. - */ -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/** - Returns a distinct `RLMResults` from all values in the dictionary. - - @note The keys in the dictionary are ignored, and they will not be returned in the `RLMResults`. - - @param keyPaths The key paths to distinct on. - - @return An `RLMResults` with the distinct values of the keypath(s). - */ -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the values in the dictionary. - - NSNumber *min = [object.dictionaryProperty minOfProperty:@"age"]; - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, `NSDate`, `RLMValue` and `RLMDecimal128` are supported. - - @return The minimum value of the property, or `nil` if the dictionary is empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects in the dictionary. - - NSNumber *max = [object.dictionaryProperty maxOfProperty:@"age"]; - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, `NSDate`, `RLMValue` and `RLMDecimal128` are supported. - - @return The maximum value of the property, or `nil` if the dictionary is empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of distinct values of a given property over all the objects in the dictionary. - - NSNumber *sum = [object.dictionaryProperty sumOfProperty:@"age"]; - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, `RLMValue` and `RLMDecimal128` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects in the dictionary. - - NSNumber *average = [object.dictionaryProperty averageOfProperty:@"age"]; - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, `NSDate`, `RLMValue` and `RLMDecimal128` are supported. - - @return The average value of the given property, or `nil` if the dictionary is empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -#pragma mark - Notifications - -/** - Registers a block to be called each time the dictionary changes. - - The block will be asynchronously called with the initial dictionary, and then - called again after each write transaction which changes any of the keys or values - within the dictionary. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which keys in the dictionary were added, modified or deleted. If a write transaction - did not modify any keys or values in the dictionary, the block is not called at all. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - Person *person = [[Person allObjectsInRealm:realm] firstObject]; - NSLog(@"person.dogs.count: %zu", person.dogs.count); // => 0 - self.token = [person.dogs addNotificationBlock(RLMDictionary *dogs, - RLMDictionaryChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - person.dogs[@"frenchBulldog"] = dog; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a non-frozen managed dictionary. - - @param block The block to be called each time the dictionary changes. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMDictionary *_Nullable dictionary, - RLMDictionaryChange *_Nullable changes, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the dictionary changes. - - The block will be asynchronously called with the initial dictionary, and then - called again after each write transaction which changes any of the key-value in - the dictionary or which objects are in the results. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which keys in the dictionary were added or modified. If a write transaction - did not modify any objects in the dictionary, the block is not called at all. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMDictionary *_Nullable dictionary, - RLMDictionaryChange *_Nullable changes, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the dictionary changes. - - The block will be asynchronously called with the initial dictionary, and then - called again after each write transaction which changes any of the key-value in - the dictionary or which objects are in the results. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which keys in the dictionary were added or modified. If a write transaction - did not modify any objects in the dictionary, the block is not called at all. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMDictionary *_Nullable dictionary, - RLMDictionaryChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the dictionary changes. - - The block will be asynchronously called with the initial dictionary, and then - called again after each write transaction which changes any of the key-value in - the dictionary or which objects are in the results. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which keys in the dictionary were added or modified. If a write transaction - did not modify any objects in the dictionary, the block is not called at all. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMDictionary *_Nullable dictionary, - RLMDictionaryChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths -__attribute__((warn_unused_result)); - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of a dictionary. - - The frozen copy is an immutable dictionary which contains the same data as this - dictionary currently contains, but will not update when writes are made to the - containing Realm. Unlike live dictionaries, frozen dictionaries can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a managed dictionary. - @warning Holding onto a frozen dictionary for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -#pragma mark - Unavailable Methods -/** - `-[RLMDictionary init]` is not available because `RLMDictionary`s cannot be created directly. - `RLMDictionary` properties on `RLMObject`s are lazily created when accessed. - */ -- (instancetype)init __attribute__((unavailable("RLMDictionary cannot be created directly"))); -/** - `+[RLMDictionary new]` is not available because `RLMDictionary`s cannot be created directly. - `RLMDictionary` properties on `RLMObject`s are lazily created when accessed. - */ -+ (instancetype)new __attribute__((unavailable("RLMDictionary cannot be created directly"))); - -@end - -/** - A `RLMDictionaryChange` object encapsulates information about changes to dictionaries - that are reported by Realm notifications. - - `RLMDictionaryChange` is passed to the notification blocks registered with - `-addNotificationBlock` on `RLMDictionary`, and reports what keys in the - dictionary changed since the last time the notification block was called. - */ -@interface RLMDictionaryChange : NSObject -/// The keys in the new version of the dictionary which were newly inserted. -@property (nonatomic, readonly) NSArray *insertions; - -/// The keys in the new version of the dictionary which were modified. -@property (nonatomic, readonly) NSArray *modifications; - -/// The keys which were deleted from the old version. -@property (nonatomic, readonly) NSArray *deletions; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMEmailPasswordAuth.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMEmailPasswordAuth.h deleted file mode 100644 index 748eb26af..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMEmailPasswordAuth.h +++ /dev/null @@ -1,120 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@protocol RLMBSON; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// A block type used to report an error -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMEmailPasswordAuthOptionalErrorBlock)(NSError * _Nullable); - -/** - A client for the email/password authentication provider which - can be used to obtain a credential for logging in, - and to perform requests specifically related to the email/password provider. -*/ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMEmailPasswordAuth : RLMProviderClient - -/** - Registers a new email identity with the email/password provider, - and sends a confirmation email to the provided address. - - @param email The email address of the user to register. - @param password The password that the user created for the new email/password identity. - @param completionHandler A callback to be invoked once the call is complete. -*/ - -- (void)registerUserWithEmail:(NSString *)email - password:(NSString *)password - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler NS_SWIFT_NAME(registerUser(email:password:completion:)); - -/** - Confirms an email identity with the email/password provider. - - @param token The confirmation token that was emailed to the user. - @param tokenId The confirmation token id that was emailed to the user. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)confirmUser:(NSString *)token - tokenId:(NSString *)tokenId - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Re-sends a confirmation email to a user that has registered but - not yet confirmed their email address. - - @param email The email address of the user to re-send a confirmation for. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)resendConfirmationEmail:(NSString *)email - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Retries custom confirmation function for a given email address. - - @param email The email address of the user to retry custom confirmation logic. - @param completionHandler A callback to be invoked once the call is complete. - */ -- (void)retryCustomConfirmation:(NSString *)email - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Sends a password reset email to the given email address. - - @param email The email address of the user to send a password reset email for. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)sendResetPasswordEmail:(NSString *)email - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Resets the password of an email identity using the - password reset token emailed to a user. - - @param password The new password. - @param token The password reset token that was emailed to the user. - @param tokenId The password reset token id that was emailed to the user. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)resetPasswordTo:(NSString *)password - token:(NSString *)token - tokenId:(NSString *)tokenId - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Resets the password of an email identity using the - password reset function set up in the application. - - @param email The email address of the user. - @param password The desired new password. - @param args A list of arguments passed in as a BSON array. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)callResetPasswordFunction:(NSString *)email - password:(NSString *)password - args:(NSArray> *)args - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMEmbeddedObject.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMEmbeddedObject.h deleted file mode 100644 index 4db6248ca..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMEmbeddedObject.h +++ /dev/null @@ -1,367 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectSchema, RLMPropertyDescriptor, RLMRealm, RLMNotificationToken, RLMPropertyChange; -typedef void (^RLMObjectChangeBlock)(BOOL deleted, - NSArray *_Nullable changes, - NSError *_Nullable error); -/** - `RLMEmbeddedObject` is a base class used to define Realm model objects. - - Embedded objects work similarly to normal objects, but are owned by a single - parent Object (which itself may be embedded). Unlike normal top-level objects, - embedded objects cannot be directly created in or added to a Realm. Instead, - they can only be created as part of a parent object, or by assigning an - unmanaged object to a parent object's property. Embedded objects are - automatically deleted when the parent object is deleted or when the parent is - modified to no longer point at the embedded object, either by reassigning an - RLMObject property or by removing the embedded object from the array containing - it. - - Embedded objects can only ever have a single parent object which links to them, - and attempting to link to an existing managed embedded object will throw an - exception. - - The property types supported on `RLMEmbeddedObject` are the same as for - `RLMObject`, except for that embedded objects cannot link to top-level objects, - so `RLMObject` and `RLMArray` properties are not supported - (`RLMEmbeddedObject` and `RLMArray` *are*). - - Embedded objects cannot have primary keys or indexed properties. - */ - -@interface RLMEmbeddedObject : RLMObjectBase - -#pragma mark - Creating & Initializing Objects - -/** - Creates an unmanaged instance of a Realm object. - - Unmanaged embedded objects can be added to a Realm by assigning them to an - object property of a managed Realm object or by adding them to a managed - RLMArray. - */ -- (instancetype)init NS_DESIGNATED_INITIALIZER; - -/** - Creates an unmanaged instance of a Realm object. - - Pass in an `NSArray` or `NSDictionary` instance to set the values of the object's properties. - - Unmanaged embedded objects can be added to a Realm by assigning them to an - object property of a managed Realm object or by adding them to a managed - RLMArray. - */ -- (instancetype)initWithValue:(id)value; - -/** - Returns the class name for a Realm object subclass. - - @warning Do not override. Realm relies on this method returning the exact class - name. - - @return The class name for the model class. - */ -+ (NSString *)className; - -#pragma mark - Properties - -/** - The Realm which manages the object, or `nil` if the object is unmanaged. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - The object schema which lists the managed properties for the object. - */ -@property (nonatomic, readonly) RLMObjectSchema *objectSchema; - -/** - Indicates if the object can no longer be accessed because it is now invalid. - - An object can no longer be accessed if the object has been deleted from the Realm that manages it, or - if `invalidate` is called on that Realm. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if this object is frozen. - - @see `-[RLMEmbeddedObject freeze]` - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Customizing your Objects - -/** - Override this method to specify the default values to be used for each property. - - @return A dictionary mapping property names to their default values. - */ -+ (nullable NSDictionary *)defaultPropertyValues; - -/** - Override this method to specify the names of properties to ignore. These properties will not be managed by the Realm - that manages the object. - - @return An array of property names to ignore. - */ -+ (nullable NSArray *)ignoredProperties; - -/** - Override this method to specify the names of properties that are non-optional (i.e. cannot be assigned a `nil` value). - - By default, all properties of a type whose values can be set to `nil` are - considered optional properties. To require that an object in a Realm always - store a non-`nil` value for a property, add the name of the property to the - array returned from this method. - - Properties of `RLMEmbeddedObject` type cannot be non-optional. Array and - `NSNumber` properties can be non-optional, but there is no reason to do so: - arrays do not support storing nil, and if you want a non-optional number you - should instead use the primitive type. - - @return An array of property names that are required. - */ -+ (NSArray *)requiredProperties; - -/** - Override this method to provide information related to properties containing linking objects. - - Each property of type `RLMLinkingObjects` must have a key in the dictionary returned by this method consisting - of the property name. The corresponding value must be an instance of `RLMPropertyDescriptor` that describes the class - and property that the property is linked to. - - return @{ @"owners": [RLMPropertyDescriptor descriptorWithClass:Owner.class propertyName:@"dogs"] }; - - @return A dictionary mapping property names to `RLMPropertyDescriptor` instances. - */ -+ (NSDictionary *)linkingObjectsProperties; - -#pragma mark - Notifications - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in differen - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When notifications - can't be delivered instantly, multiple notifications may be coalesced into a - single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - - @param block The block to be called whenever a change occurs. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block queue:(dispatch_queue_t)queue; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block keyPaths:(NSArray *)keyPaths queue:(dispatch_queue_t)queue; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block keyPaths:(NSArray *)keyPaths; - -#pragma mark - Other Instance Methods - -/** - Returns YES if another Realm object instance points to the same object as the - receiver in the Realm managing the receiver. - - For frozen objects and object types with a primary key, `isEqual:` is - overridden to use the same logic as this method (along with a corresponding - implementation for `hash`). Non-frozen objects without primary keys use - pointer identity for `isEqual:` and `hash`. - - @param object The object to compare the receiver to. - - @return Whether the object represents the same object as the receiver. - */ -- (BOOL)isEqualToObject:(RLMEmbeddedObject *)object; - -/** - Returns a frozen (immutable) snapshot of this object. - - The frozen copy is an immutable object which contains the same data as this - object currently contains, but will not update when writes are made to the - containing Realm. Unlike live objects, frozen objects can be accessed from any - thread. - - - warning: Holding onto a frozen object for an extended period while performing write - transaction on the Realm may result in the Realm file growing to large sizes. See - `Realm.Configuration.maximumNumberOfActiveVersions` for more information. - - warning: This method can only be called on a managed object. - */ -- (instancetype)freeze NS_RETURNS_RETAINED; - -/** - Returns a live (mutable) reference of this object. - - This method creates a managed accessor to a live copy of the same frozen object. - Will return self if called on an already live object. - */ -- (instancetype)thaw; - -#pragma mark - Dynamic Accessors - -/// :nodoc: -- (nullable id)objectForKeyedSubscript:(NSString *)key; - -/// :nodoc: -- (void)setObject:(nullable id)obj forKeyedSubscript:(NSString *)key; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMError.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMError.h deleted file mode 100644 index 514ceee3f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMError.h +++ /dev/null @@ -1,442 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2022 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@protocol RLMValue; - -#pragma mark - Error Domains - -/** Error code is a value from the RLMError enum. */ -extern NSString *const RLMErrorDomain; - -/** An error domain identifying non-specific system errors. */ -extern NSString *const RLMUnknownSystemErrorDomain; - -/** - The error domain string for all SDK errors related to errors reported - by the synchronization manager error handler, as well as general sync - errors that don't fall into any of the other categories. - */ -extern NSString *const RLMSyncErrorDomain; - -/** - The error domain string for all SDK errors related to the authentication - endpoint. - */ -extern NSString *const RLMSyncAuthErrorDomain; - -/** -The error domain string for all SDK errors related to the Atlas App Services -endpoint. -*/ -extern NSString *const RLMAppErrorDomain; - -#pragma mark - RLMError - -/// A user info key containing the error code. This is provided for backwards -/// compatibility only and should not be used. -extern NSString *const RLMErrorCodeKey __attribute((deprecated("use -[NSError code]"))); - -/// A user info key containing the name of the error code. This is for -/// debugging purposes only and should not be relied on. -extern NSString *const RLMErrorCodeNameKey; - -/// A user info key present in sync errors which originate from the server, -/// containing the URL of the server-side logs associated with the error. -extern NSString * const RLMServerLogURLKey; - -/// A user info key containing a HTTP status code. Some ``RLMAppError`` codes -/// include this, most notably ``RLMAppErrorHttpRequestFailed``. -extern NSString * const RLMHTTPStatusCodeKey; - -/// A user info key containing a `RLMCompensatingWriteInfo` which includes -/// further details about what was reverted by the server. -extern NSString *const RLMCompensatingWriteInfoKey; - -/** - `RLMError` is an enumeration representing all recoverable errors. It is - associated with the Realm error domain specified in `RLMErrorDomain`. - */ -typedef RLM_ERROR_ENUM(NSInteger, RLMError, RLMErrorDomain) { - /** Denotes a general error that occurred when trying to open a Realm. */ - RLMErrorFail = 1, - - /** Denotes a file I/O error that occurred when trying to open a Realm. */ - RLMErrorFileAccess = 2, - - /** - Denotes a file permission error that occurred when trying to open a Realm. - - This error can occur if the user does not have permission to open or create - the specified file in the specified access mode when opening a Realm. - */ - RLMErrorFilePermissionDenied = 3, - - /** - Denotes an error where a file was to be written to disk, but another - file with the same name already exists. - */ - RLMErrorFileExists = 4, - - /** - Denotes an error that occurs if a file could not be found. - - This error may occur if a Realm file could not be found on disk when - trying to open a Realm as read-only, or if the directory part of the - specified path was not found when trying to write a copy. - */ - RLMErrorFileNotFound = 5, - - /** - Denotes an error that occurs if a file format upgrade is required to open - the file, but upgrades were explicitly disabled or the file is being open - in read-only mode. - */ - RLMErrorFileFormatUpgradeRequired = 6, - - /** - Denotes an error that occurs if the database file is currently open in - another process which cannot share with the current process due to an - architecture mismatch. - - This error may occur if trying to share a Realm file between an i386 - (32-bit) iOS Simulator and the Realm Studio application. In this case, - please use the 64-bit version of the iOS Simulator. - */ - RLMErrorIncompatibleLockFile = 8, - - /** - Denotes an error that occurs when there is insufficient available address - space to mmap the Realm file. - */ - RLMErrorAddressSpaceExhausted = 9, - - /** - Denotes an error that occurs if there is a schema version mismatch and a - migration is required. - */ - RLMErrorSchemaMismatch = 10, - - /** - Denotes an error where an operation was requested which cannot be - performed on an open file. - */ - RLMErrorAlreadyOpen = 12, - - /// Denotes an error where an input value was invalid. - RLMErrorInvalidInput = 13, - - /// Denotes an error where a write failed due to insufficient disk space. - RLMErrorOutOfDiskSpace = 14, - - /** - Denotes an error where a Realm file could not be opened because another - process has opened the same file in a way incompatible with inter-process - sharing. For example, this can result from opening the backing file for an - in-memory Realm in non-in-memory mode. - */ - RLMErrorIncompatibleSession = 15, - - /** - Denotes an error that occurs if the file is a valid Realm file, but has a - file format version which is not supported by this version of Realm. This - typically means that the file was written by a newer version of Realm, but - may also mean that it is from a pre-1.0 version of Realm (or for - synchronized files, pre-10.0). - */ - RLMErrorUnsupportedFileFormatVersion = 16, - - /** - Denotes an error that occurs if a synchronized Realm is opened in more - than one process at once. - */ - RLMErrorMultipleSyncAgents = 17, - - /// A subscription was rejected by the server. - RLMErrorSubscriptionFailed = 18, - - /// A file operation failed in a way which does not have a more specific error code. - RLMErrorFileOperationFailed = 19, - - /** - Denotes an error that occurs if the file being opened is not a valid Realm - file. Some of the possible causes of this are: - 1. The file at the given URL simply isn't a Realm file at all. - 2. The wrong encryption key was given. - 3. The Realm file is encrypted and no encryption key was given. - 4. The Realm file isn't encrypted but an encryption key was given. - 5. The file on disk has become corrupted. - */ - RLMErrorInvalidDatabase = 20, - - /** - Denotes an error that occurs if a Realm is opened in the wrong history - mode. Typically this means that either a local Realm is being opened as a - synchronized Realm or vice versa. - */ - RLMErrorIncompatibleHistories = 21, - - /** - Denotes an error that occurs if objects were written to a flexible sync - Realm without any active subscriptions for that object type. All objects - created in flexible sync Realms must match at least one active - subscription or the server will reject the write. - */ - RLMErrorNoSubscriptionForWrite = 22, -}; - -#pragma mark - RLMSyncError - -/// A user info key for use with `RLMSyncErrorClientResetError`. -extern NSString *const kRLMSyncPathOfRealmBackupCopyKey; - -/// A user info key for use with certain error types. -extern NSString *const kRLMSyncErrorActionTokenKey; - -/** - An error related to a problem that might be reported by the synchronization manager - error handler, or a callback on a sync-related API that performs asynchronous work. - */ -typedef RLM_ERROR_ENUM(NSInteger, RLMSyncError, RLMSyncErrorDomain) { - /// An error that indicates a problem with the session (a specific Realm opened for sync). - RLMSyncErrorClientSessionError = 4, - - /// An error that indicates a problem with a specific user. - RLMSyncErrorClientUserError = 5, - - /** - An error that indicates an internal, unrecoverable problem - with the underlying synchronization engine. - */ - RLMSyncErrorClientInternalError = 6, - - /** - An error that indicates the Realm needs to be reset. - - A synced Realm may need to be reset because Atlas App Services encountered an - error and had to be restored from a backup. If the backup copy of the remote Realm - is of an earlier version than the local copy of the Realm, the server will ask the - client to reset the Realm. - - The reset process is as follows: the local copy of the Realm is copied into a recovery - directory for safekeeping, and then deleted from the original location. The next time - the Realm for that partition value is opened, the Realm will automatically be re-downloaded from - Atlas App Services, and can be used as normal. - - Data written to the Realm after the local copy of the Realm diverged from the backup - remote copy will be present in the local recovery copy of the Realm file. The - re-downloaded Realm will initially contain only the data present at the time the Realm - was backed up on the server. - - The client reset process can be initiated in one of two ways. - - The `userInfo` dictionary contains an opaque token object under the key - `kRLMSyncErrorActionTokenKey`. This token can be passed into - `+[RLMSyncSession immediatelyHandleError:]` in order to immediately perform the client - reset process. This should only be done after your app closes and invalidates every - instance of the offending Realm on all threads (note that autorelease pools may make this - difficult to guarantee). - - If `+[RLMSyncSession immediatelyHandleError:]` is not called, the client reset process - will be automatically carried out the next time the app is launched and the - `RLMSyncManager` is accessed. - - The value for the `kRLMSyncPathOfRealmBackupCopyKey` key in the `userInfo` dictionary - describes the path of the recovered copy of the Realm. This copy will not actually be - created until the client reset process is initiated. - - @see `-[NSError rlmSync_errorActionToken]`, `-[NSError rlmSync_clientResetBackedUpRealmPath]` - */ - RLMSyncErrorClientResetError = 7, - - /// :nodoc: - RLMSyncErrorUnderlyingAuthError = 8, - - /** - An error that indicates the user does not have permission to perform an operation - upon a synced Realm. For example, a user may receive this error if they attempt to - open a Realm they do not have at least read access to, or write to a Realm they only - have read access to. - - This error may also occur if a user incorrectly opens a Realm they have read-only - permissions to without using the `asyncOpen()` APIs. - - A Realm that suffers a permission denied error is, by default, flagged so that its - local copy will be deleted the next time the application starts. - - The `userInfo` dictionary contains an opaque token object under the key - `kRLMSyncErrorActionTokenKey`. This token can be passed into - `+[RLMSyncSession immediatelyHandleError:]` in order to immediately delete the local - copy. This should only be done after your app closes and invalidates every instance - of the offending Realm on all threads (note that autorelease pools may make this - difficult to guarantee). - - @warning It is strongly recommended that, if a Realm has encountered a permission denied - error, its files be deleted before attempting to re-open it. - - @see `-[NSError rlmSync_errorActionToken]` - */ - RLMSyncErrorPermissionDeniedError = 9, - - /** - An error that indicates that the server has rejected the requested flexible sync subscriptions. - */ - RLMSyncErrorInvalidFlexibleSyncSubscriptions = 10, - - /** - An error that indicates that the server has reverted a write made by this - client. This can happen due to not having write permission, or because an - object was created in a flexible sync Realm which does not match any - active subscriptions. - - This error is informational and does not require any explicit handling. - */ - RLMSyncErrorWriteRejected = 11, - - /** - A connection error without a more specific error code occurred. - - Realm internally handles retrying connections with appropriate backoffs, - so connection errors are normally logged and not reported to the error - handler. The exception is if - ``RLMSyncConfiguration.cancelAsyncOpenOnNonFatalErrors`` is set to `true`, - in which case async opens will be canceled on connection failures and the - error will be reported to the completion handler. - - Note that connection timeouts are reported as - (errorDomain: NSPosixErrorDomain, error: ETIMEDOUT) - and not as one of these error codes. - */ - RLMSyncErrorConnectionFailed = 12, - - /** - Connecting to the server failed due to a TLS issue such as an invalid certificate. - */ - RLMSyncErrorTLSHandshakeFailed = 13, -}; - -#pragma mark - RLMSyncAuthError - -// NEXT-MAJOR: This was a ROS thing and should have been removed in v10 -/// :nodoc: -typedef RLM_ERROR_ENUM(NSInteger, RLMSyncAuthError, RLMSyncAuthErrorDomain) { - RLMSyncAuthErrorBadResponse = 1, - RLMSyncAuthErrorBadRemoteRealmPath = 2, - RLMSyncAuthErrorHTTPStatusCodeError = 3, - RLMSyncAuthErrorClientSessionError = 4, - RLMSyncAuthErrorInvalidParameters = 601, - RLMSyncAuthErrorMissingPath = 602, - RLMSyncAuthErrorInvalidCredential = 611, - RLMSyncAuthErrorUserDoesNotExist = 612, - RLMSyncAuthErrorUserAlreadyExists = 613, - RLMSyncAuthErrorAccessDeniedOrInvalidPath = 614, - RLMSyncAuthErrorInvalidAccessToken = 615, - RLMSyncAuthErrorFileCannotBeShared = 703, -} __attribute__((deprecated("Errors of this type are no longer reported"))); - -#pragma mark - RLMSyncAppError - -/// An error which occurred when making a request to Atlas App Services. -typedef RLM_ERROR_ENUM(NSInteger, RLMAppError, RLMAppErrorDomain) { - /// An unknown error has occurred - RLMAppErrorUnknown = -1, - - /// A HTTP request completed with an error status code. The failing status - /// code can be found in the ``RLMHTTPStatusCodeKey`` key of the userInfo - /// dictionary. - RLMAppErrorHttpRequestFailed = 1, - - /// A user's session is in an invalid state. Logging out and back in may rectify this. - RLMAppErrorInvalidSession, - /// A request sent to the server was malformed in some way. - RLMAppErrorBadRequest, - /// A request was made using a nonexistent user. - RLMAppErrorUserNotFound, - /// A request was made against an App using a User which does not belong to that App. - RLMAppErrorUserAppDomainMismatch, - /// The auth provider has limited the domain names which can be used for email addresses, and the given one is not allowed. - RLMAppErrorDomainNotAllowed, - /// The request body size exceeded a server-configured limit. - RLMAppErrorReadSizeLimitExceeded, - /// A request had an invalid parameter. - RLMAppErrorInvalidParameter, - /// A request was missing a required parameter. - RLMAppErrorMissingParameter, - /// Executing the requested server function failed with an error. - RLMAppErrorFunctionExecutionError, - /// The server encountered an internal error. - RLMAppErrorInternalServerError, - /// Authentication failed due to the request auth provider not existing. - RLMAppErrorAuthProviderNotFound, - /// The requested value does not exist. - RLMAppErrorValueNotFound, - /// The value being created already exists. - RLMAppErrorValueAlreadyExists, - /// A value with the same name as the value being created already exists. - RLMAppErrorValueDuplicateName, - /// The called server function does not exist. - RLMAppErrorFunctionNotFound, - /// The called server function has a syntax error. - RLMAppErrorFunctionSyntaxError, - /// The called server function is invalid in some way. - RLMAppErrorFunctionInvalid, - /// Registering an API key with the auth provider failed due to it already existing. - RLMAppErrorAPIKeyAlreadyExists, - /// The operation failed due to exceeding the server-configured time limit. - RLMAppErrorExecutionTimeLimitExceeded, - /// The body of the called function does not define a callable thing. - RLMAppErrorNotCallable, - /// Email confirmation failed for a user because the user has already confirmed their email. - RLMAppErrorUserAlreadyConfirmed, - /// The user cannot be used because it has been disabled. - RLMAppErrorUserDisabled, - /// An auth error occurred which does not have a more specific error code. - RLMAppErrorAuthError, - /// Account registration failed due to the user name already being taken. - RLMAppErrorAccountNameInUse, - /// A login request failed due to an invalid password. - RLMAppErrorInvalidPassword, - /// Operation failed due to server-side maintenance. - RLMAppErrorMaintenanceInProgress, - /// Operation failed due to an error reported by MongoDB. - RLMAppErrorMongoDBError, -}; - -/// Extended information about a write which was rejected by the server. -/// -/// The server will sometimes reject writes made by the client for reasons such -/// as permissions, additional server-side validation failing, or because the -/// object didn't match any flexible sync subscriptions. When this happens, a -/// ``RLMSyncErrorWriteRejected`` error is reported which contains an array of -/// `RLMCompensatingWriteInfo` objects in the ``RLMCompensatingWriteInfoKey`` -/// userInfo key with information about what writes were rejected and why. -/// -/// This information is intended for debugging and logging purposes only. The -/// `reason` strings are generated by the server and are not guaranteed to be -/// stable, so attempting to programmatically do anything with them will break -/// without warning. -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMCompensatingWriteInfo : NSObject -/// The class name of the object being written to. -@property (nonatomic, readonly) NSString *objectType; -/// The primary key of the object being written to. -@property (nonatomic, readonly) id primaryKey NS_REFINED_FOR_SWIFT; -/// A human-readable string describing why the write was rejected. -@property (nonatomic, readonly) NSString *reason; -@end diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMFindOneAndModifyOptions.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMFindOneAndModifyOptions.h deleted file mode 100644 index 3cce99f23..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMFindOneAndModifyOptions.h +++ /dev/null @@ -1,80 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) -@protocol RLMBSON; -@class RLMSortDescriptor; - -/// Options to use when executing a `findOneAndUpdate`, `findOneAndReplace`, -/// or `findOneAndDelete` command on a `RLMMongoCollection`. -@interface RLMFindOneAndModifyOptions : NSObject - -/// Limits the fields to return for all matching documents. -@property (nonatomic, nullable) id projection NS_REFINED_FOR_SWIFT; - -/// The order in which to return matching documents. -@property (nonatomic, nullable) id sort NS_REFINED_FOR_SWIFT -__attribute__((deprecated("Use `sorting` instead, which correctly sort more than one sort attribute", "sorting"))); - -/// The order in which to return matching documents. -@property (nonatomic) NSArray> *sorting NS_REFINED_FOR_SWIFT; - - -/// Whether or not to perform an upsert, default is false -/// (only available for find_one_and_replace and find_one_and_update) -@property (nonatomic) BOOL upsert; - -/// When true then the new document is returned, -/// Otherwise the old document is returned (default) -/// (only available for findOneAndReplace and findOneAndUpdate) -@property (nonatomic) BOOL shouldReturnNewDocument; - -/// Options to use when executing a `findOneAndUpdate`, `findOneAndReplace`, -/// or `findOneAndDelete` command on a `RLMMongoCollection`. -/// @param projection Limits the fields to return for all matching documents. -/// @param sort The order in which to return matching documents. -/// @param upsert Whether or not to perform an upsert, default is false -/// (only available for findOneAndReplace and findOneAndUpdate) -/// @param shouldReturnNewDocument When true then the new document is returned, -/// Otherwise the old document is returned (default), -/// (only available for findOneAndReplace and findOneAndUpdate) -- (instancetype)initWithProjection:(id _Nullable)projection - sort:(id _Nullable)sort - upsert:(BOOL)upsert - shouldReturnNewDocument:(BOOL)shouldReturnNewDocument -__attribute__((deprecated("Please use `initWithProjection:sorting:upsert:shouldReturnNewDocument:`"))) - NS_SWIFT_UNAVAILABLE("Please see FindOneAndModifyOptions"); - -/// Options to use when executing a `findOneAndUpdate`, `findOneAndReplace`, -/// or `findOneAndDelete` command on a `RLMMongoCollection`. -/// @param projection Limits the fields to return for all matching documents. -/// @param sorting The order in which to return matching documents. -/// @param upsert Whether or not to perform an upsert, default is false -/// (only available for findOneAndReplace and findOneAndUpdate) -/// @param shouldReturnNewDocument When true then the new document is returned, -/// Otherwise the old document is returned (default), -/// (only available for findOneAndReplace and findOneAndUpdate) -- (instancetype)initWithProjection:(id _Nullable)projection - sorting:(NSArray> *)sorting - upsert:(BOOL)upsert - shouldReturnNewDocument:(BOOL)shouldReturnNewDocument; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMFindOptions.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMFindOptions.h deleted file mode 100644 index 043a85374..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMFindOptions.h +++ /dev/null @@ -1,77 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@protocol RLMBSON; - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -@interface RLMFindOptions : NSObject - -/// The maximum number of documents to return. Specifying 0 will return all documents. -@property (nonatomic) NSInteger limit; - -/// Limits the fields to return for all matching documents. -@property (nonatomic, nullable) id projection NS_REFINED_FOR_SWIFT; - -/// The order in which to return matching documents. -@property (nonatomic, nullable) id sort NS_REFINED_FOR_SWIFT -__attribute__((deprecated("Use `sorting` instead, which correctly sort more than one sort attribute", "sorting"))); - -/// The order in which to return matching documents. -@property (nonatomic) NSArray> *sorting NS_REFINED_FOR_SWIFT; - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -/// @param limit The maximum number of documents to return. Specifying 0 will return all documents. -/// @param projection Limits the fields to return for all matching documents. -/// @param sort The order in which to return matching documents. -- (instancetype)initWithLimit:(NSInteger)limit - projection:(id _Nullable)projection - sort:(id _Nullable)sort -__attribute__((deprecated("Please use `initWithLimit:projection:sorting:`"))) - NS_SWIFT_UNAVAILABLE("Please see FindOption"); - - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -/// @param projection Limits the fields to return for all matching documents. -/// @param sort The order in which to return matching documents. -- (instancetype)initWithProjection:(id _Nullable)projection - sort:(id _Nullable)sort __deprecated -__attribute__((deprecated("Please use `initWithProjection:sorting:`"))) - NS_SWIFT_UNAVAILABLE("Please see FindOption"); - - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -/// @param limit The maximum number of documents to return. Specifying 0 will return all documents. -/// @param projection Limits the fields to return for all matching documents. -/// @param sorting The order in which to return matching documents. -- (instancetype)initWithLimit:(NSInteger)limit - projection:(id _Nullable)projection - sorting:(NSArray> *)sorting; - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -/// @param projection Limits the fields to return for all matching documents. -/// @param sorting The order in which to return matching documents. -- (instancetype)initWithProjection:(id _Nullable)projection - sorting:(NSArray> *)sorting; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMLogger.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMLogger.h deleted file mode 100644 index 96ab91967..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMLogger.h +++ /dev/null @@ -1,99 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -/// An enum representing different levels of sync-related logging that can be configured. -typedef RLM_CLOSED_ENUM(NSUInteger, RLMLogLevel) { - /// Nothing will ever be logged. - RLMLogLevelOff, - /// Only fatal errors will be logged. - RLMLogLevelFatal, - /// Only errors will be logged. - RLMLogLevelError, - /// Warnings and errors will be logged. - RLMLogLevelWarn, - /// Information about sync events will be logged. Fewer events will be logged in order to avoid overhead. - RLMLogLevelInfo, - /// Information about sync events will be logged. More events will be logged than with `RLMLogLevelInfo`. - RLMLogLevelDetail, - /// Log information that can aid in debugging. - /// - /// - warning: Will incur a measurable performance impact. - RLMLogLevelDebug, - /// Log information that can aid in debugging. More events will be logged than with `RLMLogLevelDebug`. - /// - /// - warning: Will incur a measurable performance impact. - RLMLogLevelTrace, - /// Log information that can aid in debugging. More events will be logged than with `RLMLogLevelTrace`. - /// - /// - warning: Will incur a measurable performance impact. - RLMLogLevelAll -} NS_SWIFT_NAME(LogLevel); - -/// A log callback function which can be set on RLMLogger. -/// -/// The log function may be called from multiple threads simultaneously, and is -/// responsible for performing its own synchronization if any is required. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void (^RLMLogFunction)(RLMLogLevel level, NSString *message); - -/** - `RLMLogger` is used for creating your own custom logging logic. - - You can define your own logger creating an instance of `RLMLogger` and define the log function which will be - invoked whenever there is a log message. - Set this custom logger as you default logger using `setDefaultLogger`. - - RLMLogger.defaultLogger = [[RLMLogger alloc] initWithLevel:RLMLogLevelDebug - logFunction:^(RLMLogLevel level, NSString * message) { - NSLog(@"Realm Log - %lu, %@", (unsigned long)level, message); - }]; - - @note By default default log threshold level is `RLMLogLevelInfo`, and logging strings are output to Apple System Logger. -*/ -@interface RLMLogger : NSObject - -/** - Gets the logging threshold level used by the logger. - */ -@property (nonatomic) RLMLogLevel level; - -/// :nodoc: -- (instancetype)init NS_UNAVAILABLE; - -/** - Creates a logger with the associated log level and the logic function to define your own logging logic. - - @param level The log level to be set for the logger. - @param logFunction The log function which will be invoked whenever there is a log message. -*/ -- (instancetype)initWithLevel:(RLMLogLevel)level logFunction:(RLMLogFunction)logFunction; - -#pragma mark RLMLogger Default Logger API - -/** - The current default logger. When setting a logger as default, this logger will be used whenever information must be logged. - */ -@property (class) RLMLogger *defaultLogger NS_SWIFT_NAME(shared); - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMMigration.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMMigration.h deleted file mode 100644 index 4a6652a19..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMMigration.h +++ /dev/null @@ -1,129 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMSchema; -@class RLMArray; -@class RLMObject; - -/** - A block type which provides both the old and new versions of an object in the Realm. Object - properties can only be accessed using keyed subscripting. - - @see `-[RLMMigration enumerateObjects:block:]` - - @param oldObject The object from the original Realm (read-only). - @param newObject The object from the migrated Realm (read-write). -*/ -typedef void (^RLMObjectMigrationBlock)(RLMObject * __nullable oldObject, RLMObject * __nullable newObject); - -/** - `RLMMigration` instances encapsulate information intended to facilitate a schema migration. - - A `RLMMigration` instance is passed into a user-defined `RLMMigrationBlock` block when updating - the version of a Realm. This instance provides access to the old and new database schemas, the - objects in the Realm, and provides functionality for modifying the Realm during the migration. - */ -@interface RLMMigration : NSObject - -#pragma mark - Properties - -/** - Returns the old `RLMSchema`. This is the schema which describes the Realm before the - migration is applied. - */ -@property (nonatomic, readonly) RLMSchema *oldSchema NS_REFINED_FOR_SWIFT; - -/** - Returns the new `RLMSchema`. This is the schema which describes the Realm after the - migration is applied. - */ -@property (nonatomic, readonly) RLMSchema *newSchema NS_REFINED_FOR_SWIFT; - - -#pragma mark - Altering Objects during a Migration - -/** - Enumerates all the objects of a given type in the Realm, providing both the old and new versions - of each object. Within the block, object properties can only be accessed using keyed subscripting. - - @param className The name of the `RLMObject` class to enumerate. - - @warning All objects returned are of a type specific to the current migration and should not be cast - to `className`. Instead, treat them as `RLMObject`s and use keyed subscripting to access - properties. - */ -- (void)enumerateObjects:(NSString *)className - block:(__attribute__((noescape)) RLMObjectMigrationBlock)block NS_REFINED_FOR_SWIFT; - -/** - Creates and returns an `RLMObject` instance of type `className` in the Realm being migrated. - - The `value` argument is used to populate the object. It can be a key-value coding compliant object, an array or - dictionary returned from the methods in `NSJSONSerialization`, or an array containing one element for each managed - property. An exception will be thrown if any required properties are not present and those properties were not defined - with default values. - - When passing in an `NSArray` as the `value` argument, all properties must be present, valid and in the same order as - the properties defined in the model. - - @param className The name of the `RLMObject` class to create. - @param value The value used to populate the object. - */ -- (RLMObject *)createObject:(NSString *)className withValue:(id)value NS_REFINED_FOR_SWIFT; - -/** - Deletes an object from a Realm during a migration. - - It is permitted to call this method from within the block passed to `-[enumerateObjects:block:]`. - - @param object Object to be deleted from the Realm being migrated. - */ -- (void)deleteObject:(RLMObject *)object NS_REFINED_FOR_SWIFT; - -/** - Deletes the data for the class with the given name. - - All objects of the given class will be deleted. If the `RLMObject` subclass no longer exists in your program, - any remaining metadata for the class will be removed from the Realm file. - - @param name The name of the `RLMObject` class to delete. - - @return A Boolean value indicating whether there was any data to delete. - */ -- (BOOL)deleteDataForClassName:(NSString *)name NS_REFINED_FOR_SWIFT; - -/** - Renames a property of the given class from `oldName` to `newName`. - - @param className The name of the class whose property should be renamed. This class must be present - in both the old and new Realm schemas. - @param oldName The old persisted property name for the property to be renamed. There must not be a property with this name in the - class as defined by the new Realm schema. - @param newName The new persisted property name for the property to be renamed. There must not be a property with this name in the - class as defined by the old Realm schema. - */ -- (void)renamePropertyForClass:(NSString *)className oldName:(NSString *)oldName - newName:(NSString *)newName NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMMongoClient.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMMongoClient.h deleted file mode 100644 index 50a1c226d..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMMongoClient.h +++ /dev/null @@ -1,47 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMApp; - -/// The `RLMMongoClient` enables reading and writing on a MongoDB database via the Realm Cloud service. -/// -/// It provides access to instances of `RLMMongoDatabase`, which in turn provide access to specific -/// `RLMMongoCollection`s that hold your data. -/// -/// - Note: -/// Before you can read or write data, a user must log in. -/// -/// - SeeAlso: -/// `RLMApp`, `RLMMongoDatabase`, `RLMMongoCollection` -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMMongoClient : NSObject - -/// The name of the client -@property (nonatomic, readonly) NSString *name; - -/// Gets a `RLMMongoDatabase` instance for the given database name. -/// @param name the name of the database to retrieve -- (RLMMongoDatabase *)databaseWithName:(NSString *)name NS_SWIFT_NAME(database(named:)); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMMongoCollection.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMMongoCollection.h deleted file mode 100644 index 0feae60ac..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMMongoCollection.h +++ /dev/null @@ -1,330 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) -@protocol RLMBSON; - -@class RLMFindOptions, RLMFindOneAndModifyOptions, RLMUpdateResult, RLMChangeStream, RLMObjectId; - -/// Delegate which is used for subscribing to changes on a `[RLMMongoCollection watch]` stream. -@protocol RLMChangeEventDelegate -/// The stream was opened. -/// @param changeStream The RLMChangeStream subscribing to the stream changes. -- (void)changeStreamDidOpen:(RLMChangeStream *)changeStream; -/// The stream has been closed. -/// @param error If an error occured when closing the stream, an error will be passed. -- (void)changeStreamDidCloseWithError:(nullable NSError *)error; -/// A error has occured while streaming. -/// @param error The streaming error. -- (void)changeStreamDidReceiveError:(NSError *)error; -/// Invoked when a change event has been received. -/// @param changeEvent The change event in BSON format. -- (void)changeStreamDidReceiveChangeEvent:(id)changeEvent; -@end - -/// Acts as a middleman and processes events with WatchStream -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMChangeStream : NSObject -/// Stops a watch streaming session. -- (void)close; -/// :nodoc: -- (instancetype)init NS_UNAVAILABLE; -@end - -/// The `RLMMongoCollection` represents a MongoDB collection. -/// -/// You can get an instance from a `RLMMongoDatabase`. -/// -/// Create, read, update, and delete methods are available. -/// -/// Operations against the Realm Cloud server are performed asynchronously. -/// -/// - Note: -/// Before you can read or write data, a user must log in. -/// - Usage: -/// RLMMongoClient *client = [self.app mongoClient:@"mongodb1"]; -/// RLMMongoDatabase *database = [client databaseWithName:@"test_data"]; -/// RLMMongoCollection *collection = [database collectionWithName:@"Dog"]; -/// [collection insertOneDocument:@{@"name": @"fido", @"breed": @"cane corso"} completion:...]; -/// -/// - SeeAlso: -/// `RLMMongoClient`, `RLMMongoDatabase` -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMMongoCollection : NSObject -/// Block which returns an object id on a successful insert, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoInsertBlock)(id _Nullable, NSError * _Nullable); -/// Block which returns an array of object ids on a successful insertMany, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoInsertManyBlock)(NSArray> * _Nullable, NSError * _Nullable); -/// Block which returns an array of Documents on a successful find operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoFindBlock)(NSArray> *> * _Nullable, - NSError * _Nullable); -/// Block which returns a Document on a successful findOne operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoFindOneBlock)(NSDictionary> * _Nullable_result, - NSError * _Nullable); -/// Block which returns the number of Documents in a collection on a successful count operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoCountBlock)(NSInteger, NSError * _Nullable); -/// Block which returns an RLMUpdateResult on a successful update operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoUpdateBlock)(RLMUpdateResult * _Nullable, NSError * _Nullable); -/// Block which returns the deleted Document on a successful delete operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoDeleteBlock)(NSDictionary> * _Nullable_result, - NSError * _Nullable); - -/// The name of this mongodb collection. -@property (nonatomic, readonly) NSString *name; - -/// Encodes the provided value to BSON and inserts it. If the value is missing an identifier, one will be -/// generated for it. -/// @param document A `Document` value to insert. -/// @param completion The result of attempting to perform the insert. An Id will be returned for the inserted object on sucess -- (void)insertOneDocument:(NSDictionary> *)document - completion:(RLMMongoInsertBlock)completion NS_REFINED_FOR_SWIFT; - -/// Encodes the provided values to BSON and inserts them. If any values are missing identifiers, -/// they will be generated. -/// @param documents The `Document` values in a bson array to insert. -/// @param completion The result of the insert, returns an array inserted document ids in order -- (void)insertManyDocuments:(NSArray> *> *)documents - completion:(RLMMongoInsertManyBlock)completion NS_REFINED_FOR_SWIFT; - -/// Finds the documents in this collection which match the provided filter. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param options `RLMFindOptions` to use when executing the command. -/// @param completion The resulting bson array of documents or error if one occurs -- (void)findWhere:(NSDictionary> *)filterDocument - options:(RLMFindOptions *)options - completion:(RLMMongoFindBlock)completion NS_REFINED_FOR_SWIFT; - -/// Finds the documents in this collection which match the provided filter. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param completion The resulting bson array as a string or error if one occurs -- (void)findWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoFindBlock)completion NS_REFINED_FOR_SWIFT; - -/// Returns one document from a collection or view which matches the -/// provided filter. If multiple documents satisfy the query, this method -/// returns the first document according to the query's sort order or natural -/// order. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param options `RLMFindOptions` to use when executing the command. -/// @param completion The resulting bson or error if one occurs -- (void)findOneDocumentWhere:(NSDictionary> *)filterDocument - options:(RLMFindOptions *)options - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Returns one document from a collection or view which matches the -/// provided filter. If multiple documents satisfy the query, this method -/// returns the first document according to the query's sort order or natural -/// order. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param completion The resulting bson or error if one occurs -- (void)findOneDocumentWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Runs an aggregation framework pipeline against this collection. -/// @param pipeline A bson array made up of `Documents` containing the pipeline of aggregation operations to perform. -/// @param completion The resulting bson array of documents or error if one occurs -- (void)aggregateWithPipeline:(NSArray> *> *)pipeline - completion:(RLMMongoFindBlock)completion NS_REFINED_FOR_SWIFT; - -/// Counts the number of documents in this collection matching the provided filter. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param limit The max amount of documents to count -/// @param completion Returns the count of the documents that matched the filter. -- (void)countWhere:(NSDictionary> *)filterDocument - limit:(NSInteger)limit - completion:(RLMMongoCountBlock)completion NS_REFINED_FOR_SWIFT; - -/// Counts the number of documents in this collection matching the provided filter. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param completion Returns the count of the documents that matched the filter. -- (void)countWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoCountBlock)completion NS_REFINED_FOR_SWIFT; - -/// Deletes a single matching document from the collection. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param completion The result of performing the deletion. Returns the count of deleted objects -- (void)deleteOneDocumentWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoCountBlock)completion NS_REFINED_FOR_SWIFT; - -/// Deletes multiple documents -/// @param filterDocument Document representing the match criteria -/// @param completion The result of performing the deletion. Returns the count of the deletion -- (void)deleteManyDocumentsWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoCountBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates a single document matching the provided filter in this collection. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param upsert When true, creates a new document if no document matches the query. -/// @param completion The result of the attempt to update a document. -- (void)updateOneDocumentWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - upsert:(BOOL)upsert - completion:(RLMMongoUpdateBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates a single document matching the provided filter in this collection. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param completion The result of the attempt to update a document. -- (void)updateOneDocumentWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - completion:(RLMMongoUpdateBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates multiple documents matching the provided filter in this collection. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param upsert When true, creates a new document if no document matches the query. -/// @param completion The result of the attempt to update a document. -- (void)updateManyDocumentsWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - upsert:(BOOL)upsert - completion:(RLMMongoUpdateBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates multiple documents matching the provided filter in this collection. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param completion The result of the attempt to update a document. -- (void)updateManyDocumentsWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - completion:(RLMMongoUpdateBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates a single document in a collection based on a query filter and -/// returns the document in either its pre-update or post-update form. Unlike -/// `updateOneDocument`, this action allows you to atomically find, update, and -/// return a document with the same command. This avoids the risk of other -/// update operations changing the document between separate find and update -/// operations. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param options `RemoteFindOneAndModifyOptions` to use when executing the command. -/// @param completion The result of the attempt to update a document. -- (void)findOneAndUpdateWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - options:(RLMFindOneAndModifyOptions *)options - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates a single document in a collection based on a query filter and -/// returns the document in either its pre-update or post-update form. Unlike -/// `updateOneDocument`, this action allows you to atomically find, update, and -/// return a document with the same command. This avoids the risk of other -/// update operations changing the document between separate find and update -/// operations. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param completion The result of the attempt to update a document. -- (void)findOneAndUpdateWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Overwrites a single document in a collection based on a query filter and -/// returns the document in either its pre-replacement or post-replacement -/// form. Unlike `updateOneDocument`, this action allows you to atomically find, -/// replace, and return a document with the same command. This avoids the -/// risk of other update operations changing the document between separate -/// find and update operations. -/// @param filterDocument A `Document` that should match the query. -/// @param replacementDocument A `Document` describing the replacement. -/// @param options `RLMFindOneAndModifyOptions` to use when executing the command. -/// @param completion The result of the attempt to replace a document. -- (void)findOneAndReplaceWhere:(NSDictionary> *)filterDocument - replacementDocument:(NSDictionary> *)replacementDocument - options:(RLMFindOneAndModifyOptions *)options - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Overwrites a single document in a collection based on a query filter and -/// returns the document in either its pre-replacement or post-replacement -/// form. Unlike `updateOneDocument`, this action allows you to atomically find, -/// replace, and return a document with the same command. This avoids the -/// risk of other update operations changing the document between separate -/// find and update operations. -/// @param filterDocument A `Document` that should match the query. -/// @param replacementDocument A `Document` describing the update. -/// @param completion The result of the attempt to replace a document. -- (void)findOneAndReplaceWhere:(NSDictionary> *)filterDocument - replacementDocument:(NSDictionary> *)replacementDocument - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Removes a single document from a collection based on a query filter and -/// returns a document with the same form as the document immediately before -/// it was deleted. Unlike `deleteOneDocument`, this action allows you to atomically -/// find and delete a document with the same command. This avoids the risk of -/// other update operations changing the document between separate find and -/// delete operations. -/// @param filterDocument A `Document` that should match the query. -/// @param options `RLMFindOneAndModifyOptions` to use when executing the command. -/// @param completion The result of the attempt to delete a document. -- (void)findOneAndDeleteWhere:(NSDictionary> *)filterDocument - options:(RLMFindOneAndModifyOptions *)options - completion:(RLMMongoDeleteBlock)completion NS_REFINED_FOR_SWIFT; - -/// Removes a single document from a collection based on a query filter and -/// returns a document with the same form as the document immediately before -/// it was deleted. Unlike `deleteOneDocument`, this action allows you to atomically -/// find and delete a document with the same command. This avoids the risk of -/// other update operations changing the document between separate find and -/// delete operations. -/// @param filterDocument A `Document` that should match the query. -/// @param completion The result of the attempt to delete a document. -- (void)findOneAndDeleteWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoDeleteBlock)completion NS_REFINED_FOR_SWIFT; - -/// Opens a MongoDB change stream against the collection to watch for changes. The resulting stream will be notified -/// of all events on this collection that the active user is authorized to see based on the configured MongoDB -/// rules. -/// @param delegate The delegate that will react to events and errors from the resulting change stream. -/// @param queue Dispatches streaming events to an optional queue, if no queue is provided the main queue is used -- (RLMChangeStream *)watchWithDelegate:(id)delegate - delegateQueue:(nullable dispatch_queue_t)queue NS_REFINED_FOR_SWIFT; - -/// Opens a MongoDB change stream against the collection to watch for changes -/// made to specific documents. The documents to watch must be explicitly -/// specified by their _id. -/// @param filterIds The list of _ids in the collection to watch. -/// @param delegate The delegate that will react to events and errors from the resulting change stream. -/// @param queue Dispatches streaming events to an optional queue, if no queue is provided the main queue is used -- (RLMChangeStream *)watchWithFilterIds:(NSArray *)filterIds - delegate:(id)delegate - delegateQueue:(nullable dispatch_queue_t)queue NS_REFINED_FOR_SWIFT; - -/// Opens a MongoDB change stream against the collection to watch for changes. The provided BSON document will be -/// used as a match expression filter on the change events coming from the stream. -/// -/// See https://docs.mongodb.com/manual/reference/operator/aggregation/match/ for documentation around how to define -/// a match filter. -/// -/// Defining the match expression to filter ChangeEvents is similar to defining the match expression for triggers: -/// https://docs.mongodb.com/realm/triggers/database-triggers/ -/// @param matchFilter The $match filter to apply to incoming change events -/// @param delegate The delegate that will react to events and errors from the resulting change stream. -/// @param queue Dispatches streaming events to an optional queue, if no queue is provided the main queue is used -- (RLMChangeStream *)watchWithMatchFilter:(NSDictionary> *)matchFilter - delegate:(id)delegate - delegateQueue:(nullable dispatch_queue_t)queue NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMMongoDatabase.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMMongoDatabase.h deleted file mode 100644 index 177fbc1b8..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMMongoDatabase.h +++ /dev/null @@ -1,51 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMMongoCollection; - -/// The `RLMMongoDatabase` represents a MongoDB database, which holds a group -/// of collections that contain your data. -/// -/// It can be retrieved from the `RLMMongoClient`. -/// -/// Use it to get `RLMMongoCollection`s for reading and writing data. -/// -/// - Note: -/// Before you can read or write data, a user must log in`. -/// -/// - SeeAlso: -/// `RLMMongoClient`, `RLMMongoCollection` -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMMongoDatabase : NSObject - -/// The name of this database -@property (nonatomic, readonly) NSString *name; - -/// Gets a collection. -/// @param name The name of the collection to return -/// @returns The collection -- (RLMMongoCollection *)collectionWithName:(NSString *)name; -// NEXT-MAJOR: NS_SWIFT_NAME(collection(named:)) - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMNetworkTransport.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMNetworkTransport.h deleted file mode 100644 index 2884b4296..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMNetworkTransport.h +++ /dev/null @@ -1,132 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// Allowed HTTP methods to be used with `RLMNetworkTransport`. -typedef RLM_CLOSED_ENUM(int32_t, RLMHTTPMethod) { - /// GET is used to request data from a specified resource. - RLMHTTPMethodGET = 0, - /// POST is used to send data to a server to create/update a resource. - RLMHTTPMethodPOST = 1, - /// PATCH is used to send data to a server to update a resource. - RLMHTTPMethodPATCH = 2, - /// PUT is used to send data to a server to create/update a resource. - RLMHTTPMethodPUT = 3, - /// The DELETE method deletes the specified resource. - RLMHTTPMethodDELETE = 4 -}; - -/// An HTTP request that can be made to an arbitrary server. -@interface RLMRequest : NSObject - -/// The HTTP method of this request. -@property (nonatomic, assign) RLMHTTPMethod method; - -/// The URL to which this request will be made. -@property (nonatomic, strong) NSString *url; - -/// The number of milliseconds that the underlying transport should spend on an -/// HTTP round trip before failing with an error. -@property (nonatomic, assign) NSTimeInterval timeout; - -/// The HTTP headers of this request. -@property (nonatomic, strong) NSDictionary* headers; - -/// The body of the request. -@property (nonatomic, strong) NSString* body; - -@end - -/// The contents of an HTTP response. -@interface RLMResponse : NSObject - -/// The status code of the HTTP response. -@property (nonatomic, assign) NSInteger httpStatusCode; - -/// A custom status code provided by the SDK. -@property (nonatomic, assign) NSInteger customStatusCode; - -/// The headers of the HTTP response. -@property (nonatomic, strong) NSDictionary* headers; - -/// The body of the HTTP response. -@property (nonatomic, strong) NSString *body; - -@end - -/// Delegate which is used for subscribing to changes. -@protocol RLMEventDelegate -/// Invoked when a change event has been received. -/// @param event The change event encoded as NSData -- (void)didReceiveEvent:(NSData *)event; -/// A error has occurred while subscribing to changes. -/// @param error The error that has occurred. -- (void)didReceiveError:(NSError *)error; -/// The stream was opened. -- (void)didOpen; -/// The stream has been closed. -/// @param error The error that has occurred. -- (void)didCloseWithError:(NSError *_Nullable)error; -@end - -/// A block for receiving an `RLMResponse` from the `RLMNetworkTransport`. -RLM_SWIFT_SENDABLE // invoked on a backgroun thread -typedef void(^RLMNetworkTransportCompletionBlock)(RLMResponse *); - -/// Transporting protocol for foreign interfaces. Allows for custom -/// request/response handling. -RLM_SWIFT_SENDABLE // used from multiple threads so must be internally thread-safe -@protocol RLMNetworkTransport - -/** - Sends a request to a given endpoint. - - @param request The request to send. - @param completionBlock A callback invoked on completion of the request. -*/ -- (void)sendRequestToServer:(RLMRequest *)request - completion:(RLMNetworkTransportCompletionBlock)completionBlock; - -/// Starts an event stream request. -/// @param request The RLMRequest to start. -/// @param subscriber The RLMEventDelegate which will subscribe to changes from the server. -- (NSURLSession *)doStreamRequest:(RLMRequest *)request - eventSubscriber:(id)subscriber; - -@end - -/// Transporting protocol for foreign interfaces. Allows for custom -/// request/response handling. -RLM_SWIFT_SENDABLE // is internally thread-safe -@interface RLMNetworkTransport : NSObject - -/** - Sends a request to a given endpoint. - - @param request The request to send. - @param completionBlock A callback invoked on completion of the request. -*/ -- (void)sendRequestToServer:(RLMRequest *) request - completion:(RLMNetworkTransportCompletionBlock)completionBlock; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMObject.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMObject.h deleted file mode 100644 index 9bcfbe310..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMObject.h +++ /dev/null @@ -1,811 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMNotificationToken; -@class RLMObjectSchema; -@class RLMPropertyChange; -@class RLMPropertyDescriptor; -@class RLMRealm; -@class RLMResults; - -/** - `RLMObject` is a base class for model objects representing data stored in Realms. - - Define your model classes by subclassing `RLMObject` and adding properties to be managed. - Then instantiate and use your custom subclasses instead of using the `RLMObject` class directly. - - // Dog.h - @interface Dog : RLMObject - @property NSString *name; - @property BOOL adopted; - @end - - // Dog.m - @implementation Dog - @end //none needed - - ### Supported property types - - - `NSString` - - `NSInteger`, `int`, `long`, `float`, and `double` - - `BOOL` or `bool` - - `NSDate` - - `NSData` - - `NSNumber`, where `X` is one of `RLMInt`, `RLMFloat`, `RLMDouble` or `RLMBool`, for optional number properties - - `RLMObject` subclasses, to model many-to-one relationships. - - `RLMArray`, where `X` is an `RLMObject` subclass, to model many-to-many relationships. - - ### Querying - - You can initiate queries directly via the class methods: `allObjects`, `objectsWhere:`, and `objectsWithPredicate:`. - These methods allow you to easily query a custom subclass for instances of that class in the default Realm. - - To search in a Realm other than the default Realm, use the `allObjectsInRealm:`, `objectsInRealm:where:`, - and `objectsInRealm:withPredicate:` class methods. - - @see `RLMRealm` - - ### Relationships - - See our [Realm Swift Documentation](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/relationships/#relationships) for more details. - - ### Key-Value Observing - - All `RLMObject` properties (including properties you create in subclasses) are - [Key-Value Observing compliant](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/KeyValueObserving/KeyValueObserving.html), - except for `realm` and `objectSchema`. - - Keep the following tips in mind when observing Realm objects: - - 1. Unlike `NSMutableArray` properties, `RLMArray` properties do not require - using the proxy object returned from `-mutableArrayValueForKey:`, or defining - KVC mutation methods on the containing class. You can simply call methods on - the `RLMArray` directly; any changes will be automatically observed by the containing - object. - 2. Unmanaged `RLMObject` instances cannot be added to a Realm while they have any - observed properties. - 3. Modifying managed `RLMObject`s within `-observeValueForKeyPath:ofObject:change:context:` - is not recommended. Properties may change even when the Realm is not in a write - transaction (for example, when `-[RLMRealm refresh]` is called after changes - are made on a different thread), and notifications sent prior to the change - being applied (when `NSKeyValueObservingOptionPrior` is used) may be sent at - times when you *cannot* begin a write transaction. - */ - -@interface RLMObject : RLMObjectBase - -#pragma mark - Creating & Initializing Objects - -/** - Creates an unmanaged instance of a Realm object. - - Call `addObject:` on an `RLMRealm` instance to add an unmanaged object into that Realm. - - @see `[RLMRealm addObject:]` - */ -- (instancetype)init NS_DESIGNATED_INITIALIZER; - - -/** - Creates an unmanaged instance of a Realm object. - - Pass in an `NSArray` or `NSDictionary` instance to set the values of the object's properties. - - Call `addObject:` on an `RLMRealm` instance to add an unmanaged object into that Realm. - - @see `[RLMRealm addObject:]` - */ -- (instancetype)initWithValue:(id)value; - - -/** - Returns the class name for a Realm object subclass. - - @warning Do not override. Realm relies on this method returning the exact class - name. - - @return The class name for the model class. - */ -+ (NSString *)className; - -/** - Creates an instance of a Realm object with a given value, and adds it to the default Realm. - - If nested objects are included in the argument, `createInDefaultRealmWithValue:` will be recursively called - on them. - - The `value` argument can be a key-value coding compliant object, an array or dictionary returned from the methods in - `NSJSONSerialization`, or an array containing one element for each managed property. - - An exception will be thrown if any required properties are not present and those properties - were not defined with default values. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param value The value used to populate the object. - - @see `defaultPropertyValues` - */ -+ (instancetype)createInDefaultRealmWithValue:(id)value; - -/** - Creates an instance of a Realm object with a given value, and adds it to the specified Realm. - - If nested objects are included in the argument, `createInRealm:withValue:` will be recursively called - on them. - - The `value` argument can be a key-value coding compliant object, an array or dictionary returned from the methods in - `NSJSONSerialization`, or an array containing one element for each managed property. - - An exception will be thrown if any required properties are not present and those properties - were not defined with default values. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param realm The Realm which should manage the newly-created object. - @param value The value used to populate the object. - - @see `defaultPropertyValues` - */ -+ (instancetype)createInRealm:(RLMRealm *)realm withValue:(id)value; - -/** - Creates or updates a Realm object within the default Realm. - - This method may only be called on Realm object types with a primary key defined. If there is already - an object with the same primary key value in the default Realm, its values are updated and the object - is returned. Otherwise, this method creates and populates a new instance of the object in the default Realm. - - If nested objects are included in the argument, `createOrUpdateInDefaultRealmWithValue:` will be - recursively called on them if they have primary keys, `createInDefaultRealmWithValue:` if they do not. - - The `value` argument is used to populate the object. It can be a Realm object, a key-value coding - compliant object, an array or dictionary returned from the methods in `NSJSONSerialization`, or an - array containing one element for each managed property. - - If the object is being created, an exception will be thrown if any required properties - are not present and those properties were not defined with default values. - - If the `value` argument is a Realm object already managed by the default Realm, the - argument's type is the same as the receiver, and the objects have identical values for - their managed properties, this method does nothing. - - If the object is being updated, each property defined in its schema will be set by copying from - `value` using key-value coding. If the `value` argument does not respond to `valueForKey:` for a - given property name (or getter name, if defined), that value will remain untouched. - Nullable properties on the object can be set to nil by using `NSNull` as the updated value. - Each property is set even if the existing value is the same as the new value being set, and - notifications will report them all being changed. See `createOrUpdateModifiedInDefaultRealmWithValue:` - for a version of this function which only sets the values which have changed. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param value The value used to populate the object. - - @see `defaultPropertyValues`, `primaryKey` - */ -+ (instancetype)createOrUpdateInDefaultRealmWithValue:(id)value; - -/** - Creates or updates a Realm object within the default Realm. - - This method may only be called on Realm object types with a primary key defined. If there is already - an object with the same primary key value in the default Realm, its values are updated and the object - is returned. Otherwise, this method creates and populates a new instance of the object in the default Realm. - - If nested objects are included in the argument, `createOrUpdateModifiedInDefaultRealmWithValue:` will be - recursively called on them if they have primary keys, `createInDefaultRealmWithValue:` if they do not. - - The `value` argument is used to populate the object. It can be a Realm object, a key-value coding - compliant object, an array or dictionary returned from the methods in `NSJSONSerialization`, or an - array containing one element for each managed property. - - If the object is being created, an exception will be thrown if any required properties - are not present and those properties were not defined with default values. - - If the `value` argument is a Realm object already managed by the default Realm, the - argument's type is the same as the receiver, and the objects have identical values for - their managed properties, this method does nothing. - - If the object is being updated, each property defined in its schema will be set by copying from - `value` using key-value coding. If the `value` argument does not respond to `valueForKey:` for a - given property name (or getter name, if defined), that value will remain untouched. - Nullable properties on the object can be set to nil by using `NSNull` as the updated value. - Unlike `createOrUpdateInDefaultRealmWithValue:`, only properties which have changed in value are - set, and any change notifications produced by this call will report only which properies have - actually changed. - - Checking which properties have changed imposes a small amount of overhead, and so this method - may be slower when all or nearly all of the properties being set have changed. If most or all - of the properties being set have not changed, this method will be much faster than unconditionally - setting all of them, and will also reduce how much data has to be written to the Realm, saving - both i/o time and disk space. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param value The value used to populate the object. - - @see `defaultPropertyValues`, `primaryKey` - */ -+ (instancetype)createOrUpdateModifiedInDefaultRealmWithValue:(id)value; - -/** - Creates or updates an Realm object within a specified Realm. - - This method may only be called on Realm object types with a primary key defined. If there is already - an object with the same primary key value in the given Realm, its values are updated and the object - is returned. Otherwise this method creates and populates a new instance of this object in the given Realm. - - If nested objects are included in the argument, `createOrUpdateInRealm:withValue:` will be - recursively called on them if they have primary keys, `createInRealm:withValue:` if they do not. - - The `value` argument is used to populate the object. It can be a Realm object, a key-value coding - compliant object, an array or dictionary returned from the methods in `NSJSONSerialization`, or an - array containing one element for each managed property. - - If the object is being created, an exception will be thrown if any required properties - are not present and those properties were not defined with default values. - - If the `value` argument is a Realm object already managed by the given Realm, the - argument's type is the same as the receiver, and the objects have identical values for - their managed properties, this method does nothing. - - If the object is being updated, each property defined in its schema will be set by copying from - `value` using key-value coding. If the `value` argument does not respond to `valueForKey:` for a - given property name (or getter name, if defined), that value will remain untouched. - Nullable properties on the object can be set to nil by using `NSNull` as the updated value. - Each property is set even if the existing value is the same as the new value being set, and - notifications will report them all being changed. See `createOrUpdateModifiedInRealm:withValue:` - for a version of this function which only sets the values which have changed. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param realm The Realm which should own the object. - @param value The value used to populate the object. - - @see `defaultPropertyValues`, `primaryKey` - */ -+ (instancetype)createOrUpdateInRealm:(RLMRealm *)realm withValue:(id)value; - -/** - Creates or updates an Realm object within a specified Realm. - - This method may only be called on Realm object types with a primary key defined. If there is already - an object with the same primary key value in the given Realm, its values are updated and the object - is returned. Otherwise this method creates and populates a new instance of this object in the given Realm. - - If nested objects are included in the argument, `createOrUpdateInRealm:withValue:` will be - recursively called on them if they have primary keys, `createInRealm:withValue:` if they do not. - - The `value` argument is used to populate the object. It can be a Realm object, a key-value coding - compliant object, an array or dictionary returned from the methods in `NSJSONSerialization`, or an - array containing one element for each managed property. - - If the object is being created, an exception will be thrown if any required properties - are not present and those properties were not defined with default values. - - If the `value` argument is a Realm object already managed by the given Realm, the - argument's type is the same as the receiver, and the objects have identical values for - their managed properties, this method does nothing. - - If the object is being updated, each property defined in its schema will be set by copying from - `value` using key-value coding. If the `value` argument does not respond to `valueForKey:` for a - given property name (or getter name, if defined), that value will remain untouched. - Nullable properties on the object can be set to nil by using `NSNull` as the updated value. - Unlike `createOrUpdateInRealm:withValue:`, only properties which have changed in value are - set, and any change notifications produced by this call will report only which properies have - actually changed. - - Checking which properties have changed imposes a small amount of overhead, and so this method - may be slower when all or nearly all of the properties being set have changed. If most or all - of the properties being set have not changed, this method will be much faster than unconditionally - setting all of them, and will also reduce how much data has to be written to the Realm, saving - both i/o time and disk space. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param realm The Realm which should own the object. - @param value The value used to populate the object. - - @see `defaultPropertyValues`, `primaryKey` - */ -+ (instancetype)createOrUpdateModifiedInRealm:(RLMRealm *)realm withValue:(id)value; - -#pragma mark - Properties - -/** - The Realm which manages the object, or `nil` if the object is unmanaged. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - The object schema which lists the managed properties for the object. - */ -@property (nonatomic, readonly) RLMObjectSchema *objectSchema; - -/** - Indicates if the object can no longer be accessed because it is now invalid. - - An object can no longer be accessed if the object has been deleted from the Realm that manages it, or - if `invalidate` is called on that Realm. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if this object is frozen. - - @see `-[RLMObject freeze]` - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - - -#pragma mark - Customizing your Objects - -/** - Returns an array of property names for properties which should be indexed. - - Only string, integer, boolean, and `NSDate` properties are supported. - - @return An array of property names. - */ -+ (NSArray *)indexedProperties; - -/** - Override this method to specify the default values to be used for each property. - - @return A dictionary mapping property names to their default values. - */ -+ (nullable NSDictionary *)defaultPropertyValues; - -/** - Override this method to specify the name of a property to be used as the primary key. - - Only properties of types `RLMPropertyTypeString` and `RLMPropertyTypeInt` can be designated as the primary key. - Primary key properties enforce uniqueness for each value whenever the property is set, which incurs minor overhead. - Indexes are created automatically for primary key properties. - - @return The name of the property designated as the primary key. - */ -+ (nullable NSString *)primaryKey; - -/** - Override this method to specify the names of properties to ignore. These properties will not be managed by the Realm - that manages the object. - - @return An array of property names to ignore. - */ -+ (nullable NSArray *)ignoredProperties; - -/** - Override this method to specify the names of properties that are non-optional (i.e. cannot be assigned a `nil` value). - - By default, all properties of a type whose values can be set to `nil` are considered optional properties. - To require that an object in a Realm always store a non-`nil` value for a property, - add the name of the property to the array returned from this method. - - Properties of `RLMObject` type cannot be non-optional. Array and `NSNumber` properties - can be non-optional, but there is no reason to do so: arrays do not support storing nil, and - if you want a non-optional number you should instead use the primitive type. - - @return An array of property names that are required. - */ -+ (NSArray *)requiredProperties; - -/** - Override this method to provide information related to properties containing linking objects. - - Each property of type `RLMLinkingObjects` must have a key in the dictionary returned by this method consisting - of the property name. The corresponding value must be an instance of `RLMPropertyDescriptor` that describes the class - and property that the property is linked to. - - return @{ @"owners": [RLMPropertyDescriptor descriptorWithClass:Owner.class propertyName:@"dogs"] }; - - @return A dictionary mapping property names to `RLMPropertyDescriptor` instances. - */ -+ (NSDictionary *)linkingObjectsProperties; - -#pragma mark - Getting & Querying Objects from the Default Realm - -/** - Returns all objects of this object type from the default Realm. - - @return An `RLMResults` containing all objects of this type in the default Realm. - */ -+ (RLMResults *)allObjects; - -/** - Returns all objects of this object type matching the given predicate from the default Realm. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` containing all objects of this type in the default Realm that match the given predicate. - */ -+ (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -+ (RLMResults<__kindof RLMObject *> *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - - -/** - Returns all objects of this object type matching the given predicate from the default Realm. - - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` containing all objects of this type in the default Realm that match the given predicate. - */ -+ (RLMResults *)objectsWithPredicate:(nullable NSPredicate *)predicate; - -/** - Retrieves the single instance of this object type with the given primary key from the default Realm. - - Returns the object from the default Realm which has the given primary key, or - `nil` if the object does not exist. This is slightly faster than the otherwise - equivalent `[[SubclassName objectsWhere:@"primaryKeyPropertyName = %@", key] firstObject]`. - - This method requires that `primaryKey` be overridden on the receiving subclass. - - @return An object of this object type, or `nil` if an object with the given primary key does not exist. - @see `-primaryKey` - */ -+ (nullable instancetype)objectForPrimaryKey:(nullable id)primaryKey NS_SWIFT_NAME(object(forPrimaryKey:)); - - -#pragma mark - Querying Specific Realms - -/** - Returns all objects of this object type from the specified Realm. - - @param realm The Realm to query. - - @return An `RLMResults` containing all objects of this type in the specified Realm. - */ -+ (RLMResults *)allObjectsInRealm:(RLMRealm *)realm; - -/** - Returns all objects of this object type matching the given predicate from the specified Realm. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - @param realm The Realm to query. - - @return An `RLMResults` containing all objects of this type in the specified Realm that match the given predicate. - */ -+ (RLMResults *)objectsInRealm:(RLMRealm *)realm where:(NSString *)predicateFormat, ...; - -/// :nodoc: -+ (RLMResults<__kindof RLMObject *> *)objectsInRealm:(RLMRealm *)realm where:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all objects of this object type matching the given predicate from the specified Realm. - - @param predicate A predicate to use to filter the elements. - @param realm The Realm to query. - - @return An `RLMResults` containing all objects of this type in the specified Realm that match the given predicate. - */ -+ (RLMResults *)objectsInRealm:(RLMRealm *)realm withPredicate:(nullable NSPredicate *)predicate; - -/** - Retrieves the single instance of this object type with the given primary key from the specified Realm. - - Returns the object from the specified Realm which has the given primary key, or - `nil` if the object does not exist. This is slightly faster than the otherwise - equivalent `[[SubclassName objectsInRealm:realm where:@"primaryKeyPropertyName = %@", key] firstObject]`. - - This method requires that `primaryKey` be overridden on the receiving subclass. - - @return An object of this object type, or `nil` if an object with the given primary key does not exist. - @see `-primaryKey` - */ -+ (nullable instancetype)objectInRealm:(RLMRealm *)realm forPrimaryKey:(nullable id)primaryKey NS_SWIFT_NAME(object(in:forPrimaryKey:)); - -#pragma mark - Notifications - -/** - A callback block for `RLMObject` notifications. - - If the object is deleted from the managing Realm, the block is called with - `deleted` set to `YES` and the other two arguments are `nil`. The block will - never be called again after this. - - If the object is modified, the block will be called with `deleted` set to - `NO`, a `nil` error, and an array of `RLMPropertyChange` objects which - indicate which properties of the objects were modified. - - `error` is always `nil` and will be removed in a future version. - */ -typedef void (^RLMObjectChangeBlock)(BOOL deleted, - NSArray *_Nullable changes, - NSError *_Nullable error); - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When notifications - can't be delivered instantly, multiple notifications may be coalesced into a - single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - - @param block The block to be called whenever a change occurs. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block queue:(dispatch_queue_t)queue; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block keyPaths:(NSArray *)keyPaths queue:(dispatch_queue_t)queue; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block keyPaths:(NSArray *)keyPaths; - - -#pragma mark - Other Instance Methods - -/** - Returns YES if another Realm object instance points to the same object as the receiver in the Realm managing - the receiver. - - For frozen objects and object types with a primary key, `isEqual:` is - overridden to use the same logic as this method (along with a corresponding - implementation for `hash`). Non-frozen objects without primary keys use - pointer identity for `isEqual:` and `hash`. - - @param object The object to compare the receiver to. - - @return Whether the object represents the same object as the receiver. - */ -- (BOOL)isEqualToObject:(RLMObject *)object; - -/** - Returns a frozen (immutable) snapshot of this object. - - The frozen copy is an immutable object which contains the same data as this - object currently contains, but will not update when writes are made to the - containing Realm. Unlike live objects, frozen objects can be accessed from any - thread. - - - warning: Holding onto a frozen object for an extended period while performing write - transaction on the Realm may result in the Realm file growing to large sizes. See - `Realm.Configuration.maximumNumberOfActiveVersions` for more information. - - warning: This method can only be called on a managed object. - */ -- (instancetype)freeze NS_RETURNS_RETAINED; - -/** - Returns a live (mutable) reference of this object. - - This method creates a managed accessor to a live copy of the same frozen object. - Will return self if called on an already live object. - */ -- (instancetype)thaw; - -#pragma mark - Dynamic Accessors - -/// :nodoc: -- (nullable id)objectForKeyedSubscript:(NSString *)key; - -/// :nodoc: -- (void)setObject:(nullable id)obj forKeyedSubscript:(NSString *)key; - -@end - -/** - Information about a specific property which changed in an `RLMObject` change notification. - */ -@interface RLMPropertyChange : NSObject - -/** - The name of the property which changed. - */ -@property (nonatomic, readonly, strong) NSString *name; - -/** - The value of the property before the change occurred. This will always be `nil` - if the change happened on the same thread as the notification and for `RLMArray` - properties. - - For object properties this will give the object which was previously linked to, - but that object will have its new values and not the values it had before the - changes. This means that `previousValue` may be a deleted object, and you will - need to check `invalidated` before accessing any of its properties. - */ -@property (nonatomic, readonly, strong, nullable) id previousValue; - -/** - The value of the property after the change occurred. This will always be `nil` - for `RLMArray` properties. - */ -@property (nonatomic, readonly, strong, nullable) id value; -@end - -#pragma mark - RLMArray Property Declaration - -/** - Properties on `RLMObject`s of type `RLMArray` must have an associated type. A type is associated - with an `RLMArray` property by defining a protocol for the object type that the array should contain. - To define the protocol for an object, you can use the macro RLM_ARRAY_TYPE: - - RLM_ARRAY_TYPE(ObjectType) - ... - @property RLMArray *arrayOfObjectTypes; - */ -#define RLM_ARRAY_TYPE(RLM_OBJECT_SUBCLASS)\ -__attribute__((deprecated("RLM_ARRAY_TYPE has been deprecated. Use RLM_COLLECTION_TYPE instead."))) \ -@protocol RLM_OBJECT_SUBCLASS \ -@end - -/** - Properties on `RLMObject`s of type `RLMSet` / `RLMArray` must have an associated type. A type is associated - with an `RLMSet` / `RLMArray` property by defining a protocol for the object type that the array should contain. - To define the protocol for an object, you can use the macro RLM_COLLECTION_TYPE: - - RLM_COLLECTION_TYPE(ObjectType) - ... - @property RLMSet *setOfObjectTypes; - @property RLMArray *arrayOfObjectTypes; - */ -#define RLM_COLLECTION_TYPE(RLM_OBJECT_SUBCLASS)\ -@protocol RLM_OBJECT_SUBCLASS \ -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMObjectBase.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMObjectBase.h deleted file mode 100644 index 7e9c83c8f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMObjectBase.h +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// :nodoc: -@interface RLMObjectBase : NSObject - -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -- (instancetype)init NS_DESIGNATED_INITIALIZER; - -+ (NSString *)className; - -// Returns whether the class is included in the default set of classes managed by a Realm. -+ (BOOL)shouldIncludeInDefaultSchema; - -+ (nullable NSString *)_realmObjectName; -+ (nullable NSDictionary *)_realmColumnNames; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMObjectBase_Dynamic.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMObjectBase_Dynamic.h deleted file mode 100644 index fb74a5b27..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMObjectBase_Dynamic.h +++ /dev/null @@ -1,82 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectSchema, RLMRealm; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -/** - Returns the Realm that manages the object, if one exists. - - @warning This function is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is - recommended to retrieve the Realm that manages the object via `RLMObject`. - - @param object An `RLMObjectBase` obtained via a Swift `Object` or `RLMObject`. - - @return The Realm which manages this object. Returns `nil `for unmanaged objects. - */ -FOUNDATION_EXTERN RLMRealm * _Nullable RLMObjectBaseRealm(RLMObjectBase * _Nullable object); - -/** - Returns an `RLMObjectSchema` which describes the managed properties of the object. - - @warning This function is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is - recommended to retrieve `objectSchema` via `RLMObject`. - - @param object An `RLMObjectBase` obtained via a Swift `Object` or `RLMObject`. - - @return The object schema which lists the managed properties for the object. - */ -FOUNDATION_EXTERN RLMObjectSchema * _Nullable RLMObjectBaseObjectSchema(RLMObjectBase * _Nullable object); - -/** - Returns the object corresponding to a key value. - - @warning This function is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is - recommended to retrieve key values via `RLMObject`. - - @warning Will throw an `NSUndefinedKeyException` if `key` is not present on the object. - - @param object An `RLMObjectBase` obtained via a Swift `Object` or `RLMObject`. - @param key The name of the property. - - @return The object for the property requested. - */ -FOUNDATION_EXTERN id _Nullable RLMObjectBaseObjectForKeyedSubscript(RLMObjectBase * _Nullable object, NSString *key); - -/** - Sets a value for a key on the object. - - @warning This function is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is - recommended to set key values via `RLMObject`. - - @warning Will throw an `NSUndefinedKeyException` if `key` is not present on the object. - - @param object An `RLMObjectBase` obtained via a Swift `Object` or `RLMObject`. - @param key The name of the property. - @param obj The object to set as the value of the key. - */ -FOUNDATION_EXTERN void RLMObjectBaseSetObjectForKeyedSubscript(RLMObjectBase * _Nullable object, NSString *key, id _Nullable obj); - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMObjectId.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMObjectId.h deleted file mode 100644 index 32ef7b047..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMObjectId.h +++ /dev/null @@ -1,79 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A 12-byte (probably) unique object identifier. - - ObjectIds are similar to a GUID or a UUID, and can be used to uniquely identify - objects without a centralized ID generator. An ObjectID consists of: - - 1. A 4 byte timestamp measuring the creation time of the ObjectId in seconds - since the Unix epoch. - 2. A 5 byte random value - 3. A 3 byte counter, initialized to a random value. - - ObjectIds are intended to be fast to generate. Sorting by an ObjectId field - will typically result in the objects being sorted in creation order. - */ -RLM_SWIFT_SENDABLE // immutable -@interface RLMObjectId : NSObject -/// Creates a new randomly-initialized ObjectId. -+ (nonnull instancetype)objectId NS_SWIFT_NAME(generate()); - -/// Creates a new zero-initialized ObjectId. -- (instancetype)init; - -/// Creates a new ObjectId from the given 24-byte hexadecimal string. -/// -/// Returns `nil` and sets `error` if the string is not 24 characters long or -/// contains any characters other than 0-9a-fA-F. -/// -/// @param string The string to parse. -- (nullable instancetype)initWithString:(NSString *)string - error:(NSError **)error; - -/// Creates a new ObjectId using the given date, machine identifier, process identifier. -/// -/// @param timestamp A timestamp as NSDate. -/// @param machineIdentifier The machine identifier. -/// @param processIdentifier The process identifier. -- (instancetype)initWithTimestamp:(NSDate *)timestamp - machineIdentifier:(int)machineIdentifier - processIdentifier:(int)processIdentifier; - -/// Comparision operator to check if the right hand side is greater than the current value. -- (BOOL)isGreaterThan:(nullable RLMObjectId *)objectId; -/// Comparision operator to check if the right hand side is greater than or equal to the current value. -- (BOOL)isGreaterThanOrEqualTo:(nullable RLMObjectId *)objectId; -/// Comparision operator to check if the right hand side is less than the current value. -- (BOOL)isLessThan:(nullable RLMObjectId *)objectId; -/// Comparision operator to check if the right hand side is less than or equal to the current value. -- (BOOL)isLessThanOrEqualTo:(nullable RLMObjectId *)objectId; - -/// Get the ObjectId as a 24-character hexadecimal string. -@property (nonatomic, readonly) NSString *stringValue; -/// Get the timestamp for the RLMObjectId -@property (nonatomic, readonly) NSDate *timestamp; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMObjectSchema.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMObjectSchema.h deleted file mode 100644 index 9c4666b7c..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMObjectSchema.h +++ /dev/null @@ -1,83 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMProperty; - -/** - This class represents Realm model object schemas. - - When using Realm, `RLMObjectSchema` instances allow performing migrations and - introspecting the database's schema. - - Object schemas map to tables in the core database. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // not actually immutable, but the public API kinda is -@interface RLMObjectSchema : NSObject - -#pragma mark - Properties - -/** - An array of `RLMProperty` instances representing the managed properties of a class described by the schema. - - @see `RLMProperty` - */ -@property (nonatomic, readonly, copy) NSArray *properties; - -/** - The name of the class the schema describes. - */ -@property (nonatomic, readonly) NSString *className; - -/** - The property which serves as the primary key for the class the schema describes, if any. - */ -@property (nonatomic, readonly, nullable) RLMProperty *primaryKeyProperty; - -/** - Whether this object type is embedded. - */ -@property (nonatomic, readonly) BOOL isEmbedded; - -/** - Whether this object is asymmetric. - */ -@property (nonatomic, readonly) BOOL isAsymmetric; - -#pragma mark - Methods - -/** - Retrieves an `RLMProperty` object by the property name. - - @param propertyName The property's name. - - @return An `RLMProperty` object, or `nil` if there is no property with the given name. - */ -- (nullable RLMProperty *)objectForKeyedSubscript:(NSString *)propertyName; - -/** - Returns whether two `RLMObjectSchema` instances are equal. - */ -- (BOOL)isEqualToObjectSchema:(RLMObjectSchema *)objectSchema; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMProperty.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMProperty.h deleted file mode 100644 index 7f2594d3b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMProperty.h +++ /dev/null @@ -1,149 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// :nodoc: -@protocol RLMInt @end -/// :nodoc: -@protocol RLMBool @end -/// :nodoc: -@protocol RLMDouble @end -/// :nodoc: -@protocol RLMFloat @end -/// :nodoc: -@protocol RLMString @end -/// :nodoc: -@protocol RLMDate @end -/// :nodoc: -@protocol RLMData @end -/// :nodoc: -@protocol RLMDecimal128 @end -/// :nodoc: -@protocol RLMObjectId @end -/// :nodoc: -@protocol RLMUUID @end - -/// :nodoc: -@interface NSNumber () -@end - -/** - `RLMProperty` instances represent properties managed by a Realm in the context - of an object schema. Such properties may be persisted to a Realm file or - computed from other data from the Realm. - - When using Realm, `RLMProperty` instances allow performing migrations and - introspecting the database's schema. - - These property instances map to columns in the core database. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // not actually immutable, but the public API kinda is -@interface RLMProperty : NSObject - -#pragma mark - Properties - -/** - The name of the property. - */ -@property (nonatomic, readonly) NSString *name; - -/** - The type of the property. - - @see `RLMPropertyType` - */ -@property (nonatomic, readonly) RLMPropertyType type; - -/** - Indicates whether this property is indexed. - - @see `RLMObject` - */ -@property (nonatomic, readonly) BOOL indexed; - -/** - For `RLMObject` and `RLMCollection` properties, the name of the class of object stored in the property. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - For linking objects properties, the property name of the property the linking objects property is linked to. - */ -@property (nonatomic, readonly, copy, nullable) NSString *linkOriginPropertyName; - -/** - Indicates whether this property is optional. - */ -@property (nonatomic, readonly) BOOL optional; - -/** - Indicates whether this property is an array. - */ -@property (nonatomic, readonly) BOOL array; - -/** - Indicates whether this property is a set. - */ -@property (nonatomic, readonly) BOOL set; - -/** - Indicates whether this property is a dictionary. - */ -@property (nonatomic, readonly) BOOL dictionary; - -/** - Indicates whether this property is an array or set. - */ -@property (nonatomic, readonly) BOOL collection; - -#pragma mark - Methods - -/** - Returns whether a given property object is equal to the receiver. - */ -- (BOOL)isEqualToProperty:(RLMProperty *)property; - -@end - - -/** - An `RLMPropertyDescriptor` instance represents a specific property on a given class. - */ -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMPropertyDescriptor : NSObject - -/** - Creates and returns a property descriptor. - - @param objectClass The class of this property descriptor. - @param propertyName The name of this property descriptor. - */ -+ (instancetype)descriptorWithClass:(Class)objectClass propertyName:(NSString *)propertyName; - -/// The class of the property. -@property (nonatomic, readonly) Class objectClass; - -/// The name of the property. -@property (nonatomic, readonly) NSString *propertyName; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMProviderClient.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMProviderClient.h deleted file mode 100644 index ac649960a..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMProviderClient.h +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMApp; - -/// Base provider client interface. -RLM_SWIFT_SENDABLE -@interface RLMProviderClient : NSObject - -/// The app associated with this provider client. -@property (nonatomic, strong, readonly) RLMApp *app; - -/** - Initialize a provider client with a given app. - @param app The app for this provider client. - */ -- (instancetype)initWithApp:(RLMApp *)app; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMPushClient.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMPushClient.h deleted file mode 100644 index 0628c3ada..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMPushClient.h +++ /dev/null @@ -1,47 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMApp, RLMUser; - -/// A block type used to report an error -RLM_SWIFT_SENDABLE // invoked on a backgroun thread -typedef void(^RLMOptionalErrorBlock)(NSError * _Nullable); - -/// A client which can be used to register devices with the server to receive push notificatons -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMPushClient : NSObject - -/// The push notification service name the device will be registered with on the server -@property (nonatomic, readonly, nonnull) NSString *serviceName; - -/// Request to register device token to the server -- (void)registerDeviceWithToken:(NSString *)token - user:(RLMUser *)user - completion:(RLMOptionalErrorBlock)completion NS_SWIFT_NAME(registerDevice(token:user:completion:)); - -/// Request to deregister a device for a user -- (void)deregisterDeviceForUser:(RLMUser *)user - completion:(RLMOptionalErrorBlock)completion NS_SWIFT_NAME(deregisterDevice(user:completion:)); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMRealm+Sync.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMRealm+Sync.h deleted file mode 100644 index ff20e43c2..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMRealm+Sync.h +++ /dev/null @@ -1,38 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2017 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -@class RLMResults, RLMSyncSession; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -/// -@interface RLMRealm (Sync) - -/** - Get the RLMSyncSession used by this Realm. Will be nil if this is not a - synchronized Realm. -*/ -@property (nonatomic, nullable, readonly) RLMSyncSession *syncSession; - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMRealm.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMRealm.h deleted file mode 100644 index 0935e5301..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMRealm.h +++ /dev/null @@ -1,962 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMRealmConfiguration, RLMRealm, RLMObject, RLMSchema, RLMMigration, RLMNotificationToken, RLMThreadSafeReference, RLMAsyncOpenTask, RLMSyncSubscriptionSet; - -/** - A callback block for opening Realms asynchronously. - - Returns the Realm if the open was successful, or an error otherwise. - */ -typedef void(^RLMAsyncOpenRealmCallback)(RLMRealm * _Nullable realm, NSError * _Nullable error); - -/// The Id of the asynchronous transaction. -typedef unsigned RLMAsyncTransactionId; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - An `RLMRealm` instance (also referred to as "a Realm") represents a Realm - database. - - Realms can either be stored on disk (see `+[RLMRealm realmWithURL:]`) or in - memory (see `RLMRealmConfiguration`). - - `RLMRealm` instances are cached internally, and constructing equivalent `RLMRealm` - objects (for example, by using the same path or identifier) multiple times on a single thread - within a single iteration of the run loop will normally return the same - `RLMRealm` object. - - If you specifically want to ensure an `RLMRealm` instance is - destroyed (for example, if you wish to open a Realm, check some property, and - then possibly delete the Realm file and re-open it), place the code which uses - the Realm within an `@autoreleasepool {}` and ensure you have no other - strong references to it. - - @warning Non-frozen `RLMRealm` instances are thread-confined and cannot be - shared across threads or dispatch queues. Trying to do so will cause an - exception to be thrown. You must call this method on each thread you want to - interact with the Realm on. For dispatch queues, this means that you must call - it in each block which is dispatched, as a queue is not guaranteed to run all - of its blocks on the same thread. - */ - -@interface RLMRealm : NSObject - -#pragma mark - Creating & Initializing a Realm - -/** - Obtains an instance of the default Realm. - - The default Realm is used by the `RLMObject` class methods - which do not take an `RLMRealm` parameter, but is otherwise not special. The - default Realm is persisted as *default.realm* under the *Documents* directory of - your Application on iOS, in your application's *Application Support* - directory on macOS, and in the *Cache* directory on tvOS. - - The default Realm is created using the default `RLMRealmConfiguration`, which - can be changed via `+[RLMRealmConfiguration setDefaultConfiguration:]`. - - @return The default `RLMRealm` instance for the current thread. - */ -+ (instancetype)defaultRealm; - -/** - Obtains an instance of the default Realm bound to the given queue. - - Rather than being confined to the thread they are opened on, queue-bound - RLMRealms are confined to the given queue. They can be accessed from any - thread as long as it is from within a block dispatch to the queue, and - notifications will be delivered to the queue instead of a thread's run loop. - - Realms can only be confined to a serial queue. Queue-confined RLMRealm - instances can be obtained when not on that queue, but attempting to do - anything with that instance without first dispatching to the queue will throw - an incorrect thread exception. - - The default Realm is created using the default `RLMRealmConfiguration`, which - can be changed via `+[RLMRealmConfiguration setDefaultConfiguration:]`. - - @param queue A serial dispatch queue to confine the Realm to. - @return The default `RLMRealm` instance for the given queue. - */ -+ (instancetype)defaultRealmForQueue:(dispatch_queue_t)queue; - -/** - Obtains an `RLMRealm` instance with the given configuration. - - @param configuration A configuration object to use when creating the Realm. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return An `RLMRealm` instance. - */ -+ (nullable instancetype)realmWithConfiguration:(RLMRealmConfiguration *)configuration error:(NSError **)error; - -/** - Obtains an `RLMRealm` instance with the given configuration bound to the given queue. - - Rather than being confined to the thread they are opened on, queue-bound - RLMRealms are confined to the given queue. They can be accessed from any - thread as long as it is from within a block dispatch to the queue, and - notifications will be delivered to the queue instead of a thread's run loop. - - Realms can only be confined to a serial queue. Queue-confined RLMRealm - instances can be obtained when not on that queue, but attempting to do - anything with that instance without first dispatching to the queue will throw - an incorrect thread exception. - - @param configuration A configuration object to use when creating the Realm. - @param queue A serial dispatch queue to confine the Realm to. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return An `RLMRealm` instance. - */ -+ (nullable instancetype)realmWithConfiguration:(RLMRealmConfiguration *)configuration - queue:(nullable dispatch_queue_t)queue - error:(NSError **)error; - -/** - Obtains an `RLMRealm` instance persisted at a specified file URL. - - @param fileURL The local URL of the file the Realm should be saved at. - - @return An `RLMRealm` instance. - */ -+ (instancetype)realmWithURL:(NSURL *)fileURL; - -/** - Asynchronously open a Realm and deliver it to a block on the given queue. - - Opening a Realm asynchronously will perform all work needed to get the Realm to - a usable state (such as running potentially time-consuming migrations) on a - background thread before dispatching to the given queue. In addition, - synchronized Realms wait for all remote content available at the time the - operation began to be downloaded and available locally. - - The Realm passed to the callback function is confined to the callback queue as - if `-[RLMRealm realmWithConfiguration:queue:error]` was used. - - @param configuration A configuration object to use when opening the Realm. - @param callbackQueue The serial dispatch queue on which the callback should be run. - @param callback A callback block. If the Realm was successfully opened, - it will be passed in as an argument. - Otherwise, an `NSError` describing what went wrong will be - passed to the block instead. - */ -+ (RLMAsyncOpenTask *)asyncOpenWithConfiguration:(RLMRealmConfiguration *)configuration - callbackQueue:(dispatch_queue_t)callbackQueue - callback:(RLMAsyncOpenRealmCallback)callback; - -/** - The `RLMSchema` used by the Realm. - */ -@property (nonatomic, readonly) RLMSchema *schema; - -/** - Indicates if the Realm is currently engaged in a write transaction. - - @warning Do not simply check this property and then start a write transaction whenever an object needs to be - created, updated, or removed. Doing so might cause a large number of write transactions to be created, - degrading performance. Instead, always prefer performing multiple updates during a single transaction. - */ -@property (nonatomic, readonly) BOOL inWriteTransaction; - -/** - The `RLMRealmConfiguration` object that was used to create this `RLMRealm` instance. - */ -@property (nonatomic, readonly) RLMRealmConfiguration *configuration; - -/** - Indicates if this Realm contains any objects. - */ -@property (nonatomic, readonly) BOOL isEmpty; - -/** - Indicates if this Realm is frozen. - - @see `-[RLMRealm freeze]` - */ -@property (nonatomic, readonly, getter=isFrozen) BOOL frozen; - -/** - Returns a frozen (immutable) snapshot of this Realm. - - A frozen Realm is an immutable snapshot view of a particular version of a - Realm's data. Unlike normal RLMRealm instances, it does not live-update to - reflect writes made to the Realm, and can be accessed from any thread. Writing - to a frozen Realm is not allowed, and attempting to begin a write transaction - will throw an exception. - - All objects and collections read from a frozen Realm will also be frozen. - */ -- (RLMRealm *)freeze NS_RETURNS_RETAINED; - -/** - Returns a live reference of this Realm. - - All objects and collections read from the returned Realm will no longer be frozen. - This method will return `self` if it is not already frozen. - */ -- (RLMRealm *)thaw; - -#pragma mark - File Management - -/** - Writes a compacted and optionally encrypted copy of the Realm to the given local URL. - - The destination file cannot already exist. - - Note that if this method is called from within a write transaction, the - *current* data is written, not the data from the point when the previous write - transaction was committed. - - @param fileURL Local URL to save the Realm to. - @param key Optional 64-byte encryption key to encrypt the new file with. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return `YES` if the Realm was successfully written to disk, `NO` if an error occurred. - */ -- (BOOL)writeCopyToURL:(NSURL *)fileURL encryptionKey:(nullable NSData *)key error:(NSError **)error; - -/** - Writes a copy of the Realm to a given location specified by a given configuration. - - If the configuration supplied is derived from a `RLMUser` then this Realm will be copied with - sync functionality enabled. - - The destination file cannot already exist. - - @param configuration A Realm Configuration. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return `YES` if the Realm was successfully written to disk, `NO` if an error occurred. - */ -- (BOOL)writeCopyForConfiguration:(RLMRealmConfiguration *)configuration error:(NSError **)error; - -/** - Checks if the Realm file for the given configuration exists locally on disk. - - For non-synchronized, non-in-memory Realms, this is equivalent to - `-[NSFileManager.defaultManager fileExistsAtPath:config.path]`. For - synchronized Realms, it takes care of computing the actual path on disk based - on the server, virtual path, and user as is done when opening the Realm. - - @param config A Realm configuration to check the existence of. - @return YES if the Realm file for the given configuration exists on disk, NO otherwise. - */ -+ (BOOL)fileExistsForConfiguration:(RLMRealmConfiguration *)config; - -/** - Deletes the local Realm file and associated temporary files for the given configuration. - - This deletes the ".realm", ".note" and ".management" files which would be - created by opening the Realm with the given configuration. It does not delete - the ".lock" file (which contains no persisted data and is recreated from - scratch every time the Realm file is opened). - - The Realm must not be currently open on any thread or in another process. If - it is, this will return NO and report the error RLMErrorAlreadyOpen. Attempting to open - the Realm on another thread while the deletion is happening will block (and - then create a new Realm and open that afterwards). - - If the Realm already does not exist this will return `NO` and report the error NSFileNoSuchFileError; - - @param config A Realm configuration identifying the Realm to be deleted. - @return YES if any files were deleted, NO otherwise. - */ -+ (BOOL)deleteFilesForConfiguration:(RLMRealmConfiguration *)config error:(NSError **)error - __attribute__((swift_error(nonnull_error))); - -#pragma mark - Notifications - -/** - The type of a block to run whenever the data within the Realm is modified. - - @see `-[RLMRealm addNotificationBlock:]` - */ -typedef void (^RLMNotificationBlock)(RLMNotification notification, RLMRealm *realm); - -#pragma mark - Receiving Notification when a Realm Changes - -/** - Adds a notification handler for changes in this Realm, and returns a notification token. - - Notification handlers are called after each write transaction is committed, - either on the current thread or other threads. - - Handler blocks are called on the same thread that they were added on, and may - only be added on threads which are currently within a run loop. Unless you are - specifically creating and running a run loop on a background thread, this will - normally only be the main thread. - - The block has the following definition: - - typedef void(^RLMNotificationBlock)(RLMNotification notification, RLMRealm *realm); - - It receives the following parameters: - - - `NSString` \***notification**: The name of the incoming notification. See - `RLMRealmNotification` for information on what - notifications are sent. - - `RLMRealm` \***realm**: The Realm for which this notification occurred. - - @param block A block which is called to process Realm notifications. - - @return A token object which must be retained as long as you wish to continue - receiving change notifications. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMNotificationBlock)block __attribute__((warn_unused_result)); - -#pragma mark - Writing to a Realm - -/** - Begins a write transaction on the Realm. - - Only one write transaction can be open at a time for each Realm file. Write - transactions cannot be nested, and trying to begin a write transaction on a - Realm which is already in a write transaction will throw an exception. Calls to - `beginWriteTransaction` from `RLMRealm` instances for the same Realm file in - other threads or other processes will block until the current write transaction - completes or is cancelled. - - Before beginning the write transaction, `beginWriteTransaction` updates the - `RLMRealm` instance to the latest Realm version, as if `refresh` had been - called, and generates notifications if applicable. This has no effect if the - Realm was already up to date. - - It is rarely a good idea to have write transactions span multiple cycles of - the run loop, but if you do wish to do so you will need to ensure that the - Realm participating in the write transaction is kept alive until the write - transaction is committed. - */ -- (void)beginWriteTransaction; - -/** - Commits all write operations in the current write transaction, and ends the - transaction. - - After saving the changes, all notification blocks registered on this specific - `RLMRealm` instance are invoked synchronously. Notification blocks registered - on other threads or on collections are invoked asynchronously. If you do not - want to receive a specific notification for this write tranaction, see - `commitWriteTransactionWithoutNotifying:error:`. - - This method can fail if there is insufficient disk space available to save the - writes made, or due to unexpected i/o errors. This version of the method throws - an exception when errors occur. Use the version with a `NSError` out parameter - instead if you wish to handle errors. - - @warning This method may only be called during a write transaction. - */ -- (void)commitWriteTransaction NS_SWIFT_UNAVAILABLE(""); - -/** - Commits all write operations in the current write transaction, and ends the - transaction. - - After saving the changes, all notification blocks registered on this specific - `RLMRealm` instance are invoked synchronously. Notification blocks registered - on other threads or on collections are invoked asynchronously. If you do not - want to receive a specific notification for this write tranaction, see - `commitWriteTransactionWithoutNotifying:error:`. - - This method can fail if there is insufficient disk space available to save the - writes made, or due to unexpected i/o errors. - - @warning This method may only be called during a write transaction. - - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return Whether the transaction succeeded. - */ -- (BOOL)commitWriteTransaction:(NSError **)error; - -/** - Commits all write operations in the current write transaction, without - notifying specific notification blocks of the changes. - - After saving the changes, all notification blocks registered on this specific - `RLMRealm` instance are invoked synchronously. Notification blocks registered - on other threads or on collections are scheduled to be invoked asynchronously. - - You can skip notifiying specific notification blocks about the changes made - in this write transaction by passing in their associated notification tokens. - This is primarily useful when the write transaction is saving changes already - made in the UI and you do not want to have the notification block attempt to - re-apply the same changes. - - The tokens passed to this method must be for notifications for this specific - `RLMRealm` instance. Notifications for different threads cannot be skipped - using this method. - - This method can fail if there is insufficient disk space available to save the - writes made, or due to unexpected i/o errors. - - @warning This method may only be called during a write transaction. - - @param tokens An array of notification tokens which were returned from adding - callbacks which you do not want to be notified for the changes - made in this write transaction. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return Whether the transaction succeeded. - */ -- (BOOL)commitWriteTransactionWithoutNotifying:(NSArray *)tokens error:(NSError **)error; - -/** - Reverts all writes made during the current write transaction and ends the transaction. - - This rolls back all objects in the Realm to the state they were in at the - beginning of the write transaction, and then ends the transaction. - - This restores the data for deleted objects, but does not revive invalidated - object instances. Any `RLMObject`s which were added to the Realm will be - invalidated rather than becoming unmanaged. - Given the following code: - - ObjectType *oldObject = [[ObjectType objectsWhere:@"..."] firstObject]; - ObjectType *newObject = [[ObjectType alloc] init]; - - [realm beginWriteTransaction]; - [realm addObject:newObject]; - [realm deleteObject:oldObject]; - [realm cancelWriteTransaction]; - - Both `oldObject` and `newObject` will return `YES` for `isInvalidated`, - but re-running the query which provided `oldObject` will once again return - the valid object. - - KVO observers on any objects which were modified during the transaction will - be notified about the change back to their initial values, but no other - notifications are produced by a cancelled write transaction. - - @warning This method may only be called during a write transaction. - */ -- (void)cancelWriteTransaction; - -/** - Performs actions contained within the given block inside a write transaction. - - @see `[RLMRealm transactionWithoutNotifying:block:error:]` - */ -- (void)transactionWithBlock:(__attribute__((noescape)) void(^)(void))block NS_SWIFT_UNAVAILABLE(""); - -/** - Performs actions contained within the given block inside a write transaction. - - @see `[RLMRealm transactionWithoutNotifying:block:error:]` - */ -- (BOOL)transactionWithBlock:(__attribute__((noescape)) void(^)(void))block error:(NSError **)error; - -/** - Performs actions contained within the given block inside a write transaction. - - @see `[RLMRealm transactionWithoutNotifying:block:error:]` - */ -- (void)transactionWithoutNotifying:(NSArray *)tokens block:(__attribute__((noescape)) void(^)(void))block; - -/** - Performs actions contained within the given block inside a write transaction. - - Write transactions cannot be nested, and trying to execute a write transaction - on a Realm which is already participating in a write transaction will throw an - exception. Calls to `transactionWithBlock:` from `RLMRealm` instances in other - threads will block until the current write transaction completes. - - Before beginning the write transaction, `transactionWithBlock:` updates the - `RLMRealm` instance to the latest Realm version, as if `refresh` had been called, and - generates notifications if applicable. This has no effect if the Realm - was already up to date. - - You can skip notifiying specific notification blocks about the changes made - in this write transaction by passing in their associated notification tokens. - This is primarily useful when the write transaction is saving changes already - made in the UI and you do not want to have the notification block attempt to - re-apply the same changes. - - The tokens passed to this method must be for notifications for this specific - `RLMRealm` instance. Notifications for different threads cannot be skipped - using this method. - - @param tokens An array of notification tokens which were returned from adding - callbacks which you do not want to be notified for the changes - made in this write transaction. - @param block The block containing actions to perform. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return Whether the transaction succeeded. - */ -- (BOOL)transactionWithoutNotifying:(NSArray *)tokens block:(__attribute__((noescape)) void(^)(void))block error:(NSError **)error; - -/** - Indicates if the Realm is currently performing async write operations. - This becomes YES following a call to `beginAsyncWriteTransaction`, - `commitAsyncWriteTransaction`, or `asyncTransactionWithBlock:`, and remains so - until all scheduled async write work has completed. - - @warning If this is `YES`, closing or invalidating the Realm will block until scheduled work has completed. - */ -@property (nonatomic, readonly) BOOL isPerformingAsynchronousWriteOperations; - -/** - Begins an asynchronous write transaction. - This function asynchronously begins a write transaction on a background - thread, and then invokes the block on the original thread or queue once the - transaction has begun. Unlike `beginWriteTransaction`, this does not block the - calling thread if another thread is current inside a write transaction, and - will always return immediately. - Multiple calls to this function (or the other functions which perform - asynchronous write transactions) will queue the blocks to be called in the - same order as they were queued. This includes calls from inside a write - transaction block, which unlike with synchronous transactions are allowed. - - @param block The block containing actions to perform inside the write transaction. - `block` should end by calling `commitAsyncWriteTransaction`, - `commitWriteTransaction` or `cancelWriteTransaction`. - Returning without one of these calls is equivalent to calling `cancelWriteTransaction`. - - @return An id identifying the asynchronous transaction which can be passed to - `cancelAsyncTransaction:` prior to the block being called to cancel - the pending invocation of the block. - */ -- (RLMAsyncTransactionId)beginAsyncWriteTransaction:(void(^)(void))block; - -/** - Asynchronously commits a write transaction. - The call returns immediately allowing the caller to proceed while the I/O is - performed on a dedicated background thread. This can be used regardless of if - the write transaction was begun with `beginWriteTransaction` or - `beginAsyncWriteTransaction`. - - @param completionBlock A block which will be called on the source thread or - queue once the commit has either completed or failed - with an error. - - @param allowGrouping If `YES`, multiple sequential calls to - `commitAsyncWriteTransaction:` may be batched together - and persisted to stable storage in one group. This - improves write performance, particularly when the - individual transactions being batched are small. In the - event of a crash or power failure, either all of the - grouped transactions will be lost or none will, rather - than the usual guarantee that data has been persisted as - soon as a call to commit has returned. - - @return An id identifying the asynchronous transaction commit can be passed to - `cancelAsyncTransaction:` prior to the completion block being called - to cancel the pending invocation of the block. Note that this does - *not* cancel the commit itself. -*/ -- (RLMAsyncTransactionId)commitAsyncWriteTransaction:(nullable void(^)(NSError *_Nullable))completionBlock - allowGrouping:(BOOL)allowGrouping; - -/** - Asynchronously commits a write transaction. - The call returns immediately allowing the caller to proceed while the I/O is - performed on a dedicated background thread. This can be used regardless of if - the write transaction was begun with `beginWriteTransaction` or - `beginAsyncWriteTransaction`. - - @param completionBlock A block which will be called on the source thread or - queue once the commit has either completed or failed - with an error. - - @return An id identifying the asynchronous transaction commit can be passed to - `cancelAsyncTransaction:` prior to the completion block being called - to cancel the pending invocation of the block. Note that this does - *not* cancel the commit itself. -*/ -- (RLMAsyncTransactionId)commitAsyncWriteTransaction:(void(^)(NSError *_Nullable))completionBlock; - -/** - Asynchronously commits a write transaction. - The call returns immediately allowing the caller to proceed while the I/O is - performed on a dedicated background thread. This can be used regardless of if - the write transaction was begun with `beginWriteTransaction` or - `beginAsyncWriteTransaction`. - - @return An id identifying the asynchronous transaction commit can be passed to - `cancelAsyncTransaction:` prior to the completion block being called - to cancel the pending invocation of the block. Note that this does - *not* cancel the commit itself. -*/ -- (RLMAsyncTransactionId)commitAsyncWriteTransaction; - -/** - Cancels a queued block for an asynchronous transaction. - This can cancel a block passed to either an asynchronous begin or an - asynchronous commit. Canceling a begin cancels that transaction entirely, - while canceling a commit merely cancels the invocation of the completion - callback, and the commit will still happen. - Transactions can only be canceled before the block is invoked, and calling - `cancelAsyncTransaction:` from within the block is a no-op. - - @param asyncTransactionId A transaction id from either `beginAsyncWriteTransaction:` or `commitAsyncWriteTransaction:`. -*/ -- (void)cancelAsyncTransaction:(RLMAsyncTransactionId)asyncTransactionId; - -/** - Asynchronously performs actions contained within the given block inside a - write transaction. - The write transaction is begun asynchronously as if calling - `beginAsyncWriteTransaction:`, and by default the transaction is commited - asynchronously after the block completes. You can also explicitly call - `commitWriteTransaction` or `cancelWriteTransaction` from within the block to - synchronously commit or cancel the write transaction. - - @param block The block containing actions to perform. - - @param completionBlock A block which will be called on the source thread or - queue once the commit has either completed or failed - with an error. - - @return An id identifying the asynchronous transaction which can be passed to - `cancelAsyncTransaction:` prior to the block being called to cancel - the pending invocation of the block. -*/ -- (RLMAsyncTransactionId)asyncTransactionWithBlock:(void(^)(void))block onComplete:(nullable void(^)(NSError *))completionBlock; - -/** - Asynchronously performs actions contained within the given block inside a - write transaction. - The write transaction is begun asynchronously as if calling - `beginAsyncWriteTransaction:`, and by default the transaction is commited - asynchronously after the block completes. You can also explicitly call - `commitWriteTransaction` or `cancelWriteTransaction` from within the block to - synchronously commit or cancel the write transaction. - - @param block The block containing actions to perform. - - @return An id identifying the asynchronous transaction which can be passed to - `cancelAsyncTransaction:` prior to the block being called to cancel - the pending invocation of the block. -*/ -- (RLMAsyncTransactionId)asyncTransactionWithBlock:(void(^)(void))block; - -/** - Updates the Realm and outstanding objects managed by the Realm to point to the - most recent data. - - If the version of the Realm is actually changed, Realm and collection - notifications will be sent to reflect the changes. This may take some time, as - collection notifications are prepared on a background thread. As a result, - calling this method on the main thread is not advisable. - - @return Whether there were any updates for the Realm. Note that `YES` may be - returned even if no data actually changed. - */ -- (BOOL)refresh; - -/** - Set this property to `YES` to automatically update this Realm when changes - happen in other threads. - - If set to `YES` (the default), changes made on other threads will be reflected - in this Realm on the next cycle of the run loop after the changes are - committed. If set to `NO`, you must manually call `-refresh` on the Realm to - update it to get the latest data. - - Note that by default, background threads do not have an active run loop and you - will need to manually call `-refresh` in order to update to the latest version, - even if `autorefresh` is set to `YES`. - - Even with this property enabled, you can still call `-refresh` at any time to - update the Realm before the automatic refresh would occur. - - Write transactions will still always advance a Realm to the latest version and - produce local notifications on commit even if autorefresh is disabled. - - Disabling `autorefresh` on a Realm without any strong references to it will not - have any effect, and `autorefresh` will revert back to `YES` the next time the - Realm is created. This is normally irrelevant as it means that there is nothing - to refresh (as managed `RLMObject`s, `RLMArray`s, and `RLMResults` have strong - references to the Realm that manages them), but it means that setting - `RLMRealm.defaultRealm.autorefresh = NO` in - `application:didFinishLaunchingWithOptions:` and only later storing Realm - objects will not work. - - Defaults to `YES`. - */ -@property (nonatomic) BOOL autorefresh; - -/** - Invalidates all `RLMObject`s, `RLMResults`, `RLMLinkingObjects`, and `RLMArray`s managed by the Realm. - - A Realm holds a read lock on the version of the data accessed by it, so - that changes made to the Realm on different threads do not modify or delete the - data seen by this Realm. Calling this method releases the read lock, - allowing the space used on disk to be reused by later write transactions rather - than growing the file. This method should be called before performing long - blocking operations on a background thread on which you previously read data - from the Realm which you no longer need. - - All `RLMObject`, `RLMResults` and `RLMArray` instances obtained from this - `RLMRealm` instance on the current thread are invalidated. `RLMObject`s and `RLMArray`s - cannot be used. `RLMResults` will become empty. The Realm itself remains valid, - and a new read transaction is implicitly begun the next time data is read from the Realm. - - Calling this method multiple times in a row without reading any data from the - Realm, or before ever reading any data from the Realm, is a no-op. - */ -- (void)invalidate; - -#pragma mark - Accessing Objects - -/** - Returns the same object as the one referenced when the `RLMThreadSafeReference` was first created, - but resolved for the current Realm for this thread. Returns `nil` if this object was deleted after - the reference was created. - - @param reference The thread-safe reference to the thread-confined object to resolve in this Realm. - - @warning A `RLMThreadSafeReference` object must be resolved at most once. - Failing to resolve a `RLMThreadSafeReference` will result in the source version of the - Realm being pinned until the reference is deallocated. - An exception will be thrown if a reference is resolved more than once. - - @warning Cannot call within a write transaction. - - @note Will refresh this Realm if the source Realm was at a later version than this one. - - @see `+[RLMThreadSafeReference referenceWithThreadConfined:]` - */ -- (nullable id)resolveThreadSafeReference:(RLMThreadSafeReference *)reference -NS_REFINED_FOR_SWIFT; - -#pragma mark - Adding and Removing Objects from a Realm - -/** - Adds an object to the Realm. - - Once added, this object is considered to be managed by the Realm. It can be retrieved - using the `objectsWhere:` selectors on `RLMRealm` and on subclasses of `RLMObject`. - - When added, all child relationships referenced by this object will also be added to - the Realm if they are not already in it. - - If the object or any related objects are already being managed by a different Realm - an exception will be thrown. Use `-[RLMObject createInRealm:withObject:]` to insert a copy of a managed object - into a different Realm. - - The object to be added must be valid and cannot have been previously deleted - from a Realm (i.e. `isInvalidated` must be `NO`). - - @warning This method may only be called during a write transaction. - - @param object The object to be added to this Realm. - */ -- (void)addObject:(RLMObject *)object; - -/** - Adds all the objects in a collection to the Realm. - - This is the equivalent of calling `addObject:` for every object in a collection. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable collection such as `NSArray`, `RLMArray`, or `RLMResults`, - containing Realm objects to be added to the Realm. - - @see `addObject:` - */ -- (void)addObjects:(id)objects; - -/** - Adds or updates an existing object into the Realm. - - The object provided must have a designated primary key. If no objects exist in the Realm - with the same primary key value, the object is inserted. Otherwise, the existing object is - updated with any changed values. - - As with `addObject:`, the object cannot already be managed by a different - Realm. Use `-[RLMObject createOrUpdateInRealm:withValue:]` to copy values to - a different Realm. - - If there is a property or KVC value on `object` whose value is nil, and it corresponds - to a nullable property on an existing object being updated, that nullable property will - be set to nil. - - @warning This method may only be called during a write transaction. - - @param object The object to be added or updated. - */ -- (void)addOrUpdateObject:(RLMObject *)object; - -/** - Adds or updates all the objects in a collection into the Realm. - - This is the equivalent of calling `addOrUpdateObject:` for every object in a collection. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable collection such as `NSArray`, `RLMArray`, or `RLMResults`, - containing Realm objects to be added to or updated within the Realm. - - @see `addOrUpdateObject:` - */ -- (void)addOrUpdateObjects:(id)objects; - -/** - Deletes an object from the Realm. Once the object is deleted it is considered invalidated. - - @warning This method may only be called during a write transaction. - - @param object The object to be deleted. - */ -- (void)deleteObject:(RLMObject *)object; - -/** - Deletes one or more objects from the Realm. - - This is the equivalent of calling `deleteObject:` for every object in a collection. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable collection such as `NSArray`, `RLMArray`, or `RLMResults`, - containing objects to be deleted from the Realm. - - @see `deleteObject:` - */ -- (void)deleteObjects:(id)objects; - -/** - Deletes all objects from the Realm. - - @warning This method may only be called during a write transaction. - - @see `deleteObject:` - */ -- (void)deleteAllObjects; - -#pragma mark - Sync Subscriptions - -/** - Represents the active subscriptions for this realm, which can be used to add/remove/update - and search flexible sync subscriptions. - Getting the subscriptions from a local or partition-based configured realm will thrown an exception. - - @warning This feature is currently in beta and its API is subject to change. - */ -@property (nonatomic, readonly, nonnull) RLMSyncSubscriptionSet *subscriptions; - - -#pragma mark - Migrations - -/** - The type of a migration block used to migrate a Realm. - - @param migration A `RLMMigration` object used to perform the migration. The - migration object allows you to enumerate and alter any - existing objects which require migration. - - @param oldSchemaVersion The schema version of the Realm being migrated. - */ -RLM_SWIFT_SENDABLE -typedef void (^RLMMigrationBlock)(RLMMigration *migration, uint64_t oldSchemaVersion); - -/** - Returns the schema version for a Realm at a given local URL. - - @param fileURL Local URL to a Realm file. - @param key 64-byte key used to encrypt the file, or `nil` if it is unencrypted. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return The version of the Realm at `fileURL`, or `RLMNotVersioned` if the version cannot be read. - */ -+ (uint64_t)schemaVersionAtURL:(NSURL *)fileURL encryptionKey:(nullable NSData *)key - error:(NSError **)error -NS_REFINED_FOR_SWIFT; - -/** - Performs the given Realm configuration's migration block on a Realm at the given path. - - This method is called automatically when opening a Realm for the first time and does - not need to be called explicitly. You can choose to call this method to control - exactly when and how migrations are performed. - - @param configuration The Realm configuration used to open and migrate the Realm. - @return The error that occurred while applying the migration, if any. - - @see RLMMigration - */ -+ (BOOL)performMigrationForConfiguration:(RLMRealmConfiguration *)configuration error:(NSError **)error; - -#pragma mark - Unavailable Methods - -/** - RLMRealm instances are cached internally by Realm and cannot be created directly. - - Use `+[RLMRealm defaultRealm]`, `+[RLMRealm realmWithConfiguration:error:]` or - `+[RLMRealm realmWithURL]` to obtain a reference to an RLMRealm. - */ -- (instancetype)init __attribute__((unavailable("Use +defaultRealm, +realmWithConfiguration: or +realmWithURL:."))); - -/** - RLMRealm instances are cached internally by Realm and cannot be created directly. - - Use `+[RLMRealm defaultRealm]`, `+[RLMRealm realmWithConfiguration:error:]` or - `+[RLMRealm realmWithURL]` to obtain a reference to an RLMRealm. - */ -+ (instancetype)new __attribute__((unavailable("Use +defaultRealm, +realmWithConfiguration: or +realmWithURL:."))); - -/// :nodoc: -- (void)addOrUpdateObjectsFromArray:(id)array __attribute__((unavailable("Renamed to -addOrUpdateObjects:."))); - -@end - -// MARK: - RLMNotificationToken - -/** - A token which is returned from methods which subscribe to changes to a Realm. - - Change subscriptions in Realm return an `RLMNotificationToken` instance, - which can be used to unsubscribe from the changes. You must store a strong - reference to the token for as long as you want to continue to receive notifications. - When you wish to stop, call the `-invalidate` method. Notifications are also stopped if - the token is deallocated. - */ -RLM_SWIFT_SENDABLE // is internally thread-safe -@interface RLMNotificationToken : NSObject -/// Stops notifications for the change subscription that returned this token. -/// -/// @return True if the token was previously valid, and false if it was already invalidated. -- (bool)invalidate; - -/// Stops notifications for the change subscription that returned this token. -- (void)stop __attribute__((unavailable("Renamed to -invalidate."))) NS_REFINED_FOR_SWIFT; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMRealmConfiguration.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMRealmConfiguration.h deleted file mode 100644 index d09e5c215..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMRealmConfiguration.h +++ /dev/null @@ -1,197 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2015 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMEventConfiguration, RLMSyncConfiguration; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A block called when opening a Realm for the first time during the life - of a process to determine if it should be compacted before being returned - to the user. It is passed the total file size (data + free space) and the total - bytes used by data in the file. - - Return `YES` to indicate that an attempt to compact the file should be made. - The compaction will be skipped if another process is accessing it. - */ -RLM_SWIFT_SENDABLE -typedef BOOL (^RLMShouldCompactOnLaunchBlock)(NSUInteger totalBytes, NSUInteger bytesUsed); - -/** - A block which receives a subscription set instance, that can be used to add an initial set of subscriptions which will be executed - when the Realm is first opened. - */ -RLM_SWIFT_SENDABLE -typedef void(^RLMFlexibleSyncInitialSubscriptionsBlock)(RLMSyncSubscriptionSet * _Nonnull subscriptions); - -/** - An `RLMRealmConfiguration` instance describes the different options used to - create an instance of a Realm. - - `RLMRealmConfiguration` instances are just plain `NSObject`s. Unlike `RLMRealm`s - and `RLMObject`s, they can be freely shared between threads as long as you do not - mutate them. - - Creating configuration objects for class subsets (by setting the - `objectClasses` property) can be expensive. Because of this, you will normally want to - cache and reuse a single configuration object for each distinct configuration rather than - creating a new object each time you open a Realm. - */ -@interface RLMRealmConfiguration : NSObject - -#pragma mark - Default Configuration - -/** - Returns the default configuration used to create Realms when no other - configuration is explicitly specified (i.e. `+[RLMRealm defaultRealm]`). - - @return The default Realm configuration. - */ -+ (instancetype)defaultConfiguration; - -/** - Sets the default configuration to the given `RLMRealmConfiguration`. - - @param configuration The new default Realm configuration. - */ -+ (void)setDefaultConfiguration:(RLMRealmConfiguration *)configuration; - -#pragma mark - Properties - -/// The local URL of the Realm file. Mutually exclusive with `inMemoryIdentifier`; -/// setting one of the two properties will automatically nil out the other. -@property (nonatomic, copy, nullable) NSURL *fileURL; - -/// A string used to identify a particular in-memory Realm. Mutually exclusive with `fileURL`, -/// `seedFilePath`and `syncConfiguration`; -/// setting any one of the three properties will automatically nil out the other two. -@property (nonatomic, copy, nullable) NSString *inMemoryIdentifier; - -/// A 64-byte key to use to encrypt the data, or `nil` if encryption is not enabled. -@property (nonatomic, copy, nullable) NSData *encryptionKey; - -/// Whether to open the Realm in read-only mode. -/// -/// For non-synchronized Realms, this is required to be able to open Realm -/// files which are not writeable or are in a directory which is not writeable. -/// This should only be used on files which will not be modified by anyone -/// while they are open, and not just to get a read-only view of a file which -/// may be written to by another thread or process. Opening in read-only mode -/// requires disabling Realm's reader/writer coordination, so committing a -/// write transaction from another process will result in crashes. -/// -/// Syncronized Realms must always be writeable (as otherwise no -/// synchronization could happen), and this instead merely disallows performing -/// write transactions on the Realm. In addition, it will skip some automatic -/// writes made to the Realm, such as to initialize the Realm's schema. Setting -/// `readOnly = YES` is not strictly required for Realms which the sync user -/// does not have write access to, but is highly recommended as it will improve -/// error reporting and catch some errors earlier. -/// -/// Realms using query-based sync cannot be opened in read-only mode. -@property (nonatomic) BOOL readOnly; - -/// The current schema version. -@property (nonatomic) uint64_t schemaVersion; - -/// The block which migrates the Realm to the current version. -@property (nonatomic, copy, nullable) RLMMigrationBlock migrationBlock; - -/** - Whether to recreate the Realm file with the provided schema if a migration is required. - This is the case when the stored schema differs from the provided schema or - the stored schema version differs from the version on this configuration. - Setting this property to `YES` deletes the file if a migration would otherwise be required or executed. - - @note Setting this property to `YES` doesn't disable file format migrations. - */ -@property (nonatomic) BOOL deleteRealmIfMigrationNeeded; - -/** - A block called when opening a Realm for the first time during the life - of a process to determine if it should be compacted before being returned - to the user. It is passed the total file size (data + free space) and the total - bytes used by data in the file. - - Return `YES` to indicate that an attempt to compact the file should be made. - The compaction will be skipped if another process is accessing it. - */ -@property (nonatomic, copy, nullable) RLMShouldCompactOnLaunchBlock shouldCompactOnLaunch; - -/// The classes managed by the Realm. -@property (nonatomic, copy, nullable) NSArray *objectClasses; - -/** - The maximum number of live versions in the Realm file before an exception will - be thrown when attempting to start a write transaction. - - Realm provides MVCC snapshot isolation, meaning that writes on one thread do - not overwrite data being read on another thread, and instead write a new copy - of that data. When a Realm refreshes it updates to the latest version of the - data and releases the old versions, allowing them to be overwritten by - subsequent write transactions. - - Under normal circumstances this is not a problem, but if the number of active - versions grow too large, it will have a negative effect on the filesize on - disk. This can happen when performing writes on many different threads at - once, when holding on to frozen objects for an extended time, or when - performing long operations on background threads which do not allow the Realm - to refresh. - - Setting this property to a non-zero value makes it so that exceeding the set - number of versions will instead throw an exception. This can be used with a - low value during development to help identify places that may be problematic, - or in production use to cause the app to crash rather than produce a Realm - file which is too large to be opened. - - */ -@property (nonatomic) NSUInteger maximumNumberOfActiveVersions; - -/** - When opening the Realm for the first time, instead of creating an empty file, - the Realm file will be copied from the provided seed file path and used instead. - This can be used to open a Realm file with pre-populated data. - - If a realm file already exists at the configuration's destination path, the seed file - will not be copied and the already existing realm will be opened instead. - - Note that to use this parameter with a synced Realm configuration - the seed Realm must be appropriately copied to a destination with - `[RLMRealm writeCopyForConfiguration:]` first. - - This option is mutually exclusive with `inMemoryIdentifier`. Setting a `seedFilePath` - will nil out the `inMemoryIdentifier`. - */ -@property (nonatomic, copy, nullable) NSURL *seedFilePath; - -/** - A configuration object representing configuration state for Realms intended - to sync with Atlas Device Sync. - - This property is mutually exclusive with both `inMemoryIdentifier` and `fileURL`; - setting any one of the three properties will automatically nil out the other two. - - @see `RLMSyncConfiguration` - */ -@property (nullable, nonatomic) RLMSyncConfiguration *syncConfiguration; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMRealm_Dynamic.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMRealm_Dynamic.h deleted file mode 100644 index bea162775..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMRealm_Dynamic.h +++ /dev/null @@ -1,118 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import -#import - -@class RLMResults; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMRealm (Dynamic) - -#pragma mark - Getting Objects from a Realm - -/** - Returns all objects of a given type from the Realm. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. The preferred way to get objects of a single class is to use the class - methods on `RLMObject`. - - @param className The name of the `RLMObject` subclass to retrieve on (e.g. `MyClass.className`). - - @return An `RLMResults` containing all objects in the Realm of the given type. - - @see `+[RLMObject allObjects]` - */ -- (RLMResults *)allObjects:(NSString *)className; - -/** - Returns all objects matching the given predicate from the Realm. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. The preferred way to get objects of a single class is to use the class - methods on `RLMObject`. - - @param className The type of objects you are looking for (name of the class). - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` containing results matching the given predicate. - - @see `+[RLMObject objectsWhere:]` - */ -- (RLMResults *)objects:(NSString *)className where:(NSString *)predicateFormat, ...; - -/** - Returns all objects matching the given predicate from the Realm. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. The preferred way to get objects of a single class is to use the class - methods on `RLMObject`. - - @param className The type of objects you are looking for (name of the class). - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` containing results matching the given predicate. - - @see `+[RLMObject objectsWhere:]` - */ -- (RLMResults *)objects:(NSString *)className withPredicate:(NSPredicate *)predicate; - -/** - Returns the object of the given type with the given primary key from the Realm. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. The preferred way to get an object of a single class is to use the class - methods on `RLMObject`. - - @param className The class name for the object you are looking for. - @param primaryKey The primary key value for the object you are looking for. - - @return An object, or `nil` if an object with the given primary key does not exist. - - @see `+[RLMObject objectForPrimaryKey:]` - */ -- (nullable RLMObject *)objectWithClassName:(NSString *)className forPrimaryKey:(id)primaryKey; - -/** - Creates an `RLMObject` instance of type `className` in the Realm, and populates it using a given object. - - The `value` argument is used to populate the object. It can be a key-value coding compliant object, an array or - dictionary returned from the methods in `NSJSONSerialization`, or an array containing one element for each managed - property. An exception will be thrown if any required properties are not present and those properties were not defined - with default values. - - When passing in an array as the `value` argument, all properties must be present, valid and in the same order as the - properties defined in the model. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is recommended to - use `[RLMObject createInDefaultRealmWithValue:]`. - - @param value The value used to populate the object. - - @return An `RLMObject` instance of type `className`. - */ --(RLMObject *)createObject:(NSString *)className withValue:(id)value; - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMResults.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMResults.h deleted file mode 100644 index 5911e666a..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMResults.h +++ /dev/null @@ -1,567 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObject; - -/** - `RLMResults` is an auto-updating container type in Realm returned from object - queries. It represents the results of the query in the form of a collection of objects. - - `RLMResults` can be queried using the same predicates as `RLMObject` and `RLMArray`, - and you can chain queries to further filter results. - - `RLMResults` always reflect the current state of the Realm on the current thread, - including during write transactions on the current thread. The one exception to - this is when using `for...in` fast enumeration, which will always enumerate - over the objects which matched the query when the enumeration is begun, even if - some of them are deleted or modified to be excluded by the filter during the - enumeration. - - `RLMResults` are lazily evaluated the first time they are accessed; they only - run queries when the result of the query is requested. This means that - chaining several temporary `RLMResults` to sort and filter your data does not - perform any extra work processing the intermediate state. - - Once the results have been evaluated or a notification block has been added, - the results are eagerly kept up-to-date, with the work done to keep them - up-to-date done on a background thread whenever possible. - - `RLMResults` cannot be directly instantiated. - */ -@interface RLMResults : NSObject - -#pragma mark - Properties - -/** - The number of objects in the results collection. - */ -@property (nonatomic, readonly, assign) NSUInteger count; - -/** - The type of the objects in the results collection. - */ -@property (nonatomic, readonly, assign) RLMPropertyType type; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readwrite, getter = isOptional) BOOL optional; - -/** - The class name of the objects contained in the results collection. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages this results collection. - */ -@property (nonatomic, readonly) RLMRealm *realm; - -/** - Indicates if the results collection is no longer valid. - - The results collection becomes invalid if `invalidate` is called on the containing `realm`. - An invalidated results collection can be accessed, but will always be empty. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -#pragma mark - Accessing Objects from an RLMResults - -/** - Returns the object at the index specified. - - @param index The index to look up. - - @return An object of the type contained in the results collection. - */ -- (RLMObjectType)objectAtIndex:(NSUInteger)index; - -/** - Returns an array containing the objects in the results at the indexes specified by a given index set. - `nil` will be returned if the index set contains an index out of the arrays bounds. - - @param indexes The indexes in the results to retrieve objects from. - - @return The objects at the specified indexes. - */ -- (nullable NSArray *)objectsAtIndexes:(NSIndexSet *)indexes; - -/** - Returns the first object in the results collection. - - Returns `nil` if called on an empty results collection. - - @return An object of the type contained in the results collection. - */ -- (nullable RLMObjectType)firstObject; - -/** - Returns the last object in the results collection. - - Returns `nil` if called on an empty results collection. - - @return An object of the type contained in the results collection. - */ -- (nullable RLMObjectType)lastObject; - -#pragma mark - Querying Results - -/** - Returns the index of an object in the results collection. - - Returns `NSNotFound` if the object is not found in the results collection. - - @param object An object (of the same type as returned from the `objectClassName` selector). - */ -- (NSUInteger)indexOfObject:(RLMObjectType)object; - -/** - Returns the index of the first object in the results collection matching the predicate. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return The index of the object, or `NSNotFound` if the object is not found in the results collection. - */ -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns the index of the first object in the results collection matching the predicate. - - @param predicate The predicate with which to filter the objects. - - @return The index of the object, or `NSNotFound` if the object is not found in the results collection. - */ -- (NSUInteger)indexOfObjectWithPredicate:(NSPredicate *)predicate; - -/** - Returns all the objects matching the given predicate in the results collection. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` of objects that match the given predicate. - */ -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all the objects matching the given predicate in the results collection. - - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` of objects that match the given predicate. - */ -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/** - Returns a sorted `RLMResults` from an existing results collection. - - @param keyPath The key path to sort by. - @param ascending The direction to sort in. - - @return An `RLMResults` sorted by the specified key path. - */ -- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a sorted `RLMResults` from an existing results collection. - - @param properties An array of `RLMSortDescriptor`s to sort by. - - @return An `RLMResults` sorted by the specified properties. - */ -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/** - Returns a distinct `RLMResults` from an existing results collection. - - @param keyPaths The key paths used produce distinct results - - @return An `RLMResults` made distinct based on the specified key paths - */ -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -#pragma mark - Notifications - -/** - Registers a block to be called each time the results collection changes. - - The block will be asynchronously called with the initial results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the results collection were added, removed or modified. If a - write transaction did not modify any objects in the results collection, - the block is not called at all. See the `RLMCollectionChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - At the time when the block is called, the `RLMResults` object will be fully - evaluated and up-to-date, and as long as you do not perform a write transaction - on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will - never perform blocking work. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - NSLog(@"dogs.count: %zu", dogs.count); // => 0 - self.token = [results addNotificationBlock:^(RLMResults *dogs, - RLMCollectionChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - - @param block The block to be called whenever a change occurs. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the results collection changes. - - The block will be asynchronously called with the initial results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the results collection were added, removed or modified. If a - write transaction did not modify any objects in the results collection, - the block is not called at all. See the `RLMCollectionChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - At the time when the block is called, the `RLMResults` object will be fully - evaluated and up-to-date, and as long as you do not perform a write transaction - on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will - never perform blocking work. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the results collection changes. - - The block will be asynchronously called with the initial results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the results collection were added, removed or modified. If a - write transaction did not modify any objects in the results collection, - the block is not called at all. See the `RLMCollectionChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - At the time when the block is called, the `RLMResults` object will be fully - evaluated and up-to-date, and as long as you do not perform a write transaction - on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will - never perform blocking work. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the results collection changes. - - The block will be asynchronously called with the initial results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the results collection were added, removed or modified. If a - write transaction did not modify any objects in the results collection, - the block is not called at all. See the `RLMCollectionChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - At the time when the block is called, the `RLMResults` object will be fully - evaluated and up-to-date, and as long as you do not perform a write transaction - on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will - never perform blocking work. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths -__attribute__((warn_unused_result)); -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the objects - represented by the results collection. - - NSNumber *min = [results minOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose minimum value is desired. Only properties of types `int`, `float`, `double`, and - `NSDate` are supported. - - @return The minimum value of the property, or `nil` if the Results are empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects represented by the results collection. - - NSNumber *max = [results maxOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose maximum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The maximum value of the property, or `nil` if the Results are empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of the values of a given property over all the objects represented by the results collection. - - NSNumber *sum = [results sumOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose values should be summed. Only properties of - types `int`, `float`, and `double` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects represented by the results collection. - - NSNumber *average = [results averageOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose average value should be calculated. Only - properties of types `int`, `float`, and `double` are supported. - - @return The average value of the given property, or `nil` if the Results are empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -/// :nodoc: -- (RLMObjectType)objectAtIndexedSubscript:(NSUInteger)index; - -#pragma mark - Sectioned Results - -/** - Sorts and sections this collection from a given property key path, returning the result - as an instance of `RLMSectionedResults`. - - @param keyPath The property key path to sort on. - @param ascending The direction to sort in. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsSortedUsingKeyPath:(NSString *)keyPath - ascending:(BOOL)ascending - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -/** - Sorts and sections this collection from a given array of sort descriptors, returning the result - as an instance of `RLMSectionedResults`. - - @param sortDescriptors An array of `RLMSortDescriptor`s to sort by. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @note The primary sort descriptor must be responsible for determining the section key. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsUsingSortDescriptors:(NSArray *)sortDescriptors - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -#pragma mark - Freeze - -/** - Indicates if the result are frozen. - - Frozen Results are immutable and can be accessed from any thread.The objects - read from a frozen Results will also be frozen. - */ -@property (nonatomic, readonly, getter=isFrozen) BOOL frozen; - -/** - Returns a frozen (immutable) snapshot of these results. - - The frozen copy is an immutable collection which contains the same data as - this collection currently contains, but will not update when writes are made - to the containing Realm. Unlike live Results, frozen Results can be accessed - from any thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning Holding onto a frozen collection for an extended period while - performing write transaction on the Realm may result in the Realm - file growing to large sizes. See - `RLMRealmConfiguration.maximumNumberOfActiveVersions` for more - information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -#pragma mark - Unavailable Methods - -/** - `-[RLMResults init]` is not available because `RLMResults` cannot be created directly. - `RLMResults` can be obtained by querying a Realm. - */ -- (instancetype)init __attribute__((unavailable("RLMResults cannot be created directly"))); - -/** - `+[RLMResults new]` is not available because `RLMResults` cannot be created directly. - `RLMResults` can be obtained by querying a Realm. - */ -+ (instancetype)new __attribute__((unavailable("RLMResults cannot be created directly"))); - -@end - -/** - `RLMLinkingObjects` is an auto-updating container type. It represents a collection of objects that link to its - parent object. - - For more information, please see the "Inverse Relationships" section in the - [documentation](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/relationships/#relationships). - */ -@interface RLMLinkingObjects : RLMResults -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMSchema.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMSchema.h deleted file mode 100644 index fe46f6d47..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMSchema.h +++ /dev/null @@ -1,78 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectSchema; - -/** - `RLMSchema` instances represent collections of model object schemas managed by a Realm. - - When using Realm, `RLMSchema` instances allow performing migrations and - introspecting the database's schema. - - Schemas map to collections of tables in the core database. - */ -RLM_SWIFT_SENDABLE // not actually immutable, but the public API kinda is -@interface RLMSchema : NSObject - -#pragma mark - Properties - -/** - An `NSArray` containing `RLMObjectSchema`s for all object types in the Realm. - - This property is intended to be used during migrations for dynamic introspection. - - @see `RLMObjectSchema` - */ -@property (nonatomic, readonly, copy) NSArray *objectSchema; - -#pragma mark - Methods - -/** - Returns an `RLMObjectSchema` for the given class name in the schema. - - @param className The object class name. - @return An `RLMObjectSchema` for the given class in the schema. - - @see `RLMObjectSchema` - */ -- (nullable RLMObjectSchema *)schemaForClassName:(NSString *)className; - -/** - Looks up and returns an `RLMObjectSchema` for the given class name in the Realm. - - If there is no object of type `className` in the schema, an exception will be thrown. - - @param className The object class name. - @return An `RLMObjectSchema` for the given class in this Realm. - - @see `RLMObjectSchema` - */ -- (RLMObjectSchema *)objectForKeyedSubscript:(NSString *)className; - -/** - Returns whether two `RLMSchema` instances are equivalent. - */ -- (BOOL)isEqualToSchema:(RLMSchema *)schema; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMSectionedResults.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMSectionedResults.h deleted file mode 100644 index 4ee236b94..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMSectionedResults.h +++ /dev/null @@ -1,921 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2022 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@protocol RLMValue; -@class RLMResults; - -/** - A `RLMSectionedResultsChange` object encapsulates information about changes to sectioned - results that are reported by Realm notifications. - - `RLMSectionedResultsChange` is passed to the notification blocks registered with - `-addNotificationBlock` on `RLMSectionedResults`, and reports what sections and rows in the - collection changed since the last time the notification block was called. - - A complete example of updating a `UITableView` named `tv`: - - [tv beginUpdates]; - [tv deleteRowsAtIndexPaths:changes.deletions withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv insertRowsAtIndexPaths:changes.insertions withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv reloadRowsAtIndexPaths:changes.modifications withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv insertSections:changes.sectionsToInsert withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv deleteSections:changes.sectionsToRemove withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv endUpdates]; - - All of the arrays in an `RLMSectionedResultsChange` are always sorted in ascending order. - */ -@interface RLMSectionedResultsChange : NSObject -/// The index paths of objects in the previous version of the collection which have -/// been removed from this one. -@property (nonatomic, readonly) NSArray *deletions; -/// The index paths in the new version of the collection which were newly inserted. -@property (nonatomic, readonly) NSArray *insertions; -/// The index paths in the old version of the collection which were modified. -@property (nonatomic, readonly) NSArray *modifications; -/// The indices of the sections to be inserted. -@property (nonatomic, readonly) NSIndexSet *sectionsToInsert; -/// The indices of the sections to be removed. -@property (nonatomic, readonly) NSIndexSet *sectionsToRemove; -/// Returns the index paths of the deletion indices in the given section. -- (NSArray *)deletionsInSection:(NSUInteger)section; -/// Returns the index paths of the insertion indices in the given section. -- (NSArray *)insertionsInSection:(NSUInteger)section; -/// Returns the index paths of the modification indices in the given section. -- (NSArray *)modificationsInSection:(NSUInteger)section; -@end - - -/// The `RLMSectionedResult` protocol defines properties and methods common to both `RLMSectionedResults and RLMSection` -@protocol RLMSectionedResult - -#pragma mark - Object Access - -/// The count of objects in the collection. -@property (nonatomic, readonly) NSUInteger count; -/// Returns the object for a given index in the collection. -- (id)objectAtIndexedSubscript:(NSUInteger)index; -/// Returns the object for a given index in the collection. -- (id)objectAtIndex:(NSUInteger)index; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this collection. - - The frozen copy is an immutable collection which contains the same data as this - collection currently contains, but will not update when writes are made to the - containing Realm. Unlike live arrays, frozen collections can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning Holding onto a frozen collection for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; -/** - Indicates if the underlying collection is frozen. - - Frozen collections are immutable and can be accessed from any thread. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Sectioned Results Notifications - -/** - Registers a block to be called each time the collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` / `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(id, RLMSectionedResultsChange *))block __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` / `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(id, RLMSectionedResultsChange *))block - queue:(dispatch_queue_t)queue __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` / `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(id, RLMSectionedResultsChange *))block - keyPaths:(NSArray *)keyPaths __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` / `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(id, RLMSectionedResultsChange *))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue __attribute__((warn_unused_result)); - -@end - -/// An RLMSection contains the objects which belong to a specified section key. -@interface RLMSection, RLMObjectType> : NSObject -/// The value that represents the key in this section. -@property (nonatomic, readonly) RLMKeyType key; -/// The count of objects in the section. -@property (nonatomic, readonly) NSUInteger count; -/// Returns the object for a given index in the section. -- (RLMObjectType)objectAtIndexedSubscript:(NSUInteger)index; -/// Returns the object for a given index in the section. -- (RLMObjectType)objectAtIndex:(NSUInteger)index; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this section. - - The frozen copy is an immutable section which contains the same data as this - section currently contains, but will not update when writes are made to the - containing Realm. Unlike live arrays, frozen collections can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning Holding onto a frozen section for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; -/** - Returns a live version of this frozen section. - - This method resolves a reference to a live copy of the same frozen section. - If called on a live section, will return itself. -*/ -- (instancetype)thaw; -/** - Indicates if the underlying section is frozen. - - Frozen sections are immutable and can be accessed from any thread. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Section Notifications - -/** - Registers a block to be called each time the section changes. - - The block will be asynchronously called with the initial section, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - RLMSection *section = sectionedResults[0] // section with dogs aged '5' already exists. - - self.token = [section addNotificationBlock:^(RLMSection *section, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"section.count: %zu", section.count); // => 2 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSection *, RLMSectionedResultsChange *))block __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the section changes. - - The block will be asynchronously called with the initial section, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - RLMSection *section = sectionedResults[0] // section with dogs aged '5' already exists. - - self.token = [section addNotificationBlock:^(RLMSection *section, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"section.count: %zu", section.count); // => 2 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSection *, RLMSectionedResultsChange *))block - queue:(dispatch_queue_t)queue __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the section changes. - - The block will be asynchronously called with the initial section, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - RLMSection *section = sectionedResults[0] // section with dogs aged '5' already exists. - - self.token = [section addNotificationBlock:^(RLMSection *section, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"section.count: %zu", section.count); // => 2 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSection *, RLMSectionedResultsChange *))block - keyPaths:(NSArray *)keyPaths __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the section changes. - - The block will be asynchronously called with the initial section, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - RLMSection *section = sectionedResults[0] // section with dogs aged '5' already exists. - - self.token = [section addNotificationBlock:^(RLMSection *section, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"section.count: %zu", section.count); // => 2 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSection *, RLMSectionedResultsChange *))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue __attribute__((warn_unused_result)); -@end - -/// A lazily evaluated collection that holds elements in sections determined by a section key. -@interface RLMSectionedResults, RLMObjectType: id> : NSObject -/// An array of all keys in the sectioned results collection. -@property (nonatomic) NSArray *allKeys; -/// The total amount of sections in this collection. -@property (nonatomic, readonly, assign) NSUInteger count; -/// Returns the section at a given index. -- (RLMSection *)objectAtIndexedSubscript:(NSUInteger)index; -/// Returns the section at a given index. -- (RLMSection *)objectAtIndex:(NSUInteger)index; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this sectioned results collection. - - The frozen copy is an immutable sectioned results collection which contains the same data as this - sectioned results collection currently contains, but will not update when writes are made to the - containing Realm. Unlike live sectioned results collections, frozen sectioned results collection - can be accessed from any thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning Holding onto a frozen sectioned results collection for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; -/** - Returns a live version of this frozen sectioned results collection. - - This method resolves a reference to a live copy of the same frozen sectioned results collection. - If called on a live section, will return itself. -*/ -- (instancetype)thaw; -/** - Indicates if the underlying sectioned results collection is frozen. - - Frozen sectioned results collections are immutable and can be accessed from any thread. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Sectioned Results Notifications - -/** - Registers a block to be called each time the sectioned results collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSectionedResults *, RLMSectionedResultsChange *))block __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the sectioned results collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSectionedResults *, RLMSectionedResultsChange *))block - queue:(dispatch_queue_t)queue __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the sectioned results collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSectionedResults *, RLMSectionedResultsChange *))block - keyPaths:(NSArray *)keyPaths __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the sectioned results collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSectionedResults *, RLMSectionedResultsChange *))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue __attribute__((warn_unused_result)); -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMSet.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMSet.h deleted file mode 100644 index fead2e005..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMSet.h +++ /dev/null @@ -1,535 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObject, RLMResults; - -/** - A collection datatype used for storing distinct objects. - - - Note: - `RLMSet` supports storing primitive and `RLMObject` types. `RLMSet` does not support storing - Embedded Realm Objects. - */ -@interface RLMSet : NSObject - -#pragma mark - Properties - -/** - The number of objects in the set. - */ -@property (nonatomic, readonly, assign) NSUInteger count; - -/** - The type of the objects in the set. - */ -@property (nonatomic, readonly, assign) RLMPropertyType type; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readonly, getter = isOptional) BOOL optional; - -/** - The objects in the RLMSet as an NSArray value. - */ -@property (nonatomic, readonly) NSArray *allObjects; - -/** - The class name of the objects contained in the set. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages the set. Returns `nil` for unmanaged set. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - Indicates if the set can no longer be accessed. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if the set is frozen. - - Frozen sets are immutable and can be accessed from any thread. Frozen sets - are created by calling `-freeze` on a managed live set. Unmanaged sets are - never frozen. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Adding, Removing, and Replacing Objects in a Set - -/** - Adds an object to the set if it is not already present. - - @warning This method may only be called during a write transaction. - - @param object An object of the type contained in the set. - */ -- (void)addObject:(RLMObjectType)object; - -/** - Adds an array of distinct objects to the set. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable object such as `NSArray`, `NSSet` or `RLMResults` which contains objects of the - same class as the set. - */ -- (void)addObjects:(id)objects; - -/** - Removes a given object from the set. - - @warning This method may only be called during a write transaction. - - @param object The object in the set that you want to remove. - */ -- (void)removeObject:(RLMObjectType)object; - -/** - Removes all objects from the set. - - @warning This method may only be called during a write transaction. - */ -- (void)removeAllObjects; - -/** - Empties the receiving set, then adds each object contained in another given set. - - @warning This method may only be called during a write transaction. - - @param set The RLMSet whose members replace the receiving set's content. - */ -- (void)setSet:(RLMSet *)set; - -/** - Removes from the receiving set each object that isn’t a member of another given set. - - @warning This method may only be called during a write transaction. - - @param set The RLMSet with which to perform the intersection. - */ -- (void)intersectSet:(RLMSet *)set; - -/** - Removes each object in another given set from the receiving set, if present. - - @warning This method may only be called during a write transaction. - - @param set The set of objects to remove from the receiving set. - */ -- (void)minusSet:(RLMSet *)set; - -/** - Adds each object in another given set to the receiving set, if not present. - - @warning This method may only be called during a write transaction. - - @param set The set of objects to add to the receiving set. - */ -- (void)unionSet:(RLMSet *)set; - -#pragma mark - Querying a Set - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/// :nodoc: -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/// :nodoc: -- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/// :nodoc: -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/// :nodoc: -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -/** - Returns a Boolean value that indicates whether at least one object in the receiving set is also present in another given set. - - @param set The RLMSet to compare the receiving set to. - - @return YES if at least one object in the receiving set is also present in otherSet, otherwise NO. - */ -- (BOOL)intersectsSet:(RLMSet *)set; - -/** - Returns a Boolean value that indicates whether every object in the receiving set is also present in another given set. - - @param set The RLMSet to compare the receiving set to. - - @return YES if every object in the receiving set is also present in otherSet, otherwise NO. - */ -- (BOOL)isSubsetOfSet:(RLMSet *)set; - -/** - Returns a Boolean value that indicates whether a given object is present in the set. - - @param anObject An object to look for in the set. - - @return YES if anObject is present in the set, otherwise NO. - */ -- (BOOL)containsObject:(RLMObjectType)anObject; - -/** - Compares the receiving set to another set. - - @param otherSet The set with which to compare the receiving set. - - @return YES if the contents of otherSet are equal to the contents of the receiving set, otherwise NO. - */ -- (BOOL)isEqualToSet:(RLMSet *)otherSet; - -#pragma mark - Sectioning a Set - -/** - Sorts and sections this collection from a given property key path, returning the result - as an instance of `RLMSectionedResults`. - - @param keyPath The property key path to sort on. - @param ascending The direction to sort in. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsSortedUsingKeyPath:(NSString *)keyPath - ascending:(BOOL)ascending - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -/** - Sorts and sections this collection from a given array of sort descriptors, returning the result - as an instance of `RLMSectionedResults`. - - @param sortDescriptors An array of `RLMSortDescriptor`s to sort by. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @note The primary sort descriptor must be responsible for determining the section key. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsUsingSortDescriptors:(NSArray *)sortDescriptors - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - - -#pragma mark - Notifications - -/** - Registers a block to be called each time the set changes. - - The block will be asynchronously called with the initial set, and then - called again after each write transaction which changes any of the objects in - the set, which objects are in the results, or the order of the objects in the - set. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the set were added, removed or modified. If a write transaction - did not modify any objects in the set, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - Person *person = [[Person allObjectsInRealm:realm] firstObject]; - NSLog(@"person.dogs.count: %zu", person.dogs.count); // => 0 - self.token = [person.dogs addNotificationBlock(RLMSet *dogs, - RLMCollectionChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count) // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - [person.dogs addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a non-frozen managed set. - - @param block The block to be called each time the set changes. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSet *_Nullable set, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the set changes. - - The block will be asynchronously called with the initial set, and then - called again after each write transaction which changes any of the objects in - the set, which objects are in the results, or the order of the objects in the - set. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the set were added, removed or modified. If a write transaction - did not modify any objects in the set, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSet *_Nullable set, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the set changes. - - The block will be asynchronously called with the initial set, and then - called again after each write transaction which changes any of the objects in - the set, which objects are in the results, or the order of the objects in the - set. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the set were added, removed or modified. If a write transaction - did not modify any objects in the set, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSet *_Nullable set, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the set changes. - - The block will be asynchronously called with the initial set, and then - called again after each write transaction which changes any of the objects in - the set, which objects are in the results, or the order of the objects in the - set. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the set were added, removed or modified. If a write transaction - did not modify any objects in the set, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSet *_Nullable set, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths -__attribute__((warn_unused_result)); - -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the objects in the set. - - NSNumber *min = [object.setProperty minOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, `RLMSet`, and `NSData` properties. - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The minimum value of the property, or `nil` if the set is empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects in the set. - - NSNumber *max = [object.setProperty maxOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, `RLMSet`, and `NSData` properties. - - @param property The property whose maximum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The maximum value of the property, or `nil` if the set is empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of distinct values of a given property over all the objects in the set. - - NSNumber *sum = [object.setProperty sumOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, `RLMSet and `NSData` properties. - - @param property The property whose values should be summed. Only properties of - types `int`, `float`, and `double` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects in the set. - - NSNumber *average = [object.setProperty averageOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMSet`, `RLMArray`, and `NSData` properties. - - @param property The property whose average value should be calculated. Only - properties of types `int`, `float`, and `double` are supported. - - @return The average value of the given property, or `nil` if the set is empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this set. - - The frozen copy is an immutable set which contains the same data as this - et currently contains, but will not update when writes are made to the - containing Realm. Unlike live sets, frozen sets can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a managed set. - @warning Holding onto a frozen set for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -#pragma mark - Unavailable Methods - -/** - `-[RLMSet init]` is not available because `RLMSet`s cannot be created directly. - ``RLMSet` properties on `RLMObject`s are lazily created when accessed. - */ -- (instancetype)init __attribute__((unavailable("RLMSets cannot be created directly"))); - -/** - `+[RLMSet new]` is not available because `RLMSet`s cannot be created directly. - `RLMSet` properties on `RLMObject`s are lazily created when accessed. - */ -+ (instancetype)new __attribute__((unavailable("RLMSet cannot be created directly"))); - -@end - -/// :nodoc: -@interface RLMSet (Swift) -// for use only in Swift class definitions -- (instancetype)initWithObjectClassName:(NSString *)objectClassName; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMSwiftObject.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMSwiftObject.h deleted file mode 100644 index 7ea764016..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMSwiftObject.h +++ /dev/null @@ -1,142 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) -/** - `Object` is a class used to define Realm model objects. - - In Realm you define your model classes by subclassing `Object` and adding properties to be managed. - You then instantiate and use your custom subclasses instead of using the `Object` class directly. - - ```swift - class Dog: Object { - @objc dynamic var name: String = "" - @objc dynamic var adopted: Bool = false - let siblings = List() - } - ``` - - ### Supported property types - - - `String`, `NSString` - - `Int` - - `Int8`, `Int16`, `Int32`, `Int64` - - `Float` - - `Double` - - `Bool` - - `Date`, `NSDate` - - `Data`, `NSData` - - `Decimal128` - - `ObjectId` - - `@objc enum` which has been delcared as conforming to `RealmEnum`. - - `RealmOptional` for optional numeric properties - - `Object` subclasses, to model many-to-one relationships - - `EmbeddedObject` subclasses, to model owning one-to-one relationships - - `List`, to model many-to-many relationships - - `String`, `NSString`, `Date`, `NSDate`, `Data`, `NSData`, `Decimal128`, and `ObjectId` properties - can be declared as optional. `Object` and `EmbeddedObject` subclasses *must* be declared as optional. - `Int`, `Int8`, `Int16`, `Int32`, `Int64`, `Float`, `Double`, `Bool`, enum, and `List` properties cannot. - To store an optional number, use `RealmOptional`, `RealmOptional`, `RealmOptional`, or - `RealmOptional` instead, which wraps an optional numeric value. Lists cannot be optional at all. - - All property types except for `List` and `RealmOptional` *must* be declared as `@objc dynamic var`. `List` and - `RealmOptional` properties must be declared as non-dynamic `let` properties. Swift `lazy` properties are not allowed. - - Note that none of the restrictions listed above apply to properties that are configured to be ignored by Realm. - - ### Querying - - You can retrieve all objects of a given type from a Realm by calling the `objects(_:)` instance method. - - ### Relationships - - See our [Objective-C guide](https://docs.mongodb.com/realm/sdk/swift/fundamentals/relationships/) for more details. - */ -@interface RealmSwiftObject : RLMObjectBase -@end - -/** - `EmbeddedObject` is a base class used to define embedded Realm model objects. - - Embedded objects work similarly to normal objects, but are owned by a single - parent Object (which itself may be embedded). Unlike normal top-level objects, - embedded objects cannot be directly created in or added to a Realm. Instead, - they can only be created as part of a parent object, or by assigning an - unmanaged object to a parent object's property. Embedded objects are - automatically deleted when the parent object is deleted or when the parent is - modified to no longer point at the embedded object, either by reassigning an - Object property or by removing the embedded object from the List containing it. - - Embedded objects can only ever have a single parent object which links to - them, and attempting to link to an existing managed embedded object will throw - an exception. - - The property types supported on `EmbeddedObject` are the same as for `Object`, - except for that embedded objects cannot link to top-level objects, so `Object` - and `List` properties are not supported (`EmbeddedObject` and - `List` *are*). - - Embedded objects cannot have primary keys or indexed properties. - - ```swift - class Owner: Object { - @objc dynamic var name: String = "" - let dogs = List() - } - class Dog: EmbeddedObject { - @objc dynamic var name: String = "" - @objc dynamic var adopted: Bool = false - let owner = LinkingObjects(fromType: Owner.self, property: "dogs") - } - ``` - */ -@interface RealmSwiftEmbeddedObject : RLMObjectBase -@end - -/** - `AsymmetricObject` is a base class used to define asymmetric Realm objects. - - Asymmetric objects can only be created using the `create(_ object:)` - function, and cannot be added, removed or queried. - When created, asymmetric objects will be synced unidirectionally to the MongoDB - database and cannot be accessed locally. - - Incoming links from any asymmetric table are not allowed, meaning embedding - an asymmetric object within an `Object` will throw an error. - - The property types supported on `AsymmetricObject` are the same as for `Object`, - except for that asymmetric objects can only link to embedded objects, so `Object` - and `List` properties are not supported (`EmbeddedObject` and - `List` *are*). - - ```swift - class Person: AsymmetricObject { - @Persisted(primaryKey: true) var _id: ObjectId = ObjectId.generate() - @Persisted var name: String - @Persisted var age: Int - } - ``` - */ -@interface RealmSwiftAsymmetricObject : RLMObjectBase -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMSwiftProperty.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMSwiftProperty.h deleted file mode 100644 index ea071927c..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMSwiftProperty.h +++ /dev/null @@ -1,71 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -@class RLMObjectBase, RLMArray, RLMSet; - -#ifdef __cplusplus -extern "C" { -#endif - -RLM_HEADER_AUDIT_BEGIN(nullability) - -#define REALM_FOR_EACH_SWIFT_PRIMITIVE_TYPE(macro) \ - macro(bool, Bool, bool) \ - macro(double, Double, double) \ - macro(float, Float, float) \ - macro(int64_t, Int64, int) - -#define REALM_FOR_EACH_SWIFT_OBJECT_TYPE(macro) \ - macro(NSString, String, string) \ - macro(NSDate, Date, date) \ - macro(NSData, Data, data) \ - macro(NSUUID, UUID, uuid) \ - macro(RLMDecimal128, Decimal128, decimal128) \ - macro(RLMObjectId, ObjectId, objectId) - -#define REALM_SWIFT_PROPERTY_ACCESSOR(objc, swift, rlmtype) \ - objc RLMGetSwiftProperty##swift(RLMObjectBase *, uint16_t); \ - objc RLMGetSwiftProperty##swift##Optional(RLMObjectBase *, uint16_t, bool *); \ - void RLMSetSwiftProperty##swift(RLMObjectBase *, uint16_t, objc); -REALM_FOR_EACH_SWIFT_PRIMITIVE_TYPE(REALM_SWIFT_PROPERTY_ACCESSOR) -#undef REALM_SWIFT_PROPERTY_ACCESSOR - -#define REALM_SWIFT_PROPERTY_ACCESSOR(objc, swift, rlmtype) \ - objc *_Nullable RLMGetSwiftProperty##swift(RLMObjectBase *, uint16_t); \ - void RLMSetSwiftProperty##swift(RLMObjectBase *, uint16_t, objc *_Nullable); -REALM_FOR_EACH_SWIFT_OBJECT_TYPE(REALM_SWIFT_PROPERTY_ACCESSOR) -#undef REALM_SWIFT_PROPERTY_ACCESSOR - -id _Nullable RLMGetSwiftPropertyAny(RLMObjectBase *, uint16_t); -void RLMSetSwiftPropertyAny(RLMObjectBase *, uint16_t, id); -RLMObjectBase *_Nullable RLMGetSwiftPropertyObject(RLMObjectBase *, uint16_t); -void RLMSetSwiftPropertyNil(RLMObjectBase *, uint16_t); -void RLMSetSwiftPropertyObject(RLMObjectBase *, uint16_t, RLMObjectBase *_Nullable); - -RLMArray *_Nonnull RLMGetSwiftPropertyArray(RLMObjectBase *obj, uint16_t); -RLMSet *_Nonnull RLMGetSwiftPropertySet(RLMObjectBase *obj, uint16_t); -RLMDictionary *_Nonnull RLMGetSwiftPropertyMap(RLMObjectBase *obj, uint16_t); - -RLM_HEADER_AUDIT_END(nullability) - -#ifdef __cplusplus -} // extern "C" -#endif diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMSyncConfiguration.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMSyncConfiguration.h deleted file mode 100644 index 54ea2ecfc..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMSyncConfiguration.h +++ /dev/null @@ -1,196 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -@class RLMApp; -@class RLMRealm; -@class RLMRealmConfiguration; -@class RLMUser; -@protocol RLMBSON; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** Determines file behavior during a client reset. - - @see: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ -*/ -typedef NS_ENUM(NSUInteger, RLMClientResetMode) { - /// The local copy of the Realm is copied into a recovery - /// directory for safekeeping, and then deleted from the original location. The next time - /// the Realm for that partition value is opened, the Realm will automatically be re-downloaded from - /// Atlas App Services, and can be used as normal. - - /// Data written to the Realm after the local copy of the Realm diverged from the backup - /// remote copy will be present in the local recovery copy of the Realm file. The - /// re-downloaded Realm will initially contain only the data present at the time the Realm - /// was backed up on the server. - /// - /// @see: ``rlmSync_clientResetBackedUpRealmPath`` and ``RLMSyncErrorActionToken`` for more information on accessing the recovery directory and error information. - /// - /// The manual client reset mode handler can be set in two places: - /// 1. As an ErrorReportingBlock argument at ``RLMSyncConfiguration.manualClientResetHandler``. - /// 2. As an ErrorReportingBlock in the ``RLMSyncManager.errorHandler`` property. - /// @see: ``RLMSyncManager.errorHandler`` - /// - /// When an ``RLMSyncErrorClientResetError`` is thrown, the following rules determine which block is executed: - /// - If an error reporting block is set in ``.manualClientResetHandler`` and the ``RLMSyncManager.errorHandler``, the ``.manualClientResetHandler`` block will be executed. - /// - If an error reporting block is set in either the ``.manualClientResetHandler`` or the ``RLMSyncManager``, but not both, the single block will execute. - /// - If no block is set in either location, the client reset will not be handled. The application will likely need to be restarted and unsynced local changes may be lost. - /// @note: The ``RLMSyncManager.errorHandler`` is still invoked under all ``RLMSyncError``s *other than* ``RLMSyncErrorClientResetError``. - /// @see ``RLMSyncError`` for an exhaustive list. - RLMClientResetModeManual = 0, - /// All unsynchronized local changes are automatically discarded and the local state is - /// automatically reverted to the most recent state from the server. Unsynchronized changes - /// can then be recovered in the post-client-reset callback block. - /// - /// If ``RLMClientResetModeDiscardLocal`` is enabled but the client reset operation is unable to complete - /// then the client reset process reverts to manual mode. Example) During a destructive schema change this - /// mode will fail and invoke the manual client reset handler. - /// - /// The RLMClientResetModeDiscardLocal mode supports two client reset callbacks -- ``RLMClientResetBeforeBlock``, ``RLMClientResetAfterBlock`` -- which can be passed as arguments when creating the ``RLMSyncConfiguration``. - /// @see: ``RLMClientResetAfterBlock`` and ``RLMClientResetBeforeBlock`` - RLMClientResetModeDiscardLocal __deprecated_enum_msg("Use RLMClientResetModeDiscardUnsyncedChanges") = 1, - /// All unsynchronized local changes are automatically discarded and the local state is - /// automatically reverted to the most recent state from the server. Unsynchronized changes - /// can then be recovered in the post-client-reset callback block. - /// - /// If ``RLMClientResetModeDiscardUnsyncedChanges`` is enabled but the client reset operation is unable to complete - /// then the client reset process reverts to manual mode. Example) During a destructive schema change this - /// mode will fail and invoke the manual client reset handler. - /// - /// The RLMClientResetModeDiscardUnsyncedChanges mode supports two client reset callbacks -- ``RLMClientResetBeforeBlock``, ``RLMClientResetAfterBlock`` -- which can be passed as arguments when creating the ``RLMSyncConfiguration``. - /// @see: ``RLMClientResetAfterBlock`` and ``RLMClientResetBeforeBlock`` - RLMClientResetModeDiscardUnsyncedChanges = 1, - /// The client device will download a realm realm which reflects the latest - /// state of the server after a client reset. A recovery process is run locally in - /// an attempt to integrate the server version with any local changes from - /// before the client reset occurred. - /// - /// The changes are integrated with the following rules: - /// 1. Objects created locally that were not synced before client reset will be integrated. - /// 2. If an object has been deleted on the server, but was modified on the client, the delete takes precedence and the update is discarded - /// 3. If an object was deleted on the client, but not the server, then the client delete instruction is applied. - /// 4. In the case of conflicting updates to the same field, the client update is applied. - /// - /// If the recovery integration fails, the client reset process falls back to ``RLMClientResetModeManual``. - /// The recovery integration will fail if the "Client Recovery" setting is not enabled on the server. - /// Integration may also fail in the event of an incompatible schema change. - /// - /// The RLMClientResetModeRecoverUnsyncedChanges mode supports two client reset callbacks -- ``RLMClientResetBeforeBlock``, ``RLMClientResetAfterBlock`` -- which can be passed as arguments when creating the ``RLMSyncConfiguration``. - /// @see: ``RLMClientResetAfterBlock`` and ``RLMClientResetBeforeBlock`` - RLMClientResetModeRecoverUnsyncedChanges = 2, - /// The client device will download a realm with objects reflecting the latest version of the server. A recovery - /// process is run locally in an attempt to integrate the server version with any local changes from before the - /// client reset occurred. - /// - /// The changes are integrated with the following rules: - /// 1. Objects created locally that were not synced before client reset will be integrated. - /// 2. If an object has been deleted on the server, but was modified on the client, the delete takes precedence and the update is discarded - /// 3. If an object was deleted on the client, but not the server, then the client delete instruction is applied. - /// 4. In the case of conflicting updates to the same field, the client update is applied. - /// - /// If the recovery integration fails, the client reset process falls back to ``RLMClientResetModeDiscardUnsyncedChanges``. - /// The recovery integration will fail if the "Client Recovery" setting is not enabled on the server. - /// Integration may also fail in the event of an incompatible schema change. - /// - /// The RLMClientResetModeRecoverOrDiscardUnsyncedChanges mode supports two client reset callbacks -- ``RLMClientResetBeforeBlock``, ``RLMClientResetAfterBlock`` -- which can be passed as arguments when creating the ``RLMSyncConfiguration``. - /// @see: ``RLMClientResetAfterBlock`` and ``RLMClientResetBeforeBlock`` - RLMClientResetModeRecoverOrDiscardUnsyncedChanges = 3 -}; - -/** - A block type used to report before a client reset will occur. - The `beforeFrozen` is a frozen copy of the local state prior to client reset. - */ -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMClientResetBeforeBlock)(RLMRealm * _Nonnull beforeFrozen); - -/** - A block type used to report after a client reset occurred. - The `beforeFrozen` argument is a frozen copy of the local state prior to client reset. - The `after` argument contains the local database state after the client reset occurred. - */ -RLM_SWIFT_SENDABLE // invoked on a backgroun thread -typedef void(^RLMClientResetAfterBlock)(RLMRealm * _Nonnull beforeFrozen, RLMRealm * _Nonnull after); - -/** - A configuration object representing configuration state for a Realm which is intended to sync with a Realm Object - Server. - */ -@interface RLMSyncConfiguration : NSObject - -/// The user to which the remote Realm belongs. -@property (nonatomic, readonly) RLMUser *user; - -/** - The value this Realm is partitioned on. The partition key is a property defined in - Atlas App Services. All classes with a property with this value will be synchronized to the - Realm. - */ -@property (nonatomic, readonly) id partitionValue; - -/** - An enum which determines file recovery behavior in the event of a client reset. - @note: Defaults to `RLMClientResetModeRecoverUnsyncedChanges` - - @see: `RLMClientResetMode` - @see: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ -*/ -@property (nonatomic) RLMClientResetMode clientResetMode; - -/** - A callback which notifies prior to prior to a client reset occurring. - @see: `RLMClientResetBeforeBlock` - */ -@property (nonatomic, nullable) RLMClientResetBeforeBlock beforeClientReset; - -/** - A callback which notifies after a client reset has occurred. - @see: `RLMClientResetAfterBlock` - */ -@property (nonatomic, nullable) RLMClientResetAfterBlock afterClientReset; - -/** - A callback that's executed when an `RLMSyncErrorClientResetError` is encountered. - @See RLMSyncErrorReportingBlock and RLMSyncErrorClientResetError for more - details on handling a client reset manually. - */ -@property (nonatomic, nullable) RLMSyncErrorReportingBlock manualClientResetHandler; - - -/** - Whether nonfatal connection errors should cancel async opens. - - By default, if a nonfatal connection error such as a connection timing out occurs, any currently pending asyncOpen operations will ignore the error and continue to retry until it succeeds. If this is set to true, the open will instead fail and report the error. - - NEXT-MAJOR: This should be true by default. - */ -@property (nonatomic) bool cancelAsyncOpenOnNonFatalErrors; - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("This type cannot be created directly"))); - -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("This type cannot be created directly"))); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMSyncManager.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMSyncManager.h deleted file mode 100644 index 1dee453d0..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMSyncManager.h +++ /dev/null @@ -1,223 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMSyncSession, RLMSyncTimeoutOptions, RLMAppConfiguration; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -// NEXT-MAJOR: This enum needs to be removed when access to the logger is removed -// from the sync manager. -/// An enum representing different levels of sync-related logging that can be configured. -typedef RLM_CLOSED_ENUM(NSUInteger, RLMSyncLogLevel) { - /// Nothing will ever be logged. - RLMSyncLogLevelOff, - /// Only fatal errors will be logged. - RLMSyncLogLevelFatal, - /// Only errors will be logged. - RLMSyncLogLevelError, - /// Warnings and errors will be logged. - RLMSyncLogLevelWarn, - /// Information about sync events will be logged. Fewer events will be logged in order to avoid overhead. - RLMSyncLogLevelInfo, - /// Information about sync events will be logged. More events will be logged than with `RLMSyncLogLevelInfo`. - RLMSyncLogLevelDetail, - /// Log information that can aid in debugging. - /// - /// - warning: Will incur a measurable performance impact. - RLMSyncLogLevelDebug, - /// Log information that can aid in debugging. More events will be logged than with `RLMSyncLogLevelDebug`. - /// - /// - warning: Will incur a measurable performance impact. - RLMSyncLogLevelTrace, - /// Log information that can aid in debugging. More events will be logged than with `RLMSyncLogLevelTrace`. - /// - /// - warning: Will incur a measurable performance impact. - RLMSyncLogLevelAll -}; - -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" -/// A log callback function which can be set on RLMSyncManager. -/// -/// The log function may be called from multiple threads simultaneously, and is -/// responsible for performing its own synchronization if any is required. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void (^RLMSyncLogFunction)(RLMSyncLogLevel level, NSString *message); -#pragma clang diagnostic pop - -/// A block type representing a block which can be used to report a sync-related error to the application. If the error -/// pertains to a specific session, that session will also be passed into the block. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMSyncErrorReportingBlock)(NSError *, RLMSyncSession * _Nullable); - -/** - A manager which serves as a central point for sync-related configuration. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMSyncManager : NSObject - -/** - A block which can optionally be set to report sync-related errors to your application. - - Any error reported through this block will be of the `RLMSyncError` type, and marked - with the `RLMSyncErrorDomain` domain. - - Errors reported through this mechanism are fatal, with several exceptions. Please consult - `RLMSyncError` for information about the types of errors that can be reported through - the block, and for for suggestions on handling recoverable error codes. - - @see `RLMSyncError` - */ -@property (nullable, atomic, copy) RLMSyncErrorReportingBlock errorHandler; - -/// :nodoc: -@property (nonatomic, copy) NSString *appID -__attribute__((deprecated("This property is not used for anything"))); - -/** - A string identifying this application which is included in the User-Agent - header of sync connections. By default, this will be the application's bundle - identifier. - - This property must be set prior to opening a synchronized Realm for the first - time. Any modifications made after opening a Realm will be ignored. - */ -@property (atomic, copy) NSString *userAgent; - -/** - The logging threshold which newly opened synced Realms will use. Defaults to - `RLMSyncLogLevelInfo`. - - By default logging strings are output to Apple System Logger. Set `logger` to - perform custom logging logic instead. - - @warning This property must be set before any synced Realms are opened. Setting it after - opening any synced Realm will do nothing. - */ -@property (atomic) RLMSyncLogLevel logLevel -__attribute__((deprecated("Use `RLMLogger.default.level`/`Logger.shared.level` to set/get the default logger threshold level."))); - -/** - The function which will be invoked whenever the sync client has a log message. - - If nil, log strings are output to Apple System Logger instead. - - @warning This property must be set before any synced Realms are opened. Setting - it after opening any synced Realm will do nothing. - */ -@property (atomic, nullable) RLMSyncLogFunction logger -__attribute__((deprecated("Use `RLMLogger.default`/`Logger.shared` to set/get the default logger."))); - -/** - The name of the HTTP header to send authorization data in when making requests to Atlas App Services which has - been configured to expect a custom authorization header. - */ -@property (nullable, atomic, copy) NSString *authorizationHeaderName; - -/** - Extra HTTP headers to append to every request to Atlas App Services. - - Modifying this property while sync sessions are active will result in all - sessions disconnecting and reconnecting using the new headers. - */ -@property (nullable, atomic, copy) NSDictionary *customRequestHeaders; - -/** - Options for the assorted types of connection timeouts for sync connections. - - If nil default values for all timeouts are used instead. - - @warning This property must be set before any synced Realms are opened. Setting - it after opening any synced Realm will do nothing. - */ -@property (nullable, atomic, copy) RLMSyncTimeoutOptions *timeoutOptions; - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("RLMSyncManager cannot be created directly"))); - -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("RLMSyncManager cannot be created directly"))); - -@end - -/** - Options for configuring timeouts and intervals in the sync client. - */ -@interface RLMSyncTimeoutOptions : NSObject -/// The maximum number of milliseconds to allow for a connection to -/// become fully established. This includes the time to resolve the -/// network address, the TCP connect operation, the SSL handshake, and -/// the WebSocket handshake. -/// -/// Defaults to 2 minutes. -@property (nonatomic) NSUInteger connectTimeout; - -/// The number of milliseconds to keep a connection open after all -/// sessions have been abandoned. -/// -/// After all synchronized Realms have been closed for a given server, the -/// connection is kept open until the linger time has expired to avoid the -/// overhead of reestablishing the connection when Realms are being closed and -/// reopened. -/// -/// Defaults to 30 seconds. -@property (nonatomic) NSUInteger connectionLingerTime; - -/// The number of milliseconds between each heartbeat ping message. -/// -/// The client periodically sends ping messages to the server to check if the -/// connection is still alive. Shorter periods make connection state change -/// notifications more responsive at the cost of battery life (as the antenna -/// will have to wake up more often). -/// -/// Defaults to 1 minute. -@property (nonatomic) NSUInteger pingKeepalivePeriod; - -/// How long in milliseconds to wait for a reponse to a heartbeat ping before -/// concluding that the connection has dropped. -/// -/// Shorter values will make connection state change notifications more -/// responsive as it will only change to `disconnected` after this much time has -/// elapsed, but overly short values may result in spurious disconnection -/// notifications when the server is simply taking a long time to respond. -/// -/// Defaults to 2 minutes. -@property (nonatomic) NSUInteger pongKeepaliveTimeout; - -/// The maximum amount of time, in milliseconds, since the loss of a -/// prior connection, for a new connection to be considered a "fast -/// reconnect". -/// -/// When a client first connects to the server, it defers uploading any local -/// changes until it has downloaded all changesets from the server. This -/// typically reduces the total amount of merging that has to be done, and is -/// particularly beneficial the first time that a specific client ever connects -/// to the server. -/// -/// When an existing client disconnects and then reconnects within the "fact -/// reconnect" time this is skipped and any local changes are uploaded -/// immediately without waiting for downloads, just as if the client was online -/// the whole time. -/// -/// Defaults to 1 minute. -@property (nonatomic) NSUInteger fastReconnectLimit; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMSyncSession.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMSyncSession.h deleted file mode 100644 index 31677ce9c..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMSyncSession.h +++ /dev/null @@ -1,234 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -/** - The current state of the session represented by a session object. - */ -typedef NS_ENUM(NSUInteger, RLMSyncSessionState) { - /// The sync session is actively communicating or attempting to communicate - /// with Atlas App Services. A session is considered Active even if - /// it is not currently connected. Check the connection state instead if you - /// wish to know if the connection is currently online. - RLMSyncSessionStateActive, - /// The sync session is not attempting to communicate with MongoDB - /// Realm due to the user logging out or synchronization being paused. - RLMSyncSessionStateInactive, - /// The sync session encountered a fatal error and is permanently invalid; it should be discarded. - RLMSyncSessionStateInvalid -}; - -/** - The current state of a sync session's connection. Sessions which are not in - the Active state will always be Disconnected. - */ -typedef NS_ENUM(NSUInteger, RLMSyncConnectionState) { - /// The sync session is not connected to the server, and is not attempting - /// to connect, either because the session is inactive or because it is - /// waiting to retry after a failed connection. - RLMSyncConnectionStateDisconnected, - /// The sync session is attempting to connect to Atlas App Services. - RLMSyncConnectionStateConnecting, - /// The sync session is currently connected to Atlas App Services. - RLMSyncConnectionStateConnected, -}; - -/** - The transfer direction (upload or download) tracked by a given progress notification block. - - Progress notification blocks can be registered on sessions if your app wishes to be informed - how many bytes have been uploaded or downloaded, for example to show progress indicator UIs. - */ -typedef RLM_CLOSED_ENUM(NSUInteger, RLMSyncProgressDirection) { - /// For monitoring upload progress. - RLMSyncProgressDirectionUpload, - /// For monitoring download progress. - RLMSyncProgressDirectionDownload, -}; - -/** - The desired behavior of a progress notification block. - - Progress notification blocks can be registered on sessions if your app wishes to be informed - how many bytes have been uploaded or downloaded, for example to show progress indicator UIs. - */ -typedef NS_ENUM(NSUInteger, RLMSyncProgressMode) { - /** - The block will be called indefinitely, or until it is unregistered by calling - `-[RLMProgressNotificationToken invalidate]`. - - Notifications will always report the latest number of transferred bytes, and the - most up-to-date number of total transferrable bytes. - */ - RLMSyncProgressModeReportIndefinitely, - /** - The block will, upon registration, store the total number of bytes - to be transferred. When invoked, it will always report the most up-to-date number - of transferrable bytes out of that original number of transferrable bytes. - - When the number of transferred bytes reaches or exceeds the - number of transferrable bytes, the block will be unregistered. - */ - RLMSyncProgressModeForCurrentlyOutstandingWork, -}; - -@class RLMUser, RLMSyncConfiguration, RLMSyncErrorActionToken, RLMSyncManager; - -/** - The type of a progress notification block intended for reporting a session's network - activity to the user. - - `transferredBytes` refers to the number of bytes that have been uploaded or downloaded. - `transferrableBytes` refers to the total number of bytes transferred, and pending transfer. - */ -typedef void(^RLMProgressNotificationBlock)(NSUInteger transferredBytes, NSUInteger transferrableBytes); - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A token object corresponding to a progress notification block on a session object. - - To stop notifications manually, call `-invalidate` on it. Notifications should be stopped before - the token goes out of scope or is destroyed. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMProgressNotificationToken : RLMNotificationToken -@end - -/** - An object encapsulating an Atlas App Services "session". Sessions represent the - communication between the client (and a local Realm file on disk), and the server - (and a remote Realm with a given partition value stored on Atlas App Services). - - Sessions are always created by the SDK and vended out through various APIs. The - lifespans of sessions associated with Realms are managed automatically. Session - objects can be accessed from any thread. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMSyncSession : NSObject - -/// The session's current state. -/// -/// This property is not KVO-compliant. -@property (nonatomic, readonly) RLMSyncSessionState state; - -/// The session's current connection state. -/// -/// This property is KVO-compliant and can be observed to be notified of changes. -/// Be warned that KVO observers for this property may be called on a background -/// thread. -@property (atomic, readonly) RLMSyncConnectionState connectionState; - -/// The user that owns this session. -- (nullable RLMUser *)parentUser; - -/** - If the session is valid, return a sync configuration that can be used to open the Realm - associated with this session. - */ -- (nullable RLMSyncConfiguration *)configuration; - -/** - Temporarily suspend syncronization and disconnect from the server. - - The session will not attempt to connect to Atlas App Services until `resume` - is called or the Realm file is closed and re-opened. - */ -- (void)suspend; - -/** - Resume syncronization and reconnect to Atlas App Services after suspending. - - This is a no-op if the session was already active or if the session is invalid. - Newly created sessions begin in the Active state and do not need to be resumed. - */ -- (void)resume; - -/** - Register a progress notification block. - - Multiple blocks can be registered with the same session at once. Each block - will be invoked on a side queue devoted to progress notifications. - - If the session has already received progress information from the - synchronization subsystem, the block will be called immediately. Otherwise, it - will be called as soon as progress information becomes available. - - The token returned by this method must be retained as long as progress - notifications are desired, and the `-invalidate` method should be called on it - when notifications are no longer needed and before the token is destroyed. - - If no token is returned, the notification block will never be called again. - There are a number of reasons this might be true. If the session has previously - experienced a fatal error it will not accept progress notification blocks. If - the block was configured in the `RLMSyncProgressForCurrentlyOutstandingWork` - mode but there is no additional progress to report (for example, the number - of transferrable bytes and transferred bytes are equal), the block will not be - called again. - - @param direction The transfer direction (upload or download) to track in this progress notification block. - @param mode The desired behavior of this progress notification block. - @param block The block to invoke when notifications are available. - - @return A token which must be held for as long as you want notifications to be delivered. - - @see `RLMSyncProgressDirection`, `RLMSyncProgress`, `RLMProgressNotificationBlock`, `RLMProgressNotificationToken` - */ -- (nullable RLMProgressNotificationToken *)addProgressNotificationForDirection:(RLMSyncProgressDirection)direction - mode:(RLMSyncProgressMode)mode - block:(RLMProgressNotificationBlock)block -NS_REFINED_FOR_SWIFT; - -/** - Given an error action token, immediately handle the corresponding action. - - @see `RLMSyncErrorClientResetError`, `RLMSyncErrorPermissionDeniedError` - */ -+ (void)immediatelyHandleError:(RLMSyncErrorActionToken *)token syncManager:(RLMSyncManager *)syncManager; - -/** - Get the sync session for the given Realm if it is a synchronized Realm, or `nil` - if it is not. - */ -+ (nullable RLMSyncSession *)sessionForRealm:(RLMRealm *)realm; - -@end - -// MARK: - Error action token - -#pragma mark - Error action token - -/** - An opaque token returned as part of certain errors. It can be - passed into certain APIs to perform certain actions. - - @see `RLMSyncErrorClientResetError`, `RLMSyncErrorPermissionDeniedError` - */ -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMSyncErrorActionToken : NSObject - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("This type cannot be created directly"))); - -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("This type cannot be created directly"))); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMSyncSubscription.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMSyncSubscription.h deleted file mode 100644 index d35be19d0..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMSyncSubscription.h +++ /dev/null @@ -1,346 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectId; - -#pragma mark - Subscription States - -/// The current state of the subscription. This can be used for ensuring that -/// the subscriptions are not errored and that it has been successfully -/// synced to the server. -typedef NS_ENUM(NSUInteger, RLMSyncSubscriptionState) { - /// The subscription is complete and the server has sent all the data that matched the subscription - /// queries at the time the subscription set was updated. The server is now in a steady-state - /// synchronization mode where it will stream update as they come. - RLMSyncSubscriptionStateComplete, - /// The subscription encountered an error and synchronization is paused for this Realm. You can - /// find the error calling error in the subscription set to get a description of the error. You can - /// still use the current subscription set to write a subscription. - RLMSyncSubscriptionStateError, - /// The subscription is persisted locally but not yet processed by the server, which means - /// the server hasn't yet returned all the data that matched the updated subscription queries. - RLMSyncSubscriptionStatePending, - /// The subscription set has been super-ceded by an updated one, this typically means that - /// someone is trying to write a subscription on a different instance of the subscription set. - /// You should not use a superseded subscription set and instead obtain a new instance of - /// the subscription set to write a subscription. - RLMSyncSubscriptionStateSuperseded -}; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - `RLMSyncSubscription` is used to define a Flexible Sync subscription obtained from querying a - subscription set, which can be used to read or remove/update a committed subscription. - */ -@interface RLMSyncSubscription : NSObject - -/// Name of the subscription. If not specified it will return nil. -@property (nonatomic, readonly, nullable) NSString *name; - -/// When the subscription was created. Recorded automatically. -@property (nonatomic, readonly) NSDate *createdAt; - -/// When the subscription was last updated. Recorded automatically. -@property (nonatomic, readonly) NSDate *updatedAt; - -/** - Updates a Flexible Sync's subscription query with an allowed query which will be used to bootstrap data - from the server when committed. - - @warning This method may only be called during a write subscription block. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - */ -- (void)updateSubscriptionWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (void)updateSubscriptionWhere:(NSString *)predicateFormat - args:(va_list)args; - -/** - Updates a Flexible Sync's subscription query with an allowed query which will be used to bootstrap data - from the server when committed. - - @warning This method may only be called during a write subscription block. - - @param predicate The predicate with which to filter the objects on the server. - */ -- (void)updateSubscriptionWithPredicate:(NSPredicate *)predicate; - -@end - -/** - `RLMSyncSubscriptionSet` is a collection of `RLMSyncSubscription`s. This is the entry point - for adding and removing `RLMSyncSubscription`s. - */ -@interface RLMSyncSubscriptionSet : NSObject - -/// The number of subscriptions in the subscription set. -@property (readonly) NSUInteger count; - -/// Gets the error associated to the subscription set. This will be non-nil in case the current -/// state of the subscription set is `RLMSyncSubscriptionStateError`. -@property (nonatomic, readonly, nullable) NSError *error; - -/// Gets the state associated to the subscription set. -@property (nonatomic, readonly) RLMSyncSubscriptionState state; - -#pragma mark - Batch Update subscriptions - -/** - Synchronously performs any transactions (add/remove/update) to the subscription set within the block, - this will not wait for the server to acknowledge and see all the data associated with this collection of subscriptions, - and will return after committing the subscription transactions. - - @param block The block containing actions to perform to the subscription set. - */ -- (void)update:(__attribute__((noescape)) void(^)(void))block; -/// :nodoc: -- (void)write:(__attribute__((noescape)) void(^)(void))block __attribute__((unavailable("Renamed to -update"))); - -/** - Synchronously performs any transactions (add/remove/update) to the subscription set within the block, - this will not wait for the server to acknowledge and see all the data associated with this collection of subscriptions, - and will return after committing the subscription transactions. - - @param block The block containing actions to perform to the subscription set. - @param onComplete A block which is called upon synchronization of - subscriptions to the server. The block will be passed `nil` - if the update succeeded, and an error describing the problem - otherwise. - */ -- (void)update:(__attribute__((noescape)) void(^)(void))block - onComplete:(nullable void(^RLM_SWIFT_SENDABLE)(NSError *_Nullable))onComplete - __attribute__((swift_async(not_swift_private, 2))) - __attribute__((swift_attr("@_unsafeInheritExecutor"))); -/// :nodoc: -- (void)write:(__attribute__((noescape)) void(^)(void))block - onComplete:(void(^)(NSError * _Nullable))onComplete __attribute__((unavailable("Renamed to -update:onComplete."))); - -#pragma mark - Find subscription - -/** - Finds a subscription by the specified name. - - @param name The name used to identify the subscription. - - @return A subscription for the given name. - */ -- (nullable RLMSyncSubscription *)subscriptionWithName:(NSString *)name; - -/** - Finds a subscription by the query for the specified object class name. - - @param objectClassName The class name for the model class to be queried. - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return A subscription for the given query.. - */ -- (nullable RLMSyncSubscription *)subscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (nullable RLMSyncSubscription *)subscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat - args:(va_list)args; - -/** - Finds a subscription by the query for the specified object class name. - - @param objectClassName The class name for the model class to be queried. - @param predicate The predicate used to to filter the objects on the server. - - @return A subscription for the given query.. - */ -- (nullable RLMSyncSubscription *)subscriptionWithClassName:(NSString *)objectClassName - predicate:(NSPredicate *)predicate; - -#pragma mark - Add a Subscription - -/** - Adds a new subscription to the subscription set which will be sent to the server when - committed at the end of a write subscription block. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - */ -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat - args:(va_list)args; - -/** - Adds a new subscription to the subscription set which will be sent to the server when - committed at the end of a write subscription block. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param name The name used the identify the subscription. - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - */ -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - subscriptionName:(NSString *)name - where:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - subscriptionName:(NSString *)name - where:(NSString *)predicateFormat - args:(va_list)args; - -/** - Adds a new subscription to the subscription set which will be sent to the server when - committed at the end of a write subscription block. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param predicate The predicate defining the query for the subscription. - */ -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - predicate:(NSPredicate *)predicate; - -/** - Adds a new subscription to the subscription set which will be sent to the server when - committed at the end of a write subscription block. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param name The name used to identify the subscription. - @param predicate The predicate defining the query for the subscription. - */ -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - subscriptionName:(nullable NSString *)name - predicate:(NSPredicate *)predicate; - -#pragma mark - Remove Subscription - -/** - Removes a subscription with the specified name from the subscription set. - - @warning This method may only be called during a write subscription block. - - @param name The name used the identify the subscription. - */ -- (void)removeSubscriptionWithName:(NSString *)name; - -/** - Removes a subscription with the specified query for the object class from the subscription set. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - */ -- (void)removeSubscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (void)removeSubscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat - args:(va_list)args; - -/** - Removes a subscription with the specified query for the object class from the subscription set. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param predicate The predicate which will be used to identify the subscription to be removed. - */ -- (void)removeSubscriptionWithClassName:(NSString *)objectClassName - predicate:(NSPredicate *)predicate; - -/** - Removes the subscription from the subscription set. - - @warning This method may only be called during a write subscription block. - - @param subscription An instance of the subscription to be removed. - */ -- (void)removeSubscription:(RLMSyncSubscription *)subscription; - -#pragma mark - Remove Subscriptions - -/** - Removes all subscription from the subscription set. - - @warning This method may only be called during a write subscription block. - @warning Removing all subscriptions will result in an error if no new subscription is added. Server should - acknowledge at least one subscription. - */ -- (void)removeAllSubscriptions; - -/** - Removes all subscription with the specified class name. - - @param className The class name for the model class to be queried. - - @warning This method may only be called during a write subscription block. - */ -- (void)removeAllSubscriptionsWithClassName:(NSString *)className; - -#pragma mark - SubscriptionSet Collection - -/** - Returns the subscription at the given `index`. - - @param index The index. - - @return A subscription for the given index in the subscription set. - */ -- (nullable RLMSyncSubscription *)objectAtIndex:(NSUInteger)index; - -/** - Returns the first object in the subscription set list, or `nil` if the subscriptions are empty. - - @return A subscription. - */ -- (nullable RLMSyncSubscription *)firstObject; - -/** - Returns the last object in the subscription set, or `nil` if the subscriptions are empty. - - @return A subscription. - */ -- (nullable RLMSyncSubscription *)lastObject; - -#pragma mark - Subscript - -/** - Returns the subscription at the given `index`. - - @param index The index. - - @return A subscription for the given index in the subscription set. - */ -- (id)objectAtIndexedSubscript:(NSUInteger)index; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMThreadSafeReference.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMThreadSafeReference.h deleted file mode 100644 index 9472942ed..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMThreadSafeReference.h +++ /dev/null @@ -1,107 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMRealm; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - Objects of types which conform to `RLMThreadConfined` can be managed by a Realm, which will make - them bound to a thread-specific `RLMRealm` instance. Managed objects must be explicitly exported - and imported to be passed between threads. - - Managed instances of objects conforming to this protocol can be converted to a thread-safe - reference for transport between threads by passing to the - `+[RLMThreadSafeReference referenceWithThreadConfined:]` constructor. - - Note that only types defined by Realm can meaningfully conform to this protocol, and defining new - classes which attempt to conform to it will not make them work with `RLMThreadSafeReference`. - */ -@protocol RLMThreadConfined -// Conformance to the `RLMThreadConfined_Private` protocol will be enforced at runtime. - -/** - The Realm which manages the object, or `nil` if the object is unmanaged. - - Unmanaged objects are not confined to a thread and cannot be passed to methods expecting a - `RLMThreadConfined` object. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/// Indicates if the object can no longer be accessed because it is now invalid. -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -@end - -/** - An object intended to be passed between threads containing a thread-safe reference to its - thread-confined object. - - To resolve a thread-safe reference on a target Realm on a different thread, pass to - `-[RLMRealm resolveThreadSafeReference:]`. - - @warning A `RLMThreadSafeReference` object must be resolved at most once. - Failing to resolve a `RLMThreadSafeReference` will result in the source version of the - Realm being pinned until the reference is deallocated. - - @note Prefer short-lived `RLMThreadSafeReference`s as the data for the version of the source Realm - will be retained until all references have been resolved or deallocated. - - @see `RLMThreadConfined` - @see `-[RLMRealm resolveThreadSafeReference:]` - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMThreadSafeReference<__covariant Confined : id> : NSObject - -/** - Create a thread-safe reference to the thread-confined object. - - @param threadConfined The thread-confined object to create a thread-safe reference to. - - @note You may continue to use and access the thread-confined object after passing it to this - constructor. - */ -+ (instancetype)referenceWithThreadConfined:(Confined)threadConfined; - -/** - Indicates if the reference can no longer be resolved because an attempt to resolve it has already - occurred. References can only be resolved once. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -#pragma mark - Unavailable Methods - -/** - `-[RLMThreadSafeReference init]` is not available because `RLMThreadSafeReference` cannot be - created directly. `RLMThreadSafeReference` instances must be obtained by calling - `-[RLMRealm resolveThreadSafeReference:]`. - */ -- (instancetype)init __attribute__((unavailable("RLMThreadSafeReference cannot be created directly"))); - -/** - `-[RLMThreadSafeReference new]` is not available because `RLMThreadSafeReference` cannot be - created directly. `RLMThreadSafeReference` instances must be obtained by calling - `-[RLMRealm resolveThreadSafeReference:]`. - */ -+ (instancetype)new __attribute__((unavailable("RLMThreadSafeReference cannot be created directly"))); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMUpdateResult.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMUpdateResult.h deleted file mode 100644 index df0b237e3..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMUpdateResult.h +++ /dev/null @@ -1,45 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectId; -@protocol RLMBSON; - -/// The result of an `updateOne` or `updateMany` operation a `RLMMongoCollection`. -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMUpdateResult : NSObject - -/// The number of documents that matched the filter. -@property (nonatomic, readonly) NSUInteger matchedCount; - -/// The number of documents modified. -@property (nonatomic, readonly) NSUInteger modifiedCount; - -/// The identifier of the inserted document if an upsert took place and the document's primary key is an `ObjectId`. -@property (nonatomic, nullable, readonly) RLMObjectId *objectId -__attribute__((deprecated("Use documentId instead, which support all BSON types", "documentId"))); - -/// The identifier of the inserted document if an upsert took place. -@property (nonatomic, nullable, readonly) id documentId; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMUser.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMUser.h deleted file mode 100644 index 436350f9b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMUser.h +++ /dev/null @@ -1,447 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import -#import -#import - -@class RLMUser, RLMSyncSession, RLMRealm, RLMUserIdentity, RLMAPIKeyAuth, RLMMongoClient, RLMMongoDatabase, RLMMongoCollection, RLMUserProfile; -@protocol RLMBSON; - -/** - The state of the user object. - */ -typedef NS_ENUM(NSUInteger, RLMUserState) { - /// The user is logged out. Call `logInWithCredentials:...` with valid credentials to log the user back in. - RLMUserStateLoggedOut, - /// The user is logged in, and any Realms associated with it are syncing with Atlas App Services. - RLMUserStateLoggedIn, - /// The user has been removed, and cannot be used. - RLMUserStateRemoved -}; - -/// A block type used to report an error related to a specific user. -RLM_SWIFT_SENDABLE -typedef void(^RLMOptionalUserBlock)(RLMUser * _Nullable, NSError * _Nullable); - -/// A block type used to report an error on a network request from the user. -RLM_SWIFT_SENDABLE -typedef void(^RLMUserOptionalErrorBlock)(NSError * _Nullable); - -/// A block which returns a dictionary should there be any custom data set for a user -RLM_SWIFT_SENDABLE -typedef void(^RLMUserCustomDataBlock)(NSDictionary * _Nullable, NSError * _Nullable); - -/// A block type for returning from function calls. -RLM_SWIFT_SENDABLE -typedef void(^RLMCallFunctionCompletionBlock)(id _Nullable, NSError * _Nullable); - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A `RLMUser` instance represents a single Realm App user account. - - A user may have one or more credentials associated with it. These credentials - uniquely identify the user to the authentication provider, and are used to sign - into an Atlas App Services user account. - - Note that user objects are only vended out via SDK APIs, and cannot be directly - initialized. User objects can be accessed from any thread. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // internally thread-safe -@interface RLMUser : NSObject - -/** - The unique Atlas App Services string identifying this user. - Note this is different from an identity: A user may have multiple identities but has a single identifier. See RLMUserIdentity. - */ -@property (nonatomic, readonly) NSString *identifier NS_SWIFT_NAME(id); - -/// Returns an array of identities currently linked to a user. -@property (nonatomic, readonly) NSArray *identities; - -/** - The user's refresh token used to access App Services. - - By default, refresh tokens expire 60 days after they are issued. - You can configure this time for your App's refresh tokens to be - anywhere between 30 minutes and 180 days. - - You can configure the refresh token expiration time for all sessions in - an App from the Admin UI or Admin API. -*/ -@property (nullable, nonatomic, readonly) NSString *refreshToken; - -/** - The user's access token used to access App Services. - - This is required to make HTTP requests to Atlas App Services like the Data API or GraphQL. - It should be treated as sensitive data. - - The Realm SDK automatically manages access tokens and refreshes them - when they expire. - */ -@property (nullable, nonatomic, readonly) NSString *accessToken; - -/** - The current state of the user. - */ -@property (nonatomic, readonly) RLMUserState state; - -/** - Indicates if the user is logged in or not. Returns true if the access token and refresh token are not empty. - */ -@property (nonatomic, readonly) BOOL isLoggedIn; - -#pragma mark - Lifecycle - -/** - Create a partition-based sync configuration instance for the given partition value. - - @param partitionValue The `RLMBSON` value the Realm is partitioned on. - @return A default configuration object with the sync configuration set to use the given partition value. - */ -- (RLMRealmConfiguration *)configurationWithPartitionValue:(nullable id)partitionValue NS_REFINED_FOR_SWIFT; - -/** - Create a partition-based sync configuration instance for the given partition value. - - @param partitionValue The `RLMBSON` value the Realm is partitioned on. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - - @return A configuration object with the sync configuration set to use the given partition value. - */ -- (RLMRealmConfiguration *)configurationWithPartitionValue:(nullable id)partitionValue - clientResetMode:(RLMClientResetMode)clientResetMode NS_REFINED_FOR_SWIFT; - -/** - Create a partition-based sync configuration instance for the given partition value. - - @param partitionValue The `RLMBSON` value the Realm is partitioned on. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param beforeResetBlock A callback which notifies prior to a client reset occurring. See: `RLMClientResetBeforeBlock` - @param afterResetBlock A callback which notifies after a client reset has occurred. See: `RLMClientResetAfterBlock` - - @return A configuration object with the sync configuration set to use the given partition value. - */ -- (RLMRealmConfiguration *)configurationWithPartitionValue:(nullable id)partitionValue - clientResetMode:(RLMClientResetMode)clientResetMode - notifyBeforeReset:(nullable RLMClientResetBeforeBlock)beforeResetBlock - notifyAfterReset:(nullable RLMClientResetAfterBlock)afterResetBlock NS_REFINED_FOR_SWIFT; - -/** - Create a partition-based sync configuration instance for the given partition value. - - @param partitionValue The `RLMBSON` value the Realm is partitioned on. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param manualClientResetHandler An error reporting block that is invoked during a client reset. - @See ``RLMSyncErrorReportingBlock`` and ``RLMClientResetInfo`` - - @return A configuration object with the sync configuration set to use the given partition value. - */ -- (RLMRealmConfiguration *)configurationWithPartitionValue:(nullable id)partitionValue - clientResetMode:(RLMClientResetMode)clientResetMode - manualClientResetHandler:(nullable RLMSyncErrorReportingBlock)manualClientResetHandler NS_REFINED_FOR_SWIFT; - -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @return A ``RLMRealmConfiguration`` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfiguration NS_REFINED_FOR_SWIFT; - -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param beforeResetBlock A callback which notifies prior to a client reset occurring. See: `RLMClientResetBeforeBlock` - @param afterResetBlock A callback which notifies after a client reset has occurred. See: `RLMClientResetAfterBlock` - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithClientResetMode:(RLMClientResetMode)clientResetMode - notifyBeforeReset:(nullable RLMClientResetBeforeBlock)beforeResetBlock - notifyAfterReset:(nullable RLMClientResetAfterBlock)afterResetBlock NS_REFINED_FOR_SWIFT; -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param manualClientResetHandler An error reporting block that is invoked during a client reset. - @See `RLMSyncErrorReportingBlock` and `RLMClientResetInfo` - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithClientResetMode:(RLMClientResetMode)clientResetMode - manualClientResetHandler:(nullable RLMSyncErrorReportingBlock)manualClientResetHandler NS_REFINED_FOR_SWIFT; - -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param initialSubscriptions A block which receives a subscription set instance, that can be - used to add an initial set of subscriptions which will be executed - when the Realm is first opened. - @param rerunOnOpen If true, allows to run the initial set of subscriptions specified, on every app startup. - This can be used to re-run dynamic time ranges and other queries that require a - re-computation of a static variable. - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithInitialSubscriptions:(RLMFlexibleSyncInitialSubscriptionsBlock)initialSubscriptions - rerunOnOpen:(BOOL)rerunOnOpen NS_REFINED_FOR_SWIFT; -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param initialSubscriptions A block which receives a subscription set instance, that can be - used to add an initial set of subscriptions which will be executed - when the Realm is first opened. - @param rerunOnOpen If true, allows to run the initial set of subscriptions specified, on every app startup. - This can be used to re-run dynamic time ranges and other queries that require a - re-computation of a static variable. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param beforeResetBlock A callback which notifies prior to a client reset occurring. See: `RLMClientResetBeforeBlock` - @param afterResetBlock A callback which notifies after a client reset has occurred. See: `RLMClientResetAfterBlock` - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithInitialSubscriptions:(RLMFlexibleSyncInitialSubscriptionsBlock)initialSubscriptions - rerunOnOpen:(BOOL)rerunOnOpen - clientResetMode:(RLMClientResetMode)clientResetMode - notifyBeforeReset:(nullable RLMClientResetBeforeBlock)beforeResetBlock - notifyAfterReset:(nullable RLMClientResetAfterBlock)afterResetBlock NS_REFINED_FOR_SWIFT; - -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param initialSubscriptions A block which receives a subscription set instance, that can be - used to add an initial set of subscriptions which will be executed - when the Realm is first opened. - @param rerunOnOpen If true, allows to run the initial set of subscriptions specified, on every app startup. - This can be used to re-run dynamic time ranges and other queries that require a - re-computation of a static variable. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param manualClientResetHandler An error reporting block that is invoked during a client reset. - @See `RLMSyncErrorReportingBlock` and `RLMClientResetInfo` - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithInitialSubscriptions:(RLMFlexibleSyncInitialSubscriptionsBlock)initialSubscriptions - rerunOnOpen:(BOOL)rerunOnOpen - clientResetMode:(RLMClientResetMode)clientResetMode - manualClientResetHandler:(nullable RLMSyncErrorReportingBlock)manualClientResetHandler NS_REFINED_FOR_SWIFT; - -#pragma mark - Sessions - -/** - Retrieve a valid session object belonging to this user for a given URL, or `nil` - if no such object exists. - */ -- (nullable RLMSyncSession *)sessionForPartitionValue:(id)partitionValue; - -/// Retrieve all the valid sessions belonging to this user. -@property (nonatomic, readonly) NSArray *allSessions; - -#pragma mark - Custom Data - -/** - The custom data of the user. - This is configured in your Atlas App Services app. - */ -@property (nonatomic, readonly) NSDictionary *customData NS_REFINED_FOR_SWIFT; - -/** - The profile of the user. - */ -@property (nonatomic, readonly) RLMUserProfile *profile; - -/** - Refresh a user's custom data. This will, in effect, refresh the user's auth session. - */ -- (void)refreshCustomDataWithCompletion:(RLMUserCustomDataBlock)completion; - -/** - Links the currently authenticated user with a new identity, where the identity is defined by the credential - specified as a parameter. This will only be successful if this `RLMUser` is the currently authenticated - with the client from which it was created. On success a new user will be returned with the new linked credentials. - - @param credentials The `RLMCredentials` used to link the user to a new identity. - @param completion The completion handler to call when the linking is complete. - If the operation is successful, the result will contain a new - `RLMUser` object representing the currently logged in user. -*/ -- (void)linkUserWithCredentials:(RLMCredentials *)credentials - completion:(RLMOptionalUserBlock)completion NS_REFINED_FOR_SWIFT; - -/** - Removes the user - - This logs out and destroys the session related to this user. The completion block will return an error - if the user is not found or is already removed. - - @param completion A callback invoked on completion -*/ -- (void)removeWithCompletion:(RLMUserOptionalErrorBlock)completion; - -/** - Permanently deletes this user from your Atlas App Services app. - - The users state will be set to `Removed` and the session will be destroyed. - If the delete request fails, the local authentication state will be untouched. - - @param completion A callback invoked on completion -*/ -- (void)deleteWithCompletion:(RLMUserOptionalErrorBlock)completion; - -/** - Logs out the current user - - The users state will be set to `Removed` is they are an anonymous user or `LoggedOut` if they are authenticated by an email / password or third party auth clients - If the logout request fails, this method will still clear local authentication state. - - @param completion A callback invoked on completion -*/ -- (void)logOutWithCompletion:(RLMUserOptionalErrorBlock)completion; - -/** - A client for the user API key authentication provider which - can be used to create and modify user API keys. - - This client should only be used by an authenticated user. -*/ -@property (nonatomic, readonly) RLMAPIKeyAuth *apiKeysAuth; - -/// A client for interacting with a remote MongoDB instance -/// @param serviceName The name of the MongoDB service -- (RLMMongoClient *)mongoClientWithServiceName:(NSString *)serviceName NS_REFINED_FOR_SWIFT; - -/** - Calls the Atlas App Services function with the provided name and arguments. - - @param name The name of the Atlas App Services function to be called. - @param arguments The `BSONArray` of arguments to be provided to the function. - @param completion The completion handler to call when the function call is complete. - This handler is executed on a non-main global `DispatchQueue`. -*/ -- (void)callFunctionNamed:(NSString *)name - arguments:(NSArray> *)arguments - completionBlock:(RLMCallFunctionCompletionBlock)completion NS_REFINED_FOR_SWIFT; - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("RLMUser cannot be created directly"))); -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("RLMUser cannot be created directly"))); - -@end - -#pragma mark - User info classes - -/** - An identity of a user. A user can have multiple identities, usually associated with multiple providers. - Note this is different from a user's unique identifier string. - @seeAlso `RLMUser.identifier` - */ -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMUserIdentity : NSObject - -/** - The associated provider type - */ -@property (nonatomic, readonly) NSString *providerType; - -/** - The string which identifies the RLMUserIdentity - */ -@property (nonatomic, readonly) NSString *identifier; - -/** - Initialize an RLMUserIdentity for the given identifier and provider type. - @param providerType the associated provider type - @param identifier the identifier of the identity - */ -- (instancetype)initUserIdentityWithProviderType:(NSString *)providerType - identifier:(NSString *)identifier; - -@end - -/** - A profile for a given User. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMUserProfile : NSObject - -/// The full name of the user. -@property (nonatomic, readonly, nullable) NSString *name; -/// The email address of the user. -@property (nonatomic, readonly, nullable) NSString *email; -/// A URL to the user's profile picture. -@property (nonatomic, readonly, nullable) NSString *pictureURL; -/// The first name of the user. -@property (nonatomic, readonly, nullable) NSString *firstName; -/// The last name of the user. -@property (nonatomic, readonly, nullable) NSString *lastName; -/// The gender of the user. -@property (nonatomic, readonly, nullable) NSString *gender; -/// The birthdate of the user. -@property (nonatomic, readonly, nullable) NSString *birthday; -/// The minimum age of the user. -@property (nonatomic, readonly, nullable) NSString *minAge; -/// The maximum age of the user. -@property (nonatomic, readonly, nullable) NSString *maxAge; -/// The BSON dictionary of metadata associated with this user. -@property (nonatomic, readonly) NSDictionary *metadata NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMUserAPIKey.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMUserAPIKey.h deleted file mode 100644 index 2cdd82b2a..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMUserAPIKey.h +++ /dev/null @@ -1,43 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// UserAPIKey model for APIKeys recevied from the server. -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMUserAPIKey : NSObject - -/// Indicates if the API key is disabled or not -@property (nonatomic, readonly) BOOL disabled; - -/// The name of the key. -@property (nonatomic, readonly) NSString *name; - -/// The actual key. Will only be included in -/// the response when an API key is first created. -@property (nonatomic, readonly, nullable) NSString *key; - -/// The ObjectId of the API key -@property (nonatomic, readonly) RLMObjectId *objectId NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMValue.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMValue.h deleted file mode 100644 index ac1f10ee4..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/RLMValue.h +++ /dev/null @@ -1,97 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import -#import -#import -#import -#import - -#pragma mark RLMValue - -/** - RLMValue is a property type which represents a polymorphic Realm value. This is similar to the usage of - `AnyObject` / `Any` in Swift. -``` - // A property on `MyObject` - @property (nonatomic) id myAnyValue; - - // A property on `AnotherObject` - @property (nonatomic) id myAnyValue; - - MyObject *myObject = [MyObject createInRealm:realm withValue:@[]]; - myObject.myAnyValue = @1234; // underlying type is NSNumber. - myObject.myAnyValue = @"hello"; // underlying type is NSString. - AnotherObject *anotherObject = [AnotherObject createInRealm:realm withValue:@[]]; - myObject.myAnyValue = anotherObject; // underlying type is RLMObject. -``` - The following types conform to RLMValue: - - `NSData` - `NSDate` - `NSNull` - `NSNumber` - `NSUUID` - `NSString` - `RLMObject - `RLMObjectId` - `RLMDecimal128` - */ -@protocol RLMValue - -/// Describes the type of property stored. -@property (readonly) RLMPropertyType rlm_valueType; - -@end - -/// :nodoc: -@interface NSNull (RLMValue) -@end - -/// :nodoc: -@interface NSNumber (RLMValue) -@end - -/// :nodoc: -@interface NSString (RLMValue) -@end - -/// :nodoc: -@interface NSData (RLMValue) -@end - -/// :nodoc: -@interface NSDate (RLMValue) -@end - -/// :nodoc: -@interface NSUUID (RLMValue) -@end - -/// :nodoc: -@interface RLMDecimal128 (RLMValue) -@end - -/// :nodoc: -@interface RLMObjectBase (RLMValue) -@end - -/// :nodoc: -@interface RLMObjectId (RLMValue) -@end diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/Realm.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/Realm.h deleted file mode 100644 index 245596393..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Headers/Realm.h +++ /dev/null @@ -1,63 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import - -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Modules/module.modulemap b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Modules/module.modulemap deleted file mode 100644 index 519ddc20b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Modules/module.modulemap +++ /dev/null @@ -1,88 +0,0 @@ -framework module Realm { - export Foundation - - umbrella header "Realm.h" - - header "RLMArray.h" - header "RLMAsymmetricObject.h" - header "RLMDecimal128.h" - header "RLMDictionary.h" - header "RLMEmbeddedObject.h" - header "RLMLogger.h" - header "RLMMigration.h" - header "RLMObject.h" - header "RLMObjectId.h" - header "RLMObjectSchema.h" - header "RLMProperty.h" - header "RLMProviderClient.h" - header "RLMRealm+Sync.h" - header "RLMRealm.h" - header "RLMRealmConfiguration.h" - header "RLMResults.h" - header "RLMSchema.h" - header "RLMSectionedResults.h" - header "RLMSet.h" - header "RLMValue.h" - - header "RLMApp.h" - header "RLMCredentials.h" - header "RLMNetworkTransport.h" - header "RLMPushClient.h" - header "RLMRealm+Sync.h" - header "RLMSyncConfiguration.h" - header "RLMSyncManager.h" - header "RLMSyncSession.h" - header "RLMUser.h" - header "RLMUserAPIKey.h" - header "RLMAPIKeyAuth.h" - header "RLMEmailPasswordAuth.h" - header "NSError+RLMSync.h" - header "RLMBSON.h" - header "RLMMongoClient.h" - header "RLMMongoDatabase.h" - header "RLMMongoCollection.h" - header "RLMUpdateResult.h" - header "RLMFindOptions.h" - header "RLMFindOneAndModifyOptions.h" - header "RLMSyncSubscription.h" - - explicit module Private { - header "RLMAccessor.h" - header "RLMApp_Private.h" - header "RLMArray_Private.h" - header "RLMAsyncTask_Private.h" - header "RLMCollection_Private.h" - header "RLMDictionary_Private.h" - header "RLMLogger_Private.h" - header "RLMEvent.h" - header "RLMMongoCollection_Private.h" - header "RLMObjectBase_Dynamic.h" - header "RLMObjectBase_Private.h" - header "RLMObjectSchema_Private.h" - header "RLMObjectStore.h" - header "RLMObject_Private.h" - header "RLMProperty_Private.h" - header "RLMRealmConfiguration_Private.h" - header "RLMRealm_Private.h" - header "RLMResults_Private.h" - header "RLMScheduler.h" - header "RLMSchema_Private.h" - header "RLMSectionedResults.h" - header "RLMSet_Private.h" - header "RLMSwiftCollectionBase.h" - header "RLMSwiftProperty.h" - header "RLMSwiftValueStorage.h" - header "RLMSyncConfiguration_Private.h" - header "RLMSyncSubscription_Private.h" - header "RLMUser_Private.h" - } - - explicit module Dynamic { - header "RLMRealm_Dynamic.h" - header "RLMObjectBase_Dynamic.h" - } - - explicit module Swift { - header "RLMSwiftObject.h" - } -} diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMAccessor.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMAccessor.h deleted file mode 100644 index db915ca7c..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMAccessor.h +++ /dev/null @@ -1,53 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectSchema, RLMProperty, RLMObjectBase; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -// -// Accessors Class Creation/Caching -// - -// get accessor classes for an object class - generates classes if not cached -Class RLMManagedAccessorClassForObjectClass(Class objectClass, RLMObjectSchema *schema, const char *name); -Class RLMUnmanagedAccessorClassForObjectClass(Class objectClass, RLMObjectSchema *schema); - -// -// Dynamic getters/setters -// -FOUNDATION_EXTERN void RLMDynamicValidatedSet(RLMObjectBase *obj, NSString *propName, id __nullable val); -FOUNDATION_EXTERN id __nullable RLMDynamicGet(RLMObjectBase *obj, RLMProperty *prop); -FOUNDATION_EXTERN id __nullable RLMDynamicGetByName(RLMObjectBase *obj, NSString *propName); - -// by property/column -void RLMDynamicSet(RLMObjectBase *obj, RLMProperty *prop, id val); - -// -// Class modification -// - -// Replace className method for the given class -void RLMReplaceClassNameMethod(Class accessorClass, NSString *className); - -// Replace sharedSchema method for the given class -void RLMReplaceSharedSchemaMethod(Class accessorClass, RLMObjectSchema * __nullable schema); - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMApp_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMApp_Private.h deleted file mode 100644 index 5da5c3c7a..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMApp_Private.h +++ /dev/null @@ -1,50 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// Observer block for app notifications. -typedef void(^RLMAppNotificationBlock)(RLMApp *); - -/// Token that identifies an observer. Unsubscribes when deconstructed to -/// avoid dangling observers, therefore this must be retained to hold -/// onto a subscription. -@interface RLMAppSubscriptionToken : NSObject -- (void)unsubscribe; -@end - -@interface RLMApp () -/// Returns all currently cached Apps -+ (NSArray *)allApps; -/// Subscribe to notifications for this RLMApp. -- (RLMAppSubscriptionToken *)subscribe:(RLMAppNotificationBlock)block; - -+ (instancetype)appWithConfiguration:(RLMAppConfiguration *)configuration; - -+ (void)resetAppCache; -@end - -@interface RLMAppConfiguration () -@property (nonatomic) NSString *appId; -@property (nonatomic) BOOL encryptMetadata; -@property (nonatomic) NSURL *rootDirectory; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMArray_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMArray_Private.h deleted file mode 100644 index 1a37f010e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMArray_Private.h +++ /dev/null @@ -1,44 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -@class RLMObjectBase, RLMProperty; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMArray () -- (instancetype)initWithObjectClassName:(NSString *)objectClassName; -- (instancetype)initWithObjectType:(RLMPropertyType)type optional:(BOOL)optional; -- (NSString *)descriptionWithMaxDepth:(NSUInteger)depth; -- (void)setParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -- (void)replaceAllObjectsWithObjects:(NSArray *)objects; -// YES if the property is declared with old property syntax. -@property (nonatomic, readonly) BOOL isLegacyProperty; -// The name of the property which this collection represents -@property (nonatomic, readonly) NSString *propertyKey; -@end - -@interface RLMManagedArray : RLMArray -- (instancetype)initWithParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -@end - -void RLMArrayValidateMatchingObjectType(RLMArray *array, id value); - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMAsyncTask_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMAsyncTask_Private.h deleted file mode 100644 index 3cce89441..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMAsyncTask_Private.h +++ /dev/null @@ -1,71 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import "RLMRealm_Private.h" - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMAsyncOpenTask () -@property (nonatomic, nullable) RLMRealm *localRealm; - -- (instancetype)initWithConfiguration:(RLMRealmConfiguration *)configuration - confinedTo:(RLMScheduler *)confinement - download:(bool)waitForDownloadCompletion - completion:(RLMAsyncOpenRealmCallback)completion -__attribute__((objc_direct)); - -- (instancetype)initWithConfiguration:(RLMRealmConfiguration *)configuration - confinedTo:(RLMScheduler *)confinement - download:(bool)waitForDownloadCompletion; - -- (void)waitWithCompletion:(void (^)(NSError *_Nullable))completion; -- (void)waitForOpen:(RLMAsyncOpenRealmCallback)completion __attribute__((objc_direct)); -@end - -// A cancellable task for waiting for downloads on an already-open Realm. -RLM_SWIFT_SENDABLE -@interface RLMAsyncDownloadTask : NSObject -- (instancetype)initWithRealm:(RLMRealm *)realm; -- (void)cancel; -- (void)waitWithCompletion:(void (^)(NSError *_Nullable))completion; -@end - -// A cancellable task for beginning an async write -RLM_SWIFT_SENDABLE -@interface RLMAsyncWriteTask : NSObject -// Must only be called from within the Actor -- (instancetype)initWithRealm:(RLMRealm *)realm; -- (void)setTransactionId:(RLMAsyncTransactionId)transactionID; -- (void)complete:(bool)cancel; - -// Can be called from any thread -- (void)wait:(void (^)(void))completion; -@end - -typedef void (^RLMAsyncRefreshCompletion)(bool); -// A cancellable task for refreshing a Realm -RLM_SWIFT_SENDABLE -@interface RLMAsyncRefreshTask : NSObject -- (void)complete:(bool)didRefresh; -- (void)wait:(RLMAsyncRefreshCompletion)completion; -+ (RLMAsyncRefreshTask *)completedRefresh; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMBSON_Private.hpp b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMBSON_Private.hpp deleted file mode 100644 index c5cc1a410..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMBSON_Private.hpp +++ /dev/null @@ -1,32 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -namespace realm::bson { -class Bson; -template class IndexedMap; -using BsonDocument = IndexedMap; -} - -realm::bson::Bson RLMConvertRLMBSONToBson(id b); -realm::bson::BsonDocument RLMConvertRLMBSONArrayToBsonDocument(NSArray> *array); -id RLMConvertBsonToRLMBSON(const realm::bson::Bson& b); -id RLMConvertBsonDocumentToRLMBSON(std::optional b); -NSArray> *RLMConvertBsonDocumentToRLMBSONArray(std::optional b); diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMCollection_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMCollection_Private.h deleted file mode 100644 index 7d31bd3f0..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMCollection_Private.h +++ /dev/null @@ -1,42 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@protocol RLMCollectionPrivate; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -NSUInteger RLMUnmanagedFastEnumerate(id collection, NSFastEnumerationState *); -void RLMCollectionSetValueForKey(id collection, NSString *key, id _Nullable value); -FOUNDATION_EXTERN NSString *RLMDescriptionWithMaxDepth(NSString *name, id collection, NSUInteger depth); -FOUNDATION_EXTERN void RLMAssignToCollection(id collection, id value); -FOUNDATION_EXTERN void RLMSetSwiftBridgeCallback(id _Nullable (*_Nonnull)(id)); - -FOUNDATION_EXTERN -RLMNotificationToken *RLMAddNotificationBlock(id collection, id block, - NSArray *_Nullable keyPaths, - dispatch_queue_t _Nullable queue); - -typedef RLM_CLOSED_ENUM(int32_t, RLMCollectionType) { - RLMCollectionTypeArray = 0, - RLMCollectionTypeSet = 1, - RLMCollectionTypeDictionary = 2 -}; - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMDictionary_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMDictionary_Private.h deleted file mode 100644 index 37ff740c7..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMDictionary_Private.h +++ /dev/null @@ -1,46 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectBase, RLMProperty; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMDictionary () -- (instancetype)initWithObjectClassName:(NSString *)objectClassName keyType:(RLMPropertyType)keyType; -- (instancetype)initWithObjectType:(RLMPropertyType)type optional:(BOOL)optional keyType:(RLMPropertyType)keyType; -- (NSString *)descriptionWithMaxDepth:(NSUInteger)depth; -- (void)setParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -// YES if the property is declared with old property syntax. -@property (nonatomic, readonly) BOOL isLegacyProperty; -// The name of the property which this collection represents -@property (nonatomic, readonly) NSString *propertyKey; -@end - -@interface RLMManagedDictionary : RLMDictionary -- (instancetype)initWithParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -@end - -FOUNDATION_EXTERN NSString *RLMDictionaryDescriptionWithMaxDepth(NSString *name, - RLMDictionary *dictionary, - NSUInteger depth); -id RLMDictionaryKey(RLMDictionary *dictionary, id key) RLM_HIDDEN; -id RLMDictionaryValue(RLMDictionary *dictionary, id value) RLM_HIDDEN; - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMEvent.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMEvent.h deleted file mode 100644 index 9a6acb1a6..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMEvent.h +++ /dev/null @@ -1,64 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2022 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#ifdef __cplusplus -#include - -namespace realm { -struct AuditConfig; -} -#endif - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMRealm, RLMUser, RLMRealmConfiguration; -typedef RLM_CLOSED_ENUM(NSUInteger, RLMSyncLogLevel); - -struct RLMEventContext; -typedef void (^RLMEventCompletion)(NSError *_Nullable); - -FOUNDATION_EXTERN struct RLMEventContext *_Nullable RLMEventGetContext(RLMRealm *realm); -FOUNDATION_EXTERN uint64_t RLMEventBeginScope(struct RLMEventContext *context, NSString *activity); -FOUNDATION_EXTERN void RLMEventCommitScope(struct RLMEventContext *context, uint64_t scope_id, - RLMEventCompletion _Nullable completion); -FOUNDATION_EXTERN void RLMEventCancelScope(struct RLMEventContext *context, uint64_t scope_id); -FOUNDATION_EXTERN bool RLMEventIsActive(struct RLMEventContext *context, uint64_t scope_id); -FOUNDATION_EXTERN void RLMEventRecordEvent(struct RLMEventContext *context, NSString *activity, - NSString *_Nullable event, NSString *_Nullable data, - RLMEventCompletion _Nullable completion); -FOUNDATION_EXTERN void RLMEventUpdateMetadata(struct RLMEventContext *context, - NSDictionary *newMetadata); - -@interface RLMEventConfiguration : NSObject -@property (nonatomic) NSString *partitionPrefix; -@property (nonatomic, nullable) RLMUser *syncUser; -@property (nonatomic, nullable) NSDictionary *metadata; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" -@property (nonatomic, nullable) void (^logger)(RLMSyncLogLevel, NSString *); -#pragma clang diagnostic pop -@property (nonatomic, nullable) RLM_SWIFT_SENDABLE void (^errorHandler)(NSError *); - -#ifdef __cplusplus -- (std::shared_ptr)auditConfigWithRealmConfiguration:(RLMRealmConfiguration *)realmConfig; -#endif -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMLogger_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMLogger_Private.h deleted file mode 100644 index 08f8c591e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMLogger_Private.h +++ /dev/null @@ -1,36 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMLogger() - -/** - Log a message to the supplied level. - - @param logLevel The log level for the message. - @param message The message to log. - */ -- (void)logWithLevel:(RLMLogLevel)logLevel message:(NSString *)message, ... NS_SWIFT_UNAVAILABLE(""); -- (void)logLevel:(RLMLogLevel)logLevel message:(NSString *)message; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMMigration_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMMigration_Private.h deleted file mode 100644 index 393f41184..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMMigration_Private.h +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import -#import - -namespace realm { - class Schema; -} - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMMigration () - -@property (nonatomic, strong) RLMRealm *oldRealm; -@property (nonatomic, strong) RLMRealm *realm; - -- (instancetype)initWithRealm:(RLMRealm *)realm oldRealm:(RLMRealm *)oldRealm schema:(realm::Schema &)schema; - -- (void)execute:(RLMMigrationBlock)block objectClass:(_Nullable Class)cls; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMMongoCollection_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMMongoCollection_Private.h deleted file mode 100644 index 77bbf9752..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMMongoCollection_Private.h +++ /dev/null @@ -1,37 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@class RLMUser; - -@interface RLMMongoCollection () -- (instancetype)initWithUser:(RLMUser *)user - serviceName:(NSString *)serviceName - databaseName:(NSString *)databaseName - collectionName:(NSString *)collectionName; - -- (RLMChangeStream *)watchWithMatchFilter:(nullable id)matchFilter - idFilter:(nullable id)idFilter - delegate:(id)delegate - scheduler:(void (^)(dispatch_block_t))scheduler; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMObjectBase_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMObjectBase_Private.h deleted file mode 100644 index af547b17e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMObjectBase_Private.h +++ /dev/null @@ -1,34 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2017 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMArray; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -// RLMObjectBase private -@interface RLMObjectBase () -@property (nonatomic, nullable) NSMutableArray *lastAccessedNames; - -+ (void)initializeLinkedObjectSchemas; -+ (bool)isEmbedded; -+ (bool)isAsymmetric; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMObjectSchema_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMObjectSchema_Private.h deleted file mode 100644 index 08855a82b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMObjectSchema_Private.h +++ /dev/null @@ -1,75 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -// RLMObjectSchema private -@interface RLMObjectSchema () { -@public - bool _isSwiftClass; -} - -/// The object type name reported to the object store and core. -@property (nonatomic, readonly) NSString *objectName; - -// writable redeclaration -@property (nonatomic, readwrite, copy) NSArray *properties; -@property (nonatomic, readwrite, assign) bool isSwiftClass; -@property (nonatomic, readwrite, assign) BOOL isEmbedded; -@property (nonatomic, readwrite, assign) BOOL isAsymmetric; - -// class used for this object schema -@property (nonatomic, readwrite, assign) Class objectClass; -@property (nonatomic, readwrite, assign) Class accessorClass; -@property (nonatomic, readwrite, assign) Class unmanagedClass; - -@property (nonatomic, readwrite, assign) bool hasCustomEventSerialization; - -@property (nonatomic, readwrite, nullable) RLMProperty *primaryKeyProperty; - -@property (nonatomic, copy) NSArray *computedProperties; -@property (nonatomic, readonly, nullable) NSArray *swiftGenericProperties; - -// returns a cached or new schema for a given object class -+ (instancetype)schemaForObjectClass:(Class)objectClass; -@end - -@interface RLMObjectSchema (Dynamic) -/** - This method is useful only in specialized circumstances, for example, when accessing objects - in a Realm produced externally. If you are simply building an app on Realm, it is not recommended - to use this method as an [RLMObjectSchema](RLMObjectSchema) is generated automatically for every [RLMObject](RLMObject) subclass. - - Initialize an RLMObjectSchema with classname, objectClass, and an array of properties - - @warning This method is useful only in specialized circumstances. - - @param objectClassName The name of the class used to refer to objects of this type. - @param objectClass The Objective-C class used when creating instances of this type. - @param properties An array of RLMProperty instances describing the managed properties for this type. - - @return An initialized instance of RLMObjectSchema. - */ -- (instancetype)initWithClassName:(NSString *)objectClassName objectClass:(Class)objectClass properties:(NSArray *)properties; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMObjectStore.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMObjectStore.h deleted file mode 100644 index 6045f1e8e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMObjectStore.h +++ /dev/null @@ -1,98 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#ifdef __cplusplus -extern "C" { -#endif - -@class RLMRealm, RLMSchema, RLMObjectBase, RLMResults, RLMProperty; - -typedef NS_ENUM(NSUInteger, RLMUpdatePolicy) { - RLMUpdatePolicyError = 1, - RLMUpdatePolicyUpdateChanged = 3, - RLMUpdatePolicyUpdateAll = 2, -}; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -void RLMVerifyHasPrimaryKey(Class cls); - -void RLMVerifyInWriteTransaction(RLMRealm *const realm); - -// -// Adding, Removing, Getting Objects -// - -// add an object to the given realm -void RLMAddObjectToRealm(RLMObjectBase *object, RLMRealm *realm, RLMUpdatePolicy); - -// delete an object from its realm -void RLMDeleteObjectFromRealm(RLMObjectBase *object, RLMRealm *realm); - -// deletes all objects from a realm -void RLMDeleteAllObjectsFromRealm(RLMRealm *realm); - -// get objects of a given class -RLMResults *RLMGetObjects(RLMRealm *realm, NSString *objectClassName, NSPredicate * _Nullable predicate) -NS_RETURNS_RETAINED; - -// get an object with the given primary key -id _Nullable RLMGetObject(RLMRealm *realm, NSString *objectClassName, id _Nullable key) NS_RETURNS_RETAINED; - -// create object from array or dictionary -RLMObjectBase *RLMCreateObjectInRealmWithValue(RLMRealm *realm, NSString *className, - id _Nullable value, RLMUpdatePolicy updatePolicy) -NS_RETURNS_RETAINED; - -// creates an asymmetric object and doesn't return -void RLMCreateAsymmetricObjectInRealm(RLMRealm *realm, NSString *className, id value); - -// -// Accessor Creation -// - - -// Perform the per-property accessor initialization for a managed RealmSwiftObject -// promotingExisting should be true if the object was previously used as an -// unmanaged object, and false if it is a newly created object. -void RLMInitializeSwiftAccessor(RLMObjectBase *object, bool promotingExisting); - -#ifdef __cplusplus -} - -namespace realm { - class Obj; - class Table; - struct ColKey; - struct ObjLink; -} -class RLMClassInfo; - -// get an object with a given table & object key -RLMObjectBase *RLMObjectFromObjLink(RLMRealm *realm, - realm::ObjLink&& objLink, - bool parentIsSwiftObject) NS_RETURNS_RETAINED; - -// Create accessors -RLMObjectBase *RLMCreateObjectAccessor(RLMClassInfo& info, int64_t key) NS_RETURNS_RETAINED; -RLMObjectBase *RLMCreateObjectAccessor(RLMClassInfo& info, const realm::Obj& obj) NS_RETURNS_RETAINED; -#endif - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMObject_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMObject_Private.h deleted file mode 100644 index 8ccdbf576..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMObject_Private.h +++ /dev/null @@ -1,110 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMProperty, RLMArray, RLMSchema; -typedef NS_ENUM(int32_t, RLMPropertyType); - -FOUNDATION_EXTERN void RLMInitializeWithValue(RLMObjectBase *, id, RLMSchema *); - -typedef void (^RLMObjectNotificationCallback)(RLMObjectBase *_Nullable object, - NSArray *_Nullable propertyNames, - NSArray *_Nullable oldValues, - NSArray *_Nullable newValues, - NSError *_Nullable error); - -// RLMObject accessor and read/write realm -@interface RLMObjectBase () { -@public - RLMRealm *_realm; - __unsafe_unretained RLMObjectSchema *_objectSchema; -} - -// shared schema for this class -+ (nullable RLMObjectSchema *)sharedSchema; - -+ (nullable NSArray *)_getProperties; -+ (bool)_realmIgnoreClass; - -// This enables to override the propertiesMapping in Swift, it is not to be used in Objective-C API. -+ (NSDictionary *)propertiesMapping; -@end - -@interface RLMDynamicObject : RLMObject - -@end - -// Calls valueForKey: and re-raises NSUndefinedKeyExceptions -FOUNDATION_EXTERN id _Nullable RLMValidatedValueForProperty(id object, NSString *key, NSString *className); - -// Compare two RLObjectBases -FOUNDATION_EXTERN BOOL RLMObjectBaseAreEqual(RLMObjectBase * _Nullable o1, RLMObjectBase * _Nullable o2); - -FOUNDATION_EXTERN RLMNotificationToken *RLMObjectBaseAddNotificationBlock(RLMObjectBase *obj, - NSArray *_Nullable keyPaths, - dispatch_queue_t _Nullable queue, - RLMObjectNotificationCallback block); - -RLMNotificationToken *RLMObjectAddNotificationBlock(RLMObjectBase *obj, - RLMObjectChangeBlock block, - NSArray *_Nullable keyPaths, - dispatch_queue_t _Nullable queue); - -// Returns whether the class is a descendent of RLMObjectBase -FOUNDATION_EXTERN BOOL RLMIsObjectOrSubclass(Class klass); - -// Returns whether the class is an indirect descendant of RLMObjectBase -FOUNDATION_EXTERN BOOL RLMIsObjectSubclass(Class klass); - -FOUNDATION_EXTERN const NSUInteger RLMDescriptionMaxDepth; - -FOUNDATION_EXTERN id RLMObjectFreeze(RLMObjectBase *obj) NS_RETURNS_RETAINED; - -FOUNDATION_EXTERN id RLMObjectThaw(RLMObjectBase *obj); - -// Gets an object identifier suitable for use with Combine. This value may -// change when an unmanaged object is added to the Realm. -FOUNDATION_EXTERN uint64_t RLMObjectBaseGetCombineId(RLMObjectBase *); - -// An accessor object which is used to interact with Swift properties from obj-c -@interface RLMManagedPropertyAccessor : NSObject -// Perform any initialization required for KVO on a *unmanaged* object -+ (void)observe:(RLMProperty *)property on:(RLMObjectBase *)parent; -// Initialize the given property on a *managed* object which previous was unmanaged -+ (void)promote:(RLMProperty *)property on:(RLMObjectBase *)parent; -// Initialize the given property on a newly created *managed* object -+ (void)initialize:(RLMProperty *)property on:(RLMObjectBase *)parent; -// Read the value of the property, on either kind of object -+ (id)get:(RLMProperty *)property on:(RLMObjectBase *)parent; -// Set the property to the given value, on either kind of object -+ (void)set:(RLMProperty *)property on:(RLMObjectBase *)parent to:(id)value; -@end - -@interface RLMObjectNotificationToken : RLMNotificationToken -- (void)observe:(RLMObjectBase *)obj - keyPaths:(nullable NSArray *)keyPaths - block:(RLMObjectNotificationCallback)block; -- (void)registrationComplete:(void (^)(void))completion; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMProperty_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMProperty_Private.h deleted file mode 100644 index 6a87ced63..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMProperty_Private.h +++ /dev/null @@ -1,139 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -@class RLMObjectBase; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -BOOL RLMPropertyTypeIsComputed(RLMPropertyType propertyType); -FOUNDATION_EXTERN void RLMValidateSwiftPropertyName(NSString *name); - -// Translate an rlmtype to a string representation -static inline NSString *RLMTypeToString(RLMPropertyType type) { - switch (type) { - case RLMPropertyTypeString: - return @"string"; - case RLMPropertyTypeInt: - return @"int"; - case RLMPropertyTypeBool: - return @"bool"; - case RLMPropertyTypeDate: - return @"date"; - case RLMPropertyTypeData: - return @"data"; - case RLMPropertyTypeDouble: - return @"double"; - case RLMPropertyTypeFloat: - return @"float"; - case RLMPropertyTypeAny: - return @"mixed"; - case RLMPropertyTypeObject: - return @"object"; - case RLMPropertyTypeLinkingObjects: - return @"linking objects"; - case RLMPropertyTypeDecimal128: - return @"decimal128"; - case RLMPropertyTypeObjectId: - return @"object id"; - case RLMPropertyTypeUUID: - return @"uuid"; - } - return @"Unknown"; -} - -// private property interface -@interface RLMProperty () { -@public - RLMPropertyType _type; -} - -- (instancetype)initWithName:(NSString *)name - indexed:(BOOL)indexed - linkPropertyDescriptor:(nullable RLMPropertyDescriptor *)linkPropertyDescriptor - property:(objc_property_t)property; - -- (instancetype)initSwiftPropertyWithName:(NSString *)name - indexed:(BOOL)indexed - linkPropertyDescriptor:(nullable RLMPropertyDescriptor *)linkPropertyDescriptor - property:(objc_property_t)property - instance:(RLMObjectBase *)objectInstance; - -- (void)updateAccessors; - -// private setters -@property (nonatomic, readwrite) NSString *name; -@property (nonatomic, readwrite, assign) RLMPropertyType type; -@property (nonatomic, readwrite) BOOL indexed; -@property (nonatomic, readwrite) BOOL optional; -@property (nonatomic, readwrite) BOOL array; -@property (nonatomic, readwrite) BOOL set; -@property (nonatomic, readwrite) BOOL dictionary; -@property (nonatomic, copy, nullable) NSString *objectClassName; -@property (nonatomic, copy, nullable) NSString *linkOriginPropertyName; - -// private properties -@property (nonatomic, readwrite, nullable) NSString *columnName; -@property (nonatomic, assign) NSUInteger index; -@property (nonatomic, assign) BOOL isPrimary; -@property (nonatomic, assign) BOOL isLegacy; -@property (nonatomic, assign) ptrdiff_t swiftIvar; -@property (nonatomic, assign, nullable) Class swiftAccessor; -@property (nonatomic, readwrite, assign) RLMPropertyType dictionaryKeyType; -@property (nonatomic, readwrite) BOOL customMappingIsOptional; - -// getter and setter names -@property (nonatomic, copy) NSString *getterName; -@property (nonatomic, copy) NSString *setterName; -@property (nonatomic, nullable) SEL getterSel; -@property (nonatomic, nullable) SEL setterSel; - -- (RLMProperty *)copyWithNewName:(NSString *)name; -- (NSString *)typeName; - -@end - -@interface RLMProperty (Dynamic) -/** - This method is useful only in specialized circumstances, for example, in conjunction with - +[RLMObjectSchema initWithClassName:objectClass:properties:]. If you are simply building an - app on Realm, it is not recommended to use this method. - - Initialize an RLMProperty - - @warning This method is useful only in specialized circumstances. - - @param name The property name. - @param type The property type. - @param objectClassName The object type used for Object and Array types. - @param linkOriginPropertyName The property name of the origin of a link. Used for linking objects properties. - - @return An initialized instance of RLMProperty. - */ -- (instancetype)initWithName:(NSString *)name - type:(RLMPropertyType)type - objectClassName:(nullable NSString *)objectClassName - linkOriginPropertyName:(nullable NSString *)linkOriginPropertyName - indexed:(BOOL)indexed - optional:(BOOL)optional; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMPushClient_Private.hpp b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMPushClient_Private.hpp deleted file mode 100644 index 44304c9c3..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMPushClient_Private.hpp +++ /dev/null @@ -1,28 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import "RLMPushClient.h" - -namespace realm::app { -class PushClient; -} - -RLM_DIRECT_MEMBERS -@interface RLMPushClient () -- (instancetype)initWithPushClient:(realm::app::PushClient&&)pushClient; -@end diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMRealmConfiguration_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMRealmConfiguration_Private.h deleted file mode 100644 index 12b09676d..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMRealmConfiguration_Private.h +++ /dev/null @@ -1,52 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2015 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMSchema, RLMEventConfiguration; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMRealmConfiguration () - -@property (nonatomic, readwrite) bool cache; -@property (nonatomic, readwrite) bool dynamic; -@property (nonatomic, readwrite) bool disableFormatUpgrade; -@property (nonatomic, copy, nullable) RLMSchema *customSchema; -@property (nonatomic, copy) NSString *pathOnDisk; -@property (nonatomic, retain, nullable) RLMEventConfiguration *eventConfiguration; -@property (nonatomic, nullable) Class migrationObjectClass; -@property (nonatomic) bool disableAutomaticChangeNotifications; - -// Flexible Sync -@property (nonatomic, readwrite, nullable) RLMFlexibleSyncInitialSubscriptionsBlock initialSubscriptions; -@property (nonatomic, readwrite) BOOL rerunOnOpen; - -// Get the default configuration without copying it -+ (RLMRealmConfiguration *)rawDefaultConfiguration; - -+ (void)resetRealmConfigurationState; - -- (void)setCustomSchemaWithoutCopying:(nullable RLMSchema *)schema; -@end - -// Get a path in the platform-appropriate documents directory with the given filename -FOUNDATION_EXTERN NSString *RLMRealmPathForFile(NSString *fileName); -FOUNDATION_EXTERN NSString *RLMRealmPathForFileAndBundleIdentifier(NSString *fileName, NSString *mainBundleIdentifier); - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMRealm_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMRealm_Private.h deleted file mode 100644 index 95841491f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMRealm_Private.h +++ /dev/null @@ -1,94 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMFastEnumerator, RLMScheduler, RLMAsyncRefreshTask, RLMAsyncWriteTask; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -// Disable syncing files to disk. Cannot be re-enabled. Use only for tests. -FOUNDATION_EXTERN void RLMDisableSyncToDisk(void); -// Set whether the skip backup attribute should be set on temporary files. -FOUNDATION_EXTERN void RLMSetSkipBackupAttribute(bool value); - -FOUNDATION_EXTERN NSData * _Nullable RLMRealmValidatedEncryptionKey(NSData *key); - -// Set the queue used for async open. For testing purposes only. -FOUNDATION_EXTERN void RLMSetAsyncOpenQueue(dispatch_queue_t queue); - -// Translate an in-flight exception resulting from an operation on a SharedGroup to -// an NSError or NSException (if error is nil) -void RLMRealmTranslateException(NSError **error); - -// Block until the Realm at the given path is closed. -FOUNDATION_EXTERN void RLMWaitForRealmToClose(NSString *path); -BOOL RLMIsRealmCachedAtPath(NSString *path); - -// Register a block to be called from the next before_notify() invocation -FOUNDATION_EXTERN void RLMAddBeforeNotifyBlock(RLMRealm *realm, dispatch_block_t block); - -// Test hook to run the async notifiers for a Realm which has the background thread disabled -FOUNDATION_EXTERN void RLMRunAsyncNotifiers(NSString *path); - -// Get the cached Realm for the given configuration and scheduler, if any -FOUNDATION_EXTERN RLMRealm *_Nullable RLMGetCachedRealm(RLMRealmConfiguration *, RLMScheduler *) NS_RETURNS_RETAINED; -// Get a cached Realm for the given configuration and any scheduler. The returned -// Realm is not confined to the current thread, so very few operations are safe -// to perform on it -FOUNDATION_EXTERN RLMRealm *_Nullable RLMGetAnyCachedRealm(RLMRealmConfiguration *) NS_RETURNS_RETAINED; - -// Scheduler an async refresh for the given Realm -FOUNDATION_EXTERN RLMAsyncRefreshTask *_Nullable RLMRealmRefreshAsync(RLMRealm *rlmRealm) NS_RETURNS_RETAINED; - -// RLMRealm private members -@interface RLMRealm () -@property (nonatomic, readonly) BOOL dynamic; -@property (nonatomic, readwrite) RLMSchema *schema; -@property (nonatomic, readonly, nullable) id actor; -@property (nonatomic, readonly) bool isFlexibleSync; - -+ (void)resetRealmState; - -- (void)registerEnumerator:(RLMFastEnumerator *)enumerator; -- (void)unregisterEnumerator:(RLMFastEnumerator *)enumerator; -- (void)detachAllEnumerators; - -- (void)sendNotifications:(RLMNotification)notification; -- (void)verifyThread; -- (void)verifyNotificationsAreSupported:(bool)isCollection; - -- (RLMRealm *)frozenCopy NS_RETURNS_RETAINED; - -+ (nullable instancetype)realmWithConfiguration:(RLMRealmConfiguration *)configuration - confinedTo:(RLMScheduler *)options - error:(NSError **)error; - -- (RLMAsyncWriteTask *)beginAsyncWrite NS_RETURNS_RETAINED; -- (void)commitAsyncWriteWithGrouping:(bool)allowGrouping - completion:(void(^)(NSError *_Nullable))completion; -@end - -@interface RLMPinnedRealm : NSObject -@property (nonatomic, readonly) RLMRealmConfiguration *configuration; - -- (instancetype)initWithRealm:(RLMRealm *)realm; -- (void)unpin; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMResults_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMResults_Private.h deleted file mode 100644 index c7e29bebb..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMResults_Private.h +++ /dev/null @@ -1,33 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectSchema; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMResults () -@property (nonatomic, readonly, getter=isAttached) BOOL attached; - -+ (instancetype)emptyDetachedResults; -- (RLMResults *)snapshot; - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMScheduler.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMScheduler.h deleted file mode 100644 index 3c1b9874b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMScheduler.h +++ /dev/null @@ -1,63 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#ifdef __cplusplus -#include -namespace realm::util { -class Scheduler; -} -#endif - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -// A serial work queue of some sort which represents a thread-confinement context -// of some sort which blocks can be invoked inside. Realms are confined to a -// scheduler, which can be a thread (actually a run loop), a dispatch queue, or -// an actor. The scheduler ensures that the Realm is only used on one thread at -// a time, and allows us to dispatch work to the thread where we can access the -// Realm safely. -RLM_SWIFT_SENDABLE // is immutable -@interface RLMScheduler : NSObject -+ (RLMScheduler *)mainRunLoop __attribute__((objc_direct)); -+ (RLMScheduler *)currentRunLoop __attribute__((objc_direct)); -// A scheduler for the given queue if it's non-nil, and currentRunLoop otherwise -+ (RLMScheduler *)dispatchQueue:(nullable dispatch_queue_t)queue; -+ (RLMScheduler *)actor:(id)actor invoke:(void (^)(dispatch_block_t))invoke - verify:(void (^)(void))verify; - -// Invoke the block on this scheduler. Currently not actually implement for run -// loop schedulers. -- (void)invoke:(dispatch_block_t)block; - -// Cache key for this scheduler suitable for use with NSMapTable. Only valid -// when called from the current scheduler. -- (void *)cacheKey; - -- (nullable id)actor; - -#ifdef __cplusplus -// The object store Scheduler corresponding to this scheduler -- (std::shared_ptr)osScheduler; -#endif -@end - -FOUNDATION_EXTERN void RLMSetMainActor(id actor); - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMSchema_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMSchema_Private.h deleted file mode 100644 index f4f63c9f8..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMSchema_Private.h +++ /dev/null @@ -1,58 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@class RLMRealm; - -// -// RLMSchema private interface -// -@interface RLMSchema () - -/** - Returns an `RLMSchema` containing only the given `RLMObject` subclasses. - - @param classes The classes to be included in the schema. - - @return An `RLMSchema` containing only the given classes. - */ -+ (instancetype)schemaWithObjectClasses:(NSArray *)classes; - -@property (nonatomic, readwrite, copy) NSArray *objectSchema; - -// schema based on runtime objects -+ (instancetype)sharedSchema; - -// schema based upon all currently registered object classes -+ (instancetype)partialSharedSchema; - -// private schema based upon all currently registered object classes. -// includes classes that are excluded from the default schema. -+ (instancetype)partialPrivateSharedSchema; - -// class for string -+ (nullable Class)classForString:(NSString *)className; - -+ (nullable RLMObjectSchema *)sharedSchemaForClass:(Class)cls; - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMSet_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMSet_Private.h deleted file mode 100644 index 1053e0a0f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMSet_Private.h +++ /dev/null @@ -1,43 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -@class RLMObjectBase, RLMProperty; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMSet () -- (instancetype)initWithObjectClassName:(NSString *)objectClassName; -- (instancetype)initWithObjectType:(RLMPropertyType)type optional:(BOOL)optional; -- (NSString *)descriptionWithMaxDepth:(NSUInteger)depth; -- (void)setParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -// YES if the property is declared with old property syntax. -@property (nonatomic, readonly) BOOL isLegacyProperty; -// The name of the property which this collection represents -@property (nonatomic, readonly) NSString *propertyKey; -@end - -void RLMSetValidateMatchingObjectType(RLMSet *set, id value); - -@interface RLMManagedSet : RLMSet -- (instancetype)initWithParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMSwiftCollectionBase.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMSwiftCollectionBase.h deleted file mode 100644 index a4f864282..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMSwiftCollectionBase.h +++ /dev/null @@ -1,46 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectBase, RLMResults, RLMProperty, RLMLinkingObjects; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMSwiftCollectionBase : NSProxy -@property (nonatomic, strong) id _rlmCollection; - -- (instancetype)init; -+ (Class)_backingCollectionType; -- (instancetype)initWithCollection:(id)collection; - -- (nullable id)valueForKey:(NSString *)key; -- (nullable id)valueForKeyPath:(NSString *)keyPath; -- (BOOL)isEqual:(nullable id)object; -@end - -@interface RLMLinkingObjectsHandle : NSObject -- (instancetype)initWithObject:(RLMObjectBase *)object property:(RLMProperty *)property; -- (instancetype)initWithLinkingObjects:(RLMResults *)linkingObjects; - -@property (nonatomic, readonly) RLMLinkingObjects *results; -@property (nonatomic, readonly) NSString *_propertyKey; -@property (nonatomic, readonly) BOOL _isLegacyProperty; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMSwiftSupport.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMSwiftSupport.h deleted file mode 100644 index 530f0edbf..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMSwiftSupport.h +++ /dev/null @@ -1,30 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMSwiftSupport : NSObject - -+ (BOOL)isSwiftClassName:(NSString *)className; -+ (NSString *)demangleClassName:(NSString *)className; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMSwiftValueStorage.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMSwiftValueStorage.h deleted file mode 100644 index ef3efc610..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMSwiftValueStorage.h +++ /dev/null @@ -1,53 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectBase, RLMProperty; - -/// This class implements the backing storage for `RealmProperty<>` and `RealmOptional<>`. -/// This class should not be subclassed or used directly. -@interface RLMSwiftValueStorage : NSProxy -- (instancetype)init; -@end -/// Retrieves the value that is stored, or nil if it is empty. -FOUNDATION_EXTERN id _Nullable RLMGetSwiftValueStorage(RLMSwiftValueStorage *); -/// Sets a value on the property this instance represents for an object. -FOUNDATION_EXTERN void RLMSetSwiftValueStorage(RLMSwiftValueStorage *, id _Nullable); - -/// Initialises managed accessors on an instance of `RLMSwiftValueStorage` -/// @param parent The enclosing parent object. -/// @param prop The property which this class represents. -FOUNDATION_EXTERN void RLMInitializeManagedSwiftValueStorage(RLMSwiftValueStorage *, - RLMObjectBase *parent, - RLMProperty *prop); - -/// Initialises unmanaged accessors on an instance of `RLMSwiftValueStorage` -/// @param parent The enclosing parent object. -/// @param prop The property which this class represents. -FOUNDATION_EXTERN void RLMInitializeUnmanagedSwiftValueStorage(RLMSwiftValueStorage *, - RLMObjectBase *parent, - RLMProperty *prop); - -/// Gets the property name for the RealmProperty instance. This is required for tracing the key path on -/// objects that use the legacy property declaration syntax. -FOUNDATION_EXTERN NSString *RLMSwiftValueStorageGetPropertyName(RLMSwiftValueStorage *); - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMSyncConfiguration_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMSyncConfiguration_Private.h deleted file mode 100644 index 62d0e1f1f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMSyncConfiguration_Private.h +++ /dev/null @@ -1,47 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -typedef RLM_CLOSED_ENUM(NSUInteger, RLMSyncStopPolicy) { - RLMSyncStopPolicyImmediately, - RLMSyncStopPolicyLiveIndefinitely, - RLMSyncStopPolicyAfterChangesUploaded, -}; - - -@class RLMSchema; - -@interface RLMSyncConfiguration () - -// Flexible sync -- (instancetype)initWithUser:(RLMUser *)user; -// Partition-based sync -- (instancetype)initWithUser:(RLMUser *)user - partitionValue:(nullable id)partitionValue; - -// Internal-only APIs -@property (nonatomic, readwrite) RLMSyncStopPolicy stopPolicy; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMSyncSubscription_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMSyncSubscription_Private.h deleted file mode 100644 index dc438a20e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMSyncSubscription_Private.h +++ /dev/null @@ -1,70 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -#pragma mark - Subscription - -@interface RLMSyncSubscription () - -@property (nonatomic, readonly) RLMObjectId *identifier; - -@property (nonatomic, readonly) NSString *queryString; - -@property (nonatomic, readonly) NSString *objectClassName; - -@end - -#pragma mark - SubscriptionSet - -@interface RLMSyncSubscriptionEnumerator : NSObject - -@property (nonatomic, readonly) RLMSyncSubscriptionSet *subscriptionSet; - -- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state - count:(NSUInteger)len; - -- (instancetype)initWithSubscriptionSet:(RLMSyncSubscriptionSet *)subscriptionSet; - -@end - -@interface RLMSyncSubscriptionSet () - -@property (readonly) uint64_t version; - -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - subscriptionName:(nullable NSString *)name - predicate:(NSPredicate *)predicate - updateExisting:(BOOL)updateExisting; - -- (void)waitForSynchronizationOnQueue:(nullable dispatch_queue_t)queue - completionBlock:(void(^)(NSError *))completionBlock; - -- (RLMSyncSubscriptionEnumerator *)fastEnumerator; - -NSUInteger RLMFastEnumerate(NSFastEnumerationState *state, - NSUInteger len, - RLMSyncSubscriptionSet *collection); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMUser_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMUser_Private.h deleted file mode 100644 index f62c9a940..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/PrivateHeaders/RLMUser_Private.h +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// Observer block for user notifications. -typedef void(^RLMUserNotificationBlock)(RLMUser *); - -/// Token that identifies an observer. Unsubscribes when deconstructed to -/// avoid dangling observers, therefore this must be retained to hold -/// onto a subscription. -@interface RLMUserSubscriptionToken : NSObject -- (void)unsubscribe; -@end - -@interface RLMUser () -/// Subscribe to notifications for this RLMUser. -- (RLMUserSubscriptionToken *)subscribe:(RLMUserNotificationBlock)block; - -- (void)logOut; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Realm b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Realm deleted file mode 100755 index 2fcdc0582..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Realm and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Resources/CHANGELOG.md b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Resources/CHANGELOG.md deleted file mode 100644 index 00cc01244..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Resources/CHANGELOG.md +++ /dev/null @@ -1,9539 +0,0 @@ -10.42.3 Release notes (2023-09-18) -============================================================= - -### Enhancements - -* Update packaging for the Xcode 15.0 release. Carthage release and obj-c - binaries are now built with Xcode 15. - -### Fixed - -* The prebuilt Realm.xcframework for SPM was packaged incorrectly and did not - work ([#8361](https://github.com/realm/realm-swift/issues/8361), since v10.42.1). - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 15.0.0. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15.0.0. - -10.42.2 Release notes (2023-09-13) -============================================================= - -### Enhancements - -* Add support for logging messages sent by the server. - ([Core #6476](https://github.com/realm/realm-core/pull/6476)) -* Unknown protocol errors received from the baas server will no longer cause - the application to crash if a valid error action is also received. Unknown - error actions will be treated as an ApplicationBug error action and will - cause sync to fail with an error via the sync error handler. - ([Core #6885](https://github.com/realm/realm-core/pull/6885)) -* Some sync error messages now contain more information about what went wrong. - -### Fixed - -* The `MultipleSyncAgents` exception from opening a synchronized Realm in - multiple processes at once no longer leaves the sync client in an invalid - state. ([Core #6868](https://github.com/realm/realm-core/pull/6868), since v10.36.0) -* Testing the size of a collection of links against zero would sometimes fail - (sometimes = "difficult to explain"). In particular: - ([Core #6850](https://github.com/realm/realm-core/issues/6850), since v10.41.0) -* When async writes triggered a file compaction some internal state could be - corrupted, leading to later crashes in the slab allocator. This typically - resulted in the "ref + size <= next->first" assertion failure, but other - failures were possible. Many issues reported; see [Core #6340](https://github.com/realm/realm-core/issues/6340). - (since 10.35.0) -* `Realm.Configuration.maximumNumberOfActiveVersions` now handles intermediate - versions which have been cleaned up correctly and checks the number of live - versions rather than the number of versions between the oldest live version - and current version (since 10.35.0). -* If the client disconnected between uploading a change to flexible sync - subscriptions and receiving the new object data from the server resulting - from that subscription change, the next connection to the server would - sometimes result in a client reset - ([Core #6966](https://github.com/realm/realm-core/issues/6966), since v10.21.1). - -### Deprecations - -* `RLMApp` has `localAppName` and `localAppVersion` fields which never ended up - being used for anything and are now deprecated. -* `RLMSyncAuthError` has not been used since v10.0.0 and is now deprecated. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 7. - -### Internal - -* Upgraded realm-core from 13.17.1 to 13.20.1 - -10.42.1 Release notes (2023-08-28) -============================================================= - -### Fixed - -* The names of the prebuilt zips for SPM have changed to avoid having Carthage - download them instead of the intended Carthage zip - ([#8326](https://github.com/realm/realm-swift/issues/8326), since v10.42.0). -* The prebuild Realm.xcframework for SwiftPM now has all platforms other than - visionOS built with Xcode 14 to comply with app store rules - ([#8339](https://github.com/realm/realm-swift/issues/8339), since 10.42.0). -* Fix visionOS compilation with Xcode beta 7. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 7. - -10.42.0 Release notes (2023-07-30) -============================================================= - -### Enhancements - -* Add support for building for visionOS and add Xcode 15 binaries to the - release package. visionOS currently requires installing Realm via either - Swift Package Manager or by using a XCFramework as CocoaPods and Carthage do - not yet support it. -* Zips compatible with SPM's `.binaryTarget()` are now published as part of the - releases on Github. -* Prebuilt XCFrameworks are now built with LTO enabled. This has insignificant - performance benefits, but cuts the size of the library by ~15%. - -### Fixed - -* Fix nested properties observation on a `Projections` not notifying when there is a property change. - ([#8276](https://github.com/realm/realm-swift/issues/8276), since v10.34.0). -* Fix undefined symbol error for `UIKit` when linking Realm to a framework using SPM. - ([#8308](https://github.com/realm/realm-swift/issues/8308), since v10.41.0) -* If the app crashed at exactly the wrong time while opening a freshly - compacted Realm the file could be left in an invalid state - ([Core #6807](https://github.com/realm/realm-core/pull/6807), since v10.33.0). -* Sync progress for DOWNLOAD messages was sometimes stored incorrectly, - resulting in an extra round trip to the server. - ([Core #6827](https://github.com/realm/realm-core/issues/6827), since v10.31.0) - -### Breaking Changes - -* Legacy non-xcframework Carthage installations are no longer supported. Please - ensure you are using `--use-xcframeworks` if installing via Carthage. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 5. - -### Internal - -* Upgraded realm-core from 13.17.0 to 13.17.1 -* Release packages were being uploaded to several static.realm.io URLs which - are no longer linked to anywhere. These are no longer being updated, and - release packages are now only being uploaded to Github. - -10.41.1 Release notes (2023-07-17) -============================================================= - -### Enhancements - -* Filesystem errors now include more information in the error message. -* Sync connection and session reconnect timing/backoff logic has been reworked - and unified into a single implementation. Previously some categories of errors - would cause an hour-long wait before attempting to reconnect, while others - would use an exponential backoff strategy. All errors now result in the sync - client waiting for 1 second before retrying, doubling the wait after each - subsequent failure up to a maximum of five minutes. If the cause of the error - changes, the backoff will be reset. If the sync client voluntarily disconnects, - no backoff will be used. ([Core #6526]((https://github.com/realm/realm-core/pull/6526))) - -### Fixed - -* Removed warnings for deprecated APIs internal use. - ([#8251](https://github.com/realm/realm-swift/issues/8251), since v10.39.0) -* Fix an error during async open and client reset if properties have been added - to the schema. This fix also applies to partition-based to flexible sync - migration if async open is used. ([Core #6707](https://github.com/realm/realm-core/issues/6707), since v10.28.2) - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 4. - -### Internal - -* Upgraded realm-core from 13.15.1 to 13.17.0 -* The location where prebuilt core binaries are published has changed slightly. - If you are using `REALM_BASE_URL` to mirror the binaries, you may need to - adjust your mirroring logic. - -10.41.0 Release notes (2023-06-26) -============================================================= - -### Enhancements - -* Add support for multiplexing sync connections. When enabled (the default), a single - connection is used per sync user rather than one per synchronized Realm. This - reduces resource consumption when multiple Realms are opened and will - typically improve performance ([PR #8282](https://github.com/realm/realm-swift/pull/8282)). -* Sync timeout options can now be set on `RLMAppConfiguration` along with the - other app-wide configuration settings ([PR #8282](https://github.com/realm/realm-swift/pull/8282)). - -### Fixed - -* Import as `RLMRealm_Private.h` as a module would cause issues when using Realm as a subdependency. - ([#8164](https://github.com/realm/realm-swift/issues/8164), since 10.37.0) -* Disable setting a custom logger by default on the sync client when the sync manager is created. - This was overriding the default logger set using `RLMLogger.defaultLogger`. (since v10.39.0). - -### Breaking Changes - -* The `RLMSyncTimeouts.appConfiguration` property has been removed. This was an - unimplemented read-only property which did not make any sense on the - containing type ([PR #8282](https://github.com/realm/realm-swift/pull/8282)). - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 2. - -### Internal - -* Upgraded realm-core from 13.15.0 to 13.15.1 - -10.40.2 Release notes (2023-06-09) -============================================================= - -### Enhancements - -* `Actor.preconditionIsolated()` is now used for runtime actor checking when - available (i.e. building with Xcode 15 and running on iOS 17) rather than the - less reliable workaround. - -### Fixed - -* If downloading the fresh Realm file failed during a client reset on a - flexible sync Realm, the sync client would crash the next time the Realm was - opened. ([Core #6494](https://github.com/realm/realm-core/issues/6494), since v10.28.2) -* If the order of properties in the local class definitions did not match the - order in the server-side schema, the before-reset Realm argument passed to a - client reset handler would have an invalid schema and likely crash if any - data was read from it. ([Core #6693](https://github.com/realm/realm-core/issues/6693), since v10.40.0) - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 1. - -### Internal - -* Upgraded realm-core from 13.13.0 to 13.15.0. -* The prebuilt library used for CocoaPods installations is now built with Xcode - 14. This should not have any observable effects other than the download being - much smaller due to no longer including bitcode. - -10.40.1 Release notes (2023-06-06) -============================================================= - -### Enhancements - -* Fix compilation with Xcode 15. Note that iOS 12 is the minimum supported - deployment target when using Xcode 15. -* Switch to building the Carthage release with Xcode 14.3.1. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 1. - -### Internal - -* Overhauled SDK metrics collection to better drive future development efforts. - -10.40.0 Release notes (2023-05-26) -============================================================= - -Drop support for Xcode 13 and add Xcode 14.3.1. Xcode 14.1 is now the minimum -supported version. - -### Enhancements - -* Adjust the error message for private `Object` subclasses and subclasses - nested inside other types to explain how to make them work rather than state - that it's impossible. ([#5662](https://github.com/realm/realm-cocoa/issues/5662)). -* Improve performance of SectionedResults. With a single section it is now ~10% - faster, and the runtime of sectioning no longer scales significantly with - section count, giving >100% speedups when there are large numbers of sections - ([Core #6606](https://github.com/realm/realm-core/pull/6606)). -* Very slightly improve performance of runtime thread checking on the main - thread. ([Core #6606](https://github.com/realm/realm-core/pull/6606)) - -### Fixed - -* Allow support for implicit boolean queries on Swift's Type Safe Queries API - ([#8212](https://github.com/realm/realm-swift/issues/8212)). -* Fixed a fatal error (reported to the sync error handler) during client reset - or automatic partition-based to flexible sync migration if the reset has been - triggered during an async open and the schema being applied has added new - classes. Due to this bug automatic flexibly sync migration has been disabled - for older releases and this is now the minimum version required. - ([#6601](https://github.com/realm/realm-core/issues/6601), since automatic - client resets were introduced in v10.25.0) -* Dictionaries sometimes failed to map unresolved links to nil. If the target - of a link in a dictionary was deleted by another sync client, reading that - field from the dictionary would sometimes give an invalid object rather than - nil. In addition, queries on dictionaries would sometimes have incorrect - results. ([Core #6644](https://github.com/realm/realm-core/pull/6644), since v10.8.0) -* Older versions of Realm would sometimes fail to properly mark objects as - being the target of an incoming link from another object. When this happened, - deleting the target object would hit an assertion failure due to the - inconsistent state. We now reconstruct a valid state rather than crashing. - ([Core #6585](https://github.com/realm/realm-core/issues/6585), since v5.0.0) -* Fix several UBSan failures which did not appear to result in functional bugs - ([Core #6649](https://github.com/realm/realm-core/pull/6649)). -* Using both synchronous and asynchronous transactions on the same thread or - scheduler could hit the assertion failure "!realm.is_in_transaction()" if one - of the callbacks for an asynchronous transaction happened to be scheduled - during a synchronous transaction - ([Core #6659](https://github.com/realm/realm-core/issues/6659), since v10.26.0) -* The stored deployment location for Apps was not being updated correctly after - receiving a redirect response from the server, resulting in every connection - attempting to connect to the old URL and getting redirected rather than only - the first connection after the deployment location changed. - ([Core #6630](https://github.com/realm/realm-core/issues/6630), since v10.38.2) - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-14.3.1. - -### Internal - -* Upgraded realm-core from 13.10.1 to 13.13.0. - -10.39.1 Release notes (2023-05-05) -============================================================= - -### Enhancements - -* New notifiers can now be registered in write transactions until changes have - actually been made in the write transaction. This makes it so that new - notifications can be registered inside change notifications triggered by - beginning a write transaction (unless a previous callback performed writes). - ([#4818](https://github.com/realm/realm-swift/issues/4818)). -* Reduce the memory footprint of an automatic (discard or recover) client reset - when there are large incoming changes from the server. - ([Core #6567](https://github.com/realm/realm-core/issues/6567)). - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from 13.10.0 to 13.10.1. - -10.39.0 Release notes (2023-05-03) -============================================================= - -### Enhancements - -* Add support for actor-isolated Realms, opened with `try await Realm(actor: actor)`. - - Rather than being confined to the current thread or a dispatch queue, - actor-isolated Realms are isolated to an actor. This means that they can be - used from any thread as long as it's within a function isolated to that - actor, and they remain valid over suspension points where a task may hop - between threads. Actor-isolated Realms can be used with either global or - local actors: - - ```swift - @MainActor function mainThreadFunction() async throws { - // These are identical: the async init continues to produce a - // MainActor-confined Realm if no actor is supplied - let realm1 = try await Realm() - let realm2 = try await Realm(MainActor.shared) - } - - // A simple example of a custom global actor - @globalActor actor BackgroundActor: GlobalActor { - static var shared = BackgroundActor() - } - - @BackgroundActor backgroundThreadFunction() async throws { - // Explicitly specifying the actor is required for everything but MainActor - let realm = try await Realm(actor: BackgroundActor.shared) - try await realm.write { - _ = realm.create(MyObject.self) - } - // Thread-confined Realms would sometimes throw an exception here, as we - // may end up on a different thread after an `await` - print("\(realm.objects(MyObject.self).count)") - } - - actor MyActor { - // An implicitly-unwrapped optional is used here to let us pass `self` to - // `Realm(actor:)` within `init` - var realm: Realm! - init() async throws { - realm = try await Realm(actor: self) - } - - var count: Int { - realm.objects(MyObject.self).count - } - - func create() async throws { - try await realm.asyncWrite { - realm.create(MyObject.self) - } - } - } - - // This function isn't isolated to the actor, so each operation has to be async - func createObjects() async throws { - let actor = try await MyActor() - for _ in 0..<5 { - await actor.create() - } - print("\(await actor.count)") - } - - // In an isolated function, an actor-isolated Realm can be used synchronously - func createObjects(in actor: isolated MyActor) async throws { - await actor.realm.write { - actor.realm.create(MyObject.self) - } - print("\(actor.realm.objects(MyObject.self).count)") - } - ``` - - Actor-isolated Realms come with a more convenient syntax for asynchronous - writes. `try await realm.write { ... }` will suspend the current task, - acquire the write lock without blocking the current thread, and then invoke - the block. The actual data is then written to disk on a background thread, - and the task is resumed once that completes. As this does not block the - calling thread while waiting to write and does not perform i/o on the calling - thread, this will often be safe to use from `@MainActor` functions without - blocking the UI. Sufficiently large writes may still benefit from being done - on a background thread. - - Asynchronous writes are only supported for actor-isolated Realms or in - `@MainActor` functions. - - Actor-isolated Realms require Swift 5.8 (Xcode 14.3). Enabling both strict - concurrency checking (`SWIFT_STRICT_CONCURRENCY=complete` in Xcode) and - runtime actor data race detection (`OTHER_SWIFT_FLAGS=-Xfrontend - -enable-actor-data-race-checks`) is strongly recommended when using - actor-isolated Realms. -* Add support for automatic partition-based to flexible sync migration. - Connecting to a server-side app configured to use flexible sync with a - client-side partition-based sync configuration is now supported, and will - automatically create the appropriate flexible sync subscriptions to subscribe - to the requested partition. This allows changing the configuration on the - server from partition-based to flexible without breaking existing clients. - ([Core #6554](https://github.com/realm/realm-core/issues/6554)) -* Now you can use an array `[["_id": 1], ["breed": 0]]` as sorting option for a - MongoCollection. This new API fixes the issue where the resulting documents - when using more than one sort parameter were not consistent between calls. - ([#7188](https://github.com/realm/realm-swift/issues/7188), since v10.0.0). -* Add support for adding a user created default logger, which allows implementing your own logging logic - and the log threshold level. - You can define your own logger creating an instance of `Logger` and define the log function which will be - invoked whenever there is a log message. - - ```swift - let logger = Logger(level: .all) { level, message in - print("Realm Log - \(level): \(message)") - } - ``` - - Set this custom logger as Realm default logger using `Logger.shared`. - ```swift - Logger.shared = logger - ``` -* It is now possible to change the default log threshold level at any point of the application's lifetime. - ```swift - Logger.shared.logLevel = .debug - ``` - This will override the log level set anytime before by a user created logger. -* We have set `.info` as the default log threshold level for Realm. You will now see some - log message in your console. To disable use `Logger.shared.level = .off`. - -### Fixed - -* Several schema initialization functions had incorrect `@MainActor` - annotations, resulting in runtime warnings if the first time a Realm was - opened was on a background thread - ([#8222](https://github.com/realm/realm-swift/issues/8222), since v10.34.0). - -### Deprecations - -* `App.SyncManager.logLevel` and `App.SyncManager.logFunction` are deprecated in favour of - setting a default logger. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from v13.9.4 to v13.10.0. - -10.38.3 Release notes (2023-04-28) -============================================================= - -### Enhancements - -* Improve performance of cancelling a write transactions after making changes. - If no KVO observers are used this is now constant time rather than taking - time proportional to the number of changes to be rolled back. Cancelling a - write transaction with KVO observers is 10-20% faster. ([Core PR #6513](https://github.com/realm/realm-core/pull/6513)). - -### Fixed - -* Performing a large number of queries without ever performing a write resulted - in steadily increasing memory usage, some of which was never fully freed due - to an unbounded cache ([#7978](https://github.com/realm/realm-swift/issues/7978), since v10.27.0). - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from 13.9.3 to 13.9.4 - -10.38.2 Release notes (2023-04-25) -============================================================= - -### Enhancements - -* Improve performance of equality queries on a non-indexed AnyRealmValue - property by about 30%. ([Core #6506](https://github.com/realm/realm-core/issues/6506)) - -### Fixed - -* SSL handshake errors were treated as fatal errors rather than errors which - should be retried. ([Core #6434](https://github.com/realm/realm-core/issues/6434), since v10.35.0) - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from 13.9.0 to 13.9.3. - -10.38.1 Release notes (2023-04-25) -============================================================= - -### Fixed - -* The error handler set on EventsConfiguration was not actually used (since v10.26.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -10.38.0 Release notes (2023-03-31) -============================================================= - -Switch to building the Carthage release with Xcode 14.3. - -### Enhancements - -* Add Xcode 14.3 binaries to the release package. Note that CocoaPods 1.12.0 - does not support Xcode 14.3. -* Add support for sharing encrypted Realms between multiple processes. - ([Core #1845](https://github.com/realm/realm-core/issues/1845)) - -### Fixed - -* Fix a memory leak reported by Instruments on `URL.path` in - `Realm.Configuration.fileURL` when using a string partition key in Partition - Based Sync ([#8195](https://github.com/realm/realm-swift/pull/8195)), since v10.0.0). -* Fix a data race in version management. If one thread committed a write - transaction which increased the number of live versions above the previous - highest seen during the current session at the same time as another thread - began a read, the reading thread could read from a no-longer-valid memory - mapping. This could potentially result in strange crashes when opening, - refreshing, freezing or thawing a Realm - ([Core #6411](https://github.com/realm/realm-core/pull/6411), since v10.35.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from 13.8.0 to 13.9.0. - -10.37.2 Release notes (2023-03-29) -============================================================= - -### Fixed - -* Copying a `RLMRealmConfiguration` failed to copy several fields. This - resulted in migrations being passed the incorrect object type in Swift when - using the default configuration (since v10.34.0) or async open (since - v10.37.0). This also broke using the Events API in those two scenarios (since - v10.26.0 for default configuration and v10.37.0 for async open). ([#8190](https://github.com/realm/realm-swift/issues/8190)) - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -10.37.1 Release notes (2023-03-27) -============================================================= - -### Enhancements - -* Performance improvement for the following queries ([Core #6376](https://github.com/realm/realm-core/issues/6376)): - * Significant (~75%) improvement when counting (`Results.count`) the number - of exact matches (with no other query conditions) on a - string/int/UUID/ObjectID property that has an index. This improvement - will be especially noticiable if there are a large number of results - returned (duplicate values). - * Significant (~99%) improvement when querying for an exact match on a Date - property that has an index. - * Significant (~99%) improvement when querying for a case insensitive match - on an AnyRealmValue property that has an index. - * Moderate (~25%) improvement when querying for an exact match on a Bool - property that has an index. - * Small (~5%) improvement when querying for a case insensitive match on an - AnyRealmValue property that does not have an index. - -### Fixed - -* Add missing `@Sendable` annotations to several sync and app services related - callbacks ([PR #8169](https://github.com/realm/realm-swift/pull/8169), since v10.34.0). -* Fix some bugs in handling task cancellation for async Realm init. Some very - specific timing windows could cause crashes, and the download would not be - cancelled if the Realm was already open ([PR #8178](https://github.com/realm/realm-swift/pull/8178), since v10.37.0). -* Fix a crash when querying an AnyRealmValue property with a string operator - (contains/like/beginswith/endswith) or with case insensitivity. - ([Core #6376](https://github.com/realm/realm-core/issues/6376), since v10.8.0) -* Querying for case-sensitive equality of a string on an indexed AnyRealmValue - property was returning case insensitive matches. For example querying for - `myIndexedAny == "Foo"` would incorrectly match on values of "foo" or "FOO" etc. - ([Core #6376](https://github.com/realm/realm-core/issues/6376), since v10.8.0) -* Adding an index to an AnyRealmValue property when objects of that type - already existed would crash with an assertion. - ([Core #6376](https://github.com/realm/realm-core/issues/6376), since v10.8.0). -* Fix a bug that may have resulted in arrays being in different orders on - different devices. Some cases of “Invalid prior_size” may be fixed too. - ([Core #6191](https://github.com/realm/realm-core/issues/6191), since v10.25.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -### Internal - -* Upgraded realm-core from 13.6.0 to 13.8.0 - -10.37.0 Release notes (2023-03-09) -============================================================= - -### Enhancements - -* `MongoCollection.watch().subscribe(on:)` now supports any swift Scheduler - rather than only dispatch queues ([PR #8131](https://github.com/realm/realm-swift/pull/8130)). -* Add an async sequence wrapper for `MongoCollection.watch()`, allowing you to - do `for try await change in collection.changeEvents { ... }` - ([PR #8131](https://github.com/realm/realm-swift/pull/8130)). -* The internals of error handling and reporting have been significantly - reworked. The visible effects of this are that some errors which previously - had unhelpful error messages now include more detail about what went wrong, - and App errors now expose a much more complete set of error codes - ([PR #8002](https://github.com/realm/realm-swift/pull/8002)). -* Expose compensating write error information. When the server rejects a - modification made by the client (such as if the user does not have the - required permissions), a `SyncError` is delivered to the sync error handler - with the code `.writeRejected` and a non-nil `compensatingWriteInfo` field - which contains information about what was rejected and why. This information - is intended primarily for debugging and logging purposes and may not have a - stable format. ([PR #8002](https://github.com/realm/realm-swift/pull/8002)) -* Async `Realm.init()` now handles Task cancellation and will cancel the async - open if the Task is cancelled ([PR #8148](https://github.com/realm/realm-swift/pull/8148)). -* Cancelling async opens now has more consistent behavior. The previously - intended and documented behavior was that cancelling an async open would - result in the callback associated with the specific task that was cancelled - never being called, and all other pending callbacks would be invoked with an - ECANCELED error. This never actually worked correctly, and the callback which - was not supposed to be invoked at all sometimes would be. We now - unconditionally invoke all of the exactly once, passing ECANCELED to all of - them ([PR #8148](https://github.com/realm/realm-swift/pull/8148)). - -### Fixed - -* `UserPublisher` incorrectly bounced all notifications to the main thread instead - of setting up the Combine publisher to correctly receive on the main thread. - ([#8132](https://github.com/realm/realm-swift/issues/8132), since 10.21.0) -* Fix warnings when building with Xcode 14.3 beta 2. -* Errors in async open resulting from invalid queries in `initialSubscriptions` - would result in the callback being invoked with both a non-nil Realm and a - non-nil Error even though the Realm was in an invalid state. Now only the - error is passed to the callback ([PR #8148](https://github.com/realm/realm-swift/pull/8148), since v10.28.0). -* Converting a local realm to a synced realm would crash if an embedded object - was null ([Core #6294](https://github.com/realm/realm-core/issues/6294), since v10.22.0). -* Subqueries on indexed properties performed extremely poorly. ([Core #6327](https://github.com/realm/realm-core/issues/6327), since v5.0.0) -* Fix a crash when a SSL read successfully read a non-zero number of bytes and - also reported an error. ([Core #5435](https://github.com/realm/realm-core/issues/5435), since 10.0.0) -* The sync client could get stuck in an infinite loop if the server sent an - invalid changeset which caused a transform error. This now results in a - client reset instead. ([Core #6051](https://github.com/realm/realm-core/issues/6051), since v10.0.0) -* Strings in queries which contained any characters which required multiple - bytes when encoded as utf-8 were incorrectly encoded as binary data when - serializing the query to send it to the server for a flexible sync - subscription, resulting the server rejecting the query - ([Core #6350](https://github.com/realm/realm-core/issues/6350), since 10.22.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -### Internal - -* Upgraded realm-core from 13.4.1 to 13.6.0 - -10.36.0 Release notes (2023-02-15) -============================================================= - -### Enhancements - -* Add support for multiple overlapping or nested event scopes. - `Events.beginScope()` now returns a `Scope` object which is used to commit or - cancel that scope, and if more than one scope is active at a time events are - reported to all active scopes. - -### Fixed - -* Fix moving `List` items to a higher index in SwiftUI results in wrong destination index - ([#7956](https://github.com/realm/realm-swift/issues/7956), since v10.6.0). -* Using the `searchable` view modifier with `@ObservedResults` in iOS 16 would - cause the collection observation subscription to cancel. - ([#8096](https://github.com/realm/realm-swift/issues/8096), since 10.21.0) -* Client reset with recovery would sometimes crash if the recovery resurrected - a dangling link ([Core #6292](https://github.com/realm/realm-core/issues/6292), since v10.32.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -### Internal - -* Upgraded realm-core from 13.4.0 to 13.4.1 - -10.35.1 Release notes (2023-02-10) -============================================================= - -### Fixed - -* Client reset with recovery would crash if a client reset occurred the very - first time the Realm was opened with async open. The client reset callbacks - are now not called if the Realm had never been opened before - ([PR #8125](https://github.com/realm/realm-swift/pull/8125), since 10.32.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -10.35.0 Release notes (2023-02-07) -============================================================= - -This version bumps the Realm file format version to 23. Realm files written by -this version cannot be read by older versions of Realm. - -### Enhancements - -* The Realm file is now automatically shrunk if the file size is larger than - needed to store all of the data. ([Core PR #5755](https://github.com/realm/realm-core/pull/5755)) -* Pinning old versions (either with frozen Realms or with Realms on background - threads that simply don't get refreshed) now only prevents overwriting the - data needed by that version, rather than the data needed by that version and - all later versions. In addition, frozen Realms no longer pin the transaction - logs used to drive change notifications. This mostly eliminates the file size - growth caused by pinning versions. ([Core PR #5440](https://github.com/realm/realm-core/pull/5440)) -* Rework how Dictionaries/Maps are stored in the Realm file. The new design uses - less space and is typically significantly faster. This changes the iteration - order of Maps, so any code relying on that may be broken. We continue - to make no guarantees about iteration order on Maps ([Core #5764](https://github.com/realm/realm-core/issues/5764)). -* Improve performance of freezing Realms ([Core PR #6211](https://github.com/realm/realm-core/pull/6211)). - -### Fixed - -* Fix a crash when using client reset with recovery and flexible sync with a - single subscription ([Core #6070](https://github.com/realm/realm-core/issues/6070), since v10.28.2) -* Encrypted Realm files could not be opened on devices with a larger page size - than the one which originally wrote the file. - ([#8030](https://github.com/realm/realm-swift/issues/8030), since v10.32.1) -* Creating multiple flexible sync subscriptions at once could hit an assertion - failure if the server reported an error for any of them other than the last - one ([Core #6038](https://github.com/realm/realm-core/issues/6038), since v10.21.1). -* `Set` and `List` considered a string and binary - data containing that string encoded as UTF-8 to be equivalent. This could - result in a List entry not changing type on assignment and for the client be - inconsistent with the server if a string and some binary data with equivalent - content was inserted from Atlas. - ([Core #4860](https://github.com/realm/realm-core/issues/4860) and - [Core #6201](https://github.com/realm/realm-core/issues/6201), since v10.8.0) -* Querying for NaN on Decimal128 properties did not match any objects - ([Core #6182](https://github.com/realm/realm-core/issues/6182), since v10.8.0). -* When client reset with recovery is used and the recovery did not need to - make any changes to the local Realm, the sync client could incorrectly think - the recovery failed and report the error "A fatal error occured during client - reset: 'A previous 'Recovery' mode reset from did not succeed, - giving up on 'Recovery' mode to prevent a cycle'". - ([Core #6195](https://github.com/realm/realm-core/issues/6195), since v10.32.0) -* Fix a crash when using client reset with recovery and flexible sync with a - single subscription ([Core #6070](https://github.com/realm/realm-core/issues/6070), since v10.28.2) -* Writing to newly in-view objects while a flexible sync bootstrap was in - progress would not synchronize those changes to the server - ([Core #5804](https://github.com/realm/realm-core/issues/5804), since v10.21.1). -* If a client reset with recovery or discard local was interrupted while the - "fresh" realm was being downloaded, the sync client could crash with a - MultpleSyncAgents exception ([Core #6217](https://github.com/realm/realm-core/issues/6217), since v10.25.0). -* Sharing Realm files between a Catalyst app and Realm Studio did not properly - synchronize access to the Realm file ([Core #6258](https://github.com/realm/realm-core/pull/6258), since v10.0.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -### Internal - -* Upgraded realm-core from 12.13.0 to 13.4.0 - -10.34.1 Release notes (2023-01-20) -============================================================= - -### Fixed - -* Add some missing `@preconcurrency` annotations which lead to build failures - with Xcode 14.0 when importing via SPM or CocoaPods - ([#8104](https://github.com/realm/realm-swift/issues/8104), since v10.34.0). - -### Compatibility - -* Realm Studio: 11.0.0 - 12.0.0. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -10.34.0 Release notes (2023-01-13) -============================================================= - -Swift 5.5 is no longer supported. Swift 5.6 (Xcode 13.3) is now the minimum -supported version. - -The prebuilt binary for Carthage is now build with Xcode 14.2. - -### Enhancements - -* Improve performance of creating Projection objects and of change - notifications on projections ([PR #8050](https://github.com/realm/realm-swift/pull/8050)). -* Allow initialising any sync configuration with `cancelAsyncOpenOnNonFatalErrors`. -* Improve performance of Combine value publishers which do not use the - object/collection changesets a little. -* All public types have been audited for sendability and are now marked as - Sendable when applicable. A few types which were incidentally not thread-safe - but make sense to use from multiple threads are now thread-safe. -* Add support for building Realm with strict concurrency checking enabled. - -### Fixed - -* Fix bad memory access exception that can occur when watching change streams. - [PR #8039](https://github.com/realm/realm-swift/pull/8039). -* Object change notifications on projections only included the first projected - property for each source property ([PR #8050](https://github.com/realm/realm-swift/pull/8050), since v10.21.0). -* `@AutoOpen` failed to open flexible sync Realms while offline - ([#7986](https://github.com/realm/realm-swift/issues/7986), since v10.27.0). -* Fix "Publishing changes from within view updates is not allowed" warnings - when using `@ObservedResults` or `@ObservedSectionedResults` - ([#7908](https://github.com/realm/realm-swift/issues/7908)). -* Fix "Publishing changes from within view updates is not allowed" warnings - when using `@AutoOpen` or `@AsyncOpen`. - ([#7908](https://github.com/realm/realm-swift/issues/7908)). -* Defer `Realm.asyncOpen` execution on `@AsyncOpen` and `@AutoOpen` property - wrappers until all the environment values are set. This will guarantee the - configuration and partition value are set set before opening the realm. - ([#7931](https://github.com/realm/realm-swift/issues/7931), since v10.12.0). -* `@ObservedResults.remove()` could delete the wrong object if a write on a - background thread which changed the index of the object being removed - occurred at a very specific time (since v10.6.0). - -### Compatibility - -* Realm Studio: 11.0.0 - 12.0.0. 13.0.0 is currently incompatible. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -10.33.0 Release notes (2022-12-01) -============================================================= - -### Enhancements - -* Flexible sync subscription state will change to - `SyncSubscriptionState.pending` (`RLMSyncSubscriptionStatePending`) while - waiting for the server to have sent all pending history after a bootstrap and - before marking a subscription as Complete. - ([#5795](https://github.com/realm/realm-core/pull/5795)) -* Add custom column names API, which allows to set a different column name in the realm - from the one used in your object declaration. - ```swift - class Person: Object { - @Persisted var firstName: String - @Persisted var birthDate: Date - @Persisted var age: Int - - override class public func propertiesMapping() -> [String: String] { - ["firstName": "first_name", - "birthDate": "birth_date"] - } - } - ``` - This is very helpful in cases where you want to name a property differently - from your `Device Sync` JSON schema. - This API is only available for old and modern object declaration syntax on the - `RealmSwift` SDK. -* Flexible sync bootstraps now apply 1MB of changesets per write transaction - rather than applying all of them in a single write transaction. - ([Core PR #5999](https://github.com/realm/realm-core/pull/5999)). - -### Fixed - -* Fix a race condition which could result in "operation cancelled" errors being - delivered to async open callbacks rather than the actual sync error which - caused things to fail ([Core PR #5968](https://github.com/realm/realm-core/pull/5968), since the introduction of async open). -* Fix database corruption issues which could happen if an application was - terminated at a certain point in the process of comitting a write - transaciton. ([Core PR #5993](https://github.com/realm/realm-core/pull/5993), since v10.21.1) -* `@AsyncOpen` and `@AutoOpen` would begin and then cancel a second async open - operation ([PR #8038](https://github.com/realm/realm-swift/pull/8038), since v10.12.0). -* Changing the search text when using the searchable SwiftUI extension would - trigger multiple updates on the View for each change - ([PR #8038](https://github.com/realm/realm-swift/pull/8038), since v10.19.0). -* Changing the filter or search properties of an `@ObservedResults` or - `@ObservedSectionedResults` would trigger up to three updates on the View - ([PR #8038](https://github.com/realm/realm-swift/pull/8038), since v10.6.0). -* Fetching a user's profile while the user logs out would result in an - assertion failure. ([Core PR #6017](https://github.com/realm/realm-core/issues/5571), since v10.8.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -### Internal - -* Upgraded realm-core from 12.11.0 to 12.13.0 - -10.32.3 Release notes (2022-11-10) -============================================================= - -### Fixed - -* Fix name lookup errors when importing Realm Swift built in library evolution - mode (([#8014](https://github.com/realm/realm-swift/issues/8014)). -* The prebuilt watchOS library in the objective-c release package was missing - an arm64 slice. The Swift release package was uneffected - ([PR #8016](https://github.com/realm/realm-swift/pull/8016)). -* Fix issue where `RLMUserAPIKey.key`/`UserAPIKey.key` incorrectly returned the name of the API - key instead of the key itself. ([#8021](https://github.com/realm/realm-swift/issues/8021), since v10.0.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -10.32.2 Release notes (2022-11-01) -============================================================= - -Switch to building the Carthage release with Xcode 14.1. - -### Fixed - -* Fix linker errors when building a release build with Xcode 14.1 when - installing via SPM ([#7995](https://github.com/realm/realm-swift/issues/7995)). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -10.32.1 Release notes (2022-10-25) -============================================================= - -### Enhancements - -* Improve performance of client reset with automatic recovery and converting - top-level tables into embedded tables ([Core #5897](https://github.com/realm/realm-core/pull/5897)). -* `Realm.Error` is now a typealias for `RLMError` rather than a - manually-defined version of what the automatic bridging produces. This should - have no effect on existing working code, but the manual definition was - missing a few things supplied by the automatic bridging. -* Some sync errors sent by the server include a link to the server-side logs - associated with that error. This link is now exposed in the `serverLogURL` - property on `SyncError` (or `RLMServerLogURLKey` userInfo field when using NSError). - -### Fixed - -* Many sync and app errors were reported using undocumented internal error - codes and/or domains and could not be progammatically handled. Some notable - things which now have public error codes instead of unstable internal ones: - - `Realm.Error.subscriptionFailed`: The server rejected a flexible sync subscription. - - `AppError.invalidPassword`: A login attempt failed due to a bad password. - - `AppError.accountNameInUse`: A registration attempt failed due to the account name being in use. - - `AppError.httpRequestFailed`: A HTTP request to Atlas App Services - completed with an error HTTP code. The failing code is available in the - `httpStatusCode` property. - - Many other less common error codes have been added to `AppError`. - - All sync errors other than `SyncError.clientResetError` reported incorrect - error codes. - (since v10.0.0). -* `UserAPIKey.objectId` was incorrectly bridged to Swift as `RLMObjectId` to - `ObjectId`. This may produce warnings about an unneccesary cast if you were - previously casting it to the correct type (since v10.0.0). -* Fixed an assertion failure when observing change notifications on a sectioned - result, if the first modification was to a linked property that did not cause - the state of the sections to change. - ([Core #5912](https://github.com/realm/realm-core/issues/5912), - since the introduction of sectioned results in v10.29.0) -* Fix a use-after-free if the last external reference to an encrypted - synchronized Realm was closed between when a client reset error was received - and when the download of the new Realm began. - ([Core #5949](https://github.com/realm/realm-core/pull/5949), since 10.28.4). -* Fix an assertion failure during client reset with recovery when recovering - a list operation on an embedded object that has a link column in the path - prefix to the list from the top level object. - ([Core #5957](https://github.com/realm/realm-core/issues/5957), - since introduction of automatic recovery in v10.32.0). -* Creating a write transaction which is rejected by the server due to it - exceeding the maximum transaction size now results in a client reset error - instead of synchronization breaking and becoming stuck forever - ([Core #5209](https://github.com/realm/realm-core/issues/5209), since v10). -* Opening an unencrypted file with an encryption key would sometimes report a - misleading error message that indicated that the problem was something other - than a decryption failure ([Core #5915](https://github.com/realm/realm-core/pull/5915), since 0.89.0). -* Fix a rare deadlock which could occur when closing a synchronized Realm - immediately after committing a write transaction when the sync worker thread - has also just finished processing a changeset from the server - ([Core #5948](https://github.com/realm/realm-core/pull/5948)). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.0.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -### Internal - -* Upgraded realm-core from 12.9.0 to 12.11.0. - -10.32.0 Release notes (2022-10-10) -============================================================= - -### Enhancements - -* Add `.recoverUnsyncedChanges` (`RLMClientResetModeRecoverUnsyncedChanges`) and -`.recoverOrDiscardUnsyncedChanges` (`RLMClientResetModeRecoverOrDiscardUnsyncedChanges`) behaviors to `ClientResetMode` (`RLMClientResetMode`). - - The newly added recover modes function by downloading a realm which reflects the latest - state of the server after a client reset. A recovery process is run locally in an - attempt to integrate the server state with any local changes from before the - client reset occurred. - The changes are integrated with the following rules: - 1. Objects created locally that were not synced before client reset, will be integrated. - 2. If an object has been deleted on the server, but was modified on the client, the delete takes precedence and the update is discarded. - 3. If an object was deleted on the client, but not the server, then the client delete instruction is applied. - 4. In the case of conflicting updates to the same field, the client update is applied. - - The client reset process will fallback to `ClientResetMode.discardUnsyncedChanges` if the recovery process fails in `.recoverOrDiscardUnsyncedChanges`. - - The client reset process will fallback to `ClientResetMode.manual` if the recovery process fails in `.recoverUnsyncedChanges`. - - The two new swift recovery modes support client reset callbacks: `.recoverUnsyncedChanges(beforeReset: ((Realm) -> Void)? = nil, afterReset: ((Realm, Realm) -> Void)? = nil)`. - - The two new Obj-C recovery modes support client reset callbacks in `notifyBeforeReset` - and `notifyAfterReset`for both `[RLMUser configurationWithPartitionValue]` and `[RLMUser flexibleSyncConfigurationWithClientResetMode]` - For more detail on client reset callbacks, see `ClientResetMode`, `RLMClientResetBeforeBlock`, - `RLMClientResetAfterBlock`, and the 10.25.0 changelog entry. -* Add two new additional interfaces to define a manual client reset handler: - - Add a manual callback handler to `ClientResetMode.manual` -> `ClientResetMode.manual(ErrorReportingBlock? = nil)`. - - Add the `RLMSyncConfiguration.manualClientResetHandler` property (type `RLMSyncErrorReportingBlock`). - - These error reporting blocks are invoked in the event of a `RLMSyncErrorClientResetError`. - - See `ErrorReportingBlock` (`RLMSyncErrorReportingBlock`), and `ClientResetInfo` for more detail. - - Previously, manual client resets were handled only through the `SyncManager.ErrorHandler`. You have the - option, but not the requirement, to define manual reset handler in these interfaces. - Otherwise, the `SyncManager.ErrorHandler` is still invoked during the manual client reset process. - - These new interfaces are only invoked during a `RLMSyncErrorClientResetError`. All other sync errors - are still handled in the `SyncManager.ErrorHandler`. - - See 'Breaking Changes' for information how these interfaces interact with an already existing - `SyncManager.ErrorHandler`. - -### Breaking Changes - -* The default `clientResetMode` (`RLMClientResetMode`) is switched from `.manual` (`RLMClientResetModeManual`) - to `.recoverUnsyncedChanges` (`RLMClientResetModeRecoverUnsyncedChanges`). - - If you are currently using `.manual` and continue to do so, the only change - you must explicitly make is designating manual mode in - your `Realm.Configuration.SyncConfiguration`s, since they will now default to `.recoverUnsyncedChanges`. - - You may choose to define your manual client reset handler in the newly - introduced `manual(ErrorReportingBlock? = nil)` - or `RLMSyncConfiguration.manualClientResetHandler`, but this is not required. - The `SyncManager.errorHandler` will still be invoked during a client reset if - no callback is passed into these new interfaces. - -### Deprecations - -* `ClientResetMode.discardLocal` is deprecated in favor of `ClientResetMode.discardUnsyncedChanges`. - The reasoning is that the name better reflects the effect of this reset mode. There is no actual - difference in behavior. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.0.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -10.31.0 Release notes (2022-10-05) -============================================================= - -The prebuilt binary for Carthage is now build with Xcode 14.0.1. - -### Enhancements - -* Cut the runtime of aggregate operations on large dictionaries in half - ([Core #5864](https://github.com/realm/realm-core/pull/5864)). -* Improve performance of aggregate operations on collections of objects by 2x - to 10x ([Core #5864](https://github.com/realm/realm-core/pull/5864)). - Greatly improve the performance of sorting or distincting a Dictionary's keys - or values. The most expensive operation is now performed O(log N) rather than - O(N log N) times, and large Dictionaries can see upwards of 99% reduction in - time to sort. ([Core #5166](https://github.com/realm/realm-core/pulls/5166)) -* Add support for changing the deployment location for Atlas Apps. Previously - this was assumed to be immutable ([Core #5648](https://github.com/realm/realm-core/issues/5648)). -* The sync client will now yield the write lock to other threads which are - waiting to perform a write transaction even if it still has remaining work to - do, rather than always applying all changesets received from the server even - when other threads are trying to write. ([Core #5844](https://github.com/realm/realm-core/pull/5844)). -* The sync client no longer writes an unused temporary copy of the changesets - received from the server to the Realm file ([Core #5844](https://github.com/realm/realm-core/pull/5844)). - -### Fixed - -* Setting a `List` property with `Results` no longer throws an unrecognized - selector exception (since 10.8.0-beta.2) -* `RLMProgressNotificationToken` and `ProgressNotificationToken` now hold a - strong reference to the sync session, keeping it alive until the token is - deallocated or invalidated, as the other notification tokens do. - ([#7831](https://github.com/realm/realm-swift/issues/7831), since v2.3.0). -* Results permitted some nonsensical aggregate operations on column types which - do not make sense to aggregate, giving garbage results rather than reporting - an error ([Core #5876](https://github.com/realm/realm-core/pull/5876), since v5.0.0). -* Upserting a document in a Mongo collection would crash if the document's id - type was anything other than ObjectId (since v10.0.0). -* Fix a use-after-free when a sync session is closed and the app is destroyed - at the same time ([Core #5752](https://github.com/realm/realm-core/issues/5752), - since v10.19.0). - -### Deprecations - -* `RLMUpdateResult.objectId` has been deprecated in favor of - `RLMUpdateResult.documentId` to support reporting document ids which are not - object ids. -### Breaking Changes -* Private API `_realmColumnNames` has been renamed to a new public API - called `propertiesMapping()`. This change only affects the Swift API - and doesn't have any effects in the obj-c API. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.0.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -### Internal - -* Upgraded realm-core from 12.7.0 to 12.9.0 - -10.30.0 Release notes (2022-09-20) -============================================================= - -### Fixed - -* Incoming links from `RealmAny` properties were not handled correctly when - migrating an object type from top-level to embedded. `RealmAny` properties - currently cannot link to embedded objects. - ([Core #5796](https://github.com/realm/realm-core/pull/5796), since 10.8.0). -* `Realm.refresh()` sometimes did not actually advance to the latest version. - It attempted to be semi-non-blocking in a very confusing way which resulted - in it sometimes advancing to a newer version that is not the latest version, - and sometimes blocking until notifiers are ready so that it could advance to - the latest version. This behavior was undocumented and didn't work correctly, - so it now always blocks if needed to advance to the latest version. - ([#7625](https://github.com/realm/realm-swift/issues/7625), since v0.98.0). -* Fix the most common cause of thread priority inversions when performing - writes on the main thread. If beginning the write transaction has to wait for - the background notification calculations to complete, that wait is now done - in a QoS-aware way. ([#7902](https://github.com/realm/realm-swift/issues/7902)) -* Subscribing to link properties in a flexible sync Realm did not work due to a - mismatch between what the client sent and what the server needed. - ([Core #5409](https://github.com/realm/realm-core/issues/5409)) -* Attempting to use `AsymmetricObject` with partition-based sync now reports a - sensible error much earlier in the process. Asymmetric sync requires using - flexible sync. ([Core #5691](https://github.com/realm/realm-core/issues/5691), since 10.29.0). -* Case-insensitive but diacritic-sensitive queries would crash on 4-byte UTF-8 - characters ([Core #5825](https://github.com/realm/realm-core/issues/5825), since v2.2.0) -* Accented characters are now handled by case-insensitive but - diacritic-sensitive queries. ([Core #5825](https://github.com/realm/realm-core/issues/5825), since v2.2.0) - -### Breaking Changes - -* `-[RLMASLoginDelegate authenticationDidCompleteWithError:]` has been renamed - to `-[RLMASLoginDelegate authenticationDidFailWithError:]` to comply with new - app store requirements. This only effects the obj-c API. - ([#7945](https://github.com/realm/realm-swift/issues/7945)) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1 - 14. - -### Internal - -* Upgraded realm-core from 12.6.0 to 12.7.0 - -10.29.0 Release notes (2022-09-09) -============================================================= - -### Enhancements - -* Add support for asymmetric sync. When a class inherits from - `AsymmetricObject`, objects created are synced unidirectionally to the server - and cannot be queried or read locally. - -```swift - class PersonObject: AsymmetricObject { - @Persisted(primaryKey: true) var _id: ObjectId - @Persisted var name: String - @Persisted var age: Int - } - - try realm.write { - // This will create the object on the server but not locally. - realm.create(PersonObject.self, value: ["_id": ObjectId.generate(), - "name": "Dylan", - "age": 20]) - } -``` -* Add ability to section a collection which conforms to `RealmCollection`, `RLMCollection`. - Collections can be sectioned by a unique key retrieved from a keyPath or a callback and will return an instance of `SectionedResults`/`RLMSectionedResults`. - Each section in the collection will be an instance of `ResultsSection`/`RLMSection` which gives access to the elements corresponding to the section key. - `SectionedResults`/`RLMSectionedResults` and `ResultsSection`/`RLMSection` have the ability to be observed. - ```swift - class DemoObject: Object { - @Persisted var title: String - @Persisted var date: Date - var firstLetter: String { - return title.first.map(String.init(_:)) ?? "" - } - } - var sectionedResults: SectionedResults - // ... - sectionedResults = realm.objects(DemoObject.self) - .sectioned(by: \.firstLetter, ascending: true) - ``` -* Add `@ObservedSectionedResults` for SwiftUI support. This property wrapper type retrieves sectioned results - from a Realm using a keyPath or callback to determine the section key. - ```swift - struct DemoView: View { - @ObservedSectionedResults(DemoObject.self, - sectionKeyPath: \.firstLetter) var demoObjects - - var body: some View { - VStack { - List { - ForEach(demoObjects) { section in - Section(header: Text(section.key)) { - ForEach(section) { object in - MyRowView(object: object) - } - } - } - } - } - } - } - ``` -* Add automatic handing for changing top-level objects to embedded objects in - migrations. Any objects of the now-embedded type which have zero incoming - links are deleted, and objects with multiple incoming links are duplicated. - This happens after the migration callback function completes, so there is no - functional change if you already have migration logic which correctly handles - this. ([Core #5737](https://github.com/realm/realm-core/pull/5737)). -* Improve performance when a new Realm file connects to the server for the - first time, especially when significant amounts of data has been written - while offline. ([Core #5772](https://github.com/realm/realm-core/pull/5772)) -* Shift more of the work done on the sync worker thread out of the write - transaction used to apply server changes, reducing how long it blocks other - threads from writing. ([Core #5772](https://github.com/realm/realm-core/pull/5772)) -* Improve the performance of the sync changeset parser, which speeds up - applying changesets from the server. ([Core #5772](https://github.com/realm/realm-core/pull/5772)) - -### Fixed - -* Fix all of the UBSan failures hit by our tests. It is unclear if any of these - manifested as visible bugs. ([Core #5665](https://github.com/realm/realm-core/pull/5665)) -* Upload completion callbacks were sometimes called before the final step of - interally marking the upload as complete, which could result in calling - `Realm.writeCopy()` from the completion callback failing due to there being - unuploaded changes. ([Core #4865](https://github.com/realm/realm-core/issues/4865)). -* Writing to a Realm stored on an exFAT drive threw the exception "fcntl() with - F_BARRIERFSYNC failed: Inappropriate ioctl for device" when a write - transaction needed to expand the file. - ([Core #5789](https://github.com/realm/realm-core/issues/5789), since 10.27.0) -* Syncing a Decimal128 with big significand could result in a crash. - ([Core #5728](https://github.com/realm/realm-core/issues/5728)) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 RC. - -### Internal - -* Upgraded realm-core from 12.5.1 to 12.6.0 - -10.28.7 Release notes (2022-09-02) -============================================================= - -### Enhancements - -* Add prebuilt binaries for Xcode 14 to the release package. - -### Fixed - -* Fix archiving watchOS release builds with Xcode 14. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 6. - -10.28.6 Release notes (2022-08-19) -============================================================= - -### Fixed - -* Fixed an issue where having realm-swift as SPM sub-target dependency leads to - missing symbols error during iOS archiving ([Core #7645](https://github.com/realm/realm-core/pull/7645)). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 5. - -### Internal - -* Upgraded realm-core from 12.5.0 to 12.5.1 - -10.28.5 Release notes (2022-08-09) -============================================================= - -### Enhancements - -* Improve performance of accessing `SubscriptionSet` properties when no writes - have been made to the Realm since the last access. - -### Fixed - -* A use-after-free could occur if a Realm with audit events enabled was - destroyed while processing an upload completion for the events Realm on a - different thread. ([Core PR #5714](https://github.com/realm/realm-core/pull/5714)) -* Opening a read-only synchronized Realm for the first time via asyncOpen did - not set the schema version, which could lead to `m_schema_version != - ObjectStore::NotVersioned` assertion failures later on. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 4. - -### Internal - -* Upgraded realm-core from 12.4.0 to 12.5.0 - -10.28.4 Release notes (2022-08-03) -============================================================= - -### Enhancements - -* Add support for building arm64 watchOS when installing Realm via CocoaPods. -* Reduce the amount of virtual address space used - ([Core #5645](https://github.com/realm/realm-core/pull/5645)). - -### Fixed - -* Fix some warnings when building with Xcode 14 - ([Core #5577](https://github.com/realm/realm-core/pull/5577)). -* Fix compilation failures on watchOS platforms which do not support thread-local storage. - ([#7694](https://github.com/realm/realm-swift/issues/7694), [#7695](https://github.com/realm/realm-swift/issues/7695) since v10.21.1) -* Fix a data race when committing a transaction while multiple threads are - waiting to begin write transactions. This appears to not have caused any - functional problems. -* Fix a data race when writing audit events which could occur if the sync - client thread was busy with other work when the event Realm was opened. -* Fix some cases of running out of virtual address space (seen/reported as mmap - failures) ([Core #5645](https://github.com/realm/realm-core/pull/5645)). -* Audit event scopes containing only write events and no read events would - occasionally throw a `BadVersion` exception when a write transaction was - committed (since v10.26.0). -* The client reset callbacks for the DiscardLocal mode would be passed invalid - Realm instances if the callback was invoked at a point where the Realm was - not otherwise open. ([Core #5654](https://github.com/realm/realm-core/pull/5654), since the introduction of DiscardLocal reset mode in v10.25.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 4. - -### Internal - -* Upgraded realm-core from 12.3.0 to 12.4.0. - -10.28.3 Release notes (2022-07-27) -============================================================= - -### Enhancements - -* Greatly improve the performance of obtaining cached Realm instances in Swift - when using a sync configuration. - -### Fixed - -* Add missing `initialSubscription` and `rerunOnOpen` to copyWithZone method on - `RLMRealmConfiguration`. This resulted in incorrect values when using - `RLMRealmConfiguration.defaultConfiguration`. -* The sync error handler did not hold a strong reference to the sync session - while dispatching the error from the worker thread to the main thread, - resulting in the session passed to the error handler being invalid if there - were no other remaining strong references elsewhere. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 3. - -10.28.2 Release notes (2022-06-30) -============================================================= - -### Fixed - -* Using `seedFilePath` threw an exception if the Realm file being opened - already existed ([#7840](https://github.com/realm/realm-swift/issues/7840), - since v10.26.0). -* The `intialSubscriptions` callback was invoked every time a Realm was opened - regardless of the value of `rerunOnOpen` and if the Realm was already open on - another thread (since v10.28.0). -* Allow using `RLMSupport.Swift` from RealmSwift's Cocoapods - ([#6886](https://github.com/realm/realm-swift/pull/6886)). -* Fix a UBSan failure when mapping encrypted pages. Fixing this did not change - the resulting assembly, so there were probably no functional problems - resulting from this (since v5.0.0). -* Improved performance of sync clients during integration of changesets with - many small strings (totalling > 1024 bytes per changeset) on iOS 14, and - devices which have restrictive or fragmented memory. - ([Core #5614](https://github.com/realm/realm-core/issues/5614)) -* Fix a data race when opening a flexible sync Realm (since v10.28.0). -* Add a missing backlink removal when assigning null or a non-link value to an - `AnyRealmValue` property which previously linked to an object. - This could have resulted in "key not found" exceptions or assertion failures - such as `mixed.hpp:165: [realm-core-12.1.0] Assertion failed: m_type` when - removing the destination link object. - ([Core #5574](https://github.com/realm/realm-core/pull/5573), since the introduction of AnyRealmValue in v10.8.0) - -### Compatibility - -* Realm Studio: 12.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 2. - -### Internal - -* Upgraded realm-core from 12.1.0 to 12.3.0. - -10.28.1 Release notes (2022-06-10) -============================================================= - -### Enhancements - -* Add support for Xcode 14. When building with Xcode 14, the minimum deployment - target is now iOS 11. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 1. - -10.28.0 Release notes (2022-06-03) -============================================================= - -### Enhancements - -* Replace mentions of 'MongoDB Realm' with 'Atlas App Services' in the documentation and update appropriate links to documentation. -* Allow adding a subscription querying for all documents of a type in swift for flexible sync. -``` - try await subscriptions.update { - subscriptions.append(QuerySubscription(name: "all_people")) - } -``` -* Add Combine API support for flexible sync beta. -* Add an `initialSubscriptions` parameter when retrieving the flexible sync configuration from a user, - which allows to specify a subscription update block, to bootstrap a set of flexible sync subscriptions - when the Realm is first opened. - There is an additional optional parameter flag `rerunOnOpen`, which allows to run this initial - subscriptions on every app startup. - -```swift - let config = user.flexibleSyncConfiguration(initialSubscriptions: { subs in - subs.append(QuerySubscription(name: "people_10") { - $0.age > 10 - }) - }, rerunOnOpen: true) - let realm = try Realm(configuration: config) -``` -* The sync client error handler will report an error, with detailed info about which object caused it, when writing an object to a flexible sync Realm outside of any query subscription. ([#5528](https://github.com/realm/realm-core/pull/5528)) -* Adding an object to a flexible sync Realm for a type that is not within a query subscription will now throw an exception. ([#5488](https://github.com/realm/realm-core/pull/5488)). - -### Fixed - -* Flexible Sync query subscriptions will correctly complete when data is synced to the local Realm. ([#5553](https://github.com/realm/realm-core/pull/5553), since v12.0.0) - -### Breaking Changes - -* Rename `SyncSubscriptionSet.write` to `SyncSubscriptionSet.update` to avoid confusion with `Realm.write`. -* Rename `SyncSubscription.update` to `SyncSubscription.updateQuery` to avoid confusion with `SyncSubscriptionSet.update`. -* Rename `RLMSyncSubscriptionSet.write` to `RLMSyncSubscriptionSet.update` to align it with swift API. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-13.4. - -### Internal - -* Upgraded realm-core from 12.0.0 to 12.1.0. - -10.27.0 Release notes (2022-05-26) -============================================================= - -### Enhancements - -* `@AsyncOpen`/`@AutoOpen` property wrappers can be used with flexible sync. - -### Fixed - -* When installing via SPM, debug builds could potentially hit an assertion - failure during flexible sync bootstrapping. ([Core #5527](https://github.com/realm/realm-core/pull/5527)) -* Flexible sync now only applies bootstrap data if the entire bootstrap is - received. Previously orphaned objects could result from the read snapshot on - the server changing. ([Core #5331](https://github.com/realm/realm-core/pull/5331)) -* Partially fix a performance regression in write performance introduced in - v10.21.1. v10.21.1 fixed a case where a kernel panic or device's battery - dying at the wrong point in a write transaction could potentially result in a - corrected Realm file, but at the cost of a severe performance hit. This - version adjusts how file synchronization is done to provide the same safety - at a much smaller performance hit. ([#7740](https://github.com/realm/realm-swift/issues/7740)). - -### Compatibility - -* Realm Studio: 11.0.0 or later (but see note below). -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-13.4. - -### Internal - -* Upgraded realm-core from 11.17.0 to 12.0.0. -* Bump the version number for the lockfile used for interprocess - synchronization. This has no effect on persistent data, but means that - versions of Realm which use pre-12.0.0 realm-core cannot open Realm files at - the same time as they are opened by this version. Notably this includes Realm - Studio, and v11.1.2 (the latest at the time of this release) cannot open - Realm files which are simultaneously open in the simulator. - -10.26.0 Release notes (2022-05-19) -============================================================= - -Xcode 13.1 is now the minimum supported version of Xcode, as Apple no longer -allows submitting to the app store with Xcode 12. - -### Enhancements - -* Add Xcode 13.4 binaries to the release package. -* Add Swift API for asynchronous transactions -```swift - try? realm.writeAsync { - realm.create(SwiftStringObject.self, value: ["string"]) - } onComplete: { error in - // optional handling on write complete - } - - try? realm.beginAsyncWrite { - realm.create(SwiftStringObject.self, value: ["string"]) - realm.commitAsyncWrite() - } - - let asyncTransactionId = try? realm.beginAsyncWrite { - // ... - } - try! realm.cancelAsyncWrite(asyncTransactionId) -``` -* Add Obj-C API for asynchronous transactions -``` - [realm asyncTransactionWithBlock:^{ - [StringObject createInRealm:realm withValue:@[@"string"]]; - } onComplete:^(NSError *error) { - // optional handling - }]; - - [realm beginAsyncWriteTransaction:^{ - [StringObject createInRealm:realm withValue:@[@"string"]]; - [realm commitAsyncWriteTransaction]; - }]; - - RLMAsyncTransactionId asyncTransactionId = [realm beginAsyncWriteTransaction:^{ - // ... - }]; - [realm cancelAsyncTransaction:asyncTransactionId]; -``` -* Improve performance of opening a Realm with `objectClasses`/`objectTypes` set - in the configuration. -* Implement the Realm event recording API for reporting reads and writes on a - Realm file to Atlas. - -### Fixed - -* Lower minimum OS version for `async` login and FunctionCallables to match the - rest of the `async` functions. ([#7791]https://github.com/realm/realm-swift/issues/7791) -* Consuming a RealmSwift XCFramework with library evolution enabled would give the error - `'Failed to build module 'RealmSwift'; this SDK is not supported by the compiler'` - when the XCFramework was built with an older XCode version and is - then consumed with a later version. ([#7313](https://github.com/realm/realm-swift/issues/7313), since v3.18.0) -* A data race would occur when opening a synchronized Realm with the client - reset mode set to `discardLocal` on one thread at the same time as a client - reset was being processed on another thread. This probably did not cause any - functional problems in practice and the broken timing window was very tight (since 10.25.0). -* If an async open of a Realm triggered a client reset, the callbacks for - `discardLocal` could theoretically fail to be called due to a race condition. - The timing for this was probably not possible to hit in practice (since 10.25.0). -* Calling `[RLMRealm freeze]`/`Realm.freeze` on a Realm which had been created from `writeCopy` - would not produce a frozen Realm. ([#7697](https://github.com/realm/realm-swift/issues/7697), since v5.0.0) -* Using the dynamic subscript API on unmanaged objects before first opening a - Realm or if `objectTypes` was set when opening a Realm would throw an - exception ([#7786](https://github.com/realm/realm-swift/issues/7786)). -* The sync client may have sent a corrupted upload cursor leading to a fatal - error from the server due to an uninitialized variable. - ([#5460](https://github.com/realm/realm-core/pull/5460), since v10.25.1) -* Flexible sync would not correctly resume syncing if a bootstrap was interrupted - ([#5466](https://github.com/realm/realm-core/pull/5466), since v10.21.1). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-13.4. - -### Internal - -* Upgraded realm-core from v11.15.0 to v11.17.0 - -10.25.2 Release notes (2022-04-27) -============================================================= - -### Enhancements - -* Replace Xcode 13.3 binaries with 13.3.1 binaries. - -### Fixed - -* `List` would contain an invalidated object instead of null when - the object linked to was deleted by a difference sync client - ([Core #5215](https://github.com/realm/realm-core/pull/5215), since v10.8.0). -* Adding an object to a Set, deleting the parent object of the Set, and then - deleting the object which was added to the Set would crash - ([Core #5387](https://github.com/realm/realm-core/issues/5387), since v10.8.0). -* Synchronized Realm files which were first created using v10.0.0-beta.3 would - be redownloaded instead of using the existing file, possibly resulting in the - loss of any unsynchronized data in those files (since v10.20.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3.1. - -### Internal - -* Upgraded realm-core from v11.14.0 to v11.15.0 - -10.25.1 Release notes (2022-04-11) -============================================================= - -### Fixed - -* Fixed various memory corruption bugs when encryption is used caused by not - locking a mutex when needed. - ([#7640](https://github.com/realm/realm-swift/issues/7640), [#7659](https://github.com/realm/realm-swift/issues/7659), since v10.21.1) -* Changeset upload batching did not calculate the accumulated size correctly, - resulting in “error reading body failed to read: read limited at 16777217 - bytes” errors from the server when writing large amounts of data - ([Core #5373](https://github.com/realm/realm-core/pull/5373), since 10.25.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3. - -### Internal - -* Upgraded realm-core from v11.13.0 to v11.14.0. - -10.25.0 Release notes (2022-03-29) -============================================================= - -Synchronized Realm files written by this version cannot be opened by older -versions of Realm. Existing files will be automatically upgraded when opened. - -Non-synchronized Realm files remain backwards-compatible. - -### Enhancements - -* Add ability to use Swift Query syntax in `@ObservedResults`, which allows you - to filter results using the `where` parameter. -* Add ability to use `MutableSet` with `StateRealmObject` in SwiftUI. -* Async/Await extensions are now compatible with iOS 13 and above when building - with Xcode 13.3. -* Sync changesets waiting to be uploaded to the server are now compressed, - reducing the disk space needed when large write transactions are performed - while offline or limited in bandwidth.([Core #5260](https://github.com/realm/realm-core/pull/5260)). -* Added new `SyncConfiguration.clientResetMode` and `RLMSyncConfiguration.clientResetMode` properties. - - The values of these properties will dictate client behavior in the event of a [client reset](https://docs.mongodb.com/realm/sync/error-handling/client-resets/). - - See below for information on `ClientResetMode` values. - - `clientResetMode` defaults to `.manual` if not set otherwise. -* Added new `ClientResetMode` and `RLMClientResetMode` enums. - - These enums represent possible client reset behavior for `SyncConfiguration.clientResetMode` and `RLMSyncConfiguration.clientResetMode`, respectively. - - `.manual` and `RLMClientResetModeManual` - - The local copy of the Realm is copied into a recovery - directory for safekeeping, and then deleted from the original location. The next time - the Realm for that partition value is opened, the Realm will automatically be re-downloaded from - MongoDB Realm, and can be used as normal. - - Data written to the Realm after the local copy of the Realm diverged from the backup - remote copy will be present in the local recovery copy of the Realm file. The - re-downloaded Realm will initially contain only the data present at the time the Realm - was backed up on the server. - - `rlmSync_clientResetBackedUpRealmPath` and `SyncError.clientResetInfo()` are used for accessing the recovery directory. - - `.discardLocal` and `RLMClientResetDiscardLocal` - - All unsynchronized local changes are automatically discarded and the local state is - automatically reverted to the most recent state from the server. Unsynchronized changes - can then be recovered in a post-client-reset callback block (See changelog below for more details). - - If RLMClientResetModeDiscardLocal is enabled but the client reset operation is unable to complete - then the client reset process reverts to manual mode. - - The realm's underlying object accessors remain bound so the UI may be updated in a non-disruptive way. -* Added support for client reset notification blocks for `.discardLocal` and `RLMClientResetDiscardLocal` - - **RealmSwift implementation**: `discardLocal(((Realm) -> Void)? = nil, ((Realm, Realm) -> Void)? = nil)` - - RealmSwift client reset blocks are set when initializing the user configuration - ```swift - var configuration = user.configuration(partitionValue: "myPartition", clientResetMode: .discardLocal(beforeClientResetBlock, afterClientResetBlock)) - ``` - - The before client reset block -- `((Realm) -> Void)? = nil` -- is executed prior to a client reset. Possible usage includes: - ```swift - let beforeClientResetBlock: (Realm) -> Void = { beforeRealm in - var recoveryConfig = Realm.Configuration() - recoveryConfig.fileURL = myRecoveryPath - do { - beforeRealm.writeCopy(configuration: recoveryConfig) - /* The copied realm could be used later for recovery, debugging, reporting, etc. */ - } catch { - /* handle error */ - } - } - ``` - - The after client reset block -- `((Realm, Realm) -> Void)? = nil)` -- is executed after a client reset. Possible usage includes: - ```Swift - let afterClientResetBlock: (Realm, Realm) -> Void = { before, after in - /* This block could be used to add custom recovery logic, back-up a realm file, send reporting, etc. */ - for object in before.objects(myClass.self) { - let res = after.objects(myClass.self) - if (res.filter("primaryKey == %@", object.primaryKey).first != nil) { - /* ...custom recovery logic... */ - } else { - /* ...custom recovery logic... */ - } - } - ``` - - **Realm Obj-c implementation**: Both before and after client reset callbacks exist as properties on `RLMSyncConfiguration` and are set at initialization. - ```objective-c - RLMRealmConfiguration *config = [user configurationWithPartitionValue:partitionValue - clientResetMode:RLMClientResetModeDiscardLocal - notifyBeforeReset:beforeBlock - notifyAfterReset:afterBlock]; - ``` - where `beforeBlock` is of type `RLMClientResetBeforeBlock`. And `afterBlock` is of type `RLMClientResetAfterBlock`. - -### Breaking Changes - -* Xcode 13.2 is no longer supported when building with Async/Await functions. Use - Xcode 13.3 to build with Async/Await functionality. - -### Fixed - -* Adding a Realm Object to a `ObservedResults` or a collections using - `StateRealmObject` that is managed by the same Realm would throw if the - Object was frozen and not thawed before hand. -* Setting a Realm Configuration for @ObservedResults using it's initializer - would be overrode by the Realm Configuration stored in - `.environment(\.realmConfiguration, ...)` if they did not match - ([Cocoa #7463](https://github.com/realm/realm-swift/issues/7463), since v10.6.0). -* Fix searchable component filter overriding the initial filter on `@ObservedResults`, (since v10.23.0). -* Comparing `Results`, `LinkingObjects` or `AnyRealmCollection` when using Realm via XCFramework - would result in compile time errors ([Cocoa #7615](https://github.com/realm/realm-swift/issues/7615), since v10.21.0) -* Opening an encrypted Realm while the keychain is locked on macOS would crash - ([#7438](https://github.com/realm/realm-swift/issues/7438)). -* Updating subscriptions while refreshing the access token would crash - ([Core #5343](https://github.com/realm/realm-core/issues/5343), since v10.22.0) -* Fix several race conditions in `SyncSession` related to setting - `customRequestHeaders` while using the `SyncSession` on a different thread. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3. - -### Internal - -* Upgraded realm-core from v11.12.0 to v11.13.0 - -10.24.2 Release notes (2022-03-18) -============================================================= - -### Fixed - -* Application would sometimes crash with exceptions like 'KeyNotFound' or - assertion "has_refs()". Other issues indicating file corruption may also be - fixed by this. The one mentioned here is the one that lead to solving the - problem. - ([Core #5283](https://github.com/realm/realm-core/issues/5283), since v5.0.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3. - -### Internal - -* Upgraded realm-core from 11.11.0 to 11.12.0 - -10.24.1 Release notes (2022-03-14) -============================================================= - -Switch to building the Carthage binary with Xcode 13.3. This release contains -no functional changes from 10.24.0. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3. - -10.24.0 Release notes (2022-03-05) -============================================================= - -### Enhancements - -* Add ability to use Swift Query syntax in `@ObservedResults`, which allows you - to filter results using the `where` parameter. - -### Fixed - -* If a list of objects contains links to objects not included in the - synchronized partition, collection change notifications for that list could - be incorrect ([Core #5164](https://github.com/realm/realm-core/issues/5164), since v10.0.0). -* Adding a new flexible sync subscription could crash with - "Assertion failed: !m_unbind_message_sent" in very specific timing scenarios - ([Core #5149](https://github.com/realm/realm-core/pull/5149), since v10.22.0). -* Converting floats/doubles into Decimal128 would yield imprecise results - ([Core #5184](https://github.com/realm/realm-core/pull/5184), since v10.0.0) -* Using accented characters in class and field names in a synchronized Realm - could result in sync errors ([Core #5196](https://github.com/realm/realm-core/pull/5196), since v10.0.0). -* Calling `Realm.invalidate()` from inside a Realm change notification could - result in the write transaction which produced the notification not being - persisted to disk (since v10.22.0). -* When a client reset error which results in the current Realm file being - backed up and then deleted, deletion errors were ignored as long as the copy - succeeded. When this happens the deletion of the old file is now scheduled - for the next launch of the app. ([Core #5180](https://github.com/realm/realm-core/issues/5180), since v2.0.0) -* Fix an error when compiling a watchOS Simulator target not supporting - Thread-local storage ([#7623](https://github.com/realm/realm-swift/issues/7623), since v10.21.0). -* Add a validation check to report a sensible error if a Realm configuration - indicates that an in-memory Realm should be encrypted. ([Core #5195](https://github.com/realm/realm-core/issues/5195)) -* The Swift package set the linker flags on the wrong target, resulting in - linker errors when SPM decides to build the core library as a dynamic library - ([#7266](https://github.com/realm/realm-swift/issues/7266)). -* The download-core task failed if run in an environment without TMPDIR set - ([#7688](https://github.com/realm/realm-swift/issues/7688), since v10.23.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3 beta 3. - -### Internal - -* Upgraded realm-core from 11.9.0 to 11.11.0 - -10.23.0 Release notes (2022-02-28) -============================================================= - -### Enhancements - -* Add `Realm.writeCopy(configuration:)`/`[RLMRealm writeCopyForConfiguration:]` which gives the - following functionality: - - Export a local non-sync Realm to be used with MongoDB Realm Sync - when the configuration is derived from a sync `RLMUser`/`User`. - - Write a copy of a local Realm to a destination specified in the configuration. - - Write a copy of a synced Realm in use with user A, and open it with user B. - - Note that migrations may be required when using a local realm configuration to open a realm file that - was copied from a synchronized realm. - - An exception will be thrown if a Realm exists at the destination. -* Add a `seedFilePath` option to `RLMRealmConfiguration` and `Configuration`. If this - option is set then instead of creating an empty Realm, the realm at the `seedFilePath` will - be copied to the `fileURL` of the new Realm. If a Realm file already exists at the - desitnation path, the seed file will not be copied and the already existing Realm - will be opened instead. Note that to use this parameter with a synced Realm configuration - the seed Realm must be appropriately copied to a destination with - `Realm.writeCopy(configuration:)`/`[RLMRealm writeCopyForConfiguration:]` first. -* Add ability to permanently delete a User from a MongoDB Realm app. This can - be invoked with `User.delete()`/`[RLMUser deleteWithCompletion:]`. -* Add `NSCopying` conformance to `RLMDecimal128` and `RLMObjectId`. -* Add Xcode 13.3 binaries to the release package (and remove 13.0). - -### Fixed - -* Add support of arm64 in Carthage build ([#7154](https://github.com/realm/realm-cocoa/issues/7154) -* Adding missing support for `IN` queries to primitives types on Type Safe Queries. - ```swift - let persons = realm.objects(Person.self).where { - let acceptableNames = ["Tom", "James", "Tyler"] - $0.name.in([acceptableNames]) - } - ``` - ([Cocoa #7633](https://github.com/realm/realm-swift/issues/7633), since v10.19.0) -* Work around a compiler crash when building with Swift 5.6 / Xcode 13.3. - CustomPersistable's PersistedType must now always be a built-in type rather - than possibly another CustomPersistable type as Swift 5.6 has removed support - for infinitely-recursive associated types ([#7654](https://github.com/realm/realm-swift/issues/7654)). -* Fix redundant call to filter on `@ObservedResults` from `searchable` - component (since v10.19.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3 beta 3. - -10.22.0 Release notes (2022-01-25) -============================================================= - -### Enhancements - -* Add beta support for flexible sync. See the [backend](https://docs.mongodb.com/realm/sync/data-access-patterns/flexible-sync/) and [SDK](https://docs.mongodb.com/realm/sdk/swift/examples/flexible-sync/) documentation for more information. Please report any issues with the beta through Github. - -### Fixed - -* UserIdentity metadata table grows indefinitely. ([#5152](https://github.com/realm/realm-core/issues/5152), since v10.20.0) -* We now report a useful error message when opening a sync Realm in non-sync mode or vice-versa.([#5161](https://github.com/realm/realm-core/pull/5161), since v5.0.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.2.1. - -### Internal - -* Upgraded realm-core from 11.8.0 to 11.9.0 - -10.21.1 Release notes (2022-01-12) -============================================================= - -### Fixed - -* The sync client will now drain the receive queue when a send fails with - ECONNRESET, ensuring that any error message from the server gets received and - processed. ([#5078](https://github.com/realm/realm-core/pull/5078)) -* Schema validation was missing for embedded objects in sets, resulting in an - unhelpful error being thrown if a Realm object subclass contained one (since v10.0.0). -* Opening a Realm with a schema that has an orphaned embedded object type - performed an extra empty write transaction (since v10.0.0). -* Freezing a Realm with a schema that has orphaned embedded object types threw - a "Wrong transactional state" exception (since v10.19.0). -* `@sum` and `@avg` queries on Dictionaries of floats or doubles used too much - precision for intermediates, resulting in incorrect rounding (since v10.5.0). -* Change the exception message for calling refresh on an immutable Realm from - "Continuous transaction through DB object without history information." to - "Can't refresh a read-only Realm." - ([#5061](https://github.com/realm/realm-core/issues/5061), since v10.8.0). -* Queries of the form "link.collection.@sum = 0" where `link` is null matched - when `collection` was a List or Set, but not a Dictionary - ([#5080](https://github.com/realm/realm-core/pull/5080), since v10.8.0). -* Types which require custom obj-c bridging (such as `PersistableEnum` or - `CustomPersistable`) would crash with exceptions mentioning `__SwiftValue` in - a variety of places on iOS versions older than iOS 14 - ([#7604](https://github.com/realm/realm-swift/issues/7604), since v10.21.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.2.1. - -### Internal - -* Upgraded realm-core from 11.6.1 to 11.8.0. - -10.21.0 Release notes (2022-01-10) -============================================================= - -### Enhancements - -* Add `metadata` property to `RLMUserProfile`/`UserProfile`. -* Add class `Projection` to allow creation of light weight view models out of Realm Objects. -```swift -public class Person: Object { - @Persisted var firstName = "" - @Persisted var lastName = "" - @Persisted var address: Address? = nil - @Persisted var friends = List() -} - -public class Address: EmbeddedObject { - @Persisted var city: String = "" - @Persisted var country = "" -} - -class PersonProjection: Projection { - // `Person.firstName` will have same name and type - @Projected(\Person.firstName) var firstName - // There will be the only String for `city` of the original object `Address` - @Projected(\Person.address.city) var homeCity - // List will be mapped to list of firstNames - @Projected(\Person.friends.projectTo.firstName) var firstFriendsName: ProjectedCollection -} - -// `people` will contain projections for every `Person` object in the `realm` -let people: Results = realm.objects(PersonProjection.self) -``` -* Greatly improve performance of reading AnyRealmValue and enum types from - Realm collections. -* Allow using Swift enums which conform to `PersistableEnum` as the value type - for all Realm collections. -* `AnyRealmCollection` now conforms to `Encodable`. -* AnyRealmValue and PersistableEnum values can now be passed directly to an - NSPredicate used in a filter() call rather than having to pass the rawValue - (the rawValue is still allowed). -* Queries on collections of PersistableEnums can now be performed with `where()`. -* Add support for querying on the rawValue of an enum with `where()`. -* `.count` is supported for Maps of all types rather than just numeric types in `where()`. -* Add support for querying on the properties of objects contained in - dictionaries (e.g. "dictProperty.@allValues.name CONTAINS 'a'"). -* Improve the error message for many types of invalid predicates in queries. -* Add support for comparing `@allKeys` to another property on the same object. -* Add `Numeric` conformance to `Decimal128`. -* Make some invalid property declarations such as `List` a - compile-time error instead of a runtime error. -* Calling `.sorted(byKeyPath:)` on a collection with an Element type which does - not support sorting by keypaths is now a compile-time error instead of a - runtime error. -* `RealmCollection.sorted(ascending:)` can now be called on all - non-Object/EmbeddedObject collections rather than only ones where the - `Element` conforms to `Comparable`. -* Add support for using user-defined types with `@Persistable` and in Realm - collections by defining a mapping to and from a type which Realm knows how to - store. For example, `URL` can be made persistable with: - ```swift - extension URL: FailableCustomPersistable { - // Store URL values as a String in Realm - public typealias PersistedType = String - // Convert a String to a URL - public init?(persistedValue: String) { self.init(string: persistedValue) } - // Convert a URL to a String - public var persistableValue: String { self.absoluteString } - } - ``` - After doing this, `@Persisted var url: URL` is a valid property declaration - on a Realm object. More advanced mappings can be done by mapping to an - EmbeddedObject which can store multiple values. - -### Fixed - -* Accessing a non object collection inside a migration would cause a crash -* [#5633](https://github.com/realm/realm-cocoa/issues/5633). -* Accessing a `Map` of objects dynamically would not handle nulled values correctly (since v10.8.0). -* `where()` allowed constructing some nonsensical queries due to boolean - comparisons returning `Query` rather than `Query` (since v10.19.0). -* `@allValues` queries on dictionaries accidentally did not require "ANY". -* Case-insensitive and diacritic-insensitive modifiers were ignored when - comparing the result of an aggregate operation to another property in a - query. -* `Object.init(value:)` did not allow initializing `RLMDictionary`/`Map` - properties with null values for map entries (since v10.8.0). -* `@ObservedResults` did not refresh when changes were made to the observed - collection. (since v10.6.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.2.1. - -10.20.1 Release notes (2021-12-14) -============================================================= - -Xcode 12.4 is now the minimum supported version of Xcode. - -### Fixed - -* Add missing `Indexable` support for UUID. - ([Cocoa #7545](https://github.com/realm/realm-swift/issues/7545), since v10.10.0) - -### Breaking Changes - -* All `async` functions now require Xcode 13.2 to work around an App - Store/TestFlight bug that results in apps built with 13.0/13.1 which do not - use libConcurrency but link a library which does crashing on startup. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.2. - -10.20.0 Release notes (2021-11-16) -============================================================= - -### Enhancements - -* Conform `@ThreadSafe` and `ThreadSafeReference` to `Sendable`. -* Allow using Swift enums which conform to `PersistableEnum` as the value type - for all Realm collections. -* `AnyRealmCollection` now conforms to `Encodable`. -* Greatly improve performance of reading AnyRealmValue and enum types from - Realm collections. -* `AnyRealmCollection` now conforms to `Encodable`. - -### Fixed - -* `@AutoOpen` will open the existing local Realm file on any connection error - rather than only when the connection specifically times out. -* Do not allow `progress` state changes for `@AutoOpen` and `@AsyncOpen` after - changing state to `open(let realm)` or `error(let error)`. -* Logging out a sync user failed to remove the local Realm file for partitions - with very long partition values that would have exceeded the maximum path - length. ([Core #4187](https://github.com/realm/realm-core/issues/4187), since v10.0.0) -* Don't keep trying to refresh the access token if the client's clock is more - than 30 minutes fast. ([Core #4941](https://github.com/realm/realm-core/issues/4941)) -* Failed auth requests used a fixed long sleep rather than exponential backoff - like other sync requests, which could result in very delayed reconnects after - a device was offline long enough for the access token to expire (since v10.0.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.1. - -### Internal - -* Upgraded realm-core from 11.6.0 to 11.6.1. - -10.19.0 Release notes (2021-11-04) -============================================================= - -### Enhancements - -* Add `.searchable()` SwiftUI View Modifier which allows filtering - `@ObservedResult` results from a search field component by a key path. - ```swift - List { - ForEach(reminders) { reminder in - ReminderRowView(reminder: reminder) - } - }.searchable(text: $searchFilter, - collection: $reminders, - keyPath: \.name) { - ForEach(reminders) { remindersFiltered in - Text(remindersFiltered.name).searchCompletion(remindersFiltered.name) - } - } - ``` -* Add an API for a type safe query syntax. This allows you to filter a Realm - and collections managed by a Realm with Swift style expressions. Here is a - brief example: - ```swift - class Person: Object { - @Persisted var name: String - @Persisted var hobbies: MutableSet - @Persisted var pets: List - } - class Pet: Object { - @Persisted var name: String - @Persisted var age: Int - } - - let persons = realm.objects(Person.self).where { - $0.hobbies.contains("music") || $0.hobbies.contains("baseball") - } - - persons = realm.objects(Person.self).where { - ($0.pets.age >= 2) && $0.pets.name.starts(with: "L") - } - ``` - ([#7419](https://github.com/realm/realm-swift/pull/7419)) -* Add support for dictionary subscript expressions - (e.g. `"phoneNumbers['Jane'] == '123-3456-123'"`) when querying with an - NSPredicate. -* Add UserProfile to User. This contains metadata from social logins with MongoDB Realm. -* Slightly reduce the peak memory usage when processing sync changesets. - -### Fixed - -* Change default request timeout for `RLMApp` from 6 seconds to 60 seconds. -* Async `Realm` init would often give a Realm instance which could not actually - be used and would throw incorrect thread exceptions. It now is `@MainActor` - and gives a Realm instance which always works on the main actor. The - non-functional `queue:` parameter has been removed (since v10.15.0). -* Restore the pre-v10.12.0 behavior of calling `writeCopy()` on a synchronized - Realm which produced a local non-synchronized Realm - ([#7513](https://github.com/realm/realm-swift/issues/7513)). -* Decimal128 did not properly normalize the value before hashing and so could - have multiple values which are equal but had different hash values (since v10.8.0). -* Fix a rare assertion failure or deadlock when a sync session is racing to - close at the same time that external reference to the Realm is being - released. ([Core #4931](https://github.com/realm/realm-core/issues/4931)) -* Fix a assertion failure when opening a sync Realm with a user who had been - removed. Instead an exception will be thrown. ([Core #4937](https://github.com/realm/realm-core/issues/4937), since v10.0.0) -* Fixed a rare segfault which could trigger if a user was being logged out - while the access token refresh response comes in. - ([Core #4944](https://github.com/realm/realm-core/issues/4944), since v10.0.0) -* Fixed a bug where progress notifiers on an AsyncOpenTask could be called - after the open completed. ([Core #4919](https://github.com/realm/realm-core/issues/4919)) -* SecureTransport was not enabled for macCatalyst builds when installing via - SPM, resulting in `'SSL/TLS protocol not supported'` exceptions when using - Realm Sync. ([#7474](https://github.com/realm/realm-swift/issues/7474)) -* Users were left in the logged in state when their refresh token expired. - ([Core #4882](https://github.com/realm/realm-core/issues/4882), since v10) -* Calling `.count` on a distinct collection would return the total number of - objects in the collection rather than the distinct count the first time it is - called. ([#7481](https://github.com/realm/realm-swift/issues/7481), since v10.8.0). -* `realm.delete(collection.distinct(...))` would delete all objects in the - collection rather than just the first object with each distinct value in the - property being distincted on, unless the distinct Results were read from at - least once first (since v10.8.0). -* Calling `.distinct()` on a collection, accessing the Results, then passing - the Results to `realm.delete()` would delete the correct objects, but - afterwards report a count of zero even if there were still objects in the - Results (since v10.8.0). -* Download compaction could result in non-streaming sync download notifiers - never reporting completion (since v10.0.0, - [Core #4989](https://github.com/realm/realm-core/pull/4989)). -* Fix a deadlock in SyncManager that was probably not possible to hit in - real-world code (since v10.0.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.2. - -### Internal - -* Upgraded realm-core from v11.4.1 to v11.6.0 - -10.18.0 Release notes (2021-10-25) -============================================================= - -### Enhancements - -* Add support for using multiple users with `@AsyncOpen` and `@AutoOpen`. - Setting the current user to a new user will now automatically reopen the - Realm with the new user. -* Add prebuilt binary for Xcode 13.1 to the release package. - -### Fixed - -* Fix `@AsyncOpen` and `@AutoOpen` using `defaultConfiguration` by default if - the user's doesn't provide one, will set an incorrect path which doesn't - correspond to the users configuration one. (since v10.12.0) -* Adding missing subscription completion for `AsyncOpenPublisher` after - successfully returning a realm. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.1. - -10.17.0 Release notes (2021-10-06) -============================================================= - -### Enhancements - -* Add a new `@ThreadSafe` property wrapper. Objects and collections wrapped by `@ThreadSafe` may be passed between threads. It's - intended to allow local variables and function parameters to be used across - threads when needed. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.0. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0. - -10.16.0 Release notes (2021-09-29) -============================================================= - -### Enhancements - -* Add `async` versions of `EmailPasswordAuth.callResetPasswordFunction` and -r `User.linkUser` methods. -* Add `async` version of `MongoCollection` methods. -* Add `async` support for user functions. - -### Fixed - -* A race condition in Realm.asyncOpen() sometimes resulted in subsequent writes - from Realm Sync failing to produce notifications - ([#7447](https://github.com/realm/realm-swift/issues/7447), - [#7453](https://github.com/realm/realm-swift/issues/7453), - [Core #4909](https://github.com/realm/realm-core/issues/4909), since v10.15.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.0. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0. - -10.15.1 Release notes (2021-09-15) -============================================================= - -### Enhancements - -* Switch to building the Carthage release with Xcode 13. - -### Fixed - -* Fix compilation error where Swift 5.5 is available but the macOS 12 SDK was - not. This was notable for the Xcode 13 RC. This fix adds a #canImport check - for the `_Concurrency` module that was not available before the macOS 12 SDK. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.0. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0. - -10.15.0 Release notes (2021-09-10) -============================================================= - -### Enhancements - -* Add `async` versions of the `Realm.asyncOpen` and `App.login` methods. -* ThreadSafeReference no longer pins the source transaction version for - anything other than a Results created by filtering a collection. This means - that holding on to thread-safe references to other things (such as Objects) - will no longer cause file size growth. -* A ThreadSafeReference to a Results backed by a collection can now be created - inside a write transaction as long as the collection was not created in the - current write transaction. -* Synchronized Realms are no longer opened twice, cutting the address space and - file descriptors used in half. - ([Core #4839](https://github.com/realm/realm-core/pull/4839)) -* When using the SwiftUI helper types (@ObservedRealmObject and friends) to - bind to an Equatable property, self-assignment no longer performs a pointless - write transaction. SwiftUI appears to sometimes call a Binding's set function - multiple times for a single UI action, so this results in significantly fewer - writes being performed. - -### Fixed - -* Adding an unmanaged object to a Realm that was declared with - `@StateRealmObject` would throw the exception `"Cannot add an object with - observers to a Realm"`. -* The `RealmCollectionChange` docs refered to indicies in modifications as the - 'new' collection. This is incorrect and the docs now state that modifications - refer to the previous version of the collection. ([Cocoa #7390](https://github.com/realm/realm-swift/issues/7390)) -* Fix crash in `RLMSyncConfiguration.initWithUser` error mapping when a user is disabled/deleted from MongoDB Realm dashboard. - ([Cocoa #7399](https://github.com/realm/realm-swift/issues/7399), since v10.0.0) -* If the application crashed at the wrong point when logging a user in, the - next run of the application could hit the assertion failure "m_state == - SyncUser::State::LoggedIn" when a synchronized Realm is opened with that - user. ([Core #4875](https://github.com/realm/realm-core/issues/4875), since v10.0.0) -* The `keyPaths:` parameter to `@ObservedResults` did not work (since v10.12.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 5. - -### Internal - -* Upgraded realm-core from 11.3.1 to 11.4.1 - -10.14.0 Release notes (2021-09-03) -============================================================= - -### Enhancements - -* Add additional `observe` methods for Objects and RealmCollections which take - a `PartialKeyPath` type key path parameter. -* The release package once again contains Xcode 13 binaries. -* `PersistableEnum` properties can now be indexed or used as the primary key if - the RawValue is an indexable or primary key type. - -### Fixed - -* `Map` did not conform to `Codable`. - ([Cocoa #7418](https://github.com/realm/realm-swift/pull/7418), since v10.8.0) -* Fixed "Invalid data type" assertion failure in the sync client when the - client recieved an AddColumn instruction from the server for an AnyRealmValue - property when that property already exists locally. ([Core #4873](https://github.com/realm/realm-core/issues/4873), since v10.8.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 5. - -### Internal - -* Upgraded realm-core from 11.3.0 to 11.3.1. - -10.13.0 Release notes (2021-08-26) -============================================================= - -### Enhancements - -* Sync logs now contain information about what object/changeset was being applied when the exception was thrown. - ([Core #4836](https://github.com/realm/realm-core/issues/4836)) -* Added ServiceErrorCode for wrong username/password when using '`App.login`. - ([Core #7380](https://github.com/realm/realm-swift/issues/7380) - -### Fixed - -* Fix crash in `MongoCollection.findOneDocument(filter:)` that occurred when no results were - found for a given filter. - ([Cocoa #7380](https://github.com/realm/realm-swift/issues/7380), since v10.0.0) -* Some of the SwiftUI property wrappers incorrectly required objects to conform - to ObjectKeyIdentifiable rather than Identifiable. - ([Cocoa #7372](https://github.com/realm/realm-swift/issues/7372), since v10.6.0) -* Work around Xcode 13 beta 3+ shipping a broken swiftinterface file for Combine on 32-bit iOS. - ([Cocoa #7368](https://github.com/realm/realm-swift/issues/7368)) -* Fixes history corruption when replacing an embedded object in a list. - ([Core #4845](https://github.com/realm/realm-core/issues/4845)), since v10.0.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 5. - -### Internal - -* Upgraded realm-core from 11.2.0 to 11.3.0 - -10.12.0 Release notes (2021-08-03) -============================================================= - -### Enhancements - -* `Object.observe()` and `RealmCollection.observe()` now include an optional - `keyPaths` parameter which filters change notifications to those only - occurring on the provided key path or key paths. See method documentation - for extended detail on filtering behavior. -* `ObservedResults` now includes an optional `keyPaths` parameter - which filters change notifications to those only occurring on the provided - key path or key paths. ex) `@ObservedResults(MyObject.self, keyPaths: ["myList.property"])` -* Add two new property wrappers for opening a Realm asynchronously in a - SwiftUI View: - - `AsyncOpen` is a property wrapper that initiates Realm.asyncOpen - for the current user, notifying the view when there is a change in Realm asyncOpen state. - - `AutoOpen` behaves similarly to `AsyncOpen`, but in the case of no internet - connection this will return an opened realm. -* Add `EnvironmentValues.partitionValue`. This value can be injected into any view using one of - our new property wrappers `AsyncOpen` and `AutoOpen`: - `MyView().environment(\.partitionValue, "partitionValue")`. -* Shift more of the work done when first initializing a collection notifier to - the background worker thread rather than doing it on the main thread. - -### Fixed - -* `configuration(partitionValue: AnyBSON)` would always set a nil partition value - for the user sync configuration. -* Decoding a `@Persisted` property would incorrectly throw a `DecodingError.keyNotFound` - for an optional property if the key is missing. - ([Cocoa #7358](https://github.com/realm/realm-swift/issues/7358), since v10.10.0) -* Fixed a symlink which prevented Realm from building on case sensitive file systems. - ([#7344](https://github.com/realm/realm-swift/issues/7344), since v10.8.0) -* Removing a change callback from a Results would sometimes block the calling - thread while the query for that Results was running on the background worker - thread (since v10.11.0). -* Object observers did not handle the object being deleted properly, which - could result in assertion failures mentioning "m_table" in ObjectNotifier - ([Core #4824](https://github.com/realm/realm-core/issues/4824), since v10.11.0). -* Fixed a crash when delivering notifications over a nested hierarchy of lists - of Mixed that contain links. ([Core #4803](https://github.com/realm/realm-core/issues/4803), since v10.8.0) -* Fixed a crash when an object which is linked to by a Mixed is deleted via - sync. ([Core #4828](https://github.com/realm/realm-core/pull/4828), since v10.8.0) -* Fixed a rare crash when setting a mixed link for the first time which would - trigger if the link was to the same table and adding the backlink column - caused a BPNode split. ([Core #4828](https://github.com/realm/realm-core/pull/4828), since v10.8.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 4. On iOS Xcode 13 beta 2 is the latest supported - version due to betas 3 and 4 having a broken Combine.framework. - -### Internal - -* Upgraded realm-core from v11.1.1 to v11.2.0 - -10.11.0 Release notes (2021-07-22) -============================================================= - -### Enhancements - -* Add type safe methods for: - - `RealmCollection.min(of:)` - - `RealmCollection.max(of:)` - - `RealmCollection.average(of:)` - - `RealmCollection.sum(of:)` - - `RealmCollection.sorted(by:ascending:)` - - `RealmKeyedCollection.min(of:)` - - `RealmKeyedCollection.max(of:)` - - `RealmKeyedCollection.average(of:)` - - `RealmKeyedCollection.sum(of:)` - - `RealmKeyedCollection.sorted(by:ascending:)` - - `Results.distinct(by:)` - - `SortDescriptor(keyPath:ascending:) - - Calling these methods can now be done via Swift keyPaths, like so: - ```swift - class Person: Object { - @Persisted var name: String - @Persisted var age: Int - } - - let persons = realm.objects(Person.self) - persons.min(of: \.age) - persons.max(of: \.age) - persons.average(of: \.age) - persons.sum(of: \.age) - persons.sorted(by: \.age) - persons.sorted(by: [SortDescriptor(keyPath: \Person.age)]) - persons.distinct(by: [\Person.age]) - ``` -* Add `List.objects(at indexes:)` in Swift and `[RLMCollection objectsAtIndexes:]` in Objective-C. - This allows you to select elements in a collection with a given IndexSet ([#7298](https://github.com/realm/realm-swift/issues/7298)). -* Add `App.emailPasswordAuth.retryCustomConfirmation(email:completion:)` and `[App.emailPasswordAuth retryCustomConfirmation:completion:]`. - These functions support retrying a [custom confirmation](https://docs.mongodb.com/realm/authentication/email-password/#run-a-confirmation-function) function. -* Improve performance of creating collection notifiers for Realms with a complex schema. - This means that the first run of a query or first call to observe() on a collection will - do significantly less work on the calling thread. -* Improve performance of calculating changesets for notifications, particularly - for deeply nested object graphs and objects which have List or Set properties - with small numbers of objects in the collection. - -### Fixed - -* `RealmProperty` would crash when decoding a `null` json value. - ([Cocoa #7323](https://github.com/realm/realm-swift/issues/7323), since v10.8.0) -* `@Persisted` would crash when decoding a `null` value. - ([#7332](https://github.com/realm/realm-swift/issues/7332), since v10.10.0). -* Fixed an issue where `Realm.Configuration` would be set after views have been laid out - when using `.environment(\.realmConfiguration, ...)` in SwiftUI. This would cause issues if you are - required to bump your schema version and are using `@ObservedResults`. -* Sync user profiles now correctly persist between runs. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 3. Note that this release does not contain Xcode 13 - beta binaries as beta 3 does not include a working version of - Combine.framework for iOS. - -### Internal - -* Upgraded realm-core from 11.0.4 to 11.1.1 - -10.10.0 Release notes (2021-07-07) -============================================================= - -### Enhancements - -* Add a new property wrapper-based declaration syntax for properties on Realm - Swift object classes. Rather than using `@objc dynamic` or the - `RealmProperty` wrapper type, properties can now be declared with `@Persisted - var property: T`, where `T` is any of the supported property types, including - optional numbers and collections. This has a few benefits: - - - All property types are now declared in the same way. No more remembering - that this type requires `@objc dynamic var` while this other type - requires `let`, and the `RealmProperty` or `RealmOptional` helper is no - longer needed for types not supported by Objective-C. - - No more overriding class methods like `primaryKey()`, - `indexedProperties()` or `ignoredProperties()`. The primary key and - indexed flags are set directly in the property declaration with - `@Persisted(primaryKey: true) var _id: ObjectId` or `@Persisted(indexed: - true) var indexedProperty: Int`. If any `@Persisted` properties are present, - all other properties are implicitly ignored. - - Some performance problems have been fixed. Declaring collection - properties as `let listProp = List()` resulted in the `List` object - being created eagerly when the parent object is read, which could cause - performance problems if a class has a large number of `List` or - `RealmOptional` properties. `@Persisted var list: List` allows us to - defer creating the `List` until it's accessed, improving performance - when looping over objects and using only some of the properties. - - Similarly, `let _id = ObjectId.generate()` was a convenient way to - declare a sync-compatible primary key, but resulted in new ObjectIds - being generated in some scenarios where the value would never actually be - used. `@Persisted var _id: ObjectId` has the same behavior of - automatically generating primary keys, but allows us to only generate it - when actually needed. - - More types of enums are supported. Any `RawRepresentable` enum whose raw - type is a type supported by Realm can be stored in an `@Persisted` - project, rather than just `@objc` enums. Enums must be declared as - conforming to the `PersistableEnum` protocol, and still cannot (yet) be - used in collections. - - `willSet` and `didSet` can be used with `@Persistable` properties, while - they previously did not work on managed Realm objects. - - While we expect the switch to the new syntax to be very simple for most - users, we plan to support the existing objc-based declaration syntax for the - foreseeable future. The new style and old style cannot be mixed within a - single class, but new classes can use the new syntax while existing classes - continue to use the old syntax. Updating an existing class to the new syntax - does not change what data is stored in the Realm file and so does not require - a migration (as long as you don't also change the schema in the process, of - course). -* Add `Map.merge()`, which adds the key-value pairs from another Map or - Dictionary to the map. -* Add `Map.asKeyValueSequence()` which returns an adaptor that can be used with - generic functions that operate on Dictionary-styled sequences. - -### Fixed -* AnyRealmValue enum values are now supported in more places when creating - objects. -* Declaring a property as `RealmProperty` will now report an - error during schema discovery rather than doing broken things when the - property is used. -* Observing the `invalidated` property of `RLMDictionary`/`Map` via KVO did not - set old/new values correctly in the notification (since 10.8.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 2. - -10.9.0 Release notes (2021-07-01) -============================================================= - -### Enhancements - -* Add `App.emailPasswordAuth.retryCustomConfirmation(email:completion:)` and - `[App.emailPasswordAuth retryCustomConfirmation:completion:]`. These - functions support retrying a [custom confirmation](https://docs.mongodb.com/realm/authentication/email-password/#run-a-confirmation-function) - function. -* Improve performance of many Dictionary operations, especially when KVO is being used. - -### Fixed - -* Calling `-[RLMRealm deleteObjects:]` on a `RLMDictionary` cleared the - dictionary but did not actually delete the objects in the dictionary (since v10.8.0). -* Rix an assertion failure when observing a `List` contains - object links. ([Core #4767](https://github.com/realm/realm-core/issues/4767), since v10.8.0) -* Fix an assertion failure when observing a `RLMDictionary`/`Map` which links - to an object which was deleting by a different sync client. - ([Core #4770](https://github.com/realm/realm-core/pull/4770), since v10.8.0) -* Fix an endless recursive loop that could cause a stack overflow when - computing changes on a set of objects which contained cycles. - ([Core #4770](https://github.com/realm/realm-core/pull/4770), since v10.8.0). -* Hash collisions in dictionaries were not handled properly. - ([Core #4776](https://github.com/realm/realm-core/issues/4776), since v10.8.0). -* Fix a crash after clearing a list or set of AnyRealmValue containing links to - objects ([Core #4774](https://github.com/realm/realm-core/issues/4774), since v10.8.0) -* Trying to refresh a user token which had been revoked by an admin lead to an - infinite loop and then a crash. This situation now properly logs the user out - and reports an error. ([Core #4745](https://github.com/realm/realm-core/issues/4745), since v10.0.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 2. - -### Internal - -* Upgraded realm-core from v11.0.3 to v11.0.4 - -10.8.1 Release notes (2021-06-22) -============================================================= - -### Enhancements - -* Update Xcode 12.5 to Xcode 12.5.1. -* Create fewer dynamic classes at runtime, improving memory usage and startup time slightly. - -### Fixed - -* Importing the Realm swift package produced several warnings about excluded - files not existing. Note that one warning will still remain after this change. - ([#7295](https://github.com/realm/realm-swift/issues/7295), since v10.8.0). -* Update the root URL for the API docs so that the links go to the place where - new versions of the docs are being published. - ([#7299](https://github.com/realm/realm-swift/issues/7299), since v10.6.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. Note that this version of Realm Studio has not - yet been released at the time of this release. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 1. - -10.8.0 Release notes (2021-06-14) -============================================================= - -NOTE: This version upgrades the Realm file format version to add support for -the new data types and to adjust how primary keys are handled. Realm files -opened will be automatically upgraded and cannot be read by versions older than -v10.8.0. This upgrade should be a fairly fast one. Note that we now -automatically create a backup of the pre-upgrade Realm. - -### Enhancements - -* Add support for the `UUID` and `NSUUID` data types. These types can be used - for the primary key property of Object classes. -* Add two new collection types to complement the existing `RLMArray`/`List` type: - - `RLMSet` in Objective-C and `MutableSet` in Swift are mutable - unordered collections of distinct objects, similar to the built-in - `NSMutableSet` and `Set`. The values in a set may be any non-collection - type which can be stored as a Realm property. Sets are guaranteed to never - contain two objects which compare equal to each other, including when - conflicting writes are merged by sync. - - `RLMDictionary` in Objective-C and `Map` are - mutable key-value dictionaries, similar to the built-in - `NSMutableDictionary` and `Dictionary`. The values in a dictionary may be - any non-collection type which can be stored as a Realm property. The keys - must currently always be a string. -* Add support for dynamically typed properties which can store a value of any - of the non-collection types supported by Realm, including Object subclasses - (but not EmbeddedObject subclasses). These are declared with - `@property id propertyName;` in Objective-C and - `let propertyName = RealmProperty()` in Swift. - -### Fixed - -* Setting a collection with a nullable value type to null via one of the - dynamic interfaces would hit an assertion failure instead of clearing the - collection. -* Fixed an incorrect detection of multiple incoming links in a migration when - changing a table to embedded and removing a link to it at the same time. - ([#4694](https://github.com/realm/realm-core/issues/4694) since v10.0.0-beta.2) -* Fixed a divergent merge on Set when one client clears the Set and another - client inserts and deletes objects. - ([#4720](https://github.com/realm/realm-core/issues/4720)) -* Partially revert to pre-v5.0.0 handling of primary keys to fix a performance - regression. v5.0.0 made primary keys determine the position in the low-level - table where newly added objects would be inserted, which eliminated the need - for a separate index on the primary key. This made some use patterns slightly - faster, but also made some reasonable things dramatically slower. - ([#4522](https://github.com/realm/realm-core/issues/4522)) -* Fixed an incorrect detection of multiple incoming links in a migration when - changing a table to embedded and removing a link to it at the same time. - ([#4694](https://github.com/realm/realm-core/issues/4694) since v10.0.0-beta.2) -* Fix collection notification reporting for modifications. This could be - observed by receiving the wrong indices of modifications on sorted or - distinct results, or notification blocks sometimes not being called when only - modifications have occured. - ([#4573](https://github.com/realm/realm-core/pull/4573) since v5.0.0). -* Fix incorrect sync instruction emission when replacing an existing embedded - object with another embedded object.([Core #4740](https://github.com/realm/realm-core/issues/4740) - -### Deprecations - -* `RealmOptional` has been deprecated in favor of `RealmProperty`. - `RealmProperty` is functionality identical to `RealmOptional` when storing - optional numeric types, but can also store the new `AnyRealmValue` type. - -### Compatibility - -* Realm Studio: 11.0.0 or later. Note that this version of Realm Studio has not - yet been released at the time of this release. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 1. - -### Internal - -* Upgraded realm-core from v10.7.2 to v11.0.3 - -10.8.0-beta.2 Release notes (2021-06-01) -============================================================= - -### Enhancements - -* Add `RLMDictionary`/`Map<>` datatype. This is a Dictionary collection type used for storing key-value pairs in a collection. - -### Compatibility - -* Realm Studio: 11.0.0-beta.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v11.0.0-beta.4 to v11.0.0-beta.6 - -10.8.0-beta.0 Release notes (2021-05-07) -============================================================= - -### Enhancements - -* Add `RLMSet`/`MutableSet<>` datatype. This is a Set collection type used for storing distinct values in a collection. -* Add support for `id`/`AnyRealmValue`. -* Add support for `UUID`/`NSUUID` data type. - -### Fixed - -* None. - -### Deprecations - -* `RealmOptional` has been deprecated in favor of `RealmProperty`. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.7.2 to v10.8.0-beta.5 - -10.7.7 Release notes (2021-06-10) -============================================================= - -Xcode 12.2 is now the minimum supported version. - -### Enhancements - -* Add Xcode 13 beta 1 binaries to the release package. - -### Fixed - -* Fix a runtime crash which happens in some Xcode version (Xcode < 12, reported - in Xcode 12.5), where SwiftUI is not weak linked by default. This fix only - works for Cocoapods projects. - ([#7234](https://github.com/realm/realm-swift/issues/7234) -* Fix warnings when building with Xcode 13 beta 1. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 1. - -10.7.6 Release notes (2021-05-13) -============================================================= - -### Enhancements - -* Realms opened in read-only mode can now be invalidated (although it is - unlikely to be useful to do so). - -### Fixed - -* Fix an availability warning when building Realm. The code path which gave the - warning can not currently be hit, so this did not cause any runtime problems - ([#7219](https://github.com/realm/realm-swift/issues/7219), since 10.7.3). -* Proactively check the expiry time on the access token and refresh it before - attempting to initiate a sync session. This prevents some error logs from - appearing on the client such as: "ERROR: Connection[1]: Websocket: Expected - HTTP response 101 Switching Protocols, but received: HTTP/1.1 401 - Unauthorized" ([RCORE-473](https://jira.mongodb.org/browse/RCORE-473), since v10.0.0) -* Fix a race condition which could result in a skipping notifications failing - to skip if several commits using notification skipping were made in - succession (since v5.0.0). -* Fix a crash on exit inside TableRecycler which could happen if Realms were - open on background threads when the app exited. - ([Core #4600](https://github.com/realm/realm-core/issues/4600), since v5.0.0) -* Fix errors related to "uncaught exception in notifier thread: - N5realm11KeyNotFoundE: No such object" which could happen on sycnronized - Realms if a linked object was deleted by another client. - ([JS #3611](https://github.com/realm/realm-js/issues/3611), since v10.0.0). -* Reading a link to an object which has been deleted by a different client via - a string-based interface (such as value(forKey:) or the subscript operator on - DynamicObject) could return an invalid object rather than nil. - ([Core #4687](https://github.com/realm/realm-core/pull/4687), since v10.0.0) -* Recreate the sync metadata Realm if the encryption key for it is missing from - the keychain rather than crashing. This can happen if a device is restored - from an unencrypted backup, which restores app data but not the app's - keychain entries, and results in all cached logics for sync users being - discarded but no data being lost. - [Core #4285](https://github.com/realm/realm-core/pull/4285) -* Thread-safe references can now be created for read-only Realms. - ([#5475](https://github.com/realm/realm-swift/issues/5475)). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.6.0 to v10.7.2 - -10.7.5 Release notes (2021-05-07) -============================================================= - -### Fixed - -* Iterating over frozen collections on multiple threads at the same time could - throw a "count underflow" NSInternalInconsistencyException. - ([#7237](https://github.com/realm/realm-swift/issues/7237), since v5.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. - -10.7.4 Release notes (2021-04-26) -============================================================= - -### Enhancements - -* Add Xcode 12.5 binaries to the release package. - -### Fixed - -* Add the Info.plist file to the XCFrameworks in the Carthage xcframwork - package ([#7216](https://github.com/realm/realm-swift/issues/7216), since 10.7.3). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. - -10.7.3 Release notes (2021-04-22) -============================================================= - -### Enhancements - -* Package a prebuilt XCFramework for Carthage. Carthage 0.38 and later will - download this instead of the old frameworks when using `--use-xcframeworks`. -* We now make a backup of the realm file prior to any file format upgrade. The - backup is retained for 3 months. Backups from before a file format upgrade - allows for better analysis of any upgrade failure. We also restore a backup, - if a) an attempt is made to open a realm file whith a "future" file format - and b) a backup file exist that fits the current file format. - ([Core #4166](https://github.com/realm/realm-core/pull/4166)) -* The error message when the intial steps of opening a Realm file fails is now - more descriptive. -* Make conversion of Decimal128 to/from string work for numbers with more than - 19 significant digits. This means that Decimal128's initializer which takes a - string will now never throw, as it previously threw only for out-of-bounds - values. The initializer is still marked as `throws` for - backwards compatibility. - ([#4548](https://github.com/realm/realm-core/issues/4548)) - -### Fixed - -* Adjust the header paths for the podspec to avoid accidentally finding a file - which isn't part of the pod that produced warnings when importing the - framework. ([#7113](https://github.com/realm/realm-swift/issues/7113), since 10.5.2). -* Fixed a crash that would occur when observing unmanaged Objects in multiple - views in SwiftUI. When using `@StateRealmObject` or `@ObservedObject` across - multiple views with an unmanaged object, each view would subscribe to the - object. As each view unsubscribed (generally when trailing back through the - view stack), our propertyWrappers would attempt to remove the KVOs for each - cancellation, when it should only be done once. We now correctly remove KVOs - only once. ([#7131](https://github.com/realm/realm-swift/issues/7131)) -* Fixed `isInvalidated` not returning correct value after object deletion from - Realm when using a custom schema. The object's Object Schema was not updated - when the object was added to the realm. We now correctly update the object - schema when adding it to the realm. - ([#7181](https://github.com/realm/realm-swift/issues/7181)) -* Syncing large Decimal128 values would cause "Assertion failed: cx.w[1] == 0" - ([Core #4519](https://github.com/realm/realm-core/issues/4519), since v10.0.0). -* Potential/unconfirmed fix for crashes associated with failure to memory map - (low on memory, low on virtual address space). For example - ([#4514](https://github.com/realm/realm-core/issues/4514), since v5.0.0). -* Fix assertion failures such as "!m_notifier_skip_version.version" or - "m_notifier_sg->get_version() + 1 == new_version.version" when performing - writes inside change notification callbacks. Previously refreshing the Realm - by beginning a write transaction would skip delivering notifications, leaving - things in an inconsistent state. Notifications are now delivered recursively - when needed instead. ([Cocoa #7165](https://github.com/realm/realm-swift/issues/7165)). -* Fix collection notification reporting for modifications. This could be - observed by receiving the wrong indices of modifications on sorted or - distinct results, or notification blocks sometimes not being called when only - modifications have occured. - ([#4573](https://github.com/realm/realm-core/pull/4573) since v5.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.5.5 to v10.6.0 -* Add additional debug validation to file map management that will hopefully - catch cases where we unmap something which is still in use. - -10.7.2 Release notes (2021-03-08) -============================================================= - -### Fixed - -* During integration of a large amount of data from the server, you may get - "Assertion failed: !fields.has_missing_parent_update()" - ([Core #4497](https://github.com/realm/realm-core/issues/4497), since v6.0.0) - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.5.4 to v10.5.5 - -10.7.1 Release notes (2021-03-05) -============================================================= - -### Fixed - -* Queries of the form "a.b.c == nil" would match objects where `b` is `nil` if - `c` did not have an index and did not if `c` was indexed. Both will now match - to align with NSPredicate's behavior. ([Core #4460]https://github.com/realm/realm-core/pull/4460), since 4.3.0). -* Restore support for upgrading files from file format 5 (Realm Cocoa 1.x). - ([Core #7089](https://github.com/realm/realm-swift/issues/7089), since v5.0.0) -* On 32bit devices you may get exception with "No such object" when upgrading - to v10.* ([Java #7314](https://github.com/realm/realm-java/issues/7314), since v5.0.0) -* The notification worker thread would rerun queries after every commit rather - than only commits which modified tables which could effect the query results - if the table had any outgoing links to tables not used in the query. - ([Core #4456](https://github.com/realm/realm-core/pull/4456), since v5.0.0). -* Fix "Invalid ref translation entry [16045690984833335023, 78187493520]" - assertion failure which could occur when using sync or multiple processes - writing to a single Realm file. - ([#7086](https://github.com/realm/realm-swift/issues/7086), since v5.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.5.3 to v10.5.4 - -10.7.0 Release notes (2021-02-23) -============================================================= - -### Enhancements - -* Add support for some missing query operations on data propertys: - - Data properties can be compared to other data properties - (e.g. "dataProperty1 == dataProperty2"). - - Case and diacritic-insensitive queries can be performed on data properties. - This will only have meaningful results if the data property contains UTF-8 - string data. - - Data properties on linked objects can be queried - (e.g. "link.dataProperty CONTAINS %@") -* Implement queries which filter on lists other than object links (lists of - objects were already supported). All supported operators for normal - properties are now supported for lists (e.g. "ANY intList = 5" or "ANY - stringList BEGINSWITH 'prefix'"), as well as aggregate operations on the - lists (such as "intArray.@sum > 100"). -* Performance of sorting on more than one property has been improved. - Especially important if many elements match on the first property. Mitigates - ([#7092](https://github.com/realm/realm-swift/issues/7092)) - -### Fixed - -* Fixed a bug that prevented an object type with incoming links from being - marked as embedded during migrations. ([Core #4414](https://github.com/realm/realm-core/pull/4414)) -* The Realm notification listener thread could sometimes hit the assertion - failure "!skip_version.version" if a write transaction was committed at a - very specific time (since v10.5.0). -* Added workaround for a case where upgrading an old file with illegal string - would crash ([#7111](https://github.com/realm/realm-swift/issues/7111)) -* Fixed a conflict resolution bug related to the ArrayMove instruction, which - could sometimes cause an "Invalid prior_size" exception to prevent - synchronization (since v10.5.0). -* Skipping a change notification in the first write transaction after the - observer was added could potentially fail to skip the notification (since v10.5.1). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.5.0 to v10.5.3 - -10.6.0 Release notes (2021-02-15) -============================================================= - -### Enhancements - -* Add `@StateRealmObject` for SwiftUI support. This property wrapper type instantiates an observable object on a View. - Use in place of `SwiftUI.StateObject` for Realm `Object`, `List`, and `EmbeddedObject` types. -* Add `@ObservedRealmObject` for SwiftUI support. This property wrapper type subscribes to an observable object - and invalidates a view whenever the observable object changes. Use in place of `SwiftUI.ObservedObject` for - Realm `Object`, `List`, or `EmbeddedObject` types. -* Add `@ObservedResults` for SwiftUI support. This property wrapper type retrieves results from a Realm. - The results use the realm configuration provided by the environment value `EnvironmentValues.realmConfiguration`. -* Add `EnvironmentValues.realm` and `EnvironmentValues.realmConfiguration` for `Realm` - and `Realm.Configuration` types respectively. Values can be injected into views using the `View.environment` method, e.g., `MyView().environment(\.realmConfiguration, Realm.Configuration(fileURL: URL(fileURLWithPath: "myRealmPath.realm")))`. - The value can then be declared on the example `MyView` as `@Environment(\.realm) var realm`. -* Add `SwiftUI.Binding` extensions where `Value` is of type `Object`, `List`, or `EmbeddedObject`. - These extensions expose methods for wrapped write transactions, to avoid boilerplate within - views, e.g., `TextField("name", $personObject.name)` or `$personList.append(Person())`. -* Add `Object.bind` and `EmbeddedObject.bind` for SwiftUI support. This allows you to create - bindings of realm properties when a propertyWrapper is not available for you to do so, e.g., `TextField("name", personObject.bind(\.name))`. -* The Sync client now logs error messages received from server rather than just - the size of the error message. -* Errors returned from the server when sync WebSockets get closed are now - captured and surfaced as a SyncError. -* Improve performance of sequential reads on a Results backed directly by a - Table (i.e. `realm.object(ClasSName.self)` with no filter/sort/etc.) by 50x. -* Orphaned embedded object types which are not linked to by any top-level types - are now better handled. Previously the server would reject the schema, - resulting in delayed and confusing error reporting. Explicitly including an - orphan in `objectTypes` is now immediately reported as an error when opening - the Realm, and orphans are automatically excluded from the auto-discovered - schema when `objectTypes` is not specified. - -### Fixed - -* Reading from a Results backed directly by a Table (i.e. - `realm.object(ClasSName.self)` with no filter/sort/etc.) would give incorrect - results if the Results was constructed and accessed before creating a new - object with a primary key less than the smallest primary key which previously - existed. ([#7014](https://github.com/realm/realm-swift/issues/7014), since v5.0.0). -* During synchronization you might experience crash with - "Assertion failed: ref + size <= next->first". - ([Core #4388](https://github.com/realm/realm-core/issues/4388)) - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.4.0 to v10.5.0 - -10.5.2 Release notes (2021-02-09) -============================================================= - -### Enhancements - -* Add support for "thawing" objects. `Realm`, `Results`, `List` and `Object` - now have `thaw()` methods which return a live copy of the frozen object. This - enables app behvaior where a frozen object can be made live again in order to - mutate values. For example, first freezing an object passed into UI view, - then thawing the object in the view to update values. -* Add Xcode 12.4 binaries to the release package. - -### Fixed - -* Inserting a date into a synced collection via `AnyBSON.datetime(...)` would - be of type `Timestamp` and not `Date`. This could break synced objects with a - `Date` property. - ([#6654](https://github.com/realm/realm-swift/issues/6654), since v10.0.0). -* Fixed an issue where creating an object after file format upgrade may fail - with assertion "Assertion failed: lo() <= std::numeric_limits::max()" - ([#4295](https://github.com/realm/realm-core/issues/4295), since v5.0.0) -* Allow enumerating objects in migrations with types which are no longer - present in the schema. -* Add `RLMResponse.customStatusCode`. This fixes timeout exceptions that were - occurring with a poor connection. ([#4188](https://github.com/realm/realm-core/issues/4188)) -* Limit availability of ObjectKeyIdentifiable to platforms which support - Combine to match the change made in the Xcode 12.5 SDK. - ([#7083](https://github.com/realm/realm-swift/issues/7083)) - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.3.3 to v10.4.0 - -10.5.1 Release notes (2021-01-15) -============================================================= - -### Enhancements - -* Add Xcode 12.3 binary to release package. -* Add support for queries which have nil on the left side and a keypath on the - right side (e.g. "nil == name" rather than "name == nil" as was previously - required). - -### Fixed -* Timeouts when calling server functions via App would sometimes crash rather - than report an error. -* Fix a race condition which would lead to "uncaught exception in notifier - thread: N5realm15InvalidTableRefE: transaction_ended" and a crash when the - source Realm was closed or invalidated at a very specific time during the - first run of a collection notifier - ([#3761](https://github.com/realm/realm-core/issues/3761), since v5.0.0). -* Deleting and recreating objects with embedded objects may fail. - ([Core PR #4240](https://github.com/realm/realm-core/pull/4240), since v10.0.0) -* Fast-enumerating a List after deleting the parent object would crash with an - assertion failure rather than a more appropriate exception. - ([Core #4114](https://github.com/realm/realm-core/issues/4114), since v5.0.0). -* Fix an issue where calling a MongoDB Realm Function would never be performed as the reference to the weak `User` was lost. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.3. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.3.2 to v10.3.3 - -10.5.0 Release notes (2020-12-14) -============================================================= - -### Enhancements - -* MongoDB Realm is now supported when installing Realm via Swift Package Manager. - -### Fixed - -* The user identifier was added to the file path for synchronized Realms twice - and an extra level of escaping was performed on the partition value. This did - not cause functional problems, but made file names more confusing than they - needed to be. Existing Realm files will continue to be located at the old - path, while newly created files will be created at a shorter path. (Since v10.0.0). -* Fix a race condition which could potentially allow queries on frozen Realms - to access an uninitialized structure for search indexes (since v5.0.0). -* Fix several data races in App and SyncSession initialization. These could - possibly have caused strange errors the first time a synchronized Realm was - opened (since v10.0.0). -* Fix a use of a dangling reference when refreshing a user’s custom data that - could lead to a crash (since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.1.4 to v10.3.2 - -10.4.0 Release notes (2020-12-10) -============================================================= - -### Enhancements - -* Add Combine support for App and User. These two types now have a - `objectWillChange` property that emits each time the state of the object has - changed (such as due to the user logging in or out). ([PR #6977](https://github.com/realm/realm-swift/pull/6977)). - -### Fixed - -* Integrating changesets from the server would sometimes hit the assertion - failure "n != realm::npos" inside Table::create_object_with_primary_key() - when creating an object with a primary key which previously had been used and - had incoming links. ([Core PR #4180](https://github.com/realm/realm-core/pull/4180), since v10.0.0). -* The arm64 simulator slices were not actually included in the XCFramework - release package. ([PR #6982](https://github.com/realm/realm-swift/pull/6982), since v10.2.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.1.3 to v10.1.4 -* Upgraded realm-sync from v10.1.4 to v10.1.5 - -10.3.0 Release notes (2020-12-08) -============================================================= - -### Enhancements - -* Add Google OpenID Connect Credentials, an alternative login credential to the - Google OAuth 2.0 credential. - -### Fixed - -* Fixed a bug that would prevent eventual consistency during conflict - resolution. Affected clients would experience data divergence and potentially - consistency errors as a result if they experienced conflict resolution - between cycles of Create-Erase-Create for objects with primary keys (since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-sync from v10.1.3 to v10.1.4 - -10.2.0 Release notes (2020-12-02) -============================================================= - -### Enhancements - -* The prebuilt binaries are now packaged as XCFrameworks. This adds support for - Catalyst and arm64 simulators when using them to install Realm, removes the - need for the strip-frameworks build step, and should simplify installation. -* The support functionality for using the Objective C API from Swift is now - included in Realm Swift and now includes all of the required wrappers for - MongoDB Realm types. In mixed Objective C/Swift projects, we recommend - continuing to use the Objective C types, but import both Realm and RealmSwift - in your Swift files. - -### Fixed - -* The user identifier was added to the file path for synchronized Realms twice - and an extra level of escaping was performed on the partition value. This did - not cause functional problems, but made file names more confusing than they - needed to be. Existing Realm files will continue to be located at the old - path, while newly created files will be created at a shorter path. (Since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -10.1.4 Release notes (2020-11-16) -============================================================= - -### Enhancements - -* Add arm64 slices to the macOS builds. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.0.1 to v10.1.3 -* Upgraded realm-sync from v10.0.1 to v10.1.3 - -10.1.3 Release notes (2020-11-13) -============================================================= - -### Enhancements - -* Add Xcode 12.2 binaries to the release package. - -### Fixed - -* Disallow setting - `RLMRealmConfiguration.deleteRealmIfMigrationNeeded`/`Realm.Config.deleteRealmIfMigrationNeeded` - when sync is enabled. This did not actually work as it does not delete the - relevant server state and broke in confusing ways ([PR #6931](https://github.com/realm/realm-swift/pull/6931)). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.1. -* CocoaPods: 1.10 or later. - -10.1.2 Release notes (2020-11-06) -============================================================= - -### Enhancements - -* Some error states which previously threw a misleading "NoSuchTable" exception - now throw a more descriptive exception. - -### Fixed - -* One of the Swift packages did not have the minimum deployment target set, - resulting in errors when archiving an app which imported Realm via SPM. -* Reenable filelock emulation on watchOS so that the OS does not kill the app - when it is suspended while a Realm is open on watchOS 7 ([#6861](https://github.com/realm/realm-swift/issues/6861), since v5.4.8 -* Fix crash in case insensitive query on indexed string columns when nothing - matches ([#6836](https://github.com/realm/realm-swift/issues/6836), since v5.0.0). -* Null values in a `List` or `List` were incorrectly treated - as non-null in some places. It is unknown if this caused any functional - problems when using the public API. ([Core PR #3987](https://github.com/realm/realm-core/pull/3987), since v5.0.0). -* Deleting an entry in a list in two different clients could end deleting the - wrong entry in one client when the changes are merged (since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.1. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.0.0 to v10.1.1 -* Upgraded realm-sync from v10.0.0 to v10.1.1 - -10.1.1 Release notes (2020-10-27) -============================================================= - -### Enhancements - -* Set the minimum CocoaPods version in the podspec so that trying to install - with older versions gives a more useful error ([PR #6892](https://github.com/realm/realm-swift/pull/6892)). - -### Fixed - -* Embedded objects could not be marked as `ObjectKeyIdentifable` - ([PR #6890](https://github.com/realm/realm-swift/pull/6890), since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.1. -* CocoaPods: 1.10 or later. - -10.1.0 Release notes (2020-10-22) -============================================================= - -CocoaPods 1.10 or later is now required to install Realm. - -### Enhancements - -* Throw an exception for Objects that have none of its properties marked with @objc. -* Mac Catalyst and arm64 simulators are now supported when integrating via Cocoapods. -* Add Xcode 12.1 binaries to the release package. -* Add Combine support for `Realm.asyncOpen()`. - -### Fixed - -* Implement precise and unbatched notification of sync completion events. This - avoids a race condition where an earlier upload completion event will notify - a later waiter whose changes haven't been uploaded yet. - ([#1118](https://github.com/realm/realm-object-store/pull/1118)). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.1. - -10.0.0 Release notes (2020-10-16) -============================================================= - -This release is functionally identical to v10.0.0-rc.2. - -NOTE: This version upgrades the Realm file format version to add support for -new data types. Realm files opened will be automatically upgraded and cannot be -read by versions older than v10.0.0. - -### Breaking Changes - -* Rename Realm.Publishers to RealmPublishers to avoid confusion with Combine.Publishers. -* Remove `[RLMSyncManager shared]`. This is now instatiated as a property on App/RLMApp. -* `RLMSyncManager.pinnedCertificatePaths` has been removed. -* Classes `RLMUserAccountInfo` & `RLMUserInfo` (swift: `UserInfo`, `UserAccountInfo`) have been removed. -* `RLMSyncUser`/`SyncUser` has been renamed to `RLMUser`/`User`. -* We no longer support Realm Cloud (legacy), but instead the new "MongoDB - Realm" Cloud. MongoDB Realm is a serverless platform that enables developers - to quickly build applications without having to set up server infrastructure. - MongoDB Realm is built on top of MongoDB Atlas, automatically integrating the - connection to your database. -* Remove support for Query-based sync, including the configuration parameters - and the `RLMSyncSubscription` and `SyncSubscription` types ([#6437](https://github.com/realm/realm-swift/pull/6437)). -* Remove everything related to sync permissions, including both the path-based - permission system and the object-level privileges for query-based sync. - Permissions are now configured via MongoDB Atlas. - ([#6445](https://github.com/realm/realm-swift/pulls/6445)) -* Remove support for Realm Object Server. -* Non-embedded objects in synchronized Realms must always have a primary key - named "_id". -* All Swift callbacks for asynchronous operations which can fail are now passed - a `Result` parameter instead of two separate `Value?` and - `Error?` parameters. - -### Enhancements - -* Add support for next generation sync. Support for syncing to MongoDB instead - of Realm Object Server. Applications must be created at realm.mongodb.com -* The memory mapping scheme for Realm files has changed to better support - opening very large files. -* Add support for the ObjectId data type. This is an automatically-generated - unique identifier similar to a GUID or a UUID. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for the Decimal128 data type. This is a 128-bit IEEE 754 decimal - floating point number similar to NSDecimalNumber. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for embedded objects. Embedded objects are objects which are - owned by a single parent object, and are deleted when that parent object is - deleted. They are defined by subclassing `EmbeddedObject` / - `RLMEmbeddedObject` rather than `Object` / `RLMObject`. -* Add `-[RLMUser customData]`/`User.customData`. Custom data is - configured in your MongoDB Realm App. -* Add `-[RLMUser callFunctionNamed:arguments:completion:]`/`User.functions`. - This is the entry point for calling Remote MongoDB Realm functions. Functions - allow you to define and execute server-side logic for your application. - Functions are written in modern JavaScript (ES6+) and execute in a serverless - manner. When you call a function, you can dynamically access components of - the current application as well as information about the request to execute - the function and the logged in user that sent the request. -* Add `-[RLMUser mongoClientWithServiceName:]`/`User.mongoClient`. This is - the entry point for calling your Remote MongoDB Service. The read operations - are `-[RLMMongoCollection findWhere:completion:]`, `-[RLMMongoCollection - countWhere:completion:]`and `-[RLMMongoCollection - aggregateWithPipeline:completion:]`. The write operations are - `-[RLMMongoCollection insertOneDocument:completion:]`, `-[RLMMongoCollection - insertManyDocuments:completion:]`, `-[RLMMongoCollection - updateOneDocument:completion:]`, `-[RLMMongoCollection - updateManyDocuments:completion:]`, `-[RLMMongoCollection - deleteOneDocument:completion:]`, and `-[RLMMongoCollection - deleteManyDocuments:completion:]`. If you are already familiar with MongoDB - drivers, it is important to understand that the remote MongoCollection only - provides access to the operations available in MongoDB Realm. -* Obtaining a Realm configuration from a user is now done with `[RLMUser - configurationWithPartitionValue:]`/`User.configuration(partitionValue:)`. - Partition values can currently be of types `String`, `Int`, or `ObjectId`, - and fill a similar role to Realm URLs did with Realm Cloud. The main - difference is that partitions are meant to be more closely associated with - your data. For example, if you are running a `Dog` kennel, and have a field - `breed` that acts as your partition key, you could open up realms based on - the breed of the dogs. -* Add ability to stream change events on a remote MongoDB collection with - `[RLMMongoCollection watch:delegate:delegateQueue:]`, - `MongoCollection.watch(delegate:)`. When calling `watch(delegate:)` you will be - given a `RLMChangeStream` (`ChangeStream`) which can be used to end watching - by calling `close()`. Change events can also be streamed using the - `MongoCollection.watch` Combine publisher that will stream change events each - time the remote MongoDB collection is updated. -* Add the ability to listen for when a Watch Change Stream is opened when using - Combine. Use `onOpen(event:)` directly after opening a `WatchPublisher` to - register a callback to be invoked once the change stream is opened. -* Objects with integer primary keys no longer require a separate index for the -* primary key column, improving insert performance and slightly reducing file - size. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* Carthage release for Swift is built with Xcode 12 - -### Internal - -* Upgraded realm-core from v6.1.4 to v10.0.0 -* Upgraded realm-sync from v5.0.29 to v10.0.0 - -10.0.0-rc.2 Release notes (2020-10-15) -============================================================= - -### Enhancements - -* Add the ability to listen for when a Watch Change Stream is opened when using - Combine. Use `onOpen(event:)` directly after opening a `WatchPublisher` to - register a callback to be invoked once the change stream is opened. - -### Breaking Changes - -* The insert operations on Mongo collections now report the inserted documents' - IDs as BSON rather than ObjectId. -* Embedded objects can no longer form cycles at the schema level. For example, - type A can no longer have an object property of type A, or an object property - of type B if type B links to type A. This was always rejected by the server, - but previously was allowed in non-synchronized Realms. -* Primary key properties are once again marked as being indexed. This reflects - an internal change to how primary keys are handled that should not have any - other visible effects. -* Change paired return types from Swift completion handlers to return `Result`. -* Adjust how RealmSwift.Object is defined to add support for Swift Library - Evolution mode. This should normally not have any effect, but you may need to - add `override` to initializers of object subclasses. -* Add `.null` type to AnyBSON. This creates a distinction between null values - and properly absent BSON types. - -### Fixed - -* Set the precision correctly when serializing doubles in extended json. -* Reading the `objectTypes` array from a Realm Configuration would not include - the embedded object types which were set in the array. -* Reject loops in embedded objects as part of local schema validation rather - than as a server error. -* Although MongoClient is obtained from a User, it was actually using the - User's App's current user rather than the User it was obtained from to make - requests. - - -This release also contains the following changes from 5.4.7 - 5.5.0 - -### Enhancements - -* Add the ability to capture a NotificationToken when using a Combine publisher - that observes a Realm Object or Collection. The user will call - `saveToken(on:at:)` directly after invoking the publisher to use the feature. - -### Fixed - -* When using `Realm.write(withoutNotifying:)` there was a chance that the - supplied observation blocks would not be skipped when in a write transaction. - ([Object Store #1103](https://github.com/realm/realm-object-store/pull/1103)) -* Comparing two identical unmanaged `List<>`/`RLMArray` objects would fail. - ([#5665](https://github.com/realm/realm-swift/issues/5665)). -* Case-insensitive equality queries on indexed string properties failed to - clear some internal state when rerunning the query. This could manifest as - duplicate results or "key not found" errors. - ([#6830](https://github.com/realm/realm-swift/issues/6830), [#6694](https://github.com/realm/realm-swift/issues/6694), since 5.0.0). -* Equality queries on indexed string properties would sometimes throw "key not - found" exceptions if the hash of the string happened to have bit 62 set. - ([.NET #2025](https://github.com/realm/realm-dotnet/issues/2025), since v5.0.0). -* Queries comparing non-optional int properties to nil would behave as if they - were comparing against zero instead (since v5.0.0). - -### Compatibility - -* File format: Generates Realms with format v12 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v10.0.0-beta.9 to v10.0.0 -* Upgraded realm-sync from v10.0.0-beta.14 to v10.0.0 - -10.0.0-rc.1 Release notes (2020-10-01) -============================================================= - -### Breaking Changes - -* Change the following methods on RLMUser to properties: - - `[RLMUser emailPasswordAuth]` => `RLMUser.emailPasswordAuth` - - `[RLMUser identities]` => `RLMUser.identities` - - `[RLMUser allSessions]` => `RLMUser.allSessions` - - `[RLMUser apiKeysAuth]` => `RLMUser.apiKeysAuth` -* Other changes to RLMUser: - - `nullable` has been removed from `RLMUser.identifier` - - `nullable` has been removed from `RLMUser.customData` -* Change the following methods on RLMApp to properties: - - `[RLMApp allUsers]` => `RLMApp.allUsers` - - `[RLMApp currentUser]` => `RLMApp.currentUser` - - `[RLMApp emailPasswordAuth]` => `RLMApp.emailPasswordAuth` -* Define `RealmSwift.Credentials` as an enum instead of a `typealias`. Example - usage has changed from `Credentials(googleAuthCode: "token")` to - `Credentials.google(serverAuthCode: "serverAuthCode")`, and - `Credentials(facebookToken: "token")` to `Credentials.facebook(accessToken: "accessToken")`, etc. -* Remove error parameter and redefine payload in - `+ (instancetype)credentialsWithFunctionPayload:(NSDictionary *)payload error:(NSError **)error;`. - It is now defined as `+ (instancetype)credentialsWithFunctionPayload:(NSDictionary> *)payload;` - -### Compatibility - -* File format: Generates Realms with format v12 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12. - -10.0.0-beta.6 Release notes (2020-09-30) -============================================================= - -### Breaking Changes - -* Change Google Credential parameter names to better reflect the required auth code: - - `Credentials(googleToken:)` => `Credentials(googleAuthCode:)` - - `[RLMCredentials credentialsWithGoogleToken:]` => `[RLMCredentials credentialsWithGoogleAuthCode:]` -* Rename Realm.Publishers to RealmPublishers to avoid confusion with Combine.Publishers - -### Fixed - -* Deleting objects could sometimes change the ObjectId remaining objects from - null to ObjectId("deaddeaddeaddeaddeaddead") when there are more than 1000 - objects. (Since v10.0.0-alpha.1) -* Fixed an assertion failure when adding an index to a nullable ObjectId - property that contains nulls. (since v10.0.0-alpha.1). - -This release also contains the following changes from 5.4.0 - 5.4.6: - -### Enhancements - -* Add prebuilt binary for Xcode 11.7 to the release package. -* Add prebuilt binary for Xcode 12 to the release package. -* Improve the asymtotic performance of NOT IN queries on indexed properties. It - is now O(Number of Rows) rather than O(Number of Rows \* Number of values in IN clause.) -* Slightly (<5%) improve the performance of most operations which involve - reading from a Realm file. - -### Fixed - -* Upgrading pre-5.x files with string primary keys would result in a file where - `realm.object(ofType:forPrimaryKey:)` would fail to find the object. - ([#6716](https://github.com/realm/realm-swift/issues/6716), since 5.2.0) -* A write transaction which modifies an object with more than 16 managed - properties and causes the Realm file to grow larger than 2 GB could cause an - assertion failure mentioning "m_has_refs". ([JS #3194](https://github.com/realm/realm-js/issues/3194), since 5.0.0). -* Objects with more than 32 properties could corrupt the Realm file and result - in a variety of crashes. ([Java #7057](https://github.com/realm/realm-java/issues/7057), since 5.0.0). -* Fix deadlocks when opening a Realm file in both the iOS simulator and Realm - Studio ([#6743](https://github.com/realm/realm-swift/issues/6743), since 5.3.6). -* Fix Springboard deadlocking when an app is unsuspended while it has an open - Realm file which is stored in an app group on iOS 10-12 - ([#6749](https://github.com/realm/realm-swift/issues/6749), since 5.3.6). -* If you use encryption your application cound crash with a message like - "Opening Realm files of format version 0 is not supported by this version of - Realm". ([#6889](https://github.com/realm/realm-java/issues/6889) among others, since 5.0.0) -* Confining a Realm to a serial queue would throw an error claiming that the - queue was not a serial queue on iOS versions older than 12. - ([#6735](https://github.com/realm/realm-swift/issues/6735), since 5.0.0). -* Results would sometimes give stale results inside a write transaction if a - write which should have updated the Results was made before the first access - of a pre-existing Results object. - ([#6721](https://github.com/realm/realm-swift/issues/6721), since 5.0.0) -* Fix Archiving the Realm and RealmSwift frameworks with Xcode 12. - ([#6774](https://github.com/realm/realm-swift/issues/6774)) -* Fix compilation via Carthage when using Xcode 12 ([#6717](https://github.com/realm/realm-swift/issues/6717)). -* Fix a crash inside `realm::Array(Type)::init_from_mem()` which would - sometimes occur when running a query over links immediately after creating - objects of the queried type. - ([#6789](https://github.com/realm/realm-swift/issues/6789) and possibly others, since 5.0.0). -* Possibly fix problems when changing the type of the primary key of an object - from optional to non-optional. -* Rerunning a equality query on an indexed string property would give incorrect - results if a previous run of the query matched multiple objects and it now - matches one object. This could manifest as either finding a non-matching - object or a "key not found" exception being thrown. - ([#6536](https://github.com/realm/realm-swift/issues/6536), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v12 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v10.0.0-beta.7 to v10.0.0-beta.9 -* Upgraded realm-sync from v10.0.0-beta.11 to v10.0.0-beta.14 - -10.0.0-beta.5 Release notes (2020-09-15) -============================================================= - -### Enhancements - -* Add `User.loggedIn`. -* Add support for multiple Realm Apps. -* Remove `[RLMSyncManager shared]`. This is now instatiated as a property on - the app itself. -* Add Combine support for: - * PushClient - * APIKeyAuth - * User - * MongoCollection - * EmailPasswordAuth - * App.login - -### Fixed - -* Fix `MongoCollection.watch` to consistently deliver events on a given queue. -* Fix `[RLMUser logOutWithCompletion]` and `User.logOut` to now log out the - correct user. -* Fix crash on startup on iOS versions older than 13 (since v10.0.0-beta.3). - -### Breaking Changes - -* `RLMSyncManager.pinnedCertificatePaths` has been removed. -* Classes `RLMUserAccountInfo` & `RLMUserInfo` (swift: `UserInfo`, - `UserAccountInfo`) have been removed. -* The following functionality has been renamed to align Cocoa with the other - Realm SDKs: - -| Old API | New API | -|:-------------------------------------------------------------|:---------------------------------------------------------------| -| `RLMUser.identity` | `RLMUser.identifier` | -| `User.identity` | `User.id` | -| `-[RLMCredentials credentialsWithUsername:password:]` | `-[RLMCredentials credentialsWithEmail:password:]` | -| `Credentials(username:password:)` | `Credentials(email:password:)` | -| -`[RLMUser apiKeyAuth]` | `-[RLMUser apiKeysAuth]` | -| `User.apiKeyAuth()` | `User.apiKeysAuth()` | -| `-[RLMEmailPasswordAuth registerEmail:password:completion:]` | `-[RLMEmailPasswordAuth registerUserWithEmail:password:completion:]` | -| `App.emailPasswordAuth().registerEmail(email:password:)` | `App.emailPasswordAuth().registerUser(email:password:)` | - -### Compatibility - -* File format: Generates Realms with format v12 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v10.0.0-beta.6 to v10.0.0-beta.7 -* Upgraded realm-sync from v10.0.0-beta.10 to v10.0.0-beta.11 - -10.0.0-beta.4 Release notes (2020-08-28) -============================================================= - -### Enhancements - -* Add support for the 64-bit watchOS simulator added in Xcode 12. -* Add ability to stream change events on a remote MongoDB collection with - `[RLMMongoCollection watch:delegate:delegateQueue]`, - `MongoCollection.watch(delegate)`. When calling `watch(delegate)` you will be - given a `RLMChangeStream` (`ChangeStream`), this will be used to invalidate - and stop the streaming session by calling `[RLMChangeStream close]` - (`ChangeStream.close()`) when needed. -* Add `MongoCollection.watch`, which is a Combine publisher that will stream - change events each time the remote MongoDB collection is updated. -* Add ability to open a synced Realm with a `nil` partition value. - -### Fixed - -* Realm.Configuration.objectTypes now accepts embedded objects -* Ports fixes from 5.3.5 - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the v10.0.0-beta.x series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v10.0.0-beta.1 to v10.0.0-beta.6 -* Upgraded realm-sync from v10.0.0-beta.2 to v10.0.0-beta.10 - -10.0.0-beta.3 Release notes (2020-08-17) -============================================================= - -This release also contains all changes from 5.3.2. - -### Breaking Changes -* The following classes & aliases have been renamed to align Cocoa with the other Realm SDKs: - -| Old API | New API | -|:------------------------------------------------------------|:---------------------------------------------------------------| -| `RLMSyncUser` | `RLMUser` | -| `SyncUser` | `User` | -| `RLMAppCredential` | `RLMCredential` | -| `AppCredential` | `Credential` | -| `RealmApp` | `App` | -| `RLMUserAPIKeyProviderClient` | `RLMAPIKeyAuth` | -| `RLMUsernamePasswordProviderClient` | `RLMEmailPasswordAuth` | -| `UsernamePasswordProviderClient` | `EmailPasswordAuth` | -| `UserAPIKeyProviderClient` | `APIKeyAuth` | - -* The following functionality has also moved to the User - -| Old API | New API | -|:-------------------------------------------------------------|:--------------------------------------------------------------| -| `[RLMApp callFunctionNamed:]` | `[RLMUser callFunctionNamed:]` | -| `App.functions` | `User.functions` | -| `[RLMApp mongoClientWithServiceName:]` | `[RLMUser mongoClientWithServiceName:]` | -| `App.mongoClient(serviceName)` | `User.mongoClient(serviceName)` | -| `[RLMApp userAPIKeyProviderClient]` | `[RLMUser apiKeyAuth]` | -| `App.userAPIKeyProviderClient` | `App.apiKeyAuth()` | -| `[RLMApp logOut:]` | `[RLMUser logOut]` | -| `App.logOut(user)` | `User.logOut()` | -| `[RLMApp removeUser:]` | `[RLMUser remove]` | -| `App.remove(user)` | `User.remove()` | -| `[RLMApp linkUser:credentials:]` | `[RLMUser linkWithCredentials:]` | -| `App.linkUser(user, credentials)` | `User.link(credentials)` | - -* `refreshCustomData()` on User now returns void and passes the custom data to the callback on success. - -### Compatibility -* This release introduces breaking changes w.r.t some sync classes and MongoDB Realm Cloud functionality. -(See the breaking changes section for the full list) -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* Carthage release for Swift is built with Xcode 11.5. - -10.0.0-beta.2 Release notes (2020-06-09) -============================================================= -Xcode 11.3 and iOS 9 are now the minimum supported versions. - -### Enhancements -* Add support for building with Xcode 12 beta 1. watchOS currently requires - removing x86_64 from the supported architectures. Support for the new 64-bit - watch simulator will come in a future release. - -### Fixed -* Opening a SyncSession with LOCAL app deployments would not use the correct endpoints. -* Linking from embedded objects to top-level objects was incorrectly disallowed. -* Opening a Realm file in file format v6 (created by Realm Cocoa versions - between 2.4 and 2.10) would crash. (Since 5.0.0, [Core #3764](https://github.com/realm/realm-core/issues/3764)). -* Upgrading v9 (pre-5.0) Realm files would create a redundant search index for - primary key properties. This index would then be removed the next time the - Realm was opened, resulting in some extra i/o in the upgrade process. - (Since 5.0.0, [Core #3787](https://github.com/realm/realm-core/issues/3787)). -* Fixed a performance issue with upgrading v9 files with search indexes on - non-primary-key properties. (Since 5.0.0, [Core #3767](https://github.com/realm/realm-core/issues/3767)). - -### Compatibility -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 - -10.0.0-beta.1 Release notes (2020-06-08) -============================================================= - -NOTE: This version bumps the Realm file format to version 11. It is not -possible to downgrade to earlier versions. Older files will automatically be -upgraded to the new file format. Only [Realm Studio -10.0.0](https://github.com/realm/realm-studio/releases/tag/v10.0.0-beta.1) or -later will be able to open the new file format. - -### Enhancements - -* Add support for next generation sync. Support for syncing to MongoDB instead - of Realm Object Server. Applications must be created at realm.mongodb.com -* The memory mapping scheme for Realm files has changed to better support - opening very large files. -* Add support for the ObjectId data type. This is an automatically-generated - unique identifier similar to a GUID or a UUID. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for the Decimal128 data type. This is a 128-bit IEEE 754 decimal - floating point number similar to NSDecimalNumber. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for embedded objects. Embedded objects are objects which are - owned by a single parent object, and are deleted when that parent object is - deleted. They are defined by subclassing `EmbeddedObject` / - `RLMEmbeddedObject` rather than `Object` / `RLMObject`. -* Add `-[RLMSyncUser customData]`/`SyncUser.customData`. Custom data is - configured in your MongoDB Realm App. -* Add `-[RLMApp callFunctionNamed:arguments]`/`RealmApp.functions`. This is the - entry point for calling Remote MongoDB Realm functions. Functions allow you - to define and execute server-side logic for your application. Functions are - written in modern JavaScript (ES6+) and execute in a serverless manner. When - you call a function, you can dynamically access components of the current - application as well as information about the request to execute the function - and the logged in user that sent the request. -* Add `-[RLMApp mongoClientWithServiceName]`/`RealmApp.mongoClient`. This is - the entry point for calling your Remote MongoDB Service. The read operations - are `-[RLMMongoCollection findWhere:completion:]`, `-[RLMMongoCollection - countWhere:completion:]`and `-[RLMMongoCollection - aggregateWithPipeline:completion:]`. The write operations are - `-[RLMMongoCollection insertOneDocument:completion:]`, `-[RLMMongoCollection - insertManyDocuments:completion:]`, `-[RLMMongoCollection - updateOneDocument:completion:]`, `-[RLMMongoCollection - updateManyDocuments:completion:]`, `-[RLMMongoCollection - deleteOneDocument:completion:]`, and `-[RLMMongoCollection - deleteManyDocuments:completion:]`. If you are already familiar with MongoDB - drivers, it is important to understand that the remote MongoCollection only - provides access to the operations available in MongoDB Realm. -* Change `[RLMSyncUser - configurationWithPartitionValue:]`/`SyncUser.configuration(with:)` to accept - all BSON types. Partition values can currently be of types `String`, `Int`, - or `ObjectId`. Opening a realm by partition value is the equivalent of - previously opening a realm by URL. In this case, partitions are meant to be - more closely associated with your data. E.g., if you are running a `Dog` - kennel, and have a field `breed` that acts as your partition key, you could - open up realms based on the breed of the dogs. - -### Breaking Changes - -* We no longer support Realm Cloud (legacy), but instead the new "MongoDB - Realm" Cloud. MongoDB Realm is a serverless platform that enables developers - to quickly build applications without having to set up server infrastructure. - MongoDB Realm is built on top of MongoDB Atlas, automatically integrating the - connection to your database. -* Remove support for Query-based sync, including the configuration parameters - and the `RLMSyncSubscription` and `SyncSubscription` types ([#6437](https://github.com/realm/realm-swift/pull/6437)). -* Primary key properties are no longer marked as being indexed. This reflects - an internal change to how primary keys are handled that should not have any - other visible effects. ([#6440](https://github.com/realm/realm-swift/pull/6440)). -* Remove everything related to sync permissions, including both the path-based - permission system and the object-level privileges for query-based sync. ([#6445](https://github.com/realm/realm-swift/pulls/6445)) -* Primary key uniqueness is now enforced when creating new objects during - migrations, rather than only at the end of migrations. Previously new objects - could be created with duplicate primary keys during a migration as long as - the property was changed to a unique value before the end of the migration, - but now a unique value must be supplied when creating the object. -* Remove support for Realm Object Server. - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 - -5.5.0 Release notes (2020-10-12) -============================================================= - -### Enhancements - -* Add the ability to capture a NotificationToken when using a Combine publisher - that observes a Realm Object or Collection. The user will call - `saveToken(on:at:)` directly after invoking the publisher to use the feature. - -### Fixed - -* When using `Realm.write(withoutNotifying:)` there was a chance that the - supplied observation blocks would not be skipped when in a write transaction. - ([Object Store #1103](https://github.com/realm/realm-object-store/pull/1103)) -* Comparing two identical unmanaged `List<>`/`RLMArray` objects would fail. - ([#5665](https://github.com/realm/realm-swift/issues/5665)). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -5.4.8 Release notes (2020-10-05) -============================================================= - -### Fixed - -* Case-insensitive equality queries on indexed string properties failed to - clear some internal state when rerunning the query. This could manifest as - duplicate results or "key not found" errors. - ([#6830](https://github.com/realm/realm-swift/issues/6830), [#6694](https://github.com/realm/realm-swift/issues/6694), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v6.1.3 to v6.1.4 -* Upgraded realm-sync from v5.0.28 to v5.0.29 - -5.4.7 Release notes (2020-09-30) -============================================================= - -### Fixed - -* Equality queries on indexed string properties would sometimes throw "key not - found" exceptions if the hash of the string happened to have bit 62 set. - ([.NET #2025](https://github.com/realm/realm-dotnet/issues/2025), since v5.0.0). -* Queries comparing non-optional int properties to nil would behave as if they - were comparing against zero instead (since v5.0.0). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v6.1.2 to v6.1.3 -* Upgraded realm-sync from v5.0.27 to v5.0.28 - -5.4.6 Release notes (2020-09-29) -============================================================= - -5.4.5 failed to actually update the core version for installation methods other -than SPM. All changes listed there actually happened in this version for -non-SPM installation methods. - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-sync from v5.0.26 to v5.0.27 - -5.4.5 Release notes (2020-09-28) -============================================================= - -### Enhancements - -* Slightly (<5%) improve the performance of most operations which involve - reading from a Realm file. - -### Fixed - -* Rerunning a equality query on an indexed string property would give incorrect - results if a previous run of the query matched multiple objects and it now - matches one object. This could manifest as either finding a non-matching - object or a "key not found" exception being thrown. - ([#6536](https://github.com/realm/realm-swift/issues/6536), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v6.1.1 to v6.1.2 -* Upgraded realm-sync from v5.0.25 to v5.0.26 - -5.4.4 Release notes (2020-09-25) -============================================================= - -### Enhancements -* Improve the asymtotic performance of NOT IN queries on indexed properties. It - is now O(Number of Rows) rather than O(Number of Rows \* Number of values in IN clause.) - -### Fixed - -* Fix a crash inside `realm::Array(Type)::init_from_mem()` which would - sometimes occur when running a query over links immediately after creating - objects of the queried type. - ([#6789](https://github.com/realm/realm-swift/issues/6789) and possibly others, since 5.0.0). -* Possibly fix problems when changing the type of the primary key of an object - from optional to non-optional. - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v6.0.26 to v6.1.1 -* Upgraded realm-sync from v5.0.23 to v5.0.25 - -5.4.3 Release notes (2020-09-21) -============================================================= - -### Fixed - -* Fix compilation via Carthage when using Xcode 12 ([#6717](https://github.com/realm/realm-swift/issues/6717)). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.12 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -5.4.2 Release notes (2020-09-17) -============================================================= - -### Enhancements - -* Add prebuilt binary for Xcode 12 to the release package. - -### Fixed - -* Fix Archiving the Realm and RealmSwift frameworks with Xcode 12. - ([#6774](https://github.com/realm/realm-swift/issues/6774)) - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.12 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -5.4.1 Release notes (2020-09-16) -============================================================= - -### Enhancements - -* Add prebuilt binary for Xcode 11.7 to the release package. - -### Fixed - -* Fix deadlocks when opening a Realm file in both the iOS simulator and Realm - Studio ([#6743](https://github.com/realm/realm-swift/issues/6743), since 5.3.6). -* Fix Springboard deadlocking when an app is unsuspended while it has an open - Realm file which is stored in an app group on iOS 10-12 - ([#6749](https://github.com/realm/realm-swift/issues/6749), since 5.3.6). -* If you use encryption your application cound crash with a message like - "Opening Realm files of format version 0 is not supported by this version of - Realm". ([#6889](https://github.com/realm/realm-java/issues/6889) among others, since 5.0.0) -* Confining a Realm to a serial queue would throw an error claiming that the - queue was not a serial queue on iOS versions older than 12. - ([#6735](https://github.com/realm/realm-swift/issues/6735), since 5.0.0). -* Results would sometimes give stale results inside a write transaction if a - write which should have updated the Results was made before the first access - of a pre-existing Results object. - ([#6721](https://github.com/realm/realm-swift/issues/6721), since 5.0.0) - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.12 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.7. - -### Internal - -* Upgraded realm-core from v6.0.25 to v6.0.26 -* Upgraded realm-sync from v5.0.22 to v5.0.23 - -5.4.0 Release notes (2020-09-09) -============================================================= - -This version bumps the Realm file format version. This means that older -versions of Realm will be unable to open Realm files written by this version, -and a new version of Realm Studio will be required. There are no actual format -changes and the version bump is just to force a re-migration of incorrectly -upgraded Realms. - -### Fixed - -* Upgrading pre-5.x files with string primary keys would result in a file where - `realm.object(ofType:forPrimaryKey:)` would fail to find the object. - ([#6716](https://github.com/realm/realm-swift/issues/6716), since 5.2.0) -* A write transaction which modifies an object with more than 16 managed - properties and causes the Realm file to grow larger than 2 GB could cause an - assertion failure mentioning "m_has_refs". ([JS #3194](https://github.com/realm/realm-js/issues/3194), since 5.0.0). -* Objects with more than 32 properties could corrupt the Realm file and result - in a variety of crashes. ([Java #7057](https://github.com/realm/realm-java/issues/7057), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.12 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.23 to v6.0.25 -* Upgraded realm-sync from v5.0.20 to v5.0.22 - -5.3.6 Release notes (2020-09-02) -============================================================= - -### Fixed - -* Work around iOS 14 no longer allowing the use of file locks in shared - containers, which resulted in the OS killing an app which entered the - background while a Realm was open ([#6671](https://github.com/realm/realm-swift/issues/6671)). -* If an attempt to upgrade a realm has ended with a crash with "migrate_links()" - in the call stack, the realm was left in an invalid state. The migration - logic now handles this state and can complete upgrading files which were - incompletely upgraded by pre-5.3.4 versions. -* Fix deadlocks when writing to a Realm file on an exFAT partition from macOS. - ([#6691](https://github.com/realm/realm-swift/issues/6691)). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.19 to v6.0.23 -* Upgraded realm-sync from v5.0.16 to v5.0.20 - -5.3.5 Release notes (2020-08-20) -============================================================= - -### Fixed - -* Opening Realms on background threads could produce spurious Incorrect Thread - exceptions when a cached Realm existed for a previously existing thread with - the same thread ID as the current thread. - ([#6659](https://github.com/realm/realm-swift/issues/6659), - [#6689](https://github.com/realm/realm-swift/issues/6689), - [#6712](https://github.com/realm/realm-swift/issues/6712), since 5.0.0). -* Upgrading a table with incoming links but no properties would crash. This was - probably not possible to hit in practice as we reject object types with no - properties. -* Upgrading a non-nullable List which nonetheless contained null values would - crash. This was possible due to missing error-checking in some older versions - of Realm. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.18 to v6.0.19 -* Upgraded realm-sync from v5.0.15 to v5.0.16 - -5.3.4 Release notes (2020-08-17) -============================================================= - -### Fixed - -* Accessing a Realm after calling `deleteAll()` would sometimes throw an - exception with the reason 'ConstIterator copy failed'. ([#6597](https://github.com/realm/realm-swift/issues/6597), since 5.0.0). -* Fix an assertion failure inside the `migrate_links()` function when upgrading - a pre-5.0 Realm file. -* Fix a bug in memory mapping management. This bug could result in multiple - different asserts as well as segfaults. In many cases stack backtraces would - include members of the EncyptedFileMapping near the top - even if encryption - was not used at all. In other cases asserts or crashes would be in methods - reading an array header or array element. In all cases the application would - terminate immediately. ([Core #3838](https://github.com/realm/realm-core/pull/3838), since v5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.14 to v6.0.18 -* Upgraded realm-sync from v5.0.14 to v5.0.15 - -5.3.3 Release notes (2020-07-30) -============================================================= - -### Enhancements - -* Add support for the x86_64 watchOS simulator added in Xcode 12. - -### Fixed - -* (RLM)Results objects would incorrectly pin old read transaction versions - until they were accessed after a Realm was refreshed, resulting in the Realm - file growing to large sizes if a Results was retained but not accessed after - every write. ([#6677](https://github.com/realm/realm-swift/issues/6677), since 5.0.0). -* Fix linker errors when using SwiftUI previews with Xcode 12 when Realm was - installed via Swift Package Manager. ([#6625](https://github.com/realm/realm-swift/issues/6625)) - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.12 to v6.0.14 -* Upgraded realm-sync from v5.0.12 to v5.0.14 - -5.3.2 Release notes (2020-07-21) -============================================================= - -### Fixed - -* Fix a file format upgrade bug when opening older Realm files. Could cause - assertions like "Assertion failed: ref != 0" during opning of a Realm. - ([Core #6644](https://github.com/realm/realm-swift/issues/6644), since 5.2.0) -* A use-after-free would occur if a Realm was compacted, opened on multiple - threads prior to the first write, then written to while reads were happening - on other threads. This could result in a variety of crashes, often inside - realm::util::EncryptedFileMapping::read_barrier. - (Since v5.0.0, [#6626](https://github.com/realm/realm-swift/issues/6626), - [#6628](https://github.com/realm/realm-swift/issues/6628), - [#6652](https://github.com/realm/realm-swift/issues/6652), - [#6655](https://github.com/realm/realm-swift/issues/6555), - [#6656](https://github.com/realm/realm-swift/issues/6656)). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.11 to v6.0.12 -* Upgraded realm-sync from v5.0.11 to v5.0.12 - -5.3.1 Release notes (2020-07-17) -============================================================= - -### Enhancements - -* Add prebuilt binary for Xcode 11.6 to the release package. - -### Fixed - -* Creating an object inside migration which changed that object type's primary - key would hit an assertion failure mentioning primary_key_col - ([#6613](https://github.com/realm/realm-swift/issues/6613), since 5.0.0). -* Modifying the value of a string primary key property inside a migration with - a Realm file which was upgraded from pre-5.0 would corrupt the property's - index, typically resulting in crashes. ([Core #3765](https://github.com/realm/realm-core/issues/3765), since 5.0.0). -* Some Realm files which hit assertion failures when upgrading from the pre-5.0 - file format should now upgrade correctly (Since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.9 to v6.0.11 -* Upgraded realm-sync from v5.0.8 to v5.0.11 - -5.3.0 Release notes (2020-07-14) -============================================================= - -### Enhancements - -* Add `Realm.objectWillChange`, which is a Combine publisher that will emit a - notification each time the Realm is refreshed or a write transaction is - commited. - -### Fixed - -* Fix the spelling of `ObjectKeyIdentifiable`. The old spelling is available - and deprecated for compatibility. -* Rename `RealmCollection.publisher` to `RealmCollection.collectionPublisher`. - The old name interacted with the `publisher` defined by `Sequence` in very - confusing ways, so we need to use a different name. The `publisher` name is - still available for compatibility. ([#6516](https://github.com/realm/realm-swift/issues/6516)) -* Work around "xcodebuild timed out while trying to read - SwiftPackageManagerExample.xcodeproj" errors when installing Realm via - Carthage. ([#6549](https://github.com/realm/realm-swift/issues/6549)). -* Fix a performance regression when using change notifications. (Since 5.0.0, - [#6629](https://github.com/realm/realm-swift/issues/6629)). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v6.0.8 to v6.0.9 -* Upgraded realm-sync from v5.0.7 to v5.0.8 - -5.2.0 Release notes (2020-06-30) -============================================================= - -### Fixed -* Opening a SyncSession with LOCAL app deployments would not use the correct endpoints. -This release also contains all changes from 5.0.3 and 5.1.0. - -### Breaking Changes -* The following classes & aliases have been renamed to align Cocoa with the other Realm SDKs: - -| Old API | New API | -|:------------------------------------------------------------|:---------------------------------------------------------------| -| `RLMSyncUser` | `RLMUser` | -| `SyncUser` | `User` | -| `RLMAppCredential` | `RLMCredential` | -| `AppCredential` | `Credential` | -| `RealmApp` | `App` | -| `RLMUserAPIKeyProviderClient` | `RLMAPIKeyAuth` | -| `RLMUsernamePasswordProviderClient` | `RLMEmailPasswordAuth` | -| `UsernamePasswordProviderClient` | `EmailPasswordAuth` | -| `UserAPIKeyProviderClient` | `APIKeyAuth` | - -* The following functionality has also moved to the User: - -| Old API | New API | -|:-------------------------------------------------------------|:--------------------------------------------------------------| -| `[RLMApp callFunctionNamed:]` | `[RLMUser callFunctionNamed:]` | -| `App.functions` | `User.functions` | -| `[RLMApp mongoClientWithServiceName:]` | `[RLMUser mongoClientWithServiceName:]` | -| `App.mongoClient(serviceName)` | `User.mongoClient(serviceName)` | -| `[RLMApp userAPIKeyProviderClient]` | `[RLMUser apiKeyAuth]` | -| `App.userAPIKeyProviderClient` | `App.apiKeyAuth()` | -| `[RLMApp logOut:]` | `[RLMUser logOut]` | -| `App.logOut(user)` | `User.logOut()` | -| `[RLMApp removeUser:]` | `[RLMUser remove]` | -| `App.remove(user)` | `User.remove()` | -| `[RLMApp linkUser:credentials:]` | `[RLMUser linkWithCredentials:]` | -| `App.linkUser(user, credentials)` | `User.link(credentials)` | - -* The argument labels in Swift have changed for several methods: -| Old API | New API | -|:-------------------------------------------------------------|:--------------------------------------------------------------| -| `APIKeyAuth.createApiKey(withName:completion:)` | `APIKeyAuth.createApiKey(named:completion:)` | -| `App.login(withCredential:completion:) | `App.login(credentials:completion:)` | -| `App.pushClient(withServiceName:)` | `App.pushClient(serviceName:)` | -| `MongoClient.database(withName:)` | `MongoClient.database(named:)` | - -* `refreshCustomData()` on User now returns void and passes the custom data to the callback on success. - -### Compatibility -* This release introduces breaking changes w.r.t some sync classes and MongoDB Realm Cloud functionality. - (See the breaking changes section for the full list) -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* Realm Studio: 10.0.0 or later. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 - -10.0.0-beta.2 Release notes (2020-06-09) -============================================================= -Xcode 11.3 and iOS 9 are now the minimum supported versions. - -### Enhancements - -* Add support for building with Xcode 12 beta 1. watchOS currently requires - removing x86_64 from the supported architectures. Support for the new 64-bit - watch simulator will come in a future release. - -### Fixed -* Opening a SyncSession with LOCAL app deployments would not use the correct endpoints. -* Linking from embedded objects to top-level objects was incorrectly disallowed. - -* Opening a Realm file in file format v6 (created by Realm Cocoa versions - between 2.4 and 2.10) would crash. (Since 5.0.0, [Core #3764](https://github.com/realm/realm-core/issues/3764)). -* Upgrading v9 (pre-5.0) Realm files would create a redundant search index for - primary key properties. This index would then be removed the next time the - Realm was opened, resulting in some extra i/o in the upgrade process. - (Since 5.0.0, [Core #3787](https://github.com/realm/realm-core/issues/3787)). -* Fixed a performance issue with upgrading v9 files with search indexes on - non-primary-key properties. (Since 5.0.0, [Core #3767](https://github.com/realm/realm-core/issues/3767)). - -### Compatibility -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 - -10.0.0-beta.1 Release notes (2020-06-08) -============================================================= - -NOTE: This version bumps the Realm file format to version 11. It is not -possible to downgrade to earlier versions. Older files will automatically be -upgraded to the new file format. Only [Realm Studio -10.0.0](https://github.com/realm/realm-studio/releases/tag/v10.0.0-beta.1) or -later will be able to open the new file format. - -### Enhancements - -* Add support for next generation sync. Support for syncing to MongoDB instead - of Realm Object Server. Applications must be created at realm.mongodb.com -* The memory mapping scheme for Realm files has changed to better support - opening very large files. -* Add support for the ObjectId data type. This is an automatically-generated - unique identifier similar to a GUID or a UUID. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for the Decimal128 data type. This is a 128-bit IEEE 754 decimal - floating point number similar to NSDecimalNumber. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for embedded objects. Embedded objects are objects which are - owned by a single parent object, and are deleted when that parent object is - deleted. They are defined by subclassing `EmbeddedObject` / - `RLMEmbeddedObject` rather than `Object` / `RLMObject`. -* Add `-[RLMSyncUser customData]`/`SyncUser.customData`. Custom data is - configured in your MongoDB Realm App. -* Add `-[RLMApp callFunctionNamed:arguments]`/`RealmApp.functions`. This is the - entry point for calling Remote MongoDB Realm functions. Functions allow you - to define and execute server-side logic for your application. Functions are - written in modern JavaScript (ES6+) and execute in a serverless manner. When - you call a function, you can dynamically access components of the current - application as well as information about the request to execute the function - and the logged in user that sent the request. -* Add `-[RLMApp mongoClientWithServiceName]`/`RealmApp.mongoClient`. This is - the entry point for calling your Remote MongoDB Service. The read operations - are `-[RLMMongoCollection findWhere:completion:]`, `-[RLMMongoCollection - countWhere:completion:]`and `-[RLMMongoCollection - aggregateWithPipeline:completion:]`. The write operations are - `-[RLMMongoCollection insertOneDocument:completion:]`, `-[RLMMongoCollection - insertManyDocuments:completion:]`, `-[RLMMongoCollection - updateOneDocument:completion:]`, `-[RLMMongoCollection - updateManyDocuments:completion:]`, `-[RLMMongoCollection - deleteOneDocument:completion:]`, and `-[RLMMongoCollection - deleteManyDocuments:completion:]`. If you are already familiar with MongoDB - drivers, it is important to understand that the remote MongoCollection only - provides access to the operations available in MongoDB Realm. -* Change `[RLMSyncUser - configurationWithPartitionValue:]`/`SyncUser.configuration(with:)` to accept - all BSON types. Partition values can currently be of types `String`, `Int`, - or `ObjectId`. Opening a realm by partition value is the equivalent of - previously opening a realm by URL. In this case, partitions are meant to be - more closely associated with your data. E.g., if you are running a `Dog` - kennel, and have a field `breed` that acts as your partition key, you could - open up realms based on the breed of the dogs. - -### Breaking Changes - -* We no longer support Realm Cloud (legacy), but instead the new "MongoDB - Realm" Cloud. MongoDB Realm is a serverless platform that enables developers - to quickly build applications without having to set up server infrastructure. - MongoDB Realm is built on top of MongoDB Atlas, automatically integrating the - connection to your database. -* Remove support for Query-based sync, including the configuration parameters - and the `RLMSyncSubscription` and `SyncSubscription` types ([#6437](https://github.com/realm/realm-swift/pull/6437)). -* Primary key properties are no longer marked as being indexed. This reflects - an internal change to how primary keys are handled that should not have any - other visible effects. ([#6440](https://github.com/realm/realm-swift/pull/6440)). -* Remove everything related to sync permissions, including both the path-based - permission system and the object-level privileges for query-based sync. ([#6445](https://github.com/realm/realm-swift/pulls/6445)) -* Primary key uniqueness is now enforced when creating new objects during - migrations, rather than only at the end of migrations. Previously new objects - could be created with duplicate primary keys during a migration as long as - the property was changed to a unique value before the end of the migration, - but now a unique value must be supplied when creating the object. -* Remove support for Realm Object Server. - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* `List.index(of:)` would give incorrect results if it was the very first thing - called on that List after a Realm was refreshed following a write which - modified the List. (Since 5.0.0, [#6606](https://github.com/realm/realm-swift/issues/6606)). -* If a ThreadSafeReference was the only remaining reference to a Realm, - multiple copies of the file could end up mapped into memory at once. This - probably did not have any symptoms other than increased memory usage. (Since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 -* Upgraded realm-core from v6.0.6 to v6.0.7 -* Upgraded realm-sync from v5.0.5 to v5.0.6 -* Upgraded realm-core from v6.0.6 to v6.0.8 -* Upgraded realm-sync from v5.0.5 to v5.0.7 - -5.1.0 Release notes (2020-06-22) -============================================================= - -### Enhancements - -* Allow opening full-sync Realms in read-only mode. This disables local schema - initialization, which makes it possible to open a Realm which the user does - not have write access to without using asyncOpen. In addition, it will report - errors immediately when an operation would require writing to the Realm - rather than reporting it via the sync error handler only after the server - rejects the write. - -### Fixed - -* Opening a Realm using a configuration object read from an existing Realm - would incorrectly bind the new Realm to the original Realm's thread/queue, - resulting in "Realm accessed from incorrect thread." exceptions. - ([#6574](https://github.com/realm/realm-swift/issues/6574), - [#6559](https://github.com/realm/realm-swift/issues/6559), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -5.0.3 Release notes (2020-06-10) -============================================================= - -### Fixed - -* `-[RLMObject isFrozen]` always returned false. ([#6568](https://github.com/realm/realm-swift/issues/6568), since 5.0.0). -* Freezing an object within the write transaction that the object was created - in now throws an exception rather than crashing when the object is first - used. -* The schema for frozen Realms was not properly initialized, leading to crashes - when accessing a RLMLinkingObjects property. - ([#6568](https://github.com/realm/realm-swift/issues/6568), since 5.0.0). -* Observing `Object.isInvalidated` via a keypath literal would produce a - warning in Swift 5.2 due to the property not being marked as @objc. - ([#6554](https://github.com/realm/realm-swift/issues/6554)) - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -5.0.2 Release notes (2020-06-02) -============================================================= - -### Fixed - -* Fix errSecDuplicateItem (-25299) errors when opening a synchronized Realm - when upgrading from pre-5.0 versions of Realm. - ([#6538](https://github.com/realm/realm-swift/issues/6538), [#6494](https://github.com/realm/realm-swift/issues/6494), since 5.0.0). -* Opening Realms stored on filesystems which do not support preallocation (such - as ExFAT) would give "Operation not supported" exceptions. - ([#6508](https://github.com/realm/realm-swift/issues/6508), since 3.2.0). -* 'NoSuchTable' exceptions would sometimes be thrown after upgrading a Relam - file to the v10 format. ([Core #3701](https://github.com/realm/realm-core/issues/3701), since 5.0.0) -* If the upgrade process was interrupted/killed for various reasons, the - following run could stop with some assertions failing. No instances of this - happening were reported to us. (Since 5.0.0). -* Queries filtering a `List` where the query was on an indexed property over a - link would sometimes give incomplete results. - ([#6540](https://github.com/realm/realm-swift/issues/6540), since 4.1.0 but - more common since 5.0.0) -* Opening a file in read-only mode would attempt to make a spurious write to - the file, causing errors if the file was in read-only storage (since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v6.0.4 to v6.0.6 -* Upgraded realm-sync from v5.0.3 to v5.0.5 - -5.0.1 Release notes (2020-05-27) -============================================================= - -### Enhancements - -* Add prebuilt binary for Xcode 11.5 to the release package. - -### Fixed - -* Fix linker error when building a xcframework for Catalyst. - ([#6511](https://github.com/realm/realm-swift/issues/6511), since 4.3.1). -* Fix building for iOS devices when using Swift Package Manager - ([#6522](https://github.com/realm/realm-swift/issues/6522), since 5.0.0). -* `List` and `RealmOptional` properties on frozen objects were not initialized - correctly and would always report `nil` or an empty list. - ([#6527](https://github.com/realm/realm-swift/issues/6527), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -5.0.0 Release notes (2020-05-15) -============================================================= - -NOTE: This version bumps the Realm file format to version 10. It is not -possible to downgrade version 9 or earlier. Files created with older versions -of Realm will be automatically upgraded. Only -[Studio 3.11](https://github.com/realm/realm-studio/releases/tag/v3.11.0) or later will be able -to open the new file format. - -### Enhancements - -* Storing large binary blobs in Realm files no longer forces the file to be at - least 8x the size of the largest blob. -* Reduce the size of transaction logs stored inside the Realm file, reducing - file size growth from large transactions. -* Add support for frozen objects. `Realm`, `Results`, `List` and `Object` now - have `freeze()` methods which return a frozen copy of the object. These - objects behave similarly to creating unmanaged deep copies of the source - objects. They can be read from any thread and do not update when writes are - made to the Realm, but creating frozen objects does not actually copy data - out of the Realm and so can be much faster and use less memory. Frozen - objects cannot be mutated or observed for changes (as they never change). - ([PR #6427](https://github.com/realm/realm-swift/pull/6427)). -* Add the `isFrozen` property to `Realm`, `Results`, `List` and `Object`. -* Add `Realm.Configuration.maxNumberOfActiveVersions`. Each time a write - transaction is performed, a new version is created inside the Realm, and then - any versions which are no longer in use are cleaned up. If too many versions - are kept alive while performing writes (either due to a background thread - performing a long operation that doesn't let the Realm on that thread - refresh, or due to holding onto frozen versions for a long time) the Realm - file will grow in size, potentially to the point where it is too large to be - opened. Setting this configuration option will make write transactions which - would cause the live version count to exceed the limit to instead fail. -* Add support for queue-confined Realms. Rather than being bound to a specific - thread, queue-confined Realms are bound to a serial dispatch queue and can be - used within blocks dispatched to that queue regardless of what thread they - happen to run on. In addition, change notifications will be delivered to that - queue rather than the thread's run loop. ([PR #6478](https://github.com/realm/realm-swift/pull/6478)). -* Add an option to deliver object and collection notifications to a specific - serial queue rather than the current thread. ([PR #6478](https://github.com/realm/realm-swift/pull/6478)). -* Add Combine publishers for Realm types. Realm collections have a `.publisher` - property which publishes the collection each time it changes, and a - `.changesetPublisher` which publishes a `RealmCollectionChange` each time the - collection changes. Corresponding publishers for Realm Objects can be - obtained with the `publisher()` and `changesetPublisher()` global functions. -* Extend Combine publishers which output Realm types with a `.freeze()` - function which will make the publisher instead output frozen objects. -* String primary keys no longer require a separate index, improving insertion - and deletion performance without hurting lookup performance. -* Reduce the encrypted page reclaimer's impact on battery life when encryption - is used. ([Core #3461](https://github.com/realm/realm-core/pull/3461)). - -### Fixed - -* The uploaded bytes in sync progress notifications was sometimes incorrect and - wouldn't exactly equal the uploadable bytes when the uploaded completed. -* macOS binaries were built with the incorrect deployment target (10.14 rather - than 10.9), resulting in linker warnings. ([#6299](https://github.com/realm/realm-swift/issues/6299), since 3.18.0). -* An internal datastructure for List properties could be double-deleted if the - last reference was released from a thread other than the one which the List - was created on at the wrong time. This would typically manifest as - "pthread_mutex_destroy() failed", but could also result in other kinds of - crashes. ([#6333](https://github.com/realm/realm-swift/issues/6333)). -* Sorting on float or double properties containing NaN values had inconsistent - results and would sometimes crash due to out-of-bounds memory accesses. - ([#6357](https://github.com/realm/realm-swift/issues/6357)). - -### Breaking Changes - -* The ObjectChange type in Swift is now generic and includes a reference to the - object which changed. When using `observe(on:)` to receive notifications on a - dispatch queue, the object will be confined to that queue. -* The Realm instance passed in the callback to asyncOpen() is now confined to - the callback queue passed to asyncOpen() rather than the thread which the - callback happens to be called on. This means that the Realm instance may be - stored and reused in further blocks dispatched to that queue, but the queue - must now be a serial queue. -* Files containing Date properties written by version of Realm prior to 1.0 can - no longer be opened. -* Files containing Any properties can no longer be opened. This property type - was never documented and was deprecated in 1.0. -* Deleting objects now preserves the order of objects reported by unsorted - Results rather than performing a swap operation before the delete. Note that - it is still not safe to assume that the order of objects in an unsorted - Results is the order that the objects were created in. -* The minimum supported deployment target for iOS when using Swift Package - Manager to install Realm is now iOS 11. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.4.1. - -### Internal - -* Upgraded realm-core from v5.23.8 to v6.0.4 -* Upgraded realm-sync from v4.9.5 to v5.0.3 - -5.0.0-beta.6 Release notes (2020-05-08) -============================================================= - -### Enhancements - -* Add support for queue-confined Realms. Rather than being bound to a specific - thread, queue-confined Realms are bound to a serial dispatch queue and can be - used within blocks dispatched to that queue regardless of what thread they - happen to run on. In addition, change notifications will be delivered to that - queue rather than the thread's run loop. ([PR #6478](https://github.com/realm/realm-swift/pull/6478)). -* Add an option to deliver object and collection notifications to a specific - serial queue rather than the current thread. ([PR #6478](https://github.com/realm/realm-swift/pull/6478)). - -### Fixed - -* The uploaded bytes in sync progress notifications was sometimes incorrect and - wouldn't exactly equal the uploadable bytes when the uploaded completed. - -### Breaking Changes - -* The Realm instance passed in the callback to asyncOpen() is now confined to - the callback queue passed to asyncOpen() rather than the thread which the - callback happens to be called on. This means that the Realm instance may be - stored and reused in further blocks dispatched to that queue, but the queue - must now be a serial queue. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.4.1. - -### Internal - -* Upgraded realm-core from v6.0.3 to v6.0.4 -* Upgraded realm-sync from v5.0.1 to v5.0.3 - -4.4.1 Release notes (2020-04-16) -============================================================= - -### Enhancements - -* Upgrade Xcode 11.4 binaries to Xcode 11.4.1. - -### Fixed - -* Fix a "previous <= m_schema_transaction_version_max" assertion failure caused - by a race condition that could occur after performing a migration. (Since 3.0.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.4.1. - -5.0.0-beta.3 Release notes (2020-02-26) -============================================================= - -Based on 4.3.2 and also includes all changes since 4.3.0. - -### Enhancements - -* Add support for frozen objects. `Realm`, `Results`, `List` and `Object` now - have `freeze()` methods which return a frozen copy of the object. These - objects behave similarly to creating unmanaged deep copies of the source - objects. They can be read from any thread and do not update when writes are - made to the Realm, but creating frozen objects does not actually copy data - out of the Realm and so can be much faster and use less memory. Frozen - objects cannot be mutated or observed for changes (as they never change). - ([PR #6427](https://github.com/realm/realm-swift/pull/6427)). -* Add the `isFrozen` property to `Realm`, `Results`, `List` and `Object`. -* Add `Realm.Configuration.maxNumberOfActiveVersions`. Each time a write - transaction is performed, a new version is created inside the Realm, and then - any versions which are no longer in use are cleaned up. If too many versions - are kept alive while performing writes (either due to a background thread - performing a long operation that doesn't let the Realm on that thread - refresh, or due to holding onto frozen versions for a long time) the Realm - file will grow in size, potentially to the point where it is too large to be - opened. Setting this configuration option will make write transactions which - would cause the live version count to exceed the limit to instead fail. - - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-core from v6.0.0-beta.3 to v6.0.3 -* Upgraded realm-sync from v5.0.0-beta.2 to v5.0.1 - -5.0.0-beta.2 Release notes (2020-01-13) -============================================================= - -Based on 4.3.0 and also includes all changes since 4.1.1. - -### Fixed - -* Fix compilation when using CocoaPods targeting iOS versions older than 11 (since 5.0.0-alpha). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-core from v6.0.0-beta.2 to v6.0.0-beta.3 -* Upgraded realm-sync from v5.0.0-beta.1 to v5.0.0-beta.2 - -5.0.0-beta.1 Release notes (2019-12-13) -============================================================= - -Based on 4.1.1 and also includes all changes since 4.1.0. - -NOTE: This version bumps the Realm file format to version 10. It is not possible to downgrade version 9 or earlier. Files created with older versions of Realm will be automatically upgraded. - -### Enhancements - -* String primary keys no longer require a separate index, improving insertion - and deletion performance without hurting lookup performance. -* Reduce the encrypted page reclaimer's impact on battery life when encryption - is used. ([Core #3461](https://github.com/realm/realm-core/pull/3461)). - -### Fixed - -* Fix an error when a table-backed Results was accessed immediately after - deleting the object previously at the index being accessed (since - 5.0.0-alpha.1). -* macOS binaries were built with the incorrect deployment target (10.14 rather - than 10.9), resulting in linker warnings. ([#6299](https://github.com/realm/realm-swift/issues/6299), since 3.18.0). -* An internal datastructure for List properties could be double-deleted if the - last reference was released from a thread other than the one which the List - was created on at the wrong time. This would typically manifest as - "pthread_mutex_destroy() failed", but could also result in other kinds of - crashes. ([#6333](https://github.com/realm/realm-swift/issues/6333)). -* Sorting on float or double properties containing NaN values had inconsistent - results and would sometimes crash due to out-of-bounds memory accesses. - ([#6357](https://github.com/realm/realm-swift/issues/6357)). - -### Known Issues - -* Changing which property of an object is the primary key in a migration will - break incoming links to objects of that type. -* Changing the primary key of an object with Data properties in a migration - will crash. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-core from v6.0.0-alpha.24 to v6.0.0-beta.2 -* Upgraded realm-sync from 4.7.1-core6.5 to v5.0.0-beta.1 - -5.0.0-alpha.1 Release notes (2019-11-14) -============================================================= - -Based on 4.1.0. - -### Enhancements - -* Add `-[RLMRealm fileExistsForConfiguration:]`/`Realm.fileExists(for:)`, - which checks if a local Realm file exists for the given configuration. -* Add `-[RLMRealm deleteFilesForConfiguration:]`/`Realm.deleteFiles(for:)` - to delete the Realm file and all auxiliary files for the given configuration. -* Storing large binary blobs in Realm files no longer forces the file to be at - least 8x the size of the largest blob. -* Reduce the size of transaction logs stored inside the Realm file, reducing - file size growth from large transactions. - -NOTE: This version bumps the Realm file format to version 10. It is not -possible to downgrade version 9 or earlier. Files created with older versions -of Realm will be automatically upgraded. This automatic upgrade process is not -yet well tested. Do not open Realm files with data you care about with this -alpha version. - -### Breaking Changes - -* Files containing Date properties written by version of Realm prior to 1.0 can - no longer be opened. -* Files containing Any properties can no longer be opened. This property type - was never documented and was deprecated in 1.0. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades v9) -* Realm Object Server: 3.21.0 or later. -* APIs are backwards compatible with all previous releases in the 4.x.y series. -* Carthage release for Swift is built with Xcode 11.3. -* Carthage release for Swift is built with Xcode 11.2.1. - -### Internal - -* Upgraded realm-core from 5.23.6 to v6.0.0-alpha.24. -* Upgraded realm-sync from 4.8.2 to 4.7.1-core6.5. - -4.4.0 Release notes (2020-03-26) -============================================================= - -Swift 4.0 and Xcode 10.3 are now the minimum supported versions. - -### Enhancements - -* Allow setting the `fileUrl` for synchronized Realms. An appropriate local - path based on the sync URL will still be used if it is not overridden. - ([PR #6454](https://github.com/realm/realm-swift/pull/6454)). -* Add Xcode 11.4 binaries to the release package. - -### Fixed - -* None. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.4. - -4.3.2 Release notes (2020-02-06) -============================================================= - -### Enhancements - -* Similar to `autoreleasepool()`, `realm.write()` now returns the value which - the block passed to it returns. Returning `Void` from the block is still allowed. - -### Fixed - -* Fix a memory leak attributed to `property_copyAttributeList` the first time a - Realm is opened when using Realm Swift. ([#6409](https://github.com/realm/realm-swift/issues/6409), since 4.0.0). -* Connecting to a `realms:` sync URL would crash at runtime on iOS 11 (and no - other iOS versions) inside the SSL validation code. (Since 4.3.1). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-sync from 4.9.4 to 4.9.5. - -4.3.1 Release notes (2020-01-16) -============================================================= - -### Enhancements - -* Reduce the encrypted page reclaimer's impact on battery life when encryption - is used. ([Core #3461](https://github.com/realm/realm-core/pull/3461)). - -### Fixed - -* macOS binaries were built with the incorrect deployment target (10.14 rather - than 10.9), resulting in linker warnings. ([#6299](https://github.com/realm/realm-swift/issues/6299), since 3.18.0). -* An internal datastructure for List properties could be double-deleted if the - last reference was released from a thread other than the one which the List - was created on at the wrong time. This would typically manifest as - "pthread_mutex_destroy() failed", but could also result in other kinds of - crashes. ([#6333](https://github.com/realm/realm-swift/issues/6333)). -* Sorting on float or double properties containing NaN values had inconsistent - results and would sometimes crash due to out-of-bounds memory accesses. - ([#6357](https://github.com/realm/realm-swift/issues/6357)). -* A NOT query on a `List` which happened to have the objects in a - different order than the underlying table would sometimes include the object - immediately before an object which matches the query. ([#6289](https://github.com/realm/realm-swift/issues/6289), since 0.90.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-core from 5.23.6 to 5.23.8. -* Upgraded realm-sync from 4.9.0 to 4.9.4. - -4.3.0 Release notes (2019-12-19) -============================================================= - -### Enhancements - -* Add the ability to set a custom logger function on `RLMSyncManager` which is - called instead of the default NSLog-based logger. -* Expose configuration options for the various types of sync connection - timeouts and heartbeat intervals on `RLMSyncManager`. -* Add an option to have `Realm.asyncOpen()` report an error if the connection - times out rather than swallowing the error and attempting to reconnect until - it succeeds. - -### Fixed - -* Fix a crash when using value(forKey:) on a LinkingObjects property (including - when doing so indirectly, such as by querying on that property). - ([#6366](https://github.com/realm/realm-swift/issues/6366), since 4.0.0). -* Fix a rare crash in `ClientHistoryImpl::integrate_server_changesets()` which - would only happen in Debug builds (since v3.0.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-sync from 4.8.2 to 4.9.0. - -4.2.0 Release notes (2019-12-16) -============================================================= - -### Enhancements - -* Add `-[RLMRealm fileExistsForConfiguration:]`/`Realm.fileExists(for:)`, - which checks if a local Realm file exists for the given configuration. -* Add `-[RLMRealm deleteFilesForConfiguration:]`/`Realm.deleteFiles(for:)` - to delete the Realm file and all auxiliary files for the given configuration. - -### Fixed - -* None. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.3. - -4.1.1 Release notes (2019-11-18) -============================================================= - -### Fixed - -* The UpdatePolicy passed to `realm.add()` or `realm.create()` was not properly - propagated when adding objects within a `List`, which could result in - spurious change notifications when using `.modified`. - ([#6321](https://github.com/realm/realm-swift/issues/6321), since v3.16.0) -* Fix a rare deadlock when a Realm collection or object was observed, then - `refresh()` was explicitly called, and then the NotificationToken from the - observation was destroyed on a different thread (since 0.98.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.2. - -4.1.0 Release notes (2019-11-13) -============================================================= - -### Enhancements - -* Improve performance of queries over a link where the final target property - has an index. -* Restore support for storing `@objc enum` properties on RealmSwift.Object - subclasses (broken in 4.0.0), and add support for storing them in - RealmOptional properties. - -### Fixed - -* The sync client would fail to reconnect after failing to integrate a - changeset. The bug would lead to further corruption of the client’s Realm - file. ([RSYNC-48](https://jira.mongodb.org/browse/RSYNC-48), since v3.2.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.2. - -### Internal - -* Upgraded realm-core from 5.23.5 to 5.23.6. -* Upgraded realm-sync from 4.7.11 to 4.8.2 - -4.0.0 Release notes (2019-11-08) -============================================================= - -### Breaking Changes - -* All previously deprecated functionality has now been removed entirely. -* The schema discovery logic for RealmSwift.Object subclasses has been - rewritten in Swift. This should not have any effect on valid class - definitions, but there may be types of invalid definitions which previously - worked by coincidence and no longer do. -* `SyncSubscription` no longer has a generic type parameter, as the type was - not actually used for anything. -* The following Swift types have changed from `final class` to `struct`: - - AnyRealmCollection - - LinkingObjects - - ObjectiveCSupport - - Realm - - Results - - SyncSubscription - - ThreadSafeReference - There is no intended change in semantics from this, but certain edge cases - may behave differently. -* The designated initializers defined by RLMObject and Object other than - zero-argument `init` have been replaced with convenience initializers. -* The implementation of the path-based permissions API has been redesigned to - accomodate changes to the server. This should be mostly a transparent change, - with two main exceptions: - 1. SyncPermission objects are no longer live Realm objects, and retrieving - permissions gives an Array rather than Results. - Getting up-to-date permissions now requires calling retrievePermissions() again - rather than observing the permissions. - 2. The error codes for permissions functions have changed. Rather than a - separate error type and set of error codes, permission functions now produce - SyncAuthErrors. - -### Enhancements - -* Improve performance of initializing Realm objects with List properties. - -### Fixed - -* None. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.2. - -3.21.0 Release notes (2019-11-04) -============================================================= - -### Enhancements - -* Add prebuilt binaries for Xcode 11.2. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.2. - -3.20.0 Release notes (2019-10-21) -============================================================= - -### Enhancements - -* Add support for custom refresh token authentication. This allows a user to be - authorized with an externally-issued refresh token when ROS is configured to - recognize the external issuer as a refresh token validator. - ([PR #6311](https://github.com/realm/realm-swift/pull/6311)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11. - -3.19.1 Release notes (2019-10-17) -============================================================= - -### Enhancements - -* Improve performance of sync changeset integration. Transactions involving a - very large number of objects and cheap operations on each object are as much - as 20% faster. - -### Fixed - -* Fix a crash when a RLMArray/List of primitives was observed and then the - containing object was deleted before the first time that the background - notifier could run. - ([Issue #6234](https://github.com/realm/realm-swift/issues/6234, since 3.0.0)). -* Remove an incorrect assertion that would cause crashes inside - `TableInfoCache::get_table_info()`, with messages like "Assertion failed: info.object_id_index == 0 [3, 0]". - (Since 3.18.0, [#6268](https://github.com/realm/realm-swift/issues/6268) and [#6257](https://github.com/realm/realm-swift/issues/6257)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.0. - -### Internal - -* Upgrade to REALM_SYNC_VERSION=4.7.11 - -3.19.0 Release notes (2019-09-27) -============================================================= - -### Enhancements - -* Expose ObjectSchema.objectClass in Swift as looking up the class via - NSClassFromString() can be complicated for Swift types. - ([PR #6244](https://github.com/realm/realm-swift/pull/6244)). -* Add support for suppressing notifications using closure-based write/transaction methods. - ([PR #6252](https://github.com/realm/realm-swift/pull/6252)). - -### Fixed - -* IN or chained OR equals queries on an unindexed string column would fail to - match some results if any of the strings were 64 bytes or longer. - ([Core #3386](https://github.com/realm/realm-core/pull/3386), since 3.14.2). -* Query Based Sync subscriptions for queries involving a null timestamp were - not sent to the server correctly and would match no objects. - ([Core #3389](https://github.com/realm/realm-core/pull/3388), since 3.17.3). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.0. - -### Internal - -* Upgrade to REALM_CORE_VERSION=5.23.5 -* Upgrade to REALM_SYNC_VERSION=4.7.8 - -3.18.0 Release notes (2019-09-13) -============================================================= - -The file format for synchronized Realms has changed. Old Realms will be -automatically upgraded when they are opened. Once upgraded, the files will not -be openable by older versions of Realm. The upgrade should not take a -significant amount of time to run or run any risk of errors. - -This does not effect non-synchronized Realms. - -### Enhancements - -* Improve performance of queries on Date properties - ([Core #3344](https://github.com/realm/realm-core/pull/3344), [Core #3351](https://github.com/realm/realm-core/pull/3351)). -* Syncronized Realms are now more aggressive about trimming local history that - is no longer needed. This should reduce file size growth in write-heavy - workloads. ([Sync #3007](https://github.com/realm/realm-sync/issues/3007)). -* Add support for building Realm as an xcframework. - ([PR #6238](https://github.com/realm/realm-swift/pull/6238)). -* Add prebuilt libraries for Xcode 11 to the release package. - ([PR #6248](https://github.com/realm/realm-swift/pull/6248)). -* Add a prebuilt library for Catalyst/UIKit For Mac to the release package - ([PR #6248](https://github.com/realm/realm-swift/pull/6248)). - -### Fixed - -* If a signal interrupted a msync() call, Realm would throw an exception and - the write transaction would fail. This behavior has new been changed to retry - the system call instead. ([Core #3352](https://github.com/realm/realm-core/issues/3352)) -* Queries on the sum or average of an integer property would sometimes give - incorrect results. ([Core #3356](https://github.com/realm/realm-core/pull/3356)). -* Opening query-based synchronized Realms with a small number of subscriptions - performed an unneccesary write transaction. ([ObjectStore #815](https://github.com/realm/realm-object-store/pull/815)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.0 - -### Deprecations - -* `RLMIdentityProviderNickname` has been deprecated in favor of `RLMIdentityProviderUsernamePassword`. -* `+[RLMIdentityProvider credentialsWithNickname]` has been deprecated in favor of `+[RLMIdentityProvider credentialsWithUsername]`. -* `Sync.nickname(String, Bool)` has been deprecated in favor of `Sync.usernamePassword(String, String, Bool)`. - -3.17.3 Release notes (2019-07-24) -============================================================= - -### Enhancements - -* Add Xcode 10.3 binaries to the release package. Remove the Xcode 9.2 and 9.3 binaries. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.3. - -3.17.1 Release notes (2019-07-10) -============================================================= - -### Enhancements - -* Add support for canceling asynchronous opens using a new AsyncOpenTask - returned from the asyncOpen() call. ([PR #6193](https://github.com/realm/realm-swift/pull/6193)). -* Importing the Realm SPM package can now be done by pinning to a version - rather than a branch. - -### Fixed - -* Queries on a List/RLMArray which checked an indexed int property would - sometimes give incorrect results. - ([#6154](https://github.com/realm/realm-swift/issues/6154)), since v3.15.0) -* Queries involving an indexed int property had a memory leak if run multiple - times. ([#6186](https://github.com/realm/realm-swift/issues/6186)), since v3.15.0) -* Creating a subscription with `includeLinkingObjects:` performed unneccesary - comparisons, making it extremely slow when large numbers of objects were - involved. ([Core #3311](https://github.com/realm/realm-core/issues/3311), since v3.15.0) - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.17.0 Release notes (2019-06-28) -============================================================= - -### Enhancements - -* Add support for including Realm via Swift Package Manager. This currently - requires depending on the branch "master" rather than pinning to a version - (i.e. `.package(url: "https://github.com/realm/realm-swift", .branch("master"))`). - ([#6187](https://github.com/realm/realm-swift/pull/6187)). -* Add Codable conformance to RealmOptional and List, and Encodable conformance to Results. - ([PR #6172](https://github.com/realm/realm-swift/pull/6172)). - -### Fixed - -* Attempting to observe an unmanaged LinkingObjects object crashed rather than - throwing an approriate exception (since v0.100.0). -* Opening an encrypted Realm could potentially report that a valid file was - corrupted if the system was low on free memory. - (since 3.14.0, [Core #3267](https://github.com/realm/realm-core/issues/3267)) -* Calling `Realm.asyncOpen()` on multiple Realms at once would sometimes crash - due to a `FileNotFound` exception being thrown on a background worker thread. - (since 3.16.0, [ObjectStore #806](https://github.com/realm/realm-object-store/pull/806)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.16.2 Release notes (2019-06-14) -============================================================= - -### Enhancements - -* Add support for Xcode 11 Beta 1. Xcode betas are only supported when building - from source, and not when using a prebuilt framework. - ([PR #6164](https://github.com/realm/realm-swift/pull/6164)). - -### Fixed - -* Using asyncOpen on query-based Realms which didn't already exist on the local - device would fail with error 214. - ([#6178](https://github.com/realm/realm-swift/issues/6178), since 3.16.0). -* asyncOpen on query-based Realms did not wait for the server-created - permission objects to be downloaded, resulting in crashes if modifications to - the permissions were made before creating a subscription for the first time (since 3.0.0). -* EINTR was not handled correctly in the notification worker, which may have - resulted in inconsistent and rare assertion failures in - `ExternalCommitHelper::listen()` when building with assertions enabled. - (PR: [#804](https://github.com/realm/realm-object-store/pull/804), since 0.91.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.16.1 Release notes (2019-05-31) -============================================================= - -### Fixed - -* The static type passed at compile time to `realm.create()` was checked for a - primary key rather than the actual type passed at runtime, resulting in - exceptions like "''RealmSwiftObject' does not have a primary key and can not - be updated'" being thrown even if the object type being created has a primary - key. (since 3.16.0, [#6159](https://github.com/realm/realm-swift/issues/6159)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.16.0 Release notes (2019-05-29) -============================================================= - -### Enhancements - -* Add an option to only set the properties which have values different from the - existing ones when updating an existing object with - `Realm.create()`/`-[RLMObject createOrUpdateInRealm:withValue:]`. This makes - notifications report only the properties which have actually changed, and - improves Object Server performance by reducing the number of operations to - merge. (Issue: [#5970](https://github.com/realm/realm-swift/issues/5970), - PR: [#6149](https://github.com/realm/realm-swift/pull/6149)). -* Using `-[RLMRealm asyncOpenWithConfiguration:callbackQueue:]`/`Realm.asyncOpen()` to open a - synchronized Realm which does not exist on the local device now uses an - optimized transfer method to download the initial data for the Realm, greatly - speeding up the first start time for applications which use full - synchronization. This is currently not applicable to query-based - synchronization. (PR: [#6106](https://github.com/realm/realm-swift/pull/6106)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.15.0 Release notes (2019-05-06) -============================================================= - -The minimum version of Realm Object Server has been increased to 3.21.0 and -attempting to connect to older versions will produce protocol mismatch errors. -Realm Cloud has already been upgraded to this version, and users using that do -not need to worry about this. - -### Enhancements - -* Add `createdAt`, `updatedAt`, `expiresAt` and `timeToLive` properties to - `RLMSyncSubscription`/`SyncSubscription`. These properties will be `nil` for - subscriptions created with older versions of Realm, but will be automatically - populated for newly-created subscriptions. -* Add support for transient subscriptions by setting the `timeToLive` when - creating the subscription. The next time a subscription is created or updated - after that time has elapsed the subscription will be automatically removed. -* Add support for updating existing subscriptions with a new query or limit. - This is done by passing `update: true` (in swift) or setting - `options.overwriteExisting = YES` (in obj-c) when creating the subscription, - which will make it update the existing subscription with the same name rather - than failing if one already exists with that name. -* Add an option to include the objects from - `RLMLinkingObjects`/`LinkingObjects` properties in sync subscriptions, - similarly to how `RLMArray`/`List` automatically pull in the contained - objects. -* Improve query performance for chains of OR conditions (or an IN condition) on - an unindexed integer or string property. - ([Core PR #2888](https://github.com/realm/realm-core/pull/2888) and - [Core PR #3250](https://github.com/realm/realm-core/pull/3250)). -* Improve query performance for equality conditions on indexed integer properties. - ([Core PR #3272](https://github.com/realm/realm-core/pull/3272)). -* Adjust the file allocation algorithm to reduce fragmentation caused by large - numbers of small blocks. -* Improve file allocator logic to reduce fragmentation and improve commit - performance after many writes. ([Core PR #3278](https://github.com/realm/realm-core/pull/3278)). - -### Fixed - -* Making a query that compares two integer properties could cause a - segmentation fault on x86 (i.e. macOS only). - ([Core PR #3253](https://github.com/realm/realm-core/pull/3256)). -* The `downloadable_bytes` parameter passed to sync progress callbacks reported - a value which correlated to the amount of data left to download, but not - actually the number of bytes which would be downloaded. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.14.2 Release notes (2019-04-25) -============================================================= - -### Enhancements - -* Updating `RLMSyncManager.customRequestHeaders` will immediately update all - currently active sync session with the new headers rather than requiring - manually closing the Realm and reopening it. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.14.1 Release notes (2019-04-04) -============================================================= - -### Fixed - -* Fix "Cannot find interface declaration for 'RealmSwiftObject', superclass of - 'MyRealmObjectClass'" errors when building for a simulator with Xcode 10.2 - with "Install Objective-C Compatibility Header" enabled. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. -* Carthage release for Swift is built with Xcode 10.2. - -3.14.0 Release notes (2019-03-27) -============================================================= - -### Enhancements - -* Reduce memory usage when committing write transactions. -* Improve performance of compacting encrypted Realm files. - ([PR #3221](https://github.com/realm/realm-core/pull/3221)). -* Add a Xcode 10.2 build to the release package. - -### Fixed - -* Fix a memory leak whenever Realm makes a HTTP(s) request to the Realm Object - Server (Issue [#6058](https://github.com/realm/realm-swift/issues/6058), since 3.8.0). -* Fix an assertion failure when creating an object in a synchronized Realm - after creating an object with a null int primary key in the same write - transaction. - ([PR #3227](https://github.com/realm/realm-core/pull/3227)). -* Fix some new warnings when building with Xcode 10.2 beta. -* Properly clean up sync sessions when the last Realm object using the session - is deallocated while the session is explicitly suspended (since 3.9.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. -* Carthage release for Swift is built with Xcode 10.2. - -### Internal - -* Throw an exception rather than crashing with an assertion failure in more - cases when opening invalid Realm files. -* Upgrade to REALM_CORE_VERSION=5.14.0 -* Upgrade to REALM_SYNC_VERSION=3.15.1 - -3.13.1 Release notes (2019-01-03) -============================================================= - -### Fixed - -* Fix a crash when iterating over `Realm.subscriptions()` using for-in. - (Since 3.13.0, PR [#6050](https://github.com/realm/realm-swift/pull/6050)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -3.13.0 Release notes (2018-12-14) -============================================================= - -### Enhancements - -* Add `Realm.subscriptions()`/`-[RLMRealm subscriptions]` and - `Realm.subscription(named:)`/`-[RLMRealm subscriptionWithName:]` to enable - looking up existing query-based sync subscriptions. - (PR: https://github.com/realm/realm-swift/pull/6029). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -3.12.0 Release notes (2018-11-26) -============================================================= - -### Enhancements - -* Add a User-Agent header to HTTP requests made to the Realm Object Server. By - default, this contains information about the Realm library version and your - app's bundle ID. The application identifier can be customized by setting - `RLMSyncManager.sharedManager.userAgent`/`SyncManager.shared.userAgent` prior - to opening a synchronized Realm. - (PR: https://github.com/realm/realm-swift/pull/6007). -* Add Xcode 10.1 binary to the prebuilt package. - -### Fixed - -* None. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -### Internal - -* None. - - -3.11.2 Release notes (2018-11-15) -============================================================= - -### Enhancements - -* Improve the performance of the merge algorithm used for integrating remote - changes from the server. In particular, changesets involving many objects - which all link to a single object should be greatly improved. - -### Fixed - -* Fix a memory leak when removing notification blocks from collections. - PR: [#702](https://github.com/realm/realm-object-store/pull/702), since 1.1.0. -* Fix re-sorting or distincting an already-sorted Results using values from - linked objects. Previously the unsorted order was used to read the values - from the linked objects. - PR [#3102](https://github.com/realm/realm-core/pull/3102), since 3.1.0. -* Fix a set of bugs which could lead to bad changeset assertions when using - sync. The assertions would look something like the following: - `[realm-core-5.10.0] Assertion failed: ndx < size() with (ndx, size()) = [742, 742]`. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -### Internal - -* None. - - -3.11.1 Release notes (2018-10-19) -============================================================= - -### Enhancements - -* None. - -### Fixed - -* Fix `SyncUser.requestEmailConfirmation` not triggering the email confirmation - flow on ROS. (PR [#5953](https://github.com/realm/realm-swift/pull/5953), since 3.5.0) -* Add some missing validation in the getters and setters of properties on - managed Realm objects, which would sometimes result in an application - crashing with a segfault rather than the appropriate exception being thrown - when trying to write to an object which has been deleted. - (PR [#5952](https://github.com/realm/realm-swift/pull/5952), since 2.8.0) - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -### Internal - -* None. - - -3.11.0 Release notes (2018-10-04) -============================================================= - -### Enhancements -* Reduce memory usage when integrating synchronized changes sent by ROS. -* Devices will now report download progress for read-only Realms, allowing the - server to compact Realms more aggressively and reducing the amount of - server-side storage space required. - -### Fixed -* Fix a crash when adding an object with a non-`@objc` `String?` property which - has not been explicitly ignored to a Realm on watchOS 5 (and possibly other - platforms when building with Xcode 10). - (Issue: [5929](https://github.com/realm/realm-swift/issues/5929)). -* Fix some merge algorithm bugs which could result in `BadChangesetError` - being thrown when integrating changes sent by the server. - -### Compatibility -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* **NOTE!!! - You will need to upgrade your Realm Object Server to at least version 3.11.0 - or use [Realm Cloud](https://cloud.realm.io). - If you try to connect to a ROS v3.10.x or previous, you will see an error - like `Wrong protocol version in Sync HTTP request, client protocol version = 25, - server protocol version = 24`.** - -### Internal -* Update to Sync 3.12.2. - - -3.10.0 Release notes (2018-09-19) -============================================================= - -Prebuilt binaries are now built for Xcode 9.2, 9.3, 9.4 and 10.0. - -Older versions of Xcode are still supported when building from source, but you -should be migrating to at least Xcode 9.2 as soon as possible. - -### Enhancements - -* Add support for Watch Series 4 by adding an arm64_32 slice to the library. - -3.9.0 Release notes (2018-09-10) -============================================================= - -### Enhancements - -* Expose RLMSyncUser.refreshToken publicly so that it can be used for custom - HTTP requests to Realm Object Server. -* Add RLMSyncSession.connectionState, which reports whether the session is - currently connected to the Realm Object Server or if it is offline. -* Add `-suspend` and `-resume` methods to `RLMSyncSession` to enable manually - pausing data synchronization. -* Add support for limiting the number of objects matched by a query-based sync - subscription. This requires a server running ROS 3.10.1 or newer. - -### Bugfixes - -* Fix crash when getting the description of a `MigrationObject` which has - `List` properties. -* Fix crash when calling `dynamicList()` on a `MigrationObject`. - -3.8.0 Release notes (2018-09-05) -============================================================= - -### Enhancements - -* Remove some old and no longer applicable migration logic which created an - unencrypted file in the sync metadata directory containing a list of ROS URLs - connected to. -* Add support for pinning SSL certificates used for https and realms - connections by setting `RLMSyncManager.sharedManager.pinnedCertificatePaths` - in obj-c and `SyncManager.shared.pinnedCertificatePaths` in Swift. - -### Bugfixes - -* Fix warnings when building Realm as a static framework with CocoaPods. - -3.7.6 Release notes (2018-08-08) -============================================================= - -### Enhancements - -* Speed up the actual compaction when using compact-on-launch. -* Reduce memory usage when locally merging changes from sync. -* When first connecting to a server, wait to begin uploading changes until - after all changes have been downloaded to reduce the server-side load for - query-based sync. - -3.7.5 Release notes (2018-07-23) -============================================================= - -### Enhancements - -* Improve performance of applying remote changesets from sync. -* Improve performance of creating objects with string primary keys. -* Improve performance of large write transactions. -* Adjust file space allocation strategy to reduce fragmentation, producing - smaller Realm files and typically better performance. -* Close network connections immediately when a sync session is destroyed. -* Report more information in `InvalidDatabase` exceptions. - -### Bugfixes - -* Fix permission denied errors for RLMPlatform.h when building with CocoaPods - and Xcode 10 beta 3. -* Fix a use-after-free when canceling a write transaction which could result in - incorrect "before" values in KVO observations (typically `nil` when a non-nil - value is expected). -* Fix several bugs in the merge algorithm that could lead to memory corruption - and crashes with errors like "bad changeset" and "unreachable code". - -3.7.4 Release notes (2018-06-19) -============================================================= - -### Bugfixes - -* Fix a bug which could potentially flood Realm Object Server with PING - messages after a client device comes back online. - -3.7.3 Release notes (2018-06-18) -============================================================= - -### Enhancements - -* Avoid performing potentially large amounts of pointless background work for - LinkingObjects instances which are accessed and then not immediate deallocated. - -### Bugfixes - -* Fix crashes which could result from extremely fragmented Realm files. -* Fix a bug that could result in a crash with the message "bad changeset error" - when merging changesets from the server. - -3.7.2 Release notes (2018-06-13) -============================================================= - -### Enhancements - -* Add some additional consistency checks that will hopefully produce better - errors when the "prev_ref + prev_size <= ref" assertion failure occurs. - -### Bugfixes - -* Fix a problem in the changeset indexing algorithm that would sometimes - cause "bad permission object" and "bad changeset" errors. -* Fix a large number of linking warnings about symbol visibility by aligning - compiler flags used. -* Fix large increase in size of files produced by `Realm.writeCopy()` introduced in 3.6.0. - -3.7.1 Release notes (2018-06-07) -============================================================= - -* Add support for compiling Realm Swift with Xcode 10 beta 1. - -3.7.0 Release notes (2018-06-06) -============================================================= - -The feature known as Partial Sync has been renamed to Query-based -Synchronization. This has impacted a number of API's. See below for the -details. - -### Deprecations - -* `+[RLMSyncConfiguration initWithUser] has been deprecated in favor of `-[RLMSyncUser configurationWithURL:url]. -* `+[RLMSyncConfiguration automaticConfiguration] has been deprecated in favor of `-[RLMSyncUser configuration]. -* `+[RLMSyncConfiguration automaticConfigurationForUser] has been deprecated in favor of `-[RLMSyncUser configuration]. -* `-[RLMSyncConfiguration isPartial] has been deprecated in favor of `-[RLMSyncConfiguration fullSynchronization]`. - -### Enhancements - -* Add `-[RLMRealm syncSession]` and `Realm.syncSession` to obtain the session used for a synchronized Realm. -* Add `-[RLMSyncUser configuration]`. Query-based sync is the default sync mode for this configuration. -* Add `-[RLMSyncUser configurationWithURL:url]`. Query-based sync is the default sync mode for this configuration. - -3.6.0 Release notes (2018-05-29) -============================================================= - -### Enhancements - -* Improve performance of sync metadata operations and resolving thread-safe - references. -* `shouldCompactOnLaunch` is now supported for compacting the local data of - synchronized Realms. - -### Bugfixes - -* Fix a potential deadlock when a sync session progress callback held the last - strong reference to the sync session. -* Fix some cases where comparisons to `nil` in queries were not properly - serialized when subscribing to a query. -* Don't delete objects added during a migration after a call to `-[RLMMigration - deleteDataForClassName:]`. -* Fix incorrect results and/or crashes when multiple `-[RLMMigration - enumerateObjects:block:]` blocks deleted objects of the same type. -* Fix some edge-cases where `-[RLMMigration enumerateObjects:block:]` - enumerated the incorrect objects following deletions. -* Restore the pre-3.5.0 behavior for Swift optional properties missing an ivar - rather than crashing. - -3.5.0 Release notes (2018-04-25) -============================================================= - -### Enhancements - -* Add wrapper functions for email confirmation and password reset to `SyncUser`. - -### Bugfixes - -* Fix incorrect results when using optional chaining to access a RealmOptional - property in Release builds, or otherwise interacting with a RealmOptional - object after the owning Object has been deallocated. - -3.4.0 Release notes (2018-04-19) -============================================================= - -The prebuilt binary for Carthage is now built for Swift 4.1. - -### Enhancements - -* Expose `RLMSyncManager.authorizationHeaderName`/`SyncManager.authorizationHeaderName` - as a way to override the transport header for Realm Object Server authorization. -* Expose `RLMSyncManager.customRequestHeaders`/`SyncManager.customRequestHeaders` - which allows custom HTTP headers to be appended on requests to the Realm Object Server. -* Expose `RLMSSyncConfiguration.urlPrefix`/`SyncConfiguration.urlPrefix` as a mechanism - to replace the default path prefix in Realm Sync WebSocket requests. - -3.3.2 Release notes (2018-04-03) -============================================================= - -Add a prebuilt binary for Xcode 9.3. - -3.3.1 Release notes (2018-03-28) -============================================================= - -Realm Object Server v3.0.0 or newer is required when using synchronized Realms. - -### Enhancements - -* Expose `RLMObject.object(forPrimaryKey:)` as a factory method for Swift so - that it is callable with recent versions of Swift. - -### Bugfixes - -* Exclude the RLMObject-derived Permissions classes from the types repored by - `Realm.Configuration.defaultConfiguration.objectTypes` to avoid a failed - cast. -* Cancel pending `Realm.asyncOpen()` calls when authentication fails with a - non-transient error such as missing the Realm path in the URL. -* Fix "fcntl() inside prealloc()" errors on APFS. - -3.3.0 Release notes (2018-03-19) -============================================================= - -Realm Object Server v3.0.0 or newer is required when using synchronized Realms. - -### Enhancements - -* Add `Realm.permissions`, `Realm.permissions(forType:)`, and `Realm.permissions(forClassNamed:)` as convenience - methods for accessing the permissions of the Realm or a type. - -### Bugfixes - -* Fix `+[RLMClassPermission objectInRealm:forClass:]` to work for classes that are part of the permissions API, - such as `RLMPermissionRole`. -* Fix runtime errors when applications define an `Object` subclass with the - same name as one of the Permissions object types. - -3.2.0 Release notes (2018-03-15) -============================================================= - -Realm Object Server v3.0.0 or newer is required when using synchronized Realms. - -### Enhancements - -* Added an improved API for adding subscriptions in partially-synchronized Realms. `Results.subscribe()` can be - used to subscribe to any result set, and the returned `SyncSubscription` object can be used to observe the state - of the subscription and ultimately to remove the subscription. See the documentation for more information - (). -* Added a fine-grained permissions system for use with partially-synchronized Realms. This allows permissions to be - defined at the level of individual objects or classes. See the documentation for more information - (). -* Added `SyncConfiguration.automatic()` and `SyncConfiguration.automatic(user:)`. - These methods return a `Realm.Configuration` appropriate for syncing with the default - synced Realm for the current (or specified) user. These should be considered the preferred methods - for accessing synced Realms going forwards. -* Added `+[RLMSyncSession sessionForRealm:]` to retrieve the sync session corresponding to a `RLMRealm`. - -### Bugfixes - -* Fix incorrect initalization of `RLMSyncManager` that made it impossible to - set `errorHandler`. -* Fix compiler warnings when building with Xcode 9.3. -* Fix some warnings when running with UBsan. - -3.2.0-rc.1 Release notes (2018-03-14) -============================================================= - -Realm Object Server v3.0.0-rc.1 or newer is required when using synchronized Realms. - -### Enhancements - -* Added `SyncConfiguration.automatic()` and `SyncConfiguration.automatic(user:)`. - These methods return a `Realm.Configuration` appropriate for syncing with the default - synced Realm for the current (or specified). These should be considered the preferred methods - for accessing synced Realms going forwards. -* A role is now automatically created for each user with that user as its only member. - This simplifies the common use case of restricting access to specific objects to a single user. - This role can be accessed at `PermissionUser.role`. -* Improved error reporting when the server rejects a schema change due to a lack of permissions. - -### Bugfixes - -* Fix incorrect initalization of `RLMSyncManager` that made it impossible to - set `errorHandler`. -* Fix compiler warnings when building with Xcode 9.3. - -3.2.0-beta.3 Release notes (2018-03-01) -============================================================= - -Realm Object Server v3.0.0-alpha.9 or newer is required when using synchronized Realms. - -### Bugfixes - -* Fix a crash that would occur when using partial sync with Realm Object Server v3.0.0-alpha.9. - -3.2.0-beta.2 Release notes (2018-02-28) -============================================================= - -Realm Object Server v3.0.0-alpha.8 or newer is required when using synchronized Realms. - -### Enhancements - -* Added `findOrCreate(forRoleNamed:)` and `findOrCreate(forRole:)` to `List` - to simplify the process of adding permissions for a role. -* Added `+permissionForRoleNamed:inArray:`, `+permissionForRoleNamed:onRealm:`, - `+permissionForRoleNamed:onClass:realm:`, `+permissionForRoleNamed:onClassNamed:realm:`, - and `+permissionForRoleNamed:onObject:` to `RLMSyncPermission` to simplify the process - of adding permissions for a role. -* Added `+[RLMSyncSession sessionForRealm:]` to retrieve the sync session corresponding to a `RLMRealm`. - -### Bugfixes - -* `PermissionRole.users` and `PermissionUser.roles` are now public as intended. -* Fixed the handling of `setPermissions` in `-[RLMRealm privilegesForRealm]` and related methods. - -3.2.0-beta.1 Release notes (2018-02-19) -============================================================= - -### Enhancements - -* Added an improved API for adding subscriptions in partially-synchronized Realms. `Results.subscribe()` can be - used to subscribe to any result set, and the returned `SyncSubscription` object can be used to observe the state - of the subscription and ultimately to remove the subscription. -* Added a fine-grained permissions system for use with partially-synchronized Realms. This allows permissions to be - defined at the level of individual objects or classes. See `Permission` and related types for more information. - -### Bugfixes - -* Fix some warnings when running with UBsan. - -3.1.1 Release notes (2018-02-03) -============================================================= - -Prebuilt Swift frameworks for Carthage are now built with Xcode 9.2. - -### Bugfixes - -* Fix a memory leak when opening Realms with an explicit `objectTypes` array - from Swift. - -3.1.0 Release notes (2018-01-16) -============================================================= - -* Prebuilt frameworks are now included for Swift 3.2.3 and 4.0.3. -* Prebuilt frameworks are no longer included for Swift 3.0.x. -* Building from source with Xcode versions prior to Xcode 8.3 is no longer supported. - -### Enhancements - -* Add `Results.distinct(by:)` / `-[RLMResults distinctResultsUsingKeyPaths:]`, which return a `Results` - containing only objects with unique values at the given key paths. -* Improve performance of change checking for notifications in certain cases. -* Realm Object Server errors not explicitly recognized by the client are now reported to the application - regardless. -* Add support for JSON Web Token as a sync credential source. -* Add support for Nickname and Anonymous Auth as a sync credential source. -* Improve allocator performance when writing to a highly fragmented file. This - should significantly improve performance when inserting large numbers of - objects which have indexed properties. -* Improve write performance for complex object graphs involving many classes - linking to each other. - -### Bugfixes - -* Add a missing check for a run loop in the permission API methods which - require one. -* Fix some cases where non-fatal sync errors were being treated as fatal errors. - -3.0.2 Release notes (2017-11-08) -============================================================= - -Prebuilt frameworks are now included for Swift 3.2.2 and 4.0.2. - -### Bugfixes - -* Fix a crash when a linking objects property is retrieved from a model object instance via - Swift subscripting. -* Fix incorrect behavior if a call to `posix_fallocate` is interrupted. - -3.0.1 Release notes (2017-10-26) -============================================================= - -### Bugfixes - -* Explicitly exclude KVO-generated object subclasses from the schema. -* Fix regression where the type of a Realm model class is not properly determined, causing crashes - when a type value derived at runtime by `type(of:)` is passed into certain APIs. -* Fix a crash when an `Object` subclass has implicitly ignored `let` - properties. -* Fix several cases where adding a notification block from within a - notification callback could produce incorrect results. - -3.0.0 Release notes (2017-10-16) -============================================================= - -### Breaking Changes -* iOS 7 is no longer supported. -* Synchronized Realms require a server running Realm Object Server v2.0 or higher. -* Computed properties on Realm object types are detected and no - longer added to the automatically generated schema. -* The Objective-C and Swift `create(_:, value: update:)` APIs now - correctly nil out nullable properties when updating an existing - object when the `value` argument specifies nil or `NSNull` for - the property value. -* `-[RLMRealm addOrUpdateObjects:]` and `-[RLMRealm deleteObjects:]` now - require their argument to conform to `NSFastEnumeration`, to match similar - APIs that also take collections. -* The way interactive sync errors (client reset and permission denied) - are delivered to the user has been changed. Instead of a block which can - be invoked to immediately delete the offending Realm file, an opaque - token object of type `RLMSyncErrorActionToken` will be returned in the - error object's `userInfo` dictionary. This error object can be passed - into the new `+[RLMSyncSession immediatelyHandleError:]` API to delete - the files. -* The return types of the `SyncError.clientResetInfo()` and - `SyncError.deleteRealmUserInfo()` APIs have been changed. They now return - `RLMSyncErrorActionToken`s or `SyncError.ActionToken`s instead of closures. -* The class methods `Object.className()`, `Object.objectUtilClass()`, and - the property `Object.isInvalidated` can no longer be overriden. -* The callback which runs when a sync user login succeeds or fails - now runs on the main queue by default, or can be explicitly specified - by a new `callbackQueue` parameter on the `{RLM}SyncUser.logIn(...)` API. -* Fix empty strings, binary data, and null on the right side of `BEGINSWITH`, - `ENDSWITH` and `CONTAINS` operators in predicates to match Foundation's - semantics of never matching any strings or data. -* Swift `Object` comparison and hashing behavior now works the same way as - that of `RLMObject` (objects are now only considered equatable if their - model class defines a primary key). -* Fix the way the hash property works on `Object` when the object model has - no primary key. -* Fix an issue where if a Swift model class defined non-generic managed - properties after generic Realm properties (like `List`), the schema - would be constructed incorrectly. Fixes an issue where creating such - models from an array could fail. -* Loosen `RLMArray` and `RLMResults`'s generic constraint from `RLMObject` to - `NSObject`. This may result in having to add some casts to disambiguate - types. -* Remove `RLMSyncPermissionResults`. `RLMSyncPermission`s are now vended out - using a `RLMResults`. This results collection supports all normal collection - operations except for setting values using key-value coding (since - `RLMSyncPermission`s are immutable) and the property aggregation operations. -* `RLMSyncUserInfo` has been significantly enhanced. It now contains metadata - about a user stored on the Realm Object Server, as well as a list of all user account - data associated with that user. -* Starting with Swift 4, `List` now conforms to `MutableCollection` instead of - `RangeReplaceableCollection`. For Swift 4, the empty collection initializer has been - removed, and default implementations of range replaceable collection methods that - make sense for `List` have been added. -* `List.removeLast()` now throws an exception if the list is empty, to more closely match - the behavior of the standard library's `Collection.removeLast()` implementation. -* `RealmCollection`'s associated type `Element` has been renamed `ElementType`. -* The following APIs have been renamed: - -| Old API | New API | -|:------------------------------------------------------------|:---------------------------------------------------------------| -| `NotificationToken.stop()` | `NotificationToken.invalidate()` | -| `-[RLMNotificationToken stop]` | `-[RLMNotificationToken invalidate]` | -| `RealmCollection.addNotificationBlock(_:)` | `RealmCollection.observe(_:)` | -| `RLMSyncProgress` | `RLMSyncProgressMode` | -| `List.remove(objectAtIndex:)` | `List.remove(at:)` | -| `List.swap(_:_:)` | `List.swapAt(_:_:)` | -| `SyncPermissionValue` | `SyncPermission` | -| `RLMSyncPermissionValue` | `RLMSyncPermission` | -| `-[RLMSyncPermission initWithRealmPath:userID:accessLevel]` | `-[RLMSyncPermission initWithRealmPath:identity:accessLevel:]` | -| `RLMSyncPermission.userId` | `RLMSyncPermission.identity` | -| `-[RLMRealm addOrUpdateObjectsInArray:]` | `-[RLMRealm addOrUpdateObjects:]` | - -* The following APIs have been removed: - -| Removed API | Replacement | -|:-------------------------------------------------------------|:------------------------------------------------------------------------------------------| -| `Object.className` | None, was erroneously present. | -| `RLMPropertyTypeArray` | `RLMProperty.array` | -| `PropertyType.array` | `Property.array` | -| `-[RLMArray sortedResultsUsingProperty:ascending:]` | `-[RLMArray sortedResultsUsingKeyPath:ascending:]` | -| `-[RLMCollection sortedResultsUsingProperty:ascending:]` | `-[RLMCollection sortedResultsUsingKeyPath:ascending:]` | -| `-[RLMResults sortedResultsUsingProperty:ascending:]` | `-[RLMResults sortedResultsUsingKeyPath:ascending:]` | -| `+[RLMSortDescriptor sortDescriptorWithProperty:ascending:]` | `+[RLMSortDescriptor sortDescriptorWithKeyPath:ascending:]` | -| `RLMSortDescriptor.property` | `RLMSortDescriptor.keyPath` | -| `AnyRealmCollection.sorted(byProperty:ascending:)` | `AnyRealmCollection.sorted(byKeyPath:ascending:)` | -| `List.sorted(byProperty:ascending:)` | `List.sorted(byKeyPath:ascending:)` | -| `LinkingObjects.sorted(byProperty:ascending:)` | `LinkingObjects.sorted(byKeyPath:ascending:)` | -| `Results.sorted(byProperty:ascending:)` | `Results.sorted(byKeyPath:ascending:)` | -| `SortDescriptor.init(property:ascending:)` | `SortDescriptor.init(keyPath:ascending:)` | -| `SortDescriptor.property` | `SortDescriptor.keyPath` | -| `+[RLMRealm migrateRealm:configuration:]` | `+[RLMRealm performMigrationForConfiguration:error:]` | -| `RLMSyncManager.disableSSLValidation` | `RLMSyncConfiguration.enableSSLValidation` | -| `SyncManager.disableSSLValidation` | `SyncConfiguration.enableSSLValidation` | -| `RLMSyncErrorBadResponse` | `RLMSyncAuthErrorBadResponse` | -| `RLMSyncPermissionResults` | `RLMResults` | -| `SyncPermissionResults` | `Results` | -| `RLMSyncPermissionChange` | `-[RLMSyncUser applyPermission:callback]` / `-[RLMSyncUser deletePermission:callback:]` | -| `-[RLMSyncUser permissionRealmWithError:]` | `-[RLMSyncUser retrievePermissionsWithCallback:]` | -| `RLMSyncPermissionOffer` | `-[RLMSyncUser createOfferForRealmAtURL:accessLevel:expiration:callback:]` | -| `RLMSyncPermissionOfferResponse` | `-[RLMSyncUser acceptOfferForToken:callback:]` | -| `-[NSError rlmSync_clientResetBlock]` | `-[NSError rlmSync_errorActionToken]` / `-[NSError rlmSync_clientResetBackedUpRealmPath]` | -| `-[NSError rlmSync_deleteRealmBlock]` | `-[NSError rlmSync_errorActionToken]` | - -### Enhancements -* `List` can now contain values of types `Bool`, `Int`, `Int8`, `Int16`, - `Int32`, `Int64`, `Float`, `Double`, `String`, `Data`, and `Date` (and - optional versions of all of these) in addition to `Object` subclasses. - Querying `List`s containing values other than `Object` subclasses is not yet - implemented. -* `RLMArray` can now be constrained with the protocols `RLMBool`, `RLMInt`, - `RLMFloat`, `RLMDouble`, `RLMString`, `RLMData`, and `RLMDate` in addition to - protocols defined with `RLM_ARRAY_TYPE`. By default `RLMArray`s of - non-`RLMObject` types can contain null. Indicating that the property is - required (by overriding `+requiredProperties:`) will instead make the values - within the array required. Querying `RLMArray`s containing values other than - `RLMObject` subclasses is not yet implemented. -* Add a new error code to denote 'permission denied' errors when working - with synchronized Realms, as well as an accompanying block that can be - called to inform the binding that the offending Realm's files should be - deleted immediately. This allows recovering from 'permission denied' - errors in a more robust manner. See the documentation for - `RLMSyncErrorPermissionDeniedError` for more information. -* Add Swift `Object.isSameObject(as:_)` API to perform the same function as - the existing Objective-C API `-[RLMObject isEqualToObject:]`. -* Opening a synced Realm whose local copy was created with an older version of - Realm Mobile Platfrom when a migration is not possible to the current version - will result in an `RLMErrorIncompatibleSyncedFile` / `incompatibleSyncedFile` - error. When such an error occurs, the original file is moved to a backup - location, and future attempts to open the synchronized Realm will result in a new - file being created. If you wish to migrate any data from the backup Realm you can - open it using the backup Realm configuration available on the error object. -* Add a preview of partial synchronization. Partial synchronization allows a - synchronized Realm to be opened in such a way that only objects requested by - the user are synchronized to the device. You can use it by setting the - `isPartial` property on a `SyncConfiguration`, opening the Realm, and then - calling `Realm.subscribe(to:where:callback:)` with the type of object you're - interested in, a string containing a query determining which objects you want - to subscribe to, and a callback which will report the results. You may add as - many subscriptions to a synced Realm as necessary. - -### Bugfixes -* Realm no longer throws an "unsupported instruction" exception in some cases - when opening a synced Realm asynchronously. -* Realm Swift APIs that filter or look up the index of an object based on a - format string now properly handle optional arguments in their variadic argument - list. -* `-[RLMResults indexOfObject:]` now properly accounts for access - level. -* Fix a race condition that could lead to a crash accessing to the freed configuration object - if a default configuration was set from a different thread. -* Fixed an issue that crash when enumerating after clearing data during migration. -* Fix a bug where a synced Realm couldn't be reopened even after a successful client reset - in some cases. -* Fix a bug where the sync subsystem waited too long in certain cases to reconnect to the server. -* Fix a bug where encrypted sync-related metadata was incorrectly deleted from upgrading users, - resulting in all users being logged out. -* Fix a bug where permission-related data continued to be synced to a client even after the user - that data belonged to logged out. -* Fix an issue where collection notifications might be delivered inconsistently if a notification - callback was added within another callback for the same collection. - -3.0.0-rc.2 Release notes (2017-10-14) -============================================================= - -### Enhancements -* Reinstate `RLMSyncPermissionSortPropertyUserID` to allow users to sort permissions - to their own Realms they've granted to others. - -### Bugfixes -* `-[RLMResults indexOfObject:]` now properly accounts for access - level. -* Fix a race condition that could lead to a crash accessing to the freed configuration object - if a default configuration was set from a different thread. -* Fixed an issue that crash when enumerating after clearing data during migration. -* Fix a bug where a synced Realm couldn't be reopened even after a successful client reset - in some cases. -* Fix a bug where the sync subsystem waited too long in certain cases to reconnect to the server. -* Fix a bug where encrypted sync-related metadata was incorrectly deleted from upgrading users, - resulting in all users being logged out. -* Fix a bug where permission-related data continued to be synced to a client even after the user - that data belonged to logged out. -* Fix an issue where collection notifications might be delivered inconsistently if a notification - callback was added within another callback for the same collection. - -3.0.0-rc.1 Release notes (2017-10-03) -============================================================= - -### Breaking Changes -* Remove `RLMSyncPermissionSortPropertyUserID` to reflect changes in how the - Realm Object Server reports permissions for a user. -* Remove `RLMSyncPermissionOffer` and `RLMSyncPermissionOfferResponse` classes - and associated helper methods and functions. Use the - `-[RLMSyncUser createOfferForRealmAtURL:accessLevel:expiration:callback:]` - and `-[RLMSyncUser acceptOfferForToken:callback:]` methods instead. - -### Bugfixes - -* The keychain item name used by Realm to manage the encryption keys for - sync-related metadata is now set to a per-app name based on the bundle - identifier. Keys that were previously stored within the single, shared Realm - keychain item will be transparently migrated to the per-application keychain - item. -* Fix downloading of the Realm core binaries when Xcode's command-line tools are - set as the active developer directory for command-line interactions. -* Fix a crash that could occur when resolving a ThreadSafeReference to a `List` - whose parent object had since been deleted. - -3.0.0-beta.4 Release notes (2017-09-22) -============================================================= - -### Breaking Changes - -* Rename `List.remove(objectAtIndex:)` to `List.remove(at:)` to match the name - used by 'RangeReplaceableCollection'. -* Rename `List.swap()` to `List.swapAt()` to match the name used by 'Array'. -* Loosen `RLMArray` and `RLMResults`'s generic constraint from `RLMObject` to - `NSObject`. This may result in having to add some casts to disambiguate - types. -* Remove `RLMPropertyTypeArray` in favor of a separate bool `array` property on - `RLMProperty`/`Property`. -* Remove `RLMSyncPermissionResults`. `RLMSyncPermission`s are now vended out - using a `RLMResults`. This results collection supports all normal collection - operations except for setting values using KVO (since `RLMSyncPermission`s are - immutable) and the property aggregation operations. -* `RealmCollection`'s associated type `Element` has been renamed `ElementType`. -* Realm Swift collection types (`List`, `Results`, `AnyRealmCollection`, and - `LinkingObjects` have had their generic type parameter changed from `T` to - `Element`). -* `RealmOptional`'s generic type parameter has been changed from `T` to `Value`. -* `RLMSyncUserInfo` has been significantly enhanced. It now contains metadata - about a user stored on the Realm Object Server, as well as a list of all user account - data associated with that user. -* Starting with Swift 4, `List` now conforms to `MutableCollection` instead of - `RangeReplaceableCollection`. For Swift 4, the empty collection initializer has been - removed, and default implementations of range replaceable collection methods that - make sense for `List` have been added. -* `List.removeLast()` now throws an exception if the list is empty, to more closely match - the behavior of the standard library's `Collection.removeLast()` implementation. - -### Enhancements - -* `List` can now contain values of types `Bool`, `Int`, `Int8`, `Int16`, - `Int32`, `Int64`, `Float`, `Double`, `String`, `Data`, and `Date` (and - optional versions of all of these) in addition to `Object` subclasses. - Querying `List`s containing values other than `Object` subclasses is not yet - implemented. -* `RLMArray` can now be constrained with the protocols `RLMBool`, `RLMInt`, - `RLMFloat`, `RLMDouble`, `RLMString`, `RLMData`, and `RLMDate` in addition to - protocols defined with `RLM_ARRAY_TYPE`. By default `RLMArray`s of - non-`RLMObject` types can contain null. Indicating that the property is - required (by overriding `+requiredProperties:`) will instead make the values - within the array required. Querying `RLMArray`s containing values other than - `RLMObject` subclasses is not yet implemented. -* Opening a synced Realm whose local copy was created with an older version of - Realm Mobile Platfrom when a migration is not possible to the current version - will result in an `RLMErrorIncompatibleSyncedFile` / `incompatibleSyncedFile` - error. When such an error occurs, the original file is moved to a backup - location, and future attempts to open the synchronized Realm will result in a new - file being created. If you wish to migrate any data from the backup Realm you can - open it using the backup Realm configuration available on the error object. -* Add preview support for partial synchronization. Partial synchronization is - allows a synchronized Realm to be opened in such a way that only objects - requested by the user are synchronized to the device. You can use it by setting - the `isPartial` property on a `SyncConfiguration`, opening the Realm, and then - calling `Realm.subscribe(to:where:callback:)` with the type of object you're - interested in, a string containing a query determining which objects you want - to subscribe to, and a callback which will report the results. You may add as - many subscriptions to a synced Realm as necessary. - -### Bugfixes - -* Realm Swift APIs that filter or look up the index of an object based on a - format string now properly handle optional arguments in their variadic argument - list. - -3.0.0-beta.3 Release notes (2017-08-23) -============================================================= - -### Breaking Changes - -* iOS 7 is no longer supported. -* Computed properties on Realm object types are detected and no - longer added to the automatically generated schema. -* `-[RLMRealm addOrUpdateObjectsInArray:]` has been renamed to - `-[RLMRealm addOrUpdateObjects:]` for consistency with similar methods - that add or delete objects. -* `-[RLMRealm addOrUpdateObjects:]` and `-[RLMRealm deleteObjects:]` now - require their argument to conform to `NSFastEnumeration`, to match similar - APIs that also take collections. -* Remove deprecated `{RLM}SyncPermission` and `{RLM}SyncPermissionChange` - classes. -* `{RLM}SyncPermissionValue` has been renamed to just `{RLM}SyncPermission`. - Its `userId` property has been renamed `identity`, and its - `-initWithRealmPath:userID:accessLevel:` initializer has been renamed - `-initWithRealmPath:identity:accessLevel:`. -* Remove deprecated `-[RLMSyncUser permissionRealmWithError:]` and - `SyncUser.permissionRealm()` APIs. Use the new permissions system. -* Remove deprecated error `RLMSyncErrorBadResponse`. Use - `RLMSyncAuthErrorBadResponse` instead. -* The way interactive sync errors (client reset and permission denied) - are delivered to the user has been changed. Instead of a block which can - be invoked to immediately delete the offending Realm file, an opaque - token object of type `RLMSyncErrorActionToken` will be returned in the - error object's `userInfo` dictionary. This error object can be passed - into the new `+[RLMSyncSession immediatelyHandleError:]` API to delete - the files. -* Remove `-[NSError rlmSync_clientResetBlock]` and - `-[NSError rlmSync_deleteRealmBlock]` APIs. -* The return types of the `SyncError.clientResetInfo()` and - `SyncError.deleteRealmUserInfo()` APIs have been changed. They now return - `RLMSyncErrorActionToken`s or `SyncError.ActionToken`s instead of closures. -* The (erroneously added) instance property `Object.className` has been - removed. -* The class methods `Object.className()`, `Object.objectUtilClass()`, and - the property `Object.isInvalidated` can no longer be overriden. -* The callback which runs when a sync user login succeeds or fails - now runs on the main queue by default, or can be explicitly specified - by a new `callbackQueue` parameter on the `{RLM}SyncUser.logIn(...)` API. -* Rename `{RLM}NotificationToken.stop()` to `invalidate()` and - `{RealmCollection,SyncPermissionResults}.addNotificationBlock(_:)` to - `observe(_:)` to mirror Foundation's new KVO APIs. -* The `RLMSyncProgress` enum has been renamed `RLMSyncProgressMode`. -* Remove deprecated `{RLM}SyncManager.disableSSLValidation` property. Disable - SSL validation on a per-Realm basis by setting the `enableSSLValidation` - property on `{RLM}SyncConfiguration` instead. -* Fix empty strings, binary data, and null on the right side of `BEGINSWITH`, - `ENDSWITH` and `CONTAINS` operators in predicates to match Foundation's - semantics of never matching any strings or data. -* Swift `Object` comparison and hashing behavior now works the same way as - that of `RLMObject` (objects are now only considered equatable if their - model class defines a primary key). -* Fix the way the hash property works on `Object` when the object model has - no primary key. -* Fix an issue where if a Swift model class defined non-generic managed - properties after generic Realm properties (like `List`), the schema - would be constructed incorrectly. Fixes an issue where creating such - models from an array could fail. - -### Enhancements - -* Add Swift `Object.isSameObject(as:_)` API to perform the same function as - the existing Objective-C API `-[RLMObject isEqualToObject:]`. -* Expose additional authentication-related errors that might be reported by - a Realm Object Server. -* An error handler can now be registered on `{RLM}SyncUser`s in order to - report authentication-related errors that affect the user. - -### Bugfixes - -* Sync users are now automatically logged out upon receiving certain types - of errors that indicate they are no longer logged into the server. For - example, users who are authenticated using third-party credentials will find - themselves logged out of the Realm Object Server if the third-party identity - service indicates that their credential is no longer valid. -* Address high CPU usage and hangs in certain cases when processing collection - notifications in highly-connected object graphs. - -3.0.0-beta.2 Release notes (2017-07-26) -============================================================= - -### Breaking Changes - -* Remove the following deprecated Objective-C APIs: - `-[RLMArray sortedResultsUsingProperty:ascending:]`, - `-[RLMCollection sortedResultsUsingProperty:ascending:]`, - `-[RLMResults sortedResultsUsingProperty:ascending:]`, - `+[RLMSortDescriptor sortDescriptorWithProperty:ascending:]`, - `RLMSortDescriptor.property`. - These APIs have been superseded by equivalent APIs that take - or return key paths instead of property names. -* Remove the following deprecated Objective-C API: - `+[RLMRealm migrateRealm:configuration:]`. - Please use `+[RLMRealm performMigrationForConfiguration:error:]` instead. -* Remove the following deprecated Swift APIs: - `AnyRealmCollection.sorted(byProperty:, ascending:)`, - `LinkingObjects.sorted(byProperty:, ascending:)`, - `List.sorted(byProperty:, ascending:)`, - `Results.sorted(byProperty:, ascending:)`, - `SortDescriptor.init(property:, ascending:)`, - `SortDescriptor.property`. - These APIs have been superseded by equivalent APIs that take - or return key paths instead of property names. -* The Objective-C and Swift `create(_:, value: update:)` APIs now - correctly nil out nullable properties when updating an existing - object when the `value` argument specifies nil or `NSNull` for - the property value. - -### Enhancements - -* It is now possible to create and log in multiple Realm Object Server users - with the same identity if they originate from different servers. Note that - if the URLs are different aliases for the same authentication server each - user will still be treated as separate (e.g. they will have their own copy - of each synchronized Realm opened using them). It is highly encouraged that - users defined using the access token credential type be logged in with an - authentication server URL specified; this parameter will become mandatory - in a future version of the SDK. -* Add `-[RLMSyncUser retrieveInfoForUser:identityProvider:completion:]` - API allowing administrator users to retrieve information about a user based - on their provider identity (for example, a username). Requires any edition - of the Realm Object Server 1.8.2 or later. - -### Bugfixes - -* Realm no longer throws an "unsupported instruction" exception in some cases - when opening a synced Realm asynchronously. - -3.0.0-beta Release notes (2017-07-14) -============================================================= - -### Breaking Changes - -* Synchronized Realms require a server running Realm Object Server v2.0 or higher. - -### Enhancements - -* Add a new error code to denote 'permission denied' errors when working - with synchronized Realms, as well as an accompanying block that can be - called to inform the binding that the offending Realm's files should be - deleted immediately. This allows recovering from 'permission denied' - errors in a more robust manner. See the documentation for - `RLMSyncErrorPermissionDeniedError` for more information. -* Add `-[RLMSyncPermissionValue initWithRealmPath:username:accessLevel:]` - API allowing permissions to be applied to a user based on their username - (usually, an email address). Requires any edition of the Realm Object - Server 1.6.0 or later. -* Improve performance of creating Swift objects which contain at least one List - property. - -### Bugfixes - -* `List.description` now reports the correct types for nested lists. -* Fix unmanaged object initialization when a nested property type returned - `false` from `Object.shouldIncludeInDefaultSchema()`. -* Don't clear RLMArrays on self-assignment. - -2.10.2 Release notes (2017-09-27) -============================================================= - -### Bugfixes - -* The keychain item name used by Realm to manage the encryption keys for - sync-related metadata is now set to a per-app name based on the bundle - identifier. Keys that were previously stored within the single, shared Realm - keychain item will be transparently migrated to the per-application keychain - item. -* Fix downloading of the Realm core binaries when Xcode's command-line tools are - set as the active developer directory for command-line interactions. -* Fix a crash that could occur when resolving a ThreadSafeReference to a `List` - whose parent object had since been deleted. - -2.10.1 Release notes (2017-09-14) -============================================================= - -Swift binaries are now produced for Swift 3.0, 3.0.1, 3.0.2, 3.1, 3.2 and 4.0. - -### Enhancements - -* Auxiliary files are excluded from backup by default. - -### Bugfixes - -* Fix more cases where assigning an RLMArray property to itself would clear the - RLMArray. - -2.10.0 Release notes (2017-08-21) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Expose additional authentication-related errors that might be reported by - a Realm Object Server. -* An error handler can now be registered on `{RLM}SyncUser`s in order to - report authentication-related errors that affect the user. - -### Bugfixes - -* Sorting Realm collection types no longer throws an exception on iOS 7. -* Sync users are now automatically logged out upon receiving certain types - of errors that indicate they are no longer logged into the server. For - example, users who are authenticated using third-party credentials will find - themselves logged out of the Realm Object Server if the third-party identity - service indicates that their credential is no longer valid. -* Address high CPU usage and hangs in certain cases when processing collection - notifications in highly-connected object graphs. - -2.9.1 Release notes (2017-08-01) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* The `shouldCompactOnLaunch` block is no longer invoked if the Realm at that - path is already open on other threads. -* Fix an assertion failure in collection notifications when changes are made to - the schema via sync while the notification block is active. - -2.9.0 Release notes (2017-07-26) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Add a new error code to denote 'permission denied' errors when working - with synchronized Realms, as well as an accompanying block that can be - called to inform the binding that the offending Realm's files should be - deleted immediately. This allows recovering from 'permission denied' - errors in a more robust manner. See the documentation for - `RLMSyncErrorPermissionDeniedError` for more information. -* Add `-[RLMSyncPermissionValue initWithRealmPath:username:accessLevel:]` - API allowing permissions to be applied to a user based on their username - (usually, an email address). Requires any edition of the Realm Object - Server 1.6.0 or later. -* Improve performance of creating Swift objects which contain at least one List - property. -* It is now possible to create and log in multiple Realm Object Server users - with the same identity if they originate from different servers. Note that - if the URLs are different aliases for the same authentication server each - user will still be treated as separate (e.g. they will have their own copy - of each synchronized Realm opened using them). It is highly encouraged that - users defined using the access token credential type be logged in with an - authentication server URL specified; this parameter will become mandatory - in a future version of the SDK. -* Add `-[RLMSyncUser retrieveInfoForUser:identityProvider:completion:]` - API allowing administrator users to retrieve information about a user based - on their provider identity (for example, a username). Requires any edition - of the Realm Object Server 1.8.2 or later. - -### Bugfixes - -* `List.description` now reports the correct types for nested lists. -* Fix unmanaged object initialization when a nested property type returned - `false` from `Object.shouldIncludeInDefaultSchema()`. -* Don't clear RLMArrays on self-assignment. - -2.8.3 Release notes (2017-06-20) -============================================================= - -### Bugfixes - -* Properly update RealmOptional properties when adding an object with `add(update: true)`. -* Add some missing quotes in error messages. -* Fix a performance regression when creating objects with primary keys. - -2.8.2 Release notes (2017-06-16) -============================================================= - -### Bugfixes - -* Fix an issue where synchronized Realms would eventually disconnect from the - remote server if the user object used to define their sync configuration - was destroyed. -* Restore support for changing primary keys in migrations (broken in 2.8.0). -* Revert handling of adding objects with nil properties to a Realm to the - pre-2.8.0 behavior. - -2.8.1 Release notes (2017-06-12) -============================================================= - -Add support for building with Xcode 9 Beta 1. - -### Bugfixes - -* Fix setting a float property to NaN. -* Fix a crash when using compact on launch in combination with collection - notifications. - -2.8.0 Release notes (2017-06-02) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Enable encryption on watchOS. -* Add `-[RLMSyncUser changePassword:forUserID:completion:]` API to change an - arbitrary user's password if the current user has administrative privileges - and using Realm's 'password' authentication provider. - Requires any edition of the Realm Object Server 1.6.0 or later. - -### Bugfixes - -* Suppress `-Wdocumentation` warnings in Realm C++ headers when using CocoaPods - with Xcode 8.3.2. -* Throw an appropriate error rather than crashing when an RLMArray is assigned - to an RLMArray property of a different type. -* Fix crash in large (>4GB) encrypted Realm files. -* Improve accuracy of sync progress notifications. -* Fix an issue where synchronized Realms did not connect to the remote server - in certain situations, such as when an application was offline when the Realms - were opened but later regained network connectivity. - -2.7.0 Release notes (2017-05-03) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Use reachability API to minimize the reconnection delay if the network - connection was lost. -* Add `-[RLMSyncUser changePassword:completion:]` API to change the current - user's password if using Realm's 'password' authentication provider. - Requires any edition of the Realm Object Server 1.4.0 or later. -* `{RLM}SyncConfiguration` now has an `enableSSLValidation` property - (and default parameter in the Swift initializer) to allow SSL validation - to be specified on a per-server basis. -* Transactions between a synced Realm and a Realm Object Server can now - exceed 16 MB in size. -* Add new APIs for changing and retrieving permissions for synchronized Realms. - These APIs are intended to replace the existing Realm Object-based permissions - system. Requires any edition of the Realm Object Server 1.1.0 or later. - -### Bugfixes - -* Support Realm model classes defined in Swift with overridden Objective-C - names (e.g. `@objc(Foo) class SwiftFoo: Object {}`). -* Fix `-[RLMMigration enumerateObjects:block:]` returning incorrect `oldObject` - objects when enumerating a class name after previously deleting a `newObject`. -* Fix an issue where `Realm.asyncOpen(...)` would fail to work when opening a - synchronized Realm for which the user only had read permissions. -* Using KVC to set a `List` property to `nil` now clears it to match the - behavior of `RLMArray` properties. -* Fix crash from `!m_awaiting_pong` assertion failure when using synced Realms. -* Fix poor performance or hangs when performing case-insensitive queries on - indexed string properties that contain many characters that don't differ - between upper and lower case (e.g., numbers, punctuation). - -2.6.2 Release notes (2017-04-21) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix an issue where calling `Realm.asyncOpen(...)` with a synchronized Realm - configuration would fail with an "Operation canceled" error. -* Fix initial collection notification sometimes not being delivered for synced - Realms. -* Fix circular links sometimes resulting in objects not being marked as - modified in change notifications. - -2.6.1 Release notes (2017-04-18) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix an issue where calling `Realm.asyncOpen(...)` with a synchronized Realm - configuration would crash in error cases rather than report the error. - This is a small source breaking change if you were relying on the error - being reported to be a `Realm.Error`. - -2.6.0 Release notes (2017-04-18) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Add a `{RLM}SyncUser.isAdmin` property indicating whether a user is a Realm - Object Server administrator. -* Add an API to asynchronously open a Realm and deliver it to a block on a - given queue. This performs all work needed to get the Realm to - a usable state (such as running potentially time-consuming migrations) on a - background thread before dispatching to the given queue. In addition, - synchronized Realms wait for all remote content available at the time the - operation began to be downloaded and available locally. -* Add `shouldCompactOnLaunch` block property when configuring a Realm to - determine if it should be compacted before being returned. -* Speed up case-insensitive queries on indexed string properties. -* Add RLMResults's collection aggregate methods to RLMArray. -* Add support for calling the aggregate methods on unmanaged Lists. - -### Bugfixes - -* Fix a deadlock when multiple processes open a Realm at the same time. -* Fix `value(forKey:)`/`value(forKeyPath:)` returning incorrect values for `List` properties. - -2.5.1 Release notes (2017-04-05) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix CocoaPods installation with static libraries and multiple platforms. -* Fix uncaught "Bad version number" exceptions on the notification worker thread - followed by deadlocks when Realms refresh. - -2.5.0 Release notes (2017-03-28) -============================================================= - -Files written by Realm this version cannot be read by earlier versions of Realm. -Old files can still be opened and files open in read-only mode will not be -modified. - -If using synchronized Realms, the Realm Object Server must be running version -1.3.0 or later. - -Swift binaries are now produced for Swift 3.0, 3.0.1, 3.0.2 and 3.1. - -### API Breaking Changes - -* None. - -### Enhancements - -* Add support for multi-level object equality comparisons against `NULL`. -* Add support for the `[d]` modifier on string comparison operators to perform - diacritic-insensitive comparisons. -* Explicitly mark `[[RLMRealm alloc] init]` as unavailable. -* Include the name of the problematic class in the error message when an - invalid property type is marked as the primary key. - -### Bugfixes - -* Fix incorrect column type assertions which could occur after schemas were - merged by sync. -* Eliminate an empty write transaction when opening a synced Realm. -* Support encrypting synchronized Realms by respecting the `encryptionKey` value - of the Realm's configuration. -* Fix crash when setting an `{NS}Data` property close to 16MB. -* Fix for reading `{NS}Data` properties incorrectly returning `nil`. -* Reduce file size growth in cases where Realm versions were pinned while - starting write transactions. -* Fix an assertion failure when writing to large `RLMArray`/`List` properties. -* Fix uncaught `BadTransactLog` exceptions when pulling invalid changesets from - synchronized Realms. -* Fix an assertion failure when an observed `RLMArray`/`List` is deleted after - being modified. - -2.4.4 Release notes (2017-03-13) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Add `(RLM)SyncPermission` class to allow reviewing access permissions for - Realms. Requires any edition of the Realm Object Server 1.1.0 or later. -* Further reduce the number of files opened per thread-specific Realm on macOS, - iOS and watchOS. - -### Bugfixes - -* Fix a crash that could occur if new Realm instances were created while the - application was exiting. -* Fix a bug that could lead to bad version number errors when delivering - change notifications. -* Fix a potential use-after-free bug when checking validity of results. -* Fix an issue where a sync session might not close properly if it receives - an error while being torn down. -* Fix some issues where a sync session might not reconnect to the server properly - or get into an inconsistent state if revived after invalidation. -* Fix an issue where notifications might not fire when the children of an - observed object are changed. -* Fix an issue where progress notifications on sync sessions might incorrectly - report out-of-date values. -* Fix an issue where multiple threads accessing encrypted data could result in - corrupted data or crashes. -* Fix an issue where certain `LIKE` queries could hang. -* Fix an issue where `-[RLMRealm writeCopyToURL:encryptionKey:error]` could create - a corrupt Realm file. -* Fix an issue where incrementing a synced Realm's schema version without actually - changing the schema could cause a crash. - -2.4.3 Release notes (2017-02-20) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Avoid copying copy-on-write data structures, which can grow the file, when the - write does not actually change existing values. -* Improve performance of deleting all objects in an RLMResults. -* Reduce the number of files opened per thread-specific Realm on macOS. -* Improve startup performance with large numbers of `RLMObject`/`Object` - subclasses. - -### Bugfixes - -* Fix synchronized Realms not downloading remote changes when an access token - expires and there are no local changes to upload. -* Fix an issue where values set on a Realm object using `setValue(value:, forKey:)` - that were not themselves Realm objects were not properly converted into Realm - objects or checked for validity. -* Fix an issue where `-[RLMSyncUser sessionForURL:]` could erroneously return a - non-nil value when passed in an invalid URL. -* `SyncSession.Progress.fractionTransferred` now returns 1 if there are no - transferrable bytes. -* Fix sync progress notifications registered on background threads by always - dispatching on a dedicated background queue. -* Fix compilation issues with Xcode 8.3 beta 2. -* Fix incorrect sync progress notification values for Realms originally created - using a version of Realm prior to 2.3.0. -* Fix LLDB integration to be able to display summaries of `RLMResults` once more. -* Reject Swift properties with names which cause them to fall in to ARC method - families rather than crashing when they are accessed. -* Fix sorting by key path when the declared property order doesn't match the order - of properties in the Realm file, which can happen when properties are added in - different schema versions. - -2.4.2 Release notes (2017-01-30) -============================================================= - -### Bugfixes - -* Fix an issue where RLMRealm instances could end up in the autorelease pool - for other threads. - -2.4.1 Release notes (2017-01-27) -============================================================= - -### Bugfixes - -* Fix an issue where authentication tokens were not properly refreshed - automatically before expiring. - -2.4.0 Release notes (2017-01-26) -============================================================= - -This release drops support for compiling with Swift 2.x. -Swift 3.0.0 is now the minimum Swift version supported. - -### API Breaking Changes - -* None. - -### Enhancements - -* Add change notifications for individual objects with an API similar to that - of collection notifications. - -### Bugfixes - -* Fix Realm Objective-C compilation errors with Xcode 8.3 beta 1. -* Fix several error handling issues when renewing expired authentication - tokens for synchronized Realms. -* Fix a race condition leading to bad_version exceptions being thrown in - Realm's background worker thread. - -2.3.0 Release notes (2017-01-19) -============================================================= - -### Sync Breaking Changes - -* Make `PermissionChange`'s `id` property a primary key. - -### API Breaking Changes - -* None. - -### Enhancements - -* Add `SyncPermissionOffer` and `SyncPermissionOfferResponse` classes to allow - creating and accepting permission change events to synchronized Realms between - different users. -* Support monitoring sync transfer progress by registering notification blocks - on `SyncSession`. Specify the transfer direction (`.upload`/`.download`) and - mode (`.reportIndefinitely`/`.forCurrentlyOutstandingWork`) to monitor. - -### Bugfixes - -* Fix a call to `commitWrite(withoutNotifying:)` committing a transaction that - would not have triggered a notification incorrectly skipping the next - notification. -* Fix incorrect results and crashes when conflicting object insertions are - merged by the synchronization mechanism when there is a collection - notification registered for that object type. - -2.2.0 Release notes (2017-01-12) -============================================================= - -### Sync Breaking Changes (In Beta) - -* Sync-related error reporting behavior has been changed. Errors not related - to a particular user or session are only reported if they are classed as - 'fatal' by the underlying sync engine. -* Added `RLMSyncErrorClientResetError` to `RLMSyncError` enum. - -### API Breaking Changes - -* The following Objective-C APIs have been deprecated in favor of newer or preferred versions: - -| Deprecated API | New API | -|:------------------------------------------------------------|:------------------------------------------------------------| -| `-[RLMArray sortedResultsUsingProperty:]` | `-[RLMArray sortedResultsUsingKeyPath:]` | -| `-[RLMCollection sortedResultsUsingProperty:]` | `-[RLMCollection sortedResultsUsingKeyPath:]` | -| `-[RLMResults sortedResultsUsingProperty:]` | `-[RLMResults sortedResultsUsingKeyPath:]` | -| `+[RLMSortDescriptor sortDescriptorWithProperty:ascending]` | `+[RLMSortDescriptor sortDescriptorWithKeyPath:ascending:]` | -| `RLMSortDescriptor.property` | `RLMSortDescriptor.keyPath` | - -* The following Swift APIs have been deprecated in favor of newer or preferred versions: - -| Deprecated API | New API | -|:------------------------------------------------------|:-------------------------------------------------| -| `LinkingObjects.sorted(byProperty:ascending:)` | `LinkingObjects.sorted(byKeyPath:ascending:)` | -| `List.sorted(byProperty:ascending:)` | `List.sorted(byKeyPath:ascending:)` | -| `RealmCollection.sorted(byProperty:ascending:)` | `RealmCollection.sorted(byKeyPath:ascending:)` | -| `Results.sorted(byProperty:ascending:)` | `Results.sorted(byKeyPath:ascending:)` | -| `SortDescriptor(property:ascending:)` | `SortDescriptor(keyPath:ascending:)` | -| `SortDescriptor.property` | `SortDescriptor.keyPath` | - -### Enhancements - -* Introduce APIs for safely passing objects between threads. Create a - thread-safe reference to a thread-confined object by passing it to the - `+[RLMThreadSafeReference referenceWithThreadConfined:]`/`ThreadSafeReference(to:)` - constructor, which you can then safely pass to another thread to resolve in - the new Realm with `-[RLMRealm resolveThreadSafeReference:]`/`Realm.resolve(_:)`. -* Realm collections can now be sorted by properties over to-one relationships. -* Optimized `CONTAINS` queries to use Boyer-Moore algorithm - (around 10x speedup on large datasets). - -### Bugfixes - -* Setting `deleteRealmIfMigrationNeeded` now also deletes the Realm if a file - format migration is required, such as when moving from a file last accessed - with Realm 0.x to 1.x, or 1.x to 2.x. -* Fix queries containing nested `SUBQUERY` expressions. -* Fix spurious incorrect thread exceptions when a thread id happens to be - reused while an RLMRealm instance from the old thread still exists. -* Fixed various bugs in aggregate methods (max, min, avg, sum). - -2.1.2 Release notes (2016--12-19) -============================================================= - -This release adds binary versions of Swift 3.0.2 frameworks built with Xcode 8.2. - -### Sync Breaking Changes (In Beta) - -* Rename occurences of "iCloud" with "CloudKit" in APIs and comments to match - naming in the Realm Object Server. - -### API Breaking Changes - -* None. - -### Enhancements - -* Add support for 'LIKE' queries (wildcard matching). - -### Bugfixes - -* Fix authenticating with CloudKit. -* Fix linker warning about "Direct access to global weak symbol". - -2.1.1 Release notes (2016-12-02) -============================================================= - -### Enhancements - -* Add `RealmSwift.ObjectiveCSupport.convert(object:)` methods to help write - code that interoperates between Realm Objective-C and Realm Swift APIs. -* Throw exceptions when opening a Realm with an incorrect configuration, like: - * `readOnly` set with a sync configuration. - * `readOnly` set with a migration block. - * migration block set with a sync configuration. -* Greatly improve performance of write transactions which make a large number of - changes to indexed properties, including the automatic migration when opening - files written by Realm 1.x. - -### Bugfixes - -* Reset sync metadata Realm in case of decryption error. -* Fix issue preventing using synchronized Realms in Xcode Playgrounds. -* Fix assertion failure when migrating a model property from object type to - `RLMLinkingObjects` type. -* Fix a `LogicError: Bad version number` exception when using `RLMResults` with - no notification blocks and explicitly called `-[RLMRealm refresh]` from that - thread. -* Logged-out users are no longer returned from `+[RLMSyncUser currentUser]` or - `+[RLMSyncUser allUsers]`. -* Fix several issues which could occur when the 1001st object of a given type - was created or added to an RLMArray/List, including crashes when rerunning - existing queries and possibly data corruption. -* Fix a potential crash when the application exits due to a race condition in - the destruction of global static variables. -* Fix race conditions when waiting for sync uploads or downloads to complete - which could result in crashes or the callback being called too early. - -2.1.0 Release notes (2016-11-18) -============================================================= - -### Sync Breaking Changes (In Beta) - -* None. - -### API breaking changes - -* None. - -### Enhancements - -* Add the ability to skip calling specific notification blocks when committing - a write transaction. - -### Bugfixes - -* Deliver collection notifications when beginning a write transaction which - advances the read version of a Realm (previously only Realm-level - notifications were sent). -* Fix some scenarios which would lead to inconsistent states when using - collection notifications. -* Fix several race conditions in the notification functionality. -* Don't send Realm change notifications when canceling a write transaction. - -2.0.4 Release notes (2016-11-14) -============================================================= - -### Sync Breaking Changes (In Beta) - -* Remove `RLMAuthenticationActions` and replace - `+[RLMSyncCredential credentialWithUsername:password:actions:]` with - `+[RLMSyncCredential credentialsWithUsername:password:register:]`. -* Rename `+[RLMSyncUser authenticateWithCredential:]` to - `+[RLMSyncUser logInWithCredentials:]`. -* Rename "credential"-related types and methods to - `RLMSyncCredentials`/`SyncCredentials` and consistently refer to credentials - in the plural form. -* Change `+[RLMSyncUser all]` to return a dictionary of identifiers to users and - rename to: - * `+[RLMSyncUser allUsers]` in Objective-C. - * `SyncUser.allUsers()` in Swift 2. - * `SyncUser.all` in Swift 3. -* Rename `SyncManager.sharedManager()` to `SyncManager.shared` in Swift 3. -* Change `Realm.Configuration.syncConfiguration` to take a `SyncConfiguration` - struct rather than a named tuple. -* `+[RLMSyncUser logInWithCredentials:]` now invokes its callback block on a - background queue. - -### API breaking changes - -* None. - -### Enhancements - -* Add `+[RLMSyncUser currentUser]`. -* Add the ability to change read, write and management permissions for - synchronized Realms using the management Realm obtained via the - `-[RLMSyncUser managementRealmWithError:]` API and the - `RLMSyncPermissionChange` class. - -### Bugfixes - -* None. - -2.0.3 Release notes (2016-10-27) -============================================================= - -This release adds binary versions of Swift 3.0.1 frameworks built with Xcode 8.1 -GM seed. - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix a `BadVersion` exception caused by a race condition when delivering - collection change notifications. -* Fix an assertion failure when additional model classes are added and - `deleteRealmIfMigrationNeeded` is enabled. -* Fix a `BadTransactLog` exception when deleting an `RLMResults` in a synced - Realm. -* Fix an assertion failure when a write transaction is in progress at the point - of process termination. -* Fix a crash that could occur when working with a `RLMLinkingObject` property - of an unmanaged object. - -2.0.2 Release notes (2016-10-05) -============================================================= - -This release is not protocol-compatible with previous version of the Realm -Mobile Platform. - -### API breaking changes - -* Rename Realm Swift's `User` to `SyncUser` to make clear that it relates to the - Realm Mobile Platform, and to avoid potential conflicts with other `User` types. - -### Bugfixes - -* Fix Realm headers to be compatible with pre-C++11 dialects of Objective-C++. -* Fix incorrect merging of RLMArray/List changes when objects with the same - primary key are created on multiple devices. -* Fix bad transaction log errors after deleting objects on a different device. -* Fix a BadVersion error when a background worker finishes running while older - results from that worker are being delivered to a different thread. - -2.0.1 Release notes (2016-09-29) -============================================================= - -### Bugfixes - -* Fix an assertion failure when opening a Realm file written by a 1.x version - of Realm which has an indexed nullable int or bool property. - -2.0.0 Release notes (2016-09-27) -============================================================= - -This release introduces support for the Realm Mobile Platform! -See for an overview -of these great new features. - -### API breaking changes - -* By popular demand, `RealmSwift.Error` has been moved from the top-level - namespace into a `Realm` extension and is now `Realm.Error`, so that it no - longer conflicts with `Swift.Error`. -* Files written by Realm 2.0 cannot be read by 1.x or earlier versions. Old - files can still be opened. - -### Enhancements - -* The .log, .log_a and .log_b files no longer exist and the state tracked in - them has been moved to the main Realm file. This reduces the number of open - files needed by Realm, improves performance of both opening and writing to - Realms, and eliminates a small window where committing write transactions - would prevent other processes from opening the file. - -### Bugfixes - -* Fix an assertion failure when sorting by zero properties. -* Fix a mid-commit crash in one process also crashing all other processes with - the same Realm open. -* Properly initialize new nullable float and double properties added to - existing objects to null rather than 0. -* Fix a stack overflow when objects with indexed string properties had very - long common prefixes. -* Fix a race condition which could lead to crashes when using async queries or - collection notifications. -* Fix a bug which could lead to incorrect state when an object which links to - itself is deleted from the Realm. - -1.1.0 Release notes (2016-09-16) -============================================================= - -This release brings official support for Xcode 8, Swift 2.3 and Swift 3.0. -Prebuilt frameworks are now built with Xcode 7.3.1 and Xcode 8.0. - -### API breaking changes - -* Deprecate `migrateRealm:` in favor of new `performMigrationForConfiguration:error:` method - that follows Cocoa's NSError conventions. -* Fix issue where `RLMResults` used `id `instead of its generic type as the return - type of subscript. - -### Enhancements - -* Improve error message when using NSNumber incorrectly in Swift models. -* Further reduce the download size of the prebuilt static libraries. -* Improve sort performance, especially on non-nullable columns. -* Allow partial initialization of object by `initWithValue:`, deferring - required property checks until object is added to Realm. - -### Bugfixes - -* Fix incorrect truncation of the constant value for queries of the form - `column < value` for `float` and `double` columns. -* Fix crash when an aggregate is accessed as an `Int8`, `Int16`, `Int32`, or `Int64`. -* Fix a race condition that could lead to a crash if an RLMArray or List was - deallocated on a different thread than it was created on. -* Fix a crash when the last reference to an observed object is released from - within the observation. -* Fix a crash when `initWithValue:` is used to create a nested object for a class - with an uninitialized schema. -* Enforce uniqueness for `RealmOptional` primary keys when using the `value` setter. - -1.0.2 Release notes (2016-07-13) -============================================================= - -### API breaking changes - -* Attempting to add an object with no properties to a Realm now throws rather than silently - doing nothing. - -### Enhancements - -* Swift: A `write` block may now `throw`, reverting any changes already made in - the transaction. -* Reduce address space used when committing write transactions. -* Significantly reduce the download size of prebuilt binaries and slightly - reduce the final size contribution of Realm to applications. -* Improve performance of accessing RLMArray properties and creating objects - with List properties. - -### Bugfixes - -* Fix a crash when reading the shared schema from an observed Swift object. -* Fix crashes or incorrect results when passing an array of values to - `createOrUpdate` after reordering the class's properties. -* Ensure that the initial call of a Results notification block is always passed - .Initial even if there is a write transaction between when the notification - is added and when the first notification is delivered. -* Fix a crash when deleting all objects in a Realm while fast-enumerating query - results from that Realm. -* Handle EINTR from flock() rather than crashing. -* Fix incorrect behavior following a call to `[RLMRealm compact]`. -* Fix live updating and notifications for Results created from a predicate involving - an inverse relationship to be triggered when an object at the other end of the relationship - is modified. - -1.0.1 Release notes (2016-06-12) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Significantly improve performance of opening Realm files, and slightly - improve performance of committing write transactions. - -### Bugfixes - -* Swift: Fix an error thrown when trying to create or update `Object` instances via - `add(:_update:)` with a primary key property of type `RealmOptional`. -* Xcode playground in Swift release zip now runs successfully. -* The `key` parameter of `Realm.objectForPrimaryKey(_:key:)`/ `Realm.dynamicObjectForPrimaryKey(_:key:)` - is now marked as optional. -* Fix a potential memory leak when closing Realms after a Realm file has been - opened on multiple threads which are running in active run loops. -* Fix notifications breaking on tvOS after a very large number of write - transactions have been committed. -* Fix a "Destruction of mutex in use" assertion failure after an error while - opening a file. -* Realm now throws an exception if an `Object` subclass is defined with a managed Swift `lazy` property. - Objects with ignored `lazy` properties should now work correctly. -* Update the LLDB script to work with recent changes to the implementation of `RLMResults`. -* Fix an assertion failure when a Realm file is deleted while it is still open, - and then a new Realm is opened at the same path. Note that this is still not - a supported scenario, and may break in other ways. - -1.0.0 Release notes (2016-05-25) -============================================================= - -No changes since 0.103.2. - -0.103.2 Release notes (2016-05-24) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Improve the error messages when an I/O error occurs in `writeCopyToURL`. - -### Bugfixes - -* Fix an assertion failure which could occur when opening a Realm after opening - that Realm failed previously in some specific ways in the same run of the - application. -* Reading optional integers, floats, and doubles from within a migration block - now correctly returns `nil` rather than 0 when the stored value is `nil`. - -0.103.1 Release notes (2016-05-19) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix a bug that sometimes resulted in a single object's NSData properties - changing from `nil` to a zero-length non-`nil` NSData when a different object - of the same type was deleted. - -0.103.0 Release notes (2016-05-18) -============================================================= - -### API breaking changes - -* All functionality deprecated in previous releases has been removed entirely. -* Support for Xcode 6.x & Swift prior to 2.2 has been completely removed. -* `RLMResults`/`Results` now become empty when a `RLMArray`/`List` or object - they depend on is deleted, rather than throwing an exception when accessed. -* Migrations are no longer run when `deleteRealmIfMigrationNeeded` is set, - recreating the file instead. - -### Enhancements - -* Added `invalidated` properties to `RLMResults`/`Results`, `RLMLinkingObjects`/`LinkingObjects`, - `RealmCollectionType` and `AnyRealmCollection`. These properties report whether the Realm - the object is associated with has been invalidated. -* Some `NSError`s created by Realm now have more descriptive user info payloads. - -### Bugfixes - -* None. - -0.102.1 Release notes (2016-05-13) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Return `RLMErrorSchemaMismatch` error rather than the more generic `RLMErrorFail` - when a migration is required. -* Improve the performance of allocating instances of `Object` subclasses - that have `LinkingObjects` properties. - -### Bugfixes - -* `RLMLinkingObjects` properties declared in Swift subclasses of `RLMObject` - now work correctly. -* Fix an assertion failure when deleting all objects of a type, inserting more - objects, and then deleting some of the newly inserted objects within a single - write transaction when there is an active notification block for a different - object type which links to the objects being deleted. -* Fix crashes and/or incorrect results when querying over multiple levels of - `LinkingObjects` properties. -* Fix opening read-only Realms on multiple threads at once. -* Fix a `BadTransactLog` exception when storing dates before the unix epoch (1970-01-01). - -0.102.0 Release notes (2016-05-09) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Add a method to rename properties during migrations: - * Swift: `Migration.renamePropertyForClass(_:oldName:newName:)` - * Objective-C: `-[RLMMigration renamePropertyForClass:oldName:newName:]` -* Add `deleteRealmIfMigrationNeeded` to - `RLMRealmConfiguration`/`Realm.Configuration`. When this is set to `true`, - the Realm file will be automatically deleted and recreated when there is a - schema mismatch rather than migrated to the new schema. - -### Bugfixes - -* Fix `BETWEEN` queries that traverse `RLMArray`/`List` properties to ensure that - a single related object satisfies the `BETWEEN` criteria, rather than allowing - different objects in the array to satisfy the lower and upper bounds. -* Fix a race condition when a Realm is opened on one thread while it is in the - middle of being closed on another thread which could result in crashes. -* Fix a bug which could result in changes made on one thread being applied - incorrectly on other threads when those threads are refreshed. -* Fix crash when migrating to the new date format introduced in 0.101.0. -* Fix crash when querying inverse relationships when objects are deleted. - -0.101.0 Release notes (2016-05-04) -============================================================= - -### API breaking changes - -* Files written by this version of Realm cannot be read by older versions of - Realm. Existing files will automatically be upgraded when they are opened. - -### Enhancements - -* Greatly improve performance of collection change calculation for complex - object graphs, especially for ones with cycles. -* NSDate properties now support nanoseconds precision. -* Opening a single Realm file on multiple threads now shares a single memory - mapping of the file for all threads, significantly reducing the memory - required to work with large files. -* Crashing while in the middle of a write transaction no longer blocks other - processes from performing write transactions on the same file. -* Improve the performance of refreshing a Realm (including via autorefresh) - when there are live Results/RLMResults objects for that Realm. - -### Bugfixes - -* Fix an assertion failure of "!more_before || index >= std::prev(it)->second)" - in `IndexSet::do_add()`. -* Fix a crash when an `RLMArray` or `List` object is destroyed from the wrong - thread. - -0.100.0 Release notes (2016-04-29) -============================================================= - -### API breaking changes - -* `-[RLMObject linkingObjectsOfClass:forProperty]` and `Object.linkingObjects(_:forProperty:)` - are deprecated in favor of properties of type `RLMLinkingObjects` / `LinkingObjects`. - -### Enhancements - -* The automatically-maintained inverse direction of relationships can now be exposed as - properties of type `RLMLinkingObjects` / `LinkingObjects`. These properties automatically - update to reflect the objects that link to the target object, can be used in queries, and - can be filtered like other Realm collection types. -* Queries that compare objects for equality now support multi-level key paths. - -### Bugfixes - -* Fix an assertion failure when a second write transaction is committed after a - write transaction deleted the object containing an RLMArray/List which had an - active notification block. -* Queries that compare `RLMArray` / `List` properties using != now give the correct results. - -0.99.1 Release notes (2016-04-26) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix a scenario that could lead to the assertion failure - "m_advancer_sg->get_version_of_current_transaction() == - new_notifiers.front()->version()". - -0.99.0 Release notes (2016-04-22) -============================================================= - -### API breaking changes - -* Deprecate properties of type `id`/`AnyObject`. This type was rarely used, - rarely useful and unsupported in every other Realm binding. -* The block for `-[RLMArray addNotificationBlock:]` and - `-[RLMResults addNotificationBlock:]` now takes another parameter. -* The following Objective-C APIs have been deprecated in favor of newer or preferred versions: - -| Deprecated API | New API | -|:-------------------------------------------------------|:------------------------------------------------------| -| `-[RLMRealm removeNotification:]` | `-[RLMNotificationToken stop]` | -| `RLMRealmConfiguration.path` | `RLMRealmConfiguration.fileURL` | -| `RLMRealm.path` | `RLMRealmConfiguration.fileURL` | -| `RLMRealm.readOnly` | `RLMRealmConfiguration.readOnly` | -| `+[RLMRealm realmWithPath:]` | `+[RLMRealm realmWithURL:]` | -| `+[RLMRealm writeCopyToPath:error:]` | `+[RLMRealm writeCopyToURL:encryptionKey:error:]` | -| `+[RLMRealm writeCopyToPath:encryptionKey:error:]` | `+[RLMRealm writeCopyToURL:encryptionKey:error:]` | -| `+[RLMRealm schemaVersionAtPath:error:]` | `+[RLMRealm schemaVersionAtURL:encryptionKey:error:]` | -| `+[RLMRealm schemaVersionAtPath:encryptionKey:error:]` | `+[RLMRealm schemaVersionAtURL:encryptionKey:error:]` | - -* The following Swift APIs have been deprecated in favor of newer or preferred versions: - -| Deprecated API | New API | -|:----------------------------------------------|:-----------------------------------------| -| `Realm.removeNotification(_:)` | `NotificationToken.stop()` | -| `Realm.Configuration.path` | `Realm.Configuration.fileURL` | -| `Realm.path` | `Realm.Configuration.fileURL` | -| `Realm.readOnly` | `Realm.Configuration.readOnly` | -| `Realm.writeCopyToPath(_:encryptionKey:)` | `Realm.writeCopyToURL(_:encryptionKey:)` | -| `schemaVersionAtPath(_:encryptionKey:error:)` | `schemaVersionAtURL(_:encryptionKey:)` | - -### Enhancements - -* Add information about what rows were added, removed, or modified to the - notifications sent to the Realm collections. -* Improve error when illegally appending to an `RLMArray` / `List` property from a default value - or the standalone initializer (`init()`) before the schema is ready. - -### Bugfixes - -* Fix a use-after-free when an associated object's dealloc method is used to - remove observers from an RLMObject. -* Fix a small memory leak each time a Realm file is opened. -* Return a recoverable `RLMErrorAddressSpaceExhausted` error rather than - crash when there is insufficient available address space on Realm - initialization or write commit. - -0.98.8 Release notes (2016-04-15) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fixed a bug that caused some encrypted files created using - `-[RLMRealm writeCopyToPath:encryptionKey:error:]` to fail to open. - -0.98.7 Release notes (2016-04-13) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Mark further initializers in Objective-C as NS_DESIGNATED_INITIALIZER to prevent that these aren't - correctly defined in Swift Object subclasses, which don't qualify for auto-inheriting the required initializers. -* `-[RLMResults indexOfObjectWithPredicate:]` now returns correct results - for `RLMResults` instances that were created by filtering an `RLMArray`. -* Adjust how RLMObjects are destroyed in order to support using an associated - object on an RLMObject to remove KVO observers from that RLMObject. -* `-[RLMResults indexOfObjectWithPredicate:]` now returns the index of the first matching object for a - sorted `RLMResults`, matching its documented behavior. -* Fix a crash when canceling a transaction that set a relationship. -* Fix a crash when a query referenced a deleted object. - -0.98.6 Release notes (2016-03-25) -============================================================= - -Prebuilt frameworks are now built with Xcode 7.3. - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix running unit tests on iOS simulators and devices with Xcode 7.3. - -0.98.5 Release notes (2016-03-14) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix a crash when opening a Realm on 32-bit iOS devices. - -0.98.4 Release notes (2016-03-10) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Properly report changes made by adding an object to a Realm with - addOrUpdate:/createOrUpdate: to KVO observers for existing objects with that - primary key. -* Fix crashes and assorted issues when a migration which added object link - properties is rolled back due to an error in the migration block. -* Fix assertion failures when deleting objects within a migration block of a - type which had an object link property added in that migration. -* Fix an assertion failure in `Query::apply_patch` when updating certain kinds - of queries after a write transaction is committed. - -0.98.3 Release notes (2016-02-26) -============================================================= - -### Enhancements - -* Initializing the shared schema is 3x faster. - -### Bugfixes - -* Using Realm Objective-C from Swift while having Realm Swift linked no longer causes that the - declared `ignoredProperties` are not taken into account. -* Fix assertion failures when rolling back a migration which added Object link - properties to a class. -* Fix potential errors when cancelling a write transaction which modified - multiple `RLMArray`/`List` properties. -* Report the correct value for inWriteTransaction after attempting to commit a - write transaction fails. -* Support CocoaPods 1.0 beginning from prerelease 1.0.0.beta.4 while retaining - backwards compatibility with 0.39. - -0.98.2 Release notes (2016-02-18) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Aggregate operations (`ANY`, `NONE`, `@count`, `SUBQUERY`, etc.) are now supported for key paths - that begin with an object relationship so long as there is a `RLMArray`/`List` property at some - point in a key path. -* Predicates of the form `%@ IN arrayProperty` are now supported. - -### Bugfixes - -* Use of KVC collection operators on Swift collection types no longer throws an exception. -* Fix reporting of inWriteTransaction in notifications triggered by - `beginWriteTransaction`. -* The contents of `List` and `Optional` properties are now correctly preserved when copying - a Swift object from one Realm to another, and performing other operations that result in a - Swift object graph being recursively traversed from Objective-C. -* Fix a deadlock when queries are performed within a Realm notification block. -* The `ANY` / `SOME` / `NONE` qualifiers are now required in comparisons involving a key path that - traverse a `RLMArray`/`List` property. Previously they were only required if the first key in the - key path was an `RLMArray`/`List` property. -* Fix several scenarios where the default schema would be initialized - incorrectly if the first Realm opened used a restricted class subset (via - `objectClasses`/`objectTypes`). - -0.98.1 Release notes (2016-02-10) -============================================================= - -### Bugfixes - -* Fix crashes when deleting an object containing an `RLMArray`/`List` which had - previously been queried. -* Fix a crash when deleting an object containing an `RLMArray`/`List` with - active notification blocks. -* Fix duplicate file warnings when building via CocoaPods. -* Fix crash or incorrect results when calling `indexOfObject:` on an - `RLMResults` derived from an `RLMArray`. - -0.98.0 Release notes (2016-02-04) -============================================================= - -### API breaking changes - -* `+[RLMRealm realmWithPath:]`/`Realm.init(path:)` now inherits from the default - configuration. -* Swift 1.2 is no longer supported. - -### Enhancements - -* Add `addNotificationBlock` to `RLMResults`, `Results`, `RLMArray`, and - `List`, which calls the given block whenever the collection changes. -* Do a lot of the work for keeping `RLMResults`/`Results` up-to-date after - write transactions on a background thread to help avoid blocking the main - thread. -* `NSPredicate`'s `SUBQUERY` operator is now supported. It has the following limitations: - * `@count` is the only operator that may be applied to the `SUBQUERY` expression. - * The `SUBQUERY(…).@count` expression must be compared with a constant. - * Correlated subqueries are not yet supported. - -### Bugfixes - -* None. - -0.97.1 Release notes (2016-01-29) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Swift: Added `Error` enum allowing to catch errors e.g. thrown on initializing - `RLMRealm`/`Realm` instances. -* Fail with `RLMErrorFileNotFound` instead of the more generic `RLMErrorFileAccess`, - if no file was found when a realm was opened as read-only or if the directory part - of the specified path was not found when a copy should be written. -* Greatly improve performance when deleting objects with one or more indexed - properties. -* Indexing `BOOL`/`Bool` and `NSDate` properties are now supported. -* Swift: Add support for indexing optional properties. - -### Bugfixes - -* Fix incorrect results or crashes when using `-[RLMResults setValue:forKey:]` - on an RLMResults which was filtered on the key being set. -* Fix crashes when an RLMRealm is deallocated from the wrong thread. -* Fix incorrect results from aggregate methods on `Results`/`RLMResults` after - objects which were previously in the results are deleted. -* Fix a crash when adding a new property to an existing class with over a - million objects in the Realm. -* Fix errors when opening encrypted Realm files created with writeCopyToPath. -* Fix crashes or incorrect results for queries that use relationship equality - in cases where the `RLMResults` is kept alive and instances of the target class - of the relationship are deleted. - -0.97.0 Release notes (2015-12-17) -============================================================= - -### API breaking changes - -* All functionality deprecated in previous releases has been removed entirely. -* Add generic type annotations to NSArrays and NSDictionaries in public APIs. -* Adding a Realm notification block on a thread not currently running from - within a run loop throws an exception rather than silently never calling the - notification block. - -### Enhancements - -* Support for tvOS. -* Support for building Realm Swift from source when using Carthage. -* The block parameter of `-[RLMRealm transactionWithBlock:]`/`Realm.write(_:)` is - now marked as `__attribute__((noescape))`/`@noescape`. -* Many forms of queries with key paths on both sides of the comparison operator - are now supported. -* Add support for KVC collection operators in `RLMResults` and `RLMArray`. -* Fail instead of deadlocking in `+[RLMRealm sharedSchema]`, if a Swift property is initialized - to a computed value, which attempts to open a Realm on its own. - -### Bugfixes - -* Fix poor performance when calling `-[RLMRealm deleteObjects:]` on an - `RLMResults` which filtered the objects when there are other classes linking - to the type of the deleted objects. -* An exception is now thrown when defining `Object` properties of an unsupported - type. - -0.96.3 Release notes (2015-12-04) -============================================================= - -### Enhancements - -* Queries are no longer limited to 16 levels of grouping. -* Rework the implementation of encrypted Realms to no longer interfere with - debuggers. - -### Bugfixes - -* Fix crash when trying to retrieve object instances via `dynamicObjects`. -* Throw an exception when querying on a link providing objects, which are from a different Realm. -* Return empty results when querying on a link providing an unattached object. -* Fix crashes or incorrect results when calling `-[RLMRealm refresh]` during - fast enumeration. -* Add `Int8` support for `RealmOptional`, `MinMaxType` and `AddableType`. -* Set the default value for newly added non-optional NSData properties to a - zero-byte NSData rather than nil. -* Fix a potential crash when deleting all objects of a class. -* Fix performance problems when creating large numbers of objects with - `RLMArray`/`List` properties. -* Fix memory leak when using Object(value:) for subclasses with - `List` or `RealmOptional` properties. -* Fix a crash when computing the average of an optional integer property. -* Fix incorrect search results for some queries on integer properties. -* Add error-checking for nil realm parameters in many methods such as - `+[RLMObject allObjectsInRealm:]`. -* Fix a race condition between commits and opening Realm files on new threads - that could lead to a crash. -* Fix several crashes when opening Realm files. -* `-[RLMObject createInRealm:withValue:]`, `-[RLMObject createOrUpdateInRealm:withValue:]`, and - their variants for the default Realm now always match the contents of an `NSArray` against properties - in the same order as they are defined in the model. - -0.96.2 Release notes (2015-10-26) -============================================================= - -Prebuilt frameworks are now built with Xcode 7.1. - -### Bugfixes - -* Fix ignoring optional properties in Swift. -* Fix CocoaPods installation on case-sensitive file systems. - -0.96.1 Release notes (2015-10-20) -============================================================= - -### Bugfixes - -* Support assigning `Results` to `List` properties via KVC. -* Honor the schema version set in the configuration in `+[RLMRealm migrateRealm:]`. -* Fix crash when using optional Int16/Int32/Int64 properties in Swift. - -0.96.0 Release notes (2015-10-14) -============================================================= - -* No functional changes since beta2. - -0.96.0-beta2 Release notes (2015-10-08) -============================================================= - -### Bugfixes - -* Add RLMOptionalBase.h to the podspec. - -0.96.0-beta Release notes (2015-10-07) -============================================================= - -### API breaking changes - -* CocoaPods v0.38 or greater is now required to install Realm and RealmSwift - as pods. - -### Enhancements - -* Functionality common to both `List` and `Results` is now declared in a - `RealmCollectionType` protocol that both types conform to. -* `Results.realm` now returns an `Optional` in order to conform to - `RealmCollectionType`, but will always return `.Some()` since a `Results` - cannot exist independently from a `Realm`. -* Aggregate operations are now available on `List`: `min`, `max`, `sum`, - `average`. -* Committing write transactions (via `commitWrite` / `commitWriteTransaction` and - `write` / `transactionWithBlock`) now optionally allow for handling errors when - the disk is out of space. -* Added `isEmpty` property on `RLMRealm`/`Realm` to indicate if it contains any - objects. -* The `@count`, `@min`, `@max`, `@sum` and `@avg` collection operators are now - supported in queries. - -### Bugfixes - -* Fix assertion failure when inserting NSData between 8MB and 16MB in size. -* Fix assertion failure when rolling back a migration which removed an object - link or `RLMArray`/`List` property. -* Add the path of the file being opened to file open errors. -* Fix a crash that could be triggered by rapidly opening and closing a Realm - many times on multiple threads at once. -* Fix several places where exception messages included the name of the wrong - function which failed. - -0.95.3 Release notes (2015-10-05) -============================================================= - -### Bugfixes - -* Compile iOS Simulator framework architectures with `-fembed-bitcode-marker`. -* Fix crashes when the first Realm opened uses a class subset and later Realms - opened do not. -* Fix inconsistent errors when `Object(value: ...)` is used to initialize the - default value of a property of an `Object` subclass. -* Throw an exception when a class subset has objects with array or object - properties of a type that are not part of the class subset. - -0.95.2 Release notes (2015-09-24) -============================================================= - -* Enable bitcode for iOS and watchOS frameworks. -* Build libraries with Xcode 7 final rather than the GM. - -0.95.1 Release notes (2015-09-23) -============================================================= - -### Enhancements - -* Add missing KVO handling for moving and exchanging objects in `RLMArray` and - `List`. - -### Bugfixes - -* Setting the primary key property on persisted `RLMObject`s / `Object`s - via subscripting or key-value coding will cause an exception to be thrown. -* Fix crash due to race condition in `RLMRealmConfiguration` where the default - configuration was in the process of being copied in one thread, while - released in another. -* Fix crash when a migration which removed an object or array property is - rolled back due to an error. - -0.95.0 Release notes (2015-08-25) -============================================================= - -### API breaking changes - -* The following APIs have been deprecated in favor of the new `RLMRealmConfiguration` class in Realm Objective-C: - -| Deprecated API | New API | -|:------------------------------------------------------------------|:---------------------------------------------------------------------------------| -| `+[RLMRealm realmWithPath:readOnly:error:]` | `+[RLMRealm realmWithConfiguration:error:]` | -| `+[RLMRealm realmWithPath:encryptionKey:readOnly:error:]` | `+[RLMRealm realmWithConfiguration:error:]` | -| `+[RLMRealm setEncryptionKey:forRealmsAtPath:]` | `-[RLMRealmConfiguration setEncryptionKey:]` | -| `+[RLMRealm inMemoryRealmWithIdentifier:]` | `+[RLMRealm realmWithConfiguration:error:]` | -| `+[RLMRealm defaultRealmPath]` | `+[RLMRealmConfiguration defaultConfiguration]` | -| `+[RLMRealm setDefaultRealmPath:]` | `+[RLMRealmConfiguration setDefaultConfiguration:]` | -| `+[RLMRealm setDefaultRealmSchemaVersion:withMigrationBlock]` | `RLMRealmConfiguration.schemaVersion` and `RLMRealmConfiguration.migrationBlock` | -| `+[RLMRealm setSchemaVersion:forRealmAtPath:withMigrationBlock:]` | `RLMRealmConfiguration.schemaVersion` and `RLMRealmConfiguration.migrationBlock` | -| `+[RLMRealm migrateRealmAtPath:]` | `+[RLMRealm migrateRealm:]` | -| `+[RLMRealm migrateRealmAtPath:encryptionKey:]` | `+[RLMRealm migrateRealm:]` | - -* The following APIs have been deprecated in favor of the new `Realm.Configuration` struct in Realm Swift for Swift 1.2: - -| Deprecated API | New API | -|:--------------------------------------------------------------|:-----------------------------------------------------------------------------| -| `Realm.defaultPath` | `Realm.Configuration.defaultConfiguration` | -| `Realm(path:readOnly:encryptionKey:error:)` | `Realm(configuration:error:)` | -| `Realm(inMemoryIdentifier:)` | `Realm(configuration:error:)` | -| `Realm.setEncryptionKey(:forPath:)` | `Realm(configuration:error:)` | -| `setDefaultRealmSchemaVersion(schemaVersion:migrationBlock:)` | `Realm.Configuration.schemaVersion` and `Realm.Configuration.migrationBlock` | -| `setSchemaVersion(schemaVersion:realmPath:migrationBlock:)` | `Realm.Configuration.schemaVersion` and `Realm.Configuration.migrationBlock` | -| `migrateRealm(path:encryptionKey:)` | `migrateRealm(configuration:)` | - -* The following APIs have been deprecated in favor of the new `Realm.Configuration` struct in Realm Swift for Swift 2.0: - -| Deprecated API | New API | -|:--------------------------------------------------------------|:-----------------------------------------------------------------------------| -| `Realm.defaultPath` | `Realm.Configuration.defaultConfiguration` | -| `Realm(path:readOnly:encryptionKey:) throws` | `Realm(configuration:) throws` | -| `Realm(inMemoryIdentifier:)` | `Realm(configuration:) throws` | -| `Realm.setEncryptionKey(:forPath:)` | `Realm(configuration:) throws` | -| `setDefaultRealmSchemaVersion(schemaVersion:migrationBlock:)` | `Realm.Configuration.schemaVersion` and `Realm.Configuration.migrationBlock` | -| `setSchemaVersion(schemaVersion:realmPath:migrationBlock:)` | `Realm.Configuration.schemaVersion` and `Realm.Configuration.migrationBlock` | -| `migrateRealm(path:encryptionKey:)` | `migrateRealm(configuration:)` | - -* `List.extend` in Realm Swift for Swift 2.0 has been replaced with `List.appendContentsOf`, - mirroring changes to `RangeReplaceableCollectionType`. - -* Object properties on `Object` subclasses in Realm Swift must be marked as optional, - otherwise a runtime exception will be thrown. - -### Enhancements - -* Persisted properties of `RLMObject`/`Object` subclasses are now Key-Value - Observing compliant. -* The different options used to create Realm instances have been consolidated - into a single `RLMRealmConfiguration`/`Realm.Configuration` object. -* Enumerating Realm collections (`RLMArray`, `RLMResults`, `List<>`, - `Results<>`) now enumerates over a copy of the collection, making it no - longer an error to modify a collection during enumeration (either directly, - or indirectly by modifying objects to make them no longer match a query). -* Improve performance of object insertion in Swift to bring it roughly in line - with Objective-C. -* Allow specifying a specific list of `RLMObject` / `Object` subclasses to include - in a given Realm via `RLMRealmConfiguration.objectClasses` / `Realm.Configuration.objectTypes`. - -### Bugfixes - -* Subscripting on `RLMObject` is now marked as nullable. - -0.94.1 Release notes (2015-08-10) -============================================================= - -### API breaking changes - -* Building for watchOS requires Xcode 7 beta 5. - -### Enhancements - -* `Object.className` is now marked as `final`. - -### Bugfixes - -* Fix crash when adding a property to a model without updating the schema - version. -* Fix unnecessary redownloading of the core library when building from source. -* Fix crash when sorting by an integer or floating-point property on iOS 7. - -0.94.0 Release notes (2015-07-29) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Reduce the amount of memory used by RLMRealm notification listener threads. -* Avoid evaluating results eagerly when filtering and sorting. -* Add nullability annotations to the Objective-C API to provide enhanced compiler - warnings and bridging to Swift. -* Make `RLMResult`s and `RLMArray`s support Objective-C generics. -* Add support for building watchOS and bitcode-compatible apps. -* Make the exceptions thrown in getters and setters more informative. -* Add `-[RLMArray exchangeObjectAtIndex:withObjectAtIndex]` and `List.swap(_:_:)` - to allow exchanging the location of two objects in the given `RLMArray` / `List`. -* Added anonymous analytics on simulator/debugger runs. -* Add `-[RLMArray moveObjectAtIndex:toIndex:]` and `List.move(from:to:)` to - allow moving objects in the given `RLMArray` / `List`. - -### Bugfixes - -* Processes crashing due to an uncaught exception inside a write transaction will - no longer cause other processes using the same Realm to hang indefinitely. -* Fix incorrect results when querying for < or <= on ints that - require 64 bits to represent with a CPU that supports SSE 4.2. -* An exception will no longer be thrown when attempting to reset the schema - version or encryption key on an open Realm to the current value. -* Date properties on 32 bit devices will retain 64 bit second precision. -* Wrap calls to the block passed to `enumerate` in an autoreleasepool to reduce - memory growth when migrating a large amount of objects. -* In-memory realms no longer write to the Documents directory on iOS or - Application Support on OS X. - -0.93.2 Release notes (2015-06-12) -============================================================= - -### Bugfixes - -* Fixed an issue where the packaged OS X Realm.framework was built with - `GCC_GENERATE_TEST_COVERAGE_FILES` and `GCC_INSTRUMENT_PROGRAM_FLOW_ARCS` - enabled. -* Fix a memory leak when constructing standalone Swift objects with NSDate - properties. -* Throw an exception rather than asserting when an invalidated object is added - to an RLMArray. -* Fix a case where data loss would occur if a device was hard-powered-off - shortly after a write transaction was committed which had to expand the Realm - file. - -0.93.1 Release notes (2015-05-29) -============================================================= - -### Bugfixes - -* Objects are no longer copied into standalone objects during object creation. This fixes an issue where - nested objects with a primary key are sometimes duplicated rather than updated. -* Comparison predicates with a constant on the left of the operator and key path on the right now give - correct results. An exception is now thrown for predicates that do not yet support this ordering. -* Fix some crashes in `index_string.cpp` with int primary keys or indexed int properties. - -0.93.0 Release notes (2015-05-27) -============================================================= - -### API breaking changes - -* Schema versions are now represented as `uint64_t` (Objective-C) and `UInt64` (Swift) so that they have - the same representation on all architectures. - -### Enhancements - -* Swift: `Results` now conforms to `CVarArgType` so it can - now be passed as an argument to `Results.filter(_:...)` - and `List.filter(_:...)`. -* Swift: Made `SortDescriptor` conform to the `Equatable` and - `StringLiteralConvertible` protocols. -* Int primary keys are once again automatically indexed. -* Improve error reporting when attempting to mark a property of a type that - cannot be indexed as indexed. - -### Bugfixes - -* Swift: `RealmSwift.framework` no longer embeds `Realm.framework`, - which now allows apps using it to pass iTunes Connect validation. - -0.92.4 Release notes (2015-05-22) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Swift: Made `Object.init()` a required initializer. -* `RLMObject`, `RLMResults`, `Object` and `Results` can now be safely - deallocated (but still not used) from any thread. -* Improve performance of `-[RLMArray indexOfObjectWhere:]` and `-[RLMArray - indexOfObjectWithPredicate:]`, and implement them for standalone RLMArrays. -* Improved performance of most simple queries. - -### Bugfixes - -* The interprocess notification mechanism no longer uses dispatch worker threads, preventing it from - starving other GCD clients of the opportunity to execute blocks when dozens of Realms are open at once. - -0.92.3 Release notes (2015-05-13) -============================================================= - -### API breaking changes - -* Swift: `Results.average(_:)` now returns an optional, which is `nil` if and only if the results - set is empty. - -### Enhancements - -* Swift: Added `List.invalidated`, which returns if the given `List` is no longer - safe to be accessed, and is analogous to `-[RLMArray isInvalidated]`. -* Assertion messages are automatically logged to Crashlytics if it's loaded - into the current process to make it easier to diagnose crashes. - -### Bugfixes - -* Swift: Enumerating through a standalone `List` whose objects themselves - have list properties won't crash. -* Swift: Using a subclass of `RealmSwift.Object` in an aggregate operator of a predicate - no longer throws a spurious type error. -* Fix incorrect results for when using OR in a query on a `RLMArray`/`List<>`. -* Fix incorrect values from `[RLMResults count]`/`Results.count` when using - `!=` on an int property with no other query conditions. -* Lower the maximum doubling threshold for Realm file sizes from 128MB to 16MB - to reduce the amount of wasted space. - -0.92.2 Release notes (2015-05-08) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Exceptions raised when incorrect object types are used with predicates now contain more detailed information. -* Added `-[RLMMigration deleteDataForClassName:]` and `Migration.deleteData(_:)` - to enable cleaning up after removing object subclasses - -### Bugfixes - -* Prevent debugging of an application using an encrypted Realm to work around - frequent LLDB hangs. Until the underlying issue is addressed you may set - REALM_DISABLE_ENCRYPTION=YES in your application's environment variables to - have requests to open an encrypted Realm treated as a request for an - unencrypted Realm. -* Linked objects are properly updated in `createOrUpdateInRealm:withValue:`. -* List properties on Objects are now properly initialized during fast enumeration. - -0.92.1 Release notes (2015-05-06) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* `-[RLMRealm inWriteTransaction]` is now public. -* Realm Swift is now available on CoocaPods. - -### Bugfixes - -* Force code re-signing after stripping architectures in `strip-frameworks.sh`. - -0.92.0 Release notes (2015-05-05) -============================================================= - -### API breaking changes - -* Migration blocks are no longer called when a Realm file is first created. -* The following APIs have been deprecated in favor of newer method names: - -| Deprecated API | New API | -|:-------------------------------------------------------|:------------------------------------------------------| -| `-[RLMMigration createObject:withObject:]` | `-[RLMMigration createObject:withValue:]` | -| `-[RLMObject initWithObject:]` | `-[RLMObject initWithValue:]` | -| `+[RLMObject createInDefaultRealmWithObject:]` | `+[RLMObject createInDefaultRealmWithValue:]` | -| `+[RLMObject createInRealm:withObject:]` | `+[RLMObject createInRealm:withValue:]` | -| `+[RLMObject createOrUpdateInDefaultRealmWithObject:]` | `+[RLMObject createOrUpdateInDefaultRealmWithValue:]` | -| `+[RLMObject createOrUpdateInRealm:withObject:]` | `+[RLMObject createOrUpdateInRealm:withValue:]` | - -### Enhancements - -* `Int8` properties defined in Swift are now treated as integers, rather than - booleans. -* NSPredicates created using `+predicateWithValue:` are now supported. - -### Bugfixes - -* Compound AND predicates with no subpredicates now correctly match all objects. - -0.91.5 Release notes (2015-04-28) -============================================================= - -### Bugfixes - -* Fix issues with removing search indexes and re-enable it. - -0.91.4 Release notes (2015-04-27) -============================================================= - -### Bugfixes - -* Temporarily disable removing indexes from existing columns due to bugs. - -0.91.3 Release notes (2015-04-17) -============================================================= - -### Bugfixes - -* Fix `Extra argument 'objectClassName' in call` errors when building via - CocoaPods. - -0.91.2 Release notes (2015-04-16) -============================================================= - -* Migration blocks are no longer called when a Realm file is first created. - -### Enhancements - -* `RLMCollection` supports collection KVC operations. -* Sorting `RLMResults` is 2-5x faster (typically closer to 2x). -* Refreshing `RLMRealm` after a write transaction which inserts or modifies - strings or `NSData` is committed on another thread is significantly faster. -* Indexes are now added and removed from existing properties when a Realm file - is opened, rather than only when properties are first added. - -### Bugfixes - -* `+[RLMSchema dynamicSchemaForRealm:]` now respects search indexes. -* `+[RLMProperty isEqualToProperty:]` now checks for equal `indexed` properties. - -0.91.1 Release notes (2015-03-12) -============================================================= - -### Enhancements - -* The browser will automatically refresh when the Realm has been modified - from another process. -* Allow using Realm in an embedded framework by setting - `APPLICATION_EXTENSION_API_ONLY` to YES. - -### Bugfixes - -* Fix a crash in CFRunLoopSourceInvalidate. - -0.91.0 Release notes (2015-03-10) -============================================================= - -### API breaking changes - -* `attributesForProperty:` has been removed from `RLMObject`. You now specify indexed - properties by implementing the `indexedProperties` method. -* An exception will be thrown when calling `setEncryptionKey:forRealmsAtPath:`, - `setSchemaVersion:forRealmAtPath:withMigrationBlock:`, and `migrateRealmAtPath:` - when a Realm at the given path is already open. -* Object and array properties of type `RLMObject` will no longer be allowed. - -### Enhancements - -* Add support for sharing Realm files between processes. -* The browser will no longer show objects that have no persisted properties. -* `RLMSchema`, `RLMObjectSchema`, and `RLMProperty` now have more useful descriptions. -* Opening an encrypted Realm while a debugger is attached to the process no - longer throws an exception. -* `RLMArray` now exposes an `isInvalidated` property to indicate if it can no - longer be accessed. - -### Bugfixes - -* An exception will now be thrown when calling `-beginWriteTransaction` from within a notification - triggered by calling `-beginWriteTransaction` elsewhere. -* When calling `delete:` we now verify that the object being deleted is persisted in the target Realm. -* Fix crash when calling `createOrUpdate:inRealm` with nested linked objects. -* Use the key from `+[RLMRealm setEncryptionKey:forRealmsAtPath:]` in - `-writeCopyToPath:error:` and `+migrateRealmAtPath:`. -* Comparing an RLMObject to a non-RLMObject using `-[RLMObject isEqual:]` or - `-isEqualToObject:` now returns NO instead of crashing. -* Improved error message when an `RLMObject` subclass is defined nested within - another Swift declaration. -* Fix crash when the process is terminated by the OS on iOS while encrypted realms are open. -* Fix crash after large commits to encrypted realms. - -0.90.6 Release notes (2015-02-20) -============================================================= - -### Enhancements - -* Improve compatibility of encrypted Realms with third-party crash reporters. - -### Bugfixes - -* Fix incorrect results when using aggregate functions on sorted RLMResults. -* Fix data corruption when using writeCopyToPath:encryptionKey:. -* Maybe fix some assertion failures. - -0.90.5 Release notes (2015-02-04) -============================================================= - -### Bugfixes - -* Fix for crashes when encryption is enabled on 64-bit iOS devices. - -0.90.4 Release notes (2015-01-29) -============================================================= - -### Bugfixes - -* Fix bug that resulted in columns being dropped and recreated during migrations. - -0.90.3 Release notes (2015-01-27) -============================================================= - -### Enhancements - -* Calling `createInDefaultRealmWithObject:`, `createInRealm:withObject:`, - `createOrUpdateInDefaultRealmWithObject:` or `createOrUpdateInRealm:withObject:` - is a no-op if the argument is an RLMObject of the same type as the receiver - and is already backed by the target realm. - -### Bugfixes - -* Fix incorrect column type assertions when the first Realm file opened is a - read-only file that is missing tables. -* Throw an exception when adding an invalidated or deleted object as a link. -* Throw an exception when calling `createOrUpdateInRealm:withObject:` when the - receiver has no primary key defined. - -0.90.1 Release notes (2015-01-22) -============================================================= - -### Bugfixes - -* Fix for RLMObject being treated as a model object class and showing up in the browser. -* Fix compilation from the podspec. -* Fix for crash when calling `objectsWhere:` with grouping in the query on `allObjects`. - -0.90.0 Release notes (2015-01-21) -============================================================= - -### API breaking changes - -* Rename `-[RLMRealm encryptedRealmWithPath:key:readOnly:error:]` to - `-[RLMRealm realmWithPath:encryptionKey:readOnly:error:]`. -* `-[RLMRealm setSchemaVersion:withMigrationBlock]` is no longer global and must be called - for each individual Realm path used. You can now call `-[RLMRealm setDefaultRealmSchemaVersion:withMigrationBlock]` - for the default Realm and `-[RLMRealm setSchemaVersion:forRealmAtPath:withMigrationBlock:]` for all others; - -### Enhancements - -* Add `-[RLMRealm writeCopyToPath:encryptionKey:error:]`. -* Add support for comparing string columns to other string columns in queries. - -### Bugfixes - -* Roll back changes made when an exception is thrown during a migration. -* Throw an exception if the number of items in a RLMResults or RLMArray changes - while it's being fast-enumerated. -* Also encrypt the temporary files used when encryption is enabled for a Realm. -* Fixed crash in JSONImport example on OS X with non-en_US locale. -* Fixed infinite loop when opening a Realm file in the Browser at the same time - as it is open in a 32-bit simulator. -* Fixed a crash when adding primary keys to older realm files with no primary - keys on any objects. -* Fixed a crash when removing a primary key in a migration. -* Fixed a crash when multiple write transactions with no changes followed by a - write transaction with changes were committed without the main thread - RLMRealm getting a chance to refresh. -* Fixed incomplete results when querying for non-null relationships. -* Improve the error message when a Realm file is opened in multiple processes - at once. - -0.89.2 Release notes (2015-01-02) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix an assertion failure when invalidating a Realm which is in a write - transaction, has already been invalidated, or has never been used. -* Fix an assertion failure when sorting an empty RLMArray property. -* Fix a bug resulting in the browser never becoming visible on 10.9. -* Write UTF-8 when generating class files from a realm file in the Browser. - -0.89.1 Release notes (2014-12-22) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Improve the error message when a Realm can't be opened due to lacking write - permissions. - -### Bugfixes - -* Fix an assertion failure when inserting rows after calling `deleteAllObjects` - on a Realm. -* Separate dynamic frameworks are now built for the simulator and devices to - work around App Store submission errors due to the simulator version not - being automatically stripped from dynamic libraries. - -0.89.0 Release notes (2014-12-18) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Add support for encrypting Realm files on disk. -* Support using KVC-compliant objects without getters or with custom getter - names to initialize RLMObjects with `createObjectInRealm` and friends. - -### Bugfixes - -* Merge native Swift default property values with defaultPropertyValues(). -* Don't leave the database schema partially updated when opening a realm fails - due to a migration being needed. -* Fixed issue where objects with custom getter names couldn't be used to - initialize other objects. -* Fix a major performance regression on queries on string properties. -* Fix a memory leak when circularly linked objects are added to a Realm. - -0.88.0 Release notes (2014-12-02) -============================================================= - -### API breaking changes - -* Deallocating an RLMRealm instance in a write transaction lacking an explicit - commit/cancel will now be automatically cancelled instead of committed. -* `-[RLMObject isDeletedFromRealm]` has been renamed to `-[RLMObject isInvalidated]`. - -### Enhancements - -* Add `-[RLMRealm writeCopyToPath:]` to write a compacted copy of the Realm - another file. -* Add support for case insensitive, BEGINSWITH, ENDSWITH and CONTAINS string - queries on array properties. -* Make fast enumeration of `RLMArray` and `RLMResults` ~30% faster and - `objectAtIndex:` ~55% faster. -* Added a lldb visualizer script for displaying the contents of persisted - RLMObjects when debugging. -* Added method `-setDefaultRealmPath:` to change the default Realm path. -* Add `-[RLMRealm invalidate]` to release data locked by the current thread. - -### Bugfixes - -* Fix for crash when running many simultaneous write transactions on background threads. -* Fix for crashes caused by opening Realms at multiple paths simultaneously which have had - properties re-ordered during migration. -* Don't run the query twice when `firstObject` or `lastObject` are called on an - `RLMResults` which has not had its results accessed already. -* Fix for bug where schema version is 0 for new Realm created at the latest version. -* Fix for error message where no migration block is specified when required. - -0.87.4 Release notes (2014-11-07) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix browser location in release zip. - -0.87.3 Release notes (2014-11-06) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Added method `-linkingObjectsOfClass:forProperty:` to RLMObject to expose inverse - relationships/backlinks. - -### Bugfixes - -* Fix for crash due to missing search index when migrating an object with a string primary key - in a database created using an older versions (0.86.3 and earlier). -* Throw an exception when passing an array containing a - non-RLMObject to -[RLMRealm addObjects:]. -* Fix for crash when deleting an object from multiple threads. - -0.87.0 Release notes (2014-10-21) -============================================================= - -### API breaking changes - -* RLMArray has been split into two classes, `RLMArray` and `RLMResults`. RLMArray is - used for object properties as in previous releases. Moving forward all methods used to - enumerate, query, and sort objects return an instance of a new class `RLMResults`. This - change was made to support diverging apis and the future addition of change notifications - for queries. -* The api for migrations has changed. You now call `setSchemaVersion:withMigrationBlock:` to - register a global migration block and associated version. This block is applied to Realms as - needed when opened for Realms at a previous version. The block can be applied manually if - desired by calling `migrateRealmAtPath:`. -* `arraySortedByProperty:ascending:` was renamed to `sortedResultsUsingProperty:ascending` -* `addObjectsFromArray:` on both `RLMRealm` and `RLMArray` has been renamed to `addObjects:` - and now accepts any container class which implements `NSFastEnumeration` -* Building with Swift support now requires Xcode 6.1 - -### Enhancements - -* Add support for sorting `RLMArray`s by multiple columns with `sortedResultsUsingDescriptors:` -* Added method `deleteAllObjects` on `RLMRealm` to clear a Realm. -* Added method `createObject:withObject:` on `RLMMigration` which allows object creation during migrations. -* Added method `deleteObject:` on `RLMMigration` which allows object deletion during migrations. -* Updating to core library version 0.85.0. -* Implement `objectsWhere:` and `objectsWithPredicate:` for array properties. -* Add `cancelWriteTransaction` to revert all changes made in a write transaction and end the transaction. -* Make creating `RLMRealm` instances on background threads when an instance - exists on another thread take a fifth of the time. -* Support for partial updates when calling `createOrUpdateWithObject:` and `addOrUpdateObject:` -* Re-enable Swift support on OS X - -### Bugfixes - -* Fix exceptions when trying to set `RLMObject` properties after rearranging - the properties in a `RLMObject` subclass. -* Fix crash on IN query with several thousand items. -* Fix crash when querying indexed `NSString` properties. -* Fixed an issue which prevented in-memory Realms from being used accross multiple threads. -* Preserve the sort order when querying a sorted `RLMResults`. -* Fixed an issue with migrations where if a Realm file is deleted after a Realm is initialized, - the newly created Realm can be initialized with an incorrect schema version. -* Fix crash in `RLMSuperSet` when assigning to a `RLMArray` property on a standalone object. -* Add an error message when the protocol for an `RLMArray` property is not a - valid object type. -* Add an error message when an `RLMObject` subclass is defined nested within - another Swift class. - -0.86.3 Release notes (2014-10-09) -============================================================= - -### Enhancements - -* Add support for != in queries on object relationships. - -### Bugfixes - -* Re-adding an object to its Realm no longer throws an exception and is now a no-op - (as it was previously). -* Fix another bug which would sometimes result in subclassing RLMObject - subclasses not working. - -0.86.2 Release notes (2014-10-06) -============================================================= - -### Bugfixes - -* Fixed issues with packaging "Realm Browser.app" for release. - -0.86.1 Release notes (2014-10-03) -============================================================= - -### Bugfixes - -* Fix a bug which would sometimes result in subclassing RLMObject subclasses - not working. - -0.86.0 Release notes (2014-10-03) -============================================================= - -### API breaking changes - -* Xcode 6 is now supported from the main Xcode project `Realm.xcodeproj`. - Xcode 5 is no longer supported. - -### Enhancements - -* Support subclassing RLMObject models. Although you can now persist subclasses, - polymorphic behavior is not supported (i.e. setting a property to an - instance of its subclass). -* Add support for sorting RLMArray properties. -* Speed up inserting objects with `addObject:` by ~20%. -* `readonly` properties are automatically ignored rather than having to be - added to `ignoredProperties`. -* Updating to core library version 0.83.1. -* Return "[deleted object]" rather than throwing an exception when - `-description` is called on a deleted RLMObject. -* Significantly improve performance of very large queries. -* Allow passing any enumerable to IN clauses rather than just NSArray. -* Add `objectForPrimaryKey:` and `objectInRealm:forPrimaryKey:` convenience - methods to fetch an object by primary key. - -### Bugfixes - -* Fix error about not being able to persist property 'hash' with incompatible - type when building for devices with Xcode 6. -* Fix spurious notifications of new versions of Realm. -* Fix for updating nested objects where some types do not have primary keys. -* Fix for inserting objects from JSON with NSNull values when default values - should be used. -* Trying to add a persisted RLMObject to a different Realm now throws an - exception rather than creating an uninitialized object. -* Fix validation errors when using IN on array properties. -* Fix errors when an IN clause has zero items. -* Fix for chained queries ignoring all but the last query's conditions. - -0.85.0 Release notes (2014-09-15) -============================================================= - -### API breaking changes - -* Notifications for a refresh being needed (when autorefresh is off) now send - the notification type RLMRealmRefreshRequiredNotification rather than - RLMRealmDidChangeNotification. - -### Enhancements - -* Updating to core library version 0.83.0. -* Support for primary key properties (for int and string columns). Declaring a property - to be the primary key ensures uniqueness for that property for all objects of a given type. - At the moment indexes on primary keys are not yet supported but this will be added in a future - release. -* Added methods to update or insert (upsert) for objects with primary keys defined. -* `[RLMObject initWithObject:]` and `[RLMObject createInRealmWithObject:]` now support - any object type with kvc properties. -* The Swift support has been reworked to work around Swift not being supported - in Frameworks on iOS 7. -* Improve performance when getting the count of items matching a query but not - reading any of the objects in the results. -* Add a return value to `-[RLMRealm refresh]` that indicates whether or not - there was anything to refresh. -* Add the class name to the error message when an RLMObject is missing a value - for a property without a default. -* Add support for opening Realms in read-only mode. -* Add an automatic check for updates when using Realm in a simulator (the - checker code is not compiled into device builds). This can be disabled by - setting the REALM_DISABLE_UPDATE_CHECKER environment variable to any value. -* Add support for Int16 and Int64 properties in Swift classes. - -### Bugfixes - -* Realm change notifications when beginning a write transaction are now sent - after updating rather than before, to match refresh. -* `-isEqual:` now uses the default `NSObject` implementation unless a primary key - is specified for an RLMObject. When a primary key is specified, `-isEqual:` calls - `-isEqualToObject:` and a corresponding implementation for `-hash` is also implemented. - -0.84.0 Release notes (2014-08-28) -============================================================= - -### API breaking changes - -* The timer used to trigger notifications has been removed. Notifications are now - only triggered by commits made in other threads, and can not currently be triggered - by changes made by other processes. Interprocess notifications will be re-added in - a future commit with an improved design. - -### Enhancements - -* Updating to core library version 0.82.2. -* Add property `deletedFromRealm` to RLMObject to indicate objects which have been deleted. -* Add support for the IN operator in predicates. -* Add support for the BETWEEN operator in link queries. -* Add support for multi-level link queries in predicates (e.g. `foo.bar.baz = 5`). -* Switch to building the SDK from source when using CocoaPods and add a - Realm.Headers subspec for use in targets that should not link a copy of Realm - (such as test targets). -* Allow unregistering from change notifications in the change notification - handler block. -* Significant performance improvements when holding onto large numbers of RLMObjects. -* Realm-Xcode6.xcodeproj now only builds using Xcode6-Beta6. -* Improved performance during RLMArray iteration, especially when mutating - contained objects. - -### Bugfixes - -* Fix crashes and assorted bugs when sorting or querying a RLMArray returned - from a query. -* Notifications are no longer sent when initializing new RLMRealm instances on background - threads. -* Handle object cycles in -[RLMObject description] and -[RLMArray description]. -* Lowered the deployment target for the Xcode 6 projects and Swift examples to - iOS 7.0, as they didn't actually require 8.0. -* Support setting model properties starting with the letter 'z' -* Fixed crashes that could result from switching between Debug and Relase - builds of Realm. - -0.83.0 Release notes (2014-08-13) -============================================================= - -### API breaking changes - -* Realm-Xcode6.xcodeproj now only builds using Xcode6-Beta5. -* Properties to be persisted in Swift classes must be explicitly declared as `dynamic`. -* Subclasses of RLMObject subclasses now throw an exception on startup, rather - than when added to a Realm. - -### Enhancements - -* Add support for querying for nil object properties. -* Improve error message when specifying invalid literals when creating or - initializing RLMObjects. -* Throw an exception when an RLMObject is used from the incorrect thread rather - than crashing in confusing ways. -* Speed up RLMRealm instantiation and array property iteration. -* Allow array and objection relation properties to be missing or null when - creating a RLMObject from a NSDictionary. - -### Bugfixes - -* Fixed a memory leak when querying for objects. -* Fixed initializing array properties on standalone Swift RLMObject subclasses. -* Fix for queries on 64bit integers. - -0.82.0 Release notes (2014-08-05) -============================================================= - -### API breaking changes - -* Realm-Xcode6.xcodeproj now only builds using Xcode6-Beta4. - -### Enhancements - -* Updating to core library version 0.80.5. -* Now support disabling the `autorefresh` property on RLMRealm instances. -* Building Realm-Xcode6 for iOS now builds a universal framework for Simulator & Device. -* Using NSNumber properties (unsupported) now throws a more informative exception. -* Added `[RLMRealm defaultRealmPath]` -* Proper implementation for [RLMArray indexOfObjectWhere:] -* The default Realm path on OS X is now ~/Library/Application Support/[bundle - identifier]/default.realm rather than ~/Documents -* We now check that the correct framework (ios or osx) is used at compile time. - -### Bugfixes - -* Fixed rapid growth of the realm file size. -* Fixed a bug which could cause a crash during RLMArray destruction after a query. -* Fixed bug related to querying on float properties: `floatProperty = 1.7` now works. -* Fixed potential bug related to the handling of array properties (RLMArray). -* Fixed bug where array properties accessed the wrong property. -* Fixed bug that prevented objects with custom getters to be added to a Realm. -* Fixed a bug where initializing a standalone object with an array literal would - trigger an exception. -* Clarified exception messages when using unsupported NSPredicate operators. -* Clarified exception messages when using unsupported property types on RLMObject subclasses. -* Fixed a memory leak when breaking out of a for-in loop on RLMArray. -* Fixed a memory leak when removing objects from a RLMArray property. -* Fixed a memory leak when querying for objects. - - -0.81.0 Release notes (2014-07-22) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Updating to core library version 0.80.3. -* Added support for basic querying of RLMObject and RLMArray properties (one-to-one and one-to-many relationships). - e.g. `[Person objectsWhere:@"dog.name == 'Alfonso'"]` or `[Person objectsWhere:@"ANY dogs.name == 'Alfonso'"]` - Supports all normal operators for numeric and date types. Does not support NSData properties or `BEGINSWITH`, `ENDSWITH`, `CONTAINS` - and other options for string properties. -* Added support for querying for object equality in RLMObject and RLMArray properties (one-to-one and one-to-many relationships). - e.g. `[Person objectsWhere:@"dog == %@", myDog]` `[Person objectsWhere:@"ANY dogs == %@", myDog]` `[Person objectsWhere:@"ANY friends.dog == %@", dog]` - Only supports comparing objects for equality (i.e. ==) -* Added a helper method to RLMRealm to perform a block inside a transaction. -* OSX framework now supported in CocoaPods. - -### Bugfixes - -* Fixed Unicode support in property names and string contents (Chinese, Russian, etc.). Closing #612 and #604. -* Fixed bugs related to migration when properties are removed. -* Fixed keyed subscripting for standalone RLMObjects. -* Fixed bug related to double clicking on a .realm file to launch the Realm Browser (thanks to Dean Moore). - - -0.80.0 Release notes (2014-07-15) -============================================================= - -### API breaking changes - -* Rename migration methods to -migrateDefaultRealmWithBlock: and -migrateRealmAtPath:withBlock: -* Moved Realm specific query methods from RLMRealm to class methods on RLMObject (-allObjects: to +allObjectsInRealm: ect.) - -### Enhancements - -* Added +createInDefaultRealmWithObject: method to RLMObject. -* Added support for array and object literals when calling -createWithObject: and -initWithObject: variants. -* Added method -deleteObjects: to batch delete objects from a Realm -* Support for defining RLMObject models entirely in Swift (experimental, see known issues). -* RLMArrays in Swift support Sequence-style enumeration (for obj in array). -* Implemented -indexOfObject: for RLMArray - -### Known Issues for Swift-defined models - -* Properties other than String, NSData and NSDate require a default value in the model. This can be an empty (but typed) array for array properties. -* The previous caveat also implies that not all models defined in Objective-C can be used for object properties. Only Objective-C models with only implicit (i.e. primitives) or explicit default values can be used. However, any Objective-C model object can be used in a Swift array property. -* Array property accessors don't work until its parent object has been added to a realm. -* Realm-Bridging-Header.h is temporarily exposed as a public header. This is temporary and will be private again once rdar://17633863 is fixed. -* Does not leverage Swift generics and still uses RLM-prefix everywhere. This is coming in #549. - - -0.22.0 Release notes -============================================================= - -### API breaking changes - -* Rename schemaForObject: to schemaForClassName: on RLMSchema -* Removed -objects:where: and -objects:orderedBy:where: from RLMRealm -* Removed -indexOfObjectWhere:, -objectsWhere: and -objectsOrderedBy:where: from RLMArray -* Removed +objectsWhere: and +objectsOrderedBy:where: from RLMObject - -### Enhancements - -* New Xcode 6 project for experimental swift support. -* New Realm Editor app for reading and editing Realm db files. -* Added support for migrations. -* Added support for RLMArray properties on objects. -* Added support for creating in-memory default Realm. -* Added -objectsWithClassName:predicateFormat: and -objectsWithClassName:predicate: to RLMRealm -* Added -indexOfObjectWithPredicateFormat:, -indexOfObjectWithPredicate:, -objectsWithPredicateFormat:, -objectsWithPredi -* Added +objectsWithPredicateFormat: and +objectsWithPredicate: to RLMObject -* Now allows predicates comparing two object properties of the same type. - - -0.20.0 Release notes (2014-05-28) -============================================================= - -Completely rewritten to be much more object oriented. - -### API breaking changes - -* Everything - -### Enhancements - -* None. - -### Bugfixes - -* None. - - -0.11.0 Release notes (not released) -============================================================= - -The Objective-C API has been updated and your code will break! - -### API breaking changes - -* `RLMTable` objects can only be created with an `RLMRealm` object. -* Renamed `RLMContext` to `RLMTransactionManager` -* Renamed `RLMContextDidChangeNotification` to `RLMRealmDidChangeNotification` -* Renamed `contextWithDefaultPersistence` to `managerForDefaultRealm` -* Renamed `contextPersistedAtPath:` to `managerForRealmWithPath:` -* Renamed `realmWithDefaultPersistence` to `defaultRealm` -* Renamed `realmWithDefaultPersistenceAndInitBlock` to `defaultRealmWithInitBlock` -* Renamed `find:` to `firstWhere:` -* Renamed `where:` to `allWhere:` -* Renamed `where:orderBy:` to `allWhere:orderBy:` - -### Enhancements - -* Added `countWhere:` on `RLMTable` -* Added `sumOfColumn:where:` on `RLMTable` -* Added `averageOfColumn:where:` on `RLMTable` -* Added `minOfProperty:where:` on `RLMTable` -* Added `maxOfProperty:where:` on `RLMTable` -* Added `toJSONString` on `RLMRealm`, `RLMTable` and `RLMView` -* Added support for `NOT` operator in predicates -* Added support for default values -* Added validation support in `createInRealm:withObject:` - -### Bugfixes - -* None. - - -0.10.0 Release notes (2014-04-23) -============================================================= - -TightDB is now Realm! The Objective-C API has been updated -and your code will break! - -### API breaking changes - -* All references to TightDB have been changed to Realm. -* All prefixes changed from `TDB` to `RLM`. -* `TDBTransaction` and `TDBSmartContext` have merged into `RLMRealm`. -* Write transactions now take an optional rollback parameter (rather than needing to return a boolean). -* `addColumnWithName:` and variant methods now return the index of the newly created column if successful, `NSNotFound` otherwise. - -### Enhancements - -* `createTableWithName:columns:` has been added to `RLMRealm`. -* Added keyed subscripting for RLMTable's first column if column is of type RLMPropertyTypeString. -* `setRow:atIndex:` has been added to `RLMTable`. -* `RLMRealm` constructors now have variants that take an writable initialization block -* New object interface - tables created/retrieved using `tableWithName:objectClass:` return custom objects - -### Bugfixes - -* None. - - -0.6.0 Release notes (2014-04-11) -============================================================= - -### API breaking changes - -* `contextWithPersistenceToFile:error:` renamed to `contextPersistedAtPath:error:` in `TDBContext` -* `readWithBlock:` renamed to `readUsingBlock:` in `TDBContext` -* `writeWithBlock:error:` renamed to `writeUsingBlock:error:` in `TDBContext` -* `readTable:withBlock:` renamed to `readTable:usingBlock:` in `TDBContext` -* `writeTable:withBlock:error:` renamed to `writeTable:usingBlock:error:` in `TDBContext` -* `findFirstRow` renamed to `indexOfFirstMatchingRow` on `TDBQuery`. -* `findFirstRowFromIndex:` renamed to `indexOfFirstMatchingRowFromIndex:` on `TDBQuery`. -* Return `NSNotFound` instead of -1 when appropriate. -* Renamed `castClass` to `castToTytpedTableClass` on `TDBTable`. -* `removeAllRows`, `removeRowAtIndex`, `removeLastRow`, `addRow` and `insertRow` methods - on table now return void instead of BOOL. - -### Enhancements -* A `TDBTable` can now be queried using `where:` and `where:orderBy:` taking - `NSPredicate` and `NSSortDescriptor` as arguments. -* Added `find:` method on `TDBTable` to find first row matching predicate. -* `contextWithDefaultPersistence` class method added to `TDBContext`. Will create a context persisted - to a file in app/documents folder. -* `renameColumnWithIndex:to:` has been added to `TDBTable`. -* `distinctValuesInColumnWithIndex` has been added to `TDBTable`. -* `dateIsBetween::`, `doubleIsBetween::`, `floatIsBetween::` and `intIsBetween::` - have been added to `TDBQuery`. -* Column names in Typed Tables can begin with non-capital letters too. The generated `addX` - selector can look odd. For example, a table with one column with name `age`, - appending a new row will look like `[table addage:7]`. -* Mixed typed values are better validated when rows are added, inserted, - or modified as object literals. -* `addRow`, `insertRow`, and row updates can be done using objects - derived from `NSObject`. -* `where` has been added to `TDBView`and `TDBViewProtocol`. -* Adding support for "smart" contexts (`TDBSmartContext`). - -### Bugfixes - -* Modifications of a `TDBView` and `TDBQuery` now throw an exception in a readtransaction. - - -0.5.0 Release notes (2014-04-02) -============================================================= - -The Objective-C API has been updated and your code will break! -Of notable changes a fast interface has been added. -This interface includes specific methods to get and set values into Tightdb. -To use these methods import ``. - -### API breaking changes - -* `getTableWithName:` renamed to `tableWithName:` in `TDBTransaction`. -* `addColumnWithName:andType:` renamed to `addColumnWithName:type:` in `TDBTable`. -* `columnTypeOfColumn:` renamed to `columnTypeOfColumnWithIndex` in `TDBTable`. -* `columnNameOfColumn:` renamed to `nameOfColumnWithIndex:` in `TDBTable`. -* `addColumnWithName:andType:` renamed to `addColumnWithName:type:` in `TDBDescriptor`. -* Fast getters and setters moved from `TDBRow.h` to `TDBRowFast.h`. - -### Enhancements - -* Added `minDateInColumnWithIndex` and `maxDateInColumnWithIndex` to `TDBQuery`. -* Transactions can now be started directly on named tables. -* You can create dynamic tables with initial schema. -* `TDBTable` and `TDBView` now have a shared protocol so they can easier be used interchangeably. - -### Bugfixes - -* Fixed bug in 64 bit iOS when inserting BOOL as NSNumber. - - -0.4.0 Release notes (2014-03-26) -============================================================= - -### API breaking changes - -* Typed interface Cursor has now been renamed to Row. -* TDBGroup has been renamed to TDBTransaction. -* Header files are renamed so names match class names. -* Underscore (_) removed from generated typed table classes. -* TDBBinary has been removed; use NSData instead. -* Underscope (_) removed from generated typed table classes. -* Constructor for TDBContext has been renamed to contextWithPersistenceToFile: -* Table findFirstRow and min/max/sum/avg operations has been hidden. -* Table.appendRow has been renamed to addRow. -* getOrCreateTable on Transaction has been removed. -* set*:inColumnWithIndex:atRowIndex: methods have been prefixed with TDB -* *:inColumnWithIndex:atRowIndex: methods have been prefixed with TDB -* addEmptyRow on table has been removed. Use [table addRow:nil] instead. -* TDBMixed removed. Use id and NSObject instead. -* insertEmptyRow has been removed from table. Use insertRow:nil atIndex:index instead. - -#### Enhancements - -* Added firstRow, lastRow selectors on view. -* firstRow and lastRow on table now return nil if table is empty. -* getTableWithName selector added on group. -* getting and creating table methods on group no longer take error argument. -* [TDBQuery parent] and [TDBQuery subtable:] selectors now return self. -* createTable method added on Transaction. Throws exception if table with same name already exists. -* Experimental support for pinning transactions on Context. -* TDBView now has support for object subscripting. - -### Bugfixes - -* None. - - -0.3.0 Release notes (2014-03-14) -============================================================= - -The Objective-C API has been updated and your code will break! - -### API breaking changes - -* Most selectors have been renamed in the binding! -* Prepend TDB-prefix on all classes and types. - -### Enhancements - -* Return types and parameters changed from size_t to NSUInteger. -* Adding setObject to TightdbTable (t[2] = @[@1, @"Hello"] is possible). -* Adding insertRow to TightdbTable. -* Extending appendRow to accept NSDictionary. - -### Bugfixes - -* None. - - -0.2.0 Release notes (2014-03-07) -============================================================= - -The Objective-C API has been updated and your code will break! - -### API breaking changes - -* addRow renamed to addEmptyRow - -### Enhancements - -* Adding a simple class for version numbering. -* Adding get-version and set-version targets to build.sh. -* tableview now supports sort on column with column type bool, date and int -* tableview has method for checking the column type of a specified column -* tableview has method for getting the number of columns -* Adding methods getVersion, getCoreVersion and isAtLeast. -* Adding appendRow to TightdbTable. -* Adding object subscripting. -* Adding method removeColumn on table. - -### Bugfixes - -* None. diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Resources/Info.plist b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Resources/Info.plist deleted file mode 100644 index 0c7b6d04e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Resources/Info.plist +++ /dev/null @@ -1,50 +0,0 @@ - - - - - BuildMachineOSBuild - 22G91 - CFBundleDevelopmentRegion - English - CFBundleExecutable - Realm - CFBundleIdentifier - io.Realm.Realm - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - Realm - CFBundlePackageType - FMWK - CFBundleShortVersionString - 10.42.3 - CFBundleSignature - ???? - CFBundleSupportedPlatforms - - MacOSX - - CFBundleVersion - 10.42.3 - DTCompiler - com.apple.compilers.llvm.clang.1_0 - DTPlatformBuild - - DTPlatformName - macosx - DTPlatformVersion - 14.0 - DTSDKBuild - 23A5326c - DTSDKName - macosx14.0 - DTXcode - 1500 - DTXcodeBuild - 15A5229h - LSMinimumSystemVersion - 10.14 - NSHumanReadableCopyright - Copyright © 2014-2021 Realm. All rights reserved. - - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Resources/LICENSE b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Resources/LICENSE deleted file mode 100644 index 66a27ec5f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/Resources/LICENSE +++ /dev/null @@ -1,177 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/_CodeSignature/CodeResources b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/_CodeSignature/CodeResources deleted file mode 100644 index a51ebb17e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/A/_CodeSignature/CodeResources +++ /dev/null @@ -1,717 +0,0 @@ - - - - - files - - Resources/CHANGELOG.md - - Zv1aE8lgTnRPKTg4+FZa+hYQQNM= - - Resources/Info.plist - - 37qKn6yYo8Bs7w5Bsw9U508vLTM= - - Resources/LICENSE - - htlQ0eA7QbvmaoSv/b3yVb0Yvsc= - - - files2 - - Headers/NSError+RLMSync.h - - hash2 - - 6nK1lw6vBPSTrCi83gbHTMykzmdmX0MlMrq6LmJk94I= - - - Headers/RLMAPIKeyAuth.h - - hash2 - - FwweqLeo/BZi7cBnkDu+AdBgnukrjAbjicdVQJ3PVV8= - - - Headers/RLMApp.h - - hash2 - - fmHB8oywmfycQqOzXoYB99LpOLE7akGn0ZrJtqviiTs= - - - Headers/RLMArray.h - - hash2 - - KaucaZvTcO+xDUtNo4JYySrZMCq6E8OiSYOMG3/LBxE= - - - Headers/RLMAsymmetricObject.h - - hash2 - - +liD/ke74W4Loa4OKvFBITIRTkZRZbItMxN6R4eU7wY= - - - Headers/RLMAsyncTask.h - - hash2 - - iyHi4LWQgTu2yYDS23OZ1wfdZt3ouoY5VoI0aEsHOm0= - - - Headers/RLMBSON.h - - hash2 - - W+5lc5SCRmNbVF2Pu9Zd2v46R+WALQ7xoNCOYC1Swnw= - - - Headers/RLMCollection.h - - hash2 - - womyBrMRt2s1UKKkPo++KwOv6DtP6q48hcBi1jfM2hI= - - - Headers/RLMConstants.h - - hash2 - - QntrtgpnRkkfsRAPt4SY8+3rscdQDbqztCyWdLS0vsU= - - - Headers/RLMCredentials.h - - hash2 - - ObUBKMWeTU0zI7Q4Ts9H5trRs4y4T3bCUY808oTm0bY= - - - Headers/RLMDecimal128.h - - hash2 - - Ubfmc9QWzsK+AcqbQRwaiXdylBV0LgqlyqeMBY1+LyQ= - - - Headers/RLMDictionary.h - - hash2 - - 7zN2nXgEwGfrPRtbgqtfoLrwJbwqohcVvU/OyA/07Lk= - - - Headers/RLMEmailPasswordAuth.h - - hash2 - - kPgBdHJePj/cHAbWCVhZlW1gCQP5jXtJ7XudO0PWjJc= - - - Headers/RLMEmbeddedObject.h - - hash2 - - ixHqXedHxkS6e1f2hOY4TR7NWMyNq34b4/nm8SR0Oxc= - - - Headers/RLMError.h - - hash2 - - 6duvM3p0FRf6fZ+aS57vHkf7WvV1KPoz7PcIZA48WTU= - - - Headers/RLMFindOneAndModifyOptions.h - - hash2 - - eBuQnRLTeMBzF7m2R9PMJor8N0HG8BATxdCptRT1l9M= - - - Headers/RLMFindOptions.h - - hash2 - - P8MSaPFACOtAPsGYinSqt6NMIsXKcWkHpFTlly2GBYo= - - - Headers/RLMLogger.h - - hash2 - - Rc5dqT87eP/gD3kVZ1e7cRwI9Mkt5r6CFn/coM+9wNw= - - - Headers/RLMMigration.h - - hash2 - - /CXq+e7CtzaXdrGoLya2a56Zz6xWRH73N3RzyMcQrgs= - - - Headers/RLMMongoClient.h - - hash2 - - mcINEnrePRx0xfRaNvOmeXYRadQMzwLngLrJ1OVyopc= - - - Headers/RLMMongoCollection.h - - hash2 - - E0fX0BjuJ0j4c8TuCPbwnLNKz673nghSyUN4BYN/+Io= - - - Headers/RLMMongoDatabase.h - - hash2 - - wnJWmMW0z3xO9KVRJKpiE+xkaKkzXBXiH5j+8eaFmcA= - - - Headers/RLMNetworkTransport.h - - hash2 - - AicqavQF04Q9MIj7DC5P9gBz6OuViFiiAmXdjlFnDHg= - - - Headers/RLMObject.h - - hash2 - - OiikDToZtuVXIwxkh+yGFMFCP0c/2M6A8cIP77/xvcU= - - - Headers/RLMObjectBase.h - - hash2 - - 0IkNkedPyHNJuPYD0PmVx4Bg/+mH8tv2PNXD2m9hWV8= - - - Headers/RLMObjectBase_Dynamic.h - - hash2 - - MhHocXkaDJWhg+kvj9Hqqy9FG4zTtna2Np2i7p4l/mA= - - - Headers/RLMObjectId.h - - hash2 - - Y7IcVMBjUeMCgI/orPGngNh0qcgC7R7fwx2STYYTC2g= - - - Headers/RLMObjectSchema.h - - hash2 - - 8oCJihoGgigIF170SRk/yU5RLDNX9TYQUrXxLjYrtuM= - - - Headers/RLMProperty.h - - hash2 - - nV0mZEIKVaPW2/FVbUaWuXy+nEV5iB30UZ55i0VVCno= - - - Headers/RLMProviderClient.h - - hash2 - - aOPxwbDKabtIt2wbqZ4Wb/le1H43X9HXrNkONHiEX2M= - - - Headers/RLMPushClient.h - - hash2 - - vLfYK+JyPmkHz32A9v/JPJGPKAL9QTKDDjuzAvbp+oQ= - - - Headers/RLMRealm+Sync.h - - hash2 - - WcmSf38ttMQ4awjqOn4zkmpysaf44aAT0GgECwvPPTA= - - - Headers/RLMRealm.h - - hash2 - - DMk8xOvPhlnZalU0C2E5O60eqhA67YErgxkj3mI4jXc= - - - Headers/RLMRealmConfiguration.h - - hash2 - - j5GiT0/nxORHqliXnJv/kkbOOqZX33xDbk8OTR7zDwU= - - - Headers/RLMRealm_Dynamic.h - - hash2 - - S14hbsZJZN4uVtz+HI326QGjnxKdSRlU6Ogf/zRhn3I= - - - Headers/RLMResults.h - - hash2 - - qZJ0imHeOKCxk0VNEkVldju7BQHiZ2hohjwCeU6aZTg= - - - Headers/RLMSchema.h - - hash2 - - Da+xBUjLeHl2hcOCpSFRylZchf6KtXuqqjscXH1jJQM= - - - Headers/RLMSectionedResults.h - - hash2 - - sXdD7rSZHJKtS62ScBNQhWdpGkKW1aDVK0qCzOouJIs= - - - Headers/RLMSet.h - - hash2 - - GJyUsZbhXDGgjqOQlfqqef9XjQnvB5nCRPHtZJWGa3w= - - - Headers/RLMSwiftObject.h - - hash2 - - Mp9akxBWxbrBunN7cH8rKSLxSps0tbV78UDSheKAlcU= - - - Headers/RLMSwiftProperty.h - - hash2 - - 9FsxWX7jcaks+2ZmTf4cgN0zvirLeNQHSB6BYAO1EYI= - - - Headers/RLMSyncConfiguration.h - - hash2 - - Qd1NmY+Z/yEGUpaaue7NEJ5fPWaRdhGPZwdhliidIpY= - - - Headers/RLMSyncManager.h - - hash2 - - rFV4QDsBonA29YqdZXsYhNSVewEYkrafSLPWBGaEhqI= - - - Headers/RLMSyncSession.h - - hash2 - - nvtBHH3xJsThO0B4IC70G3oFD2TAm3ylKbmewSOosI4= - - - Headers/RLMSyncSubscription.h - - hash2 - - bLLVFGHhtBca6vgsFZmW1oNaoYQlrjFELS/wESp9AbM= - - - Headers/RLMThreadSafeReference.h - - hash2 - - UMODRNRT6SDDKzmYIElQuKxojpiUtxhb0o/KbUM9BiA= - - - Headers/RLMUpdateResult.h - - hash2 - - lAHF8rLoAYtBCB3iqPCJEeSAijx4p/TLf2Q/B/qh5lY= - - - Headers/RLMUser.h - - hash2 - - wTq72vEeK8F3E3s/3DWLNz76GPbIMmApC5KfRF6m0ro= - - - Headers/RLMUserAPIKey.h - - hash2 - - 1QyqOo1U0h/D83T3jmF2rcq87+P6CHZvXh5dNLZQV00= - - - Headers/RLMValue.h - - hash2 - - kTEM0oJVWJv89s6/r6s0AHQoO1bJZsYB8IHZKbPtddY= - - - Headers/Realm.h - - hash2 - - kjoP0TvFhg49q7sxVEgPoNFg+zqo9bCE2Uh0YOpDpbE= - - - Modules/module.modulemap - - hash2 - - KdpbsAGrxax/jx81TZ93YswnCwT1BZTor6VwIHvgRUs= - - - PrivateHeaders/RLMAccessor.h - - hash2 - - SPn/lNQWueENJmkQ4wtBIhfjYt6+nmmT97X3fzuAJC0= - - - PrivateHeaders/RLMApp_Private.h - - hash2 - - 4pd3636NRX7kQgsEy7dv7IQH/AyZMKjQvA2nmK97Vq0= - - - PrivateHeaders/RLMArray_Private.h - - hash2 - - 2N5vpeRBFWpvYEVWixFuVwigDP3cRo9i7S0qyB7fCZE= - - - PrivateHeaders/RLMAsyncTask_Private.h - - hash2 - - vD90SYI5658JDp88stHbsxALdVNhs0Tojcld9hVORHE= - - - PrivateHeaders/RLMBSON_Private.hpp - - hash2 - - BbwPX5lPL+B+5GRik9KiI5HcYoKNH/Tsciqyo3dZwBw= - - - PrivateHeaders/RLMCollection_Private.h - - hash2 - - Ez5JFCGYAGERpmwzK44V9Wu5NkwdLOrl1iHqFvur6r4= - - - PrivateHeaders/RLMDictionary_Private.h - - hash2 - - L46EZOdftwGMzm9VC/4u3hkjsshqrE1MqRXoAkJqsOg= - - - PrivateHeaders/RLMEvent.h - - hash2 - - 5QzhSVhLCncN5PArOpGSswyWYU5jSvmLJ64E6SIAYdw= - - - PrivateHeaders/RLMLogger_Private.h - - hash2 - - FcXRklemoAfn0U01YWdTuUgt0i183/x1v71EplpuujM= - - - PrivateHeaders/RLMMigration_Private.h - - hash2 - - ffQpfBvMLXuV8NocpO5ksVSmYUATypSSGr91LEfzT6o= - - - PrivateHeaders/RLMMongoCollection_Private.h - - hash2 - - PihL2Vx/JsPS4RvQXdpvaQ+VxmtmdOwaYgtH6f9wNQs= - - - PrivateHeaders/RLMObjectBase_Private.h - - hash2 - - qSCecm7kZ3JIPZlhy4bqSwWYGpxP6cO+4XEUgSvdUTY= - - - PrivateHeaders/RLMObjectSchema_Private.h - - hash2 - - YULa8m2pbU/ji4KozUqn/FNoRTWwO71lgKeJiAbPRYA= - - - PrivateHeaders/RLMObjectStore.h - - hash2 - - 0KjmazUjg/mYvymGTJ74ChBgvrqN2Lc9O0TqcYF/Mic= - - - PrivateHeaders/RLMObject_Private.h - - hash2 - - +H8SMf9eYajdgBd1CmVWutUX5RsEHIsqKiruzH9R/Ok= - - - PrivateHeaders/RLMProperty_Private.h - - hash2 - - SCHY8+Qpt8utNhA5fwnUlOZ4Lg3O4Ubp5JrNuf01QIA= - - - PrivateHeaders/RLMPushClient_Private.hpp - - hash2 - - 2Os6mvA+v08M/g6mBUU8xUYAJvdOf9G/Fe1c0QuXlVg= - - - PrivateHeaders/RLMRealmConfiguration_Private.h - - hash2 - - syVrRHUbHQtVS/Dn94ZFKgu8iSJM1m17S0xnMCK9yEg= - - - PrivateHeaders/RLMRealm_Private.h - - hash2 - - Iwvw9zZudHE58doxwpdgpZqHaiCFT0Vn256EkmeFzIw= - - - PrivateHeaders/RLMResults_Private.h - - hash2 - - 7XS2lKYYaVQEMQ+lyOes++x+RIKDsVc8K2ZyTCf2NgE= - - - PrivateHeaders/RLMScheduler.h - - hash2 - - k60PzA5BmG/FSt34q+UmdeQWecO5OhB+uZnq99H1Fzc= - - - PrivateHeaders/RLMSchema_Private.h - - hash2 - - xuglEVxHTOiGP9pVTJ8oLhSTM1SRk38dn7uPHqUQ93Y= - - - PrivateHeaders/RLMSet_Private.h - - hash2 - - Fo+6TD0oovdpdflJ6GyRvXgCOWHSSjd2bAR+j7Fs88U= - - - PrivateHeaders/RLMSwiftCollectionBase.h - - hash2 - - bDV50WQPz5wCRCcFfCQLob/JPetY8XeEOZOJXoLtGKs= - - - PrivateHeaders/RLMSwiftSupport.h - - hash2 - - bDHCy6fOU4zn5MSi6CAVRmKQsc7GJgx6X4RNHbuI8Ws= - - - PrivateHeaders/RLMSwiftValueStorage.h - - hash2 - - D9eklFNwtXSh83+sMaYU1SNzeidnyKUXZV2PLWt+Ank= - - - PrivateHeaders/RLMSyncConfiguration_Private.h - - hash2 - - neftVth2HwCuILURLXm1nMY/GZCeo0G5/yYCIS8gz3Q= - - - PrivateHeaders/RLMSyncSubscription_Private.h - - hash2 - - Y9ySSatKNxy/XkESWScAioTpFet/83QmLhrE1VUIgmU= - - - PrivateHeaders/RLMUser_Private.h - - hash2 - - 4DKpP+7zxmcfnitz1DhLK2fhsChCk2aPWbG0B85100o= - - - Resources/CHANGELOG.md - - hash2 - - wt8p9tw4OPVj/LtpO9d+DXFoOnRQ6hRaxf/hS2NxDRg= - - - Resources/Info.plist - - hash2 - - j5zPVyg7y3Li5RJXjlOqskV7JvGSz10z0/tRdQ+iniE= - - - Resources/LICENSE - - hash2 - - aYSSIb+5AFPeITTvXm1UAoe0uYBiMmSS8flvXaaFUks= - - - - rules - - ^Resources/ - - ^Resources/.*\.lproj/ - - optional - - weight - 1000 - - ^Resources/.*\.lproj/locversion.plist$ - - omit - - weight - 1100 - - ^Resources/Base\.lproj/ - - weight - 1010 - - ^version.plist$ - - - rules2 - - .*\.dSYM($|/) - - weight - 11 - - ^(.*/)?\.DS_Store$ - - omit - - weight - 2000 - - ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/ - - nested - - weight - 10 - - ^.* - - ^Info\.plist$ - - omit - - weight - 20 - - ^PkgInfo$ - - omit - - weight - 20 - - ^Resources/ - - weight - 20 - - ^Resources/.*\.lproj/ - - optional - - weight - 1000 - - ^Resources/.*\.lproj/locversion.plist$ - - omit - - weight - 1100 - - ^Resources/Base\.lproj/ - - weight - 1010 - - ^[^/]+$ - - nested - - weight - 10 - - ^embedded\.provisionprofile$ - - weight - 20 - - ^version\.plist$ - - weight - 20 - - - - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/Current b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/Current deleted file mode 120000 index 8c7e5a667..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/macos-arm64_x86_64/Realm.framework/Versions/Current +++ /dev/null @@ -1 +0,0 @@ -A \ No newline at end of file diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/CHANGELOG.md b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/CHANGELOG.md deleted file mode 100644 index 00cc01244..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/CHANGELOG.md +++ /dev/null @@ -1,9539 +0,0 @@ -10.42.3 Release notes (2023-09-18) -============================================================= - -### Enhancements - -* Update packaging for the Xcode 15.0 release. Carthage release and obj-c - binaries are now built with Xcode 15. - -### Fixed - -* The prebuilt Realm.xcframework for SPM was packaged incorrectly and did not - work ([#8361](https://github.com/realm/realm-swift/issues/8361), since v10.42.1). - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 15.0.0. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15.0.0. - -10.42.2 Release notes (2023-09-13) -============================================================= - -### Enhancements - -* Add support for logging messages sent by the server. - ([Core #6476](https://github.com/realm/realm-core/pull/6476)) -* Unknown protocol errors received from the baas server will no longer cause - the application to crash if a valid error action is also received. Unknown - error actions will be treated as an ApplicationBug error action and will - cause sync to fail with an error via the sync error handler. - ([Core #6885](https://github.com/realm/realm-core/pull/6885)) -* Some sync error messages now contain more information about what went wrong. - -### Fixed - -* The `MultipleSyncAgents` exception from opening a synchronized Realm in - multiple processes at once no longer leaves the sync client in an invalid - state. ([Core #6868](https://github.com/realm/realm-core/pull/6868), since v10.36.0) -* Testing the size of a collection of links against zero would sometimes fail - (sometimes = "difficult to explain"). In particular: - ([Core #6850](https://github.com/realm/realm-core/issues/6850), since v10.41.0) -* When async writes triggered a file compaction some internal state could be - corrupted, leading to later crashes in the slab allocator. This typically - resulted in the "ref + size <= next->first" assertion failure, but other - failures were possible. Many issues reported; see [Core #6340](https://github.com/realm/realm-core/issues/6340). - (since 10.35.0) -* `Realm.Configuration.maximumNumberOfActiveVersions` now handles intermediate - versions which have been cleaned up correctly and checks the number of live - versions rather than the number of versions between the oldest live version - and current version (since 10.35.0). -* If the client disconnected between uploading a change to flexible sync - subscriptions and receiving the new object data from the server resulting - from that subscription change, the next connection to the server would - sometimes result in a client reset - ([Core #6966](https://github.com/realm/realm-core/issues/6966), since v10.21.1). - -### Deprecations - -* `RLMApp` has `localAppName` and `localAppVersion` fields which never ended up - being used for anything and are now deprecated. -* `RLMSyncAuthError` has not been used since v10.0.0 and is now deprecated. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 7. - -### Internal - -* Upgraded realm-core from 13.17.1 to 13.20.1 - -10.42.1 Release notes (2023-08-28) -============================================================= - -### Fixed - -* The names of the prebuilt zips for SPM have changed to avoid having Carthage - download them instead of the intended Carthage zip - ([#8326](https://github.com/realm/realm-swift/issues/8326), since v10.42.0). -* The prebuild Realm.xcframework for SwiftPM now has all platforms other than - visionOS built with Xcode 14 to comply with app store rules - ([#8339](https://github.com/realm/realm-swift/issues/8339), since 10.42.0). -* Fix visionOS compilation with Xcode beta 7. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 7. - -10.42.0 Release notes (2023-07-30) -============================================================= - -### Enhancements - -* Add support for building for visionOS and add Xcode 15 binaries to the - release package. visionOS currently requires installing Realm via either - Swift Package Manager or by using a XCFramework as CocoaPods and Carthage do - not yet support it. -* Zips compatible with SPM's `.binaryTarget()` are now published as part of the - releases on Github. -* Prebuilt XCFrameworks are now built with LTO enabled. This has insignificant - performance benefits, but cuts the size of the library by ~15%. - -### Fixed - -* Fix nested properties observation on a `Projections` not notifying when there is a property change. - ([#8276](https://github.com/realm/realm-swift/issues/8276), since v10.34.0). -* Fix undefined symbol error for `UIKit` when linking Realm to a framework using SPM. - ([#8308](https://github.com/realm/realm-swift/issues/8308), since v10.41.0) -* If the app crashed at exactly the wrong time while opening a freshly - compacted Realm the file could be left in an invalid state - ([Core #6807](https://github.com/realm/realm-core/pull/6807), since v10.33.0). -* Sync progress for DOWNLOAD messages was sometimes stored incorrectly, - resulting in an extra round trip to the server. - ([Core #6827](https://github.com/realm/realm-core/issues/6827), since v10.31.0) - -### Breaking Changes - -* Legacy non-xcframework Carthage installations are no longer supported. Please - ensure you are using `--use-xcframeworks` if installing via Carthage. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 5. - -### Internal - -* Upgraded realm-core from 13.17.0 to 13.17.1 -* Release packages were being uploaded to several static.realm.io URLs which - are no longer linked to anywhere. These are no longer being updated, and - release packages are now only being uploaded to Github. - -10.41.1 Release notes (2023-07-17) -============================================================= - -### Enhancements - -* Filesystem errors now include more information in the error message. -* Sync connection and session reconnect timing/backoff logic has been reworked - and unified into a single implementation. Previously some categories of errors - would cause an hour-long wait before attempting to reconnect, while others - would use an exponential backoff strategy. All errors now result in the sync - client waiting for 1 second before retrying, doubling the wait after each - subsequent failure up to a maximum of five minutes. If the cause of the error - changes, the backoff will be reset. If the sync client voluntarily disconnects, - no backoff will be used. ([Core #6526]((https://github.com/realm/realm-core/pull/6526))) - -### Fixed - -* Removed warnings for deprecated APIs internal use. - ([#8251](https://github.com/realm/realm-swift/issues/8251), since v10.39.0) -* Fix an error during async open and client reset if properties have been added - to the schema. This fix also applies to partition-based to flexible sync - migration if async open is used. ([Core #6707](https://github.com/realm/realm-core/issues/6707), since v10.28.2) - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 4. - -### Internal - -* Upgraded realm-core from 13.15.1 to 13.17.0 -* The location where prebuilt core binaries are published has changed slightly. - If you are using `REALM_BASE_URL` to mirror the binaries, you may need to - adjust your mirroring logic. - -10.41.0 Release notes (2023-06-26) -============================================================= - -### Enhancements - -* Add support for multiplexing sync connections. When enabled (the default), a single - connection is used per sync user rather than one per synchronized Realm. This - reduces resource consumption when multiple Realms are opened and will - typically improve performance ([PR #8282](https://github.com/realm/realm-swift/pull/8282)). -* Sync timeout options can now be set on `RLMAppConfiguration` along with the - other app-wide configuration settings ([PR #8282](https://github.com/realm/realm-swift/pull/8282)). - -### Fixed - -* Import as `RLMRealm_Private.h` as a module would cause issues when using Realm as a subdependency. - ([#8164](https://github.com/realm/realm-swift/issues/8164), since 10.37.0) -* Disable setting a custom logger by default on the sync client when the sync manager is created. - This was overriding the default logger set using `RLMLogger.defaultLogger`. (since v10.39.0). - -### Breaking Changes - -* The `RLMSyncTimeouts.appConfiguration` property has been removed. This was an - unimplemented read-only property which did not make any sense on the - containing type ([PR #8282](https://github.com/realm/realm-swift/pull/8282)). - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 2. - -### Internal - -* Upgraded realm-core from 13.15.0 to 13.15.1 - -10.40.2 Release notes (2023-06-09) -============================================================= - -### Enhancements - -* `Actor.preconditionIsolated()` is now used for runtime actor checking when - available (i.e. building with Xcode 15 and running on iOS 17) rather than the - less reliable workaround. - -### Fixed - -* If downloading the fresh Realm file failed during a client reset on a - flexible sync Realm, the sync client would crash the next time the Realm was - opened. ([Core #6494](https://github.com/realm/realm-core/issues/6494), since v10.28.2) -* If the order of properties in the local class definitions did not match the - order in the server-side schema, the before-reset Realm argument passed to a - client reset handler would have an invalid schema and likely crash if any - data was read from it. ([Core #6693](https://github.com/realm/realm-core/issues/6693), since v10.40.0) - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 1. - -### Internal - -* Upgraded realm-core from 13.13.0 to 13.15.0. -* The prebuilt library used for CocoaPods installations is now built with Xcode - 14. This should not have any observable effects other than the download being - much smaller due to no longer including bitcode. - -10.40.1 Release notes (2023-06-06) -============================================================= - -### Enhancements - -* Fix compilation with Xcode 15. Note that iOS 12 is the minimum supported - deployment target when using Xcode 15. -* Switch to building the Carthage release with Xcode 14.3.1. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 1. - -### Internal - -* Overhauled SDK metrics collection to better drive future development efforts. - -10.40.0 Release notes (2023-05-26) -============================================================= - -Drop support for Xcode 13 and add Xcode 14.3.1. Xcode 14.1 is now the minimum -supported version. - -### Enhancements - -* Adjust the error message for private `Object` subclasses and subclasses - nested inside other types to explain how to make them work rather than state - that it's impossible. ([#5662](https://github.com/realm/realm-cocoa/issues/5662)). -* Improve performance of SectionedResults. With a single section it is now ~10% - faster, and the runtime of sectioning no longer scales significantly with - section count, giving >100% speedups when there are large numbers of sections - ([Core #6606](https://github.com/realm/realm-core/pull/6606)). -* Very slightly improve performance of runtime thread checking on the main - thread. ([Core #6606](https://github.com/realm/realm-core/pull/6606)) - -### Fixed - -* Allow support for implicit boolean queries on Swift's Type Safe Queries API - ([#8212](https://github.com/realm/realm-swift/issues/8212)). -* Fixed a fatal error (reported to the sync error handler) during client reset - or automatic partition-based to flexible sync migration if the reset has been - triggered during an async open and the schema being applied has added new - classes. Due to this bug automatic flexibly sync migration has been disabled - for older releases and this is now the minimum version required. - ([#6601](https://github.com/realm/realm-core/issues/6601), since automatic - client resets were introduced in v10.25.0) -* Dictionaries sometimes failed to map unresolved links to nil. If the target - of a link in a dictionary was deleted by another sync client, reading that - field from the dictionary would sometimes give an invalid object rather than - nil. In addition, queries on dictionaries would sometimes have incorrect - results. ([Core #6644](https://github.com/realm/realm-core/pull/6644), since v10.8.0) -* Older versions of Realm would sometimes fail to properly mark objects as - being the target of an incoming link from another object. When this happened, - deleting the target object would hit an assertion failure due to the - inconsistent state. We now reconstruct a valid state rather than crashing. - ([Core #6585](https://github.com/realm/realm-core/issues/6585), since v5.0.0) -* Fix several UBSan failures which did not appear to result in functional bugs - ([Core #6649](https://github.com/realm/realm-core/pull/6649)). -* Using both synchronous and asynchronous transactions on the same thread or - scheduler could hit the assertion failure "!realm.is_in_transaction()" if one - of the callbacks for an asynchronous transaction happened to be scheduled - during a synchronous transaction - ([Core #6659](https://github.com/realm/realm-core/issues/6659), since v10.26.0) -* The stored deployment location for Apps was not being updated correctly after - receiving a redirect response from the server, resulting in every connection - attempting to connect to the old URL and getting redirected rather than only - the first connection after the deployment location changed. - ([Core #6630](https://github.com/realm/realm-core/issues/6630), since v10.38.2) - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-14.3.1. - -### Internal - -* Upgraded realm-core from 13.10.1 to 13.13.0. - -10.39.1 Release notes (2023-05-05) -============================================================= - -### Enhancements - -* New notifiers can now be registered in write transactions until changes have - actually been made in the write transaction. This makes it so that new - notifications can be registered inside change notifications triggered by - beginning a write transaction (unless a previous callback performed writes). - ([#4818](https://github.com/realm/realm-swift/issues/4818)). -* Reduce the memory footprint of an automatic (discard or recover) client reset - when there are large incoming changes from the server. - ([Core #6567](https://github.com/realm/realm-core/issues/6567)). - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from 13.10.0 to 13.10.1. - -10.39.0 Release notes (2023-05-03) -============================================================= - -### Enhancements - -* Add support for actor-isolated Realms, opened with `try await Realm(actor: actor)`. - - Rather than being confined to the current thread or a dispatch queue, - actor-isolated Realms are isolated to an actor. This means that they can be - used from any thread as long as it's within a function isolated to that - actor, and they remain valid over suspension points where a task may hop - between threads. Actor-isolated Realms can be used with either global or - local actors: - - ```swift - @MainActor function mainThreadFunction() async throws { - // These are identical: the async init continues to produce a - // MainActor-confined Realm if no actor is supplied - let realm1 = try await Realm() - let realm2 = try await Realm(MainActor.shared) - } - - // A simple example of a custom global actor - @globalActor actor BackgroundActor: GlobalActor { - static var shared = BackgroundActor() - } - - @BackgroundActor backgroundThreadFunction() async throws { - // Explicitly specifying the actor is required for everything but MainActor - let realm = try await Realm(actor: BackgroundActor.shared) - try await realm.write { - _ = realm.create(MyObject.self) - } - // Thread-confined Realms would sometimes throw an exception here, as we - // may end up on a different thread after an `await` - print("\(realm.objects(MyObject.self).count)") - } - - actor MyActor { - // An implicitly-unwrapped optional is used here to let us pass `self` to - // `Realm(actor:)` within `init` - var realm: Realm! - init() async throws { - realm = try await Realm(actor: self) - } - - var count: Int { - realm.objects(MyObject.self).count - } - - func create() async throws { - try await realm.asyncWrite { - realm.create(MyObject.self) - } - } - } - - // This function isn't isolated to the actor, so each operation has to be async - func createObjects() async throws { - let actor = try await MyActor() - for _ in 0..<5 { - await actor.create() - } - print("\(await actor.count)") - } - - // In an isolated function, an actor-isolated Realm can be used synchronously - func createObjects(in actor: isolated MyActor) async throws { - await actor.realm.write { - actor.realm.create(MyObject.self) - } - print("\(actor.realm.objects(MyObject.self).count)") - } - ``` - - Actor-isolated Realms come with a more convenient syntax for asynchronous - writes. `try await realm.write { ... }` will suspend the current task, - acquire the write lock without blocking the current thread, and then invoke - the block. The actual data is then written to disk on a background thread, - and the task is resumed once that completes. As this does not block the - calling thread while waiting to write and does not perform i/o on the calling - thread, this will often be safe to use from `@MainActor` functions without - blocking the UI. Sufficiently large writes may still benefit from being done - on a background thread. - - Asynchronous writes are only supported for actor-isolated Realms or in - `@MainActor` functions. - - Actor-isolated Realms require Swift 5.8 (Xcode 14.3). Enabling both strict - concurrency checking (`SWIFT_STRICT_CONCURRENCY=complete` in Xcode) and - runtime actor data race detection (`OTHER_SWIFT_FLAGS=-Xfrontend - -enable-actor-data-race-checks`) is strongly recommended when using - actor-isolated Realms. -* Add support for automatic partition-based to flexible sync migration. - Connecting to a server-side app configured to use flexible sync with a - client-side partition-based sync configuration is now supported, and will - automatically create the appropriate flexible sync subscriptions to subscribe - to the requested partition. This allows changing the configuration on the - server from partition-based to flexible without breaking existing clients. - ([Core #6554](https://github.com/realm/realm-core/issues/6554)) -* Now you can use an array `[["_id": 1], ["breed": 0]]` as sorting option for a - MongoCollection. This new API fixes the issue where the resulting documents - when using more than one sort parameter were not consistent between calls. - ([#7188](https://github.com/realm/realm-swift/issues/7188), since v10.0.0). -* Add support for adding a user created default logger, which allows implementing your own logging logic - and the log threshold level. - You can define your own logger creating an instance of `Logger` and define the log function which will be - invoked whenever there is a log message. - - ```swift - let logger = Logger(level: .all) { level, message in - print("Realm Log - \(level): \(message)") - } - ``` - - Set this custom logger as Realm default logger using `Logger.shared`. - ```swift - Logger.shared = logger - ``` -* It is now possible to change the default log threshold level at any point of the application's lifetime. - ```swift - Logger.shared.logLevel = .debug - ``` - This will override the log level set anytime before by a user created logger. -* We have set `.info` as the default log threshold level for Realm. You will now see some - log message in your console. To disable use `Logger.shared.level = .off`. - -### Fixed - -* Several schema initialization functions had incorrect `@MainActor` - annotations, resulting in runtime warnings if the first time a Realm was - opened was on a background thread - ([#8222](https://github.com/realm/realm-swift/issues/8222), since v10.34.0). - -### Deprecations - -* `App.SyncManager.logLevel` and `App.SyncManager.logFunction` are deprecated in favour of - setting a default logger. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from v13.9.4 to v13.10.0. - -10.38.3 Release notes (2023-04-28) -============================================================= - -### Enhancements - -* Improve performance of cancelling a write transactions after making changes. - If no KVO observers are used this is now constant time rather than taking - time proportional to the number of changes to be rolled back. Cancelling a - write transaction with KVO observers is 10-20% faster. ([Core PR #6513](https://github.com/realm/realm-core/pull/6513)). - -### Fixed - -* Performing a large number of queries without ever performing a write resulted - in steadily increasing memory usage, some of which was never fully freed due - to an unbounded cache ([#7978](https://github.com/realm/realm-swift/issues/7978), since v10.27.0). - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from 13.9.3 to 13.9.4 - -10.38.2 Release notes (2023-04-25) -============================================================= - -### Enhancements - -* Improve performance of equality queries on a non-indexed AnyRealmValue - property by about 30%. ([Core #6506](https://github.com/realm/realm-core/issues/6506)) - -### Fixed - -* SSL handshake errors were treated as fatal errors rather than errors which - should be retried. ([Core #6434](https://github.com/realm/realm-core/issues/6434), since v10.35.0) - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from 13.9.0 to 13.9.3. - -10.38.1 Release notes (2023-04-25) -============================================================= - -### Fixed - -* The error handler set on EventsConfiguration was not actually used (since v10.26.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -10.38.0 Release notes (2023-03-31) -============================================================= - -Switch to building the Carthage release with Xcode 14.3. - -### Enhancements - -* Add Xcode 14.3 binaries to the release package. Note that CocoaPods 1.12.0 - does not support Xcode 14.3. -* Add support for sharing encrypted Realms between multiple processes. - ([Core #1845](https://github.com/realm/realm-core/issues/1845)) - -### Fixed - -* Fix a memory leak reported by Instruments on `URL.path` in - `Realm.Configuration.fileURL` when using a string partition key in Partition - Based Sync ([#8195](https://github.com/realm/realm-swift/pull/8195)), since v10.0.0). -* Fix a data race in version management. If one thread committed a write - transaction which increased the number of live versions above the previous - highest seen during the current session at the same time as another thread - began a read, the reading thread could read from a no-longer-valid memory - mapping. This could potentially result in strange crashes when opening, - refreshing, freezing or thawing a Realm - ([Core #6411](https://github.com/realm/realm-core/pull/6411), since v10.35.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from 13.8.0 to 13.9.0. - -10.37.2 Release notes (2023-03-29) -============================================================= - -### Fixed - -* Copying a `RLMRealmConfiguration` failed to copy several fields. This - resulted in migrations being passed the incorrect object type in Swift when - using the default configuration (since v10.34.0) or async open (since - v10.37.0). This also broke using the Events API in those two scenarios (since - v10.26.0 for default configuration and v10.37.0 for async open). ([#8190](https://github.com/realm/realm-swift/issues/8190)) - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -10.37.1 Release notes (2023-03-27) -============================================================= - -### Enhancements - -* Performance improvement for the following queries ([Core #6376](https://github.com/realm/realm-core/issues/6376)): - * Significant (~75%) improvement when counting (`Results.count`) the number - of exact matches (with no other query conditions) on a - string/int/UUID/ObjectID property that has an index. This improvement - will be especially noticiable if there are a large number of results - returned (duplicate values). - * Significant (~99%) improvement when querying for an exact match on a Date - property that has an index. - * Significant (~99%) improvement when querying for a case insensitive match - on an AnyRealmValue property that has an index. - * Moderate (~25%) improvement when querying for an exact match on a Bool - property that has an index. - * Small (~5%) improvement when querying for a case insensitive match on an - AnyRealmValue property that does not have an index. - -### Fixed - -* Add missing `@Sendable` annotations to several sync and app services related - callbacks ([PR #8169](https://github.com/realm/realm-swift/pull/8169), since v10.34.0). -* Fix some bugs in handling task cancellation for async Realm init. Some very - specific timing windows could cause crashes, and the download would not be - cancelled if the Realm was already open ([PR #8178](https://github.com/realm/realm-swift/pull/8178), since v10.37.0). -* Fix a crash when querying an AnyRealmValue property with a string operator - (contains/like/beginswith/endswith) or with case insensitivity. - ([Core #6376](https://github.com/realm/realm-core/issues/6376), since v10.8.0) -* Querying for case-sensitive equality of a string on an indexed AnyRealmValue - property was returning case insensitive matches. For example querying for - `myIndexedAny == "Foo"` would incorrectly match on values of "foo" or "FOO" etc. - ([Core #6376](https://github.com/realm/realm-core/issues/6376), since v10.8.0) -* Adding an index to an AnyRealmValue property when objects of that type - already existed would crash with an assertion. - ([Core #6376](https://github.com/realm/realm-core/issues/6376), since v10.8.0). -* Fix a bug that may have resulted in arrays being in different orders on - different devices. Some cases of “Invalid prior_size” may be fixed too. - ([Core #6191](https://github.com/realm/realm-core/issues/6191), since v10.25.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -### Internal - -* Upgraded realm-core from 13.6.0 to 13.8.0 - -10.37.0 Release notes (2023-03-09) -============================================================= - -### Enhancements - -* `MongoCollection.watch().subscribe(on:)` now supports any swift Scheduler - rather than only dispatch queues ([PR #8131](https://github.com/realm/realm-swift/pull/8130)). -* Add an async sequence wrapper for `MongoCollection.watch()`, allowing you to - do `for try await change in collection.changeEvents { ... }` - ([PR #8131](https://github.com/realm/realm-swift/pull/8130)). -* The internals of error handling and reporting have been significantly - reworked. The visible effects of this are that some errors which previously - had unhelpful error messages now include more detail about what went wrong, - and App errors now expose a much more complete set of error codes - ([PR #8002](https://github.com/realm/realm-swift/pull/8002)). -* Expose compensating write error information. When the server rejects a - modification made by the client (such as if the user does not have the - required permissions), a `SyncError` is delivered to the sync error handler - with the code `.writeRejected` and a non-nil `compensatingWriteInfo` field - which contains information about what was rejected and why. This information - is intended primarily for debugging and logging purposes and may not have a - stable format. ([PR #8002](https://github.com/realm/realm-swift/pull/8002)) -* Async `Realm.init()` now handles Task cancellation and will cancel the async - open if the Task is cancelled ([PR #8148](https://github.com/realm/realm-swift/pull/8148)). -* Cancelling async opens now has more consistent behavior. The previously - intended and documented behavior was that cancelling an async open would - result in the callback associated with the specific task that was cancelled - never being called, and all other pending callbacks would be invoked with an - ECANCELED error. This never actually worked correctly, and the callback which - was not supposed to be invoked at all sometimes would be. We now - unconditionally invoke all of the exactly once, passing ECANCELED to all of - them ([PR #8148](https://github.com/realm/realm-swift/pull/8148)). - -### Fixed - -* `UserPublisher` incorrectly bounced all notifications to the main thread instead - of setting up the Combine publisher to correctly receive on the main thread. - ([#8132](https://github.com/realm/realm-swift/issues/8132), since 10.21.0) -* Fix warnings when building with Xcode 14.3 beta 2. -* Errors in async open resulting from invalid queries in `initialSubscriptions` - would result in the callback being invoked with both a non-nil Realm and a - non-nil Error even though the Realm was in an invalid state. Now only the - error is passed to the callback ([PR #8148](https://github.com/realm/realm-swift/pull/8148), since v10.28.0). -* Converting a local realm to a synced realm would crash if an embedded object - was null ([Core #6294](https://github.com/realm/realm-core/issues/6294), since v10.22.0). -* Subqueries on indexed properties performed extremely poorly. ([Core #6327](https://github.com/realm/realm-core/issues/6327), since v5.0.0) -* Fix a crash when a SSL read successfully read a non-zero number of bytes and - also reported an error. ([Core #5435](https://github.com/realm/realm-core/issues/5435), since 10.0.0) -* The sync client could get stuck in an infinite loop if the server sent an - invalid changeset which caused a transform error. This now results in a - client reset instead. ([Core #6051](https://github.com/realm/realm-core/issues/6051), since v10.0.0) -* Strings in queries which contained any characters which required multiple - bytes when encoded as utf-8 were incorrectly encoded as binary data when - serializing the query to send it to the server for a flexible sync - subscription, resulting the server rejecting the query - ([Core #6350](https://github.com/realm/realm-core/issues/6350), since 10.22.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -### Internal - -* Upgraded realm-core from 13.4.1 to 13.6.0 - -10.36.0 Release notes (2023-02-15) -============================================================= - -### Enhancements - -* Add support for multiple overlapping or nested event scopes. - `Events.beginScope()` now returns a `Scope` object which is used to commit or - cancel that scope, and if more than one scope is active at a time events are - reported to all active scopes. - -### Fixed - -* Fix moving `List` items to a higher index in SwiftUI results in wrong destination index - ([#7956](https://github.com/realm/realm-swift/issues/7956), since v10.6.0). -* Using the `searchable` view modifier with `@ObservedResults` in iOS 16 would - cause the collection observation subscription to cancel. - ([#8096](https://github.com/realm/realm-swift/issues/8096), since 10.21.0) -* Client reset with recovery would sometimes crash if the recovery resurrected - a dangling link ([Core #6292](https://github.com/realm/realm-core/issues/6292), since v10.32.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -### Internal - -* Upgraded realm-core from 13.4.0 to 13.4.1 - -10.35.1 Release notes (2023-02-10) -============================================================= - -### Fixed - -* Client reset with recovery would crash if a client reset occurred the very - first time the Realm was opened with async open. The client reset callbacks - are now not called if the Realm had never been opened before - ([PR #8125](https://github.com/realm/realm-swift/pull/8125), since 10.32.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -10.35.0 Release notes (2023-02-07) -============================================================= - -This version bumps the Realm file format version to 23. Realm files written by -this version cannot be read by older versions of Realm. - -### Enhancements - -* The Realm file is now automatically shrunk if the file size is larger than - needed to store all of the data. ([Core PR #5755](https://github.com/realm/realm-core/pull/5755)) -* Pinning old versions (either with frozen Realms or with Realms on background - threads that simply don't get refreshed) now only prevents overwriting the - data needed by that version, rather than the data needed by that version and - all later versions. In addition, frozen Realms no longer pin the transaction - logs used to drive change notifications. This mostly eliminates the file size - growth caused by pinning versions. ([Core PR #5440](https://github.com/realm/realm-core/pull/5440)) -* Rework how Dictionaries/Maps are stored in the Realm file. The new design uses - less space and is typically significantly faster. This changes the iteration - order of Maps, so any code relying on that may be broken. We continue - to make no guarantees about iteration order on Maps ([Core #5764](https://github.com/realm/realm-core/issues/5764)). -* Improve performance of freezing Realms ([Core PR #6211](https://github.com/realm/realm-core/pull/6211)). - -### Fixed - -* Fix a crash when using client reset with recovery and flexible sync with a - single subscription ([Core #6070](https://github.com/realm/realm-core/issues/6070), since v10.28.2) -* Encrypted Realm files could not be opened on devices with a larger page size - than the one which originally wrote the file. - ([#8030](https://github.com/realm/realm-swift/issues/8030), since v10.32.1) -* Creating multiple flexible sync subscriptions at once could hit an assertion - failure if the server reported an error for any of them other than the last - one ([Core #6038](https://github.com/realm/realm-core/issues/6038), since v10.21.1). -* `Set` and `List` considered a string and binary - data containing that string encoded as UTF-8 to be equivalent. This could - result in a List entry not changing type on assignment and for the client be - inconsistent with the server if a string and some binary data with equivalent - content was inserted from Atlas. - ([Core #4860](https://github.com/realm/realm-core/issues/4860) and - [Core #6201](https://github.com/realm/realm-core/issues/6201), since v10.8.0) -* Querying for NaN on Decimal128 properties did not match any objects - ([Core #6182](https://github.com/realm/realm-core/issues/6182), since v10.8.0). -* When client reset with recovery is used and the recovery did not need to - make any changes to the local Realm, the sync client could incorrectly think - the recovery failed and report the error "A fatal error occured during client - reset: 'A previous 'Recovery' mode reset from did not succeed, - giving up on 'Recovery' mode to prevent a cycle'". - ([Core #6195](https://github.com/realm/realm-core/issues/6195), since v10.32.0) -* Fix a crash when using client reset with recovery and flexible sync with a - single subscription ([Core #6070](https://github.com/realm/realm-core/issues/6070), since v10.28.2) -* Writing to newly in-view objects while a flexible sync bootstrap was in - progress would not synchronize those changes to the server - ([Core #5804](https://github.com/realm/realm-core/issues/5804), since v10.21.1). -* If a client reset with recovery or discard local was interrupted while the - "fresh" realm was being downloaded, the sync client could crash with a - MultpleSyncAgents exception ([Core #6217](https://github.com/realm/realm-core/issues/6217), since v10.25.0). -* Sharing Realm files between a Catalyst app and Realm Studio did not properly - synchronize access to the Realm file ([Core #6258](https://github.com/realm/realm-core/pull/6258), since v10.0.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -### Internal - -* Upgraded realm-core from 12.13.0 to 13.4.0 - -10.34.1 Release notes (2023-01-20) -============================================================= - -### Fixed - -* Add some missing `@preconcurrency` annotations which lead to build failures - with Xcode 14.0 when importing via SPM or CocoaPods - ([#8104](https://github.com/realm/realm-swift/issues/8104), since v10.34.0). - -### Compatibility - -* Realm Studio: 11.0.0 - 12.0.0. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -10.34.0 Release notes (2023-01-13) -============================================================= - -Swift 5.5 is no longer supported. Swift 5.6 (Xcode 13.3) is now the minimum -supported version. - -The prebuilt binary for Carthage is now build with Xcode 14.2. - -### Enhancements - -* Improve performance of creating Projection objects and of change - notifications on projections ([PR #8050](https://github.com/realm/realm-swift/pull/8050)). -* Allow initialising any sync configuration with `cancelAsyncOpenOnNonFatalErrors`. -* Improve performance of Combine value publishers which do not use the - object/collection changesets a little. -* All public types have been audited for sendability and are now marked as - Sendable when applicable. A few types which were incidentally not thread-safe - but make sense to use from multiple threads are now thread-safe. -* Add support for building Realm with strict concurrency checking enabled. - -### Fixed - -* Fix bad memory access exception that can occur when watching change streams. - [PR #8039](https://github.com/realm/realm-swift/pull/8039). -* Object change notifications on projections only included the first projected - property for each source property ([PR #8050](https://github.com/realm/realm-swift/pull/8050), since v10.21.0). -* `@AutoOpen` failed to open flexible sync Realms while offline - ([#7986](https://github.com/realm/realm-swift/issues/7986), since v10.27.0). -* Fix "Publishing changes from within view updates is not allowed" warnings - when using `@ObservedResults` or `@ObservedSectionedResults` - ([#7908](https://github.com/realm/realm-swift/issues/7908)). -* Fix "Publishing changes from within view updates is not allowed" warnings - when using `@AutoOpen` or `@AsyncOpen`. - ([#7908](https://github.com/realm/realm-swift/issues/7908)). -* Defer `Realm.asyncOpen` execution on `@AsyncOpen` and `@AutoOpen` property - wrappers until all the environment values are set. This will guarantee the - configuration and partition value are set set before opening the realm. - ([#7931](https://github.com/realm/realm-swift/issues/7931), since v10.12.0). -* `@ObservedResults.remove()` could delete the wrong object if a write on a - background thread which changed the index of the object being removed - occurred at a very specific time (since v10.6.0). - -### Compatibility - -* Realm Studio: 11.0.0 - 12.0.0. 13.0.0 is currently incompatible. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -10.33.0 Release notes (2022-12-01) -============================================================= - -### Enhancements - -* Flexible sync subscription state will change to - `SyncSubscriptionState.pending` (`RLMSyncSubscriptionStatePending`) while - waiting for the server to have sent all pending history after a bootstrap and - before marking a subscription as Complete. - ([#5795](https://github.com/realm/realm-core/pull/5795)) -* Add custom column names API, which allows to set a different column name in the realm - from the one used in your object declaration. - ```swift - class Person: Object { - @Persisted var firstName: String - @Persisted var birthDate: Date - @Persisted var age: Int - - override class public func propertiesMapping() -> [String: String] { - ["firstName": "first_name", - "birthDate": "birth_date"] - } - } - ``` - This is very helpful in cases where you want to name a property differently - from your `Device Sync` JSON schema. - This API is only available for old and modern object declaration syntax on the - `RealmSwift` SDK. -* Flexible sync bootstraps now apply 1MB of changesets per write transaction - rather than applying all of them in a single write transaction. - ([Core PR #5999](https://github.com/realm/realm-core/pull/5999)). - -### Fixed - -* Fix a race condition which could result in "operation cancelled" errors being - delivered to async open callbacks rather than the actual sync error which - caused things to fail ([Core PR #5968](https://github.com/realm/realm-core/pull/5968), since the introduction of async open). -* Fix database corruption issues which could happen if an application was - terminated at a certain point in the process of comitting a write - transaciton. ([Core PR #5993](https://github.com/realm/realm-core/pull/5993), since v10.21.1) -* `@AsyncOpen` and `@AutoOpen` would begin and then cancel a second async open - operation ([PR #8038](https://github.com/realm/realm-swift/pull/8038), since v10.12.0). -* Changing the search text when using the searchable SwiftUI extension would - trigger multiple updates on the View for each change - ([PR #8038](https://github.com/realm/realm-swift/pull/8038), since v10.19.0). -* Changing the filter or search properties of an `@ObservedResults` or - `@ObservedSectionedResults` would trigger up to three updates on the View - ([PR #8038](https://github.com/realm/realm-swift/pull/8038), since v10.6.0). -* Fetching a user's profile while the user logs out would result in an - assertion failure. ([Core PR #6017](https://github.com/realm/realm-core/issues/5571), since v10.8.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -### Internal - -* Upgraded realm-core from 12.11.0 to 12.13.0 - -10.32.3 Release notes (2022-11-10) -============================================================= - -### Fixed - -* Fix name lookup errors when importing Realm Swift built in library evolution - mode (([#8014](https://github.com/realm/realm-swift/issues/8014)). -* The prebuilt watchOS library in the objective-c release package was missing - an arm64 slice. The Swift release package was uneffected - ([PR #8016](https://github.com/realm/realm-swift/pull/8016)). -* Fix issue where `RLMUserAPIKey.key`/`UserAPIKey.key` incorrectly returned the name of the API - key instead of the key itself. ([#8021](https://github.com/realm/realm-swift/issues/8021), since v10.0.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -10.32.2 Release notes (2022-11-01) -============================================================= - -Switch to building the Carthage release with Xcode 14.1. - -### Fixed - -* Fix linker errors when building a release build with Xcode 14.1 when - installing via SPM ([#7995](https://github.com/realm/realm-swift/issues/7995)). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -10.32.1 Release notes (2022-10-25) -============================================================= - -### Enhancements - -* Improve performance of client reset with automatic recovery and converting - top-level tables into embedded tables ([Core #5897](https://github.com/realm/realm-core/pull/5897)). -* `Realm.Error` is now a typealias for `RLMError` rather than a - manually-defined version of what the automatic bridging produces. This should - have no effect on existing working code, but the manual definition was - missing a few things supplied by the automatic bridging. -* Some sync errors sent by the server include a link to the server-side logs - associated with that error. This link is now exposed in the `serverLogURL` - property on `SyncError` (or `RLMServerLogURLKey` userInfo field when using NSError). - -### Fixed - -* Many sync and app errors were reported using undocumented internal error - codes and/or domains and could not be progammatically handled. Some notable - things which now have public error codes instead of unstable internal ones: - - `Realm.Error.subscriptionFailed`: The server rejected a flexible sync subscription. - - `AppError.invalidPassword`: A login attempt failed due to a bad password. - - `AppError.accountNameInUse`: A registration attempt failed due to the account name being in use. - - `AppError.httpRequestFailed`: A HTTP request to Atlas App Services - completed with an error HTTP code. The failing code is available in the - `httpStatusCode` property. - - Many other less common error codes have been added to `AppError`. - - All sync errors other than `SyncError.clientResetError` reported incorrect - error codes. - (since v10.0.0). -* `UserAPIKey.objectId` was incorrectly bridged to Swift as `RLMObjectId` to - `ObjectId`. This may produce warnings about an unneccesary cast if you were - previously casting it to the correct type (since v10.0.0). -* Fixed an assertion failure when observing change notifications on a sectioned - result, if the first modification was to a linked property that did not cause - the state of the sections to change. - ([Core #5912](https://github.com/realm/realm-core/issues/5912), - since the introduction of sectioned results in v10.29.0) -* Fix a use-after-free if the last external reference to an encrypted - synchronized Realm was closed between when a client reset error was received - and when the download of the new Realm began. - ([Core #5949](https://github.com/realm/realm-core/pull/5949), since 10.28.4). -* Fix an assertion failure during client reset with recovery when recovering - a list operation on an embedded object that has a link column in the path - prefix to the list from the top level object. - ([Core #5957](https://github.com/realm/realm-core/issues/5957), - since introduction of automatic recovery in v10.32.0). -* Creating a write transaction which is rejected by the server due to it - exceeding the maximum transaction size now results in a client reset error - instead of synchronization breaking and becoming stuck forever - ([Core #5209](https://github.com/realm/realm-core/issues/5209), since v10). -* Opening an unencrypted file with an encryption key would sometimes report a - misleading error message that indicated that the problem was something other - than a decryption failure ([Core #5915](https://github.com/realm/realm-core/pull/5915), since 0.89.0). -* Fix a rare deadlock which could occur when closing a synchronized Realm - immediately after committing a write transaction when the sync worker thread - has also just finished processing a changeset from the server - ([Core #5948](https://github.com/realm/realm-core/pull/5948)). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.0.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -### Internal - -* Upgraded realm-core from 12.9.0 to 12.11.0. - -10.32.0 Release notes (2022-10-10) -============================================================= - -### Enhancements - -* Add `.recoverUnsyncedChanges` (`RLMClientResetModeRecoverUnsyncedChanges`) and -`.recoverOrDiscardUnsyncedChanges` (`RLMClientResetModeRecoverOrDiscardUnsyncedChanges`) behaviors to `ClientResetMode` (`RLMClientResetMode`). - - The newly added recover modes function by downloading a realm which reflects the latest - state of the server after a client reset. A recovery process is run locally in an - attempt to integrate the server state with any local changes from before the - client reset occurred. - The changes are integrated with the following rules: - 1. Objects created locally that were not synced before client reset, will be integrated. - 2. If an object has been deleted on the server, but was modified on the client, the delete takes precedence and the update is discarded. - 3. If an object was deleted on the client, but not the server, then the client delete instruction is applied. - 4. In the case of conflicting updates to the same field, the client update is applied. - - The client reset process will fallback to `ClientResetMode.discardUnsyncedChanges` if the recovery process fails in `.recoverOrDiscardUnsyncedChanges`. - - The client reset process will fallback to `ClientResetMode.manual` if the recovery process fails in `.recoverUnsyncedChanges`. - - The two new swift recovery modes support client reset callbacks: `.recoverUnsyncedChanges(beforeReset: ((Realm) -> Void)? = nil, afterReset: ((Realm, Realm) -> Void)? = nil)`. - - The two new Obj-C recovery modes support client reset callbacks in `notifyBeforeReset` - and `notifyAfterReset`for both `[RLMUser configurationWithPartitionValue]` and `[RLMUser flexibleSyncConfigurationWithClientResetMode]` - For more detail on client reset callbacks, see `ClientResetMode`, `RLMClientResetBeforeBlock`, - `RLMClientResetAfterBlock`, and the 10.25.0 changelog entry. -* Add two new additional interfaces to define a manual client reset handler: - - Add a manual callback handler to `ClientResetMode.manual` -> `ClientResetMode.manual(ErrorReportingBlock? = nil)`. - - Add the `RLMSyncConfiguration.manualClientResetHandler` property (type `RLMSyncErrorReportingBlock`). - - These error reporting blocks are invoked in the event of a `RLMSyncErrorClientResetError`. - - See `ErrorReportingBlock` (`RLMSyncErrorReportingBlock`), and `ClientResetInfo` for more detail. - - Previously, manual client resets were handled only through the `SyncManager.ErrorHandler`. You have the - option, but not the requirement, to define manual reset handler in these interfaces. - Otherwise, the `SyncManager.ErrorHandler` is still invoked during the manual client reset process. - - These new interfaces are only invoked during a `RLMSyncErrorClientResetError`. All other sync errors - are still handled in the `SyncManager.ErrorHandler`. - - See 'Breaking Changes' for information how these interfaces interact with an already existing - `SyncManager.ErrorHandler`. - -### Breaking Changes - -* The default `clientResetMode` (`RLMClientResetMode`) is switched from `.manual` (`RLMClientResetModeManual`) - to `.recoverUnsyncedChanges` (`RLMClientResetModeRecoverUnsyncedChanges`). - - If you are currently using `.manual` and continue to do so, the only change - you must explicitly make is designating manual mode in - your `Realm.Configuration.SyncConfiguration`s, since they will now default to `.recoverUnsyncedChanges`. - - You may choose to define your manual client reset handler in the newly - introduced `manual(ErrorReportingBlock? = nil)` - or `RLMSyncConfiguration.manualClientResetHandler`, but this is not required. - The `SyncManager.errorHandler` will still be invoked during a client reset if - no callback is passed into these new interfaces. - -### Deprecations - -* `ClientResetMode.discardLocal` is deprecated in favor of `ClientResetMode.discardUnsyncedChanges`. - The reasoning is that the name better reflects the effect of this reset mode. There is no actual - difference in behavior. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.0.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -10.31.0 Release notes (2022-10-05) -============================================================= - -The prebuilt binary for Carthage is now build with Xcode 14.0.1. - -### Enhancements - -* Cut the runtime of aggregate operations on large dictionaries in half - ([Core #5864](https://github.com/realm/realm-core/pull/5864)). -* Improve performance of aggregate operations on collections of objects by 2x - to 10x ([Core #5864](https://github.com/realm/realm-core/pull/5864)). - Greatly improve the performance of sorting or distincting a Dictionary's keys - or values. The most expensive operation is now performed O(log N) rather than - O(N log N) times, and large Dictionaries can see upwards of 99% reduction in - time to sort. ([Core #5166](https://github.com/realm/realm-core/pulls/5166)) -* Add support for changing the deployment location for Atlas Apps. Previously - this was assumed to be immutable ([Core #5648](https://github.com/realm/realm-core/issues/5648)). -* The sync client will now yield the write lock to other threads which are - waiting to perform a write transaction even if it still has remaining work to - do, rather than always applying all changesets received from the server even - when other threads are trying to write. ([Core #5844](https://github.com/realm/realm-core/pull/5844)). -* The sync client no longer writes an unused temporary copy of the changesets - received from the server to the Realm file ([Core #5844](https://github.com/realm/realm-core/pull/5844)). - -### Fixed - -* Setting a `List` property with `Results` no longer throws an unrecognized - selector exception (since 10.8.0-beta.2) -* `RLMProgressNotificationToken` and `ProgressNotificationToken` now hold a - strong reference to the sync session, keeping it alive until the token is - deallocated or invalidated, as the other notification tokens do. - ([#7831](https://github.com/realm/realm-swift/issues/7831), since v2.3.0). -* Results permitted some nonsensical aggregate operations on column types which - do not make sense to aggregate, giving garbage results rather than reporting - an error ([Core #5876](https://github.com/realm/realm-core/pull/5876), since v5.0.0). -* Upserting a document in a Mongo collection would crash if the document's id - type was anything other than ObjectId (since v10.0.0). -* Fix a use-after-free when a sync session is closed and the app is destroyed - at the same time ([Core #5752](https://github.com/realm/realm-core/issues/5752), - since v10.19.0). - -### Deprecations - -* `RLMUpdateResult.objectId` has been deprecated in favor of - `RLMUpdateResult.documentId` to support reporting document ids which are not - object ids. -### Breaking Changes -* Private API `_realmColumnNames` has been renamed to a new public API - called `propertiesMapping()`. This change only affects the Swift API - and doesn't have any effects in the obj-c API. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.0.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -### Internal - -* Upgraded realm-core from 12.7.0 to 12.9.0 - -10.30.0 Release notes (2022-09-20) -============================================================= - -### Fixed - -* Incoming links from `RealmAny` properties were not handled correctly when - migrating an object type from top-level to embedded. `RealmAny` properties - currently cannot link to embedded objects. - ([Core #5796](https://github.com/realm/realm-core/pull/5796), since 10.8.0). -* `Realm.refresh()` sometimes did not actually advance to the latest version. - It attempted to be semi-non-blocking in a very confusing way which resulted - in it sometimes advancing to a newer version that is not the latest version, - and sometimes blocking until notifiers are ready so that it could advance to - the latest version. This behavior was undocumented and didn't work correctly, - so it now always blocks if needed to advance to the latest version. - ([#7625](https://github.com/realm/realm-swift/issues/7625), since v0.98.0). -* Fix the most common cause of thread priority inversions when performing - writes on the main thread. If beginning the write transaction has to wait for - the background notification calculations to complete, that wait is now done - in a QoS-aware way. ([#7902](https://github.com/realm/realm-swift/issues/7902)) -* Subscribing to link properties in a flexible sync Realm did not work due to a - mismatch between what the client sent and what the server needed. - ([Core #5409](https://github.com/realm/realm-core/issues/5409)) -* Attempting to use `AsymmetricObject` with partition-based sync now reports a - sensible error much earlier in the process. Asymmetric sync requires using - flexible sync. ([Core #5691](https://github.com/realm/realm-core/issues/5691), since 10.29.0). -* Case-insensitive but diacritic-sensitive queries would crash on 4-byte UTF-8 - characters ([Core #5825](https://github.com/realm/realm-core/issues/5825), since v2.2.0) -* Accented characters are now handled by case-insensitive but - diacritic-sensitive queries. ([Core #5825](https://github.com/realm/realm-core/issues/5825), since v2.2.0) - -### Breaking Changes - -* `-[RLMASLoginDelegate authenticationDidCompleteWithError:]` has been renamed - to `-[RLMASLoginDelegate authenticationDidFailWithError:]` to comply with new - app store requirements. This only effects the obj-c API. - ([#7945](https://github.com/realm/realm-swift/issues/7945)) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1 - 14. - -### Internal - -* Upgraded realm-core from 12.6.0 to 12.7.0 - -10.29.0 Release notes (2022-09-09) -============================================================= - -### Enhancements - -* Add support for asymmetric sync. When a class inherits from - `AsymmetricObject`, objects created are synced unidirectionally to the server - and cannot be queried or read locally. - -```swift - class PersonObject: AsymmetricObject { - @Persisted(primaryKey: true) var _id: ObjectId - @Persisted var name: String - @Persisted var age: Int - } - - try realm.write { - // This will create the object on the server but not locally. - realm.create(PersonObject.self, value: ["_id": ObjectId.generate(), - "name": "Dylan", - "age": 20]) - } -``` -* Add ability to section a collection which conforms to `RealmCollection`, `RLMCollection`. - Collections can be sectioned by a unique key retrieved from a keyPath or a callback and will return an instance of `SectionedResults`/`RLMSectionedResults`. - Each section in the collection will be an instance of `ResultsSection`/`RLMSection` which gives access to the elements corresponding to the section key. - `SectionedResults`/`RLMSectionedResults` and `ResultsSection`/`RLMSection` have the ability to be observed. - ```swift - class DemoObject: Object { - @Persisted var title: String - @Persisted var date: Date - var firstLetter: String { - return title.first.map(String.init(_:)) ?? "" - } - } - var sectionedResults: SectionedResults - // ... - sectionedResults = realm.objects(DemoObject.self) - .sectioned(by: \.firstLetter, ascending: true) - ``` -* Add `@ObservedSectionedResults` for SwiftUI support. This property wrapper type retrieves sectioned results - from a Realm using a keyPath or callback to determine the section key. - ```swift - struct DemoView: View { - @ObservedSectionedResults(DemoObject.self, - sectionKeyPath: \.firstLetter) var demoObjects - - var body: some View { - VStack { - List { - ForEach(demoObjects) { section in - Section(header: Text(section.key)) { - ForEach(section) { object in - MyRowView(object: object) - } - } - } - } - } - } - } - ``` -* Add automatic handing for changing top-level objects to embedded objects in - migrations. Any objects of the now-embedded type which have zero incoming - links are deleted, and objects with multiple incoming links are duplicated. - This happens after the migration callback function completes, so there is no - functional change if you already have migration logic which correctly handles - this. ([Core #5737](https://github.com/realm/realm-core/pull/5737)). -* Improve performance when a new Realm file connects to the server for the - first time, especially when significant amounts of data has been written - while offline. ([Core #5772](https://github.com/realm/realm-core/pull/5772)) -* Shift more of the work done on the sync worker thread out of the write - transaction used to apply server changes, reducing how long it blocks other - threads from writing. ([Core #5772](https://github.com/realm/realm-core/pull/5772)) -* Improve the performance of the sync changeset parser, which speeds up - applying changesets from the server. ([Core #5772](https://github.com/realm/realm-core/pull/5772)) - -### Fixed - -* Fix all of the UBSan failures hit by our tests. It is unclear if any of these - manifested as visible bugs. ([Core #5665](https://github.com/realm/realm-core/pull/5665)) -* Upload completion callbacks were sometimes called before the final step of - interally marking the upload as complete, which could result in calling - `Realm.writeCopy()` from the completion callback failing due to there being - unuploaded changes. ([Core #4865](https://github.com/realm/realm-core/issues/4865)). -* Writing to a Realm stored on an exFAT drive threw the exception "fcntl() with - F_BARRIERFSYNC failed: Inappropriate ioctl for device" when a write - transaction needed to expand the file. - ([Core #5789](https://github.com/realm/realm-core/issues/5789), since 10.27.0) -* Syncing a Decimal128 with big significand could result in a crash. - ([Core #5728](https://github.com/realm/realm-core/issues/5728)) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 RC. - -### Internal - -* Upgraded realm-core from 12.5.1 to 12.6.0 - -10.28.7 Release notes (2022-09-02) -============================================================= - -### Enhancements - -* Add prebuilt binaries for Xcode 14 to the release package. - -### Fixed - -* Fix archiving watchOS release builds with Xcode 14. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 6. - -10.28.6 Release notes (2022-08-19) -============================================================= - -### Fixed - -* Fixed an issue where having realm-swift as SPM sub-target dependency leads to - missing symbols error during iOS archiving ([Core #7645](https://github.com/realm/realm-core/pull/7645)). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 5. - -### Internal - -* Upgraded realm-core from 12.5.0 to 12.5.1 - -10.28.5 Release notes (2022-08-09) -============================================================= - -### Enhancements - -* Improve performance of accessing `SubscriptionSet` properties when no writes - have been made to the Realm since the last access. - -### Fixed - -* A use-after-free could occur if a Realm with audit events enabled was - destroyed while processing an upload completion for the events Realm on a - different thread. ([Core PR #5714](https://github.com/realm/realm-core/pull/5714)) -* Opening a read-only synchronized Realm for the first time via asyncOpen did - not set the schema version, which could lead to `m_schema_version != - ObjectStore::NotVersioned` assertion failures later on. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 4. - -### Internal - -* Upgraded realm-core from 12.4.0 to 12.5.0 - -10.28.4 Release notes (2022-08-03) -============================================================= - -### Enhancements - -* Add support for building arm64 watchOS when installing Realm via CocoaPods. -* Reduce the amount of virtual address space used - ([Core #5645](https://github.com/realm/realm-core/pull/5645)). - -### Fixed - -* Fix some warnings when building with Xcode 14 - ([Core #5577](https://github.com/realm/realm-core/pull/5577)). -* Fix compilation failures on watchOS platforms which do not support thread-local storage. - ([#7694](https://github.com/realm/realm-swift/issues/7694), [#7695](https://github.com/realm/realm-swift/issues/7695) since v10.21.1) -* Fix a data race when committing a transaction while multiple threads are - waiting to begin write transactions. This appears to not have caused any - functional problems. -* Fix a data race when writing audit events which could occur if the sync - client thread was busy with other work when the event Realm was opened. -* Fix some cases of running out of virtual address space (seen/reported as mmap - failures) ([Core #5645](https://github.com/realm/realm-core/pull/5645)). -* Audit event scopes containing only write events and no read events would - occasionally throw a `BadVersion` exception when a write transaction was - committed (since v10.26.0). -* The client reset callbacks for the DiscardLocal mode would be passed invalid - Realm instances if the callback was invoked at a point where the Realm was - not otherwise open. ([Core #5654](https://github.com/realm/realm-core/pull/5654), since the introduction of DiscardLocal reset mode in v10.25.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 4. - -### Internal - -* Upgraded realm-core from 12.3.0 to 12.4.0. - -10.28.3 Release notes (2022-07-27) -============================================================= - -### Enhancements - -* Greatly improve the performance of obtaining cached Realm instances in Swift - when using a sync configuration. - -### Fixed - -* Add missing `initialSubscription` and `rerunOnOpen` to copyWithZone method on - `RLMRealmConfiguration`. This resulted in incorrect values when using - `RLMRealmConfiguration.defaultConfiguration`. -* The sync error handler did not hold a strong reference to the sync session - while dispatching the error from the worker thread to the main thread, - resulting in the session passed to the error handler being invalid if there - were no other remaining strong references elsewhere. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 3. - -10.28.2 Release notes (2022-06-30) -============================================================= - -### Fixed - -* Using `seedFilePath` threw an exception if the Realm file being opened - already existed ([#7840](https://github.com/realm/realm-swift/issues/7840), - since v10.26.0). -* The `intialSubscriptions` callback was invoked every time a Realm was opened - regardless of the value of `rerunOnOpen` and if the Realm was already open on - another thread (since v10.28.0). -* Allow using `RLMSupport.Swift` from RealmSwift's Cocoapods - ([#6886](https://github.com/realm/realm-swift/pull/6886)). -* Fix a UBSan failure when mapping encrypted pages. Fixing this did not change - the resulting assembly, so there were probably no functional problems - resulting from this (since v5.0.0). -* Improved performance of sync clients during integration of changesets with - many small strings (totalling > 1024 bytes per changeset) on iOS 14, and - devices which have restrictive or fragmented memory. - ([Core #5614](https://github.com/realm/realm-core/issues/5614)) -* Fix a data race when opening a flexible sync Realm (since v10.28.0). -* Add a missing backlink removal when assigning null or a non-link value to an - `AnyRealmValue` property which previously linked to an object. - This could have resulted in "key not found" exceptions or assertion failures - such as `mixed.hpp:165: [realm-core-12.1.0] Assertion failed: m_type` when - removing the destination link object. - ([Core #5574](https://github.com/realm/realm-core/pull/5573), since the introduction of AnyRealmValue in v10.8.0) - -### Compatibility - -* Realm Studio: 12.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 2. - -### Internal - -* Upgraded realm-core from 12.1.0 to 12.3.0. - -10.28.1 Release notes (2022-06-10) -============================================================= - -### Enhancements - -* Add support for Xcode 14. When building with Xcode 14, the minimum deployment - target is now iOS 11. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 1. - -10.28.0 Release notes (2022-06-03) -============================================================= - -### Enhancements - -* Replace mentions of 'MongoDB Realm' with 'Atlas App Services' in the documentation and update appropriate links to documentation. -* Allow adding a subscription querying for all documents of a type in swift for flexible sync. -``` - try await subscriptions.update { - subscriptions.append(QuerySubscription(name: "all_people")) - } -``` -* Add Combine API support for flexible sync beta. -* Add an `initialSubscriptions` parameter when retrieving the flexible sync configuration from a user, - which allows to specify a subscription update block, to bootstrap a set of flexible sync subscriptions - when the Realm is first opened. - There is an additional optional parameter flag `rerunOnOpen`, which allows to run this initial - subscriptions on every app startup. - -```swift - let config = user.flexibleSyncConfiguration(initialSubscriptions: { subs in - subs.append(QuerySubscription(name: "people_10") { - $0.age > 10 - }) - }, rerunOnOpen: true) - let realm = try Realm(configuration: config) -``` -* The sync client error handler will report an error, with detailed info about which object caused it, when writing an object to a flexible sync Realm outside of any query subscription. ([#5528](https://github.com/realm/realm-core/pull/5528)) -* Adding an object to a flexible sync Realm for a type that is not within a query subscription will now throw an exception. ([#5488](https://github.com/realm/realm-core/pull/5488)). - -### Fixed - -* Flexible Sync query subscriptions will correctly complete when data is synced to the local Realm. ([#5553](https://github.com/realm/realm-core/pull/5553), since v12.0.0) - -### Breaking Changes - -* Rename `SyncSubscriptionSet.write` to `SyncSubscriptionSet.update` to avoid confusion with `Realm.write`. -* Rename `SyncSubscription.update` to `SyncSubscription.updateQuery` to avoid confusion with `SyncSubscriptionSet.update`. -* Rename `RLMSyncSubscriptionSet.write` to `RLMSyncSubscriptionSet.update` to align it with swift API. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-13.4. - -### Internal - -* Upgraded realm-core from 12.0.0 to 12.1.0. - -10.27.0 Release notes (2022-05-26) -============================================================= - -### Enhancements - -* `@AsyncOpen`/`@AutoOpen` property wrappers can be used with flexible sync. - -### Fixed - -* When installing via SPM, debug builds could potentially hit an assertion - failure during flexible sync bootstrapping. ([Core #5527](https://github.com/realm/realm-core/pull/5527)) -* Flexible sync now only applies bootstrap data if the entire bootstrap is - received. Previously orphaned objects could result from the read snapshot on - the server changing. ([Core #5331](https://github.com/realm/realm-core/pull/5331)) -* Partially fix a performance regression in write performance introduced in - v10.21.1. v10.21.1 fixed a case where a kernel panic or device's battery - dying at the wrong point in a write transaction could potentially result in a - corrected Realm file, but at the cost of a severe performance hit. This - version adjusts how file synchronization is done to provide the same safety - at a much smaller performance hit. ([#7740](https://github.com/realm/realm-swift/issues/7740)). - -### Compatibility - -* Realm Studio: 11.0.0 or later (but see note below). -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-13.4. - -### Internal - -* Upgraded realm-core from 11.17.0 to 12.0.0. -* Bump the version number for the lockfile used for interprocess - synchronization. This has no effect on persistent data, but means that - versions of Realm which use pre-12.0.0 realm-core cannot open Realm files at - the same time as they are opened by this version. Notably this includes Realm - Studio, and v11.1.2 (the latest at the time of this release) cannot open - Realm files which are simultaneously open in the simulator. - -10.26.0 Release notes (2022-05-19) -============================================================= - -Xcode 13.1 is now the minimum supported version of Xcode, as Apple no longer -allows submitting to the app store with Xcode 12. - -### Enhancements - -* Add Xcode 13.4 binaries to the release package. -* Add Swift API for asynchronous transactions -```swift - try? realm.writeAsync { - realm.create(SwiftStringObject.self, value: ["string"]) - } onComplete: { error in - // optional handling on write complete - } - - try? realm.beginAsyncWrite { - realm.create(SwiftStringObject.self, value: ["string"]) - realm.commitAsyncWrite() - } - - let asyncTransactionId = try? realm.beginAsyncWrite { - // ... - } - try! realm.cancelAsyncWrite(asyncTransactionId) -``` -* Add Obj-C API for asynchronous transactions -``` - [realm asyncTransactionWithBlock:^{ - [StringObject createInRealm:realm withValue:@[@"string"]]; - } onComplete:^(NSError *error) { - // optional handling - }]; - - [realm beginAsyncWriteTransaction:^{ - [StringObject createInRealm:realm withValue:@[@"string"]]; - [realm commitAsyncWriteTransaction]; - }]; - - RLMAsyncTransactionId asyncTransactionId = [realm beginAsyncWriteTransaction:^{ - // ... - }]; - [realm cancelAsyncTransaction:asyncTransactionId]; -``` -* Improve performance of opening a Realm with `objectClasses`/`objectTypes` set - in the configuration. -* Implement the Realm event recording API for reporting reads and writes on a - Realm file to Atlas. - -### Fixed - -* Lower minimum OS version for `async` login and FunctionCallables to match the - rest of the `async` functions. ([#7791]https://github.com/realm/realm-swift/issues/7791) -* Consuming a RealmSwift XCFramework with library evolution enabled would give the error - `'Failed to build module 'RealmSwift'; this SDK is not supported by the compiler'` - when the XCFramework was built with an older XCode version and is - then consumed with a later version. ([#7313](https://github.com/realm/realm-swift/issues/7313), since v3.18.0) -* A data race would occur when opening a synchronized Realm with the client - reset mode set to `discardLocal` on one thread at the same time as a client - reset was being processed on another thread. This probably did not cause any - functional problems in practice and the broken timing window was very tight (since 10.25.0). -* If an async open of a Realm triggered a client reset, the callbacks for - `discardLocal` could theoretically fail to be called due to a race condition. - The timing for this was probably not possible to hit in practice (since 10.25.0). -* Calling `[RLMRealm freeze]`/`Realm.freeze` on a Realm which had been created from `writeCopy` - would not produce a frozen Realm. ([#7697](https://github.com/realm/realm-swift/issues/7697), since v5.0.0) -* Using the dynamic subscript API on unmanaged objects before first opening a - Realm or if `objectTypes` was set when opening a Realm would throw an - exception ([#7786](https://github.com/realm/realm-swift/issues/7786)). -* The sync client may have sent a corrupted upload cursor leading to a fatal - error from the server due to an uninitialized variable. - ([#5460](https://github.com/realm/realm-core/pull/5460), since v10.25.1) -* Flexible sync would not correctly resume syncing if a bootstrap was interrupted - ([#5466](https://github.com/realm/realm-core/pull/5466), since v10.21.1). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-13.4. - -### Internal - -* Upgraded realm-core from v11.15.0 to v11.17.0 - -10.25.2 Release notes (2022-04-27) -============================================================= - -### Enhancements - -* Replace Xcode 13.3 binaries with 13.3.1 binaries. - -### Fixed - -* `List` would contain an invalidated object instead of null when - the object linked to was deleted by a difference sync client - ([Core #5215](https://github.com/realm/realm-core/pull/5215), since v10.8.0). -* Adding an object to a Set, deleting the parent object of the Set, and then - deleting the object which was added to the Set would crash - ([Core #5387](https://github.com/realm/realm-core/issues/5387), since v10.8.0). -* Synchronized Realm files which were first created using v10.0.0-beta.3 would - be redownloaded instead of using the existing file, possibly resulting in the - loss of any unsynchronized data in those files (since v10.20.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3.1. - -### Internal - -* Upgraded realm-core from v11.14.0 to v11.15.0 - -10.25.1 Release notes (2022-04-11) -============================================================= - -### Fixed - -* Fixed various memory corruption bugs when encryption is used caused by not - locking a mutex when needed. - ([#7640](https://github.com/realm/realm-swift/issues/7640), [#7659](https://github.com/realm/realm-swift/issues/7659), since v10.21.1) -* Changeset upload batching did not calculate the accumulated size correctly, - resulting in “error reading body failed to read: read limited at 16777217 - bytes” errors from the server when writing large amounts of data - ([Core #5373](https://github.com/realm/realm-core/pull/5373), since 10.25.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3. - -### Internal - -* Upgraded realm-core from v11.13.0 to v11.14.0. - -10.25.0 Release notes (2022-03-29) -============================================================= - -Synchronized Realm files written by this version cannot be opened by older -versions of Realm. Existing files will be automatically upgraded when opened. - -Non-synchronized Realm files remain backwards-compatible. - -### Enhancements - -* Add ability to use Swift Query syntax in `@ObservedResults`, which allows you - to filter results using the `where` parameter. -* Add ability to use `MutableSet` with `StateRealmObject` in SwiftUI. -* Async/Await extensions are now compatible with iOS 13 and above when building - with Xcode 13.3. -* Sync changesets waiting to be uploaded to the server are now compressed, - reducing the disk space needed when large write transactions are performed - while offline or limited in bandwidth.([Core #5260](https://github.com/realm/realm-core/pull/5260)). -* Added new `SyncConfiguration.clientResetMode` and `RLMSyncConfiguration.clientResetMode` properties. - - The values of these properties will dictate client behavior in the event of a [client reset](https://docs.mongodb.com/realm/sync/error-handling/client-resets/). - - See below for information on `ClientResetMode` values. - - `clientResetMode` defaults to `.manual` if not set otherwise. -* Added new `ClientResetMode` and `RLMClientResetMode` enums. - - These enums represent possible client reset behavior for `SyncConfiguration.clientResetMode` and `RLMSyncConfiguration.clientResetMode`, respectively. - - `.manual` and `RLMClientResetModeManual` - - The local copy of the Realm is copied into a recovery - directory for safekeeping, and then deleted from the original location. The next time - the Realm for that partition value is opened, the Realm will automatically be re-downloaded from - MongoDB Realm, and can be used as normal. - - Data written to the Realm after the local copy of the Realm diverged from the backup - remote copy will be present in the local recovery copy of the Realm file. The - re-downloaded Realm will initially contain only the data present at the time the Realm - was backed up on the server. - - `rlmSync_clientResetBackedUpRealmPath` and `SyncError.clientResetInfo()` are used for accessing the recovery directory. - - `.discardLocal` and `RLMClientResetDiscardLocal` - - All unsynchronized local changes are automatically discarded and the local state is - automatically reverted to the most recent state from the server. Unsynchronized changes - can then be recovered in a post-client-reset callback block (See changelog below for more details). - - If RLMClientResetModeDiscardLocal is enabled but the client reset operation is unable to complete - then the client reset process reverts to manual mode. - - The realm's underlying object accessors remain bound so the UI may be updated in a non-disruptive way. -* Added support for client reset notification blocks for `.discardLocal` and `RLMClientResetDiscardLocal` - - **RealmSwift implementation**: `discardLocal(((Realm) -> Void)? = nil, ((Realm, Realm) -> Void)? = nil)` - - RealmSwift client reset blocks are set when initializing the user configuration - ```swift - var configuration = user.configuration(partitionValue: "myPartition", clientResetMode: .discardLocal(beforeClientResetBlock, afterClientResetBlock)) - ``` - - The before client reset block -- `((Realm) -> Void)? = nil` -- is executed prior to a client reset. Possible usage includes: - ```swift - let beforeClientResetBlock: (Realm) -> Void = { beforeRealm in - var recoveryConfig = Realm.Configuration() - recoveryConfig.fileURL = myRecoveryPath - do { - beforeRealm.writeCopy(configuration: recoveryConfig) - /* The copied realm could be used later for recovery, debugging, reporting, etc. */ - } catch { - /* handle error */ - } - } - ``` - - The after client reset block -- `((Realm, Realm) -> Void)? = nil)` -- is executed after a client reset. Possible usage includes: - ```Swift - let afterClientResetBlock: (Realm, Realm) -> Void = { before, after in - /* This block could be used to add custom recovery logic, back-up a realm file, send reporting, etc. */ - for object in before.objects(myClass.self) { - let res = after.objects(myClass.self) - if (res.filter("primaryKey == %@", object.primaryKey).first != nil) { - /* ...custom recovery logic... */ - } else { - /* ...custom recovery logic... */ - } - } - ``` - - **Realm Obj-c implementation**: Both before and after client reset callbacks exist as properties on `RLMSyncConfiguration` and are set at initialization. - ```objective-c - RLMRealmConfiguration *config = [user configurationWithPartitionValue:partitionValue - clientResetMode:RLMClientResetModeDiscardLocal - notifyBeforeReset:beforeBlock - notifyAfterReset:afterBlock]; - ``` - where `beforeBlock` is of type `RLMClientResetBeforeBlock`. And `afterBlock` is of type `RLMClientResetAfterBlock`. - -### Breaking Changes - -* Xcode 13.2 is no longer supported when building with Async/Await functions. Use - Xcode 13.3 to build with Async/Await functionality. - -### Fixed - -* Adding a Realm Object to a `ObservedResults` or a collections using - `StateRealmObject` that is managed by the same Realm would throw if the - Object was frozen and not thawed before hand. -* Setting a Realm Configuration for @ObservedResults using it's initializer - would be overrode by the Realm Configuration stored in - `.environment(\.realmConfiguration, ...)` if they did not match - ([Cocoa #7463](https://github.com/realm/realm-swift/issues/7463), since v10.6.0). -* Fix searchable component filter overriding the initial filter on `@ObservedResults`, (since v10.23.0). -* Comparing `Results`, `LinkingObjects` or `AnyRealmCollection` when using Realm via XCFramework - would result in compile time errors ([Cocoa #7615](https://github.com/realm/realm-swift/issues/7615), since v10.21.0) -* Opening an encrypted Realm while the keychain is locked on macOS would crash - ([#7438](https://github.com/realm/realm-swift/issues/7438)). -* Updating subscriptions while refreshing the access token would crash - ([Core #5343](https://github.com/realm/realm-core/issues/5343), since v10.22.0) -* Fix several race conditions in `SyncSession` related to setting - `customRequestHeaders` while using the `SyncSession` on a different thread. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3. - -### Internal - -* Upgraded realm-core from v11.12.0 to v11.13.0 - -10.24.2 Release notes (2022-03-18) -============================================================= - -### Fixed - -* Application would sometimes crash with exceptions like 'KeyNotFound' or - assertion "has_refs()". Other issues indicating file corruption may also be - fixed by this. The one mentioned here is the one that lead to solving the - problem. - ([Core #5283](https://github.com/realm/realm-core/issues/5283), since v5.0.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3. - -### Internal - -* Upgraded realm-core from 11.11.0 to 11.12.0 - -10.24.1 Release notes (2022-03-14) -============================================================= - -Switch to building the Carthage binary with Xcode 13.3. This release contains -no functional changes from 10.24.0. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3. - -10.24.0 Release notes (2022-03-05) -============================================================= - -### Enhancements - -* Add ability to use Swift Query syntax in `@ObservedResults`, which allows you - to filter results using the `where` parameter. - -### Fixed - -* If a list of objects contains links to objects not included in the - synchronized partition, collection change notifications for that list could - be incorrect ([Core #5164](https://github.com/realm/realm-core/issues/5164), since v10.0.0). -* Adding a new flexible sync subscription could crash with - "Assertion failed: !m_unbind_message_sent" in very specific timing scenarios - ([Core #5149](https://github.com/realm/realm-core/pull/5149), since v10.22.0). -* Converting floats/doubles into Decimal128 would yield imprecise results - ([Core #5184](https://github.com/realm/realm-core/pull/5184), since v10.0.0) -* Using accented characters in class and field names in a synchronized Realm - could result in sync errors ([Core #5196](https://github.com/realm/realm-core/pull/5196), since v10.0.0). -* Calling `Realm.invalidate()` from inside a Realm change notification could - result in the write transaction which produced the notification not being - persisted to disk (since v10.22.0). -* When a client reset error which results in the current Realm file being - backed up and then deleted, deletion errors were ignored as long as the copy - succeeded. When this happens the deletion of the old file is now scheduled - for the next launch of the app. ([Core #5180](https://github.com/realm/realm-core/issues/5180), since v2.0.0) -* Fix an error when compiling a watchOS Simulator target not supporting - Thread-local storage ([#7623](https://github.com/realm/realm-swift/issues/7623), since v10.21.0). -* Add a validation check to report a sensible error if a Realm configuration - indicates that an in-memory Realm should be encrypted. ([Core #5195](https://github.com/realm/realm-core/issues/5195)) -* The Swift package set the linker flags on the wrong target, resulting in - linker errors when SPM decides to build the core library as a dynamic library - ([#7266](https://github.com/realm/realm-swift/issues/7266)). -* The download-core task failed if run in an environment without TMPDIR set - ([#7688](https://github.com/realm/realm-swift/issues/7688), since v10.23.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3 beta 3. - -### Internal - -* Upgraded realm-core from 11.9.0 to 11.11.0 - -10.23.0 Release notes (2022-02-28) -============================================================= - -### Enhancements - -* Add `Realm.writeCopy(configuration:)`/`[RLMRealm writeCopyForConfiguration:]` which gives the - following functionality: - - Export a local non-sync Realm to be used with MongoDB Realm Sync - when the configuration is derived from a sync `RLMUser`/`User`. - - Write a copy of a local Realm to a destination specified in the configuration. - - Write a copy of a synced Realm in use with user A, and open it with user B. - - Note that migrations may be required when using a local realm configuration to open a realm file that - was copied from a synchronized realm. - - An exception will be thrown if a Realm exists at the destination. -* Add a `seedFilePath` option to `RLMRealmConfiguration` and `Configuration`. If this - option is set then instead of creating an empty Realm, the realm at the `seedFilePath` will - be copied to the `fileURL` of the new Realm. If a Realm file already exists at the - desitnation path, the seed file will not be copied and the already existing Realm - will be opened instead. Note that to use this parameter with a synced Realm configuration - the seed Realm must be appropriately copied to a destination with - `Realm.writeCopy(configuration:)`/`[RLMRealm writeCopyForConfiguration:]` first. -* Add ability to permanently delete a User from a MongoDB Realm app. This can - be invoked with `User.delete()`/`[RLMUser deleteWithCompletion:]`. -* Add `NSCopying` conformance to `RLMDecimal128` and `RLMObjectId`. -* Add Xcode 13.3 binaries to the release package (and remove 13.0). - -### Fixed - -* Add support of arm64 in Carthage build ([#7154](https://github.com/realm/realm-cocoa/issues/7154) -* Adding missing support for `IN` queries to primitives types on Type Safe Queries. - ```swift - let persons = realm.objects(Person.self).where { - let acceptableNames = ["Tom", "James", "Tyler"] - $0.name.in([acceptableNames]) - } - ``` - ([Cocoa #7633](https://github.com/realm/realm-swift/issues/7633), since v10.19.0) -* Work around a compiler crash when building with Swift 5.6 / Xcode 13.3. - CustomPersistable's PersistedType must now always be a built-in type rather - than possibly another CustomPersistable type as Swift 5.6 has removed support - for infinitely-recursive associated types ([#7654](https://github.com/realm/realm-swift/issues/7654)). -* Fix redundant call to filter on `@ObservedResults` from `searchable` - component (since v10.19.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3 beta 3. - -10.22.0 Release notes (2022-01-25) -============================================================= - -### Enhancements - -* Add beta support for flexible sync. See the [backend](https://docs.mongodb.com/realm/sync/data-access-patterns/flexible-sync/) and [SDK](https://docs.mongodb.com/realm/sdk/swift/examples/flexible-sync/) documentation for more information. Please report any issues with the beta through Github. - -### Fixed - -* UserIdentity metadata table grows indefinitely. ([#5152](https://github.com/realm/realm-core/issues/5152), since v10.20.0) -* We now report a useful error message when opening a sync Realm in non-sync mode or vice-versa.([#5161](https://github.com/realm/realm-core/pull/5161), since v5.0.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.2.1. - -### Internal - -* Upgraded realm-core from 11.8.0 to 11.9.0 - -10.21.1 Release notes (2022-01-12) -============================================================= - -### Fixed - -* The sync client will now drain the receive queue when a send fails with - ECONNRESET, ensuring that any error message from the server gets received and - processed. ([#5078](https://github.com/realm/realm-core/pull/5078)) -* Schema validation was missing for embedded objects in sets, resulting in an - unhelpful error being thrown if a Realm object subclass contained one (since v10.0.0). -* Opening a Realm with a schema that has an orphaned embedded object type - performed an extra empty write transaction (since v10.0.0). -* Freezing a Realm with a schema that has orphaned embedded object types threw - a "Wrong transactional state" exception (since v10.19.0). -* `@sum` and `@avg` queries on Dictionaries of floats or doubles used too much - precision for intermediates, resulting in incorrect rounding (since v10.5.0). -* Change the exception message for calling refresh on an immutable Realm from - "Continuous transaction through DB object without history information." to - "Can't refresh a read-only Realm." - ([#5061](https://github.com/realm/realm-core/issues/5061), since v10.8.0). -* Queries of the form "link.collection.@sum = 0" where `link` is null matched - when `collection` was a List or Set, but not a Dictionary - ([#5080](https://github.com/realm/realm-core/pull/5080), since v10.8.0). -* Types which require custom obj-c bridging (such as `PersistableEnum` or - `CustomPersistable`) would crash with exceptions mentioning `__SwiftValue` in - a variety of places on iOS versions older than iOS 14 - ([#7604](https://github.com/realm/realm-swift/issues/7604), since v10.21.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.2.1. - -### Internal - -* Upgraded realm-core from 11.6.1 to 11.8.0. - -10.21.0 Release notes (2022-01-10) -============================================================= - -### Enhancements - -* Add `metadata` property to `RLMUserProfile`/`UserProfile`. -* Add class `Projection` to allow creation of light weight view models out of Realm Objects. -```swift -public class Person: Object { - @Persisted var firstName = "" - @Persisted var lastName = "" - @Persisted var address: Address? = nil - @Persisted var friends = List() -} - -public class Address: EmbeddedObject { - @Persisted var city: String = "" - @Persisted var country = "" -} - -class PersonProjection: Projection { - // `Person.firstName` will have same name and type - @Projected(\Person.firstName) var firstName - // There will be the only String for `city` of the original object `Address` - @Projected(\Person.address.city) var homeCity - // List will be mapped to list of firstNames - @Projected(\Person.friends.projectTo.firstName) var firstFriendsName: ProjectedCollection -} - -// `people` will contain projections for every `Person` object in the `realm` -let people: Results = realm.objects(PersonProjection.self) -``` -* Greatly improve performance of reading AnyRealmValue and enum types from - Realm collections. -* Allow using Swift enums which conform to `PersistableEnum` as the value type - for all Realm collections. -* `AnyRealmCollection` now conforms to `Encodable`. -* AnyRealmValue and PersistableEnum values can now be passed directly to an - NSPredicate used in a filter() call rather than having to pass the rawValue - (the rawValue is still allowed). -* Queries on collections of PersistableEnums can now be performed with `where()`. -* Add support for querying on the rawValue of an enum with `where()`. -* `.count` is supported for Maps of all types rather than just numeric types in `where()`. -* Add support for querying on the properties of objects contained in - dictionaries (e.g. "dictProperty.@allValues.name CONTAINS 'a'"). -* Improve the error message for many types of invalid predicates in queries. -* Add support for comparing `@allKeys` to another property on the same object. -* Add `Numeric` conformance to `Decimal128`. -* Make some invalid property declarations such as `List` a - compile-time error instead of a runtime error. -* Calling `.sorted(byKeyPath:)` on a collection with an Element type which does - not support sorting by keypaths is now a compile-time error instead of a - runtime error. -* `RealmCollection.sorted(ascending:)` can now be called on all - non-Object/EmbeddedObject collections rather than only ones where the - `Element` conforms to `Comparable`. -* Add support for using user-defined types with `@Persistable` and in Realm - collections by defining a mapping to and from a type which Realm knows how to - store. For example, `URL` can be made persistable with: - ```swift - extension URL: FailableCustomPersistable { - // Store URL values as a String in Realm - public typealias PersistedType = String - // Convert a String to a URL - public init?(persistedValue: String) { self.init(string: persistedValue) } - // Convert a URL to a String - public var persistableValue: String { self.absoluteString } - } - ``` - After doing this, `@Persisted var url: URL` is a valid property declaration - on a Realm object. More advanced mappings can be done by mapping to an - EmbeddedObject which can store multiple values. - -### Fixed - -* Accessing a non object collection inside a migration would cause a crash -* [#5633](https://github.com/realm/realm-cocoa/issues/5633). -* Accessing a `Map` of objects dynamically would not handle nulled values correctly (since v10.8.0). -* `where()` allowed constructing some nonsensical queries due to boolean - comparisons returning `Query` rather than `Query` (since v10.19.0). -* `@allValues` queries on dictionaries accidentally did not require "ANY". -* Case-insensitive and diacritic-insensitive modifiers were ignored when - comparing the result of an aggregate operation to another property in a - query. -* `Object.init(value:)` did not allow initializing `RLMDictionary`/`Map` - properties with null values for map entries (since v10.8.0). -* `@ObservedResults` did not refresh when changes were made to the observed - collection. (since v10.6.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.2.1. - -10.20.1 Release notes (2021-12-14) -============================================================= - -Xcode 12.4 is now the minimum supported version of Xcode. - -### Fixed - -* Add missing `Indexable` support for UUID. - ([Cocoa #7545](https://github.com/realm/realm-swift/issues/7545), since v10.10.0) - -### Breaking Changes - -* All `async` functions now require Xcode 13.2 to work around an App - Store/TestFlight bug that results in apps built with 13.0/13.1 which do not - use libConcurrency but link a library which does crashing on startup. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.2. - -10.20.0 Release notes (2021-11-16) -============================================================= - -### Enhancements - -* Conform `@ThreadSafe` and `ThreadSafeReference` to `Sendable`. -* Allow using Swift enums which conform to `PersistableEnum` as the value type - for all Realm collections. -* `AnyRealmCollection` now conforms to `Encodable`. -* Greatly improve performance of reading AnyRealmValue and enum types from - Realm collections. -* `AnyRealmCollection` now conforms to `Encodable`. - -### Fixed - -* `@AutoOpen` will open the existing local Realm file on any connection error - rather than only when the connection specifically times out. -* Do not allow `progress` state changes for `@AutoOpen` and `@AsyncOpen` after - changing state to `open(let realm)` or `error(let error)`. -* Logging out a sync user failed to remove the local Realm file for partitions - with very long partition values that would have exceeded the maximum path - length. ([Core #4187](https://github.com/realm/realm-core/issues/4187), since v10.0.0) -* Don't keep trying to refresh the access token if the client's clock is more - than 30 minutes fast. ([Core #4941](https://github.com/realm/realm-core/issues/4941)) -* Failed auth requests used a fixed long sleep rather than exponential backoff - like other sync requests, which could result in very delayed reconnects after - a device was offline long enough for the access token to expire (since v10.0.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.1. - -### Internal - -* Upgraded realm-core from 11.6.0 to 11.6.1. - -10.19.0 Release notes (2021-11-04) -============================================================= - -### Enhancements - -* Add `.searchable()` SwiftUI View Modifier which allows filtering - `@ObservedResult` results from a search field component by a key path. - ```swift - List { - ForEach(reminders) { reminder in - ReminderRowView(reminder: reminder) - } - }.searchable(text: $searchFilter, - collection: $reminders, - keyPath: \.name) { - ForEach(reminders) { remindersFiltered in - Text(remindersFiltered.name).searchCompletion(remindersFiltered.name) - } - } - ``` -* Add an API for a type safe query syntax. This allows you to filter a Realm - and collections managed by a Realm with Swift style expressions. Here is a - brief example: - ```swift - class Person: Object { - @Persisted var name: String - @Persisted var hobbies: MutableSet - @Persisted var pets: List - } - class Pet: Object { - @Persisted var name: String - @Persisted var age: Int - } - - let persons = realm.objects(Person.self).where { - $0.hobbies.contains("music") || $0.hobbies.contains("baseball") - } - - persons = realm.objects(Person.self).where { - ($0.pets.age >= 2) && $0.pets.name.starts(with: "L") - } - ``` - ([#7419](https://github.com/realm/realm-swift/pull/7419)) -* Add support for dictionary subscript expressions - (e.g. `"phoneNumbers['Jane'] == '123-3456-123'"`) when querying with an - NSPredicate. -* Add UserProfile to User. This contains metadata from social logins with MongoDB Realm. -* Slightly reduce the peak memory usage when processing sync changesets. - -### Fixed - -* Change default request timeout for `RLMApp` from 6 seconds to 60 seconds. -* Async `Realm` init would often give a Realm instance which could not actually - be used and would throw incorrect thread exceptions. It now is `@MainActor` - and gives a Realm instance which always works on the main actor. The - non-functional `queue:` parameter has been removed (since v10.15.0). -* Restore the pre-v10.12.0 behavior of calling `writeCopy()` on a synchronized - Realm which produced a local non-synchronized Realm - ([#7513](https://github.com/realm/realm-swift/issues/7513)). -* Decimal128 did not properly normalize the value before hashing and so could - have multiple values which are equal but had different hash values (since v10.8.0). -* Fix a rare assertion failure or deadlock when a sync session is racing to - close at the same time that external reference to the Realm is being - released. ([Core #4931](https://github.com/realm/realm-core/issues/4931)) -* Fix a assertion failure when opening a sync Realm with a user who had been - removed. Instead an exception will be thrown. ([Core #4937](https://github.com/realm/realm-core/issues/4937), since v10.0.0) -* Fixed a rare segfault which could trigger if a user was being logged out - while the access token refresh response comes in. - ([Core #4944](https://github.com/realm/realm-core/issues/4944), since v10.0.0) -* Fixed a bug where progress notifiers on an AsyncOpenTask could be called - after the open completed. ([Core #4919](https://github.com/realm/realm-core/issues/4919)) -* SecureTransport was not enabled for macCatalyst builds when installing via - SPM, resulting in `'SSL/TLS protocol not supported'` exceptions when using - Realm Sync. ([#7474](https://github.com/realm/realm-swift/issues/7474)) -* Users were left in the logged in state when their refresh token expired. - ([Core #4882](https://github.com/realm/realm-core/issues/4882), since v10) -* Calling `.count` on a distinct collection would return the total number of - objects in the collection rather than the distinct count the first time it is - called. ([#7481](https://github.com/realm/realm-swift/issues/7481), since v10.8.0). -* `realm.delete(collection.distinct(...))` would delete all objects in the - collection rather than just the first object with each distinct value in the - property being distincted on, unless the distinct Results were read from at - least once first (since v10.8.0). -* Calling `.distinct()` on a collection, accessing the Results, then passing - the Results to `realm.delete()` would delete the correct objects, but - afterwards report a count of zero even if there were still objects in the - Results (since v10.8.0). -* Download compaction could result in non-streaming sync download notifiers - never reporting completion (since v10.0.0, - [Core #4989](https://github.com/realm/realm-core/pull/4989)). -* Fix a deadlock in SyncManager that was probably not possible to hit in - real-world code (since v10.0.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.2. - -### Internal - -* Upgraded realm-core from v11.4.1 to v11.6.0 - -10.18.0 Release notes (2021-10-25) -============================================================= - -### Enhancements - -* Add support for using multiple users with `@AsyncOpen` and `@AutoOpen`. - Setting the current user to a new user will now automatically reopen the - Realm with the new user. -* Add prebuilt binary for Xcode 13.1 to the release package. - -### Fixed - -* Fix `@AsyncOpen` and `@AutoOpen` using `defaultConfiguration` by default if - the user's doesn't provide one, will set an incorrect path which doesn't - correspond to the users configuration one. (since v10.12.0) -* Adding missing subscription completion for `AsyncOpenPublisher` after - successfully returning a realm. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.1. - -10.17.0 Release notes (2021-10-06) -============================================================= - -### Enhancements - -* Add a new `@ThreadSafe` property wrapper. Objects and collections wrapped by `@ThreadSafe` may be passed between threads. It's - intended to allow local variables and function parameters to be used across - threads when needed. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.0. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0. - -10.16.0 Release notes (2021-09-29) -============================================================= - -### Enhancements - -* Add `async` versions of `EmailPasswordAuth.callResetPasswordFunction` and -r `User.linkUser` methods. -* Add `async` version of `MongoCollection` methods. -* Add `async` support for user functions. - -### Fixed - -* A race condition in Realm.asyncOpen() sometimes resulted in subsequent writes - from Realm Sync failing to produce notifications - ([#7447](https://github.com/realm/realm-swift/issues/7447), - [#7453](https://github.com/realm/realm-swift/issues/7453), - [Core #4909](https://github.com/realm/realm-core/issues/4909), since v10.15.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.0. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0. - -10.15.1 Release notes (2021-09-15) -============================================================= - -### Enhancements - -* Switch to building the Carthage release with Xcode 13. - -### Fixed - -* Fix compilation error where Swift 5.5 is available but the macOS 12 SDK was - not. This was notable for the Xcode 13 RC. This fix adds a #canImport check - for the `_Concurrency` module that was not available before the macOS 12 SDK. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.0. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0. - -10.15.0 Release notes (2021-09-10) -============================================================= - -### Enhancements - -* Add `async` versions of the `Realm.asyncOpen` and `App.login` methods. -* ThreadSafeReference no longer pins the source transaction version for - anything other than a Results created by filtering a collection. This means - that holding on to thread-safe references to other things (such as Objects) - will no longer cause file size growth. -* A ThreadSafeReference to a Results backed by a collection can now be created - inside a write transaction as long as the collection was not created in the - current write transaction. -* Synchronized Realms are no longer opened twice, cutting the address space and - file descriptors used in half. - ([Core #4839](https://github.com/realm/realm-core/pull/4839)) -* When using the SwiftUI helper types (@ObservedRealmObject and friends) to - bind to an Equatable property, self-assignment no longer performs a pointless - write transaction. SwiftUI appears to sometimes call a Binding's set function - multiple times for a single UI action, so this results in significantly fewer - writes being performed. - -### Fixed - -* Adding an unmanaged object to a Realm that was declared with - `@StateRealmObject` would throw the exception `"Cannot add an object with - observers to a Realm"`. -* The `RealmCollectionChange` docs refered to indicies in modifications as the - 'new' collection. This is incorrect and the docs now state that modifications - refer to the previous version of the collection. ([Cocoa #7390](https://github.com/realm/realm-swift/issues/7390)) -* Fix crash in `RLMSyncConfiguration.initWithUser` error mapping when a user is disabled/deleted from MongoDB Realm dashboard. - ([Cocoa #7399](https://github.com/realm/realm-swift/issues/7399), since v10.0.0) -* If the application crashed at the wrong point when logging a user in, the - next run of the application could hit the assertion failure "m_state == - SyncUser::State::LoggedIn" when a synchronized Realm is opened with that - user. ([Core #4875](https://github.com/realm/realm-core/issues/4875), since v10.0.0) -* The `keyPaths:` parameter to `@ObservedResults` did not work (since v10.12.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 5. - -### Internal - -* Upgraded realm-core from 11.3.1 to 11.4.1 - -10.14.0 Release notes (2021-09-03) -============================================================= - -### Enhancements - -* Add additional `observe` methods for Objects and RealmCollections which take - a `PartialKeyPath` type key path parameter. -* The release package once again contains Xcode 13 binaries. -* `PersistableEnum` properties can now be indexed or used as the primary key if - the RawValue is an indexable or primary key type. - -### Fixed - -* `Map` did not conform to `Codable`. - ([Cocoa #7418](https://github.com/realm/realm-swift/pull/7418), since v10.8.0) -* Fixed "Invalid data type" assertion failure in the sync client when the - client recieved an AddColumn instruction from the server for an AnyRealmValue - property when that property already exists locally. ([Core #4873](https://github.com/realm/realm-core/issues/4873), since v10.8.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 5. - -### Internal - -* Upgraded realm-core from 11.3.0 to 11.3.1. - -10.13.0 Release notes (2021-08-26) -============================================================= - -### Enhancements - -* Sync logs now contain information about what object/changeset was being applied when the exception was thrown. - ([Core #4836](https://github.com/realm/realm-core/issues/4836)) -* Added ServiceErrorCode for wrong username/password when using '`App.login`. - ([Core #7380](https://github.com/realm/realm-swift/issues/7380) - -### Fixed - -* Fix crash in `MongoCollection.findOneDocument(filter:)` that occurred when no results were - found for a given filter. - ([Cocoa #7380](https://github.com/realm/realm-swift/issues/7380), since v10.0.0) -* Some of the SwiftUI property wrappers incorrectly required objects to conform - to ObjectKeyIdentifiable rather than Identifiable. - ([Cocoa #7372](https://github.com/realm/realm-swift/issues/7372), since v10.6.0) -* Work around Xcode 13 beta 3+ shipping a broken swiftinterface file for Combine on 32-bit iOS. - ([Cocoa #7368](https://github.com/realm/realm-swift/issues/7368)) -* Fixes history corruption when replacing an embedded object in a list. - ([Core #4845](https://github.com/realm/realm-core/issues/4845)), since v10.0.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 5. - -### Internal - -* Upgraded realm-core from 11.2.0 to 11.3.0 - -10.12.0 Release notes (2021-08-03) -============================================================= - -### Enhancements - -* `Object.observe()` and `RealmCollection.observe()` now include an optional - `keyPaths` parameter which filters change notifications to those only - occurring on the provided key path or key paths. See method documentation - for extended detail on filtering behavior. -* `ObservedResults` now includes an optional `keyPaths` parameter - which filters change notifications to those only occurring on the provided - key path or key paths. ex) `@ObservedResults(MyObject.self, keyPaths: ["myList.property"])` -* Add two new property wrappers for opening a Realm asynchronously in a - SwiftUI View: - - `AsyncOpen` is a property wrapper that initiates Realm.asyncOpen - for the current user, notifying the view when there is a change in Realm asyncOpen state. - - `AutoOpen` behaves similarly to `AsyncOpen`, but in the case of no internet - connection this will return an opened realm. -* Add `EnvironmentValues.partitionValue`. This value can be injected into any view using one of - our new property wrappers `AsyncOpen` and `AutoOpen`: - `MyView().environment(\.partitionValue, "partitionValue")`. -* Shift more of the work done when first initializing a collection notifier to - the background worker thread rather than doing it on the main thread. - -### Fixed - -* `configuration(partitionValue: AnyBSON)` would always set a nil partition value - for the user sync configuration. -* Decoding a `@Persisted` property would incorrectly throw a `DecodingError.keyNotFound` - for an optional property if the key is missing. - ([Cocoa #7358](https://github.com/realm/realm-swift/issues/7358), since v10.10.0) -* Fixed a symlink which prevented Realm from building on case sensitive file systems. - ([#7344](https://github.com/realm/realm-swift/issues/7344), since v10.8.0) -* Removing a change callback from a Results would sometimes block the calling - thread while the query for that Results was running on the background worker - thread (since v10.11.0). -* Object observers did not handle the object being deleted properly, which - could result in assertion failures mentioning "m_table" in ObjectNotifier - ([Core #4824](https://github.com/realm/realm-core/issues/4824), since v10.11.0). -* Fixed a crash when delivering notifications over a nested hierarchy of lists - of Mixed that contain links. ([Core #4803](https://github.com/realm/realm-core/issues/4803), since v10.8.0) -* Fixed a crash when an object which is linked to by a Mixed is deleted via - sync. ([Core #4828](https://github.com/realm/realm-core/pull/4828), since v10.8.0) -* Fixed a rare crash when setting a mixed link for the first time which would - trigger if the link was to the same table and adding the backlink column - caused a BPNode split. ([Core #4828](https://github.com/realm/realm-core/pull/4828), since v10.8.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 4. On iOS Xcode 13 beta 2 is the latest supported - version due to betas 3 and 4 having a broken Combine.framework. - -### Internal - -* Upgraded realm-core from v11.1.1 to v11.2.0 - -10.11.0 Release notes (2021-07-22) -============================================================= - -### Enhancements - -* Add type safe methods for: - - `RealmCollection.min(of:)` - - `RealmCollection.max(of:)` - - `RealmCollection.average(of:)` - - `RealmCollection.sum(of:)` - - `RealmCollection.sorted(by:ascending:)` - - `RealmKeyedCollection.min(of:)` - - `RealmKeyedCollection.max(of:)` - - `RealmKeyedCollection.average(of:)` - - `RealmKeyedCollection.sum(of:)` - - `RealmKeyedCollection.sorted(by:ascending:)` - - `Results.distinct(by:)` - - `SortDescriptor(keyPath:ascending:) - - Calling these methods can now be done via Swift keyPaths, like so: - ```swift - class Person: Object { - @Persisted var name: String - @Persisted var age: Int - } - - let persons = realm.objects(Person.self) - persons.min(of: \.age) - persons.max(of: \.age) - persons.average(of: \.age) - persons.sum(of: \.age) - persons.sorted(by: \.age) - persons.sorted(by: [SortDescriptor(keyPath: \Person.age)]) - persons.distinct(by: [\Person.age]) - ``` -* Add `List.objects(at indexes:)` in Swift and `[RLMCollection objectsAtIndexes:]` in Objective-C. - This allows you to select elements in a collection with a given IndexSet ([#7298](https://github.com/realm/realm-swift/issues/7298)). -* Add `App.emailPasswordAuth.retryCustomConfirmation(email:completion:)` and `[App.emailPasswordAuth retryCustomConfirmation:completion:]`. - These functions support retrying a [custom confirmation](https://docs.mongodb.com/realm/authentication/email-password/#run-a-confirmation-function) function. -* Improve performance of creating collection notifiers for Realms with a complex schema. - This means that the first run of a query or first call to observe() on a collection will - do significantly less work on the calling thread. -* Improve performance of calculating changesets for notifications, particularly - for deeply nested object graphs and objects which have List or Set properties - with small numbers of objects in the collection. - -### Fixed - -* `RealmProperty` would crash when decoding a `null` json value. - ([Cocoa #7323](https://github.com/realm/realm-swift/issues/7323), since v10.8.0) -* `@Persisted` would crash when decoding a `null` value. - ([#7332](https://github.com/realm/realm-swift/issues/7332), since v10.10.0). -* Fixed an issue where `Realm.Configuration` would be set after views have been laid out - when using `.environment(\.realmConfiguration, ...)` in SwiftUI. This would cause issues if you are - required to bump your schema version and are using `@ObservedResults`. -* Sync user profiles now correctly persist between runs. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 3. Note that this release does not contain Xcode 13 - beta binaries as beta 3 does not include a working version of - Combine.framework for iOS. - -### Internal - -* Upgraded realm-core from 11.0.4 to 11.1.1 - -10.10.0 Release notes (2021-07-07) -============================================================= - -### Enhancements - -* Add a new property wrapper-based declaration syntax for properties on Realm - Swift object classes. Rather than using `@objc dynamic` or the - `RealmProperty` wrapper type, properties can now be declared with `@Persisted - var property: T`, where `T` is any of the supported property types, including - optional numbers and collections. This has a few benefits: - - - All property types are now declared in the same way. No more remembering - that this type requires `@objc dynamic var` while this other type - requires `let`, and the `RealmProperty` or `RealmOptional` helper is no - longer needed for types not supported by Objective-C. - - No more overriding class methods like `primaryKey()`, - `indexedProperties()` or `ignoredProperties()`. The primary key and - indexed flags are set directly in the property declaration with - `@Persisted(primaryKey: true) var _id: ObjectId` or `@Persisted(indexed: - true) var indexedProperty: Int`. If any `@Persisted` properties are present, - all other properties are implicitly ignored. - - Some performance problems have been fixed. Declaring collection - properties as `let listProp = List()` resulted in the `List` object - being created eagerly when the parent object is read, which could cause - performance problems if a class has a large number of `List` or - `RealmOptional` properties. `@Persisted var list: List` allows us to - defer creating the `List` until it's accessed, improving performance - when looping over objects and using only some of the properties. - - Similarly, `let _id = ObjectId.generate()` was a convenient way to - declare a sync-compatible primary key, but resulted in new ObjectIds - being generated in some scenarios where the value would never actually be - used. `@Persisted var _id: ObjectId` has the same behavior of - automatically generating primary keys, but allows us to only generate it - when actually needed. - - More types of enums are supported. Any `RawRepresentable` enum whose raw - type is a type supported by Realm can be stored in an `@Persisted` - project, rather than just `@objc` enums. Enums must be declared as - conforming to the `PersistableEnum` protocol, and still cannot (yet) be - used in collections. - - `willSet` and `didSet` can be used with `@Persistable` properties, while - they previously did not work on managed Realm objects. - - While we expect the switch to the new syntax to be very simple for most - users, we plan to support the existing objc-based declaration syntax for the - foreseeable future. The new style and old style cannot be mixed within a - single class, but new classes can use the new syntax while existing classes - continue to use the old syntax. Updating an existing class to the new syntax - does not change what data is stored in the Realm file and so does not require - a migration (as long as you don't also change the schema in the process, of - course). -* Add `Map.merge()`, which adds the key-value pairs from another Map or - Dictionary to the map. -* Add `Map.asKeyValueSequence()` which returns an adaptor that can be used with - generic functions that operate on Dictionary-styled sequences. - -### Fixed -* AnyRealmValue enum values are now supported in more places when creating - objects. -* Declaring a property as `RealmProperty` will now report an - error during schema discovery rather than doing broken things when the - property is used. -* Observing the `invalidated` property of `RLMDictionary`/`Map` via KVO did not - set old/new values correctly in the notification (since 10.8.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 2. - -10.9.0 Release notes (2021-07-01) -============================================================= - -### Enhancements - -* Add `App.emailPasswordAuth.retryCustomConfirmation(email:completion:)` and - `[App.emailPasswordAuth retryCustomConfirmation:completion:]`. These - functions support retrying a [custom confirmation](https://docs.mongodb.com/realm/authentication/email-password/#run-a-confirmation-function) - function. -* Improve performance of many Dictionary operations, especially when KVO is being used. - -### Fixed - -* Calling `-[RLMRealm deleteObjects:]` on a `RLMDictionary` cleared the - dictionary but did not actually delete the objects in the dictionary (since v10.8.0). -* Rix an assertion failure when observing a `List` contains - object links. ([Core #4767](https://github.com/realm/realm-core/issues/4767), since v10.8.0) -* Fix an assertion failure when observing a `RLMDictionary`/`Map` which links - to an object which was deleting by a different sync client. - ([Core #4770](https://github.com/realm/realm-core/pull/4770), since v10.8.0) -* Fix an endless recursive loop that could cause a stack overflow when - computing changes on a set of objects which contained cycles. - ([Core #4770](https://github.com/realm/realm-core/pull/4770), since v10.8.0). -* Hash collisions in dictionaries were not handled properly. - ([Core #4776](https://github.com/realm/realm-core/issues/4776), since v10.8.0). -* Fix a crash after clearing a list or set of AnyRealmValue containing links to - objects ([Core #4774](https://github.com/realm/realm-core/issues/4774), since v10.8.0) -* Trying to refresh a user token which had been revoked by an admin lead to an - infinite loop and then a crash. This situation now properly logs the user out - and reports an error. ([Core #4745](https://github.com/realm/realm-core/issues/4745), since v10.0.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 2. - -### Internal - -* Upgraded realm-core from v11.0.3 to v11.0.4 - -10.8.1 Release notes (2021-06-22) -============================================================= - -### Enhancements - -* Update Xcode 12.5 to Xcode 12.5.1. -* Create fewer dynamic classes at runtime, improving memory usage and startup time slightly. - -### Fixed - -* Importing the Realm swift package produced several warnings about excluded - files not existing. Note that one warning will still remain after this change. - ([#7295](https://github.com/realm/realm-swift/issues/7295), since v10.8.0). -* Update the root URL for the API docs so that the links go to the place where - new versions of the docs are being published. - ([#7299](https://github.com/realm/realm-swift/issues/7299), since v10.6.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. Note that this version of Realm Studio has not - yet been released at the time of this release. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 1. - -10.8.0 Release notes (2021-06-14) -============================================================= - -NOTE: This version upgrades the Realm file format version to add support for -the new data types and to adjust how primary keys are handled. Realm files -opened will be automatically upgraded and cannot be read by versions older than -v10.8.0. This upgrade should be a fairly fast one. Note that we now -automatically create a backup of the pre-upgrade Realm. - -### Enhancements - -* Add support for the `UUID` and `NSUUID` data types. These types can be used - for the primary key property of Object classes. -* Add two new collection types to complement the existing `RLMArray`/`List` type: - - `RLMSet` in Objective-C and `MutableSet` in Swift are mutable - unordered collections of distinct objects, similar to the built-in - `NSMutableSet` and `Set`. The values in a set may be any non-collection - type which can be stored as a Realm property. Sets are guaranteed to never - contain two objects which compare equal to each other, including when - conflicting writes are merged by sync. - - `RLMDictionary` in Objective-C and `Map` are - mutable key-value dictionaries, similar to the built-in - `NSMutableDictionary` and `Dictionary`. The values in a dictionary may be - any non-collection type which can be stored as a Realm property. The keys - must currently always be a string. -* Add support for dynamically typed properties which can store a value of any - of the non-collection types supported by Realm, including Object subclasses - (but not EmbeddedObject subclasses). These are declared with - `@property id propertyName;` in Objective-C and - `let propertyName = RealmProperty()` in Swift. - -### Fixed - -* Setting a collection with a nullable value type to null via one of the - dynamic interfaces would hit an assertion failure instead of clearing the - collection. -* Fixed an incorrect detection of multiple incoming links in a migration when - changing a table to embedded and removing a link to it at the same time. - ([#4694](https://github.com/realm/realm-core/issues/4694) since v10.0.0-beta.2) -* Fixed a divergent merge on Set when one client clears the Set and another - client inserts and deletes objects. - ([#4720](https://github.com/realm/realm-core/issues/4720)) -* Partially revert to pre-v5.0.0 handling of primary keys to fix a performance - regression. v5.0.0 made primary keys determine the position in the low-level - table where newly added objects would be inserted, which eliminated the need - for a separate index on the primary key. This made some use patterns slightly - faster, but also made some reasonable things dramatically slower. - ([#4522](https://github.com/realm/realm-core/issues/4522)) -* Fixed an incorrect detection of multiple incoming links in a migration when - changing a table to embedded and removing a link to it at the same time. - ([#4694](https://github.com/realm/realm-core/issues/4694) since v10.0.0-beta.2) -* Fix collection notification reporting for modifications. This could be - observed by receiving the wrong indices of modifications on sorted or - distinct results, or notification blocks sometimes not being called when only - modifications have occured. - ([#4573](https://github.com/realm/realm-core/pull/4573) since v5.0.0). -* Fix incorrect sync instruction emission when replacing an existing embedded - object with another embedded object.([Core #4740](https://github.com/realm/realm-core/issues/4740) - -### Deprecations - -* `RealmOptional` has been deprecated in favor of `RealmProperty`. - `RealmProperty` is functionality identical to `RealmOptional` when storing - optional numeric types, but can also store the new `AnyRealmValue` type. - -### Compatibility - -* Realm Studio: 11.0.0 or later. Note that this version of Realm Studio has not - yet been released at the time of this release. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 1. - -### Internal - -* Upgraded realm-core from v10.7.2 to v11.0.3 - -10.8.0-beta.2 Release notes (2021-06-01) -============================================================= - -### Enhancements - -* Add `RLMDictionary`/`Map<>` datatype. This is a Dictionary collection type used for storing key-value pairs in a collection. - -### Compatibility - -* Realm Studio: 11.0.0-beta.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v11.0.0-beta.4 to v11.0.0-beta.6 - -10.8.0-beta.0 Release notes (2021-05-07) -============================================================= - -### Enhancements - -* Add `RLMSet`/`MutableSet<>` datatype. This is a Set collection type used for storing distinct values in a collection. -* Add support for `id`/`AnyRealmValue`. -* Add support for `UUID`/`NSUUID` data type. - -### Fixed - -* None. - -### Deprecations - -* `RealmOptional` has been deprecated in favor of `RealmProperty`. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.7.2 to v10.8.0-beta.5 - -10.7.7 Release notes (2021-06-10) -============================================================= - -Xcode 12.2 is now the minimum supported version. - -### Enhancements - -* Add Xcode 13 beta 1 binaries to the release package. - -### Fixed - -* Fix a runtime crash which happens in some Xcode version (Xcode < 12, reported - in Xcode 12.5), where SwiftUI is not weak linked by default. This fix only - works for Cocoapods projects. - ([#7234](https://github.com/realm/realm-swift/issues/7234) -* Fix warnings when building with Xcode 13 beta 1. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 1. - -10.7.6 Release notes (2021-05-13) -============================================================= - -### Enhancements - -* Realms opened in read-only mode can now be invalidated (although it is - unlikely to be useful to do so). - -### Fixed - -* Fix an availability warning when building Realm. The code path which gave the - warning can not currently be hit, so this did not cause any runtime problems - ([#7219](https://github.com/realm/realm-swift/issues/7219), since 10.7.3). -* Proactively check the expiry time on the access token and refresh it before - attempting to initiate a sync session. This prevents some error logs from - appearing on the client such as: "ERROR: Connection[1]: Websocket: Expected - HTTP response 101 Switching Protocols, but received: HTTP/1.1 401 - Unauthorized" ([RCORE-473](https://jira.mongodb.org/browse/RCORE-473), since v10.0.0) -* Fix a race condition which could result in a skipping notifications failing - to skip if several commits using notification skipping were made in - succession (since v5.0.0). -* Fix a crash on exit inside TableRecycler which could happen if Realms were - open on background threads when the app exited. - ([Core #4600](https://github.com/realm/realm-core/issues/4600), since v5.0.0) -* Fix errors related to "uncaught exception in notifier thread: - N5realm11KeyNotFoundE: No such object" which could happen on sycnronized - Realms if a linked object was deleted by another client. - ([JS #3611](https://github.com/realm/realm-js/issues/3611), since v10.0.0). -* Reading a link to an object which has been deleted by a different client via - a string-based interface (such as value(forKey:) or the subscript operator on - DynamicObject) could return an invalid object rather than nil. - ([Core #4687](https://github.com/realm/realm-core/pull/4687), since v10.0.0) -* Recreate the sync metadata Realm if the encryption key for it is missing from - the keychain rather than crashing. This can happen if a device is restored - from an unencrypted backup, which restores app data but not the app's - keychain entries, and results in all cached logics for sync users being - discarded but no data being lost. - [Core #4285](https://github.com/realm/realm-core/pull/4285) -* Thread-safe references can now be created for read-only Realms. - ([#5475](https://github.com/realm/realm-swift/issues/5475)). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.6.0 to v10.7.2 - -10.7.5 Release notes (2021-05-07) -============================================================= - -### Fixed - -* Iterating over frozen collections on multiple threads at the same time could - throw a "count underflow" NSInternalInconsistencyException. - ([#7237](https://github.com/realm/realm-swift/issues/7237), since v5.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. - -10.7.4 Release notes (2021-04-26) -============================================================= - -### Enhancements - -* Add Xcode 12.5 binaries to the release package. - -### Fixed - -* Add the Info.plist file to the XCFrameworks in the Carthage xcframwork - package ([#7216](https://github.com/realm/realm-swift/issues/7216), since 10.7.3). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. - -10.7.3 Release notes (2021-04-22) -============================================================= - -### Enhancements - -* Package a prebuilt XCFramework for Carthage. Carthage 0.38 and later will - download this instead of the old frameworks when using `--use-xcframeworks`. -* We now make a backup of the realm file prior to any file format upgrade. The - backup is retained for 3 months. Backups from before a file format upgrade - allows for better analysis of any upgrade failure. We also restore a backup, - if a) an attempt is made to open a realm file whith a "future" file format - and b) a backup file exist that fits the current file format. - ([Core #4166](https://github.com/realm/realm-core/pull/4166)) -* The error message when the intial steps of opening a Realm file fails is now - more descriptive. -* Make conversion of Decimal128 to/from string work for numbers with more than - 19 significant digits. This means that Decimal128's initializer which takes a - string will now never throw, as it previously threw only for out-of-bounds - values. The initializer is still marked as `throws` for - backwards compatibility. - ([#4548](https://github.com/realm/realm-core/issues/4548)) - -### Fixed - -* Adjust the header paths for the podspec to avoid accidentally finding a file - which isn't part of the pod that produced warnings when importing the - framework. ([#7113](https://github.com/realm/realm-swift/issues/7113), since 10.5.2). -* Fixed a crash that would occur when observing unmanaged Objects in multiple - views in SwiftUI. When using `@StateRealmObject` or `@ObservedObject` across - multiple views with an unmanaged object, each view would subscribe to the - object. As each view unsubscribed (generally when trailing back through the - view stack), our propertyWrappers would attempt to remove the KVOs for each - cancellation, when it should only be done once. We now correctly remove KVOs - only once. ([#7131](https://github.com/realm/realm-swift/issues/7131)) -* Fixed `isInvalidated` not returning correct value after object deletion from - Realm when using a custom schema. The object's Object Schema was not updated - when the object was added to the realm. We now correctly update the object - schema when adding it to the realm. - ([#7181](https://github.com/realm/realm-swift/issues/7181)) -* Syncing large Decimal128 values would cause "Assertion failed: cx.w[1] == 0" - ([Core #4519](https://github.com/realm/realm-core/issues/4519), since v10.0.0). -* Potential/unconfirmed fix for crashes associated with failure to memory map - (low on memory, low on virtual address space). For example - ([#4514](https://github.com/realm/realm-core/issues/4514), since v5.0.0). -* Fix assertion failures such as "!m_notifier_skip_version.version" or - "m_notifier_sg->get_version() + 1 == new_version.version" when performing - writes inside change notification callbacks. Previously refreshing the Realm - by beginning a write transaction would skip delivering notifications, leaving - things in an inconsistent state. Notifications are now delivered recursively - when needed instead. ([Cocoa #7165](https://github.com/realm/realm-swift/issues/7165)). -* Fix collection notification reporting for modifications. This could be - observed by receiving the wrong indices of modifications on sorted or - distinct results, or notification blocks sometimes not being called when only - modifications have occured. - ([#4573](https://github.com/realm/realm-core/pull/4573) since v5.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.5.5 to v10.6.0 -* Add additional debug validation to file map management that will hopefully - catch cases where we unmap something which is still in use. - -10.7.2 Release notes (2021-03-08) -============================================================= - -### Fixed - -* During integration of a large amount of data from the server, you may get - "Assertion failed: !fields.has_missing_parent_update()" - ([Core #4497](https://github.com/realm/realm-core/issues/4497), since v6.0.0) - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.5.4 to v10.5.5 - -10.7.1 Release notes (2021-03-05) -============================================================= - -### Fixed - -* Queries of the form "a.b.c == nil" would match objects where `b` is `nil` if - `c` did not have an index and did not if `c` was indexed. Both will now match - to align with NSPredicate's behavior. ([Core #4460]https://github.com/realm/realm-core/pull/4460), since 4.3.0). -* Restore support for upgrading files from file format 5 (Realm Cocoa 1.x). - ([Core #7089](https://github.com/realm/realm-swift/issues/7089), since v5.0.0) -* On 32bit devices you may get exception with "No such object" when upgrading - to v10.* ([Java #7314](https://github.com/realm/realm-java/issues/7314), since v5.0.0) -* The notification worker thread would rerun queries after every commit rather - than only commits which modified tables which could effect the query results - if the table had any outgoing links to tables not used in the query. - ([Core #4456](https://github.com/realm/realm-core/pull/4456), since v5.0.0). -* Fix "Invalid ref translation entry [16045690984833335023, 78187493520]" - assertion failure which could occur when using sync or multiple processes - writing to a single Realm file. - ([#7086](https://github.com/realm/realm-swift/issues/7086), since v5.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.5.3 to v10.5.4 - -10.7.0 Release notes (2021-02-23) -============================================================= - -### Enhancements - -* Add support for some missing query operations on data propertys: - - Data properties can be compared to other data properties - (e.g. "dataProperty1 == dataProperty2"). - - Case and diacritic-insensitive queries can be performed on data properties. - This will only have meaningful results if the data property contains UTF-8 - string data. - - Data properties on linked objects can be queried - (e.g. "link.dataProperty CONTAINS %@") -* Implement queries which filter on lists other than object links (lists of - objects were already supported). All supported operators for normal - properties are now supported for lists (e.g. "ANY intList = 5" or "ANY - stringList BEGINSWITH 'prefix'"), as well as aggregate operations on the - lists (such as "intArray.@sum > 100"). -* Performance of sorting on more than one property has been improved. - Especially important if many elements match on the first property. Mitigates - ([#7092](https://github.com/realm/realm-swift/issues/7092)) - -### Fixed - -* Fixed a bug that prevented an object type with incoming links from being - marked as embedded during migrations. ([Core #4414](https://github.com/realm/realm-core/pull/4414)) -* The Realm notification listener thread could sometimes hit the assertion - failure "!skip_version.version" if a write transaction was committed at a - very specific time (since v10.5.0). -* Added workaround for a case where upgrading an old file with illegal string - would crash ([#7111](https://github.com/realm/realm-swift/issues/7111)) -* Fixed a conflict resolution bug related to the ArrayMove instruction, which - could sometimes cause an "Invalid prior_size" exception to prevent - synchronization (since v10.5.0). -* Skipping a change notification in the first write transaction after the - observer was added could potentially fail to skip the notification (since v10.5.1). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.5.0 to v10.5.3 - -10.6.0 Release notes (2021-02-15) -============================================================= - -### Enhancements - -* Add `@StateRealmObject` for SwiftUI support. This property wrapper type instantiates an observable object on a View. - Use in place of `SwiftUI.StateObject` for Realm `Object`, `List`, and `EmbeddedObject` types. -* Add `@ObservedRealmObject` for SwiftUI support. This property wrapper type subscribes to an observable object - and invalidates a view whenever the observable object changes. Use in place of `SwiftUI.ObservedObject` for - Realm `Object`, `List`, or `EmbeddedObject` types. -* Add `@ObservedResults` for SwiftUI support. This property wrapper type retrieves results from a Realm. - The results use the realm configuration provided by the environment value `EnvironmentValues.realmConfiguration`. -* Add `EnvironmentValues.realm` and `EnvironmentValues.realmConfiguration` for `Realm` - and `Realm.Configuration` types respectively. Values can be injected into views using the `View.environment` method, e.g., `MyView().environment(\.realmConfiguration, Realm.Configuration(fileURL: URL(fileURLWithPath: "myRealmPath.realm")))`. - The value can then be declared on the example `MyView` as `@Environment(\.realm) var realm`. -* Add `SwiftUI.Binding` extensions where `Value` is of type `Object`, `List`, or `EmbeddedObject`. - These extensions expose methods for wrapped write transactions, to avoid boilerplate within - views, e.g., `TextField("name", $personObject.name)` or `$personList.append(Person())`. -* Add `Object.bind` and `EmbeddedObject.bind` for SwiftUI support. This allows you to create - bindings of realm properties when a propertyWrapper is not available for you to do so, e.g., `TextField("name", personObject.bind(\.name))`. -* The Sync client now logs error messages received from server rather than just - the size of the error message. -* Errors returned from the server when sync WebSockets get closed are now - captured and surfaced as a SyncError. -* Improve performance of sequential reads on a Results backed directly by a - Table (i.e. `realm.object(ClasSName.self)` with no filter/sort/etc.) by 50x. -* Orphaned embedded object types which are not linked to by any top-level types - are now better handled. Previously the server would reject the schema, - resulting in delayed and confusing error reporting. Explicitly including an - orphan in `objectTypes` is now immediately reported as an error when opening - the Realm, and orphans are automatically excluded from the auto-discovered - schema when `objectTypes` is not specified. - -### Fixed - -* Reading from a Results backed directly by a Table (i.e. - `realm.object(ClasSName.self)` with no filter/sort/etc.) would give incorrect - results if the Results was constructed and accessed before creating a new - object with a primary key less than the smallest primary key which previously - existed. ([#7014](https://github.com/realm/realm-swift/issues/7014), since v5.0.0). -* During synchronization you might experience crash with - "Assertion failed: ref + size <= next->first". - ([Core #4388](https://github.com/realm/realm-core/issues/4388)) - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.4.0 to v10.5.0 - -10.5.2 Release notes (2021-02-09) -============================================================= - -### Enhancements - -* Add support for "thawing" objects. `Realm`, `Results`, `List` and `Object` - now have `thaw()` methods which return a live copy of the frozen object. This - enables app behvaior where a frozen object can be made live again in order to - mutate values. For example, first freezing an object passed into UI view, - then thawing the object in the view to update values. -* Add Xcode 12.4 binaries to the release package. - -### Fixed - -* Inserting a date into a synced collection via `AnyBSON.datetime(...)` would - be of type `Timestamp` and not `Date`. This could break synced objects with a - `Date` property. - ([#6654](https://github.com/realm/realm-swift/issues/6654), since v10.0.0). -* Fixed an issue where creating an object after file format upgrade may fail - with assertion "Assertion failed: lo() <= std::numeric_limits::max()" - ([#4295](https://github.com/realm/realm-core/issues/4295), since v5.0.0) -* Allow enumerating objects in migrations with types which are no longer - present in the schema. -* Add `RLMResponse.customStatusCode`. This fixes timeout exceptions that were - occurring with a poor connection. ([#4188](https://github.com/realm/realm-core/issues/4188)) -* Limit availability of ObjectKeyIdentifiable to platforms which support - Combine to match the change made in the Xcode 12.5 SDK. - ([#7083](https://github.com/realm/realm-swift/issues/7083)) - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.3.3 to v10.4.0 - -10.5.1 Release notes (2021-01-15) -============================================================= - -### Enhancements - -* Add Xcode 12.3 binary to release package. -* Add support for queries which have nil on the left side and a keypath on the - right side (e.g. "nil == name" rather than "name == nil" as was previously - required). - -### Fixed -* Timeouts when calling server functions via App would sometimes crash rather - than report an error. -* Fix a race condition which would lead to "uncaught exception in notifier - thread: N5realm15InvalidTableRefE: transaction_ended" and a crash when the - source Realm was closed or invalidated at a very specific time during the - first run of a collection notifier - ([#3761](https://github.com/realm/realm-core/issues/3761), since v5.0.0). -* Deleting and recreating objects with embedded objects may fail. - ([Core PR #4240](https://github.com/realm/realm-core/pull/4240), since v10.0.0) -* Fast-enumerating a List after deleting the parent object would crash with an - assertion failure rather than a more appropriate exception. - ([Core #4114](https://github.com/realm/realm-core/issues/4114), since v5.0.0). -* Fix an issue where calling a MongoDB Realm Function would never be performed as the reference to the weak `User` was lost. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.3. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.3.2 to v10.3.3 - -10.5.0 Release notes (2020-12-14) -============================================================= - -### Enhancements - -* MongoDB Realm is now supported when installing Realm via Swift Package Manager. - -### Fixed - -* The user identifier was added to the file path for synchronized Realms twice - and an extra level of escaping was performed on the partition value. This did - not cause functional problems, but made file names more confusing than they - needed to be. Existing Realm files will continue to be located at the old - path, while newly created files will be created at a shorter path. (Since v10.0.0). -* Fix a race condition which could potentially allow queries on frozen Realms - to access an uninitialized structure for search indexes (since v5.0.0). -* Fix several data races in App and SyncSession initialization. These could - possibly have caused strange errors the first time a synchronized Realm was - opened (since v10.0.0). -* Fix a use of a dangling reference when refreshing a user’s custom data that - could lead to a crash (since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.1.4 to v10.3.2 - -10.4.0 Release notes (2020-12-10) -============================================================= - -### Enhancements - -* Add Combine support for App and User. These two types now have a - `objectWillChange` property that emits each time the state of the object has - changed (such as due to the user logging in or out). ([PR #6977](https://github.com/realm/realm-swift/pull/6977)). - -### Fixed - -* Integrating changesets from the server would sometimes hit the assertion - failure "n != realm::npos" inside Table::create_object_with_primary_key() - when creating an object with a primary key which previously had been used and - had incoming links. ([Core PR #4180](https://github.com/realm/realm-core/pull/4180), since v10.0.0). -* The arm64 simulator slices were not actually included in the XCFramework - release package. ([PR #6982](https://github.com/realm/realm-swift/pull/6982), since v10.2.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.1.3 to v10.1.4 -* Upgraded realm-sync from v10.1.4 to v10.1.5 - -10.3.0 Release notes (2020-12-08) -============================================================= - -### Enhancements - -* Add Google OpenID Connect Credentials, an alternative login credential to the - Google OAuth 2.0 credential. - -### Fixed - -* Fixed a bug that would prevent eventual consistency during conflict - resolution. Affected clients would experience data divergence and potentially - consistency errors as a result if they experienced conflict resolution - between cycles of Create-Erase-Create for objects with primary keys (since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-sync from v10.1.3 to v10.1.4 - -10.2.0 Release notes (2020-12-02) -============================================================= - -### Enhancements - -* The prebuilt binaries are now packaged as XCFrameworks. This adds support for - Catalyst and arm64 simulators when using them to install Realm, removes the - need for the strip-frameworks build step, and should simplify installation. -* The support functionality for using the Objective C API from Swift is now - included in Realm Swift and now includes all of the required wrappers for - MongoDB Realm types. In mixed Objective C/Swift projects, we recommend - continuing to use the Objective C types, but import both Realm and RealmSwift - in your Swift files. - -### Fixed - -* The user identifier was added to the file path for synchronized Realms twice - and an extra level of escaping was performed on the partition value. This did - not cause functional problems, but made file names more confusing than they - needed to be. Existing Realm files will continue to be located at the old - path, while newly created files will be created at a shorter path. (Since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -10.1.4 Release notes (2020-11-16) -============================================================= - -### Enhancements - -* Add arm64 slices to the macOS builds. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.0.1 to v10.1.3 -* Upgraded realm-sync from v10.0.1 to v10.1.3 - -10.1.3 Release notes (2020-11-13) -============================================================= - -### Enhancements - -* Add Xcode 12.2 binaries to the release package. - -### Fixed - -* Disallow setting - `RLMRealmConfiguration.deleteRealmIfMigrationNeeded`/`Realm.Config.deleteRealmIfMigrationNeeded` - when sync is enabled. This did not actually work as it does not delete the - relevant server state and broke in confusing ways ([PR #6931](https://github.com/realm/realm-swift/pull/6931)). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.1. -* CocoaPods: 1.10 or later. - -10.1.2 Release notes (2020-11-06) -============================================================= - -### Enhancements - -* Some error states which previously threw a misleading "NoSuchTable" exception - now throw a more descriptive exception. - -### Fixed - -* One of the Swift packages did not have the minimum deployment target set, - resulting in errors when archiving an app which imported Realm via SPM. -* Reenable filelock emulation on watchOS so that the OS does not kill the app - when it is suspended while a Realm is open on watchOS 7 ([#6861](https://github.com/realm/realm-swift/issues/6861), since v5.4.8 -* Fix crash in case insensitive query on indexed string columns when nothing - matches ([#6836](https://github.com/realm/realm-swift/issues/6836), since v5.0.0). -* Null values in a `List` or `List` were incorrectly treated - as non-null in some places. It is unknown if this caused any functional - problems when using the public API. ([Core PR #3987](https://github.com/realm/realm-core/pull/3987), since v5.0.0). -* Deleting an entry in a list in two different clients could end deleting the - wrong entry in one client when the changes are merged (since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.1. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.0.0 to v10.1.1 -* Upgraded realm-sync from v10.0.0 to v10.1.1 - -10.1.1 Release notes (2020-10-27) -============================================================= - -### Enhancements - -* Set the minimum CocoaPods version in the podspec so that trying to install - with older versions gives a more useful error ([PR #6892](https://github.com/realm/realm-swift/pull/6892)). - -### Fixed - -* Embedded objects could not be marked as `ObjectKeyIdentifable` - ([PR #6890](https://github.com/realm/realm-swift/pull/6890), since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.1. -* CocoaPods: 1.10 or later. - -10.1.0 Release notes (2020-10-22) -============================================================= - -CocoaPods 1.10 or later is now required to install Realm. - -### Enhancements - -* Throw an exception for Objects that have none of its properties marked with @objc. -* Mac Catalyst and arm64 simulators are now supported when integrating via Cocoapods. -* Add Xcode 12.1 binaries to the release package. -* Add Combine support for `Realm.asyncOpen()`. - -### Fixed - -* Implement precise and unbatched notification of sync completion events. This - avoids a race condition where an earlier upload completion event will notify - a later waiter whose changes haven't been uploaded yet. - ([#1118](https://github.com/realm/realm-object-store/pull/1118)). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.1. - -10.0.0 Release notes (2020-10-16) -============================================================= - -This release is functionally identical to v10.0.0-rc.2. - -NOTE: This version upgrades the Realm file format version to add support for -new data types. Realm files opened will be automatically upgraded and cannot be -read by versions older than v10.0.0. - -### Breaking Changes - -* Rename Realm.Publishers to RealmPublishers to avoid confusion with Combine.Publishers. -* Remove `[RLMSyncManager shared]`. This is now instatiated as a property on App/RLMApp. -* `RLMSyncManager.pinnedCertificatePaths` has been removed. -* Classes `RLMUserAccountInfo` & `RLMUserInfo` (swift: `UserInfo`, `UserAccountInfo`) have been removed. -* `RLMSyncUser`/`SyncUser` has been renamed to `RLMUser`/`User`. -* We no longer support Realm Cloud (legacy), but instead the new "MongoDB - Realm" Cloud. MongoDB Realm is a serverless platform that enables developers - to quickly build applications without having to set up server infrastructure. - MongoDB Realm is built on top of MongoDB Atlas, automatically integrating the - connection to your database. -* Remove support for Query-based sync, including the configuration parameters - and the `RLMSyncSubscription` and `SyncSubscription` types ([#6437](https://github.com/realm/realm-swift/pull/6437)). -* Remove everything related to sync permissions, including both the path-based - permission system and the object-level privileges for query-based sync. - Permissions are now configured via MongoDB Atlas. - ([#6445](https://github.com/realm/realm-swift/pulls/6445)) -* Remove support for Realm Object Server. -* Non-embedded objects in synchronized Realms must always have a primary key - named "_id". -* All Swift callbacks for asynchronous operations which can fail are now passed - a `Result` parameter instead of two separate `Value?` and - `Error?` parameters. - -### Enhancements - -* Add support for next generation sync. Support for syncing to MongoDB instead - of Realm Object Server. Applications must be created at realm.mongodb.com -* The memory mapping scheme for Realm files has changed to better support - opening very large files. -* Add support for the ObjectId data type. This is an automatically-generated - unique identifier similar to a GUID or a UUID. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for the Decimal128 data type. This is a 128-bit IEEE 754 decimal - floating point number similar to NSDecimalNumber. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for embedded objects. Embedded objects are objects which are - owned by a single parent object, and are deleted when that parent object is - deleted. They are defined by subclassing `EmbeddedObject` / - `RLMEmbeddedObject` rather than `Object` / `RLMObject`. -* Add `-[RLMUser customData]`/`User.customData`. Custom data is - configured in your MongoDB Realm App. -* Add `-[RLMUser callFunctionNamed:arguments:completion:]`/`User.functions`. - This is the entry point for calling Remote MongoDB Realm functions. Functions - allow you to define and execute server-side logic for your application. - Functions are written in modern JavaScript (ES6+) and execute in a serverless - manner. When you call a function, you can dynamically access components of - the current application as well as information about the request to execute - the function and the logged in user that sent the request. -* Add `-[RLMUser mongoClientWithServiceName:]`/`User.mongoClient`. This is - the entry point for calling your Remote MongoDB Service. The read operations - are `-[RLMMongoCollection findWhere:completion:]`, `-[RLMMongoCollection - countWhere:completion:]`and `-[RLMMongoCollection - aggregateWithPipeline:completion:]`. The write operations are - `-[RLMMongoCollection insertOneDocument:completion:]`, `-[RLMMongoCollection - insertManyDocuments:completion:]`, `-[RLMMongoCollection - updateOneDocument:completion:]`, `-[RLMMongoCollection - updateManyDocuments:completion:]`, `-[RLMMongoCollection - deleteOneDocument:completion:]`, and `-[RLMMongoCollection - deleteManyDocuments:completion:]`. If you are already familiar with MongoDB - drivers, it is important to understand that the remote MongoCollection only - provides access to the operations available in MongoDB Realm. -* Obtaining a Realm configuration from a user is now done with `[RLMUser - configurationWithPartitionValue:]`/`User.configuration(partitionValue:)`. - Partition values can currently be of types `String`, `Int`, or `ObjectId`, - and fill a similar role to Realm URLs did with Realm Cloud. The main - difference is that partitions are meant to be more closely associated with - your data. For example, if you are running a `Dog` kennel, and have a field - `breed` that acts as your partition key, you could open up realms based on - the breed of the dogs. -* Add ability to stream change events on a remote MongoDB collection with - `[RLMMongoCollection watch:delegate:delegateQueue:]`, - `MongoCollection.watch(delegate:)`. When calling `watch(delegate:)` you will be - given a `RLMChangeStream` (`ChangeStream`) which can be used to end watching - by calling `close()`. Change events can also be streamed using the - `MongoCollection.watch` Combine publisher that will stream change events each - time the remote MongoDB collection is updated. -* Add the ability to listen for when a Watch Change Stream is opened when using - Combine. Use `onOpen(event:)` directly after opening a `WatchPublisher` to - register a callback to be invoked once the change stream is opened. -* Objects with integer primary keys no longer require a separate index for the -* primary key column, improving insert performance and slightly reducing file - size. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* Carthage release for Swift is built with Xcode 12 - -### Internal - -* Upgraded realm-core from v6.1.4 to v10.0.0 -* Upgraded realm-sync from v5.0.29 to v10.0.0 - -10.0.0-rc.2 Release notes (2020-10-15) -============================================================= - -### Enhancements - -* Add the ability to listen for when a Watch Change Stream is opened when using - Combine. Use `onOpen(event:)` directly after opening a `WatchPublisher` to - register a callback to be invoked once the change stream is opened. - -### Breaking Changes - -* The insert operations on Mongo collections now report the inserted documents' - IDs as BSON rather than ObjectId. -* Embedded objects can no longer form cycles at the schema level. For example, - type A can no longer have an object property of type A, or an object property - of type B if type B links to type A. This was always rejected by the server, - but previously was allowed in non-synchronized Realms. -* Primary key properties are once again marked as being indexed. This reflects - an internal change to how primary keys are handled that should not have any - other visible effects. -* Change paired return types from Swift completion handlers to return `Result`. -* Adjust how RealmSwift.Object is defined to add support for Swift Library - Evolution mode. This should normally not have any effect, but you may need to - add `override` to initializers of object subclasses. -* Add `.null` type to AnyBSON. This creates a distinction between null values - and properly absent BSON types. - -### Fixed - -* Set the precision correctly when serializing doubles in extended json. -* Reading the `objectTypes` array from a Realm Configuration would not include - the embedded object types which were set in the array. -* Reject loops in embedded objects as part of local schema validation rather - than as a server error. -* Although MongoClient is obtained from a User, it was actually using the - User's App's current user rather than the User it was obtained from to make - requests. - - -This release also contains the following changes from 5.4.7 - 5.5.0 - -### Enhancements - -* Add the ability to capture a NotificationToken when using a Combine publisher - that observes a Realm Object or Collection. The user will call - `saveToken(on:at:)` directly after invoking the publisher to use the feature. - -### Fixed - -* When using `Realm.write(withoutNotifying:)` there was a chance that the - supplied observation blocks would not be skipped when in a write transaction. - ([Object Store #1103](https://github.com/realm/realm-object-store/pull/1103)) -* Comparing two identical unmanaged `List<>`/`RLMArray` objects would fail. - ([#5665](https://github.com/realm/realm-swift/issues/5665)). -* Case-insensitive equality queries on indexed string properties failed to - clear some internal state when rerunning the query. This could manifest as - duplicate results or "key not found" errors. - ([#6830](https://github.com/realm/realm-swift/issues/6830), [#6694](https://github.com/realm/realm-swift/issues/6694), since 5.0.0). -* Equality queries on indexed string properties would sometimes throw "key not - found" exceptions if the hash of the string happened to have bit 62 set. - ([.NET #2025](https://github.com/realm/realm-dotnet/issues/2025), since v5.0.0). -* Queries comparing non-optional int properties to nil would behave as if they - were comparing against zero instead (since v5.0.0). - -### Compatibility - -* File format: Generates Realms with format v12 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v10.0.0-beta.9 to v10.0.0 -* Upgraded realm-sync from v10.0.0-beta.14 to v10.0.0 - -10.0.0-rc.1 Release notes (2020-10-01) -============================================================= - -### Breaking Changes - -* Change the following methods on RLMUser to properties: - - `[RLMUser emailPasswordAuth]` => `RLMUser.emailPasswordAuth` - - `[RLMUser identities]` => `RLMUser.identities` - - `[RLMUser allSessions]` => `RLMUser.allSessions` - - `[RLMUser apiKeysAuth]` => `RLMUser.apiKeysAuth` -* Other changes to RLMUser: - - `nullable` has been removed from `RLMUser.identifier` - - `nullable` has been removed from `RLMUser.customData` -* Change the following methods on RLMApp to properties: - - `[RLMApp allUsers]` => `RLMApp.allUsers` - - `[RLMApp currentUser]` => `RLMApp.currentUser` - - `[RLMApp emailPasswordAuth]` => `RLMApp.emailPasswordAuth` -* Define `RealmSwift.Credentials` as an enum instead of a `typealias`. Example - usage has changed from `Credentials(googleAuthCode: "token")` to - `Credentials.google(serverAuthCode: "serverAuthCode")`, and - `Credentials(facebookToken: "token")` to `Credentials.facebook(accessToken: "accessToken")`, etc. -* Remove error parameter and redefine payload in - `+ (instancetype)credentialsWithFunctionPayload:(NSDictionary *)payload error:(NSError **)error;`. - It is now defined as `+ (instancetype)credentialsWithFunctionPayload:(NSDictionary> *)payload;` - -### Compatibility - -* File format: Generates Realms with format v12 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12. - -10.0.0-beta.6 Release notes (2020-09-30) -============================================================= - -### Breaking Changes - -* Change Google Credential parameter names to better reflect the required auth code: - - `Credentials(googleToken:)` => `Credentials(googleAuthCode:)` - - `[RLMCredentials credentialsWithGoogleToken:]` => `[RLMCredentials credentialsWithGoogleAuthCode:]` -* Rename Realm.Publishers to RealmPublishers to avoid confusion with Combine.Publishers - -### Fixed - -* Deleting objects could sometimes change the ObjectId remaining objects from - null to ObjectId("deaddeaddeaddeaddeaddead") when there are more than 1000 - objects. (Since v10.0.0-alpha.1) -* Fixed an assertion failure when adding an index to a nullable ObjectId - property that contains nulls. (since v10.0.0-alpha.1). - -This release also contains the following changes from 5.4.0 - 5.4.6: - -### Enhancements - -* Add prebuilt binary for Xcode 11.7 to the release package. -* Add prebuilt binary for Xcode 12 to the release package. -* Improve the asymtotic performance of NOT IN queries on indexed properties. It - is now O(Number of Rows) rather than O(Number of Rows \* Number of values in IN clause.) -* Slightly (<5%) improve the performance of most operations which involve - reading from a Realm file. - -### Fixed - -* Upgrading pre-5.x files with string primary keys would result in a file where - `realm.object(ofType:forPrimaryKey:)` would fail to find the object. - ([#6716](https://github.com/realm/realm-swift/issues/6716), since 5.2.0) -* A write transaction which modifies an object with more than 16 managed - properties and causes the Realm file to grow larger than 2 GB could cause an - assertion failure mentioning "m_has_refs". ([JS #3194](https://github.com/realm/realm-js/issues/3194), since 5.0.0). -* Objects with more than 32 properties could corrupt the Realm file and result - in a variety of crashes. ([Java #7057](https://github.com/realm/realm-java/issues/7057), since 5.0.0). -* Fix deadlocks when opening a Realm file in both the iOS simulator and Realm - Studio ([#6743](https://github.com/realm/realm-swift/issues/6743), since 5.3.6). -* Fix Springboard deadlocking when an app is unsuspended while it has an open - Realm file which is stored in an app group on iOS 10-12 - ([#6749](https://github.com/realm/realm-swift/issues/6749), since 5.3.6). -* If you use encryption your application cound crash with a message like - "Opening Realm files of format version 0 is not supported by this version of - Realm". ([#6889](https://github.com/realm/realm-java/issues/6889) among others, since 5.0.0) -* Confining a Realm to a serial queue would throw an error claiming that the - queue was not a serial queue on iOS versions older than 12. - ([#6735](https://github.com/realm/realm-swift/issues/6735), since 5.0.0). -* Results would sometimes give stale results inside a write transaction if a - write which should have updated the Results was made before the first access - of a pre-existing Results object. - ([#6721](https://github.com/realm/realm-swift/issues/6721), since 5.0.0) -* Fix Archiving the Realm and RealmSwift frameworks with Xcode 12. - ([#6774](https://github.com/realm/realm-swift/issues/6774)) -* Fix compilation via Carthage when using Xcode 12 ([#6717](https://github.com/realm/realm-swift/issues/6717)). -* Fix a crash inside `realm::Array(Type)::init_from_mem()` which would - sometimes occur when running a query over links immediately after creating - objects of the queried type. - ([#6789](https://github.com/realm/realm-swift/issues/6789) and possibly others, since 5.0.0). -* Possibly fix problems when changing the type of the primary key of an object - from optional to non-optional. -* Rerunning a equality query on an indexed string property would give incorrect - results if a previous run of the query matched multiple objects and it now - matches one object. This could manifest as either finding a non-matching - object or a "key not found" exception being thrown. - ([#6536](https://github.com/realm/realm-swift/issues/6536), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v12 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v10.0.0-beta.7 to v10.0.0-beta.9 -* Upgraded realm-sync from v10.0.0-beta.11 to v10.0.0-beta.14 - -10.0.0-beta.5 Release notes (2020-09-15) -============================================================= - -### Enhancements - -* Add `User.loggedIn`. -* Add support for multiple Realm Apps. -* Remove `[RLMSyncManager shared]`. This is now instatiated as a property on - the app itself. -* Add Combine support for: - * PushClient - * APIKeyAuth - * User - * MongoCollection - * EmailPasswordAuth - * App.login - -### Fixed - -* Fix `MongoCollection.watch` to consistently deliver events on a given queue. -* Fix `[RLMUser logOutWithCompletion]` and `User.logOut` to now log out the - correct user. -* Fix crash on startup on iOS versions older than 13 (since v10.0.0-beta.3). - -### Breaking Changes - -* `RLMSyncManager.pinnedCertificatePaths` has been removed. -* Classes `RLMUserAccountInfo` & `RLMUserInfo` (swift: `UserInfo`, - `UserAccountInfo`) have been removed. -* The following functionality has been renamed to align Cocoa with the other - Realm SDKs: - -| Old API | New API | -|:-------------------------------------------------------------|:---------------------------------------------------------------| -| `RLMUser.identity` | `RLMUser.identifier` | -| `User.identity` | `User.id` | -| `-[RLMCredentials credentialsWithUsername:password:]` | `-[RLMCredentials credentialsWithEmail:password:]` | -| `Credentials(username:password:)` | `Credentials(email:password:)` | -| -`[RLMUser apiKeyAuth]` | `-[RLMUser apiKeysAuth]` | -| `User.apiKeyAuth()` | `User.apiKeysAuth()` | -| `-[RLMEmailPasswordAuth registerEmail:password:completion:]` | `-[RLMEmailPasswordAuth registerUserWithEmail:password:completion:]` | -| `App.emailPasswordAuth().registerEmail(email:password:)` | `App.emailPasswordAuth().registerUser(email:password:)` | - -### Compatibility - -* File format: Generates Realms with format v12 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v10.0.0-beta.6 to v10.0.0-beta.7 -* Upgraded realm-sync from v10.0.0-beta.10 to v10.0.0-beta.11 - -10.0.0-beta.4 Release notes (2020-08-28) -============================================================= - -### Enhancements - -* Add support for the 64-bit watchOS simulator added in Xcode 12. -* Add ability to stream change events on a remote MongoDB collection with - `[RLMMongoCollection watch:delegate:delegateQueue]`, - `MongoCollection.watch(delegate)`. When calling `watch(delegate)` you will be - given a `RLMChangeStream` (`ChangeStream`), this will be used to invalidate - and stop the streaming session by calling `[RLMChangeStream close]` - (`ChangeStream.close()`) when needed. -* Add `MongoCollection.watch`, which is a Combine publisher that will stream - change events each time the remote MongoDB collection is updated. -* Add ability to open a synced Realm with a `nil` partition value. - -### Fixed - -* Realm.Configuration.objectTypes now accepts embedded objects -* Ports fixes from 5.3.5 - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the v10.0.0-beta.x series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v10.0.0-beta.1 to v10.0.0-beta.6 -* Upgraded realm-sync from v10.0.0-beta.2 to v10.0.0-beta.10 - -10.0.0-beta.3 Release notes (2020-08-17) -============================================================= - -This release also contains all changes from 5.3.2. - -### Breaking Changes -* The following classes & aliases have been renamed to align Cocoa with the other Realm SDKs: - -| Old API | New API | -|:------------------------------------------------------------|:---------------------------------------------------------------| -| `RLMSyncUser` | `RLMUser` | -| `SyncUser` | `User` | -| `RLMAppCredential` | `RLMCredential` | -| `AppCredential` | `Credential` | -| `RealmApp` | `App` | -| `RLMUserAPIKeyProviderClient` | `RLMAPIKeyAuth` | -| `RLMUsernamePasswordProviderClient` | `RLMEmailPasswordAuth` | -| `UsernamePasswordProviderClient` | `EmailPasswordAuth` | -| `UserAPIKeyProviderClient` | `APIKeyAuth` | - -* The following functionality has also moved to the User - -| Old API | New API | -|:-------------------------------------------------------------|:--------------------------------------------------------------| -| `[RLMApp callFunctionNamed:]` | `[RLMUser callFunctionNamed:]` | -| `App.functions` | `User.functions` | -| `[RLMApp mongoClientWithServiceName:]` | `[RLMUser mongoClientWithServiceName:]` | -| `App.mongoClient(serviceName)` | `User.mongoClient(serviceName)` | -| `[RLMApp userAPIKeyProviderClient]` | `[RLMUser apiKeyAuth]` | -| `App.userAPIKeyProviderClient` | `App.apiKeyAuth()` | -| `[RLMApp logOut:]` | `[RLMUser logOut]` | -| `App.logOut(user)` | `User.logOut()` | -| `[RLMApp removeUser:]` | `[RLMUser remove]` | -| `App.remove(user)` | `User.remove()` | -| `[RLMApp linkUser:credentials:]` | `[RLMUser linkWithCredentials:]` | -| `App.linkUser(user, credentials)` | `User.link(credentials)` | - -* `refreshCustomData()` on User now returns void and passes the custom data to the callback on success. - -### Compatibility -* This release introduces breaking changes w.r.t some sync classes and MongoDB Realm Cloud functionality. -(See the breaking changes section for the full list) -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* Carthage release for Swift is built with Xcode 11.5. - -10.0.0-beta.2 Release notes (2020-06-09) -============================================================= -Xcode 11.3 and iOS 9 are now the minimum supported versions. - -### Enhancements -* Add support for building with Xcode 12 beta 1. watchOS currently requires - removing x86_64 from the supported architectures. Support for the new 64-bit - watch simulator will come in a future release. - -### Fixed -* Opening a SyncSession with LOCAL app deployments would not use the correct endpoints. -* Linking from embedded objects to top-level objects was incorrectly disallowed. -* Opening a Realm file in file format v6 (created by Realm Cocoa versions - between 2.4 and 2.10) would crash. (Since 5.0.0, [Core #3764](https://github.com/realm/realm-core/issues/3764)). -* Upgrading v9 (pre-5.0) Realm files would create a redundant search index for - primary key properties. This index would then be removed the next time the - Realm was opened, resulting in some extra i/o in the upgrade process. - (Since 5.0.0, [Core #3787](https://github.com/realm/realm-core/issues/3787)). -* Fixed a performance issue with upgrading v9 files with search indexes on - non-primary-key properties. (Since 5.0.0, [Core #3767](https://github.com/realm/realm-core/issues/3767)). - -### Compatibility -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 - -10.0.0-beta.1 Release notes (2020-06-08) -============================================================= - -NOTE: This version bumps the Realm file format to version 11. It is not -possible to downgrade to earlier versions. Older files will automatically be -upgraded to the new file format. Only [Realm Studio -10.0.0](https://github.com/realm/realm-studio/releases/tag/v10.0.0-beta.1) or -later will be able to open the new file format. - -### Enhancements - -* Add support for next generation sync. Support for syncing to MongoDB instead - of Realm Object Server. Applications must be created at realm.mongodb.com -* The memory mapping scheme for Realm files has changed to better support - opening very large files. -* Add support for the ObjectId data type. This is an automatically-generated - unique identifier similar to a GUID or a UUID. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for the Decimal128 data type. This is a 128-bit IEEE 754 decimal - floating point number similar to NSDecimalNumber. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for embedded objects. Embedded objects are objects which are - owned by a single parent object, and are deleted when that parent object is - deleted. They are defined by subclassing `EmbeddedObject` / - `RLMEmbeddedObject` rather than `Object` / `RLMObject`. -* Add `-[RLMSyncUser customData]`/`SyncUser.customData`. Custom data is - configured in your MongoDB Realm App. -* Add `-[RLMApp callFunctionNamed:arguments]`/`RealmApp.functions`. This is the - entry point for calling Remote MongoDB Realm functions. Functions allow you - to define and execute server-side logic for your application. Functions are - written in modern JavaScript (ES6+) and execute in a serverless manner. When - you call a function, you can dynamically access components of the current - application as well as information about the request to execute the function - and the logged in user that sent the request. -* Add `-[RLMApp mongoClientWithServiceName]`/`RealmApp.mongoClient`. This is - the entry point for calling your Remote MongoDB Service. The read operations - are `-[RLMMongoCollection findWhere:completion:]`, `-[RLMMongoCollection - countWhere:completion:]`and `-[RLMMongoCollection - aggregateWithPipeline:completion:]`. The write operations are - `-[RLMMongoCollection insertOneDocument:completion:]`, `-[RLMMongoCollection - insertManyDocuments:completion:]`, `-[RLMMongoCollection - updateOneDocument:completion:]`, `-[RLMMongoCollection - updateManyDocuments:completion:]`, `-[RLMMongoCollection - deleteOneDocument:completion:]`, and `-[RLMMongoCollection - deleteManyDocuments:completion:]`. If you are already familiar with MongoDB - drivers, it is important to understand that the remote MongoCollection only - provides access to the operations available in MongoDB Realm. -* Change `[RLMSyncUser - configurationWithPartitionValue:]`/`SyncUser.configuration(with:)` to accept - all BSON types. Partition values can currently be of types `String`, `Int`, - or `ObjectId`. Opening a realm by partition value is the equivalent of - previously opening a realm by URL. In this case, partitions are meant to be - more closely associated with your data. E.g., if you are running a `Dog` - kennel, and have a field `breed` that acts as your partition key, you could - open up realms based on the breed of the dogs. - -### Breaking Changes - -* We no longer support Realm Cloud (legacy), but instead the new "MongoDB - Realm" Cloud. MongoDB Realm is a serverless platform that enables developers - to quickly build applications without having to set up server infrastructure. - MongoDB Realm is built on top of MongoDB Atlas, automatically integrating the - connection to your database. -* Remove support for Query-based sync, including the configuration parameters - and the `RLMSyncSubscription` and `SyncSubscription` types ([#6437](https://github.com/realm/realm-swift/pull/6437)). -* Primary key properties are no longer marked as being indexed. This reflects - an internal change to how primary keys are handled that should not have any - other visible effects. ([#6440](https://github.com/realm/realm-swift/pull/6440)). -* Remove everything related to sync permissions, including both the path-based - permission system and the object-level privileges for query-based sync. ([#6445](https://github.com/realm/realm-swift/pulls/6445)) -* Primary key uniqueness is now enforced when creating new objects during - migrations, rather than only at the end of migrations. Previously new objects - could be created with duplicate primary keys during a migration as long as - the property was changed to a unique value before the end of the migration, - but now a unique value must be supplied when creating the object. -* Remove support for Realm Object Server. - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 - -5.5.0 Release notes (2020-10-12) -============================================================= - -### Enhancements - -* Add the ability to capture a NotificationToken when using a Combine publisher - that observes a Realm Object or Collection. The user will call - `saveToken(on:at:)` directly after invoking the publisher to use the feature. - -### Fixed - -* When using `Realm.write(withoutNotifying:)` there was a chance that the - supplied observation blocks would not be skipped when in a write transaction. - ([Object Store #1103](https://github.com/realm/realm-object-store/pull/1103)) -* Comparing two identical unmanaged `List<>`/`RLMArray` objects would fail. - ([#5665](https://github.com/realm/realm-swift/issues/5665)). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -5.4.8 Release notes (2020-10-05) -============================================================= - -### Fixed - -* Case-insensitive equality queries on indexed string properties failed to - clear some internal state when rerunning the query. This could manifest as - duplicate results or "key not found" errors. - ([#6830](https://github.com/realm/realm-swift/issues/6830), [#6694](https://github.com/realm/realm-swift/issues/6694), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v6.1.3 to v6.1.4 -* Upgraded realm-sync from v5.0.28 to v5.0.29 - -5.4.7 Release notes (2020-09-30) -============================================================= - -### Fixed - -* Equality queries on indexed string properties would sometimes throw "key not - found" exceptions if the hash of the string happened to have bit 62 set. - ([.NET #2025](https://github.com/realm/realm-dotnet/issues/2025), since v5.0.0). -* Queries comparing non-optional int properties to nil would behave as if they - were comparing against zero instead (since v5.0.0). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v6.1.2 to v6.1.3 -* Upgraded realm-sync from v5.0.27 to v5.0.28 - -5.4.6 Release notes (2020-09-29) -============================================================= - -5.4.5 failed to actually update the core version for installation methods other -than SPM. All changes listed there actually happened in this version for -non-SPM installation methods. - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-sync from v5.0.26 to v5.0.27 - -5.4.5 Release notes (2020-09-28) -============================================================= - -### Enhancements - -* Slightly (<5%) improve the performance of most operations which involve - reading from a Realm file. - -### Fixed - -* Rerunning a equality query on an indexed string property would give incorrect - results if a previous run of the query matched multiple objects and it now - matches one object. This could manifest as either finding a non-matching - object or a "key not found" exception being thrown. - ([#6536](https://github.com/realm/realm-swift/issues/6536), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v6.1.1 to v6.1.2 -* Upgraded realm-sync from v5.0.25 to v5.0.26 - -5.4.4 Release notes (2020-09-25) -============================================================= - -### Enhancements -* Improve the asymtotic performance of NOT IN queries on indexed properties. It - is now O(Number of Rows) rather than O(Number of Rows \* Number of values in IN clause.) - -### Fixed - -* Fix a crash inside `realm::Array(Type)::init_from_mem()` which would - sometimes occur when running a query over links immediately after creating - objects of the queried type. - ([#6789](https://github.com/realm/realm-swift/issues/6789) and possibly others, since 5.0.0). -* Possibly fix problems when changing the type of the primary key of an object - from optional to non-optional. - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v6.0.26 to v6.1.1 -* Upgraded realm-sync from v5.0.23 to v5.0.25 - -5.4.3 Release notes (2020-09-21) -============================================================= - -### Fixed - -* Fix compilation via Carthage when using Xcode 12 ([#6717](https://github.com/realm/realm-swift/issues/6717)). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.12 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -5.4.2 Release notes (2020-09-17) -============================================================= - -### Enhancements - -* Add prebuilt binary for Xcode 12 to the release package. - -### Fixed - -* Fix Archiving the Realm and RealmSwift frameworks with Xcode 12. - ([#6774](https://github.com/realm/realm-swift/issues/6774)) - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.12 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -5.4.1 Release notes (2020-09-16) -============================================================= - -### Enhancements - -* Add prebuilt binary for Xcode 11.7 to the release package. - -### Fixed - -* Fix deadlocks when opening a Realm file in both the iOS simulator and Realm - Studio ([#6743](https://github.com/realm/realm-swift/issues/6743), since 5.3.6). -* Fix Springboard deadlocking when an app is unsuspended while it has an open - Realm file which is stored in an app group on iOS 10-12 - ([#6749](https://github.com/realm/realm-swift/issues/6749), since 5.3.6). -* If you use encryption your application cound crash with a message like - "Opening Realm files of format version 0 is not supported by this version of - Realm". ([#6889](https://github.com/realm/realm-java/issues/6889) among others, since 5.0.0) -* Confining a Realm to a serial queue would throw an error claiming that the - queue was not a serial queue on iOS versions older than 12. - ([#6735](https://github.com/realm/realm-swift/issues/6735), since 5.0.0). -* Results would sometimes give stale results inside a write transaction if a - write which should have updated the Results was made before the first access - of a pre-existing Results object. - ([#6721](https://github.com/realm/realm-swift/issues/6721), since 5.0.0) - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.12 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.7. - -### Internal - -* Upgraded realm-core from v6.0.25 to v6.0.26 -* Upgraded realm-sync from v5.0.22 to v5.0.23 - -5.4.0 Release notes (2020-09-09) -============================================================= - -This version bumps the Realm file format version. This means that older -versions of Realm will be unable to open Realm files written by this version, -and a new version of Realm Studio will be required. There are no actual format -changes and the version bump is just to force a re-migration of incorrectly -upgraded Realms. - -### Fixed - -* Upgrading pre-5.x files with string primary keys would result in a file where - `realm.object(ofType:forPrimaryKey:)` would fail to find the object. - ([#6716](https://github.com/realm/realm-swift/issues/6716), since 5.2.0) -* A write transaction which modifies an object with more than 16 managed - properties and causes the Realm file to grow larger than 2 GB could cause an - assertion failure mentioning "m_has_refs". ([JS #3194](https://github.com/realm/realm-js/issues/3194), since 5.0.0). -* Objects with more than 32 properties could corrupt the Realm file and result - in a variety of crashes. ([Java #7057](https://github.com/realm/realm-java/issues/7057), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.12 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.23 to v6.0.25 -* Upgraded realm-sync from v5.0.20 to v5.0.22 - -5.3.6 Release notes (2020-09-02) -============================================================= - -### Fixed - -* Work around iOS 14 no longer allowing the use of file locks in shared - containers, which resulted in the OS killing an app which entered the - background while a Realm was open ([#6671](https://github.com/realm/realm-swift/issues/6671)). -* If an attempt to upgrade a realm has ended with a crash with "migrate_links()" - in the call stack, the realm was left in an invalid state. The migration - logic now handles this state and can complete upgrading files which were - incompletely upgraded by pre-5.3.4 versions. -* Fix deadlocks when writing to a Realm file on an exFAT partition from macOS. - ([#6691](https://github.com/realm/realm-swift/issues/6691)). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.19 to v6.0.23 -* Upgraded realm-sync from v5.0.16 to v5.0.20 - -5.3.5 Release notes (2020-08-20) -============================================================= - -### Fixed - -* Opening Realms on background threads could produce spurious Incorrect Thread - exceptions when a cached Realm existed for a previously existing thread with - the same thread ID as the current thread. - ([#6659](https://github.com/realm/realm-swift/issues/6659), - [#6689](https://github.com/realm/realm-swift/issues/6689), - [#6712](https://github.com/realm/realm-swift/issues/6712), since 5.0.0). -* Upgrading a table with incoming links but no properties would crash. This was - probably not possible to hit in practice as we reject object types with no - properties. -* Upgrading a non-nullable List which nonetheless contained null values would - crash. This was possible due to missing error-checking in some older versions - of Realm. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.18 to v6.0.19 -* Upgraded realm-sync from v5.0.15 to v5.0.16 - -5.3.4 Release notes (2020-08-17) -============================================================= - -### Fixed - -* Accessing a Realm after calling `deleteAll()` would sometimes throw an - exception with the reason 'ConstIterator copy failed'. ([#6597](https://github.com/realm/realm-swift/issues/6597), since 5.0.0). -* Fix an assertion failure inside the `migrate_links()` function when upgrading - a pre-5.0 Realm file. -* Fix a bug in memory mapping management. This bug could result in multiple - different asserts as well as segfaults. In many cases stack backtraces would - include members of the EncyptedFileMapping near the top - even if encryption - was not used at all. In other cases asserts or crashes would be in methods - reading an array header or array element. In all cases the application would - terminate immediately. ([Core #3838](https://github.com/realm/realm-core/pull/3838), since v5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.14 to v6.0.18 -* Upgraded realm-sync from v5.0.14 to v5.0.15 - -5.3.3 Release notes (2020-07-30) -============================================================= - -### Enhancements - -* Add support for the x86_64 watchOS simulator added in Xcode 12. - -### Fixed - -* (RLM)Results objects would incorrectly pin old read transaction versions - until they were accessed after a Realm was refreshed, resulting in the Realm - file growing to large sizes if a Results was retained but not accessed after - every write. ([#6677](https://github.com/realm/realm-swift/issues/6677), since 5.0.0). -* Fix linker errors when using SwiftUI previews with Xcode 12 when Realm was - installed via Swift Package Manager. ([#6625](https://github.com/realm/realm-swift/issues/6625)) - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.12 to v6.0.14 -* Upgraded realm-sync from v5.0.12 to v5.0.14 - -5.3.2 Release notes (2020-07-21) -============================================================= - -### Fixed - -* Fix a file format upgrade bug when opening older Realm files. Could cause - assertions like "Assertion failed: ref != 0" during opning of a Realm. - ([Core #6644](https://github.com/realm/realm-swift/issues/6644), since 5.2.0) -* A use-after-free would occur if a Realm was compacted, opened on multiple - threads prior to the first write, then written to while reads were happening - on other threads. This could result in a variety of crashes, often inside - realm::util::EncryptedFileMapping::read_barrier. - (Since v5.0.0, [#6626](https://github.com/realm/realm-swift/issues/6626), - [#6628](https://github.com/realm/realm-swift/issues/6628), - [#6652](https://github.com/realm/realm-swift/issues/6652), - [#6655](https://github.com/realm/realm-swift/issues/6555), - [#6656](https://github.com/realm/realm-swift/issues/6656)). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.11 to v6.0.12 -* Upgraded realm-sync from v5.0.11 to v5.0.12 - -5.3.1 Release notes (2020-07-17) -============================================================= - -### Enhancements - -* Add prebuilt binary for Xcode 11.6 to the release package. - -### Fixed - -* Creating an object inside migration which changed that object type's primary - key would hit an assertion failure mentioning primary_key_col - ([#6613](https://github.com/realm/realm-swift/issues/6613), since 5.0.0). -* Modifying the value of a string primary key property inside a migration with - a Realm file which was upgraded from pre-5.0 would corrupt the property's - index, typically resulting in crashes. ([Core #3765](https://github.com/realm/realm-core/issues/3765), since 5.0.0). -* Some Realm files which hit assertion failures when upgrading from the pre-5.0 - file format should now upgrade correctly (Since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.9 to v6.0.11 -* Upgraded realm-sync from v5.0.8 to v5.0.11 - -5.3.0 Release notes (2020-07-14) -============================================================= - -### Enhancements - -* Add `Realm.objectWillChange`, which is a Combine publisher that will emit a - notification each time the Realm is refreshed or a write transaction is - commited. - -### Fixed - -* Fix the spelling of `ObjectKeyIdentifiable`. The old spelling is available - and deprecated for compatibility. -* Rename `RealmCollection.publisher` to `RealmCollection.collectionPublisher`. - The old name interacted with the `publisher` defined by `Sequence` in very - confusing ways, so we need to use a different name. The `publisher` name is - still available for compatibility. ([#6516](https://github.com/realm/realm-swift/issues/6516)) -* Work around "xcodebuild timed out while trying to read - SwiftPackageManagerExample.xcodeproj" errors when installing Realm via - Carthage. ([#6549](https://github.com/realm/realm-swift/issues/6549)). -* Fix a performance regression when using change notifications. (Since 5.0.0, - [#6629](https://github.com/realm/realm-swift/issues/6629)). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v6.0.8 to v6.0.9 -* Upgraded realm-sync from v5.0.7 to v5.0.8 - -5.2.0 Release notes (2020-06-30) -============================================================= - -### Fixed -* Opening a SyncSession with LOCAL app deployments would not use the correct endpoints. -This release also contains all changes from 5.0.3 and 5.1.0. - -### Breaking Changes -* The following classes & aliases have been renamed to align Cocoa with the other Realm SDKs: - -| Old API | New API | -|:------------------------------------------------------------|:---------------------------------------------------------------| -| `RLMSyncUser` | `RLMUser` | -| `SyncUser` | `User` | -| `RLMAppCredential` | `RLMCredential` | -| `AppCredential` | `Credential` | -| `RealmApp` | `App` | -| `RLMUserAPIKeyProviderClient` | `RLMAPIKeyAuth` | -| `RLMUsernamePasswordProviderClient` | `RLMEmailPasswordAuth` | -| `UsernamePasswordProviderClient` | `EmailPasswordAuth` | -| `UserAPIKeyProviderClient` | `APIKeyAuth` | - -* The following functionality has also moved to the User: - -| Old API | New API | -|:-------------------------------------------------------------|:--------------------------------------------------------------| -| `[RLMApp callFunctionNamed:]` | `[RLMUser callFunctionNamed:]` | -| `App.functions` | `User.functions` | -| `[RLMApp mongoClientWithServiceName:]` | `[RLMUser mongoClientWithServiceName:]` | -| `App.mongoClient(serviceName)` | `User.mongoClient(serviceName)` | -| `[RLMApp userAPIKeyProviderClient]` | `[RLMUser apiKeyAuth]` | -| `App.userAPIKeyProviderClient` | `App.apiKeyAuth()` | -| `[RLMApp logOut:]` | `[RLMUser logOut]` | -| `App.logOut(user)` | `User.logOut()` | -| `[RLMApp removeUser:]` | `[RLMUser remove]` | -| `App.remove(user)` | `User.remove()` | -| `[RLMApp linkUser:credentials:]` | `[RLMUser linkWithCredentials:]` | -| `App.linkUser(user, credentials)` | `User.link(credentials)` | - -* The argument labels in Swift have changed for several methods: -| Old API | New API | -|:-------------------------------------------------------------|:--------------------------------------------------------------| -| `APIKeyAuth.createApiKey(withName:completion:)` | `APIKeyAuth.createApiKey(named:completion:)` | -| `App.login(withCredential:completion:) | `App.login(credentials:completion:)` | -| `App.pushClient(withServiceName:)` | `App.pushClient(serviceName:)` | -| `MongoClient.database(withName:)` | `MongoClient.database(named:)` | - -* `refreshCustomData()` on User now returns void and passes the custom data to the callback on success. - -### Compatibility -* This release introduces breaking changes w.r.t some sync classes and MongoDB Realm Cloud functionality. - (See the breaking changes section for the full list) -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* Realm Studio: 10.0.0 or later. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 - -10.0.0-beta.2 Release notes (2020-06-09) -============================================================= -Xcode 11.3 and iOS 9 are now the minimum supported versions. - -### Enhancements - -* Add support for building with Xcode 12 beta 1. watchOS currently requires - removing x86_64 from the supported architectures. Support for the new 64-bit - watch simulator will come in a future release. - -### Fixed -* Opening a SyncSession with LOCAL app deployments would not use the correct endpoints. -* Linking from embedded objects to top-level objects was incorrectly disallowed. - -* Opening a Realm file in file format v6 (created by Realm Cocoa versions - between 2.4 and 2.10) would crash. (Since 5.0.0, [Core #3764](https://github.com/realm/realm-core/issues/3764)). -* Upgrading v9 (pre-5.0) Realm files would create a redundant search index for - primary key properties. This index would then be removed the next time the - Realm was opened, resulting in some extra i/o in the upgrade process. - (Since 5.0.0, [Core #3787](https://github.com/realm/realm-core/issues/3787)). -* Fixed a performance issue with upgrading v9 files with search indexes on - non-primary-key properties. (Since 5.0.0, [Core #3767](https://github.com/realm/realm-core/issues/3767)). - -### Compatibility -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 - -10.0.0-beta.1 Release notes (2020-06-08) -============================================================= - -NOTE: This version bumps the Realm file format to version 11. It is not -possible to downgrade to earlier versions. Older files will automatically be -upgraded to the new file format. Only [Realm Studio -10.0.0](https://github.com/realm/realm-studio/releases/tag/v10.0.0-beta.1) or -later will be able to open the new file format. - -### Enhancements - -* Add support for next generation sync. Support for syncing to MongoDB instead - of Realm Object Server. Applications must be created at realm.mongodb.com -* The memory mapping scheme for Realm files has changed to better support - opening very large files. -* Add support for the ObjectId data type. This is an automatically-generated - unique identifier similar to a GUID or a UUID. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for the Decimal128 data type. This is a 128-bit IEEE 754 decimal - floating point number similar to NSDecimalNumber. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for embedded objects. Embedded objects are objects which are - owned by a single parent object, and are deleted when that parent object is - deleted. They are defined by subclassing `EmbeddedObject` / - `RLMEmbeddedObject` rather than `Object` / `RLMObject`. -* Add `-[RLMSyncUser customData]`/`SyncUser.customData`. Custom data is - configured in your MongoDB Realm App. -* Add `-[RLMApp callFunctionNamed:arguments]`/`RealmApp.functions`. This is the - entry point for calling Remote MongoDB Realm functions. Functions allow you - to define and execute server-side logic for your application. Functions are - written in modern JavaScript (ES6+) and execute in a serverless manner. When - you call a function, you can dynamically access components of the current - application as well as information about the request to execute the function - and the logged in user that sent the request. -* Add `-[RLMApp mongoClientWithServiceName]`/`RealmApp.mongoClient`. This is - the entry point for calling your Remote MongoDB Service. The read operations - are `-[RLMMongoCollection findWhere:completion:]`, `-[RLMMongoCollection - countWhere:completion:]`and `-[RLMMongoCollection - aggregateWithPipeline:completion:]`. The write operations are - `-[RLMMongoCollection insertOneDocument:completion:]`, `-[RLMMongoCollection - insertManyDocuments:completion:]`, `-[RLMMongoCollection - updateOneDocument:completion:]`, `-[RLMMongoCollection - updateManyDocuments:completion:]`, `-[RLMMongoCollection - deleteOneDocument:completion:]`, and `-[RLMMongoCollection - deleteManyDocuments:completion:]`. If you are already familiar with MongoDB - drivers, it is important to understand that the remote MongoCollection only - provides access to the operations available in MongoDB Realm. -* Change `[RLMSyncUser - configurationWithPartitionValue:]`/`SyncUser.configuration(with:)` to accept - all BSON types. Partition values can currently be of types `String`, `Int`, - or `ObjectId`. Opening a realm by partition value is the equivalent of - previously opening a realm by URL. In this case, partitions are meant to be - more closely associated with your data. E.g., if you are running a `Dog` - kennel, and have a field `breed` that acts as your partition key, you could - open up realms based on the breed of the dogs. - -### Breaking Changes - -* We no longer support Realm Cloud (legacy), but instead the new "MongoDB - Realm" Cloud. MongoDB Realm is a serverless platform that enables developers - to quickly build applications without having to set up server infrastructure. - MongoDB Realm is built on top of MongoDB Atlas, automatically integrating the - connection to your database. -* Remove support for Query-based sync, including the configuration parameters - and the `RLMSyncSubscription` and `SyncSubscription` types ([#6437](https://github.com/realm/realm-swift/pull/6437)). -* Primary key properties are no longer marked as being indexed. This reflects - an internal change to how primary keys are handled that should not have any - other visible effects. ([#6440](https://github.com/realm/realm-swift/pull/6440)). -* Remove everything related to sync permissions, including both the path-based - permission system and the object-level privileges for query-based sync. ([#6445](https://github.com/realm/realm-swift/pulls/6445)) -* Primary key uniqueness is now enforced when creating new objects during - migrations, rather than only at the end of migrations. Previously new objects - could be created with duplicate primary keys during a migration as long as - the property was changed to a unique value before the end of the migration, - but now a unique value must be supplied when creating the object. -* Remove support for Realm Object Server. - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* `List.index(of:)` would give incorrect results if it was the very first thing - called on that List after a Realm was refreshed following a write which - modified the List. (Since 5.0.0, [#6606](https://github.com/realm/realm-swift/issues/6606)). -* If a ThreadSafeReference was the only remaining reference to a Realm, - multiple copies of the file could end up mapped into memory at once. This - probably did not have any symptoms other than increased memory usage. (Since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 -* Upgraded realm-core from v6.0.6 to v6.0.7 -* Upgraded realm-sync from v5.0.5 to v5.0.6 -* Upgraded realm-core from v6.0.6 to v6.0.8 -* Upgraded realm-sync from v5.0.5 to v5.0.7 - -5.1.0 Release notes (2020-06-22) -============================================================= - -### Enhancements - -* Allow opening full-sync Realms in read-only mode. This disables local schema - initialization, which makes it possible to open a Realm which the user does - not have write access to without using asyncOpen. In addition, it will report - errors immediately when an operation would require writing to the Realm - rather than reporting it via the sync error handler only after the server - rejects the write. - -### Fixed - -* Opening a Realm using a configuration object read from an existing Realm - would incorrectly bind the new Realm to the original Realm's thread/queue, - resulting in "Realm accessed from incorrect thread." exceptions. - ([#6574](https://github.com/realm/realm-swift/issues/6574), - [#6559](https://github.com/realm/realm-swift/issues/6559), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -5.0.3 Release notes (2020-06-10) -============================================================= - -### Fixed - -* `-[RLMObject isFrozen]` always returned false. ([#6568](https://github.com/realm/realm-swift/issues/6568), since 5.0.0). -* Freezing an object within the write transaction that the object was created - in now throws an exception rather than crashing when the object is first - used. -* The schema for frozen Realms was not properly initialized, leading to crashes - when accessing a RLMLinkingObjects property. - ([#6568](https://github.com/realm/realm-swift/issues/6568), since 5.0.0). -* Observing `Object.isInvalidated` via a keypath literal would produce a - warning in Swift 5.2 due to the property not being marked as @objc. - ([#6554](https://github.com/realm/realm-swift/issues/6554)) - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -5.0.2 Release notes (2020-06-02) -============================================================= - -### Fixed - -* Fix errSecDuplicateItem (-25299) errors when opening a synchronized Realm - when upgrading from pre-5.0 versions of Realm. - ([#6538](https://github.com/realm/realm-swift/issues/6538), [#6494](https://github.com/realm/realm-swift/issues/6494), since 5.0.0). -* Opening Realms stored on filesystems which do not support preallocation (such - as ExFAT) would give "Operation not supported" exceptions. - ([#6508](https://github.com/realm/realm-swift/issues/6508), since 3.2.0). -* 'NoSuchTable' exceptions would sometimes be thrown after upgrading a Relam - file to the v10 format. ([Core #3701](https://github.com/realm/realm-core/issues/3701), since 5.0.0) -* If the upgrade process was interrupted/killed for various reasons, the - following run could stop with some assertions failing. No instances of this - happening were reported to us. (Since 5.0.0). -* Queries filtering a `List` where the query was on an indexed property over a - link would sometimes give incomplete results. - ([#6540](https://github.com/realm/realm-swift/issues/6540), since 4.1.0 but - more common since 5.0.0) -* Opening a file in read-only mode would attempt to make a spurious write to - the file, causing errors if the file was in read-only storage (since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v6.0.4 to v6.0.6 -* Upgraded realm-sync from v5.0.3 to v5.0.5 - -5.0.1 Release notes (2020-05-27) -============================================================= - -### Enhancements - -* Add prebuilt binary for Xcode 11.5 to the release package. - -### Fixed - -* Fix linker error when building a xcframework for Catalyst. - ([#6511](https://github.com/realm/realm-swift/issues/6511), since 4.3.1). -* Fix building for iOS devices when using Swift Package Manager - ([#6522](https://github.com/realm/realm-swift/issues/6522), since 5.0.0). -* `List` and `RealmOptional` properties on frozen objects were not initialized - correctly and would always report `nil` or an empty list. - ([#6527](https://github.com/realm/realm-swift/issues/6527), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -5.0.0 Release notes (2020-05-15) -============================================================= - -NOTE: This version bumps the Realm file format to version 10. It is not -possible to downgrade version 9 or earlier. Files created with older versions -of Realm will be automatically upgraded. Only -[Studio 3.11](https://github.com/realm/realm-studio/releases/tag/v3.11.0) or later will be able -to open the new file format. - -### Enhancements - -* Storing large binary blobs in Realm files no longer forces the file to be at - least 8x the size of the largest blob. -* Reduce the size of transaction logs stored inside the Realm file, reducing - file size growth from large transactions. -* Add support for frozen objects. `Realm`, `Results`, `List` and `Object` now - have `freeze()` methods which return a frozen copy of the object. These - objects behave similarly to creating unmanaged deep copies of the source - objects. They can be read from any thread and do not update when writes are - made to the Realm, but creating frozen objects does not actually copy data - out of the Realm and so can be much faster and use less memory. Frozen - objects cannot be mutated or observed for changes (as they never change). - ([PR #6427](https://github.com/realm/realm-swift/pull/6427)). -* Add the `isFrozen` property to `Realm`, `Results`, `List` and `Object`. -* Add `Realm.Configuration.maxNumberOfActiveVersions`. Each time a write - transaction is performed, a new version is created inside the Realm, and then - any versions which are no longer in use are cleaned up. If too many versions - are kept alive while performing writes (either due to a background thread - performing a long operation that doesn't let the Realm on that thread - refresh, or due to holding onto frozen versions for a long time) the Realm - file will grow in size, potentially to the point where it is too large to be - opened. Setting this configuration option will make write transactions which - would cause the live version count to exceed the limit to instead fail. -* Add support for queue-confined Realms. Rather than being bound to a specific - thread, queue-confined Realms are bound to a serial dispatch queue and can be - used within blocks dispatched to that queue regardless of what thread they - happen to run on. In addition, change notifications will be delivered to that - queue rather than the thread's run loop. ([PR #6478](https://github.com/realm/realm-swift/pull/6478)). -* Add an option to deliver object and collection notifications to a specific - serial queue rather than the current thread. ([PR #6478](https://github.com/realm/realm-swift/pull/6478)). -* Add Combine publishers for Realm types. Realm collections have a `.publisher` - property which publishes the collection each time it changes, and a - `.changesetPublisher` which publishes a `RealmCollectionChange` each time the - collection changes. Corresponding publishers for Realm Objects can be - obtained with the `publisher()` and `changesetPublisher()` global functions. -* Extend Combine publishers which output Realm types with a `.freeze()` - function which will make the publisher instead output frozen objects. -* String primary keys no longer require a separate index, improving insertion - and deletion performance without hurting lookup performance. -* Reduce the encrypted page reclaimer's impact on battery life when encryption - is used. ([Core #3461](https://github.com/realm/realm-core/pull/3461)). - -### Fixed - -* The uploaded bytes in sync progress notifications was sometimes incorrect and - wouldn't exactly equal the uploadable bytes when the uploaded completed. -* macOS binaries were built with the incorrect deployment target (10.14 rather - than 10.9), resulting in linker warnings. ([#6299](https://github.com/realm/realm-swift/issues/6299), since 3.18.0). -* An internal datastructure for List properties could be double-deleted if the - last reference was released from a thread other than the one which the List - was created on at the wrong time. This would typically manifest as - "pthread_mutex_destroy() failed", but could also result in other kinds of - crashes. ([#6333](https://github.com/realm/realm-swift/issues/6333)). -* Sorting on float or double properties containing NaN values had inconsistent - results and would sometimes crash due to out-of-bounds memory accesses. - ([#6357](https://github.com/realm/realm-swift/issues/6357)). - -### Breaking Changes - -* The ObjectChange type in Swift is now generic and includes a reference to the - object which changed. When using `observe(on:)` to receive notifications on a - dispatch queue, the object will be confined to that queue. -* The Realm instance passed in the callback to asyncOpen() is now confined to - the callback queue passed to asyncOpen() rather than the thread which the - callback happens to be called on. This means that the Realm instance may be - stored and reused in further blocks dispatched to that queue, but the queue - must now be a serial queue. -* Files containing Date properties written by version of Realm prior to 1.0 can - no longer be opened. -* Files containing Any properties can no longer be opened. This property type - was never documented and was deprecated in 1.0. -* Deleting objects now preserves the order of objects reported by unsorted - Results rather than performing a swap operation before the delete. Note that - it is still not safe to assume that the order of objects in an unsorted - Results is the order that the objects were created in. -* The minimum supported deployment target for iOS when using Swift Package - Manager to install Realm is now iOS 11. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.4.1. - -### Internal - -* Upgraded realm-core from v5.23.8 to v6.0.4 -* Upgraded realm-sync from v4.9.5 to v5.0.3 - -5.0.0-beta.6 Release notes (2020-05-08) -============================================================= - -### Enhancements - -* Add support for queue-confined Realms. Rather than being bound to a specific - thread, queue-confined Realms are bound to a serial dispatch queue and can be - used within blocks dispatched to that queue regardless of what thread they - happen to run on. In addition, change notifications will be delivered to that - queue rather than the thread's run loop. ([PR #6478](https://github.com/realm/realm-swift/pull/6478)). -* Add an option to deliver object and collection notifications to a specific - serial queue rather than the current thread. ([PR #6478](https://github.com/realm/realm-swift/pull/6478)). - -### Fixed - -* The uploaded bytes in sync progress notifications was sometimes incorrect and - wouldn't exactly equal the uploadable bytes when the uploaded completed. - -### Breaking Changes - -* The Realm instance passed in the callback to asyncOpen() is now confined to - the callback queue passed to asyncOpen() rather than the thread which the - callback happens to be called on. This means that the Realm instance may be - stored and reused in further blocks dispatched to that queue, but the queue - must now be a serial queue. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.4.1. - -### Internal - -* Upgraded realm-core from v6.0.3 to v6.0.4 -* Upgraded realm-sync from v5.0.1 to v5.0.3 - -4.4.1 Release notes (2020-04-16) -============================================================= - -### Enhancements - -* Upgrade Xcode 11.4 binaries to Xcode 11.4.1. - -### Fixed - -* Fix a "previous <= m_schema_transaction_version_max" assertion failure caused - by a race condition that could occur after performing a migration. (Since 3.0.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.4.1. - -5.0.0-beta.3 Release notes (2020-02-26) -============================================================= - -Based on 4.3.2 and also includes all changes since 4.3.0. - -### Enhancements - -* Add support for frozen objects. `Realm`, `Results`, `List` and `Object` now - have `freeze()` methods which return a frozen copy of the object. These - objects behave similarly to creating unmanaged deep copies of the source - objects. They can be read from any thread and do not update when writes are - made to the Realm, but creating frozen objects does not actually copy data - out of the Realm and so can be much faster and use less memory. Frozen - objects cannot be mutated or observed for changes (as they never change). - ([PR #6427](https://github.com/realm/realm-swift/pull/6427)). -* Add the `isFrozen` property to `Realm`, `Results`, `List` and `Object`. -* Add `Realm.Configuration.maxNumberOfActiveVersions`. Each time a write - transaction is performed, a new version is created inside the Realm, and then - any versions which are no longer in use are cleaned up. If too many versions - are kept alive while performing writes (either due to a background thread - performing a long operation that doesn't let the Realm on that thread - refresh, or due to holding onto frozen versions for a long time) the Realm - file will grow in size, potentially to the point where it is too large to be - opened. Setting this configuration option will make write transactions which - would cause the live version count to exceed the limit to instead fail. - - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-core from v6.0.0-beta.3 to v6.0.3 -* Upgraded realm-sync from v5.0.0-beta.2 to v5.0.1 - -5.0.0-beta.2 Release notes (2020-01-13) -============================================================= - -Based on 4.3.0 and also includes all changes since 4.1.1. - -### Fixed - -* Fix compilation when using CocoaPods targeting iOS versions older than 11 (since 5.0.0-alpha). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-core from v6.0.0-beta.2 to v6.0.0-beta.3 -* Upgraded realm-sync from v5.0.0-beta.1 to v5.0.0-beta.2 - -5.0.0-beta.1 Release notes (2019-12-13) -============================================================= - -Based on 4.1.1 and also includes all changes since 4.1.0. - -NOTE: This version bumps the Realm file format to version 10. It is not possible to downgrade version 9 or earlier. Files created with older versions of Realm will be automatically upgraded. - -### Enhancements - -* String primary keys no longer require a separate index, improving insertion - and deletion performance without hurting lookup performance. -* Reduce the encrypted page reclaimer's impact on battery life when encryption - is used. ([Core #3461](https://github.com/realm/realm-core/pull/3461)). - -### Fixed - -* Fix an error when a table-backed Results was accessed immediately after - deleting the object previously at the index being accessed (since - 5.0.0-alpha.1). -* macOS binaries were built with the incorrect deployment target (10.14 rather - than 10.9), resulting in linker warnings. ([#6299](https://github.com/realm/realm-swift/issues/6299), since 3.18.0). -* An internal datastructure for List properties could be double-deleted if the - last reference was released from a thread other than the one which the List - was created on at the wrong time. This would typically manifest as - "pthread_mutex_destroy() failed", but could also result in other kinds of - crashes. ([#6333](https://github.com/realm/realm-swift/issues/6333)). -* Sorting on float or double properties containing NaN values had inconsistent - results and would sometimes crash due to out-of-bounds memory accesses. - ([#6357](https://github.com/realm/realm-swift/issues/6357)). - -### Known Issues - -* Changing which property of an object is the primary key in a migration will - break incoming links to objects of that type. -* Changing the primary key of an object with Data properties in a migration - will crash. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-core from v6.0.0-alpha.24 to v6.0.0-beta.2 -* Upgraded realm-sync from 4.7.1-core6.5 to v5.0.0-beta.1 - -5.0.0-alpha.1 Release notes (2019-11-14) -============================================================= - -Based on 4.1.0. - -### Enhancements - -* Add `-[RLMRealm fileExistsForConfiguration:]`/`Realm.fileExists(for:)`, - which checks if a local Realm file exists for the given configuration. -* Add `-[RLMRealm deleteFilesForConfiguration:]`/`Realm.deleteFiles(for:)` - to delete the Realm file and all auxiliary files for the given configuration. -* Storing large binary blobs in Realm files no longer forces the file to be at - least 8x the size of the largest blob. -* Reduce the size of transaction logs stored inside the Realm file, reducing - file size growth from large transactions. - -NOTE: This version bumps the Realm file format to version 10. It is not -possible to downgrade version 9 or earlier. Files created with older versions -of Realm will be automatically upgraded. This automatic upgrade process is not -yet well tested. Do not open Realm files with data you care about with this -alpha version. - -### Breaking Changes - -* Files containing Date properties written by version of Realm prior to 1.0 can - no longer be opened. -* Files containing Any properties can no longer be opened. This property type - was never documented and was deprecated in 1.0. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades v9) -* Realm Object Server: 3.21.0 or later. -* APIs are backwards compatible with all previous releases in the 4.x.y series. -* Carthage release for Swift is built with Xcode 11.3. -* Carthage release for Swift is built with Xcode 11.2.1. - -### Internal - -* Upgraded realm-core from 5.23.6 to v6.0.0-alpha.24. -* Upgraded realm-sync from 4.8.2 to 4.7.1-core6.5. - -4.4.0 Release notes (2020-03-26) -============================================================= - -Swift 4.0 and Xcode 10.3 are now the minimum supported versions. - -### Enhancements - -* Allow setting the `fileUrl` for synchronized Realms. An appropriate local - path based on the sync URL will still be used if it is not overridden. - ([PR #6454](https://github.com/realm/realm-swift/pull/6454)). -* Add Xcode 11.4 binaries to the release package. - -### Fixed - -* None. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.4. - -4.3.2 Release notes (2020-02-06) -============================================================= - -### Enhancements - -* Similar to `autoreleasepool()`, `realm.write()` now returns the value which - the block passed to it returns. Returning `Void` from the block is still allowed. - -### Fixed - -* Fix a memory leak attributed to `property_copyAttributeList` the first time a - Realm is opened when using Realm Swift. ([#6409](https://github.com/realm/realm-swift/issues/6409), since 4.0.0). -* Connecting to a `realms:` sync URL would crash at runtime on iOS 11 (and no - other iOS versions) inside the SSL validation code. (Since 4.3.1). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-sync from 4.9.4 to 4.9.5. - -4.3.1 Release notes (2020-01-16) -============================================================= - -### Enhancements - -* Reduce the encrypted page reclaimer's impact on battery life when encryption - is used. ([Core #3461](https://github.com/realm/realm-core/pull/3461)). - -### Fixed - -* macOS binaries were built with the incorrect deployment target (10.14 rather - than 10.9), resulting in linker warnings. ([#6299](https://github.com/realm/realm-swift/issues/6299), since 3.18.0). -* An internal datastructure for List properties could be double-deleted if the - last reference was released from a thread other than the one which the List - was created on at the wrong time. This would typically manifest as - "pthread_mutex_destroy() failed", but could also result in other kinds of - crashes. ([#6333](https://github.com/realm/realm-swift/issues/6333)). -* Sorting on float or double properties containing NaN values had inconsistent - results and would sometimes crash due to out-of-bounds memory accesses. - ([#6357](https://github.com/realm/realm-swift/issues/6357)). -* A NOT query on a `List` which happened to have the objects in a - different order than the underlying table would sometimes include the object - immediately before an object which matches the query. ([#6289](https://github.com/realm/realm-swift/issues/6289), since 0.90.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-core from 5.23.6 to 5.23.8. -* Upgraded realm-sync from 4.9.0 to 4.9.4. - -4.3.0 Release notes (2019-12-19) -============================================================= - -### Enhancements - -* Add the ability to set a custom logger function on `RLMSyncManager` which is - called instead of the default NSLog-based logger. -* Expose configuration options for the various types of sync connection - timeouts and heartbeat intervals on `RLMSyncManager`. -* Add an option to have `Realm.asyncOpen()` report an error if the connection - times out rather than swallowing the error and attempting to reconnect until - it succeeds. - -### Fixed - -* Fix a crash when using value(forKey:) on a LinkingObjects property (including - when doing so indirectly, such as by querying on that property). - ([#6366](https://github.com/realm/realm-swift/issues/6366), since 4.0.0). -* Fix a rare crash in `ClientHistoryImpl::integrate_server_changesets()` which - would only happen in Debug builds (since v3.0.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-sync from 4.8.2 to 4.9.0. - -4.2.0 Release notes (2019-12-16) -============================================================= - -### Enhancements - -* Add `-[RLMRealm fileExistsForConfiguration:]`/`Realm.fileExists(for:)`, - which checks if a local Realm file exists for the given configuration. -* Add `-[RLMRealm deleteFilesForConfiguration:]`/`Realm.deleteFiles(for:)` - to delete the Realm file and all auxiliary files for the given configuration. - -### Fixed - -* None. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.3. - -4.1.1 Release notes (2019-11-18) -============================================================= - -### Fixed - -* The UpdatePolicy passed to `realm.add()` or `realm.create()` was not properly - propagated when adding objects within a `List`, which could result in - spurious change notifications when using `.modified`. - ([#6321](https://github.com/realm/realm-swift/issues/6321), since v3.16.0) -* Fix a rare deadlock when a Realm collection or object was observed, then - `refresh()` was explicitly called, and then the NotificationToken from the - observation was destroyed on a different thread (since 0.98.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.2. - -4.1.0 Release notes (2019-11-13) -============================================================= - -### Enhancements - -* Improve performance of queries over a link where the final target property - has an index. -* Restore support for storing `@objc enum` properties on RealmSwift.Object - subclasses (broken in 4.0.0), and add support for storing them in - RealmOptional properties. - -### Fixed - -* The sync client would fail to reconnect after failing to integrate a - changeset. The bug would lead to further corruption of the client’s Realm - file. ([RSYNC-48](https://jira.mongodb.org/browse/RSYNC-48), since v3.2.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.2. - -### Internal - -* Upgraded realm-core from 5.23.5 to 5.23.6. -* Upgraded realm-sync from 4.7.11 to 4.8.2 - -4.0.0 Release notes (2019-11-08) -============================================================= - -### Breaking Changes - -* All previously deprecated functionality has now been removed entirely. -* The schema discovery logic for RealmSwift.Object subclasses has been - rewritten in Swift. This should not have any effect on valid class - definitions, but there may be types of invalid definitions which previously - worked by coincidence and no longer do. -* `SyncSubscription` no longer has a generic type parameter, as the type was - not actually used for anything. -* The following Swift types have changed from `final class` to `struct`: - - AnyRealmCollection - - LinkingObjects - - ObjectiveCSupport - - Realm - - Results - - SyncSubscription - - ThreadSafeReference - There is no intended change in semantics from this, but certain edge cases - may behave differently. -* The designated initializers defined by RLMObject and Object other than - zero-argument `init` have been replaced with convenience initializers. -* The implementation of the path-based permissions API has been redesigned to - accomodate changes to the server. This should be mostly a transparent change, - with two main exceptions: - 1. SyncPermission objects are no longer live Realm objects, and retrieving - permissions gives an Array rather than Results. - Getting up-to-date permissions now requires calling retrievePermissions() again - rather than observing the permissions. - 2. The error codes for permissions functions have changed. Rather than a - separate error type and set of error codes, permission functions now produce - SyncAuthErrors. - -### Enhancements - -* Improve performance of initializing Realm objects with List properties. - -### Fixed - -* None. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.2. - -3.21.0 Release notes (2019-11-04) -============================================================= - -### Enhancements - -* Add prebuilt binaries for Xcode 11.2. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.2. - -3.20.0 Release notes (2019-10-21) -============================================================= - -### Enhancements - -* Add support for custom refresh token authentication. This allows a user to be - authorized with an externally-issued refresh token when ROS is configured to - recognize the external issuer as a refresh token validator. - ([PR #6311](https://github.com/realm/realm-swift/pull/6311)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11. - -3.19.1 Release notes (2019-10-17) -============================================================= - -### Enhancements - -* Improve performance of sync changeset integration. Transactions involving a - very large number of objects and cheap operations on each object are as much - as 20% faster. - -### Fixed - -* Fix a crash when a RLMArray/List of primitives was observed and then the - containing object was deleted before the first time that the background - notifier could run. - ([Issue #6234](https://github.com/realm/realm-swift/issues/6234, since 3.0.0)). -* Remove an incorrect assertion that would cause crashes inside - `TableInfoCache::get_table_info()`, with messages like "Assertion failed: info.object_id_index == 0 [3, 0]". - (Since 3.18.0, [#6268](https://github.com/realm/realm-swift/issues/6268) and [#6257](https://github.com/realm/realm-swift/issues/6257)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.0. - -### Internal - -* Upgrade to REALM_SYNC_VERSION=4.7.11 - -3.19.0 Release notes (2019-09-27) -============================================================= - -### Enhancements - -* Expose ObjectSchema.objectClass in Swift as looking up the class via - NSClassFromString() can be complicated for Swift types. - ([PR #6244](https://github.com/realm/realm-swift/pull/6244)). -* Add support for suppressing notifications using closure-based write/transaction methods. - ([PR #6252](https://github.com/realm/realm-swift/pull/6252)). - -### Fixed - -* IN or chained OR equals queries on an unindexed string column would fail to - match some results if any of the strings were 64 bytes or longer. - ([Core #3386](https://github.com/realm/realm-core/pull/3386), since 3.14.2). -* Query Based Sync subscriptions for queries involving a null timestamp were - not sent to the server correctly and would match no objects. - ([Core #3389](https://github.com/realm/realm-core/pull/3388), since 3.17.3). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.0. - -### Internal - -* Upgrade to REALM_CORE_VERSION=5.23.5 -* Upgrade to REALM_SYNC_VERSION=4.7.8 - -3.18.0 Release notes (2019-09-13) -============================================================= - -The file format for synchronized Realms has changed. Old Realms will be -automatically upgraded when they are opened. Once upgraded, the files will not -be openable by older versions of Realm. The upgrade should not take a -significant amount of time to run or run any risk of errors. - -This does not effect non-synchronized Realms. - -### Enhancements - -* Improve performance of queries on Date properties - ([Core #3344](https://github.com/realm/realm-core/pull/3344), [Core #3351](https://github.com/realm/realm-core/pull/3351)). -* Syncronized Realms are now more aggressive about trimming local history that - is no longer needed. This should reduce file size growth in write-heavy - workloads. ([Sync #3007](https://github.com/realm/realm-sync/issues/3007)). -* Add support for building Realm as an xcframework. - ([PR #6238](https://github.com/realm/realm-swift/pull/6238)). -* Add prebuilt libraries for Xcode 11 to the release package. - ([PR #6248](https://github.com/realm/realm-swift/pull/6248)). -* Add a prebuilt library for Catalyst/UIKit For Mac to the release package - ([PR #6248](https://github.com/realm/realm-swift/pull/6248)). - -### Fixed - -* If a signal interrupted a msync() call, Realm would throw an exception and - the write transaction would fail. This behavior has new been changed to retry - the system call instead. ([Core #3352](https://github.com/realm/realm-core/issues/3352)) -* Queries on the sum or average of an integer property would sometimes give - incorrect results. ([Core #3356](https://github.com/realm/realm-core/pull/3356)). -* Opening query-based synchronized Realms with a small number of subscriptions - performed an unneccesary write transaction. ([ObjectStore #815](https://github.com/realm/realm-object-store/pull/815)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.0 - -### Deprecations - -* `RLMIdentityProviderNickname` has been deprecated in favor of `RLMIdentityProviderUsernamePassword`. -* `+[RLMIdentityProvider credentialsWithNickname]` has been deprecated in favor of `+[RLMIdentityProvider credentialsWithUsername]`. -* `Sync.nickname(String, Bool)` has been deprecated in favor of `Sync.usernamePassword(String, String, Bool)`. - -3.17.3 Release notes (2019-07-24) -============================================================= - -### Enhancements - -* Add Xcode 10.3 binaries to the release package. Remove the Xcode 9.2 and 9.3 binaries. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.3. - -3.17.1 Release notes (2019-07-10) -============================================================= - -### Enhancements - -* Add support for canceling asynchronous opens using a new AsyncOpenTask - returned from the asyncOpen() call. ([PR #6193](https://github.com/realm/realm-swift/pull/6193)). -* Importing the Realm SPM package can now be done by pinning to a version - rather than a branch. - -### Fixed - -* Queries on a List/RLMArray which checked an indexed int property would - sometimes give incorrect results. - ([#6154](https://github.com/realm/realm-swift/issues/6154)), since v3.15.0) -* Queries involving an indexed int property had a memory leak if run multiple - times. ([#6186](https://github.com/realm/realm-swift/issues/6186)), since v3.15.0) -* Creating a subscription with `includeLinkingObjects:` performed unneccesary - comparisons, making it extremely slow when large numbers of objects were - involved. ([Core #3311](https://github.com/realm/realm-core/issues/3311), since v3.15.0) - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.17.0 Release notes (2019-06-28) -============================================================= - -### Enhancements - -* Add support for including Realm via Swift Package Manager. This currently - requires depending on the branch "master" rather than pinning to a version - (i.e. `.package(url: "https://github.com/realm/realm-swift", .branch("master"))`). - ([#6187](https://github.com/realm/realm-swift/pull/6187)). -* Add Codable conformance to RealmOptional and List, and Encodable conformance to Results. - ([PR #6172](https://github.com/realm/realm-swift/pull/6172)). - -### Fixed - -* Attempting to observe an unmanaged LinkingObjects object crashed rather than - throwing an approriate exception (since v0.100.0). -* Opening an encrypted Realm could potentially report that a valid file was - corrupted if the system was low on free memory. - (since 3.14.0, [Core #3267](https://github.com/realm/realm-core/issues/3267)) -* Calling `Realm.asyncOpen()` on multiple Realms at once would sometimes crash - due to a `FileNotFound` exception being thrown on a background worker thread. - (since 3.16.0, [ObjectStore #806](https://github.com/realm/realm-object-store/pull/806)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.16.2 Release notes (2019-06-14) -============================================================= - -### Enhancements - -* Add support for Xcode 11 Beta 1. Xcode betas are only supported when building - from source, and not when using a prebuilt framework. - ([PR #6164](https://github.com/realm/realm-swift/pull/6164)). - -### Fixed - -* Using asyncOpen on query-based Realms which didn't already exist on the local - device would fail with error 214. - ([#6178](https://github.com/realm/realm-swift/issues/6178), since 3.16.0). -* asyncOpen on query-based Realms did not wait for the server-created - permission objects to be downloaded, resulting in crashes if modifications to - the permissions were made before creating a subscription for the first time (since 3.0.0). -* EINTR was not handled correctly in the notification worker, which may have - resulted in inconsistent and rare assertion failures in - `ExternalCommitHelper::listen()` when building with assertions enabled. - (PR: [#804](https://github.com/realm/realm-object-store/pull/804), since 0.91.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.16.1 Release notes (2019-05-31) -============================================================= - -### Fixed - -* The static type passed at compile time to `realm.create()` was checked for a - primary key rather than the actual type passed at runtime, resulting in - exceptions like "''RealmSwiftObject' does not have a primary key and can not - be updated'" being thrown even if the object type being created has a primary - key. (since 3.16.0, [#6159](https://github.com/realm/realm-swift/issues/6159)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.16.0 Release notes (2019-05-29) -============================================================= - -### Enhancements - -* Add an option to only set the properties which have values different from the - existing ones when updating an existing object with - `Realm.create()`/`-[RLMObject createOrUpdateInRealm:withValue:]`. This makes - notifications report only the properties which have actually changed, and - improves Object Server performance by reducing the number of operations to - merge. (Issue: [#5970](https://github.com/realm/realm-swift/issues/5970), - PR: [#6149](https://github.com/realm/realm-swift/pull/6149)). -* Using `-[RLMRealm asyncOpenWithConfiguration:callbackQueue:]`/`Realm.asyncOpen()` to open a - synchronized Realm which does not exist on the local device now uses an - optimized transfer method to download the initial data for the Realm, greatly - speeding up the first start time for applications which use full - synchronization. This is currently not applicable to query-based - synchronization. (PR: [#6106](https://github.com/realm/realm-swift/pull/6106)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.15.0 Release notes (2019-05-06) -============================================================= - -The minimum version of Realm Object Server has been increased to 3.21.0 and -attempting to connect to older versions will produce protocol mismatch errors. -Realm Cloud has already been upgraded to this version, and users using that do -not need to worry about this. - -### Enhancements - -* Add `createdAt`, `updatedAt`, `expiresAt` and `timeToLive` properties to - `RLMSyncSubscription`/`SyncSubscription`. These properties will be `nil` for - subscriptions created with older versions of Realm, but will be automatically - populated for newly-created subscriptions. -* Add support for transient subscriptions by setting the `timeToLive` when - creating the subscription. The next time a subscription is created or updated - after that time has elapsed the subscription will be automatically removed. -* Add support for updating existing subscriptions with a new query or limit. - This is done by passing `update: true` (in swift) or setting - `options.overwriteExisting = YES` (in obj-c) when creating the subscription, - which will make it update the existing subscription with the same name rather - than failing if one already exists with that name. -* Add an option to include the objects from - `RLMLinkingObjects`/`LinkingObjects` properties in sync subscriptions, - similarly to how `RLMArray`/`List` automatically pull in the contained - objects. -* Improve query performance for chains of OR conditions (or an IN condition) on - an unindexed integer or string property. - ([Core PR #2888](https://github.com/realm/realm-core/pull/2888) and - [Core PR #3250](https://github.com/realm/realm-core/pull/3250)). -* Improve query performance for equality conditions on indexed integer properties. - ([Core PR #3272](https://github.com/realm/realm-core/pull/3272)). -* Adjust the file allocation algorithm to reduce fragmentation caused by large - numbers of small blocks. -* Improve file allocator logic to reduce fragmentation and improve commit - performance after many writes. ([Core PR #3278](https://github.com/realm/realm-core/pull/3278)). - -### Fixed - -* Making a query that compares two integer properties could cause a - segmentation fault on x86 (i.e. macOS only). - ([Core PR #3253](https://github.com/realm/realm-core/pull/3256)). -* The `downloadable_bytes` parameter passed to sync progress callbacks reported - a value which correlated to the amount of data left to download, but not - actually the number of bytes which would be downloaded. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.14.2 Release notes (2019-04-25) -============================================================= - -### Enhancements - -* Updating `RLMSyncManager.customRequestHeaders` will immediately update all - currently active sync session with the new headers rather than requiring - manually closing the Realm and reopening it. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.14.1 Release notes (2019-04-04) -============================================================= - -### Fixed - -* Fix "Cannot find interface declaration for 'RealmSwiftObject', superclass of - 'MyRealmObjectClass'" errors when building for a simulator with Xcode 10.2 - with "Install Objective-C Compatibility Header" enabled. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. -* Carthage release for Swift is built with Xcode 10.2. - -3.14.0 Release notes (2019-03-27) -============================================================= - -### Enhancements - -* Reduce memory usage when committing write transactions. -* Improve performance of compacting encrypted Realm files. - ([PR #3221](https://github.com/realm/realm-core/pull/3221)). -* Add a Xcode 10.2 build to the release package. - -### Fixed - -* Fix a memory leak whenever Realm makes a HTTP(s) request to the Realm Object - Server (Issue [#6058](https://github.com/realm/realm-swift/issues/6058), since 3.8.0). -* Fix an assertion failure when creating an object in a synchronized Realm - after creating an object with a null int primary key in the same write - transaction. - ([PR #3227](https://github.com/realm/realm-core/pull/3227)). -* Fix some new warnings when building with Xcode 10.2 beta. -* Properly clean up sync sessions when the last Realm object using the session - is deallocated while the session is explicitly suspended (since 3.9.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. -* Carthage release for Swift is built with Xcode 10.2. - -### Internal - -* Throw an exception rather than crashing with an assertion failure in more - cases when opening invalid Realm files. -* Upgrade to REALM_CORE_VERSION=5.14.0 -* Upgrade to REALM_SYNC_VERSION=3.15.1 - -3.13.1 Release notes (2019-01-03) -============================================================= - -### Fixed - -* Fix a crash when iterating over `Realm.subscriptions()` using for-in. - (Since 3.13.0, PR [#6050](https://github.com/realm/realm-swift/pull/6050)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -3.13.0 Release notes (2018-12-14) -============================================================= - -### Enhancements - -* Add `Realm.subscriptions()`/`-[RLMRealm subscriptions]` and - `Realm.subscription(named:)`/`-[RLMRealm subscriptionWithName:]` to enable - looking up existing query-based sync subscriptions. - (PR: https://github.com/realm/realm-swift/pull/6029). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -3.12.0 Release notes (2018-11-26) -============================================================= - -### Enhancements - -* Add a User-Agent header to HTTP requests made to the Realm Object Server. By - default, this contains information about the Realm library version and your - app's bundle ID. The application identifier can be customized by setting - `RLMSyncManager.sharedManager.userAgent`/`SyncManager.shared.userAgent` prior - to opening a synchronized Realm. - (PR: https://github.com/realm/realm-swift/pull/6007). -* Add Xcode 10.1 binary to the prebuilt package. - -### Fixed - -* None. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -### Internal - -* None. - - -3.11.2 Release notes (2018-11-15) -============================================================= - -### Enhancements - -* Improve the performance of the merge algorithm used for integrating remote - changes from the server. In particular, changesets involving many objects - which all link to a single object should be greatly improved. - -### Fixed - -* Fix a memory leak when removing notification blocks from collections. - PR: [#702](https://github.com/realm/realm-object-store/pull/702), since 1.1.0. -* Fix re-sorting or distincting an already-sorted Results using values from - linked objects. Previously the unsorted order was used to read the values - from the linked objects. - PR [#3102](https://github.com/realm/realm-core/pull/3102), since 3.1.0. -* Fix a set of bugs which could lead to bad changeset assertions when using - sync. The assertions would look something like the following: - `[realm-core-5.10.0] Assertion failed: ndx < size() with (ndx, size()) = [742, 742]`. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -### Internal - -* None. - - -3.11.1 Release notes (2018-10-19) -============================================================= - -### Enhancements - -* None. - -### Fixed - -* Fix `SyncUser.requestEmailConfirmation` not triggering the email confirmation - flow on ROS. (PR [#5953](https://github.com/realm/realm-swift/pull/5953), since 3.5.0) -* Add some missing validation in the getters and setters of properties on - managed Realm objects, which would sometimes result in an application - crashing with a segfault rather than the appropriate exception being thrown - when trying to write to an object which has been deleted. - (PR [#5952](https://github.com/realm/realm-swift/pull/5952), since 2.8.0) - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -### Internal - -* None. - - -3.11.0 Release notes (2018-10-04) -============================================================= - -### Enhancements -* Reduce memory usage when integrating synchronized changes sent by ROS. -* Devices will now report download progress for read-only Realms, allowing the - server to compact Realms more aggressively and reducing the amount of - server-side storage space required. - -### Fixed -* Fix a crash when adding an object with a non-`@objc` `String?` property which - has not been explicitly ignored to a Realm on watchOS 5 (and possibly other - platforms when building with Xcode 10). - (Issue: [5929](https://github.com/realm/realm-swift/issues/5929)). -* Fix some merge algorithm bugs which could result in `BadChangesetError` - being thrown when integrating changes sent by the server. - -### Compatibility -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* **NOTE!!! - You will need to upgrade your Realm Object Server to at least version 3.11.0 - or use [Realm Cloud](https://cloud.realm.io). - If you try to connect to a ROS v3.10.x or previous, you will see an error - like `Wrong protocol version in Sync HTTP request, client protocol version = 25, - server protocol version = 24`.** - -### Internal -* Update to Sync 3.12.2. - - -3.10.0 Release notes (2018-09-19) -============================================================= - -Prebuilt binaries are now built for Xcode 9.2, 9.3, 9.4 and 10.0. - -Older versions of Xcode are still supported when building from source, but you -should be migrating to at least Xcode 9.2 as soon as possible. - -### Enhancements - -* Add support for Watch Series 4 by adding an arm64_32 slice to the library. - -3.9.0 Release notes (2018-09-10) -============================================================= - -### Enhancements - -* Expose RLMSyncUser.refreshToken publicly so that it can be used for custom - HTTP requests to Realm Object Server. -* Add RLMSyncSession.connectionState, which reports whether the session is - currently connected to the Realm Object Server or if it is offline. -* Add `-suspend` and `-resume` methods to `RLMSyncSession` to enable manually - pausing data synchronization. -* Add support for limiting the number of objects matched by a query-based sync - subscription. This requires a server running ROS 3.10.1 or newer. - -### Bugfixes - -* Fix crash when getting the description of a `MigrationObject` which has - `List` properties. -* Fix crash when calling `dynamicList()` on a `MigrationObject`. - -3.8.0 Release notes (2018-09-05) -============================================================= - -### Enhancements - -* Remove some old and no longer applicable migration logic which created an - unencrypted file in the sync metadata directory containing a list of ROS URLs - connected to. -* Add support for pinning SSL certificates used for https and realms - connections by setting `RLMSyncManager.sharedManager.pinnedCertificatePaths` - in obj-c and `SyncManager.shared.pinnedCertificatePaths` in Swift. - -### Bugfixes - -* Fix warnings when building Realm as a static framework with CocoaPods. - -3.7.6 Release notes (2018-08-08) -============================================================= - -### Enhancements - -* Speed up the actual compaction when using compact-on-launch. -* Reduce memory usage when locally merging changes from sync. -* When first connecting to a server, wait to begin uploading changes until - after all changes have been downloaded to reduce the server-side load for - query-based sync. - -3.7.5 Release notes (2018-07-23) -============================================================= - -### Enhancements - -* Improve performance of applying remote changesets from sync. -* Improve performance of creating objects with string primary keys. -* Improve performance of large write transactions. -* Adjust file space allocation strategy to reduce fragmentation, producing - smaller Realm files and typically better performance. -* Close network connections immediately when a sync session is destroyed. -* Report more information in `InvalidDatabase` exceptions. - -### Bugfixes - -* Fix permission denied errors for RLMPlatform.h when building with CocoaPods - and Xcode 10 beta 3. -* Fix a use-after-free when canceling a write transaction which could result in - incorrect "before" values in KVO observations (typically `nil` when a non-nil - value is expected). -* Fix several bugs in the merge algorithm that could lead to memory corruption - and crashes with errors like "bad changeset" and "unreachable code". - -3.7.4 Release notes (2018-06-19) -============================================================= - -### Bugfixes - -* Fix a bug which could potentially flood Realm Object Server with PING - messages after a client device comes back online. - -3.7.3 Release notes (2018-06-18) -============================================================= - -### Enhancements - -* Avoid performing potentially large amounts of pointless background work for - LinkingObjects instances which are accessed and then not immediate deallocated. - -### Bugfixes - -* Fix crashes which could result from extremely fragmented Realm files. -* Fix a bug that could result in a crash with the message "bad changeset error" - when merging changesets from the server. - -3.7.2 Release notes (2018-06-13) -============================================================= - -### Enhancements - -* Add some additional consistency checks that will hopefully produce better - errors when the "prev_ref + prev_size <= ref" assertion failure occurs. - -### Bugfixes - -* Fix a problem in the changeset indexing algorithm that would sometimes - cause "bad permission object" and "bad changeset" errors. -* Fix a large number of linking warnings about symbol visibility by aligning - compiler flags used. -* Fix large increase in size of files produced by `Realm.writeCopy()` introduced in 3.6.0. - -3.7.1 Release notes (2018-06-07) -============================================================= - -* Add support for compiling Realm Swift with Xcode 10 beta 1. - -3.7.0 Release notes (2018-06-06) -============================================================= - -The feature known as Partial Sync has been renamed to Query-based -Synchronization. This has impacted a number of API's. See below for the -details. - -### Deprecations - -* `+[RLMSyncConfiguration initWithUser] has been deprecated in favor of `-[RLMSyncUser configurationWithURL:url]. -* `+[RLMSyncConfiguration automaticConfiguration] has been deprecated in favor of `-[RLMSyncUser configuration]. -* `+[RLMSyncConfiguration automaticConfigurationForUser] has been deprecated in favor of `-[RLMSyncUser configuration]. -* `-[RLMSyncConfiguration isPartial] has been deprecated in favor of `-[RLMSyncConfiguration fullSynchronization]`. - -### Enhancements - -* Add `-[RLMRealm syncSession]` and `Realm.syncSession` to obtain the session used for a synchronized Realm. -* Add `-[RLMSyncUser configuration]`. Query-based sync is the default sync mode for this configuration. -* Add `-[RLMSyncUser configurationWithURL:url]`. Query-based sync is the default sync mode for this configuration. - -3.6.0 Release notes (2018-05-29) -============================================================= - -### Enhancements - -* Improve performance of sync metadata operations and resolving thread-safe - references. -* `shouldCompactOnLaunch` is now supported for compacting the local data of - synchronized Realms. - -### Bugfixes - -* Fix a potential deadlock when a sync session progress callback held the last - strong reference to the sync session. -* Fix some cases where comparisons to `nil` in queries were not properly - serialized when subscribing to a query. -* Don't delete objects added during a migration after a call to `-[RLMMigration - deleteDataForClassName:]`. -* Fix incorrect results and/or crashes when multiple `-[RLMMigration - enumerateObjects:block:]` blocks deleted objects of the same type. -* Fix some edge-cases where `-[RLMMigration enumerateObjects:block:]` - enumerated the incorrect objects following deletions. -* Restore the pre-3.5.0 behavior for Swift optional properties missing an ivar - rather than crashing. - -3.5.0 Release notes (2018-04-25) -============================================================= - -### Enhancements - -* Add wrapper functions for email confirmation and password reset to `SyncUser`. - -### Bugfixes - -* Fix incorrect results when using optional chaining to access a RealmOptional - property in Release builds, or otherwise interacting with a RealmOptional - object after the owning Object has been deallocated. - -3.4.0 Release notes (2018-04-19) -============================================================= - -The prebuilt binary for Carthage is now built for Swift 4.1. - -### Enhancements - -* Expose `RLMSyncManager.authorizationHeaderName`/`SyncManager.authorizationHeaderName` - as a way to override the transport header for Realm Object Server authorization. -* Expose `RLMSyncManager.customRequestHeaders`/`SyncManager.customRequestHeaders` - which allows custom HTTP headers to be appended on requests to the Realm Object Server. -* Expose `RLMSSyncConfiguration.urlPrefix`/`SyncConfiguration.urlPrefix` as a mechanism - to replace the default path prefix in Realm Sync WebSocket requests. - -3.3.2 Release notes (2018-04-03) -============================================================= - -Add a prebuilt binary for Xcode 9.3. - -3.3.1 Release notes (2018-03-28) -============================================================= - -Realm Object Server v3.0.0 or newer is required when using synchronized Realms. - -### Enhancements - -* Expose `RLMObject.object(forPrimaryKey:)` as a factory method for Swift so - that it is callable with recent versions of Swift. - -### Bugfixes - -* Exclude the RLMObject-derived Permissions classes from the types repored by - `Realm.Configuration.defaultConfiguration.objectTypes` to avoid a failed - cast. -* Cancel pending `Realm.asyncOpen()` calls when authentication fails with a - non-transient error such as missing the Realm path in the URL. -* Fix "fcntl() inside prealloc()" errors on APFS. - -3.3.0 Release notes (2018-03-19) -============================================================= - -Realm Object Server v3.0.0 or newer is required when using synchronized Realms. - -### Enhancements - -* Add `Realm.permissions`, `Realm.permissions(forType:)`, and `Realm.permissions(forClassNamed:)` as convenience - methods for accessing the permissions of the Realm or a type. - -### Bugfixes - -* Fix `+[RLMClassPermission objectInRealm:forClass:]` to work for classes that are part of the permissions API, - such as `RLMPermissionRole`. -* Fix runtime errors when applications define an `Object` subclass with the - same name as one of the Permissions object types. - -3.2.0 Release notes (2018-03-15) -============================================================= - -Realm Object Server v3.0.0 or newer is required when using synchronized Realms. - -### Enhancements - -* Added an improved API for adding subscriptions in partially-synchronized Realms. `Results.subscribe()` can be - used to subscribe to any result set, and the returned `SyncSubscription` object can be used to observe the state - of the subscription and ultimately to remove the subscription. See the documentation for more information - (). -* Added a fine-grained permissions system for use with partially-synchronized Realms. This allows permissions to be - defined at the level of individual objects or classes. See the documentation for more information - (). -* Added `SyncConfiguration.automatic()` and `SyncConfiguration.automatic(user:)`. - These methods return a `Realm.Configuration` appropriate for syncing with the default - synced Realm for the current (or specified) user. These should be considered the preferred methods - for accessing synced Realms going forwards. -* Added `+[RLMSyncSession sessionForRealm:]` to retrieve the sync session corresponding to a `RLMRealm`. - -### Bugfixes - -* Fix incorrect initalization of `RLMSyncManager` that made it impossible to - set `errorHandler`. -* Fix compiler warnings when building with Xcode 9.3. -* Fix some warnings when running with UBsan. - -3.2.0-rc.1 Release notes (2018-03-14) -============================================================= - -Realm Object Server v3.0.0-rc.1 or newer is required when using synchronized Realms. - -### Enhancements - -* Added `SyncConfiguration.automatic()` and `SyncConfiguration.automatic(user:)`. - These methods return a `Realm.Configuration` appropriate for syncing with the default - synced Realm for the current (or specified). These should be considered the preferred methods - for accessing synced Realms going forwards. -* A role is now automatically created for each user with that user as its only member. - This simplifies the common use case of restricting access to specific objects to a single user. - This role can be accessed at `PermissionUser.role`. -* Improved error reporting when the server rejects a schema change due to a lack of permissions. - -### Bugfixes - -* Fix incorrect initalization of `RLMSyncManager` that made it impossible to - set `errorHandler`. -* Fix compiler warnings when building with Xcode 9.3. - -3.2.0-beta.3 Release notes (2018-03-01) -============================================================= - -Realm Object Server v3.0.0-alpha.9 or newer is required when using synchronized Realms. - -### Bugfixes - -* Fix a crash that would occur when using partial sync with Realm Object Server v3.0.0-alpha.9. - -3.2.0-beta.2 Release notes (2018-02-28) -============================================================= - -Realm Object Server v3.0.0-alpha.8 or newer is required when using synchronized Realms. - -### Enhancements - -* Added `findOrCreate(forRoleNamed:)` and `findOrCreate(forRole:)` to `List` - to simplify the process of adding permissions for a role. -* Added `+permissionForRoleNamed:inArray:`, `+permissionForRoleNamed:onRealm:`, - `+permissionForRoleNamed:onClass:realm:`, `+permissionForRoleNamed:onClassNamed:realm:`, - and `+permissionForRoleNamed:onObject:` to `RLMSyncPermission` to simplify the process - of adding permissions for a role. -* Added `+[RLMSyncSession sessionForRealm:]` to retrieve the sync session corresponding to a `RLMRealm`. - -### Bugfixes - -* `PermissionRole.users` and `PermissionUser.roles` are now public as intended. -* Fixed the handling of `setPermissions` in `-[RLMRealm privilegesForRealm]` and related methods. - -3.2.0-beta.1 Release notes (2018-02-19) -============================================================= - -### Enhancements - -* Added an improved API for adding subscriptions in partially-synchronized Realms. `Results.subscribe()` can be - used to subscribe to any result set, and the returned `SyncSubscription` object can be used to observe the state - of the subscription and ultimately to remove the subscription. -* Added a fine-grained permissions system for use with partially-synchronized Realms. This allows permissions to be - defined at the level of individual objects or classes. See `Permission` and related types for more information. - -### Bugfixes - -* Fix some warnings when running with UBsan. - -3.1.1 Release notes (2018-02-03) -============================================================= - -Prebuilt Swift frameworks for Carthage are now built with Xcode 9.2. - -### Bugfixes - -* Fix a memory leak when opening Realms with an explicit `objectTypes` array - from Swift. - -3.1.0 Release notes (2018-01-16) -============================================================= - -* Prebuilt frameworks are now included for Swift 3.2.3 and 4.0.3. -* Prebuilt frameworks are no longer included for Swift 3.0.x. -* Building from source with Xcode versions prior to Xcode 8.3 is no longer supported. - -### Enhancements - -* Add `Results.distinct(by:)` / `-[RLMResults distinctResultsUsingKeyPaths:]`, which return a `Results` - containing only objects with unique values at the given key paths. -* Improve performance of change checking for notifications in certain cases. -* Realm Object Server errors not explicitly recognized by the client are now reported to the application - regardless. -* Add support for JSON Web Token as a sync credential source. -* Add support for Nickname and Anonymous Auth as a sync credential source. -* Improve allocator performance when writing to a highly fragmented file. This - should significantly improve performance when inserting large numbers of - objects which have indexed properties. -* Improve write performance for complex object graphs involving many classes - linking to each other. - -### Bugfixes - -* Add a missing check for a run loop in the permission API methods which - require one. -* Fix some cases where non-fatal sync errors were being treated as fatal errors. - -3.0.2 Release notes (2017-11-08) -============================================================= - -Prebuilt frameworks are now included for Swift 3.2.2 and 4.0.2. - -### Bugfixes - -* Fix a crash when a linking objects property is retrieved from a model object instance via - Swift subscripting. -* Fix incorrect behavior if a call to `posix_fallocate` is interrupted. - -3.0.1 Release notes (2017-10-26) -============================================================= - -### Bugfixes - -* Explicitly exclude KVO-generated object subclasses from the schema. -* Fix regression where the type of a Realm model class is not properly determined, causing crashes - when a type value derived at runtime by `type(of:)` is passed into certain APIs. -* Fix a crash when an `Object` subclass has implicitly ignored `let` - properties. -* Fix several cases where adding a notification block from within a - notification callback could produce incorrect results. - -3.0.0 Release notes (2017-10-16) -============================================================= - -### Breaking Changes -* iOS 7 is no longer supported. -* Synchronized Realms require a server running Realm Object Server v2.0 or higher. -* Computed properties on Realm object types are detected and no - longer added to the automatically generated schema. -* The Objective-C and Swift `create(_:, value: update:)` APIs now - correctly nil out nullable properties when updating an existing - object when the `value` argument specifies nil or `NSNull` for - the property value. -* `-[RLMRealm addOrUpdateObjects:]` and `-[RLMRealm deleteObjects:]` now - require their argument to conform to `NSFastEnumeration`, to match similar - APIs that also take collections. -* The way interactive sync errors (client reset and permission denied) - are delivered to the user has been changed. Instead of a block which can - be invoked to immediately delete the offending Realm file, an opaque - token object of type `RLMSyncErrorActionToken` will be returned in the - error object's `userInfo` dictionary. This error object can be passed - into the new `+[RLMSyncSession immediatelyHandleError:]` API to delete - the files. -* The return types of the `SyncError.clientResetInfo()` and - `SyncError.deleteRealmUserInfo()` APIs have been changed. They now return - `RLMSyncErrorActionToken`s or `SyncError.ActionToken`s instead of closures. -* The class methods `Object.className()`, `Object.objectUtilClass()`, and - the property `Object.isInvalidated` can no longer be overriden. -* The callback which runs when a sync user login succeeds or fails - now runs on the main queue by default, or can be explicitly specified - by a new `callbackQueue` parameter on the `{RLM}SyncUser.logIn(...)` API. -* Fix empty strings, binary data, and null on the right side of `BEGINSWITH`, - `ENDSWITH` and `CONTAINS` operators in predicates to match Foundation's - semantics of never matching any strings or data. -* Swift `Object` comparison and hashing behavior now works the same way as - that of `RLMObject` (objects are now only considered equatable if their - model class defines a primary key). -* Fix the way the hash property works on `Object` when the object model has - no primary key. -* Fix an issue where if a Swift model class defined non-generic managed - properties after generic Realm properties (like `List`), the schema - would be constructed incorrectly. Fixes an issue where creating such - models from an array could fail. -* Loosen `RLMArray` and `RLMResults`'s generic constraint from `RLMObject` to - `NSObject`. This may result in having to add some casts to disambiguate - types. -* Remove `RLMSyncPermissionResults`. `RLMSyncPermission`s are now vended out - using a `RLMResults`. This results collection supports all normal collection - operations except for setting values using key-value coding (since - `RLMSyncPermission`s are immutable) and the property aggregation operations. -* `RLMSyncUserInfo` has been significantly enhanced. It now contains metadata - about a user stored on the Realm Object Server, as well as a list of all user account - data associated with that user. -* Starting with Swift 4, `List` now conforms to `MutableCollection` instead of - `RangeReplaceableCollection`. For Swift 4, the empty collection initializer has been - removed, and default implementations of range replaceable collection methods that - make sense for `List` have been added. -* `List.removeLast()` now throws an exception if the list is empty, to more closely match - the behavior of the standard library's `Collection.removeLast()` implementation. -* `RealmCollection`'s associated type `Element` has been renamed `ElementType`. -* The following APIs have been renamed: - -| Old API | New API | -|:------------------------------------------------------------|:---------------------------------------------------------------| -| `NotificationToken.stop()` | `NotificationToken.invalidate()` | -| `-[RLMNotificationToken stop]` | `-[RLMNotificationToken invalidate]` | -| `RealmCollection.addNotificationBlock(_:)` | `RealmCollection.observe(_:)` | -| `RLMSyncProgress` | `RLMSyncProgressMode` | -| `List.remove(objectAtIndex:)` | `List.remove(at:)` | -| `List.swap(_:_:)` | `List.swapAt(_:_:)` | -| `SyncPermissionValue` | `SyncPermission` | -| `RLMSyncPermissionValue` | `RLMSyncPermission` | -| `-[RLMSyncPermission initWithRealmPath:userID:accessLevel]` | `-[RLMSyncPermission initWithRealmPath:identity:accessLevel:]` | -| `RLMSyncPermission.userId` | `RLMSyncPermission.identity` | -| `-[RLMRealm addOrUpdateObjectsInArray:]` | `-[RLMRealm addOrUpdateObjects:]` | - -* The following APIs have been removed: - -| Removed API | Replacement | -|:-------------------------------------------------------------|:------------------------------------------------------------------------------------------| -| `Object.className` | None, was erroneously present. | -| `RLMPropertyTypeArray` | `RLMProperty.array` | -| `PropertyType.array` | `Property.array` | -| `-[RLMArray sortedResultsUsingProperty:ascending:]` | `-[RLMArray sortedResultsUsingKeyPath:ascending:]` | -| `-[RLMCollection sortedResultsUsingProperty:ascending:]` | `-[RLMCollection sortedResultsUsingKeyPath:ascending:]` | -| `-[RLMResults sortedResultsUsingProperty:ascending:]` | `-[RLMResults sortedResultsUsingKeyPath:ascending:]` | -| `+[RLMSortDescriptor sortDescriptorWithProperty:ascending:]` | `+[RLMSortDescriptor sortDescriptorWithKeyPath:ascending:]` | -| `RLMSortDescriptor.property` | `RLMSortDescriptor.keyPath` | -| `AnyRealmCollection.sorted(byProperty:ascending:)` | `AnyRealmCollection.sorted(byKeyPath:ascending:)` | -| `List.sorted(byProperty:ascending:)` | `List.sorted(byKeyPath:ascending:)` | -| `LinkingObjects.sorted(byProperty:ascending:)` | `LinkingObjects.sorted(byKeyPath:ascending:)` | -| `Results.sorted(byProperty:ascending:)` | `Results.sorted(byKeyPath:ascending:)` | -| `SortDescriptor.init(property:ascending:)` | `SortDescriptor.init(keyPath:ascending:)` | -| `SortDescriptor.property` | `SortDescriptor.keyPath` | -| `+[RLMRealm migrateRealm:configuration:]` | `+[RLMRealm performMigrationForConfiguration:error:]` | -| `RLMSyncManager.disableSSLValidation` | `RLMSyncConfiguration.enableSSLValidation` | -| `SyncManager.disableSSLValidation` | `SyncConfiguration.enableSSLValidation` | -| `RLMSyncErrorBadResponse` | `RLMSyncAuthErrorBadResponse` | -| `RLMSyncPermissionResults` | `RLMResults` | -| `SyncPermissionResults` | `Results` | -| `RLMSyncPermissionChange` | `-[RLMSyncUser applyPermission:callback]` / `-[RLMSyncUser deletePermission:callback:]` | -| `-[RLMSyncUser permissionRealmWithError:]` | `-[RLMSyncUser retrievePermissionsWithCallback:]` | -| `RLMSyncPermissionOffer` | `-[RLMSyncUser createOfferForRealmAtURL:accessLevel:expiration:callback:]` | -| `RLMSyncPermissionOfferResponse` | `-[RLMSyncUser acceptOfferForToken:callback:]` | -| `-[NSError rlmSync_clientResetBlock]` | `-[NSError rlmSync_errorActionToken]` / `-[NSError rlmSync_clientResetBackedUpRealmPath]` | -| `-[NSError rlmSync_deleteRealmBlock]` | `-[NSError rlmSync_errorActionToken]` | - -### Enhancements -* `List` can now contain values of types `Bool`, `Int`, `Int8`, `Int16`, - `Int32`, `Int64`, `Float`, `Double`, `String`, `Data`, and `Date` (and - optional versions of all of these) in addition to `Object` subclasses. - Querying `List`s containing values other than `Object` subclasses is not yet - implemented. -* `RLMArray` can now be constrained with the protocols `RLMBool`, `RLMInt`, - `RLMFloat`, `RLMDouble`, `RLMString`, `RLMData`, and `RLMDate` in addition to - protocols defined with `RLM_ARRAY_TYPE`. By default `RLMArray`s of - non-`RLMObject` types can contain null. Indicating that the property is - required (by overriding `+requiredProperties:`) will instead make the values - within the array required. Querying `RLMArray`s containing values other than - `RLMObject` subclasses is not yet implemented. -* Add a new error code to denote 'permission denied' errors when working - with synchronized Realms, as well as an accompanying block that can be - called to inform the binding that the offending Realm's files should be - deleted immediately. This allows recovering from 'permission denied' - errors in a more robust manner. See the documentation for - `RLMSyncErrorPermissionDeniedError` for more information. -* Add Swift `Object.isSameObject(as:_)` API to perform the same function as - the existing Objective-C API `-[RLMObject isEqualToObject:]`. -* Opening a synced Realm whose local copy was created with an older version of - Realm Mobile Platfrom when a migration is not possible to the current version - will result in an `RLMErrorIncompatibleSyncedFile` / `incompatibleSyncedFile` - error. When such an error occurs, the original file is moved to a backup - location, and future attempts to open the synchronized Realm will result in a new - file being created. If you wish to migrate any data from the backup Realm you can - open it using the backup Realm configuration available on the error object. -* Add a preview of partial synchronization. Partial synchronization allows a - synchronized Realm to be opened in such a way that only objects requested by - the user are synchronized to the device. You can use it by setting the - `isPartial` property on a `SyncConfiguration`, opening the Realm, and then - calling `Realm.subscribe(to:where:callback:)` with the type of object you're - interested in, a string containing a query determining which objects you want - to subscribe to, and a callback which will report the results. You may add as - many subscriptions to a synced Realm as necessary. - -### Bugfixes -* Realm no longer throws an "unsupported instruction" exception in some cases - when opening a synced Realm asynchronously. -* Realm Swift APIs that filter or look up the index of an object based on a - format string now properly handle optional arguments in their variadic argument - list. -* `-[RLMResults indexOfObject:]` now properly accounts for access - level. -* Fix a race condition that could lead to a crash accessing to the freed configuration object - if a default configuration was set from a different thread. -* Fixed an issue that crash when enumerating after clearing data during migration. -* Fix a bug where a synced Realm couldn't be reopened even after a successful client reset - in some cases. -* Fix a bug where the sync subsystem waited too long in certain cases to reconnect to the server. -* Fix a bug where encrypted sync-related metadata was incorrectly deleted from upgrading users, - resulting in all users being logged out. -* Fix a bug where permission-related data continued to be synced to a client even after the user - that data belonged to logged out. -* Fix an issue where collection notifications might be delivered inconsistently if a notification - callback was added within another callback for the same collection. - -3.0.0-rc.2 Release notes (2017-10-14) -============================================================= - -### Enhancements -* Reinstate `RLMSyncPermissionSortPropertyUserID` to allow users to sort permissions - to their own Realms they've granted to others. - -### Bugfixes -* `-[RLMResults indexOfObject:]` now properly accounts for access - level. -* Fix a race condition that could lead to a crash accessing to the freed configuration object - if a default configuration was set from a different thread. -* Fixed an issue that crash when enumerating after clearing data during migration. -* Fix a bug where a synced Realm couldn't be reopened even after a successful client reset - in some cases. -* Fix a bug where the sync subsystem waited too long in certain cases to reconnect to the server. -* Fix a bug where encrypted sync-related metadata was incorrectly deleted from upgrading users, - resulting in all users being logged out. -* Fix a bug where permission-related data continued to be synced to a client even after the user - that data belonged to logged out. -* Fix an issue where collection notifications might be delivered inconsistently if a notification - callback was added within another callback for the same collection. - -3.0.0-rc.1 Release notes (2017-10-03) -============================================================= - -### Breaking Changes -* Remove `RLMSyncPermissionSortPropertyUserID` to reflect changes in how the - Realm Object Server reports permissions for a user. -* Remove `RLMSyncPermissionOffer` and `RLMSyncPermissionOfferResponse` classes - and associated helper methods and functions. Use the - `-[RLMSyncUser createOfferForRealmAtURL:accessLevel:expiration:callback:]` - and `-[RLMSyncUser acceptOfferForToken:callback:]` methods instead. - -### Bugfixes - -* The keychain item name used by Realm to manage the encryption keys for - sync-related metadata is now set to a per-app name based on the bundle - identifier. Keys that were previously stored within the single, shared Realm - keychain item will be transparently migrated to the per-application keychain - item. -* Fix downloading of the Realm core binaries when Xcode's command-line tools are - set as the active developer directory for command-line interactions. -* Fix a crash that could occur when resolving a ThreadSafeReference to a `List` - whose parent object had since been deleted. - -3.0.0-beta.4 Release notes (2017-09-22) -============================================================= - -### Breaking Changes - -* Rename `List.remove(objectAtIndex:)` to `List.remove(at:)` to match the name - used by 'RangeReplaceableCollection'. -* Rename `List.swap()` to `List.swapAt()` to match the name used by 'Array'. -* Loosen `RLMArray` and `RLMResults`'s generic constraint from `RLMObject` to - `NSObject`. This may result in having to add some casts to disambiguate - types. -* Remove `RLMPropertyTypeArray` in favor of a separate bool `array` property on - `RLMProperty`/`Property`. -* Remove `RLMSyncPermissionResults`. `RLMSyncPermission`s are now vended out - using a `RLMResults`. This results collection supports all normal collection - operations except for setting values using KVO (since `RLMSyncPermission`s are - immutable) and the property aggregation operations. -* `RealmCollection`'s associated type `Element` has been renamed `ElementType`. -* Realm Swift collection types (`List`, `Results`, `AnyRealmCollection`, and - `LinkingObjects` have had their generic type parameter changed from `T` to - `Element`). -* `RealmOptional`'s generic type parameter has been changed from `T` to `Value`. -* `RLMSyncUserInfo` has been significantly enhanced. It now contains metadata - about a user stored on the Realm Object Server, as well as a list of all user account - data associated with that user. -* Starting with Swift 4, `List` now conforms to `MutableCollection` instead of - `RangeReplaceableCollection`. For Swift 4, the empty collection initializer has been - removed, and default implementations of range replaceable collection methods that - make sense for `List` have been added. -* `List.removeLast()` now throws an exception if the list is empty, to more closely match - the behavior of the standard library's `Collection.removeLast()` implementation. - -### Enhancements - -* `List` can now contain values of types `Bool`, `Int`, `Int8`, `Int16`, - `Int32`, `Int64`, `Float`, `Double`, `String`, `Data`, and `Date` (and - optional versions of all of these) in addition to `Object` subclasses. - Querying `List`s containing values other than `Object` subclasses is not yet - implemented. -* `RLMArray` can now be constrained with the protocols `RLMBool`, `RLMInt`, - `RLMFloat`, `RLMDouble`, `RLMString`, `RLMData`, and `RLMDate` in addition to - protocols defined with `RLM_ARRAY_TYPE`. By default `RLMArray`s of - non-`RLMObject` types can contain null. Indicating that the property is - required (by overriding `+requiredProperties:`) will instead make the values - within the array required. Querying `RLMArray`s containing values other than - `RLMObject` subclasses is not yet implemented. -* Opening a synced Realm whose local copy was created with an older version of - Realm Mobile Platfrom when a migration is not possible to the current version - will result in an `RLMErrorIncompatibleSyncedFile` / `incompatibleSyncedFile` - error. When such an error occurs, the original file is moved to a backup - location, and future attempts to open the synchronized Realm will result in a new - file being created. If you wish to migrate any data from the backup Realm you can - open it using the backup Realm configuration available on the error object. -* Add preview support for partial synchronization. Partial synchronization is - allows a synchronized Realm to be opened in such a way that only objects - requested by the user are synchronized to the device. You can use it by setting - the `isPartial` property on a `SyncConfiguration`, opening the Realm, and then - calling `Realm.subscribe(to:where:callback:)` with the type of object you're - interested in, a string containing a query determining which objects you want - to subscribe to, and a callback which will report the results. You may add as - many subscriptions to a synced Realm as necessary. - -### Bugfixes - -* Realm Swift APIs that filter or look up the index of an object based on a - format string now properly handle optional arguments in their variadic argument - list. - -3.0.0-beta.3 Release notes (2017-08-23) -============================================================= - -### Breaking Changes - -* iOS 7 is no longer supported. -* Computed properties on Realm object types are detected and no - longer added to the automatically generated schema. -* `-[RLMRealm addOrUpdateObjectsInArray:]` has been renamed to - `-[RLMRealm addOrUpdateObjects:]` for consistency with similar methods - that add or delete objects. -* `-[RLMRealm addOrUpdateObjects:]` and `-[RLMRealm deleteObjects:]` now - require their argument to conform to `NSFastEnumeration`, to match similar - APIs that also take collections. -* Remove deprecated `{RLM}SyncPermission` and `{RLM}SyncPermissionChange` - classes. -* `{RLM}SyncPermissionValue` has been renamed to just `{RLM}SyncPermission`. - Its `userId` property has been renamed `identity`, and its - `-initWithRealmPath:userID:accessLevel:` initializer has been renamed - `-initWithRealmPath:identity:accessLevel:`. -* Remove deprecated `-[RLMSyncUser permissionRealmWithError:]` and - `SyncUser.permissionRealm()` APIs. Use the new permissions system. -* Remove deprecated error `RLMSyncErrorBadResponse`. Use - `RLMSyncAuthErrorBadResponse` instead. -* The way interactive sync errors (client reset and permission denied) - are delivered to the user has been changed. Instead of a block which can - be invoked to immediately delete the offending Realm file, an opaque - token object of type `RLMSyncErrorActionToken` will be returned in the - error object's `userInfo` dictionary. This error object can be passed - into the new `+[RLMSyncSession immediatelyHandleError:]` API to delete - the files. -* Remove `-[NSError rlmSync_clientResetBlock]` and - `-[NSError rlmSync_deleteRealmBlock]` APIs. -* The return types of the `SyncError.clientResetInfo()` and - `SyncError.deleteRealmUserInfo()` APIs have been changed. They now return - `RLMSyncErrorActionToken`s or `SyncError.ActionToken`s instead of closures. -* The (erroneously added) instance property `Object.className` has been - removed. -* The class methods `Object.className()`, `Object.objectUtilClass()`, and - the property `Object.isInvalidated` can no longer be overriden. -* The callback which runs when a sync user login succeeds or fails - now runs on the main queue by default, or can be explicitly specified - by a new `callbackQueue` parameter on the `{RLM}SyncUser.logIn(...)` API. -* Rename `{RLM}NotificationToken.stop()` to `invalidate()` and - `{RealmCollection,SyncPermissionResults}.addNotificationBlock(_:)` to - `observe(_:)` to mirror Foundation's new KVO APIs. -* The `RLMSyncProgress` enum has been renamed `RLMSyncProgressMode`. -* Remove deprecated `{RLM}SyncManager.disableSSLValidation` property. Disable - SSL validation on a per-Realm basis by setting the `enableSSLValidation` - property on `{RLM}SyncConfiguration` instead. -* Fix empty strings, binary data, and null on the right side of `BEGINSWITH`, - `ENDSWITH` and `CONTAINS` operators in predicates to match Foundation's - semantics of never matching any strings or data. -* Swift `Object` comparison and hashing behavior now works the same way as - that of `RLMObject` (objects are now only considered equatable if their - model class defines a primary key). -* Fix the way the hash property works on `Object` when the object model has - no primary key. -* Fix an issue where if a Swift model class defined non-generic managed - properties after generic Realm properties (like `List`), the schema - would be constructed incorrectly. Fixes an issue where creating such - models from an array could fail. - -### Enhancements - -* Add Swift `Object.isSameObject(as:_)` API to perform the same function as - the existing Objective-C API `-[RLMObject isEqualToObject:]`. -* Expose additional authentication-related errors that might be reported by - a Realm Object Server. -* An error handler can now be registered on `{RLM}SyncUser`s in order to - report authentication-related errors that affect the user. - -### Bugfixes - -* Sync users are now automatically logged out upon receiving certain types - of errors that indicate they are no longer logged into the server. For - example, users who are authenticated using third-party credentials will find - themselves logged out of the Realm Object Server if the third-party identity - service indicates that their credential is no longer valid. -* Address high CPU usage and hangs in certain cases when processing collection - notifications in highly-connected object graphs. - -3.0.0-beta.2 Release notes (2017-07-26) -============================================================= - -### Breaking Changes - -* Remove the following deprecated Objective-C APIs: - `-[RLMArray sortedResultsUsingProperty:ascending:]`, - `-[RLMCollection sortedResultsUsingProperty:ascending:]`, - `-[RLMResults sortedResultsUsingProperty:ascending:]`, - `+[RLMSortDescriptor sortDescriptorWithProperty:ascending:]`, - `RLMSortDescriptor.property`. - These APIs have been superseded by equivalent APIs that take - or return key paths instead of property names. -* Remove the following deprecated Objective-C API: - `+[RLMRealm migrateRealm:configuration:]`. - Please use `+[RLMRealm performMigrationForConfiguration:error:]` instead. -* Remove the following deprecated Swift APIs: - `AnyRealmCollection.sorted(byProperty:, ascending:)`, - `LinkingObjects.sorted(byProperty:, ascending:)`, - `List.sorted(byProperty:, ascending:)`, - `Results.sorted(byProperty:, ascending:)`, - `SortDescriptor.init(property:, ascending:)`, - `SortDescriptor.property`. - These APIs have been superseded by equivalent APIs that take - or return key paths instead of property names. -* The Objective-C and Swift `create(_:, value: update:)` APIs now - correctly nil out nullable properties when updating an existing - object when the `value` argument specifies nil or `NSNull` for - the property value. - -### Enhancements - -* It is now possible to create and log in multiple Realm Object Server users - with the same identity if they originate from different servers. Note that - if the URLs are different aliases for the same authentication server each - user will still be treated as separate (e.g. they will have their own copy - of each synchronized Realm opened using them). It is highly encouraged that - users defined using the access token credential type be logged in with an - authentication server URL specified; this parameter will become mandatory - in a future version of the SDK. -* Add `-[RLMSyncUser retrieveInfoForUser:identityProvider:completion:]` - API allowing administrator users to retrieve information about a user based - on their provider identity (for example, a username). Requires any edition - of the Realm Object Server 1.8.2 or later. - -### Bugfixes - -* Realm no longer throws an "unsupported instruction" exception in some cases - when opening a synced Realm asynchronously. - -3.0.0-beta Release notes (2017-07-14) -============================================================= - -### Breaking Changes - -* Synchronized Realms require a server running Realm Object Server v2.0 or higher. - -### Enhancements - -* Add a new error code to denote 'permission denied' errors when working - with synchronized Realms, as well as an accompanying block that can be - called to inform the binding that the offending Realm's files should be - deleted immediately. This allows recovering from 'permission denied' - errors in a more robust manner. See the documentation for - `RLMSyncErrorPermissionDeniedError` for more information. -* Add `-[RLMSyncPermissionValue initWithRealmPath:username:accessLevel:]` - API allowing permissions to be applied to a user based on their username - (usually, an email address). Requires any edition of the Realm Object - Server 1.6.0 or later. -* Improve performance of creating Swift objects which contain at least one List - property. - -### Bugfixes - -* `List.description` now reports the correct types for nested lists. -* Fix unmanaged object initialization when a nested property type returned - `false` from `Object.shouldIncludeInDefaultSchema()`. -* Don't clear RLMArrays on self-assignment. - -2.10.2 Release notes (2017-09-27) -============================================================= - -### Bugfixes - -* The keychain item name used by Realm to manage the encryption keys for - sync-related metadata is now set to a per-app name based on the bundle - identifier. Keys that were previously stored within the single, shared Realm - keychain item will be transparently migrated to the per-application keychain - item. -* Fix downloading of the Realm core binaries when Xcode's command-line tools are - set as the active developer directory for command-line interactions. -* Fix a crash that could occur when resolving a ThreadSafeReference to a `List` - whose parent object had since been deleted. - -2.10.1 Release notes (2017-09-14) -============================================================= - -Swift binaries are now produced for Swift 3.0, 3.0.1, 3.0.2, 3.1, 3.2 and 4.0. - -### Enhancements - -* Auxiliary files are excluded from backup by default. - -### Bugfixes - -* Fix more cases where assigning an RLMArray property to itself would clear the - RLMArray. - -2.10.0 Release notes (2017-08-21) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Expose additional authentication-related errors that might be reported by - a Realm Object Server. -* An error handler can now be registered on `{RLM}SyncUser`s in order to - report authentication-related errors that affect the user. - -### Bugfixes - -* Sorting Realm collection types no longer throws an exception on iOS 7. -* Sync users are now automatically logged out upon receiving certain types - of errors that indicate they are no longer logged into the server. For - example, users who are authenticated using third-party credentials will find - themselves logged out of the Realm Object Server if the third-party identity - service indicates that their credential is no longer valid. -* Address high CPU usage and hangs in certain cases when processing collection - notifications in highly-connected object graphs. - -2.9.1 Release notes (2017-08-01) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* The `shouldCompactOnLaunch` block is no longer invoked if the Realm at that - path is already open on other threads. -* Fix an assertion failure in collection notifications when changes are made to - the schema via sync while the notification block is active. - -2.9.0 Release notes (2017-07-26) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Add a new error code to denote 'permission denied' errors when working - with synchronized Realms, as well as an accompanying block that can be - called to inform the binding that the offending Realm's files should be - deleted immediately. This allows recovering from 'permission denied' - errors in a more robust manner. See the documentation for - `RLMSyncErrorPermissionDeniedError` for more information. -* Add `-[RLMSyncPermissionValue initWithRealmPath:username:accessLevel:]` - API allowing permissions to be applied to a user based on their username - (usually, an email address). Requires any edition of the Realm Object - Server 1.6.0 or later. -* Improve performance of creating Swift objects which contain at least one List - property. -* It is now possible to create and log in multiple Realm Object Server users - with the same identity if they originate from different servers. Note that - if the URLs are different aliases for the same authentication server each - user will still be treated as separate (e.g. they will have their own copy - of each synchronized Realm opened using them). It is highly encouraged that - users defined using the access token credential type be logged in with an - authentication server URL specified; this parameter will become mandatory - in a future version of the SDK. -* Add `-[RLMSyncUser retrieveInfoForUser:identityProvider:completion:]` - API allowing administrator users to retrieve information about a user based - on their provider identity (for example, a username). Requires any edition - of the Realm Object Server 1.8.2 or later. - -### Bugfixes - -* `List.description` now reports the correct types for nested lists. -* Fix unmanaged object initialization when a nested property type returned - `false` from `Object.shouldIncludeInDefaultSchema()`. -* Don't clear RLMArrays on self-assignment. - -2.8.3 Release notes (2017-06-20) -============================================================= - -### Bugfixes - -* Properly update RealmOptional properties when adding an object with `add(update: true)`. -* Add some missing quotes in error messages. -* Fix a performance regression when creating objects with primary keys. - -2.8.2 Release notes (2017-06-16) -============================================================= - -### Bugfixes - -* Fix an issue where synchronized Realms would eventually disconnect from the - remote server if the user object used to define their sync configuration - was destroyed. -* Restore support for changing primary keys in migrations (broken in 2.8.0). -* Revert handling of adding objects with nil properties to a Realm to the - pre-2.8.0 behavior. - -2.8.1 Release notes (2017-06-12) -============================================================= - -Add support for building with Xcode 9 Beta 1. - -### Bugfixes - -* Fix setting a float property to NaN. -* Fix a crash when using compact on launch in combination with collection - notifications. - -2.8.0 Release notes (2017-06-02) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Enable encryption on watchOS. -* Add `-[RLMSyncUser changePassword:forUserID:completion:]` API to change an - arbitrary user's password if the current user has administrative privileges - and using Realm's 'password' authentication provider. - Requires any edition of the Realm Object Server 1.6.0 or later. - -### Bugfixes - -* Suppress `-Wdocumentation` warnings in Realm C++ headers when using CocoaPods - with Xcode 8.3.2. -* Throw an appropriate error rather than crashing when an RLMArray is assigned - to an RLMArray property of a different type. -* Fix crash in large (>4GB) encrypted Realm files. -* Improve accuracy of sync progress notifications. -* Fix an issue where synchronized Realms did not connect to the remote server - in certain situations, such as when an application was offline when the Realms - were opened but later regained network connectivity. - -2.7.0 Release notes (2017-05-03) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Use reachability API to minimize the reconnection delay if the network - connection was lost. -* Add `-[RLMSyncUser changePassword:completion:]` API to change the current - user's password if using Realm's 'password' authentication provider. - Requires any edition of the Realm Object Server 1.4.0 or later. -* `{RLM}SyncConfiguration` now has an `enableSSLValidation` property - (and default parameter in the Swift initializer) to allow SSL validation - to be specified on a per-server basis. -* Transactions between a synced Realm and a Realm Object Server can now - exceed 16 MB in size. -* Add new APIs for changing and retrieving permissions for synchronized Realms. - These APIs are intended to replace the existing Realm Object-based permissions - system. Requires any edition of the Realm Object Server 1.1.0 or later. - -### Bugfixes - -* Support Realm model classes defined in Swift with overridden Objective-C - names (e.g. `@objc(Foo) class SwiftFoo: Object {}`). -* Fix `-[RLMMigration enumerateObjects:block:]` returning incorrect `oldObject` - objects when enumerating a class name after previously deleting a `newObject`. -* Fix an issue where `Realm.asyncOpen(...)` would fail to work when opening a - synchronized Realm for which the user only had read permissions. -* Using KVC to set a `List` property to `nil` now clears it to match the - behavior of `RLMArray` properties. -* Fix crash from `!m_awaiting_pong` assertion failure when using synced Realms. -* Fix poor performance or hangs when performing case-insensitive queries on - indexed string properties that contain many characters that don't differ - between upper and lower case (e.g., numbers, punctuation). - -2.6.2 Release notes (2017-04-21) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix an issue where calling `Realm.asyncOpen(...)` with a synchronized Realm - configuration would fail with an "Operation canceled" error. -* Fix initial collection notification sometimes not being delivered for synced - Realms. -* Fix circular links sometimes resulting in objects not being marked as - modified in change notifications. - -2.6.1 Release notes (2017-04-18) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix an issue where calling `Realm.asyncOpen(...)` with a synchronized Realm - configuration would crash in error cases rather than report the error. - This is a small source breaking change if you were relying on the error - being reported to be a `Realm.Error`. - -2.6.0 Release notes (2017-04-18) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Add a `{RLM}SyncUser.isAdmin` property indicating whether a user is a Realm - Object Server administrator. -* Add an API to asynchronously open a Realm and deliver it to a block on a - given queue. This performs all work needed to get the Realm to - a usable state (such as running potentially time-consuming migrations) on a - background thread before dispatching to the given queue. In addition, - synchronized Realms wait for all remote content available at the time the - operation began to be downloaded and available locally. -* Add `shouldCompactOnLaunch` block property when configuring a Realm to - determine if it should be compacted before being returned. -* Speed up case-insensitive queries on indexed string properties. -* Add RLMResults's collection aggregate methods to RLMArray. -* Add support for calling the aggregate methods on unmanaged Lists. - -### Bugfixes - -* Fix a deadlock when multiple processes open a Realm at the same time. -* Fix `value(forKey:)`/`value(forKeyPath:)` returning incorrect values for `List` properties. - -2.5.1 Release notes (2017-04-05) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix CocoaPods installation with static libraries and multiple platforms. -* Fix uncaught "Bad version number" exceptions on the notification worker thread - followed by deadlocks when Realms refresh. - -2.5.0 Release notes (2017-03-28) -============================================================= - -Files written by Realm this version cannot be read by earlier versions of Realm. -Old files can still be opened and files open in read-only mode will not be -modified. - -If using synchronized Realms, the Realm Object Server must be running version -1.3.0 or later. - -Swift binaries are now produced for Swift 3.0, 3.0.1, 3.0.2 and 3.1. - -### API Breaking Changes - -* None. - -### Enhancements - -* Add support for multi-level object equality comparisons against `NULL`. -* Add support for the `[d]` modifier on string comparison operators to perform - diacritic-insensitive comparisons. -* Explicitly mark `[[RLMRealm alloc] init]` as unavailable. -* Include the name of the problematic class in the error message when an - invalid property type is marked as the primary key. - -### Bugfixes - -* Fix incorrect column type assertions which could occur after schemas were - merged by sync. -* Eliminate an empty write transaction when opening a synced Realm. -* Support encrypting synchronized Realms by respecting the `encryptionKey` value - of the Realm's configuration. -* Fix crash when setting an `{NS}Data` property close to 16MB. -* Fix for reading `{NS}Data` properties incorrectly returning `nil`. -* Reduce file size growth in cases where Realm versions were pinned while - starting write transactions. -* Fix an assertion failure when writing to large `RLMArray`/`List` properties. -* Fix uncaught `BadTransactLog` exceptions when pulling invalid changesets from - synchronized Realms. -* Fix an assertion failure when an observed `RLMArray`/`List` is deleted after - being modified. - -2.4.4 Release notes (2017-03-13) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Add `(RLM)SyncPermission` class to allow reviewing access permissions for - Realms. Requires any edition of the Realm Object Server 1.1.0 or later. -* Further reduce the number of files opened per thread-specific Realm on macOS, - iOS and watchOS. - -### Bugfixes - -* Fix a crash that could occur if new Realm instances were created while the - application was exiting. -* Fix a bug that could lead to bad version number errors when delivering - change notifications. -* Fix a potential use-after-free bug when checking validity of results. -* Fix an issue where a sync session might not close properly if it receives - an error while being torn down. -* Fix some issues where a sync session might not reconnect to the server properly - or get into an inconsistent state if revived after invalidation. -* Fix an issue where notifications might not fire when the children of an - observed object are changed. -* Fix an issue where progress notifications on sync sessions might incorrectly - report out-of-date values. -* Fix an issue where multiple threads accessing encrypted data could result in - corrupted data or crashes. -* Fix an issue where certain `LIKE` queries could hang. -* Fix an issue where `-[RLMRealm writeCopyToURL:encryptionKey:error]` could create - a corrupt Realm file. -* Fix an issue where incrementing a synced Realm's schema version without actually - changing the schema could cause a crash. - -2.4.3 Release notes (2017-02-20) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Avoid copying copy-on-write data structures, which can grow the file, when the - write does not actually change existing values. -* Improve performance of deleting all objects in an RLMResults. -* Reduce the number of files opened per thread-specific Realm on macOS. -* Improve startup performance with large numbers of `RLMObject`/`Object` - subclasses. - -### Bugfixes - -* Fix synchronized Realms not downloading remote changes when an access token - expires and there are no local changes to upload. -* Fix an issue where values set on a Realm object using `setValue(value:, forKey:)` - that were not themselves Realm objects were not properly converted into Realm - objects or checked for validity. -* Fix an issue where `-[RLMSyncUser sessionForURL:]` could erroneously return a - non-nil value when passed in an invalid URL. -* `SyncSession.Progress.fractionTransferred` now returns 1 if there are no - transferrable bytes. -* Fix sync progress notifications registered on background threads by always - dispatching on a dedicated background queue. -* Fix compilation issues with Xcode 8.3 beta 2. -* Fix incorrect sync progress notification values for Realms originally created - using a version of Realm prior to 2.3.0. -* Fix LLDB integration to be able to display summaries of `RLMResults` once more. -* Reject Swift properties with names which cause them to fall in to ARC method - families rather than crashing when they are accessed. -* Fix sorting by key path when the declared property order doesn't match the order - of properties in the Realm file, which can happen when properties are added in - different schema versions. - -2.4.2 Release notes (2017-01-30) -============================================================= - -### Bugfixes - -* Fix an issue where RLMRealm instances could end up in the autorelease pool - for other threads. - -2.4.1 Release notes (2017-01-27) -============================================================= - -### Bugfixes - -* Fix an issue where authentication tokens were not properly refreshed - automatically before expiring. - -2.4.0 Release notes (2017-01-26) -============================================================= - -This release drops support for compiling with Swift 2.x. -Swift 3.0.0 is now the minimum Swift version supported. - -### API Breaking Changes - -* None. - -### Enhancements - -* Add change notifications for individual objects with an API similar to that - of collection notifications. - -### Bugfixes - -* Fix Realm Objective-C compilation errors with Xcode 8.3 beta 1. -* Fix several error handling issues when renewing expired authentication - tokens for synchronized Realms. -* Fix a race condition leading to bad_version exceptions being thrown in - Realm's background worker thread. - -2.3.0 Release notes (2017-01-19) -============================================================= - -### Sync Breaking Changes - -* Make `PermissionChange`'s `id` property a primary key. - -### API Breaking Changes - -* None. - -### Enhancements - -* Add `SyncPermissionOffer` and `SyncPermissionOfferResponse` classes to allow - creating and accepting permission change events to synchronized Realms between - different users. -* Support monitoring sync transfer progress by registering notification blocks - on `SyncSession`. Specify the transfer direction (`.upload`/`.download`) and - mode (`.reportIndefinitely`/`.forCurrentlyOutstandingWork`) to monitor. - -### Bugfixes - -* Fix a call to `commitWrite(withoutNotifying:)` committing a transaction that - would not have triggered a notification incorrectly skipping the next - notification. -* Fix incorrect results and crashes when conflicting object insertions are - merged by the synchronization mechanism when there is a collection - notification registered for that object type. - -2.2.0 Release notes (2017-01-12) -============================================================= - -### Sync Breaking Changes (In Beta) - -* Sync-related error reporting behavior has been changed. Errors not related - to a particular user or session are only reported if they are classed as - 'fatal' by the underlying sync engine. -* Added `RLMSyncErrorClientResetError` to `RLMSyncError` enum. - -### API Breaking Changes - -* The following Objective-C APIs have been deprecated in favor of newer or preferred versions: - -| Deprecated API | New API | -|:------------------------------------------------------------|:------------------------------------------------------------| -| `-[RLMArray sortedResultsUsingProperty:]` | `-[RLMArray sortedResultsUsingKeyPath:]` | -| `-[RLMCollection sortedResultsUsingProperty:]` | `-[RLMCollection sortedResultsUsingKeyPath:]` | -| `-[RLMResults sortedResultsUsingProperty:]` | `-[RLMResults sortedResultsUsingKeyPath:]` | -| `+[RLMSortDescriptor sortDescriptorWithProperty:ascending]` | `+[RLMSortDescriptor sortDescriptorWithKeyPath:ascending:]` | -| `RLMSortDescriptor.property` | `RLMSortDescriptor.keyPath` | - -* The following Swift APIs have been deprecated in favor of newer or preferred versions: - -| Deprecated API | New API | -|:------------------------------------------------------|:-------------------------------------------------| -| `LinkingObjects.sorted(byProperty:ascending:)` | `LinkingObjects.sorted(byKeyPath:ascending:)` | -| `List.sorted(byProperty:ascending:)` | `List.sorted(byKeyPath:ascending:)` | -| `RealmCollection.sorted(byProperty:ascending:)` | `RealmCollection.sorted(byKeyPath:ascending:)` | -| `Results.sorted(byProperty:ascending:)` | `Results.sorted(byKeyPath:ascending:)` | -| `SortDescriptor(property:ascending:)` | `SortDescriptor(keyPath:ascending:)` | -| `SortDescriptor.property` | `SortDescriptor.keyPath` | - -### Enhancements - -* Introduce APIs for safely passing objects between threads. Create a - thread-safe reference to a thread-confined object by passing it to the - `+[RLMThreadSafeReference referenceWithThreadConfined:]`/`ThreadSafeReference(to:)` - constructor, which you can then safely pass to another thread to resolve in - the new Realm with `-[RLMRealm resolveThreadSafeReference:]`/`Realm.resolve(_:)`. -* Realm collections can now be sorted by properties over to-one relationships. -* Optimized `CONTAINS` queries to use Boyer-Moore algorithm - (around 10x speedup on large datasets). - -### Bugfixes - -* Setting `deleteRealmIfMigrationNeeded` now also deletes the Realm if a file - format migration is required, such as when moving from a file last accessed - with Realm 0.x to 1.x, or 1.x to 2.x. -* Fix queries containing nested `SUBQUERY` expressions. -* Fix spurious incorrect thread exceptions when a thread id happens to be - reused while an RLMRealm instance from the old thread still exists. -* Fixed various bugs in aggregate methods (max, min, avg, sum). - -2.1.2 Release notes (2016--12-19) -============================================================= - -This release adds binary versions of Swift 3.0.2 frameworks built with Xcode 8.2. - -### Sync Breaking Changes (In Beta) - -* Rename occurences of "iCloud" with "CloudKit" in APIs and comments to match - naming in the Realm Object Server. - -### API Breaking Changes - -* None. - -### Enhancements - -* Add support for 'LIKE' queries (wildcard matching). - -### Bugfixes - -* Fix authenticating with CloudKit. -* Fix linker warning about "Direct access to global weak symbol". - -2.1.1 Release notes (2016-12-02) -============================================================= - -### Enhancements - -* Add `RealmSwift.ObjectiveCSupport.convert(object:)` methods to help write - code that interoperates between Realm Objective-C and Realm Swift APIs. -* Throw exceptions when opening a Realm with an incorrect configuration, like: - * `readOnly` set with a sync configuration. - * `readOnly` set with a migration block. - * migration block set with a sync configuration. -* Greatly improve performance of write transactions which make a large number of - changes to indexed properties, including the automatic migration when opening - files written by Realm 1.x. - -### Bugfixes - -* Reset sync metadata Realm in case of decryption error. -* Fix issue preventing using synchronized Realms in Xcode Playgrounds. -* Fix assertion failure when migrating a model property from object type to - `RLMLinkingObjects` type. -* Fix a `LogicError: Bad version number` exception when using `RLMResults` with - no notification blocks and explicitly called `-[RLMRealm refresh]` from that - thread. -* Logged-out users are no longer returned from `+[RLMSyncUser currentUser]` or - `+[RLMSyncUser allUsers]`. -* Fix several issues which could occur when the 1001st object of a given type - was created or added to an RLMArray/List, including crashes when rerunning - existing queries and possibly data corruption. -* Fix a potential crash when the application exits due to a race condition in - the destruction of global static variables. -* Fix race conditions when waiting for sync uploads or downloads to complete - which could result in crashes or the callback being called too early. - -2.1.0 Release notes (2016-11-18) -============================================================= - -### Sync Breaking Changes (In Beta) - -* None. - -### API breaking changes - -* None. - -### Enhancements - -* Add the ability to skip calling specific notification blocks when committing - a write transaction. - -### Bugfixes - -* Deliver collection notifications when beginning a write transaction which - advances the read version of a Realm (previously only Realm-level - notifications were sent). -* Fix some scenarios which would lead to inconsistent states when using - collection notifications. -* Fix several race conditions in the notification functionality. -* Don't send Realm change notifications when canceling a write transaction. - -2.0.4 Release notes (2016-11-14) -============================================================= - -### Sync Breaking Changes (In Beta) - -* Remove `RLMAuthenticationActions` and replace - `+[RLMSyncCredential credentialWithUsername:password:actions:]` with - `+[RLMSyncCredential credentialsWithUsername:password:register:]`. -* Rename `+[RLMSyncUser authenticateWithCredential:]` to - `+[RLMSyncUser logInWithCredentials:]`. -* Rename "credential"-related types and methods to - `RLMSyncCredentials`/`SyncCredentials` and consistently refer to credentials - in the plural form. -* Change `+[RLMSyncUser all]` to return a dictionary of identifiers to users and - rename to: - * `+[RLMSyncUser allUsers]` in Objective-C. - * `SyncUser.allUsers()` in Swift 2. - * `SyncUser.all` in Swift 3. -* Rename `SyncManager.sharedManager()` to `SyncManager.shared` in Swift 3. -* Change `Realm.Configuration.syncConfiguration` to take a `SyncConfiguration` - struct rather than a named tuple. -* `+[RLMSyncUser logInWithCredentials:]` now invokes its callback block on a - background queue. - -### API breaking changes - -* None. - -### Enhancements - -* Add `+[RLMSyncUser currentUser]`. -* Add the ability to change read, write and management permissions for - synchronized Realms using the management Realm obtained via the - `-[RLMSyncUser managementRealmWithError:]` API and the - `RLMSyncPermissionChange` class. - -### Bugfixes - -* None. - -2.0.3 Release notes (2016-10-27) -============================================================= - -This release adds binary versions of Swift 3.0.1 frameworks built with Xcode 8.1 -GM seed. - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix a `BadVersion` exception caused by a race condition when delivering - collection change notifications. -* Fix an assertion failure when additional model classes are added and - `deleteRealmIfMigrationNeeded` is enabled. -* Fix a `BadTransactLog` exception when deleting an `RLMResults` in a synced - Realm. -* Fix an assertion failure when a write transaction is in progress at the point - of process termination. -* Fix a crash that could occur when working with a `RLMLinkingObject` property - of an unmanaged object. - -2.0.2 Release notes (2016-10-05) -============================================================= - -This release is not protocol-compatible with previous version of the Realm -Mobile Platform. - -### API breaking changes - -* Rename Realm Swift's `User` to `SyncUser` to make clear that it relates to the - Realm Mobile Platform, and to avoid potential conflicts with other `User` types. - -### Bugfixes - -* Fix Realm headers to be compatible with pre-C++11 dialects of Objective-C++. -* Fix incorrect merging of RLMArray/List changes when objects with the same - primary key are created on multiple devices. -* Fix bad transaction log errors after deleting objects on a different device. -* Fix a BadVersion error when a background worker finishes running while older - results from that worker are being delivered to a different thread. - -2.0.1 Release notes (2016-09-29) -============================================================= - -### Bugfixes - -* Fix an assertion failure when opening a Realm file written by a 1.x version - of Realm which has an indexed nullable int or bool property. - -2.0.0 Release notes (2016-09-27) -============================================================= - -This release introduces support for the Realm Mobile Platform! -See for an overview -of these great new features. - -### API breaking changes - -* By popular demand, `RealmSwift.Error` has been moved from the top-level - namespace into a `Realm` extension and is now `Realm.Error`, so that it no - longer conflicts with `Swift.Error`. -* Files written by Realm 2.0 cannot be read by 1.x or earlier versions. Old - files can still be opened. - -### Enhancements - -* The .log, .log_a and .log_b files no longer exist and the state tracked in - them has been moved to the main Realm file. This reduces the number of open - files needed by Realm, improves performance of both opening and writing to - Realms, and eliminates a small window where committing write transactions - would prevent other processes from opening the file. - -### Bugfixes - -* Fix an assertion failure when sorting by zero properties. -* Fix a mid-commit crash in one process also crashing all other processes with - the same Realm open. -* Properly initialize new nullable float and double properties added to - existing objects to null rather than 0. -* Fix a stack overflow when objects with indexed string properties had very - long common prefixes. -* Fix a race condition which could lead to crashes when using async queries or - collection notifications. -* Fix a bug which could lead to incorrect state when an object which links to - itself is deleted from the Realm. - -1.1.0 Release notes (2016-09-16) -============================================================= - -This release brings official support for Xcode 8, Swift 2.3 and Swift 3.0. -Prebuilt frameworks are now built with Xcode 7.3.1 and Xcode 8.0. - -### API breaking changes - -* Deprecate `migrateRealm:` in favor of new `performMigrationForConfiguration:error:` method - that follows Cocoa's NSError conventions. -* Fix issue where `RLMResults` used `id `instead of its generic type as the return - type of subscript. - -### Enhancements - -* Improve error message when using NSNumber incorrectly in Swift models. -* Further reduce the download size of the prebuilt static libraries. -* Improve sort performance, especially on non-nullable columns. -* Allow partial initialization of object by `initWithValue:`, deferring - required property checks until object is added to Realm. - -### Bugfixes - -* Fix incorrect truncation of the constant value for queries of the form - `column < value` for `float` and `double` columns. -* Fix crash when an aggregate is accessed as an `Int8`, `Int16`, `Int32`, or `Int64`. -* Fix a race condition that could lead to a crash if an RLMArray or List was - deallocated on a different thread than it was created on. -* Fix a crash when the last reference to an observed object is released from - within the observation. -* Fix a crash when `initWithValue:` is used to create a nested object for a class - with an uninitialized schema. -* Enforce uniqueness for `RealmOptional` primary keys when using the `value` setter. - -1.0.2 Release notes (2016-07-13) -============================================================= - -### API breaking changes - -* Attempting to add an object with no properties to a Realm now throws rather than silently - doing nothing. - -### Enhancements - -* Swift: A `write` block may now `throw`, reverting any changes already made in - the transaction. -* Reduce address space used when committing write transactions. -* Significantly reduce the download size of prebuilt binaries and slightly - reduce the final size contribution of Realm to applications. -* Improve performance of accessing RLMArray properties and creating objects - with List properties. - -### Bugfixes - -* Fix a crash when reading the shared schema from an observed Swift object. -* Fix crashes or incorrect results when passing an array of values to - `createOrUpdate` after reordering the class's properties. -* Ensure that the initial call of a Results notification block is always passed - .Initial even if there is a write transaction between when the notification - is added and when the first notification is delivered. -* Fix a crash when deleting all objects in a Realm while fast-enumerating query - results from that Realm. -* Handle EINTR from flock() rather than crashing. -* Fix incorrect behavior following a call to `[RLMRealm compact]`. -* Fix live updating and notifications for Results created from a predicate involving - an inverse relationship to be triggered when an object at the other end of the relationship - is modified. - -1.0.1 Release notes (2016-06-12) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Significantly improve performance of opening Realm files, and slightly - improve performance of committing write transactions. - -### Bugfixes - -* Swift: Fix an error thrown when trying to create or update `Object` instances via - `add(:_update:)` with a primary key property of type `RealmOptional`. -* Xcode playground in Swift release zip now runs successfully. -* The `key` parameter of `Realm.objectForPrimaryKey(_:key:)`/ `Realm.dynamicObjectForPrimaryKey(_:key:)` - is now marked as optional. -* Fix a potential memory leak when closing Realms after a Realm file has been - opened on multiple threads which are running in active run loops. -* Fix notifications breaking on tvOS after a very large number of write - transactions have been committed. -* Fix a "Destruction of mutex in use" assertion failure after an error while - opening a file. -* Realm now throws an exception if an `Object` subclass is defined with a managed Swift `lazy` property. - Objects with ignored `lazy` properties should now work correctly. -* Update the LLDB script to work with recent changes to the implementation of `RLMResults`. -* Fix an assertion failure when a Realm file is deleted while it is still open, - and then a new Realm is opened at the same path. Note that this is still not - a supported scenario, and may break in other ways. - -1.0.0 Release notes (2016-05-25) -============================================================= - -No changes since 0.103.2. - -0.103.2 Release notes (2016-05-24) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Improve the error messages when an I/O error occurs in `writeCopyToURL`. - -### Bugfixes - -* Fix an assertion failure which could occur when opening a Realm after opening - that Realm failed previously in some specific ways in the same run of the - application. -* Reading optional integers, floats, and doubles from within a migration block - now correctly returns `nil` rather than 0 when the stored value is `nil`. - -0.103.1 Release notes (2016-05-19) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix a bug that sometimes resulted in a single object's NSData properties - changing from `nil` to a zero-length non-`nil` NSData when a different object - of the same type was deleted. - -0.103.0 Release notes (2016-05-18) -============================================================= - -### API breaking changes - -* All functionality deprecated in previous releases has been removed entirely. -* Support for Xcode 6.x & Swift prior to 2.2 has been completely removed. -* `RLMResults`/`Results` now become empty when a `RLMArray`/`List` or object - they depend on is deleted, rather than throwing an exception when accessed. -* Migrations are no longer run when `deleteRealmIfMigrationNeeded` is set, - recreating the file instead. - -### Enhancements - -* Added `invalidated` properties to `RLMResults`/`Results`, `RLMLinkingObjects`/`LinkingObjects`, - `RealmCollectionType` and `AnyRealmCollection`. These properties report whether the Realm - the object is associated with has been invalidated. -* Some `NSError`s created by Realm now have more descriptive user info payloads. - -### Bugfixes - -* None. - -0.102.1 Release notes (2016-05-13) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Return `RLMErrorSchemaMismatch` error rather than the more generic `RLMErrorFail` - when a migration is required. -* Improve the performance of allocating instances of `Object` subclasses - that have `LinkingObjects` properties. - -### Bugfixes - -* `RLMLinkingObjects` properties declared in Swift subclasses of `RLMObject` - now work correctly. -* Fix an assertion failure when deleting all objects of a type, inserting more - objects, and then deleting some of the newly inserted objects within a single - write transaction when there is an active notification block for a different - object type which links to the objects being deleted. -* Fix crashes and/or incorrect results when querying over multiple levels of - `LinkingObjects` properties. -* Fix opening read-only Realms on multiple threads at once. -* Fix a `BadTransactLog` exception when storing dates before the unix epoch (1970-01-01). - -0.102.0 Release notes (2016-05-09) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Add a method to rename properties during migrations: - * Swift: `Migration.renamePropertyForClass(_:oldName:newName:)` - * Objective-C: `-[RLMMigration renamePropertyForClass:oldName:newName:]` -* Add `deleteRealmIfMigrationNeeded` to - `RLMRealmConfiguration`/`Realm.Configuration`. When this is set to `true`, - the Realm file will be automatically deleted and recreated when there is a - schema mismatch rather than migrated to the new schema. - -### Bugfixes - -* Fix `BETWEEN` queries that traverse `RLMArray`/`List` properties to ensure that - a single related object satisfies the `BETWEEN` criteria, rather than allowing - different objects in the array to satisfy the lower and upper bounds. -* Fix a race condition when a Realm is opened on one thread while it is in the - middle of being closed on another thread which could result in crashes. -* Fix a bug which could result in changes made on one thread being applied - incorrectly on other threads when those threads are refreshed. -* Fix crash when migrating to the new date format introduced in 0.101.0. -* Fix crash when querying inverse relationships when objects are deleted. - -0.101.0 Release notes (2016-05-04) -============================================================= - -### API breaking changes - -* Files written by this version of Realm cannot be read by older versions of - Realm. Existing files will automatically be upgraded when they are opened. - -### Enhancements - -* Greatly improve performance of collection change calculation for complex - object graphs, especially for ones with cycles. -* NSDate properties now support nanoseconds precision. -* Opening a single Realm file on multiple threads now shares a single memory - mapping of the file for all threads, significantly reducing the memory - required to work with large files. -* Crashing while in the middle of a write transaction no longer blocks other - processes from performing write transactions on the same file. -* Improve the performance of refreshing a Realm (including via autorefresh) - when there are live Results/RLMResults objects for that Realm. - -### Bugfixes - -* Fix an assertion failure of "!more_before || index >= std::prev(it)->second)" - in `IndexSet::do_add()`. -* Fix a crash when an `RLMArray` or `List` object is destroyed from the wrong - thread. - -0.100.0 Release notes (2016-04-29) -============================================================= - -### API breaking changes - -* `-[RLMObject linkingObjectsOfClass:forProperty]` and `Object.linkingObjects(_:forProperty:)` - are deprecated in favor of properties of type `RLMLinkingObjects` / `LinkingObjects`. - -### Enhancements - -* The automatically-maintained inverse direction of relationships can now be exposed as - properties of type `RLMLinkingObjects` / `LinkingObjects`. These properties automatically - update to reflect the objects that link to the target object, can be used in queries, and - can be filtered like other Realm collection types. -* Queries that compare objects for equality now support multi-level key paths. - -### Bugfixes - -* Fix an assertion failure when a second write transaction is committed after a - write transaction deleted the object containing an RLMArray/List which had an - active notification block. -* Queries that compare `RLMArray` / `List` properties using != now give the correct results. - -0.99.1 Release notes (2016-04-26) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix a scenario that could lead to the assertion failure - "m_advancer_sg->get_version_of_current_transaction() == - new_notifiers.front()->version()". - -0.99.0 Release notes (2016-04-22) -============================================================= - -### API breaking changes - -* Deprecate properties of type `id`/`AnyObject`. This type was rarely used, - rarely useful and unsupported in every other Realm binding. -* The block for `-[RLMArray addNotificationBlock:]` and - `-[RLMResults addNotificationBlock:]` now takes another parameter. -* The following Objective-C APIs have been deprecated in favor of newer or preferred versions: - -| Deprecated API | New API | -|:-------------------------------------------------------|:------------------------------------------------------| -| `-[RLMRealm removeNotification:]` | `-[RLMNotificationToken stop]` | -| `RLMRealmConfiguration.path` | `RLMRealmConfiguration.fileURL` | -| `RLMRealm.path` | `RLMRealmConfiguration.fileURL` | -| `RLMRealm.readOnly` | `RLMRealmConfiguration.readOnly` | -| `+[RLMRealm realmWithPath:]` | `+[RLMRealm realmWithURL:]` | -| `+[RLMRealm writeCopyToPath:error:]` | `+[RLMRealm writeCopyToURL:encryptionKey:error:]` | -| `+[RLMRealm writeCopyToPath:encryptionKey:error:]` | `+[RLMRealm writeCopyToURL:encryptionKey:error:]` | -| `+[RLMRealm schemaVersionAtPath:error:]` | `+[RLMRealm schemaVersionAtURL:encryptionKey:error:]` | -| `+[RLMRealm schemaVersionAtPath:encryptionKey:error:]` | `+[RLMRealm schemaVersionAtURL:encryptionKey:error:]` | - -* The following Swift APIs have been deprecated in favor of newer or preferred versions: - -| Deprecated API | New API | -|:----------------------------------------------|:-----------------------------------------| -| `Realm.removeNotification(_:)` | `NotificationToken.stop()` | -| `Realm.Configuration.path` | `Realm.Configuration.fileURL` | -| `Realm.path` | `Realm.Configuration.fileURL` | -| `Realm.readOnly` | `Realm.Configuration.readOnly` | -| `Realm.writeCopyToPath(_:encryptionKey:)` | `Realm.writeCopyToURL(_:encryptionKey:)` | -| `schemaVersionAtPath(_:encryptionKey:error:)` | `schemaVersionAtURL(_:encryptionKey:)` | - -### Enhancements - -* Add information about what rows were added, removed, or modified to the - notifications sent to the Realm collections. -* Improve error when illegally appending to an `RLMArray` / `List` property from a default value - or the standalone initializer (`init()`) before the schema is ready. - -### Bugfixes - -* Fix a use-after-free when an associated object's dealloc method is used to - remove observers from an RLMObject. -* Fix a small memory leak each time a Realm file is opened. -* Return a recoverable `RLMErrorAddressSpaceExhausted` error rather than - crash when there is insufficient available address space on Realm - initialization or write commit. - -0.98.8 Release notes (2016-04-15) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fixed a bug that caused some encrypted files created using - `-[RLMRealm writeCopyToPath:encryptionKey:error:]` to fail to open. - -0.98.7 Release notes (2016-04-13) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Mark further initializers in Objective-C as NS_DESIGNATED_INITIALIZER to prevent that these aren't - correctly defined in Swift Object subclasses, which don't qualify for auto-inheriting the required initializers. -* `-[RLMResults indexOfObjectWithPredicate:]` now returns correct results - for `RLMResults` instances that were created by filtering an `RLMArray`. -* Adjust how RLMObjects are destroyed in order to support using an associated - object on an RLMObject to remove KVO observers from that RLMObject. -* `-[RLMResults indexOfObjectWithPredicate:]` now returns the index of the first matching object for a - sorted `RLMResults`, matching its documented behavior. -* Fix a crash when canceling a transaction that set a relationship. -* Fix a crash when a query referenced a deleted object. - -0.98.6 Release notes (2016-03-25) -============================================================= - -Prebuilt frameworks are now built with Xcode 7.3. - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix running unit tests on iOS simulators and devices with Xcode 7.3. - -0.98.5 Release notes (2016-03-14) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix a crash when opening a Realm on 32-bit iOS devices. - -0.98.4 Release notes (2016-03-10) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Properly report changes made by adding an object to a Realm with - addOrUpdate:/createOrUpdate: to KVO observers for existing objects with that - primary key. -* Fix crashes and assorted issues when a migration which added object link - properties is rolled back due to an error in the migration block. -* Fix assertion failures when deleting objects within a migration block of a - type which had an object link property added in that migration. -* Fix an assertion failure in `Query::apply_patch` when updating certain kinds - of queries after a write transaction is committed. - -0.98.3 Release notes (2016-02-26) -============================================================= - -### Enhancements - -* Initializing the shared schema is 3x faster. - -### Bugfixes - -* Using Realm Objective-C from Swift while having Realm Swift linked no longer causes that the - declared `ignoredProperties` are not taken into account. -* Fix assertion failures when rolling back a migration which added Object link - properties to a class. -* Fix potential errors when cancelling a write transaction which modified - multiple `RLMArray`/`List` properties. -* Report the correct value for inWriteTransaction after attempting to commit a - write transaction fails. -* Support CocoaPods 1.0 beginning from prerelease 1.0.0.beta.4 while retaining - backwards compatibility with 0.39. - -0.98.2 Release notes (2016-02-18) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Aggregate operations (`ANY`, `NONE`, `@count`, `SUBQUERY`, etc.) are now supported for key paths - that begin with an object relationship so long as there is a `RLMArray`/`List` property at some - point in a key path. -* Predicates of the form `%@ IN arrayProperty` are now supported. - -### Bugfixes - -* Use of KVC collection operators on Swift collection types no longer throws an exception. -* Fix reporting of inWriteTransaction in notifications triggered by - `beginWriteTransaction`. -* The contents of `List` and `Optional` properties are now correctly preserved when copying - a Swift object from one Realm to another, and performing other operations that result in a - Swift object graph being recursively traversed from Objective-C. -* Fix a deadlock when queries are performed within a Realm notification block. -* The `ANY` / `SOME` / `NONE` qualifiers are now required in comparisons involving a key path that - traverse a `RLMArray`/`List` property. Previously they were only required if the first key in the - key path was an `RLMArray`/`List` property. -* Fix several scenarios where the default schema would be initialized - incorrectly if the first Realm opened used a restricted class subset (via - `objectClasses`/`objectTypes`). - -0.98.1 Release notes (2016-02-10) -============================================================= - -### Bugfixes - -* Fix crashes when deleting an object containing an `RLMArray`/`List` which had - previously been queried. -* Fix a crash when deleting an object containing an `RLMArray`/`List` with - active notification blocks. -* Fix duplicate file warnings when building via CocoaPods. -* Fix crash or incorrect results when calling `indexOfObject:` on an - `RLMResults` derived from an `RLMArray`. - -0.98.0 Release notes (2016-02-04) -============================================================= - -### API breaking changes - -* `+[RLMRealm realmWithPath:]`/`Realm.init(path:)` now inherits from the default - configuration. -* Swift 1.2 is no longer supported. - -### Enhancements - -* Add `addNotificationBlock` to `RLMResults`, `Results`, `RLMArray`, and - `List`, which calls the given block whenever the collection changes. -* Do a lot of the work for keeping `RLMResults`/`Results` up-to-date after - write transactions on a background thread to help avoid blocking the main - thread. -* `NSPredicate`'s `SUBQUERY` operator is now supported. It has the following limitations: - * `@count` is the only operator that may be applied to the `SUBQUERY` expression. - * The `SUBQUERY(…).@count` expression must be compared with a constant. - * Correlated subqueries are not yet supported. - -### Bugfixes - -* None. - -0.97.1 Release notes (2016-01-29) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Swift: Added `Error` enum allowing to catch errors e.g. thrown on initializing - `RLMRealm`/`Realm` instances. -* Fail with `RLMErrorFileNotFound` instead of the more generic `RLMErrorFileAccess`, - if no file was found when a realm was opened as read-only or if the directory part - of the specified path was not found when a copy should be written. -* Greatly improve performance when deleting objects with one or more indexed - properties. -* Indexing `BOOL`/`Bool` and `NSDate` properties are now supported. -* Swift: Add support for indexing optional properties. - -### Bugfixes - -* Fix incorrect results or crashes when using `-[RLMResults setValue:forKey:]` - on an RLMResults which was filtered on the key being set. -* Fix crashes when an RLMRealm is deallocated from the wrong thread. -* Fix incorrect results from aggregate methods on `Results`/`RLMResults` after - objects which were previously in the results are deleted. -* Fix a crash when adding a new property to an existing class with over a - million objects in the Realm. -* Fix errors when opening encrypted Realm files created with writeCopyToPath. -* Fix crashes or incorrect results for queries that use relationship equality - in cases where the `RLMResults` is kept alive and instances of the target class - of the relationship are deleted. - -0.97.0 Release notes (2015-12-17) -============================================================= - -### API breaking changes - -* All functionality deprecated in previous releases has been removed entirely. -* Add generic type annotations to NSArrays and NSDictionaries in public APIs. -* Adding a Realm notification block on a thread not currently running from - within a run loop throws an exception rather than silently never calling the - notification block. - -### Enhancements - -* Support for tvOS. -* Support for building Realm Swift from source when using Carthage. -* The block parameter of `-[RLMRealm transactionWithBlock:]`/`Realm.write(_:)` is - now marked as `__attribute__((noescape))`/`@noescape`. -* Many forms of queries with key paths on both sides of the comparison operator - are now supported. -* Add support for KVC collection operators in `RLMResults` and `RLMArray`. -* Fail instead of deadlocking in `+[RLMRealm sharedSchema]`, if a Swift property is initialized - to a computed value, which attempts to open a Realm on its own. - -### Bugfixes - -* Fix poor performance when calling `-[RLMRealm deleteObjects:]` on an - `RLMResults` which filtered the objects when there are other classes linking - to the type of the deleted objects. -* An exception is now thrown when defining `Object` properties of an unsupported - type. - -0.96.3 Release notes (2015-12-04) -============================================================= - -### Enhancements - -* Queries are no longer limited to 16 levels of grouping. -* Rework the implementation of encrypted Realms to no longer interfere with - debuggers. - -### Bugfixes - -* Fix crash when trying to retrieve object instances via `dynamicObjects`. -* Throw an exception when querying on a link providing objects, which are from a different Realm. -* Return empty results when querying on a link providing an unattached object. -* Fix crashes or incorrect results when calling `-[RLMRealm refresh]` during - fast enumeration. -* Add `Int8` support for `RealmOptional`, `MinMaxType` and `AddableType`. -* Set the default value for newly added non-optional NSData properties to a - zero-byte NSData rather than nil. -* Fix a potential crash when deleting all objects of a class. -* Fix performance problems when creating large numbers of objects with - `RLMArray`/`List` properties. -* Fix memory leak when using Object(value:) for subclasses with - `List` or `RealmOptional` properties. -* Fix a crash when computing the average of an optional integer property. -* Fix incorrect search results for some queries on integer properties. -* Add error-checking for nil realm parameters in many methods such as - `+[RLMObject allObjectsInRealm:]`. -* Fix a race condition between commits and opening Realm files on new threads - that could lead to a crash. -* Fix several crashes when opening Realm files. -* `-[RLMObject createInRealm:withValue:]`, `-[RLMObject createOrUpdateInRealm:withValue:]`, and - their variants for the default Realm now always match the contents of an `NSArray` against properties - in the same order as they are defined in the model. - -0.96.2 Release notes (2015-10-26) -============================================================= - -Prebuilt frameworks are now built with Xcode 7.1. - -### Bugfixes - -* Fix ignoring optional properties in Swift. -* Fix CocoaPods installation on case-sensitive file systems. - -0.96.1 Release notes (2015-10-20) -============================================================= - -### Bugfixes - -* Support assigning `Results` to `List` properties via KVC. -* Honor the schema version set in the configuration in `+[RLMRealm migrateRealm:]`. -* Fix crash when using optional Int16/Int32/Int64 properties in Swift. - -0.96.0 Release notes (2015-10-14) -============================================================= - -* No functional changes since beta2. - -0.96.0-beta2 Release notes (2015-10-08) -============================================================= - -### Bugfixes - -* Add RLMOptionalBase.h to the podspec. - -0.96.0-beta Release notes (2015-10-07) -============================================================= - -### API breaking changes - -* CocoaPods v0.38 or greater is now required to install Realm and RealmSwift - as pods. - -### Enhancements - -* Functionality common to both `List` and `Results` is now declared in a - `RealmCollectionType` protocol that both types conform to. -* `Results.realm` now returns an `Optional` in order to conform to - `RealmCollectionType`, but will always return `.Some()` since a `Results` - cannot exist independently from a `Realm`. -* Aggregate operations are now available on `List`: `min`, `max`, `sum`, - `average`. -* Committing write transactions (via `commitWrite` / `commitWriteTransaction` and - `write` / `transactionWithBlock`) now optionally allow for handling errors when - the disk is out of space. -* Added `isEmpty` property on `RLMRealm`/`Realm` to indicate if it contains any - objects. -* The `@count`, `@min`, `@max`, `@sum` and `@avg` collection operators are now - supported in queries. - -### Bugfixes - -* Fix assertion failure when inserting NSData between 8MB and 16MB in size. -* Fix assertion failure when rolling back a migration which removed an object - link or `RLMArray`/`List` property. -* Add the path of the file being opened to file open errors. -* Fix a crash that could be triggered by rapidly opening and closing a Realm - many times on multiple threads at once. -* Fix several places where exception messages included the name of the wrong - function which failed. - -0.95.3 Release notes (2015-10-05) -============================================================= - -### Bugfixes - -* Compile iOS Simulator framework architectures with `-fembed-bitcode-marker`. -* Fix crashes when the first Realm opened uses a class subset and later Realms - opened do not. -* Fix inconsistent errors when `Object(value: ...)` is used to initialize the - default value of a property of an `Object` subclass. -* Throw an exception when a class subset has objects with array or object - properties of a type that are not part of the class subset. - -0.95.2 Release notes (2015-09-24) -============================================================= - -* Enable bitcode for iOS and watchOS frameworks. -* Build libraries with Xcode 7 final rather than the GM. - -0.95.1 Release notes (2015-09-23) -============================================================= - -### Enhancements - -* Add missing KVO handling for moving and exchanging objects in `RLMArray` and - `List`. - -### Bugfixes - -* Setting the primary key property on persisted `RLMObject`s / `Object`s - via subscripting or key-value coding will cause an exception to be thrown. -* Fix crash due to race condition in `RLMRealmConfiguration` where the default - configuration was in the process of being copied in one thread, while - released in another. -* Fix crash when a migration which removed an object or array property is - rolled back due to an error. - -0.95.0 Release notes (2015-08-25) -============================================================= - -### API breaking changes - -* The following APIs have been deprecated in favor of the new `RLMRealmConfiguration` class in Realm Objective-C: - -| Deprecated API | New API | -|:------------------------------------------------------------------|:---------------------------------------------------------------------------------| -| `+[RLMRealm realmWithPath:readOnly:error:]` | `+[RLMRealm realmWithConfiguration:error:]` | -| `+[RLMRealm realmWithPath:encryptionKey:readOnly:error:]` | `+[RLMRealm realmWithConfiguration:error:]` | -| `+[RLMRealm setEncryptionKey:forRealmsAtPath:]` | `-[RLMRealmConfiguration setEncryptionKey:]` | -| `+[RLMRealm inMemoryRealmWithIdentifier:]` | `+[RLMRealm realmWithConfiguration:error:]` | -| `+[RLMRealm defaultRealmPath]` | `+[RLMRealmConfiguration defaultConfiguration]` | -| `+[RLMRealm setDefaultRealmPath:]` | `+[RLMRealmConfiguration setDefaultConfiguration:]` | -| `+[RLMRealm setDefaultRealmSchemaVersion:withMigrationBlock]` | `RLMRealmConfiguration.schemaVersion` and `RLMRealmConfiguration.migrationBlock` | -| `+[RLMRealm setSchemaVersion:forRealmAtPath:withMigrationBlock:]` | `RLMRealmConfiguration.schemaVersion` and `RLMRealmConfiguration.migrationBlock` | -| `+[RLMRealm migrateRealmAtPath:]` | `+[RLMRealm migrateRealm:]` | -| `+[RLMRealm migrateRealmAtPath:encryptionKey:]` | `+[RLMRealm migrateRealm:]` | - -* The following APIs have been deprecated in favor of the new `Realm.Configuration` struct in Realm Swift for Swift 1.2: - -| Deprecated API | New API | -|:--------------------------------------------------------------|:-----------------------------------------------------------------------------| -| `Realm.defaultPath` | `Realm.Configuration.defaultConfiguration` | -| `Realm(path:readOnly:encryptionKey:error:)` | `Realm(configuration:error:)` | -| `Realm(inMemoryIdentifier:)` | `Realm(configuration:error:)` | -| `Realm.setEncryptionKey(:forPath:)` | `Realm(configuration:error:)` | -| `setDefaultRealmSchemaVersion(schemaVersion:migrationBlock:)` | `Realm.Configuration.schemaVersion` and `Realm.Configuration.migrationBlock` | -| `setSchemaVersion(schemaVersion:realmPath:migrationBlock:)` | `Realm.Configuration.schemaVersion` and `Realm.Configuration.migrationBlock` | -| `migrateRealm(path:encryptionKey:)` | `migrateRealm(configuration:)` | - -* The following APIs have been deprecated in favor of the new `Realm.Configuration` struct in Realm Swift for Swift 2.0: - -| Deprecated API | New API | -|:--------------------------------------------------------------|:-----------------------------------------------------------------------------| -| `Realm.defaultPath` | `Realm.Configuration.defaultConfiguration` | -| `Realm(path:readOnly:encryptionKey:) throws` | `Realm(configuration:) throws` | -| `Realm(inMemoryIdentifier:)` | `Realm(configuration:) throws` | -| `Realm.setEncryptionKey(:forPath:)` | `Realm(configuration:) throws` | -| `setDefaultRealmSchemaVersion(schemaVersion:migrationBlock:)` | `Realm.Configuration.schemaVersion` and `Realm.Configuration.migrationBlock` | -| `setSchemaVersion(schemaVersion:realmPath:migrationBlock:)` | `Realm.Configuration.schemaVersion` and `Realm.Configuration.migrationBlock` | -| `migrateRealm(path:encryptionKey:)` | `migrateRealm(configuration:)` | - -* `List.extend` in Realm Swift for Swift 2.0 has been replaced with `List.appendContentsOf`, - mirroring changes to `RangeReplaceableCollectionType`. - -* Object properties on `Object` subclasses in Realm Swift must be marked as optional, - otherwise a runtime exception will be thrown. - -### Enhancements - -* Persisted properties of `RLMObject`/`Object` subclasses are now Key-Value - Observing compliant. -* The different options used to create Realm instances have been consolidated - into a single `RLMRealmConfiguration`/`Realm.Configuration` object. -* Enumerating Realm collections (`RLMArray`, `RLMResults`, `List<>`, - `Results<>`) now enumerates over a copy of the collection, making it no - longer an error to modify a collection during enumeration (either directly, - or indirectly by modifying objects to make them no longer match a query). -* Improve performance of object insertion in Swift to bring it roughly in line - with Objective-C. -* Allow specifying a specific list of `RLMObject` / `Object` subclasses to include - in a given Realm via `RLMRealmConfiguration.objectClasses` / `Realm.Configuration.objectTypes`. - -### Bugfixes - -* Subscripting on `RLMObject` is now marked as nullable. - -0.94.1 Release notes (2015-08-10) -============================================================= - -### API breaking changes - -* Building for watchOS requires Xcode 7 beta 5. - -### Enhancements - -* `Object.className` is now marked as `final`. - -### Bugfixes - -* Fix crash when adding a property to a model without updating the schema - version. -* Fix unnecessary redownloading of the core library when building from source. -* Fix crash when sorting by an integer or floating-point property on iOS 7. - -0.94.0 Release notes (2015-07-29) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Reduce the amount of memory used by RLMRealm notification listener threads. -* Avoid evaluating results eagerly when filtering and sorting. -* Add nullability annotations to the Objective-C API to provide enhanced compiler - warnings and bridging to Swift. -* Make `RLMResult`s and `RLMArray`s support Objective-C generics. -* Add support for building watchOS and bitcode-compatible apps. -* Make the exceptions thrown in getters and setters more informative. -* Add `-[RLMArray exchangeObjectAtIndex:withObjectAtIndex]` and `List.swap(_:_:)` - to allow exchanging the location of two objects in the given `RLMArray` / `List`. -* Added anonymous analytics on simulator/debugger runs. -* Add `-[RLMArray moveObjectAtIndex:toIndex:]` and `List.move(from:to:)` to - allow moving objects in the given `RLMArray` / `List`. - -### Bugfixes - -* Processes crashing due to an uncaught exception inside a write transaction will - no longer cause other processes using the same Realm to hang indefinitely. -* Fix incorrect results when querying for < or <= on ints that - require 64 bits to represent with a CPU that supports SSE 4.2. -* An exception will no longer be thrown when attempting to reset the schema - version or encryption key on an open Realm to the current value. -* Date properties on 32 bit devices will retain 64 bit second precision. -* Wrap calls to the block passed to `enumerate` in an autoreleasepool to reduce - memory growth when migrating a large amount of objects. -* In-memory realms no longer write to the Documents directory on iOS or - Application Support on OS X. - -0.93.2 Release notes (2015-06-12) -============================================================= - -### Bugfixes - -* Fixed an issue where the packaged OS X Realm.framework was built with - `GCC_GENERATE_TEST_COVERAGE_FILES` and `GCC_INSTRUMENT_PROGRAM_FLOW_ARCS` - enabled. -* Fix a memory leak when constructing standalone Swift objects with NSDate - properties. -* Throw an exception rather than asserting when an invalidated object is added - to an RLMArray. -* Fix a case where data loss would occur if a device was hard-powered-off - shortly after a write transaction was committed which had to expand the Realm - file. - -0.93.1 Release notes (2015-05-29) -============================================================= - -### Bugfixes - -* Objects are no longer copied into standalone objects during object creation. This fixes an issue where - nested objects with a primary key are sometimes duplicated rather than updated. -* Comparison predicates with a constant on the left of the operator and key path on the right now give - correct results. An exception is now thrown for predicates that do not yet support this ordering. -* Fix some crashes in `index_string.cpp` with int primary keys or indexed int properties. - -0.93.0 Release notes (2015-05-27) -============================================================= - -### API breaking changes - -* Schema versions are now represented as `uint64_t` (Objective-C) and `UInt64` (Swift) so that they have - the same representation on all architectures. - -### Enhancements - -* Swift: `Results` now conforms to `CVarArgType` so it can - now be passed as an argument to `Results.filter(_:...)` - and `List.filter(_:...)`. -* Swift: Made `SortDescriptor` conform to the `Equatable` and - `StringLiteralConvertible` protocols. -* Int primary keys are once again automatically indexed. -* Improve error reporting when attempting to mark a property of a type that - cannot be indexed as indexed. - -### Bugfixes - -* Swift: `RealmSwift.framework` no longer embeds `Realm.framework`, - which now allows apps using it to pass iTunes Connect validation. - -0.92.4 Release notes (2015-05-22) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Swift: Made `Object.init()` a required initializer. -* `RLMObject`, `RLMResults`, `Object` and `Results` can now be safely - deallocated (but still not used) from any thread. -* Improve performance of `-[RLMArray indexOfObjectWhere:]` and `-[RLMArray - indexOfObjectWithPredicate:]`, and implement them for standalone RLMArrays. -* Improved performance of most simple queries. - -### Bugfixes - -* The interprocess notification mechanism no longer uses dispatch worker threads, preventing it from - starving other GCD clients of the opportunity to execute blocks when dozens of Realms are open at once. - -0.92.3 Release notes (2015-05-13) -============================================================= - -### API breaking changes - -* Swift: `Results.average(_:)` now returns an optional, which is `nil` if and only if the results - set is empty. - -### Enhancements - -* Swift: Added `List.invalidated`, which returns if the given `List` is no longer - safe to be accessed, and is analogous to `-[RLMArray isInvalidated]`. -* Assertion messages are automatically logged to Crashlytics if it's loaded - into the current process to make it easier to diagnose crashes. - -### Bugfixes - -* Swift: Enumerating through a standalone `List` whose objects themselves - have list properties won't crash. -* Swift: Using a subclass of `RealmSwift.Object` in an aggregate operator of a predicate - no longer throws a spurious type error. -* Fix incorrect results for when using OR in a query on a `RLMArray`/`List<>`. -* Fix incorrect values from `[RLMResults count]`/`Results.count` when using - `!=` on an int property with no other query conditions. -* Lower the maximum doubling threshold for Realm file sizes from 128MB to 16MB - to reduce the amount of wasted space. - -0.92.2 Release notes (2015-05-08) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Exceptions raised when incorrect object types are used with predicates now contain more detailed information. -* Added `-[RLMMigration deleteDataForClassName:]` and `Migration.deleteData(_:)` - to enable cleaning up after removing object subclasses - -### Bugfixes - -* Prevent debugging of an application using an encrypted Realm to work around - frequent LLDB hangs. Until the underlying issue is addressed you may set - REALM_DISABLE_ENCRYPTION=YES in your application's environment variables to - have requests to open an encrypted Realm treated as a request for an - unencrypted Realm. -* Linked objects are properly updated in `createOrUpdateInRealm:withValue:`. -* List properties on Objects are now properly initialized during fast enumeration. - -0.92.1 Release notes (2015-05-06) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* `-[RLMRealm inWriteTransaction]` is now public. -* Realm Swift is now available on CoocaPods. - -### Bugfixes - -* Force code re-signing after stripping architectures in `strip-frameworks.sh`. - -0.92.0 Release notes (2015-05-05) -============================================================= - -### API breaking changes - -* Migration blocks are no longer called when a Realm file is first created. -* The following APIs have been deprecated in favor of newer method names: - -| Deprecated API | New API | -|:-------------------------------------------------------|:------------------------------------------------------| -| `-[RLMMigration createObject:withObject:]` | `-[RLMMigration createObject:withValue:]` | -| `-[RLMObject initWithObject:]` | `-[RLMObject initWithValue:]` | -| `+[RLMObject createInDefaultRealmWithObject:]` | `+[RLMObject createInDefaultRealmWithValue:]` | -| `+[RLMObject createInRealm:withObject:]` | `+[RLMObject createInRealm:withValue:]` | -| `+[RLMObject createOrUpdateInDefaultRealmWithObject:]` | `+[RLMObject createOrUpdateInDefaultRealmWithValue:]` | -| `+[RLMObject createOrUpdateInRealm:withObject:]` | `+[RLMObject createOrUpdateInRealm:withValue:]` | - -### Enhancements - -* `Int8` properties defined in Swift are now treated as integers, rather than - booleans. -* NSPredicates created using `+predicateWithValue:` are now supported. - -### Bugfixes - -* Compound AND predicates with no subpredicates now correctly match all objects. - -0.91.5 Release notes (2015-04-28) -============================================================= - -### Bugfixes - -* Fix issues with removing search indexes and re-enable it. - -0.91.4 Release notes (2015-04-27) -============================================================= - -### Bugfixes - -* Temporarily disable removing indexes from existing columns due to bugs. - -0.91.3 Release notes (2015-04-17) -============================================================= - -### Bugfixes - -* Fix `Extra argument 'objectClassName' in call` errors when building via - CocoaPods. - -0.91.2 Release notes (2015-04-16) -============================================================= - -* Migration blocks are no longer called when a Realm file is first created. - -### Enhancements - -* `RLMCollection` supports collection KVC operations. -* Sorting `RLMResults` is 2-5x faster (typically closer to 2x). -* Refreshing `RLMRealm` after a write transaction which inserts or modifies - strings or `NSData` is committed on another thread is significantly faster. -* Indexes are now added and removed from existing properties when a Realm file - is opened, rather than only when properties are first added. - -### Bugfixes - -* `+[RLMSchema dynamicSchemaForRealm:]` now respects search indexes. -* `+[RLMProperty isEqualToProperty:]` now checks for equal `indexed` properties. - -0.91.1 Release notes (2015-03-12) -============================================================= - -### Enhancements - -* The browser will automatically refresh when the Realm has been modified - from another process. -* Allow using Realm in an embedded framework by setting - `APPLICATION_EXTENSION_API_ONLY` to YES. - -### Bugfixes - -* Fix a crash in CFRunLoopSourceInvalidate. - -0.91.0 Release notes (2015-03-10) -============================================================= - -### API breaking changes - -* `attributesForProperty:` has been removed from `RLMObject`. You now specify indexed - properties by implementing the `indexedProperties` method. -* An exception will be thrown when calling `setEncryptionKey:forRealmsAtPath:`, - `setSchemaVersion:forRealmAtPath:withMigrationBlock:`, and `migrateRealmAtPath:` - when a Realm at the given path is already open. -* Object and array properties of type `RLMObject` will no longer be allowed. - -### Enhancements - -* Add support for sharing Realm files between processes. -* The browser will no longer show objects that have no persisted properties. -* `RLMSchema`, `RLMObjectSchema`, and `RLMProperty` now have more useful descriptions. -* Opening an encrypted Realm while a debugger is attached to the process no - longer throws an exception. -* `RLMArray` now exposes an `isInvalidated` property to indicate if it can no - longer be accessed. - -### Bugfixes - -* An exception will now be thrown when calling `-beginWriteTransaction` from within a notification - triggered by calling `-beginWriteTransaction` elsewhere. -* When calling `delete:` we now verify that the object being deleted is persisted in the target Realm. -* Fix crash when calling `createOrUpdate:inRealm` with nested linked objects. -* Use the key from `+[RLMRealm setEncryptionKey:forRealmsAtPath:]` in - `-writeCopyToPath:error:` and `+migrateRealmAtPath:`. -* Comparing an RLMObject to a non-RLMObject using `-[RLMObject isEqual:]` or - `-isEqualToObject:` now returns NO instead of crashing. -* Improved error message when an `RLMObject` subclass is defined nested within - another Swift declaration. -* Fix crash when the process is terminated by the OS on iOS while encrypted realms are open. -* Fix crash after large commits to encrypted realms. - -0.90.6 Release notes (2015-02-20) -============================================================= - -### Enhancements - -* Improve compatibility of encrypted Realms with third-party crash reporters. - -### Bugfixes - -* Fix incorrect results when using aggregate functions on sorted RLMResults. -* Fix data corruption when using writeCopyToPath:encryptionKey:. -* Maybe fix some assertion failures. - -0.90.5 Release notes (2015-02-04) -============================================================= - -### Bugfixes - -* Fix for crashes when encryption is enabled on 64-bit iOS devices. - -0.90.4 Release notes (2015-01-29) -============================================================= - -### Bugfixes - -* Fix bug that resulted in columns being dropped and recreated during migrations. - -0.90.3 Release notes (2015-01-27) -============================================================= - -### Enhancements - -* Calling `createInDefaultRealmWithObject:`, `createInRealm:withObject:`, - `createOrUpdateInDefaultRealmWithObject:` or `createOrUpdateInRealm:withObject:` - is a no-op if the argument is an RLMObject of the same type as the receiver - and is already backed by the target realm. - -### Bugfixes - -* Fix incorrect column type assertions when the first Realm file opened is a - read-only file that is missing tables. -* Throw an exception when adding an invalidated or deleted object as a link. -* Throw an exception when calling `createOrUpdateInRealm:withObject:` when the - receiver has no primary key defined. - -0.90.1 Release notes (2015-01-22) -============================================================= - -### Bugfixes - -* Fix for RLMObject being treated as a model object class and showing up in the browser. -* Fix compilation from the podspec. -* Fix for crash when calling `objectsWhere:` with grouping in the query on `allObjects`. - -0.90.0 Release notes (2015-01-21) -============================================================= - -### API breaking changes - -* Rename `-[RLMRealm encryptedRealmWithPath:key:readOnly:error:]` to - `-[RLMRealm realmWithPath:encryptionKey:readOnly:error:]`. -* `-[RLMRealm setSchemaVersion:withMigrationBlock]` is no longer global and must be called - for each individual Realm path used. You can now call `-[RLMRealm setDefaultRealmSchemaVersion:withMigrationBlock]` - for the default Realm and `-[RLMRealm setSchemaVersion:forRealmAtPath:withMigrationBlock:]` for all others; - -### Enhancements - -* Add `-[RLMRealm writeCopyToPath:encryptionKey:error:]`. -* Add support for comparing string columns to other string columns in queries. - -### Bugfixes - -* Roll back changes made when an exception is thrown during a migration. -* Throw an exception if the number of items in a RLMResults or RLMArray changes - while it's being fast-enumerated. -* Also encrypt the temporary files used when encryption is enabled for a Realm. -* Fixed crash in JSONImport example on OS X with non-en_US locale. -* Fixed infinite loop when opening a Realm file in the Browser at the same time - as it is open in a 32-bit simulator. -* Fixed a crash when adding primary keys to older realm files with no primary - keys on any objects. -* Fixed a crash when removing a primary key in a migration. -* Fixed a crash when multiple write transactions with no changes followed by a - write transaction with changes were committed without the main thread - RLMRealm getting a chance to refresh. -* Fixed incomplete results when querying for non-null relationships. -* Improve the error message when a Realm file is opened in multiple processes - at once. - -0.89.2 Release notes (2015-01-02) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix an assertion failure when invalidating a Realm which is in a write - transaction, has already been invalidated, or has never been used. -* Fix an assertion failure when sorting an empty RLMArray property. -* Fix a bug resulting in the browser never becoming visible on 10.9. -* Write UTF-8 when generating class files from a realm file in the Browser. - -0.89.1 Release notes (2014-12-22) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Improve the error message when a Realm can't be opened due to lacking write - permissions. - -### Bugfixes - -* Fix an assertion failure when inserting rows after calling `deleteAllObjects` - on a Realm. -* Separate dynamic frameworks are now built for the simulator and devices to - work around App Store submission errors due to the simulator version not - being automatically stripped from dynamic libraries. - -0.89.0 Release notes (2014-12-18) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Add support for encrypting Realm files on disk. -* Support using KVC-compliant objects without getters or with custom getter - names to initialize RLMObjects with `createObjectInRealm` and friends. - -### Bugfixes - -* Merge native Swift default property values with defaultPropertyValues(). -* Don't leave the database schema partially updated when opening a realm fails - due to a migration being needed. -* Fixed issue where objects with custom getter names couldn't be used to - initialize other objects. -* Fix a major performance regression on queries on string properties. -* Fix a memory leak when circularly linked objects are added to a Realm. - -0.88.0 Release notes (2014-12-02) -============================================================= - -### API breaking changes - -* Deallocating an RLMRealm instance in a write transaction lacking an explicit - commit/cancel will now be automatically cancelled instead of committed. -* `-[RLMObject isDeletedFromRealm]` has been renamed to `-[RLMObject isInvalidated]`. - -### Enhancements - -* Add `-[RLMRealm writeCopyToPath:]` to write a compacted copy of the Realm - another file. -* Add support for case insensitive, BEGINSWITH, ENDSWITH and CONTAINS string - queries on array properties. -* Make fast enumeration of `RLMArray` and `RLMResults` ~30% faster and - `objectAtIndex:` ~55% faster. -* Added a lldb visualizer script for displaying the contents of persisted - RLMObjects when debugging. -* Added method `-setDefaultRealmPath:` to change the default Realm path. -* Add `-[RLMRealm invalidate]` to release data locked by the current thread. - -### Bugfixes - -* Fix for crash when running many simultaneous write transactions on background threads. -* Fix for crashes caused by opening Realms at multiple paths simultaneously which have had - properties re-ordered during migration. -* Don't run the query twice when `firstObject` or `lastObject` are called on an - `RLMResults` which has not had its results accessed already. -* Fix for bug where schema version is 0 for new Realm created at the latest version. -* Fix for error message where no migration block is specified when required. - -0.87.4 Release notes (2014-11-07) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix browser location in release zip. - -0.87.3 Release notes (2014-11-06) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Added method `-linkingObjectsOfClass:forProperty:` to RLMObject to expose inverse - relationships/backlinks. - -### Bugfixes - -* Fix for crash due to missing search index when migrating an object with a string primary key - in a database created using an older versions (0.86.3 and earlier). -* Throw an exception when passing an array containing a - non-RLMObject to -[RLMRealm addObjects:]. -* Fix for crash when deleting an object from multiple threads. - -0.87.0 Release notes (2014-10-21) -============================================================= - -### API breaking changes - -* RLMArray has been split into two classes, `RLMArray` and `RLMResults`. RLMArray is - used for object properties as in previous releases. Moving forward all methods used to - enumerate, query, and sort objects return an instance of a new class `RLMResults`. This - change was made to support diverging apis and the future addition of change notifications - for queries. -* The api for migrations has changed. You now call `setSchemaVersion:withMigrationBlock:` to - register a global migration block and associated version. This block is applied to Realms as - needed when opened for Realms at a previous version. The block can be applied manually if - desired by calling `migrateRealmAtPath:`. -* `arraySortedByProperty:ascending:` was renamed to `sortedResultsUsingProperty:ascending` -* `addObjectsFromArray:` on both `RLMRealm` and `RLMArray` has been renamed to `addObjects:` - and now accepts any container class which implements `NSFastEnumeration` -* Building with Swift support now requires Xcode 6.1 - -### Enhancements - -* Add support for sorting `RLMArray`s by multiple columns with `sortedResultsUsingDescriptors:` -* Added method `deleteAllObjects` on `RLMRealm` to clear a Realm. -* Added method `createObject:withObject:` on `RLMMigration` which allows object creation during migrations. -* Added method `deleteObject:` on `RLMMigration` which allows object deletion during migrations. -* Updating to core library version 0.85.0. -* Implement `objectsWhere:` and `objectsWithPredicate:` for array properties. -* Add `cancelWriteTransaction` to revert all changes made in a write transaction and end the transaction. -* Make creating `RLMRealm` instances on background threads when an instance - exists on another thread take a fifth of the time. -* Support for partial updates when calling `createOrUpdateWithObject:` and `addOrUpdateObject:` -* Re-enable Swift support on OS X - -### Bugfixes - -* Fix exceptions when trying to set `RLMObject` properties after rearranging - the properties in a `RLMObject` subclass. -* Fix crash on IN query with several thousand items. -* Fix crash when querying indexed `NSString` properties. -* Fixed an issue which prevented in-memory Realms from being used accross multiple threads. -* Preserve the sort order when querying a sorted `RLMResults`. -* Fixed an issue with migrations where if a Realm file is deleted after a Realm is initialized, - the newly created Realm can be initialized with an incorrect schema version. -* Fix crash in `RLMSuperSet` when assigning to a `RLMArray` property on a standalone object. -* Add an error message when the protocol for an `RLMArray` property is not a - valid object type. -* Add an error message when an `RLMObject` subclass is defined nested within - another Swift class. - -0.86.3 Release notes (2014-10-09) -============================================================= - -### Enhancements - -* Add support for != in queries on object relationships. - -### Bugfixes - -* Re-adding an object to its Realm no longer throws an exception and is now a no-op - (as it was previously). -* Fix another bug which would sometimes result in subclassing RLMObject - subclasses not working. - -0.86.2 Release notes (2014-10-06) -============================================================= - -### Bugfixes - -* Fixed issues with packaging "Realm Browser.app" for release. - -0.86.1 Release notes (2014-10-03) -============================================================= - -### Bugfixes - -* Fix a bug which would sometimes result in subclassing RLMObject subclasses - not working. - -0.86.0 Release notes (2014-10-03) -============================================================= - -### API breaking changes - -* Xcode 6 is now supported from the main Xcode project `Realm.xcodeproj`. - Xcode 5 is no longer supported. - -### Enhancements - -* Support subclassing RLMObject models. Although you can now persist subclasses, - polymorphic behavior is not supported (i.e. setting a property to an - instance of its subclass). -* Add support for sorting RLMArray properties. -* Speed up inserting objects with `addObject:` by ~20%. -* `readonly` properties are automatically ignored rather than having to be - added to `ignoredProperties`. -* Updating to core library version 0.83.1. -* Return "[deleted object]" rather than throwing an exception when - `-description` is called on a deleted RLMObject. -* Significantly improve performance of very large queries. -* Allow passing any enumerable to IN clauses rather than just NSArray. -* Add `objectForPrimaryKey:` and `objectInRealm:forPrimaryKey:` convenience - methods to fetch an object by primary key. - -### Bugfixes - -* Fix error about not being able to persist property 'hash' with incompatible - type when building for devices with Xcode 6. -* Fix spurious notifications of new versions of Realm. -* Fix for updating nested objects where some types do not have primary keys. -* Fix for inserting objects from JSON with NSNull values when default values - should be used. -* Trying to add a persisted RLMObject to a different Realm now throws an - exception rather than creating an uninitialized object. -* Fix validation errors when using IN on array properties. -* Fix errors when an IN clause has zero items. -* Fix for chained queries ignoring all but the last query's conditions. - -0.85.0 Release notes (2014-09-15) -============================================================= - -### API breaking changes - -* Notifications for a refresh being needed (when autorefresh is off) now send - the notification type RLMRealmRefreshRequiredNotification rather than - RLMRealmDidChangeNotification. - -### Enhancements - -* Updating to core library version 0.83.0. -* Support for primary key properties (for int and string columns). Declaring a property - to be the primary key ensures uniqueness for that property for all objects of a given type. - At the moment indexes on primary keys are not yet supported but this will be added in a future - release. -* Added methods to update or insert (upsert) for objects with primary keys defined. -* `[RLMObject initWithObject:]` and `[RLMObject createInRealmWithObject:]` now support - any object type with kvc properties. -* The Swift support has been reworked to work around Swift not being supported - in Frameworks on iOS 7. -* Improve performance when getting the count of items matching a query but not - reading any of the objects in the results. -* Add a return value to `-[RLMRealm refresh]` that indicates whether or not - there was anything to refresh. -* Add the class name to the error message when an RLMObject is missing a value - for a property without a default. -* Add support for opening Realms in read-only mode. -* Add an automatic check for updates when using Realm in a simulator (the - checker code is not compiled into device builds). This can be disabled by - setting the REALM_DISABLE_UPDATE_CHECKER environment variable to any value. -* Add support for Int16 and Int64 properties in Swift classes. - -### Bugfixes - -* Realm change notifications when beginning a write transaction are now sent - after updating rather than before, to match refresh. -* `-isEqual:` now uses the default `NSObject` implementation unless a primary key - is specified for an RLMObject. When a primary key is specified, `-isEqual:` calls - `-isEqualToObject:` and a corresponding implementation for `-hash` is also implemented. - -0.84.0 Release notes (2014-08-28) -============================================================= - -### API breaking changes - -* The timer used to trigger notifications has been removed. Notifications are now - only triggered by commits made in other threads, and can not currently be triggered - by changes made by other processes. Interprocess notifications will be re-added in - a future commit with an improved design. - -### Enhancements - -* Updating to core library version 0.82.2. -* Add property `deletedFromRealm` to RLMObject to indicate objects which have been deleted. -* Add support for the IN operator in predicates. -* Add support for the BETWEEN operator in link queries. -* Add support for multi-level link queries in predicates (e.g. `foo.bar.baz = 5`). -* Switch to building the SDK from source when using CocoaPods and add a - Realm.Headers subspec for use in targets that should not link a copy of Realm - (such as test targets). -* Allow unregistering from change notifications in the change notification - handler block. -* Significant performance improvements when holding onto large numbers of RLMObjects. -* Realm-Xcode6.xcodeproj now only builds using Xcode6-Beta6. -* Improved performance during RLMArray iteration, especially when mutating - contained objects. - -### Bugfixes - -* Fix crashes and assorted bugs when sorting or querying a RLMArray returned - from a query. -* Notifications are no longer sent when initializing new RLMRealm instances on background - threads. -* Handle object cycles in -[RLMObject description] and -[RLMArray description]. -* Lowered the deployment target for the Xcode 6 projects and Swift examples to - iOS 7.0, as they didn't actually require 8.0. -* Support setting model properties starting with the letter 'z' -* Fixed crashes that could result from switching between Debug and Relase - builds of Realm. - -0.83.0 Release notes (2014-08-13) -============================================================= - -### API breaking changes - -* Realm-Xcode6.xcodeproj now only builds using Xcode6-Beta5. -* Properties to be persisted in Swift classes must be explicitly declared as `dynamic`. -* Subclasses of RLMObject subclasses now throw an exception on startup, rather - than when added to a Realm. - -### Enhancements - -* Add support for querying for nil object properties. -* Improve error message when specifying invalid literals when creating or - initializing RLMObjects. -* Throw an exception when an RLMObject is used from the incorrect thread rather - than crashing in confusing ways. -* Speed up RLMRealm instantiation and array property iteration. -* Allow array and objection relation properties to be missing or null when - creating a RLMObject from a NSDictionary. - -### Bugfixes - -* Fixed a memory leak when querying for objects. -* Fixed initializing array properties on standalone Swift RLMObject subclasses. -* Fix for queries on 64bit integers. - -0.82.0 Release notes (2014-08-05) -============================================================= - -### API breaking changes - -* Realm-Xcode6.xcodeproj now only builds using Xcode6-Beta4. - -### Enhancements - -* Updating to core library version 0.80.5. -* Now support disabling the `autorefresh` property on RLMRealm instances. -* Building Realm-Xcode6 for iOS now builds a universal framework for Simulator & Device. -* Using NSNumber properties (unsupported) now throws a more informative exception. -* Added `[RLMRealm defaultRealmPath]` -* Proper implementation for [RLMArray indexOfObjectWhere:] -* The default Realm path on OS X is now ~/Library/Application Support/[bundle - identifier]/default.realm rather than ~/Documents -* We now check that the correct framework (ios or osx) is used at compile time. - -### Bugfixes - -* Fixed rapid growth of the realm file size. -* Fixed a bug which could cause a crash during RLMArray destruction after a query. -* Fixed bug related to querying on float properties: `floatProperty = 1.7` now works. -* Fixed potential bug related to the handling of array properties (RLMArray). -* Fixed bug where array properties accessed the wrong property. -* Fixed bug that prevented objects with custom getters to be added to a Realm. -* Fixed a bug where initializing a standalone object with an array literal would - trigger an exception. -* Clarified exception messages when using unsupported NSPredicate operators. -* Clarified exception messages when using unsupported property types on RLMObject subclasses. -* Fixed a memory leak when breaking out of a for-in loop on RLMArray. -* Fixed a memory leak when removing objects from a RLMArray property. -* Fixed a memory leak when querying for objects. - - -0.81.0 Release notes (2014-07-22) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Updating to core library version 0.80.3. -* Added support for basic querying of RLMObject and RLMArray properties (one-to-one and one-to-many relationships). - e.g. `[Person objectsWhere:@"dog.name == 'Alfonso'"]` or `[Person objectsWhere:@"ANY dogs.name == 'Alfonso'"]` - Supports all normal operators for numeric and date types. Does not support NSData properties or `BEGINSWITH`, `ENDSWITH`, `CONTAINS` - and other options for string properties. -* Added support for querying for object equality in RLMObject and RLMArray properties (one-to-one and one-to-many relationships). - e.g. `[Person objectsWhere:@"dog == %@", myDog]` `[Person objectsWhere:@"ANY dogs == %@", myDog]` `[Person objectsWhere:@"ANY friends.dog == %@", dog]` - Only supports comparing objects for equality (i.e. ==) -* Added a helper method to RLMRealm to perform a block inside a transaction. -* OSX framework now supported in CocoaPods. - -### Bugfixes - -* Fixed Unicode support in property names and string contents (Chinese, Russian, etc.). Closing #612 and #604. -* Fixed bugs related to migration when properties are removed. -* Fixed keyed subscripting for standalone RLMObjects. -* Fixed bug related to double clicking on a .realm file to launch the Realm Browser (thanks to Dean Moore). - - -0.80.0 Release notes (2014-07-15) -============================================================= - -### API breaking changes - -* Rename migration methods to -migrateDefaultRealmWithBlock: and -migrateRealmAtPath:withBlock: -* Moved Realm specific query methods from RLMRealm to class methods on RLMObject (-allObjects: to +allObjectsInRealm: ect.) - -### Enhancements - -* Added +createInDefaultRealmWithObject: method to RLMObject. -* Added support for array and object literals when calling -createWithObject: and -initWithObject: variants. -* Added method -deleteObjects: to batch delete objects from a Realm -* Support for defining RLMObject models entirely in Swift (experimental, see known issues). -* RLMArrays in Swift support Sequence-style enumeration (for obj in array). -* Implemented -indexOfObject: for RLMArray - -### Known Issues for Swift-defined models - -* Properties other than String, NSData and NSDate require a default value in the model. This can be an empty (but typed) array for array properties. -* The previous caveat also implies that not all models defined in Objective-C can be used for object properties. Only Objective-C models with only implicit (i.e. primitives) or explicit default values can be used. However, any Objective-C model object can be used in a Swift array property. -* Array property accessors don't work until its parent object has been added to a realm. -* Realm-Bridging-Header.h is temporarily exposed as a public header. This is temporary and will be private again once rdar://17633863 is fixed. -* Does not leverage Swift generics and still uses RLM-prefix everywhere. This is coming in #549. - - -0.22.0 Release notes -============================================================= - -### API breaking changes - -* Rename schemaForObject: to schemaForClassName: on RLMSchema -* Removed -objects:where: and -objects:orderedBy:where: from RLMRealm -* Removed -indexOfObjectWhere:, -objectsWhere: and -objectsOrderedBy:where: from RLMArray -* Removed +objectsWhere: and +objectsOrderedBy:where: from RLMObject - -### Enhancements - -* New Xcode 6 project for experimental swift support. -* New Realm Editor app for reading and editing Realm db files. -* Added support for migrations. -* Added support for RLMArray properties on objects. -* Added support for creating in-memory default Realm. -* Added -objectsWithClassName:predicateFormat: and -objectsWithClassName:predicate: to RLMRealm -* Added -indexOfObjectWithPredicateFormat:, -indexOfObjectWithPredicate:, -objectsWithPredicateFormat:, -objectsWithPredi -* Added +objectsWithPredicateFormat: and +objectsWithPredicate: to RLMObject -* Now allows predicates comparing two object properties of the same type. - - -0.20.0 Release notes (2014-05-28) -============================================================= - -Completely rewritten to be much more object oriented. - -### API breaking changes - -* Everything - -### Enhancements - -* None. - -### Bugfixes - -* None. - - -0.11.0 Release notes (not released) -============================================================= - -The Objective-C API has been updated and your code will break! - -### API breaking changes - -* `RLMTable` objects can only be created with an `RLMRealm` object. -* Renamed `RLMContext` to `RLMTransactionManager` -* Renamed `RLMContextDidChangeNotification` to `RLMRealmDidChangeNotification` -* Renamed `contextWithDefaultPersistence` to `managerForDefaultRealm` -* Renamed `contextPersistedAtPath:` to `managerForRealmWithPath:` -* Renamed `realmWithDefaultPersistence` to `defaultRealm` -* Renamed `realmWithDefaultPersistenceAndInitBlock` to `defaultRealmWithInitBlock` -* Renamed `find:` to `firstWhere:` -* Renamed `where:` to `allWhere:` -* Renamed `where:orderBy:` to `allWhere:orderBy:` - -### Enhancements - -* Added `countWhere:` on `RLMTable` -* Added `sumOfColumn:where:` on `RLMTable` -* Added `averageOfColumn:where:` on `RLMTable` -* Added `minOfProperty:where:` on `RLMTable` -* Added `maxOfProperty:where:` on `RLMTable` -* Added `toJSONString` on `RLMRealm`, `RLMTable` and `RLMView` -* Added support for `NOT` operator in predicates -* Added support for default values -* Added validation support in `createInRealm:withObject:` - -### Bugfixes - -* None. - - -0.10.0 Release notes (2014-04-23) -============================================================= - -TightDB is now Realm! The Objective-C API has been updated -and your code will break! - -### API breaking changes - -* All references to TightDB have been changed to Realm. -* All prefixes changed from `TDB` to `RLM`. -* `TDBTransaction` and `TDBSmartContext` have merged into `RLMRealm`. -* Write transactions now take an optional rollback parameter (rather than needing to return a boolean). -* `addColumnWithName:` and variant methods now return the index of the newly created column if successful, `NSNotFound` otherwise. - -### Enhancements - -* `createTableWithName:columns:` has been added to `RLMRealm`. -* Added keyed subscripting for RLMTable's first column if column is of type RLMPropertyTypeString. -* `setRow:atIndex:` has been added to `RLMTable`. -* `RLMRealm` constructors now have variants that take an writable initialization block -* New object interface - tables created/retrieved using `tableWithName:objectClass:` return custom objects - -### Bugfixes - -* None. - - -0.6.0 Release notes (2014-04-11) -============================================================= - -### API breaking changes - -* `contextWithPersistenceToFile:error:` renamed to `contextPersistedAtPath:error:` in `TDBContext` -* `readWithBlock:` renamed to `readUsingBlock:` in `TDBContext` -* `writeWithBlock:error:` renamed to `writeUsingBlock:error:` in `TDBContext` -* `readTable:withBlock:` renamed to `readTable:usingBlock:` in `TDBContext` -* `writeTable:withBlock:error:` renamed to `writeTable:usingBlock:error:` in `TDBContext` -* `findFirstRow` renamed to `indexOfFirstMatchingRow` on `TDBQuery`. -* `findFirstRowFromIndex:` renamed to `indexOfFirstMatchingRowFromIndex:` on `TDBQuery`. -* Return `NSNotFound` instead of -1 when appropriate. -* Renamed `castClass` to `castToTytpedTableClass` on `TDBTable`. -* `removeAllRows`, `removeRowAtIndex`, `removeLastRow`, `addRow` and `insertRow` methods - on table now return void instead of BOOL. - -### Enhancements -* A `TDBTable` can now be queried using `where:` and `where:orderBy:` taking - `NSPredicate` and `NSSortDescriptor` as arguments. -* Added `find:` method on `TDBTable` to find first row matching predicate. -* `contextWithDefaultPersistence` class method added to `TDBContext`. Will create a context persisted - to a file in app/documents folder. -* `renameColumnWithIndex:to:` has been added to `TDBTable`. -* `distinctValuesInColumnWithIndex` has been added to `TDBTable`. -* `dateIsBetween::`, `doubleIsBetween::`, `floatIsBetween::` and `intIsBetween::` - have been added to `TDBQuery`. -* Column names in Typed Tables can begin with non-capital letters too. The generated `addX` - selector can look odd. For example, a table with one column with name `age`, - appending a new row will look like `[table addage:7]`. -* Mixed typed values are better validated when rows are added, inserted, - or modified as object literals. -* `addRow`, `insertRow`, and row updates can be done using objects - derived from `NSObject`. -* `where` has been added to `TDBView`and `TDBViewProtocol`. -* Adding support for "smart" contexts (`TDBSmartContext`). - -### Bugfixes - -* Modifications of a `TDBView` and `TDBQuery` now throw an exception in a readtransaction. - - -0.5.0 Release notes (2014-04-02) -============================================================= - -The Objective-C API has been updated and your code will break! -Of notable changes a fast interface has been added. -This interface includes specific methods to get and set values into Tightdb. -To use these methods import ``. - -### API breaking changes - -* `getTableWithName:` renamed to `tableWithName:` in `TDBTransaction`. -* `addColumnWithName:andType:` renamed to `addColumnWithName:type:` in `TDBTable`. -* `columnTypeOfColumn:` renamed to `columnTypeOfColumnWithIndex` in `TDBTable`. -* `columnNameOfColumn:` renamed to `nameOfColumnWithIndex:` in `TDBTable`. -* `addColumnWithName:andType:` renamed to `addColumnWithName:type:` in `TDBDescriptor`. -* Fast getters and setters moved from `TDBRow.h` to `TDBRowFast.h`. - -### Enhancements - -* Added `minDateInColumnWithIndex` and `maxDateInColumnWithIndex` to `TDBQuery`. -* Transactions can now be started directly on named tables. -* You can create dynamic tables with initial schema. -* `TDBTable` and `TDBView` now have a shared protocol so they can easier be used interchangeably. - -### Bugfixes - -* Fixed bug in 64 bit iOS when inserting BOOL as NSNumber. - - -0.4.0 Release notes (2014-03-26) -============================================================= - -### API breaking changes - -* Typed interface Cursor has now been renamed to Row. -* TDBGroup has been renamed to TDBTransaction. -* Header files are renamed so names match class names. -* Underscore (_) removed from generated typed table classes. -* TDBBinary has been removed; use NSData instead. -* Underscope (_) removed from generated typed table classes. -* Constructor for TDBContext has been renamed to contextWithPersistenceToFile: -* Table findFirstRow and min/max/sum/avg operations has been hidden. -* Table.appendRow has been renamed to addRow. -* getOrCreateTable on Transaction has been removed. -* set*:inColumnWithIndex:atRowIndex: methods have been prefixed with TDB -* *:inColumnWithIndex:atRowIndex: methods have been prefixed with TDB -* addEmptyRow on table has been removed. Use [table addRow:nil] instead. -* TDBMixed removed. Use id and NSObject instead. -* insertEmptyRow has been removed from table. Use insertRow:nil atIndex:index instead. - -#### Enhancements - -* Added firstRow, lastRow selectors on view. -* firstRow and lastRow on table now return nil if table is empty. -* getTableWithName selector added on group. -* getting and creating table methods on group no longer take error argument. -* [TDBQuery parent] and [TDBQuery subtable:] selectors now return self. -* createTable method added on Transaction. Throws exception if table with same name already exists. -* Experimental support for pinning transactions on Context. -* TDBView now has support for object subscripting. - -### Bugfixes - -* None. - - -0.3.0 Release notes (2014-03-14) -============================================================= - -The Objective-C API has been updated and your code will break! - -### API breaking changes - -* Most selectors have been renamed in the binding! -* Prepend TDB-prefix on all classes and types. - -### Enhancements - -* Return types and parameters changed from size_t to NSUInteger. -* Adding setObject to TightdbTable (t[2] = @[@1, @"Hello"] is possible). -* Adding insertRow to TightdbTable. -* Extending appendRow to accept NSDictionary. - -### Bugfixes - -* None. - - -0.2.0 Release notes (2014-03-07) -============================================================= - -The Objective-C API has been updated and your code will break! - -### API breaking changes - -* addRow renamed to addEmptyRow - -### Enhancements - -* Adding a simple class for version numbering. -* Adding get-version and set-version targets to build.sh. -* tableview now supports sort on column with column type bool, date and int -* tableview has method for checking the column type of a specified column -* tableview has method for getting the number of columns -* Adding methods getVersion, getCoreVersion and isAtLeast. -* Adding appendRow to TightdbTable. -* Adding object subscripting. -* Adding method removeColumn on table. - -### Bugfixes - -* None. diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/NSError+RLMSync.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/NSError+RLMSync.h deleted file mode 100644 index 5ef323a24..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/NSError+RLMSync.h +++ /dev/null @@ -1,46 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2017 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@class RLMSyncErrorActionToken; - -/// NSError category extension providing methods to get data out of Realm's -/// "client reset" error. -@interface NSError (RLMSync) - -/** - Given an appropriate Atlas App Services error, return the token that - can be passed into `+[RLMSyncSession immediatelyHandleError:]` to - immediately perform error clean-up work, or nil if the error isn't of - a type that provides a token. - */ -- (nullable RLMSyncErrorActionToken *)rlmSync_errorActionToken NS_REFINED_FOR_SWIFT; - -/** - Given an Atlas App Services client reset error, return the path where the - backup copy of the Realm will be placed once the client reset process is - complete. - */ -- (nullable NSString *)rlmSync_clientResetBackedUpRealmPath NS_SWIFT_UNAVAILABLE(""); - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMAPIKeyAuth.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMAPIKeyAuth.h deleted file mode 100644 index 642bdd95d..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMAPIKeyAuth.h +++ /dev/null @@ -1,95 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMUserAPIKey, RLMObjectId; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// Provider client for user API keys. -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMAPIKeyAuth : RLMProviderClient - -/// A block type used to report an error -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMAPIKeyAuthOptionalErrorBlock)(NSError * _Nullable); - -/// A block type used to return an `RLMUserAPIKey` on success, or an `NSError` on failure -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMOptionalUserAPIKeyBlock)(RLMUserAPIKey * _Nullable, NSError * _Nullable); - -/// A block type used to return an array of `RLMUserAPIKey` on success, or an `NSError` on failure -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMUserAPIKeysBlock)(NSArray * _Nullable, NSError * _Nullable); - -/** - Creates a user API key that can be used to authenticate as the current user. - - @param name The name of the API key to be created. - @param completion A callback to be invoked once the call is complete. -*/ -- (void)createAPIKeyWithName:(NSString *)name - completion:(RLMOptionalUserAPIKeyBlock)completion NS_SWIFT_NAME(createAPIKey(named:completion:)); - -/** - Fetches a user API key associated with the current user. - - @param objectId The ObjectId of the API key to fetch. - @param completion A callback to be invoked once the call is complete. - */ -- (void)fetchAPIKey:(RLMObjectId *)objectId - completion:(RLMOptionalUserAPIKeyBlock)completion; - -/** - Fetches the user API keys associated with the current user. - - @param completion A callback to be invoked once the call is complete. - */ -- (void)fetchAPIKeysWithCompletion:(RLMUserAPIKeysBlock)completion; - -/** - Deletes a user API key associated with the current user. - - @param objectId The ObjectId of the API key to delete. - @param completion A callback to be invoked once the call is complete. - */ -- (void)deleteAPIKey:(RLMObjectId *)objectId - completion:(RLMAPIKeyAuthOptionalErrorBlock)completion; - -/** - Enables a user API key associated with the current user. - - @param objectId The ObjectId of the API key to enable. - @param completion A callback to be invoked once the call is complete. - */ -- (void)enableAPIKey:(RLMObjectId *)objectId - completion:(RLMAPIKeyAuthOptionalErrorBlock)completion; - -/** - Disables a user API key associated with the current user. - - @param objectId The ObjectId of the API key to disable. - @param completion A callback to be invoked once the call is complete. - */ -- (void)disableAPIKey:(RLMObjectId *)objectId - completion:(RLMAPIKeyAuthOptionalErrorBlock)completion; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMApp.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMApp.h deleted file mode 100644 index 2228232e8..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMApp.h +++ /dev/null @@ -1,235 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@protocol RLMNetworkTransport, RLMBSON; - -@class RLMUser, RLMCredentials, RLMSyncManager, RLMEmailPasswordAuth, RLMPushClient, RLMSyncTimeoutOptions; - -/// A block type used for APIs which asynchronously vend an `RLMUser`. -typedef void(^RLMUserCompletionBlock)(RLMUser * _Nullable, NSError * _Nullable); - -/// A block type used to report an error -typedef void(^RLMOptionalErrorBlock)(NSError * _Nullable); - -#pragma mark RLMAppConfiguration - -/// Properties representing the configuration of a client -/// that communicate with a particular Realm application. -@interface RLMAppConfiguration : NSObject - -/// A custom base URL to request against. -@property (nonatomic, strong, nullable) NSString *baseURL; - -/// The custom transport for network calls to the server. -@property (nonatomic, strong, nullable) id transport; - -/// :nodoc: -@property (nonatomic, strong, nullable) NSString *localAppName - __attribute__((deprecated("This field is not used"))); -/// :nodoc: -@property (nonatomic, strong, nullable) NSString *localAppVersion - __attribute__((deprecated("This field is not used"))); - -/// The default timeout for network requests. -@property (nonatomic, assign) NSUInteger defaultRequestTimeoutMS; - -/// If enabled (the default), a single connection is used for all Realms opened -/// with a single sync user. If disabled, a separate connection is used for each -/// Realm. -/// -/// Session multiplexing reduces resources used and typically improves -/// performance. When multiplexing is enabled, the connection is not immediately -/// closed when the last session is closed, and instead remains open for -/// ``RLMSyncTimeoutOptions.connectionLingerTime`` milliseconds (30 seconds by -/// default). -@property (nonatomic, assign) BOOL enableSessionMultiplexing; - -/** - Options for the assorted types of connection timeouts for sync connections. - - If nil default values for all timeouts are used instead. - */ -@property (nonatomic, nullable, copy) RLMSyncTimeoutOptions *syncTimeouts; - -/// :nodoc: -- (instancetype)initWithBaseURL:(nullable NSString *)baseURL - transport:(nullable id)transport - localAppName:(nullable NSString *)localAppName - localAppVersion:(nullable NSString *)localAppVersion -__attribute__((deprecated("localAppName and localAppVersion are unused"))); - -/// :nodoc: -- (instancetype)initWithBaseURL:(nullable NSString *) baseURL - transport:(nullable id)transport - localAppName:(nullable NSString *)localAppName - localAppVersion:(nullable NSString *)localAppVersion - defaultRequestTimeoutMS:(NSUInteger)defaultRequestTimeoutMS -__attribute__((deprecated("localAppName and localAppVersion are unused"))); - -/** -Create a new Realm App configuration. - -@param baseURL A custom base URL to request against. -@param transport A custom network transport. -*/ -- (instancetype)initWithBaseURL:(nullable NSString *)baseURL - transport:(nullable id)transport; - -/** - Create a new Realm App configuration. - - @param baseURL A custom base URL to request against. - @param transport A custom network transport. - @param defaultRequestTimeoutMS A custom default timeout for network requests. - */ -- (instancetype)initWithBaseURL:(nullable NSString *) baseURL - transport:(nullable id)transport - defaultRequestTimeoutMS:(NSUInteger)defaultRequestTimeoutMS; - -@end - -#pragma mark RLMApp - -/** - The `RLMApp` has the fundamental set of methods for communicating with a Realm - application backend. - - This interface provides access to login and authentication. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // internally thread-safe -@interface RLMApp : NSObject - -/// The configuration for this Realm app. -@property (nonatomic, readonly) RLMAppConfiguration *configuration; - -/// The `RLMSyncManager` for this Realm app. -@property (nonatomic, readonly) RLMSyncManager *syncManager; - -/// Get a dictionary containing all users keyed on id. -@property (nonatomic, readonly) NSDictionary *allUsers; - -/// Get the current user logged into the Realm app. -@property (nonatomic, readonly, nullable) RLMUser *currentUser; - -/// The app ID for this Realm app. -@property (nonatomic, readonly) NSString *appId; - -/** - A client for the email/password authentication provider which - can be used to obtain a credential for logging in. - - Used to perform requests specifically related to the email/password provider. -*/ -@property (nonatomic, readonly) RLMEmailPasswordAuth *emailPasswordAuth; - -/** - Get an application with a given appId and configuration. - - @param appId The unique identifier of your Realm app. - */ -+ (instancetype)appWithId:(NSString *)appId; - -/** - Get an application with a given appId and configuration. - - @param appId The unique identifier of your Realm app. - @param configuration A configuration object to configure this client. - */ -+ (instancetype)appWithId:(NSString *)appId - configuration:(nullable RLMAppConfiguration *)configuration; - -/** - Login to a user for the Realm app. - - @param credentials The credentials identifying the user. - @param completion A callback invoked after completion. - */ -- (void)loginWithCredential:(RLMCredentials *)credentials - completion:(RLMUserCompletionBlock)completion NS_REFINED_FOR_SWIFT; - -/** - Switches the active user to the specified user. - - This sets which user is used by all RLMApp operations which require a user. This is a local operation which does not access the network. - An exception will be throw if the user is not valid. The current user will remain logged in. - - @param syncUser The user to switch to. - @returns The user you intend to switch to - */ -- (RLMUser *)switchToUser:(RLMUser *)syncUser; - -/** - A client which can be used to register devices with the server to receive push notificatons - */ -- (RLMPushClient *)pushClientWithServiceName:(NSString *)serviceName - NS_SWIFT_NAME(pushClient(serviceName:)); - -/** - RLMApp instances are cached internally by Realm and cannot be created directly. - - Use `+[RLMRealm appWithId]` or `+[RLMRealm appWithId:configuration:]` - to obtain a reference to an RLMApp. - */ -- (instancetype)init __attribute__((unavailable("Use +appWithId or appWithId:configuration:."))); - -/** -RLMApp instances are cached internally by Realm and cannot be created directly. - -Use `+[RLMRealm appWithId]` or `+[RLMRealm appWithId:configuration:]` -to obtain a reference to an RLMApp. -*/ -+ (instancetype)new __attribute__((unavailable("Use +appWithId or appWithId:configuration:."))); - -@end - -#pragma mark - Sign In With Apple Extension - -API_AVAILABLE(ios(13.0), macos(10.15), tvos(13.0), watchos(6.0)) -/// Use this delegate to be provided a callback once authentication has succeed or failed -@protocol RLMASLoginDelegate - -/// Callback that is invoked should the authentication fail. -/// @param error An error describing the authentication failure. -- (void)authenticationDidFailWithError:(NSError *)error NS_SWIFT_NAME(authenticationDidComplete(error:)); - -/// Callback that is invoked should the authentication succeed. -/// @param user The newly authenticated user. -- (void)authenticationDidCompleteWithUser:(RLMUser *)user NS_SWIFT_NAME(authenticationDidComplete(user:)); - -@end - -API_AVAILABLE(ios(13.0), macos(10.15), tvos(13.0), watchos(6.0)) -/// Category extension that deals with Sign In With Apple authentication. -/// This is only available on OS's that support `AuthenticationServices` -@interface RLMApp (ASLogin) - -/// Use this delegate to be provided a callback once authentication has succeed or failed. -@property (nonatomic, weak, nullable) id authorizationDelegate; - -/// Sets the ASAuthorizationControllerDelegate to be handled by `RLMApp` -/// @param controller The ASAuthorizationController in which you want `RLMApp` to consume its delegate. -- (void)setASAuthorizationControllerDelegateForController:(ASAuthorizationController *)controller NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMArray.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMArray.h deleted file mode 100644 index b2c6c1664..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMArray.h +++ /dev/null @@ -1,652 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObject, RLMResults; - -/** - `RLMArray` is the container type in Realm used to define to-many relationships. - - Unlike an `NSArray`, `RLMArray`s hold a single type, specified by the `objectClassName` property. - This is referred to in these docs as the “type” of the array. - - When declaring an `RLMArray` property, the type must be marked as conforming to a - protocol by the same name as the objects it should contain (see the - `RLM_COLLECTION_TYPE` macro). In addition, the property can be declared using Objective-C - generics for better compile-time type safety. - - RLM_COLLECTION_TYPE(ObjectType) - ... - @property RLMArray *arrayOfObjectTypes; - - `RLMArray`s can be queried with the same predicates as `RLMObject` and `RLMResult`s. - - `RLMArray`s cannot be created directly. `RLMArray` properties on `RLMObject`s are - lazily created when accessed, or can be obtained by querying a Realm. - - ### Key-Value Observing - - `RLMArray` supports array key-value observing on `RLMArray` properties on `RLMObject` - subclasses, and the `invalidated` property on `RLMArray` instances themselves is - key-value observing compliant when the `RLMArray` is attached to a managed - `RLMObject` (`RLMArray`s on unmanaged `RLMObject`s will never become invalidated). - - Because `RLMArray`s are attached to the object which they are a property of, they - do not require using the mutable collection proxy objects from - `-mutableArrayValueForKey:` or KVC-compatible mutation methods on the containing - object. Instead, you can call the mutation methods on the `RLMArray` directly. - */ - -@interface RLMArray : NSObject - -#pragma mark - Properties - -/** - The number of objects in the array. - */ -@property (nonatomic, readonly, assign) NSUInteger count; - -/** - The type of the objects in the array. - */ -@property (nonatomic, readonly, assign) RLMPropertyType type; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readonly, getter = isOptional) BOOL optional; - -/** - The class name of the objects contained in the array. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages the array. Returns `nil` for unmanaged arrays. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - Indicates if the array can no longer be accessed. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if the array is frozen. - - Frozen arrays are immutable and can be accessed from any thread. Frozen arrays - are created by calling `-freeze` on a managed live array. Unmanaged arrays are - never frozen. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Accessing Objects from an Array - -/** - Returns the object at the index specified. - - @param index The index to look up. - - @return An object of the type contained in the array. - */ -- (RLMObjectType)objectAtIndex:(NSUInteger)index; - -/** - Returns an array containing the objects in the array at the indexes specified by a given index set. - `nil` will be returned if the index set contains an index out of the arrays bounds. - - @param indexes The indexes in the array to retrieve objects from. - - @return The objects at the specified indexes. - */ -- (nullable NSArray *)objectsAtIndexes:(NSIndexSet *)indexes; - -/** - Returns the first object in the array. - - Returns `nil` if called on an empty array. - - @return An object of the type contained in the array. - */ -- (nullable RLMObjectType)firstObject; - -/** - Returns the last object in the array. - - Returns `nil` if called on an empty array. - - @return An object of the type contained in the array. - */ -- (nullable RLMObjectType)lastObject; - - - -#pragma mark - Adding, Removing, and Replacing Objects in an Array - -/** - Adds an object to the end of the array. - - @warning This method may only be called during a write transaction. - - @param object An object of the type contained in the array. - */ -- (void)addObject:(RLMObjectType)object; - -/** - Adds an array of objects to the end of the array. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable object such as `NSArray` or `RLMResults` which contains objects of the - same class as the array. - */ -- (void)addObjects:(id)objects; - -/** - Inserts an object at the given index. - - Throws an exception if the index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param anObject An object of the type contained in the array. - @param index The index at which to insert the object. - */ -- (void)insertObject:(RLMObjectType)anObject atIndex:(NSUInteger)index; - -/** - Removes an object at the given index. - - Throws an exception if the index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param index The array index identifying the object to be removed. - */ -- (void)removeObjectAtIndex:(NSUInteger)index; - -/** - Removes the last object in the array. - - This is a no-op if the array is already empty. - - @warning This method may only be called during a write transaction. -*/ -- (void)removeLastObject; - -/** - Removes all objects from the array. - - @warning This method may only be called during a write transaction. - */ -- (void)removeAllObjects; - -/** - Replaces an object at the given index with a new object. - - Throws an exception if the index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param index The index of the object to be replaced. - @param anObject An object (of the same type as returned from the `objectClassName` selector). - */ -- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(RLMObjectType)anObject; - -/** - Moves the object at the given source index to the given destination index. - - Throws an exception if the index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param sourceIndex The index of the object to be moved. - @param destinationIndex The index to which the object at `sourceIndex` should be moved. - */ -- (void)moveObjectAtIndex:(NSUInteger)sourceIndex toIndex:(NSUInteger)destinationIndex; - -/** - Exchanges the objects in the array at given indices. - - Throws an exception if either index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param index1 The index of the object which should replace the object at index `index2`. - @param index2 The index of the object which should replace the object at index `index1`. - */ -- (void)exchangeObjectAtIndex:(NSUInteger)index1 withObjectAtIndex:(NSUInteger)index2; - -#pragma mark - Querying an Array - -/** - Returns the index of an object in the array. - - Returns `NSNotFound` if the object is not found in the array. - - @param object An object (of the same type as returned from the `objectClassName` selector). - */ -- (NSUInteger)indexOfObject:(RLMObjectType)object; - -/** - Returns the index of the first object in the array matching the predicate. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return The index of the object, or `NSNotFound` if the object is not found in the array. - */ -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns the index of the first object in the array matching the predicate. - - @param predicate The predicate with which to filter the objects. - - @return The index of the object, or `NSNotFound` if the object is not found in the array. - */ -- (NSUInteger)indexOfObjectWithPredicate:(NSPredicate *)predicate; - -/** - Returns all the objects matching the given predicate in the array. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` of objects that match the given predicate. - */ -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all the objects matching the given predicate in the array. - - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` of objects that match the given predicate - */ -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/** - Returns a sorted `RLMResults` from the array. - - @param keyPath The key path to sort by. - @param ascending The direction to sort in. - - @return An `RLMResults` sorted by the specified key path. - */ -- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a sorted `RLMResults` from the array. - - @param properties An array of `RLMSortDescriptor`s to sort by. - - @return An `RLMResults` sorted by the specified properties. - */ -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/** - Returns a distinct `RLMResults` from the array. - - @param keyPaths The key paths to distinct on. - - @return An `RLMResults` with the distinct values of the keypath(s). - */ -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -/// :nodoc: -- (RLMObjectType)objectAtIndexedSubscript:(NSUInteger)index; - -/// :nodoc: -- (void)setObject:(RLMObjectType)newValue atIndexedSubscript:(NSUInteger)index; - -#pragma mark - Sectioning an Array - -/** - Sorts and sections this collection from a given property key path, returning the result - as an instance of `RLMSectionedResults`. - - @param keyPath The property key path to sort on. - @param ascending The direction to sort in. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsSortedUsingKeyPath:(NSString *)keyPath - ascending:(BOOL)ascending - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -/** - Sorts and sections this collection from a given array of sort descriptors, returning the result - as an instance of `RLMSectionedResults`. - - @param sortDescriptors An array of `RLMSortDescriptor`s to sort by. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @note The primary sort descriptor must be responsible for determining the section key. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsUsingSortDescriptors:(NSArray *)sortDescriptors - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - - -#pragma mark - Notifications - -/** - Registers a block to be called each time the array changes. - - The block will be asynchronously called with the initial array, and then - called again after each write transaction which changes any of the objects in - the array, which objects are in the results, or the order of the objects in the - array. - - The `changes` parameter will be `nil` the first time the block is called. For - each call after that, it will contain information about which rows in the - array were added, removed or modified. If a write transaction did not modify - any objects in the array, the block is not called at all. See the - `RLMCollectionChange` documentation for information on how the changes are - reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - Person *person = [[Person allObjectsInRealm:realm] firstObject]; - NSLog(@"person.dogs.count: %zu", person.dogs.count); // => 0 - self.token = [person.dogs addNotificationBlock(RLMArray *dogs, - RLMCollectionChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count) // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - [person.dogs addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a non-frozen managed array. - - @param block The block to be called each time the array changes. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMArray *_Nullable array, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the array changes. - - The block will be asynchronously called with the initial array, and then - called again after each write transaction which changes any of the objects in - the array, which objects are in the results, or the order of the objects in the - array. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the array were added, removed or modified. If a write transaction - did not modify any objects in the array, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMArray *_Nullable array, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the array changes. - - The block will be asynchronously called with the initial array, and then - called again after each write transaction which changes any of the objects in - the array, which objects are in the results, or the order of the objects in the - array. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the array were added, removed or modified. If a write transaction - did not modify any objects in the array, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMArray *_Nullable array, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the array changes. - - The block will be asynchronously called with the initial array, and then - called again after each write transaction which changes any of the objects in - the array, which objects are in the results, or the order of the objects in the - array. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the array were added, removed or modified. If a write transaction - did not modify any objects in the array, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMArray *_Nullable array, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths -__attribute__((warn_unused_result)); - -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the objects in the array. - - NSNumber *min = [object.arrayProperty minOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The minimum value of the property, or `nil` if the array is empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects in the array. - - NSNumber *max = [object.arrayProperty maxOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose maximum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The maximum value of the property, or `nil` if the array is empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of the values of a given property over all the objects in the array. - - NSNumber *sum = [object.arrayProperty sumOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose values should be summed. Only properties of - types `int`, `float`, and `double` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects in the array. - - NSNumber *average = [object.arrayProperty averageOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose average value should be calculated. Only - properties of types `int`, `float`, and `double` are supported. - - @return The average value of the given property, or `nil` if the array is empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this array. - - The frozen copy is an immutable array which contains the same data as this - array currently contains, but will not update when writes are made to the - containing Realm. Unlike live arrays, frozen arrays can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a managed array. - @warning Holding onto a frozen array for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -#pragma mark - Unavailable Methods - -/** - `-[RLMArray init]` is not available because `RLMArray`s cannot be created directly. - `RLMArray` properties on `RLMObject`s are lazily created when accessed. - */ -- (instancetype)init __attribute__((unavailable("RLMArrays cannot be created directly"))); - -/** - `+[RLMArray new]` is not available because `RLMArray`s cannot be created directly. - `RLMArray` properties on `RLMObject`s are lazily created when accessed. - */ -+ (instancetype)new __attribute__((unavailable("RLMArrays cannot be created directly"))); - -@end - -/// :nodoc: -@interface RLMArray (Swift) -// for use only in Swift class definitions -- (instancetype)initWithObjectClassName:(NSString *)objectClassName; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMAsymmetricObject.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMAsymmetricObject.h deleted file mode 100644 index 09deb787e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMAsymmetricObject.h +++ /dev/null @@ -1,98 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2022 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectSchema, RLMPropertyDescriptor, RLMRealm; -/** - `RLMAsymmetricObject` is a base class used to define asymmetric Realm objects. - - Asymmetric objects can only be created using the `createInRealm:` - function, and cannot be added, removed or queried. - When created, asymmetric objects will be synced unidirectionally to the MongoDB - database and cannot be accessed locally. - - Linking an asymmetric object within an `Object` is not allowed and will throw an error. - - The property types supported on `RLMAsymmetricObject` are the same as for `RLMObject`, - except for that asymmetric objects can only link to embedded objects, so `RLMObject` - and `RLMArray` properties are not supported (`RLMEmbeddedObject` and - `RLMArray` *are*). - */ -@interface RLMAsymmetricObject : RLMObjectBase - -#pragma mark - Creating & Initializing Objects - -/** - Creates an unmanaged instance of a Realm object. - */ -- (instancetype)init NS_DESIGNATED_INITIALIZER; - -/** - Creates an unmanaged instance of a Realm object. - - Pass in an `NSArray` or `NSDictionary` instance to set the values of the object's properties. - */ -- (instancetype)initWithValue:(id)value; - -/** - Returns the class name for a Realm object subclass. - - @warning Do not override. Realm relies on this method returning the exact class - name. - - @return The class name for the model class. - */ -+ (NSString *)className; - -/** - Creates an Asymmetric object, which will be synced unidirectionally and - cannot be queried locally. - - Objects created using this method will not be added to the Realm. - - @warning This method may only be called during a write transaction. - @warning This method always returns nil. - - @param realm The Realm to be used to create the asymmetric object.. - @param value The value used to populate the object. - - @return Returns `nil` - */ -+ (instancetype)createInRealm:(RLMRealm *)realm withValue:(id)value; - -#pragma mark - Properties - -/** - The object schema which lists the managed properties for the object. - */ -@property (nonatomic, readonly) RLMObjectSchema *objectSchema; - -#pragma mark - Dynamic Accessors - -/// :nodoc: -- (nullable id)objectForKeyedSubscript:(NSString *)key; - -/// :nodoc: -- (void)setObject:(nullable id)obj forKeyedSubscript:(NSString *)key; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMAsyncTask.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMAsyncTask.h deleted file mode 100644 index 9f7dc58da..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMAsyncTask.h +++ /dev/null @@ -1,67 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A task object which can be used to observe or cancel an async open. - - When a synchronized Realm is opened asynchronously, the latest state of the - Realm is downloaded from the server before the completion callback is invoked. - This task object can be used to observe the state of the download or to cancel - it. This should be used instead of trying to observe the download via the sync - session as the sync session itself is created asynchronously, and may not exist - yet when -[RLMRealm asyncOpenWithConfiguration:completion:] returns. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMAsyncOpenTask : NSObject -/** - Register a progress notification block. - - Each registered progress notification block is called whenever the sync - subsystem has new progress data to report until the task is either cancelled - or the completion callback is called. Progress notifications are delivered on - the main queue. - */ -- (void)addProgressNotificationBlock:(RLMProgressNotificationBlock)block; - -/** - Register a progress notification block which is called on the given queue. - - Each registered progress notification block is called whenever the sync - subsystem has new progress data to report until the task is either cancelled - or the completion callback is called. Progress notifications are delivered on - the supplied queue. - */ -- (void)addProgressNotificationOnQueue:(dispatch_queue_t)queue - block:(RLMProgressNotificationBlock)block; - -/** - Cancel the asynchronous open. - - Any download in progress will be cancelled, and the completion block for this - async open will never be called. If multiple async opens on the same Realm are - happening concurrently, all other opens will fail with the error "operation cancelled". - */ -- (void)cancel; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMBSON.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMBSON.h deleted file mode 100644 index 41750fd57..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMBSON.h +++ /dev/null @@ -1,174 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -#pragma mark RLMBSONType - -/** - Allowed BSON types. - */ -typedef NS_ENUM(NSUInteger, RLMBSONType) { - /// BSON Null type - RLMBSONTypeNull, - /// BSON Int32 type - RLMBSONTypeInt32, - /// BSON Int64 type - RLMBSONTypeInt64, - /// BSON Bool type - RLMBSONTypeBool, - /// BSON Double type - RLMBSONTypeDouble, - /// BSON String type - RLMBSONTypeString, - /// BSON Binary type - RLMBSONTypeBinary, - /// BSON Timestamp type - RLMBSONTypeTimestamp, - /// BSON Datetime type - RLMBSONTypeDatetime, - /// BSON ObjectId type - RLMBSONTypeObjectId, - /// BSON Decimal128 type - RLMBSONTypeDecimal128, - /// BSON RegularExpression type - RLMBSONTypeRegularExpression, - /// BSON MaxKey type - RLMBSONTypeMaxKey, - /// BSON MinKey type - RLMBSONTypeMinKey, - /// BSON Document type - RLMBSONTypeDocument, - /// BSON Array type - RLMBSONTypeArray, - /// BSON UUID type - RLMBSONTypeUUID -}; - -#pragma mark RLMBSON - -/** - Protocol representing a BSON value. BSON is a computer data interchange format. - The name "BSON" is based on the term JSON and stands for "Binary JSON". - - The following types conform to RLMBSON: - - `NSNull` - `NSNumber` - `NSString` - `NSData` - `NSDateInterval` - `NSDate` - `RLMObjectId` - `RLMDecimal128` - `NSRegularExpression` - `RLMMaxKey` - `RLMMinKey` - `NSDictionary` - `NSArray` - `NSUUID` - - @see RLMBSONType - @see bsonspec.org - */ -@protocol RLMBSON - -/** - The BSON type for the conforming interface. - */ -@property (readonly) RLMBSONType bsonType NS_REFINED_FOR_SWIFT; - -/** - Whether or not this BSON is equal to another. - - @param other The BSON to compare to - */ -- (BOOL)isEqual:(_Nullable id)other; - -@end - -/// :nodoc: -@interface NSNull (RLMBSON) -@end - -/// :nodoc: -@interface NSNumber (RLMBSON) -@end - -/// :nodoc: -@interface NSString (RLMBSON) -@end - -/// :nodoc: -@interface NSData (RLMBSON) -@end - -/// :nodoc: -@interface NSDateInterval (RLMBSON) -@end - -/// :nodoc: -@interface NSDate (RLMBSON) -@end - -/// :nodoc: -@interface RLMObjectId (RLMBSON) -@end - -/// :nodoc: -@interface RLMDecimal128 (RLMBSON) -@end - -/// :nodoc: -@interface NSRegularExpression (RLMBSON) -@end - -/// MaxKey will always be the greatest value when comparing to other BSON types -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMMaxKey : NSObject -@end - -/// MinKey will always be the smallest value when comparing to other BSON types -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMMinKey : NSObject -@end - -/// :nodoc: -@interface RLMMaxKey (RLMBSON) -@end - -/// :nodoc: -@interface RLMMinKey (RLMBSON) -@end - -/// :nodoc: -@interface NSDictionary (RLMBSON) -@end - -/// :nodoc: -@interface NSMutableArray (RLMBSON) -@end - -/// :nodoc: -@interface NSArray (RLMBSON) -@end - -/// :nodoc: -@interface NSUUID (RLMBSON) -@end diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMCollection.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMCollection.h deleted file mode 100644 index eac117f17..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMCollection.h +++ /dev/null @@ -1,613 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@protocol RLMValue; -@class RLMRealm, RLMResults, RLMSortDescriptor, RLMNotificationToken, RLMCollectionChange, RLMSectionedResults; -typedef RLM_CLOSED_ENUM(int32_t, RLMPropertyType); -/// A callback which is invoked on each element in the Results collection which returns the section key. -typedef id _Nullable(^RLMSectionedResultsKeyBlock)(id); - -/** - A homogenous collection of Realm-managed objects. Examples of conforming types - include `RLMArray`, `RLMSet`, `RLMResults`, and `RLMLinkingObjects`. - */ -@protocol RLMCollection - -#pragma mark - Properties - -/** - The number of objects in the collection. - */ -@property (nonatomic, readonly) NSUInteger count; - -/** - The type of the objects in the collection. - */ -@property (nonatomic, readonly) RLMPropertyType type; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readonly, getter = isOptional) BOOL optional; - -/** - The class name of the objects contained in the collection. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages this collection, if any. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - Indicates if the collection is no longer valid. - - The collection becomes invalid if `invalidate` is called on the managing - Realm. Unmanaged collections are never invalidated. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -#pragma mark - Accessing Objects from a Collection - -/** - Returns the object at the index specified. - - @param index The index to look up. - - @return An object of the type contained in the collection. - */ -- (id)objectAtIndex:(NSUInteger)index; - -@optional - -/** - Returns an array containing the objects in the collection at the indexes - specified by a given index set. `nil` will be returned if the index set - contains an index out of the collections bounds. - - @param indexes The indexes in the collection to retrieve objects from. - - @return The objects at the specified indexes. - */ -- (nullable NSArray *)objectsAtIndexes:(NSIndexSet *)indexes; - -/** - Returns the first object in the collection. - - RLMSet is not ordered, and so for sets this will return an arbitrary object in - the set. It is not guaraneed to be a different object from what `lastObject` - gives even if the set has multiple objects in it. - - Returns `nil` if called on an empty collection. - - @return An object of the type contained in the collection. - */ -- (nullable id)firstObject; - -/** - Returns the last object in the collection. - - RLMSet is not ordered, and so for sets this will return an arbitrary object in - the set. It is not guaraneed to be a different object from what `firstObject` - gives even if the set has multiple objects in it. - - Returns `nil` if called on an empty collection. - - @return An object of the type contained in the collection. - */ -- (nullable id)lastObject; - -/// :nodoc: -- (id)objectAtIndexedSubscript:(NSUInteger)index; - -/** - Returns the index of an object in the collection. - - Returns `NSNotFound` if the object is not found in the collection. - - @param object An object (of the same type as returned from the `objectClassName` selector). - */ -- (NSUInteger)indexOfObject:(id)object; - -/** - Returns the index of the first object in the collection matching the predicate. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return The index of the object, or `NSNotFound` if the object is not found in the collection. - */ -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns the index of the first object in the collection matching the predicate. - - @param predicate The predicate with which to filter the objects. - - @return The index of the object, or `NSNotFound` if the object is not found in the collection. - */ -- (NSUInteger)indexOfObjectWithPredicate:(NSPredicate *)predicate; - -@required - -#pragma mark - Querying a Collection - -/** - Returns all objects matching the given predicate in the collection. - - This is only supported for managed collections. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - @return An `RLMResults` containing objects that match the given predicate. - */ -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all objects matching the given predicate in the collection. - - This is only supported for managed collections. - - @param predicate The predicate with which to filter the objects. - @return An `RLMResults` containing objects that match the given predicate. - */ -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/** - Returns a sorted `RLMResults` from the collection. - - This is only supported for managed collections. - - @param keyPath The keyPath to sort by. - @param ascending The direction to sort in. - @return An `RLMResults` sorted by the specified key path. - */ -- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a sorted `RLMResults` from the collection. - - This is only supported for managed collections. - - @param properties An array of `RLMSortDescriptor`s to sort by. - @return An `RLMResults` sorted by the specified properties. - */ -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/** - Returns a distinct `RLMResults` from the collection. - - This is only supported for managed collections. - - @param keyPaths The key paths used produce distinct results - @return An `RLMResults` made distinct based on the specified key paths - */ -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -/** - Returns an `NSArray` containing the results of invoking `valueForKey:` using - `key` on each of the collection's objects. - - @param key The name of the property. - - @return An `NSArray` containing results. - */ -- (nullable id)valueForKey:(NSString *)key; - -/** - Returns the value for the derived property identified by a given key path. - - @param keyPath A key path of the form relationship.property (with one or more relationships). - - @return The value for the derived property identified by keyPath. - */ -- (nullable id)valueForKeyPath:(NSString *)keyPath; - -/** - Invokes `setValue:forKey:` on each of the collection's objects using the specified `value` and `key`. - - @warning This method may only be called during a write transaction. - - @param value The object value. - @param key The name of the property. - */ -- (void)setValue:(nullable id)value forKey:(NSString *)key; - -#pragma mark - Notifications - -/** -Registers a block to be called each time the collection changes. - -The block will be asynchronously called with the initial collection, -and then called again after each write transaction which changes either any -of the objects in the collection, or which objects are in the collection. - -The `change` parameter will be `nil` the first time the block is called. -For each call after that, it will contain information about -which rows in the collection were added, removed or modified. If a -write transaction did not modify any objects in the results collection, -the block is not called at all. See the `RLMCollectionChange` documentation for -information on how the changes are reported and an example of updating a -`UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - -At the time when the block is called, the collection object will be fully -evaluated and up-to-date, and as long as you do not perform a write transaction -on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will -never perform blocking work. - -Notifications are delivered via the standard run loop, and so can't be -delivered while the run loop is blocked by other activity. When -notifications can't be delivered instantly, multiple notifications may be -coalesced into a single notification. This can include the notification -with the initial results. For example, the following code performs a write -transaction immediately after adding the notification block, so there is no -opportunity for the initial notification to be delivered first. As a -result, the initial notification will reflect the state of the Realm after -the write transaction. - - RLMResults *results = [Dog allObjects]; - NSLog(@"dogs.count: %zu", dogs.count); // => 0 - self.token = [results addNotificationBlock:^(RLMResults *dogs, - RLMCollectionChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - [realm addObject:dog]; - }]; - // end of run loop execution context - -You must retain the returned token for as long as you want updates to continue -to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - -@warning This method cannot be called during a write transaction, or when the - containing Realm is read-only or frozen. - -@param block The block to be called whenever a change occurs. -@return A token which must be held for as long as you want updates to be delivered. -*/ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** -Registers a block to be called each time the collection changes. - -The block will be asynchronously called with the initial collection, -and then called again after each write transaction which changes either any -of the objects in the collection, or which objects are in the collection. - -The `change` parameter will be `nil` the first time the block is called. -For each call after that, it will contain information about -which rows in the collection were added, removed or modified. If a -write transaction did not modify any objects in the results collection, -the block is not called at all. See the `RLMCollectionChange` documentation for -information on how the changes are reported and an example of updating a -`UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - -At the time when the block is called, the collection object will be fully -evaluated and up-to-date, and as long as you do not perform a write transaction -on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will -never perform blocking work. - -Notifications are delivered on the given queue. If the queue is blocked and -notifications can't be delivered instantly, multiple notifications may be -coalesced into a single notification. - -You must retain the returned token for as long as you want updates to continue -to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - -@warning This method cannot be called when the containing Realm is read-only or frozen. -@warning The queue must be a serial queue. - -@param block The block to be called whenever a change occurs. -@param queue The serial queue to deliver notifications to. -@return A token which must be held for as long as you want updates to be delivered. -*/ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** -Registers a block to be called each time the collection changes. - -The block will be asynchronously called with the initial collection, -and then called again after each write transaction which changes either any -of the objects in the collection, or which objects are in the collection. - -The `change` parameter will be `nil` the first time the block is called. -For each call after that, it will contain information about -which rows in the collection were added, removed or modified. If a -write transaction did not modify any objects in the results collection, -the block is not called at all. See the `RLMCollectionChange` documentation for -information on how the changes are reported and an example of updating a -`UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - -At the time when the block is called, the collection object will be fully -evaluated and up-to-date, and as long as you do not perform a write transaction -on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will -never perform blocking work. - -Notifications are delivered on the given queue. If the queue is blocked and -notifications can't be delivered instantly, multiple notifications may be -coalesced into a single notification. - -You must retain the returned token for as long as you want updates to continue -to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - -@warning This method cannot be called when the containing Realm is read-only or frozen. -@warning The queue must be a serial queue. - -@param block The block to be called whenever a change occurs. -@param queue The serial queue to deliver notifications to. -@param keyPaths The block will be called for changes occurring on these keypaths. If no -key paths are given, notifications are delivered for every property key path. -@return A token which must be held for as long as you want updates to be delivered. -*/ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -#pragma mark - Sectioned Results - -/** - Sorts and sections this collection from a given property key path, returning the result - as an instance of `RLMSectionedResults`. - - @param keyPath The property key path to sort on. - @param ascending The direction to sort in. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsSortedUsingKeyPath:(NSString *)keyPath - ascending:(BOOL)ascending - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -/** - Sorts and sections this collection from a given array of sort descriptors, returning the result - as an instance of `RLMSectionedResults`. - - @param sortDescriptors An array of `RLMSortDescriptor`s to sort by. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @note The primary sort descriptor must be responsible for determining the section key. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsUsingSortDescriptors:(NSArray *)sortDescriptors - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the objects - in the collection. - - NSNumber *min = [results minOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The minimum value of the property, or `nil` if the Results are empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects - in the collection. - - NSNumber *max = [results maxOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose maximum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The maximum value of the property, or `nil` if the Results are empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of the values of a given property over all the objects in the collection. - - NSNumber *sum = [results sumOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose values should be summed. Only properties of - types `int`, `float`, and `double` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects in the collection. - - NSNumber *average = [results averageOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose average value should be calculated. Only - properties of types `int`, `float`, and `double` are supported. - - @return The average value of the given property, or `nil` if the Results are empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -#pragma mark - Freeze - -/** - Indicates if the collection is frozen. - - Frozen collections are immutable and can be accessed from any thread. The - objects read from a frozen collection will also be frozen. - */ -@property (nonatomic, readonly, getter=isFrozen) BOOL frozen; - -/** - Returns a frozen (immutable) snapshot of this collection. - - The frozen copy is an immutable collection which contains the same data as - this collection currently contains, but will not update when writes are made - to the containing Realm. Unlike live collections, frozen collections can be - accessed from any thread. - - @warning This method cannot be called during a write transaction, or when the containing Realm is read-only. - @warning Holding onto a frozen collection for an extended period while - performing write transaction on the Realm may result in the Realm - file growing to large sizes. See - `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -@end - -/** - An `RLMSortDescriptor` stores a property name and a sort order for use with - `sortedResultsUsingDescriptors:`. It is similar to `NSSortDescriptor`, but supports - only the subset of functionality which can be efficiently run by Realm's query - engine. - - `RLMSortDescriptor` instances are immutable. - */ -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMSortDescriptor : NSObject - -#pragma mark - Properties - -/** - The key path which the sort descriptor orders results by. - */ -@property (nonatomic, readonly) NSString *keyPath; - -/** - Whether the descriptor sorts in ascending or descending order. - */ -@property (nonatomic, readonly) BOOL ascending; - -#pragma mark - Methods - -/** - Returns a new sort descriptor for the given key path and sort direction. - */ -+ (instancetype)sortDescriptorWithKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a copy of the receiver with the sort direction reversed. - */ -- (instancetype)reversedSortDescriptor; - -@end - -/** - A `RLMCollectionChange` object encapsulates information about changes to collections - that are reported by Realm notifications. - - `RLMCollectionChange` is passed to the notification blocks registered with - `-addNotificationBlock` on `RLMArray` and `RLMResults`, and reports what rows in the - collection changed since the last time the notification block was called. - - The change information is available in two formats: a simple array of row - indices in the collection for each type of change, and an array of index paths - in a requested section suitable for passing directly to `UITableView`'s batch - update methods. A complete example of updating a `UITableView` named `tv`: - - [tv beginUpdates]; - [tv deleteRowsAtIndexPaths:[changes deletionsInSection:0] withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv insertRowsAtIndexPaths:[changes insertionsInSection:0] withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv reloadRowsAtIndexPaths:[changes modificationsInSection:0] withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv endUpdates]; - - All of the arrays in an `RLMCollectionChange` are always sorted in ascending order. - */ -@interface RLMCollectionChange : NSObject -/// The indices of objects in the previous version of the collection which have -/// been removed from this one. -@property (nonatomic, readonly) NSArray *deletions; - -/// The indices in the new version of the collection which were newly inserted. -@property (nonatomic, readonly) NSArray *insertions; - -/** - The indices in the new version of the collection which were modified. - - For `RLMResults`, this means that one or more of the properties of the object at - that index were modified (or an object linked to by that object was - modified). - - For `RLMArray`, the array itself being modified to contain a - different object at that index will also be reported as a modification. - */ -@property (nonatomic, readonly) NSArray *modifications; - -/// Returns the index paths of the deletion indices in the given section. -- (NSArray *)deletionsInSection:(NSUInteger)section; - -/// Returns the index paths of the insertion indices in the given section. -- (NSArray *)insertionsInSection:(NSUInteger)section; - -/// Returns the index paths of the modification indices in the given section. -- (NSArray *)modificationsInSection:(NSUInteger)section; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMConstants.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMConstants.h deleted file mode 100644 index 0bc8db972..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMConstants.h +++ /dev/null @@ -1,156 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#define RLM_HEADER_AUDIT_BEGIN NS_HEADER_AUDIT_BEGIN -#define RLM_HEADER_AUDIT_END NS_HEADER_AUDIT_END - -#define RLM_SWIFT_SENDABLE NS_SWIFT_SENDABLE - -#define RLM_FINAL __attribute__((objc_subclassing_restricted)) - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -// Swift 5 considers NS_ENUM to be "open", meaning there could be values present -// other than the defined cases (which allows adding more cases later without -// it being a breaking change), while older versions consider it "closed". -#ifdef NS_CLOSED_ENUM -#define RLM_CLOSED_ENUM NS_CLOSED_ENUM -#else -#define RLM_CLOSED_ENUM NS_ENUM -#endif - -#if __has_attribute(ns_error_domain) && (!defined(__cplusplus) || !__cplusplus || __cplusplus >= 201103L) -#define RLM_ERROR_ENUM(type, name, domain) \ - _Pragma("clang diagnostic push") \ - _Pragma("clang diagnostic ignored \"-Wignored-attributes\"") \ - NS_ENUM(type, __attribute__((ns_error_domain(domain))) name) \ - _Pragma("clang diagnostic pop") -#else -#define RLM_ERROR_ENUM(type, name, domain) NS_ENUM(type, name) -#endif - -#define RLM_HIDDEN __attribute__((visibility("hidden"))) -#define RLM_VISIBLE __attribute__((visibility("default"))) -#define RLM_HIDDEN_BEGIN _Pragma("GCC visibility push(hidden)") -#define RLM_HIDDEN_END _Pragma("GCC visibility pop") -#define RLM_DIRECT __attribute__((objc_direct)) -#define RLM_DIRECT_MEMBERS __attribute__((objc_direct_members)) - -#pragma mark - Enums - -/** - `RLMPropertyType` is an enumeration describing all property types supported in Realm models. - - For more information, see [Realm Models](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/object-models-and-schemas/). - */ -typedef RLM_CLOSED_ENUM(int32_t, RLMPropertyType) { - -#pragma mark - Primitive types - /** Integers: `NSInteger`, `int`, `long`, `Int` (Swift) */ - RLMPropertyTypeInt = 0, - /** Booleans: `BOOL`, `bool`, `Bool` (Swift) */ - RLMPropertyTypeBool = 1, - /** Floating-point numbers: `float`, `Float` (Swift) */ - RLMPropertyTypeFloat = 5, - /** Double-precision floating-point numbers: `double`, `Double` (Swift) */ - RLMPropertyTypeDouble = 6, - /** NSUUID, UUID */ - RLMPropertyTypeUUID = 12, - -#pragma mark - Object types - - /** Strings: `NSString`, `String` (Swift) */ - RLMPropertyTypeString = 2, - /** Binary data: `NSData` */ - RLMPropertyTypeData = 3, - /** Any type: `id`, `AnyRealmValue` (Swift) */ - RLMPropertyTypeAny = 9, - /** Dates: `NSDate` */ - RLMPropertyTypeDate = 4, - -#pragma mark - Linked object types - - /** Realm model objects. See [Realm Models](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/object-models-and-schemas/) for more information. */ - RLMPropertyTypeObject = 7, - /** Realm linking objects. See [Realm Models](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/relationships/#inverse-relationship) for more information. */ - RLMPropertyTypeLinkingObjects = 8, - - RLMPropertyTypeObjectId = 10, - RLMPropertyTypeDecimal128 = 11 -}; - -#pragma mark - Notification Constants - -/** - A notification indicating that changes were made to a Realm. -*/ -typedef NSString * RLMNotification NS_EXTENSIBLE_STRING_ENUM; - -/** - This notification is posted when a write transaction has been committed to a Realm on a different thread for - the same file. - - It is not posted if `autorefresh` is enabled, or if the Realm is refreshed before the notification has a chance - to run. - - Realms with autorefresh disabled should normally install a handler for this notification which calls - `-[RLMRealm refresh]` after doing some work. Refreshing the Realm is optional, but not refreshing the Realm may lead to - large Realm files. This is because an extra copy of the data must be kept for the stale Realm. - */ -extern RLMNotification const RLMRealmRefreshRequiredNotification NS_SWIFT_NAME(RefreshRequired); - -/** - This notification is posted by a Realm when a write transaction has been - committed to a Realm on a different thread for the same file. - - It is not posted if `-[RLMRealm autorefresh]` is enabled, or if the Realm is - refreshed before the notification has a chance to run. - - Realms with autorefresh disabled should normally install a handler for this - notification which calls `-[RLMRealm refresh]` after doing some work. Refreshing - the Realm is optional, but not refreshing the Realm may lead to large Realm - files. This is because Realm must keep an extra copy of the data for the stale - Realm. - */ -extern RLMNotification const RLMRealmDidChangeNotification NS_SWIFT_NAME(DidChange); - -#pragma mark - Error keys - -/** Key to identify the associated backup Realm configuration in an error's `userInfo` dictionary */ -extern NSString * const RLMBackupRealmConfigurationErrorKey; - -#pragma mark - Other Constants - -/** The schema version used for uninitialized Realms */ -extern const uint64_t RLMNotVersioned; - -/** The corresponding value is the name of an exception thrown by Realm. */ -extern NSString * const RLMExceptionName; - -/** The corresponding value is a Realm file version. */ -extern NSString * const RLMRealmVersionKey; - -/** The corresponding key is the version of the underlying database engine. */ -extern NSString * const RLMRealmCoreVersionKey; - -/** The corresponding key is the Realm invalidated property name. */ -extern NSString * const RLMInvalidatedKey; - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMCredentials.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMCredentials.h deleted file mode 100644 index adff4e7e9..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMCredentials.h +++ /dev/null @@ -1,126 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) -@protocol RLMBSON; - -/// A token representing an identity provider's credentials. -typedef NSString *RLMCredentialsToken; - -/// A type representing the unique identifier of an Atlas App Services identity provider. -typedef NSString *RLMIdentityProvider NS_EXTENSIBLE_STRING_ENUM; - -/// The username/password identity provider. User accounts are handled by Atlas App Services directly without the -/// involvement of a third-party identity provider. -extern RLMIdentityProvider const RLMIdentityProviderUsernamePassword; - -/// A Facebook account as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderFacebook; - -/// A Google account as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderGoogle; - -/// An Apple account as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderApple; - -/// A JSON Web Token as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderJWT; - -/// An Anonymous account as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderAnonymous; - -/// An Realm Cloud function as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderFunction; - -/// A user api key as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderUserAPIKey; - -/// A server api key as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderServerAPIKey; - -/** - Opaque credentials representing a specific Realm App user. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMCredentials : NSObject - -/// The name of the identity provider which generated the credentials token. -@property (nonatomic, readonly) RLMIdentityProvider provider; - -/** - Construct and return credentials from a Facebook account token. - */ -+ (instancetype)credentialsWithFacebookToken:(RLMCredentialsToken)token; - -/** - Construct and return credentials from a Google account token. - */ -+ (instancetype)credentialsWithGoogleAuthCode:(RLMCredentialsToken)token; - -/** - Construct and return credentials from a Google id token. - */ -+ (instancetype)credentialsWithGoogleIdToken:(RLMCredentialsToken)token; - -/** - Construct and return credentials from an Apple account token. - */ -+ (instancetype)credentialsWithAppleToken:(RLMCredentialsToken)token; - -/** - Construct and return credentials for an Atlas App Services function using a mongodb document as a json payload. -*/ -+ (instancetype)credentialsWithFunctionPayload:(NSDictionary> *)payload; - -/** - Construct and return credentials from a user api key. -*/ -+ (instancetype)credentialsWithUserAPIKey:(NSString *)apiKey; - -/** - Construct and return credentials from a server api key. -*/ -+ (instancetype)credentialsWithServerAPIKey:(NSString *)apiKey; - -/** - Construct and return Atlas App Services credentials from an email and password. - */ -+ (instancetype)credentialsWithEmail:(NSString *)email - password:(NSString *)password; - -/** - Construct and return credentials from a JSON Web Token. - */ -+ (instancetype)credentialsWithJWT:(NSString *)token; - -/** - Construct and return anonymous credentials - */ -+ (instancetype)anonymousCredentials; - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("RLMAppCredentials cannot be created directly"))); - -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("RLMAppCredentials cannot be created directly"))); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMDecimal128.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMDecimal128.h deleted file mode 100644 index f6224bbf2..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMDecimal128.h +++ /dev/null @@ -1,110 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A 128-bit IEEE 754-2008 decimal floating point number. - - This type is similar to Swift's built-in Decimal type, but allocates bits - differently, resulting in a different representable range. (NS)Decimal stores a - significand of up to 38 digits long and an exponent from -128 to 127, while - this type stores up to 34 digits of significand and an exponent from -6143 to - 6144. - */ -RLM_SWIFT_SENDABLE // immutable -@interface RLMDecimal128 : NSObject -/// Creates a new zero-initialized decimal128. -- (instancetype)init; - -/// Converts the given value to a RLMDecimal128. -/// -/// The following types can be converted to RLMDecimal128: -/// - NSNumber -/// - NSString -/// - NSDecimalNumber -/// -/// Passing a value with a type not in this list is a fatal error. Passing a -/// string which cannot be parsed as a valid Decimal128 is a fatal error. -- (instancetype)initWithValue:(id)value; - -/// Converts the given number to a RLMDecimal128. -- (instancetype)initWithNumber:(NSNumber *)number; - -/// Parses the given string to a RLMDecimal128. -/// -/// Returns a decimal where `isNaN` is `YES` if the string cannot be parsed as a decimal. `error` is never set -/// and this will never actually return `nil`. -- (nullable instancetype)initWithString:(NSString *)string error:(NSError **)error; - -/// Converts the given number to a RLMDecimal128. -+ (instancetype)decimalWithNumber:(NSNumber *)number; - -/// The minimum value for RLMDecimal128. -@property (class, readonly, copy) RLMDecimal128 *minimumDecimalNumber NS_REFINED_FOR_SWIFT; - -/// The maximum value for RLMDecimal128. -@property (class, readonly, copy) RLMDecimal128 *maximumDecimalNumber NS_REFINED_FOR_SWIFT; - -/// Convert this value to a double. This is a lossy conversion. -@property (nonatomic, readonly) double doubleValue; - -/// Convert this value to a NSDecimal. This may be a lossy conversion. -@property (nonatomic, readonly) NSDecimal decimalValue; - -/// Convert this value to a string. -@property (nonatomic, readonly) NSString *stringValue; - -/// Gets if this Decimal128 represents a NaN value. -@property (nonatomic, readonly) BOOL isNaN; - -/// The magnitude of this RLMDecimal128. -@property (nonatomic, readonly) RLMDecimal128 *magnitude NS_REFINED_FOR_SWIFT; - -/// Replaces this RLMDecimal128 value with its additive inverse. -- (void)negate; - -/// Adds the right hand side to the current value and returns the result. -- (RLMDecimal128 *)decimalNumberByAdding:(RLMDecimal128 *)decimalNumber; - -/// Divides the right hand side to the current value and returns the result. -- (RLMDecimal128 *)decimalNumberByDividingBy:(RLMDecimal128 *)decimalNumber; - -/// Subtracts the right hand side to the current value and returns the result. -- (RLMDecimal128 *)decimalNumberBySubtracting:(RLMDecimal128 *)decimalNumber; - -/// Multiply the right hand side to the current value and returns the result. -- (RLMDecimal128 *)decimalNumberByMultiplyingBy:(RLMDecimal128 *)decimalNumber; - -/// Comparision operator to check if the right hand side is greater than the current value. -- (BOOL)isGreaterThan:(nullable RLMDecimal128 *)decimalNumber; - -/// Comparision operator to check if the right hand side is greater than or equal to the current value. -- (BOOL)isGreaterThanOrEqualTo:(nullable RLMDecimal128 *)decimalNumber; - -/// Comparision operator to check if the right hand side is less than the current value. -- (BOOL)isLessThan:(nullable RLMDecimal128 *)decimalNumber; - -/// Comparision operator to check if the right hand side is less than or equal to the current value. -- (BOOL)isLessThanOrEqualTo:(nullable RLMDecimal128 *)decimalNumber; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMDictionary.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMDictionary.h deleted file mode 100644 index 9c8cac538..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMDictionary.h +++ /dev/null @@ -1,559 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObject, RLMResults, RLMDictionaryChange; - -/** - `RLMDictionary` is a container type in Realm representing a dynamic collection of key-value pairs. - - Unlike `NSDictionary`, `RLMDictionary`s hold a single key and value type. - This is referred to in these docs as the “type” and “keyType” of the dictionary. - - When declaring an `RLMDictionary` property, the object type and keyType must be marked as conforming to a - protocol by the same name as the objects it should contain. - - RLM_COLLECTION_TYPE(ObjectType) - ... - @property RLMDictionary *objectTypeDictionary; - - `RLMDictionary`s can be queried with the same predicates as `RLMObject` and `RLMResult`s. - - `RLMDictionary`s cannot be created directly. `RLMDictionary` properties on `RLMObject`s are - lazily created when accessed, or can be obtained by querying a Realm. - - `RLMDictionary` only supports `NSString` as a key. Realm disallows the use of `.` or `$` characters within a dictionary key. - - ### Key-Value Observing - - `RLMDictionary` supports dictionary key-value observing on `RLMDictionary` properties on `RLMObject` - subclasses, and the `invalidated` property on `RLMDictionary` instances themselves is - key-value observing compliant when the `RLMDictionary` is attached to a managed - `RLMObject` (`RLMDictionary`s on unmanaged `RLMObject`s will never become invalidated). - */ -@interface RLMDictionary: NSObject - -#pragma mark - Properties - -/** - The number of entries in the dictionary. - */ -@property (nonatomic, readonly, assign) NSUInteger count; - -/** - The type of the objects in the dictionary. - */ -@property (nonatomic, readonly, assign) RLMPropertyType type; - -/** - The type of the key used in this dictionary. - */ -@property (nonatomic, readonly, assign) RLMPropertyType keyType; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readonly, getter = isOptional) BOOL optional; - -/** - The class name of the objects contained in the dictionary. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages the dictionary. Returns `nil` for unmanaged dictionary. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - Indicates if the dictionary can no longer be accessed. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if the dictionary is frozen. - - Frozen dictionaries are immutable and can be accessed from any thread. Frozen dictionaries - are created by calling `-freeze` on a managed live dictionary. Unmanaged dictionaries are - never frozen. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Accessing Objects from a Dictionary - -/** - Returns the value associated with a given key. - - @param key The name of the property. - - @discussion If key does not start with “@”, invokes object(forKey:). If key does start - with “@”, strips the “@” and invokes [super valueForKey:] with the rest of the key. - - @return A value associated with a given key or `nil`. - */ -- (nullable id)valueForKey:(nonnull RLMKeyType)key; - -/** - Returns an array containing the dictionary’s keys. - - @note The order of the elements in the array is not defined. - */ -@property(readonly, copy) NSArray *allKeys; - -/** - Returns an array containing the dictionary’s values. - - @note The order of the elements in the array is not defined. - */ -@property(readonly, copy) NSArray *allValues; - -/** - Returns the value associated with a given key. - - @note `nil` will be returned if no value is associated with a given key. NSNull will be returned - where null is associated with the key. - - @param key The key for which to return the corresponding value. - - @return The value associated with key. - */ -- (nullable RLMObjectType)objectForKey:(nonnull RLMKeyType)key; - -/** - Returns the value associated with a given key. - - @note `nil` will be returned if no value is associated with a given key. NSNull will be returned - where null is associated with the key. - - @param key The key for which to return the corresponding value. - - @return The value associated with key. - */ -- (nullable RLMObjectType)objectForKeyedSubscript:(RLMKeyType)key; - -/** - Applies a given block object to the each key-value pair of the dictionary. - - @param block A block object to operate on entries in the dictionary. - - @note If the block sets *stop to YES, the enumeration stops. - */ -- (void)enumerateKeysAndObjectsUsingBlock:(void (^)(RLMKeyType key, RLMObjectType obj, BOOL *stop))block; - -#pragma mark - Adding, Removing, and Replacing Objects in a Dictionary - -/** - Replace the contents of a dictionary with the contents of another dictionary - NSDictionary or RLMDictionary. - - This will remove all elements in this dictionary and then apply each element from the given dictionary. - - @warning This method may only be called during a write transaction. - @warning If otherDictionary is self this will result in an empty dictionary. - */ -- (void)setDictionary:(id)otherDictionary; - -/** - Removes all contents in the dictionary. - - @warning This method may only be called during a write transaction. - */ -- (void)removeAllObjects; - -/** - Removes from the dictionary entries specified by elements in a given array. If a given key does not - exist, no mutation will happen for that key. - - @warning This method may only be called during a write transaction. - */ -- (void)removeObjectsForKeys:(NSArray *)keyArray; - -/** - Removes a given key and its associated value from the dictionary. If the key does not exist the dictionary - will not be modified. - - @warning This method may only be called during a write transaction. - */ -- (void)removeObjectForKey:(RLMKeyType)key; - -/** - Adds a given key-value pair to the dictionary if the key is not present, or updates the value for the given key - if the key already present. - - @warning This method may only be called during a write transaction. - */ -- (void)setObject:(nullable RLMObjectType)obj forKeyedSubscript:(RLMKeyType)key; - -/** - Adds a given key-value pair to the dictionary if the key is not present, or updates the value for the given key - if the key already present. - - @warning This method may only be called during a write transaction. - */ -- (void)setObject:(nullable RLMObjectType)anObject forKey:(RLMKeyType)aKey; - -/** - Adds to the receiving dictionary the entries from another dictionary. - - @note If the receiving dictionary contains the same key(s) as the otherDictionary, then - the receiving dictionary will update each key-value pair for the matching key. - - @warning This method may only be called during a write transaction. - - @param otherDictionary An enumerable object such as `NSDictionary` or `RLMDictionary` which contains objects of the - same type as the receiving dictionary. - */ -- (void)addEntriesFromDictionary:(id )otherDictionary; - -#pragma mark - Querying a Dictionary - -/** - Returns all the values matching the given predicate in the dictionary. - - @note The keys in the dictionary are ignored when quering values, and they will not be returned in the `RLMResults`. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` of objects that match the given predicate. - */ -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all the values matching the given predicate in the dictionary. - - @note The keys in the dictionary are ignored when quering values, and they will not be returned in the `RLMResults`. - - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` of objects that match the given predicate - */ -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/** - Returns a sorted RLMResults of all values in the dictionary. - - @note The keys in the dictionary are ignored when sorting values, and they will not be returned in the `RLMResults`. - - @param keyPath The key path to sort by. - @param ascending The direction to sort in. - - @return An `RLMResults` sorted by the specified key path. - */- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a sorted RLMResults of all values in the dictionary. - - @note The keys in the dictionary are ignored when sorting values, and they will not be returned in the `RLMResults`. - - @param properties An array of `RLMSortDescriptor`s to sort by. - - @return An `RLMResults` sorted by the specified properties. - */ -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/** - Returns a distinct `RLMResults` from all values in the dictionary. - - @note The keys in the dictionary are ignored, and they will not be returned in the `RLMResults`. - - @param keyPaths The key paths to distinct on. - - @return An `RLMResults` with the distinct values of the keypath(s). - */ -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the values in the dictionary. - - NSNumber *min = [object.dictionaryProperty minOfProperty:@"age"]; - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, `NSDate`, `RLMValue` and `RLMDecimal128` are supported. - - @return The minimum value of the property, or `nil` if the dictionary is empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects in the dictionary. - - NSNumber *max = [object.dictionaryProperty maxOfProperty:@"age"]; - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, `NSDate`, `RLMValue` and `RLMDecimal128` are supported. - - @return The maximum value of the property, or `nil` if the dictionary is empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of distinct values of a given property over all the objects in the dictionary. - - NSNumber *sum = [object.dictionaryProperty sumOfProperty:@"age"]; - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, `RLMValue` and `RLMDecimal128` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects in the dictionary. - - NSNumber *average = [object.dictionaryProperty averageOfProperty:@"age"]; - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, `NSDate`, `RLMValue` and `RLMDecimal128` are supported. - - @return The average value of the given property, or `nil` if the dictionary is empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -#pragma mark - Notifications - -/** - Registers a block to be called each time the dictionary changes. - - The block will be asynchronously called with the initial dictionary, and then - called again after each write transaction which changes any of the keys or values - within the dictionary. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which keys in the dictionary were added, modified or deleted. If a write transaction - did not modify any keys or values in the dictionary, the block is not called at all. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - Person *person = [[Person allObjectsInRealm:realm] firstObject]; - NSLog(@"person.dogs.count: %zu", person.dogs.count); // => 0 - self.token = [person.dogs addNotificationBlock(RLMDictionary *dogs, - RLMDictionaryChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - person.dogs[@"frenchBulldog"] = dog; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a non-frozen managed dictionary. - - @param block The block to be called each time the dictionary changes. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMDictionary *_Nullable dictionary, - RLMDictionaryChange *_Nullable changes, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the dictionary changes. - - The block will be asynchronously called with the initial dictionary, and then - called again after each write transaction which changes any of the key-value in - the dictionary or which objects are in the results. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which keys in the dictionary were added or modified. If a write transaction - did not modify any objects in the dictionary, the block is not called at all. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMDictionary *_Nullable dictionary, - RLMDictionaryChange *_Nullable changes, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the dictionary changes. - - The block will be asynchronously called with the initial dictionary, and then - called again after each write transaction which changes any of the key-value in - the dictionary or which objects are in the results. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which keys in the dictionary were added or modified. If a write transaction - did not modify any objects in the dictionary, the block is not called at all. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMDictionary *_Nullable dictionary, - RLMDictionaryChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the dictionary changes. - - The block will be asynchronously called with the initial dictionary, and then - called again after each write transaction which changes any of the key-value in - the dictionary or which objects are in the results. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which keys in the dictionary were added or modified. If a write transaction - did not modify any objects in the dictionary, the block is not called at all. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMDictionary *_Nullable dictionary, - RLMDictionaryChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths -__attribute__((warn_unused_result)); - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of a dictionary. - - The frozen copy is an immutable dictionary which contains the same data as this - dictionary currently contains, but will not update when writes are made to the - containing Realm. Unlike live dictionaries, frozen dictionaries can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a managed dictionary. - @warning Holding onto a frozen dictionary for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -#pragma mark - Unavailable Methods -/** - `-[RLMDictionary init]` is not available because `RLMDictionary`s cannot be created directly. - `RLMDictionary` properties on `RLMObject`s are lazily created when accessed. - */ -- (instancetype)init __attribute__((unavailable("RLMDictionary cannot be created directly"))); -/** - `+[RLMDictionary new]` is not available because `RLMDictionary`s cannot be created directly. - `RLMDictionary` properties on `RLMObject`s are lazily created when accessed. - */ -+ (instancetype)new __attribute__((unavailable("RLMDictionary cannot be created directly"))); - -@end - -/** - A `RLMDictionaryChange` object encapsulates information about changes to dictionaries - that are reported by Realm notifications. - - `RLMDictionaryChange` is passed to the notification blocks registered with - `-addNotificationBlock` on `RLMDictionary`, and reports what keys in the - dictionary changed since the last time the notification block was called. - */ -@interface RLMDictionaryChange : NSObject -/// The keys in the new version of the dictionary which were newly inserted. -@property (nonatomic, readonly) NSArray *insertions; - -/// The keys in the new version of the dictionary which were modified. -@property (nonatomic, readonly) NSArray *modifications; - -/// The keys which were deleted from the old version. -@property (nonatomic, readonly) NSArray *deletions; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMEmailPasswordAuth.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMEmailPasswordAuth.h deleted file mode 100644 index 748eb26af..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMEmailPasswordAuth.h +++ /dev/null @@ -1,120 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@protocol RLMBSON; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// A block type used to report an error -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMEmailPasswordAuthOptionalErrorBlock)(NSError * _Nullable); - -/** - A client for the email/password authentication provider which - can be used to obtain a credential for logging in, - and to perform requests specifically related to the email/password provider. -*/ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMEmailPasswordAuth : RLMProviderClient - -/** - Registers a new email identity with the email/password provider, - and sends a confirmation email to the provided address. - - @param email The email address of the user to register. - @param password The password that the user created for the new email/password identity. - @param completionHandler A callback to be invoked once the call is complete. -*/ - -- (void)registerUserWithEmail:(NSString *)email - password:(NSString *)password - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler NS_SWIFT_NAME(registerUser(email:password:completion:)); - -/** - Confirms an email identity with the email/password provider. - - @param token The confirmation token that was emailed to the user. - @param tokenId The confirmation token id that was emailed to the user. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)confirmUser:(NSString *)token - tokenId:(NSString *)tokenId - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Re-sends a confirmation email to a user that has registered but - not yet confirmed their email address. - - @param email The email address of the user to re-send a confirmation for. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)resendConfirmationEmail:(NSString *)email - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Retries custom confirmation function for a given email address. - - @param email The email address of the user to retry custom confirmation logic. - @param completionHandler A callback to be invoked once the call is complete. - */ -- (void)retryCustomConfirmation:(NSString *)email - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Sends a password reset email to the given email address. - - @param email The email address of the user to send a password reset email for. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)sendResetPasswordEmail:(NSString *)email - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Resets the password of an email identity using the - password reset token emailed to a user. - - @param password The new password. - @param token The password reset token that was emailed to the user. - @param tokenId The password reset token id that was emailed to the user. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)resetPasswordTo:(NSString *)password - token:(NSString *)token - tokenId:(NSString *)tokenId - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Resets the password of an email identity using the - password reset function set up in the application. - - @param email The email address of the user. - @param password The desired new password. - @param args A list of arguments passed in as a BSON array. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)callResetPasswordFunction:(NSString *)email - password:(NSString *)password - args:(NSArray> *)args - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMEmbeddedObject.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMEmbeddedObject.h deleted file mode 100644 index 4db6248ca..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMEmbeddedObject.h +++ /dev/null @@ -1,367 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectSchema, RLMPropertyDescriptor, RLMRealm, RLMNotificationToken, RLMPropertyChange; -typedef void (^RLMObjectChangeBlock)(BOOL deleted, - NSArray *_Nullable changes, - NSError *_Nullable error); -/** - `RLMEmbeddedObject` is a base class used to define Realm model objects. - - Embedded objects work similarly to normal objects, but are owned by a single - parent Object (which itself may be embedded). Unlike normal top-level objects, - embedded objects cannot be directly created in or added to a Realm. Instead, - they can only be created as part of a parent object, or by assigning an - unmanaged object to a parent object's property. Embedded objects are - automatically deleted when the parent object is deleted or when the parent is - modified to no longer point at the embedded object, either by reassigning an - RLMObject property or by removing the embedded object from the array containing - it. - - Embedded objects can only ever have a single parent object which links to them, - and attempting to link to an existing managed embedded object will throw an - exception. - - The property types supported on `RLMEmbeddedObject` are the same as for - `RLMObject`, except for that embedded objects cannot link to top-level objects, - so `RLMObject` and `RLMArray` properties are not supported - (`RLMEmbeddedObject` and `RLMArray` *are*). - - Embedded objects cannot have primary keys or indexed properties. - */ - -@interface RLMEmbeddedObject : RLMObjectBase - -#pragma mark - Creating & Initializing Objects - -/** - Creates an unmanaged instance of a Realm object. - - Unmanaged embedded objects can be added to a Realm by assigning them to an - object property of a managed Realm object or by adding them to a managed - RLMArray. - */ -- (instancetype)init NS_DESIGNATED_INITIALIZER; - -/** - Creates an unmanaged instance of a Realm object. - - Pass in an `NSArray` or `NSDictionary` instance to set the values of the object's properties. - - Unmanaged embedded objects can be added to a Realm by assigning them to an - object property of a managed Realm object or by adding them to a managed - RLMArray. - */ -- (instancetype)initWithValue:(id)value; - -/** - Returns the class name for a Realm object subclass. - - @warning Do not override. Realm relies on this method returning the exact class - name. - - @return The class name for the model class. - */ -+ (NSString *)className; - -#pragma mark - Properties - -/** - The Realm which manages the object, or `nil` if the object is unmanaged. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - The object schema which lists the managed properties for the object. - */ -@property (nonatomic, readonly) RLMObjectSchema *objectSchema; - -/** - Indicates if the object can no longer be accessed because it is now invalid. - - An object can no longer be accessed if the object has been deleted from the Realm that manages it, or - if `invalidate` is called on that Realm. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if this object is frozen. - - @see `-[RLMEmbeddedObject freeze]` - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Customizing your Objects - -/** - Override this method to specify the default values to be used for each property. - - @return A dictionary mapping property names to their default values. - */ -+ (nullable NSDictionary *)defaultPropertyValues; - -/** - Override this method to specify the names of properties to ignore. These properties will not be managed by the Realm - that manages the object. - - @return An array of property names to ignore. - */ -+ (nullable NSArray *)ignoredProperties; - -/** - Override this method to specify the names of properties that are non-optional (i.e. cannot be assigned a `nil` value). - - By default, all properties of a type whose values can be set to `nil` are - considered optional properties. To require that an object in a Realm always - store a non-`nil` value for a property, add the name of the property to the - array returned from this method. - - Properties of `RLMEmbeddedObject` type cannot be non-optional. Array and - `NSNumber` properties can be non-optional, but there is no reason to do so: - arrays do not support storing nil, and if you want a non-optional number you - should instead use the primitive type. - - @return An array of property names that are required. - */ -+ (NSArray *)requiredProperties; - -/** - Override this method to provide information related to properties containing linking objects. - - Each property of type `RLMLinkingObjects` must have a key in the dictionary returned by this method consisting - of the property name. The corresponding value must be an instance of `RLMPropertyDescriptor` that describes the class - and property that the property is linked to. - - return @{ @"owners": [RLMPropertyDescriptor descriptorWithClass:Owner.class propertyName:@"dogs"] }; - - @return A dictionary mapping property names to `RLMPropertyDescriptor` instances. - */ -+ (NSDictionary *)linkingObjectsProperties; - -#pragma mark - Notifications - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in differen - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When notifications - can't be delivered instantly, multiple notifications may be coalesced into a - single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - - @param block The block to be called whenever a change occurs. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block queue:(dispatch_queue_t)queue; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block keyPaths:(NSArray *)keyPaths queue:(dispatch_queue_t)queue; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block keyPaths:(NSArray *)keyPaths; - -#pragma mark - Other Instance Methods - -/** - Returns YES if another Realm object instance points to the same object as the - receiver in the Realm managing the receiver. - - For frozen objects and object types with a primary key, `isEqual:` is - overridden to use the same logic as this method (along with a corresponding - implementation for `hash`). Non-frozen objects without primary keys use - pointer identity for `isEqual:` and `hash`. - - @param object The object to compare the receiver to. - - @return Whether the object represents the same object as the receiver. - */ -- (BOOL)isEqualToObject:(RLMEmbeddedObject *)object; - -/** - Returns a frozen (immutable) snapshot of this object. - - The frozen copy is an immutable object which contains the same data as this - object currently contains, but will not update when writes are made to the - containing Realm. Unlike live objects, frozen objects can be accessed from any - thread. - - - warning: Holding onto a frozen object for an extended period while performing write - transaction on the Realm may result in the Realm file growing to large sizes. See - `Realm.Configuration.maximumNumberOfActiveVersions` for more information. - - warning: This method can only be called on a managed object. - */ -- (instancetype)freeze NS_RETURNS_RETAINED; - -/** - Returns a live (mutable) reference of this object. - - This method creates a managed accessor to a live copy of the same frozen object. - Will return self if called on an already live object. - */ -- (instancetype)thaw; - -#pragma mark - Dynamic Accessors - -/// :nodoc: -- (nullable id)objectForKeyedSubscript:(NSString *)key; - -/// :nodoc: -- (void)setObject:(nullable id)obj forKeyedSubscript:(NSString *)key; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMError.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMError.h deleted file mode 100644 index 514ceee3f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMError.h +++ /dev/null @@ -1,442 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2022 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@protocol RLMValue; - -#pragma mark - Error Domains - -/** Error code is a value from the RLMError enum. */ -extern NSString *const RLMErrorDomain; - -/** An error domain identifying non-specific system errors. */ -extern NSString *const RLMUnknownSystemErrorDomain; - -/** - The error domain string for all SDK errors related to errors reported - by the synchronization manager error handler, as well as general sync - errors that don't fall into any of the other categories. - */ -extern NSString *const RLMSyncErrorDomain; - -/** - The error domain string for all SDK errors related to the authentication - endpoint. - */ -extern NSString *const RLMSyncAuthErrorDomain; - -/** -The error domain string for all SDK errors related to the Atlas App Services -endpoint. -*/ -extern NSString *const RLMAppErrorDomain; - -#pragma mark - RLMError - -/// A user info key containing the error code. This is provided for backwards -/// compatibility only and should not be used. -extern NSString *const RLMErrorCodeKey __attribute((deprecated("use -[NSError code]"))); - -/// A user info key containing the name of the error code. This is for -/// debugging purposes only and should not be relied on. -extern NSString *const RLMErrorCodeNameKey; - -/// A user info key present in sync errors which originate from the server, -/// containing the URL of the server-side logs associated with the error. -extern NSString * const RLMServerLogURLKey; - -/// A user info key containing a HTTP status code. Some ``RLMAppError`` codes -/// include this, most notably ``RLMAppErrorHttpRequestFailed``. -extern NSString * const RLMHTTPStatusCodeKey; - -/// A user info key containing a `RLMCompensatingWriteInfo` which includes -/// further details about what was reverted by the server. -extern NSString *const RLMCompensatingWriteInfoKey; - -/** - `RLMError` is an enumeration representing all recoverable errors. It is - associated with the Realm error domain specified in `RLMErrorDomain`. - */ -typedef RLM_ERROR_ENUM(NSInteger, RLMError, RLMErrorDomain) { - /** Denotes a general error that occurred when trying to open a Realm. */ - RLMErrorFail = 1, - - /** Denotes a file I/O error that occurred when trying to open a Realm. */ - RLMErrorFileAccess = 2, - - /** - Denotes a file permission error that occurred when trying to open a Realm. - - This error can occur if the user does not have permission to open or create - the specified file in the specified access mode when opening a Realm. - */ - RLMErrorFilePermissionDenied = 3, - - /** - Denotes an error where a file was to be written to disk, but another - file with the same name already exists. - */ - RLMErrorFileExists = 4, - - /** - Denotes an error that occurs if a file could not be found. - - This error may occur if a Realm file could not be found on disk when - trying to open a Realm as read-only, or if the directory part of the - specified path was not found when trying to write a copy. - */ - RLMErrorFileNotFound = 5, - - /** - Denotes an error that occurs if a file format upgrade is required to open - the file, but upgrades were explicitly disabled or the file is being open - in read-only mode. - */ - RLMErrorFileFormatUpgradeRequired = 6, - - /** - Denotes an error that occurs if the database file is currently open in - another process which cannot share with the current process due to an - architecture mismatch. - - This error may occur if trying to share a Realm file between an i386 - (32-bit) iOS Simulator and the Realm Studio application. In this case, - please use the 64-bit version of the iOS Simulator. - */ - RLMErrorIncompatibleLockFile = 8, - - /** - Denotes an error that occurs when there is insufficient available address - space to mmap the Realm file. - */ - RLMErrorAddressSpaceExhausted = 9, - - /** - Denotes an error that occurs if there is a schema version mismatch and a - migration is required. - */ - RLMErrorSchemaMismatch = 10, - - /** - Denotes an error where an operation was requested which cannot be - performed on an open file. - */ - RLMErrorAlreadyOpen = 12, - - /// Denotes an error where an input value was invalid. - RLMErrorInvalidInput = 13, - - /// Denotes an error where a write failed due to insufficient disk space. - RLMErrorOutOfDiskSpace = 14, - - /** - Denotes an error where a Realm file could not be opened because another - process has opened the same file in a way incompatible with inter-process - sharing. For example, this can result from opening the backing file for an - in-memory Realm in non-in-memory mode. - */ - RLMErrorIncompatibleSession = 15, - - /** - Denotes an error that occurs if the file is a valid Realm file, but has a - file format version which is not supported by this version of Realm. This - typically means that the file was written by a newer version of Realm, but - may also mean that it is from a pre-1.0 version of Realm (or for - synchronized files, pre-10.0). - */ - RLMErrorUnsupportedFileFormatVersion = 16, - - /** - Denotes an error that occurs if a synchronized Realm is opened in more - than one process at once. - */ - RLMErrorMultipleSyncAgents = 17, - - /// A subscription was rejected by the server. - RLMErrorSubscriptionFailed = 18, - - /// A file operation failed in a way which does not have a more specific error code. - RLMErrorFileOperationFailed = 19, - - /** - Denotes an error that occurs if the file being opened is not a valid Realm - file. Some of the possible causes of this are: - 1. The file at the given URL simply isn't a Realm file at all. - 2. The wrong encryption key was given. - 3. The Realm file is encrypted and no encryption key was given. - 4. The Realm file isn't encrypted but an encryption key was given. - 5. The file on disk has become corrupted. - */ - RLMErrorInvalidDatabase = 20, - - /** - Denotes an error that occurs if a Realm is opened in the wrong history - mode. Typically this means that either a local Realm is being opened as a - synchronized Realm or vice versa. - */ - RLMErrorIncompatibleHistories = 21, - - /** - Denotes an error that occurs if objects were written to a flexible sync - Realm without any active subscriptions for that object type. All objects - created in flexible sync Realms must match at least one active - subscription or the server will reject the write. - */ - RLMErrorNoSubscriptionForWrite = 22, -}; - -#pragma mark - RLMSyncError - -/// A user info key for use with `RLMSyncErrorClientResetError`. -extern NSString *const kRLMSyncPathOfRealmBackupCopyKey; - -/// A user info key for use with certain error types. -extern NSString *const kRLMSyncErrorActionTokenKey; - -/** - An error related to a problem that might be reported by the synchronization manager - error handler, or a callback on a sync-related API that performs asynchronous work. - */ -typedef RLM_ERROR_ENUM(NSInteger, RLMSyncError, RLMSyncErrorDomain) { - /// An error that indicates a problem with the session (a specific Realm opened for sync). - RLMSyncErrorClientSessionError = 4, - - /// An error that indicates a problem with a specific user. - RLMSyncErrorClientUserError = 5, - - /** - An error that indicates an internal, unrecoverable problem - with the underlying synchronization engine. - */ - RLMSyncErrorClientInternalError = 6, - - /** - An error that indicates the Realm needs to be reset. - - A synced Realm may need to be reset because Atlas App Services encountered an - error and had to be restored from a backup. If the backup copy of the remote Realm - is of an earlier version than the local copy of the Realm, the server will ask the - client to reset the Realm. - - The reset process is as follows: the local copy of the Realm is copied into a recovery - directory for safekeeping, and then deleted from the original location. The next time - the Realm for that partition value is opened, the Realm will automatically be re-downloaded from - Atlas App Services, and can be used as normal. - - Data written to the Realm after the local copy of the Realm diverged from the backup - remote copy will be present in the local recovery copy of the Realm file. The - re-downloaded Realm will initially contain only the data present at the time the Realm - was backed up on the server. - - The client reset process can be initiated in one of two ways. - - The `userInfo` dictionary contains an opaque token object under the key - `kRLMSyncErrorActionTokenKey`. This token can be passed into - `+[RLMSyncSession immediatelyHandleError:]` in order to immediately perform the client - reset process. This should only be done after your app closes and invalidates every - instance of the offending Realm on all threads (note that autorelease pools may make this - difficult to guarantee). - - If `+[RLMSyncSession immediatelyHandleError:]` is not called, the client reset process - will be automatically carried out the next time the app is launched and the - `RLMSyncManager` is accessed. - - The value for the `kRLMSyncPathOfRealmBackupCopyKey` key in the `userInfo` dictionary - describes the path of the recovered copy of the Realm. This copy will not actually be - created until the client reset process is initiated. - - @see `-[NSError rlmSync_errorActionToken]`, `-[NSError rlmSync_clientResetBackedUpRealmPath]` - */ - RLMSyncErrorClientResetError = 7, - - /// :nodoc: - RLMSyncErrorUnderlyingAuthError = 8, - - /** - An error that indicates the user does not have permission to perform an operation - upon a synced Realm. For example, a user may receive this error if they attempt to - open a Realm they do not have at least read access to, or write to a Realm they only - have read access to. - - This error may also occur if a user incorrectly opens a Realm they have read-only - permissions to without using the `asyncOpen()` APIs. - - A Realm that suffers a permission denied error is, by default, flagged so that its - local copy will be deleted the next time the application starts. - - The `userInfo` dictionary contains an opaque token object under the key - `kRLMSyncErrorActionTokenKey`. This token can be passed into - `+[RLMSyncSession immediatelyHandleError:]` in order to immediately delete the local - copy. This should only be done after your app closes and invalidates every instance - of the offending Realm on all threads (note that autorelease pools may make this - difficult to guarantee). - - @warning It is strongly recommended that, if a Realm has encountered a permission denied - error, its files be deleted before attempting to re-open it. - - @see `-[NSError rlmSync_errorActionToken]` - */ - RLMSyncErrorPermissionDeniedError = 9, - - /** - An error that indicates that the server has rejected the requested flexible sync subscriptions. - */ - RLMSyncErrorInvalidFlexibleSyncSubscriptions = 10, - - /** - An error that indicates that the server has reverted a write made by this - client. This can happen due to not having write permission, or because an - object was created in a flexible sync Realm which does not match any - active subscriptions. - - This error is informational and does not require any explicit handling. - */ - RLMSyncErrorWriteRejected = 11, - - /** - A connection error without a more specific error code occurred. - - Realm internally handles retrying connections with appropriate backoffs, - so connection errors are normally logged and not reported to the error - handler. The exception is if - ``RLMSyncConfiguration.cancelAsyncOpenOnNonFatalErrors`` is set to `true`, - in which case async opens will be canceled on connection failures and the - error will be reported to the completion handler. - - Note that connection timeouts are reported as - (errorDomain: NSPosixErrorDomain, error: ETIMEDOUT) - and not as one of these error codes. - */ - RLMSyncErrorConnectionFailed = 12, - - /** - Connecting to the server failed due to a TLS issue such as an invalid certificate. - */ - RLMSyncErrorTLSHandshakeFailed = 13, -}; - -#pragma mark - RLMSyncAuthError - -// NEXT-MAJOR: This was a ROS thing and should have been removed in v10 -/// :nodoc: -typedef RLM_ERROR_ENUM(NSInteger, RLMSyncAuthError, RLMSyncAuthErrorDomain) { - RLMSyncAuthErrorBadResponse = 1, - RLMSyncAuthErrorBadRemoteRealmPath = 2, - RLMSyncAuthErrorHTTPStatusCodeError = 3, - RLMSyncAuthErrorClientSessionError = 4, - RLMSyncAuthErrorInvalidParameters = 601, - RLMSyncAuthErrorMissingPath = 602, - RLMSyncAuthErrorInvalidCredential = 611, - RLMSyncAuthErrorUserDoesNotExist = 612, - RLMSyncAuthErrorUserAlreadyExists = 613, - RLMSyncAuthErrorAccessDeniedOrInvalidPath = 614, - RLMSyncAuthErrorInvalidAccessToken = 615, - RLMSyncAuthErrorFileCannotBeShared = 703, -} __attribute__((deprecated("Errors of this type are no longer reported"))); - -#pragma mark - RLMSyncAppError - -/// An error which occurred when making a request to Atlas App Services. -typedef RLM_ERROR_ENUM(NSInteger, RLMAppError, RLMAppErrorDomain) { - /// An unknown error has occurred - RLMAppErrorUnknown = -1, - - /// A HTTP request completed with an error status code. The failing status - /// code can be found in the ``RLMHTTPStatusCodeKey`` key of the userInfo - /// dictionary. - RLMAppErrorHttpRequestFailed = 1, - - /// A user's session is in an invalid state. Logging out and back in may rectify this. - RLMAppErrorInvalidSession, - /// A request sent to the server was malformed in some way. - RLMAppErrorBadRequest, - /// A request was made using a nonexistent user. - RLMAppErrorUserNotFound, - /// A request was made against an App using a User which does not belong to that App. - RLMAppErrorUserAppDomainMismatch, - /// The auth provider has limited the domain names which can be used for email addresses, and the given one is not allowed. - RLMAppErrorDomainNotAllowed, - /// The request body size exceeded a server-configured limit. - RLMAppErrorReadSizeLimitExceeded, - /// A request had an invalid parameter. - RLMAppErrorInvalidParameter, - /// A request was missing a required parameter. - RLMAppErrorMissingParameter, - /// Executing the requested server function failed with an error. - RLMAppErrorFunctionExecutionError, - /// The server encountered an internal error. - RLMAppErrorInternalServerError, - /// Authentication failed due to the request auth provider not existing. - RLMAppErrorAuthProviderNotFound, - /// The requested value does not exist. - RLMAppErrorValueNotFound, - /// The value being created already exists. - RLMAppErrorValueAlreadyExists, - /// A value with the same name as the value being created already exists. - RLMAppErrorValueDuplicateName, - /// The called server function does not exist. - RLMAppErrorFunctionNotFound, - /// The called server function has a syntax error. - RLMAppErrorFunctionSyntaxError, - /// The called server function is invalid in some way. - RLMAppErrorFunctionInvalid, - /// Registering an API key with the auth provider failed due to it already existing. - RLMAppErrorAPIKeyAlreadyExists, - /// The operation failed due to exceeding the server-configured time limit. - RLMAppErrorExecutionTimeLimitExceeded, - /// The body of the called function does not define a callable thing. - RLMAppErrorNotCallable, - /// Email confirmation failed for a user because the user has already confirmed their email. - RLMAppErrorUserAlreadyConfirmed, - /// The user cannot be used because it has been disabled. - RLMAppErrorUserDisabled, - /// An auth error occurred which does not have a more specific error code. - RLMAppErrorAuthError, - /// Account registration failed due to the user name already being taken. - RLMAppErrorAccountNameInUse, - /// A login request failed due to an invalid password. - RLMAppErrorInvalidPassword, - /// Operation failed due to server-side maintenance. - RLMAppErrorMaintenanceInProgress, - /// Operation failed due to an error reported by MongoDB. - RLMAppErrorMongoDBError, -}; - -/// Extended information about a write which was rejected by the server. -/// -/// The server will sometimes reject writes made by the client for reasons such -/// as permissions, additional server-side validation failing, or because the -/// object didn't match any flexible sync subscriptions. When this happens, a -/// ``RLMSyncErrorWriteRejected`` error is reported which contains an array of -/// `RLMCompensatingWriteInfo` objects in the ``RLMCompensatingWriteInfoKey`` -/// userInfo key with information about what writes were rejected and why. -/// -/// This information is intended for debugging and logging purposes only. The -/// `reason` strings are generated by the server and are not guaranteed to be -/// stable, so attempting to programmatically do anything with them will break -/// without warning. -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMCompensatingWriteInfo : NSObject -/// The class name of the object being written to. -@property (nonatomic, readonly) NSString *objectType; -/// The primary key of the object being written to. -@property (nonatomic, readonly) id primaryKey NS_REFINED_FOR_SWIFT; -/// A human-readable string describing why the write was rejected. -@property (nonatomic, readonly) NSString *reason; -@end diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMFindOneAndModifyOptions.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMFindOneAndModifyOptions.h deleted file mode 100644 index 3cce99f23..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMFindOneAndModifyOptions.h +++ /dev/null @@ -1,80 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) -@protocol RLMBSON; -@class RLMSortDescriptor; - -/// Options to use when executing a `findOneAndUpdate`, `findOneAndReplace`, -/// or `findOneAndDelete` command on a `RLMMongoCollection`. -@interface RLMFindOneAndModifyOptions : NSObject - -/// Limits the fields to return for all matching documents. -@property (nonatomic, nullable) id projection NS_REFINED_FOR_SWIFT; - -/// The order in which to return matching documents. -@property (nonatomic, nullable) id sort NS_REFINED_FOR_SWIFT -__attribute__((deprecated("Use `sorting` instead, which correctly sort more than one sort attribute", "sorting"))); - -/// The order in which to return matching documents. -@property (nonatomic) NSArray> *sorting NS_REFINED_FOR_SWIFT; - - -/// Whether or not to perform an upsert, default is false -/// (only available for find_one_and_replace and find_one_and_update) -@property (nonatomic) BOOL upsert; - -/// When true then the new document is returned, -/// Otherwise the old document is returned (default) -/// (only available for findOneAndReplace and findOneAndUpdate) -@property (nonatomic) BOOL shouldReturnNewDocument; - -/// Options to use when executing a `findOneAndUpdate`, `findOneAndReplace`, -/// or `findOneAndDelete` command on a `RLMMongoCollection`. -/// @param projection Limits the fields to return for all matching documents. -/// @param sort The order in which to return matching documents. -/// @param upsert Whether or not to perform an upsert, default is false -/// (only available for findOneAndReplace and findOneAndUpdate) -/// @param shouldReturnNewDocument When true then the new document is returned, -/// Otherwise the old document is returned (default), -/// (only available for findOneAndReplace and findOneAndUpdate) -- (instancetype)initWithProjection:(id _Nullable)projection - sort:(id _Nullable)sort - upsert:(BOOL)upsert - shouldReturnNewDocument:(BOOL)shouldReturnNewDocument -__attribute__((deprecated("Please use `initWithProjection:sorting:upsert:shouldReturnNewDocument:`"))) - NS_SWIFT_UNAVAILABLE("Please see FindOneAndModifyOptions"); - -/// Options to use when executing a `findOneAndUpdate`, `findOneAndReplace`, -/// or `findOneAndDelete` command on a `RLMMongoCollection`. -/// @param projection Limits the fields to return for all matching documents. -/// @param sorting The order in which to return matching documents. -/// @param upsert Whether or not to perform an upsert, default is false -/// (only available for findOneAndReplace and findOneAndUpdate) -/// @param shouldReturnNewDocument When true then the new document is returned, -/// Otherwise the old document is returned (default), -/// (only available for findOneAndReplace and findOneAndUpdate) -- (instancetype)initWithProjection:(id _Nullable)projection - sorting:(NSArray> *)sorting - upsert:(BOOL)upsert - shouldReturnNewDocument:(BOOL)shouldReturnNewDocument; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMFindOptions.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMFindOptions.h deleted file mode 100644 index 043a85374..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMFindOptions.h +++ /dev/null @@ -1,77 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@protocol RLMBSON; - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -@interface RLMFindOptions : NSObject - -/// The maximum number of documents to return. Specifying 0 will return all documents. -@property (nonatomic) NSInteger limit; - -/// Limits the fields to return for all matching documents. -@property (nonatomic, nullable) id projection NS_REFINED_FOR_SWIFT; - -/// The order in which to return matching documents. -@property (nonatomic, nullable) id sort NS_REFINED_FOR_SWIFT -__attribute__((deprecated("Use `sorting` instead, which correctly sort more than one sort attribute", "sorting"))); - -/// The order in which to return matching documents. -@property (nonatomic) NSArray> *sorting NS_REFINED_FOR_SWIFT; - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -/// @param limit The maximum number of documents to return. Specifying 0 will return all documents. -/// @param projection Limits the fields to return for all matching documents. -/// @param sort The order in which to return matching documents. -- (instancetype)initWithLimit:(NSInteger)limit - projection:(id _Nullable)projection - sort:(id _Nullable)sort -__attribute__((deprecated("Please use `initWithLimit:projection:sorting:`"))) - NS_SWIFT_UNAVAILABLE("Please see FindOption"); - - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -/// @param projection Limits the fields to return for all matching documents. -/// @param sort The order in which to return matching documents. -- (instancetype)initWithProjection:(id _Nullable)projection - sort:(id _Nullable)sort __deprecated -__attribute__((deprecated("Please use `initWithProjection:sorting:`"))) - NS_SWIFT_UNAVAILABLE("Please see FindOption"); - - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -/// @param limit The maximum number of documents to return. Specifying 0 will return all documents. -/// @param projection Limits the fields to return for all matching documents. -/// @param sorting The order in which to return matching documents. -- (instancetype)initWithLimit:(NSInteger)limit - projection:(id _Nullable)projection - sorting:(NSArray> *)sorting; - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -/// @param projection Limits the fields to return for all matching documents. -/// @param sorting The order in which to return matching documents. -- (instancetype)initWithProjection:(id _Nullable)projection - sorting:(NSArray> *)sorting; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMLogger.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMLogger.h deleted file mode 100644 index 96ab91967..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMLogger.h +++ /dev/null @@ -1,99 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -/// An enum representing different levels of sync-related logging that can be configured. -typedef RLM_CLOSED_ENUM(NSUInteger, RLMLogLevel) { - /// Nothing will ever be logged. - RLMLogLevelOff, - /// Only fatal errors will be logged. - RLMLogLevelFatal, - /// Only errors will be logged. - RLMLogLevelError, - /// Warnings and errors will be logged. - RLMLogLevelWarn, - /// Information about sync events will be logged. Fewer events will be logged in order to avoid overhead. - RLMLogLevelInfo, - /// Information about sync events will be logged. More events will be logged than with `RLMLogLevelInfo`. - RLMLogLevelDetail, - /// Log information that can aid in debugging. - /// - /// - warning: Will incur a measurable performance impact. - RLMLogLevelDebug, - /// Log information that can aid in debugging. More events will be logged than with `RLMLogLevelDebug`. - /// - /// - warning: Will incur a measurable performance impact. - RLMLogLevelTrace, - /// Log information that can aid in debugging. More events will be logged than with `RLMLogLevelTrace`. - /// - /// - warning: Will incur a measurable performance impact. - RLMLogLevelAll -} NS_SWIFT_NAME(LogLevel); - -/// A log callback function which can be set on RLMLogger. -/// -/// The log function may be called from multiple threads simultaneously, and is -/// responsible for performing its own synchronization if any is required. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void (^RLMLogFunction)(RLMLogLevel level, NSString *message); - -/** - `RLMLogger` is used for creating your own custom logging logic. - - You can define your own logger creating an instance of `RLMLogger` and define the log function which will be - invoked whenever there is a log message. - Set this custom logger as you default logger using `setDefaultLogger`. - - RLMLogger.defaultLogger = [[RLMLogger alloc] initWithLevel:RLMLogLevelDebug - logFunction:^(RLMLogLevel level, NSString * message) { - NSLog(@"Realm Log - %lu, %@", (unsigned long)level, message); - }]; - - @note By default default log threshold level is `RLMLogLevelInfo`, and logging strings are output to Apple System Logger. -*/ -@interface RLMLogger : NSObject - -/** - Gets the logging threshold level used by the logger. - */ -@property (nonatomic) RLMLogLevel level; - -/// :nodoc: -- (instancetype)init NS_UNAVAILABLE; - -/** - Creates a logger with the associated log level and the logic function to define your own logging logic. - - @param level The log level to be set for the logger. - @param logFunction The log function which will be invoked whenever there is a log message. -*/ -- (instancetype)initWithLevel:(RLMLogLevel)level logFunction:(RLMLogFunction)logFunction; - -#pragma mark RLMLogger Default Logger API - -/** - The current default logger. When setting a logger as default, this logger will be used whenever information must be logged. - */ -@property (class) RLMLogger *defaultLogger NS_SWIFT_NAME(shared); - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMMigration.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMMigration.h deleted file mode 100644 index 4a6652a19..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMMigration.h +++ /dev/null @@ -1,129 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMSchema; -@class RLMArray; -@class RLMObject; - -/** - A block type which provides both the old and new versions of an object in the Realm. Object - properties can only be accessed using keyed subscripting. - - @see `-[RLMMigration enumerateObjects:block:]` - - @param oldObject The object from the original Realm (read-only). - @param newObject The object from the migrated Realm (read-write). -*/ -typedef void (^RLMObjectMigrationBlock)(RLMObject * __nullable oldObject, RLMObject * __nullable newObject); - -/** - `RLMMigration` instances encapsulate information intended to facilitate a schema migration. - - A `RLMMigration` instance is passed into a user-defined `RLMMigrationBlock` block when updating - the version of a Realm. This instance provides access to the old and new database schemas, the - objects in the Realm, and provides functionality for modifying the Realm during the migration. - */ -@interface RLMMigration : NSObject - -#pragma mark - Properties - -/** - Returns the old `RLMSchema`. This is the schema which describes the Realm before the - migration is applied. - */ -@property (nonatomic, readonly) RLMSchema *oldSchema NS_REFINED_FOR_SWIFT; - -/** - Returns the new `RLMSchema`. This is the schema which describes the Realm after the - migration is applied. - */ -@property (nonatomic, readonly) RLMSchema *newSchema NS_REFINED_FOR_SWIFT; - - -#pragma mark - Altering Objects during a Migration - -/** - Enumerates all the objects of a given type in the Realm, providing both the old and new versions - of each object. Within the block, object properties can only be accessed using keyed subscripting. - - @param className The name of the `RLMObject` class to enumerate. - - @warning All objects returned are of a type specific to the current migration and should not be cast - to `className`. Instead, treat them as `RLMObject`s and use keyed subscripting to access - properties. - */ -- (void)enumerateObjects:(NSString *)className - block:(__attribute__((noescape)) RLMObjectMigrationBlock)block NS_REFINED_FOR_SWIFT; - -/** - Creates and returns an `RLMObject` instance of type `className` in the Realm being migrated. - - The `value` argument is used to populate the object. It can be a key-value coding compliant object, an array or - dictionary returned from the methods in `NSJSONSerialization`, or an array containing one element for each managed - property. An exception will be thrown if any required properties are not present and those properties were not defined - with default values. - - When passing in an `NSArray` as the `value` argument, all properties must be present, valid and in the same order as - the properties defined in the model. - - @param className The name of the `RLMObject` class to create. - @param value The value used to populate the object. - */ -- (RLMObject *)createObject:(NSString *)className withValue:(id)value NS_REFINED_FOR_SWIFT; - -/** - Deletes an object from a Realm during a migration. - - It is permitted to call this method from within the block passed to `-[enumerateObjects:block:]`. - - @param object Object to be deleted from the Realm being migrated. - */ -- (void)deleteObject:(RLMObject *)object NS_REFINED_FOR_SWIFT; - -/** - Deletes the data for the class with the given name. - - All objects of the given class will be deleted. If the `RLMObject` subclass no longer exists in your program, - any remaining metadata for the class will be removed from the Realm file. - - @param name The name of the `RLMObject` class to delete. - - @return A Boolean value indicating whether there was any data to delete. - */ -- (BOOL)deleteDataForClassName:(NSString *)name NS_REFINED_FOR_SWIFT; - -/** - Renames a property of the given class from `oldName` to `newName`. - - @param className The name of the class whose property should be renamed. This class must be present - in both the old and new Realm schemas. - @param oldName The old persisted property name for the property to be renamed. There must not be a property with this name in the - class as defined by the new Realm schema. - @param newName The new persisted property name for the property to be renamed. There must not be a property with this name in the - class as defined by the old Realm schema. - */ -- (void)renamePropertyForClass:(NSString *)className oldName:(NSString *)oldName - newName:(NSString *)newName NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMMongoClient.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMMongoClient.h deleted file mode 100644 index 50a1c226d..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMMongoClient.h +++ /dev/null @@ -1,47 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMApp; - -/// The `RLMMongoClient` enables reading and writing on a MongoDB database via the Realm Cloud service. -/// -/// It provides access to instances of `RLMMongoDatabase`, which in turn provide access to specific -/// `RLMMongoCollection`s that hold your data. -/// -/// - Note: -/// Before you can read or write data, a user must log in. -/// -/// - SeeAlso: -/// `RLMApp`, `RLMMongoDatabase`, `RLMMongoCollection` -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMMongoClient : NSObject - -/// The name of the client -@property (nonatomic, readonly) NSString *name; - -/// Gets a `RLMMongoDatabase` instance for the given database name. -/// @param name the name of the database to retrieve -- (RLMMongoDatabase *)databaseWithName:(NSString *)name NS_SWIFT_NAME(database(named:)); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMMongoCollection.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMMongoCollection.h deleted file mode 100644 index 0feae60ac..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMMongoCollection.h +++ /dev/null @@ -1,330 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) -@protocol RLMBSON; - -@class RLMFindOptions, RLMFindOneAndModifyOptions, RLMUpdateResult, RLMChangeStream, RLMObjectId; - -/// Delegate which is used for subscribing to changes on a `[RLMMongoCollection watch]` stream. -@protocol RLMChangeEventDelegate -/// The stream was opened. -/// @param changeStream The RLMChangeStream subscribing to the stream changes. -- (void)changeStreamDidOpen:(RLMChangeStream *)changeStream; -/// The stream has been closed. -/// @param error If an error occured when closing the stream, an error will be passed. -- (void)changeStreamDidCloseWithError:(nullable NSError *)error; -/// A error has occured while streaming. -/// @param error The streaming error. -- (void)changeStreamDidReceiveError:(NSError *)error; -/// Invoked when a change event has been received. -/// @param changeEvent The change event in BSON format. -- (void)changeStreamDidReceiveChangeEvent:(id)changeEvent; -@end - -/// Acts as a middleman and processes events with WatchStream -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMChangeStream : NSObject -/// Stops a watch streaming session. -- (void)close; -/// :nodoc: -- (instancetype)init NS_UNAVAILABLE; -@end - -/// The `RLMMongoCollection` represents a MongoDB collection. -/// -/// You can get an instance from a `RLMMongoDatabase`. -/// -/// Create, read, update, and delete methods are available. -/// -/// Operations against the Realm Cloud server are performed asynchronously. -/// -/// - Note: -/// Before you can read or write data, a user must log in. -/// - Usage: -/// RLMMongoClient *client = [self.app mongoClient:@"mongodb1"]; -/// RLMMongoDatabase *database = [client databaseWithName:@"test_data"]; -/// RLMMongoCollection *collection = [database collectionWithName:@"Dog"]; -/// [collection insertOneDocument:@{@"name": @"fido", @"breed": @"cane corso"} completion:...]; -/// -/// - SeeAlso: -/// `RLMMongoClient`, `RLMMongoDatabase` -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMMongoCollection : NSObject -/// Block which returns an object id on a successful insert, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoInsertBlock)(id _Nullable, NSError * _Nullable); -/// Block which returns an array of object ids on a successful insertMany, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoInsertManyBlock)(NSArray> * _Nullable, NSError * _Nullable); -/// Block which returns an array of Documents on a successful find operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoFindBlock)(NSArray> *> * _Nullable, - NSError * _Nullable); -/// Block which returns a Document on a successful findOne operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoFindOneBlock)(NSDictionary> * _Nullable_result, - NSError * _Nullable); -/// Block which returns the number of Documents in a collection on a successful count operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoCountBlock)(NSInteger, NSError * _Nullable); -/// Block which returns an RLMUpdateResult on a successful update operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoUpdateBlock)(RLMUpdateResult * _Nullable, NSError * _Nullable); -/// Block which returns the deleted Document on a successful delete operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoDeleteBlock)(NSDictionary> * _Nullable_result, - NSError * _Nullable); - -/// The name of this mongodb collection. -@property (nonatomic, readonly) NSString *name; - -/// Encodes the provided value to BSON and inserts it. If the value is missing an identifier, one will be -/// generated for it. -/// @param document A `Document` value to insert. -/// @param completion The result of attempting to perform the insert. An Id will be returned for the inserted object on sucess -- (void)insertOneDocument:(NSDictionary> *)document - completion:(RLMMongoInsertBlock)completion NS_REFINED_FOR_SWIFT; - -/// Encodes the provided values to BSON and inserts them. If any values are missing identifiers, -/// they will be generated. -/// @param documents The `Document` values in a bson array to insert. -/// @param completion The result of the insert, returns an array inserted document ids in order -- (void)insertManyDocuments:(NSArray> *> *)documents - completion:(RLMMongoInsertManyBlock)completion NS_REFINED_FOR_SWIFT; - -/// Finds the documents in this collection which match the provided filter. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param options `RLMFindOptions` to use when executing the command. -/// @param completion The resulting bson array of documents or error if one occurs -- (void)findWhere:(NSDictionary> *)filterDocument - options:(RLMFindOptions *)options - completion:(RLMMongoFindBlock)completion NS_REFINED_FOR_SWIFT; - -/// Finds the documents in this collection which match the provided filter. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param completion The resulting bson array as a string or error if one occurs -- (void)findWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoFindBlock)completion NS_REFINED_FOR_SWIFT; - -/// Returns one document from a collection or view which matches the -/// provided filter. If multiple documents satisfy the query, this method -/// returns the first document according to the query's sort order or natural -/// order. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param options `RLMFindOptions` to use when executing the command. -/// @param completion The resulting bson or error if one occurs -- (void)findOneDocumentWhere:(NSDictionary> *)filterDocument - options:(RLMFindOptions *)options - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Returns one document from a collection or view which matches the -/// provided filter. If multiple documents satisfy the query, this method -/// returns the first document according to the query's sort order or natural -/// order. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param completion The resulting bson or error if one occurs -- (void)findOneDocumentWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Runs an aggregation framework pipeline against this collection. -/// @param pipeline A bson array made up of `Documents` containing the pipeline of aggregation operations to perform. -/// @param completion The resulting bson array of documents or error if one occurs -- (void)aggregateWithPipeline:(NSArray> *> *)pipeline - completion:(RLMMongoFindBlock)completion NS_REFINED_FOR_SWIFT; - -/// Counts the number of documents in this collection matching the provided filter. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param limit The max amount of documents to count -/// @param completion Returns the count of the documents that matched the filter. -- (void)countWhere:(NSDictionary> *)filterDocument - limit:(NSInteger)limit - completion:(RLMMongoCountBlock)completion NS_REFINED_FOR_SWIFT; - -/// Counts the number of documents in this collection matching the provided filter. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param completion Returns the count of the documents that matched the filter. -- (void)countWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoCountBlock)completion NS_REFINED_FOR_SWIFT; - -/// Deletes a single matching document from the collection. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param completion The result of performing the deletion. Returns the count of deleted objects -- (void)deleteOneDocumentWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoCountBlock)completion NS_REFINED_FOR_SWIFT; - -/// Deletes multiple documents -/// @param filterDocument Document representing the match criteria -/// @param completion The result of performing the deletion. Returns the count of the deletion -- (void)deleteManyDocumentsWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoCountBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates a single document matching the provided filter in this collection. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param upsert When true, creates a new document if no document matches the query. -/// @param completion The result of the attempt to update a document. -- (void)updateOneDocumentWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - upsert:(BOOL)upsert - completion:(RLMMongoUpdateBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates a single document matching the provided filter in this collection. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param completion The result of the attempt to update a document. -- (void)updateOneDocumentWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - completion:(RLMMongoUpdateBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates multiple documents matching the provided filter in this collection. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param upsert When true, creates a new document if no document matches the query. -/// @param completion The result of the attempt to update a document. -- (void)updateManyDocumentsWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - upsert:(BOOL)upsert - completion:(RLMMongoUpdateBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates multiple documents matching the provided filter in this collection. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param completion The result of the attempt to update a document. -- (void)updateManyDocumentsWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - completion:(RLMMongoUpdateBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates a single document in a collection based on a query filter and -/// returns the document in either its pre-update or post-update form. Unlike -/// `updateOneDocument`, this action allows you to atomically find, update, and -/// return a document with the same command. This avoids the risk of other -/// update operations changing the document between separate find and update -/// operations. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param options `RemoteFindOneAndModifyOptions` to use when executing the command. -/// @param completion The result of the attempt to update a document. -- (void)findOneAndUpdateWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - options:(RLMFindOneAndModifyOptions *)options - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates a single document in a collection based on a query filter and -/// returns the document in either its pre-update or post-update form. Unlike -/// `updateOneDocument`, this action allows you to atomically find, update, and -/// return a document with the same command. This avoids the risk of other -/// update operations changing the document between separate find and update -/// operations. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param completion The result of the attempt to update a document. -- (void)findOneAndUpdateWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Overwrites a single document in a collection based on a query filter and -/// returns the document in either its pre-replacement or post-replacement -/// form. Unlike `updateOneDocument`, this action allows you to atomically find, -/// replace, and return a document with the same command. This avoids the -/// risk of other update operations changing the document between separate -/// find and update operations. -/// @param filterDocument A `Document` that should match the query. -/// @param replacementDocument A `Document` describing the replacement. -/// @param options `RLMFindOneAndModifyOptions` to use when executing the command. -/// @param completion The result of the attempt to replace a document. -- (void)findOneAndReplaceWhere:(NSDictionary> *)filterDocument - replacementDocument:(NSDictionary> *)replacementDocument - options:(RLMFindOneAndModifyOptions *)options - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Overwrites a single document in a collection based on a query filter and -/// returns the document in either its pre-replacement or post-replacement -/// form. Unlike `updateOneDocument`, this action allows you to atomically find, -/// replace, and return a document with the same command. This avoids the -/// risk of other update operations changing the document between separate -/// find and update operations. -/// @param filterDocument A `Document` that should match the query. -/// @param replacementDocument A `Document` describing the update. -/// @param completion The result of the attempt to replace a document. -- (void)findOneAndReplaceWhere:(NSDictionary> *)filterDocument - replacementDocument:(NSDictionary> *)replacementDocument - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Removes a single document from a collection based on a query filter and -/// returns a document with the same form as the document immediately before -/// it was deleted. Unlike `deleteOneDocument`, this action allows you to atomically -/// find and delete a document with the same command. This avoids the risk of -/// other update operations changing the document between separate find and -/// delete operations. -/// @param filterDocument A `Document` that should match the query. -/// @param options `RLMFindOneAndModifyOptions` to use when executing the command. -/// @param completion The result of the attempt to delete a document. -- (void)findOneAndDeleteWhere:(NSDictionary> *)filterDocument - options:(RLMFindOneAndModifyOptions *)options - completion:(RLMMongoDeleteBlock)completion NS_REFINED_FOR_SWIFT; - -/// Removes a single document from a collection based on a query filter and -/// returns a document with the same form as the document immediately before -/// it was deleted. Unlike `deleteOneDocument`, this action allows you to atomically -/// find and delete a document with the same command. This avoids the risk of -/// other update operations changing the document between separate find and -/// delete operations. -/// @param filterDocument A `Document` that should match the query. -/// @param completion The result of the attempt to delete a document. -- (void)findOneAndDeleteWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoDeleteBlock)completion NS_REFINED_FOR_SWIFT; - -/// Opens a MongoDB change stream against the collection to watch for changes. The resulting stream will be notified -/// of all events on this collection that the active user is authorized to see based on the configured MongoDB -/// rules. -/// @param delegate The delegate that will react to events and errors from the resulting change stream. -/// @param queue Dispatches streaming events to an optional queue, if no queue is provided the main queue is used -- (RLMChangeStream *)watchWithDelegate:(id)delegate - delegateQueue:(nullable dispatch_queue_t)queue NS_REFINED_FOR_SWIFT; - -/// Opens a MongoDB change stream against the collection to watch for changes -/// made to specific documents. The documents to watch must be explicitly -/// specified by their _id. -/// @param filterIds The list of _ids in the collection to watch. -/// @param delegate The delegate that will react to events and errors from the resulting change stream. -/// @param queue Dispatches streaming events to an optional queue, if no queue is provided the main queue is used -- (RLMChangeStream *)watchWithFilterIds:(NSArray *)filterIds - delegate:(id)delegate - delegateQueue:(nullable dispatch_queue_t)queue NS_REFINED_FOR_SWIFT; - -/// Opens a MongoDB change stream against the collection to watch for changes. The provided BSON document will be -/// used as a match expression filter on the change events coming from the stream. -/// -/// See https://docs.mongodb.com/manual/reference/operator/aggregation/match/ for documentation around how to define -/// a match filter. -/// -/// Defining the match expression to filter ChangeEvents is similar to defining the match expression for triggers: -/// https://docs.mongodb.com/realm/triggers/database-triggers/ -/// @param matchFilter The $match filter to apply to incoming change events -/// @param delegate The delegate that will react to events and errors from the resulting change stream. -/// @param queue Dispatches streaming events to an optional queue, if no queue is provided the main queue is used -- (RLMChangeStream *)watchWithMatchFilter:(NSDictionary> *)matchFilter - delegate:(id)delegate - delegateQueue:(nullable dispatch_queue_t)queue NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMMongoDatabase.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMMongoDatabase.h deleted file mode 100644 index 177fbc1b8..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMMongoDatabase.h +++ /dev/null @@ -1,51 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMMongoCollection; - -/// The `RLMMongoDatabase` represents a MongoDB database, which holds a group -/// of collections that contain your data. -/// -/// It can be retrieved from the `RLMMongoClient`. -/// -/// Use it to get `RLMMongoCollection`s for reading and writing data. -/// -/// - Note: -/// Before you can read or write data, a user must log in`. -/// -/// - SeeAlso: -/// `RLMMongoClient`, `RLMMongoCollection` -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMMongoDatabase : NSObject - -/// The name of this database -@property (nonatomic, readonly) NSString *name; - -/// Gets a collection. -/// @param name The name of the collection to return -/// @returns The collection -- (RLMMongoCollection *)collectionWithName:(NSString *)name; -// NEXT-MAJOR: NS_SWIFT_NAME(collection(named:)) - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMNetworkTransport.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMNetworkTransport.h deleted file mode 100644 index 2884b4296..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMNetworkTransport.h +++ /dev/null @@ -1,132 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// Allowed HTTP methods to be used with `RLMNetworkTransport`. -typedef RLM_CLOSED_ENUM(int32_t, RLMHTTPMethod) { - /// GET is used to request data from a specified resource. - RLMHTTPMethodGET = 0, - /// POST is used to send data to a server to create/update a resource. - RLMHTTPMethodPOST = 1, - /// PATCH is used to send data to a server to update a resource. - RLMHTTPMethodPATCH = 2, - /// PUT is used to send data to a server to create/update a resource. - RLMHTTPMethodPUT = 3, - /// The DELETE method deletes the specified resource. - RLMHTTPMethodDELETE = 4 -}; - -/// An HTTP request that can be made to an arbitrary server. -@interface RLMRequest : NSObject - -/// The HTTP method of this request. -@property (nonatomic, assign) RLMHTTPMethod method; - -/// The URL to which this request will be made. -@property (nonatomic, strong) NSString *url; - -/// The number of milliseconds that the underlying transport should spend on an -/// HTTP round trip before failing with an error. -@property (nonatomic, assign) NSTimeInterval timeout; - -/// The HTTP headers of this request. -@property (nonatomic, strong) NSDictionary* headers; - -/// The body of the request. -@property (nonatomic, strong) NSString* body; - -@end - -/// The contents of an HTTP response. -@interface RLMResponse : NSObject - -/// The status code of the HTTP response. -@property (nonatomic, assign) NSInteger httpStatusCode; - -/// A custom status code provided by the SDK. -@property (nonatomic, assign) NSInteger customStatusCode; - -/// The headers of the HTTP response. -@property (nonatomic, strong) NSDictionary* headers; - -/// The body of the HTTP response. -@property (nonatomic, strong) NSString *body; - -@end - -/// Delegate which is used for subscribing to changes. -@protocol RLMEventDelegate -/// Invoked when a change event has been received. -/// @param event The change event encoded as NSData -- (void)didReceiveEvent:(NSData *)event; -/// A error has occurred while subscribing to changes. -/// @param error The error that has occurred. -- (void)didReceiveError:(NSError *)error; -/// The stream was opened. -- (void)didOpen; -/// The stream has been closed. -/// @param error The error that has occurred. -- (void)didCloseWithError:(NSError *_Nullable)error; -@end - -/// A block for receiving an `RLMResponse` from the `RLMNetworkTransport`. -RLM_SWIFT_SENDABLE // invoked on a backgroun thread -typedef void(^RLMNetworkTransportCompletionBlock)(RLMResponse *); - -/// Transporting protocol for foreign interfaces. Allows for custom -/// request/response handling. -RLM_SWIFT_SENDABLE // used from multiple threads so must be internally thread-safe -@protocol RLMNetworkTransport - -/** - Sends a request to a given endpoint. - - @param request The request to send. - @param completionBlock A callback invoked on completion of the request. -*/ -- (void)sendRequestToServer:(RLMRequest *)request - completion:(RLMNetworkTransportCompletionBlock)completionBlock; - -/// Starts an event stream request. -/// @param request The RLMRequest to start. -/// @param subscriber The RLMEventDelegate which will subscribe to changes from the server. -- (NSURLSession *)doStreamRequest:(RLMRequest *)request - eventSubscriber:(id)subscriber; - -@end - -/// Transporting protocol for foreign interfaces. Allows for custom -/// request/response handling. -RLM_SWIFT_SENDABLE // is internally thread-safe -@interface RLMNetworkTransport : NSObject - -/** - Sends a request to a given endpoint. - - @param request The request to send. - @param completionBlock A callback invoked on completion of the request. -*/ -- (void)sendRequestToServer:(RLMRequest *) request - completion:(RLMNetworkTransportCompletionBlock)completionBlock; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMObject.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMObject.h deleted file mode 100644 index 9bcfbe310..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMObject.h +++ /dev/null @@ -1,811 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMNotificationToken; -@class RLMObjectSchema; -@class RLMPropertyChange; -@class RLMPropertyDescriptor; -@class RLMRealm; -@class RLMResults; - -/** - `RLMObject` is a base class for model objects representing data stored in Realms. - - Define your model classes by subclassing `RLMObject` and adding properties to be managed. - Then instantiate and use your custom subclasses instead of using the `RLMObject` class directly. - - // Dog.h - @interface Dog : RLMObject - @property NSString *name; - @property BOOL adopted; - @end - - // Dog.m - @implementation Dog - @end //none needed - - ### Supported property types - - - `NSString` - - `NSInteger`, `int`, `long`, `float`, and `double` - - `BOOL` or `bool` - - `NSDate` - - `NSData` - - `NSNumber`, where `X` is one of `RLMInt`, `RLMFloat`, `RLMDouble` or `RLMBool`, for optional number properties - - `RLMObject` subclasses, to model many-to-one relationships. - - `RLMArray`, where `X` is an `RLMObject` subclass, to model many-to-many relationships. - - ### Querying - - You can initiate queries directly via the class methods: `allObjects`, `objectsWhere:`, and `objectsWithPredicate:`. - These methods allow you to easily query a custom subclass for instances of that class in the default Realm. - - To search in a Realm other than the default Realm, use the `allObjectsInRealm:`, `objectsInRealm:where:`, - and `objectsInRealm:withPredicate:` class methods. - - @see `RLMRealm` - - ### Relationships - - See our [Realm Swift Documentation](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/relationships/#relationships) for more details. - - ### Key-Value Observing - - All `RLMObject` properties (including properties you create in subclasses) are - [Key-Value Observing compliant](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/KeyValueObserving/KeyValueObserving.html), - except for `realm` and `objectSchema`. - - Keep the following tips in mind when observing Realm objects: - - 1. Unlike `NSMutableArray` properties, `RLMArray` properties do not require - using the proxy object returned from `-mutableArrayValueForKey:`, or defining - KVC mutation methods on the containing class. You can simply call methods on - the `RLMArray` directly; any changes will be automatically observed by the containing - object. - 2. Unmanaged `RLMObject` instances cannot be added to a Realm while they have any - observed properties. - 3. Modifying managed `RLMObject`s within `-observeValueForKeyPath:ofObject:change:context:` - is not recommended. Properties may change even when the Realm is not in a write - transaction (for example, when `-[RLMRealm refresh]` is called after changes - are made on a different thread), and notifications sent prior to the change - being applied (when `NSKeyValueObservingOptionPrior` is used) may be sent at - times when you *cannot* begin a write transaction. - */ - -@interface RLMObject : RLMObjectBase - -#pragma mark - Creating & Initializing Objects - -/** - Creates an unmanaged instance of a Realm object. - - Call `addObject:` on an `RLMRealm` instance to add an unmanaged object into that Realm. - - @see `[RLMRealm addObject:]` - */ -- (instancetype)init NS_DESIGNATED_INITIALIZER; - - -/** - Creates an unmanaged instance of a Realm object. - - Pass in an `NSArray` or `NSDictionary` instance to set the values of the object's properties. - - Call `addObject:` on an `RLMRealm` instance to add an unmanaged object into that Realm. - - @see `[RLMRealm addObject:]` - */ -- (instancetype)initWithValue:(id)value; - - -/** - Returns the class name for a Realm object subclass. - - @warning Do not override. Realm relies on this method returning the exact class - name. - - @return The class name for the model class. - */ -+ (NSString *)className; - -/** - Creates an instance of a Realm object with a given value, and adds it to the default Realm. - - If nested objects are included in the argument, `createInDefaultRealmWithValue:` will be recursively called - on them. - - The `value` argument can be a key-value coding compliant object, an array or dictionary returned from the methods in - `NSJSONSerialization`, or an array containing one element for each managed property. - - An exception will be thrown if any required properties are not present and those properties - were not defined with default values. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param value The value used to populate the object. - - @see `defaultPropertyValues` - */ -+ (instancetype)createInDefaultRealmWithValue:(id)value; - -/** - Creates an instance of a Realm object with a given value, and adds it to the specified Realm. - - If nested objects are included in the argument, `createInRealm:withValue:` will be recursively called - on them. - - The `value` argument can be a key-value coding compliant object, an array or dictionary returned from the methods in - `NSJSONSerialization`, or an array containing one element for each managed property. - - An exception will be thrown if any required properties are not present and those properties - were not defined with default values. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param realm The Realm which should manage the newly-created object. - @param value The value used to populate the object. - - @see `defaultPropertyValues` - */ -+ (instancetype)createInRealm:(RLMRealm *)realm withValue:(id)value; - -/** - Creates or updates a Realm object within the default Realm. - - This method may only be called on Realm object types with a primary key defined. If there is already - an object with the same primary key value in the default Realm, its values are updated and the object - is returned. Otherwise, this method creates and populates a new instance of the object in the default Realm. - - If nested objects are included in the argument, `createOrUpdateInDefaultRealmWithValue:` will be - recursively called on them if they have primary keys, `createInDefaultRealmWithValue:` if they do not. - - The `value` argument is used to populate the object. It can be a Realm object, a key-value coding - compliant object, an array or dictionary returned from the methods in `NSJSONSerialization`, or an - array containing one element for each managed property. - - If the object is being created, an exception will be thrown if any required properties - are not present and those properties were not defined with default values. - - If the `value` argument is a Realm object already managed by the default Realm, the - argument's type is the same as the receiver, and the objects have identical values for - their managed properties, this method does nothing. - - If the object is being updated, each property defined in its schema will be set by copying from - `value` using key-value coding. If the `value` argument does not respond to `valueForKey:` for a - given property name (or getter name, if defined), that value will remain untouched. - Nullable properties on the object can be set to nil by using `NSNull` as the updated value. - Each property is set even if the existing value is the same as the new value being set, and - notifications will report them all being changed. See `createOrUpdateModifiedInDefaultRealmWithValue:` - for a version of this function which only sets the values which have changed. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param value The value used to populate the object. - - @see `defaultPropertyValues`, `primaryKey` - */ -+ (instancetype)createOrUpdateInDefaultRealmWithValue:(id)value; - -/** - Creates or updates a Realm object within the default Realm. - - This method may only be called on Realm object types with a primary key defined. If there is already - an object with the same primary key value in the default Realm, its values are updated and the object - is returned. Otherwise, this method creates and populates a new instance of the object in the default Realm. - - If nested objects are included in the argument, `createOrUpdateModifiedInDefaultRealmWithValue:` will be - recursively called on them if they have primary keys, `createInDefaultRealmWithValue:` if they do not. - - The `value` argument is used to populate the object. It can be a Realm object, a key-value coding - compliant object, an array or dictionary returned from the methods in `NSJSONSerialization`, or an - array containing one element for each managed property. - - If the object is being created, an exception will be thrown if any required properties - are not present and those properties were not defined with default values. - - If the `value` argument is a Realm object already managed by the default Realm, the - argument's type is the same as the receiver, and the objects have identical values for - their managed properties, this method does nothing. - - If the object is being updated, each property defined in its schema will be set by copying from - `value` using key-value coding. If the `value` argument does not respond to `valueForKey:` for a - given property name (or getter name, if defined), that value will remain untouched. - Nullable properties on the object can be set to nil by using `NSNull` as the updated value. - Unlike `createOrUpdateInDefaultRealmWithValue:`, only properties which have changed in value are - set, and any change notifications produced by this call will report only which properies have - actually changed. - - Checking which properties have changed imposes a small amount of overhead, and so this method - may be slower when all or nearly all of the properties being set have changed. If most or all - of the properties being set have not changed, this method will be much faster than unconditionally - setting all of them, and will also reduce how much data has to be written to the Realm, saving - both i/o time and disk space. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param value The value used to populate the object. - - @see `defaultPropertyValues`, `primaryKey` - */ -+ (instancetype)createOrUpdateModifiedInDefaultRealmWithValue:(id)value; - -/** - Creates or updates an Realm object within a specified Realm. - - This method may only be called on Realm object types with a primary key defined. If there is already - an object with the same primary key value in the given Realm, its values are updated and the object - is returned. Otherwise this method creates and populates a new instance of this object in the given Realm. - - If nested objects are included in the argument, `createOrUpdateInRealm:withValue:` will be - recursively called on them if they have primary keys, `createInRealm:withValue:` if they do not. - - The `value` argument is used to populate the object. It can be a Realm object, a key-value coding - compliant object, an array or dictionary returned from the methods in `NSJSONSerialization`, or an - array containing one element for each managed property. - - If the object is being created, an exception will be thrown if any required properties - are not present and those properties were not defined with default values. - - If the `value` argument is a Realm object already managed by the given Realm, the - argument's type is the same as the receiver, and the objects have identical values for - their managed properties, this method does nothing. - - If the object is being updated, each property defined in its schema will be set by copying from - `value` using key-value coding. If the `value` argument does not respond to `valueForKey:` for a - given property name (or getter name, if defined), that value will remain untouched. - Nullable properties on the object can be set to nil by using `NSNull` as the updated value. - Each property is set even if the existing value is the same as the new value being set, and - notifications will report them all being changed. See `createOrUpdateModifiedInRealm:withValue:` - for a version of this function which only sets the values which have changed. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param realm The Realm which should own the object. - @param value The value used to populate the object. - - @see `defaultPropertyValues`, `primaryKey` - */ -+ (instancetype)createOrUpdateInRealm:(RLMRealm *)realm withValue:(id)value; - -/** - Creates or updates an Realm object within a specified Realm. - - This method may only be called on Realm object types with a primary key defined. If there is already - an object with the same primary key value in the given Realm, its values are updated and the object - is returned. Otherwise this method creates and populates a new instance of this object in the given Realm. - - If nested objects are included in the argument, `createOrUpdateInRealm:withValue:` will be - recursively called on them if they have primary keys, `createInRealm:withValue:` if they do not. - - The `value` argument is used to populate the object. It can be a Realm object, a key-value coding - compliant object, an array or dictionary returned from the methods in `NSJSONSerialization`, or an - array containing one element for each managed property. - - If the object is being created, an exception will be thrown if any required properties - are not present and those properties were not defined with default values. - - If the `value` argument is a Realm object already managed by the given Realm, the - argument's type is the same as the receiver, and the objects have identical values for - their managed properties, this method does nothing. - - If the object is being updated, each property defined in its schema will be set by copying from - `value` using key-value coding. If the `value` argument does not respond to `valueForKey:` for a - given property name (or getter name, if defined), that value will remain untouched. - Nullable properties on the object can be set to nil by using `NSNull` as the updated value. - Unlike `createOrUpdateInRealm:withValue:`, only properties which have changed in value are - set, and any change notifications produced by this call will report only which properies have - actually changed. - - Checking which properties have changed imposes a small amount of overhead, and so this method - may be slower when all or nearly all of the properties being set have changed. If most or all - of the properties being set have not changed, this method will be much faster than unconditionally - setting all of them, and will also reduce how much data has to be written to the Realm, saving - both i/o time and disk space. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param realm The Realm which should own the object. - @param value The value used to populate the object. - - @see `defaultPropertyValues`, `primaryKey` - */ -+ (instancetype)createOrUpdateModifiedInRealm:(RLMRealm *)realm withValue:(id)value; - -#pragma mark - Properties - -/** - The Realm which manages the object, or `nil` if the object is unmanaged. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - The object schema which lists the managed properties for the object. - */ -@property (nonatomic, readonly) RLMObjectSchema *objectSchema; - -/** - Indicates if the object can no longer be accessed because it is now invalid. - - An object can no longer be accessed if the object has been deleted from the Realm that manages it, or - if `invalidate` is called on that Realm. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if this object is frozen. - - @see `-[RLMObject freeze]` - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - - -#pragma mark - Customizing your Objects - -/** - Returns an array of property names for properties which should be indexed. - - Only string, integer, boolean, and `NSDate` properties are supported. - - @return An array of property names. - */ -+ (NSArray *)indexedProperties; - -/** - Override this method to specify the default values to be used for each property. - - @return A dictionary mapping property names to their default values. - */ -+ (nullable NSDictionary *)defaultPropertyValues; - -/** - Override this method to specify the name of a property to be used as the primary key. - - Only properties of types `RLMPropertyTypeString` and `RLMPropertyTypeInt` can be designated as the primary key. - Primary key properties enforce uniqueness for each value whenever the property is set, which incurs minor overhead. - Indexes are created automatically for primary key properties. - - @return The name of the property designated as the primary key. - */ -+ (nullable NSString *)primaryKey; - -/** - Override this method to specify the names of properties to ignore. These properties will not be managed by the Realm - that manages the object. - - @return An array of property names to ignore. - */ -+ (nullable NSArray *)ignoredProperties; - -/** - Override this method to specify the names of properties that are non-optional (i.e. cannot be assigned a `nil` value). - - By default, all properties of a type whose values can be set to `nil` are considered optional properties. - To require that an object in a Realm always store a non-`nil` value for a property, - add the name of the property to the array returned from this method. - - Properties of `RLMObject` type cannot be non-optional. Array and `NSNumber` properties - can be non-optional, but there is no reason to do so: arrays do not support storing nil, and - if you want a non-optional number you should instead use the primitive type. - - @return An array of property names that are required. - */ -+ (NSArray *)requiredProperties; - -/** - Override this method to provide information related to properties containing linking objects. - - Each property of type `RLMLinkingObjects` must have a key in the dictionary returned by this method consisting - of the property name. The corresponding value must be an instance of `RLMPropertyDescriptor` that describes the class - and property that the property is linked to. - - return @{ @"owners": [RLMPropertyDescriptor descriptorWithClass:Owner.class propertyName:@"dogs"] }; - - @return A dictionary mapping property names to `RLMPropertyDescriptor` instances. - */ -+ (NSDictionary *)linkingObjectsProperties; - -#pragma mark - Getting & Querying Objects from the Default Realm - -/** - Returns all objects of this object type from the default Realm. - - @return An `RLMResults` containing all objects of this type in the default Realm. - */ -+ (RLMResults *)allObjects; - -/** - Returns all objects of this object type matching the given predicate from the default Realm. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` containing all objects of this type in the default Realm that match the given predicate. - */ -+ (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -+ (RLMResults<__kindof RLMObject *> *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - - -/** - Returns all objects of this object type matching the given predicate from the default Realm. - - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` containing all objects of this type in the default Realm that match the given predicate. - */ -+ (RLMResults *)objectsWithPredicate:(nullable NSPredicate *)predicate; - -/** - Retrieves the single instance of this object type with the given primary key from the default Realm. - - Returns the object from the default Realm which has the given primary key, or - `nil` if the object does not exist. This is slightly faster than the otherwise - equivalent `[[SubclassName objectsWhere:@"primaryKeyPropertyName = %@", key] firstObject]`. - - This method requires that `primaryKey` be overridden on the receiving subclass. - - @return An object of this object type, or `nil` if an object with the given primary key does not exist. - @see `-primaryKey` - */ -+ (nullable instancetype)objectForPrimaryKey:(nullable id)primaryKey NS_SWIFT_NAME(object(forPrimaryKey:)); - - -#pragma mark - Querying Specific Realms - -/** - Returns all objects of this object type from the specified Realm. - - @param realm The Realm to query. - - @return An `RLMResults` containing all objects of this type in the specified Realm. - */ -+ (RLMResults *)allObjectsInRealm:(RLMRealm *)realm; - -/** - Returns all objects of this object type matching the given predicate from the specified Realm. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - @param realm The Realm to query. - - @return An `RLMResults` containing all objects of this type in the specified Realm that match the given predicate. - */ -+ (RLMResults *)objectsInRealm:(RLMRealm *)realm where:(NSString *)predicateFormat, ...; - -/// :nodoc: -+ (RLMResults<__kindof RLMObject *> *)objectsInRealm:(RLMRealm *)realm where:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all objects of this object type matching the given predicate from the specified Realm. - - @param predicate A predicate to use to filter the elements. - @param realm The Realm to query. - - @return An `RLMResults` containing all objects of this type in the specified Realm that match the given predicate. - */ -+ (RLMResults *)objectsInRealm:(RLMRealm *)realm withPredicate:(nullable NSPredicate *)predicate; - -/** - Retrieves the single instance of this object type with the given primary key from the specified Realm. - - Returns the object from the specified Realm which has the given primary key, or - `nil` if the object does not exist. This is slightly faster than the otherwise - equivalent `[[SubclassName objectsInRealm:realm where:@"primaryKeyPropertyName = %@", key] firstObject]`. - - This method requires that `primaryKey` be overridden on the receiving subclass. - - @return An object of this object type, or `nil` if an object with the given primary key does not exist. - @see `-primaryKey` - */ -+ (nullable instancetype)objectInRealm:(RLMRealm *)realm forPrimaryKey:(nullable id)primaryKey NS_SWIFT_NAME(object(in:forPrimaryKey:)); - -#pragma mark - Notifications - -/** - A callback block for `RLMObject` notifications. - - If the object is deleted from the managing Realm, the block is called with - `deleted` set to `YES` and the other two arguments are `nil`. The block will - never be called again after this. - - If the object is modified, the block will be called with `deleted` set to - `NO`, a `nil` error, and an array of `RLMPropertyChange` objects which - indicate which properties of the objects were modified. - - `error` is always `nil` and will be removed in a future version. - */ -typedef void (^RLMObjectChangeBlock)(BOOL deleted, - NSArray *_Nullable changes, - NSError *_Nullable error); - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When notifications - can't be delivered instantly, multiple notifications may be coalesced into a - single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - - @param block The block to be called whenever a change occurs. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block queue:(dispatch_queue_t)queue; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block keyPaths:(NSArray *)keyPaths queue:(dispatch_queue_t)queue; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block keyPaths:(NSArray *)keyPaths; - - -#pragma mark - Other Instance Methods - -/** - Returns YES if another Realm object instance points to the same object as the receiver in the Realm managing - the receiver. - - For frozen objects and object types with a primary key, `isEqual:` is - overridden to use the same logic as this method (along with a corresponding - implementation for `hash`). Non-frozen objects without primary keys use - pointer identity for `isEqual:` and `hash`. - - @param object The object to compare the receiver to. - - @return Whether the object represents the same object as the receiver. - */ -- (BOOL)isEqualToObject:(RLMObject *)object; - -/** - Returns a frozen (immutable) snapshot of this object. - - The frozen copy is an immutable object which contains the same data as this - object currently contains, but will not update when writes are made to the - containing Realm. Unlike live objects, frozen objects can be accessed from any - thread. - - - warning: Holding onto a frozen object for an extended period while performing write - transaction on the Realm may result in the Realm file growing to large sizes. See - `Realm.Configuration.maximumNumberOfActiveVersions` for more information. - - warning: This method can only be called on a managed object. - */ -- (instancetype)freeze NS_RETURNS_RETAINED; - -/** - Returns a live (mutable) reference of this object. - - This method creates a managed accessor to a live copy of the same frozen object. - Will return self if called on an already live object. - */ -- (instancetype)thaw; - -#pragma mark - Dynamic Accessors - -/// :nodoc: -- (nullable id)objectForKeyedSubscript:(NSString *)key; - -/// :nodoc: -- (void)setObject:(nullable id)obj forKeyedSubscript:(NSString *)key; - -@end - -/** - Information about a specific property which changed in an `RLMObject` change notification. - */ -@interface RLMPropertyChange : NSObject - -/** - The name of the property which changed. - */ -@property (nonatomic, readonly, strong) NSString *name; - -/** - The value of the property before the change occurred. This will always be `nil` - if the change happened on the same thread as the notification and for `RLMArray` - properties. - - For object properties this will give the object which was previously linked to, - but that object will have its new values and not the values it had before the - changes. This means that `previousValue` may be a deleted object, and you will - need to check `invalidated` before accessing any of its properties. - */ -@property (nonatomic, readonly, strong, nullable) id previousValue; - -/** - The value of the property after the change occurred. This will always be `nil` - for `RLMArray` properties. - */ -@property (nonatomic, readonly, strong, nullable) id value; -@end - -#pragma mark - RLMArray Property Declaration - -/** - Properties on `RLMObject`s of type `RLMArray` must have an associated type. A type is associated - with an `RLMArray` property by defining a protocol for the object type that the array should contain. - To define the protocol for an object, you can use the macro RLM_ARRAY_TYPE: - - RLM_ARRAY_TYPE(ObjectType) - ... - @property RLMArray *arrayOfObjectTypes; - */ -#define RLM_ARRAY_TYPE(RLM_OBJECT_SUBCLASS)\ -__attribute__((deprecated("RLM_ARRAY_TYPE has been deprecated. Use RLM_COLLECTION_TYPE instead."))) \ -@protocol RLM_OBJECT_SUBCLASS \ -@end - -/** - Properties on `RLMObject`s of type `RLMSet` / `RLMArray` must have an associated type. A type is associated - with an `RLMSet` / `RLMArray` property by defining a protocol for the object type that the array should contain. - To define the protocol for an object, you can use the macro RLM_COLLECTION_TYPE: - - RLM_COLLECTION_TYPE(ObjectType) - ... - @property RLMSet *setOfObjectTypes; - @property RLMArray *arrayOfObjectTypes; - */ -#define RLM_COLLECTION_TYPE(RLM_OBJECT_SUBCLASS)\ -@protocol RLM_OBJECT_SUBCLASS \ -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMObjectBase.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMObjectBase.h deleted file mode 100644 index 7e9c83c8f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMObjectBase.h +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// :nodoc: -@interface RLMObjectBase : NSObject - -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -- (instancetype)init NS_DESIGNATED_INITIALIZER; - -+ (NSString *)className; - -// Returns whether the class is included in the default set of classes managed by a Realm. -+ (BOOL)shouldIncludeInDefaultSchema; - -+ (nullable NSString *)_realmObjectName; -+ (nullable NSDictionary *)_realmColumnNames; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMObjectBase_Dynamic.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMObjectBase_Dynamic.h deleted file mode 100644 index fb74a5b27..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMObjectBase_Dynamic.h +++ /dev/null @@ -1,82 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectSchema, RLMRealm; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -/** - Returns the Realm that manages the object, if one exists. - - @warning This function is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is - recommended to retrieve the Realm that manages the object via `RLMObject`. - - @param object An `RLMObjectBase` obtained via a Swift `Object` or `RLMObject`. - - @return The Realm which manages this object. Returns `nil `for unmanaged objects. - */ -FOUNDATION_EXTERN RLMRealm * _Nullable RLMObjectBaseRealm(RLMObjectBase * _Nullable object); - -/** - Returns an `RLMObjectSchema` which describes the managed properties of the object. - - @warning This function is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is - recommended to retrieve `objectSchema` via `RLMObject`. - - @param object An `RLMObjectBase` obtained via a Swift `Object` or `RLMObject`. - - @return The object schema which lists the managed properties for the object. - */ -FOUNDATION_EXTERN RLMObjectSchema * _Nullable RLMObjectBaseObjectSchema(RLMObjectBase * _Nullable object); - -/** - Returns the object corresponding to a key value. - - @warning This function is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is - recommended to retrieve key values via `RLMObject`. - - @warning Will throw an `NSUndefinedKeyException` if `key` is not present on the object. - - @param object An `RLMObjectBase` obtained via a Swift `Object` or `RLMObject`. - @param key The name of the property. - - @return The object for the property requested. - */ -FOUNDATION_EXTERN id _Nullable RLMObjectBaseObjectForKeyedSubscript(RLMObjectBase * _Nullable object, NSString *key); - -/** - Sets a value for a key on the object. - - @warning This function is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is - recommended to set key values via `RLMObject`. - - @warning Will throw an `NSUndefinedKeyException` if `key` is not present on the object. - - @param object An `RLMObjectBase` obtained via a Swift `Object` or `RLMObject`. - @param key The name of the property. - @param obj The object to set as the value of the key. - */ -FOUNDATION_EXTERN void RLMObjectBaseSetObjectForKeyedSubscript(RLMObjectBase * _Nullable object, NSString *key, id _Nullable obj); - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMObjectId.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMObjectId.h deleted file mode 100644 index 32ef7b047..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMObjectId.h +++ /dev/null @@ -1,79 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A 12-byte (probably) unique object identifier. - - ObjectIds are similar to a GUID or a UUID, and can be used to uniquely identify - objects without a centralized ID generator. An ObjectID consists of: - - 1. A 4 byte timestamp measuring the creation time of the ObjectId in seconds - since the Unix epoch. - 2. A 5 byte random value - 3. A 3 byte counter, initialized to a random value. - - ObjectIds are intended to be fast to generate. Sorting by an ObjectId field - will typically result in the objects being sorted in creation order. - */ -RLM_SWIFT_SENDABLE // immutable -@interface RLMObjectId : NSObject -/// Creates a new randomly-initialized ObjectId. -+ (nonnull instancetype)objectId NS_SWIFT_NAME(generate()); - -/// Creates a new zero-initialized ObjectId. -- (instancetype)init; - -/// Creates a new ObjectId from the given 24-byte hexadecimal string. -/// -/// Returns `nil` and sets `error` if the string is not 24 characters long or -/// contains any characters other than 0-9a-fA-F. -/// -/// @param string The string to parse. -- (nullable instancetype)initWithString:(NSString *)string - error:(NSError **)error; - -/// Creates a new ObjectId using the given date, machine identifier, process identifier. -/// -/// @param timestamp A timestamp as NSDate. -/// @param machineIdentifier The machine identifier. -/// @param processIdentifier The process identifier. -- (instancetype)initWithTimestamp:(NSDate *)timestamp - machineIdentifier:(int)machineIdentifier - processIdentifier:(int)processIdentifier; - -/// Comparision operator to check if the right hand side is greater than the current value. -- (BOOL)isGreaterThan:(nullable RLMObjectId *)objectId; -/// Comparision operator to check if the right hand side is greater than or equal to the current value. -- (BOOL)isGreaterThanOrEqualTo:(nullable RLMObjectId *)objectId; -/// Comparision operator to check if the right hand side is less than the current value. -- (BOOL)isLessThan:(nullable RLMObjectId *)objectId; -/// Comparision operator to check if the right hand side is less than or equal to the current value. -- (BOOL)isLessThanOrEqualTo:(nullable RLMObjectId *)objectId; - -/// Get the ObjectId as a 24-character hexadecimal string. -@property (nonatomic, readonly) NSString *stringValue; -/// Get the timestamp for the RLMObjectId -@property (nonatomic, readonly) NSDate *timestamp; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMObjectSchema.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMObjectSchema.h deleted file mode 100644 index 9c4666b7c..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMObjectSchema.h +++ /dev/null @@ -1,83 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMProperty; - -/** - This class represents Realm model object schemas. - - When using Realm, `RLMObjectSchema` instances allow performing migrations and - introspecting the database's schema. - - Object schemas map to tables in the core database. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // not actually immutable, but the public API kinda is -@interface RLMObjectSchema : NSObject - -#pragma mark - Properties - -/** - An array of `RLMProperty` instances representing the managed properties of a class described by the schema. - - @see `RLMProperty` - */ -@property (nonatomic, readonly, copy) NSArray *properties; - -/** - The name of the class the schema describes. - */ -@property (nonatomic, readonly) NSString *className; - -/** - The property which serves as the primary key for the class the schema describes, if any. - */ -@property (nonatomic, readonly, nullable) RLMProperty *primaryKeyProperty; - -/** - Whether this object type is embedded. - */ -@property (nonatomic, readonly) BOOL isEmbedded; - -/** - Whether this object is asymmetric. - */ -@property (nonatomic, readonly) BOOL isAsymmetric; - -#pragma mark - Methods - -/** - Retrieves an `RLMProperty` object by the property name. - - @param propertyName The property's name. - - @return An `RLMProperty` object, or `nil` if there is no property with the given name. - */ -- (nullable RLMProperty *)objectForKeyedSubscript:(NSString *)propertyName; - -/** - Returns whether two `RLMObjectSchema` instances are equal. - */ -- (BOOL)isEqualToObjectSchema:(RLMObjectSchema *)objectSchema; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMProperty.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMProperty.h deleted file mode 100644 index 7f2594d3b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMProperty.h +++ /dev/null @@ -1,149 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// :nodoc: -@protocol RLMInt @end -/// :nodoc: -@protocol RLMBool @end -/// :nodoc: -@protocol RLMDouble @end -/// :nodoc: -@protocol RLMFloat @end -/// :nodoc: -@protocol RLMString @end -/// :nodoc: -@protocol RLMDate @end -/// :nodoc: -@protocol RLMData @end -/// :nodoc: -@protocol RLMDecimal128 @end -/// :nodoc: -@protocol RLMObjectId @end -/// :nodoc: -@protocol RLMUUID @end - -/// :nodoc: -@interface NSNumber () -@end - -/** - `RLMProperty` instances represent properties managed by a Realm in the context - of an object schema. Such properties may be persisted to a Realm file or - computed from other data from the Realm. - - When using Realm, `RLMProperty` instances allow performing migrations and - introspecting the database's schema. - - These property instances map to columns in the core database. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // not actually immutable, but the public API kinda is -@interface RLMProperty : NSObject - -#pragma mark - Properties - -/** - The name of the property. - */ -@property (nonatomic, readonly) NSString *name; - -/** - The type of the property. - - @see `RLMPropertyType` - */ -@property (nonatomic, readonly) RLMPropertyType type; - -/** - Indicates whether this property is indexed. - - @see `RLMObject` - */ -@property (nonatomic, readonly) BOOL indexed; - -/** - For `RLMObject` and `RLMCollection` properties, the name of the class of object stored in the property. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - For linking objects properties, the property name of the property the linking objects property is linked to. - */ -@property (nonatomic, readonly, copy, nullable) NSString *linkOriginPropertyName; - -/** - Indicates whether this property is optional. - */ -@property (nonatomic, readonly) BOOL optional; - -/** - Indicates whether this property is an array. - */ -@property (nonatomic, readonly) BOOL array; - -/** - Indicates whether this property is a set. - */ -@property (nonatomic, readonly) BOOL set; - -/** - Indicates whether this property is a dictionary. - */ -@property (nonatomic, readonly) BOOL dictionary; - -/** - Indicates whether this property is an array or set. - */ -@property (nonatomic, readonly) BOOL collection; - -#pragma mark - Methods - -/** - Returns whether a given property object is equal to the receiver. - */ -- (BOOL)isEqualToProperty:(RLMProperty *)property; - -@end - - -/** - An `RLMPropertyDescriptor` instance represents a specific property on a given class. - */ -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMPropertyDescriptor : NSObject - -/** - Creates and returns a property descriptor. - - @param objectClass The class of this property descriptor. - @param propertyName The name of this property descriptor. - */ -+ (instancetype)descriptorWithClass:(Class)objectClass propertyName:(NSString *)propertyName; - -/// The class of the property. -@property (nonatomic, readonly) Class objectClass; - -/// The name of the property. -@property (nonatomic, readonly) NSString *propertyName; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMProviderClient.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMProviderClient.h deleted file mode 100644 index ac649960a..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMProviderClient.h +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMApp; - -/// Base provider client interface. -RLM_SWIFT_SENDABLE -@interface RLMProviderClient : NSObject - -/// The app associated with this provider client. -@property (nonatomic, strong, readonly) RLMApp *app; - -/** - Initialize a provider client with a given app. - @param app The app for this provider client. - */ -- (instancetype)initWithApp:(RLMApp *)app; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMPushClient.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMPushClient.h deleted file mode 100644 index 0628c3ada..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMPushClient.h +++ /dev/null @@ -1,47 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMApp, RLMUser; - -/// A block type used to report an error -RLM_SWIFT_SENDABLE // invoked on a backgroun thread -typedef void(^RLMOptionalErrorBlock)(NSError * _Nullable); - -/// A client which can be used to register devices with the server to receive push notificatons -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMPushClient : NSObject - -/// The push notification service name the device will be registered with on the server -@property (nonatomic, readonly, nonnull) NSString *serviceName; - -/// Request to register device token to the server -- (void)registerDeviceWithToken:(NSString *)token - user:(RLMUser *)user - completion:(RLMOptionalErrorBlock)completion NS_SWIFT_NAME(registerDevice(token:user:completion:)); - -/// Request to deregister a device for a user -- (void)deregisterDeviceForUser:(RLMUser *)user - completion:(RLMOptionalErrorBlock)completion NS_SWIFT_NAME(deregisterDevice(user:completion:)); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMRealm+Sync.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMRealm+Sync.h deleted file mode 100644 index ff20e43c2..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMRealm+Sync.h +++ /dev/null @@ -1,38 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2017 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -@class RLMResults, RLMSyncSession; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -/// -@interface RLMRealm (Sync) - -/** - Get the RLMSyncSession used by this Realm. Will be nil if this is not a - synchronized Realm. -*/ -@property (nonatomic, nullable, readonly) RLMSyncSession *syncSession; - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMRealm.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMRealm.h deleted file mode 100644 index 0935e5301..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMRealm.h +++ /dev/null @@ -1,962 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMRealmConfiguration, RLMRealm, RLMObject, RLMSchema, RLMMigration, RLMNotificationToken, RLMThreadSafeReference, RLMAsyncOpenTask, RLMSyncSubscriptionSet; - -/** - A callback block for opening Realms asynchronously. - - Returns the Realm if the open was successful, or an error otherwise. - */ -typedef void(^RLMAsyncOpenRealmCallback)(RLMRealm * _Nullable realm, NSError * _Nullable error); - -/// The Id of the asynchronous transaction. -typedef unsigned RLMAsyncTransactionId; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - An `RLMRealm` instance (also referred to as "a Realm") represents a Realm - database. - - Realms can either be stored on disk (see `+[RLMRealm realmWithURL:]`) or in - memory (see `RLMRealmConfiguration`). - - `RLMRealm` instances are cached internally, and constructing equivalent `RLMRealm` - objects (for example, by using the same path or identifier) multiple times on a single thread - within a single iteration of the run loop will normally return the same - `RLMRealm` object. - - If you specifically want to ensure an `RLMRealm` instance is - destroyed (for example, if you wish to open a Realm, check some property, and - then possibly delete the Realm file and re-open it), place the code which uses - the Realm within an `@autoreleasepool {}` and ensure you have no other - strong references to it. - - @warning Non-frozen `RLMRealm` instances are thread-confined and cannot be - shared across threads or dispatch queues. Trying to do so will cause an - exception to be thrown. You must call this method on each thread you want to - interact with the Realm on. For dispatch queues, this means that you must call - it in each block which is dispatched, as a queue is not guaranteed to run all - of its blocks on the same thread. - */ - -@interface RLMRealm : NSObject - -#pragma mark - Creating & Initializing a Realm - -/** - Obtains an instance of the default Realm. - - The default Realm is used by the `RLMObject` class methods - which do not take an `RLMRealm` parameter, but is otherwise not special. The - default Realm is persisted as *default.realm* under the *Documents* directory of - your Application on iOS, in your application's *Application Support* - directory on macOS, and in the *Cache* directory on tvOS. - - The default Realm is created using the default `RLMRealmConfiguration`, which - can be changed via `+[RLMRealmConfiguration setDefaultConfiguration:]`. - - @return The default `RLMRealm` instance for the current thread. - */ -+ (instancetype)defaultRealm; - -/** - Obtains an instance of the default Realm bound to the given queue. - - Rather than being confined to the thread they are opened on, queue-bound - RLMRealms are confined to the given queue. They can be accessed from any - thread as long as it is from within a block dispatch to the queue, and - notifications will be delivered to the queue instead of a thread's run loop. - - Realms can only be confined to a serial queue. Queue-confined RLMRealm - instances can be obtained when not on that queue, but attempting to do - anything with that instance without first dispatching to the queue will throw - an incorrect thread exception. - - The default Realm is created using the default `RLMRealmConfiguration`, which - can be changed via `+[RLMRealmConfiguration setDefaultConfiguration:]`. - - @param queue A serial dispatch queue to confine the Realm to. - @return The default `RLMRealm` instance for the given queue. - */ -+ (instancetype)defaultRealmForQueue:(dispatch_queue_t)queue; - -/** - Obtains an `RLMRealm` instance with the given configuration. - - @param configuration A configuration object to use when creating the Realm. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return An `RLMRealm` instance. - */ -+ (nullable instancetype)realmWithConfiguration:(RLMRealmConfiguration *)configuration error:(NSError **)error; - -/** - Obtains an `RLMRealm` instance with the given configuration bound to the given queue. - - Rather than being confined to the thread they are opened on, queue-bound - RLMRealms are confined to the given queue. They can be accessed from any - thread as long as it is from within a block dispatch to the queue, and - notifications will be delivered to the queue instead of a thread's run loop. - - Realms can only be confined to a serial queue. Queue-confined RLMRealm - instances can be obtained when not on that queue, but attempting to do - anything with that instance without first dispatching to the queue will throw - an incorrect thread exception. - - @param configuration A configuration object to use when creating the Realm. - @param queue A serial dispatch queue to confine the Realm to. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return An `RLMRealm` instance. - */ -+ (nullable instancetype)realmWithConfiguration:(RLMRealmConfiguration *)configuration - queue:(nullable dispatch_queue_t)queue - error:(NSError **)error; - -/** - Obtains an `RLMRealm` instance persisted at a specified file URL. - - @param fileURL The local URL of the file the Realm should be saved at. - - @return An `RLMRealm` instance. - */ -+ (instancetype)realmWithURL:(NSURL *)fileURL; - -/** - Asynchronously open a Realm and deliver it to a block on the given queue. - - Opening a Realm asynchronously will perform all work needed to get the Realm to - a usable state (such as running potentially time-consuming migrations) on a - background thread before dispatching to the given queue. In addition, - synchronized Realms wait for all remote content available at the time the - operation began to be downloaded and available locally. - - The Realm passed to the callback function is confined to the callback queue as - if `-[RLMRealm realmWithConfiguration:queue:error]` was used. - - @param configuration A configuration object to use when opening the Realm. - @param callbackQueue The serial dispatch queue on which the callback should be run. - @param callback A callback block. If the Realm was successfully opened, - it will be passed in as an argument. - Otherwise, an `NSError` describing what went wrong will be - passed to the block instead. - */ -+ (RLMAsyncOpenTask *)asyncOpenWithConfiguration:(RLMRealmConfiguration *)configuration - callbackQueue:(dispatch_queue_t)callbackQueue - callback:(RLMAsyncOpenRealmCallback)callback; - -/** - The `RLMSchema` used by the Realm. - */ -@property (nonatomic, readonly) RLMSchema *schema; - -/** - Indicates if the Realm is currently engaged in a write transaction. - - @warning Do not simply check this property and then start a write transaction whenever an object needs to be - created, updated, or removed. Doing so might cause a large number of write transactions to be created, - degrading performance. Instead, always prefer performing multiple updates during a single transaction. - */ -@property (nonatomic, readonly) BOOL inWriteTransaction; - -/** - The `RLMRealmConfiguration` object that was used to create this `RLMRealm` instance. - */ -@property (nonatomic, readonly) RLMRealmConfiguration *configuration; - -/** - Indicates if this Realm contains any objects. - */ -@property (nonatomic, readonly) BOOL isEmpty; - -/** - Indicates if this Realm is frozen. - - @see `-[RLMRealm freeze]` - */ -@property (nonatomic, readonly, getter=isFrozen) BOOL frozen; - -/** - Returns a frozen (immutable) snapshot of this Realm. - - A frozen Realm is an immutable snapshot view of a particular version of a - Realm's data. Unlike normal RLMRealm instances, it does not live-update to - reflect writes made to the Realm, and can be accessed from any thread. Writing - to a frozen Realm is not allowed, and attempting to begin a write transaction - will throw an exception. - - All objects and collections read from a frozen Realm will also be frozen. - */ -- (RLMRealm *)freeze NS_RETURNS_RETAINED; - -/** - Returns a live reference of this Realm. - - All objects and collections read from the returned Realm will no longer be frozen. - This method will return `self` if it is not already frozen. - */ -- (RLMRealm *)thaw; - -#pragma mark - File Management - -/** - Writes a compacted and optionally encrypted copy of the Realm to the given local URL. - - The destination file cannot already exist. - - Note that if this method is called from within a write transaction, the - *current* data is written, not the data from the point when the previous write - transaction was committed. - - @param fileURL Local URL to save the Realm to. - @param key Optional 64-byte encryption key to encrypt the new file with. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return `YES` if the Realm was successfully written to disk, `NO` if an error occurred. - */ -- (BOOL)writeCopyToURL:(NSURL *)fileURL encryptionKey:(nullable NSData *)key error:(NSError **)error; - -/** - Writes a copy of the Realm to a given location specified by a given configuration. - - If the configuration supplied is derived from a `RLMUser` then this Realm will be copied with - sync functionality enabled. - - The destination file cannot already exist. - - @param configuration A Realm Configuration. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return `YES` if the Realm was successfully written to disk, `NO` if an error occurred. - */ -- (BOOL)writeCopyForConfiguration:(RLMRealmConfiguration *)configuration error:(NSError **)error; - -/** - Checks if the Realm file for the given configuration exists locally on disk. - - For non-synchronized, non-in-memory Realms, this is equivalent to - `-[NSFileManager.defaultManager fileExistsAtPath:config.path]`. For - synchronized Realms, it takes care of computing the actual path on disk based - on the server, virtual path, and user as is done when opening the Realm. - - @param config A Realm configuration to check the existence of. - @return YES if the Realm file for the given configuration exists on disk, NO otherwise. - */ -+ (BOOL)fileExistsForConfiguration:(RLMRealmConfiguration *)config; - -/** - Deletes the local Realm file and associated temporary files for the given configuration. - - This deletes the ".realm", ".note" and ".management" files which would be - created by opening the Realm with the given configuration. It does not delete - the ".lock" file (which contains no persisted data and is recreated from - scratch every time the Realm file is opened). - - The Realm must not be currently open on any thread or in another process. If - it is, this will return NO and report the error RLMErrorAlreadyOpen. Attempting to open - the Realm on another thread while the deletion is happening will block (and - then create a new Realm and open that afterwards). - - If the Realm already does not exist this will return `NO` and report the error NSFileNoSuchFileError; - - @param config A Realm configuration identifying the Realm to be deleted. - @return YES if any files were deleted, NO otherwise. - */ -+ (BOOL)deleteFilesForConfiguration:(RLMRealmConfiguration *)config error:(NSError **)error - __attribute__((swift_error(nonnull_error))); - -#pragma mark - Notifications - -/** - The type of a block to run whenever the data within the Realm is modified. - - @see `-[RLMRealm addNotificationBlock:]` - */ -typedef void (^RLMNotificationBlock)(RLMNotification notification, RLMRealm *realm); - -#pragma mark - Receiving Notification when a Realm Changes - -/** - Adds a notification handler for changes in this Realm, and returns a notification token. - - Notification handlers are called after each write transaction is committed, - either on the current thread or other threads. - - Handler blocks are called on the same thread that they were added on, and may - only be added on threads which are currently within a run loop. Unless you are - specifically creating and running a run loop on a background thread, this will - normally only be the main thread. - - The block has the following definition: - - typedef void(^RLMNotificationBlock)(RLMNotification notification, RLMRealm *realm); - - It receives the following parameters: - - - `NSString` \***notification**: The name of the incoming notification. See - `RLMRealmNotification` for information on what - notifications are sent. - - `RLMRealm` \***realm**: The Realm for which this notification occurred. - - @param block A block which is called to process Realm notifications. - - @return A token object which must be retained as long as you wish to continue - receiving change notifications. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMNotificationBlock)block __attribute__((warn_unused_result)); - -#pragma mark - Writing to a Realm - -/** - Begins a write transaction on the Realm. - - Only one write transaction can be open at a time for each Realm file. Write - transactions cannot be nested, and trying to begin a write transaction on a - Realm which is already in a write transaction will throw an exception. Calls to - `beginWriteTransaction` from `RLMRealm` instances for the same Realm file in - other threads or other processes will block until the current write transaction - completes or is cancelled. - - Before beginning the write transaction, `beginWriteTransaction` updates the - `RLMRealm` instance to the latest Realm version, as if `refresh` had been - called, and generates notifications if applicable. This has no effect if the - Realm was already up to date. - - It is rarely a good idea to have write transactions span multiple cycles of - the run loop, but if you do wish to do so you will need to ensure that the - Realm participating in the write transaction is kept alive until the write - transaction is committed. - */ -- (void)beginWriteTransaction; - -/** - Commits all write operations in the current write transaction, and ends the - transaction. - - After saving the changes, all notification blocks registered on this specific - `RLMRealm` instance are invoked synchronously. Notification blocks registered - on other threads or on collections are invoked asynchronously. If you do not - want to receive a specific notification for this write tranaction, see - `commitWriteTransactionWithoutNotifying:error:`. - - This method can fail if there is insufficient disk space available to save the - writes made, or due to unexpected i/o errors. This version of the method throws - an exception when errors occur. Use the version with a `NSError` out parameter - instead if you wish to handle errors. - - @warning This method may only be called during a write transaction. - */ -- (void)commitWriteTransaction NS_SWIFT_UNAVAILABLE(""); - -/** - Commits all write operations in the current write transaction, and ends the - transaction. - - After saving the changes, all notification blocks registered on this specific - `RLMRealm` instance are invoked synchronously. Notification blocks registered - on other threads or on collections are invoked asynchronously. If you do not - want to receive a specific notification for this write tranaction, see - `commitWriteTransactionWithoutNotifying:error:`. - - This method can fail if there is insufficient disk space available to save the - writes made, or due to unexpected i/o errors. - - @warning This method may only be called during a write transaction. - - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return Whether the transaction succeeded. - */ -- (BOOL)commitWriteTransaction:(NSError **)error; - -/** - Commits all write operations in the current write transaction, without - notifying specific notification blocks of the changes. - - After saving the changes, all notification blocks registered on this specific - `RLMRealm` instance are invoked synchronously. Notification blocks registered - on other threads or on collections are scheduled to be invoked asynchronously. - - You can skip notifiying specific notification blocks about the changes made - in this write transaction by passing in their associated notification tokens. - This is primarily useful when the write transaction is saving changes already - made in the UI and you do not want to have the notification block attempt to - re-apply the same changes. - - The tokens passed to this method must be for notifications for this specific - `RLMRealm` instance. Notifications for different threads cannot be skipped - using this method. - - This method can fail if there is insufficient disk space available to save the - writes made, or due to unexpected i/o errors. - - @warning This method may only be called during a write transaction. - - @param tokens An array of notification tokens which were returned from adding - callbacks which you do not want to be notified for the changes - made in this write transaction. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return Whether the transaction succeeded. - */ -- (BOOL)commitWriteTransactionWithoutNotifying:(NSArray *)tokens error:(NSError **)error; - -/** - Reverts all writes made during the current write transaction and ends the transaction. - - This rolls back all objects in the Realm to the state they were in at the - beginning of the write transaction, and then ends the transaction. - - This restores the data for deleted objects, but does not revive invalidated - object instances. Any `RLMObject`s which were added to the Realm will be - invalidated rather than becoming unmanaged. - Given the following code: - - ObjectType *oldObject = [[ObjectType objectsWhere:@"..."] firstObject]; - ObjectType *newObject = [[ObjectType alloc] init]; - - [realm beginWriteTransaction]; - [realm addObject:newObject]; - [realm deleteObject:oldObject]; - [realm cancelWriteTransaction]; - - Both `oldObject` and `newObject` will return `YES` for `isInvalidated`, - but re-running the query which provided `oldObject` will once again return - the valid object. - - KVO observers on any objects which were modified during the transaction will - be notified about the change back to their initial values, but no other - notifications are produced by a cancelled write transaction. - - @warning This method may only be called during a write transaction. - */ -- (void)cancelWriteTransaction; - -/** - Performs actions contained within the given block inside a write transaction. - - @see `[RLMRealm transactionWithoutNotifying:block:error:]` - */ -- (void)transactionWithBlock:(__attribute__((noescape)) void(^)(void))block NS_SWIFT_UNAVAILABLE(""); - -/** - Performs actions contained within the given block inside a write transaction. - - @see `[RLMRealm transactionWithoutNotifying:block:error:]` - */ -- (BOOL)transactionWithBlock:(__attribute__((noescape)) void(^)(void))block error:(NSError **)error; - -/** - Performs actions contained within the given block inside a write transaction. - - @see `[RLMRealm transactionWithoutNotifying:block:error:]` - */ -- (void)transactionWithoutNotifying:(NSArray *)tokens block:(__attribute__((noescape)) void(^)(void))block; - -/** - Performs actions contained within the given block inside a write transaction. - - Write transactions cannot be nested, and trying to execute a write transaction - on a Realm which is already participating in a write transaction will throw an - exception. Calls to `transactionWithBlock:` from `RLMRealm` instances in other - threads will block until the current write transaction completes. - - Before beginning the write transaction, `transactionWithBlock:` updates the - `RLMRealm` instance to the latest Realm version, as if `refresh` had been called, and - generates notifications if applicable. This has no effect if the Realm - was already up to date. - - You can skip notifiying specific notification blocks about the changes made - in this write transaction by passing in their associated notification tokens. - This is primarily useful when the write transaction is saving changes already - made in the UI and you do not want to have the notification block attempt to - re-apply the same changes. - - The tokens passed to this method must be for notifications for this specific - `RLMRealm` instance. Notifications for different threads cannot be skipped - using this method. - - @param tokens An array of notification tokens which were returned from adding - callbacks which you do not want to be notified for the changes - made in this write transaction. - @param block The block containing actions to perform. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return Whether the transaction succeeded. - */ -- (BOOL)transactionWithoutNotifying:(NSArray *)tokens block:(__attribute__((noescape)) void(^)(void))block error:(NSError **)error; - -/** - Indicates if the Realm is currently performing async write operations. - This becomes YES following a call to `beginAsyncWriteTransaction`, - `commitAsyncWriteTransaction`, or `asyncTransactionWithBlock:`, and remains so - until all scheduled async write work has completed. - - @warning If this is `YES`, closing or invalidating the Realm will block until scheduled work has completed. - */ -@property (nonatomic, readonly) BOOL isPerformingAsynchronousWriteOperations; - -/** - Begins an asynchronous write transaction. - This function asynchronously begins a write transaction on a background - thread, and then invokes the block on the original thread or queue once the - transaction has begun. Unlike `beginWriteTransaction`, this does not block the - calling thread if another thread is current inside a write transaction, and - will always return immediately. - Multiple calls to this function (or the other functions which perform - asynchronous write transactions) will queue the blocks to be called in the - same order as they were queued. This includes calls from inside a write - transaction block, which unlike with synchronous transactions are allowed. - - @param block The block containing actions to perform inside the write transaction. - `block` should end by calling `commitAsyncWriteTransaction`, - `commitWriteTransaction` or `cancelWriteTransaction`. - Returning without one of these calls is equivalent to calling `cancelWriteTransaction`. - - @return An id identifying the asynchronous transaction which can be passed to - `cancelAsyncTransaction:` prior to the block being called to cancel - the pending invocation of the block. - */ -- (RLMAsyncTransactionId)beginAsyncWriteTransaction:(void(^)(void))block; - -/** - Asynchronously commits a write transaction. - The call returns immediately allowing the caller to proceed while the I/O is - performed on a dedicated background thread. This can be used regardless of if - the write transaction was begun with `beginWriteTransaction` or - `beginAsyncWriteTransaction`. - - @param completionBlock A block which will be called on the source thread or - queue once the commit has either completed or failed - with an error. - - @param allowGrouping If `YES`, multiple sequential calls to - `commitAsyncWriteTransaction:` may be batched together - and persisted to stable storage in one group. This - improves write performance, particularly when the - individual transactions being batched are small. In the - event of a crash or power failure, either all of the - grouped transactions will be lost or none will, rather - than the usual guarantee that data has been persisted as - soon as a call to commit has returned. - - @return An id identifying the asynchronous transaction commit can be passed to - `cancelAsyncTransaction:` prior to the completion block being called - to cancel the pending invocation of the block. Note that this does - *not* cancel the commit itself. -*/ -- (RLMAsyncTransactionId)commitAsyncWriteTransaction:(nullable void(^)(NSError *_Nullable))completionBlock - allowGrouping:(BOOL)allowGrouping; - -/** - Asynchronously commits a write transaction. - The call returns immediately allowing the caller to proceed while the I/O is - performed on a dedicated background thread. This can be used regardless of if - the write transaction was begun with `beginWriteTransaction` or - `beginAsyncWriteTransaction`. - - @param completionBlock A block which will be called on the source thread or - queue once the commit has either completed or failed - with an error. - - @return An id identifying the asynchronous transaction commit can be passed to - `cancelAsyncTransaction:` prior to the completion block being called - to cancel the pending invocation of the block. Note that this does - *not* cancel the commit itself. -*/ -- (RLMAsyncTransactionId)commitAsyncWriteTransaction:(void(^)(NSError *_Nullable))completionBlock; - -/** - Asynchronously commits a write transaction. - The call returns immediately allowing the caller to proceed while the I/O is - performed on a dedicated background thread. This can be used regardless of if - the write transaction was begun with `beginWriteTransaction` or - `beginAsyncWriteTransaction`. - - @return An id identifying the asynchronous transaction commit can be passed to - `cancelAsyncTransaction:` prior to the completion block being called - to cancel the pending invocation of the block. Note that this does - *not* cancel the commit itself. -*/ -- (RLMAsyncTransactionId)commitAsyncWriteTransaction; - -/** - Cancels a queued block for an asynchronous transaction. - This can cancel a block passed to either an asynchronous begin or an - asynchronous commit. Canceling a begin cancels that transaction entirely, - while canceling a commit merely cancels the invocation of the completion - callback, and the commit will still happen. - Transactions can only be canceled before the block is invoked, and calling - `cancelAsyncTransaction:` from within the block is a no-op. - - @param asyncTransactionId A transaction id from either `beginAsyncWriteTransaction:` or `commitAsyncWriteTransaction:`. -*/ -- (void)cancelAsyncTransaction:(RLMAsyncTransactionId)asyncTransactionId; - -/** - Asynchronously performs actions contained within the given block inside a - write transaction. - The write transaction is begun asynchronously as if calling - `beginAsyncWriteTransaction:`, and by default the transaction is commited - asynchronously after the block completes. You can also explicitly call - `commitWriteTransaction` or `cancelWriteTransaction` from within the block to - synchronously commit or cancel the write transaction. - - @param block The block containing actions to perform. - - @param completionBlock A block which will be called on the source thread or - queue once the commit has either completed or failed - with an error. - - @return An id identifying the asynchronous transaction which can be passed to - `cancelAsyncTransaction:` prior to the block being called to cancel - the pending invocation of the block. -*/ -- (RLMAsyncTransactionId)asyncTransactionWithBlock:(void(^)(void))block onComplete:(nullable void(^)(NSError *))completionBlock; - -/** - Asynchronously performs actions contained within the given block inside a - write transaction. - The write transaction is begun asynchronously as if calling - `beginAsyncWriteTransaction:`, and by default the transaction is commited - asynchronously after the block completes. You can also explicitly call - `commitWriteTransaction` or `cancelWriteTransaction` from within the block to - synchronously commit or cancel the write transaction. - - @param block The block containing actions to perform. - - @return An id identifying the asynchronous transaction which can be passed to - `cancelAsyncTransaction:` prior to the block being called to cancel - the pending invocation of the block. -*/ -- (RLMAsyncTransactionId)asyncTransactionWithBlock:(void(^)(void))block; - -/** - Updates the Realm and outstanding objects managed by the Realm to point to the - most recent data. - - If the version of the Realm is actually changed, Realm and collection - notifications will be sent to reflect the changes. This may take some time, as - collection notifications are prepared on a background thread. As a result, - calling this method on the main thread is not advisable. - - @return Whether there were any updates for the Realm. Note that `YES` may be - returned even if no data actually changed. - */ -- (BOOL)refresh; - -/** - Set this property to `YES` to automatically update this Realm when changes - happen in other threads. - - If set to `YES` (the default), changes made on other threads will be reflected - in this Realm on the next cycle of the run loop after the changes are - committed. If set to `NO`, you must manually call `-refresh` on the Realm to - update it to get the latest data. - - Note that by default, background threads do not have an active run loop and you - will need to manually call `-refresh` in order to update to the latest version, - even if `autorefresh` is set to `YES`. - - Even with this property enabled, you can still call `-refresh` at any time to - update the Realm before the automatic refresh would occur. - - Write transactions will still always advance a Realm to the latest version and - produce local notifications on commit even if autorefresh is disabled. - - Disabling `autorefresh` on a Realm without any strong references to it will not - have any effect, and `autorefresh` will revert back to `YES` the next time the - Realm is created. This is normally irrelevant as it means that there is nothing - to refresh (as managed `RLMObject`s, `RLMArray`s, and `RLMResults` have strong - references to the Realm that manages them), but it means that setting - `RLMRealm.defaultRealm.autorefresh = NO` in - `application:didFinishLaunchingWithOptions:` and only later storing Realm - objects will not work. - - Defaults to `YES`. - */ -@property (nonatomic) BOOL autorefresh; - -/** - Invalidates all `RLMObject`s, `RLMResults`, `RLMLinkingObjects`, and `RLMArray`s managed by the Realm. - - A Realm holds a read lock on the version of the data accessed by it, so - that changes made to the Realm on different threads do not modify or delete the - data seen by this Realm. Calling this method releases the read lock, - allowing the space used on disk to be reused by later write transactions rather - than growing the file. This method should be called before performing long - blocking operations on a background thread on which you previously read data - from the Realm which you no longer need. - - All `RLMObject`, `RLMResults` and `RLMArray` instances obtained from this - `RLMRealm` instance on the current thread are invalidated. `RLMObject`s and `RLMArray`s - cannot be used. `RLMResults` will become empty. The Realm itself remains valid, - and a new read transaction is implicitly begun the next time data is read from the Realm. - - Calling this method multiple times in a row without reading any data from the - Realm, or before ever reading any data from the Realm, is a no-op. - */ -- (void)invalidate; - -#pragma mark - Accessing Objects - -/** - Returns the same object as the one referenced when the `RLMThreadSafeReference` was first created, - but resolved for the current Realm for this thread. Returns `nil` if this object was deleted after - the reference was created. - - @param reference The thread-safe reference to the thread-confined object to resolve in this Realm. - - @warning A `RLMThreadSafeReference` object must be resolved at most once. - Failing to resolve a `RLMThreadSafeReference` will result in the source version of the - Realm being pinned until the reference is deallocated. - An exception will be thrown if a reference is resolved more than once. - - @warning Cannot call within a write transaction. - - @note Will refresh this Realm if the source Realm was at a later version than this one. - - @see `+[RLMThreadSafeReference referenceWithThreadConfined:]` - */ -- (nullable id)resolveThreadSafeReference:(RLMThreadSafeReference *)reference -NS_REFINED_FOR_SWIFT; - -#pragma mark - Adding and Removing Objects from a Realm - -/** - Adds an object to the Realm. - - Once added, this object is considered to be managed by the Realm. It can be retrieved - using the `objectsWhere:` selectors on `RLMRealm` and on subclasses of `RLMObject`. - - When added, all child relationships referenced by this object will also be added to - the Realm if they are not already in it. - - If the object or any related objects are already being managed by a different Realm - an exception will be thrown. Use `-[RLMObject createInRealm:withObject:]` to insert a copy of a managed object - into a different Realm. - - The object to be added must be valid and cannot have been previously deleted - from a Realm (i.e. `isInvalidated` must be `NO`). - - @warning This method may only be called during a write transaction. - - @param object The object to be added to this Realm. - */ -- (void)addObject:(RLMObject *)object; - -/** - Adds all the objects in a collection to the Realm. - - This is the equivalent of calling `addObject:` for every object in a collection. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable collection such as `NSArray`, `RLMArray`, or `RLMResults`, - containing Realm objects to be added to the Realm. - - @see `addObject:` - */ -- (void)addObjects:(id)objects; - -/** - Adds or updates an existing object into the Realm. - - The object provided must have a designated primary key. If no objects exist in the Realm - with the same primary key value, the object is inserted. Otherwise, the existing object is - updated with any changed values. - - As with `addObject:`, the object cannot already be managed by a different - Realm. Use `-[RLMObject createOrUpdateInRealm:withValue:]` to copy values to - a different Realm. - - If there is a property or KVC value on `object` whose value is nil, and it corresponds - to a nullable property on an existing object being updated, that nullable property will - be set to nil. - - @warning This method may only be called during a write transaction. - - @param object The object to be added or updated. - */ -- (void)addOrUpdateObject:(RLMObject *)object; - -/** - Adds or updates all the objects in a collection into the Realm. - - This is the equivalent of calling `addOrUpdateObject:` for every object in a collection. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable collection such as `NSArray`, `RLMArray`, or `RLMResults`, - containing Realm objects to be added to or updated within the Realm. - - @see `addOrUpdateObject:` - */ -- (void)addOrUpdateObjects:(id)objects; - -/** - Deletes an object from the Realm. Once the object is deleted it is considered invalidated. - - @warning This method may only be called during a write transaction. - - @param object The object to be deleted. - */ -- (void)deleteObject:(RLMObject *)object; - -/** - Deletes one or more objects from the Realm. - - This is the equivalent of calling `deleteObject:` for every object in a collection. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable collection such as `NSArray`, `RLMArray`, or `RLMResults`, - containing objects to be deleted from the Realm. - - @see `deleteObject:` - */ -- (void)deleteObjects:(id)objects; - -/** - Deletes all objects from the Realm. - - @warning This method may only be called during a write transaction. - - @see `deleteObject:` - */ -- (void)deleteAllObjects; - -#pragma mark - Sync Subscriptions - -/** - Represents the active subscriptions for this realm, which can be used to add/remove/update - and search flexible sync subscriptions. - Getting the subscriptions from a local or partition-based configured realm will thrown an exception. - - @warning This feature is currently in beta and its API is subject to change. - */ -@property (nonatomic, readonly, nonnull) RLMSyncSubscriptionSet *subscriptions; - - -#pragma mark - Migrations - -/** - The type of a migration block used to migrate a Realm. - - @param migration A `RLMMigration` object used to perform the migration. The - migration object allows you to enumerate and alter any - existing objects which require migration. - - @param oldSchemaVersion The schema version of the Realm being migrated. - */ -RLM_SWIFT_SENDABLE -typedef void (^RLMMigrationBlock)(RLMMigration *migration, uint64_t oldSchemaVersion); - -/** - Returns the schema version for a Realm at a given local URL. - - @param fileURL Local URL to a Realm file. - @param key 64-byte key used to encrypt the file, or `nil` if it is unencrypted. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return The version of the Realm at `fileURL`, or `RLMNotVersioned` if the version cannot be read. - */ -+ (uint64_t)schemaVersionAtURL:(NSURL *)fileURL encryptionKey:(nullable NSData *)key - error:(NSError **)error -NS_REFINED_FOR_SWIFT; - -/** - Performs the given Realm configuration's migration block on a Realm at the given path. - - This method is called automatically when opening a Realm for the first time and does - not need to be called explicitly. You can choose to call this method to control - exactly when and how migrations are performed. - - @param configuration The Realm configuration used to open and migrate the Realm. - @return The error that occurred while applying the migration, if any. - - @see RLMMigration - */ -+ (BOOL)performMigrationForConfiguration:(RLMRealmConfiguration *)configuration error:(NSError **)error; - -#pragma mark - Unavailable Methods - -/** - RLMRealm instances are cached internally by Realm and cannot be created directly. - - Use `+[RLMRealm defaultRealm]`, `+[RLMRealm realmWithConfiguration:error:]` or - `+[RLMRealm realmWithURL]` to obtain a reference to an RLMRealm. - */ -- (instancetype)init __attribute__((unavailable("Use +defaultRealm, +realmWithConfiguration: or +realmWithURL:."))); - -/** - RLMRealm instances are cached internally by Realm and cannot be created directly. - - Use `+[RLMRealm defaultRealm]`, `+[RLMRealm realmWithConfiguration:error:]` or - `+[RLMRealm realmWithURL]` to obtain a reference to an RLMRealm. - */ -+ (instancetype)new __attribute__((unavailable("Use +defaultRealm, +realmWithConfiguration: or +realmWithURL:."))); - -/// :nodoc: -- (void)addOrUpdateObjectsFromArray:(id)array __attribute__((unavailable("Renamed to -addOrUpdateObjects:."))); - -@end - -// MARK: - RLMNotificationToken - -/** - A token which is returned from methods which subscribe to changes to a Realm. - - Change subscriptions in Realm return an `RLMNotificationToken` instance, - which can be used to unsubscribe from the changes. You must store a strong - reference to the token for as long as you want to continue to receive notifications. - When you wish to stop, call the `-invalidate` method. Notifications are also stopped if - the token is deallocated. - */ -RLM_SWIFT_SENDABLE // is internally thread-safe -@interface RLMNotificationToken : NSObject -/// Stops notifications for the change subscription that returned this token. -/// -/// @return True if the token was previously valid, and false if it was already invalidated. -- (bool)invalidate; - -/// Stops notifications for the change subscription that returned this token. -- (void)stop __attribute__((unavailable("Renamed to -invalidate."))) NS_REFINED_FOR_SWIFT; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMRealmConfiguration.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMRealmConfiguration.h deleted file mode 100644 index d09e5c215..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMRealmConfiguration.h +++ /dev/null @@ -1,197 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2015 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMEventConfiguration, RLMSyncConfiguration; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A block called when opening a Realm for the first time during the life - of a process to determine if it should be compacted before being returned - to the user. It is passed the total file size (data + free space) and the total - bytes used by data in the file. - - Return `YES` to indicate that an attempt to compact the file should be made. - The compaction will be skipped if another process is accessing it. - */ -RLM_SWIFT_SENDABLE -typedef BOOL (^RLMShouldCompactOnLaunchBlock)(NSUInteger totalBytes, NSUInteger bytesUsed); - -/** - A block which receives a subscription set instance, that can be used to add an initial set of subscriptions which will be executed - when the Realm is first opened. - */ -RLM_SWIFT_SENDABLE -typedef void(^RLMFlexibleSyncInitialSubscriptionsBlock)(RLMSyncSubscriptionSet * _Nonnull subscriptions); - -/** - An `RLMRealmConfiguration` instance describes the different options used to - create an instance of a Realm. - - `RLMRealmConfiguration` instances are just plain `NSObject`s. Unlike `RLMRealm`s - and `RLMObject`s, they can be freely shared between threads as long as you do not - mutate them. - - Creating configuration objects for class subsets (by setting the - `objectClasses` property) can be expensive. Because of this, you will normally want to - cache and reuse a single configuration object for each distinct configuration rather than - creating a new object each time you open a Realm. - */ -@interface RLMRealmConfiguration : NSObject - -#pragma mark - Default Configuration - -/** - Returns the default configuration used to create Realms when no other - configuration is explicitly specified (i.e. `+[RLMRealm defaultRealm]`). - - @return The default Realm configuration. - */ -+ (instancetype)defaultConfiguration; - -/** - Sets the default configuration to the given `RLMRealmConfiguration`. - - @param configuration The new default Realm configuration. - */ -+ (void)setDefaultConfiguration:(RLMRealmConfiguration *)configuration; - -#pragma mark - Properties - -/// The local URL of the Realm file. Mutually exclusive with `inMemoryIdentifier`; -/// setting one of the two properties will automatically nil out the other. -@property (nonatomic, copy, nullable) NSURL *fileURL; - -/// A string used to identify a particular in-memory Realm. Mutually exclusive with `fileURL`, -/// `seedFilePath`and `syncConfiguration`; -/// setting any one of the three properties will automatically nil out the other two. -@property (nonatomic, copy, nullable) NSString *inMemoryIdentifier; - -/// A 64-byte key to use to encrypt the data, or `nil` if encryption is not enabled. -@property (nonatomic, copy, nullable) NSData *encryptionKey; - -/// Whether to open the Realm in read-only mode. -/// -/// For non-synchronized Realms, this is required to be able to open Realm -/// files which are not writeable or are in a directory which is not writeable. -/// This should only be used on files which will not be modified by anyone -/// while they are open, and not just to get a read-only view of a file which -/// may be written to by another thread or process. Opening in read-only mode -/// requires disabling Realm's reader/writer coordination, so committing a -/// write transaction from another process will result in crashes. -/// -/// Syncronized Realms must always be writeable (as otherwise no -/// synchronization could happen), and this instead merely disallows performing -/// write transactions on the Realm. In addition, it will skip some automatic -/// writes made to the Realm, such as to initialize the Realm's schema. Setting -/// `readOnly = YES` is not strictly required for Realms which the sync user -/// does not have write access to, but is highly recommended as it will improve -/// error reporting and catch some errors earlier. -/// -/// Realms using query-based sync cannot be opened in read-only mode. -@property (nonatomic) BOOL readOnly; - -/// The current schema version. -@property (nonatomic) uint64_t schemaVersion; - -/// The block which migrates the Realm to the current version. -@property (nonatomic, copy, nullable) RLMMigrationBlock migrationBlock; - -/** - Whether to recreate the Realm file with the provided schema if a migration is required. - This is the case when the stored schema differs from the provided schema or - the stored schema version differs from the version on this configuration. - Setting this property to `YES` deletes the file if a migration would otherwise be required or executed. - - @note Setting this property to `YES` doesn't disable file format migrations. - */ -@property (nonatomic) BOOL deleteRealmIfMigrationNeeded; - -/** - A block called when opening a Realm for the first time during the life - of a process to determine if it should be compacted before being returned - to the user. It is passed the total file size (data + free space) and the total - bytes used by data in the file. - - Return `YES` to indicate that an attempt to compact the file should be made. - The compaction will be skipped if another process is accessing it. - */ -@property (nonatomic, copy, nullable) RLMShouldCompactOnLaunchBlock shouldCompactOnLaunch; - -/// The classes managed by the Realm. -@property (nonatomic, copy, nullable) NSArray *objectClasses; - -/** - The maximum number of live versions in the Realm file before an exception will - be thrown when attempting to start a write transaction. - - Realm provides MVCC snapshot isolation, meaning that writes on one thread do - not overwrite data being read on another thread, and instead write a new copy - of that data. When a Realm refreshes it updates to the latest version of the - data and releases the old versions, allowing them to be overwritten by - subsequent write transactions. - - Under normal circumstances this is not a problem, but if the number of active - versions grow too large, it will have a negative effect on the filesize on - disk. This can happen when performing writes on many different threads at - once, when holding on to frozen objects for an extended time, or when - performing long operations on background threads which do not allow the Realm - to refresh. - - Setting this property to a non-zero value makes it so that exceeding the set - number of versions will instead throw an exception. This can be used with a - low value during development to help identify places that may be problematic, - or in production use to cause the app to crash rather than produce a Realm - file which is too large to be opened. - - */ -@property (nonatomic) NSUInteger maximumNumberOfActiveVersions; - -/** - When opening the Realm for the first time, instead of creating an empty file, - the Realm file will be copied from the provided seed file path and used instead. - This can be used to open a Realm file with pre-populated data. - - If a realm file already exists at the configuration's destination path, the seed file - will not be copied and the already existing realm will be opened instead. - - Note that to use this parameter with a synced Realm configuration - the seed Realm must be appropriately copied to a destination with - `[RLMRealm writeCopyForConfiguration:]` first. - - This option is mutually exclusive with `inMemoryIdentifier`. Setting a `seedFilePath` - will nil out the `inMemoryIdentifier`. - */ -@property (nonatomic, copy, nullable) NSURL *seedFilePath; - -/** - A configuration object representing configuration state for Realms intended - to sync with Atlas Device Sync. - - This property is mutually exclusive with both `inMemoryIdentifier` and `fileURL`; - setting any one of the three properties will automatically nil out the other two. - - @see `RLMSyncConfiguration` - */ -@property (nullable, nonatomic) RLMSyncConfiguration *syncConfiguration; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMRealm_Dynamic.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMRealm_Dynamic.h deleted file mode 100644 index bea162775..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMRealm_Dynamic.h +++ /dev/null @@ -1,118 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import -#import - -@class RLMResults; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMRealm (Dynamic) - -#pragma mark - Getting Objects from a Realm - -/** - Returns all objects of a given type from the Realm. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. The preferred way to get objects of a single class is to use the class - methods on `RLMObject`. - - @param className The name of the `RLMObject` subclass to retrieve on (e.g. `MyClass.className`). - - @return An `RLMResults` containing all objects in the Realm of the given type. - - @see `+[RLMObject allObjects]` - */ -- (RLMResults *)allObjects:(NSString *)className; - -/** - Returns all objects matching the given predicate from the Realm. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. The preferred way to get objects of a single class is to use the class - methods on `RLMObject`. - - @param className The type of objects you are looking for (name of the class). - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` containing results matching the given predicate. - - @see `+[RLMObject objectsWhere:]` - */ -- (RLMResults *)objects:(NSString *)className where:(NSString *)predicateFormat, ...; - -/** - Returns all objects matching the given predicate from the Realm. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. The preferred way to get objects of a single class is to use the class - methods on `RLMObject`. - - @param className The type of objects you are looking for (name of the class). - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` containing results matching the given predicate. - - @see `+[RLMObject objectsWhere:]` - */ -- (RLMResults *)objects:(NSString *)className withPredicate:(NSPredicate *)predicate; - -/** - Returns the object of the given type with the given primary key from the Realm. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. The preferred way to get an object of a single class is to use the class - methods on `RLMObject`. - - @param className The class name for the object you are looking for. - @param primaryKey The primary key value for the object you are looking for. - - @return An object, or `nil` if an object with the given primary key does not exist. - - @see `+[RLMObject objectForPrimaryKey:]` - */ -- (nullable RLMObject *)objectWithClassName:(NSString *)className forPrimaryKey:(id)primaryKey; - -/** - Creates an `RLMObject` instance of type `className` in the Realm, and populates it using a given object. - - The `value` argument is used to populate the object. It can be a key-value coding compliant object, an array or - dictionary returned from the methods in `NSJSONSerialization`, or an array containing one element for each managed - property. An exception will be thrown if any required properties are not present and those properties were not defined - with default values. - - When passing in an array as the `value` argument, all properties must be present, valid and in the same order as the - properties defined in the model. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is recommended to - use `[RLMObject createInDefaultRealmWithValue:]`. - - @param value The value used to populate the object. - - @return An `RLMObject` instance of type `className`. - */ --(RLMObject *)createObject:(NSString *)className withValue:(id)value; - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMResults.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMResults.h deleted file mode 100644 index 5911e666a..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMResults.h +++ /dev/null @@ -1,567 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObject; - -/** - `RLMResults` is an auto-updating container type in Realm returned from object - queries. It represents the results of the query in the form of a collection of objects. - - `RLMResults` can be queried using the same predicates as `RLMObject` and `RLMArray`, - and you can chain queries to further filter results. - - `RLMResults` always reflect the current state of the Realm on the current thread, - including during write transactions on the current thread. The one exception to - this is when using `for...in` fast enumeration, which will always enumerate - over the objects which matched the query when the enumeration is begun, even if - some of them are deleted or modified to be excluded by the filter during the - enumeration. - - `RLMResults` are lazily evaluated the first time they are accessed; they only - run queries when the result of the query is requested. This means that - chaining several temporary `RLMResults` to sort and filter your data does not - perform any extra work processing the intermediate state. - - Once the results have been evaluated or a notification block has been added, - the results are eagerly kept up-to-date, with the work done to keep them - up-to-date done on a background thread whenever possible. - - `RLMResults` cannot be directly instantiated. - */ -@interface RLMResults : NSObject - -#pragma mark - Properties - -/** - The number of objects in the results collection. - */ -@property (nonatomic, readonly, assign) NSUInteger count; - -/** - The type of the objects in the results collection. - */ -@property (nonatomic, readonly, assign) RLMPropertyType type; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readwrite, getter = isOptional) BOOL optional; - -/** - The class name of the objects contained in the results collection. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages this results collection. - */ -@property (nonatomic, readonly) RLMRealm *realm; - -/** - Indicates if the results collection is no longer valid. - - The results collection becomes invalid if `invalidate` is called on the containing `realm`. - An invalidated results collection can be accessed, but will always be empty. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -#pragma mark - Accessing Objects from an RLMResults - -/** - Returns the object at the index specified. - - @param index The index to look up. - - @return An object of the type contained in the results collection. - */ -- (RLMObjectType)objectAtIndex:(NSUInteger)index; - -/** - Returns an array containing the objects in the results at the indexes specified by a given index set. - `nil` will be returned if the index set contains an index out of the arrays bounds. - - @param indexes The indexes in the results to retrieve objects from. - - @return The objects at the specified indexes. - */ -- (nullable NSArray *)objectsAtIndexes:(NSIndexSet *)indexes; - -/** - Returns the first object in the results collection. - - Returns `nil` if called on an empty results collection. - - @return An object of the type contained in the results collection. - */ -- (nullable RLMObjectType)firstObject; - -/** - Returns the last object in the results collection. - - Returns `nil` if called on an empty results collection. - - @return An object of the type contained in the results collection. - */ -- (nullable RLMObjectType)lastObject; - -#pragma mark - Querying Results - -/** - Returns the index of an object in the results collection. - - Returns `NSNotFound` if the object is not found in the results collection. - - @param object An object (of the same type as returned from the `objectClassName` selector). - */ -- (NSUInteger)indexOfObject:(RLMObjectType)object; - -/** - Returns the index of the first object in the results collection matching the predicate. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return The index of the object, or `NSNotFound` if the object is not found in the results collection. - */ -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns the index of the first object in the results collection matching the predicate. - - @param predicate The predicate with which to filter the objects. - - @return The index of the object, or `NSNotFound` if the object is not found in the results collection. - */ -- (NSUInteger)indexOfObjectWithPredicate:(NSPredicate *)predicate; - -/** - Returns all the objects matching the given predicate in the results collection. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` of objects that match the given predicate. - */ -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all the objects matching the given predicate in the results collection. - - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` of objects that match the given predicate. - */ -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/** - Returns a sorted `RLMResults` from an existing results collection. - - @param keyPath The key path to sort by. - @param ascending The direction to sort in. - - @return An `RLMResults` sorted by the specified key path. - */ -- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a sorted `RLMResults` from an existing results collection. - - @param properties An array of `RLMSortDescriptor`s to sort by. - - @return An `RLMResults` sorted by the specified properties. - */ -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/** - Returns a distinct `RLMResults` from an existing results collection. - - @param keyPaths The key paths used produce distinct results - - @return An `RLMResults` made distinct based on the specified key paths - */ -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -#pragma mark - Notifications - -/** - Registers a block to be called each time the results collection changes. - - The block will be asynchronously called with the initial results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the results collection were added, removed or modified. If a - write transaction did not modify any objects in the results collection, - the block is not called at all. See the `RLMCollectionChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - At the time when the block is called, the `RLMResults` object will be fully - evaluated and up-to-date, and as long as you do not perform a write transaction - on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will - never perform blocking work. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - NSLog(@"dogs.count: %zu", dogs.count); // => 0 - self.token = [results addNotificationBlock:^(RLMResults *dogs, - RLMCollectionChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - - @param block The block to be called whenever a change occurs. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the results collection changes. - - The block will be asynchronously called with the initial results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the results collection were added, removed or modified. If a - write transaction did not modify any objects in the results collection, - the block is not called at all. See the `RLMCollectionChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - At the time when the block is called, the `RLMResults` object will be fully - evaluated and up-to-date, and as long as you do not perform a write transaction - on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will - never perform blocking work. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the results collection changes. - - The block will be asynchronously called with the initial results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the results collection were added, removed or modified. If a - write transaction did not modify any objects in the results collection, - the block is not called at all. See the `RLMCollectionChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - At the time when the block is called, the `RLMResults` object will be fully - evaluated and up-to-date, and as long as you do not perform a write transaction - on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will - never perform blocking work. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the results collection changes. - - The block will be asynchronously called with the initial results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the results collection were added, removed or modified. If a - write transaction did not modify any objects in the results collection, - the block is not called at all. See the `RLMCollectionChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - At the time when the block is called, the `RLMResults` object will be fully - evaluated and up-to-date, and as long as you do not perform a write transaction - on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will - never perform blocking work. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths -__attribute__((warn_unused_result)); -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the objects - represented by the results collection. - - NSNumber *min = [results minOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose minimum value is desired. Only properties of types `int`, `float`, `double`, and - `NSDate` are supported. - - @return The minimum value of the property, or `nil` if the Results are empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects represented by the results collection. - - NSNumber *max = [results maxOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose maximum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The maximum value of the property, or `nil` if the Results are empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of the values of a given property over all the objects represented by the results collection. - - NSNumber *sum = [results sumOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose values should be summed. Only properties of - types `int`, `float`, and `double` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects represented by the results collection. - - NSNumber *average = [results averageOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose average value should be calculated. Only - properties of types `int`, `float`, and `double` are supported. - - @return The average value of the given property, or `nil` if the Results are empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -/// :nodoc: -- (RLMObjectType)objectAtIndexedSubscript:(NSUInteger)index; - -#pragma mark - Sectioned Results - -/** - Sorts and sections this collection from a given property key path, returning the result - as an instance of `RLMSectionedResults`. - - @param keyPath The property key path to sort on. - @param ascending The direction to sort in. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsSortedUsingKeyPath:(NSString *)keyPath - ascending:(BOOL)ascending - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -/** - Sorts and sections this collection from a given array of sort descriptors, returning the result - as an instance of `RLMSectionedResults`. - - @param sortDescriptors An array of `RLMSortDescriptor`s to sort by. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @note The primary sort descriptor must be responsible for determining the section key. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsUsingSortDescriptors:(NSArray *)sortDescriptors - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -#pragma mark - Freeze - -/** - Indicates if the result are frozen. - - Frozen Results are immutable and can be accessed from any thread.The objects - read from a frozen Results will also be frozen. - */ -@property (nonatomic, readonly, getter=isFrozen) BOOL frozen; - -/** - Returns a frozen (immutable) snapshot of these results. - - The frozen copy is an immutable collection which contains the same data as - this collection currently contains, but will not update when writes are made - to the containing Realm. Unlike live Results, frozen Results can be accessed - from any thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning Holding onto a frozen collection for an extended period while - performing write transaction on the Realm may result in the Realm - file growing to large sizes. See - `RLMRealmConfiguration.maximumNumberOfActiveVersions` for more - information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -#pragma mark - Unavailable Methods - -/** - `-[RLMResults init]` is not available because `RLMResults` cannot be created directly. - `RLMResults` can be obtained by querying a Realm. - */ -- (instancetype)init __attribute__((unavailable("RLMResults cannot be created directly"))); - -/** - `+[RLMResults new]` is not available because `RLMResults` cannot be created directly. - `RLMResults` can be obtained by querying a Realm. - */ -+ (instancetype)new __attribute__((unavailable("RLMResults cannot be created directly"))); - -@end - -/** - `RLMLinkingObjects` is an auto-updating container type. It represents a collection of objects that link to its - parent object. - - For more information, please see the "Inverse Relationships" section in the - [documentation](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/relationships/#relationships). - */ -@interface RLMLinkingObjects : RLMResults -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMSchema.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMSchema.h deleted file mode 100644 index fe46f6d47..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMSchema.h +++ /dev/null @@ -1,78 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectSchema; - -/** - `RLMSchema` instances represent collections of model object schemas managed by a Realm. - - When using Realm, `RLMSchema` instances allow performing migrations and - introspecting the database's schema. - - Schemas map to collections of tables in the core database. - */ -RLM_SWIFT_SENDABLE // not actually immutable, but the public API kinda is -@interface RLMSchema : NSObject - -#pragma mark - Properties - -/** - An `NSArray` containing `RLMObjectSchema`s for all object types in the Realm. - - This property is intended to be used during migrations for dynamic introspection. - - @see `RLMObjectSchema` - */ -@property (nonatomic, readonly, copy) NSArray *objectSchema; - -#pragma mark - Methods - -/** - Returns an `RLMObjectSchema` for the given class name in the schema. - - @param className The object class name. - @return An `RLMObjectSchema` for the given class in the schema. - - @see `RLMObjectSchema` - */ -- (nullable RLMObjectSchema *)schemaForClassName:(NSString *)className; - -/** - Looks up and returns an `RLMObjectSchema` for the given class name in the Realm. - - If there is no object of type `className` in the schema, an exception will be thrown. - - @param className The object class name. - @return An `RLMObjectSchema` for the given class in this Realm. - - @see `RLMObjectSchema` - */ -- (RLMObjectSchema *)objectForKeyedSubscript:(NSString *)className; - -/** - Returns whether two `RLMSchema` instances are equivalent. - */ -- (BOOL)isEqualToSchema:(RLMSchema *)schema; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMSectionedResults.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMSectionedResults.h deleted file mode 100644 index 4ee236b94..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMSectionedResults.h +++ /dev/null @@ -1,921 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2022 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@protocol RLMValue; -@class RLMResults; - -/** - A `RLMSectionedResultsChange` object encapsulates information about changes to sectioned - results that are reported by Realm notifications. - - `RLMSectionedResultsChange` is passed to the notification blocks registered with - `-addNotificationBlock` on `RLMSectionedResults`, and reports what sections and rows in the - collection changed since the last time the notification block was called. - - A complete example of updating a `UITableView` named `tv`: - - [tv beginUpdates]; - [tv deleteRowsAtIndexPaths:changes.deletions withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv insertRowsAtIndexPaths:changes.insertions withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv reloadRowsAtIndexPaths:changes.modifications withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv insertSections:changes.sectionsToInsert withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv deleteSections:changes.sectionsToRemove withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv endUpdates]; - - All of the arrays in an `RLMSectionedResultsChange` are always sorted in ascending order. - */ -@interface RLMSectionedResultsChange : NSObject -/// The index paths of objects in the previous version of the collection which have -/// been removed from this one. -@property (nonatomic, readonly) NSArray *deletions; -/// The index paths in the new version of the collection which were newly inserted. -@property (nonatomic, readonly) NSArray *insertions; -/// The index paths in the old version of the collection which were modified. -@property (nonatomic, readonly) NSArray *modifications; -/// The indices of the sections to be inserted. -@property (nonatomic, readonly) NSIndexSet *sectionsToInsert; -/// The indices of the sections to be removed. -@property (nonatomic, readonly) NSIndexSet *sectionsToRemove; -/// Returns the index paths of the deletion indices in the given section. -- (NSArray *)deletionsInSection:(NSUInteger)section; -/// Returns the index paths of the insertion indices in the given section. -- (NSArray *)insertionsInSection:(NSUInteger)section; -/// Returns the index paths of the modification indices in the given section. -- (NSArray *)modificationsInSection:(NSUInteger)section; -@end - - -/// The `RLMSectionedResult` protocol defines properties and methods common to both `RLMSectionedResults and RLMSection` -@protocol RLMSectionedResult - -#pragma mark - Object Access - -/// The count of objects in the collection. -@property (nonatomic, readonly) NSUInteger count; -/// Returns the object for a given index in the collection. -- (id)objectAtIndexedSubscript:(NSUInteger)index; -/// Returns the object for a given index in the collection. -- (id)objectAtIndex:(NSUInteger)index; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this collection. - - The frozen copy is an immutable collection which contains the same data as this - collection currently contains, but will not update when writes are made to the - containing Realm. Unlike live arrays, frozen collections can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning Holding onto a frozen collection for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; -/** - Indicates if the underlying collection is frozen. - - Frozen collections are immutable and can be accessed from any thread. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Sectioned Results Notifications - -/** - Registers a block to be called each time the collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` / `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(id, RLMSectionedResultsChange *))block __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` / `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(id, RLMSectionedResultsChange *))block - queue:(dispatch_queue_t)queue __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` / `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(id, RLMSectionedResultsChange *))block - keyPaths:(NSArray *)keyPaths __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` / `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(id, RLMSectionedResultsChange *))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue __attribute__((warn_unused_result)); - -@end - -/// An RLMSection contains the objects which belong to a specified section key. -@interface RLMSection, RLMObjectType> : NSObject -/// The value that represents the key in this section. -@property (nonatomic, readonly) RLMKeyType key; -/// The count of objects in the section. -@property (nonatomic, readonly) NSUInteger count; -/// Returns the object for a given index in the section. -- (RLMObjectType)objectAtIndexedSubscript:(NSUInteger)index; -/// Returns the object for a given index in the section. -- (RLMObjectType)objectAtIndex:(NSUInteger)index; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this section. - - The frozen copy is an immutable section which contains the same data as this - section currently contains, but will not update when writes are made to the - containing Realm. Unlike live arrays, frozen collections can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning Holding onto a frozen section for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; -/** - Returns a live version of this frozen section. - - This method resolves a reference to a live copy of the same frozen section. - If called on a live section, will return itself. -*/ -- (instancetype)thaw; -/** - Indicates if the underlying section is frozen. - - Frozen sections are immutable and can be accessed from any thread. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Section Notifications - -/** - Registers a block to be called each time the section changes. - - The block will be asynchronously called with the initial section, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - RLMSection *section = sectionedResults[0] // section with dogs aged '5' already exists. - - self.token = [section addNotificationBlock:^(RLMSection *section, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"section.count: %zu", section.count); // => 2 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSection *, RLMSectionedResultsChange *))block __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the section changes. - - The block will be asynchronously called with the initial section, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - RLMSection *section = sectionedResults[0] // section with dogs aged '5' already exists. - - self.token = [section addNotificationBlock:^(RLMSection *section, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"section.count: %zu", section.count); // => 2 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSection *, RLMSectionedResultsChange *))block - queue:(dispatch_queue_t)queue __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the section changes. - - The block will be asynchronously called with the initial section, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - RLMSection *section = sectionedResults[0] // section with dogs aged '5' already exists. - - self.token = [section addNotificationBlock:^(RLMSection *section, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"section.count: %zu", section.count); // => 2 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSection *, RLMSectionedResultsChange *))block - keyPaths:(NSArray *)keyPaths __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the section changes. - - The block will be asynchronously called with the initial section, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - RLMSection *section = sectionedResults[0] // section with dogs aged '5' already exists. - - self.token = [section addNotificationBlock:^(RLMSection *section, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"section.count: %zu", section.count); // => 2 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSection *, RLMSectionedResultsChange *))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue __attribute__((warn_unused_result)); -@end - -/// A lazily evaluated collection that holds elements in sections determined by a section key. -@interface RLMSectionedResults, RLMObjectType: id> : NSObject -/// An array of all keys in the sectioned results collection. -@property (nonatomic) NSArray *allKeys; -/// The total amount of sections in this collection. -@property (nonatomic, readonly, assign) NSUInteger count; -/// Returns the section at a given index. -- (RLMSection *)objectAtIndexedSubscript:(NSUInteger)index; -/// Returns the section at a given index. -- (RLMSection *)objectAtIndex:(NSUInteger)index; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this sectioned results collection. - - The frozen copy is an immutable sectioned results collection which contains the same data as this - sectioned results collection currently contains, but will not update when writes are made to the - containing Realm. Unlike live sectioned results collections, frozen sectioned results collection - can be accessed from any thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning Holding onto a frozen sectioned results collection for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; -/** - Returns a live version of this frozen sectioned results collection. - - This method resolves a reference to a live copy of the same frozen sectioned results collection. - If called on a live section, will return itself. -*/ -- (instancetype)thaw; -/** - Indicates if the underlying sectioned results collection is frozen. - - Frozen sectioned results collections are immutable and can be accessed from any thread. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Sectioned Results Notifications - -/** - Registers a block to be called each time the sectioned results collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSectionedResults *, RLMSectionedResultsChange *))block __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the sectioned results collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSectionedResults *, RLMSectionedResultsChange *))block - queue:(dispatch_queue_t)queue __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the sectioned results collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSectionedResults *, RLMSectionedResultsChange *))block - keyPaths:(NSArray *)keyPaths __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the sectioned results collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSectionedResults *, RLMSectionedResultsChange *))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue __attribute__((warn_unused_result)); -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMSet.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMSet.h deleted file mode 100644 index fead2e005..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMSet.h +++ /dev/null @@ -1,535 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObject, RLMResults; - -/** - A collection datatype used for storing distinct objects. - - - Note: - `RLMSet` supports storing primitive and `RLMObject` types. `RLMSet` does not support storing - Embedded Realm Objects. - */ -@interface RLMSet : NSObject - -#pragma mark - Properties - -/** - The number of objects in the set. - */ -@property (nonatomic, readonly, assign) NSUInteger count; - -/** - The type of the objects in the set. - */ -@property (nonatomic, readonly, assign) RLMPropertyType type; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readonly, getter = isOptional) BOOL optional; - -/** - The objects in the RLMSet as an NSArray value. - */ -@property (nonatomic, readonly) NSArray *allObjects; - -/** - The class name of the objects contained in the set. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages the set. Returns `nil` for unmanaged set. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - Indicates if the set can no longer be accessed. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if the set is frozen. - - Frozen sets are immutable and can be accessed from any thread. Frozen sets - are created by calling `-freeze` on a managed live set. Unmanaged sets are - never frozen. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Adding, Removing, and Replacing Objects in a Set - -/** - Adds an object to the set if it is not already present. - - @warning This method may only be called during a write transaction. - - @param object An object of the type contained in the set. - */ -- (void)addObject:(RLMObjectType)object; - -/** - Adds an array of distinct objects to the set. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable object such as `NSArray`, `NSSet` or `RLMResults` which contains objects of the - same class as the set. - */ -- (void)addObjects:(id)objects; - -/** - Removes a given object from the set. - - @warning This method may only be called during a write transaction. - - @param object The object in the set that you want to remove. - */ -- (void)removeObject:(RLMObjectType)object; - -/** - Removes all objects from the set. - - @warning This method may only be called during a write transaction. - */ -- (void)removeAllObjects; - -/** - Empties the receiving set, then adds each object contained in another given set. - - @warning This method may only be called during a write transaction. - - @param set The RLMSet whose members replace the receiving set's content. - */ -- (void)setSet:(RLMSet *)set; - -/** - Removes from the receiving set each object that isn’t a member of another given set. - - @warning This method may only be called during a write transaction. - - @param set The RLMSet with which to perform the intersection. - */ -- (void)intersectSet:(RLMSet *)set; - -/** - Removes each object in another given set from the receiving set, if present. - - @warning This method may only be called during a write transaction. - - @param set The set of objects to remove from the receiving set. - */ -- (void)minusSet:(RLMSet *)set; - -/** - Adds each object in another given set to the receiving set, if not present. - - @warning This method may only be called during a write transaction. - - @param set The set of objects to add to the receiving set. - */ -- (void)unionSet:(RLMSet *)set; - -#pragma mark - Querying a Set - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/// :nodoc: -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/// :nodoc: -- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/// :nodoc: -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/// :nodoc: -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -/** - Returns a Boolean value that indicates whether at least one object in the receiving set is also present in another given set. - - @param set The RLMSet to compare the receiving set to. - - @return YES if at least one object in the receiving set is also present in otherSet, otherwise NO. - */ -- (BOOL)intersectsSet:(RLMSet *)set; - -/** - Returns a Boolean value that indicates whether every object in the receiving set is also present in another given set. - - @param set The RLMSet to compare the receiving set to. - - @return YES if every object in the receiving set is also present in otherSet, otherwise NO. - */ -- (BOOL)isSubsetOfSet:(RLMSet *)set; - -/** - Returns a Boolean value that indicates whether a given object is present in the set. - - @param anObject An object to look for in the set. - - @return YES if anObject is present in the set, otherwise NO. - */ -- (BOOL)containsObject:(RLMObjectType)anObject; - -/** - Compares the receiving set to another set. - - @param otherSet The set with which to compare the receiving set. - - @return YES if the contents of otherSet are equal to the contents of the receiving set, otherwise NO. - */ -- (BOOL)isEqualToSet:(RLMSet *)otherSet; - -#pragma mark - Sectioning a Set - -/** - Sorts and sections this collection from a given property key path, returning the result - as an instance of `RLMSectionedResults`. - - @param keyPath The property key path to sort on. - @param ascending The direction to sort in. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsSortedUsingKeyPath:(NSString *)keyPath - ascending:(BOOL)ascending - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -/** - Sorts and sections this collection from a given array of sort descriptors, returning the result - as an instance of `RLMSectionedResults`. - - @param sortDescriptors An array of `RLMSortDescriptor`s to sort by. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @note The primary sort descriptor must be responsible for determining the section key. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsUsingSortDescriptors:(NSArray *)sortDescriptors - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - - -#pragma mark - Notifications - -/** - Registers a block to be called each time the set changes. - - The block will be asynchronously called with the initial set, and then - called again after each write transaction which changes any of the objects in - the set, which objects are in the results, or the order of the objects in the - set. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the set were added, removed or modified. If a write transaction - did not modify any objects in the set, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - Person *person = [[Person allObjectsInRealm:realm] firstObject]; - NSLog(@"person.dogs.count: %zu", person.dogs.count); // => 0 - self.token = [person.dogs addNotificationBlock(RLMSet *dogs, - RLMCollectionChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count) // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - [person.dogs addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a non-frozen managed set. - - @param block The block to be called each time the set changes. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSet *_Nullable set, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the set changes. - - The block will be asynchronously called with the initial set, and then - called again after each write transaction which changes any of the objects in - the set, which objects are in the results, or the order of the objects in the - set. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the set were added, removed or modified. If a write transaction - did not modify any objects in the set, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSet *_Nullable set, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the set changes. - - The block will be asynchronously called with the initial set, and then - called again after each write transaction which changes any of the objects in - the set, which objects are in the results, or the order of the objects in the - set. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the set were added, removed or modified. If a write transaction - did not modify any objects in the set, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSet *_Nullable set, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the set changes. - - The block will be asynchronously called with the initial set, and then - called again after each write transaction which changes any of the objects in - the set, which objects are in the results, or the order of the objects in the - set. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the set were added, removed or modified. If a write transaction - did not modify any objects in the set, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSet *_Nullable set, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths -__attribute__((warn_unused_result)); - -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the objects in the set. - - NSNumber *min = [object.setProperty minOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, `RLMSet`, and `NSData` properties. - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The minimum value of the property, or `nil` if the set is empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects in the set. - - NSNumber *max = [object.setProperty maxOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, `RLMSet`, and `NSData` properties. - - @param property The property whose maximum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The maximum value of the property, or `nil` if the set is empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of distinct values of a given property over all the objects in the set. - - NSNumber *sum = [object.setProperty sumOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, `RLMSet and `NSData` properties. - - @param property The property whose values should be summed. Only properties of - types `int`, `float`, and `double` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects in the set. - - NSNumber *average = [object.setProperty averageOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMSet`, `RLMArray`, and `NSData` properties. - - @param property The property whose average value should be calculated. Only - properties of types `int`, `float`, and `double` are supported. - - @return The average value of the given property, or `nil` if the set is empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this set. - - The frozen copy is an immutable set which contains the same data as this - et currently contains, but will not update when writes are made to the - containing Realm. Unlike live sets, frozen sets can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a managed set. - @warning Holding onto a frozen set for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -#pragma mark - Unavailable Methods - -/** - `-[RLMSet init]` is not available because `RLMSet`s cannot be created directly. - ``RLMSet` properties on `RLMObject`s are lazily created when accessed. - */ -- (instancetype)init __attribute__((unavailable("RLMSets cannot be created directly"))); - -/** - `+[RLMSet new]` is not available because `RLMSet`s cannot be created directly. - `RLMSet` properties on `RLMObject`s are lazily created when accessed. - */ -+ (instancetype)new __attribute__((unavailable("RLMSet cannot be created directly"))); - -@end - -/// :nodoc: -@interface RLMSet (Swift) -// for use only in Swift class definitions -- (instancetype)initWithObjectClassName:(NSString *)objectClassName; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMSwiftObject.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMSwiftObject.h deleted file mode 100644 index 7ea764016..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMSwiftObject.h +++ /dev/null @@ -1,142 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) -/** - `Object` is a class used to define Realm model objects. - - In Realm you define your model classes by subclassing `Object` and adding properties to be managed. - You then instantiate and use your custom subclasses instead of using the `Object` class directly. - - ```swift - class Dog: Object { - @objc dynamic var name: String = "" - @objc dynamic var adopted: Bool = false - let siblings = List() - } - ``` - - ### Supported property types - - - `String`, `NSString` - - `Int` - - `Int8`, `Int16`, `Int32`, `Int64` - - `Float` - - `Double` - - `Bool` - - `Date`, `NSDate` - - `Data`, `NSData` - - `Decimal128` - - `ObjectId` - - `@objc enum` which has been delcared as conforming to `RealmEnum`. - - `RealmOptional` for optional numeric properties - - `Object` subclasses, to model many-to-one relationships - - `EmbeddedObject` subclasses, to model owning one-to-one relationships - - `List`, to model many-to-many relationships - - `String`, `NSString`, `Date`, `NSDate`, `Data`, `NSData`, `Decimal128`, and `ObjectId` properties - can be declared as optional. `Object` and `EmbeddedObject` subclasses *must* be declared as optional. - `Int`, `Int8`, `Int16`, `Int32`, `Int64`, `Float`, `Double`, `Bool`, enum, and `List` properties cannot. - To store an optional number, use `RealmOptional`, `RealmOptional`, `RealmOptional`, or - `RealmOptional` instead, which wraps an optional numeric value. Lists cannot be optional at all. - - All property types except for `List` and `RealmOptional` *must* be declared as `@objc dynamic var`. `List` and - `RealmOptional` properties must be declared as non-dynamic `let` properties. Swift `lazy` properties are not allowed. - - Note that none of the restrictions listed above apply to properties that are configured to be ignored by Realm. - - ### Querying - - You can retrieve all objects of a given type from a Realm by calling the `objects(_:)` instance method. - - ### Relationships - - See our [Objective-C guide](https://docs.mongodb.com/realm/sdk/swift/fundamentals/relationships/) for more details. - */ -@interface RealmSwiftObject : RLMObjectBase -@end - -/** - `EmbeddedObject` is a base class used to define embedded Realm model objects. - - Embedded objects work similarly to normal objects, but are owned by a single - parent Object (which itself may be embedded). Unlike normal top-level objects, - embedded objects cannot be directly created in or added to a Realm. Instead, - they can only be created as part of a parent object, or by assigning an - unmanaged object to a parent object's property. Embedded objects are - automatically deleted when the parent object is deleted or when the parent is - modified to no longer point at the embedded object, either by reassigning an - Object property or by removing the embedded object from the List containing it. - - Embedded objects can only ever have a single parent object which links to - them, and attempting to link to an existing managed embedded object will throw - an exception. - - The property types supported on `EmbeddedObject` are the same as for `Object`, - except for that embedded objects cannot link to top-level objects, so `Object` - and `List` properties are not supported (`EmbeddedObject` and - `List` *are*). - - Embedded objects cannot have primary keys or indexed properties. - - ```swift - class Owner: Object { - @objc dynamic var name: String = "" - let dogs = List() - } - class Dog: EmbeddedObject { - @objc dynamic var name: String = "" - @objc dynamic var adopted: Bool = false - let owner = LinkingObjects(fromType: Owner.self, property: "dogs") - } - ``` - */ -@interface RealmSwiftEmbeddedObject : RLMObjectBase -@end - -/** - `AsymmetricObject` is a base class used to define asymmetric Realm objects. - - Asymmetric objects can only be created using the `create(_ object:)` - function, and cannot be added, removed or queried. - When created, asymmetric objects will be synced unidirectionally to the MongoDB - database and cannot be accessed locally. - - Incoming links from any asymmetric table are not allowed, meaning embedding - an asymmetric object within an `Object` will throw an error. - - The property types supported on `AsymmetricObject` are the same as for `Object`, - except for that asymmetric objects can only link to embedded objects, so `Object` - and `List` properties are not supported (`EmbeddedObject` and - `List` *are*). - - ```swift - class Person: AsymmetricObject { - @Persisted(primaryKey: true) var _id: ObjectId = ObjectId.generate() - @Persisted var name: String - @Persisted var age: Int - } - ``` - */ -@interface RealmSwiftAsymmetricObject : RLMObjectBase -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMSwiftProperty.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMSwiftProperty.h deleted file mode 100644 index ea071927c..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMSwiftProperty.h +++ /dev/null @@ -1,71 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -@class RLMObjectBase, RLMArray, RLMSet; - -#ifdef __cplusplus -extern "C" { -#endif - -RLM_HEADER_AUDIT_BEGIN(nullability) - -#define REALM_FOR_EACH_SWIFT_PRIMITIVE_TYPE(macro) \ - macro(bool, Bool, bool) \ - macro(double, Double, double) \ - macro(float, Float, float) \ - macro(int64_t, Int64, int) - -#define REALM_FOR_EACH_SWIFT_OBJECT_TYPE(macro) \ - macro(NSString, String, string) \ - macro(NSDate, Date, date) \ - macro(NSData, Data, data) \ - macro(NSUUID, UUID, uuid) \ - macro(RLMDecimal128, Decimal128, decimal128) \ - macro(RLMObjectId, ObjectId, objectId) - -#define REALM_SWIFT_PROPERTY_ACCESSOR(objc, swift, rlmtype) \ - objc RLMGetSwiftProperty##swift(RLMObjectBase *, uint16_t); \ - objc RLMGetSwiftProperty##swift##Optional(RLMObjectBase *, uint16_t, bool *); \ - void RLMSetSwiftProperty##swift(RLMObjectBase *, uint16_t, objc); -REALM_FOR_EACH_SWIFT_PRIMITIVE_TYPE(REALM_SWIFT_PROPERTY_ACCESSOR) -#undef REALM_SWIFT_PROPERTY_ACCESSOR - -#define REALM_SWIFT_PROPERTY_ACCESSOR(objc, swift, rlmtype) \ - objc *_Nullable RLMGetSwiftProperty##swift(RLMObjectBase *, uint16_t); \ - void RLMSetSwiftProperty##swift(RLMObjectBase *, uint16_t, objc *_Nullable); -REALM_FOR_EACH_SWIFT_OBJECT_TYPE(REALM_SWIFT_PROPERTY_ACCESSOR) -#undef REALM_SWIFT_PROPERTY_ACCESSOR - -id _Nullable RLMGetSwiftPropertyAny(RLMObjectBase *, uint16_t); -void RLMSetSwiftPropertyAny(RLMObjectBase *, uint16_t, id); -RLMObjectBase *_Nullable RLMGetSwiftPropertyObject(RLMObjectBase *, uint16_t); -void RLMSetSwiftPropertyNil(RLMObjectBase *, uint16_t); -void RLMSetSwiftPropertyObject(RLMObjectBase *, uint16_t, RLMObjectBase *_Nullable); - -RLMArray *_Nonnull RLMGetSwiftPropertyArray(RLMObjectBase *obj, uint16_t); -RLMSet *_Nonnull RLMGetSwiftPropertySet(RLMObjectBase *obj, uint16_t); -RLMDictionary *_Nonnull RLMGetSwiftPropertyMap(RLMObjectBase *obj, uint16_t); - -RLM_HEADER_AUDIT_END(nullability) - -#ifdef __cplusplus -} // extern "C" -#endif diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMSyncConfiguration.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMSyncConfiguration.h deleted file mode 100644 index 54ea2ecfc..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMSyncConfiguration.h +++ /dev/null @@ -1,196 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -@class RLMApp; -@class RLMRealm; -@class RLMRealmConfiguration; -@class RLMUser; -@protocol RLMBSON; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** Determines file behavior during a client reset. - - @see: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ -*/ -typedef NS_ENUM(NSUInteger, RLMClientResetMode) { - /// The local copy of the Realm is copied into a recovery - /// directory for safekeeping, and then deleted from the original location. The next time - /// the Realm for that partition value is opened, the Realm will automatically be re-downloaded from - /// Atlas App Services, and can be used as normal. - - /// Data written to the Realm after the local copy of the Realm diverged from the backup - /// remote copy will be present in the local recovery copy of the Realm file. The - /// re-downloaded Realm will initially contain only the data present at the time the Realm - /// was backed up on the server. - /// - /// @see: ``rlmSync_clientResetBackedUpRealmPath`` and ``RLMSyncErrorActionToken`` for more information on accessing the recovery directory and error information. - /// - /// The manual client reset mode handler can be set in two places: - /// 1. As an ErrorReportingBlock argument at ``RLMSyncConfiguration.manualClientResetHandler``. - /// 2. As an ErrorReportingBlock in the ``RLMSyncManager.errorHandler`` property. - /// @see: ``RLMSyncManager.errorHandler`` - /// - /// When an ``RLMSyncErrorClientResetError`` is thrown, the following rules determine which block is executed: - /// - If an error reporting block is set in ``.manualClientResetHandler`` and the ``RLMSyncManager.errorHandler``, the ``.manualClientResetHandler`` block will be executed. - /// - If an error reporting block is set in either the ``.manualClientResetHandler`` or the ``RLMSyncManager``, but not both, the single block will execute. - /// - If no block is set in either location, the client reset will not be handled. The application will likely need to be restarted and unsynced local changes may be lost. - /// @note: The ``RLMSyncManager.errorHandler`` is still invoked under all ``RLMSyncError``s *other than* ``RLMSyncErrorClientResetError``. - /// @see ``RLMSyncError`` for an exhaustive list. - RLMClientResetModeManual = 0, - /// All unsynchronized local changes are automatically discarded and the local state is - /// automatically reverted to the most recent state from the server. Unsynchronized changes - /// can then be recovered in the post-client-reset callback block. - /// - /// If ``RLMClientResetModeDiscardLocal`` is enabled but the client reset operation is unable to complete - /// then the client reset process reverts to manual mode. Example) During a destructive schema change this - /// mode will fail and invoke the manual client reset handler. - /// - /// The RLMClientResetModeDiscardLocal mode supports two client reset callbacks -- ``RLMClientResetBeforeBlock``, ``RLMClientResetAfterBlock`` -- which can be passed as arguments when creating the ``RLMSyncConfiguration``. - /// @see: ``RLMClientResetAfterBlock`` and ``RLMClientResetBeforeBlock`` - RLMClientResetModeDiscardLocal __deprecated_enum_msg("Use RLMClientResetModeDiscardUnsyncedChanges") = 1, - /// All unsynchronized local changes are automatically discarded and the local state is - /// automatically reverted to the most recent state from the server. Unsynchronized changes - /// can then be recovered in the post-client-reset callback block. - /// - /// If ``RLMClientResetModeDiscardUnsyncedChanges`` is enabled but the client reset operation is unable to complete - /// then the client reset process reverts to manual mode. Example) During a destructive schema change this - /// mode will fail and invoke the manual client reset handler. - /// - /// The RLMClientResetModeDiscardUnsyncedChanges mode supports two client reset callbacks -- ``RLMClientResetBeforeBlock``, ``RLMClientResetAfterBlock`` -- which can be passed as arguments when creating the ``RLMSyncConfiguration``. - /// @see: ``RLMClientResetAfterBlock`` and ``RLMClientResetBeforeBlock`` - RLMClientResetModeDiscardUnsyncedChanges = 1, - /// The client device will download a realm realm which reflects the latest - /// state of the server after a client reset. A recovery process is run locally in - /// an attempt to integrate the server version with any local changes from - /// before the client reset occurred. - /// - /// The changes are integrated with the following rules: - /// 1. Objects created locally that were not synced before client reset will be integrated. - /// 2. If an object has been deleted on the server, but was modified on the client, the delete takes precedence and the update is discarded - /// 3. If an object was deleted on the client, but not the server, then the client delete instruction is applied. - /// 4. In the case of conflicting updates to the same field, the client update is applied. - /// - /// If the recovery integration fails, the client reset process falls back to ``RLMClientResetModeManual``. - /// The recovery integration will fail if the "Client Recovery" setting is not enabled on the server. - /// Integration may also fail in the event of an incompatible schema change. - /// - /// The RLMClientResetModeRecoverUnsyncedChanges mode supports two client reset callbacks -- ``RLMClientResetBeforeBlock``, ``RLMClientResetAfterBlock`` -- which can be passed as arguments when creating the ``RLMSyncConfiguration``. - /// @see: ``RLMClientResetAfterBlock`` and ``RLMClientResetBeforeBlock`` - RLMClientResetModeRecoverUnsyncedChanges = 2, - /// The client device will download a realm with objects reflecting the latest version of the server. A recovery - /// process is run locally in an attempt to integrate the server version with any local changes from before the - /// client reset occurred. - /// - /// The changes are integrated with the following rules: - /// 1. Objects created locally that were not synced before client reset will be integrated. - /// 2. If an object has been deleted on the server, but was modified on the client, the delete takes precedence and the update is discarded - /// 3. If an object was deleted on the client, but not the server, then the client delete instruction is applied. - /// 4. In the case of conflicting updates to the same field, the client update is applied. - /// - /// If the recovery integration fails, the client reset process falls back to ``RLMClientResetModeDiscardUnsyncedChanges``. - /// The recovery integration will fail if the "Client Recovery" setting is not enabled on the server. - /// Integration may also fail in the event of an incompatible schema change. - /// - /// The RLMClientResetModeRecoverOrDiscardUnsyncedChanges mode supports two client reset callbacks -- ``RLMClientResetBeforeBlock``, ``RLMClientResetAfterBlock`` -- which can be passed as arguments when creating the ``RLMSyncConfiguration``. - /// @see: ``RLMClientResetAfterBlock`` and ``RLMClientResetBeforeBlock`` - RLMClientResetModeRecoverOrDiscardUnsyncedChanges = 3 -}; - -/** - A block type used to report before a client reset will occur. - The `beforeFrozen` is a frozen copy of the local state prior to client reset. - */ -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMClientResetBeforeBlock)(RLMRealm * _Nonnull beforeFrozen); - -/** - A block type used to report after a client reset occurred. - The `beforeFrozen` argument is a frozen copy of the local state prior to client reset. - The `after` argument contains the local database state after the client reset occurred. - */ -RLM_SWIFT_SENDABLE // invoked on a backgroun thread -typedef void(^RLMClientResetAfterBlock)(RLMRealm * _Nonnull beforeFrozen, RLMRealm * _Nonnull after); - -/** - A configuration object representing configuration state for a Realm which is intended to sync with a Realm Object - Server. - */ -@interface RLMSyncConfiguration : NSObject - -/// The user to which the remote Realm belongs. -@property (nonatomic, readonly) RLMUser *user; - -/** - The value this Realm is partitioned on. The partition key is a property defined in - Atlas App Services. All classes with a property with this value will be synchronized to the - Realm. - */ -@property (nonatomic, readonly) id partitionValue; - -/** - An enum which determines file recovery behavior in the event of a client reset. - @note: Defaults to `RLMClientResetModeRecoverUnsyncedChanges` - - @see: `RLMClientResetMode` - @see: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ -*/ -@property (nonatomic) RLMClientResetMode clientResetMode; - -/** - A callback which notifies prior to prior to a client reset occurring. - @see: `RLMClientResetBeforeBlock` - */ -@property (nonatomic, nullable) RLMClientResetBeforeBlock beforeClientReset; - -/** - A callback which notifies after a client reset has occurred. - @see: `RLMClientResetAfterBlock` - */ -@property (nonatomic, nullable) RLMClientResetAfterBlock afterClientReset; - -/** - A callback that's executed when an `RLMSyncErrorClientResetError` is encountered. - @See RLMSyncErrorReportingBlock and RLMSyncErrorClientResetError for more - details on handling a client reset manually. - */ -@property (nonatomic, nullable) RLMSyncErrorReportingBlock manualClientResetHandler; - - -/** - Whether nonfatal connection errors should cancel async opens. - - By default, if a nonfatal connection error such as a connection timing out occurs, any currently pending asyncOpen operations will ignore the error and continue to retry until it succeeds. If this is set to true, the open will instead fail and report the error. - - NEXT-MAJOR: This should be true by default. - */ -@property (nonatomic) bool cancelAsyncOpenOnNonFatalErrors; - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("This type cannot be created directly"))); - -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("This type cannot be created directly"))); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMSyncManager.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMSyncManager.h deleted file mode 100644 index 1dee453d0..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMSyncManager.h +++ /dev/null @@ -1,223 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMSyncSession, RLMSyncTimeoutOptions, RLMAppConfiguration; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -// NEXT-MAJOR: This enum needs to be removed when access to the logger is removed -// from the sync manager. -/// An enum representing different levels of sync-related logging that can be configured. -typedef RLM_CLOSED_ENUM(NSUInteger, RLMSyncLogLevel) { - /// Nothing will ever be logged. - RLMSyncLogLevelOff, - /// Only fatal errors will be logged. - RLMSyncLogLevelFatal, - /// Only errors will be logged. - RLMSyncLogLevelError, - /// Warnings and errors will be logged. - RLMSyncLogLevelWarn, - /// Information about sync events will be logged. Fewer events will be logged in order to avoid overhead. - RLMSyncLogLevelInfo, - /// Information about sync events will be logged. More events will be logged than with `RLMSyncLogLevelInfo`. - RLMSyncLogLevelDetail, - /// Log information that can aid in debugging. - /// - /// - warning: Will incur a measurable performance impact. - RLMSyncLogLevelDebug, - /// Log information that can aid in debugging. More events will be logged than with `RLMSyncLogLevelDebug`. - /// - /// - warning: Will incur a measurable performance impact. - RLMSyncLogLevelTrace, - /// Log information that can aid in debugging. More events will be logged than with `RLMSyncLogLevelTrace`. - /// - /// - warning: Will incur a measurable performance impact. - RLMSyncLogLevelAll -}; - -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" -/// A log callback function which can be set on RLMSyncManager. -/// -/// The log function may be called from multiple threads simultaneously, and is -/// responsible for performing its own synchronization if any is required. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void (^RLMSyncLogFunction)(RLMSyncLogLevel level, NSString *message); -#pragma clang diagnostic pop - -/// A block type representing a block which can be used to report a sync-related error to the application. If the error -/// pertains to a specific session, that session will also be passed into the block. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMSyncErrorReportingBlock)(NSError *, RLMSyncSession * _Nullable); - -/** - A manager which serves as a central point for sync-related configuration. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMSyncManager : NSObject - -/** - A block which can optionally be set to report sync-related errors to your application. - - Any error reported through this block will be of the `RLMSyncError` type, and marked - with the `RLMSyncErrorDomain` domain. - - Errors reported through this mechanism are fatal, with several exceptions. Please consult - `RLMSyncError` for information about the types of errors that can be reported through - the block, and for for suggestions on handling recoverable error codes. - - @see `RLMSyncError` - */ -@property (nullable, atomic, copy) RLMSyncErrorReportingBlock errorHandler; - -/// :nodoc: -@property (nonatomic, copy) NSString *appID -__attribute__((deprecated("This property is not used for anything"))); - -/** - A string identifying this application which is included in the User-Agent - header of sync connections. By default, this will be the application's bundle - identifier. - - This property must be set prior to opening a synchronized Realm for the first - time. Any modifications made after opening a Realm will be ignored. - */ -@property (atomic, copy) NSString *userAgent; - -/** - The logging threshold which newly opened synced Realms will use. Defaults to - `RLMSyncLogLevelInfo`. - - By default logging strings are output to Apple System Logger. Set `logger` to - perform custom logging logic instead. - - @warning This property must be set before any synced Realms are opened. Setting it after - opening any synced Realm will do nothing. - */ -@property (atomic) RLMSyncLogLevel logLevel -__attribute__((deprecated("Use `RLMLogger.default.level`/`Logger.shared.level` to set/get the default logger threshold level."))); - -/** - The function which will be invoked whenever the sync client has a log message. - - If nil, log strings are output to Apple System Logger instead. - - @warning This property must be set before any synced Realms are opened. Setting - it after opening any synced Realm will do nothing. - */ -@property (atomic, nullable) RLMSyncLogFunction logger -__attribute__((deprecated("Use `RLMLogger.default`/`Logger.shared` to set/get the default logger."))); - -/** - The name of the HTTP header to send authorization data in when making requests to Atlas App Services which has - been configured to expect a custom authorization header. - */ -@property (nullable, atomic, copy) NSString *authorizationHeaderName; - -/** - Extra HTTP headers to append to every request to Atlas App Services. - - Modifying this property while sync sessions are active will result in all - sessions disconnecting and reconnecting using the new headers. - */ -@property (nullable, atomic, copy) NSDictionary *customRequestHeaders; - -/** - Options for the assorted types of connection timeouts for sync connections. - - If nil default values for all timeouts are used instead. - - @warning This property must be set before any synced Realms are opened. Setting - it after opening any synced Realm will do nothing. - */ -@property (nullable, atomic, copy) RLMSyncTimeoutOptions *timeoutOptions; - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("RLMSyncManager cannot be created directly"))); - -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("RLMSyncManager cannot be created directly"))); - -@end - -/** - Options for configuring timeouts and intervals in the sync client. - */ -@interface RLMSyncTimeoutOptions : NSObject -/// The maximum number of milliseconds to allow for a connection to -/// become fully established. This includes the time to resolve the -/// network address, the TCP connect operation, the SSL handshake, and -/// the WebSocket handshake. -/// -/// Defaults to 2 minutes. -@property (nonatomic) NSUInteger connectTimeout; - -/// The number of milliseconds to keep a connection open after all -/// sessions have been abandoned. -/// -/// After all synchronized Realms have been closed for a given server, the -/// connection is kept open until the linger time has expired to avoid the -/// overhead of reestablishing the connection when Realms are being closed and -/// reopened. -/// -/// Defaults to 30 seconds. -@property (nonatomic) NSUInteger connectionLingerTime; - -/// The number of milliseconds between each heartbeat ping message. -/// -/// The client periodically sends ping messages to the server to check if the -/// connection is still alive. Shorter periods make connection state change -/// notifications more responsive at the cost of battery life (as the antenna -/// will have to wake up more often). -/// -/// Defaults to 1 minute. -@property (nonatomic) NSUInteger pingKeepalivePeriod; - -/// How long in milliseconds to wait for a reponse to a heartbeat ping before -/// concluding that the connection has dropped. -/// -/// Shorter values will make connection state change notifications more -/// responsive as it will only change to `disconnected` after this much time has -/// elapsed, but overly short values may result in spurious disconnection -/// notifications when the server is simply taking a long time to respond. -/// -/// Defaults to 2 minutes. -@property (nonatomic) NSUInteger pongKeepaliveTimeout; - -/// The maximum amount of time, in milliseconds, since the loss of a -/// prior connection, for a new connection to be considered a "fast -/// reconnect". -/// -/// When a client first connects to the server, it defers uploading any local -/// changes until it has downloaded all changesets from the server. This -/// typically reduces the total amount of merging that has to be done, and is -/// particularly beneficial the first time that a specific client ever connects -/// to the server. -/// -/// When an existing client disconnects and then reconnects within the "fact -/// reconnect" time this is skipped and any local changes are uploaded -/// immediately without waiting for downloads, just as if the client was online -/// the whole time. -/// -/// Defaults to 1 minute. -@property (nonatomic) NSUInteger fastReconnectLimit; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMSyncSession.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMSyncSession.h deleted file mode 100644 index 31677ce9c..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMSyncSession.h +++ /dev/null @@ -1,234 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -/** - The current state of the session represented by a session object. - */ -typedef NS_ENUM(NSUInteger, RLMSyncSessionState) { - /// The sync session is actively communicating or attempting to communicate - /// with Atlas App Services. A session is considered Active even if - /// it is not currently connected. Check the connection state instead if you - /// wish to know if the connection is currently online. - RLMSyncSessionStateActive, - /// The sync session is not attempting to communicate with MongoDB - /// Realm due to the user logging out or synchronization being paused. - RLMSyncSessionStateInactive, - /// The sync session encountered a fatal error and is permanently invalid; it should be discarded. - RLMSyncSessionStateInvalid -}; - -/** - The current state of a sync session's connection. Sessions which are not in - the Active state will always be Disconnected. - */ -typedef NS_ENUM(NSUInteger, RLMSyncConnectionState) { - /// The sync session is not connected to the server, and is not attempting - /// to connect, either because the session is inactive or because it is - /// waiting to retry after a failed connection. - RLMSyncConnectionStateDisconnected, - /// The sync session is attempting to connect to Atlas App Services. - RLMSyncConnectionStateConnecting, - /// The sync session is currently connected to Atlas App Services. - RLMSyncConnectionStateConnected, -}; - -/** - The transfer direction (upload or download) tracked by a given progress notification block. - - Progress notification blocks can be registered on sessions if your app wishes to be informed - how many bytes have been uploaded or downloaded, for example to show progress indicator UIs. - */ -typedef RLM_CLOSED_ENUM(NSUInteger, RLMSyncProgressDirection) { - /// For monitoring upload progress. - RLMSyncProgressDirectionUpload, - /// For monitoring download progress. - RLMSyncProgressDirectionDownload, -}; - -/** - The desired behavior of a progress notification block. - - Progress notification blocks can be registered on sessions if your app wishes to be informed - how many bytes have been uploaded or downloaded, for example to show progress indicator UIs. - */ -typedef NS_ENUM(NSUInteger, RLMSyncProgressMode) { - /** - The block will be called indefinitely, or until it is unregistered by calling - `-[RLMProgressNotificationToken invalidate]`. - - Notifications will always report the latest number of transferred bytes, and the - most up-to-date number of total transferrable bytes. - */ - RLMSyncProgressModeReportIndefinitely, - /** - The block will, upon registration, store the total number of bytes - to be transferred. When invoked, it will always report the most up-to-date number - of transferrable bytes out of that original number of transferrable bytes. - - When the number of transferred bytes reaches or exceeds the - number of transferrable bytes, the block will be unregistered. - */ - RLMSyncProgressModeForCurrentlyOutstandingWork, -}; - -@class RLMUser, RLMSyncConfiguration, RLMSyncErrorActionToken, RLMSyncManager; - -/** - The type of a progress notification block intended for reporting a session's network - activity to the user. - - `transferredBytes` refers to the number of bytes that have been uploaded or downloaded. - `transferrableBytes` refers to the total number of bytes transferred, and pending transfer. - */ -typedef void(^RLMProgressNotificationBlock)(NSUInteger transferredBytes, NSUInteger transferrableBytes); - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A token object corresponding to a progress notification block on a session object. - - To stop notifications manually, call `-invalidate` on it. Notifications should be stopped before - the token goes out of scope or is destroyed. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMProgressNotificationToken : RLMNotificationToken -@end - -/** - An object encapsulating an Atlas App Services "session". Sessions represent the - communication between the client (and a local Realm file on disk), and the server - (and a remote Realm with a given partition value stored on Atlas App Services). - - Sessions are always created by the SDK and vended out through various APIs. The - lifespans of sessions associated with Realms are managed automatically. Session - objects can be accessed from any thread. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMSyncSession : NSObject - -/// The session's current state. -/// -/// This property is not KVO-compliant. -@property (nonatomic, readonly) RLMSyncSessionState state; - -/// The session's current connection state. -/// -/// This property is KVO-compliant and can be observed to be notified of changes. -/// Be warned that KVO observers for this property may be called on a background -/// thread. -@property (atomic, readonly) RLMSyncConnectionState connectionState; - -/// The user that owns this session. -- (nullable RLMUser *)parentUser; - -/** - If the session is valid, return a sync configuration that can be used to open the Realm - associated with this session. - */ -- (nullable RLMSyncConfiguration *)configuration; - -/** - Temporarily suspend syncronization and disconnect from the server. - - The session will not attempt to connect to Atlas App Services until `resume` - is called or the Realm file is closed and re-opened. - */ -- (void)suspend; - -/** - Resume syncronization and reconnect to Atlas App Services after suspending. - - This is a no-op if the session was already active or if the session is invalid. - Newly created sessions begin in the Active state and do not need to be resumed. - */ -- (void)resume; - -/** - Register a progress notification block. - - Multiple blocks can be registered with the same session at once. Each block - will be invoked on a side queue devoted to progress notifications. - - If the session has already received progress information from the - synchronization subsystem, the block will be called immediately. Otherwise, it - will be called as soon as progress information becomes available. - - The token returned by this method must be retained as long as progress - notifications are desired, and the `-invalidate` method should be called on it - when notifications are no longer needed and before the token is destroyed. - - If no token is returned, the notification block will never be called again. - There are a number of reasons this might be true. If the session has previously - experienced a fatal error it will not accept progress notification blocks. If - the block was configured in the `RLMSyncProgressForCurrentlyOutstandingWork` - mode but there is no additional progress to report (for example, the number - of transferrable bytes and transferred bytes are equal), the block will not be - called again. - - @param direction The transfer direction (upload or download) to track in this progress notification block. - @param mode The desired behavior of this progress notification block. - @param block The block to invoke when notifications are available. - - @return A token which must be held for as long as you want notifications to be delivered. - - @see `RLMSyncProgressDirection`, `RLMSyncProgress`, `RLMProgressNotificationBlock`, `RLMProgressNotificationToken` - */ -- (nullable RLMProgressNotificationToken *)addProgressNotificationForDirection:(RLMSyncProgressDirection)direction - mode:(RLMSyncProgressMode)mode - block:(RLMProgressNotificationBlock)block -NS_REFINED_FOR_SWIFT; - -/** - Given an error action token, immediately handle the corresponding action. - - @see `RLMSyncErrorClientResetError`, `RLMSyncErrorPermissionDeniedError` - */ -+ (void)immediatelyHandleError:(RLMSyncErrorActionToken *)token syncManager:(RLMSyncManager *)syncManager; - -/** - Get the sync session for the given Realm if it is a synchronized Realm, or `nil` - if it is not. - */ -+ (nullable RLMSyncSession *)sessionForRealm:(RLMRealm *)realm; - -@end - -// MARK: - Error action token - -#pragma mark - Error action token - -/** - An opaque token returned as part of certain errors. It can be - passed into certain APIs to perform certain actions. - - @see `RLMSyncErrorClientResetError`, `RLMSyncErrorPermissionDeniedError` - */ -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMSyncErrorActionToken : NSObject - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("This type cannot be created directly"))); - -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("This type cannot be created directly"))); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMSyncSubscription.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMSyncSubscription.h deleted file mode 100644 index d35be19d0..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMSyncSubscription.h +++ /dev/null @@ -1,346 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectId; - -#pragma mark - Subscription States - -/// The current state of the subscription. This can be used for ensuring that -/// the subscriptions are not errored and that it has been successfully -/// synced to the server. -typedef NS_ENUM(NSUInteger, RLMSyncSubscriptionState) { - /// The subscription is complete and the server has sent all the data that matched the subscription - /// queries at the time the subscription set was updated. The server is now in a steady-state - /// synchronization mode where it will stream update as they come. - RLMSyncSubscriptionStateComplete, - /// The subscription encountered an error and synchronization is paused for this Realm. You can - /// find the error calling error in the subscription set to get a description of the error. You can - /// still use the current subscription set to write a subscription. - RLMSyncSubscriptionStateError, - /// The subscription is persisted locally but not yet processed by the server, which means - /// the server hasn't yet returned all the data that matched the updated subscription queries. - RLMSyncSubscriptionStatePending, - /// The subscription set has been super-ceded by an updated one, this typically means that - /// someone is trying to write a subscription on a different instance of the subscription set. - /// You should not use a superseded subscription set and instead obtain a new instance of - /// the subscription set to write a subscription. - RLMSyncSubscriptionStateSuperseded -}; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - `RLMSyncSubscription` is used to define a Flexible Sync subscription obtained from querying a - subscription set, which can be used to read or remove/update a committed subscription. - */ -@interface RLMSyncSubscription : NSObject - -/// Name of the subscription. If not specified it will return nil. -@property (nonatomic, readonly, nullable) NSString *name; - -/// When the subscription was created. Recorded automatically. -@property (nonatomic, readonly) NSDate *createdAt; - -/// When the subscription was last updated. Recorded automatically. -@property (nonatomic, readonly) NSDate *updatedAt; - -/** - Updates a Flexible Sync's subscription query with an allowed query which will be used to bootstrap data - from the server when committed. - - @warning This method may only be called during a write subscription block. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - */ -- (void)updateSubscriptionWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (void)updateSubscriptionWhere:(NSString *)predicateFormat - args:(va_list)args; - -/** - Updates a Flexible Sync's subscription query with an allowed query which will be used to bootstrap data - from the server when committed. - - @warning This method may only be called during a write subscription block. - - @param predicate The predicate with which to filter the objects on the server. - */ -- (void)updateSubscriptionWithPredicate:(NSPredicate *)predicate; - -@end - -/** - `RLMSyncSubscriptionSet` is a collection of `RLMSyncSubscription`s. This is the entry point - for adding and removing `RLMSyncSubscription`s. - */ -@interface RLMSyncSubscriptionSet : NSObject - -/// The number of subscriptions in the subscription set. -@property (readonly) NSUInteger count; - -/// Gets the error associated to the subscription set. This will be non-nil in case the current -/// state of the subscription set is `RLMSyncSubscriptionStateError`. -@property (nonatomic, readonly, nullable) NSError *error; - -/// Gets the state associated to the subscription set. -@property (nonatomic, readonly) RLMSyncSubscriptionState state; - -#pragma mark - Batch Update subscriptions - -/** - Synchronously performs any transactions (add/remove/update) to the subscription set within the block, - this will not wait for the server to acknowledge and see all the data associated with this collection of subscriptions, - and will return after committing the subscription transactions. - - @param block The block containing actions to perform to the subscription set. - */ -- (void)update:(__attribute__((noescape)) void(^)(void))block; -/// :nodoc: -- (void)write:(__attribute__((noescape)) void(^)(void))block __attribute__((unavailable("Renamed to -update"))); - -/** - Synchronously performs any transactions (add/remove/update) to the subscription set within the block, - this will not wait for the server to acknowledge and see all the data associated with this collection of subscriptions, - and will return after committing the subscription transactions. - - @param block The block containing actions to perform to the subscription set. - @param onComplete A block which is called upon synchronization of - subscriptions to the server. The block will be passed `nil` - if the update succeeded, and an error describing the problem - otherwise. - */ -- (void)update:(__attribute__((noescape)) void(^)(void))block - onComplete:(nullable void(^RLM_SWIFT_SENDABLE)(NSError *_Nullable))onComplete - __attribute__((swift_async(not_swift_private, 2))) - __attribute__((swift_attr("@_unsafeInheritExecutor"))); -/// :nodoc: -- (void)write:(__attribute__((noescape)) void(^)(void))block - onComplete:(void(^)(NSError * _Nullable))onComplete __attribute__((unavailable("Renamed to -update:onComplete."))); - -#pragma mark - Find subscription - -/** - Finds a subscription by the specified name. - - @param name The name used to identify the subscription. - - @return A subscription for the given name. - */ -- (nullable RLMSyncSubscription *)subscriptionWithName:(NSString *)name; - -/** - Finds a subscription by the query for the specified object class name. - - @param objectClassName The class name for the model class to be queried. - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return A subscription for the given query.. - */ -- (nullable RLMSyncSubscription *)subscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (nullable RLMSyncSubscription *)subscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat - args:(va_list)args; - -/** - Finds a subscription by the query for the specified object class name. - - @param objectClassName The class name for the model class to be queried. - @param predicate The predicate used to to filter the objects on the server. - - @return A subscription for the given query.. - */ -- (nullable RLMSyncSubscription *)subscriptionWithClassName:(NSString *)objectClassName - predicate:(NSPredicate *)predicate; - -#pragma mark - Add a Subscription - -/** - Adds a new subscription to the subscription set which will be sent to the server when - committed at the end of a write subscription block. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - */ -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat - args:(va_list)args; - -/** - Adds a new subscription to the subscription set which will be sent to the server when - committed at the end of a write subscription block. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param name The name used the identify the subscription. - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - */ -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - subscriptionName:(NSString *)name - where:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - subscriptionName:(NSString *)name - where:(NSString *)predicateFormat - args:(va_list)args; - -/** - Adds a new subscription to the subscription set which will be sent to the server when - committed at the end of a write subscription block. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param predicate The predicate defining the query for the subscription. - */ -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - predicate:(NSPredicate *)predicate; - -/** - Adds a new subscription to the subscription set which will be sent to the server when - committed at the end of a write subscription block. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param name The name used to identify the subscription. - @param predicate The predicate defining the query for the subscription. - */ -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - subscriptionName:(nullable NSString *)name - predicate:(NSPredicate *)predicate; - -#pragma mark - Remove Subscription - -/** - Removes a subscription with the specified name from the subscription set. - - @warning This method may only be called during a write subscription block. - - @param name The name used the identify the subscription. - */ -- (void)removeSubscriptionWithName:(NSString *)name; - -/** - Removes a subscription with the specified query for the object class from the subscription set. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - */ -- (void)removeSubscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (void)removeSubscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat - args:(va_list)args; - -/** - Removes a subscription with the specified query for the object class from the subscription set. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param predicate The predicate which will be used to identify the subscription to be removed. - */ -- (void)removeSubscriptionWithClassName:(NSString *)objectClassName - predicate:(NSPredicate *)predicate; - -/** - Removes the subscription from the subscription set. - - @warning This method may only be called during a write subscription block. - - @param subscription An instance of the subscription to be removed. - */ -- (void)removeSubscription:(RLMSyncSubscription *)subscription; - -#pragma mark - Remove Subscriptions - -/** - Removes all subscription from the subscription set. - - @warning This method may only be called during a write subscription block. - @warning Removing all subscriptions will result in an error if no new subscription is added. Server should - acknowledge at least one subscription. - */ -- (void)removeAllSubscriptions; - -/** - Removes all subscription with the specified class name. - - @param className The class name for the model class to be queried. - - @warning This method may only be called during a write subscription block. - */ -- (void)removeAllSubscriptionsWithClassName:(NSString *)className; - -#pragma mark - SubscriptionSet Collection - -/** - Returns the subscription at the given `index`. - - @param index The index. - - @return A subscription for the given index in the subscription set. - */ -- (nullable RLMSyncSubscription *)objectAtIndex:(NSUInteger)index; - -/** - Returns the first object in the subscription set list, or `nil` if the subscriptions are empty. - - @return A subscription. - */ -- (nullable RLMSyncSubscription *)firstObject; - -/** - Returns the last object in the subscription set, or `nil` if the subscriptions are empty. - - @return A subscription. - */ -- (nullable RLMSyncSubscription *)lastObject; - -#pragma mark - Subscript - -/** - Returns the subscription at the given `index`. - - @param index The index. - - @return A subscription for the given index in the subscription set. - */ -- (id)objectAtIndexedSubscript:(NSUInteger)index; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMThreadSafeReference.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMThreadSafeReference.h deleted file mode 100644 index 9472942ed..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMThreadSafeReference.h +++ /dev/null @@ -1,107 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMRealm; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - Objects of types which conform to `RLMThreadConfined` can be managed by a Realm, which will make - them bound to a thread-specific `RLMRealm` instance. Managed objects must be explicitly exported - and imported to be passed between threads. - - Managed instances of objects conforming to this protocol can be converted to a thread-safe - reference for transport between threads by passing to the - `+[RLMThreadSafeReference referenceWithThreadConfined:]` constructor. - - Note that only types defined by Realm can meaningfully conform to this protocol, and defining new - classes which attempt to conform to it will not make them work with `RLMThreadSafeReference`. - */ -@protocol RLMThreadConfined -// Conformance to the `RLMThreadConfined_Private` protocol will be enforced at runtime. - -/** - The Realm which manages the object, or `nil` if the object is unmanaged. - - Unmanaged objects are not confined to a thread and cannot be passed to methods expecting a - `RLMThreadConfined` object. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/// Indicates if the object can no longer be accessed because it is now invalid. -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -@end - -/** - An object intended to be passed between threads containing a thread-safe reference to its - thread-confined object. - - To resolve a thread-safe reference on a target Realm on a different thread, pass to - `-[RLMRealm resolveThreadSafeReference:]`. - - @warning A `RLMThreadSafeReference` object must be resolved at most once. - Failing to resolve a `RLMThreadSafeReference` will result in the source version of the - Realm being pinned until the reference is deallocated. - - @note Prefer short-lived `RLMThreadSafeReference`s as the data for the version of the source Realm - will be retained until all references have been resolved or deallocated. - - @see `RLMThreadConfined` - @see `-[RLMRealm resolveThreadSafeReference:]` - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMThreadSafeReference<__covariant Confined : id> : NSObject - -/** - Create a thread-safe reference to the thread-confined object. - - @param threadConfined The thread-confined object to create a thread-safe reference to. - - @note You may continue to use and access the thread-confined object after passing it to this - constructor. - */ -+ (instancetype)referenceWithThreadConfined:(Confined)threadConfined; - -/** - Indicates if the reference can no longer be resolved because an attempt to resolve it has already - occurred. References can only be resolved once. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -#pragma mark - Unavailable Methods - -/** - `-[RLMThreadSafeReference init]` is not available because `RLMThreadSafeReference` cannot be - created directly. `RLMThreadSafeReference` instances must be obtained by calling - `-[RLMRealm resolveThreadSafeReference:]`. - */ -- (instancetype)init __attribute__((unavailable("RLMThreadSafeReference cannot be created directly"))); - -/** - `-[RLMThreadSafeReference new]` is not available because `RLMThreadSafeReference` cannot be - created directly. `RLMThreadSafeReference` instances must be obtained by calling - `-[RLMRealm resolveThreadSafeReference:]`. - */ -+ (instancetype)new __attribute__((unavailable("RLMThreadSafeReference cannot be created directly"))); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMUpdateResult.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMUpdateResult.h deleted file mode 100644 index df0b237e3..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMUpdateResult.h +++ /dev/null @@ -1,45 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectId; -@protocol RLMBSON; - -/// The result of an `updateOne` or `updateMany` operation a `RLMMongoCollection`. -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMUpdateResult : NSObject - -/// The number of documents that matched the filter. -@property (nonatomic, readonly) NSUInteger matchedCount; - -/// The number of documents modified. -@property (nonatomic, readonly) NSUInteger modifiedCount; - -/// The identifier of the inserted document if an upsert took place and the document's primary key is an `ObjectId`. -@property (nonatomic, nullable, readonly) RLMObjectId *objectId -__attribute__((deprecated("Use documentId instead, which support all BSON types", "documentId"))); - -/// The identifier of the inserted document if an upsert took place. -@property (nonatomic, nullable, readonly) id documentId; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMUser.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMUser.h deleted file mode 100644 index 436350f9b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMUser.h +++ /dev/null @@ -1,447 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import -#import -#import - -@class RLMUser, RLMSyncSession, RLMRealm, RLMUserIdentity, RLMAPIKeyAuth, RLMMongoClient, RLMMongoDatabase, RLMMongoCollection, RLMUserProfile; -@protocol RLMBSON; - -/** - The state of the user object. - */ -typedef NS_ENUM(NSUInteger, RLMUserState) { - /// The user is logged out. Call `logInWithCredentials:...` with valid credentials to log the user back in. - RLMUserStateLoggedOut, - /// The user is logged in, and any Realms associated with it are syncing with Atlas App Services. - RLMUserStateLoggedIn, - /// The user has been removed, and cannot be used. - RLMUserStateRemoved -}; - -/// A block type used to report an error related to a specific user. -RLM_SWIFT_SENDABLE -typedef void(^RLMOptionalUserBlock)(RLMUser * _Nullable, NSError * _Nullable); - -/// A block type used to report an error on a network request from the user. -RLM_SWIFT_SENDABLE -typedef void(^RLMUserOptionalErrorBlock)(NSError * _Nullable); - -/// A block which returns a dictionary should there be any custom data set for a user -RLM_SWIFT_SENDABLE -typedef void(^RLMUserCustomDataBlock)(NSDictionary * _Nullable, NSError * _Nullable); - -/// A block type for returning from function calls. -RLM_SWIFT_SENDABLE -typedef void(^RLMCallFunctionCompletionBlock)(id _Nullable, NSError * _Nullable); - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A `RLMUser` instance represents a single Realm App user account. - - A user may have one or more credentials associated with it. These credentials - uniquely identify the user to the authentication provider, and are used to sign - into an Atlas App Services user account. - - Note that user objects are only vended out via SDK APIs, and cannot be directly - initialized. User objects can be accessed from any thread. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // internally thread-safe -@interface RLMUser : NSObject - -/** - The unique Atlas App Services string identifying this user. - Note this is different from an identity: A user may have multiple identities but has a single identifier. See RLMUserIdentity. - */ -@property (nonatomic, readonly) NSString *identifier NS_SWIFT_NAME(id); - -/// Returns an array of identities currently linked to a user. -@property (nonatomic, readonly) NSArray *identities; - -/** - The user's refresh token used to access App Services. - - By default, refresh tokens expire 60 days after they are issued. - You can configure this time for your App's refresh tokens to be - anywhere between 30 minutes and 180 days. - - You can configure the refresh token expiration time for all sessions in - an App from the Admin UI or Admin API. -*/ -@property (nullable, nonatomic, readonly) NSString *refreshToken; - -/** - The user's access token used to access App Services. - - This is required to make HTTP requests to Atlas App Services like the Data API or GraphQL. - It should be treated as sensitive data. - - The Realm SDK automatically manages access tokens and refreshes them - when they expire. - */ -@property (nullable, nonatomic, readonly) NSString *accessToken; - -/** - The current state of the user. - */ -@property (nonatomic, readonly) RLMUserState state; - -/** - Indicates if the user is logged in or not. Returns true if the access token and refresh token are not empty. - */ -@property (nonatomic, readonly) BOOL isLoggedIn; - -#pragma mark - Lifecycle - -/** - Create a partition-based sync configuration instance for the given partition value. - - @param partitionValue The `RLMBSON` value the Realm is partitioned on. - @return A default configuration object with the sync configuration set to use the given partition value. - */ -- (RLMRealmConfiguration *)configurationWithPartitionValue:(nullable id)partitionValue NS_REFINED_FOR_SWIFT; - -/** - Create a partition-based sync configuration instance for the given partition value. - - @param partitionValue The `RLMBSON` value the Realm is partitioned on. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - - @return A configuration object with the sync configuration set to use the given partition value. - */ -- (RLMRealmConfiguration *)configurationWithPartitionValue:(nullable id)partitionValue - clientResetMode:(RLMClientResetMode)clientResetMode NS_REFINED_FOR_SWIFT; - -/** - Create a partition-based sync configuration instance for the given partition value. - - @param partitionValue The `RLMBSON` value the Realm is partitioned on. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param beforeResetBlock A callback which notifies prior to a client reset occurring. See: `RLMClientResetBeforeBlock` - @param afterResetBlock A callback which notifies after a client reset has occurred. See: `RLMClientResetAfterBlock` - - @return A configuration object with the sync configuration set to use the given partition value. - */ -- (RLMRealmConfiguration *)configurationWithPartitionValue:(nullable id)partitionValue - clientResetMode:(RLMClientResetMode)clientResetMode - notifyBeforeReset:(nullable RLMClientResetBeforeBlock)beforeResetBlock - notifyAfterReset:(nullable RLMClientResetAfterBlock)afterResetBlock NS_REFINED_FOR_SWIFT; - -/** - Create a partition-based sync configuration instance for the given partition value. - - @param partitionValue The `RLMBSON` value the Realm is partitioned on. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param manualClientResetHandler An error reporting block that is invoked during a client reset. - @See ``RLMSyncErrorReportingBlock`` and ``RLMClientResetInfo`` - - @return A configuration object with the sync configuration set to use the given partition value. - */ -- (RLMRealmConfiguration *)configurationWithPartitionValue:(nullable id)partitionValue - clientResetMode:(RLMClientResetMode)clientResetMode - manualClientResetHandler:(nullable RLMSyncErrorReportingBlock)manualClientResetHandler NS_REFINED_FOR_SWIFT; - -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @return A ``RLMRealmConfiguration`` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfiguration NS_REFINED_FOR_SWIFT; - -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param beforeResetBlock A callback which notifies prior to a client reset occurring. See: `RLMClientResetBeforeBlock` - @param afterResetBlock A callback which notifies after a client reset has occurred. See: `RLMClientResetAfterBlock` - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithClientResetMode:(RLMClientResetMode)clientResetMode - notifyBeforeReset:(nullable RLMClientResetBeforeBlock)beforeResetBlock - notifyAfterReset:(nullable RLMClientResetAfterBlock)afterResetBlock NS_REFINED_FOR_SWIFT; -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param manualClientResetHandler An error reporting block that is invoked during a client reset. - @See `RLMSyncErrorReportingBlock` and `RLMClientResetInfo` - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithClientResetMode:(RLMClientResetMode)clientResetMode - manualClientResetHandler:(nullable RLMSyncErrorReportingBlock)manualClientResetHandler NS_REFINED_FOR_SWIFT; - -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param initialSubscriptions A block which receives a subscription set instance, that can be - used to add an initial set of subscriptions which will be executed - when the Realm is first opened. - @param rerunOnOpen If true, allows to run the initial set of subscriptions specified, on every app startup. - This can be used to re-run dynamic time ranges and other queries that require a - re-computation of a static variable. - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithInitialSubscriptions:(RLMFlexibleSyncInitialSubscriptionsBlock)initialSubscriptions - rerunOnOpen:(BOOL)rerunOnOpen NS_REFINED_FOR_SWIFT; -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param initialSubscriptions A block which receives a subscription set instance, that can be - used to add an initial set of subscriptions which will be executed - when the Realm is first opened. - @param rerunOnOpen If true, allows to run the initial set of subscriptions specified, on every app startup. - This can be used to re-run dynamic time ranges and other queries that require a - re-computation of a static variable. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param beforeResetBlock A callback which notifies prior to a client reset occurring. See: `RLMClientResetBeforeBlock` - @param afterResetBlock A callback which notifies after a client reset has occurred. See: `RLMClientResetAfterBlock` - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithInitialSubscriptions:(RLMFlexibleSyncInitialSubscriptionsBlock)initialSubscriptions - rerunOnOpen:(BOOL)rerunOnOpen - clientResetMode:(RLMClientResetMode)clientResetMode - notifyBeforeReset:(nullable RLMClientResetBeforeBlock)beforeResetBlock - notifyAfterReset:(nullable RLMClientResetAfterBlock)afterResetBlock NS_REFINED_FOR_SWIFT; - -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param initialSubscriptions A block which receives a subscription set instance, that can be - used to add an initial set of subscriptions which will be executed - when the Realm is first opened. - @param rerunOnOpen If true, allows to run the initial set of subscriptions specified, on every app startup. - This can be used to re-run dynamic time ranges and other queries that require a - re-computation of a static variable. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param manualClientResetHandler An error reporting block that is invoked during a client reset. - @See `RLMSyncErrorReportingBlock` and `RLMClientResetInfo` - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithInitialSubscriptions:(RLMFlexibleSyncInitialSubscriptionsBlock)initialSubscriptions - rerunOnOpen:(BOOL)rerunOnOpen - clientResetMode:(RLMClientResetMode)clientResetMode - manualClientResetHandler:(nullable RLMSyncErrorReportingBlock)manualClientResetHandler NS_REFINED_FOR_SWIFT; - -#pragma mark - Sessions - -/** - Retrieve a valid session object belonging to this user for a given URL, or `nil` - if no such object exists. - */ -- (nullable RLMSyncSession *)sessionForPartitionValue:(id)partitionValue; - -/// Retrieve all the valid sessions belonging to this user. -@property (nonatomic, readonly) NSArray *allSessions; - -#pragma mark - Custom Data - -/** - The custom data of the user. - This is configured in your Atlas App Services app. - */ -@property (nonatomic, readonly) NSDictionary *customData NS_REFINED_FOR_SWIFT; - -/** - The profile of the user. - */ -@property (nonatomic, readonly) RLMUserProfile *profile; - -/** - Refresh a user's custom data. This will, in effect, refresh the user's auth session. - */ -- (void)refreshCustomDataWithCompletion:(RLMUserCustomDataBlock)completion; - -/** - Links the currently authenticated user with a new identity, where the identity is defined by the credential - specified as a parameter. This will only be successful if this `RLMUser` is the currently authenticated - with the client from which it was created. On success a new user will be returned with the new linked credentials. - - @param credentials The `RLMCredentials` used to link the user to a new identity. - @param completion The completion handler to call when the linking is complete. - If the operation is successful, the result will contain a new - `RLMUser` object representing the currently logged in user. -*/ -- (void)linkUserWithCredentials:(RLMCredentials *)credentials - completion:(RLMOptionalUserBlock)completion NS_REFINED_FOR_SWIFT; - -/** - Removes the user - - This logs out and destroys the session related to this user. The completion block will return an error - if the user is not found or is already removed. - - @param completion A callback invoked on completion -*/ -- (void)removeWithCompletion:(RLMUserOptionalErrorBlock)completion; - -/** - Permanently deletes this user from your Atlas App Services app. - - The users state will be set to `Removed` and the session will be destroyed. - If the delete request fails, the local authentication state will be untouched. - - @param completion A callback invoked on completion -*/ -- (void)deleteWithCompletion:(RLMUserOptionalErrorBlock)completion; - -/** - Logs out the current user - - The users state will be set to `Removed` is they are an anonymous user or `LoggedOut` if they are authenticated by an email / password or third party auth clients - If the logout request fails, this method will still clear local authentication state. - - @param completion A callback invoked on completion -*/ -- (void)logOutWithCompletion:(RLMUserOptionalErrorBlock)completion; - -/** - A client for the user API key authentication provider which - can be used to create and modify user API keys. - - This client should only be used by an authenticated user. -*/ -@property (nonatomic, readonly) RLMAPIKeyAuth *apiKeysAuth; - -/// A client for interacting with a remote MongoDB instance -/// @param serviceName The name of the MongoDB service -- (RLMMongoClient *)mongoClientWithServiceName:(NSString *)serviceName NS_REFINED_FOR_SWIFT; - -/** - Calls the Atlas App Services function with the provided name and arguments. - - @param name The name of the Atlas App Services function to be called. - @param arguments The `BSONArray` of arguments to be provided to the function. - @param completion The completion handler to call when the function call is complete. - This handler is executed on a non-main global `DispatchQueue`. -*/ -- (void)callFunctionNamed:(NSString *)name - arguments:(NSArray> *)arguments - completionBlock:(RLMCallFunctionCompletionBlock)completion NS_REFINED_FOR_SWIFT; - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("RLMUser cannot be created directly"))); -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("RLMUser cannot be created directly"))); - -@end - -#pragma mark - User info classes - -/** - An identity of a user. A user can have multiple identities, usually associated with multiple providers. - Note this is different from a user's unique identifier string. - @seeAlso `RLMUser.identifier` - */ -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMUserIdentity : NSObject - -/** - The associated provider type - */ -@property (nonatomic, readonly) NSString *providerType; - -/** - The string which identifies the RLMUserIdentity - */ -@property (nonatomic, readonly) NSString *identifier; - -/** - Initialize an RLMUserIdentity for the given identifier and provider type. - @param providerType the associated provider type - @param identifier the identifier of the identity - */ -- (instancetype)initUserIdentityWithProviderType:(NSString *)providerType - identifier:(NSString *)identifier; - -@end - -/** - A profile for a given User. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMUserProfile : NSObject - -/// The full name of the user. -@property (nonatomic, readonly, nullable) NSString *name; -/// The email address of the user. -@property (nonatomic, readonly, nullable) NSString *email; -/// A URL to the user's profile picture. -@property (nonatomic, readonly, nullable) NSString *pictureURL; -/// The first name of the user. -@property (nonatomic, readonly, nullable) NSString *firstName; -/// The last name of the user. -@property (nonatomic, readonly, nullable) NSString *lastName; -/// The gender of the user. -@property (nonatomic, readonly, nullable) NSString *gender; -/// The birthdate of the user. -@property (nonatomic, readonly, nullable) NSString *birthday; -/// The minimum age of the user. -@property (nonatomic, readonly, nullable) NSString *minAge; -/// The maximum age of the user. -@property (nonatomic, readonly, nullable) NSString *maxAge; -/// The BSON dictionary of metadata associated with this user. -@property (nonatomic, readonly) NSDictionary *metadata NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMUserAPIKey.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMUserAPIKey.h deleted file mode 100644 index 2cdd82b2a..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMUserAPIKey.h +++ /dev/null @@ -1,43 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// UserAPIKey model for APIKeys recevied from the server. -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMUserAPIKey : NSObject - -/// Indicates if the API key is disabled or not -@property (nonatomic, readonly) BOOL disabled; - -/// The name of the key. -@property (nonatomic, readonly) NSString *name; - -/// The actual key. Will only be included in -/// the response when an API key is first created. -@property (nonatomic, readonly, nullable) NSString *key; - -/// The ObjectId of the API key -@property (nonatomic, readonly) RLMObjectId *objectId NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMValue.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMValue.h deleted file mode 100644 index ac1f10ee4..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/RLMValue.h +++ /dev/null @@ -1,97 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import -#import -#import -#import -#import - -#pragma mark RLMValue - -/** - RLMValue is a property type which represents a polymorphic Realm value. This is similar to the usage of - `AnyObject` / `Any` in Swift. -``` - // A property on `MyObject` - @property (nonatomic) id myAnyValue; - - // A property on `AnotherObject` - @property (nonatomic) id myAnyValue; - - MyObject *myObject = [MyObject createInRealm:realm withValue:@[]]; - myObject.myAnyValue = @1234; // underlying type is NSNumber. - myObject.myAnyValue = @"hello"; // underlying type is NSString. - AnotherObject *anotherObject = [AnotherObject createInRealm:realm withValue:@[]]; - myObject.myAnyValue = anotherObject; // underlying type is RLMObject. -``` - The following types conform to RLMValue: - - `NSData` - `NSDate` - `NSNull` - `NSNumber` - `NSUUID` - `NSString` - `RLMObject - `RLMObjectId` - `RLMDecimal128` - */ -@protocol RLMValue - -/// Describes the type of property stored. -@property (readonly) RLMPropertyType rlm_valueType; - -@end - -/// :nodoc: -@interface NSNull (RLMValue) -@end - -/// :nodoc: -@interface NSNumber (RLMValue) -@end - -/// :nodoc: -@interface NSString (RLMValue) -@end - -/// :nodoc: -@interface NSData (RLMValue) -@end - -/// :nodoc: -@interface NSDate (RLMValue) -@end - -/// :nodoc: -@interface NSUUID (RLMValue) -@end - -/// :nodoc: -@interface RLMDecimal128 (RLMValue) -@end - -/// :nodoc: -@interface RLMObjectBase (RLMValue) -@end - -/// :nodoc: -@interface RLMObjectId (RLMValue) -@end diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/Realm.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/Realm.h deleted file mode 100644 index 245596393..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Headers/Realm.h +++ /dev/null @@ -1,63 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import - -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Info.plist b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Info.plist deleted file mode 100644 index 54638b8b3..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Info.plist and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/LICENSE b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/LICENSE deleted file mode 100644 index 66a27ec5f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/LICENSE +++ /dev/null @@ -1,177 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Modules/module.modulemap b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Modules/module.modulemap deleted file mode 100644 index 519ddc20b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Modules/module.modulemap +++ /dev/null @@ -1,88 +0,0 @@ -framework module Realm { - export Foundation - - umbrella header "Realm.h" - - header "RLMArray.h" - header "RLMAsymmetricObject.h" - header "RLMDecimal128.h" - header "RLMDictionary.h" - header "RLMEmbeddedObject.h" - header "RLMLogger.h" - header "RLMMigration.h" - header "RLMObject.h" - header "RLMObjectId.h" - header "RLMObjectSchema.h" - header "RLMProperty.h" - header "RLMProviderClient.h" - header "RLMRealm+Sync.h" - header "RLMRealm.h" - header "RLMRealmConfiguration.h" - header "RLMResults.h" - header "RLMSchema.h" - header "RLMSectionedResults.h" - header "RLMSet.h" - header "RLMValue.h" - - header "RLMApp.h" - header "RLMCredentials.h" - header "RLMNetworkTransport.h" - header "RLMPushClient.h" - header "RLMRealm+Sync.h" - header "RLMSyncConfiguration.h" - header "RLMSyncManager.h" - header "RLMSyncSession.h" - header "RLMUser.h" - header "RLMUserAPIKey.h" - header "RLMAPIKeyAuth.h" - header "RLMEmailPasswordAuth.h" - header "NSError+RLMSync.h" - header "RLMBSON.h" - header "RLMMongoClient.h" - header "RLMMongoDatabase.h" - header "RLMMongoCollection.h" - header "RLMUpdateResult.h" - header "RLMFindOptions.h" - header "RLMFindOneAndModifyOptions.h" - header "RLMSyncSubscription.h" - - explicit module Private { - header "RLMAccessor.h" - header "RLMApp_Private.h" - header "RLMArray_Private.h" - header "RLMAsyncTask_Private.h" - header "RLMCollection_Private.h" - header "RLMDictionary_Private.h" - header "RLMLogger_Private.h" - header "RLMEvent.h" - header "RLMMongoCollection_Private.h" - header "RLMObjectBase_Dynamic.h" - header "RLMObjectBase_Private.h" - header "RLMObjectSchema_Private.h" - header "RLMObjectStore.h" - header "RLMObject_Private.h" - header "RLMProperty_Private.h" - header "RLMRealmConfiguration_Private.h" - header "RLMRealm_Private.h" - header "RLMResults_Private.h" - header "RLMScheduler.h" - header "RLMSchema_Private.h" - header "RLMSectionedResults.h" - header "RLMSet_Private.h" - header "RLMSwiftCollectionBase.h" - header "RLMSwiftProperty.h" - header "RLMSwiftValueStorage.h" - header "RLMSyncConfiguration_Private.h" - header "RLMSyncSubscription_Private.h" - header "RLMUser_Private.h" - } - - explicit module Dynamic { - header "RLMRealm_Dynamic.h" - header "RLMObjectBase_Dynamic.h" - } - - explicit module Swift { - header "RLMSwiftObject.h" - } -} diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMAccessor.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMAccessor.h deleted file mode 100644 index db915ca7c..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMAccessor.h +++ /dev/null @@ -1,53 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectSchema, RLMProperty, RLMObjectBase; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -// -// Accessors Class Creation/Caching -// - -// get accessor classes for an object class - generates classes if not cached -Class RLMManagedAccessorClassForObjectClass(Class objectClass, RLMObjectSchema *schema, const char *name); -Class RLMUnmanagedAccessorClassForObjectClass(Class objectClass, RLMObjectSchema *schema); - -// -// Dynamic getters/setters -// -FOUNDATION_EXTERN void RLMDynamicValidatedSet(RLMObjectBase *obj, NSString *propName, id __nullable val); -FOUNDATION_EXTERN id __nullable RLMDynamicGet(RLMObjectBase *obj, RLMProperty *prop); -FOUNDATION_EXTERN id __nullable RLMDynamicGetByName(RLMObjectBase *obj, NSString *propName); - -// by property/column -void RLMDynamicSet(RLMObjectBase *obj, RLMProperty *prop, id val); - -// -// Class modification -// - -// Replace className method for the given class -void RLMReplaceClassNameMethod(Class accessorClass, NSString *className); - -// Replace sharedSchema method for the given class -void RLMReplaceSharedSchemaMethod(Class accessorClass, RLMObjectSchema * __nullable schema); - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMApp_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMApp_Private.h deleted file mode 100644 index 5da5c3c7a..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMApp_Private.h +++ /dev/null @@ -1,50 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// Observer block for app notifications. -typedef void(^RLMAppNotificationBlock)(RLMApp *); - -/// Token that identifies an observer. Unsubscribes when deconstructed to -/// avoid dangling observers, therefore this must be retained to hold -/// onto a subscription. -@interface RLMAppSubscriptionToken : NSObject -- (void)unsubscribe; -@end - -@interface RLMApp () -/// Returns all currently cached Apps -+ (NSArray *)allApps; -/// Subscribe to notifications for this RLMApp. -- (RLMAppSubscriptionToken *)subscribe:(RLMAppNotificationBlock)block; - -+ (instancetype)appWithConfiguration:(RLMAppConfiguration *)configuration; - -+ (void)resetAppCache; -@end - -@interface RLMAppConfiguration () -@property (nonatomic) NSString *appId; -@property (nonatomic) BOOL encryptMetadata; -@property (nonatomic) NSURL *rootDirectory; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMArray_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMArray_Private.h deleted file mode 100644 index 1a37f010e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMArray_Private.h +++ /dev/null @@ -1,44 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -@class RLMObjectBase, RLMProperty; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMArray () -- (instancetype)initWithObjectClassName:(NSString *)objectClassName; -- (instancetype)initWithObjectType:(RLMPropertyType)type optional:(BOOL)optional; -- (NSString *)descriptionWithMaxDepth:(NSUInteger)depth; -- (void)setParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -- (void)replaceAllObjectsWithObjects:(NSArray *)objects; -// YES if the property is declared with old property syntax. -@property (nonatomic, readonly) BOOL isLegacyProperty; -// The name of the property which this collection represents -@property (nonatomic, readonly) NSString *propertyKey; -@end - -@interface RLMManagedArray : RLMArray -- (instancetype)initWithParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -@end - -void RLMArrayValidateMatchingObjectType(RLMArray *array, id value); - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMAsyncTask_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMAsyncTask_Private.h deleted file mode 100644 index 3cce89441..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMAsyncTask_Private.h +++ /dev/null @@ -1,71 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import "RLMRealm_Private.h" - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMAsyncOpenTask () -@property (nonatomic, nullable) RLMRealm *localRealm; - -- (instancetype)initWithConfiguration:(RLMRealmConfiguration *)configuration - confinedTo:(RLMScheduler *)confinement - download:(bool)waitForDownloadCompletion - completion:(RLMAsyncOpenRealmCallback)completion -__attribute__((objc_direct)); - -- (instancetype)initWithConfiguration:(RLMRealmConfiguration *)configuration - confinedTo:(RLMScheduler *)confinement - download:(bool)waitForDownloadCompletion; - -- (void)waitWithCompletion:(void (^)(NSError *_Nullable))completion; -- (void)waitForOpen:(RLMAsyncOpenRealmCallback)completion __attribute__((objc_direct)); -@end - -// A cancellable task for waiting for downloads on an already-open Realm. -RLM_SWIFT_SENDABLE -@interface RLMAsyncDownloadTask : NSObject -- (instancetype)initWithRealm:(RLMRealm *)realm; -- (void)cancel; -- (void)waitWithCompletion:(void (^)(NSError *_Nullable))completion; -@end - -// A cancellable task for beginning an async write -RLM_SWIFT_SENDABLE -@interface RLMAsyncWriteTask : NSObject -// Must only be called from within the Actor -- (instancetype)initWithRealm:(RLMRealm *)realm; -- (void)setTransactionId:(RLMAsyncTransactionId)transactionID; -- (void)complete:(bool)cancel; - -// Can be called from any thread -- (void)wait:(void (^)(void))completion; -@end - -typedef void (^RLMAsyncRefreshCompletion)(bool); -// A cancellable task for refreshing a Realm -RLM_SWIFT_SENDABLE -@interface RLMAsyncRefreshTask : NSObject -- (void)complete:(bool)didRefresh; -- (void)wait:(RLMAsyncRefreshCompletion)completion; -+ (RLMAsyncRefreshTask *)completedRefresh; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMBSON_Private.hpp b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMBSON_Private.hpp deleted file mode 100644 index c5cc1a410..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMBSON_Private.hpp +++ /dev/null @@ -1,32 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -namespace realm::bson { -class Bson; -template class IndexedMap; -using BsonDocument = IndexedMap; -} - -realm::bson::Bson RLMConvertRLMBSONToBson(id b); -realm::bson::BsonDocument RLMConvertRLMBSONArrayToBsonDocument(NSArray> *array); -id RLMConvertBsonToRLMBSON(const realm::bson::Bson& b); -id RLMConvertBsonDocumentToRLMBSON(std::optional b); -NSArray> *RLMConvertBsonDocumentToRLMBSONArray(std::optional b); diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMCollection_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMCollection_Private.h deleted file mode 100644 index 7d31bd3f0..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMCollection_Private.h +++ /dev/null @@ -1,42 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@protocol RLMCollectionPrivate; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -NSUInteger RLMUnmanagedFastEnumerate(id collection, NSFastEnumerationState *); -void RLMCollectionSetValueForKey(id collection, NSString *key, id _Nullable value); -FOUNDATION_EXTERN NSString *RLMDescriptionWithMaxDepth(NSString *name, id collection, NSUInteger depth); -FOUNDATION_EXTERN void RLMAssignToCollection(id collection, id value); -FOUNDATION_EXTERN void RLMSetSwiftBridgeCallback(id _Nullable (*_Nonnull)(id)); - -FOUNDATION_EXTERN -RLMNotificationToken *RLMAddNotificationBlock(id collection, id block, - NSArray *_Nullable keyPaths, - dispatch_queue_t _Nullable queue); - -typedef RLM_CLOSED_ENUM(int32_t, RLMCollectionType) { - RLMCollectionTypeArray = 0, - RLMCollectionTypeSet = 1, - RLMCollectionTypeDictionary = 2 -}; - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMDictionary_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMDictionary_Private.h deleted file mode 100644 index 37ff740c7..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMDictionary_Private.h +++ /dev/null @@ -1,46 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectBase, RLMProperty; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMDictionary () -- (instancetype)initWithObjectClassName:(NSString *)objectClassName keyType:(RLMPropertyType)keyType; -- (instancetype)initWithObjectType:(RLMPropertyType)type optional:(BOOL)optional keyType:(RLMPropertyType)keyType; -- (NSString *)descriptionWithMaxDepth:(NSUInteger)depth; -- (void)setParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -// YES if the property is declared with old property syntax. -@property (nonatomic, readonly) BOOL isLegacyProperty; -// The name of the property which this collection represents -@property (nonatomic, readonly) NSString *propertyKey; -@end - -@interface RLMManagedDictionary : RLMDictionary -- (instancetype)initWithParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -@end - -FOUNDATION_EXTERN NSString *RLMDictionaryDescriptionWithMaxDepth(NSString *name, - RLMDictionary *dictionary, - NSUInteger depth); -id RLMDictionaryKey(RLMDictionary *dictionary, id key) RLM_HIDDEN; -id RLMDictionaryValue(RLMDictionary *dictionary, id value) RLM_HIDDEN; - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMEvent.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMEvent.h deleted file mode 100644 index 9a6acb1a6..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMEvent.h +++ /dev/null @@ -1,64 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2022 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#ifdef __cplusplus -#include - -namespace realm { -struct AuditConfig; -} -#endif - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMRealm, RLMUser, RLMRealmConfiguration; -typedef RLM_CLOSED_ENUM(NSUInteger, RLMSyncLogLevel); - -struct RLMEventContext; -typedef void (^RLMEventCompletion)(NSError *_Nullable); - -FOUNDATION_EXTERN struct RLMEventContext *_Nullable RLMEventGetContext(RLMRealm *realm); -FOUNDATION_EXTERN uint64_t RLMEventBeginScope(struct RLMEventContext *context, NSString *activity); -FOUNDATION_EXTERN void RLMEventCommitScope(struct RLMEventContext *context, uint64_t scope_id, - RLMEventCompletion _Nullable completion); -FOUNDATION_EXTERN void RLMEventCancelScope(struct RLMEventContext *context, uint64_t scope_id); -FOUNDATION_EXTERN bool RLMEventIsActive(struct RLMEventContext *context, uint64_t scope_id); -FOUNDATION_EXTERN void RLMEventRecordEvent(struct RLMEventContext *context, NSString *activity, - NSString *_Nullable event, NSString *_Nullable data, - RLMEventCompletion _Nullable completion); -FOUNDATION_EXTERN void RLMEventUpdateMetadata(struct RLMEventContext *context, - NSDictionary *newMetadata); - -@interface RLMEventConfiguration : NSObject -@property (nonatomic) NSString *partitionPrefix; -@property (nonatomic, nullable) RLMUser *syncUser; -@property (nonatomic, nullable) NSDictionary *metadata; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" -@property (nonatomic, nullable) void (^logger)(RLMSyncLogLevel, NSString *); -#pragma clang diagnostic pop -@property (nonatomic, nullable) RLM_SWIFT_SENDABLE void (^errorHandler)(NSError *); - -#ifdef __cplusplus -- (std::shared_ptr)auditConfigWithRealmConfiguration:(RLMRealmConfiguration *)realmConfig; -#endif -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMLogger_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMLogger_Private.h deleted file mode 100644 index 08f8c591e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMLogger_Private.h +++ /dev/null @@ -1,36 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMLogger() - -/** - Log a message to the supplied level. - - @param logLevel The log level for the message. - @param message The message to log. - */ -- (void)logWithLevel:(RLMLogLevel)logLevel message:(NSString *)message, ... NS_SWIFT_UNAVAILABLE(""); -- (void)logLevel:(RLMLogLevel)logLevel message:(NSString *)message; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMMigration_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMMigration_Private.h deleted file mode 100644 index 393f41184..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMMigration_Private.h +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import -#import - -namespace realm { - class Schema; -} - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMMigration () - -@property (nonatomic, strong) RLMRealm *oldRealm; -@property (nonatomic, strong) RLMRealm *realm; - -- (instancetype)initWithRealm:(RLMRealm *)realm oldRealm:(RLMRealm *)oldRealm schema:(realm::Schema &)schema; - -- (void)execute:(RLMMigrationBlock)block objectClass:(_Nullable Class)cls; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMMongoCollection_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMMongoCollection_Private.h deleted file mode 100644 index 77bbf9752..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMMongoCollection_Private.h +++ /dev/null @@ -1,37 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@class RLMUser; - -@interface RLMMongoCollection () -- (instancetype)initWithUser:(RLMUser *)user - serviceName:(NSString *)serviceName - databaseName:(NSString *)databaseName - collectionName:(NSString *)collectionName; - -- (RLMChangeStream *)watchWithMatchFilter:(nullable id)matchFilter - idFilter:(nullable id)idFilter - delegate:(id)delegate - scheduler:(void (^)(dispatch_block_t))scheduler; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMObjectBase_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMObjectBase_Private.h deleted file mode 100644 index af547b17e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMObjectBase_Private.h +++ /dev/null @@ -1,34 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2017 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMArray; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -// RLMObjectBase private -@interface RLMObjectBase () -@property (nonatomic, nullable) NSMutableArray *lastAccessedNames; - -+ (void)initializeLinkedObjectSchemas; -+ (bool)isEmbedded; -+ (bool)isAsymmetric; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMObjectSchema_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMObjectSchema_Private.h deleted file mode 100644 index 08855a82b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMObjectSchema_Private.h +++ /dev/null @@ -1,75 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -// RLMObjectSchema private -@interface RLMObjectSchema () { -@public - bool _isSwiftClass; -} - -/// The object type name reported to the object store and core. -@property (nonatomic, readonly) NSString *objectName; - -// writable redeclaration -@property (nonatomic, readwrite, copy) NSArray *properties; -@property (nonatomic, readwrite, assign) bool isSwiftClass; -@property (nonatomic, readwrite, assign) BOOL isEmbedded; -@property (nonatomic, readwrite, assign) BOOL isAsymmetric; - -// class used for this object schema -@property (nonatomic, readwrite, assign) Class objectClass; -@property (nonatomic, readwrite, assign) Class accessorClass; -@property (nonatomic, readwrite, assign) Class unmanagedClass; - -@property (nonatomic, readwrite, assign) bool hasCustomEventSerialization; - -@property (nonatomic, readwrite, nullable) RLMProperty *primaryKeyProperty; - -@property (nonatomic, copy) NSArray *computedProperties; -@property (nonatomic, readonly, nullable) NSArray *swiftGenericProperties; - -// returns a cached or new schema for a given object class -+ (instancetype)schemaForObjectClass:(Class)objectClass; -@end - -@interface RLMObjectSchema (Dynamic) -/** - This method is useful only in specialized circumstances, for example, when accessing objects - in a Realm produced externally. If you are simply building an app on Realm, it is not recommended - to use this method as an [RLMObjectSchema](RLMObjectSchema) is generated automatically for every [RLMObject](RLMObject) subclass. - - Initialize an RLMObjectSchema with classname, objectClass, and an array of properties - - @warning This method is useful only in specialized circumstances. - - @param objectClassName The name of the class used to refer to objects of this type. - @param objectClass The Objective-C class used when creating instances of this type. - @param properties An array of RLMProperty instances describing the managed properties for this type. - - @return An initialized instance of RLMObjectSchema. - */ -- (instancetype)initWithClassName:(NSString *)objectClassName objectClass:(Class)objectClass properties:(NSArray *)properties; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMObjectStore.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMObjectStore.h deleted file mode 100644 index 6045f1e8e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMObjectStore.h +++ /dev/null @@ -1,98 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#ifdef __cplusplus -extern "C" { -#endif - -@class RLMRealm, RLMSchema, RLMObjectBase, RLMResults, RLMProperty; - -typedef NS_ENUM(NSUInteger, RLMUpdatePolicy) { - RLMUpdatePolicyError = 1, - RLMUpdatePolicyUpdateChanged = 3, - RLMUpdatePolicyUpdateAll = 2, -}; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -void RLMVerifyHasPrimaryKey(Class cls); - -void RLMVerifyInWriteTransaction(RLMRealm *const realm); - -// -// Adding, Removing, Getting Objects -// - -// add an object to the given realm -void RLMAddObjectToRealm(RLMObjectBase *object, RLMRealm *realm, RLMUpdatePolicy); - -// delete an object from its realm -void RLMDeleteObjectFromRealm(RLMObjectBase *object, RLMRealm *realm); - -// deletes all objects from a realm -void RLMDeleteAllObjectsFromRealm(RLMRealm *realm); - -// get objects of a given class -RLMResults *RLMGetObjects(RLMRealm *realm, NSString *objectClassName, NSPredicate * _Nullable predicate) -NS_RETURNS_RETAINED; - -// get an object with the given primary key -id _Nullable RLMGetObject(RLMRealm *realm, NSString *objectClassName, id _Nullable key) NS_RETURNS_RETAINED; - -// create object from array or dictionary -RLMObjectBase *RLMCreateObjectInRealmWithValue(RLMRealm *realm, NSString *className, - id _Nullable value, RLMUpdatePolicy updatePolicy) -NS_RETURNS_RETAINED; - -// creates an asymmetric object and doesn't return -void RLMCreateAsymmetricObjectInRealm(RLMRealm *realm, NSString *className, id value); - -// -// Accessor Creation -// - - -// Perform the per-property accessor initialization for a managed RealmSwiftObject -// promotingExisting should be true if the object was previously used as an -// unmanaged object, and false if it is a newly created object. -void RLMInitializeSwiftAccessor(RLMObjectBase *object, bool promotingExisting); - -#ifdef __cplusplus -} - -namespace realm { - class Obj; - class Table; - struct ColKey; - struct ObjLink; -} -class RLMClassInfo; - -// get an object with a given table & object key -RLMObjectBase *RLMObjectFromObjLink(RLMRealm *realm, - realm::ObjLink&& objLink, - bool parentIsSwiftObject) NS_RETURNS_RETAINED; - -// Create accessors -RLMObjectBase *RLMCreateObjectAccessor(RLMClassInfo& info, int64_t key) NS_RETURNS_RETAINED; -RLMObjectBase *RLMCreateObjectAccessor(RLMClassInfo& info, const realm::Obj& obj) NS_RETURNS_RETAINED; -#endif - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMObject_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMObject_Private.h deleted file mode 100644 index 8ccdbf576..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMObject_Private.h +++ /dev/null @@ -1,110 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMProperty, RLMArray, RLMSchema; -typedef NS_ENUM(int32_t, RLMPropertyType); - -FOUNDATION_EXTERN void RLMInitializeWithValue(RLMObjectBase *, id, RLMSchema *); - -typedef void (^RLMObjectNotificationCallback)(RLMObjectBase *_Nullable object, - NSArray *_Nullable propertyNames, - NSArray *_Nullable oldValues, - NSArray *_Nullable newValues, - NSError *_Nullable error); - -// RLMObject accessor and read/write realm -@interface RLMObjectBase () { -@public - RLMRealm *_realm; - __unsafe_unretained RLMObjectSchema *_objectSchema; -} - -// shared schema for this class -+ (nullable RLMObjectSchema *)sharedSchema; - -+ (nullable NSArray *)_getProperties; -+ (bool)_realmIgnoreClass; - -// This enables to override the propertiesMapping in Swift, it is not to be used in Objective-C API. -+ (NSDictionary *)propertiesMapping; -@end - -@interface RLMDynamicObject : RLMObject - -@end - -// Calls valueForKey: and re-raises NSUndefinedKeyExceptions -FOUNDATION_EXTERN id _Nullable RLMValidatedValueForProperty(id object, NSString *key, NSString *className); - -// Compare two RLObjectBases -FOUNDATION_EXTERN BOOL RLMObjectBaseAreEqual(RLMObjectBase * _Nullable o1, RLMObjectBase * _Nullable o2); - -FOUNDATION_EXTERN RLMNotificationToken *RLMObjectBaseAddNotificationBlock(RLMObjectBase *obj, - NSArray *_Nullable keyPaths, - dispatch_queue_t _Nullable queue, - RLMObjectNotificationCallback block); - -RLMNotificationToken *RLMObjectAddNotificationBlock(RLMObjectBase *obj, - RLMObjectChangeBlock block, - NSArray *_Nullable keyPaths, - dispatch_queue_t _Nullable queue); - -// Returns whether the class is a descendent of RLMObjectBase -FOUNDATION_EXTERN BOOL RLMIsObjectOrSubclass(Class klass); - -// Returns whether the class is an indirect descendant of RLMObjectBase -FOUNDATION_EXTERN BOOL RLMIsObjectSubclass(Class klass); - -FOUNDATION_EXTERN const NSUInteger RLMDescriptionMaxDepth; - -FOUNDATION_EXTERN id RLMObjectFreeze(RLMObjectBase *obj) NS_RETURNS_RETAINED; - -FOUNDATION_EXTERN id RLMObjectThaw(RLMObjectBase *obj); - -// Gets an object identifier suitable for use with Combine. This value may -// change when an unmanaged object is added to the Realm. -FOUNDATION_EXTERN uint64_t RLMObjectBaseGetCombineId(RLMObjectBase *); - -// An accessor object which is used to interact with Swift properties from obj-c -@interface RLMManagedPropertyAccessor : NSObject -// Perform any initialization required for KVO on a *unmanaged* object -+ (void)observe:(RLMProperty *)property on:(RLMObjectBase *)parent; -// Initialize the given property on a *managed* object which previous was unmanaged -+ (void)promote:(RLMProperty *)property on:(RLMObjectBase *)parent; -// Initialize the given property on a newly created *managed* object -+ (void)initialize:(RLMProperty *)property on:(RLMObjectBase *)parent; -// Read the value of the property, on either kind of object -+ (id)get:(RLMProperty *)property on:(RLMObjectBase *)parent; -// Set the property to the given value, on either kind of object -+ (void)set:(RLMProperty *)property on:(RLMObjectBase *)parent to:(id)value; -@end - -@interface RLMObjectNotificationToken : RLMNotificationToken -- (void)observe:(RLMObjectBase *)obj - keyPaths:(nullable NSArray *)keyPaths - block:(RLMObjectNotificationCallback)block; -- (void)registrationComplete:(void (^)(void))completion; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMProperty_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMProperty_Private.h deleted file mode 100644 index 6a87ced63..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMProperty_Private.h +++ /dev/null @@ -1,139 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -@class RLMObjectBase; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -BOOL RLMPropertyTypeIsComputed(RLMPropertyType propertyType); -FOUNDATION_EXTERN void RLMValidateSwiftPropertyName(NSString *name); - -// Translate an rlmtype to a string representation -static inline NSString *RLMTypeToString(RLMPropertyType type) { - switch (type) { - case RLMPropertyTypeString: - return @"string"; - case RLMPropertyTypeInt: - return @"int"; - case RLMPropertyTypeBool: - return @"bool"; - case RLMPropertyTypeDate: - return @"date"; - case RLMPropertyTypeData: - return @"data"; - case RLMPropertyTypeDouble: - return @"double"; - case RLMPropertyTypeFloat: - return @"float"; - case RLMPropertyTypeAny: - return @"mixed"; - case RLMPropertyTypeObject: - return @"object"; - case RLMPropertyTypeLinkingObjects: - return @"linking objects"; - case RLMPropertyTypeDecimal128: - return @"decimal128"; - case RLMPropertyTypeObjectId: - return @"object id"; - case RLMPropertyTypeUUID: - return @"uuid"; - } - return @"Unknown"; -} - -// private property interface -@interface RLMProperty () { -@public - RLMPropertyType _type; -} - -- (instancetype)initWithName:(NSString *)name - indexed:(BOOL)indexed - linkPropertyDescriptor:(nullable RLMPropertyDescriptor *)linkPropertyDescriptor - property:(objc_property_t)property; - -- (instancetype)initSwiftPropertyWithName:(NSString *)name - indexed:(BOOL)indexed - linkPropertyDescriptor:(nullable RLMPropertyDescriptor *)linkPropertyDescriptor - property:(objc_property_t)property - instance:(RLMObjectBase *)objectInstance; - -- (void)updateAccessors; - -// private setters -@property (nonatomic, readwrite) NSString *name; -@property (nonatomic, readwrite, assign) RLMPropertyType type; -@property (nonatomic, readwrite) BOOL indexed; -@property (nonatomic, readwrite) BOOL optional; -@property (nonatomic, readwrite) BOOL array; -@property (nonatomic, readwrite) BOOL set; -@property (nonatomic, readwrite) BOOL dictionary; -@property (nonatomic, copy, nullable) NSString *objectClassName; -@property (nonatomic, copy, nullable) NSString *linkOriginPropertyName; - -// private properties -@property (nonatomic, readwrite, nullable) NSString *columnName; -@property (nonatomic, assign) NSUInteger index; -@property (nonatomic, assign) BOOL isPrimary; -@property (nonatomic, assign) BOOL isLegacy; -@property (nonatomic, assign) ptrdiff_t swiftIvar; -@property (nonatomic, assign, nullable) Class swiftAccessor; -@property (nonatomic, readwrite, assign) RLMPropertyType dictionaryKeyType; -@property (nonatomic, readwrite) BOOL customMappingIsOptional; - -// getter and setter names -@property (nonatomic, copy) NSString *getterName; -@property (nonatomic, copy) NSString *setterName; -@property (nonatomic, nullable) SEL getterSel; -@property (nonatomic, nullable) SEL setterSel; - -- (RLMProperty *)copyWithNewName:(NSString *)name; -- (NSString *)typeName; - -@end - -@interface RLMProperty (Dynamic) -/** - This method is useful only in specialized circumstances, for example, in conjunction with - +[RLMObjectSchema initWithClassName:objectClass:properties:]. If you are simply building an - app on Realm, it is not recommended to use this method. - - Initialize an RLMProperty - - @warning This method is useful only in specialized circumstances. - - @param name The property name. - @param type The property type. - @param objectClassName The object type used for Object and Array types. - @param linkOriginPropertyName The property name of the origin of a link. Used for linking objects properties. - - @return An initialized instance of RLMProperty. - */ -- (instancetype)initWithName:(NSString *)name - type:(RLMPropertyType)type - objectClassName:(nullable NSString *)objectClassName - linkOriginPropertyName:(nullable NSString *)linkOriginPropertyName - indexed:(BOOL)indexed - optional:(BOOL)optional; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMPushClient_Private.hpp b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMPushClient_Private.hpp deleted file mode 100644 index 44304c9c3..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMPushClient_Private.hpp +++ /dev/null @@ -1,28 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import "RLMPushClient.h" - -namespace realm::app { -class PushClient; -} - -RLM_DIRECT_MEMBERS -@interface RLMPushClient () -- (instancetype)initWithPushClient:(realm::app::PushClient&&)pushClient; -@end diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMRealmConfiguration_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMRealmConfiguration_Private.h deleted file mode 100644 index 12b09676d..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMRealmConfiguration_Private.h +++ /dev/null @@ -1,52 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2015 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMSchema, RLMEventConfiguration; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMRealmConfiguration () - -@property (nonatomic, readwrite) bool cache; -@property (nonatomic, readwrite) bool dynamic; -@property (nonatomic, readwrite) bool disableFormatUpgrade; -@property (nonatomic, copy, nullable) RLMSchema *customSchema; -@property (nonatomic, copy) NSString *pathOnDisk; -@property (nonatomic, retain, nullable) RLMEventConfiguration *eventConfiguration; -@property (nonatomic, nullable) Class migrationObjectClass; -@property (nonatomic) bool disableAutomaticChangeNotifications; - -// Flexible Sync -@property (nonatomic, readwrite, nullable) RLMFlexibleSyncInitialSubscriptionsBlock initialSubscriptions; -@property (nonatomic, readwrite) BOOL rerunOnOpen; - -// Get the default configuration without copying it -+ (RLMRealmConfiguration *)rawDefaultConfiguration; - -+ (void)resetRealmConfigurationState; - -- (void)setCustomSchemaWithoutCopying:(nullable RLMSchema *)schema; -@end - -// Get a path in the platform-appropriate documents directory with the given filename -FOUNDATION_EXTERN NSString *RLMRealmPathForFile(NSString *fileName); -FOUNDATION_EXTERN NSString *RLMRealmPathForFileAndBundleIdentifier(NSString *fileName, NSString *mainBundleIdentifier); - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMRealm_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMRealm_Private.h deleted file mode 100644 index 95841491f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMRealm_Private.h +++ /dev/null @@ -1,94 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMFastEnumerator, RLMScheduler, RLMAsyncRefreshTask, RLMAsyncWriteTask; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -// Disable syncing files to disk. Cannot be re-enabled. Use only for tests. -FOUNDATION_EXTERN void RLMDisableSyncToDisk(void); -// Set whether the skip backup attribute should be set on temporary files. -FOUNDATION_EXTERN void RLMSetSkipBackupAttribute(bool value); - -FOUNDATION_EXTERN NSData * _Nullable RLMRealmValidatedEncryptionKey(NSData *key); - -// Set the queue used for async open. For testing purposes only. -FOUNDATION_EXTERN void RLMSetAsyncOpenQueue(dispatch_queue_t queue); - -// Translate an in-flight exception resulting from an operation on a SharedGroup to -// an NSError or NSException (if error is nil) -void RLMRealmTranslateException(NSError **error); - -// Block until the Realm at the given path is closed. -FOUNDATION_EXTERN void RLMWaitForRealmToClose(NSString *path); -BOOL RLMIsRealmCachedAtPath(NSString *path); - -// Register a block to be called from the next before_notify() invocation -FOUNDATION_EXTERN void RLMAddBeforeNotifyBlock(RLMRealm *realm, dispatch_block_t block); - -// Test hook to run the async notifiers for a Realm which has the background thread disabled -FOUNDATION_EXTERN void RLMRunAsyncNotifiers(NSString *path); - -// Get the cached Realm for the given configuration and scheduler, if any -FOUNDATION_EXTERN RLMRealm *_Nullable RLMGetCachedRealm(RLMRealmConfiguration *, RLMScheduler *) NS_RETURNS_RETAINED; -// Get a cached Realm for the given configuration and any scheduler. The returned -// Realm is not confined to the current thread, so very few operations are safe -// to perform on it -FOUNDATION_EXTERN RLMRealm *_Nullable RLMGetAnyCachedRealm(RLMRealmConfiguration *) NS_RETURNS_RETAINED; - -// Scheduler an async refresh for the given Realm -FOUNDATION_EXTERN RLMAsyncRefreshTask *_Nullable RLMRealmRefreshAsync(RLMRealm *rlmRealm) NS_RETURNS_RETAINED; - -// RLMRealm private members -@interface RLMRealm () -@property (nonatomic, readonly) BOOL dynamic; -@property (nonatomic, readwrite) RLMSchema *schema; -@property (nonatomic, readonly, nullable) id actor; -@property (nonatomic, readonly) bool isFlexibleSync; - -+ (void)resetRealmState; - -- (void)registerEnumerator:(RLMFastEnumerator *)enumerator; -- (void)unregisterEnumerator:(RLMFastEnumerator *)enumerator; -- (void)detachAllEnumerators; - -- (void)sendNotifications:(RLMNotification)notification; -- (void)verifyThread; -- (void)verifyNotificationsAreSupported:(bool)isCollection; - -- (RLMRealm *)frozenCopy NS_RETURNS_RETAINED; - -+ (nullable instancetype)realmWithConfiguration:(RLMRealmConfiguration *)configuration - confinedTo:(RLMScheduler *)options - error:(NSError **)error; - -- (RLMAsyncWriteTask *)beginAsyncWrite NS_RETURNS_RETAINED; -- (void)commitAsyncWriteWithGrouping:(bool)allowGrouping - completion:(void(^)(NSError *_Nullable))completion; -@end - -@interface RLMPinnedRealm : NSObject -@property (nonatomic, readonly) RLMRealmConfiguration *configuration; - -- (instancetype)initWithRealm:(RLMRealm *)realm; -- (void)unpin; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMResults_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMResults_Private.h deleted file mode 100644 index c7e29bebb..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMResults_Private.h +++ /dev/null @@ -1,33 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectSchema; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMResults () -@property (nonatomic, readonly, getter=isAttached) BOOL attached; - -+ (instancetype)emptyDetachedResults; -- (RLMResults *)snapshot; - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMScheduler.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMScheduler.h deleted file mode 100644 index 3c1b9874b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMScheduler.h +++ /dev/null @@ -1,63 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#ifdef __cplusplus -#include -namespace realm::util { -class Scheduler; -} -#endif - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -// A serial work queue of some sort which represents a thread-confinement context -// of some sort which blocks can be invoked inside. Realms are confined to a -// scheduler, which can be a thread (actually a run loop), a dispatch queue, or -// an actor. The scheduler ensures that the Realm is only used on one thread at -// a time, and allows us to dispatch work to the thread where we can access the -// Realm safely. -RLM_SWIFT_SENDABLE // is immutable -@interface RLMScheduler : NSObject -+ (RLMScheduler *)mainRunLoop __attribute__((objc_direct)); -+ (RLMScheduler *)currentRunLoop __attribute__((objc_direct)); -// A scheduler for the given queue if it's non-nil, and currentRunLoop otherwise -+ (RLMScheduler *)dispatchQueue:(nullable dispatch_queue_t)queue; -+ (RLMScheduler *)actor:(id)actor invoke:(void (^)(dispatch_block_t))invoke - verify:(void (^)(void))verify; - -// Invoke the block on this scheduler. Currently not actually implement for run -// loop schedulers. -- (void)invoke:(dispatch_block_t)block; - -// Cache key for this scheduler suitable for use with NSMapTable. Only valid -// when called from the current scheduler. -- (void *)cacheKey; - -- (nullable id)actor; - -#ifdef __cplusplus -// The object store Scheduler corresponding to this scheduler -- (std::shared_ptr)osScheduler; -#endif -@end - -FOUNDATION_EXTERN void RLMSetMainActor(id actor); - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMSchema_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMSchema_Private.h deleted file mode 100644 index f4f63c9f8..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMSchema_Private.h +++ /dev/null @@ -1,58 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@class RLMRealm; - -// -// RLMSchema private interface -// -@interface RLMSchema () - -/** - Returns an `RLMSchema` containing only the given `RLMObject` subclasses. - - @param classes The classes to be included in the schema. - - @return An `RLMSchema` containing only the given classes. - */ -+ (instancetype)schemaWithObjectClasses:(NSArray *)classes; - -@property (nonatomic, readwrite, copy) NSArray *objectSchema; - -// schema based on runtime objects -+ (instancetype)sharedSchema; - -// schema based upon all currently registered object classes -+ (instancetype)partialSharedSchema; - -// private schema based upon all currently registered object classes. -// includes classes that are excluded from the default schema. -+ (instancetype)partialPrivateSharedSchema; - -// class for string -+ (nullable Class)classForString:(NSString *)className; - -+ (nullable RLMObjectSchema *)sharedSchemaForClass:(Class)cls; - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMSet_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMSet_Private.h deleted file mode 100644 index 1053e0a0f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMSet_Private.h +++ /dev/null @@ -1,43 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -@class RLMObjectBase, RLMProperty; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMSet () -- (instancetype)initWithObjectClassName:(NSString *)objectClassName; -- (instancetype)initWithObjectType:(RLMPropertyType)type optional:(BOOL)optional; -- (NSString *)descriptionWithMaxDepth:(NSUInteger)depth; -- (void)setParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -// YES if the property is declared with old property syntax. -@property (nonatomic, readonly) BOOL isLegacyProperty; -// The name of the property which this collection represents -@property (nonatomic, readonly) NSString *propertyKey; -@end - -void RLMSetValidateMatchingObjectType(RLMSet *set, id value); - -@interface RLMManagedSet : RLMSet -- (instancetype)initWithParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMSwiftCollectionBase.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMSwiftCollectionBase.h deleted file mode 100644 index a4f864282..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMSwiftCollectionBase.h +++ /dev/null @@ -1,46 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectBase, RLMResults, RLMProperty, RLMLinkingObjects; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMSwiftCollectionBase : NSProxy -@property (nonatomic, strong) id _rlmCollection; - -- (instancetype)init; -+ (Class)_backingCollectionType; -- (instancetype)initWithCollection:(id)collection; - -- (nullable id)valueForKey:(NSString *)key; -- (nullable id)valueForKeyPath:(NSString *)keyPath; -- (BOOL)isEqual:(nullable id)object; -@end - -@interface RLMLinkingObjectsHandle : NSObject -- (instancetype)initWithObject:(RLMObjectBase *)object property:(RLMProperty *)property; -- (instancetype)initWithLinkingObjects:(RLMResults *)linkingObjects; - -@property (nonatomic, readonly) RLMLinkingObjects *results; -@property (nonatomic, readonly) NSString *_propertyKey; -@property (nonatomic, readonly) BOOL _isLegacyProperty; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMSwiftSupport.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMSwiftSupport.h deleted file mode 100644 index 530f0edbf..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMSwiftSupport.h +++ /dev/null @@ -1,30 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMSwiftSupport : NSObject - -+ (BOOL)isSwiftClassName:(NSString *)className; -+ (NSString *)demangleClassName:(NSString *)className; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMSwiftValueStorage.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMSwiftValueStorage.h deleted file mode 100644 index ef3efc610..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMSwiftValueStorage.h +++ /dev/null @@ -1,53 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectBase, RLMProperty; - -/// This class implements the backing storage for `RealmProperty<>` and `RealmOptional<>`. -/// This class should not be subclassed or used directly. -@interface RLMSwiftValueStorage : NSProxy -- (instancetype)init; -@end -/// Retrieves the value that is stored, or nil if it is empty. -FOUNDATION_EXTERN id _Nullable RLMGetSwiftValueStorage(RLMSwiftValueStorage *); -/// Sets a value on the property this instance represents for an object. -FOUNDATION_EXTERN void RLMSetSwiftValueStorage(RLMSwiftValueStorage *, id _Nullable); - -/// Initialises managed accessors on an instance of `RLMSwiftValueStorage` -/// @param parent The enclosing parent object. -/// @param prop The property which this class represents. -FOUNDATION_EXTERN void RLMInitializeManagedSwiftValueStorage(RLMSwiftValueStorage *, - RLMObjectBase *parent, - RLMProperty *prop); - -/// Initialises unmanaged accessors on an instance of `RLMSwiftValueStorage` -/// @param parent The enclosing parent object. -/// @param prop The property which this class represents. -FOUNDATION_EXTERN void RLMInitializeUnmanagedSwiftValueStorage(RLMSwiftValueStorage *, - RLMObjectBase *parent, - RLMProperty *prop); - -/// Gets the property name for the RealmProperty instance. This is required for tracing the key path on -/// objects that use the legacy property declaration syntax. -FOUNDATION_EXTERN NSString *RLMSwiftValueStorageGetPropertyName(RLMSwiftValueStorage *); - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMSyncConfiguration_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMSyncConfiguration_Private.h deleted file mode 100644 index 62d0e1f1f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMSyncConfiguration_Private.h +++ /dev/null @@ -1,47 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -typedef RLM_CLOSED_ENUM(NSUInteger, RLMSyncStopPolicy) { - RLMSyncStopPolicyImmediately, - RLMSyncStopPolicyLiveIndefinitely, - RLMSyncStopPolicyAfterChangesUploaded, -}; - - -@class RLMSchema; - -@interface RLMSyncConfiguration () - -// Flexible sync -- (instancetype)initWithUser:(RLMUser *)user; -// Partition-based sync -- (instancetype)initWithUser:(RLMUser *)user - partitionValue:(nullable id)partitionValue; - -// Internal-only APIs -@property (nonatomic, readwrite) RLMSyncStopPolicy stopPolicy; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMSyncSubscription_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMSyncSubscription_Private.h deleted file mode 100644 index dc438a20e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMSyncSubscription_Private.h +++ /dev/null @@ -1,70 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -#pragma mark - Subscription - -@interface RLMSyncSubscription () - -@property (nonatomic, readonly) RLMObjectId *identifier; - -@property (nonatomic, readonly) NSString *queryString; - -@property (nonatomic, readonly) NSString *objectClassName; - -@end - -#pragma mark - SubscriptionSet - -@interface RLMSyncSubscriptionEnumerator : NSObject - -@property (nonatomic, readonly) RLMSyncSubscriptionSet *subscriptionSet; - -- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state - count:(NSUInteger)len; - -- (instancetype)initWithSubscriptionSet:(RLMSyncSubscriptionSet *)subscriptionSet; - -@end - -@interface RLMSyncSubscriptionSet () - -@property (readonly) uint64_t version; - -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - subscriptionName:(nullable NSString *)name - predicate:(NSPredicate *)predicate - updateExisting:(BOOL)updateExisting; - -- (void)waitForSynchronizationOnQueue:(nullable dispatch_queue_t)queue - completionBlock:(void(^)(NSError *))completionBlock; - -- (RLMSyncSubscriptionEnumerator *)fastEnumerator; - -NSUInteger RLMFastEnumerate(NSFastEnumerationState *state, - NSUInteger len, - RLMSyncSubscriptionSet *collection); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMUser_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMUser_Private.h deleted file mode 100644 index f62c9a940..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/PrivateHeaders/RLMUser_Private.h +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// Observer block for user notifications. -typedef void(^RLMUserNotificationBlock)(RLMUser *); - -/// Token that identifies an observer. Unsubscribes when deconstructed to -/// avoid dangling observers, therefore this must be retained to hold -/// onto a subscription. -@interface RLMUserSubscriptionToken : NSObject -- (void)unsubscribe; -@end - -@interface RLMUser () -/// Subscribe to notifications for this RLMUser. -- (RLMUserSubscriptionToken *)subscribe:(RLMUserNotificationBlock)block; - -- (void)logOut; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Realm b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Realm deleted file mode 100755 index 36880b3a8..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64/Realm.framework/Realm and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/CHANGELOG.md b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/CHANGELOG.md deleted file mode 100644 index 00cc01244..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/CHANGELOG.md +++ /dev/null @@ -1,9539 +0,0 @@ -10.42.3 Release notes (2023-09-18) -============================================================= - -### Enhancements - -* Update packaging for the Xcode 15.0 release. Carthage release and obj-c - binaries are now built with Xcode 15. - -### Fixed - -* The prebuilt Realm.xcframework for SPM was packaged incorrectly and did not - work ([#8361](https://github.com/realm/realm-swift/issues/8361), since v10.42.1). - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 15.0.0. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15.0.0. - -10.42.2 Release notes (2023-09-13) -============================================================= - -### Enhancements - -* Add support for logging messages sent by the server. - ([Core #6476](https://github.com/realm/realm-core/pull/6476)) -* Unknown protocol errors received from the baas server will no longer cause - the application to crash if a valid error action is also received. Unknown - error actions will be treated as an ApplicationBug error action and will - cause sync to fail with an error via the sync error handler. - ([Core #6885](https://github.com/realm/realm-core/pull/6885)) -* Some sync error messages now contain more information about what went wrong. - -### Fixed - -* The `MultipleSyncAgents` exception from opening a synchronized Realm in - multiple processes at once no longer leaves the sync client in an invalid - state. ([Core #6868](https://github.com/realm/realm-core/pull/6868), since v10.36.0) -* Testing the size of a collection of links against zero would sometimes fail - (sometimes = "difficult to explain"). In particular: - ([Core #6850](https://github.com/realm/realm-core/issues/6850), since v10.41.0) -* When async writes triggered a file compaction some internal state could be - corrupted, leading to later crashes in the slab allocator. This typically - resulted in the "ref + size <= next->first" assertion failure, but other - failures were possible. Many issues reported; see [Core #6340](https://github.com/realm/realm-core/issues/6340). - (since 10.35.0) -* `Realm.Configuration.maximumNumberOfActiveVersions` now handles intermediate - versions which have been cleaned up correctly and checks the number of live - versions rather than the number of versions between the oldest live version - and current version (since 10.35.0). -* If the client disconnected between uploading a change to flexible sync - subscriptions and receiving the new object data from the server resulting - from that subscription change, the next connection to the server would - sometimes result in a client reset - ([Core #6966](https://github.com/realm/realm-core/issues/6966), since v10.21.1). - -### Deprecations - -* `RLMApp` has `localAppName` and `localAppVersion` fields which never ended up - being used for anything and are now deprecated. -* `RLMSyncAuthError` has not been used since v10.0.0 and is now deprecated. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 7. - -### Internal - -* Upgraded realm-core from 13.17.1 to 13.20.1 - -10.42.1 Release notes (2023-08-28) -============================================================= - -### Fixed - -* The names of the prebuilt zips for SPM have changed to avoid having Carthage - download them instead of the intended Carthage zip - ([#8326](https://github.com/realm/realm-swift/issues/8326), since v10.42.0). -* The prebuild Realm.xcframework for SwiftPM now has all platforms other than - visionOS built with Xcode 14 to comply with app store rules - ([#8339](https://github.com/realm/realm-swift/issues/8339), since 10.42.0). -* Fix visionOS compilation with Xcode beta 7. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 7. - -10.42.0 Release notes (2023-07-30) -============================================================= - -### Enhancements - -* Add support for building for visionOS and add Xcode 15 binaries to the - release package. visionOS currently requires installing Realm via either - Swift Package Manager or by using a XCFramework as CocoaPods and Carthage do - not yet support it. -* Zips compatible with SPM's `.binaryTarget()` are now published as part of the - releases on Github. -* Prebuilt XCFrameworks are now built with LTO enabled. This has insignificant - performance benefits, but cuts the size of the library by ~15%. - -### Fixed - -* Fix nested properties observation on a `Projections` not notifying when there is a property change. - ([#8276](https://github.com/realm/realm-swift/issues/8276), since v10.34.0). -* Fix undefined symbol error for `UIKit` when linking Realm to a framework using SPM. - ([#8308](https://github.com/realm/realm-swift/issues/8308), since v10.41.0) -* If the app crashed at exactly the wrong time while opening a freshly - compacted Realm the file could be left in an invalid state - ([Core #6807](https://github.com/realm/realm-core/pull/6807), since v10.33.0). -* Sync progress for DOWNLOAD messages was sometimes stored incorrectly, - resulting in an extra round trip to the server. - ([Core #6827](https://github.com/realm/realm-core/issues/6827), since v10.31.0) - -### Breaking Changes - -* Legacy non-xcframework Carthage installations are no longer supported. Please - ensure you are using `--use-xcframeworks` if installing via Carthage. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 5. - -### Internal - -* Upgraded realm-core from 13.17.0 to 13.17.1 -* Release packages were being uploaded to several static.realm.io URLs which - are no longer linked to anywhere. These are no longer being updated, and - release packages are now only being uploaded to Github. - -10.41.1 Release notes (2023-07-17) -============================================================= - -### Enhancements - -* Filesystem errors now include more information in the error message. -* Sync connection and session reconnect timing/backoff logic has been reworked - and unified into a single implementation. Previously some categories of errors - would cause an hour-long wait before attempting to reconnect, while others - would use an exponential backoff strategy. All errors now result in the sync - client waiting for 1 second before retrying, doubling the wait after each - subsequent failure up to a maximum of five minutes. If the cause of the error - changes, the backoff will be reset. If the sync client voluntarily disconnects, - no backoff will be used. ([Core #6526]((https://github.com/realm/realm-core/pull/6526))) - -### Fixed - -* Removed warnings for deprecated APIs internal use. - ([#8251](https://github.com/realm/realm-swift/issues/8251), since v10.39.0) -* Fix an error during async open and client reset if properties have been added - to the schema. This fix also applies to partition-based to flexible sync - migration if async open is used. ([Core #6707](https://github.com/realm/realm-core/issues/6707), since v10.28.2) - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 4. - -### Internal - -* Upgraded realm-core from 13.15.1 to 13.17.0 -* The location where prebuilt core binaries are published has changed slightly. - If you are using `REALM_BASE_URL` to mirror the binaries, you may need to - adjust your mirroring logic. - -10.41.0 Release notes (2023-06-26) -============================================================= - -### Enhancements - -* Add support for multiplexing sync connections. When enabled (the default), a single - connection is used per sync user rather than one per synchronized Realm. This - reduces resource consumption when multiple Realms are opened and will - typically improve performance ([PR #8282](https://github.com/realm/realm-swift/pull/8282)). -* Sync timeout options can now be set on `RLMAppConfiguration` along with the - other app-wide configuration settings ([PR #8282](https://github.com/realm/realm-swift/pull/8282)). - -### Fixed - -* Import as `RLMRealm_Private.h` as a module would cause issues when using Realm as a subdependency. - ([#8164](https://github.com/realm/realm-swift/issues/8164), since 10.37.0) -* Disable setting a custom logger by default on the sync client when the sync manager is created. - This was overriding the default logger set using `RLMLogger.defaultLogger`. (since v10.39.0). - -### Breaking Changes - -* The `RLMSyncTimeouts.appConfiguration` property has been removed. This was an - unimplemented read-only property which did not make any sense on the - containing type ([PR #8282](https://github.com/realm/realm-swift/pull/8282)). - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 2. - -### Internal - -* Upgraded realm-core from 13.15.0 to 13.15.1 - -10.40.2 Release notes (2023-06-09) -============================================================= - -### Enhancements - -* `Actor.preconditionIsolated()` is now used for runtime actor checking when - available (i.e. building with Xcode 15 and running on iOS 17) rather than the - less reliable workaround. - -### Fixed - -* If downloading the fresh Realm file failed during a client reset on a - flexible sync Realm, the sync client would crash the next time the Realm was - opened. ([Core #6494](https://github.com/realm/realm-core/issues/6494), since v10.28.2) -* If the order of properties in the local class definitions did not match the - order in the server-side schema, the before-reset Realm argument passed to a - client reset handler would have an invalid schema and likely crash if any - data was read from it. ([Core #6693](https://github.com/realm/realm-core/issues/6693), since v10.40.0) - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 1. - -### Internal - -* Upgraded realm-core from 13.13.0 to 13.15.0. -* The prebuilt library used for CocoaPods installations is now built with Xcode - 14. This should not have any observable effects other than the download being - much smaller due to no longer including bitcode. - -10.40.1 Release notes (2023-06-06) -============================================================= - -### Enhancements - -* Fix compilation with Xcode 15. Note that iOS 12 is the minimum supported - deployment target when using Xcode 15. -* Switch to building the Carthage release with Xcode 14.3.1. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 1. - -### Internal - -* Overhauled SDK metrics collection to better drive future development efforts. - -10.40.0 Release notes (2023-05-26) -============================================================= - -Drop support for Xcode 13 and add Xcode 14.3.1. Xcode 14.1 is now the minimum -supported version. - -### Enhancements - -* Adjust the error message for private `Object` subclasses and subclasses - nested inside other types to explain how to make them work rather than state - that it's impossible. ([#5662](https://github.com/realm/realm-cocoa/issues/5662)). -* Improve performance of SectionedResults. With a single section it is now ~10% - faster, and the runtime of sectioning no longer scales significantly with - section count, giving >100% speedups when there are large numbers of sections - ([Core #6606](https://github.com/realm/realm-core/pull/6606)). -* Very slightly improve performance of runtime thread checking on the main - thread. ([Core #6606](https://github.com/realm/realm-core/pull/6606)) - -### Fixed - -* Allow support for implicit boolean queries on Swift's Type Safe Queries API - ([#8212](https://github.com/realm/realm-swift/issues/8212)). -* Fixed a fatal error (reported to the sync error handler) during client reset - or automatic partition-based to flexible sync migration if the reset has been - triggered during an async open and the schema being applied has added new - classes. Due to this bug automatic flexibly sync migration has been disabled - for older releases and this is now the minimum version required. - ([#6601](https://github.com/realm/realm-core/issues/6601), since automatic - client resets were introduced in v10.25.0) -* Dictionaries sometimes failed to map unresolved links to nil. If the target - of a link in a dictionary was deleted by another sync client, reading that - field from the dictionary would sometimes give an invalid object rather than - nil. In addition, queries on dictionaries would sometimes have incorrect - results. ([Core #6644](https://github.com/realm/realm-core/pull/6644), since v10.8.0) -* Older versions of Realm would sometimes fail to properly mark objects as - being the target of an incoming link from another object. When this happened, - deleting the target object would hit an assertion failure due to the - inconsistent state. We now reconstruct a valid state rather than crashing. - ([Core #6585](https://github.com/realm/realm-core/issues/6585), since v5.0.0) -* Fix several UBSan failures which did not appear to result in functional bugs - ([Core #6649](https://github.com/realm/realm-core/pull/6649)). -* Using both synchronous and asynchronous transactions on the same thread or - scheduler could hit the assertion failure "!realm.is_in_transaction()" if one - of the callbacks for an asynchronous transaction happened to be scheduled - during a synchronous transaction - ([Core #6659](https://github.com/realm/realm-core/issues/6659), since v10.26.0) -* The stored deployment location for Apps was not being updated correctly after - receiving a redirect response from the server, resulting in every connection - attempting to connect to the old URL and getting redirected rather than only - the first connection after the deployment location changed. - ([Core #6630](https://github.com/realm/realm-core/issues/6630), since v10.38.2) - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-14.3.1. - -### Internal - -* Upgraded realm-core from 13.10.1 to 13.13.0. - -10.39.1 Release notes (2023-05-05) -============================================================= - -### Enhancements - -* New notifiers can now be registered in write transactions until changes have - actually been made in the write transaction. This makes it so that new - notifications can be registered inside change notifications triggered by - beginning a write transaction (unless a previous callback performed writes). - ([#4818](https://github.com/realm/realm-swift/issues/4818)). -* Reduce the memory footprint of an automatic (discard or recover) client reset - when there are large incoming changes from the server. - ([Core #6567](https://github.com/realm/realm-core/issues/6567)). - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from 13.10.0 to 13.10.1. - -10.39.0 Release notes (2023-05-03) -============================================================= - -### Enhancements - -* Add support for actor-isolated Realms, opened with `try await Realm(actor: actor)`. - - Rather than being confined to the current thread or a dispatch queue, - actor-isolated Realms are isolated to an actor. This means that they can be - used from any thread as long as it's within a function isolated to that - actor, and they remain valid over suspension points where a task may hop - between threads. Actor-isolated Realms can be used with either global or - local actors: - - ```swift - @MainActor function mainThreadFunction() async throws { - // These are identical: the async init continues to produce a - // MainActor-confined Realm if no actor is supplied - let realm1 = try await Realm() - let realm2 = try await Realm(MainActor.shared) - } - - // A simple example of a custom global actor - @globalActor actor BackgroundActor: GlobalActor { - static var shared = BackgroundActor() - } - - @BackgroundActor backgroundThreadFunction() async throws { - // Explicitly specifying the actor is required for everything but MainActor - let realm = try await Realm(actor: BackgroundActor.shared) - try await realm.write { - _ = realm.create(MyObject.self) - } - // Thread-confined Realms would sometimes throw an exception here, as we - // may end up on a different thread after an `await` - print("\(realm.objects(MyObject.self).count)") - } - - actor MyActor { - // An implicitly-unwrapped optional is used here to let us pass `self` to - // `Realm(actor:)` within `init` - var realm: Realm! - init() async throws { - realm = try await Realm(actor: self) - } - - var count: Int { - realm.objects(MyObject.self).count - } - - func create() async throws { - try await realm.asyncWrite { - realm.create(MyObject.self) - } - } - } - - // This function isn't isolated to the actor, so each operation has to be async - func createObjects() async throws { - let actor = try await MyActor() - for _ in 0..<5 { - await actor.create() - } - print("\(await actor.count)") - } - - // In an isolated function, an actor-isolated Realm can be used synchronously - func createObjects(in actor: isolated MyActor) async throws { - await actor.realm.write { - actor.realm.create(MyObject.self) - } - print("\(actor.realm.objects(MyObject.self).count)") - } - ``` - - Actor-isolated Realms come with a more convenient syntax for asynchronous - writes. `try await realm.write { ... }` will suspend the current task, - acquire the write lock without blocking the current thread, and then invoke - the block. The actual data is then written to disk on a background thread, - and the task is resumed once that completes. As this does not block the - calling thread while waiting to write and does not perform i/o on the calling - thread, this will often be safe to use from `@MainActor` functions without - blocking the UI. Sufficiently large writes may still benefit from being done - on a background thread. - - Asynchronous writes are only supported for actor-isolated Realms or in - `@MainActor` functions. - - Actor-isolated Realms require Swift 5.8 (Xcode 14.3). Enabling both strict - concurrency checking (`SWIFT_STRICT_CONCURRENCY=complete` in Xcode) and - runtime actor data race detection (`OTHER_SWIFT_FLAGS=-Xfrontend - -enable-actor-data-race-checks`) is strongly recommended when using - actor-isolated Realms. -* Add support for automatic partition-based to flexible sync migration. - Connecting to a server-side app configured to use flexible sync with a - client-side partition-based sync configuration is now supported, and will - automatically create the appropriate flexible sync subscriptions to subscribe - to the requested partition. This allows changing the configuration on the - server from partition-based to flexible without breaking existing clients. - ([Core #6554](https://github.com/realm/realm-core/issues/6554)) -* Now you can use an array `[["_id": 1], ["breed": 0]]` as sorting option for a - MongoCollection. This new API fixes the issue where the resulting documents - when using more than one sort parameter were not consistent between calls. - ([#7188](https://github.com/realm/realm-swift/issues/7188), since v10.0.0). -* Add support for adding a user created default logger, which allows implementing your own logging logic - and the log threshold level. - You can define your own logger creating an instance of `Logger` and define the log function which will be - invoked whenever there is a log message. - - ```swift - let logger = Logger(level: .all) { level, message in - print("Realm Log - \(level): \(message)") - } - ``` - - Set this custom logger as Realm default logger using `Logger.shared`. - ```swift - Logger.shared = logger - ``` -* It is now possible to change the default log threshold level at any point of the application's lifetime. - ```swift - Logger.shared.logLevel = .debug - ``` - This will override the log level set anytime before by a user created logger. -* We have set `.info` as the default log threshold level for Realm. You will now see some - log message in your console. To disable use `Logger.shared.level = .off`. - -### Fixed - -* Several schema initialization functions had incorrect `@MainActor` - annotations, resulting in runtime warnings if the first time a Realm was - opened was on a background thread - ([#8222](https://github.com/realm/realm-swift/issues/8222), since v10.34.0). - -### Deprecations - -* `App.SyncManager.logLevel` and `App.SyncManager.logFunction` are deprecated in favour of - setting a default logger. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from v13.9.4 to v13.10.0. - -10.38.3 Release notes (2023-04-28) -============================================================= - -### Enhancements - -* Improve performance of cancelling a write transactions after making changes. - If no KVO observers are used this is now constant time rather than taking - time proportional to the number of changes to be rolled back. Cancelling a - write transaction with KVO observers is 10-20% faster. ([Core PR #6513](https://github.com/realm/realm-core/pull/6513)). - -### Fixed - -* Performing a large number of queries without ever performing a write resulted - in steadily increasing memory usage, some of which was never fully freed due - to an unbounded cache ([#7978](https://github.com/realm/realm-swift/issues/7978), since v10.27.0). - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from 13.9.3 to 13.9.4 - -10.38.2 Release notes (2023-04-25) -============================================================= - -### Enhancements - -* Improve performance of equality queries on a non-indexed AnyRealmValue - property by about 30%. ([Core #6506](https://github.com/realm/realm-core/issues/6506)) - -### Fixed - -* SSL handshake errors were treated as fatal errors rather than errors which - should be retried. ([Core #6434](https://github.com/realm/realm-core/issues/6434), since v10.35.0) - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from 13.9.0 to 13.9.3. - -10.38.1 Release notes (2023-04-25) -============================================================= - -### Fixed - -* The error handler set on EventsConfiguration was not actually used (since v10.26.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -10.38.0 Release notes (2023-03-31) -============================================================= - -Switch to building the Carthage release with Xcode 14.3. - -### Enhancements - -* Add Xcode 14.3 binaries to the release package. Note that CocoaPods 1.12.0 - does not support Xcode 14.3. -* Add support for sharing encrypted Realms between multiple processes. - ([Core #1845](https://github.com/realm/realm-core/issues/1845)) - -### Fixed - -* Fix a memory leak reported by Instruments on `URL.path` in - `Realm.Configuration.fileURL` when using a string partition key in Partition - Based Sync ([#8195](https://github.com/realm/realm-swift/pull/8195)), since v10.0.0). -* Fix a data race in version management. If one thread committed a write - transaction which increased the number of live versions above the previous - highest seen during the current session at the same time as another thread - began a read, the reading thread could read from a no-longer-valid memory - mapping. This could potentially result in strange crashes when opening, - refreshing, freezing or thawing a Realm - ([Core #6411](https://github.com/realm/realm-core/pull/6411), since v10.35.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from 13.8.0 to 13.9.0. - -10.37.2 Release notes (2023-03-29) -============================================================= - -### Fixed - -* Copying a `RLMRealmConfiguration` failed to copy several fields. This - resulted in migrations being passed the incorrect object type in Swift when - using the default configuration (since v10.34.0) or async open (since - v10.37.0). This also broke using the Events API in those two scenarios (since - v10.26.0 for default configuration and v10.37.0 for async open). ([#8190](https://github.com/realm/realm-swift/issues/8190)) - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -10.37.1 Release notes (2023-03-27) -============================================================= - -### Enhancements - -* Performance improvement for the following queries ([Core #6376](https://github.com/realm/realm-core/issues/6376)): - * Significant (~75%) improvement when counting (`Results.count`) the number - of exact matches (with no other query conditions) on a - string/int/UUID/ObjectID property that has an index. This improvement - will be especially noticiable if there are a large number of results - returned (duplicate values). - * Significant (~99%) improvement when querying for an exact match on a Date - property that has an index. - * Significant (~99%) improvement when querying for a case insensitive match - on an AnyRealmValue property that has an index. - * Moderate (~25%) improvement when querying for an exact match on a Bool - property that has an index. - * Small (~5%) improvement when querying for a case insensitive match on an - AnyRealmValue property that does not have an index. - -### Fixed - -* Add missing `@Sendable` annotations to several sync and app services related - callbacks ([PR #8169](https://github.com/realm/realm-swift/pull/8169), since v10.34.0). -* Fix some bugs in handling task cancellation for async Realm init. Some very - specific timing windows could cause crashes, and the download would not be - cancelled if the Realm was already open ([PR #8178](https://github.com/realm/realm-swift/pull/8178), since v10.37.0). -* Fix a crash when querying an AnyRealmValue property with a string operator - (contains/like/beginswith/endswith) or with case insensitivity. - ([Core #6376](https://github.com/realm/realm-core/issues/6376), since v10.8.0) -* Querying for case-sensitive equality of a string on an indexed AnyRealmValue - property was returning case insensitive matches. For example querying for - `myIndexedAny == "Foo"` would incorrectly match on values of "foo" or "FOO" etc. - ([Core #6376](https://github.com/realm/realm-core/issues/6376), since v10.8.0) -* Adding an index to an AnyRealmValue property when objects of that type - already existed would crash with an assertion. - ([Core #6376](https://github.com/realm/realm-core/issues/6376), since v10.8.0). -* Fix a bug that may have resulted in arrays being in different orders on - different devices. Some cases of “Invalid prior_size” may be fixed too. - ([Core #6191](https://github.com/realm/realm-core/issues/6191), since v10.25.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -### Internal - -* Upgraded realm-core from 13.6.0 to 13.8.0 - -10.37.0 Release notes (2023-03-09) -============================================================= - -### Enhancements - -* `MongoCollection.watch().subscribe(on:)` now supports any swift Scheduler - rather than only dispatch queues ([PR #8131](https://github.com/realm/realm-swift/pull/8130)). -* Add an async sequence wrapper for `MongoCollection.watch()`, allowing you to - do `for try await change in collection.changeEvents { ... }` - ([PR #8131](https://github.com/realm/realm-swift/pull/8130)). -* The internals of error handling and reporting have been significantly - reworked. The visible effects of this are that some errors which previously - had unhelpful error messages now include more detail about what went wrong, - and App errors now expose a much more complete set of error codes - ([PR #8002](https://github.com/realm/realm-swift/pull/8002)). -* Expose compensating write error information. When the server rejects a - modification made by the client (such as if the user does not have the - required permissions), a `SyncError` is delivered to the sync error handler - with the code `.writeRejected` and a non-nil `compensatingWriteInfo` field - which contains information about what was rejected and why. This information - is intended primarily for debugging and logging purposes and may not have a - stable format. ([PR #8002](https://github.com/realm/realm-swift/pull/8002)) -* Async `Realm.init()` now handles Task cancellation and will cancel the async - open if the Task is cancelled ([PR #8148](https://github.com/realm/realm-swift/pull/8148)). -* Cancelling async opens now has more consistent behavior. The previously - intended and documented behavior was that cancelling an async open would - result in the callback associated with the specific task that was cancelled - never being called, and all other pending callbacks would be invoked with an - ECANCELED error. This never actually worked correctly, and the callback which - was not supposed to be invoked at all sometimes would be. We now - unconditionally invoke all of the exactly once, passing ECANCELED to all of - them ([PR #8148](https://github.com/realm/realm-swift/pull/8148)). - -### Fixed - -* `UserPublisher` incorrectly bounced all notifications to the main thread instead - of setting up the Combine publisher to correctly receive on the main thread. - ([#8132](https://github.com/realm/realm-swift/issues/8132), since 10.21.0) -* Fix warnings when building with Xcode 14.3 beta 2. -* Errors in async open resulting from invalid queries in `initialSubscriptions` - would result in the callback being invoked with both a non-nil Realm and a - non-nil Error even though the Realm was in an invalid state. Now only the - error is passed to the callback ([PR #8148](https://github.com/realm/realm-swift/pull/8148), since v10.28.0). -* Converting a local realm to a synced realm would crash if an embedded object - was null ([Core #6294](https://github.com/realm/realm-core/issues/6294), since v10.22.0). -* Subqueries on indexed properties performed extremely poorly. ([Core #6327](https://github.com/realm/realm-core/issues/6327), since v5.0.0) -* Fix a crash when a SSL read successfully read a non-zero number of bytes and - also reported an error. ([Core #5435](https://github.com/realm/realm-core/issues/5435), since 10.0.0) -* The sync client could get stuck in an infinite loop if the server sent an - invalid changeset which caused a transform error. This now results in a - client reset instead. ([Core #6051](https://github.com/realm/realm-core/issues/6051), since v10.0.0) -* Strings in queries which contained any characters which required multiple - bytes when encoded as utf-8 were incorrectly encoded as binary data when - serializing the query to send it to the server for a flexible sync - subscription, resulting the server rejecting the query - ([Core #6350](https://github.com/realm/realm-core/issues/6350), since 10.22.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -### Internal - -* Upgraded realm-core from 13.4.1 to 13.6.0 - -10.36.0 Release notes (2023-02-15) -============================================================= - -### Enhancements - -* Add support for multiple overlapping or nested event scopes. - `Events.beginScope()` now returns a `Scope` object which is used to commit or - cancel that scope, and if more than one scope is active at a time events are - reported to all active scopes. - -### Fixed - -* Fix moving `List` items to a higher index in SwiftUI results in wrong destination index - ([#7956](https://github.com/realm/realm-swift/issues/7956), since v10.6.0). -* Using the `searchable` view modifier with `@ObservedResults` in iOS 16 would - cause the collection observation subscription to cancel. - ([#8096](https://github.com/realm/realm-swift/issues/8096), since 10.21.0) -* Client reset with recovery would sometimes crash if the recovery resurrected - a dangling link ([Core #6292](https://github.com/realm/realm-core/issues/6292), since v10.32.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -### Internal - -* Upgraded realm-core from 13.4.0 to 13.4.1 - -10.35.1 Release notes (2023-02-10) -============================================================= - -### Fixed - -* Client reset with recovery would crash if a client reset occurred the very - first time the Realm was opened with async open. The client reset callbacks - are now not called if the Realm had never been opened before - ([PR #8125](https://github.com/realm/realm-swift/pull/8125), since 10.32.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -10.35.0 Release notes (2023-02-07) -============================================================= - -This version bumps the Realm file format version to 23. Realm files written by -this version cannot be read by older versions of Realm. - -### Enhancements - -* The Realm file is now automatically shrunk if the file size is larger than - needed to store all of the data. ([Core PR #5755](https://github.com/realm/realm-core/pull/5755)) -* Pinning old versions (either with frozen Realms or with Realms on background - threads that simply don't get refreshed) now only prevents overwriting the - data needed by that version, rather than the data needed by that version and - all later versions. In addition, frozen Realms no longer pin the transaction - logs used to drive change notifications. This mostly eliminates the file size - growth caused by pinning versions. ([Core PR #5440](https://github.com/realm/realm-core/pull/5440)) -* Rework how Dictionaries/Maps are stored in the Realm file. The new design uses - less space and is typically significantly faster. This changes the iteration - order of Maps, so any code relying on that may be broken. We continue - to make no guarantees about iteration order on Maps ([Core #5764](https://github.com/realm/realm-core/issues/5764)). -* Improve performance of freezing Realms ([Core PR #6211](https://github.com/realm/realm-core/pull/6211)). - -### Fixed - -* Fix a crash when using client reset with recovery and flexible sync with a - single subscription ([Core #6070](https://github.com/realm/realm-core/issues/6070), since v10.28.2) -* Encrypted Realm files could not be opened on devices with a larger page size - than the one which originally wrote the file. - ([#8030](https://github.com/realm/realm-swift/issues/8030), since v10.32.1) -* Creating multiple flexible sync subscriptions at once could hit an assertion - failure if the server reported an error for any of them other than the last - one ([Core #6038](https://github.com/realm/realm-core/issues/6038), since v10.21.1). -* `Set` and `List` considered a string and binary - data containing that string encoded as UTF-8 to be equivalent. This could - result in a List entry not changing type on assignment and for the client be - inconsistent with the server if a string and some binary data with equivalent - content was inserted from Atlas. - ([Core #4860](https://github.com/realm/realm-core/issues/4860) and - [Core #6201](https://github.com/realm/realm-core/issues/6201), since v10.8.0) -* Querying for NaN on Decimal128 properties did not match any objects - ([Core #6182](https://github.com/realm/realm-core/issues/6182), since v10.8.0). -* When client reset with recovery is used and the recovery did not need to - make any changes to the local Realm, the sync client could incorrectly think - the recovery failed and report the error "A fatal error occured during client - reset: 'A previous 'Recovery' mode reset from did not succeed, - giving up on 'Recovery' mode to prevent a cycle'". - ([Core #6195](https://github.com/realm/realm-core/issues/6195), since v10.32.0) -* Fix a crash when using client reset with recovery and flexible sync with a - single subscription ([Core #6070](https://github.com/realm/realm-core/issues/6070), since v10.28.2) -* Writing to newly in-view objects while a flexible sync bootstrap was in - progress would not synchronize those changes to the server - ([Core #5804](https://github.com/realm/realm-core/issues/5804), since v10.21.1). -* If a client reset with recovery or discard local was interrupted while the - "fresh" realm was being downloaded, the sync client could crash with a - MultpleSyncAgents exception ([Core #6217](https://github.com/realm/realm-core/issues/6217), since v10.25.0). -* Sharing Realm files between a Catalyst app and Realm Studio did not properly - synchronize access to the Realm file ([Core #6258](https://github.com/realm/realm-core/pull/6258), since v10.0.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -### Internal - -* Upgraded realm-core from 12.13.0 to 13.4.0 - -10.34.1 Release notes (2023-01-20) -============================================================= - -### Fixed - -* Add some missing `@preconcurrency` annotations which lead to build failures - with Xcode 14.0 when importing via SPM or CocoaPods - ([#8104](https://github.com/realm/realm-swift/issues/8104), since v10.34.0). - -### Compatibility - -* Realm Studio: 11.0.0 - 12.0.0. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -10.34.0 Release notes (2023-01-13) -============================================================= - -Swift 5.5 is no longer supported. Swift 5.6 (Xcode 13.3) is now the minimum -supported version. - -The prebuilt binary for Carthage is now build with Xcode 14.2. - -### Enhancements - -* Improve performance of creating Projection objects and of change - notifications on projections ([PR #8050](https://github.com/realm/realm-swift/pull/8050)). -* Allow initialising any sync configuration with `cancelAsyncOpenOnNonFatalErrors`. -* Improve performance of Combine value publishers which do not use the - object/collection changesets a little. -* All public types have been audited for sendability and are now marked as - Sendable when applicable. A few types which were incidentally not thread-safe - but make sense to use from multiple threads are now thread-safe. -* Add support for building Realm with strict concurrency checking enabled. - -### Fixed - -* Fix bad memory access exception that can occur when watching change streams. - [PR #8039](https://github.com/realm/realm-swift/pull/8039). -* Object change notifications on projections only included the first projected - property for each source property ([PR #8050](https://github.com/realm/realm-swift/pull/8050), since v10.21.0). -* `@AutoOpen` failed to open flexible sync Realms while offline - ([#7986](https://github.com/realm/realm-swift/issues/7986), since v10.27.0). -* Fix "Publishing changes from within view updates is not allowed" warnings - when using `@ObservedResults` or `@ObservedSectionedResults` - ([#7908](https://github.com/realm/realm-swift/issues/7908)). -* Fix "Publishing changes from within view updates is not allowed" warnings - when using `@AutoOpen` or `@AsyncOpen`. - ([#7908](https://github.com/realm/realm-swift/issues/7908)). -* Defer `Realm.asyncOpen` execution on `@AsyncOpen` and `@AutoOpen` property - wrappers until all the environment values are set. This will guarantee the - configuration and partition value are set set before opening the realm. - ([#7931](https://github.com/realm/realm-swift/issues/7931), since v10.12.0). -* `@ObservedResults.remove()` could delete the wrong object if a write on a - background thread which changed the index of the object being removed - occurred at a very specific time (since v10.6.0). - -### Compatibility - -* Realm Studio: 11.0.0 - 12.0.0. 13.0.0 is currently incompatible. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -10.33.0 Release notes (2022-12-01) -============================================================= - -### Enhancements - -* Flexible sync subscription state will change to - `SyncSubscriptionState.pending` (`RLMSyncSubscriptionStatePending`) while - waiting for the server to have sent all pending history after a bootstrap and - before marking a subscription as Complete. - ([#5795](https://github.com/realm/realm-core/pull/5795)) -* Add custom column names API, which allows to set a different column name in the realm - from the one used in your object declaration. - ```swift - class Person: Object { - @Persisted var firstName: String - @Persisted var birthDate: Date - @Persisted var age: Int - - override class public func propertiesMapping() -> [String: String] { - ["firstName": "first_name", - "birthDate": "birth_date"] - } - } - ``` - This is very helpful in cases where you want to name a property differently - from your `Device Sync` JSON schema. - This API is only available for old and modern object declaration syntax on the - `RealmSwift` SDK. -* Flexible sync bootstraps now apply 1MB of changesets per write transaction - rather than applying all of them in a single write transaction. - ([Core PR #5999](https://github.com/realm/realm-core/pull/5999)). - -### Fixed - -* Fix a race condition which could result in "operation cancelled" errors being - delivered to async open callbacks rather than the actual sync error which - caused things to fail ([Core PR #5968](https://github.com/realm/realm-core/pull/5968), since the introduction of async open). -* Fix database corruption issues which could happen if an application was - terminated at a certain point in the process of comitting a write - transaciton. ([Core PR #5993](https://github.com/realm/realm-core/pull/5993), since v10.21.1) -* `@AsyncOpen` and `@AutoOpen` would begin and then cancel a second async open - operation ([PR #8038](https://github.com/realm/realm-swift/pull/8038), since v10.12.0). -* Changing the search text when using the searchable SwiftUI extension would - trigger multiple updates on the View for each change - ([PR #8038](https://github.com/realm/realm-swift/pull/8038), since v10.19.0). -* Changing the filter or search properties of an `@ObservedResults` or - `@ObservedSectionedResults` would trigger up to three updates on the View - ([PR #8038](https://github.com/realm/realm-swift/pull/8038), since v10.6.0). -* Fetching a user's profile while the user logs out would result in an - assertion failure. ([Core PR #6017](https://github.com/realm/realm-core/issues/5571), since v10.8.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -### Internal - -* Upgraded realm-core from 12.11.0 to 12.13.0 - -10.32.3 Release notes (2022-11-10) -============================================================= - -### Fixed - -* Fix name lookup errors when importing Realm Swift built in library evolution - mode (([#8014](https://github.com/realm/realm-swift/issues/8014)). -* The prebuilt watchOS library in the objective-c release package was missing - an arm64 slice. The Swift release package was uneffected - ([PR #8016](https://github.com/realm/realm-swift/pull/8016)). -* Fix issue where `RLMUserAPIKey.key`/`UserAPIKey.key` incorrectly returned the name of the API - key instead of the key itself. ([#8021](https://github.com/realm/realm-swift/issues/8021), since v10.0.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -10.32.2 Release notes (2022-11-01) -============================================================= - -Switch to building the Carthage release with Xcode 14.1. - -### Fixed - -* Fix linker errors when building a release build with Xcode 14.1 when - installing via SPM ([#7995](https://github.com/realm/realm-swift/issues/7995)). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -10.32.1 Release notes (2022-10-25) -============================================================= - -### Enhancements - -* Improve performance of client reset with automatic recovery and converting - top-level tables into embedded tables ([Core #5897](https://github.com/realm/realm-core/pull/5897)). -* `Realm.Error` is now a typealias for `RLMError` rather than a - manually-defined version of what the automatic bridging produces. This should - have no effect on existing working code, but the manual definition was - missing a few things supplied by the automatic bridging. -* Some sync errors sent by the server include a link to the server-side logs - associated with that error. This link is now exposed in the `serverLogURL` - property on `SyncError` (or `RLMServerLogURLKey` userInfo field when using NSError). - -### Fixed - -* Many sync and app errors were reported using undocumented internal error - codes and/or domains and could not be progammatically handled. Some notable - things which now have public error codes instead of unstable internal ones: - - `Realm.Error.subscriptionFailed`: The server rejected a flexible sync subscription. - - `AppError.invalidPassword`: A login attempt failed due to a bad password. - - `AppError.accountNameInUse`: A registration attempt failed due to the account name being in use. - - `AppError.httpRequestFailed`: A HTTP request to Atlas App Services - completed with an error HTTP code. The failing code is available in the - `httpStatusCode` property. - - Many other less common error codes have been added to `AppError`. - - All sync errors other than `SyncError.clientResetError` reported incorrect - error codes. - (since v10.0.0). -* `UserAPIKey.objectId` was incorrectly bridged to Swift as `RLMObjectId` to - `ObjectId`. This may produce warnings about an unneccesary cast if you were - previously casting it to the correct type (since v10.0.0). -* Fixed an assertion failure when observing change notifications on a sectioned - result, if the first modification was to a linked property that did not cause - the state of the sections to change. - ([Core #5912](https://github.com/realm/realm-core/issues/5912), - since the introduction of sectioned results in v10.29.0) -* Fix a use-after-free if the last external reference to an encrypted - synchronized Realm was closed between when a client reset error was received - and when the download of the new Realm began. - ([Core #5949](https://github.com/realm/realm-core/pull/5949), since 10.28.4). -* Fix an assertion failure during client reset with recovery when recovering - a list operation on an embedded object that has a link column in the path - prefix to the list from the top level object. - ([Core #5957](https://github.com/realm/realm-core/issues/5957), - since introduction of automatic recovery in v10.32.0). -* Creating a write transaction which is rejected by the server due to it - exceeding the maximum transaction size now results in a client reset error - instead of synchronization breaking and becoming stuck forever - ([Core #5209](https://github.com/realm/realm-core/issues/5209), since v10). -* Opening an unencrypted file with an encryption key would sometimes report a - misleading error message that indicated that the problem was something other - than a decryption failure ([Core #5915](https://github.com/realm/realm-core/pull/5915), since 0.89.0). -* Fix a rare deadlock which could occur when closing a synchronized Realm - immediately after committing a write transaction when the sync worker thread - has also just finished processing a changeset from the server - ([Core #5948](https://github.com/realm/realm-core/pull/5948)). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.0.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -### Internal - -* Upgraded realm-core from 12.9.0 to 12.11.0. - -10.32.0 Release notes (2022-10-10) -============================================================= - -### Enhancements - -* Add `.recoverUnsyncedChanges` (`RLMClientResetModeRecoverUnsyncedChanges`) and -`.recoverOrDiscardUnsyncedChanges` (`RLMClientResetModeRecoverOrDiscardUnsyncedChanges`) behaviors to `ClientResetMode` (`RLMClientResetMode`). - - The newly added recover modes function by downloading a realm which reflects the latest - state of the server after a client reset. A recovery process is run locally in an - attempt to integrate the server state with any local changes from before the - client reset occurred. - The changes are integrated with the following rules: - 1. Objects created locally that were not synced before client reset, will be integrated. - 2. If an object has been deleted on the server, but was modified on the client, the delete takes precedence and the update is discarded. - 3. If an object was deleted on the client, but not the server, then the client delete instruction is applied. - 4. In the case of conflicting updates to the same field, the client update is applied. - - The client reset process will fallback to `ClientResetMode.discardUnsyncedChanges` if the recovery process fails in `.recoverOrDiscardUnsyncedChanges`. - - The client reset process will fallback to `ClientResetMode.manual` if the recovery process fails in `.recoverUnsyncedChanges`. - - The two new swift recovery modes support client reset callbacks: `.recoverUnsyncedChanges(beforeReset: ((Realm) -> Void)? = nil, afterReset: ((Realm, Realm) -> Void)? = nil)`. - - The two new Obj-C recovery modes support client reset callbacks in `notifyBeforeReset` - and `notifyAfterReset`for both `[RLMUser configurationWithPartitionValue]` and `[RLMUser flexibleSyncConfigurationWithClientResetMode]` - For more detail on client reset callbacks, see `ClientResetMode`, `RLMClientResetBeforeBlock`, - `RLMClientResetAfterBlock`, and the 10.25.0 changelog entry. -* Add two new additional interfaces to define a manual client reset handler: - - Add a manual callback handler to `ClientResetMode.manual` -> `ClientResetMode.manual(ErrorReportingBlock? = nil)`. - - Add the `RLMSyncConfiguration.manualClientResetHandler` property (type `RLMSyncErrorReportingBlock`). - - These error reporting blocks are invoked in the event of a `RLMSyncErrorClientResetError`. - - See `ErrorReportingBlock` (`RLMSyncErrorReportingBlock`), and `ClientResetInfo` for more detail. - - Previously, manual client resets were handled only through the `SyncManager.ErrorHandler`. You have the - option, but not the requirement, to define manual reset handler in these interfaces. - Otherwise, the `SyncManager.ErrorHandler` is still invoked during the manual client reset process. - - These new interfaces are only invoked during a `RLMSyncErrorClientResetError`. All other sync errors - are still handled in the `SyncManager.ErrorHandler`. - - See 'Breaking Changes' for information how these interfaces interact with an already existing - `SyncManager.ErrorHandler`. - -### Breaking Changes - -* The default `clientResetMode` (`RLMClientResetMode`) is switched from `.manual` (`RLMClientResetModeManual`) - to `.recoverUnsyncedChanges` (`RLMClientResetModeRecoverUnsyncedChanges`). - - If you are currently using `.manual` and continue to do so, the only change - you must explicitly make is designating manual mode in - your `Realm.Configuration.SyncConfiguration`s, since they will now default to `.recoverUnsyncedChanges`. - - You may choose to define your manual client reset handler in the newly - introduced `manual(ErrorReportingBlock? = nil)` - or `RLMSyncConfiguration.manualClientResetHandler`, but this is not required. - The `SyncManager.errorHandler` will still be invoked during a client reset if - no callback is passed into these new interfaces. - -### Deprecations - -* `ClientResetMode.discardLocal` is deprecated in favor of `ClientResetMode.discardUnsyncedChanges`. - The reasoning is that the name better reflects the effect of this reset mode. There is no actual - difference in behavior. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.0.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -10.31.0 Release notes (2022-10-05) -============================================================= - -The prebuilt binary for Carthage is now build with Xcode 14.0.1. - -### Enhancements - -* Cut the runtime of aggregate operations on large dictionaries in half - ([Core #5864](https://github.com/realm/realm-core/pull/5864)). -* Improve performance of aggregate operations on collections of objects by 2x - to 10x ([Core #5864](https://github.com/realm/realm-core/pull/5864)). - Greatly improve the performance of sorting or distincting a Dictionary's keys - or values. The most expensive operation is now performed O(log N) rather than - O(N log N) times, and large Dictionaries can see upwards of 99% reduction in - time to sort. ([Core #5166](https://github.com/realm/realm-core/pulls/5166)) -* Add support for changing the deployment location for Atlas Apps. Previously - this was assumed to be immutable ([Core #5648](https://github.com/realm/realm-core/issues/5648)). -* The sync client will now yield the write lock to other threads which are - waiting to perform a write transaction even if it still has remaining work to - do, rather than always applying all changesets received from the server even - when other threads are trying to write. ([Core #5844](https://github.com/realm/realm-core/pull/5844)). -* The sync client no longer writes an unused temporary copy of the changesets - received from the server to the Realm file ([Core #5844](https://github.com/realm/realm-core/pull/5844)). - -### Fixed - -* Setting a `List` property with `Results` no longer throws an unrecognized - selector exception (since 10.8.0-beta.2) -* `RLMProgressNotificationToken` and `ProgressNotificationToken` now hold a - strong reference to the sync session, keeping it alive until the token is - deallocated or invalidated, as the other notification tokens do. - ([#7831](https://github.com/realm/realm-swift/issues/7831), since v2.3.0). -* Results permitted some nonsensical aggregate operations on column types which - do not make sense to aggregate, giving garbage results rather than reporting - an error ([Core #5876](https://github.com/realm/realm-core/pull/5876), since v5.0.0). -* Upserting a document in a Mongo collection would crash if the document's id - type was anything other than ObjectId (since v10.0.0). -* Fix a use-after-free when a sync session is closed and the app is destroyed - at the same time ([Core #5752](https://github.com/realm/realm-core/issues/5752), - since v10.19.0). - -### Deprecations - -* `RLMUpdateResult.objectId` has been deprecated in favor of - `RLMUpdateResult.documentId` to support reporting document ids which are not - object ids. -### Breaking Changes -* Private API `_realmColumnNames` has been renamed to a new public API - called `propertiesMapping()`. This change only affects the Swift API - and doesn't have any effects in the obj-c API. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.0.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -### Internal - -* Upgraded realm-core from 12.7.0 to 12.9.0 - -10.30.0 Release notes (2022-09-20) -============================================================= - -### Fixed - -* Incoming links from `RealmAny` properties were not handled correctly when - migrating an object type from top-level to embedded. `RealmAny` properties - currently cannot link to embedded objects. - ([Core #5796](https://github.com/realm/realm-core/pull/5796), since 10.8.0). -* `Realm.refresh()` sometimes did not actually advance to the latest version. - It attempted to be semi-non-blocking in a very confusing way which resulted - in it sometimes advancing to a newer version that is not the latest version, - and sometimes blocking until notifiers are ready so that it could advance to - the latest version. This behavior was undocumented and didn't work correctly, - so it now always blocks if needed to advance to the latest version. - ([#7625](https://github.com/realm/realm-swift/issues/7625), since v0.98.0). -* Fix the most common cause of thread priority inversions when performing - writes on the main thread. If beginning the write transaction has to wait for - the background notification calculations to complete, that wait is now done - in a QoS-aware way. ([#7902](https://github.com/realm/realm-swift/issues/7902)) -* Subscribing to link properties in a flexible sync Realm did not work due to a - mismatch between what the client sent and what the server needed. - ([Core #5409](https://github.com/realm/realm-core/issues/5409)) -* Attempting to use `AsymmetricObject` with partition-based sync now reports a - sensible error much earlier in the process. Asymmetric sync requires using - flexible sync. ([Core #5691](https://github.com/realm/realm-core/issues/5691), since 10.29.0). -* Case-insensitive but diacritic-sensitive queries would crash on 4-byte UTF-8 - characters ([Core #5825](https://github.com/realm/realm-core/issues/5825), since v2.2.0) -* Accented characters are now handled by case-insensitive but - diacritic-sensitive queries. ([Core #5825](https://github.com/realm/realm-core/issues/5825), since v2.2.0) - -### Breaking Changes - -* `-[RLMASLoginDelegate authenticationDidCompleteWithError:]` has been renamed - to `-[RLMASLoginDelegate authenticationDidFailWithError:]` to comply with new - app store requirements. This only effects the obj-c API. - ([#7945](https://github.com/realm/realm-swift/issues/7945)) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1 - 14. - -### Internal - -* Upgraded realm-core from 12.6.0 to 12.7.0 - -10.29.0 Release notes (2022-09-09) -============================================================= - -### Enhancements - -* Add support for asymmetric sync. When a class inherits from - `AsymmetricObject`, objects created are synced unidirectionally to the server - and cannot be queried or read locally. - -```swift - class PersonObject: AsymmetricObject { - @Persisted(primaryKey: true) var _id: ObjectId - @Persisted var name: String - @Persisted var age: Int - } - - try realm.write { - // This will create the object on the server but not locally. - realm.create(PersonObject.self, value: ["_id": ObjectId.generate(), - "name": "Dylan", - "age": 20]) - } -``` -* Add ability to section a collection which conforms to `RealmCollection`, `RLMCollection`. - Collections can be sectioned by a unique key retrieved from a keyPath or a callback and will return an instance of `SectionedResults`/`RLMSectionedResults`. - Each section in the collection will be an instance of `ResultsSection`/`RLMSection` which gives access to the elements corresponding to the section key. - `SectionedResults`/`RLMSectionedResults` and `ResultsSection`/`RLMSection` have the ability to be observed. - ```swift - class DemoObject: Object { - @Persisted var title: String - @Persisted var date: Date - var firstLetter: String { - return title.first.map(String.init(_:)) ?? "" - } - } - var sectionedResults: SectionedResults - // ... - sectionedResults = realm.objects(DemoObject.self) - .sectioned(by: \.firstLetter, ascending: true) - ``` -* Add `@ObservedSectionedResults` for SwiftUI support. This property wrapper type retrieves sectioned results - from a Realm using a keyPath or callback to determine the section key. - ```swift - struct DemoView: View { - @ObservedSectionedResults(DemoObject.self, - sectionKeyPath: \.firstLetter) var demoObjects - - var body: some View { - VStack { - List { - ForEach(demoObjects) { section in - Section(header: Text(section.key)) { - ForEach(section) { object in - MyRowView(object: object) - } - } - } - } - } - } - } - ``` -* Add automatic handing for changing top-level objects to embedded objects in - migrations. Any objects of the now-embedded type which have zero incoming - links are deleted, and objects with multiple incoming links are duplicated. - This happens after the migration callback function completes, so there is no - functional change if you already have migration logic which correctly handles - this. ([Core #5737](https://github.com/realm/realm-core/pull/5737)). -* Improve performance when a new Realm file connects to the server for the - first time, especially when significant amounts of data has been written - while offline. ([Core #5772](https://github.com/realm/realm-core/pull/5772)) -* Shift more of the work done on the sync worker thread out of the write - transaction used to apply server changes, reducing how long it blocks other - threads from writing. ([Core #5772](https://github.com/realm/realm-core/pull/5772)) -* Improve the performance of the sync changeset parser, which speeds up - applying changesets from the server. ([Core #5772](https://github.com/realm/realm-core/pull/5772)) - -### Fixed - -* Fix all of the UBSan failures hit by our tests. It is unclear if any of these - manifested as visible bugs. ([Core #5665](https://github.com/realm/realm-core/pull/5665)) -* Upload completion callbacks were sometimes called before the final step of - interally marking the upload as complete, which could result in calling - `Realm.writeCopy()` from the completion callback failing due to there being - unuploaded changes. ([Core #4865](https://github.com/realm/realm-core/issues/4865)). -* Writing to a Realm stored on an exFAT drive threw the exception "fcntl() with - F_BARRIERFSYNC failed: Inappropriate ioctl for device" when a write - transaction needed to expand the file. - ([Core #5789](https://github.com/realm/realm-core/issues/5789), since 10.27.0) -* Syncing a Decimal128 with big significand could result in a crash. - ([Core #5728](https://github.com/realm/realm-core/issues/5728)) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 RC. - -### Internal - -* Upgraded realm-core from 12.5.1 to 12.6.0 - -10.28.7 Release notes (2022-09-02) -============================================================= - -### Enhancements - -* Add prebuilt binaries for Xcode 14 to the release package. - -### Fixed - -* Fix archiving watchOS release builds with Xcode 14. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 6. - -10.28.6 Release notes (2022-08-19) -============================================================= - -### Fixed - -* Fixed an issue where having realm-swift as SPM sub-target dependency leads to - missing symbols error during iOS archiving ([Core #7645](https://github.com/realm/realm-core/pull/7645)). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 5. - -### Internal - -* Upgraded realm-core from 12.5.0 to 12.5.1 - -10.28.5 Release notes (2022-08-09) -============================================================= - -### Enhancements - -* Improve performance of accessing `SubscriptionSet` properties when no writes - have been made to the Realm since the last access. - -### Fixed - -* A use-after-free could occur if a Realm with audit events enabled was - destroyed while processing an upload completion for the events Realm on a - different thread. ([Core PR #5714](https://github.com/realm/realm-core/pull/5714)) -* Opening a read-only synchronized Realm for the first time via asyncOpen did - not set the schema version, which could lead to `m_schema_version != - ObjectStore::NotVersioned` assertion failures later on. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 4. - -### Internal - -* Upgraded realm-core from 12.4.0 to 12.5.0 - -10.28.4 Release notes (2022-08-03) -============================================================= - -### Enhancements - -* Add support for building arm64 watchOS when installing Realm via CocoaPods. -* Reduce the amount of virtual address space used - ([Core #5645](https://github.com/realm/realm-core/pull/5645)). - -### Fixed - -* Fix some warnings when building with Xcode 14 - ([Core #5577](https://github.com/realm/realm-core/pull/5577)). -* Fix compilation failures on watchOS platforms which do not support thread-local storage. - ([#7694](https://github.com/realm/realm-swift/issues/7694), [#7695](https://github.com/realm/realm-swift/issues/7695) since v10.21.1) -* Fix a data race when committing a transaction while multiple threads are - waiting to begin write transactions. This appears to not have caused any - functional problems. -* Fix a data race when writing audit events which could occur if the sync - client thread was busy with other work when the event Realm was opened. -* Fix some cases of running out of virtual address space (seen/reported as mmap - failures) ([Core #5645](https://github.com/realm/realm-core/pull/5645)). -* Audit event scopes containing only write events and no read events would - occasionally throw a `BadVersion` exception when a write transaction was - committed (since v10.26.0). -* The client reset callbacks for the DiscardLocal mode would be passed invalid - Realm instances if the callback was invoked at a point where the Realm was - not otherwise open. ([Core #5654](https://github.com/realm/realm-core/pull/5654), since the introduction of DiscardLocal reset mode in v10.25.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 4. - -### Internal - -* Upgraded realm-core from 12.3.0 to 12.4.0. - -10.28.3 Release notes (2022-07-27) -============================================================= - -### Enhancements - -* Greatly improve the performance of obtaining cached Realm instances in Swift - when using a sync configuration. - -### Fixed - -* Add missing `initialSubscription` and `rerunOnOpen` to copyWithZone method on - `RLMRealmConfiguration`. This resulted in incorrect values when using - `RLMRealmConfiguration.defaultConfiguration`. -* The sync error handler did not hold a strong reference to the sync session - while dispatching the error from the worker thread to the main thread, - resulting in the session passed to the error handler being invalid if there - were no other remaining strong references elsewhere. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 3. - -10.28.2 Release notes (2022-06-30) -============================================================= - -### Fixed - -* Using `seedFilePath` threw an exception if the Realm file being opened - already existed ([#7840](https://github.com/realm/realm-swift/issues/7840), - since v10.26.0). -* The `intialSubscriptions` callback was invoked every time a Realm was opened - regardless of the value of `rerunOnOpen` and if the Realm was already open on - another thread (since v10.28.0). -* Allow using `RLMSupport.Swift` from RealmSwift's Cocoapods - ([#6886](https://github.com/realm/realm-swift/pull/6886)). -* Fix a UBSan failure when mapping encrypted pages. Fixing this did not change - the resulting assembly, so there were probably no functional problems - resulting from this (since v5.0.0). -* Improved performance of sync clients during integration of changesets with - many small strings (totalling > 1024 bytes per changeset) on iOS 14, and - devices which have restrictive or fragmented memory. - ([Core #5614](https://github.com/realm/realm-core/issues/5614)) -* Fix a data race when opening a flexible sync Realm (since v10.28.0). -* Add a missing backlink removal when assigning null or a non-link value to an - `AnyRealmValue` property which previously linked to an object. - This could have resulted in "key not found" exceptions or assertion failures - such as `mixed.hpp:165: [realm-core-12.1.0] Assertion failed: m_type` when - removing the destination link object. - ([Core #5574](https://github.com/realm/realm-core/pull/5573), since the introduction of AnyRealmValue in v10.8.0) - -### Compatibility - -* Realm Studio: 12.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 2. - -### Internal - -* Upgraded realm-core from 12.1.0 to 12.3.0. - -10.28.1 Release notes (2022-06-10) -============================================================= - -### Enhancements - -* Add support for Xcode 14. When building with Xcode 14, the minimum deployment - target is now iOS 11. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 1. - -10.28.0 Release notes (2022-06-03) -============================================================= - -### Enhancements - -* Replace mentions of 'MongoDB Realm' with 'Atlas App Services' in the documentation and update appropriate links to documentation. -* Allow adding a subscription querying for all documents of a type in swift for flexible sync. -``` - try await subscriptions.update { - subscriptions.append(QuerySubscription(name: "all_people")) - } -``` -* Add Combine API support for flexible sync beta. -* Add an `initialSubscriptions` parameter when retrieving the flexible sync configuration from a user, - which allows to specify a subscription update block, to bootstrap a set of flexible sync subscriptions - when the Realm is first opened. - There is an additional optional parameter flag `rerunOnOpen`, which allows to run this initial - subscriptions on every app startup. - -```swift - let config = user.flexibleSyncConfiguration(initialSubscriptions: { subs in - subs.append(QuerySubscription(name: "people_10") { - $0.age > 10 - }) - }, rerunOnOpen: true) - let realm = try Realm(configuration: config) -``` -* The sync client error handler will report an error, with detailed info about which object caused it, when writing an object to a flexible sync Realm outside of any query subscription. ([#5528](https://github.com/realm/realm-core/pull/5528)) -* Adding an object to a flexible sync Realm for a type that is not within a query subscription will now throw an exception. ([#5488](https://github.com/realm/realm-core/pull/5488)). - -### Fixed - -* Flexible Sync query subscriptions will correctly complete when data is synced to the local Realm. ([#5553](https://github.com/realm/realm-core/pull/5553), since v12.0.0) - -### Breaking Changes - -* Rename `SyncSubscriptionSet.write` to `SyncSubscriptionSet.update` to avoid confusion with `Realm.write`. -* Rename `SyncSubscription.update` to `SyncSubscription.updateQuery` to avoid confusion with `SyncSubscriptionSet.update`. -* Rename `RLMSyncSubscriptionSet.write` to `RLMSyncSubscriptionSet.update` to align it with swift API. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-13.4. - -### Internal - -* Upgraded realm-core from 12.0.0 to 12.1.0. - -10.27.0 Release notes (2022-05-26) -============================================================= - -### Enhancements - -* `@AsyncOpen`/`@AutoOpen` property wrappers can be used with flexible sync. - -### Fixed - -* When installing via SPM, debug builds could potentially hit an assertion - failure during flexible sync bootstrapping. ([Core #5527](https://github.com/realm/realm-core/pull/5527)) -* Flexible sync now only applies bootstrap data if the entire bootstrap is - received. Previously orphaned objects could result from the read snapshot on - the server changing. ([Core #5331](https://github.com/realm/realm-core/pull/5331)) -* Partially fix a performance regression in write performance introduced in - v10.21.1. v10.21.1 fixed a case where a kernel panic or device's battery - dying at the wrong point in a write transaction could potentially result in a - corrected Realm file, but at the cost of a severe performance hit. This - version adjusts how file synchronization is done to provide the same safety - at a much smaller performance hit. ([#7740](https://github.com/realm/realm-swift/issues/7740)). - -### Compatibility - -* Realm Studio: 11.0.0 or later (but see note below). -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-13.4. - -### Internal - -* Upgraded realm-core from 11.17.0 to 12.0.0. -* Bump the version number for the lockfile used for interprocess - synchronization. This has no effect on persistent data, but means that - versions of Realm which use pre-12.0.0 realm-core cannot open Realm files at - the same time as they are opened by this version. Notably this includes Realm - Studio, and v11.1.2 (the latest at the time of this release) cannot open - Realm files which are simultaneously open in the simulator. - -10.26.0 Release notes (2022-05-19) -============================================================= - -Xcode 13.1 is now the minimum supported version of Xcode, as Apple no longer -allows submitting to the app store with Xcode 12. - -### Enhancements - -* Add Xcode 13.4 binaries to the release package. -* Add Swift API for asynchronous transactions -```swift - try? realm.writeAsync { - realm.create(SwiftStringObject.self, value: ["string"]) - } onComplete: { error in - // optional handling on write complete - } - - try? realm.beginAsyncWrite { - realm.create(SwiftStringObject.self, value: ["string"]) - realm.commitAsyncWrite() - } - - let asyncTransactionId = try? realm.beginAsyncWrite { - // ... - } - try! realm.cancelAsyncWrite(asyncTransactionId) -``` -* Add Obj-C API for asynchronous transactions -``` - [realm asyncTransactionWithBlock:^{ - [StringObject createInRealm:realm withValue:@[@"string"]]; - } onComplete:^(NSError *error) { - // optional handling - }]; - - [realm beginAsyncWriteTransaction:^{ - [StringObject createInRealm:realm withValue:@[@"string"]]; - [realm commitAsyncWriteTransaction]; - }]; - - RLMAsyncTransactionId asyncTransactionId = [realm beginAsyncWriteTransaction:^{ - // ... - }]; - [realm cancelAsyncTransaction:asyncTransactionId]; -``` -* Improve performance of opening a Realm with `objectClasses`/`objectTypes` set - in the configuration. -* Implement the Realm event recording API for reporting reads and writes on a - Realm file to Atlas. - -### Fixed - -* Lower minimum OS version for `async` login and FunctionCallables to match the - rest of the `async` functions. ([#7791]https://github.com/realm/realm-swift/issues/7791) -* Consuming a RealmSwift XCFramework with library evolution enabled would give the error - `'Failed to build module 'RealmSwift'; this SDK is not supported by the compiler'` - when the XCFramework was built with an older XCode version and is - then consumed with a later version. ([#7313](https://github.com/realm/realm-swift/issues/7313), since v3.18.0) -* A data race would occur when opening a synchronized Realm with the client - reset mode set to `discardLocal` on one thread at the same time as a client - reset was being processed on another thread. This probably did not cause any - functional problems in practice and the broken timing window was very tight (since 10.25.0). -* If an async open of a Realm triggered a client reset, the callbacks for - `discardLocal` could theoretically fail to be called due to a race condition. - The timing for this was probably not possible to hit in practice (since 10.25.0). -* Calling `[RLMRealm freeze]`/`Realm.freeze` on a Realm which had been created from `writeCopy` - would not produce a frozen Realm. ([#7697](https://github.com/realm/realm-swift/issues/7697), since v5.0.0) -* Using the dynamic subscript API on unmanaged objects before first opening a - Realm or if `objectTypes` was set when opening a Realm would throw an - exception ([#7786](https://github.com/realm/realm-swift/issues/7786)). -* The sync client may have sent a corrupted upload cursor leading to a fatal - error from the server due to an uninitialized variable. - ([#5460](https://github.com/realm/realm-core/pull/5460), since v10.25.1) -* Flexible sync would not correctly resume syncing if a bootstrap was interrupted - ([#5466](https://github.com/realm/realm-core/pull/5466), since v10.21.1). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-13.4. - -### Internal - -* Upgraded realm-core from v11.15.0 to v11.17.0 - -10.25.2 Release notes (2022-04-27) -============================================================= - -### Enhancements - -* Replace Xcode 13.3 binaries with 13.3.1 binaries. - -### Fixed - -* `List` would contain an invalidated object instead of null when - the object linked to was deleted by a difference sync client - ([Core #5215](https://github.com/realm/realm-core/pull/5215), since v10.8.0). -* Adding an object to a Set, deleting the parent object of the Set, and then - deleting the object which was added to the Set would crash - ([Core #5387](https://github.com/realm/realm-core/issues/5387), since v10.8.0). -* Synchronized Realm files which were first created using v10.0.0-beta.3 would - be redownloaded instead of using the existing file, possibly resulting in the - loss of any unsynchronized data in those files (since v10.20.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3.1. - -### Internal - -* Upgraded realm-core from v11.14.0 to v11.15.0 - -10.25.1 Release notes (2022-04-11) -============================================================= - -### Fixed - -* Fixed various memory corruption bugs when encryption is used caused by not - locking a mutex when needed. - ([#7640](https://github.com/realm/realm-swift/issues/7640), [#7659](https://github.com/realm/realm-swift/issues/7659), since v10.21.1) -* Changeset upload batching did not calculate the accumulated size correctly, - resulting in “error reading body failed to read: read limited at 16777217 - bytes” errors from the server when writing large amounts of data - ([Core #5373](https://github.com/realm/realm-core/pull/5373), since 10.25.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3. - -### Internal - -* Upgraded realm-core from v11.13.0 to v11.14.0. - -10.25.0 Release notes (2022-03-29) -============================================================= - -Synchronized Realm files written by this version cannot be opened by older -versions of Realm. Existing files will be automatically upgraded when opened. - -Non-synchronized Realm files remain backwards-compatible. - -### Enhancements - -* Add ability to use Swift Query syntax in `@ObservedResults`, which allows you - to filter results using the `where` parameter. -* Add ability to use `MutableSet` with `StateRealmObject` in SwiftUI. -* Async/Await extensions are now compatible with iOS 13 and above when building - with Xcode 13.3. -* Sync changesets waiting to be uploaded to the server are now compressed, - reducing the disk space needed when large write transactions are performed - while offline or limited in bandwidth.([Core #5260](https://github.com/realm/realm-core/pull/5260)). -* Added new `SyncConfiguration.clientResetMode` and `RLMSyncConfiguration.clientResetMode` properties. - - The values of these properties will dictate client behavior in the event of a [client reset](https://docs.mongodb.com/realm/sync/error-handling/client-resets/). - - See below for information on `ClientResetMode` values. - - `clientResetMode` defaults to `.manual` if not set otherwise. -* Added new `ClientResetMode` and `RLMClientResetMode` enums. - - These enums represent possible client reset behavior for `SyncConfiguration.clientResetMode` and `RLMSyncConfiguration.clientResetMode`, respectively. - - `.manual` and `RLMClientResetModeManual` - - The local copy of the Realm is copied into a recovery - directory for safekeeping, and then deleted from the original location. The next time - the Realm for that partition value is opened, the Realm will automatically be re-downloaded from - MongoDB Realm, and can be used as normal. - - Data written to the Realm after the local copy of the Realm diverged from the backup - remote copy will be present in the local recovery copy of the Realm file. The - re-downloaded Realm will initially contain only the data present at the time the Realm - was backed up on the server. - - `rlmSync_clientResetBackedUpRealmPath` and `SyncError.clientResetInfo()` are used for accessing the recovery directory. - - `.discardLocal` and `RLMClientResetDiscardLocal` - - All unsynchronized local changes are automatically discarded and the local state is - automatically reverted to the most recent state from the server. Unsynchronized changes - can then be recovered in a post-client-reset callback block (See changelog below for more details). - - If RLMClientResetModeDiscardLocal is enabled but the client reset operation is unable to complete - then the client reset process reverts to manual mode. - - The realm's underlying object accessors remain bound so the UI may be updated in a non-disruptive way. -* Added support for client reset notification blocks for `.discardLocal` and `RLMClientResetDiscardLocal` - - **RealmSwift implementation**: `discardLocal(((Realm) -> Void)? = nil, ((Realm, Realm) -> Void)? = nil)` - - RealmSwift client reset blocks are set when initializing the user configuration - ```swift - var configuration = user.configuration(partitionValue: "myPartition", clientResetMode: .discardLocal(beforeClientResetBlock, afterClientResetBlock)) - ``` - - The before client reset block -- `((Realm) -> Void)? = nil` -- is executed prior to a client reset. Possible usage includes: - ```swift - let beforeClientResetBlock: (Realm) -> Void = { beforeRealm in - var recoveryConfig = Realm.Configuration() - recoveryConfig.fileURL = myRecoveryPath - do { - beforeRealm.writeCopy(configuration: recoveryConfig) - /* The copied realm could be used later for recovery, debugging, reporting, etc. */ - } catch { - /* handle error */ - } - } - ``` - - The after client reset block -- `((Realm, Realm) -> Void)? = nil)` -- is executed after a client reset. Possible usage includes: - ```Swift - let afterClientResetBlock: (Realm, Realm) -> Void = { before, after in - /* This block could be used to add custom recovery logic, back-up a realm file, send reporting, etc. */ - for object in before.objects(myClass.self) { - let res = after.objects(myClass.self) - if (res.filter("primaryKey == %@", object.primaryKey).first != nil) { - /* ...custom recovery logic... */ - } else { - /* ...custom recovery logic... */ - } - } - ``` - - **Realm Obj-c implementation**: Both before and after client reset callbacks exist as properties on `RLMSyncConfiguration` and are set at initialization. - ```objective-c - RLMRealmConfiguration *config = [user configurationWithPartitionValue:partitionValue - clientResetMode:RLMClientResetModeDiscardLocal - notifyBeforeReset:beforeBlock - notifyAfterReset:afterBlock]; - ``` - where `beforeBlock` is of type `RLMClientResetBeforeBlock`. And `afterBlock` is of type `RLMClientResetAfterBlock`. - -### Breaking Changes - -* Xcode 13.2 is no longer supported when building with Async/Await functions. Use - Xcode 13.3 to build with Async/Await functionality. - -### Fixed - -* Adding a Realm Object to a `ObservedResults` or a collections using - `StateRealmObject` that is managed by the same Realm would throw if the - Object was frozen and not thawed before hand. -* Setting a Realm Configuration for @ObservedResults using it's initializer - would be overrode by the Realm Configuration stored in - `.environment(\.realmConfiguration, ...)` if they did not match - ([Cocoa #7463](https://github.com/realm/realm-swift/issues/7463), since v10.6.0). -* Fix searchable component filter overriding the initial filter on `@ObservedResults`, (since v10.23.0). -* Comparing `Results`, `LinkingObjects` or `AnyRealmCollection` when using Realm via XCFramework - would result in compile time errors ([Cocoa #7615](https://github.com/realm/realm-swift/issues/7615), since v10.21.0) -* Opening an encrypted Realm while the keychain is locked on macOS would crash - ([#7438](https://github.com/realm/realm-swift/issues/7438)). -* Updating subscriptions while refreshing the access token would crash - ([Core #5343](https://github.com/realm/realm-core/issues/5343), since v10.22.0) -* Fix several race conditions in `SyncSession` related to setting - `customRequestHeaders` while using the `SyncSession` on a different thread. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3. - -### Internal - -* Upgraded realm-core from v11.12.0 to v11.13.0 - -10.24.2 Release notes (2022-03-18) -============================================================= - -### Fixed - -* Application would sometimes crash with exceptions like 'KeyNotFound' or - assertion "has_refs()". Other issues indicating file corruption may also be - fixed by this. The one mentioned here is the one that lead to solving the - problem. - ([Core #5283](https://github.com/realm/realm-core/issues/5283), since v5.0.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3. - -### Internal - -* Upgraded realm-core from 11.11.0 to 11.12.0 - -10.24.1 Release notes (2022-03-14) -============================================================= - -Switch to building the Carthage binary with Xcode 13.3. This release contains -no functional changes from 10.24.0. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3. - -10.24.0 Release notes (2022-03-05) -============================================================= - -### Enhancements - -* Add ability to use Swift Query syntax in `@ObservedResults`, which allows you - to filter results using the `where` parameter. - -### Fixed - -* If a list of objects contains links to objects not included in the - synchronized partition, collection change notifications for that list could - be incorrect ([Core #5164](https://github.com/realm/realm-core/issues/5164), since v10.0.0). -* Adding a new flexible sync subscription could crash with - "Assertion failed: !m_unbind_message_sent" in very specific timing scenarios - ([Core #5149](https://github.com/realm/realm-core/pull/5149), since v10.22.0). -* Converting floats/doubles into Decimal128 would yield imprecise results - ([Core #5184](https://github.com/realm/realm-core/pull/5184), since v10.0.0) -* Using accented characters in class and field names in a synchronized Realm - could result in sync errors ([Core #5196](https://github.com/realm/realm-core/pull/5196), since v10.0.0). -* Calling `Realm.invalidate()` from inside a Realm change notification could - result in the write transaction which produced the notification not being - persisted to disk (since v10.22.0). -* When a client reset error which results in the current Realm file being - backed up and then deleted, deletion errors were ignored as long as the copy - succeeded. When this happens the deletion of the old file is now scheduled - for the next launch of the app. ([Core #5180](https://github.com/realm/realm-core/issues/5180), since v2.0.0) -* Fix an error when compiling a watchOS Simulator target not supporting - Thread-local storage ([#7623](https://github.com/realm/realm-swift/issues/7623), since v10.21.0). -* Add a validation check to report a sensible error if a Realm configuration - indicates that an in-memory Realm should be encrypted. ([Core #5195](https://github.com/realm/realm-core/issues/5195)) -* The Swift package set the linker flags on the wrong target, resulting in - linker errors when SPM decides to build the core library as a dynamic library - ([#7266](https://github.com/realm/realm-swift/issues/7266)). -* The download-core task failed if run in an environment without TMPDIR set - ([#7688](https://github.com/realm/realm-swift/issues/7688), since v10.23.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3 beta 3. - -### Internal - -* Upgraded realm-core from 11.9.0 to 11.11.0 - -10.23.0 Release notes (2022-02-28) -============================================================= - -### Enhancements - -* Add `Realm.writeCopy(configuration:)`/`[RLMRealm writeCopyForConfiguration:]` which gives the - following functionality: - - Export a local non-sync Realm to be used with MongoDB Realm Sync - when the configuration is derived from a sync `RLMUser`/`User`. - - Write a copy of a local Realm to a destination specified in the configuration. - - Write a copy of a synced Realm in use with user A, and open it with user B. - - Note that migrations may be required when using a local realm configuration to open a realm file that - was copied from a synchronized realm. - - An exception will be thrown if a Realm exists at the destination. -* Add a `seedFilePath` option to `RLMRealmConfiguration` and `Configuration`. If this - option is set then instead of creating an empty Realm, the realm at the `seedFilePath` will - be copied to the `fileURL` of the new Realm. If a Realm file already exists at the - desitnation path, the seed file will not be copied and the already existing Realm - will be opened instead. Note that to use this parameter with a synced Realm configuration - the seed Realm must be appropriately copied to a destination with - `Realm.writeCopy(configuration:)`/`[RLMRealm writeCopyForConfiguration:]` first. -* Add ability to permanently delete a User from a MongoDB Realm app. This can - be invoked with `User.delete()`/`[RLMUser deleteWithCompletion:]`. -* Add `NSCopying` conformance to `RLMDecimal128` and `RLMObjectId`. -* Add Xcode 13.3 binaries to the release package (and remove 13.0). - -### Fixed - -* Add support of arm64 in Carthage build ([#7154](https://github.com/realm/realm-cocoa/issues/7154) -* Adding missing support for `IN` queries to primitives types on Type Safe Queries. - ```swift - let persons = realm.objects(Person.self).where { - let acceptableNames = ["Tom", "James", "Tyler"] - $0.name.in([acceptableNames]) - } - ``` - ([Cocoa #7633](https://github.com/realm/realm-swift/issues/7633), since v10.19.0) -* Work around a compiler crash when building with Swift 5.6 / Xcode 13.3. - CustomPersistable's PersistedType must now always be a built-in type rather - than possibly another CustomPersistable type as Swift 5.6 has removed support - for infinitely-recursive associated types ([#7654](https://github.com/realm/realm-swift/issues/7654)). -* Fix redundant call to filter on `@ObservedResults` from `searchable` - component (since v10.19.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3 beta 3. - -10.22.0 Release notes (2022-01-25) -============================================================= - -### Enhancements - -* Add beta support for flexible sync. See the [backend](https://docs.mongodb.com/realm/sync/data-access-patterns/flexible-sync/) and [SDK](https://docs.mongodb.com/realm/sdk/swift/examples/flexible-sync/) documentation for more information. Please report any issues with the beta through Github. - -### Fixed - -* UserIdentity metadata table grows indefinitely. ([#5152](https://github.com/realm/realm-core/issues/5152), since v10.20.0) -* We now report a useful error message when opening a sync Realm in non-sync mode or vice-versa.([#5161](https://github.com/realm/realm-core/pull/5161), since v5.0.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.2.1. - -### Internal - -* Upgraded realm-core from 11.8.0 to 11.9.0 - -10.21.1 Release notes (2022-01-12) -============================================================= - -### Fixed - -* The sync client will now drain the receive queue when a send fails with - ECONNRESET, ensuring that any error message from the server gets received and - processed. ([#5078](https://github.com/realm/realm-core/pull/5078)) -* Schema validation was missing for embedded objects in sets, resulting in an - unhelpful error being thrown if a Realm object subclass contained one (since v10.0.0). -* Opening a Realm with a schema that has an orphaned embedded object type - performed an extra empty write transaction (since v10.0.0). -* Freezing a Realm with a schema that has orphaned embedded object types threw - a "Wrong transactional state" exception (since v10.19.0). -* `@sum` and `@avg` queries on Dictionaries of floats or doubles used too much - precision for intermediates, resulting in incorrect rounding (since v10.5.0). -* Change the exception message for calling refresh on an immutable Realm from - "Continuous transaction through DB object without history information." to - "Can't refresh a read-only Realm." - ([#5061](https://github.com/realm/realm-core/issues/5061), since v10.8.0). -* Queries of the form "link.collection.@sum = 0" where `link` is null matched - when `collection` was a List or Set, but not a Dictionary - ([#5080](https://github.com/realm/realm-core/pull/5080), since v10.8.0). -* Types which require custom obj-c bridging (such as `PersistableEnum` or - `CustomPersistable`) would crash with exceptions mentioning `__SwiftValue` in - a variety of places on iOS versions older than iOS 14 - ([#7604](https://github.com/realm/realm-swift/issues/7604), since v10.21.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.2.1. - -### Internal - -* Upgraded realm-core from 11.6.1 to 11.8.0. - -10.21.0 Release notes (2022-01-10) -============================================================= - -### Enhancements - -* Add `metadata` property to `RLMUserProfile`/`UserProfile`. -* Add class `Projection` to allow creation of light weight view models out of Realm Objects. -```swift -public class Person: Object { - @Persisted var firstName = "" - @Persisted var lastName = "" - @Persisted var address: Address? = nil - @Persisted var friends = List() -} - -public class Address: EmbeddedObject { - @Persisted var city: String = "" - @Persisted var country = "" -} - -class PersonProjection: Projection { - // `Person.firstName` will have same name and type - @Projected(\Person.firstName) var firstName - // There will be the only String for `city` of the original object `Address` - @Projected(\Person.address.city) var homeCity - // List will be mapped to list of firstNames - @Projected(\Person.friends.projectTo.firstName) var firstFriendsName: ProjectedCollection -} - -// `people` will contain projections for every `Person` object in the `realm` -let people: Results = realm.objects(PersonProjection.self) -``` -* Greatly improve performance of reading AnyRealmValue and enum types from - Realm collections. -* Allow using Swift enums which conform to `PersistableEnum` as the value type - for all Realm collections. -* `AnyRealmCollection` now conforms to `Encodable`. -* AnyRealmValue and PersistableEnum values can now be passed directly to an - NSPredicate used in a filter() call rather than having to pass the rawValue - (the rawValue is still allowed). -* Queries on collections of PersistableEnums can now be performed with `where()`. -* Add support for querying on the rawValue of an enum with `where()`. -* `.count` is supported for Maps of all types rather than just numeric types in `where()`. -* Add support for querying on the properties of objects contained in - dictionaries (e.g. "dictProperty.@allValues.name CONTAINS 'a'"). -* Improve the error message for many types of invalid predicates in queries. -* Add support for comparing `@allKeys` to another property on the same object. -* Add `Numeric` conformance to `Decimal128`. -* Make some invalid property declarations such as `List` a - compile-time error instead of a runtime error. -* Calling `.sorted(byKeyPath:)` on a collection with an Element type which does - not support sorting by keypaths is now a compile-time error instead of a - runtime error. -* `RealmCollection.sorted(ascending:)` can now be called on all - non-Object/EmbeddedObject collections rather than only ones where the - `Element` conforms to `Comparable`. -* Add support for using user-defined types with `@Persistable` and in Realm - collections by defining a mapping to and from a type which Realm knows how to - store. For example, `URL` can be made persistable with: - ```swift - extension URL: FailableCustomPersistable { - // Store URL values as a String in Realm - public typealias PersistedType = String - // Convert a String to a URL - public init?(persistedValue: String) { self.init(string: persistedValue) } - // Convert a URL to a String - public var persistableValue: String { self.absoluteString } - } - ``` - After doing this, `@Persisted var url: URL` is a valid property declaration - on a Realm object. More advanced mappings can be done by mapping to an - EmbeddedObject which can store multiple values. - -### Fixed - -* Accessing a non object collection inside a migration would cause a crash -* [#5633](https://github.com/realm/realm-cocoa/issues/5633). -* Accessing a `Map` of objects dynamically would not handle nulled values correctly (since v10.8.0). -* `where()` allowed constructing some nonsensical queries due to boolean - comparisons returning `Query` rather than `Query` (since v10.19.0). -* `@allValues` queries on dictionaries accidentally did not require "ANY". -* Case-insensitive and diacritic-insensitive modifiers were ignored when - comparing the result of an aggregate operation to another property in a - query. -* `Object.init(value:)` did not allow initializing `RLMDictionary`/`Map` - properties with null values for map entries (since v10.8.0). -* `@ObservedResults` did not refresh when changes were made to the observed - collection. (since v10.6.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.2.1. - -10.20.1 Release notes (2021-12-14) -============================================================= - -Xcode 12.4 is now the minimum supported version of Xcode. - -### Fixed - -* Add missing `Indexable` support for UUID. - ([Cocoa #7545](https://github.com/realm/realm-swift/issues/7545), since v10.10.0) - -### Breaking Changes - -* All `async` functions now require Xcode 13.2 to work around an App - Store/TestFlight bug that results in apps built with 13.0/13.1 which do not - use libConcurrency but link a library which does crashing on startup. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.2. - -10.20.0 Release notes (2021-11-16) -============================================================= - -### Enhancements - -* Conform `@ThreadSafe` and `ThreadSafeReference` to `Sendable`. -* Allow using Swift enums which conform to `PersistableEnum` as the value type - for all Realm collections. -* `AnyRealmCollection` now conforms to `Encodable`. -* Greatly improve performance of reading AnyRealmValue and enum types from - Realm collections. -* `AnyRealmCollection` now conforms to `Encodable`. - -### Fixed - -* `@AutoOpen` will open the existing local Realm file on any connection error - rather than only when the connection specifically times out. -* Do not allow `progress` state changes for `@AutoOpen` and `@AsyncOpen` after - changing state to `open(let realm)` or `error(let error)`. -* Logging out a sync user failed to remove the local Realm file for partitions - with very long partition values that would have exceeded the maximum path - length. ([Core #4187](https://github.com/realm/realm-core/issues/4187), since v10.0.0) -* Don't keep trying to refresh the access token if the client's clock is more - than 30 minutes fast. ([Core #4941](https://github.com/realm/realm-core/issues/4941)) -* Failed auth requests used a fixed long sleep rather than exponential backoff - like other sync requests, which could result in very delayed reconnects after - a device was offline long enough for the access token to expire (since v10.0.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.1. - -### Internal - -* Upgraded realm-core from 11.6.0 to 11.6.1. - -10.19.0 Release notes (2021-11-04) -============================================================= - -### Enhancements - -* Add `.searchable()` SwiftUI View Modifier which allows filtering - `@ObservedResult` results from a search field component by a key path. - ```swift - List { - ForEach(reminders) { reminder in - ReminderRowView(reminder: reminder) - } - }.searchable(text: $searchFilter, - collection: $reminders, - keyPath: \.name) { - ForEach(reminders) { remindersFiltered in - Text(remindersFiltered.name).searchCompletion(remindersFiltered.name) - } - } - ``` -* Add an API for a type safe query syntax. This allows you to filter a Realm - and collections managed by a Realm with Swift style expressions. Here is a - brief example: - ```swift - class Person: Object { - @Persisted var name: String - @Persisted var hobbies: MutableSet - @Persisted var pets: List - } - class Pet: Object { - @Persisted var name: String - @Persisted var age: Int - } - - let persons = realm.objects(Person.self).where { - $0.hobbies.contains("music") || $0.hobbies.contains("baseball") - } - - persons = realm.objects(Person.self).where { - ($0.pets.age >= 2) && $0.pets.name.starts(with: "L") - } - ``` - ([#7419](https://github.com/realm/realm-swift/pull/7419)) -* Add support for dictionary subscript expressions - (e.g. `"phoneNumbers['Jane'] == '123-3456-123'"`) when querying with an - NSPredicate. -* Add UserProfile to User. This contains metadata from social logins with MongoDB Realm. -* Slightly reduce the peak memory usage when processing sync changesets. - -### Fixed - -* Change default request timeout for `RLMApp` from 6 seconds to 60 seconds. -* Async `Realm` init would often give a Realm instance which could not actually - be used and would throw incorrect thread exceptions. It now is `@MainActor` - and gives a Realm instance which always works on the main actor. The - non-functional `queue:` parameter has been removed (since v10.15.0). -* Restore the pre-v10.12.0 behavior of calling `writeCopy()` on a synchronized - Realm which produced a local non-synchronized Realm - ([#7513](https://github.com/realm/realm-swift/issues/7513)). -* Decimal128 did not properly normalize the value before hashing and so could - have multiple values which are equal but had different hash values (since v10.8.0). -* Fix a rare assertion failure or deadlock when a sync session is racing to - close at the same time that external reference to the Realm is being - released. ([Core #4931](https://github.com/realm/realm-core/issues/4931)) -* Fix a assertion failure when opening a sync Realm with a user who had been - removed. Instead an exception will be thrown. ([Core #4937](https://github.com/realm/realm-core/issues/4937), since v10.0.0) -* Fixed a rare segfault which could trigger if a user was being logged out - while the access token refresh response comes in. - ([Core #4944](https://github.com/realm/realm-core/issues/4944), since v10.0.0) -* Fixed a bug where progress notifiers on an AsyncOpenTask could be called - after the open completed. ([Core #4919](https://github.com/realm/realm-core/issues/4919)) -* SecureTransport was not enabled for macCatalyst builds when installing via - SPM, resulting in `'SSL/TLS protocol not supported'` exceptions when using - Realm Sync. ([#7474](https://github.com/realm/realm-swift/issues/7474)) -* Users were left in the logged in state when their refresh token expired. - ([Core #4882](https://github.com/realm/realm-core/issues/4882), since v10) -* Calling `.count` on a distinct collection would return the total number of - objects in the collection rather than the distinct count the first time it is - called. ([#7481](https://github.com/realm/realm-swift/issues/7481), since v10.8.0). -* `realm.delete(collection.distinct(...))` would delete all objects in the - collection rather than just the first object with each distinct value in the - property being distincted on, unless the distinct Results were read from at - least once first (since v10.8.0). -* Calling `.distinct()` on a collection, accessing the Results, then passing - the Results to `realm.delete()` would delete the correct objects, but - afterwards report a count of zero even if there were still objects in the - Results (since v10.8.0). -* Download compaction could result in non-streaming sync download notifiers - never reporting completion (since v10.0.0, - [Core #4989](https://github.com/realm/realm-core/pull/4989)). -* Fix a deadlock in SyncManager that was probably not possible to hit in - real-world code (since v10.0.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.2. - -### Internal - -* Upgraded realm-core from v11.4.1 to v11.6.0 - -10.18.0 Release notes (2021-10-25) -============================================================= - -### Enhancements - -* Add support for using multiple users with `@AsyncOpen` and `@AutoOpen`. - Setting the current user to a new user will now automatically reopen the - Realm with the new user. -* Add prebuilt binary for Xcode 13.1 to the release package. - -### Fixed - -* Fix `@AsyncOpen` and `@AutoOpen` using `defaultConfiguration` by default if - the user's doesn't provide one, will set an incorrect path which doesn't - correspond to the users configuration one. (since v10.12.0) -* Adding missing subscription completion for `AsyncOpenPublisher` after - successfully returning a realm. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.1. - -10.17.0 Release notes (2021-10-06) -============================================================= - -### Enhancements - -* Add a new `@ThreadSafe` property wrapper. Objects and collections wrapped by `@ThreadSafe` may be passed between threads. It's - intended to allow local variables and function parameters to be used across - threads when needed. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.0. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0. - -10.16.0 Release notes (2021-09-29) -============================================================= - -### Enhancements - -* Add `async` versions of `EmailPasswordAuth.callResetPasswordFunction` and -r `User.linkUser` methods. -* Add `async` version of `MongoCollection` methods. -* Add `async` support for user functions. - -### Fixed - -* A race condition in Realm.asyncOpen() sometimes resulted in subsequent writes - from Realm Sync failing to produce notifications - ([#7447](https://github.com/realm/realm-swift/issues/7447), - [#7453](https://github.com/realm/realm-swift/issues/7453), - [Core #4909](https://github.com/realm/realm-core/issues/4909), since v10.15.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.0. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0. - -10.15.1 Release notes (2021-09-15) -============================================================= - -### Enhancements - -* Switch to building the Carthage release with Xcode 13. - -### Fixed - -* Fix compilation error where Swift 5.5 is available but the macOS 12 SDK was - not. This was notable for the Xcode 13 RC. This fix adds a #canImport check - for the `_Concurrency` module that was not available before the macOS 12 SDK. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.0. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0. - -10.15.0 Release notes (2021-09-10) -============================================================= - -### Enhancements - -* Add `async` versions of the `Realm.asyncOpen` and `App.login` methods. -* ThreadSafeReference no longer pins the source transaction version for - anything other than a Results created by filtering a collection. This means - that holding on to thread-safe references to other things (such as Objects) - will no longer cause file size growth. -* A ThreadSafeReference to a Results backed by a collection can now be created - inside a write transaction as long as the collection was not created in the - current write transaction. -* Synchronized Realms are no longer opened twice, cutting the address space and - file descriptors used in half. - ([Core #4839](https://github.com/realm/realm-core/pull/4839)) -* When using the SwiftUI helper types (@ObservedRealmObject and friends) to - bind to an Equatable property, self-assignment no longer performs a pointless - write transaction. SwiftUI appears to sometimes call a Binding's set function - multiple times for a single UI action, so this results in significantly fewer - writes being performed. - -### Fixed - -* Adding an unmanaged object to a Realm that was declared with - `@StateRealmObject` would throw the exception `"Cannot add an object with - observers to a Realm"`. -* The `RealmCollectionChange` docs refered to indicies in modifications as the - 'new' collection. This is incorrect and the docs now state that modifications - refer to the previous version of the collection. ([Cocoa #7390](https://github.com/realm/realm-swift/issues/7390)) -* Fix crash in `RLMSyncConfiguration.initWithUser` error mapping when a user is disabled/deleted from MongoDB Realm dashboard. - ([Cocoa #7399](https://github.com/realm/realm-swift/issues/7399), since v10.0.0) -* If the application crashed at the wrong point when logging a user in, the - next run of the application could hit the assertion failure "m_state == - SyncUser::State::LoggedIn" when a synchronized Realm is opened with that - user. ([Core #4875](https://github.com/realm/realm-core/issues/4875), since v10.0.0) -* The `keyPaths:` parameter to `@ObservedResults` did not work (since v10.12.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 5. - -### Internal - -* Upgraded realm-core from 11.3.1 to 11.4.1 - -10.14.0 Release notes (2021-09-03) -============================================================= - -### Enhancements - -* Add additional `observe` methods for Objects and RealmCollections which take - a `PartialKeyPath` type key path parameter. -* The release package once again contains Xcode 13 binaries. -* `PersistableEnum` properties can now be indexed or used as the primary key if - the RawValue is an indexable or primary key type. - -### Fixed - -* `Map` did not conform to `Codable`. - ([Cocoa #7418](https://github.com/realm/realm-swift/pull/7418), since v10.8.0) -* Fixed "Invalid data type" assertion failure in the sync client when the - client recieved an AddColumn instruction from the server for an AnyRealmValue - property when that property already exists locally. ([Core #4873](https://github.com/realm/realm-core/issues/4873), since v10.8.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 5. - -### Internal - -* Upgraded realm-core from 11.3.0 to 11.3.1. - -10.13.0 Release notes (2021-08-26) -============================================================= - -### Enhancements - -* Sync logs now contain information about what object/changeset was being applied when the exception was thrown. - ([Core #4836](https://github.com/realm/realm-core/issues/4836)) -* Added ServiceErrorCode for wrong username/password when using '`App.login`. - ([Core #7380](https://github.com/realm/realm-swift/issues/7380) - -### Fixed - -* Fix crash in `MongoCollection.findOneDocument(filter:)` that occurred when no results were - found for a given filter. - ([Cocoa #7380](https://github.com/realm/realm-swift/issues/7380), since v10.0.0) -* Some of the SwiftUI property wrappers incorrectly required objects to conform - to ObjectKeyIdentifiable rather than Identifiable. - ([Cocoa #7372](https://github.com/realm/realm-swift/issues/7372), since v10.6.0) -* Work around Xcode 13 beta 3+ shipping a broken swiftinterface file for Combine on 32-bit iOS. - ([Cocoa #7368](https://github.com/realm/realm-swift/issues/7368)) -* Fixes history corruption when replacing an embedded object in a list. - ([Core #4845](https://github.com/realm/realm-core/issues/4845)), since v10.0.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 5. - -### Internal - -* Upgraded realm-core from 11.2.0 to 11.3.0 - -10.12.0 Release notes (2021-08-03) -============================================================= - -### Enhancements - -* `Object.observe()` and `RealmCollection.observe()` now include an optional - `keyPaths` parameter which filters change notifications to those only - occurring on the provided key path or key paths. See method documentation - for extended detail on filtering behavior. -* `ObservedResults` now includes an optional `keyPaths` parameter - which filters change notifications to those only occurring on the provided - key path or key paths. ex) `@ObservedResults(MyObject.self, keyPaths: ["myList.property"])` -* Add two new property wrappers for opening a Realm asynchronously in a - SwiftUI View: - - `AsyncOpen` is a property wrapper that initiates Realm.asyncOpen - for the current user, notifying the view when there is a change in Realm asyncOpen state. - - `AutoOpen` behaves similarly to `AsyncOpen`, but in the case of no internet - connection this will return an opened realm. -* Add `EnvironmentValues.partitionValue`. This value can be injected into any view using one of - our new property wrappers `AsyncOpen` and `AutoOpen`: - `MyView().environment(\.partitionValue, "partitionValue")`. -* Shift more of the work done when first initializing a collection notifier to - the background worker thread rather than doing it on the main thread. - -### Fixed - -* `configuration(partitionValue: AnyBSON)` would always set a nil partition value - for the user sync configuration. -* Decoding a `@Persisted` property would incorrectly throw a `DecodingError.keyNotFound` - for an optional property if the key is missing. - ([Cocoa #7358](https://github.com/realm/realm-swift/issues/7358), since v10.10.0) -* Fixed a symlink which prevented Realm from building on case sensitive file systems. - ([#7344](https://github.com/realm/realm-swift/issues/7344), since v10.8.0) -* Removing a change callback from a Results would sometimes block the calling - thread while the query for that Results was running on the background worker - thread (since v10.11.0). -* Object observers did not handle the object being deleted properly, which - could result in assertion failures mentioning "m_table" in ObjectNotifier - ([Core #4824](https://github.com/realm/realm-core/issues/4824), since v10.11.0). -* Fixed a crash when delivering notifications over a nested hierarchy of lists - of Mixed that contain links. ([Core #4803](https://github.com/realm/realm-core/issues/4803), since v10.8.0) -* Fixed a crash when an object which is linked to by a Mixed is deleted via - sync. ([Core #4828](https://github.com/realm/realm-core/pull/4828), since v10.8.0) -* Fixed a rare crash when setting a mixed link for the first time which would - trigger if the link was to the same table and adding the backlink column - caused a BPNode split. ([Core #4828](https://github.com/realm/realm-core/pull/4828), since v10.8.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 4. On iOS Xcode 13 beta 2 is the latest supported - version due to betas 3 and 4 having a broken Combine.framework. - -### Internal - -* Upgraded realm-core from v11.1.1 to v11.2.0 - -10.11.0 Release notes (2021-07-22) -============================================================= - -### Enhancements - -* Add type safe methods for: - - `RealmCollection.min(of:)` - - `RealmCollection.max(of:)` - - `RealmCollection.average(of:)` - - `RealmCollection.sum(of:)` - - `RealmCollection.sorted(by:ascending:)` - - `RealmKeyedCollection.min(of:)` - - `RealmKeyedCollection.max(of:)` - - `RealmKeyedCollection.average(of:)` - - `RealmKeyedCollection.sum(of:)` - - `RealmKeyedCollection.sorted(by:ascending:)` - - `Results.distinct(by:)` - - `SortDescriptor(keyPath:ascending:) - - Calling these methods can now be done via Swift keyPaths, like so: - ```swift - class Person: Object { - @Persisted var name: String - @Persisted var age: Int - } - - let persons = realm.objects(Person.self) - persons.min(of: \.age) - persons.max(of: \.age) - persons.average(of: \.age) - persons.sum(of: \.age) - persons.sorted(by: \.age) - persons.sorted(by: [SortDescriptor(keyPath: \Person.age)]) - persons.distinct(by: [\Person.age]) - ``` -* Add `List.objects(at indexes:)` in Swift and `[RLMCollection objectsAtIndexes:]` in Objective-C. - This allows you to select elements in a collection with a given IndexSet ([#7298](https://github.com/realm/realm-swift/issues/7298)). -* Add `App.emailPasswordAuth.retryCustomConfirmation(email:completion:)` and `[App.emailPasswordAuth retryCustomConfirmation:completion:]`. - These functions support retrying a [custom confirmation](https://docs.mongodb.com/realm/authentication/email-password/#run-a-confirmation-function) function. -* Improve performance of creating collection notifiers for Realms with a complex schema. - This means that the first run of a query or first call to observe() on a collection will - do significantly less work on the calling thread. -* Improve performance of calculating changesets for notifications, particularly - for deeply nested object graphs and objects which have List or Set properties - with small numbers of objects in the collection. - -### Fixed - -* `RealmProperty` would crash when decoding a `null` json value. - ([Cocoa #7323](https://github.com/realm/realm-swift/issues/7323), since v10.8.0) -* `@Persisted` would crash when decoding a `null` value. - ([#7332](https://github.com/realm/realm-swift/issues/7332), since v10.10.0). -* Fixed an issue where `Realm.Configuration` would be set after views have been laid out - when using `.environment(\.realmConfiguration, ...)` in SwiftUI. This would cause issues if you are - required to bump your schema version and are using `@ObservedResults`. -* Sync user profiles now correctly persist between runs. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 3. Note that this release does not contain Xcode 13 - beta binaries as beta 3 does not include a working version of - Combine.framework for iOS. - -### Internal - -* Upgraded realm-core from 11.0.4 to 11.1.1 - -10.10.0 Release notes (2021-07-07) -============================================================= - -### Enhancements - -* Add a new property wrapper-based declaration syntax for properties on Realm - Swift object classes. Rather than using `@objc dynamic` or the - `RealmProperty` wrapper type, properties can now be declared with `@Persisted - var property: T`, where `T` is any of the supported property types, including - optional numbers and collections. This has a few benefits: - - - All property types are now declared in the same way. No more remembering - that this type requires `@objc dynamic var` while this other type - requires `let`, and the `RealmProperty` or `RealmOptional` helper is no - longer needed for types not supported by Objective-C. - - No more overriding class methods like `primaryKey()`, - `indexedProperties()` or `ignoredProperties()`. The primary key and - indexed flags are set directly in the property declaration with - `@Persisted(primaryKey: true) var _id: ObjectId` or `@Persisted(indexed: - true) var indexedProperty: Int`. If any `@Persisted` properties are present, - all other properties are implicitly ignored. - - Some performance problems have been fixed. Declaring collection - properties as `let listProp = List()` resulted in the `List` object - being created eagerly when the parent object is read, which could cause - performance problems if a class has a large number of `List` or - `RealmOptional` properties. `@Persisted var list: List` allows us to - defer creating the `List` until it's accessed, improving performance - when looping over objects and using only some of the properties. - - Similarly, `let _id = ObjectId.generate()` was a convenient way to - declare a sync-compatible primary key, but resulted in new ObjectIds - being generated in some scenarios where the value would never actually be - used. `@Persisted var _id: ObjectId` has the same behavior of - automatically generating primary keys, but allows us to only generate it - when actually needed. - - More types of enums are supported. Any `RawRepresentable` enum whose raw - type is a type supported by Realm can be stored in an `@Persisted` - project, rather than just `@objc` enums. Enums must be declared as - conforming to the `PersistableEnum` protocol, and still cannot (yet) be - used in collections. - - `willSet` and `didSet` can be used with `@Persistable` properties, while - they previously did not work on managed Realm objects. - - While we expect the switch to the new syntax to be very simple for most - users, we plan to support the existing objc-based declaration syntax for the - foreseeable future. The new style and old style cannot be mixed within a - single class, but new classes can use the new syntax while existing classes - continue to use the old syntax. Updating an existing class to the new syntax - does not change what data is stored in the Realm file and so does not require - a migration (as long as you don't also change the schema in the process, of - course). -* Add `Map.merge()`, which adds the key-value pairs from another Map or - Dictionary to the map. -* Add `Map.asKeyValueSequence()` which returns an adaptor that can be used with - generic functions that operate on Dictionary-styled sequences. - -### Fixed -* AnyRealmValue enum values are now supported in more places when creating - objects. -* Declaring a property as `RealmProperty` will now report an - error during schema discovery rather than doing broken things when the - property is used. -* Observing the `invalidated` property of `RLMDictionary`/`Map` via KVO did not - set old/new values correctly in the notification (since 10.8.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 2. - -10.9.0 Release notes (2021-07-01) -============================================================= - -### Enhancements - -* Add `App.emailPasswordAuth.retryCustomConfirmation(email:completion:)` and - `[App.emailPasswordAuth retryCustomConfirmation:completion:]`. These - functions support retrying a [custom confirmation](https://docs.mongodb.com/realm/authentication/email-password/#run-a-confirmation-function) - function. -* Improve performance of many Dictionary operations, especially when KVO is being used. - -### Fixed - -* Calling `-[RLMRealm deleteObjects:]` on a `RLMDictionary` cleared the - dictionary but did not actually delete the objects in the dictionary (since v10.8.0). -* Rix an assertion failure when observing a `List` contains - object links. ([Core #4767](https://github.com/realm/realm-core/issues/4767), since v10.8.0) -* Fix an assertion failure when observing a `RLMDictionary`/`Map` which links - to an object which was deleting by a different sync client. - ([Core #4770](https://github.com/realm/realm-core/pull/4770), since v10.8.0) -* Fix an endless recursive loop that could cause a stack overflow when - computing changes on a set of objects which contained cycles. - ([Core #4770](https://github.com/realm/realm-core/pull/4770), since v10.8.0). -* Hash collisions in dictionaries were not handled properly. - ([Core #4776](https://github.com/realm/realm-core/issues/4776), since v10.8.0). -* Fix a crash after clearing a list or set of AnyRealmValue containing links to - objects ([Core #4774](https://github.com/realm/realm-core/issues/4774), since v10.8.0) -* Trying to refresh a user token which had been revoked by an admin lead to an - infinite loop and then a crash. This situation now properly logs the user out - and reports an error. ([Core #4745](https://github.com/realm/realm-core/issues/4745), since v10.0.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 2. - -### Internal - -* Upgraded realm-core from v11.0.3 to v11.0.4 - -10.8.1 Release notes (2021-06-22) -============================================================= - -### Enhancements - -* Update Xcode 12.5 to Xcode 12.5.1. -* Create fewer dynamic classes at runtime, improving memory usage and startup time slightly. - -### Fixed - -* Importing the Realm swift package produced several warnings about excluded - files not existing. Note that one warning will still remain after this change. - ([#7295](https://github.com/realm/realm-swift/issues/7295), since v10.8.0). -* Update the root URL for the API docs so that the links go to the place where - new versions of the docs are being published. - ([#7299](https://github.com/realm/realm-swift/issues/7299), since v10.6.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. Note that this version of Realm Studio has not - yet been released at the time of this release. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 1. - -10.8.0 Release notes (2021-06-14) -============================================================= - -NOTE: This version upgrades the Realm file format version to add support for -the new data types and to adjust how primary keys are handled. Realm files -opened will be automatically upgraded and cannot be read by versions older than -v10.8.0. This upgrade should be a fairly fast one. Note that we now -automatically create a backup of the pre-upgrade Realm. - -### Enhancements - -* Add support for the `UUID` and `NSUUID` data types. These types can be used - for the primary key property of Object classes. -* Add two new collection types to complement the existing `RLMArray`/`List` type: - - `RLMSet` in Objective-C and `MutableSet` in Swift are mutable - unordered collections of distinct objects, similar to the built-in - `NSMutableSet` and `Set`. The values in a set may be any non-collection - type which can be stored as a Realm property. Sets are guaranteed to never - contain two objects which compare equal to each other, including when - conflicting writes are merged by sync. - - `RLMDictionary` in Objective-C and `Map` are - mutable key-value dictionaries, similar to the built-in - `NSMutableDictionary` and `Dictionary`. The values in a dictionary may be - any non-collection type which can be stored as a Realm property. The keys - must currently always be a string. -* Add support for dynamically typed properties which can store a value of any - of the non-collection types supported by Realm, including Object subclasses - (but not EmbeddedObject subclasses). These are declared with - `@property id propertyName;` in Objective-C and - `let propertyName = RealmProperty()` in Swift. - -### Fixed - -* Setting a collection with a nullable value type to null via one of the - dynamic interfaces would hit an assertion failure instead of clearing the - collection. -* Fixed an incorrect detection of multiple incoming links in a migration when - changing a table to embedded and removing a link to it at the same time. - ([#4694](https://github.com/realm/realm-core/issues/4694) since v10.0.0-beta.2) -* Fixed a divergent merge on Set when one client clears the Set and another - client inserts and deletes objects. - ([#4720](https://github.com/realm/realm-core/issues/4720)) -* Partially revert to pre-v5.0.0 handling of primary keys to fix a performance - regression. v5.0.0 made primary keys determine the position in the low-level - table where newly added objects would be inserted, which eliminated the need - for a separate index on the primary key. This made some use patterns slightly - faster, but also made some reasonable things dramatically slower. - ([#4522](https://github.com/realm/realm-core/issues/4522)) -* Fixed an incorrect detection of multiple incoming links in a migration when - changing a table to embedded and removing a link to it at the same time. - ([#4694](https://github.com/realm/realm-core/issues/4694) since v10.0.0-beta.2) -* Fix collection notification reporting for modifications. This could be - observed by receiving the wrong indices of modifications on sorted or - distinct results, or notification blocks sometimes not being called when only - modifications have occured. - ([#4573](https://github.com/realm/realm-core/pull/4573) since v5.0.0). -* Fix incorrect sync instruction emission when replacing an existing embedded - object with another embedded object.([Core #4740](https://github.com/realm/realm-core/issues/4740) - -### Deprecations - -* `RealmOptional` has been deprecated in favor of `RealmProperty`. - `RealmProperty` is functionality identical to `RealmOptional` when storing - optional numeric types, but can also store the new `AnyRealmValue` type. - -### Compatibility - -* Realm Studio: 11.0.0 or later. Note that this version of Realm Studio has not - yet been released at the time of this release. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 1. - -### Internal - -* Upgraded realm-core from v10.7.2 to v11.0.3 - -10.8.0-beta.2 Release notes (2021-06-01) -============================================================= - -### Enhancements - -* Add `RLMDictionary`/`Map<>` datatype. This is a Dictionary collection type used for storing key-value pairs in a collection. - -### Compatibility - -* Realm Studio: 11.0.0-beta.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v11.0.0-beta.4 to v11.0.0-beta.6 - -10.8.0-beta.0 Release notes (2021-05-07) -============================================================= - -### Enhancements - -* Add `RLMSet`/`MutableSet<>` datatype. This is a Set collection type used for storing distinct values in a collection. -* Add support for `id`/`AnyRealmValue`. -* Add support for `UUID`/`NSUUID` data type. - -### Fixed - -* None. - -### Deprecations - -* `RealmOptional` has been deprecated in favor of `RealmProperty`. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.7.2 to v10.8.0-beta.5 - -10.7.7 Release notes (2021-06-10) -============================================================= - -Xcode 12.2 is now the minimum supported version. - -### Enhancements - -* Add Xcode 13 beta 1 binaries to the release package. - -### Fixed - -* Fix a runtime crash which happens in some Xcode version (Xcode < 12, reported - in Xcode 12.5), where SwiftUI is not weak linked by default. This fix only - works for Cocoapods projects. - ([#7234](https://github.com/realm/realm-swift/issues/7234) -* Fix warnings when building with Xcode 13 beta 1. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 1. - -10.7.6 Release notes (2021-05-13) -============================================================= - -### Enhancements - -* Realms opened in read-only mode can now be invalidated (although it is - unlikely to be useful to do so). - -### Fixed - -* Fix an availability warning when building Realm. The code path which gave the - warning can not currently be hit, so this did not cause any runtime problems - ([#7219](https://github.com/realm/realm-swift/issues/7219), since 10.7.3). -* Proactively check the expiry time on the access token and refresh it before - attempting to initiate a sync session. This prevents some error logs from - appearing on the client such as: "ERROR: Connection[1]: Websocket: Expected - HTTP response 101 Switching Protocols, but received: HTTP/1.1 401 - Unauthorized" ([RCORE-473](https://jira.mongodb.org/browse/RCORE-473), since v10.0.0) -* Fix a race condition which could result in a skipping notifications failing - to skip if several commits using notification skipping were made in - succession (since v5.0.0). -* Fix a crash on exit inside TableRecycler which could happen if Realms were - open on background threads when the app exited. - ([Core #4600](https://github.com/realm/realm-core/issues/4600), since v5.0.0) -* Fix errors related to "uncaught exception in notifier thread: - N5realm11KeyNotFoundE: No such object" which could happen on sycnronized - Realms if a linked object was deleted by another client. - ([JS #3611](https://github.com/realm/realm-js/issues/3611), since v10.0.0). -* Reading a link to an object which has been deleted by a different client via - a string-based interface (such as value(forKey:) or the subscript operator on - DynamicObject) could return an invalid object rather than nil. - ([Core #4687](https://github.com/realm/realm-core/pull/4687), since v10.0.0) -* Recreate the sync metadata Realm if the encryption key for it is missing from - the keychain rather than crashing. This can happen if a device is restored - from an unencrypted backup, which restores app data but not the app's - keychain entries, and results in all cached logics for sync users being - discarded but no data being lost. - [Core #4285](https://github.com/realm/realm-core/pull/4285) -* Thread-safe references can now be created for read-only Realms. - ([#5475](https://github.com/realm/realm-swift/issues/5475)). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.6.0 to v10.7.2 - -10.7.5 Release notes (2021-05-07) -============================================================= - -### Fixed - -* Iterating over frozen collections on multiple threads at the same time could - throw a "count underflow" NSInternalInconsistencyException. - ([#7237](https://github.com/realm/realm-swift/issues/7237), since v5.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. - -10.7.4 Release notes (2021-04-26) -============================================================= - -### Enhancements - -* Add Xcode 12.5 binaries to the release package. - -### Fixed - -* Add the Info.plist file to the XCFrameworks in the Carthage xcframwork - package ([#7216](https://github.com/realm/realm-swift/issues/7216), since 10.7.3). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. - -10.7.3 Release notes (2021-04-22) -============================================================= - -### Enhancements - -* Package a prebuilt XCFramework for Carthage. Carthage 0.38 and later will - download this instead of the old frameworks when using `--use-xcframeworks`. -* We now make a backup of the realm file prior to any file format upgrade. The - backup is retained for 3 months. Backups from before a file format upgrade - allows for better analysis of any upgrade failure. We also restore a backup, - if a) an attempt is made to open a realm file whith a "future" file format - and b) a backup file exist that fits the current file format. - ([Core #4166](https://github.com/realm/realm-core/pull/4166)) -* The error message when the intial steps of opening a Realm file fails is now - more descriptive. -* Make conversion of Decimal128 to/from string work for numbers with more than - 19 significant digits. This means that Decimal128's initializer which takes a - string will now never throw, as it previously threw only for out-of-bounds - values. The initializer is still marked as `throws` for - backwards compatibility. - ([#4548](https://github.com/realm/realm-core/issues/4548)) - -### Fixed - -* Adjust the header paths for the podspec to avoid accidentally finding a file - which isn't part of the pod that produced warnings when importing the - framework. ([#7113](https://github.com/realm/realm-swift/issues/7113), since 10.5.2). -* Fixed a crash that would occur when observing unmanaged Objects in multiple - views in SwiftUI. When using `@StateRealmObject` or `@ObservedObject` across - multiple views with an unmanaged object, each view would subscribe to the - object. As each view unsubscribed (generally when trailing back through the - view stack), our propertyWrappers would attempt to remove the KVOs for each - cancellation, when it should only be done once. We now correctly remove KVOs - only once. ([#7131](https://github.com/realm/realm-swift/issues/7131)) -* Fixed `isInvalidated` not returning correct value after object deletion from - Realm when using a custom schema. The object's Object Schema was not updated - when the object was added to the realm. We now correctly update the object - schema when adding it to the realm. - ([#7181](https://github.com/realm/realm-swift/issues/7181)) -* Syncing large Decimal128 values would cause "Assertion failed: cx.w[1] == 0" - ([Core #4519](https://github.com/realm/realm-core/issues/4519), since v10.0.0). -* Potential/unconfirmed fix for crashes associated with failure to memory map - (low on memory, low on virtual address space). For example - ([#4514](https://github.com/realm/realm-core/issues/4514), since v5.0.0). -* Fix assertion failures such as "!m_notifier_skip_version.version" or - "m_notifier_sg->get_version() + 1 == new_version.version" when performing - writes inside change notification callbacks. Previously refreshing the Realm - by beginning a write transaction would skip delivering notifications, leaving - things in an inconsistent state. Notifications are now delivered recursively - when needed instead. ([Cocoa #7165](https://github.com/realm/realm-swift/issues/7165)). -* Fix collection notification reporting for modifications. This could be - observed by receiving the wrong indices of modifications on sorted or - distinct results, or notification blocks sometimes not being called when only - modifications have occured. - ([#4573](https://github.com/realm/realm-core/pull/4573) since v5.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.5.5 to v10.6.0 -* Add additional debug validation to file map management that will hopefully - catch cases where we unmap something which is still in use. - -10.7.2 Release notes (2021-03-08) -============================================================= - -### Fixed - -* During integration of a large amount of data from the server, you may get - "Assertion failed: !fields.has_missing_parent_update()" - ([Core #4497](https://github.com/realm/realm-core/issues/4497), since v6.0.0) - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.5.4 to v10.5.5 - -10.7.1 Release notes (2021-03-05) -============================================================= - -### Fixed - -* Queries of the form "a.b.c == nil" would match objects where `b` is `nil` if - `c` did not have an index and did not if `c` was indexed. Both will now match - to align with NSPredicate's behavior. ([Core #4460]https://github.com/realm/realm-core/pull/4460), since 4.3.0). -* Restore support for upgrading files from file format 5 (Realm Cocoa 1.x). - ([Core #7089](https://github.com/realm/realm-swift/issues/7089), since v5.0.0) -* On 32bit devices you may get exception with "No such object" when upgrading - to v10.* ([Java #7314](https://github.com/realm/realm-java/issues/7314), since v5.0.0) -* The notification worker thread would rerun queries after every commit rather - than only commits which modified tables which could effect the query results - if the table had any outgoing links to tables not used in the query. - ([Core #4456](https://github.com/realm/realm-core/pull/4456), since v5.0.0). -* Fix "Invalid ref translation entry [16045690984833335023, 78187493520]" - assertion failure which could occur when using sync or multiple processes - writing to a single Realm file. - ([#7086](https://github.com/realm/realm-swift/issues/7086), since v5.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.5.3 to v10.5.4 - -10.7.0 Release notes (2021-02-23) -============================================================= - -### Enhancements - -* Add support for some missing query operations on data propertys: - - Data properties can be compared to other data properties - (e.g. "dataProperty1 == dataProperty2"). - - Case and diacritic-insensitive queries can be performed on data properties. - This will only have meaningful results if the data property contains UTF-8 - string data. - - Data properties on linked objects can be queried - (e.g. "link.dataProperty CONTAINS %@") -* Implement queries which filter on lists other than object links (lists of - objects were already supported). All supported operators for normal - properties are now supported for lists (e.g. "ANY intList = 5" or "ANY - stringList BEGINSWITH 'prefix'"), as well as aggregate operations on the - lists (such as "intArray.@sum > 100"). -* Performance of sorting on more than one property has been improved. - Especially important if many elements match on the first property. Mitigates - ([#7092](https://github.com/realm/realm-swift/issues/7092)) - -### Fixed - -* Fixed a bug that prevented an object type with incoming links from being - marked as embedded during migrations. ([Core #4414](https://github.com/realm/realm-core/pull/4414)) -* The Realm notification listener thread could sometimes hit the assertion - failure "!skip_version.version" if a write transaction was committed at a - very specific time (since v10.5.0). -* Added workaround for a case where upgrading an old file with illegal string - would crash ([#7111](https://github.com/realm/realm-swift/issues/7111)) -* Fixed a conflict resolution bug related to the ArrayMove instruction, which - could sometimes cause an "Invalid prior_size" exception to prevent - synchronization (since v10.5.0). -* Skipping a change notification in the first write transaction after the - observer was added could potentially fail to skip the notification (since v10.5.1). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.5.0 to v10.5.3 - -10.6.0 Release notes (2021-02-15) -============================================================= - -### Enhancements - -* Add `@StateRealmObject` for SwiftUI support. This property wrapper type instantiates an observable object on a View. - Use in place of `SwiftUI.StateObject` for Realm `Object`, `List`, and `EmbeddedObject` types. -* Add `@ObservedRealmObject` for SwiftUI support. This property wrapper type subscribes to an observable object - and invalidates a view whenever the observable object changes. Use in place of `SwiftUI.ObservedObject` for - Realm `Object`, `List`, or `EmbeddedObject` types. -* Add `@ObservedResults` for SwiftUI support. This property wrapper type retrieves results from a Realm. - The results use the realm configuration provided by the environment value `EnvironmentValues.realmConfiguration`. -* Add `EnvironmentValues.realm` and `EnvironmentValues.realmConfiguration` for `Realm` - and `Realm.Configuration` types respectively. Values can be injected into views using the `View.environment` method, e.g., `MyView().environment(\.realmConfiguration, Realm.Configuration(fileURL: URL(fileURLWithPath: "myRealmPath.realm")))`. - The value can then be declared on the example `MyView` as `@Environment(\.realm) var realm`. -* Add `SwiftUI.Binding` extensions where `Value` is of type `Object`, `List`, or `EmbeddedObject`. - These extensions expose methods for wrapped write transactions, to avoid boilerplate within - views, e.g., `TextField("name", $personObject.name)` or `$personList.append(Person())`. -* Add `Object.bind` and `EmbeddedObject.bind` for SwiftUI support. This allows you to create - bindings of realm properties when a propertyWrapper is not available for you to do so, e.g., `TextField("name", personObject.bind(\.name))`. -* The Sync client now logs error messages received from server rather than just - the size of the error message. -* Errors returned from the server when sync WebSockets get closed are now - captured and surfaced as a SyncError. -* Improve performance of sequential reads on a Results backed directly by a - Table (i.e. `realm.object(ClasSName.self)` with no filter/sort/etc.) by 50x. -* Orphaned embedded object types which are not linked to by any top-level types - are now better handled. Previously the server would reject the schema, - resulting in delayed and confusing error reporting. Explicitly including an - orphan in `objectTypes` is now immediately reported as an error when opening - the Realm, and orphans are automatically excluded from the auto-discovered - schema when `objectTypes` is not specified. - -### Fixed - -* Reading from a Results backed directly by a Table (i.e. - `realm.object(ClasSName.self)` with no filter/sort/etc.) would give incorrect - results if the Results was constructed and accessed before creating a new - object with a primary key less than the smallest primary key which previously - existed. ([#7014](https://github.com/realm/realm-swift/issues/7014), since v5.0.0). -* During synchronization you might experience crash with - "Assertion failed: ref + size <= next->first". - ([Core #4388](https://github.com/realm/realm-core/issues/4388)) - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.4.0 to v10.5.0 - -10.5.2 Release notes (2021-02-09) -============================================================= - -### Enhancements - -* Add support for "thawing" objects. `Realm`, `Results`, `List` and `Object` - now have `thaw()` methods which return a live copy of the frozen object. This - enables app behvaior where a frozen object can be made live again in order to - mutate values. For example, first freezing an object passed into UI view, - then thawing the object in the view to update values. -* Add Xcode 12.4 binaries to the release package. - -### Fixed - -* Inserting a date into a synced collection via `AnyBSON.datetime(...)` would - be of type `Timestamp` and not `Date`. This could break synced objects with a - `Date` property. - ([#6654](https://github.com/realm/realm-swift/issues/6654), since v10.0.0). -* Fixed an issue where creating an object after file format upgrade may fail - with assertion "Assertion failed: lo() <= std::numeric_limits::max()" - ([#4295](https://github.com/realm/realm-core/issues/4295), since v5.0.0) -* Allow enumerating objects in migrations with types which are no longer - present in the schema. -* Add `RLMResponse.customStatusCode`. This fixes timeout exceptions that were - occurring with a poor connection. ([#4188](https://github.com/realm/realm-core/issues/4188)) -* Limit availability of ObjectKeyIdentifiable to platforms which support - Combine to match the change made in the Xcode 12.5 SDK. - ([#7083](https://github.com/realm/realm-swift/issues/7083)) - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.3.3 to v10.4.0 - -10.5.1 Release notes (2021-01-15) -============================================================= - -### Enhancements - -* Add Xcode 12.3 binary to release package. -* Add support for queries which have nil on the left side and a keypath on the - right side (e.g. "nil == name" rather than "name == nil" as was previously - required). - -### Fixed -* Timeouts when calling server functions via App would sometimes crash rather - than report an error. -* Fix a race condition which would lead to "uncaught exception in notifier - thread: N5realm15InvalidTableRefE: transaction_ended" and a crash when the - source Realm was closed or invalidated at a very specific time during the - first run of a collection notifier - ([#3761](https://github.com/realm/realm-core/issues/3761), since v5.0.0). -* Deleting and recreating objects with embedded objects may fail. - ([Core PR #4240](https://github.com/realm/realm-core/pull/4240), since v10.0.0) -* Fast-enumerating a List after deleting the parent object would crash with an - assertion failure rather than a more appropriate exception. - ([Core #4114](https://github.com/realm/realm-core/issues/4114), since v5.0.0). -* Fix an issue where calling a MongoDB Realm Function would never be performed as the reference to the weak `User` was lost. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.3. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.3.2 to v10.3.3 - -10.5.0 Release notes (2020-12-14) -============================================================= - -### Enhancements - -* MongoDB Realm is now supported when installing Realm via Swift Package Manager. - -### Fixed - -* The user identifier was added to the file path for synchronized Realms twice - and an extra level of escaping was performed on the partition value. This did - not cause functional problems, but made file names more confusing than they - needed to be. Existing Realm files will continue to be located at the old - path, while newly created files will be created at a shorter path. (Since v10.0.0). -* Fix a race condition which could potentially allow queries on frozen Realms - to access an uninitialized structure for search indexes (since v5.0.0). -* Fix several data races in App and SyncSession initialization. These could - possibly have caused strange errors the first time a synchronized Realm was - opened (since v10.0.0). -* Fix a use of a dangling reference when refreshing a user’s custom data that - could lead to a crash (since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.1.4 to v10.3.2 - -10.4.0 Release notes (2020-12-10) -============================================================= - -### Enhancements - -* Add Combine support for App and User. These two types now have a - `objectWillChange` property that emits each time the state of the object has - changed (such as due to the user logging in or out). ([PR #6977](https://github.com/realm/realm-swift/pull/6977)). - -### Fixed - -* Integrating changesets from the server would sometimes hit the assertion - failure "n != realm::npos" inside Table::create_object_with_primary_key() - when creating an object with a primary key which previously had been used and - had incoming links. ([Core PR #4180](https://github.com/realm/realm-core/pull/4180), since v10.0.0). -* The arm64 simulator slices were not actually included in the XCFramework - release package. ([PR #6982](https://github.com/realm/realm-swift/pull/6982), since v10.2.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.1.3 to v10.1.4 -* Upgraded realm-sync from v10.1.4 to v10.1.5 - -10.3.0 Release notes (2020-12-08) -============================================================= - -### Enhancements - -* Add Google OpenID Connect Credentials, an alternative login credential to the - Google OAuth 2.0 credential. - -### Fixed - -* Fixed a bug that would prevent eventual consistency during conflict - resolution. Affected clients would experience data divergence and potentially - consistency errors as a result if they experienced conflict resolution - between cycles of Create-Erase-Create for objects with primary keys (since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-sync from v10.1.3 to v10.1.4 - -10.2.0 Release notes (2020-12-02) -============================================================= - -### Enhancements - -* The prebuilt binaries are now packaged as XCFrameworks. This adds support for - Catalyst and arm64 simulators when using them to install Realm, removes the - need for the strip-frameworks build step, and should simplify installation. -* The support functionality for using the Objective C API from Swift is now - included in Realm Swift and now includes all of the required wrappers for - MongoDB Realm types. In mixed Objective C/Swift projects, we recommend - continuing to use the Objective C types, but import both Realm and RealmSwift - in your Swift files. - -### Fixed - -* The user identifier was added to the file path for synchronized Realms twice - and an extra level of escaping was performed on the partition value. This did - not cause functional problems, but made file names more confusing than they - needed to be. Existing Realm files will continue to be located at the old - path, while newly created files will be created at a shorter path. (Since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -10.1.4 Release notes (2020-11-16) -============================================================= - -### Enhancements - -* Add arm64 slices to the macOS builds. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.0.1 to v10.1.3 -* Upgraded realm-sync from v10.0.1 to v10.1.3 - -10.1.3 Release notes (2020-11-13) -============================================================= - -### Enhancements - -* Add Xcode 12.2 binaries to the release package. - -### Fixed - -* Disallow setting - `RLMRealmConfiguration.deleteRealmIfMigrationNeeded`/`Realm.Config.deleteRealmIfMigrationNeeded` - when sync is enabled. This did not actually work as it does not delete the - relevant server state and broke in confusing ways ([PR #6931](https://github.com/realm/realm-swift/pull/6931)). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.1. -* CocoaPods: 1.10 or later. - -10.1.2 Release notes (2020-11-06) -============================================================= - -### Enhancements - -* Some error states which previously threw a misleading "NoSuchTable" exception - now throw a more descriptive exception. - -### Fixed - -* One of the Swift packages did not have the minimum deployment target set, - resulting in errors when archiving an app which imported Realm via SPM. -* Reenable filelock emulation on watchOS so that the OS does not kill the app - when it is suspended while a Realm is open on watchOS 7 ([#6861](https://github.com/realm/realm-swift/issues/6861), since v5.4.8 -* Fix crash in case insensitive query on indexed string columns when nothing - matches ([#6836](https://github.com/realm/realm-swift/issues/6836), since v5.0.0). -* Null values in a `List` or `List` were incorrectly treated - as non-null in some places. It is unknown if this caused any functional - problems when using the public API. ([Core PR #3987](https://github.com/realm/realm-core/pull/3987), since v5.0.0). -* Deleting an entry in a list in two different clients could end deleting the - wrong entry in one client when the changes are merged (since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.1. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.0.0 to v10.1.1 -* Upgraded realm-sync from v10.0.0 to v10.1.1 - -10.1.1 Release notes (2020-10-27) -============================================================= - -### Enhancements - -* Set the minimum CocoaPods version in the podspec so that trying to install - with older versions gives a more useful error ([PR #6892](https://github.com/realm/realm-swift/pull/6892)). - -### Fixed - -* Embedded objects could not be marked as `ObjectKeyIdentifable` - ([PR #6890](https://github.com/realm/realm-swift/pull/6890), since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.1. -* CocoaPods: 1.10 or later. - -10.1.0 Release notes (2020-10-22) -============================================================= - -CocoaPods 1.10 or later is now required to install Realm. - -### Enhancements - -* Throw an exception for Objects that have none of its properties marked with @objc. -* Mac Catalyst and arm64 simulators are now supported when integrating via Cocoapods. -* Add Xcode 12.1 binaries to the release package. -* Add Combine support for `Realm.asyncOpen()`. - -### Fixed - -* Implement precise and unbatched notification of sync completion events. This - avoids a race condition where an earlier upload completion event will notify - a later waiter whose changes haven't been uploaded yet. - ([#1118](https://github.com/realm/realm-object-store/pull/1118)). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.1. - -10.0.0 Release notes (2020-10-16) -============================================================= - -This release is functionally identical to v10.0.0-rc.2. - -NOTE: This version upgrades the Realm file format version to add support for -new data types. Realm files opened will be automatically upgraded and cannot be -read by versions older than v10.0.0. - -### Breaking Changes - -* Rename Realm.Publishers to RealmPublishers to avoid confusion with Combine.Publishers. -* Remove `[RLMSyncManager shared]`. This is now instatiated as a property on App/RLMApp. -* `RLMSyncManager.pinnedCertificatePaths` has been removed. -* Classes `RLMUserAccountInfo` & `RLMUserInfo` (swift: `UserInfo`, `UserAccountInfo`) have been removed. -* `RLMSyncUser`/`SyncUser` has been renamed to `RLMUser`/`User`. -* We no longer support Realm Cloud (legacy), but instead the new "MongoDB - Realm" Cloud. MongoDB Realm is a serverless platform that enables developers - to quickly build applications without having to set up server infrastructure. - MongoDB Realm is built on top of MongoDB Atlas, automatically integrating the - connection to your database. -* Remove support for Query-based sync, including the configuration parameters - and the `RLMSyncSubscription` and `SyncSubscription` types ([#6437](https://github.com/realm/realm-swift/pull/6437)). -* Remove everything related to sync permissions, including both the path-based - permission system and the object-level privileges for query-based sync. - Permissions are now configured via MongoDB Atlas. - ([#6445](https://github.com/realm/realm-swift/pulls/6445)) -* Remove support for Realm Object Server. -* Non-embedded objects in synchronized Realms must always have a primary key - named "_id". -* All Swift callbacks for asynchronous operations which can fail are now passed - a `Result` parameter instead of two separate `Value?` and - `Error?` parameters. - -### Enhancements - -* Add support for next generation sync. Support for syncing to MongoDB instead - of Realm Object Server. Applications must be created at realm.mongodb.com -* The memory mapping scheme for Realm files has changed to better support - opening very large files. -* Add support for the ObjectId data type. This is an automatically-generated - unique identifier similar to a GUID or a UUID. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for the Decimal128 data type. This is a 128-bit IEEE 754 decimal - floating point number similar to NSDecimalNumber. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for embedded objects. Embedded objects are objects which are - owned by a single parent object, and are deleted when that parent object is - deleted. They are defined by subclassing `EmbeddedObject` / - `RLMEmbeddedObject` rather than `Object` / `RLMObject`. -* Add `-[RLMUser customData]`/`User.customData`. Custom data is - configured in your MongoDB Realm App. -* Add `-[RLMUser callFunctionNamed:arguments:completion:]`/`User.functions`. - This is the entry point for calling Remote MongoDB Realm functions. Functions - allow you to define and execute server-side logic for your application. - Functions are written in modern JavaScript (ES6+) and execute in a serverless - manner. When you call a function, you can dynamically access components of - the current application as well as information about the request to execute - the function and the logged in user that sent the request. -* Add `-[RLMUser mongoClientWithServiceName:]`/`User.mongoClient`. This is - the entry point for calling your Remote MongoDB Service. The read operations - are `-[RLMMongoCollection findWhere:completion:]`, `-[RLMMongoCollection - countWhere:completion:]`and `-[RLMMongoCollection - aggregateWithPipeline:completion:]`. The write operations are - `-[RLMMongoCollection insertOneDocument:completion:]`, `-[RLMMongoCollection - insertManyDocuments:completion:]`, `-[RLMMongoCollection - updateOneDocument:completion:]`, `-[RLMMongoCollection - updateManyDocuments:completion:]`, `-[RLMMongoCollection - deleteOneDocument:completion:]`, and `-[RLMMongoCollection - deleteManyDocuments:completion:]`. If you are already familiar with MongoDB - drivers, it is important to understand that the remote MongoCollection only - provides access to the operations available in MongoDB Realm. -* Obtaining a Realm configuration from a user is now done with `[RLMUser - configurationWithPartitionValue:]`/`User.configuration(partitionValue:)`. - Partition values can currently be of types `String`, `Int`, or `ObjectId`, - and fill a similar role to Realm URLs did with Realm Cloud. The main - difference is that partitions are meant to be more closely associated with - your data. For example, if you are running a `Dog` kennel, and have a field - `breed` that acts as your partition key, you could open up realms based on - the breed of the dogs. -* Add ability to stream change events on a remote MongoDB collection with - `[RLMMongoCollection watch:delegate:delegateQueue:]`, - `MongoCollection.watch(delegate:)`. When calling `watch(delegate:)` you will be - given a `RLMChangeStream` (`ChangeStream`) which can be used to end watching - by calling `close()`. Change events can also be streamed using the - `MongoCollection.watch` Combine publisher that will stream change events each - time the remote MongoDB collection is updated. -* Add the ability to listen for when a Watch Change Stream is opened when using - Combine. Use `onOpen(event:)` directly after opening a `WatchPublisher` to - register a callback to be invoked once the change stream is opened. -* Objects with integer primary keys no longer require a separate index for the -* primary key column, improving insert performance and slightly reducing file - size. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* Carthage release for Swift is built with Xcode 12 - -### Internal - -* Upgraded realm-core from v6.1.4 to v10.0.0 -* Upgraded realm-sync from v5.0.29 to v10.0.0 - -10.0.0-rc.2 Release notes (2020-10-15) -============================================================= - -### Enhancements - -* Add the ability to listen for when a Watch Change Stream is opened when using - Combine. Use `onOpen(event:)` directly after opening a `WatchPublisher` to - register a callback to be invoked once the change stream is opened. - -### Breaking Changes - -* The insert operations on Mongo collections now report the inserted documents' - IDs as BSON rather than ObjectId. -* Embedded objects can no longer form cycles at the schema level. For example, - type A can no longer have an object property of type A, or an object property - of type B if type B links to type A. This was always rejected by the server, - but previously was allowed in non-synchronized Realms. -* Primary key properties are once again marked as being indexed. This reflects - an internal change to how primary keys are handled that should not have any - other visible effects. -* Change paired return types from Swift completion handlers to return `Result`. -* Adjust how RealmSwift.Object is defined to add support for Swift Library - Evolution mode. This should normally not have any effect, but you may need to - add `override` to initializers of object subclasses. -* Add `.null` type to AnyBSON. This creates a distinction between null values - and properly absent BSON types. - -### Fixed - -* Set the precision correctly when serializing doubles in extended json. -* Reading the `objectTypes` array from a Realm Configuration would not include - the embedded object types which were set in the array. -* Reject loops in embedded objects as part of local schema validation rather - than as a server error. -* Although MongoClient is obtained from a User, it was actually using the - User's App's current user rather than the User it was obtained from to make - requests. - - -This release also contains the following changes from 5.4.7 - 5.5.0 - -### Enhancements - -* Add the ability to capture a NotificationToken when using a Combine publisher - that observes a Realm Object or Collection. The user will call - `saveToken(on:at:)` directly after invoking the publisher to use the feature. - -### Fixed - -* When using `Realm.write(withoutNotifying:)` there was a chance that the - supplied observation blocks would not be skipped when in a write transaction. - ([Object Store #1103](https://github.com/realm/realm-object-store/pull/1103)) -* Comparing two identical unmanaged `List<>`/`RLMArray` objects would fail. - ([#5665](https://github.com/realm/realm-swift/issues/5665)). -* Case-insensitive equality queries on indexed string properties failed to - clear some internal state when rerunning the query. This could manifest as - duplicate results or "key not found" errors. - ([#6830](https://github.com/realm/realm-swift/issues/6830), [#6694](https://github.com/realm/realm-swift/issues/6694), since 5.0.0). -* Equality queries on indexed string properties would sometimes throw "key not - found" exceptions if the hash of the string happened to have bit 62 set. - ([.NET #2025](https://github.com/realm/realm-dotnet/issues/2025), since v5.0.0). -* Queries comparing non-optional int properties to nil would behave as if they - were comparing against zero instead (since v5.0.0). - -### Compatibility - -* File format: Generates Realms with format v12 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v10.0.0-beta.9 to v10.0.0 -* Upgraded realm-sync from v10.0.0-beta.14 to v10.0.0 - -10.0.0-rc.1 Release notes (2020-10-01) -============================================================= - -### Breaking Changes - -* Change the following methods on RLMUser to properties: - - `[RLMUser emailPasswordAuth]` => `RLMUser.emailPasswordAuth` - - `[RLMUser identities]` => `RLMUser.identities` - - `[RLMUser allSessions]` => `RLMUser.allSessions` - - `[RLMUser apiKeysAuth]` => `RLMUser.apiKeysAuth` -* Other changes to RLMUser: - - `nullable` has been removed from `RLMUser.identifier` - - `nullable` has been removed from `RLMUser.customData` -* Change the following methods on RLMApp to properties: - - `[RLMApp allUsers]` => `RLMApp.allUsers` - - `[RLMApp currentUser]` => `RLMApp.currentUser` - - `[RLMApp emailPasswordAuth]` => `RLMApp.emailPasswordAuth` -* Define `RealmSwift.Credentials` as an enum instead of a `typealias`. Example - usage has changed from `Credentials(googleAuthCode: "token")` to - `Credentials.google(serverAuthCode: "serverAuthCode")`, and - `Credentials(facebookToken: "token")` to `Credentials.facebook(accessToken: "accessToken")`, etc. -* Remove error parameter and redefine payload in - `+ (instancetype)credentialsWithFunctionPayload:(NSDictionary *)payload error:(NSError **)error;`. - It is now defined as `+ (instancetype)credentialsWithFunctionPayload:(NSDictionary> *)payload;` - -### Compatibility - -* File format: Generates Realms with format v12 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12. - -10.0.0-beta.6 Release notes (2020-09-30) -============================================================= - -### Breaking Changes - -* Change Google Credential parameter names to better reflect the required auth code: - - `Credentials(googleToken:)` => `Credentials(googleAuthCode:)` - - `[RLMCredentials credentialsWithGoogleToken:]` => `[RLMCredentials credentialsWithGoogleAuthCode:]` -* Rename Realm.Publishers to RealmPublishers to avoid confusion with Combine.Publishers - -### Fixed - -* Deleting objects could sometimes change the ObjectId remaining objects from - null to ObjectId("deaddeaddeaddeaddeaddead") when there are more than 1000 - objects. (Since v10.0.0-alpha.1) -* Fixed an assertion failure when adding an index to a nullable ObjectId - property that contains nulls. (since v10.0.0-alpha.1). - -This release also contains the following changes from 5.4.0 - 5.4.6: - -### Enhancements - -* Add prebuilt binary for Xcode 11.7 to the release package. -* Add prebuilt binary for Xcode 12 to the release package. -* Improve the asymtotic performance of NOT IN queries on indexed properties. It - is now O(Number of Rows) rather than O(Number of Rows \* Number of values in IN clause.) -* Slightly (<5%) improve the performance of most operations which involve - reading from a Realm file. - -### Fixed - -* Upgrading pre-5.x files with string primary keys would result in a file where - `realm.object(ofType:forPrimaryKey:)` would fail to find the object. - ([#6716](https://github.com/realm/realm-swift/issues/6716), since 5.2.0) -* A write transaction which modifies an object with more than 16 managed - properties and causes the Realm file to grow larger than 2 GB could cause an - assertion failure mentioning "m_has_refs". ([JS #3194](https://github.com/realm/realm-js/issues/3194), since 5.0.0). -* Objects with more than 32 properties could corrupt the Realm file and result - in a variety of crashes. ([Java #7057](https://github.com/realm/realm-java/issues/7057), since 5.0.0). -* Fix deadlocks when opening a Realm file in both the iOS simulator and Realm - Studio ([#6743](https://github.com/realm/realm-swift/issues/6743), since 5.3.6). -* Fix Springboard deadlocking when an app is unsuspended while it has an open - Realm file which is stored in an app group on iOS 10-12 - ([#6749](https://github.com/realm/realm-swift/issues/6749), since 5.3.6). -* If you use encryption your application cound crash with a message like - "Opening Realm files of format version 0 is not supported by this version of - Realm". ([#6889](https://github.com/realm/realm-java/issues/6889) among others, since 5.0.0) -* Confining a Realm to a serial queue would throw an error claiming that the - queue was not a serial queue on iOS versions older than 12. - ([#6735](https://github.com/realm/realm-swift/issues/6735), since 5.0.0). -* Results would sometimes give stale results inside a write transaction if a - write which should have updated the Results was made before the first access - of a pre-existing Results object. - ([#6721](https://github.com/realm/realm-swift/issues/6721), since 5.0.0) -* Fix Archiving the Realm and RealmSwift frameworks with Xcode 12. - ([#6774](https://github.com/realm/realm-swift/issues/6774)) -* Fix compilation via Carthage when using Xcode 12 ([#6717](https://github.com/realm/realm-swift/issues/6717)). -* Fix a crash inside `realm::Array(Type)::init_from_mem()` which would - sometimes occur when running a query over links immediately after creating - objects of the queried type. - ([#6789](https://github.com/realm/realm-swift/issues/6789) and possibly others, since 5.0.0). -* Possibly fix problems when changing the type of the primary key of an object - from optional to non-optional. -* Rerunning a equality query on an indexed string property would give incorrect - results if a previous run of the query matched multiple objects and it now - matches one object. This could manifest as either finding a non-matching - object or a "key not found" exception being thrown. - ([#6536](https://github.com/realm/realm-swift/issues/6536), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v12 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v10.0.0-beta.7 to v10.0.0-beta.9 -* Upgraded realm-sync from v10.0.0-beta.11 to v10.0.0-beta.14 - -10.0.0-beta.5 Release notes (2020-09-15) -============================================================= - -### Enhancements - -* Add `User.loggedIn`. -* Add support for multiple Realm Apps. -* Remove `[RLMSyncManager shared]`. This is now instatiated as a property on - the app itself. -* Add Combine support for: - * PushClient - * APIKeyAuth - * User - * MongoCollection - * EmailPasswordAuth - * App.login - -### Fixed - -* Fix `MongoCollection.watch` to consistently deliver events on a given queue. -* Fix `[RLMUser logOutWithCompletion]` and `User.logOut` to now log out the - correct user. -* Fix crash on startup on iOS versions older than 13 (since v10.0.0-beta.3). - -### Breaking Changes - -* `RLMSyncManager.pinnedCertificatePaths` has been removed. -* Classes `RLMUserAccountInfo` & `RLMUserInfo` (swift: `UserInfo`, - `UserAccountInfo`) have been removed. -* The following functionality has been renamed to align Cocoa with the other - Realm SDKs: - -| Old API | New API | -|:-------------------------------------------------------------|:---------------------------------------------------------------| -| `RLMUser.identity` | `RLMUser.identifier` | -| `User.identity` | `User.id` | -| `-[RLMCredentials credentialsWithUsername:password:]` | `-[RLMCredentials credentialsWithEmail:password:]` | -| `Credentials(username:password:)` | `Credentials(email:password:)` | -| -`[RLMUser apiKeyAuth]` | `-[RLMUser apiKeysAuth]` | -| `User.apiKeyAuth()` | `User.apiKeysAuth()` | -| `-[RLMEmailPasswordAuth registerEmail:password:completion:]` | `-[RLMEmailPasswordAuth registerUserWithEmail:password:completion:]` | -| `App.emailPasswordAuth().registerEmail(email:password:)` | `App.emailPasswordAuth().registerUser(email:password:)` | - -### Compatibility - -* File format: Generates Realms with format v12 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v10.0.0-beta.6 to v10.0.0-beta.7 -* Upgraded realm-sync from v10.0.0-beta.10 to v10.0.0-beta.11 - -10.0.0-beta.4 Release notes (2020-08-28) -============================================================= - -### Enhancements - -* Add support for the 64-bit watchOS simulator added in Xcode 12. -* Add ability to stream change events on a remote MongoDB collection with - `[RLMMongoCollection watch:delegate:delegateQueue]`, - `MongoCollection.watch(delegate)`. When calling `watch(delegate)` you will be - given a `RLMChangeStream` (`ChangeStream`), this will be used to invalidate - and stop the streaming session by calling `[RLMChangeStream close]` - (`ChangeStream.close()`) when needed. -* Add `MongoCollection.watch`, which is a Combine publisher that will stream - change events each time the remote MongoDB collection is updated. -* Add ability to open a synced Realm with a `nil` partition value. - -### Fixed - -* Realm.Configuration.objectTypes now accepts embedded objects -* Ports fixes from 5.3.5 - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the v10.0.0-beta.x series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v10.0.0-beta.1 to v10.0.0-beta.6 -* Upgraded realm-sync from v10.0.0-beta.2 to v10.0.0-beta.10 - -10.0.0-beta.3 Release notes (2020-08-17) -============================================================= - -This release also contains all changes from 5.3.2. - -### Breaking Changes -* The following classes & aliases have been renamed to align Cocoa with the other Realm SDKs: - -| Old API | New API | -|:------------------------------------------------------------|:---------------------------------------------------------------| -| `RLMSyncUser` | `RLMUser` | -| `SyncUser` | `User` | -| `RLMAppCredential` | `RLMCredential` | -| `AppCredential` | `Credential` | -| `RealmApp` | `App` | -| `RLMUserAPIKeyProviderClient` | `RLMAPIKeyAuth` | -| `RLMUsernamePasswordProviderClient` | `RLMEmailPasswordAuth` | -| `UsernamePasswordProviderClient` | `EmailPasswordAuth` | -| `UserAPIKeyProviderClient` | `APIKeyAuth` | - -* The following functionality has also moved to the User - -| Old API | New API | -|:-------------------------------------------------------------|:--------------------------------------------------------------| -| `[RLMApp callFunctionNamed:]` | `[RLMUser callFunctionNamed:]` | -| `App.functions` | `User.functions` | -| `[RLMApp mongoClientWithServiceName:]` | `[RLMUser mongoClientWithServiceName:]` | -| `App.mongoClient(serviceName)` | `User.mongoClient(serviceName)` | -| `[RLMApp userAPIKeyProviderClient]` | `[RLMUser apiKeyAuth]` | -| `App.userAPIKeyProviderClient` | `App.apiKeyAuth()` | -| `[RLMApp logOut:]` | `[RLMUser logOut]` | -| `App.logOut(user)` | `User.logOut()` | -| `[RLMApp removeUser:]` | `[RLMUser remove]` | -| `App.remove(user)` | `User.remove()` | -| `[RLMApp linkUser:credentials:]` | `[RLMUser linkWithCredentials:]` | -| `App.linkUser(user, credentials)` | `User.link(credentials)` | - -* `refreshCustomData()` on User now returns void and passes the custom data to the callback on success. - -### Compatibility -* This release introduces breaking changes w.r.t some sync classes and MongoDB Realm Cloud functionality. -(See the breaking changes section for the full list) -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* Carthage release for Swift is built with Xcode 11.5. - -10.0.0-beta.2 Release notes (2020-06-09) -============================================================= -Xcode 11.3 and iOS 9 are now the minimum supported versions. - -### Enhancements -* Add support for building with Xcode 12 beta 1. watchOS currently requires - removing x86_64 from the supported architectures. Support for the new 64-bit - watch simulator will come in a future release. - -### Fixed -* Opening a SyncSession with LOCAL app deployments would not use the correct endpoints. -* Linking from embedded objects to top-level objects was incorrectly disallowed. -* Opening a Realm file in file format v6 (created by Realm Cocoa versions - between 2.4 and 2.10) would crash. (Since 5.0.0, [Core #3764](https://github.com/realm/realm-core/issues/3764)). -* Upgrading v9 (pre-5.0) Realm files would create a redundant search index for - primary key properties. This index would then be removed the next time the - Realm was opened, resulting in some extra i/o in the upgrade process. - (Since 5.0.0, [Core #3787](https://github.com/realm/realm-core/issues/3787)). -* Fixed a performance issue with upgrading v9 files with search indexes on - non-primary-key properties. (Since 5.0.0, [Core #3767](https://github.com/realm/realm-core/issues/3767)). - -### Compatibility -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 - -10.0.0-beta.1 Release notes (2020-06-08) -============================================================= - -NOTE: This version bumps the Realm file format to version 11. It is not -possible to downgrade to earlier versions. Older files will automatically be -upgraded to the new file format. Only [Realm Studio -10.0.0](https://github.com/realm/realm-studio/releases/tag/v10.0.0-beta.1) or -later will be able to open the new file format. - -### Enhancements - -* Add support for next generation sync. Support for syncing to MongoDB instead - of Realm Object Server. Applications must be created at realm.mongodb.com -* The memory mapping scheme for Realm files has changed to better support - opening very large files. -* Add support for the ObjectId data type. This is an automatically-generated - unique identifier similar to a GUID or a UUID. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for the Decimal128 data type. This is a 128-bit IEEE 754 decimal - floating point number similar to NSDecimalNumber. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for embedded objects. Embedded objects are objects which are - owned by a single parent object, and are deleted when that parent object is - deleted. They are defined by subclassing `EmbeddedObject` / - `RLMEmbeddedObject` rather than `Object` / `RLMObject`. -* Add `-[RLMSyncUser customData]`/`SyncUser.customData`. Custom data is - configured in your MongoDB Realm App. -* Add `-[RLMApp callFunctionNamed:arguments]`/`RealmApp.functions`. This is the - entry point for calling Remote MongoDB Realm functions. Functions allow you - to define and execute server-side logic for your application. Functions are - written in modern JavaScript (ES6+) and execute in a serverless manner. When - you call a function, you can dynamically access components of the current - application as well as information about the request to execute the function - and the logged in user that sent the request. -* Add `-[RLMApp mongoClientWithServiceName]`/`RealmApp.mongoClient`. This is - the entry point for calling your Remote MongoDB Service. The read operations - are `-[RLMMongoCollection findWhere:completion:]`, `-[RLMMongoCollection - countWhere:completion:]`and `-[RLMMongoCollection - aggregateWithPipeline:completion:]`. The write operations are - `-[RLMMongoCollection insertOneDocument:completion:]`, `-[RLMMongoCollection - insertManyDocuments:completion:]`, `-[RLMMongoCollection - updateOneDocument:completion:]`, `-[RLMMongoCollection - updateManyDocuments:completion:]`, `-[RLMMongoCollection - deleteOneDocument:completion:]`, and `-[RLMMongoCollection - deleteManyDocuments:completion:]`. If you are already familiar with MongoDB - drivers, it is important to understand that the remote MongoCollection only - provides access to the operations available in MongoDB Realm. -* Change `[RLMSyncUser - configurationWithPartitionValue:]`/`SyncUser.configuration(with:)` to accept - all BSON types. Partition values can currently be of types `String`, `Int`, - or `ObjectId`. Opening a realm by partition value is the equivalent of - previously opening a realm by URL. In this case, partitions are meant to be - more closely associated with your data. E.g., if you are running a `Dog` - kennel, and have a field `breed` that acts as your partition key, you could - open up realms based on the breed of the dogs. - -### Breaking Changes - -* We no longer support Realm Cloud (legacy), but instead the new "MongoDB - Realm" Cloud. MongoDB Realm is a serverless platform that enables developers - to quickly build applications without having to set up server infrastructure. - MongoDB Realm is built on top of MongoDB Atlas, automatically integrating the - connection to your database. -* Remove support for Query-based sync, including the configuration parameters - and the `RLMSyncSubscription` and `SyncSubscription` types ([#6437](https://github.com/realm/realm-swift/pull/6437)). -* Primary key properties are no longer marked as being indexed. This reflects - an internal change to how primary keys are handled that should not have any - other visible effects. ([#6440](https://github.com/realm/realm-swift/pull/6440)). -* Remove everything related to sync permissions, including both the path-based - permission system and the object-level privileges for query-based sync. ([#6445](https://github.com/realm/realm-swift/pulls/6445)) -* Primary key uniqueness is now enforced when creating new objects during - migrations, rather than only at the end of migrations. Previously new objects - could be created with duplicate primary keys during a migration as long as - the property was changed to a unique value before the end of the migration, - but now a unique value must be supplied when creating the object. -* Remove support for Realm Object Server. - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 - -5.5.0 Release notes (2020-10-12) -============================================================= - -### Enhancements - -* Add the ability to capture a NotificationToken when using a Combine publisher - that observes a Realm Object or Collection. The user will call - `saveToken(on:at:)` directly after invoking the publisher to use the feature. - -### Fixed - -* When using `Realm.write(withoutNotifying:)` there was a chance that the - supplied observation blocks would not be skipped when in a write transaction. - ([Object Store #1103](https://github.com/realm/realm-object-store/pull/1103)) -* Comparing two identical unmanaged `List<>`/`RLMArray` objects would fail. - ([#5665](https://github.com/realm/realm-swift/issues/5665)). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -5.4.8 Release notes (2020-10-05) -============================================================= - -### Fixed - -* Case-insensitive equality queries on indexed string properties failed to - clear some internal state when rerunning the query. This could manifest as - duplicate results or "key not found" errors. - ([#6830](https://github.com/realm/realm-swift/issues/6830), [#6694](https://github.com/realm/realm-swift/issues/6694), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v6.1.3 to v6.1.4 -* Upgraded realm-sync from v5.0.28 to v5.0.29 - -5.4.7 Release notes (2020-09-30) -============================================================= - -### Fixed - -* Equality queries on indexed string properties would sometimes throw "key not - found" exceptions if the hash of the string happened to have bit 62 set. - ([.NET #2025](https://github.com/realm/realm-dotnet/issues/2025), since v5.0.0). -* Queries comparing non-optional int properties to nil would behave as if they - were comparing against zero instead (since v5.0.0). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v6.1.2 to v6.1.3 -* Upgraded realm-sync from v5.0.27 to v5.0.28 - -5.4.6 Release notes (2020-09-29) -============================================================= - -5.4.5 failed to actually update the core version for installation methods other -than SPM. All changes listed there actually happened in this version for -non-SPM installation methods. - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-sync from v5.0.26 to v5.0.27 - -5.4.5 Release notes (2020-09-28) -============================================================= - -### Enhancements - -* Slightly (<5%) improve the performance of most operations which involve - reading from a Realm file. - -### Fixed - -* Rerunning a equality query on an indexed string property would give incorrect - results if a previous run of the query matched multiple objects and it now - matches one object. This could manifest as either finding a non-matching - object or a "key not found" exception being thrown. - ([#6536](https://github.com/realm/realm-swift/issues/6536), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v6.1.1 to v6.1.2 -* Upgraded realm-sync from v5.0.25 to v5.0.26 - -5.4.4 Release notes (2020-09-25) -============================================================= - -### Enhancements -* Improve the asymtotic performance of NOT IN queries on indexed properties. It - is now O(Number of Rows) rather than O(Number of Rows \* Number of values in IN clause.) - -### Fixed - -* Fix a crash inside `realm::Array(Type)::init_from_mem()` which would - sometimes occur when running a query over links immediately after creating - objects of the queried type. - ([#6789](https://github.com/realm/realm-swift/issues/6789) and possibly others, since 5.0.0). -* Possibly fix problems when changing the type of the primary key of an object - from optional to non-optional. - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v6.0.26 to v6.1.1 -* Upgraded realm-sync from v5.0.23 to v5.0.25 - -5.4.3 Release notes (2020-09-21) -============================================================= - -### Fixed - -* Fix compilation via Carthage when using Xcode 12 ([#6717](https://github.com/realm/realm-swift/issues/6717)). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.12 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -5.4.2 Release notes (2020-09-17) -============================================================= - -### Enhancements - -* Add prebuilt binary for Xcode 12 to the release package. - -### Fixed - -* Fix Archiving the Realm and RealmSwift frameworks with Xcode 12. - ([#6774](https://github.com/realm/realm-swift/issues/6774)) - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.12 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -5.4.1 Release notes (2020-09-16) -============================================================= - -### Enhancements - -* Add prebuilt binary for Xcode 11.7 to the release package. - -### Fixed - -* Fix deadlocks when opening a Realm file in both the iOS simulator and Realm - Studio ([#6743](https://github.com/realm/realm-swift/issues/6743), since 5.3.6). -* Fix Springboard deadlocking when an app is unsuspended while it has an open - Realm file which is stored in an app group on iOS 10-12 - ([#6749](https://github.com/realm/realm-swift/issues/6749), since 5.3.6). -* If you use encryption your application cound crash with a message like - "Opening Realm files of format version 0 is not supported by this version of - Realm". ([#6889](https://github.com/realm/realm-java/issues/6889) among others, since 5.0.0) -* Confining a Realm to a serial queue would throw an error claiming that the - queue was not a serial queue on iOS versions older than 12. - ([#6735](https://github.com/realm/realm-swift/issues/6735), since 5.0.0). -* Results would sometimes give stale results inside a write transaction if a - write which should have updated the Results was made before the first access - of a pre-existing Results object. - ([#6721](https://github.com/realm/realm-swift/issues/6721), since 5.0.0) - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.12 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.7. - -### Internal - -* Upgraded realm-core from v6.0.25 to v6.0.26 -* Upgraded realm-sync from v5.0.22 to v5.0.23 - -5.4.0 Release notes (2020-09-09) -============================================================= - -This version bumps the Realm file format version. This means that older -versions of Realm will be unable to open Realm files written by this version, -and a new version of Realm Studio will be required. There are no actual format -changes and the version bump is just to force a re-migration of incorrectly -upgraded Realms. - -### Fixed - -* Upgrading pre-5.x files with string primary keys would result in a file where - `realm.object(ofType:forPrimaryKey:)` would fail to find the object. - ([#6716](https://github.com/realm/realm-swift/issues/6716), since 5.2.0) -* A write transaction which modifies an object with more than 16 managed - properties and causes the Realm file to grow larger than 2 GB could cause an - assertion failure mentioning "m_has_refs". ([JS #3194](https://github.com/realm/realm-js/issues/3194), since 5.0.0). -* Objects with more than 32 properties could corrupt the Realm file and result - in a variety of crashes. ([Java #7057](https://github.com/realm/realm-java/issues/7057), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.12 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.23 to v6.0.25 -* Upgraded realm-sync from v5.0.20 to v5.0.22 - -5.3.6 Release notes (2020-09-02) -============================================================= - -### Fixed - -* Work around iOS 14 no longer allowing the use of file locks in shared - containers, which resulted in the OS killing an app which entered the - background while a Realm was open ([#6671](https://github.com/realm/realm-swift/issues/6671)). -* If an attempt to upgrade a realm has ended with a crash with "migrate_links()" - in the call stack, the realm was left in an invalid state. The migration - logic now handles this state and can complete upgrading files which were - incompletely upgraded by pre-5.3.4 versions. -* Fix deadlocks when writing to a Realm file on an exFAT partition from macOS. - ([#6691](https://github.com/realm/realm-swift/issues/6691)). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.19 to v6.0.23 -* Upgraded realm-sync from v5.0.16 to v5.0.20 - -5.3.5 Release notes (2020-08-20) -============================================================= - -### Fixed - -* Opening Realms on background threads could produce spurious Incorrect Thread - exceptions when a cached Realm existed for a previously existing thread with - the same thread ID as the current thread. - ([#6659](https://github.com/realm/realm-swift/issues/6659), - [#6689](https://github.com/realm/realm-swift/issues/6689), - [#6712](https://github.com/realm/realm-swift/issues/6712), since 5.0.0). -* Upgrading a table with incoming links but no properties would crash. This was - probably not possible to hit in practice as we reject object types with no - properties. -* Upgrading a non-nullable List which nonetheless contained null values would - crash. This was possible due to missing error-checking in some older versions - of Realm. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.18 to v6.0.19 -* Upgraded realm-sync from v5.0.15 to v5.0.16 - -5.3.4 Release notes (2020-08-17) -============================================================= - -### Fixed - -* Accessing a Realm after calling `deleteAll()` would sometimes throw an - exception with the reason 'ConstIterator copy failed'. ([#6597](https://github.com/realm/realm-swift/issues/6597), since 5.0.0). -* Fix an assertion failure inside the `migrate_links()` function when upgrading - a pre-5.0 Realm file. -* Fix a bug in memory mapping management. This bug could result in multiple - different asserts as well as segfaults. In many cases stack backtraces would - include members of the EncyptedFileMapping near the top - even if encryption - was not used at all. In other cases asserts or crashes would be in methods - reading an array header or array element. In all cases the application would - terminate immediately. ([Core #3838](https://github.com/realm/realm-core/pull/3838), since v5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.14 to v6.0.18 -* Upgraded realm-sync from v5.0.14 to v5.0.15 - -5.3.3 Release notes (2020-07-30) -============================================================= - -### Enhancements - -* Add support for the x86_64 watchOS simulator added in Xcode 12. - -### Fixed - -* (RLM)Results objects would incorrectly pin old read transaction versions - until they were accessed after a Realm was refreshed, resulting in the Realm - file growing to large sizes if a Results was retained but not accessed after - every write. ([#6677](https://github.com/realm/realm-swift/issues/6677), since 5.0.0). -* Fix linker errors when using SwiftUI previews with Xcode 12 when Realm was - installed via Swift Package Manager. ([#6625](https://github.com/realm/realm-swift/issues/6625)) - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.12 to v6.0.14 -* Upgraded realm-sync from v5.0.12 to v5.0.14 - -5.3.2 Release notes (2020-07-21) -============================================================= - -### Fixed - -* Fix a file format upgrade bug when opening older Realm files. Could cause - assertions like "Assertion failed: ref != 0" during opning of a Realm. - ([Core #6644](https://github.com/realm/realm-swift/issues/6644), since 5.2.0) -* A use-after-free would occur if a Realm was compacted, opened on multiple - threads prior to the first write, then written to while reads were happening - on other threads. This could result in a variety of crashes, often inside - realm::util::EncryptedFileMapping::read_barrier. - (Since v5.0.0, [#6626](https://github.com/realm/realm-swift/issues/6626), - [#6628](https://github.com/realm/realm-swift/issues/6628), - [#6652](https://github.com/realm/realm-swift/issues/6652), - [#6655](https://github.com/realm/realm-swift/issues/6555), - [#6656](https://github.com/realm/realm-swift/issues/6656)). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.11 to v6.0.12 -* Upgraded realm-sync from v5.0.11 to v5.0.12 - -5.3.1 Release notes (2020-07-17) -============================================================= - -### Enhancements - -* Add prebuilt binary for Xcode 11.6 to the release package. - -### Fixed - -* Creating an object inside migration which changed that object type's primary - key would hit an assertion failure mentioning primary_key_col - ([#6613](https://github.com/realm/realm-swift/issues/6613), since 5.0.0). -* Modifying the value of a string primary key property inside a migration with - a Realm file which was upgraded from pre-5.0 would corrupt the property's - index, typically resulting in crashes. ([Core #3765](https://github.com/realm/realm-core/issues/3765), since 5.0.0). -* Some Realm files which hit assertion failures when upgrading from the pre-5.0 - file format should now upgrade correctly (Since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.9 to v6.0.11 -* Upgraded realm-sync from v5.0.8 to v5.0.11 - -5.3.0 Release notes (2020-07-14) -============================================================= - -### Enhancements - -* Add `Realm.objectWillChange`, which is a Combine publisher that will emit a - notification each time the Realm is refreshed or a write transaction is - commited. - -### Fixed - -* Fix the spelling of `ObjectKeyIdentifiable`. The old spelling is available - and deprecated for compatibility. -* Rename `RealmCollection.publisher` to `RealmCollection.collectionPublisher`. - The old name interacted with the `publisher` defined by `Sequence` in very - confusing ways, so we need to use a different name. The `publisher` name is - still available for compatibility. ([#6516](https://github.com/realm/realm-swift/issues/6516)) -* Work around "xcodebuild timed out while trying to read - SwiftPackageManagerExample.xcodeproj" errors when installing Realm via - Carthage. ([#6549](https://github.com/realm/realm-swift/issues/6549)). -* Fix a performance regression when using change notifications. (Since 5.0.0, - [#6629](https://github.com/realm/realm-swift/issues/6629)). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v6.0.8 to v6.0.9 -* Upgraded realm-sync from v5.0.7 to v5.0.8 - -5.2.0 Release notes (2020-06-30) -============================================================= - -### Fixed -* Opening a SyncSession with LOCAL app deployments would not use the correct endpoints. -This release also contains all changes from 5.0.3 and 5.1.0. - -### Breaking Changes -* The following classes & aliases have been renamed to align Cocoa with the other Realm SDKs: - -| Old API | New API | -|:------------------------------------------------------------|:---------------------------------------------------------------| -| `RLMSyncUser` | `RLMUser` | -| `SyncUser` | `User` | -| `RLMAppCredential` | `RLMCredential` | -| `AppCredential` | `Credential` | -| `RealmApp` | `App` | -| `RLMUserAPIKeyProviderClient` | `RLMAPIKeyAuth` | -| `RLMUsernamePasswordProviderClient` | `RLMEmailPasswordAuth` | -| `UsernamePasswordProviderClient` | `EmailPasswordAuth` | -| `UserAPIKeyProviderClient` | `APIKeyAuth` | - -* The following functionality has also moved to the User: - -| Old API | New API | -|:-------------------------------------------------------------|:--------------------------------------------------------------| -| `[RLMApp callFunctionNamed:]` | `[RLMUser callFunctionNamed:]` | -| `App.functions` | `User.functions` | -| `[RLMApp mongoClientWithServiceName:]` | `[RLMUser mongoClientWithServiceName:]` | -| `App.mongoClient(serviceName)` | `User.mongoClient(serviceName)` | -| `[RLMApp userAPIKeyProviderClient]` | `[RLMUser apiKeyAuth]` | -| `App.userAPIKeyProviderClient` | `App.apiKeyAuth()` | -| `[RLMApp logOut:]` | `[RLMUser logOut]` | -| `App.logOut(user)` | `User.logOut()` | -| `[RLMApp removeUser:]` | `[RLMUser remove]` | -| `App.remove(user)` | `User.remove()` | -| `[RLMApp linkUser:credentials:]` | `[RLMUser linkWithCredentials:]` | -| `App.linkUser(user, credentials)` | `User.link(credentials)` | - -* The argument labels in Swift have changed for several methods: -| Old API | New API | -|:-------------------------------------------------------------|:--------------------------------------------------------------| -| `APIKeyAuth.createApiKey(withName:completion:)` | `APIKeyAuth.createApiKey(named:completion:)` | -| `App.login(withCredential:completion:) | `App.login(credentials:completion:)` | -| `App.pushClient(withServiceName:)` | `App.pushClient(serviceName:)` | -| `MongoClient.database(withName:)` | `MongoClient.database(named:)` | - -* `refreshCustomData()` on User now returns void and passes the custom data to the callback on success. - -### Compatibility -* This release introduces breaking changes w.r.t some sync classes and MongoDB Realm Cloud functionality. - (See the breaking changes section for the full list) -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* Realm Studio: 10.0.0 or later. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 - -10.0.0-beta.2 Release notes (2020-06-09) -============================================================= -Xcode 11.3 and iOS 9 are now the minimum supported versions. - -### Enhancements - -* Add support for building with Xcode 12 beta 1. watchOS currently requires - removing x86_64 from the supported architectures. Support for the new 64-bit - watch simulator will come in a future release. - -### Fixed -* Opening a SyncSession with LOCAL app deployments would not use the correct endpoints. -* Linking from embedded objects to top-level objects was incorrectly disallowed. - -* Opening a Realm file in file format v6 (created by Realm Cocoa versions - between 2.4 and 2.10) would crash. (Since 5.0.0, [Core #3764](https://github.com/realm/realm-core/issues/3764)). -* Upgrading v9 (pre-5.0) Realm files would create a redundant search index for - primary key properties. This index would then be removed the next time the - Realm was opened, resulting in some extra i/o in the upgrade process. - (Since 5.0.0, [Core #3787](https://github.com/realm/realm-core/issues/3787)). -* Fixed a performance issue with upgrading v9 files with search indexes on - non-primary-key properties. (Since 5.0.0, [Core #3767](https://github.com/realm/realm-core/issues/3767)). - -### Compatibility -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 - -10.0.0-beta.1 Release notes (2020-06-08) -============================================================= - -NOTE: This version bumps the Realm file format to version 11. It is not -possible to downgrade to earlier versions. Older files will automatically be -upgraded to the new file format. Only [Realm Studio -10.0.0](https://github.com/realm/realm-studio/releases/tag/v10.0.0-beta.1) or -later will be able to open the new file format. - -### Enhancements - -* Add support for next generation sync. Support for syncing to MongoDB instead - of Realm Object Server. Applications must be created at realm.mongodb.com -* The memory mapping scheme for Realm files has changed to better support - opening very large files. -* Add support for the ObjectId data type. This is an automatically-generated - unique identifier similar to a GUID or a UUID. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for the Decimal128 data type. This is a 128-bit IEEE 754 decimal - floating point number similar to NSDecimalNumber. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for embedded objects. Embedded objects are objects which are - owned by a single parent object, and are deleted when that parent object is - deleted. They are defined by subclassing `EmbeddedObject` / - `RLMEmbeddedObject` rather than `Object` / `RLMObject`. -* Add `-[RLMSyncUser customData]`/`SyncUser.customData`. Custom data is - configured in your MongoDB Realm App. -* Add `-[RLMApp callFunctionNamed:arguments]`/`RealmApp.functions`. This is the - entry point for calling Remote MongoDB Realm functions. Functions allow you - to define and execute server-side logic for your application. Functions are - written in modern JavaScript (ES6+) and execute in a serverless manner. When - you call a function, you can dynamically access components of the current - application as well as information about the request to execute the function - and the logged in user that sent the request. -* Add `-[RLMApp mongoClientWithServiceName]`/`RealmApp.mongoClient`. This is - the entry point for calling your Remote MongoDB Service. The read operations - are `-[RLMMongoCollection findWhere:completion:]`, `-[RLMMongoCollection - countWhere:completion:]`and `-[RLMMongoCollection - aggregateWithPipeline:completion:]`. The write operations are - `-[RLMMongoCollection insertOneDocument:completion:]`, `-[RLMMongoCollection - insertManyDocuments:completion:]`, `-[RLMMongoCollection - updateOneDocument:completion:]`, `-[RLMMongoCollection - updateManyDocuments:completion:]`, `-[RLMMongoCollection - deleteOneDocument:completion:]`, and `-[RLMMongoCollection - deleteManyDocuments:completion:]`. If you are already familiar with MongoDB - drivers, it is important to understand that the remote MongoCollection only - provides access to the operations available in MongoDB Realm. -* Change `[RLMSyncUser - configurationWithPartitionValue:]`/`SyncUser.configuration(with:)` to accept - all BSON types. Partition values can currently be of types `String`, `Int`, - or `ObjectId`. Opening a realm by partition value is the equivalent of - previously opening a realm by URL. In this case, partitions are meant to be - more closely associated with your data. E.g., if you are running a `Dog` - kennel, and have a field `breed` that acts as your partition key, you could - open up realms based on the breed of the dogs. - -### Breaking Changes - -* We no longer support Realm Cloud (legacy), but instead the new "MongoDB - Realm" Cloud. MongoDB Realm is a serverless platform that enables developers - to quickly build applications without having to set up server infrastructure. - MongoDB Realm is built on top of MongoDB Atlas, automatically integrating the - connection to your database. -* Remove support for Query-based sync, including the configuration parameters - and the `RLMSyncSubscription` and `SyncSubscription` types ([#6437](https://github.com/realm/realm-swift/pull/6437)). -* Primary key properties are no longer marked as being indexed. This reflects - an internal change to how primary keys are handled that should not have any - other visible effects. ([#6440](https://github.com/realm/realm-swift/pull/6440)). -* Remove everything related to sync permissions, including both the path-based - permission system and the object-level privileges for query-based sync. ([#6445](https://github.com/realm/realm-swift/pulls/6445)) -* Primary key uniqueness is now enforced when creating new objects during - migrations, rather than only at the end of migrations. Previously new objects - could be created with duplicate primary keys during a migration as long as - the property was changed to a unique value before the end of the migration, - but now a unique value must be supplied when creating the object. -* Remove support for Realm Object Server. - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* `List.index(of:)` would give incorrect results if it was the very first thing - called on that List after a Realm was refreshed following a write which - modified the List. (Since 5.0.0, [#6606](https://github.com/realm/realm-swift/issues/6606)). -* If a ThreadSafeReference was the only remaining reference to a Realm, - multiple copies of the file could end up mapped into memory at once. This - probably did not have any symptoms other than increased memory usage. (Since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 -* Upgraded realm-core from v6.0.6 to v6.0.7 -* Upgraded realm-sync from v5.0.5 to v5.0.6 -* Upgraded realm-core from v6.0.6 to v6.0.8 -* Upgraded realm-sync from v5.0.5 to v5.0.7 - -5.1.0 Release notes (2020-06-22) -============================================================= - -### Enhancements - -* Allow opening full-sync Realms in read-only mode. This disables local schema - initialization, which makes it possible to open a Realm which the user does - not have write access to without using asyncOpen. In addition, it will report - errors immediately when an operation would require writing to the Realm - rather than reporting it via the sync error handler only after the server - rejects the write. - -### Fixed - -* Opening a Realm using a configuration object read from an existing Realm - would incorrectly bind the new Realm to the original Realm's thread/queue, - resulting in "Realm accessed from incorrect thread." exceptions. - ([#6574](https://github.com/realm/realm-swift/issues/6574), - [#6559](https://github.com/realm/realm-swift/issues/6559), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -5.0.3 Release notes (2020-06-10) -============================================================= - -### Fixed - -* `-[RLMObject isFrozen]` always returned false. ([#6568](https://github.com/realm/realm-swift/issues/6568), since 5.0.0). -* Freezing an object within the write transaction that the object was created - in now throws an exception rather than crashing when the object is first - used. -* The schema for frozen Realms was not properly initialized, leading to crashes - when accessing a RLMLinkingObjects property. - ([#6568](https://github.com/realm/realm-swift/issues/6568), since 5.0.0). -* Observing `Object.isInvalidated` via a keypath literal would produce a - warning in Swift 5.2 due to the property not being marked as @objc. - ([#6554](https://github.com/realm/realm-swift/issues/6554)) - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -5.0.2 Release notes (2020-06-02) -============================================================= - -### Fixed - -* Fix errSecDuplicateItem (-25299) errors when opening a synchronized Realm - when upgrading from pre-5.0 versions of Realm. - ([#6538](https://github.com/realm/realm-swift/issues/6538), [#6494](https://github.com/realm/realm-swift/issues/6494), since 5.0.0). -* Opening Realms stored on filesystems which do not support preallocation (such - as ExFAT) would give "Operation not supported" exceptions. - ([#6508](https://github.com/realm/realm-swift/issues/6508), since 3.2.0). -* 'NoSuchTable' exceptions would sometimes be thrown after upgrading a Relam - file to the v10 format. ([Core #3701](https://github.com/realm/realm-core/issues/3701), since 5.0.0) -* If the upgrade process was interrupted/killed for various reasons, the - following run could stop with some assertions failing. No instances of this - happening were reported to us. (Since 5.0.0). -* Queries filtering a `List` where the query was on an indexed property over a - link would sometimes give incomplete results. - ([#6540](https://github.com/realm/realm-swift/issues/6540), since 4.1.0 but - more common since 5.0.0) -* Opening a file in read-only mode would attempt to make a spurious write to - the file, causing errors if the file was in read-only storage (since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v6.0.4 to v6.0.6 -* Upgraded realm-sync from v5.0.3 to v5.0.5 - -5.0.1 Release notes (2020-05-27) -============================================================= - -### Enhancements - -* Add prebuilt binary for Xcode 11.5 to the release package. - -### Fixed - -* Fix linker error when building a xcframework for Catalyst. - ([#6511](https://github.com/realm/realm-swift/issues/6511), since 4.3.1). -* Fix building for iOS devices when using Swift Package Manager - ([#6522](https://github.com/realm/realm-swift/issues/6522), since 5.0.0). -* `List` and `RealmOptional` properties on frozen objects were not initialized - correctly and would always report `nil` or an empty list. - ([#6527](https://github.com/realm/realm-swift/issues/6527), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -5.0.0 Release notes (2020-05-15) -============================================================= - -NOTE: This version bumps the Realm file format to version 10. It is not -possible to downgrade version 9 or earlier. Files created with older versions -of Realm will be automatically upgraded. Only -[Studio 3.11](https://github.com/realm/realm-studio/releases/tag/v3.11.0) or later will be able -to open the new file format. - -### Enhancements - -* Storing large binary blobs in Realm files no longer forces the file to be at - least 8x the size of the largest blob. -* Reduce the size of transaction logs stored inside the Realm file, reducing - file size growth from large transactions. -* Add support for frozen objects. `Realm`, `Results`, `List` and `Object` now - have `freeze()` methods which return a frozen copy of the object. These - objects behave similarly to creating unmanaged deep copies of the source - objects. They can be read from any thread and do not update when writes are - made to the Realm, but creating frozen objects does not actually copy data - out of the Realm and so can be much faster and use less memory. Frozen - objects cannot be mutated or observed for changes (as they never change). - ([PR #6427](https://github.com/realm/realm-swift/pull/6427)). -* Add the `isFrozen` property to `Realm`, `Results`, `List` and `Object`. -* Add `Realm.Configuration.maxNumberOfActiveVersions`. Each time a write - transaction is performed, a new version is created inside the Realm, and then - any versions which are no longer in use are cleaned up. If too many versions - are kept alive while performing writes (either due to a background thread - performing a long operation that doesn't let the Realm on that thread - refresh, or due to holding onto frozen versions for a long time) the Realm - file will grow in size, potentially to the point where it is too large to be - opened. Setting this configuration option will make write transactions which - would cause the live version count to exceed the limit to instead fail. -* Add support for queue-confined Realms. Rather than being bound to a specific - thread, queue-confined Realms are bound to a serial dispatch queue and can be - used within blocks dispatched to that queue regardless of what thread they - happen to run on. In addition, change notifications will be delivered to that - queue rather than the thread's run loop. ([PR #6478](https://github.com/realm/realm-swift/pull/6478)). -* Add an option to deliver object and collection notifications to a specific - serial queue rather than the current thread. ([PR #6478](https://github.com/realm/realm-swift/pull/6478)). -* Add Combine publishers for Realm types. Realm collections have a `.publisher` - property which publishes the collection each time it changes, and a - `.changesetPublisher` which publishes a `RealmCollectionChange` each time the - collection changes. Corresponding publishers for Realm Objects can be - obtained with the `publisher()` and `changesetPublisher()` global functions. -* Extend Combine publishers which output Realm types with a `.freeze()` - function which will make the publisher instead output frozen objects. -* String primary keys no longer require a separate index, improving insertion - and deletion performance without hurting lookup performance. -* Reduce the encrypted page reclaimer's impact on battery life when encryption - is used. ([Core #3461](https://github.com/realm/realm-core/pull/3461)). - -### Fixed - -* The uploaded bytes in sync progress notifications was sometimes incorrect and - wouldn't exactly equal the uploadable bytes when the uploaded completed. -* macOS binaries were built with the incorrect deployment target (10.14 rather - than 10.9), resulting in linker warnings. ([#6299](https://github.com/realm/realm-swift/issues/6299), since 3.18.0). -* An internal datastructure for List properties could be double-deleted if the - last reference was released from a thread other than the one which the List - was created on at the wrong time. This would typically manifest as - "pthread_mutex_destroy() failed", but could also result in other kinds of - crashes. ([#6333](https://github.com/realm/realm-swift/issues/6333)). -* Sorting on float or double properties containing NaN values had inconsistent - results and would sometimes crash due to out-of-bounds memory accesses. - ([#6357](https://github.com/realm/realm-swift/issues/6357)). - -### Breaking Changes - -* The ObjectChange type in Swift is now generic and includes a reference to the - object which changed. When using `observe(on:)` to receive notifications on a - dispatch queue, the object will be confined to that queue. -* The Realm instance passed in the callback to asyncOpen() is now confined to - the callback queue passed to asyncOpen() rather than the thread which the - callback happens to be called on. This means that the Realm instance may be - stored and reused in further blocks dispatched to that queue, but the queue - must now be a serial queue. -* Files containing Date properties written by version of Realm prior to 1.0 can - no longer be opened. -* Files containing Any properties can no longer be opened. This property type - was never documented and was deprecated in 1.0. -* Deleting objects now preserves the order of objects reported by unsorted - Results rather than performing a swap operation before the delete. Note that - it is still not safe to assume that the order of objects in an unsorted - Results is the order that the objects were created in. -* The minimum supported deployment target for iOS when using Swift Package - Manager to install Realm is now iOS 11. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.4.1. - -### Internal - -* Upgraded realm-core from v5.23.8 to v6.0.4 -* Upgraded realm-sync from v4.9.5 to v5.0.3 - -5.0.0-beta.6 Release notes (2020-05-08) -============================================================= - -### Enhancements - -* Add support for queue-confined Realms. Rather than being bound to a specific - thread, queue-confined Realms are bound to a serial dispatch queue and can be - used within blocks dispatched to that queue regardless of what thread they - happen to run on. In addition, change notifications will be delivered to that - queue rather than the thread's run loop. ([PR #6478](https://github.com/realm/realm-swift/pull/6478)). -* Add an option to deliver object and collection notifications to a specific - serial queue rather than the current thread. ([PR #6478](https://github.com/realm/realm-swift/pull/6478)). - -### Fixed - -* The uploaded bytes in sync progress notifications was sometimes incorrect and - wouldn't exactly equal the uploadable bytes when the uploaded completed. - -### Breaking Changes - -* The Realm instance passed in the callback to asyncOpen() is now confined to - the callback queue passed to asyncOpen() rather than the thread which the - callback happens to be called on. This means that the Realm instance may be - stored and reused in further blocks dispatched to that queue, but the queue - must now be a serial queue. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.4.1. - -### Internal - -* Upgraded realm-core from v6.0.3 to v6.0.4 -* Upgraded realm-sync from v5.0.1 to v5.0.3 - -4.4.1 Release notes (2020-04-16) -============================================================= - -### Enhancements - -* Upgrade Xcode 11.4 binaries to Xcode 11.4.1. - -### Fixed - -* Fix a "previous <= m_schema_transaction_version_max" assertion failure caused - by a race condition that could occur after performing a migration. (Since 3.0.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.4.1. - -5.0.0-beta.3 Release notes (2020-02-26) -============================================================= - -Based on 4.3.2 and also includes all changes since 4.3.0. - -### Enhancements - -* Add support for frozen objects. `Realm`, `Results`, `List` and `Object` now - have `freeze()` methods which return a frozen copy of the object. These - objects behave similarly to creating unmanaged deep copies of the source - objects. They can be read from any thread and do not update when writes are - made to the Realm, but creating frozen objects does not actually copy data - out of the Realm and so can be much faster and use less memory. Frozen - objects cannot be mutated or observed for changes (as they never change). - ([PR #6427](https://github.com/realm/realm-swift/pull/6427)). -* Add the `isFrozen` property to `Realm`, `Results`, `List` and `Object`. -* Add `Realm.Configuration.maxNumberOfActiveVersions`. Each time a write - transaction is performed, a new version is created inside the Realm, and then - any versions which are no longer in use are cleaned up. If too many versions - are kept alive while performing writes (either due to a background thread - performing a long operation that doesn't let the Realm on that thread - refresh, or due to holding onto frozen versions for a long time) the Realm - file will grow in size, potentially to the point where it is too large to be - opened. Setting this configuration option will make write transactions which - would cause the live version count to exceed the limit to instead fail. - - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-core from v6.0.0-beta.3 to v6.0.3 -* Upgraded realm-sync from v5.0.0-beta.2 to v5.0.1 - -5.0.0-beta.2 Release notes (2020-01-13) -============================================================= - -Based on 4.3.0 and also includes all changes since 4.1.1. - -### Fixed - -* Fix compilation when using CocoaPods targeting iOS versions older than 11 (since 5.0.0-alpha). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-core from v6.0.0-beta.2 to v6.0.0-beta.3 -* Upgraded realm-sync from v5.0.0-beta.1 to v5.0.0-beta.2 - -5.0.0-beta.1 Release notes (2019-12-13) -============================================================= - -Based on 4.1.1 and also includes all changes since 4.1.0. - -NOTE: This version bumps the Realm file format to version 10. It is not possible to downgrade version 9 or earlier. Files created with older versions of Realm will be automatically upgraded. - -### Enhancements - -* String primary keys no longer require a separate index, improving insertion - and deletion performance without hurting lookup performance. -* Reduce the encrypted page reclaimer's impact on battery life when encryption - is used. ([Core #3461](https://github.com/realm/realm-core/pull/3461)). - -### Fixed - -* Fix an error when a table-backed Results was accessed immediately after - deleting the object previously at the index being accessed (since - 5.0.0-alpha.1). -* macOS binaries were built with the incorrect deployment target (10.14 rather - than 10.9), resulting in linker warnings. ([#6299](https://github.com/realm/realm-swift/issues/6299), since 3.18.0). -* An internal datastructure for List properties could be double-deleted if the - last reference was released from a thread other than the one which the List - was created on at the wrong time. This would typically manifest as - "pthread_mutex_destroy() failed", but could also result in other kinds of - crashes. ([#6333](https://github.com/realm/realm-swift/issues/6333)). -* Sorting on float or double properties containing NaN values had inconsistent - results and would sometimes crash due to out-of-bounds memory accesses. - ([#6357](https://github.com/realm/realm-swift/issues/6357)). - -### Known Issues - -* Changing which property of an object is the primary key in a migration will - break incoming links to objects of that type. -* Changing the primary key of an object with Data properties in a migration - will crash. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-core from v6.0.0-alpha.24 to v6.0.0-beta.2 -* Upgraded realm-sync from 4.7.1-core6.5 to v5.0.0-beta.1 - -5.0.0-alpha.1 Release notes (2019-11-14) -============================================================= - -Based on 4.1.0. - -### Enhancements - -* Add `-[RLMRealm fileExistsForConfiguration:]`/`Realm.fileExists(for:)`, - which checks if a local Realm file exists for the given configuration. -* Add `-[RLMRealm deleteFilesForConfiguration:]`/`Realm.deleteFiles(for:)` - to delete the Realm file and all auxiliary files for the given configuration. -* Storing large binary blobs in Realm files no longer forces the file to be at - least 8x the size of the largest blob. -* Reduce the size of transaction logs stored inside the Realm file, reducing - file size growth from large transactions. - -NOTE: This version bumps the Realm file format to version 10. It is not -possible to downgrade version 9 or earlier. Files created with older versions -of Realm will be automatically upgraded. This automatic upgrade process is not -yet well tested. Do not open Realm files with data you care about with this -alpha version. - -### Breaking Changes - -* Files containing Date properties written by version of Realm prior to 1.0 can - no longer be opened. -* Files containing Any properties can no longer be opened. This property type - was never documented and was deprecated in 1.0. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades v9) -* Realm Object Server: 3.21.0 or later. -* APIs are backwards compatible with all previous releases in the 4.x.y series. -* Carthage release for Swift is built with Xcode 11.3. -* Carthage release for Swift is built with Xcode 11.2.1. - -### Internal - -* Upgraded realm-core from 5.23.6 to v6.0.0-alpha.24. -* Upgraded realm-sync from 4.8.2 to 4.7.1-core6.5. - -4.4.0 Release notes (2020-03-26) -============================================================= - -Swift 4.0 and Xcode 10.3 are now the minimum supported versions. - -### Enhancements - -* Allow setting the `fileUrl` for synchronized Realms. An appropriate local - path based on the sync URL will still be used if it is not overridden. - ([PR #6454](https://github.com/realm/realm-swift/pull/6454)). -* Add Xcode 11.4 binaries to the release package. - -### Fixed - -* None. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.4. - -4.3.2 Release notes (2020-02-06) -============================================================= - -### Enhancements - -* Similar to `autoreleasepool()`, `realm.write()` now returns the value which - the block passed to it returns. Returning `Void` from the block is still allowed. - -### Fixed - -* Fix a memory leak attributed to `property_copyAttributeList` the first time a - Realm is opened when using Realm Swift. ([#6409](https://github.com/realm/realm-swift/issues/6409), since 4.0.0). -* Connecting to a `realms:` sync URL would crash at runtime on iOS 11 (and no - other iOS versions) inside the SSL validation code. (Since 4.3.1). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-sync from 4.9.4 to 4.9.5. - -4.3.1 Release notes (2020-01-16) -============================================================= - -### Enhancements - -* Reduce the encrypted page reclaimer's impact on battery life when encryption - is used. ([Core #3461](https://github.com/realm/realm-core/pull/3461)). - -### Fixed - -* macOS binaries were built with the incorrect deployment target (10.14 rather - than 10.9), resulting in linker warnings. ([#6299](https://github.com/realm/realm-swift/issues/6299), since 3.18.0). -* An internal datastructure for List properties could be double-deleted if the - last reference was released from a thread other than the one which the List - was created on at the wrong time. This would typically manifest as - "pthread_mutex_destroy() failed", but could also result in other kinds of - crashes. ([#6333](https://github.com/realm/realm-swift/issues/6333)). -* Sorting on float or double properties containing NaN values had inconsistent - results and would sometimes crash due to out-of-bounds memory accesses. - ([#6357](https://github.com/realm/realm-swift/issues/6357)). -* A NOT query on a `List` which happened to have the objects in a - different order than the underlying table would sometimes include the object - immediately before an object which matches the query. ([#6289](https://github.com/realm/realm-swift/issues/6289), since 0.90.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-core from 5.23.6 to 5.23.8. -* Upgraded realm-sync from 4.9.0 to 4.9.4. - -4.3.0 Release notes (2019-12-19) -============================================================= - -### Enhancements - -* Add the ability to set a custom logger function on `RLMSyncManager` which is - called instead of the default NSLog-based logger. -* Expose configuration options for the various types of sync connection - timeouts and heartbeat intervals on `RLMSyncManager`. -* Add an option to have `Realm.asyncOpen()` report an error if the connection - times out rather than swallowing the error and attempting to reconnect until - it succeeds. - -### Fixed - -* Fix a crash when using value(forKey:) on a LinkingObjects property (including - when doing so indirectly, such as by querying on that property). - ([#6366](https://github.com/realm/realm-swift/issues/6366), since 4.0.0). -* Fix a rare crash in `ClientHistoryImpl::integrate_server_changesets()` which - would only happen in Debug builds (since v3.0.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-sync from 4.8.2 to 4.9.0. - -4.2.0 Release notes (2019-12-16) -============================================================= - -### Enhancements - -* Add `-[RLMRealm fileExistsForConfiguration:]`/`Realm.fileExists(for:)`, - which checks if a local Realm file exists for the given configuration. -* Add `-[RLMRealm deleteFilesForConfiguration:]`/`Realm.deleteFiles(for:)` - to delete the Realm file and all auxiliary files for the given configuration. - -### Fixed - -* None. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.3. - -4.1.1 Release notes (2019-11-18) -============================================================= - -### Fixed - -* The UpdatePolicy passed to `realm.add()` or `realm.create()` was not properly - propagated when adding objects within a `List`, which could result in - spurious change notifications when using `.modified`. - ([#6321](https://github.com/realm/realm-swift/issues/6321), since v3.16.0) -* Fix a rare deadlock when a Realm collection or object was observed, then - `refresh()` was explicitly called, and then the NotificationToken from the - observation was destroyed on a different thread (since 0.98.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.2. - -4.1.0 Release notes (2019-11-13) -============================================================= - -### Enhancements - -* Improve performance of queries over a link where the final target property - has an index. -* Restore support for storing `@objc enum` properties on RealmSwift.Object - subclasses (broken in 4.0.0), and add support for storing them in - RealmOptional properties. - -### Fixed - -* The sync client would fail to reconnect after failing to integrate a - changeset. The bug would lead to further corruption of the client’s Realm - file. ([RSYNC-48](https://jira.mongodb.org/browse/RSYNC-48), since v3.2.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.2. - -### Internal - -* Upgraded realm-core from 5.23.5 to 5.23.6. -* Upgraded realm-sync from 4.7.11 to 4.8.2 - -4.0.0 Release notes (2019-11-08) -============================================================= - -### Breaking Changes - -* All previously deprecated functionality has now been removed entirely. -* The schema discovery logic for RealmSwift.Object subclasses has been - rewritten in Swift. This should not have any effect on valid class - definitions, but there may be types of invalid definitions which previously - worked by coincidence and no longer do. -* `SyncSubscription` no longer has a generic type parameter, as the type was - not actually used for anything. -* The following Swift types have changed from `final class` to `struct`: - - AnyRealmCollection - - LinkingObjects - - ObjectiveCSupport - - Realm - - Results - - SyncSubscription - - ThreadSafeReference - There is no intended change in semantics from this, but certain edge cases - may behave differently. -* The designated initializers defined by RLMObject and Object other than - zero-argument `init` have been replaced with convenience initializers. -* The implementation of the path-based permissions API has been redesigned to - accomodate changes to the server. This should be mostly a transparent change, - with two main exceptions: - 1. SyncPermission objects are no longer live Realm objects, and retrieving - permissions gives an Array rather than Results. - Getting up-to-date permissions now requires calling retrievePermissions() again - rather than observing the permissions. - 2. The error codes for permissions functions have changed. Rather than a - separate error type and set of error codes, permission functions now produce - SyncAuthErrors. - -### Enhancements - -* Improve performance of initializing Realm objects with List properties. - -### Fixed - -* None. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.2. - -3.21.0 Release notes (2019-11-04) -============================================================= - -### Enhancements - -* Add prebuilt binaries for Xcode 11.2. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.2. - -3.20.0 Release notes (2019-10-21) -============================================================= - -### Enhancements - -* Add support for custom refresh token authentication. This allows a user to be - authorized with an externally-issued refresh token when ROS is configured to - recognize the external issuer as a refresh token validator. - ([PR #6311](https://github.com/realm/realm-swift/pull/6311)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11. - -3.19.1 Release notes (2019-10-17) -============================================================= - -### Enhancements - -* Improve performance of sync changeset integration. Transactions involving a - very large number of objects and cheap operations on each object are as much - as 20% faster. - -### Fixed - -* Fix a crash when a RLMArray/List of primitives was observed and then the - containing object was deleted before the first time that the background - notifier could run. - ([Issue #6234](https://github.com/realm/realm-swift/issues/6234, since 3.0.0)). -* Remove an incorrect assertion that would cause crashes inside - `TableInfoCache::get_table_info()`, with messages like "Assertion failed: info.object_id_index == 0 [3, 0]". - (Since 3.18.0, [#6268](https://github.com/realm/realm-swift/issues/6268) and [#6257](https://github.com/realm/realm-swift/issues/6257)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.0. - -### Internal - -* Upgrade to REALM_SYNC_VERSION=4.7.11 - -3.19.0 Release notes (2019-09-27) -============================================================= - -### Enhancements - -* Expose ObjectSchema.objectClass in Swift as looking up the class via - NSClassFromString() can be complicated for Swift types. - ([PR #6244](https://github.com/realm/realm-swift/pull/6244)). -* Add support for suppressing notifications using closure-based write/transaction methods. - ([PR #6252](https://github.com/realm/realm-swift/pull/6252)). - -### Fixed - -* IN or chained OR equals queries on an unindexed string column would fail to - match some results if any of the strings were 64 bytes or longer. - ([Core #3386](https://github.com/realm/realm-core/pull/3386), since 3.14.2). -* Query Based Sync subscriptions for queries involving a null timestamp were - not sent to the server correctly and would match no objects. - ([Core #3389](https://github.com/realm/realm-core/pull/3388), since 3.17.3). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.0. - -### Internal - -* Upgrade to REALM_CORE_VERSION=5.23.5 -* Upgrade to REALM_SYNC_VERSION=4.7.8 - -3.18.0 Release notes (2019-09-13) -============================================================= - -The file format for synchronized Realms has changed. Old Realms will be -automatically upgraded when they are opened. Once upgraded, the files will not -be openable by older versions of Realm. The upgrade should not take a -significant amount of time to run or run any risk of errors. - -This does not effect non-synchronized Realms. - -### Enhancements - -* Improve performance of queries on Date properties - ([Core #3344](https://github.com/realm/realm-core/pull/3344), [Core #3351](https://github.com/realm/realm-core/pull/3351)). -* Syncronized Realms are now more aggressive about trimming local history that - is no longer needed. This should reduce file size growth in write-heavy - workloads. ([Sync #3007](https://github.com/realm/realm-sync/issues/3007)). -* Add support for building Realm as an xcframework. - ([PR #6238](https://github.com/realm/realm-swift/pull/6238)). -* Add prebuilt libraries for Xcode 11 to the release package. - ([PR #6248](https://github.com/realm/realm-swift/pull/6248)). -* Add a prebuilt library for Catalyst/UIKit For Mac to the release package - ([PR #6248](https://github.com/realm/realm-swift/pull/6248)). - -### Fixed - -* If a signal interrupted a msync() call, Realm would throw an exception and - the write transaction would fail. This behavior has new been changed to retry - the system call instead. ([Core #3352](https://github.com/realm/realm-core/issues/3352)) -* Queries on the sum or average of an integer property would sometimes give - incorrect results. ([Core #3356](https://github.com/realm/realm-core/pull/3356)). -* Opening query-based synchronized Realms with a small number of subscriptions - performed an unneccesary write transaction. ([ObjectStore #815](https://github.com/realm/realm-object-store/pull/815)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.0 - -### Deprecations - -* `RLMIdentityProviderNickname` has been deprecated in favor of `RLMIdentityProviderUsernamePassword`. -* `+[RLMIdentityProvider credentialsWithNickname]` has been deprecated in favor of `+[RLMIdentityProvider credentialsWithUsername]`. -* `Sync.nickname(String, Bool)` has been deprecated in favor of `Sync.usernamePassword(String, String, Bool)`. - -3.17.3 Release notes (2019-07-24) -============================================================= - -### Enhancements - -* Add Xcode 10.3 binaries to the release package. Remove the Xcode 9.2 and 9.3 binaries. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.3. - -3.17.1 Release notes (2019-07-10) -============================================================= - -### Enhancements - -* Add support for canceling asynchronous opens using a new AsyncOpenTask - returned from the asyncOpen() call. ([PR #6193](https://github.com/realm/realm-swift/pull/6193)). -* Importing the Realm SPM package can now be done by pinning to a version - rather than a branch. - -### Fixed - -* Queries on a List/RLMArray which checked an indexed int property would - sometimes give incorrect results. - ([#6154](https://github.com/realm/realm-swift/issues/6154)), since v3.15.0) -* Queries involving an indexed int property had a memory leak if run multiple - times. ([#6186](https://github.com/realm/realm-swift/issues/6186)), since v3.15.0) -* Creating a subscription with `includeLinkingObjects:` performed unneccesary - comparisons, making it extremely slow when large numbers of objects were - involved. ([Core #3311](https://github.com/realm/realm-core/issues/3311), since v3.15.0) - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.17.0 Release notes (2019-06-28) -============================================================= - -### Enhancements - -* Add support for including Realm via Swift Package Manager. This currently - requires depending on the branch "master" rather than pinning to a version - (i.e. `.package(url: "https://github.com/realm/realm-swift", .branch("master"))`). - ([#6187](https://github.com/realm/realm-swift/pull/6187)). -* Add Codable conformance to RealmOptional and List, and Encodable conformance to Results. - ([PR #6172](https://github.com/realm/realm-swift/pull/6172)). - -### Fixed - -* Attempting to observe an unmanaged LinkingObjects object crashed rather than - throwing an approriate exception (since v0.100.0). -* Opening an encrypted Realm could potentially report that a valid file was - corrupted if the system was low on free memory. - (since 3.14.0, [Core #3267](https://github.com/realm/realm-core/issues/3267)) -* Calling `Realm.asyncOpen()` on multiple Realms at once would sometimes crash - due to a `FileNotFound` exception being thrown on a background worker thread. - (since 3.16.0, [ObjectStore #806](https://github.com/realm/realm-object-store/pull/806)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.16.2 Release notes (2019-06-14) -============================================================= - -### Enhancements - -* Add support for Xcode 11 Beta 1. Xcode betas are only supported when building - from source, and not when using a prebuilt framework. - ([PR #6164](https://github.com/realm/realm-swift/pull/6164)). - -### Fixed - -* Using asyncOpen on query-based Realms which didn't already exist on the local - device would fail with error 214. - ([#6178](https://github.com/realm/realm-swift/issues/6178), since 3.16.0). -* asyncOpen on query-based Realms did not wait for the server-created - permission objects to be downloaded, resulting in crashes if modifications to - the permissions were made before creating a subscription for the first time (since 3.0.0). -* EINTR was not handled correctly in the notification worker, which may have - resulted in inconsistent and rare assertion failures in - `ExternalCommitHelper::listen()` when building with assertions enabled. - (PR: [#804](https://github.com/realm/realm-object-store/pull/804), since 0.91.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.16.1 Release notes (2019-05-31) -============================================================= - -### Fixed - -* The static type passed at compile time to `realm.create()` was checked for a - primary key rather than the actual type passed at runtime, resulting in - exceptions like "''RealmSwiftObject' does not have a primary key and can not - be updated'" being thrown even if the object type being created has a primary - key. (since 3.16.0, [#6159](https://github.com/realm/realm-swift/issues/6159)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.16.0 Release notes (2019-05-29) -============================================================= - -### Enhancements - -* Add an option to only set the properties which have values different from the - existing ones when updating an existing object with - `Realm.create()`/`-[RLMObject createOrUpdateInRealm:withValue:]`. This makes - notifications report only the properties which have actually changed, and - improves Object Server performance by reducing the number of operations to - merge. (Issue: [#5970](https://github.com/realm/realm-swift/issues/5970), - PR: [#6149](https://github.com/realm/realm-swift/pull/6149)). -* Using `-[RLMRealm asyncOpenWithConfiguration:callbackQueue:]`/`Realm.asyncOpen()` to open a - synchronized Realm which does not exist on the local device now uses an - optimized transfer method to download the initial data for the Realm, greatly - speeding up the first start time for applications which use full - synchronization. This is currently not applicable to query-based - synchronization. (PR: [#6106](https://github.com/realm/realm-swift/pull/6106)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.15.0 Release notes (2019-05-06) -============================================================= - -The minimum version of Realm Object Server has been increased to 3.21.0 and -attempting to connect to older versions will produce protocol mismatch errors. -Realm Cloud has already been upgraded to this version, and users using that do -not need to worry about this. - -### Enhancements - -* Add `createdAt`, `updatedAt`, `expiresAt` and `timeToLive` properties to - `RLMSyncSubscription`/`SyncSubscription`. These properties will be `nil` for - subscriptions created with older versions of Realm, but will be automatically - populated for newly-created subscriptions. -* Add support for transient subscriptions by setting the `timeToLive` when - creating the subscription. The next time a subscription is created or updated - after that time has elapsed the subscription will be automatically removed. -* Add support for updating existing subscriptions with a new query or limit. - This is done by passing `update: true` (in swift) or setting - `options.overwriteExisting = YES` (in obj-c) when creating the subscription, - which will make it update the existing subscription with the same name rather - than failing if one already exists with that name. -* Add an option to include the objects from - `RLMLinkingObjects`/`LinkingObjects` properties in sync subscriptions, - similarly to how `RLMArray`/`List` automatically pull in the contained - objects. -* Improve query performance for chains of OR conditions (or an IN condition) on - an unindexed integer or string property. - ([Core PR #2888](https://github.com/realm/realm-core/pull/2888) and - [Core PR #3250](https://github.com/realm/realm-core/pull/3250)). -* Improve query performance for equality conditions on indexed integer properties. - ([Core PR #3272](https://github.com/realm/realm-core/pull/3272)). -* Adjust the file allocation algorithm to reduce fragmentation caused by large - numbers of small blocks. -* Improve file allocator logic to reduce fragmentation and improve commit - performance after many writes. ([Core PR #3278](https://github.com/realm/realm-core/pull/3278)). - -### Fixed - -* Making a query that compares two integer properties could cause a - segmentation fault on x86 (i.e. macOS only). - ([Core PR #3253](https://github.com/realm/realm-core/pull/3256)). -* The `downloadable_bytes` parameter passed to sync progress callbacks reported - a value which correlated to the amount of data left to download, but not - actually the number of bytes which would be downloaded. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.14.2 Release notes (2019-04-25) -============================================================= - -### Enhancements - -* Updating `RLMSyncManager.customRequestHeaders` will immediately update all - currently active sync session with the new headers rather than requiring - manually closing the Realm and reopening it. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.14.1 Release notes (2019-04-04) -============================================================= - -### Fixed - -* Fix "Cannot find interface declaration for 'RealmSwiftObject', superclass of - 'MyRealmObjectClass'" errors when building for a simulator with Xcode 10.2 - with "Install Objective-C Compatibility Header" enabled. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. -* Carthage release for Swift is built with Xcode 10.2. - -3.14.0 Release notes (2019-03-27) -============================================================= - -### Enhancements - -* Reduce memory usage when committing write transactions. -* Improve performance of compacting encrypted Realm files. - ([PR #3221](https://github.com/realm/realm-core/pull/3221)). -* Add a Xcode 10.2 build to the release package. - -### Fixed - -* Fix a memory leak whenever Realm makes a HTTP(s) request to the Realm Object - Server (Issue [#6058](https://github.com/realm/realm-swift/issues/6058), since 3.8.0). -* Fix an assertion failure when creating an object in a synchronized Realm - after creating an object with a null int primary key in the same write - transaction. - ([PR #3227](https://github.com/realm/realm-core/pull/3227)). -* Fix some new warnings when building with Xcode 10.2 beta. -* Properly clean up sync sessions when the last Realm object using the session - is deallocated while the session is explicitly suspended (since 3.9.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. -* Carthage release for Swift is built with Xcode 10.2. - -### Internal - -* Throw an exception rather than crashing with an assertion failure in more - cases when opening invalid Realm files. -* Upgrade to REALM_CORE_VERSION=5.14.0 -* Upgrade to REALM_SYNC_VERSION=3.15.1 - -3.13.1 Release notes (2019-01-03) -============================================================= - -### Fixed - -* Fix a crash when iterating over `Realm.subscriptions()` using for-in. - (Since 3.13.0, PR [#6050](https://github.com/realm/realm-swift/pull/6050)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -3.13.0 Release notes (2018-12-14) -============================================================= - -### Enhancements - -* Add `Realm.subscriptions()`/`-[RLMRealm subscriptions]` and - `Realm.subscription(named:)`/`-[RLMRealm subscriptionWithName:]` to enable - looking up existing query-based sync subscriptions. - (PR: https://github.com/realm/realm-swift/pull/6029). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -3.12.0 Release notes (2018-11-26) -============================================================= - -### Enhancements - -* Add a User-Agent header to HTTP requests made to the Realm Object Server. By - default, this contains information about the Realm library version and your - app's bundle ID. The application identifier can be customized by setting - `RLMSyncManager.sharedManager.userAgent`/`SyncManager.shared.userAgent` prior - to opening a synchronized Realm. - (PR: https://github.com/realm/realm-swift/pull/6007). -* Add Xcode 10.1 binary to the prebuilt package. - -### Fixed - -* None. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -### Internal - -* None. - - -3.11.2 Release notes (2018-11-15) -============================================================= - -### Enhancements - -* Improve the performance of the merge algorithm used for integrating remote - changes from the server. In particular, changesets involving many objects - which all link to a single object should be greatly improved. - -### Fixed - -* Fix a memory leak when removing notification blocks from collections. - PR: [#702](https://github.com/realm/realm-object-store/pull/702), since 1.1.0. -* Fix re-sorting or distincting an already-sorted Results using values from - linked objects. Previously the unsorted order was used to read the values - from the linked objects. - PR [#3102](https://github.com/realm/realm-core/pull/3102), since 3.1.0. -* Fix a set of bugs which could lead to bad changeset assertions when using - sync. The assertions would look something like the following: - `[realm-core-5.10.0] Assertion failed: ndx < size() with (ndx, size()) = [742, 742]`. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -### Internal - -* None. - - -3.11.1 Release notes (2018-10-19) -============================================================= - -### Enhancements - -* None. - -### Fixed - -* Fix `SyncUser.requestEmailConfirmation` not triggering the email confirmation - flow on ROS. (PR [#5953](https://github.com/realm/realm-swift/pull/5953), since 3.5.0) -* Add some missing validation in the getters and setters of properties on - managed Realm objects, which would sometimes result in an application - crashing with a segfault rather than the appropriate exception being thrown - when trying to write to an object which has been deleted. - (PR [#5952](https://github.com/realm/realm-swift/pull/5952), since 2.8.0) - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -### Internal - -* None. - - -3.11.0 Release notes (2018-10-04) -============================================================= - -### Enhancements -* Reduce memory usage when integrating synchronized changes sent by ROS. -* Devices will now report download progress for read-only Realms, allowing the - server to compact Realms more aggressively and reducing the amount of - server-side storage space required. - -### Fixed -* Fix a crash when adding an object with a non-`@objc` `String?` property which - has not been explicitly ignored to a Realm on watchOS 5 (and possibly other - platforms when building with Xcode 10). - (Issue: [5929](https://github.com/realm/realm-swift/issues/5929)). -* Fix some merge algorithm bugs which could result in `BadChangesetError` - being thrown when integrating changes sent by the server. - -### Compatibility -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* **NOTE!!! - You will need to upgrade your Realm Object Server to at least version 3.11.0 - or use [Realm Cloud](https://cloud.realm.io). - If you try to connect to a ROS v3.10.x or previous, you will see an error - like `Wrong protocol version in Sync HTTP request, client protocol version = 25, - server protocol version = 24`.** - -### Internal -* Update to Sync 3.12.2. - - -3.10.0 Release notes (2018-09-19) -============================================================= - -Prebuilt binaries are now built for Xcode 9.2, 9.3, 9.4 and 10.0. - -Older versions of Xcode are still supported when building from source, but you -should be migrating to at least Xcode 9.2 as soon as possible. - -### Enhancements - -* Add support for Watch Series 4 by adding an arm64_32 slice to the library. - -3.9.0 Release notes (2018-09-10) -============================================================= - -### Enhancements - -* Expose RLMSyncUser.refreshToken publicly so that it can be used for custom - HTTP requests to Realm Object Server. -* Add RLMSyncSession.connectionState, which reports whether the session is - currently connected to the Realm Object Server or if it is offline. -* Add `-suspend` and `-resume` methods to `RLMSyncSession` to enable manually - pausing data synchronization. -* Add support for limiting the number of objects matched by a query-based sync - subscription. This requires a server running ROS 3.10.1 or newer. - -### Bugfixes - -* Fix crash when getting the description of a `MigrationObject` which has - `List` properties. -* Fix crash when calling `dynamicList()` on a `MigrationObject`. - -3.8.0 Release notes (2018-09-05) -============================================================= - -### Enhancements - -* Remove some old and no longer applicable migration logic which created an - unencrypted file in the sync metadata directory containing a list of ROS URLs - connected to. -* Add support for pinning SSL certificates used for https and realms - connections by setting `RLMSyncManager.sharedManager.pinnedCertificatePaths` - in obj-c and `SyncManager.shared.pinnedCertificatePaths` in Swift. - -### Bugfixes - -* Fix warnings when building Realm as a static framework with CocoaPods. - -3.7.6 Release notes (2018-08-08) -============================================================= - -### Enhancements - -* Speed up the actual compaction when using compact-on-launch. -* Reduce memory usage when locally merging changes from sync. -* When first connecting to a server, wait to begin uploading changes until - after all changes have been downloaded to reduce the server-side load for - query-based sync. - -3.7.5 Release notes (2018-07-23) -============================================================= - -### Enhancements - -* Improve performance of applying remote changesets from sync. -* Improve performance of creating objects with string primary keys. -* Improve performance of large write transactions. -* Adjust file space allocation strategy to reduce fragmentation, producing - smaller Realm files and typically better performance. -* Close network connections immediately when a sync session is destroyed. -* Report more information in `InvalidDatabase` exceptions. - -### Bugfixes - -* Fix permission denied errors for RLMPlatform.h when building with CocoaPods - and Xcode 10 beta 3. -* Fix a use-after-free when canceling a write transaction which could result in - incorrect "before" values in KVO observations (typically `nil` when a non-nil - value is expected). -* Fix several bugs in the merge algorithm that could lead to memory corruption - and crashes with errors like "bad changeset" and "unreachable code". - -3.7.4 Release notes (2018-06-19) -============================================================= - -### Bugfixes - -* Fix a bug which could potentially flood Realm Object Server with PING - messages after a client device comes back online. - -3.7.3 Release notes (2018-06-18) -============================================================= - -### Enhancements - -* Avoid performing potentially large amounts of pointless background work for - LinkingObjects instances which are accessed and then not immediate deallocated. - -### Bugfixes - -* Fix crashes which could result from extremely fragmented Realm files. -* Fix a bug that could result in a crash with the message "bad changeset error" - when merging changesets from the server. - -3.7.2 Release notes (2018-06-13) -============================================================= - -### Enhancements - -* Add some additional consistency checks that will hopefully produce better - errors when the "prev_ref + prev_size <= ref" assertion failure occurs. - -### Bugfixes - -* Fix a problem in the changeset indexing algorithm that would sometimes - cause "bad permission object" and "bad changeset" errors. -* Fix a large number of linking warnings about symbol visibility by aligning - compiler flags used. -* Fix large increase in size of files produced by `Realm.writeCopy()` introduced in 3.6.0. - -3.7.1 Release notes (2018-06-07) -============================================================= - -* Add support for compiling Realm Swift with Xcode 10 beta 1. - -3.7.0 Release notes (2018-06-06) -============================================================= - -The feature known as Partial Sync has been renamed to Query-based -Synchronization. This has impacted a number of API's. See below for the -details. - -### Deprecations - -* `+[RLMSyncConfiguration initWithUser] has been deprecated in favor of `-[RLMSyncUser configurationWithURL:url]. -* `+[RLMSyncConfiguration automaticConfiguration] has been deprecated in favor of `-[RLMSyncUser configuration]. -* `+[RLMSyncConfiguration automaticConfigurationForUser] has been deprecated in favor of `-[RLMSyncUser configuration]. -* `-[RLMSyncConfiguration isPartial] has been deprecated in favor of `-[RLMSyncConfiguration fullSynchronization]`. - -### Enhancements - -* Add `-[RLMRealm syncSession]` and `Realm.syncSession` to obtain the session used for a synchronized Realm. -* Add `-[RLMSyncUser configuration]`. Query-based sync is the default sync mode for this configuration. -* Add `-[RLMSyncUser configurationWithURL:url]`. Query-based sync is the default sync mode for this configuration. - -3.6.0 Release notes (2018-05-29) -============================================================= - -### Enhancements - -* Improve performance of sync metadata operations and resolving thread-safe - references. -* `shouldCompactOnLaunch` is now supported for compacting the local data of - synchronized Realms. - -### Bugfixes - -* Fix a potential deadlock when a sync session progress callback held the last - strong reference to the sync session. -* Fix some cases where comparisons to `nil` in queries were not properly - serialized when subscribing to a query. -* Don't delete objects added during a migration after a call to `-[RLMMigration - deleteDataForClassName:]`. -* Fix incorrect results and/or crashes when multiple `-[RLMMigration - enumerateObjects:block:]` blocks deleted objects of the same type. -* Fix some edge-cases where `-[RLMMigration enumerateObjects:block:]` - enumerated the incorrect objects following deletions. -* Restore the pre-3.5.0 behavior for Swift optional properties missing an ivar - rather than crashing. - -3.5.0 Release notes (2018-04-25) -============================================================= - -### Enhancements - -* Add wrapper functions for email confirmation and password reset to `SyncUser`. - -### Bugfixes - -* Fix incorrect results when using optional chaining to access a RealmOptional - property in Release builds, or otherwise interacting with a RealmOptional - object after the owning Object has been deallocated. - -3.4.0 Release notes (2018-04-19) -============================================================= - -The prebuilt binary for Carthage is now built for Swift 4.1. - -### Enhancements - -* Expose `RLMSyncManager.authorizationHeaderName`/`SyncManager.authorizationHeaderName` - as a way to override the transport header for Realm Object Server authorization. -* Expose `RLMSyncManager.customRequestHeaders`/`SyncManager.customRequestHeaders` - which allows custom HTTP headers to be appended on requests to the Realm Object Server. -* Expose `RLMSSyncConfiguration.urlPrefix`/`SyncConfiguration.urlPrefix` as a mechanism - to replace the default path prefix in Realm Sync WebSocket requests. - -3.3.2 Release notes (2018-04-03) -============================================================= - -Add a prebuilt binary for Xcode 9.3. - -3.3.1 Release notes (2018-03-28) -============================================================= - -Realm Object Server v3.0.0 or newer is required when using synchronized Realms. - -### Enhancements - -* Expose `RLMObject.object(forPrimaryKey:)` as a factory method for Swift so - that it is callable with recent versions of Swift. - -### Bugfixes - -* Exclude the RLMObject-derived Permissions classes from the types repored by - `Realm.Configuration.defaultConfiguration.objectTypes` to avoid a failed - cast. -* Cancel pending `Realm.asyncOpen()` calls when authentication fails with a - non-transient error such as missing the Realm path in the URL. -* Fix "fcntl() inside prealloc()" errors on APFS. - -3.3.0 Release notes (2018-03-19) -============================================================= - -Realm Object Server v3.0.0 or newer is required when using synchronized Realms. - -### Enhancements - -* Add `Realm.permissions`, `Realm.permissions(forType:)`, and `Realm.permissions(forClassNamed:)` as convenience - methods for accessing the permissions of the Realm or a type. - -### Bugfixes - -* Fix `+[RLMClassPermission objectInRealm:forClass:]` to work for classes that are part of the permissions API, - such as `RLMPermissionRole`. -* Fix runtime errors when applications define an `Object` subclass with the - same name as one of the Permissions object types. - -3.2.0 Release notes (2018-03-15) -============================================================= - -Realm Object Server v3.0.0 or newer is required when using synchronized Realms. - -### Enhancements - -* Added an improved API for adding subscriptions in partially-synchronized Realms. `Results.subscribe()` can be - used to subscribe to any result set, and the returned `SyncSubscription` object can be used to observe the state - of the subscription and ultimately to remove the subscription. See the documentation for more information - (). -* Added a fine-grained permissions system for use with partially-synchronized Realms. This allows permissions to be - defined at the level of individual objects or classes. See the documentation for more information - (). -* Added `SyncConfiguration.automatic()` and `SyncConfiguration.automatic(user:)`. - These methods return a `Realm.Configuration` appropriate for syncing with the default - synced Realm for the current (or specified) user. These should be considered the preferred methods - for accessing synced Realms going forwards. -* Added `+[RLMSyncSession sessionForRealm:]` to retrieve the sync session corresponding to a `RLMRealm`. - -### Bugfixes - -* Fix incorrect initalization of `RLMSyncManager` that made it impossible to - set `errorHandler`. -* Fix compiler warnings when building with Xcode 9.3. -* Fix some warnings when running with UBsan. - -3.2.0-rc.1 Release notes (2018-03-14) -============================================================= - -Realm Object Server v3.0.0-rc.1 or newer is required when using synchronized Realms. - -### Enhancements - -* Added `SyncConfiguration.automatic()` and `SyncConfiguration.automatic(user:)`. - These methods return a `Realm.Configuration` appropriate for syncing with the default - synced Realm for the current (or specified). These should be considered the preferred methods - for accessing synced Realms going forwards. -* A role is now automatically created for each user with that user as its only member. - This simplifies the common use case of restricting access to specific objects to a single user. - This role can be accessed at `PermissionUser.role`. -* Improved error reporting when the server rejects a schema change due to a lack of permissions. - -### Bugfixes - -* Fix incorrect initalization of `RLMSyncManager` that made it impossible to - set `errorHandler`. -* Fix compiler warnings when building with Xcode 9.3. - -3.2.0-beta.3 Release notes (2018-03-01) -============================================================= - -Realm Object Server v3.0.0-alpha.9 or newer is required when using synchronized Realms. - -### Bugfixes - -* Fix a crash that would occur when using partial sync with Realm Object Server v3.0.0-alpha.9. - -3.2.0-beta.2 Release notes (2018-02-28) -============================================================= - -Realm Object Server v3.0.0-alpha.8 or newer is required when using synchronized Realms. - -### Enhancements - -* Added `findOrCreate(forRoleNamed:)` and `findOrCreate(forRole:)` to `List` - to simplify the process of adding permissions for a role. -* Added `+permissionForRoleNamed:inArray:`, `+permissionForRoleNamed:onRealm:`, - `+permissionForRoleNamed:onClass:realm:`, `+permissionForRoleNamed:onClassNamed:realm:`, - and `+permissionForRoleNamed:onObject:` to `RLMSyncPermission` to simplify the process - of adding permissions for a role. -* Added `+[RLMSyncSession sessionForRealm:]` to retrieve the sync session corresponding to a `RLMRealm`. - -### Bugfixes - -* `PermissionRole.users` and `PermissionUser.roles` are now public as intended. -* Fixed the handling of `setPermissions` in `-[RLMRealm privilegesForRealm]` and related methods. - -3.2.0-beta.1 Release notes (2018-02-19) -============================================================= - -### Enhancements - -* Added an improved API for adding subscriptions in partially-synchronized Realms. `Results.subscribe()` can be - used to subscribe to any result set, and the returned `SyncSubscription` object can be used to observe the state - of the subscription and ultimately to remove the subscription. -* Added a fine-grained permissions system for use with partially-synchronized Realms. This allows permissions to be - defined at the level of individual objects or classes. See `Permission` and related types for more information. - -### Bugfixes - -* Fix some warnings when running with UBsan. - -3.1.1 Release notes (2018-02-03) -============================================================= - -Prebuilt Swift frameworks for Carthage are now built with Xcode 9.2. - -### Bugfixes - -* Fix a memory leak when opening Realms with an explicit `objectTypes` array - from Swift. - -3.1.0 Release notes (2018-01-16) -============================================================= - -* Prebuilt frameworks are now included for Swift 3.2.3 and 4.0.3. -* Prebuilt frameworks are no longer included for Swift 3.0.x. -* Building from source with Xcode versions prior to Xcode 8.3 is no longer supported. - -### Enhancements - -* Add `Results.distinct(by:)` / `-[RLMResults distinctResultsUsingKeyPaths:]`, which return a `Results` - containing only objects with unique values at the given key paths. -* Improve performance of change checking for notifications in certain cases. -* Realm Object Server errors not explicitly recognized by the client are now reported to the application - regardless. -* Add support for JSON Web Token as a sync credential source. -* Add support for Nickname and Anonymous Auth as a sync credential source. -* Improve allocator performance when writing to a highly fragmented file. This - should significantly improve performance when inserting large numbers of - objects which have indexed properties. -* Improve write performance for complex object graphs involving many classes - linking to each other. - -### Bugfixes - -* Add a missing check for a run loop in the permission API methods which - require one. -* Fix some cases where non-fatal sync errors were being treated as fatal errors. - -3.0.2 Release notes (2017-11-08) -============================================================= - -Prebuilt frameworks are now included for Swift 3.2.2 and 4.0.2. - -### Bugfixes - -* Fix a crash when a linking objects property is retrieved from a model object instance via - Swift subscripting. -* Fix incorrect behavior if a call to `posix_fallocate` is interrupted. - -3.0.1 Release notes (2017-10-26) -============================================================= - -### Bugfixes - -* Explicitly exclude KVO-generated object subclasses from the schema. -* Fix regression where the type of a Realm model class is not properly determined, causing crashes - when a type value derived at runtime by `type(of:)` is passed into certain APIs. -* Fix a crash when an `Object` subclass has implicitly ignored `let` - properties. -* Fix several cases where adding a notification block from within a - notification callback could produce incorrect results. - -3.0.0 Release notes (2017-10-16) -============================================================= - -### Breaking Changes -* iOS 7 is no longer supported. -* Synchronized Realms require a server running Realm Object Server v2.0 or higher. -* Computed properties on Realm object types are detected and no - longer added to the automatically generated schema. -* The Objective-C and Swift `create(_:, value: update:)` APIs now - correctly nil out nullable properties when updating an existing - object when the `value` argument specifies nil or `NSNull` for - the property value. -* `-[RLMRealm addOrUpdateObjects:]` and `-[RLMRealm deleteObjects:]` now - require their argument to conform to `NSFastEnumeration`, to match similar - APIs that also take collections. -* The way interactive sync errors (client reset and permission denied) - are delivered to the user has been changed. Instead of a block which can - be invoked to immediately delete the offending Realm file, an opaque - token object of type `RLMSyncErrorActionToken` will be returned in the - error object's `userInfo` dictionary. This error object can be passed - into the new `+[RLMSyncSession immediatelyHandleError:]` API to delete - the files. -* The return types of the `SyncError.clientResetInfo()` and - `SyncError.deleteRealmUserInfo()` APIs have been changed. They now return - `RLMSyncErrorActionToken`s or `SyncError.ActionToken`s instead of closures. -* The class methods `Object.className()`, `Object.objectUtilClass()`, and - the property `Object.isInvalidated` can no longer be overriden. -* The callback which runs when a sync user login succeeds or fails - now runs on the main queue by default, or can be explicitly specified - by a new `callbackQueue` parameter on the `{RLM}SyncUser.logIn(...)` API. -* Fix empty strings, binary data, and null on the right side of `BEGINSWITH`, - `ENDSWITH` and `CONTAINS` operators in predicates to match Foundation's - semantics of never matching any strings or data. -* Swift `Object` comparison and hashing behavior now works the same way as - that of `RLMObject` (objects are now only considered equatable if their - model class defines a primary key). -* Fix the way the hash property works on `Object` when the object model has - no primary key. -* Fix an issue where if a Swift model class defined non-generic managed - properties after generic Realm properties (like `List`), the schema - would be constructed incorrectly. Fixes an issue where creating such - models from an array could fail. -* Loosen `RLMArray` and `RLMResults`'s generic constraint from `RLMObject` to - `NSObject`. This may result in having to add some casts to disambiguate - types. -* Remove `RLMSyncPermissionResults`. `RLMSyncPermission`s are now vended out - using a `RLMResults`. This results collection supports all normal collection - operations except for setting values using key-value coding (since - `RLMSyncPermission`s are immutable) and the property aggregation operations. -* `RLMSyncUserInfo` has been significantly enhanced. It now contains metadata - about a user stored on the Realm Object Server, as well as a list of all user account - data associated with that user. -* Starting with Swift 4, `List` now conforms to `MutableCollection` instead of - `RangeReplaceableCollection`. For Swift 4, the empty collection initializer has been - removed, and default implementations of range replaceable collection methods that - make sense for `List` have been added. -* `List.removeLast()` now throws an exception if the list is empty, to more closely match - the behavior of the standard library's `Collection.removeLast()` implementation. -* `RealmCollection`'s associated type `Element` has been renamed `ElementType`. -* The following APIs have been renamed: - -| Old API | New API | -|:------------------------------------------------------------|:---------------------------------------------------------------| -| `NotificationToken.stop()` | `NotificationToken.invalidate()` | -| `-[RLMNotificationToken stop]` | `-[RLMNotificationToken invalidate]` | -| `RealmCollection.addNotificationBlock(_:)` | `RealmCollection.observe(_:)` | -| `RLMSyncProgress` | `RLMSyncProgressMode` | -| `List.remove(objectAtIndex:)` | `List.remove(at:)` | -| `List.swap(_:_:)` | `List.swapAt(_:_:)` | -| `SyncPermissionValue` | `SyncPermission` | -| `RLMSyncPermissionValue` | `RLMSyncPermission` | -| `-[RLMSyncPermission initWithRealmPath:userID:accessLevel]` | `-[RLMSyncPermission initWithRealmPath:identity:accessLevel:]` | -| `RLMSyncPermission.userId` | `RLMSyncPermission.identity` | -| `-[RLMRealm addOrUpdateObjectsInArray:]` | `-[RLMRealm addOrUpdateObjects:]` | - -* The following APIs have been removed: - -| Removed API | Replacement | -|:-------------------------------------------------------------|:------------------------------------------------------------------------------------------| -| `Object.className` | None, was erroneously present. | -| `RLMPropertyTypeArray` | `RLMProperty.array` | -| `PropertyType.array` | `Property.array` | -| `-[RLMArray sortedResultsUsingProperty:ascending:]` | `-[RLMArray sortedResultsUsingKeyPath:ascending:]` | -| `-[RLMCollection sortedResultsUsingProperty:ascending:]` | `-[RLMCollection sortedResultsUsingKeyPath:ascending:]` | -| `-[RLMResults sortedResultsUsingProperty:ascending:]` | `-[RLMResults sortedResultsUsingKeyPath:ascending:]` | -| `+[RLMSortDescriptor sortDescriptorWithProperty:ascending:]` | `+[RLMSortDescriptor sortDescriptorWithKeyPath:ascending:]` | -| `RLMSortDescriptor.property` | `RLMSortDescriptor.keyPath` | -| `AnyRealmCollection.sorted(byProperty:ascending:)` | `AnyRealmCollection.sorted(byKeyPath:ascending:)` | -| `List.sorted(byProperty:ascending:)` | `List.sorted(byKeyPath:ascending:)` | -| `LinkingObjects.sorted(byProperty:ascending:)` | `LinkingObjects.sorted(byKeyPath:ascending:)` | -| `Results.sorted(byProperty:ascending:)` | `Results.sorted(byKeyPath:ascending:)` | -| `SortDescriptor.init(property:ascending:)` | `SortDescriptor.init(keyPath:ascending:)` | -| `SortDescriptor.property` | `SortDescriptor.keyPath` | -| `+[RLMRealm migrateRealm:configuration:]` | `+[RLMRealm performMigrationForConfiguration:error:]` | -| `RLMSyncManager.disableSSLValidation` | `RLMSyncConfiguration.enableSSLValidation` | -| `SyncManager.disableSSLValidation` | `SyncConfiguration.enableSSLValidation` | -| `RLMSyncErrorBadResponse` | `RLMSyncAuthErrorBadResponse` | -| `RLMSyncPermissionResults` | `RLMResults` | -| `SyncPermissionResults` | `Results` | -| `RLMSyncPermissionChange` | `-[RLMSyncUser applyPermission:callback]` / `-[RLMSyncUser deletePermission:callback:]` | -| `-[RLMSyncUser permissionRealmWithError:]` | `-[RLMSyncUser retrievePermissionsWithCallback:]` | -| `RLMSyncPermissionOffer` | `-[RLMSyncUser createOfferForRealmAtURL:accessLevel:expiration:callback:]` | -| `RLMSyncPermissionOfferResponse` | `-[RLMSyncUser acceptOfferForToken:callback:]` | -| `-[NSError rlmSync_clientResetBlock]` | `-[NSError rlmSync_errorActionToken]` / `-[NSError rlmSync_clientResetBackedUpRealmPath]` | -| `-[NSError rlmSync_deleteRealmBlock]` | `-[NSError rlmSync_errorActionToken]` | - -### Enhancements -* `List` can now contain values of types `Bool`, `Int`, `Int8`, `Int16`, - `Int32`, `Int64`, `Float`, `Double`, `String`, `Data`, and `Date` (and - optional versions of all of these) in addition to `Object` subclasses. - Querying `List`s containing values other than `Object` subclasses is not yet - implemented. -* `RLMArray` can now be constrained with the protocols `RLMBool`, `RLMInt`, - `RLMFloat`, `RLMDouble`, `RLMString`, `RLMData`, and `RLMDate` in addition to - protocols defined with `RLM_ARRAY_TYPE`. By default `RLMArray`s of - non-`RLMObject` types can contain null. Indicating that the property is - required (by overriding `+requiredProperties:`) will instead make the values - within the array required. Querying `RLMArray`s containing values other than - `RLMObject` subclasses is not yet implemented. -* Add a new error code to denote 'permission denied' errors when working - with synchronized Realms, as well as an accompanying block that can be - called to inform the binding that the offending Realm's files should be - deleted immediately. This allows recovering from 'permission denied' - errors in a more robust manner. See the documentation for - `RLMSyncErrorPermissionDeniedError` for more information. -* Add Swift `Object.isSameObject(as:_)` API to perform the same function as - the existing Objective-C API `-[RLMObject isEqualToObject:]`. -* Opening a synced Realm whose local copy was created with an older version of - Realm Mobile Platfrom when a migration is not possible to the current version - will result in an `RLMErrorIncompatibleSyncedFile` / `incompatibleSyncedFile` - error. When such an error occurs, the original file is moved to a backup - location, and future attempts to open the synchronized Realm will result in a new - file being created. If you wish to migrate any data from the backup Realm you can - open it using the backup Realm configuration available on the error object. -* Add a preview of partial synchronization. Partial synchronization allows a - synchronized Realm to be opened in such a way that only objects requested by - the user are synchronized to the device. You can use it by setting the - `isPartial` property on a `SyncConfiguration`, opening the Realm, and then - calling `Realm.subscribe(to:where:callback:)` with the type of object you're - interested in, a string containing a query determining which objects you want - to subscribe to, and a callback which will report the results. You may add as - many subscriptions to a synced Realm as necessary. - -### Bugfixes -* Realm no longer throws an "unsupported instruction" exception in some cases - when opening a synced Realm asynchronously. -* Realm Swift APIs that filter or look up the index of an object based on a - format string now properly handle optional arguments in their variadic argument - list. -* `-[RLMResults indexOfObject:]` now properly accounts for access - level. -* Fix a race condition that could lead to a crash accessing to the freed configuration object - if a default configuration was set from a different thread. -* Fixed an issue that crash when enumerating after clearing data during migration. -* Fix a bug where a synced Realm couldn't be reopened even after a successful client reset - in some cases. -* Fix a bug where the sync subsystem waited too long in certain cases to reconnect to the server. -* Fix a bug where encrypted sync-related metadata was incorrectly deleted from upgrading users, - resulting in all users being logged out. -* Fix a bug where permission-related data continued to be synced to a client even after the user - that data belonged to logged out. -* Fix an issue where collection notifications might be delivered inconsistently if a notification - callback was added within another callback for the same collection. - -3.0.0-rc.2 Release notes (2017-10-14) -============================================================= - -### Enhancements -* Reinstate `RLMSyncPermissionSortPropertyUserID` to allow users to sort permissions - to their own Realms they've granted to others. - -### Bugfixes -* `-[RLMResults indexOfObject:]` now properly accounts for access - level. -* Fix a race condition that could lead to a crash accessing to the freed configuration object - if a default configuration was set from a different thread. -* Fixed an issue that crash when enumerating after clearing data during migration. -* Fix a bug where a synced Realm couldn't be reopened even after a successful client reset - in some cases. -* Fix a bug where the sync subsystem waited too long in certain cases to reconnect to the server. -* Fix a bug where encrypted sync-related metadata was incorrectly deleted from upgrading users, - resulting in all users being logged out. -* Fix a bug where permission-related data continued to be synced to a client even after the user - that data belonged to logged out. -* Fix an issue where collection notifications might be delivered inconsistently if a notification - callback was added within another callback for the same collection. - -3.0.0-rc.1 Release notes (2017-10-03) -============================================================= - -### Breaking Changes -* Remove `RLMSyncPermissionSortPropertyUserID` to reflect changes in how the - Realm Object Server reports permissions for a user. -* Remove `RLMSyncPermissionOffer` and `RLMSyncPermissionOfferResponse` classes - and associated helper methods and functions. Use the - `-[RLMSyncUser createOfferForRealmAtURL:accessLevel:expiration:callback:]` - and `-[RLMSyncUser acceptOfferForToken:callback:]` methods instead. - -### Bugfixes - -* The keychain item name used by Realm to manage the encryption keys for - sync-related metadata is now set to a per-app name based on the bundle - identifier. Keys that were previously stored within the single, shared Realm - keychain item will be transparently migrated to the per-application keychain - item. -* Fix downloading of the Realm core binaries when Xcode's command-line tools are - set as the active developer directory for command-line interactions. -* Fix a crash that could occur when resolving a ThreadSafeReference to a `List` - whose parent object had since been deleted. - -3.0.0-beta.4 Release notes (2017-09-22) -============================================================= - -### Breaking Changes - -* Rename `List.remove(objectAtIndex:)` to `List.remove(at:)` to match the name - used by 'RangeReplaceableCollection'. -* Rename `List.swap()` to `List.swapAt()` to match the name used by 'Array'. -* Loosen `RLMArray` and `RLMResults`'s generic constraint from `RLMObject` to - `NSObject`. This may result in having to add some casts to disambiguate - types. -* Remove `RLMPropertyTypeArray` in favor of a separate bool `array` property on - `RLMProperty`/`Property`. -* Remove `RLMSyncPermissionResults`. `RLMSyncPermission`s are now vended out - using a `RLMResults`. This results collection supports all normal collection - operations except for setting values using KVO (since `RLMSyncPermission`s are - immutable) and the property aggregation operations. -* `RealmCollection`'s associated type `Element` has been renamed `ElementType`. -* Realm Swift collection types (`List`, `Results`, `AnyRealmCollection`, and - `LinkingObjects` have had their generic type parameter changed from `T` to - `Element`). -* `RealmOptional`'s generic type parameter has been changed from `T` to `Value`. -* `RLMSyncUserInfo` has been significantly enhanced. It now contains metadata - about a user stored on the Realm Object Server, as well as a list of all user account - data associated with that user. -* Starting with Swift 4, `List` now conforms to `MutableCollection` instead of - `RangeReplaceableCollection`. For Swift 4, the empty collection initializer has been - removed, and default implementations of range replaceable collection methods that - make sense for `List` have been added. -* `List.removeLast()` now throws an exception if the list is empty, to more closely match - the behavior of the standard library's `Collection.removeLast()` implementation. - -### Enhancements - -* `List` can now contain values of types `Bool`, `Int`, `Int8`, `Int16`, - `Int32`, `Int64`, `Float`, `Double`, `String`, `Data`, and `Date` (and - optional versions of all of these) in addition to `Object` subclasses. - Querying `List`s containing values other than `Object` subclasses is not yet - implemented. -* `RLMArray` can now be constrained with the protocols `RLMBool`, `RLMInt`, - `RLMFloat`, `RLMDouble`, `RLMString`, `RLMData`, and `RLMDate` in addition to - protocols defined with `RLM_ARRAY_TYPE`. By default `RLMArray`s of - non-`RLMObject` types can contain null. Indicating that the property is - required (by overriding `+requiredProperties:`) will instead make the values - within the array required. Querying `RLMArray`s containing values other than - `RLMObject` subclasses is not yet implemented. -* Opening a synced Realm whose local copy was created with an older version of - Realm Mobile Platfrom when a migration is not possible to the current version - will result in an `RLMErrorIncompatibleSyncedFile` / `incompatibleSyncedFile` - error. When such an error occurs, the original file is moved to a backup - location, and future attempts to open the synchronized Realm will result in a new - file being created. If you wish to migrate any data from the backup Realm you can - open it using the backup Realm configuration available on the error object. -* Add preview support for partial synchronization. Partial synchronization is - allows a synchronized Realm to be opened in such a way that only objects - requested by the user are synchronized to the device. You can use it by setting - the `isPartial` property on a `SyncConfiguration`, opening the Realm, and then - calling `Realm.subscribe(to:where:callback:)` with the type of object you're - interested in, a string containing a query determining which objects you want - to subscribe to, and a callback which will report the results. You may add as - many subscriptions to a synced Realm as necessary. - -### Bugfixes - -* Realm Swift APIs that filter or look up the index of an object based on a - format string now properly handle optional arguments in their variadic argument - list. - -3.0.0-beta.3 Release notes (2017-08-23) -============================================================= - -### Breaking Changes - -* iOS 7 is no longer supported. -* Computed properties on Realm object types are detected and no - longer added to the automatically generated schema. -* `-[RLMRealm addOrUpdateObjectsInArray:]` has been renamed to - `-[RLMRealm addOrUpdateObjects:]` for consistency with similar methods - that add or delete objects. -* `-[RLMRealm addOrUpdateObjects:]` and `-[RLMRealm deleteObjects:]` now - require their argument to conform to `NSFastEnumeration`, to match similar - APIs that also take collections. -* Remove deprecated `{RLM}SyncPermission` and `{RLM}SyncPermissionChange` - classes. -* `{RLM}SyncPermissionValue` has been renamed to just `{RLM}SyncPermission`. - Its `userId` property has been renamed `identity`, and its - `-initWithRealmPath:userID:accessLevel:` initializer has been renamed - `-initWithRealmPath:identity:accessLevel:`. -* Remove deprecated `-[RLMSyncUser permissionRealmWithError:]` and - `SyncUser.permissionRealm()` APIs. Use the new permissions system. -* Remove deprecated error `RLMSyncErrorBadResponse`. Use - `RLMSyncAuthErrorBadResponse` instead. -* The way interactive sync errors (client reset and permission denied) - are delivered to the user has been changed. Instead of a block which can - be invoked to immediately delete the offending Realm file, an opaque - token object of type `RLMSyncErrorActionToken` will be returned in the - error object's `userInfo` dictionary. This error object can be passed - into the new `+[RLMSyncSession immediatelyHandleError:]` API to delete - the files. -* Remove `-[NSError rlmSync_clientResetBlock]` and - `-[NSError rlmSync_deleteRealmBlock]` APIs. -* The return types of the `SyncError.clientResetInfo()` and - `SyncError.deleteRealmUserInfo()` APIs have been changed. They now return - `RLMSyncErrorActionToken`s or `SyncError.ActionToken`s instead of closures. -* The (erroneously added) instance property `Object.className` has been - removed. -* The class methods `Object.className()`, `Object.objectUtilClass()`, and - the property `Object.isInvalidated` can no longer be overriden. -* The callback which runs when a sync user login succeeds or fails - now runs on the main queue by default, or can be explicitly specified - by a new `callbackQueue` parameter on the `{RLM}SyncUser.logIn(...)` API. -* Rename `{RLM}NotificationToken.stop()` to `invalidate()` and - `{RealmCollection,SyncPermissionResults}.addNotificationBlock(_:)` to - `observe(_:)` to mirror Foundation's new KVO APIs. -* The `RLMSyncProgress` enum has been renamed `RLMSyncProgressMode`. -* Remove deprecated `{RLM}SyncManager.disableSSLValidation` property. Disable - SSL validation on a per-Realm basis by setting the `enableSSLValidation` - property on `{RLM}SyncConfiguration` instead. -* Fix empty strings, binary data, and null on the right side of `BEGINSWITH`, - `ENDSWITH` and `CONTAINS` operators in predicates to match Foundation's - semantics of never matching any strings or data. -* Swift `Object` comparison and hashing behavior now works the same way as - that of `RLMObject` (objects are now only considered equatable if their - model class defines a primary key). -* Fix the way the hash property works on `Object` when the object model has - no primary key. -* Fix an issue where if a Swift model class defined non-generic managed - properties after generic Realm properties (like `List`), the schema - would be constructed incorrectly. Fixes an issue where creating such - models from an array could fail. - -### Enhancements - -* Add Swift `Object.isSameObject(as:_)` API to perform the same function as - the existing Objective-C API `-[RLMObject isEqualToObject:]`. -* Expose additional authentication-related errors that might be reported by - a Realm Object Server. -* An error handler can now be registered on `{RLM}SyncUser`s in order to - report authentication-related errors that affect the user. - -### Bugfixes - -* Sync users are now automatically logged out upon receiving certain types - of errors that indicate they are no longer logged into the server. For - example, users who are authenticated using third-party credentials will find - themselves logged out of the Realm Object Server if the third-party identity - service indicates that their credential is no longer valid. -* Address high CPU usage and hangs in certain cases when processing collection - notifications in highly-connected object graphs. - -3.0.0-beta.2 Release notes (2017-07-26) -============================================================= - -### Breaking Changes - -* Remove the following deprecated Objective-C APIs: - `-[RLMArray sortedResultsUsingProperty:ascending:]`, - `-[RLMCollection sortedResultsUsingProperty:ascending:]`, - `-[RLMResults sortedResultsUsingProperty:ascending:]`, - `+[RLMSortDescriptor sortDescriptorWithProperty:ascending:]`, - `RLMSortDescriptor.property`. - These APIs have been superseded by equivalent APIs that take - or return key paths instead of property names. -* Remove the following deprecated Objective-C API: - `+[RLMRealm migrateRealm:configuration:]`. - Please use `+[RLMRealm performMigrationForConfiguration:error:]` instead. -* Remove the following deprecated Swift APIs: - `AnyRealmCollection.sorted(byProperty:, ascending:)`, - `LinkingObjects.sorted(byProperty:, ascending:)`, - `List.sorted(byProperty:, ascending:)`, - `Results.sorted(byProperty:, ascending:)`, - `SortDescriptor.init(property:, ascending:)`, - `SortDescriptor.property`. - These APIs have been superseded by equivalent APIs that take - or return key paths instead of property names. -* The Objective-C and Swift `create(_:, value: update:)` APIs now - correctly nil out nullable properties when updating an existing - object when the `value` argument specifies nil or `NSNull` for - the property value. - -### Enhancements - -* It is now possible to create and log in multiple Realm Object Server users - with the same identity if they originate from different servers. Note that - if the URLs are different aliases for the same authentication server each - user will still be treated as separate (e.g. they will have their own copy - of each synchronized Realm opened using them). It is highly encouraged that - users defined using the access token credential type be logged in with an - authentication server URL specified; this parameter will become mandatory - in a future version of the SDK. -* Add `-[RLMSyncUser retrieveInfoForUser:identityProvider:completion:]` - API allowing administrator users to retrieve information about a user based - on their provider identity (for example, a username). Requires any edition - of the Realm Object Server 1.8.2 or later. - -### Bugfixes - -* Realm no longer throws an "unsupported instruction" exception in some cases - when opening a synced Realm asynchronously. - -3.0.0-beta Release notes (2017-07-14) -============================================================= - -### Breaking Changes - -* Synchronized Realms require a server running Realm Object Server v2.0 or higher. - -### Enhancements - -* Add a new error code to denote 'permission denied' errors when working - with synchronized Realms, as well as an accompanying block that can be - called to inform the binding that the offending Realm's files should be - deleted immediately. This allows recovering from 'permission denied' - errors in a more robust manner. See the documentation for - `RLMSyncErrorPermissionDeniedError` for more information. -* Add `-[RLMSyncPermissionValue initWithRealmPath:username:accessLevel:]` - API allowing permissions to be applied to a user based on their username - (usually, an email address). Requires any edition of the Realm Object - Server 1.6.0 or later. -* Improve performance of creating Swift objects which contain at least one List - property. - -### Bugfixes - -* `List.description` now reports the correct types for nested lists. -* Fix unmanaged object initialization when a nested property type returned - `false` from `Object.shouldIncludeInDefaultSchema()`. -* Don't clear RLMArrays on self-assignment. - -2.10.2 Release notes (2017-09-27) -============================================================= - -### Bugfixes - -* The keychain item name used by Realm to manage the encryption keys for - sync-related metadata is now set to a per-app name based on the bundle - identifier. Keys that were previously stored within the single, shared Realm - keychain item will be transparently migrated to the per-application keychain - item. -* Fix downloading of the Realm core binaries when Xcode's command-line tools are - set as the active developer directory for command-line interactions. -* Fix a crash that could occur when resolving a ThreadSafeReference to a `List` - whose parent object had since been deleted. - -2.10.1 Release notes (2017-09-14) -============================================================= - -Swift binaries are now produced for Swift 3.0, 3.0.1, 3.0.2, 3.1, 3.2 and 4.0. - -### Enhancements - -* Auxiliary files are excluded from backup by default. - -### Bugfixes - -* Fix more cases where assigning an RLMArray property to itself would clear the - RLMArray. - -2.10.0 Release notes (2017-08-21) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Expose additional authentication-related errors that might be reported by - a Realm Object Server. -* An error handler can now be registered on `{RLM}SyncUser`s in order to - report authentication-related errors that affect the user. - -### Bugfixes - -* Sorting Realm collection types no longer throws an exception on iOS 7. -* Sync users are now automatically logged out upon receiving certain types - of errors that indicate they are no longer logged into the server. For - example, users who are authenticated using third-party credentials will find - themselves logged out of the Realm Object Server if the third-party identity - service indicates that their credential is no longer valid. -* Address high CPU usage and hangs in certain cases when processing collection - notifications in highly-connected object graphs. - -2.9.1 Release notes (2017-08-01) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* The `shouldCompactOnLaunch` block is no longer invoked if the Realm at that - path is already open on other threads. -* Fix an assertion failure in collection notifications when changes are made to - the schema via sync while the notification block is active. - -2.9.0 Release notes (2017-07-26) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Add a new error code to denote 'permission denied' errors when working - with synchronized Realms, as well as an accompanying block that can be - called to inform the binding that the offending Realm's files should be - deleted immediately. This allows recovering from 'permission denied' - errors in a more robust manner. See the documentation for - `RLMSyncErrorPermissionDeniedError` for more information. -* Add `-[RLMSyncPermissionValue initWithRealmPath:username:accessLevel:]` - API allowing permissions to be applied to a user based on their username - (usually, an email address). Requires any edition of the Realm Object - Server 1.6.0 or later. -* Improve performance of creating Swift objects which contain at least one List - property. -* It is now possible to create and log in multiple Realm Object Server users - with the same identity if they originate from different servers. Note that - if the URLs are different aliases for the same authentication server each - user will still be treated as separate (e.g. they will have their own copy - of each synchronized Realm opened using them). It is highly encouraged that - users defined using the access token credential type be logged in with an - authentication server URL specified; this parameter will become mandatory - in a future version of the SDK. -* Add `-[RLMSyncUser retrieveInfoForUser:identityProvider:completion:]` - API allowing administrator users to retrieve information about a user based - on their provider identity (for example, a username). Requires any edition - of the Realm Object Server 1.8.2 or later. - -### Bugfixes - -* `List.description` now reports the correct types for nested lists. -* Fix unmanaged object initialization when a nested property type returned - `false` from `Object.shouldIncludeInDefaultSchema()`. -* Don't clear RLMArrays on self-assignment. - -2.8.3 Release notes (2017-06-20) -============================================================= - -### Bugfixes - -* Properly update RealmOptional properties when adding an object with `add(update: true)`. -* Add some missing quotes in error messages. -* Fix a performance regression when creating objects with primary keys. - -2.8.2 Release notes (2017-06-16) -============================================================= - -### Bugfixes - -* Fix an issue where synchronized Realms would eventually disconnect from the - remote server if the user object used to define their sync configuration - was destroyed. -* Restore support for changing primary keys in migrations (broken in 2.8.0). -* Revert handling of adding objects with nil properties to a Realm to the - pre-2.8.0 behavior. - -2.8.1 Release notes (2017-06-12) -============================================================= - -Add support for building with Xcode 9 Beta 1. - -### Bugfixes - -* Fix setting a float property to NaN. -* Fix a crash when using compact on launch in combination with collection - notifications. - -2.8.0 Release notes (2017-06-02) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Enable encryption on watchOS. -* Add `-[RLMSyncUser changePassword:forUserID:completion:]` API to change an - arbitrary user's password if the current user has administrative privileges - and using Realm's 'password' authentication provider. - Requires any edition of the Realm Object Server 1.6.0 or later. - -### Bugfixes - -* Suppress `-Wdocumentation` warnings in Realm C++ headers when using CocoaPods - with Xcode 8.3.2. -* Throw an appropriate error rather than crashing when an RLMArray is assigned - to an RLMArray property of a different type. -* Fix crash in large (>4GB) encrypted Realm files. -* Improve accuracy of sync progress notifications. -* Fix an issue where synchronized Realms did not connect to the remote server - in certain situations, such as when an application was offline when the Realms - were opened but later regained network connectivity. - -2.7.0 Release notes (2017-05-03) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Use reachability API to minimize the reconnection delay if the network - connection was lost. -* Add `-[RLMSyncUser changePassword:completion:]` API to change the current - user's password if using Realm's 'password' authentication provider. - Requires any edition of the Realm Object Server 1.4.0 or later. -* `{RLM}SyncConfiguration` now has an `enableSSLValidation` property - (and default parameter in the Swift initializer) to allow SSL validation - to be specified on a per-server basis. -* Transactions between a synced Realm and a Realm Object Server can now - exceed 16 MB in size. -* Add new APIs for changing and retrieving permissions for synchronized Realms. - These APIs are intended to replace the existing Realm Object-based permissions - system. Requires any edition of the Realm Object Server 1.1.0 or later. - -### Bugfixes - -* Support Realm model classes defined in Swift with overridden Objective-C - names (e.g. `@objc(Foo) class SwiftFoo: Object {}`). -* Fix `-[RLMMigration enumerateObjects:block:]` returning incorrect `oldObject` - objects when enumerating a class name after previously deleting a `newObject`. -* Fix an issue where `Realm.asyncOpen(...)` would fail to work when opening a - synchronized Realm for which the user only had read permissions. -* Using KVC to set a `List` property to `nil` now clears it to match the - behavior of `RLMArray` properties. -* Fix crash from `!m_awaiting_pong` assertion failure when using synced Realms. -* Fix poor performance or hangs when performing case-insensitive queries on - indexed string properties that contain many characters that don't differ - between upper and lower case (e.g., numbers, punctuation). - -2.6.2 Release notes (2017-04-21) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix an issue where calling `Realm.asyncOpen(...)` with a synchronized Realm - configuration would fail with an "Operation canceled" error. -* Fix initial collection notification sometimes not being delivered for synced - Realms. -* Fix circular links sometimes resulting in objects not being marked as - modified in change notifications. - -2.6.1 Release notes (2017-04-18) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix an issue where calling `Realm.asyncOpen(...)` with a synchronized Realm - configuration would crash in error cases rather than report the error. - This is a small source breaking change if you were relying on the error - being reported to be a `Realm.Error`. - -2.6.0 Release notes (2017-04-18) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Add a `{RLM}SyncUser.isAdmin` property indicating whether a user is a Realm - Object Server administrator. -* Add an API to asynchronously open a Realm and deliver it to a block on a - given queue. This performs all work needed to get the Realm to - a usable state (such as running potentially time-consuming migrations) on a - background thread before dispatching to the given queue. In addition, - synchronized Realms wait for all remote content available at the time the - operation began to be downloaded and available locally. -* Add `shouldCompactOnLaunch` block property when configuring a Realm to - determine if it should be compacted before being returned. -* Speed up case-insensitive queries on indexed string properties. -* Add RLMResults's collection aggregate methods to RLMArray. -* Add support for calling the aggregate methods on unmanaged Lists. - -### Bugfixes - -* Fix a deadlock when multiple processes open a Realm at the same time. -* Fix `value(forKey:)`/`value(forKeyPath:)` returning incorrect values for `List` properties. - -2.5.1 Release notes (2017-04-05) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix CocoaPods installation with static libraries and multiple platforms. -* Fix uncaught "Bad version number" exceptions on the notification worker thread - followed by deadlocks when Realms refresh. - -2.5.0 Release notes (2017-03-28) -============================================================= - -Files written by Realm this version cannot be read by earlier versions of Realm. -Old files can still be opened and files open in read-only mode will not be -modified. - -If using synchronized Realms, the Realm Object Server must be running version -1.3.0 or later. - -Swift binaries are now produced for Swift 3.0, 3.0.1, 3.0.2 and 3.1. - -### API Breaking Changes - -* None. - -### Enhancements - -* Add support for multi-level object equality comparisons against `NULL`. -* Add support for the `[d]` modifier on string comparison operators to perform - diacritic-insensitive comparisons. -* Explicitly mark `[[RLMRealm alloc] init]` as unavailable. -* Include the name of the problematic class in the error message when an - invalid property type is marked as the primary key. - -### Bugfixes - -* Fix incorrect column type assertions which could occur after schemas were - merged by sync. -* Eliminate an empty write transaction when opening a synced Realm. -* Support encrypting synchronized Realms by respecting the `encryptionKey` value - of the Realm's configuration. -* Fix crash when setting an `{NS}Data` property close to 16MB. -* Fix for reading `{NS}Data` properties incorrectly returning `nil`. -* Reduce file size growth in cases where Realm versions were pinned while - starting write transactions. -* Fix an assertion failure when writing to large `RLMArray`/`List` properties. -* Fix uncaught `BadTransactLog` exceptions when pulling invalid changesets from - synchronized Realms. -* Fix an assertion failure when an observed `RLMArray`/`List` is deleted after - being modified. - -2.4.4 Release notes (2017-03-13) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Add `(RLM)SyncPermission` class to allow reviewing access permissions for - Realms. Requires any edition of the Realm Object Server 1.1.0 or later. -* Further reduce the number of files opened per thread-specific Realm on macOS, - iOS and watchOS. - -### Bugfixes - -* Fix a crash that could occur if new Realm instances were created while the - application was exiting. -* Fix a bug that could lead to bad version number errors when delivering - change notifications. -* Fix a potential use-after-free bug when checking validity of results. -* Fix an issue where a sync session might not close properly if it receives - an error while being torn down. -* Fix some issues where a sync session might not reconnect to the server properly - or get into an inconsistent state if revived after invalidation. -* Fix an issue where notifications might not fire when the children of an - observed object are changed. -* Fix an issue where progress notifications on sync sessions might incorrectly - report out-of-date values. -* Fix an issue where multiple threads accessing encrypted data could result in - corrupted data or crashes. -* Fix an issue where certain `LIKE` queries could hang. -* Fix an issue where `-[RLMRealm writeCopyToURL:encryptionKey:error]` could create - a corrupt Realm file. -* Fix an issue where incrementing a synced Realm's schema version without actually - changing the schema could cause a crash. - -2.4.3 Release notes (2017-02-20) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Avoid copying copy-on-write data structures, which can grow the file, when the - write does not actually change existing values. -* Improve performance of deleting all objects in an RLMResults. -* Reduce the number of files opened per thread-specific Realm on macOS. -* Improve startup performance with large numbers of `RLMObject`/`Object` - subclasses. - -### Bugfixes - -* Fix synchronized Realms not downloading remote changes when an access token - expires and there are no local changes to upload. -* Fix an issue where values set on a Realm object using `setValue(value:, forKey:)` - that were not themselves Realm objects were not properly converted into Realm - objects or checked for validity. -* Fix an issue where `-[RLMSyncUser sessionForURL:]` could erroneously return a - non-nil value when passed in an invalid URL. -* `SyncSession.Progress.fractionTransferred` now returns 1 if there are no - transferrable bytes. -* Fix sync progress notifications registered on background threads by always - dispatching on a dedicated background queue. -* Fix compilation issues with Xcode 8.3 beta 2. -* Fix incorrect sync progress notification values for Realms originally created - using a version of Realm prior to 2.3.0. -* Fix LLDB integration to be able to display summaries of `RLMResults` once more. -* Reject Swift properties with names which cause them to fall in to ARC method - families rather than crashing when they are accessed. -* Fix sorting by key path when the declared property order doesn't match the order - of properties in the Realm file, which can happen when properties are added in - different schema versions. - -2.4.2 Release notes (2017-01-30) -============================================================= - -### Bugfixes - -* Fix an issue where RLMRealm instances could end up in the autorelease pool - for other threads. - -2.4.1 Release notes (2017-01-27) -============================================================= - -### Bugfixes - -* Fix an issue where authentication tokens were not properly refreshed - automatically before expiring. - -2.4.0 Release notes (2017-01-26) -============================================================= - -This release drops support for compiling with Swift 2.x. -Swift 3.0.0 is now the minimum Swift version supported. - -### API Breaking Changes - -* None. - -### Enhancements - -* Add change notifications for individual objects with an API similar to that - of collection notifications. - -### Bugfixes - -* Fix Realm Objective-C compilation errors with Xcode 8.3 beta 1. -* Fix several error handling issues when renewing expired authentication - tokens for synchronized Realms. -* Fix a race condition leading to bad_version exceptions being thrown in - Realm's background worker thread. - -2.3.0 Release notes (2017-01-19) -============================================================= - -### Sync Breaking Changes - -* Make `PermissionChange`'s `id` property a primary key. - -### API Breaking Changes - -* None. - -### Enhancements - -* Add `SyncPermissionOffer` and `SyncPermissionOfferResponse` classes to allow - creating and accepting permission change events to synchronized Realms between - different users. -* Support monitoring sync transfer progress by registering notification blocks - on `SyncSession`. Specify the transfer direction (`.upload`/`.download`) and - mode (`.reportIndefinitely`/`.forCurrentlyOutstandingWork`) to monitor. - -### Bugfixes - -* Fix a call to `commitWrite(withoutNotifying:)` committing a transaction that - would not have triggered a notification incorrectly skipping the next - notification. -* Fix incorrect results and crashes when conflicting object insertions are - merged by the synchronization mechanism when there is a collection - notification registered for that object type. - -2.2.0 Release notes (2017-01-12) -============================================================= - -### Sync Breaking Changes (In Beta) - -* Sync-related error reporting behavior has been changed. Errors not related - to a particular user or session are only reported if they are classed as - 'fatal' by the underlying sync engine. -* Added `RLMSyncErrorClientResetError` to `RLMSyncError` enum. - -### API Breaking Changes - -* The following Objective-C APIs have been deprecated in favor of newer or preferred versions: - -| Deprecated API | New API | -|:------------------------------------------------------------|:------------------------------------------------------------| -| `-[RLMArray sortedResultsUsingProperty:]` | `-[RLMArray sortedResultsUsingKeyPath:]` | -| `-[RLMCollection sortedResultsUsingProperty:]` | `-[RLMCollection sortedResultsUsingKeyPath:]` | -| `-[RLMResults sortedResultsUsingProperty:]` | `-[RLMResults sortedResultsUsingKeyPath:]` | -| `+[RLMSortDescriptor sortDescriptorWithProperty:ascending]` | `+[RLMSortDescriptor sortDescriptorWithKeyPath:ascending:]` | -| `RLMSortDescriptor.property` | `RLMSortDescriptor.keyPath` | - -* The following Swift APIs have been deprecated in favor of newer or preferred versions: - -| Deprecated API | New API | -|:------------------------------------------------------|:-------------------------------------------------| -| `LinkingObjects.sorted(byProperty:ascending:)` | `LinkingObjects.sorted(byKeyPath:ascending:)` | -| `List.sorted(byProperty:ascending:)` | `List.sorted(byKeyPath:ascending:)` | -| `RealmCollection.sorted(byProperty:ascending:)` | `RealmCollection.sorted(byKeyPath:ascending:)` | -| `Results.sorted(byProperty:ascending:)` | `Results.sorted(byKeyPath:ascending:)` | -| `SortDescriptor(property:ascending:)` | `SortDescriptor(keyPath:ascending:)` | -| `SortDescriptor.property` | `SortDescriptor.keyPath` | - -### Enhancements - -* Introduce APIs for safely passing objects between threads. Create a - thread-safe reference to a thread-confined object by passing it to the - `+[RLMThreadSafeReference referenceWithThreadConfined:]`/`ThreadSafeReference(to:)` - constructor, which you can then safely pass to another thread to resolve in - the new Realm with `-[RLMRealm resolveThreadSafeReference:]`/`Realm.resolve(_:)`. -* Realm collections can now be sorted by properties over to-one relationships. -* Optimized `CONTAINS` queries to use Boyer-Moore algorithm - (around 10x speedup on large datasets). - -### Bugfixes - -* Setting `deleteRealmIfMigrationNeeded` now also deletes the Realm if a file - format migration is required, such as when moving from a file last accessed - with Realm 0.x to 1.x, or 1.x to 2.x. -* Fix queries containing nested `SUBQUERY` expressions. -* Fix spurious incorrect thread exceptions when a thread id happens to be - reused while an RLMRealm instance from the old thread still exists. -* Fixed various bugs in aggregate methods (max, min, avg, sum). - -2.1.2 Release notes (2016--12-19) -============================================================= - -This release adds binary versions of Swift 3.0.2 frameworks built with Xcode 8.2. - -### Sync Breaking Changes (In Beta) - -* Rename occurences of "iCloud" with "CloudKit" in APIs and comments to match - naming in the Realm Object Server. - -### API Breaking Changes - -* None. - -### Enhancements - -* Add support for 'LIKE' queries (wildcard matching). - -### Bugfixes - -* Fix authenticating with CloudKit. -* Fix linker warning about "Direct access to global weak symbol". - -2.1.1 Release notes (2016-12-02) -============================================================= - -### Enhancements - -* Add `RealmSwift.ObjectiveCSupport.convert(object:)` methods to help write - code that interoperates between Realm Objective-C and Realm Swift APIs. -* Throw exceptions when opening a Realm with an incorrect configuration, like: - * `readOnly` set with a sync configuration. - * `readOnly` set with a migration block. - * migration block set with a sync configuration. -* Greatly improve performance of write transactions which make a large number of - changes to indexed properties, including the automatic migration when opening - files written by Realm 1.x. - -### Bugfixes - -* Reset sync metadata Realm in case of decryption error. -* Fix issue preventing using synchronized Realms in Xcode Playgrounds. -* Fix assertion failure when migrating a model property from object type to - `RLMLinkingObjects` type. -* Fix a `LogicError: Bad version number` exception when using `RLMResults` with - no notification blocks and explicitly called `-[RLMRealm refresh]` from that - thread. -* Logged-out users are no longer returned from `+[RLMSyncUser currentUser]` or - `+[RLMSyncUser allUsers]`. -* Fix several issues which could occur when the 1001st object of a given type - was created or added to an RLMArray/List, including crashes when rerunning - existing queries and possibly data corruption. -* Fix a potential crash when the application exits due to a race condition in - the destruction of global static variables. -* Fix race conditions when waiting for sync uploads or downloads to complete - which could result in crashes or the callback being called too early. - -2.1.0 Release notes (2016-11-18) -============================================================= - -### Sync Breaking Changes (In Beta) - -* None. - -### API breaking changes - -* None. - -### Enhancements - -* Add the ability to skip calling specific notification blocks when committing - a write transaction. - -### Bugfixes - -* Deliver collection notifications when beginning a write transaction which - advances the read version of a Realm (previously only Realm-level - notifications were sent). -* Fix some scenarios which would lead to inconsistent states when using - collection notifications. -* Fix several race conditions in the notification functionality. -* Don't send Realm change notifications when canceling a write transaction. - -2.0.4 Release notes (2016-11-14) -============================================================= - -### Sync Breaking Changes (In Beta) - -* Remove `RLMAuthenticationActions` and replace - `+[RLMSyncCredential credentialWithUsername:password:actions:]` with - `+[RLMSyncCredential credentialsWithUsername:password:register:]`. -* Rename `+[RLMSyncUser authenticateWithCredential:]` to - `+[RLMSyncUser logInWithCredentials:]`. -* Rename "credential"-related types and methods to - `RLMSyncCredentials`/`SyncCredentials` and consistently refer to credentials - in the plural form. -* Change `+[RLMSyncUser all]` to return a dictionary of identifiers to users and - rename to: - * `+[RLMSyncUser allUsers]` in Objective-C. - * `SyncUser.allUsers()` in Swift 2. - * `SyncUser.all` in Swift 3. -* Rename `SyncManager.sharedManager()` to `SyncManager.shared` in Swift 3. -* Change `Realm.Configuration.syncConfiguration` to take a `SyncConfiguration` - struct rather than a named tuple. -* `+[RLMSyncUser logInWithCredentials:]` now invokes its callback block on a - background queue. - -### API breaking changes - -* None. - -### Enhancements - -* Add `+[RLMSyncUser currentUser]`. -* Add the ability to change read, write and management permissions for - synchronized Realms using the management Realm obtained via the - `-[RLMSyncUser managementRealmWithError:]` API and the - `RLMSyncPermissionChange` class. - -### Bugfixes - -* None. - -2.0.3 Release notes (2016-10-27) -============================================================= - -This release adds binary versions of Swift 3.0.1 frameworks built with Xcode 8.1 -GM seed. - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix a `BadVersion` exception caused by a race condition when delivering - collection change notifications. -* Fix an assertion failure when additional model classes are added and - `deleteRealmIfMigrationNeeded` is enabled. -* Fix a `BadTransactLog` exception when deleting an `RLMResults` in a synced - Realm. -* Fix an assertion failure when a write transaction is in progress at the point - of process termination. -* Fix a crash that could occur when working with a `RLMLinkingObject` property - of an unmanaged object. - -2.0.2 Release notes (2016-10-05) -============================================================= - -This release is not protocol-compatible with previous version of the Realm -Mobile Platform. - -### API breaking changes - -* Rename Realm Swift's `User` to `SyncUser` to make clear that it relates to the - Realm Mobile Platform, and to avoid potential conflicts with other `User` types. - -### Bugfixes - -* Fix Realm headers to be compatible with pre-C++11 dialects of Objective-C++. -* Fix incorrect merging of RLMArray/List changes when objects with the same - primary key are created on multiple devices. -* Fix bad transaction log errors after deleting objects on a different device. -* Fix a BadVersion error when a background worker finishes running while older - results from that worker are being delivered to a different thread. - -2.0.1 Release notes (2016-09-29) -============================================================= - -### Bugfixes - -* Fix an assertion failure when opening a Realm file written by a 1.x version - of Realm which has an indexed nullable int or bool property. - -2.0.0 Release notes (2016-09-27) -============================================================= - -This release introduces support for the Realm Mobile Platform! -See for an overview -of these great new features. - -### API breaking changes - -* By popular demand, `RealmSwift.Error` has been moved from the top-level - namespace into a `Realm` extension and is now `Realm.Error`, so that it no - longer conflicts with `Swift.Error`. -* Files written by Realm 2.0 cannot be read by 1.x or earlier versions. Old - files can still be opened. - -### Enhancements - -* The .log, .log_a and .log_b files no longer exist and the state tracked in - them has been moved to the main Realm file. This reduces the number of open - files needed by Realm, improves performance of both opening and writing to - Realms, and eliminates a small window where committing write transactions - would prevent other processes from opening the file. - -### Bugfixes - -* Fix an assertion failure when sorting by zero properties. -* Fix a mid-commit crash in one process also crashing all other processes with - the same Realm open. -* Properly initialize new nullable float and double properties added to - existing objects to null rather than 0. -* Fix a stack overflow when objects with indexed string properties had very - long common prefixes. -* Fix a race condition which could lead to crashes when using async queries or - collection notifications. -* Fix a bug which could lead to incorrect state when an object which links to - itself is deleted from the Realm. - -1.1.0 Release notes (2016-09-16) -============================================================= - -This release brings official support for Xcode 8, Swift 2.3 and Swift 3.0. -Prebuilt frameworks are now built with Xcode 7.3.1 and Xcode 8.0. - -### API breaking changes - -* Deprecate `migrateRealm:` in favor of new `performMigrationForConfiguration:error:` method - that follows Cocoa's NSError conventions. -* Fix issue where `RLMResults` used `id `instead of its generic type as the return - type of subscript. - -### Enhancements - -* Improve error message when using NSNumber incorrectly in Swift models. -* Further reduce the download size of the prebuilt static libraries. -* Improve sort performance, especially on non-nullable columns. -* Allow partial initialization of object by `initWithValue:`, deferring - required property checks until object is added to Realm. - -### Bugfixes - -* Fix incorrect truncation of the constant value for queries of the form - `column < value` for `float` and `double` columns. -* Fix crash when an aggregate is accessed as an `Int8`, `Int16`, `Int32`, or `Int64`. -* Fix a race condition that could lead to a crash if an RLMArray or List was - deallocated on a different thread than it was created on. -* Fix a crash when the last reference to an observed object is released from - within the observation. -* Fix a crash when `initWithValue:` is used to create a nested object for a class - with an uninitialized schema. -* Enforce uniqueness for `RealmOptional` primary keys when using the `value` setter. - -1.0.2 Release notes (2016-07-13) -============================================================= - -### API breaking changes - -* Attempting to add an object with no properties to a Realm now throws rather than silently - doing nothing. - -### Enhancements - -* Swift: A `write` block may now `throw`, reverting any changes already made in - the transaction. -* Reduce address space used when committing write transactions. -* Significantly reduce the download size of prebuilt binaries and slightly - reduce the final size contribution of Realm to applications. -* Improve performance of accessing RLMArray properties and creating objects - with List properties. - -### Bugfixes - -* Fix a crash when reading the shared schema from an observed Swift object. -* Fix crashes or incorrect results when passing an array of values to - `createOrUpdate` after reordering the class's properties. -* Ensure that the initial call of a Results notification block is always passed - .Initial even if there is a write transaction between when the notification - is added and when the first notification is delivered. -* Fix a crash when deleting all objects in a Realm while fast-enumerating query - results from that Realm. -* Handle EINTR from flock() rather than crashing. -* Fix incorrect behavior following a call to `[RLMRealm compact]`. -* Fix live updating and notifications for Results created from a predicate involving - an inverse relationship to be triggered when an object at the other end of the relationship - is modified. - -1.0.1 Release notes (2016-06-12) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Significantly improve performance of opening Realm files, and slightly - improve performance of committing write transactions. - -### Bugfixes - -* Swift: Fix an error thrown when trying to create or update `Object` instances via - `add(:_update:)` with a primary key property of type `RealmOptional`. -* Xcode playground in Swift release zip now runs successfully. -* The `key` parameter of `Realm.objectForPrimaryKey(_:key:)`/ `Realm.dynamicObjectForPrimaryKey(_:key:)` - is now marked as optional. -* Fix a potential memory leak when closing Realms after a Realm file has been - opened on multiple threads which are running in active run loops. -* Fix notifications breaking on tvOS after a very large number of write - transactions have been committed. -* Fix a "Destruction of mutex in use" assertion failure after an error while - opening a file. -* Realm now throws an exception if an `Object` subclass is defined with a managed Swift `lazy` property. - Objects with ignored `lazy` properties should now work correctly. -* Update the LLDB script to work with recent changes to the implementation of `RLMResults`. -* Fix an assertion failure when a Realm file is deleted while it is still open, - and then a new Realm is opened at the same path. Note that this is still not - a supported scenario, and may break in other ways. - -1.0.0 Release notes (2016-05-25) -============================================================= - -No changes since 0.103.2. - -0.103.2 Release notes (2016-05-24) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Improve the error messages when an I/O error occurs in `writeCopyToURL`. - -### Bugfixes - -* Fix an assertion failure which could occur when opening a Realm after opening - that Realm failed previously in some specific ways in the same run of the - application. -* Reading optional integers, floats, and doubles from within a migration block - now correctly returns `nil` rather than 0 when the stored value is `nil`. - -0.103.1 Release notes (2016-05-19) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix a bug that sometimes resulted in a single object's NSData properties - changing from `nil` to a zero-length non-`nil` NSData when a different object - of the same type was deleted. - -0.103.0 Release notes (2016-05-18) -============================================================= - -### API breaking changes - -* All functionality deprecated in previous releases has been removed entirely. -* Support for Xcode 6.x & Swift prior to 2.2 has been completely removed. -* `RLMResults`/`Results` now become empty when a `RLMArray`/`List` or object - they depend on is deleted, rather than throwing an exception when accessed. -* Migrations are no longer run when `deleteRealmIfMigrationNeeded` is set, - recreating the file instead. - -### Enhancements - -* Added `invalidated` properties to `RLMResults`/`Results`, `RLMLinkingObjects`/`LinkingObjects`, - `RealmCollectionType` and `AnyRealmCollection`. These properties report whether the Realm - the object is associated with has been invalidated. -* Some `NSError`s created by Realm now have more descriptive user info payloads. - -### Bugfixes - -* None. - -0.102.1 Release notes (2016-05-13) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Return `RLMErrorSchemaMismatch` error rather than the more generic `RLMErrorFail` - when a migration is required. -* Improve the performance of allocating instances of `Object` subclasses - that have `LinkingObjects` properties. - -### Bugfixes - -* `RLMLinkingObjects` properties declared in Swift subclasses of `RLMObject` - now work correctly. -* Fix an assertion failure when deleting all objects of a type, inserting more - objects, and then deleting some of the newly inserted objects within a single - write transaction when there is an active notification block for a different - object type which links to the objects being deleted. -* Fix crashes and/or incorrect results when querying over multiple levels of - `LinkingObjects` properties. -* Fix opening read-only Realms on multiple threads at once. -* Fix a `BadTransactLog` exception when storing dates before the unix epoch (1970-01-01). - -0.102.0 Release notes (2016-05-09) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Add a method to rename properties during migrations: - * Swift: `Migration.renamePropertyForClass(_:oldName:newName:)` - * Objective-C: `-[RLMMigration renamePropertyForClass:oldName:newName:]` -* Add `deleteRealmIfMigrationNeeded` to - `RLMRealmConfiguration`/`Realm.Configuration`. When this is set to `true`, - the Realm file will be automatically deleted and recreated when there is a - schema mismatch rather than migrated to the new schema. - -### Bugfixes - -* Fix `BETWEEN` queries that traverse `RLMArray`/`List` properties to ensure that - a single related object satisfies the `BETWEEN` criteria, rather than allowing - different objects in the array to satisfy the lower and upper bounds. -* Fix a race condition when a Realm is opened on one thread while it is in the - middle of being closed on another thread which could result in crashes. -* Fix a bug which could result in changes made on one thread being applied - incorrectly on other threads when those threads are refreshed. -* Fix crash when migrating to the new date format introduced in 0.101.0. -* Fix crash when querying inverse relationships when objects are deleted. - -0.101.0 Release notes (2016-05-04) -============================================================= - -### API breaking changes - -* Files written by this version of Realm cannot be read by older versions of - Realm. Existing files will automatically be upgraded when they are opened. - -### Enhancements - -* Greatly improve performance of collection change calculation for complex - object graphs, especially for ones with cycles. -* NSDate properties now support nanoseconds precision. -* Opening a single Realm file on multiple threads now shares a single memory - mapping of the file for all threads, significantly reducing the memory - required to work with large files. -* Crashing while in the middle of a write transaction no longer blocks other - processes from performing write transactions on the same file. -* Improve the performance of refreshing a Realm (including via autorefresh) - when there are live Results/RLMResults objects for that Realm. - -### Bugfixes - -* Fix an assertion failure of "!more_before || index >= std::prev(it)->second)" - in `IndexSet::do_add()`. -* Fix a crash when an `RLMArray` or `List` object is destroyed from the wrong - thread. - -0.100.0 Release notes (2016-04-29) -============================================================= - -### API breaking changes - -* `-[RLMObject linkingObjectsOfClass:forProperty]` and `Object.linkingObjects(_:forProperty:)` - are deprecated in favor of properties of type `RLMLinkingObjects` / `LinkingObjects`. - -### Enhancements - -* The automatically-maintained inverse direction of relationships can now be exposed as - properties of type `RLMLinkingObjects` / `LinkingObjects`. These properties automatically - update to reflect the objects that link to the target object, can be used in queries, and - can be filtered like other Realm collection types. -* Queries that compare objects for equality now support multi-level key paths. - -### Bugfixes - -* Fix an assertion failure when a second write transaction is committed after a - write transaction deleted the object containing an RLMArray/List which had an - active notification block. -* Queries that compare `RLMArray` / `List` properties using != now give the correct results. - -0.99.1 Release notes (2016-04-26) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix a scenario that could lead to the assertion failure - "m_advancer_sg->get_version_of_current_transaction() == - new_notifiers.front()->version()". - -0.99.0 Release notes (2016-04-22) -============================================================= - -### API breaking changes - -* Deprecate properties of type `id`/`AnyObject`. This type was rarely used, - rarely useful and unsupported in every other Realm binding. -* The block for `-[RLMArray addNotificationBlock:]` and - `-[RLMResults addNotificationBlock:]` now takes another parameter. -* The following Objective-C APIs have been deprecated in favor of newer or preferred versions: - -| Deprecated API | New API | -|:-------------------------------------------------------|:------------------------------------------------------| -| `-[RLMRealm removeNotification:]` | `-[RLMNotificationToken stop]` | -| `RLMRealmConfiguration.path` | `RLMRealmConfiguration.fileURL` | -| `RLMRealm.path` | `RLMRealmConfiguration.fileURL` | -| `RLMRealm.readOnly` | `RLMRealmConfiguration.readOnly` | -| `+[RLMRealm realmWithPath:]` | `+[RLMRealm realmWithURL:]` | -| `+[RLMRealm writeCopyToPath:error:]` | `+[RLMRealm writeCopyToURL:encryptionKey:error:]` | -| `+[RLMRealm writeCopyToPath:encryptionKey:error:]` | `+[RLMRealm writeCopyToURL:encryptionKey:error:]` | -| `+[RLMRealm schemaVersionAtPath:error:]` | `+[RLMRealm schemaVersionAtURL:encryptionKey:error:]` | -| `+[RLMRealm schemaVersionAtPath:encryptionKey:error:]` | `+[RLMRealm schemaVersionAtURL:encryptionKey:error:]` | - -* The following Swift APIs have been deprecated in favor of newer or preferred versions: - -| Deprecated API | New API | -|:----------------------------------------------|:-----------------------------------------| -| `Realm.removeNotification(_:)` | `NotificationToken.stop()` | -| `Realm.Configuration.path` | `Realm.Configuration.fileURL` | -| `Realm.path` | `Realm.Configuration.fileURL` | -| `Realm.readOnly` | `Realm.Configuration.readOnly` | -| `Realm.writeCopyToPath(_:encryptionKey:)` | `Realm.writeCopyToURL(_:encryptionKey:)` | -| `schemaVersionAtPath(_:encryptionKey:error:)` | `schemaVersionAtURL(_:encryptionKey:)` | - -### Enhancements - -* Add information about what rows were added, removed, or modified to the - notifications sent to the Realm collections. -* Improve error when illegally appending to an `RLMArray` / `List` property from a default value - or the standalone initializer (`init()`) before the schema is ready. - -### Bugfixes - -* Fix a use-after-free when an associated object's dealloc method is used to - remove observers from an RLMObject. -* Fix a small memory leak each time a Realm file is opened. -* Return a recoverable `RLMErrorAddressSpaceExhausted` error rather than - crash when there is insufficient available address space on Realm - initialization or write commit. - -0.98.8 Release notes (2016-04-15) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fixed a bug that caused some encrypted files created using - `-[RLMRealm writeCopyToPath:encryptionKey:error:]` to fail to open. - -0.98.7 Release notes (2016-04-13) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Mark further initializers in Objective-C as NS_DESIGNATED_INITIALIZER to prevent that these aren't - correctly defined in Swift Object subclasses, which don't qualify for auto-inheriting the required initializers. -* `-[RLMResults indexOfObjectWithPredicate:]` now returns correct results - for `RLMResults` instances that were created by filtering an `RLMArray`. -* Adjust how RLMObjects are destroyed in order to support using an associated - object on an RLMObject to remove KVO observers from that RLMObject. -* `-[RLMResults indexOfObjectWithPredicate:]` now returns the index of the first matching object for a - sorted `RLMResults`, matching its documented behavior. -* Fix a crash when canceling a transaction that set a relationship. -* Fix a crash when a query referenced a deleted object. - -0.98.6 Release notes (2016-03-25) -============================================================= - -Prebuilt frameworks are now built with Xcode 7.3. - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix running unit tests on iOS simulators and devices with Xcode 7.3. - -0.98.5 Release notes (2016-03-14) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix a crash when opening a Realm on 32-bit iOS devices. - -0.98.4 Release notes (2016-03-10) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Properly report changes made by adding an object to a Realm with - addOrUpdate:/createOrUpdate: to KVO observers for existing objects with that - primary key. -* Fix crashes and assorted issues when a migration which added object link - properties is rolled back due to an error in the migration block. -* Fix assertion failures when deleting objects within a migration block of a - type which had an object link property added in that migration. -* Fix an assertion failure in `Query::apply_patch` when updating certain kinds - of queries after a write transaction is committed. - -0.98.3 Release notes (2016-02-26) -============================================================= - -### Enhancements - -* Initializing the shared schema is 3x faster. - -### Bugfixes - -* Using Realm Objective-C from Swift while having Realm Swift linked no longer causes that the - declared `ignoredProperties` are not taken into account. -* Fix assertion failures when rolling back a migration which added Object link - properties to a class. -* Fix potential errors when cancelling a write transaction which modified - multiple `RLMArray`/`List` properties. -* Report the correct value for inWriteTransaction after attempting to commit a - write transaction fails. -* Support CocoaPods 1.0 beginning from prerelease 1.0.0.beta.4 while retaining - backwards compatibility with 0.39. - -0.98.2 Release notes (2016-02-18) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Aggregate operations (`ANY`, `NONE`, `@count`, `SUBQUERY`, etc.) are now supported for key paths - that begin with an object relationship so long as there is a `RLMArray`/`List` property at some - point in a key path. -* Predicates of the form `%@ IN arrayProperty` are now supported. - -### Bugfixes - -* Use of KVC collection operators on Swift collection types no longer throws an exception. -* Fix reporting of inWriteTransaction in notifications triggered by - `beginWriteTransaction`. -* The contents of `List` and `Optional` properties are now correctly preserved when copying - a Swift object from one Realm to another, and performing other operations that result in a - Swift object graph being recursively traversed from Objective-C. -* Fix a deadlock when queries are performed within a Realm notification block. -* The `ANY` / `SOME` / `NONE` qualifiers are now required in comparisons involving a key path that - traverse a `RLMArray`/`List` property. Previously they were only required if the first key in the - key path was an `RLMArray`/`List` property. -* Fix several scenarios where the default schema would be initialized - incorrectly if the first Realm opened used a restricted class subset (via - `objectClasses`/`objectTypes`). - -0.98.1 Release notes (2016-02-10) -============================================================= - -### Bugfixes - -* Fix crashes when deleting an object containing an `RLMArray`/`List` which had - previously been queried. -* Fix a crash when deleting an object containing an `RLMArray`/`List` with - active notification blocks. -* Fix duplicate file warnings when building via CocoaPods. -* Fix crash or incorrect results when calling `indexOfObject:` on an - `RLMResults` derived from an `RLMArray`. - -0.98.0 Release notes (2016-02-04) -============================================================= - -### API breaking changes - -* `+[RLMRealm realmWithPath:]`/`Realm.init(path:)` now inherits from the default - configuration. -* Swift 1.2 is no longer supported. - -### Enhancements - -* Add `addNotificationBlock` to `RLMResults`, `Results`, `RLMArray`, and - `List`, which calls the given block whenever the collection changes. -* Do a lot of the work for keeping `RLMResults`/`Results` up-to-date after - write transactions on a background thread to help avoid blocking the main - thread. -* `NSPredicate`'s `SUBQUERY` operator is now supported. It has the following limitations: - * `@count` is the only operator that may be applied to the `SUBQUERY` expression. - * The `SUBQUERY(…).@count` expression must be compared with a constant. - * Correlated subqueries are not yet supported. - -### Bugfixes - -* None. - -0.97.1 Release notes (2016-01-29) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Swift: Added `Error` enum allowing to catch errors e.g. thrown on initializing - `RLMRealm`/`Realm` instances. -* Fail with `RLMErrorFileNotFound` instead of the more generic `RLMErrorFileAccess`, - if no file was found when a realm was opened as read-only or if the directory part - of the specified path was not found when a copy should be written. -* Greatly improve performance when deleting objects with one or more indexed - properties. -* Indexing `BOOL`/`Bool` and `NSDate` properties are now supported. -* Swift: Add support for indexing optional properties. - -### Bugfixes - -* Fix incorrect results or crashes when using `-[RLMResults setValue:forKey:]` - on an RLMResults which was filtered on the key being set. -* Fix crashes when an RLMRealm is deallocated from the wrong thread. -* Fix incorrect results from aggregate methods on `Results`/`RLMResults` after - objects which were previously in the results are deleted. -* Fix a crash when adding a new property to an existing class with over a - million objects in the Realm. -* Fix errors when opening encrypted Realm files created with writeCopyToPath. -* Fix crashes or incorrect results for queries that use relationship equality - in cases where the `RLMResults` is kept alive and instances of the target class - of the relationship are deleted. - -0.97.0 Release notes (2015-12-17) -============================================================= - -### API breaking changes - -* All functionality deprecated in previous releases has been removed entirely. -* Add generic type annotations to NSArrays and NSDictionaries in public APIs. -* Adding a Realm notification block on a thread not currently running from - within a run loop throws an exception rather than silently never calling the - notification block. - -### Enhancements - -* Support for tvOS. -* Support for building Realm Swift from source when using Carthage. -* The block parameter of `-[RLMRealm transactionWithBlock:]`/`Realm.write(_:)` is - now marked as `__attribute__((noescape))`/`@noescape`. -* Many forms of queries with key paths on both sides of the comparison operator - are now supported. -* Add support for KVC collection operators in `RLMResults` and `RLMArray`. -* Fail instead of deadlocking in `+[RLMRealm sharedSchema]`, if a Swift property is initialized - to a computed value, which attempts to open a Realm on its own. - -### Bugfixes - -* Fix poor performance when calling `-[RLMRealm deleteObjects:]` on an - `RLMResults` which filtered the objects when there are other classes linking - to the type of the deleted objects. -* An exception is now thrown when defining `Object` properties of an unsupported - type. - -0.96.3 Release notes (2015-12-04) -============================================================= - -### Enhancements - -* Queries are no longer limited to 16 levels of grouping. -* Rework the implementation of encrypted Realms to no longer interfere with - debuggers. - -### Bugfixes - -* Fix crash when trying to retrieve object instances via `dynamicObjects`. -* Throw an exception when querying on a link providing objects, which are from a different Realm. -* Return empty results when querying on a link providing an unattached object. -* Fix crashes or incorrect results when calling `-[RLMRealm refresh]` during - fast enumeration. -* Add `Int8` support for `RealmOptional`, `MinMaxType` and `AddableType`. -* Set the default value for newly added non-optional NSData properties to a - zero-byte NSData rather than nil. -* Fix a potential crash when deleting all objects of a class. -* Fix performance problems when creating large numbers of objects with - `RLMArray`/`List` properties. -* Fix memory leak when using Object(value:) for subclasses with - `List` or `RealmOptional` properties. -* Fix a crash when computing the average of an optional integer property. -* Fix incorrect search results for some queries on integer properties. -* Add error-checking for nil realm parameters in many methods such as - `+[RLMObject allObjectsInRealm:]`. -* Fix a race condition between commits and opening Realm files on new threads - that could lead to a crash. -* Fix several crashes when opening Realm files. -* `-[RLMObject createInRealm:withValue:]`, `-[RLMObject createOrUpdateInRealm:withValue:]`, and - their variants for the default Realm now always match the contents of an `NSArray` against properties - in the same order as they are defined in the model. - -0.96.2 Release notes (2015-10-26) -============================================================= - -Prebuilt frameworks are now built with Xcode 7.1. - -### Bugfixes - -* Fix ignoring optional properties in Swift. -* Fix CocoaPods installation on case-sensitive file systems. - -0.96.1 Release notes (2015-10-20) -============================================================= - -### Bugfixes - -* Support assigning `Results` to `List` properties via KVC. -* Honor the schema version set in the configuration in `+[RLMRealm migrateRealm:]`. -* Fix crash when using optional Int16/Int32/Int64 properties in Swift. - -0.96.0 Release notes (2015-10-14) -============================================================= - -* No functional changes since beta2. - -0.96.0-beta2 Release notes (2015-10-08) -============================================================= - -### Bugfixes - -* Add RLMOptionalBase.h to the podspec. - -0.96.0-beta Release notes (2015-10-07) -============================================================= - -### API breaking changes - -* CocoaPods v0.38 or greater is now required to install Realm and RealmSwift - as pods. - -### Enhancements - -* Functionality common to both `List` and `Results` is now declared in a - `RealmCollectionType` protocol that both types conform to. -* `Results.realm` now returns an `Optional` in order to conform to - `RealmCollectionType`, but will always return `.Some()` since a `Results` - cannot exist independently from a `Realm`. -* Aggregate operations are now available on `List`: `min`, `max`, `sum`, - `average`. -* Committing write transactions (via `commitWrite` / `commitWriteTransaction` and - `write` / `transactionWithBlock`) now optionally allow for handling errors when - the disk is out of space. -* Added `isEmpty` property on `RLMRealm`/`Realm` to indicate if it contains any - objects. -* The `@count`, `@min`, `@max`, `@sum` and `@avg` collection operators are now - supported in queries. - -### Bugfixes - -* Fix assertion failure when inserting NSData between 8MB and 16MB in size. -* Fix assertion failure when rolling back a migration which removed an object - link or `RLMArray`/`List` property. -* Add the path of the file being opened to file open errors. -* Fix a crash that could be triggered by rapidly opening and closing a Realm - many times on multiple threads at once. -* Fix several places where exception messages included the name of the wrong - function which failed. - -0.95.3 Release notes (2015-10-05) -============================================================= - -### Bugfixes - -* Compile iOS Simulator framework architectures with `-fembed-bitcode-marker`. -* Fix crashes when the first Realm opened uses a class subset and later Realms - opened do not. -* Fix inconsistent errors when `Object(value: ...)` is used to initialize the - default value of a property of an `Object` subclass. -* Throw an exception when a class subset has objects with array or object - properties of a type that are not part of the class subset. - -0.95.2 Release notes (2015-09-24) -============================================================= - -* Enable bitcode for iOS and watchOS frameworks. -* Build libraries with Xcode 7 final rather than the GM. - -0.95.1 Release notes (2015-09-23) -============================================================= - -### Enhancements - -* Add missing KVO handling for moving and exchanging objects in `RLMArray` and - `List`. - -### Bugfixes - -* Setting the primary key property on persisted `RLMObject`s / `Object`s - via subscripting or key-value coding will cause an exception to be thrown. -* Fix crash due to race condition in `RLMRealmConfiguration` where the default - configuration was in the process of being copied in one thread, while - released in another. -* Fix crash when a migration which removed an object or array property is - rolled back due to an error. - -0.95.0 Release notes (2015-08-25) -============================================================= - -### API breaking changes - -* The following APIs have been deprecated in favor of the new `RLMRealmConfiguration` class in Realm Objective-C: - -| Deprecated API | New API | -|:------------------------------------------------------------------|:---------------------------------------------------------------------------------| -| `+[RLMRealm realmWithPath:readOnly:error:]` | `+[RLMRealm realmWithConfiguration:error:]` | -| `+[RLMRealm realmWithPath:encryptionKey:readOnly:error:]` | `+[RLMRealm realmWithConfiguration:error:]` | -| `+[RLMRealm setEncryptionKey:forRealmsAtPath:]` | `-[RLMRealmConfiguration setEncryptionKey:]` | -| `+[RLMRealm inMemoryRealmWithIdentifier:]` | `+[RLMRealm realmWithConfiguration:error:]` | -| `+[RLMRealm defaultRealmPath]` | `+[RLMRealmConfiguration defaultConfiguration]` | -| `+[RLMRealm setDefaultRealmPath:]` | `+[RLMRealmConfiguration setDefaultConfiguration:]` | -| `+[RLMRealm setDefaultRealmSchemaVersion:withMigrationBlock]` | `RLMRealmConfiguration.schemaVersion` and `RLMRealmConfiguration.migrationBlock` | -| `+[RLMRealm setSchemaVersion:forRealmAtPath:withMigrationBlock:]` | `RLMRealmConfiguration.schemaVersion` and `RLMRealmConfiguration.migrationBlock` | -| `+[RLMRealm migrateRealmAtPath:]` | `+[RLMRealm migrateRealm:]` | -| `+[RLMRealm migrateRealmAtPath:encryptionKey:]` | `+[RLMRealm migrateRealm:]` | - -* The following APIs have been deprecated in favor of the new `Realm.Configuration` struct in Realm Swift for Swift 1.2: - -| Deprecated API | New API | -|:--------------------------------------------------------------|:-----------------------------------------------------------------------------| -| `Realm.defaultPath` | `Realm.Configuration.defaultConfiguration` | -| `Realm(path:readOnly:encryptionKey:error:)` | `Realm(configuration:error:)` | -| `Realm(inMemoryIdentifier:)` | `Realm(configuration:error:)` | -| `Realm.setEncryptionKey(:forPath:)` | `Realm(configuration:error:)` | -| `setDefaultRealmSchemaVersion(schemaVersion:migrationBlock:)` | `Realm.Configuration.schemaVersion` and `Realm.Configuration.migrationBlock` | -| `setSchemaVersion(schemaVersion:realmPath:migrationBlock:)` | `Realm.Configuration.schemaVersion` and `Realm.Configuration.migrationBlock` | -| `migrateRealm(path:encryptionKey:)` | `migrateRealm(configuration:)` | - -* The following APIs have been deprecated in favor of the new `Realm.Configuration` struct in Realm Swift for Swift 2.0: - -| Deprecated API | New API | -|:--------------------------------------------------------------|:-----------------------------------------------------------------------------| -| `Realm.defaultPath` | `Realm.Configuration.defaultConfiguration` | -| `Realm(path:readOnly:encryptionKey:) throws` | `Realm(configuration:) throws` | -| `Realm(inMemoryIdentifier:)` | `Realm(configuration:) throws` | -| `Realm.setEncryptionKey(:forPath:)` | `Realm(configuration:) throws` | -| `setDefaultRealmSchemaVersion(schemaVersion:migrationBlock:)` | `Realm.Configuration.schemaVersion` and `Realm.Configuration.migrationBlock` | -| `setSchemaVersion(schemaVersion:realmPath:migrationBlock:)` | `Realm.Configuration.schemaVersion` and `Realm.Configuration.migrationBlock` | -| `migrateRealm(path:encryptionKey:)` | `migrateRealm(configuration:)` | - -* `List.extend` in Realm Swift for Swift 2.0 has been replaced with `List.appendContentsOf`, - mirroring changes to `RangeReplaceableCollectionType`. - -* Object properties on `Object` subclasses in Realm Swift must be marked as optional, - otherwise a runtime exception will be thrown. - -### Enhancements - -* Persisted properties of `RLMObject`/`Object` subclasses are now Key-Value - Observing compliant. -* The different options used to create Realm instances have been consolidated - into a single `RLMRealmConfiguration`/`Realm.Configuration` object. -* Enumerating Realm collections (`RLMArray`, `RLMResults`, `List<>`, - `Results<>`) now enumerates over a copy of the collection, making it no - longer an error to modify a collection during enumeration (either directly, - or indirectly by modifying objects to make them no longer match a query). -* Improve performance of object insertion in Swift to bring it roughly in line - with Objective-C. -* Allow specifying a specific list of `RLMObject` / `Object` subclasses to include - in a given Realm via `RLMRealmConfiguration.objectClasses` / `Realm.Configuration.objectTypes`. - -### Bugfixes - -* Subscripting on `RLMObject` is now marked as nullable. - -0.94.1 Release notes (2015-08-10) -============================================================= - -### API breaking changes - -* Building for watchOS requires Xcode 7 beta 5. - -### Enhancements - -* `Object.className` is now marked as `final`. - -### Bugfixes - -* Fix crash when adding a property to a model without updating the schema - version. -* Fix unnecessary redownloading of the core library when building from source. -* Fix crash when sorting by an integer or floating-point property on iOS 7. - -0.94.0 Release notes (2015-07-29) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Reduce the amount of memory used by RLMRealm notification listener threads. -* Avoid evaluating results eagerly when filtering and sorting. -* Add nullability annotations to the Objective-C API to provide enhanced compiler - warnings and bridging to Swift. -* Make `RLMResult`s and `RLMArray`s support Objective-C generics. -* Add support for building watchOS and bitcode-compatible apps. -* Make the exceptions thrown in getters and setters more informative. -* Add `-[RLMArray exchangeObjectAtIndex:withObjectAtIndex]` and `List.swap(_:_:)` - to allow exchanging the location of two objects in the given `RLMArray` / `List`. -* Added anonymous analytics on simulator/debugger runs. -* Add `-[RLMArray moveObjectAtIndex:toIndex:]` and `List.move(from:to:)` to - allow moving objects in the given `RLMArray` / `List`. - -### Bugfixes - -* Processes crashing due to an uncaught exception inside a write transaction will - no longer cause other processes using the same Realm to hang indefinitely. -* Fix incorrect results when querying for < or <= on ints that - require 64 bits to represent with a CPU that supports SSE 4.2. -* An exception will no longer be thrown when attempting to reset the schema - version or encryption key on an open Realm to the current value. -* Date properties on 32 bit devices will retain 64 bit second precision. -* Wrap calls to the block passed to `enumerate` in an autoreleasepool to reduce - memory growth when migrating a large amount of objects. -* In-memory realms no longer write to the Documents directory on iOS or - Application Support on OS X. - -0.93.2 Release notes (2015-06-12) -============================================================= - -### Bugfixes - -* Fixed an issue where the packaged OS X Realm.framework was built with - `GCC_GENERATE_TEST_COVERAGE_FILES` and `GCC_INSTRUMENT_PROGRAM_FLOW_ARCS` - enabled. -* Fix a memory leak when constructing standalone Swift objects with NSDate - properties. -* Throw an exception rather than asserting when an invalidated object is added - to an RLMArray. -* Fix a case where data loss would occur if a device was hard-powered-off - shortly after a write transaction was committed which had to expand the Realm - file. - -0.93.1 Release notes (2015-05-29) -============================================================= - -### Bugfixes - -* Objects are no longer copied into standalone objects during object creation. This fixes an issue where - nested objects with a primary key are sometimes duplicated rather than updated. -* Comparison predicates with a constant on the left of the operator and key path on the right now give - correct results. An exception is now thrown for predicates that do not yet support this ordering. -* Fix some crashes in `index_string.cpp` with int primary keys or indexed int properties. - -0.93.0 Release notes (2015-05-27) -============================================================= - -### API breaking changes - -* Schema versions are now represented as `uint64_t` (Objective-C) and `UInt64` (Swift) so that they have - the same representation on all architectures. - -### Enhancements - -* Swift: `Results` now conforms to `CVarArgType` so it can - now be passed as an argument to `Results.filter(_:...)` - and `List.filter(_:...)`. -* Swift: Made `SortDescriptor` conform to the `Equatable` and - `StringLiteralConvertible` protocols. -* Int primary keys are once again automatically indexed. -* Improve error reporting when attempting to mark a property of a type that - cannot be indexed as indexed. - -### Bugfixes - -* Swift: `RealmSwift.framework` no longer embeds `Realm.framework`, - which now allows apps using it to pass iTunes Connect validation. - -0.92.4 Release notes (2015-05-22) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Swift: Made `Object.init()` a required initializer. -* `RLMObject`, `RLMResults`, `Object` and `Results` can now be safely - deallocated (but still not used) from any thread. -* Improve performance of `-[RLMArray indexOfObjectWhere:]` and `-[RLMArray - indexOfObjectWithPredicate:]`, and implement them for standalone RLMArrays. -* Improved performance of most simple queries. - -### Bugfixes - -* The interprocess notification mechanism no longer uses dispatch worker threads, preventing it from - starving other GCD clients of the opportunity to execute blocks when dozens of Realms are open at once. - -0.92.3 Release notes (2015-05-13) -============================================================= - -### API breaking changes - -* Swift: `Results.average(_:)` now returns an optional, which is `nil` if and only if the results - set is empty. - -### Enhancements - -* Swift: Added `List.invalidated`, which returns if the given `List` is no longer - safe to be accessed, and is analogous to `-[RLMArray isInvalidated]`. -* Assertion messages are automatically logged to Crashlytics if it's loaded - into the current process to make it easier to diagnose crashes. - -### Bugfixes - -* Swift: Enumerating through a standalone `List` whose objects themselves - have list properties won't crash. -* Swift: Using a subclass of `RealmSwift.Object` in an aggregate operator of a predicate - no longer throws a spurious type error. -* Fix incorrect results for when using OR in a query on a `RLMArray`/`List<>`. -* Fix incorrect values from `[RLMResults count]`/`Results.count` when using - `!=` on an int property with no other query conditions. -* Lower the maximum doubling threshold for Realm file sizes from 128MB to 16MB - to reduce the amount of wasted space. - -0.92.2 Release notes (2015-05-08) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Exceptions raised when incorrect object types are used with predicates now contain more detailed information. -* Added `-[RLMMigration deleteDataForClassName:]` and `Migration.deleteData(_:)` - to enable cleaning up after removing object subclasses - -### Bugfixes - -* Prevent debugging of an application using an encrypted Realm to work around - frequent LLDB hangs. Until the underlying issue is addressed you may set - REALM_DISABLE_ENCRYPTION=YES in your application's environment variables to - have requests to open an encrypted Realm treated as a request for an - unencrypted Realm. -* Linked objects are properly updated in `createOrUpdateInRealm:withValue:`. -* List properties on Objects are now properly initialized during fast enumeration. - -0.92.1 Release notes (2015-05-06) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* `-[RLMRealm inWriteTransaction]` is now public. -* Realm Swift is now available on CoocaPods. - -### Bugfixes - -* Force code re-signing after stripping architectures in `strip-frameworks.sh`. - -0.92.0 Release notes (2015-05-05) -============================================================= - -### API breaking changes - -* Migration blocks are no longer called when a Realm file is first created. -* The following APIs have been deprecated in favor of newer method names: - -| Deprecated API | New API | -|:-------------------------------------------------------|:------------------------------------------------------| -| `-[RLMMigration createObject:withObject:]` | `-[RLMMigration createObject:withValue:]` | -| `-[RLMObject initWithObject:]` | `-[RLMObject initWithValue:]` | -| `+[RLMObject createInDefaultRealmWithObject:]` | `+[RLMObject createInDefaultRealmWithValue:]` | -| `+[RLMObject createInRealm:withObject:]` | `+[RLMObject createInRealm:withValue:]` | -| `+[RLMObject createOrUpdateInDefaultRealmWithObject:]` | `+[RLMObject createOrUpdateInDefaultRealmWithValue:]` | -| `+[RLMObject createOrUpdateInRealm:withObject:]` | `+[RLMObject createOrUpdateInRealm:withValue:]` | - -### Enhancements - -* `Int8` properties defined in Swift are now treated as integers, rather than - booleans. -* NSPredicates created using `+predicateWithValue:` are now supported. - -### Bugfixes - -* Compound AND predicates with no subpredicates now correctly match all objects. - -0.91.5 Release notes (2015-04-28) -============================================================= - -### Bugfixes - -* Fix issues with removing search indexes and re-enable it. - -0.91.4 Release notes (2015-04-27) -============================================================= - -### Bugfixes - -* Temporarily disable removing indexes from existing columns due to bugs. - -0.91.3 Release notes (2015-04-17) -============================================================= - -### Bugfixes - -* Fix `Extra argument 'objectClassName' in call` errors when building via - CocoaPods. - -0.91.2 Release notes (2015-04-16) -============================================================= - -* Migration blocks are no longer called when a Realm file is first created. - -### Enhancements - -* `RLMCollection` supports collection KVC operations. -* Sorting `RLMResults` is 2-5x faster (typically closer to 2x). -* Refreshing `RLMRealm` after a write transaction which inserts or modifies - strings or `NSData` is committed on another thread is significantly faster. -* Indexes are now added and removed from existing properties when a Realm file - is opened, rather than only when properties are first added. - -### Bugfixes - -* `+[RLMSchema dynamicSchemaForRealm:]` now respects search indexes. -* `+[RLMProperty isEqualToProperty:]` now checks for equal `indexed` properties. - -0.91.1 Release notes (2015-03-12) -============================================================= - -### Enhancements - -* The browser will automatically refresh when the Realm has been modified - from another process. -* Allow using Realm in an embedded framework by setting - `APPLICATION_EXTENSION_API_ONLY` to YES. - -### Bugfixes - -* Fix a crash in CFRunLoopSourceInvalidate. - -0.91.0 Release notes (2015-03-10) -============================================================= - -### API breaking changes - -* `attributesForProperty:` has been removed from `RLMObject`. You now specify indexed - properties by implementing the `indexedProperties` method. -* An exception will be thrown when calling `setEncryptionKey:forRealmsAtPath:`, - `setSchemaVersion:forRealmAtPath:withMigrationBlock:`, and `migrateRealmAtPath:` - when a Realm at the given path is already open. -* Object and array properties of type `RLMObject` will no longer be allowed. - -### Enhancements - -* Add support for sharing Realm files between processes. -* The browser will no longer show objects that have no persisted properties. -* `RLMSchema`, `RLMObjectSchema`, and `RLMProperty` now have more useful descriptions. -* Opening an encrypted Realm while a debugger is attached to the process no - longer throws an exception. -* `RLMArray` now exposes an `isInvalidated` property to indicate if it can no - longer be accessed. - -### Bugfixes - -* An exception will now be thrown when calling `-beginWriteTransaction` from within a notification - triggered by calling `-beginWriteTransaction` elsewhere. -* When calling `delete:` we now verify that the object being deleted is persisted in the target Realm. -* Fix crash when calling `createOrUpdate:inRealm` with nested linked objects. -* Use the key from `+[RLMRealm setEncryptionKey:forRealmsAtPath:]` in - `-writeCopyToPath:error:` and `+migrateRealmAtPath:`. -* Comparing an RLMObject to a non-RLMObject using `-[RLMObject isEqual:]` or - `-isEqualToObject:` now returns NO instead of crashing. -* Improved error message when an `RLMObject` subclass is defined nested within - another Swift declaration. -* Fix crash when the process is terminated by the OS on iOS while encrypted realms are open. -* Fix crash after large commits to encrypted realms. - -0.90.6 Release notes (2015-02-20) -============================================================= - -### Enhancements - -* Improve compatibility of encrypted Realms with third-party crash reporters. - -### Bugfixes - -* Fix incorrect results when using aggregate functions on sorted RLMResults. -* Fix data corruption when using writeCopyToPath:encryptionKey:. -* Maybe fix some assertion failures. - -0.90.5 Release notes (2015-02-04) -============================================================= - -### Bugfixes - -* Fix for crashes when encryption is enabled on 64-bit iOS devices. - -0.90.4 Release notes (2015-01-29) -============================================================= - -### Bugfixes - -* Fix bug that resulted in columns being dropped and recreated during migrations. - -0.90.3 Release notes (2015-01-27) -============================================================= - -### Enhancements - -* Calling `createInDefaultRealmWithObject:`, `createInRealm:withObject:`, - `createOrUpdateInDefaultRealmWithObject:` or `createOrUpdateInRealm:withObject:` - is a no-op if the argument is an RLMObject of the same type as the receiver - and is already backed by the target realm. - -### Bugfixes - -* Fix incorrect column type assertions when the first Realm file opened is a - read-only file that is missing tables. -* Throw an exception when adding an invalidated or deleted object as a link. -* Throw an exception when calling `createOrUpdateInRealm:withObject:` when the - receiver has no primary key defined. - -0.90.1 Release notes (2015-01-22) -============================================================= - -### Bugfixes - -* Fix for RLMObject being treated as a model object class and showing up in the browser. -* Fix compilation from the podspec. -* Fix for crash when calling `objectsWhere:` with grouping in the query on `allObjects`. - -0.90.0 Release notes (2015-01-21) -============================================================= - -### API breaking changes - -* Rename `-[RLMRealm encryptedRealmWithPath:key:readOnly:error:]` to - `-[RLMRealm realmWithPath:encryptionKey:readOnly:error:]`. -* `-[RLMRealm setSchemaVersion:withMigrationBlock]` is no longer global and must be called - for each individual Realm path used. You can now call `-[RLMRealm setDefaultRealmSchemaVersion:withMigrationBlock]` - for the default Realm and `-[RLMRealm setSchemaVersion:forRealmAtPath:withMigrationBlock:]` for all others; - -### Enhancements - -* Add `-[RLMRealm writeCopyToPath:encryptionKey:error:]`. -* Add support for comparing string columns to other string columns in queries. - -### Bugfixes - -* Roll back changes made when an exception is thrown during a migration. -* Throw an exception if the number of items in a RLMResults or RLMArray changes - while it's being fast-enumerated. -* Also encrypt the temporary files used when encryption is enabled for a Realm. -* Fixed crash in JSONImport example on OS X with non-en_US locale. -* Fixed infinite loop when opening a Realm file in the Browser at the same time - as it is open in a 32-bit simulator. -* Fixed a crash when adding primary keys to older realm files with no primary - keys on any objects. -* Fixed a crash when removing a primary key in a migration. -* Fixed a crash when multiple write transactions with no changes followed by a - write transaction with changes were committed without the main thread - RLMRealm getting a chance to refresh. -* Fixed incomplete results when querying for non-null relationships. -* Improve the error message when a Realm file is opened in multiple processes - at once. - -0.89.2 Release notes (2015-01-02) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix an assertion failure when invalidating a Realm which is in a write - transaction, has already been invalidated, or has never been used. -* Fix an assertion failure when sorting an empty RLMArray property. -* Fix a bug resulting in the browser never becoming visible on 10.9. -* Write UTF-8 when generating class files from a realm file in the Browser. - -0.89.1 Release notes (2014-12-22) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Improve the error message when a Realm can't be opened due to lacking write - permissions. - -### Bugfixes - -* Fix an assertion failure when inserting rows after calling `deleteAllObjects` - on a Realm. -* Separate dynamic frameworks are now built for the simulator and devices to - work around App Store submission errors due to the simulator version not - being automatically stripped from dynamic libraries. - -0.89.0 Release notes (2014-12-18) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Add support for encrypting Realm files on disk. -* Support using KVC-compliant objects without getters or with custom getter - names to initialize RLMObjects with `createObjectInRealm` and friends. - -### Bugfixes - -* Merge native Swift default property values with defaultPropertyValues(). -* Don't leave the database schema partially updated when opening a realm fails - due to a migration being needed. -* Fixed issue where objects with custom getter names couldn't be used to - initialize other objects. -* Fix a major performance regression on queries on string properties. -* Fix a memory leak when circularly linked objects are added to a Realm. - -0.88.0 Release notes (2014-12-02) -============================================================= - -### API breaking changes - -* Deallocating an RLMRealm instance in a write transaction lacking an explicit - commit/cancel will now be automatically cancelled instead of committed. -* `-[RLMObject isDeletedFromRealm]` has been renamed to `-[RLMObject isInvalidated]`. - -### Enhancements - -* Add `-[RLMRealm writeCopyToPath:]` to write a compacted copy of the Realm - another file. -* Add support for case insensitive, BEGINSWITH, ENDSWITH and CONTAINS string - queries on array properties. -* Make fast enumeration of `RLMArray` and `RLMResults` ~30% faster and - `objectAtIndex:` ~55% faster. -* Added a lldb visualizer script for displaying the contents of persisted - RLMObjects when debugging. -* Added method `-setDefaultRealmPath:` to change the default Realm path. -* Add `-[RLMRealm invalidate]` to release data locked by the current thread. - -### Bugfixes - -* Fix for crash when running many simultaneous write transactions on background threads. -* Fix for crashes caused by opening Realms at multiple paths simultaneously which have had - properties re-ordered during migration. -* Don't run the query twice when `firstObject` or `lastObject` are called on an - `RLMResults` which has not had its results accessed already. -* Fix for bug where schema version is 0 for new Realm created at the latest version. -* Fix for error message where no migration block is specified when required. - -0.87.4 Release notes (2014-11-07) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix browser location in release zip. - -0.87.3 Release notes (2014-11-06) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Added method `-linkingObjectsOfClass:forProperty:` to RLMObject to expose inverse - relationships/backlinks. - -### Bugfixes - -* Fix for crash due to missing search index when migrating an object with a string primary key - in a database created using an older versions (0.86.3 and earlier). -* Throw an exception when passing an array containing a - non-RLMObject to -[RLMRealm addObjects:]. -* Fix for crash when deleting an object from multiple threads. - -0.87.0 Release notes (2014-10-21) -============================================================= - -### API breaking changes - -* RLMArray has been split into two classes, `RLMArray` and `RLMResults`. RLMArray is - used for object properties as in previous releases. Moving forward all methods used to - enumerate, query, and sort objects return an instance of a new class `RLMResults`. This - change was made to support diverging apis and the future addition of change notifications - for queries. -* The api for migrations has changed. You now call `setSchemaVersion:withMigrationBlock:` to - register a global migration block and associated version. This block is applied to Realms as - needed when opened for Realms at a previous version. The block can be applied manually if - desired by calling `migrateRealmAtPath:`. -* `arraySortedByProperty:ascending:` was renamed to `sortedResultsUsingProperty:ascending` -* `addObjectsFromArray:` on both `RLMRealm` and `RLMArray` has been renamed to `addObjects:` - and now accepts any container class which implements `NSFastEnumeration` -* Building with Swift support now requires Xcode 6.1 - -### Enhancements - -* Add support for sorting `RLMArray`s by multiple columns with `sortedResultsUsingDescriptors:` -* Added method `deleteAllObjects` on `RLMRealm` to clear a Realm. -* Added method `createObject:withObject:` on `RLMMigration` which allows object creation during migrations. -* Added method `deleteObject:` on `RLMMigration` which allows object deletion during migrations. -* Updating to core library version 0.85.0. -* Implement `objectsWhere:` and `objectsWithPredicate:` for array properties. -* Add `cancelWriteTransaction` to revert all changes made in a write transaction and end the transaction. -* Make creating `RLMRealm` instances on background threads when an instance - exists on another thread take a fifth of the time. -* Support for partial updates when calling `createOrUpdateWithObject:` and `addOrUpdateObject:` -* Re-enable Swift support on OS X - -### Bugfixes - -* Fix exceptions when trying to set `RLMObject` properties after rearranging - the properties in a `RLMObject` subclass. -* Fix crash on IN query with several thousand items. -* Fix crash when querying indexed `NSString` properties. -* Fixed an issue which prevented in-memory Realms from being used accross multiple threads. -* Preserve the sort order when querying a sorted `RLMResults`. -* Fixed an issue with migrations where if a Realm file is deleted after a Realm is initialized, - the newly created Realm can be initialized with an incorrect schema version. -* Fix crash in `RLMSuperSet` when assigning to a `RLMArray` property on a standalone object. -* Add an error message when the protocol for an `RLMArray` property is not a - valid object type. -* Add an error message when an `RLMObject` subclass is defined nested within - another Swift class. - -0.86.3 Release notes (2014-10-09) -============================================================= - -### Enhancements - -* Add support for != in queries on object relationships. - -### Bugfixes - -* Re-adding an object to its Realm no longer throws an exception and is now a no-op - (as it was previously). -* Fix another bug which would sometimes result in subclassing RLMObject - subclasses not working. - -0.86.2 Release notes (2014-10-06) -============================================================= - -### Bugfixes - -* Fixed issues with packaging "Realm Browser.app" for release. - -0.86.1 Release notes (2014-10-03) -============================================================= - -### Bugfixes - -* Fix a bug which would sometimes result in subclassing RLMObject subclasses - not working. - -0.86.0 Release notes (2014-10-03) -============================================================= - -### API breaking changes - -* Xcode 6 is now supported from the main Xcode project `Realm.xcodeproj`. - Xcode 5 is no longer supported. - -### Enhancements - -* Support subclassing RLMObject models. Although you can now persist subclasses, - polymorphic behavior is not supported (i.e. setting a property to an - instance of its subclass). -* Add support for sorting RLMArray properties. -* Speed up inserting objects with `addObject:` by ~20%. -* `readonly` properties are automatically ignored rather than having to be - added to `ignoredProperties`. -* Updating to core library version 0.83.1. -* Return "[deleted object]" rather than throwing an exception when - `-description` is called on a deleted RLMObject. -* Significantly improve performance of very large queries. -* Allow passing any enumerable to IN clauses rather than just NSArray. -* Add `objectForPrimaryKey:` and `objectInRealm:forPrimaryKey:` convenience - methods to fetch an object by primary key. - -### Bugfixes - -* Fix error about not being able to persist property 'hash' with incompatible - type when building for devices with Xcode 6. -* Fix spurious notifications of new versions of Realm. -* Fix for updating nested objects where some types do not have primary keys. -* Fix for inserting objects from JSON with NSNull values when default values - should be used. -* Trying to add a persisted RLMObject to a different Realm now throws an - exception rather than creating an uninitialized object. -* Fix validation errors when using IN on array properties. -* Fix errors when an IN clause has zero items. -* Fix for chained queries ignoring all but the last query's conditions. - -0.85.0 Release notes (2014-09-15) -============================================================= - -### API breaking changes - -* Notifications for a refresh being needed (when autorefresh is off) now send - the notification type RLMRealmRefreshRequiredNotification rather than - RLMRealmDidChangeNotification. - -### Enhancements - -* Updating to core library version 0.83.0. -* Support for primary key properties (for int and string columns). Declaring a property - to be the primary key ensures uniqueness for that property for all objects of a given type. - At the moment indexes on primary keys are not yet supported but this will be added in a future - release. -* Added methods to update or insert (upsert) for objects with primary keys defined. -* `[RLMObject initWithObject:]` and `[RLMObject createInRealmWithObject:]` now support - any object type with kvc properties. -* The Swift support has been reworked to work around Swift not being supported - in Frameworks on iOS 7. -* Improve performance when getting the count of items matching a query but not - reading any of the objects in the results. -* Add a return value to `-[RLMRealm refresh]` that indicates whether or not - there was anything to refresh. -* Add the class name to the error message when an RLMObject is missing a value - for a property without a default. -* Add support for opening Realms in read-only mode. -* Add an automatic check for updates when using Realm in a simulator (the - checker code is not compiled into device builds). This can be disabled by - setting the REALM_DISABLE_UPDATE_CHECKER environment variable to any value. -* Add support for Int16 and Int64 properties in Swift classes. - -### Bugfixes - -* Realm change notifications when beginning a write transaction are now sent - after updating rather than before, to match refresh. -* `-isEqual:` now uses the default `NSObject` implementation unless a primary key - is specified for an RLMObject. When a primary key is specified, `-isEqual:` calls - `-isEqualToObject:` and a corresponding implementation for `-hash` is also implemented. - -0.84.0 Release notes (2014-08-28) -============================================================= - -### API breaking changes - -* The timer used to trigger notifications has been removed. Notifications are now - only triggered by commits made in other threads, and can not currently be triggered - by changes made by other processes. Interprocess notifications will be re-added in - a future commit with an improved design. - -### Enhancements - -* Updating to core library version 0.82.2. -* Add property `deletedFromRealm` to RLMObject to indicate objects which have been deleted. -* Add support for the IN operator in predicates. -* Add support for the BETWEEN operator in link queries. -* Add support for multi-level link queries in predicates (e.g. `foo.bar.baz = 5`). -* Switch to building the SDK from source when using CocoaPods and add a - Realm.Headers subspec for use in targets that should not link a copy of Realm - (such as test targets). -* Allow unregistering from change notifications in the change notification - handler block. -* Significant performance improvements when holding onto large numbers of RLMObjects. -* Realm-Xcode6.xcodeproj now only builds using Xcode6-Beta6. -* Improved performance during RLMArray iteration, especially when mutating - contained objects. - -### Bugfixes - -* Fix crashes and assorted bugs when sorting or querying a RLMArray returned - from a query. -* Notifications are no longer sent when initializing new RLMRealm instances on background - threads. -* Handle object cycles in -[RLMObject description] and -[RLMArray description]. -* Lowered the deployment target for the Xcode 6 projects and Swift examples to - iOS 7.0, as they didn't actually require 8.0. -* Support setting model properties starting with the letter 'z' -* Fixed crashes that could result from switching between Debug and Relase - builds of Realm. - -0.83.0 Release notes (2014-08-13) -============================================================= - -### API breaking changes - -* Realm-Xcode6.xcodeproj now only builds using Xcode6-Beta5. -* Properties to be persisted in Swift classes must be explicitly declared as `dynamic`. -* Subclasses of RLMObject subclasses now throw an exception on startup, rather - than when added to a Realm. - -### Enhancements - -* Add support for querying for nil object properties. -* Improve error message when specifying invalid literals when creating or - initializing RLMObjects. -* Throw an exception when an RLMObject is used from the incorrect thread rather - than crashing in confusing ways. -* Speed up RLMRealm instantiation and array property iteration. -* Allow array and objection relation properties to be missing or null when - creating a RLMObject from a NSDictionary. - -### Bugfixes - -* Fixed a memory leak when querying for objects. -* Fixed initializing array properties on standalone Swift RLMObject subclasses. -* Fix for queries on 64bit integers. - -0.82.0 Release notes (2014-08-05) -============================================================= - -### API breaking changes - -* Realm-Xcode6.xcodeproj now only builds using Xcode6-Beta4. - -### Enhancements - -* Updating to core library version 0.80.5. -* Now support disabling the `autorefresh` property on RLMRealm instances. -* Building Realm-Xcode6 for iOS now builds a universal framework for Simulator & Device. -* Using NSNumber properties (unsupported) now throws a more informative exception. -* Added `[RLMRealm defaultRealmPath]` -* Proper implementation for [RLMArray indexOfObjectWhere:] -* The default Realm path on OS X is now ~/Library/Application Support/[bundle - identifier]/default.realm rather than ~/Documents -* We now check that the correct framework (ios or osx) is used at compile time. - -### Bugfixes - -* Fixed rapid growth of the realm file size. -* Fixed a bug which could cause a crash during RLMArray destruction after a query. -* Fixed bug related to querying on float properties: `floatProperty = 1.7` now works. -* Fixed potential bug related to the handling of array properties (RLMArray). -* Fixed bug where array properties accessed the wrong property. -* Fixed bug that prevented objects with custom getters to be added to a Realm. -* Fixed a bug where initializing a standalone object with an array literal would - trigger an exception. -* Clarified exception messages when using unsupported NSPredicate operators. -* Clarified exception messages when using unsupported property types on RLMObject subclasses. -* Fixed a memory leak when breaking out of a for-in loop on RLMArray. -* Fixed a memory leak when removing objects from a RLMArray property. -* Fixed a memory leak when querying for objects. - - -0.81.0 Release notes (2014-07-22) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Updating to core library version 0.80.3. -* Added support for basic querying of RLMObject and RLMArray properties (one-to-one and one-to-many relationships). - e.g. `[Person objectsWhere:@"dog.name == 'Alfonso'"]` or `[Person objectsWhere:@"ANY dogs.name == 'Alfonso'"]` - Supports all normal operators for numeric and date types. Does not support NSData properties or `BEGINSWITH`, `ENDSWITH`, `CONTAINS` - and other options for string properties. -* Added support for querying for object equality in RLMObject and RLMArray properties (one-to-one and one-to-many relationships). - e.g. `[Person objectsWhere:@"dog == %@", myDog]` `[Person objectsWhere:@"ANY dogs == %@", myDog]` `[Person objectsWhere:@"ANY friends.dog == %@", dog]` - Only supports comparing objects for equality (i.e. ==) -* Added a helper method to RLMRealm to perform a block inside a transaction. -* OSX framework now supported in CocoaPods. - -### Bugfixes - -* Fixed Unicode support in property names and string contents (Chinese, Russian, etc.). Closing #612 and #604. -* Fixed bugs related to migration when properties are removed. -* Fixed keyed subscripting for standalone RLMObjects. -* Fixed bug related to double clicking on a .realm file to launch the Realm Browser (thanks to Dean Moore). - - -0.80.0 Release notes (2014-07-15) -============================================================= - -### API breaking changes - -* Rename migration methods to -migrateDefaultRealmWithBlock: and -migrateRealmAtPath:withBlock: -* Moved Realm specific query methods from RLMRealm to class methods on RLMObject (-allObjects: to +allObjectsInRealm: ect.) - -### Enhancements - -* Added +createInDefaultRealmWithObject: method to RLMObject. -* Added support for array and object literals when calling -createWithObject: and -initWithObject: variants. -* Added method -deleteObjects: to batch delete objects from a Realm -* Support for defining RLMObject models entirely in Swift (experimental, see known issues). -* RLMArrays in Swift support Sequence-style enumeration (for obj in array). -* Implemented -indexOfObject: for RLMArray - -### Known Issues for Swift-defined models - -* Properties other than String, NSData and NSDate require a default value in the model. This can be an empty (but typed) array for array properties. -* The previous caveat also implies that not all models defined in Objective-C can be used for object properties. Only Objective-C models with only implicit (i.e. primitives) or explicit default values can be used. However, any Objective-C model object can be used in a Swift array property. -* Array property accessors don't work until its parent object has been added to a realm. -* Realm-Bridging-Header.h is temporarily exposed as a public header. This is temporary and will be private again once rdar://17633863 is fixed. -* Does not leverage Swift generics and still uses RLM-prefix everywhere. This is coming in #549. - - -0.22.0 Release notes -============================================================= - -### API breaking changes - -* Rename schemaForObject: to schemaForClassName: on RLMSchema -* Removed -objects:where: and -objects:orderedBy:where: from RLMRealm -* Removed -indexOfObjectWhere:, -objectsWhere: and -objectsOrderedBy:where: from RLMArray -* Removed +objectsWhere: and +objectsOrderedBy:where: from RLMObject - -### Enhancements - -* New Xcode 6 project for experimental swift support. -* New Realm Editor app for reading and editing Realm db files. -* Added support for migrations. -* Added support for RLMArray properties on objects. -* Added support for creating in-memory default Realm. -* Added -objectsWithClassName:predicateFormat: and -objectsWithClassName:predicate: to RLMRealm -* Added -indexOfObjectWithPredicateFormat:, -indexOfObjectWithPredicate:, -objectsWithPredicateFormat:, -objectsWithPredi -* Added +objectsWithPredicateFormat: and +objectsWithPredicate: to RLMObject -* Now allows predicates comparing two object properties of the same type. - - -0.20.0 Release notes (2014-05-28) -============================================================= - -Completely rewritten to be much more object oriented. - -### API breaking changes - -* Everything - -### Enhancements - -* None. - -### Bugfixes - -* None. - - -0.11.0 Release notes (not released) -============================================================= - -The Objective-C API has been updated and your code will break! - -### API breaking changes - -* `RLMTable` objects can only be created with an `RLMRealm` object. -* Renamed `RLMContext` to `RLMTransactionManager` -* Renamed `RLMContextDidChangeNotification` to `RLMRealmDidChangeNotification` -* Renamed `contextWithDefaultPersistence` to `managerForDefaultRealm` -* Renamed `contextPersistedAtPath:` to `managerForRealmWithPath:` -* Renamed `realmWithDefaultPersistence` to `defaultRealm` -* Renamed `realmWithDefaultPersistenceAndInitBlock` to `defaultRealmWithInitBlock` -* Renamed `find:` to `firstWhere:` -* Renamed `where:` to `allWhere:` -* Renamed `where:orderBy:` to `allWhere:orderBy:` - -### Enhancements - -* Added `countWhere:` on `RLMTable` -* Added `sumOfColumn:where:` on `RLMTable` -* Added `averageOfColumn:where:` on `RLMTable` -* Added `minOfProperty:where:` on `RLMTable` -* Added `maxOfProperty:where:` on `RLMTable` -* Added `toJSONString` on `RLMRealm`, `RLMTable` and `RLMView` -* Added support for `NOT` operator in predicates -* Added support for default values -* Added validation support in `createInRealm:withObject:` - -### Bugfixes - -* None. - - -0.10.0 Release notes (2014-04-23) -============================================================= - -TightDB is now Realm! The Objective-C API has been updated -and your code will break! - -### API breaking changes - -* All references to TightDB have been changed to Realm. -* All prefixes changed from `TDB` to `RLM`. -* `TDBTransaction` and `TDBSmartContext` have merged into `RLMRealm`. -* Write transactions now take an optional rollback parameter (rather than needing to return a boolean). -* `addColumnWithName:` and variant methods now return the index of the newly created column if successful, `NSNotFound` otherwise. - -### Enhancements - -* `createTableWithName:columns:` has been added to `RLMRealm`. -* Added keyed subscripting for RLMTable's first column if column is of type RLMPropertyTypeString. -* `setRow:atIndex:` has been added to `RLMTable`. -* `RLMRealm` constructors now have variants that take an writable initialization block -* New object interface - tables created/retrieved using `tableWithName:objectClass:` return custom objects - -### Bugfixes - -* None. - - -0.6.0 Release notes (2014-04-11) -============================================================= - -### API breaking changes - -* `contextWithPersistenceToFile:error:` renamed to `contextPersistedAtPath:error:` in `TDBContext` -* `readWithBlock:` renamed to `readUsingBlock:` in `TDBContext` -* `writeWithBlock:error:` renamed to `writeUsingBlock:error:` in `TDBContext` -* `readTable:withBlock:` renamed to `readTable:usingBlock:` in `TDBContext` -* `writeTable:withBlock:error:` renamed to `writeTable:usingBlock:error:` in `TDBContext` -* `findFirstRow` renamed to `indexOfFirstMatchingRow` on `TDBQuery`. -* `findFirstRowFromIndex:` renamed to `indexOfFirstMatchingRowFromIndex:` on `TDBQuery`. -* Return `NSNotFound` instead of -1 when appropriate. -* Renamed `castClass` to `castToTytpedTableClass` on `TDBTable`. -* `removeAllRows`, `removeRowAtIndex`, `removeLastRow`, `addRow` and `insertRow` methods - on table now return void instead of BOOL. - -### Enhancements -* A `TDBTable` can now be queried using `where:` and `where:orderBy:` taking - `NSPredicate` and `NSSortDescriptor` as arguments. -* Added `find:` method on `TDBTable` to find first row matching predicate. -* `contextWithDefaultPersistence` class method added to `TDBContext`. Will create a context persisted - to a file in app/documents folder. -* `renameColumnWithIndex:to:` has been added to `TDBTable`. -* `distinctValuesInColumnWithIndex` has been added to `TDBTable`. -* `dateIsBetween::`, `doubleIsBetween::`, `floatIsBetween::` and `intIsBetween::` - have been added to `TDBQuery`. -* Column names in Typed Tables can begin with non-capital letters too. The generated `addX` - selector can look odd. For example, a table with one column with name `age`, - appending a new row will look like `[table addage:7]`. -* Mixed typed values are better validated when rows are added, inserted, - or modified as object literals. -* `addRow`, `insertRow`, and row updates can be done using objects - derived from `NSObject`. -* `where` has been added to `TDBView`and `TDBViewProtocol`. -* Adding support for "smart" contexts (`TDBSmartContext`). - -### Bugfixes - -* Modifications of a `TDBView` and `TDBQuery` now throw an exception in a readtransaction. - - -0.5.0 Release notes (2014-04-02) -============================================================= - -The Objective-C API has been updated and your code will break! -Of notable changes a fast interface has been added. -This interface includes specific methods to get and set values into Tightdb. -To use these methods import ``. - -### API breaking changes - -* `getTableWithName:` renamed to `tableWithName:` in `TDBTransaction`. -* `addColumnWithName:andType:` renamed to `addColumnWithName:type:` in `TDBTable`. -* `columnTypeOfColumn:` renamed to `columnTypeOfColumnWithIndex` in `TDBTable`. -* `columnNameOfColumn:` renamed to `nameOfColumnWithIndex:` in `TDBTable`. -* `addColumnWithName:andType:` renamed to `addColumnWithName:type:` in `TDBDescriptor`. -* Fast getters and setters moved from `TDBRow.h` to `TDBRowFast.h`. - -### Enhancements - -* Added `minDateInColumnWithIndex` and `maxDateInColumnWithIndex` to `TDBQuery`. -* Transactions can now be started directly on named tables. -* You can create dynamic tables with initial schema. -* `TDBTable` and `TDBView` now have a shared protocol so they can easier be used interchangeably. - -### Bugfixes - -* Fixed bug in 64 bit iOS when inserting BOOL as NSNumber. - - -0.4.0 Release notes (2014-03-26) -============================================================= - -### API breaking changes - -* Typed interface Cursor has now been renamed to Row. -* TDBGroup has been renamed to TDBTransaction. -* Header files are renamed so names match class names. -* Underscore (_) removed from generated typed table classes. -* TDBBinary has been removed; use NSData instead. -* Underscope (_) removed from generated typed table classes. -* Constructor for TDBContext has been renamed to contextWithPersistenceToFile: -* Table findFirstRow and min/max/sum/avg operations has been hidden. -* Table.appendRow has been renamed to addRow. -* getOrCreateTable on Transaction has been removed. -* set*:inColumnWithIndex:atRowIndex: methods have been prefixed with TDB -* *:inColumnWithIndex:atRowIndex: methods have been prefixed with TDB -* addEmptyRow on table has been removed. Use [table addRow:nil] instead. -* TDBMixed removed. Use id and NSObject instead. -* insertEmptyRow has been removed from table. Use insertRow:nil atIndex:index instead. - -#### Enhancements - -* Added firstRow, lastRow selectors on view. -* firstRow and lastRow on table now return nil if table is empty. -* getTableWithName selector added on group. -* getting and creating table methods on group no longer take error argument. -* [TDBQuery parent] and [TDBQuery subtable:] selectors now return self. -* createTable method added on Transaction. Throws exception if table with same name already exists. -* Experimental support for pinning transactions on Context. -* TDBView now has support for object subscripting. - -### Bugfixes - -* None. - - -0.3.0 Release notes (2014-03-14) -============================================================= - -The Objective-C API has been updated and your code will break! - -### API breaking changes - -* Most selectors have been renamed in the binding! -* Prepend TDB-prefix on all classes and types. - -### Enhancements - -* Return types and parameters changed from size_t to NSUInteger. -* Adding setObject to TightdbTable (t[2] = @[@1, @"Hello"] is possible). -* Adding insertRow to TightdbTable. -* Extending appendRow to accept NSDictionary. - -### Bugfixes - -* None. - - -0.2.0 Release notes (2014-03-07) -============================================================= - -The Objective-C API has been updated and your code will break! - -### API breaking changes - -* addRow renamed to addEmptyRow - -### Enhancements - -* Adding a simple class for version numbering. -* Adding get-version and set-version targets to build.sh. -* tableview now supports sort on column with column type bool, date and int -* tableview has method for checking the column type of a specified column -* tableview has method for getting the number of columns -* Adding methods getVersion, getCoreVersion and isAtLeast. -* Adding appendRow to TightdbTable. -* Adding object subscripting. -* Adding method removeColumn on table. - -### Bugfixes - -* None. diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/NSError+RLMSync.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/NSError+RLMSync.h deleted file mode 100644 index 5ef323a24..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/NSError+RLMSync.h +++ /dev/null @@ -1,46 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2017 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@class RLMSyncErrorActionToken; - -/// NSError category extension providing methods to get data out of Realm's -/// "client reset" error. -@interface NSError (RLMSync) - -/** - Given an appropriate Atlas App Services error, return the token that - can be passed into `+[RLMSyncSession immediatelyHandleError:]` to - immediately perform error clean-up work, or nil if the error isn't of - a type that provides a token. - */ -- (nullable RLMSyncErrorActionToken *)rlmSync_errorActionToken NS_REFINED_FOR_SWIFT; - -/** - Given an Atlas App Services client reset error, return the path where the - backup copy of the Realm will be placed once the client reset process is - complete. - */ -- (nullable NSString *)rlmSync_clientResetBackedUpRealmPath NS_SWIFT_UNAVAILABLE(""); - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMAPIKeyAuth.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMAPIKeyAuth.h deleted file mode 100644 index 642bdd95d..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMAPIKeyAuth.h +++ /dev/null @@ -1,95 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMUserAPIKey, RLMObjectId; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// Provider client for user API keys. -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMAPIKeyAuth : RLMProviderClient - -/// A block type used to report an error -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMAPIKeyAuthOptionalErrorBlock)(NSError * _Nullable); - -/// A block type used to return an `RLMUserAPIKey` on success, or an `NSError` on failure -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMOptionalUserAPIKeyBlock)(RLMUserAPIKey * _Nullable, NSError * _Nullable); - -/// A block type used to return an array of `RLMUserAPIKey` on success, or an `NSError` on failure -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMUserAPIKeysBlock)(NSArray * _Nullable, NSError * _Nullable); - -/** - Creates a user API key that can be used to authenticate as the current user. - - @param name The name of the API key to be created. - @param completion A callback to be invoked once the call is complete. -*/ -- (void)createAPIKeyWithName:(NSString *)name - completion:(RLMOptionalUserAPIKeyBlock)completion NS_SWIFT_NAME(createAPIKey(named:completion:)); - -/** - Fetches a user API key associated with the current user. - - @param objectId The ObjectId of the API key to fetch. - @param completion A callback to be invoked once the call is complete. - */ -- (void)fetchAPIKey:(RLMObjectId *)objectId - completion:(RLMOptionalUserAPIKeyBlock)completion; - -/** - Fetches the user API keys associated with the current user. - - @param completion A callback to be invoked once the call is complete. - */ -- (void)fetchAPIKeysWithCompletion:(RLMUserAPIKeysBlock)completion; - -/** - Deletes a user API key associated with the current user. - - @param objectId The ObjectId of the API key to delete. - @param completion A callback to be invoked once the call is complete. - */ -- (void)deleteAPIKey:(RLMObjectId *)objectId - completion:(RLMAPIKeyAuthOptionalErrorBlock)completion; - -/** - Enables a user API key associated with the current user. - - @param objectId The ObjectId of the API key to enable. - @param completion A callback to be invoked once the call is complete. - */ -- (void)enableAPIKey:(RLMObjectId *)objectId - completion:(RLMAPIKeyAuthOptionalErrorBlock)completion; - -/** - Disables a user API key associated with the current user. - - @param objectId The ObjectId of the API key to disable. - @param completion A callback to be invoked once the call is complete. - */ -- (void)disableAPIKey:(RLMObjectId *)objectId - completion:(RLMAPIKeyAuthOptionalErrorBlock)completion; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMApp.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMApp.h deleted file mode 100644 index 2228232e8..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMApp.h +++ /dev/null @@ -1,235 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@protocol RLMNetworkTransport, RLMBSON; - -@class RLMUser, RLMCredentials, RLMSyncManager, RLMEmailPasswordAuth, RLMPushClient, RLMSyncTimeoutOptions; - -/// A block type used for APIs which asynchronously vend an `RLMUser`. -typedef void(^RLMUserCompletionBlock)(RLMUser * _Nullable, NSError * _Nullable); - -/// A block type used to report an error -typedef void(^RLMOptionalErrorBlock)(NSError * _Nullable); - -#pragma mark RLMAppConfiguration - -/// Properties representing the configuration of a client -/// that communicate with a particular Realm application. -@interface RLMAppConfiguration : NSObject - -/// A custom base URL to request against. -@property (nonatomic, strong, nullable) NSString *baseURL; - -/// The custom transport for network calls to the server. -@property (nonatomic, strong, nullable) id transport; - -/// :nodoc: -@property (nonatomic, strong, nullable) NSString *localAppName - __attribute__((deprecated("This field is not used"))); -/// :nodoc: -@property (nonatomic, strong, nullable) NSString *localAppVersion - __attribute__((deprecated("This field is not used"))); - -/// The default timeout for network requests. -@property (nonatomic, assign) NSUInteger defaultRequestTimeoutMS; - -/// If enabled (the default), a single connection is used for all Realms opened -/// with a single sync user. If disabled, a separate connection is used for each -/// Realm. -/// -/// Session multiplexing reduces resources used and typically improves -/// performance. When multiplexing is enabled, the connection is not immediately -/// closed when the last session is closed, and instead remains open for -/// ``RLMSyncTimeoutOptions.connectionLingerTime`` milliseconds (30 seconds by -/// default). -@property (nonatomic, assign) BOOL enableSessionMultiplexing; - -/** - Options for the assorted types of connection timeouts for sync connections. - - If nil default values for all timeouts are used instead. - */ -@property (nonatomic, nullable, copy) RLMSyncTimeoutOptions *syncTimeouts; - -/// :nodoc: -- (instancetype)initWithBaseURL:(nullable NSString *)baseURL - transport:(nullable id)transport - localAppName:(nullable NSString *)localAppName - localAppVersion:(nullable NSString *)localAppVersion -__attribute__((deprecated("localAppName and localAppVersion are unused"))); - -/// :nodoc: -- (instancetype)initWithBaseURL:(nullable NSString *) baseURL - transport:(nullable id)transport - localAppName:(nullable NSString *)localAppName - localAppVersion:(nullable NSString *)localAppVersion - defaultRequestTimeoutMS:(NSUInteger)defaultRequestTimeoutMS -__attribute__((deprecated("localAppName and localAppVersion are unused"))); - -/** -Create a new Realm App configuration. - -@param baseURL A custom base URL to request against. -@param transport A custom network transport. -*/ -- (instancetype)initWithBaseURL:(nullable NSString *)baseURL - transport:(nullable id)transport; - -/** - Create a new Realm App configuration. - - @param baseURL A custom base URL to request against. - @param transport A custom network transport. - @param defaultRequestTimeoutMS A custom default timeout for network requests. - */ -- (instancetype)initWithBaseURL:(nullable NSString *) baseURL - transport:(nullable id)transport - defaultRequestTimeoutMS:(NSUInteger)defaultRequestTimeoutMS; - -@end - -#pragma mark RLMApp - -/** - The `RLMApp` has the fundamental set of methods for communicating with a Realm - application backend. - - This interface provides access to login and authentication. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // internally thread-safe -@interface RLMApp : NSObject - -/// The configuration for this Realm app. -@property (nonatomic, readonly) RLMAppConfiguration *configuration; - -/// The `RLMSyncManager` for this Realm app. -@property (nonatomic, readonly) RLMSyncManager *syncManager; - -/// Get a dictionary containing all users keyed on id. -@property (nonatomic, readonly) NSDictionary *allUsers; - -/// Get the current user logged into the Realm app. -@property (nonatomic, readonly, nullable) RLMUser *currentUser; - -/// The app ID for this Realm app. -@property (nonatomic, readonly) NSString *appId; - -/** - A client for the email/password authentication provider which - can be used to obtain a credential for logging in. - - Used to perform requests specifically related to the email/password provider. -*/ -@property (nonatomic, readonly) RLMEmailPasswordAuth *emailPasswordAuth; - -/** - Get an application with a given appId and configuration. - - @param appId The unique identifier of your Realm app. - */ -+ (instancetype)appWithId:(NSString *)appId; - -/** - Get an application with a given appId and configuration. - - @param appId The unique identifier of your Realm app. - @param configuration A configuration object to configure this client. - */ -+ (instancetype)appWithId:(NSString *)appId - configuration:(nullable RLMAppConfiguration *)configuration; - -/** - Login to a user for the Realm app. - - @param credentials The credentials identifying the user. - @param completion A callback invoked after completion. - */ -- (void)loginWithCredential:(RLMCredentials *)credentials - completion:(RLMUserCompletionBlock)completion NS_REFINED_FOR_SWIFT; - -/** - Switches the active user to the specified user. - - This sets which user is used by all RLMApp operations which require a user. This is a local operation which does not access the network. - An exception will be throw if the user is not valid. The current user will remain logged in. - - @param syncUser The user to switch to. - @returns The user you intend to switch to - */ -- (RLMUser *)switchToUser:(RLMUser *)syncUser; - -/** - A client which can be used to register devices with the server to receive push notificatons - */ -- (RLMPushClient *)pushClientWithServiceName:(NSString *)serviceName - NS_SWIFT_NAME(pushClient(serviceName:)); - -/** - RLMApp instances are cached internally by Realm and cannot be created directly. - - Use `+[RLMRealm appWithId]` or `+[RLMRealm appWithId:configuration:]` - to obtain a reference to an RLMApp. - */ -- (instancetype)init __attribute__((unavailable("Use +appWithId or appWithId:configuration:."))); - -/** -RLMApp instances are cached internally by Realm and cannot be created directly. - -Use `+[RLMRealm appWithId]` or `+[RLMRealm appWithId:configuration:]` -to obtain a reference to an RLMApp. -*/ -+ (instancetype)new __attribute__((unavailable("Use +appWithId or appWithId:configuration:."))); - -@end - -#pragma mark - Sign In With Apple Extension - -API_AVAILABLE(ios(13.0), macos(10.15), tvos(13.0), watchos(6.0)) -/// Use this delegate to be provided a callback once authentication has succeed or failed -@protocol RLMASLoginDelegate - -/// Callback that is invoked should the authentication fail. -/// @param error An error describing the authentication failure. -- (void)authenticationDidFailWithError:(NSError *)error NS_SWIFT_NAME(authenticationDidComplete(error:)); - -/// Callback that is invoked should the authentication succeed. -/// @param user The newly authenticated user. -- (void)authenticationDidCompleteWithUser:(RLMUser *)user NS_SWIFT_NAME(authenticationDidComplete(user:)); - -@end - -API_AVAILABLE(ios(13.0), macos(10.15), tvos(13.0), watchos(6.0)) -/// Category extension that deals with Sign In With Apple authentication. -/// This is only available on OS's that support `AuthenticationServices` -@interface RLMApp (ASLogin) - -/// Use this delegate to be provided a callback once authentication has succeed or failed. -@property (nonatomic, weak, nullable) id authorizationDelegate; - -/// Sets the ASAuthorizationControllerDelegate to be handled by `RLMApp` -/// @param controller The ASAuthorizationController in which you want `RLMApp` to consume its delegate. -- (void)setASAuthorizationControllerDelegateForController:(ASAuthorizationController *)controller NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMArray.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMArray.h deleted file mode 100644 index b2c6c1664..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMArray.h +++ /dev/null @@ -1,652 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObject, RLMResults; - -/** - `RLMArray` is the container type in Realm used to define to-many relationships. - - Unlike an `NSArray`, `RLMArray`s hold a single type, specified by the `objectClassName` property. - This is referred to in these docs as the “type” of the array. - - When declaring an `RLMArray` property, the type must be marked as conforming to a - protocol by the same name as the objects it should contain (see the - `RLM_COLLECTION_TYPE` macro). In addition, the property can be declared using Objective-C - generics for better compile-time type safety. - - RLM_COLLECTION_TYPE(ObjectType) - ... - @property RLMArray *arrayOfObjectTypes; - - `RLMArray`s can be queried with the same predicates as `RLMObject` and `RLMResult`s. - - `RLMArray`s cannot be created directly. `RLMArray` properties on `RLMObject`s are - lazily created when accessed, or can be obtained by querying a Realm. - - ### Key-Value Observing - - `RLMArray` supports array key-value observing on `RLMArray` properties on `RLMObject` - subclasses, and the `invalidated` property on `RLMArray` instances themselves is - key-value observing compliant when the `RLMArray` is attached to a managed - `RLMObject` (`RLMArray`s on unmanaged `RLMObject`s will never become invalidated). - - Because `RLMArray`s are attached to the object which they are a property of, they - do not require using the mutable collection proxy objects from - `-mutableArrayValueForKey:` or KVC-compatible mutation methods on the containing - object. Instead, you can call the mutation methods on the `RLMArray` directly. - */ - -@interface RLMArray : NSObject - -#pragma mark - Properties - -/** - The number of objects in the array. - */ -@property (nonatomic, readonly, assign) NSUInteger count; - -/** - The type of the objects in the array. - */ -@property (nonatomic, readonly, assign) RLMPropertyType type; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readonly, getter = isOptional) BOOL optional; - -/** - The class name of the objects contained in the array. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages the array. Returns `nil` for unmanaged arrays. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - Indicates if the array can no longer be accessed. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if the array is frozen. - - Frozen arrays are immutable and can be accessed from any thread. Frozen arrays - are created by calling `-freeze` on a managed live array. Unmanaged arrays are - never frozen. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Accessing Objects from an Array - -/** - Returns the object at the index specified. - - @param index The index to look up. - - @return An object of the type contained in the array. - */ -- (RLMObjectType)objectAtIndex:(NSUInteger)index; - -/** - Returns an array containing the objects in the array at the indexes specified by a given index set. - `nil` will be returned if the index set contains an index out of the arrays bounds. - - @param indexes The indexes in the array to retrieve objects from. - - @return The objects at the specified indexes. - */ -- (nullable NSArray *)objectsAtIndexes:(NSIndexSet *)indexes; - -/** - Returns the first object in the array. - - Returns `nil` if called on an empty array. - - @return An object of the type contained in the array. - */ -- (nullable RLMObjectType)firstObject; - -/** - Returns the last object in the array. - - Returns `nil` if called on an empty array. - - @return An object of the type contained in the array. - */ -- (nullable RLMObjectType)lastObject; - - - -#pragma mark - Adding, Removing, and Replacing Objects in an Array - -/** - Adds an object to the end of the array. - - @warning This method may only be called during a write transaction. - - @param object An object of the type contained in the array. - */ -- (void)addObject:(RLMObjectType)object; - -/** - Adds an array of objects to the end of the array. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable object such as `NSArray` or `RLMResults` which contains objects of the - same class as the array. - */ -- (void)addObjects:(id)objects; - -/** - Inserts an object at the given index. - - Throws an exception if the index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param anObject An object of the type contained in the array. - @param index The index at which to insert the object. - */ -- (void)insertObject:(RLMObjectType)anObject atIndex:(NSUInteger)index; - -/** - Removes an object at the given index. - - Throws an exception if the index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param index The array index identifying the object to be removed. - */ -- (void)removeObjectAtIndex:(NSUInteger)index; - -/** - Removes the last object in the array. - - This is a no-op if the array is already empty. - - @warning This method may only be called during a write transaction. -*/ -- (void)removeLastObject; - -/** - Removes all objects from the array. - - @warning This method may only be called during a write transaction. - */ -- (void)removeAllObjects; - -/** - Replaces an object at the given index with a new object. - - Throws an exception if the index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param index The index of the object to be replaced. - @param anObject An object (of the same type as returned from the `objectClassName` selector). - */ -- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(RLMObjectType)anObject; - -/** - Moves the object at the given source index to the given destination index. - - Throws an exception if the index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param sourceIndex The index of the object to be moved. - @param destinationIndex The index to which the object at `sourceIndex` should be moved. - */ -- (void)moveObjectAtIndex:(NSUInteger)sourceIndex toIndex:(NSUInteger)destinationIndex; - -/** - Exchanges the objects in the array at given indices. - - Throws an exception if either index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param index1 The index of the object which should replace the object at index `index2`. - @param index2 The index of the object which should replace the object at index `index1`. - */ -- (void)exchangeObjectAtIndex:(NSUInteger)index1 withObjectAtIndex:(NSUInteger)index2; - -#pragma mark - Querying an Array - -/** - Returns the index of an object in the array. - - Returns `NSNotFound` if the object is not found in the array. - - @param object An object (of the same type as returned from the `objectClassName` selector). - */ -- (NSUInteger)indexOfObject:(RLMObjectType)object; - -/** - Returns the index of the first object in the array matching the predicate. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return The index of the object, or `NSNotFound` if the object is not found in the array. - */ -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns the index of the first object in the array matching the predicate. - - @param predicate The predicate with which to filter the objects. - - @return The index of the object, or `NSNotFound` if the object is not found in the array. - */ -- (NSUInteger)indexOfObjectWithPredicate:(NSPredicate *)predicate; - -/** - Returns all the objects matching the given predicate in the array. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` of objects that match the given predicate. - */ -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all the objects matching the given predicate in the array. - - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` of objects that match the given predicate - */ -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/** - Returns a sorted `RLMResults` from the array. - - @param keyPath The key path to sort by. - @param ascending The direction to sort in. - - @return An `RLMResults` sorted by the specified key path. - */ -- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a sorted `RLMResults` from the array. - - @param properties An array of `RLMSortDescriptor`s to sort by. - - @return An `RLMResults` sorted by the specified properties. - */ -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/** - Returns a distinct `RLMResults` from the array. - - @param keyPaths The key paths to distinct on. - - @return An `RLMResults` with the distinct values of the keypath(s). - */ -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -/// :nodoc: -- (RLMObjectType)objectAtIndexedSubscript:(NSUInteger)index; - -/// :nodoc: -- (void)setObject:(RLMObjectType)newValue atIndexedSubscript:(NSUInteger)index; - -#pragma mark - Sectioning an Array - -/** - Sorts and sections this collection from a given property key path, returning the result - as an instance of `RLMSectionedResults`. - - @param keyPath The property key path to sort on. - @param ascending The direction to sort in. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsSortedUsingKeyPath:(NSString *)keyPath - ascending:(BOOL)ascending - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -/** - Sorts and sections this collection from a given array of sort descriptors, returning the result - as an instance of `RLMSectionedResults`. - - @param sortDescriptors An array of `RLMSortDescriptor`s to sort by. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @note The primary sort descriptor must be responsible for determining the section key. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsUsingSortDescriptors:(NSArray *)sortDescriptors - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - - -#pragma mark - Notifications - -/** - Registers a block to be called each time the array changes. - - The block will be asynchronously called with the initial array, and then - called again after each write transaction which changes any of the objects in - the array, which objects are in the results, or the order of the objects in the - array. - - The `changes` parameter will be `nil` the first time the block is called. For - each call after that, it will contain information about which rows in the - array were added, removed or modified. If a write transaction did not modify - any objects in the array, the block is not called at all. See the - `RLMCollectionChange` documentation for information on how the changes are - reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - Person *person = [[Person allObjectsInRealm:realm] firstObject]; - NSLog(@"person.dogs.count: %zu", person.dogs.count); // => 0 - self.token = [person.dogs addNotificationBlock(RLMArray *dogs, - RLMCollectionChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count) // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - [person.dogs addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a non-frozen managed array. - - @param block The block to be called each time the array changes. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMArray *_Nullable array, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the array changes. - - The block will be asynchronously called with the initial array, and then - called again after each write transaction which changes any of the objects in - the array, which objects are in the results, or the order of the objects in the - array. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the array were added, removed or modified. If a write transaction - did not modify any objects in the array, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMArray *_Nullable array, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the array changes. - - The block will be asynchronously called with the initial array, and then - called again after each write transaction which changes any of the objects in - the array, which objects are in the results, or the order of the objects in the - array. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the array were added, removed or modified. If a write transaction - did not modify any objects in the array, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMArray *_Nullable array, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the array changes. - - The block will be asynchronously called with the initial array, and then - called again after each write transaction which changes any of the objects in - the array, which objects are in the results, or the order of the objects in the - array. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the array were added, removed or modified. If a write transaction - did not modify any objects in the array, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMArray *_Nullable array, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths -__attribute__((warn_unused_result)); - -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the objects in the array. - - NSNumber *min = [object.arrayProperty minOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The minimum value of the property, or `nil` if the array is empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects in the array. - - NSNumber *max = [object.arrayProperty maxOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose maximum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The maximum value of the property, or `nil` if the array is empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of the values of a given property over all the objects in the array. - - NSNumber *sum = [object.arrayProperty sumOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose values should be summed. Only properties of - types `int`, `float`, and `double` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects in the array. - - NSNumber *average = [object.arrayProperty averageOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose average value should be calculated. Only - properties of types `int`, `float`, and `double` are supported. - - @return The average value of the given property, or `nil` if the array is empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this array. - - The frozen copy is an immutable array which contains the same data as this - array currently contains, but will not update when writes are made to the - containing Realm. Unlike live arrays, frozen arrays can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a managed array. - @warning Holding onto a frozen array for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -#pragma mark - Unavailable Methods - -/** - `-[RLMArray init]` is not available because `RLMArray`s cannot be created directly. - `RLMArray` properties on `RLMObject`s are lazily created when accessed. - */ -- (instancetype)init __attribute__((unavailable("RLMArrays cannot be created directly"))); - -/** - `+[RLMArray new]` is not available because `RLMArray`s cannot be created directly. - `RLMArray` properties on `RLMObject`s are lazily created when accessed. - */ -+ (instancetype)new __attribute__((unavailable("RLMArrays cannot be created directly"))); - -@end - -/// :nodoc: -@interface RLMArray (Swift) -// for use only in Swift class definitions -- (instancetype)initWithObjectClassName:(NSString *)objectClassName; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMAsymmetricObject.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMAsymmetricObject.h deleted file mode 100644 index 09deb787e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMAsymmetricObject.h +++ /dev/null @@ -1,98 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2022 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectSchema, RLMPropertyDescriptor, RLMRealm; -/** - `RLMAsymmetricObject` is a base class used to define asymmetric Realm objects. - - Asymmetric objects can only be created using the `createInRealm:` - function, and cannot be added, removed or queried. - When created, asymmetric objects will be synced unidirectionally to the MongoDB - database and cannot be accessed locally. - - Linking an asymmetric object within an `Object` is not allowed and will throw an error. - - The property types supported on `RLMAsymmetricObject` are the same as for `RLMObject`, - except for that asymmetric objects can only link to embedded objects, so `RLMObject` - and `RLMArray` properties are not supported (`RLMEmbeddedObject` and - `RLMArray` *are*). - */ -@interface RLMAsymmetricObject : RLMObjectBase - -#pragma mark - Creating & Initializing Objects - -/** - Creates an unmanaged instance of a Realm object. - */ -- (instancetype)init NS_DESIGNATED_INITIALIZER; - -/** - Creates an unmanaged instance of a Realm object. - - Pass in an `NSArray` or `NSDictionary` instance to set the values of the object's properties. - */ -- (instancetype)initWithValue:(id)value; - -/** - Returns the class name for a Realm object subclass. - - @warning Do not override. Realm relies on this method returning the exact class - name. - - @return The class name for the model class. - */ -+ (NSString *)className; - -/** - Creates an Asymmetric object, which will be synced unidirectionally and - cannot be queried locally. - - Objects created using this method will not be added to the Realm. - - @warning This method may only be called during a write transaction. - @warning This method always returns nil. - - @param realm The Realm to be used to create the asymmetric object.. - @param value The value used to populate the object. - - @return Returns `nil` - */ -+ (instancetype)createInRealm:(RLMRealm *)realm withValue:(id)value; - -#pragma mark - Properties - -/** - The object schema which lists the managed properties for the object. - */ -@property (nonatomic, readonly) RLMObjectSchema *objectSchema; - -#pragma mark - Dynamic Accessors - -/// :nodoc: -- (nullable id)objectForKeyedSubscript:(NSString *)key; - -/// :nodoc: -- (void)setObject:(nullable id)obj forKeyedSubscript:(NSString *)key; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMAsyncTask.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMAsyncTask.h deleted file mode 100644 index 9f7dc58da..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMAsyncTask.h +++ /dev/null @@ -1,67 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A task object which can be used to observe or cancel an async open. - - When a synchronized Realm is opened asynchronously, the latest state of the - Realm is downloaded from the server before the completion callback is invoked. - This task object can be used to observe the state of the download or to cancel - it. This should be used instead of trying to observe the download via the sync - session as the sync session itself is created asynchronously, and may not exist - yet when -[RLMRealm asyncOpenWithConfiguration:completion:] returns. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMAsyncOpenTask : NSObject -/** - Register a progress notification block. - - Each registered progress notification block is called whenever the sync - subsystem has new progress data to report until the task is either cancelled - or the completion callback is called. Progress notifications are delivered on - the main queue. - */ -- (void)addProgressNotificationBlock:(RLMProgressNotificationBlock)block; - -/** - Register a progress notification block which is called on the given queue. - - Each registered progress notification block is called whenever the sync - subsystem has new progress data to report until the task is either cancelled - or the completion callback is called. Progress notifications are delivered on - the supplied queue. - */ -- (void)addProgressNotificationOnQueue:(dispatch_queue_t)queue - block:(RLMProgressNotificationBlock)block; - -/** - Cancel the asynchronous open. - - Any download in progress will be cancelled, and the completion block for this - async open will never be called. If multiple async opens on the same Realm are - happening concurrently, all other opens will fail with the error "operation cancelled". - */ -- (void)cancel; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMBSON.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMBSON.h deleted file mode 100644 index 41750fd57..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMBSON.h +++ /dev/null @@ -1,174 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -#pragma mark RLMBSONType - -/** - Allowed BSON types. - */ -typedef NS_ENUM(NSUInteger, RLMBSONType) { - /// BSON Null type - RLMBSONTypeNull, - /// BSON Int32 type - RLMBSONTypeInt32, - /// BSON Int64 type - RLMBSONTypeInt64, - /// BSON Bool type - RLMBSONTypeBool, - /// BSON Double type - RLMBSONTypeDouble, - /// BSON String type - RLMBSONTypeString, - /// BSON Binary type - RLMBSONTypeBinary, - /// BSON Timestamp type - RLMBSONTypeTimestamp, - /// BSON Datetime type - RLMBSONTypeDatetime, - /// BSON ObjectId type - RLMBSONTypeObjectId, - /// BSON Decimal128 type - RLMBSONTypeDecimal128, - /// BSON RegularExpression type - RLMBSONTypeRegularExpression, - /// BSON MaxKey type - RLMBSONTypeMaxKey, - /// BSON MinKey type - RLMBSONTypeMinKey, - /// BSON Document type - RLMBSONTypeDocument, - /// BSON Array type - RLMBSONTypeArray, - /// BSON UUID type - RLMBSONTypeUUID -}; - -#pragma mark RLMBSON - -/** - Protocol representing a BSON value. BSON is a computer data interchange format. - The name "BSON" is based on the term JSON and stands for "Binary JSON". - - The following types conform to RLMBSON: - - `NSNull` - `NSNumber` - `NSString` - `NSData` - `NSDateInterval` - `NSDate` - `RLMObjectId` - `RLMDecimal128` - `NSRegularExpression` - `RLMMaxKey` - `RLMMinKey` - `NSDictionary` - `NSArray` - `NSUUID` - - @see RLMBSONType - @see bsonspec.org - */ -@protocol RLMBSON - -/** - The BSON type for the conforming interface. - */ -@property (readonly) RLMBSONType bsonType NS_REFINED_FOR_SWIFT; - -/** - Whether or not this BSON is equal to another. - - @param other The BSON to compare to - */ -- (BOOL)isEqual:(_Nullable id)other; - -@end - -/// :nodoc: -@interface NSNull (RLMBSON) -@end - -/// :nodoc: -@interface NSNumber (RLMBSON) -@end - -/// :nodoc: -@interface NSString (RLMBSON) -@end - -/// :nodoc: -@interface NSData (RLMBSON) -@end - -/// :nodoc: -@interface NSDateInterval (RLMBSON) -@end - -/// :nodoc: -@interface NSDate (RLMBSON) -@end - -/// :nodoc: -@interface RLMObjectId (RLMBSON) -@end - -/// :nodoc: -@interface RLMDecimal128 (RLMBSON) -@end - -/// :nodoc: -@interface NSRegularExpression (RLMBSON) -@end - -/// MaxKey will always be the greatest value when comparing to other BSON types -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMMaxKey : NSObject -@end - -/// MinKey will always be the smallest value when comparing to other BSON types -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMMinKey : NSObject -@end - -/// :nodoc: -@interface RLMMaxKey (RLMBSON) -@end - -/// :nodoc: -@interface RLMMinKey (RLMBSON) -@end - -/// :nodoc: -@interface NSDictionary (RLMBSON) -@end - -/// :nodoc: -@interface NSMutableArray (RLMBSON) -@end - -/// :nodoc: -@interface NSArray (RLMBSON) -@end - -/// :nodoc: -@interface NSUUID (RLMBSON) -@end diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMCollection.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMCollection.h deleted file mode 100644 index eac117f17..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMCollection.h +++ /dev/null @@ -1,613 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@protocol RLMValue; -@class RLMRealm, RLMResults, RLMSortDescriptor, RLMNotificationToken, RLMCollectionChange, RLMSectionedResults; -typedef RLM_CLOSED_ENUM(int32_t, RLMPropertyType); -/// A callback which is invoked on each element in the Results collection which returns the section key. -typedef id _Nullable(^RLMSectionedResultsKeyBlock)(id); - -/** - A homogenous collection of Realm-managed objects. Examples of conforming types - include `RLMArray`, `RLMSet`, `RLMResults`, and `RLMLinkingObjects`. - */ -@protocol RLMCollection - -#pragma mark - Properties - -/** - The number of objects in the collection. - */ -@property (nonatomic, readonly) NSUInteger count; - -/** - The type of the objects in the collection. - */ -@property (nonatomic, readonly) RLMPropertyType type; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readonly, getter = isOptional) BOOL optional; - -/** - The class name of the objects contained in the collection. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages this collection, if any. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - Indicates if the collection is no longer valid. - - The collection becomes invalid if `invalidate` is called on the managing - Realm. Unmanaged collections are never invalidated. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -#pragma mark - Accessing Objects from a Collection - -/** - Returns the object at the index specified. - - @param index The index to look up. - - @return An object of the type contained in the collection. - */ -- (id)objectAtIndex:(NSUInteger)index; - -@optional - -/** - Returns an array containing the objects in the collection at the indexes - specified by a given index set. `nil` will be returned if the index set - contains an index out of the collections bounds. - - @param indexes The indexes in the collection to retrieve objects from. - - @return The objects at the specified indexes. - */ -- (nullable NSArray *)objectsAtIndexes:(NSIndexSet *)indexes; - -/** - Returns the first object in the collection. - - RLMSet is not ordered, and so for sets this will return an arbitrary object in - the set. It is not guaraneed to be a different object from what `lastObject` - gives even if the set has multiple objects in it. - - Returns `nil` if called on an empty collection. - - @return An object of the type contained in the collection. - */ -- (nullable id)firstObject; - -/** - Returns the last object in the collection. - - RLMSet is not ordered, and so for sets this will return an arbitrary object in - the set. It is not guaraneed to be a different object from what `firstObject` - gives even if the set has multiple objects in it. - - Returns `nil` if called on an empty collection. - - @return An object of the type contained in the collection. - */ -- (nullable id)lastObject; - -/// :nodoc: -- (id)objectAtIndexedSubscript:(NSUInteger)index; - -/** - Returns the index of an object in the collection. - - Returns `NSNotFound` if the object is not found in the collection. - - @param object An object (of the same type as returned from the `objectClassName` selector). - */ -- (NSUInteger)indexOfObject:(id)object; - -/** - Returns the index of the first object in the collection matching the predicate. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return The index of the object, or `NSNotFound` if the object is not found in the collection. - */ -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns the index of the first object in the collection matching the predicate. - - @param predicate The predicate with which to filter the objects. - - @return The index of the object, or `NSNotFound` if the object is not found in the collection. - */ -- (NSUInteger)indexOfObjectWithPredicate:(NSPredicate *)predicate; - -@required - -#pragma mark - Querying a Collection - -/** - Returns all objects matching the given predicate in the collection. - - This is only supported for managed collections. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - @return An `RLMResults` containing objects that match the given predicate. - */ -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all objects matching the given predicate in the collection. - - This is only supported for managed collections. - - @param predicate The predicate with which to filter the objects. - @return An `RLMResults` containing objects that match the given predicate. - */ -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/** - Returns a sorted `RLMResults` from the collection. - - This is only supported for managed collections. - - @param keyPath The keyPath to sort by. - @param ascending The direction to sort in. - @return An `RLMResults` sorted by the specified key path. - */ -- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a sorted `RLMResults` from the collection. - - This is only supported for managed collections. - - @param properties An array of `RLMSortDescriptor`s to sort by. - @return An `RLMResults` sorted by the specified properties. - */ -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/** - Returns a distinct `RLMResults` from the collection. - - This is only supported for managed collections. - - @param keyPaths The key paths used produce distinct results - @return An `RLMResults` made distinct based on the specified key paths - */ -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -/** - Returns an `NSArray` containing the results of invoking `valueForKey:` using - `key` on each of the collection's objects. - - @param key The name of the property. - - @return An `NSArray` containing results. - */ -- (nullable id)valueForKey:(NSString *)key; - -/** - Returns the value for the derived property identified by a given key path. - - @param keyPath A key path of the form relationship.property (with one or more relationships). - - @return The value for the derived property identified by keyPath. - */ -- (nullable id)valueForKeyPath:(NSString *)keyPath; - -/** - Invokes `setValue:forKey:` on each of the collection's objects using the specified `value` and `key`. - - @warning This method may only be called during a write transaction. - - @param value The object value. - @param key The name of the property. - */ -- (void)setValue:(nullable id)value forKey:(NSString *)key; - -#pragma mark - Notifications - -/** -Registers a block to be called each time the collection changes. - -The block will be asynchronously called with the initial collection, -and then called again after each write transaction which changes either any -of the objects in the collection, or which objects are in the collection. - -The `change` parameter will be `nil` the first time the block is called. -For each call after that, it will contain information about -which rows in the collection were added, removed or modified. If a -write transaction did not modify any objects in the results collection, -the block is not called at all. See the `RLMCollectionChange` documentation for -information on how the changes are reported and an example of updating a -`UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - -At the time when the block is called, the collection object will be fully -evaluated and up-to-date, and as long as you do not perform a write transaction -on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will -never perform blocking work. - -Notifications are delivered via the standard run loop, and so can't be -delivered while the run loop is blocked by other activity. When -notifications can't be delivered instantly, multiple notifications may be -coalesced into a single notification. This can include the notification -with the initial results. For example, the following code performs a write -transaction immediately after adding the notification block, so there is no -opportunity for the initial notification to be delivered first. As a -result, the initial notification will reflect the state of the Realm after -the write transaction. - - RLMResults *results = [Dog allObjects]; - NSLog(@"dogs.count: %zu", dogs.count); // => 0 - self.token = [results addNotificationBlock:^(RLMResults *dogs, - RLMCollectionChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - [realm addObject:dog]; - }]; - // end of run loop execution context - -You must retain the returned token for as long as you want updates to continue -to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - -@warning This method cannot be called during a write transaction, or when the - containing Realm is read-only or frozen. - -@param block The block to be called whenever a change occurs. -@return A token which must be held for as long as you want updates to be delivered. -*/ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** -Registers a block to be called each time the collection changes. - -The block will be asynchronously called with the initial collection, -and then called again after each write transaction which changes either any -of the objects in the collection, or which objects are in the collection. - -The `change` parameter will be `nil` the first time the block is called. -For each call after that, it will contain information about -which rows in the collection were added, removed or modified. If a -write transaction did not modify any objects in the results collection, -the block is not called at all. See the `RLMCollectionChange` documentation for -information on how the changes are reported and an example of updating a -`UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - -At the time when the block is called, the collection object will be fully -evaluated and up-to-date, and as long as you do not perform a write transaction -on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will -never perform blocking work. - -Notifications are delivered on the given queue. If the queue is blocked and -notifications can't be delivered instantly, multiple notifications may be -coalesced into a single notification. - -You must retain the returned token for as long as you want updates to continue -to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - -@warning This method cannot be called when the containing Realm is read-only or frozen. -@warning The queue must be a serial queue. - -@param block The block to be called whenever a change occurs. -@param queue The serial queue to deliver notifications to. -@return A token which must be held for as long as you want updates to be delivered. -*/ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** -Registers a block to be called each time the collection changes. - -The block will be asynchronously called with the initial collection, -and then called again after each write transaction which changes either any -of the objects in the collection, or which objects are in the collection. - -The `change` parameter will be `nil` the first time the block is called. -For each call after that, it will contain information about -which rows in the collection were added, removed or modified. If a -write transaction did not modify any objects in the results collection, -the block is not called at all. See the `RLMCollectionChange` documentation for -information on how the changes are reported and an example of updating a -`UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - -At the time when the block is called, the collection object will be fully -evaluated and up-to-date, and as long as you do not perform a write transaction -on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will -never perform blocking work. - -Notifications are delivered on the given queue. If the queue is blocked and -notifications can't be delivered instantly, multiple notifications may be -coalesced into a single notification. - -You must retain the returned token for as long as you want updates to continue -to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - -@warning This method cannot be called when the containing Realm is read-only or frozen. -@warning The queue must be a serial queue. - -@param block The block to be called whenever a change occurs. -@param queue The serial queue to deliver notifications to. -@param keyPaths The block will be called for changes occurring on these keypaths. If no -key paths are given, notifications are delivered for every property key path. -@return A token which must be held for as long as you want updates to be delivered. -*/ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -#pragma mark - Sectioned Results - -/** - Sorts and sections this collection from a given property key path, returning the result - as an instance of `RLMSectionedResults`. - - @param keyPath The property key path to sort on. - @param ascending The direction to sort in. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsSortedUsingKeyPath:(NSString *)keyPath - ascending:(BOOL)ascending - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -/** - Sorts and sections this collection from a given array of sort descriptors, returning the result - as an instance of `RLMSectionedResults`. - - @param sortDescriptors An array of `RLMSortDescriptor`s to sort by. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @note The primary sort descriptor must be responsible for determining the section key. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsUsingSortDescriptors:(NSArray *)sortDescriptors - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the objects - in the collection. - - NSNumber *min = [results minOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The minimum value of the property, or `nil` if the Results are empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects - in the collection. - - NSNumber *max = [results maxOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose maximum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The maximum value of the property, or `nil` if the Results are empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of the values of a given property over all the objects in the collection. - - NSNumber *sum = [results sumOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose values should be summed. Only properties of - types `int`, `float`, and `double` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects in the collection. - - NSNumber *average = [results averageOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose average value should be calculated. Only - properties of types `int`, `float`, and `double` are supported. - - @return The average value of the given property, or `nil` if the Results are empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -#pragma mark - Freeze - -/** - Indicates if the collection is frozen. - - Frozen collections are immutable and can be accessed from any thread. The - objects read from a frozen collection will also be frozen. - */ -@property (nonatomic, readonly, getter=isFrozen) BOOL frozen; - -/** - Returns a frozen (immutable) snapshot of this collection. - - The frozen copy is an immutable collection which contains the same data as - this collection currently contains, but will not update when writes are made - to the containing Realm. Unlike live collections, frozen collections can be - accessed from any thread. - - @warning This method cannot be called during a write transaction, or when the containing Realm is read-only. - @warning Holding onto a frozen collection for an extended period while - performing write transaction on the Realm may result in the Realm - file growing to large sizes. See - `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -@end - -/** - An `RLMSortDescriptor` stores a property name and a sort order for use with - `sortedResultsUsingDescriptors:`. It is similar to `NSSortDescriptor`, but supports - only the subset of functionality which can be efficiently run by Realm's query - engine. - - `RLMSortDescriptor` instances are immutable. - */ -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMSortDescriptor : NSObject - -#pragma mark - Properties - -/** - The key path which the sort descriptor orders results by. - */ -@property (nonatomic, readonly) NSString *keyPath; - -/** - Whether the descriptor sorts in ascending or descending order. - */ -@property (nonatomic, readonly) BOOL ascending; - -#pragma mark - Methods - -/** - Returns a new sort descriptor for the given key path and sort direction. - */ -+ (instancetype)sortDescriptorWithKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a copy of the receiver with the sort direction reversed. - */ -- (instancetype)reversedSortDescriptor; - -@end - -/** - A `RLMCollectionChange` object encapsulates information about changes to collections - that are reported by Realm notifications. - - `RLMCollectionChange` is passed to the notification blocks registered with - `-addNotificationBlock` on `RLMArray` and `RLMResults`, and reports what rows in the - collection changed since the last time the notification block was called. - - The change information is available in two formats: a simple array of row - indices in the collection for each type of change, and an array of index paths - in a requested section suitable for passing directly to `UITableView`'s batch - update methods. A complete example of updating a `UITableView` named `tv`: - - [tv beginUpdates]; - [tv deleteRowsAtIndexPaths:[changes deletionsInSection:0] withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv insertRowsAtIndexPaths:[changes insertionsInSection:0] withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv reloadRowsAtIndexPaths:[changes modificationsInSection:0] withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv endUpdates]; - - All of the arrays in an `RLMCollectionChange` are always sorted in ascending order. - */ -@interface RLMCollectionChange : NSObject -/// The indices of objects in the previous version of the collection which have -/// been removed from this one. -@property (nonatomic, readonly) NSArray *deletions; - -/// The indices in the new version of the collection which were newly inserted. -@property (nonatomic, readonly) NSArray *insertions; - -/** - The indices in the new version of the collection which were modified. - - For `RLMResults`, this means that one or more of the properties of the object at - that index were modified (or an object linked to by that object was - modified). - - For `RLMArray`, the array itself being modified to contain a - different object at that index will also be reported as a modification. - */ -@property (nonatomic, readonly) NSArray *modifications; - -/// Returns the index paths of the deletion indices in the given section. -- (NSArray *)deletionsInSection:(NSUInteger)section; - -/// Returns the index paths of the insertion indices in the given section. -- (NSArray *)insertionsInSection:(NSUInteger)section; - -/// Returns the index paths of the modification indices in the given section. -- (NSArray *)modificationsInSection:(NSUInteger)section; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMConstants.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMConstants.h deleted file mode 100644 index 0bc8db972..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMConstants.h +++ /dev/null @@ -1,156 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#define RLM_HEADER_AUDIT_BEGIN NS_HEADER_AUDIT_BEGIN -#define RLM_HEADER_AUDIT_END NS_HEADER_AUDIT_END - -#define RLM_SWIFT_SENDABLE NS_SWIFT_SENDABLE - -#define RLM_FINAL __attribute__((objc_subclassing_restricted)) - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -// Swift 5 considers NS_ENUM to be "open", meaning there could be values present -// other than the defined cases (which allows adding more cases later without -// it being a breaking change), while older versions consider it "closed". -#ifdef NS_CLOSED_ENUM -#define RLM_CLOSED_ENUM NS_CLOSED_ENUM -#else -#define RLM_CLOSED_ENUM NS_ENUM -#endif - -#if __has_attribute(ns_error_domain) && (!defined(__cplusplus) || !__cplusplus || __cplusplus >= 201103L) -#define RLM_ERROR_ENUM(type, name, domain) \ - _Pragma("clang diagnostic push") \ - _Pragma("clang diagnostic ignored \"-Wignored-attributes\"") \ - NS_ENUM(type, __attribute__((ns_error_domain(domain))) name) \ - _Pragma("clang diagnostic pop") -#else -#define RLM_ERROR_ENUM(type, name, domain) NS_ENUM(type, name) -#endif - -#define RLM_HIDDEN __attribute__((visibility("hidden"))) -#define RLM_VISIBLE __attribute__((visibility("default"))) -#define RLM_HIDDEN_BEGIN _Pragma("GCC visibility push(hidden)") -#define RLM_HIDDEN_END _Pragma("GCC visibility pop") -#define RLM_DIRECT __attribute__((objc_direct)) -#define RLM_DIRECT_MEMBERS __attribute__((objc_direct_members)) - -#pragma mark - Enums - -/** - `RLMPropertyType` is an enumeration describing all property types supported in Realm models. - - For more information, see [Realm Models](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/object-models-and-schemas/). - */ -typedef RLM_CLOSED_ENUM(int32_t, RLMPropertyType) { - -#pragma mark - Primitive types - /** Integers: `NSInteger`, `int`, `long`, `Int` (Swift) */ - RLMPropertyTypeInt = 0, - /** Booleans: `BOOL`, `bool`, `Bool` (Swift) */ - RLMPropertyTypeBool = 1, - /** Floating-point numbers: `float`, `Float` (Swift) */ - RLMPropertyTypeFloat = 5, - /** Double-precision floating-point numbers: `double`, `Double` (Swift) */ - RLMPropertyTypeDouble = 6, - /** NSUUID, UUID */ - RLMPropertyTypeUUID = 12, - -#pragma mark - Object types - - /** Strings: `NSString`, `String` (Swift) */ - RLMPropertyTypeString = 2, - /** Binary data: `NSData` */ - RLMPropertyTypeData = 3, - /** Any type: `id`, `AnyRealmValue` (Swift) */ - RLMPropertyTypeAny = 9, - /** Dates: `NSDate` */ - RLMPropertyTypeDate = 4, - -#pragma mark - Linked object types - - /** Realm model objects. See [Realm Models](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/object-models-and-schemas/) for more information. */ - RLMPropertyTypeObject = 7, - /** Realm linking objects. See [Realm Models](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/relationships/#inverse-relationship) for more information. */ - RLMPropertyTypeLinkingObjects = 8, - - RLMPropertyTypeObjectId = 10, - RLMPropertyTypeDecimal128 = 11 -}; - -#pragma mark - Notification Constants - -/** - A notification indicating that changes were made to a Realm. -*/ -typedef NSString * RLMNotification NS_EXTENSIBLE_STRING_ENUM; - -/** - This notification is posted when a write transaction has been committed to a Realm on a different thread for - the same file. - - It is not posted if `autorefresh` is enabled, or if the Realm is refreshed before the notification has a chance - to run. - - Realms with autorefresh disabled should normally install a handler for this notification which calls - `-[RLMRealm refresh]` after doing some work. Refreshing the Realm is optional, but not refreshing the Realm may lead to - large Realm files. This is because an extra copy of the data must be kept for the stale Realm. - */ -extern RLMNotification const RLMRealmRefreshRequiredNotification NS_SWIFT_NAME(RefreshRequired); - -/** - This notification is posted by a Realm when a write transaction has been - committed to a Realm on a different thread for the same file. - - It is not posted if `-[RLMRealm autorefresh]` is enabled, or if the Realm is - refreshed before the notification has a chance to run. - - Realms with autorefresh disabled should normally install a handler for this - notification which calls `-[RLMRealm refresh]` after doing some work. Refreshing - the Realm is optional, but not refreshing the Realm may lead to large Realm - files. This is because Realm must keep an extra copy of the data for the stale - Realm. - */ -extern RLMNotification const RLMRealmDidChangeNotification NS_SWIFT_NAME(DidChange); - -#pragma mark - Error keys - -/** Key to identify the associated backup Realm configuration in an error's `userInfo` dictionary */ -extern NSString * const RLMBackupRealmConfigurationErrorKey; - -#pragma mark - Other Constants - -/** The schema version used for uninitialized Realms */ -extern const uint64_t RLMNotVersioned; - -/** The corresponding value is the name of an exception thrown by Realm. */ -extern NSString * const RLMExceptionName; - -/** The corresponding value is a Realm file version. */ -extern NSString * const RLMRealmVersionKey; - -/** The corresponding key is the version of the underlying database engine. */ -extern NSString * const RLMRealmCoreVersionKey; - -/** The corresponding key is the Realm invalidated property name. */ -extern NSString * const RLMInvalidatedKey; - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMCredentials.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMCredentials.h deleted file mode 100644 index adff4e7e9..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMCredentials.h +++ /dev/null @@ -1,126 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) -@protocol RLMBSON; - -/// A token representing an identity provider's credentials. -typedef NSString *RLMCredentialsToken; - -/// A type representing the unique identifier of an Atlas App Services identity provider. -typedef NSString *RLMIdentityProvider NS_EXTENSIBLE_STRING_ENUM; - -/// The username/password identity provider. User accounts are handled by Atlas App Services directly without the -/// involvement of a third-party identity provider. -extern RLMIdentityProvider const RLMIdentityProviderUsernamePassword; - -/// A Facebook account as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderFacebook; - -/// A Google account as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderGoogle; - -/// An Apple account as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderApple; - -/// A JSON Web Token as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderJWT; - -/// An Anonymous account as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderAnonymous; - -/// An Realm Cloud function as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderFunction; - -/// A user api key as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderUserAPIKey; - -/// A server api key as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderServerAPIKey; - -/** - Opaque credentials representing a specific Realm App user. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMCredentials : NSObject - -/// The name of the identity provider which generated the credentials token. -@property (nonatomic, readonly) RLMIdentityProvider provider; - -/** - Construct and return credentials from a Facebook account token. - */ -+ (instancetype)credentialsWithFacebookToken:(RLMCredentialsToken)token; - -/** - Construct and return credentials from a Google account token. - */ -+ (instancetype)credentialsWithGoogleAuthCode:(RLMCredentialsToken)token; - -/** - Construct and return credentials from a Google id token. - */ -+ (instancetype)credentialsWithGoogleIdToken:(RLMCredentialsToken)token; - -/** - Construct and return credentials from an Apple account token. - */ -+ (instancetype)credentialsWithAppleToken:(RLMCredentialsToken)token; - -/** - Construct and return credentials for an Atlas App Services function using a mongodb document as a json payload. -*/ -+ (instancetype)credentialsWithFunctionPayload:(NSDictionary> *)payload; - -/** - Construct and return credentials from a user api key. -*/ -+ (instancetype)credentialsWithUserAPIKey:(NSString *)apiKey; - -/** - Construct and return credentials from a server api key. -*/ -+ (instancetype)credentialsWithServerAPIKey:(NSString *)apiKey; - -/** - Construct and return Atlas App Services credentials from an email and password. - */ -+ (instancetype)credentialsWithEmail:(NSString *)email - password:(NSString *)password; - -/** - Construct and return credentials from a JSON Web Token. - */ -+ (instancetype)credentialsWithJWT:(NSString *)token; - -/** - Construct and return anonymous credentials - */ -+ (instancetype)anonymousCredentials; - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("RLMAppCredentials cannot be created directly"))); - -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("RLMAppCredentials cannot be created directly"))); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMDecimal128.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMDecimal128.h deleted file mode 100644 index f6224bbf2..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMDecimal128.h +++ /dev/null @@ -1,110 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A 128-bit IEEE 754-2008 decimal floating point number. - - This type is similar to Swift's built-in Decimal type, but allocates bits - differently, resulting in a different representable range. (NS)Decimal stores a - significand of up to 38 digits long and an exponent from -128 to 127, while - this type stores up to 34 digits of significand and an exponent from -6143 to - 6144. - */ -RLM_SWIFT_SENDABLE // immutable -@interface RLMDecimal128 : NSObject -/// Creates a new zero-initialized decimal128. -- (instancetype)init; - -/// Converts the given value to a RLMDecimal128. -/// -/// The following types can be converted to RLMDecimal128: -/// - NSNumber -/// - NSString -/// - NSDecimalNumber -/// -/// Passing a value with a type not in this list is a fatal error. Passing a -/// string which cannot be parsed as a valid Decimal128 is a fatal error. -- (instancetype)initWithValue:(id)value; - -/// Converts the given number to a RLMDecimal128. -- (instancetype)initWithNumber:(NSNumber *)number; - -/// Parses the given string to a RLMDecimal128. -/// -/// Returns a decimal where `isNaN` is `YES` if the string cannot be parsed as a decimal. `error` is never set -/// and this will never actually return `nil`. -- (nullable instancetype)initWithString:(NSString *)string error:(NSError **)error; - -/// Converts the given number to a RLMDecimal128. -+ (instancetype)decimalWithNumber:(NSNumber *)number; - -/// The minimum value for RLMDecimal128. -@property (class, readonly, copy) RLMDecimal128 *minimumDecimalNumber NS_REFINED_FOR_SWIFT; - -/// The maximum value for RLMDecimal128. -@property (class, readonly, copy) RLMDecimal128 *maximumDecimalNumber NS_REFINED_FOR_SWIFT; - -/// Convert this value to a double. This is a lossy conversion. -@property (nonatomic, readonly) double doubleValue; - -/// Convert this value to a NSDecimal. This may be a lossy conversion. -@property (nonatomic, readonly) NSDecimal decimalValue; - -/// Convert this value to a string. -@property (nonatomic, readonly) NSString *stringValue; - -/// Gets if this Decimal128 represents a NaN value. -@property (nonatomic, readonly) BOOL isNaN; - -/// The magnitude of this RLMDecimal128. -@property (nonatomic, readonly) RLMDecimal128 *magnitude NS_REFINED_FOR_SWIFT; - -/// Replaces this RLMDecimal128 value with its additive inverse. -- (void)negate; - -/// Adds the right hand side to the current value and returns the result. -- (RLMDecimal128 *)decimalNumberByAdding:(RLMDecimal128 *)decimalNumber; - -/// Divides the right hand side to the current value and returns the result. -- (RLMDecimal128 *)decimalNumberByDividingBy:(RLMDecimal128 *)decimalNumber; - -/// Subtracts the right hand side to the current value and returns the result. -- (RLMDecimal128 *)decimalNumberBySubtracting:(RLMDecimal128 *)decimalNumber; - -/// Multiply the right hand side to the current value and returns the result. -- (RLMDecimal128 *)decimalNumberByMultiplyingBy:(RLMDecimal128 *)decimalNumber; - -/// Comparision operator to check if the right hand side is greater than the current value. -- (BOOL)isGreaterThan:(nullable RLMDecimal128 *)decimalNumber; - -/// Comparision operator to check if the right hand side is greater than or equal to the current value. -- (BOOL)isGreaterThanOrEqualTo:(nullable RLMDecimal128 *)decimalNumber; - -/// Comparision operator to check if the right hand side is less than the current value. -- (BOOL)isLessThan:(nullable RLMDecimal128 *)decimalNumber; - -/// Comparision operator to check if the right hand side is less than or equal to the current value. -- (BOOL)isLessThanOrEqualTo:(nullable RLMDecimal128 *)decimalNumber; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMDictionary.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMDictionary.h deleted file mode 100644 index 9c8cac538..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMDictionary.h +++ /dev/null @@ -1,559 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObject, RLMResults, RLMDictionaryChange; - -/** - `RLMDictionary` is a container type in Realm representing a dynamic collection of key-value pairs. - - Unlike `NSDictionary`, `RLMDictionary`s hold a single key and value type. - This is referred to in these docs as the “type” and “keyType” of the dictionary. - - When declaring an `RLMDictionary` property, the object type and keyType must be marked as conforming to a - protocol by the same name as the objects it should contain. - - RLM_COLLECTION_TYPE(ObjectType) - ... - @property RLMDictionary *objectTypeDictionary; - - `RLMDictionary`s can be queried with the same predicates as `RLMObject` and `RLMResult`s. - - `RLMDictionary`s cannot be created directly. `RLMDictionary` properties on `RLMObject`s are - lazily created when accessed, or can be obtained by querying a Realm. - - `RLMDictionary` only supports `NSString` as a key. Realm disallows the use of `.` or `$` characters within a dictionary key. - - ### Key-Value Observing - - `RLMDictionary` supports dictionary key-value observing on `RLMDictionary` properties on `RLMObject` - subclasses, and the `invalidated` property on `RLMDictionary` instances themselves is - key-value observing compliant when the `RLMDictionary` is attached to a managed - `RLMObject` (`RLMDictionary`s on unmanaged `RLMObject`s will never become invalidated). - */ -@interface RLMDictionary: NSObject - -#pragma mark - Properties - -/** - The number of entries in the dictionary. - */ -@property (nonatomic, readonly, assign) NSUInteger count; - -/** - The type of the objects in the dictionary. - */ -@property (nonatomic, readonly, assign) RLMPropertyType type; - -/** - The type of the key used in this dictionary. - */ -@property (nonatomic, readonly, assign) RLMPropertyType keyType; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readonly, getter = isOptional) BOOL optional; - -/** - The class name of the objects contained in the dictionary. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages the dictionary. Returns `nil` for unmanaged dictionary. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - Indicates if the dictionary can no longer be accessed. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if the dictionary is frozen. - - Frozen dictionaries are immutable and can be accessed from any thread. Frozen dictionaries - are created by calling `-freeze` on a managed live dictionary. Unmanaged dictionaries are - never frozen. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Accessing Objects from a Dictionary - -/** - Returns the value associated with a given key. - - @param key The name of the property. - - @discussion If key does not start with “@”, invokes object(forKey:). If key does start - with “@”, strips the “@” and invokes [super valueForKey:] with the rest of the key. - - @return A value associated with a given key or `nil`. - */ -- (nullable id)valueForKey:(nonnull RLMKeyType)key; - -/** - Returns an array containing the dictionary’s keys. - - @note The order of the elements in the array is not defined. - */ -@property(readonly, copy) NSArray *allKeys; - -/** - Returns an array containing the dictionary’s values. - - @note The order of the elements in the array is not defined. - */ -@property(readonly, copy) NSArray *allValues; - -/** - Returns the value associated with a given key. - - @note `nil` will be returned if no value is associated with a given key. NSNull will be returned - where null is associated with the key. - - @param key The key for which to return the corresponding value. - - @return The value associated with key. - */ -- (nullable RLMObjectType)objectForKey:(nonnull RLMKeyType)key; - -/** - Returns the value associated with a given key. - - @note `nil` will be returned if no value is associated with a given key. NSNull will be returned - where null is associated with the key. - - @param key The key for which to return the corresponding value. - - @return The value associated with key. - */ -- (nullable RLMObjectType)objectForKeyedSubscript:(RLMKeyType)key; - -/** - Applies a given block object to the each key-value pair of the dictionary. - - @param block A block object to operate on entries in the dictionary. - - @note If the block sets *stop to YES, the enumeration stops. - */ -- (void)enumerateKeysAndObjectsUsingBlock:(void (^)(RLMKeyType key, RLMObjectType obj, BOOL *stop))block; - -#pragma mark - Adding, Removing, and Replacing Objects in a Dictionary - -/** - Replace the contents of a dictionary with the contents of another dictionary - NSDictionary or RLMDictionary. - - This will remove all elements in this dictionary and then apply each element from the given dictionary. - - @warning This method may only be called during a write transaction. - @warning If otherDictionary is self this will result in an empty dictionary. - */ -- (void)setDictionary:(id)otherDictionary; - -/** - Removes all contents in the dictionary. - - @warning This method may only be called during a write transaction. - */ -- (void)removeAllObjects; - -/** - Removes from the dictionary entries specified by elements in a given array. If a given key does not - exist, no mutation will happen for that key. - - @warning This method may only be called during a write transaction. - */ -- (void)removeObjectsForKeys:(NSArray *)keyArray; - -/** - Removes a given key and its associated value from the dictionary. If the key does not exist the dictionary - will not be modified. - - @warning This method may only be called during a write transaction. - */ -- (void)removeObjectForKey:(RLMKeyType)key; - -/** - Adds a given key-value pair to the dictionary if the key is not present, or updates the value for the given key - if the key already present. - - @warning This method may only be called during a write transaction. - */ -- (void)setObject:(nullable RLMObjectType)obj forKeyedSubscript:(RLMKeyType)key; - -/** - Adds a given key-value pair to the dictionary if the key is not present, or updates the value for the given key - if the key already present. - - @warning This method may only be called during a write transaction. - */ -- (void)setObject:(nullable RLMObjectType)anObject forKey:(RLMKeyType)aKey; - -/** - Adds to the receiving dictionary the entries from another dictionary. - - @note If the receiving dictionary contains the same key(s) as the otherDictionary, then - the receiving dictionary will update each key-value pair for the matching key. - - @warning This method may only be called during a write transaction. - - @param otherDictionary An enumerable object such as `NSDictionary` or `RLMDictionary` which contains objects of the - same type as the receiving dictionary. - */ -- (void)addEntriesFromDictionary:(id )otherDictionary; - -#pragma mark - Querying a Dictionary - -/** - Returns all the values matching the given predicate in the dictionary. - - @note The keys in the dictionary are ignored when quering values, and they will not be returned in the `RLMResults`. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` of objects that match the given predicate. - */ -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all the values matching the given predicate in the dictionary. - - @note The keys in the dictionary are ignored when quering values, and they will not be returned in the `RLMResults`. - - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` of objects that match the given predicate - */ -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/** - Returns a sorted RLMResults of all values in the dictionary. - - @note The keys in the dictionary are ignored when sorting values, and they will not be returned in the `RLMResults`. - - @param keyPath The key path to sort by. - @param ascending The direction to sort in. - - @return An `RLMResults` sorted by the specified key path. - */- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a sorted RLMResults of all values in the dictionary. - - @note The keys in the dictionary are ignored when sorting values, and they will not be returned in the `RLMResults`. - - @param properties An array of `RLMSortDescriptor`s to sort by. - - @return An `RLMResults` sorted by the specified properties. - */ -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/** - Returns a distinct `RLMResults` from all values in the dictionary. - - @note The keys in the dictionary are ignored, and they will not be returned in the `RLMResults`. - - @param keyPaths The key paths to distinct on. - - @return An `RLMResults` with the distinct values of the keypath(s). - */ -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the values in the dictionary. - - NSNumber *min = [object.dictionaryProperty minOfProperty:@"age"]; - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, `NSDate`, `RLMValue` and `RLMDecimal128` are supported. - - @return The minimum value of the property, or `nil` if the dictionary is empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects in the dictionary. - - NSNumber *max = [object.dictionaryProperty maxOfProperty:@"age"]; - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, `NSDate`, `RLMValue` and `RLMDecimal128` are supported. - - @return The maximum value of the property, or `nil` if the dictionary is empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of distinct values of a given property over all the objects in the dictionary. - - NSNumber *sum = [object.dictionaryProperty sumOfProperty:@"age"]; - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, `RLMValue` and `RLMDecimal128` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects in the dictionary. - - NSNumber *average = [object.dictionaryProperty averageOfProperty:@"age"]; - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, `NSDate`, `RLMValue` and `RLMDecimal128` are supported. - - @return The average value of the given property, or `nil` if the dictionary is empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -#pragma mark - Notifications - -/** - Registers a block to be called each time the dictionary changes. - - The block will be asynchronously called with the initial dictionary, and then - called again after each write transaction which changes any of the keys or values - within the dictionary. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which keys in the dictionary were added, modified or deleted. If a write transaction - did not modify any keys or values in the dictionary, the block is not called at all. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - Person *person = [[Person allObjectsInRealm:realm] firstObject]; - NSLog(@"person.dogs.count: %zu", person.dogs.count); // => 0 - self.token = [person.dogs addNotificationBlock(RLMDictionary *dogs, - RLMDictionaryChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - person.dogs[@"frenchBulldog"] = dog; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a non-frozen managed dictionary. - - @param block The block to be called each time the dictionary changes. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMDictionary *_Nullable dictionary, - RLMDictionaryChange *_Nullable changes, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the dictionary changes. - - The block will be asynchronously called with the initial dictionary, and then - called again after each write transaction which changes any of the key-value in - the dictionary or which objects are in the results. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which keys in the dictionary were added or modified. If a write transaction - did not modify any objects in the dictionary, the block is not called at all. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMDictionary *_Nullable dictionary, - RLMDictionaryChange *_Nullable changes, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the dictionary changes. - - The block will be asynchronously called with the initial dictionary, and then - called again after each write transaction which changes any of the key-value in - the dictionary or which objects are in the results. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which keys in the dictionary were added or modified. If a write transaction - did not modify any objects in the dictionary, the block is not called at all. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMDictionary *_Nullable dictionary, - RLMDictionaryChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the dictionary changes. - - The block will be asynchronously called with the initial dictionary, and then - called again after each write transaction which changes any of the key-value in - the dictionary or which objects are in the results. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which keys in the dictionary were added or modified. If a write transaction - did not modify any objects in the dictionary, the block is not called at all. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMDictionary *_Nullable dictionary, - RLMDictionaryChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths -__attribute__((warn_unused_result)); - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of a dictionary. - - The frozen copy is an immutable dictionary which contains the same data as this - dictionary currently contains, but will not update when writes are made to the - containing Realm. Unlike live dictionaries, frozen dictionaries can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a managed dictionary. - @warning Holding onto a frozen dictionary for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -#pragma mark - Unavailable Methods -/** - `-[RLMDictionary init]` is not available because `RLMDictionary`s cannot be created directly. - `RLMDictionary` properties on `RLMObject`s are lazily created when accessed. - */ -- (instancetype)init __attribute__((unavailable("RLMDictionary cannot be created directly"))); -/** - `+[RLMDictionary new]` is not available because `RLMDictionary`s cannot be created directly. - `RLMDictionary` properties on `RLMObject`s are lazily created when accessed. - */ -+ (instancetype)new __attribute__((unavailable("RLMDictionary cannot be created directly"))); - -@end - -/** - A `RLMDictionaryChange` object encapsulates information about changes to dictionaries - that are reported by Realm notifications. - - `RLMDictionaryChange` is passed to the notification blocks registered with - `-addNotificationBlock` on `RLMDictionary`, and reports what keys in the - dictionary changed since the last time the notification block was called. - */ -@interface RLMDictionaryChange : NSObject -/// The keys in the new version of the dictionary which were newly inserted. -@property (nonatomic, readonly) NSArray *insertions; - -/// The keys in the new version of the dictionary which were modified. -@property (nonatomic, readonly) NSArray *modifications; - -/// The keys which were deleted from the old version. -@property (nonatomic, readonly) NSArray *deletions; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMEmailPasswordAuth.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMEmailPasswordAuth.h deleted file mode 100644 index 748eb26af..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMEmailPasswordAuth.h +++ /dev/null @@ -1,120 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@protocol RLMBSON; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// A block type used to report an error -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMEmailPasswordAuthOptionalErrorBlock)(NSError * _Nullable); - -/** - A client for the email/password authentication provider which - can be used to obtain a credential for logging in, - and to perform requests specifically related to the email/password provider. -*/ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMEmailPasswordAuth : RLMProviderClient - -/** - Registers a new email identity with the email/password provider, - and sends a confirmation email to the provided address. - - @param email The email address of the user to register. - @param password The password that the user created for the new email/password identity. - @param completionHandler A callback to be invoked once the call is complete. -*/ - -- (void)registerUserWithEmail:(NSString *)email - password:(NSString *)password - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler NS_SWIFT_NAME(registerUser(email:password:completion:)); - -/** - Confirms an email identity with the email/password provider. - - @param token The confirmation token that was emailed to the user. - @param tokenId The confirmation token id that was emailed to the user. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)confirmUser:(NSString *)token - tokenId:(NSString *)tokenId - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Re-sends a confirmation email to a user that has registered but - not yet confirmed their email address. - - @param email The email address of the user to re-send a confirmation for. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)resendConfirmationEmail:(NSString *)email - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Retries custom confirmation function for a given email address. - - @param email The email address of the user to retry custom confirmation logic. - @param completionHandler A callback to be invoked once the call is complete. - */ -- (void)retryCustomConfirmation:(NSString *)email - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Sends a password reset email to the given email address. - - @param email The email address of the user to send a password reset email for. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)sendResetPasswordEmail:(NSString *)email - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Resets the password of an email identity using the - password reset token emailed to a user. - - @param password The new password. - @param token The password reset token that was emailed to the user. - @param tokenId The password reset token id that was emailed to the user. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)resetPasswordTo:(NSString *)password - token:(NSString *)token - tokenId:(NSString *)tokenId - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Resets the password of an email identity using the - password reset function set up in the application. - - @param email The email address of the user. - @param password The desired new password. - @param args A list of arguments passed in as a BSON array. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)callResetPasswordFunction:(NSString *)email - password:(NSString *)password - args:(NSArray> *)args - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMEmbeddedObject.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMEmbeddedObject.h deleted file mode 100644 index 4db6248ca..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMEmbeddedObject.h +++ /dev/null @@ -1,367 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectSchema, RLMPropertyDescriptor, RLMRealm, RLMNotificationToken, RLMPropertyChange; -typedef void (^RLMObjectChangeBlock)(BOOL deleted, - NSArray *_Nullable changes, - NSError *_Nullable error); -/** - `RLMEmbeddedObject` is a base class used to define Realm model objects. - - Embedded objects work similarly to normal objects, but are owned by a single - parent Object (which itself may be embedded). Unlike normal top-level objects, - embedded objects cannot be directly created in or added to a Realm. Instead, - they can only be created as part of a parent object, or by assigning an - unmanaged object to a parent object's property. Embedded objects are - automatically deleted when the parent object is deleted or when the parent is - modified to no longer point at the embedded object, either by reassigning an - RLMObject property or by removing the embedded object from the array containing - it. - - Embedded objects can only ever have a single parent object which links to them, - and attempting to link to an existing managed embedded object will throw an - exception. - - The property types supported on `RLMEmbeddedObject` are the same as for - `RLMObject`, except for that embedded objects cannot link to top-level objects, - so `RLMObject` and `RLMArray` properties are not supported - (`RLMEmbeddedObject` and `RLMArray` *are*). - - Embedded objects cannot have primary keys or indexed properties. - */ - -@interface RLMEmbeddedObject : RLMObjectBase - -#pragma mark - Creating & Initializing Objects - -/** - Creates an unmanaged instance of a Realm object. - - Unmanaged embedded objects can be added to a Realm by assigning them to an - object property of a managed Realm object or by adding them to a managed - RLMArray. - */ -- (instancetype)init NS_DESIGNATED_INITIALIZER; - -/** - Creates an unmanaged instance of a Realm object. - - Pass in an `NSArray` or `NSDictionary` instance to set the values of the object's properties. - - Unmanaged embedded objects can be added to a Realm by assigning them to an - object property of a managed Realm object or by adding them to a managed - RLMArray. - */ -- (instancetype)initWithValue:(id)value; - -/** - Returns the class name for a Realm object subclass. - - @warning Do not override. Realm relies on this method returning the exact class - name. - - @return The class name for the model class. - */ -+ (NSString *)className; - -#pragma mark - Properties - -/** - The Realm which manages the object, or `nil` if the object is unmanaged. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - The object schema which lists the managed properties for the object. - */ -@property (nonatomic, readonly) RLMObjectSchema *objectSchema; - -/** - Indicates if the object can no longer be accessed because it is now invalid. - - An object can no longer be accessed if the object has been deleted from the Realm that manages it, or - if `invalidate` is called on that Realm. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if this object is frozen. - - @see `-[RLMEmbeddedObject freeze]` - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Customizing your Objects - -/** - Override this method to specify the default values to be used for each property. - - @return A dictionary mapping property names to their default values. - */ -+ (nullable NSDictionary *)defaultPropertyValues; - -/** - Override this method to specify the names of properties to ignore. These properties will not be managed by the Realm - that manages the object. - - @return An array of property names to ignore. - */ -+ (nullable NSArray *)ignoredProperties; - -/** - Override this method to specify the names of properties that are non-optional (i.e. cannot be assigned a `nil` value). - - By default, all properties of a type whose values can be set to `nil` are - considered optional properties. To require that an object in a Realm always - store a non-`nil` value for a property, add the name of the property to the - array returned from this method. - - Properties of `RLMEmbeddedObject` type cannot be non-optional. Array and - `NSNumber` properties can be non-optional, but there is no reason to do so: - arrays do not support storing nil, and if you want a non-optional number you - should instead use the primitive type. - - @return An array of property names that are required. - */ -+ (NSArray *)requiredProperties; - -/** - Override this method to provide information related to properties containing linking objects. - - Each property of type `RLMLinkingObjects` must have a key in the dictionary returned by this method consisting - of the property name. The corresponding value must be an instance of `RLMPropertyDescriptor` that describes the class - and property that the property is linked to. - - return @{ @"owners": [RLMPropertyDescriptor descriptorWithClass:Owner.class propertyName:@"dogs"] }; - - @return A dictionary mapping property names to `RLMPropertyDescriptor` instances. - */ -+ (NSDictionary *)linkingObjectsProperties; - -#pragma mark - Notifications - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in differen - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When notifications - can't be delivered instantly, multiple notifications may be coalesced into a - single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - - @param block The block to be called whenever a change occurs. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block queue:(dispatch_queue_t)queue; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block keyPaths:(NSArray *)keyPaths queue:(dispatch_queue_t)queue; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block keyPaths:(NSArray *)keyPaths; - -#pragma mark - Other Instance Methods - -/** - Returns YES if another Realm object instance points to the same object as the - receiver in the Realm managing the receiver. - - For frozen objects and object types with a primary key, `isEqual:` is - overridden to use the same logic as this method (along with a corresponding - implementation for `hash`). Non-frozen objects without primary keys use - pointer identity for `isEqual:` and `hash`. - - @param object The object to compare the receiver to. - - @return Whether the object represents the same object as the receiver. - */ -- (BOOL)isEqualToObject:(RLMEmbeddedObject *)object; - -/** - Returns a frozen (immutable) snapshot of this object. - - The frozen copy is an immutable object which contains the same data as this - object currently contains, but will not update when writes are made to the - containing Realm. Unlike live objects, frozen objects can be accessed from any - thread. - - - warning: Holding onto a frozen object for an extended period while performing write - transaction on the Realm may result in the Realm file growing to large sizes. See - `Realm.Configuration.maximumNumberOfActiveVersions` for more information. - - warning: This method can only be called on a managed object. - */ -- (instancetype)freeze NS_RETURNS_RETAINED; - -/** - Returns a live (mutable) reference of this object. - - This method creates a managed accessor to a live copy of the same frozen object. - Will return self if called on an already live object. - */ -- (instancetype)thaw; - -#pragma mark - Dynamic Accessors - -/// :nodoc: -- (nullable id)objectForKeyedSubscript:(NSString *)key; - -/// :nodoc: -- (void)setObject:(nullable id)obj forKeyedSubscript:(NSString *)key; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMError.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMError.h deleted file mode 100644 index 514ceee3f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMError.h +++ /dev/null @@ -1,442 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2022 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@protocol RLMValue; - -#pragma mark - Error Domains - -/** Error code is a value from the RLMError enum. */ -extern NSString *const RLMErrorDomain; - -/** An error domain identifying non-specific system errors. */ -extern NSString *const RLMUnknownSystemErrorDomain; - -/** - The error domain string for all SDK errors related to errors reported - by the synchronization manager error handler, as well as general sync - errors that don't fall into any of the other categories. - */ -extern NSString *const RLMSyncErrorDomain; - -/** - The error domain string for all SDK errors related to the authentication - endpoint. - */ -extern NSString *const RLMSyncAuthErrorDomain; - -/** -The error domain string for all SDK errors related to the Atlas App Services -endpoint. -*/ -extern NSString *const RLMAppErrorDomain; - -#pragma mark - RLMError - -/// A user info key containing the error code. This is provided for backwards -/// compatibility only and should not be used. -extern NSString *const RLMErrorCodeKey __attribute((deprecated("use -[NSError code]"))); - -/// A user info key containing the name of the error code. This is for -/// debugging purposes only and should not be relied on. -extern NSString *const RLMErrorCodeNameKey; - -/// A user info key present in sync errors which originate from the server, -/// containing the URL of the server-side logs associated with the error. -extern NSString * const RLMServerLogURLKey; - -/// A user info key containing a HTTP status code. Some ``RLMAppError`` codes -/// include this, most notably ``RLMAppErrorHttpRequestFailed``. -extern NSString * const RLMHTTPStatusCodeKey; - -/// A user info key containing a `RLMCompensatingWriteInfo` which includes -/// further details about what was reverted by the server. -extern NSString *const RLMCompensatingWriteInfoKey; - -/** - `RLMError` is an enumeration representing all recoverable errors. It is - associated with the Realm error domain specified in `RLMErrorDomain`. - */ -typedef RLM_ERROR_ENUM(NSInteger, RLMError, RLMErrorDomain) { - /** Denotes a general error that occurred when trying to open a Realm. */ - RLMErrorFail = 1, - - /** Denotes a file I/O error that occurred when trying to open a Realm. */ - RLMErrorFileAccess = 2, - - /** - Denotes a file permission error that occurred when trying to open a Realm. - - This error can occur if the user does not have permission to open or create - the specified file in the specified access mode when opening a Realm. - */ - RLMErrorFilePermissionDenied = 3, - - /** - Denotes an error where a file was to be written to disk, but another - file with the same name already exists. - */ - RLMErrorFileExists = 4, - - /** - Denotes an error that occurs if a file could not be found. - - This error may occur if a Realm file could not be found on disk when - trying to open a Realm as read-only, or if the directory part of the - specified path was not found when trying to write a copy. - */ - RLMErrorFileNotFound = 5, - - /** - Denotes an error that occurs if a file format upgrade is required to open - the file, but upgrades were explicitly disabled or the file is being open - in read-only mode. - */ - RLMErrorFileFormatUpgradeRequired = 6, - - /** - Denotes an error that occurs if the database file is currently open in - another process which cannot share with the current process due to an - architecture mismatch. - - This error may occur if trying to share a Realm file between an i386 - (32-bit) iOS Simulator and the Realm Studio application. In this case, - please use the 64-bit version of the iOS Simulator. - */ - RLMErrorIncompatibleLockFile = 8, - - /** - Denotes an error that occurs when there is insufficient available address - space to mmap the Realm file. - */ - RLMErrorAddressSpaceExhausted = 9, - - /** - Denotes an error that occurs if there is a schema version mismatch and a - migration is required. - */ - RLMErrorSchemaMismatch = 10, - - /** - Denotes an error where an operation was requested which cannot be - performed on an open file. - */ - RLMErrorAlreadyOpen = 12, - - /// Denotes an error where an input value was invalid. - RLMErrorInvalidInput = 13, - - /// Denotes an error where a write failed due to insufficient disk space. - RLMErrorOutOfDiskSpace = 14, - - /** - Denotes an error where a Realm file could not be opened because another - process has opened the same file in a way incompatible with inter-process - sharing. For example, this can result from opening the backing file for an - in-memory Realm in non-in-memory mode. - */ - RLMErrorIncompatibleSession = 15, - - /** - Denotes an error that occurs if the file is a valid Realm file, but has a - file format version which is not supported by this version of Realm. This - typically means that the file was written by a newer version of Realm, but - may also mean that it is from a pre-1.0 version of Realm (or for - synchronized files, pre-10.0). - */ - RLMErrorUnsupportedFileFormatVersion = 16, - - /** - Denotes an error that occurs if a synchronized Realm is opened in more - than one process at once. - */ - RLMErrorMultipleSyncAgents = 17, - - /// A subscription was rejected by the server. - RLMErrorSubscriptionFailed = 18, - - /// A file operation failed in a way which does not have a more specific error code. - RLMErrorFileOperationFailed = 19, - - /** - Denotes an error that occurs if the file being opened is not a valid Realm - file. Some of the possible causes of this are: - 1. The file at the given URL simply isn't a Realm file at all. - 2. The wrong encryption key was given. - 3. The Realm file is encrypted and no encryption key was given. - 4. The Realm file isn't encrypted but an encryption key was given. - 5. The file on disk has become corrupted. - */ - RLMErrorInvalidDatabase = 20, - - /** - Denotes an error that occurs if a Realm is opened in the wrong history - mode. Typically this means that either a local Realm is being opened as a - synchronized Realm or vice versa. - */ - RLMErrorIncompatibleHistories = 21, - - /** - Denotes an error that occurs if objects were written to a flexible sync - Realm without any active subscriptions for that object type. All objects - created in flexible sync Realms must match at least one active - subscription or the server will reject the write. - */ - RLMErrorNoSubscriptionForWrite = 22, -}; - -#pragma mark - RLMSyncError - -/// A user info key for use with `RLMSyncErrorClientResetError`. -extern NSString *const kRLMSyncPathOfRealmBackupCopyKey; - -/// A user info key for use with certain error types. -extern NSString *const kRLMSyncErrorActionTokenKey; - -/** - An error related to a problem that might be reported by the synchronization manager - error handler, or a callback on a sync-related API that performs asynchronous work. - */ -typedef RLM_ERROR_ENUM(NSInteger, RLMSyncError, RLMSyncErrorDomain) { - /// An error that indicates a problem with the session (a specific Realm opened for sync). - RLMSyncErrorClientSessionError = 4, - - /// An error that indicates a problem with a specific user. - RLMSyncErrorClientUserError = 5, - - /** - An error that indicates an internal, unrecoverable problem - with the underlying synchronization engine. - */ - RLMSyncErrorClientInternalError = 6, - - /** - An error that indicates the Realm needs to be reset. - - A synced Realm may need to be reset because Atlas App Services encountered an - error and had to be restored from a backup. If the backup copy of the remote Realm - is of an earlier version than the local copy of the Realm, the server will ask the - client to reset the Realm. - - The reset process is as follows: the local copy of the Realm is copied into a recovery - directory for safekeeping, and then deleted from the original location. The next time - the Realm for that partition value is opened, the Realm will automatically be re-downloaded from - Atlas App Services, and can be used as normal. - - Data written to the Realm after the local copy of the Realm diverged from the backup - remote copy will be present in the local recovery copy of the Realm file. The - re-downloaded Realm will initially contain only the data present at the time the Realm - was backed up on the server. - - The client reset process can be initiated in one of two ways. - - The `userInfo` dictionary contains an opaque token object under the key - `kRLMSyncErrorActionTokenKey`. This token can be passed into - `+[RLMSyncSession immediatelyHandleError:]` in order to immediately perform the client - reset process. This should only be done after your app closes and invalidates every - instance of the offending Realm on all threads (note that autorelease pools may make this - difficult to guarantee). - - If `+[RLMSyncSession immediatelyHandleError:]` is not called, the client reset process - will be automatically carried out the next time the app is launched and the - `RLMSyncManager` is accessed. - - The value for the `kRLMSyncPathOfRealmBackupCopyKey` key in the `userInfo` dictionary - describes the path of the recovered copy of the Realm. This copy will not actually be - created until the client reset process is initiated. - - @see `-[NSError rlmSync_errorActionToken]`, `-[NSError rlmSync_clientResetBackedUpRealmPath]` - */ - RLMSyncErrorClientResetError = 7, - - /// :nodoc: - RLMSyncErrorUnderlyingAuthError = 8, - - /** - An error that indicates the user does not have permission to perform an operation - upon a synced Realm. For example, a user may receive this error if they attempt to - open a Realm they do not have at least read access to, or write to a Realm they only - have read access to. - - This error may also occur if a user incorrectly opens a Realm they have read-only - permissions to without using the `asyncOpen()` APIs. - - A Realm that suffers a permission denied error is, by default, flagged so that its - local copy will be deleted the next time the application starts. - - The `userInfo` dictionary contains an opaque token object under the key - `kRLMSyncErrorActionTokenKey`. This token can be passed into - `+[RLMSyncSession immediatelyHandleError:]` in order to immediately delete the local - copy. This should only be done after your app closes and invalidates every instance - of the offending Realm on all threads (note that autorelease pools may make this - difficult to guarantee). - - @warning It is strongly recommended that, if a Realm has encountered a permission denied - error, its files be deleted before attempting to re-open it. - - @see `-[NSError rlmSync_errorActionToken]` - */ - RLMSyncErrorPermissionDeniedError = 9, - - /** - An error that indicates that the server has rejected the requested flexible sync subscriptions. - */ - RLMSyncErrorInvalidFlexibleSyncSubscriptions = 10, - - /** - An error that indicates that the server has reverted a write made by this - client. This can happen due to not having write permission, or because an - object was created in a flexible sync Realm which does not match any - active subscriptions. - - This error is informational and does not require any explicit handling. - */ - RLMSyncErrorWriteRejected = 11, - - /** - A connection error without a more specific error code occurred. - - Realm internally handles retrying connections with appropriate backoffs, - so connection errors are normally logged and not reported to the error - handler. The exception is if - ``RLMSyncConfiguration.cancelAsyncOpenOnNonFatalErrors`` is set to `true`, - in which case async opens will be canceled on connection failures and the - error will be reported to the completion handler. - - Note that connection timeouts are reported as - (errorDomain: NSPosixErrorDomain, error: ETIMEDOUT) - and not as one of these error codes. - */ - RLMSyncErrorConnectionFailed = 12, - - /** - Connecting to the server failed due to a TLS issue such as an invalid certificate. - */ - RLMSyncErrorTLSHandshakeFailed = 13, -}; - -#pragma mark - RLMSyncAuthError - -// NEXT-MAJOR: This was a ROS thing and should have been removed in v10 -/// :nodoc: -typedef RLM_ERROR_ENUM(NSInteger, RLMSyncAuthError, RLMSyncAuthErrorDomain) { - RLMSyncAuthErrorBadResponse = 1, - RLMSyncAuthErrorBadRemoteRealmPath = 2, - RLMSyncAuthErrorHTTPStatusCodeError = 3, - RLMSyncAuthErrorClientSessionError = 4, - RLMSyncAuthErrorInvalidParameters = 601, - RLMSyncAuthErrorMissingPath = 602, - RLMSyncAuthErrorInvalidCredential = 611, - RLMSyncAuthErrorUserDoesNotExist = 612, - RLMSyncAuthErrorUserAlreadyExists = 613, - RLMSyncAuthErrorAccessDeniedOrInvalidPath = 614, - RLMSyncAuthErrorInvalidAccessToken = 615, - RLMSyncAuthErrorFileCannotBeShared = 703, -} __attribute__((deprecated("Errors of this type are no longer reported"))); - -#pragma mark - RLMSyncAppError - -/// An error which occurred when making a request to Atlas App Services. -typedef RLM_ERROR_ENUM(NSInteger, RLMAppError, RLMAppErrorDomain) { - /// An unknown error has occurred - RLMAppErrorUnknown = -1, - - /// A HTTP request completed with an error status code. The failing status - /// code can be found in the ``RLMHTTPStatusCodeKey`` key of the userInfo - /// dictionary. - RLMAppErrorHttpRequestFailed = 1, - - /// A user's session is in an invalid state. Logging out and back in may rectify this. - RLMAppErrorInvalidSession, - /// A request sent to the server was malformed in some way. - RLMAppErrorBadRequest, - /// A request was made using a nonexistent user. - RLMAppErrorUserNotFound, - /// A request was made against an App using a User which does not belong to that App. - RLMAppErrorUserAppDomainMismatch, - /// The auth provider has limited the domain names which can be used for email addresses, and the given one is not allowed. - RLMAppErrorDomainNotAllowed, - /// The request body size exceeded a server-configured limit. - RLMAppErrorReadSizeLimitExceeded, - /// A request had an invalid parameter. - RLMAppErrorInvalidParameter, - /// A request was missing a required parameter. - RLMAppErrorMissingParameter, - /// Executing the requested server function failed with an error. - RLMAppErrorFunctionExecutionError, - /// The server encountered an internal error. - RLMAppErrorInternalServerError, - /// Authentication failed due to the request auth provider not existing. - RLMAppErrorAuthProviderNotFound, - /// The requested value does not exist. - RLMAppErrorValueNotFound, - /// The value being created already exists. - RLMAppErrorValueAlreadyExists, - /// A value with the same name as the value being created already exists. - RLMAppErrorValueDuplicateName, - /// The called server function does not exist. - RLMAppErrorFunctionNotFound, - /// The called server function has a syntax error. - RLMAppErrorFunctionSyntaxError, - /// The called server function is invalid in some way. - RLMAppErrorFunctionInvalid, - /// Registering an API key with the auth provider failed due to it already existing. - RLMAppErrorAPIKeyAlreadyExists, - /// The operation failed due to exceeding the server-configured time limit. - RLMAppErrorExecutionTimeLimitExceeded, - /// The body of the called function does not define a callable thing. - RLMAppErrorNotCallable, - /// Email confirmation failed for a user because the user has already confirmed their email. - RLMAppErrorUserAlreadyConfirmed, - /// The user cannot be used because it has been disabled. - RLMAppErrorUserDisabled, - /// An auth error occurred which does not have a more specific error code. - RLMAppErrorAuthError, - /// Account registration failed due to the user name already being taken. - RLMAppErrorAccountNameInUse, - /// A login request failed due to an invalid password. - RLMAppErrorInvalidPassword, - /// Operation failed due to server-side maintenance. - RLMAppErrorMaintenanceInProgress, - /// Operation failed due to an error reported by MongoDB. - RLMAppErrorMongoDBError, -}; - -/// Extended information about a write which was rejected by the server. -/// -/// The server will sometimes reject writes made by the client for reasons such -/// as permissions, additional server-side validation failing, or because the -/// object didn't match any flexible sync subscriptions. When this happens, a -/// ``RLMSyncErrorWriteRejected`` error is reported which contains an array of -/// `RLMCompensatingWriteInfo` objects in the ``RLMCompensatingWriteInfoKey`` -/// userInfo key with information about what writes were rejected and why. -/// -/// This information is intended for debugging and logging purposes only. The -/// `reason` strings are generated by the server and are not guaranteed to be -/// stable, so attempting to programmatically do anything with them will break -/// without warning. -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMCompensatingWriteInfo : NSObject -/// The class name of the object being written to. -@property (nonatomic, readonly) NSString *objectType; -/// The primary key of the object being written to. -@property (nonatomic, readonly) id primaryKey NS_REFINED_FOR_SWIFT; -/// A human-readable string describing why the write was rejected. -@property (nonatomic, readonly) NSString *reason; -@end diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMFindOneAndModifyOptions.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMFindOneAndModifyOptions.h deleted file mode 100644 index 3cce99f23..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMFindOneAndModifyOptions.h +++ /dev/null @@ -1,80 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) -@protocol RLMBSON; -@class RLMSortDescriptor; - -/// Options to use when executing a `findOneAndUpdate`, `findOneAndReplace`, -/// or `findOneAndDelete` command on a `RLMMongoCollection`. -@interface RLMFindOneAndModifyOptions : NSObject - -/// Limits the fields to return for all matching documents. -@property (nonatomic, nullable) id projection NS_REFINED_FOR_SWIFT; - -/// The order in which to return matching documents. -@property (nonatomic, nullable) id sort NS_REFINED_FOR_SWIFT -__attribute__((deprecated("Use `sorting` instead, which correctly sort more than one sort attribute", "sorting"))); - -/// The order in which to return matching documents. -@property (nonatomic) NSArray> *sorting NS_REFINED_FOR_SWIFT; - - -/// Whether or not to perform an upsert, default is false -/// (only available for find_one_and_replace and find_one_and_update) -@property (nonatomic) BOOL upsert; - -/// When true then the new document is returned, -/// Otherwise the old document is returned (default) -/// (only available for findOneAndReplace and findOneAndUpdate) -@property (nonatomic) BOOL shouldReturnNewDocument; - -/// Options to use when executing a `findOneAndUpdate`, `findOneAndReplace`, -/// or `findOneAndDelete` command on a `RLMMongoCollection`. -/// @param projection Limits the fields to return for all matching documents. -/// @param sort The order in which to return matching documents. -/// @param upsert Whether or not to perform an upsert, default is false -/// (only available for findOneAndReplace and findOneAndUpdate) -/// @param shouldReturnNewDocument When true then the new document is returned, -/// Otherwise the old document is returned (default), -/// (only available for findOneAndReplace and findOneAndUpdate) -- (instancetype)initWithProjection:(id _Nullable)projection - sort:(id _Nullable)sort - upsert:(BOOL)upsert - shouldReturnNewDocument:(BOOL)shouldReturnNewDocument -__attribute__((deprecated("Please use `initWithProjection:sorting:upsert:shouldReturnNewDocument:`"))) - NS_SWIFT_UNAVAILABLE("Please see FindOneAndModifyOptions"); - -/// Options to use when executing a `findOneAndUpdate`, `findOneAndReplace`, -/// or `findOneAndDelete` command on a `RLMMongoCollection`. -/// @param projection Limits the fields to return for all matching documents. -/// @param sorting The order in which to return matching documents. -/// @param upsert Whether or not to perform an upsert, default is false -/// (only available for findOneAndReplace and findOneAndUpdate) -/// @param shouldReturnNewDocument When true then the new document is returned, -/// Otherwise the old document is returned (default), -/// (only available for findOneAndReplace and findOneAndUpdate) -- (instancetype)initWithProjection:(id _Nullable)projection - sorting:(NSArray> *)sorting - upsert:(BOOL)upsert - shouldReturnNewDocument:(BOOL)shouldReturnNewDocument; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMFindOptions.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMFindOptions.h deleted file mode 100644 index 043a85374..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMFindOptions.h +++ /dev/null @@ -1,77 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@protocol RLMBSON; - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -@interface RLMFindOptions : NSObject - -/// The maximum number of documents to return. Specifying 0 will return all documents. -@property (nonatomic) NSInteger limit; - -/// Limits the fields to return for all matching documents. -@property (nonatomic, nullable) id projection NS_REFINED_FOR_SWIFT; - -/// The order in which to return matching documents. -@property (nonatomic, nullable) id sort NS_REFINED_FOR_SWIFT -__attribute__((deprecated("Use `sorting` instead, which correctly sort more than one sort attribute", "sorting"))); - -/// The order in which to return matching documents. -@property (nonatomic) NSArray> *sorting NS_REFINED_FOR_SWIFT; - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -/// @param limit The maximum number of documents to return. Specifying 0 will return all documents. -/// @param projection Limits the fields to return for all matching documents. -/// @param sort The order in which to return matching documents. -- (instancetype)initWithLimit:(NSInteger)limit - projection:(id _Nullable)projection - sort:(id _Nullable)sort -__attribute__((deprecated("Please use `initWithLimit:projection:sorting:`"))) - NS_SWIFT_UNAVAILABLE("Please see FindOption"); - - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -/// @param projection Limits the fields to return for all matching documents. -/// @param sort The order in which to return matching documents. -- (instancetype)initWithProjection:(id _Nullable)projection - sort:(id _Nullable)sort __deprecated -__attribute__((deprecated("Please use `initWithProjection:sorting:`"))) - NS_SWIFT_UNAVAILABLE("Please see FindOption"); - - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -/// @param limit The maximum number of documents to return. Specifying 0 will return all documents. -/// @param projection Limits the fields to return for all matching documents. -/// @param sorting The order in which to return matching documents. -- (instancetype)initWithLimit:(NSInteger)limit - projection:(id _Nullable)projection - sorting:(NSArray> *)sorting; - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -/// @param projection Limits the fields to return for all matching documents. -/// @param sorting The order in which to return matching documents. -- (instancetype)initWithProjection:(id _Nullable)projection - sorting:(NSArray> *)sorting; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMLogger.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMLogger.h deleted file mode 100644 index 96ab91967..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMLogger.h +++ /dev/null @@ -1,99 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -/// An enum representing different levels of sync-related logging that can be configured. -typedef RLM_CLOSED_ENUM(NSUInteger, RLMLogLevel) { - /// Nothing will ever be logged. - RLMLogLevelOff, - /// Only fatal errors will be logged. - RLMLogLevelFatal, - /// Only errors will be logged. - RLMLogLevelError, - /// Warnings and errors will be logged. - RLMLogLevelWarn, - /// Information about sync events will be logged. Fewer events will be logged in order to avoid overhead. - RLMLogLevelInfo, - /// Information about sync events will be logged. More events will be logged than with `RLMLogLevelInfo`. - RLMLogLevelDetail, - /// Log information that can aid in debugging. - /// - /// - warning: Will incur a measurable performance impact. - RLMLogLevelDebug, - /// Log information that can aid in debugging. More events will be logged than with `RLMLogLevelDebug`. - /// - /// - warning: Will incur a measurable performance impact. - RLMLogLevelTrace, - /// Log information that can aid in debugging. More events will be logged than with `RLMLogLevelTrace`. - /// - /// - warning: Will incur a measurable performance impact. - RLMLogLevelAll -} NS_SWIFT_NAME(LogLevel); - -/// A log callback function which can be set on RLMLogger. -/// -/// The log function may be called from multiple threads simultaneously, and is -/// responsible for performing its own synchronization if any is required. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void (^RLMLogFunction)(RLMLogLevel level, NSString *message); - -/** - `RLMLogger` is used for creating your own custom logging logic. - - You can define your own logger creating an instance of `RLMLogger` and define the log function which will be - invoked whenever there is a log message. - Set this custom logger as you default logger using `setDefaultLogger`. - - RLMLogger.defaultLogger = [[RLMLogger alloc] initWithLevel:RLMLogLevelDebug - logFunction:^(RLMLogLevel level, NSString * message) { - NSLog(@"Realm Log - %lu, %@", (unsigned long)level, message); - }]; - - @note By default default log threshold level is `RLMLogLevelInfo`, and logging strings are output to Apple System Logger. -*/ -@interface RLMLogger : NSObject - -/** - Gets the logging threshold level used by the logger. - */ -@property (nonatomic) RLMLogLevel level; - -/// :nodoc: -- (instancetype)init NS_UNAVAILABLE; - -/** - Creates a logger with the associated log level and the logic function to define your own logging logic. - - @param level The log level to be set for the logger. - @param logFunction The log function which will be invoked whenever there is a log message. -*/ -- (instancetype)initWithLevel:(RLMLogLevel)level logFunction:(RLMLogFunction)logFunction; - -#pragma mark RLMLogger Default Logger API - -/** - The current default logger. When setting a logger as default, this logger will be used whenever information must be logged. - */ -@property (class) RLMLogger *defaultLogger NS_SWIFT_NAME(shared); - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMMigration.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMMigration.h deleted file mode 100644 index 4a6652a19..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMMigration.h +++ /dev/null @@ -1,129 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMSchema; -@class RLMArray; -@class RLMObject; - -/** - A block type which provides both the old and new versions of an object in the Realm. Object - properties can only be accessed using keyed subscripting. - - @see `-[RLMMigration enumerateObjects:block:]` - - @param oldObject The object from the original Realm (read-only). - @param newObject The object from the migrated Realm (read-write). -*/ -typedef void (^RLMObjectMigrationBlock)(RLMObject * __nullable oldObject, RLMObject * __nullable newObject); - -/** - `RLMMigration` instances encapsulate information intended to facilitate a schema migration. - - A `RLMMigration` instance is passed into a user-defined `RLMMigrationBlock` block when updating - the version of a Realm. This instance provides access to the old and new database schemas, the - objects in the Realm, and provides functionality for modifying the Realm during the migration. - */ -@interface RLMMigration : NSObject - -#pragma mark - Properties - -/** - Returns the old `RLMSchema`. This is the schema which describes the Realm before the - migration is applied. - */ -@property (nonatomic, readonly) RLMSchema *oldSchema NS_REFINED_FOR_SWIFT; - -/** - Returns the new `RLMSchema`. This is the schema which describes the Realm after the - migration is applied. - */ -@property (nonatomic, readonly) RLMSchema *newSchema NS_REFINED_FOR_SWIFT; - - -#pragma mark - Altering Objects during a Migration - -/** - Enumerates all the objects of a given type in the Realm, providing both the old and new versions - of each object. Within the block, object properties can only be accessed using keyed subscripting. - - @param className The name of the `RLMObject` class to enumerate. - - @warning All objects returned are of a type specific to the current migration and should not be cast - to `className`. Instead, treat them as `RLMObject`s and use keyed subscripting to access - properties. - */ -- (void)enumerateObjects:(NSString *)className - block:(__attribute__((noescape)) RLMObjectMigrationBlock)block NS_REFINED_FOR_SWIFT; - -/** - Creates and returns an `RLMObject` instance of type `className` in the Realm being migrated. - - The `value` argument is used to populate the object. It can be a key-value coding compliant object, an array or - dictionary returned from the methods in `NSJSONSerialization`, or an array containing one element for each managed - property. An exception will be thrown if any required properties are not present and those properties were not defined - with default values. - - When passing in an `NSArray` as the `value` argument, all properties must be present, valid and in the same order as - the properties defined in the model. - - @param className The name of the `RLMObject` class to create. - @param value The value used to populate the object. - */ -- (RLMObject *)createObject:(NSString *)className withValue:(id)value NS_REFINED_FOR_SWIFT; - -/** - Deletes an object from a Realm during a migration. - - It is permitted to call this method from within the block passed to `-[enumerateObjects:block:]`. - - @param object Object to be deleted from the Realm being migrated. - */ -- (void)deleteObject:(RLMObject *)object NS_REFINED_FOR_SWIFT; - -/** - Deletes the data for the class with the given name. - - All objects of the given class will be deleted. If the `RLMObject` subclass no longer exists in your program, - any remaining metadata for the class will be removed from the Realm file. - - @param name The name of the `RLMObject` class to delete. - - @return A Boolean value indicating whether there was any data to delete. - */ -- (BOOL)deleteDataForClassName:(NSString *)name NS_REFINED_FOR_SWIFT; - -/** - Renames a property of the given class from `oldName` to `newName`. - - @param className The name of the class whose property should be renamed. This class must be present - in both the old and new Realm schemas. - @param oldName The old persisted property name for the property to be renamed. There must not be a property with this name in the - class as defined by the new Realm schema. - @param newName The new persisted property name for the property to be renamed. There must not be a property with this name in the - class as defined by the old Realm schema. - */ -- (void)renamePropertyForClass:(NSString *)className oldName:(NSString *)oldName - newName:(NSString *)newName NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMMongoClient.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMMongoClient.h deleted file mode 100644 index 50a1c226d..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMMongoClient.h +++ /dev/null @@ -1,47 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMApp; - -/// The `RLMMongoClient` enables reading and writing on a MongoDB database via the Realm Cloud service. -/// -/// It provides access to instances of `RLMMongoDatabase`, which in turn provide access to specific -/// `RLMMongoCollection`s that hold your data. -/// -/// - Note: -/// Before you can read or write data, a user must log in. -/// -/// - SeeAlso: -/// `RLMApp`, `RLMMongoDatabase`, `RLMMongoCollection` -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMMongoClient : NSObject - -/// The name of the client -@property (nonatomic, readonly) NSString *name; - -/// Gets a `RLMMongoDatabase` instance for the given database name. -/// @param name the name of the database to retrieve -- (RLMMongoDatabase *)databaseWithName:(NSString *)name NS_SWIFT_NAME(database(named:)); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMMongoCollection.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMMongoCollection.h deleted file mode 100644 index 0feae60ac..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMMongoCollection.h +++ /dev/null @@ -1,330 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) -@protocol RLMBSON; - -@class RLMFindOptions, RLMFindOneAndModifyOptions, RLMUpdateResult, RLMChangeStream, RLMObjectId; - -/// Delegate which is used for subscribing to changes on a `[RLMMongoCollection watch]` stream. -@protocol RLMChangeEventDelegate -/// The stream was opened. -/// @param changeStream The RLMChangeStream subscribing to the stream changes. -- (void)changeStreamDidOpen:(RLMChangeStream *)changeStream; -/// The stream has been closed. -/// @param error If an error occured when closing the stream, an error will be passed. -- (void)changeStreamDidCloseWithError:(nullable NSError *)error; -/// A error has occured while streaming. -/// @param error The streaming error. -- (void)changeStreamDidReceiveError:(NSError *)error; -/// Invoked when a change event has been received. -/// @param changeEvent The change event in BSON format. -- (void)changeStreamDidReceiveChangeEvent:(id)changeEvent; -@end - -/// Acts as a middleman and processes events with WatchStream -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMChangeStream : NSObject -/// Stops a watch streaming session. -- (void)close; -/// :nodoc: -- (instancetype)init NS_UNAVAILABLE; -@end - -/// The `RLMMongoCollection` represents a MongoDB collection. -/// -/// You can get an instance from a `RLMMongoDatabase`. -/// -/// Create, read, update, and delete methods are available. -/// -/// Operations against the Realm Cloud server are performed asynchronously. -/// -/// - Note: -/// Before you can read or write data, a user must log in. -/// - Usage: -/// RLMMongoClient *client = [self.app mongoClient:@"mongodb1"]; -/// RLMMongoDatabase *database = [client databaseWithName:@"test_data"]; -/// RLMMongoCollection *collection = [database collectionWithName:@"Dog"]; -/// [collection insertOneDocument:@{@"name": @"fido", @"breed": @"cane corso"} completion:...]; -/// -/// - SeeAlso: -/// `RLMMongoClient`, `RLMMongoDatabase` -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMMongoCollection : NSObject -/// Block which returns an object id on a successful insert, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoInsertBlock)(id _Nullable, NSError * _Nullable); -/// Block which returns an array of object ids on a successful insertMany, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoInsertManyBlock)(NSArray> * _Nullable, NSError * _Nullable); -/// Block which returns an array of Documents on a successful find operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoFindBlock)(NSArray> *> * _Nullable, - NSError * _Nullable); -/// Block which returns a Document on a successful findOne operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoFindOneBlock)(NSDictionary> * _Nullable_result, - NSError * _Nullable); -/// Block which returns the number of Documents in a collection on a successful count operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoCountBlock)(NSInteger, NSError * _Nullable); -/// Block which returns an RLMUpdateResult on a successful update operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoUpdateBlock)(RLMUpdateResult * _Nullable, NSError * _Nullable); -/// Block which returns the deleted Document on a successful delete operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoDeleteBlock)(NSDictionary> * _Nullable_result, - NSError * _Nullable); - -/// The name of this mongodb collection. -@property (nonatomic, readonly) NSString *name; - -/// Encodes the provided value to BSON and inserts it. If the value is missing an identifier, one will be -/// generated for it. -/// @param document A `Document` value to insert. -/// @param completion The result of attempting to perform the insert. An Id will be returned for the inserted object on sucess -- (void)insertOneDocument:(NSDictionary> *)document - completion:(RLMMongoInsertBlock)completion NS_REFINED_FOR_SWIFT; - -/// Encodes the provided values to BSON and inserts them. If any values are missing identifiers, -/// they will be generated. -/// @param documents The `Document` values in a bson array to insert. -/// @param completion The result of the insert, returns an array inserted document ids in order -- (void)insertManyDocuments:(NSArray> *> *)documents - completion:(RLMMongoInsertManyBlock)completion NS_REFINED_FOR_SWIFT; - -/// Finds the documents in this collection which match the provided filter. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param options `RLMFindOptions` to use when executing the command. -/// @param completion The resulting bson array of documents or error if one occurs -- (void)findWhere:(NSDictionary> *)filterDocument - options:(RLMFindOptions *)options - completion:(RLMMongoFindBlock)completion NS_REFINED_FOR_SWIFT; - -/// Finds the documents in this collection which match the provided filter. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param completion The resulting bson array as a string or error if one occurs -- (void)findWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoFindBlock)completion NS_REFINED_FOR_SWIFT; - -/// Returns one document from a collection or view which matches the -/// provided filter. If multiple documents satisfy the query, this method -/// returns the first document according to the query's sort order or natural -/// order. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param options `RLMFindOptions` to use when executing the command. -/// @param completion The resulting bson or error if one occurs -- (void)findOneDocumentWhere:(NSDictionary> *)filterDocument - options:(RLMFindOptions *)options - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Returns one document from a collection or view which matches the -/// provided filter. If multiple documents satisfy the query, this method -/// returns the first document according to the query's sort order or natural -/// order. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param completion The resulting bson or error if one occurs -- (void)findOneDocumentWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Runs an aggregation framework pipeline against this collection. -/// @param pipeline A bson array made up of `Documents` containing the pipeline of aggregation operations to perform. -/// @param completion The resulting bson array of documents or error if one occurs -- (void)aggregateWithPipeline:(NSArray> *> *)pipeline - completion:(RLMMongoFindBlock)completion NS_REFINED_FOR_SWIFT; - -/// Counts the number of documents in this collection matching the provided filter. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param limit The max amount of documents to count -/// @param completion Returns the count of the documents that matched the filter. -- (void)countWhere:(NSDictionary> *)filterDocument - limit:(NSInteger)limit - completion:(RLMMongoCountBlock)completion NS_REFINED_FOR_SWIFT; - -/// Counts the number of documents in this collection matching the provided filter. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param completion Returns the count of the documents that matched the filter. -- (void)countWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoCountBlock)completion NS_REFINED_FOR_SWIFT; - -/// Deletes a single matching document from the collection. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param completion The result of performing the deletion. Returns the count of deleted objects -- (void)deleteOneDocumentWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoCountBlock)completion NS_REFINED_FOR_SWIFT; - -/// Deletes multiple documents -/// @param filterDocument Document representing the match criteria -/// @param completion The result of performing the deletion. Returns the count of the deletion -- (void)deleteManyDocumentsWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoCountBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates a single document matching the provided filter in this collection. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param upsert When true, creates a new document if no document matches the query. -/// @param completion The result of the attempt to update a document. -- (void)updateOneDocumentWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - upsert:(BOOL)upsert - completion:(RLMMongoUpdateBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates a single document matching the provided filter in this collection. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param completion The result of the attempt to update a document. -- (void)updateOneDocumentWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - completion:(RLMMongoUpdateBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates multiple documents matching the provided filter in this collection. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param upsert When true, creates a new document if no document matches the query. -/// @param completion The result of the attempt to update a document. -- (void)updateManyDocumentsWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - upsert:(BOOL)upsert - completion:(RLMMongoUpdateBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates multiple documents matching the provided filter in this collection. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param completion The result of the attempt to update a document. -- (void)updateManyDocumentsWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - completion:(RLMMongoUpdateBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates a single document in a collection based on a query filter and -/// returns the document in either its pre-update or post-update form. Unlike -/// `updateOneDocument`, this action allows you to atomically find, update, and -/// return a document with the same command. This avoids the risk of other -/// update operations changing the document between separate find and update -/// operations. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param options `RemoteFindOneAndModifyOptions` to use when executing the command. -/// @param completion The result of the attempt to update a document. -- (void)findOneAndUpdateWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - options:(RLMFindOneAndModifyOptions *)options - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates a single document in a collection based on a query filter and -/// returns the document in either its pre-update or post-update form. Unlike -/// `updateOneDocument`, this action allows you to atomically find, update, and -/// return a document with the same command. This avoids the risk of other -/// update operations changing the document between separate find and update -/// operations. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param completion The result of the attempt to update a document. -- (void)findOneAndUpdateWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Overwrites a single document in a collection based on a query filter and -/// returns the document in either its pre-replacement or post-replacement -/// form. Unlike `updateOneDocument`, this action allows you to atomically find, -/// replace, and return a document with the same command. This avoids the -/// risk of other update operations changing the document between separate -/// find and update operations. -/// @param filterDocument A `Document` that should match the query. -/// @param replacementDocument A `Document` describing the replacement. -/// @param options `RLMFindOneAndModifyOptions` to use when executing the command. -/// @param completion The result of the attempt to replace a document. -- (void)findOneAndReplaceWhere:(NSDictionary> *)filterDocument - replacementDocument:(NSDictionary> *)replacementDocument - options:(RLMFindOneAndModifyOptions *)options - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Overwrites a single document in a collection based on a query filter and -/// returns the document in either its pre-replacement or post-replacement -/// form. Unlike `updateOneDocument`, this action allows you to atomically find, -/// replace, and return a document with the same command. This avoids the -/// risk of other update operations changing the document between separate -/// find and update operations. -/// @param filterDocument A `Document` that should match the query. -/// @param replacementDocument A `Document` describing the update. -/// @param completion The result of the attempt to replace a document. -- (void)findOneAndReplaceWhere:(NSDictionary> *)filterDocument - replacementDocument:(NSDictionary> *)replacementDocument - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Removes a single document from a collection based on a query filter and -/// returns a document with the same form as the document immediately before -/// it was deleted. Unlike `deleteOneDocument`, this action allows you to atomically -/// find and delete a document with the same command. This avoids the risk of -/// other update operations changing the document between separate find and -/// delete operations. -/// @param filterDocument A `Document` that should match the query. -/// @param options `RLMFindOneAndModifyOptions` to use when executing the command. -/// @param completion The result of the attempt to delete a document. -- (void)findOneAndDeleteWhere:(NSDictionary> *)filterDocument - options:(RLMFindOneAndModifyOptions *)options - completion:(RLMMongoDeleteBlock)completion NS_REFINED_FOR_SWIFT; - -/// Removes a single document from a collection based on a query filter and -/// returns a document with the same form as the document immediately before -/// it was deleted. Unlike `deleteOneDocument`, this action allows you to atomically -/// find and delete a document with the same command. This avoids the risk of -/// other update operations changing the document between separate find and -/// delete operations. -/// @param filterDocument A `Document` that should match the query. -/// @param completion The result of the attempt to delete a document. -- (void)findOneAndDeleteWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoDeleteBlock)completion NS_REFINED_FOR_SWIFT; - -/// Opens a MongoDB change stream against the collection to watch for changes. The resulting stream will be notified -/// of all events on this collection that the active user is authorized to see based on the configured MongoDB -/// rules. -/// @param delegate The delegate that will react to events and errors from the resulting change stream. -/// @param queue Dispatches streaming events to an optional queue, if no queue is provided the main queue is used -- (RLMChangeStream *)watchWithDelegate:(id)delegate - delegateQueue:(nullable dispatch_queue_t)queue NS_REFINED_FOR_SWIFT; - -/// Opens a MongoDB change stream against the collection to watch for changes -/// made to specific documents. The documents to watch must be explicitly -/// specified by their _id. -/// @param filterIds The list of _ids in the collection to watch. -/// @param delegate The delegate that will react to events and errors from the resulting change stream. -/// @param queue Dispatches streaming events to an optional queue, if no queue is provided the main queue is used -- (RLMChangeStream *)watchWithFilterIds:(NSArray *)filterIds - delegate:(id)delegate - delegateQueue:(nullable dispatch_queue_t)queue NS_REFINED_FOR_SWIFT; - -/// Opens a MongoDB change stream against the collection to watch for changes. The provided BSON document will be -/// used as a match expression filter on the change events coming from the stream. -/// -/// See https://docs.mongodb.com/manual/reference/operator/aggregation/match/ for documentation around how to define -/// a match filter. -/// -/// Defining the match expression to filter ChangeEvents is similar to defining the match expression for triggers: -/// https://docs.mongodb.com/realm/triggers/database-triggers/ -/// @param matchFilter The $match filter to apply to incoming change events -/// @param delegate The delegate that will react to events and errors from the resulting change stream. -/// @param queue Dispatches streaming events to an optional queue, if no queue is provided the main queue is used -- (RLMChangeStream *)watchWithMatchFilter:(NSDictionary> *)matchFilter - delegate:(id)delegate - delegateQueue:(nullable dispatch_queue_t)queue NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMMongoDatabase.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMMongoDatabase.h deleted file mode 100644 index 177fbc1b8..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMMongoDatabase.h +++ /dev/null @@ -1,51 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMMongoCollection; - -/// The `RLMMongoDatabase` represents a MongoDB database, which holds a group -/// of collections that contain your data. -/// -/// It can be retrieved from the `RLMMongoClient`. -/// -/// Use it to get `RLMMongoCollection`s for reading and writing data. -/// -/// - Note: -/// Before you can read or write data, a user must log in`. -/// -/// - SeeAlso: -/// `RLMMongoClient`, `RLMMongoCollection` -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMMongoDatabase : NSObject - -/// The name of this database -@property (nonatomic, readonly) NSString *name; - -/// Gets a collection. -/// @param name The name of the collection to return -/// @returns The collection -- (RLMMongoCollection *)collectionWithName:(NSString *)name; -// NEXT-MAJOR: NS_SWIFT_NAME(collection(named:)) - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMNetworkTransport.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMNetworkTransport.h deleted file mode 100644 index 2884b4296..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMNetworkTransport.h +++ /dev/null @@ -1,132 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// Allowed HTTP methods to be used with `RLMNetworkTransport`. -typedef RLM_CLOSED_ENUM(int32_t, RLMHTTPMethod) { - /// GET is used to request data from a specified resource. - RLMHTTPMethodGET = 0, - /// POST is used to send data to a server to create/update a resource. - RLMHTTPMethodPOST = 1, - /// PATCH is used to send data to a server to update a resource. - RLMHTTPMethodPATCH = 2, - /// PUT is used to send data to a server to create/update a resource. - RLMHTTPMethodPUT = 3, - /// The DELETE method deletes the specified resource. - RLMHTTPMethodDELETE = 4 -}; - -/// An HTTP request that can be made to an arbitrary server. -@interface RLMRequest : NSObject - -/// The HTTP method of this request. -@property (nonatomic, assign) RLMHTTPMethod method; - -/// The URL to which this request will be made. -@property (nonatomic, strong) NSString *url; - -/// The number of milliseconds that the underlying transport should spend on an -/// HTTP round trip before failing with an error. -@property (nonatomic, assign) NSTimeInterval timeout; - -/// The HTTP headers of this request. -@property (nonatomic, strong) NSDictionary* headers; - -/// The body of the request. -@property (nonatomic, strong) NSString* body; - -@end - -/// The contents of an HTTP response. -@interface RLMResponse : NSObject - -/// The status code of the HTTP response. -@property (nonatomic, assign) NSInteger httpStatusCode; - -/// A custom status code provided by the SDK. -@property (nonatomic, assign) NSInteger customStatusCode; - -/// The headers of the HTTP response. -@property (nonatomic, strong) NSDictionary* headers; - -/// The body of the HTTP response. -@property (nonatomic, strong) NSString *body; - -@end - -/// Delegate which is used for subscribing to changes. -@protocol RLMEventDelegate -/// Invoked when a change event has been received. -/// @param event The change event encoded as NSData -- (void)didReceiveEvent:(NSData *)event; -/// A error has occurred while subscribing to changes. -/// @param error The error that has occurred. -- (void)didReceiveError:(NSError *)error; -/// The stream was opened. -- (void)didOpen; -/// The stream has been closed. -/// @param error The error that has occurred. -- (void)didCloseWithError:(NSError *_Nullable)error; -@end - -/// A block for receiving an `RLMResponse` from the `RLMNetworkTransport`. -RLM_SWIFT_SENDABLE // invoked on a backgroun thread -typedef void(^RLMNetworkTransportCompletionBlock)(RLMResponse *); - -/// Transporting protocol for foreign interfaces. Allows for custom -/// request/response handling. -RLM_SWIFT_SENDABLE // used from multiple threads so must be internally thread-safe -@protocol RLMNetworkTransport - -/** - Sends a request to a given endpoint. - - @param request The request to send. - @param completionBlock A callback invoked on completion of the request. -*/ -- (void)sendRequestToServer:(RLMRequest *)request - completion:(RLMNetworkTransportCompletionBlock)completionBlock; - -/// Starts an event stream request. -/// @param request The RLMRequest to start. -/// @param subscriber The RLMEventDelegate which will subscribe to changes from the server. -- (NSURLSession *)doStreamRequest:(RLMRequest *)request - eventSubscriber:(id)subscriber; - -@end - -/// Transporting protocol for foreign interfaces. Allows for custom -/// request/response handling. -RLM_SWIFT_SENDABLE // is internally thread-safe -@interface RLMNetworkTransport : NSObject - -/** - Sends a request to a given endpoint. - - @param request The request to send. - @param completionBlock A callback invoked on completion of the request. -*/ -- (void)sendRequestToServer:(RLMRequest *) request - completion:(RLMNetworkTransportCompletionBlock)completionBlock; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMObject.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMObject.h deleted file mode 100644 index 9bcfbe310..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMObject.h +++ /dev/null @@ -1,811 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMNotificationToken; -@class RLMObjectSchema; -@class RLMPropertyChange; -@class RLMPropertyDescriptor; -@class RLMRealm; -@class RLMResults; - -/** - `RLMObject` is a base class for model objects representing data stored in Realms. - - Define your model classes by subclassing `RLMObject` and adding properties to be managed. - Then instantiate and use your custom subclasses instead of using the `RLMObject` class directly. - - // Dog.h - @interface Dog : RLMObject - @property NSString *name; - @property BOOL adopted; - @end - - // Dog.m - @implementation Dog - @end //none needed - - ### Supported property types - - - `NSString` - - `NSInteger`, `int`, `long`, `float`, and `double` - - `BOOL` or `bool` - - `NSDate` - - `NSData` - - `NSNumber`, where `X` is one of `RLMInt`, `RLMFloat`, `RLMDouble` or `RLMBool`, for optional number properties - - `RLMObject` subclasses, to model many-to-one relationships. - - `RLMArray`, where `X` is an `RLMObject` subclass, to model many-to-many relationships. - - ### Querying - - You can initiate queries directly via the class methods: `allObjects`, `objectsWhere:`, and `objectsWithPredicate:`. - These methods allow you to easily query a custom subclass for instances of that class in the default Realm. - - To search in a Realm other than the default Realm, use the `allObjectsInRealm:`, `objectsInRealm:where:`, - and `objectsInRealm:withPredicate:` class methods. - - @see `RLMRealm` - - ### Relationships - - See our [Realm Swift Documentation](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/relationships/#relationships) for more details. - - ### Key-Value Observing - - All `RLMObject` properties (including properties you create in subclasses) are - [Key-Value Observing compliant](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/KeyValueObserving/KeyValueObserving.html), - except for `realm` and `objectSchema`. - - Keep the following tips in mind when observing Realm objects: - - 1. Unlike `NSMutableArray` properties, `RLMArray` properties do not require - using the proxy object returned from `-mutableArrayValueForKey:`, or defining - KVC mutation methods on the containing class. You can simply call methods on - the `RLMArray` directly; any changes will be automatically observed by the containing - object. - 2. Unmanaged `RLMObject` instances cannot be added to a Realm while they have any - observed properties. - 3. Modifying managed `RLMObject`s within `-observeValueForKeyPath:ofObject:change:context:` - is not recommended. Properties may change even when the Realm is not in a write - transaction (for example, when `-[RLMRealm refresh]` is called after changes - are made on a different thread), and notifications sent prior to the change - being applied (when `NSKeyValueObservingOptionPrior` is used) may be sent at - times when you *cannot* begin a write transaction. - */ - -@interface RLMObject : RLMObjectBase - -#pragma mark - Creating & Initializing Objects - -/** - Creates an unmanaged instance of a Realm object. - - Call `addObject:` on an `RLMRealm` instance to add an unmanaged object into that Realm. - - @see `[RLMRealm addObject:]` - */ -- (instancetype)init NS_DESIGNATED_INITIALIZER; - - -/** - Creates an unmanaged instance of a Realm object. - - Pass in an `NSArray` or `NSDictionary` instance to set the values of the object's properties. - - Call `addObject:` on an `RLMRealm` instance to add an unmanaged object into that Realm. - - @see `[RLMRealm addObject:]` - */ -- (instancetype)initWithValue:(id)value; - - -/** - Returns the class name for a Realm object subclass. - - @warning Do not override. Realm relies on this method returning the exact class - name. - - @return The class name for the model class. - */ -+ (NSString *)className; - -/** - Creates an instance of a Realm object with a given value, and adds it to the default Realm. - - If nested objects are included in the argument, `createInDefaultRealmWithValue:` will be recursively called - on them. - - The `value` argument can be a key-value coding compliant object, an array or dictionary returned from the methods in - `NSJSONSerialization`, or an array containing one element for each managed property. - - An exception will be thrown if any required properties are not present and those properties - were not defined with default values. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param value The value used to populate the object. - - @see `defaultPropertyValues` - */ -+ (instancetype)createInDefaultRealmWithValue:(id)value; - -/** - Creates an instance of a Realm object with a given value, and adds it to the specified Realm. - - If nested objects are included in the argument, `createInRealm:withValue:` will be recursively called - on them. - - The `value` argument can be a key-value coding compliant object, an array or dictionary returned from the methods in - `NSJSONSerialization`, or an array containing one element for each managed property. - - An exception will be thrown if any required properties are not present and those properties - were not defined with default values. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param realm The Realm which should manage the newly-created object. - @param value The value used to populate the object. - - @see `defaultPropertyValues` - */ -+ (instancetype)createInRealm:(RLMRealm *)realm withValue:(id)value; - -/** - Creates or updates a Realm object within the default Realm. - - This method may only be called on Realm object types with a primary key defined. If there is already - an object with the same primary key value in the default Realm, its values are updated and the object - is returned. Otherwise, this method creates and populates a new instance of the object in the default Realm. - - If nested objects are included in the argument, `createOrUpdateInDefaultRealmWithValue:` will be - recursively called on them if they have primary keys, `createInDefaultRealmWithValue:` if they do not. - - The `value` argument is used to populate the object. It can be a Realm object, a key-value coding - compliant object, an array or dictionary returned from the methods in `NSJSONSerialization`, or an - array containing one element for each managed property. - - If the object is being created, an exception will be thrown if any required properties - are not present and those properties were not defined with default values. - - If the `value` argument is a Realm object already managed by the default Realm, the - argument's type is the same as the receiver, and the objects have identical values for - their managed properties, this method does nothing. - - If the object is being updated, each property defined in its schema will be set by copying from - `value` using key-value coding. If the `value` argument does not respond to `valueForKey:` for a - given property name (or getter name, if defined), that value will remain untouched. - Nullable properties on the object can be set to nil by using `NSNull` as the updated value. - Each property is set even if the existing value is the same as the new value being set, and - notifications will report them all being changed. See `createOrUpdateModifiedInDefaultRealmWithValue:` - for a version of this function which only sets the values which have changed. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param value The value used to populate the object. - - @see `defaultPropertyValues`, `primaryKey` - */ -+ (instancetype)createOrUpdateInDefaultRealmWithValue:(id)value; - -/** - Creates or updates a Realm object within the default Realm. - - This method may only be called on Realm object types with a primary key defined. If there is already - an object with the same primary key value in the default Realm, its values are updated and the object - is returned. Otherwise, this method creates and populates a new instance of the object in the default Realm. - - If nested objects are included in the argument, `createOrUpdateModifiedInDefaultRealmWithValue:` will be - recursively called on them if they have primary keys, `createInDefaultRealmWithValue:` if they do not. - - The `value` argument is used to populate the object. It can be a Realm object, a key-value coding - compliant object, an array or dictionary returned from the methods in `NSJSONSerialization`, or an - array containing one element for each managed property. - - If the object is being created, an exception will be thrown if any required properties - are not present and those properties were not defined with default values. - - If the `value` argument is a Realm object already managed by the default Realm, the - argument's type is the same as the receiver, and the objects have identical values for - their managed properties, this method does nothing. - - If the object is being updated, each property defined in its schema will be set by copying from - `value` using key-value coding. If the `value` argument does not respond to `valueForKey:` for a - given property name (or getter name, if defined), that value will remain untouched. - Nullable properties on the object can be set to nil by using `NSNull` as the updated value. - Unlike `createOrUpdateInDefaultRealmWithValue:`, only properties which have changed in value are - set, and any change notifications produced by this call will report only which properies have - actually changed. - - Checking which properties have changed imposes a small amount of overhead, and so this method - may be slower when all or nearly all of the properties being set have changed. If most or all - of the properties being set have not changed, this method will be much faster than unconditionally - setting all of them, and will also reduce how much data has to be written to the Realm, saving - both i/o time and disk space. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param value The value used to populate the object. - - @see `defaultPropertyValues`, `primaryKey` - */ -+ (instancetype)createOrUpdateModifiedInDefaultRealmWithValue:(id)value; - -/** - Creates or updates an Realm object within a specified Realm. - - This method may only be called on Realm object types with a primary key defined. If there is already - an object with the same primary key value in the given Realm, its values are updated and the object - is returned. Otherwise this method creates and populates a new instance of this object in the given Realm. - - If nested objects are included in the argument, `createOrUpdateInRealm:withValue:` will be - recursively called on them if they have primary keys, `createInRealm:withValue:` if they do not. - - The `value` argument is used to populate the object. It can be a Realm object, a key-value coding - compliant object, an array or dictionary returned from the methods in `NSJSONSerialization`, or an - array containing one element for each managed property. - - If the object is being created, an exception will be thrown if any required properties - are not present and those properties were not defined with default values. - - If the `value` argument is a Realm object already managed by the given Realm, the - argument's type is the same as the receiver, and the objects have identical values for - their managed properties, this method does nothing. - - If the object is being updated, each property defined in its schema will be set by copying from - `value` using key-value coding. If the `value` argument does not respond to `valueForKey:` for a - given property name (or getter name, if defined), that value will remain untouched. - Nullable properties on the object can be set to nil by using `NSNull` as the updated value. - Each property is set even if the existing value is the same as the new value being set, and - notifications will report them all being changed. See `createOrUpdateModifiedInRealm:withValue:` - for a version of this function which only sets the values which have changed. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param realm The Realm which should own the object. - @param value The value used to populate the object. - - @see `defaultPropertyValues`, `primaryKey` - */ -+ (instancetype)createOrUpdateInRealm:(RLMRealm *)realm withValue:(id)value; - -/** - Creates or updates an Realm object within a specified Realm. - - This method may only be called on Realm object types with a primary key defined. If there is already - an object with the same primary key value in the given Realm, its values are updated and the object - is returned. Otherwise this method creates and populates a new instance of this object in the given Realm. - - If nested objects are included in the argument, `createOrUpdateInRealm:withValue:` will be - recursively called on them if they have primary keys, `createInRealm:withValue:` if they do not. - - The `value` argument is used to populate the object. It can be a Realm object, a key-value coding - compliant object, an array or dictionary returned from the methods in `NSJSONSerialization`, or an - array containing one element for each managed property. - - If the object is being created, an exception will be thrown if any required properties - are not present and those properties were not defined with default values. - - If the `value` argument is a Realm object already managed by the given Realm, the - argument's type is the same as the receiver, and the objects have identical values for - their managed properties, this method does nothing. - - If the object is being updated, each property defined in its schema will be set by copying from - `value` using key-value coding. If the `value` argument does not respond to `valueForKey:` for a - given property name (or getter name, if defined), that value will remain untouched. - Nullable properties on the object can be set to nil by using `NSNull` as the updated value. - Unlike `createOrUpdateInRealm:withValue:`, only properties which have changed in value are - set, and any change notifications produced by this call will report only which properies have - actually changed. - - Checking which properties have changed imposes a small amount of overhead, and so this method - may be slower when all or nearly all of the properties being set have changed. If most or all - of the properties being set have not changed, this method will be much faster than unconditionally - setting all of them, and will also reduce how much data has to be written to the Realm, saving - both i/o time and disk space. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param realm The Realm which should own the object. - @param value The value used to populate the object. - - @see `defaultPropertyValues`, `primaryKey` - */ -+ (instancetype)createOrUpdateModifiedInRealm:(RLMRealm *)realm withValue:(id)value; - -#pragma mark - Properties - -/** - The Realm which manages the object, or `nil` if the object is unmanaged. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - The object schema which lists the managed properties for the object. - */ -@property (nonatomic, readonly) RLMObjectSchema *objectSchema; - -/** - Indicates if the object can no longer be accessed because it is now invalid. - - An object can no longer be accessed if the object has been deleted from the Realm that manages it, or - if `invalidate` is called on that Realm. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if this object is frozen. - - @see `-[RLMObject freeze]` - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - - -#pragma mark - Customizing your Objects - -/** - Returns an array of property names for properties which should be indexed. - - Only string, integer, boolean, and `NSDate` properties are supported. - - @return An array of property names. - */ -+ (NSArray *)indexedProperties; - -/** - Override this method to specify the default values to be used for each property. - - @return A dictionary mapping property names to their default values. - */ -+ (nullable NSDictionary *)defaultPropertyValues; - -/** - Override this method to specify the name of a property to be used as the primary key. - - Only properties of types `RLMPropertyTypeString` and `RLMPropertyTypeInt` can be designated as the primary key. - Primary key properties enforce uniqueness for each value whenever the property is set, which incurs minor overhead. - Indexes are created automatically for primary key properties. - - @return The name of the property designated as the primary key. - */ -+ (nullable NSString *)primaryKey; - -/** - Override this method to specify the names of properties to ignore. These properties will not be managed by the Realm - that manages the object. - - @return An array of property names to ignore. - */ -+ (nullable NSArray *)ignoredProperties; - -/** - Override this method to specify the names of properties that are non-optional (i.e. cannot be assigned a `nil` value). - - By default, all properties of a type whose values can be set to `nil` are considered optional properties. - To require that an object in a Realm always store a non-`nil` value for a property, - add the name of the property to the array returned from this method. - - Properties of `RLMObject` type cannot be non-optional. Array and `NSNumber` properties - can be non-optional, but there is no reason to do so: arrays do not support storing nil, and - if you want a non-optional number you should instead use the primitive type. - - @return An array of property names that are required. - */ -+ (NSArray *)requiredProperties; - -/** - Override this method to provide information related to properties containing linking objects. - - Each property of type `RLMLinkingObjects` must have a key in the dictionary returned by this method consisting - of the property name. The corresponding value must be an instance of `RLMPropertyDescriptor` that describes the class - and property that the property is linked to. - - return @{ @"owners": [RLMPropertyDescriptor descriptorWithClass:Owner.class propertyName:@"dogs"] }; - - @return A dictionary mapping property names to `RLMPropertyDescriptor` instances. - */ -+ (NSDictionary *)linkingObjectsProperties; - -#pragma mark - Getting & Querying Objects from the Default Realm - -/** - Returns all objects of this object type from the default Realm. - - @return An `RLMResults` containing all objects of this type in the default Realm. - */ -+ (RLMResults *)allObjects; - -/** - Returns all objects of this object type matching the given predicate from the default Realm. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` containing all objects of this type in the default Realm that match the given predicate. - */ -+ (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -+ (RLMResults<__kindof RLMObject *> *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - - -/** - Returns all objects of this object type matching the given predicate from the default Realm. - - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` containing all objects of this type in the default Realm that match the given predicate. - */ -+ (RLMResults *)objectsWithPredicate:(nullable NSPredicate *)predicate; - -/** - Retrieves the single instance of this object type with the given primary key from the default Realm. - - Returns the object from the default Realm which has the given primary key, or - `nil` if the object does not exist. This is slightly faster than the otherwise - equivalent `[[SubclassName objectsWhere:@"primaryKeyPropertyName = %@", key] firstObject]`. - - This method requires that `primaryKey` be overridden on the receiving subclass. - - @return An object of this object type, or `nil` if an object with the given primary key does not exist. - @see `-primaryKey` - */ -+ (nullable instancetype)objectForPrimaryKey:(nullable id)primaryKey NS_SWIFT_NAME(object(forPrimaryKey:)); - - -#pragma mark - Querying Specific Realms - -/** - Returns all objects of this object type from the specified Realm. - - @param realm The Realm to query. - - @return An `RLMResults` containing all objects of this type in the specified Realm. - */ -+ (RLMResults *)allObjectsInRealm:(RLMRealm *)realm; - -/** - Returns all objects of this object type matching the given predicate from the specified Realm. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - @param realm The Realm to query. - - @return An `RLMResults` containing all objects of this type in the specified Realm that match the given predicate. - */ -+ (RLMResults *)objectsInRealm:(RLMRealm *)realm where:(NSString *)predicateFormat, ...; - -/// :nodoc: -+ (RLMResults<__kindof RLMObject *> *)objectsInRealm:(RLMRealm *)realm where:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all objects of this object type matching the given predicate from the specified Realm. - - @param predicate A predicate to use to filter the elements. - @param realm The Realm to query. - - @return An `RLMResults` containing all objects of this type in the specified Realm that match the given predicate. - */ -+ (RLMResults *)objectsInRealm:(RLMRealm *)realm withPredicate:(nullable NSPredicate *)predicate; - -/** - Retrieves the single instance of this object type with the given primary key from the specified Realm. - - Returns the object from the specified Realm which has the given primary key, or - `nil` if the object does not exist. This is slightly faster than the otherwise - equivalent `[[SubclassName objectsInRealm:realm where:@"primaryKeyPropertyName = %@", key] firstObject]`. - - This method requires that `primaryKey` be overridden on the receiving subclass. - - @return An object of this object type, or `nil` if an object with the given primary key does not exist. - @see `-primaryKey` - */ -+ (nullable instancetype)objectInRealm:(RLMRealm *)realm forPrimaryKey:(nullable id)primaryKey NS_SWIFT_NAME(object(in:forPrimaryKey:)); - -#pragma mark - Notifications - -/** - A callback block for `RLMObject` notifications. - - If the object is deleted from the managing Realm, the block is called with - `deleted` set to `YES` and the other two arguments are `nil`. The block will - never be called again after this. - - If the object is modified, the block will be called with `deleted` set to - `NO`, a `nil` error, and an array of `RLMPropertyChange` objects which - indicate which properties of the objects were modified. - - `error` is always `nil` and will be removed in a future version. - */ -typedef void (^RLMObjectChangeBlock)(BOOL deleted, - NSArray *_Nullable changes, - NSError *_Nullable error); - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When notifications - can't be delivered instantly, multiple notifications may be coalesced into a - single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - - @param block The block to be called whenever a change occurs. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block queue:(dispatch_queue_t)queue; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block keyPaths:(NSArray *)keyPaths queue:(dispatch_queue_t)queue; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block keyPaths:(NSArray *)keyPaths; - - -#pragma mark - Other Instance Methods - -/** - Returns YES if another Realm object instance points to the same object as the receiver in the Realm managing - the receiver. - - For frozen objects and object types with a primary key, `isEqual:` is - overridden to use the same logic as this method (along with a corresponding - implementation for `hash`). Non-frozen objects without primary keys use - pointer identity for `isEqual:` and `hash`. - - @param object The object to compare the receiver to. - - @return Whether the object represents the same object as the receiver. - */ -- (BOOL)isEqualToObject:(RLMObject *)object; - -/** - Returns a frozen (immutable) snapshot of this object. - - The frozen copy is an immutable object which contains the same data as this - object currently contains, but will not update when writes are made to the - containing Realm. Unlike live objects, frozen objects can be accessed from any - thread. - - - warning: Holding onto a frozen object for an extended period while performing write - transaction on the Realm may result in the Realm file growing to large sizes. See - `Realm.Configuration.maximumNumberOfActiveVersions` for more information. - - warning: This method can only be called on a managed object. - */ -- (instancetype)freeze NS_RETURNS_RETAINED; - -/** - Returns a live (mutable) reference of this object. - - This method creates a managed accessor to a live copy of the same frozen object. - Will return self if called on an already live object. - */ -- (instancetype)thaw; - -#pragma mark - Dynamic Accessors - -/// :nodoc: -- (nullable id)objectForKeyedSubscript:(NSString *)key; - -/// :nodoc: -- (void)setObject:(nullable id)obj forKeyedSubscript:(NSString *)key; - -@end - -/** - Information about a specific property which changed in an `RLMObject` change notification. - */ -@interface RLMPropertyChange : NSObject - -/** - The name of the property which changed. - */ -@property (nonatomic, readonly, strong) NSString *name; - -/** - The value of the property before the change occurred. This will always be `nil` - if the change happened on the same thread as the notification and for `RLMArray` - properties. - - For object properties this will give the object which was previously linked to, - but that object will have its new values and not the values it had before the - changes. This means that `previousValue` may be a deleted object, and you will - need to check `invalidated` before accessing any of its properties. - */ -@property (nonatomic, readonly, strong, nullable) id previousValue; - -/** - The value of the property after the change occurred. This will always be `nil` - for `RLMArray` properties. - */ -@property (nonatomic, readonly, strong, nullable) id value; -@end - -#pragma mark - RLMArray Property Declaration - -/** - Properties on `RLMObject`s of type `RLMArray` must have an associated type. A type is associated - with an `RLMArray` property by defining a protocol for the object type that the array should contain. - To define the protocol for an object, you can use the macro RLM_ARRAY_TYPE: - - RLM_ARRAY_TYPE(ObjectType) - ... - @property RLMArray *arrayOfObjectTypes; - */ -#define RLM_ARRAY_TYPE(RLM_OBJECT_SUBCLASS)\ -__attribute__((deprecated("RLM_ARRAY_TYPE has been deprecated. Use RLM_COLLECTION_TYPE instead."))) \ -@protocol RLM_OBJECT_SUBCLASS \ -@end - -/** - Properties on `RLMObject`s of type `RLMSet` / `RLMArray` must have an associated type. A type is associated - with an `RLMSet` / `RLMArray` property by defining a protocol for the object type that the array should contain. - To define the protocol for an object, you can use the macro RLM_COLLECTION_TYPE: - - RLM_COLLECTION_TYPE(ObjectType) - ... - @property RLMSet *setOfObjectTypes; - @property RLMArray *arrayOfObjectTypes; - */ -#define RLM_COLLECTION_TYPE(RLM_OBJECT_SUBCLASS)\ -@protocol RLM_OBJECT_SUBCLASS \ -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMObjectBase.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMObjectBase.h deleted file mode 100644 index 7e9c83c8f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMObjectBase.h +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// :nodoc: -@interface RLMObjectBase : NSObject - -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -- (instancetype)init NS_DESIGNATED_INITIALIZER; - -+ (NSString *)className; - -// Returns whether the class is included in the default set of classes managed by a Realm. -+ (BOOL)shouldIncludeInDefaultSchema; - -+ (nullable NSString *)_realmObjectName; -+ (nullable NSDictionary *)_realmColumnNames; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMObjectBase_Dynamic.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMObjectBase_Dynamic.h deleted file mode 100644 index fb74a5b27..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMObjectBase_Dynamic.h +++ /dev/null @@ -1,82 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectSchema, RLMRealm; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -/** - Returns the Realm that manages the object, if one exists. - - @warning This function is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is - recommended to retrieve the Realm that manages the object via `RLMObject`. - - @param object An `RLMObjectBase` obtained via a Swift `Object` or `RLMObject`. - - @return The Realm which manages this object. Returns `nil `for unmanaged objects. - */ -FOUNDATION_EXTERN RLMRealm * _Nullable RLMObjectBaseRealm(RLMObjectBase * _Nullable object); - -/** - Returns an `RLMObjectSchema` which describes the managed properties of the object. - - @warning This function is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is - recommended to retrieve `objectSchema` via `RLMObject`. - - @param object An `RLMObjectBase` obtained via a Swift `Object` or `RLMObject`. - - @return The object schema which lists the managed properties for the object. - */ -FOUNDATION_EXTERN RLMObjectSchema * _Nullable RLMObjectBaseObjectSchema(RLMObjectBase * _Nullable object); - -/** - Returns the object corresponding to a key value. - - @warning This function is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is - recommended to retrieve key values via `RLMObject`. - - @warning Will throw an `NSUndefinedKeyException` if `key` is not present on the object. - - @param object An `RLMObjectBase` obtained via a Swift `Object` or `RLMObject`. - @param key The name of the property. - - @return The object for the property requested. - */ -FOUNDATION_EXTERN id _Nullable RLMObjectBaseObjectForKeyedSubscript(RLMObjectBase * _Nullable object, NSString *key); - -/** - Sets a value for a key on the object. - - @warning This function is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is - recommended to set key values via `RLMObject`. - - @warning Will throw an `NSUndefinedKeyException` if `key` is not present on the object. - - @param object An `RLMObjectBase` obtained via a Swift `Object` or `RLMObject`. - @param key The name of the property. - @param obj The object to set as the value of the key. - */ -FOUNDATION_EXTERN void RLMObjectBaseSetObjectForKeyedSubscript(RLMObjectBase * _Nullable object, NSString *key, id _Nullable obj); - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMObjectId.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMObjectId.h deleted file mode 100644 index 32ef7b047..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMObjectId.h +++ /dev/null @@ -1,79 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A 12-byte (probably) unique object identifier. - - ObjectIds are similar to a GUID or a UUID, and can be used to uniquely identify - objects without a centralized ID generator. An ObjectID consists of: - - 1. A 4 byte timestamp measuring the creation time of the ObjectId in seconds - since the Unix epoch. - 2. A 5 byte random value - 3. A 3 byte counter, initialized to a random value. - - ObjectIds are intended to be fast to generate. Sorting by an ObjectId field - will typically result in the objects being sorted in creation order. - */ -RLM_SWIFT_SENDABLE // immutable -@interface RLMObjectId : NSObject -/// Creates a new randomly-initialized ObjectId. -+ (nonnull instancetype)objectId NS_SWIFT_NAME(generate()); - -/// Creates a new zero-initialized ObjectId. -- (instancetype)init; - -/// Creates a new ObjectId from the given 24-byte hexadecimal string. -/// -/// Returns `nil` and sets `error` if the string is not 24 characters long or -/// contains any characters other than 0-9a-fA-F. -/// -/// @param string The string to parse. -- (nullable instancetype)initWithString:(NSString *)string - error:(NSError **)error; - -/// Creates a new ObjectId using the given date, machine identifier, process identifier. -/// -/// @param timestamp A timestamp as NSDate. -/// @param machineIdentifier The machine identifier. -/// @param processIdentifier The process identifier. -- (instancetype)initWithTimestamp:(NSDate *)timestamp - machineIdentifier:(int)machineIdentifier - processIdentifier:(int)processIdentifier; - -/// Comparision operator to check if the right hand side is greater than the current value. -- (BOOL)isGreaterThan:(nullable RLMObjectId *)objectId; -/// Comparision operator to check if the right hand side is greater than or equal to the current value. -- (BOOL)isGreaterThanOrEqualTo:(nullable RLMObjectId *)objectId; -/// Comparision operator to check if the right hand side is less than the current value. -- (BOOL)isLessThan:(nullable RLMObjectId *)objectId; -/// Comparision operator to check if the right hand side is less than or equal to the current value. -- (BOOL)isLessThanOrEqualTo:(nullable RLMObjectId *)objectId; - -/// Get the ObjectId as a 24-character hexadecimal string. -@property (nonatomic, readonly) NSString *stringValue; -/// Get the timestamp for the RLMObjectId -@property (nonatomic, readonly) NSDate *timestamp; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMObjectSchema.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMObjectSchema.h deleted file mode 100644 index 9c4666b7c..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMObjectSchema.h +++ /dev/null @@ -1,83 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMProperty; - -/** - This class represents Realm model object schemas. - - When using Realm, `RLMObjectSchema` instances allow performing migrations and - introspecting the database's schema. - - Object schemas map to tables in the core database. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // not actually immutable, but the public API kinda is -@interface RLMObjectSchema : NSObject - -#pragma mark - Properties - -/** - An array of `RLMProperty` instances representing the managed properties of a class described by the schema. - - @see `RLMProperty` - */ -@property (nonatomic, readonly, copy) NSArray *properties; - -/** - The name of the class the schema describes. - */ -@property (nonatomic, readonly) NSString *className; - -/** - The property which serves as the primary key for the class the schema describes, if any. - */ -@property (nonatomic, readonly, nullable) RLMProperty *primaryKeyProperty; - -/** - Whether this object type is embedded. - */ -@property (nonatomic, readonly) BOOL isEmbedded; - -/** - Whether this object is asymmetric. - */ -@property (nonatomic, readonly) BOOL isAsymmetric; - -#pragma mark - Methods - -/** - Retrieves an `RLMProperty` object by the property name. - - @param propertyName The property's name. - - @return An `RLMProperty` object, or `nil` if there is no property with the given name. - */ -- (nullable RLMProperty *)objectForKeyedSubscript:(NSString *)propertyName; - -/** - Returns whether two `RLMObjectSchema` instances are equal. - */ -- (BOOL)isEqualToObjectSchema:(RLMObjectSchema *)objectSchema; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMProperty.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMProperty.h deleted file mode 100644 index 7f2594d3b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMProperty.h +++ /dev/null @@ -1,149 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// :nodoc: -@protocol RLMInt @end -/// :nodoc: -@protocol RLMBool @end -/// :nodoc: -@protocol RLMDouble @end -/// :nodoc: -@protocol RLMFloat @end -/// :nodoc: -@protocol RLMString @end -/// :nodoc: -@protocol RLMDate @end -/// :nodoc: -@protocol RLMData @end -/// :nodoc: -@protocol RLMDecimal128 @end -/// :nodoc: -@protocol RLMObjectId @end -/// :nodoc: -@protocol RLMUUID @end - -/// :nodoc: -@interface NSNumber () -@end - -/** - `RLMProperty` instances represent properties managed by a Realm in the context - of an object schema. Such properties may be persisted to a Realm file or - computed from other data from the Realm. - - When using Realm, `RLMProperty` instances allow performing migrations and - introspecting the database's schema. - - These property instances map to columns in the core database. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // not actually immutable, but the public API kinda is -@interface RLMProperty : NSObject - -#pragma mark - Properties - -/** - The name of the property. - */ -@property (nonatomic, readonly) NSString *name; - -/** - The type of the property. - - @see `RLMPropertyType` - */ -@property (nonatomic, readonly) RLMPropertyType type; - -/** - Indicates whether this property is indexed. - - @see `RLMObject` - */ -@property (nonatomic, readonly) BOOL indexed; - -/** - For `RLMObject` and `RLMCollection` properties, the name of the class of object stored in the property. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - For linking objects properties, the property name of the property the linking objects property is linked to. - */ -@property (nonatomic, readonly, copy, nullable) NSString *linkOriginPropertyName; - -/** - Indicates whether this property is optional. - */ -@property (nonatomic, readonly) BOOL optional; - -/** - Indicates whether this property is an array. - */ -@property (nonatomic, readonly) BOOL array; - -/** - Indicates whether this property is a set. - */ -@property (nonatomic, readonly) BOOL set; - -/** - Indicates whether this property is a dictionary. - */ -@property (nonatomic, readonly) BOOL dictionary; - -/** - Indicates whether this property is an array or set. - */ -@property (nonatomic, readonly) BOOL collection; - -#pragma mark - Methods - -/** - Returns whether a given property object is equal to the receiver. - */ -- (BOOL)isEqualToProperty:(RLMProperty *)property; - -@end - - -/** - An `RLMPropertyDescriptor` instance represents a specific property on a given class. - */ -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMPropertyDescriptor : NSObject - -/** - Creates and returns a property descriptor. - - @param objectClass The class of this property descriptor. - @param propertyName The name of this property descriptor. - */ -+ (instancetype)descriptorWithClass:(Class)objectClass propertyName:(NSString *)propertyName; - -/// The class of the property. -@property (nonatomic, readonly) Class objectClass; - -/// The name of the property. -@property (nonatomic, readonly) NSString *propertyName; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMProviderClient.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMProviderClient.h deleted file mode 100644 index ac649960a..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMProviderClient.h +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMApp; - -/// Base provider client interface. -RLM_SWIFT_SENDABLE -@interface RLMProviderClient : NSObject - -/// The app associated with this provider client. -@property (nonatomic, strong, readonly) RLMApp *app; - -/** - Initialize a provider client with a given app. - @param app The app for this provider client. - */ -- (instancetype)initWithApp:(RLMApp *)app; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMPushClient.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMPushClient.h deleted file mode 100644 index 0628c3ada..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMPushClient.h +++ /dev/null @@ -1,47 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMApp, RLMUser; - -/// A block type used to report an error -RLM_SWIFT_SENDABLE // invoked on a backgroun thread -typedef void(^RLMOptionalErrorBlock)(NSError * _Nullable); - -/// A client which can be used to register devices with the server to receive push notificatons -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMPushClient : NSObject - -/// The push notification service name the device will be registered with on the server -@property (nonatomic, readonly, nonnull) NSString *serviceName; - -/// Request to register device token to the server -- (void)registerDeviceWithToken:(NSString *)token - user:(RLMUser *)user - completion:(RLMOptionalErrorBlock)completion NS_SWIFT_NAME(registerDevice(token:user:completion:)); - -/// Request to deregister a device for a user -- (void)deregisterDeviceForUser:(RLMUser *)user - completion:(RLMOptionalErrorBlock)completion NS_SWIFT_NAME(deregisterDevice(user:completion:)); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMRealm+Sync.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMRealm+Sync.h deleted file mode 100644 index ff20e43c2..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMRealm+Sync.h +++ /dev/null @@ -1,38 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2017 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -@class RLMResults, RLMSyncSession; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -/// -@interface RLMRealm (Sync) - -/** - Get the RLMSyncSession used by this Realm. Will be nil if this is not a - synchronized Realm. -*/ -@property (nonatomic, nullable, readonly) RLMSyncSession *syncSession; - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMRealm.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMRealm.h deleted file mode 100644 index 0935e5301..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMRealm.h +++ /dev/null @@ -1,962 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMRealmConfiguration, RLMRealm, RLMObject, RLMSchema, RLMMigration, RLMNotificationToken, RLMThreadSafeReference, RLMAsyncOpenTask, RLMSyncSubscriptionSet; - -/** - A callback block for opening Realms asynchronously. - - Returns the Realm if the open was successful, or an error otherwise. - */ -typedef void(^RLMAsyncOpenRealmCallback)(RLMRealm * _Nullable realm, NSError * _Nullable error); - -/// The Id of the asynchronous transaction. -typedef unsigned RLMAsyncTransactionId; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - An `RLMRealm` instance (also referred to as "a Realm") represents a Realm - database. - - Realms can either be stored on disk (see `+[RLMRealm realmWithURL:]`) or in - memory (see `RLMRealmConfiguration`). - - `RLMRealm` instances are cached internally, and constructing equivalent `RLMRealm` - objects (for example, by using the same path or identifier) multiple times on a single thread - within a single iteration of the run loop will normally return the same - `RLMRealm` object. - - If you specifically want to ensure an `RLMRealm` instance is - destroyed (for example, if you wish to open a Realm, check some property, and - then possibly delete the Realm file and re-open it), place the code which uses - the Realm within an `@autoreleasepool {}` and ensure you have no other - strong references to it. - - @warning Non-frozen `RLMRealm` instances are thread-confined and cannot be - shared across threads or dispatch queues. Trying to do so will cause an - exception to be thrown. You must call this method on each thread you want to - interact with the Realm on. For dispatch queues, this means that you must call - it in each block which is dispatched, as a queue is not guaranteed to run all - of its blocks on the same thread. - */ - -@interface RLMRealm : NSObject - -#pragma mark - Creating & Initializing a Realm - -/** - Obtains an instance of the default Realm. - - The default Realm is used by the `RLMObject` class methods - which do not take an `RLMRealm` parameter, but is otherwise not special. The - default Realm is persisted as *default.realm* under the *Documents* directory of - your Application on iOS, in your application's *Application Support* - directory on macOS, and in the *Cache* directory on tvOS. - - The default Realm is created using the default `RLMRealmConfiguration`, which - can be changed via `+[RLMRealmConfiguration setDefaultConfiguration:]`. - - @return The default `RLMRealm` instance for the current thread. - */ -+ (instancetype)defaultRealm; - -/** - Obtains an instance of the default Realm bound to the given queue. - - Rather than being confined to the thread they are opened on, queue-bound - RLMRealms are confined to the given queue. They can be accessed from any - thread as long as it is from within a block dispatch to the queue, and - notifications will be delivered to the queue instead of a thread's run loop. - - Realms can only be confined to a serial queue. Queue-confined RLMRealm - instances can be obtained when not on that queue, but attempting to do - anything with that instance without first dispatching to the queue will throw - an incorrect thread exception. - - The default Realm is created using the default `RLMRealmConfiguration`, which - can be changed via `+[RLMRealmConfiguration setDefaultConfiguration:]`. - - @param queue A serial dispatch queue to confine the Realm to. - @return The default `RLMRealm` instance for the given queue. - */ -+ (instancetype)defaultRealmForQueue:(dispatch_queue_t)queue; - -/** - Obtains an `RLMRealm` instance with the given configuration. - - @param configuration A configuration object to use when creating the Realm. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return An `RLMRealm` instance. - */ -+ (nullable instancetype)realmWithConfiguration:(RLMRealmConfiguration *)configuration error:(NSError **)error; - -/** - Obtains an `RLMRealm` instance with the given configuration bound to the given queue. - - Rather than being confined to the thread they are opened on, queue-bound - RLMRealms are confined to the given queue. They can be accessed from any - thread as long as it is from within a block dispatch to the queue, and - notifications will be delivered to the queue instead of a thread's run loop. - - Realms can only be confined to a serial queue. Queue-confined RLMRealm - instances can be obtained when not on that queue, but attempting to do - anything with that instance without first dispatching to the queue will throw - an incorrect thread exception. - - @param configuration A configuration object to use when creating the Realm. - @param queue A serial dispatch queue to confine the Realm to. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return An `RLMRealm` instance. - */ -+ (nullable instancetype)realmWithConfiguration:(RLMRealmConfiguration *)configuration - queue:(nullable dispatch_queue_t)queue - error:(NSError **)error; - -/** - Obtains an `RLMRealm` instance persisted at a specified file URL. - - @param fileURL The local URL of the file the Realm should be saved at. - - @return An `RLMRealm` instance. - */ -+ (instancetype)realmWithURL:(NSURL *)fileURL; - -/** - Asynchronously open a Realm and deliver it to a block on the given queue. - - Opening a Realm asynchronously will perform all work needed to get the Realm to - a usable state (such as running potentially time-consuming migrations) on a - background thread before dispatching to the given queue. In addition, - synchronized Realms wait for all remote content available at the time the - operation began to be downloaded and available locally. - - The Realm passed to the callback function is confined to the callback queue as - if `-[RLMRealm realmWithConfiguration:queue:error]` was used. - - @param configuration A configuration object to use when opening the Realm. - @param callbackQueue The serial dispatch queue on which the callback should be run. - @param callback A callback block. If the Realm was successfully opened, - it will be passed in as an argument. - Otherwise, an `NSError` describing what went wrong will be - passed to the block instead. - */ -+ (RLMAsyncOpenTask *)asyncOpenWithConfiguration:(RLMRealmConfiguration *)configuration - callbackQueue:(dispatch_queue_t)callbackQueue - callback:(RLMAsyncOpenRealmCallback)callback; - -/** - The `RLMSchema` used by the Realm. - */ -@property (nonatomic, readonly) RLMSchema *schema; - -/** - Indicates if the Realm is currently engaged in a write transaction. - - @warning Do not simply check this property and then start a write transaction whenever an object needs to be - created, updated, or removed. Doing so might cause a large number of write transactions to be created, - degrading performance. Instead, always prefer performing multiple updates during a single transaction. - */ -@property (nonatomic, readonly) BOOL inWriteTransaction; - -/** - The `RLMRealmConfiguration` object that was used to create this `RLMRealm` instance. - */ -@property (nonatomic, readonly) RLMRealmConfiguration *configuration; - -/** - Indicates if this Realm contains any objects. - */ -@property (nonatomic, readonly) BOOL isEmpty; - -/** - Indicates if this Realm is frozen. - - @see `-[RLMRealm freeze]` - */ -@property (nonatomic, readonly, getter=isFrozen) BOOL frozen; - -/** - Returns a frozen (immutable) snapshot of this Realm. - - A frozen Realm is an immutable snapshot view of a particular version of a - Realm's data. Unlike normal RLMRealm instances, it does not live-update to - reflect writes made to the Realm, and can be accessed from any thread. Writing - to a frozen Realm is not allowed, and attempting to begin a write transaction - will throw an exception. - - All objects and collections read from a frozen Realm will also be frozen. - */ -- (RLMRealm *)freeze NS_RETURNS_RETAINED; - -/** - Returns a live reference of this Realm. - - All objects and collections read from the returned Realm will no longer be frozen. - This method will return `self` if it is not already frozen. - */ -- (RLMRealm *)thaw; - -#pragma mark - File Management - -/** - Writes a compacted and optionally encrypted copy of the Realm to the given local URL. - - The destination file cannot already exist. - - Note that if this method is called from within a write transaction, the - *current* data is written, not the data from the point when the previous write - transaction was committed. - - @param fileURL Local URL to save the Realm to. - @param key Optional 64-byte encryption key to encrypt the new file with. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return `YES` if the Realm was successfully written to disk, `NO` if an error occurred. - */ -- (BOOL)writeCopyToURL:(NSURL *)fileURL encryptionKey:(nullable NSData *)key error:(NSError **)error; - -/** - Writes a copy of the Realm to a given location specified by a given configuration. - - If the configuration supplied is derived from a `RLMUser` then this Realm will be copied with - sync functionality enabled. - - The destination file cannot already exist. - - @param configuration A Realm Configuration. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return `YES` if the Realm was successfully written to disk, `NO` if an error occurred. - */ -- (BOOL)writeCopyForConfiguration:(RLMRealmConfiguration *)configuration error:(NSError **)error; - -/** - Checks if the Realm file for the given configuration exists locally on disk. - - For non-synchronized, non-in-memory Realms, this is equivalent to - `-[NSFileManager.defaultManager fileExistsAtPath:config.path]`. For - synchronized Realms, it takes care of computing the actual path on disk based - on the server, virtual path, and user as is done when opening the Realm. - - @param config A Realm configuration to check the existence of. - @return YES if the Realm file for the given configuration exists on disk, NO otherwise. - */ -+ (BOOL)fileExistsForConfiguration:(RLMRealmConfiguration *)config; - -/** - Deletes the local Realm file and associated temporary files for the given configuration. - - This deletes the ".realm", ".note" and ".management" files which would be - created by opening the Realm with the given configuration. It does not delete - the ".lock" file (which contains no persisted data and is recreated from - scratch every time the Realm file is opened). - - The Realm must not be currently open on any thread or in another process. If - it is, this will return NO and report the error RLMErrorAlreadyOpen. Attempting to open - the Realm on another thread while the deletion is happening will block (and - then create a new Realm and open that afterwards). - - If the Realm already does not exist this will return `NO` and report the error NSFileNoSuchFileError; - - @param config A Realm configuration identifying the Realm to be deleted. - @return YES if any files were deleted, NO otherwise. - */ -+ (BOOL)deleteFilesForConfiguration:(RLMRealmConfiguration *)config error:(NSError **)error - __attribute__((swift_error(nonnull_error))); - -#pragma mark - Notifications - -/** - The type of a block to run whenever the data within the Realm is modified. - - @see `-[RLMRealm addNotificationBlock:]` - */ -typedef void (^RLMNotificationBlock)(RLMNotification notification, RLMRealm *realm); - -#pragma mark - Receiving Notification when a Realm Changes - -/** - Adds a notification handler for changes in this Realm, and returns a notification token. - - Notification handlers are called after each write transaction is committed, - either on the current thread or other threads. - - Handler blocks are called on the same thread that they were added on, and may - only be added on threads which are currently within a run loop. Unless you are - specifically creating and running a run loop on a background thread, this will - normally only be the main thread. - - The block has the following definition: - - typedef void(^RLMNotificationBlock)(RLMNotification notification, RLMRealm *realm); - - It receives the following parameters: - - - `NSString` \***notification**: The name of the incoming notification. See - `RLMRealmNotification` for information on what - notifications are sent. - - `RLMRealm` \***realm**: The Realm for which this notification occurred. - - @param block A block which is called to process Realm notifications. - - @return A token object which must be retained as long as you wish to continue - receiving change notifications. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMNotificationBlock)block __attribute__((warn_unused_result)); - -#pragma mark - Writing to a Realm - -/** - Begins a write transaction on the Realm. - - Only one write transaction can be open at a time for each Realm file. Write - transactions cannot be nested, and trying to begin a write transaction on a - Realm which is already in a write transaction will throw an exception. Calls to - `beginWriteTransaction` from `RLMRealm` instances for the same Realm file in - other threads or other processes will block until the current write transaction - completes or is cancelled. - - Before beginning the write transaction, `beginWriteTransaction` updates the - `RLMRealm` instance to the latest Realm version, as if `refresh` had been - called, and generates notifications if applicable. This has no effect if the - Realm was already up to date. - - It is rarely a good idea to have write transactions span multiple cycles of - the run loop, but if you do wish to do so you will need to ensure that the - Realm participating in the write transaction is kept alive until the write - transaction is committed. - */ -- (void)beginWriteTransaction; - -/** - Commits all write operations in the current write transaction, and ends the - transaction. - - After saving the changes, all notification blocks registered on this specific - `RLMRealm` instance are invoked synchronously. Notification blocks registered - on other threads or on collections are invoked asynchronously. If you do not - want to receive a specific notification for this write tranaction, see - `commitWriteTransactionWithoutNotifying:error:`. - - This method can fail if there is insufficient disk space available to save the - writes made, or due to unexpected i/o errors. This version of the method throws - an exception when errors occur. Use the version with a `NSError` out parameter - instead if you wish to handle errors. - - @warning This method may only be called during a write transaction. - */ -- (void)commitWriteTransaction NS_SWIFT_UNAVAILABLE(""); - -/** - Commits all write operations in the current write transaction, and ends the - transaction. - - After saving the changes, all notification blocks registered on this specific - `RLMRealm` instance are invoked synchronously. Notification blocks registered - on other threads or on collections are invoked asynchronously. If you do not - want to receive a specific notification for this write tranaction, see - `commitWriteTransactionWithoutNotifying:error:`. - - This method can fail if there is insufficient disk space available to save the - writes made, or due to unexpected i/o errors. - - @warning This method may only be called during a write transaction. - - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return Whether the transaction succeeded. - */ -- (BOOL)commitWriteTransaction:(NSError **)error; - -/** - Commits all write operations in the current write transaction, without - notifying specific notification blocks of the changes. - - After saving the changes, all notification blocks registered on this specific - `RLMRealm` instance are invoked synchronously. Notification blocks registered - on other threads or on collections are scheduled to be invoked asynchronously. - - You can skip notifiying specific notification blocks about the changes made - in this write transaction by passing in their associated notification tokens. - This is primarily useful when the write transaction is saving changes already - made in the UI and you do not want to have the notification block attempt to - re-apply the same changes. - - The tokens passed to this method must be for notifications for this specific - `RLMRealm` instance. Notifications for different threads cannot be skipped - using this method. - - This method can fail if there is insufficient disk space available to save the - writes made, or due to unexpected i/o errors. - - @warning This method may only be called during a write transaction. - - @param tokens An array of notification tokens which were returned from adding - callbacks which you do not want to be notified for the changes - made in this write transaction. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return Whether the transaction succeeded. - */ -- (BOOL)commitWriteTransactionWithoutNotifying:(NSArray *)tokens error:(NSError **)error; - -/** - Reverts all writes made during the current write transaction and ends the transaction. - - This rolls back all objects in the Realm to the state they were in at the - beginning of the write transaction, and then ends the transaction. - - This restores the data for deleted objects, but does not revive invalidated - object instances. Any `RLMObject`s which were added to the Realm will be - invalidated rather than becoming unmanaged. - Given the following code: - - ObjectType *oldObject = [[ObjectType objectsWhere:@"..."] firstObject]; - ObjectType *newObject = [[ObjectType alloc] init]; - - [realm beginWriteTransaction]; - [realm addObject:newObject]; - [realm deleteObject:oldObject]; - [realm cancelWriteTransaction]; - - Both `oldObject` and `newObject` will return `YES` for `isInvalidated`, - but re-running the query which provided `oldObject` will once again return - the valid object. - - KVO observers on any objects which were modified during the transaction will - be notified about the change back to their initial values, but no other - notifications are produced by a cancelled write transaction. - - @warning This method may only be called during a write transaction. - */ -- (void)cancelWriteTransaction; - -/** - Performs actions contained within the given block inside a write transaction. - - @see `[RLMRealm transactionWithoutNotifying:block:error:]` - */ -- (void)transactionWithBlock:(__attribute__((noescape)) void(^)(void))block NS_SWIFT_UNAVAILABLE(""); - -/** - Performs actions contained within the given block inside a write transaction. - - @see `[RLMRealm transactionWithoutNotifying:block:error:]` - */ -- (BOOL)transactionWithBlock:(__attribute__((noescape)) void(^)(void))block error:(NSError **)error; - -/** - Performs actions contained within the given block inside a write transaction. - - @see `[RLMRealm transactionWithoutNotifying:block:error:]` - */ -- (void)transactionWithoutNotifying:(NSArray *)tokens block:(__attribute__((noescape)) void(^)(void))block; - -/** - Performs actions contained within the given block inside a write transaction. - - Write transactions cannot be nested, and trying to execute a write transaction - on a Realm which is already participating in a write transaction will throw an - exception. Calls to `transactionWithBlock:` from `RLMRealm` instances in other - threads will block until the current write transaction completes. - - Before beginning the write transaction, `transactionWithBlock:` updates the - `RLMRealm` instance to the latest Realm version, as if `refresh` had been called, and - generates notifications if applicable. This has no effect if the Realm - was already up to date. - - You can skip notifiying specific notification blocks about the changes made - in this write transaction by passing in their associated notification tokens. - This is primarily useful when the write transaction is saving changes already - made in the UI and you do not want to have the notification block attempt to - re-apply the same changes. - - The tokens passed to this method must be for notifications for this specific - `RLMRealm` instance. Notifications for different threads cannot be skipped - using this method. - - @param tokens An array of notification tokens which were returned from adding - callbacks which you do not want to be notified for the changes - made in this write transaction. - @param block The block containing actions to perform. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return Whether the transaction succeeded. - */ -- (BOOL)transactionWithoutNotifying:(NSArray *)tokens block:(__attribute__((noescape)) void(^)(void))block error:(NSError **)error; - -/** - Indicates if the Realm is currently performing async write operations. - This becomes YES following a call to `beginAsyncWriteTransaction`, - `commitAsyncWriteTransaction`, or `asyncTransactionWithBlock:`, and remains so - until all scheduled async write work has completed. - - @warning If this is `YES`, closing or invalidating the Realm will block until scheduled work has completed. - */ -@property (nonatomic, readonly) BOOL isPerformingAsynchronousWriteOperations; - -/** - Begins an asynchronous write transaction. - This function asynchronously begins a write transaction on a background - thread, and then invokes the block on the original thread or queue once the - transaction has begun. Unlike `beginWriteTransaction`, this does not block the - calling thread if another thread is current inside a write transaction, and - will always return immediately. - Multiple calls to this function (or the other functions which perform - asynchronous write transactions) will queue the blocks to be called in the - same order as they were queued. This includes calls from inside a write - transaction block, which unlike with synchronous transactions are allowed. - - @param block The block containing actions to perform inside the write transaction. - `block` should end by calling `commitAsyncWriteTransaction`, - `commitWriteTransaction` or `cancelWriteTransaction`. - Returning without one of these calls is equivalent to calling `cancelWriteTransaction`. - - @return An id identifying the asynchronous transaction which can be passed to - `cancelAsyncTransaction:` prior to the block being called to cancel - the pending invocation of the block. - */ -- (RLMAsyncTransactionId)beginAsyncWriteTransaction:(void(^)(void))block; - -/** - Asynchronously commits a write transaction. - The call returns immediately allowing the caller to proceed while the I/O is - performed on a dedicated background thread. This can be used regardless of if - the write transaction was begun with `beginWriteTransaction` or - `beginAsyncWriteTransaction`. - - @param completionBlock A block which will be called on the source thread or - queue once the commit has either completed or failed - with an error. - - @param allowGrouping If `YES`, multiple sequential calls to - `commitAsyncWriteTransaction:` may be batched together - and persisted to stable storage in one group. This - improves write performance, particularly when the - individual transactions being batched are small. In the - event of a crash or power failure, either all of the - grouped transactions will be lost or none will, rather - than the usual guarantee that data has been persisted as - soon as a call to commit has returned. - - @return An id identifying the asynchronous transaction commit can be passed to - `cancelAsyncTransaction:` prior to the completion block being called - to cancel the pending invocation of the block. Note that this does - *not* cancel the commit itself. -*/ -- (RLMAsyncTransactionId)commitAsyncWriteTransaction:(nullable void(^)(NSError *_Nullable))completionBlock - allowGrouping:(BOOL)allowGrouping; - -/** - Asynchronously commits a write transaction. - The call returns immediately allowing the caller to proceed while the I/O is - performed on a dedicated background thread. This can be used regardless of if - the write transaction was begun with `beginWriteTransaction` or - `beginAsyncWriteTransaction`. - - @param completionBlock A block which will be called on the source thread or - queue once the commit has either completed or failed - with an error. - - @return An id identifying the asynchronous transaction commit can be passed to - `cancelAsyncTransaction:` prior to the completion block being called - to cancel the pending invocation of the block. Note that this does - *not* cancel the commit itself. -*/ -- (RLMAsyncTransactionId)commitAsyncWriteTransaction:(void(^)(NSError *_Nullable))completionBlock; - -/** - Asynchronously commits a write transaction. - The call returns immediately allowing the caller to proceed while the I/O is - performed on a dedicated background thread. This can be used regardless of if - the write transaction was begun with `beginWriteTransaction` or - `beginAsyncWriteTransaction`. - - @return An id identifying the asynchronous transaction commit can be passed to - `cancelAsyncTransaction:` prior to the completion block being called - to cancel the pending invocation of the block. Note that this does - *not* cancel the commit itself. -*/ -- (RLMAsyncTransactionId)commitAsyncWriteTransaction; - -/** - Cancels a queued block for an asynchronous transaction. - This can cancel a block passed to either an asynchronous begin or an - asynchronous commit. Canceling a begin cancels that transaction entirely, - while canceling a commit merely cancels the invocation of the completion - callback, and the commit will still happen. - Transactions can only be canceled before the block is invoked, and calling - `cancelAsyncTransaction:` from within the block is a no-op. - - @param asyncTransactionId A transaction id from either `beginAsyncWriteTransaction:` or `commitAsyncWriteTransaction:`. -*/ -- (void)cancelAsyncTransaction:(RLMAsyncTransactionId)asyncTransactionId; - -/** - Asynchronously performs actions contained within the given block inside a - write transaction. - The write transaction is begun asynchronously as if calling - `beginAsyncWriteTransaction:`, and by default the transaction is commited - asynchronously after the block completes. You can also explicitly call - `commitWriteTransaction` or `cancelWriteTransaction` from within the block to - synchronously commit or cancel the write transaction. - - @param block The block containing actions to perform. - - @param completionBlock A block which will be called on the source thread or - queue once the commit has either completed or failed - with an error. - - @return An id identifying the asynchronous transaction which can be passed to - `cancelAsyncTransaction:` prior to the block being called to cancel - the pending invocation of the block. -*/ -- (RLMAsyncTransactionId)asyncTransactionWithBlock:(void(^)(void))block onComplete:(nullable void(^)(NSError *))completionBlock; - -/** - Asynchronously performs actions contained within the given block inside a - write transaction. - The write transaction is begun asynchronously as if calling - `beginAsyncWriteTransaction:`, and by default the transaction is commited - asynchronously after the block completes. You can also explicitly call - `commitWriteTransaction` or `cancelWriteTransaction` from within the block to - synchronously commit or cancel the write transaction. - - @param block The block containing actions to perform. - - @return An id identifying the asynchronous transaction which can be passed to - `cancelAsyncTransaction:` prior to the block being called to cancel - the pending invocation of the block. -*/ -- (RLMAsyncTransactionId)asyncTransactionWithBlock:(void(^)(void))block; - -/** - Updates the Realm and outstanding objects managed by the Realm to point to the - most recent data. - - If the version of the Realm is actually changed, Realm and collection - notifications will be sent to reflect the changes. This may take some time, as - collection notifications are prepared on a background thread. As a result, - calling this method on the main thread is not advisable. - - @return Whether there were any updates for the Realm. Note that `YES` may be - returned even if no data actually changed. - */ -- (BOOL)refresh; - -/** - Set this property to `YES` to automatically update this Realm when changes - happen in other threads. - - If set to `YES` (the default), changes made on other threads will be reflected - in this Realm on the next cycle of the run loop after the changes are - committed. If set to `NO`, you must manually call `-refresh` on the Realm to - update it to get the latest data. - - Note that by default, background threads do not have an active run loop and you - will need to manually call `-refresh` in order to update to the latest version, - even if `autorefresh` is set to `YES`. - - Even with this property enabled, you can still call `-refresh` at any time to - update the Realm before the automatic refresh would occur. - - Write transactions will still always advance a Realm to the latest version and - produce local notifications on commit even if autorefresh is disabled. - - Disabling `autorefresh` on a Realm without any strong references to it will not - have any effect, and `autorefresh` will revert back to `YES` the next time the - Realm is created. This is normally irrelevant as it means that there is nothing - to refresh (as managed `RLMObject`s, `RLMArray`s, and `RLMResults` have strong - references to the Realm that manages them), but it means that setting - `RLMRealm.defaultRealm.autorefresh = NO` in - `application:didFinishLaunchingWithOptions:` and only later storing Realm - objects will not work. - - Defaults to `YES`. - */ -@property (nonatomic) BOOL autorefresh; - -/** - Invalidates all `RLMObject`s, `RLMResults`, `RLMLinkingObjects`, and `RLMArray`s managed by the Realm. - - A Realm holds a read lock on the version of the data accessed by it, so - that changes made to the Realm on different threads do not modify or delete the - data seen by this Realm. Calling this method releases the read lock, - allowing the space used on disk to be reused by later write transactions rather - than growing the file. This method should be called before performing long - blocking operations on a background thread on which you previously read data - from the Realm which you no longer need. - - All `RLMObject`, `RLMResults` and `RLMArray` instances obtained from this - `RLMRealm` instance on the current thread are invalidated. `RLMObject`s and `RLMArray`s - cannot be used. `RLMResults` will become empty. The Realm itself remains valid, - and a new read transaction is implicitly begun the next time data is read from the Realm. - - Calling this method multiple times in a row without reading any data from the - Realm, or before ever reading any data from the Realm, is a no-op. - */ -- (void)invalidate; - -#pragma mark - Accessing Objects - -/** - Returns the same object as the one referenced when the `RLMThreadSafeReference` was first created, - but resolved for the current Realm for this thread. Returns `nil` if this object was deleted after - the reference was created. - - @param reference The thread-safe reference to the thread-confined object to resolve in this Realm. - - @warning A `RLMThreadSafeReference` object must be resolved at most once. - Failing to resolve a `RLMThreadSafeReference` will result in the source version of the - Realm being pinned until the reference is deallocated. - An exception will be thrown if a reference is resolved more than once. - - @warning Cannot call within a write transaction. - - @note Will refresh this Realm if the source Realm was at a later version than this one. - - @see `+[RLMThreadSafeReference referenceWithThreadConfined:]` - */ -- (nullable id)resolveThreadSafeReference:(RLMThreadSafeReference *)reference -NS_REFINED_FOR_SWIFT; - -#pragma mark - Adding and Removing Objects from a Realm - -/** - Adds an object to the Realm. - - Once added, this object is considered to be managed by the Realm. It can be retrieved - using the `objectsWhere:` selectors on `RLMRealm` and on subclasses of `RLMObject`. - - When added, all child relationships referenced by this object will also be added to - the Realm if they are not already in it. - - If the object or any related objects are already being managed by a different Realm - an exception will be thrown. Use `-[RLMObject createInRealm:withObject:]` to insert a copy of a managed object - into a different Realm. - - The object to be added must be valid and cannot have been previously deleted - from a Realm (i.e. `isInvalidated` must be `NO`). - - @warning This method may only be called during a write transaction. - - @param object The object to be added to this Realm. - */ -- (void)addObject:(RLMObject *)object; - -/** - Adds all the objects in a collection to the Realm. - - This is the equivalent of calling `addObject:` for every object in a collection. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable collection such as `NSArray`, `RLMArray`, or `RLMResults`, - containing Realm objects to be added to the Realm. - - @see `addObject:` - */ -- (void)addObjects:(id)objects; - -/** - Adds or updates an existing object into the Realm. - - The object provided must have a designated primary key. If no objects exist in the Realm - with the same primary key value, the object is inserted. Otherwise, the existing object is - updated with any changed values. - - As with `addObject:`, the object cannot already be managed by a different - Realm. Use `-[RLMObject createOrUpdateInRealm:withValue:]` to copy values to - a different Realm. - - If there is a property or KVC value on `object` whose value is nil, and it corresponds - to a nullable property on an existing object being updated, that nullable property will - be set to nil. - - @warning This method may only be called during a write transaction. - - @param object The object to be added or updated. - */ -- (void)addOrUpdateObject:(RLMObject *)object; - -/** - Adds or updates all the objects in a collection into the Realm. - - This is the equivalent of calling `addOrUpdateObject:` for every object in a collection. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable collection such as `NSArray`, `RLMArray`, or `RLMResults`, - containing Realm objects to be added to or updated within the Realm. - - @see `addOrUpdateObject:` - */ -- (void)addOrUpdateObjects:(id)objects; - -/** - Deletes an object from the Realm. Once the object is deleted it is considered invalidated. - - @warning This method may only be called during a write transaction. - - @param object The object to be deleted. - */ -- (void)deleteObject:(RLMObject *)object; - -/** - Deletes one or more objects from the Realm. - - This is the equivalent of calling `deleteObject:` for every object in a collection. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable collection such as `NSArray`, `RLMArray`, or `RLMResults`, - containing objects to be deleted from the Realm. - - @see `deleteObject:` - */ -- (void)deleteObjects:(id)objects; - -/** - Deletes all objects from the Realm. - - @warning This method may only be called during a write transaction. - - @see `deleteObject:` - */ -- (void)deleteAllObjects; - -#pragma mark - Sync Subscriptions - -/** - Represents the active subscriptions for this realm, which can be used to add/remove/update - and search flexible sync subscriptions. - Getting the subscriptions from a local or partition-based configured realm will thrown an exception. - - @warning This feature is currently in beta and its API is subject to change. - */ -@property (nonatomic, readonly, nonnull) RLMSyncSubscriptionSet *subscriptions; - - -#pragma mark - Migrations - -/** - The type of a migration block used to migrate a Realm. - - @param migration A `RLMMigration` object used to perform the migration. The - migration object allows you to enumerate and alter any - existing objects which require migration. - - @param oldSchemaVersion The schema version of the Realm being migrated. - */ -RLM_SWIFT_SENDABLE -typedef void (^RLMMigrationBlock)(RLMMigration *migration, uint64_t oldSchemaVersion); - -/** - Returns the schema version for a Realm at a given local URL. - - @param fileURL Local URL to a Realm file. - @param key 64-byte key used to encrypt the file, or `nil` if it is unencrypted. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return The version of the Realm at `fileURL`, or `RLMNotVersioned` if the version cannot be read. - */ -+ (uint64_t)schemaVersionAtURL:(NSURL *)fileURL encryptionKey:(nullable NSData *)key - error:(NSError **)error -NS_REFINED_FOR_SWIFT; - -/** - Performs the given Realm configuration's migration block on a Realm at the given path. - - This method is called automatically when opening a Realm for the first time and does - not need to be called explicitly. You can choose to call this method to control - exactly when and how migrations are performed. - - @param configuration The Realm configuration used to open and migrate the Realm. - @return The error that occurred while applying the migration, if any. - - @see RLMMigration - */ -+ (BOOL)performMigrationForConfiguration:(RLMRealmConfiguration *)configuration error:(NSError **)error; - -#pragma mark - Unavailable Methods - -/** - RLMRealm instances are cached internally by Realm and cannot be created directly. - - Use `+[RLMRealm defaultRealm]`, `+[RLMRealm realmWithConfiguration:error:]` or - `+[RLMRealm realmWithURL]` to obtain a reference to an RLMRealm. - */ -- (instancetype)init __attribute__((unavailable("Use +defaultRealm, +realmWithConfiguration: or +realmWithURL:."))); - -/** - RLMRealm instances are cached internally by Realm and cannot be created directly. - - Use `+[RLMRealm defaultRealm]`, `+[RLMRealm realmWithConfiguration:error:]` or - `+[RLMRealm realmWithURL]` to obtain a reference to an RLMRealm. - */ -+ (instancetype)new __attribute__((unavailable("Use +defaultRealm, +realmWithConfiguration: or +realmWithURL:."))); - -/// :nodoc: -- (void)addOrUpdateObjectsFromArray:(id)array __attribute__((unavailable("Renamed to -addOrUpdateObjects:."))); - -@end - -// MARK: - RLMNotificationToken - -/** - A token which is returned from methods which subscribe to changes to a Realm. - - Change subscriptions in Realm return an `RLMNotificationToken` instance, - which can be used to unsubscribe from the changes. You must store a strong - reference to the token for as long as you want to continue to receive notifications. - When you wish to stop, call the `-invalidate` method. Notifications are also stopped if - the token is deallocated. - */ -RLM_SWIFT_SENDABLE // is internally thread-safe -@interface RLMNotificationToken : NSObject -/// Stops notifications for the change subscription that returned this token. -/// -/// @return True if the token was previously valid, and false if it was already invalidated. -- (bool)invalidate; - -/// Stops notifications for the change subscription that returned this token. -- (void)stop __attribute__((unavailable("Renamed to -invalidate."))) NS_REFINED_FOR_SWIFT; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMRealmConfiguration.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMRealmConfiguration.h deleted file mode 100644 index d09e5c215..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMRealmConfiguration.h +++ /dev/null @@ -1,197 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2015 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMEventConfiguration, RLMSyncConfiguration; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A block called when opening a Realm for the first time during the life - of a process to determine if it should be compacted before being returned - to the user. It is passed the total file size (data + free space) and the total - bytes used by data in the file. - - Return `YES` to indicate that an attempt to compact the file should be made. - The compaction will be skipped if another process is accessing it. - */ -RLM_SWIFT_SENDABLE -typedef BOOL (^RLMShouldCompactOnLaunchBlock)(NSUInteger totalBytes, NSUInteger bytesUsed); - -/** - A block which receives a subscription set instance, that can be used to add an initial set of subscriptions which will be executed - when the Realm is first opened. - */ -RLM_SWIFT_SENDABLE -typedef void(^RLMFlexibleSyncInitialSubscriptionsBlock)(RLMSyncSubscriptionSet * _Nonnull subscriptions); - -/** - An `RLMRealmConfiguration` instance describes the different options used to - create an instance of a Realm. - - `RLMRealmConfiguration` instances are just plain `NSObject`s. Unlike `RLMRealm`s - and `RLMObject`s, they can be freely shared between threads as long as you do not - mutate them. - - Creating configuration objects for class subsets (by setting the - `objectClasses` property) can be expensive. Because of this, you will normally want to - cache and reuse a single configuration object for each distinct configuration rather than - creating a new object each time you open a Realm. - */ -@interface RLMRealmConfiguration : NSObject - -#pragma mark - Default Configuration - -/** - Returns the default configuration used to create Realms when no other - configuration is explicitly specified (i.e. `+[RLMRealm defaultRealm]`). - - @return The default Realm configuration. - */ -+ (instancetype)defaultConfiguration; - -/** - Sets the default configuration to the given `RLMRealmConfiguration`. - - @param configuration The new default Realm configuration. - */ -+ (void)setDefaultConfiguration:(RLMRealmConfiguration *)configuration; - -#pragma mark - Properties - -/// The local URL of the Realm file. Mutually exclusive with `inMemoryIdentifier`; -/// setting one of the two properties will automatically nil out the other. -@property (nonatomic, copy, nullable) NSURL *fileURL; - -/// A string used to identify a particular in-memory Realm. Mutually exclusive with `fileURL`, -/// `seedFilePath`and `syncConfiguration`; -/// setting any one of the three properties will automatically nil out the other two. -@property (nonatomic, copy, nullable) NSString *inMemoryIdentifier; - -/// A 64-byte key to use to encrypt the data, or `nil` if encryption is not enabled. -@property (nonatomic, copy, nullable) NSData *encryptionKey; - -/// Whether to open the Realm in read-only mode. -/// -/// For non-synchronized Realms, this is required to be able to open Realm -/// files which are not writeable or are in a directory which is not writeable. -/// This should only be used on files which will not be modified by anyone -/// while they are open, and not just to get a read-only view of a file which -/// may be written to by another thread or process. Opening in read-only mode -/// requires disabling Realm's reader/writer coordination, so committing a -/// write transaction from another process will result in crashes. -/// -/// Syncronized Realms must always be writeable (as otherwise no -/// synchronization could happen), and this instead merely disallows performing -/// write transactions on the Realm. In addition, it will skip some automatic -/// writes made to the Realm, such as to initialize the Realm's schema. Setting -/// `readOnly = YES` is not strictly required for Realms which the sync user -/// does not have write access to, but is highly recommended as it will improve -/// error reporting and catch some errors earlier. -/// -/// Realms using query-based sync cannot be opened in read-only mode. -@property (nonatomic) BOOL readOnly; - -/// The current schema version. -@property (nonatomic) uint64_t schemaVersion; - -/// The block which migrates the Realm to the current version. -@property (nonatomic, copy, nullable) RLMMigrationBlock migrationBlock; - -/** - Whether to recreate the Realm file with the provided schema if a migration is required. - This is the case when the stored schema differs from the provided schema or - the stored schema version differs from the version on this configuration. - Setting this property to `YES` deletes the file if a migration would otherwise be required or executed. - - @note Setting this property to `YES` doesn't disable file format migrations. - */ -@property (nonatomic) BOOL deleteRealmIfMigrationNeeded; - -/** - A block called when opening a Realm for the first time during the life - of a process to determine if it should be compacted before being returned - to the user. It is passed the total file size (data + free space) and the total - bytes used by data in the file. - - Return `YES` to indicate that an attempt to compact the file should be made. - The compaction will be skipped if another process is accessing it. - */ -@property (nonatomic, copy, nullable) RLMShouldCompactOnLaunchBlock shouldCompactOnLaunch; - -/// The classes managed by the Realm. -@property (nonatomic, copy, nullable) NSArray *objectClasses; - -/** - The maximum number of live versions in the Realm file before an exception will - be thrown when attempting to start a write transaction. - - Realm provides MVCC snapshot isolation, meaning that writes on one thread do - not overwrite data being read on another thread, and instead write a new copy - of that data. When a Realm refreshes it updates to the latest version of the - data and releases the old versions, allowing them to be overwritten by - subsequent write transactions. - - Under normal circumstances this is not a problem, but if the number of active - versions grow too large, it will have a negative effect on the filesize on - disk. This can happen when performing writes on many different threads at - once, when holding on to frozen objects for an extended time, or when - performing long operations on background threads which do not allow the Realm - to refresh. - - Setting this property to a non-zero value makes it so that exceeding the set - number of versions will instead throw an exception. This can be used with a - low value during development to help identify places that may be problematic, - or in production use to cause the app to crash rather than produce a Realm - file which is too large to be opened. - - */ -@property (nonatomic) NSUInteger maximumNumberOfActiveVersions; - -/** - When opening the Realm for the first time, instead of creating an empty file, - the Realm file will be copied from the provided seed file path and used instead. - This can be used to open a Realm file with pre-populated data. - - If a realm file already exists at the configuration's destination path, the seed file - will not be copied and the already existing realm will be opened instead. - - Note that to use this parameter with a synced Realm configuration - the seed Realm must be appropriately copied to a destination with - `[RLMRealm writeCopyForConfiguration:]` first. - - This option is mutually exclusive with `inMemoryIdentifier`. Setting a `seedFilePath` - will nil out the `inMemoryIdentifier`. - */ -@property (nonatomic, copy, nullable) NSURL *seedFilePath; - -/** - A configuration object representing configuration state for Realms intended - to sync with Atlas Device Sync. - - This property is mutually exclusive with both `inMemoryIdentifier` and `fileURL`; - setting any one of the three properties will automatically nil out the other two. - - @see `RLMSyncConfiguration` - */ -@property (nullable, nonatomic) RLMSyncConfiguration *syncConfiguration; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMRealm_Dynamic.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMRealm_Dynamic.h deleted file mode 100644 index bea162775..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMRealm_Dynamic.h +++ /dev/null @@ -1,118 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import -#import - -@class RLMResults; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMRealm (Dynamic) - -#pragma mark - Getting Objects from a Realm - -/** - Returns all objects of a given type from the Realm. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. The preferred way to get objects of a single class is to use the class - methods on `RLMObject`. - - @param className The name of the `RLMObject` subclass to retrieve on (e.g. `MyClass.className`). - - @return An `RLMResults` containing all objects in the Realm of the given type. - - @see `+[RLMObject allObjects]` - */ -- (RLMResults *)allObjects:(NSString *)className; - -/** - Returns all objects matching the given predicate from the Realm. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. The preferred way to get objects of a single class is to use the class - methods on `RLMObject`. - - @param className The type of objects you are looking for (name of the class). - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` containing results matching the given predicate. - - @see `+[RLMObject objectsWhere:]` - */ -- (RLMResults *)objects:(NSString *)className where:(NSString *)predicateFormat, ...; - -/** - Returns all objects matching the given predicate from the Realm. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. The preferred way to get objects of a single class is to use the class - methods on `RLMObject`. - - @param className The type of objects you are looking for (name of the class). - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` containing results matching the given predicate. - - @see `+[RLMObject objectsWhere:]` - */ -- (RLMResults *)objects:(NSString *)className withPredicate:(NSPredicate *)predicate; - -/** - Returns the object of the given type with the given primary key from the Realm. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. The preferred way to get an object of a single class is to use the class - methods on `RLMObject`. - - @param className The class name for the object you are looking for. - @param primaryKey The primary key value for the object you are looking for. - - @return An object, or `nil` if an object with the given primary key does not exist. - - @see `+[RLMObject objectForPrimaryKey:]` - */ -- (nullable RLMObject *)objectWithClassName:(NSString *)className forPrimaryKey:(id)primaryKey; - -/** - Creates an `RLMObject` instance of type `className` in the Realm, and populates it using a given object. - - The `value` argument is used to populate the object. It can be a key-value coding compliant object, an array or - dictionary returned from the methods in `NSJSONSerialization`, or an array containing one element for each managed - property. An exception will be thrown if any required properties are not present and those properties were not defined - with default values. - - When passing in an array as the `value` argument, all properties must be present, valid and in the same order as the - properties defined in the model. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is recommended to - use `[RLMObject createInDefaultRealmWithValue:]`. - - @param value The value used to populate the object. - - @return An `RLMObject` instance of type `className`. - */ --(RLMObject *)createObject:(NSString *)className withValue:(id)value; - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMResults.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMResults.h deleted file mode 100644 index 5911e666a..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMResults.h +++ /dev/null @@ -1,567 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObject; - -/** - `RLMResults` is an auto-updating container type in Realm returned from object - queries. It represents the results of the query in the form of a collection of objects. - - `RLMResults` can be queried using the same predicates as `RLMObject` and `RLMArray`, - and you can chain queries to further filter results. - - `RLMResults` always reflect the current state of the Realm on the current thread, - including during write transactions on the current thread. The one exception to - this is when using `for...in` fast enumeration, which will always enumerate - over the objects which matched the query when the enumeration is begun, even if - some of them are deleted or modified to be excluded by the filter during the - enumeration. - - `RLMResults` are lazily evaluated the first time they are accessed; they only - run queries when the result of the query is requested. This means that - chaining several temporary `RLMResults` to sort and filter your data does not - perform any extra work processing the intermediate state. - - Once the results have been evaluated or a notification block has been added, - the results are eagerly kept up-to-date, with the work done to keep them - up-to-date done on a background thread whenever possible. - - `RLMResults` cannot be directly instantiated. - */ -@interface RLMResults : NSObject - -#pragma mark - Properties - -/** - The number of objects in the results collection. - */ -@property (nonatomic, readonly, assign) NSUInteger count; - -/** - The type of the objects in the results collection. - */ -@property (nonatomic, readonly, assign) RLMPropertyType type; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readwrite, getter = isOptional) BOOL optional; - -/** - The class name of the objects contained in the results collection. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages this results collection. - */ -@property (nonatomic, readonly) RLMRealm *realm; - -/** - Indicates if the results collection is no longer valid. - - The results collection becomes invalid if `invalidate` is called on the containing `realm`. - An invalidated results collection can be accessed, but will always be empty. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -#pragma mark - Accessing Objects from an RLMResults - -/** - Returns the object at the index specified. - - @param index The index to look up. - - @return An object of the type contained in the results collection. - */ -- (RLMObjectType)objectAtIndex:(NSUInteger)index; - -/** - Returns an array containing the objects in the results at the indexes specified by a given index set. - `nil` will be returned if the index set contains an index out of the arrays bounds. - - @param indexes The indexes in the results to retrieve objects from. - - @return The objects at the specified indexes. - */ -- (nullable NSArray *)objectsAtIndexes:(NSIndexSet *)indexes; - -/** - Returns the first object in the results collection. - - Returns `nil` if called on an empty results collection. - - @return An object of the type contained in the results collection. - */ -- (nullable RLMObjectType)firstObject; - -/** - Returns the last object in the results collection. - - Returns `nil` if called on an empty results collection. - - @return An object of the type contained in the results collection. - */ -- (nullable RLMObjectType)lastObject; - -#pragma mark - Querying Results - -/** - Returns the index of an object in the results collection. - - Returns `NSNotFound` if the object is not found in the results collection. - - @param object An object (of the same type as returned from the `objectClassName` selector). - */ -- (NSUInteger)indexOfObject:(RLMObjectType)object; - -/** - Returns the index of the first object in the results collection matching the predicate. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return The index of the object, or `NSNotFound` if the object is not found in the results collection. - */ -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns the index of the first object in the results collection matching the predicate. - - @param predicate The predicate with which to filter the objects. - - @return The index of the object, or `NSNotFound` if the object is not found in the results collection. - */ -- (NSUInteger)indexOfObjectWithPredicate:(NSPredicate *)predicate; - -/** - Returns all the objects matching the given predicate in the results collection. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` of objects that match the given predicate. - */ -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all the objects matching the given predicate in the results collection. - - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` of objects that match the given predicate. - */ -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/** - Returns a sorted `RLMResults` from an existing results collection. - - @param keyPath The key path to sort by. - @param ascending The direction to sort in. - - @return An `RLMResults` sorted by the specified key path. - */ -- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a sorted `RLMResults` from an existing results collection. - - @param properties An array of `RLMSortDescriptor`s to sort by. - - @return An `RLMResults` sorted by the specified properties. - */ -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/** - Returns a distinct `RLMResults` from an existing results collection. - - @param keyPaths The key paths used produce distinct results - - @return An `RLMResults` made distinct based on the specified key paths - */ -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -#pragma mark - Notifications - -/** - Registers a block to be called each time the results collection changes. - - The block will be asynchronously called with the initial results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the results collection were added, removed or modified. If a - write transaction did not modify any objects in the results collection, - the block is not called at all. See the `RLMCollectionChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - At the time when the block is called, the `RLMResults` object will be fully - evaluated and up-to-date, and as long as you do not perform a write transaction - on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will - never perform blocking work. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - NSLog(@"dogs.count: %zu", dogs.count); // => 0 - self.token = [results addNotificationBlock:^(RLMResults *dogs, - RLMCollectionChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - - @param block The block to be called whenever a change occurs. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the results collection changes. - - The block will be asynchronously called with the initial results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the results collection were added, removed or modified. If a - write transaction did not modify any objects in the results collection, - the block is not called at all. See the `RLMCollectionChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - At the time when the block is called, the `RLMResults` object will be fully - evaluated and up-to-date, and as long as you do not perform a write transaction - on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will - never perform blocking work. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the results collection changes. - - The block will be asynchronously called with the initial results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the results collection were added, removed or modified. If a - write transaction did not modify any objects in the results collection, - the block is not called at all. See the `RLMCollectionChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - At the time when the block is called, the `RLMResults` object will be fully - evaluated and up-to-date, and as long as you do not perform a write transaction - on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will - never perform blocking work. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the results collection changes. - - The block will be asynchronously called with the initial results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the results collection were added, removed or modified. If a - write transaction did not modify any objects in the results collection, - the block is not called at all. See the `RLMCollectionChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - At the time when the block is called, the `RLMResults` object will be fully - evaluated and up-to-date, and as long as you do not perform a write transaction - on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will - never perform blocking work. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths -__attribute__((warn_unused_result)); -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the objects - represented by the results collection. - - NSNumber *min = [results minOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose minimum value is desired. Only properties of types `int`, `float`, `double`, and - `NSDate` are supported. - - @return The minimum value of the property, or `nil` if the Results are empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects represented by the results collection. - - NSNumber *max = [results maxOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose maximum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The maximum value of the property, or `nil` if the Results are empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of the values of a given property over all the objects represented by the results collection. - - NSNumber *sum = [results sumOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose values should be summed. Only properties of - types `int`, `float`, and `double` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects represented by the results collection. - - NSNumber *average = [results averageOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose average value should be calculated. Only - properties of types `int`, `float`, and `double` are supported. - - @return The average value of the given property, or `nil` if the Results are empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -/// :nodoc: -- (RLMObjectType)objectAtIndexedSubscript:(NSUInteger)index; - -#pragma mark - Sectioned Results - -/** - Sorts and sections this collection from a given property key path, returning the result - as an instance of `RLMSectionedResults`. - - @param keyPath The property key path to sort on. - @param ascending The direction to sort in. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsSortedUsingKeyPath:(NSString *)keyPath - ascending:(BOOL)ascending - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -/** - Sorts and sections this collection from a given array of sort descriptors, returning the result - as an instance of `RLMSectionedResults`. - - @param sortDescriptors An array of `RLMSortDescriptor`s to sort by. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @note The primary sort descriptor must be responsible for determining the section key. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsUsingSortDescriptors:(NSArray *)sortDescriptors - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -#pragma mark - Freeze - -/** - Indicates if the result are frozen. - - Frozen Results are immutable and can be accessed from any thread.The objects - read from a frozen Results will also be frozen. - */ -@property (nonatomic, readonly, getter=isFrozen) BOOL frozen; - -/** - Returns a frozen (immutable) snapshot of these results. - - The frozen copy is an immutable collection which contains the same data as - this collection currently contains, but will not update when writes are made - to the containing Realm. Unlike live Results, frozen Results can be accessed - from any thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning Holding onto a frozen collection for an extended period while - performing write transaction on the Realm may result in the Realm - file growing to large sizes. See - `RLMRealmConfiguration.maximumNumberOfActiveVersions` for more - information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -#pragma mark - Unavailable Methods - -/** - `-[RLMResults init]` is not available because `RLMResults` cannot be created directly. - `RLMResults` can be obtained by querying a Realm. - */ -- (instancetype)init __attribute__((unavailable("RLMResults cannot be created directly"))); - -/** - `+[RLMResults new]` is not available because `RLMResults` cannot be created directly. - `RLMResults` can be obtained by querying a Realm. - */ -+ (instancetype)new __attribute__((unavailable("RLMResults cannot be created directly"))); - -@end - -/** - `RLMLinkingObjects` is an auto-updating container type. It represents a collection of objects that link to its - parent object. - - For more information, please see the "Inverse Relationships" section in the - [documentation](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/relationships/#relationships). - */ -@interface RLMLinkingObjects : RLMResults -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMSchema.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMSchema.h deleted file mode 100644 index fe46f6d47..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMSchema.h +++ /dev/null @@ -1,78 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectSchema; - -/** - `RLMSchema` instances represent collections of model object schemas managed by a Realm. - - When using Realm, `RLMSchema` instances allow performing migrations and - introspecting the database's schema. - - Schemas map to collections of tables in the core database. - */ -RLM_SWIFT_SENDABLE // not actually immutable, but the public API kinda is -@interface RLMSchema : NSObject - -#pragma mark - Properties - -/** - An `NSArray` containing `RLMObjectSchema`s for all object types in the Realm. - - This property is intended to be used during migrations for dynamic introspection. - - @see `RLMObjectSchema` - */ -@property (nonatomic, readonly, copy) NSArray *objectSchema; - -#pragma mark - Methods - -/** - Returns an `RLMObjectSchema` for the given class name in the schema. - - @param className The object class name. - @return An `RLMObjectSchema` for the given class in the schema. - - @see `RLMObjectSchema` - */ -- (nullable RLMObjectSchema *)schemaForClassName:(NSString *)className; - -/** - Looks up and returns an `RLMObjectSchema` for the given class name in the Realm. - - If there is no object of type `className` in the schema, an exception will be thrown. - - @param className The object class name. - @return An `RLMObjectSchema` for the given class in this Realm. - - @see `RLMObjectSchema` - */ -- (RLMObjectSchema *)objectForKeyedSubscript:(NSString *)className; - -/** - Returns whether two `RLMSchema` instances are equivalent. - */ -- (BOOL)isEqualToSchema:(RLMSchema *)schema; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMSectionedResults.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMSectionedResults.h deleted file mode 100644 index 4ee236b94..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMSectionedResults.h +++ /dev/null @@ -1,921 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2022 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@protocol RLMValue; -@class RLMResults; - -/** - A `RLMSectionedResultsChange` object encapsulates information about changes to sectioned - results that are reported by Realm notifications. - - `RLMSectionedResultsChange` is passed to the notification blocks registered with - `-addNotificationBlock` on `RLMSectionedResults`, and reports what sections and rows in the - collection changed since the last time the notification block was called. - - A complete example of updating a `UITableView` named `tv`: - - [tv beginUpdates]; - [tv deleteRowsAtIndexPaths:changes.deletions withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv insertRowsAtIndexPaths:changes.insertions withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv reloadRowsAtIndexPaths:changes.modifications withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv insertSections:changes.sectionsToInsert withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv deleteSections:changes.sectionsToRemove withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv endUpdates]; - - All of the arrays in an `RLMSectionedResultsChange` are always sorted in ascending order. - */ -@interface RLMSectionedResultsChange : NSObject -/// The index paths of objects in the previous version of the collection which have -/// been removed from this one. -@property (nonatomic, readonly) NSArray *deletions; -/// The index paths in the new version of the collection which were newly inserted. -@property (nonatomic, readonly) NSArray *insertions; -/// The index paths in the old version of the collection which were modified. -@property (nonatomic, readonly) NSArray *modifications; -/// The indices of the sections to be inserted. -@property (nonatomic, readonly) NSIndexSet *sectionsToInsert; -/// The indices of the sections to be removed. -@property (nonatomic, readonly) NSIndexSet *sectionsToRemove; -/// Returns the index paths of the deletion indices in the given section. -- (NSArray *)deletionsInSection:(NSUInteger)section; -/// Returns the index paths of the insertion indices in the given section. -- (NSArray *)insertionsInSection:(NSUInteger)section; -/// Returns the index paths of the modification indices in the given section. -- (NSArray *)modificationsInSection:(NSUInteger)section; -@end - - -/// The `RLMSectionedResult` protocol defines properties and methods common to both `RLMSectionedResults and RLMSection` -@protocol RLMSectionedResult - -#pragma mark - Object Access - -/// The count of objects in the collection. -@property (nonatomic, readonly) NSUInteger count; -/// Returns the object for a given index in the collection. -- (id)objectAtIndexedSubscript:(NSUInteger)index; -/// Returns the object for a given index in the collection. -- (id)objectAtIndex:(NSUInteger)index; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this collection. - - The frozen copy is an immutable collection which contains the same data as this - collection currently contains, but will not update when writes are made to the - containing Realm. Unlike live arrays, frozen collections can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning Holding onto a frozen collection for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; -/** - Indicates if the underlying collection is frozen. - - Frozen collections are immutable and can be accessed from any thread. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Sectioned Results Notifications - -/** - Registers a block to be called each time the collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` / `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(id, RLMSectionedResultsChange *))block __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` / `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(id, RLMSectionedResultsChange *))block - queue:(dispatch_queue_t)queue __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` / `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(id, RLMSectionedResultsChange *))block - keyPaths:(NSArray *)keyPaths __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` / `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(id, RLMSectionedResultsChange *))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue __attribute__((warn_unused_result)); - -@end - -/// An RLMSection contains the objects which belong to a specified section key. -@interface RLMSection, RLMObjectType> : NSObject -/// The value that represents the key in this section. -@property (nonatomic, readonly) RLMKeyType key; -/// The count of objects in the section. -@property (nonatomic, readonly) NSUInteger count; -/// Returns the object for a given index in the section. -- (RLMObjectType)objectAtIndexedSubscript:(NSUInteger)index; -/// Returns the object for a given index in the section. -- (RLMObjectType)objectAtIndex:(NSUInteger)index; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this section. - - The frozen copy is an immutable section which contains the same data as this - section currently contains, but will not update when writes are made to the - containing Realm. Unlike live arrays, frozen collections can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning Holding onto a frozen section for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; -/** - Returns a live version of this frozen section. - - This method resolves a reference to a live copy of the same frozen section. - If called on a live section, will return itself. -*/ -- (instancetype)thaw; -/** - Indicates if the underlying section is frozen. - - Frozen sections are immutable and can be accessed from any thread. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Section Notifications - -/** - Registers a block to be called each time the section changes. - - The block will be asynchronously called with the initial section, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - RLMSection *section = sectionedResults[0] // section with dogs aged '5' already exists. - - self.token = [section addNotificationBlock:^(RLMSection *section, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"section.count: %zu", section.count); // => 2 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSection *, RLMSectionedResultsChange *))block __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the section changes. - - The block will be asynchronously called with the initial section, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - RLMSection *section = sectionedResults[0] // section with dogs aged '5' already exists. - - self.token = [section addNotificationBlock:^(RLMSection *section, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"section.count: %zu", section.count); // => 2 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSection *, RLMSectionedResultsChange *))block - queue:(dispatch_queue_t)queue __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the section changes. - - The block will be asynchronously called with the initial section, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - RLMSection *section = sectionedResults[0] // section with dogs aged '5' already exists. - - self.token = [section addNotificationBlock:^(RLMSection *section, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"section.count: %zu", section.count); // => 2 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSection *, RLMSectionedResultsChange *))block - keyPaths:(NSArray *)keyPaths __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the section changes. - - The block will be asynchronously called with the initial section, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - RLMSection *section = sectionedResults[0] // section with dogs aged '5' already exists. - - self.token = [section addNotificationBlock:^(RLMSection *section, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"section.count: %zu", section.count); // => 2 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSection *, RLMSectionedResultsChange *))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue __attribute__((warn_unused_result)); -@end - -/// A lazily evaluated collection that holds elements in sections determined by a section key. -@interface RLMSectionedResults, RLMObjectType: id> : NSObject -/// An array of all keys in the sectioned results collection. -@property (nonatomic) NSArray *allKeys; -/// The total amount of sections in this collection. -@property (nonatomic, readonly, assign) NSUInteger count; -/// Returns the section at a given index. -- (RLMSection *)objectAtIndexedSubscript:(NSUInteger)index; -/// Returns the section at a given index. -- (RLMSection *)objectAtIndex:(NSUInteger)index; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this sectioned results collection. - - The frozen copy is an immutable sectioned results collection which contains the same data as this - sectioned results collection currently contains, but will not update when writes are made to the - containing Realm. Unlike live sectioned results collections, frozen sectioned results collection - can be accessed from any thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning Holding onto a frozen sectioned results collection for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; -/** - Returns a live version of this frozen sectioned results collection. - - This method resolves a reference to a live copy of the same frozen sectioned results collection. - If called on a live section, will return itself. -*/ -- (instancetype)thaw; -/** - Indicates if the underlying sectioned results collection is frozen. - - Frozen sectioned results collections are immutable and can be accessed from any thread. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Sectioned Results Notifications - -/** - Registers a block to be called each time the sectioned results collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSectionedResults *, RLMSectionedResultsChange *))block __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the sectioned results collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSectionedResults *, RLMSectionedResultsChange *))block - queue:(dispatch_queue_t)queue __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the sectioned results collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSectionedResults *, RLMSectionedResultsChange *))block - keyPaths:(NSArray *)keyPaths __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the sectioned results collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSectionedResults *, RLMSectionedResultsChange *))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue __attribute__((warn_unused_result)); -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMSet.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMSet.h deleted file mode 100644 index fead2e005..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMSet.h +++ /dev/null @@ -1,535 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObject, RLMResults; - -/** - A collection datatype used for storing distinct objects. - - - Note: - `RLMSet` supports storing primitive and `RLMObject` types. `RLMSet` does not support storing - Embedded Realm Objects. - */ -@interface RLMSet : NSObject - -#pragma mark - Properties - -/** - The number of objects in the set. - */ -@property (nonatomic, readonly, assign) NSUInteger count; - -/** - The type of the objects in the set. - */ -@property (nonatomic, readonly, assign) RLMPropertyType type; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readonly, getter = isOptional) BOOL optional; - -/** - The objects in the RLMSet as an NSArray value. - */ -@property (nonatomic, readonly) NSArray *allObjects; - -/** - The class name of the objects contained in the set. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages the set. Returns `nil` for unmanaged set. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - Indicates if the set can no longer be accessed. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if the set is frozen. - - Frozen sets are immutable and can be accessed from any thread. Frozen sets - are created by calling `-freeze` on a managed live set. Unmanaged sets are - never frozen. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Adding, Removing, and Replacing Objects in a Set - -/** - Adds an object to the set if it is not already present. - - @warning This method may only be called during a write transaction. - - @param object An object of the type contained in the set. - */ -- (void)addObject:(RLMObjectType)object; - -/** - Adds an array of distinct objects to the set. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable object such as `NSArray`, `NSSet` or `RLMResults` which contains objects of the - same class as the set. - */ -- (void)addObjects:(id)objects; - -/** - Removes a given object from the set. - - @warning This method may only be called during a write transaction. - - @param object The object in the set that you want to remove. - */ -- (void)removeObject:(RLMObjectType)object; - -/** - Removes all objects from the set. - - @warning This method may only be called during a write transaction. - */ -- (void)removeAllObjects; - -/** - Empties the receiving set, then adds each object contained in another given set. - - @warning This method may only be called during a write transaction. - - @param set The RLMSet whose members replace the receiving set's content. - */ -- (void)setSet:(RLMSet *)set; - -/** - Removes from the receiving set each object that isn’t a member of another given set. - - @warning This method may only be called during a write transaction. - - @param set The RLMSet with which to perform the intersection. - */ -- (void)intersectSet:(RLMSet *)set; - -/** - Removes each object in another given set from the receiving set, if present. - - @warning This method may only be called during a write transaction. - - @param set The set of objects to remove from the receiving set. - */ -- (void)minusSet:(RLMSet *)set; - -/** - Adds each object in another given set to the receiving set, if not present. - - @warning This method may only be called during a write transaction. - - @param set The set of objects to add to the receiving set. - */ -- (void)unionSet:(RLMSet *)set; - -#pragma mark - Querying a Set - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/// :nodoc: -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/// :nodoc: -- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/// :nodoc: -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/// :nodoc: -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -/** - Returns a Boolean value that indicates whether at least one object in the receiving set is also present in another given set. - - @param set The RLMSet to compare the receiving set to. - - @return YES if at least one object in the receiving set is also present in otherSet, otherwise NO. - */ -- (BOOL)intersectsSet:(RLMSet *)set; - -/** - Returns a Boolean value that indicates whether every object in the receiving set is also present in another given set. - - @param set The RLMSet to compare the receiving set to. - - @return YES if every object in the receiving set is also present in otherSet, otherwise NO. - */ -- (BOOL)isSubsetOfSet:(RLMSet *)set; - -/** - Returns a Boolean value that indicates whether a given object is present in the set. - - @param anObject An object to look for in the set. - - @return YES if anObject is present in the set, otherwise NO. - */ -- (BOOL)containsObject:(RLMObjectType)anObject; - -/** - Compares the receiving set to another set. - - @param otherSet The set with which to compare the receiving set. - - @return YES if the contents of otherSet are equal to the contents of the receiving set, otherwise NO. - */ -- (BOOL)isEqualToSet:(RLMSet *)otherSet; - -#pragma mark - Sectioning a Set - -/** - Sorts and sections this collection from a given property key path, returning the result - as an instance of `RLMSectionedResults`. - - @param keyPath The property key path to sort on. - @param ascending The direction to sort in. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsSortedUsingKeyPath:(NSString *)keyPath - ascending:(BOOL)ascending - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -/** - Sorts and sections this collection from a given array of sort descriptors, returning the result - as an instance of `RLMSectionedResults`. - - @param sortDescriptors An array of `RLMSortDescriptor`s to sort by. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @note The primary sort descriptor must be responsible for determining the section key. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsUsingSortDescriptors:(NSArray *)sortDescriptors - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - - -#pragma mark - Notifications - -/** - Registers a block to be called each time the set changes. - - The block will be asynchronously called with the initial set, and then - called again after each write transaction which changes any of the objects in - the set, which objects are in the results, or the order of the objects in the - set. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the set were added, removed or modified. If a write transaction - did not modify any objects in the set, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - Person *person = [[Person allObjectsInRealm:realm] firstObject]; - NSLog(@"person.dogs.count: %zu", person.dogs.count); // => 0 - self.token = [person.dogs addNotificationBlock(RLMSet *dogs, - RLMCollectionChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count) // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - [person.dogs addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a non-frozen managed set. - - @param block The block to be called each time the set changes. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSet *_Nullable set, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the set changes. - - The block will be asynchronously called with the initial set, and then - called again after each write transaction which changes any of the objects in - the set, which objects are in the results, or the order of the objects in the - set. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the set were added, removed or modified. If a write transaction - did not modify any objects in the set, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSet *_Nullable set, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the set changes. - - The block will be asynchronously called with the initial set, and then - called again after each write transaction which changes any of the objects in - the set, which objects are in the results, or the order of the objects in the - set. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the set were added, removed or modified. If a write transaction - did not modify any objects in the set, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSet *_Nullable set, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the set changes. - - The block will be asynchronously called with the initial set, and then - called again after each write transaction which changes any of the objects in - the set, which objects are in the results, or the order of the objects in the - set. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the set were added, removed or modified. If a write transaction - did not modify any objects in the set, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSet *_Nullable set, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths -__attribute__((warn_unused_result)); - -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the objects in the set. - - NSNumber *min = [object.setProperty minOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, `RLMSet`, and `NSData` properties. - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The minimum value of the property, or `nil` if the set is empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects in the set. - - NSNumber *max = [object.setProperty maxOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, `RLMSet`, and `NSData` properties. - - @param property The property whose maximum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The maximum value of the property, or `nil` if the set is empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of distinct values of a given property over all the objects in the set. - - NSNumber *sum = [object.setProperty sumOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, `RLMSet and `NSData` properties. - - @param property The property whose values should be summed. Only properties of - types `int`, `float`, and `double` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects in the set. - - NSNumber *average = [object.setProperty averageOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMSet`, `RLMArray`, and `NSData` properties. - - @param property The property whose average value should be calculated. Only - properties of types `int`, `float`, and `double` are supported. - - @return The average value of the given property, or `nil` if the set is empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this set. - - The frozen copy is an immutable set which contains the same data as this - et currently contains, but will not update when writes are made to the - containing Realm. Unlike live sets, frozen sets can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a managed set. - @warning Holding onto a frozen set for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -#pragma mark - Unavailable Methods - -/** - `-[RLMSet init]` is not available because `RLMSet`s cannot be created directly. - ``RLMSet` properties on `RLMObject`s are lazily created when accessed. - */ -- (instancetype)init __attribute__((unavailable("RLMSets cannot be created directly"))); - -/** - `+[RLMSet new]` is not available because `RLMSet`s cannot be created directly. - `RLMSet` properties on `RLMObject`s are lazily created when accessed. - */ -+ (instancetype)new __attribute__((unavailable("RLMSet cannot be created directly"))); - -@end - -/// :nodoc: -@interface RLMSet (Swift) -// for use only in Swift class definitions -- (instancetype)initWithObjectClassName:(NSString *)objectClassName; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMSwiftObject.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMSwiftObject.h deleted file mode 100644 index 7ea764016..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMSwiftObject.h +++ /dev/null @@ -1,142 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) -/** - `Object` is a class used to define Realm model objects. - - In Realm you define your model classes by subclassing `Object` and adding properties to be managed. - You then instantiate and use your custom subclasses instead of using the `Object` class directly. - - ```swift - class Dog: Object { - @objc dynamic var name: String = "" - @objc dynamic var adopted: Bool = false - let siblings = List() - } - ``` - - ### Supported property types - - - `String`, `NSString` - - `Int` - - `Int8`, `Int16`, `Int32`, `Int64` - - `Float` - - `Double` - - `Bool` - - `Date`, `NSDate` - - `Data`, `NSData` - - `Decimal128` - - `ObjectId` - - `@objc enum` which has been delcared as conforming to `RealmEnum`. - - `RealmOptional` for optional numeric properties - - `Object` subclasses, to model many-to-one relationships - - `EmbeddedObject` subclasses, to model owning one-to-one relationships - - `List`, to model many-to-many relationships - - `String`, `NSString`, `Date`, `NSDate`, `Data`, `NSData`, `Decimal128`, and `ObjectId` properties - can be declared as optional. `Object` and `EmbeddedObject` subclasses *must* be declared as optional. - `Int`, `Int8`, `Int16`, `Int32`, `Int64`, `Float`, `Double`, `Bool`, enum, and `List` properties cannot. - To store an optional number, use `RealmOptional`, `RealmOptional`, `RealmOptional`, or - `RealmOptional` instead, which wraps an optional numeric value. Lists cannot be optional at all. - - All property types except for `List` and `RealmOptional` *must* be declared as `@objc dynamic var`. `List` and - `RealmOptional` properties must be declared as non-dynamic `let` properties. Swift `lazy` properties are not allowed. - - Note that none of the restrictions listed above apply to properties that are configured to be ignored by Realm. - - ### Querying - - You can retrieve all objects of a given type from a Realm by calling the `objects(_:)` instance method. - - ### Relationships - - See our [Objective-C guide](https://docs.mongodb.com/realm/sdk/swift/fundamentals/relationships/) for more details. - */ -@interface RealmSwiftObject : RLMObjectBase -@end - -/** - `EmbeddedObject` is a base class used to define embedded Realm model objects. - - Embedded objects work similarly to normal objects, but are owned by a single - parent Object (which itself may be embedded). Unlike normal top-level objects, - embedded objects cannot be directly created in or added to a Realm. Instead, - they can only be created as part of a parent object, or by assigning an - unmanaged object to a parent object's property. Embedded objects are - automatically deleted when the parent object is deleted or when the parent is - modified to no longer point at the embedded object, either by reassigning an - Object property or by removing the embedded object from the List containing it. - - Embedded objects can only ever have a single parent object which links to - them, and attempting to link to an existing managed embedded object will throw - an exception. - - The property types supported on `EmbeddedObject` are the same as for `Object`, - except for that embedded objects cannot link to top-level objects, so `Object` - and `List` properties are not supported (`EmbeddedObject` and - `List` *are*). - - Embedded objects cannot have primary keys or indexed properties. - - ```swift - class Owner: Object { - @objc dynamic var name: String = "" - let dogs = List() - } - class Dog: EmbeddedObject { - @objc dynamic var name: String = "" - @objc dynamic var adopted: Bool = false - let owner = LinkingObjects(fromType: Owner.self, property: "dogs") - } - ``` - */ -@interface RealmSwiftEmbeddedObject : RLMObjectBase -@end - -/** - `AsymmetricObject` is a base class used to define asymmetric Realm objects. - - Asymmetric objects can only be created using the `create(_ object:)` - function, and cannot be added, removed or queried. - When created, asymmetric objects will be synced unidirectionally to the MongoDB - database and cannot be accessed locally. - - Incoming links from any asymmetric table are not allowed, meaning embedding - an asymmetric object within an `Object` will throw an error. - - The property types supported on `AsymmetricObject` are the same as for `Object`, - except for that asymmetric objects can only link to embedded objects, so `Object` - and `List` properties are not supported (`EmbeddedObject` and - `List` *are*). - - ```swift - class Person: AsymmetricObject { - @Persisted(primaryKey: true) var _id: ObjectId = ObjectId.generate() - @Persisted var name: String - @Persisted var age: Int - } - ``` - */ -@interface RealmSwiftAsymmetricObject : RLMObjectBase -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMSwiftProperty.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMSwiftProperty.h deleted file mode 100644 index ea071927c..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMSwiftProperty.h +++ /dev/null @@ -1,71 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -@class RLMObjectBase, RLMArray, RLMSet; - -#ifdef __cplusplus -extern "C" { -#endif - -RLM_HEADER_AUDIT_BEGIN(nullability) - -#define REALM_FOR_EACH_SWIFT_PRIMITIVE_TYPE(macro) \ - macro(bool, Bool, bool) \ - macro(double, Double, double) \ - macro(float, Float, float) \ - macro(int64_t, Int64, int) - -#define REALM_FOR_EACH_SWIFT_OBJECT_TYPE(macro) \ - macro(NSString, String, string) \ - macro(NSDate, Date, date) \ - macro(NSData, Data, data) \ - macro(NSUUID, UUID, uuid) \ - macro(RLMDecimal128, Decimal128, decimal128) \ - macro(RLMObjectId, ObjectId, objectId) - -#define REALM_SWIFT_PROPERTY_ACCESSOR(objc, swift, rlmtype) \ - objc RLMGetSwiftProperty##swift(RLMObjectBase *, uint16_t); \ - objc RLMGetSwiftProperty##swift##Optional(RLMObjectBase *, uint16_t, bool *); \ - void RLMSetSwiftProperty##swift(RLMObjectBase *, uint16_t, objc); -REALM_FOR_EACH_SWIFT_PRIMITIVE_TYPE(REALM_SWIFT_PROPERTY_ACCESSOR) -#undef REALM_SWIFT_PROPERTY_ACCESSOR - -#define REALM_SWIFT_PROPERTY_ACCESSOR(objc, swift, rlmtype) \ - objc *_Nullable RLMGetSwiftProperty##swift(RLMObjectBase *, uint16_t); \ - void RLMSetSwiftProperty##swift(RLMObjectBase *, uint16_t, objc *_Nullable); -REALM_FOR_EACH_SWIFT_OBJECT_TYPE(REALM_SWIFT_PROPERTY_ACCESSOR) -#undef REALM_SWIFT_PROPERTY_ACCESSOR - -id _Nullable RLMGetSwiftPropertyAny(RLMObjectBase *, uint16_t); -void RLMSetSwiftPropertyAny(RLMObjectBase *, uint16_t, id); -RLMObjectBase *_Nullable RLMGetSwiftPropertyObject(RLMObjectBase *, uint16_t); -void RLMSetSwiftPropertyNil(RLMObjectBase *, uint16_t); -void RLMSetSwiftPropertyObject(RLMObjectBase *, uint16_t, RLMObjectBase *_Nullable); - -RLMArray *_Nonnull RLMGetSwiftPropertyArray(RLMObjectBase *obj, uint16_t); -RLMSet *_Nonnull RLMGetSwiftPropertySet(RLMObjectBase *obj, uint16_t); -RLMDictionary *_Nonnull RLMGetSwiftPropertyMap(RLMObjectBase *obj, uint16_t); - -RLM_HEADER_AUDIT_END(nullability) - -#ifdef __cplusplus -} // extern "C" -#endif diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMSyncConfiguration.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMSyncConfiguration.h deleted file mode 100644 index 54ea2ecfc..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMSyncConfiguration.h +++ /dev/null @@ -1,196 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -@class RLMApp; -@class RLMRealm; -@class RLMRealmConfiguration; -@class RLMUser; -@protocol RLMBSON; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** Determines file behavior during a client reset. - - @see: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ -*/ -typedef NS_ENUM(NSUInteger, RLMClientResetMode) { - /// The local copy of the Realm is copied into a recovery - /// directory for safekeeping, and then deleted from the original location. The next time - /// the Realm for that partition value is opened, the Realm will automatically be re-downloaded from - /// Atlas App Services, and can be used as normal. - - /// Data written to the Realm after the local copy of the Realm diverged from the backup - /// remote copy will be present in the local recovery copy of the Realm file. The - /// re-downloaded Realm will initially contain only the data present at the time the Realm - /// was backed up on the server. - /// - /// @see: ``rlmSync_clientResetBackedUpRealmPath`` and ``RLMSyncErrorActionToken`` for more information on accessing the recovery directory and error information. - /// - /// The manual client reset mode handler can be set in two places: - /// 1. As an ErrorReportingBlock argument at ``RLMSyncConfiguration.manualClientResetHandler``. - /// 2. As an ErrorReportingBlock in the ``RLMSyncManager.errorHandler`` property. - /// @see: ``RLMSyncManager.errorHandler`` - /// - /// When an ``RLMSyncErrorClientResetError`` is thrown, the following rules determine which block is executed: - /// - If an error reporting block is set in ``.manualClientResetHandler`` and the ``RLMSyncManager.errorHandler``, the ``.manualClientResetHandler`` block will be executed. - /// - If an error reporting block is set in either the ``.manualClientResetHandler`` or the ``RLMSyncManager``, but not both, the single block will execute. - /// - If no block is set in either location, the client reset will not be handled. The application will likely need to be restarted and unsynced local changes may be lost. - /// @note: The ``RLMSyncManager.errorHandler`` is still invoked under all ``RLMSyncError``s *other than* ``RLMSyncErrorClientResetError``. - /// @see ``RLMSyncError`` for an exhaustive list. - RLMClientResetModeManual = 0, - /// All unsynchronized local changes are automatically discarded and the local state is - /// automatically reverted to the most recent state from the server. Unsynchronized changes - /// can then be recovered in the post-client-reset callback block. - /// - /// If ``RLMClientResetModeDiscardLocal`` is enabled but the client reset operation is unable to complete - /// then the client reset process reverts to manual mode. Example) During a destructive schema change this - /// mode will fail and invoke the manual client reset handler. - /// - /// The RLMClientResetModeDiscardLocal mode supports two client reset callbacks -- ``RLMClientResetBeforeBlock``, ``RLMClientResetAfterBlock`` -- which can be passed as arguments when creating the ``RLMSyncConfiguration``. - /// @see: ``RLMClientResetAfterBlock`` and ``RLMClientResetBeforeBlock`` - RLMClientResetModeDiscardLocal __deprecated_enum_msg("Use RLMClientResetModeDiscardUnsyncedChanges") = 1, - /// All unsynchronized local changes are automatically discarded and the local state is - /// automatically reverted to the most recent state from the server. Unsynchronized changes - /// can then be recovered in the post-client-reset callback block. - /// - /// If ``RLMClientResetModeDiscardUnsyncedChanges`` is enabled but the client reset operation is unable to complete - /// then the client reset process reverts to manual mode. Example) During a destructive schema change this - /// mode will fail and invoke the manual client reset handler. - /// - /// The RLMClientResetModeDiscardUnsyncedChanges mode supports two client reset callbacks -- ``RLMClientResetBeforeBlock``, ``RLMClientResetAfterBlock`` -- which can be passed as arguments when creating the ``RLMSyncConfiguration``. - /// @see: ``RLMClientResetAfterBlock`` and ``RLMClientResetBeforeBlock`` - RLMClientResetModeDiscardUnsyncedChanges = 1, - /// The client device will download a realm realm which reflects the latest - /// state of the server after a client reset. A recovery process is run locally in - /// an attempt to integrate the server version with any local changes from - /// before the client reset occurred. - /// - /// The changes are integrated with the following rules: - /// 1. Objects created locally that were not synced before client reset will be integrated. - /// 2. If an object has been deleted on the server, but was modified on the client, the delete takes precedence and the update is discarded - /// 3. If an object was deleted on the client, but not the server, then the client delete instruction is applied. - /// 4. In the case of conflicting updates to the same field, the client update is applied. - /// - /// If the recovery integration fails, the client reset process falls back to ``RLMClientResetModeManual``. - /// The recovery integration will fail if the "Client Recovery" setting is not enabled on the server. - /// Integration may also fail in the event of an incompatible schema change. - /// - /// The RLMClientResetModeRecoverUnsyncedChanges mode supports two client reset callbacks -- ``RLMClientResetBeforeBlock``, ``RLMClientResetAfterBlock`` -- which can be passed as arguments when creating the ``RLMSyncConfiguration``. - /// @see: ``RLMClientResetAfterBlock`` and ``RLMClientResetBeforeBlock`` - RLMClientResetModeRecoverUnsyncedChanges = 2, - /// The client device will download a realm with objects reflecting the latest version of the server. A recovery - /// process is run locally in an attempt to integrate the server version with any local changes from before the - /// client reset occurred. - /// - /// The changes are integrated with the following rules: - /// 1. Objects created locally that were not synced before client reset will be integrated. - /// 2. If an object has been deleted on the server, but was modified on the client, the delete takes precedence and the update is discarded - /// 3. If an object was deleted on the client, but not the server, then the client delete instruction is applied. - /// 4. In the case of conflicting updates to the same field, the client update is applied. - /// - /// If the recovery integration fails, the client reset process falls back to ``RLMClientResetModeDiscardUnsyncedChanges``. - /// The recovery integration will fail if the "Client Recovery" setting is not enabled on the server. - /// Integration may also fail in the event of an incompatible schema change. - /// - /// The RLMClientResetModeRecoverOrDiscardUnsyncedChanges mode supports two client reset callbacks -- ``RLMClientResetBeforeBlock``, ``RLMClientResetAfterBlock`` -- which can be passed as arguments when creating the ``RLMSyncConfiguration``. - /// @see: ``RLMClientResetAfterBlock`` and ``RLMClientResetBeforeBlock`` - RLMClientResetModeRecoverOrDiscardUnsyncedChanges = 3 -}; - -/** - A block type used to report before a client reset will occur. - The `beforeFrozen` is a frozen copy of the local state prior to client reset. - */ -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMClientResetBeforeBlock)(RLMRealm * _Nonnull beforeFrozen); - -/** - A block type used to report after a client reset occurred. - The `beforeFrozen` argument is a frozen copy of the local state prior to client reset. - The `after` argument contains the local database state after the client reset occurred. - */ -RLM_SWIFT_SENDABLE // invoked on a backgroun thread -typedef void(^RLMClientResetAfterBlock)(RLMRealm * _Nonnull beforeFrozen, RLMRealm * _Nonnull after); - -/** - A configuration object representing configuration state for a Realm which is intended to sync with a Realm Object - Server. - */ -@interface RLMSyncConfiguration : NSObject - -/// The user to which the remote Realm belongs. -@property (nonatomic, readonly) RLMUser *user; - -/** - The value this Realm is partitioned on. The partition key is a property defined in - Atlas App Services. All classes with a property with this value will be synchronized to the - Realm. - */ -@property (nonatomic, readonly) id partitionValue; - -/** - An enum which determines file recovery behavior in the event of a client reset. - @note: Defaults to `RLMClientResetModeRecoverUnsyncedChanges` - - @see: `RLMClientResetMode` - @see: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ -*/ -@property (nonatomic) RLMClientResetMode clientResetMode; - -/** - A callback which notifies prior to prior to a client reset occurring. - @see: `RLMClientResetBeforeBlock` - */ -@property (nonatomic, nullable) RLMClientResetBeforeBlock beforeClientReset; - -/** - A callback which notifies after a client reset has occurred. - @see: `RLMClientResetAfterBlock` - */ -@property (nonatomic, nullable) RLMClientResetAfterBlock afterClientReset; - -/** - A callback that's executed when an `RLMSyncErrorClientResetError` is encountered. - @See RLMSyncErrorReportingBlock and RLMSyncErrorClientResetError for more - details on handling a client reset manually. - */ -@property (nonatomic, nullable) RLMSyncErrorReportingBlock manualClientResetHandler; - - -/** - Whether nonfatal connection errors should cancel async opens. - - By default, if a nonfatal connection error such as a connection timing out occurs, any currently pending asyncOpen operations will ignore the error and continue to retry until it succeeds. If this is set to true, the open will instead fail and report the error. - - NEXT-MAJOR: This should be true by default. - */ -@property (nonatomic) bool cancelAsyncOpenOnNonFatalErrors; - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("This type cannot be created directly"))); - -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("This type cannot be created directly"))); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMSyncManager.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMSyncManager.h deleted file mode 100644 index 1dee453d0..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMSyncManager.h +++ /dev/null @@ -1,223 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMSyncSession, RLMSyncTimeoutOptions, RLMAppConfiguration; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -// NEXT-MAJOR: This enum needs to be removed when access to the logger is removed -// from the sync manager. -/// An enum representing different levels of sync-related logging that can be configured. -typedef RLM_CLOSED_ENUM(NSUInteger, RLMSyncLogLevel) { - /// Nothing will ever be logged. - RLMSyncLogLevelOff, - /// Only fatal errors will be logged. - RLMSyncLogLevelFatal, - /// Only errors will be logged. - RLMSyncLogLevelError, - /// Warnings and errors will be logged. - RLMSyncLogLevelWarn, - /// Information about sync events will be logged. Fewer events will be logged in order to avoid overhead. - RLMSyncLogLevelInfo, - /// Information about sync events will be logged. More events will be logged than with `RLMSyncLogLevelInfo`. - RLMSyncLogLevelDetail, - /// Log information that can aid in debugging. - /// - /// - warning: Will incur a measurable performance impact. - RLMSyncLogLevelDebug, - /// Log information that can aid in debugging. More events will be logged than with `RLMSyncLogLevelDebug`. - /// - /// - warning: Will incur a measurable performance impact. - RLMSyncLogLevelTrace, - /// Log information that can aid in debugging. More events will be logged than with `RLMSyncLogLevelTrace`. - /// - /// - warning: Will incur a measurable performance impact. - RLMSyncLogLevelAll -}; - -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" -/// A log callback function which can be set on RLMSyncManager. -/// -/// The log function may be called from multiple threads simultaneously, and is -/// responsible for performing its own synchronization if any is required. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void (^RLMSyncLogFunction)(RLMSyncLogLevel level, NSString *message); -#pragma clang diagnostic pop - -/// A block type representing a block which can be used to report a sync-related error to the application. If the error -/// pertains to a specific session, that session will also be passed into the block. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMSyncErrorReportingBlock)(NSError *, RLMSyncSession * _Nullable); - -/** - A manager which serves as a central point for sync-related configuration. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMSyncManager : NSObject - -/** - A block which can optionally be set to report sync-related errors to your application. - - Any error reported through this block will be of the `RLMSyncError` type, and marked - with the `RLMSyncErrorDomain` domain. - - Errors reported through this mechanism are fatal, with several exceptions. Please consult - `RLMSyncError` for information about the types of errors that can be reported through - the block, and for for suggestions on handling recoverable error codes. - - @see `RLMSyncError` - */ -@property (nullable, atomic, copy) RLMSyncErrorReportingBlock errorHandler; - -/// :nodoc: -@property (nonatomic, copy) NSString *appID -__attribute__((deprecated("This property is not used for anything"))); - -/** - A string identifying this application which is included in the User-Agent - header of sync connections. By default, this will be the application's bundle - identifier. - - This property must be set prior to opening a synchronized Realm for the first - time. Any modifications made after opening a Realm will be ignored. - */ -@property (atomic, copy) NSString *userAgent; - -/** - The logging threshold which newly opened synced Realms will use. Defaults to - `RLMSyncLogLevelInfo`. - - By default logging strings are output to Apple System Logger. Set `logger` to - perform custom logging logic instead. - - @warning This property must be set before any synced Realms are opened. Setting it after - opening any synced Realm will do nothing. - */ -@property (atomic) RLMSyncLogLevel logLevel -__attribute__((deprecated("Use `RLMLogger.default.level`/`Logger.shared.level` to set/get the default logger threshold level."))); - -/** - The function which will be invoked whenever the sync client has a log message. - - If nil, log strings are output to Apple System Logger instead. - - @warning This property must be set before any synced Realms are opened. Setting - it after opening any synced Realm will do nothing. - */ -@property (atomic, nullable) RLMSyncLogFunction logger -__attribute__((deprecated("Use `RLMLogger.default`/`Logger.shared` to set/get the default logger."))); - -/** - The name of the HTTP header to send authorization data in when making requests to Atlas App Services which has - been configured to expect a custom authorization header. - */ -@property (nullable, atomic, copy) NSString *authorizationHeaderName; - -/** - Extra HTTP headers to append to every request to Atlas App Services. - - Modifying this property while sync sessions are active will result in all - sessions disconnecting and reconnecting using the new headers. - */ -@property (nullable, atomic, copy) NSDictionary *customRequestHeaders; - -/** - Options for the assorted types of connection timeouts for sync connections. - - If nil default values for all timeouts are used instead. - - @warning This property must be set before any synced Realms are opened. Setting - it after opening any synced Realm will do nothing. - */ -@property (nullable, atomic, copy) RLMSyncTimeoutOptions *timeoutOptions; - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("RLMSyncManager cannot be created directly"))); - -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("RLMSyncManager cannot be created directly"))); - -@end - -/** - Options for configuring timeouts and intervals in the sync client. - */ -@interface RLMSyncTimeoutOptions : NSObject -/// The maximum number of milliseconds to allow for a connection to -/// become fully established. This includes the time to resolve the -/// network address, the TCP connect operation, the SSL handshake, and -/// the WebSocket handshake. -/// -/// Defaults to 2 minutes. -@property (nonatomic) NSUInteger connectTimeout; - -/// The number of milliseconds to keep a connection open after all -/// sessions have been abandoned. -/// -/// After all synchronized Realms have been closed for a given server, the -/// connection is kept open until the linger time has expired to avoid the -/// overhead of reestablishing the connection when Realms are being closed and -/// reopened. -/// -/// Defaults to 30 seconds. -@property (nonatomic) NSUInteger connectionLingerTime; - -/// The number of milliseconds between each heartbeat ping message. -/// -/// The client periodically sends ping messages to the server to check if the -/// connection is still alive. Shorter periods make connection state change -/// notifications more responsive at the cost of battery life (as the antenna -/// will have to wake up more often). -/// -/// Defaults to 1 minute. -@property (nonatomic) NSUInteger pingKeepalivePeriod; - -/// How long in milliseconds to wait for a reponse to a heartbeat ping before -/// concluding that the connection has dropped. -/// -/// Shorter values will make connection state change notifications more -/// responsive as it will only change to `disconnected` after this much time has -/// elapsed, but overly short values may result in spurious disconnection -/// notifications when the server is simply taking a long time to respond. -/// -/// Defaults to 2 minutes. -@property (nonatomic) NSUInteger pongKeepaliveTimeout; - -/// The maximum amount of time, in milliseconds, since the loss of a -/// prior connection, for a new connection to be considered a "fast -/// reconnect". -/// -/// When a client first connects to the server, it defers uploading any local -/// changes until it has downloaded all changesets from the server. This -/// typically reduces the total amount of merging that has to be done, and is -/// particularly beneficial the first time that a specific client ever connects -/// to the server. -/// -/// When an existing client disconnects and then reconnects within the "fact -/// reconnect" time this is skipped and any local changes are uploaded -/// immediately without waiting for downloads, just as if the client was online -/// the whole time. -/// -/// Defaults to 1 minute. -@property (nonatomic) NSUInteger fastReconnectLimit; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMSyncSession.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMSyncSession.h deleted file mode 100644 index 31677ce9c..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMSyncSession.h +++ /dev/null @@ -1,234 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -/** - The current state of the session represented by a session object. - */ -typedef NS_ENUM(NSUInteger, RLMSyncSessionState) { - /// The sync session is actively communicating or attempting to communicate - /// with Atlas App Services. A session is considered Active even if - /// it is not currently connected. Check the connection state instead if you - /// wish to know if the connection is currently online. - RLMSyncSessionStateActive, - /// The sync session is not attempting to communicate with MongoDB - /// Realm due to the user logging out or synchronization being paused. - RLMSyncSessionStateInactive, - /// The sync session encountered a fatal error and is permanently invalid; it should be discarded. - RLMSyncSessionStateInvalid -}; - -/** - The current state of a sync session's connection. Sessions which are not in - the Active state will always be Disconnected. - */ -typedef NS_ENUM(NSUInteger, RLMSyncConnectionState) { - /// The sync session is not connected to the server, and is not attempting - /// to connect, either because the session is inactive or because it is - /// waiting to retry after a failed connection. - RLMSyncConnectionStateDisconnected, - /// The sync session is attempting to connect to Atlas App Services. - RLMSyncConnectionStateConnecting, - /// The sync session is currently connected to Atlas App Services. - RLMSyncConnectionStateConnected, -}; - -/** - The transfer direction (upload or download) tracked by a given progress notification block. - - Progress notification blocks can be registered on sessions if your app wishes to be informed - how many bytes have been uploaded or downloaded, for example to show progress indicator UIs. - */ -typedef RLM_CLOSED_ENUM(NSUInteger, RLMSyncProgressDirection) { - /// For monitoring upload progress. - RLMSyncProgressDirectionUpload, - /// For monitoring download progress. - RLMSyncProgressDirectionDownload, -}; - -/** - The desired behavior of a progress notification block. - - Progress notification blocks can be registered on sessions if your app wishes to be informed - how many bytes have been uploaded or downloaded, for example to show progress indicator UIs. - */ -typedef NS_ENUM(NSUInteger, RLMSyncProgressMode) { - /** - The block will be called indefinitely, or until it is unregistered by calling - `-[RLMProgressNotificationToken invalidate]`. - - Notifications will always report the latest number of transferred bytes, and the - most up-to-date number of total transferrable bytes. - */ - RLMSyncProgressModeReportIndefinitely, - /** - The block will, upon registration, store the total number of bytes - to be transferred. When invoked, it will always report the most up-to-date number - of transferrable bytes out of that original number of transferrable bytes. - - When the number of transferred bytes reaches or exceeds the - number of transferrable bytes, the block will be unregistered. - */ - RLMSyncProgressModeForCurrentlyOutstandingWork, -}; - -@class RLMUser, RLMSyncConfiguration, RLMSyncErrorActionToken, RLMSyncManager; - -/** - The type of a progress notification block intended for reporting a session's network - activity to the user. - - `transferredBytes` refers to the number of bytes that have been uploaded or downloaded. - `transferrableBytes` refers to the total number of bytes transferred, and pending transfer. - */ -typedef void(^RLMProgressNotificationBlock)(NSUInteger transferredBytes, NSUInteger transferrableBytes); - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A token object corresponding to a progress notification block on a session object. - - To stop notifications manually, call `-invalidate` on it. Notifications should be stopped before - the token goes out of scope or is destroyed. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMProgressNotificationToken : RLMNotificationToken -@end - -/** - An object encapsulating an Atlas App Services "session". Sessions represent the - communication between the client (and a local Realm file on disk), and the server - (and a remote Realm with a given partition value stored on Atlas App Services). - - Sessions are always created by the SDK and vended out through various APIs. The - lifespans of sessions associated with Realms are managed automatically. Session - objects can be accessed from any thread. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMSyncSession : NSObject - -/// The session's current state. -/// -/// This property is not KVO-compliant. -@property (nonatomic, readonly) RLMSyncSessionState state; - -/// The session's current connection state. -/// -/// This property is KVO-compliant and can be observed to be notified of changes. -/// Be warned that KVO observers for this property may be called on a background -/// thread. -@property (atomic, readonly) RLMSyncConnectionState connectionState; - -/// The user that owns this session. -- (nullable RLMUser *)parentUser; - -/** - If the session is valid, return a sync configuration that can be used to open the Realm - associated with this session. - */ -- (nullable RLMSyncConfiguration *)configuration; - -/** - Temporarily suspend syncronization and disconnect from the server. - - The session will not attempt to connect to Atlas App Services until `resume` - is called or the Realm file is closed and re-opened. - */ -- (void)suspend; - -/** - Resume syncronization and reconnect to Atlas App Services after suspending. - - This is a no-op if the session was already active or if the session is invalid. - Newly created sessions begin in the Active state and do not need to be resumed. - */ -- (void)resume; - -/** - Register a progress notification block. - - Multiple blocks can be registered with the same session at once. Each block - will be invoked on a side queue devoted to progress notifications. - - If the session has already received progress information from the - synchronization subsystem, the block will be called immediately. Otherwise, it - will be called as soon as progress information becomes available. - - The token returned by this method must be retained as long as progress - notifications are desired, and the `-invalidate` method should be called on it - when notifications are no longer needed and before the token is destroyed. - - If no token is returned, the notification block will never be called again. - There are a number of reasons this might be true. If the session has previously - experienced a fatal error it will not accept progress notification blocks. If - the block was configured in the `RLMSyncProgressForCurrentlyOutstandingWork` - mode but there is no additional progress to report (for example, the number - of transferrable bytes and transferred bytes are equal), the block will not be - called again. - - @param direction The transfer direction (upload or download) to track in this progress notification block. - @param mode The desired behavior of this progress notification block. - @param block The block to invoke when notifications are available. - - @return A token which must be held for as long as you want notifications to be delivered. - - @see `RLMSyncProgressDirection`, `RLMSyncProgress`, `RLMProgressNotificationBlock`, `RLMProgressNotificationToken` - */ -- (nullable RLMProgressNotificationToken *)addProgressNotificationForDirection:(RLMSyncProgressDirection)direction - mode:(RLMSyncProgressMode)mode - block:(RLMProgressNotificationBlock)block -NS_REFINED_FOR_SWIFT; - -/** - Given an error action token, immediately handle the corresponding action. - - @see `RLMSyncErrorClientResetError`, `RLMSyncErrorPermissionDeniedError` - */ -+ (void)immediatelyHandleError:(RLMSyncErrorActionToken *)token syncManager:(RLMSyncManager *)syncManager; - -/** - Get the sync session for the given Realm if it is a synchronized Realm, or `nil` - if it is not. - */ -+ (nullable RLMSyncSession *)sessionForRealm:(RLMRealm *)realm; - -@end - -// MARK: - Error action token - -#pragma mark - Error action token - -/** - An opaque token returned as part of certain errors. It can be - passed into certain APIs to perform certain actions. - - @see `RLMSyncErrorClientResetError`, `RLMSyncErrorPermissionDeniedError` - */ -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMSyncErrorActionToken : NSObject - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("This type cannot be created directly"))); - -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("This type cannot be created directly"))); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMSyncSubscription.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMSyncSubscription.h deleted file mode 100644 index d35be19d0..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMSyncSubscription.h +++ /dev/null @@ -1,346 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectId; - -#pragma mark - Subscription States - -/// The current state of the subscription. This can be used for ensuring that -/// the subscriptions are not errored and that it has been successfully -/// synced to the server. -typedef NS_ENUM(NSUInteger, RLMSyncSubscriptionState) { - /// The subscription is complete and the server has sent all the data that matched the subscription - /// queries at the time the subscription set was updated. The server is now in a steady-state - /// synchronization mode where it will stream update as they come. - RLMSyncSubscriptionStateComplete, - /// The subscription encountered an error and synchronization is paused for this Realm. You can - /// find the error calling error in the subscription set to get a description of the error. You can - /// still use the current subscription set to write a subscription. - RLMSyncSubscriptionStateError, - /// The subscription is persisted locally but not yet processed by the server, which means - /// the server hasn't yet returned all the data that matched the updated subscription queries. - RLMSyncSubscriptionStatePending, - /// The subscription set has been super-ceded by an updated one, this typically means that - /// someone is trying to write a subscription on a different instance of the subscription set. - /// You should not use a superseded subscription set and instead obtain a new instance of - /// the subscription set to write a subscription. - RLMSyncSubscriptionStateSuperseded -}; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - `RLMSyncSubscription` is used to define a Flexible Sync subscription obtained from querying a - subscription set, which can be used to read or remove/update a committed subscription. - */ -@interface RLMSyncSubscription : NSObject - -/// Name of the subscription. If not specified it will return nil. -@property (nonatomic, readonly, nullable) NSString *name; - -/// When the subscription was created. Recorded automatically. -@property (nonatomic, readonly) NSDate *createdAt; - -/// When the subscription was last updated. Recorded automatically. -@property (nonatomic, readonly) NSDate *updatedAt; - -/** - Updates a Flexible Sync's subscription query with an allowed query which will be used to bootstrap data - from the server when committed. - - @warning This method may only be called during a write subscription block. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - */ -- (void)updateSubscriptionWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (void)updateSubscriptionWhere:(NSString *)predicateFormat - args:(va_list)args; - -/** - Updates a Flexible Sync's subscription query with an allowed query which will be used to bootstrap data - from the server when committed. - - @warning This method may only be called during a write subscription block. - - @param predicate The predicate with which to filter the objects on the server. - */ -- (void)updateSubscriptionWithPredicate:(NSPredicate *)predicate; - -@end - -/** - `RLMSyncSubscriptionSet` is a collection of `RLMSyncSubscription`s. This is the entry point - for adding and removing `RLMSyncSubscription`s. - */ -@interface RLMSyncSubscriptionSet : NSObject - -/// The number of subscriptions in the subscription set. -@property (readonly) NSUInteger count; - -/// Gets the error associated to the subscription set. This will be non-nil in case the current -/// state of the subscription set is `RLMSyncSubscriptionStateError`. -@property (nonatomic, readonly, nullable) NSError *error; - -/// Gets the state associated to the subscription set. -@property (nonatomic, readonly) RLMSyncSubscriptionState state; - -#pragma mark - Batch Update subscriptions - -/** - Synchronously performs any transactions (add/remove/update) to the subscription set within the block, - this will not wait for the server to acknowledge and see all the data associated with this collection of subscriptions, - and will return after committing the subscription transactions. - - @param block The block containing actions to perform to the subscription set. - */ -- (void)update:(__attribute__((noescape)) void(^)(void))block; -/// :nodoc: -- (void)write:(__attribute__((noescape)) void(^)(void))block __attribute__((unavailable("Renamed to -update"))); - -/** - Synchronously performs any transactions (add/remove/update) to the subscription set within the block, - this will not wait for the server to acknowledge and see all the data associated with this collection of subscriptions, - and will return after committing the subscription transactions. - - @param block The block containing actions to perform to the subscription set. - @param onComplete A block which is called upon synchronization of - subscriptions to the server. The block will be passed `nil` - if the update succeeded, and an error describing the problem - otherwise. - */ -- (void)update:(__attribute__((noescape)) void(^)(void))block - onComplete:(nullable void(^RLM_SWIFT_SENDABLE)(NSError *_Nullable))onComplete - __attribute__((swift_async(not_swift_private, 2))) - __attribute__((swift_attr("@_unsafeInheritExecutor"))); -/// :nodoc: -- (void)write:(__attribute__((noescape)) void(^)(void))block - onComplete:(void(^)(NSError * _Nullable))onComplete __attribute__((unavailable("Renamed to -update:onComplete."))); - -#pragma mark - Find subscription - -/** - Finds a subscription by the specified name. - - @param name The name used to identify the subscription. - - @return A subscription for the given name. - */ -- (nullable RLMSyncSubscription *)subscriptionWithName:(NSString *)name; - -/** - Finds a subscription by the query for the specified object class name. - - @param objectClassName The class name for the model class to be queried. - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return A subscription for the given query.. - */ -- (nullable RLMSyncSubscription *)subscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (nullable RLMSyncSubscription *)subscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat - args:(va_list)args; - -/** - Finds a subscription by the query for the specified object class name. - - @param objectClassName The class name for the model class to be queried. - @param predicate The predicate used to to filter the objects on the server. - - @return A subscription for the given query.. - */ -- (nullable RLMSyncSubscription *)subscriptionWithClassName:(NSString *)objectClassName - predicate:(NSPredicate *)predicate; - -#pragma mark - Add a Subscription - -/** - Adds a new subscription to the subscription set which will be sent to the server when - committed at the end of a write subscription block. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - */ -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat - args:(va_list)args; - -/** - Adds a new subscription to the subscription set which will be sent to the server when - committed at the end of a write subscription block. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param name The name used the identify the subscription. - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - */ -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - subscriptionName:(NSString *)name - where:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - subscriptionName:(NSString *)name - where:(NSString *)predicateFormat - args:(va_list)args; - -/** - Adds a new subscription to the subscription set which will be sent to the server when - committed at the end of a write subscription block. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param predicate The predicate defining the query for the subscription. - */ -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - predicate:(NSPredicate *)predicate; - -/** - Adds a new subscription to the subscription set which will be sent to the server when - committed at the end of a write subscription block. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param name The name used to identify the subscription. - @param predicate The predicate defining the query for the subscription. - */ -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - subscriptionName:(nullable NSString *)name - predicate:(NSPredicate *)predicate; - -#pragma mark - Remove Subscription - -/** - Removes a subscription with the specified name from the subscription set. - - @warning This method may only be called during a write subscription block. - - @param name The name used the identify the subscription. - */ -- (void)removeSubscriptionWithName:(NSString *)name; - -/** - Removes a subscription with the specified query for the object class from the subscription set. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - */ -- (void)removeSubscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (void)removeSubscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat - args:(va_list)args; - -/** - Removes a subscription with the specified query for the object class from the subscription set. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param predicate The predicate which will be used to identify the subscription to be removed. - */ -- (void)removeSubscriptionWithClassName:(NSString *)objectClassName - predicate:(NSPredicate *)predicate; - -/** - Removes the subscription from the subscription set. - - @warning This method may only be called during a write subscription block. - - @param subscription An instance of the subscription to be removed. - */ -- (void)removeSubscription:(RLMSyncSubscription *)subscription; - -#pragma mark - Remove Subscriptions - -/** - Removes all subscription from the subscription set. - - @warning This method may only be called during a write subscription block. - @warning Removing all subscriptions will result in an error if no new subscription is added. Server should - acknowledge at least one subscription. - */ -- (void)removeAllSubscriptions; - -/** - Removes all subscription with the specified class name. - - @param className The class name for the model class to be queried. - - @warning This method may only be called during a write subscription block. - */ -- (void)removeAllSubscriptionsWithClassName:(NSString *)className; - -#pragma mark - SubscriptionSet Collection - -/** - Returns the subscription at the given `index`. - - @param index The index. - - @return A subscription for the given index in the subscription set. - */ -- (nullable RLMSyncSubscription *)objectAtIndex:(NSUInteger)index; - -/** - Returns the first object in the subscription set list, or `nil` if the subscriptions are empty. - - @return A subscription. - */ -- (nullable RLMSyncSubscription *)firstObject; - -/** - Returns the last object in the subscription set, or `nil` if the subscriptions are empty. - - @return A subscription. - */ -- (nullable RLMSyncSubscription *)lastObject; - -#pragma mark - Subscript - -/** - Returns the subscription at the given `index`. - - @param index The index. - - @return A subscription for the given index in the subscription set. - */ -- (id)objectAtIndexedSubscript:(NSUInteger)index; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMThreadSafeReference.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMThreadSafeReference.h deleted file mode 100644 index 9472942ed..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMThreadSafeReference.h +++ /dev/null @@ -1,107 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMRealm; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - Objects of types which conform to `RLMThreadConfined` can be managed by a Realm, which will make - them bound to a thread-specific `RLMRealm` instance. Managed objects must be explicitly exported - and imported to be passed between threads. - - Managed instances of objects conforming to this protocol can be converted to a thread-safe - reference for transport between threads by passing to the - `+[RLMThreadSafeReference referenceWithThreadConfined:]` constructor. - - Note that only types defined by Realm can meaningfully conform to this protocol, and defining new - classes which attempt to conform to it will not make them work with `RLMThreadSafeReference`. - */ -@protocol RLMThreadConfined -// Conformance to the `RLMThreadConfined_Private` protocol will be enforced at runtime. - -/** - The Realm which manages the object, or `nil` if the object is unmanaged. - - Unmanaged objects are not confined to a thread and cannot be passed to methods expecting a - `RLMThreadConfined` object. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/// Indicates if the object can no longer be accessed because it is now invalid. -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -@end - -/** - An object intended to be passed between threads containing a thread-safe reference to its - thread-confined object. - - To resolve a thread-safe reference on a target Realm on a different thread, pass to - `-[RLMRealm resolveThreadSafeReference:]`. - - @warning A `RLMThreadSafeReference` object must be resolved at most once. - Failing to resolve a `RLMThreadSafeReference` will result in the source version of the - Realm being pinned until the reference is deallocated. - - @note Prefer short-lived `RLMThreadSafeReference`s as the data for the version of the source Realm - will be retained until all references have been resolved or deallocated. - - @see `RLMThreadConfined` - @see `-[RLMRealm resolveThreadSafeReference:]` - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMThreadSafeReference<__covariant Confined : id> : NSObject - -/** - Create a thread-safe reference to the thread-confined object. - - @param threadConfined The thread-confined object to create a thread-safe reference to. - - @note You may continue to use and access the thread-confined object after passing it to this - constructor. - */ -+ (instancetype)referenceWithThreadConfined:(Confined)threadConfined; - -/** - Indicates if the reference can no longer be resolved because an attempt to resolve it has already - occurred. References can only be resolved once. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -#pragma mark - Unavailable Methods - -/** - `-[RLMThreadSafeReference init]` is not available because `RLMThreadSafeReference` cannot be - created directly. `RLMThreadSafeReference` instances must be obtained by calling - `-[RLMRealm resolveThreadSafeReference:]`. - */ -- (instancetype)init __attribute__((unavailable("RLMThreadSafeReference cannot be created directly"))); - -/** - `-[RLMThreadSafeReference new]` is not available because `RLMThreadSafeReference` cannot be - created directly. `RLMThreadSafeReference` instances must be obtained by calling - `-[RLMRealm resolveThreadSafeReference:]`. - */ -+ (instancetype)new __attribute__((unavailable("RLMThreadSafeReference cannot be created directly"))); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMUpdateResult.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMUpdateResult.h deleted file mode 100644 index df0b237e3..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMUpdateResult.h +++ /dev/null @@ -1,45 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectId; -@protocol RLMBSON; - -/// The result of an `updateOne` or `updateMany` operation a `RLMMongoCollection`. -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMUpdateResult : NSObject - -/// The number of documents that matched the filter. -@property (nonatomic, readonly) NSUInteger matchedCount; - -/// The number of documents modified. -@property (nonatomic, readonly) NSUInteger modifiedCount; - -/// The identifier of the inserted document if an upsert took place and the document's primary key is an `ObjectId`. -@property (nonatomic, nullable, readonly) RLMObjectId *objectId -__attribute__((deprecated("Use documentId instead, which support all BSON types", "documentId"))); - -/// The identifier of the inserted document if an upsert took place. -@property (nonatomic, nullable, readonly) id documentId; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMUser.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMUser.h deleted file mode 100644 index 436350f9b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMUser.h +++ /dev/null @@ -1,447 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import -#import -#import - -@class RLMUser, RLMSyncSession, RLMRealm, RLMUserIdentity, RLMAPIKeyAuth, RLMMongoClient, RLMMongoDatabase, RLMMongoCollection, RLMUserProfile; -@protocol RLMBSON; - -/** - The state of the user object. - */ -typedef NS_ENUM(NSUInteger, RLMUserState) { - /// The user is logged out. Call `logInWithCredentials:...` with valid credentials to log the user back in. - RLMUserStateLoggedOut, - /// The user is logged in, and any Realms associated with it are syncing with Atlas App Services. - RLMUserStateLoggedIn, - /// The user has been removed, and cannot be used. - RLMUserStateRemoved -}; - -/// A block type used to report an error related to a specific user. -RLM_SWIFT_SENDABLE -typedef void(^RLMOptionalUserBlock)(RLMUser * _Nullable, NSError * _Nullable); - -/// A block type used to report an error on a network request from the user. -RLM_SWIFT_SENDABLE -typedef void(^RLMUserOptionalErrorBlock)(NSError * _Nullable); - -/// A block which returns a dictionary should there be any custom data set for a user -RLM_SWIFT_SENDABLE -typedef void(^RLMUserCustomDataBlock)(NSDictionary * _Nullable, NSError * _Nullable); - -/// A block type for returning from function calls. -RLM_SWIFT_SENDABLE -typedef void(^RLMCallFunctionCompletionBlock)(id _Nullable, NSError * _Nullable); - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A `RLMUser` instance represents a single Realm App user account. - - A user may have one or more credentials associated with it. These credentials - uniquely identify the user to the authentication provider, and are used to sign - into an Atlas App Services user account. - - Note that user objects are only vended out via SDK APIs, and cannot be directly - initialized. User objects can be accessed from any thread. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // internally thread-safe -@interface RLMUser : NSObject - -/** - The unique Atlas App Services string identifying this user. - Note this is different from an identity: A user may have multiple identities but has a single identifier. See RLMUserIdentity. - */ -@property (nonatomic, readonly) NSString *identifier NS_SWIFT_NAME(id); - -/// Returns an array of identities currently linked to a user. -@property (nonatomic, readonly) NSArray *identities; - -/** - The user's refresh token used to access App Services. - - By default, refresh tokens expire 60 days after they are issued. - You can configure this time for your App's refresh tokens to be - anywhere between 30 minutes and 180 days. - - You can configure the refresh token expiration time for all sessions in - an App from the Admin UI or Admin API. -*/ -@property (nullable, nonatomic, readonly) NSString *refreshToken; - -/** - The user's access token used to access App Services. - - This is required to make HTTP requests to Atlas App Services like the Data API or GraphQL. - It should be treated as sensitive data. - - The Realm SDK automatically manages access tokens and refreshes them - when they expire. - */ -@property (nullable, nonatomic, readonly) NSString *accessToken; - -/** - The current state of the user. - */ -@property (nonatomic, readonly) RLMUserState state; - -/** - Indicates if the user is logged in or not. Returns true if the access token and refresh token are not empty. - */ -@property (nonatomic, readonly) BOOL isLoggedIn; - -#pragma mark - Lifecycle - -/** - Create a partition-based sync configuration instance for the given partition value. - - @param partitionValue The `RLMBSON` value the Realm is partitioned on. - @return A default configuration object with the sync configuration set to use the given partition value. - */ -- (RLMRealmConfiguration *)configurationWithPartitionValue:(nullable id)partitionValue NS_REFINED_FOR_SWIFT; - -/** - Create a partition-based sync configuration instance for the given partition value. - - @param partitionValue The `RLMBSON` value the Realm is partitioned on. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - - @return A configuration object with the sync configuration set to use the given partition value. - */ -- (RLMRealmConfiguration *)configurationWithPartitionValue:(nullable id)partitionValue - clientResetMode:(RLMClientResetMode)clientResetMode NS_REFINED_FOR_SWIFT; - -/** - Create a partition-based sync configuration instance for the given partition value. - - @param partitionValue The `RLMBSON` value the Realm is partitioned on. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param beforeResetBlock A callback which notifies prior to a client reset occurring. See: `RLMClientResetBeforeBlock` - @param afterResetBlock A callback which notifies after a client reset has occurred. See: `RLMClientResetAfterBlock` - - @return A configuration object with the sync configuration set to use the given partition value. - */ -- (RLMRealmConfiguration *)configurationWithPartitionValue:(nullable id)partitionValue - clientResetMode:(RLMClientResetMode)clientResetMode - notifyBeforeReset:(nullable RLMClientResetBeforeBlock)beforeResetBlock - notifyAfterReset:(nullable RLMClientResetAfterBlock)afterResetBlock NS_REFINED_FOR_SWIFT; - -/** - Create a partition-based sync configuration instance for the given partition value. - - @param partitionValue The `RLMBSON` value the Realm is partitioned on. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param manualClientResetHandler An error reporting block that is invoked during a client reset. - @See ``RLMSyncErrorReportingBlock`` and ``RLMClientResetInfo`` - - @return A configuration object with the sync configuration set to use the given partition value. - */ -- (RLMRealmConfiguration *)configurationWithPartitionValue:(nullable id)partitionValue - clientResetMode:(RLMClientResetMode)clientResetMode - manualClientResetHandler:(nullable RLMSyncErrorReportingBlock)manualClientResetHandler NS_REFINED_FOR_SWIFT; - -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @return A ``RLMRealmConfiguration`` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfiguration NS_REFINED_FOR_SWIFT; - -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param beforeResetBlock A callback which notifies prior to a client reset occurring. See: `RLMClientResetBeforeBlock` - @param afterResetBlock A callback which notifies after a client reset has occurred. See: `RLMClientResetAfterBlock` - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithClientResetMode:(RLMClientResetMode)clientResetMode - notifyBeforeReset:(nullable RLMClientResetBeforeBlock)beforeResetBlock - notifyAfterReset:(nullable RLMClientResetAfterBlock)afterResetBlock NS_REFINED_FOR_SWIFT; -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param manualClientResetHandler An error reporting block that is invoked during a client reset. - @See `RLMSyncErrorReportingBlock` and `RLMClientResetInfo` - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithClientResetMode:(RLMClientResetMode)clientResetMode - manualClientResetHandler:(nullable RLMSyncErrorReportingBlock)manualClientResetHandler NS_REFINED_FOR_SWIFT; - -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param initialSubscriptions A block which receives a subscription set instance, that can be - used to add an initial set of subscriptions which will be executed - when the Realm is first opened. - @param rerunOnOpen If true, allows to run the initial set of subscriptions specified, on every app startup. - This can be used to re-run dynamic time ranges and other queries that require a - re-computation of a static variable. - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithInitialSubscriptions:(RLMFlexibleSyncInitialSubscriptionsBlock)initialSubscriptions - rerunOnOpen:(BOOL)rerunOnOpen NS_REFINED_FOR_SWIFT; -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param initialSubscriptions A block which receives a subscription set instance, that can be - used to add an initial set of subscriptions which will be executed - when the Realm is first opened. - @param rerunOnOpen If true, allows to run the initial set of subscriptions specified, on every app startup. - This can be used to re-run dynamic time ranges and other queries that require a - re-computation of a static variable. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param beforeResetBlock A callback which notifies prior to a client reset occurring. See: `RLMClientResetBeforeBlock` - @param afterResetBlock A callback which notifies after a client reset has occurred. See: `RLMClientResetAfterBlock` - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithInitialSubscriptions:(RLMFlexibleSyncInitialSubscriptionsBlock)initialSubscriptions - rerunOnOpen:(BOOL)rerunOnOpen - clientResetMode:(RLMClientResetMode)clientResetMode - notifyBeforeReset:(nullable RLMClientResetBeforeBlock)beforeResetBlock - notifyAfterReset:(nullable RLMClientResetAfterBlock)afterResetBlock NS_REFINED_FOR_SWIFT; - -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param initialSubscriptions A block which receives a subscription set instance, that can be - used to add an initial set of subscriptions which will be executed - when the Realm is first opened. - @param rerunOnOpen If true, allows to run the initial set of subscriptions specified, on every app startup. - This can be used to re-run dynamic time ranges and other queries that require a - re-computation of a static variable. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param manualClientResetHandler An error reporting block that is invoked during a client reset. - @See `RLMSyncErrorReportingBlock` and `RLMClientResetInfo` - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithInitialSubscriptions:(RLMFlexibleSyncInitialSubscriptionsBlock)initialSubscriptions - rerunOnOpen:(BOOL)rerunOnOpen - clientResetMode:(RLMClientResetMode)clientResetMode - manualClientResetHandler:(nullable RLMSyncErrorReportingBlock)manualClientResetHandler NS_REFINED_FOR_SWIFT; - -#pragma mark - Sessions - -/** - Retrieve a valid session object belonging to this user for a given URL, or `nil` - if no such object exists. - */ -- (nullable RLMSyncSession *)sessionForPartitionValue:(id)partitionValue; - -/// Retrieve all the valid sessions belonging to this user. -@property (nonatomic, readonly) NSArray *allSessions; - -#pragma mark - Custom Data - -/** - The custom data of the user. - This is configured in your Atlas App Services app. - */ -@property (nonatomic, readonly) NSDictionary *customData NS_REFINED_FOR_SWIFT; - -/** - The profile of the user. - */ -@property (nonatomic, readonly) RLMUserProfile *profile; - -/** - Refresh a user's custom data. This will, in effect, refresh the user's auth session. - */ -- (void)refreshCustomDataWithCompletion:(RLMUserCustomDataBlock)completion; - -/** - Links the currently authenticated user with a new identity, where the identity is defined by the credential - specified as a parameter. This will only be successful if this `RLMUser` is the currently authenticated - with the client from which it was created. On success a new user will be returned with the new linked credentials. - - @param credentials The `RLMCredentials` used to link the user to a new identity. - @param completion The completion handler to call when the linking is complete. - If the operation is successful, the result will contain a new - `RLMUser` object representing the currently logged in user. -*/ -- (void)linkUserWithCredentials:(RLMCredentials *)credentials - completion:(RLMOptionalUserBlock)completion NS_REFINED_FOR_SWIFT; - -/** - Removes the user - - This logs out and destroys the session related to this user. The completion block will return an error - if the user is not found or is already removed. - - @param completion A callback invoked on completion -*/ -- (void)removeWithCompletion:(RLMUserOptionalErrorBlock)completion; - -/** - Permanently deletes this user from your Atlas App Services app. - - The users state will be set to `Removed` and the session will be destroyed. - If the delete request fails, the local authentication state will be untouched. - - @param completion A callback invoked on completion -*/ -- (void)deleteWithCompletion:(RLMUserOptionalErrorBlock)completion; - -/** - Logs out the current user - - The users state will be set to `Removed` is they are an anonymous user or `LoggedOut` if they are authenticated by an email / password or third party auth clients - If the logout request fails, this method will still clear local authentication state. - - @param completion A callback invoked on completion -*/ -- (void)logOutWithCompletion:(RLMUserOptionalErrorBlock)completion; - -/** - A client for the user API key authentication provider which - can be used to create and modify user API keys. - - This client should only be used by an authenticated user. -*/ -@property (nonatomic, readonly) RLMAPIKeyAuth *apiKeysAuth; - -/// A client for interacting with a remote MongoDB instance -/// @param serviceName The name of the MongoDB service -- (RLMMongoClient *)mongoClientWithServiceName:(NSString *)serviceName NS_REFINED_FOR_SWIFT; - -/** - Calls the Atlas App Services function with the provided name and arguments. - - @param name The name of the Atlas App Services function to be called. - @param arguments The `BSONArray` of arguments to be provided to the function. - @param completion The completion handler to call when the function call is complete. - This handler is executed on a non-main global `DispatchQueue`. -*/ -- (void)callFunctionNamed:(NSString *)name - arguments:(NSArray> *)arguments - completionBlock:(RLMCallFunctionCompletionBlock)completion NS_REFINED_FOR_SWIFT; - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("RLMUser cannot be created directly"))); -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("RLMUser cannot be created directly"))); - -@end - -#pragma mark - User info classes - -/** - An identity of a user. A user can have multiple identities, usually associated with multiple providers. - Note this is different from a user's unique identifier string. - @seeAlso `RLMUser.identifier` - */ -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMUserIdentity : NSObject - -/** - The associated provider type - */ -@property (nonatomic, readonly) NSString *providerType; - -/** - The string which identifies the RLMUserIdentity - */ -@property (nonatomic, readonly) NSString *identifier; - -/** - Initialize an RLMUserIdentity for the given identifier and provider type. - @param providerType the associated provider type - @param identifier the identifier of the identity - */ -- (instancetype)initUserIdentityWithProviderType:(NSString *)providerType - identifier:(NSString *)identifier; - -@end - -/** - A profile for a given User. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMUserProfile : NSObject - -/// The full name of the user. -@property (nonatomic, readonly, nullable) NSString *name; -/// The email address of the user. -@property (nonatomic, readonly, nullable) NSString *email; -/// A URL to the user's profile picture. -@property (nonatomic, readonly, nullable) NSString *pictureURL; -/// The first name of the user. -@property (nonatomic, readonly, nullable) NSString *firstName; -/// The last name of the user. -@property (nonatomic, readonly, nullable) NSString *lastName; -/// The gender of the user. -@property (nonatomic, readonly, nullable) NSString *gender; -/// The birthdate of the user. -@property (nonatomic, readonly, nullable) NSString *birthday; -/// The minimum age of the user. -@property (nonatomic, readonly, nullable) NSString *minAge; -/// The maximum age of the user. -@property (nonatomic, readonly, nullable) NSString *maxAge; -/// The BSON dictionary of metadata associated with this user. -@property (nonatomic, readonly) NSDictionary *metadata NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMUserAPIKey.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMUserAPIKey.h deleted file mode 100644 index 2cdd82b2a..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMUserAPIKey.h +++ /dev/null @@ -1,43 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// UserAPIKey model for APIKeys recevied from the server. -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMUserAPIKey : NSObject - -/// Indicates if the API key is disabled or not -@property (nonatomic, readonly) BOOL disabled; - -/// The name of the key. -@property (nonatomic, readonly) NSString *name; - -/// The actual key. Will only be included in -/// the response when an API key is first created. -@property (nonatomic, readonly, nullable) NSString *key; - -/// The ObjectId of the API key -@property (nonatomic, readonly) RLMObjectId *objectId NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMValue.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMValue.h deleted file mode 100644 index ac1f10ee4..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/RLMValue.h +++ /dev/null @@ -1,97 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import -#import -#import -#import -#import - -#pragma mark RLMValue - -/** - RLMValue is a property type which represents a polymorphic Realm value. This is similar to the usage of - `AnyObject` / `Any` in Swift. -``` - // A property on `MyObject` - @property (nonatomic) id myAnyValue; - - // A property on `AnotherObject` - @property (nonatomic) id myAnyValue; - - MyObject *myObject = [MyObject createInRealm:realm withValue:@[]]; - myObject.myAnyValue = @1234; // underlying type is NSNumber. - myObject.myAnyValue = @"hello"; // underlying type is NSString. - AnotherObject *anotherObject = [AnotherObject createInRealm:realm withValue:@[]]; - myObject.myAnyValue = anotherObject; // underlying type is RLMObject. -``` - The following types conform to RLMValue: - - `NSData` - `NSDate` - `NSNull` - `NSNumber` - `NSUUID` - `NSString` - `RLMObject - `RLMObjectId` - `RLMDecimal128` - */ -@protocol RLMValue - -/// Describes the type of property stored. -@property (readonly) RLMPropertyType rlm_valueType; - -@end - -/// :nodoc: -@interface NSNull (RLMValue) -@end - -/// :nodoc: -@interface NSNumber (RLMValue) -@end - -/// :nodoc: -@interface NSString (RLMValue) -@end - -/// :nodoc: -@interface NSData (RLMValue) -@end - -/// :nodoc: -@interface NSDate (RLMValue) -@end - -/// :nodoc: -@interface NSUUID (RLMValue) -@end - -/// :nodoc: -@interface RLMDecimal128 (RLMValue) -@end - -/// :nodoc: -@interface RLMObjectBase (RLMValue) -@end - -/// :nodoc: -@interface RLMObjectId (RLMValue) -@end diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/Realm.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/Realm.h deleted file mode 100644 index 245596393..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Headers/Realm.h +++ /dev/null @@ -1,63 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import - -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Info.plist b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Info.plist deleted file mode 100644 index 8f9a11cd1..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Info.plist and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/LICENSE b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/LICENSE deleted file mode 100644 index 66a27ec5f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/LICENSE +++ /dev/null @@ -1,177 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Modules/module.modulemap b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Modules/module.modulemap deleted file mode 100644 index 519ddc20b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Modules/module.modulemap +++ /dev/null @@ -1,88 +0,0 @@ -framework module Realm { - export Foundation - - umbrella header "Realm.h" - - header "RLMArray.h" - header "RLMAsymmetricObject.h" - header "RLMDecimal128.h" - header "RLMDictionary.h" - header "RLMEmbeddedObject.h" - header "RLMLogger.h" - header "RLMMigration.h" - header "RLMObject.h" - header "RLMObjectId.h" - header "RLMObjectSchema.h" - header "RLMProperty.h" - header "RLMProviderClient.h" - header "RLMRealm+Sync.h" - header "RLMRealm.h" - header "RLMRealmConfiguration.h" - header "RLMResults.h" - header "RLMSchema.h" - header "RLMSectionedResults.h" - header "RLMSet.h" - header "RLMValue.h" - - header "RLMApp.h" - header "RLMCredentials.h" - header "RLMNetworkTransport.h" - header "RLMPushClient.h" - header "RLMRealm+Sync.h" - header "RLMSyncConfiguration.h" - header "RLMSyncManager.h" - header "RLMSyncSession.h" - header "RLMUser.h" - header "RLMUserAPIKey.h" - header "RLMAPIKeyAuth.h" - header "RLMEmailPasswordAuth.h" - header "NSError+RLMSync.h" - header "RLMBSON.h" - header "RLMMongoClient.h" - header "RLMMongoDatabase.h" - header "RLMMongoCollection.h" - header "RLMUpdateResult.h" - header "RLMFindOptions.h" - header "RLMFindOneAndModifyOptions.h" - header "RLMSyncSubscription.h" - - explicit module Private { - header "RLMAccessor.h" - header "RLMApp_Private.h" - header "RLMArray_Private.h" - header "RLMAsyncTask_Private.h" - header "RLMCollection_Private.h" - header "RLMDictionary_Private.h" - header "RLMLogger_Private.h" - header "RLMEvent.h" - header "RLMMongoCollection_Private.h" - header "RLMObjectBase_Dynamic.h" - header "RLMObjectBase_Private.h" - header "RLMObjectSchema_Private.h" - header "RLMObjectStore.h" - header "RLMObject_Private.h" - header "RLMProperty_Private.h" - header "RLMRealmConfiguration_Private.h" - header "RLMRealm_Private.h" - header "RLMResults_Private.h" - header "RLMScheduler.h" - header "RLMSchema_Private.h" - header "RLMSectionedResults.h" - header "RLMSet_Private.h" - header "RLMSwiftCollectionBase.h" - header "RLMSwiftProperty.h" - header "RLMSwiftValueStorage.h" - header "RLMSyncConfiguration_Private.h" - header "RLMSyncSubscription_Private.h" - header "RLMUser_Private.h" - } - - explicit module Dynamic { - header "RLMRealm_Dynamic.h" - header "RLMObjectBase_Dynamic.h" - } - - explicit module Swift { - header "RLMSwiftObject.h" - } -} diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMAccessor.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMAccessor.h deleted file mode 100644 index db915ca7c..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMAccessor.h +++ /dev/null @@ -1,53 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectSchema, RLMProperty, RLMObjectBase; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -// -// Accessors Class Creation/Caching -// - -// get accessor classes for an object class - generates classes if not cached -Class RLMManagedAccessorClassForObjectClass(Class objectClass, RLMObjectSchema *schema, const char *name); -Class RLMUnmanagedAccessorClassForObjectClass(Class objectClass, RLMObjectSchema *schema); - -// -// Dynamic getters/setters -// -FOUNDATION_EXTERN void RLMDynamicValidatedSet(RLMObjectBase *obj, NSString *propName, id __nullable val); -FOUNDATION_EXTERN id __nullable RLMDynamicGet(RLMObjectBase *obj, RLMProperty *prop); -FOUNDATION_EXTERN id __nullable RLMDynamicGetByName(RLMObjectBase *obj, NSString *propName); - -// by property/column -void RLMDynamicSet(RLMObjectBase *obj, RLMProperty *prop, id val); - -// -// Class modification -// - -// Replace className method for the given class -void RLMReplaceClassNameMethod(Class accessorClass, NSString *className); - -// Replace sharedSchema method for the given class -void RLMReplaceSharedSchemaMethod(Class accessorClass, RLMObjectSchema * __nullable schema); - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMApp_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMApp_Private.h deleted file mode 100644 index 5da5c3c7a..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMApp_Private.h +++ /dev/null @@ -1,50 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// Observer block for app notifications. -typedef void(^RLMAppNotificationBlock)(RLMApp *); - -/// Token that identifies an observer. Unsubscribes when deconstructed to -/// avoid dangling observers, therefore this must be retained to hold -/// onto a subscription. -@interface RLMAppSubscriptionToken : NSObject -- (void)unsubscribe; -@end - -@interface RLMApp () -/// Returns all currently cached Apps -+ (NSArray *)allApps; -/// Subscribe to notifications for this RLMApp. -- (RLMAppSubscriptionToken *)subscribe:(RLMAppNotificationBlock)block; - -+ (instancetype)appWithConfiguration:(RLMAppConfiguration *)configuration; - -+ (void)resetAppCache; -@end - -@interface RLMAppConfiguration () -@property (nonatomic) NSString *appId; -@property (nonatomic) BOOL encryptMetadata; -@property (nonatomic) NSURL *rootDirectory; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMArray_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMArray_Private.h deleted file mode 100644 index 1a37f010e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMArray_Private.h +++ /dev/null @@ -1,44 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -@class RLMObjectBase, RLMProperty; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMArray () -- (instancetype)initWithObjectClassName:(NSString *)objectClassName; -- (instancetype)initWithObjectType:(RLMPropertyType)type optional:(BOOL)optional; -- (NSString *)descriptionWithMaxDepth:(NSUInteger)depth; -- (void)setParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -- (void)replaceAllObjectsWithObjects:(NSArray *)objects; -// YES if the property is declared with old property syntax. -@property (nonatomic, readonly) BOOL isLegacyProperty; -// The name of the property which this collection represents -@property (nonatomic, readonly) NSString *propertyKey; -@end - -@interface RLMManagedArray : RLMArray -- (instancetype)initWithParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -@end - -void RLMArrayValidateMatchingObjectType(RLMArray *array, id value); - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMAsyncTask_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMAsyncTask_Private.h deleted file mode 100644 index 3cce89441..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMAsyncTask_Private.h +++ /dev/null @@ -1,71 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import "RLMRealm_Private.h" - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMAsyncOpenTask () -@property (nonatomic, nullable) RLMRealm *localRealm; - -- (instancetype)initWithConfiguration:(RLMRealmConfiguration *)configuration - confinedTo:(RLMScheduler *)confinement - download:(bool)waitForDownloadCompletion - completion:(RLMAsyncOpenRealmCallback)completion -__attribute__((objc_direct)); - -- (instancetype)initWithConfiguration:(RLMRealmConfiguration *)configuration - confinedTo:(RLMScheduler *)confinement - download:(bool)waitForDownloadCompletion; - -- (void)waitWithCompletion:(void (^)(NSError *_Nullable))completion; -- (void)waitForOpen:(RLMAsyncOpenRealmCallback)completion __attribute__((objc_direct)); -@end - -// A cancellable task for waiting for downloads on an already-open Realm. -RLM_SWIFT_SENDABLE -@interface RLMAsyncDownloadTask : NSObject -- (instancetype)initWithRealm:(RLMRealm *)realm; -- (void)cancel; -- (void)waitWithCompletion:(void (^)(NSError *_Nullable))completion; -@end - -// A cancellable task for beginning an async write -RLM_SWIFT_SENDABLE -@interface RLMAsyncWriteTask : NSObject -// Must only be called from within the Actor -- (instancetype)initWithRealm:(RLMRealm *)realm; -- (void)setTransactionId:(RLMAsyncTransactionId)transactionID; -- (void)complete:(bool)cancel; - -// Can be called from any thread -- (void)wait:(void (^)(void))completion; -@end - -typedef void (^RLMAsyncRefreshCompletion)(bool); -// A cancellable task for refreshing a Realm -RLM_SWIFT_SENDABLE -@interface RLMAsyncRefreshTask : NSObject -- (void)complete:(bool)didRefresh; -- (void)wait:(RLMAsyncRefreshCompletion)completion; -+ (RLMAsyncRefreshTask *)completedRefresh; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMBSON_Private.hpp b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMBSON_Private.hpp deleted file mode 100644 index c5cc1a410..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMBSON_Private.hpp +++ /dev/null @@ -1,32 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -namespace realm::bson { -class Bson; -template class IndexedMap; -using BsonDocument = IndexedMap; -} - -realm::bson::Bson RLMConvertRLMBSONToBson(id b); -realm::bson::BsonDocument RLMConvertRLMBSONArrayToBsonDocument(NSArray> *array); -id RLMConvertBsonToRLMBSON(const realm::bson::Bson& b); -id RLMConvertBsonDocumentToRLMBSON(std::optional b); -NSArray> *RLMConvertBsonDocumentToRLMBSONArray(std::optional b); diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMCollection_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMCollection_Private.h deleted file mode 100644 index 7d31bd3f0..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMCollection_Private.h +++ /dev/null @@ -1,42 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@protocol RLMCollectionPrivate; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -NSUInteger RLMUnmanagedFastEnumerate(id collection, NSFastEnumerationState *); -void RLMCollectionSetValueForKey(id collection, NSString *key, id _Nullable value); -FOUNDATION_EXTERN NSString *RLMDescriptionWithMaxDepth(NSString *name, id collection, NSUInteger depth); -FOUNDATION_EXTERN void RLMAssignToCollection(id collection, id value); -FOUNDATION_EXTERN void RLMSetSwiftBridgeCallback(id _Nullable (*_Nonnull)(id)); - -FOUNDATION_EXTERN -RLMNotificationToken *RLMAddNotificationBlock(id collection, id block, - NSArray *_Nullable keyPaths, - dispatch_queue_t _Nullable queue); - -typedef RLM_CLOSED_ENUM(int32_t, RLMCollectionType) { - RLMCollectionTypeArray = 0, - RLMCollectionTypeSet = 1, - RLMCollectionTypeDictionary = 2 -}; - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMDictionary_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMDictionary_Private.h deleted file mode 100644 index 37ff740c7..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMDictionary_Private.h +++ /dev/null @@ -1,46 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectBase, RLMProperty; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMDictionary () -- (instancetype)initWithObjectClassName:(NSString *)objectClassName keyType:(RLMPropertyType)keyType; -- (instancetype)initWithObjectType:(RLMPropertyType)type optional:(BOOL)optional keyType:(RLMPropertyType)keyType; -- (NSString *)descriptionWithMaxDepth:(NSUInteger)depth; -- (void)setParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -// YES if the property is declared with old property syntax. -@property (nonatomic, readonly) BOOL isLegacyProperty; -// The name of the property which this collection represents -@property (nonatomic, readonly) NSString *propertyKey; -@end - -@interface RLMManagedDictionary : RLMDictionary -- (instancetype)initWithParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -@end - -FOUNDATION_EXTERN NSString *RLMDictionaryDescriptionWithMaxDepth(NSString *name, - RLMDictionary *dictionary, - NSUInteger depth); -id RLMDictionaryKey(RLMDictionary *dictionary, id key) RLM_HIDDEN; -id RLMDictionaryValue(RLMDictionary *dictionary, id value) RLM_HIDDEN; - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMEvent.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMEvent.h deleted file mode 100644 index 9a6acb1a6..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMEvent.h +++ /dev/null @@ -1,64 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2022 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#ifdef __cplusplus -#include - -namespace realm { -struct AuditConfig; -} -#endif - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMRealm, RLMUser, RLMRealmConfiguration; -typedef RLM_CLOSED_ENUM(NSUInteger, RLMSyncLogLevel); - -struct RLMEventContext; -typedef void (^RLMEventCompletion)(NSError *_Nullable); - -FOUNDATION_EXTERN struct RLMEventContext *_Nullable RLMEventGetContext(RLMRealm *realm); -FOUNDATION_EXTERN uint64_t RLMEventBeginScope(struct RLMEventContext *context, NSString *activity); -FOUNDATION_EXTERN void RLMEventCommitScope(struct RLMEventContext *context, uint64_t scope_id, - RLMEventCompletion _Nullable completion); -FOUNDATION_EXTERN void RLMEventCancelScope(struct RLMEventContext *context, uint64_t scope_id); -FOUNDATION_EXTERN bool RLMEventIsActive(struct RLMEventContext *context, uint64_t scope_id); -FOUNDATION_EXTERN void RLMEventRecordEvent(struct RLMEventContext *context, NSString *activity, - NSString *_Nullable event, NSString *_Nullable data, - RLMEventCompletion _Nullable completion); -FOUNDATION_EXTERN void RLMEventUpdateMetadata(struct RLMEventContext *context, - NSDictionary *newMetadata); - -@interface RLMEventConfiguration : NSObject -@property (nonatomic) NSString *partitionPrefix; -@property (nonatomic, nullable) RLMUser *syncUser; -@property (nonatomic, nullable) NSDictionary *metadata; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" -@property (nonatomic, nullable) void (^logger)(RLMSyncLogLevel, NSString *); -#pragma clang diagnostic pop -@property (nonatomic, nullable) RLM_SWIFT_SENDABLE void (^errorHandler)(NSError *); - -#ifdef __cplusplus -- (std::shared_ptr)auditConfigWithRealmConfiguration:(RLMRealmConfiguration *)realmConfig; -#endif -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMLogger_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMLogger_Private.h deleted file mode 100644 index 08f8c591e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMLogger_Private.h +++ /dev/null @@ -1,36 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMLogger() - -/** - Log a message to the supplied level. - - @param logLevel The log level for the message. - @param message The message to log. - */ -- (void)logWithLevel:(RLMLogLevel)logLevel message:(NSString *)message, ... NS_SWIFT_UNAVAILABLE(""); -- (void)logLevel:(RLMLogLevel)logLevel message:(NSString *)message; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMMigration_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMMigration_Private.h deleted file mode 100644 index 393f41184..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMMigration_Private.h +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import -#import - -namespace realm { - class Schema; -} - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMMigration () - -@property (nonatomic, strong) RLMRealm *oldRealm; -@property (nonatomic, strong) RLMRealm *realm; - -- (instancetype)initWithRealm:(RLMRealm *)realm oldRealm:(RLMRealm *)oldRealm schema:(realm::Schema &)schema; - -- (void)execute:(RLMMigrationBlock)block objectClass:(_Nullable Class)cls; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMMongoCollection_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMMongoCollection_Private.h deleted file mode 100644 index 77bbf9752..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMMongoCollection_Private.h +++ /dev/null @@ -1,37 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@class RLMUser; - -@interface RLMMongoCollection () -- (instancetype)initWithUser:(RLMUser *)user - serviceName:(NSString *)serviceName - databaseName:(NSString *)databaseName - collectionName:(NSString *)collectionName; - -- (RLMChangeStream *)watchWithMatchFilter:(nullable id)matchFilter - idFilter:(nullable id)idFilter - delegate:(id)delegate - scheduler:(void (^)(dispatch_block_t))scheduler; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObjectBase_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObjectBase_Private.h deleted file mode 100644 index af547b17e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObjectBase_Private.h +++ /dev/null @@ -1,34 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2017 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMArray; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -// RLMObjectBase private -@interface RLMObjectBase () -@property (nonatomic, nullable) NSMutableArray *lastAccessedNames; - -+ (void)initializeLinkedObjectSchemas; -+ (bool)isEmbedded; -+ (bool)isAsymmetric; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObjectSchema_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObjectSchema_Private.h deleted file mode 100644 index 08855a82b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObjectSchema_Private.h +++ /dev/null @@ -1,75 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -// RLMObjectSchema private -@interface RLMObjectSchema () { -@public - bool _isSwiftClass; -} - -/// The object type name reported to the object store and core. -@property (nonatomic, readonly) NSString *objectName; - -// writable redeclaration -@property (nonatomic, readwrite, copy) NSArray *properties; -@property (nonatomic, readwrite, assign) bool isSwiftClass; -@property (nonatomic, readwrite, assign) BOOL isEmbedded; -@property (nonatomic, readwrite, assign) BOOL isAsymmetric; - -// class used for this object schema -@property (nonatomic, readwrite, assign) Class objectClass; -@property (nonatomic, readwrite, assign) Class accessorClass; -@property (nonatomic, readwrite, assign) Class unmanagedClass; - -@property (nonatomic, readwrite, assign) bool hasCustomEventSerialization; - -@property (nonatomic, readwrite, nullable) RLMProperty *primaryKeyProperty; - -@property (nonatomic, copy) NSArray *computedProperties; -@property (nonatomic, readonly, nullable) NSArray *swiftGenericProperties; - -// returns a cached or new schema for a given object class -+ (instancetype)schemaForObjectClass:(Class)objectClass; -@end - -@interface RLMObjectSchema (Dynamic) -/** - This method is useful only in specialized circumstances, for example, when accessing objects - in a Realm produced externally. If you are simply building an app on Realm, it is not recommended - to use this method as an [RLMObjectSchema](RLMObjectSchema) is generated automatically for every [RLMObject](RLMObject) subclass. - - Initialize an RLMObjectSchema with classname, objectClass, and an array of properties - - @warning This method is useful only in specialized circumstances. - - @param objectClassName The name of the class used to refer to objects of this type. - @param objectClass The Objective-C class used when creating instances of this type. - @param properties An array of RLMProperty instances describing the managed properties for this type. - - @return An initialized instance of RLMObjectSchema. - */ -- (instancetype)initWithClassName:(NSString *)objectClassName objectClass:(Class)objectClass properties:(NSArray *)properties; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObjectStore.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObjectStore.h deleted file mode 100644 index 6045f1e8e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObjectStore.h +++ /dev/null @@ -1,98 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#ifdef __cplusplus -extern "C" { -#endif - -@class RLMRealm, RLMSchema, RLMObjectBase, RLMResults, RLMProperty; - -typedef NS_ENUM(NSUInteger, RLMUpdatePolicy) { - RLMUpdatePolicyError = 1, - RLMUpdatePolicyUpdateChanged = 3, - RLMUpdatePolicyUpdateAll = 2, -}; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -void RLMVerifyHasPrimaryKey(Class cls); - -void RLMVerifyInWriteTransaction(RLMRealm *const realm); - -// -// Adding, Removing, Getting Objects -// - -// add an object to the given realm -void RLMAddObjectToRealm(RLMObjectBase *object, RLMRealm *realm, RLMUpdatePolicy); - -// delete an object from its realm -void RLMDeleteObjectFromRealm(RLMObjectBase *object, RLMRealm *realm); - -// deletes all objects from a realm -void RLMDeleteAllObjectsFromRealm(RLMRealm *realm); - -// get objects of a given class -RLMResults *RLMGetObjects(RLMRealm *realm, NSString *objectClassName, NSPredicate * _Nullable predicate) -NS_RETURNS_RETAINED; - -// get an object with the given primary key -id _Nullable RLMGetObject(RLMRealm *realm, NSString *objectClassName, id _Nullable key) NS_RETURNS_RETAINED; - -// create object from array or dictionary -RLMObjectBase *RLMCreateObjectInRealmWithValue(RLMRealm *realm, NSString *className, - id _Nullable value, RLMUpdatePolicy updatePolicy) -NS_RETURNS_RETAINED; - -// creates an asymmetric object and doesn't return -void RLMCreateAsymmetricObjectInRealm(RLMRealm *realm, NSString *className, id value); - -// -// Accessor Creation -// - - -// Perform the per-property accessor initialization for a managed RealmSwiftObject -// promotingExisting should be true if the object was previously used as an -// unmanaged object, and false if it is a newly created object. -void RLMInitializeSwiftAccessor(RLMObjectBase *object, bool promotingExisting); - -#ifdef __cplusplus -} - -namespace realm { - class Obj; - class Table; - struct ColKey; - struct ObjLink; -} -class RLMClassInfo; - -// get an object with a given table & object key -RLMObjectBase *RLMObjectFromObjLink(RLMRealm *realm, - realm::ObjLink&& objLink, - bool parentIsSwiftObject) NS_RETURNS_RETAINED; - -// Create accessors -RLMObjectBase *RLMCreateObjectAccessor(RLMClassInfo& info, int64_t key) NS_RETURNS_RETAINED; -RLMObjectBase *RLMCreateObjectAccessor(RLMClassInfo& info, const realm::Obj& obj) NS_RETURNS_RETAINED; -#endif - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObject_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObject_Private.h deleted file mode 100644 index 8ccdbf576..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObject_Private.h +++ /dev/null @@ -1,110 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMProperty, RLMArray, RLMSchema; -typedef NS_ENUM(int32_t, RLMPropertyType); - -FOUNDATION_EXTERN void RLMInitializeWithValue(RLMObjectBase *, id, RLMSchema *); - -typedef void (^RLMObjectNotificationCallback)(RLMObjectBase *_Nullable object, - NSArray *_Nullable propertyNames, - NSArray *_Nullable oldValues, - NSArray *_Nullable newValues, - NSError *_Nullable error); - -// RLMObject accessor and read/write realm -@interface RLMObjectBase () { -@public - RLMRealm *_realm; - __unsafe_unretained RLMObjectSchema *_objectSchema; -} - -// shared schema for this class -+ (nullable RLMObjectSchema *)sharedSchema; - -+ (nullable NSArray *)_getProperties; -+ (bool)_realmIgnoreClass; - -// This enables to override the propertiesMapping in Swift, it is not to be used in Objective-C API. -+ (NSDictionary *)propertiesMapping; -@end - -@interface RLMDynamicObject : RLMObject - -@end - -// Calls valueForKey: and re-raises NSUndefinedKeyExceptions -FOUNDATION_EXTERN id _Nullable RLMValidatedValueForProperty(id object, NSString *key, NSString *className); - -// Compare two RLObjectBases -FOUNDATION_EXTERN BOOL RLMObjectBaseAreEqual(RLMObjectBase * _Nullable o1, RLMObjectBase * _Nullable o2); - -FOUNDATION_EXTERN RLMNotificationToken *RLMObjectBaseAddNotificationBlock(RLMObjectBase *obj, - NSArray *_Nullable keyPaths, - dispatch_queue_t _Nullable queue, - RLMObjectNotificationCallback block); - -RLMNotificationToken *RLMObjectAddNotificationBlock(RLMObjectBase *obj, - RLMObjectChangeBlock block, - NSArray *_Nullable keyPaths, - dispatch_queue_t _Nullable queue); - -// Returns whether the class is a descendent of RLMObjectBase -FOUNDATION_EXTERN BOOL RLMIsObjectOrSubclass(Class klass); - -// Returns whether the class is an indirect descendant of RLMObjectBase -FOUNDATION_EXTERN BOOL RLMIsObjectSubclass(Class klass); - -FOUNDATION_EXTERN const NSUInteger RLMDescriptionMaxDepth; - -FOUNDATION_EXTERN id RLMObjectFreeze(RLMObjectBase *obj) NS_RETURNS_RETAINED; - -FOUNDATION_EXTERN id RLMObjectThaw(RLMObjectBase *obj); - -// Gets an object identifier suitable for use with Combine. This value may -// change when an unmanaged object is added to the Realm. -FOUNDATION_EXTERN uint64_t RLMObjectBaseGetCombineId(RLMObjectBase *); - -// An accessor object which is used to interact with Swift properties from obj-c -@interface RLMManagedPropertyAccessor : NSObject -// Perform any initialization required for KVO on a *unmanaged* object -+ (void)observe:(RLMProperty *)property on:(RLMObjectBase *)parent; -// Initialize the given property on a *managed* object which previous was unmanaged -+ (void)promote:(RLMProperty *)property on:(RLMObjectBase *)parent; -// Initialize the given property on a newly created *managed* object -+ (void)initialize:(RLMProperty *)property on:(RLMObjectBase *)parent; -// Read the value of the property, on either kind of object -+ (id)get:(RLMProperty *)property on:(RLMObjectBase *)parent; -// Set the property to the given value, on either kind of object -+ (void)set:(RLMProperty *)property on:(RLMObjectBase *)parent to:(id)value; -@end - -@interface RLMObjectNotificationToken : RLMNotificationToken -- (void)observe:(RLMObjectBase *)obj - keyPaths:(nullable NSArray *)keyPaths - block:(RLMObjectNotificationCallback)block; -- (void)registrationComplete:(void (^)(void))completion; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMProperty_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMProperty_Private.h deleted file mode 100644 index 6a87ced63..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMProperty_Private.h +++ /dev/null @@ -1,139 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -@class RLMObjectBase; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -BOOL RLMPropertyTypeIsComputed(RLMPropertyType propertyType); -FOUNDATION_EXTERN void RLMValidateSwiftPropertyName(NSString *name); - -// Translate an rlmtype to a string representation -static inline NSString *RLMTypeToString(RLMPropertyType type) { - switch (type) { - case RLMPropertyTypeString: - return @"string"; - case RLMPropertyTypeInt: - return @"int"; - case RLMPropertyTypeBool: - return @"bool"; - case RLMPropertyTypeDate: - return @"date"; - case RLMPropertyTypeData: - return @"data"; - case RLMPropertyTypeDouble: - return @"double"; - case RLMPropertyTypeFloat: - return @"float"; - case RLMPropertyTypeAny: - return @"mixed"; - case RLMPropertyTypeObject: - return @"object"; - case RLMPropertyTypeLinkingObjects: - return @"linking objects"; - case RLMPropertyTypeDecimal128: - return @"decimal128"; - case RLMPropertyTypeObjectId: - return @"object id"; - case RLMPropertyTypeUUID: - return @"uuid"; - } - return @"Unknown"; -} - -// private property interface -@interface RLMProperty () { -@public - RLMPropertyType _type; -} - -- (instancetype)initWithName:(NSString *)name - indexed:(BOOL)indexed - linkPropertyDescriptor:(nullable RLMPropertyDescriptor *)linkPropertyDescriptor - property:(objc_property_t)property; - -- (instancetype)initSwiftPropertyWithName:(NSString *)name - indexed:(BOOL)indexed - linkPropertyDescriptor:(nullable RLMPropertyDescriptor *)linkPropertyDescriptor - property:(objc_property_t)property - instance:(RLMObjectBase *)objectInstance; - -- (void)updateAccessors; - -// private setters -@property (nonatomic, readwrite) NSString *name; -@property (nonatomic, readwrite, assign) RLMPropertyType type; -@property (nonatomic, readwrite) BOOL indexed; -@property (nonatomic, readwrite) BOOL optional; -@property (nonatomic, readwrite) BOOL array; -@property (nonatomic, readwrite) BOOL set; -@property (nonatomic, readwrite) BOOL dictionary; -@property (nonatomic, copy, nullable) NSString *objectClassName; -@property (nonatomic, copy, nullable) NSString *linkOriginPropertyName; - -// private properties -@property (nonatomic, readwrite, nullable) NSString *columnName; -@property (nonatomic, assign) NSUInteger index; -@property (nonatomic, assign) BOOL isPrimary; -@property (nonatomic, assign) BOOL isLegacy; -@property (nonatomic, assign) ptrdiff_t swiftIvar; -@property (nonatomic, assign, nullable) Class swiftAccessor; -@property (nonatomic, readwrite, assign) RLMPropertyType dictionaryKeyType; -@property (nonatomic, readwrite) BOOL customMappingIsOptional; - -// getter and setter names -@property (nonatomic, copy) NSString *getterName; -@property (nonatomic, copy) NSString *setterName; -@property (nonatomic, nullable) SEL getterSel; -@property (nonatomic, nullable) SEL setterSel; - -- (RLMProperty *)copyWithNewName:(NSString *)name; -- (NSString *)typeName; - -@end - -@interface RLMProperty (Dynamic) -/** - This method is useful only in specialized circumstances, for example, in conjunction with - +[RLMObjectSchema initWithClassName:objectClass:properties:]. If you are simply building an - app on Realm, it is not recommended to use this method. - - Initialize an RLMProperty - - @warning This method is useful only in specialized circumstances. - - @param name The property name. - @param type The property type. - @param objectClassName The object type used for Object and Array types. - @param linkOriginPropertyName The property name of the origin of a link. Used for linking objects properties. - - @return An initialized instance of RLMProperty. - */ -- (instancetype)initWithName:(NSString *)name - type:(RLMPropertyType)type - objectClassName:(nullable NSString *)objectClassName - linkOriginPropertyName:(nullable NSString *)linkOriginPropertyName - indexed:(BOOL)indexed - optional:(BOOL)optional; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMPushClient_Private.hpp b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMPushClient_Private.hpp deleted file mode 100644 index 44304c9c3..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMPushClient_Private.hpp +++ /dev/null @@ -1,28 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import "RLMPushClient.h" - -namespace realm::app { -class PushClient; -} - -RLM_DIRECT_MEMBERS -@interface RLMPushClient () -- (instancetype)initWithPushClient:(realm::app::PushClient&&)pushClient; -@end diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMRealmConfiguration_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMRealmConfiguration_Private.h deleted file mode 100644 index 12b09676d..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMRealmConfiguration_Private.h +++ /dev/null @@ -1,52 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2015 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMSchema, RLMEventConfiguration; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMRealmConfiguration () - -@property (nonatomic, readwrite) bool cache; -@property (nonatomic, readwrite) bool dynamic; -@property (nonatomic, readwrite) bool disableFormatUpgrade; -@property (nonatomic, copy, nullable) RLMSchema *customSchema; -@property (nonatomic, copy) NSString *pathOnDisk; -@property (nonatomic, retain, nullable) RLMEventConfiguration *eventConfiguration; -@property (nonatomic, nullable) Class migrationObjectClass; -@property (nonatomic) bool disableAutomaticChangeNotifications; - -// Flexible Sync -@property (nonatomic, readwrite, nullable) RLMFlexibleSyncInitialSubscriptionsBlock initialSubscriptions; -@property (nonatomic, readwrite) BOOL rerunOnOpen; - -// Get the default configuration without copying it -+ (RLMRealmConfiguration *)rawDefaultConfiguration; - -+ (void)resetRealmConfigurationState; - -- (void)setCustomSchemaWithoutCopying:(nullable RLMSchema *)schema; -@end - -// Get a path in the platform-appropriate documents directory with the given filename -FOUNDATION_EXTERN NSString *RLMRealmPathForFile(NSString *fileName); -FOUNDATION_EXTERN NSString *RLMRealmPathForFileAndBundleIdentifier(NSString *fileName, NSString *mainBundleIdentifier); - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMRealm_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMRealm_Private.h deleted file mode 100644 index 95841491f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMRealm_Private.h +++ /dev/null @@ -1,94 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMFastEnumerator, RLMScheduler, RLMAsyncRefreshTask, RLMAsyncWriteTask; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -// Disable syncing files to disk. Cannot be re-enabled. Use only for tests. -FOUNDATION_EXTERN void RLMDisableSyncToDisk(void); -// Set whether the skip backup attribute should be set on temporary files. -FOUNDATION_EXTERN void RLMSetSkipBackupAttribute(bool value); - -FOUNDATION_EXTERN NSData * _Nullable RLMRealmValidatedEncryptionKey(NSData *key); - -// Set the queue used for async open. For testing purposes only. -FOUNDATION_EXTERN void RLMSetAsyncOpenQueue(dispatch_queue_t queue); - -// Translate an in-flight exception resulting from an operation on a SharedGroup to -// an NSError or NSException (if error is nil) -void RLMRealmTranslateException(NSError **error); - -// Block until the Realm at the given path is closed. -FOUNDATION_EXTERN void RLMWaitForRealmToClose(NSString *path); -BOOL RLMIsRealmCachedAtPath(NSString *path); - -// Register a block to be called from the next before_notify() invocation -FOUNDATION_EXTERN void RLMAddBeforeNotifyBlock(RLMRealm *realm, dispatch_block_t block); - -// Test hook to run the async notifiers for a Realm which has the background thread disabled -FOUNDATION_EXTERN void RLMRunAsyncNotifiers(NSString *path); - -// Get the cached Realm for the given configuration and scheduler, if any -FOUNDATION_EXTERN RLMRealm *_Nullable RLMGetCachedRealm(RLMRealmConfiguration *, RLMScheduler *) NS_RETURNS_RETAINED; -// Get a cached Realm for the given configuration and any scheduler. The returned -// Realm is not confined to the current thread, so very few operations are safe -// to perform on it -FOUNDATION_EXTERN RLMRealm *_Nullable RLMGetAnyCachedRealm(RLMRealmConfiguration *) NS_RETURNS_RETAINED; - -// Scheduler an async refresh for the given Realm -FOUNDATION_EXTERN RLMAsyncRefreshTask *_Nullable RLMRealmRefreshAsync(RLMRealm *rlmRealm) NS_RETURNS_RETAINED; - -// RLMRealm private members -@interface RLMRealm () -@property (nonatomic, readonly) BOOL dynamic; -@property (nonatomic, readwrite) RLMSchema *schema; -@property (nonatomic, readonly, nullable) id actor; -@property (nonatomic, readonly) bool isFlexibleSync; - -+ (void)resetRealmState; - -- (void)registerEnumerator:(RLMFastEnumerator *)enumerator; -- (void)unregisterEnumerator:(RLMFastEnumerator *)enumerator; -- (void)detachAllEnumerators; - -- (void)sendNotifications:(RLMNotification)notification; -- (void)verifyThread; -- (void)verifyNotificationsAreSupported:(bool)isCollection; - -- (RLMRealm *)frozenCopy NS_RETURNS_RETAINED; - -+ (nullable instancetype)realmWithConfiguration:(RLMRealmConfiguration *)configuration - confinedTo:(RLMScheduler *)options - error:(NSError **)error; - -- (RLMAsyncWriteTask *)beginAsyncWrite NS_RETURNS_RETAINED; -- (void)commitAsyncWriteWithGrouping:(bool)allowGrouping - completion:(void(^)(NSError *_Nullable))completion; -@end - -@interface RLMPinnedRealm : NSObject -@property (nonatomic, readonly) RLMRealmConfiguration *configuration; - -- (instancetype)initWithRealm:(RLMRealm *)realm; -- (void)unpin; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMResults_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMResults_Private.h deleted file mode 100644 index c7e29bebb..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMResults_Private.h +++ /dev/null @@ -1,33 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectSchema; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMResults () -@property (nonatomic, readonly, getter=isAttached) BOOL attached; - -+ (instancetype)emptyDetachedResults; -- (RLMResults *)snapshot; - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMScheduler.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMScheduler.h deleted file mode 100644 index 3c1b9874b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMScheduler.h +++ /dev/null @@ -1,63 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#ifdef __cplusplus -#include -namespace realm::util { -class Scheduler; -} -#endif - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -// A serial work queue of some sort which represents a thread-confinement context -// of some sort which blocks can be invoked inside. Realms are confined to a -// scheduler, which can be a thread (actually a run loop), a dispatch queue, or -// an actor. The scheduler ensures that the Realm is only used on one thread at -// a time, and allows us to dispatch work to the thread where we can access the -// Realm safely. -RLM_SWIFT_SENDABLE // is immutable -@interface RLMScheduler : NSObject -+ (RLMScheduler *)mainRunLoop __attribute__((objc_direct)); -+ (RLMScheduler *)currentRunLoop __attribute__((objc_direct)); -// A scheduler for the given queue if it's non-nil, and currentRunLoop otherwise -+ (RLMScheduler *)dispatchQueue:(nullable dispatch_queue_t)queue; -+ (RLMScheduler *)actor:(id)actor invoke:(void (^)(dispatch_block_t))invoke - verify:(void (^)(void))verify; - -// Invoke the block on this scheduler. Currently not actually implement for run -// loop schedulers. -- (void)invoke:(dispatch_block_t)block; - -// Cache key for this scheduler suitable for use with NSMapTable. Only valid -// when called from the current scheduler. -- (void *)cacheKey; - -- (nullable id)actor; - -#ifdef __cplusplus -// The object store Scheduler corresponding to this scheduler -- (std::shared_ptr)osScheduler; -#endif -@end - -FOUNDATION_EXTERN void RLMSetMainActor(id actor); - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSchema_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSchema_Private.h deleted file mode 100644 index f4f63c9f8..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSchema_Private.h +++ /dev/null @@ -1,58 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@class RLMRealm; - -// -// RLMSchema private interface -// -@interface RLMSchema () - -/** - Returns an `RLMSchema` containing only the given `RLMObject` subclasses. - - @param classes The classes to be included in the schema. - - @return An `RLMSchema` containing only the given classes. - */ -+ (instancetype)schemaWithObjectClasses:(NSArray *)classes; - -@property (nonatomic, readwrite, copy) NSArray *objectSchema; - -// schema based on runtime objects -+ (instancetype)sharedSchema; - -// schema based upon all currently registered object classes -+ (instancetype)partialSharedSchema; - -// private schema based upon all currently registered object classes. -// includes classes that are excluded from the default schema. -+ (instancetype)partialPrivateSharedSchema; - -// class for string -+ (nullable Class)classForString:(NSString *)className; - -+ (nullable RLMObjectSchema *)sharedSchemaForClass:(Class)cls; - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSet_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSet_Private.h deleted file mode 100644 index 1053e0a0f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSet_Private.h +++ /dev/null @@ -1,43 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -@class RLMObjectBase, RLMProperty; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMSet () -- (instancetype)initWithObjectClassName:(NSString *)objectClassName; -- (instancetype)initWithObjectType:(RLMPropertyType)type optional:(BOOL)optional; -- (NSString *)descriptionWithMaxDepth:(NSUInteger)depth; -- (void)setParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -// YES if the property is declared with old property syntax. -@property (nonatomic, readonly) BOOL isLegacyProperty; -// The name of the property which this collection represents -@property (nonatomic, readonly) NSString *propertyKey; -@end - -void RLMSetValidateMatchingObjectType(RLMSet *set, id value); - -@interface RLMManagedSet : RLMSet -- (instancetype)initWithParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSwiftCollectionBase.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSwiftCollectionBase.h deleted file mode 100644 index a4f864282..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSwiftCollectionBase.h +++ /dev/null @@ -1,46 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectBase, RLMResults, RLMProperty, RLMLinkingObjects; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMSwiftCollectionBase : NSProxy -@property (nonatomic, strong) id _rlmCollection; - -- (instancetype)init; -+ (Class)_backingCollectionType; -- (instancetype)initWithCollection:(id)collection; - -- (nullable id)valueForKey:(NSString *)key; -- (nullable id)valueForKeyPath:(NSString *)keyPath; -- (BOOL)isEqual:(nullable id)object; -@end - -@interface RLMLinkingObjectsHandle : NSObject -- (instancetype)initWithObject:(RLMObjectBase *)object property:(RLMProperty *)property; -- (instancetype)initWithLinkingObjects:(RLMResults *)linkingObjects; - -@property (nonatomic, readonly) RLMLinkingObjects *results; -@property (nonatomic, readonly) NSString *_propertyKey; -@property (nonatomic, readonly) BOOL _isLegacyProperty; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSwiftSupport.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSwiftSupport.h deleted file mode 100644 index 530f0edbf..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSwiftSupport.h +++ /dev/null @@ -1,30 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMSwiftSupport : NSObject - -+ (BOOL)isSwiftClassName:(NSString *)className; -+ (NSString *)demangleClassName:(NSString *)className; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSwiftValueStorage.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSwiftValueStorage.h deleted file mode 100644 index ef3efc610..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSwiftValueStorage.h +++ /dev/null @@ -1,53 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectBase, RLMProperty; - -/// This class implements the backing storage for `RealmProperty<>` and `RealmOptional<>`. -/// This class should not be subclassed or used directly. -@interface RLMSwiftValueStorage : NSProxy -- (instancetype)init; -@end -/// Retrieves the value that is stored, or nil if it is empty. -FOUNDATION_EXTERN id _Nullable RLMGetSwiftValueStorage(RLMSwiftValueStorage *); -/// Sets a value on the property this instance represents for an object. -FOUNDATION_EXTERN void RLMSetSwiftValueStorage(RLMSwiftValueStorage *, id _Nullable); - -/// Initialises managed accessors on an instance of `RLMSwiftValueStorage` -/// @param parent The enclosing parent object. -/// @param prop The property which this class represents. -FOUNDATION_EXTERN void RLMInitializeManagedSwiftValueStorage(RLMSwiftValueStorage *, - RLMObjectBase *parent, - RLMProperty *prop); - -/// Initialises unmanaged accessors on an instance of `RLMSwiftValueStorage` -/// @param parent The enclosing parent object. -/// @param prop The property which this class represents. -FOUNDATION_EXTERN void RLMInitializeUnmanagedSwiftValueStorage(RLMSwiftValueStorage *, - RLMObjectBase *parent, - RLMProperty *prop); - -/// Gets the property name for the RealmProperty instance. This is required for tracing the key path on -/// objects that use the legacy property declaration syntax. -FOUNDATION_EXTERN NSString *RLMSwiftValueStorageGetPropertyName(RLMSwiftValueStorage *); - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSyncConfiguration_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSyncConfiguration_Private.h deleted file mode 100644 index 62d0e1f1f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSyncConfiguration_Private.h +++ /dev/null @@ -1,47 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -typedef RLM_CLOSED_ENUM(NSUInteger, RLMSyncStopPolicy) { - RLMSyncStopPolicyImmediately, - RLMSyncStopPolicyLiveIndefinitely, - RLMSyncStopPolicyAfterChangesUploaded, -}; - - -@class RLMSchema; - -@interface RLMSyncConfiguration () - -// Flexible sync -- (instancetype)initWithUser:(RLMUser *)user; -// Partition-based sync -- (instancetype)initWithUser:(RLMUser *)user - partitionValue:(nullable id)partitionValue; - -// Internal-only APIs -@property (nonatomic, readwrite) RLMSyncStopPolicy stopPolicy; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSyncSubscription_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSyncSubscription_Private.h deleted file mode 100644 index dc438a20e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSyncSubscription_Private.h +++ /dev/null @@ -1,70 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -#pragma mark - Subscription - -@interface RLMSyncSubscription () - -@property (nonatomic, readonly) RLMObjectId *identifier; - -@property (nonatomic, readonly) NSString *queryString; - -@property (nonatomic, readonly) NSString *objectClassName; - -@end - -#pragma mark - SubscriptionSet - -@interface RLMSyncSubscriptionEnumerator : NSObject - -@property (nonatomic, readonly) RLMSyncSubscriptionSet *subscriptionSet; - -- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state - count:(NSUInteger)len; - -- (instancetype)initWithSubscriptionSet:(RLMSyncSubscriptionSet *)subscriptionSet; - -@end - -@interface RLMSyncSubscriptionSet () - -@property (readonly) uint64_t version; - -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - subscriptionName:(nullable NSString *)name - predicate:(NSPredicate *)predicate - updateExisting:(BOOL)updateExisting; - -- (void)waitForSynchronizationOnQueue:(nullable dispatch_queue_t)queue - completionBlock:(void(^)(NSError *))completionBlock; - -- (RLMSyncSubscriptionEnumerator *)fastEnumerator; - -NSUInteger RLMFastEnumerate(NSFastEnumerationState *state, - NSUInteger len, - RLMSyncSubscriptionSet *collection); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMUser_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMUser_Private.h deleted file mode 100644 index f62c9a940..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMUser_Private.h +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// Observer block for user notifications. -typedef void(^RLMUserNotificationBlock)(RLMUser *); - -/// Token that identifies an observer. Unsubscribes when deconstructed to -/// avoid dangling observers, therefore this must be retained to hold -/// onto a subscription. -@interface RLMUserSubscriptionToken : NSObject -- (void)unsubscribe; -@end - -@interface RLMUser () -/// Subscribe to notifications for this RLMUser. -- (RLMUserSubscriptionToken *)subscribe:(RLMUserNotificationBlock)block; - -- (void)logOut; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Realm b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Realm deleted file mode 100755 index 04c592cb6..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/Realm and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/_CodeSignature/CodeResources b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/_CodeSignature/CodeResources deleted file mode 100644 index bba304ffe..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/tvos-arm64_x86_64-simulator/Realm.framework/_CodeSignature/CodeResources +++ /dev/null @@ -1,1015 +0,0 @@ - - - - - files - - CHANGELOG.md - - Zv1aE8lgTnRPKTg4+FZa+hYQQNM= - - Headers/NSError+RLMSync.h - - 02q4InRTrAKLrV8lPlx32J0V1Ko= - - Headers/RLMAPIKeyAuth.h - - 1jiv26oYx54zXYdhCKJkfQgUCZ8= - - Headers/RLMApp.h - - Ld28y6nHFgdYCwgko5F6L9mRTCc= - - Headers/RLMArray.h - - SxnXSBzghc13RDA5GoX65htp0Jc= - - Headers/RLMAsymmetricObject.h - - WI4FoMYUXUw5Jgvy2eN4FBgPf3c= - - Headers/RLMAsyncTask.h - - gBGrbdQ+f9PpOJWHbVRh5Zgrcj4= - - Headers/RLMBSON.h - - GxfhbpWdUsi0bAu035zq0wBE47k= - - Headers/RLMCollection.h - - HRgDEwlbCpYK0KE4nKT3aPeVt8Y= - - Headers/RLMConstants.h - - X7tUrKW39pKREt/52svrJ/kN+ZU= - - Headers/RLMCredentials.h - - 5r4wtUdLa9Sk0U2eqOShqRrLI3o= - - Headers/RLMDecimal128.h - - W9LoTzurbOFC6l/vu0W1s6NqP/8= - - Headers/RLMDictionary.h - - J4dcvrLymwvq7wa1sgBJejF2lnk= - - Headers/RLMEmailPasswordAuth.h - - qfpoumflL/1gL/z13dVqmA19PLk= - - Headers/RLMEmbeddedObject.h - - P6AmwHOiZF/Q9/w6LRANmqDu01g= - - Headers/RLMError.h - - f/fmbab1ht8EdLMSS3f0NXW1ejg= - - Headers/RLMFindOneAndModifyOptions.h - - NiYNYX+E6fXAZefMtarr31btYSs= - - Headers/RLMFindOptions.h - - nVYUhdeFVo2/ogMj0swOyCup1LY= - - Headers/RLMLogger.h - - xRxc1g20RrrsSVEhSHPTjV7wUrM= - - Headers/RLMMigration.h - - ek93LcGxSB4AWXYxDtK7lSLIUZA= - - Headers/RLMMongoClient.h - - JRIy+dSIlbOnrRU/zjhrjH/sXTQ= - - Headers/RLMMongoCollection.h - - zKZ75q5wJK1K7basKszSka/XDlE= - - Headers/RLMMongoDatabase.h - - 0+ymiybJvLDiWbH4UgOpF5kK7JA= - - Headers/RLMNetworkTransport.h - - NkHxyI4VoqVug1wJFXOSIPd4/n8= - - Headers/RLMObject.h - - 2XkBjhUx/DUZMHptinJRuCSuN5w= - - Headers/RLMObjectBase.h - - 6+LtdM5Zd9OGUBHLtOy0mNzlGNg= - - Headers/RLMObjectBase_Dynamic.h - - lN/ItPF2L4asyDrzvE9tb2NWeQU= - - Headers/RLMObjectId.h - - FAhiEJMRgGhU/STMYxb6Cat31Ns= - - Headers/RLMObjectSchema.h - - yasl78Lq+PvN6f/sBDQAG9IiiwU= - - Headers/RLMProperty.h - - QyE/WKZTEZokOC4HNpIuGWTo3V8= - - Headers/RLMProviderClient.h - - KI1gAsi16P1iZdUTVEJSXAZF+VQ= - - Headers/RLMPushClient.h - - ZXzPubk1A63/oe83WFy6s80UAdY= - - Headers/RLMRealm+Sync.h - - bRbsIAkomXsV+zAaLltmyzxBMvk= - - Headers/RLMRealm.h - - tXxGw5mHQm9c6gM5XAu3/1zO/F8= - - Headers/RLMRealmConfiguration.h - - tACtbQrCi+eN56JH+gH60N0lXOQ= - - Headers/RLMRealm_Dynamic.h - - 0cVBS7WHOS7nUFs7Zr0DQHRc7I0= - - Headers/RLMResults.h - - OeV5SVo3AWcXxIeYr3YYc/Iu7tw= - - Headers/RLMSchema.h - - iJLLK3FYqubxFLoT7EHwmGOnbGU= - - Headers/RLMSectionedResults.h - - +n3MZjJSPd30hm1WNfqQoj1gx44= - - Headers/RLMSet.h - - wCO5ODFhqKDzuFdZZfmBnsgScdM= - - Headers/RLMSwiftObject.h - - TyJjSFDM4ZAekB3cZKc+Fv89CqU= - - Headers/RLMSwiftProperty.h - - /CqEDrE+WN75hOjEyKoDOFTM5cI= - - Headers/RLMSyncConfiguration.h - - 0U9O9AfTO5SB6TJryUm8di9tn5Y= - - Headers/RLMSyncManager.h - - YkhlSPT2hNZyA//Lf07+5rkaTsc= - - Headers/RLMSyncSession.h - - ENN75q8RC4BNpH67LE7NiUtO08U= - - Headers/RLMSyncSubscription.h - - x1LOw7ekOPIKEzT7r93iFXMpvHo= - - Headers/RLMThreadSafeReference.h - - TFdISOKXlf2bIyLYEAbzQg2nMy0= - - Headers/RLMUpdateResult.h - - Mv08aMtnTA3wP3RetaDB4sHtOGU= - - Headers/RLMUser.h - - j5Zpgb+g0lIwk90bDaauU6Y1Fbk= - - Headers/RLMUserAPIKey.h - - cIVGNVxydkLjfkIoehfmqwwGd0w= - - Headers/RLMValue.h - - PQWyj9ZNWsNAy1kGw6ENnNfTQ7c= - - Headers/Realm.h - - fDREEG2URHEbKjZ2nfKq+7M/7m8= - - Info.plist - - jC4ntFip62i8jcuIoMVm9yp7Z4k= - - LICENSE - - htlQ0eA7QbvmaoSv/b3yVb0Yvsc= - - Modules/module.modulemap - - A28J5rfl2ooZX6nLmKAtWsKyoFg= - - PrivateHeaders/RLMAccessor.h - - khE1Bhu30Ou7L9/AFJKc/IJcRuU= - - PrivateHeaders/RLMApp_Private.h - - fw57ZhMCNGsWCpB/lCMaKqf0gek= - - PrivateHeaders/RLMArray_Private.h - - oA6RhNNa1GlEp9Z1dIc6yAXL91g= - - PrivateHeaders/RLMAsyncTask_Private.h - - ayc2eXD44f0/BptRlmZc+ocrzs8= - - PrivateHeaders/RLMBSON_Private.hpp - - Ku6rvqGFX5xk7aXxX4/93IoUJIw= - - PrivateHeaders/RLMCollection_Private.h - - CjigFgVyD/CQlglvVOv3mgmYhmM= - - PrivateHeaders/RLMDictionary_Private.h - - 9jGJQrUJ13oF7wuVyURhFJvDa48= - - PrivateHeaders/RLMEvent.h - - Z1CXQWPXt3itYLuQPrnDE2DOCIQ= - - PrivateHeaders/RLMLogger_Private.h - - vXtWFbH2FmBySg6psXIsF4xTyVw= - - PrivateHeaders/RLMMigration_Private.h - - Rkv9PVKy4D9WpE91+PF5fG8dqb4= - - PrivateHeaders/RLMMongoCollection_Private.h - - SxxQvypVsEBDtC0poogA7IuabvY= - - PrivateHeaders/RLMObjectBase_Private.h - - PQsL4hvY5WGKrm+ENzb3IzoLFMI= - - PrivateHeaders/RLMObjectSchema_Private.h - - 87hjm4eoCqM0JdgW0yVzYipgCv0= - - PrivateHeaders/RLMObjectStore.h - - LH3NYAHYk37ukx3w36l3VfRkWLY= - - PrivateHeaders/RLMObject_Private.h - - fSysuPyok9rS8jBVWujPT5ZYPkw= - - PrivateHeaders/RLMProperty_Private.h - - YrwESqK7Bp+VJPR2q1unO0HC1n4= - - PrivateHeaders/RLMPushClient_Private.hpp - - VB6WiIHnxZ2GvtGB/Dt8BukU3g8= - - PrivateHeaders/RLMRealmConfiguration_Private.h - - fDc6xRp+/ItxCAWyzEto1dXyZDU= - - PrivateHeaders/RLMRealm_Private.h - - FQ45UlPks0oI4fN23S8KH3+cY4U= - - PrivateHeaders/RLMResults_Private.h - - pYrkP89R066MUPthppAiIF6icJ0= - - PrivateHeaders/RLMScheduler.h - - bmnqRPRwLoqjOIHXTAATSTi2Uzs= - - PrivateHeaders/RLMSchema_Private.h - - W3h50q1OLVJcyk0pNZ6qMcSbW0U= - - PrivateHeaders/RLMSet_Private.h - - 1UAOTMK/IHQOq44rH3GVRul1lT0= - - PrivateHeaders/RLMSwiftCollectionBase.h - - g/qYcSeOq1sDRrlomok4rP7w7gA= - - PrivateHeaders/RLMSwiftSupport.h - - 4T1N9038YMMHtsxSBDLu6RQ+Lpo= - - PrivateHeaders/RLMSwiftValueStorage.h - - yk9OQJHakSFzvm/0GWEw3L/IYdg= - - PrivateHeaders/RLMSyncConfiguration_Private.h - - Uq5Fv8y5c2BeibZeqe/OqOfQumI= - - PrivateHeaders/RLMSyncSubscription_Private.h - - MNGSKmrqPPyhHcOtu/BqSSURYXM= - - PrivateHeaders/RLMUser_Private.h - - j+PpsIBJsBM3k2htqZGM/y4Fw3M= - - - files2 - - CHANGELOG.md - - hash2 - - wt8p9tw4OPVj/LtpO9d+DXFoOnRQ6hRaxf/hS2NxDRg= - - - Headers/NSError+RLMSync.h - - hash2 - - 6nK1lw6vBPSTrCi83gbHTMykzmdmX0MlMrq6LmJk94I= - - - Headers/RLMAPIKeyAuth.h - - hash2 - - FwweqLeo/BZi7cBnkDu+AdBgnukrjAbjicdVQJ3PVV8= - - - Headers/RLMApp.h - - hash2 - - fmHB8oywmfycQqOzXoYB99LpOLE7akGn0ZrJtqviiTs= - - - Headers/RLMArray.h - - hash2 - - KaucaZvTcO+xDUtNo4JYySrZMCq6E8OiSYOMG3/LBxE= - - - Headers/RLMAsymmetricObject.h - - hash2 - - +liD/ke74W4Loa4OKvFBITIRTkZRZbItMxN6R4eU7wY= - - - Headers/RLMAsyncTask.h - - hash2 - - iyHi4LWQgTu2yYDS23OZ1wfdZt3ouoY5VoI0aEsHOm0= - - - Headers/RLMBSON.h - - hash2 - - W+5lc5SCRmNbVF2Pu9Zd2v46R+WALQ7xoNCOYC1Swnw= - - - Headers/RLMCollection.h - - hash2 - - womyBrMRt2s1UKKkPo++KwOv6DtP6q48hcBi1jfM2hI= - - - Headers/RLMConstants.h - - hash2 - - QntrtgpnRkkfsRAPt4SY8+3rscdQDbqztCyWdLS0vsU= - - - Headers/RLMCredentials.h - - hash2 - - ObUBKMWeTU0zI7Q4Ts9H5trRs4y4T3bCUY808oTm0bY= - - - Headers/RLMDecimal128.h - - hash2 - - Ubfmc9QWzsK+AcqbQRwaiXdylBV0LgqlyqeMBY1+LyQ= - - - Headers/RLMDictionary.h - - hash2 - - 7zN2nXgEwGfrPRtbgqtfoLrwJbwqohcVvU/OyA/07Lk= - - - Headers/RLMEmailPasswordAuth.h - - hash2 - - kPgBdHJePj/cHAbWCVhZlW1gCQP5jXtJ7XudO0PWjJc= - - - Headers/RLMEmbeddedObject.h - - hash2 - - ixHqXedHxkS6e1f2hOY4TR7NWMyNq34b4/nm8SR0Oxc= - - - Headers/RLMError.h - - hash2 - - 6duvM3p0FRf6fZ+aS57vHkf7WvV1KPoz7PcIZA48WTU= - - - Headers/RLMFindOneAndModifyOptions.h - - hash2 - - eBuQnRLTeMBzF7m2R9PMJor8N0HG8BATxdCptRT1l9M= - - - Headers/RLMFindOptions.h - - hash2 - - P8MSaPFACOtAPsGYinSqt6NMIsXKcWkHpFTlly2GBYo= - - - Headers/RLMLogger.h - - hash2 - - Rc5dqT87eP/gD3kVZ1e7cRwI9Mkt5r6CFn/coM+9wNw= - - - Headers/RLMMigration.h - - hash2 - - /CXq+e7CtzaXdrGoLya2a56Zz6xWRH73N3RzyMcQrgs= - - - Headers/RLMMongoClient.h - - hash2 - - mcINEnrePRx0xfRaNvOmeXYRadQMzwLngLrJ1OVyopc= - - - Headers/RLMMongoCollection.h - - hash2 - - E0fX0BjuJ0j4c8TuCPbwnLNKz673nghSyUN4BYN/+Io= - - - Headers/RLMMongoDatabase.h - - hash2 - - wnJWmMW0z3xO9KVRJKpiE+xkaKkzXBXiH5j+8eaFmcA= - - - Headers/RLMNetworkTransport.h - - hash2 - - AicqavQF04Q9MIj7DC5P9gBz6OuViFiiAmXdjlFnDHg= - - - Headers/RLMObject.h - - hash2 - - OiikDToZtuVXIwxkh+yGFMFCP0c/2M6A8cIP77/xvcU= - - - Headers/RLMObjectBase.h - - hash2 - - 0IkNkedPyHNJuPYD0PmVx4Bg/+mH8tv2PNXD2m9hWV8= - - - Headers/RLMObjectBase_Dynamic.h - - hash2 - - MhHocXkaDJWhg+kvj9Hqqy9FG4zTtna2Np2i7p4l/mA= - - - Headers/RLMObjectId.h - - hash2 - - Y7IcVMBjUeMCgI/orPGngNh0qcgC7R7fwx2STYYTC2g= - - - Headers/RLMObjectSchema.h - - hash2 - - 8oCJihoGgigIF170SRk/yU5RLDNX9TYQUrXxLjYrtuM= - - - Headers/RLMProperty.h - - hash2 - - nV0mZEIKVaPW2/FVbUaWuXy+nEV5iB30UZ55i0VVCno= - - - Headers/RLMProviderClient.h - - hash2 - - aOPxwbDKabtIt2wbqZ4Wb/le1H43X9HXrNkONHiEX2M= - - - Headers/RLMPushClient.h - - hash2 - - vLfYK+JyPmkHz32A9v/JPJGPKAL9QTKDDjuzAvbp+oQ= - - - Headers/RLMRealm+Sync.h - - hash2 - - WcmSf38ttMQ4awjqOn4zkmpysaf44aAT0GgECwvPPTA= - - - Headers/RLMRealm.h - - hash2 - - DMk8xOvPhlnZalU0C2E5O60eqhA67YErgxkj3mI4jXc= - - - Headers/RLMRealmConfiguration.h - - hash2 - - j5GiT0/nxORHqliXnJv/kkbOOqZX33xDbk8OTR7zDwU= - - - Headers/RLMRealm_Dynamic.h - - hash2 - - S14hbsZJZN4uVtz+HI326QGjnxKdSRlU6Ogf/zRhn3I= - - - Headers/RLMResults.h - - hash2 - - qZJ0imHeOKCxk0VNEkVldju7BQHiZ2hohjwCeU6aZTg= - - - Headers/RLMSchema.h - - hash2 - - Da+xBUjLeHl2hcOCpSFRylZchf6KtXuqqjscXH1jJQM= - - - Headers/RLMSectionedResults.h - - hash2 - - sXdD7rSZHJKtS62ScBNQhWdpGkKW1aDVK0qCzOouJIs= - - - Headers/RLMSet.h - - hash2 - - GJyUsZbhXDGgjqOQlfqqef9XjQnvB5nCRPHtZJWGa3w= - - - Headers/RLMSwiftObject.h - - hash2 - - Mp9akxBWxbrBunN7cH8rKSLxSps0tbV78UDSheKAlcU= - - - Headers/RLMSwiftProperty.h - - hash2 - - 9FsxWX7jcaks+2ZmTf4cgN0zvirLeNQHSB6BYAO1EYI= - - - Headers/RLMSyncConfiguration.h - - hash2 - - Qd1NmY+Z/yEGUpaaue7NEJ5fPWaRdhGPZwdhliidIpY= - - - Headers/RLMSyncManager.h - - hash2 - - rFV4QDsBonA29YqdZXsYhNSVewEYkrafSLPWBGaEhqI= - - - Headers/RLMSyncSession.h - - hash2 - - nvtBHH3xJsThO0B4IC70G3oFD2TAm3ylKbmewSOosI4= - - - Headers/RLMSyncSubscription.h - - hash2 - - bLLVFGHhtBca6vgsFZmW1oNaoYQlrjFELS/wESp9AbM= - - - Headers/RLMThreadSafeReference.h - - hash2 - - UMODRNRT6SDDKzmYIElQuKxojpiUtxhb0o/KbUM9BiA= - - - Headers/RLMUpdateResult.h - - hash2 - - lAHF8rLoAYtBCB3iqPCJEeSAijx4p/TLf2Q/B/qh5lY= - - - Headers/RLMUser.h - - hash2 - - wTq72vEeK8F3E3s/3DWLNz76GPbIMmApC5KfRF6m0ro= - - - Headers/RLMUserAPIKey.h - - hash2 - - 1QyqOo1U0h/D83T3jmF2rcq87+P6CHZvXh5dNLZQV00= - - - Headers/RLMValue.h - - hash2 - - kTEM0oJVWJv89s6/r6s0AHQoO1bJZsYB8IHZKbPtddY= - - - Headers/Realm.h - - hash2 - - kjoP0TvFhg49q7sxVEgPoNFg+zqo9bCE2Uh0YOpDpbE= - - - LICENSE - - hash2 - - aYSSIb+5AFPeITTvXm1UAoe0uYBiMmSS8flvXaaFUks= - - - Modules/module.modulemap - - hash2 - - KdpbsAGrxax/jx81TZ93YswnCwT1BZTor6VwIHvgRUs= - - - PrivateHeaders/RLMAccessor.h - - hash2 - - SPn/lNQWueENJmkQ4wtBIhfjYt6+nmmT97X3fzuAJC0= - - - PrivateHeaders/RLMApp_Private.h - - hash2 - - 4pd3636NRX7kQgsEy7dv7IQH/AyZMKjQvA2nmK97Vq0= - - - PrivateHeaders/RLMArray_Private.h - - hash2 - - 2N5vpeRBFWpvYEVWixFuVwigDP3cRo9i7S0qyB7fCZE= - - - PrivateHeaders/RLMAsyncTask_Private.h - - hash2 - - vD90SYI5658JDp88stHbsxALdVNhs0Tojcld9hVORHE= - - - PrivateHeaders/RLMBSON_Private.hpp - - hash2 - - BbwPX5lPL+B+5GRik9KiI5HcYoKNH/Tsciqyo3dZwBw= - - - PrivateHeaders/RLMCollection_Private.h - - hash2 - - Ez5JFCGYAGERpmwzK44V9Wu5NkwdLOrl1iHqFvur6r4= - - - PrivateHeaders/RLMDictionary_Private.h - - hash2 - - L46EZOdftwGMzm9VC/4u3hkjsshqrE1MqRXoAkJqsOg= - - - PrivateHeaders/RLMEvent.h - - hash2 - - 5QzhSVhLCncN5PArOpGSswyWYU5jSvmLJ64E6SIAYdw= - - - PrivateHeaders/RLMLogger_Private.h - - hash2 - - FcXRklemoAfn0U01YWdTuUgt0i183/x1v71EplpuujM= - - - PrivateHeaders/RLMMigration_Private.h - - hash2 - - ffQpfBvMLXuV8NocpO5ksVSmYUATypSSGr91LEfzT6o= - - - PrivateHeaders/RLMMongoCollection_Private.h - - hash2 - - PihL2Vx/JsPS4RvQXdpvaQ+VxmtmdOwaYgtH6f9wNQs= - - - PrivateHeaders/RLMObjectBase_Private.h - - hash2 - - qSCecm7kZ3JIPZlhy4bqSwWYGpxP6cO+4XEUgSvdUTY= - - - PrivateHeaders/RLMObjectSchema_Private.h - - hash2 - - YULa8m2pbU/ji4KozUqn/FNoRTWwO71lgKeJiAbPRYA= - - - PrivateHeaders/RLMObjectStore.h - - hash2 - - 0KjmazUjg/mYvymGTJ74ChBgvrqN2Lc9O0TqcYF/Mic= - - - PrivateHeaders/RLMObject_Private.h - - hash2 - - +H8SMf9eYajdgBd1CmVWutUX5RsEHIsqKiruzH9R/Ok= - - - PrivateHeaders/RLMProperty_Private.h - - hash2 - - SCHY8+Qpt8utNhA5fwnUlOZ4Lg3O4Ubp5JrNuf01QIA= - - - PrivateHeaders/RLMPushClient_Private.hpp - - hash2 - - 2Os6mvA+v08M/g6mBUU8xUYAJvdOf9G/Fe1c0QuXlVg= - - - PrivateHeaders/RLMRealmConfiguration_Private.h - - hash2 - - syVrRHUbHQtVS/Dn94ZFKgu8iSJM1m17S0xnMCK9yEg= - - - PrivateHeaders/RLMRealm_Private.h - - hash2 - - Iwvw9zZudHE58doxwpdgpZqHaiCFT0Vn256EkmeFzIw= - - - PrivateHeaders/RLMResults_Private.h - - hash2 - - 7XS2lKYYaVQEMQ+lyOes++x+RIKDsVc8K2ZyTCf2NgE= - - - PrivateHeaders/RLMScheduler.h - - hash2 - - k60PzA5BmG/FSt34q+UmdeQWecO5OhB+uZnq99H1Fzc= - - - PrivateHeaders/RLMSchema_Private.h - - hash2 - - xuglEVxHTOiGP9pVTJ8oLhSTM1SRk38dn7uPHqUQ93Y= - - - PrivateHeaders/RLMSet_Private.h - - hash2 - - Fo+6TD0oovdpdflJ6GyRvXgCOWHSSjd2bAR+j7Fs88U= - - - PrivateHeaders/RLMSwiftCollectionBase.h - - hash2 - - bDV50WQPz5wCRCcFfCQLob/JPetY8XeEOZOJXoLtGKs= - - - PrivateHeaders/RLMSwiftSupport.h - - hash2 - - bDHCy6fOU4zn5MSi6CAVRmKQsc7GJgx6X4RNHbuI8Ws= - - - PrivateHeaders/RLMSwiftValueStorage.h - - hash2 - - D9eklFNwtXSh83+sMaYU1SNzeidnyKUXZV2PLWt+Ank= - - - PrivateHeaders/RLMSyncConfiguration_Private.h - - hash2 - - neftVth2HwCuILURLXm1nMY/GZCeo0G5/yYCIS8gz3Q= - - - PrivateHeaders/RLMSyncSubscription_Private.h - - hash2 - - Y9ySSatKNxy/XkESWScAioTpFet/83QmLhrE1VUIgmU= - - - PrivateHeaders/RLMUser_Private.h - - hash2 - - 4DKpP+7zxmcfnitz1DhLK2fhsChCk2aPWbG0B85100o= - - - - rules - - ^.* - - ^.*\.lproj/ - - optional - - weight - 1000 - - ^.*\.lproj/locversion.plist$ - - omit - - weight - 1100 - - ^Base\.lproj/ - - weight - 1010 - - ^version.plist$ - - - rules2 - - .*\.dSYM($|/) - - weight - 11 - - ^(.*/)?\.DS_Store$ - - omit - - weight - 2000 - - ^.* - - ^.*\.lproj/ - - optional - - weight - 1000 - - ^.*\.lproj/locversion.plist$ - - omit - - weight - 1100 - - ^Base\.lproj/ - - weight - 1010 - - ^Info\.plist$ - - omit - - weight - 20 - - ^PkgInfo$ - - omit - - weight - 20 - - ^embedded\.provisionprofile$ - - weight - 20 - - ^version\.plist$ - - weight - 20 - - - - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/CHANGELOG.md b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/CHANGELOG.md deleted file mode 100644 index 00cc01244..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/CHANGELOG.md +++ /dev/null @@ -1,9539 +0,0 @@ -10.42.3 Release notes (2023-09-18) -============================================================= - -### Enhancements - -* Update packaging for the Xcode 15.0 release. Carthage release and obj-c - binaries are now built with Xcode 15. - -### Fixed - -* The prebuilt Realm.xcframework for SPM was packaged incorrectly and did not - work ([#8361](https://github.com/realm/realm-swift/issues/8361), since v10.42.1). - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 15.0.0. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15.0.0. - -10.42.2 Release notes (2023-09-13) -============================================================= - -### Enhancements - -* Add support for logging messages sent by the server. - ([Core #6476](https://github.com/realm/realm-core/pull/6476)) -* Unknown protocol errors received from the baas server will no longer cause - the application to crash if a valid error action is also received. Unknown - error actions will be treated as an ApplicationBug error action and will - cause sync to fail with an error via the sync error handler. - ([Core #6885](https://github.com/realm/realm-core/pull/6885)) -* Some sync error messages now contain more information about what went wrong. - -### Fixed - -* The `MultipleSyncAgents` exception from opening a synchronized Realm in - multiple processes at once no longer leaves the sync client in an invalid - state. ([Core #6868](https://github.com/realm/realm-core/pull/6868), since v10.36.0) -* Testing the size of a collection of links against zero would sometimes fail - (sometimes = "difficult to explain"). In particular: - ([Core #6850](https://github.com/realm/realm-core/issues/6850), since v10.41.0) -* When async writes triggered a file compaction some internal state could be - corrupted, leading to later crashes in the slab allocator. This typically - resulted in the "ref + size <= next->first" assertion failure, but other - failures were possible. Many issues reported; see [Core #6340](https://github.com/realm/realm-core/issues/6340). - (since 10.35.0) -* `Realm.Configuration.maximumNumberOfActiveVersions` now handles intermediate - versions which have been cleaned up correctly and checks the number of live - versions rather than the number of versions between the oldest live version - and current version (since 10.35.0). -* If the client disconnected between uploading a change to flexible sync - subscriptions and receiving the new object data from the server resulting - from that subscription change, the next connection to the server would - sometimes result in a client reset - ([Core #6966](https://github.com/realm/realm-core/issues/6966), since v10.21.1). - -### Deprecations - -* `RLMApp` has `localAppName` and `localAppVersion` fields which never ended up - being used for anything and are now deprecated. -* `RLMSyncAuthError` has not been used since v10.0.0 and is now deprecated. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 7. - -### Internal - -* Upgraded realm-core from 13.17.1 to 13.20.1 - -10.42.1 Release notes (2023-08-28) -============================================================= - -### Fixed - -* The names of the prebuilt zips for SPM have changed to avoid having Carthage - download them instead of the intended Carthage zip - ([#8326](https://github.com/realm/realm-swift/issues/8326), since v10.42.0). -* The prebuild Realm.xcframework for SwiftPM now has all platforms other than - visionOS built with Xcode 14 to comply with app store rules - ([#8339](https://github.com/realm/realm-swift/issues/8339), since 10.42.0). -* Fix visionOS compilation with Xcode beta 7. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 7. - -10.42.0 Release notes (2023-07-30) -============================================================= - -### Enhancements - -* Add support for building for visionOS and add Xcode 15 binaries to the - release package. visionOS currently requires installing Realm via either - Swift Package Manager or by using a XCFramework as CocoaPods and Carthage do - not yet support it. -* Zips compatible with SPM's `.binaryTarget()` are now published as part of the - releases on Github. -* Prebuilt XCFrameworks are now built with LTO enabled. This has insignificant - performance benefits, but cuts the size of the library by ~15%. - -### Fixed - -* Fix nested properties observation on a `Projections` not notifying when there is a property change. - ([#8276](https://github.com/realm/realm-swift/issues/8276), since v10.34.0). -* Fix undefined symbol error for `UIKit` when linking Realm to a framework using SPM. - ([#8308](https://github.com/realm/realm-swift/issues/8308), since v10.41.0) -* If the app crashed at exactly the wrong time while opening a freshly - compacted Realm the file could be left in an invalid state - ([Core #6807](https://github.com/realm/realm-core/pull/6807), since v10.33.0). -* Sync progress for DOWNLOAD messages was sometimes stored incorrectly, - resulting in an extra round trip to the server. - ([Core #6827](https://github.com/realm/realm-core/issues/6827), since v10.31.0) - -### Breaking Changes - -* Legacy non-xcframework Carthage installations are no longer supported. Please - ensure you are using `--use-xcframeworks` if installing via Carthage. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 5. - -### Internal - -* Upgraded realm-core from 13.17.0 to 13.17.1 -* Release packages were being uploaded to several static.realm.io URLs which - are no longer linked to anywhere. These are no longer being updated, and - release packages are now only being uploaded to Github. - -10.41.1 Release notes (2023-07-17) -============================================================= - -### Enhancements - -* Filesystem errors now include more information in the error message. -* Sync connection and session reconnect timing/backoff logic has been reworked - and unified into a single implementation. Previously some categories of errors - would cause an hour-long wait before attempting to reconnect, while others - would use an exponential backoff strategy. All errors now result in the sync - client waiting for 1 second before retrying, doubling the wait after each - subsequent failure up to a maximum of five minutes. If the cause of the error - changes, the backoff will be reset. If the sync client voluntarily disconnects, - no backoff will be used. ([Core #6526]((https://github.com/realm/realm-core/pull/6526))) - -### Fixed - -* Removed warnings for deprecated APIs internal use. - ([#8251](https://github.com/realm/realm-swift/issues/8251), since v10.39.0) -* Fix an error during async open and client reset if properties have been added - to the schema. This fix also applies to partition-based to flexible sync - migration if async open is used. ([Core #6707](https://github.com/realm/realm-core/issues/6707), since v10.28.2) - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 4. - -### Internal - -* Upgraded realm-core from 13.15.1 to 13.17.0 -* The location where prebuilt core binaries are published has changed slightly. - If you are using `REALM_BASE_URL` to mirror the binaries, you may need to - adjust your mirroring logic. - -10.41.0 Release notes (2023-06-26) -============================================================= - -### Enhancements - -* Add support for multiplexing sync connections. When enabled (the default), a single - connection is used per sync user rather than one per synchronized Realm. This - reduces resource consumption when multiple Realms are opened and will - typically improve performance ([PR #8282](https://github.com/realm/realm-swift/pull/8282)). -* Sync timeout options can now be set on `RLMAppConfiguration` along with the - other app-wide configuration settings ([PR #8282](https://github.com/realm/realm-swift/pull/8282)). - -### Fixed - -* Import as `RLMRealm_Private.h` as a module would cause issues when using Realm as a subdependency. - ([#8164](https://github.com/realm/realm-swift/issues/8164), since 10.37.0) -* Disable setting a custom logger by default on the sync client when the sync manager is created. - This was overriding the default logger set using `RLMLogger.defaultLogger`. (since v10.39.0). - -### Breaking Changes - -* The `RLMSyncTimeouts.appConfiguration` property has been removed. This was an - unimplemented read-only property which did not make any sense on the - containing type ([PR #8282](https://github.com/realm/realm-swift/pull/8282)). - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 2. - -### Internal - -* Upgraded realm-core from 13.15.0 to 13.15.1 - -10.40.2 Release notes (2023-06-09) -============================================================= - -### Enhancements - -* `Actor.preconditionIsolated()` is now used for runtime actor checking when - available (i.e. building with Xcode 15 and running on iOS 17) rather than the - less reliable workaround. - -### Fixed - -* If downloading the fresh Realm file failed during a client reset on a - flexible sync Realm, the sync client would crash the next time the Realm was - opened. ([Core #6494](https://github.com/realm/realm-core/issues/6494), since v10.28.2) -* If the order of properties in the local class definitions did not match the - order in the server-side schema, the before-reset Realm argument passed to a - client reset handler would have an invalid schema and likely crash if any - data was read from it. ([Core #6693](https://github.com/realm/realm-core/issues/6693), since v10.40.0) - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 1. - -### Internal - -* Upgraded realm-core from 13.13.0 to 13.15.0. -* The prebuilt library used for CocoaPods installations is now built with Xcode - 14. This should not have any observable effects other than the download being - much smaller due to no longer including bitcode. - -10.40.1 Release notes (2023-06-06) -============================================================= - -### Enhancements - -* Fix compilation with Xcode 15. Note that iOS 12 is the minimum supported - deployment target when using Xcode 15. -* Switch to building the Carthage release with Xcode 14.3.1. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 1. - -### Internal - -* Overhauled SDK metrics collection to better drive future development efforts. - -10.40.0 Release notes (2023-05-26) -============================================================= - -Drop support for Xcode 13 and add Xcode 14.3.1. Xcode 14.1 is now the minimum -supported version. - -### Enhancements - -* Adjust the error message for private `Object` subclasses and subclasses - nested inside other types to explain how to make them work rather than state - that it's impossible. ([#5662](https://github.com/realm/realm-cocoa/issues/5662)). -* Improve performance of SectionedResults. With a single section it is now ~10% - faster, and the runtime of sectioning no longer scales significantly with - section count, giving >100% speedups when there are large numbers of sections - ([Core #6606](https://github.com/realm/realm-core/pull/6606)). -* Very slightly improve performance of runtime thread checking on the main - thread. ([Core #6606](https://github.com/realm/realm-core/pull/6606)) - -### Fixed - -* Allow support for implicit boolean queries on Swift's Type Safe Queries API - ([#8212](https://github.com/realm/realm-swift/issues/8212)). -* Fixed a fatal error (reported to the sync error handler) during client reset - or automatic partition-based to flexible sync migration if the reset has been - triggered during an async open and the schema being applied has added new - classes. Due to this bug automatic flexibly sync migration has been disabled - for older releases and this is now the minimum version required. - ([#6601](https://github.com/realm/realm-core/issues/6601), since automatic - client resets were introduced in v10.25.0) -* Dictionaries sometimes failed to map unresolved links to nil. If the target - of a link in a dictionary was deleted by another sync client, reading that - field from the dictionary would sometimes give an invalid object rather than - nil. In addition, queries on dictionaries would sometimes have incorrect - results. ([Core #6644](https://github.com/realm/realm-core/pull/6644), since v10.8.0) -* Older versions of Realm would sometimes fail to properly mark objects as - being the target of an incoming link from another object. When this happened, - deleting the target object would hit an assertion failure due to the - inconsistent state. We now reconstruct a valid state rather than crashing. - ([Core #6585](https://github.com/realm/realm-core/issues/6585), since v5.0.0) -* Fix several UBSan failures which did not appear to result in functional bugs - ([Core #6649](https://github.com/realm/realm-core/pull/6649)). -* Using both synchronous and asynchronous transactions on the same thread or - scheduler could hit the assertion failure "!realm.is_in_transaction()" if one - of the callbacks for an asynchronous transaction happened to be scheduled - during a synchronous transaction - ([Core #6659](https://github.com/realm/realm-core/issues/6659), since v10.26.0) -* The stored deployment location for Apps was not being updated correctly after - receiving a redirect response from the server, resulting in every connection - attempting to connect to the old URL and getting redirected rather than only - the first connection after the deployment location changed. - ([Core #6630](https://github.com/realm/realm-core/issues/6630), since v10.38.2) - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-14.3.1. - -### Internal - -* Upgraded realm-core from 13.10.1 to 13.13.0. - -10.39.1 Release notes (2023-05-05) -============================================================= - -### Enhancements - -* New notifiers can now be registered in write transactions until changes have - actually been made in the write transaction. This makes it so that new - notifications can be registered inside change notifications triggered by - beginning a write transaction (unless a previous callback performed writes). - ([#4818](https://github.com/realm/realm-swift/issues/4818)). -* Reduce the memory footprint of an automatic (discard or recover) client reset - when there are large incoming changes from the server. - ([Core #6567](https://github.com/realm/realm-core/issues/6567)). - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from 13.10.0 to 13.10.1. - -10.39.0 Release notes (2023-05-03) -============================================================= - -### Enhancements - -* Add support for actor-isolated Realms, opened with `try await Realm(actor: actor)`. - - Rather than being confined to the current thread or a dispatch queue, - actor-isolated Realms are isolated to an actor. This means that they can be - used from any thread as long as it's within a function isolated to that - actor, and they remain valid over suspension points where a task may hop - between threads. Actor-isolated Realms can be used with either global or - local actors: - - ```swift - @MainActor function mainThreadFunction() async throws { - // These are identical: the async init continues to produce a - // MainActor-confined Realm if no actor is supplied - let realm1 = try await Realm() - let realm2 = try await Realm(MainActor.shared) - } - - // A simple example of a custom global actor - @globalActor actor BackgroundActor: GlobalActor { - static var shared = BackgroundActor() - } - - @BackgroundActor backgroundThreadFunction() async throws { - // Explicitly specifying the actor is required for everything but MainActor - let realm = try await Realm(actor: BackgroundActor.shared) - try await realm.write { - _ = realm.create(MyObject.self) - } - // Thread-confined Realms would sometimes throw an exception here, as we - // may end up on a different thread after an `await` - print("\(realm.objects(MyObject.self).count)") - } - - actor MyActor { - // An implicitly-unwrapped optional is used here to let us pass `self` to - // `Realm(actor:)` within `init` - var realm: Realm! - init() async throws { - realm = try await Realm(actor: self) - } - - var count: Int { - realm.objects(MyObject.self).count - } - - func create() async throws { - try await realm.asyncWrite { - realm.create(MyObject.self) - } - } - } - - // This function isn't isolated to the actor, so each operation has to be async - func createObjects() async throws { - let actor = try await MyActor() - for _ in 0..<5 { - await actor.create() - } - print("\(await actor.count)") - } - - // In an isolated function, an actor-isolated Realm can be used synchronously - func createObjects(in actor: isolated MyActor) async throws { - await actor.realm.write { - actor.realm.create(MyObject.self) - } - print("\(actor.realm.objects(MyObject.self).count)") - } - ``` - - Actor-isolated Realms come with a more convenient syntax for asynchronous - writes. `try await realm.write { ... }` will suspend the current task, - acquire the write lock without blocking the current thread, and then invoke - the block. The actual data is then written to disk on a background thread, - and the task is resumed once that completes. As this does not block the - calling thread while waiting to write and does not perform i/o on the calling - thread, this will often be safe to use from `@MainActor` functions without - blocking the UI. Sufficiently large writes may still benefit from being done - on a background thread. - - Asynchronous writes are only supported for actor-isolated Realms or in - `@MainActor` functions. - - Actor-isolated Realms require Swift 5.8 (Xcode 14.3). Enabling both strict - concurrency checking (`SWIFT_STRICT_CONCURRENCY=complete` in Xcode) and - runtime actor data race detection (`OTHER_SWIFT_FLAGS=-Xfrontend - -enable-actor-data-race-checks`) is strongly recommended when using - actor-isolated Realms. -* Add support for automatic partition-based to flexible sync migration. - Connecting to a server-side app configured to use flexible sync with a - client-side partition-based sync configuration is now supported, and will - automatically create the appropriate flexible sync subscriptions to subscribe - to the requested partition. This allows changing the configuration on the - server from partition-based to flexible without breaking existing clients. - ([Core #6554](https://github.com/realm/realm-core/issues/6554)) -* Now you can use an array `[["_id": 1], ["breed": 0]]` as sorting option for a - MongoCollection. This new API fixes the issue where the resulting documents - when using more than one sort parameter were not consistent between calls. - ([#7188](https://github.com/realm/realm-swift/issues/7188), since v10.0.0). -* Add support for adding a user created default logger, which allows implementing your own logging logic - and the log threshold level. - You can define your own logger creating an instance of `Logger` and define the log function which will be - invoked whenever there is a log message. - - ```swift - let logger = Logger(level: .all) { level, message in - print("Realm Log - \(level): \(message)") - } - ``` - - Set this custom logger as Realm default logger using `Logger.shared`. - ```swift - Logger.shared = logger - ``` -* It is now possible to change the default log threshold level at any point of the application's lifetime. - ```swift - Logger.shared.logLevel = .debug - ``` - This will override the log level set anytime before by a user created logger. -* We have set `.info` as the default log threshold level for Realm. You will now see some - log message in your console. To disable use `Logger.shared.level = .off`. - -### Fixed - -* Several schema initialization functions had incorrect `@MainActor` - annotations, resulting in runtime warnings if the first time a Realm was - opened was on a background thread - ([#8222](https://github.com/realm/realm-swift/issues/8222), since v10.34.0). - -### Deprecations - -* `App.SyncManager.logLevel` and `App.SyncManager.logFunction` are deprecated in favour of - setting a default logger. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from v13.9.4 to v13.10.0. - -10.38.3 Release notes (2023-04-28) -============================================================= - -### Enhancements - -* Improve performance of cancelling a write transactions after making changes. - If no KVO observers are used this is now constant time rather than taking - time proportional to the number of changes to be rolled back. Cancelling a - write transaction with KVO observers is 10-20% faster. ([Core PR #6513](https://github.com/realm/realm-core/pull/6513)). - -### Fixed - -* Performing a large number of queries without ever performing a write resulted - in steadily increasing memory usage, some of which was never fully freed due - to an unbounded cache ([#7978](https://github.com/realm/realm-swift/issues/7978), since v10.27.0). - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from 13.9.3 to 13.9.4 - -10.38.2 Release notes (2023-04-25) -============================================================= - -### Enhancements - -* Improve performance of equality queries on a non-indexed AnyRealmValue - property by about 30%. ([Core #6506](https://github.com/realm/realm-core/issues/6506)) - -### Fixed - -* SSL handshake errors were treated as fatal errors rather than errors which - should be retried. ([Core #6434](https://github.com/realm/realm-core/issues/6434), since v10.35.0) - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from 13.9.0 to 13.9.3. - -10.38.1 Release notes (2023-04-25) -============================================================= - -### Fixed - -* The error handler set on EventsConfiguration was not actually used (since v10.26.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -10.38.0 Release notes (2023-03-31) -============================================================= - -Switch to building the Carthage release with Xcode 14.3. - -### Enhancements - -* Add Xcode 14.3 binaries to the release package. Note that CocoaPods 1.12.0 - does not support Xcode 14.3. -* Add support for sharing encrypted Realms between multiple processes. - ([Core #1845](https://github.com/realm/realm-core/issues/1845)) - -### Fixed - -* Fix a memory leak reported by Instruments on `URL.path` in - `Realm.Configuration.fileURL` when using a string partition key in Partition - Based Sync ([#8195](https://github.com/realm/realm-swift/pull/8195)), since v10.0.0). -* Fix a data race in version management. If one thread committed a write - transaction which increased the number of live versions above the previous - highest seen during the current session at the same time as another thread - began a read, the reading thread could read from a no-longer-valid memory - mapping. This could potentially result in strange crashes when opening, - refreshing, freezing or thawing a Realm - ([Core #6411](https://github.com/realm/realm-core/pull/6411), since v10.35.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from 13.8.0 to 13.9.0. - -10.37.2 Release notes (2023-03-29) -============================================================= - -### Fixed - -* Copying a `RLMRealmConfiguration` failed to copy several fields. This - resulted in migrations being passed the incorrect object type in Swift when - using the default configuration (since v10.34.0) or async open (since - v10.37.0). This also broke using the Events API in those two scenarios (since - v10.26.0 for default configuration and v10.37.0 for async open). ([#8190](https://github.com/realm/realm-swift/issues/8190)) - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -10.37.1 Release notes (2023-03-27) -============================================================= - -### Enhancements - -* Performance improvement for the following queries ([Core #6376](https://github.com/realm/realm-core/issues/6376)): - * Significant (~75%) improvement when counting (`Results.count`) the number - of exact matches (with no other query conditions) on a - string/int/UUID/ObjectID property that has an index. This improvement - will be especially noticiable if there are a large number of results - returned (duplicate values). - * Significant (~99%) improvement when querying for an exact match on a Date - property that has an index. - * Significant (~99%) improvement when querying for a case insensitive match - on an AnyRealmValue property that has an index. - * Moderate (~25%) improvement when querying for an exact match on a Bool - property that has an index. - * Small (~5%) improvement when querying for a case insensitive match on an - AnyRealmValue property that does not have an index. - -### Fixed - -* Add missing `@Sendable` annotations to several sync and app services related - callbacks ([PR #8169](https://github.com/realm/realm-swift/pull/8169), since v10.34.0). -* Fix some bugs in handling task cancellation for async Realm init. Some very - specific timing windows could cause crashes, and the download would not be - cancelled if the Realm was already open ([PR #8178](https://github.com/realm/realm-swift/pull/8178), since v10.37.0). -* Fix a crash when querying an AnyRealmValue property with a string operator - (contains/like/beginswith/endswith) or with case insensitivity. - ([Core #6376](https://github.com/realm/realm-core/issues/6376), since v10.8.0) -* Querying for case-sensitive equality of a string on an indexed AnyRealmValue - property was returning case insensitive matches. For example querying for - `myIndexedAny == "Foo"` would incorrectly match on values of "foo" or "FOO" etc. - ([Core #6376](https://github.com/realm/realm-core/issues/6376), since v10.8.0) -* Adding an index to an AnyRealmValue property when objects of that type - already existed would crash with an assertion. - ([Core #6376](https://github.com/realm/realm-core/issues/6376), since v10.8.0). -* Fix a bug that may have resulted in arrays being in different orders on - different devices. Some cases of “Invalid prior_size” may be fixed too. - ([Core #6191](https://github.com/realm/realm-core/issues/6191), since v10.25.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -### Internal - -* Upgraded realm-core from 13.6.0 to 13.8.0 - -10.37.0 Release notes (2023-03-09) -============================================================= - -### Enhancements - -* `MongoCollection.watch().subscribe(on:)` now supports any swift Scheduler - rather than only dispatch queues ([PR #8131](https://github.com/realm/realm-swift/pull/8130)). -* Add an async sequence wrapper for `MongoCollection.watch()`, allowing you to - do `for try await change in collection.changeEvents { ... }` - ([PR #8131](https://github.com/realm/realm-swift/pull/8130)). -* The internals of error handling and reporting have been significantly - reworked. The visible effects of this are that some errors which previously - had unhelpful error messages now include more detail about what went wrong, - and App errors now expose a much more complete set of error codes - ([PR #8002](https://github.com/realm/realm-swift/pull/8002)). -* Expose compensating write error information. When the server rejects a - modification made by the client (such as if the user does not have the - required permissions), a `SyncError` is delivered to the sync error handler - with the code `.writeRejected` and a non-nil `compensatingWriteInfo` field - which contains information about what was rejected and why. This information - is intended primarily for debugging and logging purposes and may not have a - stable format. ([PR #8002](https://github.com/realm/realm-swift/pull/8002)) -* Async `Realm.init()` now handles Task cancellation and will cancel the async - open if the Task is cancelled ([PR #8148](https://github.com/realm/realm-swift/pull/8148)). -* Cancelling async opens now has more consistent behavior. The previously - intended and documented behavior was that cancelling an async open would - result in the callback associated with the specific task that was cancelled - never being called, and all other pending callbacks would be invoked with an - ECANCELED error. This never actually worked correctly, and the callback which - was not supposed to be invoked at all sometimes would be. We now - unconditionally invoke all of the exactly once, passing ECANCELED to all of - them ([PR #8148](https://github.com/realm/realm-swift/pull/8148)). - -### Fixed - -* `UserPublisher` incorrectly bounced all notifications to the main thread instead - of setting up the Combine publisher to correctly receive on the main thread. - ([#8132](https://github.com/realm/realm-swift/issues/8132), since 10.21.0) -* Fix warnings when building with Xcode 14.3 beta 2. -* Errors in async open resulting from invalid queries in `initialSubscriptions` - would result in the callback being invoked with both a non-nil Realm and a - non-nil Error even though the Realm was in an invalid state. Now only the - error is passed to the callback ([PR #8148](https://github.com/realm/realm-swift/pull/8148), since v10.28.0). -* Converting a local realm to a synced realm would crash if an embedded object - was null ([Core #6294](https://github.com/realm/realm-core/issues/6294), since v10.22.0). -* Subqueries on indexed properties performed extremely poorly. ([Core #6327](https://github.com/realm/realm-core/issues/6327), since v5.0.0) -* Fix a crash when a SSL read successfully read a non-zero number of bytes and - also reported an error. ([Core #5435](https://github.com/realm/realm-core/issues/5435), since 10.0.0) -* The sync client could get stuck in an infinite loop if the server sent an - invalid changeset which caused a transform error. This now results in a - client reset instead. ([Core #6051](https://github.com/realm/realm-core/issues/6051), since v10.0.0) -* Strings in queries which contained any characters which required multiple - bytes when encoded as utf-8 were incorrectly encoded as binary data when - serializing the query to send it to the server for a flexible sync - subscription, resulting the server rejecting the query - ([Core #6350](https://github.com/realm/realm-core/issues/6350), since 10.22.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -### Internal - -* Upgraded realm-core from 13.4.1 to 13.6.0 - -10.36.0 Release notes (2023-02-15) -============================================================= - -### Enhancements - -* Add support for multiple overlapping or nested event scopes. - `Events.beginScope()` now returns a `Scope` object which is used to commit or - cancel that scope, and if more than one scope is active at a time events are - reported to all active scopes. - -### Fixed - -* Fix moving `List` items to a higher index in SwiftUI results in wrong destination index - ([#7956](https://github.com/realm/realm-swift/issues/7956), since v10.6.0). -* Using the `searchable` view modifier with `@ObservedResults` in iOS 16 would - cause the collection observation subscription to cancel. - ([#8096](https://github.com/realm/realm-swift/issues/8096), since 10.21.0) -* Client reset with recovery would sometimes crash if the recovery resurrected - a dangling link ([Core #6292](https://github.com/realm/realm-core/issues/6292), since v10.32.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -### Internal - -* Upgraded realm-core from 13.4.0 to 13.4.1 - -10.35.1 Release notes (2023-02-10) -============================================================= - -### Fixed - -* Client reset with recovery would crash if a client reset occurred the very - first time the Realm was opened with async open. The client reset callbacks - are now not called if the Realm had never been opened before - ([PR #8125](https://github.com/realm/realm-swift/pull/8125), since 10.32.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -10.35.0 Release notes (2023-02-07) -============================================================= - -This version bumps the Realm file format version to 23. Realm files written by -this version cannot be read by older versions of Realm. - -### Enhancements - -* The Realm file is now automatically shrunk if the file size is larger than - needed to store all of the data. ([Core PR #5755](https://github.com/realm/realm-core/pull/5755)) -* Pinning old versions (either with frozen Realms or with Realms on background - threads that simply don't get refreshed) now only prevents overwriting the - data needed by that version, rather than the data needed by that version and - all later versions. In addition, frozen Realms no longer pin the transaction - logs used to drive change notifications. This mostly eliminates the file size - growth caused by pinning versions. ([Core PR #5440](https://github.com/realm/realm-core/pull/5440)) -* Rework how Dictionaries/Maps are stored in the Realm file. The new design uses - less space and is typically significantly faster. This changes the iteration - order of Maps, so any code relying on that may be broken. We continue - to make no guarantees about iteration order on Maps ([Core #5764](https://github.com/realm/realm-core/issues/5764)). -* Improve performance of freezing Realms ([Core PR #6211](https://github.com/realm/realm-core/pull/6211)). - -### Fixed - -* Fix a crash when using client reset with recovery and flexible sync with a - single subscription ([Core #6070](https://github.com/realm/realm-core/issues/6070), since v10.28.2) -* Encrypted Realm files could not be opened on devices with a larger page size - than the one which originally wrote the file. - ([#8030](https://github.com/realm/realm-swift/issues/8030), since v10.32.1) -* Creating multiple flexible sync subscriptions at once could hit an assertion - failure if the server reported an error for any of them other than the last - one ([Core #6038](https://github.com/realm/realm-core/issues/6038), since v10.21.1). -* `Set` and `List` considered a string and binary - data containing that string encoded as UTF-8 to be equivalent. This could - result in a List entry not changing type on assignment and for the client be - inconsistent with the server if a string and some binary data with equivalent - content was inserted from Atlas. - ([Core #4860](https://github.com/realm/realm-core/issues/4860) and - [Core #6201](https://github.com/realm/realm-core/issues/6201), since v10.8.0) -* Querying for NaN on Decimal128 properties did not match any objects - ([Core #6182](https://github.com/realm/realm-core/issues/6182), since v10.8.0). -* When client reset with recovery is used and the recovery did not need to - make any changes to the local Realm, the sync client could incorrectly think - the recovery failed and report the error "A fatal error occured during client - reset: 'A previous 'Recovery' mode reset from did not succeed, - giving up on 'Recovery' mode to prevent a cycle'". - ([Core #6195](https://github.com/realm/realm-core/issues/6195), since v10.32.0) -* Fix a crash when using client reset with recovery and flexible sync with a - single subscription ([Core #6070](https://github.com/realm/realm-core/issues/6070), since v10.28.2) -* Writing to newly in-view objects while a flexible sync bootstrap was in - progress would not synchronize those changes to the server - ([Core #5804](https://github.com/realm/realm-core/issues/5804), since v10.21.1). -* If a client reset with recovery or discard local was interrupted while the - "fresh" realm was being downloaded, the sync client could crash with a - MultpleSyncAgents exception ([Core #6217](https://github.com/realm/realm-core/issues/6217), since v10.25.0). -* Sharing Realm files between a Catalyst app and Realm Studio did not properly - synchronize access to the Realm file ([Core #6258](https://github.com/realm/realm-core/pull/6258), since v10.0.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -### Internal - -* Upgraded realm-core from 12.13.0 to 13.4.0 - -10.34.1 Release notes (2023-01-20) -============================================================= - -### Fixed - -* Add some missing `@preconcurrency` annotations which lead to build failures - with Xcode 14.0 when importing via SPM or CocoaPods - ([#8104](https://github.com/realm/realm-swift/issues/8104), since v10.34.0). - -### Compatibility - -* Realm Studio: 11.0.0 - 12.0.0. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -10.34.0 Release notes (2023-01-13) -============================================================= - -Swift 5.5 is no longer supported. Swift 5.6 (Xcode 13.3) is now the minimum -supported version. - -The prebuilt binary for Carthage is now build with Xcode 14.2. - -### Enhancements - -* Improve performance of creating Projection objects and of change - notifications on projections ([PR #8050](https://github.com/realm/realm-swift/pull/8050)). -* Allow initialising any sync configuration with `cancelAsyncOpenOnNonFatalErrors`. -* Improve performance of Combine value publishers which do not use the - object/collection changesets a little. -* All public types have been audited for sendability and are now marked as - Sendable when applicable. A few types which were incidentally not thread-safe - but make sense to use from multiple threads are now thread-safe. -* Add support for building Realm with strict concurrency checking enabled. - -### Fixed - -* Fix bad memory access exception that can occur when watching change streams. - [PR #8039](https://github.com/realm/realm-swift/pull/8039). -* Object change notifications on projections only included the first projected - property for each source property ([PR #8050](https://github.com/realm/realm-swift/pull/8050), since v10.21.0). -* `@AutoOpen` failed to open flexible sync Realms while offline - ([#7986](https://github.com/realm/realm-swift/issues/7986), since v10.27.0). -* Fix "Publishing changes from within view updates is not allowed" warnings - when using `@ObservedResults` or `@ObservedSectionedResults` - ([#7908](https://github.com/realm/realm-swift/issues/7908)). -* Fix "Publishing changes from within view updates is not allowed" warnings - when using `@AutoOpen` or `@AsyncOpen`. - ([#7908](https://github.com/realm/realm-swift/issues/7908)). -* Defer `Realm.asyncOpen` execution on `@AsyncOpen` and `@AutoOpen` property - wrappers until all the environment values are set. This will guarantee the - configuration and partition value are set set before opening the realm. - ([#7931](https://github.com/realm/realm-swift/issues/7931), since v10.12.0). -* `@ObservedResults.remove()` could delete the wrong object if a write on a - background thread which changed the index of the object being removed - occurred at a very specific time (since v10.6.0). - -### Compatibility - -* Realm Studio: 11.0.0 - 12.0.0. 13.0.0 is currently incompatible. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -10.33.0 Release notes (2022-12-01) -============================================================= - -### Enhancements - -* Flexible sync subscription state will change to - `SyncSubscriptionState.pending` (`RLMSyncSubscriptionStatePending`) while - waiting for the server to have sent all pending history after a bootstrap and - before marking a subscription as Complete. - ([#5795](https://github.com/realm/realm-core/pull/5795)) -* Add custom column names API, which allows to set a different column name in the realm - from the one used in your object declaration. - ```swift - class Person: Object { - @Persisted var firstName: String - @Persisted var birthDate: Date - @Persisted var age: Int - - override class public func propertiesMapping() -> [String: String] { - ["firstName": "first_name", - "birthDate": "birth_date"] - } - } - ``` - This is very helpful in cases where you want to name a property differently - from your `Device Sync` JSON schema. - This API is only available for old and modern object declaration syntax on the - `RealmSwift` SDK. -* Flexible sync bootstraps now apply 1MB of changesets per write transaction - rather than applying all of them in a single write transaction. - ([Core PR #5999](https://github.com/realm/realm-core/pull/5999)). - -### Fixed - -* Fix a race condition which could result in "operation cancelled" errors being - delivered to async open callbacks rather than the actual sync error which - caused things to fail ([Core PR #5968](https://github.com/realm/realm-core/pull/5968), since the introduction of async open). -* Fix database corruption issues which could happen if an application was - terminated at a certain point in the process of comitting a write - transaciton. ([Core PR #5993](https://github.com/realm/realm-core/pull/5993), since v10.21.1) -* `@AsyncOpen` and `@AutoOpen` would begin and then cancel a second async open - operation ([PR #8038](https://github.com/realm/realm-swift/pull/8038), since v10.12.0). -* Changing the search text when using the searchable SwiftUI extension would - trigger multiple updates on the View for each change - ([PR #8038](https://github.com/realm/realm-swift/pull/8038), since v10.19.0). -* Changing the filter or search properties of an `@ObservedResults` or - `@ObservedSectionedResults` would trigger up to three updates on the View - ([PR #8038](https://github.com/realm/realm-swift/pull/8038), since v10.6.0). -* Fetching a user's profile while the user logs out would result in an - assertion failure. ([Core PR #6017](https://github.com/realm/realm-core/issues/5571), since v10.8.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -### Internal - -* Upgraded realm-core from 12.11.0 to 12.13.0 - -10.32.3 Release notes (2022-11-10) -============================================================= - -### Fixed - -* Fix name lookup errors when importing Realm Swift built in library evolution - mode (([#8014](https://github.com/realm/realm-swift/issues/8014)). -* The prebuilt watchOS library in the objective-c release package was missing - an arm64 slice. The Swift release package was uneffected - ([PR #8016](https://github.com/realm/realm-swift/pull/8016)). -* Fix issue where `RLMUserAPIKey.key`/`UserAPIKey.key` incorrectly returned the name of the API - key instead of the key itself. ([#8021](https://github.com/realm/realm-swift/issues/8021), since v10.0.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -10.32.2 Release notes (2022-11-01) -============================================================= - -Switch to building the Carthage release with Xcode 14.1. - -### Fixed - -* Fix linker errors when building a release build with Xcode 14.1 when - installing via SPM ([#7995](https://github.com/realm/realm-swift/issues/7995)). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -10.32.1 Release notes (2022-10-25) -============================================================= - -### Enhancements - -* Improve performance of client reset with automatic recovery and converting - top-level tables into embedded tables ([Core #5897](https://github.com/realm/realm-core/pull/5897)). -* `Realm.Error` is now a typealias for `RLMError` rather than a - manually-defined version of what the automatic bridging produces. This should - have no effect on existing working code, but the manual definition was - missing a few things supplied by the automatic bridging. -* Some sync errors sent by the server include a link to the server-side logs - associated with that error. This link is now exposed in the `serverLogURL` - property on `SyncError` (or `RLMServerLogURLKey` userInfo field when using NSError). - -### Fixed - -* Many sync and app errors were reported using undocumented internal error - codes and/or domains and could not be progammatically handled. Some notable - things which now have public error codes instead of unstable internal ones: - - `Realm.Error.subscriptionFailed`: The server rejected a flexible sync subscription. - - `AppError.invalidPassword`: A login attempt failed due to a bad password. - - `AppError.accountNameInUse`: A registration attempt failed due to the account name being in use. - - `AppError.httpRequestFailed`: A HTTP request to Atlas App Services - completed with an error HTTP code. The failing code is available in the - `httpStatusCode` property. - - Many other less common error codes have been added to `AppError`. - - All sync errors other than `SyncError.clientResetError` reported incorrect - error codes. - (since v10.0.0). -* `UserAPIKey.objectId` was incorrectly bridged to Swift as `RLMObjectId` to - `ObjectId`. This may produce warnings about an unneccesary cast if you were - previously casting it to the correct type (since v10.0.0). -* Fixed an assertion failure when observing change notifications on a sectioned - result, if the first modification was to a linked property that did not cause - the state of the sections to change. - ([Core #5912](https://github.com/realm/realm-core/issues/5912), - since the introduction of sectioned results in v10.29.0) -* Fix a use-after-free if the last external reference to an encrypted - synchronized Realm was closed between when a client reset error was received - and when the download of the new Realm began. - ([Core #5949](https://github.com/realm/realm-core/pull/5949), since 10.28.4). -* Fix an assertion failure during client reset with recovery when recovering - a list operation on an embedded object that has a link column in the path - prefix to the list from the top level object. - ([Core #5957](https://github.com/realm/realm-core/issues/5957), - since introduction of automatic recovery in v10.32.0). -* Creating a write transaction which is rejected by the server due to it - exceeding the maximum transaction size now results in a client reset error - instead of synchronization breaking and becoming stuck forever - ([Core #5209](https://github.com/realm/realm-core/issues/5209), since v10). -* Opening an unencrypted file with an encryption key would sometimes report a - misleading error message that indicated that the problem was something other - than a decryption failure ([Core #5915](https://github.com/realm/realm-core/pull/5915), since 0.89.0). -* Fix a rare deadlock which could occur when closing a synchronized Realm - immediately after committing a write transaction when the sync worker thread - has also just finished processing a changeset from the server - ([Core #5948](https://github.com/realm/realm-core/pull/5948)). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.0.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -### Internal - -* Upgraded realm-core from 12.9.0 to 12.11.0. - -10.32.0 Release notes (2022-10-10) -============================================================= - -### Enhancements - -* Add `.recoverUnsyncedChanges` (`RLMClientResetModeRecoverUnsyncedChanges`) and -`.recoverOrDiscardUnsyncedChanges` (`RLMClientResetModeRecoverOrDiscardUnsyncedChanges`) behaviors to `ClientResetMode` (`RLMClientResetMode`). - - The newly added recover modes function by downloading a realm which reflects the latest - state of the server after a client reset. A recovery process is run locally in an - attempt to integrate the server state with any local changes from before the - client reset occurred. - The changes are integrated with the following rules: - 1. Objects created locally that were not synced before client reset, will be integrated. - 2. If an object has been deleted on the server, but was modified on the client, the delete takes precedence and the update is discarded. - 3. If an object was deleted on the client, but not the server, then the client delete instruction is applied. - 4. In the case of conflicting updates to the same field, the client update is applied. - - The client reset process will fallback to `ClientResetMode.discardUnsyncedChanges` if the recovery process fails in `.recoverOrDiscardUnsyncedChanges`. - - The client reset process will fallback to `ClientResetMode.manual` if the recovery process fails in `.recoverUnsyncedChanges`. - - The two new swift recovery modes support client reset callbacks: `.recoverUnsyncedChanges(beforeReset: ((Realm) -> Void)? = nil, afterReset: ((Realm, Realm) -> Void)? = nil)`. - - The two new Obj-C recovery modes support client reset callbacks in `notifyBeforeReset` - and `notifyAfterReset`for both `[RLMUser configurationWithPartitionValue]` and `[RLMUser flexibleSyncConfigurationWithClientResetMode]` - For more detail on client reset callbacks, see `ClientResetMode`, `RLMClientResetBeforeBlock`, - `RLMClientResetAfterBlock`, and the 10.25.0 changelog entry. -* Add two new additional interfaces to define a manual client reset handler: - - Add a manual callback handler to `ClientResetMode.manual` -> `ClientResetMode.manual(ErrorReportingBlock? = nil)`. - - Add the `RLMSyncConfiguration.manualClientResetHandler` property (type `RLMSyncErrorReportingBlock`). - - These error reporting blocks are invoked in the event of a `RLMSyncErrorClientResetError`. - - See `ErrorReportingBlock` (`RLMSyncErrorReportingBlock`), and `ClientResetInfo` for more detail. - - Previously, manual client resets were handled only through the `SyncManager.ErrorHandler`. You have the - option, but not the requirement, to define manual reset handler in these interfaces. - Otherwise, the `SyncManager.ErrorHandler` is still invoked during the manual client reset process. - - These new interfaces are only invoked during a `RLMSyncErrorClientResetError`. All other sync errors - are still handled in the `SyncManager.ErrorHandler`. - - See 'Breaking Changes' for information how these interfaces interact with an already existing - `SyncManager.ErrorHandler`. - -### Breaking Changes - -* The default `clientResetMode` (`RLMClientResetMode`) is switched from `.manual` (`RLMClientResetModeManual`) - to `.recoverUnsyncedChanges` (`RLMClientResetModeRecoverUnsyncedChanges`). - - If you are currently using `.manual` and continue to do so, the only change - you must explicitly make is designating manual mode in - your `Realm.Configuration.SyncConfiguration`s, since they will now default to `.recoverUnsyncedChanges`. - - You may choose to define your manual client reset handler in the newly - introduced `manual(ErrorReportingBlock? = nil)` - or `RLMSyncConfiguration.manualClientResetHandler`, but this is not required. - The `SyncManager.errorHandler` will still be invoked during a client reset if - no callback is passed into these new interfaces. - -### Deprecations - -* `ClientResetMode.discardLocal` is deprecated in favor of `ClientResetMode.discardUnsyncedChanges`. - The reasoning is that the name better reflects the effect of this reset mode. There is no actual - difference in behavior. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.0.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -10.31.0 Release notes (2022-10-05) -============================================================= - -The prebuilt binary for Carthage is now build with Xcode 14.0.1. - -### Enhancements - -* Cut the runtime of aggregate operations on large dictionaries in half - ([Core #5864](https://github.com/realm/realm-core/pull/5864)). -* Improve performance of aggregate operations on collections of objects by 2x - to 10x ([Core #5864](https://github.com/realm/realm-core/pull/5864)). - Greatly improve the performance of sorting or distincting a Dictionary's keys - or values. The most expensive operation is now performed O(log N) rather than - O(N log N) times, and large Dictionaries can see upwards of 99% reduction in - time to sort. ([Core #5166](https://github.com/realm/realm-core/pulls/5166)) -* Add support for changing the deployment location for Atlas Apps. Previously - this was assumed to be immutable ([Core #5648](https://github.com/realm/realm-core/issues/5648)). -* The sync client will now yield the write lock to other threads which are - waiting to perform a write transaction even if it still has remaining work to - do, rather than always applying all changesets received from the server even - when other threads are trying to write. ([Core #5844](https://github.com/realm/realm-core/pull/5844)). -* The sync client no longer writes an unused temporary copy of the changesets - received from the server to the Realm file ([Core #5844](https://github.com/realm/realm-core/pull/5844)). - -### Fixed - -* Setting a `List` property with `Results` no longer throws an unrecognized - selector exception (since 10.8.0-beta.2) -* `RLMProgressNotificationToken` and `ProgressNotificationToken` now hold a - strong reference to the sync session, keeping it alive until the token is - deallocated or invalidated, as the other notification tokens do. - ([#7831](https://github.com/realm/realm-swift/issues/7831), since v2.3.0). -* Results permitted some nonsensical aggregate operations on column types which - do not make sense to aggregate, giving garbage results rather than reporting - an error ([Core #5876](https://github.com/realm/realm-core/pull/5876), since v5.0.0). -* Upserting a document in a Mongo collection would crash if the document's id - type was anything other than ObjectId (since v10.0.0). -* Fix a use-after-free when a sync session is closed and the app is destroyed - at the same time ([Core #5752](https://github.com/realm/realm-core/issues/5752), - since v10.19.0). - -### Deprecations - -* `RLMUpdateResult.objectId` has been deprecated in favor of - `RLMUpdateResult.documentId` to support reporting document ids which are not - object ids. -### Breaking Changes -* Private API `_realmColumnNames` has been renamed to a new public API - called `propertiesMapping()`. This change only affects the Swift API - and doesn't have any effects in the obj-c API. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.0.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -### Internal - -* Upgraded realm-core from 12.7.0 to 12.9.0 - -10.30.0 Release notes (2022-09-20) -============================================================= - -### Fixed - -* Incoming links from `RealmAny` properties were not handled correctly when - migrating an object type from top-level to embedded. `RealmAny` properties - currently cannot link to embedded objects. - ([Core #5796](https://github.com/realm/realm-core/pull/5796), since 10.8.0). -* `Realm.refresh()` sometimes did not actually advance to the latest version. - It attempted to be semi-non-blocking in a very confusing way which resulted - in it sometimes advancing to a newer version that is not the latest version, - and sometimes blocking until notifiers are ready so that it could advance to - the latest version. This behavior was undocumented and didn't work correctly, - so it now always blocks if needed to advance to the latest version. - ([#7625](https://github.com/realm/realm-swift/issues/7625), since v0.98.0). -* Fix the most common cause of thread priority inversions when performing - writes on the main thread. If beginning the write transaction has to wait for - the background notification calculations to complete, that wait is now done - in a QoS-aware way. ([#7902](https://github.com/realm/realm-swift/issues/7902)) -* Subscribing to link properties in a flexible sync Realm did not work due to a - mismatch between what the client sent and what the server needed. - ([Core #5409](https://github.com/realm/realm-core/issues/5409)) -* Attempting to use `AsymmetricObject` with partition-based sync now reports a - sensible error much earlier in the process. Asymmetric sync requires using - flexible sync. ([Core #5691](https://github.com/realm/realm-core/issues/5691), since 10.29.0). -* Case-insensitive but diacritic-sensitive queries would crash on 4-byte UTF-8 - characters ([Core #5825](https://github.com/realm/realm-core/issues/5825), since v2.2.0) -* Accented characters are now handled by case-insensitive but - diacritic-sensitive queries. ([Core #5825](https://github.com/realm/realm-core/issues/5825), since v2.2.0) - -### Breaking Changes - -* `-[RLMASLoginDelegate authenticationDidCompleteWithError:]` has been renamed - to `-[RLMASLoginDelegate authenticationDidFailWithError:]` to comply with new - app store requirements. This only effects the obj-c API. - ([#7945](https://github.com/realm/realm-swift/issues/7945)) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1 - 14. - -### Internal - -* Upgraded realm-core from 12.6.0 to 12.7.0 - -10.29.0 Release notes (2022-09-09) -============================================================= - -### Enhancements - -* Add support for asymmetric sync. When a class inherits from - `AsymmetricObject`, objects created are synced unidirectionally to the server - and cannot be queried or read locally. - -```swift - class PersonObject: AsymmetricObject { - @Persisted(primaryKey: true) var _id: ObjectId - @Persisted var name: String - @Persisted var age: Int - } - - try realm.write { - // This will create the object on the server but not locally. - realm.create(PersonObject.self, value: ["_id": ObjectId.generate(), - "name": "Dylan", - "age": 20]) - } -``` -* Add ability to section a collection which conforms to `RealmCollection`, `RLMCollection`. - Collections can be sectioned by a unique key retrieved from a keyPath or a callback and will return an instance of `SectionedResults`/`RLMSectionedResults`. - Each section in the collection will be an instance of `ResultsSection`/`RLMSection` which gives access to the elements corresponding to the section key. - `SectionedResults`/`RLMSectionedResults` and `ResultsSection`/`RLMSection` have the ability to be observed. - ```swift - class DemoObject: Object { - @Persisted var title: String - @Persisted var date: Date - var firstLetter: String { - return title.first.map(String.init(_:)) ?? "" - } - } - var sectionedResults: SectionedResults - // ... - sectionedResults = realm.objects(DemoObject.self) - .sectioned(by: \.firstLetter, ascending: true) - ``` -* Add `@ObservedSectionedResults` for SwiftUI support. This property wrapper type retrieves sectioned results - from a Realm using a keyPath or callback to determine the section key. - ```swift - struct DemoView: View { - @ObservedSectionedResults(DemoObject.self, - sectionKeyPath: \.firstLetter) var demoObjects - - var body: some View { - VStack { - List { - ForEach(demoObjects) { section in - Section(header: Text(section.key)) { - ForEach(section) { object in - MyRowView(object: object) - } - } - } - } - } - } - } - ``` -* Add automatic handing for changing top-level objects to embedded objects in - migrations. Any objects of the now-embedded type which have zero incoming - links are deleted, and objects with multiple incoming links are duplicated. - This happens after the migration callback function completes, so there is no - functional change if you already have migration logic which correctly handles - this. ([Core #5737](https://github.com/realm/realm-core/pull/5737)). -* Improve performance when a new Realm file connects to the server for the - first time, especially when significant amounts of data has been written - while offline. ([Core #5772](https://github.com/realm/realm-core/pull/5772)) -* Shift more of the work done on the sync worker thread out of the write - transaction used to apply server changes, reducing how long it blocks other - threads from writing. ([Core #5772](https://github.com/realm/realm-core/pull/5772)) -* Improve the performance of the sync changeset parser, which speeds up - applying changesets from the server. ([Core #5772](https://github.com/realm/realm-core/pull/5772)) - -### Fixed - -* Fix all of the UBSan failures hit by our tests. It is unclear if any of these - manifested as visible bugs. ([Core #5665](https://github.com/realm/realm-core/pull/5665)) -* Upload completion callbacks were sometimes called before the final step of - interally marking the upload as complete, which could result in calling - `Realm.writeCopy()` from the completion callback failing due to there being - unuploaded changes. ([Core #4865](https://github.com/realm/realm-core/issues/4865)). -* Writing to a Realm stored on an exFAT drive threw the exception "fcntl() with - F_BARRIERFSYNC failed: Inappropriate ioctl for device" when a write - transaction needed to expand the file. - ([Core #5789](https://github.com/realm/realm-core/issues/5789), since 10.27.0) -* Syncing a Decimal128 with big significand could result in a crash. - ([Core #5728](https://github.com/realm/realm-core/issues/5728)) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 RC. - -### Internal - -* Upgraded realm-core from 12.5.1 to 12.6.0 - -10.28.7 Release notes (2022-09-02) -============================================================= - -### Enhancements - -* Add prebuilt binaries for Xcode 14 to the release package. - -### Fixed - -* Fix archiving watchOS release builds with Xcode 14. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 6. - -10.28.6 Release notes (2022-08-19) -============================================================= - -### Fixed - -* Fixed an issue where having realm-swift as SPM sub-target dependency leads to - missing symbols error during iOS archiving ([Core #7645](https://github.com/realm/realm-core/pull/7645)). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 5. - -### Internal - -* Upgraded realm-core from 12.5.0 to 12.5.1 - -10.28.5 Release notes (2022-08-09) -============================================================= - -### Enhancements - -* Improve performance of accessing `SubscriptionSet` properties when no writes - have been made to the Realm since the last access. - -### Fixed - -* A use-after-free could occur if a Realm with audit events enabled was - destroyed while processing an upload completion for the events Realm on a - different thread. ([Core PR #5714](https://github.com/realm/realm-core/pull/5714)) -* Opening a read-only synchronized Realm for the first time via asyncOpen did - not set the schema version, which could lead to `m_schema_version != - ObjectStore::NotVersioned` assertion failures later on. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 4. - -### Internal - -* Upgraded realm-core from 12.4.0 to 12.5.0 - -10.28.4 Release notes (2022-08-03) -============================================================= - -### Enhancements - -* Add support for building arm64 watchOS when installing Realm via CocoaPods. -* Reduce the amount of virtual address space used - ([Core #5645](https://github.com/realm/realm-core/pull/5645)). - -### Fixed - -* Fix some warnings when building with Xcode 14 - ([Core #5577](https://github.com/realm/realm-core/pull/5577)). -* Fix compilation failures on watchOS platforms which do not support thread-local storage. - ([#7694](https://github.com/realm/realm-swift/issues/7694), [#7695](https://github.com/realm/realm-swift/issues/7695) since v10.21.1) -* Fix a data race when committing a transaction while multiple threads are - waiting to begin write transactions. This appears to not have caused any - functional problems. -* Fix a data race when writing audit events which could occur if the sync - client thread was busy with other work when the event Realm was opened. -* Fix some cases of running out of virtual address space (seen/reported as mmap - failures) ([Core #5645](https://github.com/realm/realm-core/pull/5645)). -* Audit event scopes containing only write events and no read events would - occasionally throw a `BadVersion` exception when a write transaction was - committed (since v10.26.0). -* The client reset callbacks for the DiscardLocal mode would be passed invalid - Realm instances if the callback was invoked at a point where the Realm was - not otherwise open. ([Core #5654](https://github.com/realm/realm-core/pull/5654), since the introduction of DiscardLocal reset mode in v10.25.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 4. - -### Internal - -* Upgraded realm-core from 12.3.0 to 12.4.0. - -10.28.3 Release notes (2022-07-27) -============================================================= - -### Enhancements - -* Greatly improve the performance of obtaining cached Realm instances in Swift - when using a sync configuration. - -### Fixed - -* Add missing `initialSubscription` and `rerunOnOpen` to copyWithZone method on - `RLMRealmConfiguration`. This resulted in incorrect values when using - `RLMRealmConfiguration.defaultConfiguration`. -* The sync error handler did not hold a strong reference to the sync session - while dispatching the error from the worker thread to the main thread, - resulting in the session passed to the error handler being invalid if there - were no other remaining strong references elsewhere. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 3. - -10.28.2 Release notes (2022-06-30) -============================================================= - -### Fixed - -* Using `seedFilePath` threw an exception if the Realm file being opened - already existed ([#7840](https://github.com/realm/realm-swift/issues/7840), - since v10.26.0). -* The `intialSubscriptions` callback was invoked every time a Realm was opened - regardless of the value of `rerunOnOpen` and if the Realm was already open on - another thread (since v10.28.0). -* Allow using `RLMSupport.Swift` from RealmSwift's Cocoapods - ([#6886](https://github.com/realm/realm-swift/pull/6886)). -* Fix a UBSan failure when mapping encrypted pages. Fixing this did not change - the resulting assembly, so there were probably no functional problems - resulting from this (since v5.0.0). -* Improved performance of sync clients during integration of changesets with - many small strings (totalling > 1024 bytes per changeset) on iOS 14, and - devices which have restrictive or fragmented memory. - ([Core #5614](https://github.com/realm/realm-core/issues/5614)) -* Fix a data race when opening a flexible sync Realm (since v10.28.0). -* Add a missing backlink removal when assigning null or a non-link value to an - `AnyRealmValue` property which previously linked to an object. - This could have resulted in "key not found" exceptions or assertion failures - such as `mixed.hpp:165: [realm-core-12.1.0] Assertion failed: m_type` when - removing the destination link object. - ([Core #5574](https://github.com/realm/realm-core/pull/5573), since the introduction of AnyRealmValue in v10.8.0) - -### Compatibility - -* Realm Studio: 12.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 2. - -### Internal - -* Upgraded realm-core from 12.1.0 to 12.3.0. - -10.28.1 Release notes (2022-06-10) -============================================================= - -### Enhancements - -* Add support for Xcode 14. When building with Xcode 14, the minimum deployment - target is now iOS 11. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 1. - -10.28.0 Release notes (2022-06-03) -============================================================= - -### Enhancements - -* Replace mentions of 'MongoDB Realm' with 'Atlas App Services' in the documentation and update appropriate links to documentation. -* Allow adding a subscription querying for all documents of a type in swift for flexible sync. -``` - try await subscriptions.update { - subscriptions.append(QuerySubscription(name: "all_people")) - } -``` -* Add Combine API support for flexible sync beta. -* Add an `initialSubscriptions` parameter when retrieving the flexible sync configuration from a user, - which allows to specify a subscription update block, to bootstrap a set of flexible sync subscriptions - when the Realm is first opened. - There is an additional optional parameter flag `rerunOnOpen`, which allows to run this initial - subscriptions on every app startup. - -```swift - let config = user.flexibleSyncConfiguration(initialSubscriptions: { subs in - subs.append(QuerySubscription(name: "people_10") { - $0.age > 10 - }) - }, rerunOnOpen: true) - let realm = try Realm(configuration: config) -``` -* The sync client error handler will report an error, with detailed info about which object caused it, when writing an object to a flexible sync Realm outside of any query subscription. ([#5528](https://github.com/realm/realm-core/pull/5528)) -* Adding an object to a flexible sync Realm for a type that is not within a query subscription will now throw an exception. ([#5488](https://github.com/realm/realm-core/pull/5488)). - -### Fixed - -* Flexible Sync query subscriptions will correctly complete when data is synced to the local Realm. ([#5553](https://github.com/realm/realm-core/pull/5553), since v12.0.0) - -### Breaking Changes - -* Rename `SyncSubscriptionSet.write` to `SyncSubscriptionSet.update` to avoid confusion with `Realm.write`. -* Rename `SyncSubscription.update` to `SyncSubscription.updateQuery` to avoid confusion with `SyncSubscriptionSet.update`. -* Rename `RLMSyncSubscriptionSet.write` to `RLMSyncSubscriptionSet.update` to align it with swift API. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-13.4. - -### Internal - -* Upgraded realm-core from 12.0.0 to 12.1.0. - -10.27.0 Release notes (2022-05-26) -============================================================= - -### Enhancements - -* `@AsyncOpen`/`@AutoOpen` property wrappers can be used with flexible sync. - -### Fixed - -* When installing via SPM, debug builds could potentially hit an assertion - failure during flexible sync bootstrapping. ([Core #5527](https://github.com/realm/realm-core/pull/5527)) -* Flexible sync now only applies bootstrap data if the entire bootstrap is - received. Previously orphaned objects could result from the read snapshot on - the server changing. ([Core #5331](https://github.com/realm/realm-core/pull/5331)) -* Partially fix a performance regression in write performance introduced in - v10.21.1. v10.21.1 fixed a case where a kernel panic or device's battery - dying at the wrong point in a write transaction could potentially result in a - corrected Realm file, but at the cost of a severe performance hit. This - version adjusts how file synchronization is done to provide the same safety - at a much smaller performance hit. ([#7740](https://github.com/realm/realm-swift/issues/7740)). - -### Compatibility - -* Realm Studio: 11.0.0 or later (but see note below). -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-13.4. - -### Internal - -* Upgraded realm-core from 11.17.0 to 12.0.0. -* Bump the version number for the lockfile used for interprocess - synchronization. This has no effect on persistent data, but means that - versions of Realm which use pre-12.0.0 realm-core cannot open Realm files at - the same time as they are opened by this version. Notably this includes Realm - Studio, and v11.1.2 (the latest at the time of this release) cannot open - Realm files which are simultaneously open in the simulator. - -10.26.0 Release notes (2022-05-19) -============================================================= - -Xcode 13.1 is now the minimum supported version of Xcode, as Apple no longer -allows submitting to the app store with Xcode 12. - -### Enhancements - -* Add Xcode 13.4 binaries to the release package. -* Add Swift API for asynchronous transactions -```swift - try? realm.writeAsync { - realm.create(SwiftStringObject.self, value: ["string"]) - } onComplete: { error in - // optional handling on write complete - } - - try? realm.beginAsyncWrite { - realm.create(SwiftStringObject.self, value: ["string"]) - realm.commitAsyncWrite() - } - - let asyncTransactionId = try? realm.beginAsyncWrite { - // ... - } - try! realm.cancelAsyncWrite(asyncTransactionId) -``` -* Add Obj-C API for asynchronous transactions -``` - [realm asyncTransactionWithBlock:^{ - [StringObject createInRealm:realm withValue:@[@"string"]]; - } onComplete:^(NSError *error) { - // optional handling - }]; - - [realm beginAsyncWriteTransaction:^{ - [StringObject createInRealm:realm withValue:@[@"string"]]; - [realm commitAsyncWriteTransaction]; - }]; - - RLMAsyncTransactionId asyncTransactionId = [realm beginAsyncWriteTransaction:^{ - // ... - }]; - [realm cancelAsyncTransaction:asyncTransactionId]; -``` -* Improve performance of opening a Realm with `objectClasses`/`objectTypes` set - in the configuration. -* Implement the Realm event recording API for reporting reads and writes on a - Realm file to Atlas. - -### Fixed - -* Lower minimum OS version for `async` login and FunctionCallables to match the - rest of the `async` functions. ([#7791]https://github.com/realm/realm-swift/issues/7791) -* Consuming a RealmSwift XCFramework with library evolution enabled would give the error - `'Failed to build module 'RealmSwift'; this SDK is not supported by the compiler'` - when the XCFramework was built with an older XCode version and is - then consumed with a later version. ([#7313](https://github.com/realm/realm-swift/issues/7313), since v3.18.0) -* A data race would occur when opening a synchronized Realm with the client - reset mode set to `discardLocal` on one thread at the same time as a client - reset was being processed on another thread. This probably did not cause any - functional problems in practice and the broken timing window was very tight (since 10.25.0). -* If an async open of a Realm triggered a client reset, the callbacks for - `discardLocal` could theoretically fail to be called due to a race condition. - The timing for this was probably not possible to hit in practice (since 10.25.0). -* Calling `[RLMRealm freeze]`/`Realm.freeze` on a Realm which had been created from `writeCopy` - would not produce a frozen Realm. ([#7697](https://github.com/realm/realm-swift/issues/7697), since v5.0.0) -* Using the dynamic subscript API on unmanaged objects before first opening a - Realm or if `objectTypes` was set when opening a Realm would throw an - exception ([#7786](https://github.com/realm/realm-swift/issues/7786)). -* The sync client may have sent a corrupted upload cursor leading to a fatal - error from the server due to an uninitialized variable. - ([#5460](https://github.com/realm/realm-core/pull/5460), since v10.25.1) -* Flexible sync would not correctly resume syncing if a bootstrap was interrupted - ([#5466](https://github.com/realm/realm-core/pull/5466), since v10.21.1). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-13.4. - -### Internal - -* Upgraded realm-core from v11.15.0 to v11.17.0 - -10.25.2 Release notes (2022-04-27) -============================================================= - -### Enhancements - -* Replace Xcode 13.3 binaries with 13.3.1 binaries. - -### Fixed - -* `List` would contain an invalidated object instead of null when - the object linked to was deleted by a difference sync client - ([Core #5215](https://github.com/realm/realm-core/pull/5215), since v10.8.0). -* Adding an object to a Set, deleting the parent object of the Set, and then - deleting the object which was added to the Set would crash - ([Core #5387](https://github.com/realm/realm-core/issues/5387), since v10.8.0). -* Synchronized Realm files which were first created using v10.0.0-beta.3 would - be redownloaded instead of using the existing file, possibly resulting in the - loss of any unsynchronized data in those files (since v10.20.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3.1. - -### Internal - -* Upgraded realm-core from v11.14.0 to v11.15.0 - -10.25.1 Release notes (2022-04-11) -============================================================= - -### Fixed - -* Fixed various memory corruption bugs when encryption is used caused by not - locking a mutex when needed. - ([#7640](https://github.com/realm/realm-swift/issues/7640), [#7659](https://github.com/realm/realm-swift/issues/7659), since v10.21.1) -* Changeset upload batching did not calculate the accumulated size correctly, - resulting in “error reading body failed to read: read limited at 16777217 - bytes” errors from the server when writing large amounts of data - ([Core #5373](https://github.com/realm/realm-core/pull/5373), since 10.25.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3. - -### Internal - -* Upgraded realm-core from v11.13.0 to v11.14.0. - -10.25.0 Release notes (2022-03-29) -============================================================= - -Synchronized Realm files written by this version cannot be opened by older -versions of Realm. Existing files will be automatically upgraded when opened. - -Non-synchronized Realm files remain backwards-compatible. - -### Enhancements - -* Add ability to use Swift Query syntax in `@ObservedResults`, which allows you - to filter results using the `where` parameter. -* Add ability to use `MutableSet` with `StateRealmObject` in SwiftUI. -* Async/Await extensions are now compatible with iOS 13 and above when building - with Xcode 13.3. -* Sync changesets waiting to be uploaded to the server are now compressed, - reducing the disk space needed when large write transactions are performed - while offline or limited in bandwidth.([Core #5260](https://github.com/realm/realm-core/pull/5260)). -* Added new `SyncConfiguration.clientResetMode` and `RLMSyncConfiguration.clientResetMode` properties. - - The values of these properties will dictate client behavior in the event of a [client reset](https://docs.mongodb.com/realm/sync/error-handling/client-resets/). - - See below for information on `ClientResetMode` values. - - `clientResetMode` defaults to `.manual` if not set otherwise. -* Added new `ClientResetMode` and `RLMClientResetMode` enums. - - These enums represent possible client reset behavior for `SyncConfiguration.clientResetMode` and `RLMSyncConfiguration.clientResetMode`, respectively. - - `.manual` and `RLMClientResetModeManual` - - The local copy of the Realm is copied into a recovery - directory for safekeeping, and then deleted from the original location. The next time - the Realm for that partition value is opened, the Realm will automatically be re-downloaded from - MongoDB Realm, and can be used as normal. - - Data written to the Realm after the local copy of the Realm diverged from the backup - remote copy will be present in the local recovery copy of the Realm file. The - re-downloaded Realm will initially contain only the data present at the time the Realm - was backed up on the server. - - `rlmSync_clientResetBackedUpRealmPath` and `SyncError.clientResetInfo()` are used for accessing the recovery directory. - - `.discardLocal` and `RLMClientResetDiscardLocal` - - All unsynchronized local changes are automatically discarded and the local state is - automatically reverted to the most recent state from the server. Unsynchronized changes - can then be recovered in a post-client-reset callback block (See changelog below for more details). - - If RLMClientResetModeDiscardLocal is enabled but the client reset operation is unable to complete - then the client reset process reverts to manual mode. - - The realm's underlying object accessors remain bound so the UI may be updated in a non-disruptive way. -* Added support for client reset notification blocks for `.discardLocal` and `RLMClientResetDiscardLocal` - - **RealmSwift implementation**: `discardLocal(((Realm) -> Void)? = nil, ((Realm, Realm) -> Void)? = nil)` - - RealmSwift client reset blocks are set when initializing the user configuration - ```swift - var configuration = user.configuration(partitionValue: "myPartition", clientResetMode: .discardLocal(beforeClientResetBlock, afterClientResetBlock)) - ``` - - The before client reset block -- `((Realm) -> Void)? = nil` -- is executed prior to a client reset. Possible usage includes: - ```swift - let beforeClientResetBlock: (Realm) -> Void = { beforeRealm in - var recoveryConfig = Realm.Configuration() - recoveryConfig.fileURL = myRecoveryPath - do { - beforeRealm.writeCopy(configuration: recoveryConfig) - /* The copied realm could be used later for recovery, debugging, reporting, etc. */ - } catch { - /* handle error */ - } - } - ``` - - The after client reset block -- `((Realm, Realm) -> Void)? = nil)` -- is executed after a client reset. Possible usage includes: - ```Swift - let afterClientResetBlock: (Realm, Realm) -> Void = { before, after in - /* This block could be used to add custom recovery logic, back-up a realm file, send reporting, etc. */ - for object in before.objects(myClass.self) { - let res = after.objects(myClass.self) - if (res.filter("primaryKey == %@", object.primaryKey).first != nil) { - /* ...custom recovery logic... */ - } else { - /* ...custom recovery logic... */ - } - } - ``` - - **Realm Obj-c implementation**: Both before and after client reset callbacks exist as properties on `RLMSyncConfiguration` and are set at initialization. - ```objective-c - RLMRealmConfiguration *config = [user configurationWithPartitionValue:partitionValue - clientResetMode:RLMClientResetModeDiscardLocal - notifyBeforeReset:beforeBlock - notifyAfterReset:afterBlock]; - ``` - where `beforeBlock` is of type `RLMClientResetBeforeBlock`. And `afterBlock` is of type `RLMClientResetAfterBlock`. - -### Breaking Changes - -* Xcode 13.2 is no longer supported when building with Async/Await functions. Use - Xcode 13.3 to build with Async/Await functionality. - -### Fixed - -* Adding a Realm Object to a `ObservedResults` or a collections using - `StateRealmObject` that is managed by the same Realm would throw if the - Object was frozen and not thawed before hand. -* Setting a Realm Configuration for @ObservedResults using it's initializer - would be overrode by the Realm Configuration stored in - `.environment(\.realmConfiguration, ...)` if they did not match - ([Cocoa #7463](https://github.com/realm/realm-swift/issues/7463), since v10.6.0). -* Fix searchable component filter overriding the initial filter on `@ObservedResults`, (since v10.23.0). -* Comparing `Results`, `LinkingObjects` or `AnyRealmCollection` when using Realm via XCFramework - would result in compile time errors ([Cocoa #7615](https://github.com/realm/realm-swift/issues/7615), since v10.21.0) -* Opening an encrypted Realm while the keychain is locked on macOS would crash - ([#7438](https://github.com/realm/realm-swift/issues/7438)). -* Updating subscriptions while refreshing the access token would crash - ([Core #5343](https://github.com/realm/realm-core/issues/5343), since v10.22.0) -* Fix several race conditions in `SyncSession` related to setting - `customRequestHeaders` while using the `SyncSession` on a different thread. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3. - -### Internal - -* Upgraded realm-core from v11.12.0 to v11.13.0 - -10.24.2 Release notes (2022-03-18) -============================================================= - -### Fixed - -* Application would sometimes crash with exceptions like 'KeyNotFound' or - assertion "has_refs()". Other issues indicating file corruption may also be - fixed by this. The one mentioned here is the one that lead to solving the - problem. - ([Core #5283](https://github.com/realm/realm-core/issues/5283), since v5.0.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3. - -### Internal - -* Upgraded realm-core from 11.11.0 to 11.12.0 - -10.24.1 Release notes (2022-03-14) -============================================================= - -Switch to building the Carthage binary with Xcode 13.3. This release contains -no functional changes from 10.24.0. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3. - -10.24.0 Release notes (2022-03-05) -============================================================= - -### Enhancements - -* Add ability to use Swift Query syntax in `@ObservedResults`, which allows you - to filter results using the `where` parameter. - -### Fixed - -* If a list of objects contains links to objects not included in the - synchronized partition, collection change notifications for that list could - be incorrect ([Core #5164](https://github.com/realm/realm-core/issues/5164), since v10.0.0). -* Adding a new flexible sync subscription could crash with - "Assertion failed: !m_unbind_message_sent" in very specific timing scenarios - ([Core #5149](https://github.com/realm/realm-core/pull/5149), since v10.22.0). -* Converting floats/doubles into Decimal128 would yield imprecise results - ([Core #5184](https://github.com/realm/realm-core/pull/5184), since v10.0.0) -* Using accented characters in class and field names in a synchronized Realm - could result in sync errors ([Core #5196](https://github.com/realm/realm-core/pull/5196), since v10.0.0). -* Calling `Realm.invalidate()` from inside a Realm change notification could - result in the write transaction which produced the notification not being - persisted to disk (since v10.22.0). -* When a client reset error which results in the current Realm file being - backed up and then deleted, deletion errors were ignored as long as the copy - succeeded. When this happens the deletion of the old file is now scheduled - for the next launch of the app. ([Core #5180](https://github.com/realm/realm-core/issues/5180), since v2.0.0) -* Fix an error when compiling a watchOS Simulator target not supporting - Thread-local storage ([#7623](https://github.com/realm/realm-swift/issues/7623), since v10.21.0). -* Add a validation check to report a sensible error if a Realm configuration - indicates that an in-memory Realm should be encrypted. ([Core #5195](https://github.com/realm/realm-core/issues/5195)) -* The Swift package set the linker flags on the wrong target, resulting in - linker errors when SPM decides to build the core library as a dynamic library - ([#7266](https://github.com/realm/realm-swift/issues/7266)). -* The download-core task failed if run in an environment without TMPDIR set - ([#7688](https://github.com/realm/realm-swift/issues/7688), since v10.23.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3 beta 3. - -### Internal - -* Upgraded realm-core from 11.9.0 to 11.11.0 - -10.23.0 Release notes (2022-02-28) -============================================================= - -### Enhancements - -* Add `Realm.writeCopy(configuration:)`/`[RLMRealm writeCopyForConfiguration:]` which gives the - following functionality: - - Export a local non-sync Realm to be used with MongoDB Realm Sync - when the configuration is derived from a sync `RLMUser`/`User`. - - Write a copy of a local Realm to a destination specified in the configuration. - - Write a copy of a synced Realm in use with user A, and open it with user B. - - Note that migrations may be required when using a local realm configuration to open a realm file that - was copied from a synchronized realm. - - An exception will be thrown if a Realm exists at the destination. -* Add a `seedFilePath` option to `RLMRealmConfiguration` and `Configuration`. If this - option is set then instead of creating an empty Realm, the realm at the `seedFilePath` will - be copied to the `fileURL` of the new Realm. If a Realm file already exists at the - desitnation path, the seed file will not be copied and the already existing Realm - will be opened instead. Note that to use this parameter with a synced Realm configuration - the seed Realm must be appropriately copied to a destination with - `Realm.writeCopy(configuration:)`/`[RLMRealm writeCopyForConfiguration:]` first. -* Add ability to permanently delete a User from a MongoDB Realm app. This can - be invoked with `User.delete()`/`[RLMUser deleteWithCompletion:]`. -* Add `NSCopying` conformance to `RLMDecimal128` and `RLMObjectId`. -* Add Xcode 13.3 binaries to the release package (and remove 13.0). - -### Fixed - -* Add support of arm64 in Carthage build ([#7154](https://github.com/realm/realm-cocoa/issues/7154) -* Adding missing support for `IN` queries to primitives types on Type Safe Queries. - ```swift - let persons = realm.objects(Person.self).where { - let acceptableNames = ["Tom", "James", "Tyler"] - $0.name.in([acceptableNames]) - } - ``` - ([Cocoa #7633](https://github.com/realm/realm-swift/issues/7633), since v10.19.0) -* Work around a compiler crash when building with Swift 5.6 / Xcode 13.3. - CustomPersistable's PersistedType must now always be a built-in type rather - than possibly another CustomPersistable type as Swift 5.6 has removed support - for infinitely-recursive associated types ([#7654](https://github.com/realm/realm-swift/issues/7654)). -* Fix redundant call to filter on `@ObservedResults` from `searchable` - component (since v10.19.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3 beta 3. - -10.22.0 Release notes (2022-01-25) -============================================================= - -### Enhancements - -* Add beta support for flexible sync. See the [backend](https://docs.mongodb.com/realm/sync/data-access-patterns/flexible-sync/) and [SDK](https://docs.mongodb.com/realm/sdk/swift/examples/flexible-sync/) documentation for more information. Please report any issues with the beta through Github. - -### Fixed - -* UserIdentity metadata table grows indefinitely. ([#5152](https://github.com/realm/realm-core/issues/5152), since v10.20.0) -* We now report a useful error message when opening a sync Realm in non-sync mode or vice-versa.([#5161](https://github.com/realm/realm-core/pull/5161), since v5.0.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.2.1. - -### Internal - -* Upgraded realm-core from 11.8.0 to 11.9.0 - -10.21.1 Release notes (2022-01-12) -============================================================= - -### Fixed - -* The sync client will now drain the receive queue when a send fails with - ECONNRESET, ensuring that any error message from the server gets received and - processed. ([#5078](https://github.com/realm/realm-core/pull/5078)) -* Schema validation was missing for embedded objects in sets, resulting in an - unhelpful error being thrown if a Realm object subclass contained one (since v10.0.0). -* Opening a Realm with a schema that has an orphaned embedded object type - performed an extra empty write transaction (since v10.0.0). -* Freezing a Realm with a schema that has orphaned embedded object types threw - a "Wrong transactional state" exception (since v10.19.0). -* `@sum` and `@avg` queries on Dictionaries of floats or doubles used too much - precision for intermediates, resulting in incorrect rounding (since v10.5.0). -* Change the exception message for calling refresh on an immutable Realm from - "Continuous transaction through DB object without history information." to - "Can't refresh a read-only Realm." - ([#5061](https://github.com/realm/realm-core/issues/5061), since v10.8.0). -* Queries of the form "link.collection.@sum = 0" where `link` is null matched - when `collection` was a List or Set, but not a Dictionary - ([#5080](https://github.com/realm/realm-core/pull/5080), since v10.8.0). -* Types which require custom obj-c bridging (such as `PersistableEnum` or - `CustomPersistable`) would crash with exceptions mentioning `__SwiftValue` in - a variety of places on iOS versions older than iOS 14 - ([#7604](https://github.com/realm/realm-swift/issues/7604), since v10.21.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.2.1. - -### Internal - -* Upgraded realm-core from 11.6.1 to 11.8.0. - -10.21.0 Release notes (2022-01-10) -============================================================= - -### Enhancements - -* Add `metadata` property to `RLMUserProfile`/`UserProfile`. -* Add class `Projection` to allow creation of light weight view models out of Realm Objects. -```swift -public class Person: Object { - @Persisted var firstName = "" - @Persisted var lastName = "" - @Persisted var address: Address? = nil - @Persisted var friends = List() -} - -public class Address: EmbeddedObject { - @Persisted var city: String = "" - @Persisted var country = "" -} - -class PersonProjection: Projection { - // `Person.firstName` will have same name and type - @Projected(\Person.firstName) var firstName - // There will be the only String for `city` of the original object `Address` - @Projected(\Person.address.city) var homeCity - // List will be mapped to list of firstNames - @Projected(\Person.friends.projectTo.firstName) var firstFriendsName: ProjectedCollection -} - -// `people` will contain projections for every `Person` object in the `realm` -let people: Results = realm.objects(PersonProjection.self) -``` -* Greatly improve performance of reading AnyRealmValue and enum types from - Realm collections. -* Allow using Swift enums which conform to `PersistableEnum` as the value type - for all Realm collections. -* `AnyRealmCollection` now conforms to `Encodable`. -* AnyRealmValue and PersistableEnum values can now be passed directly to an - NSPredicate used in a filter() call rather than having to pass the rawValue - (the rawValue is still allowed). -* Queries on collections of PersistableEnums can now be performed with `where()`. -* Add support for querying on the rawValue of an enum with `where()`. -* `.count` is supported for Maps of all types rather than just numeric types in `where()`. -* Add support for querying on the properties of objects contained in - dictionaries (e.g. "dictProperty.@allValues.name CONTAINS 'a'"). -* Improve the error message for many types of invalid predicates in queries. -* Add support for comparing `@allKeys` to another property on the same object. -* Add `Numeric` conformance to `Decimal128`. -* Make some invalid property declarations such as `List` a - compile-time error instead of a runtime error. -* Calling `.sorted(byKeyPath:)` on a collection with an Element type which does - not support sorting by keypaths is now a compile-time error instead of a - runtime error. -* `RealmCollection.sorted(ascending:)` can now be called on all - non-Object/EmbeddedObject collections rather than only ones where the - `Element` conforms to `Comparable`. -* Add support for using user-defined types with `@Persistable` and in Realm - collections by defining a mapping to and from a type which Realm knows how to - store. For example, `URL` can be made persistable with: - ```swift - extension URL: FailableCustomPersistable { - // Store URL values as a String in Realm - public typealias PersistedType = String - // Convert a String to a URL - public init?(persistedValue: String) { self.init(string: persistedValue) } - // Convert a URL to a String - public var persistableValue: String { self.absoluteString } - } - ``` - After doing this, `@Persisted var url: URL` is a valid property declaration - on a Realm object. More advanced mappings can be done by mapping to an - EmbeddedObject which can store multiple values. - -### Fixed - -* Accessing a non object collection inside a migration would cause a crash -* [#5633](https://github.com/realm/realm-cocoa/issues/5633). -* Accessing a `Map` of objects dynamically would not handle nulled values correctly (since v10.8.0). -* `where()` allowed constructing some nonsensical queries due to boolean - comparisons returning `Query` rather than `Query` (since v10.19.0). -* `@allValues` queries on dictionaries accidentally did not require "ANY". -* Case-insensitive and diacritic-insensitive modifiers were ignored when - comparing the result of an aggregate operation to another property in a - query. -* `Object.init(value:)` did not allow initializing `RLMDictionary`/`Map` - properties with null values for map entries (since v10.8.0). -* `@ObservedResults` did not refresh when changes were made to the observed - collection. (since v10.6.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.2.1. - -10.20.1 Release notes (2021-12-14) -============================================================= - -Xcode 12.4 is now the minimum supported version of Xcode. - -### Fixed - -* Add missing `Indexable` support for UUID. - ([Cocoa #7545](https://github.com/realm/realm-swift/issues/7545), since v10.10.0) - -### Breaking Changes - -* All `async` functions now require Xcode 13.2 to work around an App - Store/TestFlight bug that results in apps built with 13.0/13.1 which do not - use libConcurrency but link a library which does crashing on startup. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.2. - -10.20.0 Release notes (2021-11-16) -============================================================= - -### Enhancements - -* Conform `@ThreadSafe` and `ThreadSafeReference` to `Sendable`. -* Allow using Swift enums which conform to `PersistableEnum` as the value type - for all Realm collections. -* `AnyRealmCollection` now conforms to `Encodable`. -* Greatly improve performance of reading AnyRealmValue and enum types from - Realm collections. -* `AnyRealmCollection` now conforms to `Encodable`. - -### Fixed - -* `@AutoOpen` will open the existing local Realm file on any connection error - rather than only when the connection specifically times out. -* Do not allow `progress` state changes for `@AutoOpen` and `@AsyncOpen` after - changing state to `open(let realm)` or `error(let error)`. -* Logging out a sync user failed to remove the local Realm file for partitions - with very long partition values that would have exceeded the maximum path - length. ([Core #4187](https://github.com/realm/realm-core/issues/4187), since v10.0.0) -* Don't keep trying to refresh the access token if the client's clock is more - than 30 minutes fast. ([Core #4941](https://github.com/realm/realm-core/issues/4941)) -* Failed auth requests used a fixed long sleep rather than exponential backoff - like other sync requests, which could result in very delayed reconnects after - a device was offline long enough for the access token to expire (since v10.0.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.1. - -### Internal - -* Upgraded realm-core from 11.6.0 to 11.6.1. - -10.19.0 Release notes (2021-11-04) -============================================================= - -### Enhancements - -* Add `.searchable()` SwiftUI View Modifier which allows filtering - `@ObservedResult` results from a search field component by a key path. - ```swift - List { - ForEach(reminders) { reminder in - ReminderRowView(reminder: reminder) - } - }.searchable(text: $searchFilter, - collection: $reminders, - keyPath: \.name) { - ForEach(reminders) { remindersFiltered in - Text(remindersFiltered.name).searchCompletion(remindersFiltered.name) - } - } - ``` -* Add an API for a type safe query syntax. This allows you to filter a Realm - and collections managed by a Realm with Swift style expressions. Here is a - brief example: - ```swift - class Person: Object { - @Persisted var name: String - @Persisted var hobbies: MutableSet - @Persisted var pets: List - } - class Pet: Object { - @Persisted var name: String - @Persisted var age: Int - } - - let persons = realm.objects(Person.self).where { - $0.hobbies.contains("music") || $0.hobbies.contains("baseball") - } - - persons = realm.objects(Person.self).where { - ($0.pets.age >= 2) && $0.pets.name.starts(with: "L") - } - ``` - ([#7419](https://github.com/realm/realm-swift/pull/7419)) -* Add support for dictionary subscript expressions - (e.g. `"phoneNumbers['Jane'] == '123-3456-123'"`) when querying with an - NSPredicate. -* Add UserProfile to User. This contains metadata from social logins with MongoDB Realm. -* Slightly reduce the peak memory usage when processing sync changesets. - -### Fixed - -* Change default request timeout for `RLMApp` from 6 seconds to 60 seconds. -* Async `Realm` init would often give a Realm instance which could not actually - be used and would throw incorrect thread exceptions. It now is `@MainActor` - and gives a Realm instance which always works on the main actor. The - non-functional `queue:` parameter has been removed (since v10.15.0). -* Restore the pre-v10.12.0 behavior of calling `writeCopy()` on a synchronized - Realm which produced a local non-synchronized Realm - ([#7513](https://github.com/realm/realm-swift/issues/7513)). -* Decimal128 did not properly normalize the value before hashing and so could - have multiple values which are equal but had different hash values (since v10.8.0). -* Fix a rare assertion failure or deadlock when a sync session is racing to - close at the same time that external reference to the Realm is being - released. ([Core #4931](https://github.com/realm/realm-core/issues/4931)) -* Fix a assertion failure when opening a sync Realm with a user who had been - removed. Instead an exception will be thrown. ([Core #4937](https://github.com/realm/realm-core/issues/4937), since v10.0.0) -* Fixed a rare segfault which could trigger if a user was being logged out - while the access token refresh response comes in. - ([Core #4944](https://github.com/realm/realm-core/issues/4944), since v10.0.0) -* Fixed a bug where progress notifiers on an AsyncOpenTask could be called - after the open completed. ([Core #4919](https://github.com/realm/realm-core/issues/4919)) -* SecureTransport was not enabled for macCatalyst builds when installing via - SPM, resulting in `'SSL/TLS protocol not supported'` exceptions when using - Realm Sync. ([#7474](https://github.com/realm/realm-swift/issues/7474)) -* Users were left in the logged in state when their refresh token expired. - ([Core #4882](https://github.com/realm/realm-core/issues/4882), since v10) -* Calling `.count` on a distinct collection would return the total number of - objects in the collection rather than the distinct count the first time it is - called. ([#7481](https://github.com/realm/realm-swift/issues/7481), since v10.8.0). -* `realm.delete(collection.distinct(...))` would delete all objects in the - collection rather than just the first object with each distinct value in the - property being distincted on, unless the distinct Results were read from at - least once first (since v10.8.0). -* Calling `.distinct()` on a collection, accessing the Results, then passing - the Results to `realm.delete()` would delete the correct objects, but - afterwards report a count of zero even if there were still objects in the - Results (since v10.8.0). -* Download compaction could result in non-streaming sync download notifiers - never reporting completion (since v10.0.0, - [Core #4989](https://github.com/realm/realm-core/pull/4989)). -* Fix a deadlock in SyncManager that was probably not possible to hit in - real-world code (since v10.0.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.2. - -### Internal - -* Upgraded realm-core from v11.4.1 to v11.6.0 - -10.18.0 Release notes (2021-10-25) -============================================================= - -### Enhancements - -* Add support for using multiple users with `@AsyncOpen` and `@AutoOpen`. - Setting the current user to a new user will now automatically reopen the - Realm with the new user. -* Add prebuilt binary for Xcode 13.1 to the release package. - -### Fixed - -* Fix `@AsyncOpen` and `@AutoOpen` using `defaultConfiguration` by default if - the user's doesn't provide one, will set an incorrect path which doesn't - correspond to the users configuration one. (since v10.12.0) -* Adding missing subscription completion for `AsyncOpenPublisher` after - successfully returning a realm. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.1. - -10.17.0 Release notes (2021-10-06) -============================================================= - -### Enhancements - -* Add a new `@ThreadSafe` property wrapper. Objects and collections wrapped by `@ThreadSafe` may be passed between threads. It's - intended to allow local variables and function parameters to be used across - threads when needed. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.0. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0. - -10.16.0 Release notes (2021-09-29) -============================================================= - -### Enhancements - -* Add `async` versions of `EmailPasswordAuth.callResetPasswordFunction` and -r `User.linkUser` methods. -* Add `async` version of `MongoCollection` methods. -* Add `async` support for user functions. - -### Fixed - -* A race condition in Realm.asyncOpen() sometimes resulted in subsequent writes - from Realm Sync failing to produce notifications - ([#7447](https://github.com/realm/realm-swift/issues/7447), - [#7453](https://github.com/realm/realm-swift/issues/7453), - [Core #4909](https://github.com/realm/realm-core/issues/4909), since v10.15.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.0. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0. - -10.15.1 Release notes (2021-09-15) -============================================================= - -### Enhancements - -* Switch to building the Carthage release with Xcode 13. - -### Fixed - -* Fix compilation error where Swift 5.5 is available but the macOS 12 SDK was - not. This was notable for the Xcode 13 RC. This fix adds a #canImport check - for the `_Concurrency` module that was not available before the macOS 12 SDK. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.0. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0. - -10.15.0 Release notes (2021-09-10) -============================================================= - -### Enhancements - -* Add `async` versions of the `Realm.asyncOpen` and `App.login` methods. -* ThreadSafeReference no longer pins the source transaction version for - anything other than a Results created by filtering a collection. This means - that holding on to thread-safe references to other things (such as Objects) - will no longer cause file size growth. -* A ThreadSafeReference to a Results backed by a collection can now be created - inside a write transaction as long as the collection was not created in the - current write transaction. -* Synchronized Realms are no longer opened twice, cutting the address space and - file descriptors used in half. - ([Core #4839](https://github.com/realm/realm-core/pull/4839)) -* When using the SwiftUI helper types (@ObservedRealmObject and friends) to - bind to an Equatable property, self-assignment no longer performs a pointless - write transaction. SwiftUI appears to sometimes call a Binding's set function - multiple times for a single UI action, so this results in significantly fewer - writes being performed. - -### Fixed - -* Adding an unmanaged object to a Realm that was declared with - `@StateRealmObject` would throw the exception `"Cannot add an object with - observers to a Realm"`. -* The `RealmCollectionChange` docs refered to indicies in modifications as the - 'new' collection. This is incorrect and the docs now state that modifications - refer to the previous version of the collection. ([Cocoa #7390](https://github.com/realm/realm-swift/issues/7390)) -* Fix crash in `RLMSyncConfiguration.initWithUser` error mapping when a user is disabled/deleted from MongoDB Realm dashboard. - ([Cocoa #7399](https://github.com/realm/realm-swift/issues/7399), since v10.0.0) -* If the application crashed at the wrong point when logging a user in, the - next run of the application could hit the assertion failure "m_state == - SyncUser::State::LoggedIn" when a synchronized Realm is opened with that - user. ([Core #4875](https://github.com/realm/realm-core/issues/4875), since v10.0.0) -* The `keyPaths:` parameter to `@ObservedResults` did not work (since v10.12.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 5. - -### Internal - -* Upgraded realm-core from 11.3.1 to 11.4.1 - -10.14.0 Release notes (2021-09-03) -============================================================= - -### Enhancements - -* Add additional `observe` methods for Objects and RealmCollections which take - a `PartialKeyPath` type key path parameter. -* The release package once again contains Xcode 13 binaries. -* `PersistableEnum` properties can now be indexed or used as the primary key if - the RawValue is an indexable or primary key type. - -### Fixed - -* `Map` did not conform to `Codable`. - ([Cocoa #7418](https://github.com/realm/realm-swift/pull/7418), since v10.8.0) -* Fixed "Invalid data type" assertion failure in the sync client when the - client recieved an AddColumn instruction from the server for an AnyRealmValue - property when that property already exists locally. ([Core #4873](https://github.com/realm/realm-core/issues/4873), since v10.8.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 5. - -### Internal - -* Upgraded realm-core from 11.3.0 to 11.3.1. - -10.13.0 Release notes (2021-08-26) -============================================================= - -### Enhancements - -* Sync logs now contain information about what object/changeset was being applied when the exception was thrown. - ([Core #4836](https://github.com/realm/realm-core/issues/4836)) -* Added ServiceErrorCode for wrong username/password when using '`App.login`. - ([Core #7380](https://github.com/realm/realm-swift/issues/7380) - -### Fixed - -* Fix crash in `MongoCollection.findOneDocument(filter:)` that occurred when no results were - found for a given filter. - ([Cocoa #7380](https://github.com/realm/realm-swift/issues/7380), since v10.0.0) -* Some of the SwiftUI property wrappers incorrectly required objects to conform - to ObjectKeyIdentifiable rather than Identifiable. - ([Cocoa #7372](https://github.com/realm/realm-swift/issues/7372), since v10.6.0) -* Work around Xcode 13 beta 3+ shipping a broken swiftinterface file for Combine on 32-bit iOS. - ([Cocoa #7368](https://github.com/realm/realm-swift/issues/7368)) -* Fixes history corruption when replacing an embedded object in a list. - ([Core #4845](https://github.com/realm/realm-core/issues/4845)), since v10.0.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 5. - -### Internal - -* Upgraded realm-core from 11.2.0 to 11.3.0 - -10.12.0 Release notes (2021-08-03) -============================================================= - -### Enhancements - -* `Object.observe()` and `RealmCollection.observe()` now include an optional - `keyPaths` parameter which filters change notifications to those only - occurring on the provided key path or key paths. See method documentation - for extended detail on filtering behavior. -* `ObservedResults` now includes an optional `keyPaths` parameter - which filters change notifications to those only occurring on the provided - key path or key paths. ex) `@ObservedResults(MyObject.self, keyPaths: ["myList.property"])` -* Add two new property wrappers for opening a Realm asynchronously in a - SwiftUI View: - - `AsyncOpen` is a property wrapper that initiates Realm.asyncOpen - for the current user, notifying the view when there is a change in Realm asyncOpen state. - - `AutoOpen` behaves similarly to `AsyncOpen`, but in the case of no internet - connection this will return an opened realm. -* Add `EnvironmentValues.partitionValue`. This value can be injected into any view using one of - our new property wrappers `AsyncOpen` and `AutoOpen`: - `MyView().environment(\.partitionValue, "partitionValue")`. -* Shift more of the work done when first initializing a collection notifier to - the background worker thread rather than doing it on the main thread. - -### Fixed - -* `configuration(partitionValue: AnyBSON)` would always set a nil partition value - for the user sync configuration. -* Decoding a `@Persisted` property would incorrectly throw a `DecodingError.keyNotFound` - for an optional property if the key is missing. - ([Cocoa #7358](https://github.com/realm/realm-swift/issues/7358), since v10.10.0) -* Fixed a symlink which prevented Realm from building on case sensitive file systems. - ([#7344](https://github.com/realm/realm-swift/issues/7344), since v10.8.0) -* Removing a change callback from a Results would sometimes block the calling - thread while the query for that Results was running on the background worker - thread (since v10.11.0). -* Object observers did not handle the object being deleted properly, which - could result in assertion failures mentioning "m_table" in ObjectNotifier - ([Core #4824](https://github.com/realm/realm-core/issues/4824), since v10.11.0). -* Fixed a crash when delivering notifications over a nested hierarchy of lists - of Mixed that contain links. ([Core #4803](https://github.com/realm/realm-core/issues/4803), since v10.8.0) -* Fixed a crash when an object which is linked to by a Mixed is deleted via - sync. ([Core #4828](https://github.com/realm/realm-core/pull/4828), since v10.8.0) -* Fixed a rare crash when setting a mixed link for the first time which would - trigger if the link was to the same table and adding the backlink column - caused a BPNode split. ([Core #4828](https://github.com/realm/realm-core/pull/4828), since v10.8.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 4. On iOS Xcode 13 beta 2 is the latest supported - version due to betas 3 and 4 having a broken Combine.framework. - -### Internal - -* Upgraded realm-core from v11.1.1 to v11.2.0 - -10.11.0 Release notes (2021-07-22) -============================================================= - -### Enhancements - -* Add type safe methods for: - - `RealmCollection.min(of:)` - - `RealmCollection.max(of:)` - - `RealmCollection.average(of:)` - - `RealmCollection.sum(of:)` - - `RealmCollection.sorted(by:ascending:)` - - `RealmKeyedCollection.min(of:)` - - `RealmKeyedCollection.max(of:)` - - `RealmKeyedCollection.average(of:)` - - `RealmKeyedCollection.sum(of:)` - - `RealmKeyedCollection.sorted(by:ascending:)` - - `Results.distinct(by:)` - - `SortDescriptor(keyPath:ascending:) - - Calling these methods can now be done via Swift keyPaths, like so: - ```swift - class Person: Object { - @Persisted var name: String - @Persisted var age: Int - } - - let persons = realm.objects(Person.self) - persons.min(of: \.age) - persons.max(of: \.age) - persons.average(of: \.age) - persons.sum(of: \.age) - persons.sorted(by: \.age) - persons.sorted(by: [SortDescriptor(keyPath: \Person.age)]) - persons.distinct(by: [\Person.age]) - ``` -* Add `List.objects(at indexes:)` in Swift and `[RLMCollection objectsAtIndexes:]` in Objective-C. - This allows you to select elements in a collection with a given IndexSet ([#7298](https://github.com/realm/realm-swift/issues/7298)). -* Add `App.emailPasswordAuth.retryCustomConfirmation(email:completion:)` and `[App.emailPasswordAuth retryCustomConfirmation:completion:]`. - These functions support retrying a [custom confirmation](https://docs.mongodb.com/realm/authentication/email-password/#run-a-confirmation-function) function. -* Improve performance of creating collection notifiers for Realms with a complex schema. - This means that the first run of a query or first call to observe() on a collection will - do significantly less work on the calling thread. -* Improve performance of calculating changesets for notifications, particularly - for deeply nested object graphs and objects which have List or Set properties - with small numbers of objects in the collection. - -### Fixed - -* `RealmProperty` would crash when decoding a `null` json value. - ([Cocoa #7323](https://github.com/realm/realm-swift/issues/7323), since v10.8.0) -* `@Persisted` would crash when decoding a `null` value. - ([#7332](https://github.com/realm/realm-swift/issues/7332), since v10.10.0). -* Fixed an issue where `Realm.Configuration` would be set after views have been laid out - when using `.environment(\.realmConfiguration, ...)` in SwiftUI. This would cause issues if you are - required to bump your schema version and are using `@ObservedResults`. -* Sync user profiles now correctly persist between runs. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 3. Note that this release does not contain Xcode 13 - beta binaries as beta 3 does not include a working version of - Combine.framework for iOS. - -### Internal - -* Upgraded realm-core from 11.0.4 to 11.1.1 - -10.10.0 Release notes (2021-07-07) -============================================================= - -### Enhancements - -* Add a new property wrapper-based declaration syntax for properties on Realm - Swift object classes. Rather than using `@objc dynamic` or the - `RealmProperty` wrapper type, properties can now be declared with `@Persisted - var property: T`, where `T` is any of the supported property types, including - optional numbers and collections. This has a few benefits: - - - All property types are now declared in the same way. No more remembering - that this type requires `@objc dynamic var` while this other type - requires `let`, and the `RealmProperty` or `RealmOptional` helper is no - longer needed for types not supported by Objective-C. - - No more overriding class methods like `primaryKey()`, - `indexedProperties()` or `ignoredProperties()`. The primary key and - indexed flags are set directly in the property declaration with - `@Persisted(primaryKey: true) var _id: ObjectId` or `@Persisted(indexed: - true) var indexedProperty: Int`. If any `@Persisted` properties are present, - all other properties are implicitly ignored. - - Some performance problems have been fixed. Declaring collection - properties as `let listProp = List()` resulted in the `List` object - being created eagerly when the parent object is read, which could cause - performance problems if a class has a large number of `List` or - `RealmOptional` properties. `@Persisted var list: List` allows us to - defer creating the `List` until it's accessed, improving performance - when looping over objects and using only some of the properties. - - Similarly, `let _id = ObjectId.generate()` was a convenient way to - declare a sync-compatible primary key, but resulted in new ObjectIds - being generated in some scenarios where the value would never actually be - used. `@Persisted var _id: ObjectId` has the same behavior of - automatically generating primary keys, but allows us to only generate it - when actually needed. - - More types of enums are supported. Any `RawRepresentable` enum whose raw - type is a type supported by Realm can be stored in an `@Persisted` - project, rather than just `@objc` enums. Enums must be declared as - conforming to the `PersistableEnum` protocol, and still cannot (yet) be - used in collections. - - `willSet` and `didSet` can be used with `@Persistable` properties, while - they previously did not work on managed Realm objects. - - While we expect the switch to the new syntax to be very simple for most - users, we plan to support the existing objc-based declaration syntax for the - foreseeable future. The new style and old style cannot be mixed within a - single class, but new classes can use the new syntax while existing classes - continue to use the old syntax. Updating an existing class to the new syntax - does not change what data is stored in the Realm file and so does not require - a migration (as long as you don't also change the schema in the process, of - course). -* Add `Map.merge()`, which adds the key-value pairs from another Map or - Dictionary to the map. -* Add `Map.asKeyValueSequence()` which returns an adaptor that can be used with - generic functions that operate on Dictionary-styled sequences. - -### Fixed -* AnyRealmValue enum values are now supported in more places when creating - objects. -* Declaring a property as `RealmProperty` will now report an - error during schema discovery rather than doing broken things when the - property is used. -* Observing the `invalidated` property of `RLMDictionary`/`Map` via KVO did not - set old/new values correctly in the notification (since 10.8.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 2. - -10.9.0 Release notes (2021-07-01) -============================================================= - -### Enhancements - -* Add `App.emailPasswordAuth.retryCustomConfirmation(email:completion:)` and - `[App.emailPasswordAuth retryCustomConfirmation:completion:]`. These - functions support retrying a [custom confirmation](https://docs.mongodb.com/realm/authentication/email-password/#run-a-confirmation-function) - function. -* Improve performance of many Dictionary operations, especially when KVO is being used. - -### Fixed - -* Calling `-[RLMRealm deleteObjects:]` on a `RLMDictionary` cleared the - dictionary but did not actually delete the objects in the dictionary (since v10.8.0). -* Rix an assertion failure when observing a `List` contains - object links. ([Core #4767](https://github.com/realm/realm-core/issues/4767), since v10.8.0) -* Fix an assertion failure when observing a `RLMDictionary`/`Map` which links - to an object which was deleting by a different sync client. - ([Core #4770](https://github.com/realm/realm-core/pull/4770), since v10.8.0) -* Fix an endless recursive loop that could cause a stack overflow when - computing changes on a set of objects which contained cycles. - ([Core #4770](https://github.com/realm/realm-core/pull/4770), since v10.8.0). -* Hash collisions in dictionaries were not handled properly. - ([Core #4776](https://github.com/realm/realm-core/issues/4776), since v10.8.0). -* Fix a crash after clearing a list or set of AnyRealmValue containing links to - objects ([Core #4774](https://github.com/realm/realm-core/issues/4774), since v10.8.0) -* Trying to refresh a user token which had been revoked by an admin lead to an - infinite loop and then a crash. This situation now properly logs the user out - and reports an error. ([Core #4745](https://github.com/realm/realm-core/issues/4745), since v10.0.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 2. - -### Internal - -* Upgraded realm-core from v11.0.3 to v11.0.4 - -10.8.1 Release notes (2021-06-22) -============================================================= - -### Enhancements - -* Update Xcode 12.5 to Xcode 12.5.1. -* Create fewer dynamic classes at runtime, improving memory usage and startup time slightly. - -### Fixed - -* Importing the Realm swift package produced several warnings about excluded - files not existing. Note that one warning will still remain after this change. - ([#7295](https://github.com/realm/realm-swift/issues/7295), since v10.8.0). -* Update the root URL for the API docs so that the links go to the place where - new versions of the docs are being published. - ([#7299](https://github.com/realm/realm-swift/issues/7299), since v10.6.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. Note that this version of Realm Studio has not - yet been released at the time of this release. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 1. - -10.8.0 Release notes (2021-06-14) -============================================================= - -NOTE: This version upgrades the Realm file format version to add support for -the new data types and to adjust how primary keys are handled. Realm files -opened will be automatically upgraded and cannot be read by versions older than -v10.8.0. This upgrade should be a fairly fast one. Note that we now -automatically create a backup of the pre-upgrade Realm. - -### Enhancements - -* Add support for the `UUID` and `NSUUID` data types. These types can be used - for the primary key property of Object classes. -* Add two new collection types to complement the existing `RLMArray`/`List` type: - - `RLMSet` in Objective-C and `MutableSet` in Swift are mutable - unordered collections of distinct objects, similar to the built-in - `NSMutableSet` and `Set`. The values in a set may be any non-collection - type which can be stored as a Realm property. Sets are guaranteed to never - contain two objects which compare equal to each other, including when - conflicting writes are merged by sync. - - `RLMDictionary` in Objective-C and `Map` are - mutable key-value dictionaries, similar to the built-in - `NSMutableDictionary` and `Dictionary`. The values in a dictionary may be - any non-collection type which can be stored as a Realm property. The keys - must currently always be a string. -* Add support for dynamically typed properties which can store a value of any - of the non-collection types supported by Realm, including Object subclasses - (but not EmbeddedObject subclasses). These are declared with - `@property id propertyName;` in Objective-C and - `let propertyName = RealmProperty()` in Swift. - -### Fixed - -* Setting a collection with a nullable value type to null via one of the - dynamic interfaces would hit an assertion failure instead of clearing the - collection. -* Fixed an incorrect detection of multiple incoming links in a migration when - changing a table to embedded and removing a link to it at the same time. - ([#4694](https://github.com/realm/realm-core/issues/4694) since v10.0.0-beta.2) -* Fixed a divergent merge on Set when one client clears the Set and another - client inserts and deletes objects. - ([#4720](https://github.com/realm/realm-core/issues/4720)) -* Partially revert to pre-v5.0.0 handling of primary keys to fix a performance - regression. v5.0.0 made primary keys determine the position in the low-level - table where newly added objects would be inserted, which eliminated the need - for a separate index on the primary key. This made some use patterns slightly - faster, but also made some reasonable things dramatically slower. - ([#4522](https://github.com/realm/realm-core/issues/4522)) -* Fixed an incorrect detection of multiple incoming links in a migration when - changing a table to embedded and removing a link to it at the same time. - ([#4694](https://github.com/realm/realm-core/issues/4694) since v10.0.0-beta.2) -* Fix collection notification reporting for modifications. This could be - observed by receiving the wrong indices of modifications on sorted or - distinct results, or notification blocks sometimes not being called when only - modifications have occured. - ([#4573](https://github.com/realm/realm-core/pull/4573) since v5.0.0). -* Fix incorrect sync instruction emission when replacing an existing embedded - object with another embedded object.([Core #4740](https://github.com/realm/realm-core/issues/4740) - -### Deprecations - -* `RealmOptional` has been deprecated in favor of `RealmProperty`. - `RealmProperty` is functionality identical to `RealmOptional` when storing - optional numeric types, but can also store the new `AnyRealmValue` type. - -### Compatibility - -* Realm Studio: 11.0.0 or later. Note that this version of Realm Studio has not - yet been released at the time of this release. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 1. - -### Internal - -* Upgraded realm-core from v10.7.2 to v11.0.3 - -10.8.0-beta.2 Release notes (2021-06-01) -============================================================= - -### Enhancements - -* Add `RLMDictionary`/`Map<>` datatype. This is a Dictionary collection type used for storing key-value pairs in a collection. - -### Compatibility - -* Realm Studio: 11.0.0-beta.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v11.0.0-beta.4 to v11.0.0-beta.6 - -10.8.0-beta.0 Release notes (2021-05-07) -============================================================= - -### Enhancements - -* Add `RLMSet`/`MutableSet<>` datatype. This is a Set collection type used for storing distinct values in a collection. -* Add support for `id`/`AnyRealmValue`. -* Add support for `UUID`/`NSUUID` data type. - -### Fixed - -* None. - -### Deprecations - -* `RealmOptional` has been deprecated in favor of `RealmProperty`. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.7.2 to v10.8.0-beta.5 - -10.7.7 Release notes (2021-06-10) -============================================================= - -Xcode 12.2 is now the minimum supported version. - -### Enhancements - -* Add Xcode 13 beta 1 binaries to the release package. - -### Fixed - -* Fix a runtime crash which happens in some Xcode version (Xcode < 12, reported - in Xcode 12.5), where SwiftUI is not weak linked by default. This fix only - works for Cocoapods projects. - ([#7234](https://github.com/realm/realm-swift/issues/7234) -* Fix warnings when building with Xcode 13 beta 1. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 1. - -10.7.6 Release notes (2021-05-13) -============================================================= - -### Enhancements - -* Realms opened in read-only mode can now be invalidated (although it is - unlikely to be useful to do so). - -### Fixed - -* Fix an availability warning when building Realm. The code path which gave the - warning can not currently be hit, so this did not cause any runtime problems - ([#7219](https://github.com/realm/realm-swift/issues/7219), since 10.7.3). -* Proactively check the expiry time on the access token and refresh it before - attempting to initiate a sync session. This prevents some error logs from - appearing on the client such as: "ERROR: Connection[1]: Websocket: Expected - HTTP response 101 Switching Protocols, but received: HTTP/1.1 401 - Unauthorized" ([RCORE-473](https://jira.mongodb.org/browse/RCORE-473), since v10.0.0) -* Fix a race condition which could result in a skipping notifications failing - to skip if several commits using notification skipping were made in - succession (since v5.0.0). -* Fix a crash on exit inside TableRecycler which could happen if Realms were - open on background threads when the app exited. - ([Core #4600](https://github.com/realm/realm-core/issues/4600), since v5.0.0) -* Fix errors related to "uncaught exception in notifier thread: - N5realm11KeyNotFoundE: No such object" which could happen on sycnronized - Realms if a linked object was deleted by another client. - ([JS #3611](https://github.com/realm/realm-js/issues/3611), since v10.0.0). -* Reading a link to an object which has been deleted by a different client via - a string-based interface (such as value(forKey:) or the subscript operator on - DynamicObject) could return an invalid object rather than nil. - ([Core #4687](https://github.com/realm/realm-core/pull/4687), since v10.0.0) -* Recreate the sync metadata Realm if the encryption key for it is missing from - the keychain rather than crashing. This can happen if a device is restored - from an unencrypted backup, which restores app data but not the app's - keychain entries, and results in all cached logics for sync users being - discarded but no data being lost. - [Core #4285](https://github.com/realm/realm-core/pull/4285) -* Thread-safe references can now be created for read-only Realms. - ([#5475](https://github.com/realm/realm-swift/issues/5475)). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.6.0 to v10.7.2 - -10.7.5 Release notes (2021-05-07) -============================================================= - -### Fixed - -* Iterating over frozen collections on multiple threads at the same time could - throw a "count underflow" NSInternalInconsistencyException. - ([#7237](https://github.com/realm/realm-swift/issues/7237), since v5.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. - -10.7.4 Release notes (2021-04-26) -============================================================= - -### Enhancements - -* Add Xcode 12.5 binaries to the release package. - -### Fixed - -* Add the Info.plist file to the XCFrameworks in the Carthage xcframwork - package ([#7216](https://github.com/realm/realm-swift/issues/7216), since 10.7.3). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. - -10.7.3 Release notes (2021-04-22) -============================================================= - -### Enhancements - -* Package a prebuilt XCFramework for Carthage. Carthage 0.38 and later will - download this instead of the old frameworks when using `--use-xcframeworks`. -* We now make a backup of the realm file prior to any file format upgrade. The - backup is retained for 3 months. Backups from before a file format upgrade - allows for better analysis of any upgrade failure. We also restore a backup, - if a) an attempt is made to open a realm file whith a "future" file format - and b) a backup file exist that fits the current file format. - ([Core #4166](https://github.com/realm/realm-core/pull/4166)) -* The error message when the intial steps of opening a Realm file fails is now - more descriptive. -* Make conversion of Decimal128 to/from string work for numbers with more than - 19 significant digits. This means that Decimal128's initializer which takes a - string will now never throw, as it previously threw only for out-of-bounds - values. The initializer is still marked as `throws` for - backwards compatibility. - ([#4548](https://github.com/realm/realm-core/issues/4548)) - -### Fixed - -* Adjust the header paths for the podspec to avoid accidentally finding a file - which isn't part of the pod that produced warnings when importing the - framework. ([#7113](https://github.com/realm/realm-swift/issues/7113), since 10.5.2). -* Fixed a crash that would occur when observing unmanaged Objects in multiple - views in SwiftUI. When using `@StateRealmObject` or `@ObservedObject` across - multiple views with an unmanaged object, each view would subscribe to the - object. As each view unsubscribed (generally when trailing back through the - view stack), our propertyWrappers would attempt to remove the KVOs for each - cancellation, when it should only be done once. We now correctly remove KVOs - only once. ([#7131](https://github.com/realm/realm-swift/issues/7131)) -* Fixed `isInvalidated` not returning correct value after object deletion from - Realm when using a custom schema. The object's Object Schema was not updated - when the object was added to the realm. We now correctly update the object - schema when adding it to the realm. - ([#7181](https://github.com/realm/realm-swift/issues/7181)) -* Syncing large Decimal128 values would cause "Assertion failed: cx.w[1] == 0" - ([Core #4519](https://github.com/realm/realm-core/issues/4519), since v10.0.0). -* Potential/unconfirmed fix for crashes associated with failure to memory map - (low on memory, low on virtual address space). For example - ([#4514](https://github.com/realm/realm-core/issues/4514), since v5.0.0). -* Fix assertion failures such as "!m_notifier_skip_version.version" or - "m_notifier_sg->get_version() + 1 == new_version.version" when performing - writes inside change notification callbacks. Previously refreshing the Realm - by beginning a write transaction would skip delivering notifications, leaving - things in an inconsistent state. Notifications are now delivered recursively - when needed instead. ([Cocoa #7165](https://github.com/realm/realm-swift/issues/7165)). -* Fix collection notification reporting for modifications. This could be - observed by receiving the wrong indices of modifications on sorted or - distinct results, or notification blocks sometimes not being called when only - modifications have occured. - ([#4573](https://github.com/realm/realm-core/pull/4573) since v5.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.5.5 to v10.6.0 -* Add additional debug validation to file map management that will hopefully - catch cases where we unmap something which is still in use. - -10.7.2 Release notes (2021-03-08) -============================================================= - -### Fixed - -* During integration of a large amount of data from the server, you may get - "Assertion failed: !fields.has_missing_parent_update()" - ([Core #4497](https://github.com/realm/realm-core/issues/4497), since v6.0.0) - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.5.4 to v10.5.5 - -10.7.1 Release notes (2021-03-05) -============================================================= - -### Fixed - -* Queries of the form "a.b.c == nil" would match objects where `b` is `nil` if - `c` did not have an index and did not if `c` was indexed. Both will now match - to align with NSPredicate's behavior. ([Core #4460]https://github.com/realm/realm-core/pull/4460), since 4.3.0). -* Restore support for upgrading files from file format 5 (Realm Cocoa 1.x). - ([Core #7089](https://github.com/realm/realm-swift/issues/7089), since v5.0.0) -* On 32bit devices you may get exception with "No such object" when upgrading - to v10.* ([Java #7314](https://github.com/realm/realm-java/issues/7314), since v5.0.0) -* The notification worker thread would rerun queries after every commit rather - than only commits which modified tables which could effect the query results - if the table had any outgoing links to tables not used in the query. - ([Core #4456](https://github.com/realm/realm-core/pull/4456), since v5.0.0). -* Fix "Invalid ref translation entry [16045690984833335023, 78187493520]" - assertion failure which could occur when using sync or multiple processes - writing to a single Realm file. - ([#7086](https://github.com/realm/realm-swift/issues/7086), since v5.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.5.3 to v10.5.4 - -10.7.0 Release notes (2021-02-23) -============================================================= - -### Enhancements - -* Add support for some missing query operations on data propertys: - - Data properties can be compared to other data properties - (e.g. "dataProperty1 == dataProperty2"). - - Case and diacritic-insensitive queries can be performed on data properties. - This will only have meaningful results if the data property contains UTF-8 - string data. - - Data properties on linked objects can be queried - (e.g. "link.dataProperty CONTAINS %@") -* Implement queries which filter on lists other than object links (lists of - objects were already supported). All supported operators for normal - properties are now supported for lists (e.g. "ANY intList = 5" or "ANY - stringList BEGINSWITH 'prefix'"), as well as aggregate operations on the - lists (such as "intArray.@sum > 100"). -* Performance of sorting on more than one property has been improved. - Especially important if many elements match on the first property. Mitigates - ([#7092](https://github.com/realm/realm-swift/issues/7092)) - -### Fixed - -* Fixed a bug that prevented an object type with incoming links from being - marked as embedded during migrations. ([Core #4414](https://github.com/realm/realm-core/pull/4414)) -* The Realm notification listener thread could sometimes hit the assertion - failure "!skip_version.version" if a write transaction was committed at a - very specific time (since v10.5.0). -* Added workaround for a case where upgrading an old file with illegal string - would crash ([#7111](https://github.com/realm/realm-swift/issues/7111)) -* Fixed a conflict resolution bug related to the ArrayMove instruction, which - could sometimes cause an "Invalid prior_size" exception to prevent - synchronization (since v10.5.0). -* Skipping a change notification in the first write transaction after the - observer was added could potentially fail to skip the notification (since v10.5.1). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.5.0 to v10.5.3 - -10.6.0 Release notes (2021-02-15) -============================================================= - -### Enhancements - -* Add `@StateRealmObject` for SwiftUI support. This property wrapper type instantiates an observable object on a View. - Use in place of `SwiftUI.StateObject` for Realm `Object`, `List`, and `EmbeddedObject` types. -* Add `@ObservedRealmObject` for SwiftUI support. This property wrapper type subscribes to an observable object - and invalidates a view whenever the observable object changes. Use in place of `SwiftUI.ObservedObject` for - Realm `Object`, `List`, or `EmbeddedObject` types. -* Add `@ObservedResults` for SwiftUI support. This property wrapper type retrieves results from a Realm. - The results use the realm configuration provided by the environment value `EnvironmentValues.realmConfiguration`. -* Add `EnvironmentValues.realm` and `EnvironmentValues.realmConfiguration` for `Realm` - and `Realm.Configuration` types respectively. Values can be injected into views using the `View.environment` method, e.g., `MyView().environment(\.realmConfiguration, Realm.Configuration(fileURL: URL(fileURLWithPath: "myRealmPath.realm")))`. - The value can then be declared on the example `MyView` as `@Environment(\.realm) var realm`. -* Add `SwiftUI.Binding` extensions where `Value` is of type `Object`, `List`, or `EmbeddedObject`. - These extensions expose methods for wrapped write transactions, to avoid boilerplate within - views, e.g., `TextField("name", $personObject.name)` or `$personList.append(Person())`. -* Add `Object.bind` and `EmbeddedObject.bind` for SwiftUI support. This allows you to create - bindings of realm properties when a propertyWrapper is not available for you to do so, e.g., `TextField("name", personObject.bind(\.name))`. -* The Sync client now logs error messages received from server rather than just - the size of the error message. -* Errors returned from the server when sync WebSockets get closed are now - captured and surfaced as a SyncError. -* Improve performance of sequential reads on a Results backed directly by a - Table (i.e. `realm.object(ClasSName.self)` with no filter/sort/etc.) by 50x. -* Orphaned embedded object types which are not linked to by any top-level types - are now better handled. Previously the server would reject the schema, - resulting in delayed and confusing error reporting. Explicitly including an - orphan in `objectTypes` is now immediately reported as an error when opening - the Realm, and orphans are automatically excluded from the auto-discovered - schema when `objectTypes` is not specified. - -### Fixed - -* Reading from a Results backed directly by a Table (i.e. - `realm.object(ClasSName.self)` with no filter/sort/etc.) would give incorrect - results if the Results was constructed and accessed before creating a new - object with a primary key less than the smallest primary key which previously - existed. ([#7014](https://github.com/realm/realm-swift/issues/7014), since v5.0.0). -* During synchronization you might experience crash with - "Assertion failed: ref + size <= next->first". - ([Core #4388](https://github.com/realm/realm-core/issues/4388)) - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.4.0 to v10.5.0 - -10.5.2 Release notes (2021-02-09) -============================================================= - -### Enhancements - -* Add support for "thawing" objects. `Realm`, `Results`, `List` and `Object` - now have `thaw()` methods which return a live copy of the frozen object. This - enables app behvaior where a frozen object can be made live again in order to - mutate values. For example, first freezing an object passed into UI view, - then thawing the object in the view to update values. -* Add Xcode 12.4 binaries to the release package. - -### Fixed - -* Inserting a date into a synced collection via `AnyBSON.datetime(...)` would - be of type `Timestamp` and not `Date`. This could break synced objects with a - `Date` property. - ([#6654](https://github.com/realm/realm-swift/issues/6654), since v10.0.0). -* Fixed an issue where creating an object after file format upgrade may fail - with assertion "Assertion failed: lo() <= std::numeric_limits::max()" - ([#4295](https://github.com/realm/realm-core/issues/4295), since v5.0.0) -* Allow enumerating objects in migrations with types which are no longer - present in the schema. -* Add `RLMResponse.customStatusCode`. This fixes timeout exceptions that were - occurring with a poor connection. ([#4188](https://github.com/realm/realm-core/issues/4188)) -* Limit availability of ObjectKeyIdentifiable to platforms which support - Combine to match the change made in the Xcode 12.5 SDK. - ([#7083](https://github.com/realm/realm-swift/issues/7083)) - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.3.3 to v10.4.0 - -10.5.1 Release notes (2021-01-15) -============================================================= - -### Enhancements - -* Add Xcode 12.3 binary to release package. -* Add support for queries which have nil on the left side and a keypath on the - right side (e.g. "nil == name" rather than "name == nil" as was previously - required). - -### Fixed -* Timeouts when calling server functions via App would sometimes crash rather - than report an error. -* Fix a race condition which would lead to "uncaught exception in notifier - thread: N5realm15InvalidTableRefE: transaction_ended" and a crash when the - source Realm was closed or invalidated at a very specific time during the - first run of a collection notifier - ([#3761](https://github.com/realm/realm-core/issues/3761), since v5.0.0). -* Deleting and recreating objects with embedded objects may fail. - ([Core PR #4240](https://github.com/realm/realm-core/pull/4240), since v10.0.0) -* Fast-enumerating a List after deleting the parent object would crash with an - assertion failure rather than a more appropriate exception. - ([Core #4114](https://github.com/realm/realm-core/issues/4114), since v5.0.0). -* Fix an issue where calling a MongoDB Realm Function would never be performed as the reference to the weak `User` was lost. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.3. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.3.2 to v10.3.3 - -10.5.0 Release notes (2020-12-14) -============================================================= - -### Enhancements - -* MongoDB Realm is now supported when installing Realm via Swift Package Manager. - -### Fixed - -* The user identifier was added to the file path for synchronized Realms twice - and an extra level of escaping was performed on the partition value. This did - not cause functional problems, but made file names more confusing than they - needed to be. Existing Realm files will continue to be located at the old - path, while newly created files will be created at a shorter path. (Since v10.0.0). -* Fix a race condition which could potentially allow queries on frozen Realms - to access an uninitialized structure for search indexes (since v5.0.0). -* Fix several data races in App and SyncSession initialization. These could - possibly have caused strange errors the first time a synchronized Realm was - opened (since v10.0.0). -* Fix a use of a dangling reference when refreshing a user’s custom data that - could lead to a crash (since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.1.4 to v10.3.2 - -10.4.0 Release notes (2020-12-10) -============================================================= - -### Enhancements - -* Add Combine support for App and User. These two types now have a - `objectWillChange` property that emits each time the state of the object has - changed (such as due to the user logging in or out). ([PR #6977](https://github.com/realm/realm-swift/pull/6977)). - -### Fixed - -* Integrating changesets from the server would sometimes hit the assertion - failure "n != realm::npos" inside Table::create_object_with_primary_key() - when creating an object with a primary key which previously had been used and - had incoming links. ([Core PR #4180](https://github.com/realm/realm-core/pull/4180), since v10.0.0). -* The arm64 simulator slices were not actually included in the XCFramework - release package. ([PR #6982](https://github.com/realm/realm-swift/pull/6982), since v10.2.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.1.3 to v10.1.4 -* Upgraded realm-sync from v10.1.4 to v10.1.5 - -10.3.0 Release notes (2020-12-08) -============================================================= - -### Enhancements - -* Add Google OpenID Connect Credentials, an alternative login credential to the - Google OAuth 2.0 credential. - -### Fixed - -* Fixed a bug that would prevent eventual consistency during conflict - resolution. Affected clients would experience data divergence and potentially - consistency errors as a result if they experienced conflict resolution - between cycles of Create-Erase-Create for objects with primary keys (since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-sync from v10.1.3 to v10.1.4 - -10.2.0 Release notes (2020-12-02) -============================================================= - -### Enhancements - -* The prebuilt binaries are now packaged as XCFrameworks. This adds support for - Catalyst and arm64 simulators when using them to install Realm, removes the - need for the strip-frameworks build step, and should simplify installation. -* The support functionality for using the Objective C API from Swift is now - included in Realm Swift and now includes all of the required wrappers for - MongoDB Realm types. In mixed Objective C/Swift projects, we recommend - continuing to use the Objective C types, but import both Realm and RealmSwift - in your Swift files. - -### Fixed - -* The user identifier was added to the file path for synchronized Realms twice - and an extra level of escaping was performed on the partition value. This did - not cause functional problems, but made file names more confusing than they - needed to be. Existing Realm files will continue to be located at the old - path, while newly created files will be created at a shorter path. (Since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -10.1.4 Release notes (2020-11-16) -============================================================= - -### Enhancements - -* Add arm64 slices to the macOS builds. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.0.1 to v10.1.3 -* Upgraded realm-sync from v10.0.1 to v10.1.3 - -10.1.3 Release notes (2020-11-13) -============================================================= - -### Enhancements - -* Add Xcode 12.2 binaries to the release package. - -### Fixed - -* Disallow setting - `RLMRealmConfiguration.deleteRealmIfMigrationNeeded`/`Realm.Config.deleteRealmIfMigrationNeeded` - when sync is enabled. This did not actually work as it does not delete the - relevant server state and broke in confusing ways ([PR #6931](https://github.com/realm/realm-swift/pull/6931)). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.1. -* CocoaPods: 1.10 or later. - -10.1.2 Release notes (2020-11-06) -============================================================= - -### Enhancements - -* Some error states which previously threw a misleading "NoSuchTable" exception - now throw a more descriptive exception. - -### Fixed - -* One of the Swift packages did not have the minimum deployment target set, - resulting in errors when archiving an app which imported Realm via SPM. -* Reenable filelock emulation on watchOS so that the OS does not kill the app - when it is suspended while a Realm is open on watchOS 7 ([#6861](https://github.com/realm/realm-swift/issues/6861), since v5.4.8 -* Fix crash in case insensitive query on indexed string columns when nothing - matches ([#6836](https://github.com/realm/realm-swift/issues/6836), since v5.0.0). -* Null values in a `List` or `List` were incorrectly treated - as non-null in some places. It is unknown if this caused any functional - problems when using the public API. ([Core PR #3987](https://github.com/realm/realm-core/pull/3987), since v5.0.0). -* Deleting an entry in a list in two different clients could end deleting the - wrong entry in one client when the changes are merged (since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.1. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.0.0 to v10.1.1 -* Upgraded realm-sync from v10.0.0 to v10.1.1 - -10.1.1 Release notes (2020-10-27) -============================================================= - -### Enhancements - -* Set the minimum CocoaPods version in the podspec so that trying to install - with older versions gives a more useful error ([PR #6892](https://github.com/realm/realm-swift/pull/6892)). - -### Fixed - -* Embedded objects could not be marked as `ObjectKeyIdentifable` - ([PR #6890](https://github.com/realm/realm-swift/pull/6890), since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.1. -* CocoaPods: 1.10 or later. - -10.1.0 Release notes (2020-10-22) -============================================================= - -CocoaPods 1.10 or later is now required to install Realm. - -### Enhancements - -* Throw an exception for Objects that have none of its properties marked with @objc. -* Mac Catalyst and arm64 simulators are now supported when integrating via Cocoapods. -* Add Xcode 12.1 binaries to the release package. -* Add Combine support for `Realm.asyncOpen()`. - -### Fixed - -* Implement precise and unbatched notification of sync completion events. This - avoids a race condition where an earlier upload completion event will notify - a later waiter whose changes haven't been uploaded yet. - ([#1118](https://github.com/realm/realm-object-store/pull/1118)). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.1. - -10.0.0 Release notes (2020-10-16) -============================================================= - -This release is functionally identical to v10.0.0-rc.2. - -NOTE: This version upgrades the Realm file format version to add support for -new data types. Realm files opened will be automatically upgraded and cannot be -read by versions older than v10.0.0. - -### Breaking Changes - -* Rename Realm.Publishers to RealmPublishers to avoid confusion with Combine.Publishers. -* Remove `[RLMSyncManager shared]`. This is now instatiated as a property on App/RLMApp. -* `RLMSyncManager.pinnedCertificatePaths` has been removed. -* Classes `RLMUserAccountInfo` & `RLMUserInfo` (swift: `UserInfo`, `UserAccountInfo`) have been removed. -* `RLMSyncUser`/`SyncUser` has been renamed to `RLMUser`/`User`. -* We no longer support Realm Cloud (legacy), but instead the new "MongoDB - Realm" Cloud. MongoDB Realm is a serverless platform that enables developers - to quickly build applications without having to set up server infrastructure. - MongoDB Realm is built on top of MongoDB Atlas, automatically integrating the - connection to your database. -* Remove support for Query-based sync, including the configuration parameters - and the `RLMSyncSubscription` and `SyncSubscription` types ([#6437](https://github.com/realm/realm-swift/pull/6437)). -* Remove everything related to sync permissions, including both the path-based - permission system and the object-level privileges for query-based sync. - Permissions are now configured via MongoDB Atlas. - ([#6445](https://github.com/realm/realm-swift/pulls/6445)) -* Remove support for Realm Object Server. -* Non-embedded objects in synchronized Realms must always have a primary key - named "_id". -* All Swift callbacks for asynchronous operations which can fail are now passed - a `Result` parameter instead of two separate `Value?` and - `Error?` parameters. - -### Enhancements - -* Add support for next generation sync. Support for syncing to MongoDB instead - of Realm Object Server. Applications must be created at realm.mongodb.com -* The memory mapping scheme for Realm files has changed to better support - opening very large files. -* Add support for the ObjectId data type. This is an automatically-generated - unique identifier similar to a GUID or a UUID. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for the Decimal128 data type. This is a 128-bit IEEE 754 decimal - floating point number similar to NSDecimalNumber. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for embedded objects. Embedded objects are objects which are - owned by a single parent object, and are deleted when that parent object is - deleted. They are defined by subclassing `EmbeddedObject` / - `RLMEmbeddedObject` rather than `Object` / `RLMObject`. -* Add `-[RLMUser customData]`/`User.customData`. Custom data is - configured in your MongoDB Realm App. -* Add `-[RLMUser callFunctionNamed:arguments:completion:]`/`User.functions`. - This is the entry point for calling Remote MongoDB Realm functions. Functions - allow you to define and execute server-side logic for your application. - Functions are written in modern JavaScript (ES6+) and execute in a serverless - manner. When you call a function, you can dynamically access components of - the current application as well as information about the request to execute - the function and the logged in user that sent the request. -* Add `-[RLMUser mongoClientWithServiceName:]`/`User.mongoClient`. This is - the entry point for calling your Remote MongoDB Service. The read operations - are `-[RLMMongoCollection findWhere:completion:]`, `-[RLMMongoCollection - countWhere:completion:]`and `-[RLMMongoCollection - aggregateWithPipeline:completion:]`. The write operations are - `-[RLMMongoCollection insertOneDocument:completion:]`, `-[RLMMongoCollection - insertManyDocuments:completion:]`, `-[RLMMongoCollection - updateOneDocument:completion:]`, `-[RLMMongoCollection - updateManyDocuments:completion:]`, `-[RLMMongoCollection - deleteOneDocument:completion:]`, and `-[RLMMongoCollection - deleteManyDocuments:completion:]`. If you are already familiar with MongoDB - drivers, it is important to understand that the remote MongoCollection only - provides access to the operations available in MongoDB Realm. -* Obtaining a Realm configuration from a user is now done with `[RLMUser - configurationWithPartitionValue:]`/`User.configuration(partitionValue:)`. - Partition values can currently be of types `String`, `Int`, or `ObjectId`, - and fill a similar role to Realm URLs did with Realm Cloud. The main - difference is that partitions are meant to be more closely associated with - your data. For example, if you are running a `Dog` kennel, and have a field - `breed` that acts as your partition key, you could open up realms based on - the breed of the dogs. -* Add ability to stream change events on a remote MongoDB collection with - `[RLMMongoCollection watch:delegate:delegateQueue:]`, - `MongoCollection.watch(delegate:)`. When calling `watch(delegate:)` you will be - given a `RLMChangeStream` (`ChangeStream`) which can be used to end watching - by calling `close()`. Change events can also be streamed using the - `MongoCollection.watch` Combine publisher that will stream change events each - time the remote MongoDB collection is updated. -* Add the ability to listen for when a Watch Change Stream is opened when using - Combine. Use `onOpen(event:)` directly after opening a `WatchPublisher` to - register a callback to be invoked once the change stream is opened. -* Objects with integer primary keys no longer require a separate index for the -* primary key column, improving insert performance and slightly reducing file - size. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* Carthage release for Swift is built with Xcode 12 - -### Internal - -* Upgraded realm-core from v6.1.4 to v10.0.0 -* Upgraded realm-sync from v5.0.29 to v10.0.0 - -10.0.0-rc.2 Release notes (2020-10-15) -============================================================= - -### Enhancements - -* Add the ability to listen for when a Watch Change Stream is opened when using - Combine. Use `onOpen(event:)` directly after opening a `WatchPublisher` to - register a callback to be invoked once the change stream is opened. - -### Breaking Changes - -* The insert operations on Mongo collections now report the inserted documents' - IDs as BSON rather than ObjectId. -* Embedded objects can no longer form cycles at the schema level. For example, - type A can no longer have an object property of type A, or an object property - of type B if type B links to type A. This was always rejected by the server, - but previously was allowed in non-synchronized Realms. -* Primary key properties are once again marked as being indexed. This reflects - an internal change to how primary keys are handled that should not have any - other visible effects. -* Change paired return types from Swift completion handlers to return `Result`. -* Adjust how RealmSwift.Object is defined to add support for Swift Library - Evolution mode. This should normally not have any effect, but you may need to - add `override` to initializers of object subclasses. -* Add `.null` type to AnyBSON. This creates a distinction between null values - and properly absent BSON types. - -### Fixed - -* Set the precision correctly when serializing doubles in extended json. -* Reading the `objectTypes` array from a Realm Configuration would not include - the embedded object types which were set in the array. -* Reject loops in embedded objects as part of local schema validation rather - than as a server error. -* Although MongoClient is obtained from a User, it was actually using the - User's App's current user rather than the User it was obtained from to make - requests. - - -This release also contains the following changes from 5.4.7 - 5.5.0 - -### Enhancements - -* Add the ability to capture a NotificationToken when using a Combine publisher - that observes a Realm Object or Collection. The user will call - `saveToken(on:at:)` directly after invoking the publisher to use the feature. - -### Fixed - -* When using `Realm.write(withoutNotifying:)` there was a chance that the - supplied observation blocks would not be skipped when in a write transaction. - ([Object Store #1103](https://github.com/realm/realm-object-store/pull/1103)) -* Comparing two identical unmanaged `List<>`/`RLMArray` objects would fail. - ([#5665](https://github.com/realm/realm-swift/issues/5665)). -* Case-insensitive equality queries on indexed string properties failed to - clear some internal state when rerunning the query. This could manifest as - duplicate results or "key not found" errors. - ([#6830](https://github.com/realm/realm-swift/issues/6830), [#6694](https://github.com/realm/realm-swift/issues/6694), since 5.0.0). -* Equality queries on indexed string properties would sometimes throw "key not - found" exceptions if the hash of the string happened to have bit 62 set. - ([.NET #2025](https://github.com/realm/realm-dotnet/issues/2025), since v5.0.0). -* Queries comparing non-optional int properties to nil would behave as if they - were comparing against zero instead (since v5.0.0). - -### Compatibility - -* File format: Generates Realms with format v12 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v10.0.0-beta.9 to v10.0.0 -* Upgraded realm-sync from v10.0.0-beta.14 to v10.0.0 - -10.0.0-rc.1 Release notes (2020-10-01) -============================================================= - -### Breaking Changes - -* Change the following methods on RLMUser to properties: - - `[RLMUser emailPasswordAuth]` => `RLMUser.emailPasswordAuth` - - `[RLMUser identities]` => `RLMUser.identities` - - `[RLMUser allSessions]` => `RLMUser.allSessions` - - `[RLMUser apiKeysAuth]` => `RLMUser.apiKeysAuth` -* Other changes to RLMUser: - - `nullable` has been removed from `RLMUser.identifier` - - `nullable` has been removed from `RLMUser.customData` -* Change the following methods on RLMApp to properties: - - `[RLMApp allUsers]` => `RLMApp.allUsers` - - `[RLMApp currentUser]` => `RLMApp.currentUser` - - `[RLMApp emailPasswordAuth]` => `RLMApp.emailPasswordAuth` -* Define `RealmSwift.Credentials` as an enum instead of a `typealias`. Example - usage has changed from `Credentials(googleAuthCode: "token")` to - `Credentials.google(serverAuthCode: "serverAuthCode")`, and - `Credentials(facebookToken: "token")` to `Credentials.facebook(accessToken: "accessToken")`, etc. -* Remove error parameter and redefine payload in - `+ (instancetype)credentialsWithFunctionPayload:(NSDictionary *)payload error:(NSError **)error;`. - It is now defined as `+ (instancetype)credentialsWithFunctionPayload:(NSDictionary> *)payload;` - -### Compatibility - -* File format: Generates Realms with format v12 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12. - -10.0.0-beta.6 Release notes (2020-09-30) -============================================================= - -### Breaking Changes - -* Change Google Credential parameter names to better reflect the required auth code: - - `Credentials(googleToken:)` => `Credentials(googleAuthCode:)` - - `[RLMCredentials credentialsWithGoogleToken:]` => `[RLMCredentials credentialsWithGoogleAuthCode:]` -* Rename Realm.Publishers to RealmPublishers to avoid confusion with Combine.Publishers - -### Fixed - -* Deleting objects could sometimes change the ObjectId remaining objects from - null to ObjectId("deaddeaddeaddeaddeaddead") when there are more than 1000 - objects. (Since v10.0.0-alpha.1) -* Fixed an assertion failure when adding an index to a nullable ObjectId - property that contains nulls. (since v10.0.0-alpha.1). - -This release also contains the following changes from 5.4.0 - 5.4.6: - -### Enhancements - -* Add prebuilt binary for Xcode 11.7 to the release package. -* Add prebuilt binary for Xcode 12 to the release package. -* Improve the asymtotic performance of NOT IN queries on indexed properties. It - is now O(Number of Rows) rather than O(Number of Rows \* Number of values in IN clause.) -* Slightly (<5%) improve the performance of most operations which involve - reading from a Realm file. - -### Fixed - -* Upgrading pre-5.x files with string primary keys would result in a file where - `realm.object(ofType:forPrimaryKey:)` would fail to find the object. - ([#6716](https://github.com/realm/realm-swift/issues/6716), since 5.2.0) -* A write transaction which modifies an object with more than 16 managed - properties and causes the Realm file to grow larger than 2 GB could cause an - assertion failure mentioning "m_has_refs". ([JS #3194](https://github.com/realm/realm-js/issues/3194), since 5.0.0). -* Objects with more than 32 properties could corrupt the Realm file and result - in a variety of crashes. ([Java #7057](https://github.com/realm/realm-java/issues/7057), since 5.0.0). -* Fix deadlocks when opening a Realm file in both the iOS simulator and Realm - Studio ([#6743](https://github.com/realm/realm-swift/issues/6743), since 5.3.6). -* Fix Springboard deadlocking when an app is unsuspended while it has an open - Realm file which is stored in an app group on iOS 10-12 - ([#6749](https://github.com/realm/realm-swift/issues/6749), since 5.3.6). -* If you use encryption your application cound crash with a message like - "Opening Realm files of format version 0 is not supported by this version of - Realm". ([#6889](https://github.com/realm/realm-java/issues/6889) among others, since 5.0.0) -* Confining a Realm to a serial queue would throw an error claiming that the - queue was not a serial queue on iOS versions older than 12. - ([#6735](https://github.com/realm/realm-swift/issues/6735), since 5.0.0). -* Results would sometimes give stale results inside a write transaction if a - write which should have updated the Results was made before the first access - of a pre-existing Results object. - ([#6721](https://github.com/realm/realm-swift/issues/6721), since 5.0.0) -* Fix Archiving the Realm and RealmSwift frameworks with Xcode 12. - ([#6774](https://github.com/realm/realm-swift/issues/6774)) -* Fix compilation via Carthage when using Xcode 12 ([#6717](https://github.com/realm/realm-swift/issues/6717)). -* Fix a crash inside `realm::Array(Type)::init_from_mem()` which would - sometimes occur when running a query over links immediately after creating - objects of the queried type. - ([#6789](https://github.com/realm/realm-swift/issues/6789) and possibly others, since 5.0.0). -* Possibly fix problems when changing the type of the primary key of an object - from optional to non-optional. -* Rerunning a equality query on an indexed string property would give incorrect - results if a previous run of the query matched multiple objects and it now - matches one object. This could manifest as either finding a non-matching - object or a "key not found" exception being thrown. - ([#6536](https://github.com/realm/realm-swift/issues/6536), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v12 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v10.0.0-beta.7 to v10.0.0-beta.9 -* Upgraded realm-sync from v10.0.0-beta.11 to v10.0.0-beta.14 - -10.0.0-beta.5 Release notes (2020-09-15) -============================================================= - -### Enhancements - -* Add `User.loggedIn`. -* Add support for multiple Realm Apps. -* Remove `[RLMSyncManager shared]`. This is now instatiated as a property on - the app itself. -* Add Combine support for: - * PushClient - * APIKeyAuth - * User - * MongoCollection - * EmailPasswordAuth - * App.login - -### Fixed - -* Fix `MongoCollection.watch` to consistently deliver events on a given queue. -* Fix `[RLMUser logOutWithCompletion]` and `User.logOut` to now log out the - correct user. -* Fix crash on startup on iOS versions older than 13 (since v10.0.0-beta.3). - -### Breaking Changes - -* `RLMSyncManager.pinnedCertificatePaths` has been removed. -* Classes `RLMUserAccountInfo` & `RLMUserInfo` (swift: `UserInfo`, - `UserAccountInfo`) have been removed. -* The following functionality has been renamed to align Cocoa with the other - Realm SDKs: - -| Old API | New API | -|:-------------------------------------------------------------|:---------------------------------------------------------------| -| `RLMUser.identity` | `RLMUser.identifier` | -| `User.identity` | `User.id` | -| `-[RLMCredentials credentialsWithUsername:password:]` | `-[RLMCredentials credentialsWithEmail:password:]` | -| `Credentials(username:password:)` | `Credentials(email:password:)` | -| -`[RLMUser apiKeyAuth]` | `-[RLMUser apiKeysAuth]` | -| `User.apiKeyAuth()` | `User.apiKeysAuth()` | -| `-[RLMEmailPasswordAuth registerEmail:password:completion:]` | `-[RLMEmailPasswordAuth registerUserWithEmail:password:completion:]` | -| `App.emailPasswordAuth().registerEmail(email:password:)` | `App.emailPasswordAuth().registerUser(email:password:)` | - -### Compatibility - -* File format: Generates Realms with format v12 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v10.0.0-beta.6 to v10.0.0-beta.7 -* Upgraded realm-sync from v10.0.0-beta.10 to v10.0.0-beta.11 - -10.0.0-beta.4 Release notes (2020-08-28) -============================================================= - -### Enhancements - -* Add support for the 64-bit watchOS simulator added in Xcode 12. -* Add ability to stream change events on a remote MongoDB collection with - `[RLMMongoCollection watch:delegate:delegateQueue]`, - `MongoCollection.watch(delegate)`. When calling `watch(delegate)` you will be - given a `RLMChangeStream` (`ChangeStream`), this will be used to invalidate - and stop the streaming session by calling `[RLMChangeStream close]` - (`ChangeStream.close()`) when needed. -* Add `MongoCollection.watch`, which is a Combine publisher that will stream - change events each time the remote MongoDB collection is updated. -* Add ability to open a synced Realm with a `nil` partition value. - -### Fixed - -* Realm.Configuration.objectTypes now accepts embedded objects -* Ports fixes from 5.3.5 - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the v10.0.0-beta.x series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v10.0.0-beta.1 to v10.0.0-beta.6 -* Upgraded realm-sync from v10.0.0-beta.2 to v10.0.0-beta.10 - -10.0.0-beta.3 Release notes (2020-08-17) -============================================================= - -This release also contains all changes from 5.3.2. - -### Breaking Changes -* The following classes & aliases have been renamed to align Cocoa with the other Realm SDKs: - -| Old API | New API | -|:------------------------------------------------------------|:---------------------------------------------------------------| -| `RLMSyncUser` | `RLMUser` | -| `SyncUser` | `User` | -| `RLMAppCredential` | `RLMCredential` | -| `AppCredential` | `Credential` | -| `RealmApp` | `App` | -| `RLMUserAPIKeyProviderClient` | `RLMAPIKeyAuth` | -| `RLMUsernamePasswordProviderClient` | `RLMEmailPasswordAuth` | -| `UsernamePasswordProviderClient` | `EmailPasswordAuth` | -| `UserAPIKeyProviderClient` | `APIKeyAuth` | - -* The following functionality has also moved to the User - -| Old API | New API | -|:-------------------------------------------------------------|:--------------------------------------------------------------| -| `[RLMApp callFunctionNamed:]` | `[RLMUser callFunctionNamed:]` | -| `App.functions` | `User.functions` | -| `[RLMApp mongoClientWithServiceName:]` | `[RLMUser mongoClientWithServiceName:]` | -| `App.mongoClient(serviceName)` | `User.mongoClient(serviceName)` | -| `[RLMApp userAPIKeyProviderClient]` | `[RLMUser apiKeyAuth]` | -| `App.userAPIKeyProviderClient` | `App.apiKeyAuth()` | -| `[RLMApp logOut:]` | `[RLMUser logOut]` | -| `App.logOut(user)` | `User.logOut()` | -| `[RLMApp removeUser:]` | `[RLMUser remove]` | -| `App.remove(user)` | `User.remove()` | -| `[RLMApp linkUser:credentials:]` | `[RLMUser linkWithCredentials:]` | -| `App.linkUser(user, credentials)` | `User.link(credentials)` | - -* `refreshCustomData()` on User now returns void and passes the custom data to the callback on success. - -### Compatibility -* This release introduces breaking changes w.r.t some sync classes and MongoDB Realm Cloud functionality. -(See the breaking changes section for the full list) -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* Carthage release for Swift is built with Xcode 11.5. - -10.0.0-beta.2 Release notes (2020-06-09) -============================================================= -Xcode 11.3 and iOS 9 are now the minimum supported versions. - -### Enhancements -* Add support for building with Xcode 12 beta 1. watchOS currently requires - removing x86_64 from the supported architectures. Support for the new 64-bit - watch simulator will come in a future release. - -### Fixed -* Opening a SyncSession with LOCAL app deployments would not use the correct endpoints. -* Linking from embedded objects to top-level objects was incorrectly disallowed. -* Opening a Realm file in file format v6 (created by Realm Cocoa versions - between 2.4 and 2.10) would crash. (Since 5.0.0, [Core #3764](https://github.com/realm/realm-core/issues/3764)). -* Upgrading v9 (pre-5.0) Realm files would create a redundant search index for - primary key properties. This index would then be removed the next time the - Realm was opened, resulting in some extra i/o in the upgrade process. - (Since 5.0.0, [Core #3787](https://github.com/realm/realm-core/issues/3787)). -* Fixed a performance issue with upgrading v9 files with search indexes on - non-primary-key properties. (Since 5.0.0, [Core #3767](https://github.com/realm/realm-core/issues/3767)). - -### Compatibility -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 - -10.0.0-beta.1 Release notes (2020-06-08) -============================================================= - -NOTE: This version bumps the Realm file format to version 11. It is not -possible to downgrade to earlier versions. Older files will automatically be -upgraded to the new file format. Only [Realm Studio -10.0.0](https://github.com/realm/realm-studio/releases/tag/v10.0.0-beta.1) or -later will be able to open the new file format. - -### Enhancements - -* Add support for next generation sync. Support for syncing to MongoDB instead - of Realm Object Server. Applications must be created at realm.mongodb.com -* The memory mapping scheme for Realm files has changed to better support - opening very large files. -* Add support for the ObjectId data type. This is an automatically-generated - unique identifier similar to a GUID or a UUID. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for the Decimal128 data type. This is a 128-bit IEEE 754 decimal - floating point number similar to NSDecimalNumber. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for embedded objects. Embedded objects are objects which are - owned by a single parent object, and are deleted when that parent object is - deleted. They are defined by subclassing `EmbeddedObject` / - `RLMEmbeddedObject` rather than `Object` / `RLMObject`. -* Add `-[RLMSyncUser customData]`/`SyncUser.customData`. Custom data is - configured in your MongoDB Realm App. -* Add `-[RLMApp callFunctionNamed:arguments]`/`RealmApp.functions`. This is the - entry point for calling Remote MongoDB Realm functions. Functions allow you - to define and execute server-side logic for your application. Functions are - written in modern JavaScript (ES6+) and execute in a serverless manner. When - you call a function, you can dynamically access components of the current - application as well as information about the request to execute the function - and the logged in user that sent the request. -* Add `-[RLMApp mongoClientWithServiceName]`/`RealmApp.mongoClient`. This is - the entry point for calling your Remote MongoDB Service. The read operations - are `-[RLMMongoCollection findWhere:completion:]`, `-[RLMMongoCollection - countWhere:completion:]`and `-[RLMMongoCollection - aggregateWithPipeline:completion:]`. The write operations are - `-[RLMMongoCollection insertOneDocument:completion:]`, `-[RLMMongoCollection - insertManyDocuments:completion:]`, `-[RLMMongoCollection - updateOneDocument:completion:]`, `-[RLMMongoCollection - updateManyDocuments:completion:]`, `-[RLMMongoCollection - deleteOneDocument:completion:]`, and `-[RLMMongoCollection - deleteManyDocuments:completion:]`. If you are already familiar with MongoDB - drivers, it is important to understand that the remote MongoCollection only - provides access to the operations available in MongoDB Realm. -* Change `[RLMSyncUser - configurationWithPartitionValue:]`/`SyncUser.configuration(with:)` to accept - all BSON types. Partition values can currently be of types `String`, `Int`, - or `ObjectId`. Opening a realm by partition value is the equivalent of - previously opening a realm by URL. In this case, partitions are meant to be - more closely associated with your data. E.g., if you are running a `Dog` - kennel, and have a field `breed` that acts as your partition key, you could - open up realms based on the breed of the dogs. - -### Breaking Changes - -* We no longer support Realm Cloud (legacy), but instead the new "MongoDB - Realm" Cloud. MongoDB Realm is a serverless platform that enables developers - to quickly build applications without having to set up server infrastructure. - MongoDB Realm is built on top of MongoDB Atlas, automatically integrating the - connection to your database. -* Remove support for Query-based sync, including the configuration parameters - and the `RLMSyncSubscription` and `SyncSubscription` types ([#6437](https://github.com/realm/realm-swift/pull/6437)). -* Primary key properties are no longer marked as being indexed. This reflects - an internal change to how primary keys are handled that should not have any - other visible effects. ([#6440](https://github.com/realm/realm-swift/pull/6440)). -* Remove everything related to sync permissions, including both the path-based - permission system and the object-level privileges for query-based sync. ([#6445](https://github.com/realm/realm-swift/pulls/6445)) -* Primary key uniqueness is now enforced when creating new objects during - migrations, rather than only at the end of migrations. Previously new objects - could be created with duplicate primary keys during a migration as long as - the property was changed to a unique value before the end of the migration, - but now a unique value must be supplied when creating the object. -* Remove support for Realm Object Server. - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 - -5.5.0 Release notes (2020-10-12) -============================================================= - -### Enhancements - -* Add the ability to capture a NotificationToken when using a Combine publisher - that observes a Realm Object or Collection. The user will call - `saveToken(on:at:)` directly after invoking the publisher to use the feature. - -### Fixed - -* When using `Realm.write(withoutNotifying:)` there was a chance that the - supplied observation blocks would not be skipped when in a write transaction. - ([Object Store #1103](https://github.com/realm/realm-object-store/pull/1103)) -* Comparing two identical unmanaged `List<>`/`RLMArray` objects would fail. - ([#5665](https://github.com/realm/realm-swift/issues/5665)). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -5.4.8 Release notes (2020-10-05) -============================================================= - -### Fixed - -* Case-insensitive equality queries on indexed string properties failed to - clear some internal state when rerunning the query. This could manifest as - duplicate results or "key not found" errors. - ([#6830](https://github.com/realm/realm-swift/issues/6830), [#6694](https://github.com/realm/realm-swift/issues/6694), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v6.1.3 to v6.1.4 -* Upgraded realm-sync from v5.0.28 to v5.0.29 - -5.4.7 Release notes (2020-09-30) -============================================================= - -### Fixed - -* Equality queries on indexed string properties would sometimes throw "key not - found" exceptions if the hash of the string happened to have bit 62 set. - ([.NET #2025](https://github.com/realm/realm-dotnet/issues/2025), since v5.0.0). -* Queries comparing non-optional int properties to nil would behave as if they - were comparing against zero instead (since v5.0.0). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v6.1.2 to v6.1.3 -* Upgraded realm-sync from v5.0.27 to v5.0.28 - -5.4.6 Release notes (2020-09-29) -============================================================= - -5.4.5 failed to actually update the core version for installation methods other -than SPM. All changes listed there actually happened in this version for -non-SPM installation methods. - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-sync from v5.0.26 to v5.0.27 - -5.4.5 Release notes (2020-09-28) -============================================================= - -### Enhancements - -* Slightly (<5%) improve the performance of most operations which involve - reading from a Realm file. - -### Fixed - -* Rerunning a equality query on an indexed string property would give incorrect - results if a previous run of the query matched multiple objects and it now - matches one object. This could manifest as either finding a non-matching - object or a "key not found" exception being thrown. - ([#6536](https://github.com/realm/realm-swift/issues/6536), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v6.1.1 to v6.1.2 -* Upgraded realm-sync from v5.0.25 to v5.0.26 - -5.4.4 Release notes (2020-09-25) -============================================================= - -### Enhancements -* Improve the asymtotic performance of NOT IN queries on indexed properties. It - is now O(Number of Rows) rather than O(Number of Rows \* Number of values in IN clause.) - -### Fixed - -* Fix a crash inside `realm::Array(Type)::init_from_mem()` which would - sometimes occur when running a query over links immediately after creating - objects of the queried type. - ([#6789](https://github.com/realm/realm-swift/issues/6789) and possibly others, since 5.0.0). -* Possibly fix problems when changing the type of the primary key of an object - from optional to non-optional. - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v6.0.26 to v6.1.1 -* Upgraded realm-sync from v5.0.23 to v5.0.25 - -5.4.3 Release notes (2020-09-21) -============================================================= - -### Fixed - -* Fix compilation via Carthage when using Xcode 12 ([#6717](https://github.com/realm/realm-swift/issues/6717)). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.12 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -5.4.2 Release notes (2020-09-17) -============================================================= - -### Enhancements - -* Add prebuilt binary for Xcode 12 to the release package. - -### Fixed - -* Fix Archiving the Realm and RealmSwift frameworks with Xcode 12. - ([#6774](https://github.com/realm/realm-swift/issues/6774)) - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.12 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -5.4.1 Release notes (2020-09-16) -============================================================= - -### Enhancements - -* Add prebuilt binary for Xcode 11.7 to the release package. - -### Fixed - -* Fix deadlocks when opening a Realm file in both the iOS simulator and Realm - Studio ([#6743](https://github.com/realm/realm-swift/issues/6743), since 5.3.6). -* Fix Springboard deadlocking when an app is unsuspended while it has an open - Realm file which is stored in an app group on iOS 10-12 - ([#6749](https://github.com/realm/realm-swift/issues/6749), since 5.3.6). -* If you use encryption your application cound crash with a message like - "Opening Realm files of format version 0 is not supported by this version of - Realm". ([#6889](https://github.com/realm/realm-java/issues/6889) among others, since 5.0.0) -* Confining a Realm to a serial queue would throw an error claiming that the - queue was not a serial queue on iOS versions older than 12. - ([#6735](https://github.com/realm/realm-swift/issues/6735), since 5.0.0). -* Results would sometimes give stale results inside a write transaction if a - write which should have updated the Results was made before the first access - of a pre-existing Results object. - ([#6721](https://github.com/realm/realm-swift/issues/6721), since 5.0.0) - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.12 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.7. - -### Internal - -* Upgraded realm-core from v6.0.25 to v6.0.26 -* Upgraded realm-sync from v5.0.22 to v5.0.23 - -5.4.0 Release notes (2020-09-09) -============================================================= - -This version bumps the Realm file format version. This means that older -versions of Realm will be unable to open Realm files written by this version, -and a new version of Realm Studio will be required. There are no actual format -changes and the version bump is just to force a re-migration of incorrectly -upgraded Realms. - -### Fixed - -* Upgrading pre-5.x files with string primary keys would result in a file where - `realm.object(ofType:forPrimaryKey:)` would fail to find the object. - ([#6716](https://github.com/realm/realm-swift/issues/6716), since 5.2.0) -* A write transaction which modifies an object with more than 16 managed - properties and causes the Realm file to grow larger than 2 GB could cause an - assertion failure mentioning "m_has_refs". ([JS #3194](https://github.com/realm/realm-js/issues/3194), since 5.0.0). -* Objects with more than 32 properties could corrupt the Realm file and result - in a variety of crashes. ([Java #7057](https://github.com/realm/realm-java/issues/7057), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.12 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.23 to v6.0.25 -* Upgraded realm-sync from v5.0.20 to v5.0.22 - -5.3.6 Release notes (2020-09-02) -============================================================= - -### Fixed - -* Work around iOS 14 no longer allowing the use of file locks in shared - containers, which resulted in the OS killing an app which entered the - background while a Realm was open ([#6671](https://github.com/realm/realm-swift/issues/6671)). -* If an attempt to upgrade a realm has ended with a crash with "migrate_links()" - in the call stack, the realm was left in an invalid state. The migration - logic now handles this state and can complete upgrading files which were - incompletely upgraded by pre-5.3.4 versions. -* Fix deadlocks when writing to a Realm file on an exFAT partition from macOS. - ([#6691](https://github.com/realm/realm-swift/issues/6691)). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.19 to v6.0.23 -* Upgraded realm-sync from v5.0.16 to v5.0.20 - -5.3.5 Release notes (2020-08-20) -============================================================= - -### Fixed - -* Opening Realms on background threads could produce spurious Incorrect Thread - exceptions when a cached Realm existed for a previously existing thread with - the same thread ID as the current thread. - ([#6659](https://github.com/realm/realm-swift/issues/6659), - [#6689](https://github.com/realm/realm-swift/issues/6689), - [#6712](https://github.com/realm/realm-swift/issues/6712), since 5.0.0). -* Upgrading a table with incoming links but no properties would crash. This was - probably not possible to hit in practice as we reject object types with no - properties. -* Upgrading a non-nullable List which nonetheless contained null values would - crash. This was possible due to missing error-checking in some older versions - of Realm. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.18 to v6.0.19 -* Upgraded realm-sync from v5.0.15 to v5.0.16 - -5.3.4 Release notes (2020-08-17) -============================================================= - -### Fixed - -* Accessing a Realm after calling `deleteAll()` would sometimes throw an - exception with the reason 'ConstIterator copy failed'. ([#6597](https://github.com/realm/realm-swift/issues/6597), since 5.0.0). -* Fix an assertion failure inside the `migrate_links()` function when upgrading - a pre-5.0 Realm file. -* Fix a bug in memory mapping management. This bug could result in multiple - different asserts as well as segfaults. In many cases stack backtraces would - include members of the EncyptedFileMapping near the top - even if encryption - was not used at all. In other cases asserts or crashes would be in methods - reading an array header or array element. In all cases the application would - terminate immediately. ([Core #3838](https://github.com/realm/realm-core/pull/3838), since v5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.14 to v6.0.18 -* Upgraded realm-sync from v5.0.14 to v5.0.15 - -5.3.3 Release notes (2020-07-30) -============================================================= - -### Enhancements - -* Add support for the x86_64 watchOS simulator added in Xcode 12. - -### Fixed - -* (RLM)Results objects would incorrectly pin old read transaction versions - until they were accessed after a Realm was refreshed, resulting in the Realm - file growing to large sizes if a Results was retained but not accessed after - every write. ([#6677](https://github.com/realm/realm-swift/issues/6677), since 5.0.0). -* Fix linker errors when using SwiftUI previews with Xcode 12 when Realm was - installed via Swift Package Manager. ([#6625](https://github.com/realm/realm-swift/issues/6625)) - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.12 to v6.0.14 -* Upgraded realm-sync from v5.0.12 to v5.0.14 - -5.3.2 Release notes (2020-07-21) -============================================================= - -### Fixed - -* Fix a file format upgrade bug when opening older Realm files. Could cause - assertions like "Assertion failed: ref != 0" during opning of a Realm. - ([Core #6644](https://github.com/realm/realm-swift/issues/6644), since 5.2.0) -* A use-after-free would occur if a Realm was compacted, opened on multiple - threads prior to the first write, then written to while reads were happening - on other threads. This could result in a variety of crashes, often inside - realm::util::EncryptedFileMapping::read_barrier. - (Since v5.0.0, [#6626](https://github.com/realm/realm-swift/issues/6626), - [#6628](https://github.com/realm/realm-swift/issues/6628), - [#6652](https://github.com/realm/realm-swift/issues/6652), - [#6655](https://github.com/realm/realm-swift/issues/6555), - [#6656](https://github.com/realm/realm-swift/issues/6656)). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.11 to v6.0.12 -* Upgraded realm-sync from v5.0.11 to v5.0.12 - -5.3.1 Release notes (2020-07-17) -============================================================= - -### Enhancements - -* Add prebuilt binary for Xcode 11.6 to the release package. - -### Fixed - -* Creating an object inside migration which changed that object type's primary - key would hit an assertion failure mentioning primary_key_col - ([#6613](https://github.com/realm/realm-swift/issues/6613), since 5.0.0). -* Modifying the value of a string primary key property inside a migration with - a Realm file which was upgraded from pre-5.0 would corrupt the property's - index, typically resulting in crashes. ([Core #3765](https://github.com/realm/realm-core/issues/3765), since 5.0.0). -* Some Realm files which hit assertion failures when upgrading from the pre-5.0 - file format should now upgrade correctly (Since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.9 to v6.0.11 -* Upgraded realm-sync from v5.0.8 to v5.0.11 - -5.3.0 Release notes (2020-07-14) -============================================================= - -### Enhancements - -* Add `Realm.objectWillChange`, which is a Combine publisher that will emit a - notification each time the Realm is refreshed or a write transaction is - commited. - -### Fixed - -* Fix the spelling of `ObjectKeyIdentifiable`. The old spelling is available - and deprecated for compatibility. -* Rename `RealmCollection.publisher` to `RealmCollection.collectionPublisher`. - The old name interacted with the `publisher` defined by `Sequence` in very - confusing ways, so we need to use a different name. The `publisher` name is - still available for compatibility. ([#6516](https://github.com/realm/realm-swift/issues/6516)) -* Work around "xcodebuild timed out while trying to read - SwiftPackageManagerExample.xcodeproj" errors when installing Realm via - Carthage. ([#6549](https://github.com/realm/realm-swift/issues/6549)). -* Fix a performance regression when using change notifications. (Since 5.0.0, - [#6629](https://github.com/realm/realm-swift/issues/6629)). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v6.0.8 to v6.0.9 -* Upgraded realm-sync from v5.0.7 to v5.0.8 - -5.2.0 Release notes (2020-06-30) -============================================================= - -### Fixed -* Opening a SyncSession with LOCAL app deployments would not use the correct endpoints. -This release also contains all changes from 5.0.3 and 5.1.0. - -### Breaking Changes -* The following classes & aliases have been renamed to align Cocoa with the other Realm SDKs: - -| Old API | New API | -|:------------------------------------------------------------|:---------------------------------------------------------------| -| `RLMSyncUser` | `RLMUser` | -| `SyncUser` | `User` | -| `RLMAppCredential` | `RLMCredential` | -| `AppCredential` | `Credential` | -| `RealmApp` | `App` | -| `RLMUserAPIKeyProviderClient` | `RLMAPIKeyAuth` | -| `RLMUsernamePasswordProviderClient` | `RLMEmailPasswordAuth` | -| `UsernamePasswordProviderClient` | `EmailPasswordAuth` | -| `UserAPIKeyProviderClient` | `APIKeyAuth` | - -* The following functionality has also moved to the User: - -| Old API | New API | -|:-------------------------------------------------------------|:--------------------------------------------------------------| -| `[RLMApp callFunctionNamed:]` | `[RLMUser callFunctionNamed:]` | -| `App.functions` | `User.functions` | -| `[RLMApp mongoClientWithServiceName:]` | `[RLMUser mongoClientWithServiceName:]` | -| `App.mongoClient(serviceName)` | `User.mongoClient(serviceName)` | -| `[RLMApp userAPIKeyProviderClient]` | `[RLMUser apiKeyAuth]` | -| `App.userAPIKeyProviderClient` | `App.apiKeyAuth()` | -| `[RLMApp logOut:]` | `[RLMUser logOut]` | -| `App.logOut(user)` | `User.logOut()` | -| `[RLMApp removeUser:]` | `[RLMUser remove]` | -| `App.remove(user)` | `User.remove()` | -| `[RLMApp linkUser:credentials:]` | `[RLMUser linkWithCredentials:]` | -| `App.linkUser(user, credentials)` | `User.link(credentials)` | - -* The argument labels in Swift have changed for several methods: -| Old API | New API | -|:-------------------------------------------------------------|:--------------------------------------------------------------| -| `APIKeyAuth.createApiKey(withName:completion:)` | `APIKeyAuth.createApiKey(named:completion:)` | -| `App.login(withCredential:completion:) | `App.login(credentials:completion:)` | -| `App.pushClient(withServiceName:)` | `App.pushClient(serviceName:)` | -| `MongoClient.database(withName:)` | `MongoClient.database(named:)` | - -* `refreshCustomData()` on User now returns void and passes the custom data to the callback on success. - -### Compatibility -* This release introduces breaking changes w.r.t some sync classes and MongoDB Realm Cloud functionality. - (See the breaking changes section for the full list) -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* Realm Studio: 10.0.0 or later. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 - -10.0.0-beta.2 Release notes (2020-06-09) -============================================================= -Xcode 11.3 and iOS 9 are now the minimum supported versions. - -### Enhancements - -* Add support for building with Xcode 12 beta 1. watchOS currently requires - removing x86_64 from the supported architectures. Support for the new 64-bit - watch simulator will come in a future release. - -### Fixed -* Opening a SyncSession with LOCAL app deployments would not use the correct endpoints. -* Linking from embedded objects to top-level objects was incorrectly disallowed. - -* Opening a Realm file in file format v6 (created by Realm Cocoa versions - between 2.4 and 2.10) would crash. (Since 5.0.0, [Core #3764](https://github.com/realm/realm-core/issues/3764)). -* Upgrading v9 (pre-5.0) Realm files would create a redundant search index for - primary key properties. This index would then be removed the next time the - Realm was opened, resulting in some extra i/o in the upgrade process. - (Since 5.0.0, [Core #3787](https://github.com/realm/realm-core/issues/3787)). -* Fixed a performance issue with upgrading v9 files with search indexes on - non-primary-key properties. (Since 5.0.0, [Core #3767](https://github.com/realm/realm-core/issues/3767)). - -### Compatibility -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 - -10.0.0-beta.1 Release notes (2020-06-08) -============================================================= - -NOTE: This version bumps the Realm file format to version 11. It is not -possible to downgrade to earlier versions. Older files will automatically be -upgraded to the new file format. Only [Realm Studio -10.0.0](https://github.com/realm/realm-studio/releases/tag/v10.0.0-beta.1) or -later will be able to open the new file format. - -### Enhancements - -* Add support for next generation sync. Support for syncing to MongoDB instead - of Realm Object Server. Applications must be created at realm.mongodb.com -* The memory mapping scheme for Realm files has changed to better support - opening very large files. -* Add support for the ObjectId data type. This is an automatically-generated - unique identifier similar to a GUID or a UUID. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for the Decimal128 data type. This is a 128-bit IEEE 754 decimal - floating point number similar to NSDecimalNumber. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for embedded objects. Embedded objects are objects which are - owned by a single parent object, and are deleted when that parent object is - deleted. They are defined by subclassing `EmbeddedObject` / - `RLMEmbeddedObject` rather than `Object` / `RLMObject`. -* Add `-[RLMSyncUser customData]`/`SyncUser.customData`. Custom data is - configured in your MongoDB Realm App. -* Add `-[RLMApp callFunctionNamed:arguments]`/`RealmApp.functions`. This is the - entry point for calling Remote MongoDB Realm functions. Functions allow you - to define and execute server-side logic for your application. Functions are - written in modern JavaScript (ES6+) and execute in a serverless manner. When - you call a function, you can dynamically access components of the current - application as well as information about the request to execute the function - and the logged in user that sent the request. -* Add `-[RLMApp mongoClientWithServiceName]`/`RealmApp.mongoClient`. This is - the entry point for calling your Remote MongoDB Service. The read operations - are `-[RLMMongoCollection findWhere:completion:]`, `-[RLMMongoCollection - countWhere:completion:]`and `-[RLMMongoCollection - aggregateWithPipeline:completion:]`. The write operations are - `-[RLMMongoCollection insertOneDocument:completion:]`, `-[RLMMongoCollection - insertManyDocuments:completion:]`, `-[RLMMongoCollection - updateOneDocument:completion:]`, `-[RLMMongoCollection - updateManyDocuments:completion:]`, `-[RLMMongoCollection - deleteOneDocument:completion:]`, and `-[RLMMongoCollection - deleteManyDocuments:completion:]`. If you are already familiar with MongoDB - drivers, it is important to understand that the remote MongoCollection only - provides access to the operations available in MongoDB Realm. -* Change `[RLMSyncUser - configurationWithPartitionValue:]`/`SyncUser.configuration(with:)` to accept - all BSON types. Partition values can currently be of types `String`, `Int`, - or `ObjectId`. Opening a realm by partition value is the equivalent of - previously opening a realm by URL. In this case, partitions are meant to be - more closely associated with your data. E.g., if you are running a `Dog` - kennel, and have a field `breed` that acts as your partition key, you could - open up realms based on the breed of the dogs. - -### Breaking Changes - -* We no longer support Realm Cloud (legacy), but instead the new "MongoDB - Realm" Cloud. MongoDB Realm is a serverless platform that enables developers - to quickly build applications without having to set up server infrastructure. - MongoDB Realm is built on top of MongoDB Atlas, automatically integrating the - connection to your database. -* Remove support for Query-based sync, including the configuration parameters - and the `RLMSyncSubscription` and `SyncSubscription` types ([#6437](https://github.com/realm/realm-swift/pull/6437)). -* Primary key properties are no longer marked as being indexed. This reflects - an internal change to how primary keys are handled that should not have any - other visible effects. ([#6440](https://github.com/realm/realm-swift/pull/6440)). -* Remove everything related to sync permissions, including both the path-based - permission system and the object-level privileges for query-based sync. ([#6445](https://github.com/realm/realm-swift/pulls/6445)) -* Primary key uniqueness is now enforced when creating new objects during - migrations, rather than only at the end of migrations. Previously new objects - could be created with duplicate primary keys during a migration as long as - the property was changed to a unique value before the end of the migration, - but now a unique value must be supplied when creating the object. -* Remove support for Realm Object Server. - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* `List.index(of:)` would give incorrect results if it was the very first thing - called on that List after a Realm was refreshed following a write which - modified the List. (Since 5.0.0, [#6606](https://github.com/realm/realm-swift/issues/6606)). -* If a ThreadSafeReference was the only remaining reference to a Realm, - multiple copies of the file could end up mapped into memory at once. This - probably did not have any symptoms other than increased memory usage. (Since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 -* Upgraded realm-core from v6.0.6 to v6.0.7 -* Upgraded realm-sync from v5.0.5 to v5.0.6 -* Upgraded realm-core from v6.0.6 to v6.0.8 -* Upgraded realm-sync from v5.0.5 to v5.0.7 - -5.1.0 Release notes (2020-06-22) -============================================================= - -### Enhancements - -* Allow opening full-sync Realms in read-only mode. This disables local schema - initialization, which makes it possible to open a Realm which the user does - not have write access to without using asyncOpen. In addition, it will report - errors immediately when an operation would require writing to the Realm - rather than reporting it via the sync error handler only after the server - rejects the write. - -### Fixed - -* Opening a Realm using a configuration object read from an existing Realm - would incorrectly bind the new Realm to the original Realm's thread/queue, - resulting in "Realm accessed from incorrect thread." exceptions. - ([#6574](https://github.com/realm/realm-swift/issues/6574), - [#6559](https://github.com/realm/realm-swift/issues/6559), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -5.0.3 Release notes (2020-06-10) -============================================================= - -### Fixed - -* `-[RLMObject isFrozen]` always returned false. ([#6568](https://github.com/realm/realm-swift/issues/6568), since 5.0.0). -* Freezing an object within the write transaction that the object was created - in now throws an exception rather than crashing when the object is first - used. -* The schema for frozen Realms was not properly initialized, leading to crashes - when accessing a RLMLinkingObjects property. - ([#6568](https://github.com/realm/realm-swift/issues/6568), since 5.0.0). -* Observing `Object.isInvalidated` via a keypath literal would produce a - warning in Swift 5.2 due to the property not being marked as @objc. - ([#6554](https://github.com/realm/realm-swift/issues/6554)) - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -5.0.2 Release notes (2020-06-02) -============================================================= - -### Fixed - -* Fix errSecDuplicateItem (-25299) errors when opening a synchronized Realm - when upgrading from pre-5.0 versions of Realm. - ([#6538](https://github.com/realm/realm-swift/issues/6538), [#6494](https://github.com/realm/realm-swift/issues/6494), since 5.0.0). -* Opening Realms stored on filesystems which do not support preallocation (such - as ExFAT) would give "Operation not supported" exceptions. - ([#6508](https://github.com/realm/realm-swift/issues/6508), since 3.2.0). -* 'NoSuchTable' exceptions would sometimes be thrown after upgrading a Relam - file to the v10 format. ([Core #3701](https://github.com/realm/realm-core/issues/3701), since 5.0.0) -* If the upgrade process was interrupted/killed for various reasons, the - following run could stop with some assertions failing. No instances of this - happening were reported to us. (Since 5.0.0). -* Queries filtering a `List` where the query was on an indexed property over a - link would sometimes give incomplete results. - ([#6540](https://github.com/realm/realm-swift/issues/6540), since 4.1.0 but - more common since 5.0.0) -* Opening a file in read-only mode would attempt to make a spurious write to - the file, causing errors if the file was in read-only storage (since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v6.0.4 to v6.0.6 -* Upgraded realm-sync from v5.0.3 to v5.0.5 - -5.0.1 Release notes (2020-05-27) -============================================================= - -### Enhancements - -* Add prebuilt binary for Xcode 11.5 to the release package. - -### Fixed - -* Fix linker error when building a xcframework for Catalyst. - ([#6511](https://github.com/realm/realm-swift/issues/6511), since 4.3.1). -* Fix building for iOS devices when using Swift Package Manager - ([#6522](https://github.com/realm/realm-swift/issues/6522), since 5.0.0). -* `List` and `RealmOptional` properties on frozen objects were not initialized - correctly and would always report `nil` or an empty list. - ([#6527](https://github.com/realm/realm-swift/issues/6527), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -5.0.0 Release notes (2020-05-15) -============================================================= - -NOTE: This version bumps the Realm file format to version 10. It is not -possible to downgrade version 9 or earlier. Files created with older versions -of Realm will be automatically upgraded. Only -[Studio 3.11](https://github.com/realm/realm-studio/releases/tag/v3.11.0) or later will be able -to open the new file format. - -### Enhancements - -* Storing large binary blobs in Realm files no longer forces the file to be at - least 8x the size of the largest blob. -* Reduce the size of transaction logs stored inside the Realm file, reducing - file size growth from large transactions. -* Add support for frozen objects. `Realm`, `Results`, `List` and `Object` now - have `freeze()` methods which return a frozen copy of the object. These - objects behave similarly to creating unmanaged deep copies of the source - objects. They can be read from any thread and do not update when writes are - made to the Realm, but creating frozen objects does not actually copy data - out of the Realm and so can be much faster and use less memory. Frozen - objects cannot be mutated or observed for changes (as they never change). - ([PR #6427](https://github.com/realm/realm-swift/pull/6427)). -* Add the `isFrozen` property to `Realm`, `Results`, `List` and `Object`. -* Add `Realm.Configuration.maxNumberOfActiveVersions`. Each time a write - transaction is performed, a new version is created inside the Realm, and then - any versions which are no longer in use are cleaned up. If too many versions - are kept alive while performing writes (either due to a background thread - performing a long operation that doesn't let the Realm on that thread - refresh, or due to holding onto frozen versions for a long time) the Realm - file will grow in size, potentially to the point where it is too large to be - opened. Setting this configuration option will make write transactions which - would cause the live version count to exceed the limit to instead fail. -* Add support for queue-confined Realms. Rather than being bound to a specific - thread, queue-confined Realms are bound to a serial dispatch queue and can be - used within blocks dispatched to that queue regardless of what thread they - happen to run on. In addition, change notifications will be delivered to that - queue rather than the thread's run loop. ([PR #6478](https://github.com/realm/realm-swift/pull/6478)). -* Add an option to deliver object and collection notifications to a specific - serial queue rather than the current thread. ([PR #6478](https://github.com/realm/realm-swift/pull/6478)). -* Add Combine publishers for Realm types. Realm collections have a `.publisher` - property which publishes the collection each time it changes, and a - `.changesetPublisher` which publishes a `RealmCollectionChange` each time the - collection changes. Corresponding publishers for Realm Objects can be - obtained with the `publisher()` and `changesetPublisher()` global functions. -* Extend Combine publishers which output Realm types with a `.freeze()` - function which will make the publisher instead output frozen objects. -* String primary keys no longer require a separate index, improving insertion - and deletion performance without hurting lookup performance. -* Reduce the encrypted page reclaimer's impact on battery life when encryption - is used. ([Core #3461](https://github.com/realm/realm-core/pull/3461)). - -### Fixed - -* The uploaded bytes in sync progress notifications was sometimes incorrect and - wouldn't exactly equal the uploadable bytes when the uploaded completed. -* macOS binaries were built with the incorrect deployment target (10.14 rather - than 10.9), resulting in linker warnings. ([#6299](https://github.com/realm/realm-swift/issues/6299), since 3.18.0). -* An internal datastructure for List properties could be double-deleted if the - last reference was released from a thread other than the one which the List - was created on at the wrong time. This would typically manifest as - "pthread_mutex_destroy() failed", but could also result in other kinds of - crashes. ([#6333](https://github.com/realm/realm-swift/issues/6333)). -* Sorting on float or double properties containing NaN values had inconsistent - results and would sometimes crash due to out-of-bounds memory accesses. - ([#6357](https://github.com/realm/realm-swift/issues/6357)). - -### Breaking Changes - -* The ObjectChange type in Swift is now generic and includes a reference to the - object which changed. When using `observe(on:)` to receive notifications on a - dispatch queue, the object will be confined to that queue. -* The Realm instance passed in the callback to asyncOpen() is now confined to - the callback queue passed to asyncOpen() rather than the thread which the - callback happens to be called on. This means that the Realm instance may be - stored and reused in further blocks dispatched to that queue, but the queue - must now be a serial queue. -* Files containing Date properties written by version of Realm prior to 1.0 can - no longer be opened. -* Files containing Any properties can no longer be opened. This property type - was never documented and was deprecated in 1.0. -* Deleting objects now preserves the order of objects reported by unsorted - Results rather than performing a swap operation before the delete. Note that - it is still not safe to assume that the order of objects in an unsorted - Results is the order that the objects were created in. -* The minimum supported deployment target for iOS when using Swift Package - Manager to install Realm is now iOS 11. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.4.1. - -### Internal - -* Upgraded realm-core from v5.23.8 to v6.0.4 -* Upgraded realm-sync from v4.9.5 to v5.0.3 - -5.0.0-beta.6 Release notes (2020-05-08) -============================================================= - -### Enhancements - -* Add support for queue-confined Realms. Rather than being bound to a specific - thread, queue-confined Realms are bound to a serial dispatch queue and can be - used within blocks dispatched to that queue regardless of what thread they - happen to run on. In addition, change notifications will be delivered to that - queue rather than the thread's run loop. ([PR #6478](https://github.com/realm/realm-swift/pull/6478)). -* Add an option to deliver object and collection notifications to a specific - serial queue rather than the current thread. ([PR #6478](https://github.com/realm/realm-swift/pull/6478)). - -### Fixed - -* The uploaded bytes in sync progress notifications was sometimes incorrect and - wouldn't exactly equal the uploadable bytes when the uploaded completed. - -### Breaking Changes - -* The Realm instance passed in the callback to asyncOpen() is now confined to - the callback queue passed to asyncOpen() rather than the thread which the - callback happens to be called on. This means that the Realm instance may be - stored and reused in further blocks dispatched to that queue, but the queue - must now be a serial queue. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.4.1. - -### Internal - -* Upgraded realm-core from v6.0.3 to v6.0.4 -* Upgraded realm-sync from v5.0.1 to v5.0.3 - -4.4.1 Release notes (2020-04-16) -============================================================= - -### Enhancements - -* Upgrade Xcode 11.4 binaries to Xcode 11.4.1. - -### Fixed - -* Fix a "previous <= m_schema_transaction_version_max" assertion failure caused - by a race condition that could occur after performing a migration. (Since 3.0.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.4.1. - -5.0.0-beta.3 Release notes (2020-02-26) -============================================================= - -Based on 4.3.2 and also includes all changes since 4.3.0. - -### Enhancements - -* Add support for frozen objects. `Realm`, `Results`, `List` and `Object` now - have `freeze()` methods which return a frozen copy of the object. These - objects behave similarly to creating unmanaged deep copies of the source - objects. They can be read from any thread and do not update when writes are - made to the Realm, but creating frozen objects does not actually copy data - out of the Realm and so can be much faster and use less memory. Frozen - objects cannot be mutated or observed for changes (as they never change). - ([PR #6427](https://github.com/realm/realm-swift/pull/6427)). -* Add the `isFrozen` property to `Realm`, `Results`, `List` and `Object`. -* Add `Realm.Configuration.maxNumberOfActiveVersions`. Each time a write - transaction is performed, a new version is created inside the Realm, and then - any versions which are no longer in use are cleaned up. If too many versions - are kept alive while performing writes (either due to a background thread - performing a long operation that doesn't let the Realm on that thread - refresh, or due to holding onto frozen versions for a long time) the Realm - file will grow in size, potentially to the point where it is too large to be - opened. Setting this configuration option will make write transactions which - would cause the live version count to exceed the limit to instead fail. - - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-core from v6.0.0-beta.3 to v6.0.3 -* Upgraded realm-sync from v5.0.0-beta.2 to v5.0.1 - -5.0.0-beta.2 Release notes (2020-01-13) -============================================================= - -Based on 4.3.0 and also includes all changes since 4.1.1. - -### Fixed - -* Fix compilation when using CocoaPods targeting iOS versions older than 11 (since 5.0.0-alpha). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-core from v6.0.0-beta.2 to v6.0.0-beta.3 -* Upgraded realm-sync from v5.0.0-beta.1 to v5.0.0-beta.2 - -5.0.0-beta.1 Release notes (2019-12-13) -============================================================= - -Based on 4.1.1 and also includes all changes since 4.1.0. - -NOTE: This version bumps the Realm file format to version 10. It is not possible to downgrade version 9 or earlier. Files created with older versions of Realm will be automatically upgraded. - -### Enhancements - -* String primary keys no longer require a separate index, improving insertion - and deletion performance without hurting lookup performance. -* Reduce the encrypted page reclaimer's impact on battery life when encryption - is used. ([Core #3461](https://github.com/realm/realm-core/pull/3461)). - -### Fixed - -* Fix an error when a table-backed Results was accessed immediately after - deleting the object previously at the index being accessed (since - 5.0.0-alpha.1). -* macOS binaries were built with the incorrect deployment target (10.14 rather - than 10.9), resulting in linker warnings. ([#6299](https://github.com/realm/realm-swift/issues/6299), since 3.18.0). -* An internal datastructure for List properties could be double-deleted if the - last reference was released from a thread other than the one which the List - was created on at the wrong time. This would typically manifest as - "pthread_mutex_destroy() failed", but could also result in other kinds of - crashes. ([#6333](https://github.com/realm/realm-swift/issues/6333)). -* Sorting on float or double properties containing NaN values had inconsistent - results and would sometimes crash due to out-of-bounds memory accesses. - ([#6357](https://github.com/realm/realm-swift/issues/6357)). - -### Known Issues - -* Changing which property of an object is the primary key in a migration will - break incoming links to objects of that type. -* Changing the primary key of an object with Data properties in a migration - will crash. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-core from v6.0.0-alpha.24 to v6.0.0-beta.2 -* Upgraded realm-sync from 4.7.1-core6.5 to v5.0.0-beta.1 - -5.0.0-alpha.1 Release notes (2019-11-14) -============================================================= - -Based on 4.1.0. - -### Enhancements - -* Add `-[RLMRealm fileExistsForConfiguration:]`/`Realm.fileExists(for:)`, - which checks if a local Realm file exists for the given configuration. -* Add `-[RLMRealm deleteFilesForConfiguration:]`/`Realm.deleteFiles(for:)` - to delete the Realm file and all auxiliary files for the given configuration. -* Storing large binary blobs in Realm files no longer forces the file to be at - least 8x the size of the largest blob. -* Reduce the size of transaction logs stored inside the Realm file, reducing - file size growth from large transactions. - -NOTE: This version bumps the Realm file format to version 10. It is not -possible to downgrade version 9 or earlier. Files created with older versions -of Realm will be automatically upgraded. This automatic upgrade process is not -yet well tested. Do not open Realm files with data you care about with this -alpha version. - -### Breaking Changes - -* Files containing Date properties written by version of Realm prior to 1.0 can - no longer be opened. -* Files containing Any properties can no longer be opened. This property type - was never documented and was deprecated in 1.0. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades v9) -* Realm Object Server: 3.21.0 or later. -* APIs are backwards compatible with all previous releases in the 4.x.y series. -* Carthage release for Swift is built with Xcode 11.3. -* Carthage release for Swift is built with Xcode 11.2.1. - -### Internal - -* Upgraded realm-core from 5.23.6 to v6.0.0-alpha.24. -* Upgraded realm-sync from 4.8.2 to 4.7.1-core6.5. - -4.4.0 Release notes (2020-03-26) -============================================================= - -Swift 4.0 and Xcode 10.3 are now the minimum supported versions. - -### Enhancements - -* Allow setting the `fileUrl` for synchronized Realms. An appropriate local - path based on the sync URL will still be used if it is not overridden. - ([PR #6454](https://github.com/realm/realm-swift/pull/6454)). -* Add Xcode 11.4 binaries to the release package. - -### Fixed - -* None. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.4. - -4.3.2 Release notes (2020-02-06) -============================================================= - -### Enhancements - -* Similar to `autoreleasepool()`, `realm.write()` now returns the value which - the block passed to it returns. Returning `Void` from the block is still allowed. - -### Fixed - -* Fix a memory leak attributed to `property_copyAttributeList` the first time a - Realm is opened when using Realm Swift. ([#6409](https://github.com/realm/realm-swift/issues/6409), since 4.0.0). -* Connecting to a `realms:` sync URL would crash at runtime on iOS 11 (and no - other iOS versions) inside the SSL validation code. (Since 4.3.1). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-sync from 4.9.4 to 4.9.5. - -4.3.1 Release notes (2020-01-16) -============================================================= - -### Enhancements - -* Reduce the encrypted page reclaimer's impact on battery life when encryption - is used. ([Core #3461](https://github.com/realm/realm-core/pull/3461)). - -### Fixed - -* macOS binaries were built with the incorrect deployment target (10.14 rather - than 10.9), resulting in linker warnings. ([#6299](https://github.com/realm/realm-swift/issues/6299), since 3.18.0). -* An internal datastructure for List properties could be double-deleted if the - last reference was released from a thread other than the one which the List - was created on at the wrong time. This would typically manifest as - "pthread_mutex_destroy() failed", but could also result in other kinds of - crashes. ([#6333](https://github.com/realm/realm-swift/issues/6333)). -* Sorting on float or double properties containing NaN values had inconsistent - results and would sometimes crash due to out-of-bounds memory accesses. - ([#6357](https://github.com/realm/realm-swift/issues/6357)). -* A NOT query on a `List` which happened to have the objects in a - different order than the underlying table would sometimes include the object - immediately before an object which matches the query. ([#6289](https://github.com/realm/realm-swift/issues/6289), since 0.90.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-core from 5.23.6 to 5.23.8. -* Upgraded realm-sync from 4.9.0 to 4.9.4. - -4.3.0 Release notes (2019-12-19) -============================================================= - -### Enhancements - -* Add the ability to set a custom logger function on `RLMSyncManager` which is - called instead of the default NSLog-based logger. -* Expose configuration options for the various types of sync connection - timeouts and heartbeat intervals on `RLMSyncManager`. -* Add an option to have `Realm.asyncOpen()` report an error if the connection - times out rather than swallowing the error and attempting to reconnect until - it succeeds. - -### Fixed - -* Fix a crash when using value(forKey:) on a LinkingObjects property (including - when doing so indirectly, such as by querying on that property). - ([#6366](https://github.com/realm/realm-swift/issues/6366), since 4.0.0). -* Fix a rare crash in `ClientHistoryImpl::integrate_server_changesets()` which - would only happen in Debug builds (since v3.0.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-sync from 4.8.2 to 4.9.0. - -4.2.0 Release notes (2019-12-16) -============================================================= - -### Enhancements - -* Add `-[RLMRealm fileExistsForConfiguration:]`/`Realm.fileExists(for:)`, - which checks if a local Realm file exists for the given configuration. -* Add `-[RLMRealm deleteFilesForConfiguration:]`/`Realm.deleteFiles(for:)` - to delete the Realm file and all auxiliary files for the given configuration. - -### Fixed - -* None. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.3. - -4.1.1 Release notes (2019-11-18) -============================================================= - -### Fixed - -* The UpdatePolicy passed to `realm.add()` or `realm.create()` was not properly - propagated when adding objects within a `List`, which could result in - spurious change notifications when using `.modified`. - ([#6321](https://github.com/realm/realm-swift/issues/6321), since v3.16.0) -* Fix a rare deadlock when a Realm collection or object was observed, then - `refresh()` was explicitly called, and then the NotificationToken from the - observation was destroyed on a different thread (since 0.98.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.2. - -4.1.0 Release notes (2019-11-13) -============================================================= - -### Enhancements - -* Improve performance of queries over a link where the final target property - has an index. -* Restore support for storing `@objc enum` properties on RealmSwift.Object - subclasses (broken in 4.0.0), and add support for storing them in - RealmOptional properties. - -### Fixed - -* The sync client would fail to reconnect after failing to integrate a - changeset. The bug would lead to further corruption of the client’s Realm - file. ([RSYNC-48](https://jira.mongodb.org/browse/RSYNC-48), since v3.2.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.2. - -### Internal - -* Upgraded realm-core from 5.23.5 to 5.23.6. -* Upgraded realm-sync from 4.7.11 to 4.8.2 - -4.0.0 Release notes (2019-11-08) -============================================================= - -### Breaking Changes - -* All previously deprecated functionality has now been removed entirely. -* The schema discovery logic for RealmSwift.Object subclasses has been - rewritten in Swift. This should not have any effect on valid class - definitions, but there may be types of invalid definitions which previously - worked by coincidence and no longer do. -* `SyncSubscription` no longer has a generic type parameter, as the type was - not actually used for anything. -* The following Swift types have changed from `final class` to `struct`: - - AnyRealmCollection - - LinkingObjects - - ObjectiveCSupport - - Realm - - Results - - SyncSubscription - - ThreadSafeReference - There is no intended change in semantics from this, but certain edge cases - may behave differently. -* The designated initializers defined by RLMObject and Object other than - zero-argument `init` have been replaced with convenience initializers. -* The implementation of the path-based permissions API has been redesigned to - accomodate changes to the server. This should be mostly a transparent change, - with two main exceptions: - 1. SyncPermission objects are no longer live Realm objects, and retrieving - permissions gives an Array rather than Results. - Getting up-to-date permissions now requires calling retrievePermissions() again - rather than observing the permissions. - 2. The error codes for permissions functions have changed. Rather than a - separate error type and set of error codes, permission functions now produce - SyncAuthErrors. - -### Enhancements - -* Improve performance of initializing Realm objects with List properties. - -### Fixed - -* None. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.2. - -3.21.0 Release notes (2019-11-04) -============================================================= - -### Enhancements - -* Add prebuilt binaries for Xcode 11.2. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.2. - -3.20.0 Release notes (2019-10-21) -============================================================= - -### Enhancements - -* Add support for custom refresh token authentication. This allows a user to be - authorized with an externally-issued refresh token when ROS is configured to - recognize the external issuer as a refresh token validator. - ([PR #6311](https://github.com/realm/realm-swift/pull/6311)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11. - -3.19.1 Release notes (2019-10-17) -============================================================= - -### Enhancements - -* Improve performance of sync changeset integration. Transactions involving a - very large number of objects and cheap operations on each object are as much - as 20% faster. - -### Fixed - -* Fix a crash when a RLMArray/List of primitives was observed and then the - containing object was deleted before the first time that the background - notifier could run. - ([Issue #6234](https://github.com/realm/realm-swift/issues/6234, since 3.0.0)). -* Remove an incorrect assertion that would cause crashes inside - `TableInfoCache::get_table_info()`, with messages like "Assertion failed: info.object_id_index == 0 [3, 0]". - (Since 3.18.0, [#6268](https://github.com/realm/realm-swift/issues/6268) and [#6257](https://github.com/realm/realm-swift/issues/6257)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.0. - -### Internal - -* Upgrade to REALM_SYNC_VERSION=4.7.11 - -3.19.0 Release notes (2019-09-27) -============================================================= - -### Enhancements - -* Expose ObjectSchema.objectClass in Swift as looking up the class via - NSClassFromString() can be complicated for Swift types. - ([PR #6244](https://github.com/realm/realm-swift/pull/6244)). -* Add support for suppressing notifications using closure-based write/transaction methods. - ([PR #6252](https://github.com/realm/realm-swift/pull/6252)). - -### Fixed - -* IN or chained OR equals queries on an unindexed string column would fail to - match some results if any of the strings were 64 bytes or longer. - ([Core #3386](https://github.com/realm/realm-core/pull/3386), since 3.14.2). -* Query Based Sync subscriptions for queries involving a null timestamp were - not sent to the server correctly and would match no objects. - ([Core #3389](https://github.com/realm/realm-core/pull/3388), since 3.17.3). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.0. - -### Internal - -* Upgrade to REALM_CORE_VERSION=5.23.5 -* Upgrade to REALM_SYNC_VERSION=4.7.8 - -3.18.0 Release notes (2019-09-13) -============================================================= - -The file format for synchronized Realms has changed. Old Realms will be -automatically upgraded when they are opened. Once upgraded, the files will not -be openable by older versions of Realm. The upgrade should not take a -significant amount of time to run or run any risk of errors. - -This does not effect non-synchronized Realms. - -### Enhancements - -* Improve performance of queries on Date properties - ([Core #3344](https://github.com/realm/realm-core/pull/3344), [Core #3351](https://github.com/realm/realm-core/pull/3351)). -* Syncronized Realms are now more aggressive about trimming local history that - is no longer needed. This should reduce file size growth in write-heavy - workloads. ([Sync #3007](https://github.com/realm/realm-sync/issues/3007)). -* Add support for building Realm as an xcframework. - ([PR #6238](https://github.com/realm/realm-swift/pull/6238)). -* Add prebuilt libraries for Xcode 11 to the release package. - ([PR #6248](https://github.com/realm/realm-swift/pull/6248)). -* Add a prebuilt library for Catalyst/UIKit For Mac to the release package - ([PR #6248](https://github.com/realm/realm-swift/pull/6248)). - -### Fixed - -* If a signal interrupted a msync() call, Realm would throw an exception and - the write transaction would fail. This behavior has new been changed to retry - the system call instead. ([Core #3352](https://github.com/realm/realm-core/issues/3352)) -* Queries on the sum or average of an integer property would sometimes give - incorrect results. ([Core #3356](https://github.com/realm/realm-core/pull/3356)). -* Opening query-based synchronized Realms with a small number of subscriptions - performed an unneccesary write transaction. ([ObjectStore #815](https://github.com/realm/realm-object-store/pull/815)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.0 - -### Deprecations - -* `RLMIdentityProviderNickname` has been deprecated in favor of `RLMIdentityProviderUsernamePassword`. -* `+[RLMIdentityProvider credentialsWithNickname]` has been deprecated in favor of `+[RLMIdentityProvider credentialsWithUsername]`. -* `Sync.nickname(String, Bool)` has been deprecated in favor of `Sync.usernamePassword(String, String, Bool)`. - -3.17.3 Release notes (2019-07-24) -============================================================= - -### Enhancements - -* Add Xcode 10.3 binaries to the release package. Remove the Xcode 9.2 and 9.3 binaries. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.3. - -3.17.1 Release notes (2019-07-10) -============================================================= - -### Enhancements - -* Add support for canceling asynchronous opens using a new AsyncOpenTask - returned from the asyncOpen() call. ([PR #6193](https://github.com/realm/realm-swift/pull/6193)). -* Importing the Realm SPM package can now be done by pinning to a version - rather than a branch. - -### Fixed - -* Queries on a List/RLMArray which checked an indexed int property would - sometimes give incorrect results. - ([#6154](https://github.com/realm/realm-swift/issues/6154)), since v3.15.0) -* Queries involving an indexed int property had a memory leak if run multiple - times. ([#6186](https://github.com/realm/realm-swift/issues/6186)), since v3.15.0) -* Creating a subscription with `includeLinkingObjects:` performed unneccesary - comparisons, making it extremely slow when large numbers of objects were - involved. ([Core #3311](https://github.com/realm/realm-core/issues/3311), since v3.15.0) - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.17.0 Release notes (2019-06-28) -============================================================= - -### Enhancements - -* Add support for including Realm via Swift Package Manager. This currently - requires depending on the branch "master" rather than pinning to a version - (i.e. `.package(url: "https://github.com/realm/realm-swift", .branch("master"))`). - ([#6187](https://github.com/realm/realm-swift/pull/6187)). -* Add Codable conformance to RealmOptional and List, and Encodable conformance to Results. - ([PR #6172](https://github.com/realm/realm-swift/pull/6172)). - -### Fixed - -* Attempting to observe an unmanaged LinkingObjects object crashed rather than - throwing an approriate exception (since v0.100.0). -* Opening an encrypted Realm could potentially report that a valid file was - corrupted if the system was low on free memory. - (since 3.14.0, [Core #3267](https://github.com/realm/realm-core/issues/3267)) -* Calling `Realm.asyncOpen()` on multiple Realms at once would sometimes crash - due to a `FileNotFound` exception being thrown on a background worker thread. - (since 3.16.0, [ObjectStore #806](https://github.com/realm/realm-object-store/pull/806)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.16.2 Release notes (2019-06-14) -============================================================= - -### Enhancements - -* Add support for Xcode 11 Beta 1. Xcode betas are only supported when building - from source, and not when using a prebuilt framework. - ([PR #6164](https://github.com/realm/realm-swift/pull/6164)). - -### Fixed - -* Using asyncOpen on query-based Realms which didn't already exist on the local - device would fail with error 214. - ([#6178](https://github.com/realm/realm-swift/issues/6178), since 3.16.0). -* asyncOpen on query-based Realms did not wait for the server-created - permission objects to be downloaded, resulting in crashes if modifications to - the permissions were made before creating a subscription for the first time (since 3.0.0). -* EINTR was not handled correctly in the notification worker, which may have - resulted in inconsistent and rare assertion failures in - `ExternalCommitHelper::listen()` when building with assertions enabled. - (PR: [#804](https://github.com/realm/realm-object-store/pull/804), since 0.91.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.16.1 Release notes (2019-05-31) -============================================================= - -### Fixed - -* The static type passed at compile time to `realm.create()` was checked for a - primary key rather than the actual type passed at runtime, resulting in - exceptions like "''RealmSwiftObject' does not have a primary key and can not - be updated'" being thrown even if the object type being created has a primary - key. (since 3.16.0, [#6159](https://github.com/realm/realm-swift/issues/6159)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.16.0 Release notes (2019-05-29) -============================================================= - -### Enhancements - -* Add an option to only set the properties which have values different from the - existing ones when updating an existing object with - `Realm.create()`/`-[RLMObject createOrUpdateInRealm:withValue:]`. This makes - notifications report only the properties which have actually changed, and - improves Object Server performance by reducing the number of operations to - merge. (Issue: [#5970](https://github.com/realm/realm-swift/issues/5970), - PR: [#6149](https://github.com/realm/realm-swift/pull/6149)). -* Using `-[RLMRealm asyncOpenWithConfiguration:callbackQueue:]`/`Realm.asyncOpen()` to open a - synchronized Realm which does not exist on the local device now uses an - optimized transfer method to download the initial data for the Realm, greatly - speeding up the first start time for applications which use full - synchronization. This is currently not applicable to query-based - synchronization. (PR: [#6106](https://github.com/realm/realm-swift/pull/6106)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.15.0 Release notes (2019-05-06) -============================================================= - -The minimum version of Realm Object Server has been increased to 3.21.0 and -attempting to connect to older versions will produce protocol mismatch errors. -Realm Cloud has already been upgraded to this version, and users using that do -not need to worry about this. - -### Enhancements - -* Add `createdAt`, `updatedAt`, `expiresAt` and `timeToLive` properties to - `RLMSyncSubscription`/`SyncSubscription`. These properties will be `nil` for - subscriptions created with older versions of Realm, but will be automatically - populated for newly-created subscriptions. -* Add support for transient subscriptions by setting the `timeToLive` when - creating the subscription. The next time a subscription is created or updated - after that time has elapsed the subscription will be automatically removed. -* Add support for updating existing subscriptions with a new query or limit. - This is done by passing `update: true` (in swift) or setting - `options.overwriteExisting = YES` (in obj-c) when creating the subscription, - which will make it update the existing subscription with the same name rather - than failing if one already exists with that name. -* Add an option to include the objects from - `RLMLinkingObjects`/`LinkingObjects` properties in sync subscriptions, - similarly to how `RLMArray`/`List` automatically pull in the contained - objects. -* Improve query performance for chains of OR conditions (or an IN condition) on - an unindexed integer or string property. - ([Core PR #2888](https://github.com/realm/realm-core/pull/2888) and - [Core PR #3250](https://github.com/realm/realm-core/pull/3250)). -* Improve query performance for equality conditions on indexed integer properties. - ([Core PR #3272](https://github.com/realm/realm-core/pull/3272)). -* Adjust the file allocation algorithm to reduce fragmentation caused by large - numbers of small blocks. -* Improve file allocator logic to reduce fragmentation and improve commit - performance after many writes. ([Core PR #3278](https://github.com/realm/realm-core/pull/3278)). - -### Fixed - -* Making a query that compares two integer properties could cause a - segmentation fault on x86 (i.e. macOS only). - ([Core PR #3253](https://github.com/realm/realm-core/pull/3256)). -* The `downloadable_bytes` parameter passed to sync progress callbacks reported - a value which correlated to the amount of data left to download, but not - actually the number of bytes which would be downloaded. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.14.2 Release notes (2019-04-25) -============================================================= - -### Enhancements - -* Updating `RLMSyncManager.customRequestHeaders` will immediately update all - currently active sync session with the new headers rather than requiring - manually closing the Realm and reopening it. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.14.1 Release notes (2019-04-04) -============================================================= - -### Fixed - -* Fix "Cannot find interface declaration for 'RealmSwiftObject', superclass of - 'MyRealmObjectClass'" errors when building for a simulator with Xcode 10.2 - with "Install Objective-C Compatibility Header" enabled. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. -* Carthage release for Swift is built with Xcode 10.2. - -3.14.0 Release notes (2019-03-27) -============================================================= - -### Enhancements - -* Reduce memory usage when committing write transactions. -* Improve performance of compacting encrypted Realm files. - ([PR #3221](https://github.com/realm/realm-core/pull/3221)). -* Add a Xcode 10.2 build to the release package. - -### Fixed - -* Fix a memory leak whenever Realm makes a HTTP(s) request to the Realm Object - Server (Issue [#6058](https://github.com/realm/realm-swift/issues/6058), since 3.8.0). -* Fix an assertion failure when creating an object in a synchronized Realm - after creating an object with a null int primary key in the same write - transaction. - ([PR #3227](https://github.com/realm/realm-core/pull/3227)). -* Fix some new warnings when building with Xcode 10.2 beta. -* Properly clean up sync sessions when the last Realm object using the session - is deallocated while the session is explicitly suspended (since 3.9.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. -* Carthage release for Swift is built with Xcode 10.2. - -### Internal - -* Throw an exception rather than crashing with an assertion failure in more - cases when opening invalid Realm files. -* Upgrade to REALM_CORE_VERSION=5.14.0 -* Upgrade to REALM_SYNC_VERSION=3.15.1 - -3.13.1 Release notes (2019-01-03) -============================================================= - -### Fixed - -* Fix a crash when iterating over `Realm.subscriptions()` using for-in. - (Since 3.13.0, PR [#6050](https://github.com/realm/realm-swift/pull/6050)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -3.13.0 Release notes (2018-12-14) -============================================================= - -### Enhancements - -* Add `Realm.subscriptions()`/`-[RLMRealm subscriptions]` and - `Realm.subscription(named:)`/`-[RLMRealm subscriptionWithName:]` to enable - looking up existing query-based sync subscriptions. - (PR: https://github.com/realm/realm-swift/pull/6029). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -3.12.0 Release notes (2018-11-26) -============================================================= - -### Enhancements - -* Add a User-Agent header to HTTP requests made to the Realm Object Server. By - default, this contains information about the Realm library version and your - app's bundle ID. The application identifier can be customized by setting - `RLMSyncManager.sharedManager.userAgent`/`SyncManager.shared.userAgent` prior - to opening a synchronized Realm. - (PR: https://github.com/realm/realm-swift/pull/6007). -* Add Xcode 10.1 binary to the prebuilt package. - -### Fixed - -* None. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -### Internal - -* None. - - -3.11.2 Release notes (2018-11-15) -============================================================= - -### Enhancements - -* Improve the performance of the merge algorithm used for integrating remote - changes from the server. In particular, changesets involving many objects - which all link to a single object should be greatly improved. - -### Fixed - -* Fix a memory leak when removing notification blocks from collections. - PR: [#702](https://github.com/realm/realm-object-store/pull/702), since 1.1.0. -* Fix re-sorting or distincting an already-sorted Results using values from - linked objects. Previously the unsorted order was used to read the values - from the linked objects. - PR [#3102](https://github.com/realm/realm-core/pull/3102), since 3.1.0. -* Fix a set of bugs which could lead to bad changeset assertions when using - sync. The assertions would look something like the following: - `[realm-core-5.10.0] Assertion failed: ndx < size() with (ndx, size()) = [742, 742]`. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -### Internal - -* None. - - -3.11.1 Release notes (2018-10-19) -============================================================= - -### Enhancements - -* None. - -### Fixed - -* Fix `SyncUser.requestEmailConfirmation` not triggering the email confirmation - flow on ROS. (PR [#5953](https://github.com/realm/realm-swift/pull/5953), since 3.5.0) -* Add some missing validation in the getters and setters of properties on - managed Realm objects, which would sometimes result in an application - crashing with a segfault rather than the appropriate exception being thrown - when trying to write to an object which has been deleted. - (PR [#5952](https://github.com/realm/realm-swift/pull/5952), since 2.8.0) - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -### Internal - -* None. - - -3.11.0 Release notes (2018-10-04) -============================================================= - -### Enhancements -* Reduce memory usage when integrating synchronized changes sent by ROS. -* Devices will now report download progress for read-only Realms, allowing the - server to compact Realms more aggressively and reducing the amount of - server-side storage space required. - -### Fixed -* Fix a crash when adding an object with a non-`@objc` `String?` property which - has not been explicitly ignored to a Realm on watchOS 5 (and possibly other - platforms when building with Xcode 10). - (Issue: [5929](https://github.com/realm/realm-swift/issues/5929)). -* Fix some merge algorithm bugs which could result in `BadChangesetError` - being thrown when integrating changes sent by the server. - -### Compatibility -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* **NOTE!!! - You will need to upgrade your Realm Object Server to at least version 3.11.0 - or use [Realm Cloud](https://cloud.realm.io). - If you try to connect to a ROS v3.10.x or previous, you will see an error - like `Wrong protocol version in Sync HTTP request, client protocol version = 25, - server protocol version = 24`.** - -### Internal -* Update to Sync 3.12.2. - - -3.10.0 Release notes (2018-09-19) -============================================================= - -Prebuilt binaries are now built for Xcode 9.2, 9.3, 9.4 and 10.0. - -Older versions of Xcode are still supported when building from source, but you -should be migrating to at least Xcode 9.2 as soon as possible. - -### Enhancements - -* Add support for Watch Series 4 by adding an arm64_32 slice to the library. - -3.9.0 Release notes (2018-09-10) -============================================================= - -### Enhancements - -* Expose RLMSyncUser.refreshToken publicly so that it can be used for custom - HTTP requests to Realm Object Server. -* Add RLMSyncSession.connectionState, which reports whether the session is - currently connected to the Realm Object Server or if it is offline. -* Add `-suspend` and `-resume` methods to `RLMSyncSession` to enable manually - pausing data synchronization. -* Add support for limiting the number of objects matched by a query-based sync - subscription. This requires a server running ROS 3.10.1 or newer. - -### Bugfixes - -* Fix crash when getting the description of a `MigrationObject` which has - `List` properties. -* Fix crash when calling `dynamicList()` on a `MigrationObject`. - -3.8.0 Release notes (2018-09-05) -============================================================= - -### Enhancements - -* Remove some old and no longer applicable migration logic which created an - unencrypted file in the sync metadata directory containing a list of ROS URLs - connected to. -* Add support for pinning SSL certificates used for https and realms - connections by setting `RLMSyncManager.sharedManager.pinnedCertificatePaths` - in obj-c and `SyncManager.shared.pinnedCertificatePaths` in Swift. - -### Bugfixes - -* Fix warnings when building Realm as a static framework with CocoaPods. - -3.7.6 Release notes (2018-08-08) -============================================================= - -### Enhancements - -* Speed up the actual compaction when using compact-on-launch. -* Reduce memory usage when locally merging changes from sync. -* When first connecting to a server, wait to begin uploading changes until - after all changes have been downloaded to reduce the server-side load for - query-based sync. - -3.7.5 Release notes (2018-07-23) -============================================================= - -### Enhancements - -* Improve performance of applying remote changesets from sync. -* Improve performance of creating objects with string primary keys. -* Improve performance of large write transactions. -* Adjust file space allocation strategy to reduce fragmentation, producing - smaller Realm files and typically better performance. -* Close network connections immediately when a sync session is destroyed. -* Report more information in `InvalidDatabase` exceptions. - -### Bugfixes - -* Fix permission denied errors for RLMPlatform.h when building with CocoaPods - and Xcode 10 beta 3. -* Fix a use-after-free when canceling a write transaction which could result in - incorrect "before" values in KVO observations (typically `nil` when a non-nil - value is expected). -* Fix several bugs in the merge algorithm that could lead to memory corruption - and crashes with errors like "bad changeset" and "unreachable code". - -3.7.4 Release notes (2018-06-19) -============================================================= - -### Bugfixes - -* Fix a bug which could potentially flood Realm Object Server with PING - messages after a client device comes back online. - -3.7.3 Release notes (2018-06-18) -============================================================= - -### Enhancements - -* Avoid performing potentially large amounts of pointless background work for - LinkingObjects instances which are accessed and then not immediate deallocated. - -### Bugfixes - -* Fix crashes which could result from extremely fragmented Realm files. -* Fix a bug that could result in a crash with the message "bad changeset error" - when merging changesets from the server. - -3.7.2 Release notes (2018-06-13) -============================================================= - -### Enhancements - -* Add some additional consistency checks that will hopefully produce better - errors when the "prev_ref + prev_size <= ref" assertion failure occurs. - -### Bugfixes - -* Fix a problem in the changeset indexing algorithm that would sometimes - cause "bad permission object" and "bad changeset" errors. -* Fix a large number of linking warnings about symbol visibility by aligning - compiler flags used. -* Fix large increase in size of files produced by `Realm.writeCopy()` introduced in 3.6.0. - -3.7.1 Release notes (2018-06-07) -============================================================= - -* Add support for compiling Realm Swift with Xcode 10 beta 1. - -3.7.0 Release notes (2018-06-06) -============================================================= - -The feature known as Partial Sync has been renamed to Query-based -Synchronization. This has impacted a number of API's. See below for the -details. - -### Deprecations - -* `+[RLMSyncConfiguration initWithUser] has been deprecated in favor of `-[RLMSyncUser configurationWithURL:url]. -* `+[RLMSyncConfiguration automaticConfiguration] has been deprecated in favor of `-[RLMSyncUser configuration]. -* `+[RLMSyncConfiguration automaticConfigurationForUser] has been deprecated in favor of `-[RLMSyncUser configuration]. -* `-[RLMSyncConfiguration isPartial] has been deprecated in favor of `-[RLMSyncConfiguration fullSynchronization]`. - -### Enhancements - -* Add `-[RLMRealm syncSession]` and `Realm.syncSession` to obtain the session used for a synchronized Realm. -* Add `-[RLMSyncUser configuration]`. Query-based sync is the default sync mode for this configuration. -* Add `-[RLMSyncUser configurationWithURL:url]`. Query-based sync is the default sync mode for this configuration. - -3.6.0 Release notes (2018-05-29) -============================================================= - -### Enhancements - -* Improve performance of sync metadata operations and resolving thread-safe - references. -* `shouldCompactOnLaunch` is now supported for compacting the local data of - synchronized Realms. - -### Bugfixes - -* Fix a potential deadlock when a sync session progress callback held the last - strong reference to the sync session. -* Fix some cases where comparisons to `nil` in queries were not properly - serialized when subscribing to a query. -* Don't delete objects added during a migration after a call to `-[RLMMigration - deleteDataForClassName:]`. -* Fix incorrect results and/or crashes when multiple `-[RLMMigration - enumerateObjects:block:]` blocks deleted objects of the same type. -* Fix some edge-cases where `-[RLMMigration enumerateObjects:block:]` - enumerated the incorrect objects following deletions. -* Restore the pre-3.5.0 behavior for Swift optional properties missing an ivar - rather than crashing. - -3.5.0 Release notes (2018-04-25) -============================================================= - -### Enhancements - -* Add wrapper functions for email confirmation and password reset to `SyncUser`. - -### Bugfixes - -* Fix incorrect results when using optional chaining to access a RealmOptional - property in Release builds, or otherwise interacting with a RealmOptional - object after the owning Object has been deallocated. - -3.4.0 Release notes (2018-04-19) -============================================================= - -The prebuilt binary for Carthage is now built for Swift 4.1. - -### Enhancements - -* Expose `RLMSyncManager.authorizationHeaderName`/`SyncManager.authorizationHeaderName` - as a way to override the transport header for Realm Object Server authorization. -* Expose `RLMSyncManager.customRequestHeaders`/`SyncManager.customRequestHeaders` - which allows custom HTTP headers to be appended on requests to the Realm Object Server. -* Expose `RLMSSyncConfiguration.urlPrefix`/`SyncConfiguration.urlPrefix` as a mechanism - to replace the default path prefix in Realm Sync WebSocket requests. - -3.3.2 Release notes (2018-04-03) -============================================================= - -Add a prebuilt binary for Xcode 9.3. - -3.3.1 Release notes (2018-03-28) -============================================================= - -Realm Object Server v3.0.0 or newer is required when using synchronized Realms. - -### Enhancements - -* Expose `RLMObject.object(forPrimaryKey:)` as a factory method for Swift so - that it is callable with recent versions of Swift. - -### Bugfixes - -* Exclude the RLMObject-derived Permissions classes from the types repored by - `Realm.Configuration.defaultConfiguration.objectTypes` to avoid a failed - cast. -* Cancel pending `Realm.asyncOpen()` calls when authentication fails with a - non-transient error such as missing the Realm path in the URL. -* Fix "fcntl() inside prealloc()" errors on APFS. - -3.3.0 Release notes (2018-03-19) -============================================================= - -Realm Object Server v3.0.0 or newer is required when using synchronized Realms. - -### Enhancements - -* Add `Realm.permissions`, `Realm.permissions(forType:)`, and `Realm.permissions(forClassNamed:)` as convenience - methods for accessing the permissions of the Realm or a type. - -### Bugfixes - -* Fix `+[RLMClassPermission objectInRealm:forClass:]` to work for classes that are part of the permissions API, - such as `RLMPermissionRole`. -* Fix runtime errors when applications define an `Object` subclass with the - same name as one of the Permissions object types. - -3.2.0 Release notes (2018-03-15) -============================================================= - -Realm Object Server v3.0.0 or newer is required when using synchronized Realms. - -### Enhancements - -* Added an improved API for adding subscriptions in partially-synchronized Realms. `Results.subscribe()` can be - used to subscribe to any result set, and the returned `SyncSubscription` object can be used to observe the state - of the subscription and ultimately to remove the subscription. See the documentation for more information - (). -* Added a fine-grained permissions system for use with partially-synchronized Realms. This allows permissions to be - defined at the level of individual objects or classes. See the documentation for more information - (). -* Added `SyncConfiguration.automatic()` and `SyncConfiguration.automatic(user:)`. - These methods return a `Realm.Configuration` appropriate for syncing with the default - synced Realm for the current (or specified) user. These should be considered the preferred methods - for accessing synced Realms going forwards. -* Added `+[RLMSyncSession sessionForRealm:]` to retrieve the sync session corresponding to a `RLMRealm`. - -### Bugfixes - -* Fix incorrect initalization of `RLMSyncManager` that made it impossible to - set `errorHandler`. -* Fix compiler warnings when building with Xcode 9.3. -* Fix some warnings when running with UBsan. - -3.2.0-rc.1 Release notes (2018-03-14) -============================================================= - -Realm Object Server v3.0.0-rc.1 or newer is required when using synchronized Realms. - -### Enhancements - -* Added `SyncConfiguration.automatic()` and `SyncConfiguration.automatic(user:)`. - These methods return a `Realm.Configuration` appropriate for syncing with the default - synced Realm for the current (or specified). These should be considered the preferred methods - for accessing synced Realms going forwards. -* A role is now automatically created for each user with that user as its only member. - This simplifies the common use case of restricting access to specific objects to a single user. - This role can be accessed at `PermissionUser.role`. -* Improved error reporting when the server rejects a schema change due to a lack of permissions. - -### Bugfixes - -* Fix incorrect initalization of `RLMSyncManager` that made it impossible to - set `errorHandler`. -* Fix compiler warnings when building with Xcode 9.3. - -3.2.0-beta.3 Release notes (2018-03-01) -============================================================= - -Realm Object Server v3.0.0-alpha.9 or newer is required when using synchronized Realms. - -### Bugfixes - -* Fix a crash that would occur when using partial sync with Realm Object Server v3.0.0-alpha.9. - -3.2.0-beta.2 Release notes (2018-02-28) -============================================================= - -Realm Object Server v3.0.0-alpha.8 or newer is required when using synchronized Realms. - -### Enhancements - -* Added `findOrCreate(forRoleNamed:)` and `findOrCreate(forRole:)` to `List` - to simplify the process of adding permissions for a role. -* Added `+permissionForRoleNamed:inArray:`, `+permissionForRoleNamed:onRealm:`, - `+permissionForRoleNamed:onClass:realm:`, `+permissionForRoleNamed:onClassNamed:realm:`, - and `+permissionForRoleNamed:onObject:` to `RLMSyncPermission` to simplify the process - of adding permissions for a role. -* Added `+[RLMSyncSession sessionForRealm:]` to retrieve the sync session corresponding to a `RLMRealm`. - -### Bugfixes - -* `PermissionRole.users` and `PermissionUser.roles` are now public as intended. -* Fixed the handling of `setPermissions` in `-[RLMRealm privilegesForRealm]` and related methods. - -3.2.0-beta.1 Release notes (2018-02-19) -============================================================= - -### Enhancements - -* Added an improved API for adding subscriptions in partially-synchronized Realms. `Results.subscribe()` can be - used to subscribe to any result set, and the returned `SyncSubscription` object can be used to observe the state - of the subscription and ultimately to remove the subscription. -* Added a fine-grained permissions system for use with partially-synchronized Realms. This allows permissions to be - defined at the level of individual objects or classes. See `Permission` and related types for more information. - -### Bugfixes - -* Fix some warnings when running with UBsan. - -3.1.1 Release notes (2018-02-03) -============================================================= - -Prebuilt Swift frameworks for Carthage are now built with Xcode 9.2. - -### Bugfixes - -* Fix a memory leak when opening Realms with an explicit `objectTypes` array - from Swift. - -3.1.0 Release notes (2018-01-16) -============================================================= - -* Prebuilt frameworks are now included for Swift 3.2.3 and 4.0.3. -* Prebuilt frameworks are no longer included for Swift 3.0.x. -* Building from source with Xcode versions prior to Xcode 8.3 is no longer supported. - -### Enhancements - -* Add `Results.distinct(by:)` / `-[RLMResults distinctResultsUsingKeyPaths:]`, which return a `Results` - containing only objects with unique values at the given key paths. -* Improve performance of change checking for notifications in certain cases. -* Realm Object Server errors not explicitly recognized by the client are now reported to the application - regardless. -* Add support for JSON Web Token as a sync credential source. -* Add support for Nickname and Anonymous Auth as a sync credential source. -* Improve allocator performance when writing to a highly fragmented file. This - should significantly improve performance when inserting large numbers of - objects which have indexed properties. -* Improve write performance for complex object graphs involving many classes - linking to each other. - -### Bugfixes - -* Add a missing check for a run loop in the permission API methods which - require one. -* Fix some cases where non-fatal sync errors were being treated as fatal errors. - -3.0.2 Release notes (2017-11-08) -============================================================= - -Prebuilt frameworks are now included for Swift 3.2.2 and 4.0.2. - -### Bugfixes - -* Fix a crash when a linking objects property is retrieved from a model object instance via - Swift subscripting. -* Fix incorrect behavior if a call to `posix_fallocate` is interrupted. - -3.0.1 Release notes (2017-10-26) -============================================================= - -### Bugfixes - -* Explicitly exclude KVO-generated object subclasses from the schema. -* Fix regression where the type of a Realm model class is not properly determined, causing crashes - when a type value derived at runtime by `type(of:)` is passed into certain APIs. -* Fix a crash when an `Object` subclass has implicitly ignored `let` - properties. -* Fix several cases where adding a notification block from within a - notification callback could produce incorrect results. - -3.0.0 Release notes (2017-10-16) -============================================================= - -### Breaking Changes -* iOS 7 is no longer supported. -* Synchronized Realms require a server running Realm Object Server v2.0 or higher. -* Computed properties on Realm object types are detected and no - longer added to the automatically generated schema. -* The Objective-C and Swift `create(_:, value: update:)` APIs now - correctly nil out nullable properties when updating an existing - object when the `value` argument specifies nil or `NSNull` for - the property value. -* `-[RLMRealm addOrUpdateObjects:]` and `-[RLMRealm deleteObjects:]` now - require their argument to conform to `NSFastEnumeration`, to match similar - APIs that also take collections. -* The way interactive sync errors (client reset and permission denied) - are delivered to the user has been changed. Instead of a block which can - be invoked to immediately delete the offending Realm file, an opaque - token object of type `RLMSyncErrorActionToken` will be returned in the - error object's `userInfo` dictionary. This error object can be passed - into the new `+[RLMSyncSession immediatelyHandleError:]` API to delete - the files. -* The return types of the `SyncError.clientResetInfo()` and - `SyncError.deleteRealmUserInfo()` APIs have been changed. They now return - `RLMSyncErrorActionToken`s or `SyncError.ActionToken`s instead of closures. -* The class methods `Object.className()`, `Object.objectUtilClass()`, and - the property `Object.isInvalidated` can no longer be overriden. -* The callback which runs when a sync user login succeeds or fails - now runs on the main queue by default, or can be explicitly specified - by a new `callbackQueue` parameter on the `{RLM}SyncUser.logIn(...)` API. -* Fix empty strings, binary data, and null on the right side of `BEGINSWITH`, - `ENDSWITH` and `CONTAINS` operators in predicates to match Foundation's - semantics of never matching any strings or data. -* Swift `Object` comparison and hashing behavior now works the same way as - that of `RLMObject` (objects are now only considered equatable if their - model class defines a primary key). -* Fix the way the hash property works on `Object` when the object model has - no primary key. -* Fix an issue where if a Swift model class defined non-generic managed - properties after generic Realm properties (like `List`), the schema - would be constructed incorrectly. Fixes an issue where creating such - models from an array could fail. -* Loosen `RLMArray` and `RLMResults`'s generic constraint from `RLMObject` to - `NSObject`. This may result in having to add some casts to disambiguate - types. -* Remove `RLMSyncPermissionResults`. `RLMSyncPermission`s are now vended out - using a `RLMResults`. This results collection supports all normal collection - operations except for setting values using key-value coding (since - `RLMSyncPermission`s are immutable) and the property aggregation operations. -* `RLMSyncUserInfo` has been significantly enhanced. It now contains metadata - about a user stored on the Realm Object Server, as well as a list of all user account - data associated with that user. -* Starting with Swift 4, `List` now conforms to `MutableCollection` instead of - `RangeReplaceableCollection`. For Swift 4, the empty collection initializer has been - removed, and default implementations of range replaceable collection methods that - make sense for `List` have been added. -* `List.removeLast()` now throws an exception if the list is empty, to more closely match - the behavior of the standard library's `Collection.removeLast()` implementation. -* `RealmCollection`'s associated type `Element` has been renamed `ElementType`. -* The following APIs have been renamed: - -| Old API | New API | -|:------------------------------------------------------------|:---------------------------------------------------------------| -| `NotificationToken.stop()` | `NotificationToken.invalidate()` | -| `-[RLMNotificationToken stop]` | `-[RLMNotificationToken invalidate]` | -| `RealmCollection.addNotificationBlock(_:)` | `RealmCollection.observe(_:)` | -| `RLMSyncProgress` | `RLMSyncProgressMode` | -| `List.remove(objectAtIndex:)` | `List.remove(at:)` | -| `List.swap(_:_:)` | `List.swapAt(_:_:)` | -| `SyncPermissionValue` | `SyncPermission` | -| `RLMSyncPermissionValue` | `RLMSyncPermission` | -| `-[RLMSyncPermission initWithRealmPath:userID:accessLevel]` | `-[RLMSyncPermission initWithRealmPath:identity:accessLevel:]` | -| `RLMSyncPermission.userId` | `RLMSyncPermission.identity` | -| `-[RLMRealm addOrUpdateObjectsInArray:]` | `-[RLMRealm addOrUpdateObjects:]` | - -* The following APIs have been removed: - -| Removed API | Replacement | -|:-------------------------------------------------------------|:------------------------------------------------------------------------------------------| -| `Object.className` | None, was erroneously present. | -| `RLMPropertyTypeArray` | `RLMProperty.array` | -| `PropertyType.array` | `Property.array` | -| `-[RLMArray sortedResultsUsingProperty:ascending:]` | `-[RLMArray sortedResultsUsingKeyPath:ascending:]` | -| `-[RLMCollection sortedResultsUsingProperty:ascending:]` | `-[RLMCollection sortedResultsUsingKeyPath:ascending:]` | -| `-[RLMResults sortedResultsUsingProperty:ascending:]` | `-[RLMResults sortedResultsUsingKeyPath:ascending:]` | -| `+[RLMSortDescriptor sortDescriptorWithProperty:ascending:]` | `+[RLMSortDescriptor sortDescriptorWithKeyPath:ascending:]` | -| `RLMSortDescriptor.property` | `RLMSortDescriptor.keyPath` | -| `AnyRealmCollection.sorted(byProperty:ascending:)` | `AnyRealmCollection.sorted(byKeyPath:ascending:)` | -| `List.sorted(byProperty:ascending:)` | `List.sorted(byKeyPath:ascending:)` | -| `LinkingObjects.sorted(byProperty:ascending:)` | `LinkingObjects.sorted(byKeyPath:ascending:)` | -| `Results.sorted(byProperty:ascending:)` | `Results.sorted(byKeyPath:ascending:)` | -| `SortDescriptor.init(property:ascending:)` | `SortDescriptor.init(keyPath:ascending:)` | -| `SortDescriptor.property` | `SortDescriptor.keyPath` | -| `+[RLMRealm migrateRealm:configuration:]` | `+[RLMRealm performMigrationForConfiguration:error:]` | -| `RLMSyncManager.disableSSLValidation` | `RLMSyncConfiguration.enableSSLValidation` | -| `SyncManager.disableSSLValidation` | `SyncConfiguration.enableSSLValidation` | -| `RLMSyncErrorBadResponse` | `RLMSyncAuthErrorBadResponse` | -| `RLMSyncPermissionResults` | `RLMResults` | -| `SyncPermissionResults` | `Results` | -| `RLMSyncPermissionChange` | `-[RLMSyncUser applyPermission:callback]` / `-[RLMSyncUser deletePermission:callback:]` | -| `-[RLMSyncUser permissionRealmWithError:]` | `-[RLMSyncUser retrievePermissionsWithCallback:]` | -| `RLMSyncPermissionOffer` | `-[RLMSyncUser createOfferForRealmAtURL:accessLevel:expiration:callback:]` | -| `RLMSyncPermissionOfferResponse` | `-[RLMSyncUser acceptOfferForToken:callback:]` | -| `-[NSError rlmSync_clientResetBlock]` | `-[NSError rlmSync_errorActionToken]` / `-[NSError rlmSync_clientResetBackedUpRealmPath]` | -| `-[NSError rlmSync_deleteRealmBlock]` | `-[NSError rlmSync_errorActionToken]` | - -### Enhancements -* `List` can now contain values of types `Bool`, `Int`, `Int8`, `Int16`, - `Int32`, `Int64`, `Float`, `Double`, `String`, `Data`, and `Date` (and - optional versions of all of these) in addition to `Object` subclasses. - Querying `List`s containing values other than `Object` subclasses is not yet - implemented. -* `RLMArray` can now be constrained with the protocols `RLMBool`, `RLMInt`, - `RLMFloat`, `RLMDouble`, `RLMString`, `RLMData`, and `RLMDate` in addition to - protocols defined with `RLM_ARRAY_TYPE`. By default `RLMArray`s of - non-`RLMObject` types can contain null. Indicating that the property is - required (by overriding `+requiredProperties:`) will instead make the values - within the array required. Querying `RLMArray`s containing values other than - `RLMObject` subclasses is not yet implemented. -* Add a new error code to denote 'permission denied' errors when working - with synchronized Realms, as well as an accompanying block that can be - called to inform the binding that the offending Realm's files should be - deleted immediately. This allows recovering from 'permission denied' - errors in a more robust manner. See the documentation for - `RLMSyncErrorPermissionDeniedError` for more information. -* Add Swift `Object.isSameObject(as:_)` API to perform the same function as - the existing Objective-C API `-[RLMObject isEqualToObject:]`. -* Opening a synced Realm whose local copy was created with an older version of - Realm Mobile Platfrom when a migration is not possible to the current version - will result in an `RLMErrorIncompatibleSyncedFile` / `incompatibleSyncedFile` - error. When such an error occurs, the original file is moved to a backup - location, and future attempts to open the synchronized Realm will result in a new - file being created. If you wish to migrate any data from the backup Realm you can - open it using the backup Realm configuration available on the error object. -* Add a preview of partial synchronization. Partial synchronization allows a - synchronized Realm to be opened in such a way that only objects requested by - the user are synchronized to the device. You can use it by setting the - `isPartial` property on a `SyncConfiguration`, opening the Realm, and then - calling `Realm.subscribe(to:where:callback:)` with the type of object you're - interested in, a string containing a query determining which objects you want - to subscribe to, and a callback which will report the results. You may add as - many subscriptions to a synced Realm as necessary. - -### Bugfixes -* Realm no longer throws an "unsupported instruction" exception in some cases - when opening a synced Realm asynchronously. -* Realm Swift APIs that filter or look up the index of an object based on a - format string now properly handle optional arguments in their variadic argument - list. -* `-[RLMResults indexOfObject:]` now properly accounts for access - level. -* Fix a race condition that could lead to a crash accessing to the freed configuration object - if a default configuration was set from a different thread. -* Fixed an issue that crash when enumerating after clearing data during migration. -* Fix a bug where a synced Realm couldn't be reopened even after a successful client reset - in some cases. -* Fix a bug where the sync subsystem waited too long in certain cases to reconnect to the server. -* Fix a bug where encrypted sync-related metadata was incorrectly deleted from upgrading users, - resulting in all users being logged out. -* Fix a bug where permission-related data continued to be synced to a client even after the user - that data belonged to logged out. -* Fix an issue where collection notifications might be delivered inconsistently if a notification - callback was added within another callback for the same collection. - -3.0.0-rc.2 Release notes (2017-10-14) -============================================================= - -### Enhancements -* Reinstate `RLMSyncPermissionSortPropertyUserID` to allow users to sort permissions - to their own Realms they've granted to others. - -### Bugfixes -* `-[RLMResults indexOfObject:]` now properly accounts for access - level. -* Fix a race condition that could lead to a crash accessing to the freed configuration object - if a default configuration was set from a different thread. -* Fixed an issue that crash when enumerating after clearing data during migration. -* Fix a bug where a synced Realm couldn't be reopened even after a successful client reset - in some cases. -* Fix a bug where the sync subsystem waited too long in certain cases to reconnect to the server. -* Fix a bug where encrypted sync-related metadata was incorrectly deleted from upgrading users, - resulting in all users being logged out. -* Fix a bug where permission-related data continued to be synced to a client even after the user - that data belonged to logged out. -* Fix an issue where collection notifications might be delivered inconsistently if a notification - callback was added within another callback for the same collection. - -3.0.0-rc.1 Release notes (2017-10-03) -============================================================= - -### Breaking Changes -* Remove `RLMSyncPermissionSortPropertyUserID` to reflect changes in how the - Realm Object Server reports permissions for a user. -* Remove `RLMSyncPermissionOffer` and `RLMSyncPermissionOfferResponse` classes - and associated helper methods and functions. Use the - `-[RLMSyncUser createOfferForRealmAtURL:accessLevel:expiration:callback:]` - and `-[RLMSyncUser acceptOfferForToken:callback:]` methods instead. - -### Bugfixes - -* The keychain item name used by Realm to manage the encryption keys for - sync-related metadata is now set to a per-app name based on the bundle - identifier. Keys that were previously stored within the single, shared Realm - keychain item will be transparently migrated to the per-application keychain - item. -* Fix downloading of the Realm core binaries when Xcode's command-line tools are - set as the active developer directory for command-line interactions. -* Fix a crash that could occur when resolving a ThreadSafeReference to a `List` - whose parent object had since been deleted. - -3.0.0-beta.4 Release notes (2017-09-22) -============================================================= - -### Breaking Changes - -* Rename `List.remove(objectAtIndex:)` to `List.remove(at:)` to match the name - used by 'RangeReplaceableCollection'. -* Rename `List.swap()` to `List.swapAt()` to match the name used by 'Array'. -* Loosen `RLMArray` and `RLMResults`'s generic constraint from `RLMObject` to - `NSObject`. This may result in having to add some casts to disambiguate - types. -* Remove `RLMPropertyTypeArray` in favor of a separate bool `array` property on - `RLMProperty`/`Property`. -* Remove `RLMSyncPermissionResults`. `RLMSyncPermission`s are now vended out - using a `RLMResults`. This results collection supports all normal collection - operations except for setting values using KVO (since `RLMSyncPermission`s are - immutable) and the property aggregation operations. -* `RealmCollection`'s associated type `Element` has been renamed `ElementType`. -* Realm Swift collection types (`List`, `Results`, `AnyRealmCollection`, and - `LinkingObjects` have had their generic type parameter changed from `T` to - `Element`). -* `RealmOptional`'s generic type parameter has been changed from `T` to `Value`. -* `RLMSyncUserInfo` has been significantly enhanced. It now contains metadata - about a user stored on the Realm Object Server, as well as a list of all user account - data associated with that user. -* Starting with Swift 4, `List` now conforms to `MutableCollection` instead of - `RangeReplaceableCollection`. For Swift 4, the empty collection initializer has been - removed, and default implementations of range replaceable collection methods that - make sense for `List` have been added. -* `List.removeLast()` now throws an exception if the list is empty, to more closely match - the behavior of the standard library's `Collection.removeLast()` implementation. - -### Enhancements - -* `List` can now contain values of types `Bool`, `Int`, `Int8`, `Int16`, - `Int32`, `Int64`, `Float`, `Double`, `String`, `Data`, and `Date` (and - optional versions of all of these) in addition to `Object` subclasses. - Querying `List`s containing values other than `Object` subclasses is not yet - implemented. -* `RLMArray` can now be constrained with the protocols `RLMBool`, `RLMInt`, - `RLMFloat`, `RLMDouble`, `RLMString`, `RLMData`, and `RLMDate` in addition to - protocols defined with `RLM_ARRAY_TYPE`. By default `RLMArray`s of - non-`RLMObject` types can contain null. Indicating that the property is - required (by overriding `+requiredProperties:`) will instead make the values - within the array required. Querying `RLMArray`s containing values other than - `RLMObject` subclasses is not yet implemented. -* Opening a synced Realm whose local copy was created with an older version of - Realm Mobile Platfrom when a migration is not possible to the current version - will result in an `RLMErrorIncompatibleSyncedFile` / `incompatibleSyncedFile` - error. When such an error occurs, the original file is moved to a backup - location, and future attempts to open the synchronized Realm will result in a new - file being created. If you wish to migrate any data from the backup Realm you can - open it using the backup Realm configuration available on the error object. -* Add preview support for partial synchronization. Partial synchronization is - allows a synchronized Realm to be opened in such a way that only objects - requested by the user are synchronized to the device. You can use it by setting - the `isPartial` property on a `SyncConfiguration`, opening the Realm, and then - calling `Realm.subscribe(to:where:callback:)` with the type of object you're - interested in, a string containing a query determining which objects you want - to subscribe to, and a callback which will report the results. You may add as - many subscriptions to a synced Realm as necessary. - -### Bugfixes - -* Realm Swift APIs that filter or look up the index of an object based on a - format string now properly handle optional arguments in their variadic argument - list. - -3.0.0-beta.3 Release notes (2017-08-23) -============================================================= - -### Breaking Changes - -* iOS 7 is no longer supported. -* Computed properties on Realm object types are detected and no - longer added to the automatically generated schema. -* `-[RLMRealm addOrUpdateObjectsInArray:]` has been renamed to - `-[RLMRealm addOrUpdateObjects:]` for consistency with similar methods - that add or delete objects. -* `-[RLMRealm addOrUpdateObjects:]` and `-[RLMRealm deleteObjects:]` now - require their argument to conform to `NSFastEnumeration`, to match similar - APIs that also take collections. -* Remove deprecated `{RLM}SyncPermission` and `{RLM}SyncPermissionChange` - classes. -* `{RLM}SyncPermissionValue` has been renamed to just `{RLM}SyncPermission`. - Its `userId` property has been renamed `identity`, and its - `-initWithRealmPath:userID:accessLevel:` initializer has been renamed - `-initWithRealmPath:identity:accessLevel:`. -* Remove deprecated `-[RLMSyncUser permissionRealmWithError:]` and - `SyncUser.permissionRealm()` APIs. Use the new permissions system. -* Remove deprecated error `RLMSyncErrorBadResponse`. Use - `RLMSyncAuthErrorBadResponse` instead. -* The way interactive sync errors (client reset and permission denied) - are delivered to the user has been changed. Instead of a block which can - be invoked to immediately delete the offending Realm file, an opaque - token object of type `RLMSyncErrorActionToken` will be returned in the - error object's `userInfo` dictionary. This error object can be passed - into the new `+[RLMSyncSession immediatelyHandleError:]` API to delete - the files. -* Remove `-[NSError rlmSync_clientResetBlock]` and - `-[NSError rlmSync_deleteRealmBlock]` APIs. -* The return types of the `SyncError.clientResetInfo()` and - `SyncError.deleteRealmUserInfo()` APIs have been changed. They now return - `RLMSyncErrorActionToken`s or `SyncError.ActionToken`s instead of closures. -* The (erroneously added) instance property `Object.className` has been - removed. -* The class methods `Object.className()`, `Object.objectUtilClass()`, and - the property `Object.isInvalidated` can no longer be overriden. -* The callback which runs when a sync user login succeeds or fails - now runs on the main queue by default, or can be explicitly specified - by a new `callbackQueue` parameter on the `{RLM}SyncUser.logIn(...)` API. -* Rename `{RLM}NotificationToken.stop()` to `invalidate()` and - `{RealmCollection,SyncPermissionResults}.addNotificationBlock(_:)` to - `observe(_:)` to mirror Foundation's new KVO APIs. -* The `RLMSyncProgress` enum has been renamed `RLMSyncProgressMode`. -* Remove deprecated `{RLM}SyncManager.disableSSLValidation` property. Disable - SSL validation on a per-Realm basis by setting the `enableSSLValidation` - property on `{RLM}SyncConfiguration` instead. -* Fix empty strings, binary data, and null on the right side of `BEGINSWITH`, - `ENDSWITH` and `CONTAINS` operators in predicates to match Foundation's - semantics of never matching any strings or data. -* Swift `Object` comparison and hashing behavior now works the same way as - that of `RLMObject` (objects are now only considered equatable if their - model class defines a primary key). -* Fix the way the hash property works on `Object` when the object model has - no primary key. -* Fix an issue where if a Swift model class defined non-generic managed - properties after generic Realm properties (like `List`), the schema - would be constructed incorrectly. Fixes an issue where creating such - models from an array could fail. - -### Enhancements - -* Add Swift `Object.isSameObject(as:_)` API to perform the same function as - the existing Objective-C API `-[RLMObject isEqualToObject:]`. -* Expose additional authentication-related errors that might be reported by - a Realm Object Server. -* An error handler can now be registered on `{RLM}SyncUser`s in order to - report authentication-related errors that affect the user. - -### Bugfixes - -* Sync users are now automatically logged out upon receiving certain types - of errors that indicate they are no longer logged into the server. For - example, users who are authenticated using third-party credentials will find - themselves logged out of the Realm Object Server if the third-party identity - service indicates that their credential is no longer valid. -* Address high CPU usage and hangs in certain cases when processing collection - notifications in highly-connected object graphs. - -3.0.0-beta.2 Release notes (2017-07-26) -============================================================= - -### Breaking Changes - -* Remove the following deprecated Objective-C APIs: - `-[RLMArray sortedResultsUsingProperty:ascending:]`, - `-[RLMCollection sortedResultsUsingProperty:ascending:]`, - `-[RLMResults sortedResultsUsingProperty:ascending:]`, - `+[RLMSortDescriptor sortDescriptorWithProperty:ascending:]`, - `RLMSortDescriptor.property`. - These APIs have been superseded by equivalent APIs that take - or return key paths instead of property names. -* Remove the following deprecated Objective-C API: - `+[RLMRealm migrateRealm:configuration:]`. - Please use `+[RLMRealm performMigrationForConfiguration:error:]` instead. -* Remove the following deprecated Swift APIs: - `AnyRealmCollection.sorted(byProperty:, ascending:)`, - `LinkingObjects.sorted(byProperty:, ascending:)`, - `List.sorted(byProperty:, ascending:)`, - `Results.sorted(byProperty:, ascending:)`, - `SortDescriptor.init(property:, ascending:)`, - `SortDescriptor.property`. - These APIs have been superseded by equivalent APIs that take - or return key paths instead of property names. -* The Objective-C and Swift `create(_:, value: update:)` APIs now - correctly nil out nullable properties when updating an existing - object when the `value` argument specifies nil or `NSNull` for - the property value. - -### Enhancements - -* It is now possible to create and log in multiple Realm Object Server users - with the same identity if they originate from different servers. Note that - if the URLs are different aliases for the same authentication server each - user will still be treated as separate (e.g. they will have their own copy - of each synchronized Realm opened using them). It is highly encouraged that - users defined using the access token credential type be logged in with an - authentication server URL specified; this parameter will become mandatory - in a future version of the SDK. -* Add `-[RLMSyncUser retrieveInfoForUser:identityProvider:completion:]` - API allowing administrator users to retrieve information about a user based - on their provider identity (for example, a username). Requires any edition - of the Realm Object Server 1.8.2 or later. - -### Bugfixes - -* Realm no longer throws an "unsupported instruction" exception in some cases - when opening a synced Realm asynchronously. - -3.0.0-beta Release notes (2017-07-14) -============================================================= - -### Breaking Changes - -* Synchronized Realms require a server running Realm Object Server v2.0 or higher. - -### Enhancements - -* Add a new error code to denote 'permission denied' errors when working - with synchronized Realms, as well as an accompanying block that can be - called to inform the binding that the offending Realm's files should be - deleted immediately. This allows recovering from 'permission denied' - errors in a more robust manner. See the documentation for - `RLMSyncErrorPermissionDeniedError` for more information. -* Add `-[RLMSyncPermissionValue initWithRealmPath:username:accessLevel:]` - API allowing permissions to be applied to a user based on their username - (usually, an email address). Requires any edition of the Realm Object - Server 1.6.0 or later. -* Improve performance of creating Swift objects which contain at least one List - property. - -### Bugfixes - -* `List.description` now reports the correct types for nested lists. -* Fix unmanaged object initialization when a nested property type returned - `false` from `Object.shouldIncludeInDefaultSchema()`. -* Don't clear RLMArrays on self-assignment. - -2.10.2 Release notes (2017-09-27) -============================================================= - -### Bugfixes - -* The keychain item name used by Realm to manage the encryption keys for - sync-related metadata is now set to a per-app name based on the bundle - identifier. Keys that were previously stored within the single, shared Realm - keychain item will be transparently migrated to the per-application keychain - item. -* Fix downloading of the Realm core binaries when Xcode's command-line tools are - set as the active developer directory for command-line interactions. -* Fix a crash that could occur when resolving a ThreadSafeReference to a `List` - whose parent object had since been deleted. - -2.10.1 Release notes (2017-09-14) -============================================================= - -Swift binaries are now produced for Swift 3.0, 3.0.1, 3.0.2, 3.1, 3.2 and 4.0. - -### Enhancements - -* Auxiliary files are excluded from backup by default. - -### Bugfixes - -* Fix more cases where assigning an RLMArray property to itself would clear the - RLMArray. - -2.10.0 Release notes (2017-08-21) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Expose additional authentication-related errors that might be reported by - a Realm Object Server. -* An error handler can now be registered on `{RLM}SyncUser`s in order to - report authentication-related errors that affect the user. - -### Bugfixes - -* Sorting Realm collection types no longer throws an exception on iOS 7. -* Sync users are now automatically logged out upon receiving certain types - of errors that indicate they are no longer logged into the server. For - example, users who are authenticated using third-party credentials will find - themselves logged out of the Realm Object Server if the third-party identity - service indicates that their credential is no longer valid. -* Address high CPU usage and hangs in certain cases when processing collection - notifications in highly-connected object graphs. - -2.9.1 Release notes (2017-08-01) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* The `shouldCompactOnLaunch` block is no longer invoked if the Realm at that - path is already open on other threads. -* Fix an assertion failure in collection notifications when changes are made to - the schema via sync while the notification block is active. - -2.9.0 Release notes (2017-07-26) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Add a new error code to denote 'permission denied' errors when working - with synchronized Realms, as well as an accompanying block that can be - called to inform the binding that the offending Realm's files should be - deleted immediately. This allows recovering from 'permission denied' - errors in a more robust manner. See the documentation for - `RLMSyncErrorPermissionDeniedError` for more information. -* Add `-[RLMSyncPermissionValue initWithRealmPath:username:accessLevel:]` - API allowing permissions to be applied to a user based on their username - (usually, an email address). Requires any edition of the Realm Object - Server 1.6.0 or later. -* Improve performance of creating Swift objects which contain at least one List - property. -* It is now possible to create and log in multiple Realm Object Server users - with the same identity if they originate from different servers. Note that - if the URLs are different aliases for the same authentication server each - user will still be treated as separate (e.g. they will have their own copy - of each synchronized Realm opened using them). It is highly encouraged that - users defined using the access token credential type be logged in with an - authentication server URL specified; this parameter will become mandatory - in a future version of the SDK. -* Add `-[RLMSyncUser retrieveInfoForUser:identityProvider:completion:]` - API allowing administrator users to retrieve information about a user based - on their provider identity (for example, a username). Requires any edition - of the Realm Object Server 1.8.2 or later. - -### Bugfixes - -* `List.description` now reports the correct types for nested lists. -* Fix unmanaged object initialization when a nested property type returned - `false` from `Object.shouldIncludeInDefaultSchema()`. -* Don't clear RLMArrays on self-assignment. - -2.8.3 Release notes (2017-06-20) -============================================================= - -### Bugfixes - -* Properly update RealmOptional properties when adding an object with `add(update: true)`. -* Add some missing quotes in error messages. -* Fix a performance regression when creating objects with primary keys. - -2.8.2 Release notes (2017-06-16) -============================================================= - -### Bugfixes - -* Fix an issue where synchronized Realms would eventually disconnect from the - remote server if the user object used to define their sync configuration - was destroyed. -* Restore support for changing primary keys in migrations (broken in 2.8.0). -* Revert handling of adding objects with nil properties to a Realm to the - pre-2.8.0 behavior. - -2.8.1 Release notes (2017-06-12) -============================================================= - -Add support for building with Xcode 9 Beta 1. - -### Bugfixes - -* Fix setting a float property to NaN. -* Fix a crash when using compact on launch in combination with collection - notifications. - -2.8.0 Release notes (2017-06-02) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Enable encryption on watchOS. -* Add `-[RLMSyncUser changePassword:forUserID:completion:]` API to change an - arbitrary user's password if the current user has administrative privileges - and using Realm's 'password' authentication provider. - Requires any edition of the Realm Object Server 1.6.0 or later. - -### Bugfixes - -* Suppress `-Wdocumentation` warnings in Realm C++ headers when using CocoaPods - with Xcode 8.3.2. -* Throw an appropriate error rather than crashing when an RLMArray is assigned - to an RLMArray property of a different type. -* Fix crash in large (>4GB) encrypted Realm files. -* Improve accuracy of sync progress notifications. -* Fix an issue where synchronized Realms did not connect to the remote server - in certain situations, such as when an application was offline when the Realms - were opened but later regained network connectivity. - -2.7.0 Release notes (2017-05-03) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Use reachability API to minimize the reconnection delay if the network - connection was lost. -* Add `-[RLMSyncUser changePassword:completion:]` API to change the current - user's password if using Realm's 'password' authentication provider. - Requires any edition of the Realm Object Server 1.4.0 or later. -* `{RLM}SyncConfiguration` now has an `enableSSLValidation` property - (and default parameter in the Swift initializer) to allow SSL validation - to be specified on a per-server basis. -* Transactions between a synced Realm and a Realm Object Server can now - exceed 16 MB in size. -* Add new APIs for changing and retrieving permissions for synchronized Realms. - These APIs are intended to replace the existing Realm Object-based permissions - system. Requires any edition of the Realm Object Server 1.1.0 or later. - -### Bugfixes - -* Support Realm model classes defined in Swift with overridden Objective-C - names (e.g. `@objc(Foo) class SwiftFoo: Object {}`). -* Fix `-[RLMMigration enumerateObjects:block:]` returning incorrect `oldObject` - objects when enumerating a class name after previously deleting a `newObject`. -* Fix an issue where `Realm.asyncOpen(...)` would fail to work when opening a - synchronized Realm for which the user only had read permissions. -* Using KVC to set a `List` property to `nil` now clears it to match the - behavior of `RLMArray` properties. -* Fix crash from `!m_awaiting_pong` assertion failure when using synced Realms. -* Fix poor performance or hangs when performing case-insensitive queries on - indexed string properties that contain many characters that don't differ - between upper and lower case (e.g., numbers, punctuation). - -2.6.2 Release notes (2017-04-21) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix an issue where calling `Realm.asyncOpen(...)` with a synchronized Realm - configuration would fail with an "Operation canceled" error. -* Fix initial collection notification sometimes not being delivered for synced - Realms. -* Fix circular links sometimes resulting in objects not being marked as - modified in change notifications. - -2.6.1 Release notes (2017-04-18) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix an issue where calling `Realm.asyncOpen(...)` with a synchronized Realm - configuration would crash in error cases rather than report the error. - This is a small source breaking change if you were relying on the error - being reported to be a `Realm.Error`. - -2.6.0 Release notes (2017-04-18) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Add a `{RLM}SyncUser.isAdmin` property indicating whether a user is a Realm - Object Server administrator. -* Add an API to asynchronously open a Realm and deliver it to a block on a - given queue. This performs all work needed to get the Realm to - a usable state (such as running potentially time-consuming migrations) on a - background thread before dispatching to the given queue. In addition, - synchronized Realms wait for all remote content available at the time the - operation began to be downloaded and available locally. -* Add `shouldCompactOnLaunch` block property when configuring a Realm to - determine if it should be compacted before being returned. -* Speed up case-insensitive queries on indexed string properties. -* Add RLMResults's collection aggregate methods to RLMArray. -* Add support for calling the aggregate methods on unmanaged Lists. - -### Bugfixes - -* Fix a deadlock when multiple processes open a Realm at the same time. -* Fix `value(forKey:)`/`value(forKeyPath:)` returning incorrect values for `List` properties. - -2.5.1 Release notes (2017-04-05) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix CocoaPods installation with static libraries and multiple platforms. -* Fix uncaught "Bad version number" exceptions on the notification worker thread - followed by deadlocks when Realms refresh. - -2.5.0 Release notes (2017-03-28) -============================================================= - -Files written by Realm this version cannot be read by earlier versions of Realm. -Old files can still be opened and files open in read-only mode will not be -modified. - -If using synchronized Realms, the Realm Object Server must be running version -1.3.0 or later. - -Swift binaries are now produced for Swift 3.0, 3.0.1, 3.0.2 and 3.1. - -### API Breaking Changes - -* None. - -### Enhancements - -* Add support for multi-level object equality comparisons against `NULL`. -* Add support for the `[d]` modifier on string comparison operators to perform - diacritic-insensitive comparisons. -* Explicitly mark `[[RLMRealm alloc] init]` as unavailable. -* Include the name of the problematic class in the error message when an - invalid property type is marked as the primary key. - -### Bugfixes - -* Fix incorrect column type assertions which could occur after schemas were - merged by sync. -* Eliminate an empty write transaction when opening a synced Realm. -* Support encrypting synchronized Realms by respecting the `encryptionKey` value - of the Realm's configuration. -* Fix crash when setting an `{NS}Data` property close to 16MB. -* Fix for reading `{NS}Data` properties incorrectly returning `nil`. -* Reduce file size growth in cases where Realm versions were pinned while - starting write transactions. -* Fix an assertion failure when writing to large `RLMArray`/`List` properties. -* Fix uncaught `BadTransactLog` exceptions when pulling invalid changesets from - synchronized Realms. -* Fix an assertion failure when an observed `RLMArray`/`List` is deleted after - being modified. - -2.4.4 Release notes (2017-03-13) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Add `(RLM)SyncPermission` class to allow reviewing access permissions for - Realms. Requires any edition of the Realm Object Server 1.1.0 or later. -* Further reduce the number of files opened per thread-specific Realm on macOS, - iOS and watchOS. - -### Bugfixes - -* Fix a crash that could occur if new Realm instances were created while the - application was exiting. -* Fix a bug that could lead to bad version number errors when delivering - change notifications. -* Fix a potential use-after-free bug when checking validity of results. -* Fix an issue where a sync session might not close properly if it receives - an error while being torn down. -* Fix some issues where a sync session might not reconnect to the server properly - or get into an inconsistent state if revived after invalidation. -* Fix an issue where notifications might not fire when the children of an - observed object are changed. -* Fix an issue where progress notifications on sync sessions might incorrectly - report out-of-date values. -* Fix an issue where multiple threads accessing encrypted data could result in - corrupted data or crashes. -* Fix an issue where certain `LIKE` queries could hang. -* Fix an issue where `-[RLMRealm writeCopyToURL:encryptionKey:error]` could create - a corrupt Realm file. -* Fix an issue where incrementing a synced Realm's schema version without actually - changing the schema could cause a crash. - -2.4.3 Release notes (2017-02-20) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Avoid copying copy-on-write data structures, which can grow the file, when the - write does not actually change existing values. -* Improve performance of deleting all objects in an RLMResults. -* Reduce the number of files opened per thread-specific Realm on macOS. -* Improve startup performance with large numbers of `RLMObject`/`Object` - subclasses. - -### Bugfixes - -* Fix synchronized Realms not downloading remote changes when an access token - expires and there are no local changes to upload. -* Fix an issue where values set on a Realm object using `setValue(value:, forKey:)` - that were not themselves Realm objects were not properly converted into Realm - objects or checked for validity. -* Fix an issue where `-[RLMSyncUser sessionForURL:]` could erroneously return a - non-nil value when passed in an invalid URL. -* `SyncSession.Progress.fractionTransferred` now returns 1 if there are no - transferrable bytes. -* Fix sync progress notifications registered on background threads by always - dispatching on a dedicated background queue. -* Fix compilation issues with Xcode 8.3 beta 2. -* Fix incorrect sync progress notification values for Realms originally created - using a version of Realm prior to 2.3.0. -* Fix LLDB integration to be able to display summaries of `RLMResults` once more. -* Reject Swift properties with names which cause them to fall in to ARC method - families rather than crashing when they are accessed. -* Fix sorting by key path when the declared property order doesn't match the order - of properties in the Realm file, which can happen when properties are added in - different schema versions. - -2.4.2 Release notes (2017-01-30) -============================================================= - -### Bugfixes - -* Fix an issue where RLMRealm instances could end up in the autorelease pool - for other threads. - -2.4.1 Release notes (2017-01-27) -============================================================= - -### Bugfixes - -* Fix an issue where authentication tokens were not properly refreshed - automatically before expiring. - -2.4.0 Release notes (2017-01-26) -============================================================= - -This release drops support for compiling with Swift 2.x. -Swift 3.0.0 is now the minimum Swift version supported. - -### API Breaking Changes - -* None. - -### Enhancements - -* Add change notifications for individual objects with an API similar to that - of collection notifications. - -### Bugfixes - -* Fix Realm Objective-C compilation errors with Xcode 8.3 beta 1. -* Fix several error handling issues when renewing expired authentication - tokens for synchronized Realms. -* Fix a race condition leading to bad_version exceptions being thrown in - Realm's background worker thread. - -2.3.0 Release notes (2017-01-19) -============================================================= - -### Sync Breaking Changes - -* Make `PermissionChange`'s `id` property a primary key. - -### API Breaking Changes - -* None. - -### Enhancements - -* Add `SyncPermissionOffer` and `SyncPermissionOfferResponse` classes to allow - creating and accepting permission change events to synchronized Realms between - different users. -* Support monitoring sync transfer progress by registering notification blocks - on `SyncSession`. Specify the transfer direction (`.upload`/`.download`) and - mode (`.reportIndefinitely`/`.forCurrentlyOutstandingWork`) to monitor. - -### Bugfixes - -* Fix a call to `commitWrite(withoutNotifying:)` committing a transaction that - would not have triggered a notification incorrectly skipping the next - notification. -* Fix incorrect results and crashes when conflicting object insertions are - merged by the synchronization mechanism when there is a collection - notification registered for that object type. - -2.2.0 Release notes (2017-01-12) -============================================================= - -### Sync Breaking Changes (In Beta) - -* Sync-related error reporting behavior has been changed. Errors not related - to a particular user or session are only reported if they are classed as - 'fatal' by the underlying sync engine. -* Added `RLMSyncErrorClientResetError` to `RLMSyncError` enum. - -### API Breaking Changes - -* The following Objective-C APIs have been deprecated in favor of newer or preferred versions: - -| Deprecated API | New API | -|:------------------------------------------------------------|:------------------------------------------------------------| -| `-[RLMArray sortedResultsUsingProperty:]` | `-[RLMArray sortedResultsUsingKeyPath:]` | -| `-[RLMCollection sortedResultsUsingProperty:]` | `-[RLMCollection sortedResultsUsingKeyPath:]` | -| `-[RLMResults sortedResultsUsingProperty:]` | `-[RLMResults sortedResultsUsingKeyPath:]` | -| `+[RLMSortDescriptor sortDescriptorWithProperty:ascending]` | `+[RLMSortDescriptor sortDescriptorWithKeyPath:ascending:]` | -| `RLMSortDescriptor.property` | `RLMSortDescriptor.keyPath` | - -* The following Swift APIs have been deprecated in favor of newer or preferred versions: - -| Deprecated API | New API | -|:------------------------------------------------------|:-------------------------------------------------| -| `LinkingObjects.sorted(byProperty:ascending:)` | `LinkingObjects.sorted(byKeyPath:ascending:)` | -| `List.sorted(byProperty:ascending:)` | `List.sorted(byKeyPath:ascending:)` | -| `RealmCollection.sorted(byProperty:ascending:)` | `RealmCollection.sorted(byKeyPath:ascending:)` | -| `Results.sorted(byProperty:ascending:)` | `Results.sorted(byKeyPath:ascending:)` | -| `SortDescriptor(property:ascending:)` | `SortDescriptor(keyPath:ascending:)` | -| `SortDescriptor.property` | `SortDescriptor.keyPath` | - -### Enhancements - -* Introduce APIs for safely passing objects between threads. Create a - thread-safe reference to a thread-confined object by passing it to the - `+[RLMThreadSafeReference referenceWithThreadConfined:]`/`ThreadSafeReference(to:)` - constructor, which you can then safely pass to another thread to resolve in - the new Realm with `-[RLMRealm resolveThreadSafeReference:]`/`Realm.resolve(_:)`. -* Realm collections can now be sorted by properties over to-one relationships. -* Optimized `CONTAINS` queries to use Boyer-Moore algorithm - (around 10x speedup on large datasets). - -### Bugfixes - -* Setting `deleteRealmIfMigrationNeeded` now also deletes the Realm if a file - format migration is required, such as when moving from a file last accessed - with Realm 0.x to 1.x, or 1.x to 2.x. -* Fix queries containing nested `SUBQUERY` expressions. -* Fix spurious incorrect thread exceptions when a thread id happens to be - reused while an RLMRealm instance from the old thread still exists. -* Fixed various bugs in aggregate methods (max, min, avg, sum). - -2.1.2 Release notes (2016--12-19) -============================================================= - -This release adds binary versions of Swift 3.0.2 frameworks built with Xcode 8.2. - -### Sync Breaking Changes (In Beta) - -* Rename occurences of "iCloud" with "CloudKit" in APIs and comments to match - naming in the Realm Object Server. - -### API Breaking Changes - -* None. - -### Enhancements - -* Add support for 'LIKE' queries (wildcard matching). - -### Bugfixes - -* Fix authenticating with CloudKit. -* Fix linker warning about "Direct access to global weak symbol". - -2.1.1 Release notes (2016-12-02) -============================================================= - -### Enhancements - -* Add `RealmSwift.ObjectiveCSupport.convert(object:)` methods to help write - code that interoperates between Realm Objective-C and Realm Swift APIs. -* Throw exceptions when opening a Realm with an incorrect configuration, like: - * `readOnly` set with a sync configuration. - * `readOnly` set with a migration block. - * migration block set with a sync configuration. -* Greatly improve performance of write transactions which make a large number of - changes to indexed properties, including the automatic migration when opening - files written by Realm 1.x. - -### Bugfixes - -* Reset sync metadata Realm in case of decryption error. -* Fix issue preventing using synchronized Realms in Xcode Playgrounds. -* Fix assertion failure when migrating a model property from object type to - `RLMLinkingObjects` type. -* Fix a `LogicError: Bad version number` exception when using `RLMResults` with - no notification blocks and explicitly called `-[RLMRealm refresh]` from that - thread. -* Logged-out users are no longer returned from `+[RLMSyncUser currentUser]` or - `+[RLMSyncUser allUsers]`. -* Fix several issues which could occur when the 1001st object of a given type - was created or added to an RLMArray/List, including crashes when rerunning - existing queries and possibly data corruption. -* Fix a potential crash when the application exits due to a race condition in - the destruction of global static variables. -* Fix race conditions when waiting for sync uploads or downloads to complete - which could result in crashes or the callback being called too early. - -2.1.0 Release notes (2016-11-18) -============================================================= - -### Sync Breaking Changes (In Beta) - -* None. - -### API breaking changes - -* None. - -### Enhancements - -* Add the ability to skip calling specific notification blocks when committing - a write transaction. - -### Bugfixes - -* Deliver collection notifications when beginning a write transaction which - advances the read version of a Realm (previously only Realm-level - notifications were sent). -* Fix some scenarios which would lead to inconsistent states when using - collection notifications. -* Fix several race conditions in the notification functionality. -* Don't send Realm change notifications when canceling a write transaction. - -2.0.4 Release notes (2016-11-14) -============================================================= - -### Sync Breaking Changes (In Beta) - -* Remove `RLMAuthenticationActions` and replace - `+[RLMSyncCredential credentialWithUsername:password:actions:]` with - `+[RLMSyncCredential credentialsWithUsername:password:register:]`. -* Rename `+[RLMSyncUser authenticateWithCredential:]` to - `+[RLMSyncUser logInWithCredentials:]`. -* Rename "credential"-related types and methods to - `RLMSyncCredentials`/`SyncCredentials` and consistently refer to credentials - in the plural form. -* Change `+[RLMSyncUser all]` to return a dictionary of identifiers to users and - rename to: - * `+[RLMSyncUser allUsers]` in Objective-C. - * `SyncUser.allUsers()` in Swift 2. - * `SyncUser.all` in Swift 3. -* Rename `SyncManager.sharedManager()` to `SyncManager.shared` in Swift 3. -* Change `Realm.Configuration.syncConfiguration` to take a `SyncConfiguration` - struct rather than a named tuple. -* `+[RLMSyncUser logInWithCredentials:]` now invokes its callback block on a - background queue. - -### API breaking changes - -* None. - -### Enhancements - -* Add `+[RLMSyncUser currentUser]`. -* Add the ability to change read, write and management permissions for - synchronized Realms using the management Realm obtained via the - `-[RLMSyncUser managementRealmWithError:]` API and the - `RLMSyncPermissionChange` class. - -### Bugfixes - -* None. - -2.0.3 Release notes (2016-10-27) -============================================================= - -This release adds binary versions of Swift 3.0.1 frameworks built with Xcode 8.1 -GM seed. - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix a `BadVersion` exception caused by a race condition when delivering - collection change notifications. -* Fix an assertion failure when additional model classes are added and - `deleteRealmIfMigrationNeeded` is enabled. -* Fix a `BadTransactLog` exception when deleting an `RLMResults` in a synced - Realm. -* Fix an assertion failure when a write transaction is in progress at the point - of process termination. -* Fix a crash that could occur when working with a `RLMLinkingObject` property - of an unmanaged object. - -2.0.2 Release notes (2016-10-05) -============================================================= - -This release is not protocol-compatible with previous version of the Realm -Mobile Platform. - -### API breaking changes - -* Rename Realm Swift's `User` to `SyncUser` to make clear that it relates to the - Realm Mobile Platform, and to avoid potential conflicts with other `User` types. - -### Bugfixes - -* Fix Realm headers to be compatible with pre-C++11 dialects of Objective-C++. -* Fix incorrect merging of RLMArray/List changes when objects with the same - primary key are created on multiple devices. -* Fix bad transaction log errors after deleting objects on a different device. -* Fix a BadVersion error when a background worker finishes running while older - results from that worker are being delivered to a different thread. - -2.0.1 Release notes (2016-09-29) -============================================================= - -### Bugfixes - -* Fix an assertion failure when opening a Realm file written by a 1.x version - of Realm which has an indexed nullable int or bool property. - -2.0.0 Release notes (2016-09-27) -============================================================= - -This release introduces support for the Realm Mobile Platform! -See for an overview -of these great new features. - -### API breaking changes - -* By popular demand, `RealmSwift.Error` has been moved from the top-level - namespace into a `Realm` extension and is now `Realm.Error`, so that it no - longer conflicts with `Swift.Error`. -* Files written by Realm 2.0 cannot be read by 1.x or earlier versions. Old - files can still be opened. - -### Enhancements - -* The .log, .log_a and .log_b files no longer exist and the state tracked in - them has been moved to the main Realm file. This reduces the number of open - files needed by Realm, improves performance of both opening and writing to - Realms, and eliminates a small window where committing write transactions - would prevent other processes from opening the file. - -### Bugfixes - -* Fix an assertion failure when sorting by zero properties. -* Fix a mid-commit crash in one process also crashing all other processes with - the same Realm open. -* Properly initialize new nullable float and double properties added to - existing objects to null rather than 0. -* Fix a stack overflow when objects with indexed string properties had very - long common prefixes. -* Fix a race condition which could lead to crashes when using async queries or - collection notifications. -* Fix a bug which could lead to incorrect state when an object which links to - itself is deleted from the Realm. - -1.1.0 Release notes (2016-09-16) -============================================================= - -This release brings official support for Xcode 8, Swift 2.3 and Swift 3.0. -Prebuilt frameworks are now built with Xcode 7.3.1 and Xcode 8.0. - -### API breaking changes - -* Deprecate `migrateRealm:` in favor of new `performMigrationForConfiguration:error:` method - that follows Cocoa's NSError conventions. -* Fix issue where `RLMResults` used `id `instead of its generic type as the return - type of subscript. - -### Enhancements - -* Improve error message when using NSNumber incorrectly in Swift models. -* Further reduce the download size of the prebuilt static libraries. -* Improve sort performance, especially on non-nullable columns. -* Allow partial initialization of object by `initWithValue:`, deferring - required property checks until object is added to Realm. - -### Bugfixes - -* Fix incorrect truncation of the constant value for queries of the form - `column < value` for `float` and `double` columns. -* Fix crash when an aggregate is accessed as an `Int8`, `Int16`, `Int32`, or `Int64`. -* Fix a race condition that could lead to a crash if an RLMArray or List was - deallocated on a different thread than it was created on. -* Fix a crash when the last reference to an observed object is released from - within the observation. -* Fix a crash when `initWithValue:` is used to create a nested object for a class - with an uninitialized schema. -* Enforce uniqueness for `RealmOptional` primary keys when using the `value` setter. - -1.0.2 Release notes (2016-07-13) -============================================================= - -### API breaking changes - -* Attempting to add an object with no properties to a Realm now throws rather than silently - doing nothing. - -### Enhancements - -* Swift: A `write` block may now `throw`, reverting any changes already made in - the transaction. -* Reduce address space used when committing write transactions. -* Significantly reduce the download size of prebuilt binaries and slightly - reduce the final size contribution of Realm to applications. -* Improve performance of accessing RLMArray properties and creating objects - with List properties. - -### Bugfixes - -* Fix a crash when reading the shared schema from an observed Swift object. -* Fix crashes or incorrect results when passing an array of values to - `createOrUpdate` after reordering the class's properties. -* Ensure that the initial call of a Results notification block is always passed - .Initial even if there is a write transaction between when the notification - is added and when the first notification is delivered. -* Fix a crash when deleting all objects in a Realm while fast-enumerating query - results from that Realm. -* Handle EINTR from flock() rather than crashing. -* Fix incorrect behavior following a call to `[RLMRealm compact]`. -* Fix live updating and notifications for Results created from a predicate involving - an inverse relationship to be triggered when an object at the other end of the relationship - is modified. - -1.0.1 Release notes (2016-06-12) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Significantly improve performance of opening Realm files, and slightly - improve performance of committing write transactions. - -### Bugfixes - -* Swift: Fix an error thrown when trying to create or update `Object` instances via - `add(:_update:)` with a primary key property of type `RealmOptional`. -* Xcode playground in Swift release zip now runs successfully. -* The `key` parameter of `Realm.objectForPrimaryKey(_:key:)`/ `Realm.dynamicObjectForPrimaryKey(_:key:)` - is now marked as optional. -* Fix a potential memory leak when closing Realms after a Realm file has been - opened on multiple threads which are running in active run loops. -* Fix notifications breaking on tvOS after a very large number of write - transactions have been committed. -* Fix a "Destruction of mutex in use" assertion failure after an error while - opening a file. -* Realm now throws an exception if an `Object` subclass is defined with a managed Swift `lazy` property. - Objects with ignored `lazy` properties should now work correctly. -* Update the LLDB script to work with recent changes to the implementation of `RLMResults`. -* Fix an assertion failure when a Realm file is deleted while it is still open, - and then a new Realm is opened at the same path. Note that this is still not - a supported scenario, and may break in other ways. - -1.0.0 Release notes (2016-05-25) -============================================================= - -No changes since 0.103.2. - -0.103.2 Release notes (2016-05-24) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Improve the error messages when an I/O error occurs in `writeCopyToURL`. - -### Bugfixes - -* Fix an assertion failure which could occur when opening a Realm after opening - that Realm failed previously in some specific ways in the same run of the - application. -* Reading optional integers, floats, and doubles from within a migration block - now correctly returns `nil` rather than 0 when the stored value is `nil`. - -0.103.1 Release notes (2016-05-19) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix a bug that sometimes resulted in a single object's NSData properties - changing from `nil` to a zero-length non-`nil` NSData when a different object - of the same type was deleted. - -0.103.0 Release notes (2016-05-18) -============================================================= - -### API breaking changes - -* All functionality deprecated in previous releases has been removed entirely. -* Support for Xcode 6.x & Swift prior to 2.2 has been completely removed. -* `RLMResults`/`Results` now become empty when a `RLMArray`/`List` or object - they depend on is deleted, rather than throwing an exception when accessed. -* Migrations are no longer run when `deleteRealmIfMigrationNeeded` is set, - recreating the file instead. - -### Enhancements - -* Added `invalidated` properties to `RLMResults`/`Results`, `RLMLinkingObjects`/`LinkingObjects`, - `RealmCollectionType` and `AnyRealmCollection`. These properties report whether the Realm - the object is associated with has been invalidated. -* Some `NSError`s created by Realm now have more descriptive user info payloads. - -### Bugfixes - -* None. - -0.102.1 Release notes (2016-05-13) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Return `RLMErrorSchemaMismatch` error rather than the more generic `RLMErrorFail` - when a migration is required. -* Improve the performance of allocating instances of `Object` subclasses - that have `LinkingObjects` properties. - -### Bugfixes - -* `RLMLinkingObjects` properties declared in Swift subclasses of `RLMObject` - now work correctly. -* Fix an assertion failure when deleting all objects of a type, inserting more - objects, and then deleting some of the newly inserted objects within a single - write transaction when there is an active notification block for a different - object type which links to the objects being deleted. -* Fix crashes and/or incorrect results when querying over multiple levels of - `LinkingObjects` properties. -* Fix opening read-only Realms on multiple threads at once. -* Fix a `BadTransactLog` exception when storing dates before the unix epoch (1970-01-01). - -0.102.0 Release notes (2016-05-09) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Add a method to rename properties during migrations: - * Swift: `Migration.renamePropertyForClass(_:oldName:newName:)` - * Objective-C: `-[RLMMigration renamePropertyForClass:oldName:newName:]` -* Add `deleteRealmIfMigrationNeeded` to - `RLMRealmConfiguration`/`Realm.Configuration`. When this is set to `true`, - the Realm file will be automatically deleted and recreated when there is a - schema mismatch rather than migrated to the new schema. - -### Bugfixes - -* Fix `BETWEEN` queries that traverse `RLMArray`/`List` properties to ensure that - a single related object satisfies the `BETWEEN` criteria, rather than allowing - different objects in the array to satisfy the lower and upper bounds. -* Fix a race condition when a Realm is opened on one thread while it is in the - middle of being closed on another thread which could result in crashes. -* Fix a bug which could result in changes made on one thread being applied - incorrectly on other threads when those threads are refreshed. -* Fix crash when migrating to the new date format introduced in 0.101.0. -* Fix crash when querying inverse relationships when objects are deleted. - -0.101.0 Release notes (2016-05-04) -============================================================= - -### API breaking changes - -* Files written by this version of Realm cannot be read by older versions of - Realm. Existing files will automatically be upgraded when they are opened. - -### Enhancements - -* Greatly improve performance of collection change calculation for complex - object graphs, especially for ones with cycles. -* NSDate properties now support nanoseconds precision. -* Opening a single Realm file on multiple threads now shares a single memory - mapping of the file for all threads, significantly reducing the memory - required to work with large files. -* Crashing while in the middle of a write transaction no longer blocks other - processes from performing write transactions on the same file. -* Improve the performance of refreshing a Realm (including via autorefresh) - when there are live Results/RLMResults objects for that Realm. - -### Bugfixes - -* Fix an assertion failure of "!more_before || index >= std::prev(it)->second)" - in `IndexSet::do_add()`. -* Fix a crash when an `RLMArray` or `List` object is destroyed from the wrong - thread. - -0.100.0 Release notes (2016-04-29) -============================================================= - -### API breaking changes - -* `-[RLMObject linkingObjectsOfClass:forProperty]` and `Object.linkingObjects(_:forProperty:)` - are deprecated in favor of properties of type `RLMLinkingObjects` / `LinkingObjects`. - -### Enhancements - -* The automatically-maintained inverse direction of relationships can now be exposed as - properties of type `RLMLinkingObjects` / `LinkingObjects`. These properties automatically - update to reflect the objects that link to the target object, can be used in queries, and - can be filtered like other Realm collection types. -* Queries that compare objects for equality now support multi-level key paths. - -### Bugfixes - -* Fix an assertion failure when a second write transaction is committed after a - write transaction deleted the object containing an RLMArray/List which had an - active notification block. -* Queries that compare `RLMArray` / `List` properties using != now give the correct results. - -0.99.1 Release notes (2016-04-26) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix a scenario that could lead to the assertion failure - "m_advancer_sg->get_version_of_current_transaction() == - new_notifiers.front()->version()". - -0.99.0 Release notes (2016-04-22) -============================================================= - -### API breaking changes - -* Deprecate properties of type `id`/`AnyObject`. This type was rarely used, - rarely useful and unsupported in every other Realm binding. -* The block for `-[RLMArray addNotificationBlock:]` and - `-[RLMResults addNotificationBlock:]` now takes another parameter. -* The following Objective-C APIs have been deprecated in favor of newer or preferred versions: - -| Deprecated API | New API | -|:-------------------------------------------------------|:------------------------------------------------------| -| `-[RLMRealm removeNotification:]` | `-[RLMNotificationToken stop]` | -| `RLMRealmConfiguration.path` | `RLMRealmConfiguration.fileURL` | -| `RLMRealm.path` | `RLMRealmConfiguration.fileURL` | -| `RLMRealm.readOnly` | `RLMRealmConfiguration.readOnly` | -| `+[RLMRealm realmWithPath:]` | `+[RLMRealm realmWithURL:]` | -| `+[RLMRealm writeCopyToPath:error:]` | `+[RLMRealm writeCopyToURL:encryptionKey:error:]` | -| `+[RLMRealm writeCopyToPath:encryptionKey:error:]` | `+[RLMRealm writeCopyToURL:encryptionKey:error:]` | -| `+[RLMRealm schemaVersionAtPath:error:]` | `+[RLMRealm schemaVersionAtURL:encryptionKey:error:]` | -| `+[RLMRealm schemaVersionAtPath:encryptionKey:error:]` | `+[RLMRealm schemaVersionAtURL:encryptionKey:error:]` | - -* The following Swift APIs have been deprecated in favor of newer or preferred versions: - -| Deprecated API | New API | -|:----------------------------------------------|:-----------------------------------------| -| `Realm.removeNotification(_:)` | `NotificationToken.stop()` | -| `Realm.Configuration.path` | `Realm.Configuration.fileURL` | -| `Realm.path` | `Realm.Configuration.fileURL` | -| `Realm.readOnly` | `Realm.Configuration.readOnly` | -| `Realm.writeCopyToPath(_:encryptionKey:)` | `Realm.writeCopyToURL(_:encryptionKey:)` | -| `schemaVersionAtPath(_:encryptionKey:error:)` | `schemaVersionAtURL(_:encryptionKey:)` | - -### Enhancements - -* Add information about what rows were added, removed, or modified to the - notifications sent to the Realm collections. -* Improve error when illegally appending to an `RLMArray` / `List` property from a default value - or the standalone initializer (`init()`) before the schema is ready. - -### Bugfixes - -* Fix a use-after-free when an associated object's dealloc method is used to - remove observers from an RLMObject. -* Fix a small memory leak each time a Realm file is opened. -* Return a recoverable `RLMErrorAddressSpaceExhausted` error rather than - crash when there is insufficient available address space on Realm - initialization or write commit. - -0.98.8 Release notes (2016-04-15) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fixed a bug that caused some encrypted files created using - `-[RLMRealm writeCopyToPath:encryptionKey:error:]` to fail to open. - -0.98.7 Release notes (2016-04-13) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Mark further initializers in Objective-C as NS_DESIGNATED_INITIALIZER to prevent that these aren't - correctly defined in Swift Object subclasses, which don't qualify for auto-inheriting the required initializers. -* `-[RLMResults indexOfObjectWithPredicate:]` now returns correct results - for `RLMResults` instances that were created by filtering an `RLMArray`. -* Adjust how RLMObjects are destroyed in order to support using an associated - object on an RLMObject to remove KVO observers from that RLMObject. -* `-[RLMResults indexOfObjectWithPredicate:]` now returns the index of the first matching object for a - sorted `RLMResults`, matching its documented behavior. -* Fix a crash when canceling a transaction that set a relationship. -* Fix a crash when a query referenced a deleted object. - -0.98.6 Release notes (2016-03-25) -============================================================= - -Prebuilt frameworks are now built with Xcode 7.3. - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix running unit tests on iOS simulators and devices with Xcode 7.3. - -0.98.5 Release notes (2016-03-14) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix a crash when opening a Realm on 32-bit iOS devices. - -0.98.4 Release notes (2016-03-10) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Properly report changes made by adding an object to a Realm with - addOrUpdate:/createOrUpdate: to KVO observers for existing objects with that - primary key. -* Fix crashes and assorted issues when a migration which added object link - properties is rolled back due to an error in the migration block. -* Fix assertion failures when deleting objects within a migration block of a - type which had an object link property added in that migration. -* Fix an assertion failure in `Query::apply_patch` when updating certain kinds - of queries after a write transaction is committed. - -0.98.3 Release notes (2016-02-26) -============================================================= - -### Enhancements - -* Initializing the shared schema is 3x faster. - -### Bugfixes - -* Using Realm Objective-C from Swift while having Realm Swift linked no longer causes that the - declared `ignoredProperties` are not taken into account. -* Fix assertion failures when rolling back a migration which added Object link - properties to a class. -* Fix potential errors when cancelling a write transaction which modified - multiple `RLMArray`/`List` properties. -* Report the correct value for inWriteTransaction after attempting to commit a - write transaction fails. -* Support CocoaPods 1.0 beginning from prerelease 1.0.0.beta.4 while retaining - backwards compatibility with 0.39. - -0.98.2 Release notes (2016-02-18) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Aggregate operations (`ANY`, `NONE`, `@count`, `SUBQUERY`, etc.) are now supported for key paths - that begin with an object relationship so long as there is a `RLMArray`/`List` property at some - point in a key path. -* Predicates of the form `%@ IN arrayProperty` are now supported. - -### Bugfixes - -* Use of KVC collection operators on Swift collection types no longer throws an exception. -* Fix reporting of inWriteTransaction in notifications triggered by - `beginWriteTransaction`. -* The contents of `List` and `Optional` properties are now correctly preserved when copying - a Swift object from one Realm to another, and performing other operations that result in a - Swift object graph being recursively traversed from Objective-C. -* Fix a deadlock when queries are performed within a Realm notification block. -* The `ANY` / `SOME` / `NONE` qualifiers are now required in comparisons involving a key path that - traverse a `RLMArray`/`List` property. Previously they were only required if the first key in the - key path was an `RLMArray`/`List` property. -* Fix several scenarios where the default schema would be initialized - incorrectly if the first Realm opened used a restricted class subset (via - `objectClasses`/`objectTypes`). - -0.98.1 Release notes (2016-02-10) -============================================================= - -### Bugfixes - -* Fix crashes when deleting an object containing an `RLMArray`/`List` which had - previously been queried. -* Fix a crash when deleting an object containing an `RLMArray`/`List` with - active notification blocks. -* Fix duplicate file warnings when building via CocoaPods. -* Fix crash or incorrect results when calling `indexOfObject:` on an - `RLMResults` derived from an `RLMArray`. - -0.98.0 Release notes (2016-02-04) -============================================================= - -### API breaking changes - -* `+[RLMRealm realmWithPath:]`/`Realm.init(path:)` now inherits from the default - configuration. -* Swift 1.2 is no longer supported. - -### Enhancements - -* Add `addNotificationBlock` to `RLMResults`, `Results`, `RLMArray`, and - `List`, which calls the given block whenever the collection changes. -* Do a lot of the work for keeping `RLMResults`/`Results` up-to-date after - write transactions on a background thread to help avoid blocking the main - thread. -* `NSPredicate`'s `SUBQUERY` operator is now supported. It has the following limitations: - * `@count` is the only operator that may be applied to the `SUBQUERY` expression. - * The `SUBQUERY(…).@count` expression must be compared with a constant. - * Correlated subqueries are not yet supported. - -### Bugfixes - -* None. - -0.97.1 Release notes (2016-01-29) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Swift: Added `Error` enum allowing to catch errors e.g. thrown on initializing - `RLMRealm`/`Realm` instances. -* Fail with `RLMErrorFileNotFound` instead of the more generic `RLMErrorFileAccess`, - if no file was found when a realm was opened as read-only or if the directory part - of the specified path was not found when a copy should be written. -* Greatly improve performance when deleting objects with one or more indexed - properties. -* Indexing `BOOL`/`Bool` and `NSDate` properties are now supported. -* Swift: Add support for indexing optional properties. - -### Bugfixes - -* Fix incorrect results or crashes when using `-[RLMResults setValue:forKey:]` - on an RLMResults which was filtered on the key being set. -* Fix crashes when an RLMRealm is deallocated from the wrong thread. -* Fix incorrect results from aggregate methods on `Results`/`RLMResults` after - objects which were previously in the results are deleted. -* Fix a crash when adding a new property to an existing class with over a - million objects in the Realm. -* Fix errors when opening encrypted Realm files created with writeCopyToPath. -* Fix crashes or incorrect results for queries that use relationship equality - in cases where the `RLMResults` is kept alive and instances of the target class - of the relationship are deleted. - -0.97.0 Release notes (2015-12-17) -============================================================= - -### API breaking changes - -* All functionality deprecated in previous releases has been removed entirely. -* Add generic type annotations to NSArrays and NSDictionaries in public APIs. -* Adding a Realm notification block on a thread not currently running from - within a run loop throws an exception rather than silently never calling the - notification block. - -### Enhancements - -* Support for tvOS. -* Support for building Realm Swift from source when using Carthage. -* The block parameter of `-[RLMRealm transactionWithBlock:]`/`Realm.write(_:)` is - now marked as `__attribute__((noescape))`/`@noescape`. -* Many forms of queries with key paths on both sides of the comparison operator - are now supported. -* Add support for KVC collection operators in `RLMResults` and `RLMArray`. -* Fail instead of deadlocking in `+[RLMRealm sharedSchema]`, if a Swift property is initialized - to a computed value, which attempts to open a Realm on its own. - -### Bugfixes - -* Fix poor performance when calling `-[RLMRealm deleteObjects:]` on an - `RLMResults` which filtered the objects when there are other classes linking - to the type of the deleted objects. -* An exception is now thrown when defining `Object` properties of an unsupported - type. - -0.96.3 Release notes (2015-12-04) -============================================================= - -### Enhancements - -* Queries are no longer limited to 16 levels of grouping. -* Rework the implementation of encrypted Realms to no longer interfere with - debuggers. - -### Bugfixes - -* Fix crash when trying to retrieve object instances via `dynamicObjects`. -* Throw an exception when querying on a link providing objects, which are from a different Realm. -* Return empty results when querying on a link providing an unattached object. -* Fix crashes or incorrect results when calling `-[RLMRealm refresh]` during - fast enumeration. -* Add `Int8` support for `RealmOptional`, `MinMaxType` and `AddableType`. -* Set the default value for newly added non-optional NSData properties to a - zero-byte NSData rather than nil. -* Fix a potential crash when deleting all objects of a class. -* Fix performance problems when creating large numbers of objects with - `RLMArray`/`List` properties. -* Fix memory leak when using Object(value:) for subclasses with - `List` or `RealmOptional` properties. -* Fix a crash when computing the average of an optional integer property. -* Fix incorrect search results for some queries on integer properties. -* Add error-checking for nil realm parameters in many methods such as - `+[RLMObject allObjectsInRealm:]`. -* Fix a race condition between commits and opening Realm files on new threads - that could lead to a crash. -* Fix several crashes when opening Realm files. -* `-[RLMObject createInRealm:withValue:]`, `-[RLMObject createOrUpdateInRealm:withValue:]`, and - their variants for the default Realm now always match the contents of an `NSArray` against properties - in the same order as they are defined in the model. - -0.96.2 Release notes (2015-10-26) -============================================================= - -Prebuilt frameworks are now built with Xcode 7.1. - -### Bugfixes - -* Fix ignoring optional properties in Swift. -* Fix CocoaPods installation on case-sensitive file systems. - -0.96.1 Release notes (2015-10-20) -============================================================= - -### Bugfixes - -* Support assigning `Results` to `List` properties via KVC. -* Honor the schema version set in the configuration in `+[RLMRealm migrateRealm:]`. -* Fix crash when using optional Int16/Int32/Int64 properties in Swift. - -0.96.0 Release notes (2015-10-14) -============================================================= - -* No functional changes since beta2. - -0.96.0-beta2 Release notes (2015-10-08) -============================================================= - -### Bugfixes - -* Add RLMOptionalBase.h to the podspec. - -0.96.0-beta Release notes (2015-10-07) -============================================================= - -### API breaking changes - -* CocoaPods v0.38 or greater is now required to install Realm and RealmSwift - as pods. - -### Enhancements - -* Functionality common to both `List` and `Results` is now declared in a - `RealmCollectionType` protocol that both types conform to. -* `Results.realm` now returns an `Optional` in order to conform to - `RealmCollectionType`, but will always return `.Some()` since a `Results` - cannot exist independently from a `Realm`. -* Aggregate operations are now available on `List`: `min`, `max`, `sum`, - `average`. -* Committing write transactions (via `commitWrite` / `commitWriteTransaction` and - `write` / `transactionWithBlock`) now optionally allow for handling errors when - the disk is out of space. -* Added `isEmpty` property on `RLMRealm`/`Realm` to indicate if it contains any - objects. -* The `@count`, `@min`, `@max`, `@sum` and `@avg` collection operators are now - supported in queries. - -### Bugfixes - -* Fix assertion failure when inserting NSData between 8MB and 16MB in size. -* Fix assertion failure when rolling back a migration which removed an object - link or `RLMArray`/`List` property. -* Add the path of the file being opened to file open errors. -* Fix a crash that could be triggered by rapidly opening and closing a Realm - many times on multiple threads at once. -* Fix several places where exception messages included the name of the wrong - function which failed. - -0.95.3 Release notes (2015-10-05) -============================================================= - -### Bugfixes - -* Compile iOS Simulator framework architectures with `-fembed-bitcode-marker`. -* Fix crashes when the first Realm opened uses a class subset and later Realms - opened do not. -* Fix inconsistent errors when `Object(value: ...)` is used to initialize the - default value of a property of an `Object` subclass. -* Throw an exception when a class subset has objects with array or object - properties of a type that are not part of the class subset. - -0.95.2 Release notes (2015-09-24) -============================================================= - -* Enable bitcode for iOS and watchOS frameworks. -* Build libraries with Xcode 7 final rather than the GM. - -0.95.1 Release notes (2015-09-23) -============================================================= - -### Enhancements - -* Add missing KVO handling for moving and exchanging objects in `RLMArray` and - `List`. - -### Bugfixes - -* Setting the primary key property on persisted `RLMObject`s / `Object`s - via subscripting or key-value coding will cause an exception to be thrown. -* Fix crash due to race condition in `RLMRealmConfiguration` where the default - configuration was in the process of being copied in one thread, while - released in another. -* Fix crash when a migration which removed an object or array property is - rolled back due to an error. - -0.95.0 Release notes (2015-08-25) -============================================================= - -### API breaking changes - -* The following APIs have been deprecated in favor of the new `RLMRealmConfiguration` class in Realm Objective-C: - -| Deprecated API | New API | -|:------------------------------------------------------------------|:---------------------------------------------------------------------------------| -| `+[RLMRealm realmWithPath:readOnly:error:]` | `+[RLMRealm realmWithConfiguration:error:]` | -| `+[RLMRealm realmWithPath:encryptionKey:readOnly:error:]` | `+[RLMRealm realmWithConfiguration:error:]` | -| `+[RLMRealm setEncryptionKey:forRealmsAtPath:]` | `-[RLMRealmConfiguration setEncryptionKey:]` | -| `+[RLMRealm inMemoryRealmWithIdentifier:]` | `+[RLMRealm realmWithConfiguration:error:]` | -| `+[RLMRealm defaultRealmPath]` | `+[RLMRealmConfiguration defaultConfiguration]` | -| `+[RLMRealm setDefaultRealmPath:]` | `+[RLMRealmConfiguration setDefaultConfiguration:]` | -| `+[RLMRealm setDefaultRealmSchemaVersion:withMigrationBlock]` | `RLMRealmConfiguration.schemaVersion` and `RLMRealmConfiguration.migrationBlock` | -| `+[RLMRealm setSchemaVersion:forRealmAtPath:withMigrationBlock:]` | `RLMRealmConfiguration.schemaVersion` and `RLMRealmConfiguration.migrationBlock` | -| `+[RLMRealm migrateRealmAtPath:]` | `+[RLMRealm migrateRealm:]` | -| `+[RLMRealm migrateRealmAtPath:encryptionKey:]` | `+[RLMRealm migrateRealm:]` | - -* The following APIs have been deprecated in favor of the new `Realm.Configuration` struct in Realm Swift for Swift 1.2: - -| Deprecated API | New API | -|:--------------------------------------------------------------|:-----------------------------------------------------------------------------| -| `Realm.defaultPath` | `Realm.Configuration.defaultConfiguration` | -| `Realm(path:readOnly:encryptionKey:error:)` | `Realm(configuration:error:)` | -| `Realm(inMemoryIdentifier:)` | `Realm(configuration:error:)` | -| `Realm.setEncryptionKey(:forPath:)` | `Realm(configuration:error:)` | -| `setDefaultRealmSchemaVersion(schemaVersion:migrationBlock:)` | `Realm.Configuration.schemaVersion` and `Realm.Configuration.migrationBlock` | -| `setSchemaVersion(schemaVersion:realmPath:migrationBlock:)` | `Realm.Configuration.schemaVersion` and `Realm.Configuration.migrationBlock` | -| `migrateRealm(path:encryptionKey:)` | `migrateRealm(configuration:)` | - -* The following APIs have been deprecated in favor of the new `Realm.Configuration` struct in Realm Swift for Swift 2.0: - -| Deprecated API | New API | -|:--------------------------------------------------------------|:-----------------------------------------------------------------------------| -| `Realm.defaultPath` | `Realm.Configuration.defaultConfiguration` | -| `Realm(path:readOnly:encryptionKey:) throws` | `Realm(configuration:) throws` | -| `Realm(inMemoryIdentifier:)` | `Realm(configuration:) throws` | -| `Realm.setEncryptionKey(:forPath:)` | `Realm(configuration:) throws` | -| `setDefaultRealmSchemaVersion(schemaVersion:migrationBlock:)` | `Realm.Configuration.schemaVersion` and `Realm.Configuration.migrationBlock` | -| `setSchemaVersion(schemaVersion:realmPath:migrationBlock:)` | `Realm.Configuration.schemaVersion` and `Realm.Configuration.migrationBlock` | -| `migrateRealm(path:encryptionKey:)` | `migrateRealm(configuration:)` | - -* `List.extend` in Realm Swift for Swift 2.0 has been replaced with `List.appendContentsOf`, - mirroring changes to `RangeReplaceableCollectionType`. - -* Object properties on `Object` subclasses in Realm Swift must be marked as optional, - otherwise a runtime exception will be thrown. - -### Enhancements - -* Persisted properties of `RLMObject`/`Object` subclasses are now Key-Value - Observing compliant. -* The different options used to create Realm instances have been consolidated - into a single `RLMRealmConfiguration`/`Realm.Configuration` object. -* Enumerating Realm collections (`RLMArray`, `RLMResults`, `List<>`, - `Results<>`) now enumerates over a copy of the collection, making it no - longer an error to modify a collection during enumeration (either directly, - or indirectly by modifying objects to make them no longer match a query). -* Improve performance of object insertion in Swift to bring it roughly in line - with Objective-C. -* Allow specifying a specific list of `RLMObject` / `Object` subclasses to include - in a given Realm via `RLMRealmConfiguration.objectClasses` / `Realm.Configuration.objectTypes`. - -### Bugfixes - -* Subscripting on `RLMObject` is now marked as nullable. - -0.94.1 Release notes (2015-08-10) -============================================================= - -### API breaking changes - -* Building for watchOS requires Xcode 7 beta 5. - -### Enhancements - -* `Object.className` is now marked as `final`. - -### Bugfixes - -* Fix crash when adding a property to a model without updating the schema - version. -* Fix unnecessary redownloading of the core library when building from source. -* Fix crash when sorting by an integer or floating-point property on iOS 7. - -0.94.0 Release notes (2015-07-29) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Reduce the amount of memory used by RLMRealm notification listener threads. -* Avoid evaluating results eagerly when filtering and sorting. -* Add nullability annotations to the Objective-C API to provide enhanced compiler - warnings and bridging to Swift. -* Make `RLMResult`s and `RLMArray`s support Objective-C generics. -* Add support for building watchOS and bitcode-compatible apps. -* Make the exceptions thrown in getters and setters more informative. -* Add `-[RLMArray exchangeObjectAtIndex:withObjectAtIndex]` and `List.swap(_:_:)` - to allow exchanging the location of two objects in the given `RLMArray` / `List`. -* Added anonymous analytics on simulator/debugger runs. -* Add `-[RLMArray moveObjectAtIndex:toIndex:]` and `List.move(from:to:)` to - allow moving objects in the given `RLMArray` / `List`. - -### Bugfixes - -* Processes crashing due to an uncaught exception inside a write transaction will - no longer cause other processes using the same Realm to hang indefinitely. -* Fix incorrect results when querying for < or <= on ints that - require 64 bits to represent with a CPU that supports SSE 4.2. -* An exception will no longer be thrown when attempting to reset the schema - version or encryption key on an open Realm to the current value. -* Date properties on 32 bit devices will retain 64 bit second precision. -* Wrap calls to the block passed to `enumerate` in an autoreleasepool to reduce - memory growth when migrating a large amount of objects. -* In-memory realms no longer write to the Documents directory on iOS or - Application Support on OS X. - -0.93.2 Release notes (2015-06-12) -============================================================= - -### Bugfixes - -* Fixed an issue where the packaged OS X Realm.framework was built with - `GCC_GENERATE_TEST_COVERAGE_FILES` and `GCC_INSTRUMENT_PROGRAM_FLOW_ARCS` - enabled. -* Fix a memory leak when constructing standalone Swift objects with NSDate - properties. -* Throw an exception rather than asserting when an invalidated object is added - to an RLMArray. -* Fix a case where data loss would occur if a device was hard-powered-off - shortly after a write transaction was committed which had to expand the Realm - file. - -0.93.1 Release notes (2015-05-29) -============================================================= - -### Bugfixes - -* Objects are no longer copied into standalone objects during object creation. This fixes an issue where - nested objects with a primary key are sometimes duplicated rather than updated. -* Comparison predicates with a constant on the left of the operator and key path on the right now give - correct results. An exception is now thrown for predicates that do not yet support this ordering. -* Fix some crashes in `index_string.cpp` with int primary keys or indexed int properties. - -0.93.0 Release notes (2015-05-27) -============================================================= - -### API breaking changes - -* Schema versions are now represented as `uint64_t` (Objective-C) and `UInt64` (Swift) so that they have - the same representation on all architectures. - -### Enhancements - -* Swift: `Results` now conforms to `CVarArgType` so it can - now be passed as an argument to `Results.filter(_:...)` - and `List.filter(_:...)`. -* Swift: Made `SortDescriptor` conform to the `Equatable` and - `StringLiteralConvertible` protocols. -* Int primary keys are once again automatically indexed. -* Improve error reporting when attempting to mark a property of a type that - cannot be indexed as indexed. - -### Bugfixes - -* Swift: `RealmSwift.framework` no longer embeds `Realm.framework`, - which now allows apps using it to pass iTunes Connect validation. - -0.92.4 Release notes (2015-05-22) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Swift: Made `Object.init()` a required initializer. -* `RLMObject`, `RLMResults`, `Object` and `Results` can now be safely - deallocated (but still not used) from any thread. -* Improve performance of `-[RLMArray indexOfObjectWhere:]` and `-[RLMArray - indexOfObjectWithPredicate:]`, and implement them for standalone RLMArrays. -* Improved performance of most simple queries. - -### Bugfixes - -* The interprocess notification mechanism no longer uses dispatch worker threads, preventing it from - starving other GCD clients of the opportunity to execute blocks when dozens of Realms are open at once. - -0.92.3 Release notes (2015-05-13) -============================================================= - -### API breaking changes - -* Swift: `Results.average(_:)` now returns an optional, which is `nil` if and only if the results - set is empty. - -### Enhancements - -* Swift: Added `List.invalidated`, which returns if the given `List` is no longer - safe to be accessed, and is analogous to `-[RLMArray isInvalidated]`. -* Assertion messages are automatically logged to Crashlytics if it's loaded - into the current process to make it easier to diagnose crashes. - -### Bugfixes - -* Swift: Enumerating through a standalone `List` whose objects themselves - have list properties won't crash. -* Swift: Using a subclass of `RealmSwift.Object` in an aggregate operator of a predicate - no longer throws a spurious type error. -* Fix incorrect results for when using OR in a query on a `RLMArray`/`List<>`. -* Fix incorrect values from `[RLMResults count]`/`Results.count` when using - `!=` on an int property with no other query conditions. -* Lower the maximum doubling threshold for Realm file sizes from 128MB to 16MB - to reduce the amount of wasted space. - -0.92.2 Release notes (2015-05-08) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Exceptions raised when incorrect object types are used with predicates now contain more detailed information. -* Added `-[RLMMigration deleteDataForClassName:]` and `Migration.deleteData(_:)` - to enable cleaning up after removing object subclasses - -### Bugfixes - -* Prevent debugging of an application using an encrypted Realm to work around - frequent LLDB hangs. Until the underlying issue is addressed you may set - REALM_DISABLE_ENCRYPTION=YES in your application's environment variables to - have requests to open an encrypted Realm treated as a request for an - unencrypted Realm. -* Linked objects are properly updated in `createOrUpdateInRealm:withValue:`. -* List properties on Objects are now properly initialized during fast enumeration. - -0.92.1 Release notes (2015-05-06) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* `-[RLMRealm inWriteTransaction]` is now public. -* Realm Swift is now available on CoocaPods. - -### Bugfixes - -* Force code re-signing after stripping architectures in `strip-frameworks.sh`. - -0.92.0 Release notes (2015-05-05) -============================================================= - -### API breaking changes - -* Migration blocks are no longer called when a Realm file is first created. -* The following APIs have been deprecated in favor of newer method names: - -| Deprecated API | New API | -|:-------------------------------------------------------|:------------------------------------------------------| -| `-[RLMMigration createObject:withObject:]` | `-[RLMMigration createObject:withValue:]` | -| `-[RLMObject initWithObject:]` | `-[RLMObject initWithValue:]` | -| `+[RLMObject createInDefaultRealmWithObject:]` | `+[RLMObject createInDefaultRealmWithValue:]` | -| `+[RLMObject createInRealm:withObject:]` | `+[RLMObject createInRealm:withValue:]` | -| `+[RLMObject createOrUpdateInDefaultRealmWithObject:]` | `+[RLMObject createOrUpdateInDefaultRealmWithValue:]` | -| `+[RLMObject createOrUpdateInRealm:withObject:]` | `+[RLMObject createOrUpdateInRealm:withValue:]` | - -### Enhancements - -* `Int8` properties defined in Swift are now treated as integers, rather than - booleans. -* NSPredicates created using `+predicateWithValue:` are now supported. - -### Bugfixes - -* Compound AND predicates with no subpredicates now correctly match all objects. - -0.91.5 Release notes (2015-04-28) -============================================================= - -### Bugfixes - -* Fix issues with removing search indexes and re-enable it. - -0.91.4 Release notes (2015-04-27) -============================================================= - -### Bugfixes - -* Temporarily disable removing indexes from existing columns due to bugs. - -0.91.3 Release notes (2015-04-17) -============================================================= - -### Bugfixes - -* Fix `Extra argument 'objectClassName' in call` errors when building via - CocoaPods. - -0.91.2 Release notes (2015-04-16) -============================================================= - -* Migration blocks are no longer called when a Realm file is first created. - -### Enhancements - -* `RLMCollection` supports collection KVC operations. -* Sorting `RLMResults` is 2-5x faster (typically closer to 2x). -* Refreshing `RLMRealm` after a write transaction which inserts or modifies - strings or `NSData` is committed on another thread is significantly faster. -* Indexes are now added and removed from existing properties when a Realm file - is opened, rather than only when properties are first added. - -### Bugfixes - -* `+[RLMSchema dynamicSchemaForRealm:]` now respects search indexes. -* `+[RLMProperty isEqualToProperty:]` now checks for equal `indexed` properties. - -0.91.1 Release notes (2015-03-12) -============================================================= - -### Enhancements - -* The browser will automatically refresh when the Realm has been modified - from another process. -* Allow using Realm in an embedded framework by setting - `APPLICATION_EXTENSION_API_ONLY` to YES. - -### Bugfixes - -* Fix a crash in CFRunLoopSourceInvalidate. - -0.91.0 Release notes (2015-03-10) -============================================================= - -### API breaking changes - -* `attributesForProperty:` has been removed from `RLMObject`. You now specify indexed - properties by implementing the `indexedProperties` method. -* An exception will be thrown when calling `setEncryptionKey:forRealmsAtPath:`, - `setSchemaVersion:forRealmAtPath:withMigrationBlock:`, and `migrateRealmAtPath:` - when a Realm at the given path is already open. -* Object and array properties of type `RLMObject` will no longer be allowed. - -### Enhancements - -* Add support for sharing Realm files between processes. -* The browser will no longer show objects that have no persisted properties. -* `RLMSchema`, `RLMObjectSchema`, and `RLMProperty` now have more useful descriptions. -* Opening an encrypted Realm while a debugger is attached to the process no - longer throws an exception. -* `RLMArray` now exposes an `isInvalidated` property to indicate if it can no - longer be accessed. - -### Bugfixes - -* An exception will now be thrown when calling `-beginWriteTransaction` from within a notification - triggered by calling `-beginWriteTransaction` elsewhere. -* When calling `delete:` we now verify that the object being deleted is persisted in the target Realm. -* Fix crash when calling `createOrUpdate:inRealm` with nested linked objects. -* Use the key from `+[RLMRealm setEncryptionKey:forRealmsAtPath:]` in - `-writeCopyToPath:error:` and `+migrateRealmAtPath:`. -* Comparing an RLMObject to a non-RLMObject using `-[RLMObject isEqual:]` or - `-isEqualToObject:` now returns NO instead of crashing. -* Improved error message when an `RLMObject` subclass is defined nested within - another Swift declaration. -* Fix crash when the process is terminated by the OS on iOS while encrypted realms are open. -* Fix crash after large commits to encrypted realms. - -0.90.6 Release notes (2015-02-20) -============================================================= - -### Enhancements - -* Improve compatibility of encrypted Realms with third-party crash reporters. - -### Bugfixes - -* Fix incorrect results when using aggregate functions on sorted RLMResults. -* Fix data corruption when using writeCopyToPath:encryptionKey:. -* Maybe fix some assertion failures. - -0.90.5 Release notes (2015-02-04) -============================================================= - -### Bugfixes - -* Fix for crashes when encryption is enabled on 64-bit iOS devices. - -0.90.4 Release notes (2015-01-29) -============================================================= - -### Bugfixes - -* Fix bug that resulted in columns being dropped and recreated during migrations. - -0.90.3 Release notes (2015-01-27) -============================================================= - -### Enhancements - -* Calling `createInDefaultRealmWithObject:`, `createInRealm:withObject:`, - `createOrUpdateInDefaultRealmWithObject:` or `createOrUpdateInRealm:withObject:` - is a no-op if the argument is an RLMObject of the same type as the receiver - and is already backed by the target realm. - -### Bugfixes - -* Fix incorrect column type assertions when the first Realm file opened is a - read-only file that is missing tables. -* Throw an exception when adding an invalidated or deleted object as a link. -* Throw an exception when calling `createOrUpdateInRealm:withObject:` when the - receiver has no primary key defined. - -0.90.1 Release notes (2015-01-22) -============================================================= - -### Bugfixes - -* Fix for RLMObject being treated as a model object class and showing up in the browser. -* Fix compilation from the podspec. -* Fix for crash when calling `objectsWhere:` with grouping in the query on `allObjects`. - -0.90.0 Release notes (2015-01-21) -============================================================= - -### API breaking changes - -* Rename `-[RLMRealm encryptedRealmWithPath:key:readOnly:error:]` to - `-[RLMRealm realmWithPath:encryptionKey:readOnly:error:]`. -* `-[RLMRealm setSchemaVersion:withMigrationBlock]` is no longer global and must be called - for each individual Realm path used. You can now call `-[RLMRealm setDefaultRealmSchemaVersion:withMigrationBlock]` - for the default Realm and `-[RLMRealm setSchemaVersion:forRealmAtPath:withMigrationBlock:]` for all others; - -### Enhancements - -* Add `-[RLMRealm writeCopyToPath:encryptionKey:error:]`. -* Add support for comparing string columns to other string columns in queries. - -### Bugfixes - -* Roll back changes made when an exception is thrown during a migration. -* Throw an exception if the number of items in a RLMResults or RLMArray changes - while it's being fast-enumerated. -* Also encrypt the temporary files used when encryption is enabled for a Realm. -* Fixed crash in JSONImport example on OS X with non-en_US locale. -* Fixed infinite loop when opening a Realm file in the Browser at the same time - as it is open in a 32-bit simulator. -* Fixed a crash when adding primary keys to older realm files with no primary - keys on any objects. -* Fixed a crash when removing a primary key in a migration. -* Fixed a crash when multiple write transactions with no changes followed by a - write transaction with changes were committed without the main thread - RLMRealm getting a chance to refresh. -* Fixed incomplete results when querying for non-null relationships. -* Improve the error message when a Realm file is opened in multiple processes - at once. - -0.89.2 Release notes (2015-01-02) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix an assertion failure when invalidating a Realm which is in a write - transaction, has already been invalidated, or has never been used. -* Fix an assertion failure when sorting an empty RLMArray property. -* Fix a bug resulting in the browser never becoming visible on 10.9. -* Write UTF-8 when generating class files from a realm file in the Browser. - -0.89.1 Release notes (2014-12-22) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Improve the error message when a Realm can't be opened due to lacking write - permissions. - -### Bugfixes - -* Fix an assertion failure when inserting rows after calling `deleteAllObjects` - on a Realm. -* Separate dynamic frameworks are now built for the simulator and devices to - work around App Store submission errors due to the simulator version not - being automatically stripped from dynamic libraries. - -0.89.0 Release notes (2014-12-18) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Add support for encrypting Realm files on disk. -* Support using KVC-compliant objects without getters or with custom getter - names to initialize RLMObjects with `createObjectInRealm` and friends. - -### Bugfixes - -* Merge native Swift default property values with defaultPropertyValues(). -* Don't leave the database schema partially updated when opening a realm fails - due to a migration being needed. -* Fixed issue where objects with custom getter names couldn't be used to - initialize other objects. -* Fix a major performance regression on queries on string properties. -* Fix a memory leak when circularly linked objects are added to a Realm. - -0.88.0 Release notes (2014-12-02) -============================================================= - -### API breaking changes - -* Deallocating an RLMRealm instance in a write transaction lacking an explicit - commit/cancel will now be automatically cancelled instead of committed. -* `-[RLMObject isDeletedFromRealm]` has been renamed to `-[RLMObject isInvalidated]`. - -### Enhancements - -* Add `-[RLMRealm writeCopyToPath:]` to write a compacted copy of the Realm - another file. -* Add support for case insensitive, BEGINSWITH, ENDSWITH and CONTAINS string - queries on array properties. -* Make fast enumeration of `RLMArray` and `RLMResults` ~30% faster and - `objectAtIndex:` ~55% faster. -* Added a lldb visualizer script for displaying the contents of persisted - RLMObjects when debugging. -* Added method `-setDefaultRealmPath:` to change the default Realm path. -* Add `-[RLMRealm invalidate]` to release data locked by the current thread. - -### Bugfixes - -* Fix for crash when running many simultaneous write transactions on background threads. -* Fix for crashes caused by opening Realms at multiple paths simultaneously which have had - properties re-ordered during migration. -* Don't run the query twice when `firstObject` or `lastObject` are called on an - `RLMResults` which has not had its results accessed already. -* Fix for bug where schema version is 0 for new Realm created at the latest version. -* Fix for error message where no migration block is specified when required. - -0.87.4 Release notes (2014-11-07) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix browser location in release zip. - -0.87.3 Release notes (2014-11-06) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Added method `-linkingObjectsOfClass:forProperty:` to RLMObject to expose inverse - relationships/backlinks. - -### Bugfixes - -* Fix for crash due to missing search index when migrating an object with a string primary key - in a database created using an older versions (0.86.3 and earlier). -* Throw an exception when passing an array containing a - non-RLMObject to -[RLMRealm addObjects:]. -* Fix for crash when deleting an object from multiple threads. - -0.87.0 Release notes (2014-10-21) -============================================================= - -### API breaking changes - -* RLMArray has been split into two classes, `RLMArray` and `RLMResults`. RLMArray is - used for object properties as in previous releases. Moving forward all methods used to - enumerate, query, and sort objects return an instance of a new class `RLMResults`. This - change was made to support diverging apis and the future addition of change notifications - for queries. -* The api for migrations has changed. You now call `setSchemaVersion:withMigrationBlock:` to - register a global migration block and associated version. This block is applied to Realms as - needed when opened for Realms at a previous version. The block can be applied manually if - desired by calling `migrateRealmAtPath:`. -* `arraySortedByProperty:ascending:` was renamed to `sortedResultsUsingProperty:ascending` -* `addObjectsFromArray:` on both `RLMRealm` and `RLMArray` has been renamed to `addObjects:` - and now accepts any container class which implements `NSFastEnumeration` -* Building with Swift support now requires Xcode 6.1 - -### Enhancements - -* Add support for sorting `RLMArray`s by multiple columns with `sortedResultsUsingDescriptors:` -* Added method `deleteAllObjects` on `RLMRealm` to clear a Realm. -* Added method `createObject:withObject:` on `RLMMigration` which allows object creation during migrations. -* Added method `deleteObject:` on `RLMMigration` which allows object deletion during migrations. -* Updating to core library version 0.85.0. -* Implement `objectsWhere:` and `objectsWithPredicate:` for array properties. -* Add `cancelWriteTransaction` to revert all changes made in a write transaction and end the transaction. -* Make creating `RLMRealm` instances on background threads when an instance - exists on another thread take a fifth of the time. -* Support for partial updates when calling `createOrUpdateWithObject:` and `addOrUpdateObject:` -* Re-enable Swift support on OS X - -### Bugfixes - -* Fix exceptions when trying to set `RLMObject` properties after rearranging - the properties in a `RLMObject` subclass. -* Fix crash on IN query with several thousand items. -* Fix crash when querying indexed `NSString` properties. -* Fixed an issue which prevented in-memory Realms from being used accross multiple threads. -* Preserve the sort order when querying a sorted `RLMResults`. -* Fixed an issue with migrations where if a Realm file is deleted after a Realm is initialized, - the newly created Realm can be initialized with an incorrect schema version. -* Fix crash in `RLMSuperSet` when assigning to a `RLMArray` property on a standalone object. -* Add an error message when the protocol for an `RLMArray` property is not a - valid object type. -* Add an error message when an `RLMObject` subclass is defined nested within - another Swift class. - -0.86.3 Release notes (2014-10-09) -============================================================= - -### Enhancements - -* Add support for != in queries on object relationships. - -### Bugfixes - -* Re-adding an object to its Realm no longer throws an exception and is now a no-op - (as it was previously). -* Fix another bug which would sometimes result in subclassing RLMObject - subclasses not working. - -0.86.2 Release notes (2014-10-06) -============================================================= - -### Bugfixes - -* Fixed issues with packaging "Realm Browser.app" for release. - -0.86.1 Release notes (2014-10-03) -============================================================= - -### Bugfixes - -* Fix a bug which would sometimes result in subclassing RLMObject subclasses - not working. - -0.86.0 Release notes (2014-10-03) -============================================================= - -### API breaking changes - -* Xcode 6 is now supported from the main Xcode project `Realm.xcodeproj`. - Xcode 5 is no longer supported. - -### Enhancements - -* Support subclassing RLMObject models. Although you can now persist subclasses, - polymorphic behavior is not supported (i.e. setting a property to an - instance of its subclass). -* Add support for sorting RLMArray properties. -* Speed up inserting objects with `addObject:` by ~20%. -* `readonly` properties are automatically ignored rather than having to be - added to `ignoredProperties`. -* Updating to core library version 0.83.1. -* Return "[deleted object]" rather than throwing an exception when - `-description` is called on a deleted RLMObject. -* Significantly improve performance of very large queries. -* Allow passing any enumerable to IN clauses rather than just NSArray. -* Add `objectForPrimaryKey:` and `objectInRealm:forPrimaryKey:` convenience - methods to fetch an object by primary key. - -### Bugfixes - -* Fix error about not being able to persist property 'hash' with incompatible - type when building for devices with Xcode 6. -* Fix spurious notifications of new versions of Realm. -* Fix for updating nested objects where some types do not have primary keys. -* Fix for inserting objects from JSON with NSNull values when default values - should be used. -* Trying to add a persisted RLMObject to a different Realm now throws an - exception rather than creating an uninitialized object. -* Fix validation errors when using IN on array properties. -* Fix errors when an IN clause has zero items. -* Fix for chained queries ignoring all but the last query's conditions. - -0.85.0 Release notes (2014-09-15) -============================================================= - -### API breaking changes - -* Notifications for a refresh being needed (when autorefresh is off) now send - the notification type RLMRealmRefreshRequiredNotification rather than - RLMRealmDidChangeNotification. - -### Enhancements - -* Updating to core library version 0.83.0. -* Support for primary key properties (for int and string columns). Declaring a property - to be the primary key ensures uniqueness for that property for all objects of a given type. - At the moment indexes on primary keys are not yet supported but this will be added in a future - release. -* Added methods to update or insert (upsert) for objects with primary keys defined. -* `[RLMObject initWithObject:]` and `[RLMObject createInRealmWithObject:]` now support - any object type with kvc properties. -* The Swift support has been reworked to work around Swift not being supported - in Frameworks on iOS 7. -* Improve performance when getting the count of items matching a query but not - reading any of the objects in the results. -* Add a return value to `-[RLMRealm refresh]` that indicates whether or not - there was anything to refresh. -* Add the class name to the error message when an RLMObject is missing a value - for a property without a default. -* Add support for opening Realms in read-only mode. -* Add an automatic check for updates when using Realm in a simulator (the - checker code is not compiled into device builds). This can be disabled by - setting the REALM_DISABLE_UPDATE_CHECKER environment variable to any value. -* Add support for Int16 and Int64 properties in Swift classes. - -### Bugfixes - -* Realm change notifications when beginning a write transaction are now sent - after updating rather than before, to match refresh. -* `-isEqual:` now uses the default `NSObject` implementation unless a primary key - is specified for an RLMObject. When a primary key is specified, `-isEqual:` calls - `-isEqualToObject:` and a corresponding implementation for `-hash` is also implemented. - -0.84.0 Release notes (2014-08-28) -============================================================= - -### API breaking changes - -* The timer used to trigger notifications has been removed. Notifications are now - only triggered by commits made in other threads, and can not currently be triggered - by changes made by other processes. Interprocess notifications will be re-added in - a future commit with an improved design. - -### Enhancements - -* Updating to core library version 0.82.2. -* Add property `deletedFromRealm` to RLMObject to indicate objects which have been deleted. -* Add support for the IN operator in predicates. -* Add support for the BETWEEN operator in link queries. -* Add support for multi-level link queries in predicates (e.g. `foo.bar.baz = 5`). -* Switch to building the SDK from source when using CocoaPods and add a - Realm.Headers subspec for use in targets that should not link a copy of Realm - (such as test targets). -* Allow unregistering from change notifications in the change notification - handler block. -* Significant performance improvements when holding onto large numbers of RLMObjects. -* Realm-Xcode6.xcodeproj now only builds using Xcode6-Beta6. -* Improved performance during RLMArray iteration, especially when mutating - contained objects. - -### Bugfixes - -* Fix crashes and assorted bugs when sorting or querying a RLMArray returned - from a query. -* Notifications are no longer sent when initializing new RLMRealm instances on background - threads. -* Handle object cycles in -[RLMObject description] and -[RLMArray description]. -* Lowered the deployment target for the Xcode 6 projects and Swift examples to - iOS 7.0, as they didn't actually require 8.0. -* Support setting model properties starting with the letter 'z' -* Fixed crashes that could result from switching between Debug and Relase - builds of Realm. - -0.83.0 Release notes (2014-08-13) -============================================================= - -### API breaking changes - -* Realm-Xcode6.xcodeproj now only builds using Xcode6-Beta5. -* Properties to be persisted in Swift classes must be explicitly declared as `dynamic`. -* Subclasses of RLMObject subclasses now throw an exception on startup, rather - than when added to a Realm. - -### Enhancements - -* Add support for querying for nil object properties. -* Improve error message when specifying invalid literals when creating or - initializing RLMObjects. -* Throw an exception when an RLMObject is used from the incorrect thread rather - than crashing in confusing ways. -* Speed up RLMRealm instantiation and array property iteration. -* Allow array and objection relation properties to be missing or null when - creating a RLMObject from a NSDictionary. - -### Bugfixes - -* Fixed a memory leak when querying for objects. -* Fixed initializing array properties on standalone Swift RLMObject subclasses. -* Fix for queries on 64bit integers. - -0.82.0 Release notes (2014-08-05) -============================================================= - -### API breaking changes - -* Realm-Xcode6.xcodeproj now only builds using Xcode6-Beta4. - -### Enhancements - -* Updating to core library version 0.80.5. -* Now support disabling the `autorefresh` property on RLMRealm instances. -* Building Realm-Xcode6 for iOS now builds a universal framework for Simulator & Device. -* Using NSNumber properties (unsupported) now throws a more informative exception. -* Added `[RLMRealm defaultRealmPath]` -* Proper implementation for [RLMArray indexOfObjectWhere:] -* The default Realm path on OS X is now ~/Library/Application Support/[bundle - identifier]/default.realm rather than ~/Documents -* We now check that the correct framework (ios or osx) is used at compile time. - -### Bugfixes - -* Fixed rapid growth of the realm file size. -* Fixed a bug which could cause a crash during RLMArray destruction after a query. -* Fixed bug related to querying on float properties: `floatProperty = 1.7` now works. -* Fixed potential bug related to the handling of array properties (RLMArray). -* Fixed bug where array properties accessed the wrong property. -* Fixed bug that prevented objects with custom getters to be added to a Realm. -* Fixed a bug where initializing a standalone object with an array literal would - trigger an exception. -* Clarified exception messages when using unsupported NSPredicate operators. -* Clarified exception messages when using unsupported property types on RLMObject subclasses. -* Fixed a memory leak when breaking out of a for-in loop on RLMArray. -* Fixed a memory leak when removing objects from a RLMArray property. -* Fixed a memory leak when querying for objects. - - -0.81.0 Release notes (2014-07-22) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Updating to core library version 0.80.3. -* Added support for basic querying of RLMObject and RLMArray properties (one-to-one and one-to-many relationships). - e.g. `[Person objectsWhere:@"dog.name == 'Alfonso'"]` or `[Person objectsWhere:@"ANY dogs.name == 'Alfonso'"]` - Supports all normal operators for numeric and date types. Does not support NSData properties or `BEGINSWITH`, `ENDSWITH`, `CONTAINS` - and other options for string properties. -* Added support for querying for object equality in RLMObject and RLMArray properties (one-to-one and one-to-many relationships). - e.g. `[Person objectsWhere:@"dog == %@", myDog]` `[Person objectsWhere:@"ANY dogs == %@", myDog]` `[Person objectsWhere:@"ANY friends.dog == %@", dog]` - Only supports comparing objects for equality (i.e. ==) -* Added a helper method to RLMRealm to perform a block inside a transaction. -* OSX framework now supported in CocoaPods. - -### Bugfixes - -* Fixed Unicode support in property names and string contents (Chinese, Russian, etc.). Closing #612 and #604. -* Fixed bugs related to migration when properties are removed. -* Fixed keyed subscripting for standalone RLMObjects. -* Fixed bug related to double clicking on a .realm file to launch the Realm Browser (thanks to Dean Moore). - - -0.80.0 Release notes (2014-07-15) -============================================================= - -### API breaking changes - -* Rename migration methods to -migrateDefaultRealmWithBlock: and -migrateRealmAtPath:withBlock: -* Moved Realm specific query methods from RLMRealm to class methods on RLMObject (-allObjects: to +allObjectsInRealm: ect.) - -### Enhancements - -* Added +createInDefaultRealmWithObject: method to RLMObject. -* Added support for array and object literals when calling -createWithObject: and -initWithObject: variants. -* Added method -deleteObjects: to batch delete objects from a Realm -* Support for defining RLMObject models entirely in Swift (experimental, see known issues). -* RLMArrays in Swift support Sequence-style enumeration (for obj in array). -* Implemented -indexOfObject: for RLMArray - -### Known Issues for Swift-defined models - -* Properties other than String, NSData and NSDate require a default value in the model. This can be an empty (but typed) array for array properties. -* The previous caveat also implies that not all models defined in Objective-C can be used for object properties. Only Objective-C models with only implicit (i.e. primitives) or explicit default values can be used. However, any Objective-C model object can be used in a Swift array property. -* Array property accessors don't work until its parent object has been added to a realm. -* Realm-Bridging-Header.h is temporarily exposed as a public header. This is temporary and will be private again once rdar://17633863 is fixed. -* Does not leverage Swift generics and still uses RLM-prefix everywhere. This is coming in #549. - - -0.22.0 Release notes -============================================================= - -### API breaking changes - -* Rename schemaForObject: to schemaForClassName: on RLMSchema -* Removed -objects:where: and -objects:orderedBy:where: from RLMRealm -* Removed -indexOfObjectWhere:, -objectsWhere: and -objectsOrderedBy:where: from RLMArray -* Removed +objectsWhere: and +objectsOrderedBy:where: from RLMObject - -### Enhancements - -* New Xcode 6 project for experimental swift support. -* New Realm Editor app for reading and editing Realm db files. -* Added support for migrations. -* Added support for RLMArray properties on objects. -* Added support for creating in-memory default Realm. -* Added -objectsWithClassName:predicateFormat: and -objectsWithClassName:predicate: to RLMRealm -* Added -indexOfObjectWithPredicateFormat:, -indexOfObjectWithPredicate:, -objectsWithPredicateFormat:, -objectsWithPredi -* Added +objectsWithPredicateFormat: and +objectsWithPredicate: to RLMObject -* Now allows predicates comparing two object properties of the same type. - - -0.20.0 Release notes (2014-05-28) -============================================================= - -Completely rewritten to be much more object oriented. - -### API breaking changes - -* Everything - -### Enhancements - -* None. - -### Bugfixes - -* None. - - -0.11.0 Release notes (not released) -============================================================= - -The Objective-C API has been updated and your code will break! - -### API breaking changes - -* `RLMTable` objects can only be created with an `RLMRealm` object. -* Renamed `RLMContext` to `RLMTransactionManager` -* Renamed `RLMContextDidChangeNotification` to `RLMRealmDidChangeNotification` -* Renamed `contextWithDefaultPersistence` to `managerForDefaultRealm` -* Renamed `contextPersistedAtPath:` to `managerForRealmWithPath:` -* Renamed `realmWithDefaultPersistence` to `defaultRealm` -* Renamed `realmWithDefaultPersistenceAndInitBlock` to `defaultRealmWithInitBlock` -* Renamed `find:` to `firstWhere:` -* Renamed `where:` to `allWhere:` -* Renamed `where:orderBy:` to `allWhere:orderBy:` - -### Enhancements - -* Added `countWhere:` on `RLMTable` -* Added `sumOfColumn:where:` on `RLMTable` -* Added `averageOfColumn:where:` on `RLMTable` -* Added `minOfProperty:where:` on `RLMTable` -* Added `maxOfProperty:where:` on `RLMTable` -* Added `toJSONString` on `RLMRealm`, `RLMTable` and `RLMView` -* Added support for `NOT` operator in predicates -* Added support for default values -* Added validation support in `createInRealm:withObject:` - -### Bugfixes - -* None. - - -0.10.0 Release notes (2014-04-23) -============================================================= - -TightDB is now Realm! The Objective-C API has been updated -and your code will break! - -### API breaking changes - -* All references to TightDB have been changed to Realm. -* All prefixes changed from `TDB` to `RLM`. -* `TDBTransaction` and `TDBSmartContext` have merged into `RLMRealm`. -* Write transactions now take an optional rollback parameter (rather than needing to return a boolean). -* `addColumnWithName:` and variant methods now return the index of the newly created column if successful, `NSNotFound` otherwise. - -### Enhancements - -* `createTableWithName:columns:` has been added to `RLMRealm`. -* Added keyed subscripting for RLMTable's first column if column is of type RLMPropertyTypeString. -* `setRow:atIndex:` has been added to `RLMTable`. -* `RLMRealm` constructors now have variants that take an writable initialization block -* New object interface - tables created/retrieved using `tableWithName:objectClass:` return custom objects - -### Bugfixes - -* None. - - -0.6.0 Release notes (2014-04-11) -============================================================= - -### API breaking changes - -* `contextWithPersistenceToFile:error:` renamed to `contextPersistedAtPath:error:` in `TDBContext` -* `readWithBlock:` renamed to `readUsingBlock:` in `TDBContext` -* `writeWithBlock:error:` renamed to `writeUsingBlock:error:` in `TDBContext` -* `readTable:withBlock:` renamed to `readTable:usingBlock:` in `TDBContext` -* `writeTable:withBlock:error:` renamed to `writeTable:usingBlock:error:` in `TDBContext` -* `findFirstRow` renamed to `indexOfFirstMatchingRow` on `TDBQuery`. -* `findFirstRowFromIndex:` renamed to `indexOfFirstMatchingRowFromIndex:` on `TDBQuery`. -* Return `NSNotFound` instead of -1 when appropriate. -* Renamed `castClass` to `castToTytpedTableClass` on `TDBTable`. -* `removeAllRows`, `removeRowAtIndex`, `removeLastRow`, `addRow` and `insertRow` methods - on table now return void instead of BOOL. - -### Enhancements -* A `TDBTable` can now be queried using `where:` and `where:orderBy:` taking - `NSPredicate` and `NSSortDescriptor` as arguments. -* Added `find:` method on `TDBTable` to find first row matching predicate. -* `contextWithDefaultPersistence` class method added to `TDBContext`. Will create a context persisted - to a file in app/documents folder. -* `renameColumnWithIndex:to:` has been added to `TDBTable`. -* `distinctValuesInColumnWithIndex` has been added to `TDBTable`. -* `dateIsBetween::`, `doubleIsBetween::`, `floatIsBetween::` and `intIsBetween::` - have been added to `TDBQuery`. -* Column names in Typed Tables can begin with non-capital letters too. The generated `addX` - selector can look odd. For example, a table with one column with name `age`, - appending a new row will look like `[table addage:7]`. -* Mixed typed values are better validated when rows are added, inserted, - or modified as object literals. -* `addRow`, `insertRow`, and row updates can be done using objects - derived from `NSObject`. -* `where` has been added to `TDBView`and `TDBViewProtocol`. -* Adding support for "smart" contexts (`TDBSmartContext`). - -### Bugfixes - -* Modifications of a `TDBView` and `TDBQuery` now throw an exception in a readtransaction. - - -0.5.0 Release notes (2014-04-02) -============================================================= - -The Objective-C API has been updated and your code will break! -Of notable changes a fast interface has been added. -This interface includes specific methods to get and set values into Tightdb. -To use these methods import ``. - -### API breaking changes - -* `getTableWithName:` renamed to `tableWithName:` in `TDBTransaction`. -* `addColumnWithName:andType:` renamed to `addColumnWithName:type:` in `TDBTable`. -* `columnTypeOfColumn:` renamed to `columnTypeOfColumnWithIndex` in `TDBTable`. -* `columnNameOfColumn:` renamed to `nameOfColumnWithIndex:` in `TDBTable`. -* `addColumnWithName:andType:` renamed to `addColumnWithName:type:` in `TDBDescriptor`. -* Fast getters and setters moved from `TDBRow.h` to `TDBRowFast.h`. - -### Enhancements - -* Added `minDateInColumnWithIndex` and `maxDateInColumnWithIndex` to `TDBQuery`. -* Transactions can now be started directly on named tables. -* You can create dynamic tables with initial schema. -* `TDBTable` and `TDBView` now have a shared protocol so they can easier be used interchangeably. - -### Bugfixes - -* Fixed bug in 64 bit iOS when inserting BOOL as NSNumber. - - -0.4.0 Release notes (2014-03-26) -============================================================= - -### API breaking changes - -* Typed interface Cursor has now been renamed to Row. -* TDBGroup has been renamed to TDBTransaction. -* Header files are renamed so names match class names. -* Underscore (_) removed from generated typed table classes. -* TDBBinary has been removed; use NSData instead. -* Underscope (_) removed from generated typed table classes. -* Constructor for TDBContext has been renamed to contextWithPersistenceToFile: -* Table findFirstRow and min/max/sum/avg operations has been hidden. -* Table.appendRow has been renamed to addRow. -* getOrCreateTable on Transaction has been removed. -* set*:inColumnWithIndex:atRowIndex: methods have been prefixed with TDB -* *:inColumnWithIndex:atRowIndex: methods have been prefixed with TDB -* addEmptyRow on table has been removed. Use [table addRow:nil] instead. -* TDBMixed removed. Use id and NSObject instead. -* insertEmptyRow has been removed from table. Use insertRow:nil atIndex:index instead. - -#### Enhancements - -* Added firstRow, lastRow selectors on view. -* firstRow and lastRow on table now return nil if table is empty. -* getTableWithName selector added on group. -* getting and creating table methods on group no longer take error argument. -* [TDBQuery parent] and [TDBQuery subtable:] selectors now return self. -* createTable method added on Transaction. Throws exception if table with same name already exists. -* Experimental support for pinning transactions on Context. -* TDBView now has support for object subscripting. - -### Bugfixes - -* None. - - -0.3.0 Release notes (2014-03-14) -============================================================= - -The Objective-C API has been updated and your code will break! - -### API breaking changes - -* Most selectors have been renamed in the binding! -* Prepend TDB-prefix on all classes and types. - -### Enhancements - -* Return types and parameters changed from size_t to NSUInteger. -* Adding setObject to TightdbTable (t[2] = @[@1, @"Hello"] is possible). -* Adding insertRow to TightdbTable. -* Extending appendRow to accept NSDictionary. - -### Bugfixes - -* None. - - -0.2.0 Release notes (2014-03-07) -============================================================= - -The Objective-C API has been updated and your code will break! - -### API breaking changes - -* addRow renamed to addEmptyRow - -### Enhancements - -* Adding a simple class for version numbering. -* Adding get-version and set-version targets to build.sh. -* tableview now supports sort on column with column type bool, date and int -* tableview has method for checking the column type of a specified column -* tableview has method for getting the number of columns -* Adding methods getVersion, getCoreVersion and isAtLeast. -* Adding appendRow to TightdbTable. -* Adding object subscripting. -* Adding method removeColumn on table. - -### Bugfixes - -* None. diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/NSError+RLMSync.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/NSError+RLMSync.h deleted file mode 100644 index 5ef323a24..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/NSError+RLMSync.h +++ /dev/null @@ -1,46 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2017 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@class RLMSyncErrorActionToken; - -/// NSError category extension providing methods to get data out of Realm's -/// "client reset" error. -@interface NSError (RLMSync) - -/** - Given an appropriate Atlas App Services error, return the token that - can be passed into `+[RLMSyncSession immediatelyHandleError:]` to - immediately perform error clean-up work, or nil if the error isn't of - a type that provides a token. - */ -- (nullable RLMSyncErrorActionToken *)rlmSync_errorActionToken NS_REFINED_FOR_SWIFT; - -/** - Given an Atlas App Services client reset error, return the path where the - backup copy of the Realm will be placed once the client reset process is - complete. - */ -- (nullable NSString *)rlmSync_clientResetBackedUpRealmPath NS_SWIFT_UNAVAILABLE(""); - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMAPIKeyAuth.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMAPIKeyAuth.h deleted file mode 100644 index 642bdd95d..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMAPIKeyAuth.h +++ /dev/null @@ -1,95 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMUserAPIKey, RLMObjectId; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// Provider client for user API keys. -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMAPIKeyAuth : RLMProviderClient - -/// A block type used to report an error -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMAPIKeyAuthOptionalErrorBlock)(NSError * _Nullable); - -/// A block type used to return an `RLMUserAPIKey` on success, or an `NSError` on failure -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMOptionalUserAPIKeyBlock)(RLMUserAPIKey * _Nullable, NSError * _Nullable); - -/// A block type used to return an array of `RLMUserAPIKey` on success, or an `NSError` on failure -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMUserAPIKeysBlock)(NSArray * _Nullable, NSError * _Nullable); - -/** - Creates a user API key that can be used to authenticate as the current user. - - @param name The name of the API key to be created. - @param completion A callback to be invoked once the call is complete. -*/ -- (void)createAPIKeyWithName:(NSString *)name - completion:(RLMOptionalUserAPIKeyBlock)completion NS_SWIFT_NAME(createAPIKey(named:completion:)); - -/** - Fetches a user API key associated with the current user. - - @param objectId The ObjectId of the API key to fetch. - @param completion A callback to be invoked once the call is complete. - */ -- (void)fetchAPIKey:(RLMObjectId *)objectId - completion:(RLMOptionalUserAPIKeyBlock)completion; - -/** - Fetches the user API keys associated with the current user. - - @param completion A callback to be invoked once the call is complete. - */ -- (void)fetchAPIKeysWithCompletion:(RLMUserAPIKeysBlock)completion; - -/** - Deletes a user API key associated with the current user. - - @param objectId The ObjectId of the API key to delete. - @param completion A callback to be invoked once the call is complete. - */ -- (void)deleteAPIKey:(RLMObjectId *)objectId - completion:(RLMAPIKeyAuthOptionalErrorBlock)completion; - -/** - Enables a user API key associated with the current user. - - @param objectId The ObjectId of the API key to enable. - @param completion A callback to be invoked once the call is complete. - */ -- (void)enableAPIKey:(RLMObjectId *)objectId - completion:(RLMAPIKeyAuthOptionalErrorBlock)completion; - -/** - Disables a user API key associated with the current user. - - @param objectId The ObjectId of the API key to disable. - @param completion A callback to be invoked once the call is complete. - */ -- (void)disableAPIKey:(RLMObjectId *)objectId - completion:(RLMAPIKeyAuthOptionalErrorBlock)completion; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMApp.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMApp.h deleted file mode 100644 index 2228232e8..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMApp.h +++ /dev/null @@ -1,235 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@protocol RLMNetworkTransport, RLMBSON; - -@class RLMUser, RLMCredentials, RLMSyncManager, RLMEmailPasswordAuth, RLMPushClient, RLMSyncTimeoutOptions; - -/// A block type used for APIs which asynchronously vend an `RLMUser`. -typedef void(^RLMUserCompletionBlock)(RLMUser * _Nullable, NSError * _Nullable); - -/// A block type used to report an error -typedef void(^RLMOptionalErrorBlock)(NSError * _Nullable); - -#pragma mark RLMAppConfiguration - -/// Properties representing the configuration of a client -/// that communicate with a particular Realm application. -@interface RLMAppConfiguration : NSObject - -/// A custom base URL to request against. -@property (nonatomic, strong, nullable) NSString *baseURL; - -/// The custom transport for network calls to the server. -@property (nonatomic, strong, nullable) id transport; - -/// :nodoc: -@property (nonatomic, strong, nullable) NSString *localAppName - __attribute__((deprecated("This field is not used"))); -/// :nodoc: -@property (nonatomic, strong, nullable) NSString *localAppVersion - __attribute__((deprecated("This field is not used"))); - -/// The default timeout for network requests. -@property (nonatomic, assign) NSUInteger defaultRequestTimeoutMS; - -/// If enabled (the default), a single connection is used for all Realms opened -/// with a single sync user. If disabled, a separate connection is used for each -/// Realm. -/// -/// Session multiplexing reduces resources used and typically improves -/// performance. When multiplexing is enabled, the connection is not immediately -/// closed when the last session is closed, and instead remains open for -/// ``RLMSyncTimeoutOptions.connectionLingerTime`` milliseconds (30 seconds by -/// default). -@property (nonatomic, assign) BOOL enableSessionMultiplexing; - -/** - Options for the assorted types of connection timeouts for sync connections. - - If nil default values for all timeouts are used instead. - */ -@property (nonatomic, nullable, copy) RLMSyncTimeoutOptions *syncTimeouts; - -/// :nodoc: -- (instancetype)initWithBaseURL:(nullable NSString *)baseURL - transport:(nullable id)transport - localAppName:(nullable NSString *)localAppName - localAppVersion:(nullable NSString *)localAppVersion -__attribute__((deprecated("localAppName and localAppVersion are unused"))); - -/// :nodoc: -- (instancetype)initWithBaseURL:(nullable NSString *) baseURL - transport:(nullable id)transport - localAppName:(nullable NSString *)localAppName - localAppVersion:(nullable NSString *)localAppVersion - defaultRequestTimeoutMS:(NSUInteger)defaultRequestTimeoutMS -__attribute__((deprecated("localAppName and localAppVersion are unused"))); - -/** -Create a new Realm App configuration. - -@param baseURL A custom base URL to request against. -@param transport A custom network transport. -*/ -- (instancetype)initWithBaseURL:(nullable NSString *)baseURL - transport:(nullable id)transport; - -/** - Create a new Realm App configuration. - - @param baseURL A custom base URL to request against. - @param transport A custom network transport. - @param defaultRequestTimeoutMS A custom default timeout for network requests. - */ -- (instancetype)initWithBaseURL:(nullable NSString *) baseURL - transport:(nullable id)transport - defaultRequestTimeoutMS:(NSUInteger)defaultRequestTimeoutMS; - -@end - -#pragma mark RLMApp - -/** - The `RLMApp` has the fundamental set of methods for communicating with a Realm - application backend. - - This interface provides access to login and authentication. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // internally thread-safe -@interface RLMApp : NSObject - -/// The configuration for this Realm app. -@property (nonatomic, readonly) RLMAppConfiguration *configuration; - -/// The `RLMSyncManager` for this Realm app. -@property (nonatomic, readonly) RLMSyncManager *syncManager; - -/// Get a dictionary containing all users keyed on id. -@property (nonatomic, readonly) NSDictionary *allUsers; - -/// Get the current user logged into the Realm app. -@property (nonatomic, readonly, nullable) RLMUser *currentUser; - -/// The app ID for this Realm app. -@property (nonatomic, readonly) NSString *appId; - -/** - A client for the email/password authentication provider which - can be used to obtain a credential for logging in. - - Used to perform requests specifically related to the email/password provider. -*/ -@property (nonatomic, readonly) RLMEmailPasswordAuth *emailPasswordAuth; - -/** - Get an application with a given appId and configuration. - - @param appId The unique identifier of your Realm app. - */ -+ (instancetype)appWithId:(NSString *)appId; - -/** - Get an application with a given appId and configuration. - - @param appId The unique identifier of your Realm app. - @param configuration A configuration object to configure this client. - */ -+ (instancetype)appWithId:(NSString *)appId - configuration:(nullable RLMAppConfiguration *)configuration; - -/** - Login to a user for the Realm app. - - @param credentials The credentials identifying the user. - @param completion A callback invoked after completion. - */ -- (void)loginWithCredential:(RLMCredentials *)credentials - completion:(RLMUserCompletionBlock)completion NS_REFINED_FOR_SWIFT; - -/** - Switches the active user to the specified user. - - This sets which user is used by all RLMApp operations which require a user. This is a local operation which does not access the network. - An exception will be throw if the user is not valid. The current user will remain logged in. - - @param syncUser The user to switch to. - @returns The user you intend to switch to - */ -- (RLMUser *)switchToUser:(RLMUser *)syncUser; - -/** - A client which can be used to register devices with the server to receive push notificatons - */ -- (RLMPushClient *)pushClientWithServiceName:(NSString *)serviceName - NS_SWIFT_NAME(pushClient(serviceName:)); - -/** - RLMApp instances are cached internally by Realm and cannot be created directly. - - Use `+[RLMRealm appWithId]` or `+[RLMRealm appWithId:configuration:]` - to obtain a reference to an RLMApp. - */ -- (instancetype)init __attribute__((unavailable("Use +appWithId or appWithId:configuration:."))); - -/** -RLMApp instances are cached internally by Realm and cannot be created directly. - -Use `+[RLMRealm appWithId]` or `+[RLMRealm appWithId:configuration:]` -to obtain a reference to an RLMApp. -*/ -+ (instancetype)new __attribute__((unavailable("Use +appWithId or appWithId:configuration:."))); - -@end - -#pragma mark - Sign In With Apple Extension - -API_AVAILABLE(ios(13.0), macos(10.15), tvos(13.0), watchos(6.0)) -/// Use this delegate to be provided a callback once authentication has succeed or failed -@protocol RLMASLoginDelegate - -/// Callback that is invoked should the authentication fail. -/// @param error An error describing the authentication failure. -- (void)authenticationDidFailWithError:(NSError *)error NS_SWIFT_NAME(authenticationDidComplete(error:)); - -/// Callback that is invoked should the authentication succeed. -/// @param user The newly authenticated user. -- (void)authenticationDidCompleteWithUser:(RLMUser *)user NS_SWIFT_NAME(authenticationDidComplete(user:)); - -@end - -API_AVAILABLE(ios(13.0), macos(10.15), tvos(13.0), watchos(6.0)) -/// Category extension that deals with Sign In With Apple authentication. -/// This is only available on OS's that support `AuthenticationServices` -@interface RLMApp (ASLogin) - -/// Use this delegate to be provided a callback once authentication has succeed or failed. -@property (nonatomic, weak, nullable) id authorizationDelegate; - -/// Sets the ASAuthorizationControllerDelegate to be handled by `RLMApp` -/// @param controller The ASAuthorizationController in which you want `RLMApp` to consume its delegate. -- (void)setASAuthorizationControllerDelegateForController:(ASAuthorizationController *)controller NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMArray.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMArray.h deleted file mode 100644 index b2c6c1664..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMArray.h +++ /dev/null @@ -1,652 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObject, RLMResults; - -/** - `RLMArray` is the container type in Realm used to define to-many relationships. - - Unlike an `NSArray`, `RLMArray`s hold a single type, specified by the `objectClassName` property. - This is referred to in these docs as the “type” of the array. - - When declaring an `RLMArray` property, the type must be marked as conforming to a - protocol by the same name as the objects it should contain (see the - `RLM_COLLECTION_TYPE` macro). In addition, the property can be declared using Objective-C - generics for better compile-time type safety. - - RLM_COLLECTION_TYPE(ObjectType) - ... - @property RLMArray *arrayOfObjectTypes; - - `RLMArray`s can be queried with the same predicates as `RLMObject` and `RLMResult`s. - - `RLMArray`s cannot be created directly. `RLMArray` properties on `RLMObject`s are - lazily created when accessed, or can be obtained by querying a Realm. - - ### Key-Value Observing - - `RLMArray` supports array key-value observing on `RLMArray` properties on `RLMObject` - subclasses, and the `invalidated` property on `RLMArray` instances themselves is - key-value observing compliant when the `RLMArray` is attached to a managed - `RLMObject` (`RLMArray`s on unmanaged `RLMObject`s will never become invalidated). - - Because `RLMArray`s are attached to the object which they are a property of, they - do not require using the mutable collection proxy objects from - `-mutableArrayValueForKey:` or KVC-compatible mutation methods on the containing - object. Instead, you can call the mutation methods on the `RLMArray` directly. - */ - -@interface RLMArray : NSObject - -#pragma mark - Properties - -/** - The number of objects in the array. - */ -@property (nonatomic, readonly, assign) NSUInteger count; - -/** - The type of the objects in the array. - */ -@property (nonatomic, readonly, assign) RLMPropertyType type; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readonly, getter = isOptional) BOOL optional; - -/** - The class name of the objects contained in the array. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages the array. Returns `nil` for unmanaged arrays. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - Indicates if the array can no longer be accessed. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if the array is frozen. - - Frozen arrays are immutable and can be accessed from any thread. Frozen arrays - are created by calling `-freeze` on a managed live array. Unmanaged arrays are - never frozen. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Accessing Objects from an Array - -/** - Returns the object at the index specified. - - @param index The index to look up. - - @return An object of the type contained in the array. - */ -- (RLMObjectType)objectAtIndex:(NSUInteger)index; - -/** - Returns an array containing the objects in the array at the indexes specified by a given index set. - `nil` will be returned if the index set contains an index out of the arrays bounds. - - @param indexes The indexes in the array to retrieve objects from. - - @return The objects at the specified indexes. - */ -- (nullable NSArray *)objectsAtIndexes:(NSIndexSet *)indexes; - -/** - Returns the first object in the array. - - Returns `nil` if called on an empty array. - - @return An object of the type contained in the array. - */ -- (nullable RLMObjectType)firstObject; - -/** - Returns the last object in the array. - - Returns `nil` if called on an empty array. - - @return An object of the type contained in the array. - */ -- (nullable RLMObjectType)lastObject; - - - -#pragma mark - Adding, Removing, and Replacing Objects in an Array - -/** - Adds an object to the end of the array. - - @warning This method may only be called during a write transaction. - - @param object An object of the type contained in the array. - */ -- (void)addObject:(RLMObjectType)object; - -/** - Adds an array of objects to the end of the array. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable object such as `NSArray` or `RLMResults` which contains objects of the - same class as the array. - */ -- (void)addObjects:(id)objects; - -/** - Inserts an object at the given index. - - Throws an exception if the index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param anObject An object of the type contained in the array. - @param index The index at which to insert the object. - */ -- (void)insertObject:(RLMObjectType)anObject atIndex:(NSUInteger)index; - -/** - Removes an object at the given index. - - Throws an exception if the index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param index The array index identifying the object to be removed. - */ -- (void)removeObjectAtIndex:(NSUInteger)index; - -/** - Removes the last object in the array. - - This is a no-op if the array is already empty. - - @warning This method may only be called during a write transaction. -*/ -- (void)removeLastObject; - -/** - Removes all objects from the array. - - @warning This method may only be called during a write transaction. - */ -- (void)removeAllObjects; - -/** - Replaces an object at the given index with a new object. - - Throws an exception if the index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param index The index of the object to be replaced. - @param anObject An object (of the same type as returned from the `objectClassName` selector). - */ -- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(RLMObjectType)anObject; - -/** - Moves the object at the given source index to the given destination index. - - Throws an exception if the index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param sourceIndex The index of the object to be moved. - @param destinationIndex The index to which the object at `sourceIndex` should be moved. - */ -- (void)moveObjectAtIndex:(NSUInteger)sourceIndex toIndex:(NSUInteger)destinationIndex; - -/** - Exchanges the objects in the array at given indices. - - Throws an exception if either index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param index1 The index of the object which should replace the object at index `index2`. - @param index2 The index of the object which should replace the object at index `index1`. - */ -- (void)exchangeObjectAtIndex:(NSUInteger)index1 withObjectAtIndex:(NSUInteger)index2; - -#pragma mark - Querying an Array - -/** - Returns the index of an object in the array. - - Returns `NSNotFound` if the object is not found in the array. - - @param object An object (of the same type as returned from the `objectClassName` selector). - */ -- (NSUInteger)indexOfObject:(RLMObjectType)object; - -/** - Returns the index of the first object in the array matching the predicate. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return The index of the object, or `NSNotFound` if the object is not found in the array. - */ -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns the index of the first object in the array matching the predicate. - - @param predicate The predicate with which to filter the objects. - - @return The index of the object, or `NSNotFound` if the object is not found in the array. - */ -- (NSUInteger)indexOfObjectWithPredicate:(NSPredicate *)predicate; - -/** - Returns all the objects matching the given predicate in the array. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` of objects that match the given predicate. - */ -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all the objects matching the given predicate in the array. - - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` of objects that match the given predicate - */ -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/** - Returns a sorted `RLMResults` from the array. - - @param keyPath The key path to sort by. - @param ascending The direction to sort in. - - @return An `RLMResults` sorted by the specified key path. - */ -- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a sorted `RLMResults` from the array. - - @param properties An array of `RLMSortDescriptor`s to sort by. - - @return An `RLMResults` sorted by the specified properties. - */ -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/** - Returns a distinct `RLMResults` from the array. - - @param keyPaths The key paths to distinct on. - - @return An `RLMResults` with the distinct values of the keypath(s). - */ -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -/// :nodoc: -- (RLMObjectType)objectAtIndexedSubscript:(NSUInteger)index; - -/// :nodoc: -- (void)setObject:(RLMObjectType)newValue atIndexedSubscript:(NSUInteger)index; - -#pragma mark - Sectioning an Array - -/** - Sorts and sections this collection from a given property key path, returning the result - as an instance of `RLMSectionedResults`. - - @param keyPath The property key path to sort on. - @param ascending The direction to sort in. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsSortedUsingKeyPath:(NSString *)keyPath - ascending:(BOOL)ascending - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -/** - Sorts and sections this collection from a given array of sort descriptors, returning the result - as an instance of `RLMSectionedResults`. - - @param sortDescriptors An array of `RLMSortDescriptor`s to sort by. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @note The primary sort descriptor must be responsible for determining the section key. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsUsingSortDescriptors:(NSArray *)sortDescriptors - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - - -#pragma mark - Notifications - -/** - Registers a block to be called each time the array changes. - - The block will be asynchronously called with the initial array, and then - called again after each write transaction which changes any of the objects in - the array, which objects are in the results, or the order of the objects in the - array. - - The `changes` parameter will be `nil` the first time the block is called. For - each call after that, it will contain information about which rows in the - array were added, removed or modified. If a write transaction did not modify - any objects in the array, the block is not called at all. See the - `RLMCollectionChange` documentation for information on how the changes are - reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - Person *person = [[Person allObjectsInRealm:realm] firstObject]; - NSLog(@"person.dogs.count: %zu", person.dogs.count); // => 0 - self.token = [person.dogs addNotificationBlock(RLMArray *dogs, - RLMCollectionChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count) // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - [person.dogs addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a non-frozen managed array. - - @param block The block to be called each time the array changes. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMArray *_Nullable array, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the array changes. - - The block will be asynchronously called with the initial array, and then - called again after each write transaction which changes any of the objects in - the array, which objects are in the results, or the order of the objects in the - array. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the array were added, removed or modified. If a write transaction - did not modify any objects in the array, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMArray *_Nullable array, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the array changes. - - The block will be asynchronously called with the initial array, and then - called again after each write transaction which changes any of the objects in - the array, which objects are in the results, or the order of the objects in the - array. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the array were added, removed or modified. If a write transaction - did not modify any objects in the array, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMArray *_Nullable array, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the array changes. - - The block will be asynchronously called with the initial array, and then - called again after each write transaction which changes any of the objects in - the array, which objects are in the results, or the order of the objects in the - array. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the array were added, removed or modified. If a write transaction - did not modify any objects in the array, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMArray *_Nullable array, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths -__attribute__((warn_unused_result)); - -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the objects in the array. - - NSNumber *min = [object.arrayProperty minOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The minimum value of the property, or `nil` if the array is empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects in the array. - - NSNumber *max = [object.arrayProperty maxOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose maximum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The maximum value of the property, or `nil` if the array is empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of the values of a given property over all the objects in the array. - - NSNumber *sum = [object.arrayProperty sumOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose values should be summed. Only properties of - types `int`, `float`, and `double` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects in the array. - - NSNumber *average = [object.arrayProperty averageOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose average value should be calculated. Only - properties of types `int`, `float`, and `double` are supported. - - @return The average value of the given property, or `nil` if the array is empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this array. - - The frozen copy is an immutable array which contains the same data as this - array currently contains, but will not update when writes are made to the - containing Realm. Unlike live arrays, frozen arrays can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a managed array. - @warning Holding onto a frozen array for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -#pragma mark - Unavailable Methods - -/** - `-[RLMArray init]` is not available because `RLMArray`s cannot be created directly. - `RLMArray` properties on `RLMObject`s are lazily created when accessed. - */ -- (instancetype)init __attribute__((unavailable("RLMArrays cannot be created directly"))); - -/** - `+[RLMArray new]` is not available because `RLMArray`s cannot be created directly. - `RLMArray` properties on `RLMObject`s are lazily created when accessed. - */ -+ (instancetype)new __attribute__((unavailable("RLMArrays cannot be created directly"))); - -@end - -/// :nodoc: -@interface RLMArray (Swift) -// for use only in Swift class definitions -- (instancetype)initWithObjectClassName:(NSString *)objectClassName; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMAsymmetricObject.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMAsymmetricObject.h deleted file mode 100644 index 09deb787e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMAsymmetricObject.h +++ /dev/null @@ -1,98 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2022 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectSchema, RLMPropertyDescriptor, RLMRealm; -/** - `RLMAsymmetricObject` is a base class used to define asymmetric Realm objects. - - Asymmetric objects can only be created using the `createInRealm:` - function, and cannot be added, removed or queried. - When created, asymmetric objects will be synced unidirectionally to the MongoDB - database and cannot be accessed locally. - - Linking an asymmetric object within an `Object` is not allowed and will throw an error. - - The property types supported on `RLMAsymmetricObject` are the same as for `RLMObject`, - except for that asymmetric objects can only link to embedded objects, so `RLMObject` - and `RLMArray` properties are not supported (`RLMEmbeddedObject` and - `RLMArray` *are*). - */ -@interface RLMAsymmetricObject : RLMObjectBase - -#pragma mark - Creating & Initializing Objects - -/** - Creates an unmanaged instance of a Realm object. - */ -- (instancetype)init NS_DESIGNATED_INITIALIZER; - -/** - Creates an unmanaged instance of a Realm object. - - Pass in an `NSArray` or `NSDictionary` instance to set the values of the object's properties. - */ -- (instancetype)initWithValue:(id)value; - -/** - Returns the class name for a Realm object subclass. - - @warning Do not override. Realm relies on this method returning the exact class - name. - - @return The class name for the model class. - */ -+ (NSString *)className; - -/** - Creates an Asymmetric object, which will be synced unidirectionally and - cannot be queried locally. - - Objects created using this method will not be added to the Realm. - - @warning This method may only be called during a write transaction. - @warning This method always returns nil. - - @param realm The Realm to be used to create the asymmetric object.. - @param value The value used to populate the object. - - @return Returns `nil` - */ -+ (instancetype)createInRealm:(RLMRealm *)realm withValue:(id)value; - -#pragma mark - Properties - -/** - The object schema which lists the managed properties for the object. - */ -@property (nonatomic, readonly) RLMObjectSchema *objectSchema; - -#pragma mark - Dynamic Accessors - -/// :nodoc: -- (nullable id)objectForKeyedSubscript:(NSString *)key; - -/// :nodoc: -- (void)setObject:(nullable id)obj forKeyedSubscript:(NSString *)key; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMAsyncTask.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMAsyncTask.h deleted file mode 100644 index 9f7dc58da..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMAsyncTask.h +++ /dev/null @@ -1,67 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A task object which can be used to observe or cancel an async open. - - When a synchronized Realm is opened asynchronously, the latest state of the - Realm is downloaded from the server before the completion callback is invoked. - This task object can be used to observe the state of the download or to cancel - it. This should be used instead of trying to observe the download via the sync - session as the sync session itself is created asynchronously, and may not exist - yet when -[RLMRealm asyncOpenWithConfiguration:completion:] returns. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMAsyncOpenTask : NSObject -/** - Register a progress notification block. - - Each registered progress notification block is called whenever the sync - subsystem has new progress data to report until the task is either cancelled - or the completion callback is called. Progress notifications are delivered on - the main queue. - */ -- (void)addProgressNotificationBlock:(RLMProgressNotificationBlock)block; - -/** - Register a progress notification block which is called on the given queue. - - Each registered progress notification block is called whenever the sync - subsystem has new progress data to report until the task is either cancelled - or the completion callback is called. Progress notifications are delivered on - the supplied queue. - */ -- (void)addProgressNotificationOnQueue:(dispatch_queue_t)queue - block:(RLMProgressNotificationBlock)block; - -/** - Cancel the asynchronous open. - - Any download in progress will be cancelled, and the completion block for this - async open will never be called. If multiple async opens on the same Realm are - happening concurrently, all other opens will fail with the error "operation cancelled". - */ -- (void)cancel; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMBSON.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMBSON.h deleted file mode 100644 index 41750fd57..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMBSON.h +++ /dev/null @@ -1,174 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -#pragma mark RLMBSONType - -/** - Allowed BSON types. - */ -typedef NS_ENUM(NSUInteger, RLMBSONType) { - /// BSON Null type - RLMBSONTypeNull, - /// BSON Int32 type - RLMBSONTypeInt32, - /// BSON Int64 type - RLMBSONTypeInt64, - /// BSON Bool type - RLMBSONTypeBool, - /// BSON Double type - RLMBSONTypeDouble, - /// BSON String type - RLMBSONTypeString, - /// BSON Binary type - RLMBSONTypeBinary, - /// BSON Timestamp type - RLMBSONTypeTimestamp, - /// BSON Datetime type - RLMBSONTypeDatetime, - /// BSON ObjectId type - RLMBSONTypeObjectId, - /// BSON Decimal128 type - RLMBSONTypeDecimal128, - /// BSON RegularExpression type - RLMBSONTypeRegularExpression, - /// BSON MaxKey type - RLMBSONTypeMaxKey, - /// BSON MinKey type - RLMBSONTypeMinKey, - /// BSON Document type - RLMBSONTypeDocument, - /// BSON Array type - RLMBSONTypeArray, - /// BSON UUID type - RLMBSONTypeUUID -}; - -#pragma mark RLMBSON - -/** - Protocol representing a BSON value. BSON is a computer data interchange format. - The name "BSON" is based on the term JSON and stands for "Binary JSON". - - The following types conform to RLMBSON: - - `NSNull` - `NSNumber` - `NSString` - `NSData` - `NSDateInterval` - `NSDate` - `RLMObjectId` - `RLMDecimal128` - `NSRegularExpression` - `RLMMaxKey` - `RLMMinKey` - `NSDictionary` - `NSArray` - `NSUUID` - - @see RLMBSONType - @see bsonspec.org - */ -@protocol RLMBSON - -/** - The BSON type for the conforming interface. - */ -@property (readonly) RLMBSONType bsonType NS_REFINED_FOR_SWIFT; - -/** - Whether or not this BSON is equal to another. - - @param other The BSON to compare to - */ -- (BOOL)isEqual:(_Nullable id)other; - -@end - -/// :nodoc: -@interface NSNull (RLMBSON) -@end - -/// :nodoc: -@interface NSNumber (RLMBSON) -@end - -/// :nodoc: -@interface NSString (RLMBSON) -@end - -/// :nodoc: -@interface NSData (RLMBSON) -@end - -/// :nodoc: -@interface NSDateInterval (RLMBSON) -@end - -/// :nodoc: -@interface NSDate (RLMBSON) -@end - -/// :nodoc: -@interface RLMObjectId (RLMBSON) -@end - -/// :nodoc: -@interface RLMDecimal128 (RLMBSON) -@end - -/// :nodoc: -@interface NSRegularExpression (RLMBSON) -@end - -/// MaxKey will always be the greatest value when comparing to other BSON types -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMMaxKey : NSObject -@end - -/// MinKey will always be the smallest value when comparing to other BSON types -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMMinKey : NSObject -@end - -/// :nodoc: -@interface RLMMaxKey (RLMBSON) -@end - -/// :nodoc: -@interface RLMMinKey (RLMBSON) -@end - -/// :nodoc: -@interface NSDictionary (RLMBSON) -@end - -/// :nodoc: -@interface NSMutableArray (RLMBSON) -@end - -/// :nodoc: -@interface NSArray (RLMBSON) -@end - -/// :nodoc: -@interface NSUUID (RLMBSON) -@end diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMCollection.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMCollection.h deleted file mode 100644 index eac117f17..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMCollection.h +++ /dev/null @@ -1,613 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@protocol RLMValue; -@class RLMRealm, RLMResults, RLMSortDescriptor, RLMNotificationToken, RLMCollectionChange, RLMSectionedResults; -typedef RLM_CLOSED_ENUM(int32_t, RLMPropertyType); -/// A callback which is invoked on each element in the Results collection which returns the section key. -typedef id _Nullable(^RLMSectionedResultsKeyBlock)(id); - -/** - A homogenous collection of Realm-managed objects. Examples of conforming types - include `RLMArray`, `RLMSet`, `RLMResults`, and `RLMLinkingObjects`. - */ -@protocol RLMCollection - -#pragma mark - Properties - -/** - The number of objects in the collection. - */ -@property (nonatomic, readonly) NSUInteger count; - -/** - The type of the objects in the collection. - */ -@property (nonatomic, readonly) RLMPropertyType type; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readonly, getter = isOptional) BOOL optional; - -/** - The class name of the objects contained in the collection. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages this collection, if any. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - Indicates if the collection is no longer valid. - - The collection becomes invalid if `invalidate` is called on the managing - Realm. Unmanaged collections are never invalidated. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -#pragma mark - Accessing Objects from a Collection - -/** - Returns the object at the index specified. - - @param index The index to look up. - - @return An object of the type contained in the collection. - */ -- (id)objectAtIndex:(NSUInteger)index; - -@optional - -/** - Returns an array containing the objects in the collection at the indexes - specified by a given index set. `nil` will be returned if the index set - contains an index out of the collections bounds. - - @param indexes The indexes in the collection to retrieve objects from. - - @return The objects at the specified indexes. - */ -- (nullable NSArray *)objectsAtIndexes:(NSIndexSet *)indexes; - -/** - Returns the first object in the collection. - - RLMSet is not ordered, and so for sets this will return an arbitrary object in - the set. It is not guaraneed to be a different object from what `lastObject` - gives even if the set has multiple objects in it. - - Returns `nil` if called on an empty collection. - - @return An object of the type contained in the collection. - */ -- (nullable id)firstObject; - -/** - Returns the last object in the collection. - - RLMSet is not ordered, and so for sets this will return an arbitrary object in - the set. It is not guaraneed to be a different object from what `firstObject` - gives even if the set has multiple objects in it. - - Returns `nil` if called on an empty collection. - - @return An object of the type contained in the collection. - */ -- (nullable id)lastObject; - -/// :nodoc: -- (id)objectAtIndexedSubscript:(NSUInteger)index; - -/** - Returns the index of an object in the collection. - - Returns `NSNotFound` if the object is not found in the collection. - - @param object An object (of the same type as returned from the `objectClassName` selector). - */ -- (NSUInteger)indexOfObject:(id)object; - -/** - Returns the index of the first object in the collection matching the predicate. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return The index of the object, or `NSNotFound` if the object is not found in the collection. - */ -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns the index of the first object in the collection matching the predicate. - - @param predicate The predicate with which to filter the objects. - - @return The index of the object, or `NSNotFound` if the object is not found in the collection. - */ -- (NSUInteger)indexOfObjectWithPredicate:(NSPredicate *)predicate; - -@required - -#pragma mark - Querying a Collection - -/** - Returns all objects matching the given predicate in the collection. - - This is only supported for managed collections. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - @return An `RLMResults` containing objects that match the given predicate. - */ -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all objects matching the given predicate in the collection. - - This is only supported for managed collections. - - @param predicate The predicate with which to filter the objects. - @return An `RLMResults` containing objects that match the given predicate. - */ -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/** - Returns a sorted `RLMResults` from the collection. - - This is only supported for managed collections. - - @param keyPath The keyPath to sort by. - @param ascending The direction to sort in. - @return An `RLMResults` sorted by the specified key path. - */ -- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a sorted `RLMResults` from the collection. - - This is only supported for managed collections. - - @param properties An array of `RLMSortDescriptor`s to sort by. - @return An `RLMResults` sorted by the specified properties. - */ -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/** - Returns a distinct `RLMResults` from the collection. - - This is only supported for managed collections. - - @param keyPaths The key paths used produce distinct results - @return An `RLMResults` made distinct based on the specified key paths - */ -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -/** - Returns an `NSArray` containing the results of invoking `valueForKey:` using - `key` on each of the collection's objects. - - @param key The name of the property. - - @return An `NSArray` containing results. - */ -- (nullable id)valueForKey:(NSString *)key; - -/** - Returns the value for the derived property identified by a given key path. - - @param keyPath A key path of the form relationship.property (with one or more relationships). - - @return The value for the derived property identified by keyPath. - */ -- (nullable id)valueForKeyPath:(NSString *)keyPath; - -/** - Invokes `setValue:forKey:` on each of the collection's objects using the specified `value` and `key`. - - @warning This method may only be called during a write transaction. - - @param value The object value. - @param key The name of the property. - */ -- (void)setValue:(nullable id)value forKey:(NSString *)key; - -#pragma mark - Notifications - -/** -Registers a block to be called each time the collection changes. - -The block will be asynchronously called with the initial collection, -and then called again after each write transaction which changes either any -of the objects in the collection, or which objects are in the collection. - -The `change` parameter will be `nil` the first time the block is called. -For each call after that, it will contain information about -which rows in the collection were added, removed or modified. If a -write transaction did not modify any objects in the results collection, -the block is not called at all. See the `RLMCollectionChange` documentation for -information on how the changes are reported and an example of updating a -`UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - -At the time when the block is called, the collection object will be fully -evaluated and up-to-date, and as long as you do not perform a write transaction -on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will -never perform blocking work. - -Notifications are delivered via the standard run loop, and so can't be -delivered while the run loop is blocked by other activity. When -notifications can't be delivered instantly, multiple notifications may be -coalesced into a single notification. This can include the notification -with the initial results. For example, the following code performs a write -transaction immediately after adding the notification block, so there is no -opportunity for the initial notification to be delivered first. As a -result, the initial notification will reflect the state of the Realm after -the write transaction. - - RLMResults *results = [Dog allObjects]; - NSLog(@"dogs.count: %zu", dogs.count); // => 0 - self.token = [results addNotificationBlock:^(RLMResults *dogs, - RLMCollectionChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - [realm addObject:dog]; - }]; - // end of run loop execution context - -You must retain the returned token for as long as you want updates to continue -to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - -@warning This method cannot be called during a write transaction, or when the - containing Realm is read-only or frozen. - -@param block The block to be called whenever a change occurs. -@return A token which must be held for as long as you want updates to be delivered. -*/ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** -Registers a block to be called each time the collection changes. - -The block will be asynchronously called with the initial collection, -and then called again after each write transaction which changes either any -of the objects in the collection, or which objects are in the collection. - -The `change` parameter will be `nil` the first time the block is called. -For each call after that, it will contain information about -which rows in the collection were added, removed or modified. If a -write transaction did not modify any objects in the results collection, -the block is not called at all. See the `RLMCollectionChange` documentation for -information on how the changes are reported and an example of updating a -`UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - -At the time when the block is called, the collection object will be fully -evaluated and up-to-date, and as long as you do not perform a write transaction -on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will -never perform blocking work. - -Notifications are delivered on the given queue. If the queue is blocked and -notifications can't be delivered instantly, multiple notifications may be -coalesced into a single notification. - -You must retain the returned token for as long as you want updates to continue -to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - -@warning This method cannot be called when the containing Realm is read-only or frozen. -@warning The queue must be a serial queue. - -@param block The block to be called whenever a change occurs. -@param queue The serial queue to deliver notifications to. -@return A token which must be held for as long as you want updates to be delivered. -*/ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** -Registers a block to be called each time the collection changes. - -The block will be asynchronously called with the initial collection, -and then called again after each write transaction which changes either any -of the objects in the collection, or which objects are in the collection. - -The `change` parameter will be `nil` the first time the block is called. -For each call after that, it will contain information about -which rows in the collection were added, removed or modified. If a -write transaction did not modify any objects in the results collection, -the block is not called at all. See the `RLMCollectionChange` documentation for -information on how the changes are reported and an example of updating a -`UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - -At the time when the block is called, the collection object will be fully -evaluated and up-to-date, and as long as you do not perform a write transaction -on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will -never perform blocking work. - -Notifications are delivered on the given queue. If the queue is blocked and -notifications can't be delivered instantly, multiple notifications may be -coalesced into a single notification. - -You must retain the returned token for as long as you want updates to continue -to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - -@warning This method cannot be called when the containing Realm is read-only or frozen. -@warning The queue must be a serial queue. - -@param block The block to be called whenever a change occurs. -@param queue The serial queue to deliver notifications to. -@param keyPaths The block will be called for changes occurring on these keypaths. If no -key paths are given, notifications are delivered for every property key path. -@return A token which must be held for as long as you want updates to be delivered. -*/ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -#pragma mark - Sectioned Results - -/** - Sorts and sections this collection from a given property key path, returning the result - as an instance of `RLMSectionedResults`. - - @param keyPath The property key path to sort on. - @param ascending The direction to sort in. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsSortedUsingKeyPath:(NSString *)keyPath - ascending:(BOOL)ascending - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -/** - Sorts and sections this collection from a given array of sort descriptors, returning the result - as an instance of `RLMSectionedResults`. - - @param sortDescriptors An array of `RLMSortDescriptor`s to sort by. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @note The primary sort descriptor must be responsible for determining the section key. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsUsingSortDescriptors:(NSArray *)sortDescriptors - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the objects - in the collection. - - NSNumber *min = [results minOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The minimum value of the property, or `nil` if the Results are empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects - in the collection. - - NSNumber *max = [results maxOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose maximum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The maximum value of the property, or `nil` if the Results are empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of the values of a given property over all the objects in the collection. - - NSNumber *sum = [results sumOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose values should be summed. Only properties of - types `int`, `float`, and `double` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects in the collection. - - NSNumber *average = [results averageOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose average value should be calculated. Only - properties of types `int`, `float`, and `double` are supported. - - @return The average value of the given property, or `nil` if the Results are empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -#pragma mark - Freeze - -/** - Indicates if the collection is frozen. - - Frozen collections are immutable and can be accessed from any thread. The - objects read from a frozen collection will also be frozen. - */ -@property (nonatomic, readonly, getter=isFrozen) BOOL frozen; - -/** - Returns a frozen (immutable) snapshot of this collection. - - The frozen copy is an immutable collection which contains the same data as - this collection currently contains, but will not update when writes are made - to the containing Realm. Unlike live collections, frozen collections can be - accessed from any thread. - - @warning This method cannot be called during a write transaction, or when the containing Realm is read-only. - @warning Holding onto a frozen collection for an extended period while - performing write transaction on the Realm may result in the Realm - file growing to large sizes. See - `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -@end - -/** - An `RLMSortDescriptor` stores a property name and a sort order for use with - `sortedResultsUsingDescriptors:`. It is similar to `NSSortDescriptor`, but supports - only the subset of functionality which can be efficiently run by Realm's query - engine. - - `RLMSortDescriptor` instances are immutable. - */ -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMSortDescriptor : NSObject - -#pragma mark - Properties - -/** - The key path which the sort descriptor orders results by. - */ -@property (nonatomic, readonly) NSString *keyPath; - -/** - Whether the descriptor sorts in ascending or descending order. - */ -@property (nonatomic, readonly) BOOL ascending; - -#pragma mark - Methods - -/** - Returns a new sort descriptor for the given key path and sort direction. - */ -+ (instancetype)sortDescriptorWithKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a copy of the receiver with the sort direction reversed. - */ -- (instancetype)reversedSortDescriptor; - -@end - -/** - A `RLMCollectionChange` object encapsulates information about changes to collections - that are reported by Realm notifications. - - `RLMCollectionChange` is passed to the notification blocks registered with - `-addNotificationBlock` on `RLMArray` and `RLMResults`, and reports what rows in the - collection changed since the last time the notification block was called. - - The change information is available in two formats: a simple array of row - indices in the collection for each type of change, and an array of index paths - in a requested section suitable for passing directly to `UITableView`'s batch - update methods. A complete example of updating a `UITableView` named `tv`: - - [tv beginUpdates]; - [tv deleteRowsAtIndexPaths:[changes deletionsInSection:0] withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv insertRowsAtIndexPaths:[changes insertionsInSection:0] withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv reloadRowsAtIndexPaths:[changes modificationsInSection:0] withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv endUpdates]; - - All of the arrays in an `RLMCollectionChange` are always sorted in ascending order. - */ -@interface RLMCollectionChange : NSObject -/// The indices of objects in the previous version of the collection which have -/// been removed from this one. -@property (nonatomic, readonly) NSArray *deletions; - -/// The indices in the new version of the collection which were newly inserted. -@property (nonatomic, readonly) NSArray *insertions; - -/** - The indices in the new version of the collection which were modified. - - For `RLMResults`, this means that one or more of the properties of the object at - that index were modified (or an object linked to by that object was - modified). - - For `RLMArray`, the array itself being modified to contain a - different object at that index will also be reported as a modification. - */ -@property (nonatomic, readonly) NSArray *modifications; - -/// Returns the index paths of the deletion indices in the given section. -- (NSArray *)deletionsInSection:(NSUInteger)section; - -/// Returns the index paths of the insertion indices in the given section. -- (NSArray *)insertionsInSection:(NSUInteger)section; - -/// Returns the index paths of the modification indices in the given section. -- (NSArray *)modificationsInSection:(NSUInteger)section; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMConstants.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMConstants.h deleted file mode 100644 index 0bc8db972..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMConstants.h +++ /dev/null @@ -1,156 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#define RLM_HEADER_AUDIT_BEGIN NS_HEADER_AUDIT_BEGIN -#define RLM_HEADER_AUDIT_END NS_HEADER_AUDIT_END - -#define RLM_SWIFT_SENDABLE NS_SWIFT_SENDABLE - -#define RLM_FINAL __attribute__((objc_subclassing_restricted)) - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -// Swift 5 considers NS_ENUM to be "open", meaning there could be values present -// other than the defined cases (which allows adding more cases later without -// it being a breaking change), while older versions consider it "closed". -#ifdef NS_CLOSED_ENUM -#define RLM_CLOSED_ENUM NS_CLOSED_ENUM -#else -#define RLM_CLOSED_ENUM NS_ENUM -#endif - -#if __has_attribute(ns_error_domain) && (!defined(__cplusplus) || !__cplusplus || __cplusplus >= 201103L) -#define RLM_ERROR_ENUM(type, name, domain) \ - _Pragma("clang diagnostic push") \ - _Pragma("clang diagnostic ignored \"-Wignored-attributes\"") \ - NS_ENUM(type, __attribute__((ns_error_domain(domain))) name) \ - _Pragma("clang diagnostic pop") -#else -#define RLM_ERROR_ENUM(type, name, domain) NS_ENUM(type, name) -#endif - -#define RLM_HIDDEN __attribute__((visibility("hidden"))) -#define RLM_VISIBLE __attribute__((visibility("default"))) -#define RLM_HIDDEN_BEGIN _Pragma("GCC visibility push(hidden)") -#define RLM_HIDDEN_END _Pragma("GCC visibility pop") -#define RLM_DIRECT __attribute__((objc_direct)) -#define RLM_DIRECT_MEMBERS __attribute__((objc_direct_members)) - -#pragma mark - Enums - -/** - `RLMPropertyType` is an enumeration describing all property types supported in Realm models. - - For more information, see [Realm Models](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/object-models-and-schemas/). - */ -typedef RLM_CLOSED_ENUM(int32_t, RLMPropertyType) { - -#pragma mark - Primitive types - /** Integers: `NSInteger`, `int`, `long`, `Int` (Swift) */ - RLMPropertyTypeInt = 0, - /** Booleans: `BOOL`, `bool`, `Bool` (Swift) */ - RLMPropertyTypeBool = 1, - /** Floating-point numbers: `float`, `Float` (Swift) */ - RLMPropertyTypeFloat = 5, - /** Double-precision floating-point numbers: `double`, `Double` (Swift) */ - RLMPropertyTypeDouble = 6, - /** NSUUID, UUID */ - RLMPropertyTypeUUID = 12, - -#pragma mark - Object types - - /** Strings: `NSString`, `String` (Swift) */ - RLMPropertyTypeString = 2, - /** Binary data: `NSData` */ - RLMPropertyTypeData = 3, - /** Any type: `id`, `AnyRealmValue` (Swift) */ - RLMPropertyTypeAny = 9, - /** Dates: `NSDate` */ - RLMPropertyTypeDate = 4, - -#pragma mark - Linked object types - - /** Realm model objects. See [Realm Models](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/object-models-and-schemas/) for more information. */ - RLMPropertyTypeObject = 7, - /** Realm linking objects. See [Realm Models](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/relationships/#inverse-relationship) for more information. */ - RLMPropertyTypeLinkingObjects = 8, - - RLMPropertyTypeObjectId = 10, - RLMPropertyTypeDecimal128 = 11 -}; - -#pragma mark - Notification Constants - -/** - A notification indicating that changes were made to a Realm. -*/ -typedef NSString * RLMNotification NS_EXTENSIBLE_STRING_ENUM; - -/** - This notification is posted when a write transaction has been committed to a Realm on a different thread for - the same file. - - It is not posted if `autorefresh` is enabled, or if the Realm is refreshed before the notification has a chance - to run. - - Realms with autorefresh disabled should normally install a handler for this notification which calls - `-[RLMRealm refresh]` after doing some work. Refreshing the Realm is optional, but not refreshing the Realm may lead to - large Realm files. This is because an extra copy of the data must be kept for the stale Realm. - */ -extern RLMNotification const RLMRealmRefreshRequiredNotification NS_SWIFT_NAME(RefreshRequired); - -/** - This notification is posted by a Realm when a write transaction has been - committed to a Realm on a different thread for the same file. - - It is not posted if `-[RLMRealm autorefresh]` is enabled, or if the Realm is - refreshed before the notification has a chance to run. - - Realms with autorefresh disabled should normally install a handler for this - notification which calls `-[RLMRealm refresh]` after doing some work. Refreshing - the Realm is optional, but not refreshing the Realm may lead to large Realm - files. This is because Realm must keep an extra copy of the data for the stale - Realm. - */ -extern RLMNotification const RLMRealmDidChangeNotification NS_SWIFT_NAME(DidChange); - -#pragma mark - Error keys - -/** Key to identify the associated backup Realm configuration in an error's `userInfo` dictionary */ -extern NSString * const RLMBackupRealmConfigurationErrorKey; - -#pragma mark - Other Constants - -/** The schema version used for uninitialized Realms */ -extern const uint64_t RLMNotVersioned; - -/** The corresponding value is the name of an exception thrown by Realm. */ -extern NSString * const RLMExceptionName; - -/** The corresponding value is a Realm file version. */ -extern NSString * const RLMRealmVersionKey; - -/** The corresponding key is the version of the underlying database engine. */ -extern NSString * const RLMRealmCoreVersionKey; - -/** The corresponding key is the Realm invalidated property name. */ -extern NSString * const RLMInvalidatedKey; - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMCredentials.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMCredentials.h deleted file mode 100644 index adff4e7e9..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMCredentials.h +++ /dev/null @@ -1,126 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) -@protocol RLMBSON; - -/// A token representing an identity provider's credentials. -typedef NSString *RLMCredentialsToken; - -/// A type representing the unique identifier of an Atlas App Services identity provider. -typedef NSString *RLMIdentityProvider NS_EXTENSIBLE_STRING_ENUM; - -/// The username/password identity provider. User accounts are handled by Atlas App Services directly without the -/// involvement of a third-party identity provider. -extern RLMIdentityProvider const RLMIdentityProviderUsernamePassword; - -/// A Facebook account as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderFacebook; - -/// A Google account as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderGoogle; - -/// An Apple account as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderApple; - -/// A JSON Web Token as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderJWT; - -/// An Anonymous account as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderAnonymous; - -/// An Realm Cloud function as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderFunction; - -/// A user api key as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderUserAPIKey; - -/// A server api key as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderServerAPIKey; - -/** - Opaque credentials representing a specific Realm App user. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMCredentials : NSObject - -/// The name of the identity provider which generated the credentials token. -@property (nonatomic, readonly) RLMIdentityProvider provider; - -/** - Construct and return credentials from a Facebook account token. - */ -+ (instancetype)credentialsWithFacebookToken:(RLMCredentialsToken)token; - -/** - Construct and return credentials from a Google account token. - */ -+ (instancetype)credentialsWithGoogleAuthCode:(RLMCredentialsToken)token; - -/** - Construct and return credentials from a Google id token. - */ -+ (instancetype)credentialsWithGoogleIdToken:(RLMCredentialsToken)token; - -/** - Construct and return credentials from an Apple account token. - */ -+ (instancetype)credentialsWithAppleToken:(RLMCredentialsToken)token; - -/** - Construct and return credentials for an Atlas App Services function using a mongodb document as a json payload. -*/ -+ (instancetype)credentialsWithFunctionPayload:(NSDictionary> *)payload; - -/** - Construct and return credentials from a user api key. -*/ -+ (instancetype)credentialsWithUserAPIKey:(NSString *)apiKey; - -/** - Construct and return credentials from a server api key. -*/ -+ (instancetype)credentialsWithServerAPIKey:(NSString *)apiKey; - -/** - Construct and return Atlas App Services credentials from an email and password. - */ -+ (instancetype)credentialsWithEmail:(NSString *)email - password:(NSString *)password; - -/** - Construct and return credentials from a JSON Web Token. - */ -+ (instancetype)credentialsWithJWT:(NSString *)token; - -/** - Construct and return anonymous credentials - */ -+ (instancetype)anonymousCredentials; - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("RLMAppCredentials cannot be created directly"))); - -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("RLMAppCredentials cannot be created directly"))); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMDecimal128.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMDecimal128.h deleted file mode 100644 index f6224bbf2..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMDecimal128.h +++ /dev/null @@ -1,110 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A 128-bit IEEE 754-2008 decimal floating point number. - - This type is similar to Swift's built-in Decimal type, but allocates bits - differently, resulting in a different representable range. (NS)Decimal stores a - significand of up to 38 digits long and an exponent from -128 to 127, while - this type stores up to 34 digits of significand and an exponent from -6143 to - 6144. - */ -RLM_SWIFT_SENDABLE // immutable -@interface RLMDecimal128 : NSObject -/// Creates a new zero-initialized decimal128. -- (instancetype)init; - -/// Converts the given value to a RLMDecimal128. -/// -/// The following types can be converted to RLMDecimal128: -/// - NSNumber -/// - NSString -/// - NSDecimalNumber -/// -/// Passing a value with a type not in this list is a fatal error. Passing a -/// string which cannot be parsed as a valid Decimal128 is a fatal error. -- (instancetype)initWithValue:(id)value; - -/// Converts the given number to a RLMDecimal128. -- (instancetype)initWithNumber:(NSNumber *)number; - -/// Parses the given string to a RLMDecimal128. -/// -/// Returns a decimal where `isNaN` is `YES` if the string cannot be parsed as a decimal. `error` is never set -/// and this will never actually return `nil`. -- (nullable instancetype)initWithString:(NSString *)string error:(NSError **)error; - -/// Converts the given number to a RLMDecimal128. -+ (instancetype)decimalWithNumber:(NSNumber *)number; - -/// The minimum value for RLMDecimal128. -@property (class, readonly, copy) RLMDecimal128 *minimumDecimalNumber NS_REFINED_FOR_SWIFT; - -/// The maximum value for RLMDecimal128. -@property (class, readonly, copy) RLMDecimal128 *maximumDecimalNumber NS_REFINED_FOR_SWIFT; - -/// Convert this value to a double. This is a lossy conversion. -@property (nonatomic, readonly) double doubleValue; - -/// Convert this value to a NSDecimal. This may be a lossy conversion. -@property (nonatomic, readonly) NSDecimal decimalValue; - -/// Convert this value to a string. -@property (nonatomic, readonly) NSString *stringValue; - -/// Gets if this Decimal128 represents a NaN value. -@property (nonatomic, readonly) BOOL isNaN; - -/// The magnitude of this RLMDecimal128. -@property (nonatomic, readonly) RLMDecimal128 *magnitude NS_REFINED_FOR_SWIFT; - -/// Replaces this RLMDecimal128 value with its additive inverse. -- (void)negate; - -/// Adds the right hand side to the current value and returns the result. -- (RLMDecimal128 *)decimalNumberByAdding:(RLMDecimal128 *)decimalNumber; - -/// Divides the right hand side to the current value and returns the result. -- (RLMDecimal128 *)decimalNumberByDividingBy:(RLMDecimal128 *)decimalNumber; - -/// Subtracts the right hand side to the current value and returns the result. -- (RLMDecimal128 *)decimalNumberBySubtracting:(RLMDecimal128 *)decimalNumber; - -/// Multiply the right hand side to the current value and returns the result. -- (RLMDecimal128 *)decimalNumberByMultiplyingBy:(RLMDecimal128 *)decimalNumber; - -/// Comparision operator to check if the right hand side is greater than the current value. -- (BOOL)isGreaterThan:(nullable RLMDecimal128 *)decimalNumber; - -/// Comparision operator to check if the right hand side is greater than or equal to the current value. -- (BOOL)isGreaterThanOrEqualTo:(nullable RLMDecimal128 *)decimalNumber; - -/// Comparision operator to check if the right hand side is less than the current value. -- (BOOL)isLessThan:(nullable RLMDecimal128 *)decimalNumber; - -/// Comparision operator to check if the right hand side is less than or equal to the current value. -- (BOOL)isLessThanOrEqualTo:(nullable RLMDecimal128 *)decimalNumber; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMDictionary.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMDictionary.h deleted file mode 100644 index 9c8cac538..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMDictionary.h +++ /dev/null @@ -1,559 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObject, RLMResults, RLMDictionaryChange; - -/** - `RLMDictionary` is a container type in Realm representing a dynamic collection of key-value pairs. - - Unlike `NSDictionary`, `RLMDictionary`s hold a single key and value type. - This is referred to in these docs as the “type” and “keyType” of the dictionary. - - When declaring an `RLMDictionary` property, the object type and keyType must be marked as conforming to a - protocol by the same name as the objects it should contain. - - RLM_COLLECTION_TYPE(ObjectType) - ... - @property RLMDictionary *objectTypeDictionary; - - `RLMDictionary`s can be queried with the same predicates as `RLMObject` and `RLMResult`s. - - `RLMDictionary`s cannot be created directly. `RLMDictionary` properties on `RLMObject`s are - lazily created when accessed, or can be obtained by querying a Realm. - - `RLMDictionary` only supports `NSString` as a key. Realm disallows the use of `.` or `$` characters within a dictionary key. - - ### Key-Value Observing - - `RLMDictionary` supports dictionary key-value observing on `RLMDictionary` properties on `RLMObject` - subclasses, and the `invalidated` property on `RLMDictionary` instances themselves is - key-value observing compliant when the `RLMDictionary` is attached to a managed - `RLMObject` (`RLMDictionary`s on unmanaged `RLMObject`s will never become invalidated). - */ -@interface RLMDictionary: NSObject - -#pragma mark - Properties - -/** - The number of entries in the dictionary. - */ -@property (nonatomic, readonly, assign) NSUInteger count; - -/** - The type of the objects in the dictionary. - */ -@property (nonatomic, readonly, assign) RLMPropertyType type; - -/** - The type of the key used in this dictionary. - */ -@property (nonatomic, readonly, assign) RLMPropertyType keyType; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readonly, getter = isOptional) BOOL optional; - -/** - The class name of the objects contained in the dictionary. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages the dictionary. Returns `nil` for unmanaged dictionary. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - Indicates if the dictionary can no longer be accessed. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if the dictionary is frozen. - - Frozen dictionaries are immutable and can be accessed from any thread. Frozen dictionaries - are created by calling `-freeze` on a managed live dictionary. Unmanaged dictionaries are - never frozen. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Accessing Objects from a Dictionary - -/** - Returns the value associated with a given key. - - @param key The name of the property. - - @discussion If key does not start with “@”, invokes object(forKey:). If key does start - with “@”, strips the “@” and invokes [super valueForKey:] with the rest of the key. - - @return A value associated with a given key or `nil`. - */ -- (nullable id)valueForKey:(nonnull RLMKeyType)key; - -/** - Returns an array containing the dictionary’s keys. - - @note The order of the elements in the array is not defined. - */ -@property(readonly, copy) NSArray *allKeys; - -/** - Returns an array containing the dictionary’s values. - - @note The order of the elements in the array is not defined. - */ -@property(readonly, copy) NSArray *allValues; - -/** - Returns the value associated with a given key. - - @note `nil` will be returned if no value is associated with a given key. NSNull will be returned - where null is associated with the key. - - @param key The key for which to return the corresponding value. - - @return The value associated with key. - */ -- (nullable RLMObjectType)objectForKey:(nonnull RLMKeyType)key; - -/** - Returns the value associated with a given key. - - @note `nil` will be returned if no value is associated with a given key. NSNull will be returned - where null is associated with the key. - - @param key The key for which to return the corresponding value. - - @return The value associated with key. - */ -- (nullable RLMObjectType)objectForKeyedSubscript:(RLMKeyType)key; - -/** - Applies a given block object to the each key-value pair of the dictionary. - - @param block A block object to operate on entries in the dictionary. - - @note If the block sets *stop to YES, the enumeration stops. - */ -- (void)enumerateKeysAndObjectsUsingBlock:(void (^)(RLMKeyType key, RLMObjectType obj, BOOL *stop))block; - -#pragma mark - Adding, Removing, and Replacing Objects in a Dictionary - -/** - Replace the contents of a dictionary with the contents of another dictionary - NSDictionary or RLMDictionary. - - This will remove all elements in this dictionary and then apply each element from the given dictionary. - - @warning This method may only be called during a write transaction. - @warning If otherDictionary is self this will result in an empty dictionary. - */ -- (void)setDictionary:(id)otherDictionary; - -/** - Removes all contents in the dictionary. - - @warning This method may only be called during a write transaction. - */ -- (void)removeAllObjects; - -/** - Removes from the dictionary entries specified by elements in a given array. If a given key does not - exist, no mutation will happen for that key. - - @warning This method may only be called during a write transaction. - */ -- (void)removeObjectsForKeys:(NSArray *)keyArray; - -/** - Removes a given key and its associated value from the dictionary. If the key does not exist the dictionary - will not be modified. - - @warning This method may only be called during a write transaction. - */ -- (void)removeObjectForKey:(RLMKeyType)key; - -/** - Adds a given key-value pair to the dictionary if the key is not present, or updates the value for the given key - if the key already present. - - @warning This method may only be called during a write transaction. - */ -- (void)setObject:(nullable RLMObjectType)obj forKeyedSubscript:(RLMKeyType)key; - -/** - Adds a given key-value pair to the dictionary if the key is not present, or updates the value for the given key - if the key already present. - - @warning This method may only be called during a write transaction. - */ -- (void)setObject:(nullable RLMObjectType)anObject forKey:(RLMKeyType)aKey; - -/** - Adds to the receiving dictionary the entries from another dictionary. - - @note If the receiving dictionary contains the same key(s) as the otherDictionary, then - the receiving dictionary will update each key-value pair for the matching key. - - @warning This method may only be called during a write transaction. - - @param otherDictionary An enumerable object such as `NSDictionary` or `RLMDictionary` which contains objects of the - same type as the receiving dictionary. - */ -- (void)addEntriesFromDictionary:(id )otherDictionary; - -#pragma mark - Querying a Dictionary - -/** - Returns all the values matching the given predicate in the dictionary. - - @note The keys in the dictionary are ignored when quering values, and they will not be returned in the `RLMResults`. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` of objects that match the given predicate. - */ -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all the values matching the given predicate in the dictionary. - - @note The keys in the dictionary are ignored when quering values, and they will not be returned in the `RLMResults`. - - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` of objects that match the given predicate - */ -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/** - Returns a sorted RLMResults of all values in the dictionary. - - @note The keys in the dictionary are ignored when sorting values, and they will not be returned in the `RLMResults`. - - @param keyPath The key path to sort by. - @param ascending The direction to sort in. - - @return An `RLMResults` sorted by the specified key path. - */- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a sorted RLMResults of all values in the dictionary. - - @note The keys in the dictionary are ignored when sorting values, and they will not be returned in the `RLMResults`. - - @param properties An array of `RLMSortDescriptor`s to sort by. - - @return An `RLMResults` sorted by the specified properties. - */ -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/** - Returns a distinct `RLMResults` from all values in the dictionary. - - @note The keys in the dictionary are ignored, and they will not be returned in the `RLMResults`. - - @param keyPaths The key paths to distinct on. - - @return An `RLMResults` with the distinct values of the keypath(s). - */ -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the values in the dictionary. - - NSNumber *min = [object.dictionaryProperty minOfProperty:@"age"]; - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, `NSDate`, `RLMValue` and `RLMDecimal128` are supported. - - @return The minimum value of the property, or `nil` if the dictionary is empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects in the dictionary. - - NSNumber *max = [object.dictionaryProperty maxOfProperty:@"age"]; - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, `NSDate`, `RLMValue` and `RLMDecimal128` are supported. - - @return The maximum value of the property, or `nil` if the dictionary is empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of distinct values of a given property over all the objects in the dictionary. - - NSNumber *sum = [object.dictionaryProperty sumOfProperty:@"age"]; - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, `RLMValue` and `RLMDecimal128` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects in the dictionary. - - NSNumber *average = [object.dictionaryProperty averageOfProperty:@"age"]; - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, `NSDate`, `RLMValue` and `RLMDecimal128` are supported. - - @return The average value of the given property, or `nil` if the dictionary is empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -#pragma mark - Notifications - -/** - Registers a block to be called each time the dictionary changes. - - The block will be asynchronously called with the initial dictionary, and then - called again after each write transaction which changes any of the keys or values - within the dictionary. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which keys in the dictionary were added, modified or deleted. If a write transaction - did not modify any keys or values in the dictionary, the block is not called at all. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - Person *person = [[Person allObjectsInRealm:realm] firstObject]; - NSLog(@"person.dogs.count: %zu", person.dogs.count); // => 0 - self.token = [person.dogs addNotificationBlock(RLMDictionary *dogs, - RLMDictionaryChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - person.dogs[@"frenchBulldog"] = dog; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a non-frozen managed dictionary. - - @param block The block to be called each time the dictionary changes. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMDictionary *_Nullable dictionary, - RLMDictionaryChange *_Nullable changes, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the dictionary changes. - - The block will be asynchronously called with the initial dictionary, and then - called again after each write transaction which changes any of the key-value in - the dictionary or which objects are in the results. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which keys in the dictionary were added or modified. If a write transaction - did not modify any objects in the dictionary, the block is not called at all. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMDictionary *_Nullable dictionary, - RLMDictionaryChange *_Nullable changes, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the dictionary changes. - - The block will be asynchronously called with the initial dictionary, and then - called again after each write transaction which changes any of the key-value in - the dictionary or which objects are in the results. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which keys in the dictionary were added or modified. If a write transaction - did not modify any objects in the dictionary, the block is not called at all. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMDictionary *_Nullable dictionary, - RLMDictionaryChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the dictionary changes. - - The block will be asynchronously called with the initial dictionary, and then - called again after each write transaction which changes any of the key-value in - the dictionary or which objects are in the results. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which keys in the dictionary were added or modified. If a write transaction - did not modify any objects in the dictionary, the block is not called at all. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMDictionary *_Nullable dictionary, - RLMDictionaryChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths -__attribute__((warn_unused_result)); - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of a dictionary. - - The frozen copy is an immutable dictionary which contains the same data as this - dictionary currently contains, but will not update when writes are made to the - containing Realm. Unlike live dictionaries, frozen dictionaries can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a managed dictionary. - @warning Holding onto a frozen dictionary for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -#pragma mark - Unavailable Methods -/** - `-[RLMDictionary init]` is not available because `RLMDictionary`s cannot be created directly. - `RLMDictionary` properties on `RLMObject`s are lazily created when accessed. - */ -- (instancetype)init __attribute__((unavailable("RLMDictionary cannot be created directly"))); -/** - `+[RLMDictionary new]` is not available because `RLMDictionary`s cannot be created directly. - `RLMDictionary` properties on `RLMObject`s are lazily created when accessed. - */ -+ (instancetype)new __attribute__((unavailable("RLMDictionary cannot be created directly"))); - -@end - -/** - A `RLMDictionaryChange` object encapsulates information about changes to dictionaries - that are reported by Realm notifications. - - `RLMDictionaryChange` is passed to the notification blocks registered with - `-addNotificationBlock` on `RLMDictionary`, and reports what keys in the - dictionary changed since the last time the notification block was called. - */ -@interface RLMDictionaryChange : NSObject -/// The keys in the new version of the dictionary which were newly inserted. -@property (nonatomic, readonly) NSArray *insertions; - -/// The keys in the new version of the dictionary which were modified. -@property (nonatomic, readonly) NSArray *modifications; - -/// The keys which were deleted from the old version. -@property (nonatomic, readonly) NSArray *deletions; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMEmailPasswordAuth.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMEmailPasswordAuth.h deleted file mode 100644 index 748eb26af..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMEmailPasswordAuth.h +++ /dev/null @@ -1,120 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@protocol RLMBSON; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// A block type used to report an error -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMEmailPasswordAuthOptionalErrorBlock)(NSError * _Nullable); - -/** - A client for the email/password authentication provider which - can be used to obtain a credential for logging in, - and to perform requests specifically related to the email/password provider. -*/ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMEmailPasswordAuth : RLMProviderClient - -/** - Registers a new email identity with the email/password provider, - and sends a confirmation email to the provided address. - - @param email The email address of the user to register. - @param password The password that the user created for the new email/password identity. - @param completionHandler A callback to be invoked once the call is complete. -*/ - -- (void)registerUserWithEmail:(NSString *)email - password:(NSString *)password - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler NS_SWIFT_NAME(registerUser(email:password:completion:)); - -/** - Confirms an email identity with the email/password provider. - - @param token The confirmation token that was emailed to the user. - @param tokenId The confirmation token id that was emailed to the user. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)confirmUser:(NSString *)token - tokenId:(NSString *)tokenId - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Re-sends a confirmation email to a user that has registered but - not yet confirmed their email address. - - @param email The email address of the user to re-send a confirmation for. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)resendConfirmationEmail:(NSString *)email - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Retries custom confirmation function for a given email address. - - @param email The email address of the user to retry custom confirmation logic. - @param completionHandler A callback to be invoked once the call is complete. - */ -- (void)retryCustomConfirmation:(NSString *)email - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Sends a password reset email to the given email address. - - @param email The email address of the user to send a password reset email for. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)sendResetPasswordEmail:(NSString *)email - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Resets the password of an email identity using the - password reset token emailed to a user. - - @param password The new password. - @param token The password reset token that was emailed to the user. - @param tokenId The password reset token id that was emailed to the user. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)resetPasswordTo:(NSString *)password - token:(NSString *)token - tokenId:(NSString *)tokenId - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Resets the password of an email identity using the - password reset function set up in the application. - - @param email The email address of the user. - @param password The desired new password. - @param args A list of arguments passed in as a BSON array. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)callResetPasswordFunction:(NSString *)email - password:(NSString *)password - args:(NSArray> *)args - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMEmbeddedObject.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMEmbeddedObject.h deleted file mode 100644 index 4db6248ca..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMEmbeddedObject.h +++ /dev/null @@ -1,367 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectSchema, RLMPropertyDescriptor, RLMRealm, RLMNotificationToken, RLMPropertyChange; -typedef void (^RLMObjectChangeBlock)(BOOL deleted, - NSArray *_Nullable changes, - NSError *_Nullable error); -/** - `RLMEmbeddedObject` is a base class used to define Realm model objects. - - Embedded objects work similarly to normal objects, but are owned by a single - parent Object (which itself may be embedded). Unlike normal top-level objects, - embedded objects cannot be directly created in or added to a Realm. Instead, - they can only be created as part of a parent object, or by assigning an - unmanaged object to a parent object's property. Embedded objects are - automatically deleted when the parent object is deleted or when the parent is - modified to no longer point at the embedded object, either by reassigning an - RLMObject property or by removing the embedded object from the array containing - it. - - Embedded objects can only ever have a single parent object which links to them, - and attempting to link to an existing managed embedded object will throw an - exception. - - The property types supported on `RLMEmbeddedObject` are the same as for - `RLMObject`, except for that embedded objects cannot link to top-level objects, - so `RLMObject` and `RLMArray` properties are not supported - (`RLMEmbeddedObject` and `RLMArray` *are*). - - Embedded objects cannot have primary keys or indexed properties. - */ - -@interface RLMEmbeddedObject : RLMObjectBase - -#pragma mark - Creating & Initializing Objects - -/** - Creates an unmanaged instance of a Realm object. - - Unmanaged embedded objects can be added to a Realm by assigning them to an - object property of a managed Realm object or by adding them to a managed - RLMArray. - */ -- (instancetype)init NS_DESIGNATED_INITIALIZER; - -/** - Creates an unmanaged instance of a Realm object. - - Pass in an `NSArray` or `NSDictionary` instance to set the values of the object's properties. - - Unmanaged embedded objects can be added to a Realm by assigning them to an - object property of a managed Realm object or by adding them to a managed - RLMArray. - */ -- (instancetype)initWithValue:(id)value; - -/** - Returns the class name for a Realm object subclass. - - @warning Do not override. Realm relies on this method returning the exact class - name. - - @return The class name for the model class. - */ -+ (NSString *)className; - -#pragma mark - Properties - -/** - The Realm which manages the object, or `nil` if the object is unmanaged. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - The object schema which lists the managed properties for the object. - */ -@property (nonatomic, readonly) RLMObjectSchema *objectSchema; - -/** - Indicates if the object can no longer be accessed because it is now invalid. - - An object can no longer be accessed if the object has been deleted from the Realm that manages it, or - if `invalidate` is called on that Realm. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if this object is frozen. - - @see `-[RLMEmbeddedObject freeze]` - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Customizing your Objects - -/** - Override this method to specify the default values to be used for each property. - - @return A dictionary mapping property names to their default values. - */ -+ (nullable NSDictionary *)defaultPropertyValues; - -/** - Override this method to specify the names of properties to ignore. These properties will not be managed by the Realm - that manages the object. - - @return An array of property names to ignore. - */ -+ (nullable NSArray *)ignoredProperties; - -/** - Override this method to specify the names of properties that are non-optional (i.e. cannot be assigned a `nil` value). - - By default, all properties of a type whose values can be set to `nil` are - considered optional properties. To require that an object in a Realm always - store a non-`nil` value for a property, add the name of the property to the - array returned from this method. - - Properties of `RLMEmbeddedObject` type cannot be non-optional. Array and - `NSNumber` properties can be non-optional, but there is no reason to do so: - arrays do not support storing nil, and if you want a non-optional number you - should instead use the primitive type. - - @return An array of property names that are required. - */ -+ (NSArray *)requiredProperties; - -/** - Override this method to provide information related to properties containing linking objects. - - Each property of type `RLMLinkingObjects` must have a key in the dictionary returned by this method consisting - of the property name. The corresponding value must be an instance of `RLMPropertyDescriptor` that describes the class - and property that the property is linked to. - - return @{ @"owners": [RLMPropertyDescriptor descriptorWithClass:Owner.class propertyName:@"dogs"] }; - - @return A dictionary mapping property names to `RLMPropertyDescriptor` instances. - */ -+ (NSDictionary *)linkingObjectsProperties; - -#pragma mark - Notifications - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in differen - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When notifications - can't be delivered instantly, multiple notifications may be coalesced into a - single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - - @param block The block to be called whenever a change occurs. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block queue:(dispatch_queue_t)queue; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block keyPaths:(NSArray *)keyPaths queue:(dispatch_queue_t)queue; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block keyPaths:(NSArray *)keyPaths; - -#pragma mark - Other Instance Methods - -/** - Returns YES if another Realm object instance points to the same object as the - receiver in the Realm managing the receiver. - - For frozen objects and object types with a primary key, `isEqual:` is - overridden to use the same logic as this method (along with a corresponding - implementation for `hash`). Non-frozen objects without primary keys use - pointer identity for `isEqual:` and `hash`. - - @param object The object to compare the receiver to. - - @return Whether the object represents the same object as the receiver. - */ -- (BOOL)isEqualToObject:(RLMEmbeddedObject *)object; - -/** - Returns a frozen (immutable) snapshot of this object. - - The frozen copy is an immutable object which contains the same data as this - object currently contains, but will not update when writes are made to the - containing Realm. Unlike live objects, frozen objects can be accessed from any - thread. - - - warning: Holding onto a frozen object for an extended period while performing write - transaction on the Realm may result in the Realm file growing to large sizes. See - `Realm.Configuration.maximumNumberOfActiveVersions` for more information. - - warning: This method can only be called on a managed object. - */ -- (instancetype)freeze NS_RETURNS_RETAINED; - -/** - Returns a live (mutable) reference of this object. - - This method creates a managed accessor to a live copy of the same frozen object. - Will return self if called on an already live object. - */ -- (instancetype)thaw; - -#pragma mark - Dynamic Accessors - -/// :nodoc: -- (nullable id)objectForKeyedSubscript:(NSString *)key; - -/// :nodoc: -- (void)setObject:(nullable id)obj forKeyedSubscript:(NSString *)key; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMError.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMError.h deleted file mode 100644 index 514ceee3f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMError.h +++ /dev/null @@ -1,442 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2022 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@protocol RLMValue; - -#pragma mark - Error Domains - -/** Error code is a value from the RLMError enum. */ -extern NSString *const RLMErrorDomain; - -/** An error domain identifying non-specific system errors. */ -extern NSString *const RLMUnknownSystemErrorDomain; - -/** - The error domain string for all SDK errors related to errors reported - by the synchronization manager error handler, as well as general sync - errors that don't fall into any of the other categories. - */ -extern NSString *const RLMSyncErrorDomain; - -/** - The error domain string for all SDK errors related to the authentication - endpoint. - */ -extern NSString *const RLMSyncAuthErrorDomain; - -/** -The error domain string for all SDK errors related to the Atlas App Services -endpoint. -*/ -extern NSString *const RLMAppErrorDomain; - -#pragma mark - RLMError - -/// A user info key containing the error code. This is provided for backwards -/// compatibility only and should not be used. -extern NSString *const RLMErrorCodeKey __attribute((deprecated("use -[NSError code]"))); - -/// A user info key containing the name of the error code. This is for -/// debugging purposes only and should not be relied on. -extern NSString *const RLMErrorCodeNameKey; - -/// A user info key present in sync errors which originate from the server, -/// containing the URL of the server-side logs associated with the error. -extern NSString * const RLMServerLogURLKey; - -/// A user info key containing a HTTP status code. Some ``RLMAppError`` codes -/// include this, most notably ``RLMAppErrorHttpRequestFailed``. -extern NSString * const RLMHTTPStatusCodeKey; - -/// A user info key containing a `RLMCompensatingWriteInfo` which includes -/// further details about what was reverted by the server. -extern NSString *const RLMCompensatingWriteInfoKey; - -/** - `RLMError` is an enumeration representing all recoverable errors. It is - associated with the Realm error domain specified in `RLMErrorDomain`. - */ -typedef RLM_ERROR_ENUM(NSInteger, RLMError, RLMErrorDomain) { - /** Denotes a general error that occurred when trying to open a Realm. */ - RLMErrorFail = 1, - - /** Denotes a file I/O error that occurred when trying to open a Realm. */ - RLMErrorFileAccess = 2, - - /** - Denotes a file permission error that occurred when trying to open a Realm. - - This error can occur if the user does not have permission to open or create - the specified file in the specified access mode when opening a Realm. - */ - RLMErrorFilePermissionDenied = 3, - - /** - Denotes an error where a file was to be written to disk, but another - file with the same name already exists. - */ - RLMErrorFileExists = 4, - - /** - Denotes an error that occurs if a file could not be found. - - This error may occur if a Realm file could not be found on disk when - trying to open a Realm as read-only, or if the directory part of the - specified path was not found when trying to write a copy. - */ - RLMErrorFileNotFound = 5, - - /** - Denotes an error that occurs if a file format upgrade is required to open - the file, but upgrades were explicitly disabled or the file is being open - in read-only mode. - */ - RLMErrorFileFormatUpgradeRequired = 6, - - /** - Denotes an error that occurs if the database file is currently open in - another process which cannot share with the current process due to an - architecture mismatch. - - This error may occur if trying to share a Realm file between an i386 - (32-bit) iOS Simulator and the Realm Studio application. In this case, - please use the 64-bit version of the iOS Simulator. - */ - RLMErrorIncompatibleLockFile = 8, - - /** - Denotes an error that occurs when there is insufficient available address - space to mmap the Realm file. - */ - RLMErrorAddressSpaceExhausted = 9, - - /** - Denotes an error that occurs if there is a schema version mismatch and a - migration is required. - */ - RLMErrorSchemaMismatch = 10, - - /** - Denotes an error where an operation was requested which cannot be - performed on an open file. - */ - RLMErrorAlreadyOpen = 12, - - /// Denotes an error where an input value was invalid. - RLMErrorInvalidInput = 13, - - /// Denotes an error where a write failed due to insufficient disk space. - RLMErrorOutOfDiskSpace = 14, - - /** - Denotes an error where a Realm file could not be opened because another - process has opened the same file in a way incompatible with inter-process - sharing. For example, this can result from opening the backing file for an - in-memory Realm in non-in-memory mode. - */ - RLMErrorIncompatibleSession = 15, - - /** - Denotes an error that occurs if the file is a valid Realm file, but has a - file format version which is not supported by this version of Realm. This - typically means that the file was written by a newer version of Realm, but - may also mean that it is from a pre-1.0 version of Realm (or for - synchronized files, pre-10.0). - */ - RLMErrorUnsupportedFileFormatVersion = 16, - - /** - Denotes an error that occurs if a synchronized Realm is opened in more - than one process at once. - */ - RLMErrorMultipleSyncAgents = 17, - - /// A subscription was rejected by the server. - RLMErrorSubscriptionFailed = 18, - - /// A file operation failed in a way which does not have a more specific error code. - RLMErrorFileOperationFailed = 19, - - /** - Denotes an error that occurs if the file being opened is not a valid Realm - file. Some of the possible causes of this are: - 1. The file at the given URL simply isn't a Realm file at all. - 2. The wrong encryption key was given. - 3. The Realm file is encrypted and no encryption key was given. - 4. The Realm file isn't encrypted but an encryption key was given. - 5. The file on disk has become corrupted. - */ - RLMErrorInvalidDatabase = 20, - - /** - Denotes an error that occurs if a Realm is opened in the wrong history - mode. Typically this means that either a local Realm is being opened as a - synchronized Realm or vice versa. - */ - RLMErrorIncompatibleHistories = 21, - - /** - Denotes an error that occurs if objects were written to a flexible sync - Realm without any active subscriptions for that object type. All objects - created in flexible sync Realms must match at least one active - subscription or the server will reject the write. - */ - RLMErrorNoSubscriptionForWrite = 22, -}; - -#pragma mark - RLMSyncError - -/// A user info key for use with `RLMSyncErrorClientResetError`. -extern NSString *const kRLMSyncPathOfRealmBackupCopyKey; - -/// A user info key for use with certain error types. -extern NSString *const kRLMSyncErrorActionTokenKey; - -/** - An error related to a problem that might be reported by the synchronization manager - error handler, or a callback on a sync-related API that performs asynchronous work. - */ -typedef RLM_ERROR_ENUM(NSInteger, RLMSyncError, RLMSyncErrorDomain) { - /// An error that indicates a problem with the session (a specific Realm opened for sync). - RLMSyncErrorClientSessionError = 4, - - /// An error that indicates a problem with a specific user. - RLMSyncErrorClientUserError = 5, - - /** - An error that indicates an internal, unrecoverable problem - with the underlying synchronization engine. - */ - RLMSyncErrorClientInternalError = 6, - - /** - An error that indicates the Realm needs to be reset. - - A synced Realm may need to be reset because Atlas App Services encountered an - error and had to be restored from a backup. If the backup copy of the remote Realm - is of an earlier version than the local copy of the Realm, the server will ask the - client to reset the Realm. - - The reset process is as follows: the local copy of the Realm is copied into a recovery - directory for safekeeping, and then deleted from the original location. The next time - the Realm for that partition value is opened, the Realm will automatically be re-downloaded from - Atlas App Services, and can be used as normal. - - Data written to the Realm after the local copy of the Realm diverged from the backup - remote copy will be present in the local recovery copy of the Realm file. The - re-downloaded Realm will initially contain only the data present at the time the Realm - was backed up on the server. - - The client reset process can be initiated in one of two ways. - - The `userInfo` dictionary contains an opaque token object under the key - `kRLMSyncErrorActionTokenKey`. This token can be passed into - `+[RLMSyncSession immediatelyHandleError:]` in order to immediately perform the client - reset process. This should only be done after your app closes and invalidates every - instance of the offending Realm on all threads (note that autorelease pools may make this - difficult to guarantee). - - If `+[RLMSyncSession immediatelyHandleError:]` is not called, the client reset process - will be automatically carried out the next time the app is launched and the - `RLMSyncManager` is accessed. - - The value for the `kRLMSyncPathOfRealmBackupCopyKey` key in the `userInfo` dictionary - describes the path of the recovered copy of the Realm. This copy will not actually be - created until the client reset process is initiated. - - @see `-[NSError rlmSync_errorActionToken]`, `-[NSError rlmSync_clientResetBackedUpRealmPath]` - */ - RLMSyncErrorClientResetError = 7, - - /// :nodoc: - RLMSyncErrorUnderlyingAuthError = 8, - - /** - An error that indicates the user does not have permission to perform an operation - upon a synced Realm. For example, a user may receive this error if they attempt to - open a Realm they do not have at least read access to, or write to a Realm they only - have read access to. - - This error may also occur if a user incorrectly opens a Realm they have read-only - permissions to without using the `asyncOpen()` APIs. - - A Realm that suffers a permission denied error is, by default, flagged so that its - local copy will be deleted the next time the application starts. - - The `userInfo` dictionary contains an opaque token object under the key - `kRLMSyncErrorActionTokenKey`. This token can be passed into - `+[RLMSyncSession immediatelyHandleError:]` in order to immediately delete the local - copy. This should only be done after your app closes and invalidates every instance - of the offending Realm on all threads (note that autorelease pools may make this - difficult to guarantee). - - @warning It is strongly recommended that, if a Realm has encountered a permission denied - error, its files be deleted before attempting to re-open it. - - @see `-[NSError rlmSync_errorActionToken]` - */ - RLMSyncErrorPermissionDeniedError = 9, - - /** - An error that indicates that the server has rejected the requested flexible sync subscriptions. - */ - RLMSyncErrorInvalidFlexibleSyncSubscriptions = 10, - - /** - An error that indicates that the server has reverted a write made by this - client. This can happen due to not having write permission, or because an - object was created in a flexible sync Realm which does not match any - active subscriptions. - - This error is informational and does not require any explicit handling. - */ - RLMSyncErrorWriteRejected = 11, - - /** - A connection error without a more specific error code occurred. - - Realm internally handles retrying connections with appropriate backoffs, - so connection errors are normally logged and not reported to the error - handler. The exception is if - ``RLMSyncConfiguration.cancelAsyncOpenOnNonFatalErrors`` is set to `true`, - in which case async opens will be canceled on connection failures and the - error will be reported to the completion handler. - - Note that connection timeouts are reported as - (errorDomain: NSPosixErrorDomain, error: ETIMEDOUT) - and not as one of these error codes. - */ - RLMSyncErrorConnectionFailed = 12, - - /** - Connecting to the server failed due to a TLS issue such as an invalid certificate. - */ - RLMSyncErrorTLSHandshakeFailed = 13, -}; - -#pragma mark - RLMSyncAuthError - -// NEXT-MAJOR: This was a ROS thing and should have been removed in v10 -/// :nodoc: -typedef RLM_ERROR_ENUM(NSInteger, RLMSyncAuthError, RLMSyncAuthErrorDomain) { - RLMSyncAuthErrorBadResponse = 1, - RLMSyncAuthErrorBadRemoteRealmPath = 2, - RLMSyncAuthErrorHTTPStatusCodeError = 3, - RLMSyncAuthErrorClientSessionError = 4, - RLMSyncAuthErrorInvalidParameters = 601, - RLMSyncAuthErrorMissingPath = 602, - RLMSyncAuthErrorInvalidCredential = 611, - RLMSyncAuthErrorUserDoesNotExist = 612, - RLMSyncAuthErrorUserAlreadyExists = 613, - RLMSyncAuthErrorAccessDeniedOrInvalidPath = 614, - RLMSyncAuthErrorInvalidAccessToken = 615, - RLMSyncAuthErrorFileCannotBeShared = 703, -} __attribute__((deprecated("Errors of this type are no longer reported"))); - -#pragma mark - RLMSyncAppError - -/// An error which occurred when making a request to Atlas App Services. -typedef RLM_ERROR_ENUM(NSInteger, RLMAppError, RLMAppErrorDomain) { - /// An unknown error has occurred - RLMAppErrorUnknown = -1, - - /// A HTTP request completed with an error status code. The failing status - /// code can be found in the ``RLMHTTPStatusCodeKey`` key of the userInfo - /// dictionary. - RLMAppErrorHttpRequestFailed = 1, - - /// A user's session is in an invalid state. Logging out and back in may rectify this. - RLMAppErrorInvalidSession, - /// A request sent to the server was malformed in some way. - RLMAppErrorBadRequest, - /// A request was made using a nonexistent user. - RLMAppErrorUserNotFound, - /// A request was made against an App using a User which does not belong to that App. - RLMAppErrorUserAppDomainMismatch, - /// The auth provider has limited the domain names which can be used for email addresses, and the given one is not allowed. - RLMAppErrorDomainNotAllowed, - /// The request body size exceeded a server-configured limit. - RLMAppErrorReadSizeLimitExceeded, - /// A request had an invalid parameter. - RLMAppErrorInvalidParameter, - /// A request was missing a required parameter. - RLMAppErrorMissingParameter, - /// Executing the requested server function failed with an error. - RLMAppErrorFunctionExecutionError, - /// The server encountered an internal error. - RLMAppErrorInternalServerError, - /// Authentication failed due to the request auth provider not existing. - RLMAppErrorAuthProviderNotFound, - /// The requested value does not exist. - RLMAppErrorValueNotFound, - /// The value being created already exists. - RLMAppErrorValueAlreadyExists, - /// A value with the same name as the value being created already exists. - RLMAppErrorValueDuplicateName, - /// The called server function does not exist. - RLMAppErrorFunctionNotFound, - /// The called server function has a syntax error. - RLMAppErrorFunctionSyntaxError, - /// The called server function is invalid in some way. - RLMAppErrorFunctionInvalid, - /// Registering an API key with the auth provider failed due to it already existing. - RLMAppErrorAPIKeyAlreadyExists, - /// The operation failed due to exceeding the server-configured time limit. - RLMAppErrorExecutionTimeLimitExceeded, - /// The body of the called function does not define a callable thing. - RLMAppErrorNotCallable, - /// Email confirmation failed for a user because the user has already confirmed their email. - RLMAppErrorUserAlreadyConfirmed, - /// The user cannot be used because it has been disabled. - RLMAppErrorUserDisabled, - /// An auth error occurred which does not have a more specific error code. - RLMAppErrorAuthError, - /// Account registration failed due to the user name already being taken. - RLMAppErrorAccountNameInUse, - /// A login request failed due to an invalid password. - RLMAppErrorInvalidPassword, - /// Operation failed due to server-side maintenance. - RLMAppErrorMaintenanceInProgress, - /// Operation failed due to an error reported by MongoDB. - RLMAppErrorMongoDBError, -}; - -/// Extended information about a write which was rejected by the server. -/// -/// The server will sometimes reject writes made by the client for reasons such -/// as permissions, additional server-side validation failing, or because the -/// object didn't match any flexible sync subscriptions. When this happens, a -/// ``RLMSyncErrorWriteRejected`` error is reported which contains an array of -/// `RLMCompensatingWriteInfo` objects in the ``RLMCompensatingWriteInfoKey`` -/// userInfo key with information about what writes were rejected and why. -/// -/// This information is intended for debugging and logging purposes only. The -/// `reason` strings are generated by the server and are not guaranteed to be -/// stable, so attempting to programmatically do anything with them will break -/// without warning. -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMCompensatingWriteInfo : NSObject -/// The class name of the object being written to. -@property (nonatomic, readonly) NSString *objectType; -/// The primary key of the object being written to. -@property (nonatomic, readonly) id primaryKey NS_REFINED_FOR_SWIFT; -/// A human-readable string describing why the write was rejected. -@property (nonatomic, readonly) NSString *reason; -@end diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMFindOneAndModifyOptions.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMFindOneAndModifyOptions.h deleted file mode 100644 index 3cce99f23..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMFindOneAndModifyOptions.h +++ /dev/null @@ -1,80 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) -@protocol RLMBSON; -@class RLMSortDescriptor; - -/// Options to use when executing a `findOneAndUpdate`, `findOneAndReplace`, -/// or `findOneAndDelete` command on a `RLMMongoCollection`. -@interface RLMFindOneAndModifyOptions : NSObject - -/// Limits the fields to return for all matching documents. -@property (nonatomic, nullable) id projection NS_REFINED_FOR_SWIFT; - -/// The order in which to return matching documents. -@property (nonatomic, nullable) id sort NS_REFINED_FOR_SWIFT -__attribute__((deprecated("Use `sorting` instead, which correctly sort more than one sort attribute", "sorting"))); - -/// The order in which to return matching documents. -@property (nonatomic) NSArray> *sorting NS_REFINED_FOR_SWIFT; - - -/// Whether or not to perform an upsert, default is false -/// (only available for find_one_and_replace and find_one_and_update) -@property (nonatomic) BOOL upsert; - -/// When true then the new document is returned, -/// Otherwise the old document is returned (default) -/// (only available for findOneAndReplace and findOneAndUpdate) -@property (nonatomic) BOOL shouldReturnNewDocument; - -/// Options to use when executing a `findOneAndUpdate`, `findOneAndReplace`, -/// or `findOneAndDelete` command on a `RLMMongoCollection`. -/// @param projection Limits the fields to return for all matching documents. -/// @param sort The order in which to return matching documents. -/// @param upsert Whether or not to perform an upsert, default is false -/// (only available for findOneAndReplace and findOneAndUpdate) -/// @param shouldReturnNewDocument When true then the new document is returned, -/// Otherwise the old document is returned (default), -/// (only available for findOneAndReplace and findOneAndUpdate) -- (instancetype)initWithProjection:(id _Nullable)projection - sort:(id _Nullable)sort - upsert:(BOOL)upsert - shouldReturnNewDocument:(BOOL)shouldReturnNewDocument -__attribute__((deprecated("Please use `initWithProjection:sorting:upsert:shouldReturnNewDocument:`"))) - NS_SWIFT_UNAVAILABLE("Please see FindOneAndModifyOptions"); - -/// Options to use when executing a `findOneAndUpdate`, `findOneAndReplace`, -/// or `findOneAndDelete` command on a `RLMMongoCollection`. -/// @param projection Limits the fields to return for all matching documents. -/// @param sorting The order in which to return matching documents. -/// @param upsert Whether or not to perform an upsert, default is false -/// (only available for findOneAndReplace and findOneAndUpdate) -/// @param shouldReturnNewDocument When true then the new document is returned, -/// Otherwise the old document is returned (default), -/// (only available for findOneAndReplace and findOneAndUpdate) -- (instancetype)initWithProjection:(id _Nullable)projection - sorting:(NSArray> *)sorting - upsert:(BOOL)upsert - shouldReturnNewDocument:(BOOL)shouldReturnNewDocument; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMFindOptions.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMFindOptions.h deleted file mode 100644 index 043a85374..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMFindOptions.h +++ /dev/null @@ -1,77 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@protocol RLMBSON; - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -@interface RLMFindOptions : NSObject - -/// The maximum number of documents to return. Specifying 0 will return all documents. -@property (nonatomic) NSInteger limit; - -/// Limits the fields to return for all matching documents. -@property (nonatomic, nullable) id projection NS_REFINED_FOR_SWIFT; - -/// The order in which to return matching documents. -@property (nonatomic, nullable) id sort NS_REFINED_FOR_SWIFT -__attribute__((deprecated("Use `sorting` instead, which correctly sort more than one sort attribute", "sorting"))); - -/// The order in which to return matching documents. -@property (nonatomic) NSArray> *sorting NS_REFINED_FOR_SWIFT; - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -/// @param limit The maximum number of documents to return. Specifying 0 will return all documents. -/// @param projection Limits the fields to return for all matching documents. -/// @param sort The order in which to return matching documents. -- (instancetype)initWithLimit:(NSInteger)limit - projection:(id _Nullable)projection - sort:(id _Nullable)sort -__attribute__((deprecated("Please use `initWithLimit:projection:sorting:`"))) - NS_SWIFT_UNAVAILABLE("Please see FindOption"); - - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -/// @param projection Limits the fields to return for all matching documents. -/// @param sort The order in which to return matching documents. -- (instancetype)initWithProjection:(id _Nullable)projection - sort:(id _Nullable)sort __deprecated -__attribute__((deprecated("Please use `initWithProjection:sorting:`"))) - NS_SWIFT_UNAVAILABLE("Please see FindOption"); - - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -/// @param limit The maximum number of documents to return. Specifying 0 will return all documents. -/// @param projection Limits the fields to return for all matching documents. -/// @param sorting The order in which to return matching documents. -- (instancetype)initWithLimit:(NSInteger)limit - projection:(id _Nullable)projection - sorting:(NSArray> *)sorting; - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -/// @param projection Limits the fields to return for all matching documents. -/// @param sorting The order in which to return matching documents. -- (instancetype)initWithProjection:(id _Nullable)projection - sorting:(NSArray> *)sorting; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMLogger.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMLogger.h deleted file mode 100644 index 96ab91967..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMLogger.h +++ /dev/null @@ -1,99 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -/// An enum representing different levels of sync-related logging that can be configured. -typedef RLM_CLOSED_ENUM(NSUInteger, RLMLogLevel) { - /// Nothing will ever be logged. - RLMLogLevelOff, - /// Only fatal errors will be logged. - RLMLogLevelFatal, - /// Only errors will be logged. - RLMLogLevelError, - /// Warnings and errors will be logged. - RLMLogLevelWarn, - /// Information about sync events will be logged. Fewer events will be logged in order to avoid overhead. - RLMLogLevelInfo, - /// Information about sync events will be logged. More events will be logged than with `RLMLogLevelInfo`. - RLMLogLevelDetail, - /// Log information that can aid in debugging. - /// - /// - warning: Will incur a measurable performance impact. - RLMLogLevelDebug, - /// Log information that can aid in debugging. More events will be logged than with `RLMLogLevelDebug`. - /// - /// - warning: Will incur a measurable performance impact. - RLMLogLevelTrace, - /// Log information that can aid in debugging. More events will be logged than with `RLMLogLevelTrace`. - /// - /// - warning: Will incur a measurable performance impact. - RLMLogLevelAll -} NS_SWIFT_NAME(LogLevel); - -/// A log callback function which can be set on RLMLogger. -/// -/// The log function may be called from multiple threads simultaneously, and is -/// responsible for performing its own synchronization if any is required. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void (^RLMLogFunction)(RLMLogLevel level, NSString *message); - -/** - `RLMLogger` is used for creating your own custom logging logic. - - You can define your own logger creating an instance of `RLMLogger` and define the log function which will be - invoked whenever there is a log message. - Set this custom logger as you default logger using `setDefaultLogger`. - - RLMLogger.defaultLogger = [[RLMLogger alloc] initWithLevel:RLMLogLevelDebug - logFunction:^(RLMLogLevel level, NSString * message) { - NSLog(@"Realm Log - %lu, %@", (unsigned long)level, message); - }]; - - @note By default default log threshold level is `RLMLogLevelInfo`, and logging strings are output to Apple System Logger. -*/ -@interface RLMLogger : NSObject - -/** - Gets the logging threshold level used by the logger. - */ -@property (nonatomic) RLMLogLevel level; - -/// :nodoc: -- (instancetype)init NS_UNAVAILABLE; - -/** - Creates a logger with the associated log level and the logic function to define your own logging logic. - - @param level The log level to be set for the logger. - @param logFunction The log function which will be invoked whenever there is a log message. -*/ -- (instancetype)initWithLevel:(RLMLogLevel)level logFunction:(RLMLogFunction)logFunction; - -#pragma mark RLMLogger Default Logger API - -/** - The current default logger. When setting a logger as default, this logger will be used whenever information must be logged. - */ -@property (class) RLMLogger *defaultLogger NS_SWIFT_NAME(shared); - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMMigration.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMMigration.h deleted file mode 100644 index 4a6652a19..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMMigration.h +++ /dev/null @@ -1,129 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMSchema; -@class RLMArray; -@class RLMObject; - -/** - A block type which provides both the old and new versions of an object in the Realm. Object - properties can only be accessed using keyed subscripting. - - @see `-[RLMMigration enumerateObjects:block:]` - - @param oldObject The object from the original Realm (read-only). - @param newObject The object from the migrated Realm (read-write). -*/ -typedef void (^RLMObjectMigrationBlock)(RLMObject * __nullable oldObject, RLMObject * __nullable newObject); - -/** - `RLMMigration` instances encapsulate information intended to facilitate a schema migration. - - A `RLMMigration` instance is passed into a user-defined `RLMMigrationBlock` block when updating - the version of a Realm. This instance provides access to the old and new database schemas, the - objects in the Realm, and provides functionality for modifying the Realm during the migration. - */ -@interface RLMMigration : NSObject - -#pragma mark - Properties - -/** - Returns the old `RLMSchema`. This is the schema which describes the Realm before the - migration is applied. - */ -@property (nonatomic, readonly) RLMSchema *oldSchema NS_REFINED_FOR_SWIFT; - -/** - Returns the new `RLMSchema`. This is the schema which describes the Realm after the - migration is applied. - */ -@property (nonatomic, readonly) RLMSchema *newSchema NS_REFINED_FOR_SWIFT; - - -#pragma mark - Altering Objects during a Migration - -/** - Enumerates all the objects of a given type in the Realm, providing both the old and new versions - of each object. Within the block, object properties can only be accessed using keyed subscripting. - - @param className The name of the `RLMObject` class to enumerate. - - @warning All objects returned are of a type specific to the current migration and should not be cast - to `className`. Instead, treat them as `RLMObject`s and use keyed subscripting to access - properties. - */ -- (void)enumerateObjects:(NSString *)className - block:(__attribute__((noescape)) RLMObjectMigrationBlock)block NS_REFINED_FOR_SWIFT; - -/** - Creates and returns an `RLMObject` instance of type `className` in the Realm being migrated. - - The `value` argument is used to populate the object. It can be a key-value coding compliant object, an array or - dictionary returned from the methods in `NSJSONSerialization`, or an array containing one element for each managed - property. An exception will be thrown if any required properties are not present and those properties were not defined - with default values. - - When passing in an `NSArray` as the `value` argument, all properties must be present, valid and in the same order as - the properties defined in the model. - - @param className The name of the `RLMObject` class to create. - @param value The value used to populate the object. - */ -- (RLMObject *)createObject:(NSString *)className withValue:(id)value NS_REFINED_FOR_SWIFT; - -/** - Deletes an object from a Realm during a migration. - - It is permitted to call this method from within the block passed to `-[enumerateObjects:block:]`. - - @param object Object to be deleted from the Realm being migrated. - */ -- (void)deleteObject:(RLMObject *)object NS_REFINED_FOR_SWIFT; - -/** - Deletes the data for the class with the given name. - - All objects of the given class will be deleted. If the `RLMObject` subclass no longer exists in your program, - any remaining metadata for the class will be removed from the Realm file. - - @param name The name of the `RLMObject` class to delete. - - @return A Boolean value indicating whether there was any data to delete. - */ -- (BOOL)deleteDataForClassName:(NSString *)name NS_REFINED_FOR_SWIFT; - -/** - Renames a property of the given class from `oldName` to `newName`. - - @param className The name of the class whose property should be renamed. This class must be present - in both the old and new Realm schemas. - @param oldName The old persisted property name for the property to be renamed. There must not be a property with this name in the - class as defined by the new Realm schema. - @param newName The new persisted property name for the property to be renamed. There must not be a property with this name in the - class as defined by the old Realm schema. - */ -- (void)renamePropertyForClass:(NSString *)className oldName:(NSString *)oldName - newName:(NSString *)newName NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMMongoClient.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMMongoClient.h deleted file mode 100644 index 50a1c226d..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMMongoClient.h +++ /dev/null @@ -1,47 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMApp; - -/// The `RLMMongoClient` enables reading and writing on a MongoDB database via the Realm Cloud service. -/// -/// It provides access to instances of `RLMMongoDatabase`, which in turn provide access to specific -/// `RLMMongoCollection`s that hold your data. -/// -/// - Note: -/// Before you can read or write data, a user must log in. -/// -/// - SeeAlso: -/// `RLMApp`, `RLMMongoDatabase`, `RLMMongoCollection` -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMMongoClient : NSObject - -/// The name of the client -@property (nonatomic, readonly) NSString *name; - -/// Gets a `RLMMongoDatabase` instance for the given database name. -/// @param name the name of the database to retrieve -- (RLMMongoDatabase *)databaseWithName:(NSString *)name NS_SWIFT_NAME(database(named:)); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMMongoCollection.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMMongoCollection.h deleted file mode 100644 index 0feae60ac..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMMongoCollection.h +++ /dev/null @@ -1,330 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) -@protocol RLMBSON; - -@class RLMFindOptions, RLMFindOneAndModifyOptions, RLMUpdateResult, RLMChangeStream, RLMObjectId; - -/// Delegate which is used for subscribing to changes on a `[RLMMongoCollection watch]` stream. -@protocol RLMChangeEventDelegate -/// The stream was opened. -/// @param changeStream The RLMChangeStream subscribing to the stream changes. -- (void)changeStreamDidOpen:(RLMChangeStream *)changeStream; -/// The stream has been closed. -/// @param error If an error occured when closing the stream, an error will be passed. -- (void)changeStreamDidCloseWithError:(nullable NSError *)error; -/// A error has occured while streaming. -/// @param error The streaming error. -- (void)changeStreamDidReceiveError:(NSError *)error; -/// Invoked when a change event has been received. -/// @param changeEvent The change event in BSON format. -- (void)changeStreamDidReceiveChangeEvent:(id)changeEvent; -@end - -/// Acts as a middleman and processes events with WatchStream -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMChangeStream : NSObject -/// Stops a watch streaming session. -- (void)close; -/// :nodoc: -- (instancetype)init NS_UNAVAILABLE; -@end - -/// The `RLMMongoCollection` represents a MongoDB collection. -/// -/// You can get an instance from a `RLMMongoDatabase`. -/// -/// Create, read, update, and delete methods are available. -/// -/// Operations against the Realm Cloud server are performed asynchronously. -/// -/// - Note: -/// Before you can read or write data, a user must log in. -/// - Usage: -/// RLMMongoClient *client = [self.app mongoClient:@"mongodb1"]; -/// RLMMongoDatabase *database = [client databaseWithName:@"test_data"]; -/// RLMMongoCollection *collection = [database collectionWithName:@"Dog"]; -/// [collection insertOneDocument:@{@"name": @"fido", @"breed": @"cane corso"} completion:...]; -/// -/// - SeeAlso: -/// `RLMMongoClient`, `RLMMongoDatabase` -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMMongoCollection : NSObject -/// Block which returns an object id on a successful insert, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoInsertBlock)(id _Nullable, NSError * _Nullable); -/// Block which returns an array of object ids on a successful insertMany, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoInsertManyBlock)(NSArray> * _Nullable, NSError * _Nullable); -/// Block which returns an array of Documents on a successful find operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoFindBlock)(NSArray> *> * _Nullable, - NSError * _Nullable); -/// Block which returns a Document on a successful findOne operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoFindOneBlock)(NSDictionary> * _Nullable_result, - NSError * _Nullable); -/// Block which returns the number of Documents in a collection on a successful count operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoCountBlock)(NSInteger, NSError * _Nullable); -/// Block which returns an RLMUpdateResult on a successful update operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoUpdateBlock)(RLMUpdateResult * _Nullable, NSError * _Nullable); -/// Block which returns the deleted Document on a successful delete operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoDeleteBlock)(NSDictionary> * _Nullable_result, - NSError * _Nullable); - -/// The name of this mongodb collection. -@property (nonatomic, readonly) NSString *name; - -/// Encodes the provided value to BSON and inserts it. If the value is missing an identifier, one will be -/// generated for it. -/// @param document A `Document` value to insert. -/// @param completion The result of attempting to perform the insert. An Id will be returned for the inserted object on sucess -- (void)insertOneDocument:(NSDictionary> *)document - completion:(RLMMongoInsertBlock)completion NS_REFINED_FOR_SWIFT; - -/// Encodes the provided values to BSON and inserts them. If any values are missing identifiers, -/// they will be generated. -/// @param documents The `Document` values in a bson array to insert. -/// @param completion The result of the insert, returns an array inserted document ids in order -- (void)insertManyDocuments:(NSArray> *> *)documents - completion:(RLMMongoInsertManyBlock)completion NS_REFINED_FOR_SWIFT; - -/// Finds the documents in this collection which match the provided filter. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param options `RLMFindOptions` to use when executing the command. -/// @param completion The resulting bson array of documents or error if one occurs -- (void)findWhere:(NSDictionary> *)filterDocument - options:(RLMFindOptions *)options - completion:(RLMMongoFindBlock)completion NS_REFINED_FOR_SWIFT; - -/// Finds the documents in this collection which match the provided filter. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param completion The resulting bson array as a string or error if one occurs -- (void)findWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoFindBlock)completion NS_REFINED_FOR_SWIFT; - -/// Returns one document from a collection or view which matches the -/// provided filter. If multiple documents satisfy the query, this method -/// returns the first document according to the query's sort order or natural -/// order. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param options `RLMFindOptions` to use when executing the command. -/// @param completion The resulting bson or error if one occurs -- (void)findOneDocumentWhere:(NSDictionary> *)filterDocument - options:(RLMFindOptions *)options - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Returns one document from a collection or view which matches the -/// provided filter. If multiple documents satisfy the query, this method -/// returns the first document according to the query's sort order or natural -/// order. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param completion The resulting bson or error if one occurs -- (void)findOneDocumentWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Runs an aggregation framework pipeline against this collection. -/// @param pipeline A bson array made up of `Documents` containing the pipeline of aggregation operations to perform. -/// @param completion The resulting bson array of documents or error if one occurs -- (void)aggregateWithPipeline:(NSArray> *> *)pipeline - completion:(RLMMongoFindBlock)completion NS_REFINED_FOR_SWIFT; - -/// Counts the number of documents in this collection matching the provided filter. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param limit The max amount of documents to count -/// @param completion Returns the count of the documents that matched the filter. -- (void)countWhere:(NSDictionary> *)filterDocument - limit:(NSInteger)limit - completion:(RLMMongoCountBlock)completion NS_REFINED_FOR_SWIFT; - -/// Counts the number of documents in this collection matching the provided filter. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param completion Returns the count of the documents that matched the filter. -- (void)countWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoCountBlock)completion NS_REFINED_FOR_SWIFT; - -/// Deletes a single matching document from the collection. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param completion The result of performing the deletion. Returns the count of deleted objects -- (void)deleteOneDocumentWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoCountBlock)completion NS_REFINED_FOR_SWIFT; - -/// Deletes multiple documents -/// @param filterDocument Document representing the match criteria -/// @param completion The result of performing the deletion. Returns the count of the deletion -- (void)deleteManyDocumentsWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoCountBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates a single document matching the provided filter in this collection. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param upsert When true, creates a new document if no document matches the query. -/// @param completion The result of the attempt to update a document. -- (void)updateOneDocumentWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - upsert:(BOOL)upsert - completion:(RLMMongoUpdateBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates a single document matching the provided filter in this collection. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param completion The result of the attempt to update a document. -- (void)updateOneDocumentWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - completion:(RLMMongoUpdateBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates multiple documents matching the provided filter in this collection. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param upsert When true, creates a new document if no document matches the query. -/// @param completion The result of the attempt to update a document. -- (void)updateManyDocumentsWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - upsert:(BOOL)upsert - completion:(RLMMongoUpdateBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates multiple documents matching the provided filter in this collection. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param completion The result of the attempt to update a document. -- (void)updateManyDocumentsWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - completion:(RLMMongoUpdateBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates a single document in a collection based on a query filter and -/// returns the document in either its pre-update or post-update form. Unlike -/// `updateOneDocument`, this action allows you to atomically find, update, and -/// return a document with the same command. This avoids the risk of other -/// update operations changing the document between separate find and update -/// operations. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param options `RemoteFindOneAndModifyOptions` to use when executing the command. -/// @param completion The result of the attempt to update a document. -- (void)findOneAndUpdateWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - options:(RLMFindOneAndModifyOptions *)options - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates a single document in a collection based on a query filter and -/// returns the document in either its pre-update or post-update form. Unlike -/// `updateOneDocument`, this action allows you to atomically find, update, and -/// return a document with the same command. This avoids the risk of other -/// update operations changing the document between separate find and update -/// operations. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param completion The result of the attempt to update a document. -- (void)findOneAndUpdateWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Overwrites a single document in a collection based on a query filter and -/// returns the document in either its pre-replacement or post-replacement -/// form. Unlike `updateOneDocument`, this action allows you to atomically find, -/// replace, and return a document with the same command. This avoids the -/// risk of other update operations changing the document between separate -/// find and update operations. -/// @param filterDocument A `Document` that should match the query. -/// @param replacementDocument A `Document` describing the replacement. -/// @param options `RLMFindOneAndModifyOptions` to use when executing the command. -/// @param completion The result of the attempt to replace a document. -- (void)findOneAndReplaceWhere:(NSDictionary> *)filterDocument - replacementDocument:(NSDictionary> *)replacementDocument - options:(RLMFindOneAndModifyOptions *)options - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Overwrites a single document in a collection based on a query filter and -/// returns the document in either its pre-replacement or post-replacement -/// form. Unlike `updateOneDocument`, this action allows you to atomically find, -/// replace, and return a document with the same command. This avoids the -/// risk of other update operations changing the document between separate -/// find and update operations. -/// @param filterDocument A `Document` that should match the query. -/// @param replacementDocument A `Document` describing the update. -/// @param completion The result of the attempt to replace a document. -- (void)findOneAndReplaceWhere:(NSDictionary> *)filterDocument - replacementDocument:(NSDictionary> *)replacementDocument - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Removes a single document from a collection based on a query filter and -/// returns a document with the same form as the document immediately before -/// it was deleted. Unlike `deleteOneDocument`, this action allows you to atomically -/// find and delete a document with the same command. This avoids the risk of -/// other update operations changing the document between separate find and -/// delete operations. -/// @param filterDocument A `Document` that should match the query. -/// @param options `RLMFindOneAndModifyOptions` to use when executing the command. -/// @param completion The result of the attempt to delete a document. -- (void)findOneAndDeleteWhere:(NSDictionary> *)filterDocument - options:(RLMFindOneAndModifyOptions *)options - completion:(RLMMongoDeleteBlock)completion NS_REFINED_FOR_SWIFT; - -/// Removes a single document from a collection based on a query filter and -/// returns a document with the same form as the document immediately before -/// it was deleted. Unlike `deleteOneDocument`, this action allows you to atomically -/// find and delete a document with the same command. This avoids the risk of -/// other update operations changing the document between separate find and -/// delete operations. -/// @param filterDocument A `Document` that should match the query. -/// @param completion The result of the attempt to delete a document. -- (void)findOneAndDeleteWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoDeleteBlock)completion NS_REFINED_FOR_SWIFT; - -/// Opens a MongoDB change stream against the collection to watch for changes. The resulting stream will be notified -/// of all events on this collection that the active user is authorized to see based on the configured MongoDB -/// rules. -/// @param delegate The delegate that will react to events and errors from the resulting change stream. -/// @param queue Dispatches streaming events to an optional queue, if no queue is provided the main queue is used -- (RLMChangeStream *)watchWithDelegate:(id)delegate - delegateQueue:(nullable dispatch_queue_t)queue NS_REFINED_FOR_SWIFT; - -/// Opens a MongoDB change stream against the collection to watch for changes -/// made to specific documents. The documents to watch must be explicitly -/// specified by their _id. -/// @param filterIds The list of _ids in the collection to watch. -/// @param delegate The delegate that will react to events and errors from the resulting change stream. -/// @param queue Dispatches streaming events to an optional queue, if no queue is provided the main queue is used -- (RLMChangeStream *)watchWithFilterIds:(NSArray *)filterIds - delegate:(id)delegate - delegateQueue:(nullable dispatch_queue_t)queue NS_REFINED_FOR_SWIFT; - -/// Opens a MongoDB change stream against the collection to watch for changes. The provided BSON document will be -/// used as a match expression filter on the change events coming from the stream. -/// -/// See https://docs.mongodb.com/manual/reference/operator/aggregation/match/ for documentation around how to define -/// a match filter. -/// -/// Defining the match expression to filter ChangeEvents is similar to defining the match expression for triggers: -/// https://docs.mongodb.com/realm/triggers/database-triggers/ -/// @param matchFilter The $match filter to apply to incoming change events -/// @param delegate The delegate that will react to events and errors from the resulting change stream. -/// @param queue Dispatches streaming events to an optional queue, if no queue is provided the main queue is used -- (RLMChangeStream *)watchWithMatchFilter:(NSDictionary> *)matchFilter - delegate:(id)delegate - delegateQueue:(nullable dispatch_queue_t)queue NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMMongoDatabase.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMMongoDatabase.h deleted file mode 100644 index 177fbc1b8..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMMongoDatabase.h +++ /dev/null @@ -1,51 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMMongoCollection; - -/// The `RLMMongoDatabase` represents a MongoDB database, which holds a group -/// of collections that contain your data. -/// -/// It can be retrieved from the `RLMMongoClient`. -/// -/// Use it to get `RLMMongoCollection`s for reading and writing data. -/// -/// - Note: -/// Before you can read or write data, a user must log in`. -/// -/// - SeeAlso: -/// `RLMMongoClient`, `RLMMongoCollection` -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMMongoDatabase : NSObject - -/// The name of this database -@property (nonatomic, readonly) NSString *name; - -/// Gets a collection. -/// @param name The name of the collection to return -/// @returns The collection -- (RLMMongoCollection *)collectionWithName:(NSString *)name; -// NEXT-MAJOR: NS_SWIFT_NAME(collection(named:)) - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMNetworkTransport.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMNetworkTransport.h deleted file mode 100644 index 2884b4296..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMNetworkTransport.h +++ /dev/null @@ -1,132 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// Allowed HTTP methods to be used with `RLMNetworkTransport`. -typedef RLM_CLOSED_ENUM(int32_t, RLMHTTPMethod) { - /// GET is used to request data from a specified resource. - RLMHTTPMethodGET = 0, - /// POST is used to send data to a server to create/update a resource. - RLMHTTPMethodPOST = 1, - /// PATCH is used to send data to a server to update a resource. - RLMHTTPMethodPATCH = 2, - /// PUT is used to send data to a server to create/update a resource. - RLMHTTPMethodPUT = 3, - /// The DELETE method deletes the specified resource. - RLMHTTPMethodDELETE = 4 -}; - -/// An HTTP request that can be made to an arbitrary server. -@interface RLMRequest : NSObject - -/// The HTTP method of this request. -@property (nonatomic, assign) RLMHTTPMethod method; - -/// The URL to which this request will be made. -@property (nonatomic, strong) NSString *url; - -/// The number of milliseconds that the underlying transport should spend on an -/// HTTP round trip before failing with an error. -@property (nonatomic, assign) NSTimeInterval timeout; - -/// The HTTP headers of this request. -@property (nonatomic, strong) NSDictionary* headers; - -/// The body of the request. -@property (nonatomic, strong) NSString* body; - -@end - -/// The contents of an HTTP response. -@interface RLMResponse : NSObject - -/// The status code of the HTTP response. -@property (nonatomic, assign) NSInteger httpStatusCode; - -/// A custom status code provided by the SDK. -@property (nonatomic, assign) NSInteger customStatusCode; - -/// The headers of the HTTP response. -@property (nonatomic, strong) NSDictionary* headers; - -/// The body of the HTTP response. -@property (nonatomic, strong) NSString *body; - -@end - -/// Delegate which is used for subscribing to changes. -@protocol RLMEventDelegate -/// Invoked when a change event has been received. -/// @param event The change event encoded as NSData -- (void)didReceiveEvent:(NSData *)event; -/// A error has occurred while subscribing to changes. -/// @param error The error that has occurred. -- (void)didReceiveError:(NSError *)error; -/// The stream was opened. -- (void)didOpen; -/// The stream has been closed. -/// @param error The error that has occurred. -- (void)didCloseWithError:(NSError *_Nullable)error; -@end - -/// A block for receiving an `RLMResponse` from the `RLMNetworkTransport`. -RLM_SWIFT_SENDABLE // invoked on a backgroun thread -typedef void(^RLMNetworkTransportCompletionBlock)(RLMResponse *); - -/// Transporting protocol for foreign interfaces. Allows for custom -/// request/response handling. -RLM_SWIFT_SENDABLE // used from multiple threads so must be internally thread-safe -@protocol RLMNetworkTransport - -/** - Sends a request to a given endpoint. - - @param request The request to send. - @param completionBlock A callback invoked on completion of the request. -*/ -- (void)sendRequestToServer:(RLMRequest *)request - completion:(RLMNetworkTransportCompletionBlock)completionBlock; - -/// Starts an event stream request. -/// @param request The RLMRequest to start. -/// @param subscriber The RLMEventDelegate which will subscribe to changes from the server. -- (NSURLSession *)doStreamRequest:(RLMRequest *)request - eventSubscriber:(id)subscriber; - -@end - -/// Transporting protocol for foreign interfaces. Allows for custom -/// request/response handling. -RLM_SWIFT_SENDABLE // is internally thread-safe -@interface RLMNetworkTransport : NSObject - -/** - Sends a request to a given endpoint. - - @param request The request to send. - @param completionBlock A callback invoked on completion of the request. -*/ -- (void)sendRequestToServer:(RLMRequest *) request - completion:(RLMNetworkTransportCompletionBlock)completionBlock; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMObject.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMObject.h deleted file mode 100644 index 9bcfbe310..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMObject.h +++ /dev/null @@ -1,811 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMNotificationToken; -@class RLMObjectSchema; -@class RLMPropertyChange; -@class RLMPropertyDescriptor; -@class RLMRealm; -@class RLMResults; - -/** - `RLMObject` is a base class for model objects representing data stored in Realms. - - Define your model classes by subclassing `RLMObject` and adding properties to be managed. - Then instantiate and use your custom subclasses instead of using the `RLMObject` class directly. - - // Dog.h - @interface Dog : RLMObject - @property NSString *name; - @property BOOL adopted; - @end - - // Dog.m - @implementation Dog - @end //none needed - - ### Supported property types - - - `NSString` - - `NSInteger`, `int`, `long`, `float`, and `double` - - `BOOL` or `bool` - - `NSDate` - - `NSData` - - `NSNumber`, where `X` is one of `RLMInt`, `RLMFloat`, `RLMDouble` or `RLMBool`, for optional number properties - - `RLMObject` subclasses, to model many-to-one relationships. - - `RLMArray`, where `X` is an `RLMObject` subclass, to model many-to-many relationships. - - ### Querying - - You can initiate queries directly via the class methods: `allObjects`, `objectsWhere:`, and `objectsWithPredicate:`. - These methods allow you to easily query a custom subclass for instances of that class in the default Realm. - - To search in a Realm other than the default Realm, use the `allObjectsInRealm:`, `objectsInRealm:where:`, - and `objectsInRealm:withPredicate:` class methods. - - @see `RLMRealm` - - ### Relationships - - See our [Realm Swift Documentation](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/relationships/#relationships) for more details. - - ### Key-Value Observing - - All `RLMObject` properties (including properties you create in subclasses) are - [Key-Value Observing compliant](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/KeyValueObserving/KeyValueObserving.html), - except for `realm` and `objectSchema`. - - Keep the following tips in mind when observing Realm objects: - - 1. Unlike `NSMutableArray` properties, `RLMArray` properties do not require - using the proxy object returned from `-mutableArrayValueForKey:`, or defining - KVC mutation methods on the containing class. You can simply call methods on - the `RLMArray` directly; any changes will be automatically observed by the containing - object. - 2. Unmanaged `RLMObject` instances cannot be added to a Realm while they have any - observed properties. - 3. Modifying managed `RLMObject`s within `-observeValueForKeyPath:ofObject:change:context:` - is not recommended. Properties may change even when the Realm is not in a write - transaction (for example, when `-[RLMRealm refresh]` is called after changes - are made on a different thread), and notifications sent prior to the change - being applied (when `NSKeyValueObservingOptionPrior` is used) may be sent at - times when you *cannot* begin a write transaction. - */ - -@interface RLMObject : RLMObjectBase - -#pragma mark - Creating & Initializing Objects - -/** - Creates an unmanaged instance of a Realm object. - - Call `addObject:` on an `RLMRealm` instance to add an unmanaged object into that Realm. - - @see `[RLMRealm addObject:]` - */ -- (instancetype)init NS_DESIGNATED_INITIALIZER; - - -/** - Creates an unmanaged instance of a Realm object. - - Pass in an `NSArray` or `NSDictionary` instance to set the values of the object's properties. - - Call `addObject:` on an `RLMRealm` instance to add an unmanaged object into that Realm. - - @see `[RLMRealm addObject:]` - */ -- (instancetype)initWithValue:(id)value; - - -/** - Returns the class name for a Realm object subclass. - - @warning Do not override. Realm relies on this method returning the exact class - name. - - @return The class name for the model class. - */ -+ (NSString *)className; - -/** - Creates an instance of a Realm object with a given value, and adds it to the default Realm. - - If nested objects are included in the argument, `createInDefaultRealmWithValue:` will be recursively called - on them. - - The `value` argument can be a key-value coding compliant object, an array or dictionary returned from the methods in - `NSJSONSerialization`, or an array containing one element for each managed property. - - An exception will be thrown if any required properties are not present and those properties - were not defined with default values. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param value The value used to populate the object. - - @see `defaultPropertyValues` - */ -+ (instancetype)createInDefaultRealmWithValue:(id)value; - -/** - Creates an instance of a Realm object with a given value, and adds it to the specified Realm. - - If nested objects are included in the argument, `createInRealm:withValue:` will be recursively called - on them. - - The `value` argument can be a key-value coding compliant object, an array or dictionary returned from the methods in - `NSJSONSerialization`, or an array containing one element for each managed property. - - An exception will be thrown if any required properties are not present and those properties - were not defined with default values. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param realm The Realm which should manage the newly-created object. - @param value The value used to populate the object. - - @see `defaultPropertyValues` - */ -+ (instancetype)createInRealm:(RLMRealm *)realm withValue:(id)value; - -/** - Creates or updates a Realm object within the default Realm. - - This method may only be called on Realm object types with a primary key defined. If there is already - an object with the same primary key value in the default Realm, its values are updated and the object - is returned. Otherwise, this method creates and populates a new instance of the object in the default Realm. - - If nested objects are included in the argument, `createOrUpdateInDefaultRealmWithValue:` will be - recursively called on them if they have primary keys, `createInDefaultRealmWithValue:` if they do not. - - The `value` argument is used to populate the object. It can be a Realm object, a key-value coding - compliant object, an array or dictionary returned from the methods in `NSJSONSerialization`, or an - array containing one element for each managed property. - - If the object is being created, an exception will be thrown if any required properties - are not present and those properties were not defined with default values. - - If the `value` argument is a Realm object already managed by the default Realm, the - argument's type is the same as the receiver, and the objects have identical values for - their managed properties, this method does nothing. - - If the object is being updated, each property defined in its schema will be set by copying from - `value` using key-value coding. If the `value` argument does not respond to `valueForKey:` for a - given property name (or getter name, if defined), that value will remain untouched. - Nullable properties on the object can be set to nil by using `NSNull` as the updated value. - Each property is set even if the existing value is the same as the new value being set, and - notifications will report them all being changed. See `createOrUpdateModifiedInDefaultRealmWithValue:` - for a version of this function which only sets the values which have changed. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param value The value used to populate the object. - - @see `defaultPropertyValues`, `primaryKey` - */ -+ (instancetype)createOrUpdateInDefaultRealmWithValue:(id)value; - -/** - Creates or updates a Realm object within the default Realm. - - This method may only be called on Realm object types with a primary key defined. If there is already - an object with the same primary key value in the default Realm, its values are updated and the object - is returned. Otherwise, this method creates and populates a new instance of the object in the default Realm. - - If nested objects are included in the argument, `createOrUpdateModifiedInDefaultRealmWithValue:` will be - recursively called on them if they have primary keys, `createInDefaultRealmWithValue:` if they do not. - - The `value` argument is used to populate the object. It can be a Realm object, a key-value coding - compliant object, an array or dictionary returned from the methods in `NSJSONSerialization`, or an - array containing one element for each managed property. - - If the object is being created, an exception will be thrown if any required properties - are not present and those properties were not defined with default values. - - If the `value` argument is a Realm object already managed by the default Realm, the - argument's type is the same as the receiver, and the objects have identical values for - their managed properties, this method does nothing. - - If the object is being updated, each property defined in its schema will be set by copying from - `value` using key-value coding. If the `value` argument does not respond to `valueForKey:` for a - given property name (or getter name, if defined), that value will remain untouched. - Nullable properties on the object can be set to nil by using `NSNull` as the updated value. - Unlike `createOrUpdateInDefaultRealmWithValue:`, only properties which have changed in value are - set, and any change notifications produced by this call will report only which properies have - actually changed. - - Checking which properties have changed imposes a small amount of overhead, and so this method - may be slower when all or nearly all of the properties being set have changed. If most or all - of the properties being set have not changed, this method will be much faster than unconditionally - setting all of them, and will also reduce how much data has to be written to the Realm, saving - both i/o time and disk space. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param value The value used to populate the object. - - @see `defaultPropertyValues`, `primaryKey` - */ -+ (instancetype)createOrUpdateModifiedInDefaultRealmWithValue:(id)value; - -/** - Creates or updates an Realm object within a specified Realm. - - This method may only be called on Realm object types with a primary key defined. If there is already - an object with the same primary key value in the given Realm, its values are updated and the object - is returned. Otherwise this method creates and populates a new instance of this object in the given Realm. - - If nested objects are included in the argument, `createOrUpdateInRealm:withValue:` will be - recursively called on them if they have primary keys, `createInRealm:withValue:` if they do not. - - The `value` argument is used to populate the object. It can be a Realm object, a key-value coding - compliant object, an array or dictionary returned from the methods in `NSJSONSerialization`, or an - array containing one element for each managed property. - - If the object is being created, an exception will be thrown if any required properties - are not present and those properties were not defined with default values. - - If the `value` argument is a Realm object already managed by the given Realm, the - argument's type is the same as the receiver, and the objects have identical values for - their managed properties, this method does nothing. - - If the object is being updated, each property defined in its schema will be set by copying from - `value` using key-value coding. If the `value` argument does not respond to `valueForKey:` for a - given property name (or getter name, if defined), that value will remain untouched. - Nullable properties on the object can be set to nil by using `NSNull` as the updated value. - Each property is set even if the existing value is the same as the new value being set, and - notifications will report them all being changed. See `createOrUpdateModifiedInRealm:withValue:` - for a version of this function which only sets the values which have changed. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param realm The Realm which should own the object. - @param value The value used to populate the object. - - @see `defaultPropertyValues`, `primaryKey` - */ -+ (instancetype)createOrUpdateInRealm:(RLMRealm *)realm withValue:(id)value; - -/** - Creates or updates an Realm object within a specified Realm. - - This method may only be called on Realm object types with a primary key defined. If there is already - an object with the same primary key value in the given Realm, its values are updated and the object - is returned. Otherwise this method creates and populates a new instance of this object in the given Realm. - - If nested objects are included in the argument, `createOrUpdateInRealm:withValue:` will be - recursively called on them if they have primary keys, `createInRealm:withValue:` if they do not. - - The `value` argument is used to populate the object. It can be a Realm object, a key-value coding - compliant object, an array or dictionary returned from the methods in `NSJSONSerialization`, or an - array containing one element for each managed property. - - If the object is being created, an exception will be thrown if any required properties - are not present and those properties were not defined with default values. - - If the `value` argument is a Realm object already managed by the given Realm, the - argument's type is the same as the receiver, and the objects have identical values for - their managed properties, this method does nothing. - - If the object is being updated, each property defined in its schema will be set by copying from - `value` using key-value coding. If the `value` argument does not respond to `valueForKey:` for a - given property name (or getter name, if defined), that value will remain untouched. - Nullable properties on the object can be set to nil by using `NSNull` as the updated value. - Unlike `createOrUpdateInRealm:withValue:`, only properties which have changed in value are - set, and any change notifications produced by this call will report only which properies have - actually changed. - - Checking which properties have changed imposes a small amount of overhead, and so this method - may be slower when all or nearly all of the properties being set have changed. If most or all - of the properties being set have not changed, this method will be much faster than unconditionally - setting all of them, and will also reduce how much data has to be written to the Realm, saving - both i/o time and disk space. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param realm The Realm which should own the object. - @param value The value used to populate the object. - - @see `defaultPropertyValues`, `primaryKey` - */ -+ (instancetype)createOrUpdateModifiedInRealm:(RLMRealm *)realm withValue:(id)value; - -#pragma mark - Properties - -/** - The Realm which manages the object, or `nil` if the object is unmanaged. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - The object schema which lists the managed properties for the object. - */ -@property (nonatomic, readonly) RLMObjectSchema *objectSchema; - -/** - Indicates if the object can no longer be accessed because it is now invalid. - - An object can no longer be accessed if the object has been deleted from the Realm that manages it, or - if `invalidate` is called on that Realm. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if this object is frozen. - - @see `-[RLMObject freeze]` - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - - -#pragma mark - Customizing your Objects - -/** - Returns an array of property names for properties which should be indexed. - - Only string, integer, boolean, and `NSDate` properties are supported. - - @return An array of property names. - */ -+ (NSArray *)indexedProperties; - -/** - Override this method to specify the default values to be used for each property. - - @return A dictionary mapping property names to their default values. - */ -+ (nullable NSDictionary *)defaultPropertyValues; - -/** - Override this method to specify the name of a property to be used as the primary key. - - Only properties of types `RLMPropertyTypeString` and `RLMPropertyTypeInt` can be designated as the primary key. - Primary key properties enforce uniqueness for each value whenever the property is set, which incurs minor overhead. - Indexes are created automatically for primary key properties. - - @return The name of the property designated as the primary key. - */ -+ (nullable NSString *)primaryKey; - -/** - Override this method to specify the names of properties to ignore. These properties will not be managed by the Realm - that manages the object. - - @return An array of property names to ignore. - */ -+ (nullable NSArray *)ignoredProperties; - -/** - Override this method to specify the names of properties that are non-optional (i.e. cannot be assigned a `nil` value). - - By default, all properties of a type whose values can be set to `nil` are considered optional properties. - To require that an object in a Realm always store a non-`nil` value for a property, - add the name of the property to the array returned from this method. - - Properties of `RLMObject` type cannot be non-optional. Array and `NSNumber` properties - can be non-optional, but there is no reason to do so: arrays do not support storing nil, and - if you want a non-optional number you should instead use the primitive type. - - @return An array of property names that are required. - */ -+ (NSArray *)requiredProperties; - -/** - Override this method to provide information related to properties containing linking objects. - - Each property of type `RLMLinkingObjects` must have a key in the dictionary returned by this method consisting - of the property name. The corresponding value must be an instance of `RLMPropertyDescriptor` that describes the class - and property that the property is linked to. - - return @{ @"owners": [RLMPropertyDescriptor descriptorWithClass:Owner.class propertyName:@"dogs"] }; - - @return A dictionary mapping property names to `RLMPropertyDescriptor` instances. - */ -+ (NSDictionary *)linkingObjectsProperties; - -#pragma mark - Getting & Querying Objects from the Default Realm - -/** - Returns all objects of this object type from the default Realm. - - @return An `RLMResults` containing all objects of this type in the default Realm. - */ -+ (RLMResults *)allObjects; - -/** - Returns all objects of this object type matching the given predicate from the default Realm. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` containing all objects of this type in the default Realm that match the given predicate. - */ -+ (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -+ (RLMResults<__kindof RLMObject *> *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - - -/** - Returns all objects of this object type matching the given predicate from the default Realm. - - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` containing all objects of this type in the default Realm that match the given predicate. - */ -+ (RLMResults *)objectsWithPredicate:(nullable NSPredicate *)predicate; - -/** - Retrieves the single instance of this object type with the given primary key from the default Realm. - - Returns the object from the default Realm which has the given primary key, or - `nil` if the object does not exist. This is slightly faster than the otherwise - equivalent `[[SubclassName objectsWhere:@"primaryKeyPropertyName = %@", key] firstObject]`. - - This method requires that `primaryKey` be overridden on the receiving subclass. - - @return An object of this object type, or `nil` if an object with the given primary key does not exist. - @see `-primaryKey` - */ -+ (nullable instancetype)objectForPrimaryKey:(nullable id)primaryKey NS_SWIFT_NAME(object(forPrimaryKey:)); - - -#pragma mark - Querying Specific Realms - -/** - Returns all objects of this object type from the specified Realm. - - @param realm The Realm to query. - - @return An `RLMResults` containing all objects of this type in the specified Realm. - */ -+ (RLMResults *)allObjectsInRealm:(RLMRealm *)realm; - -/** - Returns all objects of this object type matching the given predicate from the specified Realm. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - @param realm The Realm to query. - - @return An `RLMResults` containing all objects of this type in the specified Realm that match the given predicate. - */ -+ (RLMResults *)objectsInRealm:(RLMRealm *)realm where:(NSString *)predicateFormat, ...; - -/// :nodoc: -+ (RLMResults<__kindof RLMObject *> *)objectsInRealm:(RLMRealm *)realm where:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all objects of this object type matching the given predicate from the specified Realm. - - @param predicate A predicate to use to filter the elements. - @param realm The Realm to query. - - @return An `RLMResults` containing all objects of this type in the specified Realm that match the given predicate. - */ -+ (RLMResults *)objectsInRealm:(RLMRealm *)realm withPredicate:(nullable NSPredicate *)predicate; - -/** - Retrieves the single instance of this object type with the given primary key from the specified Realm. - - Returns the object from the specified Realm which has the given primary key, or - `nil` if the object does not exist. This is slightly faster than the otherwise - equivalent `[[SubclassName objectsInRealm:realm where:@"primaryKeyPropertyName = %@", key] firstObject]`. - - This method requires that `primaryKey` be overridden on the receiving subclass. - - @return An object of this object type, or `nil` if an object with the given primary key does not exist. - @see `-primaryKey` - */ -+ (nullable instancetype)objectInRealm:(RLMRealm *)realm forPrimaryKey:(nullable id)primaryKey NS_SWIFT_NAME(object(in:forPrimaryKey:)); - -#pragma mark - Notifications - -/** - A callback block for `RLMObject` notifications. - - If the object is deleted from the managing Realm, the block is called with - `deleted` set to `YES` and the other two arguments are `nil`. The block will - never be called again after this. - - If the object is modified, the block will be called with `deleted` set to - `NO`, a `nil` error, and an array of `RLMPropertyChange` objects which - indicate which properties of the objects were modified. - - `error` is always `nil` and will be removed in a future version. - */ -typedef void (^RLMObjectChangeBlock)(BOOL deleted, - NSArray *_Nullable changes, - NSError *_Nullable error); - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When notifications - can't be delivered instantly, multiple notifications may be coalesced into a - single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - - @param block The block to be called whenever a change occurs. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block queue:(dispatch_queue_t)queue; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block keyPaths:(NSArray *)keyPaths queue:(dispatch_queue_t)queue; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block keyPaths:(NSArray *)keyPaths; - - -#pragma mark - Other Instance Methods - -/** - Returns YES if another Realm object instance points to the same object as the receiver in the Realm managing - the receiver. - - For frozen objects and object types with a primary key, `isEqual:` is - overridden to use the same logic as this method (along with a corresponding - implementation for `hash`). Non-frozen objects without primary keys use - pointer identity for `isEqual:` and `hash`. - - @param object The object to compare the receiver to. - - @return Whether the object represents the same object as the receiver. - */ -- (BOOL)isEqualToObject:(RLMObject *)object; - -/** - Returns a frozen (immutable) snapshot of this object. - - The frozen copy is an immutable object which contains the same data as this - object currently contains, but will not update when writes are made to the - containing Realm. Unlike live objects, frozen objects can be accessed from any - thread. - - - warning: Holding onto a frozen object for an extended period while performing write - transaction on the Realm may result in the Realm file growing to large sizes. See - `Realm.Configuration.maximumNumberOfActiveVersions` for more information. - - warning: This method can only be called on a managed object. - */ -- (instancetype)freeze NS_RETURNS_RETAINED; - -/** - Returns a live (mutable) reference of this object. - - This method creates a managed accessor to a live copy of the same frozen object. - Will return self if called on an already live object. - */ -- (instancetype)thaw; - -#pragma mark - Dynamic Accessors - -/// :nodoc: -- (nullable id)objectForKeyedSubscript:(NSString *)key; - -/// :nodoc: -- (void)setObject:(nullable id)obj forKeyedSubscript:(NSString *)key; - -@end - -/** - Information about a specific property which changed in an `RLMObject` change notification. - */ -@interface RLMPropertyChange : NSObject - -/** - The name of the property which changed. - */ -@property (nonatomic, readonly, strong) NSString *name; - -/** - The value of the property before the change occurred. This will always be `nil` - if the change happened on the same thread as the notification and for `RLMArray` - properties. - - For object properties this will give the object which was previously linked to, - but that object will have its new values and not the values it had before the - changes. This means that `previousValue` may be a deleted object, and you will - need to check `invalidated` before accessing any of its properties. - */ -@property (nonatomic, readonly, strong, nullable) id previousValue; - -/** - The value of the property after the change occurred. This will always be `nil` - for `RLMArray` properties. - */ -@property (nonatomic, readonly, strong, nullable) id value; -@end - -#pragma mark - RLMArray Property Declaration - -/** - Properties on `RLMObject`s of type `RLMArray` must have an associated type. A type is associated - with an `RLMArray` property by defining a protocol for the object type that the array should contain. - To define the protocol for an object, you can use the macro RLM_ARRAY_TYPE: - - RLM_ARRAY_TYPE(ObjectType) - ... - @property RLMArray *arrayOfObjectTypes; - */ -#define RLM_ARRAY_TYPE(RLM_OBJECT_SUBCLASS)\ -__attribute__((deprecated("RLM_ARRAY_TYPE has been deprecated. Use RLM_COLLECTION_TYPE instead."))) \ -@protocol RLM_OBJECT_SUBCLASS \ -@end - -/** - Properties on `RLMObject`s of type `RLMSet` / `RLMArray` must have an associated type. A type is associated - with an `RLMSet` / `RLMArray` property by defining a protocol for the object type that the array should contain. - To define the protocol for an object, you can use the macro RLM_COLLECTION_TYPE: - - RLM_COLLECTION_TYPE(ObjectType) - ... - @property RLMSet *setOfObjectTypes; - @property RLMArray *arrayOfObjectTypes; - */ -#define RLM_COLLECTION_TYPE(RLM_OBJECT_SUBCLASS)\ -@protocol RLM_OBJECT_SUBCLASS \ -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMObjectBase.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMObjectBase.h deleted file mode 100644 index 7e9c83c8f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMObjectBase.h +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// :nodoc: -@interface RLMObjectBase : NSObject - -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -- (instancetype)init NS_DESIGNATED_INITIALIZER; - -+ (NSString *)className; - -// Returns whether the class is included in the default set of classes managed by a Realm. -+ (BOOL)shouldIncludeInDefaultSchema; - -+ (nullable NSString *)_realmObjectName; -+ (nullable NSDictionary *)_realmColumnNames; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMObjectBase_Dynamic.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMObjectBase_Dynamic.h deleted file mode 100644 index fb74a5b27..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMObjectBase_Dynamic.h +++ /dev/null @@ -1,82 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectSchema, RLMRealm; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -/** - Returns the Realm that manages the object, if one exists. - - @warning This function is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is - recommended to retrieve the Realm that manages the object via `RLMObject`. - - @param object An `RLMObjectBase` obtained via a Swift `Object` or `RLMObject`. - - @return The Realm which manages this object. Returns `nil `for unmanaged objects. - */ -FOUNDATION_EXTERN RLMRealm * _Nullable RLMObjectBaseRealm(RLMObjectBase * _Nullable object); - -/** - Returns an `RLMObjectSchema` which describes the managed properties of the object. - - @warning This function is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is - recommended to retrieve `objectSchema` via `RLMObject`. - - @param object An `RLMObjectBase` obtained via a Swift `Object` or `RLMObject`. - - @return The object schema which lists the managed properties for the object. - */ -FOUNDATION_EXTERN RLMObjectSchema * _Nullable RLMObjectBaseObjectSchema(RLMObjectBase * _Nullable object); - -/** - Returns the object corresponding to a key value. - - @warning This function is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is - recommended to retrieve key values via `RLMObject`. - - @warning Will throw an `NSUndefinedKeyException` if `key` is not present on the object. - - @param object An `RLMObjectBase` obtained via a Swift `Object` or `RLMObject`. - @param key The name of the property. - - @return The object for the property requested. - */ -FOUNDATION_EXTERN id _Nullable RLMObjectBaseObjectForKeyedSubscript(RLMObjectBase * _Nullable object, NSString *key); - -/** - Sets a value for a key on the object. - - @warning This function is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is - recommended to set key values via `RLMObject`. - - @warning Will throw an `NSUndefinedKeyException` if `key` is not present on the object. - - @param object An `RLMObjectBase` obtained via a Swift `Object` or `RLMObject`. - @param key The name of the property. - @param obj The object to set as the value of the key. - */ -FOUNDATION_EXTERN void RLMObjectBaseSetObjectForKeyedSubscript(RLMObjectBase * _Nullable object, NSString *key, id _Nullable obj); - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMObjectId.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMObjectId.h deleted file mode 100644 index 32ef7b047..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMObjectId.h +++ /dev/null @@ -1,79 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A 12-byte (probably) unique object identifier. - - ObjectIds are similar to a GUID or a UUID, and can be used to uniquely identify - objects without a centralized ID generator. An ObjectID consists of: - - 1. A 4 byte timestamp measuring the creation time of the ObjectId in seconds - since the Unix epoch. - 2. A 5 byte random value - 3. A 3 byte counter, initialized to a random value. - - ObjectIds are intended to be fast to generate. Sorting by an ObjectId field - will typically result in the objects being sorted in creation order. - */ -RLM_SWIFT_SENDABLE // immutable -@interface RLMObjectId : NSObject -/// Creates a new randomly-initialized ObjectId. -+ (nonnull instancetype)objectId NS_SWIFT_NAME(generate()); - -/// Creates a new zero-initialized ObjectId. -- (instancetype)init; - -/// Creates a new ObjectId from the given 24-byte hexadecimal string. -/// -/// Returns `nil` and sets `error` if the string is not 24 characters long or -/// contains any characters other than 0-9a-fA-F. -/// -/// @param string The string to parse. -- (nullable instancetype)initWithString:(NSString *)string - error:(NSError **)error; - -/// Creates a new ObjectId using the given date, machine identifier, process identifier. -/// -/// @param timestamp A timestamp as NSDate. -/// @param machineIdentifier The machine identifier. -/// @param processIdentifier The process identifier. -- (instancetype)initWithTimestamp:(NSDate *)timestamp - machineIdentifier:(int)machineIdentifier - processIdentifier:(int)processIdentifier; - -/// Comparision operator to check if the right hand side is greater than the current value. -- (BOOL)isGreaterThan:(nullable RLMObjectId *)objectId; -/// Comparision operator to check if the right hand side is greater than or equal to the current value. -- (BOOL)isGreaterThanOrEqualTo:(nullable RLMObjectId *)objectId; -/// Comparision operator to check if the right hand side is less than the current value. -- (BOOL)isLessThan:(nullable RLMObjectId *)objectId; -/// Comparision operator to check if the right hand side is less than or equal to the current value. -- (BOOL)isLessThanOrEqualTo:(nullable RLMObjectId *)objectId; - -/// Get the ObjectId as a 24-character hexadecimal string. -@property (nonatomic, readonly) NSString *stringValue; -/// Get the timestamp for the RLMObjectId -@property (nonatomic, readonly) NSDate *timestamp; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMObjectSchema.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMObjectSchema.h deleted file mode 100644 index 9c4666b7c..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMObjectSchema.h +++ /dev/null @@ -1,83 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMProperty; - -/** - This class represents Realm model object schemas. - - When using Realm, `RLMObjectSchema` instances allow performing migrations and - introspecting the database's schema. - - Object schemas map to tables in the core database. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // not actually immutable, but the public API kinda is -@interface RLMObjectSchema : NSObject - -#pragma mark - Properties - -/** - An array of `RLMProperty` instances representing the managed properties of a class described by the schema. - - @see `RLMProperty` - */ -@property (nonatomic, readonly, copy) NSArray *properties; - -/** - The name of the class the schema describes. - */ -@property (nonatomic, readonly) NSString *className; - -/** - The property which serves as the primary key for the class the schema describes, if any. - */ -@property (nonatomic, readonly, nullable) RLMProperty *primaryKeyProperty; - -/** - Whether this object type is embedded. - */ -@property (nonatomic, readonly) BOOL isEmbedded; - -/** - Whether this object is asymmetric. - */ -@property (nonatomic, readonly) BOOL isAsymmetric; - -#pragma mark - Methods - -/** - Retrieves an `RLMProperty` object by the property name. - - @param propertyName The property's name. - - @return An `RLMProperty` object, or `nil` if there is no property with the given name. - */ -- (nullable RLMProperty *)objectForKeyedSubscript:(NSString *)propertyName; - -/** - Returns whether two `RLMObjectSchema` instances are equal. - */ -- (BOOL)isEqualToObjectSchema:(RLMObjectSchema *)objectSchema; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMProperty.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMProperty.h deleted file mode 100644 index 7f2594d3b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMProperty.h +++ /dev/null @@ -1,149 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// :nodoc: -@protocol RLMInt @end -/// :nodoc: -@protocol RLMBool @end -/// :nodoc: -@protocol RLMDouble @end -/// :nodoc: -@protocol RLMFloat @end -/// :nodoc: -@protocol RLMString @end -/// :nodoc: -@protocol RLMDate @end -/// :nodoc: -@protocol RLMData @end -/// :nodoc: -@protocol RLMDecimal128 @end -/// :nodoc: -@protocol RLMObjectId @end -/// :nodoc: -@protocol RLMUUID @end - -/// :nodoc: -@interface NSNumber () -@end - -/** - `RLMProperty` instances represent properties managed by a Realm in the context - of an object schema. Such properties may be persisted to a Realm file or - computed from other data from the Realm. - - When using Realm, `RLMProperty` instances allow performing migrations and - introspecting the database's schema. - - These property instances map to columns in the core database. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // not actually immutable, but the public API kinda is -@interface RLMProperty : NSObject - -#pragma mark - Properties - -/** - The name of the property. - */ -@property (nonatomic, readonly) NSString *name; - -/** - The type of the property. - - @see `RLMPropertyType` - */ -@property (nonatomic, readonly) RLMPropertyType type; - -/** - Indicates whether this property is indexed. - - @see `RLMObject` - */ -@property (nonatomic, readonly) BOOL indexed; - -/** - For `RLMObject` and `RLMCollection` properties, the name of the class of object stored in the property. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - For linking objects properties, the property name of the property the linking objects property is linked to. - */ -@property (nonatomic, readonly, copy, nullable) NSString *linkOriginPropertyName; - -/** - Indicates whether this property is optional. - */ -@property (nonatomic, readonly) BOOL optional; - -/** - Indicates whether this property is an array. - */ -@property (nonatomic, readonly) BOOL array; - -/** - Indicates whether this property is a set. - */ -@property (nonatomic, readonly) BOOL set; - -/** - Indicates whether this property is a dictionary. - */ -@property (nonatomic, readonly) BOOL dictionary; - -/** - Indicates whether this property is an array or set. - */ -@property (nonatomic, readonly) BOOL collection; - -#pragma mark - Methods - -/** - Returns whether a given property object is equal to the receiver. - */ -- (BOOL)isEqualToProperty:(RLMProperty *)property; - -@end - - -/** - An `RLMPropertyDescriptor` instance represents a specific property on a given class. - */ -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMPropertyDescriptor : NSObject - -/** - Creates and returns a property descriptor. - - @param objectClass The class of this property descriptor. - @param propertyName The name of this property descriptor. - */ -+ (instancetype)descriptorWithClass:(Class)objectClass propertyName:(NSString *)propertyName; - -/// The class of the property. -@property (nonatomic, readonly) Class objectClass; - -/// The name of the property. -@property (nonatomic, readonly) NSString *propertyName; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMProviderClient.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMProviderClient.h deleted file mode 100644 index ac649960a..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMProviderClient.h +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMApp; - -/// Base provider client interface. -RLM_SWIFT_SENDABLE -@interface RLMProviderClient : NSObject - -/// The app associated with this provider client. -@property (nonatomic, strong, readonly) RLMApp *app; - -/** - Initialize a provider client with a given app. - @param app The app for this provider client. - */ -- (instancetype)initWithApp:(RLMApp *)app; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMPushClient.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMPushClient.h deleted file mode 100644 index 0628c3ada..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMPushClient.h +++ /dev/null @@ -1,47 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMApp, RLMUser; - -/// A block type used to report an error -RLM_SWIFT_SENDABLE // invoked on a backgroun thread -typedef void(^RLMOptionalErrorBlock)(NSError * _Nullable); - -/// A client which can be used to register devices with the server to receive push notificatons -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMPushClient : NSObject - -/// The push notification service name the device will be registered with on the server -@property (nonatomic, readonly, nonnull) NSString *serviceName; - -/// Request to register device token to the server -- (void)registerDeviceWithToken:(NSString *)token - user:(RLMUser *)user - completion:(RLMOptionalErrorBlock)completion NS_SWIFT_NAME(registerDevice(token:user:completion:)); - -/// Request to deregister a device for a user -- (void)deregisterDeviceForUser:(RLMUser *)user - completion:(RLMOptionalErrorBlock)completion NS_SWIFT_NAME(deregisterDevice(user:completion:)); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMRealm+Sync.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMRealm+Sync.h deleted file mode 100644 index ff20e43c2..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMRealm+Sync.h +++ /dev/null @@ -1,38 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2017 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -@class RLMResults, RLMSyncSession; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -/// -@interface RLMRealm (Sync) - -/** - Get the RLMSyncSession used by this Realm. Will be nil if this is not a - synchronized Realm. -*/ -@property (nonatomic, nullable, readonly) RLMSyncSession *syncSession; - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMRealm.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMRealm.h deleted file mode 100644 index 0935e5301..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMRealm.h +++ /dev/null @@ -1,962 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMRealmConfiguration, RLMRealm, RLMObject, RLMSchema, RLMMigration, RLMNotificationToken, RLMThreadSafeReference, RLMAsyncOpenTask, RLMSyncSubscriptionSet; - -/** - A callback block for opening Realms asynchronously. - - Returns the Realm if the open was successful, or an error otherwise. - */ -typedef void(^RLMAsyncOpenRealmCallback)(RLMRealm * _Nullable realm, NSError * _Nullable error); - -/// The Id of the asynchronous transaction. -typedef unsigned RLMAsyncTransactionId; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - An `RLMRealm` instance (also referred to as "a Realm") represents a Realm - database. - - Realms can either be stored on disk (see `+[RLMRealm realmWithURL:]`) or in - memory (see `RLMRealmConfiguration`). - - `RLMRealm` instances are cached internally, and constructing equivalent `RLMRealm` - objects (for example, by using the same path or identifier) multiple times on a single thread - within a single iteration of the run loop will normally return the same - `RLMRealm` object. - - If you specifically want to ensure an `RLMRealm` instance is - destroyed (for example, if you wish to open a Realm, check some property, and - then possibly delete the Realm file and re-open it), place the code which uses - the Realm within an `@autoreleasepool {}` and ensure you have no other - strong references to it. - - @warning Non-frozen `RLMRealm` instances are thread-confined and cannot be - shared across threads or dispatch queues. Trying to do so will cause an - exception to be thrown. You must call this method on each thread you want to - interact with the Realm on. For dispatch queues, this means that you must call - it in each block which is dispatched, as a queue is not guaranteed to run all - of its blocks on the same thread. - */ - -@interface RLMRealm : NSObject - -#pragma mark - Creating & Initializing a Realm - -/** - Obtains an instance of the default Realm. - - The default Realm is used by the `RLMObject` class methods - which do not take an `RLMRealm` parameter, but is otherwise not special. The - default Realm is persisted as *default.realm* under the *Documents* directory of - your Application on iOS, in your application's *Application Support* - directory on macOS, and in the *Cache* directory on tvOS. - - The default Realm is created using the default `RLMRealmConfiguration`, which - can be changed via `+[RLMRealmConfiguration setDefaultConfiguration:]`. - - @return The default `RLMRealm` instance for the current thread. - */ -+ (instancetype)defaultRealm; - -/** - Obtains an instance of the default Realm bound to the given queue. - - Rather than being confined to the thread they are opened on, queue-bound - RLMRealms are confined to the given queue. They can be accessed from any - thread as long as it is from within a block dispatch to the queue, and - notifications will be delivered to the queue instead of a thread's run loop. - - Realms can only be confined to a serial queue. Queue-confined RLMRealm - instances can be obtained when not on that queue, but attempting to do - anything with that instance without first dispatching to the queue will throw - an incorrect thread exception. - - The default Realm is created using the default `RLMRealmConfiguration`, which - can be changed via `+[RLMRealmConfiguration setDefaultConfiguration:]`. - - @param queue A serial dispatch queue to confine the Realm to. - @return The default `RLMRealm` instance for the given queue. - */ -+ (instancetype)defaultRealmForQueue:(dispatch_queue_t)queue; - -/** - Obtains an `RLMRealm` instance with the given configuration. - - @param configuration A configuration object to use when creating the Realm. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return An `RLMRealm` instance. - */ -+ (nullable instancetype)realmWithConfiguration:(RLMRealmConfiguration *)configuration error:(NSError **)error; - -/** - Obtains an `RLMRealm` instance with the given configuration bound to the given queue. - - Rather than being confined to the thread they are opened on, queue-bound - RLMRealms are confined to the given queue. They can be accessed from any - thread as long as it is from within a block dispatch to the queue, and - notifications will be delivered to the queue instead of a thread's run loop. - - Realms can only be confined to a serial queue. Queue-confined RLMRealm - instances can be obtained when not on that queue, but attempting to do - anything with that instance without first dispatching to the queue will throw - an incorrect thread exception. - - @param configuration A configuration object to use when creating the Realm. - @param queue A serial dispatch queue to confine the Realm to. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return An `RLMRealm` instance. - */ -+ (nullable instancetype)realmWithConfiguration:(RLMRealmConfiguration *)configuration - queue:(nullable dispatch_queue_t)queue - error:(NSError **)error; - -/** - Obtains an `RLMRealm` instance persisted at a specified file URL. - - @param fileURL The local URL of the file the Realm should be saved at. - - @return An `RLMRealm` instance. - */ -+ (instancetype)realmWithURL:(NSURL *)fileURL; - -/** - Asynchronously open a Realm and deliver it to a block on the given queue. - - Opening a Realm asynchronously will perform all work needed to get the Realm to - a usable state (such as running potentially time-consuming migrations) on a - background thread before dispatching to the given queue. In addition, - synchronized Realms wait for all remote content available at the time the - operation began to be downloaded and available locally. - - The Realm passed to the callback function is confined to the callback queue as - if `-[RLMRealm realmWithConfiguration:queue:error]` was used. - - @param configuration A configuration object to use when opening the Realm. - @param callbackQueue The serial dispatch queue on which the callback should be run. - @param callback A callback block. If the Realm was successfully opened, - it will be passed in as an argument. - Otherwise, an `NSError` describing what went wrong will be - passed to the block instead. - */ -+ (RLMAsyncOpenTask *)asyncOpenWithConfiguration:(RLMRealmConfiguration *)configuration - callbackQueue:(dispatch_queue_t)callbackQueue - callback:(RLMAsyncOpenRealmCallback)callback; - -/** - The `RLMSchema` used by the Realm. - */ -@property (nonatomic, readonly) RLMSchema *schema; - -/** - Indicates if the Realm is currently engaged in a write transaction. - - @warning Do not simply check this property and then start a write transaction whenever an object needs to be - created, updated, or removed. Doing so might cause a large number of write transactions to be created, - degrading performance. Instead, always prefer performing multiple updates during a single transaction. - */ -@property (nonatomic, readonly) BOOL inWriteTransaction; - -/** - The `RLMRealmConfiguration` object that was used to create this `RLMRealm` instance. - */ -@property (nonatomic, readonly) RLMRealmConfiguration *configuration; - -/** - Indicates if this Realm contains any objects. - */ -@property (nonatomic, readonly) BOOL isEmpty; - -/** - Indicates if this Realm is frozen. - - @see `-[RLMRealm freeze]` - */ -@property (nonatomic, readonly, getter=isFrozen) BOOL frozen; - -/** - Returns a frozen (immutable) snapshot of this Realm. - - A frozen Realm is an immutable snapshot view of a particular version of a - Realm's data. Unlike normal RLMRealm instances, it does not live-update to - reflect writes made to the Realm, and can be accessed from any thread. Writing - to a frozen Realm is not allowed, and attempting to begin a write transaction - will throw an exception. - - All objects and collections read from a frozen Realm will also be frozen. - */ -- (RLMRealm *)freeze NS_RETURNS_RETAINED; - -/** - Returns a live reference of this Realm. - - All objects and collections read from the returned Realm will no longer be frozen. - This method will return `self` if it is not already frozen. - */ -- (RLMRealm *)thaw; - -#pragma mark - File Management - -/** - Writes a compacted and optionally encrypted copy of the Realm to the given local URL. - - The destination file cannot already exist. - - Note that if this method is called from within a write transaction, the - *current* data is written, not the data from the point when the previous write - transaction was committed. - - @param fileURL Local URL to save the Realm to. - @param key Optional 64-byte encryption key to encrypt the new file with. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return `YES` if the Realm was successfully written to disk, `NO` if an error occurred. - */ -- (BOOL)writeCopyToURL:(NSURL *)fileURL encryptionKey:(nullable NSData *)key error:(NSError **)error; - -/** - Writes a copy of the Realm to a given location specified by a given configuration. - - If the configuration supplied is derived from a `RLMUser` then this Realm will be copied with - sync functionality enabled. - - The destination file cannot already exist. - - @param configuration A Realm Configuration. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return `YES` if the Realm was successfully written to disk, `NO` if an error occurred. - */ -- (BOOL)writeCopyForConfiguration:(RLMRealmConfiguration *)configuration error:(NSError **)error; - -/** - Checks if the Realm file for the given configuration exists locally on disk. - - For non-synchronized, non-in-memory Realms, this is equivalent to - `-[NSFileManager.defaultManager fileExistsAtPath:config.path]`. For - synchronized Realms, it takes care of computing the actual path on disk based - on the server, virtual path, and user as is done when opening the Realm. - - @param config A Realm configuration to check the existence of. - @return YES if the Realm file for the given configuration exists on disk, NO otherwise. - */ -+ (BOOL)fileExistsForConfiguration:(RLMRealmConfiguration *)config; - -/** - Deletes the local Realm file and associated temporary files for the given configuration. - - This deletes the ".realm", ".note" and ".management" files which would be - created by opening the Realm with the given configuration. It does not delete - the ".lock" file (which contains no persisted data and is recreated from - scratch every time the Realm file is opened). - - The Realm must not be currently open on any thread or in another process. If - it is, this will return NO and report the error RLMErrorAlreadyOpen. Attempting to open - the Realm on another thread while the deletion is happening will block (and - then create a new Realm and open that afterwards). - - If the Realm already does not exist this will return `NO` and report the error NSFileNoSuchFileError; - - @param config A Realm configuration identifying the Realm to be deleted. - @return YES if any files were deleted, NO otherwise. - */ -+ (BOOL)deleteFilesForConfiguration:(RLMRealmConfiguration *)config error:(NSError **)error - __attribute__((swift_error(nonnull_error))); - -#pragma mark - Notifications - -/** - The type of a block to run whenever the data within the Realm is modified. - - @see `-[RLMRealm addNotificationBlock:]` - */ -typedef void (^RLMNotificationBlock)(RLMNotification notification, RLMRealm *realm); - -#pragma mark - Receiving Notification when a Realm Changes - -/** - Adds a notification handler for changes in this Realm, and returns a notification token. - - Notification handlers are called after each write transaction is committed, - either on the current thread or other threads. - - Handler blocks are called on the same thread that they were added on, and may - only be added on threads which are currently within a run loop. Unless you are - specifically creating and running a run loop on a background thread, this will - normally only be the main thread. - - The block has the following definition: - - typedef void(^RLMNotificationBlock)(RLMNotification notification, RLMRealm *realm); - - It receives the following parameters: - - - `NSString` \***notification**: The name of the incoming notification. See - `RLMRealmNotification` for information on what - notifications are sent. - - `RLMRealm` \***realm**: The Realm for which this notification occurred. - - @param block A block which is called to process Realm notifications. - - @return A token object which must be retained as long as you wish to continue - receiving change notifications. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMNotificationBlock)block __attribute__((warn_unused_result)); - -#pragma mark - Writing to a Realm - -/** - Begins a write transaction on the Realm. - - Only one write transaction can be open at a time for each Realm file. Write - transactions cannot be nested, and trying to begin a write transaction on a - Realm which is already in a write transaction will throw an exception. Calls to - `beginWriteTransaction` from `RLMRealm` instances for the same Realm file in - other threads or other processes will block until the current write transaction - completes or is cancelled. - - Before beginning the write transaction, `beginWriteTransaction` updates the - `RLMRealm` instance to the latest Realm version, as if `refresh` had been - called, and generates notifications if applicable. This has no effect if the - Realm was already up to date. - - It is rarely a good idea to have write transactions span multiple cycles of - the run loop, but if you do wish to do so you will need to ensure that the - Realm participating in the write transaction is kept alive until the write - transaction is committed. - */ -- (void)beginWriteTransaction; - -/** - Commits all write operations in the current write transaction, and ends the - transaction. - - After saving the changes, all notification blocks registered on this specific - `RLMRealm` instance are invoked synchronously. Notification blocks registered - on other threads or on collections are invoked asynchronously. If you do not - want to receive a specific notification for this write tranaction, see - `commitWriteTransactionWithoutNotifying:error:`. - - This method can fail if there is insufficient disk space available to save the - writes made, or due to unexpected i/o errors. This version of the method throws - an exception when errors occur. Use the version with a `NSError` out parameter - instead if you wish to handle errors. - - @warning This method may only be called during a write transaction. - */ -- (void)commitWriteTransaction NS_SWIFT_UNAVAILABLE(""); - -/** - Commits all write operations in the current write transaction, and ends the - transaction. - - After saving the changes, all notification blocks registered on this specific - `RLMRealm` instance are invoked synchronously. Notification blocks registered - on other threads or on collections are invoked asynchronously. If you do not - want to receive a specific notification for this write tranaction, see - `commitWriteTransactionWithoutNotifying:error:`. - - This method can fail if there is insufficient disk space available to save the - writes made, or due to unexpected i/o errors. - - @warning This method may only be called during a write transaction. - - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return Whether the transaction succeeded. - */ -- (BOOL)commitWriteTransaction:(NSError **)error; - -/** - Commits all write operations in the current write transaction, without - notifying specific notification blocks of the changes. - - After saving the changes, all notification blocks registered on this specific - `RLMRealm` instance are invoked synchronously. Notification blocks registered - on other threads or on collections are scheduled to be invoked asynchronously. - - You can skip notifiying specific notification blocks about the changes made - in this write transaction by passing in their associated notification tokens. - This is primarily useful when the write transaction is saving changes already - made in the UI and you do not want to have the notification block attempt to - re-apply the same changes. - - The tokens passed to this method must be for notifications for this specific - `RLMRealm` instance. Notifications for different threads cannot be skipped - using this method. - - This method can fail if there is insufficient disk space available to save the - writes made, or due to unexpected i/o errors. - - @warning This method may only be called during a write transaction. - - @param tokens An array of notification tokens which were returned from adding - callbacks which you do not want to be notified for the changes - made in this write transaction. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return Whether the transaction succeeded. - */ -- (BOOL)commitWriteTransactionWithoutNotifying:(NSArray *)tokens error:(NSError **)error; - -/** - Reverts all writes made during the current write transaction and ends the transaction. - - This rolls back all objects in the Realm to the state they were in at the - beginning of the write transaction, and then ends the transaction. - - This restores the data for deleted objects, but does not revive invalidated - object instances. Any `RLMObject`s which were added to the Realm will be - invalidated rather than becoming unmanaged. - Given the following code: - - ObjectType *oldObject = [[ObjectType objectsWhere:@"..."] firstObject]; - ObjectType *newObject = [[ObjectType alloc] init]; - - [realm beginWriteTransaction]; - [realm addObject:newObject]; - [realm deleteObject:oldObject]; - [realm cancelWriteTransaction]; - - Both `oldObject` and `newObject` will return `YES` for `isInvalidated`, - but re-running the query which provided `oldObject` will once again return - the valid object. - - KVO observers on any objects which were modified during the transaction will - be notified about the change back to their initial values, but no other - notifications are produced by a cancelled write transaction. - - @warning This method may only be called during a write transaction. - */ -- (void)cancelWriteTransaction; - -/** - Performs actions contained within the given block inside a write transaction. - - @see `[RLMRealm transactionWithoutNotifying:block:error:]` - */ -- (void)transactionWithBlock:(__attribute__((noescape)) void(^)(void))block NS_SWIFT_UNAVAILABLE(""); - -/** - Performs actions contained within the given block inside a write transaction. - - @see `[RLMRealm transactionWithoutNotifying:block:error:]` - */ -- (BOOL)transactionWithBlock:(__attribute__((noescape)) void(^)(void))block error:(NSError **)error; - -/** - Performs actions contained within the given block inside a write transaction. - - @see `[RLMRealm transactionWithoutNotifying:block:error:]` - */ -- (void)transactionWithoutNotifying:(NSArray *)tokens block:(__attribute__((noescape)) void(^)(void))block; - -/** - Performs actions contained within the given block inside a write transaction. - - Write transactions cannot be nested, and trying to execute a write transaction - on a Realm which is already participating in a write transaction will throw an - exception. Calls to `transactionWithBlock:` from `RLMRealm` instances in other - threads will block until the current write transaction completes. - - Before beginning the write transaction, `transactionWithBlock:` updates the - `RLMRealm` instance to the latest Realm version, as if `refresh` had been called, and - generates notifications if applicable. This has no effect if the Realm - was already up to date. - - You can skip notifiying specific notification blocks about the changes made - in this write transaction by passing in their associated notification tokens. - This is primarily useful when the write transaction is saving changes already - made in the UI and you do not want to have the notification block attempt to - re-apply the same changes. - - The tokens passed to this method must be for notifications for this specific - `RLMRealm` instance. Notifications for different threads cannot be skipped - using this method. - - @param tokens An array of notification tokens which were returned from adding - callbacks which you do not want to be notified for the changes - made in this write transaction. - @param block The block containing actions to perform. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return Whether the transaction succeeded. - */ -- (BOOL)transactionWithoutNotifying:(NSArray *)tokens block:(__attribute__((noescape)) void(^)(void))block error:(NSError **)error; - -/** - Indicates if the Realm is currently performing async write operations. - This becomes YES following a call to `beginAsyncWriteTransaction`, - `commitAsyncWriteTransaction`, or `asyncTransactionWithBlock:`, and remains so - until all scheduled async write work has completed. - - @warning If this is `YES`, closing or invalidating the Realm will block until scheduled work has completed. - */ -@property (nonatomic, readonly) BOOL isPerformingAsynchronousWriteOperations; - -/** - Begins an asynchronous write transaction. - This function asynchronously begins a write transaction on a background - thread, and then invokes the block on the original thread or queue once the - transaction has begun. Unlike `beginWriteTransaction`, this does not block the - calling thread if another thread is current inside a write transaction, and - will always return immediately. - Multiple calls to this function (or the other functions which perform - asynchronous write transactions) will queue the blocks to be called in the - same order as they were queued. This includes calls from inside a write - transaction block, which unlike with synchronous transactions are allowed. - - @param block The block containing actions to perform inside the write transaction. - `block` should end by calling `commitAsyncWriteTransaction`, - `commitWriteTransaction` or `cancelWriteTransaction`. - Returning without one of these calls is equivalent to calling `cancelWriteTransaction`. - - @return An id identifying the asynchronous transaction which can be passed to - `cancelAsyncTransaction:` prior to the block being called to cancel - the pending invocation of the block. - */ -- (RLMAsyncTransactionId)beginAsyncWriteTransaction:(void(^)(void))block; - -/** - Asynchronously commits a write transaction. - The call returns immediately allowing the caller to proceed while the I/O is - performed on a dedicated background thread. This can be used regardless of if - the write transaction was begun with `beginWriteTransaction` or - `beginAsyncWriteTransaction`. - - @param completionBlock A block which will be called on the source thread or - queue once the commit has either completed or failed - with an error. - - @param allowGrouping If `YES`, multiple sequential calls to - `commitAsyncWriteTransaction:` may be batched together - and persisted to stable storage in one group. This - improves write performance, particularly when the - individual transactions being batched are small. In the - event of a crash or power failure, either all of the - grouped transactions will be lost or none will, rather - than the usual guarantee that data has been persisted as - soon as a call to commit has returned. - - @return An id identifying the asynchronous transaction commit can be passed to - `cancelAsyncTransaction:` prior to the completion block being called - to cancel the pending invocation of the block. Note that this does - *not* cancel the commit itself. -*/ -- (RLMAsyncTransactionId)commitAsyncWriteTransaction:(nullable void(^)(NSError *_Nullable))completionBlock - allowGrouping:(BOOL)allowGrouping; - -/** - Asynchronously commits a write transaction. - The call returns immediately allowing the caller to proceed while the I/O is - performed on a dedicated background thread. This can be used regardless of if - the write transaction was begun with `beginWriteTransaction` or - `beginAsyncWriteTransaction`. - - @param completionBlock A block which will be called on the source thread or - queue once the commit has either completed or failed - with an error. - - @return An id identifying the asynchronous transaction commit can be passed to - `cancelAsyncTransaction:` prior to the completion block being called - to cancel the pending invocation of the block. Note that this does - *not* cancel the commit itself. -*/ -- (RLMAsyncTransactionId)commitAsyncWriteTransaction:(void(^)(NSError *_Nullable))completionBlock; - -/** - Asynchronously commits a write transaction. - The call returns immediately allowing the caller to proceed while the I/O is - performed on a dedicated background thread. This can be used regardless of if - the write transaction was begun with `beginWriteTransaction` or - `beginAsyncWriteTransaction`. - - @return An id identifying the asynchronous transaction commit can be passed to - `cancelAsyncTransaction:` prior to the completion block being called - to cancel the pending invocation of the block. Note that this does - *not* cancel the commit itself. -*/ -- (RLMAsyncTransactionId)commitAsyncWriteTransaction; - -/** - Cancels a queued block for an asynchronous transaction. - This can cancel a block passed to either an asynchronous begin or an - asynchronous commit. Canceling a begin cancels that transaction entirely, - while canceling a commit merely cancels the invocation of the completion - callback, and the commit will still happen. - Transactions can only be canceled before the block is invoked, and calling - `cancelAsyncTransaction:` from within the block is a no-op. - - @param asyncTransactionId A transaction id from either `beginAsyncWriteTransaction:` or `commitAsyncWriteTransaction:`. -*/ -- (void)cancelAsyncTransaction:(RLMAsyncTransactionId)asyncTransactionId; - -/** - Asynchronously performs actions contained within the given block inside a - write transaction. - The write transaction is begun asynchronously as if calling - `beginAsyncWriteTransaction:`, and by default the transaction is commited - asynchronously after the block completes. You can also explicitly call - `commitWriteTransaction` or `cancelWriteTransaction` from within the block to - synchronously commit or cancel the write transaction. - - @param block The block containing actions to perform. - - @param completionBlock A block which will be called on the source thread or - queue once the commit has either completed or failed - with an error. - - @return An id identifying the asynchronous transaction which can be passed to - `cancelAsyncTransaction:` prior to the block being called to cancel - the pending invocation of the block. -*/ -- (RLMAsyncTransactionId)asyncTransactionWithBlock:(void(^)(void))block onComplete:(nullable void(^)(NSError *))completionBlock; - -/** - Asynchronously performs actions contained within the given block inside a - write transaction. - The write transaction is begun asynchronously as if calling - `beginAsyncWriteTransaction:`, and by default the transaction is commited - asynchronously after the block completes. You can also explicitly call - `commitWriteTransaction` or `cancelWriteTransaction` from within the block to - synchronously commit or cancel the write transaction. - - @param block The block containing actions to perform. - - @return An id identifying the asynchronous transaction which can be passed to - `cancelAsyncTransaction:` prior to the block being called to cancel - the pending invocation of the block. -*/ -- (RLMAsyncTransactionId)asyncTransactionWithBlock:(void(^)(void))block; - -/** - Updates the Realm and outstanding objects managed by the Realm to point to the - most recent data. - - If the version of the Realm is actually changed, Realm and collection - notifications will be sent to reflect the changes. This may take some time, as - collection notifications are prepared on a background thread. As a result, - calling this method on the main thread is not advisable. - - @return Whether there were any updates for the Realm. Note that `YES` may be - returned even if no data actually changed. - */ -- (BOOL)refresh; - -/** - Set this property to `YES` to automatically update this Realm when changes - happen in other threads. - - If set to `YES` (the default), changes made on other threads will be reflected - in this Realm on the next cycle of the run loop after the changes are - committed. If set to `NO`, you must manually call `-refresh` on the Realm to - update it to get the latest data. - - Note that by default, background threads do not have an active run loop and you - will need to manually call `-refresh` in order to update to the latest version, - even if `autorefresh` is set to `YES`. - - Even with this property enabled, you can still call `-refresh` at any time to - update the Realm before the automatic refresh would occur. - - Write transactions will still always advance a Realm to the latest version and - produce local notifications on commit even if autorefresh is disabled. - - Disabling `autorefresh` on a Realm without any strong references to it will not - have any effect, and `autorefresh` will revert back to `YES` the next time the - Realm is created. This is normally irrelevant as it means that there is nothing - to refresh (as managed `RLMObject`s, `RLMArray`s, and `RLMResults` have strong - references to the Realm that manages them), but it means that setting - `RLMRealm.defaultRealm.autorefresh = NO` in - `application:didFinishLaunchingWithOptions:` and only later storing Realm - objects will not work. - - Defaults to `YES`. - */ -@property (nonatomic) BOOL autorefresh; - -/** - Invalidates all `RLMObject`s, `RLMResults`, `RLMLinkingObjects`, and `RLMArray`s managed by the Realm. - - A Realm holds a read lock on the version of the data accessed by it, so - that changes made to the Realm on different threads do not modify or delete the - data seen by this Realm. Calling this method releases the read lock, - allowing the space used on disk to be reused by later write transactions rather - than growing the file. This method should be called before performing long - blocking operations on a background thread on which you previously read data - from the Realm which you no longer need. - - All `RLMObject`, `RLMResults` and `RLMArray` instances obtained from this - `RLMRealm` instance on the current thread are invalidated. `RLMObject`s and `RLMArray`s - cannot be used. `RLMResults` will become empty. The Realm itself remains valid, - and a new read transaction is implicitly begun the next time data is read from the Realm. - - Calling this method multiple times in a row without reading any data from the - Realm, or before ever reading any data from the Realm, is a no-op. - */ -- (void)invalidate; - -#pragma mark - Accessing Objects - -/** - Returns the same object as the one referenced when the `RLMThreadSafeReference` was first created, - but resolved for the current Realm for this thread. Returns `nil` if this object was deleted after - the reference was created. - - @param reference The thread-safe reference to the thread-confined object to resolve in this Realm. - - @warning A `RLMThreadSafeReference` object must be resolved at most once. - Failing to resolve a `RLMThreadSafeReference` will result in the source version of the - Realm being pinned until the reference is deallocated. - An exception will be thrown if a reference is resolved more than once. - - @warning Cannot call within a write transaction. - - @note Will refresh this Realm if the source Realm was at a later version than this one. - - @see `+[RLMThreadSafeReference referenceWithThreadConfined:]` - */ -- (nullable id)resolveThreadSafeReference:(RLMThreadSafeReference *)reference -NS_REFINED_FOR_SWIFT; - -#pragma mark - Adding and Removing Objects from a Realm - -/** - Adds an object to the Realm. - - Once added, this object is considered to be managed by the Realm. It can be retrieved - using the `objectsWhere:` selectors on `RLMRealm` and on subclasses of `RLMObject`. - - When added, all child relationships referenced by this object will also be added to - the Realm if they are not already in it. - - If the object or any related objects are already being managed by a different Realm - an exception will be thrown. Use `-[RLMObject createInRealm:withObject:]` to insert a copy of a managed object - into a different Realm. - - The object to be added must be valid and cannot have been previously deleted - from a Realm (i.e. `isInvalidated` must be `NO`). - - @warning This method may only be called during a write transaction. - - @param object The object to be added to this Realm. - */ -- (void)addObject:(RLMObject *)object; - -/** - Adds all the objects in a collection to the Realm. - - This is the equivalent of calling `addObject:` for every object in a collection. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable collection such as `NSArray`, `RLMArray`, or `RLMResults`, - containing Realm objects to be added to the Realm. - - @see `addObject:` - */ -- (void)addObjects:(id)objects; - -/** - Adds or updates an existing object into the Realm. - - The object provided must have a designated primary key. If no objects exist in the Realm - with the same primary key value, the object is inserted. Otherwise, the existing object is - updated with any changed values. - - As with `addObject:`, the object cannot already be managed by a different - Realm. Use `-[RLMObject createOrUpdateInRealm:withValue:]` to copy values to - a different Realm. - - If there is a property or KVC value on `object` whose value is nil, and it corresponds - to a nullable property on an existing object being updated, that nullable property will - be set to nil. - - @warning This method may only be called during a write transaction. - - @param object The object to be added or updated. - */ -- (void)addOrUpdateObject:(RLMObject *)object; - -/** - Adds or updates all the objects in a collection into the Realm. - - This is the equivalent of calling `addOrUpdateObject:` for every object in a collection. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable collection such as `NSArray`, `RLMArray`, or `RLMResults`, - containing Realm objects to be added to or updated within the Realm. - - @see `addOrUpdateObject:` - */ -- (void)addOrUpdateObjects:(id)objects; - -/** - Deletes an object from the Realm. Once the object is deleted it is considered invalidated. - - @warning This method may only be called during a write transaction. - - @param object The object to be deleted. - */ -- (void)deleteObject:(RLMObject *)object; - -/** - Deletes one or more objects from the Realm. - - This is the equivalent of calling `deleteObject:` for every object in a collection. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable collection such as `NSArray`, `RLMArray`, or `RLMResults`, - containing objects to be deleted from the Realm. - - @see `deleteObject:` - */ -- (void)deleteObjects:(id)objects; - -/** - Deletes all objects from the Realm. - - @warning This method may only be called during a write transaction. - - @see `deleteObject:` - */ -- (void)deleteAllObjects; - -#pragma mark - Sync Subscriptions - -/** - Represents the active subscriptions for this realm, which can be used to add/remove/update - and search flexible sync subscriptions. - Getting the subscriptions from a local or partition-based configured realm will thrown an exception. - - @warning This feature is currently in beta and its API is subject to change. - */ -@property (nonatomic, readonly, nonnull) RLMSyncSubscriptionSet *subscriptions; - - -#pragma mark - Migrations - -/** - The type of a migration block used to migrate a Realm. - - @param migration A `RLMMigration` object used to perform the migration. The - migration object allows you to enumerate and alter any - existing objects which require migration. - - @param oldSchemaVersion The schema version of the Realm being migrated. - */ -RLM_SWIFT_SENDABLE -typedef void (^RLMMigrationBlock)(RLMMigration *migration, uint64_t oldSchemaVersion); - -/** - Returns the schema version for a Realm at a given local URL. - - @param fileURL Local URL to a Realm file. - @param key 64-byte key used to encrypt the file, or `nil` if it is unencrypted. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return The version of the Realm at `fileURL`, or `RLMNotVersioned` if the version cannot be read. - */ -+ (uint64_t)schemaVersionAtURL:(NSURL *)fileURL encryptionKey:(nullable NSData *)key - error:(NSError **)error -NS_REFINED_FOR_SWIFT; - -/** - Performs the given Realm configuration's migration block on a Realm at the given path. - - This method is called automatically when opening a Realm for the first time and does - not need to be called explicitly. You can choose to call this method to control - exactly when and how migrations are performed. - - @param configuration The Realm configuration used to open and migrate the Realm. - @return The error that occurred while applying the migration, if any. - - @see RLMMigration - */ -+ (BOOL)performMigrationForConfiguration:(RLMRealmConfiguration *)configuration error:(NSError **)error; - -#pragma mark - Unavailable Methods - -/** - RLMRealm instances are cached internally by Realm and cannot be created directly. - - Use `+[RLMRealm defaultRealm]`, `+[RLMRealm realmWithConfiguration:error:]` or - `+[RLMRealm realmWithURL]` to obtain a reference to an RLMRealm. - */ -- (instancetype)init __attribute__((unavailable("Use +defaultRealm, +realmWithConfiguration: or +realmWithURL:."))); - -/** - RLMRealm instances are cached internally by Realm and cannot be created directly. - - Use `+[RLMRealm defaultRealm]`, `+[RLMRealm realmWithConfiguration:error:]` or - `+[RLMRealm realmWithURL]` to obtain a reference to an RLMRealm. - */ -+ (instancetype)new __attribute__((unavailable("Use +defaultRealm, +realmWithConfiguration: or +realmWithURL:."))); - -/// :nodoc: -- (void)addOrUpdateObjectsFromArray:(id)array __attribute__((unavailable("Renamed to -addOrUpdateObjects:."))); - -@end - -// MARK: - RLMNotificationToken - -/** - A token which is returned from methods which subscribe to changes to a Realm. - - Change subscriptions in Realm return an `RLMNotificationToken` instance, - which can be used to unsubscribe from the changes. You must store a strong - reference to the token for as long as you want to continue to receive notifications. - When you wish to stop, call the `-invalidate` method. Notifications are also stopped if - the token is deallocated. - */ -RLM_SWIFT_SENDABLE // is internally thread-safe -@interface RLMNotificationToken : NSObject -/// Stops notifications for the change subscription that returned this token. -/// -/// @return True if the token was previously valid, and false if it was already invalidated. -- (bool)invalidate; - -/// Stops notifications for the change subscription that returned this token. -- (void)stop __attribute__((unavailable("Renamed to -invalidate."))) NS_REFINED_FOR_SWIFT; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMRealmConfiguration.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMRealmConfiguration.h deleted file mode 100644 index d09e5c215..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMRealmConfiguration.h +++ /dev/null @@ -1,197 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2015 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMEventConfiguration, RLMSyncConfiguration; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A block called when opening a Realm for the first time during the life - of a process to determine if it should be compacted before being returned - to the user. It is passed the total file size (data + free space) and the total - bytes used by data in the file. - - Return `YES` to indicate that an attempt to compact the file should be made. - The compaction will be skipped if another process is accessing it. - */ -RLM_SWIFT_SENDABLE -typedef BOOL (^RLMShouldCompactOnLaunchBlock)(NSUInteger totalBytes, NSUInteger bytesUsed); - -/** - A block which receives a subscription set instance, that can be used to add an initial set of subscriptions which will be executed - when the Realm is first opened. - */ -RLM_SWIFT_SENDABLE -typedef void(^RLMFlexibleSyncInitialSubscriptionsBlock)(RLMSyncSubscriptionSet * _Nonnull subscriptions); - -/** - An `RLMRealmConfiguration` instance describes the different options used to - create an instance of a Realm. - - `RLMRealmConfiguration` instances are just plain `NSObject`s. Unlike `RLMRealm`s - and `RLMObject`s, they can be freely shared between threads as long as you do not - mutate them. - - Creating configuration objects for class subsets (by setting the - `objectClasses` property) can be expensive. Because of this, you will normally want to - cache and reuse a single configuration object for each distinct configuration rather than - creating a new object each time you open a Realm. - */ -@interface RLMRealmConfiguration : NSObject - -#pragma mark - Default Configuration - -/** - Returns the default configuration used to create Realms when no other - configuration is explicitly specified (i.e. `+[RLMRealm defaultRealm]`). - - @return The default Realm configuration. - */ -+ (instancetype)defaultConfiguration; - -/** - Sets the default configuration to the given `RLMRealmConfiguration`. - - @param configuration The new default Realm configuration. - */ -+ (void)setDefaultConfiguration:(RLMRealmConfiguration *)configuration; - -#pragma mark - Properties - -/// The local URL of the Realm file. Mutually exclusive with `inMemoryIdentifier`; -/// setting one of the two properties will automatically nil out the other. -@property (nonatomic, copy, nullable) NSURL *fileURL; - -/// A string used to identify a particular in-memory Realm. Mutually exclusive with `fileURL`, -/// `seedFilePath`and `syncConfiguration`; -/// setting any one of the three properties will automatically nil out the other two. -@property (nonatomic, copy, nullable) NSString *inMemoryIdentifier; - -/// A 64-byte key to use to encrypt the data, or `nil` if encryption is not enabled. -@property (nonatomic, copy, nullable) NSData *encryptionKey; - -/// Whether to open the Realm in read-only mode. -/// -/// For non-synchronized Realms, this is required to be able to open Realm -/// files which are not writeable or are in a directory which is not writeable. -/// This should only be used on files which will not be modified by anyone -/// while they are open, and not just to get a read-only view of a file which -/// may be written to by another thread or process. Opening in read-only mode -/// requires disabling Realm's reader/writer coordination, so committing a -/// write transaction from another process will result in crashes. -/// -/// Syncronized Realms must always be writeable (as otherwise no -/// synchronization could happen), and this instead merely disallows performing -/// write transactions on the Realm. In addition, it will skip some automatic -/// writes made to the Realm, such as to initialize the Realm's schema. Setting -/// `readOnly = YES` is not strictly required for Realms which the sync user -/// does not have write access to, but is highly recommended as it will improve -/// error reporting and catch some errors earlier. -/// -/// Realms using query-based sync cannot be opened in read-only mode. -@property (nonatomic) BOOL readOnly; - -/// The current schema version. -@property (nonatomic) uint64_t schemaVersion; - -/// The block which migrates the Realm to the current version. -@property (nonatomic, copy, nullable) RLMMigrationBlock migrationBlock; - -/** - Whether to recreate the Realm file with the provided schema if a migration is required. - This is the case when the stored schema differs from the provided schema or - the stored schema version differs from the version on this configuration. - Setting this property to `YES` deletes the file if a migration would otherwise be required or executed. - - @note Setting this property to `YES` doesn't disable file format migrations. - */ -@property (nonatomic) BOOL deleteRealmIfMigrationNeeded; - -/** - A block called when opening a Realm for the first time during the life - of a process to determine if it should be compacted before being returned - to the user. It is passed the total file size (data + free space) and the total - bytes used by data in the file. - - Return `YES` to indicate that an attempt to compact the file should be made. - The compaction will be skipped if another process is accessing it. - */ -@property (nonatomic, copy, nullable) RLMShouldCompactOnLaunchBlock shouldCompactOnLaunch; - -/// The classes managed by the Realm. -@property (nonatomic, copy, nullable) NSArray *objectClasses; - -/** - The maximum number of live versions in the Realm file before an exception will - be thrown when attempting to start a write transaction. - - Realm provides MVCC snapshot isolation, meaning that writes on one thread do - not overwrite data being read on another thread, and instead write a new copy - of that data. When a Realm refreshes it updates to the latest version of the - data and releases the old versions, allowing them to be overwritten by - subsequent write transactions. - - Under normal circumstances this is not a problem, but if the number of active - versions grow too large, it will have a negative effect on the filesize on - disk. This can happen when performing writes on many different threads at - once, when holding on to frozen objects for an extended time, or when - performing long operations on background threads which do not allow the Realm - to refresh. - - Setting this property to a non-zero value makes it so that exceeding the set - number of versions will instead throw an exception. This can be used with a - low value during development to help identify places that may be problematic, - or in production use to cause the app to crash rather than produce a Realm - file which is too large to be opened. - - */ -@property (nonatomic) NSUInteger maximumNumberOfActiveVersions; - -/** - When opening the Realm for the first time, instead of creating an empty file, - the Realm file will be copied from the provided seed file path and used instead. - This can be used to open a Realm file with pre-populated data. - - If a realm file already exists at the configuration's destination path, the seed file - will not be copied and the already existing realm will be opened instead. - - Note that to use this parameter with a synced Realm configuration - the seed Realm must be appropriately copied to a destination with - `[RLMRealm writeCopyForConfiguration:]` first. - - This option is mutually exclusive with `inMemoryIdentifier`. Setting a `seedFilePath` - will nil out the `inMemoryIdentifier`. - */ -@property (nonatomic, copy, nullable) NSURL *seedFilePath; - -/** - A configuration object representing configuration state for Realms intended - to sync with Atlas Device Sync. - - This property is mutually exclusive with both `inMemoryIdentifier` and `fileURL`; - setting any one of the three properties will automatically nil out the other two. - - @see `RLMSyncConfiguration` - */ -@property (nullable, nonatomic) RLMSyncConfiguration *syncConfiguration; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMRealm_Dynamic.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMRealm_Dynamic.h deleted file mode 100644 index bea162775..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMRealm_Dynamic.h +++ /dev/null @@ -1,118 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import -#import - -@class RLMResults; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMRealm (Dynamic) - -#pragma mark - Getting Objects from a Realm - -/** - Returns all objects of a given type from the Realm. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. The preferred way to get objects of a single class is to use the class - methods on `RLMObject`. - - @param className The name of the `RLMObject` subclass to retrieve on (e.g. `MyClass.className`). - - @return An `RLMResults` containing all objects in the Realm of the given type. - - @see `+[RLMObject allObjects]` - */ -- (RLMResults *)allObjects:(NSString *)className; - -/** - Returns all objects matching the given predicate from the Realm. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. The preferred way to get objects of a single class is to use the class - methods on `RLMObject`. - - @param className The type of objects you are looking for (name of the class). - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` containing results matching the given predicate. - - @see `+[RLMObject objectsWhere:]` - */ -- (RLMResults *)objects:(NSString *)className where:(NSString *)predicateFormat, ...; - -/** - Returns all objects matching the given predicate from the Realm. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. The preferred way to get objects of a single class is to use the class - methods on `RLMObject`. - - @param className The type of objects you are looking for (name of the class). - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` containing results matching the given predicate. - - @see `+[RLMObject objectsWhere:]` - */ -- (RLMResults *)objects:(NSString *)className withPredicate:(NSPredicate *)predicate; - -/** - Returns the object of the given type with the given primary key from the Realm. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. The preferred way to get an object of a single class is to use the class - methods on `RLMObject`. - - @param className The class name for the object you are looking for. - @param primaryKey The primary key value for the object you are looking for. - - @return An object, or `nil` if an object with the given primary key does not exist. - - @see `+[RLMObject objectForPrimaryKey:]` - */ -- (nullable RLMObject *)objectWithClassName:(NSString *)className forPrimaryKey:(id)primaryKey; - -/** - Creates an `RLMObject` instance of type `className` in the Realm, and populates it using a given object. - - The `value` argument is used to populate the object. It can be a key-value coding compliant object, an array or - dictionary returned from the methods in `NSJSONSerialization`, or an array containing one element for each managed - property. An exception will be thrown if any required properties are not present and those properties were not defined - with default values. - - When passing in an array as the `value` argument, all properties must be present, valid and in the same order as the - properties defined in the model. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is recommended to - use `[RLMObject createInDefaultRealmWithValue:]`. - - @param value The value used to populate the object. - - @return An `RLMObject` instance of type `className`. - */ --(RLMObject *)createObject:(NSString *)className withValue:(id)value; - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMResults.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMResults.h deleted file mode 100644 index 5911e666a..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMResults.h +++ /dev/null @@ -1,567 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObject; - -/** - `RLMResults` is an auto-updating container type in Realm returned from object - queries. It represents the results of the query in the form of a collection of objects. - - `RLMResults` can be queried using the same predicates as `RLMObject` and `RLMArray`, - and you can chain queries to further filter results. - - `RLMResults` always reflect the current state of the Realm on the current thread, - including during write transactions on the current thread. The one exception to - this is when using `for...in` fast enumeration, which will always enumerate - over the objects which matched the query when the enumeration is begun, even if - some of them are deleted or modified to be excluded by the filter during the - enumeration. - - `RLMResults` are lazily evaluated the first time they are accessed; they only - run queries when the result of the query is requested. This means that - chaining several temporary `RLMResults` to sort and filter your data does not - perform any extra work processing the intermediate state. - - Once the results have been evaluated or a notification block has been added, - the results are eagerly kept up-to-date, with the work done to keep them - up-to-date done on a background thread whenever possible. - - `RLMResults` cannot be directly instantiated. - */ -@interface RLMResults : NSObject - -#pragma mark - Properties - -/** - The number of objects in the results collection. - */ -@property (nonatomic, readonly, assign) NSUInteger count; - -/** - The type of the objects in the results collection. - */ -@property (nonatomic, readonly, assign) RLMPropertyType type; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readwrite, getter = isOptional) BOOL optional; - -/** - The class name of the objects contained in the results collection. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages this results collection. - */ -@property (nonatomic, readonly) RLMRealm *realm; - -/** - Indicates if the results collection is no longer valid. - - The results collection becomes invalid if `invalidate` is called on the containing `realm`. - An invalidated results collection can be accessed, but will always be empty. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -#pragma mark - Accessing Objects from an RLMResults - -/** - Returns the object at the index specified. - - @param index The index to look up. - - @return An object of the type contained in the results collection. - */ -- (RLMObjectType)objectAtIndex:(NSUInteger)index; - -/** - Returns an array containing the objects in the results at the indexes specified by a given index set. - `nil` will be returned if the index set contains an index out of the arrays bounds. - - @param indexes The indexes in the results to retrieve objects from. - - @return The objects at the specified indexes. - */ -- (nullable NSArray *)objectsAtIndexes:(NSIndexSet *)indexes; - -/** - Returns the first object in the results collection. - - Returns `nil` if called on an empty results collection. - - @return An object of the type contained in the results collection. - */ -- (nullable RLMObjectType)firstObject; - -/** - Returns the last object in the results collection. - - Returns `nil` if called on an empty results collection. - - @return An object of the type contained in the results collection. - */ -- (nullable RLMObjectType)lastObject; - -#pragma mark - Querying Results - -/** - Returns the index of an object in the results collection. - - Returns `NSNotFound` if the object is not found in the results collection. - - @param object An object (of the same type as returned from the `objectClassName` selector). - */ -- (NSUInteger)indexOfObject:(RLMObjectType)object; - -/** - Returns the index of the first object in the results collection matching the predicate. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return The index of the object, or `NSNotFound` if the object is not found in the results collection. - */ -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns the index of the first object in the results collection matching the predicate. - - @param predicate The predicate with which to filter the objects. - - @return The index of the object, or `NSNotFound` if the object is not found in the results collection. - */ -- (NSUInteger)indexOfObjectWithPredicate:(NSPredicate *)predicate; - -/** - Returns all the objects matching the given predicate in the results collection. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` of objects that match the given predicate. - */ -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all the objects matching the given predicate in the results collection. - - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` of objects that match the given predicate. - */ -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/** - Returns a sorted `RLMResults` from an existing results collection. - - @param keyPath The key path to sort by. - @param ascending The direction to sort in. - - @return An `RLMResults` sorted by the specified key path. - */ -- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a sorted `RLMResults` from an existing results collection. - - @param properties An array of `RLMSortDescriptor`s to sort by. - - @return An `RLMResults` sorted by the specified properties. - */ -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/** - Returns a distinct `RLMResults` from an existing results collection. - - @param keyPaths The key paths used produce distinct results - - @return An `RLMResults` made distinct based on the specified key paths - */ -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -#pragma mark - Notifications - -/** - Registers a block to be called each time the results collection changes. - - The block will be asynchronously called with the initial results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the results collection were added, removed or modified. If a - write transaction did not modify any objects in the results collection, - the block is not called at all. See the `RLMCollectionChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - At the time when the block is called, the `RLMResults` object will be fully - evaluated and up-to-date, and as long as you do not perform a write transaction - on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will - never perform blocking work. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - NSLog(@"dogs.count: %zu", dogs.count); // => 0 - self.token = [results addNotificationBlock:^(RLMResults *dogs, - RLMCollectionChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - - @param block The block to be called whenever a change occurs. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the results collection changes. - - The block will be asynchronously called with the initial results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the results collection were added, removed or modified. If a - write transaction did not modify any objects in the results collection, - the block is not called at all. See the `RLMCollectionChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - At the time when the block is called, the `RLMResults` object will be fully - evaluated and up-to-date, and as long as you do not perform a write transaction - on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will - never perform blocking work. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the results collection changes. - - The block will be asynchronously called with the initial results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the results collection were added, removed or modified. If a - write transaction did not modify any objects in the results collection, - the block is not called at all. See the `RLMCollectionChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - At the time when the block is called, the `RLMResults` object will be fully - evaluated and up-to-date, and as long as you do not perform a write transaction - on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will - never perform blocking work. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the results collection changes. - - The block will be asynchronously called with the initial results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the results collection were added, removed or modified. If a - write transaction did not modify any objects in the results collection, - the block is not called at all. See the `RLMCollectionChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - At the time when the block is called, the `RLMResults` object will be fully - evaluated and up-to-date, and as long as you do not perform a write transaction - on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will - never perform blocking work. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths -__attribute__((warn_unused_result)); -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the objects - represented by the results collection. - - NSNumber *min = [results minOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose minimum value is desired. Only properties of types `int`, `float`, `double`, and - `NSDate` are supported. - - @return The minimum value of the property, or `nil` if the Results are empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects represented by the results collection. - - NSNumber *max = [results maxOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose maximum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The maximum value of the property, or `nil` if the Results are empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of the values of a given property over all the objects represented by the results collection. - - NSNumber *sum = [results sumOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose values should be summed. Only properties of - types `int`, `float`, and `double` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects represented by the results collection. - - NSNumber *average = [results averageOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose average value should be calculated. Only - properties of types `int`, `float`, and `double` are supported. - - @return The average value of the given property, or `nil` if the Results are empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -/// :nodoc: -- (RLMObjectType)objectAtIndexedSubscript:(NSUInteger)index; - -#pragma mark - Sectioned Results - -/** - Sorts and sections this collection from a given property key path, returning the result - as an instance of `RLMSectionedResults`. - - @param keyPath The property key path to sort on. - @param ascending The direction to sort in. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsSortedUsingKeyPath:(NSString *)keyPath - ascending:(BOOL)ascending - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -/** - Sorts and sections this collection from a given array of sort descriptors, returning the result - as an instance of `RLMSectionedResults`. - - @param sortDescriptors An array of `RLMSortDescriptor`s to sort by. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @note The primary sort descriptor must be responsible for determining the section key. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsUsingSortDescriptors:(NSArray *)sortDescriptors - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -#pragma mark - Freeze - -/** - Indicates if the result are frozen. - - Frozen Results are immutable and can be accessed from any thread.The objects - read from a frozen Results will also be frozen. - */ -@property (nonatomic, readonly, getter=isFrozen) BOOL frozen; - -/** - Returns a frozen (immutable) snapshot of these results. - - The frozen copy is an immutable collection which contains the same data as - this collection currently contains, but will not update when writes are made - to the containing Realm. Unlike live Results, frozen Results can be accessed - from any thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning Holding onto a frozen collection for an extended period while - performing write transaction on the Realm may result in the Realm - file growing to large sizes. See - `RLMRealmConfiguration.maximumNumberOfActiveVersions` for more - information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -#pragma mark - Unavailable Methods - -/** - `-[RLMResults init]` is not available because `RLMResults` cannot be created directly. - `RLMResults` can be obtained by querying a Realm. - */ -- (instancetype)init __attribute__((unavailable("RLMResults cannot be created directly"))); - -/** - `+[RLMResults new]` is not available because `RLMResults` cannot be created directly. - `RLMResults` can be obtained by querying a Realm. - */ -+ (instancetype)new __attribute__((unavailable("RLMResults cannot be created directly"))); - -@end - -/** - `RLMLinkingObjects` is an auto-updating container type. It represents a collection of objects that link to its - parent object. - - For more information, please see the "Inverse Relationships" section in the - [documentation](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/relationships/#relationships). - */ -@interface RLMLinkingObjects : RLMResults -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMSchema.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMSchema.h deleted file mode 100644 index fe46f6d47..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMSchema.h +++ /dev/null @@ -1,78 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectSchema; - -/** - `RLMSchema` instances represent collections of model object schemas managed by a Realm. - - When using Realm, `RLMSchema` instances allow performing migrations and - introspecting the database's schema. - - Schemas map to collections of tables in the core database. - */ -RLM_SWIFT_SENDABLE // not actually immutable, but the public API kinda is -@interface RLMSchema : NSObject - -#pragma mark - Properties - -/** - An `NSArray` containing `RLMObjectSchema`s for all object types in the Realm. - - This property is intended to be used during migrations for dynamic introspection. - - @see `RLMObjectSchema` - */ -@property (nonatomic, readonly, copy) NSArray *objectSchema; - -#pragma mark - Methods - -/** - Returns an `RLMObjectSchema` for the given class name in the schema. - - @param className The object class name. - @return An `RLMObjectSchema` for the given class in the schema. - - @see `RLMObjectSchema` - */ -- (nullable RLMObjectSchema *)schemaForClassName:(NSString *)className; - -/** - Looks up and returns an `RLMObjectSchema` for the given class name in the Realm. - - If there is no object of type `className` in the schema, an exception will be thrown. - - @param className The object class name. - @return An `RLMObjectSchema` for the given class in this Realm. - - @see `RLMObjectSchema` - */ -- (RLMObjectSchema *)objectForKeyedSubscript:(NSString *)className; - -/** - Returns whether two `RLMSchema` instances are equivalent. - */ -- (BOOL)isEqualToSchema:(RLMSchema *)schema; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMSectionedResults.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMSectionedResults.h deleted file mode 100644 index 4ee236b94..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMSectionedResults.h +++ /dev/null @@ -1,921 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2022 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@protocol RLMValue; -@class RLMResults; - -/** - A `RLMSectionedResultsChange` object encapsulates information about changes to sectioned - results that are reported by Realm notifications. - - `RLMSectionedResultsChange` is passed to the notification blocks registered with - `-addNotificationBlock` on `RLMSectionedResults`, and reports what sections and rows in the - collection changed since the last time the notification block was called. - - A complete example of updating a `UITableView` named `tv`: - - [tv beginUpdates]; - [tv deleteRowsAtIndexPaths:changes.deletions withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv insertRowsAtIndexPaths:changes.insertions withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv reloadRowsAtIndexPaths:changes.modifications withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv insertSections:changes.sectionsToInsert withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv deleteSections:changes.sectionsToRemove withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv endUpdates]; - - All of the arrays in an `RLMSectionedResultsChange` are always sorted in ascending order. - */ -@interface RLMSectionedResultsChange : NSObject -/// The index paths of objects in the previous version of the collection which have -/// been removed from this one. -@property (nonatomic, readonly) NSArray *deletions; -/// The index paths in the new version of the collection which were newly inserted. -@property (nonatomic, readonly) NSArray *insertions; -/// The index paths in the old version of the collection which were modified. -@property (nonatomic, readonly) NSArray *modifications; -/// The indices of the sections to be inserted. -@property (nonatomic, readonly) NSIndexSet *sectionsToInsert; -/// The indices of the sections to be removed. -@property (nonatomic, readonly) NSIndexSet *sectionsToRemove; -/// Returns the index paths of the deletion indices in the given section. -- (NSArray *)deletionsInSection:(NSUInteger)section; -/// Returns the index paths of the insertion indices in the given section. -- (NSArray *)insertionsInSection:(NSUInteger)section; -/// Returns the index paths of the modification indices in the given section. -- (NSArray *)modificationsInSection:(NSUInteger)section; -@end - - -/// The `RLMSectionedResult` protocol defines properties and methods common to both `RLMSectionedResults and RLMSection` -@protocol RLMSectionedResult - -#pragma mark - Object Access - -/// The count of objects in the collection. -@property (nonatomic, readonly) NSUInteger count; -/// Returns the object for a given index in the collection. -- (id)objectAtIndexedSubscript:(NSUInteger)index; -/// Returns the object for a given index in the collection. -- (id)objectAtIndex:(NSUInteger)index; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this collection. - - The frozen copy is an immutable collection which contains the same data as this - collection currently contains, but will not update when writes are made to the - containing Realm. Unlike live arrays, frozen collections can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning Holding onto a frozen collection for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; -/** - Indicates if the underlying collection is frozen. - - Frozen collections are immutable and can be accessed from any thread. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Sectioned Results Notifications - -/** - Registers a block to be called each time the collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` / `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(id, RLMSectionedResultsChange *))block __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` / `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(id, RLMSectionedResultsChange *))block - queue:(dispatch_queue_t)queue __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` / `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(id, RLMSectionedResultsChange *))block - keyPaths:(NSArray *)keyPaths __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` / `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(id, RLMSectionedResultsChange *))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue __attribute__((warn_unused_result)); - -@end - -/// An RLMSection contains the objects which belong to a specified section key. -@interface RLMSection, RLMObjectType> : NSObject -/// The value that represents the key in this section. -@property (nonatomic, readonly) RLMKeyType key; -/// The count of objects in the section. -@property (nonatomic, readonly) NSUInteger count; -/// Returns the object for a given index in the section. -- (RLMObjectType)objectAtIndexedSubscript:(NSUInteger)index; -/// Returns the object for a given index in the section. -- (RLMObjectType)objectAtIndex:(NSUInteger)index; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this section. - - The frozen copy is an immutable section which contains the same data as this - section currently contains, but will not update when writes are made to the - containing Realm. Unlike live arrays, frozen collections can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning Holding onto a frozen section for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; -/** - Returns a live version of this frozen section. - - This method resolves a reference to a live copy of the same frozen section. - If called on a live section, will return itself. -*/ -- (instancetype)thaw; -/** - Indicates if the underlying section is frozen. - - Frozen sections are immutable and can be accessed from any thread. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Section Notifications - -/** - Registers a block to be called each time the section changes. - - The block will be asynchronously called with the initial section, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - RLMSection *section = sectionedResults[0] // section with dogs aged '5' already exists. - - self.token = [section addNotificationBlock:^(RLMSection *section, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"section.count: %zu", section.count); // => 2 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSection *, RLMSectionedResultsChange *))block __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the section changes. - - The block will be asynchronously called with the initial section, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - RLMSection *section = sectionedResults[0] // section with dogs aged '5' already exists. - - self.token = [section addNotificationBlock:^(RLMSection *section, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"section.count: %zu", section.count); // => 2 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSection *, RLMSectionedResultsChange *))block - queue:(dispatch_queue_t)queue __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the section changes. - - The block will be asynchronously called with the initial section, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - RLMSection *section = sectionedResults[0] // section with dogs aged '5' already exists. - - self.token = [section addNotificationBlock:^(RLMSection *section, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"section.count: %zu", section.count); // => 2 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSection *, RLMSectionedResultsChange *))block - keyPaths:(NSArray *)keyPaths __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the section changes. - - The block will be asynchronously called with the initial section, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - RLMSection *section = sectionedResults[0] // section with dogs aged '5' already exists. - - self.token = [section addNotificationBlock:^(RLMSection *section, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"section.count: %zu", section.count); // => 2 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSection *, RLMSectionedResultsChange *))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue __attribute__((warn_unused_result)); -@end - -/// A lazily evaluated collection that holds elements in sections determined by a section key. -@interface RLMSectionedResults, RLMObjectType: id> : NSObject -/// An array of all keys in the sectioned results collection. -@property (nonatomic) NSArray *allKeys; -/// The total amount of sections in this collection. -@property (nonatomic, readonly, assign) NSUInteger count; -/// Returns the section at a given index. -- (RLMSection *)objectAtIndexedSubscript:(NSUInteger)index; -/// Returns the section at a given index. -- (RLMSection *)objectAtIndex:(NSUInteger)index; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this sectioned results collection. - - The frozen copy is an immutable sectioned results collection which contains the same data as this - sectioned results collection currently contains, but will not update when writes are made to the - containing Realm. Unlike live sectioned results collections, frozen sectioned results collection - can be accessed from any thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning Holding onto a frozen sectioned results collection for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; -/** - Returns a live version of this frozen sectioned results collection. - - This method resolves a reference to a live copy of the same frozen sectioned results collection. - If called on a live section, will return itself. -*/ -- (instancetype)thaw; -/** - Indicates if the underlying sectioned results collection is frozen. - - Frozen sectioned results collections are immutable and can be accessed from any thread. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Sectioned Results Notifications - -/** - Registers a block to be called each time the sectioned results collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSectionedResults *, RLMSectionedResultsChange *))block __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the sectioned results collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSectionedResults *, RLMSectionedResultsChange *))block - queue:(dispatch_queue_t)queue __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the sectioned results collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSectionedResults *, RLMSectionedResultsChange *))block - keyPaths:(NSArray *)keyPaths __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the sectioned results collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSectionedResults *, RLMSectionedResultsChange *))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue __attribute__((warn_unused_result)); -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMSet.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMSet.h deleted file mode 100644 index fead2e005..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMSet.h +++ /dev/null @@ -1,535 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObject, RLMResults; - -/** - A collection datatype used for storing distinct objects. - - - Note: - `RLMSet` supports storing primitive and `RLMObject` types. `RLMSet` does not support storing - Embedded Realm Objects. - */ -@interface RLMSet : NSObject - -#pragma mark - Properties - -/** - The number of objects in the set. - */ -@property (nonatomic, readonly, assign) NSUInteger count; - -/** - The type of the objects in the set. - */ -@property (nonatomic, readonly, assign) RLMPropertyType type; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readonly, getter = isOptional) BOOL optional; - -/** - The objects in the RLMSet as an NSArray value. - */ -@property (nonatomic, readonly) NSArray *allObjects; - -/** - The class name of the objects contained in the set. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages the set. Returns `nil` for unmanaged set. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - Indicates if the set can no longer be accessed. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if the set is frozen. - - Frozen sets are immutable and can be accessed from any thread. Frozen sets - are created by calling `-freeze` on a managed live set. Unmanaged sets are - never frozen. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Adding, Removing, and Replacing Objects in a Set - -/** - Adds an object to the set if it is not already present. - - @warning This method may only be called during a write transaction. - - @param object An object of the type contained in the set. - */ -- (void)addObject:(RLMObjectType)object; - -/** - Adds an array of distinct objects to the set. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable object such as `NSArray`, `NSSet` or `RLMResults` which contains objects of the - same class as the set. - */ -- (void)addObjects:(id)objects; - -/** - Removes a given object from the set. - - @warning This method may only be called during a write transaction. - - @param object The object in the set that you want to remove. - */ -- (void)removeObject:(RLMObjectType)object; - -/** - Removes all objects from the set. - - @warning This method may only be called during a write transaction. - */ -- (void)removeAllObjects; - -/** - Empties the receiving set, then adds each object contained in another given set. - - @warning This method may only be called during a write transaction. - - @param set The RLMSet whose members replace the receiving set's content. - */ -- (void)setSet:(RLMSet *)set; - -/** - Removes from the receiving set each object that isn’t a member of another given set. - - @warning This method may only be called during a write transaction. - - @param set The RLMSet with which to perform the intersection. - */ -- (void)intersectSet:(RLMSet *)set; - -/** - Removes each object in another given set from the receiving set, if present. - - @warning This method may only be called during a write transaction. - - @param set The set of objects to remove from the receiving set. - */ -- (void)minusSet:(RLMSet *)set; - -/** - Adds each object in another given set to the receiving set, if not present. - - @warning This method may only be called during a write transaction. - - @param set The set of objects to add to the receiving set. - */ -- (void)unionSet:(RLMSet *)set; - -#pragma mark - Querying a Set - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/// :nodoc: -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/// :nodoc: -- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/// :nodoc: -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/// :nodoc: -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -/** - Returns a Boolean value that indicates whether at least one object in the receiving set is also present in another given set. - - @param set The RLMSet to compare the receiving set to. - - @return YES if at least one object in the receiving set is also present in otherSet, otherwise NO. - */ -- (BOOL)intersectsSet:(RLMSet *)set; - -/** - Returns a Boolean value that indicates whether every object in the receiving set is also present in another given set. - - @param set The RLMSet to compare the receiving set to. - - @return YES if every object in the receiving set is also present in otherSet, otherwise NO. - */ -- (BOOL)isSubsetOfSet:(RLMSet *)set; - -/** - Returns a Boolean value that indicates whether a given object is present in the set. - - @param anObject An object to look for in the set. - - @return YES if anObject is present in the set, otherwise NO. - */ -- (BOOL)containsObject:(RLMObjectType)anObject; - -/** - Compares the receiving set to another set. - - @param otherSet The set with which to compare the receiving set. - - @return YES if the contents of otherSet are equal to the contents of the receiving set, otherwise NO. - */ -- (BOOL)isEqualToSet:(RLMSet *)otherSet; - -#pragma mark - Sectioning a Set - -/** - Sorts and sections this collection from a given property key path, returning the result - as an instance of `RLMSectionedResults`. - - @param keyPath The property key path to sort on. - @param ascending The direction to sort in. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsSortedUsingKeyPath:(NSString *)keyPath - ascending:(BOOL)ascending - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -/** - Sorts and sections this collection from a given array of sort descriptors, returning the result - as an instance of `RLMSectionedResults`. - - @param sortDescriptors An array of `RLMSortDescriptor`s to sort by. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @note The primary sort descriptor must be responsible for determining the section key. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsUsingSortDescriptors:(NSArray *)sortDescriptors - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - - -#pragma mark - Notifications - -/** - Registers a block to be called each time the set changes. - - The block will be asynchronously called with the initial set, and then - called again after each write transaction which changes any of the objects in - the set, which objects are in the results, or the order of the objects in the - set. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the set were added, removed or modified. If a write transaction - did not modify any objects in the set, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - Person *person = [[Person allObjectsInRealm:realm] firstObject]; - NSLog(@"person.dogs.count: %zu", person.dogs.count); // => 0 - self.token = [person.dogs addNotificationBlock(RLMSet *dogs, - RLMCollectionChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count) // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - [person.dogs addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a non-frozen managed set. - - @param block The block to be called each time the set changes. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSet *_Nullable set, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the set changes. - - The block will be asynchronously called with the initial set, and then - called again after each write transaction which changes any of the objects in - the set, which objects are in the results, or the order of the objects in the - set. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the set were added, removed or modified. If a write transaction - did not modify any objects in the set, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSet *_Nullable set, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the set changes. - - The block will be asynchronously called with the initial set, and then - called again after each write transaction which changes any of the objects in - the set, which objects are in the results, or the order of the objects in the - set. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the set were added, removed or modified. If a write transaction - did not modify any objects in the set, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSet *_Nullable set, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the set changes. - - The block will be asynchronously called with the initial set, and then - called again after each write transaction which changes any of the objects in - the set, which objects are in the results, or the order of the objects in the - set. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the set were added, removed or modified. If a write transaction - did not modify any objects in the set, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSet *_Nullable set, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths -__attribute__((warn_unused_result)); - -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the objects in the set. - - NSNumber *min = [object.setProperty minOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, `RLMSet`, and `NSData` properties. - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The minimum value of the property, or `nil` if the set is empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects in the set. - - NSNumber *max = [object.setProperty maxOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, `RLMSet`, and `NSData` properties. - - @param property The property whose maximum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The maximum value of the property, or `nil` if the set is empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of distinct values of a given property over all the objects in the set. - - NSNumber *sum = [object.setProperty sumOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, `RLMSet and `NSData` properties. - - @param property The property whose values should be summed. Only properties of - types `int`, `float`, and `double` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects in the set. - - NSNumber *average = [object.setProperty averageOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMSet`, `RLMArray`, and `NSData` properties. - - @param property The property whose average value should be calculated. Only - properties of types `int`, `float`, and `double` are supported. - - @return The average value of the given property, or `nil` if the set is empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this set. - - The frozen copy is an immutable set which contains the same data as this - et currently contains, but will not update when writes are made to the - containing Realm. Unlike live sets, frozen sets can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a managed set. - @warning Holding onto a frozen set for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -#pragma mark - Unavailable Methods - -/** - `-[RLMSet init]` is not available because `RLMSet`s cannot be created directly. - ``RLMSet` properties on `RLMObject`s are lazily created when accessed. - */ -- (instancetype)init __attribute__((unavailable("RLMSets cannot be created directly"))); - -/** - `+[RLMSet new]` is not available because `RLMSet`s cannot be created directly. - `RLMSet` properties on `RLMObject`s are lazily created when accessed. - */ -+ (instancetype)new __attribute__((unavailable("RLMSet cannot be created directly"))); - -@end - -/// :nodoc: -@interface RLMSet (Swift) -// for use only in Swift class definitions -- (instancetype)initWithObjectClassName:(NSString *)objectClassName; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMSwiftObject.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMSwiftObject.h deleted file mode 100644 index 7ea764016..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMSwiftObject.h +++ /dev/null @@ -1,142 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) -/** - `Object` is a class used to define Realm model objects. - - In Realm you define your model classes by subclassing `Object` and adding properties to be managed. - You then instantiate and use your custom subclasses instead of using the `Object` class directly. - - ```swift - class Dog: Object { - @objc dynamic var name: String = "" - @objc dynamic var adopted: Bool = false - let siblings = List() - } - ``` - - ### Supported property types - - - `String`, `NSString` - - `Int` - - `Int8`, `Int16`, `Int32`, `Int64` - - `Float` - - `Double` - - `Bool` - - `Date`, `NSDate` - - `Data`, `NSData` - - `Decimal128` - - `ObjectId` - - `@objc enum` which has been delcared as conforming to `RealmEnum`. - - `RealmOptional` for optional numeric properties - - `Object` subclasses, to model many-to-one relationships - - `EmbeddedObject` subclasses, to model owning one-to-one relationships - - `List`, to model many-to-many relationships - - `String`, `NSString`, `Date`, `NSDate`, `Data`, `NSData`, `Decimal128`, and `ObjectId` properties - can be declared as optional. `Object` and `EmbeddedObject` subclasses *must* be declared as optional. - `Int`, `Int8`, `Int16`, `Int32`, `Int64`, `Float`, `Double`, `Bool`, enum, and `List` properties cannot. - To store an optional number, use `RealmOptional`, `RealmOptional`, `RealmOptional`, or - `RealmOptional` instead, which wraps an optional numeric value. Lists cannot be optional at all. - - All property types except for `List` and `RealmOptional` *must* be declared as `@objc dynamic var`. `List` and - `RealmOptional` properties must be declared as non-dynamic `let` properties. Swift `lazy` properties are not allowed. - - Note that none of the restrictions listed above apply to properties that are configured to be ignored by Realm. - - ### Querying - - You can retrieve all objects of a given type from a Realm by calling the `objects(_:)` instance method. - - ### Relationships - - See our [Objective-C guide](https://docs.mongodb.com/realm/sdk/swift/fundamentals/relationships/) for more details. - */ -@interface RealmSwiftObject : RLMObjectBase -@end - -/** - `EmbeddedObject` is a base class used to define embedded Realm model objects. - - Embedded objects work similarly to normal objects, but are owned by a single - parent Object (which itself may be embedded). Unlike normal top-level objects, - embedded objects cannot be directly created in or added to a Realm. Instead, - they can only be created as part of a parent object, or by assigning an - unmanaged object to a parent object's property. Embedded objects are - automatically deleted when the parent object is deleted or when the parent is - modified to no longer point at the embedded object, either by reassigning an - Object property or by removing the embedded object from the List containing it. - - Embedded objects can only ever have a single parent object which links to - them, and attempting to link to an existing managed embedded object will throw - an exception. - - The property types supported on `EmbeddedObject` are the same as for `Object`, - except for that embedded objects cannot link to top-level objects, so `Object` - and `List` properties are not supported (`EmbeddedObject` and - `List` *are*). - - Embedded objects cannot have primary keys or indexed properties. - - ```swift - class Owner: Object { - @objc dynamic var name: String = "" - let dogs = List() - } - class Dog: EmbeddedObject { - @objc dynamic var name: String = "" - @objc dynamic var adopted: Bool = false - let owner = LinkingObjects(fromType: Owner.self, property: "dogs") - } - ``` - */ -@interface RealmSwiftEmbeddedObject : RLMObjectBase -@end - -/** - `AsymmetricObject` is a base class used to define asymmetric Realm objects. - - Asymmetric objects can only be created using the `create(_ object:)` - function, and cannot be added, removed or queried. - When created, asymmetric objects will be synced unidirectionally to the MongoDB - database and cannot be accessed locally. - - Incoming links from any asymmetric table are not allowed, meaning embedding - an asymmetric object within an `Object` will throw an error. - - The property types supported on `AsymmetricObject` are the same as for `Object`, - except for that asymmetric objects can only link to embedded objects, so `Object` - and `List` properties are not supported (`EmbeddedObject` and - `List` *are*). - - ```swift - class Person: AsymmetricObject { - @Persisted(primaryKey: true) var _id: ObjectId = ObjectId.generate() - @Persisted var name: String - @Persisted var age: Int - } - ``` - */ -@interface RealmSwiftAsymmetricObject : RLMObjectBase -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMSwiftProperty.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMSwiftProperty.h deleted file mode 100644 index ea071927c..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMSwiftProperty.h +++ /dev/null @@ -1,71 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -@class RLMObjectBase, RLMArray, RLMSet; - -#ifdef __cplusplus -extern "C" { -#endif - -RLM_HEADER_AUDIT_BEGIN(nullability) - -#define REALM_FOR_EACH_SWIFT_PRIMITIVE_TYPE(macro) \ - macro(bool, Bool, bool) \ - macro(double, Double, double) \ - macro(float, Float, float) \ - macro(int64_t, Int64, int) - -#define REALM_FOR_EACH_SWIFT_OBJECT_TYPE(macro) \ - macro(NSString, String, string) \ - macro(NSDate, Date, date) \ - macro(NSData, Data, data) \ - macro(NSUUID, UUID, uuid) \ - macro(RLMDecimal128, Decimal128, decimal128) \ - macro(RLMObjectId, ObjectId, objectId) - -#define REALM_SWIFT_PROPERTY_ACCESSOR(objc, swift, rlmtype) \ - objc RLMGetSwiftProperty##swift(RLMObjectBase *, uint16_t); \ - objc RLMGetSwiftProperty##swift##Optional(RLMObjectBase *, uint16_t, bool *); \ - void RLMSetSwiftProperty##swift(RLMObjectBase *, uint16_t, objc); -REALM_FOR_EACH_SWIFT_PRIMITIVE_TYPE(REALM_SWIFT_PROPERTY_ACCESSOR) -#undef REALM_SWIFT_PROPERTY_ACCESSOR - -#define REALM_SWIFT_PROPERTY_ACCESSOR(objc, swift, rlmtype) \ - objc *_Nullable RLMGetSwiftProperty##swift(RLMObjectBase *, uint16_t); \ - void RLMSetSwiftProperty##swift(RLMObjectBase *, uint16_t, objc *_Nullable); -REALM_FOR_EACH_SWIFT_OBJECT_TYPE(REALM_SWIFT_PROPERTY_ACCESSOR) -#undef REALM_SWIFT_PROPERTY_ACCESSOR - -id _Nullable RLMGetSwiftPropertyAny(RLMObjectBase *, uint16_t); -void RLMSetSwiftPropertyAny(RLMObjectBase *, uint16_t, id); -RLMObjectBase *_Nullable RLMGetSwiftPropertyObject(RLMObjectBase *, uint16_t); -void RLMSetSwiftPropertyNil(RLMObjectBase *, uint16_t); -void RLMSetSwiftPropertyObject(RLMObjectBase *, uint16_t, RLMObjectBase *_Nullable); - -RLMArray *_Nonnull RLMGetSwiftPropertyArray(RLMObjectBase *obj, uint16_t); -RLMSet *_Nonnull RLMGetSwiftPropertySet(RLMObjectBase *obj, uint16_t); -RLMDictionary *_Nonnull RLMGetSwiftPropertyMap(RLMObjectBase *obj, uint16_t); - -RLM_HEADER_AUDIT_END(nullability) - -#ifdef __cplusplus -} // extern "C" -#endif diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMSyncConfiguration.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMSyncConfiguration.h deleted file mode 100644 index 54ea2ecfc..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMSyncConfiguration.h +++ /dev/null @@ -1,196 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -@class RLMApp; -@class RLMRealm; -@class RLMRealmConfiguration; -@class RLMUser; -@protocol RLMBSON; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** Determines file behavior during a client reset. - - @see: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ -*/ -typedef NS_ENUM(NSUInteger, RLMClientResetMode) { - /// The local copy of the Realm is copied into a recovery - /// directory for safekeeping, and then deleted from the original location. The next time - /// the Realm for that partition value is opened, the Realm will automatically be re-downloaded from - /// Atlas App Services, and can be used as normal. - - /// Data written to the Realm after the local copy of the Realm diverged from the backup - /// remote copy will be present in the local recovery copy of the Realm file. The - /// re-downloaded Realm will initially contain only the data present at the time the Realm - /// was backed up on the server. - /// - /// @see: ``rlmSync_clientResetBackedUpRealmPath`` and ``RLMSyncErrorActionToken`` for more information on accessing the recovery directory and error information. - /// - /// The manual client reset mode handler can be set in two places: - /// 1. As an ErrorReportingBlock argument at ``RLMSyncConfiguration.manualClientResetHandler``. - /// 2. As an ErrorReportingBlock in the ``RLMSyncManager.errorHandler`` property. - /// @see: ``RLMSyncManager.errorHandler`` - /// - /// When an ``RLMSyncErrorClientResetError`` is thrown, the following rules determine which block is executed: - /// - If an error reporting block is set in ``.manualClientResetHandler`` and the ``RLMSyncManager.errorHandler``, the ``.manualClientResetHandler`` block will be executed. - /// - If an error reporting block is set in either the ``.manualClientResetHandler`` or the ``RLMSyncManager``, but not both, the single block will execute. - /// - If no block is set in either location, the client reset will not be handled. The application will likely need to be restarted and unsynced local changes may be lost. - /// @note: The ``RLMSyncManager.errorHandler`` is still invoked under all ``RLMSyncError``s *other than* ``RLMSyncErrorClientResetError``. - /// @see ``RLMSyncError`` for an exhaustive list. - RLMClientResetModeManual = 0, - /// All unsynchronized local changes are automatically discarded and the local state is - /// automatically reverted to the most recent state from the server. Unsynchronized changes - /// can then be recovered in the post-client-reset callback block. - /// - /// If ``RLMClientResetModeDiscardLocal`` is enabled but the client reset operation is unable to complete - /// then the client reset process reverts to manual mode. Example) During a destructive schema change this - /// mode will fail and invoke the manual client reset handler. - /// - /// The RLMClientResetModeDiscardLocal mode supports two client reset callbacks -- ``RLMClientResetBeforeBlock``, ``RLMClientResetAfterBlock`` -- which can be passed as arguments when creating the ``RLMSyncConfiguration``. - /// @see: ``RLMClientResetAfterBlock`` and ``RLMClientResetBeforeBlock`` - RLMClientResetModeDiscardLocal __deprecated_enum_msg("Use RLMClientResetModeDiscardUnsyncedChanges") = 1, - /// All unsynchronized local changes are automatically discarded and the local state is - /// automatically reverted to the most recent state from the server. Unsynchronized changes - /// can then be recovered in the post-client-reset callback block. - /// - /// If ``RLMClientResetModeDiscardUnsyncedChanges`` is enabled but the client reset operation is unable to complete - /// then the client reset process reverts to manual mode. Example) During a destructive schema change this - /// mode will fail and invoke the manual client reset handler. - /// - /// The RLMClientResetModeDiscardUnsyncedChanges mode supports two client reset callbacks -- ``RLMClientResetBeforeBlock``, ``RLMClientResetAfterBlock`` -- which can be passed as arguments when creating the ``RLMSyncConfiguration``. - /// @see: ``RLMClientResetAfterBlock`` and ``RLMClientResetBeforeBlock`` - RLMClientResetModeDiscardUnsyncedChanges = 1, - /// The client device will download a realm realm which reflects the latest - /// state of the server after a client reset. A recovery process is run locally in - /// an attempt to integrate the server version with any local changes from - /// before the client reset occurred. - /// - /// The changes are integrated with the following rules: - /// 1. Objects created locally that were not synced before client reset will be integrated. - /// 2. If an object has been deleted on the server, but was modified on the client, the delete takes precedence and the update is discarded - /// 3. If an object was deleted on the client, but not the server, then the client delete instruction is applied. - /// 4. In the case of conflicting updates to the same field, the client update is applied. - /// - /// If the recovery integration fails, the client reset process falls back to ``RLMClientResetModeManual``. - /// The recovery integration will fail if the "Client Recovery" setting is not enabled on the server. - /// Integration may also fail in the event of an incompatible schema change. - /// - /// The RLMClientResetModeRecoverUnsyncedChanges mode supports two client reset callbacks -- ``RLMClientResetBeforeBlock``, ``RLMClientResetAfterBlock`` -- which can be passed as arguments when creating the ``RLMSyncConfiguration``. - /// @see: ``RLMClientResetAfterBlock`` and ``RLMClientResetBeforeBlock`` - RLMClientResetModeRecoverUnsyncedChanges = 2, - /// The client device will download a realm with objects reflecting the latest version of the server. A recovery - /// process is run locally in an attempt to integrate the server version with any local changes from before the - /// client reset occurred. - /// - /// The changes are integrated with the following rules: - /// 1. Objects created locally that were not synced before client reset will be integrated. - /// 2. If an object has been deleted on the server, but was modified on the client, the delete takes precedence and the update is discarded - /// 3. If an object was deleted on the client, but not the server, then the client delete instruction is applied. - /// 4. In the case of conflicting updates to the same field, the client update is applied. - /// - /// If the recovery integration fails, the client reset process falls back to ``RLMClientResetModeDiscardUnsyncedChanges``. - /// The recovery integration will fail if the "Client Recovery" setting is not enabled on the server. - /// Integration may also fail in the event of an incompatible schema change. - /// - /// The RLMClientResetModeRecoverOrDiscardUnsyncedChanges mode supports two client reset callbacks -- ``RLMClientResetBeforeBlock``, ``RLMClientResetAfterBlock`` -- which can be passed as arguments when creating the ``RLMSyncConfiguration``. - /// @see: ``RLMClientResetAfterBlock`` and ``RLMClientResetBeforeBlock`` - RLMClientResetModeRecoverOrDiscardUnsyncedChanges = 3 -}; - -/** - A block type used to report before a client reset will occur. - The `beforeFrozen` is a frozen copy of the local state prior to client reset. - */ -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMClientResetBeforeBlock)(RLMRealm * _Nonnull beforeFrozen); - -/** - A block type used to report after a client reset occurred. - The `beforeFrozen` argument is a frozen copy of the local state prior to client reset. - The `after` argument contains the local database state after the client reset occurred. - */ -RLM_SWIFT_SENDABLE // invoked on a backgroun thread -typedef void(^RLMClientResetAfterBlock)(RLMRealm * _Nonnull beforeFrozen, RLMRealm * _Nonnull after); - -/** - A configuration object representing configuration state for a Realm which is intended to sync with a Realm Object - Server. - */ -@interface RLMSyncConfiguration : NSObject - -/// The user to which the remote Realm belongs. -@property (nonatomic, readonly) RLMUser *user; - -/** - The value this Realm is partitioned on. The partition key is a property defined in - Atlas App Services. All classes with a property with this value will be synchronized to the - Realm. - */ -@property (nonatomic, readonly) id partitionValue; - -/** - An enum which determines file recovery behavior in the event of a client reset. - @note: Defaults to `RLMClientResetModeRecoverUnsyncedChanges` - - @see: `RLMClientResetMode` - @see: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ -*/ -@property (nonatomic) RLMClientResetMode clientResetMode; - -/** - A callback which notifies prior to prior to a client reset occurring. - @see: `RLMClientResetBeforeBlock` - */ -@property (nonatomic, nullable) RLMClientResetBeforeBlock beforeClientReset; - -/** - A callback which notifies after a client reset has occurred. - @see: `RLMClientResetAfterBlock` - */ -@property (nonatomic, nullable) RLMClientResetAfterBlock afterClientReset; - -/** - A callback that's executed when an `RLMSyncErrorClientResetError` is encountered. - @See RLMSyncErrorReportingBlock and RLMSyncErrorClientResetError for more - details on handling a client reset manually. - */ -@property (nonatomic, nullable) RLMSyncErrorReportingBlock manualClientResetHandler; - - -/** - Whether nonfatal connection errors should cancel async opens. - - By default, if a nonfatal connection error such as a connection timing out occurs, any currently pending asyncOpen operations will ignore the error and continue to retry until it succeeds. If this is set to true, the open will instead fail and report the error. - - NEXT-MAJOR: This should be true by default. - */ -@property (nonatomic) bool cancelAsyncOpenOnNonFatalErrors; - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("This type cannot be created directly"))); - -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("This type cannot be created directly"))); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMSyncManager.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMSyncManager.h deleted file mode 100644 index 1dee453d0..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMSyncManager.h +++ /dev/null @@ -1,223 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMSyncSession, RLMSyncTimeoutOptions, RLMAppConfiguration; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -// NEXT-MAJOR: This enum needs to be removed when access to the logger is removed -// from the sync manager. -/// An enum representing different levels of sync-related logging that can be configured. -typedef RLM_CLOSED_ENUM(NSUInteger, RLMSyncLogLevel) { - /// Nothing will ever be logged. - RLMSyncLogLevelOff, - /// Only fatal errors will be logged. - RLMSyncLogLevelFatal, - /// Only errors will be logged. - RLMSyncLogLevelError, - /// Warnings and errors will be logged. - RLMSyncLogLevelWarn, - /// Information about sync events will be logged. Fewer events will be logged in order to avoid overhead. - RLMSyncLogLevelInfo, - /// Information about sync events will be logged. More events will be logged than with `RLMSyncLogLevelInfo`. - RLMSyncLogLevelDetail, - /// Log information that can aid in debugging. - /// - /// - warning: Will incur a measurable performance impact. - RLMSyncLogLevelDebug, - /// Log information that can aid in debugging. More events will be logged than with `RLMSyncLogLevelDebug`. - /// - /// - warning: Will incur a measurable performance impact. - RLMSyncLogLevelTrace, - /// Log information that can aid in debugging. More events will be logged than with `RLMSyncLogLevelTrace`. - /// - /// - warning: Will incur a measurable performance impact. - RLMSyncLogLevelAll -}; - -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" -/// A log callback function which can be set on RLMSyncManager. -/// -/// The log function may be called from multiple threads simultaneously, and is -/// responsible for performing its own synchronization if any is required. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void (^RLMSyncLogFunction)(RLMSyncLogLevel level, NSString *message); -#pragma clang diagnostic pop - -/// A block type representing a block which can be used to report a sync-related error to the application. If the error -/// pertains to a specific session, that session will also be passed into the block. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMSyncErrorReportingBlock)(NSError *, RLMSyncSession * _Nullable); - -/** - A manager which serves as a central point for sync-related configuration. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMSyncManager : NSObject - -/** - A block which can optionally be set to report sync-related errors to your application. - - Any error reported through this block will be of the `RLMSyncError` type, and marked - with the `RLMSyncErrorDomain` domain. - - Errors reported through this mechanism are fatal, with several exceptions. Please consult - `RLMSyncError` for information about the types of errors that can be reported through - the block, and for for suggestions on handling recoverable error codes. - - @see `RLMSyncError` - */ -@property (nullable, atomic, copy) RLMSyncErrorReportingBlock errorHandler; - -/// :nodoc: -@property (nonatomic, copy) NSString *appID -__attribute__((deprecated("This property is not used for anything"))); - -/** - A string identifying this application which is included in the User-Agent - header of sync connections. By default, this will be the application's bundle - identifier. - - This property must be set prior to opening a synchronized Realm for the first - time. Any modifications made after opening a Realm will be ignored. - */ -@property (atomic, copy) NSString *userAgent; - -/** - The logging threshold which newly opened synced Realms will use. Defaults to - `RLMSyncLogLevelInfo`. - - By default logging strings are output to Apple System Logger. Set `logger` to - perform custom logging logic instead. - - @warning This property must be set before any synced Realms are opened. Setting it after - opening any synced Realm will do nothing. - */ -@property (atomic) RLMSyncLogLevel logLevel -__attribute__((deprecated("Use `RLMLogger.default.level`/`Logger.shared.level` to set/get the default logger threshold level."))); - -/** - The function which will be invoked whenever the sync client has a log message. - - If nil, log strings are output to Apple System Logger instead. - - @warning This property must be set before any synced Realms are opened. Setting - it after opening any synced Realm will do nothing. - */ -@property (atomic, nullable) RLMSyncLogFunction logger -__attribute__((deprecated("Use `RLMLogger.default`/`Logger.shared` to set/get the default logger."))); - -/** - The name of the HTTP header to send authorization data in when making requests to Atlas App Services which has - been configured to expect a custom authorization header. - */ -@property (nullable, atomic, copy) NSString *authorizationHeaderName; - -/** - Extra HTTP headers to append to every request to Atlas App Services. - - Modifying this property while sync sessions are active will result in all - sessions disconnecting and reconnecting using the new headers. - */ -@property (nullable, atomic, copy) NSDictionary *customRequestHeaders; - -/** - Options for the assorted types of connection timeouts for sync connections. - - If nil default values for all timeouts are used instead. - - @warning This property must be set before any synced Realms are opened. Setting - it after opening any synced Realm will do nothing. - */ -@property (nullable, atomic, copy) RLMSyncTimeoutOptions *timeoutOptions; - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("RLMSyncManager cannot be created directly"))); - -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("RLMSyncManager cannot be created directly"))); - -@end - -/** - Options for configuring timeouts and intervals in the sync client. - */ -@interface RLMSyncTimeoutOptions : NSObject -/// The maximum number of milliseconds to allow for a connection to -/// become fully established. This includes the time to resolve the -/// network address, the TCP connect operation, the SSL handshake, and -/// the WebSocket handshake. -/// -/// Defaults to 2 minutes. -@property (nonatomic) NSUInteger connectTimeout; - -/// The number of milliseconds to keep a connection open after all -/// sessions have been abandoned. -/// -/// After all synchronized Realms have been closed for a given server, the -/// connection is kept open until the linger time has expired to avoid the -/// overhead of reestablishing the connection when Realms are being closed and -/// reopened. -/// -/// Defaults to 30 seconds. -@property (nonatomic) NSUInteger connectionLingerTime; - -/// The number of milliseconds between each heartbeat ping message. -/// -/// The client periodically sends ping messages to the server to check if the -/// connection is still alive. Shorter periods make connection state change -/// notifications more responsive at the cost of battery life (as the antenna -/// will have to wake up more often). -/// -/// Defaults to 1 minute. -@property (nonatomic) NSUInteger pingKeepalivePeriod; - -/// How long in milliseconds to wait for a reponse to a heartbeat ping before -/// concluding that the connection has dropped. -/// -/// Shorter values will make connection state change notifications more -/// responsive as it will only change to `disconnected` after this much time has -/// elapsed, but overly short values may result in spurious disconnection -/// notifications when the server is simply taking a long time to respond. -/// -/// Defaults to 2 minutes. -@property (nonatomic) NSUInteger pongKeepaliveTimeout; - -/// The maximum amount of time, in milliseconds, since the loss of a -/// prior connection, for a new connection to be considered a "fast -/// reconnect". -/// -/// When a client first connects to the server, it defers uploading any local -/// changes until it has downloaded all changesets from the server. This -/// typically reduces the total amount of merging that has to be done, and is -/// particularly beneficial the first time that a specific client ever connects -/// to the server. -/// -/// When an existing client disconnects and then reconnects within the "fact -/// reconnect" time this is skipped and any local changes are uploaded -/// immediately without waiting for downloads, just as if the client was online -/// the whole time. -/// -/// Defaults to 1 minute. -@property (nonatomic) NSUInteger fastReconnectLimit; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMSyncSession.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMSyncSession.h deleted file mode 100644 index 31677ce9c..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMSyncSession.h +++ /dev/null @@ -1,234 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -/** - The current state of the session represented by a session object. - */ -typedef NS_ENUM(NSUInteger, RLMSyncSessionState) { - /// The sync session is actively communicating or attempting to communicate - /// with Atlas App Services. A session is considered Active even if - /// it is not currently connected. Check the connection state instead if you - /// wish to know if the connection is currently online. - RLMSyncSessionStateActive, - /// The sync session is not attempting to communicate with MongoDB - /// Realm due to the user logging out or synchronization being paused. - RLMSyncSessionStateInactive, - /// The sync session encountered a fatal error and is permanently invalid; it should be discarded. - RLMSyncSessionStateInvalid -}; - -/** - The current state of a sync session's connection. Sessions which are not in - the Active state will always be Disconnected. - */ -typedef NS_ENUM(NSUInteger, RLMSyncConnectionState) { - /// The sync session is not connected to the server, and is not attempting - /// to connect, either because the session is inactive or because it is - /// waiting to retry after a failed connection. - RLMSyncConnectionStateDisconnected, - /// The sync session is attempting to connect to Atlas App Services. - RLMSyncConnectionStateConnecting, - /// The sync session is currently connected to Atlas App Services. - RLMSyncConnectionStateConnected, -}; - -/** - The transfer direction (upload or download) tracked by a given progress notification block. - - Progress notification blocks can be registered on sessions if your app wishes to be informed - how many bytes have been uploaded or downloaded, for example to show progress indicator UIs. - */ -typedef RLM_CLOSED_ENUM(NSUInteger, RLMSyncProgressDirection) { - /// For monitoring upload progress. - RLMSyncProgressDirectionUpload, - /// For monitoring download progress. - RLMSyncProgressDirectionDownload, -}; - -/** - The desired behavior of a progress notification block. - - Progress notification blocks can be registered on sessions if your app wishes to be informed - how many bytes have been uploaded or downloaded, for example to show progress indicator UIs. - */ -typedef NS_ENUM(NSUInteger, RLMSyncProgressMode) { - /** - The block will be called indefinitely, or until it is unregistered by calling - `-[RLMProgressNotificationToken invalidate]`. - - Notifications will always report the latest number of transferred bytes, and the - most up-to-date number of total transferrable bytes. - */ - RLMSyncProgressModeReportIndefinitely, - /** - The block will, upon registration, store the total number of bytes - to be transferred. When invoked, it will always report the most up-to-date number - of transferrable bytes out of that original number of transferrable bytes. - - When the number of transferred bytes reaches or exceeds the - number of transferrable bytes, the block will be unregistered. - */ - RLMSyncProgressModeForCurrentlyOutstandingWork, -}; - -@class RLMUser, RLMSyncConfiguration, RLMSyncErrorActionToken, RLMSyncManager; - -/** - The type of a progress notification block intended for reporting a session's network - activity to the user. - - `transferredBytes` refers to the number of bytes that have been uploaded or downloaded. - `transferrableBytes` refers to the total number of bytes transferred, and pending transfer. - */ -typedef void(^RLMProgressNotificationBlock)(NSUInteger transferredBytes, NSUInteger transferrableBytes); - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A token object corresponding to a progress notification block on a session object. - - To stop notifications manually, call `-invalidate` on it. Notifications should be stopped before - the token goes out of scope or is destroyed. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMProgressNotificationToken : RLMNotificationToken -@end - -/** - An object encapsulating an Atlas App Services "session". Sessions represent the - communication between the client (and a local Realm file on disk), and the server - (and a remote Realm with a given partition value stored on Atlas App Services). - - Sessions are always created by the SDK and vended out through various APIs. The - lifespans of sessions associated with Realms are managed automatically. Session - objects can be accessed from any thread. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMSyncSession : NSObject - -/// The session's current state. -/// -/// This property is not KVO-compliant. -@property (nonatomic, readonly) RLMSyncSessionState state; - -/// The session's current connection state. -/// -/// This property is KVO-compliant and can be observed to be notified of changes. -/// Be warned that KVO observers for this property may be called on a background -/// thread. -@property (atomic, readonly) RLMSyncConnectionState connectionState; - -/// The user that owns this session. -- (nullable RLMUser *)parentUser; - -/** - If the session is valid, return a sync configuration that can be used to open the Realm - associated with this session. - */ -- (nullable RLMSyncConfiguration *)configuration; - -/** - Temporarily suspend syncronization and disconnect from the server. - - The session will not attempt to connect to Atlas App Services until `resume` - is called or the Realm file is closed and re-opened. - */ -- (void)suspend; - -/** - Resume syncronization and reconnect to Atlas App Services after suspending. - - This is a no-op if the session was already active or if the session is invalid. - Newly created sessions begin in the Active state and do not need to be resumed. - */ -- (void)resume; - -/** - Register a progress notification block. - - Multiple blocks can be registered with the same session at once. Each block - will be invoked on a side queue devoted to progress notifications. - - If the session has already received progress information from the - synchronization subsystem, the block will be called immediately. Otherwise, it - will be called as soon as progress information becomes available. - - The token returned by this method must be retained as long as progress - notifications are desired, and the `-invalidate` method should be called on it - when notifications are no longer needed and before the token is destroyed. - - If no token is returned, the notification block will never be called again. - There are a number of reasons this might be true. If the session has previously - experienced a fatal error it will not accept progress notification blocks. If - the block was configured in the `RLMSyncProgressForCurrentlyOutstandingWork` - mode but there is no additional progress to report (for example, the number - of transferrable bytes and transferred bytes are equal), the block will not be - called again. - - @param direction The transfer direction (upload or download) to track in this progress notification block. - @param mode The desired behavior of this progress notification block. - @param block The block to invoke when notifications are available. - - @return A token which must be held for as long as you want notifications to be delivered. - - @see `RLMSyncProgressDirection`, `RLMSyncProgress`, `RLMProgressNotificationBlock`, `RLMProgressNotificationToken` - */ -- (nullable RLMProgressNotificationToken *)addProgressNotificationForDirection:(RLMSyncProgressDirection)direction - mode:(RLMSyncProgressMode)mode - block:(RLMProgressNotificationBlock)block -NS_REFINED_FOR_SWIFT; - -/** - Given an error action token, immediately handle the corresponding action. - - @see `RLMSyncErrorClientResetError`, `RLMSyncErrorPermissionDeniedError` - */ -+ (void)immediatelyHandleError:(RLMSyncErrorActionToken *)token syncManager:(RLMSyncManager *)syncManager; - -/** - Get the sync session for the given Realm if it is a synchronized Realm, or `nil` - if it is not. - */ -+ (nullable RLMSyncSession *)sessionForRealm:(RLMRealm *)realm; - -@end - -// MARK: - Error action token - -#pragma mark - Error action token - -/** - An opaque token returned as part of certain errors. It can be - passed into certain APIs to perform certain actions. - - @see `RLMSyncErrorClientResetError`, `RLMSyncErrorPermissionDeniedError` - */ -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMSyncErrorActionToken : NSObject - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("This type cannot be created directly"))); - -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("This type cannot be created directly"))); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMSyncSubscription.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMSyncSubscription.h deleted file mode 100644 index d35be19d0..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMSyncSubscription.h +++ /dev/null @@ -1,346 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectId; - -#pragma mark - Subscription States - -/// The current state of the subscription. This can be used for ensuring that -/// the subscriptions are not errored and that it has been successfully -/// synced to the server. -typedef NS_ENUM(NSUInteger, RLMSyncSubscriptionState) { - /// The subscription is complete and the server has sent all the data that matched the subscription - /// queries at the time the subscription set was updated. The server is now in a steady-state - /// synchronization mode where it will stream update as they come. - RLMSyncSubscriptionStateComplete, - /// The subscription encountered an error and synchronization is paused for this Realm. You can - /// find the error calling error in the subscription set to get a description of the error. You can - /// still use the current subscription set to write a subscription. - RLMSyncSubscriptionStateError, - /// The subscription is persisted locally but not yet processed by the server, which means - /// the server hasn't yet returned all the data that matched the updated subscription queries. - RLMSyncSubscriptionStatePending, - /// The subscription set has been super-ceded by an updated one, this typically means that - /// someone is trying to write a subscription on a different instance of the subscription set. - /// You should not use a superseded subscription set and instead obtain a new instance of - /// the subscription set to write a subscription. - RLMSyncSubscriptionStateSuperseded -}; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - `RLMSyncSubscription` is used to define a Flexible Sync subscription obtained from querying a - subscription set, which can be used to read or remove/update a committed subscription. - */ -@interface RLMSyncSubscription : NSObject - -/// Name of the subscription. If not specified it will return nil. -@property (nonatomic, readonly, nullable) NSString *name; - -/// When the subscription was created. Recorded automatically. -@property (nonatomic, readonly) NSDate *createdAt; - -/// When the subscription was last updated. Recorded automatically. -@property (nonatomic, readonly) NSDate *updatedAt; - -/** - Updates a Flexible Sync's subscription query with an allowed query which will be used to bootstrap data - from the server when committed. - - @warning This method may only be called during a write subscription block. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - */ -- (void)updateSubscriptionWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (void)updateSubscriptionWhere:(NSString *)predicateFormat - args:(va_list)args; - -/** - Updates a Flexible Sync's subscription query with an allowed query which will be used to bootstrap data - from the server when committed. - - @warning This method may only be called during a write subscription block. - - @param predicate The predicate with which to filter the objects on the server. - */ -- (void)updateSubscriptionWithPredicate:(NSPredicate *)predicate; - -@end - -/** - `RLMSyncSubscriptionSet` is a collection of `RLMSyncSubscription`s. This is the entry point - for adding and removing `RLMSyncSubscription`s. - */ -@interface RLMSyncSubscriptionSet : NSObject - -/// The number of subscriptions in the subscription set. -@property (readonly) NSUInteger count; - -/// Gets the error associated to the subscription set. This will be non-nil in case the current -/// state of the subscription set is `RLMSyncSubscriptionStateError`. -@property (nonatomic, readonly, nullable) NSError *error; - -/// Gets the state associated to the subscription set. -@property (nonatomic, readonly) RLMSyncSubscriptionState state; - -#pragma mark - Batch Update subscriptions - -/** - Synchronously performs any transactions (add/remove/update) to the subscription set within the block, - this will not wait for the server to acknowledge and see all the data associated with this collection of subscriptions, - and will return after committing the subscription transactions. - - @param block The block containing actions to perform to the subscription set. - */ -- (void)update:(__attribute__((noescape)) void(^)(void))block; -/// :nodoc: -- (void)write:(__attribute__((noescape)) void(^)(void))block __attribute__((unavailable("Renamed to -update"))); - -/** - Synchronously performs any transactions (add/remove/update) to the subscription set within the block, - this will not wait for the server to acknowledge and see all the data associated with this collection of subscriptions, - and will return after committing the subscription transactions. - - @param block The block containing actions to perform to the subscription set. - @param onComplete A block which is called upon synchronization of - subscriptions to the server. The block will be passed `nil` - if the update succeeded, and an error describing the problem - otherwise. - */ -- (void)update:(__attribute__((noescape)) void(^)(void))block - onComplete:(nullable void(^RLM_SWIFT_SENDABLE)(NSError *_Nullable))onComplete - __attribute__((swift_async(not_swift_private, 2))) - __attribute__((swift_attr("@_unsafeInheritExecutor"))); -/// :nodoc: -- (void)write:(__attribute__((noescape)) void(^)(void))block - onComplete:(void(^)(NSError * _Nullable))onComplete __attribute__((unavailable("Renamed to -update:onComplete."))); - -#pragma mark - Find subscription - -/** - Finds a subscription by the specified name. - - @param name The name used to identify the subscription. - - @return A subscription for the given name. - */ -- (nullable RLMSyncSubscription *)subscriptionWithName:(NSString *)name; - -/** - Finds a subscription by the query for the specified object class name. - - @param objectClassName The class name for the model class to be queried. - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return A subscription for the given query.. - */ -- (nullable RLMSyncSubscription *)subscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (nullable RLMSyncSubscription *)subscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat - args:(va_list)args; - -/** - Finds a subscription by the query for the specified object class name. - - @param objectClassName The class name for the model class to be queried. - @param predicate The predicate used to to filter the objects on the server. - - @return A subscription for the given query.. - */ -- (nullable RLMSyncSubscription *)subscriptionWithClassName:(NSString *)objectClassName - predicate:(NSPredicate *)predicate; - -#pragma mark - Add a Subscription - -/** - Adds a new subscription to the subscription set which will be sent to the server when - committed at the end of a write subscription block. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - */ -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat - args:(va_list)args; - -/** - Adds a new subscription to the subscription set which will be sent to the server when - committed at the end of a write subscription block. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param name The name used the identify the subscription. - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - */ -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - subscriptionName:(NSString *)name - where:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - subscriptionName:(NSString *)name - where:(NSString *)predicateFormat - args:(va_list)args; - -/** - Adds a new subscription to the subscription set which will be sent to the server when - committed at the end of a write subscription block. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param predicate The predicate defining the query for the subscription. - */ -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - predicate:(NSPredicate *)predicate; - -/** - Adds a new subscription to the subscription set which will be sent to the server when - committed at the end of a write subscription block. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param name The name used to identify the subscription. - @param predicate The predicate defining the query for the subscription. - */ -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - subscriptionName:(nullable NSString *)name - predicate:(NSPredicate *)predicate; - -#pragma mark - Remove Subscription - -/** - Removes a subscription with the specified name from the subscription set. - - @warning This method may only be called during a write subscription block. - - @param name The name used the identify the subscription. - */ -- (void)removeSubscriptionWithName:(NSString *)name; - -/** - Removes a subscription with the specified query for the object class from the subscription set. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - */ -- (void)removeSubscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (void)removeSubscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat - args:(va_list)args; - -/** - Removes a subscription with the specified query for the object class from the subscription set. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param predicate The predicate which will be used to identify the subscription to be removed. - */ -- (void)removeSubscriptionWithClassName:(NSString *)objectClassName - predicate:(NSPredicate *)predicate; - -/** - Removes the subscription from the subscription set. - - @warning This method may only be called during a write subscription block. - - @param subscription An instance of the subscription to be removed. - */ -- (void)removeSubscription:(RLMSyncSubscription *)subscription; - -#pragma mark - Remove Subscriptions - -/** - Removes all subscription from the subscription set. - - @warning This method may only be called during a write subscription block. - @warning Removing all subscriptions will result in an error if no new subscription is added. Server should - acknowledge at least one subscription. - */ -- (void)removeAllSubscriptions; - -/** - Removes all subscription with the specified class name. - - @param className The class name for the model class to be queried. - - @warning This method may only be called during a write subscription block. - */ -- (void)removeAllSubscriptionsWithClassName:(NSString *)className; - -#pragma mark - SubscriptionSet Collection - -/** - Returns the subscription at the given `index`. - - @param index The index. - - @return A subscription for the given index in the subscription set. - */ -- (nullable RLMSyncSubscription *)objectAtIndex:(NSUInteger)index; - -/** - Returns the first object in the subscription set list, or `nil` if the subscriptions are empty. - - @return A subscription. - */ -- (nullable RLMSyncSubscription *)firstObject; - -/** - Returns the last object in the subscription set, or `nil` if the subscriptions are empty. - - @return A subscription. - */ -- (nullable RLMSyncSubscription *)lastObject; - -#pragma mark - Subscript - -/** - Returns the subscription at the given `index`. - - @param index The index. - - @return A subscription for the given index in the subscription set. - */ -- (id)objectAtIndexedSubscript:(NSUInteger)index; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMThreadSafeReference.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMThreadSafeReference.h deleted file mode 100644 index 9472942ed..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMThreadSafeReference.h +++ /dev/null @@ -1,107 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMRealm; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - Objects of types which conform to `RLMThreadConfined` can be managed by a Realm, which will make - them bound to a thread-specific `RLMRealm` instance. Managed objects must be explicitly exported - and imported to be passed between threads. - - Managed instances of objects conforming to this protocol can be converted to a thread-safe - reference for transport between threads by passing to the - `+[RLMThreadSafeReference referenceWithThreadConfined:]` constructor. - - Note that only types defined by Realm can meaningfully conform to this protocol, and defining new - classes which attempt to conform to it will not make them work with `RLMThreadSafeReference`. - */ -@protocol RLMThreadConfined -// Conformance to the `RLMThreadConfined_Private` protocol will be enforced at runtime. - -/** - The Realm which manages the object, or `nil` if the object is unmanaged. - - Unmanaged objects are not confined to a thread and cannot be passed to methods expecting a - `RLMThreadConfined` object. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/// Indicates if the object can no longer be accessed because it is now invalid. -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -@end - -/** - An object intended to be passed between threads containing a thread-safe reference to its - thread-confined object. - - To resolve a thread-safe reference on a target Realm on a different thread, pass to - `-[RLMRealm resolveThreadSafeReference:]`. - - @warning A `RLMThreadSafeReference` object must be resolved at most once. - Failing to resolve a `RLMThreadSafeReference` will result in the source version of the - Realm being pinned until the reference is deallocated. - - @note Prefer short-lived `RLMThreadSafeReference`s as the data for the version of the source Realm - will be retained until all references have been resolved or deallocated. - - @see `RLMThreadConfined` - @see `-[RLMRealm resolveThreadSafeReference:]` - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMThreadSafeReference<__covariant Confined : id> : NSObject - -/** - Create a thread-safe reference to the thread-confined object. - - @param threadConfined The thread-confined object to create a thread-safe reference to. - - @note You may continue to use and access the thread-confined object after passing it to this - constructor. - */ -+ (instancetype)referenceWithThreadConfined:(Confined)threadConfined; - -/** - Indicates if the reference can no longer be resolved because an attempt to resolve it has already - occurred. References can only be resolved once. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -#pragma mark - Unavailable Methods - -/** - `-[RLMThreadSafeReference init]` is not available because `RLMThreadSafeReference` cannot be - created directly. `RLMThreadSafeReference` instances must be obtained by calling - `-[RLMRealm resolveThreadSafeReference:]`. - */ -- (instancetype)init __attribute__((unavailable("RLMThreadSafeReference cannot be created directly"))); - -/** - `-[RLMThreadSafeReference new]` is not available because `RLMThreadSafeReference` cannot be - created directly. `RLMThreadSafeReference` instances must be obtained by calling - `-[RLMRealm resolveThreadSafeReference:]`. - */ -+ (instancetype)new __attribute__((unavailable("RLMThreadSafeReference cannot be created directly"))); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMUpdateResult.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMUpdateResult.h deleted file mode 100644 index df0b237e3..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMUpdateResult.h +++ /dev/null @@ -1,45 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectId; -@protocol RLMBSON; - -/// The result of an `updateOne` or `updateMany` operation a `RLMMongoCollection`. -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMUpdateResult : NSObject - -/// The number of documents that matched the filter. -@property (nonatomic, readonly) NSUInteger matchedCount; - -/// The number of documents modified. -@property (nonatomic, readonly) NSUInteger modifiedCount; - -/// The identifier of the inserted document if an upsert took place and the document's primary key is an `ObjectId`. -@property (nonatomic, nullable, readonly) RLMObjectId *objectId -__attribute__((deprecated("Use documentId instead, which support all BSON types", "documentId"))); - -/// The identifier of the inserted document if an upsert took place. -@property (nonatomic, nullable, readonly) id documentId; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMUser.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMUser.h deleted file mode 100644 index 436350f9b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMUser.h +++ /dev/null @@ -1,447 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import -#import -#import - -@class RLMUser, RLMSyncSession, RLMRealm, RLMUserIdentity, RLMAPIKeyAuth, RLMMongoClient, RLMMongoDatabase, RLMMongoCollection, RLMUserProfile; -@protocol RLMBSON; - -/** - The state of the user object. - */ -typedef NS_ENUM(NSUInteger, RLMUserState) { - /// The user is logged out. Call `logInWithCredentials:...` with valid credentials to log the user back in. - RLMUserStateLoggedOut, - /// The user is logged in, and any Realms associated with it are syncing with Atlas App Services. - RLMUserStateLoggedIn, - /// The user has been removed, and cannot be used. - RLMUserStateRemoved -}; - -/// A block type used to report an error related to a specific user. -RLM_SWIFT_SENDABLE -typedef void(^RLMOptionalUserBlock)(RLMUser * _Nullable, NSError * _Nullable); - -/// A block type used to report an error on a network request from the user. -RLM_SWIFT_SENDABLE -typedef void(^RLMUserOptionalErrorBlock)(NSError * _Nullable); - -/// A block which returns a dictionary should there be any custom data set for a user -RLM_SWIFT_SENDABLE -typedef void(^RLMUserCustomDataBlock)(NSDictionary * _Nullable, NSError * _Nullable); - -/// A block type for returning from function calls. -RLM_SWIFT_SENDABLE -typedef void(^RLMCallFunctionCompletionBlock)(id _Nullable, NSError * _Nullable); - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A `RLMUser` instance represents a single Realm App user account. - - A user may have one or more credentials associated with it. These credentials - uniquely identify the user to the authentication provider, and are used to sign - into an Atlas App Services user account. - - Note that user objects are only vended out via SDK APIs, and cannot be directly - initialized. User objects can be accessed from any thread. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // internally thread-safe -@interface RLMUser : NSObject - -/** - The unique Atlas App Services string identifying this user. - Note this is different from an identity: A user may have multiple identities but has a single identifier. See RLMUserIdentity. - */ -@property (nonatomic, readonly) NSString *identifier NS_SWIFT_NAME(id); - -/// Returns an array of identities currently linked to a user. -@property (nonatomic, readonly) NSArray *identities; - -/** - The user's refresh token used to access App Services. - - By default, refresh tokens expire 60 days after they are issued. - You can configure this time for your App's refresh tokens to be - anywhere between 30 minutes and 180 days. - - You can configure the refresh token expiration time for all sessions in - an App from the Admin UI or Admin API. -*/ -@property (nullable, nonatomic, readonly) NSString *refreshToken; - -/** - The user's access token used to access App Services. - - This is required to make HTTP requests to Atlas App Services like the Data API or GraphQL. - It should be treated as sensitive data. - - The Realm SDK automatically manages access tokens and refreshes them - when they expire. - */ -@property (nullable, nonatomic, readonly) NSString *accessToken; - -/** - The current state of the user. - */ -@property (nonatomic, readonly) RLMUserState state; - -/** - Indicates if the user is logged in or not. Returns true if the access token and refresh token are not empty. - */ -@property (nonatomic, readonly) BOOL isLoggedIn; - -#pragma mark - Lifecycle - -/** - Create a partition-based sync configuration instance for the given partition value. - - @param partitionValue The `RLMBSON` value the Realm is partitioned on. - @return A default configuration object with the sync configuration set to use the given partition value. - */ -- (RLMRealmConfiguration *)configurationWithPartitionValue:(nullable id)partitionValue NS_REFINED_FOR_SWIFT; - -/** - Create a partition-based sync configuration instance for the given partition value. - - @param partitionValue The `RLMBSON` value the Realm is partitioned on. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - - @return A configuration object with the sync configuration set to use the given partition value. - */ -- (RLMRealmConfiguration *)configurationWithPartitionValue:(nullable id)partitionValue - clientResetMode:(RLMClientResetMode)clientResetMode NS_REFINED_FOR_SWIFT; - -/** - Create a partition-based sync configuration instance for the given partition value. - - @param partitionValue The `RLMBSON` value the Realm is partitioned on. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param beforeResetBlock A callback which notifies prior to a client reset occurring. See: `RLMClientResetBeforeBlock` - @param afterResetBlock A callback which notifies after a client reset has occurred. See: `RLMClientResetAfterBlock` - - @return A configuration object with the sync configuration set to use the given partition value. - */ -- (RLMRealmConfiguration *)configurationWithPartitionValue:(nullable id)partitionValue - clientResetMode:(RLMClientResetMode)clientResetMode - notifyBeforeReset:(nullable RLMClientResetBeforeBlock)beforeResetBlock - notifyAfterReset:(nullable RLMClientResetAfterBlock)afterResetBlock NS_REFINED_FOR_SWIFT; - -/** - Create a partition-based sync configuration instance for the given partition value. - - @param partitionValue The `RLMBSON` value the Realm is partitioned on. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param manualClientResetHandler An error reporting block that is invoked during a client reset. - @See ``RLMSyncErrorReportingBlock`` and ``RLMClientResetInfo`` - - @return A configuration object with the sync configuration set to use the given partition value. - */ -- (RLMRealmConfiguration *)configurationWithPartitionValue:(nullable id)partitionValue - clientResetMode:(RLMClientResetMode)clientResetMode - manualClientResetHandler:(nullable RLMSyncErrorReportingBlock)manualClientResetHandler NS_REFINED_FOR_SWIFT; - -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @return A ``RLMRealmConfiguration`` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfiguration NS_REFINED_FOR_SWIFT; - -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param beforeResetBlock A callback which notifies prior to a client reset occurring. See: `RLMClientResetBeforeBlock` - @param afterResetBlock A callback which notifies after a client reset has occurred. See: `RLMClientResetAfterBlock` - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithClientResetMode:(RLMClientResetMode)clientResetMode - notifyBeforeReset:(nullable RLMClientResetBeforeBlock)beforeResetBlock - notifyAfterReset:(nullable RLMClientResetAfterBlock)afterResetBlock NS_REFINED_FOR_SWIFT; -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param manualClientResetHandler An error reporting block that is invoked during a client reset. - @See `RLMSyncErrorReportingBlock` and `RLMClientResetInfo` - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithClientResetMode:(RLMClientResetMode)clientResetMode - manualClientResetHandler:(nullable RLMSyncErrorReportingBlock)manualClientResetHandler NS_REFINED_FOR_SWIFT; - -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param initialSubscriptions A block which receives a subscription set instance, that can be - used to add an initial set of subscriptions which will be executed - when the Realm is first opened. - @param rerunOnOpen If true, allows to run the initial set of subscriptions specified, on every app startup. - This can be used to re-run dynamic time ranges and other queries that require a - re-computation of a static variable. - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithInitialSubscriptions:(RLMFlexibleSyncInitialSubscriptionsBlock)initialSubscriptions - rerunOnOpen:(BOOL)rerunOnOpen NS_REFINED_FOR_SWIFT; -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param initialSubscriptions A block which receives a subscription set instance, that can be - used to add an initial set of subscriptions which will be executed - when the Realm is first opened. - @param rerunOnOpen If true, allows to run the initial set of subscriptions specified, on every app startup. - This can be used to re-run dynamic time ranges and other queries that require a - re-computation of a static variable. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param beforeResetBlock A callback which notifies prior to a client reset occurring. See: `RLMClientResetBeforeBlock` - @param afterResetBlock A callback which notifies after a client reset has occurred. See: `RLMClientResetAfterBlock` - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithInitialSubscriptions:(RLMFlexibleSyncInitialSubscriptionsBlock)initialSubscriptions - rerunOnOpen:(BOOL)rerunOnOpen - clientResetMode:(RLMClientResetMode)clientResetMode - notifyBeforeReset:(nullable RLMClientResetBeforeBlock)beforeResetBlock - notifyAfterReset:(nullable RLMClientResetAfterBlock)afterResetBlock NS_REFINED_FOR_SWIFT; - -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param initialSubscriptions A block which receives a subscription set instance, that can be - used to add an initial set of subscriptions which will be executed - when the Realm is first opened. - @param rerunOnOpen If true, allows to run the initial set of subscriptions specified, on every app startup. - This can be used to re-run dynamic time ranges and other queries that require a - re-computation of a static variable. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param manualClientResetHandler An error reporting block that is invoked during a client reset. - @See `RLMSyncErrorReportingBlock` and `RLMClientResetInfo` - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithInitialSubscriptions:(RLMFlexibleSyncInitialSubscriptionsBlock)initialSubscriptions - rerunOnOpen:(BOOL)rerunOnOpen - clientResetMode:(RLMClientResetMode)clientResetMode - manualClientResetHandler:(nullable RLMSyncErrorReportingBlock)manualClientResetHandler NS_REFINED_FOR_SWIFT; - -#pragma mark - Sessions - -/** - Retrieve a valid session object belonging to this user for a given URL, or `nil` - if no such object exists. - */ -- (nullable RLMSyncSession *)sessionForPartitionValue:(id)partitionValue; - -/// Retrieve all the valid sessions belonging to this user. -@property (nonatomic, readonly) NSArray *allSessions; - -#pragma mark - Custom Data - -/** - The custom data of the user. - This is configured in your Atlas App Services app. - */ -@property (nonatomic, readonly) NSDictionary *customData NS_REFINED_FOR_SWIFT; - -/** - The profile of the user. - */ -@property (nonatomic, readonly) RLMUserProfile *profile; - -/** - Refresh a user's custom data. This will, in effect, refresh the user's auth session. - */ -- (void)refreshCustomDataWithCompletion:(RLMUserCustomDataBlock)completion; - -/** - Links the currently authenticated user with a new identity, where the identity is defined by the credential - specified as a parameter. This will only be successful if this `RLMUser` is the currently authenticated - with the client from which it was created. On success a new user will be returned with the new linked credentials. - - @param credentials The `RLMCredentials` used to link the user to a new identity. - @param completion The completion handler to call when the linking is complete. - If the operation is successful, the result will contain a new - `RLMUser` object representing the currently logged in user. -*/ -- (void)linkUserWithCredentials:(RLMCredentials *)credentials - completion:(RLMOptionalUserBlock)completion NS_REFINED_FOR_SWIFT; - -/** - Removes the user - - This logs out and destroys the session related to this user. The completion block will return an error - if the user is not found or is already removed. - - @param completion A callback invoked on completion -*/ -- (void)removeWithCompletion:(RLMUserOptionalErrorBlock)completion; - -/** - Permanently deletes this user from your Atlas App Services app. - - The users state will be set to `Removed` and the session will be destroyed. - If the delete request fails, the local authentication state will be untouched. - - @param completion A callback invoked on completion -*/ -- (void)deleteWithCompletion:(RLMUserOptionalErrorBlock)completion; - -/** - Logs out the current user - - The users state will be set to `Removed` is they are an anonymous user or `LoggedOut` if they are authenticated by an email / password or third party auth clients - If the logout request fails, this method will still clear local authentication state. - - @param completion A callback invoked on completion -*/ -- (void)logOutWithCompletion:(RLMUserOptionalErrorBlock)completion; - -/** - A client for the user API key authentication provider which - can be used to create and modify user API keys. - - This client should only be used by an authenticated user. -*/ -@property (nonatomic, readonly) RLMAPIKeyAuth *apiKeysAuth; - -/// A client for interacting with a remote MongoDB instance -/// @param serviceName The name of the MongoDB service -- (RLMMongoClient *)mongoClientWithServiceName:(NSString *)serviceName NS_REFINED_FOR_SWIFT; - -/** - Calls the Atlas App Services function with the provided name and arguments. - - @param name The name of the Atlas App Services function to be called. - @param arguments The `BSONArray` of arguments to be provided to the function. - @param completion The completion handler to call when the function call is complete. - This handler is executed on a non-main global `DispatchQueue`. -*/ -- (void)callFunctionNamed:(NSString *)name - arguments:(NSArray> *)arguments - completionBlock:(RLMCallFunctionCompletionBlock)completion NS_REFINED_FOR_SWIFT; - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("RLMUser cannot be created directly"))); -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("RLMUser cannot be created directly"))); - -@end - -#pragma mark - User info classes - -/** - An identity of a user. A user can have multiple identities, usually associated with multiple providers. - Note this is different from a user's unique identifier string. - @seeAlso `RLMUser.identifier` - */ -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMUserIdentity : NSObject - -/** - The associated provider type - */ -@property (nonatomic, readonly) NSString *providerType; - -/** - The string which identifies the RLMUserIdentity - */ -@property (nonatomic, readonly) NSString *identifier; - -/** - Initialize an RLMUserIdentity for the given identifier and provider type. - @param providerType the associated provider type - @param identifier the identifier of the identity - */ -- (instancetype)initUserIdentityWithProviderType:(NSString *)providerType - identifier:(NSString *)identifier; - -@end - -/** - A profile for a given User. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMUserProfile : NSObject - -/// The full name of the user. -@property (nonatomic, readonly, nullable) NSString *name; -/// The email address of the user. -@property (nonatomic, readonly, nullable) NSString *email; -/// A URL to the user's profile picture. -@property (nonatomic, readonly, nullable) NSString *pictureURL; -/// The first name of the user. -@property (nonatomic, readonly, nullable) NSString *firstName; -/// The last name of the user. -@property (nonatomic, readonly, nullable) NSString *lastName; -/// The gender of the user. -@property (nonatomic, readonly, nullable) NSString *gender; -/// The birthdate of the user. -@property (nonatomic, readonly, nullable) NSString *birthday; -/// The minimum age of the user. -@property (nonatomic, readonly, nullable) NSString *minAge; -/// The maximum age of the user. -@property (nonatomic, readonly, nullable) NSString *maxAge; -/// The BSON dictionary of metadata associated with this user. -@property (nonatomic, readonly) NSDictionary *metadata NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMUserAPIKey.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMUserAPIKey.h deleted file mode 100644 index 2cdd82b2a..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMUserAPIKey.h +++ /dev/null @@ -1,43 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// UserAPIKey model for APIKeys recevied from the server. -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMUserAPIKey : NSObject - -/// Indicates if the API key is disabled or not -@property (nonatomic, readonly) BOOL disabled; - -/// The name of the key. -@property (nonatomic, readonly) NSString *name; - -/// The actual key. Will only be included in -/// the response when an API key is first created. -@property (nonatomic, readonly, nullable) NSString *key; - -/// The ObjectId of the API key -@property (nonatomic, readonly) RLMObjectId *objectId NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMValue.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMValue.h deleted file mode 100644 index ac1f10ee4..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/RLMValue.h +++ /dev/null @@ -1,97 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import -#import -#import -#import -#import - -#pragma mark RLMValue - -/** - RLMValue is a property type which represents a polymorphic Realm value. This is similar to the usage of - `AnyObject` / `Any` in Swift. -``` - // A property on `MyObject` - @property (nonatomic) id myAnyValue; - - // A property on `AnotherObject` - @property (nonatomic) id myAnyValue; - - MyObject *myObject = [MyObject createInRealm:realm withValue:@[]]; - myObject.myAnyValue = @1234; // underlying type is NSNumber. - myObject.myAnyValue = @"hello"; // underlying type is NSString. - AnotherObject *anotherObject = [AnotherObject createInRealm:realm withValue:@[]]; - myObject.myAnyValue = anotherObject; // underlying type is RLMObject. -``` - The following types conform to RLMValue: - - `NSData` - `NSDate` - `NSNull` - `NSNumber` - `NSUUID` - `NSString` - `RLMObject - `RLMObjectId` - `RLMDecimal128` - */ -@protocol RLMValue - -/// Describes the type of property stored. -@property (readonly) RLMPropertyType rlm_valueType; - -@end - -/// :nodoc: -@interface NSNull (RLMValue) -@end - -/// :nodoc: -@interface NSNumber (RLMValue) -@end - -/// :nodoc: -@interface NSString (RLMValue) -@end - -/// :nodoc: -@interface NSData (RLMValue) -@end - -/// :nodoc: -@interface NSDate (RLMValue) -@end - -/// :nodoc: -@interface NSUUID (RLMValue) -@end - -/// :nodoc: -@interface RLMDecimal128 (RLMValue) -@end - -/// :nodoc: -@interface RLMObjectBase (RLMValue) -@end - -/// :nodoc: -@interface RLMObjectId (RLMValue) -@end diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/Realm.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/Realm.h deleted file mode 100644 index 245596393..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Headers/Realm.h +++ /dev/null @@ -1,63 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import - -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Info.plist b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Info.plist deleted file mode 100644 index 1647166d5..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Info.plist and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/LICENSE b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/LICENSE deleted file mode 100644 index 66a27ec5f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/LICENSE +++ /dev/null @@ -1,177 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Modules/module.modulemap b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Modules/module.modulemap deleted file mode 100644 index 519ddc20b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Modules/module.modulemap +++ /dev/null @@ -1,88 +0,0 @@ -framework module Realm { - export Foundation - - umbrella header "Realm.h" - - header "RLMArray.h" - header "RLMAsymmetricObject.h" - header "RLMDecimal128.h" - header "RLMDictionary.h" - header "RLMEmbeddedObject.h" - header "RLMLogger.h" - header "RLMMigration.h" - header "RLMObject.h" - header "RLMObjectId.h" - header "RLMObjectSchema.h" - header "RLMProperty.h" - header "RLMProviderClient.h" - header "RLMRealm+Sync.h" - header "RLMRealm.h" - header "RLMRealmConfiguration.h" - header "RLMResults.h" - header "RLMSchema.h" - header "RLMSectionedResults.h" - header "RLMSet.h" - header "RLMValue.h" - - header "RLMApp.h" - header "RLMCredentials.h" - header "RLMNetworkTransport.h" - header "RLMPushClient.h" - header "RLMRealm+Sync.h" - header "RLMSyncConfiguration.h" - header "RLMSyncManager.h" - header "RLMSyncSession.h" - header "RLMUser.h" - header "RLMUserAPIKey.h" - header "RLMAPIKeyAuth.h" - header "RLMEmailPasswordAuth.h" - header "NSError+RLMSync.h" - header "RLMBSON.h" - header "RLMMongoClient.h" - header "RLMMongoDatabase.h" - header "RLMMongoCollection.h" - header "RLMUpdateResult.h" - header "RLMFindOptions.h" - header "RLMFindOneAndModifyOptions.h" - header "RLMSyncSubscription.h" - - explicit module Private { - header "RLMAccessor.h" - header "RLMApp_Private.h" - header "RLMArray_Private.h" - header "RLMAsyncTask_Private.h" - header "RLMCollection_Private.h" - header "RLMDictionary_Private.h" - header "RLMLogger_Private.h" - header "RLMEvent.h" - header "RLMMongoCollection_Private.h" - header "RLMObjectBase_Dynamic.h" - header "RLMObjectBase_Private.h" - header "RLMObjectSchema_Private.h" - header "RLMObjectStore.h" - header "RLMObject_Private.h" - header "RLMProperty_Private.h" - header "RLMRealmConfiguration_Private.h" - header "RLMRealm_Private.h" - header "RLMResults_Private.h" - header "RLMScheduler.h" - header "RLMSchema_Private.h" - header "RLMSectionedResults.h" - header "RLMSet_Private.h" - header "RLMSwiftCollectionBase.h" - header "RLMSwiftProperty.h" - header "RLMSwiftValueStorage.h" - header "RLMSyncConfiguration_Private.h" - header "RLMSyncSubscription_Private.h" - header "RLMUser_Private.h" - } - - explicit module Dynamic { - header "RLMRealm_Dynamic.h" - header "RLMObjectBase_Dynamic.h" - } - - explicit module Swift { - header "RLMSwiftObject.h" - } -} diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMAccessor.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMAccessor.h deleted file mode 100644 index db915ca7c..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMAccessor.h +++ /dev/null @@ -1,53 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectSchema, RLMProperty, RLMObjectBase; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -// -// Accessors Class Creation/Caching -// - -// get accessor classes for an object class - generates classes if not cached -Class RLMManagedAccessorClassForObjectClass(Class objectClass, RLMObjectSchema *schema, const char *name); -Class RLMUnmanagedAccessorClassForObjectClass(Class objectClass, RLMObjectSchema *schema); - -// -// Dynamic getters/setters -// -FOUNDATION_EXTERN void RLMDynamicValidatedSet(RLMObjectBase *obj, NSString *propName, id __nullable val); -FOUNDATION_EXTERN id __nullable RLMDynamicGet(RLMObjectBase *obj, RLMProperty *prop); -FOUNDATION_EXTERN id __nullable RLMDynamicGetByName(RLMObjectBase *obj, NSString *propName); - -// by property/column -void RLMDynamicSet(RLMObjectBase *obj, RLMProperty *prop, id val); - -// -// Class modification -// - -// Replace className method for the given class -void RLMReplaceClassNameMethod(Class accessorClass, NSString *className); - -// Replace sharedSchema method for the given class -void RLMReplaceSharedSchemaMethod(Class accessorClass, RLMObjectSchema * __nullable schema); - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMApp_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMApp_Private.h deleted file mode 100644 index 5da5c3c7a..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMApp_Private.h +++ /dev/null @@ -1,50 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// Observer block for app notifications. -typedef void(^RLMAppNotificationBlock)(RLMApp *); - -/// Token that identifies an observer. Unsubscribes when deconstructed to -/// avoid dangling observers, therefore this must be retained to hold -/// onto a subscription. -@interface RLMAppSubscriptionToken : NSObject -- (void)unsubscribe; -@end - -@interface RLMApp () -/// Returns all currently cached Apps -+ (NSArray *)allApps; -/// Subscribe to notifications for this RLMApp. -- (RLMAppSubscriptionToken *)subscribe:(RLMAppNotificationBlock)block; - -+ (instancetype)appWithConfiguration:(RLMAppConfiguration *)configuration; - -+ (void)resetAppCache; -@end - -@interface RLMAppConfiguration () -@property (nonatomic) NSString *appId; -@property (nonatomic) BOOL encryptMetadata; -@property (nonatomic) NSURL *rootDirectory; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMArray_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMArray_Private.h deleted file mode 100644 index 1a37f010e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMArray_Private.h +++ /dev/null @@ -1,44 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -@class RLMObjectBase, RLMProperty; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMArray () -- (instancetype)initWithObjectClassName:(NSString *)objectClassName; -- (instancetype)initWithObjectType:(RLMPropertyType)type optional:(BOOL)optional; -- (NSString *)descriptionWithMaxDepth:(NSUInteger)depth; -- (void)setParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -- (void)replaceAllObjectsWithObjects:(NSArray *)objects; -// YES if the property is declared with old property syntax. -@property (nonatomic, readonly) BOOL isLegacyProperty; -// The name of the property which this collection represents -@property (nonatomic, readonly) NSString *propertyKey; -@end - -@interface RLMManagedArray : RLMArray -- (instancetype)initWithParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -@end - -void RLMArrayValidateMatchingObjectType(RLMArray *array, id value); - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMAsyncTask_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMAsyncTask_Private.h deleted file mode 100644 index 3cce89441..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMAsyncTask_Private.h +++ /dev/null @@ -1,71 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import "RLMRealm_Private.h" - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMAsyncOpenTask () -@property (nonatomic, nullable) RLMRealm *localRealm; - -- (instancetype)initWithConfiguration:(RLMRealmConfiguration *)configuration - confinedTo:(RLMScheduler *)confinement - download:(bool)waitForDownloadCompletion - completion:(RLMAsyncOpenRealmCallback)completion -__attribute__((objc_direct)); - -- (instancetype)initWithConfiguration:(RLMRealmConfiguration *)configuration - confinedTo:(RLMScheduler *)confinement - download:(bool)waitForDownloadCompletion; - -- (void)waitWithCompletion:(void (^)(NSError *_Nullable))completion; -- (void)waitForOpen:(RLMAsyncOpenRealmCallback)completion __attribute__((objc_direct)); -@end - -// A cancellable task for waiting for downloads on an already-open Realm. -RLM_SWIFT_SENDABLE -@interface RLMAsyncDownloadTask : NSObject -- (instancetype)initWithRealm:(RLMRealm *)realm; -- (void)cancel; -- (void)waitWithCompletion:(void (^)(NSError *_Nullable))completion; -@end - -// A cancellable task for beginning an async write -RLM_SWIFT_SENDABLE -@interface RLMAsyncWriteTask : NSObject -// Must only be called from within the Actor -- (instancetype)initWithRealm:(RLMRealm *)realm; -- (void)setTransactionId:(RLMAsyncTransactionId)transactionID; -- (void)complete:(bool)cancel; - -// Can be called from any thread -- (void)wait:(void (^)(void))completion; -@end - -typedef void (^RLMAsyncRefreshCompletion)(bool); -// A cancellable task for refreshing a Realm -RLM_SWIFT_SENDABLE -@interface RLMAsyncRefreshTask : NSObject -- (void)complete:(bool)didRefresh; -- (void)wait:(RLMAsyncRefreshCompletion)completion; -+ (RLMAsyncRefreshTask *)completedRefresh; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMBSON_Private.hpp b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMBSON_Private.hpp deleted file mode 100644 index c5cc1a410..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMBSON_Private.hpp +++ /dev/null @@ -1,32 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -namespace realm::bson { -class Bson; -template class IndexedMap; -using BsonDocument = IndexedMap; -} - -realm::bson::Bson RLMConvertRLMBSONToBson(id b); -realm::bson::BsonDocument RLMConvertRLMBSONArrayToBsonDocument(NSArray> *array); -id RLMConvertBsonToRLMBSON(const realm::bson::Bson& b); -id RLMConvertBsonDocumentToRLMBSON(std::optional b); -NSArray> *RLMConvertBsonDocumentToRLMBSONArray(std::optional b); diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMCollection_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMCollection_Private.h deleted file mode 100644 index 7d31bd3f0..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMCollection_Private.h +++ /dev/null @@ -1,42 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@protocol RLMCollectionPrivate; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -NSUInteger RLMUnmanagedFastEnumerate(id collection, NSFastEnumerationState *); -void RLMCollectionSetValueForKey(id collection, NSString *key, id _Nullable value); -FOUNDATION_EXTERN NSString *RLMDescriptionWithMaxDepth(NSString *name, id collection, NSUInteger depth); -FOUNDATION_EXTERN void RLMAssignToCollection(id collection, id value); -FOUNDATION_EXTERN void RLMSetSwiftBridgeCallback(id _Nullable (*_Nonnull)(id)); - -FOUNDATION_EXTERN -RLMNotificationToken *RLMAddNotificationBlock(id collection, id block, - NSArray *_Nullable keyPaths, - dispatch_queue_t _Nullable queue); - -typedef RLM_CLOSED_ENUM(int32_t, RLMCollectionType) { - RLMCollectionTypeArray = 0, - RLMCollectionTypeSet = 1, - RLMCollectionTypeDictionary = 2 -}; - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMDictionary_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMDictionary_Private.h deleted file mode 100644 index 37ff740c7..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMDictionary_Private.h +++ /dev/null @@ -1,46 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectBase, RLMProperty; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMDictionary () -- (instancetype)initWithObjectClassName:(NSString *)objectClassName keyType:(RLMPropertyType)keyType; -- (instancetype)initWithObjectType:(RLMPropertyType)type optional:(BOOL)optional keyType:(RLMPropertyType)keyType; -- (NSString *)descriptionWithMaxDepth:(NSUInteger)depth; -- (void)setParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -// YES if the property is declared with old property syntax. -@property (nonatomic, readonly) BOOL isLegacyProperty; -// The name of the property which this collection represents -@property (nonatomic, readonly) NSString *propertyKey; -@end - -@interface RLMManagedDictionary : RLMDictionary -- (instancetype)initWithParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -@end - -FOUNDATION_EXTERN NSString *RLMDictionaryDescriptionWithMaxDepth(NSString *name, - RLMDictionary *dictionary, - NSUInteger depth); -id RLMDictionaryKey(RLMDictionary *dictionary, id key) RLM_HIDDEN; -id RLMDictionaryValue(RLMDictionary *dictionary, id value) RLM_HIDDEN; - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMEvent.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMEvent.h deleted file mode 100644 index 9a6acb1a6..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMEvent.h +++ /dev/null @@ -1,64 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2022 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#ifdef __cplusplus -#include - -namespace realm { -struct AuditConfig; -} -#endif - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMRealm, RLMUser, RLMRealmConfiguration; -typedef RLM_CLOSED_ENUM(NSUInteger, RLMSyncLogLevel); - -struct RLMEventContext; -typedef void (^RLMEventCompletion)(NSError *_Nullable); - -FOUNDATION_EXTERN struct RLMEventContext *_Nullable RLMEventGetContext(RLMRealm *realm); -FOUNDATION_EXTERN uint64_t RLMEventBeginScope(struct RLMEventContext *context, NSString *activity); -FOUNDATION_EXTERN void RLMEventCommitScope(struct RLMEventContext *context, uint64_t scope_id, - RLMEventCompletion _Nullable completion); -FOUNDATION_EXTERN void RLMEventCancelScope(struct RLMEventContext *context, uint64_t scope_id); -FOUNDATION_EXTERN bool RLMEventIsActive(struct RLMEventContext *context, uint64_t scope_id); -FOUNDATION_EXTERN void RLMEventRecordEvent(struct RLMEventContext *context, NSString *activity, - NSString *_Nullable event, NSString *_Nullable data, - RLMEventCompletion _Nullable completion); -FOUNDATION_EXTERN void RLMEventUpdateMetadata(struct RLMEventContext *context, - NSDictionary *newMetadata); - -@interface RLMEventConfiguration : NSObject -@property (nonatomic) NSString *partitionPrefix; -@property (nonatomic, nullable) RLMUser *syncUser; -@property (nonatomic, nullable) NSDictionary *metadata; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" -@property (nonatomic, nullable) void (^logger)(RLMSyncLogLevel, NSString *); -#pragma clang diagnostic pop -@property (nonatomic, nullable) RLM_SWIFT_SENDABLE void (^errorHandler)(NSError *); - -#ifdef __cplusplus -- (std::shared_ptr)auditConfigWithRealmConfiguration:(RLMRealmConfiguration *)realmConfig; -#endif -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMLogger_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMLogger_Private.h deleted file mode 100644 index 08f8c591e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMLogger_Private.h +++ /dev/null @@ -1,36 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMLogger() - -/** - Log a message to the supplied level. - - @param logLevel The log level for the message. - @param message The message to log. - */ -- (void)logWithLevel:(RLMLogLevel)logLevel message:(NSString *)message, ... NS_SWIFT_UNAVAILABLE(""); -- (void)logLevel:(RLMLogLevel)logLevel message:(NSString *)message; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMMigration_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMMigration_Private.h deleted file mode 100644 index 393f41184..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMMigration_Private.h +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import -#import - -namespace realm { - class Schema; -} - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMMigration () - -@property (nonatomic, strong) RLMRealm *oldRealm; -@property (nonatomic, strong) RLMRealm *realm; - -- (instancetype)initWithRealm:(RLMRealm *)realm oldRealm:(RLMRealm *)oldRealm schema:(realm::Schema &)schema; - -- (void)execute:(RLMMigrationBlock)block objectClass:(_Nullable Class)cls; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMMongoCollection_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMMongoCollection_Private.h deleted file mode 100644 index 77bbf9752..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMMongoCollection_Private.h +++ /dev/null @@ -1,37 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@class RLMUser; - -@interface RLMMongoCollection () -- (instancetype)initWithUser:(RLMUser *)user - serviceName:(NSString *)serviceName - databaseName:(NSString *)databaseName - collectionName:(NSString *)collectionName; - -- (RLMChangeStream *)watchWithMatchFilter:(nullable id)matchFilter - idFilter:(nullable id)idFilter - delegate:(id)delegate - scheduler:(void (^)(dispatch_block_t))scheduler; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMObjectBase_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMObjectBase_Private.h deleted file mode 100644 index af547b17e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMObjectBase_Private.h +++ /dev/null @@ -1,34 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2017 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMArray; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -// RLMObjectBase private -@interface RLMObjectBase () -@property (nonatomic, nullable) NSMutableArray *lastAccessedNames; - -+ (void)initializeLinkedObjectSchemas; -+ (bool)isEmbedded; -+ (bool)isAsymmetric; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMObjectSchema_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMObjectSchema_Private.h deleted file mode 100644 index 08855a82b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMObjectSchema_Private.h +++ /dev/null @@ -1,75 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -// RLMObjectSchema private -@interface RLMObjectSchema () { -@public - bool _isSwiftClass; -} - -/// The object type name reported to the object store and core. -@property (nonatomic, readonly) NSString *objectName; - -// writable redeclaration -@property (nonatomic, readwrite, copy) NSArray *properties; -@property (nonatomic, readwrite, assign) bool isSwiftClass; -@property (nonatomic, readwrite, assign) BOOL isEmbedded; -@property (nonatomic, readwrite, assign) BOOL isAsymmetric; - -// class used for this object schema -@property (nonatomic, readwrite, assign) Class objectClass; -@property (nonatomic, readwrite, assign) Class accessorClass; -@property (nonatomic, readwrite, assign) Class unmanagedClass; - -@property (nonatomic, readwrite, assign) bool hasCustomEventSerialization; - -@property (nonatomic, readwrite, nullable) RLMProperty *primaryKeyProperty; - -@property (nonatomic, copy) NSArray *computedProperties; -@property (nonatomic, readonly, nullable) NSArray *swiftGenericProperties; - -// returns a cached or new schema for a given object class -+ (instancetype)schemaForObjectClass:(Class)objectClass; -@end - -@interface RLMObjectSchema (Dynamic) -/** - This method is useful only in specialized circumstances, for example, when accessing objects - in a Realm produced externally. If you are simply building an app on Realm, it is not recommended - to use this method as an [RLMObjectSchema](RLMObjectSchema) is generated automatically for every [RLMObject](RLMObject) subclass. - - Initialize an RLMObjectSchema with classname, objectClass, and an array of properties - - @warning This method is useful only in specialized circumstances. - - @param objectClassName The name of the class used to refer to objects of this type. - @param objectClass The Objective-C class used when creating instances of this type. - @param properties An array of RLMProperty instances describing the managed properties for this type. - - @return An initialized instance of RLMObjectSchema. - */ -- (instancetype)initWithClassName:(NSString *)objectClassName objectClass:(Class)objectClass properties:(NSArray *)properties; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMObjectStore.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMObjectStore.h deleted file mode 100644 index 6045f1e8e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMObjectStore.h +++ /dev/null @@ -1,98 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#ifdef __cplusplus -extern "C" { -#endif - -@class RLMRealm, RLMSchema, RLMObjectBase, RLMResults, RLMProperty; - -typedef NS_ENUM(NSUInteger, RLMUpdatePolicy) { - RLMUpdatePolicyError = 1, - RLMUpdatePolicyUpdateChanged = 3, - RLMUpdatePolicyUpdateAll = 2, -}; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -void RLMVerifyHasPrimaryKey(Class cls); - -void RLMVerifyInWriteTransaction(RLMRealm *const realm); - -// -// Adding, Removing, Getting Objects -// - -// add an object to the given realm -void RLMAddObjectToRealm(RLMObjectBase *object, RLMRealm *realm, RLMUpdatePolicy); - -// delete an object from its realm -void RLMDeleteObjectFromRealm(RLMObjectBase *object, RLMRealm *realm); - -// deletes all objects from a realm -void RLMDeleteAllObjectsFromRealm(RLMRealm *realm); - -// get objects of a given class -RLMResults *RLMGetObjects(RLMRealm *realm, NSString *objectClassName, NSPredicate * _Nullable predicate) -NS_RETURNS_RETAINED; - -// get an object with the given primary key -id _Nullable RLMGetObject(RLMRealm *realm, NSString *objectClassName, id _Nullable key) NS_RETURNS_RETAINED; - -// create object from array or dictionary -RLMObjectBase *RLMCreateObjectInRealmWithValue(RLMRealm *realm, NSString *className, - id _Nullable value, RLMUpdatePolicy updatePolicy) -NS_RETURNS_RETAINED; - -// creates an asymmetric object and doesn't return -void RLMCreateAsymmetricObjectInRealm(RLMRealm *realm, NSString *className, id value); - -// -// Accessor Creation -// - - -// Perform the per-property accessor initialization for a managed RealmSwiftObject -// promotingExisting should be true if the object was previously used as an -// unmanaged object, and false if it is a newly created object. -void RLMInitializeSwiftAccessor(RLMObjectBase *object, bool promotingExisting); - -#ifdef __cplusplus -} - -namespace realm { - class Obj; - class Table; - struct ColKey; - struct ObjLink; -} -class RLMClassInfo; - -// get an object with a given table & object key -RLMObjectBase *RLMObjectFromObjLink(RLMRealm *realm, - realm::ObjLink&& objLink, - bool parentIsSwiftObject) NS_RETURNS_RETAINED; - -// Create accessors -RLMObjectBase *RLMCreateObjectAccessor(RLMClassInfo& info, int64_t key) NS_RETURNS_RETAINED; -RLMObjectBase *RLMCreateObjectAccessor(RLMClassInfo& info, const realm::Obj& obj) NS_RETURNS_RETAINED; -#endif - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMObject_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMObject_Private.h deleted file mode 100644 index 8ccdbf576..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMObject_Private.h +++ /dev/null @@ -1,110 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMProperty, RLMArray, RLMSchema; -typedef NS_ENUM(int32_t, RLMPropertyType); - -FOUNDATION_EXTERN void RLMInitializeWithValue(RLMObjectBase *, id, RLMSchema *); - -typedef void (^RLMObjectNotificationCallback)(RLMObjectBase *_Nullable object, - NSArray *_Nullable propertyNames, - NSArray *_Nullable oldValues, - NSArray *_Nullable newValues, - NSError *_Nullable error); - -// RLMObject accessor and read/write realm -@interface RLMObjectBase () { -@public - RLMRealm *_realm; - __unsafe_unretained RLMObjectSchema *_objectSchema; -} - -// shared schema for this class -+ (nullable RLMObjectSchema *)sharedSchema; - -+ (nullable NSArray *)_getProperties; -+ (bool)_realmIgnoreClass; - -// This enables to override the propertiesMapping in Swift, it is not to be used in Objective-C API. -+ (NSDictionary *)propertiesMapping; -@end - -@interface RLMDynamicObject : RLMObject - -@end - -// Calls valueForKey: and re-raises NSUndefinedKeyExceptions -FOUNDATION_EXTERN id _Nullable RLMValidatedValueForProperty(id object, NSString *key, NSString *className); - -// Compare two RLObjectBases -FOUNDATION_EXTERN BOOL RLMObjectBaseAreEqual(RLMObjectBase * _Nullable o1, RLMObjectBase * _Nullable o2); - -FOUNDATION_EXTERN RLMNotificationToken *RLMObjectBaseAddNotificationBlock(RLMObjectBase *obj, - NSArray *_Nullable keyPaths, - dispatch_queue_t _Nullable queue, - RLMObjectNotificationCallback block); - -RLMNotificationToken *RLMObjectAddNotificationBlock(RLMObjectBase *obj, - RLMObjectChangeBlock block, - NSArray *_Nullable keyPaths, - dispatch_queue_t _Nullable queue); - -// Returns whether the class is a descendent of RLMObjectBase -FOUNDATION_EXTERN BOOL RLMIsObjectOrSubclass(Class klass); - -// Returns whether the class is an indirect descendant of RLMObjectBase -FOUNDATION_EXTERN BOOL RLMIsObjectSubclass(Class klass); - -FOUNDATION_EXTERN const NSUInteger RLMDescriptionMaxDepth; - -FOUNDATION_EXTERN id RLMObjectFreeze(RLMObjectBase *obj) NS_RETURNS_RETAINED; - -FOUNDATION_EXTERN id RLMObjectThaw(RLMObjectBase *obj); - -// Gets an object identifier suitable for use with Combine. This value may -// change when an unmanaged object is added to the Realm. -FOUNDATION_EXTERN uint64_t RLMObjectBaseGetCombineId(RLMObjectBase *); - -// An accessor object which is used to interact with Swift properties from obj-c -@interface RLMManagedPropertyAccessor : NSObject -// Perform any initialization required for KVO on a *unmanaged* object -+ (void)observe:(RLMProperty *)property on:(RLMObjectBase *)parent; -// Initialize the given property on a *managed* object which previous was unmanaged -+ (void)promote:(RLMProperty *)property on:(RLMObjectBase *)parent; -// Initialize the given property on a newly created *managed* object -+ (void)initialize:(RLMProperty *)property on:(RLMObjectBase *)parent; -// Read the value of the property, on either kind of object -+ (id)get:(RLMProperty *)property on:(RLMObjectBase *)parent; -// Set the property to the given value, on either kind of object -+ (void)set:(RLMProperty *)property on:(RLMObjectBase *)parent to:(id)value; -@end - -@interface RLMObjectNotificationToken : RLMNotificationToken -- (void)observe:(RLMObjectBase *)obj - keyPaths:(nullable NSArray *)keyPaths - block:(RLMObjectNotificationCallback)block; -- (void)registrationComplete:(void (^)(void))completion; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMProperty_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMProperty_Private.h deleted file mode 100644 index 6a87ced63..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMProperty_Private.h +++ /dev/null @@ -1,139 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -@class RLMObjectBase; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -BOOL RLMPropertyTypeIsComputed(RLMPropertyType propertyType); -FOUNDATION_EXTERN void RLMValidateSwiftPropertyName(NSString *name); - -// Translate an rlmtype to a string representation -static inline NSString *RLMTypeToString(RLMPropertyType type) { - switch (type) { - case RLMPropertyTypeString: - return @"string"; - case RLMPropertyTypeInt: - return @"int"; - case RLMPropertyTypeBool: - return @"bool"; - case RLMPropertyTypeDate: - return @"date"; - case RLMPropertyTypeData: - return @"data"; - case RLMPropertyTypeDouble: - return @"double"; - case RLMPropertyTypeFloat: - return @"float"; - case RLMPropertyTypeAny: - return @"mixed"; - case RLMPropertyTypeObject: - return @"object"; - case RLMPropertyTypeLinkingObjects: - return @"linking objects"; - case RLMPropertyTypeDecimal128: - return @"decimal128"; - case RLMPropertyTypeObjectId: - return @"object id"; - case RLMPropertyTypeUUID: - return @"uuid"; - } - return @"Unknown"; -} - -// private property interface -@interface RLMProperty () { -@public - RLMPropertyType _type; -} - -- (instancetype)initWithName:(NSString *)name - indexed:(BOOL)indexed - linkPropertyDescriptor:(nullable RLMPropertyDescriptor *)linkPropertyDescriptor - property:(objc_property_t)property; - -- (instancetype)initSwiftPropertyWithName:(NSString *)name - indexed:(BOOL)indexed - linkPropertyDescriptor:(nullable RLMPropertyDescriptor *)linkPropertyDescriptor - property:(objc_property_t)property - instance:(RLMObjectBase *)objectInstance; - -- (void)updateAccessors; - -// private setters -@property (nonatomic, readwrite) NSString *name; -@property (nonatomic, readwrite, assign) RLMPropertyType type; -@property (nonatomic, readwrite) BOOL indexed; -@property (nonatomic, readwrite) BOOL optional; -@property (nonatomic, readwrite) BOOL array; -@property (nonatomic, readwrite) BOOL set; -@property (nonatomic, readwrite) BOOL dictionary; -@property (nonatomic, copy, nullable) NSString *objectClassName; -@property (nonatomic, copy, nullable) NSString *linkOriginPropertyName; - -// private properties -@property (nonatomic, readwrite, nullable) NSString *columnName; -@property (nonatomic, assign) NSUInteger index; -@property (nonatomic, assign) BOOL isPrimary; -@property (nonatomic, assign) BOOL isLegacy; -@property (nonatomic, assign) ptrdiff_t swiftIvar; -@property (nonatomic, assign, nullable) Class swiftAccessor; -@property (nonatomic, readwrite, assign) RLMPropertyType dictionaryKeyType; -@property (nonatomic, readwrite) BOOL customMappingIsOptional; - -// getter and setter names -@property (nonatomic, copy) NSString *getterName; -@property (nonatomic, copy) NSString *setterName; -@property (nonatomic, nullable) SEL getterSel; -@property (nonatomic, nullable) SEL setterSel; - -- (RLMProperty *)copyWithNewName:(NSString *)name; -- (NSString *)typeName; - -@end - -@interface RLMProperty (Dynamic) -/** - This method is useful only in specialized circumstances, for example, in conjunction with - +[RLMObjectSchema initWithClassName:objectClass:properties:]. If you are simply building an - app on Realm, it is not recommended to use this method. - - Initialize an RLMProperty - - @warning This method is useful only in specialized circumstances. - - @param name The property name. - @param type The property type. - @param objectClassName The object type used for Object and Array types. - @param linkOriginPropertyName The property name of the origin of a link. Used for linking objects properties. - - @return An initialized instance of RLMProperty. - */ -- (instancetype)initWithName:(NSString *)name - type:(RLMPropertyType)type - objectClassName:(nullable NSString *)objectClassName - linkOriginPropertyName:(nullable NSString *)linkOriginPropertyName - indexed:(BOOL)indexed - optional:(BOOL)optional; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMPushClient_Private.hpp b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMPushClient_Private.hpp deleted file mode 100644 index 44304c9c3..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMPushClient_Private.hpp +++ /dev/null @@ -1,28 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import "RLMPushClient.h" - -namespace realm::app { -class PushClient; -} - -RLM_DIRECT_MEMBERS -@interface RLMPushClient () -- (instancetype)initWithPushClient:(realm::app::PushClient&&)pushClient; -@end diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMRealmConfiguration_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMRealmConfiguration_Private.h deleted file mode 100644 index 12b09676d..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMRealmConfiguration_Private.h +++ /dev/null @@ -1,52 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2015 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMSchema, RLMEventConfiguration; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMRealmConfiguration () - -@property (nonatomic, readwrite) bool cache; -@property (nonatomic, readwrite) bool dynamic; -@property (nonatomic, readwrite) bool disableFormatUpgrade; -@property (nonatomic, copy, nullable) RLMSchema *customSchema; -@property (nonatomic, copy) NSString *pathOnDisk; -@property (nonatomic, retain, nullable) RLMEventConfiguration *eventConfiguration; -@property (nonatomic, nullable) Class migrationObjectClass; -@property (nonatomic) bool disableAutomaticChangeNotifications; - -// Flexible Sync -@property (nonatomic, readwrite, nullable) RLMFlexibleSyncInitialSubscriptionsBlock initialSubscriptions; -@property (nonatomic, readwrite) BOOL rerunOnOpen; - -// Get the default configuration without copying it -+ (RLMRealmConfiguration *)rawDefaultConfiguration; - -+ (void)resetRealmConfigurationState; - -- (void)setCustomSchemaWithoutCopying:(nullable RLMSchema *)schema; -@end - -// Get a path in the platform-appropriate documents directory with the given filename -FOUNDATION_EXTERN NSString *RLMRealmPathForFile(NSString *fileName); -FOUNDATION_EXTERN NSString *RLMRealmPathForFileAndBundleIdentifier(NSString *fileName, NSString *mainBundleIdentifier); - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMRealm_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMRealm_Private.h deleted file mode 100644 index 95841491f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMRealm_Private.h +++ /dev/null @@ -1,94 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMFastEnumerator, RLMScheduler, RLMAsyncRefreshTask, RLMAsyncWriteTask; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -// Disable syncing files to disk. Cannot be re-enabled. Use only for tests. -FOUNDATION_EXTERN void RLMDisableSyncToDisk(void); -// Set whether the skip backup attribute should be set on temporary files. -FOUNDATION_EXTERN void RLMSetSkipBackupAttribute(bool value); - -FOUNDATION_EXTERN NSData * _Nullable RLMRealmValidatedEncryptionKey(NSData *key); - -// Set the queue used for async open. For testing purposes only. -FOUNDATION_EXTERN void RLMSetAsyncOpenQueue(dispatch_queue_t queue); - -// Translate an in-flight exception resulting from an operation on a SharedGroup to -// an NSError or NSException (if error is nil) -void RLMRealmTranslateException(NSError **error); - -// Block until the Realm at the given path is closed. -FOUNDATION_EXTERN void RLMWaitForRealmToClose(NSString *path); -BOOL RLMIsRealmCachedAtPath(NSString *path); - -// Register a block to be called from the next before_notify() invocation -FOUNDATION_EXTERN void RLMAddBeforeNotifyBlock(RLMRealm *realm, dispatch_block_t block); - -// Test hook to run the async notifiers for a Realm which has the background thread disabled -FOUNDATION_EXTERN void RLMRunAsyncNotifiers(NSString *path); - -// Get the cached Realm for the given configuration and scheduler, if any -FOUNDATION_EXTERN RLMRealm *_Nullable RLMGetCachedRealm(RLMRealmConfiguration *, RLMScheduler *) NS_RETURNS_RETAINED; -// Get a cached Realm for the given configuration and any scheduler. The returned -// Realm is not confined to the current thread, so very few operations are safe -// to perform on it -FOUNDATION_EXTERN RLMRealm *_Nullable RLMGetAnyCachedRealm(RLMRealmConfiguration *) NS_RETURNS_RETAINED; - -// Scheduler an async refresh for the given Realm -FOUNDATION_EXTERN RLMAsyncRefreshTask *_Nullable RLMRealmRefreshAsync(RLMRealm *rlmRealm) NS_RETURNS_RETAINED; - -// RLMRealm private members -@interface RLMRealm () -@property (nonatomic, readonly) BOOL dynamic; -@property (nonatomic, readwrite) RLMSchema *schema; -@property (nonatomic, readonly, nullable) id actor; -@property (nonatomic, readonly) bool isFlexibleSync; - -+ (void)resetRealmState; - -- (void)registerEnumerator:(RLMFastEnumerator *)enumerator; -- (void)unregisterEnumerator:(RLMFastEnumerator *)enumerator; -- (void)detachAllEnumerators; - -- (void)sendNotifications:(RLMNotification)notification; -- (void)verifyThread; -- (void)verifyNotificationsAreSupported:(bool)isCollection; - -- (RLMRealm *)frozenCopy NS_RETURNS_RETAINED; - -+ (nullable instancetype)realmWithConfiguration:(RLMRealmConfiguration *)configuration - confinedTo:(RLMScheduler *)options - error:(NSError **)error; - -- (RLMAsyncWriteTask *)beginAsyncWrite NS_RETURNS_RETAINED; -- (void)commitAsyncWriteWithGrouping:(bool)allowGrouping - completion:(void(^)(NSError *_Nullable))completion; -@end - -@interface RLMPinnedRealm : NSObject -@property (nonatomic, readonly) RLMRealmConfiguration *configuration; - -- (instancetype)initWithRealm:(RLMRealm *)realm; -- (void)unpin; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMResults_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMResults_Private.h deleted file mode 100644 index c7e29bebb..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMResults_Private.h +++ /dev/null @@ -1,33 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectSchema; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMResults () -@property (nonatomic, readonly, getter=isAttached) BOOL attached; - -+ (instancetype)emptyDetachedResults; -- (RLMResults *)snapshot; - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMScheduler.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMScheduler.h deleted file mode 100644 index 3c1b9874b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMScheduler.h +++ /dev/null @@ -1,63 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#ifdef __cplusplus -#include -namespace realm::util { -class Scheduler; -} -#endif - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -// A serial work queue of some sort which represents a thread-confinement context -// of some sort which blocks can be invoked inside. Realms are confined to a -// scheduler, which can be a thread (actually a run loop), a dispatch queue, or -// an actor. The scheduler ensures that the Realm is only used on one thread at -// a time, and allows us to dispatch work to the thread where we can access the -// Realm safely. -RLM_SWIFT_SENDABLE // is immutable -@interface RLMScheduler : NSObject -+ (RLMScheduler *)mainRunLoop __attribute__((objc_direct)); -+ (RLMScheduler *)currentRunLoop __attribute__((objc_direct)); -// A scheduler for the given queue if it's non-nil, and currentRunLoop otherwise -+ (RLMScheduler *)dispatchQueue:(nullable dispatch_queue_t)queue; -+ (RLMScheduler *)actor:(id)actor invoke:(void (^)(dispatch_block_t))invoke - verify:(void (^)(void))verify; - -// Invoke the block on this scheduler. Currently not actually implement for run -// loop schedulers. -- (void)invoke:(dispatch_block_t)block; - -// Cache key for this scheduler suitable for use with NSMapTable. Only valid -// when called from the current scheduler. -- (void *)cacheKey; - -- (nullable id)actor; - -#ifdef __cplusplus -// The object store Scheduler corresponding to this scheduler -- (std::shared_ptr)osScheduler; -#endif -@end - -FOUNDATION_EXTERN void RLMSetMainActor(id actor); - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMSchema_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMSchema_Private.h deleted file mode 100644 index f4f63c9f8..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMSchema_Private.h +++ /dev/null @@ -1,58 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@class RLMRealm; - -// -// RLMSchema private interface -// -@interface RLMSchema () - -/** - Returns an `RLMSchema` containing only the given `RLMObject` subclasses. - - @param classes The classes to be included in the schema. - - @return An `RLMSchema` containing only the given classes. - */ -+ (instancetype)schemaWithObjectClasses:(NSArray *)classes; - -@property (nonatomic, readwrite, copy) NSArray *objectSchema; - -// schema based on runtime objects -+ (instancetype)sharedSchema; - -// schema based upon all currently registered object classes -+ (instancetype)partialSharedSchema; - -// private schema based upon all currently registered object classes. -// includes classes that are excluded from the default schema. -+ (instancetype)partialPrivateSharedSchema; - -// class for string -+ (nullable Class)classForString:(NSString *)className; - -+ (nullable RLMObjectSchema *)sharedSchemaForClass:(Class)cls; - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMSet_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMSet_Private.h deleted file mode 100644 index 1053e0a0f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMSet_Private.h +++ /dev/null @@ -1,43 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -@class RLMObjectBase, RLMProperty; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMSet () -- (instancetype)initWithObjectClassName:(NSString *)objectClassName; -- (instancetype)initWithObjectType:(RLMPropertyType)type optional:(BOOL)optional; -- (NSString *)descriptionWithMaxDepth:(NSUInteger)depth; -- (void)setParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -// YES if the property is declared with old property syntax. -@property (nonatomic, readonly) BOOL isLegacyProperty; -// The name of the property which this collection represents -@property (nonatomic, readonly) NSString *propertyKey; -@end - -void RLMSetValidateMatchingObjectType(RLMSet *set, id value); - -@interface RLMManagedSet : RLMSet -- (instancetype)initWithParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMSwiftCollectionBase.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMSwiftCollectionBase.h deleted file mode 100644 index a4f864282..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMSwiftCollectionBase.h +++ /dev/null @@ -1,46 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectBase, RLMResults, RLMProperty, RLMLinkingObjects; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMSwiftCollectionBase : NSProxy -@property (nonatomic, strong) id _rlmCollection; - -- (instancetype)init; -+ (Class)_backingCollectionType; -- (instancetype)initWithCollection:(id)collection; - -- (nullable id)valueForKey:(NSString *)key; -- (nullable id)valueForKeyPath:(NSString *)keyPath; -- (BOOL)isEqual:(nullable id)object; -@end - -@interface RLMLinkingObjectsHandle : NSObject -- (instancetype)initWithObject:(RLMObjectBase *)object property:(RLMProperty *)property; -- (instancetype)initWithLinkingObjects:(RLMResults *)linkingObjects; - -@property (nonatomic, readonly) RLMLinkingObjects *results; -@property (nonatomic, readonly) NSString *_propertyKey; -@property (nonatomic, readonly) BOOL _isLegacyProperty; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMSwiftSupport.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMSwiftSupport.h deleted file mode 100644 index 530f0edbf..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMSwiftSupport.h +++ /dev/null @@ -1,30 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMSwiftSupport : NSObject - -+ (BOOL)isSwiftClassName:(NSString *)className; -+ (NSString *)demangleClassName:(NSString *)className; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMSwiftValueStorage.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMSwiftValueStorage.h deleted file mode 100644 index ef3efc610..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMSwiftValueStorage.h +++ /dev/null @@ -1,53 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectBase, RLMProperty; - -/// This class implements the backing storage for `RealmProperty<>` and `RealmOptional<>`. -/// This class should not be subclassed or used directly. -@interface RLMSwiftValueStorage : NSProxy -- (instancetype)init; -@end -/// Retrieves the value that is stored, or nil if it is empty. -FOUNDATION_EXTERN id _Nullable RLMGetSwiftValueStorage(RLMSwiftValueStorage *); -/// Sets a value on the property this instance represents for an object. -FOUNDATION_EXTERN void RLMSetSwiftValueStorage(RLMSwiftValueStorage *, id _Nullable); - -/// Initialises managed accessors on an instance of `RLMSwiftValueStorage` -/// @param parent The enclosing parent object. -/// @param prop The property which this class represents. -FOUNDATION_EXTERN void RLMInitializeManagedSwiftValueStorage(RLMSwiftValueStorage *, - RLMObjectBase *parent, - RLMProperty *prop); - -/// Initialises unmanaged accessors on an instance of `RLMSwiftValueStorage` -/// @param parent The enclosing parent object. -/// @param prop The property which this class represents. -FOUNDATION_EXTERN void RLMInitializeUnmanagedSwiftValueStorage(RLMSwiftValueStorage *, - RLMObjectBase *parent, - RLMProperty *prop); - -/// Gets the property name for the RealmProperty instance. This is required for tracing the key path on -/// objects that use the legacy property declaration syntax. -FOUNDATION_EXTERN NSString *RLMSwiftValueStorageGetPropertyName(RLMSwiftValueStorage *); - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMSyncConfiguration_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMSyncConfiguration_Private.h deleted file mode 100644 index 62d0e1f1f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMSyncConfiguration_Private.h +++ /dev/null @@ -1,47 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -typedef RLM_CLOSED_ENUM(NSUInteger, RLMSyncStopPolicy) { - RLMSyncStopPolicyImmediately, - RLMSyncStopPolicyLiveIndefinitely, - RLMSyncStopPolicyAfterChangesUploaded, -}; - - -@class RLMSchema; - -@interface RLMSyncConfiguration () - -// Flexible sync -- (instancetype)initWithUser:(RLMUser *)user; -// Partition-based sync -- (instancetype)initWithUser:(RLMUser *)user - partitionValue:(nullable id)partitionValue; - -// Internal-only APIs -@property (nonatomic, readwrite) RLMSyncStopPolicy stopPolicy; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMSyncSubscription_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMSyncSubscription_Private.h deleted file mode 100644 index dc438a20e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMSyncSubscription_Private.h +++ /dev/null @@ -1,70 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -#pragma mark - Subscription - -@interface RLMSyncSubscription () - -@property (nonatomic, readonly) RLMObjectId *identifier; - -@property (nonatomic, readonly) NSString *queryString; - -@property (nonatomic, readonly) NSString *objectClassName; - -@end - -#pragma mark - SubscriptionSet - -@interface RLMSyncSubscriptionEnumerator : NSObject - -@property (nonatomic, readonly) RLMSyncSubscriptionSet *subscriptionSet; - -- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state - count:(NSUInteger)len; - -- (instancetype)initWithSubscriptionSet:(RLMSyncSubscriptionSet *)subscriptionSet; - -@end - -@interface RLMSyncSubscriptionSet () - -@property (readonly) uint64_t version; - -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - subscriptionName:(nullable NSString *)name - predicate:(NSPredicate *)predicate - updateExisting:(BOOL)updateExisting; - -- (void)waitForSynchronizationOnQueue:(nullable dispatch_queue_t)queue - completionBlock:(void(^)(NSError *))completionBlock; - -- (RLMSyncSubscriptionEnumerator *)fastEnumerator; - -NSUInteger RLMFastEnumerate(NSFastEnumerationState *state, - NSUInteger len, - RLMSyncSubscriptionSet *collection); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMUser_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMUser_Private.h deleted file mode 100644 index f62c9a940..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/PrivateHeaders/RLMUser_Private.h +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// Observer block for user notifications. -typedef void(^RLMUserNotificationBlock)(RLMUser *); - -/// Token that identifies an observer. Unsubscribes when deconstructed to -/// avoid dangling observers, therefore this must be retained to hold -/// onto a subscription. -@interface RLMUserSubscriptionToken : NSObject -- (void)unsubscribe; -@end - -@interface RLMUser () -/// Subscribe to notifications for this RLMUser. -- (RLMUserSubscriptionToken *)subscribe:(RLMUserNotificationBlock)block; - -- (void)logOut; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Realm b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Realm deleted file mode 100755 index 49fb4952a..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_arm64_32_armv7k/Realm.framework/Realm and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/CHANGELOG.md b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/CHANGELOG.md deleted file mode 100644 index 00cc01244..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/CHANGELOG.md +++ /dev/null @@ -1,9539 +0,0 @@ -10.42.3 Release notes (2023-09-18) -============================================================= - -### Enhancements - -* Update packaging for the Xcode 15.0 release. Carthage release and obj-c - binaries are now built with Xcode 15. - -### Fixed - -* The prebuilt Realm.xcframework for SPM was packaged incorrectly and did not - work ([#8361](https://github.com/realm/realm-swift/issues/8361), since v10.42.1). - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 15.0.0. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15.0.0. - -10.42.2 Release notes (2023-09-13) -============================================================= - -### Enhancements - -* Add support for logging messages sent by the server. - ([Core #6476](https://github.com/realm/realm-core/pull/6476)) -* Unknown protocol errors received from the baas server will no longer cause - the application to crash if a valid error action is also received. Unknown - error actions will be treated as an ApplicationBug error action and will - cause sync to fail with an error via the sync error handler. - ([Core #6885](https://github.com/realm/realm-core/pull/6885)) -* Some sync error messages now contain more information about what went wrong. - -### Fixed - -* The `MultipleSyncAgents` exception from opening a synchronized Realm in - multiple processes at once no longer leaves the sync client in an invalid - state. ([Core #6868](https://github.com/realm/realm-core/pull/6868), since v10.36.0) -* Testing the size of a collection of links against zero would sometimes fail - (sometimes = "difficult to explain"). In particular: - ([Core #6850](https://github.com/realm/realm-core/issues/6850), since v10.41.0) -* When async writes triggered a file compaction some internal state could be - corrupted, leading to later crashes in the slab allocator. This typically - resulted in the "ref + size <= next->first" assertion failure, but other - failures were possible. Many issues reported; see [Core #6340](https://github.com/realm/realm-core/issues/6340). - (since 10.35.0) -* `Realm.Configuration.maximumNumberOfActiveVersions` now handles intermediate - versions which have been cleaned up correctly and checks the number of live - versions rather than the number of versions between the oldest live version - and current version (since 10.35.0). -* If the client disconnected between uploading a change to flexible sync - subscriptions and receiving the new object data from the server resulting - from that subscription change, the next connection to the server would - sometimes result in a client reset - ([Core #6966](https://github.com/realm/realm-core/issues/6966), since v10.21.1). - -### Deprecations - -* `RLMApp` has `localAppName` and `localAppVersion` fields which never ended up - being used for anything and are now deprecated. -* `RLMSyncAuthError` has not been used since v10.0.0 and is now deprecated. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 7. - -### Internal - -* Upgraded realm-core from 13.17.1 to 13.20.1 - -10.42.1 Release notes (2023-08-28) -============================================================= - -### Fixed - -* The names of the prebuilt zips for SPM have changed to avoid having Carthage - download them instead of the intended Carthage zip - ([#8326](https://github.com/realm/realm-swift/issues/8326), since v10.42.0). -* The prebuild Realm.xcframework for SwiftPM now has all platforms other than - visionOS built with Xcode 14 to comply with app store rules - ([#8339](https://github.com/realm/realm-swift/issues/8339), since 10.42.0). -* Fix visionOS compilation with Xcode beta 7. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 7. - -10.42.0 Release notes (2023-07-30) -============================================================= - -### Enhancements - -* Add support for building for visionOS and add Xcode 15 binaries to the - release package. visionOS currently requires installing Realm via either - Swift Package Manager or by using a XCFramework as CocoaPods and Carthage do - not yet support it. -* Zips compatible with SPM's `.binaryTarget()` are now published as part of the - releases on Github. -* Prebuilt XCFrameworks are now built with LTO enabled. This has insignificant - performance benefits, but cuts the size of the library by ~15%. - -### Fixed - -* Fix nested properties observation on a `Projections` not notifying when there is a property change. - ([#8276](https://github.com/realm/realm-swift/issues/8276), since v10.34.0). -* Fix undefined symbol error for `UIKit` when linking Realm to a framework using SPM. - ([#8308](https://github.com/realm/realm-swift/issues/8308), since v10.41.0) -* If the app crashed at exactly the wrong time while opening a freshly - compacted Realm the file could be left in an invalid state - ([Core #6807](https://github.com/realm/realm-core/pull/6807), since v10.33.0). -* Sync progress for DOWNLOAD messages was sometimes stored incorrectly, - resulting in an extra round trip to the server. - ([Core #6827](https://github.com/realm/realm-core/issues/6827), since v10.31.0) - -### Breaking Changes - -* Legacy non-xcframework Carthage installations are no longer supported. Please - ensure you are using `--use-xcframeworks` if installing via Carthage. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 5. - -### Internal - -* Upgraded realm-core from 13.17.0 to 13.17.1 -* Release packages were being uploaded to several static.realm.io URLs which - are no longer linked to anywhere. These are no longer being updated, and - release packages are now only being uploaded to Github. - -10.41.1 Release notes (2023-07-17) -============================================================= - -### Enhancements - -* Filesystem errors now include more information in the error message. -* Sync connection and session reconnect timing/backoff logic has been reworked - and unified into a single implementation. Previously some categories of errors - would cause an hour-long wait before attempting to reconnect, while others - would use an exponential backoff strategy. All errors now result in the sync - client waiting for 1 second before retrying, doubling the wait after each - subsequent failure up to a maximum of five minutes. If the cause of the error - changes, the backoff will be reset. If the sync client voluntarily disconnects, - no backoff will be used. ([Core #6526]((https://github.com/realm/realm-core/pull/6526))) - -### Fixed - -* Removed warnings for deprecated APIs internal use. - ([#8251](https://github.com/realm/realm-swift/issues/8251), since v10.39.0) -* Fix an error during async open and client reset if properties have been added - to the schema. This fix also applies to partition-based to flexible sync - migration if async open is used. ([Core #6707](https://github.com/realm/realm-core/issues/6707), since v10.28.2) - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 4. - -### Internal - -* Upgraded realm-core from 13.15.1 to 13.17.0 -* The location where prebuilt core binaries are published has changed slightly. - If you are using `REALM_BASE_URL` to mirror the binaries, you may need to - adjust your mirroring logic. - -10.41.0 Release notes (2023-06-26) -============================================================= - -### Enhancements - -* Add support for multiplexing sync connections. When enabled (the default), a single - connection is used per sync user rather than one per synchronized Realm. This - reduces resource consumption when multiple Realms are opened and will - typically improve performance ([PR #8282](https://github.com/realm/realm-swift/pull/8282)). -* Sync timeout options can now be set on `RLMAppConfiguration` along with the - other app-wide configuration settings ([PR #8282](https://github.com/realm/realm-swift/pull/8282)). - -### Fixed - -* Import as `RLMRealm_Private.h` as a module would cause issues when using Realm as a subdependency. - ([#8164](https://github.com/realm/realm-swift/issues/8164), since 10.37.0) -* Disable setting a custom logger by default on the sync client when the sync manager is created. - This was overriding the default logger set using `RLMLogger.defaultLogger`. (since v10.39.0). - -### Breaking Changes - -* The `RLMSyncTimeouts.appConfiguration` property has been removed. This was an - unimplemented read-only property which did not make any sense on the - containing type ([PR #8282](https://github.com/realm/realm-swift/pull/8282)). - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 2. - -### Internal - -* Upgraded realm-core from 13.15.0 to 13.15.1 - -10.40.2 Release notes (2023-06-09) -============================================================= - -### Enhancements - -* `Actor.preconditionIsolated()` is now used for runtime actor checking when - available (i.e. building with Xcode 15 and running on iOS 17) rather than the - less reliable workaround. - -### Fixed - -* If downloading the fresh Realm file failed during a client reset on a - flexible sync Realm, the sync client would crash the next time the Realm was - opened. ([Core #6494](https://github.com/realm/realm-core/issues/6494), since v10.28.2) -* If the order of properties in the local class definitions did not match the - order in the server-side schema, the before-reset Realm argument passed to a - client reset handler would have an invalid schema and likely crash if any - data was read from it. ([Core #6693](https://github.com/realm/realm-core/issues/6693), since v10.40.0) - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 1. - -### Internal - -* Upgraded realm-core from 13.13.0 to 13.15.0. -* The prebuilt library used for CocoaPods installations is now built with Xcode - 14. This should not have any observable effects other than the download being - much smaller due to no longer including bitcode. - -10.40.1 Release notes (2023-06-06) -============================================================= - -### Enhancements - -* Fix compilation with Xcode 15. Note that iOS 12 is the minimum supported - deployment target when using Xcode 15. -* Switch to building the Carthage release with Xcode 14.3.1. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 1. - -### Internal - -* Overhauled SDK metrics collection to better drive future development efforts. - -10.40.0 Release notes (2023-05-26) -============================================================= - -Drop support for Xcode 13 and add Xcode 14.3.1. Xcode 14.1 is now the minimum -supported version. - -### Enhancements - -* Adjust the error message for private `Object` subclasses and subclasses - nested inside other types to explain how to make them work rather than state - that it's impossible. ([#5662](https://github.com/realm/realm-cocoa/issues/5662)). -* Improve performance of SectionedResults. With a single section it is now ~10% - faster, and the runtime of sectioning no longer scales significantly with - section count, giving >100% speedups when there are large numbers of sections - ([Core #6606](https://github.com/realm/realm-core/pull/6606)). -* Very slightly improve performance of runtime thread checking on the main - thread. ([Core #6606](https://github.com/realm/realm-core/pull/6606)) - -### Fixed - -* Allow support for implicit boolean queries on Swift's Type Safe Queries API - ([#8212](https://github.com/realm/realm-swift/issues/8212)). -* Fixed a fatal error (reported to the sync error handler) during client reset - or automatic partition-based to flexible sync migration if the reset has been - triggered during an async open and the schema being applied has added new - classes. Due to this bug automatic flexibly sync migration has been disabled - for older releases and this is now the minimum version required. - ([#6601](https://github.com/realm/realm-core/issues/6601), since automatic - client resets were introduced in v10.25.0) -* Dictionaries sometimes failed to map unresolved links to nil. If the target - of a link in a dictionary was deleted by another sync client, reading that - field from the dictionary would sometimes give an invalid object rather than - nil. In addition, queries on dictionaries would sometimes have incorrect - results. ([Core #6644](https://github.com/realm/realm-core/pull/6644), since v10.8.0) -* Older versions of Realm would sometimes fail to properly mark objects as - being the target of an incoming link from another object. When this happened, - deleting the target object would hit an assertion failure due to the - inconsistent state. We now reconstruct a valid state rather than crashing. - ([Core #6585](https://github.com/realm/realm-core/issues/6585), since v5.0.0) -* Fix several UBSan failures which did not appear to result in functional bugs - ([Core #6649](https://github.com/realm/realm-core/pull/6649)). -* Using both synchronous and asynchronous transactions on the same thread or - scheduler could hit the assertion failure "!realm.is_in_transaction()" if one - of the callbacks for an asynchronous transaction happened to be scheduled - during a synchronous transaction - ([Core #6659](https://github.com/realm/realm-core/issues/6659), since v10.26.0) -* The stored deployment location for Apps was not being updated correctly after - receiving a redirect response from the server, resulting in every connection - attempting to connect to the old URL and getting redirected rather than only - the first connection after the deployment location changed. - ([Core #6630](https://github.com/realm/realm-core/issues/6630), since v10.38.2) - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-14.3.1. - -### Internal - -* Upgraded realm-core from 13.10.1 to 13.13.0. - -10.39.1 Release notes (2023-05-05) -============================================================= - -### Enhancements - -* New notifiers can now be registered in write transactions until changes have - actually been made in the write transaction. This makes it so that new - notifications can be registered inside change notifications triggered by - beginning a write transaction (unless a previous callback performed writes). - ([#4818](https://github.com/realm/realm-swift/issues/4818)). -* Reduce the memory footprint of an automatic (discard or recover) client reset - when there are large incoming changes from the server. - ([Core #6567](https://github.com/realm/realm-core/issues/6567)). - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from 13.10.0 to 13.10.1. - -10.39.0 Release notes (2023-05-03) -============================================================= - -### Enhancements - -* Add support for actor-isolated Realms, opened with `try await Realm(actor: actor)`. - - Rather than being confined to the current thread or a dispatch queue, - actor-isolated Realms are isolated to an actor. This means that they can be - used from any thread as long as it's within a function isolated to that - actor, and they remain valid over suspension points where a task may hop - between threads. Actor-isolated Realms can be used with either global or - local actors: - - ```swift - @MainActor function mainThreadFunction() async throws { - // These are identical: the async init continues to produce a - // MainActor-confined Realm if no actor is supplied - let realm1 = try await Realm() - let realm2 = try await Realm(MainActor.shared) - } - - // A simple example of a custom global actor - @globalActor actor BackgroundActor: GlobalActor { - static var shared = BackgroundActor() - } - - @BackgroundActor backgroundThreadFunction() async throws { - // Explicitly specifying the actor is required for everything but MainActor - let realm = try await Realm(actor: BackgroundActor.shared) - try await realm.write { - _ = realm.create(MyObject.self) - } - // Thread-confined Realms would sometimes throw an exception here, as we - // may end up on a different thread after an `await` - print("\(realm.objects(MyObject.self).count)") - } - - actor MyActor { - // An implicitly-unwrapped optional is used here to let us pass `self` to - // `Realm(actor:)` within `init` - var realm: Realm! - init() async throws { - realm = try await Realm(actor: self) - } - - var count: Int { - realm.objects(MyObject.self).count - } - - func create() async throws { - try await realm.asyncWrite { - realm.create(MyObject.self) - } - } - } - - // This function isn't isolated to the actor, so each operation has to be async - func createObjects() async throws { - let actor = try await MyActor() - for _ in 0..<5 { - await actor.create() - } - print("\(await actor.count)") - } - - // In an isolated function, an actor-isolated Realm can be used synchronously - func createObjects(in actor: isolated MyActor) async throws { - await actor.realm.write { - actor.realm.create(MyObject.self) - } - print("\(actor.realm.objects(MyObject.self).count)") - } - ``` - - Actor-isolated Realms come with a more convenient syntax for asynchronous - writes. `try await realm.write { ... }` will suspend the current task, - acquire the write lock without blocking the current thread, and then invoke - the block. The actual data is then written to disk on a background thread, - and the task is resumed once that completes. As this does not block the - calling thread while waiting to write and does not perform i/o on the calling - thread, this will often be safe to use from `@MainActor` functions without - blocking the UI. Sufficiently large writes may still benefit from being done - on a background thread. - - Asynchronous writes are only supported for actor-isolated Realms or in - `@MainActor` functions. - - Actor-isolated Realms require Swift 5.8 (Xcode 14.3). Enabling both strict - concurrency checking (`SWIFT_STRICT_CONCURRENCY=complete` in Xcode) and - runtime actor data race detection (`OTHER_SWIFT_FLAGS=-Xfrontend - -enable-actor-data-race-checks`) is strongly recommended when using - actor-isolated Realms. -* Add support for automatic partition-based to flexible sync migration. - Connecting to a server-side app configured to use flexible sync with a - client-side partition-based sync configuration is now supported, and will - automatically create the appropriate flexible sync subscriptions to subscribe - to the requested partition. This allows changing the configuration on the - server from partition-based to flexible without breaking existing clients. - ([Core #6554](https://github.com/realm/realm-core/issues/6554)) -* Now you can use an array `[["_id": 1], ["breed": 0]]` as sorting option for a - MongoCollection. This new API fixes the issue where the resulting documents - when using more than one sort parameter were not consistent between calls. - ([#7188](https://github.com/realm/realm-swift/issues/7188), since v10.0.0). -* Add support for adding a user created default logger, which allows implementing your own logging logic - and the log threshold level. - You can define your own logger creating an instance of `Logger` and define the log function which will be - invoked whenever there is a log message. - - ```swift - let logger = Logger(level: .all) { level, message in - print("Realm Log - \(level): \(message)") - } - ``` - - Set this custom logger as Realm default logger using `Logger.shared`. - ```swift - Logger.shared = logger - ``` -* It is now possible to change the default log threshold level at any point of the application's lifetime. - ```swift - Logger.shared.logLevel = .debug - ``` - This will override the log level set anytime before by a user created logger. -* We have set `.info` as the default log threshold level for Realm. You will now see some - log message in your console. To disable use `Logger.shared.level = .off`. - -### Fixed - -* Several schema initialization functions had incorrect `@MainActor` - annotations, resulting in runtime warnings if the first time a Realm was - opened was on a background thread - ([#8222](https://github.com/realm/realm-swift/issues/8222), since v10.34.0). - -### Deprecations - -* `App.SyncManager.logLevel` and `App.SyncManager.logFunction` are deprecated in favour of - setting a default logger. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from v13.9.4 to v13.10.0. - -10.38.3 Release notes (2023-04-28) -============================================================= - -### Enhancements - -* Improve performance of cancelling a write transactions after making changes. - If no KVO observers are used this is now constant time rather than taking - time proportional to the number of changes to be rolled back. Cancelling a - write transaction with KVO observers is 10-20% faster. ([Core PR #6513](https://github.com/realm/realm-core/pull/6513)). - -### Fixed - -* Performing a large number of queries without ever performing a write resulted - in steadily increasing memory usage, some of which was never fully freed due - to an unbounded cache ([#7978](https://github.com/realm/realm-swift/issues/7978), since v10.27.0). - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from 13.9.3 to 13.9.4 - -10.38.2 Release notes (2023-04-25) -============================================================= - -### Enhancements - -* Improve performance of equality queries on a non-indexed AnyRealmValue - property by about 30%. ([Core #6506](https://github.com/realm/realm-core/issues/6506)) - -### Fixed - -* SSL handshake errors were treated as fatal errors rather than errors which - should be retried. ([Core #6434](https://github.com/realm/realm-core/issues/6434), since v10.35.0) - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from 13.9.0 to 13.9.3. - -10.38.1 Release notes (2023-04-25) -============================================================= - -### Fixed - -* The error handler set on EventsConfiguration was not actually used (since v10.26.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -10.38.0 Release notes (2023-03-31) -============================================================= - -Switch to building the Carthage release with Xcode 14.3. - -### Enhancements - -* Add Xcode 14.3 binaries to the release package. Note that CocoaPods 1.12.0 - does not support Xcode 14.3. -* Add support for sharing encrypted Realms between multiple processes. - ([Core #1845](https://github.com/realm/realm-core/issues/1845)) - -### Fixed - -* Fix a memory leak reported by Instruments on `URL.path` in - `Realm.Configuration.fileURL` when using a string partition key in Partition - Based Sync ([#8195](https://github.com/realm/realm-swift/pull/8195)), since v10.0.0). -* Fix a data race in version management. If one thread committed a write - transaction which increased the number of live versions above the previous - highest seen during the current session at the same time as another thread - began a read, the reading thread could read from a no-longer-valid memory - mapping. This could potentially result in strange crashes when opening, - refreshing, freezing or thawing a Realm - ([Core #6411](https://github.com/realm/realm-core/pull/6411), since v10.35.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from 13.8.0 to 13.9.0. - -10.37.2 Release notes (2023-03-29) -============================================================= - -### Fixed - -* Copying a `RLMRealmConfiguration` failed to copy several fields. This - resulted in migrations being passed the incorrect object type in Swift when - using the default configuration (since v10.34.0) or async open (since - v10.37.0). This also broke using the Events API in those two scenarios (since - v10.26.0 for default configuration and v10.37.0 for async open). ([#8190](https://github.com/realm/realm-swift/issues/8190)) - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -10.37.1 Release notes (2023-03-27) -============================================================= - -### Enhancements - -* Performance improvement for the following queries ([Core #6376](https://github.com/realm/realm-core/issues/6376)): - * Significant (~75%) improvement when counting (`Results.count`) the number - of exact matches (with no other query conditions) on a - string/int/UUID/ObjectID property that has an index. This improvement - will be especially noticiable if there are a large number of results - returned (duplicate values). - * Significant (~99%) improvement when querying for an exact match on a Date - property that has an index. - * Significant (~99%) improvement when querying for a case insensitive match - on an AnyRealmValue property that has an index. - * Moderate (~25%) improvement when querying for an exact match on a Bool - property that has an index. - * Small (~5%) improvement when querying for a case insensitive match on an - AnyRealmValue property that does not have an index. - -### Fixed - -* Add missing `@Sendable` annotations to several sync and app services related - callbacks ([PR #8169](https://github.com/realm/realm-swift/pull/8169), since v10.34.0). -* Fix some bugs in handling task cancellation for async Realm init. Some very - specific timing windows could cause crashes, and the download would not be - cancelled if the Realm was already open ([PR #8178](https://github.com/realm/realm-swift/pull/8178), since v10.37.0). -* Fix a crash when querying an AnyRealmValue property with a string operator - (contains/like/beginswith/endswith) or with case insensitivity. - ([Core #6376](https://github.com/realm/realm-core/issues/6376), since v10.8.0) -* Querying for case-sensitive equality of a string on an indexed AnyRealmValue - property was returning case insensitive matches. For example querying for - `myIndexedAny == "Foo"` would incorrectly match on values of "foo" or "FOO" etc. - ([Core #6376](https://github.com/realm/realm-core/issues/6376), since v10.8.0) -* Adding an index to an AnyRealmValue property when objects of that type - already existed would crash with an assertion. - ([Core #6376](https://github.com/realm/realm-core/issues/6376), since v10.8.0). -* Fix a bug that may have resulted in arrays being in different orders on - different devices. Some cases of “Invalid prior_size” may be fixed too. - ([Core #6191](https://github.com/realm/realm-core/issues/6191), since v10.25.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -### Internal - -* Upgraded realm-core from 13.6.0 to 13.8.0 - -10.37.0 Release notes (2023-03-09) -============================================================= - -### Enhancements - -* `MongoCollection.watch().subscribe(on:)` now supports any swift Scheduler - rather than only dispatch queues ([PR #8131](https://github.com/realm/realm-swift/pull/8130)). -* Add an async sequence wrapper for `MongoCollection.watch()`, allowing you to - do `for try await change in collection.changeEvents { ... }` - ([PR #8131](https://github.com/realm/realm-swift/pull/8130)). -* The internals of error handling and reporting have been significantly - reworked. The visible effects of this are that some errors which previously - had unhelpful error messages now include more detail about what went wrong, - and App errors now expose a much more complete set of error codes - ([PR #8002](https://github.com/realm/realm-swift/pull/8002)). -* Expose compensating write error information. When the server rejects a - modification made by the client (such as if the user does not have the - required permissions), a `SyncError` is delivered to the sync error handler - with the code `.writeRejected` and a non-nil `compensatingWriteInfo` field - which contains information about what was rejected and why. This information - is intended primarily for debugging and logging purposes and may not have a - stable format. ([PR #8002](https://github.com/realm/realm-swift/pull/8002)) -* Async `Realm.init()` now handles Task cancellation and will cancel the async - open if the Task is cancelled ([PR #8148](https://github.com/realm/realm-swift/pull/8148)). -* Cancelling async opens now has more consistent behavior. The previously - intended and documented behavior was that cancelling an async open would - result in the callback associated with the specific task that was cancelled - never being called, and all other pending callbacks would be invoked with an - ECANCELED error. This never actually worked correctly, and the callback which - was not supposed to be invoked at all sometimes would be. We now - unconditionally invoke all of the exactly once, passing ECANCELED to all of - them ([PR #8148](https://github.com/realm/realm-swift/pull/8148)). - -### Fixed - -* `UserPublisher` incorrectly bounced all notifications to the main thread instead - of setting up the Combine publisher to correctly receive on the main thread. - ([#8132](https://github.com/realm/realm-swift/issues/8132), since 10.21.0) -* Fix warnings when building with Xcode 14.3 beta 2. -* Errors in async open resulting from invalid queries in `initialSubscriptions` - would result in the callback being invoked with both a non-nil Realm and a - non-nil Error even though the Realm was in an invalid state. Now only the - error is passed to the callback ([PR #8148](https://github.com/realm/realm-swift/pull/8148), since v10.28.0). -* Converting a local realm to a synced realm would crash if an embedded object - was null ([Core #6294](https://github.com/realm/realm-core/issues/6294), since v10.22.0). -* Subqueries on indexed properties performed extremely poorly. ([Core #6327](https://github.com/realm/realm-core/issues/6327), since v5.0.0) -* Fix a crash when a SSL read successfully read a non-zero number of bytes and - also reported an error. ([Core #5435](https://github.com/realm/realm-core/issues/5435), since 10.0.0) -* The sync client could get stuck in an infinite loop if the server sent an - invalid changeset which caused a transform error. This now results in a - client reset instead. ([Core #6051](https://github.com/realm/realm-core/issues/6051), since v10.0.0) -* Strings in queries which contained any characters which required multiple - bytes when encoded as utf-8 were incorrectly encoded as binary data when - serializing the query to send it to the server for a flexible sync - subscription, resulting the server rejecting the query - ([Core #6350](https://github.com/realm/realm-core/issues/6350), since 10.22.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -### Internal - -* Upgraded realm-core from 13.4.1 to 13.6.0 - -10.36.0 Release notes (2023-02-15) -============================================================= - -### Enhancements - -* Add support for multiple overlapping or nested event scopes. - `Events.beginScope()` now returns a `Scope` object which is used to commit or - cancel that scope, and if more than one scope is active at a time events are - reported to all active scopes. - -### Fixed - -* Fix moving `List` items to a higher index in SwiftUI results in wrong destination index - ([#7956](https://github.com/realm/realm-swift/issues/7956), since v10.6.0). -* Using the `searchable` view modifier with `@ObservedResults` in iOS 16 would - cause the collection observation subscription to cancel. - ([#8096](https://github.com/realm/realm-swift/issues/8096), since 10.21.0) -* Client reset with recovery would sometimes crash if the recovery resurrected - a dangling link ([Core #6292](https://github.com/realm/realm-core/issues/6292), since v10.32.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -### Internal - -* Upgraded realm-core from 13.4.0 to 13.4.1 - -10.35.1 Release notes (2023-02-10) -============================================================= - -### Fixed - -* Client reset with recovery would crash if a client reset occurred the very - first time the Realm was opened with async open. The client reset callbacks - are now not called if the Realm had never been opened before - ([PR #8125](https://github.com/realm/realm-swift/pull/8125), since 10.32.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -10.35.0 Release notes (2023-02-07) -============================================================= - -This version bumps the Realm file format version to 23. Realm files written by -this version cannot be read by older versions of Realm. - -### Enhancements - -* The Realm file is now automatically shrunk if the file size is larger than - needed to store all of the data. ([Core PR #5755](https://github.com/realm/realm-core/pull/5755)) -* Pinning old versions (either with frozen Realms or with Realms on background - threads that simply don't get refreshed) now only prevents overwriting the - data needed by that version, rather than the data needed by that version and - all later versions. In addition, frozen Realms no longer pin the transaction - logs used to drive change notifications. This mostly eliminates the file size - growth caused by pinning versions. ([Core PR #5440](https://github.com/realm/realm-core/pull/5440)) -* Rework how Dictionaries/Maps are stored in the Realm file. The new design uses - less space and is typically significantly faster. This changes the iteration - order of Maps, so any code relying on that may be broken. We continue - to make no guarantees about iteration order on Maps ([Core #5764](https://github.com/realm/realm-core/issues/5764)). -* Improve performance of freezing Realms ([Core PR #6211](https://github.com/realm/realm-core/pull/6211)). - -### Fixed - -* Fix a crash when using client reset with recovery and flexible sync with a - single subscription ([Core #6070](https://github.com/realm/realm-core/issues/6070), since v10.28.2) -* Encrypted Realm files could not be opened on devices with a larger page size - than the one which originally wrote the file. - ([#8030](https://github.com/realm/realm-swift/issues/8030), since v10.32.1) -* Creating multiple flexible sync subscriptions at once could hit an assertion - failure if the server reported an error for any of them other than the last - one ([Core #6038](https://github.com/realm/realm-core/issues/6038), since v10.21.1). -* `Set` and `List` considered a string and binary - data containing that string encoded as UTF-8 to be equivalent. This could - result in a List entry not changing type on assignment and for the client be - inconsistent with the server if a string and some binary data with equivalent - content was inserted from Atlas. - ([Core #4860](https://github.com/realm/realm-core/issues/4860) and - [Core #6201](https://github.com/realm/realm-core/issues/6201), since v10.8.0) -* Querying for NaN on Decimal128 properties did not match any objects - ([Core #6182](https://github.com/realm/realm-core/issues/6182), since v10.8.0). -* When client reset with recovery is used and the recovery did not need to - make any changes to the local Realm, the sync client could incorrectly think - the recovery failed and report the error "A fatal error occured during client - reset: 'A previous 'Recovery' mode reset from did not succeed, - giving up on 'Recovery' mode to prevent a cycle'". - ([Core #6195](https://github.com/realm/realm-core/issues/6195), since v10.32.0) -* Fix a crash when using client reset with recovery and flexible sync with a - single subscription ([Core #6070](https://github.com/realm/realm-core/issues/6070), since v10.28.2) -* Writing to newly in-view objects while a flexible sync bootstrap was in - progress would not synchronize those changes to the server - ([Core #5804](https://github.com/realm/realm-core/issues/5804), since v10.21.1). -* If a client reset with recovery or discard local was interrupted while the - "fresh" realm was being downloaded, the sync client could crash with a - MultpleSyncAgents exception ([Core #6217](https://github.com/realm/realm-core/issues/6217), since v10.25.0). -* Sharing Realm files between a Catalyst app and Realm Studio did not properly - synchronize access to the Realm file ([Core #6258](https://github.com/realm/realm-core/pull/6258), since v10.0.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -### Internal - -* Upgraded realm-core from 12.13.0 to 13.4.0 - -10.34.1 Release notes (2023-01-20) -============================================================= - -### Fixed - -* Add some missing `@preconcurrency` annotations which lead to build failures - with Xcode 14.0 when importing via SPM or CocoaPods - ([#8104](https://github.com/realm/realm-swift/issues/8104), since v10.34.0). - -### Compatibility - -* Realm Studio: 11.0.0 - 12.0.0. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -10.34.0 Release notes (2023-01-13) -============================================================= - -Swift 5.5 is no longer supported. Swift 5.6 (Xcode 13.3) is now the minimum -supported version. - -The prebuilt binary for Carthage is now build with Xcode 14.2. - -### Enhancements - -* Improve performance of creating Projection objects and of change - notifications on projections ([PR #8050](https://github.com/realm/realm-swift/pull/8050)). -* Allow initialising any sync configuration with `cancelAsyncOpenOnNonFatalErrors`. -* Improve performance of Combine value publishers which do not use the - object/collection changesets a little. -* All public types have been audited for sendability and are now marked as - Sendable when applicable. A few types which were incidentally not thread-safe - but make sense to use from multiple threads are now thread-safe. -* Add support for building Realm with strict concurrency checking enabled. - -### Fixed - -* Fix bad memory access exception that can occur when watching change streams. - [PR #8039](https://github.com/realm/realm-swift/pull/8039). -* Object change notifications on projections only included the first projected - property for each source property ([PR #8050](https://github.com/realm/realm-swift/pull/8050), since v10.21.0). -* `@AutoOpen` failed to open flexible sync Realms while offline - ([#7986](https://github.com/realm/realm-swift/issues/7986), since v10.27.0). -* Fix "Publishing changes from within view updates is not allowed" warnings - when using `@ObservedResults` or `@ObservedSectionedResults` - ([#7908](https://github.com/realm/realm-swift/issues/7908)). -* Fix "Publishing changes from within view updates is not allowed" warnings - when using `@AutoOpen` or `@AsyncOpen`. - ([#7908](https://github.com/realm/realm-swift/issues/7908)). -* Defer `Realm.asyncOpen` execution on `@AsyncOpen` and `@AutoOpen` property - wrappers until all the environment values are set. This will guarantee the - configuration and partition value are set set before opening the realm. - ([#7931](https://github.com/realm/realm-swift/issues/7931), since v10.12.0). -* `@ObservedResults.remove()` could delete the wrong object if a write on a - background thread which changed the index of the object being removed - occurred at a very specific time (since v10.6.0). - -### Compatibility - -* Realm Studio: 11.0.0 - 12.0.0. 13.0.0 is currently incompatible. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -10.33.0 Release notes (2022-12-01) -============================================================= - -### Enhancements - -* Flexible sync subscription state will change to - `SyncSubscriptionState.pending` (`RLMSyncSubscriptionStatePending`) while - waiting for the server to have sent all pending history after a bootstrap and - before marking a subscription as Complete. - ([#5795](https://github.com/realm/realm-core/pull/5795)) -* Add custom column names API, which allows to set a different column name in the realm - from the one used in your object declaration. - ```swift - class Person: Object { - @Persisted var firstName: String - @Persisted var birthDate: Date - @Persisted var age: Int - - override class public func propertiesMapping() -> [String: String] { - ["firstName": "first_name", - "birthDate": "birth_date"] - } - } - ``` - This is very helpful in cases where you want to name a property differently - from your `Device Sync` JSON schema. - This API is only available for old and modern object declaration syntax on the - `RealmSwift` SDK. -* Flexible sync bootstraps now apply 1MB of changesets per write transaction - rather than applying all of them in a single write transaction. - ([Core PR #5999](https://github.com/realm/realm-core/pull/5999)). - -### Fixed - -* Fix a race condition which could result in "operation cancelled" errors being - delivered to async open callbacks rather than the actual sync error which - caused things to fail ([Core PR #5968](https://github.com/realm/realm-core/pull/5968), since the introduction of async open). -* Fix database corruption issues which could happen if an application was - terminated at a certain point in the process of comitting a write - transaciton. ([Core PR #5993](https://github.com/realm/realm-core/pull/5993), since v10.21.1) -* `@AsyncOpen` and `@AutoOpen` would begin and then cancel a second async open - operation ([PR #8038](https://github.com/realm/realm-swift/pull/8038), since v10.12.0). -* Changing the search text when using the searchable SwiftUI extension would - trigger multiple updates on the View for each change - ([PR #8038](https://github.com/realm/realm-swift/pull/8038), since v10.19.0). -* Changing the filter or search properties of an `@ObservedResults` or - `@ObservedSectionedResults` would trigger up to three updates on the View - ([PR #8038](https://github.com/realm/realm-swift/pull/8038), since v10.6.0). -* Fetching a user's profile while the user logs out would result in an - assertion failure. ([Core PR #6017](https://github.com/realm/realm-core/issues/5571), since v10.8.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -### Internal - -* Upgraded realm-core from 12.11.0 to 12.13.0 - -10.32.3 Release notes (2022-11-10) -============================================================= - -### Fixed - -* Fix name lookup errors when importing Realm Swift built in library evolution - mode (([#8014](https://github.com/realm/realm-swift/issues/8014)). -* The prebuilt watchOS library in the objective-c release package was missing - an arm64 slice. The Swift release package was uneffected - ([PR #8016](https://github.com/realm/realm-swift/pull/8016)). -* Fix issue where `RLMUserAPIKey.key`/`UserAPIKey.key` incorrectly returned the name of the API - key instead of the key itself. ([#8021](https://github.com/realm/realm-swift/issues/8021), since v10.0.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -10.32.2 Release notes (2022-11-01) -============================================================= - -Switch to building the Carthage release with Xcode 14.1. - -### Fixed - -* Fix linker errors when building a release build with Xcode 14.1 when - installing via SPM ([#7995](https://github.com/realm/realm-swift/issues/7995)). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -10.32.1 Release notes (2022-10-25) -============================================================= - -### Enhancements - -* Improve performance of client reset with automatic recovery and converting - top-level tables into embedded tables ([Core #5897](https://github.com/realm/realm-core/pull/5897)). -* `Realm.Error` is now a typealias for `RLMError` rather than a - manually-defined version of what the automatic bridging produces. This should - have no effect on existing working code, but the manual definition was - missing a few things supplied by the automatic bridging. -* Some sync errors sent by the server include a link to the server-side logs - associated with that error. This link is now exposed in the `serverLogURL` - property on `SyncError` (or `RLMServerLogURLKey` userInfo field when using NSError). - -### Fixed - -* Many sync and app errors were reported using undocumented internal error - codes and/or domains and could not be progammatically handled. Some notable - things which now have public error codes instead of unstable internal ones: - - `Realm.Error.subscriptionFailed`: The server rejected a flexible sync subscription. - - `AppError.invalidPassword`: A login attempt failed due to a bad password. - - `AppError.accountNameInUse`: A registration attempt failed due to the account name being in use. - - `AppError.httpRequestFailed`: A HTTP request to Atlas App Services - completed with an error HTTP code. The failing code is available in the - `httpStatusCode` property. - - Many other less common error codes have been added to `AppError`. - - All sync errors other than `SyncError.clientResetError` reported incorrect - error codes. - (since v10.0.0). -* `UserAPIKey.objectId` was incorrectly bridged to Swift as `RLMObjectId` to - `ObjectId`. This may produce warnings about an unneccesary cast if you were - previously casting it to the correct type (since v10.0.0). -* Fixed an assertion failure when observing change notifications on a sectioned - result, if the first modification was to a linked property that did not cause - the state of the sections to change. - ([Core #5912](https://github.com/realm/realm-core/issues/5912), - since the introduction of sectioned results in v10.29.0) -* Fix a use-after-free if the last external reference to an encrypted - synchronized Realm was closed between when a client reset error was received - and when the download of the new Realm began. - ([Core #5949](https://github.com/realm/realm-core/pull/5949), since 10.28.4). -* Fix an assertion failure during client reset with recovery when recovering - a list operation on an embedded object that has a link column in the path - prefix to the list from the top level object. - ([Core #5957](https://github.com/realm/realm-core/issues/5957), - since introduction of automatic recovery in v10.32.0). -* Creating a write transaction which is rejected by the server due to it - exceeding the maximum transaction size now results in a client reset error - instead of synchronization breaking and becoming stuck forever - ([Core #5209](https://github.com/realm/realm-core/issues/5209), since v10). -* Opening an unencrypted file with an encryption key would sometimes report a - misleading error message that indicated that the problem was something other - than a decryption failure ([Core #5915](https://github.com/realm/realm-core/pull/5915), since 0.89.0). -* Fix a rare deadlock which could occur when closing a synchronized Realm - immediately after committing a write transaction when the sync worker thread - has also just finished processing a changeset from the server - ([Core #5948](https://github.com/realm/realm-core/pull/5948)). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.0.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -### Internal - -* Upgraded realm-core from 12.9.0 to 12.11.0. - -10.32.0 Release notes (2022-10-10) -============================================================= - -### Enhancements - -* Add `.recoverUnsyncedChanges` (`RLMClientResetModeRecoverUnsyncedChanges`) and -`.recoverOrDiscardUnsyncedChanges` (`RLMClientResetModeRecoverOrDiscardUnsyncedChanges`) behaviors to `ClientResetMode` (`RLMClientResetMode`). - - The newly added recover modes function by downloading a realm which reflects the latest - state of the server after a client reset. A recovery process is run locally in an - attempt to integrate the server state with any local changes from before the - client reset occurred. - The changes are integrated with the following rules: - 1. Objects created locally that were not synced before client reset, will be integrated. - 2. If an object has been deleted on the server, but was modified on the client, the delete takes precedence and the update is discarded. - 3. If an object was deleted on the client, but not the server, then the client delete instruction is applied. - 4. In the case of conflicting updates to the same field, the client update is applied. - - The client reset process will fallback to `ClientResetMode.discardUnsyncedChanges` if the recovery process fails in `.recoverOrDiscardUnsyncedChanges`. - - The client reset process will fallback to `ClientResetMode.manual` if the recovery process fails in `.recoverUnsyncedChanges`. - - The two new swift recovery modes support client reset callbacks: `.recoverUnsyncedChanges(beforeReset: ((Realm) -> Void)? = nil, afterReset: ((Realm, Realm) -> Void)? = nil)`. - - The two new Obj-C recovery modes support client reset callbacks in `notifyBeforeReset` - and `notifyAfterReset`for both `[RLMUser configurationWithPartitionValue]` and `[RLMUser flexibleSyncConfigurationWithClientResetMode]` - For more detail on client reset callbacks, see `ClientResetMode`, `RLMClientResetBeforeBlock`, - `RLMClientResetAfterBlock`, and the 10.25.0 changelog entry. -* Add two new additional interfaces to define a manual client reset handler: - - Add a manual callback handler to `ClientResetMode.manual` -> `ClientResetMode.manual(ErrorReportingBlock? = nil)`. - - Add the `RLMSyncConfiguration.manualClientResetHandler` property (type `RLMSyncErrorReportingBlock`). - - These error reporting blocks are invoked in the event of a `RLMSyncErrorClientResetError`. - - See `ErrorReportingBlock` (`RLMSyncErrorReportingBlock`), and `ClientResetInfo` for more detail. - - Previously, manual client resets were handled only through the `SyncManager.ErrorHandler`. You have the - option, but not the requirement, to define manual reset handler in these interfaces. - Otherwise, the `SyncManager.ErrorHandler` is still invoked during the manual client reset process. - - These new interfaces are only invoked during a `RLMSyncErrorClientResetError`. All other sync errors - are still handled in the `SyncManager.ErrorHandler`. - - See 'Breaking Changes' for information how these interfaces interact with an already existing - `SyncManager.ErrorHandler`. - -### Breaking Changes - -* The default `clientResetMode` (`RLMClientResetMode`) is switched from `.manual` (`RLMClientResetModeManual`) - to `.recoverUnsyncedChanges` (`RLMClientResetModeRecoverUnsyncedChanges`). - - If you are currently using `.manual` and continue to do so, the only change - you must explicitly make is designating manual mode in - your `Realm.Configuration.SyncConfiguration`s, since they will now default to `.recoverUnsyncedChanges`. - - You may choose to define your manual client reset handler in the newly - introduced `manual(ErrorReportingBlock? = nil)` - or `RLMSyncConfiguration.manualClientResetHandler`, but this is not required. - The `SyncManager.errorHandler` will still be invoked during a client reset if - no callback is passed into these new interfaces. - -### Deprecations - -* `ClientResetMode.discardLocal` is deprecated in favor of `ClientResetMode.discardUnsyncedChanges`. - The reasoning is that the name better reflects the effect of this reset mode. There is no actual - difference in behavior. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.0.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -10.31.0 Release notes (2022-10-05) -============================================================= - -The prebuilt binary for Carthage is now build with Xcode 14.0.1. - -### Enhancements - -* Cut the runtime of aggregate operations on large dictionaries in half - ([Core #5864](https://github.com/realm/realm-core/pull/5864)). -* Improve performance of aggregate operations on collections of objects by 2x - to 10x ([Core #5864](https://github.com/realm/realm-core/pull/5864)). - Greatly improve the performance of sorting or distincting a Dictionary's keys - or values. The most expensive operation is now performed O(log N) rather than - O(N log N) times, and large Dictionaries can see upwards of 99% reduction in - time to sort. ([Core #5166](https://github.com/realm/realm-core/pulls/5166)) -* Add support for changing the deployment location for Atlas Apps. Previously - this was assumed to be immutable ([Core #5648](https://github.com/realm/realm-core/issues/5648)). -* The sync client will now yield the write lock to other threads which are - waiting to perform a write transaction even if it still has remaining work to - do, rather than always applying all changesets received from the server even - when other threads are trying to write. ([Core #5844](https://github.com/realm/realm-core/pull/5844)). -* The sync client no longer writes an unused temporary copy of the changesets - received from the server to the Realm file ([Core #5844](https://github.com/realm/realm-core/pull/5844)). - -### Fixed - -* Setting a `List` property with `Results` no longer throws an unrecognized - selector exception (since 10.8.0-beta.2) -* `RLMProgressNotificationToken` and `ProgressNotificationToken` now hold a - strong reference to the sync session, keeping it alive until the token is - deallocated or invalidated, as the other notification tokens do. - ([#7831](https://github.com/realm/realm-swift/issues/7831), since v2.3.0). -* Results permitted some nonsensical aggregate operations on column types which - do not make sense to aggregate, giving garbage results rather than reporting - an error ([Core #5876](https://github.com/realm/realm-core/pull/5876), since v5.0.0). -* Upserting a document in a Mongo collection would crash if the document's id - type was anything other than ObjectId (since v10.0.0). -* Fix a use-after-free when a sync session is closed and the app is destroyed - at the same time ([Core #5752](https://github.com/realm/realm-core/issues/5752), - since v10.19.0). - -### Deprecations - -* `RLMUpdateResult.objectId` has been deprecated in favor of - `RLMUpdateResult.documentId` to support reporting document ids which are not - object ids. -### Breaking Changes -* Private API `_realmColumnNames` has been renamed to a new public API - called `propertiesMapping()`. This change only affects the Swift API - and doesn't have any effects in the obj-c API. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.0.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -### Internal - -* Upgraded realm-core from 12.7.0 to 12.9.0 - -10.30.0 Release notes (2022-09-20) -============================================================= - -### Fixed - -* Incoming links from `RealmAny` properties were not handled correctly when - migrating an object type from top-level to embedded. `RealmAny` properties - currently cannot link to embedded objects. - ([Core #5796](https://github.com/realm/realm-core/pull/5796), since 10.8.0). -* `Realm.refresh()` sometimes did not actually advance to the latest version. - It attempted to be semi-non-blocking in a very confusing way which resulted - in it sometimes advancing to a newer version that is not the latest version, - and sometimes blocking until notifiers are ready so that it could advance to - the latest version. This behavior was undocumented and didn't work correctly, - so it now always blocks if needed to advance to the latest version. - ([#7625](https://github.com/realm/realm-swift/issues/7625), since v0.98.0). -* Fix the most common cause of thread priority inversions when performing - writes on the main thread. If beginning the write transaction has to wait for - the background notification calculations to complete, that wait is now done - in a QoS-aware way. ([#7902](https://github.com/realm/realm-swift/issues/7902)) -* Subscribing to link properties in a flexible sync Realm did not work due to a - mismatch between what the client sent and what the server needed. - ([Core #5409](https://github.com/realm/realm-core/issues/5409)) -* Attempting to use `AsymmetricObject` with partition-based sync now reports a - sensible error much earlier in the process. Asymmetric sync requires using - flexible sync. ([Core #5691](https://github.com/realm/realm-core/issues/5691), since 10.29.0). -* Case-insensitive but diacritic-sensitive queries would crash on 4-byte UTF-8 - characters ([Core #5825](https://github.com/realm/realm-core/issues/5825), since v2.2.0) -* Accented characters are now handled by case-insensitive but - diacritic-sensitive queries. ([Core #5825](https://github.com/realm/realm-core/issues/5825), since v2.2.0) - -### Breaking Changes - -* `-[RLMASLoginDelegate authenticationDidCompleteWithError:]` has been renamed - to `-[RLMASLoginDelegate authenticationDidFailWithError:]` to comply with new - app store requirements. This only effects the obj-c API. - ([#7945](https://github.com/realm/realm-swift/issues/7945)) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1 - 14. - -### Internal - -* Upgraded realm-core from 12.6.0 to 12.7.0 - -10.29.0 Release notes (2022-09-09) -============================================================= - -### Enhancements - -* Add support for asymmetric sync. When a class inherits from - `AsymmetricObject`, objects created are synced unidirectionally to the server - and cannot be queried or read locally. - -```swift - class PersonObject: AsymmetricObject { - @Persisted(primaryKey: true) var _id: ObjectId - @Persisted var name: String - @Persisted var age: Int - } - - try realm.write { - // This will create the object on the server but not locally. - realm.create(PersonObject.self, value: ["_id": ObjectId.generate(), - "name": "Dylan", - "age": 20]) - } -``` -* Add ability to section a collection which conforms to `RealmCollection`, `RLMCollection`. - Collections can be sectioned by a unique key retrieved from a keyPath or a callback and will return an instance of `SectionedResults`/`RLMSectionedResults`. - Each section in the collection will be an instance of `ResultsSection`/`RLMSection` which gives access to the elements corresponding to the section key. - `SectionedResults`/`RLMSectionedResults` and `ResultsSection`/`RLMSection` have the ability to be observed. - ```swift - class DemoObject: Object { - @Persisted var title: String - @Persisted var date: Date - var firstLetter: String { - return title.first.map(String.init(_:)) ?? "" - } - } - var sectionedResults: SectionedResults - // ... - sectionedResults = realm.objects(DemoObject.self) - .sectioned(by: \.firstLetter, ascending: true) - ``` -* Add `@ObservedSectionedResults` for SwiftUI support. This property wrapper type retrieves sectioned results - from a Realm using a keyPath or callback to determine the section key. - ```swift - struct DemoView: View { - @ObservedSectionedResults(DemoObject.self, - sectionKeyPath: \.firstLetter) var demoObjects - - var body: some View { - VStack { - List { - ForEach(demoObjects) { section in - Section(header: Text(section.key)) { - ForEach(section) { object in - MyRowView(object: object) - } - } - } - } - } - } - } - ``` -* Add automatic handing for changing top-level objects to embedded objects in - migrations. Any objects of the now-embedded type which have zero incoming - links are deleted, and objects with multiple incoming links are duplicated. - This happens after the migration callback function completes, so there is no - functional change if you already have migration logic which correctly handles - this. ([Core #5737](https://github.com/realm/realm-core/pull/5737)). -* Improve performance when a new Realm file connects to the server for the - first time, especially when significant amounts of data has been written - while offline. ([Core #5772](https://github.com/realm/realm-core/pull/5772)) -* Shift more of the work done on the sync worker thread out of the write - transaction used to apply server changes, reducing how long it blocks other - threads from writing. ([Core #5772](https://github.com/realm/realm-core/pull/5772)) -* Improve the performance of the sync changeset parser, which speeds up - applying changesets from the server. ([Core #5772](https://github.com/realm/realm-core/pull/5772)) - -### Fixed - -* Fix all of the UBSan failures hit by our tests. It is unclear if any of these - manifested as visible bugs. ([Core #5665](https://github.com/realm/realm-core/pull/5665)) -* Upload completion callbacks were sometimes called before the final step of - interally marking the upload as complete, which could result in calling - `Realm.writeCopy()` from the completion callback failing due to there being - unuploaded changes. ([Core #4865](https://github.com/realm/realm-core/issues/4865)). -* Writing to a Realm stored on an exFAT drive threw the exception "fcntl() with - F_BARRIERFSYNC failed: Inappropriate ioctl for device" when a write - transaction needed to expand the file. - ([Core #5789](https://github.com/realm/realm-core/issues/5789), since 10.27.0) -* Syncing a Decimal128 with big significand could result in a crash. - ([Core #5728](https://github.com/realm/realm-core/issues/5728)) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 RC. - -### Internal - -* Upgraded realm-core from 12.5.1 to 12.6.0 - -10.28.7 Release notes (2022-09-02) -============================================================= - -### Enhancements - -* Add prebuilt binaries for Xcode 14 to the release package. - -### Fixed - -* Fix archiving watchOS release builds with Xcode 14. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 6. - -10.28.6 Release notes (2022-08-19) -============================================================= - -### Fixed - -* Fixed an issue where having realm-swift as SPM sub-target dependency leads to - missing symbols error during iOS archiving ([Core #7645](https://github.com/realm/realm-core/pull/7645)). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 5. - -### Internal - -* Upgraded realm-core from 12.5.0 to 12.5.1 - -10.28.5 Release notes (2022-08-09) -============================================================= - -### Enhancements - -* Improve performance of accessing `SubscriptionSet` properties when no writes - have been made to the Realm since the last access. - -### Fixed - -* A use-after-free could occur if a Realm with audit events enabled was - destroyed while processing an upload completion for the events Realm on a - different thread. ([Core PR #5714](https://github.com/realm/realm-core/pull/5714)) -* Opening a read-only synchronized Realm for the first time via asyncOpen did - not set the schema version, which could lead to `m_schema_version != - ObjectStore::NotVersioned` assertion failures later on. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 4. - -### Internal - -* Upgraded realm-core from 12.4.0 to 12.5.0 - -10.28.4 Release notes (2022-08-03) -============================================================= - -### Enhancements - -* Add support for building arm64 watchOS when installing Realm via CocoaPods. -* Reduce the amount of virtual address space used - ([Core #5645](https://github.com/realm/realm-core/pull/5645)). - -### Fixed - -* Fix some warnings when building with Xcode 14 - ([Core #5577](https://github.com/realm/realm-core/pull/5577)). -* Fix compilation failures on watchOS platforms which do not support thread-local storage. - ([#7694](https://github.com/realm/realm-swift/issues/7694), [#7695](https://github.com/realm/realm-swift/issues/7695) since v10.21.1) -* Fix a data race when committing a transaction while multiple threads are - waiting to begin write transactions. This appears to not have caused any - functional problems. -* Fix a data race when writing audit events which could occur if the sync - client thread was busy with other work when the event Realm was opened. -* Fix some cases of running out of virtual address space (seen/reported as mmap - failures) ([Core #5645](https://github.com/realm/realm-core/pull/5645)). -* Audit event scopes containing only write events and no read events would - occasionally throw a `BadVersion` exception when a write transaction was - committed (since v10.26.0). -* The client reset callbacks for the DiscardLocal mode would be passed invalid - Realm instances if the callback was invoked at a point where the Realm was - not otherwise open. ([Core #5654](https://github.com/realm/realm-core/pull/5654), since the introduction of DiscardLocal reset mode in v10.25.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 4. - -### Internal - -* Upgraded realm-core from 12.3.0 to 12.4.0. - -10.28.3 Release notes (2022-07-27) -============================================================= - -### Enhancements - -* Greatly improve the performance of obtaining cached Realm instances in Swift - when using a sync configuration. - -### Fixed - -* Add missing `initialSubscription` and `rerunOnOpen` to copyWithZone method on - `RLMRealmConfiguration`. This resulted in incorrect values when using - `RLMRealmConfiguration.defaultConfiguration`. -* The sync error handler did not hold a strong reference to the sync session - while dispatching the error from the worker thread to the main thread, - resulting in the session passed to the error handler being invalid if there - were no other remaining strong references elsewhere. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 3. - -10.28.2 Release notes (2022-06-30) -============================================================= - -### Fixed - -* Using `seedFilePath` threw an exception if the Realm file being opened - already existed ([#7840](https://github.com/realm/realm-swift/issues/7840), - since v10.26.0). -* The `intialSubscriptions` callback was invoked every time a Realm was opened - regardless of the value of `rerunOnOpen` and if the Realm was already open on - another thread (since v10.28.0). -* Allow using `RLMSupport.Swift` from RealmSwift's Cocoapods - ([#6886](https://github.com/realm/realm-swift/pull/6886)). -* Fix a UBSan failure when mapping encrypted pages. Fixing this did not change - the resulting assembly, so there were probably no functional problems - resulting from this (since v5.0.0). -* Improved performance of sync clients during integration of changesets with - many small strings (totalling > 1024 bytes per changeset) on iOS 14, and - devices which have restrictive or fragmented memory. - ([Core #5614](https://github.com/realm/realm-core/issues/5614)) -* Fix a data race when opening a flexible sync Realm (since v10.28.0). -* Add a missing backlink removal when assigning null or a non-link value to an - `AnyRealmValue` property which previously linked to an object. - This could have resulted in "key not found" exceptions or assertion failures - such as `mixed.hpp:165: [realm-core-12.1.0] Assertion failed: m_type` when - removing the destination link object. - ([Core #5574](https://github.com/realm/realm-core/pull/5573), since the introduction of AnyRealmValue in v10.8.0) - -### Compatibility - -* Realm Studio: 12.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 2. - -### Internal - -* Upgraded realm-core from 12.1.0 to 12.3.0. - -10.28.1 Release notes (2022-06-10) -============================================================= - -### Enhancements - -* Add support for Xcode 14. When building with Xcode 14, the minimum deployment - target is now iOS 11. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 1. - -10.28.0 Release notes (2022-06-03) -============================================================= - -### Enhancements - -* Replace mentions of 'MongoDB Realm' with 'Atlas App Services' in the documentation and update appropriate links to documentation. -* Allow adding a subscription querying for all documents of a type in swift for flexible sync. -``` - try await subscriptions.update { - subscriptions.append(QuerySubscription(name: "all_people")) - } -``` -* Add Combine API support for flexible sync beta. -* Add an `initialSubscriptions` parameter when retrieving the flexible sync configuration from a user, - which allows to specify a subscription update block, to bootstrap a set of flexible sync subscriptions - when the Realm is first opened. - There is an additional optional parameter flag `rerunOnOpen`, which allows to run this initial - subscriptions on every app startup. - -```swift - let config = user.flexibleSyncConfiguration(initialSubscriptions: { subs in - subs.append(QuerySubscription(name: "people_10") { - $0.age > 10 - }) - }, rerunOnOpen: true) - let realm = try Realm(configuration: config) -``` -* The sync client error handler will report an error, with detailed info about which object caused it, when writing an object to a flexible sync Realm outside of any query subscription. ([#5528](https://github.com/realm/realm-core/pull/5528)) -* Adding an object to a flexible sync Realm for a type that is not within a query subscription will now throw an exception. ([#5488](https://github.com/realm/realm-core/pull/5488)). - -### Fixed - -* Flexible Sync query subscriptions will correctly complete when data is synced to the local Realm. ([#5553](https://github.com/realm/realm-core/pull/5553), since v12.0.0) - -### Breaking Changes - -* Rename `SyncSubscriptionSet.write` to `SyncSubscriptionSet.update` to avoid confusion with `Realm.write`. -* Rename `SyncSubscription.update` to `SyncSubscription.updateQuery` to avoid confusion with `SyncSubscriptionSet.update`. -* Rename `RLMSyncSubscriptionSet.write` to `RLMSyncSubscriptionSet.update` to align it with swift API. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-13.4. - -### Internal - -* Upgraded realm-core from 12.0.0 to 12.1.0. - -10.27.0 Release notes (2022-05-26) -============================================================= - -### Enhancements - -* `@AsyncOpen`/`@AutoOpen` property wrappers can be used with flexible sync. - -### Fixed - -* When installing via SPM, debug builds could potentially hit an assertion - failure during flexible sync bootstrapping. ([Core #5527](https://github.com/realm/realm-core/pull/5527)) -* Flexible sync now only applies bootstrap data if the entire bootstrap is - received. Previously orphaned objects could result from the read snapshot on - the server changing. ([Core #5331](https://github.com/realm/realm-core/pull/5331)) -* Partially fix a performance regression in write performance introduced in - v10.21.1. v10.21.1 fixed a case where a kernel panic or device's battery - dying at the wrong point in a write transaction could potentially result in a - corrected Realm file, but at the cost of a severe performance hit. This - version adjusts how file synchronization is done to provide the same safety - at a much smaller performance hit. ([#7740](https://github.com/realm/realm-swift/issues/7740)). - -### Compatibility - -* Realm Studio: 11.0.0 or later (but see note below). -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-13.4. - -### Internal - -* Upgraded realm-core from 11.17.0 to 12.0.0. -* Bump the version number for the lockfile used for interprocess - synchronization. This has no effect on persistent data, but means that - versions of Realm which use pre-12.0.0 realm-core cannot open Realm files at - the same time as they are opened by this version. Notably this includes Realm - Studio, and v11.1.2 (the latest at the time of this release) cannot open - Realm files which are simultaneously open in the simulator. - -10.26.0 Release notes (2022-05-19) -============================================================= - -Xcode 13.1 is now the minimum supported version of Xcode, as Apple no longer -allows submitting to the app store with Xcode 12. - -### Enhancements - -* Add Xcode 13.4 binaries to the release package. -* Add Swift API for asynchronous transactions -```swift - try? realm.writeAsync { - realm.create(SwiftStringObject.self, value: ["string"]) - } onComplete: { error in - // optional handling on write complete - } - - try? realm.beginAsyncWrite { - realm.create(SwiftStringObject.self, value: ["string"]) - realm.commitAsyncWrite() - } - - let asyncTransactionId = try? realm.beginAsyncWrite { - // ... - } - try! realm.cancelAsyncWrite(asyncTransactionId) -``` -* Add Obj-C API for asynchronous transactions -``` - [realm asyncTransactionWithBlock:^{ - [StringObject createInRealm:realm withValue:@[@"string"]]; - } onComplete:^(NSError *error) { - // optional handling - }]; - - [realm beginAsyncWriteTransaction:^{ - [StringObject createInRealm:realm withValue:@[@"string"]]; - [realm commitAsyncWriteTransaction]; - }]; - - RLMAsyncTransactionId asyncTransactionId = [realm beginAsyncWriteTransaction:^{ - // ... - }]; - [realm cancelAsyncTransaction:asyncTransactionId]; -``` -* Improve performance of opening a Realm with `objectClasses`/`objectTypes` set - in the configuration. -* Implement the Realm event recording API for reporting reads and writes on a - Realm file to Atlas. - -### Fixed - -* Lower minimum OS version for `async` login and FunctionCallables to match the - rest of the `async` functions. ([#7791]https://github.com/realm/realm-swift/issues/7791) -* Consuming a RealmSwift XCFramework with library evolution enabled would give the error - `'Failed to build module 'RealmSwift'; this SDK is not supported by the compiler'` - when the XCFramework was built with an older XCode version and is - then consumed with a later version. ([#7313](https://github.com/realm/realm-swift/issues/7313), since v3.18.0) -* A data race would occur when opening a synchronized Realm with the client - reset mode set to `discardLocal` on one thread at the same time as a client - reset was being processed on another thread. This probably did not cause any - functional problems in practice and the broken timing window was very tight (since 10.25.0). -* If an async open of a Realm triggered a client reset, the callbacks for - `discardLocal` could theoretically fail to be called due to a race condition. - The timing for this was probably not possible to hit in practice (since 10.25.0). -* Calling `[RLMRealm freeze]`/`Realm.freeze` on a Realm which had been created from `writeCopy` - would not produce a frozen Realm. ([#7697](https://github.com/realm/realm-swift/issues/7697), since v5.0.0) -* Using the dynamic subscript API on unmanaged objects before first opening a - Realm or if `objectTypes` was set when opening a Realm would throw an - exception ([#7786](https://github.com/realm/realm-swift/issues/7786)). -* The sync client may have sent a corrupted upload cursor leading to a fatal - error from the server due to an uninitialized variable. - ([#5460](https://github.com/realm/realm-core/pull/5460), since v10.25.1) -* Flexible sync would not correctly resume syncing if a bootstrap was interrupted - ([#5466](https://github.com/realm/realm-core/pull/5466), since v10.21.1). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-13.4. - -### Internal - -* Upgraded realm-core from v11.15.0 to v11.17.0 - -10.25.2 Release notes (2022-04-27) -============================================================= - -### Enhancements - -* Replace Xcode 13.3 binaries with 13.3.1 binaries. - -### Fixed - -* `List` would contain an invalidated object instead of null when - the object linked to was deleted by a difference sync client - ([Core #5215](https://github.com/realm/realm-core/pull/5215), since v10.8.0). -* Adding an object to a Set, deleting the parent object of the Set, and then - deleting the object which was added to the Set would crash - ([Core #5387](https://github.com/realm/realm-core/issues/5387), since v10.8.0). -* Synchronized Realm files which were first created using v10.0.0-beta.3 would - be redownloaded instead of using the existing file, possibly resulting in the - loss of any unsynchronized data in those files (since v10.20.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3.1. - -### Internal - -* Upgraded realm-core from v11.14.0 to v11.15.0 - -10.25.1 Release notes (2022-04-11) -============================================================= - -### Fixed - -* Fixed various memory corruption bugs when encryption is used caused by not - locking a mutex when needed. - ([#7640](https://github.com/realm/realm-swift/issues/7640), [#7659](https://github.com/realm/realm-swift/issues/7659), since v10.21.1) -* Changeset upload batching did not calculate the accumulated size correctly, - resulting in “error reading body failed to read: read limited at 16777217 - bytes” errors from the server when writing large amounts of data - ([Core #5373](https://github.com/realm/realm-core/pull/5373), since 10.25.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3. - -### Internal - -* Upgraded realm-core from v11.13.0 to v11.14.0. - -10.25.0 Release notes (2022-03-29) -============================================================= - -Synchronized Realm files written by this version cannot be opened by older -versions of Realm. Existing files will be automatically upgraded when opened. - -Non-synchronized Realm files remain backwards-compatible. - -### Enhancements - -* Add ability to use Swift Query syntax in `@ObservedResults`, which allows you - to filter results using the `where` parameter. -* Add ability to use `MutableSet` with `StateRealmObject` in SwiftUI. -* Async/Await extensions are now compatible with iOS 13 and above when building - with Xcode 13.3. -* Sync changesets waiting to be uploaded to the server are now compressed, - reducing the disk space needed when large write transactions are performed - while offline or limited in bandwidth.([Core #5260](https://github.com/realm/realm-core/pull/5260)). -* Added new `SyncConfiguration.clientResetMode` and `RLMSyncConfiguration.clientResetMode` properties. - - The values of these properties will dictate client behavior in the event of a [client reset](https://docs.mongodb.com/realm/sync/error-handling/client-resets/). - - See below for information on `ClientResetMode` values. - - `clientResetMode` defaults to `.manual` if not set otherwise. -* Added new `ClientResetMode` and `RLMClientResetMode` enums. - - These enums represent possible client reset behavior for `SyncConfiguration.clientResetMode` and `RLMSyncConfiguration.clientResetMode`, respectively. - - `.manual` and `RLMClientResetModeManual` - - The local copy of the Realm is copied into a recovery - directory for safekeeping, and then deleted from the original location. The next time - the Realm for that partition value is opened, the Realm will automatically be re-downloaded from - MongoDB Realm, and can be used as normal. - - Data written to the Realm after the local copy of the Realm diverged from the backup - remote copy will be present in the local recovery copy of the Realm file. The - re-downloaded Realm will initially contain only the data present at the time the Realm - was backed up on the server. - - `rlmSync_clientResetBackedUpRealmPath` and `SyncError.clientResetInfo()` are used for accessing the recovery directory. - - `.discardLocal` and `RLMClientResetDiscardLocal` - - All unsynchronized local changes are automatically discarded and the local state is - automatically reverted to the most recent state from the server. Unsynchronized changes - can then be recovered in a post-client-reset callback block (See changelog below for more details). - - If RLMClientResetModeDiscardLocal is enabled but the client reset operation is unable to complete - then the client reset process reverts to manual mode. - - The realm's underlying object accessors remain bound so the UI may be updated in a non-disruptive way. -* Added support for client reset notification blocks for `.discardLocal` and `RLMClientResetDiscardLocal` - - **RealmSwift implementation**: `discardLocal(((Realm) -> Void)? = nil, ((Realm, Realm) -> Void)? = nil)` - - RealmSwift client reset blocks are set when initializing the user configuration - ```swift - var configuration = user.configuration(partitionValue: "myPartition", clientResetMode: .discardLocal(beforeClientResetBlock, afterClientResetBlock)) - ``` - - The before client reset block -- `((Realm) -> Void)? = nil` -- is executed prior to a client reset. Possible usage includes: - ```swift - let beforeClientResetBlock: (Realm) -> Void = { beforeRealm in - var recoveryConfig = Realm.Configuration() - recoveryConfig.fileURL = myRecoveryPath - do { - beforeRealm.writeCopy(configuration: recoveryConfig) - /* The copied realm could be used later for recovery, debugging, reporting, etc. */ - } catch { - /* handle error */ - } - } - ``` - - The after client reset block -- `((Realm, Realm) -> Void)? = nil)` -- is executed after a client reset. Possible usage includes: - ```Swift - let afterClientResetBlock: (Realm, Realm) -> Void = { before, after in - /* This block could be used to add custom recovery logic, back-up a realm file, send reporting, etc. */ - for object in before.objects(myClass.self) { - let res = after.objects(myClass.self) - if (res.filter("primaryKey == %@", object.primaryKey).first != nil) { - /* ...custom recovery logic... */ - } else { - /* ...custom recovery logic... */ - } - } - ``` - - **Realm Obj-c implementation**: Both before and after client reset callbacks exist as properties on `RLMSyncConfiguration` and are set at initialization. - ```objective-c - RLMRealmConfiguration *config = [user configurationWithPartitionValue:partitionValue - clientResetMode:RLMClientResetModeDiscardLocal - notifyBeforeReset:beforeBlock - notifyAfterReset:afterBlock]; - ``` - where `beforeBlock` is of type `RLMClientResetBeforeBlock`. And `afterBlock` is of type `RLMClientResetAfterBlock`. - -### Breaking Changes - -* Xcode 13.2 is no longer supported when building with Async/Await functions. Use - Xcode 13.3 to build with Async/Await functionality. - -### Fixed - -* Adding a Realm Object to a `ObservedResults` or a collections using - `StateRealmObject` that is managed by the same Realm would throw if the - Object was frozen and not thawed before hand. -* Setting a Realm Configuration for @ObservedResults using it's initializer - would be overrode by the Realm Configuration stored in - `.environment(\.realmConfiguration, ...)` if they did not match - ([Cocoa #7463](https://github.com/realm/realm-swift/issues/7463), since v10.6.0). -* Fix searchable component filter overriding the initial filter on `@ObservedResults`, (since v10.23.0). -* Comparing `Results`, `LinkingObjects` or `AnyRealmCollection` when using Realm via XCFramework - would result in compile time errors ([Cocoa #7615](https://github.com/realm/realm-swift/issues/7615), since v10.21.0) -* Opening an encrypted Realm while the keychain is locked on macOS would crash - ([#7438](https://github.com/realm/realm-swift/issues/7438)). -* Updating subscriptions while refreshing the access token would crash - ([Core #5343](https://github.com/realm/realm-core/issues/5343), since v10.22.0) -* Fix several race conditions in `SyncSession` related to setting - `customRequestHeaders` while using the `SyncSession` on a different thread. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3. - -### Internal - -* Upgraded realm-core from v11.12.0 to v11.13.0 - -10.24.2 Release notes (2022-03-18) -============================================================= - -### Fixed - -* Application would sometimes crash with exceptions like 'KeyNotFound' or - assertion "has_refs()". Other issues indicating file corruption may also be - fixed by this. The one mentioned here is the one that lead to solving the - problem. - ([Core #5283](https://github.com/realm/realm-core/issues/5283), since v5.0.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3. - -### Internal - -* Upgraded realm-core from 11.11.0 to 11.12.0 - -10.24.1 Release notes (2022-03-14) -============================================================= - -Switch to building the Carthage binary with Xcode 13.3. This release contains -no functional changes from 10.24.0. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3. - -10.24.0 Release notes (2022-03-05) -============================================================= - -### Enhancements - -* Add ability to use Swift Query syntax in `@ObservedResults`, which allows you - to filter results using the `where` parameter. - -### Fixed - -* If a list of objects contains links to objects not included in the - synchronized partition, collection change notifications for that list could - be incorrect ([Core #5164](https://github.com/realm/realm-core/issues/5164), since v10.0.0). -* Adding a new flexible sync subscription could crash with - "Assertion failed: !m_unbind_message_sent" in very specific timing scenarios - ([Core #5149](https://github.com/realm/realm-core/pull/5149), since v10.22.0). -* Converting floats/doubles into Decimal128 would yield imprecise results - ([Core #5184](https://github.com/realm/realm-core/pull/5184), since v10.0.0) -* Using accented characters in class and field names in a synchronized Realm - could result in sync errors ([Core #5196](https://github.com/realm/realm-core/pull/5196), since v10.0.0). -* Calling `Realm.invalidate()` from inside a Realm change notification could - result in the write transaction which produced the notification not being - persisted to disk (since v10.22.0). -* When a client reset error which results in the current Realm file being - backed up and then deleted, deletion errors were ignored as long as the copy - succeeded. When this happens the deletion of the old file is now scheduled - for the next launch of the app. ([Core #5180](https://github.com/realm/realm-core/issues/5180), since v2.0.0) -* Fix an error when compiling a watchOS Simulator target not supporting - Thread-local storage ([#7623](https://github.com/realm/realm-swift/issues/7623), since v10.21.0). -* Add a validation check to report a sensible error if a Realm configuration - indicates that an in-memory Realm should be encrypted. ([Core #5195](https://github.com/realm/realm-core/issues/5195)) -* The Swift package set the linker flags on the wrong target, resulting in - linker errors when SPM decides to build the core library as a dynamic library - ([#7266](https://github.com/realm/realm-swift/issues/7266)). -* The download-core task failed if run in an environment without TMPDIR set - ([#7688](https://github.com/realm/realm-swift/issues/7688), since v10.23.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3 beta 3. - -### Internal - -* Upgraded realm-core from 11.9.0 to 11.11.0 - -10.23.0 Release notes (2022-02-28) -============================================================= - -### Enhancements - -* Add `Realm.writeCopy(configuration:)`/`[RLMRealm writeCopyForConfiguration:]` which gives the - following functionality: - - Export a local non-sync Realm to be used with MongoDB Realm Sync - when the configuration is derived from a sync `RLMUser`/`User`. - - Write a copy of a local Realm to a destination specified in the configuration. - - Write a copy of a synced Realm in use with user A, and open it with user B. - - Note that migrations may be required when using a local realm configuration to open a realm file that - was copied from a synchronized realm. - - An exception will be thrown if a Realm exists at the destination. -* Add a `seedFilePath` option to `RLMRealmConfiguration` and `Configuration`. If this - option is set then instead of creating an empty Realm, the realm at the `seedFilePath` will - be copied to the `fileURL` of the new Realm. If a Realm file already exists at the - desitnation path, the seed file will not be copied and the already existing Realm - will be opened instead. Note that to use this parameter with a synced Realm configuration - the seed Realm must be appropriately copied to a destination with - `Realm.writeCopy(configuration:)`/`[RLMRealm writeCopyForConfiguration:]` first. -* Add ability to permanently delete a User from a MongoDB Realm app. This can - be invoked with `User.delete()`/`[RLMUser deleteWithCompletion:]`. -* Add `NSCopying` conformance to `RLMDecimal128` and `RLMObjectId`. -* Add Xcode 13.3 binaries to the release package (and remove 13.0). - -### Fixed - -* Add support of arm64 in Carthage build ([#7154](https://github.com/realm/realm-cocoa/issues/7154) -* Adding missing support for `IN` queries to primitives types on Type Safe Queries. - ```swift - let persons = realm.objects(Person.self).where { - let acceptableNames = ["Tom", "James", "Tyler"] - $0.name.in([acceptableNames]) - } - ``` - ([Cocoa #7633](https://github.com/realm/realm-swift/issues/7633), since v10.19.0) -* Work around a compiler crash when building with Swift 5.6 / Xcode 13.3. - CustomPersistable's PersistedType must now always be a built-in type rather - than possibly another CustomPersistable type as Swift 5.6 has removed support - for infinitely-recursive associated types ([#7654](https://github.com/realm/realm-swift/issues/7654)). -* Fix redundant call to filter on `@ObservedResults` from `searchable` - component (since v10.19.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3 beta 3. - -10.22.0 Release notes (2022-01-25) -============================================================= - -### Enhancements - -* Add beta support for flexible sync. See the [backend](https://docs.mongodb.com/realm/sync/data-access-patterns/flexible-sync/) and [SDK](https://docs.mongodb.com/realm/sdk/swift/examples/flexible-sync/) documentation for more information. Please report any issues with the beta through Github. - -### Fixed - -* UserIdentity metadata table grows indefinitely. ([#5152](https://github.com/realm/realm-core/issues/5152), since v10.20.0) -* We now report a useful error message when opening a sync Realm in non-sync mode or vice-versa.([#5161](https://github.com/realm/realm-core/pull/5161), since v5.0.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.2.1. - -### Internal - -* Upgraded realm-core from 11.8.0 to 11.9.0 - -10.21.1 Release notes (2022-01-12) -============================================================= - -### Fixed - -* The sync client will now drain the receive queue when a send fails with - ECONNRESET, ensuring that any error message from the server gets received and - processed. ([#5078](https://github.com/realm/realm-core/pull/5078)) -* Schema validation was missing for embedded objects in sets, resulting in an - unhelpful error being thrown if a Realm object subclass contained one (since v10.0.0). -* Opening a Realm with a schema that has an orphaned embedded object type - performed an extra empty write transaction (since v10.0.0). -* Freezing a Realm with a schema that has orphaned embedded object types threw - a "Wrong transactional state" exception (since v10.19.0). -* `@sum` and `@avg` queries on Dictionaries of floats or doubles used too much - precision for intermediates, resulting in incorrect rounding (since v10.5.0). -* Change the exception message for calling refresh on an immutable Realm from - "Continuous transaction through DB object without history information." to - "Can't refresh a read-only Realm." - ([#5061](https://github.com/realm/realm-core/issues/5061), since v10.8.0). -* Queries of the form "link.collection.@sum = 0" where `link` is null matched - when `collection` was a List or Set, but not a Dictionary - ([#5080](https://github.com/realm/realm-core/pull/5080), since v10.8.0). -* Types which require custom obj-c bridging (such as `PersistableEnum` or - `CustomPersistable`) would crash with exceptions mentioning `__SwiftValue` in - a variety of places on iOS versions older than iOS 14 - ([#7604](https://github.com/realm/realm-swift/issues/7604), since v10.21.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.2.1. - -### Internal - -* Upgraded realm-core from 11.6.1 to 11.8.0. - -10.21.0 Release notes (2022-01-10) -============================================================= - -### Enhancements - -* Add `metadata` property to `RLMUserProfile`/`UserProfile`. -* Add class `Projection` to allow creation of light weight view models out of Realm Objects. -```swift -public class Person: Object { - @Persisted var firstName = "" - @Persisted var lastName = "" - @Persisted var address: Address? = nil - @Persisted var friends = List() -} - -public class Address: EmbeddedObject { - @Persisted var city: String = "" - @Persisted var country = "" -} - -class PersonProjection: Projection { - // `Person.firstName` will have same name and type - @Projected(\Person.firstName) var firstName - // There will be the only String for `city` of the original object `Address` - @Projected(\Person.address.city) var homeCity - // List will be mapped to list of firstNames - @Projected(\Person.friends.projectTo.firstName) var firstFriendsName: ProjectedCollection -} - -// `people` will contain projections for every `Person` object in the `realm` -let people: Results = realm.objects(PersonProjection.self) -``` -* Greatly improve performance of reading AnyRealmValue and enum types from - Realm collections. -* Allow using Swift enums which conform to `PersistableEnum` as the value type - for all Realm collections. -* `AnyRealmCollection` now conforms to `Encodable`. -* AnyRealmValue and PersistableEnum values can now be passed directly to an - NSPredicate used in a filter() call rather than having to pass the rawValue - (the rawValue is still allowed). -* Queries on collections of PersistableEnums can now be performed with `where()`. -* Add support for querying on the rawValue of an enum with `where()`. -* `.count` is supported for Maps of all types rather than just numeric types in `where()`. -* Add support for querying on the properties of objects contained in - dictionaries (e.g. "dictProperty.@allValues.name CONTAINS 'a'"). -* Improve the error message for many types of invalid predicates in queries. -* Add support for comparing `@allKeys` to another property on the same object. -* Add `Numeric` conformance to `Decimal128`. -* Make some invalid property declarations such as `List` a - compile-time error instead of a runtime error. -* Calling `.sorted(byKeyPath:)` on a collection with an Element type which does - not support sorting by keypaths is now a compile-time error instead of a - runtime error. -* `RealmCollection.sorted(ascending:)` can now be called on all - non-Object/EmbeddedObject collections rather than only ones where the - `Element` conforms to `Comparable`. -* Add support for using user-defined types with `@Persistable` and in Realm - collections by defining a mapping to and from a type which Realm knows how to - store. For example, `URL` can be made persistable with: - ```swift - extension URL: FailableCustomPersistable { - // Store URL values as a String in Realm - public typealias PersistedType = String - // Convert a String to a URL - public init?(persistedValue: String) { self.init(string: persistedValue) } - // Convert a URL to a String - public var persistableValue: String { self.absoluteString } - } - ``` - After doing this, `@Persisted var url: URL` is a valid property declaration - on a Realm object. More advanced mappings can be done by mapping to an - EmbeddedObject which can store multiple values. - -### Fixed - -* Accessing a non object collection inside a migration would cause a crash -* [#5633](https://github.com/realm/realm-cocoa/issues/5633). -* Accessing a `Map` of objects dynamically would not handle nulled values correctly (since v10.8.0). -* `where()` allowed constructing some nonsensical queries due to boolean - comparisons returning `Query` rather than `Query` (since v10.19.0). -* `@allValues` queries on dictionaries accidentally did not require "ANY". -* Case-insensitive and diacritic-insensitive modifiers were ignored when - comparing the result of an aggregate operation to another property in a - query. -* `Object.init(value:)` did not allow initializing `RLMDictionary`/`Map` - properties with null values for map entries (since v10.8.0). -* `@ObservedResults` did not refresh when changes were made to the observed - collection. (since v10.6.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.2.1. - -10.20.1 Release notes (2021-12-14) -============================================================= - -Xcode 12.4 is now the minimum supported version of Xcode. - -### Fixed - -* Add missing `Indexable` support for UUID. - ([Cocoa #7545](https://github.com/realm/realm-swift/issues/7545), since v10.10.0) - -### Breaking Changes - -* All `async` functions now require Xcode 13.2 to work around an App - Store/TestFlight bug that results in apps built with 13.0/13.1 which do not - use libConcurrency but link a library which does crashing on startup. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.2. - -10.20.0 Release notes (2021-11-16) -============================================================= - -### Enhancements - -* Conform `@ThreadSafe` and `ThreadSafeReference` to `Sendable`. -* Allow using Swift enums which conform to `PersistableEnum` as the value type - for all Realm collections. -* `AnyRealmCollection` now conforms to `Encodable`. -* Greatly improve performance of reading AnyRealmValue and enum types from - Realm collections. -* `AnyRealmCollection` now conforms to `Encodable`. - -### Fixed - -* `@AutoOpen` will open the existing local Realm file on any connection error - rather than only when the connection specifically times out. -* Do not allow `progress` state changes for `@AutoOpen` and `@AsyncOpen` after - changing state to `open(let realm)` or `error(let error)`. -* Logging out a sync user failed to remove the local Realm file for partitions - with very long partition values that would have exceeded the maximum path - length. ([Core #4187](https://github.com/realm/realm-core/issues/4187), since v10.0.0) -* Don't keep trying to refresh the access token if the client's clock is more - than 30 minutes fast. ([Core #4941](https://github.com/realm/realm-core/issues/4941)) -* Failed auth requests used a fixed long sleep rather than exponential backoff - like other sync requests, which could result in very delayed reconnects after - a device was offline long enough for the access token to expire (since v10.0.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.1. - -### Internal - -* Upgraded realm-core from 11.6.0 to 11.6.1. - -10.19.0 Release notes (2021-11-04) -============================================================= - -### Enhancements - -* Add `.searchable()` SwiftUI View Modifier which allows filtering - `@ObservedResult` results from a search field component by a key path. - ```swift - List { - ForEach(reminders) { reminder in - ReminderRowView(reminder: reminder) - } - }.searchable(text: $searchFilter, - collection: $reminders, - keyPath: \.name) { - ForEach(reminders) { remindersFiltered in - Text(remindersFiltered.name).searchCompletion(remindersFiltered.name) - } - } - ``` -* Add an API for a type safe query syntax. This allows you to filter a Realm - and collections managed by a Realm with Swift style expressions. Here is a - brief example: - ```swift - class Person: Object { - @Persisted var name: String - @Persisted var hobbies: MutableSet - @Persisted var pets: List - } - class Pet: Object { - @Persisted var name: String - @Persisted var age: Int - } - - let persons = realm.objects(Person.self).where { - $0.hobbies.contains("music") || $0.hobbies.contains("baseball") - } - - persons = realm.objects(Person.self).where { - ($0.pets.age >= 2) && $0.pets.name.starts(with: "L") - } - ``` - ([#7419](https://github.com/realm/realm-swift/pull/7419)) -* Add support for dictionary subscript expressions - (e.g. `"phoneNumbers['Jane'] == '123-3456-123'"`) when querying with an - NSPredicate. -* Add UserProfile to User. This contains metadata from social logins with MongoDB Realm. -* Slightly reduce the peak memory usage when processing sync changesets. - -### Fixed - -* Change default request timeout for `RLMApp` from 6 seconds to 60 seconds. -* Async `Realm` init would often give a Realm instance which could not actually - be used and would throw incorrect thread exceptions. It now is `@MainActor` - and gives a Realm instance which always works on the main actor. The - non-functional `queue:` parameter has been removed (since v10.15.0). -* Restore the pre-v10.12.0 behavior of calling `writeCopy()` on a synchronized - Realm which produced a local non-synchronized Realm - ([#7513](https://github.com/realm/realm-swift/issues/7513)). -* Decimal128 did not properly normalize the value before hashing and so could - have multiple values which are equal but had different hash values (since v10.8.0). -* Fix a rare assertion failure or deadlock when a sync session is racing to - close at the same time that external reference to the Realm is being - released. ([Core #4931](https://github.com/realm/realm-core/issues/4931)) -* Fix a assertion failure when opening a sync Realm with a user who had been - removed. Instead an exception will be thrown. ([Core #4937](https://github.com/realm/realm-core/issues/4937), since v10.0.0) -* Fixed a rare segfault which could trigger if a user was being logged out - while the access token refresh response comes in. - ([Core #4944](https://github.com/realm/realm-core/issues/4944), since v10.0.0) -* Fixed a bug where progress notifiers on an AsyncOpenTask could be called - after the open completed. ([Core #4919](https://github.com/realm/realm-core/issues/4919)) -* SecureTransport was not enabled for macCatalyst builds when installing via - SPM, resulting in `'SSL/TLS protocol not supported'` exceptions when using - Realm Sync. ([#7474](https://github.com/realm/realm-swift/issues/7474)) -* Users were left in the logged in state when their refresh token expired. - ([Core #4882](https://github.com/realm/realm-core/issues/4882), since v10) -* Calling `.count` on a distinct collection would return the total number of - objects in the collection rather than the distinct count the first time it is - called. ([#7481](https://github.com/realm/realm-swift/issues/7481), since v10.8.0). -* `realm.delete(collection.distinct(...))` would delete all objects in the - collection rather than just the first object with each distinct value in the - property being distincted on, unless the distinct Results were read from at - least once first (since v10.8.0). -* Calling `.distinct()` on a collection, accessing the Results, then passing - the Results to `realm.delete()` would delete the correct objects, but - afterwards report a count of zero even if there were still objects in the - Results (since v10.8.0). -* Download compaction could result in non-streaming sync download notifiers - never reporting completion (since v10.0.0, - [Core #4989](https://github.com/realm/realm-core/pull/4989)). -* Fix a deadlock in SyncManager that was probably not possible to hit in - real-world code (since v10.0.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.2. - -### Internal - -* Upgraded realm-core from v11.4.1 to v11.6.0 - -10.18.0 Release notes (2021-10-25) -============================================================= - -### Enhancements - -* Add support for using multiple users with `@AsyncOpen` and `@AutoOpen`. - Setting the current user to a new user will now automatically reopen the - Realm with the new user. -* Add prebuilt binary for Xcode 13.1 to the release package. - -### Fixed - -* Fix `@AsyncOpen` and `@AutoOpen` using `defaultConfiguration` by default if - the user's doesn't provide one, will set an incorrect path which doesn't - correspond to the users configuration one. (since v10.12.0) -* Adding missing subscription completion for `AsyncOpenPublisher` after - successfully returning a realm. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.1. - -10.17.0 Release notes (2021-10-06) -============================================================= - -### Enhancements - -* Add a new `@ThreadSafe` property wrapper. Objects and collections wrapped by `@ThreadSafe` may be passed between threads. It's - intended to allow local variables and function parameters to be used across - threads when needed. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.0. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0. - -10.16.0 Release notes (2021-09-29) -============================================================= - -### Enhancements - -* Add `async` versions of `EmailPasswordAuth.callResetPasswordFunction` and -r `User.linkUser` methods. -* Add `async` version of `MongoCollection` methods. -* Add `async` support for user functions. - -### Fixed - -* A race condition in Realm.asyncOpen() sometimes resulted in subsequent writes - from Realm Sync failing to produce notifications - ([#7447](https://github.com/realm/realm-swift/issues/7447), - [#7453](https://github.com/realm/realm-swift/issues/7453), - [Core #4909](https://github.com/realm/realm-core/issues/4909), since v10.15.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.0. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0. - -10.15.1 Release notes (2021-09-15) -============================================================= - -### Enhancements - -* Switch to building the Carthage release with Xcode 13. - -### Fixed - -* Fix compilation error where Swift 5.5 is available but the macOS 12 SDK was - not. This was notable for the Xcode 13 RC. This fix adds a #canImport check - for the `_Concurrency` module that was not available before the macOS 12 SDK. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.0. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0. - -10.15.0 Release notes (2021-09-10) -============================================================= - -### Enhancements - -* Add `async` versions of the `Realm.asyncOpen` and `App.login` methods. -* ThreadSafeReference no longer pins the source transaction version for - anything other than a Results created by filtering a collection. This means - that holding on to thread-safe references to other things (such as Objects) - will no longer cause file size growth. -* A ThreadSafeReference to a Results backed by a collection can now be created - inside a write transaction as long as the collection was not created in the - current write transaction. -* Synchronized Realms are no longer opened twice, cutting the address space and - file descriptors used in half. - ([Core #4839](https://github.com/realm/realm-core/pull/4839)) -* When using the SwiftUI helper types (@ObservedRealmObject and friends) to - bind to an Equatable property, self-assignment no longer performs a pointless - write transaction. SwiftUI appears to sometimes call a Binding's set function - multiple times for a single UI action, so this results in significantly fewer - writes being performed. - -### Fixed - -* Adding an unmanaged object to a Realm that was declared with - `@StateRealmObject` would throw the exception `"Cannot add an object with - observers to a Realm"`. -* The `RealmCollectionChange` docs refered to indicies in modifications as the - 'new' collection. This is incorrect and the docs now state that modifications - refer to the previous version of the collection. ([Cocoa #7390](https://github.com/realm/realm-swift/issues/7390)) -* Fix crash in `RLMSyncConfiguration.initWithUser` error mapping when a user is disabled/deleted from MongoDB Realm dashboard. - ([Cocoa #7399](https://github.com/realm/realm-swift/issues/7399), since v10.0.0) -* If the application crashed at the wrong point when logging a user in, the - next run of the application could hit the assertion failure "m_state == - SyncUser::State::LoggedIn" when a synchronized Realm is opened with that - user. ([Core #4875](https://github.com/realm/realm-core/issues/4875), since v10.0.0) -* The `keyPaths:` parameter to `@ObservedResults` did not work (since v10.12.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 5. - -### Internal - -* Upgraded realm-core from 11.3.1 to 11.4.1 - -10.14.0 Release notes (2021-09-03) -============================================================= - -### Enhancements - -* Add additional `observe` methods for Objects and RealmCollections which take - a `PartialKeyPath` type key path parameter. -* The release package once again contains Xcode 13 binaries. -* `PersistableEnum` properties can now be indexed or used as the primary key if - the RawValue is an indexable or primary key type. - -### Fixed - -* `Map` did not conform to `Codable`. - ([Cocoa #7418](https://github.com/realm/realm-swift/pull/7418), since v10.8.0) -* Fixed "Invalid data type" assertion failure in the sync client when the - client recieved an AddColumn instruction from the server for an AnyRealmValue - property when that property already exists locally. ([Core #4873](https://github.com/realm/realm-core/issues/4873), since v10.8.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 5. - -### Internal - -* Upgraded realm-core from 11.3.0 to 11.3.1. - -10.13.0 Release notes (2021-08-26) -============================================================= - -### Enhancements - -* Sync logs now contain information about what object/changeset was being applied when the exception was thrown. - ([Core #4836](https://github.com/realm/realm-core/issues/4836)) -* Added ServiceErrorCode for wrong username/password when using '`App.login`. - ([Core #7380](https://github.com/realm/realm-swift/issues/7380) - -### Fixed - -* Fix crash in `MongoCollection.findOneDocument(filter:)` that occurred when no results were - found for a given filter. - ([Cocoa #7380](https://github.com/realm/realm-swift/issues/7380), since v10.0.0) -* Some of the SwiftUI property wrappers incorrectly required objects to conform - to ObjectKeyIdentifiable rather than Identifiable. - ([Cocoa #7372](https://github.com/realm/realm-swift/issues/7372), since v10.6.0) -* Work around Xcode 13 beta 3+ shipping a broken swiftinterface file for Combine on 32-bit iOS. - ([Cocoa #7368](https://github.com/realm/realm-swift/issues/7368)) -* Fixes history corruption when replacing an embedded object in a list. - ([Core #4845](https://github.com/realm/realm-core/issues/4845)), since v10.0.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 5. - -### Internal - -* Upgraded realm-core from 11.2.0 to 11.3.0 - -10.12.0 Release notes (2021-08-03) -============================================================= - -### Enhancements - -* `Object.observe()` and `RealmCollection.observe()` now include an optional - `keyPaths` parameter which filters change notifications to those only - occurring on the provided key path or key paths. See method documentation - for extended detail on filtering behavior. -* `ObservedResults` now includes an optional `keyPaths` parameter - which filters change notifications to those only occurring on the provided - key path or key paths. ex) `@ObservedResults(MyObject.self, keyPaths: ["myList.property"])` -* Add two new property wrappers for opening a Realm asynchronously in a - SwiftUI View: - - `AsyncOpen` is a property wrapper that initiates Realm.asyncOpen - for the current user, notifying the view when there is a change in Realm asyncOpen state. - - `AutoOpen` behaves similarly to `AsyncOpen`, but in the case of no internet - connection this will return an opened realm. -* Add `EnvironmentValues.partitionValue`. This value can be injected into any view using one of - our new property wrappers `AsyncOpen` and `AutoOpen`: - `MyView().environment(\.partitionValue, "partitionValue")`. -* Shift more of the work done when first initializing a collection notifier to - the background worker thread rather than doing it on the main thread. - -### Fixed - -* `configuration(partitionValue: AnyBSON)` would always set a nil partition value - for the user sync configuration. -* Decoding a `@Persisted` property would incorrectly throw a `DecodingError.keyNotFound` - for an optional property if the key is missing. - ([Cocoa #7358](https://github.com/realm/realm-swift/issues/7358), since v10.10.0) -* Fixed a symlink which prevented Realm from building on case sensitive file systems. - ([#7344](https://github.com/realm/realm-swift/issues/7344), since v10.8.0) -* Removing a change callback from a Results would sometimes block the calling - thread while the query for that Results was running on the background worker - thread (since v10.11.0). -* Object observers did not handle the object being deleted properly, which - could result in assertion failures mentioning "m_table" in ObjectNotifier - ([Core #4824](https://github.com/realm/realm-core/issues/4824), since v10.11.0). -* Fixed a crash when delivering notifications over a nested hierarchy of lists - of Mixed that contain links. ([Core #4803](https://github.com/realm/realm-core/issues/4803), since v10.8.0) -* Fixed a crash when an object which is linked to by a Mixed is deleted via - sync. ([Core #4828](https://github.com/realm/realm-core/pull/4828), since v10.8.0) -* Fixed a rare crash when setting a mixed link for the first time which would - trigger if the link was to the same table and adding the backlink column - caused a BPNode split. ([Core #4828](https://github.com/realm/realm-core/pull/4828), since v10.8.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 4. On iOS Xcode 13 beta 2 is the latest supported - version due to betas 3 and 4 having a broken Combine.framework. - -### Internal - -* Upgraded realm-core from v11.1.1 to v11.2.0 - -10.11.0 Release notes (2021-07-22) -============================================================= - -### Enhancements - -* Add type safe methods for: - - `RealmCollection.min(of:)` - - `RealmCollection.max(of:)` - - `RealmCollection.average(of:)` - - `RealmCollection.sum(of:)` - - `RealmCollection.sorted(by:ascending:)` - - `RealmKeyedCollection.min(of:)` - - `RealmKeyedCollection.max(of:)` - - `RealmKeyedCollection.average(of:)` - - `RealmKeyedCollection.sum(of:)` - - `RealmKeyedCollection.sorted(by:ascending:)` - - `Results.distinct(by:)` - - `SortDescriptor(keyPath:ascending:) - - Calling these methods can now be done via Swift keyPaths, like so: - ```swift - class Person: Object { - @Persisted var name: String - @Persisted var age: Int - } - - let persons = realm.objects(Person.self) - persons.min(of: \.age) - persons.max(of: \.age) - persons.average(of: \.age) - persons.sum(of: \.age) - persons.sorted(by: \.age) - persons.sorted(by: [SortDescriptor(keyPath: \Person.age)]) - persons.distinct(by: [\Person.age]) - ``` -* Add `List.objects(at indexes:)` in Swift and `[RLMCollection objectsAtIndexes:]` in Objective-C. - This allows you to select elements in a collection with a given IndexSet ([#7298](https://github.com/realm/realm-swift/issues/7298)). -* Add `App.emailPasswordAuth.retryCustomConfirmation(email:completion:)` and `[App.emailPasswordAuth retryCustomConfirmation:completion:]`. - These functions support retrying a [custom confirmation](https://docs.mongodb.com/realm/authentication/email-password/#run-a-confirmation-function) function. -* Improve performance of creating collection notifiers for Realms with a complex schema. - This means that the first run of a query or first call to observe() on a collection will - do significantly less work on the calling thread. -* Improve performance of calculating changesets for notifications, particularly - for deeply nested object graphs and objects which have List or Set properties - with small numbers of objects in the collection. - -### Fixed - -* `RealmProperty` would crash when decoding a `null` json value. - ([Cocoa #7323](https://github.com/realm/realm-swift/issues/7323), since v10.8.0) -* `@Persisted` would crash when decoding a `null` value. - ([#7332](https://github.com/realm/realm-swift/issues/7332), since v10.10.0). -* Fixed an issue where `Realm.Configuration` would be set after views have been laid out - when using `.environment(\.realmConfiguration, ...)` in SwiftUI. This would cause issues if you are - required to bump your schema version and are using `@ObservedResults`. -* Sync user profiles now correctly persist between runs. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 3. Note that this release does not contain Xcode 13 - beta binaries as beta 3 does not include a working version of - Combine.framework for iOS. - -### Internal - -* Upgraded realm-core from 11.0.4 to 11.1.1 - -10.10.0 Release notes (2021-07-07) -============================================================= - -### Enhancements - -* Add a new property wrapper-based declaration syntax for properties on Realm - Swift object classes. Rather than using `@objc dynamic` or the - `RealmProperty` wrapper type, properties can now be declared with `@Persisted - var property: T`, where `T` is any of the supported property types, including - optional numbers and collections. This has a few benefits: - - - All property types are now declared in the same way. No more remembering - that this type requires `@objc dynamic var` while this other type - requires `let`, and the `RealmProperty` or `RealmOptional` helper is no - longer needed for types not supported by Objective-C. - - No more overriding class methods like `primaryKey()`, - `indexedProperties()` or `ignoredProperties()`. The primary key and - indexed flags are set directly in the property declaration with - `@Persisted(primaryKey: true) var _id: ObjectId` or `@Persisted(indexed: - true) var indexedProperty: Int`. If any `@Persisted` properties are present, - all other properties are implicitly ignored. - - Some performance problems have been fixed. Declaring collection - properties as `let listProp = List()` resulted in the `List` object - being created eagerly when the parent object is read, which could cause - performance problems if a class has a large number of `List` or - `RealmOptional` properties. `@Persisted var list: List` allows us to - defer creating the `List` until it's accessed, improving performance - when looping over objects and using only some of the properties. - - Similarly, `let _id = ObjectId.generate()` was a convenient way to - declare a sync-compatible primary key, but resulted in new ObjectIds - being generated in some scenarios where the value would never actually be - used. `@Persisted var _id: ObjectId` has the same behavior of - automatically generating primary keys, but allows us to only generate it - when actually needed. - - More types of enums are supported. Any `RawRepresentable` enum whose raw - type is a type supported by Realm can be stored in an `@Persisted` - project, rather than just `@objc` enums. Enums must be declared as - conforming to the `PersistableEnum` protocol, and still cannot (yet) be - used in collections. - - `willSet` and `didSet` can be used with `@Persistable` properties, while - they previously did not work on managed Realm objects. - - While we expect the switch to the new syntax to be very simple for most - users, we plan to support the existing objc-based declaration syntax for the - foreseeable future. The new style and old style cannot be mixed within a - single class, but new classes can use the new syntax while existing classes - continue to use the old syntax. Updating an existing class to the new syntax - does not change what data is stored in the Realm file and so does not require - a migration (as long as you don't also change the schema in the process, of - course). -* Add `Map.merge()`, which adds the key-value pairs from another Map or - Dictionary to the map. -* Add `Map.asKeyValueSequence()` which returns an adaptor that can be used with - generic functions that operate on Dictionary-styled sequences. - -### Fixed -* AnyRealmValue enum values are now supported in more places when creating - objects. -* Declaring a property as `RealmProperty` will now report an - error during schema discovery rather than doing broken things when the - property is used. -* Observing the `invalidated` property of `RLMDictionary`/`Map` via KVO did not - set old/new values correctly in the notification (since 10.8.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 2. - -10.9.0 Release notes (2021-07-01) -============================================================= - -### Enhancements - -* Add `App.emailPasswordAuth.retryCustomConfirmation(email:completion:)` and - `[App.emailPasswordAuth retryCustomConfirmation:completion:]`. These - functions support retrying a [custom confirmation](https://docs.mongodb.com/realm/authentication/email-password/#run-a-confirmation-function) - function. -* Improve performance of many Dictionary operations, especially when KVO is being used. - -### Fixed - -* Calling `-[RLMRealm deleteObjects:]` on a `RLMDictionary` cleared the - dictionary but did not actually delete the objects in the dictionary (since v10.8.0). -* Rix an assertion failure when observing a `List` contains - object links. ([Core #4767](https://github.com/realm/realm-core/issues/4767), since v10.8.0) -* Fix an assertion failure when observing a `RLMDictionary`/`Map` which links - to an object which was deleting by a different sync client. - ([Core #4770](https://github.com/realm/realm-core/pull/4770), since v10.8.0) -* Fix an endless recursive loop that could cause a stack overflow when - computing changes on a set of objects which contained cycles. - ([Core #4770](https://github.com/realm/realm-core/pull/4770), since v10.8.0). -* Hash collisions in dictionaries were not handled properly. - ([Core #4776](https://github.com/realm/realm-core/issues/4776), since v10.8.0). -* Fix a crash after clearing a list or set of AnyRealmValue containing links to - objects ([Core #4774](https://github.com/realm/realm-core/issues/4774), since v10.8.0) -* Trying to refresh a user token which had been revoked by an admin lead to an - infinite loop and then a crash. This situation now properly logs the user out - and reports an error. ([Core #4745](https://github.com/realm/realm-core/issues/4745), since v10.0.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 2. - -### Internal - -* Upgraded realm-core from v11.0.3 to v11.0.4 - -10.8.1 Release notes (2021-06-22) -============================================================= - -### Enhancements - -* Update Xcode 12.5 to Xcode 12.5.1. -* Create fewer dynamic classes at runtime, improving memory usage and startup time slightly. - -### Fixed - -* Importing the Realm swift package produced several warnings about excluded - files not existing. Note that one warning will still remain after this change. - ([#7295](https://github.com/realm/realm-swift/issues/7295), since v10.8.0). -* Update the root URL for the API docs so that the links go to the place where - new versions of the docs are being published. - ([#7299](https://github.com/realm/realm-swift/issues/7299), since v10.6.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. Note that this version of Realm Studio has not - yet been released at the time of this release. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 1. - -10.8.0 Release notes (2021-06-14) -============================================================= - -NOTE: This version upgrades the Realm file format version to add support for -the new data types and to adjust how primary keys are handled. Realm files -opened will be automatically upgraded and cannot be read by versions older than -v10.8.0. This upgrade should be a fairly fast one. Note that we now -automatically create a backup of the pre-upgrade Realm. - -### Enhancements - -* Add support for the `UUID` and `NSUUID` data types. These types can be used - for the primary key property of Object classes. -* Add two new collection types to complement the existing `RLMArray`/`List` type: - - `RLMSet` in Objective-C and `MutableSet` in Swift are mutable - unordered collections of distinct objects, similar to the built-in - `NSMutableSet` and `Set`. The values in a set may be any non-collection - type which can be stored as a Realm property. Sets are guaranteed to never - contain two objects which compare equal to each other, including when - conflicting writes are merged by sync. - - `RLMDictionary` in Objective-C and `Map` are - mutable key-value dictionaries, similar to the built-in - `NSMutableDictionary` and `Dictionary`. The values in a dictionary may be - any non-collection type which can be stored as a Realm property. The keys - must currently always be a string. -* Add support for dynamically typed properties which can store a value of any - of the non-collection types supported by Realm, including Object subclasses - (but not EmbeddedObject subclasses). These are declared with - `@property id propertyName;` in Objective-C and - `let propertyName = RealmProperty()` in Swift. - -### Fixed - -* Setting a collection with a nullable value type to null via one of the - dynamic interfaces would hit an assertion failure instead of clearing the - collection. -* Fixed an incorrect detection of multiple incoming links in a migration when - changing a table to embedded and removing a link to it at the same time. - ([#4694](https://github.com/realm/realm-core/issues/4694) since v10.0.0-beta.2) -* Fixed a divergent merge on Set when one client clears the Set and another - client inserts and deletes objects. - ([#4720](https://github.com/realm/realm-core/issues/4720)) -* Partially revert to pre-v5.0.0 handling of primary keys to fix a performance - regression. v5.0.0 made primary keys determine the position in the low-level - table where newly added objects would be inserted, which eliminated the need - for a separate index on the primary key. This made some use patterns slightly - faster, but also made some reasonable things dramatically slower. - ([#4522](https://github.com/realm/realm-core/issues/4522)) -* Fixed an incorrect detection of multiple incoming links in a migration when - changing a table to embedded and removing a link to it at the same time. - ([#4694](https://github.com/realm/realm-core/issues/4694) since v10.0.0-beta.2) -* Fix collection notification reporting for modifications. This could be - observed by receiving the wrong indices of modifications on sorted or - distinct results, or notification blocks sometimes not being called when only - modifications have occured. - ([#4573](https://github.com/realm/realm-core/pull/4573) since v5.0.0). -* Fix incorrect sync instruction emission when replacing an existing embedded - object with another embedded object.([Core #4740](https://github.com/realm/realm-core/issues/4740) - -### Deprecations - -* `RealmOptional` has been deprecated in favor of `RealmProperty`. - `RealmProperty` is functionality identical to `RealmOptional` when storing - optional numeric types, but can also store the new `AnyRealmValue` type. - -### Compatibility - -* Realm Studio: 11.0.0 or later. Note that this version of Realm Studio has not - yet been released at the time of this release. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 1. - -### Internal - -* Upgraded realm-core from v10.7.2 to v11.0.3 - -10.8.0-beta.2 Release notes (2021-06-01) -============================================================= - -### Enhancements - -* Add `RLMDictionary`/`Map<>` datatype. This is a Dictionary collection type used for storing key-value pairs in a collection. - -### Compatibility - -* Realm Studio: 11.0.0-beta.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v11.0.0-beta.4 to v11.0.0-beta.6 - -10.8.0-beta.0 Release notes (2021-05-07) -============================================================= - -### Enhancements - -* Add `RLMSet`/`MutableSet<>` datatype. This is a Set collection type used for storing distinct values in a collection. -* Add support for `id`/`AnyRealmValue`. -* Add support for `UUID`/`NSUUID` data type. - -### Fixed - -* None. - -### Deprecations - -* `RealmOptional` has been deprecated in favor of `RealmProperty`. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.7.2 to v10.8.0-beta.5 - -10.7.7 Release notes (2021-06-10) -============================================================= - -Xcode 12.2 is now the minimum supported version. - -### Enhancements - -* Add Xcode 13 beta 1 binaries to the release package. - -### Fixed - -* Fix a runtime crash which happens in some Xcode version (Xcode < 12, reported - in Xcode 12.5), where SwiftUI is not weak linked by default. This fix only - works for Cocoapods projects. - ([#7234](https://github.com/realm/realm-swift/issues/7234) -* Fix warnings when building with Xcode 13 beta 1. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 1. - -10.7.6 Release notes (2021-05-13) -============================================================= - -### Enhancements - -* Realms opened in read-only mode can now be invalidated (although it is - unlikely to be useful to do so). - -### Fixed - -* Fix an availability warning when building Realm. The code path which gave the - warning can not currently be hit, so this did not cause any runtime problems - ([#7219](https://github.com/realm/realm-swift/issues/7219), since 10.7.3). -* Proactively check the expiry time on the access token and refresh it before - attempting to initiate a sync session. This prevents some error logs from - appearing on the client such as: "ERROR: Connection[1]: Websocket: Expected - HTTP response 101 Switching Protocols, but received: HTTP/1.1 401 - Unauthorized" ([RCORE-473](https://jira.mongodb.org/browse/RCORE-473), since v10.0.0) -* Fix a race condition which could result in a skipping notifications failing - to skip if several commits using notification skipping were made in - succession (since v5.0.0). -* Fix a crash on exit inside TableRecycler which could happen if Realms were - open on background threads when the app exited. - ([Core #4600](https://github.com/realm/realm-core/issues/4600), since v5.0.0) -* Fix errors related to "uncaught exception in notifier thread: - N5realm11KeyNotFoundE: No such object" which could happen on sycnronized - Realms if a linked object was deleted by another client. - ([JS #3611](https://github.com/realm/realm-js/issues/3611), since v10.0.0). -* Reading a link to an object which has been deleted by a different client via - a string-based interface (such as value(forKey:) or the subscript operator on - DynamicObject) could return an invalid object rather than nil. - ([Core #4687](https://github.com/realm/realm-core/pull/4687), since v10.0.0) -* Recreate the sync metadata Realm if the encryption key for it is missing from - the keychain rather than crashing. This can happen if a device is restored - from an unencrypted backup, which restores app data but not the app's - keychain entries, and results in all cached logics for sync users being - discarded but no data being lost. - [Core #4285](https://github.com/realm/realm-core/pull/4285) -* Thread-safe references can now be created for read-only Realms. - ([#5475](https://github.com/realm/realm-swift/issues/5475)). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.6.0 to v10.7.2 - -10.7.5 Release notes (2021-05-07) -============================================================= - -### Fixed - -* Iterating over frozen collections on multiple threads at the same time could - throw a "count underflow" NSInternalInconsistencyException. - ([#7237](https://github.com/realm/realm-swift/issues/7237), since v5.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. - -10.7.4 Release notes (2021-04-26) -============================================================= - -### Enhancements - -* Add Xcode 12.5 binaries to the release package. - -### Fixed - -* Add the Info.plist file to the XCFrameworks in the Carthage xcframwork - package ([#7216](https://github.com/realm/realm-swift/issues/7216), since 10.7.3). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. - -10.7.3 Release notes (2021-04-22) -============================================================= - -### Enhancements - -* Package a prebuilt XCFramework for Carthage. Carthage 0.38 and later will - download this instead of the old frameworks when using `--use-xcframeworks`. -* We now make a backup of the realm file prior to any file format upgrade. The - backup is retained for 3 months. Backups from before a file format upgrade - allows for better analysis of any upgrade failure. We also restore a backup, - if a) an attempt is made to open a realm file whith a "future" file format - and b) a backup file exist that fits the current file format. - ([Core #4166](https://github.com/realm/realm-core/pull/4166)) -* The error message when the intial steps of opening a Realm file fails is now - more descriptive. -* Make conversion of Decimal128 to/from string work for numbers with more than - 19 significant digits. This means that Decimal128's initializer which takes a - string will now never throw, as it previously threw only for out-of-bounds - values. The initializer is still marked as `throws` for - backwards compatibility. - ([#4548](https://github.com/realm/realm-core/issues/4548)) - -### Fixed - -* Adjust the header paths for the podspec to avoid accidentally finding a file - which isn't part of the pod that produced warnings when importing the - framework. ([#7113](https://github.com/realm/realm-swift/issues/7113), since 10.5.2). -* Fixed a crash that would occur when observing unmanaged Objects in multiple - views in SwiftUI. When using `@StateRealmObject` or `@ObservedObject` across - multiple views with an unmanaged object, each view would subscribe to the - object. As each view unsubscribed (generally when trailing back through the - view stack), our propertyWrappers would attempt to remove the KVOs for each - cancellation, when it should only be done once. We now correctly remove KVOs - only once. ([#7131](https://github.com/realm/realm-swift/issues/7131)) -* Fixed `isInvalidated` not returning correct value after object deletion from - Realm when using a custom schema. The object's Object Schema was not updated - when the object was added to the realm. We now correctly update the object - schema when adding it to the realm. - ([#7181](https://github.com/realm/realm-swift/issues/7181)) -* Syncing large Decimal128 values would cause "Assertion failed: cx.w[1] == 0" - ([Core #4519](https://github.com/realm/realm-core/issues/4519), since v10.0.0). -* Potential/unconfirmed fix for crashes associated with failure to memory map - (low on memory, low on virtual address space). For example - ([#4514](https://github.com/realm/realm-core/issues/4514), since v5.0.0). -* Fix assertion failures such as "!m_notifier_skip_version.version" or - "m_notifier_sg->get_version() + 1 == new_version.version" when performing - writes inside change notification callbacks. Previously refreshing the Realm - by beginning a write transaction would skip delivering notifications, leaving - things in an inconsistent state. Notifications are now delivered recursively - when needed instead. ([Cocoa #7165](https://github.com/realm/realm-swift/issues/7165)). -* Fix collection notification reporting for modifications. This could be - observed by receiving the wrong indices of modifications on sorted or - distinct results, or notification blocks sometimes not being called when only - modifications have occured. - ([#4573](https://github.com/realm/realm-core/pull/4573) since v5.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.5.5 to v10.6.0 -* Add additional debug validation to file map management that will hopefully - catch cases where we unmap something which is still in use. - -10.7.2 Release notes (2021-03-08) -============================================================= - -### Fixed - -* During integration of a large amount of data from the server, you may get - "Assertion failed: !fields.has_missing_parent_update()" - ([Core #4497](https://github.com/realm/realm-core/issues/4497), since v6.0.0) - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.5.4 to v10.5.5 - -10.7.1 Release notes (2021-03-05) -============================================================= - -### Fixed - -* Queries of the form "a.b.c == nil" would match objects where `b` is `nil` if - `c` did not have an index and did not if `c` was indexed. Both will now match - to align with NSPredicate's behavior. ([Core #4460]https://github.com/realm/realm-core/pull/4460), since 4.3.0). -* Restore support for upgrading files from file format 5 (Realm Cocoa 1.x). - ([Core #7089](https://github.com/realm/realm-swift/issues/7089), since v5.0.0) -* On 32bit devices you may get exception with "No such object" when upgrading - to v10.* ([Java #7314](https://github.com/realm/realm-java/issues/7314), since v5.0.0) -* The notification worker thread would rerun queries after every commit rather - than only commits which modified tables which could effect the query results - if the table had any outgoing links to tables not used in the query. - ([Core #4456](https://github.com/realm/realm-core/pull/4456), since v5.0.0). -* Fix "Invalid ref translation entry [16045690984833335023, 78187493520]" - assertion failure which could occur when using sync or multiple processes - writing to a single Realm file. - ([#7086](https://github.com/realm/realm-swift/issues/7086), since v5.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.5.3 to v10.5.4 - -10.7.0 Release notes (2021-02-23) -============================================================= - -### Enhancements - -* Add support for some missing query operations on data propertys: - - Data properties can be compared to other data properties - (e.g. "dataProperty1 == dataProperty2"). - - Case and diacritic-insensitive queries can be performed on data properties. - This will only have meaningful results if the data property contains UTF-8 - string data. - - Data properties on linked objects can be queried - (e.g. "link.dataProperty CONTAINS %@") -* Implement queries which filter on lists other than object links (lists of - objects were already supported). All supported operators for normal - properties are now supported for lists (e.g. "ANY intList = 5" or "ANY - stringList BEGINSWITH 'prefix'"), as well as aggregate operations on the - lists (such as "intArray.@sum > 100"). -* Performance of sorting on more than one property has been improved. - Especially important if many elements match on the first property. Mitigates - ([#7092](https://github.com/realm/realm-swift/issues/7092)) - -### Fixed - -* Fixed a bug that prevented an object type with incoming links from being - marked as embedded during migrations. ([Core #4414](https://github.com/realm/realm-core/pull/4414)) -* The Realm notification listener thread could sometimes hit the assertion - failure "!skip_version.version" if a write transaction was committed at a - very specific time (since v10.5.0). -* Added workaround for a case where upgrading an old file with illegal string - would crash ([#7111](https://github.com/realm/realm-swift/issues/7111)) -* Fixed a conflict resolution bug related to the ArrayMove instruction, which - could sometimes cause an "Invalid prior_size" exception to prevent - synchronization (since v10.5.0). -* Skipping a change notification in the first write transaction after the - observer was added could potentially fail to skip the notification (since v10.5.1). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.5.0 to v10.5.3 - -10.6.0 Release notes (2021-02-15) -============================================================= - -### Enhancements - -* Add `@StateRealmObject` for SwiftUI support. This property wrapper type instantiates an observable object on a View. - Use in place of `SwiftUI.StateObject` for Realm `Object`, `List`, and `EmbeddedObject` types. -* Add `@ObservedRealmObject` for SwiftUI support. This property wrapper type subscribes to an observable object - and invalidates a view whenever the observable object changes. Use in place of `SwiftUI.ObservedObject` for - Realm `Object`, `List`, or `EmbeddedObject` types. -* Add `@ObservedResults` for SwiftUI support. This property wrapper type retrieves results from a Realm. - The results use the realm configuration provided by the environment value `EnvironmentValues.realmConfiguration`. -* Add `EnvironmentValues.realm` and `EnvironmentValues.realmConfiguration` for `Realm` - and `Realm.Configuration` types respectively. Values can be injected into views using the `View.environment` method, e.g., `MyView().environment(\.realmConfiguration, Realm.Configuration(fileURL: URL(fileURLWithPath: "myRealmPath.realm")))`. - The value can then be declared on the example `MyView` as `@Environment(\.realm) var realm`. -* Add `SwiftUI.Binding` extensions where `Value` is of type `Object`, `List`, or `EmbeddedObject`. - These extensions expose methods for wrapped write transactions, to avoid boilerplate within - views, e.g., `TextField("name", $personObject.name)` or `$personList.append(Person())`. -* Add `Object.bind` and `EmbeddedObject.bind` for SwiftUI support. This allows you to create - bindings of realm properties when a propertyWrapper is not available for you to do so, e.g., `TextField("name", personObject.bind(\.name))`. -* The Sync client now logs error messages received from server rather than just - the size of the error message. -* Errors returned from the server when sync WebSockets get closed are now - captured and surfaced as a SyncError. -* Improve performance of sequential reads on a Results backed directly by a - Table (i.e. `realm.object(ClasSName.self)` with no filter/sort/etc.) by 50x. -* Orphaned embedded object types which are not linked to by any top-level types - are now better handled. Previously the server would reject the schema, - resulting in delayed and confusing error reporting. Explicitly including an - orphan in `objectTypes` is now immediately reported as an error when opening - the Realm, and orphans are automatically excluded from the auto-discovered - schema when `objectTypes` is not specified. - -### Fixed - -* Reading from a Results backed directly by a Table (i.e. - `realm.object(ClasSName.self)` with no filter/sort/etc.) would give incorrect - results if the Results was constructed and accessed before creating a new - object with a primary key less than the smallest primary key which previously - existed. ([#7014](https://github.com/realm/realm-swift/issues/7014), since v5.0.0). -* During synchronization you might experience crash with - "Assertion failed: ref + size <= next->first". - ([Core #4388](https://github.com/realm/realm-core/issues/4388)) - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.4.0 to v10.5.0 - -10.5.2 Release notes (2021-02-09) -============================================================= - -### Enhancements - -* Add support for "thawing" objects. `Realm`, `Results`, `List` and `Object` - now have `thaw()` methods which return a live copy of the frozen object. This - enables app behvaior where a frozen object can be made live again in order to - mutate values. For example, first freezing an object passed into UI view, - then thawing the object in the view to update values. -* Add Xcode 12.4 binaries to the release package. - -### Fixed - -* Inserting a date into a synced collection via `AnyBSON.datetime(...)` would - be of type `Timestamp` and not `Date`. This could break synced objects with a - `Date` property. - ([#6654](https://github.com/realm/realm-swift/issues/6654), since v10.0.0). -* Fixed an issue where creating an object after file format upgrade may fail - with assertion "Assertion failed: lo() <= std::numeric_limits::max()" - ([#4295](https://github.com/realm/realm-core/issues/4295), since v5.0.0) -* Allow enumerating objects in migrations with types which are no longer - present in the schema. -* Add `RLMResponse.customStatusCode`. This fixes timeout exceptions that were - occurring with a poor connection. ([#4188](https://github.com/realm/realm-core/issues/4188)) -* Limit availability of ObjectKeyIdentifiable to platforms which support - Combine to match the change made in the Xcode 12.5 SDK. - ([#7083](https://github.com/realm/realm-swift/issues/7083)) - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.3.3 to v10.4.0 - -10.5.1 Release notes (2021-01-15) -============================================================= - -### Enhancements - -* Add Xcode 12.3 binary to release package. -* Add support for queries which have nil on the left side and a keypath on the - right side (e.g. "nil == name" rather than "name == nil" as was previously - required). - -### Fixed -* Timeouts when calling server functions via App would sometimes crash rather - than report an error. -* Fix a race condition which would lead to "uncaught exception in notifier - thread: N5realm15InvalidTableRefE: transaction_ended" and a crash when the - source Realm was closed or invalidated at a very specific time during the - first run of a collection notifier - ([#3761](https://github.com/realm/realm-core/issues/3761), since v5.0.0). -* Deleting and recreating objects with embedded objects may fail. - ([Core PR #4240](https://github.com/realm/realm-core/pull/4240), since v10.0.0) -* Fast-enumerating a List after deleting the parent object would crash with an - assertion failure rather than a more appropriate exception. - ([Core #4114](https://github.com/realm/realm-core/issues/4114), since v5.0.0). -* Fix an issue where calling a MongoDB Realm Function would never be performed as the reference to the weak `User` was lost. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.3. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.3.2 to v10.3.3 - -10.5.0 Release notes (2020-12-14) -============================================================= - -### Enhancements - -* MongoDB Realm is now supported when installing Realm via Swift Package Manager. - -### Fixed - -* The user identifier was added to the file path for synchronized Realms twice - and an extra level of escaping was performed on the partition value. This did - not cause functional problems, but made file names more confusing than they - needed to be. Existing Realm files will continue to be located at the old - path, while newly created files will be created at a shorter path. (Since v10.0.0). -* Fix a race condition which could potentially allow queries on frozen Realms - to access an uninitialized structure for search indexes (since v5.0.0). -* Fix several data races in App and SyncSession initialization. These could - possibly have caused strange errors the first time a synchronized Realm was - opened (since v10.0.0). -* Fix a use of a dangling reference when refreshing a user’s custom data that - could lead to a crash (since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.1.4 to v10.3.2 - -10.4.0 Release notes (2020-12-10) -============================================================= - -### Enhancements - -* Add Combine support for App and User. These two types now have a - `objectWillChange` property that emits each time the state of the object has - changed (such as due to the user logging in or out). ([PR #6977](https://github.com/realm/realm-swift/pull/6977)). - -### Fixed - -* Integrating changesets from the server would sometimes hit the assertion - failure "n != realm::npos" inside Table::create_object_with_primary_key() - when creating an object with a primary key which previously had been used and - had incoming links. ([Core PR #4180](https://github.com/realm/realm-core/pull/4180), since v10.0.0). -* The arm64 simulator slices were not actually included in the XCFramework - release package. ([PR #6982](https://github.com/realm/realm-swift/pull/6982), since v10.2.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.1.3 to v10.1.4 -* Upgraded realm-sync from v10.1.4 to v10.1.5 - -10.3.0 Release notes (2020-12-08) -============================================================= - -### Enhancements - -* Add Google OpenID Connect Credentials, an alternative login credential to the - Google OAuth 2.0 credential. - -### Fixed - -* Fixed a bug that would prevent eventual consistency during conflict - resolution. Affected clients would experience data divergence and potentially - consistency errors as a result if they experienced conflict resolution - between cycles of Create-Erase-Create for objects with primary keys (since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-sync from v10.1.3 to v10.1.4 - -10.2.0 Release notes (2020-12-02) -============================================================= - -### Enhancements - -* The prebuilt binaries are now packaged as XCFrameworks. This adds support for - Catalyst and arm64 simulators when using them to install Realm, removes the - need for the strip-frameworks build step, and should simplify installation. -* The support functionality for using the Objective C API from Swift is now - included in Realm Swift and now includes all of the required wrappers for - MongoDB Realm types. In mixed Objective C/Swift projects, we recommend - continuing to use the Objective C types, but import both Realm and RealmSwift - in your Swift files. - -### Fixed - -* The user identifier was added to the file path for synchronized Realms twice - and an extra level of escaping was performed on the partition value. This did - not cause functional problems, but made file names more confusing than they - needed to be. Existing Realm files will continue to be located at the old - path, while newly created files will be created at a shorter path. (Since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -10.1.4 Release notes (2020-11-16) -============================================================= - -### Enhancements - -* Add arm64 slices to the macOS builds. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.0.1 to v10.1.3 -* Upgraded realm-sync from v10.0.1 to v10.1.3 - -10.1.3 Release notes (2020-11-13) -============================================================= - -### Enhancements - -* Add Xcode 12.2 binaries to the release package. - -### Fixed - -* Disallow setting - `RLMRealmConfiguration.deleteRealmIfMigrationNeeded`/`Realm.Config.deleteRealmIfMigrationNeeded` - when sync is enabled. This did not actually work as it does not delete the - relevant server state and broke in confusing ways ([PR #6931](https://github.com/realm/realm-swift/pull/6931)). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.1. -* CocoaPods: 1.10 or later. - -10.1.2 Release notes (2020-11-06) -============================================================= - -### Enhancements - -* Some error states which previously threw a misleading "NoSuchTable" exception - now throw a more descriptive exception. - -### Fixed - -* One of the Swift packages did not have the minimum deployment target set, - resulting in errors when archiving an app which imported Realm via SPM. -* Reenable filelock emulation on watchOS so that the OS does not kill the app - when it is suspended while a Realm is open on watchOS 7 ([#6861](https://github.com/realm/realm-swift/issues/6861), since v5.4.8 -* Fix crash in case insensitive query on indexed string columns when nothing - matches ([#6836](https://github.com/realm/realm-swift/issues/6836), since v5.0.0). -* Null values in a `List` or `List` were incorrectly treated - as non-null in some places. It is unknown if this caused any functional - problems when using the public API. ([Core PR #3987](https://github.com/realm/realm-core/pull/3987), since v5.0.0). -* Deleting an entry in a list in two different clients could end deleting the - wrong entry in one client when the changes are merged (since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.1. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.0.0 to v10.1.1 -* Upgraded realm-sync from v10.0.0 to v10.1.1 - -10.1.1 Release notes (2020-10-27) -============================================================= - -### Enhancements - -* Set the minimum CocoaPods version in the podspec so that trying to install - with older versions gives a more useful error ([PR #6892](https://github.com/realm/realm-swift/pull/6892)). - -### Fixed - -* Embedded objects could not be marked as `ObjectKeyIdentifable` - ([PR #6890](https://github.com/realm/realm-swift/pull/6890), since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.1. -* CocoaPods: 1.10 or later. - -10.1.0 Release notes (2020-10-22) -============================================================= - -CocoaPods 1.10 or later is now required to install Realm. - -### Enhancements - -* Throw an exception for Objects that have none of its properties marked with @objc. -* Mac Catalyst and arm64 simulators are now supported when integrating via Cocoapods. -* Add Xcode 12.1 binaries to the release package. -* Add Combine support for `Realm.asyncOpen()`. - -### Fixed - -* Implement precise and unbatched notification of sync completion events. This - avoids a race condition where an earlier upload completion event will notify - a later waiter whose changes haven't been uploaded yet. - ([#1118](https://github.com/realm/realm-object-store/pull/1118)). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.1. - -10.0.0 Release notes (2020-10-16) -============================================================= - -This release is functionally identical to v10.0.0-rc.2. - -NOTE: This version upgrades the Realm file format version to add support for -new data types. Realm files opened will be automatically upgraded and cannot be -read by versions older than v10.0.0. - -### Breaking Changes - -* Rename Realm.Publishers to RealmPublishers to avoid confusion with Combine.Publishers. -* Remove `[RLMSyncManager shared]`. This is now instatiated as a property on App/RLMApp. -* `RLMSyncManager.pinnedCertificatePaths` has been removed. -* Classes `RLMUserAccountInfo` & `RLMUserInfo` (swift: `UserInfo`, `UserAccountInfo`) have been removed. -* `RLMSyncUser`/`SyncUser` has been renamed to `RLMUser`/`User`. -* We no longer support Realm Cloud (legacy), but instead the new "MongoDB - Realm" Cloud. MongoDB Realm is a serverless platform that enables developers - to quickly build applications without having to set up server infrastructure. - MongoDB Realm is built on top of MongoDB Atlas, automatically integrating the - connection to your database. -* Remove support for Query-based sync, including the configuration parameters - and the `RLMSyncSubscription` and `SyncSubscription` types ([#6437](https://github.com/realm/realm-swift/pull/6437)). -* Remove everything related to sync permissions, including both the path-based - permission system and the object-level privileges for query-based sync. - Permissions are now configured via MongoDB Atlas. - ([#6445](https://github.com/realm/realm-swift/pulls/6445)) -* Remove support for Realm Object Server. -* Non-embedded objects in synchronized Realms must always have a primary key - named "_id". -* All Swift callbacks for asynchronous operations which can fail are now passed - a `Result` parameter instead of two separate `Value?` and - `Error?` parameters. - -### Enhancements - -* Add support for next generation sync. Support for syncing to MongoDB instead - of Realm Object Server. Applications must be created at realm.mongodb.com -* The memory mapping scheme for Realm files has changed to better support - opening very large files. -* Add support for the ObjectId data type. This is an automatically-generated - unique identifier similar to a GUID or a UUID. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for the Decimal128 data type. This is a 128-bit IEEE 754 decimal - floating point number similar to NSDecimalNumber. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for embedded objects. Embedded objects are objects which are - owned by a single parent object, and are deleted when that parent object is - deleted. They are defined by subclassing `EmbeddedObject` / - `RLMEmbeddedObject` rather than `Object` / `RLMObject`. -* Add `-[RLMUser customData]`/`User.customData`. Custom data is - configured in your MongoDB Realm App. -* Add `-[RLMUser callFunctionNamed:arguments:completion:]`/`User.functions`. - This is the entry point for calling Remote MongoDB Realm functions. Functions - allow you to define and execute server-side logic for your application. - Functions are written in modern JavaScript (ES6+) and execute in a serverless - manner. When you call a function, you can dynamically access components of - the current application as well as information about the request to execute - the function and the logged in user that sent the request. -* Add `-[RLMUser mongoClientWithServiceName:]`/`User.mongoClient`. This is - the entry point for calling your Remote MongoDB Service. The read operations - are `-[RLMMongoCollection findWhere:completion:]`, `-[RLMMongoCollection - countWhere:completion:]`and `-[RLMMongoCollection - aggregateWithPipeline:completion:]`. The write operations are - `-[RLMMongoCollection insertOneDocument:completion:]`, `-[RLMMongoCollection - insertManyDocuments:completion:]`, `-[RLMMongoCollection - updateOneDocument:completion:]`, `-[RLMMongoCollection - updateManyDocuments:completion:]`, `-[RLMMongoCollection - deleteOneDocument:completion:]`, and `-[RLMMongoCollection - deleteManyDocuments:completion:]`. If you are already familiar with MongoDB - drivers, it is important to understand that the remote MongoCollection only - provides access to the operations available in MongoDB Realm. -* Obtaining a Realm configuration from a user is now done with `[RLMUser - configurationWithPartitionValue:]`/`User.configuration(partitionValue:)`. - Partition values can currently be of types `String`, `Int`, or `ObjectId`, - and fill a similar role to Realm URLs did with Realm Cloud. The main - difference is that partitions are meant to be more closely associated with - your data. For example, if you are running a `Dog` kennel, and have a field - `breed` that acts as your partition key, you could open up realms based on - the breed of the dogs. -* Add ability to stream change events on a remote MongoDB collection with - `[RLMMongoCollection watch:delegate:delegateQueue:]`, - `MongoCollection.watch(delegate:)`. When calling `watch(delegate:)` you will be - given a `RLMChangeStream` (`ChangeStream`) which can be used to end watching - by calling `close()`. Change events can also be streamed using the - `MongoCollection.watch` Combine publisher that will stream change events each - time the remote MongoDB collection is updated. -* Add the ability to listen for when a Watch Change Stream is opened when using - Combine. Use `onOpen(event:)` directly after opening a `WatchPublisher` to - register a callback to be invoked once the change stream is opened. -* Objects with integer primary keys no longer require a separate index for the -* primary key column, improving insert performance and slightly reducing file - size. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* Carthage release for Swift is built with Xcode 12 - -### Internal - -* Upgraded realm-core from v6.1.4 to v10.0.0 -* Upgraded realm-sync from v5.0.29 to v10.0.0 - -10.0.0-rc.2 Release notes (2020-10-15) -============================================================= - -### Enhancements - -* Add the ability to listen for when a Watch Change Stream is opened when using - Combine. Use `onOpen(event:)` directly after opening a `WatchPublisher` to - register a callback to be invoked once the change stream is opened. - -### Breaking Changes - -* The insert operations on Mongo collections now report the inserted documents' - IDs as BSON rather than ObjectId. -* Embedded objects can no longer form cycles at the schema level. For example, - type A can no longer have an object property of type A, or an object property - of type B if type B links to type A. This was always rejected by the server, - but previously was allowed in non-synchronized Realms. -* Primary key properties are once again marked as being indexed. This reflects - an internal change to how primary keys are handled that should not have any - other visible effects. -* Change paired return types from Swift completion handlers to return `Result`. -* Adjust how RealmSwift.Object is defined to add support for Swift Library - Evolution mode. This should normally not have any effect, but you may need to - add `override` to initializers of object subclasses. -* Add `.null` type to AnyBSON. This creates a distinction between null values - and properly absent BSON types. - -### Fixed - -* Set the precision correctly when serializing doubles in extended json. -* Reading the `objectTypes` array from a Realm Configuration would not include - the embedded object types which were set in the array. -* Reject loops in embedded objects as part of local schema validation rather - than as a server error. -* Although MongoClient is obtained from a User, it was actually using the - User's App's current user rather than the User it was obtained from to make - requests. - - -This release also contains the following changes from 5.4.7 - 5.5.0 - -### Enhancements - -* Add the ability to capture a NotificationToken when using a Combine publisher - that observes a Realm Object or Collection. The user will call - `saveToken(on:at:)` directly after invoking the publisher to use the feature. - -### Fixed - -* When using `Realm.write(withoutNotifying:)` there was a chance that the - supplied observation blocks would not be skipped when in a write transaction. - ([Object Store #1103](https://github.com/realm/realm-object-store/pull/1103)) -* Comparing two identical unmanaged `List<>`/`RLMArray` objects would fail. - ([#5665](https://github.com/realm/realm-swift/issues/5665)). -* Case-insensitive equality queries on indexed string properties failed to - clear some internal state when rerunning the query. This could manifest as - duplicate results or "key not found" errors. - ([#6830](https://github.com/realm/realm-swift/issues/6830), [#6694](https://github.com/realm/realm-swift/issues/6694), since 5.0.0). -* Equality queries on indexed string properties would sometimes throw "key not - found" exceptions if the hash of the string happened to have bit 62 set. - ([.NET #2025](https://github.com/realm/realm-dotnet/issues/2025), since v5.0.0). -* Queries comparing non-optional int properties to nil would behave as if they - were comparing against zero instead (since v5.0.0). - -### Compatibility - -* File format: Generates Realms with format v12 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v10.0.0-beta.9 to v10.0.0 -* Upgraded realm-sync from v10.0.0-beta.14 to v10.0.0 - -10.0.0-rc.1 Release notes (2020-10-01) -============================================================= - -### Breaking Changes - -* Change the following methods on RLMUser to properties: - - `[RLMUser emailPasswordAuth]` => `RLMUser.emailPasswordAuth` - - `[RLMUser identities]` => `RLMUser.identities` - - `[RLMUser allSessions]` => `RLMUser.allSessions` - - `[RLMUser apiKeysAuth]` => `RLMUser.apiKeysAuth` -* Other changes to RLMUser: - - `nullable` has been removed from `RLMUser.identifier` - - `nullable` has been removed from `RLMUser.customData` -* Change the following methods on RLMApp to properties: - - `[RLMApp allUsers]` => `RLMApp.allUsers` - - `[RLMApp currentUser]` => `RLMApp.currentUser` - - `[RLMApp emailPasswordAuth]` => `RLMApp.emailPasswordAuth` -* Define `RealmSwift.Credentials` as an enum instead of a `typealias`. Example - usage has changed from `Credentials(googleAuthCode: "token")` to - `Credentials.google(serverAuthCode: "serverAuthCode")`, and - `Credentials(facebookToken: "token")` to `Credentials.facebook(accessToken: "accessToken")`, etc. -* Remove error parameter and redefine payload in - `+ (instancetype)credentialsWithFunctionPayload:(NSDictionary *)payload error:(NSError **)error;`. - It is now defined as `+ (instancetype)credentialsWithFunctionPayload:(NSDictionary> *)payload;` - -### Compatibility - -* File format: Generates Realms with format v12 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12. - -10.0.0-beta.6 Release notes (2020-09-30) -============================================================= - -### Breaking Changes - -* Change Google Credential parameter names to better reflect the required auth code: - - `Credentials(googleToken:)` => `Credentials(googleAuthCode:)` - - `[RLMCredentials credentialsWithGoogleToken:]` => `[RLMCredentials credentialsWithGoogleAuthCode:]` -* Rename Realm.Publishers to RealmPublishers to avoid confusion with Combine.Publishers - -### Fixed - -* Deleting objects could sometimes change the ObjectId remaining objects from - null to ObjectId("deaddeaddeaddeaddeaddead") when there are more than 1000 - objects. (Since v10.0.0-alpha.1) -* Fixed an assertion failure when adding an index to a nullable ObjectId - property that contains nulls. (since v10.0.0-alpha.1). - -This release also contains the following changes from 5.4.0 - 5.4.6: - -### Enhancements - -* Add prebuilt binary for Xcode 11.7 to the release package. -* Add prebuilt binary for Xcode 12 to the release package. -* Improve the asymtotic performance of NOT IN queries on indexed properties. It - is now O(Number of Rows) rather than O(Number of Rows \* Number of values in IN clause.) -* Slightly (<5%) improve the performance of most operations which involve - reading from a Realm file. - -### Fixed - -* Upgrading pre-5.x files with string primary keys would result in a file where - `realm.object(ofType:forPrimaryKey:)` would fail to find the object. - ([#6716](https://github.com/realm/realm-swift/issues/6716), since 5.2.0) -* A write transaction which modifies an object with more than 16 managed - properties and causes the Realm file to grow larger than 2 GB could cause an - assertion failure mentioning "m_has_refs". ([JS #3194](https://github.com/realm/realm-js/issues/3194), since 5.0.0). -* Objects with more than 32 properties could corrupt the Realm file and result - in a variety of crashes. ([Java #7057](https://github.com/realm/realm-java/issues/7057), since 5.0.0). -* Fix deadlocks when opening a Realm file in both the iOS simulator and Realm - Studio ([#6743](https://github.com/realm/realm-swift/issues/6743), since 5.3.6). -* Fix Springboard deadlocking when an app is unsuspended while it has an open - Realm file which is stored in an app group on iOS 10-12 - ([#6749](https://github.com/realm/realm-swift/issues/6749), since 5.3.6). -* If you use encryption your application cound crash with a message like - "Opening Realm files of format version 0 is not supported by this version of - Realm". ([#6889](https://github.com/realm/realm-java/issues/6889) among others, since 5.0.0) -* Confining a Realm to a serial queue would throw an error claiming that the - queue was not a serial queue on iOS versions older than 12. - ([#6735](https://github.com/realm/realm-swift/issues/6735), since 5.0.0). -* Results would sometimes give stale results inside a write transaction if a - write which should have updated the Results was made before the first access - of a pre-existing Results object. - ([#6721](https://github.com/realm/realm-swift/issues/6721), since 5.0.0) -* Fix Archiving the Realm and RealmSwift frameworks with Xcode 12. - ([#6774](https://github.com/realm/realm-swift/issues/6774)) -* Fix compilation via Carthage when using Xcode 12 ([#6717](https://github.com/realm/realm-swift/issues/6717)). -* Fix a crash inside `realm::Array(Type)::init_from_mem()` which would - sometimes occur when running a query over links immediately after creating - objects of the queried type. - ([#6789](https://github.com/realm/realm-swift/issues/6789) and possibly others, since 5.0.0). -* Possibly fix problems when changing the type of the primary key of an object - from optional to non-optional. -* Rerunning a equality query on an indexed string property would give incorrect - results if a previous run of the query matched multiple objects and it now - matches one object. This could manifest as either finding a non-matching - object or a "key not found" exception being thrown. - ([#6536](https://github.com/realm/realm-swift/issues/6536), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v12 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v10.0.0-beta.7 to v10.0.0-beta.9 -* Upgraded realm-sync from v10.0.0-beta.11 to v10.0.0-beta.14 - -10.0.0-beta.5 Release notes (2020-09-15) -============================================================= - -### Enhancements - -* Add `User.loggedIn`. -* Add support for multiple Realm Apps. -* Remove `[RLMSyncManager shared]`. This is now instatiated as a property on - the app itself. -* Add Combine support for: - * PushClient - * APIKeyAuth - * User - * MongoCollection - * EmailPasswordAuth - * App.login - -### Fixed - -* Fix `MongoCollection.watch` to consistently deliver events on a given queue. -* Fix `[RLMUser logOutWithCompletion]` and `User.logOut` to now log out the - correct user. -* Fix crash on startup on iOS versions older than 13 (since v10.0.0-beta.3). - -### Breaking Changes - -* `RLMSyncManager.pinnedCertificatePaths` has been removed. -* Classes `RLMUserAccountInfo` & `RLMUserInfo` (swift: `UserInfo`, - `UserAccountInfo`) have been removed. -* The following functionality has been renamed to align Cocoa with the other - Realm SDKs: - -| Old API | New API | -|:-------------------------------------------------------------|:---------------------------------------------------------------| -| `RLMUser.identity` | `RLMUser.identifier` | -| `User.identity` | `User.id` | -| `-[RLMCredentials credentialsWithUsername:password:]` | `-[RLMCredentials credentialsWithEmail:password:]` | -| `Credentials(username:password:)` | `Credentials(email:password:)` | -| -`[RLMUser apiKeyAuth]` | `-[RLMUser apiKeysAuth]` | -| `User.apiKeyAuth()` | `User.apiKeysAuth()` | -| `-[RLMEmailPasswordAuth registerEmail:password:completion:]` | `-[RLMEmailPasswordAuth registerUserWithEmail:password:completion:]` | -| `App.emailPasswordAuth().registerEmail(email:password:)` | `App.emailPasswordAuth().registerUser(email:password:)` | - -### Compatibility - -* File format: Generates Realms with format v12 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v10.0.0-beta.6 to v10.0.0-beta.7 -* Upgraded realm-sync from v10.0.0-beta.10 to v10.0.0-beta.11 - -10.0.0-beta.4 Release notes (2020-08-28) -============================================================= - -### Enhancements - -* Add support for the 64-bit watchOS simulator added in Xcode 12. -* Add ability to stream change events on a remote MongoDB collection with - `[RLMMongoCollection watch:delegate:delegateQueue]`, - `MongoCollection.watch(delegate)`. When calling `watch(delegate)` you will be - given a `RLMChangeStream` (`ChangeStream`), this will be used to invalidate - and stop the streaming session by calling `[RLMChangeStream close]` - (`ChangeStream.close()`) when needed. -* Add `MongoCollection.watch`, which is a Combine publisher that will stream - change events each time the remote MongoDB collection is updated. -* Add ability to open a synced Realm with a `nil` partition value. - -### Fixed - -* Realm.Configuration.objectTypes now accepts embedded objects -* Ports fixes from 5.3.5 - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the v10.0.0-beta.x series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v10.0.0-beta.1 to v10.0.0-beta.6 -* Upgraded realm-sync from v10.0.0-beta.2 to v10.0.0-beta.10 - -10.0.0-beta.3 Release notes (2020-08-17) -============================================================= - -This release also contains all changes from 5.3.2. - -### Breaking Changes -* The following classes & aliases have been renamed to align Cocoa with the other Realm SDKs: - -| Old API | New API | -|:------------------------------------------------------------|:---------------------------------------------------------------| -| `RLMSyncUser` | `RLMUser` | -| `SyncUser` | `User` | -| `RLMAppCredential` | `RLMCredential` | -| `AppCredential` | `Credential` | -| `RealmApp` | `App` | -| `RLMUserAPIKeyProviderClient` | `RLMAPIKeyAuth` | -| `RLMUsernamePasswordProviderClient` | `RLMEmailPasswordAuth` | -| `UsernamePasswordProviderClient` | `EmailPasswordAuth` | -| `UserAPIKeyProviderClient` | `APIKeyAuth` | - -* The following functionality has also moved to the User - -| Old API | New API | -|:-------------------------------------------------------------|:--------------------------------------------------------------| -| `[RLMApp callFunctionNamed:]` | `[RLMUser callFunctionNamed:]` | -| `App.functions` | `User.functions` | -| `[RLMApp mongoClientWithServiceName:]` | `[RLMUser mongoClientWithServiceName:]` | -| `App.mongoClient(serviceName)` | `User.mongoClient(serviceName)` | -| `[RLMApp userAPIKeyProviderClient]` | `[RLMUser apiKeyAuth]` | -| `App.userAPIKeyProviderClient` | `App.apiKeyAuth()` | -| `[RLMApp logOut:]` | `[RLMUser logOut]` | -| `App.logOut(user)` | `User.logOut()` | -| `[RLMApp removeUser:]` | `[RLMUser remove]` | -| `App.remove(user)` | `User.remove()` | -| `[RLMApp linkUser:credentials:]` | `[RLMUser linkWithCredentials:]` | -| `App.linkUser(user, credentials)` | `User.link(credentials)` | - -* `refreshCustomData()` on User now returns void and passes the custom data to the callback on success. - -### Compatibility -* This release introduces breaking changes w.r.t some sync classes and MongoDB Realm Cloud functionality. -(See the breaking changes section for the full list) -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* Carthage release for Swift is built with Xcode 11.5. - -10.0.0-beta.2 Release notes (2020-06-09) -============================================================= -Xcode 11.3 and iOS 9 are now the minimum supported versions. - -### Enhancements -* Add support for building with Xcode 12 beta 1. watchOS currently requires - removing x86_64 from the supported architectures. Support for the new 64-bit - watch simulator will come in a future release. - -### Fixed -* Opening a SyncSession with LOCAL app deployments would not use the correct endpoints. -* Linking from embedded objects to top-level objects was incorrectly disallowed. -* Opening a Realm file in file format v6 (created by Realm Cocoa versions - between 2.4 and 2.10) would crash. (Since 5.0.0, [Core #3764](https://github.com/realm/realm-core/issues/3764)). -* Upgrading v9 (pre-5.0) Realm files would create a redundant search index for - primary key properties. This index would then be removed the next time the - Realm was opened, resulting in some extra i/o in the upgrade process. - (Since 5.0.0, [Core #3787](https://github.com/realm/realm-core/issues/3787)). -* Fixed a performance issue with upgrading v9 files with search indexes on - non-primary-key properties. (Since 5.0.0, [Core #3767](https://github.com/realm/realm-core/issues/3767)). - -### Compatibility -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 - -10.0.0-beta.1 Release notes (2020-06-08) -============================================================= - -NOTE: This version bumps the Realm file format to version 11. It is not -possible to downgrade to earlier versions. Older files will automatically be -upgraded to the new file format. Only [Realm Studio -10.0.0](https://github.com/realm/realm-studio/releases/tag/v10.0.0-beta.1) or -later will be able to open the new file format. - -### Enhancements - -* Add support for next generation sync. Support for syncing to MongoDB instead - of Realm Object Server. Applications must be created at realm.mongodb.com -* The memory mapping scheme for Realm files has changed to better support - opening very large files. -* Add support for the ObjectId data type. This is an automatically-generated - unique identifier similar to a GUID or a UUID. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for the Decimal128 data type. This is a 128-bit IEEE 754 decimal - floating point number similar to NSDecimalNumber. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for embedded objects. Embedded objects are objects which are - owned by a single parent object, and are deleted when that parent object is - deleted. They are defined by subclassing `EmbeddedObject` / - `RLMEmbeddedObject` rather than `Object` / `RLMObject`. -* Add `-[RLMSyncUser customData]`/`SyncUser.customData`. Custom data is - configured in your MongoDB Realm App. -* Add `-[RLMApp callFunctionNamed:arguments]`/`RealmApp.functions`. This is the - entry point for calling Remote MongoDB Realm functions. Functions allow you - to define and execute server-side logic for your application. Functions are - written in modern JavaScript (ES6+) and execute in a serverless manner. When - you call a function, you can dynamically access components of the current - application as well as information about the request to execute the function - and the logged in user that sent the request. -* Add `-[RLMApp mongoClientWithServiceName]`/`RealmApp.mongoClient`. This is - the entry point for calling your Remote MongoDB Service. The read operations - are `-[RLMMongoCollection findWhere:completion:]`, `-[RLMMongoCollection - countWhere:completion:]`and `-[RLMMongoCollection - aggregateWithPipeline:completion:]`. The write operations are - `-[RLMMongoCollection insertOneDocument:completion:]`, `-[RLMMongoCollection - insertManyDocuments:completion:]`, `-[RLMMongoCollection - updateOneDocument:completion:]`, `-[RLMMongoCollection - updateManyDocuments:completion:]`, `-[RLMMongoCollection - deleteOneDocument:completion:]`, and `-[RLMMongoCollection - deleteManyDocuments:completion:]`. If you are already familiar with MongoDB - drivers, it is important to understand that the remote MongoCollection only - provides access to the operations available in MongoDB Realm. -* Change `[RLMSyncUser - configurationWithPartitionValue:]`/`SyncUser.configuration(with:)` to accept - all BSON types. Partition values can currently be of types `String`, `Int`, - or `ObjectId`. Opening a realm by partition value is the equivalent of - previously opening a realm by URL. In this case, partitions are meant to be - more closely associated with your data. E.g., if you are running a `Dog` - kennel, and have a field `breed` that acts as your partition key, you could - open up realms based on the breed of the dogs. - -### Breaking Changes - -* We no longer support Realm Cloud (legacy), but instead the new "MongoDB - Realm" Cloud. MongoDB Realm is a serverless platform that enables developers - to quickly build applications without having to set up server infrastructure. - MongoDB Realm is built on top of MongoDB Atlas, automatically integrating the - connection to your database. -* Remove support for Query-based sync, including the configuration parameters - and the `RLMSyncSubscription` and `SyncSubscription` types ([#6437](https://github.com/realm/realm-swift/pull/6437)). -* Primary key properties are no longer marked as being indexed. This reflects - an internal change to how primary keys are handled that should not have any - other visible effects. ([#6440](https://github.com/realm/realm-swift/pull/6440)). -* Remove everything related to sync permissions, including both the path-based - permission system and the object-level privileges for query-based sync. ([#6445](https://github.com/realm/realm-swift/pulls/6445)) -* Primary key uniqueness is now enforced when creating new objects during - migrations, rather than only at the end of migrations. Previously new objects - could be created with duplicate primary keys during a migration as long as - the property was changed to a unique value before the end of the migration, - but now a unique value must be supplied when creating the object. -* Remove support for Realm Object Server. - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 - -5.5.0 Release notes (2020-10-12) -============================================================= - -### Enhancements - -* Add the ability to capture a NotificationToken when using a Combine publisher - that observes a Realm Object or Collection. The user will call - `saveToken(on:at:)` directly after invoking the publisher to use the feature. - -### Fixed - -* When using `Realm.write(withoutNotifying:)` there was a chance that the - supplied observation blocks would not be skipped when in a write transaction. - ([Object Store #1103](https://github.com/realm/realm-object-store/pull/1103)) -* Comparing two identical unmanaged `List<>`/`RLMArray` objects would fail. - ([#5665](https://github.com/realm/realm-swift/issues/5665)). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -5.4.8 Release notes (2020-10-05) -============================================================= - -### Fixed - -* Case-insensitive equality queries on indexed string properties failed to - clear some internal state when rerunning the query. This could manifest as - duplicate results or "key not found" errors. - ([#6830](https://github.com/realm/realm-swift/issues/6830), [#6694](https://github.com/realm/realm-swift/issues/6694), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v6.1.3 to v6.1.4 -* Upgraded realm-sync from v5.0.28 to v5.0.29 - -5.4.7 Release notes (2020-09-30) -============================================================= - -### Fixed - -* Equality queries on indexed string properties would sometimes throw "key not - found" exceptions if the hash of the string happened to have bit 62 set. - ([.NET #2025](https://github.com/realm/realm-dotnet/issues/2025), since v5.0.0). -* Queries comparing non-optional int properties to nil would behave as if they - were comparing against zero instead (since v5.0.0). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v6.1.2 to v6.1.3 -* Upgraded realm-sync from v5.0.27 to v5.0.28 - -5.4.6 Release notes (2020-09-29) -============================================================= - -5.4.5 failed to actually update the core version for installation methods other -than SPM. All changes listed there actually happened in this version for -non-SPM installation methods. - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-sync from v5.0.26 to v5.0.27 - -5.4.5 Release notes (2020-09-28) -============================================================= - -### Enhancements - -* Slightly (<5%) improve the performance of most operations which involve - reading from a Realm file. - -### Fixed - -* Rerunning a equality query on an indexed string property would give incorrect - results if a previous run of the query matched multiple objects and it now - matches one object. This could manifest as either finding a non-matching - object or a "key not found" exception being thrown. - ([#6536](https://github.com/realm/realm-swift/issues/6536), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v6.1.1 to v6.1.2 -* Upgraded realm-sync from v5.0.25 to v5.0.26 - -5.4.4 Release notes (2020-09-25) -============================================================= - -### Enhancements -* Improve the asymtotic performance of NOT IN queries on indexed properties. It - is now O(Number of Rows) rather than O(Number of Rows \* Number of values in IN clause.) - -### Fixed - -* Fix a crash inside `realm::Array(Type)::init_from_mem()` which would - sometimes occur when running a query over links immediately after creating - objects of the queried type. - ([#6789](https://github.com/realm/realm-swift/issues/6789) and possibly others, since 5.0.0). -* Possibly fix problems when changing the type of the primary key of an object - from optional to non-optional. - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v6.0.26 to v6.1.1 -* Upgraded realm-sync from v5.0.23 to v5.0.25 - -5.4.3 Release notes (2020-09-21) -============================================================= - -### Fixed - -* Fix compilation via Carthage when using Xcode 12 ([#6717](https://github.com/realm/realm-swift/issues/6717)). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.12 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -5.4.2 Release notes (2020-09-17) -============================================================= - -### Enhancements - -* Add prebuilt binary for Xcode 12 to the release package. - -### Fixed - -* Fix Archiving the Realm and RealmSwift frameworks with Xcode 12. - ([#6774](https://github.com/realm/realm-swift/issues/6774)) - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.12 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -5.4.1 Release notes (2020-09-16) -============================================================= - -### Enhancements - -* Add prebuilt binary for Xcode 11.7 to the release package. - -### Fixed - -* Fix deadlocks when opening a Realm file in both the iOS simulator and Realm - Studio ([#6743](https://github.com/realm/realm-swift/issues/6743), since 5.3.6). -* Fix Springboard deadlocking when an app is unsuspended while it has an open - Realm file which is stored in an app group on iOS 10-12 - ([#6749](https://github.com/realm/realm-swift/issues/6749), since 5.3.6). -* If you use encryption your application cound crash with a message like - "Opening Realm files of format version 0 is not supported by this version of - Realm". ([#6889](https://github.com/realm/realm-java/issues/6889) among others, since 5.0.0) -* Confining a Realm to a serial queue would throw an error claiming that the - queue was not a serial queue on iOS versions older than 12. - ([#6735](https://github.com/realm/realm-swift/issues/6735), since 5.0.0). -* Results would sometimes give stale results inside a write transaction if a - write which should have updated the Results was made before the first access - of a pre-existing Results object. - ([#6721](https://github.com/realm/realm-swift/issues/6721), since 5.0.0) - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.12 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.7. - -### Internal - -* Upgraded realm-core from v6.0.25 to v6.0.26 -* Upgraded realm-sync from v5.0.22 to v5.0.23 - -5.4.0 Release notes (2020-09-09) -============================================================= - -This version bumps the Realm file format version. This means that older -versions of Realm will be unable to open Realm files written by this version, -and a new version of Realm Studio will be required. There are no actual format -changes and the version bump is just to force a re-migration of incorrectly -upgraded Realms. - -### Fixed - -* Upgrading pre-5.x files with string primary keys would result in a file where - `realm.object(ofType:forPrimaryKey:)` would fail to find the object. - ([#6716](https://github.com/realm/realm-swift/issues/6716), since 5.2.0) -* A write transaction which modifies an object with more than 16 managed - properties and causes the Realm file to grow larger than 2 GB could cause an - assertion failure mentioning "m_has_refs". ([JS #3194](https://github.com/realm/realm-js/issues/3194), since 5.0.0). -* Objects with more than 32 properties could corrupt the Realm file and result - in a variety of crashes. ([Java #7057](https://github.com/realm/realm-java/issues/7057), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.12 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.23 to v6.0.25 -* Upgraded realm-sync from v5.0.20 to v5.0.22 - -5.3.6 Release notes (2020-09-02) -============================================================= - -### Fixed - -* Work around iOS 14 no longer allowing the use of file locks in shared - containers, which resulted in the OS killing an app which entered the - background while a Realm was open ([#6671](https://github.com/realm/realm-swift/issues/6671)). -* If an attempt to upgrade a realm has ended with a crash with "migrate_links()" - in the call stack, the realm was left in an invalid state. The migration - logic now handles this state and can complete upgrading files which were - incompletely upgraded by pre-5.3.4 versions. -* Fix deadlocks when writing to a Realm file on an exFAT partition from macOS. - ([#6691](https://github.com/realm/realm-swift/issues/6691)). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.19 to v6.0.23 -* Upgraded realm-sync from v5.0.16 to v5.0.20 - -5.3.5 Release notes (2020-08-20) -============================================================= - -### Fixed - -* Opening Realms on background threads could produce spurious Incorrect Thread - exceptions when a cached Realm existed for a previously existing thread with - the same thread ID as the current thread. - ([#6659](https://github.com/realm/realm-swift/issues/6659), - [#6689](https://github.com/realm/realm-swift/issues/6689), - [#6712](https://github.com/realm/realm-swift/issues/6712), since 5.0.0). -* Upgrading a table with incoming links but no properties would crash. This was - probably not possible to hit in practice as we reject object types with no - properties. -* Upgrading a non-nullable List which nonetheless contained null values would - crash. This was possible due to missing error-checking in some older versions - of Realm. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.18 to v6.0.19 -* Upgraded realm-sync from v5.0.15 to v5.0.16 - -5.3.4 Release notes (2020-08-17) -============================================================= - -### Fixed - -* Accessing a Realm after calling `deleteAll()` would sometimes throw an - exception with the reason 'ConstIterator copy failed'. ([#6597](https://github.com/realm/realm-swift/issues/6597), since 5.0.0). -* Fix an assertion failure inside the `migrate_links()` function when upgrading - a pre-5.0 Realm file. -* Fix a bug in memory mapping management. This bug could result in multiple - different asserts as well as segfaults. In many cases stack backtraces would - include members of the EncyptedFileMapping near the top - even if encryption - was not used at all. In other cases asserts or crashes would be in methods - reading an array header or array element. In all cases the application would - terminate immediately. ([Core #3838](https://github.com/realm/realm-core/pull/3838), since v5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.14 to v6.0.18 -* Upgraded realm-sync from v5.0.14 to v5.0.15 - -5.3.3 Release notes (2020-07-30) -============================================================= - -### Enhancements - -* Add support for the x86_64 watchOS simulator added in Xcode 12. - -### Fixed - -* (RLM)Results objects would incorrectly pin old read transaction versions - until they were accessed after a Realm was refreshed, resulting in the Realm - file growing to large sizes if a Results was retained but not accessed after - every write. ([#6677](https://github.com/realm/realm-swift/issues/6677), since 5.0.0). -* Fix linker errors when using SwiftUI previews with Xcode 12 when Realm was - installed via Swift Package Manager. ([#6625](https://github.com/realm/realm-swift/issues/6625)) - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.12 to v6.0.14 -* Upgraded realm-sync from v5.0.12 to v5.0.14 - -5.3.2 Release notes (2020-07-21) -============================================================= - -### Fixed - -* Fix a file format upgrade bug when opening older Realm files. Could cause - assertions like "Assertion failed: ref != 0" during opning of a Realm. - ([Core #6644](https://github.com/realm/realm-swift/issues/6644), since 5.2.0) -* A use-after-free would occur if a Realm was compacted, opened on multiple - threads prior to the first write, then written to while reads were happening - on other threads. This could result in a variety of crashes, often inside - realm::util::EncryptedFileMapping::read_barrier. - (Since v5.0.0, [#6626](https://github.com/realm/realm-swift/issues/6626), - [#6628](https://github.com/realm/realm-swift/issues/6628), - [#6652](https://github.com/realm/realm-swift/issues/6652), - [#6655](https://github.com/realm/realm-swift/issues/6555), - [#6656](https://github.com/realm/realm-swift/issues/6656)). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.11 to v6.0.12 -* Upgraded realm-sync from v5.0.11 to v5.0.12 - -5.3.1 Release notes (2020-07-17) -============================================================= - -### Enhancements - -* Add prebuilt binary for Xcode 11.6 to the release package. - -### Fixed - -* Creating an object inside migration which changed that object type's primary - key would hit an assertion failure mentioning primary_key_col - ([#6613](https://github.com/realm/realm-swift/issues/6613), since 5.0.0). -* Modifying the value of a string primary key property inside a migration with - a Realm file which was upgraded from pre-5.0 would corrupt the property's - index, typically resulting in crashes. ([Core #3765](https://github.com/realm/realm-core/issues/3765), since 5.0.0). -* Some Realm files which hit assertion failures when upgrading from the pre-5.0 - file format should now upgrade correctly (Since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.9 to v6.0.11 -* Upgraded realm-sync from v5.0.8 to v5.0.11 - -5.3.0 Release notes (2020-07-14) -============================================================= - -### Enhancements - -* Add `Realm.objectWillChange`, which is a Combine publisher that will emit a - notification each time the Realm is refreshed or a write transaction is - commited. - -### Fixed - -* Fix the spelling of `ObjectKeyIdentifiable`. The old spelling is available - and deprecated for compatibility. -* Rename `RealmCollection.publisher` to `RealmCollection.collectionPublisher`. - The old name interacted with the `publisher` defined by `Sequence` in very - confusing ways, so we need to use a different name. The `publisher` name is - still available for compatibility. ([#6516](https://github.com/realm/realm-swift/issues/6516)) -* Work around "xcodebuild timed out while trying to read - SwiftPackageManagerExample.xcodeproj" errors when installing Realm via - Carthage. ([#6549](https://github.com/realm/realm-swift/issues/6549)). -* Fix a performance regression when using change notifications. (Since 5.0.0, - [#6629](https://github.com/realm/realm-swift/issues/6629)). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v6.0.8 to v6.0.9 -* Upgraded realm-sync from v5.0.7 to v5.0.8 - -5.2.0 Release notes (2020-06-30) -============================================================= - -### Fixed -* Opening a SyncSession with LOCAL app deployments would not use the correct endpoints. -This release also contains all changes from 5.0.3 and 5.1.0. - -### Breaking Changes -* The following classes & aliases have been renamed to align Cocoa with the other Realm SDKs: - -| Old API | New API | -|:------------------------------------------------------------|:---------------------------------------------------------------| -| `RLMSyncUser` | `RLMUser` | -| `SyncUser` | `User` | -| `RLMAppCredential` | `RLMCredential` | -| `AppCredential` | `Credential` | -| `RealmApp` | `App` | -| `RLMUserAPIKeyProviderClient` | `RLMAPIKeyAuth` | -| `RLMUsernamePasswordProviderClient` | `RLMEmailPasswordAuth` | -| `UsernamePasswordProviderClient` | `EmailPasswordAuth` | -| `UserAPIKeyProviderClient` | `APIKeyAuth` | - -* The following functionality has also moved to the User: - -| Old API | New API | -|:-------------------------------------------------------------|:--------------------------------------------------------------| -| `[RLMApp callFunctionNamed:]` | `[RLMUser callFunctionNamed:]` | -| `App.functions` | `User.functions` | -| `[RLMApp mongoClientWithServiceName:]` | `[RLMUser mongoClientWithServiceName:]` | -| `App.mongoClient(serviceName)` | `User.mongoClient(serviceName)` | -| `[RLMApp userAPIKeyProviderClient]` | `[RLMUser apiKeyAuth]` | -| `App.userAPIKeyProviderClient` | `App.apiKeyAuth()` | -| `[RLMApp logOut:]` | `[RLMUser logOut]` | -| `App.logOut(user)` | `User.logOut()` | -| `[RLMApp removeUser:]` | `[RLMUser remove]` | -| `App.remove(user)` | `User.remove()` | -| `[RLMApp linkUser:credentials:]` | `[RLMUser linkWithCredentials:]` | -| `App.linkUser(user, credentials)` | `User.link(credentials)` | - -* The argument labels in Swift have changed for several methods: -| Old API | New API | -|:-------------------------------------------------------------|:--------------------------------------------------------------| -| `APIKeyAuth.createApiKey(withName:completion:)` | `APIKeyAuth.createApiKey(named:completion:)` | -| `App.login(withCredential:completion:) | `App.login(credentials:completion:)` | -| `App.pushClient(withServiceName:)` | `App.pushClient(serviceName:)` | -| `MongoClient.database(withName:)` | `MongoClient.database(named:)` | - -* `refreshCustomData()` on User now returns void and passes the custom data to the callback on success. - -### Compatibility -* This release introduces breaking changes w.r.t some sync classes and MongoDB Realm Cloud functionality. - (See the breaking changes section for the full list) -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* Realm Studio: 10.0.0 or later. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 - -10.0.0-beta.2 Release notes (2020-06-09) -============================================================= -Xcode 11.3 and iOS 9 are now the minimum supported versions. - -### Enhancements - -* Add support for building with Xcode 12 beta 1. watchOS currently requires - removing x86_64 from the supported architectures. Support for the new 64-bit - watch simulator will come in a future release. - -### Fixed -* Opening a SyncSession with LOCAL app deployments would not use the correct endpoints. -* Linking from embedded objects to top-level objects was incorrectly disallowed. - -* Opening a Realm file in file format v6 (created by Realm Cocoa versions - between 2.4 and 2.10) would crash. (Since 5.0.0, [Core #3764](https://github.com/realm/realm-core/issues/3764)). -* Upgrading v9 (pre-5.0) Realm files would create a redundant search index for - primary key properties. This index would then be removed the next time the - Realm was opened, resulting in some extra i/o in the upgrade process. - (Since 5.0.0, [Core #3787](https://github.com/realm/realm-core/issues/3787)). -* Fixed a performance issue with upgrading v9 files with search indexes on - non-primary-key properties. (Since 5.0.0, [Core #3767](https://github.com/realm/realm-core/issues/3767)). - -### Compatibility -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 - -10.0.0-beta.1 Release notes (2020-06-08) -============================================================= - -NOTE: This version bumps the Realm file format to version 11. It is not -possible to downgrade to earlier versions. Older files will automatically be -upgraded to the new file format. Only [Realm Studio -10.0.0](https://github.com/realm/realm-studio/releases/tag/v10.0.0-beta.1) or -later will be able to open the new file format. - -### Enhancements - -* Add support for next generation sync. Support for syncing to MongoDB instead - of Realm Object Server. Applications must be created at realm.mongodb.com -* The memory mapping scheme for Realm files has changed to better support - opening very large files. -* Add support for the ObjectId data type. This is an automatically-generated - unique identifier similar to a GUID or a UUID. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for the Decimal128 data type. This is a 128-bit IEEE 754 decimal - floating point number similar to NSDecimalNumber. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for embedded objects. Embedded objects are objects which are - owned by a single parent object, and are deleted when that parent object is - deleted. They are defined by subclassing `EmbeddedObject` / - `RLMEmbeddedObject` rather than `Object` / `RLMObject`. -* Add `-[RLMSyncUser customData]`/`SyncUser.customData`. Custom data is - configured in your MongoDB Realm App. -* Add `-[RLMApp callFunctionNamed:arguments]`/`RealmApp.functions`. This is the - entry point for calling Remote MongoDB Realm functions. Functions allow you - to define and execute server-side logic for your application. Functions are - written in modern JavaScript (ES6+) and execute in a serverless manner. When - you call a function, you can dynamically access components of the current - application as well as information about the request to execute the function - and the logged in user that sent the request. -* Add `-[RLMApp mongoClientWithServiceName]`/`RealmApp.mongoClient`. This is - the entry point for calling your Remote MongoDB Service. The read operations - are `-[RLMMongoCollection findWhere:completion:]`, `-[RLMMongoCollection - countWhere:completion:]`and `-[RLMMongoCollection - aggregateWithPipeline:completion:]`. The write operations are - `-[RLMMongoCollection insertOneDocument:completion:]`, `-[RLMMongoCollection - insertManyDocuments:completion:]`, `-[RLMMongoCollection - updateOneDocument:completion:]`, `-[RLMMongoCollection - updateManyDocuments:completion:]`, `-[RLMMongoCollection - deleteOneDocument:completion:]`, and `-[RLMMongoCollection - deleteManyDocuments:completion:]`. If you are already familiar with MongoDB - drivers, it is important to understand that the remote MongoCollection only - provides access to the operations available in MongoDB Realm. -* Change `[RLMSyncUser - configurationWithPartitionValue:]`/`SyncUser.configuration(with:)` to accept - all BSON types. Partition values can currently be of types `String`, `Int`, - or `ObjectId`. Opening a realm by partition value is the equivalent of - previously opening a realm by URL. In this case, partitions are meant to be - more closely associated with your data. E.g., if you are running a `Dog` - kennel, and have a field `breed` that acts as your partition key, you could - open up realms based on the breed of the dogs. - -### Breaking Changes - -* We no longer support Realm Cloud (legacy), but instead the new "MongoDB - Realm" Cloud. MongoDB Realm is a serverless platform that enables developers - to quickly build applications without having to set up server infrastructure. - MongoDB Realm is built on top of MongoDB Atlas, automatically integrating the - connection to your database. -* Remove support for Query-based sync, including the configuration parameters - and the `RLMSyncSubscription` and `SyncSubscription` types ([#6437](https://github.com/realm/realm-swift/pull/6437)). -* Primary key properties are no longer marked as being indexed. This reflects - an internal change to how primary keys are handled that should not have any - other visible effects. ([#6440](https://github.com/realm/realm-swift/pull/6440)). -* Remove everything related to sync permissions, including both the path-based - permission system and the object-level privileges for query-based sync. ([#6445](https://github.com/realm/realm-swift/pulls/6445)) -* Primary key uniqueness is now enforced when creating new objects during - migrations, rather than only at the end of migrations. Previously new objects - could be created with duplicate primary keys during a migration as long as - the property was changed to a unique value before the end of the migration, - but now a unique value must be supplied when creating the object. -* Remove support for Realm Object Server. - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* `List.index(of:)` would give incorrect results if it was the very first thing - called on that List after a Realm was refreshed following a write which - modified the List. (Since 5.0.0, [#6606](https://github.com/realm/realm-swift/issues/6606)). -* If a ThreadSafeReference was the only remaining reference to a Realm, - multiple copies of the file could end up mapped into memory at once. This - probably did not have any symptoms other than increased memory usage. (Since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 -* Upgraded realm-core from v6.0.6 to v6.0.7 -* Upgraded realm-sync from v5.0.5 to v5.0.6 -* Upgraded realm-core from v6.0.6 to v6.0.8 -* Upgraded realm-sync from v5.0.5 to v5.0.7 - -5.1.0 Release notes (2020-06-22) -============================================================= - -### Enhancements - -* Allow opening full-sync Realms in read-only mode. This disables local schema - initialization, which makes it possible to open a Realm which the user does - not have write access to without using asyncOpen. In addition, it will report - errors immediately when an operation would require writing to the Realm - rather than reporting it via the sync error handler only after the server - rejects the write. - -### Fixed - -* Opening a Realm using a configuration object read from an existing Realm - would incorrectly bind the new Realm to the original Realm's thread/queue, - resulting in "Realm accessed from incorrect thread." exceptions. - ([#6574](https://github.com/realm/realm-swift/issues/6574), - [#6559](https://github.com/realm/realm-swift/issues/6559), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -5.0.3 Release notes (2020-06-10) -============================================================= - -### Fixed - -* `-[RLMObject isFrozen]` always returned false. ([#6568](https://github.com/realm/realm-swift/issues/6568), since 5.0.0). -* Freezing an object within the write transaction that the object was created - in now throws an exception rather than crashing when the object is first - used. -* The schema for frozen Realms was not properly initialized, leading to crashes - when accessing a RLMLinkingObjects property. - ([#6568](https://github.com/realm/realm-swift/issues/6568), since 5.0.0). -* Observing `Object.isInvalidated` via a keypath literal would produce a - warning in Swift 5.2 due to the property not being marked as @objc. - ([#6554](https://github.com/realm/realm-swift/issues/6554)) - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -5.0.2 Release notes (2020-06-02) -============================================================= - -### Fixed - -* Fix errSecDuplicateItem (-25299) errors when opening a synchronized Realm - when upgrading from pre-5.0 versions of Realm. - ([#6538](https://github.com/realm/realm-swift/issues/6538), [#6494](https://github.com/realm/realm-swift/issues/6494), since 5.0.0). -* Opening Realms stored on filesystems which do not support preallocation (such - as ExFAT) would give "Operation not supported" exceptions. - ([#6508](https://github.com/realm/realm-swift/issues/6508), since 3.2.0). -* 'NoSuchTable' exceptions would sometimes be thrown after upgrading a Relam - file to the v10 format. ([Core #3701](https://github.com/realm/realm-core/issues/3701), since 5.0.0) -* If the upgrade process was interrupted/killed for various reasons, the - following run could stop with some assertions failing. No instances of this - happening were reported to us. (Since 5.0.0). -* Queries filtering a `List` where the query was on an indexed property over a - link would sometimes give incomplete results. - ([#6540](https://github.com/realm/realm-swift/issues/6540), since 4.1.0 but - more common since 5.0.0) -* Opening a file in read-only mode would attempt to make a spurious write to - the file, causing errors if the file was in read-only storage (since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v6.0.4 to v6.0.6 -* Upgraded realm-sync from v5.0.3 to v5.0.5 - -5.0.1 Release notes (2020-05-27) -============================================================= - -### Enhancements - -* Add prebuilt binary for Xcode 11.5 to the release package. - -### Fixed - -* Fix linker error when building a xcframework for Catalyst. - ([#6511](https://github.com/realm/realm-swift/issues/6511), since 4.3.1). -* Fix building for iOS devices when using Swift Package Manager - ([#6522](https://github.com/realm/realm-swift/issues/6522), since 5.0.0). -* `List` and `RealmOptional` properties on frozen objects were not initialized - correctly and would always report `nil` or an empty list. - ([#6527](https://github.com/realm/realm-swift/issues/6527), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -5.0.0 Release notes (2020-05-15) -============================================================= - -NOTE: This version bumps the Realm file format to version 10. It is not -possible to downgrade version 9 or earlier. Files created with older versions -of Realm will be automatically upgraded. Only -[Studio 3.11](https://github.com/realm/realm-studio/releases/tag/v3.11.0) or later will be able -to open the new file format. - -### Enhancements - -* Storing large binary blobs in Realm files no longer forces the file to be at - least 8x the size of the largest blob. -* Reduce the size of transaction logs stored inside the Realm file, reducing - file size growth from large transactions. -* Add support for frozen objects. `Realm`, `Results`, `List` and `Object` now - have `freeze()` methods which return a frozen copy of the object. These - objects behave similarly to creating unmanaged deep copies of the source - objects. They can be read from any thread and do not update when writes are - made to the Realm, but creating frozen objects does not actually copy data - out of the Realm and so can be much faster and use less memory. Frozen - objects cannot be mutated or observed for changes (as they never change). - ([PR #6427](https://github.com/realm/realm-swift/pull/6427)). -* Add the `isFrozen` property to `Realm`, `Results`, `List` and `Object`. -* Add `Realm.Configuration.maxNumberOfActiveVersions`. Each time a write - transaction is performed, a new version is created inside the Realm, and then - any versions which are no longer in use are cleaned up. If too many versions - are kept alive while performing writes (either due to a background thread - performing a long operation that doesn't let the Realm on that thread - refresh, or due to holding onto frozen versions for a long time) the Realm - file will grow in size, potentially to the point where it is too large to be - opened. Setting this configuration option will make write transactions which - would cause the live version count to exceed the limit to instead fail. -* Add support for queue-confined Realms. Rather than being bound to a specific - thread, queue-confined Realms are bound to a serial dispatch queue and can be - used within blocks dispatched to that queue regardless of what thread they - happen to run on. In addition, change notifications will be delivered to that - queue rather than the thread's run loop. ([PR #6478](https://github.com/realm/realm-swift/pull/6478)). -* Add an option to deliver object and collection notifications to a specific - serial queue rather than the current thread. ([PR #6478](https://github.com/realm/realm-swift/pull/6478)). -* Add Combine publishers for Realm types. Realm collections have a `.publisher` - property which publishes the collection each time it changes, and a - `.changesetPublisher` which publishes a `RealmCollectionChange` each time the - collection changes. Corresponding publishers for Realm Objects can be - obtained with the `publisher()` and `changesetPublisher()` global functions. -* Extend Combine publishers which output Realm types with a `.freeze()` - function which will make the publisher instead output frozen objects. -* String primary keys no longer require a separate index, improving insertion - and deletion performance without hurting lookup performance. -* Reduce the encrypted page reclaimer's impact on battery life when encryption - is used. ([Core #3461](https://github.com/realm/realm-core/pull/3461)). - -### Fixed - -* The uploaded bytes in sync progress notifications was sometimes incorrect and - wouldn't exactly equal the uploadable bytes when the uploaded completed. -* macOS binaries were built with the incorrect deployment target (10.14 rather - than 10.9), resulting in linker warnings. ([#6299](https://github.com/realm/realm-swift/issues/6299), since 3.18.0). -* An internal datastructure for List properties could be double-deleted if the - last reference was released from a thread other than the one which the List - was created on at the wrong time. This would typically manifest as - "pthread_mutex_destroy() failed", but could also result in other kinds of - crashes. ([#6333](https://github.com/realm/realm-swift/issues/6333)). -* Sorting on float or double properties containing NaN values had inconsistent - results and would sometimes crash due to out-of-bounds memory accesses. - ([#6357](https://github.com/realm/realm-swift/issues/6357)). - -### Breaking Changes - -* The ObjectChange type in Swift is now generic and includes a reference to the - object which changed. When using `observe(on:)` to receive notifications on a - dispatch queue, the object will be confined to that queue. -* The Realm instance passed in the callback to asyncOpen() is now confined to - the callback queue passed to asyncOpen() rather than the thread which the - callback happens to be called on. This means that the Realm instance may be - stored and reused in further blocks dispatched to that queue, but the queue - must now be a serial queue. -* Files containing Date properties written by version of Realm prior to 1.0 can - no longer be opened. -* Files containing Any properties can no longer be opened. This property type - was never documented and was deprecated in 1.0. -* Deleting objects now preserves the order of objects reported by unsorted - Results rather than performing a swap operation before the delete. Note that - it is still not safe to assume that the order of objects in an unsorted - Results is the order that the objects were created in. -* The minimum supported deployment target for iOS when using Swift Package - Manager to install Realm is now iOS 11. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.4.1. - -### Internal - -* Upgraded realm-core from v5.23.8 to v6.0.4 -* Upgraded realm-sync from v4.9.5 to v5.0.3 - -5.0.0-beta.6 Release notes (2020-05-08) -============================================================= - -### Enhancements - -* Add support for queue-confined Realms. Rather than being bound to a specific - thread, queue-confined Realms are bound to a serial dispatch queue and can be - used within blocks dispatched to that queue regardless of what thread they - happen to run on. In addition, change notifications will be delivered to that - queue rather than the thread's run loop. ([PR #6478](https://github.com/realm/realm-swift/pull/6478)). -* Add an option to deliver object and collection notifications to a specific - serial queue rather than the current thread. ([PR #6478](https://github.com/realm/realm-swift/pull/6478)). - -### Fixed - -* The uploaded bytes in sync progress notifications was sometimes incorrect and - wouldn't exactly equal the uploadable bytes when the uploaded completed. - -### Breaking Changes - -* The Realm instance passed in the callback to asyncOpen() is now confined to - the callback queue passed to asyncOpen() rather than the thread which the - callback happens to be called on. This means that the Realm instance may be - stored and reused in further blocks dispatched to that queue, but the queue - must now be a serial queue. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.4.1. - -### Internal - -* Upgraded realm-core from v6.0.3 to v6.0.4 -* Upgraded realm-sync from v5.0.1 to v5.0.3 - -4.4.1 Release notes (2020-04-16) -============================================================= - -### Enhancements - -* Upgrade Xcode 11.4 binaries to Xcode 11.4.1. - -### Fixed - -* Fix a "previous <= m_schema_transaction_version_max" assertion failure caused - by a race condition that could occur after performing a migration. (Since 3.0.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.4.1. - -5.0.0-beta.3 Release notes (2020-02-26) -============================================================= - -Based on 4.3.2 and also includes all changes since 4.3.0. - -### Enhancements - -* Add support for frozen objects. `Realm`, `Results`, `List` and `Object` now - have `freeze()` methods which return a frozen copy of the object. These - objects behave similarly to creating unmanaged deep copies of the source - objects. They can be read from any thread and do not update when writes are - made to the Realm, but creating frozen objects does not actually copy data - out of the Realm and so can be much faster and use less memory. Frozen - objects cannot be mutated or observed for changes (as they never change). - ([PR #6427](https://github.com/realm/realm-swift/pull/6427)). -* Add the `isFrozen` property to `Realm`, `Results`, `List` and `Object`. -* Add `Realm.Configuration.maxNumberOfActiveVersions`. Each time a write - transaction is performed, a new version is created inside the Realm, and then - any versions which are no longer in use are cleaned up. If too many versions - are kept alive while performing writes (either due to a background thread - performing a long operation that doesn't let the Realm on that thread - refresh, or due to holding onto frozen versions for a long time) the Realm - file will grow in size, potentially to the point where it is too large to be - opened. Setting this configuration option will make write transactions which - would cause the live version count to exceed the limit to instead fail. - - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-core from v6.0.0-beta.3 to v6.0.3 -* Upgraded realm-sync from v5.0.0-beta.2 to v5.0.1 - -5.0.0-beta.2 Release notes (2020-01-13) -============================================================= - -Based on 4.3.0 and also includes all changes since 4.1.1. - -### Fixed - -* Fix compilation when using CocoaPods targeting iOS versions older than 11 (since 5.0.0-alpha). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-core from v6.0.0-beta.2 to v6.0.0-beta.3 -* Upgraded realm-sync from v5.0.0-beta.1 to v5.0.0-beta.2 - -5.0.0-beta.1 Release notes (2019-12-13) -============================================================= - -Based on 4.1.1 and also includes all changes since 4.1.0. - -NOTE: This version bumps the Realm file format to version 10. It is not possible to downgrade version 9 or earlier. Files created with older versions of Realm will be automatically upgraded. - -### Enhancements - -* String primary keys no longer require a separate index, improving insertion - and deletion performance without hurting lookup performance. -* Reduce the encrypted page reclaimer's impact on battery life when encryption - is used. ([Core #3461](https://github.com/realm/realm-core/pull/3461)). - -### Fixed - -* Fix an error when a table-backed Results was accessed immediately after - deleting the object previously at the index being accessed (since - 5.0.0-alpha.1). -* macOS binaries were built with the incorrect deployment target (10.14 rather - than 10.9), resulting in linker warnings. ([#6299](https://github.com/realm/realm-swift/issues/6299), since 3.18.0). -* An internal datastructure for List properties could be double-deleted if the - last reference was released from a thread other than the one which the List - was created on at the wrong time. This would typically manifest as - "pthread_mutex_destroy() failed", but could also result in other kinds of - crashes. ([#6333](https://github.com/realm/realm-swift/issues/6333)). -* Sorting on float or double properties containing NaN values had inconsistent - results and would sometimes crash due to out-of-bounds memory accesses. - ([#6357](https://github.com/realm/realm-swift/issues/6357)). - -### Known Issues - -* Changing which property of an object is the primary key in a migration will - break incoming links to objects of that type. -* Changing the primary key of an object with Data properties in a migration - will crash. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-core from v6.0.0-alpha.24 to v6.0.0-beta.2 -* Upgraded realm-sync from 4.7.1-core6.5 to v5.0.0-beta.1 - -5.0.0-alpha.1 Release notes (2019-11-14) -============================================================= - -Based on 4.1.0. - -### Enhancements - -* Add `-[RLMRealm fileExistsForConfiguration:]`/`Realm.fileExists(for:)`, - which checks if a local Realm file exists for the given configuration. -* Add `-[RLMRealm deleteFilesForConfiguration:]`/`Realm.deleteFiles(for:)` - to delete the Realm file and all auxiliary files for the given configuration. -* Storing large binary blobs in Realm files no longer forces the file to be at - least 8x the size of the largest blob. -* Reduce the size of transaction logs stored inside the Realm file, reducing - file size growth from large transactions. - -NOTE: This version bumps the Realm file format to version 10. It is not -possible to downgrade version 9 or earlier. Files created with older versions -of Realm will be automatically upgraded. This automatic upgrade process is not -yet well tested. Do not open Realm files with data you care about with this -alpha version. - -### Breaking Changes - -* Files containing Date properties written by version of Realm prior to 1.0 can - no longer be opened. -* Files containing Any properties can no longer be opened. This property type - was never documented and was deprecated in 1.0. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades v9) -* Realm Object Server: 3.21.0 or later. -* APIs are backwards compatible with all previous releases in the 4.x.y series. -* Carthage release for Swift is built with Xcode 11.3. -* Carthage release for Swift is built with Xcode 11.2.1. - -### Internal - -* Upgraded realm-core from 5.23.6 to v6.0.0-alpha.24. -* Upgraded realm-sync from 4.8.2 to 4.7.1-core6.5. - -4.4.0 Release notes (2020-03-26) -============================================================= - -Swift 4.0 and Xcode 10.3 are now the minimum supported versions. - -### Enhancements - -* Allow setting the `fileUrl` for synchronized Realms. An appropriate local - path based on the sync URL will still be used if it is not overridden. - ([PR #6454](https://github.com/realm/realm-swift/pull/6454)). -* Add Xcode 11.4 binaries to the release package. - -### Fixed - -* None. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.4. - -4.3.2 Release notes (2020-02-06) -============================================================= - -### Enhancements - -* Similar to `autoreleasepool()`, `realm.write()` now returns the value which - the block passed to it returns. Returning `Void` from the block is still allowed. - -### Fixed - -* Fix a memory leak attributed to `property_copyAttributeList` the first time a - Realm is opened when using Realm Swift. ([#6409](https://github.com/realm/realm-swift/issues/6409), since 4.0.0). -* Connecting to a `realms:` sync URL would crash at runtime on iOS 11 (and no - other iOS versions) inside the SSL validation code. (Since 4.3.1). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-sync from 4.9.4 to 4.9.5. - -4.3.1 Release notes (2020-01-16) -============================================================= - -### Enhancements - -* Reduce the encrypted page reclaimer's impact on battery life when encryption - is used. ([Core #3461](https://github.com/realm/realm-core/pull/3461)). - -### Fixed - -* macOS binaries were built with the incorrect deployment target (10.14 rather - than 10.9), resulting in linker warnings. ([#6299](https://github.com/realm/realm-swift/issues/6299), since 3.18.0). -* An internal datastructure for List properties could be double-deleted if the - last reference was released from a thread other than the one which the List - was created on at the wrong time. This would typically manifest as - "pthread_mutex_destroy() failed", but could also result in other kinds of - crashes. ([#6333](https://github.com/realm/realm-swift/issues/6333)). -* Sorting on float or double properties containing NaN values had inconsistent - results and would sometimes crash due to out-of-bounds memory accesses. - ([#6357](https://github.com/realm/realm-swift/issues/6357)). -* A NOT query on a `List` which happened to have the objects in a - different order than the underlying table would sometimes include the object - immediately before an object which matches the query. ([#6289](https://github.com/realm/realm-swift/issues/6289), since 0.90.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-core from 5.23.6 to 5.23.8. -* Upgraded realm-sync from 4.9.0 to 4.9.4. - -4.3.0 Release notes (2019-12-19) -============================================================= - -### Enhancements - -* Add the ability to set a custom logger function on `RLMSyncManager` which is - called instead of the default NSLog-based logger. -* Expose configuration options for the various types of sync connection - timeouts and heartbeat intervals on `RLMSyncManager`. -* Add an option to have `Realm.asyncOpen()` report an error if the connection - times out rather than swallowing the error and attempting to reconnect until - it succeeds. - -### Fixed - -* Fix a crash when using value(forKey:) on a LinkingObjects property (including - when doing so indirectly, such as by querying on that property). - ([#6366](https://github.com/realm/realm-swift/issues/6366), since 4.0.0). -* Fix a rare crash in `ClientHistoryImpl::integrate_server_changesets()` which - would only happen in Debug builds (since v3.0.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-sync from 4.8.2 to 4.9.0. - -4.2.0 Release notes (2019-12-16) -============================================================= - -### Enhancements - -* Add `-[RLMRealm fileExistsForConfiguration:]`/`Realm.fileExists(for:)`, - which checks if a local Realm file exists for the given configuration. -* Add `-[RLMRealm deleteFilesForConfiguration:]`/`Realm.deleteFiles(for:)` - to delete the Realm file and all auxiliary files for the given configuration. - -### Fixed - -* None. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.3. - -4.1.1 Release notes (2019-11-18) -============================================================= - -### Fixed - -* The UpdatePolicy passed to `realm.add()` or `realm.create()` was not properly - propagated when adding objects within a `List`, which could result in - spurious change notifications when using `.modified`. - ([#6321](https://github.com/realm/realm-swift/issues/6321), since v3.16.0) -* Fix a rare deadlock when a Realm collection or object was observed, then - `refresh()` was explicitly called, and then the NotificationToken from the - observation was destroyed on a different thread (since 0.98.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.2. - -4.1.0 Release notes (2019-11-13) -============================================================= - -### Enhancements - -* Improve performance of queries over a link where the final target property - has an index. -* Restore support for storing `@objc enum` properties on RealmSwift.Object - subclasses (broken in 4.0.0), and add support for storing them in - RealmOptional properties. - -### Fixed - -* The sync client would fail to reconnect after failing to integrate a - changeset. The bug would lead to further corruption of the client’s Realm - file. ([RSYNC-48](https://jira.mongodb.org/browse/RSYNC-48), since v3.2.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.2. - -### Internal - -* Upgraded realm-core from 5.23.5 to 5.23.6. -* Upgraded realm-sync from 4.7.11 to 4.8.2 - -4.0.0 Release notes (2019-11-08) -============================================================= - -### Breaking Changes - -* All previously deprecated functionality has now been removed entirely. -* The schema discovery logic for RealmSwift.Object subclasses has been - rewritten in Swift. This should not have any effect on valid class - definitions, but there may be types of invalid definitions which previously - worked by coincidence and no longer do. -* `SyncSubscription` no longer has a generic type parameter, as the type was - not actually used for anything. -* The following Swift types have changed from `final class` to `struct`: - - AnyRealmCollection - - LinkingObjects - - ObjectiveCSupport - - Realm - - Results - - SyncSubscription - - ThreadSafeReference - There is no intended change in semantics from this, but certain edge cases - may behave differently. -* The designated initializers defined by RLMObject and Object other than - zero-argument `init` have been replaced with convenience initializers. -* The implementation of the path-based permissions API has been redesigned to - accomodate changes to the server. This should be mostly a transparent change, - with two main exceptions: - 1. SyncPermission objects are no longer live Realm objects, and retrieving - permissions gives an Array rather than Results. - Getting up-to-date permissions now requires calling retrievePermissions() again - rather than observing the permissions. - 2. The error codes for permissions functions have changed. Rather than a - separate error type and set of error codes, permission functions now produce - SyncAuthErrors. - -### Enhancements - -* Improve performance of initializing Realm objects with List properties. - -### Fixed - -* None. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.2. - -3.21.0 Release notes (2019-11-04) -============================================================= - -### Enhancements - -* Add prebuilt binaries for Xcode 11.2. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.2. - -3.20.0 Release notes (2019-10-21) -============================================================= - -### Enhancements - -* Add support for custom refresh token authentication. This allows a user to be - authorized with an externally-issued refresh token when ROS is configured to - recognize the external issuer as a refresh token validator. - ([PR #6311](https://github.com/realm/realm-swift/pull/6311)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11. - -3.19.1 Release notes (2019-10-17) -============================================================= - -### Enhancements - -* Improve performance of sync changeset integration. Transactions involving a - very large number of objects and cheap operations on each object are as much - as 20% faster. - -### Fixed - -* Fix a crash when a RLMArray/List of primitives was observed and then the - containing object was deleted before the first time that the background - notifier could run. - ([Issue #6234](https://github.com/realm/realm-swift/issues/6234, since 3.0.0)). -* Remove an incorrect assertion that would cause crashes inside - `TableInfoCache::get_table_info()`, with messages like "Assertion failed: info.object_id_index == 0 [3, 0]". - (Since 3.18.0, [#6268](https://github.com/realm/realm-swift/issues/6268) and [#6257](https://github.com/realm/realm-swift/issues/6257)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.0. - -### Internal - -* Upgrade to REALM_SYNC_VERSION=4.7.11 - -3.19.0 Release notes (2019-09-27) -============================================================= - -### Enhancements - -* Expose ObjectSchema.objectClass in Swift as looking up the class via - NSClassFromString() can be complicated for Swift types. - ([PR #6244](https://github.com/realm/realm-swift/pull/6244)). -* Add support for suppressing notifications using closure-based write/transaction methods. - ([PR #6252](https://github.com/realm/realm-swift/pull/6252)). - -### Fixed - -* IN or chained OR equals queries on an unindexed string column would fail to - match some results if any of the strings were 64 bytes or longer. - ([Core #3386](https://github.com/realm/realm-core/pull/3386), since 3.14.2). -* Query Based Sync subscriptions for queries involving a null timestamp were - not sent to the server correctly and would match no objects. - ([Core #3389](https://github.com/realm/realm-core/pull/3388), since 3.17.3). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.0. - -### Internal - -* Upgrade to REALM_CORE_VERSION=5.23.5 -* Upgrade to REALM_SYNC_VERSION=4.7.8 - -3.18.0 Release notes (2019-09-13) -============================================================= - -The file format for synchronized Realms has changed. Old Realms will be -automatically upgraded when they are opened. Once upgraded, the files will not -be openable by older versions of Realm. The upgrade should not take a -significant amount of time to run or run any risk of errors. - -This does not effect non-synchronized Realms. - -### Enhancements - -* Improve performance of queries on Date properties - ([Core #3344](https://github.com/realm/realm-core/pull/3344), [Core #3351](https://github.com/realm/realm-core/pull/3351)). -* Syncronized Realms are now more aggressive about trimming local history that - is no longer needed. This should reduce file size growth in write-heavy - workloads. ([Sync #3007](https://github.com/realm/realm-sync/issues/3007)). -* Add support for building Realm as an xcframework. - ([PR #6238](https://github.com/realm/realm-swift/pull/6238)). -* Add prebuilt libraries for Xcode 11 to the release package. - ([PR #6248](https://github.com/realm/realm-swift/pull/6248)). -* Add a prebuilt library for Catalyst/UIKit For Mac to the release package - ([PR #6248](https://github.com/realm/realm-swift/pull/6248)). - -### Fixed - -* If a signal interrupted a msync() call, Realm would throw an exception and - the write transaction would fail. This behavior has new been changed to retry - the system call instead. ([Core #3352](https://github.com/realm/realm-core/issues/3352)) -* Queries on the sum or average of an integer property would sometimes give - incorrect results. ([Core #3356](https://github.com/realm/realm-core/pull/3356)). -* Opening query-based synchronized Realms with a small number of subscriptions - performed an unneccesary write transaction. ([ObjectStore #815](https://github.com/realm/realm-object-store/pull/815)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.0 - -### Deprecations - -* `RLMIdentityProviderNickname` has been deprecated in favor of `RLMIdentityProviderUsernamePassword`. -* `+[RLMIdentityProvider credentialsWithNickname]` has been deprecated in favor of `+[RLMIdentityProvider credentialsWithUsername]`. -* `Sync.nickname(String, Bool)` has been deprecated in favor of `Sync.usernamePassword(String, String, Bool)`. - -3.17.3 Release notes (2019-07-24) -============================================================= - -### Enhancements - -* Add Xcode 10.3 binaries to the release package. Remove the Xcode 9.2 and 9.3 binaries. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.3. - -3.17.1 Release notes (2019-07-10) -============================================================= - -### Enhancements - -* Add support for canceling asynchronous opens using a new AsyncOpenTask - returned from the asyncOpen() call. ([PR #6193](https://github.com/realm/realm-swift/pull/6193)). -* Importing the Realm SPM package can now be done by pinning to a version - rather than a branch. - -### Fixed - -* Queries on a List/RLMArray which checked an indexed int property would - sometimes give incorrect results. - ([#6154](https://github.com/realm/realm-swift/issues/6154)), since v3.15.0) -* Queries involving an indexed int property had a memory leak if run multiple - times. ([#6186](https://github.com/realm/realm-swift/issues/6186)), since v3.15.0) -* Creating a subscription with `includeLinkingObjects:` performed unneccesary - comparisons, making it extremely slow when large numbers of objects were - involved. ([Core #3311](https://github.com/realm/realm-core/issues/3311), since v3.15.0) - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.17.0 Release notes (2019-06-28) -============================================================= - -### Enhancements - -* Add support for including Realm via Swift Package Manager. This currently - requires depending on the branch "master" rather than pinning to a version - (i.e. `.package(url: "https://github.com/realm/realm-swift", .branch("master"))`). - ([#6187](https://github.com/realm/realm-swift/pull/6187)). -* Add Codable conformance to RealmOptional and List, and Encodable conformance to Results. - ([PR #6172](https://github.com/realm/realm-swift/pull/6172)). - -### Fixed - -* Attempting to observe an unmanaged LinkingObjects object crashed rather than - throwing an approriate exception (since v0.100.0). -* Opening an encrypted Realm could potentially report that a valid file was - corrupted if the system was low on free memory. - (since 3.14.0, [Core #3267](https://github.com/realm/realm-core/issues/3267)) -* Calling `Realm.asyncOpen()` on multiple Realms at once would sometimes crash - due to a `FileNotFound` exception being thrown on a background worker thread. - (since 3.16.0, [ObjectStore #806](https://github.com/realm/realm-object-store/pull/806)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.16.2 Release notes (2019-06-14) -============================================================= - -### Enhancements - -* Add support for Xcode 11 Beta 1. Xcode betas are only supported when building - from source, and not when using a prebuilt framework. - ([PR #6164](https://github.com/realm/realm-swift/pull/6164)). - -### Fixed - -* Using asyncOpen on query-based Realms which didn't already exist on the local - device would fail with error 214. - ([#6178](https://github.com/realm/realm-swift/issues/6178), since 3.16.0). -* asyncOpen on query-based Realms did not wait for the server-created - permission objects to be downloaded, resulting in crashes if modifications to - the permissions were made before creating a subscription for the first time (since 3.0.0). -* EINTR was not handled correctly in the notification worker, which may have - resulted in inconsistent and rare assertion failures in - `ExternalCommitHelper::listen()` when building with assertions enabled. - (PR: [#804](https://github.com/realm/realm-object-store/pull/804), since 0.91.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.16.1 Release notes (2019-05-31) -============================================================= - -### Fixed - -* The static type passed at compile time to `realm.create()` was checked for a - primary key rather than the actual type passed at runtime, resulting in - exceptions like "''RealmSwiftObject' does not have a primary key and can not - be updated'" being thrown even if the object type being created has a primary - key. (since 3.16.0, [#6159](https://github.com/realm/realm-swift/issues/6159)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.16.0 Release notes (2019-05-29) -============================================================= - -### Enhancements - -* Add an option to only set the properties which have values different from the - existing ones when updating an existing object with - `Realm.create()`/`-[RLMObject createOrUpdateInRealm:withValue:]`. This makes - notifications report only the properties which have actually changed, and - improves Object Server performance by reducing the number of operations to - merge. (Issue: [#5970](https://github.com/realm/realm-swift/issues/5970), - PR: [#6149](https://github.com/realm/realm-swift/pull/6149)). -* Using `-[RLMRealm asyncOpenWithConfiguration:callbackQueue:]`/`Realm.asyncOpen()` to open a - synchronized Realm which does not exist on the local device now uses an - optimized transfer method to download the initial data for the Realm, greatly - speeding up the first start time for applications which use full - synchronization. This is currently not applicable to query-based - synchronization. (PR: [#6106](https://github.com/realm/realm-swift/pull/6106)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.15.0 Release notes (2019-05-06) -============================================================= - -The minimum version of Realm Object Server has been increased to 3.21.0 and -attempting to connect to older versions will produce protocol mismatch errors. -Realm Cloud has already been upgraded to this version, and users using that do -not need to worry about this. - -### Enhancements - -* Add `createdAt`, `updatedAt`, `expiresAt` and `timeToLive` properties to - `RLMSyncSubscription`/`SyncSubscription`. These properties will be `nil` for - subscriptions created with older versions of Realm, but will be automatically - populated for newly-created subscriptions. -* Add support for transient subscriptions by setting the `timeToLive` when - creating the subscription. The next time a subscription is created or updated - after that time has elapsed the subscription will be automatically removed. -* Add support for updating existing subscriptions with a new query or limit. - This is done by passing `update: true` (in swift) or setting - `options.overwriteExisting = YES` (in obj-c) when creating the subscription, - which will make it update the existing subscription with the same name rather - than failing if one already exists with that name. -* Add an option to include the objects from - `RLMLinkingObjects`/`LinkingObjects` properties in sync subscriptions, - similarly to how `RLMArray`/`List` automatically pull in the contained - objects. -* Improve query performance for chains of OR conditions (or an IN condition) on - an unindexed integer or string property. - ([Core PR #2888](https://github.com/realm/realm-core/pull/2888) and - [Core PR #3250](https://github.com/realm/realm-core/pull/3250)). -* Improve query performance for equality conditions on indexed integer properties. - ([Core PR #3272](https://github.com/realm/realm-core/pull/3272)). -* Adjust the file allocation algorithm to reduce fragmentation caused by large - numbers of small blocks. -* Improve file allocator logic to reduce fragmentation and improve commit - performance after many writes. ([Core PR #3278](https://github.com/realm/realm-core/pull/3278)). - -### Fixed - -* Making a query that compares two integer properties could cause a - segmentation fault on x86 (i.e. macOS only). - ([Core PR #3253](https://github.com/realm/realm-core/pull/3256)). -* The `downloadable_bytes` parameter passed to sync progress callbacks reported - a value which correlated to the amount of data left to download, but not - actually the number of bytes which would be downloaded. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.14.2 Release notes (2019-04-25) -============================================================= - -### Enhancements - -* Updating `RLMSyncManager.customRequestHeaders` will immediately update all - currently active sync session with the new headers rather than requiring - manually closing the Realm and reopening it. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.14.1 Release notes (2019-04-04) -============================================================= - -### Fixed - -* Fix "Cannot find interface declaration for 'RealmSwiftObject', superclass of - 'MyRealmObjectClass'" errors when building for a simulator with Xcode 10.2 - with "Install Objective-C Compatibility Header" enabled. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. -* Carthage release for Swift is built with Xcode 10.2. - -3.14.0 Release notes (2019-03-27) -============================================================= - -### Enhancements - -* Reduce memory usage when committing write transactions. -* Improve performance of compacting encrypted Realm files. - ([PR #3221](https://github.com/realm/realm-core/pull/3221)). -* Add a Xcode 10.2 build to the release package. - -### Fixed - -* Fix a memory leak whenever Realm makes a HTTP(s) request to the Realm Object - Server (Issue [#6058](https://github.com/realm/realm-swift/issues/6058), since 3.8.0). -* Fix an assertion failure when creating an object in a synchronized Realm - after creating an object with a null int primary key in the same write - transaction. - ([PR #3227](https://github.com/realm/realm-core/pull/3227)). -* Fix some new warnings when building with Xcode 10.2 beta. -* Properly clean up sync sessions when the last Realm object using the session - is deallocated while the session is explicitly suspended (since 3.9.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. -* Carthage release for Swift is built with Xcode 10.2. - -### Internal - -* Throw an exception rather than crashing with an assertion failure in more - cases when opening invalid Realm files. -* Upgrade to REALM_CORE_VERSION=5.14.0 -* Upgrade to REALM_SYNC_VERSION=3.15.1 - -3.13.1 Release notes (2019-01-03) -============================================================= - -### Fixed - -* Fix a crash when iterating over `Realm.subscriptions()` using for-in. - (Since 3.13.0, PR [#6050](https://github.com/realm/realm-swift/pull/6050)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -3.13.0 Release notes (2018-12-14) -============================================================= - -### Enhancements - -* Add `Realm.subscriptions()`/`-[RLMRealm subscriptions]` and - `Realm.subscription(named:)`/`-[RLMRealm subscriptionWithName:]` to enable - looking up existing query-based sync subscriptions. - (PR: https://github.com/realm/realm-swift/pull/6029). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -3.12.0 Release notes (2018-11-26) -============================================================= - -### Enhancements - -* Add a User-Agent header to HTTP requests made to the Realm Object Server. By - default, this contains information about the Realm library version and your - app's bundle ID. The application identifier can be customized by setting - `RLMSyncManager.sharedManager.userAgent`/`SyncManager.shared.userAgent` prior - to opening a synchronized Realm. - (PR: https://github.com/realm/realm-swift/pull/6007). -* Add Xcode 10.1 binary to the prebuilt package. - -### Fixed - -* None. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -### Internal - -* None. - - -3.11.2 Release notes (2018-11-15) -============================================================= - -### Enhancements - -* Improve the performance of the merge algorithm used for integrating remote - changes from the server. In particular, changesets involving many objects - which all link to a single object should be greatly improved. - -### Fixed - -* Fix a memory leak when removing notification blocks from collections. - PR: [#702](https://github.com/realm/realm-object-store/pull/702), since 1.1.0. -* Fix re-sorting or distincting an already-sorted Results using values from - linked objects. Previously the unsorted order was used to read the values - from the linked objects. - PR [#3102](https://github.com/realm/realm-core/pull/3102), since 3.1.0. -* Fix a set of bugs which could lead to bad changeset assertions when using - sync. The assertions would look something like the following: - `[realm-core-5.10.0] Assertion failed: ndx < size() with (ndx, size()) = [742, 742]`. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -### Internal - -* None. - - -3.11.1 Release notes (2018-10-19) -============================================================= - -### Enhancements - -* None. - -### Fixed - -* Fix `SyncUser.requestEmailConfirmation` not triggering the email confirmation - flow on ROS. (PR [#5953](https://github.com/realm/realm-swift/pull/5953), since 3.5.0) -* Add some missing validation in the getters and setters of properties on - managed Realm objects, which would sometimes result in an application - crashing with a segfault rather than the appropriate exception being thrown - when trying to write to an object which has been deleted. - (PR [#5952](https://github.com/realm/realm-swift/pull/5952), since 2.8.0) - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -### Internal - -* None. - - -3.11.0 Release notes (2018-10-04) -============================================================= - -### Enhancements -* Reduce memory usage when integrating synchronized changes sent by ROS. -* Devices will now report download progress for read-only Realms, allowing the - server to compact Realms more aggressively and reducing the amount of - server-side storage space required. - -### Fixed -* Fix a crash when adding an object with a non-`@objc` `String?` property which - has not been explicitly ignored to a Realm on watchOS 5 (and possibly other - platforms when building with Xcode 10). - (Issue: [5929](https://github.com/realm/realm-swift/issues/5929)). -* Fix some merge algorithm bugs which could result in `BadChangesetError` - being thrown when integrating changes sent by the server. - -### Compatibility -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* **NOTE!!! - You will need to upgrade your Realm Object Server to at least version 3.11.0 - or use [Realm Cloud](https://cloud.realm.io). - If you try to connect to a ROS v3.10.x or previous, you will see an error - like `Wrong protocol version in Sync HTTP request, client protocol version = 25, - server protocol version = 24`.** - -### Internal -* Update to Sync 3.12.2. - - -3.10.0 Release notes (2018-09-19) -============================================================= - -Prebuilt binaries are now built for Xcode 9.2, 9.3, 9.4 and 10.0. - -Older versions of Xcode are still supported when building from source, but you -should be migrating to at least Xcode 9.2 as soon as possible. - -### Enhancements - -* Add support for Watch Series 4 by adding an arm64_32 slice to the library. - -3.9.0 Release notes (2018-09-10) -============================================================= - -### Enhancements - -* Expose RLMSyncUser.refreshToken publicly so that it can be used for custom - HTTP requests to Realm Object Server. -* Add RLMSyncSession.connectionState, which reports whether the session is - currently connected to the Realm Object Server or if it is offline. -* Add `-suspend` and `-resume` methods to `RLMSyncSession` to enable manually - pausing data synchronization. -* Add support for limiting the number of objects matched by a query-based sync - subscription. This requires a server running ROS 3.10.1 or newer. - -### Bugfixes - -* Fix crash when getting the description of a `MigrationObject` which has - `List` properties. -* Fix crash when calling `dynamicList()` on a `MigrationObject`. - -3.8.0 Release notes (2018-09-05) -============================================================= - -### Enhancements - -* Remove some old and no longer applicable migration logic which created an - unencrypted file in the sync metadata directory containing a list of ROS URLs - connected to. -* Add support for pinning SSL certificates used for https and realms - connections by setting `RLMSyncManager.sharedManager.pinnedCertificatePaths` - in obj-c and `SyncManager.shared.pinnedCertificatePaths` in Swift. - -### Bugfixes - -* Fix warnings when building Realm as a static framework with CocoaPods. - -3.7.6 Release notes (2018-08-08) -============================================================= - -### Enhancements - -* Speed up the actual compaction when using compact-on-launch. -* Reduce memory usage when locally merging changes from sync. -* When first connecting to a server, wait to begin uploading changes until - after all changes have been downloaded to reduce the server-side load for - query-based sync. - -3.7.5 Release notes (2018-07-23) -============================================================= - -### Enhancements - -* Improve performance of applying remote changesets from sync. -* Improve performance of creating objects with string primary keys. -* Improve performance of large write transactions. -* Adjust file space allocation strategy to reduce fragmentation, producing - smaller Realm files and typically better performance. -* Close network connections immediately when a sync session is destroyed. -* Report more information in `InvalidDatabase` exceptions. - -### Bugfixes - -* Fix permission denied errors for RLMPlatform.h when building with CocoaPods - and Xcode 10 beta 3. -* Fix a use-after-free when canceling a write transaction which could result in - incorrect "before" values in KVO observations (typically `nil` when a non-nil - value is expected). -* Fix several bugs in the merge algorithm that could lead to memory corruption - and crashes with errors like "bad changeset" and "unreachable code". - -3.7.4 Release notes (2018-06-19) -============================================================= - -### Bugfixes - -* Fix a bug which could potentially flood Realm Object Server with PING - messages after a client device comes back online. - -3.7.3 Release notes (2018-06-18) -============================================================= - -### Enhancements - -* Avoid performing potentially large amounts of pointless background work for - LinkingObjects instances which are accessed and then not immediate deallocated. - -### Bugfixes - -* Fix crashes which could result from extremely fragmented Realm files. -* Fix a bug that could result in a crash with the message "bad changeset error" - when merging changesets from the server. - -3.7.2 Release notes (2018-06-13) -============================================================= - -### Enhancements - -* Add some additional consistency checks that will hopefully produce better - errors when the "prev_ref + prev_size <= ref" assertion failure occurs. - -### Bugfixes - -* Fix a problem in the changeset indexing algorithm that would sometimes - cause "bad permission object" and "bad changeset" errors. -* Fix a large number of linking warnings about symbol visibility by aligning - compiler flags used. -* Fix large increase in size of files produced by `Realm.writeCopy()` introduced in 3.6.0. - -3.7.1 Release notes (2018-06-07) -============================================================= - -* Add support for compiling Realm Swift with Xcode 10 beta 1. - -3.7.0 Release notes (2018-06-06) -============================================================= - -The feature known as Partial Sync has been renamed to Query-based -Synchronization. This has impacted a number of API's. See below for the -details. - -### Deprecations - -* `+[RLMSyncConfiguration initWithUser] has been deprecated in favor of `-[RLMSyncUser configurationWithURL:url]. -* `+[RLMSyncConfiguration automaticConfiguration] has been deprecated in favor of `-[RLMSyncUser configuration]. -* `+[RLMSyncConfiguration automaticConfigurationForUser] has been deprecated in favor of `-[RLMSyncUser configuration]. -* `-[RLMSyncConfiguration isPartial] has been deprecated in favor of `-[RLMSyncConfiguration fullSynchronization]`. - -### Enhancements - -* Add `-[RLMRealm syncSession]` and `Realm.syncSession` to obtain the session used for a synchronized Realm. -* Add `-[RLMSyncUser configuration]`. Query-based sync is the default sync mode for this configuration. -* Add `-[RLMSyncUser configurationWithURL:url]`. Query-based sync is the default sync mode for this configuration. - -3.6.0 Release notes (2018-05-29) -============================================================= - -### Enhancements - -* Improve performance of sync metadata operations and resolving thread-safe - references. -* `shouldCompactOnLaunch` is now supported for compacting the local data of - synchronized Realms. - -### Bugfixes - -* Fix a potential deadlock when a sync session progress callback held the last - strong reference to the sync session. -* Fix some cases where comparisons to `nil` in queries were not properly - serialized when subscribing to a query. -* Don't delete objects added during a migration after a call to `-[RLMMigration - deleteDataForClassName:]`. -* Fix incorrect results and/or crashes when multiple `-[RLMMigration - enumerateObjects:block:]` blocks deleted objects of the same type. -* Fix some edge-cases where `-[RLMMigration enumerateObjects:block:]` - enumerated the incorrect objects following deletions. -* Restore the pre-3.5.0 behavior for Swift optional properties missing an ivar - rather than crashing. - -3.5.0 Release notes (2018-04-25) -============================================================= - -### Enhancements - -* Add wrapper functions for email confirmation and password reset to `SyncUser`. - -### Bugfixes - -* Fix incorrect results when using optional chaining to access a RealmOptional - property in Release builds, or otherwise interacting with a RealmOptional - object after the owning Object has been deallocated. - -3.4.0 Release notes (2018-04-19) -============================================================= - -The prebuilt binary for Carthage is now built for Swift 4.1. - -### Enhancements - -* Expose `RLMSyncManager.authorizationHeaderName`/`SyncManager.authorizationHeaderName` - as a way to override the transport header for Realm Object Server authorization. -* Expose `RLMSyncManager.customRequestHeaders`/`SyncManager.customRequestHeaders` - which allows custom HTTP headers to be appended on requests to the Realm Object Server. -* Expose `RLMSSyncConfiguration.urlPrefix`/`SyncConfiguration.urlPrefix` as a mechanism - to replace the default path prefix in Realm Sync WebSocket requests. - -3.3.2 Release notes (2018-04-03) -============================================================= - -Add a prebuilt binary for Xcode 9.3. - -3.3.1 Release notes (2018-03-28) -============================================================= - -Realm Object Server v3.0.0 or newer is required when using synchronized Realms. - -### Enhancements - -* Expose `RLMObject.object(forPrimaryKey:)` as a factory method for Swift so - that it is callable with recent versions of Swift. - -### Bugfixes - -* Exclude the RLMObject-derived Permissions classes from the types repored by - `Realm.Configuration.defaultConfiguration.objectTypes` to avoid a failed - cast. -* Cancel pending `Realm.asyncOpen()` calls when authentication fails with a - non-transient error such as missing the Realm path in the URL. -* Fix "fcntl() inside prealloc()" errors on APFS. - -3.3.0 Release notes (2018-03-19) -============================================================= - -Realm Object Server v3.0.0 or newer is required when using synchronized Realms. - -### Enhancements - -* Add `Realm.permissions`, `Realm.permissions(forType:)`, and `Realm.permissions(forClassNamed:)` as convenience - methods for accessing the permissions of the Realm or a type. - -### Bugfixes - -* Fix `+[RLMClassPermission objectInRealm:forClass:]` to work for classes that are part of the permissions API, - such as `RLMPermissionRole`. -* Fix runtime errors when applications define an `Object` subclass with the - same name as one of the Permissions object types. - -3.2.0 Release notes (2018-03-15) -============================================================= - -Realm Object Server v3.0.0 or newer is required when using synchronized Realms. - -### Enhancements - -* Added an improved API for adding subscriptions in partially-synchronized Realms. `Results.subscribe()` can be - used to subscribe to any result set, and the returned `SyncSubscription` object can be used to observe the state - of the subscription and ultimately to remove the subscription. See the documentation for more information - (). -* Added a fine-grained permissions system for use with partially-synchronized Realms. This allows permissions to be - defined at the level of individual objects or classes. See the documentation for more information - (). -* Added `SyncConfiguration.automatic()` and `SyncConfiguration.automatic(user:)`. - These methods return a `Realm.Configuration` appropriate for syncing with the default - synced Realm for the current (or specified) user. These should be considered the preferred methods - for accessing synced Realms going forwards. -* Added `+[RLMSyncSession sessionForRealm:]` to retrieve the sync session corresponding to a `RLMRealm`. - -### Bugfixes - -* Fix incorrect initalization of `RLMSyncManager` that made it impossible to - set `errorHandler`. -* Fix compiler warnings when building with Xcode 9.3. -* Fix some warnings when running with UBsan. - -3.2.0-rc.1 Release notes (2018-03-14) -============================================================= - -Realm Object Server v3.0.0-rc.1 or newer is required when using synchronized Realms. - -### Enhancements - -* Added `SyncConfiguration.automatic()` and `SyncConfiguration.automatic(user:)`. - These methods return a `Realm.Configuration` appropriate for syncing with the default - synced Realm for the current (or specified). These should be considered the preferred methods - for accessing synced Realms going forwards. -* A role is now automatically created for each user with that user as its only member. - This simplifies the common use case of restricting access to specific objects to a single user. - This role can be accessed at `PermissionUser.role`. -* Improved error reporting when the server rejects a schema change due to a lack of permissions. - -### Bugfixes - -* Fix incorrect initalization of `RLMSyncManager` that made it impossible to - set `errorHandler`. -* Fix compiler warnings when building with Xcode 9.3. - -3.2.0-beta.3 Release notes (2018-03-01) -============================================================= - -Realm Object Server v3.0.0-alpha.9 or newer is required when using synchronized Realms. - -### Bugfixes - -* Fix a crash that would occur when using partial sync with Realm Object Server v3.0.0-alpha.9. - -3.2.0-beta.2 Release notes (2018-02-28) -============================================================= - -Realm Object Server v3.0.0-alpha.8 or newer is required when using synchronized Realms. - -### Enhancements - -* Added `findOrCreate(forRoleNamed:)` and `findOrCreate(forRole:)` to `List` - to simplify the process of adding permissions for a role. -* Added `+permissionForRoleNamed:inArray:`, `+permissionForRoleNamed:onRealm:`, - `+permissionForRoleNamed:onClass:realm:`, `+permissionForRoleNamed:onClassNamed:realm:`, - and `+permissionForRoleNamed:onObject:` to `RLMSyncPermission` to simplify the process - of adding permissions for a role. -* Added `+[RLMSyncSession sessionForRealm:]` to retrieve the sync session corresponding to a `RLMRealm`. - -### Bugfixes - -* `PermissionRole.users` and `PermissionUser.roles` are now public as intended. -* Fixed the handling of `setPermissions` in `-[RLMRealm privilegesForRealm]` and related methods. - -3.2.0-beta.1 Release notes (2018-02-19) -============================================================= - -### Enhancements - -* Added an improved API for adding subscriptions in partially-synchronized Realms. `Results.subscribe()` can be - used to subscribe to any result set, and the returned `SyncSubscription` object can be used to observe the state - of the subscription and ultimately to remove the subscription. -* Added a fine-grained permissions system for use with partially-synchronized Realms. This allows permissions to be - defined at the level of individual objects or classes. See `Permission` and related types for more information. - -### Bugfixes - -* Fix some warnings when running with UBsan. - -3.1.1 Release notes (2018-02-03) -============================================================= - -Prebuilt Swift frameworks for Carthage are now built with Xcode 9.2. - -### Bugfixes - -* Fix a memory leak when opening Realms with an explicit `objectTypes` array - from Swift. - -3.1.0 Release notes (2018-01-16) -============================================================= - -* Prebuilt frameworks are now included for Swift 3.2.3 and 4.0.3. -* Prebuilt frameworks are no longer included for Swift 3.0.x. -* Building from source with Xcode versions prior to Xcode 8.3 is no longer supported. - -### Enhancements - -* Add `Results.distinct(by:)` / `-[RLMResults distinctResultsUsingKeyPaths:]`, which return a `Results` - containing only objects with unique values at the given key paths. -* Improve performance of change checking for notifications in certain cases. -* Realm Object Server errors not explicitly recognized by the client are now reported to the application - regardless. -* Add support for JSON Web Token as a sync credential source. -* Add support for Nickname and Anonymous Auth as a sync credential source. -* Improve allocator performance when writing to a highly fragmented file. This - should significantly improve performance when inserting large numbers of - objects which have indexed properties. -* Improve write performance for complex object graphs involving many classes - linking to each other. - -### Bugfixes - -* Add a missing check for a run loop in the permission API methods which - require one. -* Fix some cases where non-fatal sync errors were being treated as fatal errors. - -3.0.2 Release notes (2017-11-08) -============================================================= - -Prebuilt frameworks are now included for Swift 3.2.2 and 4.0.2. - -### Bugfixes - -* Fix a crash when a linking objects property is retrieved from a model object instance via - Swift subscripting. -* Fix incorrect behavior if a call to `posix_fallocate` is interrupted. - -3.0.1 Release notes (2017-10-26) -============================================================= - -### Bugfixes - -* Explicitly exclude KVO-generated object subclasses from the schema. -* Fix regression where the type of a Realm model class is not properly determined, causing crashes - when a type value derived at runtime by `type(of:)` is passed into certain APIs. -* Fix a crash when an `Object` subclass has implicitly ignored `let` - properties. -* Fix several cases where adding a notification block from within a - notification callback could produce incorrect results. - -3.0.0 Release notes (2017-10-16) -============================================================= - -### Breaking Changes -* iOS 7 is no longer supported. -* Synchronized Realms require a server running Realm Object Server v2.0 or higher. -* Computed properties on Realm object types are detected and no - longer added to the automatically generated schema. -* The Objective-C and Swift `create(_:, value: update:)` APIs now - correctly nil out nullable properties when updating an existing - object when the `value` argument specifies nil or `NSNull` for - the property value. -* `-[RLMRealm addOrUpdateObjects:]` and `-[RLMRealm deleteObjects:]` now - require their argument to conform to `NSFastEnumeration`, to match similar - APIs that also take collections. -* The way interactive sync errors (client reset and permission denied) - are delivered to the user has been changed. Instead of a block which can - be invoked to immediately delete the offending Realm file, an opaque - token object of type `RLMSyncErrorActionToken` will be returned in the - error object's `userInfo` dictionary. This error object can be passed - into the new `+[RLMSyncSession immediatelyHandleError:]` API to delete - the files. -* The return types of the `SyncError.clientResetInfo()` and - `SyncError.deleteRealmUserInfo()` APIs have been changed. They now return - `RLMSyncErrorActionToken`s or `SyncError.ActionToken`s instead of closures. -* The class methods `Object.className()`, `Object.objectUtilClass()`, and - the property `Object.isInvalidated` can no longer be overriden. -* The callback which runs when a sync user login succeeds or fails - now runs on the main queue by default, or can be explicitly specified - by a new `callbackQueue` parameter on the `{RLM}SyncUser.logIn(...)` API. -* Fix empty strings, binary data, and null on the right side of `BEGINSWITH`, - `ENDSWITH` and `CONTAINS` operators in predicates to match Foundation's - semantics of never matching any strings or data. -* Swift `Object` comparison and hashing behavior now works the same way as - that of `RLMObject` (objects are now only considered equatable if their - model class defines a primary key). -* Fix the way the hash property works on `Object` when the object model has - no primary key. -* Fix an issue where if a Swift model class defined non-generic managed - properties after generic Realm properties (like `List`), the schema - would be constructed incorrectly. Fixes an issue where creating such - models from an array could fail. -* Loosen `RLMArray` and `RLMResults`'s generic constraint from `RLMObject` to - `NSObject`. This may result in having to add some casts to disambiguate - types. -* Remove `RLMSyncPermissionResults`. `RLMSyncPermission`s are now vended out - using a `RLMResults`. This results collection supports all normal collection - operations except for setting values using key-value coding (since - `RLMSyncPermission`s are immutable) and the property aggregation operations. -* `RLMSyncUserInfo` has been significantly enhanced. It now contains metadata - about a user stored on the Realm Object Server, as well as a list of all user account - data associated with that user. -* Starting with Swift 4, `List` now conforms to `MutableCollection` instead of - `RangeReplaceableCollection`. For Swift 4, the empty collection initializer has been - removed, and default implementations of range replaceable collection methods that - make sense for `List` have been added. -* `List.removeLast()` now throws an exception if the list is empty, to more closely match - the behavior of the standard library's `Collection.removeLast()` implementation. -* `RealmCollection`'s associated type `Element` has been renamed `ElementType`. -* The following APIs have been renamed: - -| Old API | New API | -|:------------------------------------------------------------|:---------------------------------------------------------------| -| `NotificationToken.stop()` | `NotificationToken.invalidate()` | -| `-[RLMNotificationToken stop]` | `-[RLMNotificationToken invalidate]` | -| `RealmCollection.addNotificationBlock(_:)` | `RealmCollection.observe(_:)` | -| `RLMSyncProgress` | `RLMSyncProgressMode` | -| `List.remove(objectAtIndex:)` | `List.remove(at:)` | -| `List.swap(_:_:)` | `List.swapAt(_:_:)` | -| `SyncPermissionValue` | `SyncPermission` | -| `RLMSyncPermissionValue` | `RLMSyncPermission` | -| `-[RLMSyncPermission initWithRealmPath:userID:accessLevel]` | `-[RLMSyncPermission initWithRealmPath:identity:accessLevel:]` | -| `RLMSyncPermission.userId` | `RLMSyncPermission.identity` | -| `-[RLMRealm addOrUpdateObjectsInArray:]` | `-[RLMRealm addOrUpdateObjects:]` | - -* The following APIs have been removed: - -| Removed API | Replacement | -|:-------------------------------------------------------------|:------------------------------------------------------------------------------------------| -| `Object.className` | None, was erroneously present. | -| `RLMPropertyTypeArray` | `RLMProperty.array` | -| `PropertyType.array` | `Property.array` | -| `-[RLMArray sortedResultsUsingProperty:ascending:]` | `-[RLMArray sortedResultsUsingKeyPath:ascending:]` | -| `-[RLMCollection sortedResultsUsingProperty:ascending:]` | `-[RLMCollection sortedResultsUsingKeyPath:ascending:]` | -| `-[RLMResults sortedResultsUsingProperty:ascending:]` | `-[RLMResults sortedResultsUsingKeyPath:ascending:]` | -| `+[RLMSortDescriptor sortDescriptorWithProperty:ascending:]` | `+[RLMSortDescriptor sortDescriptorWithKeyPath:ascending:]` | -| `RLMSortDescriptor.property` | `RLMSortDescriptor.keyPath` | -| `AnyRealmCollection.sorted(byProperty:ascending:)` | `AnyRealmCollection.sorted(byKeyPath:ascending:)` | -| `List.sorted(byProperty:ascending:)` | `List.sorted(byKeyPath:ascending:)` | -| `LinkingObjects.sorted(byProperty:ascending:)` | `LinkingObjects.sorted(byKeyPath:ascending:)` | -| `Results.sorted(byProperty:ascending:)` | `Results.sorted(byKeyPath:ascending:)` | -| `SortDescriptor.init(property:ascending:)` | `SortDescriptor.init(keyPath:ascending:)` | -| `SortDescriptor.property` | `SortDescriptor.keyPath` | -| `+[RLMRealm migrateRealm:configuration:]` | `+[RLMRealm performMigrationForConfiguration:error:]` | -| `RLMSyncManager.disableSSLValidation` | `RLMSyncConfiguration.enableSSLValidation` | -| `SyncManager.disableSSLValidation` | `SyncConfiguration.enableSSLValidation` | -| `RLMSyncErrorBadResponse` | `RLMSyncAuthErrorBadResponse` | -| `RLMSyncPermissionResults` | `RLMResults` | -| `SyncPermissionResults` | `Results` | -| `RLMSyncPermissionChange` | `-[RLMSyncUser applyPermission:callback]` / `-[RLMSyncUser deletePermission:callback:]` | -| `-[RLMSyncUser permissionRealmWithError:]` | `-[RLMSyncUser retrievePermissionsWithCallback:]` | -| `RLMSyncPermissionOffer` | `-[RLMSyncUser createOfferForRealmAtURL:accessLevel:expiration:callback:]` | -| `RLMSyncPermissionOfferResponse` | `-[RLMSyncUser acceptOfferForToken:callback:]` | -| `-[NSError rlmSync_clientResetBlock]` | `-[NSError rlmSync_errorActionToken]` / `-[NSError rlmSync_clientResetBackedUpRealmPath]` | -| `-[NSError rlmSync_deleteRealmBlock]` | `-[NSError rlmSync_errorActionToken]` | - -### Enhancements -* `List` can now contain values of types `Bool`, `Int`, `Int8`, `Int16`, - `Int32`, `Int64`, `Float`, `Double`, `String`, `Data`, and `Date` (and - optional versions of all of these) in addition to `Object` subclasses. - Querying `List`s containing values other than `Object` subclasses is not yet - implemented. -* `RLMArray` can now be constrained with the protocols `RLMBool`, `RLMInt`, - `RLMFloat`, `RLMDouble`, `RLMString`, `RLMData`, and `RLMDate` in addition to - protocols defined with `RLM_ARRAY_TYPE`. By default `RLMArray`s of - non-`RLMObject` types can contain null. Indicating that the property is - required (by overriding `+requiredProperties:`) will instead make the values - within the array required. Querying `RLMArray`s containing values other than - `RLMObject` subclasses is not yet implemented. -* Add a new error code to denote 'permission denied' errors when working - with synchronized Realms, as well as an accompanying block that can be - called to inform the binding that the offending Realm's files should be - deleted immediately. This allows recovering from 'permission denied' - errors in a more robust manner. See the documentation for - `RLMSyncErrorPermissionDeniedError` for more information. -* Add Swift `Object.isSameObject(as:_)` API to perform the same function as - the existing Objective-C API `-[RLMObject isEqualToObject:]`. -* Opening a synced Realm whose local copy was created with an older version of - Realm Mobile Platfrom when a migration is not possible to the current version - will result in an `RLMErrorIncompatibleSyncedFile` / `incompatibleSyncedFile` - error. When such an error occurs, the original file is moved to a backup - location, and future attempts to open the synchronized Realm will result in a new - file being created. If you wish to migrate any data from the backup Realm you can - open it using the backup Realm configuration available on the error object. -* Add a preview of partial synchronization. Partial synchronization allows a - synchronized Realm to be opened in such a way that only objects requested by - the user are synchronized to the device. You can use it by setting the - `isPartial` property on a `SyncConfiguration`, opening the Realm, and then - calling `Realm.subscribe(to:where:callback:)` with the type of object you're - interested in, a string containing a query determining which objects you want - to subscribe to, and a callback which will report the results. You may add as - many subscriptions to a synced Realm as necessary. - -### Bugfixes -* Realm no longer throws an "unsupported instruction" exception in some cases - when opening a synced Realm asynchronously. -* Realm Swift APIs that filter or look up the index of an object based on a - format string now properly handle optional arguments in their variadic argument - list. -* `-[RLMResults indexOfObject:]` now properly accounts for access - level. -* Fix a race condition that could lead to a crash accessing to the freed configuration object - if a default configuration was set from a different thread. -* Fixed an issue that crash when enumerating after clearing data during migration. -* Fix a bug where a synced Realm couldn't be reopened even after a successful client reset - in some cases. -* Fix a bug where the sync subsystem waited too long in certain cases to reconnect to the server. -* Fix a bug where encrypted sync-related metadata was incorrectly deleted from upgrading users, - resulting in all users being logged out. -* Fix a bug where permission-related data continued to be synced to a client even after the user - that data belonged to logged out. -* Fix an issue where collection notifications might be delivered inconsistently if a notification - callback was added within another callback for the same collection. - -3.0.0-rc.2 Release notes (2017-10-14) -============================================================= - -### Enhancements -* Reinstate `RLMSyncPermissionSortPropertyUserID` to allow users to sort permissions - to their own Realms they've granted to others. - -### Bugfixes -* `-[RLMResults indexOfObject:]` now properly accounts for access - level. -* Fix a race condition that could lead to a crash accessing to the freed configuration object - if a default configuration was set from a different thread. -* Fixed an issue that crash when enumerating after clearing data during migration. -* Fix a bug where a synced Realm couldn't be reopened even after a successful client reset - in some cases. -* Fix a bug where the sync subsystem waited too long in certain cases to reconnect to the server. -* Fix a bug where encrypted sync-related metadata was incorrectly deleted from upgrading users, - resulting in all users being logged out. -* Fix a bug where permission-related data continued to be synced to a client even after the user - that data belonged to logged out. -* Fix an issue where collection notifications might be delivered inconsistently if a notification - callback was added within another callback for the same collection. - -3.0.0-rc.1 Release notes (2017-10-03) -============================================================= - -### Breaking Changes -* Remove `RLMSyncPermissionSortPropertyUserID` to reflect changes in how the - Realm Object Server reports permissions for a user. -* Remove `RLMSyncPermissionOffer` and `RLMSyncPermissionOfferResponse` classes - and associated helper methods and functions. Use the - `-[RLMSyncUser createOfferForRealmAtURL:accessLevel:expiration:callback:]` - and `-[RLMSyncUser acceptOfferForToken:callback:]` methods instead. - -### Bugfixes - -* The keychain item name used by Realm to manage the encryption keys for - sync-related metadata is now set to a per-app name based on the bundle - identifier. Keys that were previously stored within the single, shared Realm - keychain item will be transparently migrated to the per-application keychain - item. -* Fix downloading of the Realm core binaries when Xcode's command-line tools are - set as the active developer directory for command-line interactions. -* Fix a crash that could occur when resolving a ThreadSafeReference to a `List` - whose parent object had since been deleted. - -3.0.0-beta.4 Release notes (2017-09-22) -============================================================= - -### Breaking Changes - -* Rename `List.remove(objectAtIndex:)` to `List.remove(at:)` to match the name - used by 'RangeReplaceableCollection'. -* Rename `List.swap()` to `List.swapAt()` to match the name used by 'Array'. -* Loosen `RLMArray` and `RLMResults`'s generic constraint from `RLMObject` to - `NSObject`. This may result in having to add some casts to disambiguate - types. -* Remove `RLMPropertyTypeArray` in favor of a separate bool `array` property on - `RLMProperty`/`Property`. -* Remove `RLMSyncPermissionResults`. `RLMSyncPermission`s are now vended out - using a `RLMResults`. This results collection supports all normal collection - operations except for setting values using KVO (since `RLMSyncPermission`s are - immutable) and the property aggregation operations. -* `RealmCollection`'s associated type `Element` has been renamed `ElementType`. -* Realm Swift collection types (`List`, `Results`, `AnyRealmCollection`, and - `LinkingObjects` have had their generic type parameter changed from `T` to - `Element`). -* `RealmOptional`'s generic type parameter has been changed from `T` to `Value`. -* `RLMSyncUserInfo` has been significantly enhanced. It now contains metadata - about a user stored on the Realm Object Server, as well as a list of all user account - data associated with that user. -* Starting with Swift 4, `List` now conforms to `MutableCollection` instead of - `RangeReplaceableCollection`. For Swift 4, the empty collection initializer has been - removed, and default implementations of range replaceable collection methods that - make sense for `List` have been added. -* `List.removeLast()` now throws an exception if the list is empty, to more closely match - the behavior of the standard library's `Collection.removeLast()` implementation. - -### Enhancements - -* `List` can now contain values of types `Bool`, `Int`, `Int8`, `Int16`, - `Int32`, `Int64`, `Float`, `Double`, `String`, `Data`, and `Date` (and - optional versions of all of these) in addition to `Object` subclasses. - Querying `List`s containing values other than `Object` subclasses is not yet - implemented. -* `RLMArray` can now be constrained with the protocols `RLMBool`, `RLMInt`, - `RLMFloat`, `RLMDouble`, `RLMString`, `RLMData`, and `RLMDate` in addition to - protocols defined with `RLM_ARRAY_TYPE`. By default `RLMArray`s of - non-`RLMObject` types can contain null. Indicating that the property is - required (by overriding `+requiredProperties:`) will instead make the values - within the array required. Querying `RLMArray`s containing values other than - `RLMObject` subclasses is not yet implemented. -* Opening a synced Realm whose local copy was created with an older version of - Realm Mobile Platfrom when a migration is not possible to the current version - will result in an `RLMErrorIncompatibleSyncedFile` / `incompatibleSyncedFile` - error. When such an error occurs, the original file is moved to a backup - location, and future attempts to open the synchronized Realm will result in a new - file being created. If you wish to migrate any data from the backup Realm you can - open it using the backup Realm configuration available on the error object. -* Add preview support for partial synchronization. Partial synchronization is - allows a synchronized Realm to be opened in such a way that only objects - requested by the user are synchronized to the device. You can use it by setting - the `isPartial` property on a `SyncConfiguration`, opening the Realm, and then - calling `Realm.subscribe(to:where:callback:)` with the type of object you're - interested in, a string containing a query determining which objects you want - to subscribe to, and a callback which will report the results. You may add as - many subscriptions to a synced Realm as necessary. - -### Bugfixes - -* Realm Swift APIs that filter or look up the index of an object based on a - format string now properly handle optional arguments in their variadic argument - list. - -3.0.0-beta.3 Release notes (2017-08-23) -============================================================= - -### Breaking Changes - -* iOS 7 is no longer supported. -* Computed properties on Realm object types are detected and no - longer added to the automatically generated schema. -* `-[RLMRealm addOrUpdateObjectsInArray:]` has been renamed to - `-[RLMRealm addOrUpdateObjects:]` for consistency with similar methods - that add or delete objects. -* `-[RLMRealm addOrUpdateObjects:]` and `-[RLMRealm deleteObjects:]` now - require their argument to conform to `NSFastEnumeration`, to match similar - APIs that also take collections. -* Remove deprecated `{RLM}SyncPermission` and `{RLM}SyncPermissionChange` - classes. -* `{RLM}SyncPermissionValue` has been renamed to just `{RLM}SyncPermission`. - Its `userId` property has been renamed `identity`, and its - `-initWithRealmPath:userID:accessLevel:` initializer has been renamed - `-initWithRealmPath:identity:accessLevel:`. -* Remove deprecated `-[RLMSyncUser permissionRealmWithError:]` and - `SyncUser.permissionRealm()` APIs. Use the new permissions system. -* Remove deprecated error `RLMSyncErrorBadResponse`. Use - `RLMSyncAuthErrorBadResponse` instead. -* The way interactive sync errors (client reset and permission denied) - are delivered to the user has been changed. Instead of a block which can - be invoked to immediately delete the offending Realm file, an opaque - token object of type `RLMSyncErrorActionToken` will be returned in the - error object's `userInfo` dictionary. This error object can be passed - into the new `+[RLMSyncSession immediatelyHandleError:]` API to delete - the files. -* Remove `-[NSError rlmSync_clientResetBlock]` and - `-[NSError rlmSync_deleteRealmBlock]` APIs. -* The return types of the `SyncError.clientResetInfo()` and - `SyncError.deleteRealmUserInfo()` APIs have been changed. They now return - `RLMSyncErrorActionToken`s or `SyncError.ActionToken`s instead of closures. -* The (erroneously added) instance property `Object.className` has been - removed. -* The class methods `Object.className()`, `Object.objectUtilClass()`, and - the property `Object.isInvalidated` can no longer be overriden. -* The callback which runs when a sync user login succeeds or fails - now runs on the main queue by default, or can be explicitly specified - by a new `callbackQueue` parameter on the `{RLM}SyncUser.logIn(...)` API. -* Rename `{RLM}NotificationToken.stop()` to `invalidate()` and - `{RealmCollection,SyncPermissionResults}.addNotificationBlock(_:)` to - `observe(_:)` to mirror Foundation's new KVO APIs. -* The `RLMSyncProgress` enum has been renamed `RLMSyncProgressMode`. -* Remove deprecated `{RLM}SyncManager.disableSSLValidation` property. Disable - SSL validation on a per-Realm basis by setting the `enableSSLValidation` - property on `{RLM}SyncConfiguration` instead. -* Fix empty strings, binary data, and null on the right side of `BEGINSWITH`, - `ENDSWITH` and `CONTAINS` operators in predicates to match Foundation's - semantics of never matching any strings or data. -* Swift `Object` comparison and hashing behavior now works the same way as - that of `RLMObject` (objects are now only considered equatable if their - model class defines a primary key). -* Fix the way the hash property works on `Object` when the object model has - no primary key. -* Fix an issue where if a Swift model class defined non-generic managed - properties after generic Realm properties (like `List`), the schema - would be constructed incorrectly. Fixes an issue where creating such - models from an array could fail. - -### Enhancements - -* Add Swift `Object.isSameObject(as:_)` API to perform the same function as - the existing Objective-C API `-[RLMObject isEqualToObject:]`. -* Expose additional authentication-related errors that might be reported by - a Realm Object Server. -* An error handler can now be registered on `{RLM}SyncUser`s in order to - report authentication-related errors that affect the user. - -### Bugfixes - -* Sync users are now automatically logged out upon receiving certain types - of errors that indicate they are no longer logged into the server. For - example, users who are authenticated using third-party credentials will find - themselves logged out of the Realm Object Server if the third-party identity - service indicates that their credential is no longer valid. -* Address high CPU usage and hangs in certain cases when processing collection - notifications in highly-connected object graphs. - -3.0.0-beta.2 Release notes (2017-07-26) -============================================================= - -### Breaking Changes - -* Remove the following deprecated Objective-C APIs: - `-[RLMArray sortedResultsUsingProperty:ascending:]`, - `-[RLMCollection sortedResultsUsingProperty:ascending:]`, - `-[RLMResults sortedResultsUsingProperty:ascending:]`, - `+[RLMSortDescriptor sortDescriptorWithProperty:ascending:]`, - `RLMSortDescriptor.property`. - These APIs have been superseded by equivalent APIs that take - or return key paths instead of property names. -* Remove the following deprecated Objective-C API: - `+[RLMRealm migrateRealm:configuration:]`. - Please use `+[RLMRealm performMigrationForConfiguration:error:]` instead. -* Remove the following deprecated Swift APIs: - `AnyRealmCollection.sorted(byProperty:, ascending:)`, - `LinkingObjects.sorted(byProperty:, ascending:)`, - `List.sorted(byProperty:, ascending:)`, - `Results.sorted(byProperty:, ascending:)`, - `SortDescriptor.init(property:, ascending:)`, - `SortDescriptor.property`. - These APIs have been superseded by equivalent APIs that take - or return key paths instead of property names. -* The Objective-C and Swift `create(_:, value: update:)` APIs now - correctly nil out nullable properties when updating an existing - object when the `value` argument specifies nil or `NSNull` for - the property value. - -### Enhancements - -* It is now possible to create and log in multiple Realm Object Server users - with the same identity if they originate from different servers. Note that - if the URLs are different aliases for the same authentication server each - user will still be treated as separate (e.g. they will have their own copy - of each synchronized Realm opened using them). It is highly encouraged that - users defined using the access token credential type be logged in with an - authentication server URL specified; this parameter will become mandatory - in a future version of the SDK. -* Add `-[RLMSyncUser retrieveInfoForUser:identityProvider:completion:]` - API allowing administrator users to retrieve information about a user based - on their provider identity (for example, a username). Requires any edition - of the Realm Object Server 1.8.2 or later. - -### Bugfixes - -* Realm no longer throws an "unsupported instruction" exception in some cases - when opening a synced Realm asynchronously. - -3.0.0-beta Release notes (2017-07-14) -============================================================= - -### Breaking Changes - -* Synchronized Realms require a server running Realm Object Server v2.0 or higher. - -### Enhancements - -* Add a new error code to denote 'permission denied' errors when working - with synchronized Realms, as well as an accompanying block that can be - called to inform the binding that the offending Realm's files should be - deleted immediately. This allows recovering from 'permission denied' - errors in a more robust manner. See the documentation for - `RLMSyncErrorPermissionDeniedError` for more information. -* Add `-[RLMSyncPermissionValue initWithRealmPath:username:accessLevel:]` - API allowing permissions to be applied to a user based on their username - (usually, an email address). Requires any edition of the Realm Object - Server 1.6.0 or later. -* Improve performance of creating Swift objects which contain at least one List - property. - -### Bugfixes - -* `List.description` now reports the correct types for nested lists. -* Fix unmanaged object initialization when a nested property type returned - `false` from `Object.shouldIncludeInDefaultSchema()`. -* Don't clear RLMArrays on self-assignment. - -2.10.2 Release notes (2017-09-27) -============================================================= - -### Bugfixes - -* The keychain item name used by Realm to manage the encryption keys for - sync-related metadata is now set to a per-app name based on the bundle - identifier. Keys that were previously stored within the single, shared Realm - keychain item will be transparently migrated to the per-application keychain - item. -* Fix downloading of the Realm core binaries when Xcode's command-line tools are - set as the active developer directory for command-line interactions. -* Fix a crash that could occur when resolving a ThreadSafeReference to a `List` - whose parent object had since been deleted. - -2.10.1 Release notes (2017-09-14) -============================================================= - -Swift binaries are now produced for Swift 3.0, 3.0.1, 3.0.2, 3.1, 3.2 and 4.0. - -### Enhancements - -* Auxiliary files are excluded from backup by default. - -### Bugfixes - -* Fix more cases where assigning an RLMArray property to itself would clear the - RLMArray. - -2.10.0 Release notes (2017-08-21) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Expose additional authentication-related errors that might be reported by - a Realm Object Server. -* An error handler can now be registered on `{RLM}SyncUser`s in order to - report authentication-related errors that affect the user. - -### Bugfixes - -* Sorting Realm collection types no longer throws an exception on iOS 7. -* Sync users are now automatically logged out upon receiving certain types - of errors that indicate they are no longer logged into the server. For - example, users who are authenticated using third-party credentials will find - themselves logged out of the Realm Object Server if the third-party identity - service indicates that their credential is no longer valid. -* Address high CPU usage and hangs in certain cases when processing collection - notifications in highly-connected object graphs. - -2.9.1 Release notes (2017-08-01) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* The `shouldCompactOnLaunch` block is no longer invoked if the Realm at that - path is already open on other threads. -* Fix an assertion failure in collection notifications when changes are made to - the schema via sync while the notification block is active. - -2.9.0 Release notes (2017-07-26) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Add a new error code to denote 'permission denied' errors when working - with synchronized Realms, as well as an accompanying block that can be - called to inform the binding that the offending Realm's files should be - deleted immediately. This allows recovering from 'permission denied' - errors in a more robust manner. See the documentation for - `RLMSyncErrorPermissionDeniedError` for more information. -* Add `-[RLMSyncPermissionValue initWithRealmPath:username:accessLevel:]` - API allowing permissions to be applied to a user based on their username - (usually, an email address). Requires any edition of the Realm Object - Server 1.6.0 or later. -* Improve performance of creating Swift objects which contain at least one List - property. -* It is now possible to create and log in multiple Realm Object Server users - with the same identity if they originate from different servers. Note that - if the URLs are different aliases for the same authentication server each - user will still be treated as separate (e.g. they will have their own copy - of each synchronized Realm opened using them). It is highly encouraged that - users defined using the access token credential type be logged in with an - authentication server URL specified; this parameter will become mandatory - in a future version of the SDK. -* Add `-[RLMSyncUser retrieveInfoForUser:identityProvider:completion:]` - API allowing administrator users to retrieve information about a user based - on their provider identity (for example, a username). Requires any edition - of the Realm Object Server 1.8.2 or later. - -### Bugfixes - -* `List.description` now reports the correct types for nested lists. -* Fix unmanaged object initialization when a nested property type returned - `false` from `Object.shouldIncludeInDefaultSchema()`. -* Don't clear RLMArrays on self-assignment. - -2.8.3 Release notes (2017-06-20) -============================================================= - -### Bugfixes - -* Properly update RealmOptional properties when adding an object with `add(update: true)`. -* Add some missing quotes in error messages. -* Fix a performance regression when creating objects with primary keys. - -2.8.2 Release notes (2017-06-16) -============================================================= - -### Bugfixes - -* Fix an issue where synchronized Realms would eventually disconnect from the - remote server if the user object used to define their sync configuration - was destroyed. -* Restore support for changing primary keys in migrations (broken in 2.8.0). -* Revert handling of adding objects with nil properties to a Realm to the - pre-2.8.0 behavior. - -2.8.1 Release notes (2017-06-12) -============================================================= - -Add support for building with Xcode 9 Beta 1. - -### Bugfixes - -* Fix setting a float property to NaN. -* Fix a crash when using compact on launch in combination with collection - notifications. - -2.8.0 Release notes (2017-06-02) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Enable encryption on watchOS. -* Add `-[RLMSyncUser changePassword:forUserID:completion:]` API to change an - arbitrary user's password if the current user has administrative privileges - and using Realm's 'password' authentication provider. - Requires any edition of the Realm Object Server 1.6.0 or later. - -### Bugfixes - -* Suppress `-Wdocumentation` warnings in Realm C++ headers when using CocoaPods - with Xcode 8.3.2. -* Throw an appropriate error rather than crashing when an RLMArray is assigned - to an RLMArray property of a different type. -* Fix crash in large (>4GB) encrypted Realm files. -* Improve accuracy of sync progress notifications. -* Fix an issue where synchronized Realms did not connect to the remote server - in certain situations, such as when an application was offline when the Realms - were opened but later regained network connectivity. - -2.7.0 Release notes (2017-05-03) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Use reachability API to minimize the reconnection delay if the network - connection was lost. -* Add `-[RLMSyncUser changePassword:completion:]` API to change the current - user's password if using Realm's 'password' authentication provider. - Requires any edition of the Realm Object Server 1.4.0 or later. -* `{RLM}SyncConfiguration` now has an `enableSSLValidation` property - (and default parameter in the Swift initializer) to allow SSL validation - to be specified on a per-server basis. -* Transactions between a synced Realm and a Realm Object Server can now - exceed 16 MB in size. -* Add new APIs for changing and retrieving permissions for synchronized Realms. - These APIs are intended to replace the existing Realm Object-based permissions - system. Requires any edition of the Realm Object Server 1.1.0 or later. - -### Bugfixes - -* Support Realm model classes defined in Swift with overridden Objective-C - names (e.g. `@objc(Foo) class SwiftFoo: Object {}`). -* Fix `-[RLMMigration enumerateObjects:block:]` returning incorrect `oldObject` - objects when enumerating a class name after previously deleting a `newObject`. -* Fix an issue where `Realm.asyncOpen(...)` would fail to work when opening a - synchronized Realm for which the user only had read permissions. -* Using KVC to set a `List` property to `nil` now clears it to match the - behavior of `RLMArray` properties. -* Fix crash from `!m_awaiting_pong` assertion failure when using synced Realms. -* Fix poor performance or hangs when performing case-insensitive queries on - indexed string properties that contain many characters that don't differ - between upper and lower case (e.g., numbers, punctuation). - -2.6.2 Release notes (2017-04-21) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix an issue where calling `Realm.asyncOpen(...)` with a synchronized Realm - configuration would fail with an "Operation canceled" error. -* Fix initial collection notification sometimes not being delivered for synced - Realms. -* Fix circular links sometimes resulting in objects not being marked as - modified in change notifications. - -2.6.1 Release notes (2017-04-18) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix an issue where calling `Realm.asyncOpen(...)` with a synchronized Realm - configuration would crash in error cases rather than report the error. - This is a small source breaking change if you were relying on the error - being reported to be a `Realm.Error`. - -2.6.0 Release notes (2017-04-18) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Add a `{RLM}SyncUser.isAdmin` property indicating whether a user is a Realm - Object Server administrator. -* Add an API to asynchronously open a Realm and deliver it to a block on a - given queue. This performs all work needed to get the Realm to - a usable state (such as running potentially time-consuming migrations) on a - background thread before dispatching to the given queue. In addition, - synchronized Realms wait for all remote content available at the time the - operation began to be downloaded and available locally. -* Add `shouldCompactOnLaunch` block property when configuring a Realm to - determine if it should be compacted before being returned. -* Speed up case-insensitive queries on indexed string properties. -* Add RLMResults's collection aggregate methods to RLMArray. -* Add support for calling the aggregate methods on unmanaged Lists. - -### Bugfixes - -* Fix a deadlock when multiple processes open a Realm at the same time. -* Fix `value(forKey:)`/`value(forKeyPath:)` returning incorrect values for `List` properties. - -2.5.1 Release notes (2017-04-05) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix CocoaPods installation with static libraries and multiple platforms. -* Fix uncaught "Bad version number" exceptions on the notification worker thread - followed by deadlocks when Realms refresh. - -2.5.0 Release notes (2017-03-28) -============================================================= - -Files written by Realm this version cannot be read by earlier versions of Realm. -Old files can still be opened and files open in read-only mode will not be -modified. - -If using synchronized Realms, the Realm Object Server must be running version -1.3.0 or later. - -Swift binaries are now produced for Swift 3.0, 3.0.1, 3.0.2 and 3.1. - -### API Breaking Changes - -* None. - -### Enhancements - -* Add support for multi-level object equality comparisons against `NULL`. -* Add support for the `[d]` modifier on string comparison operators to perform - diacritic-insensitive comparisons. -* Explicitly mark `[[RLMRealm alloc] init]` as unavailable. -* Include the name of the problematic class in the error message when an - invalid property type is marked as the primary key. - -### Bugfixes - -* Fix incorrect column type assertions which could occur after schemas were - merged by sync. -* Eliminate an empty write transaction when opening a synced Realm. -* Support encrypting synchronized Realms by respecting the `encryptionKey` value - of the Realm's configuration. -* Fix crash when setting an `{NS}Data` property close to 16MB. -* Fix for reading `{NS}Data` properties incorrectly returning `nil`. -* Reduce file size growth in cases where Realm versions were pinned while - starting write transactions. -* Fix an assertion failure when writing to large `RLMArray`/`List` properties. -* Fix uncaught `BadTransactLog` exceptions when pulling invalid changesets from - synchronized Realms. -* Fix an assertion failure when an observed `RLMArray`/`List` is deleted after - being modified. - -2.4.4 Release notes (2017-03-13) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Add `(RLM)SyncPermission` class to allow reviewing access permissions for - Realms. Requires any edition of the Realm Object Server 1.1.0 or later. -* Further reduce the number of files opened per thread-specific Realm on macOS, - iOS and watchOS. - -### Bugfixes - -* Fix a crash that could occur if new Realm instances were created while the - application was exiting. -* Fix a bug that could lead to bad version number errors when delivering - change notifications. -* Fix a potential use-after-free bug when checking validity of results. -* Fix an issue where a sync session might not close properly if it receives - an error while being torn down. -* Fix some issues where a sync session might not reconnect to the server properly - or get into an inconsistent state if revived after invalidation. -* Fix an issue where notifications might not fire when the children of an - observed object are changed. -* Fix an issue where progress notifications on sync sessions might incorrectly - report out-of-date values. -* Fix an issue where multiple threads accessing encrypted data could result in - corrupted data or crashes. -* Fix an issue where certain `LIKE` queries could hang. -* Fix an issue where `-[RLMRealm writeCopyToURL:encryptionKey:error]` could create - a corrupt Realm file. -* Fix an issue where incrementing a synced Realm's schema version without actually - changing the schema could cause a crash. - -2.4.3 Release notes (2017-02-20) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Avoid copying copy-on-write data structures, which can grow the file, when the - write does not actually change existing values. -* Improve performance of deleting all objects in an RLMResults. -* Reduce the number of files opened per thread-specific Realm on macOS. -* Improve startup performance with large numbers of `RLMObject`/`Object` - subclasses. - -### Bugfixes - -* Fix synchronized Realms not downloading remote changes when an access token - expires and there are no local changes to upload. -* Fix an issue where values set on a Realm object using `setValue(value:, forKey:)` - that were not themselves Realm objects were not properly converted into Realm - objects or checked for validity. -* Fix an issue where `-[RLMSyncUser sessionForURL:]` could erroneously return a - non-nil value when passed in an invalid URL. -* `SyncSession.Progress.fractionTransferred` now returns 1 if there are no - transferrable bytes. -* Fix sync progress notifications registered on background threads by always - dispatching on a dedicated background queue. -* Fix compilation issues with Xcode 8.3 beta 2. -* Fix incorrect sync progress notification values for Realms originally created - using a version of Realm prior to 2.3.0. -* Fix LLDB integration to be able to display summaries of `RLMResults` once more. -* Reject Swift properties with names which cause them to fall in to ARC method - families rather than crashing when they are accessed. -* Fix sorting by key path when the declared property order doesn't match the order - of properties in the Realm file, which can happen when properties are added in - different schema versions. - -2.4.2 Release notes (2017-01-30) -============================================================= - -### Bugfixes - -* Fix an issue where RLMRealm instances could end up in the autorelease pool - for other threads. - -2.4.1 Release notes (2017-01-27) -============================================================= - -### Bugfixes - -* Fix an issue where authentication tokens were not properly refreshed - automatically before expiring. - -2.4.0 Release notes (2017-01-26) -============================================================= - -This release drops support for compiling with Swift 2.x. -Swift 3.0.0 is now the minimum Swift version supported. - -### API Breaking Changes - -* None. - -### Enhancements - -* Add change notifications for individual objects with an API similar to that - of collection notifications. - -### Bugfixes - -* Fix Realm Objective-C compilation errors with Xcode 8.3 beta 1. -* Fix several error handling issues when renewing expired authentication - tokens for synchronized Realms. -* Fix a race condition leading to bad_version exceptions being thrown in - Realm's background worker thread. - -2.3.0 Release notes (2017-01-19) -============================================================= - -### Sync Breaking Changes - -* Make `PermissionChange`'s `id` property a primary key. - -### API Breaking Changes - -* None. - -### Enhancements - -* Add `SyncPermissionOffer` and `SyncPermissionOfferResponse` classes to allow - creating and accepting permission change events to synchronized Realms between - different users. -* Support monitoring sync transfer progress by registering notification blocks - on `SyncSession`. Specify the transfer direction (`.upload`/`.download`) and - mode (`.reportIndefinitely`/`.forCurrentlyOutstandingWork`) to monitor. - -### Bugfixes - -* Fix a call to `commitWrite(withoutNotifying:)` committing a transaction that - would not have triggered a notification incorrectly skipping the next - notification. -* Fix incorrect results and crashes when conflicting object insertions are - merged by the synchronization mechanism when there is a collection - notification registered for that object type. - -2.2.0 Release notes (2017-01-12) -============================================================= - -### Sync Breaking Changes (In Beta) - -* Sync-related error reporting behavior has been changed. Errors not related - to a particular user or session are only reported if they are classed as - 'fatal' by the underlying sync engine. -* Added `RLMSyncErrorClientResetError` to `RLMSyncError` enum. - -### API Breaking Changes - -* The following Objective-C APIs have been deprecated in favor of newer or preferred versions: - -| Deprecated API | New API | -|:------------------------------------------------------------|:------------------------------------------------------------| -| `-[RLMArray sortedResultsUsingProperty:]` | `-[RLMArray sortedResultsUsingKeyPath:]` | -| `-[RLMCollection sortedResultsUsingProperty:]` | `-[RLMCollection sortedResultsUsingKeyPath:]` | -| `-[RLMResults sortedResultsUsingProperty:]` | `-[RLMResults sortedResultsUsingKeyPath:]` | -| `+[RLMSortDescriptor sortDescriptorWithProperty:ascending]` | `+[RLMSortDescriptor sortDescriptorWithKeyPath:ascending:]` | -| `RLMSortDescriptor.property` | `RLMSortDescriptor.keyPath` | - -* The following Swift APIs have been deprecated in favor of newer or preferred versions: - -| Deprecated API | New API | -|:------------------------------------------------------|:-------------------------------------------------| -| `LinkingObjects.sorted(byProperty:ascending:)` | `LinkingObjects.sorted(byKeyPath:ascending:)` | -| `List.sorted(byProperty:ascending:)` | `List.sorted(byKeyPath:ascending:)` | -| `RealmCollection.sorted(byProperty:ascending:)` | `RealmCollection.sorted(byKeyPath:ascending:)` | -| `Results.sorted(byProperty:ascending:)` | `Results.sorted(byKeyPath:ascending:)` | -| `SortDescriptor(property:ascending:)` | `SortDescriptor(keyPath:ascending:)` | -| `SortDescriptor.property` | `SortDescriptor.keyPath` | - -### Enhancements - -* Introduce APIs for safely passing objects between threads. Create a - thread-safe reference to a thread-confined object by passing it to the - `+[RLMThreadSafeReference referenceWithThreadConfined:]`/`ThreadSafeReference(to:)` - constructor, which you can then safely pass to another thread to resolve in - the new Realm with `-[RLMRealm resolveThreadSafeReference:]`/`Realm.resolve(_:)`. -* Realm collections can now be sorted by properties over to-one relationships. -* Optimized `CONTAINS` queries to use Boyer-Moore algorithm - (around 10x speedup on large datasets). - -### Bugfixes - -* Setting `deleteRealmIfMigrationNeeded` now also deletes the Realm if a file - format migration is required, such as when moving from a file last accessed - with Realm 0.x to 1.x, or 1.x to 2.x. -* Fix queries containing nested `SUBQUERY` expressions. -* Fix spurious incorrect thread exceptions when a thread id happens to be - reused while an RLMRealm instance from the old thread still exists. -* Fixed various bugs in aggregate methods (max, min, avg, sum). - -2.1.2 Release notes (2016--12-19) -============================================================= - -This release adds binary versions of Swift 3.0.2 frameworks built with Xcode 8.2. - -### Sync Breaking Changes (In Beta) - -* Rename occurences of "iCloud" with "CloudKit" in APIs and comments to match - naming in the Realm Object Server. - -### API Breaking Changes - -* None. - -### Enhancements - -* Add support for 'LIKE' queries (wildcard matching). - -### Bugfixes - -* Fix authenticating with CloudKit. -* Fix linker warning about "Direct access to global weak symbol". - -2.1.1 Release notes (2016-12-02) -============================================================= - -### Enhancements - -* Add `RealmSwift.ObjectiveCSupport.convert(object:)` methods to help write - code that interoperates between Realm Objective-C and Realm Swift APIs. -* Throw exceptions when opening a Realm with an incorrect configuration, like: - * `readOnly` set with a sync configuration. - * `readOnly` set with a migration block. - * migration block set with a sync configuration. -* Greatly improve performance of write transactions which make a large number of - changes to indexed properties, including the automatic migration when opening - files written by Realm 1.x. - -### Bugfixes - -* Reset sync metadata Realm in case of decryption error. -* Fix issue preventing using synchronized Realms in Xcode Playgrounds. -* Fix assertion failure when migrating a model property from object type to - `RLMLinkingObjects` type. -* Fix a `LogicError: Bad version number` exception when using `RLMResults` with - no notification blocks and explicitly called `-[RLMRealm refresh]` from that - thread. -* Logged-out users are no longer returned from `+[RLMSyncUser currentUser]` or - `+[RLMSyncUser allUsers]`. -* Fix several issues which could occur when the 1001st object of a given type - was created or added to an RLMArray/List, including crashes when rerunning - existing queries and possibly data corruption. -* Fix a potential crash when the application exits due to a race condition in - the destruction of global static variables. -* Fix race conditions when waiting for sync uploads or downloads to complete - which could result in crashes or the callback being called too early. - -2.1.0 Release notes (2016-11-18) -============================================================= - -### Sync Breaking Changes (In Beta) - -* None. - -### API breaking changes - -* None. - -### Enhancements - -* Add the ability to skip calling specific notification blocks when committing - a write transaction. - -### Bugfixes - -* Deliver collection notifications when beginning a write transaction which - advances the read version of a Realm (previously only Realm-level - notifications were sent). -* Fix some scenarios which would lead to inconsistent states when using - collection notifications. -* Fix several race conditions in the notification functionality. -* Don't send Realm change notifications when canceling a write transaction. - -2.0.4 Release notes (2016-11-14) -============================================================= - -### Sync Breaking Changes (In Beta) - -* Remove `RLMAuthenticationActions` and replace - `+[RLMSyncCredential credentialWithUsername:password:actions:]` with - `+[RLMSyncCredential credentialsWithUsername:password:register:]`. -* Rename `+[RLMSyncUser authenticateWithCredential:]` to - `+[RLMSyncUser logInWithCredentials:]`. -* Rename "credential"-related types and methods to - `RLMSyncCredentials`/`SyncCredentials` and consistently refer to credentials - in the plural form. -* Change `+[RLMSyncUser all]` to return a dictionary of identifiers to users and - rename to: - * `+[RLMSyncUser allUsers]` in Objective-C. - * `SyncUser.allUsers()` in Swift 2. - * `SyncUser.all` in Swift 3. -* Rename `SyncManager.sharedManager()` to `SyncManager.shared` in Swift 3. -* Change `Realm.Configuration.syncConfiguration` to take a `SyncConfiguration` - struct rather than a named tuple. -* `+[RLMSyncUser logInWithCredentials:]` now invokes its callback block on a - background queue. - -### API breaking changes - -* None. - -### Enhancements - -* Add `+[RLMSyncUser currentUser]`. -* Add the ability to change read, write and management permissions for - synchronized Realms using the management Realm obtained via the - `-[RLMSyncUser managementRealmWithError:]` API and the - `RLMSyncPermissionChange` class. - -### Bugfixes - -* None. - -2.0.3 Release notes (2016-10-27) -============================================================= - -This release adds binary versions of Swift 3.0.1 frameworks built with Xcode 8.1 -GM seed. - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix a `BadVersion` exception caused by a race condition when delivering - collection change notifications. -* Fix an assertion failure when additional model classes are added and - `deleteRealmIfMigrationNeeded` is enabled. -* Fix a `BadTransactLog` exception when deleting an `RLMResults` in a synced - Realm. -* Fix an assertion failure when a write transaction is in progress at the point - of process termination. -* Fix a crash that could occur when working with a `RLMLinkingObject` property - of an unmanaged object. - -2.0.2 Release notes (2016-10-05) -============================================================= - -This release is not protocol-compatible with previous version of the Realm -Mobile Platform. - -### API breaking changes - -* Rename Realm Swift's `User` to `SyncUser` to make clear that it relates to the - Realm Mobile Platform, and to avoid potential conflicts with other `User` types. - -### Bugfixes - -* Fix Realm headers to be compatible with pre-C++11 dialects of Objective-C++. -* Fix incorrect merging of RLMArray/List changes when objects with the same - primary key are created on multiple devices. -* Fix bad transaction log errors after deleting objects on a different device. -* Fix a BadVersion error when a background worker finishes running while older - results from that worker are being delivered to a different thread. - -2.0.1 Release notes (2016-09-29) -============================================================= - -### Bugfixes - -* Fix an assertion failure when opening a Realm file written by a 1.x version - of Realm which has an indexed nullable int or bool property. - -2.0.0 Release notes (2016-09-27) -============================================================= - -This release introduces support for the Realm Mobile Platform! -See for an overview -of these great new features. - -### API breaking changes - -* By popular demand, `RealmSwift.Error` has been moved from the top-level - namespace into a `Realm` extension and is now `Realm.Error`, so that it no - longer conflicts with `Swift.Error`. -* Files written by Realm 2.0 cannot be read by 1.x or earlier versions. Old - files can still be opened. - -### Enhancements - -* The .log, .log_a and .log_b files no longer exist and the state tracked in - them has been moved to the main Realm file. This reduces the number of open - files needed by Realm, improves performance of both opening and writing to - Realms, and eliminates a small window where committing write transactions - would prevent other processes from opening the file. - -### Bugfixes - -* Fix an assertion failure when sorting by zero properties. -* Fix a mid-commit crash in one process also crashing all other processes with - the same Realm open. -* Properly initialize new nullable float and double properties added to - existing objects to null rather than 0. -* Fix a stack overflow when objects with indexed string properties had very - long common prefixes. -* Fix a race condition which could lead to crashes when using async queries or - collection notifications. -* Fix a bug which could lead to incorrect state when an object which links to - itself is deleted from the Realm. - -1.1.0 Release notes (2016-09-16) -============================================================= - -This release brings official support for Xcode 8, Swift 2.3 and Swift 3.0. -Prebuilt frameworks are now built with Xcode 7.3.1 and Xcode 8.0. - -### API breaking changes - -* Deprecate `migrateRealm:` in favor of new `performMigrationForConfiguration:error:` method - that follows Cocoa's NSError conventions. -* Fix issue where `RLMResults` used `id `instead of its generic type as the return - type of subscript. - -### Enhancements - -* Improve error message when using NSNumber incorrectly in Swift models. -* Further reduce the download size of the prebuilt static libraries. -* Improve sort performance, especially on non-nullable columns. -* Allow partial initialization of object by `initWithValue:`, deferring - required property checks until object is added to Realm. - -### Bugfixes - -* Fix incorrect truncation of the constant value for queries of the form - `column < value` for `float` and `double` columns. -* Fix crash when an aggregate is accessed as an `Int8`, `Int16`, `Int32`, or `Int64`. -* Fix a race condition that could lead to a crash if an RLMArray or List was - deallocated on a different thread than it was created on. -* Fix a crash when the last reference to an observed object is released from - within the observation. -* Fix a crash when `initWithValue:` is used to create a nested object for a class - with an uninitialized schema. -* Enforce uniqueness for `RealmOptional` primary keys when using the `value` setter. - -1.0.2 Release notes (2016-07-13) -============================================================= - -### API breaking changes - -* Attempting to add an object with no properties to a Realm now throws rather than silently - doing nothing. - -### Enhancements - -* Swift: A `write` block may now `throw`, reverting any changes already made in - the transaction. -* Reduce address space used when committing write transactions. -* Significantly reduce the download size of prebuilt binaries and slightly - reduce the final size contribution of Realm to applications. -* Improve performance of accessing RLMArray properties and creating objects - with List properties. - -### Bugfixes - -* Fix a crash when reading the shared schema from an observed Swift object. -* Fix crashes or incorrect results when passing an array of values to - `createOrUpdate` after reordering the class's properties. -* Ensure that the initial call of a Results notification block is always passed - .Initial even if there is a write transaction between when the notification - is added and when the first notification is delivered. -* Fix a crash when deleting all objects in a Realm while fast-enumerating query - results from that Realm. -* Handle EINTR from flock() rather than crashing. -* Fix incorrect behavior following a call to `[RLMRealm compact]`. -* Fix live updating and notifications for Results created from a predicate involving - an inverse relationship to be triggered when an object at the other end of the relationship - is modified. - -1.0.1 Release notes (2016-06-12) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Significantly improve performance of opening Realm files, and slightly - improve performance of committing write transactions. - -### Bugfixes - -* Swift: Fix an error thrown when trying to create or update `Object` instances via - `add(:_update:)` with a primary key property of type `RealmOptional`. -* Xcode playground in Swift release zip now runs successfully. -* The `key` parameter of `Realm.objectForPrimaryKey(_:key:)`/ `Realm.dynamicObjectForPrimaryKey(_:key:)` - is now marked as optional. -* Fix a potential memory leak when closing Realms after a Realm file has been - opened on multiple threads which are running in active run loops. -* Fix notifications breaking on tvOS after a very large number of write - transactions have been committed. -* Fix a "Destruction of mutex in use" assertion failure after an error while - opening a file. -* Realm now throws an exception if an `Object` subclass is defined with a managed Swift `lazy` property. - Objects with ignored `lazy` properties should now work correctly. -* Update the LLDB script to work with recent changes to the implementation of `RLMResults`. -* Fix an assertion failure when a Realm file is deleted while it is still open, - and then a new Realm is opened at the same path. Note that this is still not - a supported scenario, and may break in other ways. - -1.0.0 Release notes (2016-05-25) -============================================================= - -No changes since 0.103.2. - -0.103.2 Release notes (2016-05-24) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Improve the error messages when an I/O error occurs in `writeCopyToURL`. - -### Bugfixes - -* Fix an assertion failure which could occur when opening a Realm after opening - that Realm failed previously in some specific ways in the same run of the - application. -* Reading optional integers, floats, and doubles from within a migration block - now correctly returns `nil` rather than 0 when the stored value is `nil`. - -0.103.1 Release notes (2016-05-19) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix a bug that sometimes resulted in a single object's NSData properties - changing from `nil` to a zero-length non-`nil` NSData when a different object - of the same type was deleted. - -0.103.0 Release notes (2016-05-18) -============================================================= - -### API breaking changes - -* All functionality deprecated in previous releases has been removed entirely. -* Support for Xcode 6.x & Swift prior to 2.2 has been completely removed. -* `RLMResults`/`Results` now become empty when a `RLMArray`/`List` or object - they depend on is deleted, rather than throwing an exception when accessed. -* Migrations are no longer run when `deleteRealmIfMigrationNeeded` is set, - recreating the file instead. - -### Enhancements - -* Added `invalidated` properties to `RLMResults`/`Results`, `RLMLinkingObjects`/`LinkingObjects`, - `RealmCollectionType` and `AnyRealmCollection`. These properties report whether the Realm - the object is associated with has been invalidated. -* Some `NSError`s created by Realm now have more descriptive user info payloads. - -### Bugfixes - -* None. - -0.102.1 Release notes (2016-05-13) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Return `RLMErrorSchemaMismatch` error rather than the more generic `RLMErrorFail` - when a migration is required. -* Improve the performance of allocating instances of `Object` subclasses - that have `LinkingObjects` properties. - -### Bugfixes - -* `RLMLinkingObjects` properties declared in Swift subclasses of `RLMObject` - now work correctly. -* Fix an assertion failure when deleting all objects of a type, inserting more - objects, and then deleting some of the newly inserted objects within a single - write transaction when there is an active notification block for a different - object type which links to the objects being deleted. -* Fix crashes and/or incorrect results when querying over multiple levels of - `LinkingObjects` properties. -* Fix opening read-only Realms on multiple threads at once. -* Fix a `BadTransactLog` exception when storing dates before the unix epoch (1970-01-01). - -0.102.0 Release notes (2016-05-09) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Add a method to rename properties during migrations: - * Swift: `Migration.renamePropertyForClass(_:oldName:newName:)` - * Objective-C: `-[RLMMigration renamePropertyForClass:oldName:newName:]` -* Add `deleteRealmIfMigrationNeeded` to - `RLMRealmConfiguration`/`Realm.Configuration`. When this is set to `true`, - the Realm file will be automatically deleted and recreated when there is a - schema mismatch rather than migrated to the new schema. - -### Bugfixes - -* Fix `BETWEEN` queries that traverse `RLMArray`/`List` properties to ensure that - a single related object satisfies the `BETWEEN` criteria, rather than allowing - different objects in the array to satisfy the lower and upper bounds. -* Fix a race condition when a Realm is opened on one thread while it is in the - middle of being closed on another thread which could result in crashes. -* Fix a bug which could result in changes made on one thread being applied - incorrectly on other threads when those threads are refreshed. -* Fix crash when migrating to the new date format introduced in 0.101.0. -* Fix crash when querying inverse relationships when objects are deleted. - -0.101.0 Release notes (2016-05-04) -============================================================= - -### API breaking changes - -* Files written by this version of Realm cannot be read by older versions of - Realm. Existing files will automatically be upgraded when they are opened. - -### Enhancements - -* Greatly improve performance of collection change calculation for complex - object graphs, especially for ones with cycles. -* NSDate properties now support nanoseconds precision. -* Opening a single Realm file on multiple threads now shares a single memory - mapping of the file for all threads, significantly reducing the memory - required to work with large files. -* Crashing while in the middle of a write transaction no longer blocks other - processes from performing write transactions on the same file. -* Improve the performance of refreshing a Realm (including via autorefresh) - when there are live Results/RLMResults objects for that Realm. - -### Bugfixes - -* Fix an assertion failure of "!more_before || index >= std::prev(it)->second)" - in `IndexSet::do_add()`. -* Fix a crash when an `RLMArray` or `List` object is destroyed from the wrong - thread. - -0.100.0 Release notes (2016-04-29) -============================================================= - -### API breaking changes - -* `-[RLMObject linkingObjectsOfClass:forProperty]` and `Object.linkingObjects(_:forProperty:)` - are deprecated in favor of properties of type `RLMLinkingObjects` / `LinkingObjects`. - -### Enhancements - -* The automatically-maintained inverse direction of relationships can now be exposed as - properties of type `RLMLinkingObjects` / `LinkingObjects`. These properties automatically - update to reflect the objects that link to the target object, can be used in queries, and - can be filtered like other Realm collection types. -* Queries that compare objects for equality now support multi-level key paths. - -### Bugfixes - -* Fix an assertion failure when a second write transaction is committed after a - write transaction deleted the object containing an RLMArray/List which had an - active notification block. -* Queries that compare `RLMArray` / `List` properties using != now give the correct results. - -0.99.1 Release notes (2016-04-26) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix a scenario that could lead to the assertion failure - "m_advancer_sg->get_version_of_current_transaction() == - new_notifiers.front()->version()". - -0.99.0 Release notes (2016-04-22) -============================================================= - -### API breaking changes - -* Deprecate properties of type `id`/`AnyObject`. This type was rarely used, - rarely useful and unsupported in every other Realm binding. -* The block for `-[RLMArray addNotificationBlock:]` and - `-[RLMResults addNotificationBlock:]` now takes another parameter. -* The following Objective-C APIs have been deprecated in favor of newer or preferred versions: - -| Deprecated API | New API | -|:-------------------------------------------------------|:------------------------------------------------------| -| `-[RLMRealm removeNotification:]` | `-[RLMNotificationToken stop]` | -| `RLMRealmConfiguration.path` | `RLMRealmConfiguration.fileURL` | -| `RLMRealm.path` | `RLMRealmConfiguration.fileURL` | -| `RLMRealm.readOnly` | `RLMRealmConfiguration.readOnly` | -| `+[RLMRealm realmWithPath:]` | `+[RLMRealm realmWithURL:]` | -| `+[RLMRealm writeCopyToPath:error:]` | `+[RLMRealm writeCopyToURL:encryptionKey:error:]` | -| `+[RLMRealm writeCopyToPath:encryptionKey:error:]` | `+[RLMRealm writeCopyToURL:encryptionKey:error:]` | -| `+[RLMRealm schemaVersionAtPath:error:]` | `+[RLMRealm schemaVersionAtURL:encryptionKey:error:]` | -| `+[RLMRealm schemaVersionAtPath:encryptionKey:error:]` | `+[RLMRealm schemaVersionAtURL:encryptionKey:error:]` | - -* The following Swift APIs have been deprecated in favor of newer or preferred versions: - -| Deprecated API | New API | -|:----------------------------------------------|:-----------------------------------------| -| `Realm.removeNotification(_:)` | `NotificationToken.stop()` | -| `Realm.Configuration.path` | `Realm.Configuration.fileURL` | -| `Realm.path` | `Realm.Configuration.fileURL` | -| `Realm.readOnly` | `Realm.Configuration.readOnly` | -| `Realm.writeCopyToPath(_:encryptionKey:)` | `Realm.writeCopyToURL(_:encryptionKey:)` | -| `schemaVersionAtPath(_:encryptionKey:error:)` | `schemaVersionAtURL(_:encryptionKey:)` | - -### Enhancements - -* Add information about what rows were added, removed, or modified to the - notifications sent to the Realm collections. -* Improve error when illegally appending to an `RLMArray` / `List` property from a default value - or the standalone initializer (`init()`) before the schema is ready. - -### Bugfixes - -* Fix a use-after-free when an associated object's dealloc method is used to - remove observers from an RLMObject. -* Fix a small memory leak each time a Realm file is opened. -* Return a recoverable `RLMErrorAddressSpaceExhausted` error rather than - crash when there is insufficient available address space on Realm - initialization or write commit. - -0.98.8 Release notes (2016-04-15) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fixed a bug that caused some encrypted files created using - `-[RLMRealm writeCopyToPath:encryptionKey:error:]` to fail to open. - -0.98.7 Release notes (2016-04-13) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Mark further initializers in Objective-C as NS_DESIGNATED_INITIALIZER to prevent that these aren't - correctly defined in Swift Object subclasses, which don't qualify for auto-inheriting the required initializers. -* `-[RLMResults indexOfObjectWithPredicate:]` now returns correct results - for `RLMResults` instances that were created by filtering an `RLMArray`. -* Adjust how RLMObjects are destroyed in order to support using an associated - object on an RLMObject to remove KVO observers from that RLMObject. -* `-[RLMResults indexOfObjectWithPredicate:]` now returns the index of the first matching object for a - sorted `RLMResults`, matching its documented behavior. -* Fix a crash when canceling a transaction that set a relationship. -* Fix a crash when a query referenced a deleted object. - -0.98.6 Release notes (2016-03-25) -============================================================= - -Prebuilt frameworks are now built with Xcode 7.3. - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix running unit tests on iOS simulators and devices with Xcode 7.3. - -0.98.5 Release notes (2016-03-14) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix a crash when opening a Realm on 32-bit iOS devices. - -0.98.4 Release notes (2016-03-10) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Properly report changes made by adding an object to a Realm with - addOrUpdate:/createOrUpdate: to KVO observers for existing objects with that - primary key. -* Fix crashes and assorted issues when a migration which added object link - properties is rolled back due to an error in the migration block. -* Fix assertion failures when deleting objects within a migration block of a - type which had an object link property added in that migration. -* Fix an assertion failure in `Query::apply_patch` when updating certain kinds - of queries after a write transaction is committed. - -0.98.3 Release notes (2016-02-26) -============================================================= - -### Enhancements - -* Initializing the shared schema is 3x faster. - -### Bugfixes - -* Using Realm Objective-C from Swift while having Realm Swift linked no longer causes that the - declared `ignoredProperties` are not taken into account. -* Fix assertion failures when rolling back a migration which added Object link - properties to a class. -* Fix potential errors when cancelling a write transaction which modified - multiple `RLMArray`/`List` properties. -* Report the correct value for inWriteTransaction after attempting to commit a - write transaction fails. -* Support CocoaPods 1.0 beginning from prerelease 1.0.0.beta.4 while retaining - backwards compatibility with 0.39. - -0.98.2 Release notes (2016-02-18) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Aggregate operations (`ANY`, `NONE`, `@count`, `SUBQUERY`, etc.) are now supported for key paths - that begin with an object relationship so long as there is a `RLMArray`/`List` property at some - point in a key path. -* Predicates of the form `%@ IN arrayProperty` are now supported. - -### Bugfixes - -* Use of KVC collection operators on Swift collection types no longer throws an exception. -* Fix reporting of inWriteTransaction in notifications triggered by - `beginWriteTransaction`. -* The contents of `List` and `Optional` properties are now correctly preserved when copying - a Swift object from one Realm to another, and performing other operations that result in a - Swift object graph being recursively traversed from Objective-C. -* Fix a deadlock when queries are performed within a Realm notification block. -* The `ANY` / `SOME` / `NONE` qualifiers are now required in comparisons involving a key path that - traverse a `RLMArray`/`List` property. Previously they were only required if the first key in the - key path was an `RLMArray`/`List` property. -* Fix several scenarios where the default schema would be initialized - incorrectly if the first Realm opened used a restricted class subset (via - `objectClasses`/`objectTypes`). - -0.98.1 Release notes (2016-02-10) -============================================================= - -### Bugfixes - -* Fix crashes when deleting an object containing an `RLMArray`/`List` which had - previously been queried. -* Fix a crash when deleting an object containing an `RLMArray`/`List` with - active notification blocks. -* Fix duplicate file warnings when building via CocoaPods. -* Fix crash or incorrect results when calling `indexOfObject:` on an - `RLMResults` derived from an `RLMArray`. - -0.98.0 Release notes (2016-02-04) -============================================================= - -### API breaking changes - -* `+[RLMRealm realmWithPath:]`/`Realm.init(path:)` now inherits from the default - configuration. -* Swift 1.2 is no longer supported. - -### Enhancements - -* Add `addNotificationBlock` to `RLMResults`, `Results`, `RLMArray`, and - `List`, which calls the given block whenever the collection changes. -* Do a lot of the work for keeping `RLMResults`/`Results` up-to-date after - write transactions on a background thread to help avoid blocking the main - thread. -* `NSPredicate`'s `SUBQUERY` operator is now supported. It has the following limitations: - * `@count` is the only operator that may be applied to the `SUBQUERY` expression. - * The `SUBQUERY(…).@count` expression must be compared with a constant. - * Correlated subqueries are not yet supported. - -### Bugfixes - -* None. - -0.97.1 Release notes (2016-01-29) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Swift: Added `Error` enum allowing to catch errors e.g. thrown on initializing - `RLMRealm`/`Realm` instances. -* Fail with `RLMErrorFileNotFound` instead of the more generic `RLMErrorFileAccess`, - if no file was found when a realm was opened as read-only or if the directory part - of the specified path was not found when a copy should be written. -* Greatly improve performance when deleting objects with one or more indexed - properties. -* Indexing `BOOL`/`Bool` and `NSDate` properties are now supported. -* Swift: Add support for indexing optional properties. - -### Bugfixes - -* Fix incorrect results or crashes when using `-[RLMResults setValue:forKey:]` - on an RLMResults which was filtered on the key being set. -* Fix crashes when an RLMRealm is deallocated from the wrong thread. -* Fix incorrect results from aggregate methods on `Results`/`RLMResults` after - objects which were previously in the results are deleted. -* Fix a crash when adding a new property to an existing class with over a - million objects in the Realm. -* Fix errors when opening encrypted Realm files created with writeCopyToPath. -* Fix crashes or incorrect results for queries that use relationship equality - in cases where the `RLMResults` is kept alive and instances of the target class - of the relationship are deleted. - -0.97.0 Release notes (2015-12-17) -============================================================= - -### API breaking changes - -* All functionality deprecated in previous releases has been removed entirely. -* Add generic type annotations to NSArrays and NSDictionaries in public APIs. -* Adding a Realm notification block on a thread not currently running from - within a run loop throws an exception rather than silently never calling the - notification block. - -### Enhancements - -* Support for tvOS. -* Support for building Realm Swift from source when using Carthage. -* The block parameter of `-[RLMRealm transactionWithBlock:]`/`Realm.write(_:)` is - now marked as `__attribute__((noescape))`/`@noescape`. -* Many forms of queries with key paths on both sides of the comparison operator - are now supported. -* Add support for KVC collection operators in `RLMResults` and `RLMArray`. -* Fail instead of deadlocking in `+[RLMRealm sharedSchema]`, if a Swift property is initialized - to a computed value, which attempts to open a Realm on its own. - -### Bugfixes - -* Fix poor performance when calling `-[RLMRealm deleteObjects:]` on an - `RLMResults` which filtered the objects when there are other classes linking - to the type of the deleted objects. -* An exception is now thrown when defining `Object` properties of an unsupported - type. - -0.96.3 Release notes (2015-12-04) -============================================================= - -### Enhancements - -* Queries are no longer limited to 16 levels of grouping. -* Rework the implementation of encrypted Realms to no longer interfere with - debuggers. - -### Bugfixes - -* Fix crash when trying to retrieve object instances via `dynamicObjects`. -* Throw an exception when querying on a link providing objects, which are from a different Realm. -* Return empty results when querying on a link providing an unattached object. -* Fix crashes or incorrect results when calling `-[RLMRealm refresh]` during - fast enumeration. -* Add `Int8` support for `RealmOptional`, `MinMaxType` and `AddableType`. -* Set the default value for newly added non-optional NSData properties to a - zero-byte NSData rather than nil. -* Fix a potential crash when deleting all objects of a class. -* Fix performance problems when creating large numbers of objects with - `RLMArray`/`List` properties. -* Fix memory leak when using Object(value:) for subclasses with - `List` or `RealmOptional` properties. -* Fix a crash when computing the average of an optional integer property. -* Fix incorrect search results for some queries on integer properties. -* Add error-checking for nil realm parameters in many methods such as - `+[RLMObject allObjectsInRealm:]`. -* Fix a race condition between commits and opening Realm files on new threads - that could lead to a crash. -* Fix several crashes when opening Realm files. -* `-[RLMObject createInRealm:withValue:]`, `-[RLMObject createOrUpdateInRealm:withValue:]`, and - their variants for the default Realm now always match the contents of an `NSArray` against properties - in the same order as they are defined in the model. - -0.96.2 Release notes (2015-10-26) -============================================================= - -Prebuilt frameworks are now built with Xcode 7.1. - -### Bugfixes - -* Fix ignoring optional properties in Swift. -* Fix CocoaPods installation on case-sensitive file systems. - -0.96.1 Release notes (2015-10-20) -============================================================= - -### Bugfixes - -* Support assigning `Results` to `List` properties via KVC. -* Honor the schema version set in the configuration in `+[RLMRealm migrateRealm:]`. -* Fix crash when using optional Int16/Int32/Int64 properties in Swift. - -0.96.0 Release notes (2015-10-14) -============================================================= - -* No functional changes since beta2. - -0.96.0-beta2 Release notes (2015-10-08) -============================================================= - -### Bugfixes - -* Add RLMOptionalBase.h to the podspec. - -0.96.0-beta Release notes (2015-10-07) -============================================================= - -### API breaking changes - -* CocoaPods v0.38 or greater is now required to install Realm and RealmSwift - as pods. - -### Enhancements - -* Functionality common to both `List` and `Results` is now declared in a - `RealmCollectionType` protocol that both types conform to. -* `Results.realm` now returns an `Optional` in order to conform to - `RealmCollectionType`, but will always return `.Some()` since a `Results` - cannot exist independently from a `Realm`. -* Aggregate operations are now available on `List`: `min`, `max`, `sum`, - `average`. -* Committing write transactions (via `commitWrite` / `commitWriteTransaction` and - `write` / `transactionWithBlock`) now optionally allow for handling errors when - the disk is out of space. -* Added `isEmpty` property on `RLMRealm`/`Realm` to indicate if it contains any - objects. -* The `@count`, `@min`, `@max`, `@sum` and `@avg` collection operators are now - supported in queries. - -### Bugfixes - -* Fix assertion failure when inserting NSData between 8MB and 16MB in size. -* Fix assertion failure when rolling back a migration which removed an object - link or `RLMArray`/`List` property. -* Add the path of the file being opened to file open errors. -* Fix a crash that could be triggered by rapidly opening and closing a Realm - many times on multiple threads at once. -* Fix several places where exception messages included the name of the wrong - function which failed. - -0.95.3 Release notes (2015-10-05) -============================================================= - -### Bugfixes - -* Compile iOS Simulator framework architectures with `-fembed-bitcode-marker`. -* Fix crashes when the first Realm opened uses a class subset and later Realms - opened do not. -* Fix inconsistent errors when `Object(value: ...)` is used to initialize the - default value of a property of an `Object` subclass. -* Throw an exception when a class subset has objects with array or object - properties of a type that are not part of the class subset. - -0.95.2 Release notes (2015-09-24) -============================================================= - -* Enable bitcode for iOS and watchOS frameworks. -* Build libraries with Xcode 7 final rather than the GM. - -0.95.1 Release notes (2015-09-23) -============================================================= - -### Enhancements - -* Add missing KVO handling for moving and exchanging objects in `RLMArray` and - `List`. - -### Bugfixes - -* Setting the primary key property on persisted `RLMObject`s / `Object`s - via subscripting or key-value coding will cause an exception to be thrown. -* Fix crash due to race condition in `RLMRealmConfiguration` where the default - configuration was in the process of being copied in one thread, while - released in another. -* Fix crash when a migration which removed an object or array property is - rolled back due to an error. - -0.95.0 Release notes (2015-08-25) -============================================================= - -### API breaking changes - -* The following APIs have been deprecated in favor of the new `RLMRealmConfiguration` class in Realm Objective-C: - -| Deprecated API | New API | -|:------------------------------------------------------------------|:---------------------------------------------------------------------------------| -| `+[RLMRealm realmWithPath:readOnly:error:]` | `+[RLMRealm realmWithConfiguration:error:]` | -| `+[RLMRealm realmWithPath:encryptionKey:readOnly:error:]` | `+[RLMRealm realmWithConfiguration:error:]` | -| `+[RLMRealm setEncryptionKey:forRealmsAtPath:]` | `-[RLMRealmConfiguration setEncryptionKey:]` | -| `+[RLMRealm inMemoryRealmWithIdentifier:]` | `+[RLMRealm realmWithConfiguration:error:]` | -| `+[RLMRealm defaultRealmPath]` | `+[RLMRealmConfiguration defaultConfiguration]` | -| `+[RLMRealm setDefaultRealmPath:]` | `+[RLMRealmConfiguration setDefaultConfiguration:]` | -| `+[RLMRealm setDefaultRealmSchemaVersion:withMigrationBlock]` | `RLMRealmConfiguration.schemaVersion` and `RLMRealmConfiguration.migrationBlock` | -| `+[RLMRealm setSchemaVersion:forRealmAtPath:withMigrationBlock:]` | `RLMRealmConfiguration.schemaVersion` and `RLMRealmConfiguration.migrationBlock` | -| `+[RLMRealm migrateRealmAtPath:]` | `+[RLMRealm migrateRealm:]` | -| `+[RLMRealm migrateRealmAtPath:encryptionKey:]` | `+[RLMRealm migrateRealm:]` | - -* The following APIs have been deprecated in favor of the new `Realm.Configuration` struct in Realm Swift for Swift 1.2: - -| Deprecated API | New API | -|:--------------------------------------------------------------|:-----------------------------------------------------------------------------| -| `Realm.defaultPath` | `Realm.Configuration.defaultConfiguration` | -| `Realm(path:readOnly:encryptionKey:error:)` | `Realm(configuration:error:)` | -| `Realm(inMemoryIdentifier:)` | `Realm(configuration:error:)` | -| `Realm.setEncryptionKey(:forPath:)` | `Realm(configuration:error:)` | -| `setDefaultRealmSchemaVersion(schemaVersion:migrationBlock:)` | `Realm.Configuration.schemaVersion` and `Realm.Configuration.migrationBlock` | -| `setSchemaVersion(schemaVersion:realmPath:migrationBlock:)` | `Realm.Configuration.schemaVersion` and `Realm.Configuration.migrationBlock` | -| `migrateRealm(path:encryptionKey:)` | `migrateRealm(configuration:)` | - -* The following APIs have been deprecated in favor of the new `Realm.Configuration` struct in Realm Swift for Swift 2.0: - -| Deprecated API | New API | -|:--------------------------------------------------------------|:-----------------------------------------------------------------------------| -| `Realm.defaultPath` | `Realm.Configuration.defaultConfiguration` | -| `Realm(path:readOnly:encryptionKey:) throws` | `Realm(configuration:) throws` | -| `Realm(inMemoryIdentifier:)` | `Realm(configuration:) throws` | -| `Realm.setEncryptionKey(:forPath:)` | `Realm(configuration:) throws` | -| `setDefaultRealmSchemaVersion(schemaVersion:migrationBlock:)` | `Realm.Configuration.schemaVersion` and `Realm.Configuration.migrationBlock` | -| `setSchemaVersion(schemaVersion:realmPath:migrationBlock:)` | `Realm.Configuration.schemaVersion` and `Realm.Configuration.migrationBlock` | -| `migrateRealm(path:encryptionKey:)` | `migrateRealm(configuration:)` | - -* `List.extend` in Realm Swift for Swift 2.0 has been replaced with `List.appendContentsOf`, - mirroring changes to `RangeReplaceableCollectionType`. - -* Object properties on `Object` subclasses in Realm Swift must be marked as optional, - otherwise a runtime exception will be thrown. - -### Enhancements - -* Persisted properties of `RLMObject`/`Object` subclasses are now Key-Value - Observing compliant. -* The different options used to create Realm instances have been consolidated - into a single `RLMRealmConfiguration`/`Realm.Configuration` object. -* Enumerating Realm collections (`RLMArray`, `RLMResults`, `List<>`, - `Results<>`) now enumerates over a copy of the collection, making it no - longer an error to modify a collection during enumeration (either directly, - or indirectly by modifying objects to make them no longer match a query). -* Improve performance of object insertion in Swift to bring it roughly in line - with Objective-C. -* Allow specifying a specific list of `RLMObject` / `Object` subclasses to include - in a given Realm via `RLMRealmConfiguration.objectClasses` / `Realm.Configuration.objectTypes`. - -### Bugfixes - -* Subscripting on `RLMObject` is now marked as nullable. - -0.94.1 Release notes (2015-08-10) -============================================================= - -### API breaking changes - -* Building for watchOS requires Xcode 7 beta 5. - -### Enhancements - -* `Object.className` is now marked as `final`. - -### Bugfixes - -* Fix crash when adding a property to a model without updating the schema - version. -* Fix unnecessary redownloading of the core library when building from source. -* Fix crash when sorting by an integer or floating-point property on iOS 7. - -0.94.0 Release notes (2015-07-29) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Reduce the amount of memory used by RLMRealm notification listener threads. -* Avoid evaluating results eagerly when filtering and sorting. -* Add nullability annotations to the Objective-C API to provide enhanced compiler - warnings and bridging to Swift. -* Make `RLMResult`s and `RLMArray`s support Objective-C generics. -* Add support for building watchOS and bitcode-compatible apps. -* Make the exceptions thrown in getters and setters more informative. -* Add `-[RLMArray exchangeObjectAtIndex:withObjectAtIndex]` and `List.swap(_:_:)` - to allow exchanging the location of two objects in the given `RLMArray` / `List`. -* Added anonymous analytics on simulator/debugger runs. -* Add `-[RLMArray moveObjectAtIndex:toIndex:]` and `List.move(from:to:)` to - allow moving objects in the given `RLMArray` / `List`. - -### Bugfixes - -* Processes crashing due to an uncaught exception inside a write transaction will - no longer cause other processes using the same Realm to hang indefinitely. -* Fix incorrect results when querying for < or <= on ints that - require 64 bits to represent with a CPU that supports SSE 4.2. -* An exception will no longer be thrown when attempting to reset the schema - version or encryption key on an open Realm to the current value. -* Date properties on 32 bit devices will retain 64 bit second precision. -* Wrap calls to the block passed to `enumerate` in an autoreleasepool to reduce - memory growth when migrating a large amount of objects. -* In-memory realms no longer write to the Documents directory on iOS or - Application Support on OS X. - -0.93.2 Release notes (2015-06-12) -============================================================= - -### Bugfixes - -* Fixed an issue where the packaged OS X Realm.framework was built with - `GCC_GENERATE_TEST_COVERAGE_FILES` and `GCC_INSTRUMENT_PROGRAM_FLOW_ARCS` - enabled. -* Fix a memory leak when constructing standalone Swift objects with NSDate - properties. -* Throw an exception rather than asserting when an invalidated object is added - to an RLMArray. -* Fix a case where data loss would occur if a device was hard-powered-off - shortly after a write transaction was committed which had to expand the Realm - file. - -0.93.1 Release notes (2015-05-29) -============================================================= - -### Bugfixes - -* Objects are no longer copied into standalone objects during object creation. This fixes an issue where - nested objects with a primary key are sometimes duplicated rather than updated. -* Comparison predicates with a constant on the left of the operator and key path on the right now give - correct results. An exception is now thrown for predicates that do not yet support this ordering. -* Fix some crashes in `index_string.cpp` with int primary keys or indexed int properties. - -0.93.0 Release notes (2015-05-27) -============================================================= - -### API breaking changes - -* Schema versions are now represented as `uint64_t` (Objective-C) and `UInt64` (Swift) so that they have - the same representation on all architectures. - -### Enhancements - -* Swift: `Results` now conforms to `CVarArgType` so it can - now be passed as an argument to `Results.filter(_:...)` - and `List.filter(_:...)`. -* Swift: Made `SortDescriptor` conform to the `Equatable` and - `StringLiteralConvertible` protocols. -* Int primary keys are once again automatically indexed. -* Improve error reporting when attempting to mark a property of a type that - cannot be indexed as indexed. - -### Bugfixes - -* Swift: `RealmSwift.framework` no longer embeds `Realm.framework`, - which now allows apps using it to pass iTunes Connect validation. - -0.92.4 Release notes (2015-05-22) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Swift: Made `Object.init()` a required initializer. -* `RLMObject`, `RLMResults`, `Object` and `Results` can now be safely - deallocated (but still not used) from any thread. -* Improve performance of `-[RLMArray indexOfObjectWhere:]` and `-[RLMArray - indexOfObjectWithPredicate:]`, and implement them for standalone RLMArrays. -* Improved performance of most simple queries. - -### Bugfixes - -* The interprocess notification mechanism no longer uses dispatch worker threads, preventing it from - starving other GCD clients of the opportunity to execute blocks when dozens of Realms are open at once. - -0.92.3 Release notes (2015-05-13) -============================================================= - -### API breaking changes - -* Swift: `Results.average(_:)` now returns an optional, which is `nil` if and only if the results - set is empty. - -### Enhancements - -* Swift: Added `List.invalidated`, which returns if the given `List` is no longer - safe to be accessed, and is analogous to `-[RLMArray isInvalidated]`. -* Assertion messages are automatically logged to Crashlytics if it's loaded - into the current process to make it easier to diagnose crashes. - -### Bugfixes - -* Swift: Enumerating through a standalone `List` whose objects themselves - have list properties won't crash. -* Swift: Using a subclass of `RealmSwift.Object` in an aggregate operator of a predicate - no longer throws a spurious type error. -* Fix incorrect results for when using OR in a query on a `RLMArray`/`List<>`. -* Fix incorrect values from `[RLMResults count]`/`Results.count` when using - `!=` on an int property with no other query conditions. -* Lower the maximum doubling threshold for Realm file sizes from 128MB to 16MB - to reduce the amount of wasted space. - -0.92.2 Release notes (2015-05-08) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Exceptions raised when incorrect object types are used with predicates now contain more detailed information. -* Added `-[RLMMigration deleteDataForClassName:]` and `Migration.deleteData(_:)` - to enable cleaning up after removing object subclasses - -### Bugfixes - -* Prevent debugging of an application using an encrypted Realm to work around - frequent LLDB hangs. Until the underlying issue is addressed you may set - REALM_DISABLE_ENCRYPTION=YES in your application's environment variables to - have requests to open an encrypted Realm treated as a request for an - unencrypted Realm. -* Linked objects are properly updated in `createOrUpdateInRealm:withValue:`. -* List properties on Objects are now properly initialized during fast enumeration. - -0.92.1 Release notes (2015-05-06) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* `-[RLMRealm inWriteTransaction]` is now public. -* Realm Swift is now available on CoocaPods. - -### Bugfixes - -* Force code re-signing after stripping architectures in `strip-frameworks.sh`. - -0.92.0 Release notes (2015-05-05) -============================================================= - -### API breaking changes - -* Migration blocks are no longer called when a Realm file is first created. -* The following APIs have been deprecated in favor of newer method names: - -| Deprecated API | New API | -|:-------------------------------------------------------|:------------------------------------------------------| -| `-[RLMMigration createObject:withObject:]` | `-[RLMMigration createObject:withValue:]` | -| `-[RLMObject initWithObject:]` | `-[RLMObject initWithValue:]` | -| `+[RLMObject createInDefaultRealmWithObject:]` | `+[RLMObject createInDefaultRealmWithValue:]` | -| `+[RLMObject createInRealm:withObject:]` | `+[RLMObject createInRealm:withValue:]` | -| `+[RLMObject createOrUpdateInDefaultRealmWithObject:]` | `+[RLMObject createOrUpdateInDefaultRealmWithValue:]` | -| `+[RLMObject createOrUpdateInRealm:withObject:]` | `+[RLMObject createOrUpdateInRealm:withValue:]` | - -### Enhancements - -* `Int8` properties defined in Swift are now treated as integers, rather than - booleans. -* NSPredicates created using `+predicateWithValue:` are now supported. - -### Bugfixes - -* Compound AND predicates with no subpredicates now correctly match all objects. - -0.91.5 Release notes (2015-04-28) -============================================================= - -### Bugfixes - -* Fix issues with removing search indexes and re-enable it. - -0.91.4 Release notes (2015-04-27) -============================================================= - -### Bugfixes - -* Temporarily disable removing indexes from existing columns due to bugs. - -0.91.3 Release notes (2015-04-17) -============================================================= - -### Bugfixes - -* Fix `Extra argument 'objectClassName' in call` errors when building via - CocoaPods. - -0.91.2 Release notes (2015-04-16) -============================================================= - -* Migration blocks are no longer called when a Realm file is first created. - -### Enhancements - -* `RLMCollection` supports collection KVC operations. -* Sorting `RLMResults` is 2-5x faster (typically closer to 2x). -* Refreshing `RLMRealm` after a write transaction which inserts or modifies - strings or `NSData` is committed on another thread is significantly faster. -* Indexes are now added and removed from existing properties when a Realm file - is opened, rather than only when properties are first added. - -### Bugfixes - -* `+[RLMSchema dynamicSchemaForRealm:]` now respects search indexes. -* `+[RLMProperty isEqualToProperty:]` now checks for equal `indexed` properties. - -0.91.1 Release notes (2015-03-12) -============================================================= - -### Enhancements - -* The browser will automatically refresh when the Realm has been modified - from another process. -* Allow using Realm in an embedded framework by setting - `APPLICATION_EXTENSION_API_ONLY` to YES. - -### Bugfixes - -* Fix a crash in CFRunLoopSourceInvalidate. - -0.91.0 Release notes (2015-03-10) -============================================================= - -### API breaking changes - -* `attributesForProperty:` has been removed from `RLMObject`. You now specify indexed - properties by implementing the `indexedProperties` method. -* An exception will be thrown when calling `setEncryptionKey:forRealmsAtPath:`, - `setSchemaVersion:forRealmAtPath:withMigrationBlock:`, and `migrateRealmAtPath:` - when a Realm at the given path is already open. -* Object and array properties of type `RLMObject` will no longer be allowed. - -### Enhancements - -* Add support for sharing Realm files between processes. -* The browser will no longer show objects that have no persisted properties. -* `RLMSchema`, `RLMObjectSchema`, and `RLMProperty` now have more useful descriptions. -* Opening an encrypted Realm while a debugger is attached to the process no - longer throws an exception. -* `RLMArray` now exposes an `isInvalidated` property to indicate if it can no - longer be accessed. - -### Bugfixes - -* An exception will now be thrown when calling `-beginWriteTransaction` from within a notification - triggered by calling `-beginWriteTransaction` elsewhere. -* When calling `delete:` we now verify that the object being deleted is persisted in the target Realm. -* Fix crash when calling `createOrUpdate:inRealm` with nested linked objects. -* Use the key from `+[RLMRealm setEncryptionKey:forRealmsAtPath:]` in - `-writeCopyToPath:error:` and `+migrateRealmAtPath:`. -* Comparing an RLMObject to a non-RLMObject using `-[RLMObject isEqual:]` or - `-isEqualToObject:` now returns NO instead of crashing. -* Improved error message when an `RLMObject` subclass is defined nested within - another Swift declaration. -* Fix crash when the process is terminated by the OS on iOS while encrypted realms are open. -* Fix crash after large commits to encrypted realms. - -0.90.6 Release notes (2015-02-20) -============================================================= - -### Enhancements - -* Improve compatibility of encrypted Realms with third-party crash reporters. - -### Bugfixes - -* Fix incorrect results when using aggregate functions on sorted RLMResults. -* Fix data corruption when using writeCopyToPath:encryptionKey:. -* Maybe fix some assertion failures. - -0.90.5 Release notes (2015-02-04) -============================================================= - -### Bugfixes - -* Fix for crashes when encryption is enabled on 64-bit iOS devices. - -0.90.4 Release notes (2015-01-29) -============================================================= - -### Bugfixes - -* Fix bug that resulted in columns being dropped and recreated during migrations. - -0.90.3 Release notes (2015-01-27) -============================================================= - -### Enhancements - -* Calling `createInDefaultRealmWithObject:`, `createInRealm:withObject:`, - `createOrUpdateInDefaultRealmWithObject:` or `createOrUpdateInRealm:withObject:` - is a no-op if the argument is an RLMObject of the same type as the receiver - and is already backed by the target realm. - -### Bugfixes - -* Fix incorrect column type assertions when the first Realm file opened is a - read-only file that is missing tables. -* Throw an exception when adding an invalidated or deleted object as a link. -* Throw an exception when calling `createOrUpdateInRealm:withObject:` when the - receiver has no primary key defined. - -0.90.1 Release notes (2015-01-22) -============================================================= - -### Bugfixes - -* Fix for RLMObject being treated as a model object class and showing up in the browser. -* Fix compilation from the podspec. -* Fix for crash when calling `objectsWhere:` with grouping in the query on `allObjects`. - -0.90.0 Release notes (2015-01-21) -============================================================= - -### API breaking changes - -* Rename `-[RLMRealm encryptedRealmWithPath:key:readOnly:error:]` to - `-[RLMRealm realmWithPath:encryptionKey:readOnly:error:]`. -* `-[RLMRealm setSchemaVersion:withMigrationBlock]` is no longer global and must be called - for each individual Realm path used. You can now call `-[RLMRealm setDefaultRealmSchemaVersion:withMigrationBlock]` - for the default Realm and `-[RLMRealm setSchemaVersion:forRealmAtPath:withMigrationBlock:]` for all others; - -### Enhancements - -* Add `-[RLMRealm writeCopyToPath:encryptionKey:error:]`. -* Add support for comparing string columns to other string columns in queries. - -### Bugfixes - -* Roll back changes made when an exception is thrown during a migration. -* Throw an exception if the number of items in a RLMResults or RLMArray changes - while it's being fast-enumerated. -* Also encrypt the temporary files used when encryption is enabled for a Realm. -* Fixed crash in JSONImport example on OS X with non-en_US locale. -* Fixed infinite loop when opening a Realm file in the Browser at the same time - as it is open in a 32-bit simulator. -* Fixed a crash when adding primary keys to older realm files with no primary - keys on any objects. -* Fixed a crash when removing a primary key in a migration. -* Fixed a crash when multiple write transactions with no changes followed by a - write transaction with changes were committed without the main thread - RLMRealm getting a chance to refresh. -* Fixed incomplete results when querying for non-null relationships. -* Improve the error message when a Realm file is opened in multiple processes - at once. - -0.89.2 Release notes (2015-01-02) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix an assertion failure when invalidating a Realm which is in a write - transaction, has already been invalidated, or has never been used. -* Fix an assertion failure when sorting an empty RLMArray property. -* Fix a bug resulting in the browser never becoming visible on 10.9. -* Write UTF-8 when generating class files from a realm file in the Browser. - -0.89.1 Release notes (2014-12-22) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Improve the error message when a Realm can't be opened due to lacking write - permissions. - -### Bugfixes - -* Fix an assertion failure when inserting rows after calling `deleteAllObjects` - on a Realm. -* Separate dynamic frameworks are now built for the simulator and devices to - work around App Store submission errors due to the simulator version not - being automatically stripped from dynamic libraries. - -0.89.0 Release notes (2014-12-18) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Add support for encrypting Realm files on disk. -* Support using KVC-compliant objects without getters or with custom getter - names to initialize RLMObjects with `createObjectInRealm` and friends. - -### Bugfixes - -* Merge native Swift default property values with defaultPropertyValues(). -* Don't leave the database schema partially updated when opening a realm fails - due to a migration being needed. -* Fixed issue where objects with custom getter names couldn't be used to - initialize other objects. -* Fix a major performance regression on queries on string properties. -* Fix a memory leak when circularly linked objects are added to a Realm. - -0.88.0 Release notes (2014-12-02) -============================================================= - -### API breaking changes - -* Deallocating an RLMRealm instance in a write transaction lacking an explicit - commit/cancel will now be automatically cancelled instead of committed. -* `-[RLMObject isDeletedFromRealm]` has been renamed to `-[RLMObject isInvalidated]`. - -### Enhancements - -* Add `-[RLMRealm writeCopyToPath:]` to write a compacted copy of the Realm - another file. -* Add support for case insensitive, BEGINSWITH, ENDSWITH and CONTAINS string - queries on array properties. -* Make fast enumeration of `RLMArray` and `RLMResults` ~30% faster and - `objectAtIndex:` ~55% faster. -* Added a lldb visualizer script for displaying the contents of persisted - RLMObjects when debugging. -* Added method `-setDefaultRealmPath:` to change the default Realm path. -* Add `-[RLMRealm invalidate]` to release data locked by the current thread. - -### Bugfixes - -* Fix for crash when running many simultaneous write transactions on background threads. -* Fix for crashes caused by opening Realms at multiple paths simultaneously which have had - properties re-ordered during migration. -* Don't run the query twice when `firstObject` or `lastObject` are called on an - `RLMResults` which has not had its results accessed already. -* Fix for bug where schema version is 0 for new Realm created at the latest version. -* Fix for error message where no migration block is specified when required. - -0.87.4 Release notes (2014-11-07) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix browser location in release zip. - -0.87.3 Release notes (2014-11-06) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Added method `-linkingObjectsOfClass:forProperty:` to RLMObject to expose inverse - relationships/backlinks. - -### Bugfixes - -* Fix for crash due to missing search index when migrating an object with a string primary key - in a database created using an older versions (0.86.3 and earlier). -* Throw an exception when passing an array containing a - non-RLMObject to -[RLMRealm addObjects:]. -* Fix for crash when deleting an object from multiple threads. - -0.87.0 Release notes (2014-10-21) -============================================================= - -### API breaking changes - -* RLMArray has been split into two classes, `RLMArray` and `RLMResults`. RLMArray is - used for object properties as in previous releases. Moving forward all methods used to - enumerate, query, and sort objects return an instance of a new class `RLMResults`. This - change was made to support diverging apis and the future addition of change notifications - for queries. -* The api for migrations has changed. You now call `setSchemaVersion:withMigrationBlock:` to - register a global migration block and associated version. This block is applied to Realms as - needed when opened for Realms at a previous version. The block can be applied manually if - desired by calling `migrateRealmAtPath:`. -* `arraySortedByProperty:ascending:` was renamed to `sortedResultsUsingProperty:ascending` -* `addObjectsFromArray:` on both `RLMRealm` and `RLMArray` has been renamed to `addObjects:` - and now accepts any container class which implements `NSFastEnumeration` -* Building with Swift support now requires Xcode 6.1 - -### Enhancements - -* Add support for sorting `RLMArray`s by multiple columns with `sortedResultsUsingDescriptors:` -* Added method `deleteAllObjects` on `RLMRealm` to clear a Realm. -* Added method `createObject:withObject:` on `RLMMigration` which allows object creation during migrations. -* Added method `deleteObject:` on `RLMMigration` which allows object deletion during migrations. -* Updating to core library version 0.85.0. -* Implement `objectsWhere:` and `objectsWithPredicate:` for array properties. -* Add `cancelWriteTransaction` to revert all changes made in a write transaction and end the transaction. -* Make creating `RLMRealm` instances on background threads when an instance - exists on another thread take a fifth of the time. -* Support for partial updates when calling `createOrUpdateWithObject:` and `addOrUpdateObject:` -* Re-enable Swift support on OS X - -### Bugfixes - -* Fix exceptions when trying to set `RLMObject` properties after rearranging - the properties in a `RLMObject` subclass. -* Fix crash on IN query with several thousand items. -* Fix crash when querying indexed `NSString` properties. -* Fixed an issue which prevented in-memory Realms from being used accross multiple threads. -* Preserve the sort order when querying a sorted `RLMResults`. -* Fixed an issue with migrations where if a Realm file is deleted after a Realm is initialized, - the newly created Realm can be initialized with an incorrect schema version. -* Fix crash in `RLMSuperSet` when assigning to a `RLMArray` property on a standalone object. -* Add an error message when the protocol for an `RLMArray` property is not a - valid object type. -* Add an error message when an `RLMObject` subclass is defined nested within - another Swift class. - -0.86.3 Release notes (2014-10-09) -============================================================= - -### Enhancements - -* Add support for != in queries on object relationships. - -### Bugfixes - -* Re-adding an object to its Realm no longer throws an exception and is now a no-op - (as it was previously). -* Fix another bug which would sometimes result in subclassing RLMObject - subclasses not working. - -0.86.2 Release notes (2014-10-06) -============================================================= - -### Bugfixes - -* Fixed issues with packaging "Realm Browser.app" for release. - -0.86.1 Release notes (2014-10-03) -============================================================= - -### Bugfixes - -* Fix a bug which would sometimes result in subclassing RLMObject subclasses - not working. - -0.86.0 Release notes (2014-10-03) -============================================================= - -### API breaking changes - -* Xcode 6 is now supported from the main Xcode project `Realm.xcodeproj`. - Xcode 5 is no longer supported. - -### Enhancements - -* Support subclassing RLMObject models. Although you can now persist subclasses, - polymorphic behavior is not supported (i.e. setting a property to an - instance of its subclass). -* Add support for sorting RLMArray properties. -* Speed up inserting objects with `addObject:` by ~20%. -* `readonly` properties are automatically ignored rather than having to be - added to `ignoredProperties`. -* Updating to core library version 0.83.1. -* Return "[deleted object]" rather than throwing an exception when - `-description` is called on a deleted RLMObject. -* Significantly improve performance of very large queries. -* Allow passing any enumerable to IN clauses rather than just NSArray. -* Add `objectForPrimaryKey:` and `objectInRealm:forPrimaryKey:` convenience - methods to fetch an object by primary key. - -### Bugfixes - -* Fix error about not being able to persist property 'hash' with incompatible - type when building for devices with Xcode 6. -* Fix spurious notifications of new versions of Realm. -* Fix for updating nested objects where some types do not have primary keys. -* Fix for inserting objects from JSON with NSNull values when default values - should be used. -* Trying to add a persisted RLMObject to a different Realm now throws an - exception rather than creating an uninitialized object. -* Fix validation errors when using IN on array properties. -* Fix errors when an IN clause has zero items. -* Fix for chained queries ignoring all but the last query's conditions. - -0.85.0 Release notes (2014-09-15) -============================================================= - -### API breaking changes - -* Notifications for a refresh being needed (when autorefresh is off) now send - the notification type RLMRealmRefreshRequiredNotification rather than - RLMRealmDidChangeNotification. - -### Enhancements - -* Updating to core library version 0.83.0. -* Support for primary key properties (for int and string columns). Declaring a property - to be the primary key ensures uniqueness for that property for all objects of a given type. - At the moment indexes on primary keys are not yet supported but this will be added in a future - release. -* Added methods to update or insert (upsert) for objects with primary keys defined. -* `[RLMObject initWithObject:]` and `[RLMObject createInRealmWithObject:]` now support - any object type with kvc properties. -* The Swift support has been reworked to work around Swift not being supported - in Frameworks on iOS 7. -* Improve performance when getting the count of items matching a query but not - reading any of the objects in the results. -* Add a return value to `-[RLMRealm refresh]` that indicates whether or not - there was anything to refresh. -* Add the class name to the error message when an RLMObject is missing a value - for a property without a default. -* Add support for opening Realms in read-only mode. -* Add an automatic check for updates when using Realm in a simulator (the - checker code is not compiled into device builds). This can be disabled by - setting the REALM_DISABLE_UPDATE_CHECKER environment variable to any value. -* Add support for Int16 and Int64 properties in Swift classes. - -### Bugfixes - -* Realm change notifications when beginning a write transaction are now sent - after updating rather than before, to match refresh. -* `-isEqual:` now uses the default `NSObject` implementation unless a primary key - is specified for an RLMObject. When a primary key is specified, `-isEqual:` calls - `-isEqualToObject:` and a corresponding implementation for `-hash` is also implemented. - -0.84.0 Release notes (2014-08-28) -============================================================= - -### API breaking changes - -* The timer used to trigger notifications has been removed. Notifications are now - only triggered by commits made in other threads, and can not currently be triggered - by changes made by other processes. Interprocess notifications will be re-added in - a future commit with an improved design. - -### Enhancements - -* Updating to core library version 0.82.2. -* Add property `deletedFromRealm` to RLMObject to indicate objects which have been deleted. -* Add support for the IN operator in predicates. -* Add support for the BETWEEN operator in link queries. -* Add support for multi-level link queries in predicates (e.g. `foo.bar.baz = 5`). -* Switch to building the SDK from source when using CocoaPods and add a - Realm.Headers subspec for use in targets that should not link a copy of Realm - (such as test targets). -* Allow unregistering from change notifications in the change notification - handler block. -* Significant performance improvements when holding onto large numbers of RLMObjects. -* Realm-Xcode6.xcodeproj now only builds using Xcode6-Beta6. -* Improved performance during RLMArray iteration, especially when mutating - contained objects. - -### Bugfixes - -* Fix crashes and assorted bugs when sorting or querying a RLMArray returned - from a query. -* Notifications are no longer sent when initializing new RLMRealm instances on background - threads. -* Handle object cycles in -[RLMObject description] and -[RLMArray description]. -* Lowered the deployment target for the Xcode 6 projects and Swift examples to - iOS 7.0, as they didn't actually require 8.0. -* Support setting model properties starting with the letter 'z' -* Fixed crashes that could result from switching between Debug and Relase - builds of Realm. - -0.83.0 Release notes (2014-08-13) -============================================================= - -### API breaking changes - -* Realm-Xcode6.xcodeproj now only builds using Xcode6-Beta5. -* Properties to be persisted in Swift classes must be explicitly declared as `dynamic`. -* Subclasses of RLMObject subclasses now throw an exception on startup, rather - than when added to a Realm. - -### Enhancements - -* Add support for querying for nil object properties. -* Improve error message when specifying invalid literals when creating or - initializing RLMObjects. -* Throw an exception when an RLMObject is used from the incorrect thread rather - than crashing in confusing ways. -* Speed up RLMRealm instantiation and array property iteration. -* Allow array and objection relation properties to be missing or null when - creating a RLMObject from a NSDictionary. - -### Bugfixes - -* Fixed a memory leak when querying for objects. -* Fixed initializing array properties on standalone Swift RLMObject subclasses. -* Fix for queries on 64bit integers. - -0.82.0 Release notes (2014-08-05) -============================================================= - -### API breaking changes - -* Realm-Xcode6.xcodeproj now only builds using Xcode6-Beta4. - -### Enhancements - -* Updating to core library version 0.80.5. -* Now support disabling the `autorefresh` property on RLMRealm instances. -* Building Realm-Xcode6 for iOS now builds a universal framework for Simulator & Device. -* Using NSNumber properties (unsupported) now throws a more informative exception. -* Added `[RLMRealm defaultRealmPath]` -* Proper implementation for [RLMArray indexOfObjectWhere:] -* The default Realm path on OS X is now ~/Library/Application Support/[bundle - identifier]/default.realm rather than ~/Documents -* We now check that the correct framework (ios or osx) is used at compile time. - -### Bugfixes - -* Fixed rapid growth of the realm file size. -* Fixed a bug which could cause a crash during RLMArray destruction after a query. -* Fixed bug related to querying on float properties: `floatProperty = 1.7` now works. -* Fixed potential bug related to the handling of array properties (RLMArray). -* Fixed bug where array properties accessed the wrong property. -* Fixed bug that prevented objects with custom getters to be added to a Realm. -* Fixed a bug where initializing a standalone object with an array literal would - trigger an exception. -* Clarified exception messages when using unsupported NSPredicate operators. -* Clarified exception messages when using unsupported property types on RLMObject subclasses. -* Fixed a memory leak when breaking out of a for-in loop on RLMArray. -* Fixed a memory leak when removing objects from a RLMArray property. -* Fixed a memory leak when querying for objects. - - -0.81.0 Release notes (2014-07-22) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Updating to core library version 0.80.3. -* Added support for basic querying of RLMObject and RLMArray properties (one-to-one and one-to-many relationships). - e.g. `[Person objectsWhere:@"dog.name == 'Alfonso'"]` or `[Person objectsWhere:@"ANY dogs.name == 'Alfonso'"]` - Supports all normal operators for numeric and date types. Does not support NSData properties or `BEGINSWITH`, `ENDSWITH`, `CONTAINS` - and other options for string properties. -* Added support for querying for object equality in RLMObject and RLMArray properties (one-to-one and one-to-many relationships). - e.g. `[Person objectsWhere:@"dog == %@", myDog]` `[Person objectsWhere:@"ANY dogs == %@", myDog]` `[Person objectsWhere:@"ANY friends.dog == %@", dog]` - Only supports comparing objects for equality (i.e. ==) -* Added a helper method to RLMRealm to perform a block inside a transaction. -* OSX framework now supported in CocoaPods. - -### Bugfixes - -* Fixed Unicode support in property names and string contents (Chinese, Russian, etc.). Closing #612 and #604. -* Fixed bugs related to migration when properties are removed. -* Fixed keyed subscripting for standalone RLMObjects. -* Fixed bug related to double clicking on a .realm file to launch the Realm Browser (thanks to Dean Moore). - - -0.80.0 Release notes (2014-07-15) -============================================================= - -### API breaking changes - -* Rename migration methods to -migrateDefaultRealmWithBlock: and -migrateRealmAtPath:withBlock: -* Moved Realm specific query methods from RLMRealm to class methods on RLMObject (-allObjects: to +allObjectsInRealm: ect.) - -### Enhancements - -* Added +createInDefaultRealmWithObject: method to RLMObject. -* Added support for array and object literals when calling -createWithObject: and -initWithObject: variants. -* Added method -deleteObjects: to batch delete objects from a Realm -* Support for defining RLMObject models entirely in Swift (experimental, see known issues). -* RLMArrays in Swift support Sequence-style enumeration (for obj in array). -* Implemented -indexOfObject: for RLMArray - -### Known Issues for Swift-defined models - -* Properties other than String, NSData and NSDate require a default value in the model. This can be an empty (but typed) array for array properties. -* The previous caveat also implies that not all models defined in Objective-C can be used for object properties. Only Objective-C models with only implicit (i.e. primitives) or explicit default values can be used. However, any Objective-C model object can be used in a Swift array property. -* Array property accessors don't work until its parent object has been added to a realm. -* Realm-Bridging-Header.h is temporarily exposed as a public header. This is temporary and will be private again once rdar://17633863 is fixed. -* Does not leverage Swift generics and still uses RLM-prefix everywhere. This is coming in #549. - - -0.22.0 Release notes -============================================================= - -### API breaking changes - -* Rename schemaForObject: to schemaForClassName: on RLMSchema -* Removed -objects:where: and -objects:orderedBy:where: from RLMRealm -* Removed -indexOfObjectWhere:, -objectsWhere: and -objectsOrderedBy:where: from RLMArray -* Removed +objectsWhere: and +objectsOrderedBy:where: from RLMObject - -### Enhancements - -* New Xcode 6 project for experimental swift support. -* New Realm Editor app for reading and editing Realm db files. -* Added support for migrations. -* Added support for RLMArray properties on objects. -* Added support for creating in-memory default Realm. -* Added -objectsWithClassName:predicateFormat: and -objectsWithClassName:predicate: to RLMRealm -* Added -indexOfObjectWithPredicateFormat:, -indexOfObjectWithPredicate:, -objectsWithPredicateFormat:, -objectsWithPredi -* Added +objectsWithPredicateFormat: and +objectsWithPredicate: to RLMObject -* Now allows predicates comparing two object properties of the same type. - - -0.20.0 Release notes (2014-05-28) -============================================================= - -Completely rewritten to be much more object oriented. - -### API breaking changes - -* Everything - -### Enhancements - -* None. - -### Bugfixes - -* None. - - -0.11.0 Release notes (not released) -============================================================= - -The Objective-C API has been updated and your code will break! - -### API breaking changes - -* `RLMTable` objects can only be created with an `RLMRealm` object. -* Renamed `RLMContext` to `RLMTransactionManager` -* Renamed `RLMContextDidChangeNotification` to `RLMRealmDidChangeNotification` -* Renamed `contextWithDefaultPersistence` to `managerForDefaultRealm` -* Renamed `contextPersistedAtPath:` to `managerForRealmWithPath:` -* Renamed `realmWithDefaultPersistence` to `defaultRealm` -* Renamed `realmWithDefaultPersistenceAndInitBlock` to `defaultRealmWithInitBlock` -* Renamed `find:` to `firstWhere:` -* Renamed `where:` to `allWhere:` -* Renamed `where:orderBy:` to `allWhere:orderBy:` - -### Enhancements - -* Added `countWhere:` on `RLMTable` -* Added `sumOfColumn:where:` on `RLMTable` -* Added `averageOfColumn:where:` on `RLMTable` -* Added `minOfProperty:where:` on `RLMTable` -* Added `maxOfProperty:where:` on `RLMTable` -* Added `toJSONString` on `RLMRealm`, `RLMTable` and `RLMView` -* Added support for `NOT` operator in predicates -* Added support for default values -* Added validation support in `createInRealm:withObject:` - -### Bugfixes - -* None. - - -0.10.0 Release notes (2014-04-23) -============================================================= - -TightDB is now Realm! The Objective-C API has been updated -and your code will break! - -### API breaking changes - -* All references to TightDB have been changed to Realm. -* All prefixes changed from `TDB` to `RLM`. -* `TDBTransaction` and `TDBSmartContext` have merged into `RLMRealm`. -* Write transactions now take an optional rollback parameter (rather than needing to return a boolean). -* `addColumnWithName:` and variant methods now return the index of the newly created column if successful, `NSNotFound` otherwise. - -### Enhancements - -* `createTableWithName:columns:` has been added to `RLMRealm`. -* Added keyed subscripting for RLMTable's first column if column is of type RLMPropertyTypeString. -* `setRow:atIndex:` has been added to `RLMTable`. -* `RLMRealm` constructors now have variants that take an writable initialization block -* New object interface - tables created/retrieved using `tableWithName:objectClass:` return custom objects - -### Bugfixes - -* None. - - -0.6.0 Release notes (2014-04-11) -============================================================= - -### API breaking changes - -* `contextWithPersistenceToFile:error:` renamed to `contextPersistedAtPath:error:` in `TDBContext` -* `readWithBlock:` renamed to `readUsingBlock:` in `TDBContext` -* `writeWithBlock:error:` renamed to `writeUsingBlock:error:` in `TDBContext` -* `readTable:withBlock:` renamed to `readTable:usingBlock:` in `TDBContext` -* `writeTable:withBlock:error:` renamed to `writeTable:usingBlock:error:` in `TDBContext` -* `findFirstRow` renamed to `indexOfFirstMatchingRow` on `TDBQuery`. -* `findFirstRowFromIndex:` renamed to `indexOfFirstMatchingRowFromIndex:` on `TDBQuery`. -* Return `NSNotFound` instead of -1 when appropriate. -* Renamed `castClass` to `castToTytpedTableClass` on `TDBTable`. -* `removeAllRows`, `removeRowAtIndex`, `removeLastRow`, `addRow` and `insertRow` methods - on table now return void instead of BOOL. - -### Enhancements -* A `TDBTable` can now be queried using `where:` and `where:orderBy:` taking - `NSPredicate` and `NSSortDescriptor` as arguments. -* Added `find:` method on `TDBTable` to find first row matching predicate. -* `contextWithDefaultPersistence` class method added to `TDBContext`. Will create a context persisted - to a file in app/documents folder. -* `renameColumnWithIndex:to:` has been added to `TDBTable`. -* `distinctValuesInColumnWithIndex` has been added to `TDBTable`. -* `dateIsBetween::`, `doubleIsBetween::`, `floatIsBetween::` and `intIsBetween::` - have been added to `TDBQuery`. -* Column names in Typed Tables can begin with non-capital letters too. The generated `addX` - selector can look odd. For example, a table with one column with name `age`, - appending a new row will look like `[table addage:7]`. -* Mixed typed values are better validated when rows are added, inserted, - or modified as object literals. -* `addRow`, `insertRow`, and row updates can be done using objects - derived from `NSObject`. -* `where` has been added to `TDBView`and `TDBViewProtocol`. -* Adding support for "smart" contexts (`TDBSmartContext`). - -### Bugfixes - -* Modifications of a `TDBView` and `TDBQuery` now throw an exception in a readtransaction. - - -0.5.0 Release notes (2014-04-02) -============================================================= - -The Objective-C API has been updated and your code will break! -Of notable changes a fast interface has been added. -This interface includes specific methods to get and set values into Tightdb. -To use these methods import ``. - -### API breaking changes - -* `getTableWithName:` renamed to `tableWithName:` in `TDBTransaction`. -* `addColumnWithName:andType:` renamed to `addColumnWithName:type:` in `TDBTable`. -* `columnTypeOfColumn:` renamed to `columnTypeOfColumnWithIndex` in `TDBTable`. -* `columnNameOfColumn:` renamed to `nameOfColumnWithIndex:` in `TDBTable`. -* `addColumnWithName:andType:` renamed to `addColumnWithName:type:` in `TDBDescriptor`. -* Fast getters and setters moved from `TDBRow.h` to `TDBRowFast.h`. - -### Enhancements - -* Added `minDateInColumnWithIndex` and `maxDateInColumnWithIndex` to `TDBQuery`. -* Transactions can now be started directly on named tables. -* You can create dynamic tables with initial schema. -* `TDBTable` and `TDBView` now have a shared protocol so they can easier be used interchangeably. - -### Bugfixes - -* Fixed bug in 64 bit iOS when inserting BOOL as NSNumber. - - -0.4.0 Release notes (2014-03-26) -============================================================= - -### API breaking changes - -* Typed interface Cursor has now been renamed to Row. -* TDBGroup has been renamed to TDBTransaction. -* Header files are renamed so names match class names. -* Underscore (_) removed from generated typed table classes. -* TDBBinary has been removed; use NSData instead. -* Underscope (_) removed from generated typed table classes. -* Constructor for TDBContext has been renamed to contextWithPersistenceToFile: -* Table findFirstRow and min/max/sum/avg operations has been hidden. -* Table.appendRow has been renamed to addRow. -* getOrCreateTable on Transaction has been removed. -* set*:inColumnWithIndex:atRowIndex: methods have been prefixed with TDB -* *:inColumnWithIndex:atRowIndex: methods have been prefixed with TDB -* addEmptyRow on table has been removed. Use [table addRow:nil] instead. -* TDBMixed removed. Use id and NSObject instead. -* insertEmptyRow has been removed from table. Use insertRow:nil atIndex:index instead. - -#### Enhancements - -* Added firstRow, lastRow selectors on view. -* firstRow and lastRow on table now return nil if table is empty. -* getTableWithName selector added on group. -* getting and creating table methods on group no longer take error argument. -* [TDBQuery parent] and [TDBQuery subtable:] selectors now return self. -* createTable method added on Transaction. Throws exception if table with same name already exists. -* Experimental support for pinning transactions on Context. -* TDBView now has support for object subscripting. - -### Bugfixes - -* None. - - -0.3.0 Release notes (2014-03-14) -============================================================= - -The Objective-C API has been updated and your code will break! - -### API breaking changes - -* Most selectors have been renamed in the binding! -* Prepend TDB-prefix on all classes and types. - -### Enhancements - -* Return types and parameters changed from size_t to NSUInteger. -* Adding setObject to TightdbTable (t[2] = @[@1, @"Hello"] is possible). -* Adding insertRow to TightdbTable. -* Extending appendRow to accept NSDictionary. - -### Bugfixes - -* None. - - -0.2.0 Release notes (2014-03-07) -============================================================= - -The Objective-C API has been updated and your code will break! - -### API breaking changes - -* addRow renamed to addEmptyRow - -### Enhancements - -* Adding a simple class for version numbering. -* Adding get-version and set-version targets to build.sh. -* tableview now supports sort on column with column type bool, date and int -* tableview has method for checking the column type of a specified column -* tableview has method for getting the number of columns -* Adding methods getVersion, getCoreVersion and isAtLeast. -* Adding appendRow to TightdbTable. -* Adding object subscripting. -* Adding method removeColumn on table. - -### Bugfixes - -* None. diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/NSError+RLMSync.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/NSError+RLMSync.h deleted file mode 100644 index 5ef323a24..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/NSError+RLMSync.h +++ /dev/null @@ -1,46 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2017 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@class RLMSyncErrorActionToken; - -/// NSError category extension providing methods to get data out of Realm's -/// "client reset" error. -@interface NSError (RLMSync) - -/** - Given an appropriate Atlas App Services error, return the token that - can be passed into `+[RLMSyncSession immediatelyHandleError:]` to - immediately perform error clean-up work, or nil if the error isn't of - a type that provides a token. - */ -- (nullable RLMSyncErrorActionToken *)rlmSync_errorActionToken NS_REFINED_FOR_SWIFT; - -/** - Given an Atlas App Services client reset error, return the path where the - backup copy of the Realm will be placed once the client reset process is - complete. - */ -- (nullable NSString *)rlmSync_clientResetBackedUpRealmPath NS_SWIFT_UNAVAILABLE(""); - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMAPIKeyAuth.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMAPIKeyAuth.h deleted file mode 100644 index 642bdd95d..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMAPIKeyAuth.h +++ /dev/null @@ -1,95 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMUserAPIKey, RLMObjectId; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// Provider client for user API keys. -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMAPIKeyAuth : RLMProviderClient - -/// A block type used to report an error -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMAPIKeyAuthOptionalErrorBlock)(NSError * _Nullable); - -/// A block type used to return an `RLMUserAPIKey` on success, or an `NSError` on failure -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMOptionalUserAPIKeyBlock)(RLMUserAPIKey * _Nullable, NSError * _Nullable); - -/// A block type used to return an array of `RLMUserAPIKey` on success, or an `NSError` on failure -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMUserAPIKeysBlock)(NSArray * _Nullable, NSError * _Nullable); - -/** - Creates a user API key that can be used to authenticate as the current user. - - @param name The name of the API key to be created. - @param completion A callback to be invoked once the call is complete. -*/ -- (void)createAPIKeyWithName:(NSString *)name - completion:(RLMOptionalUserAPIKeyBlock)completion NS_SWIFT_NAME(createAPIKey(named:completion:)); - -/** - Fetches a user API key associated with the current user. - - @param objectId The ObjectId of the API key to fetch. - @param completion A callback to be invoked once the call is complete. - */ -- (void)fetchAPIKey:(RLMObjectId *)objectId - completion:(RLMOptionalUserAPIKeyBlock)completion; - -/** - Fetches the user API keys associated with the current user. - - @param completion A callback to be invoked once the call is complete. - */ -- (void)fetchAPIKeysWithCompletion:(RLMUserAPIKeysBlock)completion; - -/** - Deletes a user API key associated with the current user. - - @param objectId The ObjectId of the API key to delete. - @param completion A callback to be invoked once the call is complete. - */ -- (void)deleteAPIKey:(RLMObjectId *)objectId - completion:(RLMAPIKeyAuthOptionalErrorBlock)completion; - -/** - Enables a user API key associated with the current user. - - @param objectId The ObjectId of the API key to enable. - @param completion A callback to be invoked once the call is complete. - */ -- (void)enableAPIKey:(RLMObjectId *)objectId - completion:(RLMAPIKeyAuthOptionalErrorBlock)completion; - -/** - Disables a user API key associated with the current user. - - @param objectId The ObjectId of the API key to disable. - @param completion A callback to be invoked once the call is complete. - */ -- (void)disableAPIKey:(RLMObjectId *)objectId - completion:(RLMAPIKeyAuthOptionalErrorBlock)completion; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMApp.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMApp.h deleted file mode 100644 index 2228232e8..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMApp.h +++ /dev/null @@ -1,235 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@protocol RLMNetworkTransport, RLMBSON; - -@class RLMUser, RLMCredentials, RLMSyncManager, RLMEmailPasswordAuth, RLMPushClient, RLMSyncTimeoutOptions; - -/// A block type used for APIs which asynchronously vend an `RLMUser`. -typedef void(^RLMUserCompletionBlock)(RLMUser * _Nullable, NSError * _Nullable); - -/// A block type used to report an error -typedef void(^RLMOptionalErrorBlock)(NSError * _Nullable); - -#pragma mark RLMAppConfiguration - -/// Properties representing the configuration of a client -/// that communicate with a particular Realm application. -@interface RLMAppConfiguration : NSObject - -/// A custom base URL to request against. -@property (nonatomic, strong, nullable) NSString *baseURL; - -/// The custom transport for network calls to the server. -@property (nonatomic, strong, nullable) id transport; - -/// :nodoc: -@property (nonatomic, strong, nullable) NSString *localAppName - __attribute__((deprecated("This field is not used"))); -/// :nodoc: -@property (nonatomic, strong, nullable) NSString *localAppVersion - __attribute__((deprecated("This field is not used"))); - -/// The default timeout for network requests. -@property (nonatomic, assign) NSUInteger defaultRequestTimeoutMS; - -/// If enabled (the default), a single connection is used for all Realms opened -/// with a single sync user. If disabled, a separate connection is used for each -/// Realm. -/// -/// Session multiplexing reduces resources used and typically improves -/// performance. When multiplexing is enabled, the connection is not immediately -/// closed when the last session is closed, and instead remains open for -/// ``RLMSyncTimeoutOptions.connectionLingerTime`` milliseconds (30 seconds by -/// default). -@property (nonatomic, assign) BOOL enableSessionMultiplexing; - -/** - Options for the assorted types of connection timeouts for sync connections. - - If nil default values for all timeouts are used instead. - */ -@property (nonatomic, nullable, copy) RLMSyncTimeoutOptions *syncTimeouts; - -/// :nodoc: -- (instancetype)initWithBaseURL:(nullable NSString *)baseURL - transport:(nullable id)transport - localAppName:(nullable NSString *)localAppName - localAppVersion:(nullable NSString *)localAppVersion -__attribute__((deprecated("localAppName and localAppVersion are unused"))); - -/// :nodoc: -- (instancetype)initWithBaseURL:(nullable NSString *) baseURL - transport:(nullable id)transport - localAppName:(nullable NSString *)localAppName - localAppVersion:(nullable NSString *)localAppVersion - defaultRequestTimeoutMS:(NSUInteger)defaultRequestTimeoutMS -__attribute__((deprecated("localAppName and localAppVersion are unused"))); - -/** -Create a new Realm App configuration. - -@param baseURL A custom base URL to request against. -@param transport A custom network transport. -*/ -- (instancetype)initWithBaseURL:(nullable NSString *)baseURL - transport:(nullable id)transport; - -/** - Create a new Realm App configuration. - - @param baseURL A custom base URL to request against. - @param transport A custom network transport. - @param defaultRequestTimeoutMS A custom default timeout for network requests. - */ -- (instancetype)initWithBaseURL:(nullable NSString *) baseURL - transport:(nullable id)transport - defaultRequestTimeoutMS:(NSUInteger)defaultRequestTimeoutMS; - -@end - -#pragma mark RLMApp - -/** - The `RLMApp` has the fundamental set of methods for communicating with a Realm - application backend. - - This interface provides access to login and authentication. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // internally thread-safe -@interface RLMApp : NSObject - -/// The configuration for this Realm app. -@property (nonatomic, readonly) RLMAppConfiguration *configuration; - -/// The `RLMSyncManager` for this Realm app. -@property (nonatomic, readonly) RLMSyncManager *syncManager; - -/// Get a dictionary containing all users keyed on id. -@property (nonatomic, readonly) NSDictionary *allUsers; - -/// Get the current user logged into the Realm app. -@property (nonatomic, readonly, nullable) RLMUser *currentUser; - -/// The app ID for this Realm app. -@property (nonatomic, readonly) NSString *appId; - -/** - A client for the email/password authentication provider which - can be used to obtain a credential for logging in. - - Used to perform requests specifically related to the email/password provider. -*/ -@property (nonatomic, readonly) RLMEmailPasswordAuth *emailPasswordAuth; - -/** - Get an application with a given appId and configuration. - - @param appId The unique identifier of your Realm app. - */ -+ (instancetype)appWithId:(NSString *)appId; - -/** - Get an application with a given appId and configuration. - - @param appId The unique identifier of your Realm app. - @param configuration A configuration object to configure this client. - */ -+ (instancetype)appWithId:(NSString *)appId - configuration:(nullable RLMAppConfiguration *)configuration; - -/** - Login to a user for the Realm app. - - @param credentials The credentials identifying the user. - @param completion A callback invoked after completion. - */ -- (void)loginWithCredential:(RLMCredentials *)credentials - completion:(RLMUserCompletionBlock)completion NS_REFINED_FOR_SWIFT; - -/** - Switches the active user to the specified user. - - This sets which user is used by all RLMApp operations which require a user. This is a local operation which does not access the network. - An exception will be throw if the user is not valid. The current user will remain logged in. - - @param syncUser The user to switch to. - @returns The user you intend to switch to - */ -- (RLMUser *)switchToUser:(RLMUser *)syncUser; - -/** - A client which can be used to register devices with the server to receive push notificatons - */ -- (RLMPushClient *)pushClientWithServiceName:(NSString *)serviceName - NS_SWIFT_NAME(pushClient(serviceName:)); - -/** - RLMApp instances are cached internally by Realm and cannot be created directly. - - Use `+[RLMRealm appWithId]` or `+[RLMRealm appWithId:configuration:]` - to obtain a reference to an RLMApp. - */ -- (instancetype)init __attribute__((unavailable("Use +appWithId or appWithId:configuration:."))); - -/** -RLMApp instances are cached internally by Realm and cannot be created directly. - -Use `+[RLMRealm appWithId]` or `+[RLMRealm appWithId:configuration:]` -to obtain a reference to an RLMApp. -*/ -+ (instancetype)new __attribute__((unavailable("Use +appWithId or appWithId:configuration:."))); - -@end - -#pragma mark - Sign In With Apple Extension - -API_AVAILABLE(ios(13.0), macos(10.15), tvos(13.0), watchos(6.0)) -/// Use this delegate to be provided a callback once authentication has succeed or failed -@protocol RLMASLoginDelegate - -/// Callback that is invoked should the authentication fail. -/// @param error An error describing the authentication failure. -- (void)authenticationDidFailWithError:(NSError *)error NS_SWIFT_NAME(authenticationDidComplete(error:)); - -/// Callback that is invoked should the authentication succeed. -/// @param user The newly authenticated user. -- (void)authenticationDidCompleteWithUser:(RLMUser *)user NS_SWIFT_NAME(authenticationDidComplete(user:)); - -@end - -API_AVAILABLE(ios(13.0), macos(10.15), tvos(13.0), watchos(6.0)) -/// Category extension that deals with Sign In With Apple authentication. -/// This is only available on OS's that support `AuthenticationServices` -@interface RLMApp (ASLogin) - -/// Use this delegate to be provided a callback once authentication has succeed or failed. -@property (nonatomic, weak, nullable) id authorizationDelegate; - -/// Sets the ASAuthorizationControllerDelegate to be handled by `RLMApp` -/// @param controller The ASAuthorizationController in which you want `RLMApp` to consume its delegate. -- (void)setASAuthorizationControllerDelegateForController:(ASAuthorizationController *)controller NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMArray.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMArray.h deleted file mode 100644 index b2c6c1664..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMArray.h +++ /dev/null @@ -1,652 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObject, RLMResults; - -/** - `RLMArray` is the container type in Realm used to define to-many relationships. - - Unlike an `NSArray`, `RLMArray`s hold a single type, specified by the `objectClassName` property. - This is referred to in these docs as the “type” of the array. - - When declaring an `RLMArray` property, the type must be marked as conforming to a - protocol by the same name as the objects it should contain (see the - `RLM_COLLECTION_TYPE` macro). In addition, the property can be declared using Objective-C - generics for better compile-time type safety. - - RLM_COLLECTION_TYPE(ObjectType) - ... - @property RLMArray *arrayOfObjectTypes; - - `RLMArray`s can be queried with the same predicates as `RLMObject` and `RLMResult`s. - - `RLMArray`s cannot be created directly. `RLMArray` properties on `RLMObject`s are - lazily created when accessed, or can be obtained by querying a Realm. - - ### Key-Value Observing - - `RLMArray` supports array key-value observing on `RLMArray` properties on `RLMObject` - subclasses, and the `invalidated` property on `RLMArray` instances themselves is - key-value observing compliant when the `RLMArray` is attached to a managed - `RLMObject` (`RLMArray`s on unmanaged `RLMObject`s will never become invalidated). - - Because `RLMArray`s are attached to the object which they are a property of, they - do not require using the mutable collection proxy objects from - `-mutableArrayValueForKey:` or KVC-compatible mutation methods on the containing - object. Instead, you can call the mutation methods on the `RLMArray` directly. - */ - -@interface RLMArray : NSObject - -#pragma mark - Properties - -/** - The number of objects in the array. - */ -@property (nonatomic, readonly, assign) NSUInteger count; - -/** - The type of the objects in the array. - */ -@property (nonatomic, readonly, assign) RLMPropertyType type; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readonly, getter = isOptional) BOOL optional; - -/** - The class name of the objects contained in the array. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages the array. Returns `nil` for unmanaged arrays. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - Indicates if the array can no longer be accessed. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if the array is frozen. - - Frozen arrays are immutable and can be accessed from any thread. Frozen arrays - are created by calling `-freeze` on a managed live array. Unmanaged arrays are - never frozen. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Accessing Objects from an Array - -/** - Returns the object at the index specified. - - @param index The index to look up. - - @return An object of the type contained in the array. - */ -- (RLMObjectType)objectAtIndex:(NSUInteger)index; - -/** - Returns an array containing the objects in the array at the indexes specified by a given index set. - `nil` will be returned if the index set contains an index out of the arrays bounds. - - @param indexes The indexes in the array to retrieve objects from. - - @return The objects at the specified indexes. - */ -- (nullable NSArray *)objectsAtIndexes:(NSIndexSet *)indexes; - -/** - Returns the first object in the array. - - Returns `nil` if called on an empty array. - - @return An object of the type contained in the array. - */ -- (nullable RLMObjectType)firstObject; - -/** - Returns the last object in the array. - - Returns `nil` if called on an empty array. - - @return An object of the type contained in the array. - */ -- (nullable RLMObjectType)lastObject; - - - -#pragma mark - Adding, Removing, and Replacing Objects in an Array - -/** - Adds an object to the end of the array. - - @warning This method may only be called during a write transaction. - - @param object An object of the type contained in the array. - */ -- (void)addObject:(RLMObjectType)object; - -/** - Adds an array of objects to the end of the array. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable object such as `NSArray` or `RLMResults` which contains objects of the - same class as the array. - */ -- (void)addObjects:(id)objects; - -/** - Inserts an object at the given index. - - Throws an exception if the index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param anObject An object of the type contained in the array. - @param index The index at which to insert the object. - */ -- (void)insertObject:(RLMObjectType)anObject atIndex:(NSUInteger)index; - -/** - Removes an object at the given index. - - Throws an exception if the index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param index The array index identifying the object to be removed. - */ -- (void)removeObjectAtIndex:(NSUInteger)index; - -/** - Removes the last object in the array. - - This is a no-op if the array is already empty. - - @warning This method may only be called during a write transaction. -*/ -- (void)removeLastObject; - -/** - Removes all objects from the array. - - @warning This method may only be called during a write transaction. - */ -- (void)removeAllObjects; - -/** - Replaces an object at the given index with a new object. - - Throws an exception if the index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param index The index of the object to be replaced. - @param anObject An object (of the same type as returned from the `objectClassName` selector). - */ -- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(RLMObjectType)anObject; - -/** - Moves the object at the given source index to the given destination index. - - Throws an exception if the index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param sourceIndex The index of the object to be moved. - @param destinationIndex The index to which the object at `sourceIndex` should be moved. - */ -- (void)moveObjectAtIndex:(NSUInteger)sourceIndex toIndex:(NSUInteger)destinationIndex; - -/** - Exchanges the objects in the array at given indices. - - Throws an exception if either index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param index1 The index of the object which should replace the object at index `index2`. - @param index2 The index of the object which should replace the object at index `index1`. - */ -- (void)exchangeObjectAtIndex:(NSUInteger)index1 withObjectAtIndex:(NSUInteger)index2; - -#pragma mark - Querying an Array - -/** - Returns the index of an object in the array. - - Returns `NSNotFound` if the object is not found in the array. - - @param object An object (of the same type as returned from the `objectClassName` selector). - */ -- (NSUInteger)indexOfObject:(RLMObjectType)object; - -/** - Returns the index of the first object in the array matching the predicate. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return The index of the object, or `NSNotFound` if the object is not found in the array. - */ -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns the index of the first object in the array matching the predicate. - - @param predicate The predicate with which to filter the objects. - - @return The index of the object, or `NSNotFound` if the object is not found in the array. - */ -- (NSUInteger)indexOfObjectWithPredicate:(NSPredicate *)predicate; - -/** - Returns all the objects matching the given predicate in the array. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` of objects that match the given predicate. - */ -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all the objects matching the given predicate in the array. - - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` of objects that match the given predicate - */ -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/** - Returns a sorted `RLMResults` from the array. - - @param keyPath The key path to sort by. - @param ascending The direction to sort in. - - @return An `RLMResults` sorted by the specified key path. - */ -- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a sorted `RLMResults` from the array. - - @param properties An array of `RLMSortDescriptor`s to sort by. - - @return An `RLMResults` sorted by the specified properties. - */ -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/** - Returns a distinct `RLMResults` from the array. - - @param keyPaths The key paths to distinct on. - - @return An `RLMResults` with the distinct values of the keypath(s). - */ -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -/// :nodoc: -- (RLMObjectType)objectAtIndexedSubscript:(NSUInteger)index; - -/// :nodoc: -- (void)setObject:(RLMObjectType)newValue atIndexedSubscript:(NSUInteger)index; - -#pragma mark - Sectioning an Array - -/** - Sorts and sections this collection from a given property key path, returning the result - as an instance of `RLMSectionedResults`. - - @param keyPath The property key path to sort on. - @param ascending The direction to sort in. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsSortedUsingKeyPath:(NSString *)keyPath - ascending:(BOOL)ascending - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -/** - Sorts and sections this collection from a given array of sort descriptors, returning the result - as an instance of `RLMSectionedResults`. - - @param sortDescriptors An array of `RLMSortDescriptor`s to sort by. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @note The primary sort descriptor must be responsible for determining the section key. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsUsingSortDescriptors:(NSArray *)sortDescriptors - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - - -#pragma mark - Notifications - -/** - Registers a block to be called each time the array changes. - - The block will be asynchronously called with the initial array, and then - called again after each write transaction which changes any of the objects in - the array, which objects are in the results, or the order of the objects in the - array. - - The `changes` parameter will be `nil` the first time the block is called. For - each call after that, it will contain information about which rows in the - array were added, removed or modified. If a write transaction did not modify - any objects in the array, the block is not called at all. See the - `RLMCollectionChange` documentation for information on how the changes are - reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - Person *person = [[Person allObjectsInRealm:realm] firstObject]; - NSLog(@"person.dogs.count: %zu", person.dogs.count); // => 0 - self.token = [person.dogs addNotificationBlock(RLMArray *dogs, - RLMCollectionChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count) // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - [person.dogs addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a non-frozen managed array. - - @param block The block to be called each time the array changes. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMArray *_Nullable array, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the array changes. - - The block will be asynchronously called with the initial array, and then - called again after each write transaction which changes any of the objects in - the array, which objects are in the results, or the order of the objects in the - array. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the array were added, removed or modified. If a write transaction - did not modify any objects in the array, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMArray *_Nullable array, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the array changes. - - The block will be asynchronously called with the initial array, and then - called again after each write transaction which changes any of the objects in - the array, which objects are in the results, or the order of the objects in the - array. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the array were added, removed or modified. If a write transaction - did not modify any objects in the array, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMArray *_Nullable array, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the array changes. - - The block will be asynchronously called with the initial array, and then - called again after each write transaction which changes any of the objects in - the array, which objects are in the results, or the order of the objects in the - array. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the array were added, removed or modified. If a write transaction - did not modify any objects in the array, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMArray *_Nullable array, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths -__attribute__((warn_unused_result)); - -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the objects in the array. - - NSNumber *min = [object.arrayProperty minOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The minimum value of the property, or `nil` if the array is empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects in the array. - - NSNumber *max = [object.arrayProperty maxOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose maximum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The maximum value of the property, or `nil` if the array is empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of the values of a given property over all the objects in the array. - - NSNumber *sum = [object.arrayProperty sumOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose values should be summed. Only properties of - types `int`, `float`, and `double` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects in the array. - - NSNumber *average = [object.arrayProperty averageOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose average value should be calculated. Only - properties of types `int`, `float`, and `double` are supported. - - @return The average value of the given property, or `nil` if the array is empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this array. - - The frozen copy is an immutable array which contains the same data as this - array currently contains, but will not update when writes are made to the - containing Realm. Unlike live arrays, frozen arrays can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a managed array. - @warning Holding onto a frozen array for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -#pragma mark - Unavailable Methods - -/** - `-[RLMArray init]` is not available because `RLMArray`s cannot be created directly. - `RLMArray` properties on `RLMObject`s are lazily created when accessed. - */ -- (instancetype)init __attribute__((unavailable("RLMArrays cannot be created directly"))); - -/** - `+[RLMArray new]` is not available because `RLMArray`s cannot be created directly. - `RLMArray` properties on `RLMObject`s are lazily created when accessed. - */ -+ (instancetype)new __attribute__((unavailable("RLMArrays cannot be created directly"))); - -@end - -/// :nodoc: -@interface RLMArray (Swift) -// for use only in Swift class definitions -- (instancetype)initWithObjectClassName:(NSString *)objectClassName; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMAsymmetricObject.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMAsymmetricObject.h deleted file mode 100644 index 09deb787e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMAsymmetricObject.h +++ /dev/null @@ -1,98 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2022 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectSchema, RLMPropertyDescriptor, RLMRealm; -/** - `RLMAsymmetricObject` is a base class used to define asymmetric Realm objects. - - Asymmetric objects can only be created using the `createInRealm:` - function, and cannot be added, removed or queried. - When created, asymmetric objects will be synced unidirectionally to the MongoDB - database and cannot be accessed locally. - - Linking an asymmetric object within an `Object` is not allowed and will throw an error. - - The property types supported on `RLMAsymmetricObject` are the same as for `RLMObject`, - except for that asymmetric objects can only link to embedded objects, so `RLMObject` - and `RLMArray` properties are not supported (`RLMEmbeddedObject` and - `RLMArray` *are*). - */ -@interface RLMAsymmetricObject : RLMObjectBase - -#pragma mark - Creating & Initializing Objects - -/** - Creates an unmanaged instance of a Realm object. - */ -- (instancetype)init NS_DESIGNATED_INITIALIZER; - -/** - Creates an unmanaged instance of a Realm object. - - Pass in an `NSArray` or `NSDictionary` instance to set the values of the object's properties. - */ -- (instancetype)initWithValue:(id)value; - -/** - Returns the class name for a Realm object subclass. - - @warning Do not override. Realm relies on this method returning the exact class - name. - - @return The class name for the model class. - */ -+ (NSString *)className; - -/** - Creates an Asymmetric object, which will be synced unidirectionally and - cannot be queried locally. - - Objects created using this method will not be added to the Realm. - - @warning This method may only be called during a write transaction. - @warning This method always returns nil. - - @param realm The Realm to be used to create the asymmetric object.. - @param value The value used to populate the object. - - @return Returns `nil` - */ -+ (instancetype)createInRealm:(RLMRealm *)realm withValue:(id)value; - -#pragma mark - Properties - -/** - The object schema which lists the managed properties for the object. - */ -@property (nonatomic, readonly) RLMObjectSchema *objectSchema; - -#pragma mark - Dynamic Accessors - -/// :nodoc: -- (nullable id)objectForKeyedSubscript:(NSString *)key; - -/// :nodoc: -- (void)setObject:(nullable id)obj forKeyedSubscript:(NSString *)key; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMAsyncTask.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMAsyncTask.h deleted file mode 100644 index 9f7dc58da..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMAsyncTask.h +++ /dev/null @@ -1,67 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A task object which can be used to observe or cancel an async open. - - When a synchronized Realm is opened asynchronously, the latest state of the - Realm is downloaded from the server before the completion callback is invoked. - This task object can be used to observe the state of the download or to cancel - it. This should be used instead of trying to observe the download via the sync - session as the sync session itself is created asynchronously, and may not exist - yet when -[RLMRealm asyncOpenWithConfiguration:completion:] returns. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMAsyncOpenTask : NSObject -/** - Register a progress notification block. - - Each registered progress notification block is called whenever the sync - subsystem has new progress data to report until the task is either cancelled - or the completion callback is called. Progress notifications are delivered on - the main queue. - */ -- (void)addProgressNotificationBlock:(RLMProgressNotificationBlock)block; - -/** - Register a progress notification block which is called on the given queue. - - Each registered progress notification block is called whenever the sync - subsystem has new progress data to report until the task is either cancelled - or the completion callback is called. Progress notifications are delivered on - the supplied queue. - */ -- (void)addProgressNotificationOnQueue:(dispatch_queue_t)queue - block:(RLMProgressNotificationBlock)block; - -/** - Cancel the asynchronous open. - - Any download in progress will be cancelled, and the completion block for this - async open will never be called. If multiple async opens on the same Realm are - happening concurrently, all other opens will fail with the error "operation cancelled". - */ -- (void)cancel; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMBSON.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMBSON.h deleted file mode 100644 index 41750fd57..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMBSON.h +++ /dev/null @@ -1,174 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -#pragma mark RLMBSONType - -/** - Allowed BSON types. - */ -typedef NS_ENUM(NSUInteger, RLMBSONType) { - /// BSON Null type - RLMBSONTypeNull, - /// BSON Int32 type - RLMBSONTypeInt32, - /// BSON Int64 type - RLMBSONTypeInt64, - /// BSON Bool type - RLMBSONTypeBool, - /// BSON Double type - RLMBSONTypeDouble, - /// BSON String type - RLMBSONTypeString, - /// BSON Binary type - RLMBSONTypeBinary, - /// BSON Timestamp type - RLMBSONTypeTimestamp, - /// BSON Datetime type - RLMBSONTypeDatetime, - /// BSON ObjectId type - RLMBSONTypeObjectId, - /// BSON Decimal128 type - RLMBSONTypeDecimal128, - /// BSON RegularExpression type - RLMBSONTypeRegularExpression, - /// BSON MaxKey type - RLMBSONTypeMaxKey, - /// BSON MinKey type - RLMBSONTypeMinKey, - /// BSON Document type - RLMBSONTypeDocument, - /// BSON Array type - RLMBSONTypeArray, - /// BSON UUID type - RLMBSONTypeUUID -}; - -#pragma mark RLMBSON - -/** - Protocol representing a BSON value. BSON is a computer data interchange format. - The name "BSON" is based on the term JSON and stands for "Binary JSON". - - The following types conform to RLMBSON: - - `NSNull` - `NSNumber` - `NSString` - `NSData` - `NSDateInterval` - `NSDate` - `RLMObjectId` - `RLMDecimal128` - `NSRegularExpression` - `RLMMaxKey` - `RLMMinKey` - `NSDictionary` - `NSArray` - `NSUUID` - - @see RLMBSONType - @see bsonspec.org - */ -@protocol RLMBSON - -/** - The BSON type for the conforming interface. - */ -@property (readonly) RLMBSONType bsonType NS_REFINED_FOR_SWIFT; - -/** - Whether or not this BSON is equal to another. - - @param other The BSON to compare to - */ -- (BOOL)isEqual:(_Nullable id)other; - -@end - -/// :nodoc: -@interface NSNull (RLMBSON) -@end - -/// :nodoc: -@interface NSNumber (RLMBSON) -@end - -/// :nodoc: -@interface NSString (RLMBSON) -@end - -/// :nodoc: -@interface NSData (RLMBSON) -@end - -/// :nodoc: -@interface NSDateInterval (RLMBSON) -@end - -/// :nodoc: -@interface NSDate (RLMBSON) -@end - -/// :nodoc: -@interface RLMObjectId (RLMBSON) -@end - -/// :nodoc: -@interface RLMDecimal128 (RLMBSON) -@end - -/// :nodoc: -@interface NSRegularExpression (RLMBSON) -@end - -/// MaxKey will always be the greatest value when comparing to other BSON types -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMMaxKey : NSObject -@end - -/// MinKey will always be the smallest value when comparing to other BSON types -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMMinKey : NSObject -@end - -/// :nodoc: -@interface RLMMaxKey (RLMBSON) -@end - -/// :nodoc: -@interface RLMMinKey (RLMBSON) -@end - -/// :nodoc: -@interface NSDictionary (RLMBSON) -@end - -/// :nodoc: -@interface NSMutableArray (RLMBSON) -@end - -/// :nodoc: -@interface NSArray (RLMBSON) -@end - -/// :nodoc: -@interface NSUUID (RLMBSON) -@end diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMCollection.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMCollection.h deleted file mode 100644 index eac117f17..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMCollection.h +++ /dev/null @@ -1,613 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@protocol RLMValue; -@class RLMRealm, RLMResults, RLMSortDescriptor, RLMNotificationToken, RLMCollectionChange, RLMSectionedResults; -typedef RLM_CLOSED_ENUM(int32_t, RLMPropertyType); -/// A callback which is invoked on each element in the Results collection which returns the section key. -typedef id _Nullable(^RLMSectionedResultsKeyBlock)(id); - -/** - A homogenous collection of Realm-managed objects. Examples of conforming types - include `RLMArray`, `RLMSet`, `RLMResults`, and `RLMLinkingObjects`. - */ -@protocol RLMCollection - -#pragma mark - Properties - -/** - The number of objects in the collection. - */ -@property (nonatomic, readonly) NSUInteger count; - -/** - The type of the objects in the collection. - */ -@property (nonatomic, readonly) RLMPropertyType type; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readonly, getter = isOptional) BOOL optional; - -/** - The class name of the objects contained in the collection. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages this collection, if any. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - Indicates if the collection is no longer valid. - - The collection becomes invalid if `invalidate` is called on the managing - Realm. Unmanaged collections are never invalidated. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -#pragma mark - Accessing Objects from a Collection - -/** - Returns the object at the index specified. - - @param index The index to look up. - - @return An object of the type contained in the collection. - */ -- (id)objectAtIndex:(NSUInteger)index; - -@optional - -/** - Returns an array containing the objects in the collection at the indexes - specified by a given index set. `nil` will be returned if the index set - contains an index out of the collections bounds. - - @param indexes The indexes in the collection to retrieve objects from. - - @return The objects at the specified indexes. - */ -- (nullable NSArray *)objectsAtIndexes:(NSIndexSet *)indexes; - -/** - Returns the first object in the collection. - - RLMSet is not ordered, and so for sets this will return an arbitrary object in - the set. It is not guaraneed to be a different object from what `lastObject` - gives even if the set has multiple objects in it. - - Returns `nil` if called on an empty collection. - - @return An object of the type contained in the collection. - */ -- (nullable id)firstObject; - -/** - Returns the last object in the collection. - - RLMSet is not ordered, and so for sets this will return an arbitrary object in - the set. It is not guaraneed to be a different object from what `firstObject` - gives even if the set has multiple objects in it. - - Returns `nil` if called on an empty collection. - - @return An object of the type contained in the collection. - */ -- (nullable id)lastObject; - -/// :nodoc: -- (id)objectAtIndexedSubscript:(NSUInteger)index; - -/** - Returns the index of an object in the collection. - - Returns `NSNotFound` if the object is not found in the collection. - - @param object An object (of the same type as returned from the `objectClassName` selector). - */ -- (NSUInteger)indexOfObject:(id)object; - -/** - Returns the index of the first object in the collection matching the predicate. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return The index of the object, or `NSNotFound` if the object is not found in the collection. - */ -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns the index of the first object in the collection matching the predicate. - - @param predicate The predicate with which to filter the objects. - - @return The index of the object, or `NSNotFound` if the object is not found in the collection. - */ -- (NSUInteger)indexOfObjectWithPredicate:(NSPredicate *)predicate; - -@required - -#pragma mark - Querying a Collection - -/** - Returns all objects matching the given predicate in the collection. - - This is only supported for managed collections. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - @return An `RLMResults` containing objects that match the given predicate. - */ -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all objects matching the given predicate in the collection. - - This is only supported for managed collections. - - @param predicate The predicate with which to filter the objects. - @return An `RLMResults` containing objects that match the given predicate. - */ -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/** - Returns a sorted `RLMResults` from the collection. - - This is only supported for managed collections. - - @param keyPath The keyPath to sort by. - @param ascending The direction to sort in. - @return An `RLMResults` sorted by the specified key path. - */ -- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a sorted `RLMResults` from the collection. - - This is only supported for managed collections. - - @param properties An array of `RLMSortDescriptor`s to sort by. - @return An `RLMResults` sorted by the specified properties. - */ -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/** - Returns a distinct `RLMResults` from the collection. - - This is only supported for managed collections. - - @param keyPaths The key paths used produce distinct results - @return An `RLMResults` made distinct based on the specified key paths - */ -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -/** - Returns an `NSArray` containing the results of invoking `valueForKey:` using - `key` on each of the collection's objects. - - @param key The name of the property. - - @return An `NSArray` containing results. - */ -- (nullable id)valueForKey:(NSString *)key; - -/** - Returns the value for the derived property identified by a given key path. - - @param keyPath A key path of the form relationship.property (with one or more relationships). - - @return The value for the derived property identified by keyPath. - */ -- (nullable id)valueForKeyPath:(NSString *)keyPath; - -/** - Invokes `setValue:forKey:` on each of the collection's objects using the specified `value` and `key`. - - @warning This method may only be called during a write transaction. - - @param value The object value. - @param key The name of the property. - */ -- (void)setValue:(nullable id)value forKey:(NSString *)key; - -#pragma mark - Notifications - -/** -Registers a block to be called each time the collection changes. - -The block will be asynchronously called with the initial collection, -and then called again after each write transaction which changes either any -of the objects in the collection, or which objects are in the collection. - -The `change` parameter will be `nil` the first time the block is called. -For each call after that, it will contain information about -which rows in the collection were added, removed or modified. If a -write transaction did not modify any objects in the results collection, -the block is not called at all. See the `RLMCollectionChange` documentation for -information on how the changes are reported and an example of updating a -`UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - -At the time when the block is called, the collection object will be fully -evaluated and up-to-date, and as long as you do not perform a write transaction -on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will -never perform blocking work. - -Notifications are delivered via the standard run loop, and so can't be -delivered while the run loop is blocked by other activity. When -notifications can't be delivered instantly, multiple notifications may be -coalesced into a single notification. This can include the notification -with the initial results. For example, the following code performs a write -transaction immediately after adding the notification block, so there is no -opportunity for the initial notification to be delivered first. As a -result, the initial notification will reflect the state of the Realm after -the write transaction. - - RLMResults *results = [Dog allObjects]; - NSLog(@"dogs.count: %zu", dogs.count); // => 0 - self.token = [results addNotificationBlock:^(RLMResults *dogs, - RLMCollectionChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - [realm addObject:dog]; - }]; - // end of run loop execution context - -You must retain the returned token for as long as you want updates to continue -to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - -@warning This method cannot be called during a write transaction, or when the - containing Realm is read-only or frozen. - -@param block The block to be called whenever a change occurs. -@return A token which must be held for as long as you want updates to be delivered. -*/ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** -Registers a block to be called each time the collection changes. - -The block will be asynchronously called with the initial collection, -and then called again after each write transaction which changes either any -of the objects in the collection, or which objects are in the collection. - -The `change` parameter will be `nil` the first time the block is called. -For each call after that, it will contain information about -which rows in the collection were added, removed or modified. If a -write transaction did not modify any objects in the results collection, -the block is not called at all. See the `RLMCollectionChange` documentation for -information on how the changes are reported and an example of updating a -`UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - -At the time when the block is called, the collection object will be fully -evaluated and up-to-date, and as long as you do not perform a write transaction -on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will -never perform blocking work. - -Notifications are delivered on the given queue. If the queue is blocked and -notifications can't be delivered instantly, multiple notifications may be -coalesced into a single notification. - -You must retain the returned token for as long as you want updates to continue -to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - -@warning This method cannot be called when the containing Realm is read-only or frozen. -@warning The queue must be a serial queue. - -@param block The block to be called whenever a change occurs. -@param queue The serial queue to deliver notifications to. -@return A token which must be held for as long as you want updates to be delivered. -*/ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** -Registers a block to be called each time the collection changes. - -The block will be asynchronously called with the initial collection, -and then called again after each write transaction which changes either any -of the objects in the collection, or which objects are in the collection. - -The `change` parameter will be `nil` the first time the block is called. -For each call after that, it will contain information about -which rows in the collection were added, removed or modified. If a -write transaction did not modify any objects in the results collection, -the block is not called at all. See the `RLMCollectionChange` documentation for -information on how the changes are reported and an example of updating a -`UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - -At the time when the block is called, the collection object will be fully -evaluated and up-to-date, and as long as you do not perform a write transaction -on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will -never perform blocking work. - -Notifications are delivered on the given queue. If the queue is blocked and -notifications can't be delivered instantly, multiple notifications may be -coalesced into a single notification. - -You must retain the returned token for as long as you want updates to continue -to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - -@warning This method cannot be called when the containing Realm is read-only or frozen. -@warning The queue must be a serial queue. - -@param block The block to be called whenever a change occurs. -@param queue The serial queue to deliver notifications to. -@param keyPaths The block will be called for changes occurring on these keypaths. If no -key paths are given, notifications are delivered for every property key path. -@return A token which must be held for as long as you want updates to be delivered. -*/ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -#pragma mark - Sectioned Results - -/** - Sorts and sections this collection from a given property key path, returning the result - as an instance of `RLMSectionedResults`. - - @param keyPath The property key path to sort on. - @param ascending The direction to sort in. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsSortedUsingKeyPath:(NSString *)keyPath - ascending:(BOOL)ascending - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -/** - Sorts and sections this collection from a given array of sort descriptors, returning the result - as an instance of `RLMSectionedResults`. - - @param sortDescriptors An array of `RLMSortDescriptor`s to sort by. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @note The primary sort descriptor must be responsible for determining the section key. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsUsingSortDescriptors:(NSArray *)sortDescriptors - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the objects - in the collection. - - NSNumber *min = [results minOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The minimum value of the property, or `nil` if the Results are empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects - in the collection. - - NSNumber *max = [results maxOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose maximum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The maximum value of the property, or `nil` if the Results are empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of the values of a given property over all the objects in the collection. - - NSNumber *sum = [results sumOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose values should be summed. Only properties of - types `int`, `float`, and `double` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects in the collection. - - NSNumber *average = [results averageOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose average value should be calculated. Only - properties of types `int`, `float`, and `double` are supported. - - @return The average value of the given property, or `nil` if the Results are empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -#pragma mark - Freeze - -/** - Indicates if the collection is frozen. - - Frozen collections are immutable and can be accessed from any thread. The - objects read from a frozen collection will also be frozen. - */ -@property (nonatomic, readonly, getter=isFrozen) BOOL frozen; - -/** - Returns a frozen (immutable) snapshot of this collection. - - The frozen copy is an immutable collection which contains the same data as - this collection currently contains, but will not update when writes are made - to the containing Realm. Unlike live collections, frozen collections can be - accessed from any thread. - - @warning This method cannot be called during a write transaction, or when the containing Realm is read-only. - @warning Holding onto a frozen collection for an extended period while - performing write transaction on the Realm may result in the Realm - file growing to large sizes. See - `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -@end - -/** - An `RLMSortDescriptor` stores a property name and a sort order for use with - `sortedResultsUsingDescriptors:`. It is similar to `NSSortDescriptor`, but supports - only the subset of functionality which can be efficiently run by Realm's query - engine. - - `RLMSortDescriptor` instances are immutable. - */ -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMSortDescriptor : NSObject - -#pragma mark - Properties - -/** - The key path which the sort descriptor orders results by. - */ -@property (nonatomic, readonly) NSString *keyPath; - -/** - Whether the descriptor sorts in ascending or descending order. - */ -@property (nonatomic, readonly) BOOL ascending; - -#pragma mark - Methods - -/** - Returns a new sort descriptor for the given key path and sort direction. - */ -+ (instancetype)sortDescriptorWithKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a copy of the receiver with the sort direction reversed. - */ -- (instancetype)reversedSortDescriptor; - -@end - -/** - A `RLMCollectionChange` object encapsulates information about changes to collections - that are reported by Realm notifications. - - `RLMCollectionChange` is passed to the notification blocks registered with - `-addNotificationBlock` on `RLMArray` and `RLMResults`, and reports what rows in the - collection changed since the last time the notification block was called. - - The change information is available in two formats: a simple array of row - indices in the collection for each type of change, and an array of index paths - in a requested section suitable for passing directly to `UITableView`'s batch - update methods. A complete example of updating a `UITableView` named `tv`: - - [tv beginUpdates]; - [tv deleteRowsAtIndexPaths:[changes deletionsInSection:0] withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv insertRowsAtIndexPaths:[changes insertionsInSection:0] withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv reloadRowsAtIndexPaths:[changes modificationsInSection:0] withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv endUpdates]; - - All of the arrays in an `RLMCollectionChange` are always sorted in ascending order. - */ -@interface RLMCollectionChange : NSObject -/// The indices of objects in the previous version of the collection which have -/// been removed from this one. -@property (nonatomic, readonly) NSArray *deletions; - -/// The indices in the new version of the collection which were newly inserted. -@property (nonatomic, readonly) NSArray *insertions; - -/** - The indices in the new version of the collection which were modified. - - For `RLMResults`, this means that one or more of the properties of the object at - that index were modified (or an object linked to by that object was - modified). - - For `RLMArray`, the array itself being modified to contain a - different object at that index will also be reported as a modification. - */ -@property (nonatomic, readonly) NSArray *modifications; - -/// Returns the index paths of the deletion indices in the given section. -- (NSArray *)deletionsInSection:(NSUInteger)section; - -/// Returns the index paths of the insertion indices in the given section. -- (NSArray *)insertionsInSection:(NSUInteger)section; - -/// Returns the index paths of the modification indices in the given section. -- (NSArray *)modificationsInSection:(NSUInteger)section; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMConstants.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMConstants.h deleted file mode 100644 index 0bc8db972..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMConstants.h +++ /dev/null @@ -1,156 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#define RLM_HEADER_AUDIT_BEGIN NS_HEADER_AUDIT_BEGIN -#define RLM_HEADER_AUDIT_END NS_HEADER_AUDIT_END - -#define RLM_SWIFT_SENDABLE NS_SWIFT_SENDABLE - -#define RLM_FINAL __attribute__((objc_subclassing_restricted)) - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -// Swift 5 considers NS_ENUM to be "open", meaning there could be values present -// other than the defined cases (which allows adding more cases later without -// it being a breaking change), while older versions consider it "closed". -#ifdef NS_CLOSED_ENUM -#define RLM_CLOSED_ENUM NS_CLOSED_ENUM -#else -#define RLM_CLOSED_ENUM NS_ENUM -#endif - -#if __has_attribute(ns_error_domain) && (!defined(__cplusplus) || !__cplusplus || __cplusplus >= 201103L) -#define RLM_ERROR_ENUM(type, name, domain) \ - _Pragma("clang diagnostic push") \ - _Pragma("clang diagnostic ignored \"-Wignored-attributes\"") \ - NS_ENUM(type, __attribute__((ns_error_domain(domain))) name) \ - _Pragma("clang diagnostic pop") -#else -#define RLM_ERROR_ENUM(type, name, domain) NS_ENUM(type, name) -#endif - -#define RLM_HIDDEN __attribute__((visibility("hidden"))) -#define RLM_VISIBLE __attribute__((visibility("default"))) -#define RLM_HIDDEN_BEGIN _Pragma("GCC visibility push(hidden)") -#define RLM_HIDDEN_END _Pragma("GCC visibility pop") -#define RLM_DIRECT __attribute__((objc_direct)) -#define RLM_DIRECT_MEMBERS __attribute__((objc_direct_members)) - -#pragma mark - Enums - -/** - `RLMPropertyType` is an enumeration describing all property types supported in Realm models. - - For more information, see [Realm Models](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/object-models-and-schemas/). - */ -typedef RLM_CLOSED_ENUM(int32_t, RLMPropertyType) { - -#pragma mark - Primitive types - /** Integers: `NSInteger`, `int`, `long`, `Int` (Swift) */ - RLMPropertyTypeInt = 0, - /** Booleans: `BOOL`, `bool`, `Bool` (Swift) */ - RLMPropertyTypeBool = 1, - /** Floating-point numbers: `float`, `Float` (Swift) */ - RLMPropertyTypeFloat = 5, - /** Double-precision floating-point numbers: `double`, `Double` (Swift) */ - RLMPropertyTypeDouble = 6, - /** NSUUID, UUID */ - RLMPropertyTypeUUID = 12, - -#pragma mark - Object types - - /** Strings: `NSString`, `String` (Swift) */ - RLMPropertyTypeString = 2, - /** Binary data: `NSData` */ - RLMPropertyTypeData = 3, - /** Any type: `id`, `AnyRealmValue` (Swift) */ - RLMPropertyTypeAny = 9, - /** Dates: `NSDate` */ - RLMPropertyTypeDate = 4, - -#pragma mark - Linked object types - - /** Realm model objects. See [Realm Models](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/object-models-and-schemas/) for more information. */ - RLMPropertyTypeObject = 7, - /** Realm linking objects. See [Realm Models](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/relationships/#inverse-relationship) for more information. */ - RLMPropertyTypeLinkingObjects = 8, - - RLMPropertyTypeObjectId = 10, - RLMPropertyTypeDecimal128 = 11 -}; - -#pragma mark - Notification Constants - -/** - A notification indicating that changes were made to a Realm. -*/ -typedef NSString * RLMNotification NS_EXTENSIBLE_STRING_ENUM; - -/** - This notification is posted when a write transaction has been committed to a Realm on a different thread for - the same file. - - It is not posted if `autorefresh` is enabled, or if the Realm is refreshed before the notification has a chance - to run. - - Realms with autorefresh disabled should normally install a handler for this notification which calls - `-[RLMRealm refresh]` after doing some work. Refreshing the Realm is optional, but not refreshing the Realm may lead to - large Realm files. This is because an extra copy of the data must be kept for the stale Realm. - */ -extern RLMNotification const RLMRealmRefreshRequiredNotification NS_SWIFT_NAME(RefreshRequired); - -/** - This notification is posted by a Realm when a write transaction has been - committed to a Realm on a different thread for the same file. - - It is not posted if `-[RLMRealm autorefresh]` is enabled, or if the Realm is - refreshed before the notification has a chance to run. - - Realms with autorefresh disabled should normally install a handler for this - notification which calls `-[RLMRealm refresh]` after doing some work. Refreshing - the Realm is optional, but not refreshing the Realm may lead to large Realm - files. This is because Realm must keep an extra copy of the data for the stale - Realm. - */ -extern RLMNotification const RLMRealmDidChangeNotification NS_SWIFT_NAME(DidChange); - -#pragma mark - Error keys - -/** Key to identify the associated backup Realm configuration in an error's `userInfo` dictionary */ -extern NSString * const RLMBackupRealmConfigurationErrorKey; - -#pragma mark - Other Constants - -/** The schema version used for uninitialized Realms */ -extern const uint64_t RLMNotVersioned; - -/** The corresponding value is the name of an exception thrown by Realm. */ -extern NSString * const RLMExceptionName; - -/** The corresponding value is a Realm file version. */ -extern NSString * const RLMRealmVersionKey; - -/** The corresponding key is the version of the underlying database engine. */ -extern NSString * const RLMRealmCoreVersionKey; - -/** The corresponding key is the Realm invalidated property name. */ -extern NSString * const RLMInvalidatedKey; - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMCredentials.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMCredentials.h deleted file mode 100644 index adff4e7e9..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMCredentials.h +++ /dev/null @@ -1,126 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) -@protocol RLMBSON; - -/// A token representing an identity provider's credentials. -typedef NSString *RLMCredentialsToken; - -/// A type representing the unique identifier of an Atlas App Services identity provider. -typedef NSString *RLMIdentityProvider NS_EXTENSIBLE_STRING_ENUM; - -/// The username/password identity provider. User accounts are handled by Atlas App Services directly without the -/// involvement of a third-party identity provider. -extern RLMIdentityProvider const RLMIdentityProviderUsernamePassword; - -/// A Facebook account as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderFacebook; - -/// A Google account as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderGoogle; - -/// An Apple account as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderApple; - -/// A JSON Web Token as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderJWT; - -/// An Anonymous account as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderAnonymous; - -/// An Realm Cloud function as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderFunction; - -/// A user api key as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderUserAPIKey; - -/// A server api key as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderServerAPIKey; - -/** - Opaque credentials representing a specific Realm App user. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMCredentials : NSObject - -/// The name of the identity provider which generated the credentials token. -@property (nonatomic, readonly) RLMIdentityProvider provider; - -/** - Construct and return credentials from a Facebook account token. - */ -+ (instancetype)credentialsWithFacebookToken:(RLMCredentialsToken)token; - -/** - Construct and return credentials from a Google account token. - */ -+ (instancetype)credentialsWithGoogleAuthCode:(RLMCredentialsToken)token; - -/** - Construct and return credentials from a Google id token. - */ -+ (instancetype)credentialsWithGoogleIdToken:(RLMCredentialsToken)token; - -/** - Construct and return credentials from an Apple account token. - */ -+ (instancetype)credentialsWithAppleToken:(RLMCredentialsToken)token; - -/** - Construct and return credentials for an Atlas App Services function using a mongodb document as a json payload. -*/ -+ (instancetype)credentialsWithFunctionPayload:(NSDictionary> *)payload; - -/** - Construct and return credentials from a user api key. -*/ -+ (instancetype)credentialsWithUserAPIKey:(NSString *)apiKey; - -/** - Construct and return credentials from a server api key. -*/ -+ (instancetype)credentialsWithServerAPIKey:(NSString *)apiKey; - -/** - Construct and return Atlas App Services credentials from an email and password. - */ -+ (instancetype)credentialsWithEmail:(NSString *)email - password:(NSString *)password; - -/** - Construct and return credentials from a JSON Web Token. - */ -+ (instancetype)credentialsWithJWT:(NSString *)token; - -/** - Construct and return anonymous credentials - */ -+ (instancetype)anonymousCredentials; - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("RLMAppCredentials cannot be created directly"))); - -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("RLMAppCredentials cannot be created directly"))); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMDecimal128.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMDecimal128.h deleted file mode 100644 index f6224bbf2..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMDecimal128.h +++ /dev/null @@ -1,110 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A 128-bit IEEE 754-2008 decimal floating point number. - - This type is similar to Swift's built-in Decimal type, but allocates bits - differently, resulting in a different representable range. (NS)Decimal stores a - significand of up to 38 digits long and an exponent from -128 to 127, while - this type stores up to 34 digits of significand and an exponent from -6143 to - 6144. - */ -RLM_SWIFT_SENDABLE // immutable -@interface RLMDecimal128 : NSObject -/// Creates a new zero-initialized decimal128. -- (instancetype)init; - -/// Converts the given value to a RLMDecimal128. -/// -/// The following types can be converted to RLMDecimal128: -/// - NSNumber -/// - NSString -/// - NSDecimalNumber -/// -/// Passing a value with a type not in this list is a fatal error. Passing a -/// string which cannot be parsed as a valid Decimal128 is a fatal error. -- (instancetype)initWithValue:(id)value; - -/// Converts the given number to a RLMDecimal128. -- (instancetype)initWithNumber:(NSNumber *)number; - -/// Parses the given string to a RLMDecimal128. -/// -/// Returns a decimal where `isNaN` is `YES` if the string cannot be parsed as a decimal. `error` is never set -/// and this will never actually return `nil`. -- (nullable instancetype)initWithString:(NSString *)string error:(NSError **)error; - -/// Converts the given number to a RLMDecimal128. -+ (instancetype)decimalWithNumber:(NSNumber *)number; - -/// The minimum value for RLMDecimal128. -@property (class, readonly, copy) RLMDecimal128 *minimumDecimalNumber NS_REFINED_FOR_SWIFT; - -/// The maximum value for RLMDecimal128. -@property (class, readonly, copy) RLMDecimal128 *maximumDecimalNumber NS_REFINED_FOR_SWIFT; - -/// Convert this value to a double. This is a lossy conversion. -@property (nonatomic, readonly) double doubleValue; - -/// Convert this value to a NSDecimal. This may be a lossy conversion. -@property (nonatomic, readonly) NSDecimal decimalValue; - -/// Convert this value to a string. -@property (nonatomic, readonly) NSString *stringValue; - -/// Gets if this Decimal128 represents a NaN value. -@property (nonatomic, readonly) BOOL isNaN; - -/// The magnitude of this RLMDecimal128. -@property (nonatomic, readonly) RLMDecimal128 *magnitude NS_REFINED_FOR_SWIFT; - -/// Replaces this RLMDecimal128 value with its additive inverse. -- (void)negate; - -/// Adds the right hand side to the current value and returns the result. -- (RLMDecimal128 *)decimalNumberByAdding:(RLMDecimal128 *)decimalNumber; - -/// Divides the right hand side to the current value and returns the result. -- (RLMDecimal128 *)decimalNumberByDividingBy:(RLMDecimal128 *)decimalNumber; - -/// Subtracts the right hand side to the current value and returns the result. -- (RLMDecimal128 *)decimalNumberBySubtracting:(RLMDecimal128 *)decimalNumber; - -/// Multiply the right hand side to the current value and returns the result. -- (RLMDecimal128 *)decimalNumberByMultiplyingBy:(RLMDecimal128 *)decimalNumber; - -/// Comparision operator to check if the right hand side is greater than the current value. -- (BOOL)isGreaterThan:(nullable RLMDecimal128 *)decimalNumber; - -/// Comparision operator to check if the right hand side is greater than or equal to the current value. -- (BOOL)isGreaterThanOrEqualTo:(nullable RLMDecimal128 *)decimalNumber; - -/// Comparision operator to check if the right hand side is less than the current value. -- (BOOL)isLessThan:(nullable RLMDecimal128 *)decimalNumber; - -/// Comparision operator to check if the right hand side is less than or equal to the current value. -- (BOOL)isLessThanOrEqualTo:(nullable RLMDecimal128 *)decimalNumber; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMDictionary.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMDictionary.h deleted file mode 100644 index 9c8cac538..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMDictionary.h +++ /dev/null @@ -1,559 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObject, RLMResults, RLMDictionaryChange; - -/** - `RLMDictionary` is a container type in Realm representing a dynamic collection of key-value pairs. - - Unlike `NSDictionary`, `RLMDictionary`s hold a single key and value type. - This is referred to in these docs as the “type” and “keyType” of the dictionary. - - When declaring an `RLMDictionary` property, the object type and keyType must be marked as conforming to a - protocol by the same name as the objects it should contain. - - RLM_COLLECTION_TYPE(ObjectType) - ... - @property RLMDictionary *objectTypeDictionary; - - `RLMDictionary`s can be queried with the same predicates as `RLMObject` and `RLMResult`s. - - `RLMDictionary`s cannot be created directly. `RLMDictionary` properties on `RLMObject`s are - lazily created when accessed, or can be obtained by querying a Realm. - - `RLMDictionary` only supports `NSString` as a key. Realm disallows the use of `.` or `$` characters within a dictionary key. - - ### Key-Value Observing - - `RLMDictionary` supports dictionary key-value observing on `RLMDictionary` properties on `RLMObject` - subclasses, and the `invalidated` property on `RLMDictionary` instances themselves is - key-value observing compliant when the `RLMDictionary` is attached to a managed - `RLMObject` (`RLMDictionary`s on unmanaged `RLMObject`s will never become invalidated). - */ -@interface RLMDictionary: NSObject - -#pragma mark - Properties - -/** - The number of entries in the dictionary. - */ -@property (nonatomic, readonly, assign) NSUInteger count; - -/** - The type of the objects in the dictionary. - */ -@property (nonatomic, readonly, assign) RLMPropertyType type; - -/** - The type of the key used in this dictionary. - */ -@property (nonatomic, readonly, assign) RLMPropertyType keyType; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readonly, getter = isOptional) BOOL optional; - -/** - The class name of the objects contained in the dictionary. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages the dictionary. Returns `nil` for unmanaged dictionary. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - Indicates if the dictionary can no longer be accessed. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if the dictionary is frozen. - - Frozen dictionaries are immutable and can be accessed from any thread. Frozen dictionaries - are created by calling `-freeze` on a managed live dictionary. Unmanaged dictionaries are - never frozen. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Accessing Objects from a Dictionary - -/** - Returns the value associated with a given key. - - @param key The name of the property. - - @discussion If key does not start with “@”, invokes object(forKey:). If key does start - with “@”, strips the “@” and invokes [super valueForKey:] with the rest of the key. - - @return A value associated with a given key or `nil`. - */ -- (nullable id)valueForKey:(nonnull RLMKeyType)key; - -/** - Returns an array containing the dictionary’s keys. - - @note The order of the elements in the array is not defined. - */ -@property(readonly, copy) NSArray *allKeys; - -/** - Returns an array containing the dictionary’s values. - - @note The order of the elements in the array is not defined. - */ -@property(readonly, copy) NSArray *allValues; - -/** - Returns the value associated with a given key. - - @note `nil` will be returned if no value is associated with a given key. NSNull will be returned - where null is associated with the key. - - @param key The key for which to return the corresponding value. - - @return The value associated with key. - */ -- (nullable RLMObjectType)objectForKey:(nonnull RLMKeyType)key; - -/** - Returns the value associated with a given key. - - @note `nil` will be returned if no value is associated with a given key. NSNull will be returned - where null is associated with the key. - - @param key The key for which to return the corresponding value. - - @return The value associated with key. - */ -- (nullable RLMObjectType)objectForKeyedSubscript:(RLMKeyType)key; - -/** - Applies a given block object to the each key-value pair of the dictionary. - - @param block A block object to operate on entries in the dictionary. - - @note If the block sets *stop to YES, the enumeration stops. - */ -- (void)enumerateKeysAndObjectsUsingBlock:(void (^)(RLMKeyType key, RLMObjectType obj, BOOL *stop))block; - -#pragma mark - Adding, Removing, and Replacing Objects in a Dictionary - -/** - Replace the contents of a dictionary with the contents of another dictionary - NSDictionary or RLMDictionary. - - This will remove all elements in this dictionary and then apply each element from the given dictionary. - - @warning This method may only be called during a write transaction. - @warning If otherDictionary is self this will result in an empty dictionary. - */ -- (void)setDictionary:(id)otherDictionary; - -/** - Removes all contents in the dictionary. - - @warning This method may only be called during a write transaction. - */ -- (void)removeAllObjects; - -/** - Removes from the dictionary entries specified by elements in a given array. If a given key does not - exist, no mutation will happen for that key. - - @warning This method may only be called during a write transaction. - */ -- (void)removeObjectsForKeys:(NSArray *)keyArray; - -/** - Removes a given key and its associated value from the dictionary. If the key does not exist the dictionary - will not be modified. - - @warning This method may only be called during a write transaction. - */ -- (void)removeObjectForKey:(RLMKeyType)key; - -/** - Adds a given key-value pair to the dictionary if the key is not present, or updates the value for the given key - if the key already present. - - @warning This method may only be called during a write transaction. - */ -- (void)setObject:(nullable RLMObjectType)obj forKeyedSubscript:(RLMKeyType)key; - -/** - Adds a given key-value pair to the dictionary if the key is not present, or updates the value for the given key - if the key already present. - - @warning This method may only be called during a write transaction. - */ -- (void)setObject:(nullable RLMObjectType)anObject forKey:(RLMKeyType)aKey; - -/** - Adds to the receiving dictionary the entries from another dictionary. - - @note If the receiving dictionary contains the same key(s) as the otherDictionary, then - the receiving dictionary will update each key-value pair for the matching key. - - @warning This method may only be called during a write transaction. - - @param otherDictionary An enumerable object such as `NSDictionary` or `RLMDictionary` which contains objects of the - same type as the receiving dictionary. - */ -- (void)addEntriesFromDictionary:(id )otherDictionary; - -#pragma mark - Querying a Dictionary - -/** - Returns all the values matching the given predicate in the dictionary. - - @note The keys in the dictionary are ignored when quering values, and they will not be returned in the `RLMResults`. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` of objects that match the given predicate. - */ -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all the values matching the given predicate in the dictionary. - - @note The keys in the dictionary are ignored when quering values, and they will not be returned in the `RLMResults`. - - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` of objects that match the given predicate - */ -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/** - Returns a sorted RLMResults of all values in the dictionary. - - @note The keys in the dictionary are ignored when sorting values, and they will not be returned in the `RLMResults`. - - @param keyPath The key path to sort by. - @param ascending The direction to sort in. - - @return An `RLMResults` sorted by the specified key path. - */- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a sorted RLMResults of all values in the dictionary. - - @note The keys in the dictionary are ignored when sorting values, and they will not be returned in the `RLMResults`. - - @param properties An array of `RLMSortDescriptor`s to sort by. - - @return An `RLMResults` sorted by the specified properties. - */ -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/** - Returns a distinct `RLMResults` from all values in the dictionary. - - @note The keys in the dictionary are ignored, and they will not be returned in the `RLMResults`. - - @param keyPaths The key paths to distinct on. - - @return An `RLMResults` with the distinct values of the keypath(s). - */ -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the values in the dictionary. - - NSNumber *min = [object.dictionaryProperty minOfProperty:@"age"]; - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, `NSDate`, `RLMValue` and `RLMDecimal128` are supported. - - @return The minimum value of the property, or `nil` if the dictionary is empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects in the dictionary. - - NSNumber *max = [object.dictionaryProperty maxOfProperty:@"age"]; - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, `NSDate`, `RLMValue` and `RLMDecimal128` are supported. - - @return The maximum value of the property, or `nil` if the dictionary is empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of distinct values of a given property over all the objects in the dictionary. - - NSNumber *sum = [object.dictionaryProperty sumOfProperty:@"age"]; - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, `RLMValue` and `RLMDecimal128` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects in the dictionary. - - NSNumber *average = [object.dictionaryProperty averageOfProperty:@"age"]; - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, `NSDate`, `RLMValue` and `RLMDecimal128` are supported. - - @return The average value of the given property, or `nil` if the dictionary is empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -#pragma mark - Notifications - -/** - Registers a block to be called each time the dictionary changes. - - The block will be asynchronously called with the initial dictionary, and then - called again after each write transaction which changes any of the keys or values - within the dictionary. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which keys in the dictionary were added, modified or deleted. If a write transaction - did not modify any keys or values in the dictionary, the block is not called at all. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - Person *person = [[Person allObjectsInRealm:realm] firstObject]; - NSLog(@"person.dogs.count: %zu", person.dogs.count); // => 0 - self.token = [person.dogs addNotificationBlock(RLMDictionary *dogs, - RLMDictionaryChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - person.dogs[@"frenchBulldog"] = dog; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a non-frozen managed dictionary. - - @param block The block to be called each time the dictionary changes. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMDictionary *_Nullable dictionary, - RLMDictionaryChange *_Nullable changes, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the dictionary changes. - - The block will be asynchronously called with the initial dictionary, and then - called again after each write transaction which changes any of the key-value in - the dictionary or which objects are in the results. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which keys in the dictionary were added or modified. If a write transaction - did not modify any objects in the dictionary, the block is not called at all. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMDictionary *_Nullable dictionary, - RLMDictionaryChange *_Nullable changes, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the dictionary changes. - - The block will be asynchronously called with the initial dictionary, and then - called again after each write transaction which changes any of the key-value in - the dictionary or which objects are in the results. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which keys in the dictionary were added or modified. If a write transaction - did not modify any objects in the dictionary, the block is not called at all. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMDictionary *_Nullable dictionary, - RLMDictionaryChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the dictionary changes. - - The block will be asynchronously called with the initial dictionary, and then - called again after each write transaction which changes any of the key-value in - the dictionary or which objects are in the results. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which keys in the dictionary were added or modified. If a write transaction - did not modify any objects in the dictionary, the block is not called at all. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMDictionary *_Nullable dictionary, - RLMDictionaryChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths -__attribute__((warn_unused_result)); - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of a dictionary. - - The frozen copy is an immutable dictionary which contains the same data as this - dictionary currently contains, but will not update when writes are made to the - containing Realm. Unlike live dictionaries, frozen dictionaries can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a managed dictionary. - @warning Holding onto a frozen dictionary for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -#pragma mark - Unavailable Methods -/** - `-[RLMDictionary init]` is not available because `RLMDictionary`s cannot be created directly. - `RLMDictionary` properties on `RLMObject`s are lazily created when accessed. - */ -- (instancetype)init __attribute__((unavailable("RLMDictionary cannot be created directly"))); -/** - `+[RLMDictionary new]` is not available because `RLMDictionary`s cannot be created directly. - `RLMDictionary` properties on `RLMObject`s are lazily created when accessed. - */ -+ (instancetype)new __attribute__((unavailable("RLMDictionary cannot be created directly"))); - -@end - -/** - A `RLMDictionaryChange` object encapsulates information about changes to dictionaries - that are reported by Realm notifications. - - `RLMDictionaryChange` is passed to the notification blocks registered with - `-addNotificationBlock` on `RLMDictionary`, and reports what keys in the - dictionary changed since the last time the notification block was called. - */ -@interface RLMDictionaryChange : NSObject -/// The keys in the new version of the dictionary which were newly inserted. -@property (nonatomic, readonly) NSArray *insertions; - -/// The keys in the new version of the dictionary which were modified. -@property (nonatomic, readonly) NSArray *modifications; - -/// The keys which were deleted from the old version. -@property (nonatomic, readonly) NSArray *deletions; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMEmailPasswordAuth.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMEmailPasswordAuth.h deleted file mode 100644 index 748eb26af..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMEmailPasswordAuth.h +++ /dev/null @@ -1,120 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@protocol RLMBSON; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// A block type used to report an error -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMEmailPasswordAuthOptionalErrorBlock)(NSError * _Nullable); - -/** - A client for the email/password authentication provider which - can be used to obtain a credential for logging in, - and to perform requests specifically related to the email/password provider. -*/ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMEmailPasswordAuth : RLMProviderClient - -/** - Registers a new email identity with the email/password provider, - and sends a confirmation email to the provided address. - - @param email The email address of the user to register. - @param password The password that the user created for the new email/password identity. - @param completionHandler A callback to be invoked once the call is complete. -*/ - -- (void)registerUserWithEmail:(NSString *)email - password:(NSString *)password - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler NS_SWIFT_NAME(registerUser(email:password:completion:)); - -/** - Confirms an email identity with the email/password provider. - - @param token The confirmation token that was emailed to the user. - @param tokenId The confirmation token id that was emailed to the user. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)confirmUser:(NSString *)token - tokenId:(NSString *)tokenId - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Re-sends a confirmation email to a user that has registered but - not yet confirmed their email address. - - @param email The email address of the user to re-send a confirmation for. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)resendConfirmationEmail:(NSString *)email - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Retries custom confirmation function for a given email address. - - @param email The email address of the user to retry custom confirmation logic. - @param completionHandler A callback to be invoked once the call is complete. - */ -- (void)retryCustomConfirmation:(NSString *)email - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Sends a password reset email to the given email address. - - @param email The email address of the user to send a password reset email for. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)sendResetPasswordEmail:(NSString *)email - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Resets the password of an email identity using the - password reset token emailed to a user. - - @param password The new password. - @param token The password reset token that was emailed to the user. - @param tokenId The password reset token id that was emailed to the user. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)resetPasswordTo:(NSString *)password - token:(NSString *)token - tokenId:(NSString *)tokenId - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Resets the password of an email identity using the - password reset function set up in the application. - - @param email The email address of the user. - @param password The desired new password. - @param args A list of arguments passed in as a BSON array. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)callResetPasswordFunction:(NSString *)email - password:(NSString *)password - args:(NSArray> *)args - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMEmbeddedObject.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMEmbeddedObject.h deleted file mode 100644 index 4db6248ca..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMEmbeddedObject.h +++ /dev/null @@ -1,367 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectSchema, RLMPropertyDescriptor, RLMRealm, RLMNotificationToken, RLMPropertyChange; -typedef void (^RLMObjectChangeBlock)(BOOL deleted, - NSArray *_Nullable changes, - NSError *_Nullable error); -/** - `RLMEmbeddedObject` is a base class used to define Realm model objects. - - Embedded objects work similarly to normal objects, but are owned by a single - parent Object (which itself may be embedded). Unlike normal top-level objects, - embedded objects cannot be directly created in or added to a Realm. Instead, - they can only be created as part of a parent object, or by assigning an - unmanaged object to a parent object's property. Embedded objects are - automatically deleted when the parent object is deleted or when the parent is - modified to no longer point at the embedded object, either by reassigning an - RLMObject property or by removing the embedded object from the array containing - it. - - Embedded objects can only ever have a single parent object which links to them, - and attempting to link to an existing managed embedded object will throw an - exception. - - The property types supported on `RLMEmbeddedObject` are the same as for - `RLMObject`, except for that embedded objects cannot link to top-level objects, - so `RLMObject` and `RLMArray` properties are not supported - (`RLMEmbeddedObject` and `RLMArray` *are*). - - Embedded objects cannot have primary keys or indexed properties. - */ - -@interface RLMEmbeddedObject : RLMObjectBase - -#pragma mark - Creating & Initializing Objects - -/** - Creates an unmanaged instance of a Realm object. - - Unmanaged embedded objects can be added to a Realm by assigning them to an - object property of a managed Realm object or by adding them to a managed - RLMArray. - */ -- (instancetype)init NS_DESIGNATED_INITIALIZER; - -/** - Creates an unmanaged instance of a Realm object. - - Pass in an `NSArray` or `NSDictionary` instance to set the values of the object's properties. - - Unmanaged embedded objects can be added to a Realm by assigning them to an - object property of a managed Realm object or by adding them to a managed - RLMArray. - */ -- (instancetype)initWithValue:(id)value; - -/** - Returns the class name for a Realm object subclass. - - @warning Do not override. Realm relies on this method returning the exact class - name. - - @return The class name for the model class. - */ -+ (NSString *)className; - -#pragma mark - Properties - -/** - The Realm which manages the object, or `nil` if the object is unmanaged. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - The object schema which lists the managed properties for the object. - */ -@property (nonatomic, readonly) RLMObjectSchema *objectSchema; - -/** - Indicates if the object can no longer be accessed because it is now invalid. - - An object can no longer be accessed if the object has been deleted from the Realm that manages it, or - if `invalidate` is called on that Realm. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if this object is frozen. - - @see `-[RLMEmbeddedObject freeze]` - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Customizing your Objects - -/** - Override this method to specify the default values to be used for each property. - - @return A dictionary mapping property names to their default values. - */ -+ (nullable NSDictionary *)defaultPropertyValues; - -/** - Override this method to specify the names of properties to ignore. These properties will not be managed by the Realm - that manages the object. - - @return An array of property names to ignore. - */ -+ (nullable NSArray *)ignoredProperties; - -/** - Override this method to specify the names of properties that are non-optional (i.e. cannot be assigned a `nil` value). - - By default, all properties of a type whose values can be set to `nil` are - considered optional properties. To require that an object in a Realm always - store a non-`nil` value for a property, add the name of the property to the - array returned from this method. - - Properties of `RLMEmbeddedObject` type cannot be non-optional. Array and - `NSNumber` properties can be non-optional, but there is no reason to do so: - arrays do not support storing nil, and if you want a non-optional number you - should instead use the primitive type. - - @return An array of property names that are required. - */ -+ (NSArray *)requiredProperties; - -/** - Override this method to provide information related to properties containing linking objects. - - Each property of type `RLMLinkingObjects` must have a key in the dictionary returned by this method consisting - of the property name. The corresponding value must be an instance of `RLMPropertyDescriptor` that describes the class - and property that the property is linked to. - - return @{ @"owners": [RLMPropertyDescriptor descriptorWithClass:Owner.class propertyName:@"dogs"] }; - - @return A dictionary mapping property names to `RLMPropertyDescriptor` instances. - */ -+ (NSDictionary *)linkingObjectsProperties; - -#pragma mark - Notifications - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in differen - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When notifications - can't be delivered instantly, multiple notifications may be coalesced into a - single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - - @param block The block to be called whenever a change occurs. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block queue:(dispatch_queue_t)queue; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block keyPaths:(NSArray *)keyPaths queue:(dispatch_queue_t)queue; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block keyPaths:(NSArray *)keyPaths; - -#pragma mark - Other Instance Methods - -/** - Returns YES if another Realm object instance points to the same object as the - receiver in the Realm managing the receiver. - - For frozen objects and object types with a primary key, `isEqual:` is - overridden to use the same logic as this method (along with a corresponding - implementation for `hash`). Non-frozen objects without primary keys use - pointer identity for `isEqual:` and `hash`. - - @param object The object to compare the receiver to. - - @return Whether the object represents the same object as the receiver. - */ -- (BOOL)isEqualToObject:(RLMEmbeddedObject *)object; - -/** - Returns a frozen (immutable) snapshot of this object. - - The frozen copy is an immutable object which contains the same data as this - object currently contains, but will not update when writes are made to the - containing Realm. Unlike live objects, frozen objects can be accessed from any - thread. - - - warning: Holding onto a frozen object for an extended period while performing write - transaction on the Realm may result in the Realm file growing to large sizes. See - `Realm.Configuration.maximumNumberOfActiveVersions` for more information. - - warning: This method can only be called on a managed object. - */ -- (instancetype)freeze NS_RETURNS_RETAINED; - -/** - Returns a live (mutable) reference of this object. - - This method creates a managed accessor to a live copy of the same frozen object. - Will return self if called on an already live object. - */ -- (instancetype)thaw; - -#pragma mark - Dynamic Accessors - -/// :nodoc: -- (nullable id)objectForKeyedSubscript:(NSString *)key; - -/// :nodoc: -- (void)setObject:(nullable id)obj forKeyedSubscript:(NSString *)key; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMError.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMError.h deleted file mode 100644 index 514ceee3f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMError.h +++ /dev/null @@ -1,442 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2022 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@protocol RLMValue; - -#pragma mark - Error Domains - -/** Error code is a value from the RLMError enum. */ -extern NSString *const RLMErrorDomain; - -/** An error domain identifying non-specific system errors. */ -extern NSString *const RLMUnknownSystemErrorDomain; - -/** - The error domain string for all SDK errors related to errors reported - by the synchronization manager error handler, as well as general sync - errors that don't fall into any of the other categories. - */ -extern NSString *const RLMSyncErrorDomain; - -/** - The error domain string for all SDK errors related to the authentication - endpoint. - */ -extern NSString *const RLMSyncAuthErrorDomain; - -/** -The error domain string for all SDK errors related to the Atlas App Services -endpoint. -*/ -extern NSString *const RLMAppErrorDomain; - -#pragma mark - RLMError - -/// A user info key containing the error code. This is provided for backwards -/// compatibility only and should not be used. -extern NSString *const RLMErrorCodeKey __attribute((deprecated("use -[NSError code]"))); - -/// A user info key containing the name of the error code. This is for -/// debugging purposes only and should not be relied on. -extern NSString *const RLMErrorCodeNameKey; - -/// A user info key present in sync errors which originate from the server, -/// containing the URL of the server-side logs associated with the error. -extern NSString * const RLMServerLogURLKey; - -/// A user info key containing a HTTP status code. Some ``RLMAppError`` codes -/// include this, most notably ``RLMAppErrorHttpRequestFailed``. -extern NSString * const RLMHTTPStatusCodeKey; - -/// A user info key containing a `RLMCompensatingWriteInfo` which includes -/// further details about what was reverted by the server. -extern NSString *const RLMCompensatingWriteInfoKey; - -/** - `RLMError` is an enumeration representing all recoverable errors. It is - associated with the Realm error domain specified in `RLMErrorDomain`. - */ -typedef RLM_ERROR_ENUM(NSInteger, RLMError, RLMErrorDomain) { - /** Denotes a general error that occurred when trying to open a Realm. */ - RLMErrorFail = 1, - - /** Denotes a file I/O error that occurred when trying to open a Realm. */ - RLMErrorFileAccess = 2, - - /** - Denotes a file permission error that occurred when trying to open a Realm. - - This error can occur if the user does not have permission to open or create - the specified file in the specified access mode when opening a Realm. - */ - RLMErrorFilePermissionDenied = 3, - - /** - Denotes an error where a file was to be written to disk, but another - file with the same name already exists. - */ - RLMErrorFileExists = 4, - - /** - Denotes an error that occurs if a file could not be found. - - This error may occur if a Realm file could not be found on disk when - trying to open a Realm as read-only, or if the directory part of the - specified path was not found when trying to write a copy. - */ - RLMErrorFileNotFound = 5, - - /** - Denotes an error that occurs if a file format upgrade is required to open - the file, but upgrades were explicitly disabled or the file is being open - in read-only mode. - */ - RLMErrorFileFormatUpgradeRequired = 6, - - /** - Denotes an error that occurs if the database file is currently open in - another process which cannot share with the current process due to an - architecture mismatch. - - This error may occur if trying to share a Realm file between an i386 - (32-bit) iOS Simulator and the Realm Studio application. In this case, - please use the 64-bit version of the iOS Simulator. - */ - RLMErrorIncompatibleLockFile = 8, - - /** - Denotes an error that occurs when there is insufficient available address - space to mmap the Realm file. - */ - RLMErrorAddressSpaceExhausted = 9, - - /** - Denotes an error that occurs if there is a schema version mismatch and a - migration is required. - */ - RLMErrorSchemaMismatch = 10, - - /** - Denotes an error where an operation was requested which cannot be - performed on an open file. - */ - RLMErrorAlreadyOpen = 12, - - /// Denotes an error where an input value was invalid. - RLMErrorInvalidInput = 13, - - /// Denotes an error where a write failed due to insufficient disk space. - RLMErrorOutOfDiskSpace = 14, - - /** - Denotes an error where a Realm file could not be opened because another - process has opened the same file in a way incompatible with inter-process - sharing. For example, this can result from opening the backing file for an - in-memory Realm in non-in-memory mode. - */ - RLMErrorIncompatibleSession = 15, - - /** - Denotes an error that occurs if the file is a valid Realm file, but has a - file format version which is not supported by this version of Realm. This - typically means that the file was written by a newer version of Realm, but - may also mean that it is from a pre-1.0 version of Realm (or for - synchronized files, pre-10.0). - */ - RLMErrorUnsupportedFileFormatVersion = 16, - - /** - Denotes an error that occurs if a synchronized Realm is opened in more - than one process at once. - */ - RLMErrorMultipleSyncAgents = 17, - - /// A subscription was rejected by the server. - RLMErrorSubscriptionFailed = 18, - - /// A file operation failed in a way which does not have a more specific error code. - RLMErrorFileOperationFailed = 19, - - /** - Denotes an error that occurs if the file being opened is not a valid Realm - file. Some of the possible causes of this are: - 1. The file at the given URL simply isn't a Realm file at all. - 2. The wrong encryption key was given. - 3. The Realm file is encrypted and no encryption key was given. - 4. The Realm file isn't encrypted but an encryption key was given. - 5. The file on disk has become corrupted. - */ - RLMErrorInvalidDatabase = 20, - - /** - Denotes an error that occurs if a Realm is opened in the wrong history - mode. Typically this means that either a local Realm is being opened as a - synchronized Realm or vice versa. - */ - RLMErrorIncompatibleHistories = 21, - - /** - Denotes an error that occurs if objects were written to a flexible sync - Realm without any active subscriptions for that object type. All objects - created in flexible sync Realms must match at least one active - subscription or the server will reject the write. - */ - RLMErrorNoSubscriptionForWrite = 22, -}; - -#pragma mark - RLMSyncError - -/// A user info key for use with `RLMSyncErrorClientResetError`. -extern NSString *const kRLMSyncPathOfRealmBackupCopyKey; - -/// A user info key for use with certain error types. -extern NSString *const kRLMSyncErrorActionTokenKey; - -/** - An error related to a problem that might be reported by the synchronization manager - error handler, or a callback on a sync-related API that performs asynchronous work. - */ -typedef RLM_ERROR_ENUM(NSInteger, RLMSyncError, RLMSyncErrorDomain) { - /// An error that indicates a problem with the session (a specific Realm opened for sync). - RLMSyncErrorClientSessionError = 4, - - /// An error that indicates a problem with a specific user. - RLMSyncErrorClientUserError = 5, - - /** - An error that indicates an internal, unrecoverable problem - with the underlying synchronization engine. - */ - RLMSyncErrorClientInternalError = 6, - - /** - An error that indicates the Realm needs to be reset. - - A synced Realm may need to be reset because Atlas App Services encountered an - error and had to be restored from a backup. If the backup copy of the remote Realm - is of an earlier version than the local copy of the Realm, the server will ask the - client to reset the Realm. - - The reset process is as follows: the local copy of the Realm is copied into a recovery - directory for safekeeping, and then deleted from the original location. The next time - the Realm for that partition value is opened, the Realm will automatically be re-downloaded from - Atlas App Services, and can be used as normal. - - Data written to the Realm after the local copy of the Realm diverged from the backup - remote copy will be present in the local recovery copy of the Realm file. The - re-downloaded Realm will initially contain only the data present at the time the Realm - was backed up on the server. - - The client reset process can be initiated in one of two ways. - - The `userInfo` dictionary contains an opaque token object under the key - `kRLMSyncErrorActionTokenKey`. This token can be passed into - `+[RLMSyncSession immediatelyHandleError:]` in order to immediately perform the client - reset process. This should only be done after your app closes and invalidates every - instance of the offending Realm on all threads (note that autorelease pools may make this - difficult to guarantee). - - If `+[RLMSyncSession immediatelyHandleError:]` is not called, the client reset process - will be automatically carried out the next time the app is launched and the - `RLMSyncManager` is accessed. - - The value for the `kRLMSyncPathOfRealmBackupCopyKey` key in the `userInfo` dictionary - describes the path of the recovered copy of the Realm. This copy will not actually be - created until the client reset process is initiated. - - @see `-[NSError rlmSync_errorActionToken]`, `-[NSError rlmSync_clientResetBackedUpRealmPath]` - */ - RLMSyncErrorClientResetError = 7, - - /// :nodoc: - RLMSyncErrorUnderlyingAuthError = 8, - - /** - An error that indicates the user does not have permission to perform an operation - upon a synced Realm. For example, a user may receive this error if they attempt to - open a Realm they do not have at least read access to, or write to a Realm they only - have read access to. - - This error may also occur if a user incorrectly opens a Realm they have read-only - permissions to without using the `asyncOpen()` APIs. - - A Realm that suffers a permission denied error is, by default, flagged so that its - local copy will be deleted the next time the application starts. - - The `userInfo` dictionary contains an opaque token object under the key - `kRLMSyncErrorActionTokenKey`. This token can be passed into - `+[RLMSyncSession immediatelyHandleError:]` in order to immediately delete the local - copy. This should only be done after your app closes and invalidates every instance - of the offending Realm on all threads (note that autorelease pools may make this - difficult to guarantee). - - @warning It is strongly recommended that, if a Realm has encountered a permission denied - error, its files be deleted before attempting to re-open it. - - @see `-[NSError rlmSync_errorActionToken]` - */ - RLMSyncErrorPermissionDeniedError = 9, - - /** - An error that indicates that the server has rejected the requested flexible sync subscriptions. - */ - RLMSyncErrorInvalidFlexibleSyncSubscriptions = 10, - - /** - An error that indicates that the server has reverted a write made by this - client. This can happen due to not having write permission, or because an - object was created in a flexible sync Realm which does not match any - active subscriptions. - - This error is informational and does not require any explicit handling. - */ - RLMSyncErrorWriteRejected = 11, - - /** - A connection error without a more specific error code occurred. - - Realm internally handles retrying connections with appropriate backoffs, - so connection errors are normally logged and not reported to the error - handler. The exception is if - ``RLMSyncConfiguration.cancelAsyncOpenOnNonFatalErrors`` is set to `true`, - in which case async opens will be canceled on connection failures and the - error will be reported to the completion handler. - - Note that connection timeouts are reported as - (errorDomain: NSPosixErrorDomain, error: ETIMEDOUT) - and not as one of these error codes. - */ - RLMSyncErrorConnectionFailed = 12, - - /** - Connecting to the server failed due to a TLS issue such as an invalid certificate. - */ - RLMSyncErrorTLSHandshakeFailed = 13, -}; - -#pragma mark - RLMSyncAuthError - -// NEXT-MAJOR: This was a ROS thing and should have been removed in v10 -/// :nodoc: -typedef RLM_ERROR_ENUM(NSInteger, RLMSyncAuthError, RLMSyncAuthErrorDomain) { - RLMSyncAuthErrorBadResponse = 1, - RLMSyncAuthErrorBadRemoteRealmPath = 2, - RLMSyncAuthErrorHTTPStatusCodeError = 3, - RLMSyncAuthErrorClientSessionError = 4, - RLMSyncAuthErrorInvalidParameters = 601, - RLMSyncAuthErrorMissingPath = 602, - RLMSyncAuthErrorInvalidCredential = 611, - RLMSyncAuthErrorUserDoesNotExist = 612, - RLMSyncAuthErrorUserAlreadyExists = 613, - RLMSyncAuthErrorAccessDeniedOrInvalidPath = 614, - RLMSyncAuthErrorInvalidAccessToken = 615, - RLMSyncAuthErrorFileCannotBeShared = 703, -} __attribute__((deprecated("Errors of this type are no longer reported"))); - -#pragma mark - RLMSyncAppError - -/// An error which occurred when making a request to Atlas App Services. -typedef RLM_ERROR_ENUM(NSInteger, RLMAppError, RLMAppErrorDomain) { - /// An unknown error has occurred - RLMAppErrorUnknown = -1, - - /// A HTTP request completed with an error status code. The failing status - /// code can be found in the ``RLMHTTPStatusCodeKey`` key of the userInfo - /// dictionary. - RLMAppErrorHttpRequestFailed = 1, - - /// A user's session is in an invalid state. Logging out and back in may rectify this. - RLMAppErrorInvalidSession, - /// A request sent to the server was malformed in some way. - RLMAppErrorBadRequest, - /// A request was made using a nonexistent user. - RLMAppErrorUserNotFound, - /// A request was made against an App using a User which does not belong to that App. - RLMAppErrorUserAppDomainMismatch, - /// The auth provider has limited the domain names which can be used for email addresses, and the given one is not allowed. - RLMAppErrorDomainNotAllowed, - /// The request body size exceeded a server-configured limit. - RLMAppErrorReadSizeLimitExceeded, - /// A request had an invalid parameter. - RLMAppErrorInvalidParameter, - /// A request was missing a required parameter. - RLMAppErrorMissingParameter, - /// Executing the requested server function failed with an error. - RLMAppErrorFunctionExecutionError, - /// The server encountered an internal error. - RLMAppErrorInternalServerError, - /// Authentication failed due to the request auth provider not existing. - RLMAppErrorAuthProviderNotFound, - /// The requested value does not exist. - RLMAppErrorValueNotFound, - /// The value being created already exists. - RLMAppErrorValueAlreadyExists, - /// A value with the same name as the value being created already exists. - RLMAppErrorValueDuplicateName, - /// The called server function does not exist. - RLMAppErrorFunctionNotFound, - /// The called server function has a syntax error. - RLMAppErrorFunctionSyntaxError, - /// The called server function is invalid in some way. - RLMAppErrorFunctionInvalid, - /// Registering an API key with the auth provider failed due to it already existing. - RLMAppErrorAPIKeyAlreadyExists, - /// The operation failed due to exceeding the server-configured time limit. - RLMAppErrorExecutionTimeLimitExceeded, - /// The body of the called function does not define a callable thing. - RLMAppErrorNotCallable, - /// Email confirmation failed for a user because the user has already confirmed their email. - RLMAppErrorUserAlreadyConfirmed, - /// The user cannot be used because it has been disabled. - RLMAppErrorUserDisabled, - /// An auth error occurred which does not have a more specific error code. - RLMAppErrorAuthError, - /// Account registration failed due to the user name already being taken. - RLMAppErrorAccountNameInUse, - /// A login request failed due to an invalid password. - RLMAppErrorInvalidPassword, - /// Operation failed due to server-side maintenance. - RLMAppErrorMaintenanceInProgress, - /// Operation failed due to an error reported by MongoDB. - RLMAppErrorMongoDBError, -}; - -/// Extended information about a write which was rejected by the server. -/// -/// The server will sometimes reject writes made by the client for reasons such -/// as permissions, additional server-side validation failing, or because the -/// object didn't match any flexible sync subscriptions. When this happens, a -/// ``RLMSyncErrorWriteRejected`` error is reported which contains an array of -/// `RLMCompensatingWriteInfo` objects in the ``RLMCompensatingWriteInfoKey`` -/// userInfo key with information about what writes were rejected and why. -/// -/// This information is intended for debugging and logging purposes only. The -/// `reason` strings are generated by the server and are not guaranteed to be -/// stable, so attempting to programmatically do anything with them will break -/// without warning. -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMCompensatingWriteInfo : NSObject -/// The class name of the object being written to. -@property (nonatomic, readonly) NSString *objectType; -/// The primary key of the object being written to. -@property (nonatomic, readonly) id primaryKey NS_REFINED_FOR_SWIFT; -/// A human-readable string describing why the write was rejected. -@property (nonatomic, readonly) NSString *reason; -@end diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMFindOneAndModifyOptions.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMFindOneAndModifyOptions.h deleted file mode 100644 index 3cce99f23..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMFindOneAndModifyOptions.h +++ /dev/null @@ -1,80 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) -@protocol RLMBSON; -@class RLMSortDescriptor; - -/// Options to use when executing a `findOneAndUpdate`, `findOneAndReplace`, -/// or `findOneAndDelete` command on a `RLMMongoCollection`. -@interface RLMFindOneAndModifyOptions : NSObject - -/// Limits the fields to return for all matching documents. -@property (nonatomic, nullable) id projection NS_REFINED_FOR_SWIFT; - -/// The order in which to return matching documents. -@property (nonatomic, nullable) id sort NS_REFINED_FOR_SWIFT -__attribute__((deprecated("Use `sorting` instead, which correctly sort more than one sort attribute", "sorting"))); - -/// The order in which to return matching documents. -@property (nonatomic) NSArray> *sorting NS_REFINED_FOR_SWIFT; - - -/// Whether or not to perform an upsert, default is false -/// (only available for find_one_and_replace and find_one_and_update) -@property (nonatomic) BOOL upsert; - -/// When true then the new document is returned, -/// Otherwise the old document is returned (default) -/// (only available for findOneAndReplace and findOneAndUpdate) -@property (nonatomic) BOOL shouldReturnNewDocument; - -/// Options to use when executing a `findOneAndUpdate`, `findOneAndReplace`, -/// or `findOneAndDelete` command on a `RLMMongoCollection`. -/// @param projection Limits the fields to return for all matching documents. -/// @param sort The order in which to return matching documents. -/// @param upsert Whether or not to perform an upsert, default is false -/// (only available for findOneAndReplace and findOneAndUpdate) -/// @param shouldReturnNewDocument When true then the new document is returned, -/// Otherwise the old document is returned (default), -/// (only available for findOneAndReplace and findOneAndUpdate) -- (instancetype)initWithProjection:(id _Nullable)projection - sort:(id _Nullable)sort - upsert:(BOOL)upsert - shouldReturnNewDocument:(BOOL)shouldReturnNewDocument -__attribute__((deprecated("Please use `initWithProjection:sorting:upsert:shouldReturnNewDocument:`"))) - NS_SWIFT_UNAVAILABLE("Please see FindOneAndModifyOptions"); - -/// Options to use when executing a `findOneAndUpdate`, `findOneAndReplace`, -/// or `findOneAndDelete` command on a `RLMMongoCollection`. -/// @param projection Limits the fields to return for all matching documents. -/// @param sorting The order in which to return matching documents. -/// @param upsert Whether or not to perform an upsert, default is false -/// (only available for findOneAndReplace and findOneAndUpdate) -/// @param shouldReturnNewDocument When true then the new document is returned, -/// Otherwise the old document is returned (default), -/// (only available for findOneAndReplace and findOneAndUpdate) -- (instancetype)initWithProjection:(id _Nullable)projection - sorting:(NSArray> *)sorting - upsert:(BOOL)upsert - shouldReturnNewDocument:(BOOL)shouldReturnNewDocument; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMFindOptions.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMFindOptions.h deleted file mode 100644 index 043a85374..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMFindOptions.h +++ /dev/null @@ -1,77 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@protocol RLMBSON; - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -@interface RLMFindOptions : NSObject - -/// The maximum number of documents to return. Specifying 0 will return all documents. -@property (nonatomic) NSInteger limit; - -/// Limits the fields to return for all matching documents. -@property (nonatomic, nullable) id projection NS_REFINED_FOR_SWIFT; - -/// The order in which to return matching documents. -@property (nonatomic, nullable) id sort NS_REFINED_FOR_SWIFT -__attribute__((deprecated("Use `sorting` instead, which correctly sort more than one sort attribute", "sorting"))); - -/// The order in which to return matching documents. -@property (nonatomic) NSArray> *sorting NS_REFINED_FOR_SWIFT; - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -/// @param limit The maximum number of documents to return. Specifying 0 will return all documents. -/// @param projection Limits the fields to return for all matching documents. -/// @param sort The order in which to return matching documents. -- (instancetype)initWithLimit:(NSInteger)limit - projection:(id _Nullable)projection - sort:(id _Nullable)sort -__attribute__((deprecated("Please use `initWithLimit:projection:sorting:`"))) - NS_SWIFT_UNAVAILABLE("Please see FindOption"); - - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -/// @param projection Limits the fields to return for all matching documents. -/// @param sort The order in which to return matching documents. -- (instancetype)initWithProjection:(id _Nullable)projection - sort:(id _Nullable)sort __deprecated -__attribute__((deprecated("Please use `initWithProjection:sorting:`"))) - NS_SWIFT_UNAVAILABLE("Please see FindOption"); - - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -/// @param limit The maximum number of documents to return. Specifying 0 will return all documents. -/// @param projection Limits the fields to return for all matching documents. -/// @param sorting The order in which to return matching documents. -- (instancetype)initWithLimit:(NSInteger)limit - projection:(id _Nullable)projection - sorting:(NSArray> *)sorting; - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -/// @param projection Limits the fields to return for all matching documents. -/// @param sorting The order in which to return matching documents. -- (instancetype)initWithProjection:(id _Nullable)projection - sorting:(NSArray> *)sorting; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMLogger.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMLogger.h deleted file mode 100644 index 96ab91967..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMLogger.h +++ /dev/null @@ -1,99 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -/// An enum representing different levels of sync-related logging that can be configured. -typedef RLM_CLOSED_ENUM(NSUInteger, RLMLogLevel) { - /// Nothing will ever be logged. - RLMLogLevelOff, - /// Only fatal errors will be logged. - RLMLogLevelFatal, - /// Only errors will be logged. - RLMLogLevelError, - /// Warnings and errors will be logged. - RLMLogLevelWarn, - /// Information about sync events will be logged. Fewer events will be logged in order to avoid overhead. - RLMLogLevelInfo, - /// Information about sync events will be logged. More events will be logged than with `RLMLogLevelInfo`. - RLMLogLevelDetail, - /// Log information that can aid in debugging. - /// - /// - warning: Will incur a measurable performance impact. - RLMLogLevelDebug, - /// Log information that can aid in debugging. More events will be logged than with `RLMLogLevelDebug`. - /// - /// - warning: Will incur a measurable performance impact. - RLMLogLevelTrace, - /// Log information that can aid in debugging. More events will be logged than with `RLMLogLevelTrace`. - /// - /// - warning: Will incur a measurable performance impact. - RLMLogLevelAll -} NS_SWIFT_NAME(LogLevel); - -/// A log callback function which can be set on RLMLogger. -/// -/// The log function may be called from multiple threads simultaneously, and is -/// responsible for performing its own synchronization if any is required. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void (^RLMLogFunction)(RLMLogLevel level, NSString *message); - -/** - `RLMLogger` is used for creating your own custom logging logic. - - You can define your own logger creating an instance of `RLMLogger` and define the log function which will be - invoked whenever there is a log message. - Set this custom logger as you default logger using `setDefaultLogger`. - - RLMLogger.defaultLogger = [[RLMLogger alloc] initWithLevel:RLMLogLevelDebug - logFunction:^(RLMLogLevel level, NSString * message) { - NSLog(@"Realm Log - %lu, %@", (unsigned long)level, message); - }]; - - @note By default default log threshold level is `RLMLogLevelInfo`, and logging strings are output to Apple System Logger. -*/ -@interface RLMLogger : NSObject - -/** - Gets the logging threshold level used by the logger. - */ -@property (nonatomic) RLMLogLevel level; - -/// :nodoc: -- (instancetype)init NS_UNAVAILABLE; - -/** - Creates a logger with the associated log level and the logic function to define your own logging logic. - - @param level The log level to be set for the logger. - @param logFunction The log function which will be invoked whenever there is a log message. -*/ -- (instancetype)initWithLevel:(RLMLogLevel)level logFunction:(RLMLogFunction)logFunction; - -#pragma mark RLMLogger Default Logger API - -/** - The current default logger. When setting a logger as default, this logger will be used whenever information must be logged. - */ -@property (class) RLMLogger *defaultLogger NS_SWIFT_NAME(shared); - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMMigration.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMMigration.h deleted file mode 100644 index 4a6652a19..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMMigration.h +++ /dev/null @@ -1,129 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMSchema; -@class RLMArray; -@class RLMObject; - -/** - A block type which provides both the old and new versions of an object in the Realm. Object - properties can only be accessed using keyed subscripting. - - @see `-[RLMMigration enumerateObjects:block:]` - - @param oldObject The object from the original Realm (read-only). - @param newObject The object from the migrated Realm (read-write). -*/ -typedef void (^RLMObjectMigrationBlock)(RLMObject * __nullable oldObject, RLMObject * __nullable newObject); - -/** - `RLMMigration` instances encapsulate information intended to facilitate a schema migration. - - A `RLMMigration` instance is passed into a user-defined `RLMMigrationBlock` block when updating - the version of a Realm. This instance provides access to the old and new database schemas, the - objects in the Realm, and provides functionality for modifying the Realm during the migration. - */ -@interface RLMMigration : NSObject - -#pragma mark - Properties - -/** - Returns the old `RLMSchema`. This is the schema which describes the Realm before the - migration is applied. - */ -@property (nonatomic, readonly) RLMSchema *oldSchema NS_REFINED_FOR_SWIFT; - -/** - Returns the new `RLMSchema`. This is the schema which describes the Realm after the - migration is applied. - */ -@property (nonatomic, readonly) RLMSchema *newSchema NS_REFINED_FOR_SWIFT; - - -#pragma mark - Altering Objects during a Migration - -/** - Enumerates all the objects of a given type in the Realm, providing both the old and new versions - of each object. Within the block, object properties can only be accessed using keyed subscripting. - - @param className The name of the `RLMObject` class to enumerate. - - @warning All objects returned are of a type specific to the current migration and should not be cast - to `className`. Instead, treat them as `RLMObject`s and use keyed subscripting to access - properties. - */ -- (void)enumerateObjects:(NSString *)className - block:(__attribute__((noescape)) RLMObjectMigrationBlock)block NS_REFINED_FOR_SWIFT; - -/** - Creates and returns an `RLMObject` instance of type `className` in the Realm being migrated. - - The `value` argument is used to populate the object. It can be a key-value coding compliant object, an array or - dictionary returned from the methods in `NSJSONSerialization`, or an array containing one element for each managed - property. An exception will be thrown if any required properties are not present and those properties were not defined - with default values. - - When passing in an `NSArray` as the `value` argument, all properties must be present, valid and in the same order as - the properties defined in the model. - - @param className The name of the `RLMObject` class to create. - @param value The value used to populate the object. - */ -- (RLMObject *)createObject:(NSString *)className withValue:(id)value NS_REFINED_FOR_SWIFT; - -/** - Deletes an object from a Realm during a migration. - - It is permitted to call this method from within the block passed to `-[enumerateObjects:block:]`. - - @param object Object to be deleted from the Realm being migrated. - */ -- (void)deleteObject:(RLMObject *)object NS_REFINED_FOR_SWIFT; - -/** - Deletes the data for the class with the given name. - - All objects of the given class will be deleted. If the `RLMObject` subclass no longer exists in your program, - any remaining metadata for the class will be removed from the Realm file. - - @param name The name of the `RLMObject` class to delete. - - @return A Boolean value indicating whether there was any data to delete. - */ -- (BOOL)deleteDataForClassName:(NSString *)name NS_REFINED_FOR_SWIFT; - -/** - Renames a property of the given class from `oldName` to `newName`. - - @param className The name of the class whose property should be renamed. This class must be present - in both the old and new Realm schemas. - @param oldName The old persisted property name for the property to be renamed. There must not be a property with this name in the - class as defined by the new Realm schema. - @param newName The new persisted property name for the property to be renamed. There must not be a property with this name in the - class as defined by the old Realm schema. - */ -- (void)renamePropertyForClass:(NSString *)className oldName:(NSString *)oldName - newName:(NSString *)newName NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMMongoClient.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMMongoClient.h deleted file mode 100644 index 50a1c226d..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMMongoClient.h +++ /dev/null @@ -1,47 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMApp; - -/// The `RLMMongoClient` enables reading and writing on a MongoDB database via the Realm Cloud service. -/// -/// It provides access to instances of `RLMMongoDatabase`, which in turn provide access to specific -/// `RLMMongoCollection`s that hold your data. -/// -/// - Note: -/// Before you can read or write data, a user must log in. -/// -/// - SeeAlso: -/// `RLMApp`, `RLMMongoDatabase`, `RLMMongoCollection` -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMMongoClient : NSObject - -/// The name of the client -@property (nonatomic, readonly) NSString *name; - -/// Gets a `RLMMongoDatabase` instance for the given database name. -/// @param name the name of the database to retrieve -- (RLMMongoDatabase *)databaseWithName:(NSString *)name NS_SWIFT_NAME(database(named:)); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMMongoCollection.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMMongoCollection.h deleted file mode 100644 index 0feae60ac..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMMongoCollection.h +++ /dev/null @@ -1,330 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) -@protocol RLMBSON; - -@class RLMFindOptions, RLMFindOneAndModifyOptions, RLMUpdateResult, RLMChangeStream, RLMObjectId; - -/// Delegate which is used for subscribing to changes on a `[RLMMongoCollection watch]` stream. -@protocol RLMChangeEventDelegate -/// The stream was opened. -/// @param changeStream The RLMChangeStream subscribing to the stream changes. -- (void)changeStreamDidOpen:(RLMChangeStream *)changeStream; -/// The stream has been closed. -/// @param error If an error occured when closing the stream, an error will be passed. -- (void)changeStreamDidCloseWithError:(nullable NSError *)error; -/// A error has occured while streaming. -/// @param error The streaming error. -- (void)changeStreamDidReceiveError:(NSError *)error; -/// Invoked when a change event has been received. -/// @param changeEvent The change event in BSON format. -- (void)changeStreamDidReceiveChangeEvent:(id)changeEvent; -@end - -/// Acts as a middleman and processes events with WatchStream -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMChangeStream : NSObject -/// Stops a watch streaming session. -- (void)close; -/// :nodoc: -- (instancetype)init NS_UNAVAILABLE; -@end - -/// The `RLMMongoCollection` represents a MongoDB collection. -/// -/// You can get an instance from a `RLMMongoDatabase`. -/// -/// Create, read, update, and delete methods are available. -/// -/// Operations against the Realm Cloud server are performed asynchronously. -/// -/// - Note: -/// Before you can read or write data, a user must log in. -/// - Usage: -/// RLMMongoClient *client = [self.app mongoClient:@"mongodb1"]; -/// RLMMongoDatabase *database = [client databaseWithName:@"test_data"]; -/// RLMMongoCollection *collection = [database collectionWithName:@"Dog"]; -/// [collection insertOneDocument:@{@"name": @"fido", @"breed": @"cane corso"} completion:...]; -/// -/// - SeeAlso: -/// `RLMMongoClient`, `RLMMongoDatabase` -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMMongoCollection : NSObject -/// Block which returns an object id on a successful insert, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoInsertBlock)(id _Nullable, NSError * _Nullable); -/// Block which returns an array of object ids on a successful insertMany, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoInsertManyBlock)(NSArray> * _Nullable, NSError * _Nullable); -/// Block which returns an array of Documents on a successful find operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoFindBlock)(NSArray> *> * _Nullable, - NSError * _Nullable); -/// Block which returns a Document on a successful findOne operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoFindOneBlock)(NSDictionary> * _Nullable_result, - NSError * _Nullable); -/// Block which returns the number of Documents in a collection on a successful count operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoCountBlock)(NSInteger, NSError * _Nullable); -/// Block which returns an RLMUpdateResult on a successful update operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoUpdateBlock)(RLMUpdateResult * _Nullable, NSError * _Nullable); -/// Block which returns the deleted Document on a successful delete operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoDeleteBlock)(NSDictionary> * _Nullable_result, - NSError * _Nullable); - -/// The name of this mongodb collection. -@property (nonatomic, readonly) NSString *name; - -/// Encodes the provided value to BSON and inserts it. If the value is missing an identifier, one will be -/// generated for it. -/// @param document A `Document` value to insert. -/// @param completion The result of attempting to perform the insert. An Id will be returned for the inserted object on sucess -- (void)insertOneDocument:(NSDictionary> *)document - completion:(RLMMongoInsertBlock)completion NS_REFINED_FOR_SWIFT; - -/// Encodes the provided values to BSON and inserts them. If any values are missing identifiers, -/// they will be generated. -/// @param documents The `Document` values in a bson array to insert. -/// @param completion The result of the insert, returns an array inserted document ids in order -- (void)insertManyDocuments:(NSArray> *> *)documents - completion:(RLMMongoInsertManyBlock)completion NS_REFINED_FOR_SWIFT; - -/// Finds the documents in this collection which match the provided filter. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param options `RLMFindOptions` to use when executing the command. -/// @param completion The resulting bson array of documents or error if one occurs -- (void)findWhere:(NSDictionary> *)filterDocument - options:(RLMFindOptions *)options - completion:(RLMMongoFindBlock)completion NS_REFINED_FOR_SWIFT; - -/// Finds the documents in this collection which match the provided filter. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param completion The resulting bson array as a string or error if one occurs -- (void)findWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoFindBlock)completion NS_REFINED_FOR_SWIFT; - -/// Returns one document from a collection or view which matches the -/// provided filter. If multiple documents satisfy the query, this method -/// returns the first document according to the query's sort order or natural -/// order. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param options `RLMFindOptions` to use when executing the command. -/// @param completion The resulting bson or error if one occurs -- (void)findOneDocumentWhere:(NSDictionary> *)filterDocument - options:(RLMFindOptions *)options - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Returns one document from a collection or view which matches the -/// provided filter. If multiple documents satisfy the query, this method -/// returns the first document according to the query's sort order or natural -/// order. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param completion The resulting bson or error if one occurs -- (void)findOneDocumentWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Runs an aggregation framework pipeline against this collection. -/// @param pipeline A bson array made up of `Documents` containing the pipeline of aggregation operations to perform. -/// @param completion The resulting bson array of documents or error if one occurs -- (void)aggregateWithPipeline:(NSArray> *> *)pipeline - completion:(RLMMongoFindBlock)completion NS_REFINED_FOR_SWIFT; - -/// Counts the number of documents in this collection matching the provided filter. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param limit The max amount of documents to count -/// @param completion Returns the count of the documents that matched the filter. -- (void)countWhere:(NSDictionary> *)filterDocument - limit:(NSInteger)limit - completion:(RLMMongoCountBlock)completion NS_REFINED_FOR_SWIFT; - -/// Counts the number of documents in this collection matching the provided filter. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param completion Returns the count of the documents that matched the filter. -- (void)countWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoCountBlock)completion NS_REFINED_FOR_SWIFT; - -/// Deletes a single matching document from the collection. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param completion The result of performing the deletion. Returns the count of deleted objects -- (void)deleteOneDocumentWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoCountBlock)completion NS_REFINED_FOR_SWIFT; - -/// Deletes multiple documents -/// @param filterDocument Document representing the match criteria -/// @param completion The result of performing the deletion. Returns the count of the deletion -- (void)deleteManyDocumentsWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoCountBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates a single document matching the provided filter in this collection. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param upsert When true, creates a new document if no document matches the query. -/// @param completion The result of the attempt to update a document. -- (void)updateOneDocumentWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - upsert:(BOOL)upsert - completion:(RLMMongoUpdateBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates a single document matching the provided filter in this collection. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param completion The result of the attempt to update a document. -- (void)updateOneDocumentWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - completion:(RLMMongoUpdateBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates multiple documents matching the provided filter in this collection. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param upsert When true, creates a new document if no document matches the query. -/// @param completion The result of the attempt to update a document. -- (void)updateManyDocumentsWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - upsert:(BOOL)upsert - completion:(RLMMongoUpdateBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates multiple documents matching the provided filter in this collection. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param completion The result of the attempt to update a document. -- (void)updateManyDocumentsWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - completion:(RLMMongoUpdateBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates a single document in a collection based on a query filter and -/// returns the document in either its pre-update or post-update form. Unlike -/// `updateOneDocument`, this action allows you to atomically find, update, and -/// return a document with the same command. This avoids the risk of other -/// update operations changing the document between separate find and update -/// operations. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param options `RemoteFindOneAndModifyOptions` to use when executing the command. -/// @param completion The result of the attempt to update a document. -- (void)findOneAndUpdateWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - options:(RLMFindOneAndModifyOptions *)options - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates a single document in a collection based on a query filter and -/// returns the document in either its pre-update or post-update form. Unlike -/// `updateOneDocument`, this action allows you to atomically find, update, and -/// return a document with the same command. This avoids the risk of other -/// update operations changing the document between separate find and update -/// operations. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param completion The result of the attempt to update a document. -- (void)findOneAndUpdateWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Overwrites a single document in a collection based on a query filter and -/// returns the document in either its pre-replacement or post-replacement -/// form. Unlike `updateOneDocument`, this action allows you to atomically find, -/// replace, and return a document with the same command. This avoids the -/// risk of other update operations changing the document between separate -/// find and update operations. -/// @param filterDocument A `Document` that should match the query. -/// @param replacementDocument A `Document` describing the replacement. -/// @param options `RLMFindOneAndModifyOptions` to use when executing the command. -/// @param completion The result of the attempt to replace a document. -- (void)findOneAndReplaceWhere:(NSDictionary> *)filterDocument - replacementDocument:(NSDictionary> *)replacementDocument - options:(RLMFindOneAndModifyOptions *)options - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Overwrites a single document in a collection based on a query filter and -/// returns the document in either its pre-replacement or post-replacement -/// form. Unlike `updateOneDocument`, this action allows you to atomically find, -/// replace, and return a document with the same command. This avoids the -/// risk of other update operations changing the document between separate -/// find and update operations. -/// @param filterDocument A `Document` that should match the query. -/// @param replacementDocument A `Document` describing the update. -/// @param completion The result of the attempt to replace a document. -- (void)findOneAndReplaceWhere:(NSDictionary> *)filterDocument - replacementDocument:(NSDictionary> *)replacementDocument - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Removes a single document from a collection based on a query filter and -/// returns a document with the same form as the document immediately before -/// it was deleted. Unlike `deleteOneDocument`, this action allows you to atomically -/// find and delete a document with the same command. This avoids the risk of -/// other update operations changing the document between separate find and -/// delete operations. -/// @param filterDocument A `Document` that should match the query. -/// @param options `RLMFindOneAndModifyOptions` to use when executing the command. -/// @param completion The result of the attempt to delete a document. -- (void)findOneAndDeleteWhere:(NSDictionary> *)filterDocument - options:(RLMFindOneAndModifyOptions *)options - completion:(RLMMongoDeleteBlock)completion NS_REFINED_FOR_SWIFT; - -/// Removes a single document from a collection based on a query filter and -/// returns a document with the same form as the document immediately before -/// it was deleted. Unlike `deleteOneDocument`, this action allows you to atomically -/// find and delete a document with the same command. This avoids the risk of -/// other update operations changing the document between separate find and -/// delete operations. -/// @param filterDocument A `Document` that should match the query. -/// @param completion The result of the attempt to delete a document. -- (void)findOneAndDeleteWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoDeleteBlock)completion NS_REFINED_FOR_SWIFT; - -/// Opens a MongoDB change stream against the collection to watch for changes. The resulting stream will be notified -/// of all events on this collection that the active user is authorized to see based on the configured MongoDB -/// rules. -/// @param delegate The delegate that will react to events and errors from the resulting change stream. -/// @param queue Dispatches streaming events to an optional queue, if no queue is provided the main queue is used -- (RLMChangeStream *)watchWithDelegate:(id)delegate - delegateQueue:(nullable dispatch_queue_t)queue NS_REFINED_FOR_SWIFT; - -/// Opens a MongoDB change stream against the collection to watch for changes -/// made to specific documents. The documents to watch must be explicitly -/// specified by their _id. -/// @param filterIds The list of _ids in the collection to watch. -/// @param delegate The delegate that will react to events and errors from the resulting change stream. -/// @param queue Dispatches streaming events to an optional queue, if no queue is provided the main queue is used -- (RLMChangeStream *)watchWithFilterIds:(NSArray *)filterIds - delegate:(id)delegate - delegateQueue:(nullable dispatch_queue_t)queue NS_REFINED_FOR_SWIFT; - -/// Opens a MongoDB change stream against the collection to watch for changes. The provided BSON document will be -/// used as a match expression filter on the change events coming from the stream. -/// -/// See https://docs.mongodb.com/manual/reference/operator/aggregation/match/ for documentation around how to define -/// a match filter. -/// -/// Defining the match expression to filter ChangeEvents is similar to defining the match expression for triggers: -/// https://docs.mongodb.com/realm/triggers/database-triggers/ -/// @param matchFilter The $match filter to apply to incoming change events -/// @param delegate The delegate that will react to events and errors from the resulting change stream. -/// @param queue Dispatches streaming events to an optional queue, if no queue is provided the main queue is used -- (RLMChangeStream *)watchWithMatchFilter:(NSDictionary> *)matchFilter - delegate:(id)delegate - delegateQueue:(nullable dispatch_queue_t)queue NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMMongoDatabase.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMMongoDatabase.h deleted file mode 100644 index 177fbc1b8..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMMongoDatabase.h +++ /dev/null @@ -1,51 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMMongoCollection; - -/// The `RLMMongoDatabase` represents a MongoDB database, which holds a group -/// of collections that contain your data. -/// -/// It can be retrieved from the `RLMMongoClient`. -/// -/// Use it to get `RLMMongoCollection`s for reading and writing data. -/// -/// - Note: -/// Before you can read or write data, a user must log in`. -/// -/// - SeeAlso: -/// `RLMMongoClient`, `RLMMongoCollection` -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMMongoDatabase : NSObject - -/// The name of this database -@property (nonatomic, readonly) NSString *name; - -/// Gets a collection. -/// @param name The name of the collection to return -/// @returns The collection -- (RLMMongoCollection *)collectionWithName:(NSString *)name; -// NEXT-MAJOR: NS_SWIFT_NAME(collection(named:)) - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMNetworkTransport.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMNetworkTransport.h deleted file mode 100644 index 2884b4296..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMNetworkTransport.h +++ /dev/null @@ -1,132 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// Allowed HTTP methods to be used with `RLMNetworkTransport`. -typedef RLM_CLOSED_ENUM(int32_t, RLMHTTPMethod) { - /// GET is used to request data from a specified resource. - RLMHTTPMethodGET = 0, - /// POST is used to send data to a server to create/update a resource. - RLMHTTPMethodPOST = 1, - /// PATCH is used to send data to a server to update a resource. - RLMHTTPMethodPATCH = 2, - /// PUT is used to send data to a server to create/update a resource. - RLMHTTPMethodPUT = 3, - /// The DELETE method deletes the specified resource. - RLMHTTPMethodDELETE = 4 -}; - -/// An HTTP request that can be made to an arbitrary server. -@interface RLMRequest : NSObject - -/// The HTTP method of this request. -@property (nonatomic, assign) RLMHTTPMethod method; - -/// The URL to which this request will be made. -@property (nonatomic, strong) NSString *url; - -/// The number of milliseconds that the underlying transport should spend on an -/// HTTP round trip before failing with an error. -@property (nonatomic, assign) NSTimeInterval timeout; - -/// The HTTP headers of this request. -@property (nonatomic, strong) NSDictionary* headers; - -/// The body of the request. -@property (nonatomic, strong) NSString* body; - -@end - -/// The contents of an HTTP response. -@interface RLMResponse : NSObject - -/// The status code of the HTTP response. -@property (nonatomic, assign) NSInteger httpStatusCode; - -/// A custom status code provided by the SDK. -@property (nonatomic, assign) NSInteger customStatusCode; - -/// The headers of the HTTP response. -@property (nonatomic, strong) NSDictionary* headers; - -/// The body of the HTTP response. -@property (nonatomic, strong) NSString *body; - -@end - -/// Delegate which is used for subscribing to changes. -@protocol RLMEventDelegate -/// Invoked when a change event has been received. -/// @param event The change event encoded as NSData -- (void)didReceiveEvent:(NSData *)event; -/// A error has occurred while subscribing to changes. -/// @param error The error that has occurred. -- (void)didReceiveError:(NSError *)error; -/// The stream was opened. -- (void)didOpen; -/// The stream has been closed. -/// @param error The error that has occurred. -- (void)didCloseWithError:(NSError *_Nullable)error; -@end - -/// A block for receiving an `RLMResponse` from the `RLMNetworkTransport`. -RLM_SWIFT_SENDABLE // invoked on a backgroun thread -typedef void(^RLMNetworkTransportCompletionBlock)(RLMResponse *); - -/// Transporting protocol for foreign interfaces. Allows for custom -/// request/response handling. -RLM_SWIFT_SENDABLE // used from multiple threads so must be internally thread-safe -@protocol RLMNetworkTransport - -/** - Sends a request to a given endpoint. - - @param request The request to send. - @param completionBlock A callback invoked on completion of the request. -*/ -- (void)sendRequestToServer:(RLMRequest *)request - completion:(RLMNetworkTransportCompletionBlock)completionBlock; - -/// Starts an event stream request. -/// @param request The RLMRequest to start. -/// @param subscriber The RLMEventDelegate which will subscribe to changes from the server. -- (NSURLSession *)doStreamRequest:(RLMRequest *)request - eventSubscriber:(id)subscriber; - -@end - -/// Transporting protocol for foreign interfaces. Allows for custom -/// request/response handling. -RLM_SWIFT_SENDABLE // is internally thread-safe -@interface RLMNetworkTransport : NSObject - -/** - Sends a request to a given endpoint. - - @param request The request to send. - @param completionBlock A callback invoked on completion of the request. -*/ -- (void)sendRequestToServer:(RLMRequest *) request - completion:(RLMNetworkTransportCompletionBlock)completionBlock; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMObject.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMObject.h deleted file mode 100644 index 9bcfbe310..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMObject.h +++ /dev/null @@ -1,811 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMNotificationToken; -@class RLMObjectSchema; -@class RLMPropertyChange; -@class RLMPropertyDescriptor; -@class RLMRealm; -@class RLMResults; - -/** - `RLMObject` is a base class for model objects representing data stored in Realms. - - Define your model classes by subclassing `RLMObject` and adding properties to be managed. - Then instantiate and use your custom subclasses instead of using the `RLMObject` class directly. - - // Dog.h - @interface Dog : RLMObject - @property NSString *name; - @property BOOL adopted; - @end - - // Dog.m - @implementation Dog - @end //none needed - - ### Supported property types - - - `NSString` - - `NSInteger`, `int`, `long`, `float`, and `double` - - `BOOL` or `bool` - - `NSDate` - - `NSData` - - `NSNumber`, where `X` is one of `RLMInt`, `RLMFloat`, `RLMDouble` or `RLMBool`, for optional number properties - - `RLMObject` subclasses, to model many-to-one relationships. - - `RLMArray`, where `X` is an `RLMObject` subclass, to model many-to-many relationships. - - ### Querying - - You can initiate queries directly via the class methods: `allObjects`, `objectsWhere:`, and `objectsWithPredicate:`. - These methods allow you to easily query a custom subclass for instances of that class in the default Realm. - - To search in a Realm other than the default Realm, use the `allObjectsInRealm:`, `objectsInRealm:where:`, - and `objectsInRealm:withPredicate:` class methods. - - @see `RLMRealm` - - ### Relationships - - See our [Realm Swift Documentation](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/relationships/#relationships) for more details. - - ### Key-Value Observing - - All `RLMObject` properties (including properties you create in subclasses) are - [Key-Value Observing compliant](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/KeyValueObserving/KeyValueObserving.html), - except for `realm` and `objectSchema`. - - Keep the following tips in mind when observing Realm objects: - - 1. Unlike `NSMutableArray` properties, `RLMArray` properties do not require - using the proxy object returned from `-mutableArrayValueForKey:`, or defining - KVC mutation methods on the containing class. You can simply call methods on - the `RLMArray` directly; any changes will be automatically observed by the containing - object. - 2. Unmanaged `RLMObject` instances cannot be added to a Realm while they have any - observed properties. - 3. Modifying managed `RLMObject`s within `-observeValueForKeyPath:ofObject:change:context:` - is not recommended. Properties may change even when the Realm is not in a write - transaction (for example, when `-[RLMRealm refresh]` is called after changes - are made on a different thread), and notifications sent prior to the change - being applied (when `NSKeyValueObservingOptionPrior` is used) may be sent at - times when you *cannot* begin a write transaction. - */ - -@interface RLMObject : RLMObjectBase - -#pragma mark - Creating & Initializing Objects - -/** - Creates an unmanaged instance of a Realm object. - - Call `addObject:` on an `RLMRealm` instance to add an unmanaged object into that Realm. - - @see `[RLMRealm addObject:]` - */ -- (instancetype)init NS_DESIGNATED_INITIALIZER; - - -/** - Creates an unmanaged instance of a Realm object. - - Pass in an `NSArray` or `NSDictionary` instance to set the values of the object's properties. - - Call `addObject:` on an `RLMRealm` instance to add an unmanaged object into that Realm. - - @see `[RLMRealm addObject:]` - */ -- (instancetype)initWithValue:(id)value; - - -/** - Returns the class name for a Realm object subclass. - - @warning Do not override. Realm relies on this method returning the exact class - name. - - @return The class name for the model class. - */ -+ (NSString *)className; - -/** - Creates an instance of a Realm object with a given value, and adds it to the default Realm. - - If nested objects are included in the argument, `createInDefaultRealmWithValue:` will be recursively called - on them. - - The `value` argument can be a key-value coding compliant object, an array or dictionary returned from the methods in - `NSJSONSerialization`, or an array containing one element for each managed property. - - An exception will be thrown if any required properties are not present and those properties - were not defined with default values. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param value The value used to populate the object. - - @see `defaultPropertyValues` - */ -+ (instancetype)createInDefaultRealmWithValue:(id)value; - -/** - Creates an instance of a Realm object with a given value, and adds it to the specified Realm. - - If nested objects are included in the argument, `createInRealm:withValue:` will be recursively called - on them. - - The `value` argument can be a key-value coding compliant object, an array or dictionary returned from the methods in - `NSJSONSerialization`, or an array containing one element for each managed property. - - An exception will be thrown if any required properties are not present and those properties - were not defined with default values. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param realm The Realm which should manage the newly-created object. - @param value The value used to populate the object. - - @see `defaultPropertyValues` - */ -+ (instancetype)createInRealm:(RLMRealm *)realm withValue:(id)value; - -/** - Creates or updates a Realm object within the default Realm. - - This method may only be called on Realm object types with a primary key defined. If there is already - an object with the same primary key value in the default Realm, its values are updated and the object - is returned. Otherwise, this method creates and populates a new instance of the object in the default Realm. - - If nested objects are included in the argument, `createOrUpdateInDefaultRealmWithValue:` will be - recursively called on them if they have primary keys, `createInDefaultRealmWithValue:` if they do not. - - The `value` argument is used to populate the object. It can be a Realm object, a key-value coding - compliant object, an array or dictionary returned from the methods in `NSJSONSerialization`, or an - array containing one element for each managed property. - - If the object is being created, an exception will be thrown if any required properties - are not present and those properties were not defined with default values. - - If the `value` argument is a Realm object already managed by the default Realm, the - argument's type is the same as the receiver, and the objects have identical values for - their managed properties, this method does nothing. - - If the object is being updated, each property defined in its schema will be set by copying from - `value` using key-value coding. If the `value` argument does not respond to `valueForKey:` for a - given property name (or getter name, if defined), that value will remain untouched. - Nullable properties on the object can be set to nil by using `NSNull` as the updated value. - Each property is set even if the existing value is the same as the new value being set, and - notifications will report them all being changed. See `createOrUpdateModifiedInDefaultRealmWithValue:` - for a version of this function which only sets the values which have changed. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param value The value used to populate the object. - - @see `defaultPropertyValues`, `primaryKey` - */ -+ (instancetype)createOrUpdateInDefaultRealmWithValue:(id)value; - -/** - Creates or updates a Realm object within the default Realm. - - This method may only be called on Realm object types with a primary key defined. If there is already - an object with the same primary key value in the default Realm, its values are updated and the object - is returned. Otherwise, this method creates and populates a new instance of the object in the default Realm. - - If nested objects are included in the argument, `createOrUpdateModifiedInDefaultRealmWithValue:` will be - recursively called on them if they have primary keys, `createInDefaultRealmWithValue:` if they do not. - - The `value` argument is used to populate the object. It can be a Realm object, a key-value coding - compliant object, an array or dictionary returned from the methods in `NSJSONSerialization`, or an - array containing one element for each managed property. - - If the object is being created, an exception will be thrown if any required properties - are not present and those properties were not defined with default values. - - If the `value` argument is a Realm object already managed by the default Realm, the - argument's type is the same as the receiver, and the objects have identical values for - their managed properties, this method does nothing. - - If the object is being updated, each property defined in its schema will be set by copying from - `value` using key-value coding. If the `value` argument does not respond to `valueForKey:` for a - given property name (or getter name, if defined), that value will remain untouched. - Nullable properties on the object can be set to nil by using `NSNull` as the updated value. - Unlike `createOrUpdateInDefaultRealmWithValue:`, only properties which have changed in value are - set, and any change notifications produced by this call will report only which properies have - actually changed. - - Checking which properties have changed imposes a small amount of overhead, and so this method - may be slower when all or nearly all of the properties being set have changed. If most or all - of the properties being set have not changed, this method will be much faster than unconditionally - setting all of them, and will also reduce how much data has to be written to the Realm, saving - both i/o time and disk space. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param value The value used to populate the object. - - @see `defaultPropertyValues`, `primaryKey` - */ -+ (instancetype)createOrUpdateModifiedInDefaultRealmWithValue:(id)value; - -/** - Creates or updates an Realm object within a specified Realm. - - This method may only be called on Realm object types with a primary key defined. If there is already - an object with the same primary key value in the given Realm, its values are updated and the object - is returned. Otherwise this method creates and populates a new instance of this object in the given Realm. - - If nested objects are included in the argument, `createOrUpdateInRealm:withValue:` will be - recursively called on them if they have primary keys, `createInRealm:withValue:` if they do not. - - The `value` argument is used to populate the object. It can be a Realm object, a key-value coding - compliant object, an array or dictionary returned from the methods in `NSJSONSerialization`, or an - array containing one element for each managed property. - - If the object is being created, an exception will be thrown if any required properties - are not present and those properties were not defined with default values. - - If the `value` argument is a Realm object already managed by the given Realm, the - argument's type is the same as the receiver, and the objects have identical values for - their managed properties, this method does nothing. - - If the object is being updated, each property defined in its schema will be set by copying from - `value` using key-value coding. If the `value` argument does not respond to `valueForKey:` for a - given property name (or getter name, if defined), that value will remain untouched. - Nullable properties on the object can be set to nil by using `NSNull` as the updated value. - Each property is set even if the existing value is the same as the new value being set, and - notifications will report them all being changed. See `createOrUpdateModifiedInRealm:withValue:` - for a version of this function which only sets the values which have changed. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param realm The Realm which should own the object. - @param value The value used to populate the object. - - @see `defaultPropertyValues`, `primaryKey` - */ -+ (instancetype)createOrUpdateInRealm:(RLMRealm *)realm withValue:(id)value; - -/** - Creates or updates an Realm object within a specified Realm. - - This method may only be called on Realm object types with a primary key defined. If there is already - an object with the same primary key value in the given Realm, its values are updated and the object - is returned. Otherwise this method creates and populates a new instance of this object in the given Realm. - - If nested objects are included in the argument, `createOrUpdateInRealm:withValue:` will be - recursively called on them if they have primary keys, `createInRealm:withValue:` if they do not. - - The `value` argument is used to populate the object. It can be a Realm object, a key-value coding - compliant object, an array or dictionary returned from the methods in `NSJSONSerialization`, or an - array containing one element for each managed property. - - If the object is being created, an exception will be thrown if any required properties - are not present and those properties were not defined with default values. - - If the `value` argument is a Realm object already managed by the given Realm, the - argument's type is the same as the receiver, and the objects have identical values for - their managed properties, this method does nothing. - - If the object is being updated, each property defined in its schema will be set by copying from - `value` using key-value coding. If the `value` argument does not respond to `valueForKey:` for a - given property name (or getter name, if defined), that value will remain untouched. - Nullable properties on the object can be set to nil by using `NSNull` as the updated value. - Unlike `createOrUpdateInRealm:withValue:`, only properties which have changed in value are - set, and any change notifications produced by this call will report only which properies have - actually changed. - - Checking which properties have changed imposes a small amount of overhead, and so this method - may be slower when all or nearly all of the properties being set have changed. If most or all - of the properties being set have not changed, this method will be much faster than unconditionally - setting all of them, and will also reduce how much data has to be written to the Realm, saving - both i/o time and disk space. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param realm The Realm which should own the object. - @param value The value used to populate the object. - - @see `defaultPropertyValues`, `primaryKey` - */ -+ (instancetype)createOrUpdateModifiedInRealm:(RLMRealm *)realm withValue:(id)value; - -#pragma mark - Properties - -/** - The Realm which manages the object, or `nil` if the object is unmanaged. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - The object schema which lists the managed properties for the object. - */ -@property (nonatomic, readonly) RLMObjectSchema *objectSchema; - -/** - Indicates if the object can no longer be accessed because it is now invalid. - - An object can no longer be accessed if the object has been deleted from the Realm that manages it, or - if `invalidate` is called on that Realm. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if this object is frozen. - - @see `-[RLMObject freeze]` - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - - -#pragma mark - Customizing your Objects - -/** - Returns an array of property names for properties which should be indexed. - - Only string, integer, boolean, and `NSDate` properties are supported. - - @return An array of property names. - */ -+ (NSArray *)indexedProperties; - -/** - Override this method to specify the default values to be used for each property. - - @return A dictionary mapping property names to their default values. - */ -+ (nullable NSDictionary *)defaultPropertyValues; - -/** - Override this method to specify the name of a property to be used as the primary key. - - Only properties of types `RLMPropertyTypeString` and `RLMPropertyTypeInt` can be designated as the primary key. - Primary key properties enforce uniqueness for each value whenever the property is set, which incurs minor overhead. - Indexes are created automatically for primary key properties. - - @return The name of the property designated as the primary key. - */ -+ (nullable NSString *)primaryKey; - -/** - Override this method to specify the names of properties to ignore. These properties will not be managed by the Realm - that manages the object. - - @return An array of property names to ignore. - */ -+ (nullable NSArray *)ignoredProperties; - -/** - Override this method to specify the names of properties that are non-optional (i.e. cannot be assigned a `nil` value). - - By default, all properties of a type whose values can be set to `nil` are considered optional properties. - To require that an object in a Realm always store a non-`nil` value for a property, - add the name of the property to the array returned from this method. - - Properties of `RLMObject` type cannot be non-optional. Array and `NSNumber` properties - can be non-optional, but there is no reason to do so: arrays do not support storing nil, and - if you want a non-optional number you should instead use the primitive type. - - @return An array of property names that are required. - */ -+ (NSArray *)requiredProperties; - -/** - Override this method to provide information related to properties containing linking objects. - - Each property of type `RLMLinkingObjects` must have a key in the dictionary returned by this method consisting - of the property name. The corresponding value must be an instance of `RLMPropertyDescriptor` that describes the class - and property that the property is linked to. - - return @{ @"owners": [RLMPropertyDescriptor descriptorWithClass:Owner.class propertyName:@"dogs"] }; - - @return A dictionary mapping property names to `RLMPropertyDescriptor` instances. - */ -+ (NSDictionary *)linkingObjectsProperties; - -#pragma mark - Getting & Querying Objects from the Default Realm - -/** - Returns all objects of this object type from the default Realm. - - @return An `RLMResults` containing all objects of this type in the default Realm. - */ -+ (RLMResults *)allObjects; - -/** - Returns all objects of this object type matching the given predicate from the default Realm. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` containing all objects of this type in the default Realm that match the given predicate. - */ -+ (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -+ (RLMResults<__kindof RLMObject *> *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - - -/** - Returns all objects of this object type matching the given predicate from the default Realm. - - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` containing all objects of this type in the default Realm that match the given predicate. - */ -+ (RLMResults *)objectsWithPredicate:(nullable NSPredicate *)predicate; - -/** - Retrieves the single instance of this object type with the given primary key from the default Realm. - - Returns the object from the default Realm which has the given primary key, or - `nil` if the object does not exist. This is slightly faster than the otherwise - equivalent `[[SubclassName objectsWhere:@"primaryKeyPropertyName = %@", key] firstObject]`. - - This method requires that `primaryKey` be overridden on the receiving subclass. - - @return An object of this object type, or `nil` if an object with the given primary key does not exist. - @see `-primaryKey` - */ -+ (nullable instancetype)objectForPrimaryKey:(nullable id)primaryKey NS_SWIFT_NAME(object(forPrimaryKey:)); - - -#pragma mark - Querying Specific Realms - -/** - Returns all objects of this object type from the specified Realm. - - @param realm The Realm to query. - - @return An `RLMResults` containing all objects of this type in the specified Realm. - */ -+ (RLMResults *)allObjectsInRealm:(RLMRealm *)realm; - -/** - Returns all objects of this object type matching the given predicate from the specified Realm. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - @param realm The Realm to query. - - @return An `RLMResults` containing all objects of this type in the specified Realm that match the given predicate. - */ -+ (RLMResults *)objectsInRealm:(RLMRealm *)realm where:(NSString *)predicateFormat, ...; - -/// :nodoc: -+ (RLMResults<__kindof RLMObject *> *)objectsInRealm:(RLMRealm *)realm where:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all objects of this object type matching the given predicate from the specified Realm. - - @param predicate A predicate to use to filter the elements. - @param realm The Realm to query. - - @return An `RLMResults` containing all objects of this type in the specified Realm that match the given predicate. - */ -+ (RLMResults *)objectsInRealm:(RLMRealm *)realm withPredicate:(nullable NSPredicate *)predicate; - -/** - Retrieves the single instance of this object type with the given primary key from the specified Realm. - - Returns the object from the specified Realm which has the given primary key, or - `nil` if the object does not exist. This is slightly faster than the otherwise - equivalent `[[SubclassName objectsInRealm:realm where:@"primaryKeyPropertyName = %@", key] firstObject]`. - - This method requires that `primaryKey` be overridden on the receiving subclass. - - @return An object of this object type, or `nil` if an object with the given primary key does not exist. - @see `-primaryKey` - */ -+ (nullable instancetype)objectInRealm:(RLMRealm *)realm forPrimaryKey:(nullable id)primaryKey NS_SWIFT_NAME(object(in:forPrimaryKey:)); - -#pragma mark - Notifications - -/** - A callback block for `RLMObject` notifications. - - If the object is deleted from the managing Realm, the block is called with - `deleted` set to `YES` and the other two arguments are `nil`. The block will - never be called again after this. - - If the object is modified, the block will be called with `deleted` set to - `NO`, a `nil` error, and an array of `RLMPropertyChange` objects which - indicate which properties of the objects were modified. - - `error` is always `nil` and will be removed in a future version. - */ -typedef void (^RLMObjectChangeBlock)(BOOL deleted, - NSArray *_Nullable changes, - NSError *_Nullable error); - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When notifications - can't be delivered instantly, multiple notifications may be coalesced into a - single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - - @param block The block to be called whenever a change occurs. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block queue:(dispatch_queue_t)queue; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block keyPaths:(NSArray *)keyPaths queue:(dispatch_queue_t)queue; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block keyPaths:(NSArray *)keyPaths; - - -#pragma mark - Other Instance Methods - -/** - Returns YES if another Realm object instance points to the same object as the receiver in the Realm managing - the receiver. - - For frozen objects and object types with a primary key, `isEqual:` is - overridden to use the same logic as this method (along with a corresponding - implementation for `hash`). Non-frozen objects without primary keys use - pointer identity for `isEqual:` and `hash`. - - @param object The object to compare the receiver to. - - @return Whether the object represents the same object as the receiver. - */ -- (BOOL)isEqualToObject:(RLMObject *)object; - -/** - Returns a frozen (immutable) snapshot of this object. - - The frozen copy is an immutable object which contains the same data as this - object currently contains, but will not update when writes are made to the - containing Realm. Unlike live objects, frozen objects can be accessed from any - thread. - - - warning: Holding onto a frozen object for an extended period while performing write - transaction on the Realm may result in the Realm file growing to large sizes. See - `Realm.Configuration.maximumNumberOfActiveVersions` for more information. - - warning: This method can only be called on a managed object. - */ -- (instancetype)freeze NS_RETURNS_RETAINED; - -/** - Returns a live (mutable) reference of this object. - - This method creates a managed accessor to a live copy of the same frozen object. - Will return self if called on an already live object. - */ -- (instancetype)thaw; - -#pragma mark - Dynamic Accessors - -/// :nodoc: -- (nullable id)objectForKeyedSubscript:(NSString *)key; - -/// :nodoc: -- (void)setObject:(nullable id)obj forKeyedSubscript:(NSString *)key; - -@end - -/** - Information about a specific property which changed in an `RLMObject` change notification. - */ -@interface RLMPropertyChange : NSObject - -/** - The name of the property which changed. - */ -@property (nonatomic, readonly, strong) NSString *name; - -/** - The value of the property before the change occurred. This will always be `nil` - if the change happened on the same thread as the notification and for `RLMArray` - properties. - - For object properties this will give the object which was previously linked to, - but that object will have its new values and not the values it had before the - changes. This means that `previousValue` may be a deleted object, and you will - need to check `invalidated` before accessing any of its properties. - */ -@property (nonatomic, readonly, strong, nullable) id previousValue; - -/** - The value of the property after the change occurred. This will always be `nil` - for `RLMArray` properties. - */ -@property (nonatomic, readonly, strong, nullable) id value; -@end - -#pragma mark - RLMArray Property Declaration - -/** - Properties on `RLMObject`s of type `RLMArray` must have an associated type. A type is associated - with an `RLMArray` property by defining a protocol for the object type that the array should contain. - To define the protocol for an object, you can use the macro RLM_ARRAY_TYPE: - - RLM_ARRAY_TYPE(ObjectType) - ... - @property RLMArray *arrayOfObjectTypes; - */ -#define RLM_ARRAY_TYPE(RLM_OBJECT_SUBCLASS)\ -__attribute__((deprecated("RLM_ARRAY_TYPE has been deprecated. Use RLM_COLLECTION_TYPE instead."))) \ -@protocol RLM_OBJECT_SUBCLASS \ -@end - -/** - Properties on `RLMObject`s of type `RLMSet` / `RLMArray` must have an associated type. A type is associated - with an `RLMSet` / `RLMArray` property by defining a protocol for the object type that the array should contain. - To define the protocol for an object, you can use the macro RLM_COLLECTION_TYPE: - - RLM_COLLECTION_TYPE(ObjectType) - ... - @property RLMSet *setOfObjectTypes; - @property RLMArray *arrayOfObjectTypes; - */ -#define RLM_COLLECTION_TYPE(RLM_OBJECT_SUBCLASS)\ -@protocol RLM_OBJECT_SUBCLASS \ -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMObjectBase.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMObjectBase.h deleted file mode 100644 index 7e9c83c8f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMObjectBase.h +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// :nodoc: -@interface RLMObjectBase : NSObject - -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -- (instancetype)init NS_DESIGNATED_INITIALIZER; - -+ (NSString *)className; - -// Returns whether the class is included in the default set of classes managed by a Realm. -+ (BOOL)shouldIncludeInDefaultSchema; - -+ (nullable NSString *)_realmObjectName; -+ (nullable NSDictionary *)_realmColumnNames; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMObjectBase_Dynamic.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMObjectBase_Dynamic.h deleted file mode 100644 index fb74a5b27..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMObjectBase_Dynamic.h +++ /dev/null @@ -1,82 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectSchema, RLMRealm; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -/** - Returns the Realm that manages the object, if one exists. - - @warning This function is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is - recommended to retrieve the Realm that manages the object via `RLMObject`. - - @param object An `RLMObjectBase` obtained via a Swift `Object` or `RLMObject`. - - @return The Realm which manages this object. Returns `nil `for unmanaged objects. - */ -FOUNDATION_EXTERN RLMRealm * _Nullable RLMObjectBaseRealm(RLMObjectBase * _Nullable object); - -/** - Returns an `RLMObjectSchema` which describes the managed properties of the object. - - @warning This function is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is - recommended to retrieve `objectSchema` via `RLMObject`. - - @param object An `RLMObjectBase` obtained via a Swift `Object` or `RLMObject`. - - @return The object schema which lists the managed properties for the object. - */ -FOUNDATION_EXTERN RLMObjectSchema * _Nullable RLMObjectBaseObjectSchema(RLMObjectBase * _Nullable object); - -/** - Returns the object corresponding to a key value. - - @warning This function is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is - recommended to retrieve key values via `RLMObject`. - - @warning Will throw an `NSUndefinedKeyException` if `key` is not present on the object. - - @param object An `RLMObjectBase` obtained via a Swift `Object` or `RLMObject`. - @param key The name of the property. - - @return The object for the property requested. - */ -FOUNDATION_EXTERN id _Nullable RLMObjectBaseObjectForKeyedSubscript(RLMObjectBase * _Nullable object, NSString *key); - -/** - Sets a value for a key on the object. - - @warning This function is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is - recommended to set key values via `RLMObject`. - - @warning Will throw an `NSUndefinedKeyException` if `key` is not present on the object. - - @param object An `RLMObjectBase` obtained via a Swift `Object` or `RLMObject`. - @param key The name of the property. - @param obj The object to set as the value of the key. - */ -FOUNDATION_EXTERN void RLMObjectBaseSetObjectForKeyedSubscript(RLMObjectBase * _Nullable object, NSString *key, id _Nullable obj); - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMObjectId.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMObjectId.h deleted file mode 100644 index 32ef7b047..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMObjectId.h +++ /dev/null @@ -1,79 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A 12-byte (probably) unique object identifier. - - ObjectIds are similar to a GUID or a UUID, and can be used to uniquely identify - objects without a centralized ID generator. An ObjectID consists of: - - 1. A 4 byte timestamp measuring the creation time of the ObjectId in seconds - since the Unix epoch. - 2. A 5 byte random value - 3. A 3 byte counter, initialized to a random value. - - ObjectIds are intended to be fast to generate. Sorting by an ObjectId field - will typically result in the objects being sorted in creation order. - */ -RLM_SWIFT_SENDABLE // immutable -@interface RLMObjectId : NSObject -/// Creates a new randomly-initialized ObjectId. -+ (nonnull instancetype)objectId NS_SWIFT_NAME(generate()); - -/// Creates a new zero-initialized ObjectId. -- (instancetype)init; - -/// Creates a new ObjectId from the given 24-byte hexadecimal string. -/// -/// Returns `nil` and sets `error` if the string is not 24 characters long or -/// contains any characters other than 0-9a-fA-F. -/// -/// @param string The string to parse. -- (nullable instancetype)initWithString:(NSString *)string - error:(NSError **)error; - -/// Creates a new ObjectId using the given date, machine identifier, process identifier. -/// -/// @param timestamp A timestamp as NSDate. -/// @param machineIdentifier The machine identifier. -/// @param processIdentifier The process identifier. -- (instancetype)initWithTimestamp:(NSDate *)timestamp - machineIdentifier:(int)machineIdentifier - processIdentifier:(int)processIdentifier; - -/// Comparision operator to check if the right hand side is greater than the current value. -- (BOOL)isGreaterThan:(nullable RLMObjectId *)objectId; -/// Comparision operator to check if the right hand side is greater than or equal to the current value. -- (BOOL)isGreaterThanOrEqualTo:(nullable RLMObjectId *)objectId; -/// Comparision operator to check if the right hand side is less than the current value. -- (BOOL)isLessThan:(nullable RLMObjectId *)objectId; -/// Comparision operator to check if the right hand side is less than or equal to the current value. -- (BOOL)isLessThanOrEqualTo:(nullable RLMObjectId *)objectId; - -/// Get the ObjectId as a 24-character hexadecimal string. -@property (nonatomic, readonly) NSString *stringValue; -/// Get the timestamp for the RLMObjectId -@property (nonatomic, readonly) NSDate *timestamp; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMObjectSchema.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMObjectSchema.h deleted file mode 100644 index 9c4666b7c..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMObjectSchema.h +++ /dev/null @@ -1,83 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMProperty; - -/** - This class represents Realm model object schemas. - - When using Realm, `RLMObjectSchema` instances allow performing migrations and - introspecting the database's schema. - - Object schemas map to tables in the core database. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // not actually immutable, but the public API kinda is -@interface RLMObjectSchema : NSObject - -#pragma mark - Properties - -/** - An array of `RLMProperty` instances representing the managed properties of a class described by the schema. - - @see `RLMProperty` - */ -@property (nonatomic, readonly, copy) NSArray *properties; - -/** - The name of the class the schema describes. - */ -@property (nonatomic, readonly) NSString *className; - -/** - The property which serves as the primary key for the class the schema describes, if any. - */ -@property (nonatomic, readonly, nullable) RLMProperty *primaryKeyProperty; - -/** - Whether this object type is embedded. - */ -@property (nonatomic, readonly) BOOL isEmbedded; - -/** - Whether this object is asymmetric. - */ -@property (nonatomic, readonly) BOOL isAsymmetric; - -#pragma mark - Methods - -/** - Retrieves an `RLMProperty` object by the property name. - - @param propertyName The property's name. - - @return An `RLMProperty` object, or `nil` if there is no property with the given name. - */ -- (nullable RLMProperty *)objectForKeyedSubscript:(NSString *)propertyName; - -/** - Returns whether two `RLMObjectSchema` instances are equal. - */ -- (BOOL)isEqualToObjectSchema:(RLMObjectSchema *)objectSchema; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMProperty.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMProperty.h deleted file mode 100644 index 7f2594d3b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMProperty.h +++ /dev/null @@ -1,149 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// :nodoc: -@protocol RLMInt @end -/// :nodoc: -@protocol RLMBool @end -/// :nodoc: -@protocol RLMDouble @end -/// :nodoc: -@protocol RLMFloat @end -/// :nodoc: -@protocol RLMString @end -/// :nodoc: -@protocol RLMDate @end -/// :nodoc: -@protocol RLMData @end -/// :nodoc: -@protocol RLMDecimal128 @end -/// :nodoc: -@protocol RLMObjectId @end -/// :nodoc: -@protocol RLMUUID @end - -/// :nodoc: -@interface NSNumber () -@end - -/** - `RLMProperty` instances represent properties managed by a Realm in the context - of an object schema. Such properties may be persisted to a Realm file or - computed from other data from the Realm. - - When using Realm, `RLMProperty` instances allow performing migrations and - introspecting the database's schema. - - These property instances map to columns in the core database. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // not actually immutable, but the public API kinda is -@interface RLMProperty : NSObject - -#pragma mark - Properties - -/** - The name of the property. - */ -@property (nonatomic, readonly) NSString *name; - -/** - The type of the property. - - @see `RLMPropertyType` - */ -@property (nonatomic, readonly) RLMPropertyType type; - -/** - Indicates whether this property is indexed. - - @see `RLMObject` - */ -@property (nonatomic, readonly) BOOL indexed; - -/** - For `RLMObject` and `RLMCollection` properties, the name of the class of object stored in the property. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - For linking objects properties, the property name of the property the linking objects property is linked to. - */ -@property (nonatomic, readonly, copy, nullable) NSString *linkOriginPropertyName; - -/** - Indicates whether this property is optional. - */ -@property (nonatomic, readonly) BOOL optional; - -/** - Indicates whether this property is an array. - */ -@property (nonatomic, readonly) BOOL array; - -/** - Indicates whether this property is a set. - */ -@property (nonatomic, readonly) BOOL set; - -/** - Indicates whether this property is a dictionary. - */ -@property (nonatomic, readonly) BOOL dictionary; - -/** - Indicates whether this property is an array or set. - */ -@property (nonatomic, readonly) BOOL collection; - -#pragma mark - Methods - -/** - Returns whether a given property object is equal to the receiver. - */ -- (BOOL)isEqualToProperty:(RLMProperty *)property; - -@end - - -/** - An `RLMPropertyDescriptor` instance represents a specific property on a given class. - */ -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMPropertyDescriptor : NSObject - -/** - Creates and returns a property descriptor. - - @param objectClass The class of this property descriptor. - @param propertyName The name of this property descriptor. - */ -+ (instancetype)descriptorWithClass:(Class)objectClass propertyName:(NSString *)propertyName; - -/// The class of the property. -@property (nonatomic, readonly) Class objectClass; - -/// The name of the property. -@property (nonatomic, readonly) NSString *propertyName; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMProviderClient.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMProviderClient.h deleted file mode 100644 index ac649960a..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMProviderClient.h +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMApp; - -/// Base provider client interface. -RLM_SWIFT_SENDABLE -@interface RLMProviderClient : NSObject - -/// The app associated with this provider client. -@property (nonatomic, strong, readonly) RLMApp *app; - -/** - Initialize a provider client with a given app. - @param app The app for this provider client. - */ -- (instancetype)initWithApp:(RLMApp *)app; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMPushClient.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMPushClient.h deleted file mode 100644 index 0628c3ada..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMPushClient.h +++ /dev/null @@ -1,47 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMApp, RLMUser; - -/// A block type used to report an error -RLM_SWIFT_SENDABLE // invoked on a backgroun thread -typedef void(^RLMOptionalErrorBlock)(NSError * _Nullable); - -/// A client which can be used to register devices with the server to receive push notificatons -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMPushClient : NSObject - -/// The push notification service name the device will be registered with on the server -@property (nonatomic, readonly, nonnull) NSString *serviceName; - -/// Request to register device token to the server -- (void)registerDeviceWithToken:(NSString *)token - user:(RLMUser *)user - completion:(RLMOptionalErrorBlock)completion NS_SWIFT_NAME(registerDevice(token:user:completion:)); - -/// Request to deregister a device for a user -- (void)deregisterDeviceForUser:(RLMUser *)user - completion:(RLMOptionalErrorBlock)completion NS_SWIFT_NAME(deregisterDevice(user:completion:)); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMRealm+Sync.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMRealm+Sync.h deleted file mode 100644 index ff20e43c2..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMRealm+Sync.h +++ /dev/null @@ -1,38 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2017 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -@class RLMResults, RLMSyncSession; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -/// -@interface RLMRealm (Sync) - -/** - Get the RLMSyncSession used by this Realm. Will be nil if this is not a - synchronized Realm. -*/ -@property (nonatomic, nullable, readonly) RLMSyncSession *syncSession; - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMRealm.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMRealm.h deleted file mode 100644 index 0935e5301..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMRealm.h +++ /dev/null @@ -1,962 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMRealmConfiguration, RLMRealm, RLMObject, RLMSchema, RLMMigration, RLMNotificationToken, RLMThreadSafeReference, RLMAsyncOpenTask, RLMSyncSubscriptionSet; - -/** - A callback block for opening Realms asynchronously. - - Returns the Realm if the open was successful, or an error otherwise. - */ -typedef void(^RLMAsyncOpenRealmCallback)(RLMRealm * _Nullable realm, NSError * _Nullable error); - -/// The Id of the asynchronous transaction. -typedef unsigned RLMAsyncTransactionId; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - An `RLMRealm` instance (also referred to as "a Realm") represents a Realm - database. - - Realms can either be stored on disk (see `+[RLMRealm realmWithURL:]`) or in - memory (see `RLMRealmConfiguration`). - - `RLMRealm` instances are cached internally, and constructing equivalent `RLMRealm` - objects (for example, by using the same path or identifier) multiple times on a single thread - within a single iteration of the run loop will normally return the same - `RLMRealm` object. - - If you specifically want to ensure an `RLMRealm` instance is - destroyed (for example, if you wish to open a Realm, check some property, and - then possibly delete the Realm file and re-open it), place the code which uses - the Realm within an `@autoreleasepool {}` and ensure you have no other - strong references to it. - - @warning Non-frozen `RLMRealm` instances are thread-confined and cannot be - shared across threads or dispatch queues. Trying to do so will cause an - exception to be thrown. You must call this method on each thread you want to - interact with the Realm on. For dispatch queues, this means that you must call - it in each block which is dispatched, as a queue is not guaranteed to run all - of its blocks on the same thread. - */ - -@interface RLMRealm : NSObject - -#pragma mark - Creating & Initializing a Realm - -/** - Obtains an instance of the default Realm. - - The default Realm is used by the `RLMObject` class methods - which do not take an `RLMRealm` parameter, but is otherwise not special. The - default Realm is persisted as *default.realm* under the *Documents* directory of - your Application on iOS, in your application's *Application Support* - directory on macOS, and in the *Cache* directory on tvOS. - - The default Realm is created using the default `RLMRealmConfiguration`, which - can be changed via `+[RLMRealmConfiguration setDefaultConfiguration:]`. - - @return The default `RLMRealm` instance for the current thread. - */ -+ (instancetype)defaultRealm; - -/** - Obtains an instance of the default Realm bound to the given queue. - - Rather than being confined to the thread they are opened on, queue-bound - RLMRealms are confined to the given queue. They can be accessed from any - thread as long as it is from within a block dispatch to the queue, and - notifications will be delivered to the queue instead of a thread's run loop. - - Realms can only be confined to a serial queue. Queue-confined RLMRealm - instances can be obtained when not on that queue, but attempting to do - anything with that instance without first dispatching to the queue will throw - an incorrect thread exception. - - The default Realm is created using the default `RLMRealmConfiguration`, which - can be changed via `+[RLMRealmConfiguration setDefaultConfiguration:]`. - - @param queue A serial dispatch queue to confine the Realm to. - @return The default `RLMRealm` instance for the given queue. - */ -+ (instancetype)defaultRealmForQueue:(dispatch_queue_t)queue; - -/** - Obtains an `RLMRealm` instance with the given configuration. - - @param configuration A configuration object to use when creating the Realm. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return An `RLMRealm` instance. - */ -+ (nullable instancetype)realmWithConfiguration:(RLMRealmConfiguration *)configuration error:(NSError **)error; - -/** - Obtains an `RLMRealm` instance with the given configuration bound to the given queue. - - Rather than being confined to the thread they are opened on, queue-bound - RLMRealms are confined to the given queue. They can be accessed from any - thread as long as it is from within a block dispatch to the queue, and - notifications will be delivered to the queue instead of a thread's run loop. - - Realms can only be confined to a serial queue. Queue-confined RLMRealm - instances can be obtained when not on that queue, but attempting to do - anything with that instance without first dispatching to the queue will throw - an incorrect thread exception. - - @param configuration A configuration object to use when creating the Realm. - @param queue A serial dispatch queue to confine the Realm to. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return An `RLMRealm` instance. - */ -+ (nullable instancetype)realmWithConfiguration:(RLMRealmConfiguration *)configuration - queue:(nullable dispatch_queue_t)queue - error:(NSError **)error; - -/** - Obtains an `RLMRealm` instance persisted at a specified file URL. - - @param fileURL The local URL of the file the Realm should be saved at. - - @return An `RLMRealm` instance. - */ -+ (instancetype)realmWithURL:(NSURL *)fileURL; - -/** - Asynchronously open a Realm and deliver it to a block on the given queue. - - Opening a Realm asynchronously will perform all work needed to get the Realm to - a usable state (such as running potentially time-consuming migrations) on a - background thread before dispatching to the given queue. In addition, - synchronized Realms wait for all remote content available at the time the - operation began to be downloaded and available locally. - - The Realm passed to the callback function is confined to the callback queue as - if `-[RLMRealm realmWithConfiguration:queue:error]` was used. - - @param configuration A configuration object to use when opening the Realm. - @param callbackQueue The serial dispatch queue on which the callback should be run. - @param callback A callback block. If the Realm was successfully opened, - it will be passed in as an argument. - Otherwise, an `NSError` describing what went wrong will be - passed to the block instead. - */ -+ (RLMAsyncOpenTask *)asyncOpenWithConfiguration:(RLMRealmConfiguration *)configuration - callbackQueue:(dispatch_queue_t)callbackQueue - callback:(RLMAsyncOpenRealmCallback)callback; - -/** - The `RLMSchema` used by the Realm. - */ -@property (nonatomic, readonly) RLMSchema *schema; - -/** - Indicates if the Realm is currently engaged in a write transaction. - - @warning Do not simply check this property and then start a write transaction whenever an object needs to be - created, updated, or removed. Doing so might cause a large number of write transactions to be created, - degrading performance. Instead, always prefer performing multiple updates during a single transaction. - */ -@property (nonatomic, readonly) BOOL inWriteTransaction; - -/** - The `RLMRealmConfiguration` object that was used to create this `RLMRealm` instance. - */ -@property (nonatomic, readonly) RLMRealmConfiguration *configuration; - -/** - Indicates if this Realm contains any objects. - */ -@property (nonatomic, readonly) BOOL isEmpty; - -/** - Indicates if this Realm is frozen. - - @see `-[RLMRealm freeze]` - */ -@property (nonatomic, readonly, getter=isFrozen) BOOL frozen; - -/** - Returns a frozen (immutable) snapshot of this Realm. - - A frozen Realm is an immutable snapshot view of a particular version of a - Realm's data. Unlike normal RLMRealm instances, it does not live-update to - reflect writes made to the Realm, and can be accessed from any thread. Writing - to a frozen Realm is not allowed, and attempting to begin a write transaction - will throw an exception. - - All objects and collections read from a frozen Realm will also be frozen. - */ -- (RLMRealm *)freeze NS_RETURNS_RETAINED; - -/** - Returns a live reference of this Realm. - - All objects and collections read from the returned Realm will no longer be frozen. - This method will return `self` if it is not already frozen. - */ -- (RLMRealm *)thaw; - -#pragma mark - File Management - -/** - Writes a compacted and optionally encrypted copy of the Realm to the given local URL. - - The destination file cannot already exist. - - Note that if this method is called from within a write transaction, the - *current* data is written, not the data from the point when the previous write - transaction was committed. - - @param fileURL Local URL to save the Realm to. - @param key Optional 64-byte encryption key to encrypt the new file with. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return `YES` if the Realm was successfully written to disk, `NO` if an error occurred. - */ -- (BOOL)writeCopyToURL:(NSURL *)fileURL encryptionKey:(nullable NSData *)key error:(NSError **)error; - -/** - Writes a copy of the Realm to a given location specified by a given configuration. - - If the configuration supplied is derived from a `RLMUser` then this Realm will be copied with - sync functionality enabled. - - The destination file cannot already exist. - - @param configuration A Realm Configuration. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return `YES` if the Realm was successfully written to disk, `NO` if an error occurred. - */ -- (BOOL)writeCopyForConfiguration:(RLMRealmConfiguration *)configuration error:(NSError **)error; - -/** - Checks if the Realm file for the given configuration exists locally on disk. - - For non-synchronized, non-in-memory Realms, this is equivalent to - `-[NSFileManager.defaultManager fileExistsAtPath:config.path]`. For - synchronized Realms, it takes care of computing the actual path on disk based - on the server, virtual path, and user as is done when opening the Realm. - - @param config A Realm configuration to check the existence of. - @return YES if the Realm file for the given configuration exists on disk, NO otherwise. - */ -+ (BOOL)fileExistsForConfiguration:(RLMRealmConfiguration *)config; - -/** - Deletes the local Realm file and associated temporary files for the given configuration. - - This deletes the ".realm", ".note" and ".management" files which would be - created by opening the Realm with the given configuration. It does not delete - the ".lock" file (which contains no persisted data and is recreated from - scratch every time the Realm file is opened). - - The Realm must not be currently open on any thread or in another process. If - it is, this will return NO and report the error RLMErrorAlreadyOpen. Attempting to open - the Realm on another thread while the deletion is happening will block (and - then create a new Realm and open that afterwards). - - If the Realm already does not exist this will return `NO` and report the error NSFileNoSuchFileError; - - @param config A Realm configuration identifying the Realm to be deleted. - @return YES if any files were deleted, NO otherwise. - */ -+ (BOOL)deleteFilesForConfiguration:(RLMRealmConfiguration *)config error:(NSError **)error - __attribute__((swift_error(nonnull_error))); - -#pragma mark - Notifications - -/** - The type of a block to run whenever the data within the Realm is modified. - - @see `-[RLMRealm addNotificationBlock:]` - */ -typedef void (^RLMNotificationBlock)(RLMNotification notification, RLMRealm *realm); - -#pragma mark - Receiving Notification when a Realm Changes - -/** - Adds a notification handler for changes in this Realm, and returns a notification token. - - Notification handlers are called after each write transaction is committed, - either on the current thread or other threads. - - Handler blocks are called on the same thread that they were added on, and may - only be added on threads which are currently within a run loop. Unless you are - specifically creating and running a run loop on a background thread, this will - normally only be the main thread. - - The block has the following definition: - - typedef void(^RLMNotificationBlock)(RLMNotification notification, RLMRealm *realm); - - It receives the following parameters: - - - `NSString` \***notification**: The name of the incoming notification. See - `RLMRealmNotification` for information on what - notifications are sent. - - `RLMRealm` \***realm**: The Realm for which this notification occurred. - - @param block A block which is called to process Realm notifications. - - @return A token object which must be retained as long as you wish to continue - receiving change notifications. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMNotificationBlock)block __attribute__((warn_unused_result)); - -#pragma mark - Writing to a Realm - -/** - Begins a write transaction on the Realm. - - Only one write transaction can be open at a time for each Realm file. Write - transactions cannot be nested, and trying to begin a write transaction on a - Realm which is already in a write transaction will throw an exception. Calls to - `beginWriteTransaction` from `RLMRealm` instances for the same Realm file in - other threads or other processes will block until the current write transaction - completes or is cancelled. - - Before beginning the write transaction, `beginWriteTransaction` updates the - `RLMRealm` instance to the latest Realm version, as if `refresh` had been - called, and generates notifications if applicable. This has no effect if the - Realm was already up to date. - - It is rarely a good idea to have write transactions span multiple cycles of - the run loop, but if you do wish to do so you will need to ensure that the - Realm participating in the write transaction is kept alive until the write - transaction is committed. - */ -- (void)beginWriteTransaction; - -/** - Commits all write operations in the current write transaction, and ends the - transaction. - - After saving the changes, all notification blocks registered on this specific - `RLMRealm` instance are invoked synchronously. Notification blocks registered - on other threads or on collections are invoked asynchronously. If you do not - want to receive a specific notification for this write tranaction, see - `commitWriteTransactionWithoutNotifying:error:`. - - This method can fail if there is insufficient disk space available to save the - writes made, or due to unexpected i/o errors. This version of the method throws - an exception when errors occur. Use the version with a `NSError` out parameter - instead if you wish to handle errors. - - @warning This method may only be called during a write transaction. - */ -- (void)commitWriteTransaction NS_SWIFT_UNAVAILABLE(""); - -/** - Commits all write operations in the current write transaction, and ends the - transaction. - - After saving the changes, all notification blocks registered on this specific - `RLMRealm` instance are invoked synchronously. Notification blocks registered - on other threads or on collections are invoked asynchronously. If you do not - want to receive a specific notification for this write tranaction, see - `commitWriteTransactionWithoutNotifying:error:`. - - This method can fail if there is insufficient disk space available to save the - writes made, or due to unexpected i/o errors. - - @warning This method may only be called during a write transaction. - - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return Whether the transaction succeeded. - */ -- (BOOL)commitWriteTransaction:(NSError **)error; - -/** - Commits all write operations in the current write transaction, without - notifying specific notification blocks of the changes. - - After saving the changes, all notification blocks registered on this specific - `RLMRealm` instance are invoked synchronously. Notification blocks registered - on other threads or on collections are scheduled to be invoked asynchronously. - - You can skip notifiying specific notification blocks about the changes made - in this write transaction by passing in their associated notification tokens. - This is primarily useful when the write transaction is saving changes already - made in the UI and you do not want to have the notification block attempt to - re-apply the same changes. - - The tokens passed to this method must be for notifications for this specific - `RLMRealm` instance. Notifications for different threads cannot be skipped - using this method. - - This method can fail if there is insufficient disk space available to save the - writes made, or due to unexpected i/o errors. - - @warning This method may only be called during a write transaction. - - @param tokens An array of notification tokens which were returned from adding - callbacks which you do not want to be notified for the changes - made in this write transaction. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return Whether the transaction succeeded. - */ -- (BOOL)commitWriteTransactionWithoutNotifying:(NSArray *)tokens error:(NSError **)error; - -/** - Reverts all writes made during the current write transaction and ends the transaction. - - This rolls back all objects in the Realm to the state they were in at the - beginning of the write transaction, and then ends the transaction. - - This restores the data for deleted objects, but does not revive invalidated - object instances. Any `RLMObject`s which were added to the Realm will be - invalidated rather than becoming unmanaged. - Given the following code: - - ObjectType *oldObject = [[ObjectType objectsWhere:@"..."] firstObject]; - ObjectType *newObject = [[ObjectType alloc] init]; - - [realm beginWriteTransaction]; - [realm addObject:newObject]; - [realm deleteObject:oldObject]; - [realm cancelWriteTransaction]; - - Both `oldObject` and `newObject` will return `YES` for `isInvalidated`, - but re-running the query which provided `oldObject` will once again return - the valid object. - - KVO observers on any objects which were modified during the transaction will - be notified about the change back to their initial values, but no other - notifications are produced by a cancelled write transaction. - - @warning This method may only be called during a write transaction. - */ -- (void)cancelWriteTransaction; - -/** - Performs actions contained within the given block inside a write transaction. - - @see `[RLMRealm transactionWithoutNotifying:block:error:]` - */ -- (void)transactionWithBlock:(__attribute__((noescape)) void(^)(void))block NS_SWIFT_UNAVAILABLE(""); - -/** - Performs actions contained within the given block inside a write transaction. - - @see `[RLMRealm transactionWithoutNotifying:block:error:]` - */ -- (BOOL)transactionWithBlock:(__attribute__((noescape)) void(^)(void))block error:(NSError **)error; - -/** - Performs actions contained within the given block inside a write transaction. - - @see `[RLMRealm transactionWithoutNotifying:block:error:]` - */ -- (void)transactionWithoutNotifying:(NSArray *)tokens block:(__attribute__((noescape)) void(^)(void))block; - -/** - Performs actions contained within the given block inside a write transaction. - - Write transactions cannot be nested, and trying to execute a write transaction - on a Realm which is already participating in a write transaction will throw an - exception. Calls to `transactionWithBlock:` from `RLMRealm` instances in other - threads will block until the current write transaction completes. - - Before beginning the write transaction, `transactionWithBlock:` updates the - `RLMRealm` instance to the latest Realm version, as if `refresh` had been called, and - generates notifications if applicable. This has no effect if the Realm - was already up to date. - - You can skip notifiying specific notification blocks about the changes made - in this write transaction by passing in their associated notification tokens. - This is primarily useful when the write transaction is saving changes already - made in the UI and you do not want to have the notification block attempt to - re-apply the same changes. - - The tokens passed to this method must be for notifications for this specific - `RLMRealm` instance. Notifications for different threads cannot be skipped - using this method. - - @param tokens An array of notification tokens which were returned from adding - callbacks which you do not want to be notified for the changes - made in this write transaction. - @param block The block containing actions to perform. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return Whether the transaction succeeded. - */ -- (BOOL)transactionWithoutNotifying:(NSArray *)tokens block:(__attribute__((noescape)) void(^)(void))block error:(NSError **)error; - -/** - Indicates if the Realm is currently performing async write operations. - This becomes YES following a call to `beginAsyncWriteTransaction`, - `commitAsyncWriteTransaction`, or `asyncTransactionWithBlock:`, and remains so - until all scheduled async write work has completed. - - @warning If this is `YES`, closing or invalidating the Realm will block until scheduled work has completed. - */ -@property (nonatomic, readonly) BOOL isPerformingAsynchronousWriteOperations; - -/** - Begins an asynchronous write transaction. - This function asynchronously begins a write transaction on a background - thread, and then invokes the block on the original thread or queue once the - transaction has begun. Unlike `beginWriteTransaction`, this does not block the - calling thread if another thread is current inside a write transaction, and - will always return immediately. - Multiple calls to this function (or the other functions which perform - asynchronous write transactions) will queue the blocks to be called in the - same order as they were queued. This includes calls from inside a write - transaction block, which unlike with synchronous transactions are allowed. - - @param block The block containing actions to perform inside the write transaction. - `block` should end by calling `commitAsyncWriteTransaction`, - `commitWriteTransaction` or `cancelWriteTransaction`. - Returning without one of these calls is equivalent to calling `cancelWriteTransaction`. - - @return An id identifying the asynchronous transaction which can be passed to - `cancelAsyncTransaction:` prior to the block being called to cancel - the pending invocation of the block. - */ -- (RLMAsyncTransactionId)beginAsyncWriteTransaction:(void(^)(void))block; - -/** - Asynchronously commits a write transaction. - The call returns immediately allowing the caller to proceed while the I/O is - performed on a dedicated background thread. This can be used regardless of if - the write transaction was begun with `beginWriteTransaction` or - `beginAsyncWriteTransaction`. - - @param completionBlock A block which will be called on the source thread or - queue once the commit has either completed or failed - with an error. - - @param allowGrouping If `YES`, multiple sequential calls to - `commitAsyncWriteTransaction:` may be batched together - and persisted to stable storage in one group. This - improves write performance, particularly when the - individual transactions being batched are small. In the - event of a crash or power failure, either all of the - grouped transactions will be lost or none will, rather - than the usual guarantee that data has been persisted as - soon as a call to commit has returned. - - @return An id identifying the asynchronous transaction commit can be passed to - `cancelAsyncTransaction:` prior to the completion block being called - to cancel the pending invocation of the block. Note that this does - *not* cancel the commit itself. -*/ -- (RLMAsyncTransactionId)commitAsyncWriteTransaction:(nullable void(^)(NSError *_Nullable))completionBlock - allowGrouping:(BOOL)allowGrouping; - -/** - Asynchronously commits a write transaction. - The call returns immediately allowing the caller to proceed while the I/O is - performed on a dedicated background thread. This can be used regardless of if - the write transaction was begun with `beginWriteTransaction` or - `beginAsyncWriteTransaction`. - - @param completionBlock A block which will be called on the source thread or - queue once the commit has either completed or failed - with an error. - - @return An id identifying the asynchronous transaction commit can be passed to - `cancelAsyncTransaction:` prior to the completion block being called - to cancel the pending invocation of the block. Note that this does - *not* cancel the commit itself. -*/ -- (RLMAsyncTransactionId)commitAsyncWriteTransaction:(void(^)(NSError *_Nullable))completionBlock; - -/** - Asynchronously commits a write transaction. - The call returns immediately allowing the caller to proceed while the I/O is - performed on a dedicated background thread. This can be used regardless of if - the write transaction was begun with `beginWriteTransaction` or - `beginAsyncWriteTransaction`. - - @return An id identifying the asynchronous transaction commit can be passed to - `cancelAsyncTransaction:` prior to the completion block being called - to cancel the pending invocation of the block. Note that this does - *not* cancel the commit itself. -*/ -- (RLMAsyncTransactionId)commitAsyncWriteTransaction; - -/** - Cancels a queued block for an asynchronous transaction. - This can cancel a block passed to either an asynchronous begin or an - asynchronous commit. Canceling a begin cancels that transaction entirely, - while canceling a commit merely cancels the invocation of the completion - callback, and the commit will still happen. - Transactions can only be canceled before the block is invoked, and calling - `cancelAsyncTransaction:` from within the block is a no-op. - - @param asyncTransactionId A transaction id from either `beginAsyncWriteTransaction:` or `commitAsyncWriteTransaction:`. -*/ -- (void)cancelAsyncTransaction:(RLMAsyncTransactionId)asyncTransactionId; - -/** - Asynchronously performs actions contained within the given block inside a - write transaction. - The write transaction is begun asynchronously as if calling - `beginAsyncWriteTransaction:`, and by default the transaction is commited - asynchronously after the block completes. You can also explicitly call - `commitWriteTransaction` or `cancelWriteTransaction` from within the block to - synchronously commit or cancel the write transaction. - - @param block The block containing actions to perform. - - @param completionBlock A block which will be called on the source thread or - queue once the commit has either completed or failed - with an error. - - @return An id identifying the asynchronous transaction which can be passed to - `cancelAsyncTransaction:` prior to the block being called to cancel - the pending invocation of the block. -*/ -- (RLMAsyncTransactionId)asyncTransactionWithBlock:(void(^)(void))block onComplete:(nullable void(^)(NSError *))completionBlock; - -/** - Asynchronously performs actions contained within the given block inside a - write transaction. - The write transaction is begun asynchronously as if calling - `beginAsyncWriteTransaction:`, and by default the transaction is commited - asynchronously after the block completes. You can also explicitly call - `commitWriteTransaction` or `cancelWriteTransaction` from within the block to - synchronously commit or cancel the write transaction. - - @param block The block containing actions to perform. - - @return An id identifying the asynchronous transaction which can be passed to - `cancelAsyncTransaction:` prior to the block being called to cancel - the pending invocation of the block. -*/ -- (RLMAsyncTransactionId)asyncTransactionWithBlock:(void(^)(void))block; - -/** - Updates the Realm and outstanding objects managed by the Realm to point to the - most recent data. - - If the version of the Realm is actually changed, Realm and collection - notifications will be sent to reflect the changes. This may take some time, as - collection notifications are prepared on a background thread. As a result, - calling this method on the main thread is not advisable. - - @return Whether there were any updates for the Realm. Note that `YES` may be - returned even if no data actually changed. - */ -- (BOOL)refresh; - -/** - Set this property to `YES` to automatically update this Realm when changes - happen in other threads. - - If set to `YES` (the default), changes made on other threads will be reflected - in this Realm on the next cycle of the run loop after the changes are - committed. If set to `NO`, you must manually call `-refresh` on the Realm to - update it to get the latest data. - - Note that by default, background threads do not have an active run loop and you - will need to manually call `-refresh` in order to update to the latest version, - even if `autorefresh` is set to `YES`. - - Even with this property enabled, you can still call `-refresh` at any time to - update the Realm before the automatic refresh would occur. - - Write transactions will still always advance a Realm to the latest version and - produce local notifications on commit even if autorefresh is disabled. - - Disabling `autorefresh` on a Realm without any strong references to it will not - have any effect, and `autorefresh` will revert back to `YES` the next time the - Realm is created. This is normally irrelevant as it means that there is nothing - to refresh (as managed `RLMObject`s, `RLMArray`s, and `RLMResults` have strong - references to the Realm that manages them), but it means that setting - `RLMRealm.defaultRealm.autorefresh = NO` in - `application:didFinishLaunchingWithOptions:` and only later storing Realm - objects will not work. - - Defaults to `YES`. - */ -@property (nonatomic) BOOL autorefresh; - -/** - Invalidates all `RLMObject`s, `RLMResults`, `RLMLinkingObjects`, and `RLMArray`s managed by the Realm. - - A Realm holds a read lock on the version of the data accessed by it, so - that changes made to the Realm on different threads do not modify or delete the - data seen by this Realm. Calling this method releases the read lock, - allowing the space used on disk to be reused by later write transactions rather - than growing the file. This method should be called before performing long - blocking operations on a background thread on which you previously read data - from the Realm which you no longer need. - - All `RLMObject`, `RLMResults` and `RLMArray` instances obtained from this - `RLMRealm` instance on the current thread are invalidated. `RLMObject`s and `RLMArray`s - cannot be used. `RLMResults` will become empty. The Realm itself remains valid, - and a new read transaction is implicitly begun the next time data is read from the Realm. - - Calling this method multiple times in a row without reading any data from the - Realm, or before ever reading any data from the Realm, is a no-op. - */ -- (void)invalidate; - -#pragma mark - Accessing Objects - -/** - Returns the same object as the one referenced when the `RLMThreadSafeReference` was first created, - but resolved for the current Realm for this thread. Returns `nil` if this object was deleted after - the reference was created. - - @param reference The thread-safe reference to the thread-confined object to resolve in this Realm. - - @warning A `RLMThreadSafeReference` object must be resolved at most once. - Failing to resolve a `RLMThreadSafeReference` will result in the source version of the - Realm being pinned until the reference is deallocated. - An exception will be thrown if a reference is resolved more than once. - - @warning Cannot call within a write transaction. - - @note Will refresh this Realm if the source Realm was at a later version than this one. - - @see `+[RLMThreadSafeReference referenceWithThreadConfined:]` - */ -- (nullable id)resolveThreadSafeReference:(RLMThreadSafeReference *)reference -NS_REFINED_FOR_SWIFT; - -#pragma mark - Adding and Removing Objects from a Realm - -/** - Adds an object to the Realm. - - Once added, this object is considered to be managed by the Realm. It can be retrieved - using the `objectsWhere:` selectors on `RLMRealm` and on subclasses of `RLMObject`. - - When added, all child relationships referenced by this object will also be added to - the Realm if they are not already in it. - - If the object or any related objects are already being managed by a different Realm - an exception will be thrown. Use `-[RLMObject createInRealm:withObject:]` to insert a copy of a managed object - into a different Realm. - - The object to be added must be valid and cannot have been previously deleted - from a Realm (i.e. `isInvalidated` must be `NO`). - - @warning This method may only be called during a write transaction. - - @param object The object to be added to this Realm. - */ -- (void)addObject:(RLMObject *)object; - -/** - Adds all the objects in a collection to the Realm. - - This is the equivalent of calling `addObject:` for every object in a collection. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable collection such as `NSArray`, `RLMArray`, or `RLMResults`, - containing Realm objects to be added to the Realm. - - @see `addObject:` - */ -- (void)addObjects:(id)objects; - -/** - Adds or updates an existing object into the Realm. - - The object provided must have a designated primary key. If no objects exist in the Realm - with the same primary key value, the object is inserted. Otherwise, the existing object is - updated with any changed values. - - As with `addObject:`, the object cannot already be managed by a different - Realm. Use `-[RLMObject createOrUpdateInRealm:withValue:]` to copy values to - a different Realm. - - If there is a property or KVC value on `object` whose value is nil, and it corresponds - to a nullable property on an existing object being updated, that nullable property will - be set to nil. - - @warning This method may only be called during a write transaction. - - @param object The object to be added or updated. - */ -- (void)addOrUpdateObject:(RLMObject *)object; - -/** - Adds or updates all the objects in a collection into the Realm. - - This is the equivalent of calling `addOrUpdateObject:` for every object in a collection. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable collection such as `NSArray`, `RLMArray`, or `RLMResults`, - containing Realm objects to be added to or updated within the Realm. - - @see `addOrUpdateObject:` - */ -- (void)addOrUpdateObjects:(id)objects; - -/** - Deletes an object from the Realm. Once the object is deleted it is considered invalidated. - - @warning This method may only be called during a write transaction. - - @param object The object to be deleted. - */ -- (void)deleteObject:(RLMObject *)object; - -/** - Deletes one or more objects from the Realm. - - This is the equivalent of calling `deleteObject:` for every object in a collection. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable collection such as `NSArray`, `RLMArray`, or `RLMResults`, - containing objects to be deleted from the Realm. - - @see `deleteObject:` - */ -- (void)deleteObjects:(id)objects; - -/** - Deletes all objects from the Realm. - - @warning This method may only be called during a write transaction. - - @see `deleteObject:` - */ -- (void)deleteAllObjects; - -#pragma mark - Sync Subscriptions - -/** - Represents the active subscriptions for this realm, which can be used to add/remove/update - and search flexible sync subscriptions. - Getting the subscriptions from a local or partition-based configured realm will thrown an exception. - - @warning This feature is currently in beta and its API is subject to change. - */ -@property (nonatomic, readonly, nonnull) RLMSyncSubscriptionSet *subscriptions; - - -#pragma mark - Migrations - -/** - The type of a migration block used to migrate a Realm. - - @param migration A `RLMMigration` object used to perform the migration. The - migration object allows you to enumerate and alter any - existing objects which require migration. - - @param oldSchemaVersion The schema version of the Realm being migrated. - */ -RLM_SWIFT_SENDABLE -typedef void (^RLMMigrationBlock)(RLMMigration *migration, uint64_t oldSchemaVersion); - -/** - Returns the schema version for a Realm at a given local URL. - - @param fileURL Local URL to a Realm file. - @param key 64-byte key used to encrypt the file, or `nil` if it is unencrypted. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return The version of the Realm at `fileURL`, or `RLMNotVersioned` if the version cannot be read. - */ -+ (uint64_t)schemaVersionAtURL:(NSURL *)fileURL encryptionKey:(nullable NSData *)key - error:(NSError **)error -NS_REFINED_FOR_SWIFT; - -/** - Performs the given Realm configuration's migration block on a Realm at the given path. - - This method is called automatically when opening a Realm for the first time and does - not need to be called explicitly. You can choose to call this method to control - exactly when and how migrations are performed. - - @param configuration The Realm configuration used to open and migrate the Realm. - @return The error that occurred while applying the migration, if any. - - @see RLMMigration - */ -+ (BOOL)performMigrationForConfiguration:(RLMRealmConfiguration *)configuration error:(NSError **)error; - -#pragma mark - Unavailable Methods - -/** - RLMRealm instances are cached internally by Realm and cannot be created directly. - - Use `+[RLMRealm defaultRealm]`, `+[RLMRealm realmWithConfiguration:error:]` or - `+[RLMRealm realmWithURL]` to obtain a reference to an RLMRealm. - */ -- (instancetype)init __attribute__((unavailable("Use +defaultRealm, +realmWithConfiguration: or +realmWithURL:."))); - -/** - RLMRealm instances are cached internally by Realm and cannot be created directly. - - Use `+[RLMRealm defaultRealm]`, `+[RLMRealm realmWithConfiguration:error:]` or - `+[RLMRealm realmWithURL]` to obtain a reference to an RLMRealm. - */ -+ (instancetype)new __attribute__((unavailable("Use +defaultRealm, +realmWithConfiguration: or +realmWithURL:."))); - -/// :nodoc: -- (void)addOrUpdateObjectsFromArray:(id)array __attribute__((unavailable("Renamed to -addOrUpdateObjects:."))); - -@end - -// MARK: - RLMNotificationToken - -/** - A token which is returned from methods which subscribe to changes to a Realm. - - Change subscriptions in Realm return an `RLMNotificationToken` instance, - which can be used to unsubscribe from the changes. You must store a strong - reference to the token for as long as you want to continue to receive notifications. - When you wish to stop, call the `-invalidate` method. Notifications are also stopped if - the token is deallocated. - */ -RLM_SWIFT_SENDABLE // is internally thread-safe -@interface RLMNotificationToken : NSObject -/// Stops notifications for the change subscription that returned this token. -/// -/// @return True if the token was previously valid, and false if it was already invalidated. -- (bool)invalidate; - -/// Stops notifications for the change subscription that returned this token. -- (void)stop __attribute__((unavailable("Renamed to -invalidate."))) NS_REFINED_FOR_SWIFT; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMRealmConfiguration.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMRealmConfiguration.h deleted file mode 100644 index d09e5c215..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMRealmConfiguration.h +++ /dev/null @@ -1,197 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2015 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMEventConfiguration, RLMSyncConfiguration; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A block called when opening a Realm for the first time during the life - of a process to determine if it should be compacted before being returned - to the user. It is passed the total file size (data + free space) and the total - bytes used by data in the file. - - Return `YES` to indicate that an attempt to compact the file should be made. - The compaction will be skipped if another process is accessing it. - */ -RLM_SWIFT_SENDABLE -typedef BOOL (^RLMShouldCompactOnLaunchBlock)(NSUInteger totalBytes, NSUInteger bytesUsed); - -/** - A block which receives a subscription set instance, that can be used to add an initial set of subscriptions which will be executed - when the Realm is first opened. - */ -RLM_SWIFT_SENDABLE -typedef void(^RLMFlexibleSyncInitialSubscriptionsBlock)(RLMSyncSubscriptionSet * _Nonnull subscriptions); - -/** - An `RLMRealmConfiguration` instance describes the different options used to - create an instance of a Realm. - - `RLMRealmConfiguration` instances are just plain `NSObject`s. Unlike `RLMRealm`s - and `RLMObject`s, they can be freely shared between threads as long as you do not - mutate them. - - Creating configuration objects for class subsets (by setting the - `objectClasses` property) can be expensive. Because of this, you will normally want to - cache and reuse a single configuration object for each distinct configuration rather than - creating a new object each time you open a Realm. - */ -@interface RLMRealmConfiguration : NSObject - -#pragma mark - Default Configuration - -/** - Returns the default configuration used to create Realms when no other - configuration is explicitly specified (i.e. `+[RLMRealm defaultRealm]`). - - @return The default Realm configuration. - */ -+ (instancetype)defaultConfiguration; - -/** - Sets the default configuration to the given `RLMRealmConfiguration`. - - @param configuration The new default Realm configuration. - */ -+ (void)setDefaultConfiguration:(RLMRealmConfiguration *)configuration; - -#pragma mark - Properties - -/// The local URL of the Realm file. Mutually exclusive with `inMemoryIdentifier`; -/// setting one of the two properties will automatically nil out the other. -@property (nonatomic, copy, nullable) NSURL *fileURL; - -/// A string used to identify a particular in-memory Realm. Mutually exclusive with `fileURL`, -/// `seedFilePath`and `syncConfiguration`; -/// setting any one of the three properties will automatically nil out the other two. -@property (nonatomic, copy, nullable) NSString *inMemoryIdentifier; - -/// A 64-byte key to use to encrypt the data, or `nil` if encryption is not enabled. -@property (nonatomic, copy, nullable) NSData *encryptionKey; - -/// Whether to open the Realm in read-only mode. -/// -/// For non-synchronized Realms, this is required to be able to open Realm -/// files which are not writeable or are in a directory which is not writeable. -/// This should only be used on files which will not be modified by anyone -/// while they are open, and not just to get a read-only view of a file which -/// may be written to by another thread or process. Opening in read-only mode -/// requires disabling Realm's reader/writer coordination, so committing a -/// write transaction from another process will result in crashes. -/// -/// Syncronized Realms must always be writeable (as otherwise no -/// synchronization could happen), and this instead merely disallows performing -/// write transactions on the Realm. In addition, it will skip some automatic -/// writes made to the Realm, such as to initialize the Realm's schema. Setting -/// `readOnly = YES` is not strictly required for Realms which the sync user -/// does not have write access to, but is highly recommended as it will improve -/// error reporting and catch some errors earlier. -/// -/// Realms using query-based sync cannot be opened in read-only mode. -@property (nonatomic) BOOL readOnly; - -/// The current schema version. -@property (nonatomic) uint64_t schemaVersion; - -/// The block which migrates the Realm to the current version. -@property (nonatomic, copy, nullable) RLMMigrationBlock migrationBlock; - -/** - Whether to recreate the Realm file with the provided schema if a migration is required. - This is the case when the stored schema differs from the provided schema or - the stored schema version differs from the version on this configuration. - Setting this property to `YES` deletes the file if a migration would otherwise be required or executed. - - @note Setting this property to `YES` doesn't disable file format migrations. - */ -@property (nonatomic) BOOL deleteRealmIfMigrationNeeded; - -/** - A block called when opening a Realm for the first time during the life - of a process to determine if it should be compacted before being returned - to the user. It is passed the total file size (data + free space) and the total - bytes used by data in the file. - - Return `YES` to indicate that an attempt to compact the file should be made. - The compaction will be skipped if another process is accessing it. - */ -@property (nonatomic, copy, nullable) RLMShouldCompactOnLaunchBlock shouldCompactOnLaunch; - -/// The classes managed by the Realm. -@property (nonatomic, copy, nullable) NSArray *objectClasses; - -/** - The maximum number of live versions in the Realm file before an exception will - be thrown when attempting to start a write transaction. - - Realm provides MVCC snapshot isolation, meaning that writes on one thread do - not overwrite data being read on another thread, and instead write a new copy - of that data. When a Realm refreshes it updates to the latest version of the - data and releases the old versions, allowing them to be overwritten by - subsequent write transactions. - - Under normal circumstances this is not a problem, but if the number of active - versions grow too large, it will have a negative effect on the filesize on - disk. This can happen when performing writes on many different threads at - once, when holding on to frozen objects for an extended time, or when - performing long operations on background threads which do not allow the Realm - to refresh. - - Setting this property to a non-zero value makes it so that exceeding the set - number of versions will instead throw an exception. This can be used with a - low value during development to help identify places that may be problematic, - or in production use to cause the app to crash rather than produce a Realm - file which is too large to be opened. - - */ -@property (nonatomic) NSUInteger maximumNumberOfActiveVersions; - -/** - When opening the Realm for the first time, instead of creating an empty file, - the Realm file will be copied from the provided seed file path and used instead. - This can be used to open a Realm file with pre-populated data. - - If a realm file already exists at the configuration's destination path, the seed file - will not be copied and the already existing realm will be opened instead. - - Note that to use this parameter with a synced Realm configuration - the seed Realm must be appropriately copied to a destination with - `[RLMRealm writeCopyForConfiguration:]` first. - - This option is mutually exclusive with `inMemoryIdentifier`. Setting a `seedFilePath` - will nil out the `inMemoryIdentifier`. - */ -@property (nonatomic, copy, nullable) NSURL *seedFilePath; - -/** - A configuration object representing configuration state for Realms intended - to sync with Atlas Device Sync. - - This property is mutually exclusive with both `inMemoryIdentifier` and `fileURL`; - setting any one of the three properties will automatically nil out the other two. - - @see `RLMSyncConfiguration` - */ -@property (nullable, nonatomic) RLMSyncConfiguration *syncConfiguration; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMRealm_Dynamic.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMRealm_Dynamic.h deleted file mode 100644 index bea162775..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMRealm_Dynamic.h +++ /dev/null @@ -1,118 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import -#import - -@class RLMResults; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMRealm (Dynamic) - -#pragma mark - Getting Objects from a Realm - -/** - Returns all objects of a given type from the Realm. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. The preferred way to get objects of a single class is to use the class - methods on `RLMObject`. - - @param className The name of the `RLMObject` subclass to retrieve on (e.g. `MyClass.className`). - - @return An `RLMResults` containing all objects in the Realm of the given type. - - @see `+[RLMObject allObjects]` - */ -- (RLMResults *)allObjects:(NSString *)className; - -/** - Returns all objects matching the given predicate from the Realm. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. The preferred way to get objects of a single class is to use the class - methods on `RLMObject`. - - @param className The type of objects you are looking for (name of the class). - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` containing results matching the given predicate. - - @see `+[RLMObject objectsWhere:]` - */ -- (RLMResults *)objects:(NSString *)className where:(NSString *)predicateFormat, ...; - -/** - Returns all objects matching the given predicate from the Realm. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. The preferred way to get objects of a single class is to use the class - methods on `RLMObject`. - - @param className The type of objects you are looking for (name of the class). - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` containing results matching the given predicate. - - @see `+[RLMObject objectsWhere:]` - */ -- (RLMResults *)objects:(NSString *)className withPredicate:(NSPredicate *)predicate; - -/** - Returns the object of the given type with the given primary key from the Realm. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. The preferred way to get an object of a single class is to use the class - methods on `RLMObject`. - - @param className The class name for the object you are looking for. - @param primaryKey The primary key value for the object you are looking for. - - @return An object, or `nil` if an object with the given primary key does not exist. - - @see `+[RLMObject objectForPrimaryKey:]` - */ -- (nullable RLMObject *)objectWithClassName:(NSString *)className forPrimaryKey:(id)primaryKey; - -/** - Creates an `RLMObject` instance of type `className` in the Realm, and populates it using a given object. - - The `value` argument is used to populate the object. It can be a key-value coding compliant object, an array or - dictionary returned from the methods in `NSJSONSerialization`, or an array containing one element for each managed - property. An exception will be thrown if any required properties are not present and those properties were not defined - with default values. - - When passing in an array as the `value` argument, all properties must be present, valid and in the same order as the - properties defined in the model. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is recommended to - use `[RLMObject createInDefaultRealmWithValue:]`. - - @param value The value used to populate the object. - - @return An `RLMObject` instance of type `className`. - */ --(RLMObject *)createObject:(NSString *)className withValue:(id)value; - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMResults.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMResults.h deleted file mode 100644 index 5911e666a..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMResults.h +++ /dev/null @@ -1,567 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObject; - -/** - `RLMResults` is an auto-updating container type in Realm returned from object - queries. It represents the results of the query in the form of a collection of objects. - - `RLMResults` can be queried using the same predicates as `RLMObject` and `RLMArray`, - and you can chain queries to further filter results. - - `RLMResults` always reflect the current state of the Realm on the current thread, - including during write transactions on the current thread. The one exception to - this is when using `for...in` fast enumeration, which will always enumerate - over the objects which matched the query when the enumeration is begun, even if - some of them are deleted or modified to be excluded by the filter during the - enumeration. - - `RLMResults` are lazily evaluated the first time they are accessed; they only - run queries when the result of the query is requested. This means that - chaining several temporary `RLMResults` to sort and filter your data does not - perform any extra work processing the intermediate state. - - Once the results have been evaluated or a notification block has been added, - the results are eagerly kept up-to-date, with the work done to keep them - up-to-date done on a background thread whenever possible. - - `RLMResults` cannot be directly instantiated. - */ -@interface RLMResults : NSObject - -#pragma mark - Properties - -/** - The number of objects in the results collection. - */ -@property (nonatomic, readonly, assign) NSUInteger count; - -/** - The type of the objects in the results collection. - */ -@property (nonatomic, readonly, assign) RLMPropertyType type; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readwrite, getter = isOptional) BOOL optional; - -/** - The class name of the objects contained in the results collection. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages this results collection. - */ -@property (nonatomic, readonly) RLMRealm *realm; - -/** - Indicates if the results collection is no longer valid. - - The results collection becomes invalid if `invalidate` is called on the containing `realm`. - An invalidated results collection can be accessed, but will always be empty. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -#pragma mark - Accessing Objects from an RLMResults - -/** - Returns the object at the index specified. - - @param index The index to look up. - - @return An object of the type contained in the results collection. - */ -- (RLMObjectType)objectAtIndex:(NSUInteger)index; - -/** - Returns an array containing the objects in the results at the indexes specified by a given index set. - `nil` will be returned if the index set contains an index out of the arrays bounds. - - @param indexes The indexes in the results to retrieve objects from. - - @return The objects at the specified indexes. - */ -- (nullable NSArray *)objectsAtIndexes:(NSIndexSet *)indexes; - -/** - Returns the first object in the results collection. - - Returns `nil` if called on an empty results collection. - - @return An object of the type contained in the results collection. - */ -- (nullable RLMObjectType)firstObject; - -/** - Returns the last object in the results collection. - - Returns `nil` if called on an empty results collection. - - @return An object of the type contained in the results collection. - */ -- (nullable RLMObjectType)lastObject; - -#pragma mark - Querying Results - -/** - Returns the index of an object in the results collection. - - Returns `NSNotFound` if the object is not found in the results collection. - - @param object An object (of the same type as returned from the `objectClassName` selector). - */ -- (NSUInteger)indexOfObject:(RLMObjectType)object; - -/** - Returns the index of the first object in the results collection matching the predicate. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return The index of the object, or `NSNotFound` if the object is not found in the results collection. - */ -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns the index of the first object in the results collection matching the predicate. - - @param predicate The predicate with which to filter the objects. - - @return The index of the object, or `NSNotFound` if the object is not found in the results collection. - */ -- (NSUInteger)indexOfObjectWithPredicate:(NSPredicate *)predicate; - -/** - Returns all the objects matching the given predicate in the results collection. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` of objects that match the given predicate. - */ -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all the objects matching the given predicate in the results collection. - - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` of objects that match the given predicate. - */ -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/** - Returns a sorted `RLMResults` from an existing results collection. - - @param keyPath The key path to sort by. - @param ascending The direction to sort in. - - @return An `RLMResults` sorted by the specified key path. - */ -- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a sorted `RLMResults` from an existing results collection. - - @param properties An array of `RLMSortDescriptor`s to sort by. - - @return An `RLMResults` sorted by the specified properties. - */ -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/** - Returns a distinct `RLMResults` from an existing results collection. - - @param keyPaths The key paths used produce distinct results - - @return An `RLMResults` made distinct based on the specified key paths - */ -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -#pragma mark - Notifications - -/** - Registers a block to be called each time the results collection changes. - - The block will be asynchronously called with the initial results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the results collection were added, removed or modified. If a - write transaction did not modify any objects in the results collection, - the block is not called at all. See the `RLMCollectionChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - At the time when the block is called, the `RLMResults` object will be fully - evaluated and up-to-date, and as long as you do not perform a write transaction - on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will - never perform blocking work. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - NSLog(@"dogs.count: %zu", dogs.count); // => 0 - self.token = [results addNotificationBlock:^(RLMResults *dogs, - RLMCollectionChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - - @param block The block to be called whenever a change occurs. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the results collection changes. - - The block will be asynchronously called with the initial results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the results collection were added, removed or modified. If a - write transaction did not modify any objects in the results collection, - the block is not called at all. See the `RLMCollectionChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - At the time when the block is called, the `RLMResults` object will be fully - evaluated and up-to-date, and as long as you do not perform a write transaction - on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will - never perform blocking work. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the results collection changes. - - The block will be asynchronously called with the initial results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the results collection were added, removed or modified. If a - write transaction did not modify any objects in the results collection, - the block is not called at all. See the `RLMCollectionChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - At the time when the block is called, the `RLMResults` object will be fully - evaluated and up-to-date, and as long as you do not perform a write transaction - on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will - never perform blocking work. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the results collection changes. - - The block will be asynchronously called with the initial results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the results collection were added, removed or modified. If a - write transaction did not modify any objects in the results collection, - the block is not called at all. See the `RLMCollectionChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - At the time when the block is called, the `RLMResults` object will be fully - evaluated and up-to-date, and as long as you do not perform a write transaction - on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will - never perform blocking work. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths -__attribute__((warn_unused_result)); -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the objects - represented by the results collection. - - NSNumber *min = [results minOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose minimum value is desired. Only properties of types `int`, `float`, `double`, and - `NSDate` are supported. - - @return The minimum value of the property, or `nil` if the Results are empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects represented by the results collection. - - NSNumber *max = [results maxOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose maximum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The maximum value of the property, or `nil` if the Results are empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of the values of a given property over all the objects represented by the results collection. - - NSNumber *sum = [results sumOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose values should be summed. Only properties of - types `int`, `float`, and `double` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects represented by the results collection. - - NSNumber *average = [results averageOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose average value should be calculated. Only - properties of types `int`, `float`, and `double` are supported. - - @return The average value of the given property, or `nil` if the Results are empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -/// :nodoc: -- (RLMObjectType)objectAtIndexedSubscript:(NSUInteger)index; - -#pragma mark - Sectioned Results - -/** - Sorts and sections this collection from a given property key path, returning the result - as an instance of `RLMSectionedResults`. - - @param keyPath The property key path to sort on. - @param ascending The direction to sort in. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsSortedUsingKeyPath:(NSString *)keyPath - ascending:(BOOL)ascending - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -/** - Sorts and sections this collection from a given array of sort descriptors, returning the result - as an instance of `RLMSectionedResults`. - - @param sortDescriptors An array of `RLMSortDescriptor`s to sort by. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @note The primary sort descriptor must be responsible for determining the section key. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsUsingSortDescriptors:(NSArray *)sortDescriptors - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -#pragma mark - Freeze - -/** - Indicates if the result are frozen. - - Frozen Results are immutable and can be accessed from any thread.The objects - read from a frozen Results will also be frozen. - */ -@property (nonatomic, readonly, getter=isFrozen) BOOL frozen; - -/** - Returns a frozen (immutable) snapshot of these results. - - The frozen copy is an immutable collection which contains the same data as - this collection currently contains, but will not update when writes are made - to the containing Realm. Unlike live Results, frozen Results can be accessed - from any thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning Holding onto a frozen collection for an extended period while - performing write transaction on the Realm may result in the Realm - file growing to large sizes. See - `RLMRealmConfiguration.maximumNumberOfActiveVersions` for more - information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -#pragma mark - Unavailable Methods - -/** - `-[RLMResults init]` is not available because `RLMResults` cannot be created directly. - `RLMResults` can be obtained by querying a Realm. - */ -- (instancetype)init __attribute__((unavailable("RLMResults cannot be created directly"))); - -/** - `+[RLMResults new]` is not available because `RLMResults` cannot be created directly. - `RLMResults` can be obtained by querying a Realm. - */ -+ (instancetype)new __attribute__((unavailable("RLMResults cannot be created directly"))); - -@end - -/** - `RLMLinkingObjects` is an auto-updating container type. It represents a collection of objects that link to its - parent object. - - For more information, please see the "Inverse Relationships" section in the - [documentation](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/relationships/#relationships). - */ -@interface RLMLinkingObjects : RLMResults -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMSchema.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMSchema.h deleted file mode 100644 index fe46f6d47..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMSchema.h +++ /dev/null @@ -1,78 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectSchema; - -/** - `RLMSchema` instances represent collections of model object schemas managed by a Realm. - - When using Realm, `RLMSchema` instances allow performing migrations and - introspecting the database's schema. - - Schemas map to collections of tables in the core database. - */ -RLM_SWIFT_SENDABLE // not actually immutable, but the public API kinda is -@interface RLMSchema : NSObject - -#pragma mark - Properties - -/** - An `NSArray` containing `RLMObjectSchema`s for all object types in the Realm. - - This property is intended to be used during migrations for dynamic introspection. - - @see `RLMObjectSchema` - */ -@property (nonatomic, readonly, copy) NSArray *objectSchema; - -#pragma mark - Methods - -/** - Returns an `RLMObjectSchema` for the given class name in the schema. - - @param className The object class name. - @return An `RLMObjectSchema` for the given class in the schema. - - @see `RLMObjectSchema` - */ -- (nullable RLMObjectSchema *)schemaForClassName:(NSString *)className; - -/** - Looks up and returns an `RLMObjectSchema` for the given class name in the Realm. - - If there is no object of type `className` in the schema, an exception will be thrown. - - @param className The object class name. - @return An `RLMObjectSchema` for the given class in this Realm. - - @see `RLMObjectSchema` - */ -- (RLMObjectSchema *)objectForKeyedSubscript:(NSString *)className; - -/** - Returns whether two `RLMSchema` instances are equivalent. - */ -- (BOOL)isEqualToSchema:(RLMSchema *)schema; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMSectionedResults.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMSectionedResults.h deleted file mode 100644 index 4ee236b94..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMSectionedResults.h +++ /dev/null @@ -1,921 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2022 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@protocol RLMValue; -@class RLMResults; - -/** - A `RLMSectionedResultsChange` object encapsulates information about changes to sectioned - results that are reported by Realm notifications. - - `RLMSectionedResultsChange` is passed to the notification blocks registered with - `-addNotificationBlock` on `RLMSectionedResults`, and reports what sections and rows in the - collection changed since the last time the notification block was called. - - A complete example of updating a `UITableView` named `tv`: - - [tv beginUpdates]; - [tv deleteRowsAtIndexPaths:changes.deletions withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv insertRowsAtIndexPaths:changes.insertions withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv reloadRowsAtIndexPaths:changes.modifications withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv insertSections:changes.sectionsToInsert withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv deleteSections:changes.sectionsToRemove withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv endUpdates]; - - All of the arrays in an `RLMSectionedResultsChange` are always sorted in ascending order. - */ -@interface RLMSectionedResultsChange : NSObject -/// The index paths of objects in the previous version of the collection which have -/// been removed from this one. -@property (nonatomic, readonly) NSArray *deletions; -/// The index paths in the new version of the collection which were newly inserted. -@property (nonatomic, readonly) NSArray *insertions; -/// The index paths in the old version of the collection which were modified. -@property (nonatomic, readonly) NSArray *modifications; -/// The indices of the sections to be inserted. -@property (nonatomic, readonly) NSIndexSet *sectionsToInsert; -/// The indices of the sections to be removed. -@property (nonatomic, readonly) NSIndexSet *sectionsToRemove; -/// Returns the index paths of the deletion indices in the given section. -- (NSArray *)deletionsInSection:(NSUInteger)section; -/// Returns the index paths of the insertion indices in the given section. -- (NSArray *)insertionsInSection:(NSUInteger)section; -/// Returns the index paths of the modification indices in the given section. -- (NSArray *)modificationsInSection:(NSUInteger)section; -@end - - -/// The `RLMSectionedResult` protocol defines properties and methods common to both `RLMSectionedResults and RLMSection` -@protocol RLMSectionedResult - -#pragma mark - Object Access - -/// The count of objects in the collection. -@property (nonatomic, readonly) NSUInteger count; -/// Returns the object for a given index in the collection. -- (id)objectAtIndexedSubscript:(NSUInteger)index; -/// Returns the object for a given index in the collection. -- (id)objectAtIndex:(NSUInteger)index; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this collection. - - The frozen copy is an immutable collection which contains the same data as this - collection currently contains, but will not update when writes are made to the - containing Realm. Unlike live arrays, frozen collections can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning Holding onto a frozen collection for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; -/** - Indicates if the underlying collection is frozen. - - Frozen collections are immutable and can be accessed from any thread. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Sectioned Results Notifications - -/** - Registers a block to be called each time the collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` / `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(id, RLMSectionedResultsChange *))block __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` / `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(id, RLMSectionedResultsChange *))block - queue:(dispatch_queue_t)queue __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` / `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(id, RLMSectionedResultsChange *))block - keyPaths:(NSArray *)keyPaths __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` / `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(id, RLMSectionedResultsChange *))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue __attribute__((warn_unused_result)); - -@end - -/// An RLMSection contains the objects which belong to a specified section key. -@interface RLMSection, RLMObjectType> : NSObject -/// The value that represents the key in this section. -@property (nonatomic, readonly) RLMKeyType key; -/// The count of objects in the section. -@property (nonatomic, readonly) NSUInteger count; -/// Returns the object for a given index in the section. -- (RLMObjectType)objectAtIndexedSubscript:(NSUInteger)index; -/// Returns the object for a given index in the section. -- (RLMObjectType)objectAtIndex:(NSUInteger)index; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this section. - - The frozen copy is an immutable section which contains the same data as this - section currently contains, but will not update when writes are made to the - containing Realm. Unlike live arrays, frozen collections can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning Holding onto a frozen section for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; -/** - Returns a live version of this frozen section. - - This method resolves a reference to a live copy of the same frozen section. - If called on a live section, will return itself. -*/ -- (instancetype)thaw; -/** - Indicates if the underlying section is frozen. - - Frozen sections are immutable and can be accessed from any thread. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Section Notifications - -/** - Registers a block to be called each time the section changes. - - The block will be asynchronously called with the initial section, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - RLMSection *section = sectionedResults[0] // section with dogs aged '5' already exists. - - self.token = [section addNotificationBlock:^(RLMSection *section, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"section.count: %zu", section.count); // => 2 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSection *, RLMSectionedResultsChange *))block __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the section changes. - - The block will be asynchronously called with the initial section, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - RLMSection *section = sectionedResults[0] // section with dogs aged '5' already exists. - - self.token = [section addNotificationBlock:^(RLMSection *section, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"section.count: %zu", section.count); // => 2 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSection *, RLMSectionedResultsChange *))block - queue:(dispatch_queue_t)queue __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the section changes. - - The block will be asynchronously called with the initial section, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - RLMSection *section = sectionedResults[0] // section with dogs aged '5' already exists. - - self.token = [section addNotificationBlock:^(RLMSection *section, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"section.count: %zu", section.count); // => 2 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSection *, RLMSectionedResultsChange *))block - keyPaths:(NSArray *)keyPaths __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the section changes. - - The block will be asynchronously called with the initial section, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - RLMSection *section = sectionedResults[0] // section with dogs aged '5' already exists. - - self.token = [section addNotificationBlock:^(RLMSection *section, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"section.count: %zu", section.count); // => 2 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSection *, RLMSectionedResultsChange *))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue __attribute__((warn_unused_result)); -@end - -/// A lazily evaluated collection that holds elements in sections determined by a section key. -@interface RLMSectionedResults, RLMObjectType: id> : NSObject -/// An array of all keys in the sectioned results collection. -@property (nonatomic) NSArray *allKeys; -/// The total amount of sections in this collection. -@property (nonatomic, readonly, assign) NSUInteger count; -/// Returns the section at a given index. -- (RLMSection *)objectAtIndexedSubscript:(NSUInteger)index; -/// Returns the section at a given index. -- (RLMSection *)objectAtIndex:(NSUInteger)index; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this sectioned results collection. - - The frozen copy is an immutable sectioned results collection which contains the same data as this - sectioned results collection currently contains, but will not update when writes are made to the - containing Realm. Unlike live sectioned results collections, frozen sectioned results collection - can be accessed from any thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning Holding onto a frozen sectioned results collection for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; -/** - Returns a live version of this frozen sectioned results collection. - - This method resolves a reference to a live copy of the same frozen sectioned results collection. - If called on a live section, will return itself. -*/ -- (instancetype)thaw; -/** - Indicates if the underlying sectioned results collection is frozen. - - Frozen sectioned results collections are immutable and can be accessed from any thread. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Sectioned Results Notifications - -/** - Registers a block to be called each time the sectioned results collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSectionedResults *, RLMSectionedResultsChange *))block __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the sectioned results collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSectionedResults *, RLMSectionedResultsChange *))block - queue:(dispatch_queue_t)queue __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the sectioned results collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSectionedResults *, RLMSectionedResultsChange *))block - keyPaths:(NSArray *)keyPaths __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the sectioned results collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSectionedResults *, RLMSectionedResultsChange *))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue __attribute__((warn_unused_result)); -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMSet.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMSet.h deleted file mode 100644 index fead2e005..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMSet.h +++ /dev/null @@ -1,535 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObject, RLMResults; - -/** - A collection datatype used for storing distinct objects. - - - Note: - `RLMSet` supports storing primitive and `RLMObject` types. `RLMSet` does not support storing - Embedded Realm Objects. - */ -@interface RLMSet : NSObject - -#pragma mark - Properties - -/** - The number of objects in the set. - */ -@property (nonatomic, readonly, assign) NSUInteger count; - -/** - The type of the objects in the set. - */ -@property (nonatomic, readonly, assign) RLMPropertyType type; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readonly, getter = isOptional) BOOL optional; - -/** - The objects in the RLMSet as an NSArray value. - */ -@property (nonatomic, readonly) NSArray *allObjects; - -/** - The class name of the objects contained in the set. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages the set. Returns `nil` for unmanaged set. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - Indicates if the set can no longer be accessed. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if the set is frozen. - - Frozen sets are immutable and can be accessed from any thread. Frozen sets - are created by calling `-freeze` on a managed live set. Unmanaged sets are - never frozen. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Adding, Removing, and Replacing Objects in a Set - -/** - Adds an object to the set if it is not already present. - - @warning This method may only be called during a write transaction. - - @param object An object of the type contained in the set. - */ -- (void)addObject:(RLMObjectType)object; - -/** - Adds an array of distinct objects to the set. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable object such as `NSArray`, `NSSet` or `RLMResults` which contains objects of the - same class as the set. - */ -- (void)addObjects:(id)objects; - -/** - Removes a given object from the set. - - @warning This method may only be called during a write transaction. - - @param object The object in the set that you want to remove. - */ -- (void)removeObject:(RLMObjectType)object; - -/** - Removes all objects from the set. - - @warning This method may only be called during a write transaction. - */ -- (void)removeAllObjects; - -/** - Empties the receiving set, then adds each object contained in another given set. - - @warning This method may only be called during a write transaction. - - @param set The RLMSet whose members replace the receiving set's content. - */ -- (void)setSet:(RLMSet *)set; - -/** - Removes from the receiving set each object that isn’t a member of another given set. - - @warning This method may only be called during a write transaction. - - @param set The RLMSet with which to perform the intersection. - */ -- (void)intersectSet:(RLMSet *)set; - -/** - Removes each object in another given set from the receiving set, if present. - - @warning This method may only be called during a write transaction. - - @param set The set of objects to remove from the receiving set. - */ -- (void)minusSet:(RLMSet *)set; - -/** - Adds each object in another given set to the receiving set, if not present. - - @warning This method may only be called during a write transaction. - - @param set The set of objects to add to the receiving set. - */ -- (void)unionSet:(RLMSet *)set; - -#pragma mark - Querying a Set - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/// :nodoc: -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/// :nodoc: -- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/// :nodoc: -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/// :nodoc: -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -/** - Returns a Boolean value that indicates whether at least one object in the receiving set is also present in another given set. - - @param set The RLMSet to compare the receiving set to. - - @return YES if at least one object in the receiving set is also present in otherSet, otherwise NO. - */ -- (BOOL)intersectsSet:(RLMSet *)set; - -/** - Returns a Boolean value that indicates whether every object in the receiving set is also present in another given set. - - @param set The RLMSet to compare the receiving set to. - - @return YES if every object in the receiving set is also present in otherSet, otherwise NO. - */ -- (BOOL)isSubsetOfSet:(RLMSet *)set; - -/** - Returns a Boolean value that indicates whether a given object is present in the set. - - @param anObject An object to look for in the set. - - @return YES if anObject is present in the set, otherwise NO. - */ -- (BOOL)containsObject:(RLMObjectType)anObject; - -/** - Compares the receiving set to another set. - - @param otherSet The set with which to compare the receiving set. - - @return YES if the contents of otherSet are equal to the contents of the receiving set, otherwise NO. - */ -- (BOOL)isEqualToSet:(RLMSet *)otherSet; - -#pragma mark - Sectioning a Set - -/** - Sorts and sections this collection from a given property key path, returning the result - as an instance of `RLMSectionedResults`. - - @param keyPath The property key path to sort on. - @param ascending The direction to sort in. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsSortedUsingKeyPath:(NSString *)keyPath - ascending:(BOOL)ascending - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -/** - Sorts and sections this collection from a given array of sort descriptors, returning the result - as an instance of `RLMSectionedResults`. - - @param sortDescriptors An array of `RLMSortDescriptor`s to sort by. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @note The primary sort descriptor must be responsible for determining the section key. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsUsingSortDescriptors:(NSArray *)sortDescriptors - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - - -#pragma mark - Notifications - -/** - Registers a block to be called each time the set changes. - - The block will be asynchronously called with the initial set, and then - called again after each write transaction which changes any of the objects in - the set, which objects are in the results, or the order of the objects in the - set. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the set were added, removed or modified. If a write transaction - did not modify any objects in the set, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - Person *person = [[Person allObjectsInRealm:realm] firstObject]; - NSLog(@"person.dogs.count: %zu", person.dogs.count); // => 0 - self.token = [person.dogs addNotificationBlock(RLMSet *dogs, - RLMCollectionChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count) // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - [person.dogs addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a non-frozen managed set. - - @param block The block to be called each time the set changes. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSet *_Nullable set, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the set changes. - - The block will be asynchronously called with the initial set, and then - called again after each write transaction which changes any of the objects in - the set, which objects are in the results, or the order of the objects in the - set. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the set were added, removed or modified. If a write transaction - did not modify any objects in the set, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSet *_Nullable set, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the set changes. - - The block will be asynchronously called with the initial set, and then - called again after each write transaction which changes any of the objects in - the set, which objects are in the results, or the order of the objects in the - set. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the set were added, removed or modified. If a write transaction - did not modify any objects in the set, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSet *_Nullable set, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the set changes. - - The block will be asynchronously called with the initial set, and then - called again after each write transaction which changes any of the objects in - the set, which objects are in the results, or the order of the objects in the - set. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the set were added, removed or modified. If a write transaction - did not modify any objects in the set, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSet *_Nullable set, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths -__attribute__((warn_unused_result)); - -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the objects in the set. - - NSNumber *min = [object.setProperty minOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, `RLMSet`, and `NSData` properties. - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The minimum value of the property, or `nil` if the set is empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects in the set. - - NSNumber *max = [object.setProperty maxOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, `RLMSet`, and `NSData` properties. - - @param property The property whose maximum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The maximum value of the property, or `nil` if the set is empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of distinct values of a given property over all the objects in the set. - - NSNumber *sum = [object.setProperty sumOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, `RLMSet and `NSData` properties. - - @param property The property whose values should be summed. Only properties of - types `int`, `float`, and `double` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects in the set. - - NSNumber *average = [object.setProperty averageOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMSet`, `RLMArray`, and `NSData` properties. - - @param property The property whose average value should be calculated. Only - properties of types `int`, `float`, and `double` are supported. - - @return The average value of the given property, or `nil` if the set is empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this set. - - The frozen copy is an immutable set which contains the same data as this - et currently contains, but will not update when writes are made to the - containing Realm. Unlike live sets, frozen sets can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a managed set. - @warning Holding onto a frozen set for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -#pragma mark - Unavailable Methods - -/** - `-[RLMSet init]` is not available because `RLMSet`s cannot be created directly. - ``RLMSet` properties on `RLMObject`s are lazily created when accessed. - */ -- (instancetype)init __attribute__((unavailable("RLMSets cannot be created directly"))); - -/** - `+[RLMSet new]` is not available because `RLMSet`s cannot be created directly. - `RLMSet` properties on `RLMObject`s are lazily created when accessed. - */ -+ (instancetype)new __attribute__((unavailable("RLMSet cannot be created directly"))); - -@end - -/// :nodoc: -@interface RLMSet (Swift) -// for use only in Swift class definitions -- (instancetype)initWithObjectClassName:(NSString *)objectClassName; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMSwiftObject.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMSwiftObject.h deleted file mode 100644 index 7ea764016..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMSwiftObject.h +++ /dev/null @@ -1,142 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) -/** - `Object` is a class used to define Realm model objects. - - In Realm you define your model classes by subclassing `Object` and adding properties to be managed. - You then instantiate and use your custom subclasses instead of using the `Object` class directly. - - ```swift - class Dog: Object { - @objc dynamic var name: String = "" - @objc dynamic var adopted: Bool = false - let siblings = List() - } - ``` - - ### Supported property types - - - `String`, `NSString` - - `Int` - - `Int8`, `Int16`, `Int32`, `Int64` - - `Float` - - `Double` - - `Bool` - - `Date`, `NSDate` - - `Data`, `NSData` - - `Decimal128` - - `ObjectId` - - `@objc enum` which has been delcared as conforming to `RealmEnum`. - - `RealmOptional` for optional numeric properties - - `Object` subclasses, to model many-to-one relationships - - `EmbeddedObject` subclasses, to model owning one-to-one relationships - - `List`, to model many-to-many relationships - - `String`, `NSString`, `Date`, `NSDate`, `Data`, `NSData`, `Decimal128`, and `ObjectId` properties - can be declared as optional. `Object` and `EmbeddedObject` subclasses *must* be declared as optional. - `Int`, `Int8`, `Int16`, `Int32`, `Int64`, `Float`, `Double`, `Bool`, enum, and `List` properties cannot. - To store an optional number, use `RealmOptional`, `RealmOptional`, `RealmOptional`, or - `RealmOptional` instead, which wraps an optional numeric value. Lists cannot be optional at all. - - All property types except for `List` and `RealmOptional` *must* be declared as `@objc dynamic var`. `List` and - `RealmOptional` properties must be declared as non-dynamic `let` properties. Swift `lazy` properties are not allowed. - - Note that none of the restrictions listed above apply to properties that are configured to be ignored by Realm. - - ### Querying - - You can retrieve all objects of a given type from a Realm by calling the `objects(_:)` instance method. - - ### Relationships - - See our [Objective-C guide](https://docs.mongodb.com/realm/sdk/swift/fundamentals/relationships/) for more details. - */ -@interface RealmSwiftObject : RLMObjectBase -@end - -/** - `EmbeddedObject` is a base class used to define embedded Realm model objects. - - Embedded objects work similarly to normal objects, but are owned by a single - parent Object (which itself may be embedded). Unlike normal top-level objects, - embedded objects cannot be directly created in or added to a Realm. Instead, - they can only be created as part of a parent object, or by assigning an - unmanaged object to a parent object's property. Embedded objects are - automatically deleted when the parent object is deleted or when the parent is - modified to no longer point at the embedded object, either by reassigning an - Object property or by removing the embedded object from the List containing it. - - Embedded objects can only ever have a single parent object which links to - them, and attempting to link to an existing managed embedded object will throw - an exception. - - The property types supported on `EmbeddedObject` are the same as for `Object`, - except for that embedded objects cannot link to top-level objects, so `Object` - and `List` properties are not supported (`EmbeddedObject` and - `List` *are*). - - Embedded objects cannot have primary keys or indexed properties. - - ```swift - class Owner: Object { - @objc dynamic var name: String = "" - let dogs = List() - } - class Dog: EmbeddedObject { - @objc dynamic var name: String = "" - @objc dynamic var adopted: Bool = false - let owner = LinkingObjects(fromType: Owner.self, property: "dogs") - } - ``` - */ -@interface RealmSwiftEmbeddedObject : RLMObjectBase -@end - -/** - `AsymmetricObject` is a base class used to define asymmetric Realm objects. - - Asymmetric objects can only be created using the `create(_ object:)` - function, and cannot be added, removed or queried. - When created, asymmetric objects will be synced unidirectionally to the MongoDB - database and cannot be accessed locally. - - Incoming links from any asymmetric table are not allowed, meaning embedding - an asymmetric object within an `Object` will throw an error. - - The property types supported on `AsymmetricObject` are the same as for `Object`, - except for that asymmetric objects can only link to embedded objects, so `Object` - and `List` properties are not supported (`EmbeddedObject` and - `List` *are*). - - ```swift - class Person: AsymmetricObject { - @Persisted(primaryKey: true) var _id: ObjectId = ObjectId.generate() - @Persisted var name: String - @Persisted var age: Int - } - ``` - */ -@interface RealmSwiftAsymmetricObject : RLMObjectBase -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMSwiftProperty.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMSwiftProperty.h deleted file mode 100644 index ea071927c..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMSwiftProperty.h +++ /dev/null @@ -1,71 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -@class RLMObjectBase, RLMArray, RLMSet; - -#ifdef __cplusplus -extern "C" { -#endif - -RLM_HEADER_AUDIT_BEGIN(nullability) - -#define REALM_FOR_EACH_SWIFT_PRIMITIVE_TYPE(macro) \ - macro(bool, Bool, bool) \ - macro(double, Double, double) \ - macro(float, Float, float) \ - macro(int64_t, Int64, int) - -#define REALM_FOR_EACH_SWIFT_OBJECT_TYPE(macro) \ - macro(NSString, String, string) \ - macro(NSDate, Date, date) \ - macro(NSData, Data, data) \ - macro(NSUUID, UUID, uuid) \ - macro(RLMDecimal128, Decimal128, decimal128) \ - macro(RLMObjectId, ObjectId, objectId) - -#define REALM_SWIFT_PROPERTY_ACCESSOR(objc, swift, rlmtype) \ - objc RLMGetSwiftProperty##swift(RLMObjectBase *, uint16_t); \ - objc RLMGetSwiftProperty##swift##Optional(RLMObjectBase *, uint16_t, bool *); \ - void RLMSetSwiftProperty##swift(RLMObjectBase *, uint16_t, objc); -REALM_FOR_EACH_SWIFT_PRIMITIVE_TYPE(REALM_SWIFT_PROPERTY_ACCESSOR) -#undef REALM_SWIFT_PROPERTY_ACCESSOR - -#define REALM_SWIFT_PROPERTY_ACCESSOR(objc, swift, rlmtype) \ - objc *_Nullable RLMGetSwiftProperty##swift(RLMObjectBase *, uint16_t); \ - void RLMSetSwiftProperty##swift(RLMObjectBase *, uint16_t, objc *_Nullable); -REALM_FOR_EACH_SWIFT_OBJECT_TYPE(REALM_SWIFT_PROPERTY_ACCESSOR) -#undef REALM_SWIFT_PROPERTY_ACCESSOR - -id _Nullable RLMGetSwiftPropertyAny(RLMObjectBase *, uint16_t); -void RLMSetSwiftPropertyAny(RLMObjectBase *, uint16_t, id); -RLMObjectBase *_Nullable RLMGetSwiftPropertyObject(RLMObjectBase *, uint16_t); -void RLMSetSwiftPropertyNil(RLMObjectBase *, uint16_t); -void RLMSetSwiftPropertyObject(RLMObjectBase *, uint16_t, RLMObjectBase *_Nullable); - -RLMArray *_Nonnull RLMGetSwiftPropertyArray(RLMObjectBase *obj, uint16_t); -RLMSet *_Nonnull RLMGetSwiftPropertySet(RLMObjectBase *obj, uint16_t); -RLMDictionary *_Nonnull RLMGetSwiftPropertyMap(RLMObjectBase *obj, uint16_t); - -RLM_HEADER_AUDIT_END(nullability) - -#ifdef __cplusplus -} // extern "C" -#endif diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMSyncConfiguration.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMSyncConfiguration.h deleted file mode 100644 index 54ea2ecfc..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMSyncConfiguration.h +++ /dev/null @@ -1,196 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -@class RLMApp; -@class RLMRealm; -@class RLMRealmConfiguration; -@class RLMUser; -@protocol RLMBSON; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** Determines file behavior during a client reset. - - @see: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ -*/ -typedef NS_ENUM(NSUInteger, RLMClientResetMode) { - /// The local copy of the Realm is copied into a recovery - /// directory for safekeeping, and then deleted from the original location. The next time - /// the Realm for that partition value is opened, the Realm will automatically be re-downloaded from - /// Atlas App Services, and can be used as normal. - - /// Data written to the Realm after the local copy of the Realm diverged from the backup - /// remote copy will be present in the local recovery copy of the Realm file. The - /// re-downloaded Realm will initially contain only the data present at the time the Realm - /// was backed up on the server. - /// - /// @see: ``rlmSync_clientResetBackedUpRealmPath`` and ``RLMSyncErrorActionToken`` for more information on accessing the recovery directory and error information. - /// - /// The manual client reset mode handler can be set in two places: - /// 1. As an ErrorReportingBlock argument at ``RLMSyncConfiguration.manualClientResetHandler``. - /// 2. As an ErrorReportingBlock in the ``RLMSyncManager.errorHandler`` property. - /// @see: ``RLMSyncManager.errorHandler`` - /// - /// When an ``RLMSyncErrorClientResetError`` is thrown, the following rules determine which block is executed: - /// - If an error reporting block is set in ``.manualClientResetHandler`` and the ``RLMSyncManager.errorHandler``, the ``.manualClientResetHandler`` block will be executed. - /// - If an error reporting block is set in either the ``.manualClientResetHandler`` or the ``RLMSyncManager``, but not both, the single block will execute. - /// - If no block is set in either location, the client reset will not be handled. The application will likely need to be restarted and unsynced local changes may be lost. - /// @note: The ``RLMSyncManager.errorHandler`` is still invoked under all ``RLMSyncError``s *other than* ``RLMSyncErrorClientResetError``. - /// @see ``RLMSyncError`` for an exhaustive list. - RLMClientResetModeManual = 0, - /// All unsynchronized local changes are automatically discarded and the local state is - /// automatically reverted to the most recent state from the server. Unsynchronized changes - /// can then be recovered in the post-client-reset callback block. - /// - /// If ``RLMClientResetModeDiscardLocal`` is enabled but the client reset operation is unable to complete - /// then the client reset process reverts to manual mode. Example) During a destructive schema change this - /// mode will fail and invoke the manual client reset handler. - /// - /// The RLMClientResetModeDiscardLocal mode supports two client reset callbacks -- ``RLMClientResetBeforeBlock``, ``RLMClientResetAfterBlock`` -- which can be passed as arguments when creating the ``RLMSyncConfiguration``. - /// @see: ``RLMClientResetAfterBlock`` and ``RLMClientResetBeforeBlock`` - RLMClientResetModeDiscardLocal __deprecated_enum_msg("Use RLMClientResetModeDiscardUnsyncedChanges") = 1, - /// All unsynchronized local changes are automatically discarded and the local state is - /// automatically reverted to the most recent state from the server. Unsynchronized changes - /// can then be recovered in the post-client-reset callback block. - /// - /// If ``RLMClientResetModeDiscardUnsyncedChanges`` is enabled but the client reset operation is unable to complete - /// then the client reset process reverts to manual mode. Example) During a destructive schema change this - /// mode will fail and invoke the manual client reset handler. - /// - /// The RLMClientResetModeDiscardUnsyncedChanges mode supports two client reset callbacks -- ``RLMClientResetBeforeBlock``, ``RLMClientResetAfterBlock`` -- which can be passed as arguments when creating the ``RLMSyncConfiguration``. - /// @see: ``RLMClientResetAfterBlock`` and ``RLMClientResetBeforeBlock`` - RLMClientResetModeDiscardUnsyncedChanges = 1, - /// The client device will download a realm realm which reflects the latest - /// state of the server after a client reset. A recovery process is run locally in - /// an attempt to integrate the server version with any local changes from - /// before the client reset occurred. - /// - /// The changes are integrated with the following rules: - /// 1. Objects created locally that were not synced before client reset will be integrated. - /// 2. If an object has been deleted on the server, but was modified on the client, the delete takes precedence and the update is discarded - /// 3. If an object was deleted on the client, but not the server, then the client delete instruction is applied. - /// 4. In the case of conflicting updates to the same field, the client update is applied. - /// - /// If the recovery integration fails, the client reset process falls back to ``RLMClientResetModeManual``. - /// The recovery integration will fail if the "Client Recovery" setting is not enabled on the server. - /// Integration may also fail in the event of an incompatible schema change. - /// - /// The RLMClientResetModeRecoverUnsyncedChanges mode supports two client reset callbacks -- ``RLMClientResetBeforeBlock``, ``RLMClientResetAfterBlock`` -- which can be passed as arguments when creating the ``RLMSyncConfiguration``. - /// @see: ``RLMClientResetAfterBlock`` and ``RLMClientResetBeforeBlock`` - RLMClientResetModeRecoverUnsyncedChanges = 2, - /// The client device will download a realm with objects reflecting the latest version of the server. A recovery - /// process is run locally in an attempt to integrate the server version with any local changes from before the - /// client reset occurred. - /// - /// The changes are integrated with the following rules: - /// 1. Objects created locally that were not synced before client reset will be integrated. - /// 2. If an object has been deleted on the server, but was modified on the client, the delete takes precedence and the update is discarded - /// 3. If an object was deleted on the client, but not the server, then the client delete instruction is applied. - /// 4. In the case of conflicting updates to the same field, the client update is applied. - /// - /// If the recovery integration fails, the client reset process falls back to ``RLMClientResetModeDiscardUnsyncedChanges``. - /// The recovery integration will fail if the "Client Recovery" setting is not enabled on the server. - /// Integration may also fail in the event of an incompatible schema change. - /// - /// The RLMClientResetModeRecoverOrDiscardUnsyncedChanges mode supports two client reset callbacks -- ``RLMClientResetBeforeBlock``, ``RLMClientResetAfterBlock`` -- which can be passed as arguments when creating the ``RLMSyncConfiguration``. - /// @see: ``RLMClientResetAfterBlock`` and ``RLMClientResetBeforeBlock`` - RLMClientResetModeRecoverOrDiscardUnsyncedChanges = 3 -}; - -/** - A block type used to report before a client reset will occur. - The `beforeFrozen` is a frozen copy of the local state prior to client reset. - */ -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMClientResetBeforeBlock)(RLMRealm * _Nonnull beforeFrozen); - -/** - A block type used to report after a client reset occurred. - The `beforeFrozen` argument is a frozen copy of the local state prior to client reset. - The `after` argument contains the local database state after the client reset occurred. - */ -RLM_SWIFT_SENDABLE // invoked on a backgroun thread -typedef void(^RLMClientResetAfterBlock)(RLMRealm * _Nonnull beforeFrozen, RLMRealm * _Nonnull after); - -/** - A configuration object representing configuration state for a Realm which is intended to sync with a Realm Object - Server. - */ -@interface RLMSyncConfiguration : NSObject - -/// The user to which the remote Realm belongs. -@property (nonatomic, readonly) RLMUser *user; - -/** - The value this Realm is partitioned on. The partition key is a property defined in - Atlas App Services. All classes with a property with this value will be synchronized to the - Realm. - */ -@property (nonatomic, readonly) id partitionValue; - -/** - An enum which determines file recovery behavior in the event of a client reset. - @note: Defaults to `RLMClientResetModeRecoverUnsyncedChanges` - - @see: `RLMClientResetMode` - @see: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ -*/ -@property (nonatomic) RLMClientResetMode clientResetMode; - -/** - A callback which notifies prior to prior to a client reset occurring. - @see: `RLMClientResetBeforeBlock` - */ -@property (nonatomic, nullable) RLMClientResetBeforeBlock beforeClientReset; - -/** - A callback which notifies after a client reset has occurred. - @see: `RLMClientResetAfterBlock` - */ -@property (nonatomic, nullable) RLMClientResetAfterBlock afterClientReset; - -/** - A callback that's executed when an `RLMSyncErrorClientResetError` is encountered. - @See RLMSyncErrorReportingBlock and RLMSyncErrorClientResetError for more - details on handling a client reset manually. - */ -@property (nonatomic, nullable) RLMSyncErrorReportingBlock manualClientResetHandler; - - -/** - Whether nonfatal connection errors should cancel async opens. - - By default, if a nonfatal connection error such as a connection timing out occurs, any currently pending asyncOpen operations will ignore the error and continue to retry until it succeeds. If this is set to true, the open will instead fail and report the error. - - NEXT-MAJOR: This should be true by default. - */ -@property (nonatomic) bool cancelAsyncOpenOnNonFatalErrors; - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("This type cannot be created directly"))); - -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("This type cannot be created directly"))); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMSyncManager.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMSyncManager.h deleted file mode 100644 index 1dee453d0..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMSyncManager.h +++ /dev/null @@ -1,223 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMSyncSession, RLMSyncTimeoutOptions, RLMAppConfiguration; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -// NEXT-MAJOR: This enum needs to be removed when access to the logger is removed -// from the sync manager. -/// An enum representing different levels of sync-related logging that can be configured. -typedef RLM_CLOSED_ENUM(NSUInteger, RLMSyncLogLevel) { - /// Nothing will ever be logged. - RLMSyncLogLevelOff, - /// Only fatal errors will be logged. - RLMSyncLogLevelFatal, - /// Only errors will be logged. - RLMSyncLogLevelError, - /// Warnings and errors will be logged. - RLMSyncLogLevelWarn, - /// Information about sync events will be logged. Fewer events will be logged in order to avoid overhead. - RLMSyncLogLevelInfo, - /// Information about sync events will be logged. More events will be logged than with `RLMSyncLogLevelInfo`. - RLMSyncLogLevelDetail, - /// Log information that can aid in debugging. - /// - /// - warning: Will incur a measurable performance impact. - RLMSyncLogLevelDebug, - /// Log information that can aid in debugging. More events will be logged than with `RLMSyncLogLevelDebug`. - /// - /// - warning: Will incur a measurable performance impact. - RLMSyncLogLevelTrace, - /// Log information that can aid in debugging. More events will be logged than with `RLMSyncLogLevelTrace`. - /// - /// - warning: Will incur a measurable performance impact. - RLMSyncLogLevelAll -}; - -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" -/// A log callback function which can be set on RLMSyncManager. -/// -/// The log function may be called from multiple threads simultaneously, and is -/// responsible for performing its own synchronization if any is required. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void (^RLMSyncLogFunction)(RLMSyncLogLevel level, NSString *message); -#pragma clang diagnostic pop - -/// A block type representing a block which can be used to report a sync-related error to the application. If the error -/// pertains to a specific session, that session will also be passed into the block. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMSyncErrorReportingBlock)(NSError *, RLMSyncSession * _Nullable); - -/** - A manager which serves as a central point for sync-related configuration. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMSyncManager : NSObject - -/** - A block which can optionally be set to report sync-related errors to your application. - - Any error reported through this block will be of the `RLMSyncError` type, and marked - with the `RLMSyncErrorDomain` domain. - - Errors reported through this mechanism are fatal, with several exceptions. Please consult - `RLMSyncError` for information about the types of errors that can be reported through - the block, and for for suggestions on handling recoverable error codes. - - @see `RLMSyncError` - */ -@property (nullable, atomic, copy) RLMSyncErrorReportingBlock errorHandler; - -/// :nodoc: -@property (nonatomic, copy) NSString *appID -__attribute__((deprecated("This property is not used for anything"))); - -/** - A string identifying this application which is included in the User-Agent - header of sync connections. By default, this will be the application's bundle - identifier. - - This property must be set prior to opening a synchronized Realm for the first - time. Any modifications made after opening a Realm will be ignored. - */ -@property (atomic, copy) NSString *userAgent; - -/** - The logging threshold which newly opened synced Realms will use. Defaults to - `RLMSyncLogLevelInfo`. - - By default logging strings are output to Apple System Logger. Set `logger` to - perform custom logging logic instead. - - @warning This property must be set before any synced Realms are opened. Setting it after - opening any synced Realm will do nothing. - */ -@property (atomic) RLMSyncLogLevel logLevel -__attribute__((deprecated("Use `RLMLogger.default.level`/`Logger.shared.level` to set/get the default logger threshold level."))); - -/** - The function which will be invoked whenever the sync client has a log message. - - If nil, log strings are output to Apple System Logger instead. - - @warning This property must be set before any synced Realms are opened. Setting - it after opening any synced Realm will do nothing. - */ -@property (atomic, nullable) RLMSyncLogFunction logger -__attribute__((deprecated("Use `RLMLogger.default`/`Logger.shared` to set/get the default logger."))); - -/** - The name of the HTTP header to send authorization data in when making requests to Atlas App Services which has - been configured to expect a custom authorization header. - */ -@property (nullable, atomic, copy) NSString *authorizationHeaderName; - -/** - Extra HTTP headers to append to every request to Atlas App Services. - - Modifying this property while sync sessions are active will result in all - sessions disconnecting and reconnecting using the new headers. - */ -@property (nullable, atomic, copy) NSDictionary *customRequestHeaders; - -/** - Options for the assorted types of connection timeouts for sync connections. - - If nil default values for all timeouts are used instead. - - @warning This property must be set before any synced Realms are opened. Setting - it after opening any synced Realm will do nothing. - */ -@property (nullable, atomic, copy) RLMSyncTimeoutOptions *timeoutOptions; - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("RLMSyncManager cannot be created directly"))); - -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("RLMSyncManager cannot be created directly"))); - -@end - -/** - Options for configuring timeouts and intervals in the sync client. - */ -@interface RLMSyncTimeoutOptions : NSObject -/// The maximum number of milliseconds to allow for a connection to -/// become fully established. This includes the time to resolve the -/// network address, the TCP connect operation, the SSL handshake, and -/// the WebSocket handshake. -/// -/// Defaults to 2 minutes. -@property (nonatomic) NSUInteger connectTimeout; - -/// The number of milliseconds to keep a connection open after all -/// sessions have been abandoned. -/// -/// After all synchronized Realms have been closed for a given server, the -/// connection is kept open until the linger time has expired to avoid the -/// overhead of reestablishing the connection when Realms are being closed and -/// reopened. -/// -/// Defaults to 30 seconds. -@property (nonatomic) NSUInteger connectionLingerTime; - -/// The number of milliseconds between each heartbeat ping message. -/// -/// The client periodically sends ping messages to the server to check if the -/// connection is still alive. Shorter periods make connection state change -/// notifications more responsive at the cost of battery life (as the antenna -/// will have to wake up more often). -/// -/// Defaults to 1 minute. -@property (nonatomic) NSUInteger pingKeepalivePeriod; - -/// How long in milliseconds to wait for a reponse to a heartbeat ping before -/// concluding that the connection has dropped. -/// -/// Shorter values will make connection state change notifications more -/// responsive as it will only change to `disconnected` after this much time has -/// elapsed, but overly short values may result in spurious disconnection -/// notifications when the server is simply taking a long time to respond. -/// -/// Defaults to 2 minutes. -@property (nonatomic) NSUInteger pongKeepaliveTimeout; - -/// The maximum amount of time, in milliseconds, since the loss of a -/// prior connection, for a new connection to be considered a "fast -/// reconnect". -/// -/// When a client first connects to the server, it defers uploading any local -/// changes until it has downloaded all changesets from the server. This -/// typically reduces the total amount of merging that has to be done, and is -/// particularly beneficial the first time that a specific client ever connects -/// to the server. -/// -/// When an existing client disconnects and then reconnects within the "fact -/// reconnect" time this is skipped and any local changes are uploaded -/// immediately without waiting for downloads, just as if the client was online -/// the whole time. -/// -/// Defaults to 1 minute. -@property (nonatomic) NSUInteger fastReconnectLimit; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMSyncSession.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMSyncSession.h deleted file mode 100644 index 31677ce9c..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMSyncSession.h +++ /dev/null @@ -1,234 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -/** - The current state of the session represented by a session object. - */ -typedef NS_ENUM(NSUInteger, RLMSyncSessionState) { - /// The sync session is actively communicating or attempting to communicate - /// with Atlas App Services. A session is considered Active even if - /// it is not currently connected. Check the connection state instead if you - /// wish to know if the connection is currently online. - RLMSyncSessionStateActive, - /// The sync session is not attempting to communicate with MongoDB - /// Realm due to the user logging out or synchronization being paused. - RLMSyncSessionStateInactive, - /// The sync session encountered a fatal error and is permanently invalid; it should be discarded. - RLMSyncSessionStateInvalid -}; - -/** - The current state of a sync session's connection. Sessions which are not in - the Active state will always be Disconnected. - */ -typedef NS_ENUM(NSUInteger, RLMSyncConnectionState) { - /// The sync session is not connected to the server, and is not attempting - /// to connect, either because the session is inactive or because it is - /// waiting to retry after a failed connection. - RLMSyncConnectionStateDisconnected, - /// The sync session is attempting to connect to Atlas App Services. - RLMSyncConnectionStateConnecting, - /// The sync session is currently connected to Atlas App Services. - RLMSyncConnectionStateConnected, -}; - -/** - The transfer direction (upload or download) tracked by a given progress notification block. - - Progress notification blocks can be registered on sessions if your app wishes to be informed - how many bytes have been uploaded or downloaded, for example to show progress indicator UIs. - */ -typedef RLM_CLOSED_ENUM(NSUInteger, RLMSyncProgressDirection) { - /// For monitoring upload progress. - RLMSyncProgressDirectionUpload, - /// For monitoring download progress. - RLMSyncProgressDirectionDownload, -}; - -/** - The desired behavior of a progress notification block. - - Progress notification blocks can be registered on sessions if your app wishes to be informed - how many bytes have been uploaded or downloaded, for example to show progress indicator UIs. - */ -typedef NS_ENUM(NSUInteger, RLMSyncProgressMode) { - /** - The block will be called indefinitely, or until it is unregistered by calling - `-[RLMProgressNotificationToken invalidate]`. - - Notifications will always report the latest number of transferred bytes, and the - most up-to-date number of total transferrable bytes. - */ - RLMSyncProgressModeReportIndefinitely, - /** - The block will, upon registration, store the total number of bytes - to be transferred. When invoked, it will always report the most up-to-date number - of transferrable bytes out of that original number of transferrable bytes. - - When the number of transferred bytes reaches or exceeds the - number of transferrable bytes, the block will be unregistered. - */ - RLMSyncProgressModeForCurrentlyOutstandingWork, -}; - -@class RLMUser, RLMSyncConfiguration, RLMSyncErrorActionToken, RLMSyncManager; - -/** - The type of a progress notification block intended for reporting a session's network - activity to the user. - - `transferredBytes` refers to the number of bytes that have been uploaded or downloaded. - `transferrableBytes` refers to the total number of bytes transferred, and pending transfer. - */ -typedef void(^RLMProgressNotificationBlock)(NSUInteger transferredBytes, NSUInteger transferrableBytes); - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A token object corresponding to a progress notification block on a session object. - - To stop notifications manually, call `-invalidate` on it. Notifications should be stopped before - the token goes out of scope or is destroyed. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMProgressNotificationToken : RLMNotificationToken -@end - -/** - An object encapsulating an Atlas App Services "session". Sessions represent the - communication between the client (and a local Realm file on disk), and the server - (and a remote Realm with a given partition value stored on Atlas App Services). - - Sessions are always created by the SDK and vended out through various APIs. The - lifespans of sessions associated with Realms are managed automatically. Session - objects can be accessed from any thread. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMSyncSession : NSObject - -/// The session's current state. -/// -/// This property is not KVO-compliant. -@property (nonatomic, readonly) RLMSyncSessionState state; - -/// The session's current connection state. -/// -/// This property is KVO-compliant and can be observed to be notified of changes. -/// Be warned that KVO observers for this property may be called on a background -/// thread. -@property (atomic, readonly) RLMSyncConnectionState connectionState; - -/// The user that owns this session. -- (nullable RLMUser *)parentUser; - -/** - If the session is valid, return a sync configuration that can be used to open the Realm - associated with this session. - */ -- (nullable RLMSyncConfiguration *)configuration; - -/** - Temporarily suspend syncronization and disconnect from the server. - - The session will not attempt to connect to Atlas App Services until `resume` - is called or the Realm file is closed and re-opened. - */ -- (void)suspend; - -/** - Resume syncronization and reconnect to Atlas App Services after suspending. - - This is a no-op if the session was already active or if the session is invalid. - Newly created sessions begin in the Active state and do not need to be resumed. - */ -- (void)resume; - -/** - Register a progress notification block. - - Multiple blocks can be registered with the same session at once. Each block - will be invoked on a side queue devoted to progress notifications. - - If the session has already received progress information from the - synchronization subsystem, the block will be called immediately. Otherwise, it - will be called as soon as progress information becomes available. - - The token returned by this method must be retained as long as progress - notifications are desired, and the `-invalidate` method should be called on it - when notifications are no longer needed and before the token is destroyed. - - If no token is returned, the notification block will never be called again. - There are a number of reasons this might be true. If the session has previously - experienced a fatal error it will not accept progress notification blocks. If - the block was configured in the `RLMSyncProgressForCurrentlyOutstandingWork` - mode but there is no additional progress to report (for example, the number - of transferrable bytes and transferred bytes are equal), the block will not be - called again. - - @param direction The transfer direction (upload or download) to track in this progress notification block. - @param mode The desired behavior of this progress notification block. - @param block The block to invoke when notifications are available. - - @return A token which must be held for as long as you want notifications to be delivered. - - @see `RLMSyncProgressDirection`, `RLMSyncProgress`, `RLMProgressNotificationBlock`, `RLMProgressNotificationToken` - */ -- (nullable RLMProgressNotificationToken *)addProgressNotificationForDirection:(RLMSyncProgressDirection)direction - mode:(RLMSyncProgressMode)mode - block:(RLMProgressNotificationBlock)block -NS_REFINED_FOR_SWIFT; - -/** - Given an error action token, immediately handle the corresponding action. - - @see `RLMSyncErrorClientResetError`, `RLMSyncErrorPermissionDeniedError` - */ -+ (void)immediatelyHandleError:(RLMSyncErrorActionToken *)token syncManager:(RLMSyncManager *)syncManager; - -/** - Get the sync session for the given Realm if it is a synchronized Realm, or `nil` - if it is not. - */ -+ (nullable RLMSyncSession *)sessionForRealm:(RLMRealm *)realm; - -@end - -// MARK: - Error action token - -#pragma mark - Error action token - -/** - An opaque token returned as part of certain errors. It can be - passed into certain APIs to perform certain actions. - - @see `RLMSyncErrorClientResetError`, `RLMSyncErrorPermissionDeniedError` - */ -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMSyncErrorActionToken : NSObject - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("This type cannot be created directly"))); - -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("This type cannot be created directly"))); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMSyncSubscription.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMSyncSubscription.h deleted file mode 100644 index d35be19d0..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMSyncSubscription.h +++ /dev/null @@ -1,346 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectId; - -#pragma mark - Subscription States - -/// The current state of the subscription. This can be used for ensuring that -/// the subscriptions are not errored and that it has been successfully -/// synced to the server. -typedef NS_ENUM(NSUInteger, RLMSyncSubscriptionState) { - /// The subscription is complete and the server has sent all the data that matched the subscription - /// queries at the time the subscription set was updated. The server is now in a steady-state - /// synchronization mode where it will stream update as they come. - RLMSyncSubscriptionStateComplete, - /// The subscription encountered an error and synchronization is paused for this Realm. You can - /// find the error calling error in the subscription set to get a description of the error. You can - /// still use the current subscription set to write a subscription. - RLMSyncSubscriptionStateError, - /// The subscription is persisted locally but not yet processed by the server, which means - /// the server hasn't yet returned all the data that matched the updated subscription queries. - RLMSyncSubscriptionStatePending, - /// The subscription set has been super-ceded by an updated one, this typically means that - /// someone is trying to write a subscription on a different instance of the subscription set. - /// You should not use a superseded subscription set and instead obtain a new instance of - /// the subscription set to write a subscription. - RLMSyncSubscriptionStateSuperseded -}; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - `RLMSyncSubscription` is used to define a Flexible Sync subscription obtained from querying a - subscription set, which can be used to read or remove/update a committed subscription. - */ -@interface RLMSyncSubscription : NSObject - -/// Name of the subscription. If not specified it will return nil. -@property (nonatomic, readonly, nullable) NSString *name; - -/// When the subscription was created. Recorded automatically. -@property (nonatomic, readonly) NSDate *createdAt; - -/// When the subscription was last updated. Recorded automatically. -@property (nonatomic, readonly) NSDate *updatedAt; - -/** - Updates a Flexible Sync's subscription query with an allowed query which will be used to bootstrap data - from the server when committed. - - @warning This method may only be called during a write subscription block. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - */ -- (void)updateSubscriptionWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (void)updateSubscriptionWhere:(NSString *)predicateFormat - args:(va_list)args; - -/** - Updates a Flexible Sync's subscription query with an allowed query which will be used to bootstrap data - from the server when committed. - - @warning This method may only be called during a write subscription block. - - @param predicate The predicate with which to filter the objects on the server. - */ -- (void)updateSubscriptionWithPredicate:(NSPredicate *)predicate; - -@end - -/** - `RLMSyncSubscriptionSet` is a collection of `RLMSyncSubscription`s. This is the entry point - for adding and removing `RLMSyncSubscription`s. - */ -@interface RLMSyncSubscriptionSet : NSObject - -/// The number of subscriptions in the subscription set. -@property (readonly) NSUInteger count; - -/// Gets the error associated to the subscription set. This will be non-nil in case the current -/// state of the subscription set is `RLMSyncSubscriptionStateError`. -@property (nonatomic, readonly, nullable) NSError *error; - -/// Gets the state associated to the subscription set. -@property (nonatomic, readonly) RLMSyncSubscriptionState state; - -#pragma mark - Batch Update subscriptions - -/** - Synchronously performs any transactions (add/remove/update) to the subscription set within the block, - this will not wait for the server to acknowledge and see all the data associated with this collection of subscriptions, - and will return after committing the subscription transactions. - - @param block The block containing actions to perform to the subscription set. - */ -- (void)update:(__attribute__((noescape)) void(^)(void))block; -/// :nodoc: -- (void)write:(__attribute__((noescape)) void(^)(void))block __attribute__((unavailable("Renamed to -update"))); - -/** - Synchronously performs any transactions (add/remove/update) to the subscription set within the block, - this will not wait for the server to acknowledge and see all the data associated with this collection of subscriptions, - and will return after committing the subscription transactions. - - @param block The block containing actions to perform to the subscription set. - @param onComplete A block which is called upon synchronization of - subscriptions to the server. The block will be passed `nil` - if the update succeeded, and an error describing the problem - otherwise. - */ -- (void)update:(__attribute__((noescape)) void(^)(void))block - onComplete:(nullable void(^RLM_SWIFT_SENDABLE)(NSError *_Nullable))onComplete - __attribute__((swift_async(not_swift_private, 2))) - __attribute__((swift_attr("@_unsafeInheritExecutor"))); -/// :nodoc: -- (void)write:(__attribute__((noescape)) void(^)(void))block - onComplete:(void(^)(NSError * _Nullable))onComplete __attribute__((unavailable("Renamed to -update:onComplete."))); - -#pragma mark - Find subscription - -/** - Finds a subscription by the specified name. - - @param name The name used to identify the subscription. - - @return A subscription for the given name. - */ -- (nullable RLMSyncSubscription *)subscriptionWithName:(NSString *)name; - -/** - Finds a subscription by the query for the specified object class name. - - @param objectClassName The class name for the model class to be queried. - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return A subscription for the given query.. - */ -- (nullable RLMSyncSubscription *)subscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (nullable RLMSyncSubscription *)subscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat - args:(va_list)args; - -/** - Finds a subscription by the query for the specified object class name. - - @param objectClassName The class name for the model class to be queried. - @param predicate The predicate used to to filter the objects on the server. - - @return A subscription for the given query.. - */ -- (nullable RLMSyncSubscription *)subscriptionWithClassName:(NSString *)objectClassName - predicate:(NSPredicate *)predicate; - -#pragma mark - Add a Subscription - -/** - Adds a new subscription to the subscription set which will be sent to the server when - committed at the end of a write subscription block. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - */ -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat - args:(va_list)args; - -/** - Adds a new subscription to the subscription set which will be sent to the server when - committed at the end of a write subscription block. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param name The name used the identify the subscription. - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - */ -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - subscriptionName:(NSString *)name - where:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - subscriptionName:(NSString *)name - where:(NSString *)predicateFormat - args:(va_list)args; - -/** - Adds a new subscription to the subscription set which will be sent to the server when - committed at the end of a write subscription block. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param predicate The predicate defining the query for the subscription. - */ -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - predicate:(NSPredicate *)predicate; - -/** - Adds a new subscription to the subscription set which will be sent to the server when - committed at the end of a write subscription block. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param name The name used to identify the subscription. - @param predicate The predicate defining the query for the subscription. - */ -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - subscriptionName:(nullable NSString *)name - predicate:(NSPredicate *)predicate; - -#pragma mark - Remove Subscription - -/** - Removes a subscription with the specified name from the subscription set. - - @warning This method may only be called during a write subscription block. - - @param name The name used the identify the subscription. - */ -- (void)removeSubscriptionWithName:(NSString *)name; - -/** - Removes a subscription with the specified query for the object class from the subscription set. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - */ -- (void)removeSubscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (void)removeSubscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat - args:(va_list)args; - -/** - Removes a subscription with the specified query for the object class from the subscription set. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param predicate The predicate which will be used to identify the subscription to be removed. - */ -- (void)removeSubscriptionWithClassName:(NSString *)objectClassName - predicate:(NSPredicate *)predicate; - -/** - Removes the subscription from the subscription set. - - @warning This method may only be called during a write subscription block. - - @param subscription An instance of the subscription to be removed. - */ -- (void)removeSubscription:(RLMSyncSubscription *)subscription; - -#pragma mark - Remove Subscriptions - -/** - Removes all subscription from the subscription set. - - @warning This method may only be called during a write subscription block. - @warning Removing all subscriptions will result in an error if no new subscription is added. Server should - acknowledge at least one subscription. - */ -- (void)removeAllSubscriptions; - -/** - Removes all subscription with the specified class name. - - @param className The class name for the model class to be queried. - - @warning This method may only be called during a write subscription block. - */ -- (void)removeAllSubscriptionsWithClassName:(NSString *)className; - -#pragma mark - SubscriptionSet Collection - -/** - Returns the subscription at the given `index`. - - @param index The index. - - @return A subscription for the given index in the subscription set. - */ -- (nullable RLMSyncSubscription *)objectAtIndex:(NSUInteger)index; - -/** - Returns the first object in the subscription set list, or `nil` if the subscriptions are empty. - - @return A subscription. - */ -- (nullable RLMSyncSubscription *)firstObject; - -/** - Returns the last object in the subscription set, or `nil` if the subscriptions are empty. - - @return A subscription. - */ -- (nullable RLMSyncSubscription *)lastObject; - -#pragma mark - Subscript - -/** - Returns the subscription at the given `index`. - - @param index The index. - - @return A subscription for the given index in the subscription set. - */ -- (id)objectAtIndexedSubscript:(NSUInteger)index; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMThreadSafeReference.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMThreadSafeReference.h deleted file mode 100644 index 9472942ed..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMThreadSafeReference.h +++ /dev/null @@ -1,107 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMRealm; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - Objects of types which conform to `RLMThreadConfined` can be managed by a Realm, which will make - them bound to a thread-specific `RLMRealm` instance. Managed objects must be explicitly exported - and imported to be passed between threads. - - Managed instances of objects conforming to this protocol can be converted to a thread-safe - reference for transport between threads by passing to the - `+[RLMThreadSafeReference referenceWithThreadConfined:]` constructor. - - Note that only types defined by Realm can meaningfully conform to this protocol, and defining new - classes which attempt to conform to it will not make them work with `RLMThreadSafeReference`. - */ -@protocol RLMThreadConfined -// Conformance to the `RLMThreadConfined_Private` protocol will be enforced at runtime. - -/** - The Realm which manages the object, or `nil` if the object is unmanaged. - - Unmanaged objects are not confined to a thread and cannot be passed to methods expecting a - `RLMThreadConfined` object. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/// Indicates if the object can no longer be accessed because it is now invalid. -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -@end - -/** - An object intended to be passed between threads containing a thread-safe reference to its - thread-confined object. - - To resolve a thread-safe reference on a target Realm on a different thread, pass to - `-[RLMRealm resolveThreadSafeReference:]`. - - @warning A `RLMThreadSafeReference` object must be resolved at most once. - Failing to resolve a `RLMThreadSafeReference` will result in the source version of the - Realm being pinned until the reference is deallocated. - - @note Prefer short-lived `RLMThreadSafeReference`s as the data for the version of the source Realm - will be retained until all references have been resolved or deallocated. - - @see `RLMThreadConfined` - @see `-[RLMRealm resolveThreadSafeReference:]` - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMThreadSafeReference<__covariant Confined : id> : NSObject - -/** - Create a thread-safe reference to the thread-confined object. - - @param threadConfined The thread-confined object to create a thread-safe reference to. - - @note You may continue to use and access the thread-confined object after passing it to this - constructor. - */ -+ (instancetype)referenceWithThreadConfined:(Confined)threadConfined; - -/** - Indicates if the reference can no longer be resolved because an attempt to resolve it has already - occurred. References can only be resolved once. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -#pragma mark - Unavailable Methods - -/** - `-[RLMThreadSafeReference init]` is not available because `RLMThreadSafeReference` cannot be - created directly. `RLMThreadSafeReference` instances must be obtained by calling - `-[RLMRealm resolveThreadSafeReference:]`. - */ -- (instancetype)init __attribute__((unavailable("RLMThreadSafeReference cannot be created directly"))); - -/** - `-[RLMThreadSafeReference new]` is not available because `RLMThreadSafeReference` cannot be - created directly. `RLMThreadSafeReference` instances must be obtained by calling - `-[RLMRealm resolveThreadSafeReference:]`. - */ -+ (instancetype)new __attribute__((unavailable("RLMThreadSafeReference cannot be created directly"))); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMUpdateResult.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMUpdateResult.h deleted file mode 100644 index df0b237e3..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMUpdateResult.h +++ /dev/null @@ -1,45 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectId; -@protocol RLMBSON; - -/// The result of an `updateOne` or `updateMany` operation a `RLMMongoCollection`. -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMUpdateResult : NSObject - -/// The number of documents that matched the filter. -@property (nonatomic, readonly) NSUInteger matchedCount; - -/// The number of documents modified. -@property (nonatomic, readonly) NSUInteger modifiedCount; - -/// The identifier of the inserted document if an upsert took place and the document's primary key is an `ObjectId`. -@property (nonatomic, nullable, readonly) RLMObjectId *objectId -__attribute__((deprecated("Use documentId instead, which support all BSON types", "documentId"))); - -/// The identifier of the inserted document if an upsert took place. -@property (nonatomic, nullable, readonly) id documentId; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMUser.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMUser.h deleted file mode 100644 index 436350f9b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMUser.h +++ /dev/null @@ -1,447 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import -#import -#import - -@class RLMUser, RLMSyncSession, RLMRealm, RLMUserIdentity, RLMAPIKeyAuth, RLMMongoClient, RLMMongoDatabase, RLMMongoCollection, RLMUserProfile; -@protocol RLMBSON; - -/** - The state of the user object. - */ -typedef NS_ENUM(NSUInteger, RLMUserState) { - /// The user is logged out. Call `logInWithCredentials:...` with valid credentials to log the user back in. - RLMUserStateLoggedOut, - /// The user is logged in, and any Realms associated with it are syncing with Atlas App Services. - RLMUserStateLoggedIn, - /// The user has been removed, and cannot be used. - RLMUserStateRemoved -}; - -/// A block type used to report an error related to a specific user. -RLM_SWIFT_SENDABLE -typedef void(^RLMOptionalUserBlock)(RLMUser * _Nullable, NSError * _Nullable); - -/// A block type used to report an error on a network request from the user. -RLM_SWIFT_SENDABLE -typedef void(^RLMUserOptionalErrorBlock)(NSError * _Nullable); - -/// A block which returns a dictionary should there be any custom data set for a user -RLM_SWIFT_SENDABLE -typedef void(^RLMUserCustomDataBlock)(NSDictionary * _Nullable, NSError * _Nullable); - -/// A block type for returning from function calls. -RLM_SWIFT_SENDABLE -typedef void(^RLMCallFunctionCompletionBlock)(id _Nullable, NSError * _Nullable); - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A `RLMUser` instance represents a single Realm App user account. - - A user may have one or more credentials associated with it. These credentials - uniquely identify the user to the authentication provider, and are used to sign - into an Atlas App Services user account. - - Note that user objects are only vended out via SDK APIs, and cannot be directly - initialized. User objects can be accessed from any thread. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // internally thread-safe -@interface RLMUser : NSObject - -/** - The unique Atlas App Services string identifying this user. - Note this is different from an identity: A user may have multiple identities but has a single identifier. See RLMUserIdentity. - */ -@property (nonatomic, readonly) NSString *identifier NS_SWIFT_NAME(id); - -/// Returns an array of identities currently linked to a user. -@property (nonatomic, readonly) NSArray *identities; - -/** - The user's refresh token used to access App Services. - - By default, refresh tokens expire 60 days after they are issued. - You can configure this time for your App's refresh tokens to be - anywhere between 30 minutes and 180 days. - - You can configure the refresh token expiration time for all sessions in - an App from the Admin UI or Admin API. -*/ -@property (nullable, nonatomic, readonly) NSString *refreshToken; - -/** - The user's access token used to access App Services. - - This is required to make HTTP requests to Atlas App Services like the Data API or GraphQL. - It should be treated as sensitive data. - - The Realm SDK automatically manages access tokens and refreshes them - when they expire. - */ -@property (nullable, nonatomic, readonly) NSString *accessToken; - -/** - The current state of the user. - */ -@property (nonatomic, readonly) RLMUserState state; - -/** - Indicates if the user is logged in or not. Returns true if the access token and refresh token are not empty. - */ -@property (nonatomic, readonly) BOOL isLoggedIn; - -#pragma mark - Lifecycle - -/** - Create a partition-based sync configuration instance for the given partition value. - - @param partitionValue The `RLMBSON` value the Realm is partitioned on. - @return A default configuration object with the sync configuration set to use the given partition value. - */ -- (RLMRealmConfiguration *)configurationWithPartitionValue:(nullable id)partitionValue NS_REFINED_FOR_SWIFT; - -/** - Create a partition-based sync configuration instance for the given partition value. - - @param partitionValue The `RLMBSON` value the Realm is partitioned on. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - - @return A configuration object with the sync configuration set to use the given partition value. - */ -- (RLMRealmConfiguration *)configurationWithPartitionValue:(nullable id)partitionValue - clientResetMode:(RLMClientResetMode)clientResetMode NS_REFINED_FOR_SWIFT; - -/** - Create a partition-based sync configuration instance for the given partition value. - - @param partitionValue The `RLMBSON` value the Realm is partitioned on. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param beforeResetBlock A callback which notifies prior to a client reset occurring. See: `RLMClientResetBeforeBlock` - @param afterResetBlock A callback which notifies after a client reset has occurred. See: `RLMClientResetAfterBlock` - - @return A configuration object with the sync configuration set to use the given partition value. - */ -- (RLMRealmConfiguration *)configurationWithPartitionValue:(nullable id)partitionValue - clientResetMode:(RLMClientResetMode)clientResetMode - notifyBeforeReset:(nullable RLMClientResetBeforeBlock)beforeResetBlock - notifyAfterReset:(nullable RLMClientResetAfterBlock)afterResetBlock NS_REFINED_FOR_SWIFT; - -/** - Create a partition-based sync configuration instance for the given partition value. - - @param partitionValue The `RLMBSON` value the Realm is partitioned on. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param manualClientResetHandler An error reporting block that is invoked during a client reset. - @See ``RLMSyncErrorReportingBlock`` and ``RLMClientResetInfo`` - - @return A configuration object with the sync configuration set to use the given partition value. - */ -- (RLMRealmConfiguration *)configurationWithPartitionValue:(nullable id)partitionValue - clientResetMode:(RLMClientResetMode)clientResetMode - manualClientResetHandler:(nullable RLMSyncErrorReportingBlock)manualClientResetHandler NS_REFINED_FOR_SWIFT; - -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @return A ``RLMRealmConfiguration`` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfiguration NS_REFINED_FOR_SWIFT; - -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param beforeResetBlock A callback which notifies prior to a client reset occurring. See: `RLMClientResetBeforeBlock` - @param afterResetBlock A callback which notifies after a client reset has occurred. See: `RLMClientResetAfterBlock` - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithClientResetMode:(RLMClientResetMode)clientResetMode - notifyBeforeReset:(nullable RLMClientResetBeforeBlock)beforeResetBlock - notifyAfterReset:(nullable RLMClientResetAfterBlock)afterResetBlock NS_REFINED_FOR_SWIFT; -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param manualClientResetHandler An error reporting block that is invoked during a client reset. - @See `RLMSyncErrorReportingBlock` and `RLMClientResetInfo` - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithClientResetMode:(RLMClientResetMode)clientResetMode - manualClientResetHandler:(nullable RLMSyncErrorReportingBlock)manualClientResetHandler NS_REFINED_FOR_SWIFT; - -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param initialSubscriptions A block which receives a subscription set instance, that can be - used to add an initial set of subscriptions which will be executed - when the Realm is first opened. - @param rerunOnOpen If true, allows to run the initial set of subscriptions specified, on every app startup. - This can be used to re-run dynamic time ranges and other queries that require a - re-computation of a static variable. - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithInitialSubscriptions:(RLMFlexibleSyncInitialSubscriptionsBlock)initialSubscriptions - rerunOnOpen:(BOOL)rerunOnOpen NS_REFINED_FOR_SWIFT; -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param initialSubscriptions A block which receives a subscription set instance, that can be - used to add an initial set of subscriptions which will be executed - when the Realm is first opened. - @param rerunOnOpen If true, allows to run the initial set of subscriptions specified, on every app startup. - This can be used to re-run dynamic time ranges and other queries that require a - re-computation of a static variable. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param beforeResetBlock A callback which notifies prior to a client reset occurring. See: `RLMClientResetBeforeBlock` - @param afterResetBlock A callback which notifies after a client reset has occurred. See: `RLMClientResetAfterBlock` - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithInitialSubscriptions:(RLMFlexibleSyncInitialSubscriptionsBlock)initialSubscriptions - rerunOnOpen:(BOOL)rerunOnOpen - clientResetMode:(RLMClientResetMode)clientResetMode - notifyBeforeReset:(nullable RLMClientResetBeforeBlock)beforeResetBlock - notifyAfterReset:(nullable RLMClientResetAfterBlock)afterResetBlock NS_REFINED_FOR_SWIFT; - -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param initialSubscriptions A block which receives a subscription set instance, that can be - used to add an initial set of subscriptions which will be executed - when the Realm is first opened. - @param rerunOnOpen If true, allows to run the initial set of subscriptions specified, on every app startup. - This can be used to re-run dynamic time ranges and other queries that require a - re-computation of a static variable. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param manualClientResetHandler An error reporting block that is invoked during a client reset. - @See `RLMSyncErrorReportingBlock` and `RLMClientResetInfo` - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithInitialSubscriptions:(RLMFlexibleSyncInitialSubscriptionsBlock)initialSubscriptions - rerunOnOpen:(BOOL)rerunOnOpen - clientResetMode:(RLMClientResetMode)clientResetMode - manualClientResetHandler:(nullable RLMSyncErrorReportingBlock)manualClientResetHandler NS_REFINED_FOR_SWIFT; - -#pragma mark - Sessions - -/** - Retrieve a valid session object belonging to this user for a given URL, or `nil` - if no such object exists. - */ -- (nullable RLMSyncSession *)sessionForPartitionValue:(id)partitionValue; - -/// Retrieve all the valid sessions belonging to this user. -@property (nonatomic, readonly) NSArray *allSessions; - -#pragma mark - Custom Data - -/** - The custom data of the user. - This is configured in your Atlas App Services app. - */ -@property (nonatomic, readonly) NSDictionary *customData NS_REFINED_FOR_SWIFT; - -/** - The profile of the user. - */ -@property (nonatomic, readonly) RLMUserProfile *profile; - -/** - Refresh a user's custom data. This will, in effect, refresh the user's auth session. - */ -- (void)refreshCustomDataWithCompletion:(RLMUserCustomDataBlock)completion; - -/** - Links the currently authenticated user with a new identity, where the identity is defined by the credential - specified as a parameter. This will only be successful if this `RLMUser` is the currently authenticated - with the client from which it was created. On success a new user will be returned with the new linked credentials. - - @param credentials The `RLMCredentials` used to link the user to a new identity. - @param completion The completion handler to call when the linking is complete. - If the operation is successful, the result will contain a new - `RLMUser` object representing the currently logged in user. -*/ -- (void)linkUserWithCredentials:(RLMCredentials *)credentials - completion:(RLMOptionalUserBlock)completion NS_REFINED_FOR_SWIFT; - -/** - Removes the user - - This logs out and destroys the session related to this user. The completion block will return an error - if the user is not found or is already removed. - - @param completion A callback invoked on completion -*/ -- (void)removeWithCompletion:(RLMUserOptionalErrorBlock)completion; - -/** - Permanently deletes this user from your Atlas App Services app. - - The users state will be set to `Removed` and the session will be destroyed. - If the delete request fails, the local authentication state will be untouched. - - @param completion A callback invoked on completion -*/ -- (void)deleteWithCompletion:(RLMUserOptionalErrorBlock)completion; - -/** - Logs out the current user - - The users state will be set to `Removed` is they are an anonymous user or `LoggedOut` if they are authenticated by an email / password or third party auth clients - If the logout request fails, this method will still clear local authentication state. - - @param completion A callback invoked on completion -*/ -- (void)logOutWithCompletion:(RLMUserOptionalErrorBlock)completion; - -/** - A client for the user API key authentication provider which - can be used to create and modify user API keys. - - This client should only be used by an authenticated user. -*/ -@property (nonatomic, readonly) RLMAPIKeyAuth *apiKeysAuth; - -/// A client for interacting with a remote MongoDB instance -/// @param serviceName The name of the MongoDB service -- (RLMMongoClient *)mongoClientWithServiceName:(NSString *)serviceName NS_REFINED_FOR_SWIFT; - -/** - Calls the Atlas App Services function with the provided name and arguments. - - @param name The name of the Atlas App Services function to be called. - @param arguments The `BSONArray` of arguments to be provided to the function. - @param completion The completion handler to call when the function call is complete. - This handler is executed on a non-main global `DispatchQueue`. -*/ -- (void)callFunctionNamed:(NSString *)name - arguments:(NSArray> *)arguments - completionBlock:(RLMCallFunctionCompletionBlock)completion NS_REFINED_FOR_SWIFT; - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("RLMUser cannot be created directly"))); -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("RLMUser cannot be created directly"))); - -@end - -#pragma mark - User info classes - -/** - An identity of a user. A user can have multiple identities, usually associated with multiple providers. - Note this is different from a user's unique identifier string. - @seeAlso `RLMUser.identifier` - */ -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMUserIdentity : NSObject - -/** - The associated provider type - */ -@property (nonatomic, readonly) NSString *providerType; - -/** - The string which identifies the RLMUserIdentity - */ -@property (nonatomic, readonly) NSString *identifier; - -/** - Initialize an RLMUserIdentity for the given identifier and provider type. - @param providerType the associated provider type - @param identifier the identifier of the identity - */ -- (instancetype)initUserIdentityWithProviderType:(NSString *)providerType - identifier:(NSString *)identifier; - -@end - -/** - A profile for a given User. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMUserProfile : NSObject - -/// The full name of the user. -@property (nonatomic, readonly, nullable) NSString *name; -/// The email address of the user. -@property (nonatomic, readonly, nullable) NSString *email; -/// A URL to the user's profile picture. -@property (nonatomic, readonly, nullable) NSString *pictureURL; -/// The first name of the user. -@property (nonatomic, readonly, nullable) NSString *firstName; -/// The last name of the user. -@property (nonatomic, readonly, nullable) NSString *lastName; -/// The gender of the user. -@property (nonatomic, readonly, nullable) NSString *gender; -/// The birthdate of the user. -@property (nonatomic, readonly, nullable) NSString *birthday; -/// The minimum age of the user. -@property (nonatomic, readonly, nullable) NSString *minAge; -/// The maximum age of the user. -@property (nonatomic, readonly, nullable) NSString *maxAge; -/// The BSON dictionary of metadata associated with this user. -@property (nonatomic, readonly) NSDictionary *metadata NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMUserAPIKey.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMUserAPIKey.h deleted file mode 100644 index 2cdd82b2a..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMUserAPIKey.h +++ /dev/null @@ -1,43 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// UserAPIKey model for APIKeys recevied from the server. -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMUserAPIKey : NSObject - -/// Indicates if the API key is disabled or not -@property (nonatomic, readonly) BOOL disabled; - -/// The name of the key. -@property (nonatomic, readonly) NSString *name; - -/// The actual key. Will only be included in -/// the response when an API key is first created. -@property (nonatomic, readonly, nullable) NSString *key; - -/// The ObjectId of the API key -@property (nonatomic, readonly) RLMObjectId *objectId NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMValue.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMValue.h deleted file mode 100644 index ac1f10ee4..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/RLMValue.h +++ /dev/null @@ -1,97 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import -#import -#import -#import -#import - -#pragma mark RLMValue - -/** - RLMValue is a property type which represents a polymorphic Realm value. This is similar to the usage of - `AnyObject` / `Any` in Swift. -``` - // A property on `MyObject` - @property (nonatomic) id myAnyValue; - - // A property on `AnotherObject` - @property (nonatomic) id myAnyValue; - - MyObject *myObject = [MyObject createInRealm:realm withValue:@[]]; - myObject.myAnyValue = @1234; // underlying type is NSNumber. - myObject.myAnyValue = @"hello"; // underlying type is NSString. - AnotherObject *anotherObject = [AnotherObject createInRealm:realm withValue:@[]]; - myObject.myAnyValue = anotherObject; // underlying type is RLMObject. -``` - The following types conform to RLMValue: - - `NSData` - `NSDate` - `NSNull` - `NSNumber` - `NSUUID` - `NSString` - `RLMObject - `RLMObjectId` - `RLMDecimal128` - */ -@protocol RLMValue - -/// Describes the type of property stored. -@property (readonly) RLMPropertyType rlm_valueType; - -@end - -/// :nodoc: -@interface NSNull (RLMValue) -@end - -/// :nodoc: -@interface NSNumber (RLMValue) -@end - -/// :nodoc: -@interface NSString (RLMValue) -@end - -/// :nodoc: -@interface NSData (RLMValue) -@end - -/// :nodoc: -@interface NSDate (RLMValue) -@end - -/// :nodoc: -@interface NSUUID (RLMValue) -@end - -/// :nodoc: -@interface RLMDecimal128 (RLMValue) -@end - -/// :nodoc: -@interface RLMObjectBase (RLMValue) -@end - -/// :nodoc: -@interface RLMObjectId (RLMValue) -@end diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/Realm.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/Realm.h deleted file mode 100644 index 245596393..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Headers/Realm.h +++ /dev/null @@ -1,63 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import - -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Info.plist b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Info.plist deleted file mode 100644 index f4d2fb36a..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Info.plist and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/LICENSE b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/LICENSE deleted file mode 100644 index 66a27ec5f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/LICENSE +++ /dev/null @@ -1,177 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Modules/module.modulemap b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Modules/module.modulemap deleted file mode 100644 index 519ddc20b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Modules/module.modulemap +++ /dev/null @@ -1,88 +0,0 @@ -framework module Realm { - export Foundation - - umbrella header "Realm.h" - - header "RLMArray.h" - header "RLMAsymmetricObject.h" - header "RLMDecimal128.h" - header "RLMDictionary.h" - header "RLMEmbeddedObject.h" - header "RLMLogger.h" - header "RLMMigration.h" - header "RLMObject.h" - header "RLMObjectId.h" - header "RLMObjectSchema.h" - header "RLMProperty.h" - header "RLMProviderClient.h" - header "RLMRealm+Sync.h" - header "RLMRealm.h" - header "RLMRealmConfiguration.h" - header "RLMResults.h" - header "RLMSchema.h" - header "RLMSectionedResults.h" - header "RLMSet.h" - header "RLMValue.h" - - header "RLMApp.h" - header "RLMCredentials.h" - header "RLMNetworkTransport.h" - header "RLMPushClient.h" - header "RLMRealm+Sync.h" - header "RLMSyncConfiguration.h" - header "RLMSyncManager.h" - header "RLMSyncSession.h" - header "RLMUser.h" - header "RLMUserAPIKey.h" - header "RLMAPIKeyAuth.h" - header "RLMEmailPasswordAuth.h" - header "NSError+RLMSync.h" - header "RLMBSON.h" - header "RLMMongoClient.h" - header "RLMMongoDatabase.h" - header "RLMMongoCollection.h" - header "RLMUpdateResult.h" - header "RLMFindOptions.h" - header "RLMFindOneAndModifyOptions.h" - header "RLMSyncSubscription.h" - - explicit module Private { - header "RLMAccessor.h" - header "RLMApp_Private.h" - header "RLMArray_Private.h" - header "RLMAsyncTask_Private.h" - header "RLMCollection_Private.h" - header "RLMDictionary_Private.h" - header "RLMLogger_Private.h" - header "RLMEvent.h" - header "RLMMongoCollection_Private.h" - header "RLMObjectBase_Dynamic.h" - header "RLMObjectBase_Private.h" - header "RLMObjectSchema_Private.h" - header "RLMObjectStore.h" - header "RLMObject_Private.h" - header "RLMProperty_Private.h" - header "RLMRealmConfiguration_Private.h" - header "RLMRealm_Private.h" - header "RLMResults_Private.h" - header "RLMScheduler.h" - header "RLMSchema_Private.h" - header "RLMSectionedResults.h" - header "RLMSet_Private.h" - header "RLMSwiftCollectionBase.h" - header "RLMSwiftProperty.h" - header "RLMSwiftValueStorage.h" - header "RLMSyncConfiguration_Private.h" - header "RLMSyncSubscription_Private.h" - header "RLMUser_Private.h" - } - - explicit module Dynamic { - header "RLMRealm_Dynamic.h" - header "RLMObjectBase_Dynamic.h" - } - - explicit module Swift { - header "RLMSwiftObject.h" - } -} diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMAccessor.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMAccessor.h deleted file mode 100644 index db915ca7c..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMAccessor.h +++ /dev/null @@ -1,53 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectSchema, RLMProperty, RLMObjectBase; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -// -// Accessors Class Creation/Caching -// - -// get accessor classes for an object class - generates classes if not cached -Class RLMManagedAccessorClassForObjectClass(Class objectClass, RLMObjectSchema *schema, const char *name); -Class RLMUnmanagedAccessorClassForObjectClass(Class objectClass, RLMObjectSchema *schema); - -// -// Dynamic getters/setters -// -FOUNDATION_EXTERN void RLMDynamicValidatedSet(RLMObjectBase *obj, NSString *propName, id __nullable val); -FOUNDATION_EXTERN id __nullable RLMDynamicGet(RLMObjectBase *obj, RLMProperty *prop); -FOUNDATION_EXTERN id __nullable RLMDynamicGetByName(RLMObjectBase *obj, NSString *propName); - -// by property/column -void RLMDynamicSet(RLMObjectBase *obj, RLMProperty *prop, id val); - -// -// Class modification -// - -// Replace className method for the given class -void RLMReplaceClassNameMethod(Class accessorClass, NSString *className); - -// Replace sharedSchema method for the given class -void RLMReplaceSharedSchemaMethod(Class accessorClass, RLMObjectSchema * __nullable schema); - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMApp_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMApp_Private.h deleted file mode 100644 index 5da5c3c7a..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMApp_Private.h +++ /dev/null @@ -1,50 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// Observer block for app notifications. -typedef void(^RLMAppNotificationBlock)(RLMApp *); - -/// Token that identifies an observer. Unsubscribes when deconstructed to -/// avoid dangling observers, therefore this must be retained to hold -/// onto a subscription. -@interface RLMAppSubscriptionToken : NSObject -- (void)unsubscribe; -@end - -@interface RLMApp () -/// Returns all currently cached Apps -+ (NSArray *)allApps; -/// Subscribe to notifications for this RLMApp. -- (RLMAppSubscriptionToken *)subscribe:(RLMAppNotificationBlock)block; - -+ (instancetype)appWithConfiguration:(RLMAppConfiguration *)configuration; - -+ (void)resetAppCache; -@end - -@interface RLMAppConfiguration () -@property (nonatomic) NSString *appId; -@property (nonatomic) BOOL encryptMetadata; -@property (nonatomic) NSURL *rootDirectory; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMArray_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMArray_Private.h deleted file mode 100644 index 1a37f010e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMArray_Private.h +++ /dev/null @@ -1,44 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -@class RLMObjectBase, RLMProperty; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMArray () -- (instancetype)initWithObjectClassName:(NSString *)objectClassName; -- (instancetype)initWithObjectType:(RLMPropertyType)type optional:(BOOL)optional; -- (NSString *)descriptionWithMaxDepth:(NSUInteger)depth; -- (void)setParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -- (void)replaceAllObjectsWithObjects:(NSArray *)objects; -// YES if the property is declared with old property syntax. -@property (nonatomic, readonly) BOOL isLegacyProperty; -// The name of the property which this collection represents -@property (nonatomic, readonly) NSString *propertyKey; -@end - -@interface RLMManagedArray : RLMArray -- (instancetype)initWithParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -@end - -void RLMArrayValidateMatchingObjectType(RLMArray *array, id value); - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMAsyncTask_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMAsyncTask_Private.h deleted file mode 100644 index 3cce89441..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMAsyncTask_Private.h +++ /dev/null @@ -1,71 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import "RLMRealm_Private.h" - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMAsyncOpenTask () -@property (nonatomic, nullable) RLMRealm *localRealm; - -- (instancetype)initWithConfiguration:(RLMRealmConfiguration *)configuration - confinedTo:(RLMScheduler *)confinement - download:(bool)waitForDownloadCompletion - completion:(RLMAsyncOpenRealmCallback)completion -__attribute__((objc_direct)); - -- (instancetype)initWithConfiguration:(RLMRealmConfiguration *)configuration - confinedTo:(RLMScheduler *)confinement - download:(bool)waitForDownloadCompletion; - -- (void)waitWithCompletion:(void (^)(NSError *_Nullable))completion; -- (void)waitForOpen:(RLMAsyncOpenRealmCallback)completion __attribute__((objc_direct)); -@end - -// A cancellable task for waiting for downloads on an already-open Realm. -RLM_SWIFT_SENDABLE -@interface RLMAsyncDownloadTask : NSObject -- (instancetype)initWithRealm:(RLMRealm *)realm; -- (void)cancel; -- (void)waitWithCompletion:(void (^)(NSError *_Nullable))completion; -@end - -// A cancellable task for beginning an async write -RLM_SWIFT_SENDABLE -@interface RLMAsyncWriteTask : NSObject -// Must only be called from within the Actor -- (instancetype)initWithRealm:(RLMRealm *)realm; -- (void)setTransactionId:(RLMAsyncTransactionId)transactionID; -- (void)complete:(bool)cancel; - -// Can be called from any thread -- (void)wait:(void (^)(void))completion; -@end - -typedef void (^RLMAsyncRefreshCompletion)(bool); -// A cancellable task for refreshing a Realm -RLM_SWIFT_SENDABLE -@interface RLMAsyncRefreshTask : NSObject -- (void)complete:(bool)didRefresh; -- (void)wait:(RLMAsyncRefreshCompletion)completion; -+ (RLMAsyncRefreshTask *)completedRefresh; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMBSON_Private.hpp b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMBSON_Private.hpp deleted file mode 100644 index c5cc1a410..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMBSON_Private.hpp +++ /dev/null @@ -1,32 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -namespace realm::bson { -class Bson; -template class IndexedMap; -using BsonDocument = IndexedMap; -} - -realm::bson::Bson RLMConvertRLMBSONToBson(id b); -realm::bson::BsonDocument RLMConvertRLMBSONArrayToBsonDocument(NSArray> *array); -id RLMConvertBsonToRLMBSON(const realm::bson::Bson& b); -id RLMConvertBsonDocumentToRLMBSON(std::optional b); -NSArray> *RLMConvertBsonDocumentToRLMBSONArray(std::optional b); diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMCollection_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMCollection_Private.h deleted file mode 100644 index 7d31bd3f0..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMCollection_Private.h +++ /dev/null @@ -1,42 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@protocol RLMCollectionPrivate; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -NSUInteger RLMUnmanagedFastEnumerate(id collection, NSFastEnumerationState *); -void RLMCollectionSetValueForKey(id collection, NSString *key, id _Nullable value); -FOUNDATION_EXTERN NSString *RLMDescriptionWithMaxDepth(NSString *name, id collection, NSUInteger depth); -FOUNDATION_EXTERN void RLMAssignToCollection(id collection, id value); -FOUNDATION_EXTERN void RLMSetSwiftBridgeCallback(id _Nullable (*_Nonnull)(id)); - -FOUNDATION_EXTERN -RLMNotificationToken *RLMAddNotificationBlock(id collection, id block, - NSArray *_Nullable keyPaths, - dispatch_queue_t _Nullable queue); - -typedef RLM_CLOSED_ENUM(int32_t, RLMCollectionType) { - RLMCollectionTypeArray = 0, - RLMCollectionTypeSet = 1, - RLMCollectionTypeDictionary = 2 -}; - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMDictionary_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMDictionary_Private.h deleted file mode 100644 index 37ff740c7..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMDictionary_Private.h +++ /dev/null @@ -1,46 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectBase, RLMProperty; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMDictionary () -- (instancetype)initWithObjectClassName:(NSString *)objectClassName keyType:(RLMPropertyType)keyType; -- (instancetype)initWithObjectType:(RLMPropertyType)type optional:(BOOL)optional keyType:(RLMPropertyType)keyType; -- (NSString *)descriptionWithMaxDepth:(NSUInteger)depth; -- (void)setParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -// YES if the property is declared with old property syntax. -@property (nonatomic, readonly) BOOL isLegacyProperty; -// The name of the property which this collection represents -@property (nonatomic, readonly) NSString *propertyKey; -@end - -@interface RLMManagedDictionary : RLMDictionary -- (instancetype)initWithParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -@end - -FOUNDATION_EXTERN NSString *RLMDictionaryDescriptionWithMaxDepth(NSString *name, - RLMDictionary *dictionary, - NSUInteger depth); -id RLMDictionaryKey(RLMDictionary *dictionary, id key) RLM_HIDDEN; -id RLMDictionaryValue(RLMDictionary *dictionary, id value) RLM_HIDDEN; - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMEvent.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMEvent.h deleted file mode 100644 index 9a6acb1a6..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMEvent.h +++ /dev/null @@ -1,64 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2022 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#ifdef __cplusplus -#include - -namespace realm { -struct AuditConfig; -} -#endif - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMRealm, RLMUser, RLMRealmConfiguration; -typedef RLM_CLOSED_ENUM(NSUInteger, RLMSyncLogLevel); - -struct RLMEventContext; -typedef void (^RLMEventCompletion)(NSError *_Nullable); - -FOUNDATION_EXTERN struct RLMEventContext *_Nullable RLMEventGetContext(RLMRealm *realm); -FOUNDATION_EXTERN uint64_t RLMEventBeginScope(struct RLMEventContext *context, NSString *activity); -FOUNDATION_EXTERN void RLMEventCommitScope(struct RLMEventContext *context, uint64_t scope_id, - RLMEventCompletion _Nullable completion); -FOUNDATION_EXTERN void RLMEventCancelScope(struct RLMEventContext *context, uint64_t scope_id); -FOUNDATION_EXTERN bool RLMEventIsActive(struct RLMEventContext *context, uint64_t scope_id); -FOUNDATION_EXTERN void RLMEventRecordEvent(struct RLMEventContext *context, NSString *activity, - NSString *_Nullable event, NSString *_Nullable data, - RLMEventCompletion _Nullable completion); -FOUNDATION_EXTERN void RLMEventUpdateMetadata(struct RLMEventContext *context, - NSDictionary *newMetadata); - -@interface RLMEventConfiguration : NSObject -@property (nonatomic) NSString *partitionPrefix; -@property (nonatomic, nullable) RLMUser *syncUser; -@property (nonatomic, nullable) NSDictionary *metadata; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" -@property (nonatomic, nullable) void (^logger)(RLMSyncLogLevel, NSString *); -#pragma clang diagnostic pop -@property (nonatomic, nullable) RLM_SWIFT_SENDABLE void (^errorHandler)(NSError *); - -#ifdef __cplusplus -- (std::shared_ptr)auditConfigWithRealmConfiguration:(RLMRealmConfiguration *)realmConfig; -#endif -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMLogger_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMLogger_Private.h deleted file mode 100644 index 08f8c591e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMLogger_Private.h +++ /dev/null @@ -1,36 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMLogger() - -/** - Log a message to the supplied level. - - @param logLevel The log level for the message. - @param message The message to log. - */ -- (void)logWithLevel:(RLMLogLevel)logLevel message:(NSString *)message, ... NS_SWIFT_UNAVAILABLE(""); -- (void)logLevel:(RLMLogLevel)logLevel message:(NSString *)message; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMMigration_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMMigration_Private.h deleted file mode 100644 index 393f41184..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMMigration_Private.h +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import -#import - -namespace realm { - class Schema; -} - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMMigration () - -@property (nonatomic, strong) RLMRealm *oldRealm; -@property (nonatomic, strong) RLMRealm *realm; - -- (instancetype)initWithRealm:(RLMRealm *)realm oldRealm:(RLMRealm *)oldRealm schema:(realm::Schema &)schema; - -- (void)execute:(RLMMigrationBlock)block objectClass:(_Nullable Class)cls; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMMongoCollection_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMMongoCollection_Private.h deleted file mode 100644 index 77bbf9752..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMMongoCollection_Private.h +++ /dev/null @@ -1,37 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@class RLMUser; - -@interface RLMMongoCollection () -- (instancetype)initWithUser:(RLMUser *)user - serviceName:(NSString *)serviceName - databaseName:(NSString *)databaseName - collectionName:(NSString *)collectionName; - -- (RLMChangeStream *)watchWithMatchFilter:(nullable id)matchFilter - idFilter:(nullable id)idFilter - delegate:(id)delegate - scheduler:(void (^)(dispatch_block_t))scheduler; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObjectBase_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObjectBase_Private.h deleted file mode 100644 index af547b17e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObjectBase_Private.h +++ /dev/null @@ -1,34 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2017 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMArray; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -// RLMObjectBase private -@interface RLMObjectBase () -@property (nonatomic, nullable) NSMutableArray *lastAccessedNames; - -+ (void)initializeLinkedObjectSchemas; -+ (bool)isEmbedded; -+ (bool)isAsymmetric; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObjectSchema_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObjectSchema_Private.h deleted file mode 100644 index 08855a82b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObjectSchema_Private.h +++ /dev/null @@ -1,75 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -// RLMObjectSchema private -@interface RLMObjectSchema () { -@public - bool _isSwiftClass; -} - -/// The object type name reported to the object store and core. -@property (nonatomic, readonly) NSString *objectName; - -// writable redeclaration -@property (nonatomic, readwrite, copy) NSArray *properties; -@property (nonatomic, readwrite, assign) bool isSwiftClass; -@property (nonatomic, readwrite, assign) BOOL isEmbedded; -@property (nonatomic, readwrite, assign) BOOL isAsymmetric; - -// class used for this object schema -@property (nonatomic, readwrite, assign) Class objectClass; -@property (nonatomic, readwrite, assign) Class accessorClass; -@property (nonatomic, readwrite, assign) Class unmanagedClass; - -@property (nonatomic, readwrite, assign) bool hasCustomEventSerialization; - -@property (nonatomic, readwrite, nullable) RLMProperty *primaryKeyProperty; - -@property (nonatomic, copy) NSArray *computedProperties; -@property (nonatomic, readonly, nullable) NSArray *swiftGenericProperties; - -// returns a cached or new schema for a given object class -+ (instancetype)schemaForObjectClass:(Class)objectClass; -@end - -@interface RLMObjectSchema (Dynamic) -/** - This method is useful only in specialized circumstances, for example, when accessing objects - in a Realm produced externally. If you are simply building an app on Realm, it is not recommended - to use this method as an [RLMObjectSchema](RLMObjectSchema) is generated automatically for every [RLMObject](RLMObject) subclass. - - Initialize an RLMObjectSchema with classname, objectClass, and an array of properties - - @warning This method is useful only in specialized circumstances. - - @param objectClassName The name of the class used to refer to objects of this type. - @param objectClass The Objective-C class used when creating instances of this type. - @param properties An array of RLMProperty instances describing the managed properties for this type. - - @return An initialized instance of RLMObjectSchema. - */ -- (instancetype)initWithClassName:(NSString *)objectClassName objectClass:(Class)objectClass properties:(NSArray *)properties; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObjectStore.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObjectStore.h deleted file mode 100644 index 6045f1e8e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObjectStore.h +++ /dev/null @@ -1,98 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#ifdef __cplusplus -extern "C" { -#endif - -@class RLMRealm, RLMSchema, RLMObjectBase, RLMResults, RLMProperty; - -typedef NS_ENUM(NSUInteger, RLMUpdatePolicy) { - RLMUpdatePolicyError = 1, - RLMUpdatePolicyUpdateChanged = 3, - RLMUpdatePolicyUpdateAll = 2, -}; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -void RLMVerifyHasPrimaryKey(Class cls); - -void RLMVerifyInWriteTransaction(RLMRealm *const realm); - -// -// Adding, Removing, Getting Objects -// - -// add an object to the given realm -void RLMAddObjectToRealm(RLMObjectBase *object, RLMRealm *realm, RLMUpdatePolicy); - -// delete an object from its realm -void RLMDeleteObjectFromRealm(RLMObjectBase *object, RLMRealm *realm); - -// deletes all objects from a realm -void RLMDeleteAllObjectsFromRealm(RLMRealm *realm); - -// get objects of a given class -RLMResults *RLMGetObjects(RLMRealm *realm, NSString *objectClassName, NSPredicate * _Nullable predicate) -NS_RETURNS_RETAINED; - -// get an object with the given primary key -id _Nullable RLMGetObject(RLMRealm *realm, NSString *objectClassName, id _Nullable key) NS_RETURNS_RETAINED; - -// create object from array or dictionary -RLMObjectBase *RLMCreateObjectInRealmWithValue(RLMRealm *realm, NSString *className, - id _Nullable value, RLMUpdatePolicy updatePolicy) -NS_RETURNS_RETAINED; - -// creates an asymmetric object and doesn't return -void RLMCreateAsymmetricObjectInRealm(RLMRealm *realm, NSString *className, id value); - -// -// Accessor Creation -// - - -// Perform the per-property accessor initialization for a managed RealmSwiftObject -// promotingExisting should be true if the object was previously used as an -// unmanaged object, and false if it is a newly created object. -void RLMInitializeSwiftAccessor(RLMObjectBase *object, bool promotingExisting); - -#ifdef __cplusplus -} - -namespace realm { - class Obj; - class Table; - struct ColKey; - struct ObjLink; -} -class RLMClassInfo; - -// get an object with a given table & object key -RLMObjectBase *RLMObjectFromObjLink(RLMRealm *realm, - realm::ObjLink&& objLink, - bool parentIsSwiftObject) NS_RETURNS_RETAINED; - -// Create accessors -RLMObjectBase *RLMCreateObjectAccessor(RLMClassInfo& info, int64_t key) NS_RETURNS_RETAINED; -RLMObjectBase *RLMCreateObjectAccessor(RLMClassInfo& info, const realm::Obj& obj) NS_RETURNS_RETAINED; -#endif - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObject_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObject_Private.h deleted file mode 100644 index 8ccdbf576..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObject_Private.h +++ /dev/null @@ -1,110 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMProperty, RLMArray, RLMSchema; -typedef NS_ENUM(int32_t, RLMPropertyType); - -FOUNDATION_EXTERN void RLMInitializeWithValue(RLMObjectBase *, id, RLMSchema *); - -typedef void (^RLMObjectNotificationCallback)(RLMObjectBase *_Nullable object, - NSArray *_Nullable propertyNames, - NSArray *_Nullable oldValues, - NSArray *_Nullable newValues, - NSError *_Nullable error); - -// RLMObject accessor and read/write realm -@interface RLMObjectBase () { -@public - RLMRealm *_realm; - __unsafe_unretained RLMObjectSchema *_objectSchema; -} - -// shared schema for this class -+ (nullable RLMObjectSchema *)sharedSchema; - -+ (nullable NSArray *)_getProperties; -+ (bool)_realmIgnoreClass; - -// This enables to override the propertiesMapping in Swift, it is not to be used in Objective-C API. -+ (NSDictionary *)propertiesMapping; -@end - -@interface RLMDynamicObject : RLMObject - -@end - -// Calls valueForKey: and re-raises NSUndefinedKeyExceptions -FOUNDATION_EXTERN id _Nullable RLMValidatedValueForProperty(id object, NSString *key, NSString *className); - -// Compare two RLObjectBases -FOUNDATION_EXTERN BOOL RLMObjectBaseAreEqual(RLMObjectBase * _Nullable o1, RLMObjectBase * _Nullable o2); - -FOUNDATION_EXTERN RLMNotificationToken *RLMObjectBaseAddNotificationBlock(RLMObjectBase *obj, - NSArray *_Nullable keyPaths, - dispatch_queue_t _Nullable queue, - RLMObjectNotificationCallback block); - -RLMNotificationToken *RLMObjectAddNotificationBlock(RLMObjectBase *obj, - RLMObjectChangeBlock block, - NSArray *_Nullable keyPaths, - dispatch_queue_t _Nullable queue); - -// Returns whether the class is a descendent of RLMObjectBase -FOUNDATION_EXTERN BOOL RLMIsObjectOrSubclass(Class klass); - -// Returns whether the class is an indirect descendant of RLMObjectBase -FOUNDATION_EXTERN BOOL RLMIsObjectSubclass(Class klass); - -FOUNDATION_EXTERN const NSUInteger RLMDescriptionMaxDepth; - -FOUNDATION_EXTERN id RLMObjectFreeze(RLMObjectBase *obj) NS_RETURNS_RETAINED; - -FOUNDATION_EXTERN id RLMObjectThaw(RLMObjectBase *obj); - -// Gets an object identifier suitable for use with Combine. This value may -// change when an unmanaged object is added to the Realm. -FOUNDATION_EXTERN uint64_t RLMObjectBaseGetCombineId(RLMObjectBase *); - -// An accessor object which is used to interact with Swift properties from obj-c -@interface RLMManagedPropertyAccessor : NSObject -// Perform any initialization required for KVO on a *unmanaged* object -+ (void)observe:(RLMProperty *)property on:(RLMObjectBase *)parent; -// Initialize the given property on a *managed* object which previous was unmanaged -+ (void)promote:(RLMProperty *)property on:(RLMObjectBase *)parent; -// Initialize the given property on a newly created *managed* object -+ (void)initialize:(RLMProperty *)property on:(RLMObjectBase *)parent; -// Read the value of the property, on either kind of object -+ (id)get:(RLMProperty *)property on:(RLMObjectBase *)parent; -// Set the property to the given value, on either kind of object -+ (void)set:(RLMProperty *)property on:(RLMObjectBase *)parent to:(id)value; -@end - -@interface RLMObjectNotificationToken : RLMNotificationToken -- (void)observe:(RLMObjectBase *)obj - keyPaths:(nullable NSArray *)keyPaths - block:(RLMObjectNotificationCallback)block; -- (void)registrationComplete:(void (^)(void))completion; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMProperty_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMProperty_Private.h deleted file mode 100644 index 6a87ced63..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMProperty_Private.h +++ /dev/null @@ -1,139 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -@class RLMObjectBase; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -BOOL RLMPropertyTypeIsComputed(RLMPropertyType propertyType); -FOUNDATION_EXTERN void RLMValidateSwiftPropertyName(NSString *name); - -// Translate an rlmtype to a string representation -static inline NSString *RLMTypeToString(RLMPropertyType type) { - switch (type) { - case RLMPropertyTypeString: - return @"string"; - case RLMPropertyTypeInt: - return @"int"; - case RLMPropertyTypeBool: - return @"bool"; - case RLMPropertyTypeDate: - return @"date"; - case RLMPropertyTypeData: - return @"data"; - case RLMPropertyTypeDouble: - return @"double"; - case RLMPropertyTypeFloat: - return @"float"; - case RLMPropertyTypeAny: - return @"mixed"; - case RLMPropertyTypeObject: - return @"object"; - case RLMPropertyTypeLinkingObjects: - return @"linking objects"; - case RLMPropertyTypeDecimal128: - return @"decimal128"; - case RLMPropertyTypeObjectId: - return @"object id"; - case RLMPropertyTypeUUID: - return @"uuid"; - } - return @"Unknown"; -} - -// private property interface -@interface RLMProperty () { -@public - RLMPropertyType _type; -} - -- (instancetype)initWithName:(NSString *)name - indexed:(BOOL)indexed - linkPropertyDescriptor:(nullable RLMPropertyDescriptor *)linkPropertyDescriptor - property:(objc_property_t)property; - -- (instancetype)initSwiftPropertyWithName:(NSString *)name - indexed:(BOOL)indexed - linkPropertyDescriptor:(nullable RLMPropertyDescriptor *)linkPropertyDescriptor - property:(objc_property_t)property - instance:(RLMObjectBase *)objectInstance; - -- (void)updateAccessors; - -// private setters -@property (nonatomic, readwrite) NSString *name; -@property (nonatomic, readwrite, assign) RLMPropertyType type; -@property (nonatomic, readwrite) BOOL indexed; -@property (nonatomic, readwrite) BOOL optional; -@property (nonatomic, readwrite) BOOL array; -@property (nonatomic, readwrite) BOOL set; -@property (nonatomic, readwrite) BOOL dictionary; -@property (nonatomic, copy, nullable) NSString *objectClassName; -@property (nonatomic, copy, nullable) NSString *linkOriginPropertyName; - -// private properties -@property (nonatomic, readwrite, nullable) NSString *columnName; -@property (nonatomic, assign) NSUInteger index; -@property (nonatomic, assign) BOOL isPrimary; -@property (nonatomic, assign) BOOL isLegacy; -@property (nonatomic, assign) ptrdiff_t swiftIvar; -@property (nonatomic, assign, nullable) Class swiftAccessor; -@property (nonatomic, readwrite, assign) RLMPropertyType dictionaryKeyType; -@property (nonatomic, readwrite) BOOL customMappingIsOptional; - -// getter and setter names -@property (nonatomic, copy) NSString *getterName; -@property (nonatomic, copy) NSString *setterName; -@property (nonatomic, nullable) SEL getterSel; -@property (nonatomic, nullable) SEL setterSel; - -- (RLMProperty *)copyWithNewName:(NSString *)name; -- (NSString *)typeName; - -@end - -@interface RLMProperty (Dynamic) -/** - This method is useful only in specialized circumstances, for example, in conjunction with - +[RLMObjectSchema initWithClassName:objectClass:properties:]. If you are simply building an - app on Realm, it is not recommended to use this method. - - Initialize an RLMProperty - - @warning This method is useful only in specialized circumstances. - - @param name The property name. - @param type The property type. - @param objectClassName The object type used for Object and Array types. - @param linkOriginPropertyName The property name of the origin of a link. Used for linking objects properties. - - @return An initialized instance of RLMProperty. - */ -- (instancetype)initWithName:(NSString *)name - type:(RLMPropertyType)type - objectClassName:(nullable NSString *)objectClassName - linkOriginPropertyName:(nullable NSString *)linkOriginPropertyName - indexed:(BOOL)indexed - optional:(BOOL)optional; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMPushClient_Private.hpp b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMPushClient_Private.hpp deleted file mode 100644 index 44304c9c3..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMPushClient_Private.hpp +++ /dev/null @@ -1,28 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import "RLMPushClient.h" - -namespace realm::app { -class PushClient; -} - -RLM_DIRECT_MEMBERS -@interface RLMPushClient () -- (instancetype)initWithPushClient:(realm::app::PushClient&&)pushClient; -@end diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMRealmConfiguration_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMRealmConfiguration_Private.h deleted file mode 100644 index 12b09676d..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMRealmConfiguration_Private.h +++ /dev/null @@ -1,52 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2015 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMSchema, RLMEventConfiguration; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMRealmConfiguration () - -@property (nonatomic, readwrite) bool cache; -@property (nonatomic, readwrite) bool dynamic; -@property (nonatomic, readwrite) bool disableFormatUpgrade; -@property (nonatomic, copy, nullable) RLMSchema *customSchema; -@property (nonatomic, copy) NSString *pathOnDisk; -@property (nonatomic, retain, nullable) RLMEventConfiguration *eventConfiguration; -@property (nonatomic, nullable) Class migrationObjectClass; -@property (nonatomic) bool disableAutomaticChangeNotifications; - -// Flexible Sync -@property (nonatomic, readwrite, nullable) RLMFlexibleSyncInitialSubscriptionsBlock initialSubscriptions; -@property (nonatomic, readwrite) BOOL rerunOnOpen; - -// Get the default configuration without copying it -+ (RLMRealmConfiguration *)rawDefaultConfiguration; - -+ (void)resetRealmConfigurationState; - -- (void)setCustomSchemaWithoutCopying:(nullable RLMSchema *)schema; -@end - -// Get a path in the platform-appropriate documents directory with the given filename -FOUNDATION_EXTERN NSString *RLMRealmPathForFile(NSString *fileName); -FOUNDATION_EXTERN NSString *RLMRealmPathForFileAndBundleIdentifier(NSString *fileName, NSString *mainBundleIdentifier); - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMRealm_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMRealm_Private.h deleted file mode 100644 index 95841491f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMRealm_Private.h +++ /dev/null @@ -1,94 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMFastEnumerator, RLMScheduler, RLMAsyncRefreshTask, RLMAsyncWriteTask; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -// Disable syncing files to disk. Cannot be re-enabled. Use only for tests. -FOUNDATION_EXTERN void RLMDisableSyncToDisk(void); -// Set whether the skip backup attribute should be set on temporary files. -FOUNDATION_EXTERN void RLMSetSkipBackupAttribute(bool value); - -FOUNDATION_EXTERN NSData * _Nullable RLMRealmValidatedEncryptionKey(NSData *key); - -// Set the queue used for async open. For testing purposes only. -FOUNDATION_EXTERN void RLMSetAsyncOpenQueue(dispatch_queue_t queue); - -// Translate an in-flight exception resulting from an operation on a SharedGroup to -// an NSError or NSException (if error is nil) -void RLMRealmTranslateException(NSError **error); - -// Block until the Realm at the given path is closed. -FOUNDATION_EXTERN void RLMWaitForRealmToClose(NSString *path); -BOOL RLMIsRealmCachedAtPath(NSString *path); - -// Register a block to be called from the next before_notify() invocation -FOUNDATION_EXTERN void RLMAddBeforeNotifyBlock(RLMRealm *realm, dispatch_block_t block); - -// Test hook to run the async notifiers for a Realm which has the background thread disabled -FOUNDATION_EXTERN void RLMRunAsyncNotifiers(NSString *path); - -// Get the cached Realm for the given configuration and scheduler, if any -FOUNDATION_EXTERN RLMRealm *_Nullable RLMGetCachedRealm(RLMRealmConfiguration *, RLMScheduler *) NS_RETURNS_RETAINED; -// Get a cached Realm for the given configuration and any scheduler. The returned -// Realm is not confined to the current thread, so very few operations are safe -// to perform on it -FOUNDATION_EXTERN RLMRealm *_Nullable RLMGetAnyCachedRealm(RLMRealmConfiguration *) NS_RETURNS_RETAINED; - -// Scheduler an async refresh for the given Realm -FOUNDATION_EXTERN RLMAsyncRefreshTask *_Nullable RLMRealmRefreshAsync(RLMRealm *rlmRealm) NS_RETURNS_RETAINED; - -// RLMRealm private members -@interface RLMRealm () -@property (nonatomic, readonly) BOOL dynamic; -@property (nonatomic, readwrite) RLMSchema *schema; -@property (nonatomic, readonly, nullable) id actor; -@property (nonatomic, readonly) bool isFlexibleSync; - -+ (void)resetRealmState; - -- (void)registerEnumerator:(RLMFastEnumerator *)enumerator; -- (void)unregisterEnumerator:(RLMFastEnumerator *)enumerator; -- (void)detachAllEnumerators; - -- (void)sendNotifications:(RLMNotification)notification; -- (void)verifyThread; -- (void)verifyNotificationsAreSupported:(bool)isCollection; - -- (RLMRealm *)frozenCopy NS_RETURNS_RETAINED; - -+ (nullable instancetype)realmWithConfiguration:(RLMRealmConfiguration *)configuration - confinedTo:(RLMScheduler *)options - error:(NSError **)error; - -- (RLMAsyncWriteTask *)beginAsyncWrite NS_RETURNS_RETAINED; -- (void)commitAsyncWriteWithGrouping:(bool)allowGrouping - completion:(void(^)(NSError *_Nullable))completion; -@end - -@interface RLMPinnedRealm : NSObject -@property (nonatomic, readonly) RLMRealmConfiguration *configuration; - -- (instancetype)initWithRealm:(RLMRealm *)realm; -- (void)unpin; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMResults_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMResults_Private.h deleted file mode 100644 index c7e29bebb..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMResults_Private.h +++ /dev/null @@ -1,33 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectSchema; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMResults () -@property (nonatomic, readonly, getter=isAttached) BOOL attached; - -+ (instancetype)emptyDetachedResults; -- (RLMResults *)snapshot; - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMScheduler.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMScheduler.h deleted file mode 100644 index 3c1b9874b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMScheduler.h +++ /dev/null @@ -1,63 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#ifdef __cplusplus -#include -namespace realm::util { -class Scheduler; -} -#endif - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -// A serial work queue of some sort which represents a thread-confinement context -// of some sort which blocks can be invoked inside. Realms are confined to a -// scheduler, which can be a thread (actually a run loop), a dispatch queue, or -// an actor. The scheduler ensures that the Realm is only used on one thread at -// a time, and allows us to dispatch work to the thread where we can access the -// Realm safely. -RLM_SWIFT_SENDABLE // is immutable -@interface RLMScheduler : NSObject -+ (RLMScheduler *)mainRunLoop __attribute__((objc_direct)); -+ (RLMScheduler *)currentRunLoop __attribute__((objc_direct)); -// A scheduler for the given queue if it's non-nil, and currentRunLoop otherwise -+ (RLMScheduler *)dispatchQueue:(nullable dispatch_queue_t)queue; -+ (RLMScheduler *)actor:(id)actor invoke:(void (^)(dispatch_block_t))invoke - verify:(void (^)(void))verify; - -// Invoke the block on this scheduler. Currently not actually implement for run -// loop schedulers. -- (void)invoke:(dispatch_block_t)block; - -// Cache key for this scheduler suitable for use with NSMapTable. Only valid -// when called from the current scheduler. -- (void *)cacheKey; - -- (nullable id)actor; - -#ifdef __cplusplus -// The object store Scheduler corresponding to this scheduler -- (std::shared_ptr)osScheduler; -#endif -@end - -FOUNDATION_EXTERN void RLMSetMainActor(id actor); - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSchema_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSchema_Private.h deleted file mode 100644 index f4f63c9f8..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSchema_Private.h +++ /dev/null @@ -1,58 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@class RLMRealm; - -// -// RLMSchema private interface -// -@interface RLMSchema () - -/** - Returns an `RLMSchema` containing only the given `RLMObject` subclasses. - - @param classes The classes to be included in the schema. - - @return An `RLMSchema` containing only the given classes. - */ -+ (instancetype)schemaWithObjectClasses:(NSArray *)classes; - -@property (nonatomic, readwrite, copy) NSArray *objectSchema; - -// schema based on runtime objects -+ (instancetype)sharedSchema; - -// schema based upon all currently registered object classes -+ (instancetype)partialSharedSchema; - -// private schema based upon all currently registered object classes. -// includes classes that are excluded from the default schema. -+ (instancetype)partialPrivateSharedSchema; - -// class for string -+ (nullable Class)classForString:(NSString *)className; - -+ (nullable RLMObjectSchema *)sharedSchemaForClass:(Class)cls; - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSet_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSet_Private.h deleted file mode 100644 index 1053e0a0f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSet_Private.h +++ /dev/null @@ -1,43 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -@class RLMObjectBase, RLMProperty; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMSet () -- (instancetype)initWithObjectClassName:(NSString *)objectClassName; -- (instancetype)initWithObjectType:(RLMPropertyType)type optional:(BOOL)optional; -- (NSString *)descriptionWithMaxDepth:(NSUInteger)depth; -- (void)setParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -// YES if the property is declared with old property syntax. -@property (nonatomic, readonly) BOOL isLegacyProperty; -// The name of the property which this collection represents -@property (nonatomic, readonly) NSString *propertyKey; -@end - -void RLMSetValidateMatchingObjectType(RLMSet *set, id value); - -@interface RLMManagedSet : RLMSet -- (instancetype)initWithParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSwiftCollectionBase.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSwiftCollectionBase.h deleted file mode 100644 index a4f864282..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSwiftCollectionBase.h +++ /dev/null @@ -1,46 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectBase, RLMResults, RLMProperty, RLMLinkingObjects; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMSwiftCollectionBase : NSProxy -@property (nonatomic, strong) id _rlmCollection; - -- (instancetype)init; -+ (Class)_backingCollectionType; -- (instancetype)initWithCollection:(id)collection; - -- (nullable id)valueForKey:(NSString *)key; -- (nullable id)valueForKeyPath:(NSString *)keyPath; -- (BOOL)isEqual:(nullable id)object; -@end - -@interface RLMLinkingObjectsHandle : NSObject -- (instancetype)initWithObject:(RLMObjectBase *)object property:(RLMProperty *)property; -- (instancetype)initWithLinkingObjects:(RLMResults *)linkingObjects; - -@property (nonatomic, readonly) RLMLinkingObjects *results; -@property (nonatomic, readonly) NSString *_propertyKey; -@property (nonatomic, readonly) BOOL _isLegacyProperty; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSwiftSupport.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSwiftSupport.h deleted file mode 100644 index 530f0edbf..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSwiftSupport.h +++ /dev/null @@ -1,30 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMSwiftSupport : NSObject - -+ (BOOL)isSwiftClassName:(NSString *)className; -+ (NSString *)demangleClassName:(NSString *)className; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSwiftValueStorage.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSwiftValueStorage.h deleted file mode 100644 index ef3efc610..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSwiftValueStorage.h +++ /dev/null @@ -1,53 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectBase, RLMProperty; - -/// This class implements the backing storage for `RealmProperty<>` and `RealmOptional<>`. -/// This class should not be subclassed or used directly. -@interface RLMSwiftValueStorage : NSProxy -- (instancetype)init; -@end -/// Retrieves the value that is stored, or nil if it is empty. -FOUNDATION_EXTERN id _Nullable RLMGetSwiftValueStorage(RLMSwiftValueStorage *); -/// Sets a value on the property this instance represents for an object. -FOUNDATION_EXTERN void RLMSetSwiftValueStorage(RLMSwiftValueStorage *, id _Nullable); - -/// Initialises managed accessors on an instance of `RLMSwiftValueStorage` -/// @param parent The enclosing parent object. -/// @param prop The property which this class represents. -FOUNDATION_EXTERN void RLMInitializeManagedSwiftValueStorage(RLMSwiftValueStorage *, - RLMObjectBase *parent, - RLMProperty *prop); - -/// Initialises unmanaged accessors on an instance of `RLMSwiftValueStorage` -/// @param parent The enclosing parent object. -/// @param prop The property which this class represents. -FOUNDATION_EXTERN void RLMInitializeUnmanagedSwiftValueStorage(RLMSwiftValueStorage *, - RLMObjectBase *parent, - RLMProperty *prop); - -/// Gets the property name for the RealmProperty instance. This is required for tracing the key path on -/// objects that use the legacy property declaration syntax. -FOUNDATION_EXTERN NSString *RLMSwiftValueStorageGetPropertyName(RLMSwiftValueStorage *); - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSyncConfiguration_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSyncConfiguration_Private.h deleted file mode 100644 index 62d0e1f1f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSyncConfiguration_Private.h +++ /dev/null @@ -1,47 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -typedef RLM_CLOSED_ENUM(NSUInteger, RLMSyncStopPolicy) { - RLMSyncStopPolicyImmediately, - RLMSyncStopPolicyLiveIndefinitely, - RLMSyncStopPolicyAfterChangesUploaded, -}; - - -@class RLMSchema; - -@interface RLMSyncConfiguration () - -// Flexible sync -- (instancetype)initWithUser:(RLMUser *)user; -// Partition-based sync -- (instancetype)initWithUser:(RLMUser *)user - partitionValue:(nullable id)partitionValue; - -// Internal-only APIs -@property (nonatomic, readwrite) RLMSyncStopPolicy stopPolicy; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSyncSubscription_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSyncSubscription_Private.h deleted file mode 100644 index dc438a20e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSyncSubscription_Private.h +++ /dev/null @@ -1,70 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -#pragma mark - Subscription - -@interface RLMSyncSubscription () - -@property (nonatomic, readonly) RLMObjectId *identifier; - -@property (nonatomic, readonly) NSString *queryString; - -@property (nonatomic, readonly) NSString *objectClassName; - -@end - -#pragma mark - SubscriptionSet - -@interface RLMSyncSubscriptionEnumerator : NSObject - -@property (nonatomic, readonly) RLMSyncSubscriptionSet *subscriptionSet; - -- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state - count:(NSUInteger)len; - -- (instancetype)initWithSubscriptionSet:(RLMSyncSubscriptionSet *)subscriptionSet; - -@end - -@interface RLMSyncSubscriptionSet () - -@property (readonly) uint64_t version; - -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - subscriptionName:(nullable NSString *)name - predicate:(NSPredicate *)predicate - updateExisting:(BOOL)updateExisting; - -- (void)waitForSynchronizationOnQueue:(nullable dispatch_queue_t)queue - completionBlock:(void(^)(NSError *))completionBlock; - -- (RLMSyncSubscriptionEnumerator *)fastEnumerator; - -NSUInteger RLMFastEnumerate(NSFastEnumerationState *state, - NSUInteger len, - RLMSyncSubscriptionSet *collection); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMUser_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMUser_Private.h deleted file mode 100644 index f62c9a940..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/PrivateHeaders/RLMUser_Private.h +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// Observer block for user notifications. -typedef void(^RLMUserNotificationBlock)(RLMUser *); - -/// Token that identifies an observer. Unsubscribes when deconstructed to -/// avoid dangling observers, therefore this must be retained to hold -/// onto a subscription. -@interface RLMUserSubscriptionToken : NSObject -- (void)unsubscribe; -@end - -@interface RLMUser () -/// Subscribe to notifications for this RLMUser. -- (RLMUserSubscriptionToken *)subscribe:(RLMUserNotificationBlock)block; - -- (void)logOut; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Realm b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Realm deleted file mode 100755 index ab72f9b14..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/Realm and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/_CodeSignature/CodeResources b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/_CodeSignature/CodeResources deleted file mode 100644 index ac831c924..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/watchos-arm64_i386_x86_64-simulator/Realm.framework/_CodeSignature/CodeResources +++ /dev/null @@ -1,1347 +0,0 @@ - - - - - files - - CHANGELOG.md - - Zv1aE8lgTnRPKTg4+FZa+hYQQNM= - - Headers/NSError+RLMSync.h - - 02q4InRTrAKLrV8lPlx32J0V1Ko= - - Headers/RLMAPIKeyAuth.h - - 1jiv26oYx54zXYdhCKJkfQgUCZ8= - - Headers/RLMApp.h - - Ld28y6nHFgdYCwgko5F6L9mRTCc= - - Headers/RLMArray.h - - SxnXSBzghc13RDA5GoX65htp0Jc= - - Headers/RLMAsymmetricObject.h - - WI4FoMYUXUw5Jgvy2eN4FBgPf3c= - - Headers/RLMAsyncTask.h - - gBGrbdQ+f9PpOJWHbVRh5Zgrcj4= - - Headers/RLMBSON.h - - GxfhbpWdUsi0bAu035zq0wBE47k= - - Headers/RLMCollection.h - - HRgDEwlbCpYK0KE4nKT3aPeVt8Y= - - Headers/RLMConstants.h - - X7tUrKW39pKREt/52svrJ/kN+ZU= - - Headers/RLMCredentials.h - - 5r4wtUdLa9Sk0U2eqOShqRrLI3o= - - Headers/RLMDecimal128.h - - W9LoTzurbOFC6l/vu0W1s6NqP/8= - - Headers/RLMDictionary.h - - J4dcvrLymwvq7wa1sgBJejF2lnk= - - Headers/RLMEmailPasswordAuth.h - - qfpoumflL/1gL/z13dVqmA19PLk= - - Headers/RLMEmbeddedObject.h - - P6AmwHOiZF/Q9/w6LRANmqDu01g= - - Headers/RLMError.h - - f/fmbab1ht8EdLMSS3f0NXW1ejg= - - Headers/RLMFindOneAndModifyOptions.h - - NiYNYX+E6fXAZefMtarr31btYSs= - - Headers/RLMFindOptions.h - - nVYUhdeFVo2/ogMj0swOyCup1LY= - - Headers/RLMLogger.h - - xRxc1g20RrrsSVEhSHPTjV7wUrM= - - Headers/RLMMigration.h - - ek93LcGxSB4AWXYxDtK7lSLIUZA= - - Headers/RLMMongoClient.h - - JRIy+dSIlbOnrRU/zjhrjH/sXTQ= - - Headers/RLMMongoCollection.h - - zKZ75q5wJK1K7basKszSka/XDlE= - - Headers/RLMMongoDatabase.h - - 0+ymiybJvLDiWbH4UgOpF5kK7JA= - - Headers/RLMNetworkTransport.h - - NkHxyI4VoqVug1wJFXOSIPd4/n8= - - Headers/RLMObject.h - - 2XkBjhUx/DUZMHptinJRuCSuN5w= - - Headers/RLMObjectBase.h - - 6+LtdM5Zd9OGUBHLtOy0mNzlGNg= - - Headers/RLMObjectBase_Dynamic.h - - lN/ItPF2L4asyDrzvE9tb2NWeQU= - - Headers/RLMObjectId.h - - FAhiEJMRgGhU/STMYxb6Cat31Ns= - - Headers/RLMObjectSchema.h - - yasl78Lq+PvN6f/sBDQAG9IiiwU= - - Headers/RLMProperty.h - - QyE/WKZTEZokOC4HNpIuGWTo3V8= - - Headers/RLMProviderClient.h - - KI1gAsi16P1iZdUTVEJSXAZF+VQ= - - Headers/RLMPushClient.h - - ZXzPubk1A63/oe83WFy6s80UAdY= - - Headers/RLMRealm+Sync.h - - bRbsIAkomXsV+zAaLltmyzxBMvk= - - Headers/RLMRealm.h - - tXxGw5mHQm9c6gM5XAu3/1zO/F8= - - Headers/RLMRealmConfiguration.h - - tACtbQrCi+eN56JH+gH60N0lXOQ= - - Headers/RLMRealm_Dynamic.h - - 0cVBS7WHOS7nUFs7Zr0DQHRc7I0= - - Headers/RLMResults.h - - OeV5SVo3AWcXxIeYr3YYc/Iu7tw= - - Headers/RLMSchema.h - - iJLLK3FYqubxFLoT7EHwmGOnbGU= - - Headers/RLMSectionedResults.h - - +n3MZjJSPd30hm1WNfqQoj1gx44= - - Headers/RLMSet.h - - wCO5ODFhqKDzuFdZZfmBnsgScdM= - - Headers/RLMSwiftObject.h - - TyJjSFDM4ZAekB3cZKc+Fv89CqU= - - Headers/RLMSwiftProperty.h - - /CqEDrE+WN75hOjEyKoDOFTM5cI= - - Headers/RLMSyncConfiguration.h - - 0U9O9AfTO5SB6TJryUm8di9tn5Y= - - Headers/RLMSyncManager.h - - YkhlSPT2hNZyA//Lf07+5rkaTsc= - - Headers/RLMSyncSession.h - - ENN75q8RC4BNpH67LE7NiUtO08U= - - Headers/RLMSyncSubscription.h - - x1LOw7ekOPIKEzT7r93iFXMpvHo= - - Headers/RLMThreadSafeReference.h - - TFdISOKXlf2bIyLYEAbzQg2nMy0= - - Headers/RLMUpdateResult.h - - Mv08aMtnTA3wP3RetaDB4sHtOGU= - - Headers/RLMUser.h - - j5Zpgb+g0lIwk90bDaauU6Y1Fbk= - - Headers/RLMUserAPIKey.h - - cIVGNVxydkLjfkIoehfmqwwGd0w= - - Headers/RLMValue.h - - PQWyj9ZNWsNAy1kGw6ENnNfTQ7c= - - Headers/Realm.h - - fDREEG2URHEbKjZ2nfKq+7M/7m8= - - Info.plist - - Dndq+KQC4u9EujfldvIqZT6MRuo= - - LICENSE - - htlQ0eA7QbvmaoSv/b3yVb0Yvsc= - - Modules/module.modulemap - - A28J5rfl2ooZX6nLmKAtWsKyoFg= - - PrivateHeaders/RLMAccessor.h - - khE1Bhu30Ou7L9/AFJKc/IJcRuU= - - PrivateHeaders/RLMApp_Private.h - - fw57ZhMCNGsWCpB/lCMaKqf0gek= - - PrivateHeaders/RLMArray_Private.h - - oA6RhNNa1GlEp9Z1dIc6yAXL91g= - - PrivateHeaders/RLMAsyncTask_Private.h - - ayc2eXD44f0/BptRlmZc+ocrzs8= - - PrivateHeaders/RLMBSON_Private.hpp - - Ku6rvqGFX5xk7aXxX4/93IoUJIw= - - PrivateHeaders/RLMCollection_Private.h - - CjigFgVyD/CQlglvVOv3mgmYhmM= - - PrivateHeaders/RLMDictionary_Private.h - - 9jGJQrUJ13oF7wuVyURhFJvDa48= - - PrivateHeaders/RLMEvent.h - - Z1CXQWPXt3itYLuQPrnDE2DOCIQ= - - PrivateHeaders/RLMLogger_Private.h - - vXtWFbH2FmBySg6psXIsF4xTyVw= - - PrivateHeaders/RLMMigration_Private.h - - Rkv9PVKy4D9WpE91+PF5fG8dqb4= - - PrivateHeaders/RLMMongoCollection_Private.h - - SxxQvypVsEBDtC0poogA7IuabvY= - - PrivateHeaders/RLMObjectBase_Private.h - - PQsL4hvY5WGKrm+ENzb3IzoLFMI= - - PrivateHeaders/RLMObjectSchema_Private.h - - 87hjm4eoCqM0JdgW0yVzYipgCv0= - - PrivateHeaders/RLMObjectStore.h - - LH3NYAHYk37ukx3w36l3VfRkWLY= - - PrivateHeaders/RLMObject_Private.h - - fSysuPyok9rS8jBVWujPT5ZYPkw= - - PrivateHeaders/RLMProperty_Private.h - - YrwESqK7Bp+VJPR2q1unO0HC1n4= - - PrivateHeaders/RLMPushClient_Private.hpp - - VB6WiIHnxZ2GvtGB/Dt8BukU3g8= - - PrivateHeaders/RLMRealmConfiguration_Private.h - - fDc6xRp+/ItxCAWyzEto1dXyZDU= - - PrivateHeaders/RLMRealm_Private.h - - FQ45UlPks0oI4fN23S8KH3+cY4U= - - PrivateHeaders/RLMResults_Private.h - - pYrkP89R066MUPthppAiIF6icJ0= - - PrivateHeaders/RLMScheduler.h - - bmnqRPRwLoqjOIHXTAATSTi2Uzs= - - PrivateHeaders/RLMSchema_Private.h - - W3h50q1OLVJcyk0pNZ6qMcSbW0U= - - PrivateHeaders/RLMSet_Private.h - - 1UAOTMK/IHQOq44rH3GVRul1lT0= - - PrivateHeaders/RLMSwiftCollectionBase.h - - g/qYcSeOq1sDRrlomok4rP7w7gA= - - PrivateHeaders/RLMSwiftSupport.h - - 4T1N9038YMMHtsxSBDLu6RQ+Lpo= - - PrivateHeaders/RLMSwiftValueStorage.h - - yk9OQJHakSFzvm/0GWEw3L/IYdg= - - PrivateHeaders/RLMSyncConfiguration_Private.h - - Uq5Fv8y5c2BeibZeqe/OqOfQumI= - - PrivateHeaders/RLMSyncSubscription_Private.h - - MNGSKmrqPPyhHcOtu/BqSSURYXM= - - PrivateHeaders/RLMUser_Private.h - - j+PpsIBJsBM3k2htqZGM/y4Fw3M= - - - files2 - - CHANGELOG.md - - hash - - Zv1aE8lgTnRPKTg4+FZa+hYQQNM= - - hash2 - - wt8p9tw4OPVj/LtpO9d+DXFoOnRQ6hRaxf/hS2NxDRg= - - - Headers/NSError+RLMSync.h - - hash - - 02q4InRTrAKLrV8lPlx32J0V1Ko= - - hash2 - - 6nK1lw6vBPSTrCi83gbHTMykzmdmX0MlMrq6LmJk94I= - - - Headers/RLMAPIKeyAuth.h - - hash - - 1jiv26oYx54zXYdhCKJkfQgUCZ8= - - hash2 - - FwweqLeo/BZi7cBnkDu+AdBgnukrjAbjicdVQJ3PVV8= - - - Headers/RLMApp.h - - hash - - Ld28y6nHFgdYCwgko5F6L9mRTCc= - - hash2 - - fmHB8oywmfycQqOzXoYB99LpOLE7akGn0ZrJtqviiTs= - - - Headers/RLMArray.h - - hash - - SxnXSBzghc13RDA5GoX65htp0Jc= - - hash2 - - KaucaZvTcO+xDUtNo4JYySrZMCq6E8OiSYOMG3/LBxE= - - - Headers/RLMAsymmetricObject.h - - hash - - WI4FoMYUXUw5Jgvy2eN4FBgPf3c= - - hash2 - - +liD/ke74W4Loa4OKvFBITIRTkZRZbItMxN6R4eU7wY= - - - Headers/RLMAsyncTask.h - - hash - - gBGrbdQ+f9PpOJWHbVRh5Zgrcj4= - - hash2 - - iyHi4LWQgTu2yYDS23OZ1wfdZt3ouoY5VoI0aEsHOm0= - - - Headers/RLMBSON.h - - hash - - GxfhbpWdUsi0bAu035zq0wBE47k= - - hash2 - - W+5lc5SCRmNbVF2Pu9Zd2v46R+WALQ7xoNCOYC1Swnw= - - - Headers/RLMCollection.h - - hash - - HRgDEwlbCpYK0KE4nKT3aPeVt8Y= - - hash2 - - womyBrMRt2s1UKKkPo++KwOv6DtP6q48hcBi1jfM2hI= - - - Headers/RLMConstants.h - - hash - - X7tUrKW39pKREt/52svrJ/kN+ZU= - - hash2 - - QntrtgpnRkkfsRAPt4SY8+3rscdQDbqztCyWdLS0vsU= - - - Headers/RLMCredentials.h - - hash - - 5r4wtUdLa9Sk0U2eqOShqRrLI3o= - - hash2 - - ObUBKMWeTU0zI7Q4Ts9H5trRs4y4T3bCUY808oTm0bY= - - - Headers/RLMDecimal128.h - - hash - - W9LoTzurbOFC6l/vu0W1s6NqP/8= - - hash2 - - Ubfmc9QWzsK+AcqbQRwaiXdylBV0LgqlyqeMBY1+LyQ= - - - Headers/RLMDictionary.h - - hash - - J4dcvrLymwvq7wa1sgBJejF2lnk= - - hash2 - - 7zN2nXgEwGfrPRtbgqtfoLrwJbwqohcVvU/OyA/07Lk= - - - Headers/RLMEmailPasswordAuth.h - - hash - - qfpoumflL/1gL/z13dVqmA19PLk= - - hash2 - - kPgBdHJePj/cHAbWCVhZlW1gCQP5jXtJ7XudO0PWjJc= - - - Headers/RLMEmbeddedObject.h - - hash - - P6AmwHOiZF/Q9/w6LRANmqDu01g= - - hash2 - - ixHqXedHxkS6e1f2hOY4TR7NWMyNq34b4/nm8SR0Oxc= - - - Headers/RLMError.h - - hash - - f/fmbab1ht8EdLMSS3f0NXW1ejg= - - hash2 - - 6duvM3p0FRf6fZ+aS57vHkf7WvV1KPoz7PcIZA48WTU= - - - Headers/RLMFindOneAndModifyOptions.h - - hash - - NiYNYX+E6fXAZefMtarr31btYSs= - - hash2 - - eBuQnRLTeMBzF7m2R9PMJor8N0HG8BATxdCptRT1l9M= - - - Headers/RLMFindOptions.h - - hash - - nVYUhdeFVo2/ogMj0swOyCup1LY= - - hash2 - - P8MSaPFACOtAPsGYinSqt6NMIsXKcWkHpFTlly2GBYo= - - - Headers/RLMLogger.h - - hash - - xRxc1g20RrrsSVEhSHPTjV7wUrM= - - hash2 - - Rc5dqT87eP/gD3kVZ1e7cRwI9Mkt5r6CFn/coM+9wNw= - - - Headers/RLMMigration.h - - hash - - ek93LcGxSB4AWXYxDtK7lSLIUZA= - - hash2 - - /CXq+e7CtzaXdrGoLya2a56Zz6xWRH73N3RzyMcQrgs= - - - Headers/RLMMongoClient.h - - hash - - JRIy+dSIlbOnrRU/zjhrjH/sXTQ= - - hash2 - - mcINEnrePRx0xfRaNvOmeXYRadQMzwLngLrJ1OVyopc= - - - Headers/RLMMongoCollection.h - - hash - - zKZ75q5wJK1K7basKszSka/XDlE= - - hash2 - - E0fX0BjuJ0j4c8TuCPbwnLNKz673nghSyUN4BYN/+Io= - - - Headers/RLMMongoDatabase.h - - hash - - 0+ymiybJvLDiWbH4UgOpF5kK7JA= - - hash2 - - wnJWmMW0z3xO9KVRJKpiE+xkaKkzXBXiH5j+8eaFmcA= - - - Headers/RLMNetworkTransport.h - - hash - - NkHxyI4VoqVug1wJFXOSIPd4/n8= - - hash2 - - AicqavQF04Q9MIj7DC5P9gBz6OuViFiiAmXdjlFnDHg= - - - Headers/RLMObject.h - - hash - - 2XkBjhUx/DUZMHptinJRuCSuN5w= - - hash2 - - OiikDToZtuVXIwxkh+yGFMFCP0c/2M6A8cIP77/xvcU= - - - Headers/RLMObjectBase.h - - hash - - 6+LtdM5Zd9OGUBHLtOy0mNzlGNg= - - hash2 - - 0IkNkedPyHNJuPYD0PmVx4Bg/+mH8tv2PNXD2m9hWV8= - - - Headers/RLMObjectBase_Dynamic.h - - hash - - lN/ItPF2L4asyDrzvE9tb2NWeQU= - - hash2 - - MhHocXkaDJWhg+kvj9Hqqy9FG4zTtna2Np2i7p4l/mA= - - - Headers/RLMObjectId.h - - hash - - FAhiEJMRgGhU/STMYxb6Cat31Ns= - - hash2 - - Y7IcVMBjUeMCgI/orPGngNh0qcgC7R7fwx2STYYTC2g= - - - Headers/RLMObjectSchema.h - - hash - - yasl78Lq+PvN6f/sBDQAG9IiiwU= - - hash2 - - 8oCJihoGgigIF170SRk/yU5RLDNX9TYQUrXxLjYrtuM= - - - Headers/RLMProperty.h - - hash - - QyE/WKZTEZokOC4HNpIuGWTo3V8= - - hash2 - - nV0mZEIKVaPW2/FVbUaWuXy+nEV5iB30UZ55i0VVCno= - - - Headers/RLMProviderClient.h - - hash - - KI1gAsi16P1iZdUTVEJSXAZF+VQ= - - hash2 - - aOPxwbDKabtIt2wbqZ4Wb/le1H43X9HXrNkONHiEX2M= - - - Headers/RLMPushClient.h - - hash - - ZXzPubk1A63/oe83WFy6s80UAdY= - - hash2 - - vLfYK+JyPmkHz32A9v/JPJGPKAL9QTKDDjuzAvbp+oQ= - - - Headers/RLMRealm+Sync.h - - hash - - bRbsIAkomXsV+zAaLltmyzxBMvk= - - hash2 - - WcmSf38ttMQ4awjqOn4zkmpysaf44aAT0GgECwvPPTA= - - - Headers/RLMRealm.h - - hash - - tXxGw5mHQm9c6gM5XAu3/1zO/F8= - - hash2 - - DMk8xOvPhlnZalU0C2E5O60eqhA67YErgxkj3mI4jXc= - - - Headers/RLMRealmConfiguration.h - - hash - - tACtbQrCi+eN56JH+gH60N0lXOQ= - - hash2 - - j5GiT0/nxORHqliXnJv/kkbOOqZX33xDbk8OTR7zDwU= - - - Headers/RLMRealm_Dynamic.h - - hash - - 0cVBS7WHOS7nUFs7Zr0DQHRc7I0= - - hash2 - - S14hbsZJZN4uVtz+HI326QGjnxKdSRlU6Ogf/zRhn3I= - - - Headers/RLMResults.h - - hash - - OeV5SVo3AWcXxIeYr3YYc/Iu7tw= - - hash2 - - qZJ0imHeOKCxk0VNEkVldju7BQHiZ2hohjwCeU6aZTg= - - - Headers/RLMSchema.h - - hash - - iJLLK3FYqubxFLoT7EHwmGOnbGU= - - hash2 - - Da+xBUjLeHl2hcOCpSFRylZchf6KtXuqqjscXH1jJQM= - - - Headers/RLMSectionedResults.h - - hash - - +n3MZjJSPd30hm1WNfqQoj1gx44= - - hash2 - - sXdD7rSZHJKtS62ScBNQhWdpGkKW1aDVK0qCzOouJIs= - - - Headers/RLMSet.h - - hash - - wCO5ODFhqKDzuFdZZfmBnsgScdM= - - hash2 - - GJyUsZbhXDGgjqOQlfqqef9XjQnvB5nCRPHtZJWGa3w= - - - Headers/RLMSwiftObject.h - - hash - - TyJjSFDM4ZAekB3cZKc+Fv89CqU= - - hash2 - - Mp9akxBWxbrBunN7cH8rKSLxSps0tbV78UDSheKAlcU= - - - Headers/RLMSwiftProperty.h - - hash - - /CqEDrE+WN75hOjEyKoDOFTM5cI= - - hash2 - - 9FsxWX7jcaks+2ZmTf4cgN0zvirLeNQHSB6BYAO1EYI= - - - Headers/RLMSyncConfiguration.h - - hash - - 0U9O9AfTO5SB6TJryUm8di9tn5Y= - - hash2 - - Qd1NmY+Z/yEGUpaaue7NEJ5fPWaRdhGPZwdhliidIpY= - - - Headers/RLMSyncManager.h - - hash - - YkhlSPT2hNZyA//Lf07+5rkaTsc= - - hash2 - - rFV4QDsBonA29YqdZXsYhNSVewEYkrafSLPWBGaEhqI= - - - Headers/RLMSyncSession.h - - hash - - ENN75q8RC4BNpH67LE7NiUtO08U= - - hash2 - - nvtBHH3xJsThO0B4IC70G3oFD2TAm3ylKbmewSOosI4= - - - Headers/RLMSyncSubscription.h - - hash - - x1LOw7ekOPIKEzT7r93iFXMpvHo= - - hash2 - - bLLVFGHhtBca6vgsFZmW1oNaoYQlrjFELS/wESp9AbM= - - - Headers/RLMThreadSafeReference.h - - hash - - TFdISOKXlf2bIyLYEAbzQg2nMy0= - - hash2 - - UMODRNRT6SDDKzmYIElQuKxojpiUtxhb0o/KbUM9BiA= - - - Headers/RLMUpdateResult.h - - hash - - Mv08aMtnTA3wP3RetaDB4sHtOGU= - - hash2 - - lAHF8rLoAYtBCB3iqPCJEeSAijx4p/TLf2Q/B/qh5lY= - - - Headers/RLMUser.h - - hash - - j5Zpgb+g0lIwk90bDaauU6Y1Fbk= - - hash2 - - wTq72vEeK8F3E3s/3DWLNz76GPbIMmApC5KfRF6m0ro= - - - Headers/RLMUserAPIKey.h - - hash - - cIVGNVxydkLjfkIoehfmqwwGd0w= - - hash2 - - 1QyqOo1U0h/D83T3jmF2rcq87+P6CHZvXh5dNLZQV00= - - - Headers/RLMValue.h - - hash - - PQWyj9ZNWsNAy1kGw6ENnNfTQ7c= - - hash2 - - kTEM0oJVWJv89s6/r6s0AHQoO1bJZsYB8IHZKbPtddY= - - - Headers/Realm.h - - hash - - fDREEG2URHEbKjZ2nfKq+7M/7m8= - - hash2 - - kjoP0TvFhg49q7sxVEgPoNFg+zqo9bCE2Uh0YOpDpbE= - - - LICENSE - - hash - - htlQ0eA7QbvmaoSv/b3yVb0Yvsc= - - hash2 - - aYSSIb+5AFPeITTvXm1UAoe0uYBiMmSS8flvXaaFUks= - - - Modules/module.modulemap - - hash - - A28J5rfl2ooZX6nLmKAtWsKyoFg= - - hash2 - - KdpbsAGrxax/jx81TZ93YswnCwT1BZTor6VwIHvgRUs= - - - PrivateHeaders/RLMAccessor.h - - hash - - khE1Bhu30Ou7L9/AFJKc/IJcRuU= - - hash2 - - SPn/lNQWueENJmkQ4wtBIhfjYt6+nmmT97X3fzuAJC0= - - - PrivateHeaders/RLMApp_Private.h - - hash - - fw57ZhMCNGsWCpB/lCMaKqf0gek= - - hash2 - - 4pd3636NRX7kQgsEy7dv7IQH/AyZMKjQvA2nmK97Vq0= - - - PrivateHeaders/RLMArray_Private.h - - hash - - oA6RhNNa1GlEp9Z1dIc6yAXL91g= - - hash2 - - 2N5vpeRBFWpvYEVWixFuVwigDP3cRo9i7S0qyB7fCZE= - - - PrivateHeaders/RLMAsyncTask_Private.h - - hash - - ayc2eXD44f0/BptRlmZc+ocrzs8= - - hash2 - - vD90SYI5658JDp88stHbsxALdVNhs0Tojcld9hVORHE= - - - PrivateHeaders/RLMBSON_Private.hpp - - hash - - Ku6rvqGFX5xk7aXxX4/93IoUJIw= - - hash2 - - BbwPX5lPL+B+5GRik9KiI5HcYoKNH/Tsciqyo3dZwBw= - - - PrivateHeaders/RLMCollection_Private.h - - hash - - CjigFgVyD/CQlglvVOv3mgmYhmM= - - hash2 - - Ez5JFCGYAGERpmwzK44V9Wu5NkwdLOrl1iHqFvur6r4= - - - PrivateHeaders/RLMDictionary_Private.h - - hash - - 9jGJQrUJ13oF7wuVyURhFJvDa48= - - hash2 - - L46EZOdftwGMzm9VC/4u3hkjsshqrE1MqRXoAkJqsOg= - - - PrivateHeaders/RLMEvent.h - - hash - - Z1CXQWPXt3itYLuQPrnDE2DOCIQ= - - hash2 - - 5QzhSVhLCncN5PArOpGSswyWYU5jSvmLJ64E6SIAYdw= - - - PrivateHeaders/RLMLogger_Private.h - - hash - - vXtWFbH2FmBySg6psXIsF4xTyVw= - - hash2 - - FcXRklemoAfn0U01YWdTuUgt0i183/x1v71EplpuujM= - - - PrivateHeaders/RLMMigration_Private.h - - hash - - Rkv9PVKy4D9WpE91+PF5fG8dqb4= - - hash2 - - ffQpfBvMLXuV8NocpO5ksVSmYUATypSSGr91LEfzT6o= - - - PrivateHeaders/RLMMongoCollection_Private.h - - hash - - SxxQvypVsEBDtC0poogA7IuabvY= - - hash2 - - PihL2Vx/JsPS4RvQXdpvaQ+VxmtmdOwaYgtH6f9wNQs= - - - PrivateHeaders/RLMObjectBase_Private.h - - hash - - PQsL4hvY5WGKrm+ENzb3IzoLFMI= - - hash2 - - qSCecm7kZ3JIPZlhy4bqSwWYGpxP6cO+4XEUgSvdUTY= - - - PrivateHeaders/RLMObjectSchema_Private.h - - hash - - 87hjm4eoCqM0JdgW0yVzYipgCv0= - - hash2 - - YULa8m2pbU/ji4KozUqn/FNoRTWwO71lgKeJiAbPRYA= - - - PrivateHeaders/RLMObjectStore.h - - hash - - LH3NYAHYk37ukx3w36l3VfRkWLY= - - hash2 - - 0KjmazUjg/mYvymGTJ74ChBgvrqN2Lc9O0TqcYF/Mic= - - - PrivateHeaders/RLMObject_Private.h - - hash - - fSysuPyok9rS8jBVWujPT5ZYPkw= - - hash2 - - +H8SMf9eYajdgBd1CmVWutUX5RsEHIsqKiruzH9R/Ok= - - - PrivateHeaders/RLMProperty_Private.h - - hash - - YrwESqK7Bp+VJPR2q1unO0HC1n4= - - hash2 - - SCHY8+Qpt8utNhA5fwnUlOZ4Lg3O4Ubp5JrNuf01QIA= - - - PrivateHeaders/RLMPushClient_Private.hpp - - hash - - VB6WiIHnxZ2GvtGB/Dt8BukU3g8= - - hash2 - - 2Os6mvA+v08M/g6mBUU8xUYAJvdOf9G/Fe1c0QuXlVg= - - - PrivateHeaders/RLMRealmConfiguration_Private.h - - hash - - fDc6xRp+/ItxCAWyzEto1dXyZDU= - - hash2 - - syVrRHUbHQtVS/Dn94ZFKgu8iSJM1m17S0xnMCK9yEg= - - - PrivateHeaders/RLMRealm_Private.h - - hash - - FQ45UlPks0oI4fN23S8KH3+cY4U= - - hash2 - - Iwvw9zZudHE58doxwpdgpZqHaiCFT0Vn256EkmeFzIw= - - - PrivateHeaders/RLMResults_Private.h - - hash - - pYrkP89R066MUPthppAiIF6icJ0= - - hash2 - - 7XS2lKYYaVQEMQ+lyOes++x+RIKDsVc8K2ZyTCf2NgE= - - - PrivateHeaders/RLMScheduler.h - - hash - - bmnqRPRwLoqjOIHXTAATSTi2Uzs= - - hash2 - - k60PzA5BmG/FSt34q+UmdeQWecO5OhB+uZnq99H1Fzc= - - - PrivateHeaders/RLMSchema_Private.h - - hash - - W3h50q1OLVJcyk0pNZ6qMcSbW0U= - - hash2 - - xuglEVxHTOiGP9pVTJ8oLhSTM1SRk38dn7uPHqUQ93Y= - - - PrivateHeaders/RLMSet_Private.h - - hash - - 1UAOTMK/IHQOq44rH3GVRul1lT0= - - hash2 - - Fo+6TD0oovdpdflJ6GyRvXgCOWHSSjd2bAR+j7Fs88U= - - - PrivateHeaders/RLMSwiftCollectionBase.h - - hash - - g/qYcSeOq1sDRrlomok4rP7w7gA= - - hash2 - - bDV50WQPz5wCRCcFfCQLob/JPetY8XeEOZOJXoLtGKs= - - - PrivateHeaders/RLMSwiftSupport.h - - hash - - 4T1N9038YMMHtsxSBDLu6RQ+Lpo= - - hash2 - - bDHCy6fOU4zn5MSi6CAVRmKQsc7GJgx6X4RNHbuI8Ws= - - - PrivateHeaders/RLMSwiftValueStorage.h - - hash - - yk9OQJHakSFzvm/0GWEw3L/IYdg= - - hash2 - - D9eklFNwtXSh83+sMaYU1SNzeidnyKUXZV2PLWt+Ank= - - - PrivateHeaders/RLMSyncConfiguration_Private.h - - hash - - Uq5Fv8y5c2BeibZeqe/OqOfQumI= - - hash2 - - neftVth2HwCuILURLXm1nMY/GZCeo0G5/yYCIS8gz3Q= - - - PrivateHeaders/RLMSyncSubscription_Private.h - - hash - - MNGSKmrqPPyhHcOtu/BqSSURYXM= - - hash2 - - Y9ySSatKNxy/XkESWScAioTpFet/83QmLhrE1VUIgmU= - - - PrivateHeaders/RLMUser_Private.h - - hash - - j+PpsIBJsBM3k2htqZGM/y4Fw3M= - - hash2 - - 4DKpP+7zxmcfnitz1DhLK2fhsChCk2aPWbG0B85100o= - - - - rules - - ^.* - - ^.*\.lproj/ - - optional - - weight - 1000 - - ^.*\.lproj/locversion.plist$ - - omit - - weight - 1100 - - ^Base\.lproj/ - - weight - 1010 - - ^version.plist$ - - - rules2 - - .*\.dSYM($|/) - - weight - 11 - - ^(.*/)?\.DS_Store$ - - omit - - weight - 2000 - - ^.* - - ^.*\.lproj/ - - optional - - weight - 1000 - - ^.*\.lproj/locversion.plist$ - - omit - - weight - 1100 - - ^Base\.lproj/ - - weight - 1010 - - ^Info\.plist$ - - omit - - weight - 20 - - ^PkgInfo$ - - omit - - weight - 20 - - ^embedded\.provisionprofile$ - - weight - 20 - - ^version\.plist$ - - weight - 20 - - - - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/CHANGELOG.md b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/CHANGELOG.md deleted file mode 100644 index 00cc01244..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/CHANGELOG.md +++ /dev/null @@ -1,9539 +0,0 @@ -10.42.3 Release notes (2023-09-18) -============================================================= - -### Enhancements - -* Update packaging for the Xcode 15.0 release. Carthage release and obj-c - binaries are now built with Xcode 15. - -### Fixed - -* The prebuilt Realm.xcframework for SPM was packaged incorrectly and did not - work ([#8361](https://github.com/realm/realm-swift/issues/8361), since v10.42.1). - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 15.0.0. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15.0.0. - -10.42.2 Release notes (2023-09-13) -============================================================= - -### Enhancements - -* Add support for logging messages sent by the server. - ([Core #6476](https://github.com/realm/realm-core/pull/6476)) -* Unknown protocol errors received from the baas server will no longer cause - the application to crash if a valid error action is also received. Unknown - error actions will be treated as an ApplicationBug error action and will - cause sync to fail with an error via the sync error handler. - ([Core #6885](https://github.com/realm/realm-core/pull/6885)) -* Some sync error messages now contain more information about what went wrong. - -### Fixed - -* The `MultipleSyncAgents` exception from opening a synchronized Realm in - multiple processes at once no longer leaves the sync client in an invalid - state. ([Core #6868](https://github.com/realm/realm-core/pull/6868), since v10.36.0) -* Testing the size of a collection of links against zero would sometimes fail - (sometimes = "difficult to explain"). In particular: - ([Core #6850](https://github.com/realm/realm-core/issues/6850), since v10.41.0) -* When async writes triggered a file compaction some internal state could be - corrupted, leading to later crashes in the slab allocator. This typically - resulted in the "ref + size <= next->first" assertion failure, but other - failures were possible. Many issues reported; see [Core #6340](https://github.com/realm/realm-core/issues/6340). - (since 10.35.0) -* `Realm.Configuration.maximumNumberOfActiveVersions` now handles intermediate - versions which have been cleaned up correctly and checks the number of live - versions rather than the number of versions between the oldest live version - and current version (since 10.35.0). -* If the client disconnected between uploading a change to flexible sync - subscriptions and receiving the new object data from the server resulting - from that subscription change, the next connection to the server would - sometimes result in a client reset - ([Core #6966](https://github.com/realm/realm-core/issues/6966), since v10.21.1). - -### Deprecations - -* `RLMApp` has `localAppName` and `localAppVersion` fields which never ended up - being used for anything and are now deprecated. -* `RLMSyncAuthError` has not been used since v10.0.0 and is now deprecated. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 7. - -### Internal - -* Upgraded realm-core from 13.17.1 to 13.20.1 - -10.42.1 Release notes (2023-08-28) -============================================================= - -### Fixed - -* The names of the prebuilt zips for SPM have changed to avoid having Carthage - download them instead of the intended Carthage zip - ([#8326](https://github.com/realm/realm-swift/issues/8326), since v10.42.0). -* The prebuild Realm.xcframework for SwiftPM now has all platforms other than - visionOS built with Xcode 14 to comply with app store rules - ([#8339](https://github.com/realm/realm-swift/issues/8339), since 10.42.0). -* Fix visionOS compilation with Xcode beta 7. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 7. - -10.42.0 Release notes (2023-07-30) -============================================================= - -### Enhancements - -* Add support for building for visionOS and add Xcode 15 binaries to the - release package. visionOS currently requires installing Realm via either - Swift Package Manager or by using a XCFramework as CocoaPods and Carthage do - not yet support it. -* Zips compatible with SPM's `.binaryTarget()` are now published as part of the - releases on Github. -* Prebuilt XCFrameworks are now built with LTO enabled. This has insignificant - performance benefits, but cuts the size of the library by ~15%. - -### Fixed - -* Fix nested properties observation on a `Projections` not notifying when there is a property change. - ([#8276](https://github.com/realm/realm-swift/issues/8276), since v10.34.0). -* Fix undefined symbol error for `UIKit` when linking Realm to a framework using SPM. - ([#8308](https://github.com/realm/realm-swift/issues/8308), since v10.41.0) -* If the app crashed at exactly the wrong time while opening a freshly - compacted Realm the file could be left in an invalid state - ([Core #6807](https://github.com/realm/realm-core/pull/6807), since v10.33.0). -* Sync progress for DOWNLOAD messages was sometimes stored incorrectly, - resulting in an extra round trip to the server. - ([Core #6827](https://github.com/realm/realm-core/issues/6827), since v10.31.0) - -### Breaking Changes - -* Legacy non-xcframework Carthage installations are no longer supported. Please - ensure you are using `--use-xcframeworks` if installing via Carthage. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 5. - -### Internal - -* Upgraded realm-core from 13.17.0 to 13.17.1 -* Release packages were being uploaded to several static.realm.io URLs which - are no longer linked to anywhere. These are no longer being updated, and - release packages are now only being uploaded to Github. - -10.41.1 Release notes (2023-07-17) -============================================================= - -### Enhancements - -* Filesystem errors now include more information in the error message. -* Sync connection and session reconnect timing/backoff logic has been reworked - and unified into a single implementation. Previously some categories of errors - would cause an hour-long wait before attempting to reconnect, while others - would use an exponential backoff strategy. All errors now result in the sync - client waiting for 1 second before retrying, doubling the wait after each - subsequent failure up to a maximum of five minutes. If the cause of the error - changes, the backoff will be reset. If the sync client voluntarily disconnects, - no backoff will be used. ([Core #6526]((https://github.com/realm/realm-core/pull/6526))) - -### Fixed - -* Removed warnings for deprecated APIs internal use. - ([#8251](https://github.com/realm/realm-swift/issues/8251), since v10.39.0) -* Fix an error during async open and client reset if properties have been added - to the schema. This fix also applies to partition-based to flexible sync - migration if async open is used. ([Core #6707](https://github.com/realm/realm-core/issues/6707), since v10.28.2) - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 4. - -### Internal - -* Upgraded realm-core from 13.15.1 to 13.17.0 -* The location where prebuilt core binaries are published has changed slightly. - If you are using `REALM_BASE_URL` to mirror the binaries, you may need to - adjust your mirroring logic. - -10.41.0 Release notes (2023-06-26) -============================================================= - -### Enhancements - -* Add support for multiplexing sync connections. When enabled (the default), a single - connection is used per sync user rather than one per synchronized Realm. This - reduces resource consumption when multiple Realms are opened and will - typically improve performance ([PR #8282](https://github.com/realm/realm-swift/pull/8282)). -* Sync timeout options can now be set on `RLMAppConfiguration` along with the - other app-wide configuration settings ([PR #8282](https://github.com/realm/realm-swift/pull/8282)). - -### Fixed - -* Import as `RLMRealm_Private.h` as a module would cause issues when using Realm as a subdependency. - ([#8164](https://github.com/realm/realm-swift/issues/8164), since 10.37.0) -* Disable setting a custom logger by default on the sync client when the sync manager is created. - This was overriding the default logger set using `RLMLogger.defaultLogger`. (since v10.39.0). - -### Breaking Changes - -* The `RLMSyncTimeouts.appConfiguration` property has been removed. This was an - unimplemented read-only property which did not make any sense on the - containing type ([PR #8282](https://github.com/realm/realm-swift/pull/8282)). - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 2. - -### Internal - -* Upgraded realm-core from 13.15.0 to 13.15.1 - -10.40.2 Release notes (2023-06-09) -============================================================= - -### Enhancements - -* `Actor.preconditionIsolated()` is now used for runtime actor checking when - available (i.e. building with Xcode 15 and running on iOS 17) rather than the - less reliable workaround. - -### Fixed - -* If downloading the fresh Realm file failed during a client reset on a - flexible sync Realm, the sync client would crash the next time the Realm was - opened. ([Core #6494](https://github.com/realm/realm-core/issues/6494), since v10.28.2) -* If the order of properties in the local class definitions did not match the - order in the server-side schema, the before-reset Realm argument passed to a - client reset handler would have an invalid schema and likely crash if any - data was read from it. ([Core #6693](https://github.com/realm/realm-core/issues/6693), since v10.40.0) - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 1. - -### Internal - -* Upgraded realm-core from 13.13.0 to 13.15.0. -* The prebuilt library used for CocoaPods installations is now built with Xcode - 14. This should not have any observable effects other than the download being - much smaller due to no longer including bitcode. - -10.40.1 Release notes (2023-06-06) -============================================================= - -### Enhancements - -* Fix compilation with Xcode 15. Note that iOS 12 is the minimum supported - deployment target when using Xcode 15. -* Switch to building the Carthage release with Xcode 14.3.1. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 1. - -### Internal - -* Overhauled SDK metrics collection to better drive future development efforts. - -10.40.0 Release notes (2023-05-26) -============================================================= - -Drop support for Xcode 13 and add Xcode 14.3.1. Xcode 14.1 is now the minimum -supported version. - -### Enhancements - -* Adjust the error message for private `Object` subclasses and subclasses - nested inside other types to explain how to make them work rather than state - that it's impossible. ([#5662](https://github.com/realm/realm-cocoa/issues/5662)). -* Improve performance of SectionedResults. With a single section it is now ~10% - faster, and the runtime of sectioning no longer scales significantly with - section count, giving >100% speedups when there are large numbers of sections - ([Core #6606](https://github.com/realm/realm-core/pull/6606)). -* Very slightly improve performance of runtime thread checking on the main - thread. ([Core #6606](https://github.com/realm/realm-core/pull/6606)) - -### Fixed - -* Allow support for implicit boolean queries on Swift's Type Safe Queries API - ([#8212](https://github.com/realm/realm-swift/issues/8212)). -* Fixed a fatal error (reported to the sync error handler) during client reset - or automatic partition-based to flexible sync migration if the reset has been - triggered during an async open and the schema being applied has added new - classes. Due to this bug automatic flexibly sync migration has been disabled - for older releases and this is now the minimum version required. - ([#6601](https://github.com/realm/realm-core/issues/6601), since automatic - client resets were introduced in v10.25.0) -* Dictionaries sometimes failed to map unresolved links to nil. If the target - of a link in a dictionary was deleted by another sync client, reading that - field from the dictionary would sometimes give an invalid object rather than - nil. In addition, queries on dictionaries would sometimes have incorrect - results. ([Core #6644](https://github.com/realm/realm-core/pull/6644), since v10.8.0) -* Older versions of Realm would sometimes fail to properly mark objects as - being the target of an incoming link from another object. When this happened, - deleting the target object would hit an assertion failure due to the - inconsistent state. We now reconstruct a valid state rather than crashing. - ([Core #6585](https://github.com/realm/realm-core/issues/6585), since v5.0.0) -* Fix several UBSan failures which did not appear to result in functional bugs - ([Core #6649](https://github.com/realm/realm-core/pull/6649)). -* Using both synchronous and asynchronous transactions on the same thread or - scheduler could hit the assertion failure "!realm.is_in_transaction()" if one - of the callbacks for an asynchronous transaction happened to be scheduled - during a synchronous transaction - ([Core #6659](https://github.com/realm/realm-core/issues/6659), since v10.26.0) -* The stored deployment location for Apps was not being updated correctly after - receiving a redirect response from the server, resulting in every connection - attempting to connect to the old URL and getting redirected rather than only - the first connection after the deployment location changed. - ([Core #6630](https://github.com/realm/realm-core/issues/6630), since v10.38.2) - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-14.3.1. - -### Internal - -* Upgraded realm-core from 13.10.1 to 13.13.0. - -10.39.1 Release notes (2023-05-05) -============================================================= - -### Enhancements - -* New notifiers can now be registered in write transactions until changes have - actually been made in the write transaction. This makes it so that new - notifications can be registered inside change notifications triggered by - beginning a write transaction (unless a previous callback performed writes). - ([#4818](https://github.com/realm/realm-swift/issues/4818)). -* Reduce the memory footprint of an automatic (discard or recover) client reset - when there are large incoming changes from the server. - ([Core #6567](https://github.com/realm/realm-core/issues/6567)). - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from 13.10.0 to 13.10.1. - -10.39.0 Release notes (2023-05-03) -============================================================= - -### Enhancements - -* Add support for actor-isolated Realms, opened with `try await Realm(actor: actor)`. - - Rather than being confined to the current thread or a dispatch queue, - actor-isolated Realms are isolated to an actor. This means that they can be - used from any thread as long as it's within a function isolated to that - actor, and they remain valid over suspension points where a task may hop - between threads. Actor-isolated Realms can be used with either global or - local actors: - - ```swift - @MainActor function mainThreadFunction() async throws { - // These are identical: the async init continues to produce a - // MainActor-confined Realm if no actor is supplied - let realm1 = try await Realm() - let realm2 = try await Realm(MainActor.shared) - } - - // A simple example of a custom global actor - @globalActor actor BackgroundActor: GlobalActor { - static var shared = BackgroundActor() - } - - @BackgroundActor backgroundThreadFunction() async throws { - // Explicitly specifying the actor is required for everything but MainActor - let realm = try await Realm(actor: BackgroundActor.shared) - try await realm.write { - _ = realm.create(MyObject.self) - } - // Thread-confined Realms would sometimes throw an exception here, as we - // may end up on a different thread after an `await` - print("\(realm.objects(MyObject.self).count)") - } - - actor MyActor { - // An implicitly-unwrapped optional is used here to let us pass `self` to - // `Realm(actor:)` within `init` - var realm: Realm! - init() async throws { - realm = try await Realm(actor: self) - } - - var count: Int { - realm.objects(MyObject.self).count - } - - func create() async throws { - try await realm.asyncWrite { - realm.create(MyObject.self) - } - } - } - - // This function isn't isolated to the actor, so each operation has to be async - func createObjects() async throws { - let actor = try await MyActor() - for _ in 0..<5 { - await actor.create() - } - print("\(await actor.count)") - } - - // In an isolated function, an actor-isolated Realm can be used synchronously - func createObjects(in actor: isolated MyActor) async throws { - await actor.realm.write { - actor.realm.create(MyObject.self) - } - print("\(actor.realm.objects(MyObject.self).count)") - } - ``` - - Actor-isolated Realms come with a more convenient syntax for asynchronous - writes. `try await realm.write { ... }` will suspend the current task, - acquire the write lock without blocking the current thread, and then invoke - the block. The actual data is then written to disk on a background thread, - and the task is resumed once that completes. As this does not block the - calling thread while waiting to write and does not perform i/o on the calling - thread, this will often be safe to use from `@MainActor` functions without - blocking the UI. Sufficiently large writes may still benefit from being done - on a background thread. - - Asynchronous writes are only supported for actor-isolated Realms or in - `@MainActor` functions. - - Actor-isolated Realms require Swift 5.8 (Xcode 14.3). Enabling both strict - concurrency checking (`SWIFT_STRICT_CONCURRENCY=complete` in Xcode) and - runtime actor data race detection (`OTHER_SWIFT_FLAGS=-Xfrontend - -enable-actor-data-race-checks`) is strongly recommended when using - actor-isolated Realms. -* Add support for automatic partition-based to flexible sync migration. - Connecting to a server-side app configured to use flexible sync with a - client-side partition-based sync configuration is now supported, and will - automatically create the appropriate flexible sync subscriptions to subscribe - to the requested partition. This allows changing the configuration on the - server from partition-based to flexible without breaking existing clients. - ([Core #6554](https://github.com/realm/realm-core/issues/6554)) -* Now you can use an array `[["_id": 1], ["breed": 0]]` as sorting option for a - MongoCollection. This new API fixes the issue where the resulting documents - when using more than one sort parameter were not consistent between calls. - ([#7188](https://github.com/realm/realm-swift/issues/7188), since v10.0.0). -* Add support for adding a user created default logger, which allows implementing your own logging logic - and the log threshold level. - You can define your own logger creating an instance of `Logger` and define the log function which will be - invoked whenever there is a log message. - - ```swift - let logger = Logger(level: .all) { level, message in - print("Realm Log - \(level): \(message)") - } - ``` - - Set this custom logger as Realm default logger using `Logger.shared`. - ```swift - Logger.shared = logger - ``` -* It is now possible to change the default log threshold level at any point of the application's lifetime. - ```swift - Logger.shared.logLevel = .debug - ``` - This will override the log level set anytime before by a user created logger. -* We have set `.info` as the default log threshold level for Realm. You will now see some - log message in your console. To disable use `Logger.shared.level = .off`. - -### Fixed - -* Several schema initialization functions had incorrect `@MainActor` - annotations, resulting in runtime warnings if the first time a Realm was - opened was on a background thread - ([#8222](https://github.com/realm/realm-swift/issues/8222), since v10.34.0). - -### Deprecations - -* `App.SyncManager.logLevel` and `App.SyncManager.logFunction` are deprecated in favour of - setting a default logger. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from v13.9.4 to v13.10.0. - -10.38.3 Release notes (2023-04-28) -============================================================= - -### Enhancements - -* Improve performance of cancelling a write transactions after making changes. - If no KVO observers are used this is now constant time rather than taking - time proportional to the number of changes to be rolled back. Cancelling a - write transaction with KVO observers is 10-20% faster. ([Core PR #6513](https://github.com/realm/realm-core/pull/6513)). - -### Fixed - -* Performing a large number of queries without ever performing a write resulted - in steadily increasing memory usage, some of which was never fully freed due - to an unbounded cache ([#7978](https://github.com/realm/realm-swift/issues/7978), since v10.27.0). - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from 13.9.3 to 13.9.4 - -10.38.2 Release notes (2023-04-25) -============================================================= - -### Enhancements - -* Improve performance of equality queries on a non-indexed AnyRealmValue - property by about 30%. ([Core #6506](https://github.com/realm/realm-core/issues/6506)) - -### Fixed - -* SSL handshake errors were treated as fatal errors rather than errors which - should be retried. ([Core #6434](https://github.com/realm/realm-core/issues/6434), since v10.35.0) - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from 13.9.0 to 13.9.3. - -10.38.1 Release notes (2023-04-25) -============================================================= - -### Fixed - -* The error handler set on EventsConfiguration was not actually used (since v10.26.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -10.38.0 Release notes (2023-03-31) -============================================================= - -Switch to building the Carthage release with Xcode 14.3. - -### Enhancements - -* Add Xcode 14.3 binaries to the release package. Note that CocoaPods 1.12.0 - does not support Xcode 14.3. -* Add support for sharing encrypted Realms between multiple processes. - ([Core #1845](https://github.com/realm/realm-core/issues/1845)) - -### Fixed - -* Fix a memory leak reported by Instruments on `URL.path` in - `Realm.Configuration.fileURL` when using a string partition key in Partition - Based Sync ([#8195](https://github.com/realm/realm-swift/pull/8195)), since v10.0.0). -* Fix a data race in version management. If one thread committed a write - transaction which increased the number of live versions above the previous - highest seen during the current session at the same time as another thread - began a read, the reading thread could read from a no-longer-valid memory - mapping. This could potentially result in strange crashes when opening, - refreshing, freezing or thawing a Realm - ([Core #6411](https://github.com/realm/realm-core/pull/6411), since v10.35.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from 13.8.0 to 13.9.0. - -10.37.2 Release notes (2023-03-29) -============================================================= - -### Fixed - -* Copying a `RLMRealmConfiguration` failed to copy several fields. This - resulted in migrations being passed the incorrect object type in Swift when - using the default configuration (since v10.34.0) or async open (since - v10.37.0). This also broke using the Events API in those two scenarios (since - v10.26.0 for default configuration and v10.37.0 for async open). ([#8190](https://github.com/realm/realm-swift/issues/8190)) - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -10.37.1 Release notes (2023-03-27) -============================================================= - -### Enhancements - -* Performance improvement for the following queries ([Core #6376](https://github.com/realm/realm-core/issues/6376)): - * Significant (~75%) improvement when counting (`Results.count`) the number - of exact matches (with no other query conditions) on a - string/int/UUID/ObjectID property that has an index. This improvement - will be especially noticiable if there are a large number of results - returned (duplicate values). - * Significant (~99%) improvement when querying for an exact match on a Date - property that has an index. - * Significant (~99%) improvement when querying for a case insensitive match - on an AnyRealmValue property that has an index. - * Moderate (~25%) improvement when querying for an exact match on a Bool - property that has an index. - * Small (~5%) improvement when querying for a case insensitive match on an - AnyRealmValue property that does not have an index. - -### Fixed - -* Add missing `@Sendable` annotations to several sync and app services related - callbacks ([PR #8169](https://github.com/realm/realm-swift/pull/8169), since v10.34.0). -* Fix some bugs in handling task cancellation for async Realm init. Some very - specific timing windows could cause crashes, and the download would not be - cancelled if the Realm was already open ([PR #8178](https://github.com/realm/realm-swift/pull/8178), since v10.37.0). -* Fix a crash when querying an AnyRealmValue property with a string operator - (contains/like/beginswith/endswith) or with case insensitivity. - ([Core #6376](https://github.com/realm/realm-core/issues/6376), since v10.8.0) -* Querying for case-sensitive equality of a string on an indexed AnyRealmValue - property was returning case insensitive matches. For example querying for - `myIndexedAny == "Foo"` would incorrectly match on values of "foo" or "FOO" etc. - ([Core #6376](https://github.com/realm/realm-core/issues/6376), since v10.8.0) -* Adding an index to an AnyRealmValue property when objects of that type - already existed would crash with an assertion. - ([Core #6376](https://github.com/realm/realm-core/issues/6376), since v10.8.0). -* Fix a bug that may have resulted in arrays being in different orders on - different devices. Some cases of “Invalid prior_size” may be fixed too. - ([Core #6191](https://github.com/realm/realm-core/issues/6191), since v10.25.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -### Internal - -* Upgraded realm-core from 13.6.0 to 13.8.0 - -10.37.0 Release notes (2023-03-09) -============================================================= - -### Enhancements - -* `MongoCollection.watch().subscribe(on:)` now supports any swift Scheduler - rather than only dispatch queues ([PR #8131](https://github.com/realm/realm-swift/pull/8130)). -* Add an async sequence wrapper for `MongoCollection.watch()`, allowing you to - do `for try await change in collection.changeEvents { ... }` - ([PR #8131](https://github.com/realm/realm-swift/pull/8130)). -* The internals of error handling and reporting have been significantly - reworked. The visible effects of this are that some errors which previously - had unhelpful error messages now include more detail about what went wrong, - and App errors now expose a much more complete set of error codes - ([PR #8002](https://github.com/realm/realm-swift/pull/8002)). -* Expose compensating write error information. When the server rejects a - modification made by the client (such as if the user does not have the - required permissions), a `SyncError` is delivered to the sync error handler - with the code `.writeRejected` and a non-nil `compensatingWriteInfo` field - which contains information about what was rejected and why. This information - is intended primarily for debugging and logging purposes and may not have a - stable format. ([PR #8002](https://github.com/realm/realm-swift/pull/8002)) -* Async `Realm.init()` now handles Task cancellation and will cancel the async - open if the Task is cancelled ([PR #8148](https://github.com/realm/realm-swift/pull/8148)). -* Cancelling async opens now has more consistent behavior. The previously - intended and documented behavior was that cancelling an async open would - result in the callback associated with the specific task that was cancelled - never being called, and all other pending callbacks would be invoked with an - ECANCELED error. This never actually worked correctly, and the callback which - was not supposed to be invoked at all sometimes would be. We now - unconditionally invoke all of the exactly once, passing ECANCELED to all of - them ([PR #8148](https://github.com/realm/realm-swift/pull/8148)). - -### Fixed - -* `UserPublisher` incorrectly bounced all notifications to the main thread instead - of setting up the Combine publisher to correctly receive on the main thread. - ([#8132](https://github.com/realm/realm-swift/issues/8132), since 10.21.0) -* Fix warnings when building with Xcode 14.3 beta 2. -* Errors in async open resulting from invalid queries in `initialSubscriptions` - would result in the callback being invoked with both a non-nil Realm and a - non-nil Error even though the Realm was in an invalid state. Now only the - error is passed to the callback ([PR #8148](https://github.com/realm/realm-swift/pull/8148), since v10.28.0). -* Converting a local realm to a synced realm would crash if an embedded object - was null ([Core #6294](https://github.com/realm/realm-core/issues/6294), since v10.22.0). -* Subqueries on indexed properties performed extremely poorly. ([Core #6327](https://github.com/realm/realm-core/issues/6327), since v5.0.0) -* Fix a crash when a SSL read successfully read a non-zero number of bytes and - also reported an error. ([Core #5435](https://github.com/realm/realm-core/issues/5435), since 10.0.0) -* The sync client could get stuck in an infinite loop if the server sent an - invalid changeset which caused a transform error. This now results in a - client reset instead. ([Core #6051](https://github.com/realm/realm-core/issues/6051), since v10.0.0) -* Strings in queries which contained any characters which required multiple - bytes when encoded as utf-8 were incorrectly encoded as binary data when - serializing the query to send it to the server for a flexible sync - subscription, resulting the server rejecting the query - ([Core #6350](https://github.com/realm/realm-core/issues/6350), since 10.22.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -### Internal - -* Upgraded realm-core from 13.4.1 to 13.6.0 - -10.36.0 Release notes (2023-02-15) -============================================================= - -### Enhancements - -* Add support for multiple overlapping or nested event scopes. - `Events.beginScope()` now returns a `Scope` object which is used to commit or - cancel that scope, and if more than one scope is active at a time events are - reported to all active scopes. - -### Fixed - -* Fix moving `List` items to a higher index in SwiftUI results in wrong destination index - ([#7956](https://github.com/realm/realm-swift/issues/7956), since v10.6.0). -* Using the `searchable` view modifier with `@ObservedResults` in iOS 16 would - cause the collection observation subscription to cancel. - ([#8096](https://github.com/realm/realm-swift/issues/8096), since 10.21.0) -* Client reset with recovery would sometimes crash if the recovery resurrected - a dangling link ([Core #6292](https://github.com/realm/realm-core/issues/6292), since v10.32.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -### Internal - -* Upgraded realm-core from 13.4.0 to 13.4.1 - -10.35.1 Release notes (2023-02-10) -============================================================= - -### Fixed - -* Client reset with recovery would crash if a client reset occurred the very - first time the Realm was opened with async open. The client reset callbacks - are now not called if the Realm had never been opened before - ([PR #8125](https://github.com/realm/realm-swift/pull/8125), since 10.32.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -10.35.0 Release notes (2023-02-07) -============================================================= - -This version bumps the Realm file format version to 23. Realm files written by -this version cannot be read by older versions of Realm. - -### Enhancements - -* The Realm file is now automatically shrunk if the file size is larger than - needed to store all of the data. ([Core PR #5755](https://github.com/realm/realm-core/pull/5755)) -* Pinning old versions (either with frozen Realms or with Realms on background - threads that simply don't get refreshed) now only prevents overwriting the - data needed by that version, rather than the data needed by that version and - all later versions. In addition, frozen Realms no longer pin the transaction - logs used to drive change notifications. This mostly eliminates the file size - growth caused by pinning versions. ([Core PR #5440](https://github.com/realm/realm-core/pull/5440)) -* Rework how Dictionaries/Maps are stored in the Realm file. The new design uses - less space and is typically significantly faster. This changes the iteration - order of Maps, so any code relying on that may be broken. We continue - to make no guarantees about iteration order on Maps ([Core #5764](https://github.com/realm/realm-core/issues/5764)). -* Improve performance of freezing Realms ([Core PR #6211](https://github.com/realm/realm-core/pull/6211)). - -### Fixed - -* Fix a crash when using client reset with recovery and flexible sync with a - single subscription ([Core #6070](https://github.com/realm/realm-core/issues/6070), since v10.28.2) -* Encrypted Realm files could not be opened on devices with a larger page size - than the one which originally wrote the file. - ([#8030](https://github.com/realm/realm-swift/issues/8030), since v10.32.1) -* Creating multiple flexible sync subscriptions at once could hit an assertion - failure if the server reported an error for any of them other than the last - one ([Core #6038](https://github.com/realm/realm-core/issues/6038), since v10.21.1). -* `Set` and `List` considered a string and binary - data containing that string encoded as UTF-8 to be equivalent. This could - result in a List entry not changing type on assignment and for the client be - inconsistent with the server if a string and some binary data with equivalent - content was inserted from Atlas. - ([Core #4860](https://github.com/realm/realm-core/issues/4860) and - [Core #6201](https://github.com/realm/realm-core/issues/6201), since v10.8.0) -* Querying for NaN on Decimal128 properties did not match any objects - ([Core #6182](https://github.com/realm/realm-core/issues/6182), since v10.8.0). -* When client reset with recovery is used and the recovery did not need to - make any changes to the local Realm, the sync client could incorrectly think - the recovery failed and report the error "A fatal error occured during client - reset: 'A previous 'Recovery' mode reset from did not succeed, - giving up on 'Recovery' mode to prevent a cycle'". - ([Core #6195](https://github.com/realm/realm-core/issues/6195), since v10.32.0) -* Fix a crash when using client reset with recovery and flexible sync with a - single subscription ([Core #6070](https://github.com/realm/realm-core/issues/6070), since v10.28.2) -* Writing to newly in-view objects while a flexible sync bootstrap was in - progress would not synchronize those changes to the server - ([Core #5804](https://github.com/realm/realm-core/issues/5804), since v10.21.1). -* If a client reset with recovery or discard local was interrupted while the - "fresh" realm was being downloaded, the sync client could crash with a - MultpleSyncAgents exception ([Core #6217](https://github.com/realm/realm-core/issues/6217), since v10.25.0). -* Sharing Realm files between a Catalyst app and Realm Studio did not properly - synchronize access to the Realm file ([Core #6258](https://github.com/realm/realm-core/pull/6258), since v10.0.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -### Internal - -* Upgraded realm-core from 12.13.0 to 13.4.0 - -10.34.1 Release notes (2023-01-20) -============================================================= - -### Fixed - -* Add some missing `@preconcurrency` annotations which lead to build failures - with Xcode 14.0 when importing via SPM or CocoaPods - ([#8104](https://github.com/realm/realm-swift/issues/8104), since v10.34.0). - -### Compatibility - -* Realm Studio: 11.0.0 - 12.0.0. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -10.34.0 Release notes (2023-01-13) -============================================================= - -Swift 5.5 is no longer supported. Swift 5.6 (Xcode 13.3) is now the minimum -supported version. - -The prebuilt binary for Carthage is now build with Xcode 14.2. - -### Enhancements - -* Improve performance of creating Projection objects and of change - notifications on projections ([PR #8050](https://github.com/realm/realm-swift/pull/8050)). -* Allow initialising any sync configuration with `cancelAsyncOpenOnNonFatalErrors`. -* Improve performance of Combine value publishers which do not use the - object/collection changesets a little. -* All public types have been audited for sendability and are now marked as - Sendable when applicable. A few types which were incidentally not thread-safe - but make sense to use from multiple threads are now thread-safe. -* Add support for building Realm with strict concurrency checking enabled. - -### Fixed - -* Fix bad memory access exception that can occur when watching change streams. - [PR #8039](https://github.com/realm/realm-swift/pull/8039). -* Object change notifications on projections only included the first projected - property for each source property ([PR #8050](https://github.com/realm/realm-swift/pull/8050), since v10.21.0). -* `@AutoOpen` failed to open flexible sync Realms while offline - ([#7986](https://github.com/realm/realm-swift/issues/7986), since v10.27.0). -* Fix "Publishing changes from within view updates is not allowed" warnings - when using `@ObservedResults` or `@ObservedSectionedResults` - ([#7908](https://github.com/realm/realm-swift/issues/7908)). -* Fix "Publishing changes from within view updates is not allowed" warnings - when using `@AutoOpen` or `@AsyncOpen`. - ([#7908](https://github.com/realm/realm-swift/issues/7908)). -* Defer `Realm.asyncOpen` execution on `@AsyncOpen` and `@AutoOpen` property - wrappers until all the environment values are set. This will guarantee the - configuration and partition value are set set before opening the realm. - ([#7931](https://github.com/realm/realm-swift/issues/7931), since v10.12.0). -* `@ObservedResults.remove()` could delete the wrong object if a write on a - background thread which changed the index of the object being removed - occurred at a very specific time (since v10.6.0). - -### Compatibility - -* Realm Studio: 11.0.0 - 12.0.0. 13.0.0 is currently incompatible. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -10.33.0 Release notes (2022-12-01) -============================================================= - -### Enhancements - -* Flexible sync subscription state will change to - `SyncSubscriptionState.pending` (`RLMSyncSubscriptionStatePending`) while - waiting for the server to have sent all pending history after a bootstrap and - before marking a subscription as Complete. - ([#5795](https://github.com/realm/realm-core/pull/5795)) -* Add custom column names API, which allows to set a different column name in the realm - from the one used in your object declaration. - ```swift - class Person: Object { - @Persisted var firstName: String - @Persisted var birthDate: Date - @Persisted var age: Int - - override class public func propertiesMapping() -> [String: String] { - ["firstName": "first_name", - "birthDate": "birth_date"] - } - } - ``` - This is very helpful in cases where you want to name a property differently - from your `Device Sync` JSON schema. - This API is only available for old and modern object declaration syntax on the - `RealmSwift` SDK. -* Flexible sync bootstraps now apply 1MB of changesets per write transaction - rather than applying all of them in a single write transaction. - ([Core PR #5999](https://github.com/realm/realm-core/pull/5999)). - -### Fixed - -* Fix a race condition which could result in "operation cancelled" errors being - delivered to async open callbacks rather than the actual sync error which - caused things to fail ([Core PR #5968](https://github.com/realm/realm-core/pull/5968), since the introduction of async open). -* Fix database corruption issues which could happen if an application was - terminated at a certain point in the process of comitting a write - transaciton. ([Core PR #5993](https://github.com/realm/realm-core/pull/5993), since v10.21.1) -* `@AsyncOpen` and `@AutoOpen` would begin and then cancel a second async open - operation ([PR #8038](https://github.com/realm/realm-swift/pull/8038), since v10.12.0). -* Changing the search text when using the searchable SwiftUI extension would - trigger multiple updates on the View for each change - ([PR #8038](https://github.com/realm/realm-swift/pull/8038), since v10.19.0). -* Changing the filter or search properties of an `@ObservedResults` or - `@ObservedSectionedResults` would trigger up to three updates on the View - ([PR #8038](https://github.com/realm/realm-swift/pull/8038), since v10.6.0). -* Fetching a user's profile while the user logs out would result in an - assertion failure. ([Core PR #6017](https://github.com/realm/realm-core/issues/5571), since v10.8.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -### Internal - -* Upgraded realm-core from 12.11.0 to 12.13.0 - -10.32.3 Release notes (2022-11-10) -============================================================= - -### Fixed - -* Fix name lookup errors when importing Realm Swift built in library evolution - mode (([#8014](https://github.com/realm/realm-swift/issues/8014)). -* The prebuilt watchOS library in the objective-c release package was missing - an arm64 slice. The Swift release package was uneffected - ([PR #8016](https://github.com/realm/realm-swift/pull/8016)). -* Fix issue where `RLMUserAPIKey.key`/`UserAPIKey.key` incorrectly returned the name of the API - key instead of the key itself. ([#8021](https://github.com/realm/realm-swift/issues/8021), since v10.0.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -10.32.2 Release notes (2022-11-01) -============================================================= - -Switch to building the Carthage release with Xcode 14.1. - -### Fixed - -* Fix linker errors when building a release build with Xcode 14.1 when - installing via SPM ([#7995](https://github.com/realm/realm-swift/issues/7995)). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -10.32.1 Release notes (2022-10-25) -============================================================= - -### Enhancements - -* Improve performance of client reset with automatic recovery and converting - top-level tables into embedded tables ([Core #5897](https://github.com/realm/realm-core/pull/5897)). -* `Realm.Error` is now a typealias for `RLMError` rather than a - manually-defined version of what the automatic bridging produces. This should - have no effect on existing working code, but the manual definition was - missing a few things supplied by the automatic bridging. -* Some sync errors sent by the server include a link to the server-side logs - associated with that error. This link is now exposed in the `serverLogURL` - property on `SyncError` (or `RLMServerLogURLKey` userInfo field when using NSError). - -### Fixed - -* Many sync and app errors were reported using undocumented internal error - codes and/or domains and could not be progammatically handled. Some notable - things which now have public error codes instead of unstable internal ones: - - `Realm.Error.subscriptionFailed`: The server rejected a flexible sync subscription. - - `AppError.invalidPassword`: A login attempt failed due to a bad password. - - `AppError.accountNameInUse`: A registration attempt failed due to the account name being in use. - - `AppError.httpRequestFailed`: A HTTP request to Atlas App Services - completed with an error HTTP code. The failing code is available in the - `httpStatusCode` property. - - Many other less common error codes have been added to `AppError`. - - All sync errors other than `SyncError.clientResetError` reported incorrect - error codes. - (since v10.0.0). -* `UserAPIKey.objectId` was incorrectly bridged to Swift as `RLMObjectId` to - `ObjectId`. This may produce warnings about an unneccesary cast if you were - previously casting it to the correct type (since v10.0.0). -* Fixed an assertion failure when observing change notifications on a sectioned - result, if the first modification was to a linked property that did not cause - the state of the sections to change. - ([Core #5912](https://github.com/realm/realm-core/issues/5912), - since the introduction of sectioned results in v10.29.0) -* Fix a use-after-free if the last external reference to an encrypted - synchronized Realm was closed between when a client reset error was received - and when the download of the new Realm began. - ([Core #5949](https://github.com/realm/realm-core/pull/5949), since 10.28.4). -* Fix an assertion failure during client reset with recovery when recovering - a list operation on an embedded object that has a link column in the path - prefix to the list from the top level object. - ([Core #5957](https://github.com/realm/realm-core/issues/5957), - since introduction of automatic recovery in v10.32.0). -* Creating a write transaction which is rejected by the server due to it - exceeding the maximum transaction size now results in a client reset error - instead of synchronization breaking and becoming stuck forever - ([Core #5209](https://github.com/realm/realm-core/issues/5209), since v10). -* Opening an unencrypted file with an encryption key would sometimes report a - misleading error message that indicated that the problem was something other - than a decryption failure ([Core #5915](https://github.com/realm/realm-core/pull/5915), since 0.89.0). -* Fix a rare deadlock which could occur when closing a synchronized Realm - immediately after committing a write transaction when the sync worker thread - has also just finished processing a changeset from the server - ([Core #5948](https://github.com/realm/realm-core/pull/5948)). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.0.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -### Internal - -* Upgraded realm-core from 12.9.0 to 12.11.0. - -10.32.0 Release notes (2022-10-10) -============================================================= - -### Enhancements - -* Add `.recoverUnsyncedChanges` (`RLMClientResetModeRecoverUnsyncedChanges`) and -`.recoverOrDiscardUnsyncedChanges` (`RLMClientResetModeRecoverOrDiscardUnsyncedChanges`) behaviors to `ClientResetMode` (`RLMClientResetMode`). - - The newly added recover modes function by downloading a realm which reflects the latest - state of the server after a client reset. A recovery process is run locally in an - attempt to integrate the server state with any local changes from before the - client reset occurred. - The changes are integrated with the following rules: - 1. Objects created locally that were not synced before client reset, will be integrated. - 2. If an object has been deleted on the server, but was modified on the client, the delete takes precedence and the update is discarded. - 3. If an object was deleted on the client, but not the server, then the client delete instruction is applied. - 4. In the case of conflicting updates to the same field, the client update is applied. - - The client reset process will fallback to `ClientResetMode.discardUnsyncedChanges` if the recovery process fails in `.recoverOrDiscardUnsyncedChanges`. - - The client reset process will fallback to `ClientResetMode.manual` if the recovery process fails in `.recoverUnsyncedChanges`. - - The two new swift recovery modes support client reset callbacks: `.recoverUnsyncedChanges(beforeReset: ((Realm) -> Void)? = nil, afterReset: ((Realm, Realm) -> Void)? = nil)`. - - The two new Obj-C recovery modes support client reset callbacks in `notifyBeforeReset` - and `notifyAfterReset`for both `[RLMUser configurationWithPartitionValue]` and `[RLMUser flexibleSyncConfigurationWithClientResetMode]` - For more detail on client reset callbacks, see `ClientResetMode`, `RLMClientResetBeforeBlock`, - `RLMClientResetAfterBlock`, and the 10.25.0 changelog entry. -* Add two new additional interfaces to define a manual client reset handler: - - Add a manual callback handler to `ClientResetMode.manual` -> `ClientResetMode.manual(ErrorReportingBlock? = nil)`. - - Add the `RLMSyncConfiguration.manualClientResetHandler` property (type `RLMSyncErrorReportingBlock`). - - These error reporting blocks are invoked in the event of a `RLMSyncErrorClientResetError`. - - See `ErrorReportingBlock` (`RLMSyncErrorReportingBlock`), and `ClientResetInfo` for more detail. - - Previously, manual client resets were handled only through the `SyncManager.ErrorHandler`. You have the - option, but not the requirement, to define manual reset handler in these interfaces. - Otherwise, the `SyncManager.ErrorHandler` is still invoked during the manual client reset process. - - These new interfaces are only invoked during a `RLMSyncErrorClientResetError`. All other sync errors - are still handled in the `SyncManager.ErrorHandler`. - - See 'Breaking Changes' for information how these interfaces interact with an already existing - `SyncManager.ErrorHandler`. - -### Breaking Changes - -* The default `clientResetMode` (`RLMClientResetMode`) is switched from `.manual` (`RLMClientResetModeManual`) - to `.recoverUnsyncedChanges` (`RLMClientResetModeRecoverUnsyncedChanges`). - - If you are currently using `.manual` and continue to do so, the only change - you must explicitly make is designating manual mode in - your `Realm.Configuration.SyncConfiguration`s, since they will now default to `.recoverUnsyncedChanges`. - - You may choose to define your manual client reset handler in the newly - introduced `manual(ErrorReportingBlock? = nil)` - or `RLMSyncConfiguration.manualClientResetHandler`, but this is not required. - The `SyncManager.errorHandler` will still be invoked during a client reset if - no callback is passed into these new interfaces. - -### Deprecations - -* `ClientResetMode.discardLocal` is deprecated in favor of `ClientResetMode.discardUnsyncedChanges`. - The reasoning is that the name better reflects the effect of this reset mode. There is no actual - difference in behavior. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.0.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -10.31.0 Release notes (2022-10-05) -============================================================= - -The prebuilt binary for Carthage is now build with Xcode 14.0.1. - -### Enhancements - -* Cut the runtime of aggregate operations on large dictionaries in half - ([Core #5864](https://github.com/realm/realm-core/pull/5864)). -* Improve performance of aggregate operations on collections of objects by 2x - to 10x ([Core #5864](https://github.com/realm/realm-core/pull/5864)). - Greatly improve the performance of sorting or distincting a Dictionary's keys - or values. The most expensive operation is now performed O(log N) rather than - O(N log N) times, and large Dictionaries can see upwards of 99% reduction in - time to sort. ([Core #5166](https://github.com/realm/realm-core/pulls/5166)) -* Add support for changing the deployment location for Atlas Apps. Previously - this was assumed to be immutable ([Core #5648](https://github.com/realm/realm-core/issues/5648)). -* The sync client will now yield the write lock to other threads which are - waiting to perform a write transaction even if it still has remaining work to - do, rather than always applying all changesets received from the server even - when other threads are trying to write. ([Core #5844](https://github.com/realm/realm-core/pull/5844)). -* The sync client no longer writes an unused temporary copy of the changesets - received from the server to the Realm file ([Core #5844](https://github.com/realm/realm-core/pull/5844)). - -### Fixed - -* Setting a `List` property with `Results` no longer throws an unrecognized - selector exception (since 10.8.0-beta.2) -* `RLMProgressNotificationToken` and `ProgressNotificationToken` now hold a - strong reference to the sync session, keeping it alive until the token is - deallocated or invalidated, as the other notification tokens do. - ([#7831](https://github.com/realm/realm-swift/issues/7831), since v2.3.0). -* Results permitted some nonsensical aggregate operations on column types which - do not make sense to aggregate, giving garbage results rather than reporting - an error ([Core #5876](https://github.com/realm/realm-core/pull/5876), since v5.0.0). -* Upserting a document in a Mongo collection would crash if the document's id - type was anything other than ObjectId (since v10.0.0). -* Fix a use-after-free when a sync session is closed and the app is destroyed - at the same time ([Core #5752](https://github.com/realm/realm-core/issues/5752), - since v10.19.0). - -### Deprecations - -* `RLMUpdateResult.objectId` has been deprecated in favor of - `RLMUpdateResult.documentId` to support reporting document ids which are not - object ids. -### Breaking Changes -* Private API `_realmColumnNames` has been renamed to a new public API - called `propertiesMapping()`. This change only affects the Swift API - and doesn't have any effects in the obj-c API. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.0.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -### Internal - -* Upgraded realm-core from 12.7.0 to 12.9.0 - -10.30.0 Release notes (2022-09-20) -============================================================= - -### Fixed - -* Incoming links from `RealmAny` properties were not handled correctly when - migrating an object type from top-level to embedded. `RealmAny` properties - currently cannot link to embedded objects. - ([Core #5796](https://github.com/realm/realm-core/pull/5796), since 10.8.0). -* `Realm.refresh()` sometimes did not actually advance to the latest version. - It attempted to be semi-non-blocking in a very confusing way which resulted - in it sometimes advancing to a newer version that is not the latest version, - and sometimes blocking until notifiers are ready so that it could advance to - the latest version. This behavior was undocumented and didn't work correctly, - so it now always blocks if needed to advance to the latest version. - ([#7625](https://github.com/realm/realm-swift/issues/7625), since v0.98.0). -* Fix the most common cause of thread priority inversions when performing - writes on the main thread. If beginning the write transaction has to wait for - the background notification calculations to complete, that wait is now done - in a QoS-aware way. ([#7902](https://github.com/realm/realm-swift/issues/7902)) -* Subscribing to link properties in a flexible sync Realm did not work due to a - mismatch between what the client sent and what the server needed. - ([Core #5409](https://github.com/realm/realm-core/issues/5409)) -* Attempting to use `AsymmetricObject` with partition-based sync now reports a - sensible error much earlier in the process. Asymmetric sync requires using - flexible sync. ([Core #5691](https://github.com/realm/realm-core/issues/5691), since 10.29.0). -* Case-insensitive but diacritic-sensitive queries would crash on 4-byte UTF-8 - characters ([Core #5825](https://github.com/realm/realm-core/issues/5825), since v2.2.0) -* Accented characters are now handled by case-insensitive but - diacritic-sensitive queries. ([Core #5825](https://github.com/realm/realm-core/issues/5825), since v2.2.0) - -### Breaking Changes - -* `-[RLMASLoginDelegate authenticationDidCompleteWithError:]` has been renamed - to `-[RLMASLoginDelegate authenticationDidFailWithError:]` to comply with new - app store requirements. This only effects the obj-c API. - ([#7945](https://github.com/realm/realm-swift/issues/7945)) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1 - 14. - -### Internal - -* Upgraded realm-core from 12.6.0 to 12.7.0 - -10.29.0 Release notes (2022-09-09) -============================================================= - -### Enhancements - -* Add support for asymmetric sync. When a class inherits from - `AsymmetricObject`, objects created are synced unidirectionally to the server - and cannot be queried or read locally. - -```swift - class PersonObject: AsymmetricObject { - @Persisted(primaryKey: true) var _id: ObjectId - @Persisted var name: String - @Persisted var age: Int - } - - try realm.write { - // This will create the object on the server but not locally. - realm.create(PersonObject.self, value: ["_id": ObjectId.generate(), - "name": "Dylan", - "age": 20]) - } -``` -* Add ability to section a collection which conforms to `RealmCollection`, `RLMCollection`. - Collections can be sectioned by a unique key retrieved from a keyPath or a callback and will return an instance of `SectionedResults`/`RLMSectionedResults`. - Each section in the collection will be an instance of `ResultsSection`/`RLMSection` which gives access to the elements corresponding to the section key. - `SectionedResults`/`RLMSectionedResults` and `ResultsSection`/`RLMSection` have the ability to be observed. - ```swift - class DemoObject: Object { - @Persisted var title: String - @Persisted var date: Date - var firstLetter: String { - return title.first.map(String.init(_:)) ?? "" - } - } - var sectionedResults: SectionedResults - // ... - sectionedResults = realm.objects(DemoObject.self) - .sectioned(by: \.firstLetter, ascending: true) - ``` -* Add `@ObservedSectionedResults` for SwiftUI support. This property wrapper type retrieves sectioned results - from a Realm using a keyPath or callback to determine the section key. - ```swift - struct DemoView: View { - @ObservedSectionedResults(DemoObject.self, - sectionKeyPath: \.firstLetter) var demoObjects - - var body: some View { - VStack { - List { - ForEach(demoObjects) { section in - Section(header: Text(section.key)) { - ForEach(section) { object in - MyRowView(object: object) - } - } - } - } - } - } - } - ``` -* Add automatic handing for changing top-level objects to embedded objects in - migrations. Any objects of the now-embedded type which have zero incoming - links are deleted, and objects with multiple incoming links are duplicated. - This happens after the migration callback function completes, so there is no - functional change if you already have migration logic which correctly handles - this. ([Core #5737](https://github.com/realm/realm-core/pull/5737)). -* Improve performance when a new Realm file connects to the server for the - first time, especially when significant amounts of data has been written - while offline. ([Core #5772](https://github.com/realm/realm-core/pull/5772)) -* Shift more of the work done on the sync worker thread out of the write - transaction used to apply server changes, reducing how long it blocks other - threads from writing. ([Core #5772](https://github.com/realm/realm-core/pull/5772)) -* Improve the performance of the sync changeset parser, which speeds up - applying changesets from the server. ([Core #5772](https://github.com/realm/realm-core/pull/5772)) - -### Fixed - -* Fix all of the UBSan failures hit by our tests. It is unclear if any of these - manifested as visible bugs. ([Core #5665](https://github.com/realm/realm-core/pull/5665)) -* Upload completion callbacks were sometimes called before the final step of - interally marking the upload as complete, which could result in calling - `Realm.writeCopy()` from the completion callback failing due to there being - unuploaded changes. ([Core #4865](https://github.com/realm/realm-core/issues/4865)). -* Writing to a Realm stored on an exFAT drive threw the exception "fcntl() with - F_BARRIERFSYNC failed: Inappropriate ioctl for device" when a write - transaction needed to expand the file. - ([Core #5789](https://github.com/realm/realm-core/issues/5789), since 10.27.0) -* Syncing a Decimal128 with big significand could result in a crash. - ([Core #5728](https://github.com/realm/realm-core/issues/5728)) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 RC. - -### Internal - -* Upgraded realm-core from 12.5.1 to 12.6.0 - -10.28.7 Release notes (2022-09-02) -============================================================= - -### Enhancements - -* Add prebuilt binaries for Xcode 14 to the release package. - -### Fixed - -* Fix archiving watchOS release builds with Xcode 14. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 6. - -10.28.6 Release notes (2022-08-19) -============================================================= - -### Fixed - -* Fixed an issue where having realm-swift as SPM sub-target dependency leads to - missing symbols error during iOS archiving ([Core #7645](https://github.com/realm/realm-core/pull/7645)). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 5. - -### Internal - -* Upgraded realm-core from 12.5.0 to 12.5.1 - -10.28.5 Release notes (2022-08-09) -============================================================= - -### Enhancements - -* Improve performance of accessing `SubscriptionSet` properties when no writes - have been made to the Realm since the last access. - -### Fixed - -* A use-after-free could occur if a Realm with audit events enabled was - destroyed while processing an upload completion for the events Realm on a - different thread. ([Core PR #5714](https://github.com/realm/realm-core/pull/5714)) -* Opening a read-only synchronized Realm for the first time via asyncOpen did - not set the schema version, which could lead to `m_schema_version != - ObjectStore::NotVersioned` assertion failures later on. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 4. - -### Internal - -* Upgraded realm-core from 12.4.0 to 12.5.0 - -10.28.4 Release notes (2022-08-03) -============================================================= - -### Enhancements - -* Add support for building arm64 watchOS when installing Realm via CocoaPods. -* Reduce the amount of virtual address space used - ([Core #5645](https://github.com/realm/realm-core/pull/5645)). - -### Fixed - -* Fix some warnings when building with Xcode 14 - ([Core #5577](https://github.com/realm/realm-core/pull/5577)). -* Fix compilation failures on watchOS platforms which do not support thread-local storage. - ([#7694](https://github.com/realm/realm-swift/issues/7694), [#7695](https://github.com/realm/realm-swift/issues/7695) since v10.21.1) -* Fix a data race when committing a transaction while multiple threads are - waiting to begin write transactions. This appears to not have caused any - functional problems. -* Fix a data race when writing audit events which could occur if the sync - client thread was busy with other work when the event Realm was opened. -* Fix some cases of running out of virtual address space (seen/reported as mmap - failures) ([Core #5645](https://github.com/realm/realm-core/pull/5645)). -* Audit event scopes containing only write events and no read events would - occasionally throw a `BadVersion` exception when a write transaction was - committed (since v10.26.0). -* The client reset callbacks for the DiscardLocal mode would be passed invalid - Realm instances if the callback was invoked at a point where the Realm was - not otherwise open. ([Core #5654](https://github.com/realm/realm-core/pull/5654), since the introduction of DiscardLocal reset mode in v10.25.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 4. - -### Internal - -* Upgraded realm-core from 12.3.0 to 12.4.0. - -10.28.3 Release notes (2022-07-27) -============================================================= - -### Enhancements - -* Greatly improve the performance of obtaining cached Realm instances in Swift - when using a sync configuration. - -### Fixed - -* Add missing `initialSubscription` and `rerunOnOpen` to copyWithZone method on - `RLMRealmConfiguration`. This resulted in incorrect values when using - `RLMRealmConfiguration.defaultConfiguration`. -* The sync error handler did not hold a strong reference to the sync session - while dispatching the error from the worker thread to the main thread, - resulting in the session passed to the error handler being invalid if there - were no other remaining strong references elsewhere. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 3. - -10.28.2 Release notes (2022-06-30) -============================================================= - -### Fixed - -* Using `seedFilePath` threw an exception if the Realm file being opened - already existed ([#7840](https://github.com/realm/realm-swift/issues/7840), - since v10.26.0). -* The `intialSubscriptions` callback was invoked every time a Realm was opened - regardless of the value of `rerunOnOpen` and if the Realm was already open on - another thread (since v10.28.0). -* Allow using `RLMSupport.Swift` from RealmSwift's Cocoapods - ([#6886](https://github.com/realm/realm-swift/pull/6886)). -* Fix a UBSan failure when mapping encrypted pages. Fixing this did not change - the resulting assembly, so there were probably no functional problems - resulting from this (since v5.0.0). -* Improved performance of sync clients during integration of changesets with - many small strings (totalling > 1024 bytes per changeset) on iOS 14, and - devices which have restrictive or fragmented memory. - ([Core #5614](https://github.com/realm/realm-core/issues/5614)) -* Fix a data race when opening a flexible sync Realm (since v10.28.0). -* Add a missing backlink removal when assigning null or a non-link value to an - `AnyRealmValue` property which previously linked to an object. - This could have resulted in "key not found" exceptions or assertion failures - such as `mixed.hpp:165: [realm-core-12.1.0] Assertion failed: m_type` when - removing the destination link object. - ([Core #5574](https://github.com/realm/realm-core/pull/5573), since the introduction of AnyRealmValue in v10.8.0) - -### Compatibility - -* Realm Studio: 12.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 2. - -### Internal - -* Upgraded realm-core from 12.1.0 to 12.3.0. - -10.28.1 Release notes (2022-06-10) -============================================================= - -### Enhancements - -* Add support for Xcode 14. When building with Xcode 14, the minimum deployment - target is now iOS 11. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 1. - -10.28.0 Release notes (2022-06-03) -============================================================= - -### Enhancements - -* Replace mentions of 'MongoDB Realm' with 'Atlas App Services' in the documentation and update appropriate links to documentation. -* Allow adding a subscription querying for all documents of a type in swift for flexible sync. -``` - try await subscriptions.update { - subscriptions.append(QuerySubscription(name: "all_people")) - } -``` -* Add Combine API support for flexible sync beta. -* Add an `initialSubscriptions` parameter when retrieving the flexible sync configuration from a user, - which allows to specify a subscription update block, to bootstrap a set of flexible sync subscriptions - when the Realm is first opened. - There is an additional optional parameter flag `rerunOnOpen`, which allows to run this initial - subscriptions on every app startup. - -```swift - let config = user.flexibleSyncConfiguration(initialSubscriptions: { subs in - subs.append(QuerySubscription(name: "people_10") { - $0.age > 10 - }) - }, rerunOnOpen: true) - let realm = try Realm(configuration: config) -``` -* The sync client error handler will report an error, with detailed info about which object caused it, when writing an object to a flexible sync Realm outside of any query subscription. ([#5528](https://github.com/realm/realm-core/pull/5528)) -* Adding an object to a flexible sync Realm for a type that is not within a query subscription will now throw an exception. ([#5488](https://github.com/realm/realm-core/pull/5488)). - -### Fixed - -* Flexible Sync query subscriptions will correctly complete when data is synced to the local Realm. ([#5553](https://github.com/realm/realm-core/pull/5553), since v12.0.0) - -### Breaking Changes - -* Rename `SyncSubscriptionSet.write` to `SyncSubscriptionSet.update` to avoid confusion with `Realm.write`. -* Rename `SyncSubscription.update` to `SyncSubscription.updateQuery` to avoid confusion with `SyncSubscriptionSet.update`. -* Rename `RLMSyncSubscriptionSet.write` to `RLMSyncSubscriptionSet.update` to align it with swift API. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-13.4. - -### Internal - -* Upgraded realm-core from 12.0.0 to 12.1.0. - -10.27.0 Release notes (2022-05-26) -============================================================= - -### Enhancements - -* `@AsyncOpen`/`@AutoOpen` property wrappers can be used with flexible sync. - -### Fixed - -* When installing via SPM, debug builds could potentially hit an assertion - failure during flexible sync bootstrapping. ([Core #5527](https://github.com/realm/realm-core/pull/5527)) -* Flexible sync now only applies bootstrap data if the entire bootstrap is - received. Previously orphaned objects could result from the read snapshot on - the server changing. ([Core #5331](https://github.com/realm/realm-core/pull/5331)) -* Partially fix a performance regression in write performance introduced in - v10.21.1. v10.21.1 fixed a case where a kernel panic or device's battery - dying at the wrong point in a write transaction could potentially result in a - corrected Realm file, but at the cost of a severe performance hit. This - version adjusts how file synchronization is done to provide the same safety - at a much smaller performance hit. ([#7740](https://github.com/realm/realm-swift/issues/7740)). - -### Compatibility - -* Realm Studio: 11.0.0 or later (but see note below). -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-13.4. - -### Internal - -* Upgraded realm-core from 11.17.0 to 12.0.0. -* Bump the version number for the lockfile used for interprocess - synchronization. This has no effect on persistent data, but means that - versions of Realm which use pre-12.0.0 realm-core cannot open Realm files at - the same time as they are opened by this version. Notably this includes Realm - Studio, and v11.1.2 (the latest at the time of this release) cannot open - Realm files which are simultaneously open in the simulator. - -10.26.0 Release notes (2022-05-19) -============================================================= - -Xcode 13.1 is now the minimum supported version of Xcode, as Apple no longer -allows submitting to the app store with Xcode 12. - -### Enhancements - -* Add Xcode 13.4 binaries to the release package. -* Add Swift API for asynchronous transactions -```swift - try? realm.writeAsync { - realm.create(SwiftStringObject.self, value: ["string"]) - } onComplete: { error in - // optional handling on write complete - } - - try? realm.beginAsyncWrite { - realm.create(SwiftStringObject.self, value: ["string"]) - realm.commitAsyncWrite() - } - - let asyncTransactionId = try? realm.beginAsyncWrite { - // ... - } - try! realm.cancelAsyncWrite(asyncTransactionId) -``` -* Add Obj-C API for asynchronous transactions -``` - [realm asyncTransactionWithBlock:^{ - [StringObject createInRealm:realm withValue:@[@"string"]]; - } onComplete:^(NSError *error) { - // optional handling - }]; - - [realm beginAsyncWriteTransaction:^{ - [StringObject createInRealm:realm withValue:@[@"string"]]; - [realm commitAsyncWriteTransaction]; - }]; - - RLMAsyncTransactionId asyncTransactionId = [realm beginAsyncWriteTransaction:^{ - // ... - }]; - [realm cancelAsyncTransaction:asyncTransactionId]; -``` -* Improve performance of opening a Realm with `objectClasses`/`objectTypes` set - in the configuration. -* Implement the Realm event recording API for reporting reads and writes on a - Realm file to Atlas. - -### Fixed - -* Lower minimum OS version for `async` login and FunctionCallables to match the - rest of the `async` functions. ([#7791]https://github.com/realm/realm-swift/issues/7791) -* Consuming a RealmSwift XCFramework with library evolution enabled would give the error - `'Failed to build module 'RealmSwift'; this SDK is not supported by the compiler'` - when the XCFramework was built with an older XCode version and is - then consumed with a later version. ([#7313](https://github.com/realm/realm-swift/issues/7313), since v3.18.0) -* A data race would occur when opening a synchronized Realm with the client - reset mode set to `discardLocal` on one thread at the same time as a client - reset was being processed on another thread. This probably did not cause any - functional problems in practice and the broken timing window was very tight (since 10.25.0). -* If an async open of a Realm triggered a client reset, the callbacks for - `discardLocal` could theoretically fail to be called due to a race condition. - The timing for this was probably not possible to hit in practice (since 10.25.0). -* Calling `[RLMRealm freeze]`/`Realm.freeze` on a Realm which had been created from `writeCopy` - would not produce a frozen Realm. ([#7697](https://github.com/realm/realm-swift/issues/7697), since v5.0.0) -* Using the dynamic subscript API on unmanaged objects before first opening a - Realm or if `objectTypes` was set when opening a Realm would throw an - exception ([#7786](https://github.com/realm/realm-swift/issues/7786)). -* The sync client may have sent a corrupted upload cursor leading to a fatal - error from the server due to an uninitialized variable. - ([#5460](https://github.com/realm/realm-core/pull/5460), since v10.25.1) -* Flexible sync would not correctly resume syncing if a bootstrap was interrupted - ([#5466](https://github.com/realm/realm-core/pull/5466), since v10.21.1). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-13.4. - -### Internal - -* Upgraded realm-core from v11.15.0 to v11.17.0 - -10.25.2 Release notes (2022-04-27) -============================================================= - -### Enhancements - -* Replace Xcode 13.3 binaries with 13.3.1 binaries. - -### Fixed - -* `List` would contain an invalidated object instead of null when - the object linked to was deleted by a difference sync client - ([Core #5215](https://github.com/realm/realm-core/pull/5215), since v10.8.0). -* Adding an object to a Set, deleting the parent object of the Set, and then - deleting the object which was added to the Set would crash - ([Core #5387](https://github.com/realm/realm-core/issues/5387), since v10.8.0). -* Synchronized Realm files which were first created using v10.0.0-beta.3 would - be redownloaded instead of using the existing file, possibly resulting in the - loss of any unsynchronized data in those files (since v10.20.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3.1. - -### Internal - -* Upgraded realm-core from v11.14.0 to v11.15.0 - -10.25.1 Release notes (2022-04-11) -============================================================= - -### Fixed - -* Fixed various memory corruption bugs when encryption is used caused by not - locking a mutex when needed. - ([#7640](https://github.com/realm/realm-swift/issues/7640), [#7659](https://github.com/realm/realm-swift/issues/7659), since v10.21.1) -* Changeset upload batching did not calculate the accumulated size correctly, - resulting in “error reading body failed to read: read limited at 16777217 - bytes” errors from the server when writing large amounts of data - ([Core #5373](https://github.com/realm/realm-core/pull/5373), since 10.25.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3. - -### Internal - -* Upgraded realm-core from v11.13.0 to v11.14.0. - -10.25.0 Release notes (2022-03-29) -============================================================= - -Synchronized Realm files written by this version cannot be opened by older -versions of Realm. Existing files will be automatically upgraded when opened. - -Non-synchronized Realm files remain backwards-compatible. - -### Enhancements - -* Add ability to use Swift Query syntax in `@ObservedResults`, which allows you - to filter results using the `where` parameter. -* Add ability to use `MutableSet` with `StateRealmObject` in SwiftUI. -* Async/Await extensions are now compatible with iOS 13 and above when building - with Xcode 13.3. -* Sync changesets waiting to be uploaded to the server are now compressed, - reducing the disk space needed when large write transactions are performed - while offline or limited in bandwidth.([Core #5260](https://github.com/realm/realm-core/pull/5260)). -* Added new `SyncConfiguration.clientResetMode` and `RLMSyncConfiguration.clientResetMode` properties. - - The values of these properties will dictate client behavior in the event of a [client reset](https://docs.mongodb.com/realm/sync/error-handling/client-resets/). - - See below for information on `ClientResetMode` values. - - `clientResetMode` defaults to `.manual` if not set otherwise. -* Added new `ClientResetMode` and `RLMClientResetMode` enums. - - These enums represent possible client reset behavior for `SyncConfiguration.clientResetMode` and `RLMSyncConfiguration.clientResetMode`, respectively. - - `.manual` and `RLMClientResetModeManual` - - The local copy of the Realm is copied into a recovery - directory for safekeeping, and then deleted from the original location. The next time - the Realm for that partition value is opened, the Realm will automatically be re-downloaded from - MongoDB Realm, and can be used as normal. - - Data written to the Realm after the local copy of the Realm diverged from the backup - remote copy will be present in the local recovery copy of the Realm file. The - re-downloaded Realm will initially contain only the data present at the time the Realm - was backed up on the server. - - `rlmSync_clientResetBackedUpRealmPath` and `SyncError.clientResetInfo()` are used for accessing the recovery directory. - - `.discardLocal` and `RLMClientResetDiscardLocal` - - All unsynchronized local changes are automatically discarded and the local state is - automatically reverted to the most recent state from the server. Unsynchronized changes - can then be recovered in a post-client-reset callback block (See changelog below for more details). - - If RLMClientResetModeDiscardLocal is enabled but the client reset operation is unable to complete - then the client reset process reverts to manual mode. - - The realm's underlying object accessors remain bound so the UI may be updated in a non-disruptive way. -* Added support for client reset notification blocks for `.discardLocal` and `RLMClientResetDiscardLocal` - - **RealmSwift implementation**: `discardLocal(((Realm) -> Void)? = nil, ((Realm, Realm) -> Void)? = nil)` - - RealmSwift client reset blocks are set when initializing the user configuration - ```swift - var configuration = user.configuration(partitionValue: "myPartition", clientResetMode: .discardLocal(beforeClientResetBlock, afterClientResetBlock)) - ``` - - The before client reset block -- `((Realm) -> Void)? = nil` -- is executed prior to a client reset. Possible usage includes: - ```swift - let beforeClientResetBlock: (Realm) -> Void = { beforeRealm in - var recoveryConfig = Realm.Configuration() - recoveryConfig.fileURL = myRecoveryPath - do { - beforeRealm.writeCopy(configuration: recoveryConfig) - /* The copied realm could be used later for recovery, debugging, reporting, etc. */ - } catch { - /* handle error */ - } - } - ``` - - The after client reset block -- `((Realm, Realm) -> Void)? = nil)` -- is executed after a client reset. Possible usage includes: - ```Swift - let afterClientResetBlock: (Realm, Realm) -> Void = { before, after in - /* This block could be used to add custom recovery logic, back-up a realm file, send reporting, etc. */ - for object in before.objects(myClass.self) { - let res = after.objects(myClass.self) - if (res.filter("primaryKey == %@", object.primaryKey).first != nil) { - /* ...custom recovery logic... */ - } else { - /* ...custom recovery logic... */ - } - } - ``` - - **Realm Obj-c implementation**: Both before and after client reset callbacks exist as properties on `RLMSyncConfiguration` and are set at initialization. - ```objective-c - RLMRealmConfiguration *config = [user configurationWithPartitionValue:partitionValue - clientResetMode:RLMClientResetModeDiscardLocal - notifyBeforeReset:beforeBlock - notifyAfterReset:afterBlock]; - ``` - where `beforeBlock` is of type `RLMClientResetBeforeBlock`. And `afterBlock` is of type `RLMClientResetAfterBlock`. - -### Breaking Changes - -* Xcode 13.2 is no longer supported when building with Async/Await functions. Use - Xcode 13.3 to build with Async/Await functionality. - -### Fixed - -* Adding a Realm Object to a `ObservedResults` or a collections using - `StateRealmObject` that is managed by the same Realm would throw if the - Object was frozen and not thawed before hand. -* Setting a Realm Configuration for @ObservedResults using it's initializer - would be overrode by the Realm Configuration stored in - `.environment(\.realmConfiguration, ...)` if they did not match - ([Cocoa #7463](https://github.com/realm/realm-swift/issues/7463), since v10.6.0). -* Fix searchable component filter overriding the initial filter on `@ObservedResults`, (since v10.23.0). -* Comparing `Results`, `LinkingObjects` or `AnyRealmCollection` when using Realm via XCFramework - would result in compile time errors ([Cocoa #7615](https://github.com/realm/realm-swift/issues/7615), since v10.21.0) -* Opening an encrypted Realm while the keychain is locked on macOS would crash - ([#7438](https://github.com/realm/realm-swift/issues/7438)). -* Updating subscriptions while refreshing the access token would crash - ([Core #5343](https://github.com/realm/realm-core/issues/5343), since v10.22.0) -* Fix several race conditions in `SyncSession` related to setting - `customRequestHeaders` while using the `SyncSession` on a different thread. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3. - -### Internal - -* Upgraded realm-core from v11.12.0 to v11.13.0 - -10.24.2 Release notes (2022-03-18) -============================================================= - -### Fixed - -* Application would sometimes crash with exceptions like 'KeyNotFound' or - assertion "has_refs()". Other issues indicating file corruption may also be - fixed by this. The one mentioned here is the one that lead to solving the - problem. - ([Core #5283](https://github.com/realm/realm-core/issues/5283), since v5.0.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3. - -### Internal - -* Upgraded realm-core from 11.11.0 to 11.12.0 - -10.24.1 Release notes (2022-03-14) -============================================================= - -Switch to building the Carthage binary with Xcode 13.3. This release contains -no functional changes from 10.24.0. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3. - -10.24.0 Release notes (2022-03-05) -============================================================= - -### Enhancements - -* Add ability to use Swift Query syntax in `@ObservedResults`, which allows you - to filter results using the `where` parameter. - -### Fixed - -* If a list of objects contains links to objects not included in the - synchronized partition, collection change notifications for that list could - be incorrect ([Core #5164](https://github.com/realm/realm-core/issues/5164), since v10.0.0). -* Adding a new flexible sync subscription could crash with - "Assertion failed: !m_unbind_message_sent" in very specific timing scenarios - ([Core #5149](https://github.com/realm/realm-core/pull/5149), since v10.22.0). -* Converting floats/doubles into Decimal128 would yield imprecise results - ([Core #5184](https://github.com/realm/realm-core/pull/5184), since v10.0.0) -* Using accented characters in class and field names in a synchronized Realm - could result in sync errors ([Core #5196](https://github.com/realm/realm-core/pull/5196), since v10.0.0). -* Calling `Realm.invalidate()` from inside a Realm change notification could - result in the write transaction which produced the notification not being - persisted to disk (since v10.22.0). -* When a client reset error which results in the current Realm file being - backed up and then deleted, deletion errors were ignored as long as the copy - succeeded. When this happens the deletion of the old file is now scheduled - for the next launch of the app. ([Core #5180](https://github.com/realm/realm-core/issues/5180), since v2.0.0) -* Fix an error when compiling a watchOS Simulator target not supporting - Thread-local storage ([#7623](https://github.com/realm/realm-swift/issues/7623), since v10.21.0). -* Add a validation check to report a sensible error if a Realm configuration - indicates that an in-memory Realm should be encrypted. ([Core #5195](https://github.com/realm/realm-core/issues/5195)) -* The Swift package set the linker flags on the wrong target, resulting in - linker errors when SPM decides to build the core library as a dynamic library - ([#7266](https://github.com/realm/realm-swift/issues/7266)). -* The download-core task failed if run in an environment without TMPDIR set - ([#7688](https://github.com/realm/realm-swift/issues/7688), since v10.23.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3 beta 3. - -### Internal - -* Upgraded realm-core from 11.9.0 to 11.11.0 - -10.23.0 Release notes (2022-02-28) -============================================================= - -### Enhancements - -* Add `Realm.writeCopy(configuration:)`/`[RLMRealm writeCopyForConfiguration:]` which gives the - following functionality: - - Export a local non-sync Realm to be used with MongoDB Realm Sync - when the configuration is derived from a sync `RLMUser`/`User`. - - Write a copy of a local Realm to a destination specified in the configuration. - - Write a copy of a synced Realm in use with user A, and open it with user B. - - Note that migrations may be required when using a local realm configuration to open a realm file that - was copied from a synchronized realm. - - An exception will be thrown if a Realm exists at the destination. -* Add a `seedFilePath` option to `RLMRealmConfiguration` and `Configuration`. If this - option is set then instead of creating an empty Realm, the realm at the `seedFilePath` will - be copied to the `fileURL` of the new Realm. If a Realm file already exists at the - desitnation path, the seed file will not be copied and the already existing Realm - will be opened instead. Note that to use this parameter with a synced Realm configuration - the seed Realm must be appropriately copied to a destination with - `Realm.writeCopy(configuration:)`/`[RLMRealm writeCopyForConfiguration:]` first. -* Add ability to permanently delete a User from a MongoDB Realm app. This can - be invoked with `User.delete()`/`[RLMUser deleteWithCompletion:]`. -* Add `NSCopying` conformance to `RLMDecimal128` and `RLMObjectId`. -* Add Xcode 13.3 binaries to the release package (and remove 13.0). - -### Fixed - -* Add support of arm64 in Carthage build ([#7154](https://github.com/realm/realm-cocoa/issues/7154) -* Adding missing support for `IN` queries to primitives types on Type Safe Queries. - ```swift - let persons = realm.objects(Person.self).where { - let acceptableNames = ["Tom", "James", "Tyler"] - $0.name.in([acceptableNames]) - } - ``` - ([Cocoa #7633](https://github.com/realm/realm-swift/issues/7633), since v10.19.0) -* Work around a compiler crash when building with Swift 5.6 / Xcode 13.3. - CustomPersistable's PersistedType must now always be a built-in type rather - than possibly another CustomPersistable type as Swift 5.6 has removed support - for infinitely-recursive associated types ([#7654](https://github.com/realm/realm-swift/issues/7654)). -* Fix redundant call to filter on `@ObservedResults` from `searchable` - component (since v10.19.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3 beta 3. - -10.22.0 Release notes (2022-01-25) -============================================================= - -### Enhancements - -* Add beta support for flexible sync. See the [backend](https://docs.mongodb.com/realm/sync/data-access-patterns/flexible-sync/) and [SDK](https://docs.mongodb.com/realm/sdk/swift/examples/flexible-sync/) documentation for more information. Please report any issues with the beta through Github. - -### Fixed - -* UserIdentity metadata table grows indefinitely. ([#5152](https://github.com/realm/realm-core/issues/5152), since v10.20.0) -* We now report a useful error message when opening a sync Realm in non-sync mode or vice-versa.([#5161](https://github.com/realm/realm-core/pull/5161), since v5.0.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.2.1. - -### Internal - -* Upgraded realm-core from 11.8.0 to 11.9.0 - -10.21.1 Release notes (2022-01-12) -============================================================= - -### Fixed - -* The sync client will now drain the receive queue when a send fails with - ECONNRESET, ensuring that any error message from the server gets received and - processed. ([#5078](https://github.com/realm/realm-core/pull/5078)) -* Schema validation was missing for embedded objects in sets, resulting in an - unhelpful error being thrown if a Realm object subclass contained one (since v10.0.0). -* Opening a Realm with a schema that has an orphaned embedded object type - performed an extra empty write transaction (since v10.0.0). -* Freezing a Realm with a schema that has orphaned embedded object types threw - a "Wrong transactional state" exception (since v10.19.0). -* `@sum` and `@avg` queries on Dictionaries of floats or doubles used too much - precision for intermediates, resulting in incorrect rounding (since v10.5.0). -* Change the exception message for calling refresh on an immutable Realm from - "Continuous transaction through DB object without history information." to - "Can't refresh a read-only Realm." - ([#5061](https://github.com/realm/realm-core/issues/5061), since v10.8.0). -* Queries of the form "link.collection.@sum = 0" where `link` is null matched - when `collection` was a List or Set, but not a Dictionary - ([#5080](https://github.com/realm/realm-core/pull/5080), since v10.8.0). -* Types which require custom obj-c bridging (such as `PersistableEnum` or - `CustomPersistable`) would crash with exceptions mentioning `__SwiftValue` in - a variety of places on iOS versions older than iOS 14 - ([#7604](https://github.com/realm/realm-swift/issues/7604), since v10.21.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.2.1. - -### Internal - -* Upgraded realm-core from 11.6.1 to 11.8.0. - -10.21.0 Release notes (2022-01-10) -============================================================= - -### Enhancements - -* Add `metadata` property to `RLMUserProfile`/`UserProfile`. -* Add class `Projection` to allow creation of light weight view models out of Realm Objects. -```swift -public class Person: Object { - @Persisted var firstName = "" - @Persisted var lastName = "" - @Persisted var address: Address? = nil - @Persisted var friends = List() -} - -public class Address: EmbeddedObject { - @Persisted var city: String = "" - @Persisted var country = "" -} - -class PersonProjection: Projection { - // `Person.firstName` will have same name and type - @Projected(\Person.firstName) var firstName - // There will be the only String for `city` of the original object `Address` - @Projected(\Person.address.city) var homeCity - // List will be mapped to list of firstNames - @Projected(\Person.friends.projectTo.firstName) var firstFriendsName: ProjectedCollection -} - -// `people` will contain projections for every `Person` object in the `realm` -let people: Results = realm.objects(PersonProjection.self) -``` -* Greatly improve performance of reading AnyRealmValue and enum types from - Realm collections. -* Allow using Swift enums which conform to `PersistableEnum` as the value type - for all Realm collections. -* `AnyRealmCollection` now conforms to `Encodable`. -* AnyRealmValue and PersistableEnum values can now be passed directly to an - NSPredicate used in a filter() call rather than having to pass the rawValue - (the rawValue is still allowed). -* Queries on collections of PersistableEnums can now be performed with `where()`. -* Add support for querying on the rawValue of an enum with `where()`. -* `.count` is supported for Maps of all types rather than just numeric types in `where()`. -* Add support for querying on the properties of objects contained in - dictionaries (e.g. "dictProperty.@allValues.name CONTAINS 'a'"). -* Improve the error message for many types of invalid predicates in queries. -* Add support for comparing `@allKeys` to another property on the same object. -* Add `Numeric` conformance to `Decimal128`. -* Make some invalid property declarations such as `List` a - compile-time error instead of a runtime error. -* Calling `.sorted(byKeyPath:)` on a collection with an Element type which does - not support sorting by keypaths is now a compile-time error instead of a - runtime error. -* `RealmCollection.sorted(ascending:)` can now be called on all - non-Object/EmbeddedObject collections rather than only ones where the - `Element` conforms to `Comparable`. -* Add support for using user-defined types with `@Persistable` and in Realm - collections by defining a mapping to and from a type which Realm knows how to - store. For example, `URL` can be made persistable with: - ```swift - extension URL: FailableCustomPersistable { - // Store URL values as a String in Realm - public typealias PersistedType = String - // Convert a String to a URL - public init?(persistedValue: String) { self.init(string: persistedValue) } - // Convert a URL to a String - public var persistableValue: String { self.absoluteString } - } - ``` - After doing this, `@Persisted var url: URL` is a valid property declaration - on a Realm object. More advanced mappings can be done by mapping to an - EmbeddedObject which can store multiple values. - -### Fixed - -* Accessing a non object collection inside a migration would cause a crash -* [#5633](https://github.com/realm/realm-cocoa/issues/5633). -* Accessing a `Map` of objects dynamically would not handle nulled values correctly (since v10.8.0). -* `where()` allowed constructing some nonsensical queries due to boolean - comparisons returning `Query` rather than `Query` (since v10.19.0). -* `@allValues` queries on dictionaries accidentally did not require "ANY". -* Case-insensitive and diacritic-insensitive modifiers were ignored when - comparing the result of an aggregate operation to another property in a - query. -* `Object.init(value:)` did not allow initializing `RLMDictionary`/`Map` - properties with null values for map entries (since v10.8.0). -* `@ObservedResults` did not refresh when changes were made to the observed - collection. (since v10.6.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.2.1. - -10.20.1 Release notes (2021-12-14) -============================================================= - -Xcode 12.4 is now the minimum supported version of Xcode. - -### Fixed - -* Add missing `Indexable` support for UUID. - ([Cocoa #7545](https://github.com/realm/realm-swift/issues/7545), since v10.10.0) - -### Breaking Changes - -* All `async` functions now require Xcode 13.2 to work around an App - Store/TestFlight bug that results in apps built with 13.0/13.1 which do not - use libConcurrency but link a library which does crashing on startup. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.2. - -10.20.0 Release notes (2021-11-16) -============================================================= - -### Enhancements - -* Conform `@ThreadSafe` and `ThreadSafeReference` to `Sendable`. -* Allow using Swift enums which conform to `PersistableEnum` as the value type - for all Realm collections. -* `AnyRealmCollection` now conforms to `Encodable`. -* Greatly improve performance of reading AnyRealmValue and enum types from - Realm collections. -* `AnyRealmCollection` now conforms to `Encodable`. - -### Fixed - -* `@AutoOpen` will open the existing local Realm file on any connection error - rather than only when the connection specifically times out. -* Do not allow `progress` state changes for `@AutoOpen` and `@AsyncOpen` after - changing state to `open(let realm)` or `error(let error)`. -* Logging out a sync user failed to remove the local Realm file for partitions - with very long partition values that would have exceeded the maximum path - length. ([Core #4187](https://github.com/realm/realm-core/issues/4187), since v10.0.0) -* Don't keep trying to refresh the access token if the client's clock is more - than 30 minutes fast. ([Core #4941](https://github.com/realm/realm-core/issues/4941)) -* Failed auth requests used a fixed long sleep rather than exponential backoff - like other sync requests, which could result in very delayed reconnects after - a device was offline long enough for the access token to expire (since v10.0.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.1. - -### Internal - -* Upgraded realm-core from 11.6.0 to 11.6.1. - -10.19.0 Release notes (2021-11-04) -============================================================= - -### Enhancements - -* Add `.searchable()` SwiftUI View Modifier which allows filtering - `@ObservedResult` results from a search field component by a key path. - ```swift - List { - ForEach(reminders) { reminder in - ReminderRowView(reminder: reminder) - } - }.searchable(text: $searchFilter, - collection: $reminders, - keyPath: \.name) { - ForEach(reminders) { remindersFiltered in - Text(remindersFiltered.name).searchCompletion(remindersFiltered.name) - } - } - ``` -* Add an API for a type safe query syntax. This allows you to filter a Realm - and collections managed by a Realm with Swift style expressions. Here is a - brief example: - ```swift - class Person: Object { - @Persisted var name: String - @Persisted var hobbies: MutableSet - @Persisted var pets: List - } - class Pet: Object { - @Persisted var name: String - @Persisted var age: Int - } - - let persons = realm.objects(Person.self).where { - $0.hobbies.contains("music") || $0.hobbies.contains("baseball") - } - - persons = realm.objects(Person.self).where { - ($0.pets.age >= 2) && $0.pets.name.starts(with: "L") - } - ``` - ([#7419](https://github.com/realm/realm-swift/pull/7419)) -* Add support for dictionary subscript expressions - (e.g. `"phoneNumbers['Jane'] == '123-3456-123'"`) when querying with an - NSPredicate. -* Add UserProfile to User. This contains metadata from social logins with MongoDB Realm. -* Slightly reduce the peak memory usage when processing sync changesets. - -### Fixed - -* Change default request timeout for `RLMApp` from 6 seconds to 60 seconds. -* Async `Realm` init would often give a Realm instance which could not actually - be used and would throw incorrect thread exceptions. It now is `@MainActor` - and gives a Realm instance which always works on the main actor. The - non-functional `queue:` parameter has been removed (since v10.15.0). -* Restore the pre-v10.12.0 behavior of calling `writeCopy()` on a synchronized - Realm which produced a local non-synchronized Realm - ([#7513](https://github.com/realm/realm-swift/issues/7513)). -* Decimal128 did not properly normalize the value before hashing and so could - have multiple values which are equal but had different hash values (since v10.8.0). -* Fix a rare assertion failure or deadlock when a sync session is racing to - close at the same time that external reference to the Realm is being - released. ([Core #4931](https://github.com/realm/realm-core/issues/4931)) -* Fix a assertion failure when opening a sync Realm with a user who had been - removed. Instead an exception will be thrown. ([Core #4937](https://github.com/realm/realm-core/issues/4937), since v10.0.0) -* Fixed a rare segfault which could trigger if a user was being logged out - while the access token refresh response comes in. - ([Core #4944](https://github.com/realm/realm-core/issues/4944), since v10.0.0) -* Fixed a bug where progress notifiers on an AsyncOpenTask could be called - after the open completed. ([Core #4919](https://github.com/realm/realm-core/issues/4919)) -* SecureTransport was not enabled for macCatalyst builds when installing via - SPM, resulting in `'SSL/TLS protocol not supported'` exceptions when using - Realm Sync. ([#7474](https://github.com/realm/realm-swift/issues/7474)) -* Users were left in the logged in state when their refresh token expired. - ([Core #4882](https://github.com/realm/realm-core/issues/4882), since v10) -* Calling `.count` on a distinct collection would return the total number of - objects in the collection rather than the distinct count the first time it is - called. ([#7481](https://github.com/realm/realm-swift/issues/7481), since v10.8.0). -* `realm.delete(collection.distinct(...))` would delete all objects in the - collection rather than just the first object with each distinct value in the - property being distincted on, unless the distinct Results were read from at - least once first (since v10.8.0). -* Calling `.distinct()` on a collection, accessing the Results, then passing - the Results to `realm.delete()` would delete the correct objects, but - afterwards report a count of zero even if there were still objects in the - Results (since v10.8.0). -* Download compaction could result in non-streaming sync download notifiers - never reporting completion (since v10.0.0, - [Core #4989](https://github.com/realm/realm-core/pull/4989)). -* Fix a deadlock in SyncManager that was probably not possible to hit in - real-world code (since v10.0.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.2. - -### Internal - -* Upgraded realm-core from v11.4.1 to v11.6.0 - -10.18.0 Release notes (2021-10-25) -============================================================= - -### Enhancements - -* Add support for using multiple users with `@AsyncOpen` and `@AutoOpen`. - Setting the current user to a new user will now automatically reopen the - Realm with the new user. -* Add prebuilt binary for Xcode 13.1 to the release package. - -### Fixed - -* Fix `@AsyncOpen` and `@AutoOpen` using `defaultConfiguration` by default if - the user's doesn't provide one, will set an incorrect path which doesn't - correspond to the users configuration one. (since v10.12.0) -* Adding missing subscription completion for `AsyncOpenPublisher` after - successfully returning a realm. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.1. - -10.17.0 Release notes (2021-10-06) -============================================================= - -### Enhancements - -* Add a new `@ThreadSafe` property wrapper. Objects and collections wrapped by `@ThreadSafe` may be passed between threads. It's - intended to allow local variables and function parameters to be used across - threads when needed. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.0. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0. - -10.16.0 Release notes (2021-09-29) -============================================================= - -### Enhancements - -* Add `async` versions of `EmailPasswordAuth.callResetPasswordFunction` and -r `User.linkUser` methods. -* Add `async` version of `MongoCollection` methods. -* Add `async` support for user functions. - -### Fixed - -* A race condition in Realm.asyncOpen() sometimes resulted in subsequent writes - from Realm Sync failing to produce notifications - ([#7447](https://github.com/realm/realm-swift/issues/7447), - [#7453](https://github.com/realm/realm-swift/issues/7453), - [Core #4909](https://github.com/realm/realm-core/issues/4909), since v10.15.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.0. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0. - -10.15.1 Release notes (2021-09-15) -============================================================= - -### Enhancements - -* Switch to building the Carthage release with Xcode 13. - -### Fixed - -* Fix compilation error where Swift 5.5 is available but the macOS 12 SDK was - not. This was notable for the Xcode 13 RC. This fix adds a #canImport check - for the `_Concurrency` module that was not available before the macOS 12 SDK. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.0. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0. - -10.15.0 Release notes (2021-09-10) -============================================================= - -### Enhancements - -* Add `async` versions of the `Realm.asyncOpen` and `App.login` methods. -* ThreadSafeReference no longer pins the source transaction version for - anything other than a Results created by filtering a collection. This means - that holding on to thread-safe references to other things (such as Objects) - will no longer cause file size growth. -* A ThreadSafeReference to a Results backed by a collection can now be created - inside a write transaction as long as the collection was not created in the - current write transaction. -* Synchronized Realms are no longer opened twice, cutting the address space and - file descriptors used in half. - ([Core #4839](https://github.com/realm/realm-core/pull/4839)) -* When using the SwiftUI helper types (@ObservedRealmObject and friends) to - bind to an Equatable property, self-assignment no longer performs a pointless - write transaction. SwiftUI appears to sometimes call a Binding's set function - multiple times for a single UI action, so this results in significantly fewer - writes being performed. - -### Fixed - -* Adding an unmanaged object to a Realm that was declared with - `@StateRealmObject` would throw the exception `"Cannot add an object with - observers to a Realm"`. -* The `RealmCollectionChange` docs refered to indicies in modifications as the - 'new' collection. This is incorrect and the docs now state that modifications - refer to the previous version of the collection. ([Cocoa #7390](https://github.com/realm/realm-swift/issues/7390)) -* Fix crash in `RLMSyncConfiguration.initWithUser` error mapping when a user is disabled/deleted from MongoDB Realm dashboard. - ([Cocoa #7399](https://github.com/realm/realm-swift/issues/7399), since v10.0.0) -* If the application crashed at the wrong point when logging a user in, the - next run of the application could hit the assertion failure "m_state == - SyncUser::State::LoggedIn" when a synchronized Realm is opened with that - user. ([Core #4875](https://github.com/realm/realm-core/issues/4875), since v10.0.0) -* The `keyPaths:` parameter to `@ObservedResults` did not work (since v10.12.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 5. - -### Internal - -* Upgraded realm-core from 11.3.1 to 11.4.1 - -10.14.0 Release notes (2021-09-03) -============================================================= - -### Enhancements - -* Add additional `observe` methods for Objects and RealmCollections which take - a `PartialKeyPath` type key path parameter. -* The release package once again contains Xcode 13 binaries. -* `PersistableEnum` properties can now be indexed or used as the primary key if - the RawValue is an indexable or primary key type. - -### Fixed - -* `Map` did not conform to `Codable`. - ([Cocoa #7418](https://github.com/realm/realm-swift/pull/7418), since v10.8.0) -* Fixed "Invalid data type" assertion failure in the sync client when the - client recieved an AddColumn instruction from the server for an AnyRealmValue - property when that property already exists locally. ([Core #4873](https://github.com/realm/realm-core/issues/4873), since v10.8.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 5. - -### Internal - -* Upgraded realm-core from 11.3.0 to 11.3.1. - -10.13.0 Release notes (2021-08-26) -============================================================= - -### Enhancements - -* Sync logs now contain information about what object/changeset was being applied when the exception was thrown. - ([Core #4836](https://github.com/realm/realm-core/issues/4836)) -* Added ServiceErrorCode for wrong username/password when using '`App.login`. - ([Core #7380](https://github.com/realm/realm-swift/issues/7380) - -### Fixed - -* Fix crash in `MongoCollection.findOneDocument(filter:)` that occurred when no results were - found for a given filter. - ([Cocoa #7380](https://github.com/realm/realm-swift/issues/7380), since v10.0.0) -* Some of the SwiftUI property wrappers incorrectly required objects to conform - to ObjectKeyIdentifiable rather than Identifiable. - ([Cocoa #7372](https://github.com/realm/realm-swift/issues/7372), since v10.6.0) -* Work around Xcode 13 beta 3+ shipping a broken swiftinterface file for Combine on 32-bit iOS. - ([Cocoa #7368](https://github.com/realm/realm-swift/issues/7368)) -* Fixes history corruption when replacing an embedded object in a list. - ([Core #4845](https://github.com/realm/realm-core/issues/4845)), since v10.0.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 5. - -### Internal - -* Upgraded realm-core from 11.2.0 to 11.3.0 - -10.12.0 Release notes (2021-08-03) -============================================================= - -### Enhancements - -* `Object.observe()` and `RealmCollection.observe()` now include an optional - `keyPaths` parameter which filters change notifications to those only - occurring on the provided key path or key paths. See method documentation - for extended detail on filtering behavior. -* `ObservedResults` now includes an optional `keyPaths` parameter - which filters change notifications to those only occurring on the provided - key path or key paths. ex) `@ObservedResults(MyObject.self, keyPaths: ["myList.property"])` -* Add two new property wrappers for opening a Realm asynchronously in a - SwiftUI View: - - `AsyncOpen` is a property wrapper that initiates Realm.asyncOpen - for the current user, notifying the view when there is a change in Realm asyncOpen state. - - `AutoOpen` behaves similarly to `AsyncOpen`, but in the case of no internet - connection this will return an opened realm. -* Add `EnvironmentValues.partitionValue`. This value can be injected into any view using one of - our new property wrappers `AsyncOpen` and `AutoOpen`: - `MyView().environment(\.partitionValue, "partitionValue")`. -* Shift more of the work done when first initializing a collection notifier to - the background worker thread rather than doing it on the main thread. - -### Fixed - -* `configuration(partitionValue: AnyBSON)` would always set a nil partition value - for the user sync configuration. -* Decoding a `@Persisted` property would incorrectly throw a `DecodingError.keyNotFound` - for an optional property if the key is missing. - ([Cocoa #7358](https://github.com/realm/realm-swift/issues/7358), since v10.10.0) -* Fixed a symlink which prevented Realm from building on case sensitive file systems. - ([#7344](https://github.com/realm/realm-swift/issues/7344), since v10.8.0) -* Removing a change callback from a Results would sometimes block the calling - thread while the query for that Results was running on the background worker - thread (since v10.11.0). -* Object observers did not handle the object being deleted properly, which - could result in assertion failures mentioning "m_table" in ObjectNotifier - ([Core #4824](https://github.com/realm/realm-core/issues/4824), since v10.11.0). -* Fixed a crash when delivering notifications over a nested hierarchy of lists - of Mixed that contain links. ([Core #4803](https://github.com/realm/realm-core/issues/4803), since v10.8.0) -* Fixed a crash when an object which is linked to by a Mixed is deleted via - sync. ([Core #4828](https://github.com/realm/realm-core/pull/4828), since v10.8.0) -* Fixed a rare crash when setting a mixed link for the first time which would - trigger if the link was to the same table and adding the backlink column - caused a BPNode split. ([Core #4828](https://github.com/realm/realm-core/pull/4828), since v10.8.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 4. On iOS Xcode 13 beta 2 is the latest supported - version due to betas 3 and 4 having a broken Combine.framework. - -### Internal - -* Upgraded realm-core from v11.1.1 to v11.2.0 - -10.11.0 Release notes (2021-07-22) -============================================================= - -### Enhancements - -* Add type safe methods for: - - `RealmCollection.min(of:)` - - `RealmCollection.max(of:)` - - `RealmCollection.average(of:)` - - `RealmCollection.sum(of:)` - - `RealmCollection.sorted(by:ascending:)` - - `RealmKeyedCollection.min(of:)` - - `RealmKeyedCollection.max(of:)` - - `RealmKeyedCollection.average(of:)` - - `RealmKeyedCollection.sum(of:)` - - `RealmKeyedCollection.sorted(by:ascending:)` - - `Results.distinct(by:)` - - `SortDescriptor(keyPath:ascending:) - - Calling these methods can now be done via Swift keyPaths, like so: - ```swift - class Person: Object { - @Persisted var name: String - @Persisted var age: Int - } - - let persons = realm.objects(Person.self) - persons.min(of: \.age) - persons.max(of: \.age) - persons.average(of: \.age) - persons.sum(of: \.age) - persons.sorted(by: \.age) - persons.sorted(by: [SortDescriptor(keyPath: \Person.age)]) - persons.distinct(by: [\Person.age]) - ``` -* Add `List.objects(at indexes:)` in Swift and `[RLMCollection objectsAtIndexes:]` in Objective-C. - This allows you to select elements in a collection with a given IndexSet ([#7298](https://github.com/realm/realm-swift/issues/7298)). -* Add `App.emailPasswordAuth.retryCustomConfirmation(email:completion:)` and `[App.emailPasswordAuth retryCustomConfirmation:completion:]`. - These functions support retrying a [custom confirmation](https://docs.mongodb.com/realm/authentication/email-password/#run-a-confirmation-function) function. -* Improve performance of creating collection notifiers for Realms with a complex schema. - This means that the first run of a query or first call to observe() on a collection will - do significantly less work on the calling thread. -* Improve performance of calculating changesets for notifications, particularly - for deeply nested object graphs and objects which have List or Set properties - with small numbers of objects in the collection. - -### Fixed - -* `RealmProperty` would crash when decoding a `null` json value. - ([Cocoa #7323](https://github.com/realm/realm-swift/issues/7323), since v10.8.0) -* `@Persisted` would crash when decoding a `null` value. - ([#7332](https://github.com/realm/realm-swift/issues/7332), since v10.10.0). -* Fixed an issue where `Realm.Configuration` would be set after views have been laid out - when using `.environment(\.realmConfiguration, ...)` in SwiftUI. This would cause issues if you are - required to bump your schema version and are using `@ObservedResults`. -* Sync user profiles now correctly persist between runs. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 3. Note that this release does not contain Xcode 13 - beta binaries as beta 3 does not include a working version of - Combine.framework for iOS. - -### Internal - -* Upgraded realm-core from 11.0.4 to 11.1.1 - -10.10.0 Release notes (2021-07-07) -============================================================= - -### Enhancements - -* Add a new property wrapper-based declaration syntax for properties on Realm - Swift object classes. Rather than using `@objc dynamic` or the - `RealmProperty` wrapper type, properties can now be declared with `@Persisted - var property: T`, where `T` is any of the supported property types, including - optional numbers and collections. This has a few benefits: - - - All property types are now declared in the same way. No more remembering - that this type requires `@objc dynamic var` while this other type - requires `let`, and the `RealmProperty` or `RealmOptional` helper is no - longer needed for types not supported by Objective-C. - - No more overriding class methods like `primaryKey()`, - `indexedProperties()` or `ignoredProperties()`. The primary key and - indexed flags are set directly in the property declaration with - `@Persisted(primaryKey: true) var _id: ObjectId` or `@Persisted(indexed: - true) var indexedProperty: Int`. If any `@Persisted` properties are present, - all other properties are implicitly ignored. - - Some performance problems have been fixed. Declaring collection - properties as `let listProp = List()` resulted in the `List` object - being created eagerly when the parent object is read, which could cause - performance problems if a class has a large number of `List` or - `RealmOptional` properties. `@Persisted var list: List` allows us to - defer creating the `List` until it's accessed, improving performance - when looping over objects and using only some of the properties. - - Similarly, `let _id = ObjectId.generate()` was a convenient way to - declare a sync-compatible primary key, but resulted in new ObjectIds - being generated in some scenarios where the value would never actually be - used. `@Persisted var _id: ObjectId` has the same behavior of - automatically generating primary keys, but allows us to only generate it - when actually needed. - - More types of enums are supported. Any `RawRepresentable` enum whose raw - type is a type supported by Realm can be stored in an `@Persisted` - project, rather than just `@objc` enums. Enums must be declared as - conforming to the `PersistableEnum` protocol, and still cannot (yet) be - used in collections. - - `willSet` and `didSet` can be used with `@Persistable` properties, while - they previously did not work on managed Realm objects. - - While we expect the switch to the new syntax to be very simple for most - users, we plan to support the existing objc-based declaration syntax for the - foreseeable future. The new style and old style cannot be mixed within a - single class, but new classes can use the new syntax while existing classes - continue to use the old syntax. Updating an existing class to the new syntax - does not change what data is stored in the Realm file and so does not require - a migration (as long as you don't also change the schema in the process, of - course). -* Add `Map.merge()`, which adds the key-value pairs from another Map or - Dictionary to the map. -* Add `Map.asKeyValueSequence()` which returns an adaptor that can be used with - generic functions that operate on Dictionary-styled sequences. - -### Fixed -* AnyRealmValue enum values are now supported in more places when creating - objects. -* Declaring a property as `RealmProperty` will now report an - error during schema discovery rather than doing broken things when the - property is used. -* Observing the `invalidated` property of `RLMDictionary`/`Map` via KVO did not - set old/new values correctly in the notification (since 10.8.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 2. - -10.9.0 Release notes (2021-07-01) -============================================================= - -### Enhancements - -* Add `App.emailPasswordAuth.retryCustomConfirmation(email:completion:)` and - `[App.emailPasswordAuth retryCustomConfirmation:completion:]`. These - functions support retrying a [custom confirmation](https://docs.mongodb.com/realm/authentication/email-password/#run-a-confirmation-function) - function. -* Improve performance of many Dictionary operations, especially when KVO is being used. - -### Fixed - -* Calling `-[RLMRealm deleteObjects:]` on a `RLMDictionary` cleared the - dictionary but did not actually delete the objects in the dictionary (since v10.8.0). -* Rix an assertion failure when observing a `List` contains - object links. ([Core #4767](https://github.com/realm/realm-core/issues/4767), since v10.8.0) -* Fix an assertion failure when observing a `RLMDictionary`/`Map` which links - to an object which was deleting by a different sync client. - ([Core #4770](https://github.com/realm/realm-core/pull/4770), since v10.8.0) -* Fix an endless recursive loop that could cause a stack overflow when - computing changes on a set of objects which contained cycles. - ([Core #4770](https://github.com/realm/realm-core/pull/4770), since v10.8.0). -* Hash collisions in dictionaries were not handled properly. - ([Core #4776](https://github.com/realm/realm-core/issues/4776), since v10.8.0). -* Fix a crash after clearing a list or set of AnyRealmValue containing links to - objects ([Core #4774](https://github.com/realm/realm-core/issues/4774), since v10.8.0) -* Trying to refresh a user token which had been revoked by an admin lead to an - infinite loop and then a crash. This situation now properly logs the user out - and reports an error. ([Core #4745](https://github.com/realm/realm-core/issues/4745), since v10.0.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 2. - -### Internal - -* Upgraded realm-core from v11.0.3 to v11.0.4 - -10.8.1 Release notes (2021-06-22) -============================================================= - -### Enhancements - -* Update Xcode 12.5 to Xcode 12.5.1. -* Create fewer dynamic classes at runtime, improving memory usage and startup time slightly. - -### Fixed - -* Importing the Realm swift package produced several warnings about excluded - files not existing. Note that one warning will still remain after this change. - ([#7295](https://github.com/realm/realm-swift/issues/7295), since v10.8.0). -* Update the root URL for the API docs so that the links go to the place where - new versions of the docs are being published. - ([#7299](https://github.com/realm/realm-swift/issues/7299), since v10.6.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. Note that this version of Realm Studio has not - yet been released at the time of this release. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 1. - -10.8.0 Release notes (2021-06-14) -============================================================= - -NOTE: This version upgrades the Realm file format version to add support for -the new data types and to adjust how primary keys are handled. Realm files -opened will be automatically upgraded and cannot be read by versions older than -v10.8.0. This upgrade should be a fairly fast one. Note that we now -automatically create a backup of the pre-upgrade Realm. - -### Enhancements - -* Add support for the `UUID` and `NSUUID` data types. These types can be used - for the primary key property of Object classes. -* Add two new collection types to complement the existing `RLMArray`/`List` type: - - `RLMSet` in Objective-C and `MutableSet` in Swift are mutable - unordered collections of distinct objects, similar to the built-in - `NSMutableSet` and `Set`. The values in a set may be any non-collection - type which can be stored as a Realm property. Sets are guaranteed to never - contain two objects which compare equal to each other, including when - conflicting writes are merged by sync. - - `RLMDictionary` in Objective-C and `Map` are - mutable key-value dictionaries, similar to the built-in - `NSMutableDictionary` and `Dictionary`. The values in a dictionary may be - any non-collection type which can be stored as a Realm property. The keys - must currently always be a string. -* Add support for dynamically typed properties which can store a value of any - of the non-collection types supported by Realm, including Object subclasses - (but not EmbeddedObject subclasses). These are declared with - `@property id propertyName;` in Objective-C and - `let propertyName = RealmProperty()` in Swift. - -### Fixed - -* Setting a collection with a nullable value type to null via one of the - dynamic interfaces would hit an assertion failure instead of clearing the - collection. -* Fixed an incorrect detection of multiple incoming links in a migration when - changing a table to embedded and removing a link to it at the same time. - ([#4694](https://github.com/realm/realm-core/issues/4694) since v10.0.0-beta.2) -* Fixed a divergent merge on Set when one client clears the Set and another - client inserts and deletes objects. - ([#4720](https://github.com/realm/realm-core/issues/4720)) -* Partially revert to pre-v5.0.0 handling of primary keys to fix a performance - regression. v5.0.0 made primary keys determine the position in the low-level - table where newly added objects would be inserted, which eliminated the need - for a separate index on the primary key. This made some use patterns slightly - faster, but also made some reasonable things dramatically slower. - ([#4522](https://github.com/realm/realm-core/issues/4522)) -* Fixed an incorrect detection of multiple incoming links in a migration when - changing a table to embedded and removing a link to it at the same time. - ([#4694](https://github.com/realm/realm-core/issues/4694) since v10.0.0-beta.2) -* Fix collection notification reporting for modifications. This could be - observed by receiving the wrong indices of modifications on sorted or - distinct results, or notification blocks sometimes not being called when only - modifications have occured. - ([#4573](https://github.com/realm/realm-core/pull/4573) since v5.0.0). -* Fix incorrect sync instruction emission when replacing an existing embedded - object with another embedded object.([Core #4740](https://github.com/realm/realm-core/issues/4740) - -### Deprecations - -* `RealmOptional` has been deprecated in favor of `RealmProperty`. - `RealmProperty` is functionality identical to `RealmOptional` when storing - optional numeric types, but can also store the new `AnyRealmValue` type. - -### Compatibility - -* Realm Studio: 11.0.0 or later. Note that this version of Realm Studio has not - yet been released at the time of this release. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 1. - -### Internal - -* Upgraded realm-core from v10.7.2 to v11.0.3 - -10.8.0-beta.2 Release notes (2021-06-01) -============================================================= - -### Enhancements - -* Add `RLMDictionary`/`Map<>` datatype. This is a Dictionary collection type used for storing key-value pairs in a collection. - -### Compatibility - -* Realm Studio: 11.0.0-beta.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v11.0.0-beta.4 to v11.0.0-beta.6 - -10.8.0-beta.0 Release notes (2021-05-07) -============================================================= - -### Enhancements - -* Add `RLMSet`/`MutableSet<>` datatype. This is a Set collection type used for storing distinct values in a collection. -* Add support for `id`/`AnyRealmValue`. -* Add support for `UUID`/`NSUUID` data type. - -### Fixed - -* None. - -### Deprecations - -* `RealmOptional` has been deprecated in favor of `RealmProperty`. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.7.2 to v10.8.0-beta.5 - -10.7.7 Release notes (2021-06-10) -============================================================= - -Xcode 12.2 is now the minimum supported version. - -### Enhancements - -* Add Xcode 13 beta 1 binaries to the release package. - -### Fixed - -* Fix a runtime crash which happens in some Xcode version (Xcode < 12, reported - in Xcode 12.5), where SwiftUI is not weak linked by default. This fix only - works for Cocoapods projects. - ([#7234](https://github.com/realm/realm-swift/issues/7234) -* Fix warnings when building with Xcode 13 beta 1. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 1. - -10.7.6 Release notes (2021-05-13) -============================================================= - -### Enhancements - -* Realms opened in read-only mode can now be invalidated (although it is - unlikely to be useful to do so). - -### Fixed - -* Fix an availability warning when building Realm. The code path which gave the - warning can not currently be hit, so this did not cause any runtime problems - ([#7219](https://github.com/realm/realm-swift/issues/7219), since 10.7.3). -* Proactively check the expiry time on the access token and refresh it before - attempting to initiate a sync session. This prevents some error logs from - appearing on the client such as: "ERROR: Connection[1]: Websocket: Expected - HTTP response 101 Switching Protocols, but received: HTTP/1.1 401 - Unauthorized" ([RCORE-473](https://jira.mongodb.org/browse/RCORE-473), since v10.0.0) -* Fix a race condition which could result in a skipping notifications failing - to skip if several commits using notification skipping were made in - succession (since v5.0.0). -* Fix a crash on exit inside TableRecycler which could happen if Realms were - open on background threads when the app exited. - ([Core #4600](https://github.com/realm/realm-core/issues/4600), since v5.0.0) -* Fix errors related to "uncaught exception in notifier thread: - N5realm11KeyNotFoundE: No such object" which could happen on sycnronized - Realms if a linked object was deleted by another client. - ([JS #3611](https://github.com/realm/realm-js/issues/3611), since v10.0.0). -* Reading a link to an object which has been deleted by a different client via - a string-based interface (such as value(forKey:) or the subscript operator on - DynamicObject) could return an invalid object rather than nil. - ([Core #4687](https://github.com/realm/realm-core/pull/4687), since v10.0.0) -* Recreate the sync metadata Realm if the encryption key for it is missing from - the keychain rather than crashing. This can happen if a device is restored - from an unencrypted backup, which restores app data but not the app's - keychain entries, and results in all cached logics for sync users being - discarded but no data being lost. - [Core #4285](https://github.com/realm/realm-core/pull/4285) -* Thread-safe references can now be created for read-only Realms. - ([#5475](https://github.com/realm/realm-swift/issues/5475)). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.6.0 to v10.7.2 - -10.7.5 Release notes (2021-05-07) -============================================================= - -### Fixed - -* Iterating over frozen collections on multiple threads at the same time could - throw a "count underflow" NSInternalInconsistencyException. - ([#7237](https://github.com/realm/realm-swift/issues/7237), since v5.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. - -10.7.4 Release notes (2021-04-26) -============================================================= - -### Enhancements - -* Add Xcode 12.5 binaries to the release package. - -### Fixed - -* Add the Info.plist file to the XCFrameworks in the Carthage xcframwork - package ([#7216](https://github.com/realm/realm-swift/issues/7216), since 10.7.3). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. - -10.7.3 Release notes (2021-04-22) -============================================================= - -### Enhancements - -* Package a prebuilt XCFramework for Carthage. Carthage 0.38 and later will - download this instead of the old frameworks when using `--use-xcframeworks`. -* We now make a backup of the realm file prior to any file format upgrade. The - backup is retained for 3 months. Backups from before a file format upgrade - allows for better analysis of any upgrade failure. We also restore a backup, - if a) an attempt is made to open a realm file whith a "future" file format - and b) a backup file exist that fits the current file format. - ([Core #4166](https://github.com/realm/realm-core/pull/4166)) -* The error message when the intial steps of opening a Realm file fails is now - more descriptive. -* Make conversion of Decimal128 to/from string work for numbers with more than - 19 significant digits. This means that Decimal128's initializer which takes a - string will now never throw, as it previously threw only for out-of-bounds - values. The initializer is still marked as `throws` for - backwards compatibility. - ([#4548](https://github.com/realm/realm-core/issues/4548)) - -### Fixed - -* Adjust the header paths for the podspec to avoid accidentally finding a file - which isn't part of the pod that produced warnings when importing the - framework. ([#7113](https://github.com/realm/realm-swift/issues/7113), since 10.5.2). -* Fixed a crash that would occur when observing unmanaged Objects in multiple - views in SwiftUI. When using `@StateRealmObject` or `@ObservedObject` across - multiple views with an unmanaged object, each view would subscribe to the - object. As each view unsubscribed (generally when trailing back through the - view stack), our propertyWrappers would attempt to remove the KVOs for each - cancellation, when it should only be done once. We now correctly remove KVOs - only once. ([#7131](https://github.com/realm/realm-swift/issues/7131)) -* Fixed `isInvalidated` not returning correct value after object deletion from - Realm when using a custom schema. The object's Object Schema was not updated - when the object was added to the realm. We now correctly update the object - schema when adding it to the realm. - ([#7181](https://github.com/realm/realm-swift/issues/7181)) -* Syncing large Decimal128 values would cause "Assertion failed: cx.w[1] == 0" - ([Core #4519](https://github.com/realm/realm-core/issues/4519), since v10.0.0). -* Potential/unconfirmed fix for crashes associated with failure to memory map - (low on memory, low on virtual address space). For example - ([#4514](https://github.com/realm/realm-core/issues/4514), since v5.0.0). -* Fix assertion failures such as "!m_notifier_skip_version.version" or - "m_notifier_sg->get_version() + 1 == new_version.version" when performing - writes inside change notification callbacks. Previously refreshing the Realm - by beginning a write transaction would skip delivering notifications, leaving - things in an inconsistent state. Notifications are now delivered recursively - when needed instead. ([Cocoa #7165](https://github.com/realm/realm-swift/issues/7165)). -* Fix collection notification reporting for modifications. This could be - observed by receiving the wrong indices of modifications on sorted or - distinct results, or notification blocks sometimes not being called when only - modifications have occured. - ([#4573](https://github.com/realm/realm-core/pull/4573) since v5.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.5.5 to v10.6.0 -* Add additional debug validation to file map management that will hopefully - catch cases where we unmap something which is still in use. - -10.7.2 Release notes (2021-03-08) -============================================================= - -### Fixed - -* During integration of a large amount of data from the server, you may get - "Assertion failed: !fields.has_missing_parent_update()" - ([Core #4497](https://github.com/realm/realm-core/issues/4497), since v6.0.0) - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.5.4 to v10.5.5 - -10.7.1 Release notes (2021-03-05) -============================================================= - -### Fixed - -* Queries of the form "a.b.c == nil" would match objects where `b` is `nil` if - `c` did not have an index and did not if `c` was indexed. Both will now match - to align with NSPredicate's behavior. ([Core #4460]https://github.com/realm/realm-core/pull/4460), since 4.3.0). -* Restore support for upgrading files from file format 5 (Realm Cocoa 1.x). - ([Core #7089](https://github.com/realm/realm-swift/issues/7089), since v5.0.0) -* On 32bit devices you may get exception with "No such object" when upgrading - to v10.* ([Java #7314](https://github.com/realm/realm-java/issues/7314), since v5.0.0) -* The notification worker thread would rerun queries after every commit rather - than only commits which modified tables which could effect the query results - if the table had any outgoing links to tables not used in the query. - ([Core #4456](https://github.com/realm/realm-core/pull/4456), since v5.0.0). -* Fix "Invalid ref translation entry [16045690984833335023, 78187493520]" - assertion failure which could occur when using sync or multiple processes - writing to a single Realm file. - ([#7086](https://github.com/realm/realm-swift/issues/7086), since v5.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.5.3 to v10.5.4 - -10.7.0 Release notes (2021-02-23) -============================================================= - -### Enhancements - -* Add support for some missing query operations on data propertys: - - Data properties can be compared to other data properties - (e.g. "dataProperty1 == dataProperty2"). - - Case and diacritic-insensitive queries can be performed on data properties. - This will only have meaningful results if the data property contains UTF-8 - string data. - - Data properties on linked objects can be queried - (e.g. "link.dataProperty CONTAINS %@") -* Implement queries which filter on lists other than object links (lists of - objects were already supported). All supported operators for normal - properties are now supported for lists (e.g. "ANY intList = 5" or "ANY - stringList BEGINSWITH 'prefix'"), as well as aggregate operations on the - lists (such as "intArray.@sum > 100"). -* Performance of sorting on more than one property has been improved. - Especially important if many elements match on the first property. Mitigates - ([#7092](https://github.com/realm/realm-swift/issues/7092)) - -### Fixed - -* Fixed a bug that prevented an object type with incoming links from being - marked as embedded during migrations. ([Core #4414](https://github.com/realm/realm-core/pull/4414)) -* The Realm notification listener thread could sometimes hit the assertion - failure "!skip_version.version" if a write transaction was committed at a - very specific time (since v10.5.0). -* Added workaround for a case where upgrading an old file with illegal string - would crash ([#7111](https://github.com/realm/realm-swift/issues/7111)) -* Fixed a conflict resolution bug related to the ArrayMove instruction, which - could sometimes cause an "Invalid prior_size" exception to prevent - synchronization (since v10.5.0). -* Skipping a change notification in the first write transaction after the - observer was added could potentially fail to skip the notification (since v10.5.1). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.5.0 to v10.5.3 - -10.6.0 Release notes (2021-02-15) -============================================================= - -### Enhancements - -* Add `@StateRealmObject` for SwiftUI support. This property wrapper type instantiates an observable object on a View. - Use in place of `SwiftUI.StateObject` for Realm `Object`, `List`, and `EmbeddedObject` types. -* Add `@ObservedRealmObject` for SwiftUI support. This property wrapper type subscribes to an observable object - and invalidates a view whenever the observable object changes. Use in place of `SwiftUI.ObservedObject` for - Realm `Object`, `List`, or `EmbeddedObject` types. -* Add `@ObservedResults` for SwiftUI support. This property wrapper type retrieves results from a Realm. - The results use the realm configuration provided by the environment value `EnvironmentValues.realmConfiguration`. -* Add `EnvironmentValues.realm` and `EnvironmentValues.realmConfiguration` for `Realm` - and `Realm.Configuration` types respectively. Values can be injected into views using the `View.environment` method, e.g., `MyView().environment(\.realmConfiguration, Realm.Configuration(fileURL: URL(fileURLWithPath: "myRealmPath.realm")))`. - The value can then be declared on the example `MyView` as `@Environment(\.realm) var realm`. -* Add `SwiftUI.Binding` extensions where `Value` is of type `Object`, `List`, or `EmbeddedObject`. - These extensions expose methods for wrapped write transactions, to avoid boilerplate within - views, e.g., `TextField("name", $personObject.name)` or `$personList.append(Person())`. -* Add `Object.bind` and `EmbeddedObject.bind` for SwiftUI support. This allows you to create - bindings of realm properties when a propertyWrapper is not available for you to do so, e.g., `TextField("name", personObject.bind(\.name))`. -* The Sync client now logs error messages received from server rather than just - the size of the error message. -* Errors returned from the server when sync WebSockets get closed are now - captured and surfaced as a SyncError. -* Improve performance of sequential reads on a Results backed directly by a - Table (i.e. `realm.object(ClasSName.self)` with no filter/sort/etc.) by 50x. -* Orphaned embedded object types which are not linked to by any top-level types - are now better handled. Previously the server would reject the schema, - resulting in delayed and confusing error reporting. Explicitly including an - orphan in `objectTypes` is now immediately reported as an error when opening - the Realm, and orphans are automatically excluded from the auto-discovered - schema when `objectTypes` is not specified. - -### Fixed - -* Reading from a Results backed directly by a Table (i.e. - `realm.object(ClasSName.self)` with no filter/sort/etc.) would give incorrect - results if the Results was constructed and accessed before creating a new - object with a primary key less than the smallest primary key which previously - existed. ([#7014](https://github.com/realm/realm-swift/issues/7014), since v5.0.0). -* During synchronization you might experience crash with - "Assertion failed: ref + size <= next->first". - ([Core #4388](https://github.com/realm/realm-core/issues/4388)) - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.4.0 to v10.5.0 - -10.5.2 Release notes (2021-02-09) -============================================================= - -### Enhancements - -* Add support for "thawing" objects. `Realm`, `Results`, `List` and `Object` - now have `thaw()` methods which return a live copy of the frozen object. This - enables app behvaior where a frozen object can be made live again in order to - mutate values. For example, first freezing an object passed into UI view, - then thawing the object in the view to update values. -* Add Xcode 12.4 binaries to the release package. - -### Fixed - -* Inserting a date into a synced collection via `AnyBSON.datetime(...)` would - be of type `Timestamp` and not `Date`. This could break synced objects with a - `Date` property. - ([#6654](https://github.com/realm/realm-swift/issues/6654), since v10.0.0). -* Fixed an issue where creating an object after file format upgrade may fail - with assertion "Assertion failed: lo() <= std::numeric_limits::max()" - ([#4295](https://github.com/realm/realm-core/issues/4295), since v5.0.0) -* Allow enumerating objects in migrations with types which are no longer - present in the schema. -* Add `RLMResponse.customStatusCode`. This fixes timeout exceptions that were - occurring with a poor connection. ([#4188](https://github.com/realm/realm-core/issues/4188)) -* Limit availability of ObjectKeyIdentifiable to platforms which support - Combine to match the change made in the Xcode 12.5 SDK. - ([#7083](https://github.com/realm/realm-swift/issues/7083)) - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.3.3 to v10.4.0 - -10.5.1 Release notes (2021-01-15) -============================================================= - -### Enhancements - -* Add Xcode 12.3 binary to release package. -* Add support for queries which have nil on the left side and a keypath on the - right side (e.g. "nil == name" rather than "name == nil" as was previously - required). - -### Fixed -* Timeouts when calling server functions via App would sometimes crash rather - than report an error. -* Fix a race condition which would lead to "uncaught exception in notifier - thread: N5realm15InvalidTableRefE: transaction_ended" and a crash when the - source Realm was closed or invalidated at a very specific time during the - first run of a collection notifier - ([#3761](https://github.com/realm/realm-core/issues/3761), since v5.0.0). -* Deleting and recreating objects with embedded objects may fail. - ([Core PR #4240](https://github.com/realm/realm-core/pull/4240), since v10.0.0) -* Fast-enumerating a List after deleting the parent object would crash with an - assertion failure rather than a more appropriate exception. - ([Core #4114](https://github.com/realm/realm-core/issues/4114), since v5.0.0). -* Fix an issue where calling a MongoDB Realm Function would never be performed as the reference to the weak `User` was lost. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.3. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.3.2 to v10.3.3 - -10.5.0 Release notes (2020-12-14) -============================================================= - -### Enhancements - -* MongoDB Realm is now supported when installing Realm via Swift Package Manager. - -### Fixed - -* The user identifier was added to the file path for synchronized Realms twice - and an extra level of escaping was performed on the partition value. This did - not cause functional problems, but made file names more confusing than they - needed to be. Existing Realm files will continue to be located at the old - path, while newly created files will be created at a shorter path. (Since v10.0.0). -* Fix a race condition which could potentially allow queries on frozen Realms - to access an uninitialized structure for search indexes (since v5.0.0). -* Fix several data races in App and SyncSession initialization. These could - possibly have caused strange errors the first time a synchronized Realm was - opened (since v10.0.0). -* Fix a use of a dangling reference when refreshing a user’s custom data that - could lead to a crash (since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.1.4 to v10.3.2 - -10.4.0 Release notes (2020-12-10) -============================================================= - -### Enhancements - -* Add Combine support for App and User. These two types now have a - `objectWillChange` property that emits each time the state of the object has - changed (such as due to the user logging in or out). ([PR #6977](https://github.com/realm/realm-swift/pull/6977)). - -### Fixed - -* Integrating changesets from the server would sometimes hit the assertion - failure "n != realm::npos" inside Table::create_object_with_primary_key() - when creating an object with a primary key which previously had been used and - had incoming links. ([Core PR #4180](https://github.com/realm/realm-core/pull/4180), since v10.0.0). -* The arm64 simulator slices were not actually included in the XCFramework - release package. ([PR #6982](https://github.com/realm/realm-swift/pull/6982), since v10.2.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.1.3 to v10.1.4 -* Upgraded realm-sync from v10.1.4 to v10.1.5 - -10.3.0 Release notes (2020-12-08) -============================================================= - -### Enhancements - -* Add Google OpenID Connect Credentials, an alternative login credential to the - Google OAuth 2.0 credential. - -### Fixed - -* Fixed a bug that would prevent eventual consistency during conflict - resolution. Affected clients would experience data divergence and potentially - consistency errors as a result if they experienced conflict resolution - between cycles of Create-Erase-Create for objects with primary keys (since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-sync from v10.1.3 to v10.1.4 - -10.2.0 Release notes (2020-12-02) -============================================================= - -### Enhancements - -* The prebuilt binaries are now packaged as XCFrameworks. This adds support for - Catalyst and arm64 simulators when using them to install Realm, removes the - need for the strip-frameworks build step, and should simplify installation. -* The support functionality for using the Objective C API from Swift is now - included in Realm Swift and now includes all of the required wrappers for - MongoDB Realm types. In mixed Objective C/Swift projects, we recommend - continuing to use the Objective C types, but import both Realm and RealmSwift - in your Swift files. - -### Fixed - -* The user identifier was added to the file path for synchronized Realms twice - and an extra level of escaping was performed on the partition value. This did - not cause functional problems, but made file names more confusing than they - needed to be. Existing Realm files will continue to be located at the old - path, while newly created files will be created at a shorter path. (Since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -10.1.4 Release notes (2020-11-16) -============================================================= - -### Enhancements - -* Add arm64 slices to the macOS builds. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.0.1 to v10.1.3 -* Upgraded realm-sync from v10.0.1 to v10.1.3 - -10.1.3 Release notes (2020-11-13) -============================================================= - -### Enhancements - -* Add Xcode 12.2 binaries to the release package. - -### Fixed - -* Disallow setting - `RLMRealmConfiguration.deleteRealmIfMigrationNeeded`/`Realm.Config.deleteRealmIfMigrationNeeded` - when sync is enabled. This did not actually work as it does not delete the - relevant server state and broke in confusing ways ([PR #6931](https://github.com/realm/realm-swift/pull/6931)). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.1. -* CocoaPods: 1.10 or later. - -10.1.2 Release notes (2020-11-06) -============================================================= - -### Enhancements - -* Some error states which previously threw a misleading "NoSuchTable" exception - now throw a more descriptive exception. - -### Fixed - -* One of the Swift packages did not have the minimum deployment target set, - resulting in errors when archiving an app which imported Realm via SPM. -* Reenable filelock emulation on watchOS so that the OS does not kill the app - when it is suspended while a Realm is open on watchOS 7 ([#6861](https://github.com/realm/realm-swift/issues/6861), since v5.4.8 -* Fix crash in case insensitive query on indexed string columns when nothing - matches ([#6836](https://github.com/realm/realm-swift/issues/6836), since v5.0.0). -* Null values in a `List` or `List` were incorrectly treated - as non-null in some places. It is unknown if this caused any functional - problems when using the public API. ([Core PR #3987](https://github.com/realm/realm-core/pull/3987), since v5.0.0). -* Deleting an entry in a list in two different clients could end deleting the - wrong entry in one client when the changes are merged (since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.1. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.0.0 to v10.1.1 -* Upgraded realm-sync from v10.0.0 to v10.1.1 - -10.1.1 Release notes (2020-10-27) -============================================================= - -### Enhancements - -* Set the minimum CocoaPods version in the podspec so that trying to install - with older versions gives a more useful error ([PR #6892](https://github.com/realm/realm-swift/pull/6892)). - -### Fixed - -* Embedded objects could not be marked as `ObjectKeyIdentifable` - ([PR #6890](https://github.com/realm/realm-swift/pull/6890), since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.1. -* CocoaPods: 1.10 or later. - -10.1.0 Release notes (2020-10-22) -============================================================= - -CocoaPods 1.10 or later is now required to install Realm. - -### Enhancements - -* Throw an exception for Objects that have none of its properties marked with @objc. -* Mac Catalyst and arm64 simulators are now supported when integrating via Cocoapods. -* Add Xcode 12.1 binaries to the release package. -* Add Combine support for `Realm.asyncOpen()`. - -### Fixed - -* Implement precise and unbatched notification of sync completion events. This - avoids a race condition where an earlier upload completion event will notify - a later waiter whose changes haven't been uploaded yet. - ([#1118](https://github.com/realm/realm-object-store/pull/1118)). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.1. - -10.0.0 Release notes (2020-10-16) -============================================================= - -This release is functionally identical to v10.0.0-rc.2. - -NOTE: This version upgrades the Realm file format version to add support for -new data types. Realm files opened will be automatically upgraded and cannot be -read by versions older than v10.0.0. - -### Breaking Changes - -* Rename Realm.Publishers to RealmPublishers to avoid confusion with Combine.Publishers. -* Remove `[RLMSyncManager shared]`. This is now instatiated as a property on App/RLMApp. -* `RLMSyncManager.pinnedCertificatePaths` has been removed. -* Classes `RLMUserAccountInfo` & `RLMUserInfo` (swift: `UserInfo`, `UserAccountInfo`) have been removed. -* `RLMSyncUser`/`SyncUser` has been renamed to `RLMUser`/`User`. -* We no longer support Realm Cloud (legacy), but instead the new "MongoDB - Realm" Cloud. MongoDB Realm is a serverless platform that enables developers - to quickly build applications without having to set up server infrastructure. - MongoDB Realm is built on top of MongoDB Atlas, automatically integrating the - connection to your database. -* Remove support for Query-based sync, including the configuration parameters - and the `RLMSyncSubscription` and `SyncSubscription` types ([#6437](https://github.com/realm/realm-swift/pull/6437)). -* Remove everything related to sync permissions, including both the path-based - permission system and the object-level privileges for query-based sync. - Permissions are now configured via MongoDB Atlas. - ([#6445](https://github.com/realm/realm-swift/pulls/6445)) -* Remove support for Realm Object Server. -* Non-embedded objects in synchronized Realms must always have a primary key - named "_id". -* All Swift callbacks for asynchronous operations which can fail are now passed - a `Result` parameter instead of two separate `Value?` and - `Error?` parameters. - -### Enhancements - -* Add support for next generation sync. Support for syncing to MongoDB instead - of Realm Object Server. Applications must be created at realm.mongodb.com -* The memory mapping scheme for Realm files has changed to better support - opening very large files. -* Add support for the ObjectId data type. This is an automatically-generated - unique identifier similar to a GUID or a UUID. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for the Decimal128 data type. This is a 128-bit IEEE 754 decimal - floating point number similar to NSDecimalNumber. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for embedded objects. Embedded objects are objects which are - owned by a single parent object, and are deleted when that parent object is - deleted. They are defined by subclassing `EmbeddedObject` / - `RLMEmbeddedObject` rather than `Object` / `RLMObject`. -* Add `-[RLMUser customData]`/`User.customData`. Custom data is - configured in your MongoDB Realm App. -* Add `-[RLMUser callFunctionNamed:arguments:completion:]`/`User.functions`. - This is the entry point for calling Remote MongoDB Realm functions. Functions - allow you to define and execute server-side logic for your application. - Functions are written in modern JavaScript (ES6+) and execute in a serverless - manner. When you call a function, you can dynamically access components of - the current application as well as information about the request to execute - the function and the logged in user that sent the request. -* Add `-[RLMUser mongoClientWithServiceName:]`/`User.mongoClient`. This is - the entry point for calling your Remote MongoDB Service. The read operations - are `-[RLMMongoCollection findWhere:completion:]`, `-[RLMMongoCollection - countWhere:completion:]`and `-[RLMMongoCollection - aggregateWithPipeline:completion:]`. The write operations are - `-[RLMMongoCollection insertOneDocument:completion:]`, `-[RLMMongoCollection - insertManyDocuments:completion:]`, `-[RLMMongoCollection - updateOneDocument:completion:]`, `-[RLMMongoCollection - updateManyDocuments:completion:]`, `-[RLMMongoCollection - deleteOneDocument:completion:]`, and `-[RLMMongoCollection - deleteManyDocuments:completion:]`. If you are already familiar with MongoDB - drivers, it is important to understand that the remote MongoCollection only - provides access to the operations available in MongoDB Realm. -* Obtaining a Realm configuration from a user is now done with `[RLMUser - configurationWithPartitionValue:]`/`User.configuration(partitionValue:)`. - Partition values can currently be of types `String`, `Int`, or `ObjectId`, - and fill a similar role to Realm URLs did with Realm Cloud. The main - difference is that partitions are meant to be more closely associated with - your data. For example, if you are running a `Dog` kennel, and have a field - `breed` that acts as your partition key, you could open up realms based on - the breed of the dogs. -* Add ability to stream change events on a remote MongoDB collection with - `[RLMMongoCollection watch:delegate:delegateQueue:]`, - `MongoCollection.watch(delegate:)`. When calling `watch(delegate:)` you will be - given a `RLMChangeStream` (`ChangeStream`) which can be used to end watching - by calling `close()`. Change events can also be streamed using the - `MongoCollection.watch` Combine publisher that will stream change events each - time the remote MongoDB collection is updated. -* Add the ability to listen for when a Watch Change Stream is opened when using - Combine. Use `onOpen(event:)` directly after opening a `WatchPublisher` to - register a callback to be invoked once the change stream is opened. -* Objects with integer primary keys no longer require a separate index for the -* primary key column, improving insert performance and slightly reducing file - size. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* Carthage release for Swift is built with Xcode 12 - -### Internal - -* Upgraded realm-core from v6.1.4 to v10.0.0 -* Upgraded realm-sync from v5.0.29 to v10.0.0 - -10.0.0-rc.2 Release notes (2020-10-15) -============================================================= - -### Enhancements - -* Add the ability to listen for when a Watch Change Stream is opened when using - Combine. Use `onOpen(event:)` directly after opening a `WatchPublisher` to - register a callback to be invoked once the change stream is opened. - -### Breaking Changes - -* The insert operations on Mongo collections now report the inserted documents' - IDs as BSON rather than ObjectId. -* Embedded objects can no longer form cycles at the schema level. For example, - type A can no longer have an object property of type A, or an object property - of type B if type B links to type A. This was always rejected by the server, - but previously was allowed in non-synchronized Realms. -* Primary key properties are once again marked as being indexed. This reflects - an internal change to how primary keys are handled that should not have any - other visible effects. -* Change paired return types from Swift completion handlers to return `Result`. -* Adjust how RealmSwift.Object is defined to add support for Swift Library - Evolution mode. This should normally not have any effect, but you may need to - add `override` to initializers of object subclasses. -* Add `.null` type to AnyBSON. This creates a distinction between null values - and properly absent BSON types. - -### Fixed - -* Set the precision correctly when serializing doubles in extended json. -* Reading the `objectTypes` array from a Realm Configuration would not include - the embedded object types which were set in the array. -* Reject loops in embedded objects as part of local schema validation rather - than as a server error. -* Although MongoClient is obtained from a User, it was actually using the - User's App's current user rather than the User it was obtained from to make - requests. - - -This release also contains the following changes from 5.4.7 - 5.5.0 - -### Enhancements - -* Add the ability to capture a NotificationToken when using a Combine publisher - that observes a Realm Object or Collection. The user will call - `saveToken(on:at:)` directly after invoking the publisher to use the feature. - -### Fixed - -* When using `Realm.write(withoutNotifying:)` there was a chance that the - supplied observation blocks would not be skipped when in a write transaction. - ([Object Store #1103](https://github.com/realm/realm-object-store/pull/1103)) -* Comparing two identical unmanaged `List<>`/`RLMArray` objects would fail. - ([#5665](https://github.com/realm/realm-swift/issues/5665)). -* Case-insensitive equality queries on indexed string properties failed to - clear some internal state when rerunning the query. This could manifest as - duplicate results or "key not found" errors. - ([#6830](https://github.com/realm/realm-swift/issues/6830), [#6694](https://github.com/realm/realm-swift/issues/6694), since 5.0.0). -* Equality queries on indexed string properties would sometimes throw "key not - found" exceptions if the hash of the string happened to have bit 62 set. - ([.NET #2025](https://github.com/realm/realm-dotnet/issues/2025), since v5.0.0). -* Queries comparing non-optional int properties to nil would behave as if they - were comparing against zero instead (since v5.0.0). - -### Compatibility - -* File format: Generates Realms with format v12 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v10.0.0-beta.9 to v10.0.0 -* Upgraded realm-sync from v10.0.0-beta.14 to v10.0.0 - -10.0.0-rc.1 Release notes (2020-10-01) -============================================================= - -### Breaking Changes - -* Change the following methods on RLMUser to properties: - - `[RLMUser emailPasswordAuth]` => `RLMUser.emailPasswordAuth` - - `[RLMUser identities]` => `RLMUser.identities` - - `[RLMUser allSessions]` => `RLMUser.allSessions` - - `[RLMUser apiKeysAuth]` => `RLMUser.apiKeysAuth` -* Other changes to RLMUser: - - `nullable` has been removed from `RLMUser.identifier` - - `nullable` has been removed from `RLMUser.customData` -* Change the following methods on RLMApp to properties: - - `[RLMApp allUsers]` => `RLMApp.allUsers` - - `[RLMApp currentUser]` => `RLMApp.currentUser` - - `[RLMApp emailPasswordAuth]` => `RLMApp.emailPasswordAuth` -* Define `RealmSwift.Credentials` as an enum instead of a `typealias`. Example - usage has changed from `Credentials(googleAuthCode: "token")` to - `Credentials.google(serverAuthCode: "serverAuthCode")`, and - `Credentials(facebookToken: "token")` to `Credentials.facebook(accessToken: "accessToken")`, etc. -* Remove error parameter and redefine payload in - `+ (instancetype)credentialsWithFunctionPayload:(NSDictionary *)payload error:(NSError **)error;`. - It is now defined as `+ (instancetype)credentialsWithFunctionPayload:(NSDictionary> *)payload;` - -### Compatibility - -* File format: Generates Realms with format v12 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12. - -10.0.0-beta.6 Release notes (2020-09-30) -============================================================= - -### Breaking Changes - -* Change Google Credential parameter names to better reflect the required auth code: - - `Credentials(googleToken:)` => `Credentials(googleAuthCode:)` - - `[RLMCredentials credentialsWithGoogleToken:]` => `[RLMCredentials credentialsWithGoogleAuthCode:]` -* Rename Realm.Publishers to RealmPublishers to avoid confusion with Combine.Publishers - -### Fixed - -* Deleting objects could sometimes change the ObjectId remaining objects from - null to ObjectId("deaddeaddeaddeaddeaddead") when there are more than 1000 - objects. (Since v10.0.0-alpha.1) -* Fixed an assertion failure when adding an index to a nullable ObjectId - property that contains nulls. (since v10.0.0-alpha.1). - -This release also contains the following changes from 5.4.0 - 5.4.6: - -### Enhancements - -* Add prebuilt binary for Xcode 11.7 to the release package. -* Add prebuilt binary for Xcode 12 to the release package. -* Improve the asymtotic performance of NOT IN queries on indexed properties. It - is now O(Number of Rows) rather than O(Number of Rows \* Number of values in IN clause.) -* Slightly (<5%) improve the performance of most operations which involve - reading from a Realm file. - -### Fixed - -* Upgrading pre-5.x files with string primary keys would result in a file where - `realm.object(ofType:forPrimaryKey:)` would fail to find the object. - ([#6716](https://github.com/realm/realm-swift/issues/6716), since 5.2.0) -* A write transaction which modifies an object with more than 16 managed - properties and causes the Realm file to grow larger than 2 GB could cause an - assertion failure mentioning "m_has_refs". ([JS #3194](https://github.com/realm/realm-js/issues/3194), since 5.0.0). -* Objects with more than 32 properties could corrupt the Realm file and result - in a variety of crashes. ([Java #7057](https://github.com/realm/realm-java/issues/7057), since 5.0.0). -* Fix deadlocks when opening a Realm file in both the iOS simulator and Realm - Studio ([#6743](https://github.com/realm/realm-swift/issues/6743), since 5.3.6). -* Fix Springboard deadlocking when an app is unsuspended while it has an open - Realm file which is stored in an app group on iOS 10-12 - ([#6749](https://github.com/realm/realm-swift/issues/6749), since 5.3.6). -* If you use encryption your application cound crash with a message like - "Opening Realm files of format version 0 is not supported by this version of - Realm". ([#6889](https://github.com/realm/realm-java/issues/6889) among others, since 5.0.0) -* Confining a Realm to a serial queue would throw an error claiming that the - queue was not a serial queue on iOS versions older than 12. - ([#6735](https://github.com/realm/realm-swift/issues/6735), since 5.0.0). -* Results would sometimes give stale results inside a write transaction if a - write which should have updated the Results was made before the first access - of a pre-existing Results object. - ([#6721](https://github.com/realm/realm-swift/issues/6721), since 5.0.0) -* Fix Archiving the Realm and RealmSwift frameworks with Xcode 12. - ([#6774](https://github.com/realm/realm-swift/issues/6774)) -* Fix compilation via Carthage when using Xcode 12 ([#6717](https://github.com/realm/realm-swift/issues/6717)). -* Fix a crash inside `realm::Array(Type)::init_from_mem()` which would - sometimes occur when running a query over links immediately after creating - objects of the queried type. - ([#6789](https://github.com/realm/realm-swift/issues/6789) and possibly others, since 5.0.0). -* Possibly fix problems when changing the type of the primary key of an object - from optional to non-optional. -* Rerunning a equality query on an indexed string property would give incorrect - results if a previous run of the query matched multiple objects and it now - matches one object. This could manifest as either finding a non-matching - object or a "key not found" exception being thrown. - ([#6536](https://github.com/realm/realm-swift/issues/6536), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v12 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v10.0.0-beta.7 to v10.0.0-beta.9 -* Upgraded realm-sync from v10.0.0-beta.11 to v10.0.0-beta.14 - -10.0.0-beta.5 Release notes (2020-09-15) -============================================================= - -### Enhancements - -* Add `User.loggedIn`. -* Add support for multiple Realm Apps. -* Remove `[RLMSyncManager shared]`. This is now instatiated as a property on - the app itself. -* Add Combine support for: - * PushClient - * APIKeyAuth - * User - * MongoCollection - * EmailPasswordAuth - * App.login - -### Fixed - -* Fix `MongoCollection.watch` to consistently deliver events on a given queue. -* Fix `[RLMUser logOutWithCompletion]` and `User.logOut` to now log out the - correct user. -* Fix crash on startup on iOS versions older than 13 (since v10.0.0-beta.3). - -### Breaking Changes - -* `RLMSyncManager.pinnedCertificatePaths` has been removed. -* Classes `RLMUserAccountInfo` & `RLMUserInfo` (swift: `UserInfo`, - `UserAccountInfo`) have been removed. -* The following functionality has been renamed to align Cocoa with the other - Realm SDKs: - -| Old API | New API | -|:-------------------------------------------------------------|:---------------------------------------------------------------| -| `RLMUser.identity` | `RLMUser.identifier` | -| `User.identity` | `User.id` | -| `-[RLMCredentials credentialsWithUsername:password:]` | `-[RLMCredentials credentialsWithEmail:password:]` | -| `Credentials(username:password:)` | `Credentials(email:password:)` | -| -`[RLMUser apiKeyAuth]` | `-[RLMUser apiKeysAuth]` | -| `User.apiKeyAuth()` | `User.apiKeysAuth()` | -| `-[RLMEmailPasswordAuth registerEmail:password:completion:]` | `-[RLMEmailPasswordAuth registerUserWithEmail:password:completion:]` | -| `App.emailPasswordAuth().registerEmail(email:password:)` | `App.emailPasswordAuth().registerUser(email:password:)` | - -### Compatibility - -* File format: Generates Realms with format v12 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v10.0.0-beta.6 to v10.0.0-beta.7 -* Upgraded realm-sync from v10.0.0-beta.10 to v10.0.0-beta.11 - -10.0.0-beta.4 Release notes (2020-08-28) -============================================================= - -### Enhancements - -* Add support for the 64-bit watchOS simulator added in Xcode 12. -* Add ability to stream change events on a remote MongoDB collection with - `[RLMMongoCollection watch:delegate:delegateQueue]`, - `MongoCollection.watch(delegate)`. When calling `watch(delegate)` you will be - given a `RLMChangeStream` (`ChangeStream`), this will be used to invalidate - and stop the streaming session by calling `[RLMChangeStream close]` - (`ChangeStream.close()`) when needed. -* Add `MongoCollection.watch`, which is a Combine publisher that will stream - change events each time the remote MongoDB collection is updated. -* Add ability to open a synced Realm with a `nil` partition value. - -### Fixed - -* Realm.Configuration.objectTypes now accepts embedded objects -* Ports fixes from 5.3.5 - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the v10.0.0-beta.x series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v10.0.0-beta.1 to v10.0.0-beta.6 -* Upgraded realm-sync from v10.0.0-beta.2 to v10.0.0-beta.10 - -10.0.0-beta.3 Release notes (2020-08-17) -============================================================= - -This release also contains all changes from 5.3.2. - -### Breaking Changes -* The following classes & aliases have been renamed to align Cocoa with the other Realm SDKs: - -| Old API | New API | -|:------------------------------------------------------------|:---------------------------------------------------------------| -| `RLMSyncUser` | `RLMUser` | -| `SyncUser` | `User` | -| `RLMAppCredential` | `RLMCredential` | -| `AppCredential` | `Credential` | -| `RealmApp` | `App` | -| `RLMUserAPIKeyProviderClient` | `RLMAPIKeyAuth` | -| `RLMUsernamePasswordProviderClient` | `RLMEmailPasswordAuth` | -| `UsernamePasswordProviderClient` | `EmailPasswordAuth` | -| `UserAPIKeyProviderClient` | `APIKeyAuth` | - -* The following functionality has also moved to the User - -| Old API | New API | -|:-------------------------------------------------------------|:--------------------------------------------------------------| -| `[RLMApp callFunctionNamed:]` | `[RLMUser callFunctionNamed:]` | -| `App.functions` | `User.functions` | -| `[RLMApp mongoClientWithServiceName:]` | `[RLMUser mongoClientWithServiceName:]` | -| `App.mongoClient(serviceName)` | `User.mongoClient(serviceName)` | -| `[RLMApp userAPIKeyProviderClient]` | `[RLMUser apiKeyAuth]` | -| `App.userAPIKeyProviderClient` | `App.apiKeyAuth()` | -| `[RLMApp logOut:]` | `[RLMUser logOut]` | -| `App.logOut(user)` | `User.logOut()` | -| `[RLMApp removeUser:]` | `[RLMUser remove]` | -| `App.remove(user)` | `User.remove()` | -| `[RLMApp linkUser:credentials:]` | `[RLMUser linkWithCredentials:]` | -| `App.linkUser(user, credentials)` | `User.link(credentials)` | - -* `refreshCustomData()` on User now returns void and passes the custom data to the callback on success. - -### Compatibility -* This release introduces breaking changes w.r.t some sync classes and MongoDB Realm Cloud functionality. -(See the breaking changes section for the full list) -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* Carthage release for Swift is built with Xcode 11.5. - -10.0.0-beta.2 Release notes (2020-06-09) -============================================================= -Xcode 11.3 and iOS 9 are now the minimum supported versions. - -### Enhancements -* Add support for building with Xcode 12 beta 1. watchOS currently requires - removing x86_64 from the supported architectures. Support for the new 64-bit - watch simulator will come in a future release. - -### Fixed -* Opening a SyncSession with LOCAL app deployments would not use the correct endpoints. -* Linking from embedded objects to top-level objects was incorrectly disallowed. -* Opening a Realm file in file format v6 (created by Realm Cocoa versions - between 2.4 and 2.10) would crash. (Since 5.0.0, [Core #3764](https://github.com/realm/realm-core/issues/3764)). -* Upgrading v9 (pre-5.0) Realm files would create a redundant search index for - primary key properties. This index would then be removed the next time the - Realm was opened, resulting in some extra i/o in the upgrade process. - (Since 5.0.0, [Core #3787](https://github.com/realm/realm-core/issues/3787)). -* Fixed a performance issue with upgrading v9 files with search indexes on - non-primary-key properties. (Since 5.0.0, [Core #3767](https://github.com/realm/realm-core/issues/3767)). - -### Compatibility -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 - -10.0.0-beta.1 Release notes (2020-06-08) -============================================================= - -NOTE: This version bumps the Realm file format to version 11. It is not -possible to downgrade to earlier versions. Older files will automatically be -upgraded to the new file format. Only [Realm Studio -10.0.0](https://github.com/realm/realm-studio/releases/tag/v10.0.0-beta.1) or -later will be able to open the new file format. - -### Enhancements - -* Add support for next generation sync. Support for syncing to MongoDB instead - of Realm Object Server. Applications must be created at realm.mongodb.com -* The memory mapping scheme for Realm files has changed to better support - opening very large files. -* Add support for the ObjectId data type. This is an automatically-generated - unique identifier similar to a GUID or a UUID. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for the Decimal128 data type. This is a 128-bit IEEE 754 decimal - floating point number similar to NSDecimalNumber. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for embedded objects. Embedded objects are objects which are - owned by a single parent object, and are deleted when that parent object is - deleted. They are defined by subclassing `EmbeddedObject` / - `RLMEmbeddedObject` rather than `Object` / `RLMObject`. -* Add `-[RLMSyncUser customData]`/`SyncUser.customData`. Custom data is - configured in your MongoDB Realm App. -* Add `-[RLMApp callFunctionNamed:arguments]`/`RealmApp.functions`. This is the - entry point for calling Remote MongoDB Realm functions. Functions allow you - to define and execute server-side logic for your application. Functions are - written in modern JavaScript (ES6+) and execute in a serverless manner. When - you call a function, you can dynamically access components of the current - application as well as information about the request to execute the function - and the logged in user that sent the request. -* Add `-[RLMApp mongoClientWithServiceName]`/`RealmApp.mongoClient`. This is - the entry point for calling your Remote MongoDB Service. The read operations - are `-[RLMMongoCollection findWhere:completion:]`, `-[RLMMongoCollection - countWhere:completion:]`and `-[RLMMongoCollection - aggregateWithPipeline:completion:]`. The write operations are - `-[RLMMongoCollection insertOneDocument:completion:]`, `-[RLMMongoCollection - insertManyDocuments:completion:]`, `-[RLMMongoCollection - updateOneDocument:completion:]`, `-[RLMMongoCollection - updateManyDocuments:completion:]`, `-[RLMMongoCollection - deleteOneDocument:completion:]`, and `-[RLMMongoCollection - deleteManyDocuments:completion:]`. If you are already familiar with MongoDB - drivers, it is important to understand that the remote MongoCollection only - provides access to the operations available in MongoDB Realm. -* Change `[RLMSyncUser - configurationWithPartitionValue:]`/`SyncUser.configuration(with:)` to accept - all BSON types. Partition values can currently be of types `String`, `Int`, - or `ObjectId`. Opening a realm by partition value is the equivalent of - previously opening a realm by URL. In this case, partitions are meant to be - more closely associated with your data. E.g., if you are running a `Dog` - kennel, and have a field `breed` that acts as your partition key, you could - open up realms based on the breed of the dogs. - -### Breaking Changes - -* We no longer support Realm Cloud (legacy), but instead the new "MongoDB - Realm" Cloud. MongoDB Realm is a serverless platform that enables developers - to quickly build applications without having to set up server infrastructure. - MongoDB Realm is built on top of MongoDB Atlas, automatically integrating the - connection to your database. -* Remove support for Query-based sync, including the configuration parameters - and the `RLMSyncSubscription` and `SyncSubscription` types ([#6437](https://github.com/realm/realm-swift/pull/6437)). -* Primary key properties are no longer marked as being indexed. This reflects - an internal change to how primary keys are handled that should not have any - other visible effects. ([#6440](https://github.com/realm/realm-swift/pull/6440)). -* Remove everything related to sync permissions, including both the path-based - permission system and the object-level privileges for query-based sync. ([#6445](https://github.com/realm/realm-swift/pulls/6445)) -* Primary key uniqueness is now enforced when creating new objects during - migrations, rather than only at the end of migrations. Previously new objects - could be created with duplicate primary keys during a migration as long as - the property was changed to a unique value before the end of the migration, - but now a unique value must be supplied when creating the object. -* Remove support for Realm Object Server. - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 - -5.5.0 Release notes (2020-10-12) -============================================================= - -### Enhancements - -* Add the ability to capture a NotificationToken when using a Combine publisher - that observes a Realm Object or Collection. The user will call - `saveToken(on:at:)` directly after invoking the publisher to use the feature. - -### Fixed - -* When using `Realm.write(withoutNotifying:)` there was a chance that the - supplied observation blocks would not be skipped when in a write transaction. - ([Object Store #1103](https://github.com/realm/realm-object-store/pull/1103)) -* Comparing two identical unmanaged `List<>`/`RLMArray` objects would fail. - ([#5665](https://github.com/realm/realm-swift/issues/5665)). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -5.4.8 Release notes (2020-10-05) -============================================================= - -### Fixed - -* Case-insensitive equality queries on indexed string properties failed to - clear some internal state when rerunning the query. This could manifest as - duplicate results or "key not found" errors. - ([#6830](https://github.com/realm/realm-swift/issues/6830), [#6694](https://github.com/realm/realm-swift/issues/6694), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v6.1.3 to v6.1.4 -* Upgraded realm-sync from v5.0.28 to v5.0.29 - -5.4.7 Release notes (2020-09-30) -============================================================= - -### Fixed - -* Equality queries on indexed string properties would sometimes throw "key not - found" exceptions if the hash of the string happened to have bit 62 set. - ([.NET #2025](https://github.com/realm/realm-dotnet/issues/2025), since v5.0.0). -* Queries comparing non-optional int properties to nil would behave as if they - were comparing against zero instead (since v5.0.0). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v6.1.2 to v6.1.3 -* Upgraded realm-sync from v5.0.27 to v5.0.28 - -5.4.6 Release notes (2020-09-29) -============================================================= - -5.4.5 failed to actually update the core version for installation methods other -than SPM. All changes listed there actually happened in this version for -non-SPM installation methods. - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-sync from v5.0.26 to v5.0.27 - -5.4.5 Release notes (2020-09-28) -============================================================= - -### Enhancements - -* Slightly (<5%) improve the performance of most operations which involve - reading from a Realm file. - -### Fixed - -* Rerunning a equality query on an indexed string property would give incorrect - results if a previous run of the query matched multiple objects and it now - matches one object. This could manifest as either finding a non-matching - object or a "key not found" exception being thrown. - ([#6536](https://github.com/realm/realm-swift/issues/6536), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v6.1.1 to v6.1.2 -* Upgraded realm-sync from v5.0.25 to v5.0.26 - -5.4.4 Release notes (2020-09-25) -============================================================= - -### Enhancements -* Improve the asymtotic performance of NOT IN queries on indexed properties. It - is now O(Number of Rows) rather than O(Number of Rows \* Number of values in IN clause.) - -### Fixed - -* Fix a crash inside `realm::Array(Type)::init_from_mem()` which would - sometimes occur when running a query over links immediately after creating - objects of the queried type. - ([#6789](https://github.com/realm/realm-swift/issues/6789) and possibly others, since 5.0.0). -* Possibly fix problems when changing the type of the primary key of an object - from optional to non-optional. - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v6.0.26 to v6.1.1 -* Upgraded realm-sync from v5.0.23 to v5.0.25 - -5.4.3 Release notes (2020-09-21) -============================================================= - -### Fixed - -* Fix compilation via Carthage when using Xcode 12 ([#6717](https://github.com/realm/realm-swift/issues/6717)). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.12 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -5.4.2 Release notes (2020-09-17) -============================================================= - -### Enhancements - -* Add prebuilt binary for Xcode 12 to the release package. - -### Fixed - -* Fix Archiving the Realm and RealmSwift frameworks with Xcode 12. - ([#6774](https://github.com/realm/realm-swift/issues/6774)) - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.12 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -5.4.1 Release notes (2020-09-16) -============================================================= - -### Enhancements - -* Add prebuilt binary for Xcode 11.7 to the release package. - -### Fixed - -* Fix deadlocks when opening a Realm file in both the iOS simulator and Realm - Studio ([#6743](https://github.com/realm/realm-swift/issues/6743), since 5.3.6). -* Fix Springboard deadlocking when an app is unsuspended while it has an open - Realm file which is stored in an app group on iOS 10-12 - ([#6749](https://github.com/realm/realm-swift/issues/6749), since 5.3.6). -* If you use encryption your application cound crash with a message like - "Opening Realm files of format version 0 is not supported by this version of - Realm". ([#6889](https://github.com/realm/realm-java/issues/6889) among others, since 5.0.0) -* Confining a Realm to a serial queue would throw an error claiming that the - queue was not a serial queue on iOS versions older than 12. - ([#6735](https://github.com/realm/realm-swift/issues/6735), since 5.0.0). -* Results would sometimes give stale results inside a write transaction if a - write which should have updated the Results was made before the first access - of a pre-existing Results object. - ([#6721](https://github.com/realm/realm-swift/issues/6721), since 5.0.0) - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.12 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.7. - -### Internal - -* Upgraded realm-core from v6.0.25 to v6.0.26 -* Upgraded realm-sync from v5.0.22 to v5.0.23 - -5.4.0 Release notes (2020-09-09) -============================================================= - -This version bumps the Realm file format version. This means that older -versions of Realm will be unable to open Realm files written by this version, -and a new version of Realm Studio will be required. There are no actual format -changes and the version bump is just to force a re-migration of incorrectly -upgraded Realms. - -### Fixed - -* Upgrading pre-5.x files with string primary keys would result in a file where - `realm.object(ofType:forPrimaryKey:)` would fail to find the object. - ([#6716](https://github.com/realm/realm-swift/issues/6716), since 5.2.0) -* A write transaction which modifies an object with more than 16 managed - properties and causes the Realm file to grow larger than 2 GB could cause an - assertion failure mentioning "m_has_refs". ([JS #3194](https://github.com/realm/realm-js/issues/3194), since 5.0.0). -* Objects with more than 32 properties could corrupt the Realm file and result - in a variety of crashes. ([Java #7057](https://github.com/realm/realm-java/issues/7057), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.12 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.23 to v6.0.25 -* Upgraded realm-sync from v5.0.20 to v5.0.22 - -5.3.6 Release notes (2020-09-02) -============================================================= - -### Fixed - -* Work around iOS 14 no longer allowing the use of file locks in shared - containers, which resulted in the OS killing an app which entered the - background while a Realm was open ([#6671](https://github.com/realm/realm-swift/issues/6671)). -* If an attempt to upgrade a realm has ended with a crash with "migrate_links()" - in the call stack, the realm was left in an invalid state. The migration - logic now handles this state and can complete upgrading files which were - incompletely upgraded by pre-5.3.4 versions. -* Fix deadlocks when writing to a Realm file on an exFAT partition from macOS. - ([#6691](https://github.com/realm/realm-swift/issues/6691)). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.19 to v6.0.23 -* Upgraded realm-sync from v5.0.16 to v5.0.20 - -5.3.5 Release notes (2020-08-20) -============================================================= - -### Fixed - -* Opening Realms on background threads could produce spurious Incorrect Thread - exceptions when a cached Realm existed for a previously existing thread with - the same thread ID as the current thread. - ([#6659](https://github.com/realm/realm-swift/issues/6659), - [#6689](https://github.com/realm/realm-swift/issues/6689), - [#6712](https://github.com/realm/realm-swift/issues/6712), since 5.0.0). -* Upgrading a table with incoming links but no properties would crash. This was - probably not possible to hit in practice as we reject object types with no - properties. -* Upgrading a non-nullable List which nonetheless contained null values would - crash. This was possible due to missing error-checking in some older versions - of Realm. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.18 to v6.0.19 -* Upgraded realm-sync from v5.0.15 to v5.0.16 - -5.3.4 Release notes (2020-08-17) -============================================================= - -### Fixed - -* Accessing a Realm after calling `deleteAll()` would sometimes throw an - exception with the reason 'ConstIterator copy failed'. ([#6597](https://github.com/realm/realm-swift/issues/6597), since 5.0.0). -* Fix an assertion failure inside the `migrate_links()` function when upgrading - a pre-5.0 Realm file. -* Fix a bug in memory mapping management. This bug could result in multiple - different asserts as well as segfaults. In many cases stack backtraces would - include members of the EncyptedFileMapping near the top - even if encryption - was not used at all. In other cases asserts or crashes would be in methods - reading an array header or array element. In all cases the application would - terminate immediately. ([Core #3838](https://github.com/realm/realm-core/pull/3838), since v5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.14 to v6.0.18 -* Upgraded realm-sync from v5.0.14 to v5.0.15 - -5.3.3 Release notes (2020-07-30) -============================================================= - -### Enhancements - -* Add support for the x86_64 watchOS simulator added in Xcode 12. - -### Fixed - -* (RLM)Results objects would incorrectly pin old read transaction versions - until they were accessed after a Realm was refreshed, resulting in the Realm - file growing to large sizes if a Results was retained but not accessed after - every write. ([#6677](https://github.com/realm/realm-swift/issues/6677), since 5.0.0). -* Fix linker errors when using SwiftUI previews with Xcode 12 when Realm was - installed via Swift Package Manager. ([#6625](https://github.com/realm/realm-swift/issues/6625)) - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.12 to v6.0.14 -* Upgraded realm-sync from v5.0.12 to v5.0.14 - -5.3.2 Release notes (2020-07-21) -============================================================= - -### Fixed - -* Fix a file format upgrade bug when opening older Realm files. Could cause - assertions like "Assertion failed: ref != 0" during opning of a Realm. - ([Core #6644](https://github.com/realm/realm-swift/issues/6644), since 5.2.0) -* A use-after-free would occur if a Realm was compacted, opened on multiple - threads prior to the first write, then written to while reads were happening - on other threads. This could result in a variety of crashes, often inside - realm::util::EncryptedFileMapping::read_barrier. - (Since v5.0.0, [#6626](https://github.com/realm/realm-swift/issues/6626), - [#6628](https://github.com/realm/realm-swift/issues/6628), - [#6652](https://github.com/realm/realm-swift/issues/6652), - [#6655](https://github.com/realm/realm-swift/issues/6555), - [#6656](https://github.com/realm/realm-swift/issues/6656)). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.11 to v6.0.12 -* Upgraded realm-sync from v5.0.11 to v5.0.12 - -5.3.1 Release notes (2020-07-17) -============================================================= - -### Enhancements - -* Add prebuilt binary for Xcode 11.6 to the release package. - -### Fixed - -* Creating an object inside migration which changed that object type's primary - key would hit an assertion failure mentioning primary_key_col - ([#6613](https://github.com/realm/realm-swift/issues/6613), since 5.0.0). -* Modifying the value of a string primary key property inside a migration with - a Realm file which was upgraded from pre-5.0 would corrupt the property's - index, typically resulting in crashes. ([Core #3765](https://github.com/realm/realm-core/issues/3765), since 5.0.0). -* Some Realm files which hit assertion failures when upgrading from the pre-5.0 - file format should now upgrade correctly (Since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.9 to v6.0.11 -* Upgraded realm-sync from v5.0.8 to v5.0.11 - -5.3.0 Release notes (2020-07-14) -============================================================= - -### Enhancements - -* Add `Realm.objectWillChange`, which is a Combine publisher that will emit a - notification each time the Realm is refreshed or a write transaction is - commited. - -### Fixed - -* Fix the spelling of `ObjectKeyIdentifiable`. The old spelling is available - and deprecated for compatibility. -* Rename `RealmCollection.publisher` to `RealmCollection.collectionPublisher`. - The old name interacted with the `publisher` defined by `Sequence` in very - confusing ways, so we need to use a different name. The `publisher` name is - still available for compatibility. ([#6516](https://github.com/realm/realm-swift/issues/6516)) -* Work around "xcodebuild timed out while trying to read - SwiftPackageManagerExample.xcodeproj" errors when installing Realm via - Carthage. ([#6549](https://github.com/realm/realm-swift/issues/6549)). -* Fix a performance regression when using change notifications. (Since 5.0.0, - [#6629](https://github.com/realm/realm-swift/issues/6629)). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v6.0.8 to v6.0.9 -* Upgraded realm-sync from v5.0.7 to v5.0.8 - -5.2.0 Release notes (2020-06-30) -============================================================= - -### Fixed -* Opening a SyncSession with LOCAL app deployments would not use the correct endpoints. -This release also contains all changes from 5.0.3 and 5.1.0. - -### Breaking Changes -* The following classes & aliases have been renamed to align Cocoa with the other Realm SDKs: - -| Old API | New API | -|:------------------------------------------------------------|:---------------------------------------------------------------| -| `RLMSyncUser` | `RLMUser` | -| `SyncUser` | `User` | -| `RLMAppCredential` | `RLMCredential` | -| `AppCredential` | `Credential` | -| `RealmApp` | `App` | -| `RLMUserAPIKeyProviderClient` | `RLMAPIKeyAuth` | -| `RLMUsernamePasswordProviderClient` | `RLMEmailPasswordAuth` | -| `UsernamePasswordProviderClient` | `EmailPasswordAuth` | -| `UserAPIKeyProviderClient` | `APIKeyAuth` | - -* The following functionality has also moved to the User: - -| Old API | New API | -|:-------------------------------------------------------------|:--------------------------------------------------------------| -| `[RLMApp callFunctionNamed:]` | `[RLMUser callFunctionNamed:]` | -| `App.functions` | `User.functions` | -| `[RLMApp mongoClientWithServiceName:]` | `[RLMUser mongoClientWithServiceName:]` | -| `App.mongoClient(serviceName)` | `User.mongoClient(serviceName)` | -| `[RLMApp userAPIKeyProviderClient]` | `[RLMUser apiKeyAuth]` | -| `App.userAPIKeyProviderClient` | `App.apiKeyAuth()` | -| `[RLMApp logOut:]` | `[RLMUser logOut]` | -| `App.logOut(user)` | `User.logOut()` | -| `[RLMApp removeUser:]` | `[RLMUser remove]` | -| `App.remove(user)` | `User.remove()` | -| `[RLMApp linkUser:credentials:]` | `[RLMUser linkWithCredentials:]` | -| `App.linkUser(user, credentials)` | `User.link(credentials)` | - -* The argument labels in Swift have changed for several methods: -| Old API | New API | -|:-------------------------------------------------------------|:--------------------------------------------------------------| -| `APIKeyAuth.createApiKey(withName:completion:)` | `APIKeyAuth.createApiKey(named:completion:)` | -| `App.login(withCredential:completion:) | `App.login(credentials:completion:)` | -| `App.pushClient(withServiceName:)` | `App.pushClient(serviceName:)` | -| `MongoClient.database(withName:)` | `MongoClient.database(named:)` | - -* `refreshCustomData()` on User now returns void and passes the custom data to the callback on success. - -### Compatibility -* This release introduces breaking changes w.r.t some sync classes and MongoDB Realm Cloud functionality. - (See the breaking changes section for the full list) -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* Realm Studio: 10.0.0 or later. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 - -10.0.0-beta.2 Release notes (2020-06-09) -============================================================= -Xcode 11.3 and iOS 9 are now the minimum supported versions. - -### Enhancements - -* Add support for building with Xcode 12 beta 1. watchOS currently requires - removing x86_64 from the supported architectures. Support for the new 64-bit - watch simulator will come in a future release. - -### Fixed -* Opening a SyncSession with LOCAL app deployments would not use the correct endpoints. -* Linking from embedded objects to top-level objects was incorrectly disallowed. - -* Opening a Realm file in file format v6 (created by Realm Cocoa versions - between 2.4 and 2.10) would crash. (Since 5.0.0, [Core #3764](https://github.com/realm/realm-core/issues/3764)). -* Upgrading v9 (pre-5.0) Realm files would create a redundant search index for - primary key properties. This index would then be removed the next time the - Realm was opened, resulting in some extra i/o in the upgrade process. - (Since 5.0.0, [Core #3787](https://github.com/realm/realm-core/issues/3787)). -* Fixed a performance issue with upgrading v9 files with search indexes on - non-primary-key properties. (Since 5.0.0, [Core #3767](https://github.com/realm/realm-core/issues/3767)). - -### Compatibility -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 - -10.0.0-beta.1 Release notes (2020-06-08) -============================================================= - -NOTE: This version bumps the Realm file format to version 11. It is not -possible to downgrade to earlier versions. Older files will automatically be -upgraded to the new file format. Only [Realm Studio -10.0.0](https://github.com/realm/realm-studio/releases/tag/v10.0.0-beta.1) or -later will be able to open the new file format. - -### Enhancements - -* Add support for next generation sync. Support for syncing to MongoDB instead - of Realm Object Server. Applications must be created at realm.mongodb.com -* The memory mapping scheme for Realm files has changed to better support - opening very large files. -* Add support for the ObjectId data type. This is an automatically-generated - unique identifier similar to a GUID or a UUID. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for the Decimal128 data type. This is a 128-bit IEEE 754 decimal - floating point number similar to NSDecimalNumber. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for embedded objects. Embedded objects are objects which are - owned by a single parent object, and are deleted when that parent object is - deleted. They are defined by subclassing `EmbeddedObject` / - `RLMEmbeddedObject` rather than `Object` / `RLMObject`. -* Add `-[RLMSyncUser customData]`/`SyncUser.customData`. Custom data is - configured in your MongoDB Realm App. -* Add `-[RLMApp callFunctionNamed:arguments]`/`RealmApp.functions`. This is the - entry point for calling Remote MongoDB Realm functions. Functions allow you - to define and execute server-side logic for your application. Functions are - written in modern JavaScript (ES6+) and execute in a serverless manner. When - you call a function, you can dynamically access components of the current - application as well as information about the request to execute the function - and the logged in user that sent the request. -* Add `-[RLMApp mongoClientWithServiceName]`/`RealmApp.mongoClient`. This is - the entry point for calling your Remote MongoDB Service. The read operations - are `-[RLMMongoCollection findWhere:completion:]`, `-[RLMMongoCollection - countWhere:completion:]`and `-[RLMMongoCollection - aggregateWithPipeline:completion:]`. The write operations are - `-[RLMMongoCollection insertOneDocument:completion:]`, `-[RLMMongoCollection - insertManyDocuments:completion:]`, `-[RLMMongoCollection - updateOneDocument:completion:]`, `-[RLMMongoCollection - updateManyDocuments:completion:]`, `-[RLMMongoCollection - deleteOneDocument:completion:]`, and `-[RLMMongoCollection - deleteManyDocuments:completion:]`. If you are already familiar with MongoDB - drivers, it is important to understand that the remote MongoCollection only - provides access to the operations available in MongoDB Realm. -* Change `[RLMSyncUser - configurationWithPartitionValue:]`/`SyncUser.configuration(with:)` to accept - all BSON types. Partition values can currently be of types `String`, `Int`, - or `ObjectId`. Opening a realm by partition value is the equivalent of - previously opening a realm by URL. In this case, partitions are meant to be - more closely associated with your data. E.g., if you are running a `Dog` - kennel, and have a field `breed` that acts as your partition key, you could - open up realms based on the breed of the dogs. - -### Breaking Changes - -* We no longer support Realm Cloud (legacy), but instead the new "MongoDB - Realm" Cloud. MongoDB Realm is a serverless platform that enables developers - to quickly build applications without having to set up server infrastructure. - MongoDB Realm is built on top of MongoDB Atlas, automatically integrating the - connection to your database. -* Remove support for Query-based sync, including the configuration parameters - and the `RLMSyncSubscription` and `SyncSubscription` types ([#6437](https://github.com/realm/realm-swift/pull/6437)). -* Primary key properties are no longer marked as being indexed. This reflects - an internal change to how primary keys are handled that should not have any - other visible effects. ([#6440](https://github.com/realm/realm-swift/pull/6440)). -* Remove everything related to sync permissions, including both the path-based - permission system and the object-level privileges for query-based sync. ([#6445](https://github.com/realm/realm-swift/pulls/6445)) -* Primary key uniqueness is now enforced when creating new objects during - migrations, rather than only at the end of migrations. Previously new objects - could be created with duplicate primary keys during a migration as long as - the property was changed to a unique value before the end of the migration, - but now a unique value must be supplied when creating the object. -* Remove support for Realm Object Server. - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* `List.index(of:)` would give incorrect results if it was the very first thing - called on that List after a Realm was refreshed following a write which - modified the List. (Since 5.0.0, [#6606](https://github.com/realm/realm-swift/issues/6606)). -* If a ThreadSafeReference was the only remaining reference to a Realm, - multiple copies of the file could end up mapped into memory at once. This - probably did not have any symptoms other than increased memory usage. (Since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 -* Upgraded realm-core from v6.0.6 to v6.0.7 -* Upgraded realm-sync from v5.0.5 to v5.0.6 -* Upgraded realm-core from v6.0.6 to v6.0.8 -* Upgraded realm-sync from v5.0.5 to v5.0.7 - -5.1.0 Release notes (2020-06-22) -============================================================= - -### Enhancements - -* Allow opening full-sync Realms in read-only mode. This disables local schema - initialization, which makes it possible to open a Realm which the user does - not have write access to without using asyncOpen. In addition, it will report - errors immediately when an operation would require writing to the Realm - rather than reporting it via the sync error handler only after the server - rejects the write. - -### Fixed - -* Opening a Realm using a configuration object read from an existing Realm - would incorrectly bind the new Realm to the original Realm's thread/queue, - resulting in "Realm accessed from incorrect thread." exceptions. - ([#6574](https://github.com/realm/realm-swift/issues/6574), - [#6559](https://github.com/realm/realm-swift/issues/6559), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -5.0.3 Release notes (2020-06-10) -============================================================= - -### Fixed - -* `-[RLMObject isFrozen]` always returned false. ([#6568](https://github.com/realm/realm-swift/issues/6568), since 5.0.0). -* Freezing an object within the write transaction that the object was created - in now throws an exception rather than crashing when the object is first - used. -* The schema for frozen Realms was not properly initialized, leading to crashes - when accessing a RLMLinkingObjects property. - ([#6568](https://github.com/realm/realm-swift/issues/6568), since 5.0.0). -* Observing `Object.isInvalidated` via a keypath literal would produce a - warning in Swift 5.2 due to the property not being marked as @objc. - ([#6554](https://github.com/realm/realm-swift/issues/6554)) - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -5.0.2 Release notes (2020-06-02) -============================================================= - -### Fixed - -* Fix errSecDuplicateItem (-25299) errors when opening a synchronized Realm - when upgrading from pre-5.0 versions of Realm. - ([#6538](https://github.com/realm/realm-swift/issues/6538), [#6494](https://github.com/realm/realm-swift/issues/6494), since 5.0.0). -* Opening Realms stored on filesystems which do not support preallocation (such - as ExFAT) would give "Operation not supported" exceptions. - ([#6508](https://github.com/realm/realm-swift/issues/6508), since 3.2.0). -* 'NoSuchTable' exceptions would sometimes be thrown after upgrading a Relam - file to the v10 format. ([Core #3701](https://github.com/realm/realm-core/issues/3701), since 5.0.0) -* If the upgrade process was interrupted/killed for various reasons, the - following run could stop with some assertions failing. No instances of this - happening were reported to us. (Since 5.0.0). -* Queries filtering a `List` where the query was on an indexed property over a - link would sometimes give incomplete results. - ([#6540](https://github.com/realm/realm-swift/issues/6540), since 4.1.0 but - more common since 5.0.0) -* Opening a file in read-only mode would attempt to make a spurious write to - the file, causing errors if the file was in read-only storage (since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v6.0.4 to v6.0.6 -* Upgraded realm-sync from v5.0.3 to v5.0.5 - -5.0.1 Release notes (2020-05-27) -============================================================= - -### Enhancements - -* Add prebuilt binary for Xcode 11.5 to the release package. - -### Fixed - -* Fix linker error when building a xcframework for Catalyst. - ([#6511](https://github.com/realm/realm-swift/issues/6511), since 4.3.1). -* Fix building for iOS devices when using Swift Package Manager - ([#6522](https://github.com/realm/realm-swift/issues/6522), since 5.0.0). -* `List` and `RealmOptional` properties on frozen objects were not initialized - correctly and would always report `nil` or an empty list. - ([#6527](https://github.com/realm/realm-swift/issues/6527), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -5.0.0 Release notes (2020-05-15) -============================================================= - -NOTE: This version bumps the Realm file format to version 10. It is not -possible to downgrade version 9 or earlier. Files created with older versions -of Realm will be automatically upgraded. Only -[Studio 3.11](https://github.com/realm/realm-studio/releases/tag/v3.11.0) or later will be able -to open the new file format. - -### Enhancements - -* Storing large binary blobs in Realm files no longer forces the file to be at - least 8x the size of the largest blob. -* Reduce the size of transaction logs stored inside the Realm file, reducing - file size growth from large transactions. -* Add support for frozen objects. `Realm`, `Results`, `List` and `Object` now - have `freeze()` methods which return a frozen copy of the object. These - objects behave similarly to creating unmanaged deep copies of the source - objects. They can be read from any thread and do not update when writes are - made to the Realm, but creating frozen objects does not actually copy data - out of the Realm and so can be much faster and use less memory. Frozen - objects cannot be mutated or observed for changes (as they never change). - ([PR #6427](https://github.com/realm/realm-swift/pull/6427)). -* Add the `isFrozen` property to `Realm`, `Results`, `List` and `Object`. -* Add `Realm.Configuration.maxNumberOfActiveVersions`. Each time a write - transaction is performed, a new version is created inside the Realm, and then - any versions which are no longer in use are cleaned up. If too many versions - are kept alive while performing writes (either due to a background thread - performing a long operation that doesn't let the Realm on that thread - refresh, or due to holding onto frozen versions for a long time) the Realm - file will grow in size, potentially to the point where it is too large to be - opened. Setting this configuration option will make write transactions which - would cause the live version count to exceed the limit to instead fail. -* Add support for queue-confined Realms. Rather than being bound to a specific - thread, queue-confined Realms are bound to a serial dispatch queue and can be - used within blocks dispatched to that queue regardless of what thread they - happen to run on. In addition, change notifications will be delivered to that - queue rather than the thread's run loop. ([PR #6478](https://github.com/realm/realm-swift/pull/6478)). -* Add an option to deliver object and collection notifications to a specific - serial queue rather than the current thread. ([PR #6478](https://github.com/realm/realm-swift/pull/6478)). -* Add Combine publishers for Realm types. Realm collections have a `.publisher` - property which publishes the collection each time it changes, and a - `.changesetPublisher` which publishes a `RealmCollectionChange` each time the - collection changes. Corresponding publishers for Realm Objects can be - obtained with the `publisher()` and `changesetPublisher()` global functions. -* Extend Combine publishers which output Realm types with a `.freeze()` - function which will make the publisher instead output frozen objects. -* String primary keys no longer require a separate index, improving insertion - and deletion performance without hurting lookup performance. -* Reduce the encrypted page reclaimer's impact on battery life when encryption - is used. ([Core #3461](https://github.com/realm/realm-core/pull/3461)). - -### Fixed - -* The uploaded bytes in sync progress notifications was sometimes incorrect and - wouldn't exactly equal the uploadable bytes when the uploaded completed. -* macOS binaries were built with the incorrect deployment target (10.14 rather - than 10.9), resulting in linker warnings. ([#6299](https://github.com/realm/realm-swift/issues/6299), since 3.18.0). -* An internal datastructure for List properties could be double-deleted if the - last reference was released from a thread other than the one which the List - was created on at the wrong time. This would typically manifest as - "pthread_mutex_destroy() failed", but could also result in other kinds of - crashes. ([#6333](https://github.com/realm/realm-swift/issues/6333)). -* Sorting on float or double properties containing NaN values had inconsistent - results and would sometimes crash due to out-of-bounds memory accesses. - ([#6357](https://github.com/realm/realm-swift/issues/6357)). - -### Breaking Changes - -* The ObjectChange type in Swift is now generic and includes a reference to the - object which changed. When using `observe(on:)` to receive notifications on a - dispatch queue, the object will be confined to that queue. -* The Realm instance passed in the callback to asyncOpen() is now confined to - the callback queue passed to asyncOpen() rather than the thread which the - callback happens to be called on. This means that the Realm instance may be - stored and reused in further blocks dispatched to that queue, but the queue - must now be a serial queue. -* Files containing Date properties written by version of Realm prior to 1.0 can - no longer be opened. -* Files containing Any properties can no longer be opened. This property type - was never documented and was deprecated in 1.0. -* Deleting objects now preserves the order of objects reported by unsorted - Results rather than performing a swap operation before the delete. Note that - it is still not safe to assume that the order of objects in an unsorted - Results is the order that the objects were created in. -* The minimum supported deployment target for iOS when using Swift Package - Manager to install Realm is now iOS 11. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.4.1. - -### Internal - -* Upgraded realm-core from v5.23.8 to v6.0.4 -* Upgraded realm-sync from v4.9.5 to v5.0.3 - -5.0.0-beta.6 Release notes (2020-05-08) -============================================================= - -### Enhancements - -* Add support for queue-confined Realms. Rather than being bound to a specific - thread, queue-confined Realms are bound to a serial dispatch queue and can be - used within blocks dispatched to that queue regardless of what thread they - happen to run on. In addition, change notifications will be delivered to that - queue rather than the thread's run loop. ([PR #6478](https://github.com/realm/realm-swift/pull/6478)). -* Add an option to deliver object and collection notifications to a specific - serial queue rather than the current thread. ([PR #6478](https://github.com/realm/realm-swift/pull/6478)). - -### Fixed - -* The uploaded bytes in sync progress notifications was sometimes incorrect and - wouldn't exactly equal the uploadable bytes when the uploaded completed. - -### Breaking Changes - -* The Realm instance passed in the callback to asyncOpen() is now confined to - the callback queue passed to asyncOpen() rather than the thread which the - callback happens to be called on. This means that the Realm instance may be - stored and reused in further blocks dispatched to that queue, but the queue - must now be a serial queue. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.4.1. - -### Internal - -* Upgraded realm-core from v6.0.3 to v6.0.4 -* Upgraded realm-sync from v5.0.1 to v5.0.3 - -4.4.1 Release notes (2020-04-16) -============================================================= - -### Enhancements - -* Upgrade Xcode 11.4 binaries to Xcode 11.4.1. - -### Fixed - -* Fix a "previous <= m_schema_transaction_version_max" assertion failure caused - by a race condition that could occur after performing a migration. (Since 3.0.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.4.1. - -5.0.0-beta.3 Release notes (2020-02-26) -============================================================= - -Based on 4.3.2 and also includes all changes since 4.3.0. - -### Enhancements - -* Add support for frozen objects. `Realm`, `Results`, `List` and `Object` now - have `freeze()` methods which return a frozen copy of the object. These - objects behave similarly to creating unmanaged deep copies of the source - objects. They can be read from any thread and do not update when writes are - made to the Realm, but creating frozen objects does not actually copy data - out of the Realm and so can be much faster and use less memory. Frozen - objects cannot be mutated or observed for changes (as they never change). - ([PR #6427](https://github.com/realm/realm-swift/pull/6427)). -* Add the `isFrozen` property to `Realm`, `Results`, `List` and `Object`. -* Add `Realm.Configuration.maxNumberOfActiveVersions`. Each time a write - transaction is performed, a new version is created inside the Realm, and then - any versions which are no longer in use are cleaned up. If too many versions - are kept alive while performing writes (either due to a background thread - performing a long operation that doesn't let the Realm on that thread - refresh, or due to holding onto frozen versions for a long time) the Realm - file will grow in size, potentially to the point where it is too large to be - opened. Setting this configuration option will make write transactions which - would cause the live version count to exceed the limit to instead fail. - - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-core from v6.0.0-beta.3 to v6.0.3 -* Upgraded realm-sync from v5.0.0-beta.2 to v5.0.1 - -5.0.0-beta.2 Release notes (2020-01-13) -============================================================= - -Based on 4.3.0 and also includes all changes since 4.1.1. - -### Fixed - -* Fix compilation when using CocoaPods targeting iOS versions older than 11 (since 5.0.0-alpha). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-core from v6.0.0-beta.2 to v6.0.0-beta.3 -* Upgraded realm-sync from v5.0.0-beta.1 to v5.0.0-beta.2 - -5.0.0-beta.1 Release notes (2019-12-13) -============================================================= - -Based on 4.1.1 and also includes all changes since 4.1.0. - -NOTE: This version bumps the Realm file format to version 10. It is not possible to downgrade version 9 or earlier. Files created with older versions of Realm will be automatically upgraded. - -### Enhancements - -* String primary keys no longer require a separate index, improving insertion - and deletion performance without hurting lookup performance. -* Reduce the encrypted page reclaimer's impact on battery life when encryption - is used. ([Core #3461](https://github.com/realm/realm-core/pull/3461)). - -### Fixed - -* Fix an error when a table-backed Results was accessed immediately after - deleting the object previously at the index being accessed (since - 5.0.0-alpha.1). -* macOS binaries were built with the incorrect deployment target (10.14 rather - than 10.9), resulting in linker warnings. ([#6299](https://github.com/realm/realm-swift/issues/6299), since 3.18.0). -* An internal datastructure for List properties could be double-deleted if the - last reference was released from a thread other than the one which the List - was created on at the wrong time. This would typically manifest as - "pthread_mutex_destroy() failed", but could also result in other kinds of - crashes. ([#6333](https://github.com/realm/realm-swift/issues/6333)). -* Sorting on float or double properties containing NaN values had inconsistent - results and would sometimes crash due to out-of-bounds memory accesses. - ([#6357](https://github.com/realm/realm-swift/issues/6357)). - -### Known Issues - -* Changing which property of an object is the primary key in a migration will - break incoming links to objects of that type. -* Changing the primary key of an object with Data properties in a migration - will crash. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-core from v6.0.0-alpha.24 to v6.0.0-beta.2 -* Upgraded realm-sync from 4.7.1-core6.5 to v5.0.0-beta.1 - -5.0.0-alpha.1 Release notes (2019-11-14) -============================================================= - -Based on 4.1.0. - -### Enhancements - -* Add `-[RLMRealm fileExistsForConfiguration:]`/`Realm.fileExists(for:)`, - which checks if a local Realm file exists for the given configuration. -* Add `-[RLMRealm deleteFilesForConfiguration:]`/`Realm.deleteFiles(for:)` - to delete the Realm file and all auxiliary files for the given configuration. -* Storing large binary blobs in Realm files no longer forces the file to be at - least 8x the size of the largest blob. -* Reduce the size of transaction logs stored inside the Realm file, reducing - file size growth from large transactions. - -NOTE: This version bumps the Realm file format to version 10. It is not -possible to downgrade version 9 or earlier. Files created with older versions -of Realm will be automatically upgraded. This automatic upgrade process is not -yet well tested. Do not open Realm files with data you care about with this -alpha version. - -### Breaking Changes - -* Files containing Date properties written by version of Realm prior to 1.0 can - no longer be opened. -* Files containing Any properties can no longer be opened. This property type - was never documented and was deprecated in 1.0. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades v9) -* Realm Object Server: 3.21.0 or later. -* APIs are backwards compatible with all previous releases in the 4.x.y series. -* Carthage release for Swift is built with Xcode 11.3. -* Carthage release for Swift is built with Xcode 11.2.1. - -### Internal - -* Upgraded realm-core from 5.23.6 to v6.0.0-alpha.24. -* Upgraded realm-sync from 4.8.2 to 4.7.1-core6.5. - -4.4.0 Release notes (2020-03-26) -============================================================= - -Swift 4.0 and Xcode 10.3 are now the minimum supported versions. - -### Enhancements - -* Allow setting the `fileUrl` for synchronized Realms. An appropriate local - path based on the sync URL will still be used if it is not overridden. - ([PR #6454](https://github.com/realm/realm-swift/pull/6454)). -* Add Xcode 11.4 binaries to the release package. - -### Fixed - -* None. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.4. - -4.3.2 Release notes (2020-02-06) -============================================================= - -### Enhancements - -* Similar to `autoreleasepool()`, `realm.write()` now returns the value which - the block passed to it returns. Returning `Void` from the block is still allowed. - -### Fixed - -* Fix a memory leak attributed to `property_copyAttributeList` the first time a - Realm is opened when using Realm Swift. ([#6409](https://github.com/realm/realm-swift/issues/6409), since 4.0.0). -* Connecting to a `realms:` sync URL would crash at runtime on iOS 11 (and no - other iOS versions) inside the SSL validation code. (Since 4.3.1). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-sync from 4.9.4 to 4.9.5. - -4.3.1 Release notes (2020-01-16) -============================================================= - -### Enhancements - -* Reduce the encrypted page reclaimer's impact on battery life when encryption - is used. ([Core #3461](https://github.com/realm/realm-core/pull/3461)). - -### Fixed - -* macOS binaries were built with the incorrect deployment target (10.14 rather - than 10.9), resulting in linker warnings. ([#6299](https://github.com/realm/realm-swift/issues/6299), since 3.18.0). -* An internal datastructure for List properties could be double-deleted if the - last reference was released from a thread other than the one which the List - was created on at the wrong time. This would typically manifest as - "pthread_mutex_destroy() failed", but could also result in other kinds of - crashes. ([#6333](https://github.com/realm/realm-swift/issues/6333)). -* Sorting on float or double properties containing NaN values had inconsistent - results and would sometimes crash due to out-of-bounds memory accesses. - ([#6357](https://github.com/realm/realm-swift/issues/6357)). -* A NOT query on a `List` which happened to have the objects in a - different order than the underlying table would sometimes include the object - immediately before an object which matches the query. ([#6289](https://github.com/realm/realm-swift/issues/6289), since 0.90.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-core from 5.23.6 to 5.23.8. -* Upgraded realm-sync from 4.9.0 to 4.9.4. - -4.3.0 Release notes (2019-12-19) -============================================================= - -### Enhancements - -* Add the ability to set a custom logger function on `RLMSyncManager` which is - called instead of the default NSLog-based logger. -* Expose configuration options for the various types of sync connection - timeouts and heartbeat intervals on `RLMSyncManager`. -* Add an option to have `Realm.asyncOpen()` report an error if the connection - times out rather than swallowing the error and attempting to reconnect until - it succeeds. - -### Fixed - -* Fix a crash when using value(forKey:) on a LinkingObjects property (including - when doing so indirectly, such as by querying on that property). - ([#6366](https://github.com/realm/realm-swift/issues/6366), since 4.0.0). -* Fix a rare crash in `ClientHistoryImpl::integrate_server_changesets()` which - would only happen in Debug builds (since v3.0.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-sync from 4.8.2 to 4.9.0. - -4.2.0 Release notes (2019-12-16) -============================================================= - -### Enhancements - -* Add `-[RLMRealm fileExistsForConfiguration:]`/`Realm.fileExists(for:)`, - which checks if a local Realm file exists for the given configuration. -* Add `-[RLMRealm deleteFilesForConfiguration:]`/`Realm.deleteFiles(for:)` - to delete the Realm file and all auxiliary files for the given configuration. - -### Fixed - -* None. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.3. - -4.1.1 Release notes (2019-11-18) -============================================================= - -### Fixed - -* The UpdatePolicy passed to `realm.add()` or `realm.create()` was not properly - propagated when adding objects within a `List`, which could result in - spurious change notifications when using `.modified`. - ([#6321](https://github.com/realm/realm-swift/issues/6321), since v3.16.0) -* Fix a rare deadlock when a Realm collection or object was observed, then - `refresh()` was explicitly called, and then the NotificationToken from the - observation was destroyed on a different thread (since 0.98.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.2. - -4.1.0 Release notes (2019-11-13) -============================================================= - -### Enhancements - -* Improve performance of queries over a link where the final target property - has an index. -* Restore support for storing `@objc enum` properties on RealmSwift.Object - subclasses (broken in 4.0.0), and add support for storing them in - RealmOptional properties. - -### Fixed - -* The sync client would fail to reconnect after failing to integrate a - changeset. The bug would lead to further corruption of the client’s Realm - file. ([RSYNC-48](https://jira.mongodb.org/browse/RSYNC-48), since v3.2.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.2. - -### Internal - -* Upgraded realm-core from 5.23.5 to 5.23.6. -* Upgraded realm-sync from 4.7.11 to 4.8.2 - -4.0.0 Release notes (2019-11-08) -============================================================= - -### Breaking Changes - -* All previously deprecated functionality has now been removed entirely. -* The schema discovery logic for RealmSwift.Object subclasses has been - rewritten in Swift. This should not have any effect on valid class - definitions, but there may be types of invalid definitions which previously - worked by coincidence and no longer do. -* `SyncSubscription` no longer has a generic type parameter, as the type was - not actually used for anything. -* The following Swift types have changed from `final class` to `struct`: - - AnyRealmCollection - - LinkingObjects - - ObjectiveCSupport - - Realm - - Results - - SyncSubscription - - ThreadSafeReference - There is no intended change in semantics from this, but certain edge cases - may behave differently. -* The designated initializers defined by RLMObject and Object other than - zero-argument `init` have been replaced with convenience initializers. -* The implementation of the path-based permissions API has been redesigned to - accomodate changes to the server. This should be mostly a transparent change, - with two main exceptions: - 1. SyncPermission objects are no longer live Realm objects, and retrieving - permissions gives an Array rather than Results. - Getting up-to-date permissions now requires calling retrievePermissions() again - rather than observing the permissions. - 2. The error codes for permissions functions have changed. Rather than a - separate error type and set of error codes, permission functions now produce - SyncAuthErrors. - -### Enhancements - -* Improve performance of initializing Realm objects with List properties. - -### Fixed - -* None. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.2. - -3.21.0 Release notes (2019-11-04) -============================================================= - -### Enhancements - -* Add prebuilt binaries for Xcode 11.2. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.2. - -3.20.0 Release notes (2019-10-21) -============================================================= - -### Enhancements - -* Add support for custom refresh token authentication. This allows a user to be - authorized with an externally-issued refresh token when ROS is configured to - recognize the external issuer as a refresh token validator. - ([PR #6311](https://github.com/realm/realm-swift/pull/6311)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11. - -3.19.1 Release notes (2019-10-17) -============================================================= - -### Enhancements - -* Improve performance of sync changeset integration. Transactions involving a - very large number of objects and cheap operations on each object are as much - as 20% faster. - -### Fixed - -* Fix a crash when a RLMArray/List of primitives was observed and then the - containing object was deleted before the first time that the background - notifier could run. - ([Issue #6234](https://github.com/realm/realm-swift/issues/6234, since 3.0.0)). -* Remove an incorrect assertion that would cause crashes inside - `TableInfoCache::get_table_info()`, with messages like "Assertion failed: info.object_id_index == 0 [3, 0]". - (Since 3.18.0, [#6268](https://github.com/realm/realm-swift/issues/6268) and [#6257](https://github.com/realm/realm-swift/issues/6257)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.0. - -### Internal - -* Upgrade to REALM_SYNC_VERSION=4.7.11 - -3.19.0 Release notes (2019-09-27) -============================================================= - -### Enhancements - -* Expose ObjectSchema.objectClass in Swift as looking up the class via - NSClassFromString() can be complicated for Swift types. - ([PR #6244](https://github.com/realm/realm-swift/pull/6244)). -* Add support for suppressing notifications using closure-based write/transaction methods. - ([PR #6252](https://github.com/realm/realm-swift/pull/6252)). - -### Fixed - -* IN or chained OR equals queries on an unindexed string column would fail to - match some results if any of the strings were 64 bytes or longer. - ([Core #3386](https://github.com/realm/realm-core/pull/3386), since 3.14.2). -* Query Based Sync subscriptions for queries involving a null timestamp were - not sent to the server correctly and would match no objects. - ([Core #3389](https://github.com/realm/realm-core/pull/3388), since 3.17.3). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.0. - -### Internal - -* Upgrade to REALM_CORE_VERSION=5.23.5 -* Upgrade to REALM_SYNC_VERSION=4.7.8 - -3.18.0 Release notes (2019-09-13) -============================================================= - -The file format for synchronized Realms has changed. Old Realms will be -automatically upgraded when they are opened. Once upgraded, the files will not -be openable by older versions of Realm. The upgrade should not take a -significant amount of time to run or run any risk of errors. - -This does not effect non-synchronized Realms. - -### Enhancements - -* Improve performance of queries on Date properties - ([Core #3344](https://github.com/realm/realm-core/pull/3344), [Core #3351](https://github.com/realm/realm-core/pull/3351)). -* Syncronized Realms are now more aggressive about trimming local history that - is no longer needed. This should reduce file size growth in write-heavy - workloads. ([Sync #3007](https://github.com/realm/realm-sync/issues/3007)). -* Add support for building Realm as an xcframework. - ([PR #6238](https://github.com/realm/realm-swift/pull/6238)). -* Add prebuilt libraries for Xcode 11 to the release package. - ([PR #6248](https://github.com/realm/realm-swift/pull/6248)). -* Add a prebuilt library for Catalyst/UIKit For Mac to the release package - ([PR #6248](https://github.com/realm/realm-swift/pull/6248)). - -### Fixed - -* If a signal interrupted a msync() call, Realm would throw an exception and - the write transaction would fail. This behavior has new been changed to retry - the system call instead. ([Core #3352](https://github.com/realm/realm-core/issues/3352)) -* Queries on the sum or average of an integer property would sometimes give - incorrect results. ([Core #3356](https://github.com/realm/realm-core/pull/3356)). -* Opening query-based synchronized Realms with a small number of subscriptions - performed an unneccesary write transaction. ([ObjectStore #815](https://github.com/realm/realm-object-store/pull/815)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.0 - -### Deprecations - -* `RLMIdentityProviderNickname` has been deprecated in favor of `RLMIdentityProviderUsernamePassword`. -* `+[RLMIdentityProvider credentialsWithNickname]` has been deprecated in favor of `+[RLMIdentityProvider credentialsWithUsername]`. -* `Sync.nickname(String, Bool)` has been deprecated in favor of `Sync.usernamePassword(String, String, Bool)`. - -3.17.3 Release notes (2019-07-24) -============================================================= - -### Enhancements - -* Add Xcode 10.3 binaries to the release package. Remove the Xcode 9.2 and 9.3 binaries. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.3. - -3.17.1 Release notes (2019-07-10) -============================================================= - -### Enhancements - -* Add support for canceling asynchronous opens using a new AsyncOpenTask - returned from the asyncOpen() call. ([PR #6193](https://github.com/realm/realm-swift/pull/6193)). -* Importing the Realm SPM package can now be done by pinning to a version - rather than a branch. - -### Fixed - -* Queries on a List/RLMArray which checked an indexed int property would - sometimes give incorrect results. - ([#6154](https://github.com/realm/realm-swift/issues/6154)), since v3.15.0) -* Queries involving an indexed int property had a memory leak if run multiple - times. ([#6186](https://github.com/realm/realm-swift/issues/6186)), since v3.15.0) -* Creating a subscription with `includeLinkingObjects:` performed unneccesary - comparisons, making it extremely slow when large numbers of objects were - involved. ([Core #3311](https://github.com/realm/realm-core/issues/3311), since v3.15.0) - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.17.0 Release notes (2019-06-28) -============================================================= - -### Enhancements - -* Add support for including Realm via Swift Package Manager. This currently - requires depending on the branch "master" rather than pinning to a version - (i.e. `.package(url: "https://github.com/realm/realm-swift", .branch("master"))`). - ([#6187](https://github.com/realm/realm-swift/pull/6187)). -* Add Codable conformance to RealmOptional and List, and Encodable conformance to Results. - ([PR #6172](https://github.com/realm/realm-swift/pull/6172)). - -### Fixed - -* Attempting to observe an unmanaged LinkingObjects object crashed rather than - throwing an approriate exception (since v0.100.0). -* Opening an encrypted Realm could potentially report that a valid file was - corrupted if the system was low on free memory. - (since 3.14.0, [Core #3267](https://github.com/realm/realm-core/issues/3267)) -* Calling `Realm.asyncOpen()` on multiple Realms at once would sometimes crash - due to a `FileNotFound` exception being thrown on a background worker thread. - (since 3.16.0, [ObjectStore #806](https://github.com/realm/realm-object-store/pull/806)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.16.2 Release notes (2019-06-14) -============================================================= - -### Enhancements - -* Add support for Xcode 11 Beta 1. Xcode betas are only supported when building - from source, and not when using a prebuilt framework. - ([PR #6164](https://github.com/realm/realm-swift/pull/6164)). - -### Fixed - -* Using asyncOpen on query-based Realms which didn't already exist on the local - device would fail with error 214. - ([#6178](https://github.com/realm/realm-swift/issues/6178), since 3.16.0). -* asyncOpen on query-based Realms did not wait for the server-created - permission objects to be downloaded, resulting in crashes if modifications to - the permissions were made before creating a subscription for the first time (since 3.0.0). -* EINTR was not handled correctly in the notification worker, which may have - resulted in inconsistent and rare assertion failures in - `ExternalCommitHelper::listen()` when building with assertions enabled. - (PR: [#804](https://github.com/realm/realm-object-store/pull/804), since 0.91.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.16.1 Release notes (2019-05-31) -============================================================= - -### Fixed - -* The static type passed at compile time to `realm.create()` was checked for a - primary key rather than the actual type passed at runtime, resulting in - exceptions like "''RealmSwiftObject' does not have a primary key and can not - be updated'" being thrown even if the object type being created has a primary - key. (since 3.16.0, [#6159](https://github.com/realm/realm-swift/issues/6159)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.16.0 Release notes (2019-05-29) -============================================================= - -### Enhancements - -* Add an option to only set the properties which have values different from the - existing ones when updating an existing object with - `Realm.create()`/`-[RLMObject createOrUpdateInRealm:withValue:]`. This makes - notifications report only the properties which have actually changed, and - improves Object Server performance by reducing the number of operations to - merge. (Issue: [#5970](https://github.com/realm/realm-swift/issues/5970), - PR: [#6149](https://github.com/realm/realm-swift/pull/6149)). -* Using `-[RLMRealm asyncOpenWithConfiguration:callbackQueue:]`/`Realm.asyncOpen()` to open a - synchronized Realm which does not exist on the local device now uses an - optimized transfer method to download the initial data for the Realm, greatly - speeding up the first start time for applications which use full - synchronization. This is currently not applicable to query-based - synchronization. (PR: [#6106](https://github.com/realm/realm-swift/pull/6106)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.15.0 Release notes (2019-05-06) -============================================================= - -The minimum version of Realm Object Server has been increased to 3.21.0 and -attempting to connect to older versions will produce protocol mismatch errors. -Realm Cloud has already been upgraded to this version, and users using that do -not need to worry about this. - -### Enhancements - -* Add `createdAt`, `updatedAt`, `expiresAt` and `timeToLive` properties to - `RLMSyncSubscription`/`SyncSubscription`. These properties will be `nil` for - subscriptions created with older versions of Realm, but will be automatically - populated for newly-created subscriptions. -* Add support for transient subscriptions by setting the `timeToLive` when - creating the subscription. The next time a subscription is created or updated - after that time has elapsed the subscription will be automatically removed. -* Add support for updating existing subscriptions with a new query or limit. - This is done by passing `update: true` (in swift) or setting - `options.overwriteExisting = YES` (in obj-c) when creating the subscription, - which will make it update the existing subscription with the same name rather - than failing if one already exists with that name. -* Add an option to include the objects from - `RLMLinkingObjects`/`LinkingObjects` properties in sync subscriptions, - similarly to how `RLMArray`/`List` automatically pull in the contained - objects. -* Improve query performance for chains of OR conditions (or an IN condition) on - an unindexed integer or string property. - ([Core PR #2888](https://github.com/realm/realm-core/pull/2888) and - [Core PR #3250](https://github.com/realm/realm-core/pull/3250)). -* Improve query performance for equality conditions on indexed integer properties. - ([Core PR #3272](https://github.com/realm/realm-core/pull/3272)). -* Adjust the file allocation algorithm to reduce fragmentation caused by large - numbers of small blocks. -* Improve file allocator logic to reduce fragmentation and improve commit - performance after many writes. ([Core PR #3278](https://github.com/realm/realm-core/pull/3278)). - -### Fixed - -* Making a query that compares two integer properties could cause a - segmentation fault on x86 (i.e. macOS only). - ([Core PR #3253](https://github.com/realm/realm-core/pull/3256)). -* The `downloadable_bytes` parameter passed to sync progress callbacks reported - a value which correlated to the amount of data left to download, but not - actually the number of bytes which would be downloaded. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.14.2 Release notes (2019-04-25) -============================================================= - -### Enhancements - -* Updating `RLMSyncManager.customRequestHeaders` will immediately update all - currently active sync session with the new headers rather than requiring - manually closing the Realm and reopening it. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.14.1 Release notes (2019-04-04) -============================================================= - -### Fixed - -* Fix "Cannot find interface declaration for 'RealmSwiftObject', superclass of - 'MyRealmObjectClass'" errors when building for a simulator with Xcode 10.2 - with "Install Objective-C Compatibility Header" enabled. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. -* Carthage release for Swift is built with Xcode 10.2. - -3.14.0 Release notes (2019-03-27) -============================================================= - -### Enhancements - -* Reduce memory usage when committing write transactions. -* Improve performance of compacting encrypted Realm files. - ([PR #3221](https://github.com/realm/realm-core/pull/3221)). -* Add a Xcode 10.2 build to the release package. - -### Fixed - -* Fix a memory leak whenever Realm makes a HTTP(s) request to the Realm Object - Server (Issue [#6058](https://github.com/realm/realm-swift/issues/6058), since 3.8.0). -* Fix an assertion failure when creating an object in a synchronized Realm - after creating an object with a null int primary key in the same write - transaction. - ([PR #3227](https://github.com/realm/realm-core/pull/3227)). -* Fix some new warnings when building with Xcode 10.2 beta. -* Properly clean up sync sessions when the last Realm object using the session - is deallocated while the session is explicitly suspended (since 3.9.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. -* Carthage release for Swift is built with Xcode 10.2. - -### Internal - -* Throw an exception rather than crashing with an assertion failure in more - cases when opening invalid Realm files. -* Upgrade to REALM_CORE_VERSION=5.14.0 -* Upgrade to REALM_SYNC_VERSION=3.15.1 - -3.13.1 Release notes (2019-01-03) -============================================================= - -### Fixed - -* Fix a crash when iterating over `Realm.subscriptions()` using for-in. - (Since 3.13.0, PR [#6050](https://github.com/realm/realm-swift/pull/6050)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -3.13.0 Release notes (2018-12-14) -============================================================= - -### Enhancements - -* Add `Realm.subscriptions()`/`-[RLMRealm subscriptions]` and - `Realm.subscription(named:)`/`-[RLMRealm subscriptionWithName:]` to enable - looking up existing query-based sync subscriptions. - (PR: https://github.com/realm/realm-swift/pull/6029). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -3.12.0 Release notes (2018-11-26) -============================================================= - -### Enhancements - -* Add a User-Agent header to HTTP requests made to the Realm Object Server. By - default, this contains information about the Realm library version and your - app's bundle ID. The application identifier can be customized by setting - `RLMSyncManager.sharedManager.userAgent`/`SyncManager.shared.userAgent` prior - to opening a synchronized Realm. - (PR: https://github.com/realm/realm-swift/pull/6007). -* Add Xcode 10.1 binary to the prebuilt package. - -### Fixed - -* None. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -### Internal - -* None. - - -3.11.2 Release notes (2018-11-15) -============================================================= - -### Enhancements - -* Improve the performance of the merge algorithm used for integrating remote - changes from the server. In particular, changesets involving many objects - which all link to a single object should be greatly improved. - -### Fixed - -* Fix a memory leak when removing notification blocks from collections. - PR: [#702](https://github.com/realm/realm-object-store/pull/702), since 1.1.0. -* Fix re-sorting or distincting an already-sorted Results using values from - linked objects. Previously the unsorted order was used to read the values - from the linked objects. - PR [#3102](https://github.com/realm/realm-core/pull/3102), since 3.1.0. -* Fix a set of bugs which could lead to bad changeset assertions when using - sync. The assertions would look something like the following: - `[realm-core-5.10.0] Assertion failed: ndx < size() with (ndx, size()) = [742, 742]`. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -### Internal - -* None. - - -3.11.1 Release notes (2018-10-19) -============================================================= - -### Enhancements - -* None. - -### Fixed - -* Fix `SyncUser.requestEmailConfirmation` not triggering the email confirmation - flow on ROS. (PR [#5953](https://github.com/realm/realm-swift/pull/5953), since 3.5.0) -* Add some missing validation in the getters and setters of properties on - managed Realm objects, which would sometimes result in an application - crashing with a segfault rather than the appropriate exception being thrown - when trying to write to an object which has been deleted. - (PR [#5952](https://github.com/realm/realm-swift/pull/5952), since 2.8.0) - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -### Internal - -* None. - - -3.11.0 Release notes (2018-10-04) -============================================================= - -### Enhancements -* Reduce memory usage when integrating synchronized changes sent by ROS. -* Devices will now report download progress for read-only Realms, allowing the - server to compact Realms more aggressively and reducing the amount of - server-side storage space required. - -### Fixed -* Fix a crash when adding an object with a non-`@objc` `String?` property which - has not been explicitly ignored to a Realm on watchOS 5 (and possibly other - platforms when building with Xcode 10). - (Issue: [5929](https://github.com/realm/realm-swift/issues/5929)). -* Fix some merge algorithm bugs which could result in `BadChangesetError` - being thrown when integrating changes sent by the server. - -### Compatibility -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* **NOTE!!! - You will need to upgrade your Realm Object Server to at least version 3.11.0 - or use [Realm Cloud](https://cloud.realm.io). - If you try to connect to a ROS v3.10.x or previous, you will see an error - like `Wrong protocol version in Sync HTTP request, client protocol version = 25, - server protocol version = 24`.** - -### Internal -* Update to Sync 3.12.2. - - -3.10.0 Release notes (2018-09-19) -============================================================= - -Prebuilt binaries are now built for Xcode 9.2, 9.3, 9.4 and 10.0. - -Older versions of Xcode are still supported when building from source, but you -should be migrating to at least Xcode 9.2 as soon as possible. - -### Enhancements - -* Add support for Watch Series 4 by adding an arm64_32 slice to the library. - -3.9.0 Release notes (2018-09-10) -============================================================= - -### Enhancements - -* Expose RLMSyncUser.refreshToken publicly so that it can be used for custom - HTTP requests to Realm Object Server. -* Add RLMSyncSession.connectionState, which reports whether the session is - currently connected to the Realm Object Server or if it is offline. -* Add `-suspend` and `-resume` methods to `RLMSyncSession` to enable manually - pausing data synchronization. -* Add support for limiting the number of objects matched by a query-based sync - subscription. This requires a server running ROS 3.10.1 or newer. - -### Bugfixes - -* Fix crash when getting the description of a `MigrationObject` which has - `List` properties. -* Fix crash when calling `dynamicList()` on a `MigrationObject`. - -3.8.0 Release notes (2018-09-05) -============================================================= - -### Enhancements - -* Remove some old and no longer applicable migration logic which created an - unencrypted file in the sync metadata directory containing a list of ROS URLs - connected to. -* Add support for pinning SSL certificates used for https and realms - connections by setting `RLMSyncManager.sharedManager.pinnedCertificatePaths` - in obj-c and `SyncManager.shared.pinnedCertificatePaths` in Swift. - -### Bugfixes - -* Fix warnings when building Realm as a static framework with CocoaPods. - -3.7.6 Release notes (2018-08-08) -============================================================= - -### Enhancements - -* Speed up the actual compaction when using compact-on-launch. -* Reduce memory usage when locally merging changes from sync. -* When first connecting to a server, wait to begin uploading changes until - after all changes have been downloaded to reduce the server-side load for - query-based sync. - -3.7.5 Release notes (2018-07-23) -============================================================= - -### Enhancements - -* Improve performance of applying remote changesets from sync. -* Improve performance of creating objects with string primary keys. -* Improve performance of large write transactions. -* Adjust file space allocation strategy to reduce fragmentation, producing - smaller Realm files and typically better performance. -* Close network connections immediately when a sync session is destroyed. -* Report more information in `InvalidDatabase` exceptions. - -### Bugfixes - -* Fix permission denied errors for RLMPlatform.h when building with CocoaPods - and Xcode 10 beta 3. -* Fix a use-after-free when canceling a write transaction which could result in - incorrect "before" values in KVO observations (typically `nil` when a non-nil - value is expected). -* Fix several bugs in the merge algorithm that could lead to memory corruption - and crashes with errors like "bad changeset" and "unreachable code". - -3.7.4 Release notes (2018-06-19) -============================================================= - -### Bugfixes - -* Fix a bug which could potentially flood Realm Object Server with PING - messages after a client device comes back online. - -3.7.3 Release notes (2018-06-18) -============================================================= - -### Enhancements - -* Avoid performing potentially large amounts of pointless background work for - LinkingObjects instances which are accessed and then not immediate deallocated. - -### Bugfixes - -* Fix crashes which could result from extremely fragmented Realm files. -* Fix a bug that could result in a crash with the message "bad changeset error" - when merging changesets from the server. - -3.7.2 Release notes (2018-06-13) -============================================================= - -### Enhancements - -* Add some additional consistency checks that will hopefully produce better - errors when the "prev_ref + prev_size <= ref" assertion failure occurs. - -### Bugfixes - -* Fix a problem in the changeset indexing algorithm that would sometimes - cause "bad permission object" and "bad changeset" errors. -* Fix a large number of linking warnings about symbol visibility by aligning - compiler flags used. -* Fix large increase in size of files produced by `Realm.writeCopy()` introduced in 3.6.0. - -3.7.1 Release notes (2018-06-07) -============================================================= - -* Add support for compiling Realm Swift with Xcode 10 beta 1. - -3.7.0 Release notes (2018-06-06) -============================================================= - -The feature known as Partial Sync has been renamed to Query-based -Synchronization. This has impacted a number of API's. See below for the -details. - -### Deprecations - -* `+[RLMSyncConfiguration initWithUser] has been deprecated in favor of `-[RLMSyncUser configurationWithURL:url]. -* `+[RLMSyncConfiguration automaticConfiguration] has been deprecated in favor of `-[RLMSyncUser configuration]. -* `+[RLMSyncConfiguration automaticConfigurationForUser] has been deprecated in favor of `-[RLMSyncUser configuration]. -* `-[RLMSyncConfiguration isPartial] has been deprecated in favor of `-[RLMSyncConfiguration fullSynchronization]`. - -### Enhancements - -* Add `-[RLMRealm syncSession]` and `Realm.syncSession` to obtain the session used for a synchronized Realm. -* Add `-[RLMSyncUser configuration]`. Query-based sync is the default sync mode for this configuration. -* Add `-[RLMSyncUser configurationWithURL:url]`. Query-based sync is the default sync mode for this configuration. - -3.6.0 Release notes (2018-05-29) -============================================================= - -### Enhancements - -* Improve performance of sync metadata operations and resolving thread-safe - references. -* `shouldCompactOnLaunch` is now supported for compacting the local data of - synchronized Realms. - -### Bugfixes - -* Fix a potential deadlock when a sync session progress callback held the last - strong reference to the sync session. -* Fix some cases where comparisons to `nil` in queries were not properly - serialized when subscribing to a query. -* Don't delete objects added during a migration after a call to `-[RLMMigration - deleteDataForClassName:]`. -* Fix incorrect results and/or crashes when multiple `-[RLMMigration - enumerateObjects:block:]` blocks deleted objects of the same type. -* Fix some edge-cases where `-[RLMMigration enumerateObjects:block:]` - enumerated the incorrect objects following deletions. -* Restore the pre-3.5.0 behavior for Swift optional properties missing an ivar - rather than crashing. - -3.5.0 Release notes (2018-04-25) -============================================================= - -### Enhancements - -* Add wrapper functions for email confirmation and password reset to `SyncUser`. - -### Bugfixes - -* Fix incorrect results when using optional chaining to access a RealmOptional - property in Release builds, or otherwise interacting with a RealmOptional - object after the owning Object has been deallocated. - -3.4.0 Release notes (2018-04-19) -============================================================= - -The prebuilt binary for Carthage is now built for Swift 4.1. - -### Enhancements - -* Expose `RLMSyncManager.authorizationHeaderName`/`SyncManager.authorizationHeaderName` - as a way to override the transport header for Realm Object Server authorization. -* Expose `RLMSyncManager.customRequestHeaders`/`SyncManager.customRequestHeaders` - which allows custom HTTP headers to be appended on requests to the Realm Object Server. -* Expose `RLMSSyncConfiguration.urlPrefix`/`SyncConfiguration.urlPrefix` as a mechanism - to replace the default path prefix in Realm Sync WebSocket requests. - -3.3.2 Release notes (2018-04-03) -============================================================= - -Add a prebuilt binary for Xcode 9.3. - -3.3.1 Release notes (2018-03-28) -============================================================= - -Realm Object Server v3.0.0 or newer is required when using synchronized Realms. - -### Enhancements - -* Expose `RLMObject.object(forPrimaryKey:)` as a factory method for Swift so - that it is callable with recent versions of Swift. - -### Bugfixes - -* Exclude the RLMObject-derived Permissions classes from the types repored by - `Realm.Configuration.defaultConfiguration.objectTypes` to avoid a failed - cast. -* Cancel pending `Realm.asyncOpen()` calls when authentication fails with a - non-transient error such as missing the Realm path in the URL. -* Fix "fcntl() inside prealloc()" errors on APFS. - -3.3.0 Release notes (2018-03-19) -============================================================= - -Realm Object Server v3.0.0 or newer is required when using synchronized Realms. - -### Enhancements - -* Add `Realm.permissions`, `Realm.permissions(forType:)`, and `Realm.permissions(forClassNamed:)` as convenience - methods for accessing the permissions of the Realm or a type. - -### Bugfixes - -* Fix `+[RLMClassPermission objectInRealm:forClass:]` to work for classes that are part of the permissions API, - such as `RLMPermissionRole`. -* Fix runtime errors when applications define an `Object` subclass with the - same name as one of the Permissions object types. - -3.2.0 Release notes (2018-03-15) -============================================================= - -Realm Object Server v3.0.0 or newer is required when using synchronized Realms. - -### Enhancements - -* Added an improved API for adding subscriptions in partially-synchronized Realms. `Results.subscribe()` can be - used to subscribe to any result set, and the returned `SyncSubscription` object can be used to observe the state - of the subscription and ultimately to remove the subscription. See the documentation for more information - (). -* Added a fine-grained permissions system for use with partially-synchronized Realms. This allows permissions to be - defined at the level of individual objects or classes. See the documentation for more information - (). -* Added `SyncConfiguration.automatic()` and `SyncConfiguration.automatic(user:)`. - These methods return a `Realm.Configuration` appropriate for syncing with the default - synced Realm for the current (or specified) user. These should be considered the preferred methods - for accessing synced Realms going forwards. -* Added `+[RLMSyncSession sessionForRealm:]` to retrieve the sync session corresponding to a `RLMRealm`. - -### Bugfixes - -* Fix incorrect initalization of `RLMSyncManager` that made it impossible to - set `errorHandler`. -* Fix compiler warnings when building with Xcode 9.3. -* Fix some warnings when running with UBsan. - -3.2.0-rc.1 Release notes (2018-03-14) -============================================================= - -Realm Object Server v3.0.0-rc.1 or newer is required when using synchronized Realms. - -### Enhancements - -* Added `SyncConfiguration.automatic()` and `SyncConfiguration.automatic(user:)`. - These methods return a `Realm.Configuration` appropriate for syncing with the default - synced Realm for the current (or specified). These should be considered the preferred methods - for accessing synced Realms going forwards. -* A role is now automatically created for each user with that user as its only member. - This simplifies the common use case of restricting access to specific objects to a single user. - This role can be accessed at `PermissionUser.role`. -* Improved error reporting when the server rejects a schema change due to a lack of permissions. - -### Bugfixes - -* Fix incorrect initalization of `RLMSyncManager` that made it impossible to - set `errorHandler`. -* Fix compiler warnings when building with Xcode 9.3. - -3.2.0-beta.3 Release notes (2018-03-01) -============================================================= - -Realm Object Server v3.0.0-alpha.9 or newer is required when using synchronized Realms. - -### Bugfixes - -* Fix a crash that would occur when using partial sync with Realm Object Server v3.0.0-alpha.9. - -3.2.0-beta.2 Release notes (2018-02-28) -============================================================= - -Realm Object Server v3.0.0-alpha.8 or newer is required when using synchronized Realms. - -### Enhancements - -* Added `findOrCreate(forRoleNamed:)` and `findOrCreate(forRole:)` to `List` - to simplify the process of adding permissions for a role. -* Added `+permissionForRoleNamed:inArray:`, `+permissionForRoleNamed:onRealm:`, - `+permissionForRoleNamed:onClass:realm:`, `+permissionForRoleNamed:onClassNamed:realm:`, - and `+permissionForRoleNamed:onObject:` to `RLMSyncPermission` to simplify the process - of adding permissions for a role. -* Added `+[RLMSyncSession sessionForRealm:]` to retrieve the sync session corresponding to a `RLMRealm`. - -### Bugfixes - -* `PermissionRole.users` and `PermissionUser.roles` are now public as intended. -* Fixed the handling of `setPermissions` in `-[RLMRealm privilegesForRealm]` and related methods. - -3.2.0-beta.1 Release notes (2018-02-19) -============================================================= - -### Enhancements - -* Added an improved API for adding subscriptions in partially-synchronized Realms. `Results.subscribe()` can be - used to subscribe to any result set, and the returned `SyncSubscription` object can be used to observe the state - of the subscription and ultimately to remove the subscription. -* Added a fine-grained permissions system for use with partially-synchronized Realms. This allows permissions to be - defined at the level of individual objects or classes. See `Permission` and related types for more information. - -### Bugfixes - -* Fix some warnings when running with UBsan. - -3.1.1 Release notes (2018-02-03) -============================================================= - -Prebuilt Swift frameworks for Carthage are now built with Xcode 9.2. - -### Bugfixes - -* Fix a memory leak when opening Realms with an explicit `objectTypes` array - from Swift. - -3.1.0 Release notes (2018-01-16) -============================================================= - -* Prebuilt frameworks are now included for Swift 3.2.3 and 4.0.3. -* Prebuilt frameworks are no longer included for Swift 3.0.x. -* Building from source with Xcode versions prior to Xcode 8.3 is no longer supported. - -### Enhancements - -* Add `Results.distinct(by:)` / `-[RLMResults distinctResultsUsingKeyPaths:]`, which return a `Results` - containing only objects with unique values at the given key paths. -* Improve performance of change checking for notifications in certain cases. -* Realm Object Server errors not explicitly recognized by the client are now reported to the application - regardless. -* Add support for JSON Web Token as a sync credential source. -* Add support for Nickname and Anonymous Auth as a sync credential source. -* Improve allocator performance when writing to a highly fragmented file. This - should significantly improve performance when inserting large numbers of - objects which have indexed properties. -* Improve write performance for complex object graphs involving many classes - linking to each other. - -### Bugfixes - -* Add a missing check for a run loop in the permission API methods which - require one. -* Fix some cases where non-fatal sync errors were being treated as fatal errors. - -3.0.2 Release notes (2017-11-08) -============================================================= - -Prebuilt frameworks are now included for Swift 3.2.2 and 4.0.2. - -### Bugfixes - -* Fix a crash when a linking objects property is retrieved from a model object instance via - Swift subscripting. -* Fix incorrect behavior if a call to `posix_fallocate` is interrupted. - -3.0.1 Release notes (2017-10-26) -============================================================= - -### Bugfixes - -* Explicitly exclude KVO-generated object subclasses from the schema. -* Fix regression where the type of a Realm model class is not properly determined, causing crashes - when a type value derived at runtime by `type(of:)` is passed into certain APIs. -* Fix a crash when an `Object` subclass has implicitly ignored `let` - properties. -* Fix several cases where adding a notification block from within a - notification callback could produce incorrect results. - -3.0.0 Release notes (2017-10-16) -============================================================= - -### Breaking Changes -* iOS 7 is no longer supported. -* Synchronized Realms require a server running Realm Object Server v2.0 or higher. -* Computed properties on Realm object types are detected and no - longer added to the automatically generated schema. -* The Objective-C and Swift `create(_:, value: update:)` APIs now - correctly nil out nullable properties when updating an existing - object when the `value` argument specifies nil or `NSNull` for - the property value. -* `-[RLMRealm addOrUpdateObjects:]` and `-[RLMRealm deleteObjects:]` now - require their argument to conform to `NSFastEnumeration`, to match similar - APIs that also take collections. -* The way interactive sync errors (client reset and permission denied) - are delivered to the user has been changed. Instead of a block which can - be invoked to immediately delete the offending Realm file, an opaque - token object of type `RLMSyncErrorActionToken` will be returned in the - error object's `userInfo` dictionary. This error object can be passed - into the new `+[RLMSyncSession immediatelyHandleError:]` API to delete - the files. -* The return types of the `SyncError.clientResetInfo()` and - `SyncError.deleteRealmUserInfo()` APIs have been changed. They now return - `RLMSyncErrorActionToken`s or `SyncError.ActionToken`s instead of closures. -* The class methods `Object.className()`, `Object.objectUtilClass()`, and - the property `Object.isInvalidated` can no longer be overriden. -* The callback which runs when a sync user login succeeds or fails - now runs on the main queue by default, or can be explicitly specified - by a new `callbackQueue` parameter on the `{RLM}SyncUser.logIn(...)` API. -* Fix empty strings, binary data, and null on the right side of `BEGINSWITH`, - `ENDSWITH` and `CONTAINS` operators in predicates to match Foundation's - semantics of never matching any strings or data. -* Swift `Object` comparison and hashing behavior now works the same way as - that of `RLMObject` (objects are now only considered equatable if their - model class defines a primary key). -* Fix the way the hash property works on `Object` when the object model has - no primary key. -* Fix an issue where if a Swift model class defined non-generic managed - properties after generic Realm properties (like `List`), the schema - would be constructed incorrectly. Fixes an issue where creating such - models from an array could fail. -* Loosen `RLMArray` and `RLMResults`'s generic constraint from `RLMObject` to - `NSObject`. This may result in having to add some casts to disambiguate - types. -* Remove `RLMSyncPermissionResults`. `RLMSyncPermission`s are now vended out - using a `RLMResults`. This results collection supports all normal collection - operations except for setting values using key-value coding (since - `RLMSyncPermission`s are immutable) and the property aggregation operations. -* `RLMSyncUserInfo` has been significantly enhanced. It now contains metadata - about a user stored on the Realm Object Server, as well as a list of all user account - data associated with that user. -* Starting with Swift 4, `List` now conforms to `MutableCollection` instead of - `RangeReplaceableCollection`. For Swift 4, the empty collection initializer has been - removed, and default implementations of range replaceable collection methods that - make sense for `List` have been added. -* `List.removeLast()` now throws an exception if the list is empty, to more closely match - the behavior of the standard library's `Collection.removeLast()` implementation. -* `RealmCollection`'s associated type `Element` has been renamed `ElementType`. -* The following APIs have been renamed: - -| Old API | New API | -|:------------------------------------------------------------|:---------------------------------------------------------------| -| `NotificationToken.stop()` | `NotificationToken.invalidate()` | -| `-[RLMNotificationToken stop]` | `-[RLMNotificationToken invalidate]` | -| `RealmCollection.addNotificationBlock(_:)` | `RealmCollection.observe(_:)` | -| `RLMSyncProgress` | `RLMSyncProgressMode` | -| `List.remove(objectAtIndex:)` | `List.remove(at:)` | -| `List.swap(_:_:)` | `List.swapAt(_:_:)` | -| `SyncPermissionValue` | `SyncPermission` | -| `RLMSyncPermissionValue` | `RLMSyncPermission` | -| `-[RLMSyncPermission initWithRealmPath:userID:accessLevel]` | `-[RLMSyncPermission initWithRealmPath:identity:accessLevel:]` | -| `RLMSyncPermission.userId` | `RLMSyncPermission.identity` | -| `-[RLMRealm addOrUpdateObjectsInArray:]` | `-[RLMRealm addOrUpdateObjects:]` | - -* The following APIs have been removed: - -| Removed API | Replacement | -|:-------------------------------------------------------------|:------------------------------------------------------------------------------------------| -| `Object.className` | None, was erroneously present. | -| `RLMPropertyTypeArray` | `RLMProperty.array` | -| `PropertyType.array` | `Property.array` | -| `-[RLMArray sortedResultsUsingProperty:ascending:]` | `-[RLMArray sortedResultsUsingKeyPath:ascending:]` | -| `-[RLMCollection sortedResultsUsingProperty:ascending:]` | `-[RLMCollection sortedResultsUsingKeyPath:ascending:]` | -| `-[RLMResults sortedResultsUsingProperty:ascending:]` | `-[RLMResults sortedResultsUsingKeyPath:ascending:]` | -| `+[RLMSortDescriptor sortDescriptorWithProperty:ascending:]` | `+[RLMSortDescriptor sortDescriptorWithKeyPath:ascending:]` | -| `RLMSortDescriptor.property` | `RLMSortDescriptor.keyPath` | -| `AnyRealmCollection.sorted(byProperty:ascending:)` | `AnyRealmCollection.sorted(byKeyPath:ascending:)` | -| `List.sorted(byProperty:ascending:)` | `List.sorted(byKeyPath:ascending:)` | -| `LinkingObjects.sorted(byProperty:ascending:)` | `LinkingObjects.sorted(byKeyPath:ascending:)` | -| `Results.sorted(byProperty:ascending:)` | `Results.sorted(byKeyPath:ascending:)` | -| `SortDescriptor.init(property:ascending:)` | `SortDescriptor.init(keyPath:ascending:)` | -| `SortDescriptor.property` | `SortDescriptor.keyPath` | -| `+[RLMRealm migrateRealm:configuration:]` | `+[RLMRealm performMigrationForConfiguration:error:]` | -| `RLMSyncManager.disableSSLValidation` | `RLMSyncConfiguration.enableSSLValidation` | -| `SyncManager.disableSSLValidation` | `SyncConfiguration.enableSSLValidation` | -| `RLMSyncErrorBadResponse` | `RLMSyncAuthErrorBadResponse` | -| `RLMSyncPermissionResults` | `RLMResults` | -| `SyncPermissionResults` | `Results` | -| `RLMSyncPermissionChange` | `-[RLMSyncUser applyPermission:callback]` / `-[RLMSyncUser deletePermission:callback:]` | -| `-[RLMSyncUser permissionRealmWithError:]` | `-[RLMSyncUser retrievePermissionsWithCallback:]` | -| `RLMSyncPermissionOffer` | `-[RLMSyncUser createOfferForRealmAtURL:accessLevel:expiration:callback:]` | -| `RLMSyncPermissionOfferResponse` | `-[RLMSyncUser acceptOfferForToken:callback:]` | -| `-[NSError rlmSync_clientResetBlock]` | `-[NSError rlmSync_errorActionToken]` / `-[NSError rlmSync_clientResetBackedUpRealmPath]` | -| `-[NSError rlmSync_deleteRealmBlock]` | `-[NSError rlmSync_errorActionToken]` | - -### Enhancements -* `List` can now contain values of types `Bool`, `Int`, `Int8`, `Int16`, - `Int32`, `Int64`, `Float`, `Double`, `String`, `Data`, and `Date` (and - optional versions of all of these) in addition to `Object` subclasses. - Querying `List`s containing values other than `Object` subclasses is not yet - implemented. -* `RLMArray` can now be constrained with the protocols `RLMBool`, `RLMInt`, - `RLMFloat`, `RLMDouble`, `RLMString`, `RLMData`, and `RLMDate` in addition to - protocols defined with `RLM_ARRAY_TYPE`. By default `RLMArray`s of - non-`RLMObject` types can contain null. Indicating that the property is - required (by overriding `+requiredProperties:`) will instead make the values - within the array required. Querying `RLMArray`s containing values other than - `RLMObject` subclasses is not yet implemented. -* Add a new error code to denote 'permission denied' errors when working - with synchronized Realms, as well as an accompanying block that can be - called to inform the binding that the offending Realm's files should be - deleted immediately. This allows recovering from 'permission denied' - errors in a more robust manner. See the documentation for - `RLMSyncErrorPermissionDeniedError` for more information. -* Add Swift `Object.isSameObject(as:_)` API to perform the same function as - the existing Objective-C API `-[RLMObject isEqualToObject:]`. -* Opening a synced Realm whose local copy was created with an older version of - Realm Mobile Platfrom when a migration is not possible to the current version - will result in an `RLMErrorIncompatibleSyncedFile` / `incompatibleSyncedFile` - error. When such an error occurs, the original file is moved to a backup - location, and future attempts to open the synchronized Realm will result in a new - file being created. If you wish to migrate any data from the backup Realm you can - open it using the backup Realm configuration available on the error object. -* Add a preview of partial synchronization. Partial synchronization allows a - synchronized Realm to be opened in such a way that only objects requested by - the user are synchronized to the device. You can use it by setting the - `isPartial` property on a `SyncConfiguration`, opening the Realm, and then - calling `Realm.subscribe(to:where:callback:)` with the type of object you're - interested in, a string containing a query determining which objects you want - to subscribe to, and a callback which will report the results. You may add as - many subscriptions to a synced Realm as necessary. - -### Bugfixes -* Realm no longer throws an "unsupported instruction" exception in some cases - when opening a synced Realm asynchronously. -* Realm Swift APIs that filter or look up the index of an object based on a - format string now properly handle optional arguments in their variadic argument - list. -* `-[RLMResults indexOfObject:]` now properly accounts for access - level. -* Fix a race condition that could lead to a crash accessing to the freed configuration object - if a default configuration was set from a different thread. -* Fixed an issue that crash when enumerating after clearing data during migration. -* Fix a bug where a synced Realm couldn't be reopened even after a successful client reset - in some cases. -* Fix a bug where the sync subsystem waited too long in certain cases to reconnect to the server. -* Fix a bug where encrypted sync-related metadata was incorrectly deleted from upgrading users, - resulting in all users being logged out. -* Fix a bug where permission-related data continued to be synced to a client even after the user - that data belonged to logged out. -* Fix an issue where collection notifications might be delivered inconsistently if a notification - callback was added within another callback for the same collection. - -3.0.0-rc.2 Release notes (2017-10-14) -============================================================= - -### Enhancements -* Reinstate `RLMSyncPermissionSortPropertyUserID` to allow users to sort permissions - to their own Realms they've granted to others. - -### Bugfixes -* `-[RLMResults indexOfObject:]` now properly accounts for access - level. -* Fix a race condition that could lead to a crash accessing to the freed configuration object - if a default configuration was set from a different thread. -* Fixed an issue that crash when enumerating after clearing data during migration. -* Fix a bug where a synced Realm couldn't be reopened even after a successful client reset - in some cases. -* Fix a bug where the sync subsystem waited too long in certain cases to reconnect to the server. -* Fix a bug where encrypted sync-related metadata was incorrectly deleted from upgrading users, - resulting in all users being logged out. -* Fix a bug where permission-related data continued to be synced to a client even after the user - that data belonged to logged out. -* Fix an issue where collection notifications might be delivered inconsistently if a notification - callback was added within another callback for the same collection. - -3.0.0-rc.1 Release notes (2017-10-03) -============================================================= - -### Breaking Changes -* Remove `RLMSyncPermissionSortPropertyUserID` to reflect changes in how the - Realm Object Server reports permissions for a user. -* Remove `RLMSyncPermissionOffer` and `RLMSyncPermissionOfferResponse` classes - and associated helper methods and functions. Use the - `-[RLMSyncUser createOfferForRealmAtURL:accessLevel:expiration:callback:]` - and `-[RLMSyncUser acceptOfferForToken:callback:]` methods instead. - -### Bugfixes - -* The keychain item name used by Realm to manage the encryption keys for - sync-related metadata is now set to a per-app name based on the bundle - identifier. Keys that were previously stored within the single, shared Realm - keychain item will be transparently migrated to the per-application keychain - item. -* Fix downloading of the Realm core binaries when Xcode's command-line tools are - set as the active developer directory for command-line interactions. -* Fix a crash that could occur when resolving a ThreadSafeReference to a `List` - whose parent object had since been deleted. - -3.0.0-beta.4 Release notes (2017-09-22) -============================================================= - -### Breaking Changes - -* Rename `List.remove(objectAtIndex:)` to `List.remove(at:)` to match the name - used by 'RangeReplaceableCollection'. -* Rename `List.swap()` to `List.swapAt()` to match the name used by 'Array'. -* Loosen `RLMArray` and `RLMResults`'s generic constraint from `RLMObject` to - `NSObject`. This may result in having to add some casts to disambiguate - types. -* Remove `RLMPropertyTypeArray` in favor of a separate bool `array` property on - `RLMProperty`/`Property`. -* Remove `RLMSyncPermissionResults`. `RLMSyncPermission`s are now vended out - using a `RLMResults`. This results collection supports all normal collection - operations except for setting values using KVO (since `RLMSyncPermission`s are - immutable) and the property aggregation operations. -* `RealmCollection`'s associated type `Element` has been renamed `ElementType`. -* Realm Swift collection types (`List`, `Results`, `AnyRealmCollection`, and - `LinkingObjects` have had their generic type parameter changed from `T` to - `Element`). -* `RealmOptional`'s generic type parameter has been changed from `T` to `Value`. -* `RLMSyncUserInfo` has been significantly enhanced. It now contains metadata - about a user stored on the Realm Object Server, as well as a list of all user account - data associated with that user. -* Starting with Swift 4, `List` now conforms to `MutableCollection` instead of - `RangeReplaceableCollection`. For Swift 4, the empty collection initializer has been - removed, and default implementations of range replaceable collection methods that - make sense for `List` have been added. -* `List.removeLast()` now throws an exception if the list is empty, to more closely match - the behavior of the standard library's `Collection.removeLast()` implementation. - -### Enhancements - -* `List` can now contain values of types `Bool`, `Int`, `Int8`, `Int16`, - `Int32`, `Int64`, `Float`, `Double`, `String`, `Data`, and `Date` (and - optional versions of all of these) in addition to `Object` subclasses. - Querying `List`s containing values other than `Object` subclasses is not yet - implemented. -* `RLMArray` can now be constrained with the protocols `RLMBool`, `RLMInt`, - `RLMFloat`, `RLMDouble`, `RLMString`, `RLMData`, and `RLMDate` in addition to - protocols defined with `RLM_ARRAY_TYPE`. By default `RLMArray`s of - non-`RLMObject` types can contain null. Indicating that the property is - required (by overriding `+requiredProperties:`) will instead make the values - within the array required. Querying `RLMArray`s containing values other than - `RLMObject` subclasses is not yet implemented. -* Opening a synced Realm whose local copy was created with an older version of - Realm Mobile Platfrom when a migration is not possible to the current version - will result in an `RLMErrorIncompatibleSyncedFile` / `incompatibleSyncedFile` - error. When such an error occurs, the original file is moved to a backup - location, and future attempts to open the synchronized Realm will result in a new - file being created. If you wish to migrate any data from the backup Realm you can - open it using the backup Realm configuration available on the error object. -* Add preview support for partial synchronization. Partial synchronization is - allows a synchronized Realm to be opened in such a way that only objects - requested by the user are synchronized to the device. You can use it by setting - the `isPartial` property on a `SyncConfiguration`, opening the Realm, and then - calling `Realm.subscribe(to:where:callback:)` with the type of object you're - interested in, a string containing a query determining which objects you want - to subscribe to, and a callback which will report the results. You may add as - many subscriptions to a synced Realm as necessary. - -### Bugfixes - -* Realm Swift APIs that filter or look up the index of an object based on a - format string now properly handle optional arguments in their variadic argument - list. - -3.0.0-beta.3 Release notes (2017-08-23) -============================================================= - -### Breaking Changes - -* iOS 7 is no longer supported. -* Computed properties on Realm object types are detected and no - longer added to the automatically generated schema. -* `-[RLMRealm addOrUpdateObjectsInArray:]` has been renamed to - `-[RLMRealm addOrUpdateObjects:]` for consistency with similar methods - that add or delete objects. -* `-[RLMRealm addOrUpdateObjects:]` and `-[RLMRealm deleteObjects:]` now - require their argument to conform to `NSFastEnumeration`, to match similar - APIs that also take collections. -* Remove deprecated `{RLM}SyncPermission` and `{RLM}SyncPermissionChange` - classes. -* `{RLM}SyncPermissionValue` has been renamed to just `{RLM}SyncPermission`. - Its `userId` property has been renamed `identity`, and its - `-initWithRealmPath:userID:accessLevel:` initializer has been renamed - `-initWithRealmPath:identity:accessLevel:`. -* Remove deprecated `-[RLMSyncUser permissionRealmWithError:]` and - `SyncUser.permissionRealm()` APIs. Use the new permissions system. -* Remove deprecated error `RLMSyncErrorBadResponse`. Use - `RLMSyncAuthErrorBadResponse` instead. -* The way interactive sync errors (client reset and permission denied) - are delivered to the user has been changed. Instead of a block which can - be invoked to immediately delete the offending Realm file, an opaque - token object of type `RLMSyncErrorActionToken` will be returned in the - error object's `userInfo` dictionary. This error object can be passed - into the new `+[RLMSyncSession immediatelyHandleError:]` API to delete - the files. -* Remove `-[NSError rlmSync_clientResetBlock]` and - `-[NSError rlmSync_deleteRealmBlock]` APIs. -* The return types of the `SyncError.clientResetInfo()` and - `SyncError.deleteRealmUserInfo()` APIs have been changed. They now return - `RLMSyncErrorActionToken`s or `SyncError.ActionToken`s instead of closures. -* The (erroneously added) instance property `Object.className` has been - removed. -* The class methods `Object.className()`, `Object.objectUtilClass()`, and - the property `Object.isInvalidated` can no longer be overriden. -* The callback which runs when a sync user login succeeds or fails - now runs on the main queue by default, or can be explicitly specified - by a new `callbackQueue` parameter on the `{RLM}SyncUser.logIn(...)` API. -* Rename `{RLM}NotificationToken.stop()` to `invalidate()` and - `{RealmCollection,SyncPermissionResults}.addNotificationBlock(_:)` to - `observe(_:)` to mirror Foundation's new KVO APIs. -* The `RLMSyncProgress` enum has been renamed `RLMSyncProgressMode`. -* Remove deprecated `{RLM}SyncManager.disableSSLValidation` property. Disable - SSL validation on a per-Realm basis by setting the `enableSSLValidation` - property on `{RLM}SyncConfiguration` instead. -* Fix empty strings, binary data, and null on the right side of `BEGINSWITH`, - `ENDSWITH` and `CONTAINS` operators in predicates to match Foundation's - semantics of never matching any strings or data. -* Swift `Object` comparison and hashing behavior now works the same way as - that of `RLMObject` (objects are now only considered equatable if their - model class defines a primary key). -* Fix the way the hash property works on `Object` when the object model has - no primary key. -* Fix an issue where if a Swift model class defined non-generic managed - properties after generic Realm properties (like `List`), the schema - would be constructed incorrectly. Fixes an issue where creating such - models from an array could fail. - -### Enhancements - -* Add Swift `Object.isSameObject(as:_)` API to perform the same function as - the existing Objective-C API `-[RLMObject isEqualToObject:]`. -* Expose additional authentication-related errors that might be reported by - a Realm Object Server. -* An error handler can now be registered on `{RLM}SyncUser`s in order to - report authentication-related errors that affect the user. - -### Bugfixes - -* Sync users are now automatically logged out upon receiving certain types - of errors that indicate they are no longer logged into the server. For - example, users who are authenticated using third-party credentials will find - themselves logged out of the Realm Object Server if the third-party identity - service indicates that their credential is no longer valid. -* Address high CPU usage and hangs in certain cases when processing collection - notifications in highly-connected object graphs. - -3.0.0-beta.2 Release notes (2017-07-26) -============================================================= - -### Breaking Changes - -* Remove the following deprecated Objective-C APIs: - `-[RLMArray sortedResultsUsingProperty:ascending:]`, - `-[RLMCollection sortedResultsUsingProperty:ascending:]`, - `-[RLMResults sortedResultsUsingProperty:ascending:]`, - `+[RLMSortDescriptor sortDescriptorWithProperty:ascending:]`, - `RLMSortDescriptor.property`. - These APIs have been superseded by equivalent APIs that take - or return key paths instead of property names. -* Remove the following deprecated Objective-C API: - `+[RLMRealm migrateRealm:configuration:]`. - Please use `+[RLMRealm performMigrationForConfiguration:error:]` instead. -* Remove the following deprecated Swift APIs: - `AnyRealmCollection.sorted(byProperty:, ascending:)`, - `LinkingObjects.sorted(byProperty:, ascending:)`, - `List.sorted(byProperty:, ascending:)`, - `Results.sorted(byProperty:, ascending:)`, - `SortDescriptor.init(property:, ascending:)`, - `SortDescriptor.property`. - These APIs have been superseded by equivalent APIs that take - or return key paths instead of property names. -* The Objective-C and Swift `create(_:, value: update:)` APIs now - correctly nil out nullable properties when updating an existing - object when the `value` argument specifies nil or `NSNull` for - the property value. - -### Enhancements - -* It is now possible to create and log in multiple Realm Object Server users - with the same identity if they originate from different servers. Note that - if the URLs are different aliases for the same authentication server each - user will still be treated as separate (e.g. they will have their own copy - of each synchronized Realm opened using them). It is highly encouraged that - users defined using the access token credential type be logged in with an - authentication server URL specified; this parameter will become mandatory - in a future version of the SDK. -* Add `-[RLMSyncUser retrieveInfoForUser:identityProvider:completion:]` - API allowing administrator users to retrieve information about a user based - on their provider identity (for example, a username). Requires any edition - of the Realm Object Server 1.8.2 or later. - -### Bugfixes - -* Realm no longer throws an "unsupported instruction" exception in some cases - when opening a synced Realm asynchronously. - -3.0.0-beta Release notes (2017-07-14) -============================================================= - -### Breaking Changes - -* Synchronized Realms require a server running Realm Object Server v2.0 or higher. - -### Enhancements - -* Add a new error code to denote 'permission denied' errors when working - with synchronized Realms, as well as an accompanying block that can be - called to inform the binding that the offending Realm's files should be - deleted immediately. This allows recovering from 'permission denied' - errors in a more robust manner. See the documentation for - `RLMSyncErrorPermissionDeniedError` for more information. -* Add `-[RLMSyncPermissionValue initWithRealmPath:username:accessLevel:]` - API allowing permissions to be applied to a user based on their username - (usually, an email address). Requires any edition of the Realm Object - Server 1.6.0 or later. -* Improve performance of creating Swift objects which contain at least one List - property. - -### Bugfixes - -* `List.description` now reports the correct types for nested lists. -* Fix unmanaged object initialization when a nested property type returned - `false` from `Object.shouldIncludeInDefaultSchema()`. -* Don't clear RLMArrays on self-assignment. - -2.10.2 Release notes (2017-09-27) -============================================================= - -### Bugfixes - -* The keychain item name used by Realm to manage the encryption keys for - sync-related metadata is now set to a per-app name based on the bundle - identifier. Keys that were previously stored within the single, shared Realm - keychain item will be transparently migrated to the per-application keychain - item. -* Fix downloading of the Realm core binaries when Xcode's command-line tools are - set as the active developer directory for command-line interactions. -* Fix a crash that could occur when resolving a ThreadSafeReference to a `List` - whose parent object had since been deleted. - -2.10.1 Release notes (2017-09-14) -============================================================= - -Swift binaries are now produced for Swift 3.0, 3.0.1, 3.0.2, 3.1, 3.2 and 4.0. - -### Enhancements - -* Auxiliary files are excluded from backup by default. - -### Bugfixes - -* Fix more cases where assigning an RLMArray property to itself would clear the - RLMArray. - -2.10.0 Release notes (2017-08-21) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Expose additional authentication-related errors that might be reported by - a Realm Object Server. -* An error handler can now be registered on `{RLM}SyncUser`s in order to - report authentication-related errors that affect the user. - -### Bugfixes - -* Sorting Realm collection types no longer throws an exception on iOS 7. -* Sync users are now automatically logged out upon receiving certain types - of errors that indicate they are no longer logged into the server. For - example, users who are authenticated using third-party credentials will find - themselves logged out of the Realm Object Server if the third-party identity - service indicates that their credential is no longer valid. -* Address high CPU usage and hangs in certain cases when processing collection - notifications in highly-connected object graphs. - -2.9.1 Release notes (2017-08-01) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* The `shouldCompactOnLaunch` block is no longer invoked if the Realm at that - path is already open on other threads. -* Fix an assertion failure in collection notifications when changes are made to - the schema via sync while the notification block is active. - -2.9.0 Release notes (2017-07-26) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Add a new error code to denote 'permission denied' errors when working - with synchronized Realms, as well as an accompanying block that can be - called to inform the binding that the offending Realm's files should be - deleted immediately. This allows recovering from 'permission denied' - errors in a more robust manner. See the documentation for - `RLMSyncErrorPermissionDeniedError` for more information. -* Add `-[RLMSyncPermissionValue initWithRealmPath:username:accessLevel:]` - API allowing permissions to be applied to a user based on their username - (usually, an email address). Requires any edition of the Realm Object - Server 1.6.0 or later. -* Improve performance of creating Swift objects which contain at least one List - property. -* It is now possible to create and log in multiple Realm Object Server users - with the same identity if they originate from different servers. Note that - if the URLs are different aliases for the same authentication server each - user will still be treated as separate (e.g. they will have their own copy - of each synchronized Realm opened using them). It is highly encouraged that - users defined using the access token credential type be logged in with an - authentication server URL specified; this parameter will become mandatory - in a future version of the SDK. -* Add `-[RLMSyncUser retrieveInfoForUser:identityProvider:completion:]` - API allowing administrator users to retrieve information about a user based - on their provider identity (for example, a username). Requires any edition - of the Realm Object Server 1.8.2 or later. - -### Bugfixes - -* `List.description` now reports the correct types for nested lists. -* Fix unmanaged object initialization when a nested property type returned - `false` from `Object.shouldIncludeInDefaultSchema()`. -* Don't clear RLMArrays on self-assignment. - -2.8.3 Release notes (2017-06-20) -============================================================= - -### Bugfixes - -* Properly update RealmOptional properties when adding an object with `add(update: true)`. -* Add some missing quotes in error messages. -* Fix a performance regression when creating objects with primary keys. - -2.8.2 Release notes (2017-06-16) -============================================================= - -### Bugfixes - -* Fix an issue where synchronized Realms would eventually disconnect from the - remote server if the user object used to define their sync configuration - was destroyed. -* Restore support for changing primary keys in migrations (broken in 2.8.0). -* Revert handling of adding objects with nil properties to a Realm to the - pre-2.8.0 behavior. - -2.8.1 Release notes (2017-06-12) -============================================================= - -Add support for building with Xcode 9 Beta 1. - -### Bugfixes - -* Fix setting a float property to NaN. -* Fix a crash when using compact on launch in combination with collection - notifications. - -2.8.0 Release notes (2017-06-02) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Enable encryption on watchOS. -* Add `-[RLMSyncUser changePassword:forUserID:completion:]` API to change an - arbitrary user's password if the current user has administrative privileges - and using Realm's 'password' authentication provider. - Requires any edition of the Realm Object Server 1.6.0 or later. - -### Bugfixes - -* Suppress `-Wdocumentation` warnings in Realm C++ headers when using CocoaPods - with Xcode 8.3.2. -* Throw an appropriate error rather than crashing when an RLMArray is assigned - to an RLMArray property of a different type. -* Fix crash in large (>4GB) encrypted Realm files. -* Improve accuracy of sync progress notifications. -* Fix an issue where synchronized Realms did not connect to the remote server - in certain situations, such as when an application was offline when the Realms - were opened but later regained network connectivity. - -2.7.0 Release notes (2017-05-03) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Use reachability API to minimize the reconnection delay if the network - connection was lost. -* Add `-[RLMSyncUser changePassword:completion:]` API to change the current - user's password if using Realm's 'password' authentication provider. - Requires any edition of the Realm Object Server 1.4.0 or later. -* `{RLM}SyncConfiguration` now has an `enableSSLValidation` property - (and default parameter in the Swift initializer) to allow SSL validation - to be specified on a per-server basis. -* Transactions between a synced Realm and a Realm Object Server can now - exceed 16 MB in size. -* Add new APIs for changing and retrieving permissions for synchronized Realms. - These APIs are intended to replace the existing Realm Object-based permissions - system. Requires any edition of the Realm Object Server 1.1.0 or later. - -### Bugfixes - -* Support Realm model classes defined in Swift with overridden Objective-C - names (e.g. `@objc(Foo) class SwiftFoo: Object {}`). -* Fix `-[RLMMigration enumerateObjects:block:]` returning incorrect `oldObject` - objects when enumerating a class name after previously deleting a `newObject`. -* Fix an issue where `Realm.asyncOpen(...)` would fail to work when opening a - synchronized Realm for which the user only had read permissions. -* Using KVC to set a `List` property to `nil` now clears it to match the - behavior of `RLMArray` properties. -* Fix crash from `!m_awaiting_pong` assertion failure when using synced Realms. -* Fix poor performance or hangs when performing case-insensitive queries on - indexed string properties that contain many characters that don't differ - between upper and lower case (e.g., numbers, punctuation). - -2.6.2 Release notes (2017-04-21) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix an issue where calling `Realm.asyncOpen(...)` with a synchronized Realm - configuration would fail with an "Operation canceled" error. -* Fix initial collection notification sometimes not being delivered for synced - Realms. -* Fix circular links sometimes resulting in objects not being marked as - modified in change notifications. - -2.6.1 Release notes (2017-04-18) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix an issue where calling `Realm.asyncOpen(...)` with a synchronized Realm - configuration would crash in error cases rather than report the error. - This is a small source breaking change if you were relying on the error - being reported to be a `Realm.Error`. - -2.6.0 Release notes (2017-04-18) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Add a `{RLM}SyncUser.isAdmin` property indicating whether a user is a Realm - Object Server administrator. -* Add an API to asynchronously open a Realm and deliver it to a block on a - given queue. This performs all work needed to get the Realm to - a usable state (such as running potentially time-consuming migrations) on a - background thread before dispatching to the given queue. In addition, - synchronized Realms wait for all remote content available at the time the - operation began to be downloaded and available locally. -* Add `shouldCompactOnLaunch` block property when configuring a Realm to - determine if it should be compacted before being returned. -* Speed up case-insensitive queries on indexed string properties. -* Add RLMResults's collection aggregate methods to RLMArray. -* Add support for calling the aggregate methods on unmanaged Lists. - -### Bugfixes - -* Fix a deadlock when multiple processes open a Realm at the same time. -* Fix `value(forKey:)`/`value(forKeyPath:)` returning incorrect values for `List` properties. - -2.5.1 Release notes (2017-04-05) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix CocoaPods installation with static libraries and multiple platforms. -* Fix uncaught "Bad version number" exceptions on the notification worker thread - followed by deadlocks when Realms refresh. - -2.5.0 Release notes (2017-03-28) -============================================================= - -Files written by Realm this version cannot be read by earlier versions of Realm. -Old files can still be opened and files open in read-only mode will not be -modified. - -If using synchronized Realms, the Realm Object Server must be running version -1.3.0 or later. - -Swift binaries are now produced for Swift 3.0, 3.0.1, 3.0.2 and 3.1. - -### API Breaking Changes - -* None. - -### Enhancements - -* Add support for multi-level object equality comparisons against `NULL`. -* Add support for the `[d]` modifier on string comparison operators to perform - diacritic-insensitive comparisons. -* Explicitly mark `[[RLMRealm alloc] init]` as unavailable. -* Include the name of the problematic class in the error message when an - invalid property type is marked as the primary key. - -### Bugfixes - -* Fix incorrect column type assertions which could occur after schemas were - merged by sync. -* Eliminate an empty write transaction when opening a synced Realm. -* Support encrypting synchronized Realms by respecting the `encryptionKey` value - of the Realm's configuration. -* Fix crash when setting an `{NS}Data` property close to 16MB. -* Fix for reading `{NS}Data` properties incorrectly returning `nil`. -* Reduce file size growth in cases where Realm versions were pinned while - starting write transactions. -* Fix an assertion failure when writing to large `RLMArray`/`List` properties. -* Fix uncaught `BadTransactLog` exceptions when pulling invalid changesets from - synchronized Realms. -* Fix an assertion failure when an observed `RLMArray`/`List` is deleted after - being modified. - -2.4.4 Release notes (2017-03-13) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Add `(RLM)SyncPermission` class to allow reviewing access permissions for - Realms. Requires any edition of the Realm Object Server 1.1.0 or later. -* Further reduce the number of files opened per thread-specific Realm on macOS, - iOS and watchOS. - -### Bugfixes - -* Fix a crash that could occur if new Realm instances were created while the - application was exiting. -* Fix a bug that could lead to bad version number errors when delivering - change notifications. -* Fix a potential use-after-free bug when checking validity of results. -* Fix an issue where a sync session might not close properly if it receives - an error while being torn down. -* Fix some issues where a sync session might not reconnect to the server properly - or get into an inconsistent state if revived after invalidation. -* Fix an issue where notifications might not fire when the children of an - observed object are changed. -* Fix an issue where progress notifications on sync sessions might incorrectly - report out-of-date values. -* Fix an issue where multiple threads accessing encrypted data could result in - corrupted data or crashes. -* Fix an issue where certain `LIKE` queries could hang. -* Fix an issue where `-[RLMRealm writeCopyToURL:encryptionKey:error]` could create - a corrupt Realm file. -* Fix an issue where incrementing a synced Realm's schema version without actually - changing the schema could cause a crash. - -2.4.3 Release notes (2017-02-20) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Avoid copying copy-on-write data structures, which can grow the file, when the - write does not actually change existing values. -* Improve performance of deleting all objects in an RLMResults. -* Reduce the number of files opened per thread-specific Realm on macOS. -* Improve startup performance with large numbers of `RLMObject`/`Object` - subclasses. - -### Bugfixes - -* Fix synchronized Realms not downloading remote changes when an access token - expires and there are no local changes to upload. -* Fix an issue where values set on a Realm object using `setValue(value:, forKey:)` - that were not themselves Realm objects were not properly converted into Realm - objects or checked for validity. -* Fix an issue where `-[RLMSyncUser sessionForURL:]` could erroneously return a - non-nil value when passed in an invalid URL. -* `SyncSession.Progress.fractionTransferred` now returns 1 if there are no - transferrable bytes. -* Fix sync progress notifications registered on background threads by always - dispatching on a dedicated background queue. -* Fix compilation issues with Xcode 8.3 beta 2. -* Fix incorrect sync progress notification values for Realms originally created - using a version of Realm prior to 2.3.0. -* Fix LLDB integration to be able to display summaries of `RLMResults` once more. -* Reject Swift properties with names which cause them to fall in to ARC method - families rather than crashing when they are accessed. -* Fix sorting by key path when the declared property order doesn't match the order - of properties in the Realm file, which can happen when properties are added in - different schema versions. - -2.4.2 Release notes (2017-01-30) -============================================================= - -### Bugfixes - -* Fix an issue where RLMRealm instances could end up in the autorelease pool - for other threads. - -2.4.1 Release notes (2017-01-27) -============================================================= - -### Bugfixes - -* Fix an issue where authentication tokens were not properly refreshed - automatically before expiring. - -2.4.0 Release notes (2017-01-26) -============================================================= - -This release drops support for compiling with Swift 2.x. -Swift 3.0.0 is now the minimum Swift version supported. - -### API Breaking Changes - -* None. - -### Enhancements - -* Add change notifications for individual objects with an API similar to that - of collection notifications. - -### Bugfixes - -* Fix Realm Objective-C compilation errors with Xcode 8.3 beta 1. -* Fix several error handling issues when renewing expired authentication - tokens for synchronized Realms. -* Fix a race condition leading to bad_version exceptions being thrown in - Realm's background worker thread. - -2.3.0 Release notes (2017-01-19) -============================================================= - -### Sync Breaking Changes - -* Make `PermissionChange`'s `id` property a primary key. - -### API Breaking Changes - -* None. - -### Enhancements - -* Add `SyncPermissionOffer` and `SyncPermissionOfferResponse` classes to allow - creating and accepting permission change events to synchronized Realms between - different users. -* Support monitoring sync transfer progress by registering notification blocks - on `SyncSession`. Specify the transfer direction (`.upload`/`.download`) and - mode (`.reportIndefinitely`/`.forCurrentlyOutstandingWork`) to monitor. - -### Bugfixes - -* Fix a call to `commitWrite(withoutNotifying:)` committing a transaction that - would not have triggered a notification incorrectly skipping the next - notification. -* Fix incorrect results and crashes when conflicting object insertions are - merged by the synchronization mechanism when there is a collection - notification registered for that object type. - -2.2.0 Release notes (2017-01-12) -============================================================= - -### Sync Breaking Changes (In Beta) - -* Sync-related error reporting behavior has been changed. Errors not related - to a particular user or session are only reported if they are classed as - 'fatal' by the underlying sync engine. -* Added `RLMSyncErrorClientResetError` to `RLMSyncError` enum. - -### API Breaking Changes - -* The following Objective-C APIs have been deprecated in favor of newer or preferred versions: - -| Deprecated API | New API | -|:------------------------------------------------------------|:------------------------------------------------------------| -| `-[RLMArray sortedResultsUsingProperty:]` | `-[RLMArray sortedResultsUsingKeyPath:]` | -| `-[RLMCollection sortedResultsUsingProperty:]` | `-[RLMCollection sortedResultsUsingKeyPath:]` | -| `-[RLMResults sortedResultsUsingProperty:]` | `-[RLMResults sortedResultsUsingKeyPath:]` | -| `+[RLMSortDescriptor sortDescriptorWithProperty:ascending]` | `+[RLMSortDescriptor sortDescriptorWithKeyPath:ascending:]` | -| `RLMSortDescriptor.property` | `RLMSortDescriptor.keyPath` | - -* The following Swift APIs have been deprecated in favor of newer or preferred versions: - -| Deprecated API | New API | -|:------------------------------------------------------|:-------------------------------------------------| -| `LinkingObjects.sorted(byProperty:ascending:)` | `LinkingObjects.sorted(byKeyPath:ascending:)` | -| `List.sorted(byProperty:ascending:)` | `List.sorted(byKeyPath:ascending:)` | -| `RealmCollection.sorted(byProperty:ascending:)` | `RealmCollection.sorted(byKeyPath:ascending:)` | -| `Results.sorted(byProperty:ascending:)` | `Results.sorted(byKeyPath:ascending:)` | -| `SortDescriptor(property:ascending:)` | `SortDescriptor(keyPath:ascending:)` | -| `SortDescriptor.property` | `SortDescriptor.keyPath` | - -### Enhancements - -* Introduce APIs for safely passing objects between threads. Create a - thread-safe reference to a thread-confined object by passing it to the - `+[RLMThreadSafeReference referenceWithThreadConfined:]`/`ThreadSafeReference(to:)` - constructor, which you can then safely pass to another thread to resolve in - the new Realm with `-[RLMRealm resolveThreadSafeReference:]`/`Realm.resolve(_:)`. -* Realm collections can now be sorted by properties over to-one relationships. -* Optimized `CONTAINS` queries to use Boyer-Moore algorithm - (around 10x speedup on large datasets). - -### Bugfixes - -* Setting `deleteRealmIfMigrationNeeded` now also deletes the Realm if a file - format migration is required, such as when moving from a file last accessed - with Realm 0.x to 1.x, or 1.x to 2.x. -* Fix queries containing nested `SUBQUERY` expressions. -* Fix spurious incorrect thread exceptions when a thread id happens to be - reused while an RLMRealm instance from the old thread still exists. -* Fixed various bugs in aggregate methods (max, min, avg, sum). - -2.1.2 Release notes (2016--12-19) -============================================================= - -This release adds binary versions of Swift 3.0.2 frameworks built with Xcode 8.2. - -### Sync Breaking Changes (In Beta) - -* Rename occurences of "iCloud" with "CloudKit" in APIs and comments to match - naming in the Realm Object Server. - -### API Breaking Changes - -* None. - -### Enhancements - -* Add support for 'LIKE' queries (wildcard matching). - -### Bugfixes - -* Fix authenticating with CloudKit. -* Fix linker warning about "Direct access to global weak symbol". - -2.1.1 Release notes (2016-12-02) -============================================================= - -### Enhancements - -* Add `RealmSwift.ObjectiveCSupport.convert(object:)` methods to help write - code that interoperates between Realm Objective-C and Realm Swift APIs. -* Throw exceptions when opening a Realm with an incorrect configuration, like: - * `readOnly` set with a sync configuration. - * `readOnly` set with a migration block. - * migration block set with a sync configuration. -* Greatly improve performance of write transactions which make a large number of - changes to indexed properties, including the automatic migration when opening - files written by Realm 1.x. - -### Bugfixes - -* Reset sync metadata Realm in case of decryption error. -* Fix issue preventing using synchronized Realms in Xcode Playgrounds. -* Fix assertion failure when migrating a model property from object type to - `RLMLinkingObjects` type. -* Fix a `LogicError: Bad version number` exception when using `RLMResults` with - no notification blocks and explicitly called `-[RLMRealm refresh]` from that - thread. -* Logged-out users are no longer returned from `+[RLMSyncUser currentUser]` or - `+[RLMSyncUser allUsers]`. -* Fix several issues which could occur when the 1001st object of a given type - was created or added to an RLMArray/List, including crashes when rerunning - existing queries and possibly data corruption. -* Fix a potential crash when the application exits due to a race condition in - the destruction of global static variables. -* Fix race conditions when waiting for sync uploads or downloads to complete - which could result in crashes or the callback being called too early. - -2.1.0 Release notes (2016-11-18) -============================================================= - -### Sync Breaking Changes (In Beta) - -* None. - -### API breaking changes - -* None. - -### Enhancements - -* Add the ability to skip calling specific notification blocks when committing - a write transaction. - -### Bugfixes - -* Deliver collection notifications when beginning a write transaction which - advances the read version of a Realm (previously only Realm-level - notifications were sent). -* Fix some scenarios which would lead to inconsistent states when using - collection notifications. -* Fix several race conditions in the notification functionality. -* Don't send Realm change notifications when canceling a write transaction. - -2.0.4 Release notes (2016-11-14) -============================================================= - -### Sync Breaking Changes (In Beta) - -* Remove `RLMAuthenticationActions` and replace - `+[RLMSyncCredential credentialWithUsername:password:actions:]` with - `+[RLMSyncCredential credentialsWithUsername:password:register:]`. -* Rename `+[RLMSyncUser authenticateWithCredential:]` to - `+[RLMSyncUser logInWithCredentials:]`. -* Rename "credential"-related types and methods to - `RLMSyncCredentials`/`SyncCredentials` and consistently refer to credentials - in the plural form. -* Change `+[RLMSyncUser all]` to return a dictionary of identifiers to users and - rename to: - * `+[RLMSyncUser allUsers]` in Objective-C. - * `SyncUser.allUsers()` in Swift 2. - * `SyncUser.all` in Swift 3. -* Rename `SyncManager.sharedManager()` to `SyncManager.shared` in Swift 3. -* Change `Realm.Configuration.syncConfiguration` to take a `SyncConfiguration` - struct rather than a named tuple. -* `+[RLMSyncUser logInWithCredentials:]` now invokes its callback block on a - background queue. - -### API breaking changes - -* None. - -### Enhancements - -* Add `+[RLMSyncUser currentUser]`. -* Add the ability to change read, write and management permissions for - synchronized Realms using the management Realm obtained via the - `-[RLMSyncUser managementRealmWithError:]` API and the - `RLMSyncPermissionChange` class. - -### Bugfixes - -* None. - -2.0.3 Release notes (2016-10-27) -============================================================= - -This release adds binary versions of Swift 3.0.1 frameworks built with Xcode 8.1 -GM seed. - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix a `BadVersion` exception caused by a race condition when delivering - collection change notifications. -* Fix an assertion failure when additional model classes are added and - `deleteRealmIfMigrationNeeded` is enabled. -* Fix a `BadTransactLog` exception when deleting an `RLMResults` in a synced - Realm. -* Fix an assertion failure when a write transaction is in progress at the point - of process termination. -* Fix a crash that could occur when working with a `RLMLinkingObject` property - of an unmanaged object. - -2.0.2 Release notes (2016-10-05) -============================================================= - -This release is not protocol-compatible with previous version of the Realm -Mobile Platform. - -### API breaking changes - -* Rename Realm Swift's `User` to `SyncUser` to make clear that it relates to the - Realm Mobile Platform, and to avoid potential conflicts with other `User` types. - -### Bugfixes - -* Fix Realm headers to be compatible with pre-C++11 dialects of Objective-C++. -* Fix incorrect merging of RLMArray/List changes when objects with the same - primary key are created on multiple devices. -* Fix bad transaction log errors after deleting objects on a different device. -* Fix a BadVersion error when a background worker finishes running while older - results from that worker are being delivered to a different thread. - -2.0.1 Release notes (2016-09-29) -============================================================= - -### Bugfixes - -* Fix an assertion failure when opening a Realm file written by a 1.x version - of Realm which has an indexed nullable int or bool property. - -2.0.0 Release notes (2016-09-27) -============================================================= - -This release introduces support for the Realm Mobile Platform! -See for an overview -of these great new features. - -### API breaking changes - -* By popular demand, `RealmSwift.Error` has been moved from the top-level - namespace into a `Realm` extension and is now `Realm.Error`, so that it no - longer conflicts with `Swift.Error`. -* Files written by Realm 2.0 cannot be read by 1.x or earlier versions. Old - files can still be opened. - -### Enhancements - -* The .log, .log_a and .log_b files no longer exist and the state tracked in - them has been moved to the main Realm file. This reduces the number of open - files needed by Realm, improves performance of both opening and writing to - Realms, and eliminates a small window where committing write transactions - would prevent other processes from opening the file. - -### Bugfixes - -* Fix an assertion failure when sorting by zero properties. -* Fix a mid-commit crash in one process also crashing all other processes with - the same Realm open. -* Properly initialize new nullable float and double properties added to - existing objects to null rather than 0. -* Fix a stack overflow when objects with indexed string properties had very - long common prefixes. -* Fix a race condition which could lead to crashes when using async queries or - collection notifications. -* Fix a bug which could lead to incorrect state when an object which links to - itself is deleted from the Realm. - -1.1.0 Release notes (2016-09-16) -============================================================= - -This release brings official support for Xcode 8, Swift 2.3 and Swift 3.0. -Prebuilt frameworks are now built with Xcode 7.3.1 and Xcode 8.0. - -### API breaking changes - -* Deprecate `migrateRealm:` in favor of new `performMigrationForConfiguration:error:` method - that follows Cocoa's NSError conventions. -* Fix issue where `RLMResults` used `id `instead of its generic type as the return - type of subscript. - -### Enhancements - -* Improve error message when using NSNumber incorrectly in Swift models. -* Further reduce the download size of the prebuilt static libraries. -* Improve sort performance, especially on non-nullable columns. -* Allow partial initialization of object by `initWithValue:`, deferring - required property checks until object is added to Realm. - -### Bugfixes - -* Fix incorrect truncation of the constant value for queries of the form - `column < value` for `float` and `double` columns. -* Fix crash when an aggregate is accessed as an `Int8`, `Int16`, `Int32`, or `Int64`. -* Fix a race condition that could lead to a crash if an RLMArray or List was - deallocated on a different thread than it was created on. -* Fix a crash when the last reference to an observed object is released from - within the observation. -* Fix a crash when `initWithValue:` is used to create a nested object for a class - with an uninitialized schema. -* Enforce uniqueness for `RealmOptional` primary keys when using the `value` setter. - -1.0.2 Release notes (2016-07-13) -============================================================= - -### API breaking changes - -* Attempting to add an object with no properties to a Realm now throws rather than silently - doing nothing. - -### Enhancements - -* Swift: A `write` block may now `throw`, reverting any changes already made in - the transaction. -* Reduce address space used when committing write transactions. -* Significantly reduce the download size of prebuilt binaries and slightly - reduce the final size contribution of Realm to applications. -* Improve performance of accessing RLMArray properties and creating objects - with List properties. - -### Bugfixes - -* Fix a crash when reading the shared schema from an observed Swift object. -* Fix crashes or incorrect results when passing an array of values to - `createOrUpdate` after reordering the class's properties. -* Ensure that the initial call of a Results notification block is always passed - .Initial even if there is a write transaction between when the notification - is added and when the first notification is delivered. -* Fix a crash when deleting all objects in a Realm while fast-enumerating query - results from that Realm. -* Handle EINTR from flock() rather than crashing. -* Fix incorrect behavior following a call to `[RLMRealm compact]`. -* Fix live updating and notifications for Results created from a predicate involving - an inverse relationship to be triggered when an object at the other end of the relationship - is modified. - -1.0.1 Release notes (2016-06-12) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Significantly improve performance of opening Realm files, and slightly - improve performance of committing write transactions. - -### Bugfixes - -* Swift: Fix an error thrown when trying to create or update `Object` instances via - `add(:_update:)` with a primary key property of type `RealmOptional`. -* Xcode playground in Swift release zip now runs successfully. -* The `key` parameter of `Realm.objectForPrimaryKey(_:key:)`/ `Realm.dynamicObjectForPrimaryKey(_:key:)` - is now marked as optional. -* Fix a potential memory leak when closing Realms after a Realm file has been - opened on multiple threads which are running in active run loops. -* Fix notifications breaking on tvOS after a very large number of write - transactions have been committed. -* Fix a "Destruction of mutex in use" assertion failure after an error while - opening a file. -* Realm now throws an exception if an `Object` subclass is defined with a managed Swift `lazy` property. - Objects with ignored `lazy` properties should now work correctly. -* Update the LLDB script to work with recent changes to the implementation of `RLMResults`. -* Fix an assertion failure when a Realm file is deleted while it is still open, - and then a new Realm is opened at the same path. Note that this is still not - a supported scenario, and may break in other ways. - -1.0.0 Release notes (2016-05-25) -============================================================= - -No changes since 0.103.2. - -0.103.2 Release notes (2016-05-24) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Improve the error messages when an I/O error occurs in `writeCopyToURL`. - -### Bugfixes - -* Fix an assertion failure which could occur when opening a Realm after opening - that Realm failed previously in some specific ways in the same run of the - application. -* Reading optional integers, floats, and doubles from within a migration block - now correctly returns `nil` rather than 0 when the stored value is `nil`. - -0.103.1 Release notes (2016-05-19) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix a bug that sometimes resulted in a single object's NSData properties - changing from `nil` to a zero-length non-`nil` NSData when a different object - of the same type was deleted. - -0.103.0 Release notes (2016-05-18) -============================================================= - -### API breaking changes - -* All functionality deprecated in previous releases has been removed entirely. -* Support for Xcode 6.x & Swift prior to 2.2 has been completely removed. -* `RLMResults`/`Results` now become empty when a `RLMArray`/`List` or object - they depend on is deleted, rather than throwing an exception when accessed. -* Migrations are no longer run when `deleteRealmIfMigrationNeeded` is set, - recreating the file instead. - -### Enhancements - -* Added `invalidated` properties to `RLMResults`/`Results`, `RLMLinkingObjects`/`LinkingObjects`, - `RealmCollectionType` and `AnyRealmCollection`. These properties report whether the Realm - the object is associated with has been invalidated. -* Some `NSError`s created by Realm now have more descriptive user info payloads. - -### Bugfixes - -* None. - -0.102.1 Release notes (2016-05-13) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Return `RLMErrorSchemaMismatch` error rather than the more generic `RLMErrorFail` - when a migration is required. -* Improve the performance of allocating instances of `Object` subclasses - that have `LinkingObjects` properties. - -### Bugfixes - -* `RLMLinkingObjects` properties declared in Swift subclasses of `RLMObject` - now work correctly. -* Fix an assertion failure when deleting all objects of a type, inserting more - objects, and then deleting some of the newly inserted objects within a single - write transaction when there is an active notification block for a different - object type which links to the objects being deleted. -* Fix crashes and/or incorrect results when querying over multiple levels of - `LinkingObjects` properties. -* Fix opening read-only Realms on multiple threads at once. -* Fix a `BadTransactLog` exception when storing dates before the unix epoch (1970-01-01). - -0.102.0 Release notes (2016-05-09) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Add a method to rename properties during migrations: - * Swift: `Migration.renamePropertyForClass(_:oldName:newName:)` - * Objective-C: `-[RLMMigration renamePropertyForClass:oldName:newName:]` -* Add `deleteRealmIfMigrationNeeded` to - `RLMRealmConfiguration`/`Realm.Configuration`. When this is set to `true`, - the Realm file will be automatically deleted and recreated when there is a - schema mismatch rather than migrated to the new schema. - -### Bugfixes - -* Fix `BETWEEN` queries that traverse `RLMArray`/`List` properties to ensure that - a single related object satisfies the `BETWEEN` criteria, rather than allowing - different objects in the array to satisfy the lower and upper bounds. -* Fix a race condition when a Realm is opened on one thread while it is in the - middle of being closed on another thread which could result in crashes. -* Fix a bug which could result in changes made on one thread being applied - incorrectly on other threads when those threads are refreshed. -* Fix crash when migrating to the new date format introduced in 0.101.0. -* Fix crash when querying inverse relationships when objects are deleted. - -0.101.0 Release notes (2016-05-04) -============================================================= - -### API breaking changes - -* Files written by this version of Realm cannot be read by older versions of - Realm. Existing files will automatically be upgraded when they are opened. - -### Enhancements - -* Greatly improve performance of collection change calculation for complex - object graphs, especially for ones with cycles. -* NSDate properties now support nanoseconds precision. -* Opening a single Realm file on multiple threads now shares a single memory - mapping of the file for all threads, significantly reducing the memory - required to work with large files. -* Crashing while in the middle of a write transaction no longer blocks other - processes from performing write transactions on the same file. -* Improve the performance of refreshing a Realm (including via autorefresh) - when there are live Results/RLMResults objects for that Realm. - -### Bugfixes - -* Fix an assertion failure of "!more_before || index >= std::prev(it)->second)" - in `IndexSet::do_add()`. -* Fix a crash when an `RLMArray` or `List` object is destroyed from the wrong - thread. - -0.100.0 Release notes (2016-04-29) -============================================================= - -### API breaking changes - -* `-[RLMObject linkingObjectsOfClass:forProperty]` and `Object.linkingObjects(_:forProperty:)` - are deprecated in favor of properties of type `RLMLinkingObjects` / `LinkingObjects`. - -### Enhancements - -* The automatically-maintained inverse direction of relationships can now be exposed as - properties of type `RLMLinkingObjects` / `LinkingObjects`. These properties automatically - update to reflect the objects that link to the target object, can be used in queries, and - can be filtered like other Realm collection types. -* Queries that compare objects for equality now support multi-level key paths. - -### Bugfixes - -* Fix an assertion failure when a second write transaction is committed after a - write transaction deleted the object containing an RLMArray/List which had an - active notification block. -* Queries that compare `RLMArray` / `List` properties using != now give the correct results. - -0.99.1 Release notes (2016-04-26) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix a scenario that could lead to the assertion failure - "m_advancer_sg->get_version_of_current_transaction() == - new_notifiers.front()->version()". - -0.99.0 Release notes (2016-04-22) -============================================================= - -### API breaking changes - -* Deprecate properties of type `id`/`AnyObject`. This type was rarely used, - rarely useful and unsupported in every other Realm binding. -* The block for `-[RLMArray addNotificationBlock:]` and - `-[RLMResults addNotificationBlock:]` now takes another parameter. -* The following Objective-C APIs have been deprecated in favor of newer or preferred versions: - -| Deprecated API | New API | -|:-------------------------------------------------------|:------------------------------------------------------| -| `-[RLMRealm removeNotification:]` | `-[RLMNotificationToken stop]` | -| `RLMRealmConfiguration.path` | `RLMRealmConfiguration.fileURL` | -| `RLMRealm.path` | `RLMRealmConfiguration.fileURL` | -| `RLMRealm.readOnly` | `RLMRealmConfiguration.readOnly` | -| `+[RLMRealm realmWithPath:]` | `+[RLMRealm realmWithURL:]` | -| `+[RLMRealm writeCopyToPath:error:]` | `+[RLMRealm writeCopyToURL:encryptionKey:error:]` | -| `+[RLMRealm writeCopyToPath:encryptionKey:error:]` | `+[RLMRealm writeCopyToURL:encryptionKey:error:]` | -| `+[RLMRealm schemaVersionAtPath:error:]` | `+[RLMRealm schemaVersionAtURL:encryptionKey:error:]` | -| `+[RLMRealm schemaVersionAtPath:encryptionKey:error:]` | `+[RLMRealm schemaVersionAtURL:encryptionKey:error:]` | - -* The following Swift APIs have been deprecated in favor of newer or preferred versions: - -| Deprecated API | New API | -|:----------------------------------------------|:-----------------------------------------| -| `Realm.removeNotification(_:)` | `NotificationToken.stop()` | -| `Realm.Configuration.path` | `Realm.Configuration.fileURL` | -| `Realm.path` | `Realm.Configuration.fileURL` | -| `Realm.readOnly` | `Realm.Configuration.readOnly` | -| `Realm.writeCopyToPath(_:encryptionKey:)` | `Realm.writeCopyToURL(_:encryptionKey:)` | -| `schemaVersionAtPath(_:encryptionKey:error:)` | `schemaVersionAtURL(_:encryptionKey:)` | - -### Enhancements - -* Add information about what rows were added, removed, or modified to the - notifications sent to the Realm collections. -* Improve error when illegally appending to an `RLMArray` / `List` property from a default value - or the standalone initializer (`init()`) before the schema is ready. - -### Bugfixes - -* Fix a use-after-free when an associated object's dealloc method is used to - remove observers from an RLMObject. -* Fix a small memory leak each time a Realm file is opened. -* Return a recoverable `RLMErrorAddressSpaceExhausted` error rather than - crash when there is insufficient available address space on Realm - initialization or write commit. - -0.98.8 Release notes (2016-04-15) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fixed a bug that caused some encrypted files created using - `-[RLMRealm writeCopyToPath:encryptionKey:error:]` to fail to open. - -0.98.7 Release notes (2016-04-13) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Mark further initializers in Objective-C as NS_DESIGNATED_INITIALIZER to prevent that these aren't - correctly defined in Swift Object subclasses, which don't qualify for auto-inheriting the required initializers. -* `-[RLMResults indexOfObjectWithPredicate:]` now returns correct results - for `RLMResults` instances that were created by filtering an `RLMArray`. -* Adjust how RLMObjects are destroyed in order to support using an associated - object on an RLMObject to remove KVO observers from that RLMObject. -* `-[RLMResults indexOfObjectWithPredicate:]` now returns the index of the first matching object for a - sorted `RLMResults`, matching its documented behavior. -* Fix a crash when canceling a transaction that set a relationship. -* Fix a crash when a query referenced a deleted object. - -0.98.6 Release notes (2016-03-25) -============================================================= - -Prebuilt frameworks are now built with Xcode 7.3. - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix running unit tests on iOS simulators and devices with Xcode 7.3. - -0.98.5 Release notes (2016-03-14) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix a crash when opening a Realm on 32-bit iOS devices. - -0.98.4 Release notes (2016-03-10) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Properly report changes made by adding an object to a Realm with - addOrUpdate:/createOrUpdate: to KVO observers for existing objects with that - primary key. -* Fix crashes and assorted issues when a migration which added object link - properties is rolled back due to an error in the migration block. -* Fix assertion failures when deleting objects within a migration block of a - type which had an object link property added in that migration. -* Fix an assertion failure in `Query::apply_patch` when updating certain kinds - of queries after a write transaction is committed. - -0.98.3 Release notes (2016-02-26) -============================================================= - -### Enhancements - -* Initializing the shared schema is 3x faster. - -### Bugfixes - -* Using Realm Objective-C from Swift while having Realm Swift linked no longer causes that the - declared `ignoredProperties` are not taken into account. -* Fix assertion failures when rolling back a migration which added Object link - properties to a class. -* Fix potential errors when cancelling a write transaction which modified - multiple `RLMArray`/`List` properties. -* Report the correct value for inWriteTransaction after attempting to commit a - write transaction fails. -* Support CocoaPods 1.0 beginning from prerelease 1.0.0.beta.4 while retaining - backwards compatibility with 0.39. - -0.98.2 Release notes (2016-02-18) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Aggregate operations (`ANY`, `NONE`, `@count`, `SUBQUERY`, etc.) are now supported for key paths - that begin with an object relationship so long as there is a `RLMArray`/`List` property at some - point in a key path. -* Predicates of the form `%@ IN arrayProperty` are now supported. - -### Bugfixes - -* Use of KVC collection operators on Swift collection types no longer throws an exception. -* Fix reporting of inWriteTransaction in notifications triggered by - `beginWriteTransaction`. -* The contents of `List` and `Optional` properties are now correctly preserved when copying - a Swift object from one Realm to another, and performing other operations that result in a - Swift object graph being recursively traversed from Objective-C. -* Fix a deadlock when queries are performed within a Realm notification block. -* The `ANY` / `SOME` / `NONE` qualifiers are now required in comparisons involving a key path that - traverse a `RLMArray`/`List` property. Previously they were only required if the first key in the - key path was an `RLMArray`/`List` property. -* Fix several scenarios where the default schema would be initialized - incorrectly if the first Realm opened used a restricted class subset (via - `objectClasses`/`objectTypes`). - -0.98.1 Release notes (2016-02-10) -============================================================= - -### Bugfixes - -* Fix crashes when deleting an object containing an `RLMArray`/`List` which had - previously been queried. -* Fix a crash when deleting an object containing an `RLMArray`/`List` with - active notification blocks. -* Fix duplicate file warnings when building via CocoaPods. -* Fix crash or incorrect results when calling `indexOfObject:` on an - `RLMResults` derived from an `RLMArray`. - -0.98.0 Release notes (2016-02-04) -============================================================= - -### API breaking changes - -* `+[RLMRealm realmWithPath:]`/`Realm.init(path:)` now inherits from the default - configuration. -* Swift 1.2 is no longer supported. - -### Enhancements - -* Add `addNotificationBlock` to `RLMResults`, `Results`, `RLMArray`, and - `List`, which calls the given block whenever the collection changes. -* Do a lot of the work for keeping `RLMResults`/`Results` up-to-date after - write transactions on a background thread to help avoid blocking the main - thread. -* `NSPredicate`'s `SUBQUERY` operator is now supported. It has the following limitations: - * `@count` is the only operator that may be applied to the `SUBQUERY` expression. - * The `SUBQUERY(…).@count` expression must be compared with a constant. - * Correlated subqueries are not yet supported. - -### Bugfixes - -* None. - -0.97.1 Release notes (2016-01-29) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Swift: Added `Error` enum allowing to catch errors e.g. thrown on initializing - `RLMRealm`/`Realm` instances. -* Fail with `RLMErrorFileNotFound` instead of the more generic `RLMErrorFileAccess`, - if no file was found when a realm was opened as read-only or if the directory part - of the specified path was not found when a copy should be written. -* Greatly improve performance when deleting objects with one or more indexed - properties. -* Indexing `BOOL`/`Bool` and `NSDate` properties are now supported. -* Swift: Add support for indexing optional properties. - -### Bugfixes - -* Fix incorrect results or crashes when using `-[RLMResults setValue:forKey:]` - on an RLMResults which was filtered on the key being set. -* Fix crashes when an RLMRealm is deallocated from the wrong thread. -* Fix incorrect results from aggregate methods on `Results`/`RLMResults` after - objects which were previously in the results are deleted. -* Fix a crash when adding a new property to an existing class with over a - million objects in the Realm. -* Fix errors when opening encrypted Realm files created with writeCopyToPath. -* Fix crashes or incorrect results for queries that use relationship equality - in cases where the `RLMResults` is kept alive and instances of the target class - of the relationship are deleted. - -0.97.0 Release notes (2015-12-17) -============================================================= - -### API breaking changes - -* All functionality deprecated in previous releases has been removed entirely. -* Add generic type annotations to NSArrays and NSDictionaries in public APIs. -* Adding a Realm notification block on a thread not currently running from - within a run loop throws an exception rather than silently never calling the - notification block. - -### Enhancements - -* Support for tvOS. -* Support for building Realm Swift from source when using Carthage. -* The block parameter of `-[RLMRealm transactionWithBlock:]`/`Realm.write(_:)` is - now marked as `__attribute__((noescape))`/`@noescape`. -* Many forms of queries with key paths on both sides of the comparison operator - are now supported. -* Add support for KVC collection operators in `RLMResults` and `RLMArray`. -* Fail instead of deadlocking in `+[RLMRealm sharedSchema]`, if a Swift property is initialized - to a computed value, which attempts to open a Realm on its own. - -### Bugfixes - -* Fix poor performance when calling `-[RLMRealm deleteObjects:]` on an - `RLMResults` which filtered the objects when there are other classes linking - to the type of the deleted objects. -* An exception is now thrown when defining `Object` properties of an unsupported - type. - -0.96.3 Release notes (2015-12-04) -============================================================= - -### Enhancements - -* Queries are no longer limited to 16 levels of grouping. -* Rework the implementation of encrypted Realms to no longer interfere with - debuggers. - -### Bugfixes - -* Fix crash when trying to retrieve object instances via `dynamicObjects`. -* Throw an exception when querying on a link providing objects, which are from a different Realm. -* Return empty results when querying on a link providing an unattached object. -* Fix crashes or incorrect results when calling `-[RLMRealm refresh]` during - fast enumeration. -* Add `Int8` support for `RealmOptional`, `MinMaxType` and `AddableType`. -* Set the default value for newly added non-optional NSData properties to a - zero-byte NSData rather than nil. -* Fix a potential crash when deleting all objects of a class. -* Fix performance problems when creating large numbers of objects with - `RLMArray`/`List` properties. -* Fix memory leak when using Object(value:) for subclasses with - `List` or `RealmOptional` properties. -* Fix a crash when computing the average of an optional integer property. -* Fix incorrect search results for some queries on integer properties. -* Add error-checking for nil realm parameters in many methods such as - `+[RLMObject allObjectsInRealm:]`. -* Fix a race condition between commits and opening Realm files on new threads - that could lead to a crash. -* Fix several crashes when opening Realm files. -* `-[RLMObject createInRealm:withValue:]`, `-[RLMObject createOrUpdateInRealm:withValue:]`, and - their variants for the default Realm now always match the contents of an `NSArray` against properties - in the same order as they are defined in the model. - -0.96.2 Release notes (2015-10-26) -============================================================= - -Prebuilt frameworks are now built with Xcode 7.1. - -### Bugfixes - -* Fix ignoring optional properties in Swift. -* Fix CocoaPods installation on case-sensitive file systems. - -0.96.1 Release notes (2015-10-20) -============================================================= - -### Bugfixes - -* Support assigning `Results` to `List` properties via KVC. -* Honor the schema version set in the configuration in `+[RLMRealm migrateRealm:]`. -* Fix crash when using optional Int16/Int32/Int64 properties in Swift. - -0.96.0 Release notes (2015-10-14) -============================================================= - -* No functional changes since beta2. - -0.96.0-beta2 Release notes (2015-10-08) -============================================================= - -### Bugfixes - -* Add RLMOptionalBase.h to the podspec. - -0.96.0-beta Release notes (2015-10-07) -============================================================= - -### API breaking changes - -* CocoaPods v0.38 or greater is now required to install Realm and RealmSwift - as pods. - -### Enhancements - -* Functionality common to both `List` and `Results` is now declared in a - `RealmCollectionType` protocol that both types conform to. -* `Results.realm` now returns an `Optional` in order to conform to - `RealmCollectionType`, but will always return `.Some()` since a `Results` - cannot exist independently from a `Realm`. -* Aggregate operations are now available on `List`: `min`, `max`, `sum`, - `average`. -* Committing write transactions (via `commitWrite` / `commitWriteTransaction` and - `write` / `transactionWithBlock`) now optionally allow for handling errors when - the disk is out of space. -* Added `isEmpty` property on `RLMRealm`/`Realm` to indicate if it contains any - objects. -* The `@count`, `@min`, `@max`, `@sum` and `@avg` collection operators are now - supported in queries. - -### Bugfixes - -* Fix assertion failure when inserting NSData between 8MB and 16MB in size. -* Fix assertion failure when rolling back a migration which removed an object - link or `RLMArray`/`List` property. -* Add the path of the file being opened to file open errors. -* Fix a crash that could be triggered by rapidly opening and closing a Realm - many times on multiple threads at once. -* Fix several places where exception messages included the name of the wrong - function which failed. - -0.95.3 Release notes (2015-10-05) -============================================================= - -### Bugfixes - -* Compile iOS Simulator framework architectures with `-fembed-bitcode-marker`. -* Fix crashes when the first Realm opened uses a class subset and later Realms - opened do not. -* Fix inconsistent errors when `Object(value: ...)` is used to initialize the - default value of a property of an `Object` subclass. -* Throw an exception when a class subset has objects with array or object - properties of a type that are not part of the class subset. - -0.95.2 Release notes (2015-09-24) -============================================================= - -* Enable bitcode for iOS and watchOS frameworks. -* Build libraries with Xcode 7 final rather than the GM. - -0.95.1 Release notes (2015-09-23) -============================================================= - -### Enhancements - -* Add missing KVO handling for moving and exchanging objects in `RLMArray` and - `List`. - -### Bugfixes - -* Setting the primary key property on persisted `RLMObject`s / `Object`s - via subscripting or key-value coding will cause an exception to be thrown. -* Fix crash due to race condition in `RLMRealmConfiguration` where the default - configuration was in the process of being copied in one thread, while - released in another. -* Fix crash when a migration which removed an object or array property is - rolled back due to an error. - -0.95.0 Release notes (2015-08-25) -============================================================= - -### API breaking changes - -* The following APIs have been deprecated in favor of the new `RLMRealmConfiguration` class in Realm Objective-C: - -| Deprecated API | New API | -|:------------------------------------------------------------------|:---------------------------------------------------------------------------------| -| `+[RLMRealm realmWithPath:readOnly:error:]` | `+[RLMRealm realmWithConfiguration:error:]` | -| `+[RLMRealm realmWithPath:encryptionKey:readOnly:error:]` | `+[RLMRealm realmWithConfiguration:error:]` | -| `+[RLMRealm setEncryptionKey:forRealmsAtPath:]` | `-[RLMRealmConfiguration setEncryptionKey:]` | -| `+[RLMRealm inMemoryRealmWithIdentifier:]` | `+[RLMRealm realmWithConfiguration:error:]` | -| `+[RLMRealm defaultRealmPath]` | `+[RLMRealmConfiguration defaultConfiguration]` | -| `+[RLMRealm setDefaultRealmPath:]` | `+[RLMRealmConfiguration setDefaultConfiguration:]` | -| `+[RLMRealm setDefaultRealmSchemaVersion:withMigrationBlock]` | `RLMRealmConfiguration.schemaVersion` and `RLMRealmConfiguration.migrationBlock` | -| `+[RLMRealm setSchemaVersion:forRealmAtPath:withMigrationBlock:]` | `RLMRealmConfiguration.schemaVersion` and `RLMRealmConfiguration.migrationBlock` | -| `+[RLMRealm migrateRealmAtPath:]` | `+[RLMRealm migrateRealm:]` | -| `+[RLMRealm migrateRealmAtPath:encryptionKey:]` | `+[RLMRealm migrateRealm:]` | - -* The following APIs have been deprecated in favor of the new `Realm.Configuration` struct in Realm Swift for Swift 1.2: - -| Deprecated API | New API | -|:--------------------------------------------------------------|:-----------------------------------------------------------------------------| -| `Realm.defaultPath` | `Realm.Configuration.defaultConfiguration` | -| `Realm(path:readOnly:encryptionKey:error:)` | `Realm(configuration:error:)` | -| `Realm(inMemoryIdentifier:)` | `Realm(configuration:error:)` | -| `Realm.setEncryptionKey(:forPath:)` | `Realm(configuration:error:)` | -| `setDefaultRealmSchemaVersion(schemaVersion:migrationBlock:)` | `Realm.Configuration.schemaVersion` and `Realm.Configuration.migrationBlock` | -| `setSchemaVersion(schemaVersion:realmPath:migrationBlock:)` | `Realm.Configuration.schemaVersion` and `Realm.Configuration.migrationBlock` | -| `migrateRealm(path:encryptionKey:)` | `migrateRealm(configuration:)` | - -* The following APIs have been deprecated in favor of the new `Realm.Configuration` struct in Realm Swift for Swift 2.0: - -| Deprecated API | New API | -|:--------------------------------------------------------------|:-----------------------------------------------------------------------------| -| `Realm.defaultPath` | `Realm.Configuration.defaultConfiguration` | -| `Realm(path:readOnly:encryptionKey:) throws` | `Realm(configuration:) throws` | -| `Realm(inMemoryIdentifier:)` | `Realm(configuration:) throws` | -| `Realm.setEncryptionKey(:forPath:)` | `Realm(configuration:) throws` | -| `setDefaultRealmSchemaVersion(schemaVersion:migrationBlock:)` | `Realm.Configuration.schemaVersion` and `Realm.Configuration.migrationBlock` | -| `setSchemaVersion(schemaVersion:realmPath:migrationBlock:)` | `Realm.Configuration.schemaVersion` and `Realm.Configuration.migrationBlock` | -| `migrateRealm(path:encryptionKey:)` | `migrateRealm(configuration:)` | - -* `List.extend` in Realm Swift for Swift 2.0 has been replaced with `List.appendContentsOf`, - mirroring changes to `RangeReplaceableCollectionType`. - -* Object properties on `Object` subclasses in Realm Swift must be marked as optional, - otherwise a runtime exception will be thrown. - -### Enhancements - -* Persisted properties of `RLMObject`/`Object` subclasses are now Key-Value - Observing compliant. -* The different options used to create Realm instances have been consolidated - into a single `RLMRealmConfiguration`/`Realm.Configuration` object. -* Enumerating Realm collections (`RLMArray`, `RLMResults`, `List<>`, - `Results<>`) now enumerates over a copy of the collection, making it no - longer an error to modify a collection during enumeration (either directly, - or indirectly by modifying objects to make them no longer match a query). -* Improve performance of object insertion in Swift to bring it roughly in line - with Objective-C. -* Allow specifying a specific list of `RLMObject` / `Object` subclasses to include - in a given Realm via `RLMRealmConfiguration.objectClasses` / `Realm.Configuration.objectTypes`. - -### Bugfixes - -* Subscripting on `RLMObject` is now marked as nullable. - -0.94.1 Release notes (2015-08-10) -============================================================= - -### API breaking changes - -* Building for watchOS requires Xcode 7 beta 5. - -### Enhancements - -* `Object.className` is now marked as `final`. - -### Bugfixes - -* Fix crash when adding a property to a model without updating the schema - version. -* Fix unnecessary redownloading of the core library when building from source. -* Fix crash when sorting by an integer or floating-point property on iOS 7. - -0.94.0 Release notes (2015-07-29) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Reduce the amount of memory used by RLMRealm notification listener threads. -* Avoid evaluating results eagerly when filtering and sorting. -* Add nullability annotations to the Objective-C API to provide enhanced compiler - warnings and bridging to Swift. -* Make `RLMResult`s and `RLMArray`s support Objective-C generics. -* Add support for building watchOS and bitcode-compatible apps. -* Make the exceptions thrown in getters and setters more informative. -* Add `-[RLMArray exchangeObjectAtIndex:withObjectAtIndex]` and `List.swap(_:_:)` - to allow exchanging the location of two objects in the given `RLMArray` / `List`. -* Added anonymous analytics on simulator/debugger runs. -* Add `-[RLMArray moveObjectAtIndex:toIndex:]` and `List.move(from:to:)` to - allow moving objects in the given `RLMArray` / `List`. - -### Bugfixes - -* Processes crashing due to an uncaught exception inside a write transaction will - no longer cause other processes using the same Realm to hang indefinitely. -* Fix incorrect results when querying for < or <= on ints that - require 64 bits to represent with a CPU that supports SSE 4.2. -* An exception will no longer be thrown when attempting to reset the schema - version or encryption key on an open Realm to the current value. -* Date properties on 32 bit devices will retain 64 bit second precision. -* Wrap calls to the block passed to `enumerate` in an autoreleasepool to reduce - memory growth when migrating a large amount of objects. -* In-memory realms no longer write to the Documents directory on iOS or - Application Support on OS X. - -0.93.2 Release notes (2015-06-12) -============================================================= - -### Bugfixes - -* Fixed an issue where the packaged OS X Realm.framework was built with - `GCC_GENERATE_TEST_COVERAGE_FILES` and `GCC_INSTRUMENT_PROGRAM_FLOW_ARCS` - enabled. -* Fix a memory leak when constructing standalone Swift objects with NSDate - properties. -* Throw an exception rather than asserting when an invalidated object is added - to an RLMArray. -* Fix a case where data loss would occur if a device was hard-powered-off - shortly after a write transaction was committed which had to expand the Realm - file. - -0.93.1 Release notes (2015-05-29) -============================================================= - -### Bugfixes - -* Objects are no longer copied into standalone objects during object creation. This fixes an issue where - nested objects with a primary key are sometimes duplicated rather than updated. -* Comparison predicates with a constant on the left of the operator and key path on the right now give - correct results. An exception is now thrown for predicates that do not yet support this ordering. -* Fix some crashes in `index_string.cpp` with int primary keys or indexed int properties. - -0.93.0 Release notes (2015-05-27) -============================================================= - -### API breaking changes - -* Schema versions are now represented as `uint64_t` (Objective-C) and `UInt64` (Swift) so that they have - the same representation on all architectures. - -### Enhancements - -* Swift: `Results` now conforms to `CVarArgType` so it can - now be passed as an argument to `Results.filter(_:...)` - and `List.filter(_:...)`. -* Swift: Made `SortDescriptor` conform to the `Equatable` and - `StringLiteralConvertible` protocols. -* Int primary keys are once again automatically indexed. -* Improve error reporting when attempting to mark a property of a type that - cannot be indexed as indexed. - -### Bugfixes - -* Swift: `RealmSwift.framework` no longer embeds `Realm.framework`, - which now allows apps using it to pass iTunes Connect validation. - -0.92.4 Release notes (2015-05-22) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Swift: Made `Object.init()` a required initializer. -* `RLMObject`, `RLMResults`, `Object` and `Results` can now be safely - deallocated (but still not used) from any thread. -* Improve performance of `-[RLMArray indexOfObjectWhere:]` and `-[RLMArray - indexOfObjectWithPredicate:]`, and implement them for standalone RLMArrays. -* Improved performance of most simple queries. - -### Bugfixes - -* The interprocess notification mechanism no longer uses dispatch worker threads, preventing it from - starving other GCD clients of the opportunity to execute blocks when dozens of Realms are open at once. - -0.92.3 Release notes (2015-05-13) -============================================================= - -### API breaking changes - -* Swift: `Results.average(_:)` now returns an optional, which is `nil` if and only if the results - set is empty. - -### Enhancements - -* Swift: Added `List.invalidated`, which returns if the given `List` is no longer - safe to be accessed, and is analogous to `-[RLMArray isInvalidated]`. -* Assertion messages are automatically logged to Crashlytics if it's loaded - into the current process to make it easier to diagnose crashes. - -### Bugfixes - -* Swift: Enumerating through a standalone `List` whose objects themselves - have list properties won't crash. -* Swift: Using a subclass of `RealmSwift.Object` in an aggregate operator of a predicate - no longer throws a spurious type error. -* Fix incorrect results for when using OR in a query on a `RLMArray`/`List<>`. -* Fix incorrect values from `[RLMResults count]`/`Results.count` when using - `!=` on an int property with no other query conditions. -* Lower the maximum doubling threshold for Realm file sizes from 128MB to 16MB - to reduce the amount of wasted space. - -0.92.2 Release notes (2015-05-08) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Exceptions raised when incorrect object types are used with predicates now contain more detailed information. -* Added `-[RLMMigration deleteDataForClassName:]` and `Migration.deleteData(_:)` - to enable cleaning up after removing object subclasses - -### Bugfixes - -* Prevent debugging of an application using an encrypted Realm to work around - frequent LLDB hangs. Until the underlying issue is addressed you may set - REALM_DISABLE_ENCRYPTION=YES in your application's environment variables to - have requests to open an encrypted Realm treated as a request for an - unencrypted Realm. -* Linked objects are properly updated in `createOrUpdateInRealm:withValue:`. -* List properties on Objects are now properly initialized during fast enumeration. - -0.92.1 Release notes (2015-05-06) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* `-[RLMRealm inWriteTransaction]` is now public. -* Realm Swift is now available on CoocaPods. - -### Bugfixes - -* Force code re-signing after stripping architectures in `strip-frameworks.sh`. - -0.92.0 Release notes (2015-05-05) -============================================================= - -### API breaking changes - -* Migration blocks are no longer called when a Realm file is first created. -* The following APIs have been deprecated in favor of newer method names: - -| Deprecated API | New API | -|:-------------------------------------------------------|:------------------------------------------------------| -| `-[RLMMigration createObject:withObject:]` | `-[RLMMigration createObject:withValue:]` | -| `-[RLMObject initWithObject:]` | `-[RLMObject initWithValue:]` | -| `+[RLMObject createInDefaultRealmWithObject:]` | `+[RLMObject createInDefaultRealmWithValue:]` | -| `+[RLMObject createInRealm:withObject:]` | `+[RLMObject createInRealm:withValue:]` | -| `+[RLMObject createOrUpdateInDefaultRealmWithObject:]` | `+[RLMObject createOrUpdateInDefaultRealmWithValue:]` | -| `+[RLMObject createOrUpdateInRealm:withObject:]` | `+[RLMObject createOrUpdateInRealm:withValue:]` | - -### Enhancements - -* `Int8` properties defined in Swift are now treated as integers, rather than - booleans. -* NSPredicates created using `+predicateWithValue:` are now supported. - -### Bugfixes - -* Compound AND predicates with no subpredicates now correctly match all objects. - -0.91.5 Release notes (2015-04-28) -============================================================= - -### Bugfixes - -* Fix issues with removing search indexes and re-enable it. - -0.91.4 Release notes (2015-04-27) -============================================================= - -### Bugfixes - -* Temporarily disable removing indexes from existing columns due to bugs. - -0.91.3 Release notes (2015-04-17) -============================================================= - -### Bugfixes - -* Fix `Extra argument 'objectClassName' in call` errors when building via - CocoaPods. - -0.91.2 Release notes (2015-04-16) -============================================================= - -* Migration blocks are no longer called when a Realm file is first created. - -### Enhancements - -* `RLMCollection` supports collection KVC operations. -* Sorting `RLMResults` is 2-5x faster (typically closer to 2x). -* Refreshing `RLMRealm` after a write transaction which inserts or modifies - strings or `NSData` is committed on another thread is significantly faster. -* Indexes are now added and removed from existing properties when a Realm file - is opened, rather than only when properties are first added. - -### Bugfixes - -* `+[RLMSchema dynamicSchemaForRealm:]` now respects search indexes. -* `+[RLMProperty isEqualToProperty:]` now checks for equal `indexed` properties. - -0.91.1 Release notes (2015-03-12) -============================================================= - -### Enhancements - -* The browser will automatically refresh when the Realm has been modified - from another process. -* Allow using Realm in an embedded framework by setting - `APPLICATION_EXTENSION_API_ONLY` to YES. - -### Bugfixes - -* Fix a crash in CFRunLoopSourceInvalidate. - -0.91.0 Release notes (2015-03-10) -============================================================= - -### API breaking changes - -* `attributesForProperty:` has been removed from `RLMObject`. You now specify indexed - properties by implementing the `indexedProperties` method. -* An exception will be thrown when calling `setEncryptionKey:forRealmsAtPath:`, - `setSchemaVersion:forRealmAtPath:withMigrationBlock:`, and `migrateRealmAtPath:` - when a Realm at the given path is already open. -* Object and array properties of type `RLMObject` will no longer be allowed. - -### Enhancements - -* Add support for sharing Realm files between processes. -* The browser will no longer show objects that have no persisted properties. -* `RLMSchema`, `RLMObjectSchema`, and `RLMProperty` now have more useful descriptions. -* Opening an encrypted Realm while a debugger is attached to the process no - longer throws an exception. -* `RLMArray` now exposes an `isInvalidated` property to indicate if it can no - longer be accessed. - -### Bugfixes - -* An exception will now be thrown when calling `-beginWriteTransaction` from within a notification - triggered by calling `-beginWriteTransaction` elsewhere. -* When calling `delete:` we now verify that the object being deleted is persisted in the target Realm. -* Fix crash when calling `createOrUpdate:inRealm` with nested linked objects. -* Use the key from `+[RLMRealm setEncryptionKey:forRealmsAtPath:]` in - `-writeCopyToPath:error:` and `+migrateRealmAtPath:`. -* Comparing an RLMObject to a non-RLMObject using `-[RLMObject isEqual:]` or - `-isEqualToObject:` now returns NO instead of crashing. -* Improved error message when an `RLMObject` subclass is defined nested within - another Swift declaration. -* Fix crash when the process is terminated by the OS on iOS while encrypted realms are open. -* Fix crash after large commits to encrypted realms. - -0.90.6 Release notes (2015-02-20) -============================================================= - -### Enhancements - -* Improve compatibility of encrypted Realms with third-party crash reporters. - -### Bugfixes - -* Fix incorrect results when using aggregate functions on sorted RLMResults. -* Fix data corruption when using writeCopyToPath:encryptionKey:. -* Maybe fix some assertion failures. - -0.90.5 Release notes (2015-02-04) -============================================================= - -### Bugfixes - -* Fix for crashes when encryption is enabled on 64-bit iOS devices. - -0.90.4 Release notes (2015-01-29) -============================================================= - -### Bugfixes - -* Fix bug that resulted in columns being dropped and recreated during migrations. - -0.90.3 Release notes (2015-01-27) -============================================================= - -### Enhancements - -* Calling `createInDefaultRealmWithObject:`, `createInRealm:withObject:`, - `createOrUpdateInDefaultRealmWithObject:` or `createOrUpdateInRealm:withObject:` - is a no-op if the argument is an RLMObject of the same type as the receiver - and is already backed by the target realm. - -### Bugfixes - -* Fix incorrect column type assertions when the first Realm file opened is a - read-only file that is missing tables. -* Throw an exception when adding an invalidated or deleted object as a link. -* Throw an exception when calling `createOrUpdateInRealm:withObject:` when the - receiver has no primary key defined. - -0.90.1 Release notes (2015-01-22) -============================================================= - -### Bugfixes - -* Fix for RLMObject being treated as a model object class and showing up in the browser. -* Fix compilation from the podspec. -* Fix for crash when calling `objectsWhere:` with grouping in the query on `allObjects`. - -0.90.0 Release notes (2015-01-21) -============================================================= - -### API breaking changes - -* Rename `-[RLMRealm encryptedRealmWithPath:key:readOnly:error:]` to - `-[RLMRealm realmWithPath:encryptionKey:readOnly:error:]`. -* `-[RLMRealm setSchemaVersion:withMigrationBlock]` is no longer global and must be called - for each individual Realm path used. You can now call `-[RLMRealm setDefaultRealmSchemaVersion:withMigrationBlock]` - for the default Realm and `-[RLMRealm setSchemaVersion:forRealmAtPath:withMigrationBlock:]` for all others; - -### Enhancements - -* Add `-[RLMRealm writeCopyToPath:encryptionKey:error:]`. -* Add support for comparing string columns to other string columns in queries. - -### Bugfixes - -* Roll back changes made when an exception is thrown during a migration. -* Throw an exception if the number of items in a RLMResults or RLMArray changes - while it's being fast-enumerated. -* Also encrypt the temporary files used when encryption is enabled for a Realm. -* Fixed crash in JSONImport example on OS X with non-en_US locale. -* Fixed infinite loop when opening a Realm file in the Browser at the same time - as it is open in a 32-bit simulator. -* Fixed a crash when adding primary keys to older realm files with no primary - keys on any objects. -* Fixed a crash when removing a primary key in a migration. -* Fixed a crash when multiple write transactions with no changes followed by a - write transaction with changes were committed without the main thread - RLMRealm getting a chance to refresh. -* Fixed incomplete results when querying for non-null relationships. -* Improve the error message when a Realm file is opened in multiple processes - at once. - -0.89.2 Release notes (2015-01-02) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix an assertion failure when invalidating a Realm which is in a write - transaction, has already been invalidated, or has never been used. -* Fix an assertion failure when sorting an empty RLMArray property. -* Fix a bug resulting in the browser never becoming visible on 10.9. -* Write UTF-8 when generating class files from a realm file in the Browser. - -0.89.1 Release notes (2014-12-22) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Improve the error message when a Realm can't be opened due to lacking write - permissions. - -### Bugfixes - -* Fix an assertion failure when inserting rows after calling `deleteAllObjects` - on a Realm. -* Separate dynamic frameworks are now built for the simulator and devices to - work around App Store submission errors due to the simulator version not - being automatically stripped from dynamic libraries. - -0.89.0 Release notes (2014-12-18) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Add support for encrypting Realm files on disk. -* Support using KVC-compliant objects without getters or with custom getter - names to initialize RLMObjects with `createObjectInRealm` and friends. - -### Bugfixes - -* Merge native Swift default property values with defaultPropertyValues(). -* Don't leave the database schema partially updated when opening a realm fails - due to a migration being needed. -* Fixed issue where objects with custom getter names couldn't be used to - initialize other objects. -* Fix a major performance regression on queries on string properties. -* Fix a memory leak when circularly linked objects are added to a Realm. - -0.88.0 Release notes (2014-12-02) -============================================================= - -### API breaking changes - -* Deallocating an RLMRealm instance in a write transaction lacking an explicit - commit/cancel will now be automatically cancelled instead of committed. -* `-[RLMObject isDeletedFromRealm]` has been renamed to `-[RLMObject isInvalidated]`. - -### Enhancements - -* Add `-[RLMRealm writeCopyToPath:]` to write a compacted copy of the Realm - another file. -* Add support for case insensitive, BEGINSWITH, ENDSWITH and CONTAINS string - queries on array properties. -* Make fast enumeration of `RLMArray` and `RLMResults` ~30% faster and - `objectAtIndex:` ~55% faster. -* Added a lldb visualizer script for displaying the contents of persisted - RLMObjects when debugging. -* Added method `-setDefaultRealmPath:` to change the default Realm path. -* Add `-[RLMRealm invalidate]` to release data locked by the current thread. - -### Bugfixes - -* Fix for crash when running many simultaneous write transactions on background threads. -* Fix for crashes caused by opening Realms at multiple paths simultaneously which have had - properties re-ordered during migration. -* Don't run the query twice when `firstObject` or `lastObject` are called on an - `RLMResults` which has not had its results accessed already. -* Fix for bug where schema version is 0 for new Realm created at the latest version. -* Fix for error message where no migration block is specified when required. - -0.87.4 Release notes (2014-11-07) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix browser location in release zip. - -0.87.3 Release notes (2014-11-06) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Added method `-linkingObjectsOfClass:forProperty:` to RLMObject to expose inverse - relationships/backlinks. - -### Bugfixes - -* Fix for crash due to missing search index when migrating an object with a string primary key - in a database created using an older versions (0.86.3 and earlier). -* Throw an exception when passing an array containing a - non-RLMObject to -[RLMRealm addObjects:]. -* Fix for crash when deleting an object from multiple threads. - -0.87.0 Release notes (2014-10-21) -============================================================= - -### API breaking changes - -* RLMArray has been split into two classes, `RLMArray` and `RLMResults`. RLMArray is - used for object properties as in previous releases. Moving forward all methods used to - enumerate, query, and sort objects return an instance of a new class `RLMResults`. This - change was made to support diverging apis and the future addition of change notifications - for queries. -* The api for migrations has changed. You now call `setSchemaVersion:withMigrationBlock:` to - register a global migration block and associated version. This block is applied to Realms as - needed when opened for Realms at a previous version. The block can be applied manually if - desired by calling `migrateRealmAtPath:`. -* `arraySortedByProperty:ascending:` was renamed to `sortedResultsUsingProperty:ascending` -* `addObjectsFromArray:` on both `RLMRealm` and `RLMArray` has been renamed to `addObjects:` - and now accepts any container class which implements `NSFastEnumeration` -* Building with Swift support now requires Xcode 6.1 - -### Enhancements - -* Add support for sorting `RLMArray`s by multiple columns with `sortedResultsUsingDescriptors:` -* Added method `deleteAllObjects` on `RLMRealm` to clear a Realm. -* Added method `createObject:withObject:` on `RLMMigration` which allows object creation during migrations. -* Added method `deleteObject:` on `RLMMigration` which allows object deletion during migrations. -* Updating to core library version 0.85.0. -* Implement `objectsWhere:` and `objectsWithPredicate:` for array properties. -* Add `cancelWriteTransaction` to revert all changes made in a write transaction and end the transaction. -* Make creating `RLMRealm` instances on background threads when an instance - exists on another thread take a fifth of the time. -* Support for partial updates when calling `createOrUpdateWithObject:` and `addOrUpdateObject:` -* Re-enable Swift support on OS X - -### Bugfixes - -* Fix exceptions when trying to set `RLMObject` properties after rearranging - the properties in a `RLMObject` subclass. -* Fix crash on IN query with several thousand items. -* Fix crash when querying indexed `NSString` properties. -* Fixed an issue which prevented in-memory Realms from being used accross multiple threads. -* Preserve the sort order when querying a sorted `RLMResults`. -* Fixed an issue with migrations where if a Realm file is deleted after a Realm is initialized, - the newly created Realm can be initialized with an incorrect schema version. -* Fix crash in `RLMSuperSet` when assigning to a `RLMArray` property on a standalone object. -* Add an error message when the protocol for an `RLMArray` property is not a - valid object type. -* Add an error message when an `RLMObject` subclass is defined nested within - another Swift class. - -0.86.3 Release notes (2014-10-09) -============================================================= - -### Enhancements - -* Add support for != in queries on object relationships. - -### Bugfixes - -* Re-adding an object to its Realm no longer throws an exception and is now a no-op - (as it was previously). -* Fix another bug which would sometimes result in subclassing RLMObject - subclasses not working. - -0.86.2 Release notes (2014-10-06) -============================================================= - -### Bugfixes - -* Fixed issues with packaging "Realm Browser.app" for release. - -0.86.1 Release notes (2014-10-03) -============================================================= - -### Bugfixes - -* Fix a bug which would sometimes result in subclassing RLMObject subclasses - not working. - -0.86.0 Release notes (2014-10-03) -============================================================= - -### API breaking changes - -* Xcode 6 is now supported from the main Xcode project `Realm.xcodeproj`. - Xcode 5 is no longer supported. - -### Enhancements - -* Support subclassing RLMObject models. Although you can now persist subclasses, - polymorphic behavior is not supported (i.e. setting a property to an - instance of its subclass). -* Add support for sorting RLMArray properties. -* Speed up inserting objects with `addObject:` by ~20%. -* `readonly` properties are automatically ignored rather than having to be - added to `ignoredProperties`. -* Updating to core library version 0.83.1. -* Return "[deleted object]" rather than throwing an exception when - `-description` is called on a deleted RLMObject. -* Significantly improve performance of very large queries. -* Allow passing any enumerable to IN clauses rather than just NSArray. -* Add `objectForPrimaryKey:` and `objectInRealm:forPrimaryKey:` convenience - methods to fetch an object by primary key. - -### Bugfixes - -* Fix error about not being able to persist property 'hash' with incompatible - type when building for devices with Xcode 6. -* Fix spurious notifications of new versions of Realm. -* Fix for updating nested objects where some types do not have primary keys. -* Fix for inserting objects from JSON with NSNull values when default values - should be used. -* Trying to add a persisted RLMObject to a different Realm now throws an - exception rather than creating an uninitialized object. -* Fix validation errors when using IN on array properties. -* Fix errors when an IN clause has zero items. -* Fix for chained queries ignoring all but the last query's conditions. - -0.85.0 Release notes (2014-09-15) -============================================================= - -### API breaking changes - -* Notifications for a refresh being needed (when autorefresh is off) now send - the notification type RLMRealmRefreshRequiredNotification rather than - RLMRealmDidChangeNotification. - -### Enhancements - -* Updating to core library version 0.83.0. -* Support for primary key properties (for int and string columns). Declaring a property - to be the primary key ensures uniqueness for that property for all objects of a given type. - At the moment indexes on primary keys are not yet supported but this will be added in a future - release. -* Added methods to update or insert (upsert) for objects with primary keys defined. -* `[RLMObject initWithObject:]` and `[RLMObject createInRealmWithObject:]` now support - any object type with kvc properties. -* The Swift support has been reworked to work around Swift not being supported - in Frameworks on iOS 7. -* Improve performance when getting the count of items matching a query but not - reading any of the objects in the results. -* Add a return value to `-[RLMRealm refresh]` that indicates whether or not - there was anything to refresh. -* Add the class name to the error message when an RLMObject is missing a value - for a property without a default. -* Add support for opening Realms in read-only mode. -* Add an automatic check for updates when using Realm in a simulator (the - checker code is not compiled into device builds). This can be disabled by - setting the REALM_DISABLE_UPDATE_CHECKER environment variable to any value. -* Add support for Int16 and Int64 properties in Swift classes. - -### Bugfixes - -* Realm change notifications when beginning a write transaction are now sent - after updating rather than before, to match refresh. -* `-isEqual:` now uses the default `NSObject` implementation unless a primary key - is specified for an RLMObject. When a primary key is specified, `-isEqual:` calls - `-isEqualToObject:` and a corresponding implementation for `-hash` is also implemented. - -0.84.0 Release notes (2014-08-28) -============================================================= - -### API breaking changes - -* The timer used to trigger notifications has been removed. Notifications are now - only triggered by commits made in other threads, and can not currently be triggered - by changes made by other processes. Interprocess notifications will be re-added in - a future commit with an improved design. - -### Enhancements - -* Updating to core library version 0.82.2. -* Add property `deletedFromRealm` to RLMObject to indicate objects which have been deleted. -* Add support for the IN operator in predicates. -* Add support for the BETWEEN operator in link queries. -* Add support for multi-level link queries in predicates (e.g. `foo.bar.baz = 5`). -* Switch to building the SDK from source when using CocoaPods and add a - Realm.Headers subspec for use in targets that should not link a copy of Realm - (such as test targets). -* Allow unregistering from change notifications in the change notification - handler block. -* Significant performance improvements when holding onto large numbers of RLMObjects. -* Realm-Xcode6.xcodeproj now only builds using Xcode6-Beta6. -* Improved performance during RLMArray iteration, especially when mutating - contained objects. - -### Bugfixes - -* Fix crashes and assorted bugs when sorting or querying a RLMArray returned - from a query. -* Notifications are no longer sent when initializing new RLMRealm instances on background - threads. -* Handle object cycles in -[RLMObject description] and -[RLMArray description]. -* Lowered the deployment target for the Xcode 6 projects and Swift examples to - iOS 7.0, as they didn't actually require 8.0. -* Support setting model properties starting with the letter 'z' -* Fixed crashes that could result from switching between Debug and Relase - builds of Realm. - -0.83.0 Release notes (2014-08-13) -============================================================= - -### API breaking changes - -* Realm-Xcode6.xcodeproj now only builds using Xcode6-Beta5. -* Properties to be persisted in Swift classes must be explicitly declared as `dynamic`. -* Subclasses of RLMObject subclasses now throw an exception on startup, rather - than when added to a Realm. - -### Enhancements - -* Add support for querying for nil object properties. -* Improve error message when specifying invalid literals when creating or - initializing RLMObjects. -* Throw an exception when an RLMObject is used from the incorrect thread rather - than crashing in confusing ways. -* Speed up RLMRealm instantiation and array property iteration. -* Allow array and objection relation properties to be missing or null when - creating a RLMObject from a NSDictionary. - -### Bugfixes - -* Fixed a memory leak when querying for objects. -* Fixed initializing array properties on standalone Swift RLMObject subclasses. -* Fix for queries on 64bit integers. - -0.82.0 Release notes (2014-08-05) -============================================================= - -### API breaking changes - -* Realm-Xcode6.xcodeproj now only builds using Xcode6-Beta4. - -### Enhancements - -* Updating to core library version 0.80.5. -* Now support disabling the `autorefresh` property on RLMRealm instances. -* Building Realm-Xcode6 for iOS now builds a universal framework for Simulator & Device. -* Using NSNumber properties (unsupported) now throws a more informative exception. -* Added `[RLMRealm defaultRealmPath]` -* Proper implementation for [RLMArray indexOfObjectWhere:] -* The default Realm path on OS X is now ~/Library/Application Support/[bundle - identifier]/default.realm rather than ~/Documents -* We now check that the correct framework (ios or osx) is used at compile time. - -### Bugfixes - -* Fixed rapid growth of the realm file size. -* Fixed a bug which could cause a crash during RLMArray destruction after a query. -* Fixed bug related to querying on float properties: `floatProperty = 1.7` now works. -* Fixed potential bug related to the handling of array properties (RLMArray). -* Fixed bug where array properties accessed the wrong property. -* Fixed bug that prevented objects with custom getters to be added to a Realm. -* Fixed a bug where initializing a standalone object with an array literal would - trigger an exception. -* Clarified exception messages when using unsupported NSPredicate operators. -* Clarified exception messages when using unsupported property types on RLMObject subclasses. -* Fixed a memory leak when breaking out of a for-in loop on RLMArray. -* Fixed a memory leak when removing objects from a RLMArray property. -* Fixed a memory leak when querying for objects. - - -0.81.0 Release notes (2014-07-22) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Updating to core library version 0.80.3. -* Added support for basic querying of RLMObject and RLMArray properties (one-to-one and one-to-many relationships). - e.g. `[Person objectsWhere:@"dog.name == 'Alfonso'"]` or `[Person objectsWhere:@"ANY dogs.name == 'Alfonso'"]` - Supports all normal operators for numeric and date types. Does not support NSData properties or `BEGINSWITH`, `ENDSWITH`, `CONTAINS` - and other options for string properties. -* Added support for querying for object equality in RLMObject and RLMArray properties (one-to-one and one-to-many relationships). - e.g. `[Person objectsWhere:@"dog == %@", myDog]` `[Person objectsWhere:@"ANY dogs == %@", myDog]` `[Person objectsWhere:@"ANY friends.dog == %@", dog]` - Only supports comparing objects for equality (i.e. ==) -* Added a helper method to RLMRealm to perform a block inside a transaction. -* OSX framework now supported in CocoaPods. - -### Bugfixes - -* Fixed Unicode support in property names and string contents (Chinese, Russian, etc.). Closing #612 and #604. -* Fixed bugs related to migration when properties are removed. -* Fixed keyed subscripting for standalone RLMObjects. -* Fixed bug related to double clicking on a .realm file to launch the Realm Browser (thanks to Dean Moore). - - -0.80.0 Release notes (2014-07-15) -============================================================= - -### API breaking changes - -* Rename migration methods to -migrateDefaultRealmWithBlock: and -migrateRealmAtPath:withBlock: -* Moved Realm specific query methods from RLMRealm to class methods on RLMObject (-allObjects: to +allObjectsInRealm: ect.) - -### Enhancements - -* Added +createInDefaultRealmWithObject: method to RLMObject. -* Added support for array and object literals when calling -createWithObject: and -initWithObject: variants. -* Added method -deleteObjects: to batch delete objects from a Realm -* Support for defining RLMObject models entirely in Swift (experimental, see known issues). -* RLMArrays in Swift support Sequence-style enumeration (for obj in array). -* Implemented -indexOfObject: for RLMArray - -### Known Issues for Swift-defined models - -* Properties other than String, NSData and NSDate require a default value in the model. This can be an empty (but typed) array for array properties. -* The previous caveat also implies that not all models defined in Objective-C can be used for object properties. Only Objective-C models with only implicit (i.e. primitives) or explicit default values can be used. However, any Objective-C model object can be used in a Swift array property. -* Array property accessors don't work until its parent object has been added to a realm. -* Realm-Bridging-Header.h is temporarily exposed as a public header. This is temporary and will be private again once rdar://17633863 is fixed. -* Does not leverage Swift generics and still uses RLM-prefix everywhere. This is coming in #549. - - -0.22.0 Release notes -============================================================= - -### API breaking changes - -* Rename schemaForObject: to schemaForClassName: on RLMSchema -* Removed -objects:where: and -objects:orderedBy:where: from RLMRealm -* Removed -indexOfObjectWhere:, -objectsWhere: and -objectsOrderedBy:where: from RLMArray -* Removed +objectsWhere: and +objectsOrderedBy:where: from RLMObject - -### Enhancements - -* New Xcode 6 project for experimental swift support. -* New Realm Editor app for reading and editing Realm db files. -* Added support for migrations. -* Added support for RLMArray properties on objects. -* Added support for creating in-memory default Realm. -* Added -objectsWithClassName:predicateFormat: and -objectsWithClassName:predicate: to RLMRealm -* Added -indexOfObjectWithPredicateFormat:, -indexOfObjectWithPredicate:, -objectsWithPredicateFormat:, -objectsWithPredi -* Added +objectsWithPredicateFormat: and +objectsWithPredicate: to RLMObject -* Now allows predicates comparing two object properties of the same type. - - -0.20.0 Release notes (2014-05-28) -============================================================= - -Completely rewritten to be much more object oriented. - -### API breaking changes - -* Everything - -### Enhancements - -* None. - -### Bugfixes - -* None. - - -0.11.0 Release notes (not released) -============================================================= - -The Objective-C API has been updated and your code will break! - -### API breaking changes - -* `RLMTable` objects can only be created with an `RLMRealm` object. -* Renamed `RLMContext` to `RLMTransactionManager` -* Renamed `RLMContextDidChangeNotification` to `RLMRealmDidChangeNotification` -* Renamed `contextWithDefaultPersistence` to `managerForDefaultRealm` -* Renamed `contextPersistedAtPath:` to `managerForRealmWithPath:` -* Renamed `realmWithDefaultPersistence` to `defaultRealm` -* Renamed `realmWithDefaultPersistenceAndInitBlock` to `defaultRealmWithInitBlock` -* Renamed `find:` to `firstWhere:` -* Renamed `where:` to `allWhere:` -* Renamed `where:orderBy:` to `allWhere:orderBy:` - -### Enhancements - -* Added `countWhere:` on `RLMTable` -* Added `sumOfColumn:where:` on `RLMTable` -* Added `averageOfColumn:where:` on `RLMTable` -* Added `minOfProperty:where:` on `RLMTable` -* Added `maxOfProperty:where:` on `RLMTable` -* Added `toJSONString` on `RLMRealm`, `RLMTable` and `RLMView` -* Added support for `NOT` operator in predicates -* Added support for default values -* Added validation support in `createInRealm:withObject:` - -### Bugfixes - -* None. - - -0.10.0 Release notes (2014-04-23) -============================================================= - -TightDB is now Realm! The Objective-C API has been updated -and your code will break! - -### API breaking changes - -* All references to TightDB have been changed to Realm. -* All prefixes changed from `TDB` to `RLM`. -* `TDBTransaction` and `TDBSmartContext` have merged into `RLMRealm`. -* Write transactions now take an optional rollback parameter (rather than needing to return a boolean). -* `addColumnWithName:` and variant methods now return the index of the newly created column if successful, `NSNotFound` otherwise. - -### Enhancements - -* `createTableWithName:columns:` has been added to `RLMRealm`. -* Added keyed subscripting for RLMTable's first column if column is of type RLMPropertyTypeString. -* `setRow:atIndex:` has been added to `RLMTable`. -* `RLMRealm` constructors now have variants that take an writable initialization block -* New object interface - tables created/retrieved using `tableWithName:objectClass:` return custom objects - -### Bugfixes - -* None. - - -0.6.0 Release notes (2014-04-11) -============================================================= - -### API breaking changes - -* `contextWithPersistenceToFile:error:` renamed to `contextPersistedAtPath:error:` in `TDBContext` -* `readWithBlock:` renamed to `readUsingBlock:` in `TDBContext` -* `writeWithBlock:error:` renamed to `writeUsingBlock:error:` in `TDBContext` -* `readTable:withBlock:` renamed to `readTable:usingBlock:` in `TDBContext` -* `writeTable:withBlock:error:` renamed to `writeTable:usingBlock:error:` in `TDBContext` -* `findFirstRow` renamed to `indexOfFirstMatchingRow` on `TDBQuery`. -* `findFirstRowFromIndex:` renamed to `indexOfFirstMatchingRowFromIndex:` on `TDBQuery`. -* Return `NSNotFound` instead of -1 when appropriate. -* Renamed `castClass` to `castToTytpedTableClass` on `TDBTable`. -* `removeAllRows`, `removeRowAtIndex`, `removeLastRow`, `addRow` and `insertRow` methods - on table now return void instead of BOOL. - -### Enhancements -* A `TDBTable` can now be queried using `where:` and `where:orderBy:` taking - `NSPredicate` and `NSSortDescriptor` as arguments. -* Added `find:` method on `TDBTable` to find first row matching predicate. -* `contextWithDefaultPersistence` class method added to `TDBContext`. Will create a context persisted - to a file in app/documents folder. -* `renameColumnWithIndex:to:` has been added to `TDBTable`. -* `distinctValuesInColumnWithIndex` has been added to `TDBTable`. -* `dateIsBetween::`, `doubleIsBetween::`, `floatIsBetween::` and `intIsBetween::` - have been added to `TDBQuery`. -* Column names in Typed Tables can begin with non-capital letters too. The generated `addX` - selector can look odd. For example, a table with one column with name `age`, - appending a new row will look like `[table addage:7]`. -* Mixed typed values are better validated when rows are added, inserted, - or modified as object literals. -* `addRow`, `insertRow`, and row updates can be done using objects - derived from `NSObject`. -* `where` has been added to `TDBView`and `TDBViewProtocol`. -* Adding support for "smart" contexts (`TDBSmartContext`). - -### Bugfixes - -* Modifications of a `TDBView` and `TDBQuery` now throw an exception in a readtransaction. - - -0.5.0 Release notes (2014-04-02) -============================================================= - -The Objective-C API has been updated and your code will break! -Of notable changes a fast interface has been added. -This interface includes specific methods to get and set values into Tightdb. -To use these methods import ``. - -### API breaking changes - -* `getTableWithName:` renamed to `tableWithName:` in `TDBTransaction`. -* `addColumnWithName:andType:` renamed to `addColumnWithName:type:` in `TDBTable`. -* `columnTypeOfColumn:` renamed to `columnTypeOfColumnWithIndex` in `TDBTable`. -* `columnNameOfColumn:` renamed to `nameOfColumnWithIndex:` in `TDBTable`. -* `addColumnWithName:andType:` renamed to `addColumnWithName:type:` in `TDBDescriptor`. -* Fast getters and setters moved from `TDBRow.h` to `TDBRowFast.h`. - -### Enhancements - -* Added `minDateInColumnWithIndex` and `maxDateInColumnWithIndex` to `TDBQuery`. -* Transactions can now be started directly on named tables. -* You can create dynamic tables with initial schema. -* `TDBTable` and `TDBView` now have a shared protocol so they can easier be used interchangeably. - -### Bugfixes - -* Fixed bug in 64 bit iOS when inserting BOOL as NSNumber. - - -0.4.0 Release notes (2014-03-26) -============================================================= - -### API breaking changes - -* Typed interface Cursor has now been renamed to Row. -* TDBGroup has been renamed to TDBTransaction. -* Header files are renamed so names match class names. -* Underscore (_) removed from generated typed table classes. -* TDBBinary has been removed; use NSData instead. -* Underscope (_) removed from generated typed table classes. -* Constructor for TDBContext has been renamed to contextWithPersistenceToFile: -* Table findFirstRow and min/max/sum/avg operations has been hidden. -* Table.appendRow has been renamed to addRow. -* getOrCreateTable on Transaction has been removed. -* set*:inColumnWithIndex:atRowIndex: methods have been prefixed with TDB -* *:inColumnWithIndex:atRowIndex: methods have been prefixed with TDB -* addEmptyRow on table has been removed. Use [table addRow:nil] instead. -* TDBMixed removed. Use id and NSObject instead. -* insertEmptyRow has been removed from table. Use insertRow:nil atIndex:index instead. - -#### Enhancements - -* Added firstRow, lastRow selectors on view. -* firstRow and lastRow on table now return nil if table is empty. -* getTableWithName selector added on group. -* getting and creating table methods on group no longer take error argument. -* [TDBQuery parent] and [TDBQuery subtable:] selectors now return self. -* createTable method added on Transaction. Throws exception if table with same name already exists. -* Experimental support for pinning transactions on Context. -* TDBView now has support for object subscripting. - -### Bugfixes - -* None. - - -0.3.0 Release notes (2014-03-14) -============================================================= - -The Objective-C API has been updated and your code will break! - -### API breaking changes - -* Most selectors have been renamed in the binding! -* Prepend TDB-prefix on all classes and types. - -### Enhancements - -* Return types and parameters changed from size_t to NSUInteger. -* Adding setObject to TightdbTable (t[2] = @[@1, @"Hello"] is possible). -* Adding insertRow to TightdbTable. -* Extending appendRow to accept NSDictionary. - -### Bugfixes - -* None. - - -0.2.0 Release notes (2014-03-07) -============================================================= - -The Objective-C API has been updated and your code will break! - -### API breaking changes - -* addRow renamed to addEmptyRow - -### Enhancements - -* Adding a simple class for version numbering. -* Adding get-version and set-version targets to build.sh. -* tableview now supports sort on column with column type bool, date and int -* tableview has method for checking the column type of a specified column -* tableview has method for getting the number of columns -* Adding methods getVersion, getCoreVersion and isAtLeast. -* Adding appendRow to TightdbTable. -* Adding object subscripting. -* Adding method removeColumn on table. - -### Bugfixes - -* None. diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/NSError+RLMSync.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/NSError+RLMSync.h deleted file mode 100644 index 5ef323a24..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/NSError+RLMSync.h +++ /dev/null @@ -1,46 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2017 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@class RLMSyncErrorActionToken; - -/// NSError category extension providing methods to get data out of Realm's -/// "client reset" error. -@interface NSError (RLMSync) - -/** - Given an appropriate Atlas App Services error, return the token that - can be passed into `+[RLMSyncSession immediatelyHandleError:]` to - immediately perform error clean-up work, or nil if the error isn't of - a type that provides a token. - */ -- (nullable RLMSyncErrorActionToken *)rlmSync_errorActionToken NS_REFINED_FOR_SWIFT; - -/** - Given an Atlas App Services client reset error, return the path where the - backup copy of the Realm will be placed once the client reset process is - complete. - */ -- (nullable NSString *)rlmSync_clientResetBackedUpRealmPath NS_SWIFT_UNAVAILABLE(""); - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMAPIKeyAuth.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMAPIKeyAuth.h deleted file mode 100644 index 642bdd95d..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMAPIKeyAuth.h +++ /dev/null @@ -1,95 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMUserAPIKey, RLMObjectId; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// Provider client for user API keys. -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMAPIKeyAuth : RLMProviderClient - -/// A block type used to report an error -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMAPIKeyAuthOptionalErrorBlock)(NSError * _Nullable); - -/// A block type used to return an `RLMUserAPIKey` on success, or an `NSError` on failure -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMOptionalUserAPIKeyBlock)(RLMUserAPIKey * _Nullable, NSError * _Nullable); - -/// A block type used to return an array of `RLMUserAPIKey` on success, or an `NSError` on failure -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMUserAPIKeysBlock)(NSArray * _Nullable, NSError * _Nullable); - -/** - Creates a user API key that can be used to authenticate as the current user. - - @param name The name of the API key to be created. - @param completion A callback to be invoked once the call is complete. -*/ -- (void)createAPIKeyWithName:(NSString *)name - completion:(RLMOptionalUserAPIKeyBlock)completion NS_SWIFT_NAME(createAPIKey(named:completion:)); - -/** - Fetches a user API key associated with the current user. - - @param objectId The ObjectId of the API key to fetch. - @param completion A callback to be invoked once the call is complete. - */ -- (void)fetchAPIKey:(RLMObjectId *)objectId - completion:(RLMOptionalUserAPIKeyBlock)completion; - -/** - Fetches the user API keys associated with the current user. - - @param completion A callback to be invoked once the call is complete. - */ -- (void)fetchAPIKeysWithCompletion:(RLMUserAPIKeysBlock)completion; - -/** - Deletes a user API key associated with the current user. - - @param objectId The ObjectId of the API key to delete. - @param completion A callback to be invoked once the call is complete. - */ -- (void)deleteAPIKey:(RLMObjectId *)objectId - completion:(RLMAPIKeyAuthOptionalErrorBlock)completion; - -/** - Enables a user API key associated with the current user. - - @param objectId The ObjectId of the API key to enable. - @param completion A callback to be invoked once the call is complete. - */ -- (void)enableAPIKey:(RLMObjectId *)objectId - completion:(RLMAPIKeyAuthOptionalErrorBlock)completion; - -/** - Disables a user API key associated with the current user. - - @param objectId The ObjectId of the API key to disable. - @param completion A callback to be invoked once the call is complete. - */ -- (void)disableAPIKey:(RLMObjectId *)objectId - completion:(RLMAPIKeyAuthOptionalErrorBlock)completion; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMApp.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMApp.h deleted file mode 100644 index 2228232e8..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMApp.h +++ /dev/null @@ -1,235 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@protocol RLMNetworkTransport, RLMBSON; - -@class RLMUser, RLMCredentials, RLMSyncManager, RLMEmailPasswordAuth, RLMPushClient, RLMSyncTimeoutOptions; - -/// A block type used for APIs which asynchronously vend an `RLMUser`. -typedef void(^RLMUserCompletionBlock)(RLMUser * _Nullable, NSError * _Nullable); - -/// A block type used to report an error -typedef void(^RLMOptionalErrorBlock)(NSError * _Nullable); - -#pragma mark RLMAppConfiguration - -/// Properties representing the configuration of a client -/// that communicate with a particular Realm application. -@interface RLMAppConfiguration : NSObject - -/// A custom base URL to request against. -@property (nonatomic, strong, nullable) NSString *baseURL; - -/// The custom transport for network calls to the server. -@property (nonatomic, strong, nullable) id transport; - -/// :nodoc: -@property (nonatomic, strong, nullable) NSString *localAppName - __attribute__((deprecated("This field is not used"))); -/// :nodoc: -@property (nonatomic, strong, nullable) NSString *localAppVersion - __attribute__((deprecated("This field is not used"))); - -/// The default timeout for network requests. -@property (nonatomic, assign) NSUInteger defaultRequestTimeoutMS; - -/// If enabled (the default), a single connection is used for all Realms opened -/// with a single sync user. If disabled, a separate connection is used for each -/// Realm. -/// -/// Session multiplexing reduces resources used and typically improves -/// performance. When multiplexing is enabled, the connection is not immediately -/// closed when the last session is closed, and instead remains open for -/// ``RLMSyncTimeoutOptions.connectionLingerTime`` milliseconds (30 seconds by -/// default). -@property (nonatomic, assign) BOOL enableSessionMultiplexing; - -/** - Options for the assorted types of connection timeouts for sync connections. - - If nil default values for all timeouts are used instead. - */ -@property (nonatomic, nullable, copy) RLMSyncTimeoutOptions *syncTimeouts; - -/// :nodoc: -- (instancetype)initWithBaseURL:(nullable NSString *)baseURL - transport:(nullable id)transport - localAppName:(nullable NSString *)localAppName - localAppVersion:(nullable NSString *)localAppVersion -__attribute__((deprecated("localAppName and localAppVersion are unused"))); - -/// :nodoc: -- (instancetype)initWithBaseURL:(nullable NSString *) baseURL - transport:(nullable id)transport - localAppName:(nullable NSString *)localAppName - localAppVersion:(nullable NSString *)localAppVersion - defaultRequestTimeoutMS:(NSUInteger)defaultRequestTimeoutMS -__attribute__((deprecated("localAppName and localAppVersion are unused"))); - -/** -Create a new Realm App configuration. - -@param baseURL A custom base URL to request against. -@param transport A custom network transport. -*/ -- (instancetype)initWithBaseURL:(nullable NSString *)baseURL - transport:(nullable id)transport; - -/** - Create a new Realm App configuration. - - @param baseURL A custom base URL to request against. - @param transport A custom network transport. - @param defaultRequestTimeoutMS A custom default timeout for network requests. - */ -- (instancetype)initWithBaseURL:(nullable NSString *) baseURL - transport:(nullable id)transport - defaultRequestTimeoutMS:(NSUInteger)defaultRequestTimeoutMS; - -@end - -#pragma mark RLMApp - -/** - The `RLMApp` has the fundamental set of methods for communicating with a Realm - application backend. - - This interface provides access to login and authentication. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // internally thread-safe -@interface RLMApp : NSObject - -/// The configuration for this Realm app. -@property (nonatomic, readonly) RLMAppConfiguration *configuration; - -/// The `RLMSyncManager` for this Realm app. -@property (nonatomic, readonly) RLMSyncManager *syncManager; - -/// Get a dictionary containing all users keyed on id. -@property (nonatomic, readonly) NSDictionary *allUsers; - -/// Get the current user logged into the Realm app. -@property (nonatomic, readonly, nullable) RLMUser *currentUser; - -/// The app ID for this Realm app. -@property (nonatomic, readonly) NSString *appId; - -/** - A client for the email/password authentication provider which - can be used to obtain a credential for logging in. - - Used to perform requests specifically related to the email/password provider. -*/ -@property (nonatomic, readonly) RLMEmailPasswordAuth *emailPasswordAuth; - -/** - Get an application with a given appId and configuration. - - @param appId The unique identifier of your Realm app. - */ -+ (instancetype)appWithId:(NSString *)appId; - -/** - Get an application with a given appId and configuration. - - @param appId The unique identifier of your Realm app. - @param configuration A configuration object to configure this client. - */ -+ (instancetype)appWithId:(NSString *)appId - configuration:(nullable RLMAppConfiguration *)configuration; - -/** - Login to a user for the Realm app. - - @param credentials The credentials identifying the user. - @param completion A callback invoked after completion. - */ -- (void)loginWithCredential:(RLMCredentials *)credentials - completion:(RLMUserCompletionBlock)completion NS_REFINED_FOR_SWIFT; - -/** - Switches the active user to the specified user. - - This sets which user is used by all RLMApp operations which require a user. This is a local operation which does not access the network. - An exception will be throw if the user is not valid. The current user will remain logged in. - - @param syncUser The user to switch to. - @returns The user you intend to switch to - */ -- (RLMUser *)switchToUser:(RLMUser *)syncUser; - -/** - A client which can be used to register devices with the server to receive push notificatons - */ -- (RLMPushClient *)pushClientWithServiceName:(NSString *)serviceName - NS_SWIFT_NAME(pushClient(serviceName:)); - -/** - RLMApp instances are cached internally by Realm and cannot be created directly. - - Use `+[RLMRealm appWithId]` or `+[RLMRealm appWithId:configuration:]` - to obtain a reference to an RLMApp. - */ -- (instancetype)init __attribute__((unavailable("Use +appWithId or appWithId:configuration:."))); - -/** -RLMApp instances are cached internally by Realm and cannot be created directly. - -Use `+[RLMRealm appWithId]` or `+[RLMRealm appWithId:configuration:]` -to obtain a reference to an RLMApp. -*/ -+ (instancetype)new __attribute__((unavailable("Use +appWithId or appWithId:configuration:."))); - -@end - -#pragma mark - Sign In With Apple Extension - -API_AVAILABLE(ios(13.0), macos(10.15), tvos(13.0), watchos(6.0)) -/// Use this delegate to be provided a callback once authentication has succeed or failed -@protocol RLMASLoginDelegate - -/// Callback that is invoked should the authentication fail. -/// @param error An error describing the authentication failure. -- (void)authenticationDidFailWithError:(NSError *)error NS_SWIFT_NAME(authenticationDidComplete(error:)); - -/// Callback that is invoked should the authentication succeed. -/// @param user The newly authenticated user. -- (void)authenticationDidCompleteWithUser:(RLMUser *)user NS_SWIFT_NAME(authenticationDidComplete(user:)); - -@end - -API_AVAILABLE(ios(13.0), macos(10.15), tvos(13.0), watchos(6.0)) -/// Category extension that deals with Sign In With Apple authentication. -/// This is only available on OS's that support `AuthenticationServices` -@interface RLMApp (ASLogin) - -/// Use this delegate to be provided a callback once authentication has succeed or failed. -@property (nonatomic, weak, nullable) id authorizationDelegate; - -/// Sets the ASAuthorizationControllerDelegate to be handled by `RLMApp` -/// @param controller The ASAuthorizationController in which you want `RLMApp` to consume its delegate. -- (void)setASAuthorizationControllerDelegateForController:(ASAuthorizationController *)controller NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMArray.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMArray.h deleted file mode 100644 index b2c6c1664..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMArray.h +++ /dev/null @@ -1,652 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObject, RLMResults; - -/** - `RLMArray` is the container type in Realm used to define to-many relationships. - - Unlike an `NSArray`, `RLMArray`s hold a single type, specified by the `objectClassName` property. - This is referred to in these docs as the “type” of the array. - - When declaring an `RLMArray` property, the type must be marked as conforming to a - protocol by the same name as the objects it should contain (see the - `RLM_COLLECTION_TYPE` macro). In addition, the property can be declared using Objective-C - generics for better compile-time type safety. - - RLM_COLLECTION_TYPE(ObjectType) - ... - @property RLMArray *arrayOfObjectTypes; - - `RLMArray`s can be queried with the same predicates as `RLMObject` and `RLMResult`s. - - `RLMArray`s cannot be created directly. `RLMArray` properties on `RLMObject`s are - lazily created when accessed, or can be obtained by querying a Realm. - - ### Key-Value Observing - - `RLMArray` supports array key-value observing on `RLMArray` properties on `RLMObject` - subclasses, and the `invalidated` property on `RLMArray` instances themselves is - key-value observing compliant when the `RLMArray` is attached to a managed - `RLMObject` (`RLMArray`s on unmanaged `RLMObject`s will never become invalidated). - - Because `RLMArray`s are attached to the object which they are a property of, they - do not require using the mutable collection proxy objects from - `-mutableArrayValueForKey:` or KVC-compatible mutation methods on the containing - object. Instead, you can call the mutation methods on the `RLMArray` directly. - */ - -@interface RLMArray : NSObject - -#pragma mark - Properties - -/** - The number of objects in the array. - */ -@property (nonatomic, readonly, assign) NSUInteger count; - -/** - The type of the objects in the array. - */ -@property (nonatomic, readonly, assign) RLMPropertyType type; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readonly, getter = isOptional) BOOL optional; - -/** - The class name of the objects contained in the array. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages the array. Returns `nil` for unmanaged arrays. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - Indicates if the array can no longer be accessed. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if the array is frozen. - - Frozen arrays are immutable and can be accessed from any thread. Frozen arrays - are created by calling `-freeze` on a managed live array. Unmanaged arrays are - never frozen. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Accessing Objects from an Array - -/** - Returns the object at the index specified. - - @param index The index to look up. - - @return An object of the type contained in the array. - */ -- (RLMObjectType)objectAtIndex:(NSUInteger)index; - -/** - Returns an array containing the objects in the array at the indexes specified by a given index set. - `nil` will be returned if the index set contains an index out of the arrays bounds. - - @param indexes The indexes in the array to retrieve objects from. - - @return The objects at the specified indexes. - */ -- (nullable NSArray *)objectsAtIndexes:(NSIndexSet *)indexes; - -/** - Returns the first object in the array. - - Returns `nil` if called on an empty array. - - @return An object of the type contained in the array. - */ -- (nullable RLMObjectType)firstObject; - -/** - Returns the last object in the array. - - Returns `nil` if called on an empty array. - - @return An object of the type contained in the array. - */ -- (nullable RLMObjectType)lastObject; - - - -#pragma mark - Adding, Removing, and Replacing Objects in an Array - -/** - Adds an object to the end of the array. - - @warning This method may only be called during a write transaction. - - @param object An object of the type contained in the array. - */ -- (void)addObject:(RLMObjectType)object; - -/** - Adds an array of objects to the end of the array. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable object such as `NSArray` or `RLMResults` which contains objects of the - same class as the array. - */ -- (void)addObjects:(id)objects; - -/** - Inserts an object at the given index. - - Throws an exception if the index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param anObject An object of the type contained in the array. - @param index The index at which to insert the object. - */ -- (void)insertObject:(RLMObjectType)anObject atIndex:(NSUInteger)index; - -/** - Removes an object at the given index. - - Throws an exception if the index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param index The array index identifying the object to be removed. - */ -- (void)removeObjectAtIndex:(NSUInteger)index; - -/** - Removes the last object in the array. - - This is a no-op if the array is already empty. - - @warning This method may only be called during a write transaction. -*/ -- (void)removeLastObject; - -/** - Removes all objects from the array. - - @warning This method may only be called during a write transaction. - */ -- (void)removeAllObjects; - -/** - Replaces an object at the given index with a new object. - - Throws an exception if the index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param index The index of the object to be replaced. - @param anObject An object (of the same type as returned from the `objectClassName` selector). - */ -- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(RLMObjectType)anObject; - -/** - Moves the object at the given source index to the given destination index. - - Throws an exception if the index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param sourceIndex The index of the object to be moved. - @param destinationIndex The index to which the object at `sourceIndex` should be moved. - */ -- (void)moveObjectAtIndex:(NSUInteger)sourceIndex toIndex:(NSUInteger)destinationIndex; - -/** - Exchanges the objects in the array at given indices. - - Throws an exception if either index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param index1 The index of the object which should replace the object at index `index2`. - @param index2 The index of the object which should replace the object at index `index1`. - */ -- (void)exchangeObjectAtIndex:(NSUInteger)index1 withObjectAtIndex:(NSUInteger)index2; - -#pragma mark - Querying an Array - -/** - Returns the index of an object in the array. - - Returns `NSNotFound` if the object is not found in the array. - - @param object An object (of the same type as returned from the `objectClassName` selector). - */ -- (NSUInteger)indexOfObject:(RLMObjectType)object; - -/** - Returns the index of the first object in the array matching the predicate. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return The index of the object, or `NSNotFound` if the object is not found in the array. - */ -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns the index of the first object in the array matching the predicate. - - @param predicate The predicate with which to filter the objects. - - @return The index of the object, or `NSNotFound` if the object is not found in the array. - */ -- (NSUInteger)indexOfObjectWithPredicate:(NSPredicate *)predicate; - -/** - Returns all the objects matching the given predicate in the array. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` of objects that match the given predicate. - */ -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all the objects matching the given predicate in the array. - - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` of objects that match the given predicate - */ -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/** - Returns a sorted `RLMResults` from the array. - - @param keyPath The key path to sort by. - @param ascending The direction to sort in. - - @return An `RLMResults` sorted by the specified key path. - */ -- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a sorted `RLMResults` from the array. - - @param properties An array of `RLMSortDescriptor`s to sort by. - - @return An `RLMResults` sorted by the specified properties. - */ -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/** - Returns a distinct `RLMResults` from the array. - - @param keyPaths The key paths to distinct on. - - @return An `RLMResults` with the distinct values of the keypath(s). - */ -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -/// :nodoc: -- (RLMObjectType)objectAtIndexedSubscript:(NSUInteger)index; - -/// :nodoc: -- (void)setObject:(RLMObjectType)newValue atIndexedSubscript:(NSUInteger)index; - -#pragma mark - Sectioning an Array - -/** - Sorts and sections this collection from a given property key path, returning the result - as an instance of `RLMSectionedResults`. - - @param keyPath The property key path to sort on. - @param ascending The direction to sort in. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsSortedUsingKeyPath:(NSString *)keyPath - ascending:(BOOL)ascending - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -/** - Sorts and sections this collection from a given array of sort descriptors, returning the result - as an instance of `RLMSectionedResults`. - - @param sortDescriptors An array of `RLMSortDescriptor`s to sort by. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @note The primary sort descriptor must be responsible for determining the section key. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsUsingSortDescriptors:(NSArray *)sortDescriptors - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - - -#pragma mark - Notifications - -/** - Registers a block to be called each time the array changes. - - The block will be asynchronously called with the initial array, and then - called again after each write transaction which changes any of the objects in - the array, which objects are in the results, or the order of the objects in the - array. - - The `changes` parameter will be `nil` the first time the block is called. For - each call after that, it will contain information about which rows in the - array were added, removed or modified. If a write transaction did not modify - any objects in the array, the block is not called at all. See the - `RLMCollectionChange` documentation for information on how the changes are - reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - Person *person = [[Person allObjectsInRealm:realm] firstObject]; - NSLog(@"person.dogs.count: %zu", person.dogs.count); // => 0 - self.token = [person.dogs addNotificationBlock(RLMArray *dogs, - RLMCollectionChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count) // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - [person.dogs addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a non-frozen managed array. - - @param block The block to be called each time the array changes. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMArray *_Nullable array, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the array changes. - - The block will be asynchronously called with the initial array, and then - called again after each write transaction which changes any of the objects in - the array, which objects are in the results, or the order of the objects in the - array. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the array were added, removed or modified. If a write transaction - did not modify any objects in the array, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMArray *_Nullable array, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the array changes. - - The block will be asynchronously called with the initial array, and then - called again after each write transaction which changes any of the objects in - the array, which objects are in the results, or the order of the objects in the - array. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the array were added, removed or modified. If a write transaction - did not modify any objects in the array, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMArray *_Nullable array, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the array changes. - - The block will be asynchronously called with the initial array, and then - called again after each write transaction which changes any of the objects in - the array, which objects are in the results, or the order of the objects in the - array. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the array were added, removed or modified. If a write transaction - did not modify any objects in the array, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMArray *_Nullable array, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths -__attribute__((warn_unused_result)); - -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the objects in the array. - - NSNumber *min = [object.arrayProperty minOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The minimum value of the property, or `nil` if the array is empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects in the array. - - NSNumber *max = [object.arrayProperty maxOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose maximum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The maximum value of the property, or `nil` if the array is empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of the values of a given property over all the objects in the array. - - NSNumber *sum = [object.arrayProperty sumOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose values should be summed. Only properties of - types `int`, `float`, and `double` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects in the array. - - NSNumber *average = [object.arrayProperty averageOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose average value should be calculated. Only - properties of types `int`, `float`, and `double` are supported. - - @return The average value of the given property, or `nil` if the array is empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this array. - - The frozen copy is an immutable array which contains the same data as this - array currently contains, but will not update when writes are made to the - containing Realm. Unlike live arrays, frozen arrays can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a managed array. - @warning Holding onto a frozen array for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -#pragma mark - Unavailable Methods - -/** - `-[RLMArray init]` is not available because `RLMArray`s cannot be created directly. - `RLMArray` properties on `RLMObject`s are lazily created when accessed. - */ -- (instancetype)init __attribute__((unavailable("RLMArrays cannot be created directly"))); - -/** - `+[RLMArray new]` is not available because `RLMArray`s cannot be created directly. - `RLMArray` properties on `RLMObject`s are lazily created when accessed. - */ -+ (instancetype)new __attribute__((unavailable("RLMArrays cannot be created directly"))); - -@end - -/// :nodoc: -@interface RLMArray (Swift) -// for use only in Swift class definitions -- (instancetype)initWithObjectClassName:(NSString *)objectClassName; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMAsymmetricObject.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMAsymmetricObject.h deleted file mode 100644 index 09deb787e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMAsymmetricObject.h +++ /dev/null @@ -1,98 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2022 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectSchema, RLMPropertyDescriptor, RLMRealm; -/** - `RLMAsymmetricObject` is a base class used to define asymmetric Realm objects. - - Asymmetric objects can only be created using the `createInRealm:` - function, and cannot be added, removed or queried. - When created, asymmetric objects will be synced unidirectionally to the MongoDB - database and cannot be accessed locally. - - Linking an asymmetric object within an `Object` is not allowed and will throw an error. - - The property types supported on `RLMAsymmetricObject` are the same as for `RLMObject`, - except for that asymmetric objects can only link to embedded objects, so `RLMObject` - and `RLMArray` properties are not supported (`RLMEmbeddedObject` and - `RLMArray` *are*). - */ -@interface RLMAsymmetricObject : RLMObjectBase - -#pragma mark - Creating & Initializing Objects - -/** - Creates an unmanaged instance of a Realm object. - */ -- (instancetype)init NS_DESIGNATED_INITIALIZER; - -/** - Creates an unmanaged instance of a Realm object. - - Pass in an `NSArray` or `NSDictionary` instance to set the values of the object's properties. - */ -- (instancetype)initWithValue:(id)value; - -/** - Returns the class name for a Realm object subclass. - - @warning Do not override. Realm relies on this method returning the exact class - name. - - @return The class name for the model class. - */ -+ (NSString *)className; - -/** - Creates an Asymmetric object, which will be synced unidirectionally and - cannot be queried locally. - - Objects created using this method will not be added to the Realm. - - @warning This method may only be called during a write transaction. - @warning This method always returns nil. - - @param realm The Realm to be used to create the asymmetric object.. - @param value The value used to populate the object. - - @return Returns `nil` - */ -+ (instancetype)createInRealm:(RLMRealm *)realm withValue:(id)value; - -#pragma mark - Properties - -/** - The object schema which lists the managed properties for the object. - */ -@property (nonatomic, readonly) RLMObjectSchema *objectSchema; - -#pragma mark - Dynamic Accessors - -/// :nodoc: -- (nullable id)objectForKeyedSubscript:(NSString *)key; - -/// :nodoc: -- (void)setObject:(nullable id)obj forKeyedSubscript:(NSString *)key; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMAsyncTask.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMAsyncTask.h deleted file mode 100644 index 9f7dc58da..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMAsyncTask.h +++ /dev/null @@ -1,67 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A task object which can be used to observe or cancel an async open. - - When a synchronized Realm is opened asynchronously, the latest state of the - Realm is downloaded from the server before the completion callback is invoked. - This task object can be used to observe the state of the download or to cancel - it. This should be used instead of trying to observe the download via the sync - session as the sync session itself is created asynchronously, and may not exist - yet when -[RLMRealm asyncOpenWithConfiguration:completion:] returns. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMAsyncOpenTask : NSObject -/** - Register a progress notification block. - - Each registered progress notification block is called whenever the sync - subsystem has new progress data to report until the task is either cancelled - or the completion callback is called. Progress notifications are delivered on - the main queue. - */ -- (void)addProgressNotificationBlock:(RLMProgressNotificationBlock)block; - -/** - Register a progress notification block which is called on the given queue. - - Each registered progress notification block is called whenever the sync - subsystem has new progress data to report until the task is either cancelled - or the completion callback is called. Progress notifications are delivered on - the supplied queue. - */ -- (void)addProgressNotificationOnQueue:(dispatch_queue_t)queue - block:(RLMProgressNotificationBlock)block; - -/** - Cancel the asynchronous open. - - Any download in progress will be cancelled, and the completion block for this - async open will never be called. If multiple async opens on the same Realm are - happening concurrently, all other opens will fail with the error "operation cancelled". - */ -- (void)cancel; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMBSON.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMBSON.h deleted file mode 100644 index 41750fd57..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMBSON.h +++ /dev/null @@ -1,174 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -#pragma mark RLMBSONType - -/** - Allowed BSON types. - */ -typedef NS_ENUM(NSUInteger, RLMBSONType) { - /// BSON Null type - RLMBSONTypeNull, - /// BSON Int32 type - RLMBSONTypeInt32, - /// BSON Int64 type - RLMBSONTypeInt64, - /// BSON Bool type - RLMBSONTypeBool, - /// BSON Double type - RLMBSONTypeDouble, - /// BSON String type - RLMBSONTypeString, - /// BSON Binary type - RLMBSONTypeBinary, - /// BSON Timestamp type - RLMBSONTypeTimestamp, - /// BSON Datetime type - RLMBSONTypeDatetime, - /// BSON ObjectId type - RLMBSONTypeObjectId, - /// BSON Decimal128 type - RLMBSONTypeDecimal128, - /// BSON RegularExpression type - RLMBSONTypeRegularExpression, - /// BSON MaxKey type - RLMBSONTypeMaxKey, - /// BSON MinKey type - RLMBSONTypeMinKey, - /// BSON Document type - RLMBSONTypeDocument, - /// BSON Array type - RLMBSONTypeArray, - /// BSON UUID type - RLMBSONTypeUUID -}; - -#pragma mark RLMBSON - -/** - Protocol representing a BSON value. BSON is a computer data interchange format. - The name "BSON" is based on the term JSON and stands for "Binary JSON". - - The following types conform to RLMBSON: - - `NSNull` - `NSNumber` - `NSString` - `NSData` - `NSDateInterval` - `NSDate` - `RLMObjectId` - `RLMDecimal128` - `NSRegularExpression` - `RLMMaxKey` - `RLMMinKey` - `NSDictionary` - `NSArray` - `NSUUID` - - @see RLMBSONType - @see bsonspec.org - */ -@protocol RLMBSON - -/** - The BSON type for the conforming interface. - */ -@property (readonly) RLMBSONType bsonType NS_REFINED_FOR_SWIFT; - -/** - Whether or not this BSON is equal to another. - - @param other The BSON to compare to - */ -- (BOOL)isEqual:(_Nullable id)other; - -@end - -/// :nodoc: -@interface NSNull (RLMBSON) -@end - -/// :nodoc: -@interface NSNumber (RLMBSON) -@end - -/// :nodoc: -@interface NSString (RLMBSON) -@end - -/// :nodoc: -@interface NSData (RLMBSON) -@end - -/// :nodoc: -@interface NSDateInterval (RLMBSON) -@end - -/// :nodoc: -@interface NSDate (RLMBSON) -@end - -/// :nodoc: -@interface RLMObjectId (RLMBSON) -@end - -/// :nodoc: -@interface RLMDecimal128 (RLMBSON) -@end - -/// :nodoc: -@interface NSRegularExpression (RLMBSON) -@end - -/// MaxKey will always be the greatest value when comparing to other BSON types -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMMaxKey : NSObject -@end - -/// MinKey will always be the smallest value when comparing to other BSON types -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMMinKey : NSObject -@end - -/// :nodoc: -@interface RLMMaxKey (RLMBSON) -@end - -/// :nodoc: -@interface RLMMinKey (RLMBSON) -@end - -/// :nodoc: -@interface NSDictionary (RLMBSON) -@end - -/// :nodoc: -@interface NSMutableArray (RLMBSON) -@end - -/// :nodoc: -@interface NSArray (RLMBSON) -@end - -/// :nodoc: -@interface NSUUID (RLMBSON) -@end diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMCollection.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMCollection.h deleted file mode 100644 index eac117f17..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMCollection.h +++ /dev/null @@ -1,613 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@protocol RLMValue; -@class RLMRealm, RLMResults, RLMSortDescriptor, RLMNotificationToken, RLMCollectionChange, RLMSectionedResults; -typedef RLM_CLOSED_ENUM(int32_t, RLMPropertyType); -/// A callback which is invoked on each element in the Results collection which returns the section key. -typedef id _Nullable(^RLMSectionedResultsKeyBlock)(id); - -/** - A homogenous collection of Realm-managed objects. Examples of conforming types - include `RLMArray`, `RLMSet`, `RLMResults`, and `RLMLinkingObjects`. - */ -@protocol RLMCollection - -#pragma mark - Properties - -/** - The number of objects in the collection. - */ -@property (nonatomic, readonly) NSUInteger count; - -/** - The type of the objects in the collection. - */ -@property (nonatomic, readonly) RLMPropertyType type; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readonly, getter = isOptional) BOOL optional; - -/** - The class name of the objects contained in the collection. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages this collection, if any. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - Indicates if the collection is no longer valid. - - The collection becomes invalid if `invalidate` is called on the managing - Realm. Unmanaged collections are never invalidated. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -#pragma mark - Accessing Objects from a Collection - -/** - Returns the object at the index specified. - - @param index The index to look up. - - @return An object of the type contained in the collection. - */ -- (id)objectAtIndex:(NSUInteger)index; - -@optional - -/** - Returns an array containing the objects in the collection at the indexes - specified by a given index set. `nil` will be returned if the index set - contains an index out of the collections bounds. - - @param indexes The indexes in the collection to retrieve objects from. - - @return The objects at the specified indexes. - */ -- (nullable NSArray *)objectsAtIndexes:(NSIndexSet *)indexes; - -/** - Returns the first object in the collection. - - RLMSet is not ordered, and so for sets this will return an arbitrary object in - the set. It is not guaraneed to be a different object from what `lastObject` - gives even if the set has multiple objects in it. - - Returns `nil` if called on an empty collection. - - @return An object of the type contained in the collection. - */ -- (nullable id)firstObject; - -/** - Returns the last object in the collection. - - RLMSet is not ordered, and so for sets this will return an arbitrary object in - the set. It is not guaraneed to be a different object from what `firstObject` - gives even if the set has multiple objects in it. - - Returns `nil` if called on an empty collection. - - @return An object of the type contained in the collection. - */ -- (nullable id)lastObject; - -/// :nodoc: -- (id)objectAtIndexedSubscript:(NSUInteger)index; - -/** - Returns the index of an object in the collection. - - Returns `NSNotFound` if the object is not found in the collection. - - @param object An object (of the same type as returned from the `objectClassName` selector). - */ -- (NSUInteger)indexOfObject:(id)object; - -/** - Returns the index of the first object in the collection matching the predicate. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return The index of the object, or `NSNotFound` if the object is not found in the collection. - */ -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns the index of the first object in the collection matching the predicate. - - @param predicate The predicate with which to filter the objects. - - @return The index of the object, or `NSNotFound` if the object is not found in the collection. - */ -- (NSUInteger)indexOfObjectWithPredicate:(NSPredicate *)predicate; - -@required - -#pragma mark - Querying a Collection - -/** - Returns all objects matching the given predicate in the collection. - - This is only supported for managed collections. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - @return An `RLMResults` containing objects that match the given predicate. - */ -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all objects matching the given predicate in the collection. - - This is only supported for managed collections. - - @param predicate The predicate with which to filter the objects. - @return An `RLMResults` containing objects that match the given predicate. - */ -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/** - Returns a sorted `RLMResults` from the collection. - - This is only supported for managed collections. - - @param keyPath The keyPath to sort by. - @param ascending The direction to sort in. - @return An `RLMResults` sorted by the specified key path. - */ -- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a sorted `RLMResults` from the collection. - - This is only supported for managed collections. - - @param properties An array of `RLMSortDescriptor`s to sort by. - @return An `RLMResults` sorted by the specified properties. - */ -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/** - Returns a distinct `RLMResults` from the collection. - - This is only supported for managed collections. - - @param keyPaths The key paths used produce distinct results - @return An `RLMResults` made distinct based on the specified key paths - */ -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -/** - Returns an `NSArray` containing the results of invoking `valueForKey:` using - `key` on each of the collection's objects. - - @param key The name of the property. - - @return An `NSArray` containing results. - */ -- (nullable id)valueForKey:(NSString *)key; - -/** - Returns the value for the derived property identified by a given key path. - - @param keyPath A key path of the form relationship.property (with one or more relationships). - - @return The value for the derived property identified by keyPath. - */ -- (nullable id)valueForKeyPath:(NSString *)keyPath; - -/** - Invokes `setValue:forKey:` on each of the collection's objects using the specified `value` and `key`. - - @warning This method may only be called during a write transaction. - - @param value The object value. - @param key The name of the property. - */ -- (void)setValue:(nullable id)value forKey:(NSString *)key; - -#pragma mark - Notifications - -/** -Registers a block to be called each time the collection changes. - -The block will be asynchronously called with the initial collection, -and then called again after each write transaction which changes either any -of the objects in the collection, or which objects are in the collection. - -The `change` parameter will be `nil` the first time the block is called. -For each call after that, it will contain information about -which rows in the collection were added, removed or modified. If a -write transaction did not modify any objects in the results collection, -the block is not called at all. See the `RLMCollectionChange` documentation for -information on how the changes are reported and an example of updating a -`UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - -At the time when the block is called, the collection object will be fully -evaluated and up-to-date, and as long as you do not perform a write transaction -on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will -never perform blocking work. - -Notifications are delivered via the standard run loop, and so can't be -delivered while the run loop is blocked by other activity. When -notifications can't be delivered instantly, multiple notifications may be -coalesced into a single notification. This can include the notification -with the initial results. For example, the following code performs a write -transaction immediately after adding the notification block, so there is no -opportunity for the initial notification to be delivered first. As a -result, the initial notification will reflect the state of the Realm after -the write transaction. - - RLMResults *results = [Dog allObjects]; - NSLog(@"dogs.count: %zu", dogs.count); // => 0 - self.token = [results addNotificationBlock:^(RLMResults *dogs, - RLMCollectionChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - [realm addObject:dog]; - }]; - // end of run loop execution context - -You must retain the returned token for as long as you want updates to continue -to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - -@warning This method cannot be called during a write transaction, or when the - containing Realm is read-only or frozen. - -@param block The block to be called whenever a change occurs. -@return A token which must be held for as long as you want updates to be delivered. -*/ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** -Registers a block to be called each time the collection changes. - -The block will be asynchronously called with the initial collection, -and then called again after each write transaction which changes either any -of the objects in the collection, or which objects are in the collection. - -The `change` parameter will be `nil` the first time the block is called. -For each call after that, it will contain information about -which rows in the collection were added, removed or modified. If a -write transaction did not modify any objects in the results collection, -the block is not called at all. See the `RLMCollectionChange` documentation for -information on how the changes are reported and an example of updating a -`UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - -At the time when the block is called, the collection object will be fully -evaluated and up-to-date, and as long as you do not perform a write transaction -on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will -never perform blocking work. - -Notifications are delivered on the given queue. If the queue is blocked and -notifications can't be delivered instantly, multiple notifications may be -coalesced into a single notification. - -You must retain the returned token for as long as you want updates to continue -to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - -@warning This method cannot be called when the containing Realm is read-only or frozen. -@warning The queue must be a serial queue. - -@param block The block to be called whenever a change occurs. -@param queue The serial queue to deliver notifications to. -@return A token which must be held for as long as you want updates to be delivered. -*/ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** -Registers a block to be called each time the collection changes. - -The block will be asynchronously called with the initial collection, -and then called again after each write transaction which changes either any -of the objects in the collection, or which objects are in the collection. - -The `change` parameter will be `nil` the first time the block is called. -For each call after that, it will contain information about -which rows in the collection were added, removed or modified. If a -write transaction did not modify any objects in the results collection, -the block is not called at all. See the `RLMCollectionChange` documentation for -information on how the changes are reported and an example of updating a -`UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - -At the time when the block is called, the collection object will be fully -evaluated and up-to-date, and as long as you do not perform a write transaction -on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will -never perform blocking work. - -Notifications are delivered on the given queue. If the queue is blocked and -notifications can't be delivered instantly, multiple notifications may be -coalesced into a single notification. - -You must retain the returned token for as long as you want updates to continue -to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - -@warning This method cannot be called when the containing Realm is read-only or frozen. -@warning The queue must be a serial queue. - -@param block The block to be called whenever a change occurs. -@param queue The serial queue to deliver notifications to. -@param keyPaths The block will be called for changes occurring on these keypaths. If no -key paths are given, notifications are delivered for every property key path. -@return A token which must be held for as long as you want updates to be delivered. -*/ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -#pragma mark - Sectioned Results - -/** - Sorts and sections this collection from a given property key path, returning the result - as an instance of `RLMSectionedResults`. - - @param keyPath The property key path to sort on. - @param ascending The direction to sort in. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsSortedUsingKeyPath:(NSString *)keyPath - ascending:(BOOL)ascending - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -/** - Sorts and sections this collection from a given array of sort descriptors, returning the result - as an instance of `RLMSectionedResults`. - - @param sortDescriptors An array of `RLMSortDescriptor`s to sort by. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @note The primary sort descriptor must be responsible for determining the section key. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsUsingSortDescriptors:(NSArray *)sortDescriptors - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the objects - in the collection. - - NSNumber *min = [results minOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The minimum value of the property, or `nil` if the Results are empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects - in the collection. - - NSNumber *max = [results maxOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose maximum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The maximum value of the property, or `nil` if the Results are empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of the values of a given property over all the objects in the collection. - - NSNumber *sum = [results sumOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose values should be summed. Only properties of - types `int`, `float`, and `double` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects in the collection. - - NSNumber *average = [results averageOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose average value should be calculated. Only - properties of types `int`, `float`, and `double` are supported. - - @return The average value of the given property, or `nil` if the Results are empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -#pragma mark - Freeze - -/** - Indicates if the collection is frozen. - - Frozen collections are immutable and can be accessed from any thread. The - objects read from a frozen collection will also be frozen. - */ -@property (nonatomic, readonly, getter=isFrozen) BOOL frozen; - -/** - Returns a frozen (immutable) snapshot of this collection. - - The frozen copy is an immutable collection which contains the same data as - this collection currently contains, but will not update when writes are made - to the containing Realm. Unlike live collections, frozen collections can be - accessed from any thread. - - @warning This method cannot be called during a write transaction, or when the containing Realm is read-only. - @warning Holding onto a frozen collection for an extended period while - performing write transaction on the Realm may result in the Realm - file growing to large sizes. See - `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -@end - -/** - An `RLMSortDescriptor` stores a property name and a sort order for use with - `sortedResultsUsingDescriptors:`. It is similar to `NSSortDescriptor`, but supports - only the subset of functionality which can be efficiently run by Realm's query - engine. - - `RLMSortDescriptor` instances are immutable. - */ -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMSortDescriptor : NSObject - -#pragma mark - Properties - -/** - The key path which the sort descriptor orders results by. - */ -@property (nonatomic, readonly) NSString *keyPath; - -/** - Whether the descriptor sorts in ascending or descending order. - */ -@property (nonatomic, readonly) BOOL ascending; - -#pragma mark - Methods - -/** - Returns a new sort descriptor for the given key path and sort direction. - */ -+ (instancetype)sortDescriptorWithKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a copy of the receiver with the sort direction reversed. - */ -- (instancetype)reversedSortDescriptor; - -@end - -/** - A `RLMCollectionChange` object encapsulates information about changes to collections - that are reported by Realm notifications. - - `RLMCollectionChange` is passed to the notification blocks registered with - `-addNotificationBlock` on `RLMArray` and `RLMResults`, and reports what rows in the - collection changed since the last time the notification block was called. - - The change information is available in two formats: a simple array of row - indices in the collection for each type of change, and an array of index paths - in a requested section suitable for passing directly to `UITableView`'s batch - update methods. A complete example of updating a `UITableView` named `tv`: - - [tv beginUpdates]; - [tv deleteRowsAtIndexPaths:[changes deletionsInSection:0] withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv insertRowsAtIndexPaths:[changes insertionsInSection:0] withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv reloadRowsAtIndexPaths:[changes modificationsInSection:0] withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv endUpdates]; - - All of the arrays in an `RLMCollectionChange` are always sorted in ascending order. - */ -@interface RLMCollectionChange : NSObject -/// The indices of objects in the previous version of the collection which have -/// been removed from this one. -@property (nonatomic, readonly) NSArray *deletions; - -/// The indices in the new version of the collection which were newly inserted. -@property (nonatomic, readonly) NSArray *insertions; - -/** - The indices in the new version of the collection which were modified. - - For `RLMResults`, this means that one or more of the properties of the object at - that index were modified (or an object linked to by that object was - modified). - - For `RLMArray`, the array itself being modified to contain a - different object at that index will also be reported as a modification. - */ -@property (nonatomic, readonly) NSArray *modifications; - -/// Returns the index paths of the deletion indices in the given section. -- (NSArray *)deletionsInSection:(NSUInteger)section; - -/// Returns the index paths of the insertion indices in the given section. -- (NSArray *)insertionsInSection:(NSUInteger)section; - -/// Returns the index paths of the modification indices in the given section. -- (NSArray *)modificationsInSection:(NSUInteger)section; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMConstants.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMConstants.h deleted file mode 100644 index 0bc8db972..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMConstants.h +++ /dev/null @@ -1,156 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#define RLM_HEADER_AUDIT_BEGIN NS_HEADER_AUDIT_BEGIN -#define RLM_HEADER_AUDIT_END NS_HEADER_AUDIT_END - -#define RLM_SWIFT_SENDABLE NS_SWIFT_SENDABLE - -#define RLM_FINAL __attribute__((objc_subclassing_restricted)) - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -// Swift 5 considers NS_ENUM to be "open", meaning there could be values present -// other than the defined cases (which allows adding more cases later without -// it being a breaking change), while older versions consider it "closed". -#ifdef NS_CLOSED_ENUM -#define RLM_CLOSED_ENUM NS_CLOSED_ENUM -#else -#define RLM_CLOSED_ENUM NS_ENUM -#endif - -#if __has_attribute(ns_error_domain) && (!defined(__cplusplus) || !__cplusplus || __cplusplus >= 201103L) -#define RLM_ERROR_ENUM(type, name, domain) \ - _Pragma("clang diagnostic push") \ - _Pragma("clang diagnostic ignored \"-Wignored-attributes\"") \ - NS_ENUM(type, __attribute__((ns_error_domain(domain))) name) \ - _Pragma("clang diagnostic pop") -#else -#define RLM_ERROR_ENUM(type, name, domain) NS_ENUM(type, name) -#endif - -#define RLM_HIDDEN __attribute__((visibility("hidden"))) -#define RLM_VISIBLE __attribute__((visibility("default"))) -#define RLM_HIDDEN_BEGIN _Pragma("GCC visibility push(hidden)") -#define RLM_HIDDEN_END _Pragma("GCC visibility pop") -#define RLM_DIRECT __attribute__((objc_direct)) -#define RLM_DIRECT_MEMBERS __attribute__((objc_direct_members)) - -#pragma mark - Enums - -/** - `RLMPropertyType` is an enumeration describing all property types supported in Realm models. - - For more information, see [Realm Models](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/object-models-and-schemas/). - */ -typedef RLM_CLOSED_ENUM(int32_t, RLMPropertyType) { - -#pragma mark - Primitive types - /** Integers: `NSInteger`, `int`, `long`, `Int` (Swift) */ - RLMPropertyTypeInt = 0, - /** Booleans: `BOOL`, `bool`, `Bool` (Swift) */ - RLMPropertyTypeBool = 1, - /** Floating-point numbers: `float`, `Float` (Swift) */ - RLMPropertyTypeFloat = 5, - /** Double-precision floating-point numbers: `double`, `Double` (Swift) */ - RLMPropertyTypeDouble = 6, - /** NSUUID, UUID */ - RLMPropertyTypeUUID = 12, - -#pragma mark - Object types - - /** Strings: `NSString`, `String` (Swift) */ - RLMPropertyTypeString = 2, - /** Binary data: `NSData` */ - RLMPropertyTypeData = 3, - /** Any type: `id`, `AnyRealmValue` (Swift) */ - RLMPropertyTypeAny = 9, - /** Dates: `NSDate` */ - RLMPropertyTypeDate = 4, - -#pragma mark - Linked object types - - /** Realm model objects. See [Realm Models](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/object-models-and-schemas/) for more information. */ - RLMPropertyTypeObject = 7, - /** Realm linking objects. See [Realm Models](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/relationships/#inverse-relationship) for more information. */ - RLMPropertyTypeLinkingObjects = 8, - - RLMPropertyTypeObjectId = 10, - RLMPropertyTypeDecimal128 = 11 -}; - -#pragma mark - Notification Constants - -/** - A notification indicating that changes were made to a Realm. -*/ -typedef NSString * RLMNotification NS_EXTENSIBLE_STRING_ENUM; - -/** - This notification is posted when a write transaction has been committed to a Realm on a different thread for - the same file. - - It is not posted if `autorefresh` is enabled, or if the Realm is refreshed before the notification has a chance - to run. - - Realms with autorefresh disabled should normally install a handler for this notification which calls - `-[RLMRealm refresh]` after doing some work. Refreshing the Realm is optional, but not refreshing the Realm may lead to - large Realm files. This is because an extra copy of the data must be kept for the stale Realm. - */ -extern RLMNotification const RLMRealmRefreshRequiredNotification NS_SWIFT_NAME(RefreshRequired); - -/** - This notification is posted by a Realm when a write transaction has been - committed to a Realm on a different thread for the same file. - - It is not posted if `-[RLMRealm autorefresh]` is enabled, or if the Realm is - refreshed before the notification has a chance to run. - - Realms with autorefresh disabled should normally install a handler for this - notification which calls `-[RLMRealm refresh]` after doing some work. Refreshing - the Realm is optional, but not refreshing the Realm may lead to large Realm - files. This is because Realm must keep an extra copy of the data for the stale - Realm. - */ -extern RLMNotification const RLMRealmDidChangeNotification NS_SWIFT_NAME(DidChange); - -#pragma mark - Error keys - -/** Key to identify the associated backup Realm configuration in an error's `userInfo` dictionary */ -extern NSString * const RLMBackupRealmConfigurationErrorKey; - -#pragma mark - Other Constants - -/** The schema version used for uninitialized Realms */ -extern const uint64_t RLMNotVersioned; - -/** The corresponding value is the name of an exception thrown by Realm. */ -extern NSString * const RLMExceptionName; - -/** The corresponding value is a Realm file version. */ -extern NSString * const RLMRealmVersionKey; - -/** The corresponding key is the version of the underlying database engine. */ -extern NSString * const RLMRealmCoreVersionKey; - -/** The corresponding key is the Realm invalidated property name. */ -extern NSString * const RLMInvalidatedKey; - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMCredentials.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMCredentials.h deleted file mode 100644 index adff4e7e9..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMCredentials.h +++ /dev/null @@ -1,126 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) -@protocol RLMBSON; - -/// A token representing an identity provider's credentials. -typedef NSString *RLMCredentialsToken; - -/// A type representing the unique identifier of an Atlas App Services identity provider. -typedef NSString *RLMIdentityProvider NS_EXTENSIBLE_STRING_ENUM; - -/// The username/password identity provider. User accounts are handled by Atlas App Services directly without the -/// involvement of a third-party identity provider. -extern RLMIdentityProvider const RLMIdentityProviderUsernamePassword; - -/// A Facebook account as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderFacebook; - -/// A Google account as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderGoogle; - -/// An Apple account as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderApple; - -/// A JSON Web Token as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderJWT; - -/// An Anonymous account as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderAnonymous; - -/// An Realm Cloud function as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderFunction; - -/// A user api key as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderUserAPIKey; - -/// A server api key as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderServerAPIKey; - -/** - Opaque credentials representing a specific Realm App user. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMCredentials : NSObject - -/// The name of the identity provider which generated the credentials token. -@property (nonatomic, readonly) RLMIdentityProvider provider; - -/** - Construct and return credentials from a Facebook account token. - */ -+ (instancetype)credentialsWithFacebookToken:(RLMCredentialsToken)token; - -/** - Construct and return credentials from a Google account token. - */ -+ (instancetype)credentialsWithGoogleAuthCode:(RLMCredentialsToken)token; - -/** - Construct and return credentials from a Google id token. - */ -+ (instancetype)credentialsWithGoogleIdToken:(RLMCredentialsToken)token; - -/** - Construct and return credentials from an Apple account token. - */ -+ (instancetype)credentialsWithAppleToken:(RLMCredentialsToken)token; - -/** - Construct and return credentials for an Atlas App Services function using a mongodb document as a json payload. -*/ -+ (instancetype)credentialsWithFunctionPayload:(NSDictionary> *)payload; - -/** - Construct and return credentials from a user api key. -*/ -+ (instancetype)credentialsWithUserAPIKey:(NSString *)apiKey; - -/** - Construct and return credentials from a server api key. -*/ -+ (instancetype)credentialsWithServerAPIKey:(NSString *)apiKey; - -/** - Construct and return Atlas App Services credentials from an email and password. - */ -+ (instancetype)credentialsWithEmail:(NSString *)email - password:(NSString *)password; - -/** - Construct and return credentials from a JSON Web Token. - */ -+ (instancetype)credentialsWithJWT:(NSString *)token; - -/** - Construct and return anonymous credentials - */ -+ (instancetype)anonymousCredentials; - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("RLMAppCredentials cannot be created directly"))); - -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("RLMAppCredentials cannot be created directly"))); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMDecimal128.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMDecimal128.h deleted file mode 100644 index f6224bbf2..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMDecimal128.h +++ /dev/null @@ -1,110 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A 128-bit IEEE 754-2008 decimal floating point number. - - This type is similar to Swift's built-in Decimal type, but allocates bits - differently, resulting in a different representable range. (NS)Decimal stores a - significand of up to 38 digits long and an exponent from -128 to 127, while - this type stores up to 34 digits of significand and an exponent from -6143 to - 6144. - */ -RLM_SWIFT_SENDABLE // immutable -@interface RLMDecimal128 : NSObject -/// Creates a new zero-initialized decimal128. -- (instancetype)init; - -/// Converts the given value to a RLMDecimal128. -/// -/// The following types can be converted to RLMDecimal128: -/// - NSNumber -/// - NSString -/// - NSDecimalNumber -/// -/// Passing a value with a type not in this list is a fatal error. Passing a -/// string which cannot be parsed as a valid Decimal128 is a fatal error. -- (instancetype)initWithValue:(id)value; - -/// Converts the given number to a RLMDecimal128. -- (instancetype)initWithNumber:(NSNumber *)number; - -/// Parses the given string to a RLMDecimal128. -/// -/// Returns a decimal where `isNaN` is `YES` if the string cannot be parsed as a decimal. `error` is never set -/// and this will never actually return `nil`. -- (nullable instancetype)initWithString:(NSString *)string error:(NSError **)error; - -/// Converts the given number to a RLMDecimal128. -+ (instancetype)decimalWithNumber:(NSNumber *)number; - -/// The minimum value for RLMDecimal128. -@property (class, readonly, copy) RLMDecimal128 *minimumDecimalNumber NS_REFINED_FOR_SWIFT; - -/// The maximum value for RLMDecimal128. -@property (class, readonly, copy) RLMDecimal128 *maximumDecimalNumber NS_REFINED_FOR_SWIFT; - -/// Convert this value to a double. This is a lossy conversion. -@property (nonatomic, readonly) double doubleValue; - -/// Convert this value to a NSDecimal. This may be a lossy conversion. -@property (nonatomic, readonly) NSDecimal decimalValue; - -/// Convert this value to a string. -@property (nonatomic, readonly) NSString *stringValue; - -/// Gets if this Decimal128 represents a NaN value. -@property (nonatomic, readonly) BOOL isNaN; - -/// The magnitude of this RLMDecimal128. -@property (nonatomic, readonly) RLMDecimal128 *magnitude NS_REFINED_FOR_SWIFT; - -/// Replaces this RLMDecimal128 value with its additive inverse. -- (void)negate; - -/// Adds the right hand side to the current value and returns the result. -- (RLMDecimal128 *)decimalNumberByAdding:(RLMDecimal128 *)decimalNumber; - -/// Divides the right hand side to the current value and returns the result. -- (RLMDecimal128 *)decimalNumberByDividingBy:(RLMDecimal128 *)decimalNumber; - -/// Subtracts the right hand side to the current value and returns the result. -- (RLMDecimal128 *)decimalNumberBySubtracting:(RLMDecimal128 *)decimalNumber; - -/// Multiply the right hand side to the current value and returns the result. -- (RLMDecimal128 *)decimalNumberByMultiplyingBy:(RLMDecimal128 *)decimalNumber; - -/// Comparision operator to check if the right hand side is greater than the current value. -- (BOOL)isGreaterThan:(nullable RLMDecimal128 *)decimalNumber; - -/// Comparision operator to check if the right hand side is greater than or equal to the current value. -- (BOOL)isGreaterThanOrEqualTo:(nullable RLMDecimal128 *)decimalNumber; - -/// Comparision operator to check if the right hand side is less than the current value. -- (BOOL)isLessThan:(nullable RLMDecimal128 *)decimalNumber; - -/// Comparision operator to check if the right hand side is less than or equal to the current value. -- (BOOL)isLessThanOrEqualTo:(nullable RLMDecimal128 *)decimalNumber; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMDictionary.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMDictionary.h deleted file mode 100644 index 9c8cac538..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMDictionary.h +++ /dev/null @@ -1,559 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObject, RLMResults, RLMDictionaryChange; - -/** - `RLMDictionary` is a container type in Realm representing a dynamic collection of key-value pairs. - - Unlike `NSDictionary`, `RLMDictionary`s hold a single key and value type. - This is referred to in these docs as the “type” and “keyType” of the dictionary. - - When declaring an `RLMDictionary` property, the object type and keyType must be marked as conforming to a - protocol by the same name as the objects it should contain. - - RLM_COLLECTION_TYPE(ObjectType) - ... - @property RLMDictionary *objectTypeDictionary; - - `RLMDictionary`s can be queried with the same predicates as `RLMObject` and `RLMResult`s. - - `RLMDictionary`s cannot be created directly. `RLMDictionary` properties on `RLMObject`s are - lazily created when accessed, or can be obtained by querying a Realm. - - `RLMDictionary` only supports `NSString` as a key. Realm disallows the use of `.` or `$` characters within a dictionary key. - - ### Key-Value Observing - - `RLMDictionary` supports dictionary key-value observing on `RLMDictionary` properties on `RLMObject` - subclasses, and the `invalidated` property on `RLMDictionary` instances themselves is - key-value observing compliant when the `RLMDictionary` is attached to a managed - `RLMObject` (`RLMDictionary`s on unmanaged `RLMObject`s will never become invalidated). - */ -@interface RLMDictionary: NSObject - -#pragma mark - Properties - -/** - The number of entries in the dictionary. - */ -@property (nonatomic, readonly, assign) NSUInteger count; - -/** - The type of the objects in the dictionary. - */ -@property (nonatomic, readonly, assign) RLMPropertyType type; - -/** - The type of the key used in this dictionary. - */ -@property (nonatomic, readonly, assign) RLMPropertyType keyType; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readonly, getter = isOptional) BOOL optional; - -/** - The class name of the objects contained in the dictionary. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages the dictionary. Returns `nil` for unmanaged dictionary. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - Indicates if the dictionary can no longer be accessed. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if the dictionary is frozen. - - Frozen dictionaries are immutable and can be accessed from any thread. Frozen dictionaries - are created by calling `-freeze` on a managed live dictionary. Unmanaged dictionaries are - never frozen. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Accessing Objects from a Dictionary - -/** - Returns the value associated with a given key. - - @param key The name of the property. - - @discussion If key does not start with “@”, invokes object(forKey:). If key does start - with “@”, strips the “@” and invokes [super valueForKey:] with the rest of the key. - - @return A value associated with a given key or `nil`. - */ -- (nullable id)valueForKey:(nonnull RLMKeyType)key; - -/** - Returns an array containing the dictionary’s keys. - - @note The order of the elements in the array is not defined. - */ -@property(readonly, copy) NSArray *allKeys; - -/** - Returns an array containing the dictionary’s values. - - @note The order of the elements in the array is not defined. - */ -@property(readonly, copy) NSArray *allValues; - -/** - Returns the value associated with a given key. - - @note `nil` will be returned if no value is associated with a given key. NSNull will be returned - where null is associated with the key. - - @param key The key for which to return the corresponding value. - - @return The value associated with key. - */ -- (nullable RLMObjectType)objectForKey:(nonnull RLMKeyType)key; - -/** - Returns the value associated with a given key. - - @note `nil` will be returned if no value is associated with a given key. NSNull will be returned - where null is associated with the key. - - @param key The key for which to return the corresponding value. - - @return The value associated with key. - */ -- (nullable RLMObjectType)objectForKeyedSubscript:(RLMKeyType)key; - -/** - Applies a given block object to the each key-value pair of the dictionary. - - @param block A block object to operate on entries in the dictionary. - - @note If the block sets *stop to YES, the enumeration stops. - */ -- (void)enumerateKeysAndObjectsUsingBlock:(void (^)(RLMKeyType key, RLMObjectType obj, BOOL *stop))block; - -#pragma mark - Adding, Removing, and Replacing Objects in a Dictionary - -/** - Replace the contents of a dictionary with the contents of another dictionary - NSDictionary or RLMDictionary. - - This will remove all elements in this dictionary and then apply each element from the given dictionary. - - @warning This method may only be called during a write transaction. - @warning If otherDictionary is self this will result in an empty dictionary. - */ -- (void)setDictionary:(id)otherDictionary; - -/** - Removes all contents in the dictionary. - - @warning This method may only be called during a write transaction. - */ -- (void)removeAllObjects; - -/** - Removes from the dictionary entries specified by elements in a given array. If a given key does not - exist, no mutation will happen for that key. - - @warning This method may only be called during a write transaction. - */ -- (void)removeObjectsForKeys:(NSArray *)keyArray; - -/** - Removes a given key and its associated value from the dictionary. If the key does not exist the dictionary - will not be modified. - - @warning This method may only be called during a write transaction. - */ -- (void)removeObjectForKey:(RLMKeyType)key; - -/** - Adds a given key-value pair to the dictionary if the key is not present, or updates the value for the given key - if the key already present. - - @warning This method may only be called during a write transaction. - */ -- (void)setObject:(nullable RLMObjectType)obj forKeyedSubscript:(RLMKeyType)key; - -/** - Adds a given key-value pair to the dictionary if the key is not present, or updates the value for the given key - if the key already present. - - @warning This method may only be called during a write transaction. - */ -- (void)setObject:(nullable RLMObjectType)anObject forKey:(RLMKeyType)aKey; - -/** - Adds to the receiving dictionary the entries from another dictionary. - - @note If the receiving dictionary contains the same key(s) as the otherDictionary, then - the receiving dictionary will update each key-value pair for the matching key. - - @warning This method may only be called during a write transaction. - - @param otherDictionary An enumerable object such as `NSDictionary` or `RLMDictionary` which contains objects of the - same type as the receiving dictionary. - */ -- (void)addEntriesFromDictionary:(id )otherDictionary; - -#pragma mark - Querying a Dictionary - -/** - Returns all the values matching the given predicate in the dictionary. - - @note The keys in the dictionary are ignored when quering values, and they will not be returned in the `RLMResults`. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` of objects that match the given predicate. - */ -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all the values matching the given predicate in the dictionary. - - @note The keys in the dictionary are ignored when quering values, and they will not be returned in the `RLMResults`. - - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` of objects that match the given predicate - */ -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/** - Returns a sorted RLMResults of all values in the dictionary. - - @note The keys in the dictionary are ignored when sorting values, and they will not be returned in the `RLMResults`. - - @param keyPath The key path to sort by. - @param ascending The direction to sort in. - - @return An `RLMResults` sorted by the specified key path. - */- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a sorted RLMResults of all values in the dictionary. - - @note The keys in the dictionary are ignored when sorting values, and they will not be returned in the `RLMResults`. - - @param properties An array of `RLMSortDescriptor`s to sort by. - - @return An `RLMResults` sorted by the specified properties. - */ -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/** - Returns a distinct `RLMResults` from all values in the dictionary. - - @note The keys in the dictionary are ignored, and they will not be returned in the `RLMResults`. - - @param keyPaths The key paths to distinct on. - - @return An `RLMResults` with the distinct values of the keypath(s). - */ -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the values in the dictionary. - - NSNumber *min = [object.dictionaryProperty minOfProperty:@"age"]; - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, `NSDate`, `RLMValue` and `RLMDecimal128` are supported. - - @return The minimum value of the property, or `nil` if the dictionary is empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects in the dictionary. - - NSNumber *max = [object.dictionaryProperty maxOfProperty:@"age"]; - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, `NSDate`, `RLMValue` and `RLMDecimal128` are supported. - - @return The maximum value of the property, or `nil` if the dictionary is empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of distinct values of a given property over all the objects in the dictionary. - - NSNumber *sum = [object.dictionaryProperty sumOfProperty:@"age"]; - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, `RLMValue` and `RLMDecimal128` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects in the dictionary. - - NSNumber *average = [object.dictionaryProperty averageOfProperty:@"age"]; - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, `NSDate`, `RLMValue` and `RLMDecimal128` are supported. - - @return The average value of the given property, or `nil` if the dictionary is empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -#pragma mark - Notifications - -/** - Registers a block to be called each time the dictionary changes. - - The block will be asynchronously called with the initial dictionary, and then - called again after each write transaction which changes any of the keys or values - within the dictionary. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which keys in the dictionary were added, modified or deleted. If a write transaction - did not modify any keys or values in the dictionary, the block is not called at all. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - Person *person = [[Person allObjectsInRealm:realm] firstObject]; - NSLog(@"person.dogs.count: %zu", person.dogs.count); // => 0 - self.token = [person.dogs addNotificationBlock(RLMDictionary *dogs, - RLMDictionaryChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - person.dogs[@"frenchBulldog"] = dog; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a non-frozen managed dictionary. - - @param block The block to be called each time the dictionary changes. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMDictionary *_Nullable dictionary, - RLMDictionaryChange *_Nullable changes, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the dictionary changes. - - The block will be asynchronously called with the initial dictionary, and then - called again after each write transaction which changes any of the key-value in - the dictionary or which objects are in the results. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which keys in the dictionary were added or modified. If a write transaction - did not modify any objects in the dictionary, the block is not called at all. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMDictionary *_Nullable dictionary, - RLMDictionaryChange *_Nullable changes, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the dictionary changes. - - The block will be asynchronously called with the initial dictionary, and then - called again after each write transaction which changes any of the key-value in - the dictionary or which objects are in the results. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which keys in the dictionary were added or modified. If a write transaction - did not modify any objects in the dictionary, the block is not called at all. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMDictionary *_Nullable dictionary, - RLMDictionaryChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the dictionary changes. - - The block will be asynchronously called with the initial dictionary, and then - called again after each write transaction which changes any of the key-value in - the dictionary or which objects are in the results. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which keys in the dictionary were added or modified. If a write transaction - did not modify any objects in the dictionary, the block is not called at all. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMDictionary *_Nullable dictionary, - RLMDictionaryChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths -__attribute__((warn_unused_result)); - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of a dictionary. - - The frozen copy is an immutable dictionary which contains the same data as this - dictionary currently contains, but will not update when writes are made to the - containing Realm. Unlike live dictionaries, frozen dictionaries can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a managed dictionary. - @warning Holding onto a frozen dictionary for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -#pragma mark - Unavailable Methods -/** - `-[RLMDictionary init]` is not available because `RLMDictionary`s cannot be created directly. - `RLMDictionary` properties on `RLMObject`s are lazily created when accessed. - */ -- (instancetype)init __attribute__((unavailable("RLMDictionary cannot be created directly"))); -/** - `+[RLMDictionary new]` is not available because `RLMDictionary`s cannot be created directly. - `RLMDictionary` properties on `RLMObject`s are lazily created when accessed. - */ -+ (instancetype)new __attribute__((unavailable("RLMDictionary cannot be created directly"))); - -@end - -/** - A `RLMDictionaryChange` object encapsulates information about changes to dictionaries - that are reported by Realm notifications. - - `RLMDictionaryChange` is passed to the notification blocks registered with - `-addNotificationBlock` on `RLMDictionary`, and reports what keys in the - dictionary changed since the last time the notification block was called. - */ -@interface RLMDictionaryChange : NSObject -/// The keys in the new version of the dictionary which were newly inserted. -@property (nonatomic, readonly) NSArray *insertions; - -/// The keys in the new version of the dictionary which were modified. -@property (nonatomic, readonly) NSArray *modifications; - -/// The keys which were deleted from the old version. -@property (nonatomic, readonly) NSArray *deletions; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMEmailPasswordAuth.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMEmailPasswordAuth.h deleted file mode 100644 index 748eb26af..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMEmailPasswordAuth.h +++ /dev/null @@ -1,120 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@protocol RLMBSON; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// A block type used to report an error -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMEmailPasswordAuthOptionalErrorBlock)(NSError * _Nullable); - -/** - A client for the email/password authentication provider which - can be used to obtain a credential for logging in, - and to perform requests specifically related to the email/password provider. -*/ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMEmailPasswordAuth : RLMProviderClient - -/** - Registers a new email identity with the email/password provider, - and sends a confirmation email to the provided address. - - @param email The email address of the user to register. - @param password The password that the user created for the new email/password identity. - @param completionHandler A callback to be invoked once the call is complete. -*/ - -- (void)registerUserWithEmail:(NSString *)email - password:(NSString *)password - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler NS_SWIFT_NAME(registerUser(email:password:completion:)); - -/** - Confirms an email identity with the email/password provider. - - @param token The confirmation token that was emailed to the user. - @param tokenId The confirmation token id that was emailed to the user. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)confirmUser:(NSString *)token - tokenId:(NSString *)tokenId - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Re-sends a confirmation email to a user that has registered but - not yet confirmed their email address. - - @param email The email address of the user to re-send a confirmation for. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)resendConfirmationEmail:(NSString *)email - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Retries custom confirmation function for a given email address. - - @param email The email address of the user to retry custom confirmation logic. - @param completionHandler A callback to be invoked once the call is complete. - */ -- (void)retryCustomConfirmation:(NSString *)email - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Sends a password reset email to the given email address. - - @param email The email address of the user to send a password reset email for. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)sendResetPasswordEmail:(NSString *)email - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Resets the password of an email identity using the - password reset token emailed to a user. - - @param password The new password. - @param token The password reset token that was emailed to the user. - @param tokenId The password reset token id that was emailed to the user. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)resetPasswordTo:(NSString *)password - token:(NSString *)token - tokenId:(NSString *)tokenId - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Resets the password of an email identity using the - password reset function set up in the application. - - @param email The email address of the user. - @param password The desired new password. - @param args A list of arguments passed in as a BSON array. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)callResetPasswordFunction:(NSString *)email - password:(NSString *)password - args:(NSArray> *)args - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMEmbeddedObject.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMEmbeddedObject.h deleted file mode 100644 index 4db6248ca..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMEmbeddedObject.h +++ /dev/null @@ -1,367 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectSchema, RLMPropertyDescriptor, RLMRealm, RLMNotificationToken, RLMPropertyChange; -typedef void (^RLMObjectChangeBlock)(BOOL deleted, - NSArray *_Nullable changes, - NSError *_Nullable error); -/** - `RLMEmbeddedObject` is a base class used to define Realm model objects. - - Embedded objects work similarly to normal objects, but are owned by a single - parent Object (which itself may be embedded). Unlike normal top-level objects, - embedded objects cannot be directly created in or added to a Realm. Instead, - they can only be created as part of a parent object, or by assigning an - unmanaged object to a parent object's property. Embedded objects are - automatically deleted when the parent object is deleted or when the parent is - modified to no longer point at the embedded object, either by reassigning an - RLMObject property or by removing the embedded object from the array containing - it. - - Embedded objects can only ever have a single parent object which links to them, - and attempting to link to an existing managed embedded object will throw an - exception. - - The property types supported on `RLMEmbeddedObject` are the same as for - `RLMObject`, except for that embedded objects cannot link to top-level objects, - so `RLMObject` and `RLMArray` properties are not supported - (`RLMEmbeddedObject` and `RLMArray` *are*). - - Embedded objects cannot have primary keys or indexed properties. - */ - -@interface RLMEmbeddedObject : RLMObjectBase - -#pragma mark - Creating & Initializing Objects - -/** - Creates an unmanaged instance of a Realm object. - - Unmanaged embedded objects can be added to a Realm by assigning them to an - object property of a managed Realm object or by adding them to a managed - RLMArray. - */ -- (instancetype)init NS_DESIGNATED_INITIALIZER; - -/** - Creates an unmanaged instance of a Realm object. - - Pass in an `NSArray` or `NSDictionary` instance to set the values of the object's properties. - - Unmanaged embedded objects can be added to a Realm by assigning them to an - object property of a managed Realm object or by adding them to a managed - RLMArray. - */ -- (instancetype)initWithValue:(id)value; - -/** - Returns the class name for a Realm object subclass. - - @warning Do not override. Realm relies on this method returning the exact class - name. - - @return The class name for the model class. - */ -+ (NSString *)className; - -#pragma mark - Properties - -/** - The Realm which manages the object, or `nil` if the object is unmanaged. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - The object schema which lists the managed properties for the object. - */ -@property (nonatomic, readonly) RLMObjectSchema *objectSchema; - -/** - Indicates if the object can no longer be accessed because it is now invalid. - - An object can no longer be accessed if the object has been deleted from the Realm that manages it, or - if `invalidate` is called on that Realm. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if this object is frozen. - - @see `-[RLMEmbeddedObject freeze]` - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Customizing your Objects - -/** - Override this method to specify the default values to be used for each property. - - @return A dictionary mapping property names to their default values. - */ -+ (nullable NSDictionary *)defaultPropertyValues; - -/** - Override this method to specify the names of properties to ignore. These properties will not be managed by the Realm - that manages the object. - - @return An array of property names to ignore. - */ -+ (nullable NSArray *)ignoredProperties; - -/** - Override this method to specify the names of properties that are non-optional (i.e. cannot be assigned a `nil` value). - - By default, all properties of a type whose values can be set to `nil` are - considered optional properties. To require that an object in a Realm always - store a non-`nil` value for a property, add the name of the property to the - array returned from this method. - - Properties of `RLMEmbeddedObject` type cannot be non-optional. Array and - `NSNumber` properties can be non-optional, but there is no reason to do so: - arrays do not support storing nil, and if you want a non-optional number you - should instead use the primitive type. - - @return An array of property names that are required. - */ -+ (NSArray *)requiredProperties; - -/** - Override this method to provide information related to properties containing linking objects. - - Each property of type `RLMLinkingObjects` must have a key in the dictionary returned by this method consisting - of the property name. The corresponding value must be an instance of `RLMPropertyDescriptor` that describes the class - and property that the property is linked to. - - return @{ @"owners": [RLMPropertyDescriptor descriptorWithClass:Owner.class propertyName:@"dogs"] }; - - @return A dictionary mapping property names to `RLMPropertyDescriptor` instances. - */ -+ (NSDictionary *)linkingObjectsProperties; - -#pragma mark - Notifications - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in differen - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When notifications - can't be delivered instantly, multiple notifications may be coalesced into a - single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - - @param block The block to be called whenever a change occurs. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block queue:(dispatch_queue_t)queue; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block keyPaths:(NSArray *)keyPaths queue:(dispatch_queue_t)queue; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block keyPaths:(NSArray *)keyPaths; - -#pragma mark - Other Instance Methods - -/** - Returns YES if another Realm object instance points to the same object as the - receiver in the Realm managing the receiver. - - For frozen objects and object types with a primary key, `isEqual:` is - overridden to use the same logic as this method (along with a corresponding - implementation for `hash`). Non-frozen objects without primary keys use - pointer identity for `isEqual:` and `hash`. - - @param object The object to compare the receiver to. - - @return Whether the object represents the same object as the receiver. - */ -- (BOOL)isEqualToObject:(RLMEmbeddedObject *)object; - -/** - Returns a frozen (immutable) snapshot of this object. - - The frozen copy is an immutable object which contains the same data as this - object currently contains, but will not update when writes are made to the - containing Realm. Unlike live objects, frozen objects can be accessed from any - thread. - - - warning: Holding onto a frozen object for an extended period while performing write - transaction on the Realm may result in the Realm file growing to large sizes. See - `Realm.Configuration.maximumNumberOfActiveVersions` for more information. - - warning: This method can only be called on a managed object. - */ -- (instancetype)freeze NS_RETURNS_RETAINED; - -/** - Returns a live (mutable) reference of this object. - - This method creates a managed accessor to a live copy of the same frozen object. - Will return self if called on an already live object. - */ -- (instancetype)thaw; - -#pragma mark - Dynamic Accessors - -/// :nodoc: -- (nullable id)objectForKeyedSubscript:(NSString *)key; - -/// :nodoc: -- (void)setObject:(nullable id)obj forKeyedSubscript:(NSString *)key; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMError.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMError.h deleted file mode 100644 index 514ceee3f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMError.h +++ /dev/null @@ -1,442 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2022 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@protocol RLMValue; - -#pragma mark - Error Domains - -/** Error code is a value from the RLMError enum. */ -extern NSString *const RLMErrorDomain; - -/** An error domain identifying non-specific system errors. */ -extern NSString *const RLMUnknownSystemErrorDomain; - -/** - The error domain string for all SDK errors related to errors reported - by the synchronization manager error handler, as well as general sync - errors that don't fall into any of the other categories. - */ -extern NSString *const RLMSyncErrorDomain; - -/** - The error domain string for all SDK errors related to the authentication - endpoint. - */ -extern NSString *const RLMSyncAuthErrorDomain; - -/** -The error domain string for all SDK errors related to the Atlas App Services -endpoint. -*/ -extern NSString *const RLMAppErrorDomain; - -#pragma mark - RLMError - -/// A user info key containing the error code. This is provided for backwards -/// compatibility only and should not be used. -extern NSString *const RLMErrorCodeKey __attribute((deprecated("use -[NSError code]"))); - -/// A user info key containing the name of the error code. This is for -/// debugging purposes only and should not be relied on. -extern NSString *const RLMErrorCodeNameKey; - -/// A user info key present in sync errors which originate from the server, -/// containing the URL of the server-side logs associated with the error. -extern NSString * const RLMServerLogURLKey; - -/// A user info key containing a HTTP status code. Some ``RLMAppError`` codes -/// include this, most notably ``RLMAppErrorHttpRequestFailed``. -extern NSString * const RLMHTTPStatusCodeKey; - -/// A user info key containing a `RLMCompensatingWriteInfo` which includes -/// further details about what was reverted by the server. -extern NSString *const RLMCompensatingWriteInfoKey; - -/** - `RLMError` is an enumeration representing all recoverable errors. It is - associated with the Realm error domain specified in `RLMErrorDomain`. - */ -typedef RLM_ERROR_ENUM(NSInteger, RLMError, RLMErrorDomain) { - /** Denotes a general error that occurred when trying to open a Realm. */ - RLMErrorFail = 1, - - /** Denotes a file I/O error that occurred when trying to open a Realm. */ - RLMErrorFileAccess = 2, - - /** - Denotes a file permission error that occurred when trying to open a Realm. - - This error can occur if the user does not have permission to open or create - the specified file in the specified access mode when opening a Realm. - */ - RLMErrorFilePermissionDenied = 3, - - /** - Denotes an error where a file was to be written to disk, but another - file with the same name already exists. - */ - RLMErrorFileExists = 4, - - /** - Denotes an error that occurs if a file could not be found. - - This error may occur if a Realm file could not be found on disk when - trying to open a Realm as read-only, or if the directory part of the - specified path was not found when trying to write a copy. - */ - RLMErrorFileNotFound = 5, - - /** - Denotes an error that occurs if a file format upgrade is required to open - the file, but upgrades were explicitly disabled or the file is being open - in read-only mode. - */ - RLMErrorFileFormatUpgradeRequired = 6, - - /** - Denotes an error that occurs if the database file is currently open in - another process which cannot share with the current process due to an - architecture mismatch. - - This error may occur if trying to share a Realm file between an i386 - (32-bit) iOS Simulator and the Realm Studio application. In this case, - please use the 64-bit version of the iOS Simulator. - */ - RLMErrorIncompatibleLockFile = 8, - - /** - Denotes an error that occurs when there is insufficient available address - space to mmap the Realm file. - */ - RLMErrorAddressSpaceExhausted = 9, - - /** - Denotes an error that occurs if there is a schema version mismatch and a - migration is required. - */ - RLMErrorSchemaMismatch = 10, - - /** - Denotes an error where an operation was requested which cannot be - performed on an open file. - */ - RLMErrorAlreadyOpen = 12, - - /// Denotes an error where an input value was invalid. - RLMErrorInvalidInput = 13, - - /// Denotes an error where a write failed due to insufficient disk space. - RLMErrorOutOfDiskSpace = 14, - - /** - Denotes an error where a Realm file could not be opened because another - process has opened the same file in a way incompatible with inter-process - sharing. For example, this can result from opening the backing file for an - in-memory Realm in non-in-memory mode. - */ - RLMErrorIncompatibleSession = 15, - - /** - Denotes an error that occurs if the file is a valid Realm file, but has a - file format version which is not supported by this version of Realm. This - typically means that the file was written by a newer version of Realm, but - may also mean that it is from a pre-1.0 version of Realm (or for - synchronized files, pre-10.0). - */ - RLMErrorUnsupportedFileFormatVersion = 16, - - /** - Denotes an error that occurs if a synchronized Realm is opened in more - than one process at once. - */ - RLMErrorMultipleSyncAgents = 17, - - /// A subscription was rejected by the server. - RLMErrorSubscriptionFailed = 18, - - /// A file operation failed in a way which does not have a more specific error code. - RLMErrorFileOperationFailed = 19, - - /** - Denotes an error that occurs if the file being opened is not a valid Realm - file. Some of the possible causes of this are: - 1. The file at the given URL simply isn't a Realm file at all. - 2. The wrong encryption key was given. - 3. The Realm file is encrypted and no encryption key was given. - 4. The Realm file isn't encrypted but an encryption key was given. - 5. The file on disk has become corrupted. - */ - RLMErrorInvalidDatabase = 20, - - /** - Denotes an error that occurs if a Realm is opened in the wrong history - mode. Typically this means that either a local Realm is being opened as a - synchronized Realm or vice versa. - */ - RLMErrorIncompatibleHistories = 21, - - /** - Denotes an error that occurs if objects were written to a flexible sync - Realm without any active subscriptions for that object type. All objects - created in flexible sync Realms must match at least one active - subscription or the server will reject the write. - */ - RLMErrorNoSubscriptionForWrite = 22, -}; - -#pragma mark - RLMSyncError - -/// A user info key for use with `RLMSyncErrorClientResetError`. -extern NSString *const kRLMSyncPathOfRealmBackupCopyKey; - -/// A user info key for use with certain error types. -extern NSString *const kRLMSyncErrorActionTokenKey; - -/** - An error related to a problem that might be reported by the synchronization manager - error handler, or a callback on a sync-related API that performs asynchronous work. - */ -typedef RLM_ERROR_ENUM(NSInteger, RLMSyncError, RLMSyncErrorDomain) { - /// An error that indicates a problem with the session (a specific Realm opened for sync). - RLMSyncErrorClientSessionError = 4, - - /// An error that indicates a problem with a specific user. - RLMSyncErrorClientUserError = 5, - - /** - An error that indicates an internal, unrecoverable problem - with the underlying synchronization engine. - */ - RLMSyncErrorClientInternalError = 6, - - /** - An error that indicates the Realm needs to be reset. - - A synced Realm may need to be reset because Atlas App Services encountered an - error and had to be restored from a backup. If the backup copy of the remote Realm - is of an earlier version than the local copy of the Realm, the server will ask the - client to reset the Realm. - - The reset process is as follows: the local copy of the Realm is copied into a recovery - directory for safekeeping, and then deleted from the original location. The next time - the Realm for that partition value is opened, the Realm will automatically be re-downloaded from - Atlas App Services, and can be used as normal. - - Data written to the Realm after the local copy of the Realm diverged from the backup - remote copy will be present in the local recovery copy of the Realm file. The - re-downloaded Realm will initially contain only the data present at the time the Realm - was backed up on the server. - - The client reset process can be initiated in one of two ways. - - The `userInfo` dictionary contains an opaque token object under the key - `kRLMSyncErrorActionTokenKey`. This token can be passed into - `+[RLMSyncSession immediatelyHandleError:]` in order to immediately perform the client - reset process. This should only be done after your app closes and invalidates every - instance of the offending Realm on all threads (note that autorelease pools may make this - difficult to guarantee). - - If `+[RLMSyncSession immediatelyHandleError:]` is not called, the client reset process - will be automatically carried out the next time the app is launched and the - `RLMSyncManager` is accessed. - - The value for the `kRLMSyncPathOfRealmBackupCopyKey` key in the `userInfo` dictionary - describes the path of the recovered copy of the Realm. This copy will not actually be - created until the client reset process is initiated. - - @see `-[NSError rlmSync_errorActionToken]`, `-[NSError rlmSync_clientResetBackedUpRealmPath]` - */ - RLMSyncErrorClientResetError = 7, - - /// :nodoc: - RLMSyncErrorUnderlyingAuthError = 8, - - /** - An error that indicates the user does not have permission to perform an operation - upon a synced Realm. For example, a user may receive this error if they attempt to - open a Realm they do not have at least read access to, or write to a Realm they only - have read access to. - - This error may also occur if a user incorrectly opens a Realm they have read-only - permissions to without using the `asyncOpen()` APIs. - - A Realm that suffers a permission denied error is, by default, flagged so that its - local copy will be deleted the next time the application starts. - - The `userInfo` dictionary contains an opaque token object under the key - `kRLMSyncErrorActionTokenKey`. This token can be passed into - `+[RLMSyncSession immediatelyHandleError:]` in order to immediately delete the local - copy. This should only be done after your app closes and invalidates every instance - of the offending Realm on all threads (note that autorelease pools may make this - difficult to guarantee). - - @warning It is strongly recommended that, if a Realm has encountered a permission denied - error, its files be deleted before attempting to re-open it. - - @see `-[NSError rlmSync_errorActionToken]` - */ - RLMSyncErrorPermissionDeniedError = 9, - - /** - An error that indicates that the server has rejected the requested flexible sync subscriptions. - */ - RLMSyncErrorInvalidFlexibleSyncSubscriptions = 10, - - /** - An error that indicates that the server has reverted a write made by this - client. This can happen due to not having write permission, or because an - object was created in a flexible sync Realm which does not match any - active subscriptions. - - This error is informational and does not require any explicit handling. - */ - RLMSyncErrorWriteRejected = 11, - - /** - A connection error without a more specific error code occurred. - - Realm internally handles retrying connections with appropriate backoffs, - so connection errors are normally logged and not reported to the error - handler. The exception is if - ``RLMSyncConfiguration.cancelAsyncOpenOnNonFatalErrors`` is set to `true`, - in which case async opens will be canceled on connection failures and the - error will be reported to the completion handler. - - Note that connection timeouts are reported as - (errorDomain: NSPosixErrorDomain, error: ETIMEDOUT) - and not as one of these error codes. - */ - RLMSyncErrorConnectionFailed = 12, - - /** - Connecting to the server failed due to a TLS issue such as an invalid certificate. - */ - RLMSyncErrorTLSHandshakeFailed = 13, -}; - -#pragma mark - RLMSyncAuthError - -// NEXT-MAJOR: This was a ROS thing and should have been removed in v10 -/// :nodoc: -typedef RLM_ERROR_ENUM(NSInteger, RLMSyncAuthError, RLMSyncAuthErrorDomain) { - RLMSyncAuthErrorBadResponse = 1, - RLMSyncAuthErrorBadRemoteRealmPath = 2, - RLMSyncAuthErrorHTTPStatusCodeError = 3, - RLMSyncAuthErrorClientSessionError = 4, - RLMSyncAuthErrorInvalidParameters = 601, - RLMSyncAuthErrorMissingPath = 602, - RLMSyncAuthErrorInvalidCredential = 611, - RLMSyncAuthErrorUserDoesNotExist = 612, - RLMSyncAuthErrorUserAlreadyExists = 613, - RLMSyncAuthErrorAccessDeniedOrInvalidPath = 614, - RLMSyncAuthErrorInvalidAccessToken = 615, - RLMSyncAuthErrorFileCannotBeShared = 703, -} __attribute__((deprecated("Errors of this type are no longer reported"))); - -#pragma mark - RLMSyncAppError - -/// An error which occurred when making a request to Atlas App Services. -typedef RLM_ERROR_ENUM(NSInteger, RLMAppError, RLMAppErrorDomain) { - /// An unknown error has occurred - RLMAppErrorUnknown = -1, - - /// A HTTP request completed with an error status code. The failing status - /// code can be found in the ``RLMHTTPStatusCodeKey`` key of the userInfo - /// dictionary. - RLMAppErrorHttpRequestFailed = 1, - - /// A user's session is in an invalid state. Logging out and back in may rectify this. - RLMAppErrorInvalidSession, - /// A request sent to the server was malformed in some way. - RLMAppErrorBadRequest, - /// A request was made using a nonexistent user. - RLMAppErrorUserNotFound, - /// A request was made against an App using a User which does not belong to that App. - RLMAppErrorUserAppDomainMismatch, - /// The auth provider has limited the domain names which can be used for email addresses, and the given one is not allowed. - RLMAppErrorDomainNotAllowed, - /// The request body size exceeded a server-configured limit. - RLMAppErrorReadSizeLimitExceeded, - /// A request had an invalid parameter. - RLMAppErrorInvalidParameter, - /// A request was missing a required parameter. - RLMAppErrorMissingParameter, - /// Executing the requested server function failed with an error. - RLMAppErrorFunctionExecutionError, - /// The server encountered an internal error. - RLMAppErrorInternalServerError, - /// Authentication failed due to the request auth provider not existing. - RLMAppErrorAuthProviderNotFound, - /// The requested value does not exist. - RLMAppErrorValueNotFound, - /// The value being created already exists. - RLMAppErrorValueAlreadyExists, - /// A value with the same name as the value being created already exists. - RLMAppErrorValueDuplicateName, - /// The called server function does not exist. - RLMAppErrorFunctionNotFound, - /// The called server function has a syntax error. - RLMAppErrorFunctionSyntaxError, - /// The called server function is invalid in some way. - RLMAppErrorFunctionInvalid, - /// Registering an API key with the auth provider failed due to it already existing. - RLMAppErrorAPIKeyAlreadyExists, - /// The operation failed due to exceeding the server-configured time limit. - RLMAppErrorExecutionTimeLimitExceeded, - /// The body of the called function does not define a callable thing. - RLMAppErrorNotCallable, - /// Email confirmation failed for a user because the user has already confirmed their email. - RLMAppErrorUserAlreadyConfirmed, - /// The user cannot be used because it has been disabled. - RLMAppErrorUserDisabled, - /// An auth error occurred which does not have a more specific error code. - RLMAppErrorAuthError, - /// Account registration failed due to the user name already being taken. - RLMAppErrorAccountNameInUse, - /// A login request failed due to an invalid password. - RLMAppErrorInvalidPassword, - /// Operation failed due to server-side maintenance. - RLMAppErrorMaintenanceInProgress, - /// Operation failed due to an error reported by MongoDB. - RLMAppErrorMongoDBError, -}; - -/// Extended information about a write which was rejected by the server. -/// -/// The server will sometimes reject writes made by the client for reasons such -/// as permissions, additional server-side validation failing, or because the -/// object didn't match any flexible sync subscriptions. When this happens, a -/// ``RLMSyncErrorWriteRejected`` error is reported which contains an array of -/// `RLMCompensatingWriteInfo` objects in the ``RLMCompensatingWriteInfoKey`` -/// userInfo key with information about what writes were rejected and why. -/// -/// This information is intended for debugging and logging purposes only. The -/// `reason` strings are generated by the server and are not guaranteed to be -/// stable, so attempting to programmatically do anything with them will break -/// without warning. -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMCompensatingWriteInfo : NSObject -/// The class name of the object being written to. -@property (nonatomic, readonly) NSString *objectType; -/// The primary key of the object being written to. -@property (nonatomic, readonly) id primaryKey NS_REFINED_FOR_SWIFT; -/// A human-readable string describing why the write was rejected. -@property (nonatomic, readonly) NSString *reason; -@end diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMFindOneAndModifyOptions.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMFindOneAndModifyOptions.h deleted file mode 100644 index 3cce99f23..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMFindOneAndModifyOptions.h +++ /dev/null @@ -1,80 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) -@protocol RLMBSON; -@class RLMSortDescriptor; - -/// Options to use when executing a `findOneAndUpdate`, `findOneAndReplace`, -/// or `findOneAndDelete` command on a `RLMMongoCollection`. -@interface RLMFindOneAndModifyOptions : NSObject - -/// Limits the fields to return for all matching documents. -@property (nonatomic, nullable) id projection NS_REFINED_FOR_SWIFT; - -/// The order in which to return matching documents. -@property (nonatomic, nullable) id sort NS_REFINED_FOR_SWIFT -__attribute__((deprecated("Use `sorting` instead, which correctly sort more than one sort attribute", "sorting"))); - -/// The order in which to return matching documents. -@property (nonatomic) NSArray> *sorting NS_REFINED_FOR_SWIFT; - - -/// Whether or not to perform an upsert, default is false -/// (only available for find_one_and_replace and find_one_and_update) -@property (nonatomic) BOOL upsert; - -/// When true then the new document is returned, -/// Otherwise the old document is returned (default) -/// (only available for findOneAndReplace and findOneAndUpdate) -@property (nonatomic) BOOL shouldReturnNewDocument; - -/// Options to use when executing a `findOneAndUpdate`, `findOneAndReplace`, -/// or `findOneAndDelete` command on a `RLMMongoCollection`. -/// @param projection Limits the fields to return for all matching documents. -/// @param sort The order in which to return matching documents. -/// @param upsert Whether or not to perform an upsert, default is false -/// (only available for findOneAndReplace and findOneAndUpdate) -/// @param shouldReturnNewDocument When true then the new document is returned, -/// Otherwise the old document is returned (default), -/// (only available for findOneAndReplace and findOneAndUpdate) -- (instancetype)initWithProjection:(id _Nullable)projection - sort:(id _Nullable)sort - upsert:(BOOL)upsert - shouldReturnNewDocument:(BOOL)shouldReturnNewDocument -__attribute__((deprecated("Please use `initWithProjection:sorting:upsert:shouldReturnNewDocument:`"))) - NS_SWIFT_UNAVAILABLE("Please see FindOneAndModifyOptions"); - -/// Options to use when executing a `findOneAndUpdate`, `findOneAndReplace`, -/// or `findOneAndDelete` command on a `RLMMongoCollection`. -/// @param projection Limits the fields to return for all matching documents. -/// @param sorting The order in which to return matching documents. -/// @param upsert Whether or not to perform an upsert, default is false -/// (only available for findOneAndReplace and findOneAndUpdate) -/// @param shouldReturnNewDocument When true then the new document is returned, -/// Otherwise the old document is returned (default), -/// (only available for findOneAndReplace and findOneAndUpdate) -- (instancetype)initWithProjection:(id _Nullable)projection - sorting:(NSArray> *)sorting - upsert:(BOOL)upsert - shouldReturnNewDocument:(BOOL)shouldReturnNewDocument; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMFindOptions.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMFindOptions.h deleted file mode 100644 index 043a85374..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMFindOptions.h +++ /dev/null @@ -1,77 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@protocol RLMBSON; - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -@interface RLMFindOptions : NSObject - -/// The maximum number of documents to return. Specifying 0 will return all documents. -@property (nonatomic) NSInteger limit; - -/// Limits the fields to return for all matching documents. -@property (nonatomic, nullable) id projection NS_REFINED_FOR_SWIFT; - -/// The order in which to return matching documents. -@property (nonatomic, nullable) id sort NS_REFINED_FOR_SWIFT -__attribute__((deprecated("Use `sorting` instead, which correctly sort more than one sort attribute", "sorting"))); - -/// The order in which to return matching documents. -@property (nonatomic) NSArray> *sorting NS_REFINED_FOR_SWIFT; - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -/// @param limit The maximum number of documents to return. Specifying 0 will return all documents. -/// @param projection Limits the fields to return for all matching documents. -/// @param sort The order in which to return matching documents. -- (instancetype)initWithLimit:(NSInteger)limit - projection:(id _Nullable)projection - sort:(id _Nullable)sort -__attribute__((deprecated("Please use `initWithLimit:projection:sorting:`"))) - NS_SWIFT_UNAVAILABLE("Please see FindOption"); - - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -/// @param projection Limits the fields to return for all matching documents. -/// @param sort The order in which to return matching documents. -- (instancetype)initWithProjection:(id _Nullable)projection - sort:(id _Nullable)sort __deprecated -__attribute__((deprecated("Please use `initWithProjection:sorting:`"))) - NS_SWIFT_UNAVAILABLE("Please see FindOption"); - - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -/// @param limit The maximum number of documents to return. Specifying 0 will return all documents. -/// @param projection Limits the fields to return for all matching documents. -/// @param sorting The order in which to return matching documents. -- (instancetype)initWithLimit:(NSInteger)limit - projection:(id _Nullable)projection - sorting:(NSArray> *)sorting; - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -/// @param projection Limits the fields to return for all matching documents. -/// @param sorting The order in which to return matching documents. -- (instancetype)initWithProjection:(id _Nullable)projection - sorting:(NSArray> *)sorting; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMLogger.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMLogger.h deleted file mode 100644 index 96ab91967..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMLogger.h +++ /dev/null @@ -1,99 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -/// An enum representing different levels of sync-related logging that can be configured. -typedef RLM_CLOSED_ENUM(NSUInteger, RLMLogLevel) { - /// Nothing will ever be logged. - RLMLogLevelOff, - /// Only fatal errors will be logged. - RLMLogLevelFatal, - /// Only errors will be logged. - RLMLogLevelError, - /// Warnings and errors will be logged. - RLMLogLevelWarn, - /// Information about sync events will be logged. Fewer events will be logged in order to avoid overhead. - RLMLogLevelInfo, - /// Information about sync events will be logged. More events will be logged than with `RLMLogLevelInfo`. - RLMLogLevelDetail, - /// Log information that can aid in debugging. - /// - /// - warning: Will incur a measurable performance impact. - RLMLogLevelDebug, - /// Log information that can aid in debugging. More events will be logged than with `RLMLogLevelDebug`. - /// - /// - warning: Will incur a measurable performance impact. - RLMLogLevelTrace, - /// Log information that can aid in debugging. More events will be logged than with `RLMLogLevelTrace`. - /// - /// - warning: Will incur a measurable performance impact. - RLMLogLevelAll -} NS_SWIFT_NAME(LogLevel); - -/// A log callback function which can be set on RLMLogger. -/// -/// The log function may be called from multiple threads simultaneously, and is -/// responsible for performing its own synchronization if any is required. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void (^RLMLogFunction)(RLMLogLevel level, NSString *message); - -/** - `RLMLogger` is used for creating your own custom logging logic. - - You can define your own logger creating an instance of `RLMLogger` and define the log function which will be - invoked whenever there is a log message. - Set this custom logger as you default logger using `setDefaultLogger`. - - RLMLogger.defaultLogger = [[RLMLogger alloc] initWithLevel:RLMLogLevelDebug - logFunction:^(RLMLogLevel level, NSString * message) { - NSLog(@"Realm Log - %lu, %@", (unsigned long)level, message); - }]; - - @note By default default log threshold level is `RLMLogLevelInfo`, and logging strings are output to Apple System Logger. -*/ -@interface RLMLogger : NSObject - -/** - Gets the logging threshold level used by the logger. - */ -@property (nonatomic) RLMLogLevel level; - -/// :nodoc: -- (instancetype)init NS_UNAVAILABLE; - -/** - Creates a logger with the associated log level and the logic function to define your own logging logic. - - @param level The log level to be set for the logger. - @param logFunction The log function which will be invoked whenever there is a log message. -*/ -- (instancetype)initWithLevel:(RLMLogLevel)level logFunction:(RLMLogFunction)logFunction; - -#pragma mark RLMLogger Default Logger API - -/** - The current default logger. When setting a logger as default, this logger will be used whenever information must be logged. - */ -@property (class) RLMLogger *defaultLogger NS_SWIFT_NAME(shared); - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMMigration.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMMigration.h deleted file mode 100644 index 4a6652a19..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMMigration.h +++ /dev/null @@ -1,129 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMSchema; -@class RLMArray; -@class RLMObject; - -/** - A block type which provides both the old and new versions of an object in the Realm. Object - properties can only be accessed using keyed subscripting. - - @see `-[RLMMigration enumerateObjects:block:]` - - @param oldObject The object from the original Realm (read-only). - @param newObject The object from the migrated Realm (read-write). -*/ -typedef void (^RLMObjectMigrationBlock)(RLMObject * __nullable oldObject, RLMObject * __nullable newObject); - -/** - `RLMMigration` instances encapsulate information intended to facilitate a schema migration. - - A `RLMMigration` instance is passed into a user-defined `RLMMigrationBlock` block when updating - the version of a Realm. This instance provides access to the old and new database schemas, the - objects in the Realm, and provides functionality for modifying the Realm during the migration. - */ -@interface RLMMigration : NSObject - -#pragma mark - Properties - -/** - Returns the old `RLMSchema`. This is the schema which describes the Realm before the - migration is applied. - */ -@property (nonatomic, readonly) RLMSchema *oldSchema NS_REFINED_FOR_SWIFT; - -/** - Returns the new `RLMSchema`. This is the schema which describes the Realm after the - migration is applied. - */ -@property (nonatomic, readonly) RLMSchema *newSchema NS_REFINED_FOR_SWIFT; - - -#pragma mark - Altering Objects during a Migration - -/** - Enumerates all the objects of a given type in the Realm, providing both the old and new versions - of each object. Within the block, object properties can only be accessed using keyed subscripting. - - @param className The name of the `RLMObject` class to enumerate. - - @warning All objects returned are of a type specific to the current migration and should not be cast - to `className`. Instead, treat them as `RLMObject`s and use keyed subscripting to access - properties. - */ -- (void)enumerateObjects:(NSString *)className - block:(__attribute__((noescape)) RLMObjectMigrationBlock)block NS_REFINED_FOR_SWIFT; - -/** - Creates and returns an `RLMObject` instance of type `className` in the Realm being migrated. - - The `value` argument is used to populate the object. It can be a key-value coding compliant object, an array or - dictionary returned from the methods in `NSJSONSerialization`, or an array containing one element for each managed - property. An exception will be thrown if any required properties are not present and those properties were not defined - with default values. - - When passing in an `NSArray` as the `value` argument, all properties must be present, valid and in the same order as - the properties defined in the model. - - @param className The name of the `RLMObject` class to create. - @param value The value used to populate the object. - */ -- (RLMObject *)createObject:(NSString *)className withValue:(id)value NS_REFINED_FOR_SWIFT; - -/** - Deletes an object from a Realm during a migration. - - It is permitted to call this method from within the block passed to `-[enumerateObjects:block:]`. - - @param object Object to be deleted from the Realm being migrated. - */ -- (void)deleteObject:(RLMObject *)object NS_REFINED_FOR_SWIFT; - -/** - Deletes the data for the class with the given name. - - All objects of the given class will be deleted. If the `RLMObject` subclass no longer exists in your program, - any remaining metadata for the class will be removed from the Realm file. - - @param name The name of the `RLMObject` class to delete. - - @return A Boolean value indicating whether there was any data to delete. - */ -- (BOOL)deleteDataForClassName:(NSString *)name NS_REFINED_FOR_SWIFT; - -/** - Renames a property of the given class from `oldName` to `newName`. - - @param className The name of the class whose property should be renamed. This class must be present - in both the old and new Realm schemas. - @param oldName The old persisted property name for the property to be renamed. There must not be a property with this name in the - class as defined by the new Realm schema. - @param newName The new persisted property name for the property to be renamed. There must not be a property with this name in the - class as defined by the old Realm schema. - */ -- (void)renamePropertyForClass:(NSString *)className oldName:(NSString *)oldName - newName:(NSString *)newName NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMMongoClient.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMMongoClient.h deleted file mode 100644 index 50a1c226d..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMMongoClient.h +++ /dev/null @@ -1,47 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMApp; - -/// The `RLMMongoClient` enables reading and writing on a MongoDB database via the Realm Cloud service. -/// -/// It provides access to instances of `RLMMongoDatabase`, which in turn provide access to specific -/// `RLMMongoCollection`s that hold your data. -/// -/// - Note: -/// Before you can read or write data, a user must log in. -/// -/// - SeeAlso: -/// `RLMApp`, `RLMMongoDatabase`, `RLMMongoCollection` -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMMongoClient : NSObject - -/// The name of the client -@property (nonatomic, readonly) NSString *name; - -/// Gets a `RLMMongoDatabase` instance for the given database name. -/// @param name the name of the database to retrieve -- (RLMMongoDatabase *)databaseWithName:(NSString *)name NS_SWIFT_NAME(database(named:)); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMMongoCollection.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMMongoCollection.h deleted file mode 100644 index 0feae60ac..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMMongoCollection.h +++ /dev/null @@ -1,330 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) -@protocol RLMBSON; - -@class RLMFindOptions, RLMFindOneAndModifyOptions, RLMUpdateResult, RLMChangeStream, RLMObjectId; - -/// Delegate which is used for subscribing to changes on a `[RLMMongoCollection watch]` stream. -@protocol RLMChangeEventDelegate -/// The stream was opened. -/// @param changeStream The RLMChangeStream subscribing to the stream changes. -- (void)changeStreamDidOpen:(RLMChangeStream *)changeStream; -/// The stream has been closed. -/// @param error If an error occured when closing the stream, an error will be passed. -- (void)changeStreamDidCloseWithError:(nullable NSError *)error; -/// A error has occured while streaming. -/// @param error The streaming error. -- (void)changeStreamDidReceiveError:(NSError *)error; -/// Invoked when a change event has been received. -/// @param changeEvent The change event in BSON format. -- (void)changeStreamDidReceiveChangeEvent:(id)changeEvent; -@end - -/// Acts as a middleman and processes events with WatchStream -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMChangeStream : NSObject -/// Stops a watch streaming session. -- (void)close; -/// :nodoc: -- (instancetype)init NS_UNAVAILABLE; -@end - -/// The `RLMMongoCollection` represents a MongoDB collection. -/// -/// You can get an instance from a `RLMMongoDatabase`. -/// -/// Create, read, update, and delete methods are available. -/// -/// Operations against the Realm Cloud server are performed asynchronously. -/// -/// - Note: -/// Before you can read or write data, a user must log in. -/// - Usage: -/// RLMMongoClient *client = [self.app mongoClient:@"mongodb1"]; -/// RLMMongoDatabase *database = [client databaseWithName:@"test_data"]; -/// RLMMongoCollection *collection = [database collectionWithName:@"Dog"]; -/// [collection insertOneDocument:@{@"name": @"fido", @"breed": @"cane corso"} completion:...]; -/// -/// - SeeAlso: -/// `RLMMongoClient`, `RLMMongoDatabase` -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMMongoCollection : NSObject -/// Block which returns an object id on a successful insert, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoInsertBlock)(id _Nullable, NSError * _Nullable); -/// Block which returns an array of object ids on a successful insertMany, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoInsertManyBlock)(NSArray> * _Nullable, NSError * _Nullable); -/// Block which returns an array of Documents on a successful find operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoFindBlock)(NSArray> *> * _Nullable, - NSError * _Nullable); -/// Block which returns a Document on a successful findOne operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoFindOneBlock)(NSDictionary> * _Nullable_result, - NSError * _Nullable); -/// Block which returns the number of Documents in a collection on a successful count operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoCountBlock)(NSInteger, NSError * _Nullable); -/// Block which returns an RLMUpdateResult on a successful update operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoUpdateBlock)(RLMUpdateResult * _Nullable, NSError * _Nullable); -/// Block which returns the deleted Document on a successful delete operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoDeleteBlock)(NSDictionary> * _Nullable_result, - NSError * _Nullable); - -/// The name of this mongodb collection. -@property (nonatomic, readonly) NSString *name; - -/// Encodes the provided value to BSON and inserts it. If the value is missing an identifier, one will be -/// generated for it. -/// @param document A `Document` value to insert. -/// @param completion The result of attempting to perform the insert. An Id will be returned for the inserted object on sucess -- (void)insertOneDocument:(NSDictionary> *)document - completion:(RLMMongoInsertBlock)completion NS_REFINED_FOR_SWIFT; - -/// Encodes the provided values to BSON and inserts them. If any values are missing identifiers, -/// they will be generated. -/// @param documents The `Document` values in a bson array to insert. -/// @param completion The result of the insert, returns an array inserted document ids in order -- (void)insertManyDocuments:(NSArray> *> *)documents - completion:(RLMMongoInsertManyBlock)completion NS_REFINED_FOR_SWIFT; - -/// Finds the documents in this collection which match the provided filter. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param options `RLMFindOptions` to use when executing the command. -/// @param completion The resulting bson array of documents or error if one occurs -- (void)findWhere:(NSDictionary> *)filterDocument - options:(RLMFindOptions *)options - completion:(RLMMongoFindBlock)completion NS_REFINED_FOR_SWIFT; - -/// Finds the documents in this collection which match the provided filter. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param completion The resulting bson array as a string or error if one occurs -- (void)findWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoFindBlock)completion NS_REFINED_FOR_SWIFT; - -/// Returns one document from a collection or view which matches the -/// provided filter. If multiple documents satisfy the query, this method -/// returns the first document according to the query's sort order or natural -/// order. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param options `RLMFindOptions` to use when executing the command. -/// @param completion The resulting bson or error if one occurs -- (void)findOneDocumentWhere:(NSDictionary> *)filterDocument - options:(RLMFindOptions *)options - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Returns one document from a collection or view which matches the -/// provided filter. If multiple documents satisfy the query, this method -/// returns the first document according to the query's sort order or natural -/// order. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param completion The resulting bson or error if one occurs -- (void)findOneDocumentWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Runs an aggregation framework pipeline against this collection. -/// @param pipeline A bson array made up of `Documents` containing the pipeline of aggregation operations to perform. -/// @param completion The resulting bson array of documents or error if one occurs -- (void)aggregateWithPipeline:(NSArray> *> *)pipeline - completion:(RLMMongoFindBlock)completion NS_REFINED_FOR_SWIFT; - -/// Counts the number of documents in this collection matching the provided filter. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param limit The max amount of documents to count -/// @param completion Returns the count of the documents that matched the filter. -- (void)countWhere:(NSDictionary> *)filterDocument - limit:(NSInteger)limit - completion:(RLMMongoCountBlock)completion NS_REFINED_FOR_SWIFT; - -/// Counts the number of documents in this collection matching the provided filter. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param completion Returns the count of the documents that matched the filter. -- (void)countWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoCountBlock)completion NS_REFINED_FOR_SWIFT; - -/// Deletes a single matching document from the collection. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param completion The result of performing the deletion. Returns the count of deleted objects -- (void)deleteOneDocumentWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoCountBlock)completion NS_REFINED_FOR_SWIFT; - -/// Deletes multiple documents -/// @param filterDocument Document representing the match criteria -/// @param completion The result of performing the deletion. Returns the count of the deletion -- (void)deleteManyDocumentsWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoCountBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates a single document matching the provided filter in this collection. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param upsert When true, creates a new document if no document matches the query. -/// @param completion The result of the attempt to update a document. -- (void)updateOneDocumentWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - upsert:(BOOL)upsert - completion:(RLMMongoUpdateBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates a single document matching the provided filter in this collection. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param completion The result of the attempt to update a document. -- (void)updateOneDocumentWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - completion:(RLMMongoUpdateBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates multiple documents matching the provided filter in this collection. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param upsert When true, creates a new document if no document matches the query. -/// @param completion The result of the attempt to update a document. -- (void)updateManyDocumentsWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - upsert:(BOOL)upsert - completion:(RLMMongoUpdateBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates multiple documents matching the provided filter in this collection. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param completion The result of the attempt to update a document. -- (void)updateManyDocumentsWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - completion:(RLMMongoUpdateBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates a single document in a collection based on a query filter and -/// returns the document in either its pre-update or post-update form. Unlike -/// `updateOneDocument`, this action allows you to atomically find, update, and -/// return a document with the same command. This avoids the risk of other -/// update operations changing the document between separate find and update -/// operations. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param options `RemoteFindOneAndModifyOptions` to use when executing the command. -/// @param completion The result of the attempt to update a document. -- (void)findOneAndUpdateWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - options:(RLMFindOneAndModifyOptions *)options - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates a single document in a collection based on a query filter and -/// returns the document in either its pre-update or post-update form. Unlike -/// `updateOneDocument`, this action allows you to atomically find, update, and -/// return a document with the same command. This avoids the risk of other -/// update operations changing the document between separate find and update -/// operations. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param completion The result of the attempt to update a document. -- (void)findOneAndUpdateWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Overwrites a single document in a collection based on a query filter and -/// returns the document in either its pre-replacement or post-replacement -/// form. Unlike `updateOneDocument`, this action allows you to atomically find, -/// replace, and return a document with the same command. This avoids the -/// risk of other update operations changing the document between separate -/// find and update operations. -/// @param filterDocument A `Document` that should match the query. -/// @param replacementDocument A `Document` describing the replacement. -/// @param options `RLMFindOneAndModifyOptions` to use when executing the command. -/// @param completion The result of the attempt to replace a document. -- (void)findOneAndReplaceWhere:(NSDictionary> *)filterDocument - replacementDocument:(NSDictionary> *)replacementDocument - options:(RLMFindOneAndModifyOptions *)options - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Overwrites a single document in a collection based on a query filter and -/// returns the document in either its pre-replacement or post-replacement -/// form. Unlike `updateOneDocument`, this action allows you to atomically find, -/// replace, and return a document with the same command. This avoids the -/// risk of other update operations changing the document between separate -/// find and update operations. -/// @param filterDocument A `Document` that should match the query. -/// @param replacementDocument A `Document` describing the update. -/// @param completion The result of the attempt to replace a document. -- (void)findOneAndReplaceWhere:(NSDictionary> *)filterDocument - replacementDocument:(NSDictionary> *)replacementDocument - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Removes a single document from a collection based on a query filter and -/// returns a document with the same form as the document immediately before -/// it was deleted. Unlike `deleteOneDocument`, this action allows you to atomically -/// find and delete a document with the same command. This avoids the risk of -/// other update operations changing the document between separate find and -/// delete operations. -/// @param filterDocument A `Document` that should match the query. -/// @param options `RLMFindOneAndModifyOptions` to use when executing the command. -/// @param completion The result of the attempt to delete a document. -- (void)findOneAndDeleteWhere:(NSDictionary> *)filterDocument - options:(RLMFindOneAndModifyOptions *)options - completion:(RLMMongoDeleteBlock)completion NS_REFINED_FOR_SWIFT; - -/// Removes a single document from a collection based on a query filter and -/// returns a document with the same form as the document immediately before -/// it was deleted. Unlike `deleteOneDocument`, this action allows you to atomically -/// find and delete a document with the same command. This avoids the risk of -/// other update operations changing the document between separate find and -/// delete operations. -/// @param filterDocument A `Document` that should match the query. -/// @param completion The result of the attempt to delete a document. -- (void)findOneAndDeleteWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoDeleteBlock)completion NS_REFINED_FOR_SWIFT; - -/// Opens a MongoDB change stream against the collection to watch for changes. The resulting stream will be notified -/// of all events on this collection that the active user is authorized to see based on the configured MongoDB -/// rules. -/// @param delegate The delegate that will react to events and errors from the resulting change stream. -/// @param queue Dispatches streaming events to an optional queue, if no queue is provided the main queue is used -- (RLMChangeStream *)watchWithDelegate:(id)delegate - delegateQueue:(nullable dispatch_queue_t)queue NS_REFINED_FOR_SWIFT; - -/// Opens a MongoDB change stream against the collection to watch for changes -/// made to specific documents. The documents to watch must be explicitly -/// specified by their _id. -/// @param filterIds The list of _ids in the collection to watch. -/// @param delegate The delegate that will react to events and errors from the resulting change stream. -/// @param queue Dispatches streaming events to an optional queue, if no queue is provided the main queue is used -- (RLMChangeStream *)watchWithFilterIds:(NSArray *)filterIds - delegate:(id)delegate - delegateQueue:(nullable dispatch_queue_t)queue NS_REFINED_FOR_SWIFT; - -/// Opens a MongoDB change stream against the collection to watch for changes. The provided BSON document will be -/// used as a match expression filter on the change events coming from the stream. -/// -/// See https://docs.mongodb.com/manual/reference/operator/aggregation/match/ for documentation around how to define -/// a match filter. -/// -/// Defining the match expression to filter ChangeEvents is similar to defining the match expression for triggers: -/// https://docs.mongodb.com/realm/triggers/database-triggers/ -/// @param matchFilter The $match filter to apply to incoming change events -/// @param delegate The delegate that will react to events and errors from the resulting change stream. -/// @param queue Dispatches streaming events to an optional queue, if no queue is provided the main queue is used -- (RLMChangeStream *)watchWithMatchFilter:(NSDictionary> *)matchFilter - delegate:(id)delegate - delegateQueue:(nullable dispatch_queue_t)queue NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMMongoDatabase.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMMongoDatabase.h deleted file mode 100644 index 177fbc1b8..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMMongoDatabase.h +++ /dev/null @@ -1,51 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMMongoCollection; - -/// The `RLMMongoDatabase` represents a MongoDB database, which holds a group -/// of collections that contain your data. -/// -/// It can be retrieved from the `RLMMongoClient`. -/// -/// Use it to get `RLMMongoCollection`s for reading and writing data. -/// -/// - Note: -/// Before you can read or write data, a user must log in`. -/// -/// - SeeAlso: -/// `RLMMongoClient`, `RLMMongoCollection` -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMMongoDatabase : NSObject - -/// The name of this database -@property (nonatomic, readonly) NSString *name; - -/// Gets a collection. -/// @param name The name of the collection to return -/// @returns The collection -- (RLMMongoCollection *)collectionWithName:(NSString *)name; -// NEXT-MAJOR: NS_SWIFT_NAME(collection(named:)) - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMNetworkTransport.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMNetworkTransport.h deleted file mode 100644 index 2884b4296..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMNetworkTransport.h +++ /dev/null @@ -1,132 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// Allowed HTTP methods to be used with `RLMNetworkTransport`. -typedef RLM_CLOSED_ENUM(int32_t, RLMHTTPMethod) { - /// GET is used to request data from a specified resource. - RLMHTTPMethodGET = 0, - /// POST is used to send data to a server to create/update a resource. - RLMHTTPMethodPOST = 1, - /// PATCH is used to send data to a server to update a resource. - RLMHTTPMethodPATCH = 2, - /// PUT is used to send data to a server to create/update a resource. - RLMHTTPMethodPUT = 3, - /// The DELETE method deletes the specified resource. - RLMHTTPMethodDELETE = 4 -}; - -/// An HTTP request that can be made to an arbitrary server. -@interface RLMRequest : NSObject - -/// The HTTP method of this request. -@property (nonatomic, assign) RLMHTTPMethod method; - -/// The URL to which this request will be made. -@property (nonatomic, strong) NSString *url; - -/// The number of milliseconds that the underlying transport should spend on an -/// HTTP round trip before failing with an error. -@property (nonatomic, assign) NSTimeInterval timeout; - -/// The HTTP headers of this request. -@property (nonatomic, strong) NSDictionary* headers; - -/// The body of the request. -@property (nonatomic, strong) NSString* body; - -@end - -/// The contents of an HTTP response. -@interface RLMResponse : NSObject - -/// The status code of the HTTP response. -@property (nonatomic, assign) NSInteger httpStatusCode; - -/// A custom status code provided by the SDK. -@property (nonatomic, assign) NSInteger customStatusCode; - -/// The headers of the HTTP response. -@property (nonatomic, strong) NSDictionary* headers; - -/// The body of the HTTP response. -@property (nonatomic, strong) NSString *body; - -@end - -/// Delegate which is used for subscribing to changes. -@protocol RLMEventDelegate -/// Invoked when a change event has been received. -/// @param event The change event encoded as NSData -- (void)didReceiveEvent:(NSData *)event; -/// A error has occurred while subscribing to changes. -/// @param error The error that has occurred. -- (void)didReceiveError:(NSError *)error; -/// The stream was opened. -- (void)didOpen; -/// The stream has been closed. -/// @param error The error that has occurred. -- (void)didCloseWithError:(NSError *_Nullable)error; -@end - -/// A block for receiving an `RLMResponse` from the `RLMNetworkTransport`. -RLM_SWIFT_SENDABLE // invoked on a backgroun thread -typedef void(^RLMNetworkTransportCompletionBlock)(RLMResponse *); - -/// Transporting protocol for foreign interfaces. Allows for custom -/// request/response handling. -RLM_SWIFT_SENDABLE // used from multiple threads so must be internally thread-safe -@protocol RLMNetworkTransport - -/** - Sends a request to a given endpoint. - - @param request The request to send. - @param completionBlock A callback invoked on completion of the request. -*/ -- (void)sendRequestToServer:(RLMRequest *)request - completion:(RLMNetworkTransportCompletionBlock)completionBlock; - -/// Starts an event stream request. -/// @param request The RLMRequest to start. -/// @param subscriber The RLMEventDelegate which will subscribe to changes from the server. -- (NSURLSession *)doStreamRequest:(RLMRequest *)request - eventSubscriber:(id)subscriber; - -@end - -/// Transporting protocol for foreign interfaces. Allows for custom -/// request/response handling. -RLM_SWIFT_SENDABLE // is internally thread-safe -@interface RLMNetworkTransport : NSObject - -/** - Sends a request to a given endpoint. - - @param request The request to send. - @param completionBlock A callback invoked on completion of the request. -*/ -- (void)sendRequestToServer:(RLMRequest *) request - completion:(RLMNetworkTransportCompletionBlock)completionBlock; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMObject.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMObject.h deleted file mode 100644 index 9bcfbe310..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMObject.h +++ /dev/null @@ -1,811 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMNotificationToken; -@class RLMObjectSchema; -@class RLMPropertyChange; -@class RLMPropertyDescriptor; -@class RLMRealm; -@class RLMResults; - -/** - `RLMObject` is a base class for model objects representing data stored in Realms. - - Define your model classes by subclassing `RLMObject` and adding properties to be managed. - Then instantiate and use your custom subclasses instead of using the `RLMObject` class directly. - - // Dog.h - @interface Dog : RLMObject - @property NSString *name; - @property BOOL adopted; - @end - - // Dog.m - @implementation Dog - @end //none needed - - ### Supported property types - - - `NSString` - - `NSInteger`, `int`, `long`, `float`, and `double` - - `BOOL` or `bool` - - `NSDate` - - `NSData` - - `NSNumber`, where `X` is one of `RLMInt`, `RLMFloat`, `RLMDouble` or `RLMBool`, for optional number properties - - `RLMObject` subclasses, to model many-to-one relationships. - - `RLMArray`, where `X` is an `RLMObject` subclass, to model many-to-many relationships. - - ### Querying - - You can initiate queries directly via the class methods: `allObjects`, `objectsWhere:`, and `objectsWithPredicate:`. - These methods allow you to easily query a custom subclass for instances of that class in the default Realm. - - To search in a Realm other than the default Realm, use the `allObjectsInRealm:`, `objectsInRealm:where:`, - and `objectsInRealm:withPredicate:` class methods. - - @see `RLMRealm` - - ### Relationships - - See our [Realm Swift Documentation](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/relationships/#relationships) for more details. - - ### Key-Value Observing - - All `RLMObject` properties (including properties you create in subclasses) are - [Key-Value Observing compliant](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/KeyValueObserving/KeyValueObserving.html), - except for `realm` and `objectSchema`. - - Keep the following tips in mind when observing Realm objects: - - 1. Unlike `NSMutableArray` properties, `RLMArray` properties do not require - using the proxy object returned from `-mutableArrayValueForKey:`, or defining - KVC mutation methods on the containing class. You can simply call methods on - the `RLMArray` directly; any changes will be automatically observed by the containing - object. - 2. Unmanaged `RLMObject` instances cannot be added to a Realm while they have any - observed properties. - 3. Modifying managed `RLMObject`s within `-observeValueForKeyPath:ofObject:change:context:` - is not recommended. Properties may change even when the Realm is not in a write - transaction (for example, when `-[RLMRealm refresh]` is called after changes - are made on a different thread), and notifications sent prior to the change - being applied (when `NSKeyValueObservingOptionPrior` is used) may be sent at - times when you *cannot* begin a write transaction. - */ - -@interface RLMObject : RLMObjectBase - -#pragma mark - Creating & Initializing Objects - -/** - Creates an unmanaged instance of a Realm object. - - Call `addObject:` on an `RLMRealm` instance to add an unmanaged object into that Realm. - - @see `[RLMRealm addObject:]` - */ -- (instancetype)init NS_DESIGNATED_INITIALIZER; - - -/** - Creates an unmanaged instance of a Realm object. - - Pass in an `NSArray` or `NSDictionary` instance to set the values of the object's properties. - - Call `addObject:` on an `RLMRealm` instance to add an unmanaged object into that Realm. - - @see `[RLMRealm addObject:]` - */ -- (instancetype)initWithValue:(id)value; - - -/** - Returns the class name for a Realm object subclass. - - @warning Do not override. Realm relies on this method returning the exact class - name. - - @return The class name for the model class. - */ -+ (NSString *)className; - -/** - Creates an instance of a Realm object with a given value, and adds it to the default Realm. - - If nested objects are included in the argument, `createInDefaultRealmWithValue:` will be recursively called - on them. - - The `value` argument can be a key-value coding compliant object, an array or dictionary returned from the methods in - `NSJSONSerialization`, or an array containing one element for each managed property. - - An exception will be thrown if any required properties are not present and those properties - were not defined with default values. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param value The value used to populate the object. - - @see `defaultPropertyValues` - */ -+ (instancetype)createInDefaultRealmWithValue:(id)value; - -/** - Creates an instance of a Realm object with a given value, and adds it to the specified Realm. - - If nested objects are included in the argument, `createInRealm:withValue:` will be recursively called - on them. - - The `value` argument can be a key-value coding compliant object, an array or dictionary returned from the methods in - `NSJSONSerialization`, or an array containing one element for each managed property. - - An exception will be thrown if any required properties are not present and those properties - were not defined with default values. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param realm The Realm which should manage the newly-created object. - @param value The value used to populate the object. - - @see `defaultPropertyValues` - */ -+ (instancetype)createInRealm:(RLMRealm *)realm withValue:(id)value; - -/** - Creates or updates a Realm object within the default Realm. - - This method may only be called on Realm object types with a primary key defined. If there is already - an object with the same primary key value in the default Realm, its values are updated and the object - is returned. Otherwise, this method creates and populates a new instance of the object in the default Realm. - - If nested objects are included in the argument, `createOrUpdateInDefaultRealmWithValue:` will be - recursively called on them if they have primary keys, `createInDefaultRealmWithValue:` if they do not. - - The `value` argument is used to populate the object. It can be a Realm object, a key-value coding - compliant object, an array or dictionary returned from the methods in `NSJSONSerialization`, or an - array containing one element for each managed property. - - If the object is being created, an exception will be thrown if any required properties - are not present and those properties were not defined with default values. - - If the `value` argument is a Realm object already managed by the default Realm, the - argument's type is the same as the receiver, and the objects have identical values for - their managed properties, this method does nothing. - - If the object is being updated, each property defined in its schema will be set by copying from - `value` using key-value coding. If the `value` argument does not respond to `valueForKey:` for a - given property name (or getter name, if defined), that value will remain untouched. - Nullable properties on the object can be set to nil by using `NSNull` as the updated value. - Each property is set even if the existing value is the same as the new value being set, and - notifications will report them all being changed. See `createOrUpdateModifiedInDefaultRealmWithValue:` - for a version of this function which only sets the values which have changed. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param value The value used to populate the object. - - @see `defaultPropertyValues`, `primaryKey` - */ -+ (instancetype)createOrUpdateInDefaultRealmWithValue:(id)value; - -/** - Creates or updates a Realm object within the default Realm. - - This method may only be called on Realm object types with a primary key defined. If there is already - an object with the same primary key value in the default Realm, its values are updated and the object - is returned. Otherwise, this method creates and populates a new instance of the object in the default Realm. - - If nested objects are included in the argument, `createOrUpdateModifiedInDefaultRealmWithValue:` will be - recursively called on them if they have primary keys, `createInDefaultRealmWithValue:` if they do not. - - The `value` argument is used to populate the object. It can be a Realm object, a key-value coding - compliant object, an array or dictionary returned from the methods in `NSJSONSerialization`, or an - array containing one element for each managed property. - - If the object is being created, an exception will be thrown if any required properties - are not present and those properties were not defined with default values. - - If the `value` argument is a Realm object already managed by the default Realm, the - argument's type is the same as the receiver, and the objects have identical values for - their managed properties, this method does nothing. - - If the object is being updated, each property defined in its schema will be set by copying from - `value` using key-value coding. If the `value` argument does not respond to `valueForKey:` for a - given property name (or getter name, if defined), that value will remain untouched. - Nullable properties on the object can be set to nil by using `NSNull` as the updated value. - Unlike `createOrUpdateInDefaultRealmWithValue:`, only properties which have changed in value are - set, and any change notifications produced by this call will report only which properies have - actually changed. - - Checking which properties have changed imposes a small amount of overhead, and so this method - may be slower when all or nearly all of the properties being set have changed. If most or all - of the properties being set have not changed, this method will be much faster than unconditionally - setting all of them, and will also reduce how much data has to be written to the Realm, saving - both i/o time and disk space. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param value The value used to populate the object. - - @see `defaultPropertyValues`, `primaryKey` - */ -+ (instancetype)createOrUpdateModifiedInDefaultRealmWithValue:(id)value; - -/** - Creates or updates an Realm object within a specified Realm. - - This method may only be called on Realm object types with a primary key defined. If there is already - an object with the same primary key value in the given Realm, its values are updated and the object - is returned. Otherwise this method creates and populates a new instance of this object in the given Realm. - - If nested objects are included in the argument, `createOrUpdateInRealm:withValue:` will be - recursively called on them if they have primary keys, `createInRealm:withValue:` if they do not. - - The `value` argument is used to populate the object. It can be a Realm object, a key-value coding - compliant object, an array or dictionary returned from the methods in `NSJSONSerialization`, or an - array containing one element for each managed property. - - If the object is being created, an exception will be thrown if any required properties - are not present and those properties were not defined with default values. - - If the `value` argument is a Realm object already managed by the given Realm, the - argument's type is the same as the receiver, and the objects have identical values for - their managed properties, this method does nothing. - - If the object is being updated, each property defined in its schema will be set by copying from - `value` using key-value coding. If the `value` argument does not respond to `valueForKey:` for a - given property name (or getter name, if defined), that value will remain untouched. - Nullable properties on the object can be set to nil by using `NSNull` as the updated value. - Each property is set even if the existing value is the same as the new value being set, and - notifications will report them all being changed. See `createOrUpdateModifiedInRealm:withValue:` - for a version of this function which only sets the values which have changed. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param realm The Realm which should own the object. - @param value The value used to populate the object. - - @see `defaultPropertyValues`, `primaryKey` - */ -+ (instancetype)createOrUpdateInRealm:(RLMRealm *)realm withValue:(id)value; - -/** - Creates or updates an Realm object within a specified Realm. - - This method may only be called on Realm object types with a primary key defined. If there is already - an object with the same primary key value in the given Realm, its values are updated and the object - is returned. Otherwise this method creates and populates a new instance of this object in the given Realm. - - If nested objects are included in the argument, `createOrUpdateInRealm:withValue:` will be - recursively called on them if they have primary keys, `createInRealm:withValue:` if they do not. - - The `value` argument is used to populate the object. It can be a Realm object, a key-value coding - compliant object, an array or dictionary returned from the methods in `NSJSONSerialization`, or an - array containing one element for each managed property. - - If the object is being created, an exception will be thrown if any required properties - are not present and those properties were not defined with default values. - - If the `value` argument is a Realm object already managed by the given Realm, the - argument's type is the same as the receiver, and the objects have identical values for - their managed properties, this method does nothing. - - If the object is being updated, each property defined in its schema will be set by copying from - `value` using key-value coding. If the `value` argument does not respond to `valueForKey:` for a - given property name (or getter name, if defined), that value will remain untouched. - Nullable properties on the object can be set to nil by using `NSNull` as the updated value. - Unlike `createOrUpdateInRealm:withValue:`, only properties which have changed in value are - set, and any change notifications produced by this call will report only which properies have - actually changed. - - Checking which properties have changed imposes a small amount of overhead, and so this method - may be slower when all or nearly all of the properties being set have changed. If most or all - of the properties being set have not changed, this method will be much faster than unconditionally - setting all of them, and will also reduce how much data has to be written to the Realm, saving - both i/o time and disk space. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param realm The Realm which should own the object. - @param value The value used to populate the object. - - @see `defaultPropertyValues`, `primaryKey` - */ -+ (instancetype)createOrUpdateModifiedInRealm:(RLMRealm *)realm withValue:(id)value; - -#pragma mark - Properties - -/** - The Realm which manages the object, or `nil` if the object is unmanaged. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - The object schema which lists the managed properties for the object. - */ -@property (nonatomic, readonly) RLMObjectSchema *objectSchema; - -/** - Indicates if the object can no longer be accessed because it is now invalid. - - An object can no longer be accessed if the object has been deleted from the Realm that manages it, or - if `invalidate` is called on that Realm. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if this object is frozen. - - @see `-[RLMObject freeze]` - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - - -#pragma mark - Customizing your Objects - -/** - Returns an array of property names for properties which should be indexed. - - Only string, integer, boolean, and `NSDate` properties are supported. - - @return An array of property names. - */ -+ (NSArray *)indexedProperties; - -/** - Override this method to specify the default values to be used for each property. - - @return A dictionary mapping property names to their default values. - */ -+ (nullable NSDictionary *)defaultPropertyValues; - -/** - Override this method to specify the name of a property to be used as the primary key. - - Only properties of types `RLMPropertyTypeString` and `RLMPropertyTypeInt` can be designated as the primary key. - Primary key properties enforce uniqueness for each value whenever the property is set, which incurs minor overhead. - Indexes are created automatically for primary key properties. - - @return The name of the property designated as the primary key. - */ -+ (nullable NSString *)primaryKey; - -/** - Override this method to specify the names of properties to ignore. These properties will not be managed by the Realm - that manages the object. - - @return An array of property names to ignore. - */ -+ (nullable NSArray *)ignoredProperties; - -/** - Override this method to specify the names of properties that are non-optional (i.e. cannot be assigned a `nil` value). - - By default, all properties of a type whose values can be set to `nil` are considered optional properties. - To require that an object in a Realm always store a non-`nil` value for a property, - add the name of the property to the array returned from this method. - - Properties of `RLMObject` type cannot be non-optional. Array and `NSNumber` properties - can be non-optional, but there is no reason to do so: arrays do not support storing nil, and - if you want a non-optional number you should instead use the primitive type. - - @return An array of property names that are required. - */ -+ (NSArray *)requiredProperties; - -/** - Override this method to provide information related to properties containing linking objects. - - Each property of type `RLMLinkingObjects` must have a key in the dictionary returned by this method consisting - of the property name. The corresponding value must be an instance of `RLMPropertyDescriptor` that describes the class - and property that the property is linked to. - - return @{ @"owners": [RLMPropertyDescriptor descriptorWithClass:Owner.class propertyName:@"dogs"] }; - - @return A dictionary mapping property names to `RLMPropertyDescriptor` instances. - */ -+ (NSDictionary *)linkingObjectsProperties; - -#pragma mark - Getting & Querying Objects from the Default Realm - -/** - Returns all objects of this object type from the default Realm. - - @return An `RLMResults` containing all objects of this type in the default Realm. - */ -+ (RLMResults *)allObjects; - -/** - Returns all objects of this object type matching the given predicate from the default Realm. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` containing all objects of this type in the default Realm that match the given predicate. - */ -+ (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -+ (RLMResults<__kindof RLMObject *> *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - - -/** - Returns all objects of this object type matching the given predicate from the default Realm. - - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` containing all objects of this type in the default Realm that match the given predicate. - */ -+ (RLMResults *)objectsWithPredicate:(nullable NSPredicate *)predicate; - -/** - Retrieves the single instance of this object type with the given primary key from the default Realm. - - Returns the object from the default Realm which has the given primary key, or - `nil` if the object does not exist. This is slightly faster than the otherwise - equivalent `[[SubclassName objectsWhere:@"primaryKeyPropertyName = %@", key] firstObject]`. - - This method requires that `primaryKey` be overridden on the receiving subclass. - - @return An object of this object type, or `nil` if an object with the given primary key does not exist. - @see `-primaryKey` - */ -+ (nullable instancetype)objectForPrimaryKey:(nullable id)primaryKey NS_SWIFT_NAME(object(forPrimaryKey:)); - - -#pragma mark - Querying Specific Realms - -/** - Returns all objects of this object type from the specified Realm. - - @param realm The Realm to query. - - @return An `RLMResults` containing all objects of this type in the specified Realm. - */ -+ (RLMResults *)allObjectsInRealm:(RLMRealm *)realm; - -/** - Returns all objects of this object type matching the given predicate from the specified Realm. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - @param realm The Realm to query. - - @return An `RLMResults` containing all objects of this type in the specified Realm that match the given predicate. - */ -+ (RLMResults *)objectsInRealm:(RLMRealm *)realm where:(NSString *)predicateFormat, ...; - -/// :nodoc: -+ (RLMResults<__kindof RLMObject *> *)objectsInRealm:(RLMRealm *)realm where:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all objects of this object type matching the given predicate from the specified Realm. - - @param predicate A predicate to use to filter the elements. - @param realm The Realm to query. - - @return An `RLMResults` containing all objects of this type in the specified Realm that match the given predicate. - */ -+ (RLMResults *)objectsInRealm:(RLMRealm *)realm withPredicate:(nullable NSPredicate *)predicate; - -/** - Retrieves the single instance of this object type with the given primary key from the specified Realm. - - Returns the object from the specified Realm which has the given primary key, or - `nil` if the object does not exist. This is slightly faster than the otherwise - equivalent `[[SubclassName objectsInRealm:realm where:@"primaryKeyPropertyName = %@", key] firstObject]`. - - This method requires that `primaryKey` be overridden on the receiving subclass. - - @return An object of this object type, or `nil` if an object with the given primary key does not exist. - @see `-primaryKey` - */ -+ (nullable instancetype)objectInRealm:(RLMRealm *)realm forPrimaryKey:(nullable id)primaryKey NS_SWIFT_NAME(object(in:forPrimaryKey:)); - -#pragma mark - Notifications - -/** - A callback block for `RLMObject` notifications. - - If the object is deleted from the managing Realm, the block is called with - `deleted` set to `YES` and the other two arguments are `nil`. The block will - never be called again after this. - - If the object is modified, the block will be called with `deleted` set to - `NO`, a `nil` error, and an array of `RLMPropertyChange` objects which - indicate which properties of the objects were modified. - - `error` is always `nil` and will be removed in a future version. - */ -typedef void (^RLMObjectChangeBlock)(BOOL deleted, - NSArray *_Nullable changes, - NSError *_Nullable error); - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When notifications - can't be delivered instantly, multiple notifications may be coalesced into a - single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - - @param block The block to be called whenever a change occurs. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block queue:(dispatch_queue_t)queue; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block keyPaths:(NSArray *)keyPaths queue:(dispatch_queue_t)queue; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block keyPaths:(NSArray *)keyPaths; - - -#pragma mark - Other Instance Methods - -/** - Returns YES if another Realm object instance points to the same object as the receiver in the Realm managing - the receiver. - - For frozen objects and object types with a primary key, `isEqual:` is - overridden to use the same logic as this method (along with a corresponding - implementation for `hash`). Non-frozen objects without primary keys use - pointer identity for `isEqual:` and `hash`. - - @param object The object to compare the receiver to. - - @return Whether the object represents the same object as the receiver. - */ -- (BOOL)isEqualToObject:(RLMObject *)object; - -/** - Returns a frozen (immutable) snapshot of this object. - - The frozen copy is an immutable object which contains the same data as this - object currently contains, but will not update when writes are made to the - containing Realm. Unlike live objects, frozen objects can be accessed from any - thread. - - - warning: Holding onto a frozen object for an extended period while performing write - transaction on the Realm may result in the Realm file growing to large sizes. See - `Realm.Configuration.maximumNumberOfActiveVersions` for more information. - - warning: This method can only be called on a managed object. - */ -- (instancetype)freeze NS_RETURNS_RETAINED; - -/** - Returns a live (mutable) reference of this object. - - This method creates a managed accessor to a live copy of the same frozen object. - Will return self if called on an already live object. - */ -- (instancetype)thaw; - -#pragma mark - Dynamic Accessors - -/// :nodoc: -- (nullable id)objectForKeyedSubscript:(NSString *)key; - -/// :nodoc: -- (void)setObject:(nullable id)obj forKeyedSubscript:(NSString *)key; - -@end - -/** - Information about a specific property which changed in an `RLMObject` change notification. - */ -@interface RLMPropertyChange : NSObject - -/** - The name of the property which changed. - */ -@property (nonatomic, readonly, strong) NSString *name; - -/** - The value of the property before the change occurred. This will always be `nil` - if the change happened on the same thread as the notification and for `RLMArray` - properties. - - For object properties this will give the object which was previously linked to, - but that object will have its new values and not the values it had before the - changes. This means that `previousValue` may be a deleted object, and you will - need to check `invalidated` before accessing any of its properties. - */ -@property (nonatomic, readonly, strong, nullable) id previousValue; - -/** - The value of the property after the change occurred. This will always be `nil` - for `RLMArray` properties. - */ -@property (nonatomic, readonly, strong, nullable) id value; -@end - -#pragma mark - RLMArray Property Declaration - -/** - Properties on `RLMObject`s of type `RLMArray` must have an associated type. A type is associated - with an `RLMArray` property by defining a protocol for the object type that the array should contain. - To define the protocol for an object, you can use the macro RLM_ARRAY_TYPE: - - RLM_ARRAY_TYPE(ObjectType) - ... - @property RLMArray *arrayOfObjectTypes; - */ -#define RLM_ARRAY_TYPE(RLM_OBJECT_SUBCLASS)\ -__attribute__((deprecated("RLM_ARRAY_TYPE has been deprecated. Use RLM_COLLECTION_TYPE instead."))) \ -@protocol RLM_OBJECT_SUBCLASS \ -@end - -/** - Properties on `RLMObject`s of type `RLMSet` / `RLMArray` must have an associated type. A type is associated - with an `RLMSet` / `RLMArray` property by defining a protocol for the object type that the array should contain. - To define the protocol for an object, you can use the macro RLM_COLLECTION_TYPE: - - RLM_COLLECTION_TYPE(ObjectType) - ... - @property RLMSet *setOfObjectTypes; - @property RLMArray *arrayOfObjectTypes; - */ -#define RLM_COLLECTION_TYPE(RLM_OBJECT_SUBCLASS)\ -@protocol RLM_OBJECT_SUBCLASS \ -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMObjectBase.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMObjectBase.h deleted file mode 100644 index 7e9c83c8f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMObjectBase.h +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// :nodoc: -@interface RLMObjectBase : NSObject - -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -- (instancetype)init NS_DESIGNATED_INITIALIZER; - -+ (NSString *)className; - -// Returns whether the class is included in the default set of classes managed by a Realm. -+ (BOOL)shouldIncludeInDefaultSchema; - -+ (nullable NSString *)_realmObjectName; -+ (nullable NSDictionary *)_realmColumnNames; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMObjectBase_Dynamic.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMObjectBase_Dynamic.h deleted file mode 100644 index fb74a5b27..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMObjectBase_Dynamic.h +++ /dev/null @@ -1,82 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectSchema, RLMRealm; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -/** - Returns the Realm that manages the object, if one exists. - - @warning This function is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is - recommended to retrieve the Realm that manages the object via `RLMObject`. - - @param object An `RLMObjectBase` obtained via a Swift `Object` or `RLMObject`. - - @return The Realm which manages this object. Returns `nil `for unmanaged objects. - */ -FOUNDATION_EXTERN RLMRealm * _Nullable RLMObjectBaseRealm(RLMObjectBase * _Nullable object); - -/** - Returns an `RLMObjectSchema` which describes the managed properties of the object. - - @warning This function is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is - recommended to retrieve `objectSchema` via `RLMObject`. - - @param object An `RLMObjectBase` obtained via a Swift `Object` or `RLMObject`. - - @return The object schema which lists the managed properties for the object. - */ -FOUNDATION_EXTERN RLMObjectSchema * _Nullable RLMObjectBaseObjectSchema(RLMObjectBase * _Nullable object); - -/** - Returns the object corresponding to a key value. - - @warning This function is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is - recommended to retrieve key values via `RLMObject`. - - @warning Will throw an `NSUndefinedKeyException` if `key` is not present on the object. - - @param object An `RLMObjectBase` obtained via a Swift `Object` or `RLMObject`. - @param key The name of the property. - - @return The object for the property requested. - */ -FOUNDATION_EXTERN id _Nullable RLMObjectBaseObjectForKeyedSubscript(RLMObjectBase * _Nullable object, NSString *key); - -/** - Sets a value for a key on the object. - - @warning This function is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is - recommended to set key values via `RLMObject`. - - @warning Will throw an `NSUndefinedKeyException` if `key` is not present on the object. - - @param object An `RLMObjectBase` obtained via a Swift `Object` or `RLMObject`. - @param key The name of the property. - @param obj The object to set as the value of the key. - */ -FOUNDATION_EXTERN void RLMObjectBaseSetObjectForKeyedSubscript(RLMObjectBase * _Nullable object, NSString *key, id _Nullable obj); - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMObjectId.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMObjectId.h deleted file mode 100644 index 32ef7b047..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMObjectId.h +++ /dev/null @@ -1,79 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A 12-byte (probably) unique object identifier. - - ObjectIds are similar to a GUID or a UUID, and can be used to uniquely identify - objects without a centralized ID generator. An ObjectID consists of: - - 1. A 4 byte timestamp measuring the creation time of the ObjectId in seconds - since the Unix epoch. - 2. A 5 byte random value - 3. A 3 byte counter, initialized to a random value. - - ObjectIds are intended to be fast to generate. Sorting by an ObjectId field - will typically result in the objects being sorted in creation order. - */ -RLM_SWIFT_SENDABLE // immutable -@interface RLMObjectId : NSObject -/// Creates a new randomly-initialized ObjectId. -+ (nonnull instancetype)objectId NS_SWIFT_NAME(generate()); - -/// Creates a new zero-initialized ObjectId. -- (instancetype)init; - -/// Creates a new ObjectId from the given 24-byte hexadecimal string. -/// -/// Returns `nil` and sets `error` if the string is not 24 characters long or -/// contains any characters other than 0-9a-fA-F. -/// -/// @param string The string to parse. -- (nullable instancetype)initWithString:(NSString *)string - error:(NSError **)error; - -/// Creates a new ObjectId using the given date, machine identifier, process identifier. -/// -/// @param timestamp A timestamp as NSDate. -/// @param machineIdentifier The machine identifier. -/// @param processIdentifier The process identifier. -- (instancetype)initWithTimestamp:(NSDate *)timestamp - machineIdentifier:(int)machineIdentifier - processIdentifier:(int)processIdentifier; - -/// Comparision operator to check if the right hand side is greater than the current value. -- (BOOL)isGreaterThan:(nullable RLMObjectId *)objectId; -/// Comparision operator to check if the right hand side is greater than or equal to the current value. -- (BOOL)isGreaterThanOrEqualTo:(nullable RLMObjectId *)objectId; -/// Comparision operator to check if the right hand side is less than the current value. -- (BOOL)isLessThan:(nullable RLMObjectId *)objectId; -/// Comparision operator to check if the right hand side is less than or equal to the current value. -- (BOOL)isLessThanOrEqualTo:(nullable RLMObjectId *)objectId; - -/// Get the ObjectId as a 24-character hexadecimal string. -@property (nonatomic, readonly) NSString *stringValue; -/// Get the timestamp for the RLMObjectId -@property (nonatomic, readonly) NSDate *timestamp; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMObjectSchema.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMObjectSchema.h deleted file mode 100644 index 9c4666b7c..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMObjectSchema.h +++ /dev/null @@ -1,83 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMProperty; - -/** - This class represents Realm model object schemas. - - When using Realm, `RLMObjectSchema` instances allow performing migrations and - introspecting the database's schema. - - Object schemas map to tables in the core database. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // not actually immutable, but the public API kinda is -@interface RLMObjectSchema : NSObject - -#pragma mark - Properties - -/** - An array of `RLMProperty` instances representing the managed properties of a class described by the schema. - - @see `RLMProperty` - */ -@property (nonatomic, readonly, copy) NSArray *properties; - -/** - The name of the class the schema describes. - */ -@property (nonatomic, readonly) NSString *className; - -/** - The property which serves as the primary key for the class the schema describes, if any. - */ -@property (nonatomic, readonly, nullable) RLMProperty *primaryKeyProperty; - -/** - Whether this object type is embedded. - */ -@property (nonatomic, readonly) BOOL isEmbedded; - -/** - Whether this object is asymmetric. - */ -@property (nonatomic, readonly) BOOL isAsymmetric; - -#pragma mark - Methods - -/** - Retrieves an `RLMProperty` object by the property name. - - @param propertyName The property's name. - - @return An `RLMProperty` object, or `nil` if there is no property with the given name. - */ -- (nullable RLMProperty *)objectForKeyedSubscript:(NSString *)propertyName; - -/** - Returns whether two `RLMObjectSchema` instances are equal. - */ -- (BOOL)isEqualToObjectSchema:(RLMObjectSchema *)objectSchema; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMProperty.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMProperty.h deleted file mode 100644 index 7f2594d3b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMProperty.h +++ /dev/null @@ -1,149 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// :nodoc: -@protocol RLMInt @end -/// :nodoc: -@protocol RLMBool @end -/// :nodoc: -@protocol RLMDouble @end -/// :nodoc: -@protocol RLMFloat @end -/// :nodoc: -@protocol RLMString @end -/// :nodoc: -@protocol RLMDate @end -/// :nodoc: -@protocol RLMData @end -/// :nodoc: -@protocol RLMDecimal128 @end -/// :nodoc: -@protocol RLMObjectId @end -/// :nodoc: -@protocol RLMUUID @end - -/// :nodoc: -@interface NSNumber () -@end - -/** - `RLMProperty` instances represent properties managed by a Realm in the context - of an object schema. Such properties may be persisted to a Realm file or - computed from other data from the Realm. - - When using Realm, `RLMProperty` instances allow performing migrations and - introspecting the database's schema. - - These property instances map to columns in the core database. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // not actually immutable, but the public API kinda is -@interface RLMProperty : NSObject - -#pragma mark - Properties - -/** - The name of the property. - */ -@property (nonatomic, readonly) NSString *name; - -/** - The type of the property. - - @see `RLMPropertyType` - */ -@property (nonatomic, readonly) RLMPropertyType type; - -/** - Indicates whether this property is indexed. - - @see `RLMObject` - */ -@property (nonatomic, readonly) BOOL indexed; - -/** - For `RLMObject` and `RLMCollection` properties, the name of the class of object stored in the property. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - For linking objects properties, the property name of the property the linking objects property is linked to. - */ -@property (nonatomic, readonly, copy, nullable) NSString *linkOriginPropertyName; - -/** - Indicates whether this property is optional. - */ -@property (nonatomic, readonly) BOOL optional; - -/** - Indicates whether this property is an array. - */ -@property (nonatomic, readonly) BOOL array; - -/** - Indicates whether this property is a set. - */ -@property (nonatomic, readonly) BOOL set; - -/** - Indicates whether this property is a dictionary. - */ -@property (nonatomic, readonly) BOOL dictionary; - -/** - Indicates whether this property is an array or set. - */ -@property (nonatomic, readonly) BOOL collection; - -#pragma mark - Methods - -/** - Returns whether a given property object is equal to the receiver. - */ -- (BOOL)isEqualToProperty:(RLMProperty *)property; - -@end - - -/** - An `RLMPropertyDescriptor` instance represents a specific property on a given class. - */ -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMPropertyDescriptor : NSObject - -/** - Creates and returns a property descriptor. - - @param objectClass The class of this property descriptor. - @param propertyName The name of this property descriptor. - */ -+ (instancetype)descriptorWithClass:(Class)objectClass propertyName:(NSString *)propertyName; - -/// The class of the property. -@property (nonatomic, readonly) Class objectClass; - -/// The name of the property. -@property (nonatomic, readonly) NSString *propertyName; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMProviderClient.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMProviderClient.h deleted file mode 100644 index ac649960a..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMProviderClient.h +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMApp; - -/// Base provider client interface. -RLM_SWIFT_SENDABLE -@interface RLMProviderClient : NSObject - -/// The app associated with this provider client. -@property (nonatomic, strong, readonly) RLMApp *app; - -/** - Initialize a provider client with a given app. - @param app The app for this provider client. - */ -- (instancetype)initWithApp:(RLMApp *)app; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMPushClient.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMPushClient.h deleted file mode 100644 index 0628c3ada..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMPushClient.h +++ /dev/null @@ -1,47 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMApp, RLMUser; - -/// A block type used to report an error -RLM_SWIFT_SENDABLE // invoked on a backgroun thread -typedef void(^RLMOptionalErrorBlock)(NSError * _Nullable); - -/// A client which can be used to register devices with the server to receive push notificatons -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMPushClient : NSObject - -/// The push notification service name the device will be registered with on the server -@property (nonatomic, readonly, nonnull) NSString *serviceName; - -/// Request to register device token to the server -- (void)registerDeviceWithToken:(NSString *)token - user:(RLMUser *)user - completion:(RLMOptionalErrorBlock)completion NS_SWIFT_NAME(registerDevice(token:user:completion:)); - -/// Request to deregister a device for a user -- (void)deregisterDeviceForUser:(RLMUser *)user - completion:(RLMOptionalErrorBlock)completion NS_SWIFT_NAME(deregisterDevice(user:completion:)); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMRealm+Sync.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMRealm+Sync.h deleted file mode 100644 index ff20e43c2..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMRealm+Sync.h +++ /dev/null @@ -1,38 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2017 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -@class RLMResults, RLMSyncSession; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -/// -@interface RLMRealm (Sync) - -/** - Get the RLMSyncSession used by this Realm. Will be nil if this is not a - synchronized Realm. -*/ -@property (nonatomic, nullable, readonly) RLMSyncSession *syncSession; - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMRealm.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMRealm.h deleted file mode 100644 index 0935e5301..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMRealm.h +++ /dev/null @@ -1,962 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMRealmConfiguration, RLMRealm, RLMObject, RLMSchema, RLMMigration, RLMNotificationToken, RLMThreadSafeReference, RLMAsyncOpenTask, RLMSyncSubscriptionSet; - -/** - A callback block for opening Realms asynchronously. - - Returns the Realm if the open was successful, or an error otherwise. - */ -typedef void(^RLMAsyncOpenRealmCallback)(RLMRealm * _Nullable realm, NSError * _Nullable error); - -/// The Id of the asynchronous transaction. -typedef unsigned RLMAsyncTransactionId; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - An `RLMRealm` instance (also referred to as "a Realm") represents a Realm - database. - - Realms can either be stored on disk (see `+[RLMRealm realmWithURL:]`) or in - memory (see `RLMRealmConfiguration`). - - `RLMRealm` instances are cached internally, and constructing equivalent `RLMRealm` - objects (for example, by using the same path or identifier) multiple times on a single thread - within a single iteration of the run loop will normally return the same - `RLMRealm` object. - - If you specifically want to ensure an `RLMRealm` instance is - destroyed (for example, if you wish to open a Realm, check some property, and - then possibly delete the Realm file and re-open it), place the code which uses - the Realm within an `@autoreleasepool {}` and ensure you have no other - strong references to it. - - @warning Non-frozen `RLMRealm` instances are thread-confined and cannot be - shared across threads or dispatch queues. Trying to do so will cause an - exception to be thrown. You must call this method on each thread you want to - interact with the Realm on. For dispatch queues, this means that you must call - it in each block which is dispatched, as a queue is not guaranteed to run all - of its blocks on the same thread. - */ - -@interface RLMRealm : NSObject - -#pragma mark - Creating & Initializing a Realm - -/** - Obtains an instance of the default Realm. - - The default Realm is used by the `RLMObject` class methods - which do not take an `RLMRealm` parameter, but is otherwise not special. The - default Realm is persisted as *default.realm* under the *Documents* directory of - your Application on iOS, in your application's *Application Support* - directory on macOS, and in the *Cache* directory on tvOS. - - The default Realm is created using the default `RLMRealmConfiguration`, which - can be changed via `+[RLMRealmConfiguration setDefaultConfiguration:]`. - - @return The default `RLMRealm` instance for the current thread. - */ -+ (instancetype)defaultRealm; - -/** - Obtains an instance of the default Realm bound to the given queue. - - Rather than being confined to the thread they are opened on, queue-bound - RLMRealms are confined to the given queue. They can be accessed from any - thread as long as it is from within a block dispatch to the queue, and - notifications will be delivered to the queue instead of a thread's run loop. - - Realms can only be confined to a serial queue. Queue-confined RLMRealm - instances can be obtained when not on that queue, but attempting to do - anything with that instance without first dispatching to the queue will throw - an incorrect thread exception. - - The default Realm is created using the default `RLMRealmConfiguration`, which - can be changed via `+[RLMRealmConfiguration setDefaultConfiguration:]`. - - @param queue A serial dispatch queue to confine the Realm to. - @return The default `RLMRealm` instance for the given queue. - */ -+ (instancetype)defaultRealmForQueue:(dispatch_queue_t)queue; - -/** - Obtains an `RLMRealm` instance with the given configuration. - - @param configuration A configuration object to use when creating the Realm. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return An `RLMRealm` instance. - */ -+ (nullable instancetype)realmWithConfiguration:(RLMRealmConfiguration *)configuration error:(NSError **)error; - -/** - Obtains an `RLMRealm` instance with the given configuration bound to the given queue. - - Rather than being confined to the thread they are opened on, queue-bound - RLMRealms are confined to the given queue. They can be accessed from any - thread as long as it is from within a block dispatch to the queue, and - notifications will be delivered to the queue instead of a thread's run loop. - - Realms can only be confined to a serial queue. Queue-confined RLMRealm - instances can be obtained when not on that queue, but attempting to do - anything with that instance without first dispatching to the queue will throw - an incorrect thread exception. - - @param configuration A configuration object to use when creating the Realm. - @param queue A serial dispatch queue to confine the Realm to. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return An `RLMRealm` instance. - */ -+ (nullable instancetype)realmWithConfiguration:(RLMRealmConfiguration *)configuration - queue:(nullable dispatch_queue_t)queue - error:(NSError **)error; - -/** - Obtains an `RLMRealm` instance persisted at a specified file URL. - - @param fileURL The local URL of the file the Realm should be saved at. - - @return An `RLMRealm` instance. - */ -+ (instancetype)realmWithURL:(NSURL *)fileURL; - -/** - Asynchronously open a Realm and deliver it to a block on the given queue. - - Opening a Realm asynchronously will perform all work needed to get the Realm to - a usable state (such as running potentially time-consuming migrations) on a - background thread before dispatching to the given queue. In addition, - synchronized Realms wait for all remote content available at the time the - operation began to be downloaded and available locally. - - The Realm passed to the callback function is confined to the callback queue as - if `-[RLMRealm realmWithConfiguration:queue:error]` was used. - - @param configuration A configuration object to use when opening the Realm. - @param callbackQueue The serial dispatch queue on which the callback should be run. - @param callback A callback block. If the Realm was successfully opened, - it will be passed in as an argument. - Otherwise, an `NSError` describing what went wrong will be - passed to the block instead. - */ -+ (RLMAsyncOpenTask *)asyncOpenWithConfiguration:(RLMRealmConfiguration *)configuration - callbackQueue:(dispatch_queue_t)callbackQueue - callback:(RLMAsyncOpenRealmCallback)callback; - -/** - The `RLMSchema` used by the Realm. - */ -@property (nonatomic, readonly) RLMSchema *schema; - -/** - Indicates if the Realm is currently engaged in a write transaction. - - @warning Do not simply check this property and then start a write transaction whenever an object needs to be - created, updated, or removed. Doing so might cause a large number of write transactions to be created, - degrading performance. Instead, always prefer performing multiple updates during a single transaction. - */ -@property (nonatomic, readonly) BOOL inWriteTransaction; - -/** - The `RLMRealmConfiguration` object that was used to create this `RLMRealm` instance. - */ -@property (nonatomic, readonly) RLMRealmConfiguration *configuration; - -/** - Indicates if this Realm contains any objects. - */ -@property (nonatomic, readonly) BOOL isEmpty; - -/** - Indicates if this Realm is frozen. - - @see `-[RLMRealm freeze]` - */ -@property (nonatomic, readonly, getter=isFrozen) BOOL frozen; - -/** - Returns a frozen (immutable) snapshot of this Realm. - - A frozen Realm is an immutable snapshot view of a particular version of a - Realm's data. Unlike normal RLMRealm instances, it does not live-update to - reflect writes made to the Realm, and can be accessed from any thread. Writing - to a frozen Realm is not allowed, and attempting to begin a write transaction - will throw an exception. - - All objects and collections read from a frozen Realm will also be frozen. - */ -- (RLMRealm *)freeze NS_RETURNS_RETAINED; - -/** - Returns a live reference of this Realm. - - All objects and collections read from the returned Realm will no longer be frozen. - This method will return `self` if it is not already frozen. - */ -- (RLMRealm *)thaw; - -#pragma mark - File Management - -/** - Writes a compacted and optionally encrypted copy of the Realm to the given local URL. - - The destination file cannot already exist. - - Note that if this method is called from within a write transaction, the - *current* data is written, not the data from the point when the previous write - transaction was committed. - - @param fileURL Local URL to save the Realm to. - @param key Optional 64-byte encryption key to encrypt the new file with. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return `YES` if the Realm was successfully written to disk, `NO` if an error occurred. - */ -- (BOOL)writeCopyToURL:(NSURL *)fileURL encryptionKey:(nullable NSData *)key error:(NSError **)error; - -/** - Writes a copy of the Realm to a given location specified by a given configuration. - - If the configuration supplied is derived from a `RLMUser` then this Realm will be copied with - sync functionality enabled. - - The destination file cannot already exist. - - @param configuration A Realm Configuration. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return `YES` if the Realm was successfully written to disk, `NO` if an error occurred. - */ -- (BOOL)writeCopyForConfiguration:(RLMRealmConfiguration *)configuration error:(NSError **)error; - -/** - Checks if the Realm file for the given configuration exists locally on disk. - - For non-synchronized, non-in-memory Realms, this is equivalent to - `-[NSFileManager.defaultManager fileExistsAtPath:config.path]`. For - synchronized Realms, it takes care of computing the actual path on disk based - on the server, virtual path, and user as is done when opening the Realm. - - @param config A Realm configuration to check the existence of. - @return YES if the Realm file for the given configuration exists on disk, NO otherwise. - */ -+ (BOOL)fileExistsForConfiguration:(RLMRealmConfiguration *)config; - -/** - Deletes the local Realm file and associated temporary files for the given configuration. - - This deletes the ".realm", ".note" and ".management" files which would be - created by opening the Realm with the given configuration. It does not delete - the ".lock" file (which contains no persisted data and is recreated from - scratch every time the Realm file is opened). - - The Realm must not be currently open on any thread or in another process. If - it is, this will return NO and report the error RLMErrorAlreadyOpen. Attempting to open - the Realm on another thread while the deletion is happening will block (and - then create a new Realm and open that afterwards). - - If the Realm already does not exist this will return `NO` and report the error NSFileNoSuchFileError; - - @param config A Realm configuration identifying the Realm to be deleted. - @return YES if any files were deleted, NO otherwise. - */ -+ (BOOL)deleteFilesForConfiguration:(RLMRealmConfiguration *)config error:(NSError **)error - __attribute__((swift_error(nonnull_error))); - -#pragma mark - Notifications - -/** - The type of a block to run whenever the data within the Realm is modified. - - @see `-[RLMRealm addNotificationBlock:]` - */ -typedef void (^RLMNotificationBlock)(RLMNotification notification, RLMRealm *realm); - -#pragma mark - Receiving Notification when a Realm Changes - -/** - Adds a notification handler for changes in this Realm, and returns a notification token. - - Notification handlers are called after each write transaction is committed, - either on the current thread or other threads. - - Handler blocks are called on the same thread that they were added on, and may - only be added on threads which are currently within a run loop. Unless you are - specifically creating and running a run loop on a background thread, this will - normally only be the main thread. - - The block has the following definition: - - typedef void(^RLMNotificationBlock)(RLMNotification notification, RLMRealm *realm); - - It receives the following parameters: - - - `NSString` \***notification**: The name of the incoming notification. See - `RLMRealmNotification` for information on what - notifications are sent. - - `RLMRealm` \***realm**: The Realm for which this notification occurred. - - @param block A block which is called to process Realm notifications. - - @return A token object which must be retained as long as you wish to continue - receiving change notifications. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMNotificationBlock)block __attribute__((warn_unused_result)); - -#pragma mark - Writing to a Realm - -/** - Begins a write transaction on the Realm. - - Only one write transaction can be open at a time for each Realm file. Write - transactions cannot be nested, and trying to begin a write transaction on a - Realm which is already in a write transaction will throw an exception. Calls to - `beginWriteTransaction` from `RLMRealm` instances for the same Realm file in - other threads or other processes will block until the current write transaction - completes or is cancelled. - - Before beginning the write transaction, `beginWriteTransaction` updates the - `RLMRealm` instance to the latest Realm version, as if `refresh` had been - called, and generates notifications if applicable. This has no effect if the - Realm was already up to date. - - It is rarely a good idea to have write transactions span multiple cycles of - the run loop, but if you do wish to do so you will need to ensure that the - Realm participating in the write transaction is kept alive until the write - transaction is committed. - */ -- (void)beginWriteTransaction; - -/** - Commits all write operations in the current write transaction, and ends the - transaction. - - After saving the changes, all notification blocks registered on this specific - `RLMRealm` instance are invoked synchronously. Notification blocks registered - on other threads or on collections are invoked asynchronously. If you do not - want to receive a specific notification for this write tranaction, see - `commitWriteTransactionWithoutNotifying:error:`. - - This method can fail if there is insufficient disk space available to save the - writes made, or due to unexpected i/o errors. This version of the method throws - an exception when errors occur. Use the version with a `NSError` out parameter - instead if you wish to handle errors. - - @warning This method may only be called during a write transaction. - */ -- (void)commitWriteTransaction NS_SWIFT_UNAVAILABLE(""); - -/** - Commits all write operations in the current write transaction, and ends the - transaction. - - After saving the changes, all notification blocks registered on this specific - `RLMRealm` instance are invoked synchronously. Notification blocks registered - on other threads or on collections are invoked asynchronously. If you do not - want to receive a specific notification for this write tranaction, see - `commitWriteTransactionWithoutNotifying:error:`. - - This method can fail if there is insufficient disk space available to save the - writes made, or due to unexpected i/o errors. - - @warning This method may only be called during a write transaction. - - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return Whether the transaction succeeded. - */ -- (BOOL)commitWriteTransaction:(NSError **)error; - -/** - Commits all write operations in the current write transaction, without - notifying specific notification blocks of the changes. - - After saving the changes, all notification blocks registered on this specific - `RLMRealm` instance are invoked synchronously. Notification blocks registered - on other threads or on collections are scheduled to be invoked asynchronously. - - You can skip notifiying specific notification blocks about the changes made - in this write transaction by passing in their associated notification tokens. - This is primarily useful when the write transaction is saving changes already - made in the UI and you do not want to have the notification block attempt to - re-apply the same changes. - - The tokens passed to this method must be for notifications for this specific - `RLMRealm` instance. Notifications for different threads cannot be skipped - using this method. - - This method can fail if there is insufficient disk space available to save the - writes made, or due to unexpected i/o errors. - - @warning This method may only be called during a write transaction. - - @param tokens An array of notification tokens which were returned from adding - callbacks which you do not want to be notified for the changes - made in this write transaction. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return Whether the transaction succeeded. - */ -- (BOOL)commitWriteTransactionWithoutNotifying:(NSArray *)tokens error:(NSError **)error; - -/** - Reverts all writes made during the current write transaction and ends the transaction. - - This rolls back all objects in the Realm to the state they were in at the - beginning of the write transaction, and then ends the transaction. - - This restores the data for deleted objects, but does not revive invalidated - object instances. Any `RLMObject`s which were added to the Realm will be - invalidated rather than becoming unmanaged. - Given the following code: - - ObjectType *oldObject = [[ObjectType objectsWhere:@"..."] firstObject]; - ObjectType *newObject = [[ObjectType alloc] init]; - - [realm beginWriteTransaction]; - [realm addObject:newObject]; - [realm deleteObject:oldObject]; - [realm cancelWriteTransaction]; - - Both `oldObject` and `newObject` will return `YES` for `isInvalidated`, - but re-running the query which provided `oldObject` will once again return - the valid object. - - KVO observers on any objects which were modified during the transaction will - be notified about the change back to their initial values, but no other - notifications are produced by a cancelled write transaction. - - @warning This method may only be called during a write transaction. - */ -- (void)cancelWriteTransaction; - -/** - Performs actions contained within the given block inside a write transaction. - - @see `[RLMRealm transactionWithoutNotifying:block:error:]` - */ -- (void)transactionWithBlock:(__attribute__((noescape)) void(^)(void))block NS_SWIFT_UNAVAILABLE(""); - -/** - Performs actions contained within the given block inside a write transaction. - - @see `[RLMRealm transactionWithoutNotifying:block:error:]` - */ -- (BOOL)transactionWithBlock:(__attribute__((noescape)) void(^)(void))block error:(NSError **)error; - -/** - Performs actions contained within the given block inside a write transaction. - - @see `[RLMRealm transactionWithoutNotifying:block:error:]` - */ -- (void)transactionWithoutNotifying:(NSArray *)tokens block:(__attribute__((noescape)) void(^)(void))block; - -/** - Performs actions contained within the given block inside a write transaction. - - Write transactions cannot be nested, and trying to execute a write transaction - on a Realm which is already participating in a write transaction will throw an - exception. Calls to `transactionWithBlock:` from `RLMRealm` instances in other - threads will block until the current write transaction completes. - - Before beginning the write transaction, `transactionWithBlock:` updates the - `RLMRealm` instance to the latest Realm version, as if `refresh` had been called, and - generates notifications if applicable. This has no effect if the Realm - was already up to date. - - You can skip notifiying specific notification blocks about the changes made - in this write transaction by passing in their associated notification tokens. - This is primarily useful when the write transaction is saving changes already - made in the UI and you do not want to have the notification block attempt to - re-apply the same changes. - - The tokens passed to this method must be for notifications for this specific - `RLMRealm` instance. Notifications for different threads cannot be skipped - using this method. - - @param tokens An array of notification tokens which were returned from adding - callbacks which you do not want to be notified for the changes - made in this write transaction. - @param block The block containing actions to perform. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return Whether the transaction succeeded. - */ -- (BOOL)transactionWithoutNotifying:(NSArray *)tokens block:(__attribute__((noescape)) void(^)(void))block error:(NSError **)error; - -/** - Indicates if the Realm is currently performing async write operations. - This becomes YES following a call to `beginAsyncWriteTransaction`, - `commitAsyncWriteTransaction`, or `asyncTransactionWithBlock:`, and remains so - until all scheduled async write work has completed. - - @warning If this is `YES`, closing or invalidating the Realm will block until scheduled work has completed. - */ -@property (nonatomic, readonly) BOOL isPerformingAsynchronousWriteOperations; - -/** - Begins an asynchronous write transaction. - This function asynchronously begins a write transaction on a background - thread, and then invokes the block on the original thread or queue once the - transaction has begun. Unlike `beginWriteTransaction`, this does not block the - calling thread if another thread is current inside a write transaction, and - will always return immediately. - Multiple calls to this function (or the other functions which perform - asynchronous write transactions) will queue the blocks to be called in the - same order as they were queued. This includes calls from inside a write - transaction block, which unlike with synchronous transactions are allowed. - - @param block The block containing actions to perform inside the write transaction. - `block` should end by calling `commitAsyncWriteTransaction`, - `commitWriteTransaction` or `cancelWriteTransaction`. - Returning without one of these calls is equivalent to calling `cancelWriteTransaction`. - - @return An id identifying the asynchronous transaction which can be passed to - `cancelAsyncTransaction:` prior to the block being called to cancel - the pending invocation of the block. - */ -- (RLMAsyncTransactionId)beginAsyncWriteTransaction:(void(^)(void))block; - -/** - Asynchronously commits a write transaction. - The call returns immediately allowing the caller to proceed while the I/O is - performed on a dedicated background thread. This can be used regardless of if - the write transaction was begun with `beginWriteTransaction` or - `beginAsyncWriteTransaction`. - - @param completionBlock A block which will be called on the source thread or - queue once the commit has either completed or failed - with an error. - - @param allowGrouping If `YES`, multiple sequential calls to - `commitAsyncWriteTransaction:` may be batched together - and persisted to stable storage in one group. This - improves write performance, particularly when the - individual transactions being batched are small. In the - event of a crash or power failure, either all of the - grouped transactions will be lost or none will, rather - than the usual guarantee that data has been persisted as - soon as a call to commit has returned. - - @return An id identifying the asynchronous transaction commit can be passed to - `cancelAsyncTransaction:` prior to the completion block being called - to cancel the pending invocation of the block. Note that this does - *not* cancel the commit itself. -*/ -- (RLMAsyncTransactionId)commitAsyncWriteTransaction:(nullable void(^)(NSError *_Nullable))completionBlock - allowGrouping:(BOOL)allowGrouping; - -/** - Asynchronously commits a write transaction. - The call returns immediately allowing the caller to proceed while the I/O is - performed on a dedicated background thread. This can be used regardless of if - the write transaction was begun with `beginWriteTransaction` or - `beginAsyncWriteTransaction`. - - @param completionBlock A block which will be called on the source thread or - queue once the commit has either completed or failed - with an error. - - @return An id identifying the asynchronous transaction commit can be passed to - `cancelAsyncTransaction:` prior to the completion block being called - to cancel the pending invocation of the block. Note that this does - *not* cancel the commit itself. -*/ -- (RLMAsyncTransactionId)commitAsyncWriteTransaction:(void(^)(NSError *_Nullable))completionBlock; - -/** - Asynchronously commits a write transaction. - The call returns immediately allowing the caller to proceed while the I/O is - performed on a dedicated background thread. This can be used regardless of if - the write transaction was begun with `beginWriteTransaction` or - `beginAsyncWriteTransaction`. - - @return An id identifying the asynchronous transaction commit can be passed to - `cancelAsyncTransaction:` prior to the completion block being called - to cancel the pending invocation of the block. Note that this does - *not* cancel the commit itself. -*/ -- (RLMAsyncTransactionId)commitAsyncWriteTransaction; - -/** - Cancels a queued block for an asynchronous transaction. - This can cancel a block passed to either an asynchronous begin or an - asynchronous commit. Canceling a begin cancels that transaction entirely, - while canceling a commit merely cancels the invocation of the completion - callback, and the commit will still happen. - Transactions can only be canceled before the block is invoked, and calling - `cancelAsyncTransaction:` from within the block is a no-op. - - @param asyncTransactionId A transaction id from either `beginAsyncWriteTransaction:` or `commitAsyncWriteTransaction:`. -*/ -- (void)cancelAsyncTransaction:(RLMAsyncTransactionId)asyncTransactionId; - -/** - Asynchronously performs actions contained within the given block inside a - write transaction. - The write transaction is begun asynchronously as if calling - `beginAsyncWriteTransaction:`, and by default the transaction is commited - asynchronously after the block completes. You can also explicitly call - `commitWriteTransaction` or `cancelWriteTransaction` from within the block to - synchronously commit or cancel the write transaction. - - @param block The block containing actions to perform. - - @param completionBlock A block which will be called on the source thread or - queue once the commit has either completed or failed - with an error. - - @return An id identifying the asynchronous transaction which can be passed to - `cancelAsyncTransaction:` prior to the block being called to cancel - the pending invocation of the block. -*/ -- (RLMAsyncTransactionId)asyncTransactionWithBlock:(void(^)(void))block onComplete:(nullable void(^)(NSError *))completionBlock; - -/** - Asynchronously performs actions contained within the given block inside a - write transaction. - The write transaction is begun asynchronously as if calling - `beginAsyncWriteTransaction:`, and by default the transaction is commited - asynchronously after the block completes. You can also explicitly call - `commitWriteTransaction` or `cancelWriteTransaction` from within the block to - synchronously commit or cancel the write transaction. - - @param block The block containing actions to perform. - - @return An id identifying the asynchronous transaction which can be passed to - `cancelAsyncTransaction:` prior to the block being called to cancel - the pending invocation of the block. -*/ -- (RLMAsyncTransactionId)asyncTransactionWithBlock:(void(^)(void))block; - -/** - Updates the Realm and outstanding objects managed by the Realm to point to the - most recent data. - - If the version of the Realm is actually changed, Realm and collection - notifications will be sent to reflect the changes. This may take some time, as - collection notifications are prepared on a background thread. As a result, - calling this method on the main thread is not advisable. - - @return Whether there were any updates for the Realm. Note that `YES` may be - returned even if no data actually changed. - */ -- (BOOL)refresh; - -/** - Set this property to `YES` to automatically update this Realm when changes - happen in other threads. - - If set to `YES` (the default), changes made on other threads will be reflected - in this Realm on the next cycle of the run loop after the changes are - committed. If set to `NO`, you must manually call `-refresh` on the Realm to - update it to get the latest data. - - Note that by default, background threads do not have an active run loop and you - will need to manually call `-refresh` in order to update to the latest version, - even if `autorefresh` is set to `YES`. - - Even with this property enabled, you can still call `-refresh` at any time to - update the Realm before the automatic refresh would occur. - - Write transactions will still always advance a Realm to the latest version and - produce local notifications on commit even if autorefresh is disabled. - - Disabling `autorefresh` on a Realm without any strong references to it will not - have any effect, and `autorefresh` will revert back to `YES` the next time the - Realm is created. This is normally irrelevant as it means that there is nothing - to refresh (as managed `RLMObject`s, `RLMArray`s, and `RLMResults` have strong - references to the Realm that manages them), but it means that setting - `RLMRealm.defaultRealm.autorefresh = NO` in - `application:didFinishLaunchingWithOptions:` and only later storing Realm - objects will not work. - - Defaults to `YES`. - */ -@property (nonatomic) BOOL autorefresh; - -/** - Invalidates all `RLMObject`s, `RLMResults`, `RLMLinkingObjects`, and `RLMArray`s managed by the Realm. - - A Realm holds a read lock on the version of the data accessed by it, so - that changes made to the Realm on different threads do not modify or delete the - data seen by this Realm. Calling this method releases the read lock, - allowing the space used on disk to be reused by later write transactions rather - than growing the file. This method should be called before performing long - blocking operations on a background thread on which you previously read data - from the Realm which you no longer need. - - All `RLMObject`, `RLMResults` and `RLMArray` instances obtained from this - `RLMRealm` instance on the current thread are invalidated. `RLMObject`s and `RLMArray`s - cannot be used. `RLMResults` will become empty. The Realm itself remains valid, - and a new read transaction is implicitly begun the next time data is read from the Realm. - - Calling this method multiple times in a row without reading any data from the - Realm, or before ever reading any data from the Realm, is a no-op. - */ -- (void)invalidate; - -#pragma mark - Accessing Objects - -/** - Returns the same object as the one referenced when the `RLMThreadSafeReference` was first created, - but resolved for the current Realm for this thread. Returns `nil` if this object was deleted after - the reference was created. - - @param reference The thread-safe reference to the thread-confined object to resolve in this Realm. - - @warning A `RLMThreadSafeReference` object must be resolved at most once. - Failing to resolve a `RLMThreadSafeReference` will result in the source version of the - Realm being pinned until the reference is deallocated. - An exception will be thrown if a reference is resolved more than once. - - @warning Cannot call within a write transaction. - - @note Will refresh this Realm if the source Realm was at a later version than this one. - - @see `+[RLMThreadSafeReference referenceWithThreadConfined:]` - */ -- (nullable id)resolveThreadSafeReference:(RLMThreadSafeReference *)reference -NS_REFINED_FOR_SWIFT; - -#pragma mark - Adding and Removing Objects from a Realm - -/** - Adds an object to the Realm. - - Once added, this object is considered to be managed by the Realm. It can be retrieved - using the `objectsWhere:` selectors on `RLMRealm` and on subclasses of `RLMObject`. - - When added, all child relationships referenced by this object will also be added to - the Realm if they are not already in it. - - If the object or any related objects are already being managed by a different Realm - an exception will be thrown. Use `-[RLMObject createInRealm:withObject:]` to insert a copy of a managed object - into a different Realm. - - The object to be added must be valid and cannot have been previously deleted - from a Realm (i.e. `isInvalidated` must be `NO`). - - @warning This method may only be called during a write transaction. - - @param object The object to be added to this Realm. - */ -- (void)addObject:(RLMObject *)object; - -/** - Adds all the objects in a collection to the Realm. - - This is the equivalent of calling `addObject:` for every object in a collection. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable collection such as `NSArray`, `RLMArray`, or `RLMResults`, - containing Realm objects to be added to the Realm. - - @see `addObject:` - */ -- (void)addObjects:(id)objects; - -/** - Adds or updates an existing object into the Realm. - - The object provided must have a designated primary key. If no objects exist in the Realm - with the same primary key value, the object is inserted. Otherwise, the existing object is - updated with any changed values. - - As with `addObject:`, the object cannot already be managed by a different - Realm. Use `-[RLMObject createOrUpdateInRealm:withValue:]` to copy values to - a different Realm. - - If there is a property or KVC value on `object` whose value is nil, and it corresponds - to a nullable property on an existing object being updated, that nullable property will - be set to nil. - - @warning This method may only be called during a write transaction. - - @param object The object to be added or updated. - */ -- (void)addOrUpdateObject:(RLMObject *)object; - -/** - Adds or updates all the objects in a collection into the Realm. - - This is the equivalent of calling `addOrUpdateObject:` for every object in a collection. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable collection such as `NSArray`, `RLMArray`, or `RLMResults`, - containing Realm objects to be added to or updated within the Realm. - - @see `addOrUpdateObject:` - */ -- (void)addOrUpdateObjects:(id)objects; - -/** - Deletes an object from the Realm. Once the object is deleted it is considered invalidated. - - @warning This method may only be called during a write transaction. - - @param object The object to be deleted. - */ -- (void)deleteObject:(RLMObject *)object; - -/** - Deletes one or more objects from the Realm. - - This is the equivalent of calling `deleteObject:` for every object in a collection. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable collection such as `NSArray`, `RLMArray`, or `RLMResults`, - containing objects to be deleted from the Realm. - - @see `deleteObject:` - */ -- (void)deleteObjects:(id)objects; - -/** - Deletes all objects from the Realm. - - @warning This method may only be called during a write transaction. - - @see `deleteObject:` - */ -- (void)deleteAllObjects; - -#pragma mark - Sync Subscriptions - -/** - Represents the active subscriptions for this realm, which can be used to add/remove/update - and search flexible sync subscriptions. - Getting the subscriptions from a local or partition-based configured realm will thrown an exception. - - @warning This feature is currently in beta and its API is subject to change. - */ -@property (nonatomic, readonly, nonnull) RLMSyncSubscriptionSet *subscriptions; - - -#pragma mark - Migrations - -/** - The type of a migration block used to migrate a Realm. - - @param migration A `RLMMigration` object used to perform the migration. The - migration object allows you to enumerate and alter any - existing objects which require migration. - - @param oldSchemaVersion The schema version of the Realm being migrated. - */ -RLM_SWIFT_SENDABLE -typedef void (^RLMMigrationBlock)(RLMMigration *migration, uint64_t oldSchemaVersion); - -/** - Returns the schema version for a Realm at a given local URL. - - @param fileURL Local URL to a Realm file. - @param key 64-byte key used to encrypt the file, or `nil` if it is unencrypted. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return The version of the Realm at `fileURL`, or `RLMNotVersioned` if the version cannot be read. - */ -+ (uint64_t)schemaVersionAtURL:(NSURL *)fileURL encryptionKey:(nullable NSData *)key - error:(NSError **)error -NS_REFINED_FOR_SWIFT; - -/** - Performs the given Realm configuration's migration block on a Realm at the given path. - - This method is called automatically when opening a Realm for the first time and does - not need to be called explicitly. You can choose to call this method to control - exactly when and how migrations are performed. - - @param configuration The Realm configuration used to open and migrate the Realm. - @return The error that occurred while applying the migration, if any. - - @see RLMMigration - */ -+ (BOOL)performMigrationForConfiguration:(RLMRealmConfiguration *)configuration error:(NSError **)error; - -#pragma mark - Unavailable Methods - -/** - RLMRealm instances are cached internally by Realm and cannot be created directly. - - Use `+[RLMRealm defaultRealm]`, `+[RLMRealm realmWithConfiguration:error:]` or - `+[RLMRealm realmWithURL]` to obtain a reference to an RLMRealm. - */ -- (instancetype)init __attribute__((unavailable("Use +defaultRealm, +realmWithConfiguration: or +realmWithURL:."))); - -/** - RLMRealm instances are cached internally by Realm and cannot be created directly. - - Use `+[RLMRealm defaultRealm]`, `+[RLMRealm realmWithConfiguration:error:]` or - `+[RLMRealm realmWithURL]` to obtain a reference to an RLMRealm. - */ -+ (instancetype)new __attribute__((unavailable("Use +defaultRealm, +realmWithConfiguration: or +realmWithURL:."))); - -/// :nodoc: -- (void)addOrUpdateObjectsFromArray:(id)array __attribute__((unavailable("Renamed to -addOrUpdateObjects:."))); - -@end - -// MARK: - RLMNotificationToken - -/** - A token which is returned from methods which subscribe to changes to a Realm. - - Change subscriptions in Realm return an `RLMNotificationToken` instance, - which can be used to unsubscribe from the changes. You must store a strong - reference to the token for as long as you want to continue to receive notifications. - When you wish to stop, call the `-invalidate` method. Notifications are also stopped if - the token is deallocated. - */ -RLM_SWIFT_SENDABLE // is internally thread-safe -@interface RLMNotificationToken : NSObject -/// Stops notifications for the change subscription that returned this token. -/// -/// @return True if the token was previously valid, and false if it was already invalidated. -- (bool)invalidate; - -/// Stops notifications for the change subscription that returned this token. -- (void)stop __attribute__((unavailable("Renamed to -invalidate."))) NS_REFINED_FOR_SWIFT; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMRealmConfiguration.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMRealmConfiguration.h deleted file mode 100644 index d09e5c215..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMRealmConfiguration.h +++ /dev/null @@ -1,197 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2015 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMEventConfiguration, RLMSyncConfiguration; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A block called when opening a Realm for the first time during the life - of a process to determine if it should be compacted before being returned - to the user. It is passed the total file size (data + free space) and the total - bytes used by data in the file. - - Return `YES` to indicate that an attempt to compact the file should be made. - The compaction will be skipped if another process is accessing it. - */ -RLM_SWIFT_SENDABLE -typedef BOOL (^RLMShouldCompactOnLaunchBlock)(NSUInteger totalBytes, NSUInteger bytesUsed); - -/** - A block which receives a subscription set instance, that can be used to add an initial set of subscriptions which will be executed - when the Realm is first opened. - */ -RLM_SWIFT_SENDABLE -typedef void(^RLMFlexibleSyncInitialSubscriptionsBlock)(RLMSyncSubscriptionSet * _Nonnull subscriptions); - -/** - An `RLMRealmConfiguration` instance describes the different options used to - create an instance of a Realm. - - `RLMRealmConfiguration` instances are just plain `NSObject`s. Unlike `RLMRealm`s - and `RLMObject`s, they can be freely shared between threads as long as you do not - mutate them. - - Creating configuration objects for class subsets (by setting the - `objectClasses` property) can be expensive. Because of this, you will normally want to - cache and reuse a single configuration object for each distinct configuration rather than - creating a new object each time you open a Realm. - */ -@interface RLMRealmConfiguration : NSObject - -#pragma mark - Default Configuration - -/** - Returns the default configuration used to create Realms when no other - configuration is explicitly specified (i.e. `+[RLMRealm defaultRealm]`). - - @return The default Realm configuration. - */ -+ (instancetype)defaultConfiguration; - -/** - Sets the default configuration to the given `RLMRealmConfiguration`. - - @param configuration The new default Realm configuration. - */ -+ (void)setDefaultConfiguration:(RLMRealmConfiguration *)configuration; - -#pragma mark - Properties - -/// The local URL of the Realm file. Mutually exclusive with `inMemoryIdentifier`; -/// setting one of the two properties will automatically nil out the other. -@property (nonatomic, copy, nullable) NSURL *fileURL; - -/// A string used to identify a particular in-memory Realm. Mutually exclusive with `fileURL`, -/// `seedFilePath`and `syncConfiguration`; -/// setting any one of the three properties will automatically nil out the other two. -@property (nonatomic, copy, nullable) NSString *inMemoryIdentifier; - -/// A 64-byte key to use to encrypt the data, or `nil` if encryption is not enabled. -@property (nonatomic, copy, nullable) NSData *encryptionKey; - -/// Whether to open the Realm in read-only mode. -/// -/// For non-synchronized Realms, this is required to be able to open Realm -/// files which are not writeable or are in a directory which is not writeable. -/// This should only be used on files which will not be modified by anyone -/// while they are open, and not just to get a read-only view of a file which -/// may be written to by another thread or process. Opening in read-only mode -/// requires disabling Realm's reader/writer coordination, so committing a -/// write transaction from another process will result in crashes. -/// -/// Syncronized Realms must always be writeable (as otherwise no -/// synchronization could happen), and this instead merely disallows performing -/// write transactions on the Realm. In addition, it will skip some automatic -/// writes made to the Realm, such as to initialize the Realm's schema. Setting -/// `readOnly = YES` is not strictly required for Realms which the sync user -/// does not have write access to, but is highly recommended as it will improve -/// error reporting and catch some errors earlier. -/// -/// Realms using query-based sync cannot be opened in read-only mode. -@property (nonatomic) BOOL readOnly; - -/// The current schema version. -@property (nonatomic) uint64_t schemaVersion; - -/// The block which migrates the Realm to the current version. -@property (nonatomic, copy, nullable) RLMMigrationBlock migrationBlock; - -/** - Whether to recreate the Realm file with the provided schema if a migration is required. - This is the case when the stored schema differs from the provided schema or - the stored schema version differs from the version on this configuration. - Setting this property to `YES` deletes the file if a migration would otherwise be required or executed. - - @note Setting this property to `YES` doesn't disable file format migrations. - */ -@property (nonatomic) BOOL deleteRealmIfMigrationNeeded; - -/** - A block called when opening a Realm for the first time during the life - of a process to determine if it should be compacted before being returned - to the user. It is passed the total file size (data + free space) and the total - bytes used by data in the file. - - Return `YES` to indicate that an attempt to compact the file should be made. - The compaction will be skipped if another process is accessing it. - */ -@property (nonatomic, copy, nullable) RLMShouldCompactOnLaunchBlock shouldCompactOnLaunch; - -/// The classes managed by the Realm. -@property (nonatomic, copy, nullable) NSArray *objectClasses; - -/** - The maximum number of live versions in the Realm file before an exception will - be thrown when attempting to start a write transaction. - - Realm provides MVCC snapshot isolation, meaning that writes on one thread do - not overwrite data being read on another thread, and instead write a new copy - of that data. When a Realm refreshes it updates to the latest version of the - data and releases the old versions, allowing them to be overwritten by - subsequent write transactions. - - Under normal circumstances this is not a problem, but if the number of active - versions grow too large, it will have a negative effect on the filesize on - disk. This can happen when performing writes on many different threads at - once, when holding on to frozen objects for an extended time, or when - performing long operations on background threads which do not allow the Realm - to refresh. - - Setting this property to a non-zero value makes it so that exceeding the set - number of versions will instead throw an exception. This can be used with a - low value during development to help identify places that may be problematic, - or in production use to cause the app to crash rather than produce a Realm - file which is too large to be opened. - - */ -@property (nonatomic) NSUInteger maximumNumberOfActiveVersions; - -/** - When opening the Realm for the first time, instead of creating an empty file, - the Realm file will be copied from the provided seed file path and used instead. - This can be used to open a Realm file with pre-populated data. - - If a realm file already exists at the configuration's destination path, the seed file - will not be copied and the already existing realm will be opened instead. - - Note that to use this parameter with a synced Realm configuration - the seed Realm must be appropriately copied to a destination with - `[RLMRealm writeCopyForConfiguration:]` first. - - This option is mutually exclusive with `inMemoryIdentifier`. Setting a `seedFilePath` - will nil out the `inMemoryIdentifier`. - */ -@property (nonatomic, copy, nullable) NSURL *seedFilePath; - -/** - A configuration object representing configuration state for Realms intended - to sync with Atlas Device Sync. - - This property is mutually exclusive with both `inMemoryIdentifier` and `fileURL`; - setting any one of the three properties will automatically nil out the other two. - - @see `RLMSyncConfiguration` - */ -@property (nullable, nonatomic) RLMSyncConfiguration *syncConfiguration; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMRealm_Dynamic.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMRealm_Dynamic.h deleted file mode 100644 index bea162775..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMRealm_Dynamic.h +++ /dev/null @@ -1,118 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import -#import - -@class RLMResults; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMRealm (Dynamic) - -#pragma mark - Getting Objects from a Realm - -/** - Returns all objects of a given type from the Realm. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. The preferred way to get objects of a single class is to use the class - methods on `RLMObject`. - - @param className The name of the `RLMObject` subclass to retrieve on (e.g. `MyClass.className`). - - @return An `RLMResults` containing all objects in the Realm of the given type. - - @see `+[RLMObject allObjects]` - */ -- (RLMResults *)allObjects:(NSString *)className; - -/** - Returns all objects matching the given predicate from the Realm. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. The preferred way to get objects of a single class is to use the class - methods on `RLMObject`. - - @param className The type of objects you are looking for (name of the class). - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` containing results matching the given predicate. - - @see `+[RLMObject objectsWhere:]` - */ -- (RLMResults *)objects:(NSString *)className where:(NSString *)predicateFormat, ...; - -/** - Returns all objects matching the given predicate from the Realm. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. The preferred way to get objects of a single class is to use the class - methods on `RLMObject`. - - @param className The type of objects you are looking for (name of the class). - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` containing results matching the given predicate. - - @see `+[RLMObject objectsWhere:]` - */ -- (RLMResults *)objects:(NSString *)className withPredicate:(NSPredicate *)predicate; - -/** - Returns the object of the given type with the given primary key from the Realm. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. The preferred way to get an object of a single class is to use the class - methods on `RLMObject`. - - @param className The class name for the object you are looking for. - @param primaryKey The primary key value for the object you are looking for. - - @return An object, or `nil` if an object with the given primary key does not exist. - - @see `+[RLMObject objectForPrimaryKey:]` - */ -- (nullable RLMObject *)objectWithClassName:(NSString *)className forPrimaryKey:(id)primaryKey; - -/** - Creates an `RLMObject` instance of type `className` in the Realm, and populates it using a given object. - - The `value` argument is used to populate the object. It can be a key-value coding compliant object, an array or - dictionary returned from the methods in `NSJSONSerialization`, or an array containing one element for each managed - property. An exception will be thrown if any required properties are not present and those properties were not defined - with default values. - - When passing in an array as the `value` argument, all properties must be present, valid and in the same order as the - properties defined in the model. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is recommended to - use `[RLMObject createInDefaultRealmWithValue:]`. - - @param value The value used to populate the object. - - @return An `RLMObject` instance of type `className`. - */ --(RLMObject *)createObject:(NSString *)className withValue:(id)value; - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMResults.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMResults.h deleted file mode 100644 index 5911e666a..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMResults.h +++ /dev/null @@ -1,567 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObject; - -/** - `RLMResults` is an auto-updating container type in Realm returned from object - queries. It represents the results of the query in the form of a collection of objects. - - `RLMResults` can be queried using the same predicates as `RLMObject` and `RLMArray`, - and you can chain queries to further filter results. - - `RLMResults` always reflect the current state of the Realm on the current thread, - including during write transactions on the current thread. The one exception to - this is when using `for...in` fast enumeration, which will always enumerate - over the objects which matched the query when the enumeration is begun, even if - some of them are deleted or modified to be excluded by the filter during the - enumeration. - - `RLMResults` are lazily evaluated the first time they are accessed; they only - run queries when the result of the query is requested. This means that - chaining several temporary `RLMResults` to sort and filter your data does not - perform any extra work processing the intermediate state. - - Once the results have been evaluated or a notification block has been added, - the results are eagerly kept up-to-date, with the work done to keep them - up-to-date done on a background thread whenever possible. - - `RLMResults` cannot be directly instantiated. - */ -@interface RLMResults : NSObject - -#pragma mark - Properties - -/** - The number of objects in the results collection. - */ -@property (nonatomic, readonly, assign) NSUInteger count; - -/** - The type of the objects in the results collection. - */ -@property (nonatomic, readonly, assign) RLMPropertyType type; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readwrite, getter = isOptional) BOOL optional; - -/** - The class name of the objects contained in the results collection. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages this results collection. - */ -@property (nonatomic, readonly) RLMRealm *realm; - -/** - Indicates if the results collection is no longer valid. - - The results collection becomes invalid if `invalidate` is called on the containing `realm`. - An invalidated results collection can be accessed, but will always be empty. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -#pragma mark - Accessing Objects from an RLMResults - -/** - Returns the object at the index specified. - - @param index The index to look up. - - @return An object of the type contained in the results collection. - */ -- (RLMObjectType)objectAtIndex:(NSUInteger)index; - -/** - Returns an array containing the objects in the results at the indexes specified by a given index set. - `nil` will be returned if the index set contains an index out of the arrays bounds. - - @param indexes The indexes in the results to retrieve objects from. - - @return The objects at the specified indexes. - */ -- (nullable NSArray *)objectsAtIndexes:(NSIndexSet *)indexes; - -/** - Returns the first object in the results collection. - - Returns `nil` if called on an empty results collection. - - @return An object of the type contained in the results collection. - */ -- (nullable RLMObjectType)firstObject; - -/** - Returns the last object in the results collection. - - Returns `nil` if called on an empty results collection. - - @return An object of the type contained in the results collection. - */ -- (nullable RLMObjectType)lastObject; - -#pragma mark - Querying Results - -/** - Returns the index of an object in the results collection. - - Returns `NSNotFound` if the object is not found in the results collection. - - @param object An object (of the same type as returned from the `objectClassName` selector). - */ -- (NSUInteger)indexOfObject:(RLMObjectType)object; - -/** - Returns the index of the first object in the results collection matching the predicate. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return The index of the object, or `NSNotFound` if the object is not found in the results collection. - */ -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns the index of the first object in the results collection matching the predicate. - - @param predicate The predicate with which to filter the objects. - - @return The index of the object, or `NSNotFound` if the object is not found in the results collection. - */ -- (NSUInteger)indexOfObjectWithPredicate:(NSPredicate *)predicate; - -/** - Returns all the objects matching the given predicate in the results collection. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` of objects that match the given predicate. - */ -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all the objects matching the given predicate in the results collection. - - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` of objects that match the given predicate. - */ -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/** - Returns a sorted `RLMResults` from an existing results collection. - - @param keyPath The key path to sort by. - @param ascending The direction to sort in. - - @return An `RLMResults` sorted by the specified key path. - */ -- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a sorted `RLMResults` from an existing results collection. - - @param properties An array of `RLMSortDescriptor`s to sort by. - - @return An `RLMResults` sorted by the specified properties. - */ -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/** - Returns a distinct `RLMResults` from an existing results collection. - - @param keyPaths The key paths used produce distinct results - - @return An `RLMResults` made distinct based on the specified key paths - */ -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -#pragma mark - Notifications - -/** - Registers a block to be called each time the results collection changes. - - The block will be asynchronously called with the initial results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the results collection were added, removed or modified. If a - write transaction did not modify any objects in the results collection, - the block is not called at all. See the `RLMCollectionChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - At the time when the block is called, the `RLMResults` object will be fully - evaluated and up-to-date, and as long as you do not perform a write transaction - on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will - never perform blocking work. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - NSLog(@"dogs.count: %zu", dogs.count); // => 0 - self.token = [results addNotificationBlock:^(RLMResults *dogs, - RLMCollectionChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - - @param block The block to be called whenever a change occurs. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the results collection changes. - - The block will be asynchronously called with the initial results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the results collection were added, removed or modified. If a - write transaction did not modify any objects in the results collection, - the block is not called at all. See the `RLMCollectionChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - At the time when the block is called, the `RLMResults` object will be fully - evaluated and up-to-date, and as long as you do not perform a write transaction - on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will - never perform blocking work. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the results collection changes. - - The block will be asynchronously called with the initial results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the results collection were added, removed or modified. If a - write transaction did not modify any objects in the results collection, - the block is not called at all. See the `RLMCollectionChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - At the time when the block is called, the `RLMResults` object will be fully - evaluated and up-to-date, and as long as you do not perform a write transaction - on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will - never perform blocking work. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the results collection changes. - - The block will be asynchronously called with the initial results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the results collection were added, removed or modified. If a - write transaction did not modify any objects in the results collection, - the block is not called at all. See the `RLMCollectionChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - At the time when the block is called, the `RLMResults` object will be fully - evaluated and up-to-date, and as long as you do not perform a write transaction - on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will - never perform blocking work. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths -__attribute__((warn_unused_result)); -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the objects - represented by the results collection. - - NSNumber *min = [results minOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose minimum value is desired. Only properties of types `int`, `float`, `double`, and - `NSDate` are supported. - - @return The minimum value of the property, or `nil` if the Results are empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects represented by the results collection. - - NSNumber *max = [results maxOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose maximum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The maximum value of the property, or `nil` if the Results are empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of the values of a given property over all the objects represented by the results collection. - - NSNumber *sum = [results sumOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose values should be summed. Only properties of - types `int`, `float`, and `double` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects represented by the results collection. - - NSNumber *average = [results averageOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose average value should be calculated. Only - properties of types `int`, `float`, and `double` are supported. - - @return The average value of the given property, or `nil` if the Results are empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -/// :nodoc: -- (RLMObjectType)objectAtIndexedSubscript:(NSUInteger)index; - -#pragma mark - Sectioned Results - -/** - Sorts and sections this collection from a given property key path, returning the result - as an instance of `RLMSectionedResults`. - - @param keyPath The property key path to sort on. - @param ascending The direction to sort in. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsSortedUsingKeyPath:(NSString *)keyPath - ascending:(BOOL)ascending - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -/** - Sorts and sections this collection from a given array of sort descriptors, returning the result - as an instance of `RLMSectionedResults`. - - @param sortDescriptors An array of `RLMSortDescriptor`s to sort by. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @note The primary sort descriptor must be responsible for determining the section key. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsUsingSortDescriptors:(NSArray *)sortDescriptors - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -#pragma mark - Freeze - -/** - Indicates if the result are frozen. - - Frozen Results are immutable and can be accessed from any thread.The objects - read from a frozen Results will also be frozen. - */ -@property (nonatomic, readonly, getter=isFrozen) BOOL frozen; - -/** - Returns a frozen (immutable) snapshot of these results. - - The frozen copy is an immutable collection which contains the same data as - this collection currently contains, but will not update when writes are made - to the containing Realm. Unlike live Results, frozen Results can be accessed - from any thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning Holding onto a frozen collection for an extended period while - performing write transaction on the Realm may result in the Realm - file growing to large sizes. See - `RLMRealmConfiguration.maximumNumberOfActiveVersions` for more - information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -#pragma mark - Unavailable Methods - -/** - `-[RLMResults init]` is not available because `RLMResults` cannot be created directly. - `RLMResults` can be obtained by querying a Realm. - */ -- (instancetype)init __attribute__((unavailable("RLMResults cannot be created directly"))); - -/** - `+[RLMResults new]` is not available because `RLMResults` cannot be created directly. - `RLMResults` can be obtained by querying a Realm. - */ -+ (instancetype)new __attribute__((unavailable("RLMResults cannot be created directly"))); - -@end - -/** - `RLMLinkingObjects` is an auto-updating container type. It represents a collection of objects that link to its - parent object. - - For more information, please see the "Inverse Relationships" section in the - [documentation](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/relationships/#relationships). - */ -@interface RLMLinkingObjects : RLMResults -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMSchema.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMSchema.h deleted file mode 100644 index fe46f6d47..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMSchema.h +++ /dev/null @@ -1,78 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectSchema; - -/** - `RLMSchema` instances represent collections of model object schemas managed by a Realm. - - When using Realm, `RLMSchema` instances allow performing migrations and - introspecting the database's schema. - - Schemas map to collections of tables in the core database. - */ -RLM_SWIFT_SENDABLE // not actually immutable, but the public API kinda is -@interface RLMSchema : NSObject - -#pragma mark - Properties - -/** - An `NSArray` containing `RLMObjectSchema`s for all object types in the Realm. - - This property is intended to be used during migrations for dynamic introspection. - - @see `RLMObjectSchema` - */ -@property (nonatomic, readonly, copy) NSArray *objectSchema; - -#pragma mark - Methods - -/** - Returns an `RLMObjectSchema` for the given class name in the schema. - - @param className The object class name. - @return An `RLMObjectSchema` for the given class in the schema. - - @see `RLMObjectSchema` - */ -- (nullable RLMObjectSchema *)schemaForClassName:(NSString *)className; - -/** - Looks up and returns an `RLMObjectSchema` for the given class name in the Realm. - - If there is no object of type `className` in the schema, an exception will be thrown. - - @param className The object class name. - @return An `RLMObjectSchema` for the given class in this Realm. - - @see `RLMObjectSchema` - */ -- (RLMObjectSchema *)objectForKeyedSubscript:(NSString *)className; - -/** - Returns whether two `RLMSchema` instances are equivalent. - */ -- (BOOL)isEqualToSchema:(RLMSchema *)schema; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMSectionedResults.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMSectionedResults.h deleted file mode 100644 index 4ee236b94..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMSectionedResults.h +++ /dev/null @@ -1,921 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2022 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@protocol RLMValue; -@class RLMResults; - -/** - A `RLMSectionedResultsChange` object encapsulates information about changes to sectioned - results that are reported by Realm notifications. - - `RLMSectionedResultsChange` is passed to the notification blocks registered with - `-addNotificationBlock` on `RLMSectionedResults`, and reports what sections and rows in the - collection changed since the last time the notification block was called. - - A complete example of updating a `UITableView` named `tv`: - - [tv beginUpdates]; - [tv deleteRowsAtIndexPaths:changes.deletions withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv insertRowsAtIndexPaths:changes.insertions withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv reloadRowsAtIndexPaths:changes.modifications withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv insertSections:changes.sectionsToInsert withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv deleteSections:changes.sectionsToRemove withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv endUpdates]; - - All of the arrays in an `RLMSectionedResultsChange` are always sorted in ascending order. - */ -@interface RLMSectionedResultsChange : NSObject -/// The index paths of objects in the previous version of the collection which have -/// been removed from this one. -@property (nonatomic, readonly) NSArray *deletions; -/// The index paths in the new version of the collection which were newly inserted. -@property (nonatomic, readonly) NSArray *insertions; -/// The index paths in the old version of the collection which were modified. -@property (nonatomic, readonly) NSArray *modifications; -/// The indices of the sections to be inserted. -@property (nonatomic, readonly) NSIndexSet *sectionsToInsert; -/// The indices of the sections to be removed. -@property (nonatomic, readonly) NSIndexSet *sectionsToRemove; -/// Returns the index paths of the deletion indices in the given section. -- (NSArray *)deletionsInSection:(NSUInteger)section; -/// Returns the index paths of the insertion indices in the given section. -- (NSArray *)insertionsInSection:(NSUInteger)section; -/// Returns the index paths of the modification indices in the given section. -- (NSArray *)modificationsInSection:(NSUInteger)section; -@end - - -/// The `RLMSectionedResult` protocol defines properties and methods common to both `RLMSectionedResults and RLMSection` -@protocol RLMSectionedResult - -#pragma mark - Object Access - -/// The count of objects in the collection. -@property (nonatomic, readonly) NSUInteger count; -/// Returns the object for a given index in the collection. -- (id)objectAtIndexedSubscript:(NSUInteger)index; -/// Returns the object for a given index in the collection. -- (id)objectAtIndex:(NSUInteger)index; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this collection. - - The frozen copy is an immutable collection which contains the same data as this - collection currently contains, but will not update when writes are made to the - containing Realm. Unlike live arrays, frozen collections can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning Holding onto a frozen collection for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; -/** - Indicates if the underlying collection is frozen. - - Frozen collections are immutable and can be accessed from any thread. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Sectioned Results Notifications - -/** - Registers a block to be called each time the collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` / `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(id, RLMSectionedResultsChange *))block __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` / `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(id, RLMSectionedResultsChange *))block - queue:(dispatch_queue_t)queue __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` / `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(id, RLMSectionedResultsChange *))block - keyPaths:(NSArray *)keyPaths __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` / `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(id, RLMSectionedResultsChange *))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue __attribute__((warn_unused_result)); - -@end - -/// An RLMSection contains the objects which belong to a specified section key. -@interface RLMSection, RLMObjectType> : NSObject -/// The value that represents the key in this section. -@property (nonatomic, readonly) RLMKeyType key; -/// The count of objects in the section. -@property (nonatomic, readonly) NSUInteger count; -/// Returns the object for a given index in the section. -- (RLMObjectType)objectAtIndexedSubscript:(NSUInteger)index; -/// Returns the object for a given index in the section. -- (RLMObjectType)objectAtIndex:(NSUInteger)index; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this section. - - The frozen copy is an immutable section which contains the same data as this - section currently contains, but will not update when writes are made to the - containing Realm. Unlike live arrays, frozen collections can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning Holding onto a frozen section for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; -/** - Returns a live version of this frozen section. - - This method resolves a reference to a live copy of the same frozen section. - If called on a live section, will return itself. -*/ -- (instancetype)thaw; -/** - Indicates if the underlying section is frozen. - - Frozen sections are immutable and can be accessed from any thread. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Section Notifications - -/** - Registers a block to be called each time the section changes. - - The block will be asynchronously called with the initial section, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - RLMSection *section = sectionedResults[0] // section with dogs aged '5' already exists. - - self.token = [section addNotificationBlock:^(RLMSection *section, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"section.count: %zu", section.count); // => 2 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSection *, RLMSectionedResultsChange *))block __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the section changes. - - The block will be asynchronously called with the initial section, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - RLMSection *section = sectionedResults[0] // section with dogs aged '5' already exists. - - self.token = [section addNotificationBlock:^(RLMSection *section, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"section.count: %zu", section.count); // => 2 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSection *, RLMSectionedResultsChange *))block - queue:(dispatch_queue_t)queue __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the section changes. - - The block will be asynchronously called with the initial section, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - RLMSection *section = sectionedResults[0] // section with dogs aged '5' already exists. - - self.token = [section addNotificationBlock:^(RLMSection *section, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"section.count: %zu", section.count); // => 2 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSection *, RLMSectionedResultsChange *))block - keyPaths:(NSArray *)keyPaths __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the section changes. - - The block will be asynchronously called with the initial section, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - RLMSection *section = sectionedResults[0] // section with dogs aged '5' already exists. - - self.token = [section addNotificationBlock:^(RLMSection *section, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"section.count: %zu", section.count); // => 2 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSection *, RLMSectionedResultsChange *))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue __attribute__((warn_unused_result)); -@end - -/// A lazily evaluated collection that holds elements in sections determined by a section key. -@interface RLMSectionedResults, RLMObjectType: id> : NSObject -/// An array of all keys in the sectioned results collection. -@property (nonatomic) NSArray *allKeys; -/// The total amount of sections in this collection. -@property (nonatomic, readonly, assign) NSUInteger count; -/// Returns the section at a given index. -- (RLMSection *)objectAtIndexedSubscript:(NSUInteger)index; -/// Returns the section at a given index. -- (RLMSection *)objectAtIndex:(NSUInteger)index; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this sectioned results collection. - - The frozen copy is an immutable sectioned results collection which contains the same data as this - sectioned results collection currently contains, but will not update when writes are made to the - containing Realm. Unlike live sectioned results collections, frozen sectioned results collection - can be accessed from any thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning Holding onto a frozen sectioned results collection for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; -/** - Returns a live version of this frozen sectioned results collection. - - This method resolves a reference to a live copy of the same frozen sectioned results collection. - If called on a live section, will return itself. -*/ -- (instancetype)thaw; -/** - Indicates if the underlying sectioned results collection is frozen. - - Frozen sectioned results collections are immutable and can be accessed from any thread. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Sectioned Results Notifications - -/** - Registers a block to be called each time the sectioned results collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSectionedResults *, RLMSectionedResultsChange *))block __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the sectioned results collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSectionedResults *, RLMSectionedResultsChange *))block - queue:(dispatch_queue_t)queue __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the sectioned results collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSectionedResults *, RLMSectionedResultsChange *))block - keyPaths:(NSArray *)keyPaths __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the sectioned results collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSectionedResults *, RLMSectionedResultsChange *))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue __attribute__((warn_unused_result)); -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMSet.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMSet.h deleted file mode 100644 index fead2e005..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMSet.h +++ /dev/null @@ -1,535 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObject, RLMResults; - -/** - A collection datatype used for storing distinct objects. - - - Note: - `RLMSet` supports storing primitive and `RLMObject` types. `RLMSet` does not support storing - Embedded Realm Objects. - */ -@interface RLMSet : NSObject - -#pragma mark - Properties - -/** - The number of objects in the set. - */ -@property (nonatomic, readonly, assign) NSUInteger count; - -/** - The type of the objects in the set. - */ -@property (nonatomic, readonly, assign) RLMPropertyType type; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readonly, getter = isOptional) BOOL optional; - -/** - The objects in the RLMSet as an NSArray value. - */ -@property (nonatomic, readonly) NSArray *allObjects; - -/** - The class name of the objects contained in the set. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages the set. Returns `nil` for unmanaged set. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - Indicates if the set can no longer be accessed. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if the set is frozen. - - Frozen sets are immutable and can be accessed from any thread. Frozen sets - are created by calling `-freeze` on a managed live set. Unmanaged sets are - never frozen. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Adding, Removing, and Replacing Objects in a Set - -/** - Adds an object to the set if it is not already present. - - @warning This method may only be called during a write transaction. - - @param object An object of the type contained in the set. - */ -- (void)addObject:(RLMObjectType)object; - -/** - Adds an array of distinct objects to the set. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable object such as `NSArray`, `NSSet` or `RLMResults` which contains objects of the - same class as the set. - */ -- (void)addObjects:(id)objects; - -/** - Removes a given object from the set. - - @warning This method may only be called during a write transaction. - - @param object The object in the set that you want to remove. - */ -- (void)removeObject:(RLMObjectType)object; - -/** - Removes all objects from the set. - - @warning This method may only be called during a write transaction. - */ -- (void)removeAllObjects; - -/** - Empties the receiving set, then adds each object contained in another given set. - - @warning This method may only be called during a write transaction. - - @param set The RLMSet whose members replace the receiving set's content. - */ -- (void)setSet:(RLMSet *)set; - -/** - Removes from the receiving set each object that isn’t a member of another given set. - - @warning This method may only be called during a write transaction. - - @param set The RLMSet with which to perform the intersection. - */ -- (void)intersectSet:(RLMSet *)set; - -/** - Removes each object in another given set from the receiving set, if present. - - @warning This method may only be called during a write transaction. - - @param set The set of objects to remove from the receiving set. - */ -- (void)minusSet:(RLMSet *)set; - -/** - Adds each object in another given set to the receiving set, if not present. - - @warning This method may only be called during a write transaction. - - @param set The set of objects to add to the receiving set. - */ -- (void)unionSet:(RLMSet *)set; - -#pragma mark - Querying a Set - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/// :nodoc: -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/// :nodoc: -- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/// :nodoc: -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/// :nodoc: -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -/** - Returns a Boolean value that indicates whether at least one object in the receiving set is also present in another given set. - - @param set The RLMSet to compare the receiving set to. - - @return YES if at least one object in the receiving set is also present in otherSet, otherwise NO. - */ -- (BOOL)intersectsSet:(RLMSet *)set; - -/** - Returns a Boolean value that indicates whether every object in the receiving set is also present in another given set. - - @param set The RLMSet to compare the receiving set to. - - @return YES if every object in the receiving set is also present in otherSet, otherwise NO. - */ -- (BOOL)isSubsetOfSet:(RLMSet *)set; - -/** - Returns a Boolean value that indicates whether a given object is present in the set. - - @param anObject An object to look for in the set. - - @return YES if anObject is present in the set, otherwise NO. - */ -- (BOOL)containsObject:(RLMObjectType)anObject; - -/** - Compares the receiving set to another set. - - @param otherSet The set with which to compare the receiving set. - - @return YES if the contents of otherSet are equal to the contents of the receiving set, otherwise NO. - */ -- (BOOL)isEqualToSet:(RLMSet *)otherSet; - -#pragma mark - Sectioning a Set - -/** - Sorts and sections this collection from a given property key path, returning the result - as an instance of `RLMSectionedResults`. - - @param keyPath The property key path to sort on. - @param ascending The direction to sort in. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsSortedUsingKeyPath:(NSString *)keyPath - ascending:(BOOL)ascending - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -/** - Sorts and sections this collection from a given array of sort descriptors, returning the result - as an instance of `RLMSectionedResults`. - - @param sortDescriptors An array of `RLMSortDescriptor`s to sort by. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @note The primary sort descriptor must be responsible for determining the section key. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsUsingSortDescriptors:(NSArray *)sortDescriptors - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - - -#pragma mark - Notifications - -/** - Registers a block to be called each time the set changes. - - The block will be asynchronously called with the initial set, and then - called again after each write transaction which changes any of the objects in - the set, which objects are in the results, or the order of the objects in the - set. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the set were added, removed or modified. If a write transaction - did not modify any objects in the set, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - Person *person = [[Person allObjectsInRealm:realm] firstObject]; - NSLog(@"person.dogs.count: %zu", person.dogs.count); // => 0 - self.token = [person.dogs addNotificationBlock(RLMSet *dogs, - RLMCollectionChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count) // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - [person.dogs addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a non-frozen managed set. - - @param block The block to be called each time the set changes. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSet *_Nullable set, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the set changes. - - The block will be asynchronously called with the initial set, and then - called again after each write transaction which changes any of the objects in - the set, which objects are in the results, or the order of the objects in the - set. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the set were added, removed or modified. If a write transaction - did not modify any objects in the set, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSet *_Nullable set, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the set changes. - - The block will be asynchronously called with the initial set, and then - called again after each write transaction which changes any of the objects in - the set, which objects are in the results, or the order of the objects in the - set. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the set were added, removed or modified. If a write transaction - did not modify any objects in the set, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSet *_Nullable set, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the set changes. - - The block will be asynchronously called with the initial set, and then - called again after each write transaction which changes any of the objects in - the set, which objects are in the results, or the order of the objects in the - set. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the set were added, removed or modified. If a write transaction - did not modify any objects in the set, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSet *_Nullable set, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths -__attribute__((warn_unused_result)); - -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the objects in the set. - - NSNumber *min = [object.setProperty minOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, `RLMSet`, and `NSData` properties. - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The minimum value of the property, or `nil` if the set is empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects in the set. - - NSNumber *max = [object.setProperty maxOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, `RLMSet`, and `NSData` properties. - - @param property The property whose maximum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The maximum value of the property, or `nil` if the set is empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of distinct values of a given property over all the objects in the set. - - NSNumber *sum = [object.setProperty sumOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, `RLMSet and `NSData` properties. - - @param property The property whose values should be summed. Only properties of - types `int`, `float`, and `double` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects in the set. - - NSNumber *average = [object.setProperty averageOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMSet`, `RLMArray`, and `NSData` properties. - - @param property The property whose average value should be calculated. Only - properties of types `int`, `float`, and `double` are supported. - - @return The average value of the given property, or `nil` if the set is empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this set. - - The frozen copy is an immutable set which contains the same data as this - et currently contains, but will not update when writes are made to the - containing Realm. Unlike live sets, frozen sets can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a managed set. - @warning Holding onto a frozen set for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -#pragma mark - Unavailable Methods - -/** - `-[RLMSet init]` is not available because `RLMSet`s cannot be created directly. - ``RLMSet` properties on `RLMObject`s are lazily created when accessed. - */ -- (instancetype)init __attribute__((unavailable("RLMSets cannot be created directly"))); - -/** - `+[RLMSet new]` is not available because `RLMSet`s cannot be created directly. - `RLMSet` properties on `RLMObject`s are lazily created when accessed. - */ -+ (instancetype)new __attribute__((unavailable("RLMSet cannot be created directly"))); - -@end - -/// :nodoc: -@interface RLMSet (Swift) -// for use only in Swift class definitions -- (instancetype)initWithObjectClassName:(NSString *)objectClassName; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMSwiftObject.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMSwiftObject.h deleted file mode 100644 index 7ea764016..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMSwiftObject.h +++ /dev/null @@ -1,142 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) -/** - `Object` is a class used to define Realm model objects. - - In Realm you define your model classes by subclassing `Object` and adding properties to be managed. - You then instantiate and use your custom subclasses instead of using the `Object` class directly. - - ```swift - class Dog: Object { - @objc dynamic var name: String = "" - @objc dynamic var adopted: Bool = false - let siblings = List() - } - ``` - - ### Supported property types - - - `String`, `NSString` - - `Int` - - `Int8`, `Int16`, `Int32`, `Int64` - - `Float` - - `Double` - - `Bool` - - `Date`, `NSDate` - - `Data`, `NSData` - - `Decimal128` - - `ObjectId` - - `@objc enum` which has been delcared as conforming to `RealmEnum`. - - `RealmOptional` for optional numeric properties - - `Object` subclasses, to model many-to-one relationships - - `EmbeddedObject` subclasses, to model owning one-to-one relationships - - `List`, to model many-to-many relationships - - `String`, `NSString`, `Date`, `NSDate`, `Data`, `NSData`, `Decimal128`, and `ObjectId` properties - can be declared as optional. `Object` and `EmbeddedObject` subclasses *must* be declared as optional. - `Int`, `Int8`, `Int16`, `Int32`, `Int64`, `Float`, `Double`, `Bool`, enum, and `List` properties cannot. - To store an optional number, use `RealmOptional`, `RealmOptional`, `RealmOptional`, or - `RealmOptional` instead, which wraps an optional numeric value. Lists cannot be optional at all. - - All property types except for `List` and `RealmOptional` *must* be declared as `@objc dynamic var`. `List` and - `RealmOptional` properties must be declared as non-dynamic `let` properties. Swift `lazy` properties are not allowed. - - Note that none of the restrictions listed above apply to properties that are configured to be ignored by Realm. - - ### Querying - - You can retrieve all objects of a given type from a Realm by calling the `objects(_:)` instance method. - - ### Relationships - - See our [Objective-C guide](https://docs.mongodb.com/realm/sdk/swift/fundamentals/relationships/) for more details. - */ -@interface RealmSwiftObject : RLMObjectBase -@end - -/** - `EmbeddedObject` is a base class used to define embedded Realm model objects. - - Embedded objects work similarly to normal objects, but are owned by a single - parent Object (which itself may be embedded). Unlike normal top-level objects, - embedded objects cannot be directly created in or added to a Realm. Instead, - they can only be created as part of a parent object, or by assigning an - unmanaged object to a parent object's property. Embedded objects are - automatically deleted when the parent object is deleted or when the parent is - modified to no longer point at the embedded object, either by reassigning an - Object property or by removing the embedded object from the List containing it. - - Embedded objects can only ever have a single parent object which links to - them, and attempting to link to an existing managed embedded object will throw - an exception. - - The property types supported on `EmbeddedObject` are the same as for `Object`, - except for that embedded objects cannot link to top-level objects, so `Object` - and `List` properties are not supported (`EmbeddedObject` and - `List` *are*). - - Embedded objects cannot have primary keys or indexed properties. - - ```swift - class Owner: Object { - @objc dynamic var name: String = "" - let dogs = List() - } - class Dog: EmbeddedObject { - @objc dynamic var name: String = "" - @objc dynamic var adopted: Bool = false - let owner = LinkingObjects(fromType: Owner.self, property: "dogs") - } - ``` - */ -@interface RealmSwiftEmbeddedObject : RLMObjectBase -@end - -/** - `AsymmetricObject` is a base class used to define asymmetric Realm objects. - - Asymmetric objects can only be created using the `create(_ object:)` - function, and cannot be added, removed or queried. - When created, asymmetric objects will be synced unidirectionally to the MongoDB - database and cannot be accessed locally. - - Incoming links from any asymmetric table are not allowed, meaning embedding - an asymmetric object within an `Object` will throw an error. - - The property types supported on `AsymmetricObject` are the same as for `Object`, - except for that asymmetric objects can only link to embedded objects, so `Object` - and `List` properties are not supported (`EmbeddedObject` and - `List` *are*). - - ```swift - class Person: AsymmetricObject { - @Persisted(primaryKey: true) var _id: ObjectId = ObjectId.generate() - @Persisted var name: String - @Persisted var age: Int - } - ``` - */ -@interface RealmSwiftAsymmetricObject : RLMObjectBase -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMSwiftProperty.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMSwiftProperty.h deleted file mode 100644 index ea071927c..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMSwiftProperty.h +++ /dev/null @@ -1,71 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -@class RLMObjectBase, RLMArray, RLMSet; - -#ifdef __cplusplus -extern "C" { -#endif - -RLM_HEADER_AUDIT_BEGIN(nullability) - -#define REALM_FOR_EACH_SWIFT_PRIMITIVE_TYPE(macro) \ - macro(bool, Bool, bool) \ - macro(double, Double, double) \ - macro(float, Float, float) \ - macro(int64_t, Int64, int) - -#define REALM_FOR_EACH_SWIFT_OBJECT_TYPE(macro) \ - macro(NSString, String, string) \ - macro(NSDate, Date, date) \ - macro(NSData, Data, data) \ - macro(NSUUID, UUID, uuid) \ - macro(RLMDecimal128, Decimal128, decimal128) \ - macro(RLMObjectId, ObjectId, objectId) - -#define REALM_SWIFT_PROPERTY_ACCESSOR(objc, swift, rlmtype) \ - objc RLMGetSwiftProperty##swift(RLMObjectBase *, uint16_t); \ - objc RLMGetSwiftProperty##swift##Optional(RLMObjectBase *, uint16_t, bool *); \ - void RLMSetSwiftProperty##swift(RLMObjectBase *, uint16_t, objc); -REALM_FOR_EACH_SWIFT_PRIMITIVE_TYPE(REALM_SWIFT_PROPERTY_ACCESSOR) -#undef REALM_SWIFT_PROPERTY_ACCESSOR - -#define REALM_SWIFT_PROPERTY_ACCESSOR(objc, swift, rlmtype) \ - objc *_Nullable RLMGetSwiftProperty##swift(RLMObjectBase *, uint16_t); \ - void RLMSetSwiftProperty##swift(RLMObjectBase *, uint16_t, objc *_Nullable); -REALM_FOR_EACH_SWIFT_OBJECT_TYPE(REALM_SWIFT_PROPERTY_ACCESSOR) -#undef REALM_SWIFT_PROPERTY_ACCESSOR - -id _Nullable RLMGetSwiftPropertyAny(RLMObjectBase *, uint16_t); -void RLMSetSwiftPropertyAny(RLMObjectBase *, uint16_t, id); -RLMObjectBase *_Nullable RLMGetSwiftPropertyObject(RLMObjectBase *, uint16_t); -void RLMSetSwiftPropertyNil(RLMObjectBase *, uint16_t); -void RLMSetSwiftPropertyObject(RLMObjectBase *, uint16_t, RLMObjectBase *_Nullable); - -RLMArray *_Nonnull RLMGetSwiftPropertyArray(RLMObjectBase *obj, uint16_t); -RLMSet *_Nonnull RLMGetSwiftPropertySet(RLMObjectBase *obj, uint16_t); -RLMDictionary *_Nonnull RLMGetSwiftPropertyMap(RLMObjectBase *obj, uint16_t); - -RLM_HEADER_AUDIT_END(nullability) - -#ifdef __cplusplus -} // extern "C" -#endif diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMSyncConfiguration.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMSyncConfiguration.h deleted file mode 100644 index 54ea2ecfc..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMSyncConfiguration.h +++ /dev/null @@ -1,196 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -@class RLMApp; -@class RLMRealm; -@class RLMRealmConfiguration; -@class RLMUser; -@protocol RLMBSON; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** Determines file behavior during a client reset. - - @see: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ -*/ -typedef NS_ENUM(NSUInteger, RLMClientResetMode) { - /// The local copy of the Realm is copied into a recovery - /// directory for safekeeping, and then deleted from the original location. The next time - /// the Realm for that partition value is opened, the Realm will automatically be re-downloaded from - /// Atlas App Services, and can be used as normal. - - /// Data written to the Realm after the local copy of the Realm diverged from the backup - /// remote copy will be present in the local recovery copy of the Realm file. The - /// re-downloaded Realm will initially contain only the data present at the time the Realm - /// was backed up on the server. - /// - /// @see: ``rlmSync_clientResetBackedUpRealmPath`` and ``RLMSyncErrorActionToken`` for more information on accessing the recovery directory and error information. - /// - /// The manual client reset mode handler can be set in two places: - /// 1. As an ErrorReportingBlock argument at ``RLMSyncConfiguration.manualClientResetHandler``. - /// 2. As an ErrorReportingBlock in the ``RLMSyncManager.errorHandler`` property. - /// @see: ``RLMSyncManager.errorHandler`` - /// - /// When an ``RLMSyncErrorClientResetError`` is thrown, the following rules determine which block is executed: - /// - If an error reporting block is set in ``.manualClientResetHandler`` and the ``RLMSyncManager.errorHandler``, the ``.manualClientResetHandler`` block will be executed. - /// - If an error reporting block is set in either the ``.manualClientResetHandler`` or the ``RLMSyncManager``, but not both, the single block will execute. - /// - If no block is set in either location, the client reset will not be handled. The application will likely need to be restarted and unsynced local changes may be lost. - /// @note: The ``RLMSyncManager.errorHandler`` is still invoked under all ``RLMSyncError``s *other than* ``RLMSyncErrorClientResetError``. - /// @see ``RLMSyncError`` for an exhaustive list. - RLMClientResetModeManual = 0, - /// All unsynchronized local changes are automatically discarded and the local state is - /// automatically reverted to the most recent state from the server. Unsynchronized changes - /// can then be recovered in the post-client-reset callback block. - /// - /// If ``RLMClientResetModeDiscardLocal`` is enabled but the client reset operation is unable to complete - /// then the client reset process reverts to manual mode. Example) During a destructive schema change this - /// mode will fail and invoke the manual client reset handler. - /// - /// The RLMClientResetModeDiscardLocal mode supports two client reset callbacks -- ``RLMClientResetBeforeBlock``, ``RLMClientResetAfterBlock`` -- which can be passed as arguments when creating the ``RLMSyncConfiguration``. - /// @see: ``RLMClientResetAfterBlock`` and ``RLMClientResetBeforeBlock`` - RLMClientResetModeDiscardLocal __deprecated_enum_msg("Use RLMClientResetModeDiscardUnsyncedChanges") = 1, - /// All unsynchronized local changes are automatically discarded and the local state is - /// automatically reverted to the most recent state from the server. Unsynchronized changes - /// can then be recovered in the post-client-reset callback block. - /// - /// If ``RLMClientResetModeDiscardUnsyncedChanges`` is enabled but the client reset operation is unable to complete - /// then the client reset process reverts to manual mode. Example) During a destructive schema change this - /// mode will fail and invoke the manual client reset handler. - /// - /// The RLMClientResetModeDiscardUnsyncedChanges mode supports two client reset callbacks -- ``RLMClientResetBeforeBlock``, ``RLMClientResetAfterBlock`` -- which can be passed as arguments when creating the ``RLMSyncConfiguration``. - /// @see: ``RLMClientResetAfterBlock`` and ``RLMClientResetBeforeBlock`` - RLMClientResetModeDiscardUnsyncedChanges = 1, - /// The client device will download a realm realm which reflects the latest - /// state of the server after a client reset. A recovery process is run locally in - /// an attempt to integrate the server version with any local changes from - /// before the client reset occurred. - /// - /// The changes are integrated with the following rules: - /// 1. Objects created locally that were not synced before client reset will be integrated. - /// 2. If an object has been deleted on the server, but was modified on the client, the delete takes precedence and the update is discarded - /// 3. If an object was deleted on the client, but not the server, then the client delete instruction is applied. - /// 4. In the case of conflicting updates to the same field, the client update is applied. - /// - /// If the recovery integration fails, the client reset process falls back to ``RLMClientResetModeManual``. - /// The recovery integration will fail if the "Client Recovery" setting is not enabled on the server. - /// Integration may also fail in the event of an incompatible schema change. - /// - /// The RLMClientResetModeRecoverUnsyncedChanges mode supports two client reset callbacks -- ``RLMClientResetBeforeBlock``, ``RLMClientResetAfterBlock`` -- which can be passed as arguments when creating the ``RLMSyncConfiguration``. - /// @see: ``RLMClientResetAfterBlock`` and ``RLMClientResetBeforeBlock`` - RLMClientResetModeRecoverUnsyncedChanges = 2, - /// The client device will download a realm with objects reflecting the latest version of the server. A recovery - /// process is run locally in an attempt to integrate the server version with any local changes from before the - /// client reset occurred. - /// - /// The changes are integrated with the following rules: - /// 1. Objects created locally that were not synced before client reset will be integrated. - /// 2. If an object has been deleted on the server, but was modified on the client, the delete takes precedence and the update is discarded - /// 3. If an object was deleted on the client, but not the server, then the client delete instruction is applied. - /// 4. In the case of conflicting updates to the same field, the client update is applied. - /// - /// If the recovery integration fails, the client reset process falls back to ``RLMClientResetModeDiscardUnsyncedChanges``. - /// The recovery integration will fail if the "Client Recovery" setting is not enabled on the server. - /// Integration may also fail in the event of an incompatible schema change. - /// - /// The RLMClientResetModeRecoverOrDiscardUnsyncedChanges mode supports two client reset callbacks -- ``RLMClientResetBeforeBlock``, ``RLMClientResetAfterBlock`` -- which can be passed as arguments when creating the ``RLMSyncConfiguration``. - /// @see: ``RLMClientResetAfterBlock`` and ``RLMClientResetBeforeBlock`` - RLMClientResetModeRecoverOrDiscardUnsyncedChanges = 3 -}; - -/** - A block type used to report before a client reset will occur. - The `beforeFrozen` is a frozen copy of the local state prior to client reset. - */ -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMClientResetBeforeBlock)(RLMRealm * _Nonnull beforeFrozen); - -/** - A block type used to report after a client reset occurred. - The `beforeFrozen` argument is a frozen copy of the local state prior to client reset. - The `after` argument contains the local database state after the client reset occurred. - */ -RLM_SWIFT_SENDABLE // invoked on a backgroun thread -typedef void(^RLMClientResetAfterBlock)(RLMRealm * _Nonnull beforeFrozen, RLMRealm * _Nonnull after); - -/** - A configuration object representing configuration state for a Realm which is intended to sync with a Realm Object - Server. - */ -@interface RLMSyncConfiguration : NSObject - -/// The user to which the remote Realm belongs. -@property (nonatomic, readonly) RLMUser *user; - -/** - The value this Realm is partitioned on. The partition key is a property defined in - Atlas App Services. All classes with a property with this value will be synchronized to the - Realm. - */ -@property (nonatomic, readonly) id partitionValue; - -/** - An enum which determines file recovery behavior in the event of a client reset. - @note: Defaults to `RLMClientResetModeRecoverUnsyncedChanges` - - @see: `RLMClientResetMode` - @see: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ -*/ -@property (nonatomic) RLMClientResetMode clientResetMode; - -/** - A callback which notifies prior to prior to a client reset occurring. - @see: `RLMClientResetBeforeBlock` - */ -@property (nonatomic, nullable) RLMClientResetBeforeBlock beforeClientReset; - -/** - A callback which notifies after a client reset has occurred. - @see: `RLMClientResetAfterBlock` - */ -@property (nonatomic, nullable) RLMClientResetAfterBlock afterClientReset; - -/** - A callback that's executed when an `RLMSyncErrorClientResetError` is encountered. - @See RLMSyncErrorReportingBlock and RLMSyncErrorClientResetError for more - details on handling a client reset manually. - */ -@property (nonatomic, nullable) RLMSyncErrorReportingBlock manualClientResetHandler; - - -/** - Whether nonfatal connection errors should cancel async opens. - - By default, if a nonfatal connection error such as a connection timing out occurs, any currently pending asyncOpen operations will ignore the error and continue to retry until it succeeds. If this is set to true, the open will instead fail and report the error. - - NEXT-MAJOR: This should be true by default. - */ -@property (nonatomic) bool cancelAsyncOpenOnNonFatalErrors; - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("This type cannot be created directly"))); - -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("This type cannot be created directly"))); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMSyncManager.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMSyncManager.h deleted file mode 100644 index 1dee453d0..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMSyncManager.h +++ /dev/null @@ -1,223 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMSyncSession, RLMSyncTimeoutOptions, RLMAppConfiguration; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -// NEXT-MAJOR: This enum needs to be removed when access to the logger is removed -// from the sync manager. -/// An enum representing different levels of sync-related logging that can be configured. -typedef RLM_CLOSED_ENUM(NSUInteger, RLMSyncLogLevel) { - /// Nothing will ever be logged. - RLMSyncLogLevelOff, - /// Only fatal errors will be logged. - RLMSyncLogLevelFatal, - /// Only errors will be logged. - RLMSyncLogLevelError, - /// Warnings and errors will be logged. - RLMSyncLogLevelWarn, - /// Information about sync events will be logged. Fewer events will be logged in order to avoid overhead. - RLMSyncLogLevelInfo, - /// Information about sync events will be logged. More events will be logged than with `RLMSyncLogLevelInfo`. - RLMSyncLogLevelDetail, - /// Log information that can aid in debugging. - /// - /// - warning: Will incur a measurable performance impact. - RLMSyncLogLevelDebug, - /// Log information that can aid in debugging. More events will be logged than with `RLMSyncLogLevelDebug`. - /// - /// - warning: Will incur a measurable performance impact. - RLMSyncLogLevelTrace, - /// Log information that can aid in debugging. More events will be logged than with `RLMSyncLogLevelTrace`. - /// - /// - warning: Will incur a measurable performance impact. - RLMSyncLogLevelAll -}; - -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" -/// A log callback function which can be set on RLMSyncManager. -/// -/// The log function may be called from multiple threads simultaneously, and is -/// responsible for performing its own synchronization if any is required. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void (^RLMSyncLogFunction)(RLMSyncLogLevel level, NSString *message); -#pragma clang diagnostic pop - -/// A block type representing a block which can be used to report a sync-related error to the application. If the error -/// pertains to a specific session, that session will also be passed into the block. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMSyncErrorReportingBlock)(NSError *, RLMSyncSession * _Nullable); - -/** - A manager which serves as a central point for sync-related configuration. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMSyncManager : NSObject - -/** - A block which can optionally be set to report sync-related errors to your application. - - Any error reported through this block will be of the `RLMSyncError` type, and marked - with the `RLMSyncErrorDomain` domain. - - Errors reported through this mechanism are fatal, with several exceptions. Please consult - `RLMSyncError` for information about the types of errors that can be reported through - the block, and for for suggestions on handling recoverable error codes. - - @see `RLMSyncError` - */ -@property (nullable, atomic, copy) RLMSyncErrorReportingBlock errorHandler; - -/// :nodoc: -@property (nonatomic, copy) NSString *appID -__attribute__((deprecated("This property is not used for anything"))); - -/** - A string identifying this application which is included in the User-Agent - header of sync connections. By default, this will be the application's bundle - identifier. - - This property must be set prior to opening a synchronized Realm for the first - time. Any modifications made after opening a Realm will be ignored. - */ -@property (atomic, copy) NSString *userAgent; - -/** - The logging threshold which newly opened synced Realms will use. Defaults to - `RLMSyncLogLevelInfo`. - - By default logging strings are output to Apple System Logger. Set `logger` to - perform custom logging logic instead. - - @warning This property must be set before any synced Realms are opened. Setting it after - opening any synced Realm will do nothing. - */ -@property (atomic) RLMSyncLogLevel logLevel -__attribute__((deprecated("Use `RLMLogger.default.level`/`Logger.shared.level` to set/get the default logger threshold level."))); - -/** - The function which will be invoked whenever the sync client has a log message. - - If nil, log strings are output to Apple System Logger instead. - - @warning This property must be set before any synced Realms are opened. Setting - it after opening any synced Realm will do nothing. - */ -@property (atomic, nullable) RLMSyncLogFunction logger -__attribute__((deprecated("Use `RLMLogger.default`/`Logger.shared` to set/get the default logger."))); - -/** - The name of the HTTP header to send authorization data in when making requests to Atlas App Services which has - been configured to expect a custom authorization header. - */ -@property (nullable, atomic, copy) NSString *authorizationHeaderName; - -/** - Extra HTTP headers to append to every request to Atlas App Services. - - Modifying this property while sync sessions are active will result in all - sessions disconnecting and reconnecting using the new headers. - */ -@property (nullable, atomic, copy) NSDictionary *customRequestHeaders; - -/** - Options for the assorted types of connection timeouts for sync connections. - - If nil default values for all timeouts are used instead. - - @warning This property must be set before any synced Realms are opened. Setting - it after opening any synced Realm will do nothing. - */ -@property (nullable, atomic, copy) RLMSyncTimeoutOptions *timeoutOptions; - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("RLMSyncManager cannot be created directly"))); - -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("RLMSyncManager cannot be created directly"))); - -@end - -/** - Options for configuring timeouts and intervals in the sync client. - */ -@interface RLMSyncTimeoutOptions : NSObject -/// The maximum number of milliseconds to allow for a connection to -/// become fully established. This includes the time to resolve the -/// network address, the TCP connect operation, the SSL handshake, and -/// the WebSocket handshake. -/// -/// Defaults to 2 minutes. -@property (nonatomic) NSUInteger connectTimeout; - -/// The number of milliseconds to keep a connection open after all -/// sessions have been abandoned. -/// -/// After all synchronized Realms have been closed for a given server, the -/// connection is kept open until the linger time has expired to avoid the -/// overhead of reestablishing the connection when Realms are being closed and -/// reopened. -/// -/// Defaults to 30 seconds. -@property (nonatomic) NSUInteger connectionLingerTime; - -/// The number of milliseconds between each heartbeat ping message. -/// -/// The client periodically sends ping messages to the server to check if the -/// connection is still alive. Shorter periods make connection state change -/// notifications more responsive at the cost of battery life (as the antenna -/// will have to wake up more often). -/// -/// Defaults to 1 minute. -@property (nonatomic) NSUInteger pingKeepalivePeriod; - -/// How long in milliseconds to wait for a reponse to a heartbeat ping before -/// concluding that the connection has dropped. -/// -/// Shorter values will make connection state change notifications more -/// responsive as it will only change to `disconnected` after this much time has -/// elapsed, but overly short values may result in spurious disconnection -/// notifications when the server is simply taking a long time to respond. -/// -/// Defaults to 2 minutes. -@property (nonatomic) NSUInteger pongKeepaliveTimeout; - -/// The maximum amount of time, in milliseconds, since the loss of a -/// prior connection, for a new connection to be considered a "fast -/// reconnect". -/// -/// When a client first connects to the server, it defers uploading any local -/// changes until it has downloaded all changesets from the server. This -/// typically reduces the total amount of merging that has to be done, and is -/// particularly beneficial the first time that a specific client ever connects -/// to the server. -/// -/// When an existing client disconnects and then reconnects within the "fact -/// reconnect" time this is skipped and any local changes are uploaded -/// immediately without waiting for downloads, just as if the client was online -/// the whole time. -/// -/// Defaults to 1 minute. -@property (nonatomic) NSUInteger fastReconnectLimit; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMSyncSession.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMSyncSession.h deleted file mode 100644 index 31677ce9c..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMSyncSession.h +++ /dev/null @@ -1,234 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -/** - The current state of the session represented by a session object. - */ -typedef NS_ENUM(NSUInteger, RLMSyncSessionState) { - /// The sync session is actively communicating or attempting to communicate - /// with Atlas App Services. A session is considered Active even if - /// it is not currently connected. Check the connection state instead if you - /// wish to know if the connection is currently online. - RLMSyncSessionStateActive, - /// The sync session is not attempting to communicate with MongoDB - /// Realm due to the user logging out or synchronization being paused. - RLMSyncSessionStateInactive, - /// The sync session encountered a fatal error and is permanently invalid; it should be discarded. - RLMSyncSessionStateInvalid -}; - -/** - The current state of a sync session's connection. Sessions which are not in - the Active state will always be Disconnected. - */ -typedef NS_ENUM(NSUInteger, RLMSyncConnectionState) { - /// The sync session is not connected to the server, and is not attempting - /// to connect, either because the session is inactive or because it is - /// waiting to retry after a failed connection. - RLMSyncConnectionStateDisconnected, - /// The sync session is attempting to connect to Atlas App Services. - RLMSyncConnectionStateConnecting, - /// The sync session is currently connected to Atlas App Services. - RLMSyncConnectionStateConnected, -}; - -/** - The transfer direction (upload or download) tracked by a given progress notification block. - - Progress notification blocks can be registered on sessions if your app wishes to be informed - how many bytes have been uploaded or downloaded, for example to show progress indicator UIs. - */ -typedef RLM_CLOSED_ENUM(NSUInteger, RLMSyncProgressDirection) { - /// For monitoring upload progress. - RLMSyncProgressDirectionUpload, - /// For monitoring download progress. - RLMSyncProgressDirectionDownload, -}; - -/** - The desired behavior of a progress notification block. - - Progress notification blocks can be registered on sessions if your app wishes to be informed - how many bytes have been uploaded or downloaded, for example to show progress indicator UIs. - */ -typedef NS_ENUM(NSUInteger, RLMSyncProgressMode) { - /** - The block will be called indefinitely, or until it is unregistered by calling - `-[RLMProgressNotificationToken invalidate]`. - - Notifications will always report the latest number of transferred bytes, and the - most up-to-date number of total transferrable bytes. - */ - RLMSyncProgressModeReportIndefinitely, - /** - The block will, upon registration, store the total number of bytes - to be transferred. When invoked, it will always report the most up-to-date number - of transferrable bytes out of that original number of transferrable bytes. - - When the number of transferred bytes reaches or exceeds the - number of transferrable bytes, the block will be unregistered. - */ - RLMSyncProgressModeForCurrentlyOutstandingWork, -}; - -@class RLMUser, RLMSyncConfiguration, RLMSyncErrorActionToken, RLMSyncManager; - -/** - The type of a progress notification block intended for reporting a session's network - activity to the user. - - `transferredBytes` refers to the number of bytes that have been uploaded or downloaded. - `transferrableBytes` refers to the total number of bytes transferred, and pending transfer. - */ -typedef void(^RLMProgressNotificationBlock)(NSUInteger transferredBytes, NSUInteger transferrableBytes); - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A token object corresponding to a progress notification block on a session object. - - To stop notifications manually, call `-invalidate` on it. Notifications should be stopped before - the token goes out of scope or is destroyed. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMProgressNotificationToken : RLMNotificationToken -@end - -/** - An object encapsulating an Atlas App Services "session". Sessions represent the - communication between the client (and a local Realm file on disk), and the server - (and a remote Realm with a given partition value stored on Atlas App Services). - - Sessions are always created by the SDK and vended out through various APIs. The - lifespans of sessions associated with Realms are managed automatically. Session - objects can be accessed from any thread. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMSyncSession : NSObject - -/// The session's current state. -/// -/// This property is not KVO-compliant. -@property (nonatomic, readonly) RLMSyncSessionState state; - -/// The session's current connection state. -/// -/// This property is KVO-compliant and can be observed to be notified of changes. -/// Be warned that KVO observers for this property may be called on a background -/// thread. -@property (atomic, readonly) RLMSyncConnectionState connectionState; - -/// The user that owns this session. -- (nullable RLMUser *)parentUser; - -/** - If the session is valid, return a sync configuration that can be used to open the Realm - associated with this session. - */ -- (nullable RLMSyncConfiguration *)configuration; - -/** - Temporarily suspend syncronization and disconnect from the server. - - The session will not attempt to connect to Atlas App Services until `resume` - is called or the Realm file is closed and re-opened. - */ -- (void)suspend; - -/** - Resume syncronization and reconnect to Atlas App Services after suspending. - - This is a no-op if the session was already active or if the session is invalid. - Newly created sessions begin in the Active state and do not need to be resumed. - */ -- (void)resume; - -/** - Register a progress notification block. - - Multiple blocks can be registered with the same session at once. Each block - will be invoked on a side queue devoted to progress notifications. - - If the session has already received progress information from the - synchronization subsystem, the block will be called immediately. Otherwise, it - will be called as soon as progress information becomes available. - - The token returned by this method must be retained as long as progress - notifications are desired, and the `-invalidate` method should be called on it - when notifications are no longer needed and before the token is destroyed. - - If no token is returned, the notification block will never be called again. - There are a number of reasons this might be true. If the session has previously - experienced a fatal error it will not accept progress notification blocks. If - the block was configured in the `RLMSyncProgressForCurrentlyOutstandingWork` - mode but there is no additional progress to report (for example, the number - of transferrable bytes and transferred bytes are equal), the block will not be - called again. - - @param direction The transfer direction (upload or download) to track in this progress notification block. - @param mode The desired behavior of this progress notification block. - @param block The block to invoke when notifications are available. - - @return A token which must be held for as long as you want notifications to be delivered. - - @see `RLMSyncProgressDirection`, `RLMSyncProgress`, `RLMProgressNotificationBlock`, `RLMProgressNotificationToken` - */ -- (nullable RLMProgressNotificationToken *)addProgressNotificationForDirection:(RLMSyncProgressDirection)direction - mode:(RLMSyncProgressMode)mode - block:(RLMProgressNotificationBlock)block -NS_REFINED_FOR_SWIFT; - -/** - Given an error action token, immediately handle the corresponding action. - - @see `RLMSyncErrorClientResetError`, `RLMSyncErrorPermissionDeniedError` - */ -+ (void)immediatelyHandleError:(RLMSyncErrorActionToken *)token syncManager:(RLMSyncManager *)syncManager; - -/** - Get the sync session for the given Realm if it is a synchronized Realm, or `nil` - if it is not. - */ -+ (nullable RLMSyncSession *)sessionForRealm:(RLMRealm *)realm; - -@end - -// MARK: - Error action token - -#pragma mark - Error action token - -/** - An opaque token returned as part of certain errors. It can be - passed into certain APIs to perform certain actions. - - @see `RLMSyncErrorClientResetError`, `RLMSyncErrorPermissionDeniedError` - */ -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMSyncErrorActionToken : NSObject - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("This type cannot be created directly"))); - -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("This type cannot be created directly"))); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMSyncSubscription.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMSyncSubscription.h deleted file mode 100644 index d35be19d0..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMSyncSubscription.h +++ /dev/null @@ -1,346 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectId; - -#pragma mark - Subscription States - -/// The current state of the subscription. This can be used for ensuring that -/// the subscriptions are not errored and that it has been successfully -/// synced to the server. -typedef NS_ENUM(NSUInteger, RLMSyncSubscriptionState) { - /// The subscription is complete and the server has sent all the data that matched the subscription - /// queries at the time the subscription set was updated. The server is now in a steady-state - /// synchronization mode where it will stream update as they come. - RLMSyncSubscriptionStateComplete, - /// The subscription encountered an error and synchronization is paused for this Realm. You can - /// find the error calling error in the subscription set to get a description of the error. You can - /// still use the current subscription set to write a subscription. - RLMSyncSubscriptionStateError, - /// The subscription is persisted locally but not yet processed by the server, which means - /// the server hasn't yet returned all the data that matched the updated subscription queries. - RLMSyncSubscriptionStatePending, - /// The subscription set has been super-ceded by an updated one, this typically means that - /// someone is trying to write a subscription on a different instance of the subscription set. - /// You should not use a superseded subscription set and instead obtain a new instance of - /// the subscription set to write a subscription. - RLMSyncSubscriptionStateSuperseded -}; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - `RLMSyncSubscription` is used to define a Flexible Sync subscription obtained from querying a - subscription set, which can be used to read or remove/update a committed subscription. - */ -@interface RLMSyncSubscription : NSObject - -/// Name of the subscription. If not specified it will return nil. -@property (nonatomic, readonly, nullable) NSString *name; - -/// When the subscription was created. Recorded automatically. -@property (nonatomic, readonly) NSDate *createdAt; - -/// When the subscription was last updated. Recorded automatically. -@property (nonatomic, readonly) NSDate *updatedAt; - -/** - Updates a Flexible Sync's subscription query with an allowed query which will be used to bootstrap data - from the server when committed. - - @warning This method may only be called during a write subscription block. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - */ -- (void)updateSubscriptionWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (void)updateSubscriptionWhere:(NSString *)predicateFormat - args:(va_list)args; - -/** - Updates a Flexible Sync's subscription query with an allowed query which will be used to bootstrap data - from the server when committed. - - @warning This method may only be called during a write subscription block. - - @param predicate The predicate with which to filter the objects on the server. - */ -- (void)updateSubscriptionWithPredicate:(NSPredicate *)predicate; - -@end - -/** - `RLMSyncSubscriptionSet` is a collection of `RLMSyncSubscription`s. This is the entry point - for adding and removing `RLMSyncSubscription`s. - */ -@interface RLMSyncSubscriptionSet : NSObject - -/// The number of subscriptions in the subscription set. -@property (readonly) NSUInteger count; - -/// Gets the error associated to the subscription set. This will be non-nil in case the current -/// state of the subscription set is `RLMSyncSubscriptionStateError`. -@property (nonatomic, readonly, nullable) NSError *error; - -/// Gets the state associated to the subscription set. -@property (nonatomic, readonly) RLMSyncSubscriptionState state; - -#pragma mark - Batch Update subscriptions - -/** - Synchronously performs any transactions (add/remove/update) to the subscription set within the block, - this will not wait for the server to acknowledge and see all the data associated with this collection of subscriptions, - and will return after committing the subscription transactions. - - @param block The block containing actions to perform to the subscription set. - */ -- (void)update:(__attribute__((noescape)) void(^)(void))block; -/// :nodoc: -- (void)write:(__attribute__((noescape)) void(^)(void))block __attribute__((unavailable("Renamed to -update"))); - -/** - Synchronously performs any transactions (add/remove/update) to the subscription set within the block, - this will not wait for the server to acknowledge and see all the data associated with this collection of subscriptions, - and will return after committing the subscription transactions. - - @param block The block containing actions to perform to the subscription set. - @param onComplete A block which is called upon synchronization of - subscriptions to the server. The block will be passed `nil` - if the update succeeded, and an error describing the problem - otherwise. - */ -- (void)update:(__attribute__((noescape)) void(^)(void))block - onComplete:(nullable void(^RLM_SWIFT_SENDABLE)(NSError *_Nullable))onComplete - __attribute__((swift_async(not_swift_private, 2))) - __attribute__((swift_attr("@_unsafeInheritExecutor"))); -/// :nodoc: -- (void)write:(__attribute__((noescape)) void(^)(void))block - onComplete:(void(^)(NSError * _Nullable))onComplete __attribute__((unavailable("Renamed to -update:onComplete."))); - -#pragma mark - Find subscription - -/** - Finds a subscription by the specified name. - - @param name The name used to identify the subscription. - - @return A subscription for the given name. - */ -- (nullable RLMSyncSubscription *)subscriptionWithName:(NSString *)name; - -/** - Finds a subscription by the query for the specified object class name. - - @param objectClassName The class name for the model class to be queried. - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return A subscription for the given query.. - */ -- (nullable RLMSyncSubscription *)subscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (nullable RLMSyncSubscription *)subscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat - args:(va_list)args; - -/** - Finds a subscription by the query for the specified object class name. - - @param objectClassName The class name for the model class to be queried. - @param predicate The predicate used to to filter the objects on the server. - - @return A subscription for the given query.. - */ -- (nullable RLMSyncSubscription *)subscriptionWithClassName:(NSString *)objectClassName - predicate:(NSPredicate *)predicate; - -#pragma mark - Add a Subscription - -/** - Adds a new subscription to the subscription set which will be sent to the server when - committed at the end of a write subscription block. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - */ -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat - args:(va_list)args; - -/** - Adds a new subscription to the subscription set which will be sent to the server when - committed at the end of a write subscription block. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param name The name used the identify the subscription. - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - */ -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - subscriptionName:(NSString *)name - where:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - subscriptionName:(NSString *)name - where:(NSString *)predicateFormat - args:(va_list)args; - -/** - Adds a new subscription to the subscription set which will be sent to the server when - committed at the end of a write subscription block. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param predicate The predicate defining the query for the subscription. - */ -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - predicate:(NSPredicate *)predicate; - -/** - Adds a new subscription to the subscription set which will be sent to the server when - committed at the end of a write subscription block. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param name The name used to identify the subscription. - @param predicate The predicate defining the query for the subscription. - */ -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - subscriptionName:(nullable NSString *)name - predicate:(NSPredicate *)predicate; - -#pragma mark - Remove Subscription - -/** - Removes a subscription with the specified name from the subscription set. - - @warning This method may only be called during a write subscription block. - - @param name The name used the identify the subscription. - */ -- (void)removeSubscriptionWithName:(NSString *)name; - -/** - Removes a subscription with the specified query for the object class from the subscription set. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - */ -- (void)removeSubscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (void)removeSubscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat - args:(va_list)args; - -/** - Removes a subscription with the specified query for the object class from the subscription set. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param predicate The predicate which will be used to identify the subscription to be removed. - */ -- (void)removeSubscriptionWithClassName:(NSString *)objectClassName - predicate:(NSPredicate *)predicate; - -/** - Removes the subscription from the subscription set. - - @warning This method may only be called during a write subscription block. - - @param subscription An instance of the subscription to be removed. - */ -- (void)removeSubscription:(RLMSyncSubscription *)subscription; - -#pragma mark - Remove Subscriptions - -/** - Removes all subscription from the subscription set. - - @warning This method may only be called during a write subscription block. - @warning Removing all subscriptions will result in an error if no new subscription is added. Server should - acknowledge at least one subscription. - */ -- (void)removeAllSubscriptions; - -/** - Removes all subscription with the specified class name. - - @param className The class name for the model class to be queried. - - @warning This method may only be called during a write subscription block. - */ -- (void)removeAllSubscriptionsWithClassName:(NSString *)className; - -#pragma mark - SubscriptionSet Collection - -/** - Returns the subscription at the given `index`. - - @param index The index. - - @return A subscription for the given index in the subscription set. - */ -- (nullable RLMSyncSubscription *)objectAtIndex:(NSUInteger)index; - -/** - Returns the first object in the subscription set list, or `nil` if the subscriptions are empty. - - @return A subscription. - */ -- (nullable RLMSyncSubscription *)firstObject; - -/** - Returns the last object in the subscription set, or `nil` if the subscriptions are empty. - - @return A subscription. - */ -- (nullable RLMSyncSubscription *)lastObject; - -#pragma mark - Subscript - -/** - Returns the subscription at the given `index`. - - @param index The index. - - @return A subscription for the given index in the subscription set. - */ -- (id)objectAtIndexedSubscript:(NSUInteger)index; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMThreadSafeReference.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMThreadSafeReference.h deleted file mode 100644 index 9472942ed..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMThreadSafeReference.h +++ /dev/null @@ -1,107 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMRealm; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - Objects of types which conform to `RLMThreadConfined` can be managed by a Realm, which will make - them bound to a thread-specific `RLMRealm` instance. Managed objects must be explicitly exported - and imported to be passed between threads. - - Managed instances of objects conforming to this protocol can be converted to a thread-safe - reference for transport between threads by passing to the - `+[RLMThreadSafeReference referenceWithThreadConfined:]` constructor. - - Note that only types defined by Realm can meaningfully conform to this protocol, and defining new - classes which attempt to conform to it will not make them work with `RLMThreadSafeReference`. - */ -@protocol RLMThreadConfined -// Conformance to the `RLMThreadConfined_Private` protocol will be enforced at runtime. - -/** - The Realm which manages the object, or `nil` if the object is unmanaged. - - Unmanaged objects are not confined to a thread and cannot be passed to methods expecting a - `RLMThreadConfined` object. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/// Indicates if the object can no longer be accessed because it is now invalid. -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -@end - -/** - An object intended to be passed between threads containing a thread-safe reference to its - thread-confined object. - - To resolve a thread-safe reference on a target Realm on a different thread, pass to - `-[RLMRealm resolveThreadSafeReference:]`. - - @warning A `RLMThreadSafeReference` object must be resolved at most once. - Failing to resolve a `RLMThreadSafeReference` will result in the source version of the - Realm being pinned until the reference is deallocated. - - @note Prefer short-lived `RLMThreadSafeReference`s as the data for the version of the source Realm - will be retained until all references have been resolved or deallocated. - - @see `RLMThreadConfined` - @see `-[RLMRealm resolveThreadSafeReference:]` - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMThreadSafeReference<__covariant Confined : id> : NSObject - -/** - Create a thread-safe reference to the thread-confined object. - - @param threadConfined The thread-confined object to create a thread-safe reference to. - - @note You may continue to use and access the thread-confined object after passing it to this - constructor. - */ -+ (instancetype)referenceWithThreadConfined:(Confined)threadConfined; - -/** - Indicates if the reference can no longer be resolved because an attempt to resolve it has already - occurred. References can only be resolved once. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -#pragma mark - Unavailable Methods - -/** - `-[RLMThreadSafeReference init]` is not available because `RLMThreadSafeReference` cannot be - created directly. `RLMThreadSafeReference` instances must be obtained by calling - `-[RLMRealm resolveThreadSafeReference:]`. - */ -- (instancetype)init __attribute__((unavailable("RLMThreadSafeReference cannot be created directly"))); - -/** - `-[RLMThreadSafeReference new]` is not available because `RLMThreadSafeReference` cannot be - created directly. `RLMThreadSafeReference` instances must be obtained by calling - `-[RLMRealm resolveThreadSafeReference:]`. - */ -+ (instancetype)new __attribute__((unavailable("RLMThreadSafeReference cannot be created directly"))); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMUpdateResult.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMUpdateResult.h deleted file mode 100644 index df0b237e3..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMUpdateResult.h +++ /dev/null @@ -1,45 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectId; -@protocol RLMBSON; - -/// The result of an `updateOne` or `updateMany` operation a `RLMMongoCollection`. -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMUpdateResult : NSObject - -/// The number of documents that matched the filter. -@property (nonatomic, readonly) NSUInteger matchedCount; - -/// The number of documents modified. -@property (nonatomic, readonly) NSUInteger modifiedCount; - -/// The identifier of the inserted document if an upsert took place and the document's primary key is an `ObjectId`. -@property (nonatomic, nullable, readonly) RLMObjectId *objectId -__attribute__((deprecated("Use documentId instead, which support all BSON types", "documentId"))); - -/// The identifier of the inserted document if an upsert took place. -@property (nonatomic, nullable, readonly) id documentId; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMUser.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMUser.h deleted file mode 100644 index 436350f9b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMUser.h +++ /dev/null @@ -1,447 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import -#import -#import - -@class RLMUser, RLMSyncSession, RLMRealm, RLMUserIdentity, RLMAPIKeyAuth, RLMMongoClient, RLMMongoDatabase, RLMMongoCollection, RLMUserProfile; -@protocol RLMBSON; - -/** - The state of the user object. - */ -typedef NS_ENUM(NSUInteger, RLMUserState) { - /// The user is logged out. Call `logInWithCredentials:...` with valid credentials to log the user back in. - RLMUserStateLoggedOut, - /// The user is logged in, and any Realms associated with it are syncing with Atlas App Services. - RLMUserStateLoggedIn, - /// The user has been removed, and cannot be used. - RLMUserStateRemoved -}; - -/// A block type used to report an error related to a specific user. -RLM_SWIFT_SENDABLE -typedef void(^RLMOptionalUserBlock)(RLMUser * _Nullable, NSError * _Nullable); - -/// A block type used to report an error on a network request from the user. -RLM_SWIFT_SENDABLE -typedef void(^RLMUserOptionalErrorBlock)(NSError * _Nullable); - -/// A block which returns a dictionary should there be any custom data set for a user -RLM_SWIFT_SENDABLE -typedef void(^RLMUserCustomDataBlock)(NSDictionary * _Nullable, NSError * _Nullable); - -/// A block type for returning from function calls. -RLM_SWIFT_SENDABLE -typedef void(^RLMCallFunctionCompletionBlock)(id _Nullable, NSError * _Nullable); - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A `RLMUser` instance represents a single Realm App user account. - - A user may have one or more credentials associated with it. These credentials - uniquely identify the user to the authentication provider, and are used to sign - into an Atlas App Services user account. - - Note that user objects are only vended out via SDK APIs, and cannot be directly - initialized. User objects can be accessed from any thread. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // internally thread-safe -@interface RLMUser : NSObject - -/** - The unique Atlas App Services string identifying this user. - Note this is different from an identity: A user may have multiple identities but has a single identifier. See RLMUserIdentity. - */ -@property (nonatomic, readonly) NSString *identifier NS_SWIFT_NAME(id); - -/// Returns an array of identities currently linked to a user. -@property (nonatomic, readonly) NSArray *identities; - -/** - The user's refresh token used to access App Services. - - By default, refresh tokens expire 60 days after they are issued. - You can configure this time for your App's refresh tokens to be - anywhere between 30 minutes and 180 days. - - You can configure the refresh token expiration time for all sessions in - an App from the Admin UI or Admin API. -*/ -@property (nullable, nonatomic, readonly) NSString *refreshToken; - -/** - The user's access token used to access App Services. - - This is required to make HTTP requests to Atlas App Services like the Data API or GraphQL. - It should be treated as sensitive data. - - The Realm SDK automatically manages access tokens and refreshes them - when they expire. - */ -@property (nullable, nonatomic, readonly) NSString *accessToken; - -/** - The current state of the user. - */ -@property (nonatomic, readonly) RLMUserState state; - -/** - Indicates if the user is logged in or not. Returns true if the access token and refresh token are not empty. - */ -@property (nonatomic, readonly) BOOL isLoggedIn; - -#pragma mark - Lifecycle - -/** - Create a partition-based sync configuration instance for the given partition value. - - @param partitionValue The `RLMBSON` value the Realm is partitioned on. - @return A default configuration object with the sync configuration set to use the given partition value. - */ -- (RLMRealmConfiguration *)configurationWithPartitionValue:(nullable id)partitionValue NS_REFINED_FOR_SWIFT; - -/** - Create a partition-based sync configuration instance for the given partition value. - - @param partitionValue The `RLMBSON` value the Realm is partitioned on. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - - @return A configuration object with the sync configuration set to use the given partition value. - */ -- (RLMRealmConfiguration *)configurationWithPartitionValue:(nullable id)partitionValue - clientResetMode:(RLMClientResetMode)clientResetMode NS_REFINED_FOR_SWIFT; - -/** - Create a partition-based sync configuration instance for the given partition value. - - @param partitionValue The `RLMBSON` value the Realm is partitioned on. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param beforeResetBlock A callback which notifies prior to a client reset occurring. See: `RLMClientResetBeforeBlock` - @param afterResetBlock A callback which notifies after a client reset has occurred. See: `RLMClientResetAfterBlock` - - @return A configuration object with the sync configuration set to use the given partition value. - */ -- (RLMRealmConfiguration *)configurationWithPartitionValue:(nullable id)partitionValue - clientResetMode:(RLMClientResetMode)clientResetMode - notifyBeforeReset:(nullable RLMClientResetBeforeBlock)beforeResetBlock - notifyAfterReset:(nullable RLMClientResetAfterBlock)afterResetBlock NS_REFINED_FOR_SWIFT; - -/** - Create a partition-based sync configuration instance for the given partition value. - - @param partitionValue The `RLMBSON` value the Realm is partitioned on. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param manualClientResetHandler An error reporting block that is invoked during a client reset. - @See ``RLMSyncErrorReportingBlock`` and ``RLMClientResetInfo`` - - @return A configuration object with the sync configuration set to use the given partition value. - */ -- (RLMRealmConfiguration *)configurationWithPartitionValue:(nullable id)partitionValue - clientResetMode:(RLMClientResetMode)clientResetMode - manualClientResetHandler:(nullable RLMSyncErrorReportingBlock)manualClientResetHandler NS_REFINED_FOR_SWIFT; - -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @return A ``RLMRealmConfiguration`` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfiguration NS_REFINED_FOR_SWIFT; - -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param beforeResetBlock A callback which notifies prior to a client reset occurring. See: `RLMClientResetBeforeBlock` - @param afterResetBlock A callback which notifies after a client reset has occurred. See: `RLMClientResetAfterBlock` - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithClientResetMode:(RLMClientResetMode)clientResetMode - notifyBeforeReset:(nullable RLMClientResetBeforeBlock)beforeResetBlock - notifyAfterReset:(nullable RLMClientResetAfterBlock)afterResetBlock NS_REFINED_FOR_SWIFT; -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param manualClientResetHandler An error reporting block that is invoked during a client reset. - @See `RLMSyncErrorReportingBlock` and `RLMClientResetInfo` - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithClientResetMode:(RLMClientResetMode)clientResetMode - manualClientResetHandler:(nullable RLMSyncErrorReportingBlock)manualClientResetHandler NS_REFINED_FOR_SWIFT; - -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param initialSubscriptions A block which receives a subscription set instance, that can be - used to add an initial set of subscriptions which will be executed - when the Realm is first opened. - @param rerunOnOpen If true, allows to run the initial set of subscriptions specified, on every app startup. - This can be used to re-run dynamic time ranges and other queries that require a - re-computation of a static variable. - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithInitialSubscriptions:(RLMFlexibleSyncInitialSubscriptionsBlock)initialSubscriptions - rerunOnOpen:(BOOL)rerunOnOpen NS_REFINED_FOR_SWIFT; -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param initialSubscriptions A block which receives a subscription set instance, that can be - used to add an initial set of subscriptions which will be executed - when the Realm is first opened. - @param rerunOnOpen If true, allows to run the initial set of subscriptions specified, on every app startup. - This can be used to re-run dynamic time ranges and other queries that require a - re-computation of a static variable. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param beforeResetBlock A callback which notifies prior to a client reset occurring. See: `RLMClientResetBeforeBlock` - @param afterResetBlock A callback which notifies after a client reset has occurred. See: `RLMClientResetAfterBlock` - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithInitialSubscriptions:(RLMFlexibleSyncInitialSubscriptionsBlock)initialSubscriptions - rerunOnOpen:(BOOL)rerunOnOpen - clientResetMode:(RLMClientResetMode)clientResetMode - notifyBeforeReset:(nullable RLMClientResetBeforeBlock)beforeResetBlock - notifyAfterReset:(nullable RLMClientResetAfterBlock)afterResetBlock NS_REFINED_FOR_SWIFT; - -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param initialSubscriptions A block which receives a subscription set instance, that can be - used to add an initial set of subscriptions which will be executed - when the Realm is first opened. - @param rerunOnOpen If true, allows to run the initial set of subscriptions specified, on every app startup. - This can be used to re-run dynamic time ranges and other queries that require a - re-computation of a static variable. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param manualClientResetHandler An error reporting block that is invoked during a client reset. - @See `RLMSyncErrorReportingBlock` and `RLMClientResetInfo` - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithInitialSubscriptions:(RLMFlexibleSyncInitialSubscriptionsBlock)initialSubscriptions - rerunOnOpen:(BOOL)rerunOnOpen - clientResetMode:(RLMClientResetMode)clientResetMode - manualClientResetHandler:(nullable RLMSyncErrorReportingBlock)manualClientResetHandler NS_REFINED_FOR_SWIFT; - -#pragma mark - Sessions - -/** - Retrieve a valid session object belonging to this user for a given URL, or `nil` - if no such object exists. - */ -- (nullable RLMSyncSession *)sessionForPartitionValue:(id)partitionValue; - -/// Retrieve all the valid sessions belonging to this user. -@property (nonatomic, readonly) NSArray *allSessions; - -#pragma mark - Custom Data - -/** - The custom data of the user. - This is configured in your Atlas App Services app. - */ -@property (nonatomic, readonly) NSDictionary *customData NS_REFINED_FOR_SWIFT; - -/** - The profile of the user. - */ -@property (nonatomic, readonly) RLMUserProfile *profile; - -/** - Refresh a user's custom data. This will, in effect, refresh the user's auth session. - */ -- (void)refreshCustomDataWithCompletion:(RLMUserCustomDataBlock)completion; - -/** - Links the currently authenticated user with a new identity, where the identity is defined by the credential - specified as a parameter. This will only be successful if this `RLMUser` is the currently authenticated - with the client from which it was created. On success a new user will be returned with the new linked credentials. - - @param credentials The `RLMCredentials` used to link the user to a new identity. - @param completion The completion handler to call when the linking is complete. - If the operation is successful, the result will contain a new - `RLMUser` object representing the currently logged in user. -*/ -- (void)linkUserWithCredentials:(RLMCredentials *)credentials - completion:(RLMOptionalUserBlock)completion NS_REFINED_FOR_SWIFT; - -/** - Removes the user - - This logs out and destroys the session related to this user. The completion block will return an error - if the user is not found or is already removed. - - @param completion A callback invoked on completion -*/ -- (void)removeWithCompletion:(RLMUserOptionalErrorBlock)completion; - -/** - Permanently deletes this user from your Atlas App Services app. - - The users state will be set to `Removed` and the session will be destroyed. - If the delete request fails, the local authentication state will be untouched. - - @param completion A callback invoked on completion -*/ -- (void)deleteWithCompletion:(RLMUserOptionalErrorBlock)completion; - -/** - Logs out the current user - - The users state will be set to `Removed` is they are an anonymous user or `LoggedOut` if they are authenticated by an email / password or third party auth clients - If the logout request fails, this method will still clear local authentication state. - - @param completion A callback invoked on completion -*/ -- (void)logOutWithCompletion:(RLMUserOptionalErrorBlock)completion; - -/** - A client for the user API key authentication provider which - can be used to create and modify user API keys. - - This client should only be used by an authenticated user. -*/ -@property (nonatomic, readonly) RLMAPIKeyAuth *apiKeysAuth; - -/// A client for interacting with a remote MongoDB instance -/// @param serviceName The name of the MongoDB service -- (RLMMongoClient *)mongoClientWithServiceName:(NSString *)serviceName NS_REFINED_FOR_SWIFT; - -/** - Calls the Atlas App Services function with the provided name and arguments. - - @param name The name of the Atlas App Services function to be called. - @param arguments The `BSONArray` of arguments to be provided to the function. - @param completion The completion handler to call when the function call is complete. - This handler is executed on a non-main global `DispatchQueue`. -*/ -- (void)callFunctionNamed:(NSString *)name - arguments:(NSArray> *)arguments - completionBlock:(RLMCallFunctionCompletionBlock)completion NS_REFINED_FOR_SWIFT; - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("RLMUser cannot be created directly"))); -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("RLMUser cannot be created directly"))); - -@end - -#pragma mark - User info classes - -/** - An identity of a user. A user can have multiple identities, usually associated with multiple providers. - Note this is different from a user's unique identifier string. - @seeAlso `RLMUser.identifier` - */ -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMUserIdentity : NSObject - -/** - The associated provider type - */ -@property (nonatomic, readonly) NSString *providerType; - -/** - The string which identifies the RLMUserIdentity - */ -@property (nonatomic, readonly) NSString *identifier; - -/** - Initialize an RLMUserIdentity for the given identifier and provider type. - @param providerType the associated provider type - @param identifier the identifier of the identity - */ -- (instancetype)initUserIdentityWithProviderType:(NSString *)providerType - identifier:(NSString *)identifier; - -@end - -/** - A profile for a given User. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMUserProfile : NSObject - -/// The full name of the user. -@property (nonatomic, readonly, nullable) NSString *name; -/// The email address of the user. -@property (nonatomic, readonly, nullable) NSString *email; -/// A URL to the user's profile picture. -@property (nonatomic, readonly, nullable) NSString *pictureURL; -/// The first name of the user. -@property (nonatomic, readonly, nullable) NSString *firstName; -/// The last name of the user. -@property (nonatomic, readonly, nullable) NSString *lastName; -/// The gender of the user. -@property (nonatomic, readonly, nullable) NSString *gender; -/// The birthdate of the user. -@property (nonatomic, readonly, nullable) NSString *birthday; -/// The minimum age of the user. -@property (nonatomic, readonly, nullable) NSString *minAge; -/// The maximum age of the user. -@property (nonatomic, readonly, nullable) NSString *maxAge; -/// The BSON dictionary of metadata associated with this user. -@property (nonatomic, readonly) NSDictionary *metadata NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMUserAPIKey.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMUserAPIKey.h deleted file mode 100644 index 2cdd82b2a..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMUserAPIKey.h +++ /dev/null @@ -1,43 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// UserAPIKey model for APIKeys recevied from the server. -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMUserAPIKey : NSObject - -/// Indicates if the API key is disabled or not -@property (nonatomic, readonly) BOOL disabled; - -/// The name of the key. -@property (nonatomic, readonly) NSString *name; - -/// The actual key. Will only be included in -/// the response when an API key is first created. -@property (nonatomic, readonly, nullable) NSString *key; - -/// The ObjectId of the API key -@property (nonatomic, readonly) RLMObjectId *objectId NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMValue.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMValue.h deleted file mode 100644 index ac1f10ee4..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/RLMValue.h +++ /dev/null @@ -1,97 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import -#import -#import -#import -#import - -#pragma mark RLMValue - -/** - RLMValue is a property type which represents a polymorphic Realm value. This is similar to the usage of - `AnyObject` / `Any` in Swift. -``` - // A property on `MyObject` - @property (nonatomic) id myAnyValue; - - // A property on `AnotherObject` - @property (nonatomic) id myAnyValue; - - MyObject *myObject = [MyObject createInRealm:realm withValue:@[]]; - myObject.myAnyValue = @1234; // underlying type is NSNumber. - myObject.myAnyValue = @"hello"; // underlying type is NSString. - AnotherObject *anotherObject = [AnotherObject createInRealm:realm withValue:@[]]; - myObject.myAnyValue = anotherObject; // underlying type is RLMObject. -``` - The following types conform to RLMValue: - - `NSData` - `NSDate` - `NSNull` - `NSNumber` - `NSUUID` - `NSString` - `RLMObject - `RLMObjectId` - `RLMDecimal128` - */ -@protocol RLMValue - -/// Describes the type of property stored. -@property (readonly) RLMPropertyType rlm_valueType; - -@end - -/// :nodoc: -@interface NSNull (RLMValue) -@end - -/// :nodoc: -@interface NSNumber (RLMValue) -@end - -/// :nodoc: -@interface NSString (RLMValue) -@end - -/// :nodoc: -@interface NSData (RLMValue) -@end - -/// :nodoc: -@interface NSDate (RLMValue) -@end - -/// :nodoc: -@interface NSUUID (RLMValue) -@end - -/// :nodoc: -@interface RLMDecimal128 (RLMValue) -@end - -/// :nodoc: -@interface RLMObjectBase (RLMValue) -@end - -/// :nodoc: -@interface RLMObjectId (RLMValue) -@end diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/Realm.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/Realm.h deleted file mode 100644 index 245596393..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Headers/Realm.h +++ /dev/null @@ -1,63 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import - -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Info.plist b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Info.plist deleted file mode 100644 index 1e2c7fc7c..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Info.plist and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/LICENSE b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/LICENSE deleted file mode 100644 index 66a27ec5f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/LICENSE +++ /dev/null @@ -1,177 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Modules/module.modulemap b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Modules/module.modulemap deleted file mode 100644 index 519ddc20b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Modules/module.modulemap +++ /dev/null @@ -1,88 +0,0 @@ -framework module Realm { - export Foundation - - umbrella header "Realm.h" - - header "RLMArray.h" - header "RLMAsymmetricObject.h" - header "RLMDecimal128.h" - header "RLMDictionary.h" - header "RLMEmbeddedObject.h" - header "RLMLogger.h" - header "RLMMigration.h" - header "RLMObject.h" - header "RLMObjectId.h" - header "RLMObjectSchema.h" - header "RLMProperty.h" - header "RLMProviderClient.h" - header "RLMRealm+Sync.h" - header "RLMRealm.h" - header "RLMRealmConfiguration.h" - header "RLMResults.h" - header "RLMSchema.h" - header "RLMSectionedResults.h" - header "RLMSet.h" - header "RLMValue.h" - - header "RLMApp.h" - header "RLMCredentials.h" - header "RLMNetworkTransport.h" - header "RLMPushClient.h" - header "RLMRealm+Sync.h" - header "RLMSyncConfiguration.h" - header "RLMSyncManager.h" - header "RLMSyncSession.h" - header "RLMUser.h" - header "RLMUserAPIKey.h" - header "RLMAPIKeyAuth.h" - header "RLMEmailPasswordAuth.h" - header "NSError+RLMSync.h" - header "RLMBSON.h" - header "RLMMongoClient.h" - header "RLMMongoDatabase.h" - header "RLMMongoCollection.h" - header "RLMUpdateResult.h" - header "RLMFindOptions.h" - header "RLMFindOneAndModifyOptions.h" - header "RLMSyncSubscription.h" - - explicit module Private { - header "RLMAccessor.h" - header "RLMApp_Private.h" - header "RLMArray_Private.h" - header "RLMAsyncTask_Private.h" - header "RLMCollection_Private.h" - header "RLMDictionary_Private.h" - header "RLMLogger_Private.h" - header "RLMEvent.h" - header "RLMMongoCollection_Private.h" - header "RLMObjectBase_Dynamic.h" - header "RLMObjectBase_Private.h" - header "RLMObjectSchema_Private.h" - header "RLMObjectStore.h" - header "RLMObject_Private.h" - header "RLMProperty_Private.h" - header "RLMRealmConfiguration_Private.h" - header "RLMRealm_Private.h" - header "RLMResults_Private.h" - header "RLMScheduler.h" - header "RLMSchema_Private.h" - header "RLMSectionedResults.h" - header "RLMSet_Private.h" - header "RLMSwiftCollectionBase.h" - header "RLMSwiftProperty.h" - header "RLMSwiftValueStorage.h" - header "RLMSyncConfiguration_Private.h" - header "RLMSyncSubscription_Private.h" - header "RLMUser_Private.h" - } - - explicit module Dynamic { - header "RLMRealm_Dynamic.h" - header "RLMObjectBase_Dynamic.h" - } - - explicit module Swift { - header "RLMSwiftObject.h" - } -} diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMAccessor.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMAccessor.h deleted file mode 100644 index db915ca7c..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMAccessor.h +++ /dev/null @@ -1,53 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectSchema, RLMProperty, RLMObjectBase; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -// -// Accessors Class Creation/Caching -// - -// get accessor classes for an object class - generates classes if not cached -Class RLMManagedAccessorClassForObjectClass(Class objectClass, RLMObjectSchema *schema, const char *name); -Class RLMUnmanagedAccessorClassForObjectClass(Class objectClass, RLMObjectSchema *schema); - -// -// Dynamic getters/setters -// -FOUNDATION_EXTERN void RLMDynamicValidatedSet(RLMObjectBase *obj, NSString *propName, id __nullable val); -FOUNDATION_EXTERN id __nullable RLMDynamicGet(RLMObjectBase *obj, RLMProperty *prop); -FOUNDATION_EXTERN id __nullable RLMDynamicGetByName(RLMObjectBase *obj, NSString *propName); - -// by property/column -void RLMDynamicSet(RLMObjectBase *obj, RLMProperty *prop, id val); - -// -// Class modification -// - -// Replace className method for the given class -void RLMReplaceClassNameMethod(Class accessorClass, NSString *className); - -// Replace sharedSchema method for the given class -void RLMReplaceSharedSchemaMethod(Class accessorClass, RLMObjectSchema * __nullable schema); - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMApp_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMApp_Private.h deleted file mode 100644 index 5da5c3c7a..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMApp_Private.h +++ /dev/null @@ -1,50 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// Observer block for app notifications. -typedef void(^RLMAppNotificationBlock)(RLMApp *); - -/// Token that identifies an observer. Unsubscribes when deconstructed to -/// avoid dangling observers, therefore this must be retained to hold -/// onto a subscription. -@interface RLMAppSubscriptionToken : NSObject -- (void)unsubscribe; -@end - -@interface RLMApp () -/// Returns all currently cached Apps -+ (NSArray *)allApps; -/// Subscribe to notifications for this RLMApp. -- (RLMAppSubscriptionToken *)subscribe:(RLMAppNotificationBlock)block; - -+ (instancetype)appWithConfiguration:(RLMAppConfiguration *)configuration; - -+ (void)resetAppCache; -@end - -@interface RLMAppConfiguration () -@property (nonatomic) NSString *appId; -@property (nonatomic) BOOL encryptMetadata; -@property (nonatomic) NSURL *rootDirectory; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMArray_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMArray_Private.h deleted file mode 100644 index 1a37f010e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMArray_Private.h +++ /dev/null @@ -1,44 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -@class RLMObjectBase, RLMProperty; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMArray () -- (instancetype)initWithObjectClassName:(NSString *)objectClassName; -- (instancetype)initWithObjectType:(RLMPropertyType)type optional:(BOOL)optional; -- (NSString *)descriptionWithMaxDepth:(NSUInteger)depth; -- (void)setParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -- (void)replaceAllObjectsWithObjects:(NSArray *)objects; -// YES if the property is declared with old property syntax. -@property (nonatomic, readonly) BOOL isLegacyProperty; -// The name of the property which this collection represents -@property (nonatomic, readonly) NSString *propertyKey; -@end - -@interface RLMManagedArray : RLMArray -- (instancetype)initWithParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -@end - -void RLMArrayValidateMatchingObjectType(RLMArray *array, id value); - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMAsyncTask_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMAsyncTask_Private.h deleted file mode 100644 index 3cce89441..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMAsyncTask_Private.h +++ /dev/null @@ -1,71 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import "RLMRealm_Private.h" - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMAsyncOpenTask () -@property (nonatomic, nullable) RLMRealm *localRealm; - -- (instancetype)initWithConfiguration:(RLMRealmConfiguration *)configuration - confinedTo:(RLMScheduler *)confinement - download:(bool)waitForDownloadCompletion - completion:(RLMAsyncOpenRealmCallback)completion -__attribute__((objc_direct)); - -- (instancetype)initWithConfiguration:(RLMRealmConfiguration *)configuration - confinedTo:(RLMScheduler *)confinement - download:(bool)waitForDownloadCompletion; - -- (void)waitWithCompletion:(void (^)(NSError *_Nullable))completion; -- (void)waitForOpen:(RLMAsyncOpenRealmCallback)completion __attribute__((objc_direct)); -@end - -// A cancellable task for waiting for downloads on an already-open Realm. -RLM_SWIFT_SENDABLE -@interface RLMAsyncDownloadTask : NSObject -- (instancetype)initWithRealm:(RLMRealm *)realm; -- (void)cancel; -- (void)waitWithCompletion:(void (^)(NSError *_Nullable))completion; -@end - -// A cancellable task for beginning an async write -RLM_SWIFT_SENDABLE -@interface RLMAsyncWriteTask : NSObject -// Must only be called from within the Actor -- (instancetype)initWithRealm:(RLMRealm *)realm; -- (void)setTransactionId:(RLMAsyncTransactionId)transactionID; -- (void)complete:(bool)cancel; - -// Can be called from any thread -- (void)wait:(void (^)(void))completion; -@end - -typedef void (^RLMAsyncRefreshCompletion)(bool); -// A cancellable task for refreshing a Realm -RLM_SWIFT_SENDABLE -@interface RLMAsyncRefreshTask : NSObject -- (void)complete:(bool)didRefresh; -- (void)wait:(RLMAsyncRefreshCompletion)completion; -+ (RLMAsyncRefreshTask *)completedRefresh; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMBSON_Private.hpp b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMBSON_Private.hpp deleted file mode 100644 index c5cc1a410..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMBSON_Private.hpp +++ /dev/null @@ -1,32 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -namespace realm::bson { -class Bson; -template class IndexedMap; -using BsonDocument = IndexedMap; -} - -realm::bson::Bson RLMConvertRLMBSONToBson(id b); -realm::bson::BsonDocument RLMConvertRLMBSONArrayToBsonDocument(NSArray> *array); -id RLMConvertBsonToRLMBSON(const realm::bson::Bson& b); -id RLMConvertBsonDocumentToRLMBSON(std::optional b); -NSArray> *RLMConvertBsonDocumentToRLMBSONArray(std::optional b); diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMCollection_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMCollection_Private.h deleted file mode 100644 index 7d31bd3f0..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMCollection_Private.h +++ /dev/null @@ -1,42 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@protocol RLMCollectionPrivate; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -NSUInteger RLMUnmanagedFastEnumerate(id collection, NSFastEnumerationState *); -void RLMCollectionSetValueForKey(id collection, NSString *key, id _Nullable value); -FOUNDATION_EXTERN NSString *RLMDescriptionWithMaxDepth(NSString *name, id collection, NSUInteger depth); -FOUNDATION_EXTERN void RLMAssignToCollection(id collection, id value); -FOUNDATION_EXTERN void RLMSetSwiftBridgeCallback(id _Nullable (*_Nonnull)(id)); - -FOUNDATION_EXTERN -RLMNotificationToken *RLMAddNotificationBlock(id collection, id block, - NSArray *_Nullable keyPaths, - dispatch_queue_t _Nullable queue); - -typedef RLM_CLOSED_ENUM(int32_t, RLMCollectionType) { - RLMCollectionTypeArray = 0, - RLMCollectionTypeSet = 1, - RLMCollectionTypeDictionary = 2 -}; - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMDictionary_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMDictionary_Private.h deleted file mode 100644 index 37ff740c7..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMDictionary_Private.h +++ /dev/null @@ -1,46 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectBase, RLMProperty; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMDictionary () -- (instancetype)initWithObjectClassName:(NSString *)objectClassName keyType:(RLMPropertyType)keyType; -- (instancetype)initWithObjectType:(RLMPropertyType)type optional:(BOOL)optional keyType:(RLMPropertyType)keyType; -- (NSString *)descriptionWithMaxDepth:(NSUInteger)depth; -- (void)setParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -// YES if the property is declared with old property syntax. -@property (nonatomic, readonly) BOOL isLegacyProperty; -// The name of the property which this collection represents -@property (nonatomic, readonly) NSString *propertyKey; -@end - -@interface RLMManagedDictionary : RLMDictionary -- (instancetype)initWithParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -@end - -FOUNDATION_EXTERN NSString *RLMDictionaryDescriptionWithMaxDepth(NSString *name, - RLMDictionary *dictionary, - NSUInteger depth); -id RLMDictionaryKey(RLMDictionary *dictionary, id key) RLM_HIDDEN; -id RLMDictionaryValue(RLMDictionary *dictionary, id value) RLM_HIDDEN; - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMEvent.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMEvent.h deleted file mode 100644 index 9a6acb1a6..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMEvent.h +++ /dev/null @@ -1,64 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2022 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#ifdef __cplusplus -#include - -namespace realm { -struct AuditConfig; -} -#endif - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMRealm, RLMUser, RLMRealmConfiguration; -typedef RLM_CLOSED_ENUM(NSUInteger, RLMSyncLogLevel); - -struct RLMEventContext; -typedef void (^RLMEventCompletion)(NSError *_Nullable); - -FOUNDATION_EXTERN struct RLMEventContext *_Nullable RLMEventGetContext(RLMRealm *realm); -FOUNDATION_EXTERN uint64_t RLMEventBeginScope(struct RLMEventContext *context, NSString *activity); -FOUNDATION_EXTERN void RLMEventCommitScope(struct RLMEventContext *context, uint64_t scope_id, - RLMEventCompletion _Nullable completion); -FOUNDATION_EXTERN void RLMEventCancelScope(struct RLMEventContext *context, uint64_t scope_id); -FOUNDATION_EXTERN bool RLMEventIsActive(struct RLMEventContext *context, uint64_t scope_id); -FOUNDATION_EXTERN void RLMEventRecordEvent(struct RLMEventContext *context, NSString *activity, - NSString *_Nullable event, NSString *_Nullable data, - RLMEventCompletion _Nullable completion); -FOUNDATION_EXTERN void RLMEventUpdateMetadata(struct RLMEventContext *context, - NSDictionary *newMetadata); - -@interface RLMEventConfiguration : NSObject -@property (nonatomic) NSString *partitionPrefix; -@property (nonatomic, nullable) RLMUser *syncUser; -@property (nonatomic, nullable) NSDictionary *metadata; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" -@property (nonatomic, nullable) void (^logger)(RLMSyncLogLevel, NSString *); -#pragma clang diagnostic pop -@property (nonatomic, nullable) RLM_SWIFT_SENDABLE void (^errorHandler)(NSError *); - -#ifdef __cplusplus -- (std::shared_ptr)auditConfigWithRealmConfiguration:(RLMRealmConfiguration *)realmConfig; -#endif -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMLogger_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMLogger_Private.h deleted file mode 100644 index 08f8c591e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMLogger_Private.h +++ /dev/null @@ -1,36 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMLogger() - -/** - Log a message to the supplied level. - - @param logLevel The log level for the message. - @param message The message to log. - */ -- (void)logWithLevel:(RLMLogLevel)logLevel message:(NSString *)message, ... NS_SWIFT_UNAVAILABLE(""); -- (void)logLevel:(RLMLogLevel)logLevel message:(NSString *)message; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMMigration_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMMigration_Private.h deleted file mode 100644 index 393f41184..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMMigration_Private.h +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import -#import - -namespace realm { - class Schema; -} - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMMigration () - -@property (nonatomic, strong) RLMRealm *oldRealm; -@property (nonatomic, strong) RLMRealm *realm; - -- (instancetype)initWithRealm:(RLMRealm *)realm oldRealm:(RLMRealm *)oldRealm schema:(realm::Schema &)schema; - -- (void)execute:(RLMMigrationBlock)block objectClass:(_Nullable Class)cls; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMMongoCollection_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMMongoCollection_Private.h deleted file mode 100644 index 77bbf9752..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMMongoCollection_Private.h +++ /dev/null @@ -1,37 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@class RLMUser; - -@interface RLMMongoCollection () -- (instancetype)initWithUser:(RLMUser *)user - serviceName:(NSString *)serviceName - databaseName:(NSString *)databaseName - collectionName:(NSString *)collectionName; - -- (RLMChangeStream *)watchWithMatchFilter:(nullable id)matchFilter - idFilter:(nullable id)idFilter - delegate:(id)delegate - scheduler:(void (^)(dispatch_block_t))scheduler; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMObjectBase_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMObjectBase_Private.h deleted file mode 100644 index af547b17e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMObjectBase_Private.h +++ /dev/null @@ -1,34 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2017 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMArray; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -// RLMObjectBase private -@interface RLMObjectBase () -@property (nonatomic, nullable) NSMutableArray *lastAccessedNames; - -+ (void)initializeLinkedObjectSchemas; -+ (bool)isEmbedded; -+ (bool)isAsymmetric; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMObjectSchema_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMObjectSchema_Private.h deleted file mode 100644 index 08855a82b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMObjectSchema_Private.h +++ /dev/null @@ -1,75 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -// RLMObjectSchema private -@interface RLMObjectSchema () { -@public - bool _isSwiftClass; -} - -/// The object type name reported to the object store and core. -@property (nonatomic, readonly) NSString *objectName; - -// writable redeclaration -@property (nonatomic, readwrite, copy) NSArray *properties; -@property (nonatomic, readwrite, assign) bool isSwiftClass; -@property (nonatomic, readwrite, assign) BOOL isEmbedded; -@property (nonatomic, readwrite, assign) BOOL isAsymmetric; - -// class used for this object schema -@property (nonatomic, readwrite, assign) Class objectClass; -@property (nonatomic, readwrite, assign) Class accessorClass; -@property (nonatomic, readwrite, assign) Class unmanagedClass; - -@property (nonatomic, readwrite, assign) bool hasCustomEventSerialization; - -@property (nonatomic, readwrite, nullable) RLMProperty *primaryKeyProperty; - -@property (nonatomic, copy) NSArray *computedProperties; -@property (nonatomic, readonly, nullable) NSArray *swiftGenericProperties; - -// returns a cached or new schema for a given object class -+ (instancetype)schemaForObjectClass:(Class)objectClass; -@end - -@interface RLMObjectSchema (Dynamic) -/** - This method is useful only in specialized circumstances, for example, when accessing objects - in a Realm produced externally. If you are simply building an app on Realm, it is not recommended - to use this method as an [RLMObjectSchema](RLMObjectSchema) is generated automatically for every [RLMObject](RLMObject) subclass. - - Initialize an RLMObjectSchema with classname, objectClass, and an array of properties - - @warning This method is useful only in specialized circumstances. - - @param objectClassName The name of the class used to refer to objects of this type. - @param objectClass The Objective-C class used when creating instances of this type. - @param properties An array of RLMProperty instances describing the managed properties for this type. - - @return An initialized instance of RLMObjectSchema. - */ -- (instancetype)initWithClassName:(NSString *)objectClassName objectClass:(Class)objectClass properties:(NSArray *)properties; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMObjectStore.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMObjectStore.h deleted file mode 100644 index 6045f1e8e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMObjectStore.h +++ /dev/null @@ -1,98 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#ifdef __cplusplus -extern "C" { -#endif - -@class RLMRealm, RLMSchema, RLMObjectBase, RLMResults, RLMProperty; - -typedef NS_ENUM(NSUInteger, RLMUpdatePolicy) { - RLMUpdatePolicyError = 1, - RLMUpdatePolicyUpdateChanged = 3, - RLMUpdatePolicyUpdateAll = 2, -}; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -void RLMVerifyHasPrimaryKey(Class cls); - -void RLMVerifyInWriteTransaction(RLMRealm *const realm); - -// -// Adding, Removing, Getting Objects -// - -// add an object to the given realm -void RLMAddObjectToRealm(RLMObjectBase *object, RLMRealm *realm, RLMUpdatePolicy); - -// delete an object from its realm -void RLMDeleteObjectFromRealm(RLMObjectBase *object, RLMRealm *realm); - -// deletes all objects from a realm -void RLMDeleteAllObjectsFromRealm(RLMRealm *realm); - -// get objects of a given class -RLMResults *RLMGetObjects(RLMRealm *realm, NSString *objectClassName, NSPredicate * _Nullable predicate) -NS_RETURNS_RETAINED; - -// get an object with the given primary key -id _Nullable RLMGetObject(RLMRealm *realm, NSString *objectClassName, id _Nullable key) NS_RETURNS_RETAINED; - -// create object from array or dictionary -RLMObjectBase *RLMCreateObjectInRealmWithValue(RLMRealm *realm, NSString *className, - id _Nullable value, RLMUpdatePolicy updatePolicy) -NS_RETURNS_RETAINED; - -// creates an asymmetric object and doesn't return -void RLMCreateAsymmetricObjectInRealm(RLMRealm *realm, NSString *className, id value); - -// -// Accessor Creation -// - - -// Perform the per-property accessor initialization for a managed RealmSwiftObject -// promotingExisting should be true if the object was previously used as an -// unmanaged object, and false if it is a newly created object. -void RLMInitializeSwiftAccessor(RLMObjectBase *object, bool promotingExisting); - -#ifdef __cplusplus -} - -namespace realm { - class Obj; - class Table; - struct ColKey; - struct ObjLink; -} -class RLMClassInfo; - -// get an object with a given table & object key -RLMObjectBase *RLMObjectFromObjLink(RLMRealm *realm, - realm::ObjLink&& objLink, - bool parentIsSwiftObject) NS_RETURNS_RETAINED; - -// Create accessors -RLMObjectBase *RLMCreateObjectAccessor(RLMClassInfo& info, int64_t key) NS_RETURNS_RETAINED; -RLMObjectBase *RLMCreateObjectAccessor(RLMClassInfo& info, const realm::Obj& obj) NS_RETURNS_RETAINED; -#endif - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMObject_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMObject_Private.h deleted file mode 100644 index 8ccdbf576..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMObject_Private.h +++ /dev/null @@ -1,110 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMProperty, RLMArray, RLMSchema; -typedef NS_ENUM(int32_t, RLMPropertyType); - -FOUNDATION_EXTERN void RLMInitializeWithValue(RLMObjectBase *, id, RLMSchema *); - -typedef void (^RLMObjectNotificationCallback)(RLMObjectBase *_Nullable object, - NSArray *_Nullable propertyNames, - NSArray *_Nullable oldValues, - NSArray *_Nullable newValues, - NSError *_Nullable error); - -// RLMObject accessor and read/write realm -@interface RLMObjectBase () { -@public - RLMRealm *_realm; - __unsafe_unretained RLMObjectSchema *_objectSchema; -} - -// shared schema for this class -+ (nullable RLMObjectSchema *)sharedSchema; - -+ (nullable NSArray *)_getProperties; -+ (bool)_realmIgnoreClass; - -// This enables to override the propertiesMapping in Swift, it is not to be used in Objective-C API. -+ (NSDictionary *)propertiesMapping; -@end - -@interface RLMDynamicObject : RLMObject - -@end - -// Calls valueForKey: and re-raises NSUndefinedKeyExceptions -FOUNDATION_EXTERN id _Nullable RLMValidatedValueForProperty(id object, NSString *key, NSString *className); - -// Compare two RLObjectBases -FOUNDATION_EXTERN BOOL RLMObjectBaseAreEqual(RLMObjectBase * _Nullable o1, RLMObjectBase * _Nullable o2); - -FOUNDATION_EXTERN RLMNotificationToken *RLMObjectBaseAddNotificationBlock(RLMObjectBase *obj, - NSArray *_Nullable keyPaths, - dispatch_queue_t _Nullable queue, - RLMObjectNotificationCallback block); - -RLMNotificationToken *RLMObjectAddNotificationBlock(RLMObjectBase *obj, - RLMObjectChangeBlock block, - NSArray *_Nullable keyPaths, - dispatch_queue_t _Nullable queue); - -// Returns whether the class is a descendent of RLMObjectBase -FOUNDATION_EXTERN BOOL RLMIsObjectOrSubclass(Class klass); - -// Returns whether the class is an indirect descendant of RLMObjectBase -FOUNDATION_EXTERN BOOL RLMIsObjectSubclass(Class klass); - -FOUNDATION_EXTERN const NSUInteger RLMDescriptionMaxDepth; - -FOUNDATION_EXTERN id RLMObjectFreeze(RLMObjectBase *obj) NS_RETURNS_RETAINED; - -FOUNDATION_EXTERN id RLMObjectThaw(RLMObjectBase *obj); - -// Gets an object identifier suitable for use with Combine. This value may -// change when an unmanaged object is added to the Realm. -FOUNDATION_EXTERN uint64_t RLMObjectBaseGetCombineId(RLMObjectBase *); - -// An accessor object which is used to interact with Swift properties from obj-c -@interface RLMManagedPropertyAccessor : NSObject -// Perform any initialization required for KVO on a *unmanaged* object -+ (void)observe:(RLMProperty *)property on:(RLMObjectBase *)parent; -// Initialize the given property on a *managed* object which previous was unmanaged -+ (void)promote:(RLMProperty *)property on:(RLMObjectBase *)parent; -// Initialize the given property on a newly created *managed* object -+ (void)initialize:(RLMProperty *)property on:(RLMObjectBase *)parent; -// Read the value of the property, on either kind of object -+ (id)get:(RLMProperty *)property on:(RLMObjectBase *)parent; -// Set the property to the given value, on either kind of object -+ (void)set:(RLMProperty *)property on:(RLMObjectBase *)parent to:(id)value; -@end - -@interface RLMObjectNotificationToken : RLMNotificationToken -- (void)observe:(RLMObjectBase *)obj - keyPaths:(nullable NSArray *)keyPaths - block:(RLMObjectNotificationCallback)block; -- (void)registrationComplete:(void (^)(void))completion; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMProperty_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMProperty_Private.h deleted file mode 100644 index 6a87ced63..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMProperty_Private.h +++ /dev/null @@ -1,139 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -@class RLMObjectBase; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -BOOL RLMPropertyTypeIsComputed(RLMPropertyType propertyType); -FOUNDATION_EXTERN void RLMValidateSwiftPropertyName(NSString *name); - -// Translate an rlmtype to a string representation -static inline NSString *RLMTypeToString(RLMPropertyType type) { - switch (type) { - case RLMPropertyTypeString: - return @"string"; - case RLMPropertyTypeInt: - return @"int"; - case RLMPropertyTypeBool: - return @"bool"; - case RLMPropertyTypeDate: - return @"date"; - case RLMPropertyTypeData: - return @"data"; - case RLMPropertyTypeDouble: - return @"double"; - case RLMPropertyTypeFloat: - return @"float"; - case RLMPropertyTypeAny: - return @"mixed"; - case RLMPropertyTypeObject: - return @"object"; - case RLMPropertyTypeLinkingObjects: - return @"linking objects"; - case RLMPropertyTypeDecimal128: - return @"decimal128"; - case RLMPropertyTypeObjectId: - return @"object id"; - case RLMPropertyTypeUUID: - return @"uuid"; - } - return @"Unknown"; -} - -// private property interface -@interface RLMProperty () { -@public - RLMPropertyType _type; -} - -- (instancetype)initWithName:(NSString *)name - indexed:(BOOL)indexed - linkPropertyDescriptor:(nullable RLMPropertyDescriptor *)linkPropertyDescriptor - property:(objc_property_t)property; - -- (instancetype)initSwiftPropertyWithName:(NSString *)name - indexed:(BOOL)indexed - linkPropertyDescriptor:(nullable RLMPropertyDescriptor *)linkPropertyDescriptor - property:(objc_property_t)property - instance:(RLMObjectBase *)objectInstance; - -- (void)updateAccessors; - -// private setters -@property (nonatomic, readwrite) NSString *name; -@property (nonatomic, readwrite, assign) RLMPropertyType type; -@property (nonatomic, readwrite) BOOL indexed; -@property (nonatomic, readwrite) BOOL optional; -@property (nonatomic, readwrite) BOOL array; -@property (nonatomic, readwrite) BOOL set; -@property (nonatomic, readwrite) BOOL dictionary; -@property (nonatomic, copy, nullable) NSString *objectClassName; -@property (nonatomic, copy, nullable) NSString *linkOriginPropertyName; - -// private properties -@property (nonatomic, readwrite, nullable) NSString *columnName; -@property (nonatomic, assign) NSUInteger index; -@property (nonatomic, assign) BOOL isPrimary; -@property (nonatomic, assign) BOOL isLegacy; -@property (nonatomic, assign) ptrdiff_t swiftIvar; -@property (nonatomic, assign, nullable) Class swiftAccessor; -@property (nonatomic, readwrite, assign) RLMPropertyType dictionaryKeyType; -@property (nonatomic, readwrite) BOOL customMappingIsOptional; - -// getter and setter names -@property (nonatomic, copy) NSString *getterName; -@property (nonatomic, copy) NSString *setterName; -@property (nonatomic, nullable) SEL getterSel; -@property (nonatomic, nullable) SEL setterSel; - -- (RLMProperty *)copyWithNewName:(NSString *)name; -- (NSString *)typeName; - -@end - -@interface RLMProperty (Dynamic) -/** - This method is useful only in specialized circumstances, for example, in conjunction with - +[RLMObjectSchema initWithClassName:objectClass:properties:]. If you are simply building an - app on Realm, it is not recommended to use this method. - - Initialize an RLMProperty - - @warning This method is useful only in specialized circumstances. - - @param name The property name. - @param type The property type. - @param objectClassName The object type used for Object and Array types. - @param linkOriginPropertyName The property name of the origin of a link. Used for linking objects properties. - - @return An initialized instance of RLMProperty. - */ -- (instancetype)initWithName:(NSString *)name - type:(RLMPropertyType)type - objectClassName:(nullable NSString *)objectClassName - linkOriginPropertyName:(nullable NSString *)linkOriginPropertyName - indexed:(BOOL)indexed - optional:(BOOL)optional; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMPushClient_Private.hpp b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMPushClient_Private.hpp deleted file mode 100644 index 44304c9c3..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMPushClient_Private.hpp +++ /dev/null @@ -1,28 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import "RLMPushClient.h" - -namespace realm::app { -class PushClient; -} - -RLM_DIRECT_MEMBERS -@interface RLMPushClient () -- (instancetype)initWithPushClient:(realm::app::PushClient&&)pushClient; -@end diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMRealmConfiguration_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMRealmConfiguration_Private.h deleted file mode 100644 index 12b09676d..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMRealmConfiguration_Private.h +++ /dev/null @@ -1,52 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2015 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMSchema, RLMEventConfiguration; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMRealmConfiguration () - -@property (nonatomic, readwrite) bool cache; -@property (nonatomic, readwrite) bool dynamic; -@property (nonatomic, readwrite) bool disableFormatUpgrade; -@property (nonatomic, copy, nullable) RLMSchema *customSchema; -@property (nonatomic, copy) NSString *pathOnDisk; -@property (nonatomic, retain, nullable) RLMEventConfiguration *eventConfiguration; -@property (nonatomic, nullable) Class migrationObjectClass; -@property (nonatomic) bool disableAutomaticChangeNotifications; - -// Flexible Sync -@property (nonatomic, readwrite, nullable) RLMFlexibleSyncInitialSubscriptionsBlock initialSubscriptions; -@property (nonatomic, readwrite) BOOL rerunOnOpen; - -// Get the default configuration without copying it -+ (RLMRealmConfiguration *)rawDefaultConfiguration; - -+ (void)resetRealmConfigurationState; - -- (void)setCustomSchemaWithoutCopying:(nullable RLMSchema *)schema; -@end - -// Get a path in the platform-appropriate documents directory with the given filename -FOUNDATION_EXTERN NSString *RLMRealmPathForFile(NSString *fileName); -FOUNDATION_EXTERN NSString *RLMRealmPathForFileAndBundleIdentifier(NSString *fileName, NSString *mainBundleIdentifier); - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMRealm_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMRealm_Private.h deleted file mode 100644 index 95841491f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMRealm_Private.h +++ /dev/null @@ -1,94 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMFastEnumerator, RLMScheduler, RLMAsyncRefreshTask, RLMAsyncWriteTask; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -// Disable syncing files to disk. Cannot be re-enabled. Use only for tests. -FOUNDATION_EXTERN void RLMDisableSyncToDisk(void); -// Set whether the skip backup attribute should be set on temporary files. -FOUNDATION_EXTERN void RLMSetSkipBackupAttribute(bool value); - -FOUNDATION_EXTERN NSData * _Nullable RLMRealmValidatedEncryptionKey(NSData *key); - -// Set the queue used for async open. For testing purposes only. -FOUNDATION_EXTERN void RLMSetAsyncOpenQueue(dispatch_queue_t queue); - -// Translate an in-flight exception resulting from an operation on a SharedGroup to -// an NSError or NSException (if error is nil) -void RLMRealmTranslateException(NSError **error); - -// Block until the Realm at the given path is closed. -FOUNDATION_EXTERN void RLMWaitForRealmToClose(NSString *path); -BOOL RLMIsRealmCachedAtPath(NSString *path); - -// Register a block to be called from the next before_notify() invocation -FOUNDATION_EXTERN void RLMAddBeforeNotifyBlock(RLMRealm *realm, dispatch_block_t block); - -// Test hook to run the async notifiers for a Realm which has the background thread disabled -FOUNDATION_EXTERN void RLMRunAsyncNotifiers(NSString *path); - -// Get the cached Realm for the given configuration and scheduler, if any -FOUNDATION_EXTERN RLMRealm *_Nullable RLMGetCachedRealm(RLMRealmConfiguration *, RLMScheduler *) NS_RETURNS_RETAINED; -// Get a cached Realm for the given configuration and any scheduler. The returned -// Realm is not confined to the current thread, so very few operations are safe -// to perform on it -FOUNDATION_EXTERN RLMRealm *_Nullable RLMGetAnyCachedRealm(RLMRealmConfiguration *) NS_RETURNS_RETAINED; - -// Scheduler an async refresh for the given Realm -FOUNDATION_EXTERN RLMAsyncRefreshTask *_Nullable RLMRealmRefreshAsync(RLMRealm *rlmRealm) NS_RETURNS_RETAINED; - -// RLMRealm private members -@interface RLMRealm () -@property (nonatomic, readonly) BOOL dynamic; -@property (nonatomic, readwrite) RLMSchema *schema; -@property (nonatomic, readonly, nullable) id actor; -@property (nonatomic, readonly) bool isFlexibleSync; - -+ (void)resetRealmState; - -- (void)registerEnumerator:(RLMFastEnumerator *)enumerator; -- (void)unregisterEnumerator:(RLMFastEnumerator *)enumerator; -- (void)detachAllEnumerators; - -- (void)sendNotifications:(RLMNotification)notification; -- (void)verifyThread; -- (void)verifyNotificationsAreSupported:(bool)isCollection; - -- (RLMRealm *)frozenCopy NS_RETURNS_RETAINED; - -+ (nullable instancetype)realmWithConfiguration:(RLMRealmConfiguration *)configuration - confinedTo:(RLMScheduler *)options - error:(NSError **)error; - -- (RLMAsyncWriteTask *)beginAsyncWrite NS_RETURNS_RETAINED; -- (void)commitAsyncWriteWithGrouping:(bool)allowGrouping - completion:(void(^)(NSError *_Nullable))completion; -@end - -@interface RLMPinnedRealm : NSObject -@property (nonatomic, readonly) RLMRealmConfiguration *configuration; - -- (instancetype)initWithRealm:(RLMRealm *)realm; -- (void)unpin; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMResults_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMResults_Private.h deleted file mode 100644 index c7e29bebb..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMResults_Private.h +++ /dev/null @@ -1,33 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectSchema; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMResults () -@property (nonatomic, readonly, getter=isAttached) BOOL attached; - -+ (instancetype)emptyDetachedResults; -- (RLMResults *)snapshot; - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMScheduler.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMScheduler.h deleted file mode 100644 index 3c1b9874b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMScheduler.h +++ /dev/null @@ -1,63 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#ifdef __cplusplus -#include -namespace realm::util { -class Scheduler; -} -#endif - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -// A serial work queue of some sort which represents a thread-confinement context -// of some sort which blocks can be invoked inside. Realms are confined to a -// scheduler, which can be a thread (actually a run loop), a dispatch queue, or -// an actor. The scheduler ensures that the Realm is only used on one thread at -// a time, and allows us to dispatch work to the thread where we can access the -// Realm safely. -RLM_SWIFT_SENDABLE // is immutable -@interface RLMScheduler : NSObject -+ (RLMScheduler *)mainRunLoop __attribute__((objc_direct)); -+ (RLMScheduler *)currentRunLoop __attribute__((objc_direct)); -// A scheduler for the given queue if it's non-nil, and currentRunLoop otherwise -+ (RLMScheduler *)dispatchQueue:(nullable dispatch_queue_t)queue; -+ (RLMScheduler *)actor:(id)actor invoke:(void (^)(dispatch_block_t))invoke - verify:(void (^)(void))verify; - -// Invoke the block on this scheduler. Currently not actually implement for run -// loop schedulers. -- (void)invoke:(dispatch_block_t)block; - -// Cache key for this scheduler suitable for use with NSMapTable. Only valid -// when called from the current scheduler. -- (void *)cacheKey; - -- (nullable id)actor; - -#ifdef __cplusplus -// The object store Scheduler corresponding to this scheduler -- (std::shared_ptr)osScheduler; -#endif -@end - -FOUNDATION_EXTERN void RLMSetMainActor(id actor); - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMSchema_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMSchema_Private.h deleted file mode 100644 index f4f63c9f8..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMSchema_Private.h +++ /dev/null @@ -1,58 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@class RLMRealm; - -// -// RLMSchema private interface -// -@interface RLMSchema () - -/** - Returns an `RLMSchema` containing only the given `RLMObject` subclasses. - - @param classes The classes to be included in the schema. - - @return An `RLMSchema` containing only the given classes. - */ -+ (instancetype)schemaWithObjectClasses:(NSArray *)classes; - -@property (nonatomic, readwrite, copy) NSArray *objectSchema; - -// schema based on runtime objects -+ (instancetype)sharedSchema; - -// schema based upon all currently registered object classes -+ (instancetype)partialSharedSchema; - -// private schema based upon all currently registered object classes. -// includes classes that are excluded from the default schema. -+ (instancetype)partialPrivateSharedSchema; - -// class for string -+ (nullable Class)classForString:(NSString *)className; - -+ (nullable RLMObjectSchema *)sharedSchemaForClass:(Class)cls; - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMSet_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMSet_Private.h deleted file mode 100644 index 1053e0a0f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMSet_Private.h +++ /dev/null @@ -1,43 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -@class RLMObjectBase, RLMProperty; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMSet () -- (instancetype)initWithObjectClassName:(NSString *)objectClassName; -- (instancetype)initWithObjectType:(RLMPropertyType)type optional:(BOOL)optional; -- (NSString *)descriptionWithMaxDepth:(NSUInteger)depth; -- (void)setParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -// YES if the property is declared with old property syntax. -@property (nonatomic, readonly) BOOL isLegacyProperty; -// The name of the property which this collection represents -@property (nonatomic, readonly) NSString *propertyKey; -@end - -void RLMSetValidateMatchingObjectType(RLMSet *set, id value); - -@interface RLMManagedSet : RLMSet -- (instancetype)initWithParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMSwiftCollectionBase.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMSwiftCollectionBase.h deleted file mode 100644 index a4f864282..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMSwiftCollectionBase.h +++ /dev/null @@ -1,46 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectBase, RLMResults, RLMProperty, RLMLinkingObjects; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMSwiftCollectionBase : NSProxy -@property (nonatomic, strong) id _rlmCollection; - -- (instancetype)init; -+ (Class)_backingCollectionType; -- (instancetype)initWithCollection:(id)collection; - -- (nullable id)valueForKey:(NSString *)key; -- (nullable id)valueForKeyPath:(NSString *)keyPath; -- (BOOL)isEqual:(nullable id)object; -@end - -@interface RLMLinkingObjectsHandle : NSObject -- (instancetype)initWithObject:(RLMObjectBase *)object property:(RLMProperty *)property; -- (instancetype)initWithLinkingObjects:(RLMResults *)linkingObjects; - -@property (nonatomic, readonly) RLMLinkingObjects *results; -@property (nonatomic, readonly) NSString *_propertyKey; -@property (nonatomic, readonly) BOOL _isLegacyProperty; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMSwiftSupport.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMSwiftSupport.h deleted file mode 100644 index 530f0edbf..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMSwiftSupport.h +++ /dev/null @@ -1,30 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMSwiftSupport : NSObject - -+ (BOOL)isSwiftClassName:(NSString *)className; -+ (NSString *)demangleClassName:(NSString *)className; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMSwiftValueStorage.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMSwiftValueStorage.h deleted file mode 100644 index ef3efc610..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMSwiftValueStorage.h +++ /dev/null @@ -1,53 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectBase, RLMProperty; - -/// This class implements the backing storage for `RealmProperty<>` and `RealmOptional<>`. -/// This class should not be subclassed or used directly. -@interface RLMSwiftValueStorage : NSProxy -- (instancetype)init; -@end -/// Retrieves the value that is stored, or nil if it is empty. -FOUNDATION_EXTERN id _Nullable RLMGetSwiftValueStorage(RLMSwiftValueStorage *); -/// Sets a value on the property this instance represents for an object. -FOUNDATION_EXTERN void RLMSetSwiftValueStorage(RLMSwiftValueStorage *, id _Nullable); - -/// Initialises managed accessors on an instance of `RLMSwiftValueStorage` -/// @param parent The enclosing parent object. -/// @param prop The property which this class represents. -FOUNDATION_EXTERN void RLMInitializeManagedSwiftValueStorage(RLMSwiftValueStorage *, - RLMObjectBase *parent, - RLMProperty *prop); - -/// Initialises unmanaged accessors on an instance of `RLMSwiftValueStorage` -/// @param parent The enclosing parent object. -/// @param prop The property which this class represents. -FOUNDATION_EXTERN void RLMInitializeUnmanagedSwiftValueStorage(RLMSwiftValueStorage *, - RLMObjectBase *parent, - RLMProperty *prop); - -/// Gets the property name for the RealmProperty instance. This is required for tracing the key path on -/// objects that use the legacy property declaration syntax. -FOUNDATION_EXTERN NSString *RLMSwiftValueStorageGetPropertyName(RLMSwiftValueStorage *); - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMSyncConfiguration_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMSyncConfiguration_Private.h deleted file mode 100644 index 62d0e1f1f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMSyncConfiguration_Private.h +++ /dev/null @@ -1,47 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -typedef RLM_CLOSED_ENUM(NSUInteger, RLMSyncStopPolicy) { - RLMSyncStopPolicyImmediately, - RLMSyncStopPolicyLiveIndefinitely, - RLMSyncStopPolicyAfterChangesUploaded, -}; - - -@class RLMSchema; - -@interface RLMSyncConfiguration () - -// Flexible sync -- (instancetype)initWithUser:(RLMUser *)user; -// Partition-based sync -- (instancetype)initWithUser:(RLMUser *)user - partitionValue:(nullable id)partitionValue; - -// Internal-only APIs -@property (nonatomic, readwrite) RLMSyncStopPolicy stopPolicy; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMSyncSubscription_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMSyncSubscription_Private.h deleted file mode 100644 index dc438a20e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMSyncSubscription_Private.h +++ /dev/null @@ -1,70 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -#pragma mark - Subscription - -@interface RLMSyncSubscription () - -@property (nonatomic, readonly) RLMObjectId *identifier; - -@property (nonatomic, readonly) NSString *queryString; - -@property (nonatomic, readonly) NSString *objectClassName; - -@end - -#pragma mark - SubscriptionSet - -@interface RLMSyncSubscriptionEnumerator : NSObject - -@property (nonatomic, readonly) RLMSyncSubscriptionSet *subscriptionSet; - -- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state - count:(NSUInteger)len; - -- (instancetype)initWithSubscriptionSet:(RLMSyncSubscriptionSet *)subscriptionSet; - -@end - -@interface RLMSyncSubscriptionSet () - -@property (readonly) uint64_t version; - -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - subscriptionName:(nullable NSString *)name - predicate:(NSPredicate *)predicate - updateExisting:(BOOL)updateExisting; - -- (void)waitForSynchronizationOnQueue:(nullable dispatch_queue_t)queue - completionBlock:(void(^)(NSError *))completionBlock; - -- (RLMSyncSubscriptionEnumerator *)fastEnumerator; - -NSUInteger RLMFastEnumerate(NSFastEnumerationState *state, - NSUInteger len, - RLMSyncSubscriptionSet *collection); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMUser_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMUser_Private.h deleted file mode 100644 index f62c9a940..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/PrivateHeaders/RLMUser_Private.h +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// Observer block for user notifications. -typedef void(^RLMUserNotificationBlock)(RLMUser *); - -/// Token that identifies an observer. Unsubscribes when deconstructed to -/// avoid dangling observers, therefore this must be retained to hold -/// onto a subscription. -@interface RLMUserSubscriptionToken : NSObject -- (void)unsubscribe; -@end - -@interface RLMUser () -/// Subscribe to notifications for this RLMUser. -- (RLMUserSubscriptionToken *)subscribe:(RLMUserNotificationBlock)block; - -- (void)logOut; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Realm b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Realm deleted file mode 100755 index e3d57ee9f..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64/Realm.framework/Realm and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/CHANGELOG.md b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/CHANGELOG.md deleted file mode 100644 index 00cc01244..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/CHANGELOG.md +++ /dev/null @@ -1,9539 +0,0 @@ -10.42.3 Release notes (2023-09-18) -============================================================= - -### Enhancements - -* Update packaging for the Xcode 15.0 release. Carthage release and obj-c - binaries are now built with Xcode 15. - -### Fixed - -* The prebuilt Realm.xcframework for SPM was packaged incorrectly and did not - work ([#8361](https://github.com/realm/realm-swift/issues/8361), since v10.42.1). - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 15.0.0. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15.0.0. - -10.42.2 Release notes (2023-09-13) -============================================================= - -### Enhancements - -* Add support for logging messages sent by the server. - ([Core #6476](https://github.com/realm/realm-core/pull/6476)) -* Unknown protocol errors received from the baas server will no longer cause - the application to crash if a valid error action is also received. Unknown - error actions will be treated as an ApplicationBug error action and will - cause sync to fail with an error via the sync error handler. - ([Core #6885](https://github.com/realm/realm-core/pull/6885)) -* Some sync error messages now contain more information about what went wrong. - -### Fixed - -* The `MultipleSyncAgents` exception from opening a synchronized Realm in - multiple processes at once no longer leaves the sync client in an invalid - state. ([Core #6868](https://github.com/realm/realm-core/pull/6868), since v10.36.0) -* Testing the size of a collection of links against zero would sometimes fail - (sometimes = "difficult to explain"). In particular: - ([Core #6850](https://github.com/realm/realm-core/issues/6850), since v10.41.0) -* When async writes triggered a file compaction some internal state could be - corrupted, leading to later crashes in the slab allocator. This typically - resulted in the "ref + size <= next->first" assertion failure, but other - failures were possible. Many issues reported; see [Core #6340](https://github.com/realm/realm-core/issues/6340). - (since 10.35.0) -* `Realm.Configuration.maximumNumberOfActiveVersions` now handles intermediate - versions which have been cleaned up correctly and checks the number of live - versions rather than the number of versions between the oldest live version - and current version (since 10.35.0). -* If the client disconnected between uploading a change to flexible sync - subscriptions and receiving the new object data from the server resulting - from that subscription change, the next connection to the server would - sometimes result in a client reset - ([Core #6966](https://github.com/realm/realm-core/issues/6966), since v10.21.1). - -### Deprecations - -* `RLMApp` has `localAppName` and `localAppVersion` fields which never ended up - being used for anything and are now deprecated. -* `RLMSyncAuthError` has not been used since v10.0.0 and is now deprecated. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 7. - -### Internal - -* Upgraded realm-core from 13.17.1 to 13.20.1 - -10.42.1 Release notes (2023-08-28) -============================================================= - -### Fixed - -* The names of the prebuilt zips for SPM have changed to avoid having Carthage - download them instead of the intended Carthage zip - ([#8326](https://github.com/realm/realm-swift/issues/8326), since v10.42.0). -* The prebuild Realm.xcframework for SwiftPM now has all platforms other than - visionOS built with Xcode 14 to comply with app store rules - ([#8339](https://github.com/realm/realm-swift/issues/8339), since 10.42.0). -* Fix visionOS compilation with Xcode beta 7. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 7. - -10.42.0 Release notes (2023-07-30) -============================================================= - -### Enhancements - -* Add support for building for visionOS and add Xcode 15 binaries to the - release package. visionOS currently requires installing Realm via either - Swift Package Manager or by using a XCFramework as CocoaPods and Carthage do - not yet support it. -* Zips compatible with SPM's `.binaryTarget()` are now published as part of the - releases on Github. -* Prebuilt XCFrameworks are now built with LTO enabled. This has insignificant - performance benefits, but cuts the size of the library by ~15%. - -### Fixed - -* Fix nested properties observation on a `Projections` not notifying when there is a property change. - ([#8276](https://github.com/realm/realm-swift/issues/8276), since v10.34.0). -* Fix undefined symbol error for `UIKit` when linking Realm to a framework using SPM. - ([#8308](https://github.com/realm/realm-swift/issues/8308), since v10.41.0) -* If the app crashed at exactly the wrong time while opening a freshly - compacted Realm the file could be left in an invalid state - ([Core #6807](https://github.com/realm/realm-core/pull/6807), since v10.33.0). -* Sync progress for DOWNLOAD messages was sometimes stored incorrectly, - resulting in an extra round trip to the server. - ([Core #6827](https://github.com/realm/realm-core/issues/6827), since v10.31.0) - -### Breaking Changes - -* Legacy non-xcframework Carthage installations are no longer supported. Please - ensure you are using `--use-xcframeworks` if installing via Carthage. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 5. - -### Internal - -* Upgraded realm-core from 13.17.0 to 13.17.1 -* Release packages were being uploaded to several static.realm.io URLs which - are no longer linked to anywhere. These are no longer being updated, and - release packages are now only being uploaded to Github. - -10.41.1 Release notes (2023-07-17) -============================================================= - -### Enhancements - -* Filesystem errors now include more information in the error message. -* Sync connection and session reconnect timing/backoff logic has been reworked - and unified into a single implementation. Previously some categories of errors - would cause an hour-long wait before attempting to reconnect, while others - would use an exponential backoff strategy. All errors now result in the sync - client waiting for 1 second before retrying, doubling the wait after each - subsequent failure up to a maximum of five minutes. If the cause of the error - changes, the backoff will be reset. If the sync client voluntarily disconnects, - no backoff will be used. ([Core #6526]((https://github.com/realm/realm-core/pull/6526))) - -### Fixed - -* Removed warnings for deprecated APIs internal use. - ([#8251](https://github.com/realm/realm-swift/issues/8251), since v10.39.0) -* Fix an error during async open and client reset if properties have been added - to the schema. This fix also applies to partition-based to flexible sync - migration if async open is used. ([Core #6707](https://github.com/realm/realm-core/issues/6707), since v10.28.2) - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 4. - -### Internal - -* Upgraded realm-core from 13.15.1 to 13.17.0 -* The location where prebuilt core binaries are published has changed slightly. - If you are using `REALM_BASE_URL` to mirror the binaries, you may need to - adjust your mirroring logic. - -10.41.0 Release notes (2023-06-26) -============================================================= - -### Enhancements - -* Add support for multiplexing sync connections. When enabled (the default), a single - connection is used per sync user rather than one per synchronized Realm. This - reduces resource consumption when multiple Realms are opened and will - typically improve performance ([PR #8282](https://github.com/realm/realm-swift/pull/8282)). -* Sync timeout options can now be set on `RLMAppConfiguration` along with the - other app-wide configuration settings ([PR #8282](https://github.com/realm/realm-swift/pull/8282)). - -### Fixed - -* Import as `RLMRealm_Private.h` as a module would cause issues when using Realm as a subdependency. - ([#8164](https://github.com/realm/realm-swift/issues/8164), since 10.37.0) -* Disable setting a custom logger by default on the sync client when the sync manager is created. - This was overriding the default logger set using `RLMLogger.defaultLogger`. (since v10.39.0). - -### Breaking Changes - -* The `RLMSyncTimeouts.appConfiguration` property has been removed. This was an - unimplemented read-only property which did not make any sense on the - containing type ([PR #8282](https://github.com/realm/realm-swift/pull/8282)). - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 2. - -### Internal - -* Upgraded realm-core from 13.15.0 to 13.15.1 - -10.40.2 Release notes (2023-06-09) -============================================================= - -### Enhancements - -* `Actor.preconditionIsolated()` is now used for runtime actor checking when - available (i.e. building with Xcode 15 and running on iOS 17) rather than the - less reliable workaround. - -### Fixed - -* If downloading the fresh Realm file failed during a client reset on a - flexible sync Realm, the sync client would crash the next time the Realm was - opened. ([Core #6494](https://github.com/realm/realm-core/issues/6494), since v10.28.2) -* If the order of properties in the local class definitions did not match the - order in the server-side schema, the before-reset Realm argument passed to a - client reset handler would have an invalid schema and likely crash if any - data was read from it. ([Core #6693](https://github.com/realm/realm-core/issues/6693), since v10.40.0) - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 1. - -### Internal - -* Upgraded realm-core from 13.13.0 to 13.15.0. -* The prebuilt library used for CocoaPods installations is now built with Xcode - 14. This should not have any observable effects other than the download being - much smaller due to no longer including bitcode. - -10.40.1 Release notes (2023-06-06) -============================================================= - -### Enhancements - -* Fix compilation with Xcode 15. Note that iOS 12 is the minimum supported - deployment target when using Xcode 15. -* Switch to building the Carthage release with Xcode 14.3.1. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-15 beta 1. - -### Internal - -* Overhauled SDK metrics collection to better drive future development efforts. - -10.40.0 Release notes (2023-05-26) -============================================================= - -Drop support for Xcode 13 and add Xcode 14.3.1. Xcode 14.1 is now the minimum -supported version. - -### Enhancements - -* Adjust the error message for private `Object` subclasses and subclasses - nested inside other types to explain how to make them work rather than state - that it's impossible. ([#5662](https://github.com/realm/realm-cocoa/issues/5662)). -* Improve performance of SectionedResults. With a single section it is now ~10% - faster, and the runtime of sectioning no longer scales significantly with - section count, giving >100% speedups when there are large numbers of sections - ([Core #6606](https://github.com/realm/realm-core/pull/6606)). -* Very slightly improve performance of runtime thread checking on the main - thread. ([Core #6606](https://github.com/realm/realm-core/pull/6606)) - -### Fixed - -* Allow support for implicit boolean queries on Swift's Type Safe Queries API - ([#8212](https://github.com/realm/realm-swift/issues/8212)). -* Fixed a fatal error (reported to the sync error handler) during client reset - or automatic partition-based to flexible sync migration if the reset has been - triggered during an async open and the schema being applied has added new - classes. Due to this bug automatic flexibly sync migration has been disabled - for older releases and this is now the minimum version required. - ([#6601](https://github.com/realm/realm-core/issues/6601), since automatic - client resets were introduced in v10.25.0) -* Dictionaries sometimes failed to map unresolved links to nil. If the target - of a link in a dictionary was deleted by another sync client, reading that - field from the dictionary would sometimes give an invalid object rather than - nil. In addition, queries on dictionaries would sometimes have incorrect - results. ([Core #6644](https://github.com/realm/realm-core/pull/6644), since v10.8.0) -* Older versions of Realm would sometimes fail to properly mark objects as - being the target of an incoming link from another object. When this happened, - deleting the target object would hit an assertion failure due to the - inconsistent state. We now reconstruct a valid state rather than crashing. - ([Core #6585](https://github.com/realm/realm-core/issues/6585), since v5.0.0) -* Fix several UBSan failures which did not appear to result in functional bugs - ([Core #6649](https://github.com/realm/realm-core/pull/6649)). -* Using both synchronous and asynchronous transactions on the same thread or - scheduler could hit the assertion failure "!realm.is_in_transaction()" if one - of the callbacks for an asynchronous transaction happened to be scheduled - during a synchronous transaction - ([Core #6659](https://github.com/realm/realm-core/issues/6659), since v10.26.0) -* The stored deployment location for Apps was not being updated correctly after - receiving a redirect response from the server, resulting in every connection - attempting to connect to the old URL and getting redirected rather than only - the first connection after the deployment location changed. - ([Core #6630](https://github.com/realm/realm-core/issues/6630), since v10.38.2) - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 14.1-14.3.1. - -### Internal - -* Upgraded realm-core from 13.10.1 to 13.13.0. - -10.39.1 Release notes (2023-05-05) -============================================================= - -### Enhancements - -* New notifiers can now be registered in write transactions until changes have - actually been made in the write transaction. This makes it so that new - notifications can be registered inside change notifications triggered by - beginning a write transaction (unless a previous callback performed writes). - ([#4818](https://github.com/realm/realm-swift/issues/4818)). -* Reduce the memory footprint of an automatic (discard or recover) client reset - when there are large incoming changes from the server. - ([Core #6567](https://github.com/realm/realm-core/issues/6567)). - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from 13.10.0 to 13.10.1. - -10.39.0 Release notes (2023-05-03) -============================================================= - -### Enhancements - -* Add support for actor-isolated Realms, opened with `try await Realm(actor: actor)`. - - Rather than being confined to the current thread or a dispatch queue, - actor-isolated Realms are isolated to an actor. This means that they can be - used from any thread as long as it's within a function isolated to that - actor, and they remain valid over suspension points where a task may hop - between threads. Actor-isolated Realms can be used with either global or - local actors: - - ```swift - @MainActor function mainThreadFunction() async throws { - // These are identical: the async init continues to produce a - // MainActor-confined Realm if no actor is supplied - let realm1 = try await Realm() - let realm2 = try await Realm(MainActor.shared) - } - - // A simple example of a custom global actor - @globalActor actor BackgroundActor: GlobalActor { - static var shared = BackgroundActor() - } - - @BackgroundActor backgroundThreadFunction() async throws { - // Explicitly specifying the actor is required for everything but MainActor - let realm = try await Realm(actor: BackgroundActor.shared) - try await realm.write { - _ = realm.create(MyObject.self) - } - // Thread-confined Realms would sometimes throw an exception here, as we - // may end up on a different thread after an `await` - print("\(realm.objects(MyObject.self).count)") - } - - actor MyActor { - // An implicitly-unwrapped optional is used here to let us pass `self` to - // `Realm(actor:)` within `init` - var realm: Realm! - init() async throws { - realm = try await Realm(actor: self) - } - - var count: Int { - realm.objects(MyObject.self).count - } - - func create() async throws { - try await realm.asyncWrite { - realm.create(MyObject.self) - } - } - } - - // This function isn't isolated to the actor, so each operation has to be async - func createObjects() async throws { - let actor = try await MyActor() - for _ in 0..<5 { - await actor.create() - } - print("\(await actor.count)") - } - - // In an isolated function, an actor-isolated Realm can be used synchronously - func createObjects(in actor: isolated MyActor) async throws { - await actor.realm.write { - actor.realm.create(MyObject.self) - } - print("\(actor.realm.objects(MyObject.self).count)") - } - ``` - - Actor-isolated Realms come with a more convenient syntax for asynchronous - writes. `try await realm.write { ... }` will suspend the current task, - acquire the write lock without blocking the current thread, and then invoke - the block. The actual data is then written to disk on a background thread, - and the task is resumed once that completes. As this does not block the - calling thread while waiting to write and does not perform i/o on the calling - thread, this will often be safe to use from `@MainActor` functions without - blocking the UI. Sufficiently large writes may still benefit from being done - on a background thread. - - Asynchronous writes are only supported for actor-isolated Realms or in - `@MainActor` functions. - - Actor-isolated Realms require Swift 5.8 (Xcode 14.3). Enabling both strict - concurrency checking (`SWIFT_STRICT_CONCURRENCY=complete` in Xcode) and - runtime actor data race detection (`OTHER_SWIFT_FLAGS=-Xfrontend - -enable-actor-data-race-checks`) is strongly recommended when using - actor-isolated Realms. -* Add support for automatic partition-based to flexible sync migration. - Connecting to a server-side app configured to use flexible sync with a - client-side partition-based sync configuration is now supported, and will - automatically create the appropriate flexible sync subscriptions to subscribe - to the requested partition. This allows changing the configuration on the - server from partition-based to flexible without breaking existing clients. - ([Core #6554](https://github.com/realm/realm-core/issues/6554)) -* Now you can use an array `[["_id": 1], ["breed": 0]]` as sorting option for a - MongoCollection. This new API fixes the issue where the resulting documents - when using more than one sort parameter were not consistent between calls. - ([#7188](https://github.com/realm/realm-swift/issues/7188), since v10.0.0). -* Add support for adding a user created default logger, which allows implementing your own logging logic - and the log threshold level. - You can define your own logger creating an instance of `Logger` and define the log function which will be - invoked whenever there is a log message. - - ```swift - let logger = Logger(level: .all) { level, message in - print("Realm Log - \(level): \(message)") - } - ``` - - Set this custom logger as Realm default logger using `Logger.shared`. - ```swift - Logger.shared = logger - ``` -* It is now possible to change the default log threshold level at any point of the application's lifetime. - ```swift - Logger.shared.logLevel = .debug - ``` - This will override the log level set anytime before by a user created logger. -* We have set `.info` as the default log threshold level for Realm. You will now see some - log message in your console. To disable use `Logger.shared.level = .off`. - -### Fixed - -* Several schema initialization functions had incorrect `@MainActor` - annotations, resulting in runtime warnings if the first time a Realm was - opened was on a background thread - ([#8222](https://github.com/realm/realm-swift/issues/8222), since v10.34.0). - -### Deprecations - -* `App.SyncManager.logLevel` and `App.SyncManager.logFunction` are deprecated in favour of - setting a default logger. - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from v13.9.4 to v13.10.0. - -10.38.3 Release notes (2023-04-28) -============================================================= - -### Enhancements - -* Improve performance of cancelling a write transactions after making changes. - If no KVO observers are used this is now constant time rather than taking - time proportional to the number of changes to be rolled back. Cancelling a - write transaction with KVO observers is 10-20% faster. ([Core PR #6513](https://github.com/realm/realm-core/pull/6513)). - -### Fixed - -* Performing a large number of queries without ever performing a write resulted - in steadily increasing memory usage, some of which was never fully freed due - to an unbounded cache ([#7978](https://github.com/realm/realm-swift/issues/7978), since v10.27.0). - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from 13.9.3 to 13.9.4 - -10.38.2 Release notes (2023-04-25) -============================================================= - -### Enhancements - -* Improve performance of equality queries on a non-indexed AnyRealmValue - property by about 30%. ([Core #6506](https://github.com/realm/realm-core/issues/6506)) - -### Fixed - -* SSL handshake errors were treated as fatal errors rather than errors which - should be retried. ([Core #6434](https://github.com/realm/realm-core/issues/6434), since v10.35.0) - -### Compatibility - -* Realm Studio: 14.0.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from 13.9.0 to 13.9.3. - -10.38.1 Release notes (2023-04-25) -============================================================= - -### Fixed - -* The error handler set on EventsConfiguration was not actually used (since v10.26.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -10.38.0 Release notes (2023-03-31) -============================================================= - -Switch to building the Carthage release with Xcode 14.3. - -### Enhancements - -* Add Xcode 14.3 binaries to the release package. Note that CocoaPods 1.12.0 - does not support Xcode 14.3. -* Add support for sharing encrypted Realms between multiple processes. - ([Core #1845](https://github.com/realm/realm-core/issues/1845)) - -### Fixed - -* Fix a memory leak reported by Instruments on `URL.path` in - `Realm.Configuration.fileURL` when using a string partition key in Partition - Based Sync ([#8195](https://github.com/realm/realm-swift/pull/8195)), since v10.0.0). -* Fix a data race in version management. If one thread committed a write - transaction which increased the number of live versions above the previous - highest seen during the current session at the same time as another thread - began a read, the reading thread could read from a no-longer-valid memory - mapping. This could potentially result in strange crashes when opening, - refreshing, freezing or thawing a Realm - ([Core #6411](https://github.com/realm/realm-core/pull/6411), since v10.35.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.3. -* CocoaPods: 1.10 or later. -* Xcode: 13.4-14.3. - -### Internal - -* Upgraded realm-core from 13.8.0 to 13.9.0. - -10.37.2 Release notes (2023-03-29) -============================================================= - -### Fixed - -* Copying a `RLMRealmConfiguration` failed to copy several fields. This - resulted in migrations being passed the incorrect object type in Swift when - using the default configuration (since v10.34.0) or async open (since - v10.37.0). This also broke using the Events API in those two scenarios (since - v10.26.0 for default configuration and v10.37.0 for async open). ([#8190](https://github.com/realm/realm-swift/issues/8190)) - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -10.37.1 Release notes (2023-03-27) -============================================================= - -### Enhancements - -* Performance improvement for the following queries ([Core #6376](https://github.com/realm/realm-core/issues/6376)): - * Significant (~75%) improvement when counting (`Results.count`) the number - of exact matches (with no other query conditions) on a - string/int/UUID/ObjectID property that has an index. This improvement - will be especially noticiable if there are a large number of results - returned (duplicate values). - * Significant (~99%) improvement when querying for an exact match on a Date - property that has an index. - * Significant (~99%) improvement when querying for a case insensitive match - on an AnyRealmValue property that has an index. - * Moderate (~25%) improvement when querying for an exact match on a Bool - property that has an index. - * Small (~5%) improvement when querying for a case insensitive match on an - AnyRealmValue property that does not have an index. - -### Fixed - -* Add missing `@Sendable` annotations to several sync and app services related - callbacks ([PR #8169](https://github.com/realm/realm-swift/pull/8169), since v10.34.0). -* Fix some bugs in handling task cancellation for async Realm init. Some very - specific timing windows could cause crashes, and the download would not be - cancelled if the Realm was already open ([PR #8178](https://github.com/realm/realm-swift/pull/8178), since v10.37.0). -* Fix a crash when querying an AnyRealmValue property with a string operator - (contains/like/beginswith/endswith) or with case insensitivity. - ([Core #6376](https://github.com/realm/realm-core/issues/6376), since v10.8.0) -* Querying for case-sensitive equality of a string on an indexed AnyRealmValue - property was returning case insensitive matches. For example querying for - `myIndexedAny == "Foo"` would incorrectly match on values of "foo" or "FOO" etc. - ([Core #6376](https://github.com/realm/realm-core/issues/6376), since v10.8.0) -* Adding an index to an AnyRealmValue property when objects of that type - already existed would crash with an assertion. - ([Core #6376](https://github.com/realm/realm-core/issues/6376), since v10.8.0). -* Fix a bug that may have resulted in arrays being in different orders on - different devices. Some cases of “Invalid prior_size” may be fixed too. - ([Core #6191](https://github.com/realm/realm-core/issues/6191), since v10.25.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -### Internal - -* Upgraded realm-core from 13.6.0 to 13.8.0 - -10.37.0 Release notes (2023-03-09) -============================================================= - -### Enhancements - -* `MongoCollection.watch().subscribe(on:)` now supports any swift Scheduler - rather than only dispatch queues ([PR #8131](https://github.com/realm/realm-swift/pull/8130)). -* Add an async sequence wrapper for `MongoCollection.watch()`, allowing you to - do `for try await change in collection.changeEvents { ... }` - ([PR #8131](https://github.com/realm/realm-swift/pull/8130)). -* The internals of error handling and reporting have been significantly - reworked. The visible effects of this are that some errors which previously - had unhelpful error messages now include more detail about what went wrong, - and App errors now expose a much more complete set of error codes - ([PR #8002](https://github.com/realm/realm-swift/pull/8002)). -* Expose compensating write error information. When the server rejects a - modification made by the client (such as if the user does not have the - required permissions), a `SyncError` is delivered to the sync error handler - with the code `.writeRejected` and a non-nil `compensatingWriteInfo` field - which contains information about what was rejected and why. This information - is intended primarily for debugging and logging purposes and may not have a - stable format. ([PR #8002](https://github.com/realm/realm-swift/pull/8002)) -* Async `Realm.init()` now handles Task cancellation and will cancel the async - open if the Task is cancelled ([PR #8148](https://github.com/realm/realm-swift/pull/8148)). -* Cancelling async opens now has more consistent behavior. The previously - intended and documented behavior was that cancelling an async open would - result in the callback associated with the specific task that was cancelled - never being called, and all other pending callbacks would be invoked with an - ECANCELED error. This never actually worked correctly, and the callback which - was not supposed to be invoked at all sometimes would be. We now - unconditionally invoke all of the exactly once, passing ECANCELED to all of - them ([PR #8148](https://github.com/realm/realm-swift/pull/8148)). - -### Fixed - -* `UserPublisher` incorrectly bounced all notifications to the main thread instead - of setting up the Combine publisher to correctly receive on the main thread. - ([#8132](https://github.com/realm/realm-swift/issues/8132), since 10.21.0) -* Fix warnings when building with Xcode 14.3 beta 2. -* Errors in async open resulting from invalid queries in `initialSubscriptions` - would result in the callback being invoked with both a non-nil Realm and a - non-nil Error even though the Realm was in an invalid state. Now only the - error is passed to the callback ([PR #8148](https://github.com/realm/realm-swift/pull/8148), since v10.28.0). -* Converting a local realm to a synced realm would crash if an embedded object - was null ([Core #6294](https://github.com/realm/realm-core/issues/6294), since v10.22.0). -* Subqueries on indexed properties performed extremely poorly. ([Core #6327](https://github.com/realm/realm-core/issues/6327), since v5.0.0) -* Fix a crash when a SSL read successfully read a non-zero number of bytes and - also reported an error. ([Core #5435](https://github.com/realm/realm-core/issues/5435), since 10.0.0) -* The sync client could get stuck in an infinite loop if the server sent an - invalid changeset which caused a transform error. This now results in a - client reset instead. ([Core #6051](https://github.com/realm/realm-core/issues/6051), since v10.0.0) -* Strings in queries which contained any characters which required multiple - bytes when encoded as utf-8 were incorrectly encoded as binary data when - serializing the query to send it to the server for a flexible sync - subscription, resulting the server rejecting the query - ([Core #6350](https://github.com/realm/realm-core/issues/6350), since 10.22.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -### Internal - -* Upgraded realm-core from 13.4.1 to 13.6.0 - -10.36.0 Release notes (2023-02-15) -============================================================= - -### Enhancements - -* Add support for multiple overlapping or nested event scopes. - `Events.beginScope()` now returns a `Scope` object which is used to commit or - cancel that scope, and if more than one scope is active at a time events are - reported to all active scopes. - -### Fixed - -* Fix moving `List` items to a higher index in SwiftUI results in wrong destination index - ([#7956](https://github.com/realm/realm-swift/issues/7956), since v10.6.0). -* Using the `searchable` view modifier with `@ObservedResults` in iOS 16 would - cause the collection observation subscription to cancel. - ([#8096](https://github.com/realm/realm-swift/issues/8096), since 10.21.0) -* Client reset with recovery would sometimes crash if the recovery resurrected - a dangling link ([Core #6292](https://github.com/realm/realm-core/issues/6292), since v10.32.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -### Internal - -* Upgraded realm-core from 13.4.0 to 13.4.1 - -10.35.1 Release notes (2023-02-10) -============================================================= - -### Fixed - -* Client reset with recovery would crash if a client reset occurred the very - first time the Realm was opened with async open. The client reset callbacks - are now not called if the Realm had never been opened before - ([PR #8125](https://github.com/realm/realm-swift/pull/8125), since 10.32.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -10.35.0 Release notes (2023-02-07) -============================================================= - -This version bumps the Realm file format version to 23. Realm files written by -this version cannot be read by older versions of Realm. - -### Enhancements - -* The Realm file is now automatically shrunk if the file size is larger than - needed to store all of the data. ([Core PR #5755](https://github.com/realm/realm-core/pull/5755)) -* Pinning old versions (either with frozen Realms or with Realms on background - threads that simply don't get refreshed) now only prevents overwriting the - data needed by that version, rather than the data needed by that version and - all later versions. In addition, frozen Realms no longer pin the transaction - logs used to drive change notifications. This mostly eliminates the file size - growth caused by pinning versions. ([Core PR #5440](https://github.com/realm/realm-core/pull/5440)) -* Rework how Dictionaries/Maps are stored in the Realm file. The new design uses - less space and is typically significantly faster. This changes the iteration - order of Maps, so any code relying on that may be broken. We continue - to make no guarantees about iteration order on Maps ([Core #5764](https://github.com/realm/realm-core/issues/5764)). -* Improve performance of freezing Realms ([Core PR #6211](https://github.com/realm/realm-core/pull/6211)). - -### Fixed - -* Fix a crash when using client reset with recovery and flexible sync with a - single subscription ([Core #6070](https://github.com/realm/realm-core/issues/6070), since v10.28.2) -* Encrypted Realm files could not be opened on devices with a larger page size - than the one which originally wrote the file. - ([#8030](https://github.com/realm/realm-swift/issues/8030), since v10.32.1) -* Creating multiple flexible sync subscriptions at once could hit an assertion - failure if the server reported an error for any of them other than the last - one ([Core #6038](https://github.com/realm/realm-core/issues/6038), since v10.21.1). -* `Set` and `List` considered a string and binary - data containing that string encoded as UTF-8 to be equivalent. This could - result in a List entry not changing type on assignment and for the client be - inconsistent with the server if a string and some binary data with equivalent - content was inserted from Atlas. - ([Core #4860](https://github.com/realm/realm-core/issues/4860) and - [Core #6201](https://github.com/realm/realm-core/issues/6201), since v10.8.0) -* Querying for NaN on Decimal128 properties did not match any objects - ([Core #6182](https://github.com/realm/realm-core/issues/6182), since v10.8.0). -* When client reset with recovery is used and the recovery did not need to - make any changes to the local Realm, the sync client could incorrectly think - the recovery failed and report the error "A fatal error occured during client - reset: 'A previous 'Recovery' mode reset from did not succeed, - giving up on 'Recovery' mode to prevent a cycle'". - ([Core #6195](https://github.com/realm/realm-core/issues/6195), since v10.32.0) -* Fix a crash when using client reset with recovery and flexible sync with a - single subscription ([Core #6070](https://github.com/realm/realm-core/issues/6070), since v10.28.2) -* Writing to newly in-view objects while a flexible sync bootstrap was in - progress would not synchronize those changes to the server - ([Core #5804](https://github.com/realm/realm-core/issues/5804), since v10.21.1). -* If a client reset with recovery or discard local was interrupted while the - "fresh" realm was being downloaded, the sync client could crash with a - MultpleSyncAgents exception ([Core #6217](https://github.com/realm/realm-core/issues/6217), since v10.25.0). -* Sharing Realm files between a Catalyst app and Realm Studio did not properly - synchronize access to the Realm file ([Core #6258](https://github.com/realm/realm-core/pull/6258), since v10.0.0). - -### Compatibility - -* Realm Studio: 13.0.2 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -### Internal - -* Upgraded realm-core from 12.13.0 to 13.4.0 - -10.34.1 Release notes (2023-01-20) -============================================================= - -### Fixed - -* Add some missing `@preconcurrency` annotations which lead to build failures - with Xcode 14.0 when importing via SPM or CocoaPods - ([#8104](https://github.com/realm/realm-swift/issues/8104), since v10.34.0). - -### Compatibility - -* Realm Studio: 11.0.0 - 12.0.0. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -10.34.0 Release notes (2023-01-13) -============================================================= - -Swift 5.5 is no longer supported. Swift 5.6 (Xcode 13.3) is now the minimum -supported version. - -The prebuilt binary for Carthage is now build with Xcode 14.2. - -### Enhancements - -* Improve performance of creating Projection objects and of change - notifications on projections ([PR #8050](https://github.com/realm/realm-swift/pull/8050)). -* Allow initialising any sync configuration with `cancelAsyncOpenOnNonFatalErrors`. -* Improve performance of Combine value publishers which do not use the - object/collection changesets a little. -* All public types have been audited for sendability and are now marked as - Sendable when applicable. A few types which were incidentally not thread-safe - but make sense to use from multiple threads are now thread-safe. -* Add support for building Realm with strict concurrency checking enabled. - -### Fixed - -* Fix bad memory access exception that can occur when watching change streams. - [PR #8039](https://github.com/realm/realm-swift/pull/8039). -* Object change notifications on projections only included the first projected - property for each source property ([PR #8050](https://github.com/realm/realm-swift/pull/8050), since v10.21.0). -* `@AutoOpen` failed to open flexible sync Realms while offline - ([#7986](https://github.com/realm/realm-swift/issues/7986), since v10.27.0). -* Fix "Publishing changes from within view updates is not allowed" warnings - when using `@ObservedResults` or `@ObservedSectionedResults` - ([#7908](https://github.com/realm/realm-swift/issues/7908)). -* Fix "Publishing changes from within view updates is not allowed" warnings - when using `@AutoOpen` or `@AsyncOpen`. - ([#7908](https://github.com/realm/realm-swift/issues/7908)). -* Defer `Realm.asyncOpen` execution on `@AsyncOpen` and `@AutoOpen` property - wrappers until all the environment values are set. This will guarantee the - configuration and partition value are set set before opening the realm. - ([#7931](https://github.com/realm/realm-swift/issues/7931), since v10.12.0). -* `@ObservedResults.remove()` could delete the wrong object if a write on a - background thread which changed the index of the object being removed - occurred at a very specific time (since v10.6.0). - -### Compatibility - -* Realm Studio: 11.0.0 - 12.0.0. 13.0.0 is currently incompatible. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.2. -* CocoaPods: 1.10 or later. -* Xcode: 13.3-14.2. - -10.33.0 Release notes (2022-12-01) -============================================================= - -### Enhancements - -* Flexible sync subscription state will change to - `SyncSubscriptionState.pending` (`RLMSyncSubscriptionStatePending`) while - waiting for the server to have sent all pending history after a bootstrap and - before marking a subscription as Complete. - ([#5795](https://github.com/realm/realm-core/pull/5795)) -* Add custom column names API, which allows to set a different column name in the realm - from the one used in your object declaration. - ```swift - class Person: Object { - @Persisted var firstName: String - @Persisted var birthDate: Date - @Persisted var age: Int - - override class public func propertiesMapping() -> [String: String] { - ["firstName": "first_name", - "birthDate": "birth_date"] - } - } - ``` - This is very helpful in cases where you want to name a property differently - from your `Device Sync` JSON schema. - This API is only available for old and modern object declaration syntax on the - `RealmSwift` SDK. -* Flexible sync bootstraps now apply 1MB of changesets per write transaction - rather than applying all of them in a single write transaction. - ([Core PR #5999](https://github.com/realm/realm-core/pull/5999)). - -### Fixed - -* Fix a race condition which could result in "operation cancelled" errors being - delivered to async open callbacks rather than the actual sync error which - caused things to fail ([Core PR #5968](https://github.com/realm/realm-core/pull/5968), since the introduction of async open). -* Fix database corruption issues which could happen if an application was - terminated at a certain point in the process of comitting a write - transaciton. ([Core PR #5993](https://github.com/realm/realm-core/pull/5993), since v10.21.1) -* `@AsyncOpen` and `@AutoOpen` would begin and then cancel a second async open - operation ([PR #8038](https://github.com/realm/realm-swift/pull/8038), since v10.12.0). -* Changing the search text when using the searchable SwiftUI extension would - trigger multiple updates on the View for each change - ([PR #8038](https://github.com/realm/realm-swift/pull/8038), since v10.19.0). -* Changing the filter or search properties of an `@ObservedResults` or - `@ObservedSectionedResults` would trigger up to three updates on the View - ([PR #8038](https://github.com/realm/realm-swift/pull/8038), since v10.6.0). -* Fetching a user's profile while the user logs out would result in an - assertion failure. ([Core PR #6017](https://github.com/realm/realm-core/issues/5571), since v10.8.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -### Internal - -* Upgraded realm-core from 12.11.0 to 12.13.0 - -10.32.3 Release notes (2022-11-10) -============================================================= - -### Fixed - -* Fix name lookup errors when importing Realm Swift built in library evolution - mode (([#8014](https://github.com/realm/realm-swift/issues/8014)). -* The prebuilt watchOS library in the objective-c release package was missing - an arm64 slice. The Swift release package was uneffected - ([PR #8016](https://github.com/realm/realm-swift/pull/8016)). -* Fix issue where `RLMUserAPIKey.key`/`UserAPIKey.key` incorrectly returned the name of the API - key instead of the key itself. ([#8021](https://github.com/realm/realm-swift/issues/8021), since v10.0.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -10.32.2 Release notes (2022-11-01) -============================================================= - -Switch to building the Carthage release with Xcode 14.1. - -### Fixed - -* Fix linker errors when building a release build with Xcode 14.1 when - installing via SPM ([#7995](https://github.com/realm/realm-swift/issues/7995)). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -10.32.1 Release notes (2022-10-25) -============================================================= - -### Enhancements - -* Improve performance of client reset with automatic recovery and converting - top-level tables into embedded tables ([Core #5897](https://github.com/realm/realm-core/pull/5897)). -* `Realm.Error` is now a typealias for `RLMError` rather than a - manually-defined version of what the automatic bridging produces. This should - have no effect on existing working code, but the manual definition was - missing a few things supplied by the automatic bridging. -* Some sync errors sent by the server include a link to the server-side logs - associated with that error. This link is now exposed in the `serverLogURL` - property on `SyncError` (or `RLMServerLogURLKey` userInfo field when using NSError). - -### Fixed - -* Many sync and app errors were reported using undocumented internal error - codes and/or domains and could not be progammatically handled. Some notable - things which now have public error codes instead of unstable internal ones: - - `Realm.Error.subscriptionFailed`: The server rejected a flexible sync subscription. - - `AppError.invalidPassword`: A login attempt failed due to a bad password. - - `AppError.accountNameInUse`: A registration attempt failed due to the account name being in use. - - `AppError.httpRequestFailed`: A HTTP request to Atlas App Services - completed with an error HTTP code. The failing code is available in the - `httpStatusCode` property. - - Many other less common error codes have been added to `AppError`. - - All sync errors other than `SyncError.clientResetError` reported incorrect - error codes. - (since v10.0.0). -* `UserAPIKey.objectId` was incorrectly bridged to Swift as `RLMObjectId` to - `ObjectId`. This may produce warnings about an unneccesary cast if you were - previously casting it to the correct type (since v10.0.0). -* Fixed an assertion failure when observing change notifications on a sectioned - result, if the first modification was to a linked property that did not cause - the state of the sections to change. - ([Core #5912](https://github.com/realm/realm-core/issues/5912), - since the introduction of sectioned results in v10.29.0) -* Fix a use-after-free if the last external reference to an encrypted - synchronized Realm was closed between when a client reset error was received - and when the download of the new Realm began. - ([Core #5949](https://github.com/realm/realm-core/pull/5949), since 10.28.4). -* Fix an assertion failure during client reset with recovery when recovering - a list operation on an embedded object that has a link column in the path - prefix to the list from the top level object. - ([Core #5957](https://github.com/realm/realm-core/issues/5957), - since introduction of automatic recovery in v10.32.0). -* Creating a write transaction which is rejected by the server due to it - exceeding the maximum transaction size now results in a client reset error - instead of synchronization breaking and becoming stuck forever - ([Core #5209](https://github.com/realm/realm-core/issues/5209), since v10). -* Opening an unencrypted file with an encryption key would sometimes report a - misleading error message that indicated that the problem was something other - than a decryption failure ([Core #5915](https://github.com/realm/realm-core/pull/5915), since 0.89.0). -* Fix a rare deadlock which could occur when closing a synchronized Realm - immediately after committing a write transaction when the sync worker thread - has also just finished processing a changeset from the server - ([Core #5948](https://github.com/realm/realm-core/pull/5948)). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.0.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -### Internal - -* Upgraded realm-core from 12.9.0 to 12.11.0. - -10.32.0 Release notes (2022-10-10) -============================================================= - -### Enhancements - -* Add `.recoverUnsyncedChanges` (`RLMClientResetModeRecoverUnsyncedChanges`) and -`.recoverOrDiscardUnsyncedChanges` (`RLMClientResetModeRecoverOrDiscardUnsyncedChanges`) behaviors to `ClientResetMode` (`RLMClientResetMode`). - - The newly added recover modes function by downloading a realm which reflects the latest - state of the server after a client reset. A recovery process is run locally in an - attempt to integrate the server state with any local changes from before the - client reset occurred. - The changes are integrated with the following rules: - 1. Objects created locally that were not synced before client reset, will be integrated. - 2. If an object has been deleted on the server, but was modified on the client, the delete takes precedence and the update is discarded. - 3. If an object was deleted on the client, but not the server, then the client delete instruction is applied. - 4. In the case of conflicting updates to the same field, the client update is applied. - - The client reset process will fallback to `ClientResetMode.discardUnsyncedChanges` if the recovery process fails in `.recoverOrDiscardUnsyncedChanges`. - - The client reset process will fallback to `ClientResetMode.manual` if the recovery process fails in `.recoverUnsyncedChanges`. - - The two new swift recovery modes support client reset callbacks: `.recoverUnsyncedChanges(beforeReset: ((Realm) -> Void)? = nil, afterReset: ((Realm, Realm) -> Void)? = nil)`. - - The two new Obj-C recovery modes support client reset callbacks in `notifyBeforeReset` - and `notifyAfterReset`for both `[RLMUser configurationWithPartitionValue]` and `[RLMUser flexibleSyncConfigurationWithClientResetMode]` - For more detail on client reset callbacks, see `ClientResetMode`, `RLMClientResetBeforeBlock`, - `RLMClientResetAfterBlock`, and the 10.25.0 changelog entry. -* Add two new additional interfaces to define a manual client reset handler: - - Add a manual callback handler to `ClientResetMode.manual` -> `ClientResetMode.manual(ErrorReportingBlock? = nil)`. - - Add the `RLMSyncConfiguration.manualClientResetHandler` property (type `RLMSyncErrorReportingBlock`). - - These error reporting blocks are invoked in the event of a `RLMSyncErrorClientResetError`. - - See `ErrorReportingBlock` (`RLMSyncErrorReportingBlock`), and `ClientResetInfo` for more detail. - - Previously, manual client resets were handled only through the `SyncManager.ErrorHandler`. You have the - option, but not the requirement, to define manual reset handler in these interfaces. - Otherwise, the `SyncManager.ErrorHandler` is still invoked during the manual client reset process. - - These new interfaces are only invoked during a `RLMSyncErrorClientResetError`. All other sync errors - are still handled in the `SyncManager.ErrorHandler`. - - See 'Breaking Changes' for information how these interfaces interact with an already existing - `SyncManager.ErrorHandler`. - -### Breaking Changes - -* The default `clientResetMode` (`RLMClientResetMode`) is switched from `.manual` (`RLMClientResetModeManual`) - to `.recoverUnsyncedChanges` (`RLMClientResetModeRecoverUnsyncedChanges`). - - If you are currently using `.manual` and continue to do so, the only change - you must explicitly make is designating manual mode in - your `Realm.Configuration.SyncConfiguration`s, since they will now default to `.recoverUnsyncedChanges`. - - You may choose to define your manual client reset handler in the newly - introduced `manual(ErrorReportingBlock? = nil)` - or `RLMSyncConfiguration.manualClientResetHandler`, but this is not required. - The `SyncManager.errorHandler` will still be invoked during a client reset if - no callback is passed into these new interfaces. - -### Deprecations - -* `ClientResetMode.discardLocal` is deprecated in favor of `ClientResetMode.discardUnsyncedChanges`. - The reasoning is that the name better reflects the effect of this reset mode. There is no actual - difference in behavior. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.0.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -10.31.0 Release notes (2022-10-05) -============================================================= - -The prebuilt binary for Carthage is now build with Xcode 14.0.1. - -### Enhancements - -* Cut the runtime of aggregate operations on large dictionaries in half - ([Core #5864](https://github.com/realm/realm-core/pull/5864)). -* Improve performance of aggregate operations on collections of objects by 2x - to 10x ([Core #5864](https://github.com/realm/realm-core/pull/5864)). - Greatly improve the performance of sorting or distincting a Dictionary's keys - or values. The most expensive operation is now performed O(log N) rather than - O(N log N) times, and large Dictionaries can see upwards of 99% reduction in - time to sort. ([Core #5166](https://github.com/realm/realm-core/pulls/5166)) -* Add support for changing the deployment location for Atlas Apps. Previously - this was assumed to be immutable ([Core #5648](https://github.com/realm/realm-core/issues/5648)). -* The sync client will now yield the write lock to other threads which are - waiting to perform a write transaction even if it still has remaining work to - do, rather than always applying all changesets received from the server even - when other threads are trying to write. ([Core #5844](https://github.com/realm/realm-core/pull/5844)). -* The sync client no longer writes an unused temporary copy of the changesets - received from the server to the Realm file ([Core #5844](https://github.com/realm/realm-core/pull/5844)). - -### Fixed - -* Setting a `List` property with `Results` no longer throws an unrecognized - selector exception (since 10.8.0-beta.2) -* `RLMProgressNotificationToken` and `ProgressNotificationToken` now hold a - strong reference to the sync session, keeping it alive until the token is - deallocated or invalidated, as the other notification tokens do. - ([#7831](https://github.com/realm/realm-swift/issues/7831), since v2.3.0). -* Results permitted some nonsensical aggregate operations on column types which - do not make sense to aggregate, giving garbage results rather than reporting - an error ([Core #5876](https://github.com/realm/realm-core/pull/5876), since v5.0.0). -* Upserting a document in a Mongo collection would crash if the document's id - type was anything other than ObjectId (since v10.0.0). -* Fix a use-after-free when a sync session is closed and the app is destroyed - at the same time ([Core #5752](https://github.com/realm/realm-core/issues/5752), - since v10.19.0). - -### Deprecations - -* `RLMUpdateResult.objectId` has been deprecated in favor of - `RLMUpdateResult.documentId` to support reporting document ids which are not - object ids. -### Breaking Changes -* Private API `_realmColumnNames` has been renamed to a new public API - called `propertiesMapping()`. This change only affects the Swift API - and doesn't have any effects in the obj-c API. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 14.0.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14.1. - -### Internal - -* Upgraded realm-core from 12.7.0 to 12.9.0 - -10.30.0 Release notes (2022-09-20) -============================================================= - -### Fixed - -* Incoming links from `RealmAny` properties were not handled correctly when - migrating an object type from top-level to embedded. `RealmAny` properties - currently cannot link to embedded objects. - ([Core #5796](https://github.com/realm/realm-core/pull/5796), since 10.8.0). -* `Realm.refresh()` sometimes did not actually advance to the latest version. - It attempted to be semi-non-blocking in a very confusing way which resulted - in it sometimes advancing to a newer version that is not the latest version, - and sometimes blocking until notifiers are ready so that it could advance to - the latest version. This behavior was undocumented and didn't work correctly, - so it now always blocks if needed to advance to the latest version. - ([#7625](https://github.com/realm/realm-swift/issues/7625), since v0.98.0). -* Fix the most common cause of thread priority inversions when performing - writes on the main thread. If beginning the write transaction has to wait for - the background notification calculations to complete, that wait is now done - in a QoS-aware way. ([#7902](https://github.com/realm/realm-swift/issues/7902)) -* Subscribing to link properties in a flexible sync Realm did not work due to a - mismatch between what the client sent and what the server needed. - ([Core #5409](https://github.com/realm/realm-core/issues/5409)) -* Attempting to use `AsymmetricObject` with partition-based sync now reports a - sensible error much earlier in the process. Asymmetric sync requires using - flexible sync. ([Core #5691](https://github.com/realm/realm-core/issues/5691), since 10.29.0). -* Case-insensitive but diacritic-sensitive queries would crash on 4-byte UTF-8 - characters ([Core #5825](https://github.com/realm/realm-core/issues/5825), since v2.2.0) -* Accented characters are now handled by case-insensitive but - diacritic-sensitive queries. ([Core #5825](https://github.com/realm/realm-core/issues/5825), since v2.2.0) - -### Breaking Changes - -* `-[RLMASLoginDelegate authenticationDidCompleteWithError:]` has been renamed - to `-[RLMASLoginDelegate authenticationDidFailWithError:]` to comply with new - app store requirements. This only effects the obj-c API. - ([#7945](https://github.com/realm/realm-swift/issues/7945)) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1 - 14. - -### Internal - -* Upgraded realm-core from 12.6.0 to 12.7.0 - -10.29.0 Release notes (2022-09-09) -============================================================= - -### Enhancements - -* Add support for asymmetric sync. When a class inherits from - `AsymmetricObject`, objects created are synced unidirectionally to the server - and cannot be queried or read locally. - -```swift - class PersonObject: AsymmetricObject { - @Persisted(primaryKey: true) var _id: ObjectId - @Persisted var name: String - @Persisted var age: Int - } - - try realm.write { - // This will create the object on the server but not locally. - realm.create(PersonObject.self, value: ["_id": ObjectId.generate(), - "name": "Dylan", - "age": 20]) - } -``` -* Add ability to section a collection which conforms to `RealmCollection`, `RLMCollection`. - Collections can be sectioned by a unique key retrieved from a keyPath or a callback and will return an instance of `SectionedResults`/`RLMSectionedResults`. - Each section in the collection will be an instance of `ResultsSection`/`RLMSection` which gives access to the elements corresponding to the section key. - `SectionedResults`/`RLMSectionedResults` and `ResultsSection`/`RLMSection` have the ability to be observed. - ```swift - class DemoObject: Object { - @Persisted var title: String - @Persisted var date: Date - var firstLetter: String { - return title.first.map(String.init(_:)) ?? "" - } - } - var sectionedResults: SectionedResults - // ... - sectionedResults = realm.objects(DemoObject.self) - .sectioned(by: \.firstLetter, ascending: true) - ``` -* Add `@ObservedSectionedResults` for SwiftUI support. This property wrapper type retrieves sectioned results - from a Realm using a keyPath or callback to determine the section key. - ```swift - struct DemoView: View { - @ObservedSectionedResults(DemoObject.self, - sectionKeyPath: \.firstLetter) var demoObjects - - var body: some View { - VStack { - List { - ForEach(demoObjects) { section in - Section(header: Text(section.key)) { - ForEach(section) { object in - MyRowView(object: object) - } - } - } - } - } - } - } - ``` -* Add automatic handing for changing top-level objects to embedded objects in - migrations. Any objects of the now-embedded type which have zero incoming - links are deleted, and objects with multiple incoming links are duplicated. - This happens after the migration callback function completes, so there is no - functional change if you already have migration logic which correctly handles - this. ([Core #5737](https://github.com/realm/realm-core/pull/5737)). -* Improve performance when a new Realm file connects to the server for the - first time, especially when significant amounts of data has been written - while offline. ([Core #5772](https://github.com/realm/realm-core/pull/5772)) -* Shift more of the work done on the sync worker thread out of the write - transaction used to apply server changes, reducing how long it blocks other - threads from writing. ([Core #5772](https://github.com/realm/realm-core/pull/5772)) -* Improve the performance of the sync changeset parser, which speeds up - applying changesets from the server. ([Core #5772](https://github.com/realm/realm-core/pull/5772)) - -### Fixed - -* Fix all of the UBSan failures hit by our tests. It is unclear if any of these - manifested as visible bugs. ([Core #5665](https://github.com/realm/realm-core/pull/5665)) -* Upload completion callbacks were sometimes called before the final step of - interally marking the upload as complete, which could result in calling - `Realm.writeCopy()` from the completion callback failing due to there being - unuploaded changes. ([Core #4865](https://github.com/realm/realm-core/issues/4865)). -* Writing to a Realm stored on an exFAT drive threw the exception "fcntl() with - F_BARRIERFSYNC failed: Inappropriate ioctl for device" when a write - transaction needed to expand the file. - ([Core #5789](https://github.com/realm/realm-core/issues/5789), since 10.27.0) -* Syncing a Decimal128 with big significand could result in a crash. - ([Core #5728](https://github.com/realm/realm-core/issues/5728)) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 RC. - -### Internal - -* Upgraded realm-core from 12.5.1 to 12.6.0 - -10.28.7 Release notes (2022-09-02) -============================================================= - -### Enhancements - -* Add prebuilt binaries for Xcode 14 to the release package. - -### Fixed - -* Fix archiving watchOS release builds with Xcode 14. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 6. - -10.28.6 Release notes (2022-08-19) -============================================================= - -### Fixed - -* Fixed an issue where having realm-swift as SPM sub-target dependency leads to - missing symbols error during iOS archiving ([Core #7645](https://github.com/realm/realm-core/pull/7645)). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 5. - -### Internal - -* Upgraded realm-core from 12.5.0 to 12.5.1 - -10.28.5 Release notes (2022-08-09) -============================================================= - -### Enhancements - -* Improve performance of accessing `SubscriptionSet` properties when no writes - have been made to the Realm since the last access. - -### Fixed - -* A use-after-free could occur if a Realm with audit events enabled was - destroyed while processing an upload completion for the events Realm on a - different thread. ([Core PR #5714](https://github.com/realm/realm-core/pull/5714)) -* Opening a read-only synchronized Realm for the first time via asyncOpen did - not set the schema version, which could lead to `m_schema_version != - ObjectStore::NotVersioned` assertion failures later on. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 4. - -### Internal - -* Upgraded realm-core from 12.4.0 to 12.5.0 - -10.28.4 Release notes (2022-08-03) -============================================================= - -### Enhancements - -* Add support for building arm64 watchOS when installing Realm via CocoaPods. -* Reduce the amount of virtual address space used - ([Core #5645](https://github.com/realm/realm-core/pull/5645)). - -### Fixed - -* Fix some warnings when building with Xcode 14 - ([Core #5577](https://github.com/realm/realm-core/pull/5577)). -* Fix compilation failures on watchOS platforms which do not support thread-local storage. - ([#7694](https://github.com/realm/realm-swift/issues/7694), [#7695](https://github.com/realm/realm-swift/issues/7695) since v10.21.1) -* Fix a data race when committing a transaction while multiple threads are - waiting to begin write transactions. This appears to not have caused any - functional problems. -* Fix a data race when writing audit events which could occur if the sync - client thread was busy with other work when the event Realm was opened. -* Fix some cases of running out of virtual address space (seen/reported as mmap - failures) ([Core #5645](https://github.com/realm/realm-core/pull/5645)). -* Audit event scopes containing only write events and no read events would - occasionally throw a `BadVersion` exception when a write transaction was - committed (since v10.26.0). -* The client reset callbacks for the DiscardLocal mode would be passed invalid - Realm instances if the callback was invoked at a point where the Realm was - not otherwise open. ([Core #5654](https://github.com/realm/realm-core/pull/5654), since the introduction of DiscardLocal reset mode in v10.25.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 4. - -### Internal - -* Upgraded realm-core from 12.3.0 to 12.4.0. - -10.28.3 Release notes (2022-07-27) -============================================================= - -### Enhancements - -* Greatly improve the performance of obtaining cached Realm instances in Swift - when using a sync configuration. - -### Fixed - -* Add missing `initialSubscription` and `rerunOnOpen` to copyWithZone method on - `RLMRealmConfiguration`. This resulted in incorrect values when using - `RLMRealmConfiguration.defaultConfiguration`. -* The sync error handler did not hold a strong reference to the sync session - while dispatching the error from the worker thread to the main thread, - resulting in the session passed to the error handler being invalid if there - were no other remaining strong references elsewhere. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 3. - -10.28.2 Release notes (2022-06-30) -============================================================= - -### Fixed - -* Using `seedFilePath` threw an exception if the Realm file being opened - already existed ([#7840](https://github.com/realm/realm-swift/issues/7840), - since v10.26.0). -* The `intialSubscriptions` callback was invoked every time a Realm was opened - regardless of the value of `rerunOnOpen` and if the Realm was already open on - another thread (since v10.28.0). -* Allow using `RLMSupport.Swift` from RealmSwift's Cocoapods - ([#6886](https://github.com/realm/realm-swift/pull/6886)). -* Fix a UBSan failure when mapping encrypted pages. Fixing this did not change - the resulting assembly, so there were probably no functional problems - resulting from this (since v5.0.0). -* Improved performance of sync clients during integration of changesets with - many small strings (totalling > 1024 bytes per changeset) on iOS 14, and - devices which have restrictive or fragmented memory. - ([Core #5614](https://github.com/realm/realm-core/issues/5614)) -* Fix a data race when opening a flexible sync Realm (since v10.28.0). -* Add a missing backlink removal when assigning null or a non-link value to an - `AnyRealmValue` property which previously linked to an object. - This could have resulted in "key not found" exceptions or assertion failures - such as `mixed.hpp:165: [realm-core-12.1.0] Assertion failed: m_type` when - removing the destination link object. - ([Core #5574](https://github.com/realm/realm-core/pull/5573), since the introduction of AnyRealmValue in v10.8.0) - -### Compatibility - -* Realm Studio: 12.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 2. - -### Internal - -* Upgraded realm-core from 12.1.0 to 12.3.0. - -10.28.1 Release notes (2022-06-10) -============================================================= - -### Enhancements - -* Add support for Xcode 14. When building with Xcode 14, the minimum deployment - target is now iOS 11. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4.1. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-14 beta 1. - -10.28.0 Release notes (2022-06-03) -============================================================= - -### Enhancements - -* Replace mentions of 'MongoDB Realm' with 'Atlas App Services' in the documentation and update appropriate links to documentation. -* Allow adding a subscription querying for all documents of a type in swift for flexible sync. -``` - try await subscriptions.update { - subscriptions.append(QuerySubscription(name: "all_people")) - } -``` -* Add Combine API support for flexible sync beta. -* Add an `initialSubscriptions` parameter when retrieving the flexible sync configuration from a user, - which allows to specify a subscription update block, to bootstrap a set of flexible sync subscriptions - when the Realm is first opened. - There is an additional optional parameter flag `rerunOnOpen`, which allows to run this initial - subscriptions on every app startup. - -```swift - let config = user.flexibleSyncConfiguration(initialSubscriptions: { subs in - subs.append(QuerySubscription(name: "people_10") { - $0.age > 10 - }) - }, rerunOnOpen: true) - let realm = try Realm(configuration: config) -``` -* The sync client error handler will report an error, with detailed info about which object caused it, when writing an object to a flexible sync Realm outside of any query subscription. ([#5528](https://github.com/realm/realm-core/pull/5528)) -* Adding an object to a flexible sync Realm for a type that is not within a query subscription will now throw an exception. ([#5488](https://github.com/realm/realm-core/pull/5488)). - -### Fixed - -* Flexible Sync query subscriptions will correctly complete when data is synced to the local Realm. ([#5553](https://github.com/realm/realm-core/pull/5553), since v12.0.0) - -### Breaking Changes - -* Rename `SyncSubscriptionSet.write` to `SyncSubscriptionSet.update` to avoid confusion with `Realm.write`. -* Rename `SyncSubscription.update` to `SyncSubscription.updateQuery` to avoid confusion with `SyncSubscriptionSet.update`. -* Rename `RLMSyncSubscriptionSet.write` to `RLMSyncSubscriptionSet.update` to align it with swift API. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-13.4. - -### Internal - -* Upgraded realm-core from 12.0.0 to 12.1.0. - -10.27.0 Release notes (2022-05-26) -============================================================= - -### Enhancements - -* `@AsyncOpen`/`@AutoOpen` property wrappers can be used with flexible sync. - -### Fixed - -* When installing via SPM, debug builds could potentially hit an assertion - failure during flexible sync bootstrapping. ([Core #5527](https://github.com/realm/realm-core/pull/5527)) -* Flexible sync now only applies bootstrap data if the entire bootstrap is - received. Previously orphaned objects could result from the read snapshot on - the server changing. ([Core #5331](https://github.com/realm/realm-core/pull/5331)) -* Partially fix a performance regression in write performance introduced in - v10.21.1. v10.21.1 fixed a case where a kernel panic or device's battery - dying at the wrong point in a write transaction could potentially result in a - corrected Realm file, but at the cost of a severe performance hit. This - version adjusts how file synchronization is done to provide the same safety - at a much smaller performance hit. ([#7740](https://github.com/realm/realm-swift/issues/7740)). - -### Compatibility - -* Realm Studio: 11.0.0 or later (but see note below). -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-13.4. - -### Internal - -* Upgraded realm-core from 11.17.0 to 12.0.0. -* Bump the version number for the lockfile used for interprocess - synchronization. This has no effect on persistent data, but means that - versions of Realm which use pre-12.0.0 realm-core cannot open Realm files at - the same time as they are opened by this version. Notably this includes Realm - Studio, and v11.1.2 (the latest at the time of this release) cannot open - Realm files which are simultaneously open in the simulator. - -10.26.0 Release notes (2022-05-19) -============================================================= - -Xcode 13.1 is now the minimum supported version of Xcode, as Apple no longer -allows submitting to the app store with Xcode 12. - -### Enhancements - -* Add Xcode 13.4 binaries to the release package. -* Add Swift API for asynchronous transactions -```swift - try? realm.writeAsync { - realm.create(SwiftStringObject.self, value: ["string"]) - } onComplete: { error in - // optional handling on write complete - } - - try? realm.beginAsyncWrite { - realm.create(SwiftStringObject.self, value: ["string"]) - realm.commitAsyncWrite() - } - - let asyncTransactionId = try? realm.beginAsyncWrite { - // ... - } - try! realm.cancelAsyncWrite(asyncTransactionId) -``` -* Add Obj-C API for asynchronous transactions -``` - [realm asyncTransactionWithBlock:^{ - [StringObject createInRealm:realm withValue:@[@"string"]]; - } onComplete:^(NSError *error) { - // optional handling - }]; - - [realm beginAsyncWriteTransaction:^{ - [StringObject createInRealm:realm withValue:@[@"string"]]; - [realm commitAsyncWriteTransaction]; - }]; - - RLMAsyncTransactionId asyncTransactionId = [realm beginAsyncWriteTransaction:^{ - // ... - }]; - [realm cancelAsyncTransaction:asyncTransactionId]; -``` -* Improve performance of opening a Realm with `objectClasses`/`objectTypes` set - in the configuration. -* Implement the Realm event recording API for reporting reads and writes on a - Realm file to Atlas. - -### Fixed - -* Lower minimum OS version for `async` login and FunctionCallables to match the - rest of the `async` functions. ([#7791]https://github.com/realm/realm-swift/issues/7791) -* Consuming a RealmSwift XCFramework with library evolution enabled would give the error - `'Failed to build module 'RealmSwift'; this SDK is not supported by the compiler'` - when the XCFramework was built with an older XCode version and is - then consumed with a later version. ([#7313](https://github.com/realm/realm-swift/issues/7313), since v3.18.0) -* A data race would occur when opening a synchronized Realm with the client - reset mode set to `discardLocal` on one thread at the same time as a client - reset was being processed on another thread. This probably did not cause any - functional problems in practice and the broken timing window was very tight (since 10.25.0). -* If an async open of a Realm triggered a client reset, the callbacks for - `discardLocal` could theoretically fail to be called due to a race condition. - The timing for this was probably not possible to hit in practice (since 10.25.0). -* Calling `[RLMRealm freeze]`/`Realm.freeze` on a Realm which had been created from `writeCopy` - would not produce a frozen Realm. ([#7697](https://github.com/realm/realm-swift/issues/7697), since v5.0.0) -* Using the dynamic subscript API on unmanaged objects before first opening a - Realm or if `objectTypes` was set when opening a Realm would throw an - exception ([#7786](https://github.com/realm/realm-swift/issues/7786)). -* The sync client may have sent a corrupted upload cursor leading to a fatal - error from the server due to an uninitialized variable. - ([#5460](https://github.com/realm/realm-core/pull/5460), since v10.25.1) -* Flexible sync would not correctly resume syncing if a bootstrap was interrupted - ([#5466](https://github.com/realm/realm-core/pull/5466), since v10.21.1). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.4. -* CocoaPods: 1.10 or later. -* Xcode: 13.1-13.4. - -### Internal - -* Upgraded realm-core from v11.15.0 to v11.17.0 - -10.25.2 Release notes (2022-04-27) -============================================================= - -### Enhancements - -* Replace Xcode 13.3 binaries with 13.3.1 binaries. - -### Fixed - -* `List` would contain an invalidated object instead of null when - the object linked to was deleted by a difference sync client - ([Core #5215](https://github.com/realm/realm-core/pull/5215), since v10.8.0). -* Adding an object to a Set, deleting the parent object of the Set, and then - deleting the object which was added to the Set would crash - ([Core #5387](https://github.com/realm/realm-core/issues/5387), since v10.8.0). -* Synchronized Realm files which were first created using v10.0.0-beta.3 would - be redownloaded instead of using the existing file, possibly resulting in the - loss of any unsynchronized data in those files (since v10.20.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3.1. - -### Internal - -* Upgraded realm-core from v11.14.0 to v11.15.0 - -10.25.1 Release notes (2022-04-11) -============================================================= - -### Fixed - -* Fixed various memory corruption bugs when encryption is used caused by not - locking a mutex when needed. - ([#7640](https://github.com/realm/realm-swift/issues/7640), [#7659](https://github.com/realm/realm-swift/issues/7659), since v10.21.1) -* Changeset upload batching did not calculate the accumulated size correctly, - resulting in “error reading body failed to read: read limited at 16777217 - bytes” errors from the server when writing large amounts of data - ([Core #5373](https://github.com/realm/realm-core/pull/5373), since 10.25.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3. - -### Internal - -* Upgraded realm-core from v11.13.0 to v11.14.0. - -10.25.0 Release notes (2022-03-29) -============================================================= - -Synchronized Realm files written by this version cannot be opened by older -versions of Realm. Existing files will be automatically upgraded when opened. - -Non-synchronized Realm files remain backwards-compatible. - -### Enhancements - -* Add ability to use Swift Query syntax in `@ObservedResults`, which allows you - to filter results using the `where` parameter. -* Add ability to use `MutableSet` with `StateRealmObject` in SwiftUI. -* Async/Await extensions are now compatible with iOS 13 and above when building - with Xcode 13.3. -* Sync changesets waiting to be uploaded to the server are now compressed, - reducing the disk space needed when large write transactions are performed - while offline or limited in bandwidth.([Core #5260](https://github.com/realm/realm-core/pull/5260)). -* Added new `SyncConfiguration.clientResetMode` and `RLMSyncConfiguration.clientResetMode` properties. - - The values of these properties will dictate client behavior in the event of a [client reset](https://docs.mongodb.com/realm/sync/error-handling/client-resets/). - - See below for information on `ClientResetMode` values. - - `clientResetMode` defaults to `.manual` if not set otherwise. -* Added new `ClientResetMode` and `RLMClientResetMode` enums. - - These enums represent possible client reset behavior for `SyncConfiguration.clientResetMode` and `RLMSyncConfiguration.clientResetMode`, respectively. - - `.manual` and `RLMClientResetModeManual` - - The local copy of the Realm is copied into a recovery - directory for safekeeping, and then deleted from the original location. The next time - the Realm for that partition value is opened, the Realm will automatically be re-downloaded from - MongoDB Realm, and can be used as normal. - - Data written to the Realm after the local copy of the Realm diverged from the backup - remote copy will be present in the local recovery copy of the Realm file. The - re-downloaded Realm will initially contain only the data present at the time the Realm - was backed up on the server. - - `rlmSync_clientResetBackedUpRealmPath` and `SyncError.clientResetInfo()` are used for accessing the recovery directory. - - `.discardLocal` and `RLMClientResetDiscardLocal` - - All unsynchronized local changes are automatically discarded and the local state is - automatically reverted to the most recent state from the server. Unsynchronized changes - can then be recovered in a post-client-reset callback block (See changelog below for more details). - - If RLMClientResetModeDiscardLocal is enabled but the client reset operation is unable to complete - then the client reset process reverts to manual mode. - - The realm's underlying object accessors remain bound so the UI may be updated in a non-disruptive way. -* Added support for client reset notification blocks for `.discardLocal` and `RLMClientResetDiscardLocal` - - **RealmSwift implementation**: `discardLocal(((Realm) -> Void)? = nil, ((Realm, Realm) -> Void)? = nil)` - - RealmSwift client reset blocks are set when initializing the user configuration - ```swift - var configuration = user.configuration(partitionValue: "myPartition", clientResetMode: .discardLocal(beforeClientResetBlock, afterClientResetBlock)) - ``` - - The before client reset block -- `((Realm) -> Void)? = nil` -- is executed prior to a client reset. Possible usage includes: - ```swift - let beforeClientResetBlock: (Realm) -> Void = { beforeRealm in - var recoveryConfig = Realm.Configuration() - recoveryConfig.fileURL = myRecoveryPath - do { - beforeRealm.writeCopy(configuration: recoveryConfig) - /* The copied realm could be used later for recovery, debugging, reporting, etc. */ - } catch { - /* handle error */ - } - } - ``` - - The after client reset block -- `((Realm, Realm) -> Void)? = nil)` -- is executed after a client reset. Possible usage includes: - ```Swift - let afterClientResetBlock: (Realm, Realm) -> Void = { before, after in - /* This block could be used to add custom recovery logic, back-up a realm file, send reporting, etc. */ - for object in before.objects(myClass.self) { - let res = after.objects(myClass.self) - if (res.filter("primaryKey == %@", object.primaryKey).first != nil) { - /* ...custom recovery logic... */ - } else { - /* ...custom recovery logic... */ - } - } - ``` - - **Realm Obj-c implementation**: Both before and after client reset callbacks exist as properties on `RLMSyncConfiguration` and are set at initialization. - ```objective-c - RLMRealmConfiguration *config = [user configurationWithPartitionValue:partitionValue - clientResetMode:RLMClientResetModeDiscardLocal - notifyBeforeReset:beforeBlock - notifyAfterReset:afterBlock]; - ``` - where `beforeBlock` is of type `RLMClientResetBeforeBlock`. And `afterBlock` is of type `RLMClientResetAfterBlock`. - -### Breaking Changes - -* Xcode 13.2 is no longer supported when building with Async/Await functions. Use - Xcode 13.3 to build with Async/Await functionality. - -### Fixed - -* Adding a Realm Object to a `ObservedResults` or a collections using - `StateRealmObject` that is managed by the same Realm would throw if the - Object was frozen and not thawed before hand. -* Setting a Realm Configuration for @ObservedResults using it's initializer - would be overrode by the Realm Configuration stored in - `.environment(\.realmConfiguration, ...)` if they did not match - ([Cocoa #7463](https://github.com/realm/realm-swift/issues/7463), since v10.6.0). -* Fix searchable component filter overriding the initial filter on `@ObservedResults`, (since v10.23.0). -* Comparing `Results`, `LinkingObjects` or `AnyRealmCollection` when using Realm via XCFramework - would result in compile time errors ([Cocoa #7615](https://github.com/realm/realm-swift/issues/7615), since v10.21.0) -* Opening an encrypted Realm while the keychain is locked on macOS would crash - ([#7438](https://github.com/realm/realm-swift/issues/7438)). -* Updating subscriptions while refreshing the access token would crash - ([Core #5343](https://github.com/realm/realm-core/issues/5343), since v10.22.0) -* Fix several race conditions in `SyncSession` related to setting - `customRequestHeaders` while using the `SyncSession` on a different thread. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3. - -### Internal - -* Upgraded realm-core from v11.12.0 to v11.13.0 - -10.24.2 Release notes (2022-03-18) -============================================================= - -### Fixed - -* Application would sometimes crash with exceptions like 'KeyNotFound' or - assertion "has_refs()". Other issues indicating file corruption may also be - fixed by this. The one mentioned here is the one that lead to solving the - problem. - ([Core #5283](https://github.com/realm/realm-core/issues/5283), since v5.0.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3. - -### Internal - -* Upgraded realm-core from 11.11.0 to 11.12.0 - -10.24.1 Release notes (2022-03-14) -============================================================= - -Switch to building the Carthage binary with Xcode 13.3. This release contains -no functional changes from 10.24.0. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.3. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3. - -10.24.0 Release notes (2022-03-05) -============================================================= - -### Enhancements - -* Add ability to use Swift Query syntax in `@ObservedResults`, which allows you - to filter results using the `where` parameter. - -### Fixed - -* If a list of objects contains links to objects not included in the - synchronized partition, collection change notifications for that list could - be incorrect ([Core #5164](https://github.com/realm/realm-core/issues/5164), since v10.0.0). -* Adding a new flexible sync subscription could crash with - "Assertion failed: !m_unbind_message_sent" in very specific timing scenarios - ([Core #5149](https://github.com/realm/realm-core/pull/5149), since v10.22.0). -* Converting floats/doubles into Decimal128 would yield imprecise results - ([Core #5184](https://github.com/realm/realm-core/pull/5184), since v10.0.0) -* Using accented characters in class and field names in a synchronized Realm - could result in sync errors ([Core #5196](https://github.com/realm/realm-core/pull/5196), since v10.0.0). -* Calling `Realm.invalidate()` from inside a Realm change notification could - result in the write transaction which produced the notification not being - persisted to disk (since v10.22.0). -* When a client reset error which results in the current Realm file being - backed up and then deleted, deletion errors were ignored as long as the copy - succeeded. When this happens the deletion of the old file is now scheduled - for the next launch of the app. ([Core #5180](https://github.com/realm/realm-core/issues/5180), since v2.0.0) -* Fix an error when compiling a watchOS Simulator target not supporting - Thread-local storage ([#7623](https://github.com/realm/realm-swift/issues/7623), since v10.21.0). -* Add a validation check to report a sensible error if a Realm configuration - indicates that an in-memory Realm should be encrypted. ([Core #5195](https://github.com/realm/realm-core/issues/5195)) -* The Swift package set the linker flags on the wrong target, resulting in - linker errors when SPM decides to build the core library as a dynamic library - ([#7266](https://github.com/realm/realm-swift/issues/7266)). -* The download-core task failed if run in an environment without TMPDIR set - ([#7688](https://github.com/realm/realm-swift/issues/7688), since v10.23.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3 beta 3. - -### Internal - -* Upgraded realm-core from 11.9.0 to 11.11.0 - -10.23.0 Release notes (2022-02-28) -============================================================= - -### Enhancements - -* Add `Realm.writeCopy(configuration:)`/`[RLMRealm writeCopyForConfiguration:]` which gives the - following functionality: - - Export a local non-sync Realm to be used with MongoDB Realm Sync - when the configuration is derived from a sync `RLMUser`/`User`. - - Write a copy of a local Realm to a destination specified in the configuration. - - Write a copy of a synced Realm in use with user A, and open it with user B. - - Note that migrations may be required when using a local realm configuration to open a realm file that - was copied from a synchronized realm. - - An exception will be thrown if a Realm exists at the destination. -* Add a `seedFilePath` option to `RLMRealmConfiguration` and `Configuration`. If this - option is set then instead of creating an empty Realm, the realm at the `seedFilePath` will - be copied to the `fileURL` of the new Realm. If a Realm file already exists at the - desitnation path, the seed file will not be copied and the already existing Realm - will be opened instead. Note that to use this parameter with a synced Realm configuration - the seed Realm must be appropriately copied to a destination with - `Realm.writeCopy(configuration:)`/`[RLMRealm writeCopyForConfiguration:]` first. -* Add ability to permanently delete a User from a MongoDB Realm app. This can - be invoked with `User.delete()`/`[RLMUser deleteWithCompletion:]`. -* Add `NSCopying` conformance to `RLMDecimal128` and `RLMObjectId`. -* Add Xcode 13.3 binaries to the release package (and remove 13.0). - -### Fixed - -* Add support of arm64 in Carthage build ([#7154](https://github.com/realm/realm-cocoa/issues/7154) -* Adding missing support for `IN` queries to primitives types on Type Safe Queries. - ```swift - let persons = realm.objects(Person.self).where { - let acceptableNames = ["Tom", "James", "Tyler"] - $0.name.in([acceptableNames]) - } - ``` - ([Cocoa #7633](https://github.com/realm/realm-swift/issues/7633), since v10.19.0) -* Work around a compiler crash when building with Swift 5.6 / Xcode 13.3. - CustomPersistable's PersistedType must now always be a built-in type rather - than possibly another CustomPersistable type as Swift 5.6 has removed support - for infinitely-recursive associated types ([#7654](https://github.com/realm/realm-swift/issues/7654)). -* Fix redundant call to filter on `@ObservedResults` from `searchable` - component (since v10.19.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.3 beta 3. - -10.22.0 Release notes (2022-01-25) -============================================================= - -### Enhancements - -* Add beta support for flexible sync. See the [backend](https://docs.mongodb.com/realm/sync/data-access-patterns/flexible-sync/) and [SDK](https://docs.mongodb.com/realm/sdk/swift/examples/flexible-sync/) documentation for more information. Please report any issues with the beta through Github. - -### Fixed - -* UserIdentity metadata table grows indefinitely. ([#5152](https://github.com/realm/realm-core/issues/5152), since v10.20.0) -* We now report a useful error message when opening a sync Realm in non-sync mode or vice-versa.([#5161](https://github.com/realm/realm-core/pull/5161), since v5.0.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.2.1. - -### Internal - -* Upgraded realm-core from 11.8.0 to 11.9.0 - -10.21.1 Release notes (2022-01-12) -============================================================= - -### Fixed - -* The sync client will now drain the receive queue when a send fails with - ECONNRESET, ensuring that any error message from the server gets received and - processed. ([#5078](https://github.com/realm/realm-core/pull/5078)) -* Schema validation was missing for embedded objects in sets, resulting in an - unhelpful error being thrown if a Realm object subclass contained one (since v10.0.0). -* Opening a Realm with a schema that has an orphaned embedded object type - performed an extra empty write transaction (since v10.0.0). -* Freezing a Realm with a schema that has orphaned embedded object types threw - a "Wrong transactional state" exception (since v10.19.0). -* `@sum` and `@avg` queries on Dictionaries of floats or doubles used too much - precision for intermediates, resulting in incorrect rounding (since v10.5.0). -* Change the exception message for calling refresh on an immutable Realm from - "Continuous transaction through DB object without history information." to - "Can't refresh a read-only Realm." - ([#5061](https://github.com/realm/realm-core/issues/5061), since v10.8.0). -* Queries of the form "link.collection.@sum = 0" where `link` is null matched - when `collection` was a List or Set, but not a Dictionary - ([#5080](https://github.com/realm/realm-core/pull/5080), since v10.8.0). -* Types which require custom obj-c bridging (such as `PersistableEnum` or - `CustomPersistable`) would crash with exceptions mentioning `__SwiftValue` in - a variety of places on iOS versions older than iOS 14 - ([#7604](https://github.com/realm/realm-swift/issues/7604), since v10.21.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.2.1. - -### Internal - -* Upgraded realm-core from 11.6.1 to 11.8.0. - -10.21.0 Release notes (2022-01-10) -============================================================= - -### Enhancements - -* Add `metadata` property to `RLMUserProfile`/`UserProfile`. -* Add class `Projection` to allow creation of light weight view models out of Realm Objects. -```swift -public class Person: Object { - @Persisted var firstName = "" - @Persisted var lastName = "" - @Persisted var address: Address? = nil - @Persisted var friends = List() -} - -public class Address: EmbeddedObject { - @Persisted var city: String = "" - @Persisted var country = "" -} - -class PersonProjection: Projection { - // `Person.firstName` will have same name and type - @Projected(\Person.firstName) var firstName - // There will be the only String for `city` of the original object `Address` - @Projected(\Person.address.city) var homeCity - // List will be mapped to list of firstNames - @Projected(\Person.friends.projectTo.firstName) var firstFriendsName: ProjectedCollection -} - -// `people` will contain projections for every `Person` object in the `realm` -let people: Results = realm.objects(PersonProjection.self) -``` -* Greatly improve performance of reading AnyRealmValue and enum types from - Realm collections. -* Allow using Swift enums which conform to `PersistableEnum` as the value type - for all Realm collections. -* `AnyRealmCollection` now conforms to `Encodable`. -* AnyRealmValue and PersistableEnum values can now be passed directly to an - NSPredicate used in a filter() call rather than having to pass the rawValue - (the rawValue is still allowed). -* Queries on collections of PersistableEnums can now be performed with `where()`. -* Add support for querying on the rawValue of an enum with `where()`. -* `.count` is supported for Maps of all types rather than just numeric types in `where()`. -* Add support for querying on the properties of objects contained in - dictionaries (e.g. "dictProperty.@allValues.name CONTAINS 'a'"). -* Improve the error message for many types of invalid predicates in queries. -* Add support for comparing `@allKeys` to another property on the same object. -* Add `Numeric` conformance to `Decimal128`. -* Make some invalid property declarations such as `List` a - compile-time error instead of a runtime error. -* Calling `.sorted(byKeyPath:)` on a collection with an Element type which does - not support sorting by keypaths is now a compile-time error instead of a - runtime error. -* `RealmCollection.sorted(ascending:)` can now be called on all - non-Object/EmbeddedObject collections rather than only ones where the - `Element` conforms to `Comparable`. -* Add support for using user-defined types with `@Persistable` and in Realm - collections by defining a mapping to and from a type which Realm knows how to - store. For example, `URL` can be made persistable with: - ```swift - extension URL: FailableCustomPersistable { - // Store URL values as a String in Realm - public typealias PersistedType = String - // Convert a String to a URL - public init?(persistedValue: String) { self.init(string: persistedValue) } - // Convert a URL to a String - public var persistableValue: String { self.absoluteString } - } - ``` - After doing this, `@Persisted var url: URL` is a valid property declaration - on a Realm object. More advanced mappings can be done by mapping to an - EmbeddedObject which can store multiple values. - -### Fixed - -* Accessing a non object collection inside a migration would cause a crash -* [#5633](https://github.com/realm/realm-cocoa/issues/5633). -* Accessing a `Map` of objects dynamically would not handle nulled values correctly (since v10.8.0). -* `where()` allowed constructing some nonsensical queries due to boolean - comparisons returning `Query` rather than `Query` (since v10.19.0). -* `@allValues` queries on dictionaries accidentally did not require "ANY". -* Case-insensitive and diacritic-insensitive modifiers were ignored when - comparing the result of an aggregate operation to another property in a - query. -* `Object.init(value:)` did not allow initializing `RLMDictionary`/`Map` - properties with null values for map entries (since v10.8.0). -* `@ObservedResults` did not refresh when changes were made to the observed - collection. (since v10.6.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.2.1. - -10.20.1 Release notes (2021-12-14) -============================================================= - -Xcode 12.4 is now the minimum supported version of Xcode. - -### Fixed - -* Add missing `Indexable` support for UUID. - ([Cocoa #7545](https://github.com/realm/realm-swift/issues/7545), since v10.10.0) - -### Breaking Changes - -* All `async` functions now require Xcode 13.2 to work around an App - Store/TestFlight bug that results in apps built with 13.0/13.1 which do not - use libConcurrency but link a library which does crashing on startup. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.2. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.2. - -10.20.0 Release notes (2021-11-16) -============================================================= - -### Enhancements - -* Conform `@ThreadSafe` and `ThreadSafeReference` to `Sendable`. -* Allow using Swift enums which conform to `PersistableEnum` as the value type - for all Realm collections. -* `AnyRealmCollection` now conforms to `Encodable`. -* Greatly improve performance of reading AnyRealmValue and enum types from - Realm collections. -* `AnyRealmCollection` now conforms to `Encodable`. - -### Fixed - -* `@AutoOpen` will open the existing local Realm file on any connection error - rather than only when the connection specifically times out. -* Do not allow `progress` state changes for `@AutoOpen` and `@AsyncOpen` after - changing state to `open(let realm)` or `error(let error)`. -* Logging out a sync user failed to remove the local Realm file for partitions - with very long partition values that would have exceeded the maximum path - length. ([Core #4187](https://github.com/realm/realm-core/issues/4187), since v10.0.0) -* Don't keep trying to refresh the access token if the client's clock is more - than 30 minutes fast. ([Core #4941](https://github.com/realm/realm-core/issues/4941)) -* Failed auth requests used a fixed long sleep rather than exponential backoff - like other sync requests, which could result in very delayed reconnects after - a device was offline long enough for the access token to expire (since v10.0.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.1. - -### Internal - -* Upgraded realm-core from 11.6.0 to 11.6.1. - -10.19.0 Release notes (2021-11-04) -============================================================= - -### Enhancements - -* Add `.searchable()` SwiftUI View Modifier which allows filtering - `@ObservedResult` results from a search field component by a key path. - ```swift - List { - ForEach(reminders) { reminder in - ReminderRowView(reminder: reminder) - } - }.searchable(text: $searchFilter, - collection: $reminders, - keyPath: \.name) { - ForEach(reminders) { remindersFiltered in - Text(remindersFiltered.name).searchCompletion(remindersFiltered.name) - } - } - ``` -* Add an API for a type safe query syntax. This allows you to filter a Realm - and collections managed by a Realm with Swift style expressions. Here is a - brief example: - ```swift - class Person: Object { - @Persisted var name: String - @Persisted var hobbies: MutableSet - @Persisted var pets: List - } - class Pet: Object { - @Persisted var name: String - @Persisted var age: Int - } - - let persons = realm.objects(Person.self).where { - $0.hobbies.contains("music") || $0.hobbies.contains("baseball") - } - - persons = realm.objects(Person.self).where { - ($0.pets.age >= 2) && $0.pets.name.starts(with: "L") - } - ``` - ([#7419](https://github.com/realm/realm-swift/pull/7419)) -* Add support for dictionary subscript expressions - (e.g. `"phoneNumbers['Jane'] == '123-3456-123'"`) when querying with an - NSPredicate. -* Add UserProfile to User. This contains metadata from social logins with MongoDB Realm. -* Slightly reduce the peak memory usage when processing sync changesets. - -### Fixed - -* Change default request timeout for `RLMApp` from 6 seconds to 60 seconds. -* Async `Realm` init would often give a Realm instance which could not actually - be used and would throw incorrect thread exceptions. It now is `@MainActor` - and gives a Realm instance which always works on the main actor. The - non-functional `queue:` parameter has been removed (since v10.15.0). -* Restore the pre-v10.12.0 behavior of calling `writeCopy()` on a synchronized - Realm which produced a local non-synchronized Realm - ([#7513](https://github.com/realm/realm-swift/issues/7513)). -* Decimal128 did not properly normalize the value before hashing and so could - have multiple values which are equal but had different hash values (since v10.8.0). -* Fix a rare assertion failure or deadlock when a sync session is racing to - close at the same time that external reference to the Realm is being - released. ([Core #4931](https://github.com/realm/realm-core/issues/4931)) -* Fix a assertion failure when opening a sync Realm with a user who had been - removed. Instead an exception will be thrown. ([Core #4937](https://github.com/realm/realm-core/issues/4937), since v10.0.0) -* Fixed a rare segfault which could trigger if a user was being logged out - while the access token refresh response comes in. - ([Core #4944](https://github.com/realm/realm-core/issues/4944), since v10.0.0) -* Fixed a bug where progress notifiers on an AsyncOpenTask could be called - after the open completed. ([Core #4919](https://github.com/realm/realm-core/issues/4919)) -* SecureTransport was not enabled for macCatalyst builds when installing via - SPM, resulting in `'SSL/TLS protocol not supported'` exceptions when using - Realm Sync. ([#7474](https://github.com/realm/realm-swift/issues/7474)) -* Users were left in the logged in state when their refresh token expired. - ([Core #4882](https://github.com/realm/realm-core/issues/4882), since v10) -* Calling `.count` on a distinct collection would return the total number of - objects in the collection rather than the distinct count the first time it is - called. ([#7481](https://github.com/realm/realm-swift/issues/7481), since v10.8.0). -* `realm.delete(collection.distinct(...))` would delete all objects in the - collection rather than just the first object with each distinct value in the - property being distincted on, unless the distinct Results were read from at - least once first (since v10.8.0). -* Calling `.distinct()` on a collection, accessing the Results, then passing - the Results to `realm.delete()` would delete the correct objects, but - afterwards report a count of zero even if there were still objects in the - Results (since v10.8.0). -* Download compaction could result in non-streaming sync download notifiers - never reporting completion (since v10.0.0, - [Core #4989](https://github.com/realm/realm-core/pull/4989)). -* Fix a deadlock in SyncManager that was probably not possible to hit in - real-world code (since v10.0.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.4-13.2. - -### Internal - -* Upgraded realm-core from v11.4.1 to v11.6.0 - -10.18.0 Release notes (2021-10-25) -============================================================= - -### Enhancements - -* Add support for using multiple users with `@AsyncOpen` and `@AutoOpen`. - Setting the current user to a new user will now automatically reopen the - Realm with the new user. -* Add prebuilt binary for Xcode 13.1 to the release package. - -### Fixed - -* Fix `@AsyncOpen` and `@AutoOpen` using `defaultConfiguration` by default if - the user's doesn't provide one, will set an incorrect path which doesn't - correspond to the users configuration one. (since v10.12.0) -* Adding missing subscription completion for `AsyncOpenPublisher` after - successfully returning a realm. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.1. - -10.17.0 Release notes (2021-10-06) -============================================================= - -### Enhancements - -* Add a new `@ThreadSafe` property wrapper. Objects and collections wrapped by `@ThreadSafe` may be passed between threads. It's - intended to allow local variables and function parameters to be used across - threads when needed. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.0. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0. - -10.16.0 Release notes (2021-09-29) -============================================================= - -### Enhancements - -* Add `async` versions of `EmailPasswordAuth.callResetPasswordFunction` and -r `User.linkUser` methods. -* Add `async` version of `MongoCollection` methods. -* Add `async` support for user functions. - -### Fixed - -* A race condition in Realm.asyncOpen() sometimes resulted in subsequent writes - from Realm Sync failing to produce notifications - ([#7447](https://github.com/realm/realm-swift/issues/7447), - [#7453](https://github.com/realm/realm-swift/issues/7453), - [Core #4909](https://github.com/realm/realm-core/issues/4909), since v10.15.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.0. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0. - -10.15.1 Release notes (2021-09-15) -============================================================= - -### Enhancements - -* Switch to building the Carthage release with Xcode 13. - -### Fixed - -* Fix compilation error where Swift 5.5 is available but the macOS 12 SDK was - not. This was notable for the Xcode 13 RC. This fix adds a #canImport check - for the `_Concurrency` module that was not available before the macOS 12 SDK. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 13.0. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0. - -10.15.0 Release notes (2021-09-10) -============================================================= - -### Enhancements - -* Add `async` versions of the `Realm.asyncOpen` and `App.login` methods. -* ThreadSafeReference no longer pins the source transaction version for - anything other than a Results created by filtering a collection. This means - that holding on to thread-safe references to other things (such as Objects) - will no longer cause file size growth. -* A ThreadSafeReference to a Results backed by a collection can now be created - inside a write transaction as long as the collection was not created in the - current write transaction. -* Synchronized Realms are no longer opened twice, cutting the address space and - file descriptors used in half. - ([Core #4839](https://github.com/realm/realm-core/pull/4839)) -* When using the SwiftUI helper types (@ObservedRealmObject and friends) to - bind to an Equatable property, self-assignment no longer performs a pointless - write transaction. SwiftUI appears to sometimes call a Binding's set function - multiple times for a single UI action, so this results in significantly fewer - writes being performed. - -### Fixed - -* Adding an unmanaged object to a Realm that was declared with - `@StateRealmObject` would throw the exception `"Cannot add an object with - observers to a Realm"`. -* The `RealmCollectionChange` docs refered to indicies in modifications as the - 'new' collection. This is incorrect and the docs now state that modifications - refer to the previous version of the collection. ([Cocoa #7390](https://github.com/realm/realm-swift/issues/7390)) -* Fix crash in `RLMSyncConfiguration.initWithUser` error mapping when a user is disabled/deleted from MongoDB Realm dashboard. - ([Cocoa #7399](https://github.com/realm/realm-swift/issues/7399), since v10.0.0) -* If the application crashed at the wrong point when logging a user in, the - next run of the application could hit the assertion failure "m_state == - SyncUser::State::LoggedIn" when a synchronized Realm is opened with that - user. ([Core #4875](https://github.com/realm/realm-core/issues/4875), since v10.0.0) -* The `keyPaths:` parameter to `@ObservedResults` did not work (since v10.12.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 5. - -### Internal - -* Upgraded realm-core from 11.3.1 to 11.4.1 - -10.14.0 Release notes (2021-09-03) -============================================================= - -### Enhancements - -* Add additional `observe` methods for Objects and RealmCollections which take - a `PartialKeyPath` type key path parameter. -* The release package once again contains Xcode 13 binaries. -* `PersistableEnum` properties can now be indexed or used as the primary key if - the RawValue is an indexable or primary key type. - -### Fixed - -* `Map` did not conform to `Codable`. - ([Cocoa #7418](https://github.com/realm/realm-swift/pull/7418), since v10.8.0) -* Fixed "Invalid data type" assertion failure in the sync client when the - client recieved an AddColumn instruction from the server for an AnyRealmValue - property when that property already exists locally. ([Core #4873](https://github.com/realm/realm-core/issues/4873), since v10.8.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 5. - -### Internal - -* Upgraded realm-core from 11.3.0 to 11.3.1. - -10.13.0 Release notes (2021-08-26) -============================================================= - -### Enhancements - -* Sync logs now contain information about what object/changeset was being applied when the exception was thrown. - ([Core #4836](https://github.com/realm/realm-core/issues/4836)) -* Added ServiceErrorCode for wrong username/password when using '`App.login`. - ([Core #7380](https://github.com/realm/realm-swift/issues/7380) - -### Fixed - -* Fix crash in `MongoCollection.findOneDocument(filter:)` that occurred when no results were - found for a given filter. - ([Cocoa #7380](https://github.com/realm/realm-swift/issues/7380), since v10.0.0) -* Some of the SwiftUI property wrappers incorrectly required objects to conform - to ObjectKeyIdentifiable rather than Identifiable. - ([Cocoa #7372](https://github.com/realm/realm-swift/issues/7372), since v10.6.0) -* Work around Xcode 13 beta 3+ shipping a broken swiftinterface file for Combine on 32-bit iOS. - ([Cocoa #7368](https://github.com/realm/realm-swift/issues/7368)) -* Fixes history corruption when replacing an embedded object in a list. - ([Core #4845](https://github.com/realm/realm-core/issues/4845)), since v10.0.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 5. - -### Internal - -* Upgraded realm-core from 11.2.0 to 11.3.0 - -10.12.0 Release notes (2021-08-03) -============================================================= - -### Enhancements - -* `Object.observe()` and `RealmCollection.observe()` now include an optional - `keyPaths` parameter which filters change notifications to those only - occurring on the provided key path or key paths. See method documentation - for extended detail on filtering behavior. -* `ObservedResults` now includes an optional `keyPaths` parameter - which filters change notifications to those only occurring on the provided - key path or key paths. ex) `@ObservedResults(MyObject.self, keyPaths: ["myList.property"])` -* Add two new property wrappers for opening a Realm asynchronously in a - SwiftUI View: - - `AsyncOpen` is a property wrapper that initiates Realm.asyncOpen - for the current user, notifying the view when there is a change in Realm asyncOpen state. - - `AutoOpen` behaves similarly to `AsyncOpen`, but in the case of no internet - connection this will return an opened realm. -* Add `EnvironmentValues.partitionValue`. This value can be injected into any view using one of - our new property wrappers `AsyncOpen` and `AutoOpen`: - `MyView().environment(\.partitionValue, "partitionValue")`. -* Shift more of the work done when first initializing a collection notifier to - the background worker thread rather than doing it on the main thread. - -### Fixed - -* `configuration(partitionValue: AnyBSON)` would always set a nil partition value - for the user sync configuration. -* Decoding a `@Persisted` property would incorrectly throw a `DecodingError.keyNotFound` - for an optional property if the key is missing. - ([Cocoa #7358](https://github.com/realm/realm-swift/issues/7358), since v10.10.0) -* Fixed a symlink which prevented Realm from building on case sensitive file systems. - ([#7344](https://github.com/realm/realm-swift/issues/7344), since v10.8.0) -* Removing a change callback from a Results would sometimes block the calling - thread while the query for that Results was running on the background worker - thread (since v10.11.0). -* Object observers did not handle the object being deleted properly, which - could result in assertion failures mentioning "m_table" in ObjectNotifier - ([Core #4824](https://github.com/realm/realm-core/issues/4824), since v10.11.0). -* Fixed a crash when delivering notifications over a nested hierarchy of lists - of Mixed that contain links. ([Core #4803](https://github.com/realm/realm-core/issues/4803), since v10.8.0) -* Fixed a crash when an object which is linked to by a Mixed is deleted via - sync. ([Core #4828](https://github.com/realm/realm-core/pull/4828), since v10.8.0) -* Fixed a rare crash when setting a mixed link for the first time which would - trigger if the link was to the same table and adding the backlink column - caused a BPNode split. ([Core #4828](https://github.com/realm/realm-core/pull/4828), since v10.8.0) - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 4. On iOS Xcode 13 beta 2 is the latest supported - version due to betas 3 and 4 having a broken Combine.framework. - -### Internal - -* Upgraded realm-core from v11.1.1 to v11.2.0 - -10.11.0 Release notes (2021-07-22) -============================================================= - -### Enhancements - -* Add type safe methods for: - - `RealmCollection.min(of:)` - - `RealmCollection.max(of:)` - - `RealmCollection.average(of:)` - - `RealmCollection.sum(of:)` - - `RealmCollection.sorted(by:ascending:)` - - `RealmKeyedCollection.min(of:)` - - `RealmKeyedCollection.max(of:)` - - `RealmKeyedCollection.average(of:)` - - `RealmKeyedCollection.sum(of:)` - - `RealmKeyedCollection.sorted(by:ascending:)` - - `Results.distinct(by:)` - - `SortDescriptor(keyPath:ascending:) - - Calling these methods can now be done via Swift keyPaths, like so: - ```swift - class Person: Object { - @Persisted var name: String - @Persisted var age: Int - } - - let persons = realm.objects(Person.self) - persons.min(of: \.age) - persons.max(of: \.age) - persons.average(of: \.age) - persons.sum(of: \.age) - persons.sorted(by: \.age) - persons.sorted(by: [SortDescriptor(keyPath: \Person.age)]) - persons.distinct(by: [\Person.age]) - ``` -* Add `List.objects(at indexes:)` in Swift and `[RLMCollection objectsAtIndexes:]` in Objective-C. - This allows you to select elements in a collection with a given IndexSet ([#7298](https://github.com/realm/realm-swift/issues/7298)). -* Add `App.emailPasswordAuth.retryCustomConfirmation(email:completion:)` and `[App.emailPasswordAuth retryCustomConfirmation:completion:]`. - These functions support retrying a [custom confirmation](https://docs.mongodb.com/realm/authentication/email-password/#run-a-confirmation-function) function. -* Improve performance of creating collection notifiers for Realms with a complex schema. - This means that the first run of a query or first call to observe() on a collection will - do significantly less work on the calling thread. -* Improve performance of calculating changesets for notifications, particularly - for deeply nested object graphs and objects which have List or Set properties - with small numbers of objects in the collection. - -### Fixed - -* `RealmProperty` would crash when decoding a `null` json value. - ([Cocoa #7323](https://github.com/realm/realm-swift/issues/7323), since v10.8.0) -* `@Persisted` would crash when decoding a `null` value. - ([#7332](https://github.com/realm/realm-swift/issues/7332), since v10.10.0). -* Fixed an issue where `Realm.Configuration` would be set after views have been laid out - when using `.environment(\.realmConfiguration, ...)` in SwiftUI. This would cause issues if you are - required to bump your schema version and are using `@ObservedResults`. -* Sync user profiles now correctly persist between runs. - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 3. Note that this release does not contain Xcode 13 - beta binaries as beta 3 does not include a working version of - Combine.framework for iOS. - -### Internal - -* Upgraded realm-core from 11.0.4 to 11.1.1 - -10.10.0 Release notes (2021-07-07) -============================================================= - -### Enhancements - -* Add a new property wrapper-based declaration syntax for properties on Realm - Swift object classes. Rather than using `@objc dynamic` or the - `RealmProperty` wrapper type, properties can now be declared with `@Persisted - var property: T`, where `T` is any of the supported property types, including - optional numbers and collections. This has a few benefits: - - - All property types are now declared in the same way. No more remembering - that this type requires `@objc dynamic var` while this other type - requires `let`, and the `RealmProperty` or `RealmOptional` helper is no - longer needed for types not supported by Objective-C. - - No more overriding class methods like `primaryKey()`, - `indexedProperties()` or `ignoredProperties()`. The primary key and - indexed flags are set directly in the property declaration with - `@Persisted(primaryKey: true) var _id: ObjectId` or `@Persisted(indexed: - true) var indexedProperty: Int`. If any `@Persisted` properties are present, - all other properties are implicitly ignored. - - Some performance problems have been fixed. Declaring collection - properties as `let listProp = List()` resulted in the `List` object - being created eagerly when the parent object is read, which could cause - performance problems if a class has a large number of `List` or - `RealmOptional` properties. `@Persisted var list: List` allows us to - defer creating the `List` until it's accessed, improving performance - when looping over objects and using only some of the properties. - - Similarly, `let _id = ObjectId.generate()` was a convenient way to - declare a sync-compatible primary key, but resulted in new ObjectIds - being generated in some scenarios where the value would never actually be - used. `@Persisted var _id: ObjectId` has the same behavior of - automatically generating primary keys, but allows us to only generate it - when actually needed. - - More types of enums are supported. Any `RawRepresentable` enum whose raw - type is a type supported by Realm can be stored in an `@Persisted` - project, rather than just `@objc` enums. Enums must be declared as - conforming to the `PersistableEnum` protocol, and still cannot (yet) be - used in collections. - - `willSet` and `didSet` can be used with `@Persistable` properties, while - they previously did not work on managed Realm objects. - - While we expect the switch to the new syntax to be very simple for most - users, we plan to support the existing objc-based declaration syntax for the - foreseeable future. The new style and old style cannot be mixed within a - single class, but new classes can use the new syntax while existing classes - continue to use the old syntax. Updating an existing class to the new syntax - does not change what data is stored in the Realm file and so does not require - a migration (as long as you don't also change the schema in the process, of - course). -* Add `Map.merge()`, which adds the key-value pairs from another Map or - Dictionary to the map. -* Add `Map.asKeyValueSequence()` which returns an adaptor that can be used with - generic functions that operate on Dictionary-styled sequences. - -### Fixed -* AnyRealmValue enum values are now supported in more places when creating - objects. -* Declaring a property as `RealmProperty` will now report an - error during schema discovery rather than doing broken things when the - property is used. -* Observing the `invalidated` property of `RLMDictionary`/`Map` via KVO did not - set old/new values correctly in the notification (since 10.8.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 2. - -10.9.0 Release notes (2021-07-01) -============================================================= - -### Enhancements - -* Add `App.emailPasswordAuth.retryCustomConfirmation(email:completion:)` and - `[App.emailPasswordAuth retryCustomConfirmation:completion:]`. These - functions support retrying a [custom confirmation](https://docs.mongodb.com/realm/authentication/email-password/#run-a-confirmation-function) - function. -* Improve performance of many Dictionary operations, especially when KVO is being used. - -### Fixed - -* Calling `-[RLMRealm deleteObjects:]` on a `RLMDictionary` cleared the - dictionary but did not actually delete the objects in the dictionary (since v10.8.0). -* Rix an assertion failure when observing a `List` contains - object links. ([Core #4767](https://github.com/realm/realm-core/issues/4767), since v10.8.0) -* Fix an assertion failure when observing a `RLMDictionary`/`Map` which links - to an object which was deleting by a different sync client. - ([Core #4770](https://github.com/realm/realm-core/pull/4770), since v10.8.0) -* Fix an endless recursive loop that could cause a stack overflow when - computing changes on a set of objects which contained cycles. - ([Core #4770](https://github.com/realm/realm-core/pull/4770), since v10.8.0). -* Hash collisions in dictionaries were not handled properly. - ([Core #4776](https://github.com/realm/realm-core/issues/4776), since v10.8.0). -* Fix a crash after clearing a list or set of AnyRealmValue containing links to - objects ([Core #4774](https://github.com/realm/realm-core/issues/4774), since v10.8.0) -* Trying to refresh a user token which had been revoked by an admin lead to an - infinite loop and then a crash. This situation now properly logs the user out - and reports an error. ([Core #4745](https://github.com/realm/realm-core/issues/4745), since v10.0.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 2. - -### Internal - -* Upgraded realm-core from v11.0.3 to v11.0.4 - -10.8.1 Release notes (2021-06-22) -============================================================= - -### Enhancements - -* Update Xcode 12.5 to Xcode 12.5.1. -* Create fewer dynamic classes at runtime, improving memory usage and startup time slightly. - -### Fixed - -* Importing the Realm swift package produced several warnings about excluded - files not existing. Note that one warning will still remain after this change. - ([#7295](https://github.com/realm/realm-swift/issues/7295), since v10.8.0). -* Update the root URL for the API docs so that the links go to the place where - new versions of the docs are being published. - ([#7299](https://github.com/realm/realm-swift/issues/7299), since v10.6.0). - -### Compatibility - -* Realm Studio: 11.0.0 or later. Note that this version of Realm Studio has not - yet been released at the time of this release. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5.1. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 1. - -10.8.0 Release notes (2021-06-14) -============================================================= - -NOTE: This version upgrades the Realm file format version to add support for -the new data types and to adjust how primary keys are handled. Realm files -opened will be automatically upgraded and cannot be read by versions older than -v10.8.0. This upgrade should be a fairly fast one. Note that we now -automatically create a backup of the pre-upgrade Realm. - -### Enhancements - -* Add support for the `UUID` and `NSUUID` data types. These types can be used - for the primary key property of Object classes. -* Add two new collection types to complement the existing `RLMArray`/`List` type: - - `RLMSet` in Objective-C and `MutableSet` in Swift are mutable - unordered collections of distinct objects, similar to the built-in - `NSMutableSet` and `Set`. The values in a set may be any non-collection - type which can be stored as a Realm property. Sets are guaranteed to never - contain two objects which compare equal to each other, including when - conflicting writes are merged by sync. - - `RLMDictionary` in Objective-C and `Map` are - mutable key-value dictionaries, similar to the built-in - `NSMutableDictionary` and `Dictionary`. The values in a dictionary may be - any non-collection type which can be stored as a Realm property. The keys - must currently always be a string. -* Add support for dynamically typed properties which can store a value of any - of the non-collection types supported by Realm, including Object subclasses - (but not EmbeddedObject subclasses). These are declared with - `@property id propertyName;` in Objective-C and - `let propertyName = RealmProperty()` in Swift. - -### Fixed - -* Setting a collection with a nullable value type to null via one of the - dynamic interfaces would hit an assertion failure instead of clearing the - collection. -* Fixed an incorrect detection of multiple incoming links in a migration when - changing a table to embedded and removing a link to it at the same time. - ([#4694](https://github.com/realm/realm-core/issues/4694) since v10.0.0-beta.2) -* Fixed a divergent merge on Set when one client clears the Set and another - client inserts and deletes objects. - ([#4720](https://github.com/realm/realm-core/issues/4720)) -* Partially revert to pre-v5.0.0 handling of primary keys to fix a performance - regression. v5.0.0 made primary keys determine the position in the low-level - table where newly added objects would be inserted, which eliminated the need - for a separate index on the primary key. This made some use patterns slightly - faster, but also made some reasonable things dramatically slower. - ([#4522](https://github.com/realm/realm-core/issues/4522)) -* Fixed an incorrect detection of multiple incoming links in a migration when - changing a table to embedded and removing a link to it at the same time. - ([#4694](https://github.com/realm/realm-core/issues/4694) since v10.0.0-beta.2) -* Fix collection notification reporting for modifications. This could be - observed by receiving the wrong indices of modifications on sorted or - distinct results, or notification blocks sometimes not being called when only - modifications have occured. - ([#4573](https://github.com/realm/realm-core/pull/4573) since v5.0.0). -* Fix incorrect sync instruction emission when replacing an existing embedded - object with another embedded object.([Core #4740](https://github.com/realm/realm-core/issues/4740) - -### Deprecations - -* `RealmOptional` has been deprecated in favor of `RealmProperty`. - `RealmProperty` is functionality identical to `RealmOptional` when storing - optional numeric types, but can also store the new `AnyRealmValue` type. - -### Compatibility - -* Realm Studio: 11.0.0 or later. Note that this version of Realm Studio has not - yet been released at the time of this release. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 1. - -### Internal - -* Upgraded realm-core from v10.7.2 to v11.0.3 - -10.8.0-beta.2 Release notes (2021-06-01) -============================================================= - -### Enhancements - -* Add `RLMDictionary`/`Map<>` datatype. This is a Dictionary collection type used for storing key-value pairs in a collection. - -### Compatibility - -* Realm Studio: 11.0.0-beta.1 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v11.0.0-beta.4 to v11.0.0-beta.6 - -10.8.0-beta.0 Release notes (2021-05-07) -============================================================= - -### Enhancements - -* Add `RLMSet`/`MutableSet<>` datatype. This is a Set collection type used for storing distinct values in a collection. -* Add support for `id`/`AnyRealmValue`. -* Add support for `UUID`/`NSUUID` data type. - -### Fixed - -* None. - -### Deprecations - -* `RealmOptional` has been deprecated in favor of `RealmProperty`. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.7.2 to v10.8.0-beta.5 - -10.7.7 Release notes (2021-06-10) -============================================================= - -Xcode 12.2 is now the minimum supported version. - -### Enhancements - -* Add Xcode 13 beta 1 binaries to the release package. - -### Fixed - -* Fix a runtime crash which happens in some Xcode version (Xcode < 12, reported - in Xcode 12.5), where SwiftUI is not weak linked by default. This fix only - works for Cocoapods projects. - ([#7234](https://github.com/realm/realm-swift/issues/7234) -* Fix warnings when building with Xcode 13 beta 1. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. -* Xcode: 12.2-13.0 beta 1. - -10.7.6 Release notes (2021-05-13) -============================================================= - -### Enhancements - -* Realms opened in read-only mode can now be invalidated (although it is - unlikely to be useful to do so). - -### Fixed - -* Fix an availability warning when building Realm. The code path which gave the - warning can not currently be hit, so this did not cause any runtime problems - ([#7219](https://github.com/realm/realm-swift/issues/7219), since 10.7.3). -* Proactively check the expiry time on the access token and refresh it before - attempting to initiate a sync session. This prevents some error logs from - appearing on the client such as: "ERROR: Connection[1]: Websocket: Expected - HTTP response 101 Switching Protocols, but received: HTTP/1.1 401 - Unauthorized" ([RCORE-473](https://jira.mongodb.org/browse/RCORE-473), since v10.0.0) -* Fix a race condition which could result in a skipping notifications failing - to skip if several commits using notification skipping were made in - succession (since v5.0.0). -* Fix a crash on exit inside TableRecycler which could happen if Realms were - open on background threads when the app exited. - ([Core #4600](https://github.com/realm/realm-core/issues/4600), since v5.0.0) -* Fix errors related to "uncaught exception in notifier thread: - N5realm11KeyNotFoundE: No such object" which could happen on sycnronized - Realms if a linked object was deleted by another client. - ([JS #3611](https://github.com/realm/realm-js/issues/3611), since v10.0.0). -* Reading a link to an object which has been deleted by a different client via - a string-based interface (such as value(forKey:) or the subscript operator on - DynamicObject) could return an invalid object rather than nil. - ([Core #4687](https://github.com/realm/realm-core/pull/4687), since v10.0.0) -* Recreate the sync metadata Realm if the encryption key for it is missing from - the keychain rather than crashing. This can happen if a device is restored - from an unencrypted backup, which restores app data but not the app's - keychain entries, and results in all cached logics for sync users being - discarded but no data being lost. - [Core #4285](https://github.com/realm/realm-core/pull/4285) -* Thread-safe references can now be created for read-only Realms. - ([#5475](https://github.com/realm/realm-swift/issues/5475)). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.6.0 to v10.7.2 - -10.7.5 Release notes (2021-05-07) -============================================================= - -### Fixed - -* Iterating over frozen collections on multiple threads at the same time could - throw a "count underflow" NSInternalInconsistencyException. - ([#7237](https://github.com/realm/realm-swift/issues/7237), since v5.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. - -10.7.4 Release notes (2021-04-26) -============================================================= - -### Enhancements - -* Add Xcode 12.5 binaries to the release package. - -### Fixed - -* Add the Info.plist file to the XCFrameworks in the Carthage xcframwork - package ([#7216](https://github.com/realm/realm-swift/issues/7216), since 10.7.3). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.5. -* CocoaPods: 1.10 or later. - -10.7.3 Release notes (2021-04-22) -============================================================= - -### Enhancements - -* Package a prebuilt XCFramework for Carthage. Carthage 0.38 and later will - download this instead of the old frameworks when using `--use-xcframeworks`. -* We now make a backup of the realm file prior to any file format upgrade. The - backup is retained for 3 months. Backups from before a file format upgrade - allows for better analysis of any upgrade failure. We also restore a backup, - if a) an attempt is made to open a realm file whith a "future" file format - and b) a backup file exist that fits the current file format. - ([Core #4166](https://github.com/realm/realm-core/pull/4166)) -* The error message when the intial steps of opening a Realm file fails is now - more descriptive. -* Make conversion of Decimal128 to/from string work for numbers with more than - 19 significant digits. This means that Decimal128's initializer which takes a - string will now never throw, as it previously threw only for out-of-bounds - values. The initializer is still marked as `throws` for - backwards compatibility. - ([#4548](https://github.com/realm/realm-core/issues/4548)) - -### Fixed - -* Adjust the header paths for the podspec to avoid accidentally finding a file - which isn't part of the pod that produced warnings when importing the - framework. ([#7113](https://github.com/realm/realm-swift/issues/7113), since 10.5.2). -* Fixed a crash that would occur when observing unmanaged Objects in multiple - views in SwiftUI. When using `@StateRealmObject` or `@ObservedObject` across - multiple views with an unmanaged object, each view would subscribe to the - object. As each view unsubscribed (generally when trailing back through the - view stack), our propertyWrappers would attempt to remove the KVOs for each - cancellation, when it should only be done once. We now correctly remove KVOs - only once. ([#7131](https://github.com/realm/realm-swift/issues/7131)) -* Fixed `isInvalidated` not returning correct value after object deletion from - Realm when using a custom schema. The object's Object Schema was not updated - when the object was added to the realm. We now correctly update the object - schema when adding it to the realm. - ([#7181](https://github.com/realm/realm-swift/issues/7181)) -* Syncing large Decimal128 values would cause "Assertion failed: cx.w[1] == 0" - ([Core #4519](https://github.com/realm/realm-core/issues/4519), since v10.0.0). -* Potential/unconfirmed fix for crashes associated with failure to memory map - (low on memory, low on virtual address space). For example - ([#4514](https://github.com/realm/realm-core/issues/4514), since v5.0.0). -* Fix assertion failures such as "!m_notifier_skip_version.version" or - "m_notifier_sg->get_version() + 1 == new_version.version" when performing - writes inside change notification callbacks. Previously refreshing the Realm - by beginning a write transaction would skip delivering notifications, leaving - things in an inconsistent state. Notifications are now delivered recursively - when needed instead. ([Cocoa #7165](https://github.com/realm/realm-swift/issues/7165)). -* Fix collection notification reporting for modifications. This could be - observed by receiving the wrong indices of modifications on sorted or - distinct results, or notification blocks sometimes not being called when only - modifications have occured. - ([#4573](https://github.com/realm/realm-core/pull/4573) since v5.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.5.5 to v10.6.0 -* Add additional debug validation to file map management that will hopefully - catch cases where we unmap something which is still in use. - -10.7.2 Release notes (2021-03-08) -============================================================= - -### Fixed - -* During integration of a large amount of data from the server, you may get - "Assertion failed: !fields.has_missing_parent_update()" - ([Core #4497](https://github.com/realm/realm-core/issues/4497), since v6.0.0) - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.5.4 to v10.5.5 - -10.7.1 Release notes (2021-03-05) -============================================================= - -### Fixed - -* Queries of the form "a.b.c == nil" would match objects where `b` is `nil` if - `c` did not have an index and did not if `c` was indexed. Both will now match - to align with NSPredicate's behavior. ([Core #4460]https://github.com/realm/realm-core/pull/4460), since 4.3.0). -* Restore support for upgrading files from file format 5 (Realm Cocoa 1.x). - ([Core #7089](https://github.com/realm/realm-swift/issues/7089), since v5.0.0) -* On 32bit devices you may get exception with "No such object" when upgrading - to v10.* ([Java #7314](https://github.com/realm/realm-java/issues/7314), since v5.0.0) -* The notification worker thread would rerun queries after every commit rather - than only commits which modified tables which could effect the query results - if the table had any outgoing links to tables not used in the query. - ([Core #4456](https://github.com/realm/realm-core/pull/4456), since v5.0.0). -* Fix "Invalid ref translation entry [16045690984833335023, 78187493520]" - assertion failure which could occur when using sync or multiple processes - writing to a single Realm file. - ([#7086](https://github.com/realm/realm-swift/issues/7086), since v5.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.5.3 to v10.5.4 - -10.7.0 Release notes (2021-02-23) -============================================================= - -### Enhancements - -* Add support for some missing query operations on data propertys: - - Data properties can be compared to other data properties - (e.g. "dataProperty1 == dataProperty2"). - - Case and diacritic-insensitive queries can be performed on data properties. - This will only have meaningful results if the data property contains UTF-8 - string data. - - Data properties on linked objects can be queried - (e.g. "link.dataProperty CONTAINS %@") -* Implement queries which filter on lists other than object links (lists of - objects were already supported). All supported operators for normal - properties are now supported for lists (e.g. "ANY intList = 5" or "ANY - stringList BEGINSWITH 'prefix'"), as well as aggregate operations on the - lists (such as "intArray.@sum > 100"). -* Performance of sorting on more than one property has been improved. - Especially important if many elements match on the first property. Mitigates - ([#7092](https://github.com/realm/realm-swift/issues/7092)) - -### Fixed - -* Fixed a bug that prevented an object type with incoming links from being - marked as embedded during migrations. ([Core #4414](https://github.com/realm/realm-core/pull/4414)) -* The Realm notification listener thread could sometimes hit the assertion - failure "!skip_version.version" if a write transaction was committed at a - very specific time (since v10.5.0). -* Added workaround for a case where upgrading an old file with illegal string - would crash ([#7111](https://github.com/realm/realm-swift/issues/7111)) -* Fixed a conflict resolution bug related to the ArrayMove instruction, which - could sometimes cause an "Invalid prior_size" exception to prevent - synchronization (since v10.5.0). -* Skipping a change notification in the first write transaction after the - observer was added could potentially fail to skip the notification (since v10.5.1). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.5.0 to v10.5.3 - -10.6.0 Release notes (2021-02-15) -============================================================= - -### Enhancements - -* Add `@StateRealmObject` for SwiftUI support. This property wrapper type instantiates an observable object on a View. - Use in place of `SwiftUI.StateObject` for Realm `Object`, `List`, and `EmbeddedObject` types. -* Add `@ObservedRealmObject` for SwiftUI support. This property wrapper type subscribes to an observable object - and invalidates a view whenever the observable object changes. Use in place of `SwiftUI.ObservedObject` for - Realm `Object`, `List`, or `EmbeddedObject` types. -* Add `@ObservedResults` for SwiftUI support. This property wrapper type retrieves results from a Realm. - The results use the realm configuration provided by the environment value `EnvironmentValues.realmConfiguration`. -* Add `EnvironmentValues.realm` and `EnvironmentValues.realmConfiguration` for `Realm` - and `Realm.Configuration` types respectively. Values can be injected into views using the `View.environment` method, e.g., `MyView().environment(\.realmConfiguration, Realm.Configuration(fileURL: URL(fileURLWithPath: "myRealmPath.realm")))`. - The value can then be declared on the example `MyView` as `@Environment(\.realm) var realm`. -* Add `SwiftUI.Binding` extensions where `Value` is of type `Object`, `List`, or `EmbeddedObject`. - These extensions expose methods for wrapped write transactions, to avoid boilerplate within - views, e.g., `TextField("name", $personObject.name)` or `$personList.append(Person())`. -* Add `Object.bind` and `EmbeddedObject.bind` for SwiftUI support. This allows you to create - bindings of realm properties when a propertyWrapper is not available for you to do so, e.g., `TextField("name", personObject.bind(\.name))`. -* The Sync client now logs error messages received from server rather than just - the size of the error message. -* Errors returned from the server when sync WebSockets get closed are now - captured and surfaced as a SyncError. -* Improve performance of sequential reads on a Results backed directly by a - Table (i.e. `realm.object(ClasSName.self)` with no filter/sort/etc.) by 50x. -* Orphaned embedded object types which are not linked to by any top-level types - are now better handled. Previously the server would reject the schema, - resulting in delayed and confusing error reporting. Explicitly including an - orphan in `objectTypes` is now immediately reported as an error when opening - the Realm, and orphans are automatically excluded from the auto-discovered - schema when `objectTypes` is not specified. - -### Fixed - -* Reading from a Results backed directly by a Table (i.e. - `realm.object(ClasSName.self)` with no filter/sort/etc.) would give incorrect - results if the Results was constructed and accessed before creating a new - object with a primary key less than the smallest primary key which previously - existed. ([#7014](https://github.com/realm/realm-swift/issues/7014), since v5.0.0). -* During synchronization you might experience crash with - "Assertion failed: ref + size <= next->first". - ([Core #4388](https://github.com/realm/realm-core/issues/4388)) - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.4.0 to v10.5.0 - -10.5.2 Release notes (2021-02-09) -============================================================= - -### Enhancements - -* Add support for "thawing" objects. `Realm`, `Results`, `List` and `Object` - now have `thaw()` methods which return a live copy of the frozen object. This - enables app behvaior where a frozen object can be made live again in order to - mutate values. For example, first freezing an object passed into UI view, - then thawing the object in the view to update values. -* Add Xcode 12.4 binaries to the release package. - -### Fixed - -* Inserting a date into a synced collection via `AnyBSON.datetime(...)` would - be of type `Timestamp` and not `Date`. This could break synced objects with a - `Date` property. - ([#6654](https://github.com/realm/realm-swift/issues/6654), since v10.0.0). -* Fixed an issue where creating an object after file format upgrade may fail - with assertion "Assertion failed: lo() <= std::numeric_limits::max()" - ([#4295](https://github.com/realm/realm-core/issues/4295), since v5.0.0) -* Allow enumerating objects in migrations with types which are no longer - present in the schema. -* Add `RLMResponse.customStatusCode`. This fixes timeout exceptions that were - occurring with a poor connection. ([#4188](https://github.com/realm/realm-core/issues/4188)) -* Limit availability of ObjectKeyIdentifiable to platforms which support - Combine to match the change made in the Xcode 12.5 SDK. - ([#7083](https://github.com/realm/realm-swift/issues/7083)) - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.4. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.3.3 to v10.4.0 - -10.5.1 Release notes (2021-01-15) -============================================================= - -### Enhancements - -* Add Xcode 12.3 binary to release package. -* Add support for queries which have nil on the left side and a keypath on the - right side (e.g. "nil == name" rather than "name == nil" as was previously - required). - -### Fixed -* Timeouts when calling server functions via App would sometimes crash rather - than report an error. -* Fix a race condition which would lead to "uncaught exception in notifier - thread: N5realm15InvalidTableRefE: transaction_ended" and a crash when the - source Realm was closed or invalidated at a very specific time during the - first run of a collection notifier - ([#3761](https://github.com/realm/realm-core/issues/3761), since v5.0.0). -* Deleting and recreating objects with embedded objects may fail. - ([Core PR #4240](https://github.com/realm/realm-core/pull/4240), since v10.0.0) -* Fast-enumerating a List after deleting the parent object would crash with an - assertion failure rather than a more appropriate exception. - ([Core #4114](https://github.com/realm/realm-core/issues/4114), since v5.0.0). -* Fix an issue where calling a MongoDB Realm Function would never be performed as the reference to the weak `User` was lost. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.3. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.3.2 to v10.3.3 - -10.5.0 Release notes (2020-12-14) -============================================================= - -### Enhancements - -* MongoDB Realm is now supported when installing Realm via Swift Package Manager. - -### Fixed - -* The user identifier was added to the file path for synchronized Realms twice - and an extra level of escaping was performed on the partition value. This did - not cause functional problems, but made file names more confusing than they - needed to be. Existing Realm files will continue to be located at the old - path, while newly created files will be created at a shorter path. (Since v10.0.0). -* Fix a race condition which could potentially allow queries on frozen Realms - to access an uninitialized structure for search indexes (since v5.0.0). -* Fix several data races in App and SyncSession initialization. These could - possibly have caused strange errors the first time a synchronized Realm was - opened (since v10.0.0). -* Fix a use of a dangling reference when refreshing a user’s custom data that - could lead to a crash (since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.1.4 to v10.3.2 - -10.4.0 Release notes (2020-12-10) -============================================================= - -### Enhancements - -* Add Combine support for App and User. These two types now have a - `objectWillChange` property that emits each time the state of the object has - changed (such as due to the user logging in or out). ([PR #6977](https://github.com/realm/realm-swift/pull/6977)). - -### Fixed - -* Integrating changesets from the server would sometimes hit the assertion - failure "n != realm::npos" inside Table::create_object_with_primary_key() - when creating an object with a primary key which previously had been used and - had incoming links. ([Core PR #4180](https://github.com/realm/realm-core/pull/4180), since v10.0.0). -* The arm64 simulator slices were not actually included in the XCFramework - release package. ([PR #6982](https://github.com/realm/realm-swift/pull/6982), since v10.2.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.1.3 to v10.1.4 -* Upgraded realm-sync from v10.1.4 to v10.1.5 - -10.3.0 Release notes (2020-12-08) -============================================================= - -### Enhancements - -* Add Google OpenID Connect Credentials, an alternative login credential to the - Google OAuth 2.0 credential. - -### Fixed - -* Fixed a bug that would prevent eventual consistency during conflict - resolution. Affected clients would experience data divergence and potentially - consistency errors as a result if they experienced conflict resolution - between cycles of Create-Erase-Create for objects with primary keys (since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-sync from v10.1.3 to v10.1.4 - -10.2.0 Release notes (2020-12-02) -============================================================= - -### Enhancements - -* The prebuilt binaries are now packaged as XCFrameworks. This adds support for - Catalyst and arm64 simulators when using them to install Realm, removes the - need for the strip-frameworks build step, and should simplify installation. -* The support functionality for using the Objective C API from Swift is now - included in Realm Swift and now includes all of the required wrappers for - MongoDB Realm types. In mixed Objective C/Swift projects, we recommend - continuing to use the Objective C types, but import both Realm and RealmSwift - in your Swift files. - -### Fixed - -* The user identifier was added to the file path for synchronized Realms twice - and an extra level of escaping was performed on the partition value. This did - not cause functional problems, but made file names more confusing than they - needed to be. Existing Realm files will continue to be located at the old - path, while newly created files will be created at a shorter path. (Since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -10.1.4 Release notes (2020-11-16) -============================================================= - -### Enhancements - -* Add arm64 slices to the macOS builds. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.2. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.0.1 to v10.1.3 -* Upgraded realm-sync from v10.0.1 to v10.1.3 - -10.1.3 Release notes (2020-11-13) -============================================================= - -### Enhancements - -* Add Xcode 12.2 binaries to the release package. - -### Fixed - -* Disallow setting - `RLMRealmConfiguration.deleteRealmIfMigrationNeeded`/`Realm.Config.deleteRealmIfMigrationNeeded` - when sync is enabled. This did not actually work as it does not delete the - relevant server state and broke in confusing ways ([PR #6931](https://github.com/realm/realm-swift/pull/6931)). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.1. -* CocoaPods: 1.10 or later. - -10.1.2 Release notes (2020-11-06) -============================================================= - -### Enhancements - -* Some error states which previously threw a misleading "NoSuchTable" exception - now throw a more descriptive exception. - -### Fixed - -* One of the Swift packages did not have the minimum deployment target set, - resulting in errors when archiving an app which imported Realm via SPM. -* Reenable filelock emulation on watchOS so that the OS does not kill the app - when it is suspended while a Realm is open on watchOS 7 ([#6861](https://github.com/realm/realm-swift/issues/6861), since v5.4.8 -* Fix crash in case insensitive query on indexed string columns when nothing - matches ([#6836](https://github.com/realm/realm-swift/issues/6836), since v5.0.0). -* Null values in a `List` or `List` were incorrectly treated - as non-null in some places. It is unknown if this caused any functional - problems when using the public API. ([Core PR #3987](https://github.com/realm/realm-core/pull/3987), since v5.0.0). -* Deleting an entry in a list in two different clients could end deleting the - wrong entry in one client when the changes are merged (since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.1. -* CocoaPods: 1.10 or later. - -### Internal - -* Upgraded realm-core from v10.0.0 to v10.1.1 -* Upgraded realm-sync from v10.0.0 to v10.1.1 - -10.1.1 Release notes (2020-10-27) -============================================================= - -### Enhancements - -* Set the minimum CocoaPods version in the podspec so that trying to install - with older versions gives a more useful error ([PR #6892](https://github.com/realm/realm-swift/pull/6892)). - -### Fixed - -* Embedded objects could not be marked as `ObjectKeyIdentifable` - ([PR #6890](https://github.com/realm/realm-swift/pull/6890), since v10.0.0). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.1. -* CocoaPods: 1.10 or later. - -10.1.0 Release notes (2020-10-22) -============================================================= - -CocoaPods 1.10 or later is now required to install Realm. - -### Enhancements - -* Throw an exception for Objects that have none of its properties marked with @objc. -* Mac Catalyst and arm64 simulators are now supported when integrating via Cocoapods. -* Add Xcode 12.1 binaries to the release package. -* Add Combine support for `Realm.asyncOpen()`. - -### Fixed - -* Implement precise and unbatched notification of sync completion events. This - avoids a race condition where an earlier upload completion event will notify - a later waiter whose changes haven't been uploaded yet. - ([#1118](https://github.com/realm/realm-object-store/pull/1118)). - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12.1. - -10.0.0 Release notes (2020-10-16) -============================================================= - -This release is functionally identical to v10.0.0-rc.2. - -NOTE: This version upgrades the Realm file format version to add support for -new data types. Realm files opened will be automatically upgraded and cannot be -read by versions older than v10.0.0. - -### Breaking Changes - -* Rename Realm.Publishers to RealmPublishers to avoid confusion with Combine.Publishers. -* Remove `[RLMSyncManager shared]`. This is now instatiated as a property on App/RLMApp. -* `RLMSyncManager.pinnedCertificatePaths` has been removed. -* Classes `RLMUserAccountInfo` & `RLMUserInfo` (swift: `UserInfo`, `UserAccountInfo`) have been removed. -* `RLMSyncUser`/`SyncUser` has been renamed to `RLMUser`/`User`. -* We no longer support Realm Cloud (legacy), but instead the new "MongoDB - Realm" Cloud. MongoDB Realm is a serverless platform that enables developers - to quickly build applications without having to set up server infrastructure. - MongoDB Realm is built on top of MongoDB Atlas, automatically integrating the - connection to your database. -* Remove support for Query-based sync, including the configuration parameters - and the `RLMSyncSubscription` and `SyncSubscription` types ([#6437](https://github.com/realm/realm-swift/pull/6437)). -* Remove everything related to sync permissions, including both the path-based - permission system and the object-level privileges for query-based sync. - Permissions are now configured via MongoDB Atlas. - ([#6445](https://github.com/realm/realm-swift/pulls/6445)) -* Remove support for Realm Object Server. -* Non-embedded objects in synchronized Realms must always have a primary key - named "_id". -* All Swift callbacks for asynchronous operations which can fail are now passed - a `Result` parameter instead of two separate `Value?` and - `Error?` parameters. - -### Enhancements - -* Add support for next generation sync. Support for syncing to MongoDB instead - of Realm Object Server. Applications must be created at realm.mongodb.com -* The memory mapping scheme for Realm files has changed to better support - opening very large files. -* Add support for the ObjectId data type. This is an automatically-generated - unique identifier similar to a GUID or a UUID. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for the Decimal128 data type. This is a 128-bit IEEE 754 decimal - floating point number similar to NSDecimalNumber. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for embedded objects. Embedded objects are objects which are - owned by a single parent object, and are deleted when that parent object is - deleted. They are defined by subclassing `EmbeddedObject` / - `RLMEmbeddedObject` rather than `Object` / `RLMObject`. -* Add `-[RLMUser customData]`/`User.customData`. Custom data is - configured in your MongoDB Realm App. -* Add `-[RLMUser callFunctionNamed:arguments:completion:]`/`User.functions`. - This is the entry point for calling Remote MongoDB Realm functions. Functions - allow you to define and execute server-side logic for your application. - Functions are written in modern JavaScript (ES6+) and execute in a serverless - manner. When you call a function, you can dynamically access components of - the current application as well as information about the request to execute - the function and the logged in user that sent the request. -* Add `-[RLMUser mongoClientWithServiceName:]`/`User.mongoClient`. This is - the entry point for calling your Remote MongoDB Service. The read operations - are `-[RLMMongoCollection findWhere:completion:]`, `-[RLMMongoCollection - countWhere:completion:]`and `-[RLMMongoCollection - aggregateWithPipeline:completion:]`. The write operations are - `-[RLMMongoCollection insertOneDocument:completion:]`, `-[RLMMongoCollection - insertManyDocuments:completion:]`, `-[RLMMongoCollection - updateOneDocument:completion:]`, `-[RLMMongoCollection - updateManyDocuments:completion:]`, `-[RLMMongoCollection - deleteOneDocument:completion:]`, and `-[RLMMongoCollection - deleteManyDocuments:completion:]`. If you are already familiar with MongoDB - drivers, it is important to understand that the remote MongoCollection only - provides access to the operations available in MongoDB Realm. -* Obtaining a Realm configuration from a user is now done with `[RLMUser - configurationWithPartitionValue:]`/`User.configuration(partitionValue:)`. - Partition values can currently be of types `String`, `Int`, or `ObjectId`, - and fill a similar role to Realm URLs did with Realm Cloud. The main - difference is that partitions are meant to be more closely associated with - your data. For example, if you are running a `Dog` kennel, and have a field - `breed` that acts as your partition key, you could open up realms based on - the breed of the dogs. -* Add ability to stream change events on a remote MongoDB collection with - `[RLMMongoCollection watch:delegate:delegateQueue:]`, - `MongoCollection.watch(delegate:)`. When calling `watch(delegate:)` you will be - given a `RLMChangeStream` (`ChangeStream`) which can be used to end watching - by calling `close()`. Change events can also be streamed using the - `MongoCollection.watch` Combine publisher that will stream change events each - time the remote MongoDB collection is updated. -* Add the ability to listen for when a Watch Change Stream is opened when using - Combine. Use `onOpen(event:)` directly after opening a `WatchPublisher` to - register a callback to be invoked once the change stream is opened. -* Objects with integer primary keys no longer require a separate index for the -* primary key column, improving insert performance and slightly reducing file - size. - -### Compatibility - -* Realm Studio: 10.0.0 or later. -* Carthage release for Swift is built with Xcode 12 - -### Internal - -* Upgraded realm-core from v6.1.4 to v10.0.0 -* Upgraded realm-sync from v5.0.29 to v10.0.0 - -10.0.0-rc.2 Release notes (2020-10-15) -============================================================= - -### Enhancements - -* Add the ability to listen for when a Watch Change Stream is opened when using - Combine. Use `onOpen(event:)` directly after opening a `WatchPublisher` to - register a callback to be invoked once the change stream is opened. - -### Breaking Changes - -* The insert operations on Mongo collections now report the inserted documents' - IDs as BSON rather than ObjectId. -* Embedded objects can no longer form cycles at the schema level. For example, - type A can no longer have an object property of type A, or an object property - of type B if type B links to type A. This was always rejected by the server, - but previously was allowed in non-synchronized Realms. -* Primary key properties are once again marked as being indexed. This reflects - an internal change to how primary keys are handled that should not have any - other visible effects. -* Change paired return types from Swift completion handlers to return `Result`. -* Adjust how RealmSwift.Object is defined to add support for Swift Library - Evolution mode. This should normally not have any effect, but you may need to - add `override` to initializers of object subclasses. -* Add `.null` type to AnyBSON. This creates a distinction between null values - and properly absent BSON types. - -### Fixed - -* Set the precision correctly when serializing doubles in extended json. -* Reading the `objectTypes` array from a Realm Configuration would not include - the embedded object types which were set in the array. -* Reject loops in embedded objects as part of local schema validation rather - than as a server error. -* Although MongoClient is obtained from a User, it was actually using the - User's App's current user rather than the User it was obtained from to make - requests. - - -This release also contains the following changes from 5.4.7 - 5.5.0 - -### Enhancements - -* Add the ability to capture a NotificationToken when using a Combine publisher - that observes a Realm Object or Collection. The user will call - `saveToken(on:at:)` directly after invoking the publisher to use the feature. - -### Fixed - -* When using `Realm.write(withoutNotifying:)` there was a chance that the - supplied observation blocks would not be skipped when in a write transaction. - ([Object Store #1103](https://github.com/realm/realm-object-store/pull/1103)) -* Comparing two identical unmanaged `List<>`/`RLMArray` objects would fail. - ([#5665](https://github.com/realm/realm-swift/issues/5665)). -* Case-insensitive equality queries on indexed string properties failed to - clear some internal state when rerunning the query. This could manifest as - duplicate results or "key not found" errors. - ([#6830](https://github.com/realm/realm-swift/issues/6830), [#6694](https://github.com/realm/realm-swift/issues/6694), since 5.0.0). -* Equality queries on indexed string properties would sometimes throw "key not - found" exceptions if the hash of the string happened to have bit 62 set. - ([.NET #2025](https://github.com/realm/realm-dotnet/issues/2025), since v5.0.0). -* Queries comparing non-optional int properties to nil would behave as if they - were comparing against zero instead (since v5.0.0). - -### Compatibility - -* File format: Generates Realms with format v12 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v10.0.0-beta.9 to v10.0.0 -* Upgraded realm-sync from v10.0.0-beta.14 to v10.0.0 - -10.0.0-rc.1 Release notes (2020-10-01) -============================================================= - -### Breaking Changes - -* Change the following methods on RLMUser to properties: - - `[RLMUser emailPasswordAuth]` => `RLMUser.emailPasswordAuth` - - `[RLMUser identities]` => `RLMUser.identities` - - `[RLMUser allSessions]` => `RLMUser.allSessions` - - `[RLMUser apiKeysAuth]` => `RLMUser.apiKeysAuth` -* Other changes to RLMUser: - - `nullable` has been removed from `RLMUser.identifier` - - `nullable` has been removed from `RLMUser.customData` -* Change the following methods on RLMApp to properties: - - `[RLMApp allUsers]` => `RLMApp.allUsers` - - `[RLMApp currentUser]` => `RLMApp.currentUser` - - `[RLMApp emailPasswordAuth]` => `RLMApp.emailPasswordAuth` -* Define `RealmSwift.Credentials` as an enum instead of a `typealias`. Example - usage has changed from `Credentials(googleAuthCode: "token")` to - `Credentials.google(serverAuthCode: "serverAuthCode")`, and - `Credentials(facebookToken: "token")` to `Credentials.facebook(accessToken: "accessToken")`, etc. -* Remove error parameter and redefine payload in - `+ (instancetype)credentialsWithFunctionPayload:(NSDictionary *)payload error:(NSError **)error;`. - It is now defined as `+ (instancetype)credentialsWithFunctionPayload:(NSDictionary> *)payload;` - -### Compatibility - -* File format: Generates Realms with format v12 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 10.x.y series. -* Carthage release for Swift is built with Xcode 12. - -10.0.0-beta.6 Release notes (2020-09-30) -============================================================= - -### Breaking Changes - -* Change Google Credential parameter names to better reflect the required auth code: - - `Credentials(googleToken:)` => `Credentials(googleAuthCode:)` - - `[RLMCredentials credentialsWithGoogleToken:]` => `[RLMCredentials credentialsWithGoogleAuthCode:]` -* Rename Realm.Publishers to RealmPublishers to avoid confusion with Combine.Publishers - -### Fixed - -* Deleting objects could sometimes change the ObjectId remaining objects from - null to ObjectId("deaddeaddeaddeaddeaddead") when there are more than 1000 - objects. (Since v10.0.0-alpha.1) -* Fixed an assertion failure when adding an index to a nullable ObjectId - property that contains nulls. (since v10.0.0-alpha.1). - -This release also contains the following changes from 5.4.0 - 5.4.6: - -### Enhancements - -* Add prebuilt binary for Xcode 11.7 to the release package. -* Add prebuilt binary for Xcode 12 to the release package. -* Improve the asymtotic performance of NOT IN queries on indexed properties. It - is now O(Number of Rows) rather than O(Number of Rows \* Number of values in IN clause.) -* Slightly (<5%) improve the performance of most operations which involve - reading from a Realm file. - -### Fixed - -* Upgrading pre-5.x files with string primary keys would result in a file where - `realm.object(ofType:forPrimaryKey:)` would fail to find the object. - ([#6716](https://github.com/realm/realm-swift/issues/6716), since 5.2.0) -* A write transaction which modifies an object with more than 16 managed - properties and causes the Realm file to grow larger than 2 GB could cause an - assertion failure mentioning "m_has_refs". ([JS #3194](https://github.com/realm/realm-js/issues/3194), since 5.0.0). -* Objects with more than 32 properties could corrupt the Realm file and result - in a variety of crashes. ([Java #7057](https://github.com/realm/realm-java/issues/7057), since 5.0.0). -* Fix deadlocks when opening a Realm file in both the iOS simulator and Realm - Studio ([#6743](https://github.com/realm/realm-swift/issues/6743), since 5.3.6). -* Fix Springboard deadlocking when an app is unsuspended while it has an open - Realm file which is stored in an app group on iOS 10-12 - ([#6749](https://github.com/realm/realm-swift/issues/6749), since 5.3.6). -* If you use encryption your application cound crash with a message like - "Opening Realm files of format version 0 is not supported by this version of - Realm". ([#6889](https://github.com/realm/realm-java/issues/6889) among others, since 5.0.0) -* Confining a Realm to a serial queue would throw an error claiming that the - queue was not a serial queue on iOS versions older than 12. - ([#6735](https://github.com/realm/realm-swift/issues/6735), since 5.0.0). -* Results would sometimes give stale results inside a write transaction if a - write which should have updated the Results was made before the first access - of a pre-existing Results object. - ([#6721](https://github.com/realm/realm-swift/issues/6721), since 5.0.0) -* Fix Archiving the Realm and RealmSwift frameworks with Xcode 12. - ([#6774](https://github.com/realm/realm-swift/issues/6774)) -* Fix compilation via Carthage when using Xcode 12 ([#6717](https://github.com/realm/realm-swift/issues/6717)). -* Fix a crash inside `realm::Array(Type)::init_from_mem()` which would - sometimes occur when running a query over links immediately after creating - objects of the queried type. - ([#6789](https://github.com/realm/realm-swift/issues/6789) and possibly others, since 5.0.0). -* Possibly fix problems when changing the type of the primary key of an object - from optional to non-optional. -* Rerunning a equality query on an indexed string property would give incorrect - results if a previous run of the query matched multiple objects and it now - matches one object. This could manifest as either finding a non-matching - object or a "key not found" exception being thrown. - ([#6536](https://github.com/realm/realm-swift/issues/6536), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v12 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v10.0.0-beta.7 to v10.0.0-beta.9 -* Upgraded realm-sync from v10.0.0-beta.11 to v10.0.0-beta.14 - -10.0.0-beta.5 Release notes (2020-09-15) -============================================================= - -### Enhancements - -* Add `User.loggedIn`. -* Add support for multiple Realm Apps. -* Remove `[RLMSyncManager shared]`. This is now instatiated as a property on - the app itself. -* Add Combine support for: - * PushClient - * APIKeyAuth - * User - * MongoCollection - * EmailPasswordAuth - * App.login - -### Fixed - -* Fix `MongoCollection.watch` to consistently deliver events on a given queue. -* Fix `[RLMUser logOutWithCompletion]` and `User.logOut` to now log out the - correct user. -* Fix crash on startup on iOS versions older than 13 (since v10.0.0-beta.3). - -### Breaking Changes - -* `RLMSyncManager.pinnedCertificatePaths` has been removed. -* Classes `RLMUserAccountInfo` & `RLMUserInfo` (swift: `UserInfo`, - `UserAccountInfo`) have been removed. -* The following functionality has been renamed to align Cocoa with the other - Realm SDKs: - -| Old API | New API | -|:-------------------------------------------------------------|:---------------------------------------------------------------| -| `RLMUser.identity` | `RLMUser.identifier` | -| `User.identity` | `User.id` | -| `-[RLMCredentials credentialsWithUsername:password:]` | `-[RLMCredentials credentialsWithEmail:password:]` | -| `Credentials(username:password:)` | `Credentials(email:password:)` | -| -`[RLMUser apiKeyAuth]` | `-[RLMUser apiKeysAuth]` | -| `User.apiKeyAuth()` | `User.apiKeysAuth()` | -| `-[RLMEmailPasswordAuth registerEmail:password:completion:]` | `-[RLMEmailPasswordAuth registerUserWithEmail:password:completion:]` | -| `App.emailPasswordAuth().registerEmail(email:password:)` | `App.emailPasswordAuth().registerUser(email:password:)` | - -### Compatibility - -* File format: Generates Realms with format v12 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v10.0.0-beta.6 to v10.0.0-beta.7 -* Upgraded realm-sync from v10.0.0-beta.10 to v10.0.0-beta.11 - -10.0.0-beta.4 Release notes (2020-08-28) -============================================================= - -### Enhancements - -* Add support for the 64-bit watchOS simulator added in Xcode 12. -* Add ability to stream change events on a remote MongoDB collection with - `[RLMMongoCollection watch:delegate:delegateQueue]`, - `MongoCollection.watch(delegate)`. When calling `watch(delegate)` you will be - given a `RLMChangeStream` (`ChangeStream`), this will be used to invalidate - and stop the streaming session by calling `[RLMChangeStream close]` - (`ChangeStream.close()`) when needed. -* Add `MongoCollection.watch`, which is a Combine publisher that will stream - change events each time the remote MongoDB collection is updated. -* Add ability to open a synced Realm with a `nil` partition value. - -### Fixed - -* Realm.Configuration.objectTypes now accepts embedded objects -* Ports fixes from 5.3.5 - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the v10.0.0-beta.x series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v10.0.0-beta.1 to v10.0.0-beta.6 -* Upgraded realm-sync from v10.0.0-beta.2 to v10.0.0-beta.10 - -10.0.0-beta.3 Release notes (2020-08-17) -============================================================= - -This release also contains all changes from 5.3.2. - -### Breaking Changes -* The following classes & aliases have been renamed to align Cocoa with the other Realm SDKs: - -| Old API | New API | -|:------------------------------------------------------------|:---------------------------------------------------------------| -| `RLMSyncUser` | `RLMUser` | -| `SyncUser` | `User` | -| `RLMAppCredential` | `RLMCredential` | -| `AppCredential` | `Credential` | -| `RealmApp` | `App` | -| `RLMUserAPIKeyProviderClient` | `RLMAPIKeyAuth` | -| `RLMUsernamePasswordProviderClient` | `RLMEmailPasswordAuth` | -| `UsernamePasswordProviderClient` | `EmailPasswordAuth` | -| `UserAPIKeyProviderClient` | `APIKeyAuth` | - -* The following functionality has also moved to the User - -| Old API | New API | -|:-------------------------------------------------------------|:--------------------------------------------------------------| -| `[RLMApp callFunctionNamed:]` | `[RLMUser callFunctionNamed:]` | -| `App.functions` | `User.functions` | -| `[RLMApp mongoClientWithServiceName:]` | `[RLMUser mongoClientWithServiceName:]` | -| `App.mongoClient(serviceName)` | `User.mongoClient(serviceName)` | -| `[RLMApp userAPIKeyProviderClient]` | `[RLMUser apiKeyAuth]` | -| `App.userAPIKeyProviderClient` | `App.apiKeyAuth()` | -| `[RLMApp logOut:]` | `[RLMUser logOut]` | -| `App.logOut(user)` | `User.logOut()` | -| `[RLMApp removeUser:]` | `[RLMUser remove]` | -| `App.remove(user)` | `User.remove()` | -| `[RLMApp linkUser:credentials:]` | `[RLMUser linkWithCredentials:]` | -| `App.linkUser(user, credentials)` | `User.link(credentials)` | - -* `refreshCustomData()` on User now returns void and passes the custom data to the callback on success. - -### Compatibility -* This release introduces breaking changes w.r.t some sync classes and MongoDB Realm Cloud functionality. -(See the breaking changes section for the full list) -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Studio: 10.0.0 or later. -* Carthage release for Swift is built with Xcode 11.5. - -10.0.0-beta.2 Release notes (2020-06-09) -============================================================= -Xcode 11.3 and iOS 9 are now the minimum supported versions. - -### Enhancements -* Add support for building with Xcode 12 beta 1. watchOS currently requires - removing x86_64 from the supported architectures. Support for the new 64-bit - watch simulator will come in a future release. - -### Fixed -* Opening a SyncSession with LOCAL app deployments would not use the correct endpoints. -* Linking from embedded objects to top-level objects was incorrectly disallowed. -* Opening a Realm file in file format v6 (created by Realm Cocoa versions - between 2.4 and 2.10) would crash. (Since 5.0.0, [Core #3764](https://github.com/realm/realm-core/issues/3764)). -* Upgrading v9 (pre-5.0) Realm files would create a redundant search index for - primary key properties. This index would then be removed the next time the - Realm was opened, resulting in some extra i/o in the upgrade process. - (Since 5.0.0, [Core #3787](https://github.com/realm/realm-core/issues/3787)). -* Fixed a performance issue with upgrading v9 files with search indexes on - non-primary-key properties. (Since 5.0.0, [Core #3767](https://github.com/realm/realm-core/issues/3767)). - -### Compatibility -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 - -10.0.0-beta.1 Release notes (2020-06-08) -============================================================= - -NOTE: This version bumps the Realm file format to version 11. It is not -possible to downgrade to earlier versions. Older files will automatically be -upgraded to the new file format. Only [Realm Studio -10.0.0](https://github.com/realm/realm-studio/releases/tag/v10.0.0-beta.1) or -later will be able to open the new file format. - -### Enhancements - -* Add support for next generation sync. Support for syncing to MongoDB instead - of Realm Object Server. Applications must be created at realm.mongodb.com -* The memory mapping scheme for Realm files has changed to better support - opening very large files. -* Add support for the ObjectId data type. This is an automatically-generated - unique identifier similar to a GUID or a UUID. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for the Decimal128 data type. This is a 128-bit IEEE 754 decimal - floating point number similar to NSDecimalNumber. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for embedded objects. Embedded objects are objects which are - owned by a single parent object, and are deleted when that parent object is - deleted. They are defined by subclassing `EmbeddedObject` / - `RLMEmbeddedObject` rather than `Object` / `RLMObject`. -* Add `-[RLMSyncUser customData]`/`SyncUser.customData`. Custom data is - configured in your MongoDB Realm App. -* Add `-[RLMApp callFunctionNamed:arguments]`/`RealmApp.functions`. This is the - entry point for calling Remote MongoDB Realm functions. Functions allow you - to define and execute server-side logic for your application. Functions are - written in modern JavaScript (ES6+) and execute in a serverless manner. When - you call a function, you can dynamically access components of the current - application as well as information about the request to execute the function - and the logged in user that sent the request. -* Add `-[RLMApp mongoClientWithServiceName]`/`RealmApp.mongoClient`. This is - the entry point for calling your Remote MongoDB Service. The read operations - are `-[RLMMongoCollection findWhere:completion:]`, `-[RLMMongoCollection - countWhere:completion:]`and `-[RLMMongoCollection - aggregateWithPipeline:completion:]`. The write operations are - `-[RLMMongoCollection insertOneDocument:completion:]`, `-[RLMMongoCollection - insertManyDocuments:completion:]`, `-[RLMMongoCollection - updateOneDocument:completion:]`, `-[RLMMongoCollection - updateManyDocuments:completion:]`, `-[RLMMongoCollection - deleteOneDocument:completion:]`, and `-[RLMMongoCollection - deleteManyDocuments:completion:]`. If you are already familiar with MongoDB - drivers, it is important to understand that the remote MongoCollection only - provides access to the operations available in MongoDB Realm. -* Change `[RLMSyncUser - configurationWithPartitionValue:]`/`SyncUser.configuration(with:)` to accept - all BSON types. Partition values can currently be of types `String`, `Int`, - or `ObjectId`. Opening a realm by partition value is the equivalent of - previously opening a realm by URL. In this case, partitions are meant to be - more closely associated with your data. E.g., if you are running a `Dog` - kennel, and have a field `breed` that acts as your partition key, you could - open up realms based on the breed of the dogs. - -### Breaking Changes - -* We no longer support Realm Cloud (legacy), but instead the new "MongoDB - Realm" Cloud. MongoDB Realm is a serverless platform that enables developers - to quickly build applications without having to set up server infrastructure. - MongoDB Realm is built on top of MongoDB Atlas, automatically integrating the - connection to your database. -* Remove support for Query-based sync, including the configuration parameters - and the `RLMSyncSubscription` and `SyncSubscription` types ([#6437](https://github.com/realm/realm-swift/pull/6437)). -* Primary key properties are no longer marked as being indexed. This reflects - an internal change to how primary keys are handled that should not have any - other visible effects. ([#6440](https://github.com/realm/realm-swift/pull/6440)). -* Remove everything related to sync permissions, including both the path-based - permission system and the object-level privileges for query-based sync. ([#6445](https://github.com/realm/realm-swift/pulls/6445)) -* Primary key uniqueness is now enforced when creating new objects during - migrations, rather than only at the end of migrations. Previously new objects - could be created with duplicate primary keys during a migration as long as - the property was changed to a unique value before the end of the migration, - but now a unique value must be supplied when creating the object. -* Remove support for Realm Object Server. - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 - -5.5.0 Release notes (2020-10-12) -============================================================= - -### Enhancements - -* Add the ability to capture a NotificationToken when using a Combine publisher - that observes a Realm Object or Collection. The user will call - `saveToken(on:at:)` directly after invoking the publisher to use the feature. - -### Fixed - -* When using `Realm.write(withoutNotifying:)` there was a chance that the - supplied observation blocks would not be skipped when in a write transaction. - ([Object Store #1103](https://github.com/realm/realm-object-store/pull/1103)) -* Comparing two identical unmanaged `List<>`/`RLMArray` objects would fail. - ([#5665](https://github.com/realm/realm-swift/issues/5665)). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -5.4.8 Release notes (2020-10-05) -============================================================= - -### Fixed - -* Case-insensitive equality queries on indexed string properties failed to - clear some internal state when rerunning the query. This could manifest as - duplicate results or "key not found" errors. - ([#6830](https://github.com/realm/realm-swift/issues/6830), [#6694](https://github.com/realm/realm-swift/issues/6694), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v6.1.3 to v6.1.4 -* Upgraded realm-sync from v5.0.28 to v5.0.29 - -5.4.7 Release notes (2020-09-30) -============================================================= - -### Fixed - -* Equality queries on indexed string properties would sometimes throw "key not - found" exceptions if the hash of the string happened to have bit 62 set. - ([.NET #2025](https://github.com/realm/realm-dotnet/issues/2025), since v5.0.0). -* Queries comparing non-optional int properties to nil would behave as if they - were comparing against zero instead (since v5.0.0). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v6.1.2 to v6.1.3 -* Upgraded realm-sync from v5.0.27 to v5.0.28 - -5.4.6 Release notes (2020-09-29) -============================================================= - -5.4.5 failed to actually update the core version for installation methods other -than SPM. All changes listed there actually happened in this version for -non-SPM installation methods. - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-sync from v5.0.26 to v5.0.27 - -5.4.5 Release notes (2020-09-28) -============================================================= - -### Enhancements - -* Slightly (<5%) improve the performance of most operations which involve - reading from a Realm file. - -### Fixed - -* Rerunning a equality query on an indexed string property would give incorrect - results if a previous run of the query matched multiple objects and it now - matches one object. This could manifest as either finding a non-matching - object or a "key not found" exception being thrown. - ([#6536](https://github.com/realm/realm-swift/issues/6536), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v6.1.1 to v6.1.2 -* Upgraded realm-sync from v5.0.25 to v5.0.26 - -5.4.4 Release notes (2020-09-25) -============================================================= - -### Enhancements -* Improve the asymtotic performance of NOT IN queries on indexed properties. It - is now O(Number of Rows) rather than O(Number of Rows \* Number of values in IN clause.) - -### Fixed - -* Fix a crash inside `realm::Array(Type)::init_from_mem()` which would - sometimes occur when running a query over links immediately after creating - objects of the queried type. - ([#6789](https://github.com/realm/realm-swift/issues/6789) and possibly others, since 5.0.0). -* Possibly fix problems when changing the type of the primary key of an object - from optional to non-optional. - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 5.0.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -### Internal - -* Upgraded realm-core from v6.0.26 to v6.1.1 -* Upgraded realm-sync from v5.0.23 to v5.0.25 - -5.4.3 Release notes (2020-09-21) -============================================================= - -### Fixed - -* Fix compilation via Carthage when using Xcode 12 ([#6717](https://github.com/realm/realm-swift/issues/6717)). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.12 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -5.4.2 Release notes (2020-09-17) -============================================================= - -### Enhancements - -* Add prebuilt binary for Xcode 12 to the release package. - -### Fixed - -* Fix Archiving the Realm and RealmSwift frameworks with Xcode 12. - ([#6774](https://github.com/realm/realm-swift/issues/6774)) - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.12 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 12. - -5.4.1 Release notes (2020-09-16) -============================================================= - -### Enhancements - -* Add prebuilt binary for Xcode 11.7 to the release package. - -### Fixed - -* Fix deadlocks when opening a Realm file in both the iOS simulator and Realm - Studio ([#6743](https://github.com/realm/realm-swift/issues/6743), since 5.3.6). -* Fix Springboard deadlocking when an app is unsuspended while it has an open - Realm file which is stored in an app group on iOS 10-12 - ([#6749](https://github.com/realm/realm-swift/issues/6749), since 5.3.6). -* If you use encryption your application cound crash with a message like - "Opening Realm files of format version 0 is not supported by this version of - Realm". ([#6889](https://github.com/realm/realm-java/issues/6889) among others, since 5.0.0) -* Confining a Realm to a serial queue would throw an error claiming that the - queue was not a serial queue on iOS versions older than 12. - ([#6735](https://github.com/realm/realm-swift/issues/6735), since 5.0.0). -* Results would sometimes give stale results inside a write transaction if a - write which should have updated the Results was made before the first access - of a pre-existing Results object. - ([#6721](https://github.com/realm/realm-swift/issues/6721), since 5.0.0) - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.12 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.7. - -### Internal - -* Upgraded realm-core from v6.0.25 to v6.0.26 -* Upgraded realm-sync from v5.0.22 to v5.0.23 - -5.4.0 Release notes (2020-09-09) -============================================================= - -This version bumps the Realm file format version. This means that older -versions of Realm will be unable to open Realm files written by this version, -and a new version of Realm Studio will be required. There are no actual format -changes and the version bump is just to force a re-migration of incorrectly -upgraded Realms. - -### Fixed - -* Upgrading pre-5.x files with string primary keys would result in a file where - `realm.object(ofType:forPrimaryKey:)` would fail to find the object. - ([#6716](https://github.com/realm/realm-swift/issues/6716), since 5.2.0) -* A write transaction which modifies an object with more than 16 managed - properties and causes the Realm file to grow larger than 2 GB could cause an - assertion failure mentioning "m_has_refs". ([JS #3194](https://github.com/realm/realm-js/issues/3194), since 5.0.0). -* Objects with more than 32 properties could corrupt the Realm file and result - in a variety of crashes. ([Java #7057](https://github.com/realm/realm-java/issues/7057), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.12 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.23 to v6.0.25 -* Upgraded realm-sync from v5.0.20 to v5.0.22 - -5.3.6 Release notes (2020-09-02) -============================================================= - -### Fixed - -* Work around iOS 14 no longer allowing the use of file locks in shared - containers, which resulted in the OS killing an app which entered the - background while a Realm was open ([#6671](https://github.com/realm/realm-swift/issues/6671)). -* If an attempt to upgrade a realm has ended with a crash with "migrate_links()" - in the call stack, the realm was left in an invalid state. The migration - logic now handles this state and can complete upgrading files which were - incompletely upgraded by pre-5.3.4 versions. -* Fix deadlocks when writing to a Realm file on an exFAT partition from macOS. - ([#6691](https://github.com/realm/realm-swift/issues/6691)). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.19 to v6.0.23 -* Upgraded realm-sync from v5.0.16 to v5.0.20 - -5.3.5 Release notes (2020-08-20) -============================================================= - -### Fixed - -* Opening Realms on background threads could produce spurious Incorrect Thread - exceptions when a cached Realm existed for a previously existing thread with - the same thread ID as the current thread. - ([#6659](https://github.com/realm/realm-swift/issues/6659), - [#6689](https://github.com/realm/realm-swift/issues/6689), - [#6712](https://github.com/realm/realm-swift/issues/6712), since 5.0.0). -* Upgrading a table with incoming links but no properties would crash. This was - probably not possible to hit in practice as we reject object types with no - properties. -* Upgrading a non-nullable List which nonetheless contained null values would - crash. This was possible due to missing error-checking in some older versions - of Realm. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.18 to v6.0.19 -* Upgraded realm-sync from v5.0.15 to v5.0.16 - -5.3.4 Release notes (2020-08-17) -============================================================= - -### Fixed - -* Accessing a Realm after calling `deleteAll()` would sometimes throw an - exception with the reason 'ConstIterator copy failed'. ([#6597](https://github.com/realm/realm-swift/issues/6597), since 5.0.0). -* Fix an assertion failure inside the `migrate_links()` function when upgrading - a pre-5.0 Realm file. -* Fix a bug in memory mapping management. This bug could result in multiple - different asserts as well as segfaults. In many cases stack backtraces would - include members of the EncyptedFileMapping near the top - even if encryption - was not used at all. In other cases asserts or crashes would be in methods - reading an array header or array element. In all cases the application would - terminate immediately. ([Core #3838](https://github.com/realm/realm-core/pull/3838), since v5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.14 to v6.0.18 -* Upgraded realm-sync from v5.0.14 to v5.0.15 - -5.3.3 Release notes (2020-07-30) -============================================================= - -### Enhancements - -* Add support for the x86_64 watchOS simulator added in Xcode 12. - -### Fixed - -* (RLM)Results objects would incorrectly pin old read transaction versions - until they were accessed after a Realm was refreshed, resulting in the Realm - file growing to large sizes if a Results was retained but not accessed after - every write. ([#6677](https://github.com/realm/realm-swift/issues/6677), since 5.0.0). -* Fix linker errors when using SwiftUI previews with Xcode 12 when Realm was - installed via Swift Package Manager. ([#6625](https://github.com/realm/realm-swift/issues/6625)) - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.12 to v6.0.14 -* Upgraded realm-sync from v5.0.12 to v5.0.14 - -5.3.2 Release notes (2020-07-21) -============================================================= - -### Fixed - -* Fix a file format upgrade bug when opening older Realm files. Could cause - assertions like "Assertion failed: ref != 0" during opning of a Realm. - ([Core #6644](https://github.com/realm/realm-swift/issues/6644), since 5.2.0) -* A use-after-free would occur if a Realm was compacted, opened on multiple - threads prior to the first write, then written to while reads were happening - on other threads. This could result in a variety of crashes, often inside - realm::util::EncryptedFileMapping::read_barrier. - (Since v5.0.0, [#6626](https://github.com/realm/realm-swift/issues/6626), - [#6628](https://github.com/realm/realm-swift/issues/6628), - [#6652](https://github.com/realm/realm-swift/issues/6652), - [#6655](https://github.com/realm/realm-swift/issues/6555), - [#6656](https://github.com/realm/realm-swift/issues/6656)). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.11 to v6.0.12 -* Upgraded realm-sync from v5.0.11 to v5.0.12 - -5.3.1 Release notes (2020-07-17) -============================================================= - -### Enhancements - -* Add prebuilt binary for Xcode 11.6 to the release package. - -### Fixed - -* Creating an object inside migration which changed that object type's primary - key would hit an assertion failure mentioning primary_key_col - ([#6613](https://github.com/realm/realm-swift/issues/6613), since 5.0.0). -* Modifying the value of a string primary key property inside a migration with - a Realm file which was upgraded from pre-5.0 would corrupt the property's - index, typically resulting in crashes. ([Core #3765](https://github.com/realm/realm-core/issues/3765), since 5.0.0). -* Some Realm files which hit assertion failures when upgrading from the pre-5.0 - file format should now upgrade correctly (Since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.6. - -### Internal - -* Upgraded realm-core from v6.0.9 to v6.0.11 -* Upgraded realm-sync from v5.0.8 to v5.0.11 - -5.3.0 Release notes (2020-07-14) -============================================================= - -### Enhancements - -* Add `Realm.objectWillChange`, which is a Combine publisher that will emit a - notification each time the Realm is refreshed or a write transaction is - commited. - -### Fixed - -* Fix the spelling of `ObjectKeyIdentifiable`. The old spelling is available - and deprecated for compatibility. -* Rename `RealmCollection.publisher` to `RealmCollection.collectionPublisher`. - The old name interacted with the `publisher` defined by `Sequence` in very - confusing ways, so we need to use a different name. The `publisher` name is - still available for compatibility. ([#6516](https://github.com/realm/realm-swift/issues/6516)) -* Work around "xcodebuild timed out while trying to read - SwiftPackageManagerExample.xcodeproj" errors when installing Realm via - Carthage. ([#6549](https://github.com/realm/realm-swift/issues/6549)). -* Fix a performance regression when using change notifications. (Since 5.0.0, - [#6629](https://github.com/realm/realm-swift/issues/6629)). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v6.0.8 to v6.0.9 -* Upgraded realm-sync from v5.0.7 to v5.0.8 - -5.2.0 Release notes (2020-06-30) -============================================================= - -### Fixed -* Opening a SyncSession with LOCAL app deployments would not use the correct endpoints. -This release also contains all changes from 5.0.3 and 5.1.0. - -### Breaking Changes -* The following classes & aliases have been renamed to align Cocoa with the other Realm SDKs: - -| Old API | New API | -|:------------------------------------------------------------|:---------------------------------------------------------------| -| `RLMSyncUser` | `RLMUser` | -| `SyncUser` | `User` | -| `RLMAppCredential` | `RLMCredential` | -| `AppCredential` | `Credential` | -| `RealmApp` | `App` | -| `RLMUserAPIKeyProviderClient` | `RLMAPIKeyAuth` | -| `RLMUsernamePasswordProviderClient` | `RLMEmailPasswordAuth` | -| `UsernamePasswordProviderClient` | `EmailPasswordAuth` | -| `UserAPIKeyProviderClient` | `APIKeyAuth` | - -* The following functionality has also moved to the User: - -| Old API | New API | -|:-------------------------------------------------------------|:--------------------------------------------------------------| -| `[RLMApp callFunctionNamed:]` | `[RLMUser callFunctionNamed:]` | -| `App.functions` | `User.functions` | -| `[RLMApp mongoClientWithServiceName:]` | `[RLMUser mongoClientWithServiceName:]` | -| `App.mongoClient(serviceName)` | `User.mongoClient(serviceName)` | -| `[RLMApp userAPIKeyProviderClient]` | `[RLMUser apiKeyAuth]` | -| `App.userAPIKeyProviderClient` | `App.apiKeyAuth()` | -| `[RLMApp logOut:]` | `[RLMUser logOut]` | -| `App.logOut(user)` | `User.logOut()` | -| `[RLMApp removeUser:]` | `[RLMUser remove]` | -| `App.remove(user)` | `User.remove()` | -| `[RLMApp linkUser:credentials:]` | `[RLMUser linkWithCredentials:]` | -| `App.linkUser(user, credentials)` | `User.link(credentials)` | - -* The argument labels in Swift have changed for several methods: -| Old API | New API | -|:-------------------------------------------------------------|:--------------------------------------------------------------| -| `APIKeyAuth.createApiKey(withName:completion:)` | `APIKeyAuth.createApiKey(named:completion:)` | -| `App.login(withCredential:completion:) | `App.login(credentials:completion:)` | -| `App.pushClient(withServiceName:)` | `App.pushClient(serviceName:)` | -| `MongoClient.database(withName:)` | `MongoClient.database(named:)` | - -* `refreshCustomData()` on User now returns void and passes the custom data to the callback on success. - -### Compatibility -* This release introduces breaking changes w.r.t some sync classes and MongoDB Realm Cloud functionality. - (See the breaking changes section for the full list) -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* Realm Studio: 10.0.0 or later. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 - -10.0.0-beta.2 Release notes (2020-06-09) -============================================================= -Xcode 11.3 and iOS 9 are now the minimum supported versions. - -### Enhancements - -* Add support for building with Xcode 12 beta 1. watchOS currently requires - removing x86_64 from the supported architectures. Support for the new 64-bit - watch simulator will come in a future release. - -### Fixed -* Opening a SyncSession with LOCAL app deployments would not use the correct endpoints. -* Linking from embedded objects to top-level objects was incorrectly disallowed. - -* Opening a Realm file in file format v6 (created by Realm Cocoa versions - between 2.4 and 2.10) would crash. (Since 5.0.0, [Core #3764](https://github.com/realm/realm-core/issues/3764)). -* Upgrading v9 (pre-5.0) Realm files would create a redundant search index for - primary key properties. This index would then be removed the next time the - Realm was opened, resulting in some extra i/o in the upgrade process. - (Since 5.0.0, [Core #3787](https://github.com/realm/realm-core/issues/3787)). -* Fixed a performance issue with upgrading v9 files with search indexes on - non-primary-key properties. (Since 5.0.0, [Core #3767](https://github.com/realm/realm-core/issues/3767)). - -### Compatibility -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 - -10.0.0-beta.1 Release notes (2020-06-08) -============================================================= - -NOTE: This version bumps the Realm file format to version 11. It is not -possible to downgrade to earlier versions. Older files will automatically be -upgraded to the new file format. Only [Realm Studio -10.0.0](https://github.com/realm/realm-studio/releases/tag/v10.0.0-beta.1) or -later will be able to open the new file format. - -### Enhancements - -* Add support for next generation sync. Support for syncing to MongoDB instead - of Realm Object Server. Applications must be created at realm.mongodb.com -* The memory mapping scheme for Realm files has changed to better support - opening very large files. -* Add support for the ObjectId data type. This is an automatically-generated - unique identifier similar to a GUID or a UUID. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for the Decimal128 data type. This is a 128-bit IEEE 754 decimal - floating point number similar to NSDecimalNumber. - ([PR #6450](https://github.com/realm/realm-swift/pull/6450)). -* Add support for embedded objects. Embedded objects are objects which are - owned by a single parent object, and are deleted when that parent object is - deleted. They are defined by subclassing `EmbeddedObject` / - `RLMEmbeddedObject` rather than `Object` / `RLMObject`. -* Add `-[RLMSyncUser customData]`/`SyncUser.customData`. Custom data is - configured in your MongoDB Realm App. -* Add `-[RLMApp callFunctionNamed:arguments]`/`RealmApp.functions`. This is the - entry point for calling Remote MongoDB Realm functions. Functions allow you - to define and execute server-side logic for your application. Functions are - written in modern JavaScript (ES6+) and execute in a serverless manner. When - you call a function, you can dynamically access components of the current - application as well as information about the request to execute the function - and the logged in user that sent the request. -* Add `-[RLMApp mongoClientWithServiceName]`/`RealmApp.mongoClient`. This is - the entry point for calling your Remote MongoDB Service. The read operations - are `-[RLMMongoCollection findWhere:completion:]`, `-[RLMMongoCollection - countWhere:completion:]`and `-[RLMMongoCollection - aggregateWithPipeline:completion:]`. The write operations are - `-[RLMMongoCollection insertOneDocument:completion:]`, `-[RLMMongoCollection - insertManyDocuments:completion:]`, `-[RLMMongoCollection - updateOneDocument:completion:]`, `-[RLMMongoCollection - updateManyDocuments:completion:]`, `-[RLMMongoCollection - deleteOneDocument:completion:]`, and `-[RLMMongoCollection - deleteManyDocuments:completion:]`. If you are already familiar with MongoDB - drivers, it is important to understand that the remote MongoCollection only - provides access to the operations available in MongoDB Realm. -* Change `[RLMSyncUser - configurationWithPartitionValue:]`/`SyncUser.configuration(with:)` to accept - all BSON types. Partition values can currently be of types `String`, `Int`, - or `ObjectId`. Opening a realm by partition value is the equivalent of - previously opening a realm by URL. In this case, partitions are meant to be - more closely associated with your data. E.g., if you are running a `Dog` - kennel, and have a field `breed` that acts as your partition key, you could - open up realms based on the breed of the dogs. - -### Breaking Changes - -* We no longer support Realm Cloud (legacy), but instead the new "MongoDB - Realm" Cloud. MongoDB Realm is a serverless platform that enables developers - to quickly build applications without having to set up server infrastructure. - MongoDB Realm is built on top of MongoDB Atlas, automatically integrating the - connection to your database. -* Remove support for Query-based sync, including the configuration parameters - and the `RLMSyncSubscription` and `SyncSubscription` types ([#6437](https://github.com/realm/realm-swift/pull/6437)). -* Primary key properties are no longer marked as being indexed. This reflects - an internal change to how primary keys are handled that should not have any - other visible effects. ([#6440](https://github.com/realm/realm-swift/pull/6440)). -* Remove everything related to sync permissions, including both the path-based - permission system and the object-level privileges for query-based sync. ([#6445](https://github.com/realm/realm-swift/pulls/6445)) -* Primary key uniqueness is now enforced when creating new objects during - migrations, rather than only at the end of migrations. Previously new objects - could be created with duplicate primary keys during a migration as long as - the property was changed to a unique value before the end of the migration, - but now a unique value must be supplied when creating the object. -* Remove support for Realm Object Server. - -### Compatibility - -* File format: Generates Realms with format v11 (Reads and upgrades all previous formats) -* MongoDB Realm: 84893c5 or later. -* APIs are backwards compatible with all previous releases in the 10.0.0-alpha series. -* `List.index(of:)` would give incorrect results if it was the very first thing - called on that List after a Realm was refreshed following a write which - modified the List. (Since 5.0.0, [#6606](https://github.com/realm/realm-swift/issues/6606)). -* If a ThreadSafeReference was the only remaining reference to a Realm, - multiple copies of the file could end up mapped into memory at once. This - probably did not have any symptoms other than increased memory usage. (Since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v6.0.3 to v10.0.0-beta.1 -* Upgraded realm-sync from v5.0.1 to v10.0.0-beta.2 -* Upgraded realm-core from v6.0.6 to v6.0.7 -* Upgraded realm-sync from v5.0.5 to v5.0.6 -* Upgraded realm-core from v6.0.6 to v6.0.8 -* Upgraded realm-sync from v5.0.5 to v5.0.7 - -5.1.0 Release notes (2020-06-22) -============================================================= - -### Enhancements - -* Allow opening full-sync Realms in read-only mode. This disables local schema - initialization, which makes it possible to open a Realm which the user does - not have write access to without using asyncOpen. In addition, it will report - errors immediately when an operation would require writing to the Realm - rather than reporting it via the sync error handler only after the server - rejects the write. - -### Fixed - -* Opening a Realm using a configuration object read from an existing Realm - would incorrectly bind the new Realm to the original Realm's thread/queue, - resulting in "Realm accessed from incorrect thread." exceptions. - ([#6574](https://github.com/realm/realm-swift/issues/6574), - [#6559](https://github.com/realm/realm-swift/issues/6559), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -5.0.3 Release notes (2020-06-10) -============================================================= - -### Fixed - -* `-[RLMObject isFrozen]` always returned false. ([#6568](https://github.com/realm/realm-swift/issues/6568), since 5.0.0). -* Freezing an object within the write transaction that the object was created - in now throws an exception rather than crashing when the object is first - used. -* The schema for frozen Realms was not properly initialized, leading to crashes - when accessing a RLMLinkingObjects property. - ([#6568](https://github.com/realm/realm-swift/issues/6568), since 5.0.0). -* Observing `Object.isInvalidated` via a keypath literal would produce a - warning in Swift 5.2 due to the property not being marked as @objc. - ([#6554](https://github.com/realm/realm-swift/issues/6554)) - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -5.0.2 Release notes (2020-06-02) -============================================================= - -### Fixed - -* Fix errSecDuplicateItem (-25299) errors when opening a synchronized Realm - when upgrading from pre-5.0 versions of Realm. - ([#6538](https://github.com/realm/realm-swift/issues/6538), [#6494](https://github.com/realm/realm-swift/issues/6494), since 5.0.0). -* Opening Realms stored on filesystems which do not support preallocation (such - as ExFAT) would give "Operation not supported" exceptions. - ([#6508](https://github.com/realm/realm-swift/issues/6508), since 3.2.0). -* 'NoSuchTable' exceptions would sometimes be thrown after upgrading a Relam - file to the v10 format. ([Core #3701](https://github.com/realm/realm-core/issues/3701), since 5.0.0) -* If the upgrade process was interrupted/killed for various reasons, the - following run could stop with some assertions failing. No instances of this - happening were reported to us. (Since 5.0.0). -* Queries filtering a `List` where the query was on an indexed property over a - link would sometimes give incomplete results. - ([#6540](https://github.com/realm/realm-swift/issues/6540), since 4.1.0 but - more common since 5.0.0) -* Opening a file in read-only mode would attempt to make a spurious write to - the file, causing errors if the file was in read-only storage (since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -### Internal - -* Upgraded realm-core from v6.0.4 to v6.0.6 -* Upgraded realm-sync from v5.0.3 to v5.0.5 - -5.0.1 Release notes (2020-05-27) -============================================================= - -### Enhancements - -* Add prebuilt binary for Xcode 11.5 to the release package. - -### Fixed - -* Fix linker error when building a xcframework for Catalyst. - ([#6511](https://github.com/realm/realm-swift/issues/6511), since 4.3.1). -* Fix building for iOS devices when using Swift Package Manager - ([#6522](https://github.com/realm/realm-swift/issues/6522), since 5.0.0). -* `List` and `RealmOptional` properties on frozen objects were not initialized - correctly and would always report `nil` or an empty list. - ([#6527](https://github.com/realm/realm-swift/issues/6527), since 5.0.0). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.5. - -5.0.0 Release notes (2020-05-15) -============================================================= - -NOTE: This version bumps the Realm file format to version 10. It is not -possible to downgrade version 9 or earlier. Files created with older versions -of Realm will be automatically upgraded. Only -[Studio 3.11](https://github.com/realm/realm-studio/releases/tag/v3.11.0) or later will be able -to open the new file format. - -### Enhancements - -* Storing large binary blobs in Realm files no longer forces the file to be at - least 8x the size of the largest blob. -* Reduce the size of transaction logs stored inside the Realm file, reducing - file size growth from large transactions. -* Add support for frozen objects. `Realm`, `Results`, `List` and `Object` now - have `freeze()` methods which return a frozen copy of the object. These - objects behave similarly to creating unmanaged deep copies of the source - objects. They can be read from any thread and do not update when writes are - made to the Realm, but creating frozen objects does not actually copy data - out of the Realm and so can be much faster and use less memory. Frozen - objects cannot be mutated or observed for changes (as they never change). - ([PR #6427](https://github.com/realm/realm-swift/pull/6427)). -* Add the `isFrozen` property to `Realm`, `Results`, `List` and `Object`. -* Add `Realm.Configuration.maxNumberOfActiveVersions`. Each time a write - transaction is performed, a new version is created inside the Realm, and then - any versions which are no longer in use are cleaned up. If too many versions - are kept alive while performing writes (either due to a background thread - performing a long operation that doesn't let the Realm on that thread - refresh, or due to holding onto frozen versions for a long time) the Realm - file will grow in size, potentially to the point where it is too large to be - opened. Setting this configuration option will make write transactions which - would cause the live version count to exceed the limit to instead fail. -* Add support for queue-confined Realms. Rather than being bound to a specific - thread, queue-confined Realms are bound to a serial dispatch queue and can be - used within blocks dispatched to that queue regardless of what thread they - happen to run on. In addition, change notifications will be delivered to that - queue rather than the thread's run loop. ([PR #6478](https://github.com/realm/realm-swift/pull/6478)). -* Add an option to deliver object and collection notifications to a specific - serial queue rather than the current thread. ([PR #6478](https://github.com/realm/realm-swift/pull/6478)). -* Add Combine publishers for Realm types. Realm collections have a `.publisher` - property which publishes the collection each time it changes, and a - `.changesetPublisher` which publishes a `RealmCollectionChange` each time the - collection changes. Corresponding publishers for Realm Objects can be - obtained with the `publisher()` and `changesetPublisher()` global functions. -* Extend Combine publishers which output Realm types with a `.freeze()` - function which will make the publisher instead output frozen objects. -* String primary keys no longer require a separate index, improving insertion - and deletion performance without hurting lookup performance. -* Reduce the encrypted page reclaimer's impact on battery life when encryption - is used. ([Core #3461](https://github.com/realm/realm-core/pull/3461)). - -### Fixed - -* The uploaded bytes in sync progress notifications was sometimes incorrect and - wouldn't exactly equal the uploadable bytes when the uploaded completed. -* macOS binaries were built with the incorrect deployment target (10.14 rather - than 10.9), resulting in linker warnings. ([#6299](https://github.com/realm/realm-swift/issues/6299), since 3.18.0). -* An internal datastructure for List properties could be double-deleted if the - last reference was released from a thread other than the one which the List - was created on at the wrong time. This would typically manifest as - "pthread_mutex_destroy() failed", but could also result in other kinds of - crashes. ([#6333](https://github.com/realm/realm-swift/issues/6333)). -* Sorting on float or double properties containing NaN values had inconsistent - results and would sometimes crash due to out-of-bounds memory accesses. - ([#6357](https://github.com/realm/realm-swift/issues/6357)). - -### Breaking Changes - -* The ObjectChange type in Swift is now generic and includes a reference to the - object which changed. When using `observe(on:)` to receive notifications on a - dispatch queue, the object will be confined to that queue. -* The Realm instance passed in the callback to asyncOpen() is now confined to - the callback queue passed to asyncOpen() rather than the thread which the - callback happens to be called on. This means that the Realm instance may be - stored and reused in further blocks dispatched to that queue, but the queue - must now be a serial queue. -* Files containing Date properties written by version of Realm prior to 1.0 can - no longer be opened. -* Files containing Any properties can no longer be opened. This property type - was never documented and was deprecated in 1.0. -* Deleting objects now preserves the order of objects reported by unsorted - Results rather than performing a swap operation before the delete. Note that - it is still not safe to assume that the order of objects in an unsorted - Results is the order that the objects were created in. -* The minimum supported deployment target for iOS when using Swift Package - Manager to install Realm is now iOS 11. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Realm Studio: 3.11 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.4.1. - -### Internal - -* Upgraded realm-core from v5.23.8 to v6.0.4 -* Upgraded realm-sync from v4.9.5 to v5.0.3 - -5.0.0-beta.6 Release notes (2020-05-08) -============================================================= - -### Enhancements - -* Add support for queue-confined Realms. Rather than being bound to a specific - thread, queue-confined Realms are bound to a serial dispatch queue and can be - used within blocks dispatched to that queue regardless of what thread they - happen to run on. In addition, change notifications will be delivered to that - queue rather than the thread's run loop. ([PR #6478](https://github.com/realm/realm-swift/pull/6478)). -* Add an option to deliver object and collection notifications to a specific - serial queue rather than the current thread. ([PR #6478](https://github.com/realm/realm-swift/pull/6478)). - -### Fixed - -* The uploaded bytes in sync progress notifications was sometimes incorrect and - wouldn't exactly equal the uploadable bytes when the uploaded completed. - -### Breaking Changes - -* The Realm instance passed in the callback to asyncOpen() is now confined to - the callback queue passed to asyncOpen() rather than the thread which the - callback happens to be called on. This means that the Realm instance may be - stored and reused in further blocks dispatched to that queue, but the queue - must now be a serial queue. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.4.1. - -### Internal - -* Upgraded realm-core from v6.0.3 to v6.0.4 -* Upgraded realm-sync from v5.0.1 to v5.0.3 - -4.4.1 Release notes (2020-04-16) -============================================================= - -### Enhancements - -* Upgrade Xcode 11.4 binaries to Xcode 11.4.1. - -### Fixed - -* Fix a "previous <= m_schema_transaction_version_max" assertion failure caused - by a race condition that could occur after performing a migration. (Since 3.0.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.4.1. - -5.0.0-beta.3 Release notes (2020-02-26) -============================================================= - -Based on 4.3.2 and also includes all changes since 4.3.0. - -### Enhancements - -* Add support for frozen objects. `Realm`, `Results`, `List` and `Object` now - have `freeze()` methods which return a frozen copy of the object. These - objects behave similarly to creating unmanaged deep copies of the source - objects. They can be read from any thread and do not update when writes are - made to the Realm, but creating frozen objects does not actually copy data - out of the Realm and so can be much faster and use less memory. Frozen - objects cannot be mutated or observed for changes (as they never change). - ([PR #6427](https://github.com/realm/realm-swift/pull/6427)). -* Add the `isFrozen` property to `Realm`, `Results`, `List` and `Object`. -* Add `Realm.Configuration.maxNumberOfActiveVersions`. Each time a write - transaction is performed, a new version is created inside the Realm, and then - any versions which are no longer in use are cleaned up. If too many versions - are kept alive while performing writes (either due to a background thread - performing a long operation that doesn't let the Realm on that thread - refresh, or due to holding onto frozen versions for a long time) the Realm - file will grow in size, potentially to the point where it is too large to be - opened. Setting this configuration option will make write transactions which - would cause the live version count to exceed the limit to instead fail. - - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-core from v6.0.0-beta.3 to v6.0.3 -* Upgraded realm-sync from v5.0.0-beta.2 to v5.0.1 - -5.0.0-beta.2 Release notes (2020-01-13) -============================================================= - -Based on 4.3.0 and also includes all changes since 4.1.1. - -### Fixed - -* Fix compilation when using CocoaPods targeting iOS versions older than 11 (since 5.0.0-alpha). - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-core from v6.0.0-beta.2 to v6.0.0-beta.3 -* Upgraded realm-sync from v5.0.0-beta.1 to v5.0.0-beta.2 - -5.0.0-beta.1 Release notes (2019-12-13) -============================================================= - -Based on 4.1.1 and also includes all changes since 4.1.0. - -NOTE: This version bumps the Realm file format to version 10. It is not possible to downgrade version 9 or earlier. Files created with older versions of Realm will be automatically upgraded. - -### Enhancements - -* String primary keys no longer require a separate index, improving insertion - and deletion performance without hurting lookup performance. -* Reduce the encrypted page reclaimer's impact on battery life when encryption - is used. ([Core #3461](https://github.com/realm/realm-core/pull/3461)). - -### Fixed - -* Fix an error when a table-backed Results was accessed immediately after - deleting the object previously at the index being accessed (since - 5.0.0-alpha.1). -* macOS binaries were built with the incorrect deployment target (10.14 rather - than 10.9), resulting in linker warnings. ([#6299](https://github.com/realm/realm-swift/issues/6299), since 3.18.0). -* An internal datastructure for List properties could be double-deleted if the - last reference was released from a thread other than the one which the List - was created on at the wrong time. This would typically manifest as - "pthread_mutex_destroy() failed", but could also result in other kinds of - crashes. ([#6333](https://github.com/realm/realm-swift/issues/6333)). -* Sorting on float or double properties containing NaN values had inconsistent - results and would sometimes crash due to out-of-bounds memory accesses. - ([#6357](https://github.com/realm/realm-swift/issues/6357)). - -### Known Issues - -* Changing which property of an object is the primary key in a migration will - break incoming links to objects of that type. -* Changing the primary key of an object with Data properties in a migration - will crash. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* APIs are backwards compatible with all previous releases in the 5.x.y series. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-core from v6.0.0-alpha.24 to v6.0.0-beta.2 -* Upgraded realm-sync from 4.7.1-core6.5 to v5.0.0-beta.1 - -5.0.0-alpha.1 Release notes (2019-11-14) -============================================================= - -Based on 4.1.0. - -### Enhancements - -* Add `-[RLMRealm fileExistsForConfiguration:]`/`Realm.fileExists(for:)`, - which checks if a local Realm file exists for the given configuration. -* Add `-[RLMRealm deleteFilesForConfiguration:]`/`Realm.deleteFiles(for:)` - to delete the Realm file and all auxiliary files for the given configuration. -* Storing large binary blobs in Realm files no longer forces the file to be at - least 8x the size of the largest blob. -* Reduce the size of transaction logs stored inside the Realm file, reducing - file size growth from large transactions. - -NOTE: This version bumps the Realm file format to version 10. It is not -possible to downgrade version 9 or earlier. Files created with older versions -of Realm will be automatically upgraded. This automatic upgrade process is not -yet well tested. Do not open Realm files with data you care about with this -alpha version. - -### Breaking Changes - -* Files containing Date properties written by version of Realm prior to 1.0 can - no longer be opened. -* Files containing Any properties can no longer be opened. This property type - was never documented and was deprecated in 1.0. - -### Compatibility - -* File format: Generates Realms with format v10 (Reads and upgrades v9) -* Realm Object Server: 3.21.0 or later. -* APIs are backwards compatible with all previous releases in the 4.x.y series. -* Carthage release for Swift is built with Xcode 11.3. -* Carthage release for Swift is built with Xcode 11.2.1. - -### Internal - -* Upgraded realm-core from 5.23.6 to v6.0.0-alpha.24. -* Upgraded realm-sync from 4.8.2 to 4.7.1-core6.5. - -4.4.0 Release notes (2020-03-26) -============================================================= - -Swift 4.0 and Xcode 10.3 are now the minimum supported versions. - -### Enhancements - -* Allow setting the `fileUrl` for synchronized Realms. An appropriate local - path based on the sync URL will still be used if it is not overridden. - ([PR #6454](https://github.com/realm/realm-swift/pull/6454)). -* Add Xcode 11.4 binaries to the release package. - -### Fixed - -* None. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.4. - -4.3.2 Release notes (2020-02-06) -============================================================= - -### Enhancements - -* Similar to `autoreleasepool()`, `realm.write()` now returns the value which - the block passed to it returns. Returning `Void` from the block is still allowed. - -### Fixed - -* Fix a memory leak attributed to `property_copyAttributeList` the first time a - Realm is opened when using Realm Swift. ([#6409](https://github.com/realm/realm-swift/issues/6409), since 4.0.0). -* Connecting to a `realms:` sync URL would crash at runtime on iOS 11 (and no - other iOS versions) inside the SSL validation code. (Since 4.3.1). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-sync from 4.9.4 to 4.9.5. - -4.3.1 Release notes (2020-01-16) -============================================================= - -### Enhancements - -* Reduce the encrypted page reclaimer's impact on battery life when encryption - is used. ([Core #3461](https://github.com/realm/realm-core/pull/3461)). - -### Fixed - -* macOS binaries were built with the incorrect deployment target (10.14 rather - than 10.9), resulting in linker warnings. ([#6299](https://github.com/realm/realm-swift/issues/6299), since 3.18.0). -* An internal datastructure for List properties could be double-deleted if the - last reference was released from a thread other than the one which the List - was created on at the wrong time. This would typically manifest as - "pthread_mutex_destroy() failed", but could also result in other kinds of - crashes. ([#6333](https://github.com/realm/realm-swift/issues/6333)). -* Sorting on float or double properties containing NaN values had inconsistent - results and would sometimes crash due to out-of-bounds memory accesses. - ([#6357](https://github.com/realm/realm-swift/issues/6357)). -* A NOT query on a `List` which happened to have the objects in a - different order than the underlying table would sometimes include the object - immediately before an object which matches the query. ([#6289](https://github.com/realm/realm-swift/issues/6289), since 0.90.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-core from 5.23.6 to 5.23.8. -* Upgraded realm-sync from 4.9.0 to 4.9.4. - -4.3.0 Release notes (2019-12-19) -============================================================= - -### Enhancements - -* Add the ability to set a custom logger function on `RLMSyncManager` which is - called instead of the default NSLog-based logger. -* Expose configuration options for the various types of sync connection - timeouts and heartbeat intervals on `RLMSyncManager`. -* Add an option to have `Realm.asyncOpen()` report an error if the connection - times out rather than swallowing the error and attempting to reconnect until - it succeeds. - -### Fixed - -* Fix a crash when using value(forKey:) on a LinkingObjects property (including - when doing so indirectly, such as by querying on that property). - ([#6366](https://github.com/realm/realm-swift/issues/6366), since 4.0.0). -* Fix a rare crash in `ClientHistoryImpl::integrate_server_changesets()` which - would only happen in Debug builds (since v3.0.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.3. - -### Internal - -* Upgraded realm-sync from 4.8.2 to 4.9.0. - -4.2.0 Release notes (2019-12-16) -============================================================= - -### Enhancements - -* Add `-[RLMRealm fileExistsForConfiguration:]`/`Realm.fileExists(for:)`, - which checks if a local Realm file exists for the given configuration. -* Add `-[RLMRealm deleteFilesForConfiguration:]`/`Realm.deleteFiles(for:)` - to delete the Realm file and all auxiliary files for the given configuration. - -### Fixed - -* None. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.3. - -4.1.1 Release notes (2019-11-18) -============================================================= - -### Fixed - -* The UpdatePolicy passed to `realm.add()` or `realm.create()` was not properly - propagated when adding objects within a `List`, which could result in - spurious change notifications when using `.modified`. - ([#6321](https://github.com/realm/realm-swift/issues/6321), since v3.16.0) -* Fix a rare deadlock when a Realm collection or object was observed, then - `refresh()` was explicitly called, and then the NotificationToken from the - observation was destroyed on a different thread (since 0.98.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.2. - -4.1.0 Release notes (2019-11-13) -============================================================= - -### Enhancements - -* Improve performance of queries over a link where the final target property - has an index. -* Restore support for storing `@objc enum` properties on RealmSwift.Object - subclasses (broken in 4.0.0), and add support for storing them in - RealmOptional properties. - -### Fixed - -* The sync client would fail to reconnect after failing to integrate a - changeset. The bug would lead to further corruption of the client’s Realm - file. ([RSYNC-48](https://jira.mongodb.org/browse/RSYNC-48), since v3.2.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.2. - -### Internal - -* Upgraded realm-core from 5.23.5 to 5.23.6. -* Upgraded realm-sync from 4.7.11 to 4.8.2 - -4.0.0 Release notes (2019-11-08) -============================================================= - -### Breaking Changes - -* All previously deprecated functionality has now been removed entirely. -* The schema discovery logic for RealmSwift.Object subclasses has been - rewritten in Swift. This should not have any effect on valid class - definitions, but there may be types of invalid definitions which previously - worked by coincidence and no longer do. -* `SyncSubscription` no longer has a generic type parameter, as the type was - not actually used for anything. -* The following Swift types have changed from `final class` to `struct`: - - AnyRealmCollection - - LinkingObjects - - ObjectiveCSupport - - Realm - - Results - - SyncSubscription - - ThreadSafeReference - There is no intended change in semantics from this, but certain edge cases - may behave differently. -* The designated initializers defined by RLMObject and Object other than - zero-argument `init` have been replaced with convenience initializers. -* The implementation of the path-based permissions API has been redesigned to - accomodate changes to the server. This should be mostly a transparent change, - with two main exceptions: - 1. SyncPermission objects are no longer live Realm objects, and retrieving - permissions gives an Array rather than Results. - Getting up-to-date permissions now requires calling retrievePermissions() again - rather than observing the permissions. - 2. The error codes for permissions functions have changed. Rather than a - separate error type and set of error codes, permission functions now produce - SyncAuthErrors. - -### Enhancements - -* Improve performance of initializing Realm objects with List properties. - -### Fixed - -* None. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.2. - -3.21.0 Release notes (2019-11-04) -============================================================= - -### Enhancements - -* Add prebuilt binaries for Xcode 11.2. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.2. - -3.20.0 Release notes (2019-10-21) -============================================================= - -### Enhancements - -* Add support for custom refresh token authentication. This allows a user to be - authorized with an externally-issued refresh token when ROS is configured to - recognize the external issuer as a refresh token validator. - ([PR #6311](https://github.com/realm/realm-swift/pull/6311)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11. - -3.19.1 Release notes (2019-10-17) -============================================================= - -### Enhancements - -* Improve performance of sync changeset integration. Transactions involving a - very large number of objects and cheap operations on each object are as much - as 20% faster. - -### Fixed - -* Fix a crash when a RLMArray/List of primitives was observed and then the - containing object was deleted before the first time that the background - notifier could run. - ([Issue #6234](https://github.com/realm/realm-swift/issues/6234, since 3.0.0)). -* Remove an incorrect assertion that would cause crashes inside - `TableInfoCache::get_table_info()`, with messages like "Assertion failed: info.object_id_index == 0 [3, 0]". - (Since 3.18.0, [#6268](https://github.com/realm/realm-swift/issues/6268) and [#6257](https://github.com/realm/realm-swift/issues/6257)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.0. - -### Internal - -* Upgrade to REALM_SYNC_VERSION=4.7.11 - -3.19.0 Release notes (2019-09-27) -============================================================= - -### Enhancements - -* Expose ObjectSchema.objectClass in Swift as looking up the class via - NSClassFromString() can be complicated for Swift types. - ([PR #6244](https://github.com/realm/realm-swift/pull/6244)). -* Add support for suppressing notifications using closure-based write/transaction methods. - ([PR #6252](https://github.com/realm/realm-swift/pull/6252)). - -### Fixed - -* IN or chained OR equals queries on an unindexed string column would fail to - match some results if any of the strings were 64 bytes or longer. - ([Core #3386](https://github.com/realm/realm-core/pull/3386), since 3.14.2). -* Query Based Sync subscriptions for queries involving a null timestamp were - not sent to the server correctly and would match no objects. - ([Core #3389](https://github.com/realm/realm-core/pull/3388), since 3.17.3). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.0. - -### Internal - -* Upgrade to REALM_CORE_VERSION=5.23.5 -* Upgrade to REALM_SYNC_VERSION=4.7.8 - -3.18.0 Release notes (2019-09-13) -============================================================= - -The file format for synchronized Realms has changed. Old Realms will be -automatically upgraded when they are opened. Once upgraded, the files will not -be openable by older versions of Realm. The upgrade should not take a -significant amount of time to run or run any risk of errors. - -This does not effect non-synchronized Realms. - -### Enhancements - -* Improve performance of queries on Date properties - ([Core #3344](https://github.com/realm/realm-core/pull/3344), [Core #3351](https://github.com/realm/realm-core/pull/3351)). -* Syncronized Realms are now more aggressive about trimming local history that - is no longer needed. This should reduce file size growth in write-heavy - workloads. ([Sync #3007](https://github.com/realm/realm-sync/issues/3007)). -* Add support for building Realm as an xcframework. - ([PR #6238](https://github.com/realm/realm-swift/pull/6238)). -* Add prebuilt libraries for Xcode 11 to the release package. - ([PR #6248](https://github.com/realm/realm-swift/pull/6248)). -* Add a prebuilt library for Catalyst/UIKit For Mac to the release package - ([PR #6248](https://github.com/realm/realm-swift/pull/6248)). - -### Fixed - -* If a signal interrupted a msync() call, Realm would throw an exception and - the write transaction would fail. This behavior has new been changed to retry - the system call instead. ([Core #3352](https://github.com/realm/realm-core/issues/3352)) -* Queries on the sum or average of an integer property would sometimes give - incorrect results. ([Core #3356](https://github.com/realm/realm-core/pull/3356)). -* Opening query-based synchronized Realms with a small number of subscriptions - performed an unneccesary write transaction. ([ObjectStore #815](https://github.com/realm/realm-object-store/pull/815)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 11.0 - -### Deprecations - -* `RLMIdentityProviderNickname` has been deprecated in favor of `RLMIdentityProviderUsernamePassword`. -* `+[RLMIdentityProvider credentialsWithNickname]` has been deprecated in favor of `+[RLMIdentityProvider credentialsWithUsername]`. -* `Sync.nickname(String, Bool)` has been deprecated in favor of `Sync.usernamePassword(String, String, Bool)`. - -3.17.3 Release notes (2019-07-24) -============================================================= - -### Enhancements - -* Add Xcode 10.3 binaries to the release package. Remove the Xcode 9.2 and 9.3 binaries. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.3. - -3.17.1 Release notes (2019-07-10) -============================================================= - -### Enhancements - -* Add support for canceling asynchronous opens using a new AsyncOpenTask - returned from the asyncOpen() call. ([PR #6193](https://github.com/realm/realm-swift/pull/6193)). -* Importing the Realm SPM package can now be done by pinning to a version - rather than a branch. - -### Fixed - -* Queries on a List/RLMArray which checked an indexed int property would - sometimes give incorrect results. - ([#6154](https://github.com/realm/realm-swift/issues/6154)), since v3.15.0) -* Queries involving an indexed int property had a memory leak if run multiple - times. ([#6186](https://github.com/realm/realm-swift/issues/6186)), since v3.15.0) -* Creating a subscription with `includeLinkingObjects:` performed unneccesary - comparisons, making it extremely slow when large numbers of objects were - involved. ([Core #3311](https://github.com/realm/realm-core/issues/3311), since v3.15.0) - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.17.0 Release notes (2019-06-28) -============================================================= - -### Enhancements - -* Add support for including Realm via Swift Package Manager. This currently - requires depending on the branch "master" rather than pinning to a version - (i.e. `.package(url: "https://github.com/realm/realm-swift", .branch("master"))`). - ([#6187](https://github.com/realm/realm-swift/pull/6187)). -* Add Codable conformance to RealmOptional and List, and Encodable conformance to Results. - ([PR #6172](https://github.com/realm/realm-swift/pull/6172)). - -### Fixed - -* Attempting to observe an unmanaged LinkingObjects object crashed rather than - throwing an approriate exception (since v0.100.0). -* Opening an encrypted Realm could potentially report that a valid file was - corrupted if the system was low on free memory. - (since 3.14.0, [Core #3267](https://github.com/realm/realm-core/issues/3267)) -* Calling `Realm.asyncOpen()` on multiple Realms at once would sometimes crash - due to a `FileNotFound` exception being thrown on a background worker thread. - (since 3.16.0, [ObjectStore #806](https://github.com/realm/realm-object-store/pull/806)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.16.2 Release notes (2019-06-14) -============================================================= - -### Enhancements - -* Add support for Xcode 11 Beta 1. Xcode betas are only supported when building - from source, and not when using a prebuilt framework. - ([PR #6164](https://github.com/realm/realm-swift/pull/6164)). - -### Fixed - -* Using asyncOpen on query-based Realms which didn't already exist on the local - device would fail with error 214. - ([#6178](https://github.com/realm/realm-swift/issues/6178), since 3.16.0). -* asyncOpen on query-based Realms did not wait for the server-created - permission objects to be downloaded, resulting in crashes if modifications to - the permissions were made before creating a subscription for the first time (since 3.0.0). -* EINTR was not handled correctly in the notification worker, which may have - resulted in inconsistent and rare assertion failures in - `ExternalCommitHelper::listen()` when building with assertions enabled. - (PR: [#804](https://github.com/realm/realm-object-store/pull/804), since 0.91.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.16.1 Release notes (2019-05-31) -============================================================= - -### Fixed - -* The static type passed at compile time to `realm.create()` was checked for a - primary key rather than the actual type passed at runtime, resulting in - exceptions like "''RealmSwiftObject' does not have a primary key and can not - be updated'" being thrown even if the object type being created has a primary - key. (since 3.16.0, [#6159](https://github.com/realm/realm-swift/issues/6159)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.16.0 Release notes (2019-05-29) -============================================================= - -### Enhancements - -* Add an option to only set the properties which have values different from the - existing ones when updating an existing object with - `Realm.create()`/`-[RLMObject createOrUpdateInRealm:withValue:]`. This makes - notifications report only the properties which have actually changed, and - improves Object Server performance by reducing the number of operations to - merge. (Issue: [#5970](https://github.com/realm/realm-swift/issues/5970), - PR: [#6149](https://github.com/realm/realm-swift/pull/6149)). -* Using `-[RLMRealm asyncOpenWithConfiguration:callbackQueue:]`/`Realm.asyncOpen()` to open a - synchronized Realm which does not exist on the local device now uses an - optimized transfer method to download the initial data for the Realm, greatly - speeding up the first start time for applications which use full - synchronization. This is currently not applicable to query-based - synchronization. (PR: [#6106](https://github.com/realm/realm-swift/pull/6106)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.15.0 Release notes (2019-05-06) -============================================================= - -The minimum version of Realm Object Server has been increased to 3.21.0 and -attempting to connect to older versions will produce protocol mismatch errors. -Realm Cloud has already been upgraded to this version, and users using that do -not need to worry about this. - -### Enhancements - -* Add `createdAt`, `updatedAt`, `expiresAt` and `timeToLive` properties to - `RLMSyncSubscription`/`SyncSubscription`. These properties will be `nil` for - subscriptions created with older versions of Realm, but will be automatically - populated for newly-created subscriptions. -* Add support for transient subscriptions by setting the `timeToLive` when - creating the subscription. The next time a subscription is created or updated - after that time has elapsed the subscription will be automatically removed. -* Add support for updating existing subscriptions with a new query or limit. - This is done by passing `update: true` (in swift) or setting - `options.overwriteExisting = YES` (in obj-c) when creating the subscription, - which will make it update the existing subscription with the same name rather - than failing if one already exists with that name. -* Add an option to include the objects from - `RLMLinkingObjects`/`LinkingObjects` properties in sync subscriptions, - similarly to how `RLMArray`/`List` automatically pull in the contained - objects. -* Improve query performance for chains of OR conditions (or an IN condition) on - an unindexed integer or string property. - ([Core PR #2888](https://github.com/realm/realm-core/pull/2888) and - [Core PR #3250](https://github.com/realm/realm-core/pull/3250)). -* Improve query performance for equality conditions on indexed integer properties. - ([Core PR #3272](https://github.com/realm/realm-core/pull/3272)). -* Adjust the file allocation algorithm to reduce fragmentation caused by large - numbers of small blocks. -* Improve file allocator logic to reduce fragmentation and improve commit - performance after many writes. ([Core PR #3278](https://github.com/realm/realm-core/pull/3278)). - -### Fixed - -* Making a query that compares two integer properties could cause a - segmentation fault on x86 (i.e. macOS only). - ([Core PR #3253](https://github.com/realm/realm-core/pull/3256)). -* The `downloadable_bytes` parameter passed to sync progress callbacks reported - a value which correlated to the amount of data left to download, but not - actually the number of bytes which would be downloaded. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.21.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.14.2 Release notes (2019-04-25) -============================================================= - -### Enhancements - -* Updating `RLMSyncManager.customRequestHeaders` will immediately update all - currently active sync session with the new headers rather than requiring - manually closing the Realm and reopening it. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. -* Carthage release for Swift is built with Xcode 10.2.1. - -3.14.1 Release notes (2019-04-04) -============================================================= - -### Fixed - -* Fix "Cannot find interface declaration for 'RealmSwiftObject', superclass of - 'MyRealmObjectClass'" errors when building for a simulator with Xcode 10.2 - with "Install Objective-C Compatibility Header" enabled. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. -* Carthage release for Swift is built with Xcode 10.2. - -3.14.0 Release notes (2019-03-27) -============================================================= - -### Enhancements - -* Reduce memory usage when committing write transactions. -* Improve performance of compacting encrypted Realm files. - ([PR #3221](https://github.com/realm/realm-core/pull/3221)). -* Add a Xcode 10.2 build to the release package. - -### Fixed - -* Fix a memory leak whenever Realm makes a HTTP(s) request to the Realm Object - Server (Issue [#6058](https://github.com/realm/realm-swift/issues/6058), since 3.8.0). -* Fix an assertion failure when creating an object in a synchronized Realm - after creating an object with a null int primary key in the same write - transaction. - ([PR #3227](https://github.com/realm/realm-core/pull/3227)). -* Fix some new warnings when building with Xcode 10.2 beta. -* Properly clean up sync sessions when the last Realm object using the session - is deallocated while the session is explicitly suspended (since 3.9.0). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. -* Carthage release for Swift is built with Xcode 10.2. - -### Internal - -* Throw an exception rather than crashing with an assertion failure in more - cases when opening invalid Realm files. -* Upgrade to REALM_CORE_VERSION=5.14.0 -* Upgrade to REALM_SYNC_VERSION=3.15.1 - -3.13.1 Release notes (2019-01-03) -============================================================= - -### Fixed - -* Fix a crash when iterating over `Realm.subscriptions()` using for-in. - (Since 3.13.0, PR [#6050](https://github.com/realm/realm-swift/pull/6050)). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -3.13.0 Release notes (2018-12-14) -============================================================= - -### Enhancements - -* Add `Realm.subscriptions()`/`-[RLMRealm subscriptions]` and - `Realm.subscription(named:)`/`-[RLMRealm subscriptionWithName:]` to enable - looking up existing query-based sync subscriptions. - (PR: https://github.com/realm/realm-swift/pull/6029). - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -3.12.0 Release notes (2018-11-26) -============================================================= - -### Enhancements - -* Add a User-Agent header to HTTP requests made to the Realm Object Server. By - default, this contains information about the Realm library version and your - app's bundle ID. The application identifier can be customized by setting - `RLMSyncManager.sharedManager.userAgent`/`SyncManager.shared.userAgent` prior - to opening a synchronized Realm. - (PR: https://github.com/realm/realm-swift/pull/6007). -* Add Xcode 10.1 binary to the prebuilt package. - -### Fixed - -* None. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -### Internal - -* None. - - -3.11.2 Release notes (2018-11-15) -============================================================= - -### Enhancements - -* Improve the performance of the merge algorithm used for integrating remote - changes from the server. In particular, changesets involving many objects - which all link to a single object should be greatly improved. - -### Fixed - -* Fix a memory leak when removing notification blocks from collections. - PR: [#702](https://github.com/realm/realm-object-store/pull/702), since 1.1.0. -* Fix re-sorting or distincting an already-sorted Results using values from - linked objects. Previously the unsorted order was used to read the values - from the linked objects. - PR [#3102](https://github.com/realm/realm-core/pull/3102), since 3.1.0. -* Fix a set of bugs which could lead to bad changeset assertions when using - sync. The assertions would look something like the following: - `[realm-core-5.10.0] Assertion failed: ndx < size() with (ndx, size()) = [742, 742]`. - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -### Internal - -* None. - - -3.11.1 Release notes (2018-10-19) -============================================================= - -### Enhancements - -* None. - -### Fixed - -* Fix `SyncUser.requestEmailConfirmation` not triggering the email confirmation - flow on ROS. (PR [#5953](https://github.com/realm/realm-swift/pull/5953), since 3.5.0) -* Add some missing validation in the getters and setters of properties on - managed Realm objects, which would sometimes result in an application - crashing with a segfault rather than the appropriate exception being thrown - when trying to write to an object which has been deleted. - (PR [#5952](https://github.com/realm/realm-swift/pull/5952), since 2.8.0) - -### Compatibility - -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* Realm Object Server: 3.11.0 or later. - -### Internal - -* None. - - -3.11.0 Release notes (2018-10-04) -============================================================= - -### Enhancements -* Reduce memory usage when integrating synchronized changes sent by ROS. -* Devices will now report download progress for read-only Realms, allowing the - server to compact Realms more aggressively and reducing the amount of - server-side storage space required. - -### Fixed -* Fix a crash when adding an object with a non-`@objc` `String?` property which - has not been explicitly ignored to a Realm on watchOS 5 (and possibly other - platforms when building with Xcode 10). - (Issue: [5929](https://github.com/realm/realm-swift/issues/5929)). -* Fix some merge algorithm bugs which could result in `BadChangesetError` - being thrown when integrating changes sent by the server. - -### Compatibility -* File format: Generates Realms with format v9 (Reads and upgrades all previous formats) -* **NOTE!!! - You will need to upgrade your Realm Object Server to at least version 3.11.0 - or use [Realm Cloud](https://cloud.realm.io). - If you try to connect to a ROS v3.10.x or previous, you will see an error - like `Wrong protocol version in Sync HTTP request, client protocol version = 25, - server protocol version = 24`.** - -### Internal -* Update to Sync 3.12.2. - - -3.10.0 Release notes (2018-09-19) -============================================================= - -Prebuilt binaries are now built for Xcode 9.2, 9.3, 9.4 and 10.0. - -Older versions of Xcode are still supported when building from source, but you -should be migrating to at least Xcode 9.2 as soon as possible. - -### Enhancements - -* Add support for Watch Series 4 by adding an arm64_32 slice to the library. - -3.9.0 Release notes (2018-09-10) -============================================================= - -### Enhancements - -* Expose RLMSyncUser.refreshToken publicly so that it can be used for custom - HTTP requests to Realm Object Server. -* Add RLMSyncSession.connectionState, which reports whether the session is - currently connected to the Realm Object Server or if it is offline. -* Add `-suspend` and `-resume` methods to `RLMSyncSession` to enable manually - pausing data synchronization. -* Add support for limiting the number of objects matched by a query-based sync - subscription. This requires a server running ROS 3.10.1 or newer. - -### Bugfixes - -* Fix crash when getting the description of a `MigrationObject` which has - `List` properties. -* Fix crash when calling `dynamicList()` on a `MigrationObject`. - -3.8.0 Release notes (2018-09-05) -============================================================= - -### Enhancements - -* Remove some old and no longer applicable migration logic which created an - unencrypted file in the sync metadata directory containing a list of ROS URLs - connected to. -* Add support for pinning SSL certificates used for https and realms - connections by setting `RLMSyncManager.sharedManager.pinnedCertificatePaths` - in obj-c and `SyncManager.shared.pinnedCertificatePaths` in Swift. - -### Bugfixes - -* Fix warnings when building Realm as a static framework with CocoaPods. - -3.7.6 Release notes (2018-08-08) -============================================================= - -### Enhancements - -* Speed up the actual compaction when using compact-on-launch. -* Reduce memory usage when locally merging changes from sync. -* When first connecting to a server, wait to begin uploading changes until - after all changes have been downloaded to reduce the server-side load for - query-based sync. - -3.7.5 Release notes (2018-07-23) -============================================================= - -### Enhancements - -* Improve performance of applying remote changesets from sync. -* Improve performance of creating objects with string primary keys. -* Improve performance of large write transactions. -* Adjust file space allocation strategy to reduce fragmentation, producing - smaller Realm files and typically better performance. -* Close network connections immediately when a sync session is destroyed. -* Report more information in `InvalidDatabase` exceptions. - -### Bugfixes - -* Fix permission denied errors for RLMPlatform.h when building with CocoaPods - and Xcode 10 beta 3. -* Fix a use-after-free when canceling a write transaction which could result in - incorrect "before" values in KVO observations (typically `nil` when a non-nil - value is expected). -* Fix several bugs in the merge algorithm that could lead to memory corruption - and crashes with errors like "bad changeset" and "unreachable code". - -3.7.4 Release notes (2018-06-19) -============================================================= - -### Bugfixes - -* Fix a bug which could potentially flood Realm Object Server with PING - messages after a client device comes back online. - -3.7.3 Release notes (2018-06-18) -============================================================= - -### Enhancements - -* Avoid performing potentially large amounts of pointless background work for - LinkingObjects instances which are accessed and then not immediate deallocated. - -### Bugfixes - -* Fix crashes which could result from extremely fragmented Realm files. -* Fix a bug that could result in a crash with the message "bad changeset error" - when merging changesets from the server. - -3.7.2 Release notes (2018-06-13) -============================================================= - -### Enhancements - -* Add some additional consistency checks that will hopefully produce better - errors when the "prev_ref + prev_size <= ref" assertion failure occurs. - -### Bugfixes - -* Fix a problem in the changeset indexing algorithm that would sometimes - cause "bad permission object" and "bad changeset" errors. -* Fix a large number of linking warnings about symbol visibility by aligning - compiler flags used. -* Fix large increase in size of files produced by `Realm.writeCopy()` introduced in 3.6.0. - -3.7.1 Release notes (2018-06-07) -============================================================= - -* Add support for compiling Realm Swift with Xcode 10 beta 1. - -3.7.0 Release notes (2018-06-06) -============================================================= - -The feature known as Partial Sync has been renamed to Query-based -Synchronization. This has impacted a number of API's. See below for the -details. - -### Deprecations - -* `+[RLMSyncConfiguration initWithUser] has been deprecated in favor of `-[RLMSyncUser configurationWithURL:url]. -* `+[RLMSyncConfiguration automaticConfiguration] has been deprecated in favor of `-[RLMSyncUser configuration]. -* `+[RLMSyncConfiguration automaticConfigurationForUser] has been deprecated in favor of `-[RLMSyncUser configuration]. -* `-[RLMSyncConfiguration isPartial] has been deprecated in favor of `-[RLMSyncConfiguration fullSynchronization]`. - -### Enhancements - -* Add `-[RLMRealm syncSession]` and `Realm.syncSession` to obtain the session used for a synchronized Realm. -* Add `-[RLMSyncUser configuration]`. Query-based sync is the default sync mode for this configuration. -* Add `-[RLMSyncUser configurationWithURL:url]`. Query-based sync is the default sync mode for this configuration. - -3.6.0 Release notes (2018-05-29) -============================================================= - -### Enhancements - -* Improve performance of sync metadata operations and resolving thread-safe - references. -* `shouldCompactOnLaunch` is now supported for compacting the local data of - synchronized Realms. - -### Bugfixes - -* Fix a potential deadlock when a sync session progress callback held the last - strong reference to the sync session. -* Fix some cases where comparisons to `nil` in queries were not properly - serialized when subscribing to a query. -* Don't delete objects added during a migration after a call to `-[RLMMigration - deleteDataForClassName:]`. -* Fix incorrect results and/or crashes when multiple `-[RLMMigration - enumerateObjects:block:]` blocks deleted objects of the same type. -* Fix some edge-cases where `-[RLMMigration enumerateObjects:block:]` - enumerated the incorrect objects following deletions. -* Restore the pre-3.5.0 behavior for Swift optional properties missing an ivar - rather than crashing. - -3.5.0 Release notes (2018-04-25) -============================================================= - -### Enhancements - -* Add wrapper functions for email confirmation and password reset to `SyncUser`. - -### Bugfixes - -* Fix incorrect results when using optional chaining to access a RealmOptional - property in Release builds, or otherwise interacting with a RealmOptional - object after the owning Object has been deallocated. - -3.4.0 Release notes (2018-04-19) -============================================================= - -The prebuilt binary for Carthage is now built for Swift 4.1. - -### Enhancements - -* Expose `RLMSyncManager.authorizationHeaderName`/`SyncManager.authorizationHeaderName` - as a way to override the transport header for Realm Object Server authorization. -* Expose `RLMSyncManager.customRequestHeaders`/`SyncManager.customRequestHeaders` - which allows custom HTTP headers to be appended on requests to the Realm Object Server. -* Expose `RLMSSyncConfiguration.urlPrefix`/`SyncConfiguration.urlPrefix` as a mechanism - to replace the default path prefix in Realm Sync WebSocket requests. - -3.3.2 Release notes (2018-04-03) -============================================================= - -Add a prebuilt binary for Xcode 9.3. - -3.3.1 Release notes (2018-03-28) -============================================================= - -Realm Object Server v3.0.0 or newer is required when using synchronized Realms. - -### Enhancements - -* Expose `RLMObject.object(forPrimaryKey:)` as a factory method for Swift so - that it is callable with recent versions of Swift. - -### Bugfixes - -* Exclude the RLMObject-derived Permissions classes from the types repored by - `Realm.Configuration.defaultConfiguration.objectTypes` to avoid a failed - cast. -* Cancel pending `Realm.asyncOpen()` calls when authentication fails with a - non-transient error such as missing the Realm path in the URL. -* Fix "fcntl() inside prealloc()" errors on APFS. - -3.3.0 Release notes (2018-03-19) -============================================================= - -Realm Object Server v3.0.0 or newer is required when using synchronized Realms. - -### Enhancements - -* Add `Realm.permissions`, `Realm.permissions(forType:)`, and `Realm.permissions(forClassNamed:)` as convenience - methods for accessing the permissions of the Realm or a type. - -### Bugfixes - -* Fix `+[RLMClassPermission objectInRealm:forClass:]` to work for classes that are part of the permissions API, - such as `RLMPermissionRole`. -* Fix runtime errors when applications define an `Object` subclass with the - same name as one of the Permissions object types. - -3.2.0 Release notes (2018-03-15) -============================================================= - -Realm Object Server v3.0.0 or newer is required when using synchronized Realms. - -### Enhancements - -* Added an improved API for adding subscriptions in partially-synchronized Realms. `Results.subscribe()` can be - used to subscribe to any result set, and the returned `SyncSubscription` object can be used to observe the state - of the subscription and ultimately to remove the subscription. See the documentation for more information - (). -* Added a fine-grained permissions system for use with partially-synchronized Realms. This allows permissions to be - defined at the level of individual objects or classes. See the documentation for more information - (). -* Added `SyncConfiguration.automatic()` and `SyncConfiguration.automatic(user:)`. - These methods return a `Realm.Configuration` appropriate for syncing with the default - synced Realm for the current (or specified) user. These should be considered the preferred methods - for accessing synced Realms going forwards. -* Added `+[RLMSyncSession sessionForRealm:]` to retrieve the sync session corresponding to a `RLMRealm`. - -### Bugfixes - -* Fix incorrect initalization of `RLMSyncManager` that made it impossible to - set `errorHandler`. -* Fix compiler warnings when building with Xcode 9.3. -* Fix some warnings when running with UBsan. - -3.2.0-rc.1 Release notes (2018-03-14) -============================================================= - -Realm Object Server v3.0.0-rc.1 or newer is required when using synchronized Realms. - -### Enhancements - -* Added `SyncConfiguration.automatic()` and `SyncConfiguration.automatic(user:)`. - These methods return a `Realm.Configuration` appropriate for syncing with the default - synced Realm for the current (or specified). These should be considered the preferred methods - for accessing synced Realms going forwards. -* A role is now automatically created for each user with that user as its only member. - This simplifies the common use case of restricting access to specific objects to a single user. - This role can be accessed at `PermissionUser.role`. -* Improved error reporting when the server rejects a schema change due to a lack of permissions. - -### Bugfixes - -* Fix incorrect initalization of `RLMSyncManager` that made it impossible to - set `errorHandler`. -* Fix compiler warnings when building with Xcode 9.3. - -3.2.0-beta.3 Release notes (2018-03-01) -============================================================= - -Realm Object Server v3.0.0-alpha.9 or newer is required when using synchronized Realms. - -### Bugfixes - -* Fix a crash that would occur when using partial sync with Realm Object Server v3.0.0-alpha.9. - -3.2.0-beta.2 Release notes (2018-02-28) -============================================================= - -Realm Object Server v3.0.0-alpha.8 or newer is required when using synchronized Realms. - -### Enhancements - -* Added `findOrCreate(forRoleNamed:)` and `findOrCreate(forRole:)` to `List` - to simplify the process of adding permissions for a role. -* Added `+permissionForRoleNamed:inArray:`, `+permissionForRoleNamed:onRealm:`, - `+permissionForRoleNamed:onClass:realm:`, `+permissionForRoleNamed:onClassNamed:realm:`, - and `+permissionForRoleNamed:onObject:` to `RLMSyncPermission` to simplify the process - of adding permissions for a role. -* Added `+[RLMSyncSession sessionForRealm:]` to retrieve the sync session corresponding to a `RLMRealm`. - -### Bugfixes - -* `PermissionRole.users` and `PermissionUser.roles` are now public as intended. -* Fixed the handling of `setPermissions` in `-[RLMRealm privilegesForRealm]` and related methods. - -3.2.0-beta.1 Release notes (2018-02-19) -============================================================= - -### Enhancements - -* Added an improved API for adding subscriptions in partially-synchronized Realms. `Results.subscribe()` can be - used to subscribe to any result set, and the returned `SyncSubscription` object can be used to observe the state - of the subscription and ultimately to remove the subscription. -* Added a fine-grained permissions system for use with partially-synchronized Realms. This allows permissions to be - defined at the level of individual objects or classes. See `Permission` and related types for more information. - -### Bugfixes - -* Fix some warnings when running with UBsan. - -3.1.1 Release notes (2018-02-03) -============================================================= - -Prebuilt Swift frameworks for Carthage are now built with Xcode 9.2. - -### Bugfixes - -* Fix a memory leak when opening Realms with an explicit `objectTypes` array - from Swift. - -3.1.0 Release notes (2018-01-16) -============================================================= - -* Prebuilt frameworks are now included for Swift 3.2.3 and 4.0.3. -* Prebuilt frameworks are no longer included for Swift 3.0.x. -* Building from source with Xcode versions prior to Xcode 8.3 is no longer supported. - -### Enhancements - -* Add `Results.distinct(by:)` / `-[RLMResults distinctResultsUsingKeyPaths:]`, which return a `Results` - containing only objects with unique values at the given key paths. -* Improve performance of change checking for notifications in certain cases. -* Realm Object Server errors not explicitly recognized by the client are now reported to the application - regardless. -* Add support for JSON Web Token as a sync credential source. -* Add support for Nickname and Anonymous Auth as a sync credential source. -* Improve allocator performance when writing to a highly fragmented file. This - should significantly improve performance when inserting large numbers of - objects which have indexed properties. -* Improve write performance for complex object graphs involving many classes - linking to each other. - -### Bugfixes - -* Add a missing check for a run loop in the permission API methods which - require one. -* Fix some cases where non-fatal sync errors were being treated as fatal errors. - -3.0.2 Release notes (2017-11-08) -============================================================= - -Prebuilt frameworks are now included for Swift 3.2.2 and 4.0.2. - -### Bugfixes - -* Fix a crash when a linking objects property is retrieved from a model object instance via - Swift subscripting. -* Fix incorrect behavior if a call to `posix_fallocate` is interrupted. - -3.0.1 Release notes (2017-10-26) -============================================================= - -### Bugfixes - -* Explicitly exclude KVO-generated object subclasses from the schema. -* Fix regression where the type of a Realm model class is not properly determined, causing crashes - when a type value derived at runtime by `type(of:)` is passed into certain APIs. -* Fix a crash when an `Object` subclass has implicitly ignored `let` - properties. -* Fix several cases where adding a notification block from within a - notification callback could produce incorrect results. - -3.0.0 Release notes (2017-10-16) -============================================================= - -### Breaking Changes -* iOS 7 is no longer supported. -* Synchronized Realms require a server running Realm Object Server v2.0 or higher. -* Computed properties on Realm object types are detected and no - longer added to the automatically generated schema. -* The Objective-C and Swift `create(_:, value: update:)` APIs now - correctly nil out nullable properties when updating an existing - object when the `value` argument specifies nil or `NSNull` for - the property value. -* `-[RLMRealm addOrUpdateObjects:]` and `-[RLMRealm deleteObjects:]` now - require their argument to conform to `NSFastEnumeration`, to match similar - APIs that also take collections. -* The way interactive sync errors (client reset and permission denied) - are delivered to the user has been changed. Instead of a block which can - be invoked to immediately delete the offending Realm file, an opaque - token object of type `RLMSyncErrorActionToken` will be returned in the - error object's `userInfo` dictionary. This error object can be passed - into the new `+[RLMSyncSession immediatelyHandleError:]` API to delete - the files. -* The return types of the `SyncError.clientResetInfo()` and - `SyncError.deleteRealmUserInfo()` APIs have been changed. They now return - `RLMSyncErrorActionToken`s or `SyncError.ActionToken`s instead of closures. -* The class methods `Object.className()`, `Object.objectUtilClass()`, and - the property `Object.isInvalidated` can no longer be overriden. -* The callback which runs when a sync user login succeeds or fails - now runs on the main queue by default, or can be explicitly specified - by a new `callbackQueue` parameter on the `{RLM}SyncUser.logIn(...)` API. -* Fix empty strings, binary data, and null on the right side of `BEGINSWITH`, - `ENDSWITH` and `CONTAINS` operators in predicates to match Foundation's - semantics of never matching any strings or data. -* Swift `Object` comparison and hashing behavior now works the same way as - that of `RLMObject` (objects are now only considered equatable if their - model class defines a primary key). -* Fix the way the hash property works on `Object` when the object model has - no primary key. -* Fix an issue where if a Swift model class defined non-generic managed - properties after generic Realm properties (like `List`), the schema - would be constructed incorrectly. Fixes an issue where creating such - models from an array could fail. -* Loosen `RLMArray` and `RLMResults`'s generic constraint from `RLMObject` to - `NSObject`. This may result in having to add some casts to disambiguate - types. -* Remove `RLMSyncPermissionResults`. `RLMSyncPermission`s are now vended out - using a `RLMResults`. This results collection supports all normal collection - operations except for setting values using key-value coding (since - `RLMSyncPermission`s are immutable) and the property aggregation operations. -* `RLMSyncUserInfo` has been significantly enhanced. It now contains metadata - about a user stored on the Realm Object Server, as well as a list of all user account - data associated with that user. -* Starting with Swift 4, `List` now conforms to `MutableCollection` instead of - `RangeReplaceableCollection`. For Swift 4, the empty collection initializer has been - removed, and default implementations of range replaceable collection methods that - make sense for `List` have been added. -* `List.removeLast()` now throws an exception if the list is empty, to more closely match - the behavior of the standard library's `Collection.removeLast()` implementation. -* `RealmCollection`'s associated type `Element` has been renamed `ElementType`. -* The following APIs have been renamed: - -| Old API | New API | -|:------------------------------------------------------------|:---------------------------------------------------------------| -| `NotificationToken.stop()` | `NotificationToken.invalidate()` | -| `-[RLMNotificationToken stop]` | `-[RLMNotificationToken invalidate]` | -| `RealmCollection.addNotificationBlock(_:)` | `RealmCollection.observe(_:)` | -| `RLMSyncProgress` | `RLMSyncProgressMode` | -| `List.remove(objectAtIndex:)` | `List.remove(at:)` | -| `List.swap(_:_:)` | `List.swapAt(_:_:)` | -| `SyncPermissionValue` | `SyncPermission` | -| `RLMSyncPermissionValue` | `RLMSyncPermission` | -| `-[RLMSyncPermission initWithRealmPath:userID:accessLevel]` | `-[RLMSyncPermission initWithRealmPath:identity:accessLevel:]` | -| `RLMSyncPermission.userId` | `RLMSyncPermission.identity` | -| `-[RLMRealm addOrUpdateObjectsInArray:]` | `-[RLMRealm addOrUpdateObjects:]` | - -* The following APIs have been removed: - -| Removed API | Replacement | -|:-------------------------------------------------------------|:------------------------------------------------------------------------------------------| -| `Object.className` | None, was erroneously present. | -| `RLMPropertyTypeArray` | `RLMProperty.array` | -| `PropertyType.array` | `Property.array` | -| `-[RLMArray sortedResultsUsingProperty:ascending:]` | `-[RLMArray sortedResultsUsingKeyPath:ascending:]` | -| `-[RLMCollection sortedResultsUsingProperty:ascending:]` | `-[RLMCollection sortedResultsUsingKeyPath:ascending:]` | -| `-[RLMResults sortedResultsUsingProperty:ascending:]` | `-[RLMResults sortedResultsUsingKeyPath:ascending:]` | -| `+[RLMSortDescriptor sortDescriptorWithProperty:ascending:]` | `+[RLMSortDescriptor sortDescriptorWithKeyPath:ascending:]` | -| `RLMSortDescriptor.property` | `RLMSortDescriptor.keyPath` | -| `AnyRealmCollection.sorted(byProperty:ascending:)` | `AnyRealmCollection.sorted(byKeyPath:ascending:)` | -| `List.sorted(byProperty:ascending:)` | `List.sorted(byKeyPath:ascending:)` | -| `LinkingObjects.sorted(byProperty:ascending:)` | `LinkingObjects.sorted(byKeyPath:ascending:)` | -| `Results.sorted(byProperty:ascending:)` | `Results.sorted(byKeyPath:ascending:)` | -| `SortDescriptor.init(property:ascending:)` | `SortDescriptor.init(keyPath:ascending:)` | -| `SortDescriptor.property` | `SortDescriptor.keyPath` | -| `+[RLMRealm migrateRealm:configuration:]` | `+[RLMRealm performMigrationForConfiguration:error:]` | -| `RLMSyncManager.disableSSLValidation` | `RLMSyncConfiguration.enableSSLValidation` | -| `SyncManager.disableSSLValidation` | `SyncConfiguration.enableSSLValidation` | -| `RLMSyncErrorBadResponse` | `RLMSyncAuthErrorBadResponse` | -| `RLMSyncPermissionResults` | `RLMResults` | -| `SyncPermissionResults` | `Results` | -| `RLMSyncPermissionChange` | `-[RLMSyncUser applyPermission:callback]` / `-[RLMSyncUser deletePermission:callback:]` | -| `-[RLMSyncUser permissionRealmWithError:]` | `-[RLMSyncUser retrievePermissionsWithCallback:]` | -| `RLMSyncPermissionOffer` | `-[RLMSyncUser createOfferForRealmAtURL:accessLevel:expiration:callback:]` | -| `RLMSyncPermissionOfferResponse` | `-[RLMSyncUser acceptOfferForToken:callback:]` | -| `-[NSError rlmSync_clientResetBlock]` | `-[NSError rlmSync_errorActionToken]` / `-[NSError rlmSync_clientResetBackedUpRealmPath]` | -| `-[NSError rlmSync_deleteRealmBlock]` | `-[NSError rlmSync_errorActionToken]` | - -### Enhancements -* `List` can now contain values of types `Bool`, `Int`, `Int8`, `Int16`, - `Int32`, `Int64`, `Float`, `Double`, `String`, `Data`, and `Date` (and - optional versions of all of these) in addition to `Object` subclasses. - Querying `List`s containing values other than `Object` subclasses is not yet - implemented. -* `RLMArray` can now be constrained with the protocols `RLMBool`, `RLMInt`, - `RLMFloat`, `RLMDouble`, `RLMString`, `RLMData`, and `RLMDate` in addition to - protocols defined with `RLM_ARRAY_TYPE`. By default `RLMArray`s of - non-`RLMObject` types can contain null. Indicating that the property is - required (by overriding `+requiredProperties:`) will instead make the values - within the array required. Querying `RLMArray`s containing values other than - `RLMObject` subclasses is not yet implemented. -* Add a new error code to denote 'permission denied' errors when working - with synchronized Realms, as well as an accompanying block that can be - called to inform the binding that the offending Realm's files should be - deleted immediately. This allows recovering from 'permission denied' - errors in a more robust manner. See the documentation for - `RLMSyncErrorPermissionDeniedError` for more information. -* Add Swift `Object.isSameObject(as:_)` API to perform the same function as - the existing Objective-C API `-[RLMObject isEqualToObject:]`. -* Opening a synced Realm whose local copy was created with an older version of - Realm Mobile Platfrom when a migration is not possible to the current version - will result in an `RLMErrorIncompatibleSyncedFile` / `incompatibleSyncedFile` - error. When such an error occurs, the original file is moved to a backup - location, and future attempts to open the synchronized Realm will result in a new - file being created. If you wish to migrate any data from the backup Realm you can - open it using the backup Realm configuration available on the error object. -* Add a preview of partial synchronization. Partial synchronization allows a - synchronized Realm to be opened in such a way that only objects requested by - the user are synchronized to the device. You can use it by setting the - `isPartial` property on a `SyncConfiguration`, opening the Realm, and then - calling `Realm.subscribe(to:where:callback:)` with the type of object you're - interested in, a string containing a query determining which objects you want - to subscribe to, and a callback which will report the results. You may add as - many subscriptions to a synced Realm as necessary. - -### Bugfixes -* Realm no longer throws an "unsupported instruction" exception in some cases - when opening a synced Realm asynchronously. -* Realm Swift APIs that filter or look up the index of an object based on a - format string now properly handle optional arguments in their variadic argument - list. -* `-[RLMResults indexOfObject:]` now properly accounts for access - level. -* Fix a race condition that could lead to a crash accessing to the freed configuration object - if a default configuration was set from a different thread. -* Fixed an issue that crash when enumerating after clearing data during migration. -* Fix a bug where a synced Realm couldn't be reopened even after a successful client reset - in some cases. -* Fix a bug where the sync subsystem waited too long in certain cases to reconnect to the server. -* Fix a bug where encrypted sync-related metadata was incorrectly deleted from upgrading users, - resulting in all users being logged out. -* Fix a bug where permission-related data continued to be synced to a client even after the user - that data belonged to logged out. -* Fix an issue where collection notifications might be delivered inconsistently if a notification - callback was added within another callback for the same collection. - -3.0.0-rc.2 Release notes (2017-10-14) -============================================================= - -### Enhancements -* Reinstate `RLMSyncPermissionSortPropertyUserID` to allow users to sort permissions - to their own Realms they've granted to others. - -### Bugfixes -* `-[RLMResults indexOfObject:]` now properly accounts for access - level. -* Fix a race condition that could lead to a crash accessing to the freed configuration object - if a default configuration was set from a different thread. -* Fixed an issue that crash when enumerating after clearing data during migration. -* Fix a bug where a synced Realm couldn't be reopened even after a successful client reset - in some cases. -* Fix a bug where the sync subsystem waited too long in certain cases to reconnect to the server. -* Fix a bug where encrypted sync-related metadata was incorrectly deleted from upgrading users, - resulting in all users being logged out. -* Fix a bug where permission-related data continued to be synced to a client even after the user - that data belonged to logged out. -* Fix an issue where collection notifications might be delivered inconsistently if a notification - callback was added within another callback for the same collection. - -3.0.0-rc.1 Release notes (2017-10-03) -============================================================= - -### Breaking Changes -* Remove `RLMSyncPermissionSortPropertyUserID` to reflect changes in how the - Realm Object Server reports permissions for a user. -* Remove `RLMSyncPermissionOffer` and `RLMSyncPermissionOfferResponse` classes - and associated helper methods and functions. Use the - `-[RLMSyncUser createOfferForRealmAtURL:accessLevel:expiration:callback:]` - and `-[RLMSyncUser acceptOfferForToken:callback:]` methods instead. - -### Bugfixes - -* The keychain item name used by Realm to manage the encryption keys for - sync-related metadata is now set to a per-app name based on the bundle - identifier. Keys that were previously stored within the single, shared Realm - keychain item will be transparently migrated to the per-application keychain - item. -* Fix downloading of the Realm core binaries when Xcode's command-line tools are - set as the active developer directory for command-line interactions. -* Fix a crash that could occur when resolving a ThreadSafeReference to a `List` - whose parent object had since been deleted. - -3.0.0-beta.4 Release notes (2017-09-22) -============================================================= - -### Breaking Changes - -* Rename `List.remove(objectAtIndex:)` to `List.remove(at:)` to match the name - used by 'RangeReplaceableCollection'. -* Rename `List.swap()` to `List.swapAt()` to match the name used by 'Array'. -* Loosen `RLMArray` and `RLMResults`'s generic constraint from `RLMObject` to - `NSObject`. This may result in having to add some casts to disambiguate - types. -* Remove `RLMPropertyTypeArray` in favor of a separate bool `array` property on - `RLMProperty`/`Property`. -* Remove `RLMSyncPermissionResults`. `RLMSyncPermission`s are now vended out - using a `RLMResults`. This results collection supports all normal collection - operations except for setting values using KVO (since `RLMSyncPermission`s are - immutable) and the property aggregation operations. -* `RealmCollection`'s associated type `Element` has been renamed `ElementType`. -* Realm Swift collection types (`List`, `Results`, `AnyRealmCollection`, and - `LinkingObjects` have had their generic type parameter changed from `T` to - `Element`). -* `RealmOptional`'s generic type parameter has been changed from `T` to `Value`. -* `RLMSyncUserInfo` has been significantly enhanced. It now contains metadata - about a user stored on the Realm Object Server, as well as a list of all user account - data associated with that user. -* Starting with Swift 4, `List` now conforms to `MutableCollection` instead of - `RangeReplaceableCollection`. For Swift 4, the empty collection initializer has been - removed, and default implementations of range replaceable collection methods that - make sense for `List` have been added. -* `List.removeLast()` now throws an exception if the list is empty, to more closely match - the behavior of the standard library's `Collection.removeLast()` implementation. - -### Enhancements - -* `List` can now contain values of types `Bool`, `Int`, `Int8`, `Int16`, - `Int32`, `Int64`, `Float`, `Double`, `String`, `Data`, and `Date` (and - optional versions of all of these) in addition to `Object` subclasses. - Querying `List`s containing values other than `Object` subclasses is not yet - implemented. -* `RLMArray` can now be constrained with the protocols `RLMBool`, `RLMInt`, - `RLMFloat`, `RLMDouble`, `RLMString`, `RLMData`, and `RLMDate` in addition to - protocols defined with `RLM_ARRAY_TYPE`. By default `RLMArray`s of - non-`RLMObject` types can contain null. Indicating that the property is - required (by overriding `+requiredProperties:`) will instead make the values - within the array required. Querying `RLMArray`s containing values other than - `RLMObject` subclasses is not yet implemented. -* Opening a synced Realm whose local copy was created with an older version of - Realm Mobile Platfrom when a migration is not possible to the current version - will result in an `RLMErrorIncompatibleSyncedFile` / `incompatibleSyncedFile` - error. When such an error occurs, the original file is moved to a backup - location, and future attempts to open the synchronized Realm will result in a new - file being created. If you wish to migrate any data from the backup Realm you can - open it using the backup Realm configuration available on the error object. -* Add preview support for partial synchronization. Partial synchronization is - allows a synchronized Realm to be opened in such a way that only objects - requested by the user are synchronized to the device. You can use it by setting - the `isPartial` property on a `SyncConfiguration`, opening the Realm, and then - calling `Realm.subscribe(to:where:callback:)` with the type of object you're - interested in, a string containing a query determining which objects you want - to subscribe to, and a callback which will report the results. You may add as - many subscriptions to a synced Realm as necessary. - -### Bugfixes - -* Realm Swift APIs that filter or look up the index of an object based on a - format string now properly handle optional arguments in their variadic argument - list. - -3.0.0-beta.3 Release notes (2017-08-23) -============================================================= - -### Breaking Changes - -* iOS 7 is no longer supported. -* Computed properties on Realm object types are detected and no - longer added to the automatically generated schema. -* `-[RLMRealm addOrUpdateObjectsInArray:]` has been renamed to - `-[RLMRealm addOrUpdateObjects:]` for consistency with similar methods - that add or delete objects. -* `-[RLMRealm addOrUpdateObjects:]` and `-[RLMRealm deleteObjects:]` now - require their argument to conform to `NSFastEnumeration`, to match similar - APIs that also take collections. -* Remove deprecated `{RLM}SyncPermission` and `{RLM}SyncPermissionChange` - classes. -* `{RLM}SyncPermissionValue` has been renamed to just `{RLM}SyncPermission`. - Its `userId` property has been renamed `identity`, and its - `-initWithRealmPath:userID:accessLevel:` initializer has been renamed - `-initWithRealmPath:identity:accessLevel:`. -* Remove deprecated `-[RLMSyncUser permissionRealmWithError:]` and - `SyncUser.permissionRealm()` APIs. Use the new permissions system. -* Remove deprecated error `RLMSyncErrorBadResponse`. Use - `RLMSyncAuthErrorBadResponse` instead. -* The way interactive sync errors (client reset and permission denied) - are delivered to the user has been changed. Instead of a block which can - be invoked to immediately delete the offending Realm file, an opaque - token object of type `RLMSyncErrorActionToken` will be returned in the - error object's `userInfo` dictionary. This error object can be passed - into the new `+[RLMSyncSession immediatelyHandleError:]` API to delete - the files. -* Remove `-[NSError rlmSync_clientResetBlock]` and - `-[NSError rlmSync_deleteRealmBlock]` APIs. -* The return types of the `SyncError.clientResetInfo()` and - `SyncError.deleteRealmUserInfo()` APIs have been changed. They now return - `RLMSyncErrorActionToken`s or `SyncError.ActionToken`s instead of closures. -* The (erroneously added) instance property `Object.className` has been - removed. -* The class methods `Object.className()`, `Object.objectUtilClass()`, and - the property `Object.isInvalidated` can no longer be overriden. -* The callback which runs when a sync user login succeeds or fails - now runs on the main queue by default, or can be explicitly specified - by a new `callbackQueue` parameter on the `{RLM}SyncUser.logIn(...)` API. -* Rename `{RLM}NotificationToken.stop()` to `invalidate()` and - `{RealmCollection,SyncPermissionResults}.addNotificationBlock(_:)` to - `observe(_:)` to mirror Foundation's new KVO APIs. -* The `RLMSyncProgress` enum has been renamed `RLMSyncProgressMode`. -* Remove deprecated `{RLM}SyncManager.disableSSLValidation` property. Disable - SSL validation on a per-Realm basis by setting the `enableSSLValidation` - property on `{RLM}SyncConfiguration` instead. -* Fix empty strings, binary data, and null on the right side of `BEGINSWITH`, - `ENDSWITH` and `CONTAINS` operators in predicates to match Foundation's - semantics of never matching any strings or data. -* Swift `Object` comparison and hashing behavior now works the same way as - that of `RLMObject` (objects are now only considered equatable if their - model class defines a primary key). -* Fix the way the hash property works on `Object` when the object model has - no primary key. -* Fix an issue where if a Swift model class defined non-generic managed - properties after generic Realm properties (like `List`), the schema - would be constructed incorrectly. Fixes an issue where creating such - models from an array could fail. - -### Enhancements - -* Add Swift `Object.isSameObject(as:_)` API to perform the same function as - the existing Objective-C API `-[RLMObject isEqualToObject:]`. -* Expose additional authentication-related errors that might be reported by - a Realm Object Server. -* An error handler can now be registered on `{RLM}SyncUser`s in order to - report authentication-related errors that affect the user. - -### Bugfixes - -* Sync users are now automatically logged out upon receiving certain types - of errors that indicate they are no longer logged into the server. For - example, users who are authenticated using third-party credentials will find - themselves logged out of the Realm Object Server if the third-party identity - service indicates that their credential is no longer valid. -* Address high CPU usage and hangs in certain cases when processing collection - notifications in highly-connected object graphs. - -3.0.0-beta.2 Release notes (2017-07-26) -============================================================= - -### Breaking Changes - -* Remove the following deprecated Objective-C APIs: - `-[RLMArray sortedResultsUsingProperty:ascending:]`, - `-[RLMCollection sortedResultsUsingProperty:ascending:]`, - `-[RLMResults sortedResultsUsingProperty:ascending:]`, - `+[RLMSortDescriptor sortDescriptorWithProperty:ascending:]`, - `RLMSortDescriptor.property`. - These APIs have been superseded by equivalent APIs that take - or return key paths instead of property names. -* Remove the following deprecated Objective-C API: - `+[RLMRealm migrateRealm:configuration:]`. - Please use `+[RLMRealm performMigrationForConfiguration:error:]` instead. -* Remove the following deprecated Swift APIs: - `AnyRealmCollection.sorted(byProperty:, ascending:)`, - `LinkingObjects.sorted(byProperty:, ascending:)`, - `List.sorted(byProperty:, ascending:)`, - `Results.sorted(byProperty:, ascending:)`, - `SortDescriptor.init(property:, ascending:)`, - `SortDescriptor.property`. - These APIs have been superseded by equivalent APIs that take - or return key paths instead of property names. -* The Objective-C and Swift `create(_:, value: update:)` APIs now - correctly nil out nullable properties when updating an existing - object when the `value` argument specifies nil or `NSNull` for - the property value. - -### Enhancements - -* It is now possible to create and log in multiple Realm Object Server users - with the same identity if they originate from different servers. Note that - if the URLs are different aliases for the same authentication server each - user will still be treated as separate (e.g. they will have their own copy - of each synchronized Realm opened using them). It is highly encouraged that - users defined using the access token credential type be logged in with an - authentication server URL specified; this parameter will become mandatory - in a future version of the SDK. -* Add `-[RLMSyncUser retrieveInfoForUser:identityProvider:completion:]` - API allowing administrator users to retrieve information about a user based - on their provider identity (for example, a username). Requires any edition - of the Realm Object Server 1.8.2 or later. - -### Bugfixes - -* Realm no longer throws an "unsupported instruction" exception in some cases - when opening a synced Realm asynchronously. - -3.0.0-beta Release notes (2017-07-14) -============================================================= - -### Breaking Changes - -* Synchronized Realms require a server running Realm Object Server v2.0 or higher. - -### Enhancements - -* Add a new error code to denote 'permission denied' errors when working - with synchronized Realms, as well as an accompanying block that can be - called to inform the binding that the offending Realm's files should be - deleted immediately. This allows recovering from 'permission denied' - errors in a more robust manner. See the documentation for - `RLMSyncErrorPermissionDeniedError` for more information. -* Add `-[RLMSyncPermissionValue initWithRealmPath:username:accessLevel:]` - API allowing permissions to be applied to a user based on their username - (usually, an email address). Requires any edition of the Realm Object - Server 1.6.0 or later. -* Improve performance of creating Swift objects which contain at least one List - property. - -### Bugfixes - -* `List.description` now reports the correct types for nested lists. -* Fix unmanaged object initialization when a nested property type returned - `false` from `Object.shouldIncludeInDefaultSchema()`. -* Don't clear RLMArrays on self-assignment. - -2.10.2 Release notes (2017-09-27) -============================================================= - -### Bugfixes - -* The keychain item name used by Realm to manage the encryption keys for - sync-related metadata is now set to a per-app name based on the bundle - identifier. Keys that were previously stored within the single, shared Realm - keychain item will be transparently migrated to the per-application keychain - item. -* Fix downloading of the Realm core binaries when Xcode's command-line tools are - set as the active developer directory for command-line interactions. -* Fix a crash that could occur when resolving a ThreadSafeReference to a `List` - whose parent object had since been deleted. - -2.10.1 Release notes (2017-09-14) -============================================================= - -Swift binaries are now produced for Swift 3.0, 3.0.1, 3.0.2, 3.1, 3.2 and 4.0. - -### Enhancements - -* Auxiliary files are excluded from backup by default. - -### Bugfixes - -* Fix more cases where assigning an RLMArray property to itself would clear the - RLMArray. - -2.10.0 Release notes (2017-08-21) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Expose additional authentication-related errors that might be reported by - a Realm Object Server. -* An error handler can now be registered on `{RLM}SyncUser`s in order to - report authentication-related errors that affect the user. - -### Bugfixes - -* Sorting Realm collection types no longer throws an exception on iOS 7. -* Sync users are now automatically logged out upon receiving certain types - of errors that indicate they are no longer logged into the server. For - example, users who are authenticated using third-party credentials will find - themselves logged out of the Realm Object Server if the third-party identity - service indicates that their credential is no longer valid. -* Address high CPU usage and hangs in certain cases when processing collection - notifications in highly-connected object graphs. - -2.9.1 Release notes (2017-08-01) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* The `shouldCompactOnLaunch` block is no longer invoked if the Realm at that - path is already open on other threads. -* Fix an assertion failure in collection notifications when changes are made to - the schema via sync while the notification block is active. - -2.9.0 Release notes (2017-07-26) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Add a new error code to denote 'permission denied' errors when working - with synchronized Realms, as well as an accompanying block that can be - called to inform the binding that the offending Realm's files should be - deleted immediately. This allows recovering from 'permission denied' - errors in a more robust manner. See the documentation for - `RLMSyncErrorPermissionDeniedError` for more information. -* Add `-[RLMSyncPermissionValue initWithRealmPath:username:accessLevel:]` - API allowing permissions to be applied to a user based on their username - (usually, an email address). Requires any edition of the Realm Object - Server 1.6.0 or later. -* Improve performance of creating Swift objects which contain at least one List - property. -* It is now possible to create and log in multiple Realm Object Server users - with the same identity if they originate from different servers. Note that - if the URLs are different aliases for the same authentication server each - user will still be treated as separate (e.g. they will have their own copy - of each synchronized Realm opened using them). It is highly encouraged that - users defined using the access token credential type be logged in with an - authentication server URL specified; this parameter will become mandatory - in a future version of the SDK. -* Add `-[RLMSyncUser retrieveInfoForUser:identityProvider:completion:]` - API allowing administrator users to retrieve information about a user based - on their provider identity (for example, a username). Requires any edition - of the Realm Object Server 1.8.2 or later. - -### Bugfixes - -* `List.description` now reports the correct types for nested lists. -* Fix unmanaged object initialization when a nested property type returned - `false` from `Object.shouldIncludeInDefaultSchema()`. -* Don't clear RLMArrays on self-assignment. - -2.8.3 Release notes (2017-06-20) -============================================================= - -### Bugfixes - -* Properly update RealmOptional properties when adding an object with `add(update: true)`. -* Add some missing quotes in error messages. -* Fix a performance regression when creating objects with primary keys. - -2.8.2 Release notes (2017-06-16) -============================================================= - -### Bugfixes - -* Fix an issue where synchronized Realms would eventually disconnect from the - remote server if the user object used to define their sync configuration - was destroyed. -* Restore support for changing primary keys in migrations (broken in 2.8.0). -* Revert handling of adding objects with nil properties to a Realm to the - pre-2.8.0 behavior. - -2.8.1 Release notes (2017-06-12) -============================================================= - -Add support for building with Xcode 9 Beta 1. - -### Bugfixes - -* Fix setting a float property to NaN. -* Fix a crash when using compact on launch in combination with collection - notifications. - -2.8.0 Release notes (2017-06-02) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Enable encryption on watchOS. -* Add `-[RLMSyncUser changePassword:forUserID:completion:]` API to change an - arbitrary user's password if the current user has administrative privileges - and using Realm's 'password' authentication provider. - Requires any edition of the Realm Object Server 1.6.0 or later. - -### Bugfixes - -* Suppress `-Wdocumentation` warnings in Realm C++ headers when using CocoaPods - with Xcode 8.3.2. -* Throw an appropriate error rather than crashing when an RLMArray is assigned - to an RLMArray property of a different type. -* Fix crash in large (>4GB) encrypted Realm files. -* Improve accuracy of sync progress notifications. -* Fix an issue where synchronized Realms did not connect to the remote server - in certain situations, such as when an application was offline when the Realms - were opened but later regained network connectivity. - -2.7.0 Release notes (2017-05-03) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Use reachability API to minimize the reconnection delay if the network - connection was lost. -* Add `-[RLMSyncUser changePassword:completion:]` API to change the current - user's password if using Realm's 'password' authentication provider. - Requires any edition of the Realm Object Server 1.4.0 or later. -* `{RLM}SyncConfiguration` now has an `enableSSLValidation` property - (and default parameter in the Swift initializer) to allow SSL validation - to be specified on a per-server basis. -* Transactions between a synced Realm and a Realm Object Server can now - exceed 16 MB in size. -* Add new APIs for changing and retrieving permissions for synchronized Realms. - These APIs are intended to replace the existing Realm Object-based permissions - system. Requires any edition of the Realm Object Server 1.1.0 or later. - -### Bugfixes - -* Support Realm model classes defined in Swift with overridden Objective-C - names (e.g. `@objc(Foo) class SwiftFoo: Object {}`). -* Fix `-[RLMMigration enumerateObjects:block:]` returning incorrect `oldObject` - objects when enumerating a class name after previously deleting a `newObject`. -* Fix an issue where `Realm.asyncOpen(...)` would fail to work when opening a - synchronized Realm for which the user only had read permissions. -* Using KVC to set a `List` property to `nil` now clears it to match the - behavior of `RLMArray` properties. -* Fix crash from `!m_awaiting_pong` assertion failure when using synced Realms. -* Fix poor performance or hangs when performing case-insensitive queries on - indexed string properties that contain many characters that don't differ - between upper and lower case (e.g., numbers, punctuation). - -2.6.2 Release notes (2017-04-21) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix an issue where calling `Realm.asyncOpen(...)` with a synchronized Realm - configuration would fail with an "Operation canceled" error. -* Fix initial collection notification sometimes not being delivered for synced - Realms. -* Fix circular links sometimes resulting in objects not being marked as - modified in change notifications. - -2.6.1 Release notes (2017-04-18) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix an issue where calling `Realm.asyncOpen(...)` with a synchronized Realm - configuration would crash in error cases rather than report the error. - This is a small source breaking change if you were relying on the error - being reported to be a `Realm.Error`. - -2.6.0 Release notes (2017-04-18) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Add a `{RLM}SyncUser.isAdmin` property indicating whether a user is a Realm - Object Server administrator. -* Add an API to asynchronously open a Realm and deliver it to a block on a - given queue. This performs all work needed to get the Realm to - a usable state (such as running potentially time-consuming migrations) on a - background thread before dispatching to the given queue. In addition, - synchronized Realms wait for all remote content available at the time the - operation began to be downloaded and available locally. -* Add `shouldCompactOnLaunch` block property when configuring a Realm to - determine if it should be compacted before being returned. -* Speed up case-insensitive queries on indexed string properties. -* Add RLMResults's collection aggregate methods to RLMArray. -* Add support for calling the aggregate methods on unmanaged Lists. - -### Bugfixes - -* Fix a deadlock when multiple processes open a Realm at the same time. -* Fix `value(forKey:)`/`value(forKeyPath:)` returning incorrect values for `List` properties. - -2.5.1 Release notes (2017-04-05) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix CocoaPods installation with static libraries and multiple platforms. -* Fix uncaught "Bad version number" exceptions on the notification worker thread - followed by deadlocks when Realms refresh. - -2.5.0 Release notes (2017-03-28) -============================================================= - -Files written by Realm this version cannot be read by earlier versions of Realm. -Old files can still be opened and files open in read-only mode will not be -modified. - -If using synchronized Realms, the Realm Object Server must be running version -1.3.0 or later. - -Swift binaries are now produced for Swift 3.0, 3.0.1, 3.0.2 and 3.1. - -### API Breaking Changes - -* None. - -### Enhancements - -* Add support for multi-level object equality comparisons against `NULL`. -* Add support for the `[d]` modifier on string comparison operators to perform - diacritic-insensitive comparisons. -* Explicitly mark `[[RLMRealm alloc] init]` as unavailable. -* Include the name of the problematic class in the error message when an - invalid property type is marked as the primary key. - -### Bugfixes - -* Fix incorrect column type assertions which could occur after schemas were - merged by sync. -* Eliminate an empty write transaction when opening a synced Realm. -* Support encrypting synchronized Realms by respecting the `encryptionKey` value - of the Realm's configuration. -* Fix crash when setting an `{NS}Data` property close to 16MB. -* Fix for reading `{NS}Data` properties incorrectly returning `nil`. -* Reduce file size growth in cases where Realm versions were pinned while - starting write transactions. -* Fix an assertion failure when writing to large `RLMArray`/`List` properties. -* Fix uncaught `BadTransactLog` exceptions when pulling invalid changesets from - synchronized Realms. -* Fix an assertion failure when an observed `RLMArray`/`List` is deleted after - being modified. - -2.4.4 Release notes (2017-03-13) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Add `(RLM)SyncPermission` class to allow reviewing access permissions for - Realms. Requires any edition of the Realm Object Server 1.1.0 or later. -* Further reduce the number of files opened per thread-specific Realm on macOS, - iOS and watchOS. - -### Bugfixes - -* Fix a crash that could occur if new Realm instances were created while the - application was exiting. -* Fix a bug that could lead to bad version number errors when delivering - change notifications. -* Fix a potential use-after-free bug when checking validity of results. -* Fix an issue where a sync session might not close properly if it receives - an error while being torn down. -* Fix some issues where a sync session might not reconnect to the server properly - or get into an inconsistent state if revived after invalidation. -* Fix an issue where notifications might not fire when the children of an - observed object are changed. -* Fix an issue where progress notifications on sync sessions might incorrectly - report out-of-date values. -* Fix an issue where multiple threads accessing encrypted data could result in - corrupted data or crashes. -* Fix an issue where certain `LIKE` queries could hang. -* Fix an issue where `-[RLMRealm writeCopyToURL:encryptionKey:error]` could create - a corrupt Realm file. -* Fix an issue where incrementing a synced Realm's schema version without actually - changing the schema could cause a crash. - -2.4.3 Release notes (2017-02-20) -============================================================= - -### API Breaking Changes - -* None. - -### Enhancements - -* Avoid copying copy-on-write data structures, which can grow the file, when the - write does not actually change existing values. -* Improve performance of deleting all objects in an RLMResults. -* Reduce the number of files opened per thread-specific Realm on macOS. -* Improve startup performance with large numbers of `RLMObject`/`Object` - subclasses. - -### Bugfixes - -* Fix synchronized Realms not downloading remote changes when an access token - expires and there are no local changes to upload. -* Fix an issue where values set on a Realm object using `setValue(value:, forKey:)` - that were not themselves Realm objects were not properly converted into Realm - objects or checked for validity. -* Fix an issue where `-[RLMSyncUser sessionForURL:]` could erroneously return a - non-nil value when passed in an invalid URL. -* `SyncSession.Progress.fractionTransferred` now returns 1 if there are no - transferrable bytes. -* Fix sync progress notifications registered on background threads by always - dispatching on a dedicated background queue. -* Fix compilation issues with Xcode 8.3 beta 2. -* Fix incorrect sync progress notification values for Realms originally created - using a version of Realm prior to 2.3.0. -* Fix LLDB integration to be able to display summaries of `RLMResults` once more. -* Reject Swift properties with names which cause them to fall in to ARC method - families rather than crashing when they are accessed. -* Fix sorting by key path when the declared property order doesn't match the order - of properties in the Realm file, which can happen when properties are added in - different schema versions. - -2.4.2 Release notes (2017-01-30) -============================================================= - -### Bugfixes - -* Fix an issue where RLMRealm instances could end up in the autorelease pool - for other threads. - -2.4.1 Release notes (2017-01-27) -============================================================= - -### Bugfixes - -* Fix an issue where authentication tokens were not properly refreshed - automatically before expiring. - -2.4.0 Release notes (2017-01-26) -============================================================= - -This release drops support for compiling with Swift 2.x. -Swift 3.0.0 is now the minimum Swift version supported. - -### API Breaking Changes - -* None. - -### Enhancements - -* Add change notifications for individual objects with an API similar to that - of collection notifications. - -### Bugfixes - -* Fix Realm Objective-C compilation errors with Xcode 8.3 beta 1. -* Fix several error handling issues when renewing expired authentication - tokens for synchronized Realms. -* Fix a race condition leading to bad_version exceptions being thrown in - Realm's background worker thread. - -2.3.0 Release notes (2017-01-19) -============================================================= - -### Sync Breaking Changes - -* Make `PermissionChange`'s `id` property a primary key. - -### API Breaking Changes - -* None. - -### Enhancements - -* Add `SyncPermissionOffer` and `SyncPermissionOfferResponse` classes to allow - creating and accepting permission change events to synchronized Realms between - different users. -* Support monitoring sync transfer progress by registering notification blocks - on `SyncSession`. Specify the transfer direction (`.upload`/`.download`) and - mode (`.reportIndefinitely`/`.forCurrentlyOutstandingWork`) to monitor. - -### Bugfixes - -* Fix a call to `commitWrite(withoutNotifying:)` committing a transaction that - would not have triggered a notification incorrectly skipping the next - notification. -* Fix incorrect results and crashes when conflicting object insertions are - merged by the synchronization mechanism when there is a collection - notification registered for that object type. - -2.2.0 Release notes (2017-01-12) -============================================================= - -### Sync Breaking Changes (In Beta) - -* Sync-related error reporting behavior has been changed. Errors not related - to a particular user or session are only reported if they are classed as - 'fatal' by the underlying sync engine. -* Added `RLMSyncErrorClientResetError` to `RLMSyncError` enum. - -### API Breaking Changes - -* The following Objective-C APIs have been deprecated in favor of newer or preferred versions: - -| Deprecated API | New API | -|:------------------------------------------------------------|:------------------------------------------------------------| -| `-[RLMArray sortedResultsUsingProperty:]` | `-[RLMArray sortedResultsUsingKeyPath:]` | -| `-[RLMCollection sortedResultsUsingProperty:]` | `-[RLMCollection sortedResultsUsingKeyPath:]` | -| `-[RLMResults sortedResultsUsingProperty:]` | `-[RLMResults sortedResultsUsingKeyPath:]` | -| `+[RLMSortDescriptor sortDescriptorWithProperty:ascending]` | `+[RLMSortDescriptor sortDescriptorWithKeyPath:ascending:]` | -| `RLMSortDescriptor.property` | `RLMSortDescriptor.keyPath` | - -* The following Swift APIs have been deprecated in favor of newer or preferred versions: - -| Deprecated API | New API | -|:------------------------------------------------------|:-------------------------------------------------| -| `LinkingObjects.sorted(byProperty:ascending:)` | `LinkingObjects.sorted(byKeyPath:ascending:)` | -| `List.sorted(byProperty:ascending:)` | `List.sorted(byKeyPath:ascending:)` | -| `RealmCollection.sorted(byProperty:ascending:)` | `RealmCollection.sorted(byKeyPath:ascending:)` | -| `Results.sorted(byProperty:ascending:)` | `Results.sorted(byKeyPath:ascending:)` | -| `SortDescriptor(property:ascending:)` | `SortDescriptor(keyPath:ascending:)` | -| `SortDescriptor.property` | `SortDescriptor.keyPath` | - -### Enhancements - -* Introduce APIs for safely passing objects between threads. Create a - thread-safe reference to a thread-confined object by passing it to the - `+[RLMThreadSafeReference referenceWithThreadConfined:]`/`ThreadSafeReference(to:)` - constructor, which you can then safely pass to another thread to resolve in - the new Realm with `-[RLMRealm resolveThreadSafeReference:]`/`Realm.resolve(_:)`. -* Realm collections can now be sorted by properties over to-one relationships. -* Optimized `CONTAINS` queries to use Boyer-Moore algorithm - (around 10x speedup on large datasets). - -### Bugfixes - -* Setting `deleteRealmIfMigrationNeeded` now also deletes the Realm if a file - format migration is required, such as when moving from a file last accessed - with Realm 0.x to 1.x, or 1.x to 2.x. -* Fix queries containing nested `SUBQUERY` expressions. -* Fix spurious incorrect thread exceptions when a thread id happens to be - reused while an RLMRealm instance from the old thread still exists. -* Fixed various bugs in aggregate methods (max, min, avg, sum). - -2.1.2 Release notes (2016--12-19) -============================================================= - -This release adds binary versions of Swift 3.0.2 frameworks built with Xcode 8.2. - -### Sync Breaking Changes (In Beta) - -* Rename occurences of "iCloud" with "CloudKit" in APIs and comments to match - naming in the Realm Object Server. - -### API Breaking Changes - -* None. - -### Enhancements - -* Add support for 'LIKE' queries (wildcard matching). - -### Bugfixes - -* Fix authenticating with CloudKit. -* Fix linker warning about "Direct access to global weak symbol". - -2.1.1 Release notes (2016-12-02) -============================================================= - -### Enhancements - -* Add `RealmSwift.ObjectiveCSupport.convert(object:)` methods to help write - code that interoperates between Realm Objective-C and Realm Swift APIs. -* Throw exceptions when opening a Realm with an incorrect configuration, like: - * `readOnly` set with a sync configuration. - * `readOnly` set with a migration block. - * migration block set with a sync configuration. -* Greatly improve performance of write transactions which make a large number of - changes to indexed properties, including the automatic migration when opening - files written by Realm 1.x. - -### Bugfixes - -* Reset sync metadata Realm in case of decryption error. -* Fix issue preventing using synchronized Realms in Xcode Playgrounds. -* Fix assertion failure when migrating a model property from object type to - `RLMLinkingObjects` type. -* Fix a `LogicError: Bad version number` exception when using `RLMResults` with - no notification blocks and explicitly called `-[RLMRealm refresh]` from that - thread. -* Logged-out users are no longer returned from `+[RLMSyncUser currentUser]` or - `+[RLMSyncUser allUsers]`. -* Fix several issues which could occur when the 1001st object of a given type - was created or added to an RLMArray/List, including crashes when rerunning - existing queries and possibly data corruption. -* Fix a potential crash when the application exits due to a race condition in - the destruction of global static variables. -* Fix race conditions when waiting for sync uploads or downloads to complete - which could result in crashes or the callback being called too early. - -2.1.0 Release notes (2016-11-18) -============================================================= - -### Sync Breaking Changes (In Beta) - -* None. - -### API breaking changes - -* None. - -### Enhancements - -* Add the ability to skip calling specific notification blocks when committing - a write transaction. - -### Bugfixes - -* Deliver collection notifications when beginning a write transaction which - advances the read version of a Realm (previously only Realm-level - notifications were sent). -* Fix some scenarios which would lead to inconsistent states when using - collection notifications. -* Fix several race conditions in the notification functionality. -* Don't send Realm change notifications when canceling a write transaction. - -2.0.4 Release notes (2016-11-14) -============================================================= - -### Sync Breaking Changes (In Beta) - -* Remove `RLMAuthenticationActions` and replace - `+[RLMSyncCredential credentialWithUsername:password:actions:]` with - `+[RLMSyncCredential credentialsWithUsername:password:register:]`. -* Rename `+[RLMSyncUser authenticateWithCredential:]` to - `+[RLMSyncUser logInWithCredentials:]`. -* Rename "credential"-related types and methods to - `RLMSyncCredentials`/`SyncCredentials` and consistently refer to credentials - in the plural form. -* Change `+[RLMSyncUser all]` to return a dictionary of identifiers to users and - rename to: - * `+[RLMSyncUser allUsers]` in Objective-C. - * `SyncUser.allUsers()` in Swift 2. - * `SyncUser.all` in Swift 3. -* Rename `SyncManager.sharedManager()` to `SyncManager.shared` in Swift 3. -* Change `Realm.Configuration.syncConfiguration` to take a `SyncConfiguration` - struct rather than a named tuple. -* `+[RLMSyncUser logInWithCredentials:]` now invokes its callback block on a - background queue. - -### API breaking changes - -* None. - -### Enhancements - -* Add `+[RLMSyncUser currentUser]`. -* Add the ability to change read, write and management permissions for - synchronized Realms using the management Realm obtained via the - `-[RLMSyncUser managementRealmWithError:]` API and the - `RLMSyncPermissionChange` class. - -### Bugfixes - -* None. - -2.0.3 Release notes (2016-10-27) -============================================================= - -This release adds binary versions of Swift 3.0.1 frameworks built with Xcode 8.1 -GM seed. - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix a `BadVersion` exception caused by a race condition when delivering - collection change notifications. -* Fix an assertion failure when additional model classes are added and - `deleteRealmIfMigrationNeeded` is enabled. -* Fix a `BadTransactLog` exception when deleting an `RLMResults` in a synced - Realm. -* Fix an assertion failure when a write transaction is in progress at the point - of process termination. -* Fix a crash that could occur when working with a `RLMLinkingObject` property - of an unmanaged object. - -2.0.2 Release notes (2016-10-05) -============================================================= - -This release is not protocol-compatible with previous version of the Realm -Mobile Platform. - -### API breaking changes - -* Rename Realm Swift's `User` to `SyncUser` to make clear that it relates to the - Realm Mobile Platform, and to avoid potential conflicts with other `User` types. - -### Bugfixes - -* Fix Realm headers to be compatible with pre-C++11 dialects of Objective-C++. -* Fix incorrect merging of RLMArray/List changes when objects with the same - primary key are created on multiple devices. -* Fix bad transaction log errors after deleting objects on a different device. -* Fix a BadVersion error when a background worker finishes running while older - results from that worker are being delivered to a different thread. - -2.0.1 Release notes (2016-09-29) -============================================================= - -### Bugfixes - -* Fix an assertion failure when opening a Realm file written by a 1.x version - of Realm which has an indexed nullable int or bool property. - -2.0.0 Release notes (2016-09-27) -============================================================= - -This release introduces support for the Realm Mobile Platform! -See for an overview -of these great new features. - -### API breaking changes - -* By popular demand, `RealmSwift.Error` has been moved from the top-level - namespace into a `Realm` extension and is now `Realm.Error`, so that it no - longer conflicts with `Swift.Error`. -* Files written by Realm 2.0 cannot be read by 1.x or earlier versions. Old - files can still be opened. - -### Enhancements - -* The .log, .log_a and .log_b files no longer exist and the state tracked in - them has been moved to the main Realm file. This reduces the number of open - files needed by Realm, improves performance of both opening and writing to - Realms, and eliminates a small window where committing write transactions - would prevent other processes from opening the file. - -### Bugfixes - -* Fix an assertion failure when sorting by zero properties. -* Fix a mid-commit crash in one process also crashing all other processes with - the same Realm open. -* Properly initialize new nullable float and double properties added to - existing objects to null rather than 0. -* Fix a stack overflow when objects with indexed string properties had very - long common prefixes. -* Fix a race condition which could lead to crashes when using async queries or - collection notifications. -* Fix a bug which could lead to incorrect state when an object which links to - itself is deleted from the Realm. - -1.1.0 Release notes (2016-09-16) -============================================================= - -This release brings official support for Xcode 8, Swift 2.3 and Swift 3.0. -Prebuilt frameworks are now built with Xcode 7.3.1 and Xcode 8.0. - -### API breaking changes - -* Deprecate `migrateRealm:` in favor of new `performMigrationForConfiguration:error:` method - that follows Cocoa's NSError conventions. -* Fix issue where `RLMResults` used `id `instead of its generic type as the return - type of subscript. - -### Enhancements - -* Improve error message when using NSNumber incorrectly in Swift models. -* Further reduce the download size of the prebuilt static libraries. -* Improve sort performance, especially on non-nullable columns. -* Allow partial initialization of object by `initWithValue:`, deferring - required property checks until object is added to Realm. - -### Bugfixes - -* Fix incorrect truncation of the constant value for queries of the form - `column < value` for `float` and `double` columns. -* Fix crash when an aggregate is accessed as an `Int8`, `Int16`, `Int32`, or `Int64`. -* Fix a race condition that could lead to a crash if an RLMArray or List was - deallocated on a different thread than it was created on. -* Fix a crash when the last reference to an observed object is released from - within the observation. -* Fix a crash when `initWithValue:` is used to create a nested object for a class - with an uninitialized schema. -* Enforce uniqueness for `RealmOptional` primary keys when using the `value` setter. - -1.0.2 Release notes (2016-07-13) -============================================================= - -### API breaking changes - -* Attempting to add an object with no properties to a Realm now throws rather than silently - doing nothing. - -### Enhancements - -* Swift: A `write` block may now `throw`, reverting any changes already made in - the transaction. -* Reduce address space used when committing write transactions. -* Significantly reduce the download size of prebuilt binaries and slightly - reduce the final size contribution of Realm to applications. -* Improve performance of accessing RLMArray properties and creating objects - with List properties. - -### Bugfixes - -* Fix a crash when reading the shared schema from an observed Swift object. -* Fix crashes or incorrect results when passing an array of values to - `createOrUpdate` after reordering the class's properties. -* Ensure that the initial call of a Results notification block is always passed - .Initial even if there is a write transaction between when the notification - is added and when the first notification is delivered. -* Fix a crash when deleting all objects in a Realm while fast-enumerating query - results from that Realm. -* Handle EINTR from flock() rather than crashing. -* Fix incorrect behavior following a call to `[RLMRealm compact]`. -* Fix live updating and notifications for Results created from a predicate involving - an inverse relationship to be triggered when an object at the other end of the relationship - is modified. - -1.0.1 Release notes (2016-06-12) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Significantly improve performance of opening Realm files, and slightly - improve performance of committing write transactions. - -### Bugfixes - -* Swift: Fix an error thrown when trying to create or update `Object` instances via - `add(:_update:)` with a primary key property of type `RealmOptional`. -* Xcode playground in Swift release zip now runs successfully. -* The `key` parameter of `Realm.objectForPrimaryKey(_:key:)`/ `Realm.dynamicObjectForPrimaryKey(_:key:)` - is now marked as optional. -* Fix a potential memory leak when closing Realms after a Realm file has been - opened on multiple threads which are running in active run loops. -* Fix notifications breaking on tvOS after a very large number of write - transactions have been committed. -* Fix a "Destruction of mutex in use" assertion failure after an error while - opening a file. -* Realm now throws an exception if an `Object` subclass is defined with a managed Swift `lazy` property. - Objects with ignored `lazy` properties should now work correctly. -* Update the LLDB script to work with recent changes to the implementation of `RLMResults`. -* Fix an assertion failure when a Realm file is deleted while it is still open, - and then a new Realm is opened at the same path. Note that this is still not - a supported scenario, and may break in other ways. - -1.0.0 Release notes (2016-05-25) -============================================================= - -No changes since 0.103.2. - -0.103.2 Release notes (2016-05-24) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Improve the error messages when an I/O error occurs in `writeCopyToURL`. - -### Bugfixes - -* Fix an assertion failure which could occur when opening a Realm after opening - that Realm failed previously in some specific ways in the same run of the - application. -* Reading optional integers, floats, and doubles from within a migration block - now correctly returns `nil` rather than 0 when the stored value is `nil`. - -0.103.1 Release notes (2016-05-19) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix a bug that sometimes resulted in a single object's NSData properties - changing from `nil` to a zero-length non-`nil` NSData when a different object - of the same type was deleted. - -0.103.0 Release notes (2016-05-18) -============================================================= - -### API breaking changes - -* All functionality deprecated in previous releases has been removed entirely. -* Support for Xcode 6.x & Swift prior to 2.2 has been completely removed. -* `RLMResults`/`Results` now become empty when a `RLMArray`/`List` or object - they depend on is deleted, rather than throwing an exception when accessed. -* Migrations are no longer run when `deleteRealmIfMigrationNeeded` is set, - recreating the file instead. - -### Enhancements - -* Added `invalidated` properties to `RLMResults`/`Results`, `RLMLinkingObjects`/`LinkingObjects`, - `RealmCollectionType` and `AnyRealmCollection`. These properties report whether the Realm - the object is associated with has been invalidated. -* Some `NSError`s created by Realm now have more descriptive user info payloads. - -### Bugfixes - -* None. - -0.102.1 Release notes (2016-05-13) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Return `RLMErrorSchemaMismatch` error rather than the more generic `RLMErrorFail` - when a migration is required. -* Improve the performance of allocating instances of `Object` subclasses - that have `LinkingObjects` properties. - -### Bugfixes - -* `RLMLinkingObjects` properties declared in Swift subclasses of `RLMObject` - now work correctly. -* Fix an assertion failure when deleting all objects of a type, inserting more - objects, and then deleting some of the newly inserted objects within a single - write transaction when there is an active notification block for a different - object type which links to the objects being deleted. -* Fix crashes and/or incorrect results when querying over multiple levels of - `LinkingObjects` properties. -* Fix opening read-only Realms on multiple threads at once. -* Fix a `BadTransactLog` exception when storing dates before the unix epoch (1970-01-01). - -0.102.0 Release notes (2016-05-09) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Add a method to rename properties during migrations: - * Swift: `Migration.renamePropertyForClass(_:oldName:newName:)` - * Objective-C: `-[RLMMigration renamePropertyForClass:oldName:newName:]` -* Add `deleteRealmIfMigrationNeeded` to - `RLMRealmConfiguration`/`Realm.Configuration`. When this is set to `true`, - the Realm file will be automatically deleted and recreated when there is a - schema mismatch rather than migrated to the new schema. - -### Bugfixes - -* Fix `BETWEEN` queries that traverse `RLMArray`/`List` properties to ensure that - a single related object satisfies the `BETWEEN` criteria, rather than allowing - different objects in the array to satisfy the lower and upper bounds. -* Fix a race condition when a Realm is opened on one thread while it is in the - middle of being closed on another thread which could result in crashes. -* Fix a bug which could result in changes made on one thread being applied - incorrectly on other threads when those threads are refreshed. -* Fix crash when migrating to the new date format introduced in 0.101.0. -* Fix crash when querying inverse relationships when objects are deleted. - -0.101.0 Release notes (2016-05-04) -============================================================= - -### API breaking changes - -* Files written by this version of Realm cannot be read by older versions of - Realm. Existing files will automatically be upgraded when they are opened. - -### Enhancements - -* Greatly improve performance of collection change calculation for complex - object graphs, especially for ones with cycles. -* NSDate properties now support nanoseconds precision. -* Opening a single Realm file on multiple threads now shares a single memory - mapping of the file for all threads, significantly reducing the memory - required to work with large files. -* Crashing while in the middle of a write transaction no longer blocks other - processes from performing write transactions on the same file. -* Improve the performance of refreshing a Realm (including via autorefresh) - when there are live Results/RLMResults objects for that Realm. - -### Bugfixes - -* Fix an assertion failure of "!more_before || index >= std::prev(it)->second)" - in `IndexSet::do_add()`. -* Fix a crash when an `RLMArray` or `List` object is destroyed from the wrong - thread. - -0.100.0 Release notes (2016-04-29) -============================================================= - -### API breaking changes - -* `-[RLMObject linkingObjectsOfClass:forProperty]` and `Object.linkingObjects(_:forProperty:)` - are deprecated in favor of properties of type `RLMLinkingObjects` / `LinkingObjects`. - -### Enhancements - -* The automatically-maintained inverse direction of relationships can now be exposed as - properties of type `RLMLinkingObjects` / `LinkingObjects`. These properties automatically - update to reflect the objects that link to the target object, can be used in queries, and - can be filtered like other Realm collection types. -* Queries that compare objects for equality now support multi-level key paths. - -### Bugfixes - -* Fix an assertion failure when a second write transaction is committed after a - write transaction deleted the object containing an RLMArray/List which had an - active notification block. -* Queries that compare `RLMArray` / `List` properties using != now give the correct results. - -0.99.1 Release notes (2016-04-26) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix a scenario that could lead to the assertion failure - "m_advancer_sg->get_version_of_current_transaction() == - new_notifiers.front()->version()". - -0.99.0 Release notes (2016-04-22) -============================================================= - -### API breaking changes - -* Deprecate properties of type `id`/`AnyObject`. This type was rarely used, - rarely useful and unsupported in every other Realm binding. -* The block for `-[RLMArray addNotificationBlock:]` and - `-[RLMResults addNotificationBlock:]` now takes another parameter. -* The following Objective-C APIs have been deprecated in favor of newer or preferred versions: - -| Deprecated API | New API | -|:-------------------------------------------------------|:------------------------------------------------------| -| `-[RLMRealm removeNotification:]` | `-[RLMNotificationToken stop]` | -| `RLMRealmConfiguration.path` | `RLMRealmConfiguration.fileURL` | -| `RLMRealm.path` | `RLMRealmConfiguration.fileURL` | -| `RLMRealm.readOnly` | `RLMRealmConfiguration.readOnly` | -| `+[RLMRealm realmWithPath:]` | `+[RLMRealm realmWithURL:]` | -| `+[RLMRealm writeCopyToPath:error:]` | `+[RLMRealm writeCopyToURL:encryptionKey:error:]` | -| `+[RLMRealm writeCopyToPath:encryptionKey:error:]` | `+[RLMRealm writeCopyToURL:encryptionKey:error:]` | -| `+[RLMRealm schemaVersionAtPath:error:]` | `+[RLMRealm schemaVersionAtURL:encryptionKey:error:]` | -| `+[RLMRealm schemaVersionAtPath:encryptionKey:error:]` | `+[RLMRealm schemaVersionAtURL:encryptionKey:error:]` | - -* The following Swift APIs have been deprecated in favor of newer or preferred versions: - -| Deprecated API | New API | -|:----------------------------------------------|:-----------------------------------------| -| `Realm.removeNotification(_:)` | `NotificationToken.stop()` | -| `Realm.Configuration.path` | `Realm.Configuration.fileURL` | -| `Realm.path` | `Realm.Configuration.fileURL` | -| `Realm.readOnly` | `Realm.Configuration.readOnly` | -| `Realm.writeCopyToPath(_:encryptionKey:)` | `Realm.writeCopyToURL(_:encryptionKey:)` | -| `schemaVersionAtPath(_:encryptionKey:error:)` | `schemaVersionAtURL(_:encryptionKey:)` | - -### Enhancements - -* Add information about what rows were added, removed, or modified to the - notifications sent to the Realm collections. -* Improve error when illegally appending to an `RLMArray` / `List` property from a default value - or the standalone initializer (`init()`) before the schema is ready. - -### Bugfixes - -* Fix a use-after-free when an associated object's dealloc method is used to - remove observers from an RLMObject. -* Fix a small memory leak each time a Realm file is opened. -* Return a recoverable `RLMErrorAddressSpaceExhausted` error rather than - crash when there is insufficient available address space on Realm - initialization or write commit. - -0.98.8 Release notes (2016-04-15) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fixed a bug that caused some encrypted files created using - `-[RLMRealm writeCopyToPath:encryptionKey:error:]` to fail to open. - -0.98.7 Release notes (2016-04-13) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Mark further initializers in Objective-C as NS_DESIGNATED_INITIALIZER to prevent that these aren't - correctly defined in Swift Object subclasses, which don't qualify for auto-inheriting the required initializers. -* `-[RLMResults indexOfObjectWithPredicate:]` now returns correct results - for `RLMResults` instances that were created by filtering an `RLMArray`. -* Adjust how RLMObjects are destroyed in order to support using an associated - object on an RLMObject to remove KVO observers from that RLMObject. -* `-[RLMResults indexOfObjectWithPredicate:]` now returns the index of the first matching object for a - sorted `RLMResults`, matching its documented behavior. -* Fix a crash when canceling a transaction that set a relationship. -* Fix a crash when a query referenced a deleted object. - -0.98.6 Release notes (2016-03-25) -============================================================= - -Prebuilt frameworks are now built with Xcode 7.3. - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix running unit tests on iOS simulators and devices with Xcode 7.3. - -0.98.5 Release notes (2016-03-14) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix a crash when opening a Realm on 32-bit iOS devices. - -0.98.4 Release notes (2016-03-10) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Properly report changes made by adding an object to a Realm with - addOrUpdate:/createOrUpdate: to KVO observers for existing objects with that - primary key. -* Fix crashes and assorted issues when a migration which added object link - properties is rolled back due to an error in the migration block. -* Fix assertion failures when deleting objects within a migration block of a - type which had an object link property added in that migration. -* Fix an assertion failure in `Query::apply_patch` when updating certain kinds - of queries after a write transaction is committed. - -0.98.3 Release notes (2016-02-26) -============================================================= - -### Enhancements - -* Initializing the shared schema is 3x faster. - -### Bugfixes - -* Using Realm Objective-C from Swift while having Realm Swift linked no longer causes that the - declared `ignoredProperties` are not taken into account. -* Fix assertion failures when rolling back a migration which added Object link - properties to a class. -* Fix potential errors when cancelling a write transaction which modified - multiple `RLMArray`/`List` properties. -* Report the correct value for inWriteTransaction after attempting to commit a - write transaction fails. -* Support CocoaPods 1.0 beginning from prerelease 1.0.0.beta.4 while retaining - backwards compatibility with 0.39. - -0.98.2 Release notes (2016-02-18) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Aggregate operations (`ANY`, `NONE`, `@count`, `SUBQUERY`, etc.) are now supported for key paths - that begin with an object relationship so long as there is a `RLMArray`/`List` property at some - point in a key path. -* Predicates of the form `%@ IN arrayProperty` are now supported. - -### Bugfixes - -* Use of KVC collection operators on Swift collection types no longer throws an exception. -* Fix reporting of inWriteTransaction in notifications triggered by - `beginWriteTransaction`. -* The contents of `List` and `Optional` properties are now correctly preserved when copying - a Swift object from one Realm to another, and performing other operations that result in a - Swift object graph being recursively traversed from Objective-C. -* Fix a deadlock when queries are performed within a Realm notification block. -* The `ANY` / `SOME` / `NONE` qualifiers are now required in comparisons involving a key path that - traverse a `RLMArray`/`List` property. Previously they were only required if the first key in the - key path was an `RLMArray`/`List` property. -* Fix several scenarios where the default schema would be initialized - incorrectly if the first Realm opened used a restricted class subset (via - `objectClasses`/`objectTypes`). - -0.98.1 Release notes (2016-02-10) -============================================================= - -### Bugfixes - -* Fix crashes when deleting an object containing an `RLMArray`/`List` which had - previously been queried. -* Fix a crash when deleting an object containing an `RLMArray`/`List` with - active notification blocks. -* Fix duplicate file warnings when building via CocoaPods. -* Fix crash or incorrect results when calling `indexOfObject:` on an - `RLMResults` derived from an `RLMArray`. - -0.98.0 Release notes (2016-02-04) -============================================================= - -### API breaking changes - -* `+[RLMRealm realmWithPath:]`/`Realm.init(path:)` now inherits from the default - configuration. -* Swift 1.2 is no longer supported. - -### Enhancements - -* Add `addNotificationBlock` to `RLMResults`, `Results`, `RLMArray`, and - `List`, which calls the given block whenever the collection changes. -* Do a lot of the work for keeping `RLMResults`/`Results` up-to-date after - write transactions on a background thread to help avoid blocking the main - thread. -* `NSPredicate`'s `SUBQUERY` operator is now supported. It has the following limitations: - * `@count` is the only operator that may be applied to the `SUBQUERY` expression. - * The `SUBQUERY(…).@count` expression must be compared with a constant. - * Correlated subqueries are not yet supported. - -### Bugfixes - -* None. - -0.97.1 Release notes (2016-01-29) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Swift: Added `Error` enum allowing to catch errors e.g. thrown on initializing - `RLMRealm`/`Realm` instances. -* Fail with `RLMErrorFileNotFound` instead of the more generic `RLMErrorFileAccess`, - if no file was found when a realm was opened as read-only or if the directory part - of the specified path was not found when a copy should be written. -* Greatly improve performance when deleting objects with one or more indexed - properties. -* Indexing `BOOL`/`Bool` and `NSDate` properties are now supported. -* Swift: Add support for indexing optional properties. - -### Bugfixes - -* Fix incorrect results or crashes when using `-[RLMResults setValue:forKey:]` - on an RLMResults which was filtered on the key being set. -* Fix crashes when an RLMRealm is deallocated from the wrong thread. -* Fix incorrect results from aggregate methods on `Results`/`RLMResults` after - objects which were previously in the results are deleted. -* Fix a crash when adding a new property to an existing class with over a - million objects in the Realm. -* Fix errors when opening encrypted Realm files created with writeCopyToPath. -* Fix crashes or incorrect results for queries that use relationship equality - in cases where the `RLMResults` is kept alive and instances of the target class - of the relationship are deleted. - -0.97.0 Release notes (2015-12-17) -============================================================= - -### API breaking changes - -* All functionality deprecated in previous releases has been removed entirely. -* Add generic type annotations to NSArrays and NSDictionaries in public APIs. -* Adding a Realm notification block on a thread not currently running from - within a run loop throws an exception rather than silently never calling the - notification block. - -### Enhancements - -* Support for tvOS. -* Support for building Realm Swift from source when using Carthage. -* The block parameter of `-[RLMRealm transactionWithBlock:]`/`Realm.write(_:)` is - now marked as `__attribute__((noescape))`/`@noescape`. -* Many forms of queries with key paths on both sides of the comparison operator - are now supported. -* Add support for KVC collection operators in `RLMResults` and `RLMArray`. -* Fail instead of deadlocking in `+[RLMRealm sharedSchema]`, if a Swift property is initialized - to a computed value, which attempts to open a Realm on its own. - -### Bugfixes - -* Fix poor performance when calling `-[RLMRealm deleteObjects:]` on an - `RLMResults` which filtered the objects when there are other classes linking - to the type of the deleted objects. -* An exception is now thrown when defining `Object` properties of an unsupported - type. - -0.96.3 Release notes (2015-12-04) -============================================================= - -### Enhancements - -* Queries are no longer limited to 16 levels of grouping. -* Rework the implementation of encrypted Realms to no longer interfere with - debuggers. - -### Bugfixes - -* Fix crash when trying to retrieve object instances via `dynamicObjects`. -* Throw an exception when querying on a link providing objects, which are from a different Realm. -* Return empty results when querying on a link providing an unattached object. -* Fix crashes or incorrect results when calling `-[RLMRealm refresh]` during - fast enumeration. -* Add `Int8` support for `RealmOptional`, `MinMaxType` and `AddableType`. -* Set the default value for newly added non-optional NSData properties to a - zero-byte NSData rather than nil. -* Fix a potential crash when deleting all objects of a class. -* Fix performance problems when creating large numbers of objects with - `RLMArray`/`List` properties. -* Fix memory leak when using Object(value:) for subclasses with - `List` or `RealmOptional` properties. -* Fix a crash when computing the average of an optional integer property. -* Fix incorrect search results for some queries on integer properties. -* Add error-checking for nil realm parameters in many methods such as - `+[RLMObject allObjectsInRealm:]`. -* Fix a race condition between commits and opening Realm files on new threads - that could lead to a crash. -* Fix several crashes when opening Realm files. -* `-[RLMObject createInRealm:withValue:]`, `-[RLMObject createOrUpdateInRealm:withValue:]`, and - their variants for the default Realm now always match the contents of an `NSArray` against properties - in the same order as they are defined in the model. - -0.96.2 Release notes (2015-10-26) -============================================================= - -Prebuilt frameworks are now built with Xcode 7.1. - -### Bugfixes - -* Fix ignoring optional properties in Swift. -* Fix CocoaPods installation on case-sensitive file systems. - -0.96.1 Release notes (2015-10-20) -============================================================= - -### Bugfixes - -* Support assigning `Results` to `List` properties via KVC. -* Honor the schema version set in the configuration in `+[RLMRealm migrateRealm:]`. -* Fix crash when using optional Int16/Int32/Int64 properties in Swift. - -0.96.0 Release notes (2015-10-14) -============================================================= - -* No functional changes since beta2. - -0.96.0-beta2 Release notes (2015-10-08) -============================================================= - -### Bugfixes - -* Add RLMOptionalBase.h to the podspec. - -0.96.0-beta Release notes (2015-10-07) -============================================================= - -### API breaking changes - -* CocoaPods v0.38 or greater is now required to install Realm and RealmSwift - as pods. - -### Enhancements - -* Functionality common to both `List` and `Results` is now declared in a - `RealmCollectionType` protocol that both types conform to. -* `Results.realm` now returns an `Optional` in order to conform to - `RealmCollectionType`, but will always return `.Some()` since a `Results` - cannot exist independently from a `Realm`. -* Aggregate operations are now available on `List`: `min`, `max`, `sum`, - `average`. -* Committing write transactions (via `commitWrite` / `commitWriteTransaction` and - `write` / `transactionWithBlock`) now optionally allow for handling errors when - the disk is out of space. -* Added `isEmpty` property on `RLMRealm`/`Realm` to indicate if it contains any - objects. -* The `@count`, `@min`, `@max`, `@sum` and `@avg` collection operators are now - supported in queries. - -### Bugfixes - -* Fix assertion failure when inserting NSData between 8MB and 16MB in size. -* Fix assertion failure when rolling back a migration which removed an object - link or `RLMArray`/`List` property. -* Add the path of the file being opened to file open errors. -* Fix a crash that could be triggered by rapidly opening and closing a Realm - many times on multiple threads at once. -* Fix several places where exception messages included the name of the wrong - function which failed. - -0.95.3 Release notes (2015-10-05) -============================================================= - -### Bugfixes - -* Compile iOS Simulator framework architectures with `-fembed-bitcode-marker`. -* Fix crashes when the first Realm opened uses a class subset and later Realms - opened do not. -* Fix inconsistent errors when `Object(value: ...)` is used to initialize the - default value of a property of an `Object` subclass. -* Throw an exception when a class subset has objects with array or object - properties of a type that are not part of the class subset. - -0.95.2 Release notes (2015-09-24) -============================================================= - -* Enable bitcode for iOS and watchOS frameworks. -* Build libraries with Xcode 7 final rather than the GM. - -0.95.1 Release notes (2015-09-23) -============================================================= - -### Enhancements - -* Add missing KVO handling for moving and exchanging objects in `RLMArray` and - `List`. - -### Bugfixes - -* Setting the primary key property on persisted `RLMObject`s / `Object`s - via subscripting or key-value coding will cause an exception to be thrown. -* Fix crash due to race condition in `RLMRealmConfiguration` where the default - configuration was in the process of being copied in one thread, while - released in another. -* Fix crash when a migration which removed an object or array property is - rolled back due to an error. - -0.95.0 Release notes (2015-08-25) -============================================================= - -### API breaking changes - -* The following APIs have been deprecated in favor of the new `RLMRealmConfiguration` class in Realm Objective-C: - -| Deprecated API | New API | -|:------------------------------------------------------------------|:---------------------------------------------------------------------------------| -| `+[RLMRealm realmWithPath:readOnly:error:]` | `+[RLMRealm realmWithConfiguration:error:]` | -| `+[RLMRealm realmWithPath:encryptionKey:readOnly:error:]` | `+[RLMRealm realmWithConfiguration:error:]` | -| `+[RLMRealm setEncryptionKey:forRealmsAtPath:]` | `-[RLMRealmConfiguration setEncryptionKey:]` | -| `+[RLMRealm inMemoryRealmWithIdentifier:]` | `+[RLMRealm realmWithConfiguration:error:]` | -| `+[RLMRealm defaultRealmPath]` | `+[RLMRealmConfiguration defaultConfiguration]` | -| `+[RLMRealm setDefaultRealmPath:]` | `+[RLMRealmConfiguration setDefaultConfiguration:]` | -| `+[RLMRealm setDefaultRealmSchemaVersion:withMigrationBlock]` | `RLMRealmConfiguration.schemaVersion` and `RLMRealmConfiguration.migrationBlock` | -| `+[RLMRealm setSchemaVersion:forRealmAtPath:withMigrationBlock:]` | `RLMRealmConfiguration.schemaVersion` and `RLMRealmConfiguration.migrationBlock` | -| `+[RLMRealm migrateRealmAtPath:]` | `+[RLMRealm migrateRealm:]` | -| `+[RLMRealm migrateRealmAtPath:encryptionKey:]` | `+[RLMRealm migrateRealm:]` | - -* The following APIs have been deprecated in favor of the new `Realm.Configuration` struct in Realm Swift for Swift 1.2: - -| Deprecated API | New API | -|:--------------------------------------------------------------|:-----------------------------------------------------------------------------| -| `Realm.defaultPath` | `Realm.Configuration.defaultConfiguration` | -| `Realm(path:readOnly:encryptionKey:error:)` | `Realm(configuration:error:)` | -| `Realm(inMemoryIdentifier:)` | `Realm(configuration:error:)` | -| `Realm.setEncryptionKey(:forPath:)` | `Realm(configuration:error:)` | -| `setDefaultRealmSchemaVersion(schemaVersion:migrationBlock:)` | `Realm.Configuration.schemaVersion` and `Realm.Configuration.migrationBlock` | -| `setSchemaVersion(schemaVersion:realmPath:migrationBlock:)` | `Realm.Configuration.schemaVersion` and `Realm.Configuration.migrationBlock` | -| `migrateRealm(path:encryptionKey:)` | `migrateRealm(configuration:)` | - -* The following APIs have been deprecated in favor of the new `Realm.Configuration` struct in Realm Swift for Swift 2.0: - -| Deprecated API | New API | -|:--------------------------------------------------------------|:-----------------------------------------------------------------------------| -| `Realm.defaultPath` | `Realm.Configuration.defaultConfiguration` | -| `Realm(path:readOnly:encryptionKey:) throws` | `Realm(configuration:) throws` | -| `Realm(inMemoryIdentifier:)` | `Realm(configuration:) throws` | -| `Realm.setEncryptionKey(:forPath:)` | `Realm(configuration:) throws` | -| `setDefaultRealmSchemaVersion(schemaVersion:migrationBlock:)` | `Realm.Configuration.schemaVersion` and `Realm.Configuration.migrationBlock` | -| `setSchemaVersion(schemaVersion:realmPath:migrationBlock:)` | `Realm.Configuration.schemaVersion` and `Realm.Configuration.migrationBlock` | -| `migrateRealm(path:encryptionKey:)` | `migrateRealm(configuration:)` | - -* `List.extend` in Realm Swift for Swift 2.0 has been replaced with `List.appendContentsOf`, - mirroring changes to `RangeReplaceableCollectionType`. - -* Object properties on `Object` subclasses in Realm Swift must be marked as optional, - otherwise a runtime exception will be thrown. - -### Enhancements - -* Persisted properties of `RLMObject`/`Object` subclasses are now Key-Value - Observing compliant. -* The different options used to create Realm instances have been consolidated - into a single `RLMRealmConfiguration`/`Realm.Configuration` object. -* Enumerating Realm collections (`RLMArray`, `RLMResults`, `List<>`, - `Results<>`) now enumerates over a copy of the collection, making it no - longer an error to modify a collection during enumeration (either directly, - or indirectly by modifying objects to make them no longer match a query). -* Improve performance of object insertion in Swift to bring it roughly in line - with Objective-C. -* Allow specifying a specific list of `RLMObject` / `Object` subclasses to include - in a given Realm via `RLMRealmConfiguration.objectClasses` / `Realm.Configuration.objectTypes`. - -### Bugfixes - -* Subscripting on `RLMObject` is now marked as nullable. - -0.94.1 Release notes (2015-08-10) -============================================================= - -### API breaking changes - -* Building for watchOS requires Xcode 7 beta 5. - -### Enhancements - -* `Object.className` is now marked as `final`. - -### Bugfixes - -* Fix crash when adding a property to a model without updating the schema - version. -* Fix unnecessary redownloading of the core library when building from source. -* Fix crash when sorting by an integer or floating-point property on iOS 7. - -0.94.0 Release notes (2015-07-29) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Reduce the amount of memory used by RLMRealm notification listener threads. -* Avoid evaluating results eagerly when filtering and sorting. -* Add nullability annotations to the Objective-C API to provide enhanced compiler - warnings and bridging to Swift. -* Make `RLMResult`s and `RLMArray`s support Objective-C generics. -* Add support for building watchOS and bitcode-compatible apps. -* Make the exceptions thrown in getters and setters more informative. -* Add `-[RLMArray exchangeObjectAtIndex:withObjectAtIndex]` and `List.swap(_:_:)` - to allow exchanging the location of two objects in the given `RLMArray` / `List`. -* Added anonymous analytics on simulator/debugger runs. -* Add `-[RLMArray moveObjectAtIndex:toIndex:]` and `List.move(from:to:)` to - allow moving objects in the given `RLMArray` / `List`. - -### Bugfixes - -* Processes crashing due to an uncaught exception inside a write transaction will - no longer cause other processes using the same Realm to hang indefinitely. -* Fix incorrect results when querying for < or <= on ints that - require 64 bits to represent with a CPU that supports SSE 4.2. -* An exception will no longer be thrown when attempting to reset the schema - version or encryption key on an open Realm to the current value. -* Date properties on 32 bit devices will retain 64 bit second precision. -* Wrap calls to the block passed to `enumerate` in an autoreleasepool to reduce - memory growth when migrating a large amount of objects. -* In-memory realms no longer write to the Documents directory on iOS or - Application Support on OS X. - -0.93.2 Release notes (2015-06-12) -============================================================= - -### Bugfixes - -* Fixed an issue where the packaged OS X Realm.framework was built with - `GCC_GENERATE_TEST_COVERAGE_FILES` and `GCC_INSTRUMENT_PROGRAM_FLOW_ARCS` - enabled. -* Fix a memory leak when constructing standalone Swift objects with NSDate - properties. -* Throw an exception rather than asserting when an invalidated object is added - to an RLMArray. -* Fix a case where data loss would occur if a device was hard-powered-off - shortly after a write transaction was committed which had to expand the Realm - file. - -0.93.1 Release notes (2015-05-29) -============================================================= - -### Bugfixes - -* Objects are no longer copied into standalone objects during object creation. This fixes an issue where - nested objects with a primary key are sometimes duplicated rather than updated. -* Comparison predicates with a constant on the left of the operator and key path on the right now give - correct results. An exception is now thrown for predicates that do not yet support this ordering. -* Fix some crashes in `index_string.cpp` with int primary keys or indexed int properties. - -0.93.0 Release notes (2015-05-27) -============================================================= - -### API breaking changes - -* Schema versions are now represented as `uint64_t` (Objective-C) and `UInt64` (Swift) so that they have - the same representation on all architectures. - -### Enhancements - -* Swift: `Results` now conforms to `CVarArgType` so it can - now be passed as an argument to `Results.filter(_:...)` - and `List.filter(_:...)`. -* Swift: Made `SortDescriptor` conform to the `Equatable` and - `StringLiteralConvertible` protocols. -* Int primary keys are once again automatically indexed. -* Improve error reporting when attempting to mark a property of a type that - cannot be indexed as indexed. - -### Bugfixes - -* Swift: `RealmSwift.framework` no longer embeds `Realm.framework`, - which now allows apps using it to pass iTunes Connect validation. - -0.92.4 Release notes (2015-05-22) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Swift: Made `Object.init()` a required initializer. -* `RLMObject`, `RLMResults`, `Object` and `Results` can now be safely - deallocated (but still not used) from any thread. -* Improve performance of `-[RLMArray indexOfObjectWhere:]` and `-[RLMArray - indexOfObjectWithPredicate:]`, and implement them for standalone RLMArrays. -* Improved performance of most simple queries. - -### Bugfixes - -* The interprocess notification mechanism no longer uses dispatch worker threads, preventing it from - starving other GCD clients of the opportunity to execute blocks when dozens of Realms are open at once. - -0.92.3 Release notes (2015-05-13) -============================================================= - -### API breaking changes - -* Swift: `Results.average(_:)` now returns an optional, which is `nil` if and only if the results - set is empty. - -### Enhancements - -* Swift: Added `List.invalidated`, which returns if the given `List` is no longer - safe to be accessed, and is analogous to `-[RLMArray isInvalidated]`. -* Assertion messages are automatically logged to Crashlytics if it's loaded - into the current process to make it easier to diagnose crashes. - -### Bugfixes - -* Swift: Enumerating through a standalone `List` whose objects themselves - have list properties won't crash. -* Swift: Using a subclass of `RealmSwift.Object` in an aggregate operator of a predicate - no longer throws a spurious type error. -* Fix incorrect results for when using OR in a query on a `RLMArray`/`List<>`. -* Fix incorrect values from `[RLMResults count]`/`Results.count` when using - `!=` on an int property with no other query conditions. -* Lower the maximum doubling threshold for Realm file sizes from 128MB to 16MB - to reduce the amount of wasted space. - -0.92.2 Release notes (2015-05-08) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Exceptions raised when incorrect object types are used with predicates now contain more detailed information. -* Added `-[RLMMigration deleteDataForClassName:]` and `Migration.deleteData(_:)` - to enable cleaning up after removing object subclasses - -### Bugfixes - -* Prevent debugging of an application using an encrypted Realm to work around - frequent LLDB hangs. Until the underlying issue is addressed you may set - REALM_DISABLE_ENCRYPTION=YES in your application's environment variables to - have requests to open an encrypted Realm treated as a request for an - unencrypted Realm. -* Linked objects are properly updated in `createOrUpdateInRealm:withValue:`. -* List properties on Objects are now properly initialized during fast enumeration. - -0.92.1 Release notes (2015-05-06) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* `-[RLMRealm inWriteTransaction]` is now public. -* Realm Swift is now available on CoocaPods. - -### Bugfixes - -* Force code re-signing after stripping architectures in `strip-frameworks.sh`. - -0.92.0 Release notes (2015-05-05) -============================================================= - -### API breaking changes - -* Migration blocks are no longer called when a Realm file is first created. -* The following APIs have been deprecated in favor of newer method names: - -| Deprecated API | New API | -|:-------------------------------------------------------|:------------------------------------------------------| -| `-[RLMMigration createObject:withObject:]` | `-[RLMMigration createObject:withValue:]` | -| `-[RLMObject initWithObject:]` | `-[RLMObject initWithValue:]` | -| `+[RLMObject createInDefaultRealmWithObject:]` | `+[RLMObject createInDefaultRealmWithValue:]` | -| `+[RLMObject createInRealm:withObject:]` | `+[RLMObject createInRealm:withValue:]` | -| `+[RLMObject createOrUpdateInDefaultRealmWithObject:]` | `+[RLMObject createOrUpdateInDefaultRealmWithValue:]` | -| `+[RLMObject createOrUpdateInRealm:withObject:]` | `+[RLMObject createOrUpdateInRealm:withValue:]` | - -### Enhancements - -* `Int8` properties defined in Swift are now treated as integers, rather than - booleans. -* NSPredicates created using `+predicateWithValue:` are now supported. - -### Bugfixes - -* Compound AND predicates with no subpredicates now correctly match all objects. - -0.91.5 Release notes (2015-04-28) -============================================================= - -### Bugfixes - -* Fix issues with removing search indexes and re-enable it. - -0.91.4 Release notes (2015-04-27) -============================================================= - -### Bugfixes - -* Temporarily disable removing indexes from existing columns due to bugs. - -0.91.3 Release notes (2015-04-17) -============================================================= - -### Bugfixes - -* Fix `Extra argument 'objectClassName' in call` errors when building via - CocoaPods. - -0.91.2 Release notes (2015-04-16) -============================================================= - -* Migration blocks are no longer called when a Realm file is first created. - -### Enhancements - -* `RLMCollection` supports collection KVC operations. -* Sorting `RLMResults` is 2-5x faster (typically closer to 2x). -* Refreshing `RLMRealm` after a write transaction which inserts or modifies - strings or `NSData` is committed on another thread is significantly faster. -* Indexes are now added and removed from existing properties when a Realm file - is opened, rather than only when properties are first added. - -### Bugfixes - -* `+[RLMSchema dynamicSchemaForRealm:]` now respects search indexes. -* `+[RLMProperty isEqualToProperty:]` now checks for equal `indexed` properties. - -0.91.1 Release notes (2015-03-12) -============================================================= - -### Enhancements - -* The browser will automatically refresh when the Realm has been modified - from another process. -* Allow using Realm in an embedded framework by setting - `APPLICATION_EXTENSION_API_ONLY` to YES. - -### Bugfixes - -* Fix a crash in CFRunLoopSourceInvalidate. - -0.91.0 Release notes (2015-03-10) -============================================================= - -### API breaking changes - -* `attributesForProperty:` has been removed from `RLMObject`. You now specify indexed - properties by implementing the `indexedProperties` method. -* An exception will be thrown when calling `setEncryptionKey:forRealmsAtPath:`, - `setSchemaVersion:forRealmAtPath:withMigrationBlock:`, and `migrateRealmAtPath:` - when a Realm at the given path is already open. -* Object and array properties of type `RLMObject` will no longer be allowed. - -### Enhancements - -* Add support for sharing Realm files between processes. -* The browser will no longer show objects that have no persisted properties. -* `RLMSchema`, `RLMObjectSchema`, and `RLMProperty` now have more useful descriptions. -* Opening an encrypted Realm while a debugger is attached to the process no - longer throws an exception. -* `RLMArray` now exposes an `isInvalidated` property to indicate if it can no - longer be accessed. - -### Bugfixes - -* An exception will now be thrown when calling `-beginWriteTransaction` from within a notification - triggered by calling `-beginWriteTransaction` elsewhere. -* When calling `delete:` we now verify that the object being deleted is persisted in the target Realm. -* Fix crash when calling `createOrUpdate:inRealm` with nested linked objects. -* Use the key from `+[RLMRealm setEncryptionKey:forRealmsAtPath:]` in - `-writeCopyToPath:error:` and `+migrateRealmAtPath:`. -* Comparing an RLMObject to a non-RLMObject using `-[RLMObject isEqual:]` or - `-isEqualToObject:` now returns NO instead of crashing. -* Improved error message when an `RLMObject` subclass is defined nested within - another Swift declaration. -* Fix crash when the process is terminated by the OS on iOS while encrypted realms are open. -* Fix crash after large commits to encrypted realms. - -0.90.6 Release notes (2015-02-20) -============================================================= - -### Enhancements - -* Improve compatibility of encrypted Realms with third-party crash reporters. - -### Bugfixes - -* Fix incorrect results when using aggregate functions on sorted RLMResults. -* Fix data corruption when using writeCopyToPath:encryptionKey:. -* Maybe fix some assertion failures. - -0.90.5 Release notes (2015-02-04) -============================================================= - -### Bugfixes - -* Fix for crashes when encryption is enabled on 64-bit iOS devices. - -0.90.4 Release notes (2015-01-29) -============================================================= - -### Bugfixes - -* Fix bug that resulted in columns being dropped and recreated during migrations. - -0.90.3 Release notes (2015-01-27) -============================================================= - -### Enhancements - -* Calling `createInDefaultRealmWithObject:`, `createInRealm:withObject:`, - `createOrUpdateInDefaultRealmWithObject:` or `createOrUpdateInRealm:withObject:` - is a no-op if the argument is an RLMObject of the same type as the receiver - and is already backed by the target realm. - -### Bugfixes - -* Fix incorrect column type assertions when the first Realm file opened is a - read-only file that is missing tables. -* Throw an exception when adding an invalidated or deleted object as a link. -* Throw an exception when calling `createOrUpdateInRealm:withObject:` when the - receiver has no primary key defined. - -0.90.1 Release notes (2015-01-22) -============================================================= - -### Bugfixes - -* Fix for RLMObject being treated as a model object class and showing up in the browser. -* Fix compilation from the podspec. -* Fix for crash when calling `objectsWhere:` with grouping in the query on `allObjects`. - -0.90.0 Release notes (2015-01-21) -============================================================= - -### API breaking changes - -* Rename `-[RLMRealm encryptedRealmWithPath:key:readOnly:error:]` to - `-[RLMRealm realmWithPath:encryptionKey:readOnly:error:]`. -* `-[RLMRealm setSchemaVersion:withMigrationBlock]` is no longer global and must be called - for each individual Realm path used. You can now call `-[RLMRealm setDefaultRealmSchemaVersion:withMigrationBlock]` - for the default Realm and `-[RLMRealm setSchemaVersion:forRealmAtPath:withMigrationBlock:]` for all others; - -### Enhancements - -* Add `-[RLMRealm writeCopyToPath:encryptionKey:error:]`. -* Add support for comparing string columns to other string columns in queries. - -### Bugfixes - -* Roll back changes made when an exception is thrown during a migration. -* Throw an exception if the number of items in a RLMResults or RLMArray changes - while it's being fast-enumerated. -* Also encrypt the temporary files used when encryption is enabled for a Realm. -* Fixed crash in JSONImport example on OS X with non-en_US locale. -* Fixed infinite loop when opening a Realm file in the Browser at the same time - as it is open in a 32-bit simulator. -* Fixed a crash when adding primary keys to older realm files with no primary - keys on any objects. -* Fixed a crash when removing a primary key in a migration. -* Fixed a crash when multiple write transactions with no changes followed by a - write transaction with changes were committed without the main thread - RLMRealm getting a chance to refresh. -* Fixed incomplete results when querying for non-null relationships. -* Improve the error message when a Realm file is opened in multiple processes - at once. - -0.89.2 Release notes (2015-01-02) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix an assertion failure when invalidating a Realm which is in a write - transaction, has already been invalidated, or has never been used. -* Fix an assertion failure when sorting an empty RLMArray property. -* Fix a bug resulting in the browser never becoming visible on 10.9. -* Write UTF-8 when generating class files from a realm file in the Browser. - -0.89.1 Release notes (2014-12-22) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Improve the error message when a Realm can't be opened due to lacking write - permissions. - -### Bugfixes - -* Fix an assertion failure when inserting rows after calling `deleteAllObjects` - on a Realm. -* Separate dynamic frameworks are now built for the simulator and devices to - work around App Store submission errors due to the simulator version not - being automatically stripped from dynamic libraries. - -0.89.0 Release notes (2014-12-18) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Add support for encrypting Realm files on disk. -* Support using KVC-compliant objects without getters or with custom getter - names to initialize RLMObjects with `createObjectInRealm` and friends. - -### Bugfixes - -* Merge native Swift default property values with defaultPropertyValues(). -* Don't leave the database schema partially updated when opening a realm fails - due to a migration being needed. -* Fixed issue where objects with custom getter names couldn't be used to - initialize other objects. -* Fix a major performance regression on queries on string properties. -* Fix a memory leak when circularly linked objects are added to a Realm. - -0.88.0 Release notes (2014-12-02) -============================================================= - -### API breaking changes - -* Deallocating an RLMRealm instance in a write transaction lacking an explicit - commit/cancel will now be automatically cancelled instead of committed. -* `-[RLMObject isDeletedFromRealm]` has been renamed to `-[RLMObject isInvalidated]`. - -### Enhancements - -* Add `-[RLMRealm writeCopyToPath:]` to write a compacted copy of the Realm - another file. -* Add support for case insensitive, BEGINSWITH, ENDSWITH and CONTAINS string - queries on array properties. -* Make fast enumeration of `RLMArray` and `RLMResults` ~30% faster and - `objectAtIndex:` ~55% faster. -* Added a lldb visualizer script for displaying the contents of persisted - RLMObjects when debugging. -* Added method `-setDefaultRealmPath:` to change the default Realm path. -* Add `-[RLMRealm invalidate]` to release data locked by the current thread. - -### Bugfixes - -* Fix for crash when running many simultaneous write transactions on background threads. -* Fix for crashes caused by opening Realms at multiple paths simultaneously which have had - properties re-ordered during migration. -* Don't run the query twice when `firstObject` or `lastObject` are called on an - `RLMResults` which has not had its results accessed already. -* Fix for bug where schema version is 0 for new Realm created at the latest version. -* Fix for error message where no migration block is specified when required. - -0.87.4 Release notes (2014-11-07) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* None. - -### Bugfixes - -* Fix browser location in release zip. - -0.87.3 Release notes (2014-11-06) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Added method `-linkingObjectsOfClass:forProperty:` to RLMObject to expose inverse - relationships/backlinks. - -### Bugfixes - -* Fix for crash due to missing search index when migrating an object with a string primary key - in a database created using an older versions (0.86.3 and earlier). -* Throw an exception when passing an array containing a - non-RLMObject to -[RLMRealm addObjects:]. -* Fix for crash when deleting an object from multiple threads. - -0.87.0 Release notes (2014-10-21) -============================================================= - -### API breaking changes - -* RLMArray has been split into two classes, `RLMArray` and `RLMResults`. RLMArray is - used for object properties as in previous releases. Moving forward all methods used to - enumerate, query, and sort objects return an instance of a new class `RLMResults`. This - change was made to support diverging apis and the future addition of change notifications - for queries. -* The api for migrations has changed. You now call `setSchemaVersion:withMigrationBlock:` to - register a global migration block and associated version. This block is applied to Realms as - needed when opened for Realms at a previous version. The block can be applied manually if - desired by calling `migrateRealmAtPath:`. -* `arraySortedByProperty:ascending:` was renamed to `sortedResultsUsingProperty:ascending` -* `addObjectsFromArray:` on both `RLMRealm` and `RLMArray` has been renamed to `addObjects:` - and now accepts any container class which implements `NSFastEnumeration` -* Building with Swift support now requires Xcode 6.1 - -### Enhancements - -* Add support for sorting `RLMArray`s by multiple columns with `sortedResultsUsingDescriptors:` -* Added method `deleteAllObjects` on `RLMRealm` to clear a Realm. -* Added method `createObject:withObject:` on `RLMMigration` which allows object creation during migrations. -* Added method `deleteObject:` on `RLMMigration` which allows object deletion during migrations. -* Updating to core library version 0.85.0. -* Implement `objectsWhere:` and `objectsWithPredicate:` for array properties. -* Add `cancelWriteTransaction` to revert all changes made in a write transaction and end the transaction. -* Make creating `RLMRealm` instances on background threads when an instance - exists on another thread take a fifth of the time. -* Support for partial updates when calling `createOrUpdateWithObject:` and `addOrUpdateObject:` -* Re-enable Swift support on OS X - -### Bugfixes - -* Fix exceptions when trying to set `RLMObject` properties after rearranging - the properties in a `RLMObject` subclass. -* Fix crash on IN query with several thousand items. -* Fix crash when querying indexed `NSString` properties. -* Fixed an issue which prevented in-memory Realms from being used accross multiple threads. -* Preserve the sort order when querying a sorted `RLMResults`. -* Fixed an issue with migrations where if a Realm file is deleted after a Realm is initialized, - the newly created Realm can be initialized with an incorrect schema version. -* Fix crash in `RLMSuperSet` when assigning to a `RLMArray` property on a standalone object. -* Add an error message when the protocol for an `RLMArray` property is not a - valid object type. -* Add an error message when an `RLMObject` subclass is defined nested within - another Swift class. - -0.86.3 Release notes (2014-10-09) -============================================================= - -### Enhancements - -* Add support for != in queries on object relationships. - -### Bugfixes - -* Re-adding an object to its Realm no longer throws an exception and is now a no-op - (as it was previously). -* Fix another bug which would sometimes result in subclassing RLMObject - subclasses not working. - -0.86.2 Release notes (2014-10-06) -============================================================= - -### Bugfixes - -* Fixed issues with packaging "Realm Browser.app" for release. - -0.86.1 Release notes (2014-10-03) -============================================================= - -### Bugfixes - -* Fix a bug which would sometimes result in subclassing RLMObject subclasses - not working. - -0.86.0 Release notes (2014-10-03) -============================================================= - -### API breaking changes - -* Xcode 6 is now supported from the main Xcode project `Realm.xcodeproj`. - Xcode 5 is no longer supported. - -### Enhancements - -* Support subclassing RLMObject models. Although you can now persist subclasses, - polymorphic behavior is not supported (i.e. setting a property to an - instance of its subclass). -* Add support for sorting RLMArray properties. -* Speed up inserting objects with `addObject:` by ~20%. -* `readonly` properties are automatically ignored rather than having to be - added to `ignoredProperties`. -* Updating to core library version 0.83.1. -* Return "[deleted object]" rather than throwing an exception when - `-description` is called on a deleted RLMObject. -* Significantly improve performance of very large queries. -* Allow passing any enumerable to IN clauses rather than just NSArray. -* Add `objectForPrimaryKey:` and `objectInRealm:forPrimaryKey:` convenience - methods to fetch an object by primary key. - -### Bugfixes - -* Fix error about not being able to persist property 'hash' with incompatible - type when building for devices with Xcode 6. -* Fix spurious notifications of new versions of Realm. -* Fix for updating nested objects where some types do not have primary keys. -* Fix for inserting objects from JSON with NSNull values when default values - should be used. -* Trying to add a persisted RLMObject to a different Realm now throws an - exception rather than creating an uninitialized object. -* Fix validation errors when using IN on array properties. -* Fix errors when an IN clause has zero items. -* Fix for chained queries ignoring all but the last query's conditions. - -0.85.0 Release notes (2014-09-15) -============================================================= - -### API breaking changes - -* Notifications for a refresh being needed (when autorefresh is off) now send - the notification type RLMRealmRefreshRequiredNotification rather than - RLMRealmDidChangeNotification. - -### Enhancements - -* Updating to core library version 0.83.0. -* Support for primary key properties (for int and string columns). Declaring a property - to be the primary key ensures uniqueness for that property for all objects of a given type. - At the moment indexes on primary keys are not yet supported but this will be added in a future - release. -* Added methods to update or insert (upsert) for objects with primary keys defined. -* `[RLMObject initWithObject:]` and `[RLMObject createInRealmWithObject:]` now support - any object type with kvc properties. -* The Swift support has been reworked to work around Swift not being supported - in Frameworks on iOS 7. -* Improve performance when getting the count of items matching a query but not - reading any of the objects in the results. -* Add a return value to `-[RLMRealm refresh]` that indicates whether or not - there was anything to refresh. -* Add the class name to the error message when an RLMObject is missing a value - for a property without a default. -* Add support for opening Realms in read-only mode. -* Add an automatic check for updates when using Realm in a simulator (the - checker code is not compiled into device builds). This can be disabled by - setting the REALM_DISABLE_UPDATE_CHECKER environment variable to any value. -* Add support for Int16 and Int64 properties in Swift classes. - -### Bugfixes - -* Realm change notifications when beginning a write transaction are now sent - after updating rather than before, to match refresh. -* `-isEqual:` now uses the default `NSObject` implementation unless a primary key - is specified for an RLMObject. When a primary key is specified, `-isEqual:` calls - `-isEqualToObject:` and a corresponding implementation for `-hash` is also implemented. - -0.84.0 Release notes (2014-08-28) -============================================================= - -### API breaking changes - -* The timer used to trigger notifications has been removed. Notifications are now - only triggered by commits made in other threads, and can not currently be triggered - by changes made by other processes. Interprocess notifications will be re-added in - a future commit with an improved design. - -### Enhancements - -* Updating to core library version 0.82.2. -* Add property `deletedFromRealm` to RLMObject to indicate objects which have been deleted. -* Add support for the IN operator in predicates. -* Add support for the BETWEEN operator in link queries. -* Add support for multi-level link queries in predicates (e.g. `foo.bar.baz = 5`). -* Switch to building the SDK from source when using CocoaPods and add a - Realm.Headers subspec for use in targets that should not link a copy of Realm - (such as test targets). -* Allow unregistering from change notifications in the change notification - handler block. -* Significant performance improvements when holding onto large numbers of RLMObjects. -* Realm-Xcode6.xcodeproj now only builds using Xcode6-Beta6. -* Improved performance during RLMArray iteration, especially when mutating - contained objects. - -### Bugfixes - -* Fix crashes and assorted bugs when sorting or querying a RLMArray returned - from a query. -* Notifications are no longer sent when initializing new RLMRealm instances on background - threads. -* Handle object cycles in -[RLMObject description] and -[RLMArray description]. -* Lowered the deployment target for the Xcode 6 projects and Swift examples to - iOS 7.0, as they didn't actually require 8.0. -* Support setting model properties starting with the letter 'z' -* Fixed crashes that could result from switching between Debug and Relase - builds of Realm. - -0.83.0 Release notes (2014-08-13) -============================================================= - -### API breaking changes - -* Realm-Xcode6.xcodeproj now only builds using Xcode6-Beta5. -* Properties to be persisted in Swift classes must be explicitly declared as `dynamic`. -* Subclasses of RLMObject subclasses now throw an exception on startup, rather - than when added to a Realm. - -### Enhancements - -* Add support for querying for nil object properties. -* Improve error message when specifying invalid literals when creating or - initializing RLMObjects. -* Throw an exception when an RLMObject is used from the incorrect thread rather - than crashing in confusing ways. -* Speed up RLMRealm instantiation and array property iteration. -* Allow array and objection relation properties to be missing or null when - creating a RLMObject from a NSDictionary. - -### Bugfixes - -* Fixed a memory leak when querying for objects. -* Fixed initializing array properties on standalone Swift RLMObject subclasses. -* Fix for queries on 64bit integers. - -0.82.0 Release notes (2014-08-05) -============================================================= - -### API breaking changes - -* Realm-Xcode6.xcodeproj now only builds using Xcode6-Beta4. - -### Enhancements - -* Updating to core library version 0.80.5. -* Now support disabling the `autorefresh` property on RLMRealm instances. -* Building Realm-Xcode6 for iOS now builds a universal framework for Simulator & Device. -* Using NSNumber properties (unsupported) now throws a more informative exception. -* Added `[RLMRealm defaultRealmPath]` -* Proper implementation for [RLMArray indexOfObjectWhere:] -* The default Realm path on OS X is now ~/Library/Application Support/[bundle - identifier]/default.realm rather than ~/Documents -* We now check that the correct framework (ios or osx) is used at compile time. - -### Bugfixes - -* Fixed rapid growth of the realm file size. -* Fixed a bug which could cause a crash during RLMArray destruction after a query. -* Fixed bug related to querying on float properties: `floatProperty = 1.7` now works. -* Fixed potential bug related to the handling of array properties (RLMArray). -* Fixed bug where array properties accessed the wrong property. -* Fixed bug that prevented objects with custom getters to be added to a Realm. -* Fixed a bug where initializing a standalone object with an array literal would - trigger an exception. -* Clarified exception messages when using unsupported NSPredicate operators. -* Clarified exception messages when using unsupported property types on RLMObject subclasses. -* Fixed a memory leak when breaking out of a for-in loop on RLMArray. -* Fixed a memory leak when removing objects from a RLMArray property. -* Fixed a memory leak when querying for objects. - - -0.81.0 Release notes (2014-07-22) -============================================================= - -### API breaking changes - -* None. - -### Enhancements - -* Updating to core library version 0.80.3. -* Added support for basic querying of RLMObject and RLMArray properties (one-to-one and one-to-many relationships). - e.g. `[Person objectsWhere:@"dog.name == 'Alfonso'"]` or `[Person objectsWhere:@"ANY dogs.name == 'Alfonso'"]` - Supports all normal operators for numeric and date types. Does not support NSData properties or `BEGINSWITH`, `ENDSWITH`, `CONTAINS` - and other options for string properties. -* Added support for querying for object equality in RLMObject and RLMArray properties (one-to-one and one-to-many relationships). - e.g. `[Person objectsWhere:@"dog == %@", myDog]` `[Person objectsWhere:@"ANY dogs == %@", myDog]` `[Person objectsWhere:@"ANY friends.dog == %@", dog]` - Only supports comparing objects for equality (i.e. ==) -* Added a helper method to RLMRealm to perform a block inside a transaction. -* OSX framework now supported in CocoaPods. - -### Bugfixes - -* Fixed Unicode support in property names and string contents (Chinese, Russian, etc.). Closing #612 and #604. -* Fixed bugs related to migration when properties are removed. -* Fixed keyed subscripting for standalone RLMObjects. -* Fixed bug related to double clicking on a .realm file to launch the Realm Browser (thanks to Dean Moore). - - -0.80.0 Release notes (2014-07-15) -============================================================= - -### API breaking changes - -* Rename migration methods to -migrateDefaultRealmWithBlock: and -migrateRealmAtPath:withBlock: -* Moved Realm specific query methods from RLMRealm to class methods on RLMObject (-allObjects: to +allObjectsInRealm: ect.) - -### Enhancements - -* Added +createInDefaultRealmWithObject: method to RLMObject. -* Added support for array and object literals when calling -createWithObject: and -initWithObject: variants. -* Added method -deleteObjects: to batch delete objects from a Realm -* Support for defining RLMObject models entirely in Swift (experimental, see known issues). -* RLMArrays in Swift support Sequence-style enumeration (for obj in array). -* Implemented -indexOfObject: for RLMArray - -### Known Issues for Swift-defined models - -* Properties other than String, NSData and NSDate require a default value in the model. This can be an empty (but typed) array for array properties. -* The previous caveat also implies that not all models defined in Objective-C can be used for object properties. Only Objective-C models with only implicit (i.e. primitives) or explicit default values can be used. However, any Objective-C model object can be used in a Swift array property. -* Array property accessors don't work until its parent object has been added to a realm. -* Realm-Bridging-Header.h is temporarily exposed as a public header. This is temporary and will be private again once rdar://17633863 is fixed. -* Does not leverage Swift generics and still uses RLM-prefix everywhere. This is coming in #549. - - -0.22.0 Release notes -============================================================= - -### API breaking changes - -* Rename schemaForObject: to schemaForClassName: on RLMSchema -* Removed -objects:where: and -objects:orderedBy:where: from RLMRealm -* Removed -indexOfObjectWhere:, -objectsWhere: and -objectsOrderedBy:where: from RLMArray -* Removed +objectsWhere: and +objectsOrderedBy:where: from RLMObject - -### Enhancements - -* New Xcode 6 project for experimental swift support. -* New Realm Editor app for reading and editing Realm db files. -* Added support for migrations. -* Added support for RLMArray properties on objects. -* Added support for creating in-memory default Realm. -* Added -objectsWithClassName:predicateFormat: and -objectsWithClassName:predicate: to RLMRealm -* Added -indexOfObjectWithPredicateFormat:, -indexOfObjectWithPredicate:, -objectsWithPredicateFormat:, -objectsWithPredi -* Added +objectsWithPredicateFormat: and +objectsWithPredicate: to RLMObject -* Now allows predicates comparing two object properties of the same type. - - -0.20.0 Release notes (2014-05-28) -============================================================= - -Completely rewritten to be much more object oriented. - -### API breaking changes - -* Everything - -### Enhancements - -* None. - -### Bugfixes - -* None. - - -0.11.0 Release notes (not released) -============================================================= - -The Objective-C API has been updated and your code will break! - -### API breaking changes - -* `RLMTable` objects can only be created with an `RLMRealm` object. -* Renamed `RLMContext` to `RLMTransactionManager` -* Renamed `RLMContextDidChangeNotification` to `RLMRealmDidChangeNotification` -* Renamed `contextWithDefaultPersistence` to `managerForDefaultRealm` -* Renamed `contextPersistedAtPath:` to `managerForRealmWithPath:` -* Renamed `realmWithDefaultPersistence` to `defaultRealm` -* Renamed `realmWithDefaultPersistenceAndInitBlock` to `defaultRealmWithInitBlock` -* Renamed `find:` to `firstWhere:` -* Renamed `where:` to `allWhere:` -* Renamed `where:orderBy:` to `allWhere:orderBy:` - -### Enhancements - -* Added `countWhere:` on `RLMTable` -* Added `sumOfColumn:where:` on `RLMTable` -* Added `averageOfColumn:where:` on `RLMTable` -* Added `minOfProperty:where:` on `RLMTable` -* Added `maxOfProperty:where:` on `RLMTable` -* Added `toJSONString` on `RLMRealm`, `RLMTable` and `RLMView` -* Added support for `NOT` operator in predicates -* Added support for default values -* Added validation support in `createInRealm:withObject:` - -### Bugfixes - -* None. - - -0.10.0 Release notes (2014-04-23) -============================================================= - -TightDB is now Realm! The Objective-C API has been updated -and your code will break! - -### API breaking changes - -* All references to TightDB have been changed to Realm. -* All prefixes changed from `TDB` to `RLM`. -* `TDBTransaction` and `TDBSmartContext` have merged into `RLMRealm`. -* Write transactions now take an optional rollback parameter (rather than needing to return a boolean). -* `addColumnWithName:` and variant methods now return the index of the newly created column if successful, `NSNotFound` otherwise. - -### Enhancements - -* `createTableWithName:columns:` has been added to `RLMRealm`. -* Added keyed subscripting for RLMTable's first column if column is of type RLMPropertyTypeString. -* `setRow:atIndex:` has been added to `RLMTable`. -* `RLMRealm` constructors now have variants that take an writable initialization block -* New object interface - tables created/retrieved using `tableWithName:objectClass:` return custom objects - -### Bugfixes - -* None. - - -0.6.0 Release notes (2014-04-11) -============================================================= - -### API breaking changes - -* `contextWithPersistenceToFile:error:` renamed to `contextPersistedAtPath:error:` in `TDBContext` -* `readWithBlock:` renamed to `readUsingBlock:` in `TDBContext` -* `writeWithBlock:error:` renamed to `writeUsingBlock:error:` in `TDBContext` -* `readTable:withBlock:` renamed to `readTable:usingBlock:` in `TDBContext` -* `writeTable:withBlock:error:` renamed to `writeTable:usingBlock:error:` in `TDBContext` -* `findFirstRow` renamed to `indexOfFirstMatchingRow` on `TDBQuery`. -* `findFirstRowFromIndex:` renamed to `indexOfFirstMatchingRowFromIndex:` on `TDBQuery`. -* Return `NSNotFound` instead of -1 when appropriate. -* Renamed `castClass` to `castToTytpedTableClass` on `TDBTable`. -* `removeAllRows`, `removeRowAtIndex`, `removeLastRow`, `addRow` and `insertRow` methods - on table now return void instead of BOOL. - -### Enhancements -* A `TDBTable` can now be queried using `where:` and `where:orderBy:` taking - `NSPredicate` and `NSSortDescriptor` as arguments. -* Added `find:` method on `TDBTable` to find first row matching predicate. -* `contextWithDefaultPersistence` class method added to `TDBContext`. Will create a context persisted - to a file in app/documents folder. -* `renameColumnWithIndex:to:` has been added to `TDBTable`. -* `distinctValuesInColumnWithIndex` has been added to `TDBTable`. -* `dateIsBetween::`, `doubleIsBetween::`, `floatIsBetween::` and `intIsBetween::` - have been added to `TDBQuery`. -* Column names in Typed Tables can begin with non-capital letters too. The generated `addX` - selector can look odd. For example, a table with one column with name `age`, - appending a new row will look like `[table addage:7]`. -* Mixed typed values are better validated when rows are added, inserted, - or modified as object literals. -* `addRow`, `insertRow`, and row updates can be done using objects - derived from `NSObject`. -* `where` has been added to `TDBView`and `TDBViewProtocol`. -* Adding support for "smart" contexts (`TDBSmartContext`). - -### Bugfixes - -* Modifications of a `TDBView` and `TDBQuery` now throw an exception in a readtransaction. - - -0.5.0 Release notes (2014-04-02) -============================================================= - -The Objective-C API has been updated and your code will break! -Of notable changes a fast interface has been added. -This interface includes specific methods to get and set values into Tightdb. -To use these methods import ``. - -### API breaking changes - -* `getTableWithName:` renamed to `tableWithName:` in `TDBTransaction`. -* `addColumnWithName:andType:` renamed to `addColumnWithName:type:` in `TDBTable`. -* `columnTypeOfColumn:` renamed to `columnTypeOfColumnWithIndex` in `TDBTable`. -* `columnNameOfColumn:` renamed to `nameOfColumnWithIndex:` in `TDBTable`. -* `addColumnWithName:andType:` renamed to `addColumnWithName:type:` in `TDBDescriptor`. -* Fast getters and setters moved from `TDBRow.h` to `TDBRowFast.h`. - -### Enhancements - -* Added `minDateInColumnWithIndex` and `maxDateInColumnWithIndex` to `TDBQuery`. -* Transactions can now be started directly on named tables. -* You can create dynamic tables with initial schema. -* `TDBTable` and `TDBView` now have a shared protocol so they can easier be used interchangeably. - -### Bugfixes - -* Fixed bug in 64 bit iOS when inserting BOOL as NSNumber. - - -0.4.0 Release notes (2014-03-26) -============================================================= - -### API breaking changes - -* Typed interface Cursor has now been renamed to Row. -* TDBGroup has been renamed to TDBTransaction. -* Header files are renamed so names match class names. -* Underscore (_) removed from generated typed table classes. -* TDBBinary has been removed; use NSData instead. -* Underscope (_) removed from generated typed table classes. -* Constructor for TDBContext has been renamed to contextWithPersistenceToFile: -* Table findFirstRow and min/max/sum/avg operations has been hidden. -* Table.appendRow has been renamed to addRow. -* getOrCreateTable on Transaction has been removed. -* set*:inColumnWithIndex:atRowIndex: methods have been prefixed with TDB -* *:inColumnWithIndex:atRowIndex: methods have been prefixed with TDB -* addEmptyRow on table has been removed. Use [table addRow:nil] instead. -* TDBMixed removed. Use id and NSObject instead. -* insertEmptyRow has been removed from table. Use insertRow:nil atIndex:index instead. - -#### Enhancements - -* Added firstRow, lastRow selectors on view. -* firstRow and lastRow on table now return nil if table is empty. -* getTableWithName selector added on group. -* getting and creating table methods on group no longer take error argument. -* [TDBQuery parent] and [TDBQuery subtable:] selectors now return self. -* createTable method added on Transaction. Throws exception if table with same name already exists. -* Experimental support for pinning transactions on Context. -* TDBView now has support for object subscripting. - -### Bugfixes - -* None. - - -0.3.0 Release notes (2014-03-14) -============================================================= - -The Objective-C API has been updated and your code will break! - -### API breaking changes - -* Most selectors have been renamed in the binding! -* Prepend TDB-prefix on all classes and types. - -### Enhancements - -* Return types and parameters changed from size_t to NSUInteger. -* Adding setObject to TightdbTable (t[2] = @[@1, @"Hello"] is possible). -* Adding insertRow to TightdbTable. -* Extending appendRow to accept NSDictionary. - -### Bugfixes - -* None. - - -0.2.0 Release notes (2014-03-07) -============================================================= - -The Objective-C API has been updated and your code will break! - -### API breaking changes - -* addRow renamed to addEmptyRow - -### Enhancements - -* Adding a simple class for version numbering. -* Adding get-version and set-version targets to build.sh. -* tableview now supports sort on column with column type bool, date and int -* tableview has method for checking the column type of a specified column -* tableview has method for getting the number of columns -* Adding methods getVersion, getCoreVersion and isAtLeast. -* Adding appendRow to TightdbTable. -* Adding object subscripting. -* Adding method removeColumn on table. - -### Bugfixes - -* None. diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/NSError+RLMSync.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/NSError+RLMSync.h deleted file mode 100644 index 5ef323a24..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/NSError+RLMSync.h +++ /dev/null @@ -1,46 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2017 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@class RLMSyncErrorActionToken; - -/// NSError category extension providing methods to get data out of Realm's -/// "client reset" error. -@interface NSError (RLMSync) - -/** - Given an appropriate Atlas App Services error, return the token that - can be passed into `+[RLMSyncSession immediatelyHandleError:]` to - immediately perform error clean-up work, or nil if the error isn't of - a type that provides a token. - */ -- (nullable RLMSyncErrorActionToken *)rlmSync_errorActionToken NS_REFINED_FOR_SWIFT; - -/** - Given an Atlas App Services client reset error, return the path where the - backup copy of the Realm will be placed once the client reset process is - complete. - */ -- (nullable NSString *)rlmSync_clientResetBackedUpRealmPath NS_SWIFT_UNAVAILABLE(""); - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMAPIKeyAuth.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMAPIKeyAuth.h deleted file mode 100644 index 642bdd95d..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMAPIKeyAuth.h +++ /dev/null @@ -1,95 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMUserAPIKey, RLMObjectId; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// Provider client for user API keys. -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMAPIKeyAuth : RLMProviderClient - -/// A block type used to report an error -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMAPIKeyAuthOptionalErrorBlock)(NSError * _Nullable); - -/// A block type used to return an `RLMUserAPIKey` on success, or an `NSError` on failure -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMOptionalUserAPIKeyBlock)(RLMUserAPIKey * _Nullable, NSError * _Nullable); - -/// A block type used to return an array of `RLMUserAPIKey` on success, or an `NSError` on failure -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMUserAPIKeysBlock)(NSArray * _Nullable, NSError * _Nullable); - -/** - Creates a user API key that can be used to authenticate as the current user. - - @param name The name of the API key to be created. - @param completion A callback to be invoked once the call is complete. -*/ -- (void)createAPIKeyWithName:(NSString *)name - completion:(RLMOptionalUserAPIKeyBlock)completion NS_SWIFT_NAME(createAPIKey(named:completion:)); - -/** - Fetches a user API key associated with the current user. - - @param objectId The ObjectId of the API key to fetch. - @param completion A callback to be invoked once the call is complete. - */ -- (void)fetchAPIKey:(RLMObjectId *)objectId - completion:(RLMOptionalUserAPIKeyBlock)completion; - -/** - Fetches the user API keys associated with the current user. - - @param completion A callback to be invoked once the call is complete. - */ -- (void)fetchAPIKeysWithCompletion:(RLMUserAPIKeysBlock)completion; - -/** - Deletes a user API key associated with the current user. - - @param objectId The ObjectId of the API key to delete. - @param completion A callback to be invoked once the call is complete. - */ -- (void)deleteAPIKey:(RLMObjectId *)objectId - completion:(RLMAPIKeyAuthOptionalErrorBlock)completion; - -/** - Enables a user API key associated with the current user. - - @param objectId The ObjectId of the API key to enable. - @param completion A callback to be invoked once the call is complete. - */ -- (void)enableAPIKey:(RLMObjectId *)objectId - completion:(RLMAPIKeyAuthOptionalErrorBlock)completion; - -/** - Disables a user API key associated with the current user. - - @param objectId The ObjectId of the API key to disable. - @param completion A callback to be invoked once the call is complete. - */ -- (void)disableAPIKey:(RLMObjectId *)objectId - completion:(RLMAPIKeyAuthOptionalErrorBlock)completion; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMApp.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMApp.h deleted file mode 100644 index 2228232e8..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMApp.h +++ /dev/null @@ -1,235 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@protocol RLMNetworkTransport, RLMBSON; - -@class RLMUser, RLMCredentials, RLMSyncManager, RLMEmailPasswordAuth, RLMPushClient, RLMSyncTimeoutOptions; - -/// A block type used for APIs which asynchronously vend an `RLMUser`. -typedef void(^RLMUserCompletionBlock)(RLMUser * _Nullable, NSError * _Nullable); - -/// A block type used to report an error -typedef void(^RLMOptionalErrorBlock)(NSError * _Nullable); - -#pragma mark RLMAppConfiguration - -/// Properties representing the configuration of a client -/// that communicate with a particular Realm application. -@interface RLMAppConfiguration : NSObject - -/// A custom base URL to request against. -@property (nonatomic, strong, nullable) NSString *baseURL; - -/// The custom transport for network calls to the server. -@property (nonatomic, strong, nullable) id transport; - -/// :nodoc: -@property (nonatomic, strong, nullable) NSString *localAppName - __attribute__((deprecated("This field is not used"))); -/// :nodoc: -@property (nonatomic, strong, nullable) NSString *localAppVersion - __attribute__((deprecated("This field is not used"))); - -/// The default timeout for network requests. -@property (nonatomic, assign) NSUInteger defaultRequestTimeoutMS; - -/// If enabled (the default), a single connection is used for all Realms opened -/// with a single sync user. If disabled, a separate connection is used for each -/// Realm. -/// -/// Session multiplexing reduces resources used and typically improves -/// performance. When multiplexing is enabled, the connection is not immediately -/// closed when the last session is closed, and instead remains open for -/// ``RLMSyncTimeoutOptions.connectionLingerTime`` milliseconds (30 seconds by -/// default). -@property (nonatomic, assign) BOOL enableSessionMultiplexing; - -/** - Options for the assorted types of connection timeouts for sync connections. - - If nil default values for all timeouts are used instead. - */ -@property (nonatomic, nullable, copy) RLMSyncTimeoutOptions *syncTimeouts; - -/// :nodoc: -- (instancetype)initWithBaseURL:(nullable NSString *)baseURL - transport:(nullable id)transport - localAppName:(nullable NSString *)localAppName - localAppVersion:(nullable NSString *)localAppVersion -__attribute__((deprecated("localAppName and localAppVersion are unused"))); - -/// :nodoc: -- (instancetype)initWithBaseURL:(nullable NSString *) baseURL - transport:(nullable id)transport - localAppName:(nullable NSString *)localAppName - localAppVersion:(nullable NSString *)localAppVersion - defaultRequestTimeoutMS:(NSUInteger)defaultRequestTimeoutMS -__attribute__((deprecated("localAppName and localAppVersion are unused"))); - -/** -Create a new Realm App configuration. - -@param baseURL A custom base URL to request against. -@param transport A custom network transport. -*/ -- (instancetype)initWithBaseURL:(nullable NSString *)baseURL - transport:(nullable id)transport; - -/** - Create a new Realm App configuration. - - @param baseURL A custom base URL to request against. - @param transport A custom network transport. - @param defaultRequestTimeoutMS A custom default timeout for network requests. - */ -- (instancetype)initWithBaseURL:(nullable NSString *) baseURL - transport:(nullable id)transport - defaultRequestTimeoutMS:(NSUInteger)defaultRequestTimeoutMS; - -@end - -#pragma mark RLMApp - -/** - The `RLMApp` has the fundamental set of methods for communicating with a Realm - application backend. - - This interface provides access to login and authentication. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // internally thread-safe -@interface RLMApp : NSObject - -/// The configuration for this Realm app. -@property (nonatomic, readonly) RLMAppConfiguration *configuration; - -/// The `RLMSyncManager` for this Realm app. -@property (nonatomic, readonly) RLMSyncManager *syncManager; - -/// Get a dictionary containing all users keyed on id. -@property (nonatomic, readonly) NSDictionary *allUsers; - -/// Get the current user logged into the Realm app. -@property (nonatomic, readonly, nullable) RLMUser *currentUser; - -/// The app ID for this Realm app. -@property (nonatomic, readonly) NSString *appId; - -/** - A client for the email/password authentication provider which - can be used to obtain a credential for logging in. - - Used to perform requests specifically related to the email/password provider. -*/ -@property (nonatomic, readonly) RLMEmailPasswordAuth *emailPasswordAuth; - -/** - Get an application with a given appId and configuration. - - @param appId The unique identifier of your Realm app. - */ -+ (instancetype)appWithId:(NSString *)appId; - -/** - Get an application with a given appId and configuration. - - @param appId The unique identifier of your Realm app. - @param configuration A configuration object to configure this client. - */ -+ (instancetype)appWithId:(NSString *)appId - configuration:(nullable RLMAppConfiguration *)configuration; - -/** - Login to a user for the Realm app. - - @param credentials The credentials identifying the user. - @param completion A callback invoked after completion. - */ -- (void)loginWithCredential:(RLMCredentials *)credentials - completion:(RLMUserCompletionBlock)completion NS_REFINED_FOR_SWIFT; - -/** - Switches the active user to the specified user. - - This sets which user is used by all RLMApp operations which require a user. This is a local operation which does not access the network. - An exception will be throw if the user is not valid. The current user will remain logged in. - - @param syncUser The user to switch to. - @returns The user you intend to switch to - */ -- (RLMUser *)switchToUser:(RLMUser *)syncUser; - -/** - A client which can be used to register devices with the server to receive push notificatons - */ -- (RLMPushClient *)pushClientWithServiceName:(NSString *)serviceName - NS_SWIFT_NAME(pushClient(serviceName:)); - -/** - RLMApp instances are cached internally by Realm and cannot be created directly. - - Use `+[RLMRealm appWithId]` or `+[RLMRealm appWithId:configuration:]` - to obtain a reference to an RLMApp. - */ -- (instancetype)init __attribute__((unavailable("Use +appWithId or appWithId:configuration:."))); - -/** -RLMApp instances are cached internally by Realm and cannot be created directly. - -Use `+[RLMRealm appWithId]` or `+[RLMRealm appWithId:configuration:]` -to obtain a reference to an RLMApp. -*/ -+ (instancetype)new __attribute__((unavailable("Use +appWithId or appWithId:configuration:."))); - -@end - -#pragma mark - Sign In With Apple Extension - -API_AVAILABLE(ios(13.0), macos(10.15), tvos(13.0), watchos(6.0)) -/// Use this delegate to be provided a callback once authentication has succeed or failed -@protocol RLMASLoginDelegate - -/// Callback that is invoked should the authentication fail. -/// @param error An error describing the authentication failure. -- (void)authenticationDidFailWithError:(NSError *)error NS_SWIFT_NAME(authenticationDidComplete(error:)); - -/// Callback that is invoked should the authentication succeed. -/// @param user The newly authenticated user. -- (void)authenticationDidCompleteWithUser:(RLMUser *)user NS_SWIFT_NAME(authenticationDidComplete(user:)); - -@end - -API_AVAILABLE(ios(13.0), macos(10.15), tvos(13.0), watchos(6.0)) -/// Category extension that deals with Sign In With Apple authentication. -/// This is only available on OS's that support `AuthenticationServices` -@interface RLMApp (ASLogin) - -/// Use this delegate to be provided a callback once authentication has succeed or failed. -@property (nonatomic, weak, nullable) id authorizationDelegate; - -/// Sets the ASAuthorizationControllerDelegate to be handled by `RLMApp` -/// @param controller The ASAuthorizationController in which you want `RLMApp` to consume its delegate. -- (void)setASAuthorizationControllerDelegateForController:(ASAuthorizationController *)controller NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMArray.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMArray.h deleted file mode 100644 index b2c6c1664..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMArray.h +++ /dev/null @@ -1,652 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObject, RLMResults; - -/** - `RLMArray` is the container type in Realm used to define to-many relationships. - - Unlike an `NSArray`, `RLMArray`s hold a single type, specified by the `objectClassName` property. - This is referred to in these docs as the “type” of the array. - - When declaring an `RLMArray` property, the type must be marked as conforming to a - protocol by the same name as the objects it should contain (see the - `RLM_COLLECTION_TYPE` macro). In addition, the property can be declared using Objective-C - generics for better compile-time type safety. - - RLM_COLLECTION_TYPE(ObjectType) - ... - @property RLMArray *arrayOfObjectTypes; - - `RLMArray`s can be queried with the same predicates as `RLMObject` and `RLMResult`s. - - `RLMArray`s cannot be created directly. `RLMArray` properties on `RLMObject`s are - lazily created when accessed, or can be obtained by querying a Realm. - - ### Key-Value Observing - - `RLMArray` supports array key-value observing on `RLMArray` properties on `RLMObject` - subclasses, and the `invalidated` property on `RLMArray` instances themselves is - key-value observing compliant when the `RLMArray` is attached to a managed - `RLMObject` (`RLMArray`s on unmanaged `RLMObject`s will never become invalidated). - - Because `RLMArray`s are attached to the object which they are a property of, they - do not require using the mutable collection proxy objects from - `-mutableArrayValueForKey:` or KVC-compatible mutation methods on the containing - object. Instead, you can call the mutation methods on the `RLMArray` directly. - */ - -@interface RLMArray : NSObject - -#pragma mark - Properties - -/** - The number of objects in the array. - */ -@property (nonatomic, readonly, assign) NSUInteger count; - -/** - The type of the objects in the array. - */ -@property (nonatomic, readonly, assign) RLMPropertyType type; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readonly, getter = isOptional) BOOL optional; - -/** - The class name of the objects contained in the array. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages the array. Returns `nil` for unmanaged arrays. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - Indicates if the array can no longer be accessed. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if the array is frozen. - - Frozen arrays are immutable and can be accessed from any thread. Frozen arrays - are created by calling `-freeze` on a managed live array. Unmanaged arrays are - never frozen. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Accessing Objects from an Array - -/** - Returns the object at the index specified. - - @param index The index to look up. - - @return An object of the type contained in the array. - */ -- (RLMObjectType)objectAtIndex:(NSUInteger)index; - -/** - Returns an array containing the objects in the array at the indexes specified by a given index set. - `nil` will be returned if the index set contains an index out of the arrays bounds. - - @param indexes The indexes in the array to retrieve objects from. - - @return The objects at the specified indexes. - */ -- (nullable NSArray *)objectsAtIndexes:(NSIndexSet *)indexes; - -/** - Returns the first object in the array. - - Returns `nil` if called on an empty array. - - @return An object of the type contained in the array. - */ -- (nullable RLMObjectType)firstObject; - -/** - Returns the last object in the array. - - Returns `nil` if called on an empty array. - - @return An object of the type contained in the array. - */ -- (nullable RLMObjectType)lastObject; - - - -#pragma mark - Adding, Removing, and Replacing Objects in an Array - -/** - Adds an object to the end of the array. - - @warning This method may only be called during a write transaction. - - @param object An object of the type contained in the array. - */ -- (void)addObject:(RLMObjectType)object; - -/** - Adds an array of objects to the end of the array. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable object such as `NSArray` or `RLMResults` which contains objects of the - same class as the array. - */ -- (void)addObjects:(id)objects; - -/** - Inserts an object at the given index. - - Throws an exception if the index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param anObject An object of the type contained in the array. - @param index The index at which to insert the object. - */ -- (void)insertObject:(RLMObjectType)anObject atIndex:(NSUInteger)index; - -/** - Removes an object at the given index. - - Throws an exception if the index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param index The array index identifying the object to be removed. - */ -- (void)removeObjectAtIndex:(NSUInteger)index; - -/** - Removes the last object in the array. - - This is a no-op if the array is already empty. - - @warning This method may only be called during a write transaction. -*/ -- (void)removeLastObject; - -/** - Removes all objects from the array. - - @warning This method may only be called during a write transaction. - */ -- (void)removeAllObjects; - -/** - Replaces an object at the given index with a new object. - - Throws an exception if the index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param index The index of the object to be replaced. - @param anObject An object (of the same type as returned from the `objectClassName` selector). - */ -- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(RLMObjectType)anObject; - -/** - Moves the object at the given source index to the given destination index. - - Throws an exception if the index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param sourceIndex The index of the object to be moved. - @param destinationIndex The index to which the object at `sourceIndex` should be moved. - */ -- (void)moveObjectAtIndex:(NSUInteger)sourceIndex toIndex:(NSUInteger)destinationIndex; - -/** - Exchanges the objects in the array at given indices. - - Throws an exception if either index exceeds the bounds of the array. - - @warning This method may only be called during a write transaction. - - @param index1 The index of the object which should replace the object at index `index2`. - @param index2 The index of the object which should replace the object at index `index1`. - */ -- (void)exchangeObjectAtIndex:(NSUInteger)index1 withObjectAtIndex:(NSUInteger)index2; - -#pragma mark - Querying an Array - -/** - Returns the index of an object in the array. - - Returns `NSNotFound` if the object is not found in the array. - - @param object An object (of the same type as returned from the `objectClassName` selector). - */ -- (NSUInteger)indexOfObject:(RLMObjectType)object; - -/** - Returns the index of the first object in the array matching the predicate. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return The index of the object, or `NSNotFound` if the object is not found in the array. - */ -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns the index of the first object in the array matching the predicate. - - @param predicate The predicate with which to filter the objects. - - @return The index of the object, or `NSNotFound` if the object is not found in the array. - */ -- (NSUInteger)indexOfObjectWithPredicate:(NSPredicate *)predicate; - -/** - Returns all the objects matching the given predicate in the array. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` of objects that match the given predicate. - */ -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all the objects matching the given predicate in the array. - - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` of objects that match the given predicate - */ -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/** - Returns a sorted `RLMResults` from the array. - - @param keyPath The key path to sort by. - @param ascending The direction to sort in. - - @return An `RLMResults` sorted by the specified key path. - */ -- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a sorted `RLMResults` from the array. - - @param properties An array of `RLMSortDescriptor`s to sort by. - - @return An `RLMResults` sorted by the specified properties. - */ -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/** - Returns a distinct `RLMResults` from the array. - - @param keyPaths The key paths to distinct on. - - @return An `RLMResults` with the distinct values of the keypath(s). - */ -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -/// :nodoc: -- (RLMObjectType)objectAtIndexedSubscript:(NSUInteger)index; - -/// :nodoc: -- (void)setObject:(RLMObjectType)newValue atIndexedSubscript:(NSUInteger)index; - -#pragma mark - Sectioning an Array - -/** - Sorts and sections this collection from a given property key path, returning the result - as an instance of `RLMSectionedResults`. - - @param keyPath The property key path to sort on. - @param ascending The direction to sort in. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsSortedUsingKeyPath:(NSString *)keyPath - ascending:(BOOL)ascending - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -/** - Sorts and sections this collection from a given array of sort descriptors, returning the result - as an instance of `RLMSectionedResults`. - - @param sortDescriptors An array of `RLMSortDescriptor`s to sort by. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @note The primary sort descriptor must be responsible for determining the section key. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsUsingSortDescriptors:(NSArray *)sortDescriptors - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - - -#pragma mark - Notifications - -/** - Registers a block to be called each time the array changes. - - The block will be asynchronously called with the initial array, and then - called again after each write transaction which changes any of the objects in - the array, which objects are in the results, or the order of the objects in the - array. - - The `changes` parameter will be `nil` the first time the block is called. For - each call after that, it will contain information about which rows in the - array were added, removed or modified. If a write transaction did not modify - any objects in the array, the block is not called at all. See the - `RLMCollectionChange` documentation for information on how the changes are - reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - Person *person = [[Person allObjectsInRealm:realm] firstObject]; - NSLog(@"person.dogs.count: %zu", person.dogs.count); // => 0 - self.token = [person.dogs addNotificationBlock(RLMArray *dogs, - RLMCollectionChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count) // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - [person.dogs addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a non-frozen managed array. - - @param block The block to be called each time the array changes. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMArray *_Nullable array, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the array changes. - - The block will be asynchronously called with the initial array, and then - called again after each write transaction which changes any of the objects in - the array, which objects are in the results, or the order of the objects in the - array. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the array were added, removed or modified. If a write transaction - did not modify any objects in the array, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMArray *_Nullable array, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the array changes. - - The block will be asynchronously called with the initial array, and then - called again after each write transaction which changes any of the objects in - the array, which objects are in the results, or the order of the objects in the - array. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the array were added, removed or modified. If a write transaction - did not modify any objects in the array, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMArray *_Nullable array, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the array changes. - - The block will be asynchronously called with the initial array, and then - called again after each write transaction which changes any of the objects in - the array, which objects are in the results, or the order of the objects in the - array. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the array were added, removed or modified. If a write transaction - did not modify any objects in the array, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMArray *_Nullable array, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths -__attribute__((warn_unused_result)); - -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the objects in the array. - - NSNumber *min = [object.arrayProperty minOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The minimum value of the property, or `nil` if the array is empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects in the array. - - NSNumber *max = [object.arrayProperty maxOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose maximum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The maximum value of the property, or `nil` if the array is empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of the values of a given property over all the objects in the array. - - NSNumber *sum = [object.arrayProperty sumOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose values should be summed. Only properties of - types `int`, `float`, and `double` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects in the array. - - NSNumber *average = [object.arrayProperty averageOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose average value should be calculated. Only - properties of types `int`, `float`, and `double` are supported. - - @return The average value of the given property, or `nil` if the array is empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this array. - - The frozen copy is an immutable array which contains the same data as this - array currently contains, but will not update when writes are made to the - containing Realm. Unlike live arrays, frozen arrays can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a managed array. - @warning Holding onto a frozen array for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -#pragma mark - Unavailable Methods - -/** - `-[RLMArray init]` is not available because `RLMArray`s cannot be created directly. - `RLMArray` properties on `RLMObject`s are lazily created when accessed. - */ -- (instancetype)init __attribute__((unavailable("RLMArrays cannot be created directly"))); - -/** - `+[RLMArray new]` is not available because `RLMArray`s cannot be created directly. - `RLMArray` properties on `RLMObject`s are lazily created when accessed. - */ -+ (instancetype)new __attribute__((unavailable("RLMArrays cannot be created directly"))); - -@end - -/// :nodoc: -@interface RLMArray (Swift) -// for use only in Swift class definitions -- (instancetype)initWithObjectClassName:(NSString *)objectClassName; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMAsymmetricObject.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMAsymmetricObject.h deleted file mode 100644 index 09deb787e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMAsymmetricObject.h +++ /dev/null @@ -1,98 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2022 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectSchema, RLMPropertyDescriptor, RLMRealm; -/** - `RLMAsymmetricObject` is a base class used to define asymmetric Realm objects. - - Asymmetric objects can only be created using the `createInRealm:` - function, and cannot be added, removed or queried. - When created, asymmetric objects will be synced unidirectionally to the MongoDB - database and cannot be accessed locally. - - Linking an asymmetric object within an `Object` is not allowed and will throw an error. - - The property types supported on `RLMAsymmetricObject` are the same as for `RLMObject`, - except for that asymmetric objects can only link to embedded objects, so `RLMObject` - and `RLMArray` properties are not supported (`RLMEmbeddedObject` and - `RLMArray` *are*). - */ -@interface RLMAsymmetricObject : RLMObjectBase - -#pragma mark - Creating & Initializing Objects - -/** - Creates an unmanaged instance of a Realm object. - */ -- (instancetype)init NS_DESIGNATED_INITIALIZER; - -/** - Creates an unmanaged instance of a Realm object. - - Pass in an `NSArray` or `NSDictionary` instance to set the values of the object's properties. - */ -- (instancetype)initWithValue:(id)value; - -/** - Returns the class name for a Realm object subclass. - - @warning Do not override. Realm relies on this method returning the exact class - name. - - @return The class name for the model class. - */ -+ (NSString *)className; - -/** - Creates an Asymmetric object, which will be synced unidirectionally and - cannot be queried locally. - - Objects created using this method will not be added to the Realm. - - @warning This method may only be called during a write transaction. - @warning This method always returns nil. - - @param realm The Realm to be used to create the asymmetric object.. - @param value The value used to populate the object. - - @return Returns `nil` - */ -+ (instancetype)createInRealm:(RLMRealm *)realm withValue:(id)value; - -#pragma mark - Properties - -/** - The object schema which lists the managed properties for the object. - */ -@property (nonatomic, readonly) RLMObjectSchema *objectSchema; - -#pragma mark - Dynamic Accessors - -/// :nodoc: -- (nullable id)objectForKeyedSubscript:(NSString *)key; - -/// :nodoc: -- (void)setObject:(nullable id)obj forKeyedSubscript:(NSString *)key; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMAsyncTask.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMAsyncTask.h deleted file mode 100644 index 9f7dc58da..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMAsyncTask.h +++ /dev/null @@ -1,67 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A task object which can be used to observe or cancel an async open. - - When a synchronized Realm is opened asynchronously, the latest state of the - Realm is downloaded from the server before the completion callback is invoked. - This task object can be used to observe the state of the download or to cancel - it. This should be used instead of trying to observe the download via the sync - session as the sync session itself is created asynchronously, and may not exist - yet when -[RLMRealm asyncOpenWithConfiguration:completion:] returns. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMAsyncOpenTask : NSObject -/** - Register a progress notification block. - - Each registered progress notification block is called whenever the sync - subsystem has new progress data to report until the task is either cancelled - or the completion callback is called. Progress notifications are delivered on - the main queue. - */ -- (void)addProgressNotificationBlock:(RLMProgressNotificationBlock)block; - -/** - Register a progress notification block which is called on the given queue. - - Each registered progress notification block is called whenever the sync - subsystem has new progress data to report until the task is either cancelled - or the completion callback is called. Progress notifications are delivered on - the supplied queue. - */ -- (void)addProgressNotificationOnQueue:(dispatch_queue_t)queue - block:(RLMProgressNotificationBlock)block; - -/** - Cancel the asynchronous open. - - Any download in progress will be cancelled, and the completion block for this - async open will never be called. If multiple async opens on the same Realm are - happening concurrently, all other opens will fail with the error "operation cancelled". - */ -- (void)cancel; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMBSON.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMBSON.h deleted file mode 100644 index 41750fd57..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMBSON.h +++ /dev/null @@ -1,174 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -#pragma mark RLMBSONType - -/** - Allowed BSON types. - */ -typedef NS_ENUM(NSUInteger, RLMBSONType) { - /// BSON Null type - RLMBSONTypeNull, - /// BSON Int32 type - RLMBSONTypeInt32, - /// BSON Int64 type - RLMBSONTypeInt64, - /// BSON Bool type - RLMBSONTypeBool, - /// BSON Double type - RLMBSONTypeDouble, - /// BSON String type - RLMBSONTypeString, - /// BSON Binary type - RLMBSONTypeBinary, - /// BSON Timestamp type - RLMBSONTypeTimestamp, - /// BSON Datetime type - RLMBSONTypeDatetime, - /// BSON ObjectId type - RLMBSONTypeObjectId, - /// BSON Decimal128 type - RLMBSONTypeDecimal128, - /// BSON RegularExpression type - RLMBSONTypeRegularExpression, - /// BSON MaxKey type - RLMBSONTypeMaxKey, - /// BSON MinKey type - RLMBSONTypeMinKey, - /// BSON Document type - RLMBSONTypeDocument, - /// BSON Array type - RLMBSONTypeArray, - /// BSON UUID type - RLMBSONTypeUUID -}; - -#pragma mark RLMBSON - -/** - Protocol representing a BSON value. BSON is a computer data interchange format. - The name "BSON" is based on the term JSON and stands for "Binary JSON". - - The following types conform to RLMBSON: - - `NSNull` - `NSNumber` - `NSString` - `NSData` - `NSDateInterval` - `NSDate` - `RLMObjectId` - `RLMDecimal128` - `NSRegularExpression` - `RLMMaxKey` - `RLMMinKey` - `NSDictionary` - `NSArray` - `NSUUID` - - @see RLMBSONType - @see bsonspec.org - */ -@protocol RLMBSON - -/** - The BSON type for the conforming interface. - */ -@property (readonly) RLMBSONType bsonType NS_REFINED_FOR_SWIFT; - -/** - Whether or not this BSON is equal to another. - - @param other The BSON to compare to - */ -- (BOOL)isEqual:(_Nullable id)other; - -@end - -/// :nodoc: -@interface NSNull (RLMBSON) -@end - -/// :nodoc: -@interface NSNumber (RLMBSON) -@end - -/// :nodoc: -@interface NSString (RLMBSON) -@end - -/// :nodoc: -@interface NSData (RLMBSON) -@end - -/// :nodoc: -@interface NSDateInterval (RLMBSON) -@end - -/// :nodoc: -@interface NSDate (RLMBSON) -@end - -/// :nodoc: -@interface RLMObjectId (RLMBSON) -@end - -/// :nodoc: -@interface RLMDecimal128 (RLMBSON) -@end - -/// :nodoc: -@interface NSRegularExpression (RLMBSON) -@end - -/// MaxKey will always be the greatest value when comparing to other BSON types -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMMaxKey : NSObject -@end - -/// MinKey will always be the smallest value when comparing to other BSON types -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMMinKey : NSObject -@end - -/// :nodoc: -@interface RLMMaxKey (RLMBSON) -@end - -/// :nodoc: -@interface RLMMinKey (RLMBSON) -@end - -/// :nodoc: -@interface NSDictionary (RLMBSON) -@end - -/// :nodoc: -@interface NSMutableArray (RLMBSON) -@end - -/// :nodoc: -@interface NSArray (RLMBSON) -@end - -/// :nodoc: -@interface NSUUID (RLMBSON) -@end diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMCollection.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMCollection.h deleted file mode 100644 index eac117f17..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMCollection.h +++ /dev/null @@ -1,613 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@protocol RLMValue; -@class RLMRealm, RLMResults, RLMSortDescriptor, RLMNotificationToken, RLMCollectionChange, RLMSectionedResults; -typedef RLM_CLOSED_ENUM(int32_t, RLMPropertyType); -/// A callback which is invoked on each element in the Results collection which returns the section key. -typedef id _Nullable(^RLMSectionedResultsKeyBlock)(id); - -/** - A homogenous collection of Realm-managed objects. Examples of conforming types - include `RLMArray`, `RLMSet`, `RLMResults`, and `RLMLinkingObjects`. - */ -@protocol RLMCollection - -#pragma mark - Properties - -/** - The number of objects in the collection. - */ -@property (nonatomic, readonly) NSUInteger count; - -/** - The type of the objects in the collection. - */ -@property (nonatomic, readonly) RLMPropertyType type; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readonly, getter = isOptional) BOOL optional; - -/** - The class name of the objects contained in the collection. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages this collection, if any. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - Indicates if the collection is no longer valid. - - The collection becomes invalid if `invalidate` is called on the managing - Realm. Unmanaged collections are never invalidated. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -#pragma mark - Accessing Objects from a Collection - -/** - Returns the object at the index specified. - - @param index The index to look up. - - @return An object of the type contained in the collection. - */ -- (id)objectAtIndex:(NSUInteger)index; - -@optional - -/** - Returns an array containing the objects in the collection at the indexes - specified by a given index set. `nil` will be returned if the index set - contains an index out of the collections bounds. - - @param indexes The indexes in the collection to retrieve objects from. - - @return The objects at the specified indexes. - */ -- (nullable NSArray *)objectsAtIndexes:(NSIndexSet *)indexes; - -/** - Returns the first object in the collection. - - RLMSet is not ordered, and so for sets this will return an arbitrary object in - the set. It is not guaraneed to be a different object from what `lastObject` - gives even if the set has multiple objects in it. - - Returns `nil` if called on an empty collection. - - @return An object of the type contained in the collection. - */ -- (nullable id)firstObject; - -/** - Returns the last object in the collection. - - RLMSet is not ordered, and so for sets this will return an arbitrary object in - the set. It is not guaraneed to be a different object from what `firstObject` - gives even if the set has multiple objects in it. - - Returns `nil` if called on an empty collection. - - @return An object of the type contained in the collection. - */ -- (nullable id)lastObject; - -/// :nodoc: -- (id)objectAtIndexedSubscript:(NSUInteger)index; - -/** - Returns the index of an object in the collection. - - Returns `NSNotFound` if the object is not found in the collection. - - @param object An object (of the same type as returned from the `objectClassName` selector). - */ -- (NSUInteger)indexOfObject:(id)object; - -/** - Returns the index of the first object in the collection matching the predicate. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return The index of the object, or `NSNotFound` if the object is not found in the collection. - */ -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns the index of the first object in the collection matching the predicate. - - @param predicate The predicate with which to filter the objects. - - @return The index of the object, or `NSNotFound` if the object is not found in the collection. - */ -- (NSUInteger)indexOfObjectWithPredicate:(NSPredicate *)predicate; - -@required - -#pragma mark - Querying a Collection - -/** - Returns all objects matching the given predicate in the collection. - - This is only supported for managed collections. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - @return An `RLMResults` containing objects that match the given predicate. - */ -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all objects matching the given predicate in the collection. - - This is only supported for managed collections. - - @param predicate The predicate with which to filter the objects. - @return An `RLMResults` containing objects that match the given predicate. - */ -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/** - Returns a sorted `RLMResults` from the collection. - - This is only supported for managed collections. - - @param keyPath The keyPath to sort by. - @param ascending The direction to sort in. - @return An `RLMResults` sorted by the specified key path. - */ -- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a sorted `RLMResults` from the collection. - - This is only supported for managed collections. - - @param properties An array of `RLMSortDescriptor`s to sort by. - @return An `RLMResults` sorted by the specified properties. - */ -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/** - Returns a distinct `RLMResults` from the collection. - - This is only supported for managed collections. - - @param keyPaths The key paths used produce distinct results - @return An `RLMResults` made distinct based on the specified key paths - */ -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -/** - Returns an `NSArray` containing the results of invoking `valueForKey:` using - `key` on each of the collection's objects. - - @param key The name of the property. - - @return An `NSArray` containing results. - */ -- (nullable id)valueForKey:(NSString *)key; - -/** - Returns the value for the derived property identified by a given key path. - - @param keyPath A key path of the form relationship.property (with one or more relationships). - - @return The value for the derived property identified by keyPath. - */ -- (nullable id)valueForKeyPath:(NSString *)keyPath; - -/** - Invokes `setValue:forKey:` on each of the collection's objects using the specified `value` and `key`. - - @warning This method may only be called during a write transaction. - - @param value The object value. - @param key The name of the property. - */ -- (void)setValue:(nullable id)value forKey:(NSString *)key; - -#pragma mark - Notifications - -/** -Registers a block to be called each time the collection changes. - -The block will be asynchronously called with the initial collection, -and then called again after each write transaction which changes either any -of the objects in the collection, or which objects are in the collection. - -The `change` parameter will be `nil` the first time the block is called. -For each call after that, it will contain information about -which rows in the collection were added, removed or modified. If a -write transaction did not modify any objects in the results collection, -the block is not called at all. See the `RLMCollectionChange` documentation for -information on how the changes are reported and an example of updating a -`UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - -At the time when the block is called, the collection object will be fully -evaluated and up-to-date, and as long as you do not perform a write transaction -on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will -never perform blocking work. - -Notifications are delivered via the standard run loop, and so can't be -delivered while the run loop is blocked by other activity. When -notifications can't be delivered instantly, multiple notifications may be -coalesced into a single notification. This can include the notification -with the initial results. For example, the following code performs a write -transaction immediately after adding the notification block, so there is no -opportunity for the initial notification to be delivered first. As a -result, the initial notification will reflect the state of the Realm after -the write transaction. - - RLMResults *results = [Dog allObjects]; - NSLog(@"dogs.count: %zu", dogs.count); // => 0 - self.token = [results addNotificationBlock:^(RLMResults *dogs, - RLMCollectionChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - [realm addObject:dog]; - }]; - // end of run loop execution context - -You must retain the returned token for as long as you want updates to continue -to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - -@warning This method cannot be called during a write transaction, or when the - containing Realm is read-only or frozen. - -@param block The block to be called whenever a change occurs. -@return A token which must be held for as long as you want updates to be delivered. -*/ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** -Registers a block to be called each time the collection changes. - -The block will be asynchronously called with the initial collection, -and then called again after each write transaction which changes either any -of the objects in the collection, or which objects are in the collection. - -The `change` parameter will be `nil` the first time the block is called. -For each call after that, it will contain information about -which rows in the collection were added, removed or modified. If a -write transaction did not modify any objects in the results collection, -the block is not called at all. See the `RLMCollectionChange` documentation for -information on how the changes are reported and an example of updating a -`UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - -At the time when the block is called, the collection object will be fully -evaluated and up-to-date, and as long as you do not perform a write transaction -on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will -never perform blocking work. - -Notifications are delivered on the given queue. If the queue is blocked and -notifications can't be delivered instantly, multiple notifications may be -coalesced into a single notification. - -You must retain the returned token for as long as you want updates to continue -to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - -@warning This method cannot be called when the containing Realm is read-only or frozen. -@warning The queue must be a serial queue. - -@param block The block to be called whenever a change occurs. -@param queue The serial queue to deliver notifications to. -@return A token which must be held for as long as you want updates to be delivered. -*/ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** -Registers a block to be called each time the collection changes. - -The block will be asynchronously called with the initial collection, -and then called again after each write transaction which changes either any -of the objects in the collection, or which objects are in the collection. - -The `change` parameter will be `nil` the first time the block is called. -For each call after that, it will contain information about -which rows in the collection were added, removed or modified. If a -write transaction did not modify any objects in the results collection, -the block is not called at all. See the `RLMCollectionChange` documentation for -information on how the changes are reported and an example of updating a -`UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - -At the time when the block is called, the collection object will be fully -evaluated and up-to-date, and as long as you do not perform a write transaction -on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will -never perform blocking work. - -Notifications are delivered on the given queue. If the queue is blocked and -notifications can't be delivered instantly, multiple notifications may be -coalesced into a single notification. - -You must retain the returned token for as long as you want updates to continue -to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - -@warning This method cannot be called when the containing Realm is read-only or frozen. -@warning The queue must be a serial queue. - -@param block The block to be called whenever a change occurs. -@param queue The serial queue to deliver notifications to. -@param keyPaths The block will be called for changes occurring on these keypaths. If no -key paths are given, notifications are delivered for every property key path. -@return A token which must be held for as long as you want updates to be delivered. -*/ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -#pragma mark - Sectioned Results - -/** - Sorts and sections this collection from a given property key path, returning the result - as an instance of `RLMSectionedResults`. - - @param keyPath The property key path to sort on. - @param ascending The direction to sort in. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsSortedUsingKeyPath:(NSString *)keyPath - ascending:(BOOL)ascending - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -/** - Sorts and sections this collection from a given array of sort descriptors, returning the result - as an instance of `RLMSectionedResults`. - - @param sortDescriptors An array of `RLMSortDescriptor`s to sort by. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @note The primary sort descriptor must be responsible for determining the section key. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsUsingSortDescriptors:(NSArray *)sortDescriptors - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the objects - in the collection. - - NSNumber *min = [results minOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The minimum value of the property, or `nil` if the Results are empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects - in the collection. - - NSNumber *max = [results maxOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose maximum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The maximum value of the property, or `nil` if the Results are empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of the values of a given property over all the objects in the collection. - - NSNumber *sum = [results sumOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose values should be summed. Only properties of - types `int`, `float`, and `double` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects in the collection. - - NSNumber *average = [results averageOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose average value should be calculated. Only - properties of types `int`, `float`, and `double` are supported. - - @return The average value of the given property, or `nil` if the Results are empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -#pragma mark - Freeze - -/** - Indicates if the collection is frozen. - - Frozen collections are immutable and can be accessed from any thread. The - objects read from a frozen collection will also be frozen. - */ -@property (nonatomic, readonly, getter=isFrozen) BOOL frozen; - -/** - Returns a frozen (immutable) snapshot of this collection. - - The frozen copy is an immutable collection which contains the same data as - this collection currently contains, but will not update when writes are made - to the containing Realm. Unlike live collections, frozen collections can be - accessed from any thread. - - @warning This method cannot be called during a write transaction, or when the containing Realm is read-only. - @warning Holding onto a frozen collection for an extended period while - performing write transaction on the Realm may result in the Realm - file growing to large sizes. See - `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -@end - -/** - An `RLMSortDescriptor` stores a property name and a sort order for use with - `sortedResultsUsingDescriptors:`. It is similar to `NSSortDescriptor`, but supports - only the subset of functionality which can be efficiently run by Realm's query - engine. - - `RLMSortDescriptor` instances are immutable. - */ -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMSortDescriptor : NSObject - -#pragma mark - Properties - -/** - The key path which the sort descriptor orders results by. - */ -@property (nonatomic, readonly) NSString *keyPath; - -/** - Whether the descriptor sorts in ascending or descending order. - */ -@property (nonatomic, readonly) BOOL ascending; - -#pragma mark - Methods - -/** - Returns a new sort descriptor for the given key path and sort direction. - */ -+ (instancetype)sortDescriptorWithKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a copy of the receiver with the sort direction reversed. - */ -- (instancetype)reversedSortDescriptor; - -@end - -/** - A `RLMCollectionChange` object encapsulates information about changes to collections - that are reported by Realm notifications. - - `RLMCollectionChange` is passed to the notification blocks registered with - `-addNotificationBlock` on `RLMArray` and `RLMResults`, and reports what rows in the - collection changed since the last time the notification block was called. - - The change information is available in two formats: a simple array of row - indices in the collection for each type of change, and an array of index paths - in a requested section suitable for passing directly to `UITableView`'s batch - update methods. A complete example of updating a `UITableView` named `tv`: - - [tv beginUpdates]; - [tv deleteRowsAtIndexPaths:[changes deletionsInSection:0] withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv insertRowsAtIndexPaths:[changes insertionsInSection:0] withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv reloadRowsAtIndexPaths:[changes modificationsInSection:0] withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv endUpdates]; - - All of the arrays in an `RLMCollectionChange` are always sorted in ascending order. - */ -@interface RLMCollectionChange : NSObject -/// The indices of objects in the previous version of the collection which have -/// been removed from this one. -@property (nonatomic, readonly) NSArray *deletions; - -/// The indices in the new version of the collection which were newly inserted. -@property (nonatomic, readonly) NSArray *insertions; - -/** - The indices in the new version of the collection which were modified. - - For `RLMResults`, this means that one or more of the properties of the object at - that index were modified (or an object linked to by that object was - modified). - - For `RLMArray`, the array itself being modified to contain a - different object at that index will also be reported as a modification. - */ -@property (nonatomic, readonly) NSArray *modifications; - -/// Returns the index paths of the deletion indices in the given section. -- (NSArray *)deletionsInSection:(NSUInteger)section; - -/// Returns the index paths of the insertion indices in the given section. -- (NSArray *)insertionsInSection:(NSUInteger)section; - -/// Returns the index paths of the modification indices in the given section. -- (NSArray *)modificationsInSection:(NSUInteger)section; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMConstants.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMConstants.h deleted file mode 100644 index 0bc8db972..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMConstants.h +++ /dev/null @@ -1,156 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#define RLM_HEADER_AUDIT_BEGIN NS_HEADER_AUDIT_BEGIN -#define RLM_HEADER_AUDIT_END NS_HEADER_AUDIT_END - -#define RLM_SWIFT_SENDABLE NS_SWIFT_SENDABLE - -#define RLM_FINAL __attribute__((objc_subclassing_restricted)) - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -// Swift 5 considers NS_ENUM to be "open", meaning there could be values present -// other than the defined cases (which allows adding more cases later without -// it being a breaking change), while older versions consider it "closed". -#ifdef NS_CLOSED_ENUM -#define RLM_CLOSED_ENUM NS_CLOSED_ENUM -#else -#define RLM_CLOSED_ENUM NS_ENUM -#endif - -#if __has_attribute(ns_error_domain) && (!defined(__cplusplus) || !__cplusplus || __cplusplus >= 201103L) -#define RLM_ERROR_ENUM(type, name, domain) \ - _Pragma("clang diagnostic push") \ - _Pragma("clang diagnostic ignored \"-Wignored-attributes\"") \ - NS_ENUM(type, __attribute__((ns_error_domain(domain))) name) \ - _Pragma("clang diagnostic pop") -#else -#define RLM_ERROR_ENUM(type, name, domain) NS_ENUM(type, name) -#endif - -#define RLM_HIDDEN __attribute__((visibility("hidden"))) -#define RLM_VISIBLE __attribute__((visibility("default"))) -#define RLM_HIDDEN_BEGIN _Pragma("GCC visibility push(hidden)") -#define RLM_HIDDEN_END _Pragma("GCC visibility pop") -#define RLM_DIRECT __attribute__((objc_direct)) -#define RLM_DIRECT_MEMBERS __attribute__((objc_direct_members)) - -#pragma mark - Enums - -/** - `RLMPropertyType` is an enumeration describing all property types supported in Realm models. - - For more information, see [Realm Models](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/object-models-and-schemas/). - */ -typedef RLM_CLOSED_ENUM(int32_t, RLMPropertyType) { - -#pragma mark - Primitive types - /** Integers: `NSInteger`, `int`, `long`, `Int` (Swift) */ - RLMPropertyTypeInt = 0, - /** Booleans: `BOOL`, `bool`, `Bool` (Swift) */ - RLMPropertyTypeBool = 1, - /** Floating-point numbers: `float`, `Float` (Swift) */ - RLMPropertyTypeFloat = 5, - /** Double-precision floating-point numbers: `double`, `Double` (Swift) */ - RLMPropertyTypeDouble = 6, - /** NSUUID, UUID */ - RLMPropertyTypeUUID = 12, - -#pragma mark - Object types - - /** Strings: `NSString`, `String` (Swift) */ - RLMPropertyTypeString = 2, - /** Binary data: `NSData` */ - RLMPropertyTypeData = 3, - /** Any type: `id`, `AnyRealmValue` (Swift) */ - RLMPropertyTypeAny = 9, - /** Dates: `NSDate` */ - RLMPropertyTypeDate = 4, - -#pragma mark - Linked object types - - /** Realm model objects. See [Realm Models](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/object-models-and-schemas/) for more information. */ - RLMPropertyTypeObject = 7, - /** Realm linking objects. See [Realm Models](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/relationships/#inverse-relationship) for more information. */ - RLMPropertyTypeLinkingObjects = 8, - - RLMPropertyTypeObjectId = 10, - RLMPropertyTypeDecimal128 = 11 -}; - -#pragma mark - Notification Constants - -/** - A notification indicating that changes were made to a Realm. -*/ -typedef NSString * RLMNotification NS_EXTENSIBLE_STRING_ENUM; - -/** - This notification is posted when a write transaction has been committed to a Realm on a different thread for - the same file. - - It is not posted if `autorefresh` is enabled, or if the Realm is refreshed before the notification has a chance - to run. - - Realms with autorefresh disabled should normally install a handler for this notification which calls - `-[RLMRealm refresh]` after doing some work. Refreshing the Realm is optional, but not refreshing the Realm may lead to - large Realm files. This is because an extra copy of the data must be kept for the stale Realm. - */ -extern RLMNotification const RLMRealmRefreshRequiredNotification NS_SWIFT_NAME(RefreshRequired); - -/** - This notification is posted by a Realm when a write transaction has been - committed to a Realm on a different thread for the same file. - - It is not posted if `-[RLMRealm autorefresh]` is enabled, or if the Realm is - refreshed before the notification has a chance to run. - - Realms with autorefresh disabled should normally install a handler for this - notification which calls `-[RLMRealm refresh]` after doing some work. Refreshing - the Realm is optional, but not refreshing the Realm may lead to large Realm - files. This is because Realm must keep an extra copy of the data for the stale - Realm. - */ -extern RLMNotification const RLMRealmDidChangeNotification NS_SWIFT_NAME(DidChange); - -#pragma mark - Error keys - -/** Key to identify the associated backup Realm configuration in an error's `userInfo` dictionary */ -extern NSString * const RLMBackupRealmConfigurationErrorKey; - -#pragma mark - Other Constants - -/** The schema version used for uninitialized Realms */ -extern const uint64_t RLMNotVersioned; - -/** The corresponding value is the name of an exception thrown by Realm. */ -extern NSString * const RLMExceptionName; - -/** The corresponding value is a Realm file version. */ -extern NSString * const RLMRealmVersionKey; - -/** The corresponding key is the version of the underlying database engine. */ -extern NSString * const RLMRealmCoreVersionKey; - -/** The corresponding key is the Realm invalidated property name. */ -extern NSString * const RLMInvalidatedKey; - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMCredentials.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMCredentials.h deleted file mode 100644 index adff4e7e9..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMCredentials.h +++ /dev/null @@ -1,126 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) -@protocol RLMBSON; - -/// A token representing an identity provider's credentials. -typedef NSString *RLMCredentialsToken; - -/// A type representing the unique identifier of an Atlas App Services identity provider. -typedef NSString *RLMIdentityProvider NS_EXTENSIBLE_STRING_ENUM; - -/// The username/password identity provider. User accounts are handled by Atlas App Services directly without the -/// involvement of a third-party identity provider. -extern RLMIdentityProvider const RLMIdentityProviderUsernamePassword; - -/// A Facebook account as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderFacebook; - -/// A Google account as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderGoogle; - -/// An Apple account as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderApple; - -/// A JSON Web Token as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderJWT; - -/// An Anonymous account as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderAnonymous; - -/// An Realm Cloud function as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderFunction; - -/// A user api key as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderUserAPIKey; - -/// A server api key as an identity provider. -extern RLMIdentityProvider const RLMIdentityProviderServerAPIKey; - -/** - Opaque credentials representing a specific Realm App user. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMCredentials : NSObject - -/// The name of the identity provider which generated the credentials token. -@property (nonatomic, readonly) RLMIdentityProvider provider; - -/** - Construct and return credentials from a Facebook account token. - */ -+ (instancetype)credentialsWithFacebookToken:(RLMCredentialsToken)token; - -/** - Construct and return credentials from a Google account token. - */ -+ (instancetype)credentialsWithGoogleAuthCode:(RLMCredentialsToken)token; - -/** - Construct and return credentials from a Google id token. - */ -+ (instancetype)credentialsWithGoogleIdToken:(RLMCredentialsToken)token; - -/** - Construct and return credentials from an Apple account token. - */ -+ (instancetype)credentialsWithAppleToken:(RLMCredentialsToken)token; - -/** - Construct and return credentials for an Atlas App Services function using a mongodb document as a json payload. -*/ -+ (instancetype)credentialsWithFunctionPayload:(NSDictionary> *)payload; - -/** - Construct and return credentials from a user api key. -*/ -+ (instancetype)credentialsWithUserAPIKey:(NSString *)apiKey; - -/** - Construct and return credentials from a server api key. -*/ -+ (instancetype)credentialsWithServerAPIKey:(NSString *)apiKey; - -/** - Construct and return Atlas App Services credentials from an email and password. - */ -+ (instancetype)credentialsWithEmail:(NSString *)email - password:(NSString *)password; - -/** - Construct and return credentials from a JSON Web Token. - */ -+ (instancetype)credentialsWithJWT:(NSString *)token; - -/** - Construct and return anonymous credentials - */ -+ (instancetype)anonymousCredentials; - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("RLMAppCredentials cannot be created directly"))); - -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("RLMAppCredentials cannot be created directly"))); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMDecimal128.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMDecimal128.h deleted file mode 100644 index f6224bbf2..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMDecimal128.h +++ /dev/null @@ -1,110 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A 128-bit IEEE 754-2008 decimal floating point number. - - This type is similar to Swift's built-in Decimal type, but allocates bits - differently, resulting in a different representable range. (NS)Decimal stores a - significand of up to 38 digits long and an exponent from -128 to 127, while - this type stores up to 34 digits of significand and an exponent from -6143 to - 6144. - */ -RLM_SWIFT_SENDABLE // immutable -@interface RLMDecimal128 : NSObject -/// Creates a new zero-initialized decimal128. -- (instancetype)init; - -/// Converts the given value to a RLMDecimal128. -/// -/// The following types can be converted to RLMDecimal128: -/// - NSNumber -/// - NSString -/// - NSDecimalNumber -/// -/// Passing a value with a type not in this list is a fatal error. Passing a -/// string which cannot be parsed as a valid Decimal128 is a fatal error. -- (instancetype)initWithValue:(id)value; - -/// Converts the given number to a RLMDecimal128. -- (instancetype)initWithNumber:(NSNumber *)number; - -/// Parses the given string to a RLMDecimal128. -/// -/// Returns a decimal where `isNaN` is `YES` if the string cannot be parsed as a decimal. `error` is never set -/// and this will never actually return `nil`. -- (nullable instancetype)initWithString:(NSString *)string error:(NSError **)error; - -/// Converts the given number to a RLMDecimal128. -+ (instancetype)decimalWithNumber:(NSNumber *)number; - -/// The minimum value for RLMDecimal128. -@property (class, readonly, copy) RLMDecimal128 *minimumDecimalNumber NS_REFINED_FOR_SWIFT; - -/// The maximum value for RLMDecimal128. -@property (class, readonly, copy) RLMDecimal128 *maximumDecimalNumber NS_REFINED_FOR_SWIFT; - -/// Convert this value to a double. This is a lossy conversion. -@property (nonatomic, readonly) double doubleValue; - -/// Convert this value to a NSDecimal. This may be a lossy conversion. -@property (nonatomic, readonly) NSDecimal decimalValue; - -/// Convert this value to a string. -@property (nonatomic, readonly) NSString *stringValue; - -/// Gets if this Decimal128 represents a NaN value. -@property (nonatomic, readonly) BOOL isNaN; - -/// The magnitude of this RLMDecimal128. -@property (nonatomic, readonly) RLMDecimal128 *magnitude NS_REFINED_FOR_SWIFT; - -/// Replaces this RLMDecimal128 value with its additive inverse. -- (void)negate; - -/// Adds the right hand side to the current value and returns the result. -- (RLMDecimal128 *)decimalNumberByAdding:(RLMDecimal128 *)decimalNumber; - -/// Divides the right hand side to the current value and returns the result. -- (RLMDecimal128 *)decimalNumberByDividingBy:(RLMDecimal128 *)decimalNumber; - -/// Subtracts the right hand side to the current value and returns the result. -- (RLMDecimal128 *)decimalNumberBySubtracting:(RLMDecimal128 *)decimalNumber; - -/// Multiply the right hand side to the current value and returns the result. -- (RLMDecimal128 *)decimalNumberByMultiplyingBy:(RLMDecimal128 *)decimalNumber; - -/// Comparision operator to check if the right hand side is greater than the current value. -- (BOOL)isGreaterThan:(nullable RLMDecimal128 *)decimalNumber; - -/// Comparision operator to check if the right hand side is greater than or equal to the current value. -- (BOOL)isGreaterThanOrEqualTo:(nullable RLMDecimal128 *)decimalNumber; - -/// Comparision operator to check if the right hand side is less than the current value. -- (BOOL)isLessThan:(nullable RLMDecimal128 *)decimalNumber; - -/// Comparision operator to check if the right hand side is less than or equal to the current value. -- (BOOL)isLessThanOrEqualTo:(nullable RLMDecimal128 *)decimalNumber; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMDictionary.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMDictionary.h deleted file mode 100644 index 9c8cac538..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMDictionary.h +++ /dev/null @@ -1,559 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObject, RLMResults, RLMDictionaryChange; - -/** - `RLMDictionary` is a container type in Realm representing a dynamic collection of key-value pairs. - - Unlike `NSDictionary`, `RLMDictionary`s hold a single key and value type. - This is referred to in these docs as the “type” and “keyType” of the dictionary. - - When declaring an `RLMDictionary` property, the object type and keyType must be marked as conforming to a - protocol by the same name as the objects it should contain. - - RLM_COLLECTION_TYPE(ObjectType) - ... - @property RLMDictionary *objectTypeDictionary; - - `RLMDictionary`s can be queried with the same predicates as `RLMObject` and `RLMResult`s. - - `RLMDictionary`s cannot be created directly. `RLMDictionary` properties on `RLMObject`s are - lazily created when accessed, or can be obtained by querying a Realm. - - `RLMDictionary` only supports `NSString` as a key. Realm disallows the use of `.` or `$` characters within a dictionary key. - - ### Key-Value Observing - - `RLMDictionary` supports dictionary key-value observing on `RLMDictionary` properties on `RLMObject` - subclasses, and the `invalidated` property on `RLMDictionary` instances themselves is - key-value observing compliant when the `RLMDictionary` is attached to a managed - `RLMObject` (`RLMDictionary`s on unmanaged `RLMObject`s will never become invalidated). - */ -@interface RLMDictionary: NSObject - -#pragma mark - Properties - -/** - The number of entries in the dictionary. - */ -@property (nonatomic, readonly, assign) NSUInteger count; - -/** - The type of the objects in the dictionary. - */ -@property (nonatomic, readonly, assign) RLMPropertyType type; - -/** - The type of the key used in this dictionary. - */ -@property (nonatomic, readonly, assign) RLMPropertyType keyType; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readonly, getter = isOptional) BOOL optional; - -/** - The class name of the objects contained in the dictionary. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages the dictionary. Returns `nil` for unmanaged dictionary. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - Indicates if the dictionary can no longer be accessed. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if the dictionary is frozen. - - Frozen dictionaries are immutable and can be accessed from any thread. Frozen dictionaries - are created by calling `-freeze` on a managed live dictionary. Unmanaged dictionaries are - never frozen. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Accessing Objects from a Dictionary - -/** - Returns the value associated with a given key. - - @param key The name of the property. - - @discussion If key does not start with “@”, invokes object(forKey:). If key does start - with “@”, strips the “@” and invokes [super valueForKey:] with the rest of the key. - - @return A value associated with a given key or `nil`. - */ -- (nullable id)valueForKey:(nonnull RLMKeyType)key; - -/** - Returns an array containing the dictionary’s keys. - - @note The order of the elements in the array is not defined. - */ -@property(readonly, copy) NSArray *allKeys; - -/** - Returns an array containing the dictionary’s values. - - @note The order of the elements in the array is not defined. - */ -@property(readonly, copy) NSArray *allValues; - -/** - Returns the value associated with a given key. - - @note `nil` will be returned if no value is associated with a given key. NSNull will be returned - where null is associated with the key. - - @param key The key for which to return the corresponding value. - - @return The value associated with key. - */ -- (nullable RLMObjectType)objectForKey:(nonnull RLMKeyType)key; - -/** - Returns the value associated with a given key. - - @note `nil` will be returned if no value is associated with a given key. NSNull will be returned - where null is associated with the key. - - @param key The key for which to return the corresponding value. - - @return The value associated with key. - */ -- (nullable RLMObjectType)objectForKeyedSubscript:(RLMKeyType)key; - -/** - Applies a given block object to the each key-value pair of the dictionary. - - @param block A block object to operate on entries in the dictionary. - - @note If the block sets *stop to YES, the enumeration stops. - */ -- (void)enumerateKeysAndObjectsUsingBlock:(void (^)(RLMKeyType key, RLMObjectType obj, BOOL *stop))block; - -#pragma mark - Adding, Removing, and Replacing Objects in a Dictionary - -/** - Replace the contents of a dictionary with the contents of another dictionary - NSDictionary or RLMDictionary. - - This will remove all elements in this dictionary and then apply each element from the given dictionary. - - @warning This method may only be called during a write transaction. - @warning If otherDictionary is self this will result in an empty dictionary. - */ -- (void)setDictionary:(id)otherDictionary; - -/** - Removes all contents in the dictionary. - - @warning This method may only be called during a write transaction. - */ -- (void)removeAllObjects; - -/** - Removes from the dictionary entries specified by elements in a given array. If a given key does not - exist, no mutation will happen for that key. - - @warning This method may only be called during a write transaction. - */ -- (void)removeObjectsForKeys:(NSArray *)keyArray; - -/** - Removes a given key and its associated value from the dictionary. If the key does not exist the dictionary - will not be modified. - - @warning This method may only be called during a write transaction. - */ -- (void)removeObjectForKey:(RLMKeyType)key; - -/** - Adds a given key-value pair to the dictionary if the key is not present, or updates the value for the given key - if the key already present. - - @warning This method may only be called during a write transaction. - */ -- (void)setObject:(nullable RLMObjectType)obj forKeyedSubscript:(RLMKeyType)key; - -/** - Adds a given key-value pair to the dictionary if the key is not present, or updates the value for the given key - if the key already present. - - @warning This method may only be called during a write transaction. - */ -- (void)setObject:(nullable RLMObjectType)anObject forKey:(RLMKeyType)aKey; - -/** - Adds to the receiving dictionary the entries from another dictionary. - - @note If the receiving dictionary contains the same key(s) as the otherDictionary, then - the receiving dictionary will update each key-value pair for the matching key. - - @warning This method may only be called during a write transaction. - - @param otherDictionary An enumerable object such as `NSDictionary` or `RLMDictionary` which contains objects of the - same type as the receiving dictionary. - */ -- (void)addEntriesFromDictionary:(id )otherDictionary; - -#pragma mark - Querying a Dictionary - -/** - Returns all the values matching the given predicate in the dictionary. - - @note The keys in the dictionary are ignored when quering values, and they will not be returned in the `RLMResults`. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` of objects that match the given predicate. - */ -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all the values matching the given predicate in the dictionary. - - @note The keys in the dictionary are ignored when quering values, and they will not be returned in the `RLMResults`. - - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` of objects that match the given predicate - */ -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/** - Returns a sorted RLMResults of all values in the dictionary. - - @note The keys in the dictionary are ignored when sorting values, and they will not be returned in the `RLMResults`. - - @param keyPath The key path to sort by. - @param ascending The direction to sort in. - - @return An `RLMResults` sorted by the specified key path. - */- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a sorted RLMResults of all values in the dictionary. - - @note The keys in the dictionary are ignored when sorting values, and they will not be returned in the `RLMResults`. - - @param properties An array of `RLMSortDescriptor`s to sort by. - - @return An `RLMResults` sorted by the specified properties. - */ -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/** - Returns a distinct `RLMResults` from all values in the dictionary. - - @note The keys in the dictionary are ignored, and they will not be returned in the `RLMResults`. - - @param keyPaths The key paths to distinct on. - - @return An `RLMResults` with the distinct values of the keypath(s). - */ -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the values in the dictionary. - - NSNumber *min = [object.dictionaryProperty minOfProperty:@"age"]; - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, `NSDate`, `RLMValue` and `RLMDecimal128` are supported. - - @return The minimum value of the property, or `nil` if the dictionary is empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects in the dictionary. - - NSNumber *max = [object.dictionaryProperty maxOfProperty:@"age"]; - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, `NSDate`, `RLMValue` and `RLMDecimal128` are supported. - - @return The maximum value of the property, or `nil` if the dictionary is empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of distinct values of a given property over all the objects in the dictionary. - - NSNumber *sum = [object.dictionaryProperty sumOfProperty:@"age"]; - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, `RLMValue` and `RLMDecimal128` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects in the dictionary. - - NSNumber *average = [object.dictionaryProperty averageOfProperty:@"age"]; - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, `NSDate`, `RLMValue` and `RLMDecimal128` are supported. - - @return The average value of the given property, or `nil` if the dictionary is empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -#pragma mark - Notifications - -/** - Registers a block to be called each time the dictionary changes. - - The block will be asynchronously called with the initial dictionary, and then - called again after each write transaction which changes any of the keys or values - within the dictionary. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which keys in the dictionary were added, modified or deleted. If a write transaction - did not modify any keys or values in the dictionary, the block is not called at all. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - Person *person = [[Person allObjectsInRealm:realm] firstObject]; - NSLog(@"person.dogs.count: %zu", person.dogs.count); // => 0 - self.token = [person.dogs addNotificationBlock(RLMDictionary *dogs, - RLMDictionaryChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - person.dogs[@"frenchBulldog"] = dog; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a non-frozen managed dictionary. - - @param block The block to be called each time the dictionary changes. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMDictionary *_Nullable dictionary, - RLMDictionaryChange *_Nullable changes, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the dictionary changes. - - The block will be asynchronously called with the initial dictionary, and then - called again after each write transaction which changes any of the key-value in - the dictionary or which objects are in the results. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which keys in the dictionary were added or modified. If a write transaction - did not modify any objects in the dictionary, the block is not called at all. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMDictionary *_Nullable dictionary, - RLMDictionaryChange *_Nullable changes, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the dictionary changes. - - The block will be asynchronously called with the initial dictionary, and then - called again after each write transaction which changes any of the key-value in - the dictionary or which objects are in the results. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which keys in the dictionary were added or modified. If a write transaction - did not modify any objects in the dictionary, the block is not called at all. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMDictionary *_Nullable dictionary, - RLMDictionaryChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the dictionary changes. - - The block will be asynchronously called with the initial dictionary, and then - called again after each write transaction which changes any of the key-value in - the dictionary or which objects are in the results. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which keys in the dictionary were added or modified. If a write transaction - did not modify any objects in the dictionary, the block is not called at all. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMDictionary *_Nullable dictionary, - RLMDictionaryChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths -__attribute__((warn_unused_result)); - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of a dictionary. - - The frozen copy is an immutable dictionary which contains the same data as this - dictionary currently contains, but will not update when writes are made to the - containing Realm. Unlike live dictionaries, frozen dictionaries can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a managed dictionary. - @warning Holding onto a frozen dictionary for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -#pragma mark - Unavailable Methods -/** - `-[RLMDictionary init]` is not available because `RLMDictionary`s cannot be created directly. - `RLMDictionary` properties on `RLMObject`s are lazily created when accessed. - */ -- (instancetype)init __attribute__((unavailable("RLMDictionary cannot be created directly"))); -/** - `+[RLMDictionary new]` is not available because `RLMDictionary`s cannot be created directly. - `RLMDictionary` properties on `RLMObject`s are lazily created when accessed. - */ -+ (instancetype)new __attribute__((unavailable("RLMDictionary cannot be created directly"))); - -@end - -/** - A `RLMDictionaryChange` object encapsulates information about changes to dictionaries - that are reported by Realm notifications. - - `RLMDictionaryChange` is passed to the notification blocks registered with - `-addNotificationBlock` on `RLMDictionary`, and reports what keys in the - dictionary changed since the last time the notification block was called. - */ -@interface RLMDictionaryChange : NSObject -/// The keys in the new version of the dictionary which were newly inserted. -@property (nonatomic, readonly) NSArray *insertions; - -/// The keys in the new version of the dictionary which were modified. -@property (nonatomic, readonly) NSArray *modifications; - -/// The keys which were deleted from the old version. -@property (nonatomic, readonly) NSArray *deletions; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMEmailPasswordAuth.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMEmailPasswordAuth.h deleted file mode 100644 index 748eb26af..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMEmailPasswordAuth.h +++ /dev/null @@ -1,120 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@protocol RLMBSON; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// A block type used to report an error -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMEmailPasswordAuthOptionalErrorBlock)(NSError * _Nullable); - -/** - A client for the email/password authentication provider which - can be used to obtain a credential for logging in, - and to perform requests specifically related to the email/password provider. -*/ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMEmailPasswordAuth : RLMProviderClient - -/** - Registers a new email identity with the email/password provider, - and sends a confirmation email to the provided address. - - @param email The email address of the user to register. - @param password The password that the user created for the new email/password identity. - @param completionHandler A callback to be invoked once the call is complete. -*/ - -- (void)registerUserWithEmail:(NSString *)email - password:(NSString *)password - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler NS_SWIFT_NAME(registerUser(email:password:completion:)); - -/** - Confirms an email identity with the email/password provider. - - @param token The confirmation token that was emailed to the user. - @param tokenId The confirmation token id that was emailed to the user. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)confirmUser:(NSString *)token - tokenId:(NSString *)tokenId - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Re-sends a confirmation email to a user that has registered but - not yet confirmed their email address. - - @param email The email address of the user to re-send a confirmation for. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)resendConfirmationEmail:(NSString *)email - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Retries custom confirmation function for a given email address. - - @param email The email address of the user to retry custom confirmation logic. - @param completionHandler A callback to be invoked once the call is complete. - */ -- (void)retryCustomConfirmation:(NSString *)email - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Sends a password reset email to the given email address. - - @param email The email address of the user to send a password reset email for. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)sendResetPasswordEmail:(NSString *)email - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Resets the password of an email identity using the - password reset token emailed to a user. - - @param password The new password. - @param token The password reset token that was emailed to the user. - @param tokenId The password reset token id that was emailed to the user. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)resetPasswordTo:(NSString *)password - token:(NSString *)token - tokenId:(NSString *)tokenId - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler; - -/** - Resets the password of an email identity using the - password reset function set up in the application. - - @param email The email address of the user. - @param password The desired new password. - @param args A list of arguments passed in as a BSON array. - @param completionHandler A callback to be invoked once the call is complete. -*/ -- (void)callResetPasswordFunction:(NSString *)email - password:(NSString *)password - args:(NSArray> *)args - completion:(RLMEmailPasswordAuthOptionalErrorBlock)completionHandler NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMEmbeddedObject.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMEmbeddedObject.h deleted file mode 100644 index 4db6248ca..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMEmbeddedObject.h +++ /dev/null @@ -1,367 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectSchema, RLMPropertyDescriptor, RLMRealm, RLMNotificationToken, RLMPropertyChange; -typedef void (^RLMObjectChangeBlock)(BOOL deleted, - NSArray *_Nullable changes, - NSError *_Nullable error); -/** - `RLMEmbeddedObject` is a base class used to define Realm model objects. - - Embedded objects work similarly to normal objects, but are owned by a single - parent Object (which itself may be embedded). Unlike normal top-level objects, - embedded objects cannot be directly created in or added to a Realm. Instead, - they can only be created as part of a parent object, or by assigning an - unmanaged object to a parent object's property. Embedded objects are - automatically deleted when the parent object is deleted or when the parent is - modified to no longer point at the embedded object, either by reassigning an - RLMObject property or by removing the embedded object from the array containing - it. - - Embedded objects can only ever have a single parent object which links to them, - and attempting to link to an existing managed embedded object will throw an - exception. - - The property types supported on `RLMEmbeddedObject` are the same as for - `RLMObject`, except for that embedded objects cannot link to top-level objects, - so `RLMObject` and `RLMArray` properties are not supported - (`RLMEmbeddedObject` and `RLMArray` *are*). - - Embedded objects cannot have primary keys or indexed properties. - */ - -@interface RLMEmbeddedObject : RLMObjectBase - -#pragma mark - Creating & Initializing Objects - -/** - Creates an unmanaged instance of a Realm object. - - Unmanaged embedded objects can be added to a Realm by assigning them to an - object property of a managed Realm object or by adding them to a managed - RLMArray. - */ -- (instancetype)init NS_DESIGNATED_INITIALIZER; - -/** - Creates an unmanaged instance of a Realm object. - - Pass in an `NSArray` or `NSDictionary` instance to set the values of the object's properties. - - Unmanaged embedded objects can be added to a Realm by assigning them to an - object property of a managed Realm object or by adding them to a managed - RLMArray. - */ -- (instancetype)initWithValue:(id)value; - -/** - Returns the class name for a Realm object subclass. - - @warning Do not override. Realm relies on this method returning the exact class - name. - - @return The class name for the model class. - */ -+ (NSString *)className; - -#pragma mark - Properties - -/** - The Realm which manages the object, or `nil` if the object is unmanaged. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - The object schema which lists the managed properties for the object. - */ -@property (nonatomic, readonly) RLMObjectSchema *objectSchema; - -/** - Indicates if the object can no longer be accessed because it is now invalid. - - An object can no longer be accessed if the object has been deleted from the Realm that manages it, or - if `invalidate` is called on that Realm. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if this object is frozen. - - @see `-[RLMEmbeddedObject freeze]` - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Customizing your Objects - -/** - Override this method to specify the default values to be used for each property. - - @return A dictionary mapping property names to their default values. - */ -+ (nullable NSDictionary *)defaultPropertyValues; - -/** - Override this method to specify the names of properties to ignore. These properties will not be managed by the Realm - that manages the object. - - @return An array of property names to ignore. - */ -+ (nullable NSArray *)ignoredProperties; - -/** - Override this method to specify the names of properties that are non-optional (i.e. cannot be assigned a `nil` value). - - By default, all properties of a type whose values can be set to `nil` are - considered optional properties. To require that an object in a Realm always - store a non-`nil` value for a property, add the name of the property to the - array returned from this method. - - Properties of `RLMEmbeddedObject` type cannot be non-optional. Array and - `NSNumber` properties can be non-optional, but there is no reason to do so: - arrays do not support storing nil, and if you want a non-optional number you - should instead use the primitive type. - - @return An array of property names that are required. - */ -+ (NSArray *)requiredProperties; - -/** - Override this method to provide information related to properties containing linking objects. - - Each property of type `RLMLinkingObjects` must have a key in the dictionary returned by this method consisting - of the property name. The corresponding value must be an instance of `RLMPropertyDescriptor` that describes the class - and property that the property is linked to. - - return @{ @"owners": [RLMPropertyDescriptor descriptorWithClass:Owner.class propertyName:@"dogs"] }; - - @return A dictionary mapping property names to `RLMPropertyDescriptor` instances. - */ -+ (NSDictionary *)linkingObjectsProperties; - -#pragma mark - Notifications - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in differen - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When notifications - can't be delivered instantly, multiple notifications may be coalesced into a - single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - - @param block The block to be called whenever a change occurs. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block queue:(dispatch_queue_t)queue; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block keyPaths:(NSArray *)keyPaths queue:(dispatch_queue_t)queue; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block keyPaths:(NSArray *)keyPaths; - -#pragma mark - Other Instance Methods - -/** - Returns YES if another Realm object instance points to the same object as the - receiver in the Realm managing the receiver. - - For frozen objects and object types with a primary key, `isEqual:` is - overridden to use the same logic as this method (along with a corresponding - implementation for `hash`). Non-frozen objects without primary keys use - pointer identity for `isEqual:` and `hash`. - - @param object The object to compare the receiver to. - - @return Whether the object represents the same object as the receiver. - */ -- (BOOL)isEqualToObject:(RLMEmbeddedObject *)object; - -/** - Returns a frozen (immutable) snapshot of this object. - - The frozen copy is an immutable object which contains the same data as this - object currently contains, but will not update when writes are made to the - containing Realm. Unlike live objects, frozen objects can be accessed from any - thread. - - - warning: Holding onto a frozen object for an extended period while performing write - transaction on the Realm may result in the Realm file growing to large sizes. See - `Realm.Configuration.maximumNumberOfActiveVersions` for more information. - - warning: This method can only be called on a managed object. - */ -- (instancetype)freeze NS_RETURNS_RETAINED; - -/** - Returns a live (mutable) reference of this object. - - This method creates a managed accessor to a live copy of the same frozen object. - Will return self if called on an already live object. - */ -- (instancetype)thaw; - -#pragma mark - Dynamic Accessors - -/// :nodoc: -- (nullable id)objectForKeyedSubscript:(NSString *)key; - -/// :nodoc: -- (void)setObject:(nullable id)obj forKeyedSubscript:(NSString *)key; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMError.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMError.h deleted file mode 100644 index 514ceee3f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMError.h +++ /dev/null @@ -1,442 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2022 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@protocol RLMValue; - -#pragma mark - Error Domains - -/** Error code is a value from the RLMError enum. */ -extern NSString *const RLMErrorDomain; - -/** An error domain identifying non-specific system errors. */ -extern NSString *const RLMUnknownSystemErrorDomain; - -/** - The error domain string for all SDK errors related to errors reported - by the synchronization manager error handler, as well as general sync - errors that don't fall into any of the other categories. - */ -extern NSString *const RLMSyncErrorDomain; - -/** - The error domain string for all SDK errors related to the authentication - endpoint. - */ -extern NSString *const RLMSyncAuthErrorDomain; - -/** -The error domain string for all SDK errors related to the Atlas App Services -endpoint. -*/ -extern NSString *const RLMAppErrorDomain; - -#pragma mark - RLMError - -/// A user info key containing the error code. This is provided for backwards -/// compatibility only and should not be used. -extern NSString *const RLMErrorCodeKey __attribute((deprecated("use -[NSError code]"))); - -/// A user info key containing the name of the error code. This is for -/// debugging purposes only and should not be relied on. -extern NSString *const RLMErrorCodeNameKey; - -/// A user info key present in sync errors which originate from the server, -/// containing the URL of the server-side logs associated with the error. -extern NSString * const RLMServerLogURLKey; - -/// A user info key containing a HTTP status code. Some ``RLMAppError`` codes -/// include this, most notably ``RLMAppErrorHttpRequestFailed``. -extern NSString * const RLMHTTPStatusCodeKey; - -/// A user info key containing a `RLMCompensatingWriteInfo` which includes -/// further details about what was reverted by the server. -extern NSString *const RLMCompensatingWriteInfoKey; - -/** - `RLMError` is an enumeration representing all recoverable errors. It is - associated with the Realm error domain specified in `RLMErrorDomain`. - */ -typedef RLM_ERROR_ENUM(NSInteger, RLMError, RLMErrorDomain) { - /** Denotes a general error that occurred when trying to open a Realm. */ - RLMErrorFail = 1, - - /** Denotes a file I/O error that occurred when trying to open a Realm. */ - RLMErrorFileAccess = 2, - - /** - Denotes a file permission error that occurred when trying to open a Realm. - - This error can occur if the user does not have permission to open or create - the specified file in the specified access mode when opening a Realm. - */ - RLMErrorFilePermissionDenied = 3, - - /** - Denotes an error where a file was to be written to disk, but another - file with the same name already exists. - */ - RLMErrorFileExists = 4, - - /** - Denotes an error that occurs if a file could not be found. - - This error may occur if a Realm file could not be found on disk when - trying to open a Realm as read-only, or if the directory part of the - specified path was not found when trying to write a copy. - */ - RLMErrorFileNotFound = 5, - - /** - Denotes an error that occurs if a file format upgrade is required to open - the file, but upgrades were explicitly disabled or the file is being open - in read-only mode. - */ - RLMErrorFileFormatUpgradeRequired = 6, - - /** - Denotes an error that occurs if the database file is currently open in - another process which cannot share with the current process due to an - architecture mismatch. - - This error may occur if trying to share a Realm file between an i386 - (32-bit) iOS Simulator and the Realm Studio application. In this case, - please use the 64-bit version of the iOS Simulator. - */ - RLMErrorIncompatibleLockFile = 8, - - /** - Denotes an error that occurs when there is insufficient available address - space to mmap the Realm file. - */ - RLMErrorAddressSpaceExhausted = 9, - - /** - Denotes an error that occurs if there is a schema version mismatch and a - migration is required. - */ - RLMErrorSchemaMismatch = 10, - - /** - Denotes an error where an operation was requested which cannot be - performed on an open file. - */ - RLMErrorAlreadyOpen = 12, - - /// Denotes an error where an input value was invalid. - RLMErrorInvalidInput = 13, - - /// Denotes an error where a write failed due to insufficient disk space. - RLMErrorOutOfDiskSpace = 14, - - /** - Denotes an error where a Realm file could not be opened because another - process has opened the same file in a way incompatible with inter-process - sharing. For example, this can result from opening the backing file for an - in-memory Realm in non-in-memory mode. - */ - RLMErrorIncompatibleSession = 15, - - /** - Denotes an error that occurs if the file is a valid Realm file, but has a - file format version which is not supported by this version of Realm. This - typically means that the file was written by a newer version of Realm, but - may also mean that it is from a pre-1.0 version of Realm (or for - synchronized files, pre-10.0). - */ - RLMErrorUnsupportedFileFormatVersion = 16, - - /** - Denotes an error that occurs if a synchronized Realm is opened in more - than one process at once. - */ - RLMErrorMultipleSyncAgents = 17, - - /// A subscription was rejected by the server. - RLMErrorSubscriptionFailed = 18, - - /// A file operation failed in a way which does not have a more specific error code. - RLMErrorFileOperationFailed = 19, - - /** - Denotes an error that occurs if the file being opened is not a valid Realm - file. Some of the possible causes of this are: - 1. The file at the given URL simply isn't a Realm file at all. - 2. The wrong encryption key was given. - 3. The Realm file is encrypted and no encryption key was given. - 4. The Realm file isn't encrypted but an encryption key was given. - 5. The file on disk has become corrupted. - */ - RLMErrorInvalidDatabase = 20, - - /** - Denotes an error that occurs if a Realm is opened in the wrong history - mode. Typically this means that either a local Realm is being opened as a - synchronized Realm or vice versa. - */ - RLMErrorIncompatibleHistories = 21, - - /** - Denotes an error that occurs if objects were written to a flexible sync - Realm without any active subscriptions for that object type. All objects - created in flexible sync Realms must match at least one active - subscription or the server will reject the write. - */ - RLMErrorNoSubscriptionForWrite = 22, -}; - -#pragma mark - RLMSyncError - -/// A user info key for use with `RLMSyncErrorClientResetError`. -extern NSString *const kRLMSyncPathOfRealmBackupCopyKey; - -/// A user info key for use with certain error types. -extern NSString *const kRLMSyncErrorActionTokenKey; - -/** - An error related to a problem that might be reported by the synchronization manager - error handler, or a callback on a sync-related API that performs asynchronous work. - */ -typedef RLM_ERROR_ENUM(NSInteger, RLMSyncError, RLMSyncErrorDomain) { - /// An error that indicates a problem with the session (a specific Realm opened for sync). - RLMSyncErrorClientSessionError = 4, - - /// An error that indicates a problem with a specific user. - RLMSyncErrorClientUserError = 5, - - /** - An error that indicates an internal, unrecoverable problem - with the underlying synchronization engine. - */ - RLMSyncErrorClientInternalError = 6, - - /** - An error that indicates the Realm needs to be reset. - - A synced Realm may need to be reset because Atlas App Services encountered an - error and had to be restored from a backup. If the backup copy of the remote Realm - is of an earlier version than the local copy of the Realm, the server will ask the - client to reset the Realm. - - The reset process is as follows: the local copy of the Realm is copied into a recovery - directory for safekeeping, and then deleted from the original location. The next time - the Realm for that partition value is opened, the Realm will automatically be re-downloaded from - Atlas App Services, and can be used as normal. - - Data written to the Realm after the local copy of the Realm diverged from the backup - remote copy will be present in the local recovery copy of the Realm file. The - re-downloaded Realm will initially contain only the data present at the time the Realm - was backed up on the server. - - The client reset process can be initiated in one of two ways. - - The `userInfo` dictionary contains an opaque token object under the key - `kRLMSyncErrorActionTokenKey`. This token can be passed into - `+[RLMSyncSession immediatelyHandleError:]` in order to immediately perform the client - reset process. This should only be done after your app closes and invalidates every - instance of the offending Realm on all threads (note that autorelease pools may make this - difficult to guarantee). - - If `+[RLMSyncSession immediatelyHandleError:]` is not called, the client reset process - will be automatically carried out the next time the app is launched and the - `RLMSyncManager` is accessed. - - The value for the `kRLMSyncPathOfRealmBackupCopyKey` key in the `userInfo` dictionary - describes the path of the recovered copy of the Realm. This copy will not actually be - created until the client reset process is initiated. - - @see `-[NSError rlmSync_errorActionToken]`, `-[NSError rlmSync_clientResetBackedUpRealmPath]` - */ - RLMSyncErrorClientResetError = 7, - - /// :nodoc: - RLMSyncErrorUnderlyingAuthError = 8, - - /** - An error that indicates the user does not have permission to perform an operation - upon a synced Realm. For example, a user may receive this error if they attempt to - open a Realm they do not have at least read access to, or write to a Realm they only - have read access to. - - This error may also occur if a user incorrectly opens a Realm they have read-only - permissions to without using the `asyncOpen()` APIs. - - A Realm that suffers a permission denied error is, by default, flagged so that its - local copy will be deleted the next time the application starts. - - The `userInfo` dictionary contains an opaque token object under the key - `kRLMSyncErrorActionTokenKey`. This token can be passed into - `+[RLMSyncSession immediatelyHandleError:]` in order to immediately delete the local - copy. This should only be done after your app closes and invalidates every instance - of the offending Realm on all threads (note that autorelease pools may make this - difficult to guarantee). - - @warning It is strongly recommended that, if a Realm has encountered a permission denied - error, its files be deleted before attempting to re-open it. - - @see `-[NSError rlmSync_errorActionToken]` - */ - RLMSyncErrorPermissionDeniedError = 9, - - /** - An error that indicates that the server has rejected the requested flexible sync subscriptions. - */ - RLMSyncErrorInvalidFlexibleSyncSubscriptions = 10, - - /** - An error that indicates that the server has reverted a write made by this - client. This can happen due to not having write permission, or because an - object was created in a flexible sync Realm which does not match any - active subscriptions. - - This error is informational and does not require any explicit handling. - */ - RLMSyncErrorWriteRejected = 11, - - /** - A connection error without a more specific error code occurred. - - Realm internally handles retrying connections with appropriate backoffs, - so connection errors are normally logged and not reported to the error - handler. The exception is if - ``RLMSyncConfiguration.cancelAsyncOpenOnNonFatalErrors`` is set to `true`, - in which case async opens will be canceled on connection failures and the - error will be reported to the completion handler. - - Note that connection timeouts are reported as - (errorDomain: NSPosixErrorDomain, error: ETIMEDOUT) - and not as one of these error codes. - */ - RLMSyncErrorConnectionFailed = 12, - - /** - Connecting to the server failed due to a TLS issue such as an invalid certificate. - */ - RLMSyncErrorTLSHandshakeFailed = 13, -}; - -#pragma mark - RLMSyncAuthError - -// NEXT-MAJOR: This was a ROS thing and should have been removed in v10 -/// :nodoc: -typedef RLM_ERROR_ENUM(NSInteger, RLMSyncAuthError, RLMSyncAuthErrorDomain) { - RLMSyncAuthErrorBadResponse = 1, - RLMSyncAuthErrorBadRemoteRealmPath = 2, - RLMSyncAuthErrorHTTPStatusCodeError = 3, - RLMSyncAuthErrorClientSessionError = 4, - RLMSyncAuthErrorInvalidParameters = 601, - RLMSyncAuthErrorMissingPath = 602, - RLMSyncAuthErrorInvalidCredential = 611, - RLMSyncAuthErrorUserDoesNotExist = 612, - RLMSyncAuthErrorUserAlreadyExists = 613, - RLMSyncAuthErrorAccessDeniedOrInvalidPath = 614, - RLMSyncAuthErrorInvalidAccessToken = 615, - RLMSyncAuthErrorFileCannotBeShared = 703, -} __attribute__((deprecated("Errors of this type are no longer reported"))); - -#pragma mark - RLMSyncAppError - -/// An error which occurred when making a request to Atlas App Services. -typedef RLM_ERROR_ENUM(NSInteger, RLMAppError, RLMAppErrorDomain) { - /// An unknown error has occurred - RLMAppErrorUnknown = -1, - - /// A HTTP request completed with an error status code. The failing status - /// code can be found in the ``RLMHTTPStatusCodeKey`` key of the userInfo - /// dictionary. - RLMAppErrorHttpRequestFailed = 1, - - /// A user's session is in an invalid state. Logging out and back in may rectify this. - RLMAppErrorInvalidSession, - /// A request sent to the server was malformed in some way. - RLMAppErrorBadRequest, - /// A request was made using a nonexistent user. - RLMAppErrorUserNotFound, - /// A request was made against an App using a User which does not belong to that App. - RLMAppErrorUserAppDomainMismatch, - /// The auth provider has limited the domain names which can be used for email addresses, and the given one is not allowed. - RLMAppErrorDomainNotAllowed, - /// The request body size exceeded a server-configured limit. - RLMAppErrorReadSizeLimitExceeded, - /// A request had an invalid parameter. - RLMAppErrorInvalidParameter, - /// A request was missing a required parameter. - RLMAppErrorMissingParameter, - /// Executing the requested server function failed with an error. - RLMAppErrorFunctionExecutionError, - /// The server encountered an internal error. - RLMAppErrorInternalServerError, - /// Authentication failed due to the request auth provider not existing. - RLMAppErrorAuthProviderNotFound, - /// The requested value does not exist. - RLMAppErrorValueNotFound, - /// The value being created already exists. - RLMAppErrorValueAlreadyExists, - /// A value with the same name as the value being created already exists. - RLMAppErrorValueDuplicateName, - /// The called server function does not exist. - RLMAppErrorFunctionNotFound, - /// The called server function has a syntax error. - RLMAppErrorFunctionSyntaxError, - /// The called server function is invalid in some way. - RLMAppErrorFunctionInvalid, - /// Registering an API key with the auth provider failed due to it already existing. - RLMAppErrorAPIKeyAlreadyExists, - /// The operation failed due to exceeding the server-configured time limit. - RLMAppErrorExecutionTimeLimitExceeded, - /// The body of the called function does not define a callable thing. - RLMAppErrorNotCallable, - /// Email confirmation failed for a user because the user has already confirmed their email. - RLMAppErrorUserAlreadyConfirmed, - /// The user cannot be used because it has been disabled. - RLMAppErrorUserDisabled, - /// An auth error occurred which does not have a more specific error code. - RLMAppErrorAuthError, - /// Account registration failed due to the user name already being taken. - RLMAppErrorAccountNameInUse, - /// A login request failed due to an invalid password. - RLMAppErrorInvalidPassword, - /// Operation failed due to server-side maintenance. - RLMAppErrorMaintenanceInProgress, - /// Operation failed due to an error reported by MongoDB. - RLMAppErrorMongoDBError, -}; - -/// Extended information about a write which was rejected by the server. -/// -/// The server will sometimes reject writes made by the client for reasons such -/// as permissions, additional server-side validation failing, or because the -/// object didn't match any flexible sync subscriptions. When this happens, a -/// ``RLMSyncErrorWriteRejected`` error is reported which contains an array of -/// `RLMCompensatingWriteInfo` objects in the ``RLMCompensatingWriteInfoKey`` -/// userInfo key with information about what writes were rejected and why. -/// -/// This information is intended for debugging and logging purposes only. The -/// `reason` strings are generated by the server and are not guaranteed to be -/// stable, so attempting to programmatically do anything with them will break -/// without warning. -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMCompensatingWriteInfo : NSObject -/// The class name of the object being written to. -@property (nonatomic, readonly) NSString *objectType; -/// The primary key of the object being written to. -@property (nonatomic, readonly) id primaryKey NS_REFINED_FOR_SWIFT; -/// A human-readable string describing why the write was rejected. -@property (nonatomic, readonly) NSString *reason; -@end diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMFindOneAndModifyOptions.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMFindOneAndModifyOptions.h deleted file mode 100644 index 3cce99f23..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMFindOneAndModifyOptions.h +++ /dev/null @@ -1,80 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) -@protocol RLMBSON; -@class RLMSortDescriptor; - -/// Options to use when executing a `findOneAndUpdate`, `findOneAndReplace`, -/// or `findOneAndDelete` command on a `RLMMongoCollection`. -@interface RLMFindOneAndModifyOptions : NSObject - -/// Limits the fields to return for all matching documents. -@property (nonatomic, nullable) id projection NS_REFINED_FOR_SWIFT; - -/// The order in which to return matching documents. -@property (nonatomic, nullable) id sort NS_REFINED_FOR_SWIFT -__attribute__((deprecated("Use `sorting` instead, which correctly sort more than one sort attribute", "sorting"))); - -/// The order in which to return matching documents. -@property (nonatomic) NSArray> *sorting NS_REFINED_FOR_SWIFT; - - -/// Whether or not to perform an upsert, default is false -/// (only available for find_one_and_replace and find_one_and_update) -@property (nonatomic) BOOL upsert; - -/// When true then the new document is returned, -/// Otherwise the old document is returned (default) -/// (only available for findOneAndReplace and findOneAndUpdate) -@property (nonatomic) BOOL shouldReturnNewDocument; - -/// Options to use when executing a `findOneAndUpdate`, `findOneAndReplace`, -/// or `findOneAndDelete` command on a `RLMMongoCollection`. -/// @param projection Limits the fields to return for all matching documents. -/// @param sort The order in which to return matching documents. -/// @param upsert Whether or not to perform an upsert, default is false -/// (only available for findOneAndReplace and findOneAndUpdate) -/// @param shouldReturnNewDocument When true then the new document is returned, -/// Otherwise the old document is returned (default), -/// (only available for findOneAndReplace and findOneAndUpdate) -- (instancetype)initWithProjection:(id _Nullable)projection - sort:(id _Nullable)sort - upsert:(BOOL)upsert - shouldReturnNewDocument:(BOOL)shouldReturnNewDocument -__attribute__((deprecated("Please use `initWithProjection:sorting:upsert:shouldReturnNewDocument:`"))) - NS_SWIFT_UNAVAILABLE("Please see FindOneAndModifyOptions"); - -/// Options to use when executing a `findOneAndUpdate`, `findOneAndReplace`, -/// or `findOneAndDelete` command on a `RLMMongoCollection`. -/// @param projection Limits the fields to return for all matching documents. -/// @param sorting The order in which to return matching documents. -/// @param upsert Whether or not to perform an upsert, default is false -/// (only available for findOneAndReplace and findOneAndUpdate) -/// @param shouldReturnNewDocument When true then the new document is returned, -/// Otherwise the old document is returned (default), -/// (only available for findOneAndReplace and findOneAndUpdate) -- (instancetype)initWithProjection:(id _Nullable)projection - sorting:(NSArray> *)sorting - upsert:(BOOL)upsert - shouldReturnNewDocument:(BOOL)shouldReturnNewDocument; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMFindOptions.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMFindOptions.h deleted file mode 100644 index 043a85374..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMFindOptions.h +++ /dev/null @@ -1,77 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@protocol RLMBSON; - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -@interface RLMFindOptions : NSObject - -/// The maximum number of documents to return. Specifying 0 will return all documents. -@property (nonatomic) NSInteger limit; - -/// Limits the fields to return for all matching documents. -@property (nonatomic, nullable) id projection NS_REFINED_FOR_SWIFT; - -/// The order in which to return matching documents. -@property (nonatomic, nullable) id sort NS_REFINED_FOR_SWIFT -__attribute__((deprecated("Use `sorting` instead, which correctly sort more than one sort attribute", "sorting"))); - -/// The order in which to return matching documents. -@property (nonatomic) NSArray> *sorting NS_REFINED_FOR_SWIFT; - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -/// @param limit The maximum number of documents to return. Specifying 0 will return all documents. -/// @param projection Limits the fields to return for all matching documents. -/// @param sort The order in which to return matching documents. -- (instancetype)initWithLimit:(NSInteger)limit - projection:(id _Nullable)projection - sort:(id _Nullable)sort -__attribute__((deprecated("Please use `initWithLimit:projection:sorting:`"))) - NS_SWIFT_UNAVAILABLE("Please see FindOption"); - - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -/// @param projection Limits the fields to return for all matching documents. -/// @param sort The order in which to return matching documents. -- (instancetype)initWithProjection:(id _Nullable)projection - sort:(id _Nullable)sort __deprecated -__attribute__((deprecated("Please use `initWithProjection:sorting:`"))) - NS_SWIFT_UNAVAILABLE("Please see FindOption"); - - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -/// @param limit The maximum number of documents to return. Specifying 0 will return all documents. -/// @param projection Limits the fields to return for all matching documents. -/// @param sorting The order in which to return matching documents. -- (instancetype)initWithLimit:(NSInteger)limit - projection:(id _Nullable)projection - sorting:(NSArray> *)sorting; - -/// Options to use when executing a `find` command on a `RLMMongoCollection`. -/// @param projection Limits the fields to return for all matching documents. -/// @param sorting The order in which to return matching documents. -- (instancetype)initWithProjection:(id _Nullable)projection - sorting:(NSArray> *)sorting; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMLogger.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMLogger.h deleted file mode 100644 index 96ab91967..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMLogger.h +++ /dev/null @@ -1,99 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -/// An enum representing different levels of sync-related logging that can be configured. -typedef RLM_CLOSED_ENUM(NSUInteger, RLMLogLevel) { - /// Nothing will ever be logged. - RLMLogLevelOff, - /// Only fatal errors will be logged. - RLMLogLevelFatal, - /// Only errors will be logged. - RLMLogLevelError, - /// Warnings and errors will be logged. - RLMLogLevelWarn, - /// Information about sync events will be logged. Fewer events will be logged in order to avoid overhead. - RLMLogLevelInfo, - /// Information about sync events will be logged. More events will be logged than with `RLMLogLevelInfo`. - RLMLogLevelDetail, - /// Log information that can aid in debugging. - /// - /// - warning: Will incur a measurable performance impact. - RLMLogLevelDebug, - /// Log information that can aid in debugging. More events will be logged than with `RLMLogLevelDebug`. - /// - /// - warning: Will incur a measurable performance impact. - RLMLogLevelTrace, - /// Log information that can aid in debugging. More events will be logged than with `RLMLogLevelTrace`. - /// - /// - warning: Will incur a measurable performance impact. - RLMLogLevelAll -} NS_SWIFT_NAME(LogLevel); - -/// A log callback function which can be set on RLMLogger. -/// -/// The log function may be called from multiple threads simultaneously, and is -/// responsible for performing its own synchronization if any is required. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void (^RLMLogFunction)(RLMLogLevel level, NSString *message); - -/** - `RLMLogger` is used for creating your own custom logging logic. - - You can define your own logger creating an instance of `RLMLogger` and define the log function which will be - invoked whenever there is a log message. - Set this custom logger as you default logger using `setDefaultLogger`. - - RLMLogger.defaultLogger = [[RLMLogger alloc] initWithLevel:RLMLogLevelDebug - logFunction:^(RLMLogLevel level, NSString * message) { - NSLog(@"Realm Log - %lu, %@", (unsigned long)level, message); - }]; - - @note By default default log threshold level is `RLMLogLevelInfo`, and logging strings are output to Apple System Logger. -*/ -@interface RLMLogger : NSObject - -/** - Gets the logging threshold level used by the logger. - */ -@property (nonatomic) RLMLogLevel level; - -/// :nodoc: -- (instancetype)init NS_UNAVAILABLE; - -/** - Creates a logger with the associated log level and the logic function to define your own logging logic. - - @param level The log level to be set for the logger. - @param logFunction The log function which will be invoked whenever there is a log message. -*/ -- (instancetype)initWithLevel:(RLMLogLevel)level logFunction:(RLMLogFunction)logFunction; - -#pragma mark RLMLogger Default Logger API - -/** - The current default logger. When setting a logger as default, this logger will be used whenever information must be logged. - */ -@property (class) RLMLogger *defaultLogger NS_SWIFT_NAME(shared); - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMMigration.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMMigration.h deleted file mode 100644 index 4a6652a19..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMMigration.h +++ /dev/null @@ -1,129 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMSchema; -@class RLMArray; -@class RLMObject; - -/** - A block type which provides both the old and new versions of an object in the Realm. Object - properties can only be accessed using keyed subscripting. - - @see `-[RLMMigration enumerateObjects:block:]` - - @param oldObject The object from the original Realm (read-only). - @param newObject The object from the migrated Realm (read-write). -*/ -typedef void (^RLMObjectMigrationBlock)(RLMObject * __nullable oldObject, RLMObject * __nullable newObject); - -/** - `RLMMigration` instances encapsulate information intended to facilitate a schema migration. - - A `RLMMigration` instance is passed into a user-defined `RLMMigrationBlock` block when updating - the version of a Realm. This instance provides access to the old and new database schemas, the - objects in the Realm, and provides functionality for modifying the Realm during the migration. - */ -@interface RLMMigration : NSObject - -#pragma mark - Properties - -/** - Returns the old `RLMSchema`. This is the schema which describes the Realm before the - migration is applied. - */ -@property (nonatomic, readonly) RLMSchema *oldSchema NS_REFINED_FOR_SWIFT; - -/** - Returns the new `RLMSchema`. This is the schema which describes the Realm after the - migration is applied. - */ -@property (nonatomic, readonly) RLMSchema *newSchema NS_REFINED_FOR_SWIFT; - - -#pragma mark - Altering Objects during a Migration - -/** - Enumerates all the objects of a given type in the Realm, providing both the old and new versions - of each object. Within the block, object properties can only be accessed using keyed subscripting. - - @param className The name of the `RLMObject` class to enumerate. - - @warning All objects returned are of a type specific to the current migration and should not be cast - to `className`. Instead, treat them as `RLMObject`s and use keyed subscripting to access - properties. - */ -- (void)enumerateObjects:(NSString *)className - block:(__attribute__((noescape)) RLMObjectMigrationBlock)block NS_REFINED_FOR_SWIFT; - -/** - Creates and returns an `RLMObject` instance of type `className` in the Realm being migrated. - - The `value` argument is used to populate the object. It can be a key-value coding compliant object, an array or - dictionary returned from the methods in `NSJSONSerialization`, or an array containing one element for each managed - property. An exception will be thrown if any required properties are not present and those properties were not defined - with default values. - - When passing in an `NSArray` as the `value` argument, all properties must be present, valid and in the same order as - the properties defined in the model. - - @param className The name of the `RLMObject` class to create. - @param value The value used to populate the object. - */ -- (RLMObject *)createObject:(NSString *)className withValue:(id)value NS_REFINED_FOR_SWIFT; - -/** - Deletes an object from a Realm during a migration. - - It is permitted to call this method from within the block passed to `-[enumerateObjects:block:]`. - - @param object Object to be deleted from the Realm being migrated. - */ -- (void)deleteObject:(RLMObject *)object NS_REFINED_FOR_SWIFT; - -/** - Deletes the data for the class with the given name. - - All objects of the given class will be deleted. If the `RLMObject` subclass no longer exists in your program, - any remaining metadata for the class will be removed from the Realm file. - - @param name The name of the `RLMObject` class to delete. - - @return A Boolean value indicating whether there was any data to delete. - */ -- (BOOL)deleteDataForClassName:(NSString *)name NS_REFINED_FOR_SWIFT; - -/** - Renames a property of the given class from `oldName` to `newName`. - - @param className The name of the class whose property should be renamed. This class must be present - in both the old and new Realm schemas. - @param oldName The old persisted property name for the property to be renamed. There must not be a property with this name in the - class as defined by the new Realm schema. - @param newName The new persisted property name for the property to be renamed. There must not be a property with this name in the - class as defined by the old Realm schema. - */ -- (void)renamePropertyForClass:(NSString *)className oldName:(NSString *)oldName - newName:(NSString *)newName NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMMongoClient.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMMongoClient.h deleted file mode 100644 index 50a1c226d..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMMongoClient.h +++ /dev/null @@ -1,47 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMApp; - -/// The `RLMMongoClient` enables reading and writing on a MongoDB database via the Realm Cloud service. -/// -/// It provides access to instances of `RLMMongoDatabase`, which in turn provide access to specific -/// `RLMMongoCollection`s that hold your data. -/// -/// - Note: -/// Before you can read or write data, a user must log in. -/// -/// - SeeAlso: -/// `RLMApp`, `RLMMongoDatabase`, `RLMMongoCollection` -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMMongoClient : NSObject - -/// The name of the client -@property (nonatomic, readonly) NSString *name; - -/// Gets a `RLMMongoDatabase` instance for the given database name. -/// @param name the name of the database to retrieve -- (RLMMongoDatabase *)databaseWithName:(NSString *)name NS_SWIFT_NAME(database(named:)); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMMongoCollection.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMMongoCollection.h deleted file mode 100644 index 0feae60ac..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMMongoCollection.h +++ /dev/null @@ -1,330 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) -@protocol RLMBSON; - -@class RLMFindOptions, RLMFindOneAndModifyOptions, RLMUpdateResult, RLMChangeStream, RLMObjectId; - -/// Delegate which is used for subscribing to changes on a `[RLMMongoCollection watch]` stream. -@protocol RLMChangeEventDelegate -/// The stream was opened. -/// @param changeStream The RLMChangeStream subscribing to the stream changes. -- (void)changeStreamDidOpen:(RLMChangeStream *)changeStream; -/// The stream has been closed. -/// @param error If an error occured when closing the stream, an error will be passed. -- (void)changeStreamDidCloseWithError:(nullable NSError *)error; -/// A error has occured while streaming. -/// @param error The streaming error. -- (void)changeStreamDidReceiveError:(NSError *)error; -/// Invoked when a change event has been received. -/// @param changeEvent The change event in BSON format. -- (void)changeStreamDidReceiveChangeEvent:(id)changeEvent; -@end - -/// Acts as a middleman and processes events with WatchStream -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMChangeStream : NSObject -/// Stops a watch streaming session. -- (void)close; -/// :nodoc: -- (instancetype)init NS_UNAVAILABLE; -@end - -/// The `RLMMongoCollection` represents a MongoDB collection. -/// -/// You can get an instance from a `RLMMongoDatabase`. -/// -/// Create, read, update, and delete methods are available. -/// -/// Operations against the Realm Cloud server are performed asynchronously. -/// -/// - Note: -/// Before you can read or write data, a user must log in. -/// - Usage: -/// RLMMongoClient *client = [self.app mongoClient:@"mongodb1"]; -/// RLMMongoDatabase *database = [client databaseWithName:@"test_data"]; -/// RLMMongoCollection *collection = [database collectionWithName:@"Dog"]; -/// [collection insertOneDocument:@{@"name": @"fido", @"breed": @"cane corso"} completion:...]; -/// -/// - SeeAlso: -/// `RLMMongoClient`, `RLMMongoDatabase` -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMMongoCollection : NSObject -/// Block which returns an object id on a successful insert, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoInsertBlock)(id _Nullable, NSError * _Nullable); -/// Block which returns an array of object ids on a successful insertMany, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoInsertManyBlock)(NSArray> * _Nullable, NSError * _Nullable); -/// Block which returns an array of Documents on a successful find operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoFindBlock)(NSArray> *> * _Nullable, - NSError * _Nullable); -/// Block which returns a Document on a successful findOne operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoFindOneBlock)(NSDictionary> * _Nullable_result, - NSError * _Nullable); -/// Block which returns the number of Documents in a collection on a successful count operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoCountBlock)(NSInteger, NSError * _Nullable); -/// Block which returns an RLMUpdateResult on a successful update operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoUpdateBlock)(RLMUpdateResult * _Nullable, NSError * _Nullable); -/// Block which returns the deleted Document on a successful delete operation, or an error should one occur. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMMongoDeleteBlock)(NSDictionary> * _Nullable_result, - NSError * _Nullable); - -/// The name of this mongodb collection. -@property (nonatomic, readonly) NSString *name; - -/// Encodes the provided value to BSON and inserts it. If the value is missing an identifier, one will be -/// generated for it. -/// @param document A `Document` value to insert. -/// @param completion The result of attempting to perform the insert. An Id will be returned for the inserted object on sucess -- (void)insertOneDocument:(NSDictionary> *)document - completion:(RLMMongoInsertBlock)completion NS_REFINED_FOR_SWIFT; - -/// Encodes the provided values to BSON and inserts them. If any values are missing identifiers, -/// they will be generated. -/// @param documents The `Document` values in a bson array to insert. -/// @param completion The result of the insert, returns an array inserted document ids in order -- (void)insertManyDocuments:(NSArray> *> *)documents - completion:(RLMMongoInsertManyBlock)completion NS_REFINED_FOR_SWIFT; - -/// Finds the documents in this collection which match the provided filter. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param options `RLMFindOptions` to use when executing the command. -/// @param completion The resulting bson array of documents or error if one occurs -- (void)findWhere:(NSDictionary> *)filterDocument - options:(RLMFindOptions *)options - completion:(RLMMongoFindBlock)completion NS_REFINED_FOR_SWIFT; - -/// Finds the documents in this collection which match the provided filter. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param completion The resulting bson array as a string or error if one occurs -- (void)findWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoFindBlock)completion NS_REFINED_FOR_SWIFT; - -/// Returns one document from a collection or view which matches the -/// provided filter. If multiple documents satisfy the query, this method -/// returns the first document according to the query's sort order or natural -/// order. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param options `RLMFindOptions` to use when executing the command. -/// @param completion The resulting bson or error if one occurs -- (void)findOneDocumentWhere:(NSDictionary> *)filterDocument - options:(RLMFindOptions *)options - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Returns one document from a collection or view which matches the -/// provided filter. If multiple documents satisfy the query, this method -/// returns the first document according to the query's sort order or natural -/// order. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param completion The resulting bson or error if one occurs -- (void)findOneDocumentWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Runs an aggregation framework pipeline against this collection. -/// @param pipeline A bson array made up of `Documents` containing the pipeline of aggregation operations to perform. -/// @param completion The resulting bson array of documents or error if one occurs -- (void)aggregateWithPipeline:(NSArray> *> *)pipeline - completion:(RLMMongoFindBlock)completion NS_REFINED_FOR_SWIFT; - -/// Counts the number of documents in this collection matching the provided filter. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param limit The max amount of documents to count -/// @param completion Returns the count of the documents that matched the filter. -- (void)countWhere:(NSDictionary> *)filterDocument - limit:(NSInteger)limit - completion:(RLMMongoCountBlock)completion NS_REFINED_FOR_SWIFT; - -/// Counts the number of documents in this collection matching the provided filter. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param completion Returns the count of the documents that matched the filter. -- (void)countWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoCountBlock)completion NS_REFINED_FOR_SWIFT; - -/// Deletes a single matching document from the collection. -/// @param filterDocument A `Document` as bson that should match the query. -/// @param completion The result of performing the deletion. Returns the count of deleted objects -- (void)deleteOneDocumentWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoCountBlock)completion NS_REFINED_FOR_SWIFT; - -/// Deletes multiple documents -/// @param filterDocument Document representing the match criteria -/// @param completion The result of performing the deletion. Returns the count of the deletion -- (void)deleteManyDocumentsWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoCountBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates a single document matching the provided filter in this collection. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param upsert When true, creates a new document if no document matches the query. -/// @param completion The result of the attempt to update a document. -- (void)updateOneDocumentWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - upsert:(BOOL)upsert - completion:(RLMMongoUpdateBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates a single document matching the provided filter in this collection. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param completion The result of the attempt to update a document. -- (void)updateOneDocumentWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - completion:(RLMMongoUpdateBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates multiple documents matching the provided filter in this collection. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param upsert When true, creates a new document if no document matches the query. -/// @param completion The result of the attempt to update a document. -- (void)updateManyDocumentsWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - upsert:(BOOL)upsert - completion:(RLMMongoUpdateBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates multiple documents matching the provided filter in this collection. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param completion The result of the attempt to update a document. -- (void)updateManyDocumentsWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - completion:(RLMMongoUpdateBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates a single document in a collection based on a query filter and -/// returns the document in either its pre-update or post-update form. Unlike -/// `updateOneDocument`, this action allows you to atomically find, update, and -/// return a document with the same command. This avoids the risk of other -/// update operations changing the document between separate find and update -/// operations. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param options `RemoteFindOneAndModifyOptions` to use when executing the command. -/// @param completion The result of the attempt to update a document. -- (void)findOneAndUpdateWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - options:(RLMFindOneAndModifyOptions *)options - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Updates a single document in a collection based on a query filter and -/// returns the document in either its pre-update or post-update form. Unlike -/// `updateOneDocument`, this action allows you to atomically find, update, and -/// return a document with the same command. This avoids the risk of other -/// update operations changing the document between separate find and update -/// operations. -/// @param filterDocument A bson `Document` representing the match criteria. -/// @param updateDocument A bson `Document` representing the update to be applied to a matching document. -/// @param completion The result of the attempt to update a document. -- (void)findOneAndUpdateWhere:(NSDictionary> *)filterDocument - updateDocument:(NSDictionary> *)updateDocument - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Overwrites a single document in a collection based on a query filter and -/// returns the document in either its pre-replacement or post-replacement -/// form. Unlike `updateOneDocument`, this action allows you to atomically find, -/// replace, and return a document with the same command. This avoids the -/// risk of other update operations changing the document between separate -/// find and update operations. -/// @param filterDocument A `Document` that should match the query. -/// @param replacementDocument A `Document` describing the replacement. -/// @param options `RLMFindOneAndModifyOptions` to use when executing the command. -/// @param completion The result of the attempt to replace a document. -- (void)findOneAndReplaceWhere:(NSDictionary> *)filterDocument - replacementDocument:(NSDictionary> *)replacementDocument - options:(RLMFindOneAndModifyOptions *)options - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Overwrites a single document in a collection based on a query filter and -/// returns the document in either its pre-replacement or post-replacement -/// form. Unlike `updateOneDocument`, this action allows you to atomically find, -/// replace, and return a document with the same command. This avoids the -/// risk of other update operations changing the document between separate -/// find and update operations. -/// @param filterDocument A `Document` that should match the query. -/// @param replacementDocument A `Document` describing the update. -/// @param completion The result of the attempt to replace a document. -- (void)findOneAndReplaceWhere:(NSDictionary> *)filterDocument - replacementDocument:(NSDictionary> *)replacementDocument - completion:(RLMMongoFindOneBlock)completion NS_REFINED_FOR_SWIFT; - -/// Removes a single document from a collection based on a query filter and -/// returns a document with the same form as the document immediately before -/// it was deleted. Unlike `deleteOneDocument`, this action allows you to atomically -/// find and delete a document with the same command. This avoids the risk of -/// other update operations changing the document between separate find and -/// delete operations. -/// @param filterDocument A `Document` that should match the query. -/// @param options `RLMFindOneAndModifyOptions` to use when executing the command. -/// @param completion The result of the attempt to delete a document. -- (void)findOneAndDeleteWhere:(NSDictionary> *)filterDocument - options:(RLMFindOneAndModifyOptions *)options - completion:(RLMMongoDeleteBlock)completion NS_REFINED_FOR_SWIFT; - -/// Removes a single document from a collection based on a query filter and -/// returns a document with the same form as the document immediately before -/// it was deleted. Unlike `deleteOneDocument`, this action allows you to atomically -/// find and delete a document with the same command. This avoids the risk of -/// other update operations changing the document between separate find and -/// delete operations. -/// @param filterDocument A `Document` that should match the query. -/// @param completion The result of the attempt to delete a document. -- (void)findOneAndDeleteWhere:(NSDictionary> *)filterDocument - completion:(RLMMongoDeleteBlock)completion NS_REFINED_FOR_SWIFT; - -/// Opens a MongoDB change stream against the collection to watch for changes. The resulting stream will be notified -/// of all events on this collection that the active user is authorized to see based on the configured MongoDB -/// rules. -/// @param delegate The delegate that will react to events and errors from the resulting change stream. -/// @param queue Dispatches streaming events to an optional queue, if no queue is provided the main queue is used -- (RLMChangeStream *)watchWithDelegate:(id)delegate - delegateQueue:(nullable dispatch_queue_t)queue NS_REFINED_FOR_SWIFT; - -/// Opens a MongoDB change stream against the collection to watch for changes -/// made to specific documents. The documents to watch must be explicitly -/// specified by their _id. -/// @param filterIds The list of _ids in the collection to watch. -/// @param delegate The delegate that will react to events and errors from the resulting change stream. -/// @param queue Dispatches streaming events to an optional queue, if no queue is provided the main queue is used -- (RLMChangeStream *)watchWithFilterIds:(NSArray *)filterIds - delegate:(id)delegate - delegateQueue:(nullable dispatch_queue_t)queue NS_REFINED_FOR_SWIFT; - -/// Opens a MongoDB change stream against the collection to watch for changes. The provided BSON document will be -/// used as a match expression filter on the change events coming from the stream. -/// -/// See https://docs.mongodb.com/manual/reference/operator/aggregation/match/ for documentation around how to define -/// a match filter. -/// -/// Defining the match expression to filter ChangeEvents is similar to defining the match expression for triggers: -/// https://docs.mongodb.com/realm/triggers/database-triggers/ -/// @param matchFilter The $match filter to apply to incoming change events -/// @param delegate The delegate that will react to events and errors from the resulting change stream. -/// @param queue Dispatches streaming events to an optional queue, if no queue is provided the main queue is used -- (RLMChangeStream *)watchWithMatchFilter:(NSDictionary> *)matchFilter - delegate:(id)delegate - delegateQueue:(nullable dispatch_queue_t)queue NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMMongoDatabase.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMMongoDatabase.h deleted file mode 100644 index 177fbc1b8..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMMongoDatabase.h +++ /dev/null @@ -1,51 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMMongoCollection; - -/// The `RLMMongoDatabase` represents a MongoDB database, which holds a group -/// of collections that contain your data. -/// -/// It can be retrieved from the `RLMMongoClient`. -/// -/// Use it to get `RLMMongoCollection`s for reading and writing data. -/// -/// - Note: -/// Before you can read or write data, a user must log in`. -/// -/// - SeeAlso: -/// `RLMMongoClient`, `RLMMongoCollection` -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMMongoDatabase : NSObject - -/// The name of this database -@property (nonatomic, readonly) NSString *name; - -/// Gets a collection. -/// @param name The name of the collection to return -/// @returns The collection -- (RLMMongoCollection *)collectionWithName:(NSString *)name; -// NEXT-MAJOR: NS_SWIFT_NAME(collection(named:)) - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMNetworkTransport.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMNetworkTransport.h deleted file mode 100644 index 2884b4296..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMNetworkTransport.h +++ /dev/null @@ -1,132 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// Allowed HTTP methods to be used with `RLMNetworkTransport`. -typedef RLM_CLOSED_ENUM(int32_t, RLMHTTPMethod) { - /// GET is used to request data from a specified resource. - RLMHTTPMethodGET = 0, - /// POST is used to send data to a server to create/update a resource. - RLMHTTPMethodPOST = 1, - /// PATCH is used to send data to a server to update a resource. - RLMHTTPMethodPATCH = 2, - /// PUT is used to send data to a server to create/update a resource. - RLMHTTPMethodPUT = 3, - /// The DELETE method deletes the specified resource. - RLMHTTPMethodDELETE = 4 -}; - -/// An HTTP request that can be made to an arbitrary server. -@interface RLMRequest : NSObject - -/// The HTTP method of this request. -@property (nonatomic, assign) RLMHTTPMethod method; - -/// The URL to which this request will be made. -@property (nonatomic, strong) NSString *url; - -/// The number of milliseconds that the underlying transport should spend on an -/// HTTP round trip before failing with an error. -@property (nonatomic, assign) NSTimeInterval timeout; - -/// The HTTP headers of this request. -@property (nonatomic, strong) NSDictionary* headers; - -/// The body of the request. -@property (nonatomic, strong) NSString* body; - -@end - -/// The contents of an HTTP response. -@interface RLMResponse : NSObject - -/// The status code of the HTTP response. -@property (nonatomic, assign) NSInteger httpStatusCode; - -/// A custom status code provided by the SDK. -@property (nonatomic, assign) NSInteger customStatusCode; - -/// The headers of the HTTP response. -@property (nonatomic, strong) NSDictionary* headers; - -/// The body of the HTTP response. -@property (nonatomic, strong) NSString *body; - -@end - -/// Delegate which is used for subscribing to changes. -@protocol RLMEventDelegate -/// Invoked when a change event has been received. -/// @param event The change event encoded as NSData -- (void)didReceiveEvent:(NSData *)event; -/// A error has occurred while subscribing to changes. -/// @param error The error that has occurred. -- (void)didReceiveError:(NSError *)error; -/// The stream was opened. -- (void)didOpen; -/// The stream has been closed. -/// @param error The error that has occurred. -- (void)didCloseWithError:(NSError *_Nullable)error; -@end - -/// A block for receiving an `RLMResponse` from the `RLMNetworkTransport`. -RLM_SWIFT_SENDABLE // invoked on a backgroun thread -typedef void(^RLMNetworkTransportCompletionBlock)(RLMResponse *); - -/// Transporting protocol for foreign interfaces. Allows for custom -/// request/response handling. -RLM_SWIFT_SENDABLE // used from multiple threads so must be internally thread-safe -@protocol RLMNetworkTransport - -/** - Sends a request to a given endpoint. - - @param request The request to send. - @param completionBlock A callback invoked on completion of the request. -*/ -- (void)sendRequestToServer:(RLMRequest *)request - completion:(RLMNetworkTransportCompletionBlock)completionBlock; - -/// Starts an event stream request. -/// @param request The RLMRequest to start. -/// @param subscriber The RLMEventDelegate which will subscribe to changes from the server. -- (NSURLSession *)doStreamRequest:(RLMRequest *)request - eventSubscriber:(id)subscriber; - -@end - -/// Transporting protocol for foreign interfaces. Allows for custom -/// request/response handling. -RLM_SWIFT_SENDABLE // is internally thread-safe -@interface RLMNetworkTransport : NSObject - -/** - Sends a request to a given endpoint. - - @param request The request to send. - @param completionBlock A callback invoked on completion of the request. -*/ -- (void)sendRequestToServer:(RLMRequest *) request - completion:(RLMNetworkTransportCompletionBlock)completionBlock; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMObject.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMObject.h deleted file mode 100644 index 9bcfbe310..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMObject.h +++ /dev/null @@ -1,811 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMNotificationToken; -@class RLMObjectSchema; -@class RLMPropertyChange; -@class RLMPropertyDescriptor; -@class RLMRealm; -@class RLMResults; - -/** - `RLMObject` is a base class for model objects representing data stored in Realms. - - Define your model classes by subclassing `RLMObject` and adding properties to be managed. - Then instantiate and use your custom subclasses instead of using the `RLMObject` class directly. - - // Dog.h - @interface Dog : RLMObject - @property NSString *name; - @property BOOL adopted; - @end - - // Dog.m - @implementation Dog - @end //none needed - - ### Supported property types - - - `NSString` - - `NSInteger`, `int`, `long`, `float`, and `double` - - `BOOL` or `bool` - - `NSDate` - - `NSData` - - `NSNumber`, where `X` is one of `RLMInt`, `RLMFloat`, `RLMDouble` or `RLMBool`, for optional number properties - - `RLMObject` subclasses, to model many-to-one relationships. - - `RLMArray`, where `X` is an `RLMObject` subclass, to model many-to-many relationships. - - ### Querying - - You can initiate queries directly via the class methods: `allObjects`, `objectsWhere:`, and `objectsWithPredicate:`. - These methods allow you to easily query a custom subclass for instances of that class in the default Realm. - - To search in a Realm other than the default Realm, use the `allObjectsInRealm:`, `objectsInRealm:where:`, - and `objectsInRealm:withPredicate:` class methods. - - @see `RLMRealm` - - ### Relationships - - See our [Realm Swift Documentation](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/relationships/#relationships) for more details. - - ### Key-Value Observing - - All `RLMObject` properties (including properties you create in subclasses) are - [Key-Value Observing compliant](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/KeyValueObserving/KeyValueObserving.html), - except for `realm` and `objectSchema`. - - Keep the following tips in mind when observing Realm objects: - - 1. Unlike `NSMutableArray` properties, `RLMArray` properties do not require - using the proxy object returned from `-mutableArrayValueForKey:`, or defining - KVC mutation methods on the containing class. You can simply call methods on - the `RLMArray` directly; any changes will be automatically observed by the containing - object. - 2. Unmanaged `RLMObject` instances cannot be added to a Realm while they have any - observed properties. - 3. Modifying managed `RLMObject`s within `-observeValueForKeyPath:ofObject:change:context:` - is not recommended. Properties may change even when the Realm is not in a write - transaction (for example, when `-[RLMRealm refresh]` is called after changes - are made on a different thread), and notifications sent prior to the change - being applied (when `NSKeyValueObservingOptionPrior` is used) may be sent at - times when you *cannot* begin a write transaction. - */ - -@interface RLMObject : RLMObjectBase - -#pragma mark - Creating & Initializing Objects - -/** - Creates an unmanaged instance of a Realm object. - - Call `addObject:` on an `RLMRealm` instance to add an unmanaged object into that Realm. - - @see `[RLMRealm addObject:]` - */ -- (instancetype)init NS_DESIGNATED_INITIALIZER; - - -/** - Creates an unmanaged instance of a Realm object. - - Pass in an `NSArray` or `NSDictionary` instance to set the values of the object's properties. - - Call `addObject:` on an `RLMRealm` instance to add an unmanaged object into that Realm. - - @see `[RLMRealm addObject:]` - */ -- (instancetype)initWithValue:(id)value; - - -/** - Returns the class name for a Realm object subclass. - - @warning Do not override. Realm relies on this method returning the exact class - name. - - @return The class name for the model class. - */ -+ (NSString *)className; - -/** - Creates an instance of a Realm object with a given value, and adds it to the default Realm. - - If nested objects are included in the argument, `createInDefaultRealmWithValue:` will be recursively called - on them. - - The `value` argument can be a key-value coding compliant object, an array or dictionary returned from the methods in - `NSJSONSerialization`, or an array containing one element for each managed property. - - An exception will be thrown if any required properties are not present and those properties - were not defined with default values. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param value The value used to populate the object. - - @see `defaultPropertyValues` - */ -+ (instancetype)createInDefaultRealmWithValue:(id)value; - -/** - Creates an instance of a Realm object with a given value, and adds it to the specified Realm. - - If nested objects are included in the argument, `createInRealm:withValue:` will be recursively called - on them. - - The `value` argument can be a key-value coding compliant object, an array or dictionary returned from the methods in - `NSJSONSerialization`, or an array containing one element for each managed property. - - An exception will be thrown if any required properties are not present and those properties - were not defined with default values. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param realm The Realm which should manage the newly-created object. - @param value The value used to populate the object. - - @see `defaultPropertyValues` - */ -+ (instancetype)createInRealm:(RLMRealm *)realm withValue:(id)value; - -/** - Creates or updates a Realm object within the default Realm. - - This method may only be called on Realm object types with a primary key defined. If there is already - an object with the same primary key value in the default Realm, its values are updated and the object - is returned. Otherwise, this method creates and populates a new instance of the object in the default Realm. - - If nested objects are included in the argument, `createOrUpdateInDefaultRealmWithValue:` will be - recursively called on them if they have primary keys, `createInDefaultRealmWithValue:` if they do not. - - The `value` argument is used to populate the object. It can be a Realm object, a key-value coding - compliant object, an array or dictionary returned from the methods in `NSJSONSerialization`, or an - array containing one element for each managed property. - - If the object is being created, an exception will be thrown if any required properties - are not present and those properties were not defined with default values. - - If the `value` argument is a Realm object already managed by the default Realm, the - argument's type is the same as the receiver, and the objects have identical values for - their managed properties, this method does nothing. - - If the object is being updated, each property defined in its schema will be set by copying from - `value` using key-value coding. If the `value` argument does not respond to `valueForKey:` for a - given property name (or getter name, if defined), that value will remain untouched. - Nullable properties on the object can be set to nil by using `NSNull` as the updated value. - Each property is set even if the existing value is the same as the new value being set, and - notifications will report them all being changed. See `createOrUpdateModifiedInDefaultRealmWithValue:` - for a version of this function which only sets the values which have changed. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param value The value used to populate the object. - - @see `defaultPropertyValues`, `primaryKey` - */ -+ (instancetype)createOrUpdateInDefaultRealmWithValue:(id)value; - -/** - Creates or updates a Realm object within the default Realm. - - This method may only be called on Realm object types with a primary key defined. If there is already - an object with the same primary key value in the default Realm, its values are updated and the object - is returned. Otherwise, this method creates and populates a new instance of the object in the default Realm. - - If nested objects are included in the argument, `createOrUpdateModifiedInDefaultRealmWithValue:` will be - recursively called on them if they have primary keys, `createInDefaultRealmWithValue:` if they do not. - - The `value` argument is used to populate the object. It can be a Realm object, a key-value coding - compliant object, an array or dictionary returned from the methods in `NSJSONSerialization`, or an - array containing one element for each managed property. - - If the object is being created, an exception will be thrown if any required properties - are not present and those properties were not defined with default values. - - If the `value` argument is a Realm object already managed by the default Realm, the - argument's type is the same as the receiver, and the objects have identical values for - their managed properties, this method does nothing. - - If the object is being updated, each property defined in its schema will be set by copying from - `value` using key-value coding. If the `value` argument does not respond to `valueForKey:` for a - given property name (or getter name, if defined), that value will remain untouched. - Nullable properties on the object can be set to nil by using `NSNull` as the updated value. - Unlike `createOrUpdateInDefaultRealmWithValue:`, only properties which have changed in value are - set, and any change notifications produced by this call will report only which properies have - actually changed. - - Checking which properties have changed imposes a small amount of overhead, and so this method - may be slower when all or nearly all of the properties being set have changed. If most or all - of the properties being set have not changed, this method will be much faster than unconditionally - setting all of them, and will also reduce how much data has to be written to the Realm, saving - both i/o time and disk space. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param value The value used to populate the object. - - @see `defaultPropertyValues`, `primaryKey` - */ -+ (instancetype)createOrUpdateModifiedInDefaultRealmWithValue:(id)value; - -/** - Creates or updates an Realm object within a specified Realm. - - This method may only be called on Realm object types with a primary key defined. If there is already - an object with the same primary key value in the given Realm, its values are updated and the object - is returned. Otherwise this method creates and populates a new instance of this object in the given Realm. - - If nested objects are included in the argument, `createOrUpdateInRealm:withValue:` will be - recursively called on them if they have primary keys, `createInRealm:withValue:` if they do not. - - The `value` argument is used to populate the object. It can be a Realm object, a key-value coding - compliant object, an array or dictionary returned from the methods in `NSJSONSerialization`, or an - array containing one element for each managed property. - - If the object is being created, an exception will be thrown if any required properties - are not present and those properties were not defined with default values. - - If the `value` argument is a Realm object already managed by the given Realm, the - argument's type is the same as the receiver, and the objects have identical values for - their managed properties, this method does nothing. - - If the object is being updated, each property defined in its schema will be set by copying from - `value` using key-value coding. If the `value` argument does not respond to `valueForKey:` for a - given property name (or getter name, if defined), that value will remain untouched. - Nullable properties on the object can be set to nil by using `NSNull` as the updated value. - Each property is set even if the existing value is the same as the new value being set, and - notifications will report them all being changed. See `createOrUpdateModifiedInRealm:withValue:` - for a version of this function which only sets the values which have changed. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param realm The Realm which should own the object. - @param value The value used to populate the object. - - @see `defaultPropertyValues`, `primaryKey` - */ -+ (instancetype)createOrUpdateInRealm:(RLMRealm *)realm withValue:(id)value; - -/** - Creates or updates an Realm object within a specified Realm. - - This method may only be called on Realm object types with a primary key defined. If there is already - an object with the same primary key value in the given Realm, its values are updated and the object - is returned. Otherwise this method creates and populates a new instance of this object in the given Realm. - - If nested objects are included in the argument, `createOrUpdateInRealm:withValue:` will be - recursively called on them if they have primary keys, `createInRealm:withValue:` if they do not. - - The `value` argument is used to populate the object. It can be a Realm object, a key-value coding - compliant object, an array or dictionary returned from the methods in `NSJSONSerialization`, or an - array containing one element for each managed property. - - If the object is being created, an exception will be thrown if any required properties - are not present and those properties were not defined with default values. - - If the `value` argument is a Realm object already managed by the given Realm, the - argument's type is the same as the receiver, and the objects have identical values for - their managed properties, this method does nothing. - - If the object is being updated, each property defined in its schema will be set by copying from - `value` using key-value coding. If the `value` argument does not respond to `valueForKey:` for a - given property name (or getter name, if defined), that value will remain untouched. - Nullable properties on the object can be set to nil by using `NSNull` as the updated value. - Unlike `createOrUpdateInRealm:withValue:`, only properties which have changed in value are - set, and any change notifications produced by this call will report only which properies have - actually changed. - - Checking which properties have changed imposes a small amount of overhead, and so this method - may be slower when all or nearly all of the properties being set have changed. If most or all - of the properties being set have not changed, this method will be much faster than unconditionally - setting all of them, and will also reduce how much data has to be written to the Realm, saving - both i/o time and disk space. - - If the `value` argument is an array, all properties must be present, valid and in the same - order as the properties defined in the model. - - @param realm The Realm which should own the object. - @param value The value used to populate the object. - - @see `defaultPropertyValues`, `primaryKey` - */ -+ (instancetype)createOrUpdateModifiedInRealm:(RLMRealm *)realm withValue:(id)value; - -#pragma mark - Properties - -/** - The Realm which manages the object, or `nil` if the object is unmanaged. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - The object schema which lists the managed properties for the object. - */ -@property (nonatomic, readonly) RLMObjectSchema *objectSchema; - -/** - Indicates if the object can no longer be accessed because it is now invalid. - - An object can no longer be accessed if the object has been deleted from the Realm that manages it, or - if `invalidate` is called on that Realm. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if this object is frozen. - - @see `-[RLMObject freeze]` - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - - -#pragma mark - Customizing your Objects - -/** - Returns an array of property names for properties which should be indexed. - - Only string, integer, boolean, and `NSDate` properties are supported. - - @return An array of property names. - */ -+ (NSArray *)indexedProperties; - -/** - Override this method to specify the default values to be used for each property. - - @return A dictionary mapping property names to their default values. - */ -+ (nullable NSDictionary *)defaultPropertyValues; - -/** - Override this method to specify the name of a property to be used as the primary key. - - Only properties of types `RLMPropertyTypeString` and `RLMPropertyTypeInt` can be designated as the primary key. - Primary key properties enforce uniqueness for each value whenever the property is set, which incurs minor overhead. - Indexes are created automatically for primary key properties. - - @return The name of the property designated as the primary key. - */ -+ (nullable NSString *)primaryKey; - -/** - Override this method to specify the names of properties to ignore. These properties will not be managed by the Realm - that manages the object. - - @return An array of property names to ignore. - */ -+ (nullable NSArray *)ignoredProperties; - -/** - Override this method to specify the names of properties that are non-optional (i.e. cannot be assigned a `nil` value). - - By default, all properties of a type whose values can be set to `nil` are considered optional properties. - To require that an object in a Realm always store a non-`nil` value for a property, - add the name of the property to the array returned from this method. - - Properties of `RLMObject` type cannot be non-optional. Array and `NSNumber` properties - can be non-optional, but there is no reason to do so: arrays do not support storing nil, and - if you want a non-optional number you should instead use the primitive type. - - @return An array of property names that are required. - */ -+ (NSArray *)requiredProperties; - -/** - Override this method to provide information related to properties containing linking objects. - - Each property of type `RLMLinkingObjects` must have a key in the dictionary returned by this method consisting - of the property name. The corresponding value must be an instance of `RLMPropertyDescriptor` that describes the class - and property that the property is linked to. - - return @{ @"owners": [RLMPropertyDescriptor descriptorWithClass:Owner.class propertyName:@"dogs"] }; - - @return A dictionary mapping property names to `RLMPropertyDescriptor` instances. - */ -+ (NSDictionary *)linkingObjectsProperties; - -#pragma mark - Getting & Querying Objects from the Default Realm - -/** - Returns all objects of this object type from the default Realm. - - @return An `RLMResults` containing all objects of this type in the default Realm. - */ -+ (RLMResults *)allObjects; - -/** - Returns all objects of this object type matching the given predicate from the default Realm. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` containing all objects of this type in the default Realm that match the given predicate. - */ -+ (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -+ (RLMResults<__kindof RLMObject *> *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - - -/** - Returns all objects of this object type matching the given predicate from the default Realm. - - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` containing all objects of this type in the default Realm that match the given predicate. - */ -+ (RLMResults *)objectsWithPredicate:(nullable NSPredicate *)predicate; - -/** - Retrieves the single instance of this object type with the given primary key from the default Realm. - - Returns the object from the default Realm which has the given primary key, or - `nil` if the object does not exist. This is slightly faster than the otherwise - equivalent `[[SubclassName objectsWhere:@"primaryKeyPropertyName = %@", key] firstObject]`. - - This method requires that `primaryKey` be overridden on the receiving subclass. - - @return An object of this object type, or `nil` if an object with the given primary key does not exist. - @see `-primaryKey` - */ -+ (nullable instancetype)objectForPrimaryKey:(nullable id)primaryKey NS_SWIFT_NAME(object(forPrimaryKey:)); - - -#pragma mark - Querying Specific Realms - -/** - Returns all objects of this object type from the specified Realm. - - @param realm The Realm to query. - - @return An `RLMResults` containing all objects of this type in the specified Realm. - */ -+ (RLMResults *)allObjectsInRealm:(RLMRealm *)realm; - -/** - Returns all objects of this object type matching the given predicate from the specified Realm. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - @param realm The Realm to query. - - @return An `RLMResults` containing all objects of this type in the specified Realm that match the given predicate. - */ -+ (RLMResults *)objectsInRealm:(RLMRealm *)realm where:(NSString *)predicateFormat, ...; - -/// :nodoc: -+ (RLMResults<__kindof RLMObject *> *)objectsInRealm:(RLMRealm *)realm where:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all objects of this object type matching the given predicate from the specified Realm. - - @param predicate A predicate to use to filter the elements. - @param realm The Realm to query. - - @return An `RLMResults` containing all objects of this type in the specified Realm that match the given predicate. - */ -+ (RLMResults *)objectsInRealm:(RLMRealm *)realm withPredicate:(nullable NSPredicate *)predicate; - -/** - Retrieves the single instance of this object type with the given primary key from the specified Realm. - - Returns the object from the specified Realm which has the given primary key, or - `nil` if the object does not exist. This is slightly faster than the otherwise - equivalent `[[SubclassName objectsInRealm:realm where:@"primaryKeyPropertyName = %@", key] firstObject]`. - - This method requires that `primaryKey` be overridden on the receiving subclass. - - @return An object of this object type, or `nil` if an object with the given primary key does not exist. - @see `-primaryKey` - */ -+ (nullable instancetype)objectInRealm:(RLMRealm *)realm forPrimaryKey:(nullable id)primaryKey NS_SWIFT_NAME(object(in:forPrimaryKey:)); - -#pragma mark - Notifications - -/** - A callback block for `RLMObject` notifications. - - If the object is deleted from the managing Realm, the block is called with - `deleted` set to `YES` and the other two arguments are `nil`. The block will - never be called again after this. - - If the object is modified, the block will be called with `deleted` set to - `NO`, a `nil` error, and an array of `RLMPropertyChange` objects which - indicate which properties of the objects were modified. - - `error` is always `nil` and will be removed in a future version. - */ -typedef void (^RLMObjectChangeBlock)(BOOL deleted, - NSArray *_Nullable changes, - NSError *_Nullable error); - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When notifications - can't be delivered instantly, multiple notifications may be coalesced into a - single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - - @param block The block to be called whenever a change occurs. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block queue:(dispatch_queue_t)queue; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block keyPaths:(NSArray *)keyPaths queue:(dispatch_queue_t)queue; - -/** - Registers a block to be called each time the object changes. - - The block will be asynchronously called after each write transaction which - deletes the object or modifies any of the managed properties of the object, - including self-assignments that set a property to its existing value. - - For write transactions performed on different threads or in different - processes, the block will be called when the managing Realm is - (auto)refreshed to a version including the changes, while for local write - transactions it will be called at some point in the future after the write - transaction is committed. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - Unlike with `RLMArray` and `RLMResults`, there is no "initial" callback made - after you add a new notification block. - - Only objects which are managed by a Realm can be observed in this way. You - must retain the returned token for as long as you want updates to be sent to - the block. To stop receiving updates, call `-invalidate` on the token. - - It is safe to capture a strong reference to the observed object within the - callback block. There is no retain cycle due to that the callback is retained - by the returned token and not by the object itself. - - @warning This method cannot be called during a write transaction, when the - containing Realm is read-only, or on an unmanaged object. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMObjectChangeBlock)block keyPaths:(NSArray *)keyPaths; - - -#pragma mark - Other Instance Methods - -/** - Returns YES if another Realm object instance points to the same object as the receiver in the Realm managing - the receiver. - - For frozen objects and object types with a primary key, `isEqual:` is - overridden to use the same logic as this method (along with a corresponding - implementation for `hash`). Non-frozen objects without primary keys use - pointer identity for `isEqual:` and `hash`. - - @param object The object to compare the receiver to. - - @return Whether the object represents the same object as the receiver. - */ -- (BOOL)isEqualToObject:(RLMObject *)object; - -/** - Returns a frozen (immutable) snapshot of this object. - - The frozen copy is an immutable object which contains the same data as this - object currently contains, but will not update when writes are made to the - containing Realm. Unlike live objects, frozen objects can be accessed from any - thread. - - - warning: Holding onto a frozen object for an extended period while performing write - transaction on the Realm may result in the Realm file growing to large sizes. See - `Realm.Configuration.maximumNumberOfActiveVersions` for more information. - - warning: This method can only be called on a managed object. - */ -- (instancetype)freeze NS_RETURNS_RETAINED; - -/** - Returns a live (mutable) reference of this object. - - This method creates a managed accessor to a live copy of the same frozen object. - Will return self if called on an already live object. - */ -- (instancetype)thaw; - -#pragma mark - Dynamic Accessors - -/// :nodoc: -- (nullable id)objectForKeyedSubscript:(NSString *)key; - -/// :nodoc: -- (void)setObject:(nullable id)obj forKeyedSubscript:(NSString *)key; - -@end - -/** - Information about a specific property which changed in an `RLMObject` change notification. - */ -@interface RLMPropertyChange : NSObject - -/** - The name of the property which changed. - */ -@property (nonatomic, readonly, strong) NSString *name; - -/** - The value of the property before the change occurred. This will always be `nil` - if the change happened on the same thread as the notification and for `RLMArray` - properties. - - For object properties this will give the object which was previously linked to, - but that object will have its new values and not the values it had before the - changes. This means that `previousValue` may be a deleted object, and you will - need to check `invalidated` before accessing any of its properties. - */ -@property (nonatomic, readonly, strong, nullable) id previousValue; - -/** - The value of the property after the change occurred. This will always be `nil` - for `RLMArray` properties. - */ -@property (nonatomic, readonly, strong, nullable) id value; -@end - -#pragma mark - RLMArray Property Declaration - -/** - Properties on `RLMObject`s of type `RLMArray` must have an associated type. A type is associated - with an `RLMArray` property by defining a protocol for the object type that the array should contain. - To define the protocol for an object, you can use the macro RLM_ARRAY_TYPE: - - RLM_ARRAY_TYPE(ObjectType) - ... - @property RLMArray *arrayOfObjectTypes; - */ -#define RLM_ARRAY_TYPE(RLM_OBJECT_SUBCLASS)\ -__attribute__((deprecated("RLM_ARRAY_TYPE has been deprecated. Use RLM_COLLECTION_TYPE instead."))) \ -@protocol RLM_OBJECT_SUBCLASS \ -@end - -/** - Properties on `RLMObject`s of type `RLMSet` / `RLMArray` must have an associated type. A type is associated - with an `RLMSet` / `RLMArray` property by defining a protocol for the object type that the array should contain. - To define the protocol for an object, you can use the macro RLM_COLLECTION_TYPE: - - RLM_COLLECTION_TYPE(ObjectType) - ... - @property RLMSet *setOfObjectTypes; - @property RLMArray *arrayOfObjectTypes; - */ -#define RLM_COLLECTION_TYPE(RLM_OBJECT_SUBCLASS)\ -@protocol RLM_OBJECT_SUBCLASS \ -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMObjectBase.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMObjectBase.h deleted file mode 100644 index 7e9c83c8f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMObjectBase.h +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// :nodoc: -@interface RLMObjectBase : NSObject - -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -- (instancetype)init NS_DESIGNATED_INITIALIZER; - -+ (NSString *)className; - -// Returns whether the class is included in the default set of classes managed by a Realm. -+ (BOOL)shouldIncludeInDefaultSchema; - -+ (nullable NSString *)_realmObjectName; -+ (nullable NSDictionary *)_realmColumnNames; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMObjectBase_Dynamic.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMObjectBase_Dynamic.h deleted file mode 100644 index fb74a5b27..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMObjectBase_Dynamic.h +++ /dev/null @@ -1,82 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectSchema, RLMRealm; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -/** - Returns the Realm that manages the object, if one exists. - - @warning This function is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is - recommended to retrieve the Realm that manages the object via `RLMObject`. - - @param object An `RLMObjectBase` obtained via a Swift `Object` or `RLMObject`. - - @return The Realm which manages this object. Returns `nil `for unmanaged objects. - */ -FOUNDATION_EXTERN RLMRealm * _Nullable RLMObjectBaseRealm(RLMObjectBase * _Nullable object); - -/** - Returns an `RLMObjectSchema` which describes the managed properties of the object. - - @warning This function is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is - recommended to retrieve `objectSchema` via `RLMObject`. - - @param object An `RLMObjectBase` obtained via a Swift `Object` or `RLMObject`. - - @return The object schema which lists the managed properties for the object. - */ -FOUNDATION_EXTERN RLMObjectSchema * _Nullable RLMObjectBaseObjectSchema(RLMObjectBase * _Nullable object); - -/** - Returns the object corresponding to a key value. - - @warning This function is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is - recommended to retrieve key values via `RLMObject`. - - @warning Will throw an `NSUndefinedKeyException` if `key` is not present on the object. - - @param object An `RLMObjectBase` obtained via a Swift `Object` or `RLMObject`. - @param key The name of the property. - - @return The object for the property requested. - */ -FOUNDATION_EXTERN id _Nullable RLMObjectBaseObjectForKeyedSubscript(RLMObjectBase * _Nullable object, NSString *key); - -/** - Sets a value for a key on the object. - - @warning This function is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is - recommended to set key values via `RLMObject`. - - @warning Will throw an `NSUndefinedKeyException` if `key` is not present on the object. - - @param object An `RLMObjectBase` obtained via a Swift `Object` or `RLMObject`. - @param key The name of the property. - @param obj The object to set as the value of the key. - */ -FOUNDATION_EXTERN void RLMObjectBaseSetObjectForKeyedSubscript(RLMObjectBase * _Nullable object, NSString *key, id _Nullable obj); - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMObjectId.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMObjectId.h deleted file mode 100644 index 32ef7b047..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMObjectId.h +++ /dev/null @@ -1,79 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A 12-byte (probably) unique object identifier. - - ObjectIds are similar to a GUID or a UUID, and can be used to uniquely identify - objects without a centralized ID generator. An ObjectID consists of: - - 1. A 4 byte timestamp measuring the creation time of the ObjectId in seconds - since the Unix epoch. - 2. A 5 byte random value - 3. A 3 byte counter, initialized to a random value. - - ObjectIds are intended to be fast to generate. Sorting by an ObjectId field - will typically result in the objects being sorted in creation order. - */ -RLM_SWIFT_SENDABLE // immutable -@interface RLMObjectId : NSObject -/// Creates a new randomly-initialized ObjectId. -+ (nonnull instancetype)objectId NS_SWIFT_NAME(generate()); - -/// Creates a new zero-initialized ObjectId. -- (instancetype)init; - -/// Creates a new ObjectId from the given 24-byte hexadecimal string. -/// -/// Returns `nil` and sets `error` if the string is not 24 characters long or -/// contains any characters other than 0-9a-fA-F. -/// -/// @param string The string to parse. -- (nullable instancetype)initWithString:(NSString *)string - error:(NSError **)error; - -/// Creates a new ObjectId using the given date, machine identifier, process identifier. -/// -/// @param timestamp A timestamp as NSDate. -/// @param machineIdentifier The machine identifier. -/// @param processIdentifier The process identifier. -- (instancetype)initWithTimestamp:(NSDate *)timestamp - machineIdentifier:(int)machineIdentifier - processIdentifier:(int)processIdentifier; - -/// Comparision operator to check if the right hand side is greater than the current value. -- (BOOL)isGreaterThan:(nullable RLMObjectId *)objectId; -/// Comparision operator to check if the right hand side is greater than or equal to the current value. -- (BOOL)isGreaterThanOrEqualTo:(nullable RLMObjectId *)objectId; -/// Comparision operator to check if the right hand side is less than the current value. -- (BOOL)isLessThan:(nullable RLMObjectId *)objectId; -/// Comparision operator to check if the right hand side is less than or equal to the current value. -- (BOOL)isLessThanOrEqualTo:(nullable RLMObjectId *)objectId; - -/// Get the ObjectId as a 24-character hexadecimal string. -@property (nonatomic, readonly) NSString *stringValue; -/// Get the timestamp for the RLMObjectId -@property (nonatomic, readonly) NSDate *timestamp; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMObjectSchema.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMObjectSchema.h deleted file mode 100644 index 9c4666b7c..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMObjectSchema.h +++ /dev/null @@ -1,83 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMProperty; - -/** - This class represents Realm model object schemas. - - When using Realm, `RLMObjectSchema` instances allow performing migrations and - introspecting the database's schema. - - Object schemas map to tables in the core database. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // not actually immutable, but the public API kinda is -@interface RLMObjectSchema : NSObject - -#pragma mark - Properties - -/** - An array of `RLMProperty` instances representing the managed properties of a class described by the schema. - - @see `RLMProperty` - */ -@property (nonatomic, readonly, copy) NSArray *properties; - -/** - The name of the class the schema describes. - */ -@property (nonatomic, readonly) NSString *className; - -/** - The property which serves as the primary key for the class the schema describes, if any. - */ -@property (nonatomic, readonly, nullable) RLMProperty *primaryKeyProperty; - -/** - Whether this object type is embedded. - */ -@property (nonatomic, readonly) BOOL isEmbedded; - -/** - Whether this object is asymmetric. - */ -@property (nonatomic, readonly) BOOL isAsymmetric; - -#pragma mark - Methods - -/** - Retrieves an `RLMProperty` object by the property name. - - @param propertyName The property's name. - - @return An `RLMProperty` object, or `nil` if there is no property with the given name. - */ -- (nullable RLMProperty *)objectForKeyedSubscript:(NSString *)propertyName; - -/** - Returns whether two `RLMObjectSchema` instances are equal. - */ -- (BOOL)isEqualToObjectSchema:(RLMObjectSchema *)objectSchema; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMProperty.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMProperty.h deleted file mode 100644 index 7f2594d3b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMProperty.h +++ /dev/null @@ -1,149 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// :nodoc: -@protocol RLMInt @end -/// :nodoc: -@protocol RLMBool @end -/// :nodoc: -@protocol RLMDouble @end -/// :nodoc: -@protocol RLMFloat @end -/// :nodoc: -@protocol RLMString @end -/// :nodoc: -@protocol RLMDate @end -/// :nodoc: -@protocol RLMData @end -/// :nodoc: -@protocol RLMDecimal128 @end -/// :nodoc: -@protocol RLMObjectId @end -/// :nodoc: -@protocol RLMUUID @end - -/// :nodoc: -@interface NSNumber () -@end - -/** - `RLMProperty` instances represent properties managed by a Realm in the context - of an object schema. Such properties may be persisted to a Realm file or - computed from other data from the Realm. - - When using Realm, `RLMProperty` instances allow performing migrations and - introspecting the database's schema. - - These property instances map to columns in the core database. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // not actually immutable, but the public API kinda is -@interface RLMProperty : NSObject - -#pragma mark - Properties - -/** - The name of the property. - */ -@property (nonatomic, readonly) NSString *name; - -/** - The type of the property. - - @see `RLMPropertyType` - */ -@property (nonatomic, readonly) RLMPropertyType type; - -/** - Indicates whether this property is indexed. - - @see `RLMObject` - */ -@property (nonatomic, readonly) BOOL indexed; - -/** - For `RLMObject` and `RLMCollection` properties, the name of the class of object stored in the property. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - For linking objects properties, the property name of the property the linking objects property is linked to. - */ -@property (nonatomic, readonly, copy, nullable) NSString *linkOriginPropertyName; - -/** - Indicates whether this property is optional. - */ -@property (nonatomic, readonly) BOOL optional; - -/** - Indicates whether this property is an array. - */ -@property (nonatomic, readonly) BOOL array; - -/** - Indicates whether this property is a set. - */ -@property (nonatomic, readonly) BOOL set; - -/** - Indicates whether this property is a dictionary. - */ -@property (nonatomic, readonly) BOOL dictionary; - -/** - Indicates whether this property is an array or set. - */ -@property (nonatomic, readonly) BOOL collection; - -#pragma mark - Methods - -/** - Returns whether a given property object is equal to the receiver. - */ -- (BOOL)isEqualToProperty:(RLMProperty *)property; - -@end - - -/** - An `RLMPropertyDescriptor` instance represents a specific property on a given class. - */ -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMPropertyDescriptor : NSObject - -/** - Creates and returns a property descriptor. - - @param objectClass The class of this property descriptor. - @param propertyName The name of this property descriptor. - */ -+ (instancetype)descriptorWithClass:(Class)objectClass propertyName:(NSString *)propertyName; - -/// The class of the property. -@property (nonatomic, readonly) Class objectClass; - -/// The name of the property. -@property (nonatomic, readonly) NSString *propertyName; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMProviderClient.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMProviderClient.h deleted file mode 100644 index ac649960a..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMProviderClient.h +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMApp; - -/// Base provider client interface. -RLM_SWIFT_SENDABLE -@interface RLMProviderClient : NSObject - -/// The app associated with this provider client. -@property (nonatomic, strong, readonly) RLMApp *app; - -/** - Initialize a provider client with a given app. - @param app The app for this provider client. - */ -- (instancetype)initWithApp:(RLMApp *)app; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMPushClient.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMPushClient.h deleted file mode 100644 index 0628c3ada..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMPushClient.h +++ /dev/null @@ -1,47 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMApp, RLMUser; - -/// A block type used to report an error -RLM_SWIFT_SENDABLE // invoked on a backgroun thread -typedef void(^RLMOptionalErrorBlock)(NSError * _Nullable); - -/// A client which can be used to register devices with the server to receive push notificatons -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMPushClient : NSObject - -/// The push notification service name the device will be registered with on the server -@property (nonatomic, readonly, nonnull) NSString *serviceName; - -/// Request to register device token to the server -- (void)registerDeviceWithToken:(NSString *)token - user:(RLMUser *)user - completion:(RLMOptionalErrorBlock)completion NS_SWIFT_NAME(registerDevice(token:user:completion:)); - -/// Request to deregister a device for a user -- (void)deregisterDeviceForUser:(RLMUser *)user - completion:(RLMOptionalErrorBlock)completion NS_SWIFT_NAME(deregisterDevice(user:completion:)); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMRealm+Sync.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMRealm+Sync.h deleted file mode 100644 index ff20e43c2..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMRealm+Sync.h +++ /dev/null @@ -1,38 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2017 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -@class RLMResults, RLMSyncSession; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -/// -@interface RLMRealm (Sync) - -/** - Get the RLMSyncSession used by this Realm. Will be nil if this is not a - synchronized Realm. -*/ -@property (nonatomic, nullable, readonly) RLMSyncSession *syncSession; - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMRealm.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMRealm.h deleted file mode 100644 index 0935e5301..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMRealm.h +++ /dev/null @@ -1,962 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMRealmConfiguration, RLMRealm, RLMObject, RLMSchema, RLMMigration, RLMNotificationToken, RLMThreadSafeReference, RLMAsyncOpenTask, RLMSyncSubscriptionSet; - -/** - A callback block for opening Realms asynchronously. - - Returns the Realm if the open was successful, or an error otherwise. - */ -typedef void(^RLMAsyncOpenRealmCallback)(RLMRealm * _Nullable realm, NSError * _Nullable error); - -/// The Id of the asynchronous transaction. -typedef unsigned RLMAsyncTransactionId; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - An `RLMRealm` instance (also referred to as "a Realm") represents a Realm - database. - - Realms can either be stored on disk (see `+[RLMRealm realmWithURL:]`) or in - memory (see `RLMRealmConfiguration`). - - `RLMRealm` instances are cached internally, and constructing equivalent `RLMRealm` - objects (for example, by using the same path or identifier) multiple times on a single thread - within a single iteration of the run loop will normally return the same - `RLMRealm` object. - - If you specifically want to ensure an `RLMRealm` instance is - destroyed (for example, if you wish to open a Realm, check some property, and - then possibly delete the Realm file and re-open it), place the code which uses - the Realm within an `@autoreleasepool {}` and ensure you have no other - strong references to it. - - @warning Non-frozen `RLMRealm` instances are thread-confined and cannot be - shared across threads or dispatch queues. Trying to do so will cause an - exception to be thrown. You must call this method on each thread you want to - interact with the Realm on. For dispatch queues, this means that you must call - it in each block which is dispatched, as a queue is not guaranteed to run all - of its blocks on the same thread. - */ - -@interface RLMRealm : NSObject - -#pragma mark - Creating & Initializing a Realm - -/** - Obtains an instance of the default Realm. - - The default Realm is used by the `RLMObject` class methods - which do not take an `RLMRealm` parameter, but is otherwise not special. The - default Realm is persisted as *default.realm* under the *Documents* directory of - your Application on iOS, in your application's *Application Support* - directory on macOS, and in the *Cache* directory on tvOS. - - The default Realm is created using the default `RLMRealmConfiguration`, which - can be changed via `+[RLMRealmConfiguration setDefaultConfiguration:]`. - - @return The default `RLMRealm` instance for the current thread. - */ -+ (instancetype)defaultRealm; - -/** - Obtains an instance of the default Realm bound to the given queue. - - Rather than being confined to the thread they are opened on, queue-bound - RLMRealms are confined to the given queue. They can be accessed from any - thread as long as it is from within a block dispatch to the queue, and - notifications will be delivered to the queue instead of a thread's run loop. - - Realms can only be confined to a serial queue. Queue-confined RLMRealm - instances can be obtained when not on that queue, but attempting to do - anything with that instance without first dispatching to the queue will throw - an incorrect thread exception. - - The default Realm is created using the default `RLMRealmConfiguration`, which - can be changed via `+[RLMRealmConfiguration setDefaultConfiguration:]`. - - @param queue A serial dispatch queue to confine the Realm to. - @return The default `RLMRealm` instance for the given queue. - */ -+ (instancetype)defaultRealmForQueue:(dispatch_queue_t)queue; - -/** - Obtains an `RLMRealm` instance with the given configuration. - - @param configuration A configuration object to use when creating the Realm. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return An `RLMRealm` instance. - */ -+ (nullable instancetype)realmWithConfiguration:(RLMRealmConfiguration *)configuration error:(NSError **)error; - -/** - Obtains an `RLMRealm` instance with the given configuration bound to the given queue. - - Rather than being confined to the thread they are opened on, queue-bound - RLMRealms are confined to the given queue. They can be accessed from any - thread as long as it is from within a block dispatch to the queue, and - notifications will be delivered to the queue instead of a thread's run loop. - - Realms can only be confined to a serial queue. Queue-confined RLMRealm - instances can be obtained when not on that queue, but attempting to do - anything with that instance without first dispatching to the queue will throw - an incorrect thread exception. - - @param configuration A configuration object to use when creating the Realm. - @param queue A serial dispatch queue to confine the Realm to. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return An `RLMRealm` instance. - */ -+ (nullable instancetype)realmWithConfiguration:(RLMRealmConfiguration *)configuration - queue:(nullable dispatch_queue_t)queue - error:(NSError **)error; - -/** - Obtains an `RLMRealm` instance persisted at a specified file URL. - - @param fileURL The local URL of the file the Realm should be saved at. - - @return An `RLMRealm` instance. - */ -+ (instancetype)realmWithURL:(NSURL *)fileURL; - -/** - Asynchronously open a Realm and deliver it to a block on the given queue. - - Opening a Realm asynchronously will perform all work needed to get the Realm to - a usable state (such as running potentially time-consuming migrations) on a - background thread before dispatching to the given queue. In addition, - synchronized Realms wait for all remote content available at the time the - operation began to be downloaded and available locally. - - The Realm passed to the callback function is confined to the callback queue as - if `-[RLMRealm realmWithConfiguration:queue:error]` was used. - - @param configuration A configuration object to use when opening the Realm. - @param callbackQueue The serial dispatch queue on which the callback should be run. - @param callback A callback block. If the Realm was successfully opened, - it will be passed in as an argument. - Otherwise, an `NSError` describing what went wrong will be - passed to the block instead. - */ -+ (RLMAsyncOpenTask *)asyncOpenWithConfiguration:(RLMRealmConfiguration *)configuration - callbackQueue:(dispatch_queue_t)callbackQueue - callback:(RLMAsyncOpenRealmCallback)callback; - -/** - The `RLMSchema` used by the Realm. - */ -@property (nonatomic, readonly) RLMSchema *schema; - -/** - Indicates if the Realm is currently engaged in a write transaction. - - @warning Do not simply check this property and then start a write transaction whenever an object needs to be - created, updated, or removed. Doing so might cause a large number of write transactions to be created, - degrading performance. Instead, always prefer performing multiple updates during a single transaction. - */ -@property (nonatomic, readonly) BOOL inWriteTransaction; - -/** - The `RLMRealmConfiguration` object that was used to create this `RLMRealm` instance. - */ -@property (nonatomic, readonly) RLMRealmConfiguration *configuration; - -/** - Indicates if this Realm contains any objects. - */ -@property (nonatomic, readonly) BOOL isEmpty; - -/** - Indicates if this Realm is frozen. - - @see `-[RLMRealm freeze]` - */ -@property (nonatomic, readonly, getter=isFrozen) BOOL frozen; - -/** - Returns a frozen (immutable) snapshot of this Realm. - - A frozen Realm is an immutable snapshot view of a particular version of a - Realm's data. Unlike normal RLMRealm instances, it does not live-update to - reflect writes made to the Realm, and can be accessed from any thread. Writing - to a frozen Realm is not allowed, and attempting to begin a write transaction - will throw an exception. - - All objects and collections read from a frozen Realm will also be frozen. - */ -- (RLMRealm *)freeze NS_RETURNS_RETAINED; - -/** - Returns a live reference of this Realm. - - All objects and collections read from the returned Realm will no longer be frozen. - This method will return `self` if it is not already frozen. - */ -- (RLMRealm *)thaw; - -#pragma mark - File Management - -/** - Writes a compacted and optionally encrypted copy of the Realm to the given local URL. - - The destination file cannot already exist. - - Note that if this method is called from within a write transaction, the - *current* data is written, not the data from the point when the previous write - transaction was committed. - - @param fileURL Local URL to save the Realm to. - @param key Optional 64-byte encryption key to encrypt the new file with. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return `YES` if the Realm was successfully written to disk, `NO` if an error occurred. - */ -- (BOOL)writeCopyToURL:(NSURL *)fileURL encryptionKey:(nullable NSData *)key error:(NSError **)error; - -/** - Writes a copy of the Realm to a given location specified by a given configuration. - - If the configuration supplied is derived from a `RLMUser` then this Realm will be copied with - sync functionality enabled. - - The destination file cannot already exist. - - @param configuration A Realm Configuration. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return `YES` if the Realm was successfully written to disk, `NO` if an error occurred. - */ -- (BOOL)writeCopyForConfiguration:(RLMRealmConfiguration *)configuration error:(NSError **)error; - -/** - Checks if the Realm file for the given configuration exists locally on disk. - - For non-synchronized, non-in-memory Realms, this is equivalent to - `-[NSFileManager.defaultManager fileExistsAtPath:config.path]`. For - synchronized Realms, it takes care of computing the actual path on disk based - on the server, virtual path, and user as is done when opening the Realm. - - @param config A Realm configuration to check the existence of. - @return YES if the Realm file for the given configuration exists on disk, NO otherwise. - */ -+ (BOOL)fileExistsForConfiguration:(RLMRealmConfiguration *)config; - -/** - Deletes the local Realm file and associated temporary files for the given configuration. - - This deletes the ".realm", ".note" and ".management" files which would be - created by opening the Realm with the given configuration. It does not delete - the ".lock" file (which contains no persisted data and is recreated from - scratch every time the Realm file is opened). - - The Realm must not be currently open on any thread or in another process. If - it is, this will return NO and report the error RLMErrorAlreadyOpen. Attempting to open - the Realm on another thread while the deletion is happening will block (and - then create a new Realm and open that afterwards). - - If the Realm already does not exist this will return `NO` and report the error NSFileNoSuchFileError; - - @param config A Realm configuration identifying the Realm to be deleted. - @return YES if any files were deleted, NO otherwise. - */ -+ (BOOL)deleteFilesForConfiguration:(RLMRealmConfiguration *)config error:(NSError **)error - __attribute__((swift_error(nonnull_error))); - -#pragma mark - Notifications - -/** - The type of a block to run whenever the data within the Realm is modified. - - @see `-[RLMRealm addNotificationBlock:]` - */ -typedef void (^RLMNotificationBlock)(RLMNotification notification, RLMRealm *realm); - -#pragma mark - Receiving Notification when a Realm Changes - -/** - Adds a notification handler for changes in this Realm, and returns a notification token. - - Notification handlers are called after each write transaction is committed, - either on the current thread or other threads. - - Handler blocks are called on the same thread that they were added on, and may - only be added on threads which are currently within a run loop. Unless you are - specifically creating and running a run loop on a background thread, this will - normally only be the main thread. - - The block has the following definition: - - typedef void(^RLMNotificationBlock)(RLMNotification notification, RLMRealm *realm); - - It receives the following parameters: - - - `NSString` \***notification**: The name of the incoming notification. See - `RLMRealmNotification` for information on what - notifications are sent. - - `RLMRealm` \***realm**: The Realm for which this notification occurred. - - @param block A block which is called to process Realm notifications. - - @return A token object which must be retained as long as you wish to continue - receiving change notifications. - */ -- (RLMNotificationToken *)addNotificationBlock:(RLMNotificationBlock)block __attribute__((warn_unused_result)); - -#pragma mark - Writing to a Realm - -/** - Begins a write transaction on the Realm. - - Only one write transaction can be open at a time for each Realm file. Write - transactions cannot be nested, and trying to begin a write transaction on a - Realm which is already in a write transaction will throw an exception. Calls to - `beginWriteTransaction` from `RLMRealm` instances for the same Realm file in - other threads or other processes will block until the current write transaction - completes or is cancelled. - - Before beginning the write transaction, `beginWriteTransaction` updates the - `RLMRealm` instance to the latest Realm version, as if `refresh` had been - called, and generates notifications if applicable. This has no effect if the - Realm was already up to date. - - It is rarely a good idea to have write transactions span multiple cycles of - the run loop, but if you do wish to do so you will need to ensure that the - Realm participating in the write transaction is kept alive until the write - transaction is committed. - */ -- (void)beginWriteTransaction; - -/** - Commits all write operations in the current write transaction, and ends the - transaction. - - After saving the changes, all notification blocks registered on this specific - `RLMRealm` instance are invoked synchronously. Notification blocks registered - on other threads or on collections are invoked asynchronously. If you do not - want to receive a specific notification for this write tranaction, see - `commitWriteTransactionWithoutNotifying:error:`. - - This method can fail if there is insufficient disk space available to save the - writes made, or due to unexpected i/o errors. This version of the method throws - an exception when errors occur. Use the version with a `NSError` out parameter - instead if you wish to handle errors. - - @warning This method may only be called during a write transaction. - */ -- (void)commitWriteTransaction NS_SWIFT_UNAVAILABLE(""); - -/** - Commits all write operations in the current write transaction, and ends the - transaction. - - After saving the changes, all notification blocks registered on this specific - `RLMRealm` instance are invoked synchronously. Notification blocks registered - on other threads or on collections are invoked asynchronously. If you do not - want to receive a specific notification for this write tranaction, see - `commitWriteTransactionWithoutNotifying:error:`. - - This method can fail if there is insufficient disk space available to save the - writes made, or due to unexpected i/o errors. - - @warning This method may only be called during a write transaction. - - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return Whether the transaction succeeded. - */ -- (BOOL)commitWriteTransaction:(NSError **)error; - -/** - Commits all write operations in the current write transaction, without - notifying specific notification blocks of the changes. - - After saving the changes, all notification blocks registered on this specific - `RLMRealm` instance are invoked synchronously. Notification blocks registered - on other threads or on collections are scheduled to be invoked asynchronously. - - You can skip notifiying specific notification blocks about the changes made - in this write transaction by passing in their associated notification tokens. - This is primarily useful when the write transaction is saving changes already - made in the UI and you do not want to have the notification block attempt to - re-apply the same changes. - - The tokens passed to this method must be for notifications for this specific - `RLMRealm` instance. Notifications for different threads cannot be skipped - using this method. - - This method can fail if there is insufficient disk space available to save the - writes made, or due to unexpected i/o errors. - - @warning This method may only be called during a write transaction. - - @param tokens An array of notification tokens which were returned from adding - callbacks which you do not want to be notified for the changes - made in this write transaction. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return Whether the transaction succeeded. - */ -- (BOOL)commitWriteTransactionWithoutNotifying:(NSArray *)tokens error:(NSError **)error; - -/** - Reverts all writes made during the current write transaction and ends the transaction. - - This rolls back all objects in the Realm to the state they were in at the - beginning of the write transaction, and then ends the transaction. - - This restores the data for deleted objects, but does not revive invalidated - object instances. Any `RLMObject`s which were added to the Realm will be - invalidated rather than becoming unmanaged. - Given the following code: - - ObjectType *oldObject = [[ObjectType objectsWhere:@"..."] firstObject]; - ObjectType *newObject = [[ObjectType alloc] init]; - - [realm beginWriteTransaction]; - [realm addObject:newObject]; - [realm deleteObject:oldObject]; - [realm cancelWriteTransaction]; - - Both `oldObject` and `newObject` will return `YES` for `isInvalidated`, - but re-running the query which provided `oldObject` will once again return - the valid object. - - KVO observers on any objects which were modified during the transaction will - be notified about the change back to their initial values, but no other - notifications are produced by a cancelled write transaction. - - @warning This method may only be called during a write transaction. - */ -- (void)cancelWriteTransaction; - -/** - Performs actions contained within the given block inside a write transaction. - - @see `[RLMRealm transactionWithoutNotifying:block:error:]` - */ -- (void)transactionWithBlock:(__attribute__((noescape)) void(^)(void))block NS_SWIFT_UNAVAILABLE(""); - -/** - Performs actions contained within the given block inside a write transaction. - - @see `[RLMRealm transactionWithoutNotifying:block:error:]` - */ -- (BOOL)transactionWithBlock:(__attribute__((noescape)) void(^)(void))block error:(NSError **)error; - -/** - Performs actions contained within the given block inside a write transaction. - - @see `[RLMRealm transactionWithoutNotifying:block:error:]` - */ -- (void)transactionWithoutNotifying:(NSArray *)tokens block:(__attribute__((noescape)) void(^)(void))block; - -/** - Performs actions contained within the given block inside a write transaction. - - Write transactions cannot be nested, and trying to execute a write transaction - on a Realm which is already participating in a write transaction will throw an - exception. Calls to `transactionWithBlock:` from `RLMRealm` instances in other - threads will block until the current write transaction completes. - - Before beginning the write transaction, `transactionWithBlock:` updates the - `RLMRealm` instance to the latest Realm version, as if `refresh` had been called, and - generates notifications if applicable. This has no effect if the Realm - was already up to date. - - You can skip notifiying specific notification blocks about the changes made - in this write transaction by passing in their associated notification tokens. - This is primarily useful when the write transaction is saving changes already - made in the UI and you do not want to have the notification block attempt to - re-apply the same changes. - - The tokens passed to this method must be for notifications for this specific - `RLMRealm` instance. Notifications for different threads cannot be skipped - using this method. - - @param tokens An array of notification tokens which were returned from adding - callbacks which you do not want to be notified for the changes - made in this write transaction. - @param block The block containing actions to perform. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return Whether the transaction succeeded. - */ -- (BOOL)transactionWithoutNotifying:(NSArray *)tokens block:(__attribute__((noescape)) void(^)(void))block error:(NSError **)error; - -/** - Indicates if the Realm is currently performing async write operations. - This becomes YES following a call to `beginAsyncWriteTransaction`, - `commitAsyncWriteTransaction`, or `asyncTransactionWithBlock:`, and remains so - until all scheduled async write work has completed. - - @warning If this is `YES`, closing or invalidating the Realm will block until scheduled work has completed. - */ -@property (nonatomic, readonly) BOOL isPerformingAsynchronousWriteOperations; - -/** - Begins an asynchronous write transaction. - This function asynchronously begins a write transaction on a background - thread, and then invokes the block on the original thread or queue once the - transaction has begun. Unlike `beginWriteTransaction`, this does not block the - calling thread if another thread is current inside a write transaction, and - will always return immediately. - Multiple calls to this function (or the other functions which perform - asynchronous write transactions) will queue the blocks to be called in the - same order as they were queued. This includes calls from inside a write - transaction block, which unlike with synchronous transactions are allowed. - - @param block The block containing actions to perform inside the write transaction. - `block` should end by calling `commitAsyncWriteTransaction`, - `commitWriteTransaction` or `cancelWriteTransaction`. - Returning without one of these calls is equivalent to calling `cancelWriteTransaction`. - - @return An id identifying the asynchronous transaction which can be passed to - `cancelAsyncTransaction:` prior to the block being called to cancel - the pending invocation of the block. - */ -- (RLMAsyncTransactionId)beginAsyncWriteTransaction:(void(^)(void))block; - -/** - Asynchronously commits a write transaction. - The call returns immediately allowing the caller to proceed while the I/O is - performed on a dedicated background thread. This can be used regardless of if - the write transaction was begun with `beginWriteTransaction` or - `beginAsyncWriteTransaction`. - - @param completionBlock A block which will be called on the source thread or - queue once the commit has either completed or failed - with an error. - - @param allowGrouping If `YES`, multiple sequential calls to - `commitAsyncWriteTransaction:` may be batched together - and persisted to stable storage in one group. This - improves write performance, particularly when the - individual transactions being batched are small. In the - event of a crash or power failure, either all of the - grouped transactions will be lost or none will, rather - than the usual guarantee that data has been persisted as - soon as a call to commit has returned. - - @return An id identifying the asynchronous transaction commit can be passed to - `cancelAsyncTransaction:` prior to the completion block being called - to cancel the pending invocation of the block. Note that this does - *not* cancel the commit itself. -*/ -- (RLMAsyncTransactionId)commitAsyncWriteTransaction:(nullable void(^)(NSError *_Nullable))completionBlock - allowGrouping:(BOOL)allowGrouping; - -/** - Asynchronously commits a write transaction. - The call returns immediately allowing the caller to proceed while the I/O is - performed on a dedicated background thread. This can be used regardless of if - the write transaction was begun with `beginWriteTransaction` or - `beginAsyncWriteTransaction`. - - @param completionBlock A block which will be called on the source thread or - queue once the commit has either completed or failed - with an error. - - @return An id identifying the asynchronous transaction commit can be passed to - `cancelAsyncTransaction:` prior to the completion block being called - to cancel the pending invocation of the block. Note that this does - *not* cancel the commit itself. -*/ -- (RLMAsyncTransactionId)commitAsyncWriteTransaction:(void(^)(NSError *_Nullable))completionBlock; - -/** - Asynchronously commits a write transaction. - The call returns immediately allowing the caller to proceed while the I/O is - performed on a dedicated background thread. This can be used regardless of if - the write transaction was begun with `beginWriteTransaction` or - `beginAsyncWriteTransaction`. - - @return An id identifying the asynchronous transaction commit can be passed to - `cancelAsyncTransaction:` prior to the completion block being called - to cancel the pending invocation of the block. Note that this does - *not* cancel the commit itself. -*/ -- (RLMAsyncTransactionId)commitAsyncWriteTransaction; - -/** - Cancels a queued block for an asynchronous transaction. - This can cancel a block passed to either an asynchronous begin or an - asynchronous commit. Canceling a begin cancels that transaction entirely, - while canceling a commit merely cancels the invocation of the completion - callback, and the commit will still happen. - Transactions can only be canceled before the block is invoked, and calling - `cancelAsyncTransaction:` from within the block is a no-op. - - @param asyncTransactionId A transaction id from either `beginAsyncWriteTransaction:` or `commitAsyncWriteTransaction:`. -*/ -- (void)cancelAsyncTransaction:(RLMAsyncTransactionId)asyncTransactionId; - -/** - Asynchronously performs actions contained within the given block inside a - write transaction. - The write transaction is begun asynchronously as if calling - `beginAsyncWriteTransaction:`, and by default the transaction is commited - asynchronously after the block completes. You can also explicitly call - `commitWriteTransaction` or `cancelWriteTransaction` from within the block to - synchronously commit or cancel the write transaction. - - @param block The block containing actions to perform. - - @param completionBlock A block which will be called on the source thread or - queue once the commit has either completed or failed - with an error. - - @return An id identifying the asynchronous transaction which can be passed to - `cancelAsyncTransaction:` prior to the block being called to cancel - the pending invocation of the block. -*/ -- (RLMAsyncTransactionId)asyncTransactionWithBlock:(void(^)(void))block onComplete:(nullable void(^)(NSError *))completionBlock; - -/** - Asynchronously performs actions contained within the given block inside a - write transaction. - The write transaction is begun asynchronously as if calling - `beginAsyncWriteTransaction:`, and by default the transaction is commited - asynchronously after the block completes. You can also explicitly call - `commitWriteTransaction` or `cancelWriteTransaction` from within the block to - synchronously commit or cancel the write transaction. - - @param block The block containing actions to perform. - - @return An id identifying the asynchronous transaction which can be passed to - `cancelAsyncTransaction:` prior to the block being called to cancel - the pending invocation of the block. -*/ -- (RLMAsyncTransactionId)asyncTransactionWithBlock:(void(^)(void))block; - -/** - Updates the Realm and outstanding objects managed by the Realm to point to the - most recent data. - - If the version of the Realm is actually changed, Realm and collection - notifications will be sent to reflect the changes. This may take some time, as - collection notifications are prepared on a background thread. As a result, - calling this method on the main thread is not advisable. - - @return Whether there were any updates for the Realm. Note that `YES` may be - returned even if no data actually changed. - */ -- (BOOL)refresh; - -/** - Set this property to `YES` to automatically update this Realm when changes - happen in other threads. - - If set to `YES` (the default), changes made on other threads will be reflected - in this Realm on the next cycle of the run loop after the changes are - committed. If set to `NO`, you must manually call `-refresh` on the Realm to - update it to get the latest data. - - Note that by default, background threads do not have an active run loop and you - will need to manually call `-refresh` in order to update to the latest version, - even if `autorefresh` is set to `YES`. - - Even with this property enabled, you can still call `-refresh` at any time to - update the Realm before the automatic refresh would occur. - - Write transactions will still always advance a Realm to the latest version and - produce local notifications on commit even if autorefresh is disabled. - - Disabling `autorefresh` on a Realm without any strong references to it will not - have any effect, and `autorefresh` will revert back to `YES` the next time the - Realm is created. This is normally irrelevant as it means that there is nothing - to refresh (as managed `RLMObject`s, `RLMArray`s, and `RLMResults` have strong - references to the Realm that manages them), but it means that setting - `RLMRealm.defaultRealm.autorefresh = NO` in - `application:didFinishLaunchingWithOptions:` and only later storing Realm - objects will not work. - - Defaults to `YES`. - */ -@property (nonatomic) BOOL autorefresh; - -/** - Invalidates all `RLMObject`s, `RLMResults`, `RLMLinkingObjects`, and `RLMArray`s managed by the Realm. - - A Realm holds a read lock on the version of the data accessed by it, so - that changes made to the Realm on different threads do not modify or delete the - data seen by this Realm. Calling this method releases the read lock, - allowing the space used on disk to be reused by later write transactions rather - than growing the file. This method should be called before performing long - blocking operations on a background thread on which you previously read data - from the Realm which you no longer need. - - All `RLMObject`, `RLMResults` and `RLMArray` instances obtained from this - `RLMRealm` instance on the current thread are invalidated. `RLMObject`s and `RLMArray`s - cannot be used. `RLMResults` will become empty. The Realm itself remains valid, - and a new read transaction is implicitly begun the next time data is read from the Realm. - - Calling this method multiple times in a row without reading any data from the - Realm, or before ever reading any data from the Realm, is a no-op. - */ -- (void)invalidate; - -#pragma mark - Accessing Objects - -/** - Returns the same object as the one referenced when the `RLMThreadSafeReference` was first created, - but resolved for the current Realm for this thread. Returns `nil` if this object was deleted after - the reference was created. - - @param reference The thread-safe reference to the thread-confined object to resolve in this Realm. - - @warning A `RLMThreadSafeReference` object must be resolved at most once. - Failing to resolve a `RLMThreadSafeReference` will result in the source version of the - Realm being pinned until the reference is deallocated. - An exception will be thrown if a reference is resolved more than once. - - @warning Cannot call within a write transaction. - - @note Will refresh this Realm if the source Realm was at a later version than this one. - - @see `+[RLMThreadSafeReference referenceWithThreadConfined:]` - */ -- (nullable id)resolveThreadSafeReference:(RLMThreadSafeReference *)reference -NS_REFINED_FOR_SWIFT; - -#pragma mark - Adding and Removing Objects from a Realm - -/** - Adds an object to the Realm. - - Once added, this object is considered to be managed by the Realm. It can be retrieved - using the `objectsWhere:` selectors on `RLMRealm` and on subclasses of `RLMObject`. - - When added, all child relationships referenced by this object will also be added to - the Realm if they are not already in it. - - If the object or any related objects are already being managed by a different Realm - an exception will be thrown. Use `-[RLMObject createInRealm:withObject:]` to insert a copy of a managed object - into a different Realm. - - The object to be added must be valid and cannot have been previously deleted - from a Realm (i.e. `isInvalidated` must be `NO`). - - @warning This method may only be called during a write transaction. - - @param object The object to be added to this Realm. - */ -- (void)addObject:(RLMObject *)object; - -/** - Adds all the objects in a collection to the Realm. - - This is the equivalent of calling `addObject:` for every object in a collection. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable collection such as `NSArray`, `RLMArray`, or `RLMResults`, - containing Realm objects to be added to the Realm. - - @see `addObject:` - */ -- (void)addObjects:(id)objects; - -/** - Adds or updates an existing object into the Realm. - - The object provided must have a designated primary key. If no objects exist in the Realm - with the same primary key value, the object is inserted. Otherwise, the existing object is - updated with any changed values. - - As with `addObject:`, the object cannot already be managed by a different - Realm. Use `-[RLMObject createOrUpdateInRealm:withValue:]` to copy values to - a different Realm. - - If there is a property or KVC value on `object` whose value is nil, and it corresponds - to a nullable property on an existing object being updated, that nullable property will - be set to nil. - - @warning This method may only be called during a write transaction. - - @param object The object to be added or updated. - */ -- (void)addOrUpdateObject:(RLMObject *)object; - -/** - Adds or updates all the objects in a collection into the Realm. - - This is the equivalent of calling `addOrUpdateObject:` for every object in a collection. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable collection such as `NSArray`, `RLMArray`, or `RLMResults`, - containing Realm objects to be added to or updated within the Realm. - - @see `addOrUpdateObject:` - */ -- (void)addOrUpdateObjects:(id)objects; - -/** - Deletes an object from the Realm. Once the object is deleted it is considered invalidated. - - @warning This method may only be called during a write transaction. - - @param object The object to be deleted. - */ -- (void)deleteObject:(RLMObject *)object; - -/** - Deletes one or more objects from the Realm. - - This is the equivalent of calling `deleteObject:` for every object in a collection. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable collection such as `NSArray`, `RLMArray`, or `RLMResults`, - containing objects to be deleted from the Realm. - - @see `deleteObject:` - */ -- (void)deleteObjects:(id)objects; - -/** - Deletes all objects from the Realm. - - @warning This method may only be called during a write transaction. - - @see `deleteObject:` - */ -- (void)deleteAllObjects; - -#pragma mark - Sync Subscriptions - -/** - Represents the active subscriptions for this realm, which can be used to add/remove/update - and search flexible sync subscriptions. - Getting the subscriptions from a local or partition-based configured realm will thrown an exception. - - @warning This feature is currently in beta and its API is subject to change. - */ -@property (nonatomic, readonly, nonnull) RLMSyncSubscriptionSet *subscriptions; - - -#pragma mark - Migrations - -/** - The type of a migration block used to migrate a Realm. - - @param migration A `RLMMigration` object used to perform the migration. The - migration object allows you to enumerate and alter any - existing objects which require migration. - - @param oldSchemaVersion The schema version of the Realm being migrated. - */ -RLM_SWIFT_SENDABLE -typedef void (^RLMMigrationBlock)(RLMMigration *migration, uint64_t oldSchemaVersion); - -/** - Returns the schema version for a Realm at a given local URL. - - @param fileURL Local URL to a Realm file. - @param key 64-byte key used to encrypt the file, or `nil` if it is unencrypted. - @param error If an error occurs, upon return contains an `NSError` object - that describes the problem. If you are not interested in - possible errors, pass in `NULL`. - - @return The version of the Realm at `fileURL`, or `RLMNotVersioned` if the version cannot be read. - */ -+ (uint64_t)schemaVersionAtURL:(NSURL *)fileURL encryptionKey:(nullable NSData *)key - error:(NSError **)error -NS_REFINED_FOR_SWIFT; - -/** - Performs the given Realm configuration's migration block on a Realm at the given path. - - This method is called automatically when opening a Realm for the first time and does - not need to be called explicitly. You can choose to call this method to control - exactly when and how migrations are performed. - - @param configuration The Realm configuration used to open and migrate the Realm. - @return The error that occurred while applying the migration, if any. - - @see RLMMigration - */ -+ (BOOL)performMigrationForConfiguration:(RLMRealmConfiguration *)configuration error:(NSError **)error; - -#pragma mark - Unavailable Methods - -/** - RLMRealm instances are cached internally by Realm and cannot be created directly. - - Use `+[RLMRealm defaultRealm]`, `+[RLMRealm realmWithConfiguration:error:]` or - `+[RLMRealm realmWithURL]` to obtain a reference to an RLMRealm. - */ -- (instancetype)init __attribute__((unavailable("Use +defaultRealm, +realmWithConfiguration: or +realmWithURL:."))); - -/** - RLMRealm instances are cached internally by Realm and cannot be created directly. - - Use `+[RLMRealm defaultRealm]`, `+[RLMRealm realmWithConfiguration:error:]` or - `+[RLMRealm realmWithURL]` to obtain a reference to an RLMRealm. - */ -+ (instancetype)new __attribute__((unavailable("Use +defaultRealm, +realmWithConfiguration: or +realmWithURL:."))); - -/// :nodoc: -- (void)addOrUpdateObjectsFromArray:(id)array __attribute__((unavailable("Renamed to -addOrUpdateObjects:."))); - -@end - -// MARK: - RLMNotificationToken - -/** - A token which is returned from methods which subscribe to changes to a Realm. - - Change subscriptions in Realm return an `RLMNotificationToken` instance, - which can be used to unsubscribe from the changes. You must store a strong - reference to the token for as long as you want to continue to receive notifications. - When you wish to stop, call the `-invalidate` method. Notifications are also stopped if - the token is deallocated. - */ -RLM_SWIFT_SENDABLE // is internally thread-safe -@interface RLMNotificationToken : NSObject -/// Stops notifications for the change subscription that returned this token. -/// -/// @return True if the token was previously valid, and false if it was already invalidated. -- (bool)invalidate; - -/// Stops notifications for the change subscription that returned this token. -- (void)stop __attribute__((unavailable("Renamed to -invalidate."))) NS_REFINED_FOR_SWIFT; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMRealmConfiguration.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMRealmConfiguration.h deleted file mode 100644 index d09e5c215..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMRealmConfiguration.h +++ /dev/null @@ -1,197 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2015 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMEventConfiguration, RLMSyncConfiguration; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A block called when opening a Realm for the first time during the life - of a process to determine if it should be compacted before being returned - to the user. It is passed the total file size (data + free space) and the total - bytes used by data in the file. - - Return `YES` to indicate that an attempt to compact the file should be made. - The compaction will be skipped if another process is accessing it. - */ -RLM_SWIFT_SENDABLE -typedef BOOL (^RLMShouldCompactOnLaunchBlock)(NSUInteger totalBytes, NSUInteger bytesUsed); - -/** - A block which receives a subscription set instance, that can be used to add an initial set of subscriptions which will be executed - when the Realm is first opened. - */ -RLM_SWIFT_SENDABLE -typedef void(^RLMFlexibleSyncInitialSubscriptionsBlock)(RLMSyncSubscriptionSet * _Nonnull subscriptions); - -/** - An `RLMRealmConfiguration` instance describes the different options used to - create an instance of a Realm. - - `RLMRealmConfiguration` instances are just plain `NSObject`s. Unlike `RLMRealm`s - and `RLMObject`s, they can be freely shared between threads as long as you do not - mutate them. - - Creating configuration objects for class subsets (by setting the - `objectClasses` property) can be expensive. Because of this, you will normally want to - cache and reuse a single configuration object for each distinct configuration rather than - creating a new object each time you open a Realm. - */ -@interface RLMRealmConfiguration : NSObject - -#pragma mark - Default Configuration - -/** - Returns the default configuration used to create Realms when no other - configuration is explicitly specified (i.e. `+[RLMRealm defaultRealm]`). - - @return The default Realm configuration. - */ -+ (instancetype)defaultConfiguration; - -/** - Sets the default configuration to the given `RLMRealmConfiguration`. - - @param configuration The new default Realm configuration. - */ -+ (void)setDefaultConfiguration:(RLMRealmConfiguration *)configuration; - -#pragma mark - Properties - -/// The local URL of the Realm file. Mutually exclusive with `inMemoryIdentifier`; -/// setting one of the two properties will automatically nil out the other. -@property (nonatomic, copy, nullable) NSURL *fileURL; - -/// A string used to identify a particular in-memory Realm. Mutually exclusive with `fileURL`, -/// `seedFilePath`and `syncConfiguration`; -/// setting any one of the three properties will automatically nil out the other two. -@property (nonatomic, copy, nullable) NSString *inMemoryIdentifier; - -/// A 64-byte key to use to encrypt the data, or `nil` if encryption is not enabled. -@property (nonatomic, copy, nullable) NSData *encryptionKey; - -/// Whether to open the Realm in read-only mode. -/// -/// For non-synchronized Realms, this is required to be able to open Realm -/// files which are not writeable or are in a directory which is not writeable. -/// This should only be used on files which will not be modified by anyone -/// while they are open, and not just to get a read-only view of a file which -/// may be written to by another thread or process. Opening in read-only mode -/// requires disabling Realm's reader/writer coordination, so committing a -/// write transaction from another process will result in crashes. -/// -/// Syncronized Realms must always be writeable (as otherwise no -/// synchronization could happen), and this instead merely disallows performing -/// write transactions on the Realm. In addition, it will skip some automatic -/// writes made to the Realm, such as to initialize the Realm's schema. Setting -/// `readOnly = YES` is not strictly required for Realms which the sync user -/// does not have write access to, but is highly recommended as it will improve -/// error reporting and catch some errors earlier. -/// -/// Realms using query-based sync cannot be opened in read-only mode. -@property (nonatomic) BOOL readOnly; - -/// The current schema version. -@property (nonatomic) uint64_t schemaVersion; - -/// The block which migrates the Realm to the current version. -@property (nonatomic, copy, nullable) RLMMigrationBlock migrationBlock; - -/** - Whether to recreate the Realm file with the provided schema if a migration is required. - This is the case when the stored schema differs from the provided schema or - the stored schema version differs from the version on this configuration. - Setting this property to `YES` deletes the file if a migration would otherwise be required or executed. - - @note Setting this property to `YES` doesn't disable file format migrations. - */ -@property (nonatomic) BOOL deleteRealmIfMigrationNeeded; - -/** - A block called when opening a Realm for the first time during the life - of a process to determine if it should be compacted before being returned - to the user. It is passed the total file size (data + free space) and the total - bytes used by data in the file. - - Return `YES` to indicate that an attempt to compact the file should be made. - The compaction will be skipped if another process is accessing it. - */ -@property (nonatomic, copy, nullable) RLMShouldCompactOnLaunchBlock shouldCompactOnLaunch; - -/// The classes managed by the Realm. -@property (nonatomic, copy, nullable) NSArray *objectClasses; - -/** - The maximum number of live versions in the Realm file before an exception will - be thrown when attempting to start a write transaction. - - Realm provides MVCC snapshot isolation, meaning that writes on one thread do - not overwrite data being read on another thread, and instead write a new copy - of that data. When a Realm refreshes it updates to the latest version of the - data and releases the old versions, allowing them to be overwritten by - subsequent write transactions. - - Under normal circumstances this is not a problem, but if the number of active - versions grow too large, it will have a negative effect on the filesize on - disk. This can happen when performing writes on many different threads at - once, when holding on to frozen objects for an extended time, or when - performing long operations on background threads which do not allow the Realm - to refresh. - - Setting this property to a non-zero value makes it so that exceeding the set - number of versions will instead throw an exception. This can be used with a - low value during development to help identify places that may be problematic, - or in production use to cause the app to crash rather than produce a Realm - file which is too large to be opened. - - */ -@property (nonatomic) NSUInteger maximumNumberOfActiveVersions; - -/** - When opening the Realm for the first time, instead of creating an empty file, - the Realm file will be copied from the provided seed file path and used instead. - This can be used to open a Realm file with pre-populated data. - - If a realm file already exists at the configuration's destination path, the seed file - will not be copied and the already existing realm will be opened instead. - - Note that to use this parameter with a synced Realm configuration - the seed Realm must be appropriately copied to a destination with - `[RLMRealm writeCopyForConfiguration:]` first. - - This option is mutually exclusive with `inMemoryIdentifier`. Setting a `seedFilePath` - will nil out the `inMemoryIdentifier`. - */ -@property (nonatomic, copy, nullable) NSURL *seedFilePath; - -/** - A configuration object representing configuration state for Realms intended - to sync with Atlas Device Sync. - - This property is mutually exclusive with both `inMemoryIdentifier` and `fileURL`; - setting any one of the three properties will automatically nil out the other two. - - @see `RLMSyncConfiguration` - */ -@property (nullable, nonatomic) RLMSyncConfiguration *syncConfiguration; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMRealm_Dynamic.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMRealm_Dynamic.h deleted file mode 100644 index bea162775..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMRealm_Dynamic.h +++ /dev/null @@ -1,118 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import -#import - -@class RLMResults; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMRealm (Dynamic) - -#pragma mark - Getting Objects from a Realm - -/** - Returns all objects of a given type from the Realm. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. The preferred way to get objects of a single class is to use the class - methods on `RLMObject`. - - @param className The name of the `RLMObject` subclass to retrieve on (e.g. `MyClass.className`). - - @return An `RLMResults` containing all objects in the Realm of the given type. - - @see `+[RLMObject allObjects]` - */ -- (RLMResults *)allObjects:(NSString *)className; - -/** - Returns all objects matching the given predicate from the Realm. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. The preferred way to get objects of a single class is to use the class - methods on `RLMObject`. - - @param className The type of objects you are looking for (name of the class). - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` containing results matching the given predicate. - - @see `+[RLMObject objectsWhere:]` - */ -- (RLMResults *)objects:(NSString *)className where:(NSString *)predicateFormat, ...; - -/** - Returns all objects matching the given predicate from the Realm. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. The preferred way to get objects of a single class is to use the class - methods on `RLMObject`. - - @param className The type of objects you are looking for (name of the class). - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` containing results matching the given predicate. - - @see `+[RLMObject objectsWhere:]` - */ -- (RLMResults *)objects:(NSString *)className withPredicate:(NSPredicate *)predicate; - -/** - Returns the object of the given type with the given primary key from the Realm. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. The preferred way to get an object of a single class is to use the class - methods on `RLMObject`. - - @param className The class name for the object you are looking for. - @param primaryKey The primary key value for the object you are looking for. - - @return An object, or `nil` if an object with the given primary key does not exist. - - @see `+[RLMObject objectForPrimaryKey:]` - */ -- (nullable RLMObject *)objectWithClassName:(NSString *)className forPrimaryKey:(id)primaryKey; - -/** - Creates an `RLMObject` instance of type `className` in the Realm, and populates it using a given object. - - The `value` argument is used to populate the object. It can be a key-value coding compliant object, an array or - dictionary returned from the methods in `NSJSONSerialization`, or an array containing one element for each managed - property. An exception will be thrown if any required properties are not present and those properties were not defined - with default values. - - When passing in an array as the `value` argument, all properties must be present, valid and in the same order as the - properties defined in the model. - - @warning This method is useful only in specialized circumstances, for example, when building components - that integrate with Realm. If you are simply building an app on Realm, it is recommended to - use `[RLMObject createInDefaultRealmWithValue:]`. - - @param value The value used to populate the object. - - @return An `RLMObject` instance of type `className`. - */ --(RLMObject *)createObject:(NSString *)className withValue:(id)value; - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMResults.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMResults.h deleted file mode 100644 index 5911e666a..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMResults.h +++ /dev/null @@ -1,567 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObject; - -/** - `RLMResults` is an auto-updating container type in Realm returned from object - queries. It represents the results of the query in the form of a collection of objects. - - `RLMResults` can be queried using the same predicates as `RLMObject` and `RLMArray`, - and you can chain queries to further filter results. - - `RLMResults` always reflect the current state of the Realm on the current thread, - including during write transactions on the current thread. The one exception to - this is when using `for...in` fast enumeration, which will always enumerate - over the objects which matched the query when the enumeration is begun, even if - some of them are deleted or modified to be excluded by the filter during the - enumeration. - - `RLMResults` are lazily evaluated the first time they are accessed; they only - run queries when the result of the query is requested. This means that - chaining several temporary `RLMResults` to sort and filter your data does not - perform any extra work processing the intermediate state. - - Once the results have been evaluated or a notification block has been added, - the results are eagerly kept up-to-date, with the work done to keep them - up-to-date done on a background thread whenever possible. - - `RLMResults` cannot be directly instantiated. - */ -@interface RLMResults : NSObject - -#pragma mark - Properties - -/** - The number of objects in the results collection. - */ -@property (nonatomic, readonly, assign) NSUInteger count; - -/** - The type of the objects in the results collection. - */ -@property (nonatomic, readonly, assign) RLMPropertyType type; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readwrite, getter = isOptional) BOOL optional; - -/** - The class name of the objects contained in the results collection. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages this results collection. - */ -@property (nonatomic, readonly) RLMRealm *realm; - -/** - Indicates if the results collection is no longer valid. - - The results collection becomes invalid if `invalidate` is called on the containing `realm`. - An invalidated results collection can be accessed, but will always be empty. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -#pragma mark - Accessing Objects from an RLMResults - -/** - Returns the object at the index specified. - - @param index The index to look up. - - @return An object of the type contained in the results collection. - */ -- (RLMObjectType)objectAtIndex:(NSUInteger)index; - -/** - Returns an array containing the objects in the results at the indexes specified by a given index set. - `nil` will be returned if the index set contains an index out of the arrays bounds. - - @param indexes The indexes in the results to retrieve objects from. - - @return The objects at the specified indexes. - */ -- (nullable NSArray *)objectsAtIndexes:(NSIndexSet *)indexes; - -/** - Returns the first object in the results collection. - - Returns `nil` if called on an empty results collection. - - @return An object of the type contained in the results collection. - */ -- (nullable RLMObjectType)firstObject; - -/** - Returns the last object in the results collection. - - Returns `nil` if called on an empty results collection. - - @return An object of the type contained in the results collection. - */ -- (nullable RLMObjectType)lastObject; - -#pragma mark - Querying Results - -/** - Returns the index of an object in the results collection. - - Returns `NSNotFound` if the object is not found in the results collection. - - @param object An object (of the same type as returned from the `objectClassName` selector). - */ -- (NSUInteger)indexOfObject:(RLMObjectType)object; - -/** - Returns the index of the first object in the results collection matching the predicate. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return The index of the object, or `NSNotFound` if the object is not found in the results collection. - */ -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (NSUInteger)indexOfObjectWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns the index of the first object in the results collection matching the predicate. - - @param predicate The predicate with which to filter the objects. - - @return The index of the object, or `NSNotFound` if the object is not found in the results collection. - */ -- (NSUInteger)indexOfObjectWithPredicate:(NSPredicate *)predicate; - -/** - Returns all the objects matching the given predicate in the results collection. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return An `RLMResults` of objects that match the given predicate. - */ -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/** - Returns all the objects matching the given predicate in the results collection. - - @param predicate The predicate with which to filter the objects. - - @return An `RLMResults` of objects that match the given predicate. - */ -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/** - Returns a sorted `RLMResults` from an existing results collection. - - @param keyPath The key path to sort by. - @param ascending The direction to sort in. - - @return An `RLMResults` sorted by the specified key path. - */ -- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/** - Returns a sorted `RLMResults` from an existing results collection. - - @param properties An array of `RLMSortDescriptor`s to sort by. - - @return An `RLMResults` sorted by the specified properties. - */ -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/** - Returns a distinct `RLMResults` from an existing results collection. - - @param keyPaths The key paths used produce distinct results - - @return An `RLMResults` made distinct based on the specified key paths - */ -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -#pragma mark - Notifications - -/** - Registers a block to be called each time the results collection changes. - - The block will be asynchronously called with the initial results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the results collection were added, removed or modified. If a - write transaction did not modify any objects in the results collection, - the block is not called at all. See the `RLMCollectionChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - At the time when the block is called, the `RLMResults` object will be fully - evaluated and up-to-date, and as long as you do not perform a write transaction - on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will - never perform blocking work. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - NSLog(@"dogs.count: %zu", dogs.count); // => 0 - self.token = [results addNotificationBlock:^(RLMResults *dogs, - RLMCollectionChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - - @param block The block to be called whenever a change occurs. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the results collection changes. - - The block will be asynchronously called with the initial results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the results collection were added, removed or modified. If a - write transaction did not modify any objects in the results collection, - the block is not called at all. See the `RLMCollectionChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - At the time when the block is called, the `RLMResults` object will be fully - evaluated and up-to-date, and as long as you do not perform a write transaction - on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will - never perform blocking work. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the results collection changes. - - The block will be asynchronously called with the initial results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the results collection were added, removed or modified. If a - write transaction did not modify any objects in the results collection, - the block is not called at all. See the `RLMCollectionChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - At the time when the block is called, the `RLMResults` object will be fully - evaluated and up-to-date, and as long as you do not perform a write transaction - on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will - never perform blocking work. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the results collection changes. - - The block will be asynchronously called with the initial results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the results collection were added, removed or modified. If a - write transaction did not modify any objects in the results collection, - the block is not called at all. See the `RLMCollectionChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - At the time when the block is called, the `RLMResults` object will be fully - evaluated and up-to-date, and as long as you do not perform a write transaction - on the same thread or explicitly call `-[RLMRealm refresh]`, accessing it will - never perform blocking work. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMResults *_Nullable results, - RLMCollectionChange *_Nullable change, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths -__attribute__((warn_unused_result)); -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the objects - represented by the results collection. - - NSNumber *min = [results minOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose minimum value is desired. Only properties of types `int`, `float`, `double`, and - `NSDate` are supported. - - @return The minimum value of the property, or `nil` if the Results are empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects represented by the results collection. - - NSNumber *max = [results maxOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose maximum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The maximum value of the property, or `nil` if the Results are empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of the values of a given property over all the objects represented by the results collection. - - NSNumber *sum = [results sumOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose values should be summed. Only properties of - types `int`, `float`, and `double` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects represented by the results collection. - - NSNumber *average = [results averageOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, and `NSData` properties. - - @param property The property whose average value should be calculated. Only - properties of types `int`, `float`, and `double` are supported. - - @return The average value of the given property, or `nil` if the Results are empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -/// :nodoc: -- (RLMObjectType)objectAtIndexedSubscript:(NSUInteger)index; - -#pragma mark - Sectioned Results - -/** - Sorts and sections this collection from a given property key path, returning the result - as an instance of `RLMSectionedResults`. - - @param keyPath The property key path to sort on. - @param ascending The direction to sort in. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsSortedUsingKeyPath:(NSString *)keyPath - ascending:(BOOL)ascending - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -/** - Sorts and sections this collection from a given array of sort descriptors, returning the result - as an instance of `RLMSectionedResults`. - - @param sortDescriptors An array of `RLMSortDescriptor`s to sort by. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @note The primary sort descriptor must be responsible for determining the section key. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsUsingSortDescriptors:(NSArray *)sortDescriptors - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -#pragma mark - Freeze - -/** - Indicates if the result are frozen. - - Frozen Results are immutable and can be accessed from any thread.The objects - read from a frozen Results will also be frozen. - */ -@property (nonatomic, readonly, getter=isFrozen) BOOL frozen; - -/** - Returns a frozen (immutable) snapshot of these results. - - The frozen copy is an immutable collection which contains the same data as - this collection currently contains, but will not update when writes are made - to the containing Realm. Unlike live Results, frozen Results can be accessed - from any thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning Holding onto a frozen collection for an extended period while - performing write transaction on the Realm may result in the Realm - file growing to large sizes. See - `RLMRealmConfiguration.maximumNumberOfActiveVersions` for more - information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -#pragma mark - Unavailable Methods - -/** - `-[RLMResults init]` is not available because `RLMResults` cannot be created directly. - `RLMResults` can be obtained by querying a Realm. - */ -- (instancetype)init __attribute__((unavailable("RLMResults cannot be created directly"))); - -/** - `+[RLMResults new]` is not available because `RLMResults` cannot be created directly. - `RLMResults` can be obtained by querying a Realm. - */ -+ (instancetype)new __attribute__((unavailable("RLMResults cannot be created directly"))); - -@end - -/** - `RLMLinkingObjects` is an auto-updating container type. It represents a collection of objects that link to its - parent object. - - For more information, please see the "Inverse Relationships" section in the - [documentation](https://www.mongodb.com/docs/realm/sdk/swift/fundamentals/relationships/#relationships). - */ -@interface RLMLinkingObjects : RLMResults -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMSchema.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMSchema.h deleted file mode 100644 index fe46f6d47..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMSchema.h +++ /dev/null @@ -1,78 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectSchema; - -/** - `RLMSchema` instances represent collections of model object schemas managed by a Realm. - - When using Realm, `RLMSchema` instances allow performing migrations and - introspecting the database's schema. - - Schemas map to collections of tables in the core database. - */ -RLM_SWIFT_SENDABLE // not actually immutable, but the public API kinda is -@interface RLMSchema : NSObject - -#pragma mark - Properties - -/** - An `NSArray` containing `RLMObjectSchema`s for all object types in the Realm. - - This property is intended to be used during migrations for dynamic introspection. - - @see `RLMObjectSchema` - */ -@property (nonatomic, readonly, copy) NSArray *objectSchema; - -#pragma mark - Methods - -/** - Returns an `RLMObjectSchema` for the given class name in the schema. - - @param className The object class name. - @return An `RLMObjectSchema` for the given class in the schema. - - @see `RLMObjectSchema` - */ -- (nullable RLMObjectSchema *)schemaForClassName:(NSString *)className; - -/** - Looks up and returns an `RLMObjectSchema` for the given class name in the Realm. - - If there is no object of type `className` in the schema, an exception will be thrown. - - @param className The object class name. - @return An `RLMObjectSchema` for the given class in this Realm. - - @see `RLMObjectSchema` - */ -- (RLMObjectSchema *)objectForKeyedSubscript:(NSString *)className; - -/** - Returns whether two `RLMSchema` instances are equivalent. - */ -- (BOOL)isEqualToSchema:(RLMSchema *)schema; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMSectionedResults.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMSectionedResults.h deleted file mode 100644 index 4ee236b94..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMSectionedResults.h +++ /dev/null @@ -1,921 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2022 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@protocol RLMValue; -@class RLMResults; - -/** - A `RLMSectionedResultsChange` object encapsulates information about changes to sectioned - results that are reported by Realm notifications. - - `RLMSectionedResultsChange` is passed to the notification blocks registered with - `-addNotificationBlock` on `RLMSectionedResults`, and reports what sections and rows in the - collection changed since the last time the notification block was called. - - A complete example of updating a `UITableView` named `tv`: - - [tv beginUpdates]; - [tv deleteRowsAtIndexPaths:changes.deletions withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv insertRowsAtIndexPaths:changes.insertions withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv reloadRowsAtIndexPaths:changes.modifications withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv insertSections:changes.sectionsToInsert withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv deleteSections:changes.sectionsToRemove withRowAnimation:UITableViewRowAnimationAutomatic]; - [tv endUpdates]; - - All of the arrays in an `RLMSectionedResultsChange` are always sorted in ascending order. - */ -@interface RLMSectionedResultsChange : NSObject -/// The index paths of objects in the previous version of the collection which have -/// been removed from this one. -@property (nonatomic, readonly) NSArray *deletions; -/// The index paths in the new version of the collection which were newly inserted. -@property (nonatomic, readonly) NSArray *insertions; -/// The index paths in the old version of the collection which were modified. -@property (nonatomic, readonly) NSArray *modifications; -/// The indices of the sections to be inserted. -@property (nonatomic, readonly) NSIndexSet *sectionsToInsert; -/// The indices of the sections to be removed. -@property (nonatomic, readonly) NSIndexSet *sectionsToRemove; -/// Returns the index paths of the deletion indices in the given section. -- (NSArray *)deletionsInSection:(NSUInteger)section; -/// Returns the index paths of the insertion indices in the given section. -- (NSArray *)insertionsInSection:(NSUInteger)section; -/// Returns the index paths of the modification indices in the given section. -- (NSArray *)modificationsInSection:(NSUInteger)section; -@end - - -/// The `RLMSectionedResult` protocol defines properties and methods common to both `RLMSectionedResults and RLMSection` -@protocol RLMSectionedResult - -#pragma mark - Object Access - -/// The count of objects in the collection. -@property (nonatomic, readonly) NSUInteger count; -/// Returns the object for a given index in the collection. -- (id)objectAtIndexedSubscript:(NSUInteger)index; -/// Returns the object for a given index in the collection. -- (id)objectAtIndex:(NSUInteger)index; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this collection. - - The frozen copy is an immutable collection which contains the same data as this - collection currently contains, but will not update when writes are made to the - containing Realm. Unlike live arrays, frozen collections can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning Holding onto a frozen collection for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; -/** - Indicates if the underlying collection is frozen. - - Frozen collections are immutable and can be accessed from any thread. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Sectioned Results Notifications - -/** - Registers a block to be called each time the collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` / `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(id, RLMSectionedResultsChange *))block __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` / `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(id, RLMSectionedResultsChange *))block - queue:(dispatch_queue_t)queue __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` / `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(id, RLMSectionedResultsChange *))block - keyPaths:(NSArray *)keyPaths __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` / `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(id, RLMSectionedResultsChange *))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue __attribute__((warn_unused_result)); - -@end - -/// An RLMSection contains the objects which belong to a specified section key. -@interface RLMSection, RLMObjectType> : NSObject -/// The value that represents the key in this section. -@property (nonatomic, readonly) RLMKeyType key; -/// The count of objects in the section. -@property (nonatomic, readonly) NSUInteger count; -/// Returns the object for a given index in the section. -- (RLMObjectType)objectAtIndexedSubscript:(NSUInteger)index; -/// Returns the object for a given index in the section. -- (RLMObjectType)objectAtIndex:(NSUInteger)index; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this section. - - The frozen copy is an immutable section which contains the same data as this - section currently contains, but will not update when writes are made to the - containing Realm. Unlike live arrays, frozen collections can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning Holding onto a frozen section for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; -/** - Returns a live version of this frozen section. - - This method resolves a reference to a live copy of the same frozen section. - If called on a live section, will return itself. -*/ -- (instancetype)thaw; -/** - Indicates if the underlying section is frozen. - - Frozen sections are immutable and can be accessed from any thread. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Section Notifications - -/** - Registers a block to be called each time the section changes. - - The block will be asynchronously called with the initial section, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - RLMSection *section = sectionedResults[0] // section with dogs aged '5' already exists. - - self.token = [section addNotificationBlock:^(RLMSection *section, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"section.count: %zu", section.count); // => 2 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSection *, RLMSectionedResultsChange *))block __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the section changes. - - The block will be asynchronously called with the initial section, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - RLMSection *section = sectionedResults[0] // section with dogs aged '5' already exists. - - self.token = [section addNotificationBlock:^(RLMSection *section, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"section.count: %zu", section.count); // => 2 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSection *, RLMSectionedResultsChange *))block - queue:(dispatch_queue_t)queue __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the section changes. - - The block will be asynchronously called with the initial section, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - RLMSection *section = sectionedResults[0] // section with dogs aged '5' already exists. - - self.token = [section addNotificationBlock:^(RLMSection *section, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"section.count: %zu", section.count); // => 2 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSection *, RLMSectionedResultsChange *))block - keyPaths:(NSArray *)keyPaths __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the section changes. - - The block will be asynchronously called with the initial section, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSection` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - RLMSection *section = sectionedResults[0] // section with dogs aged '5' already exists. - - self.token = [section addNotificationBlock:^(RLMSection *section, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"section.count: %zu", section.count); // => 2 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSection *, RLMSectionedResultsChange *))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue __attribute__((warn_unused_result)); -@end - -/// A lazily evaluated collection that holds elements in sections determined by a section key. -@interface RLMSectionedResults, RLMObjectType: id> : NSObject -/// An array of all keys in the sectioned results collection. -@property (nonatomic) NSArray *allKeys; -/// The total amount of sections in this collection. -@property (nonatomic, readonly, assign) NSUInteger count; -/// Returns the section at a given index. -- (RLMSection *)objectAtIndexedSubscript:(NSUInteger)index; -/// Returns the section at a given index. -- (RLMSection *)objectAtIndex:(NSUInteger)index; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this sectioned results collection. - - The frozen copy is an immutable sectioned results collection which contains the same data as this - sectioned results collection currently contains, but will not update when writes are made to the - containing Realm. Unlike live sectioned results collections, frozen sectioned results collection - can be accessed from any thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning Holding onto a frozen sectioned results collection for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; -/** - Returns a live version of this frozen sectioned results collection. - - This method resolves a reference to a live copy of the same frozen sectioned results collection. - If called on a live section, will return itself. -*/ -- (instancetype)thaw; -/** - Indicates if the underlying sectioned results collection is frozen. - - Frozen sectioned results collections are immutable and can be accessed from any thread. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Sectioned Results Notifications - -/** - Registers a block to be called each time the sectioned results collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSectionedResults *, RLMSectionedResultsChange *))block __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the sectioned results collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSectionedResults *, RLMSectionedResultsChange *))block - queue:(dispatch_queue_t)queue __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the sectioned results collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSectionedResults *, RLMSectionedResultsChange *))block - keyPaths:(NSArray *)keyPaths __attribute__((warn_unused_result)); -/** - Registers a block to be called each time the sectioned results collection changes. - - The block will be asynchronously called with the initial sectioned results collection, - and then called again after each write transaction which changes either any - of the objects in the results, or which objects are in the results. - - The `change` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the section were added, removed or modified. If a - write transaction did not modify any objects in the section, - the block is not called at all. See the `RLMSectionedResultsChange` documentation for - information on how the changes are reported and an example of updating a - `UITableView`. - - At the time when the block is called, the `RLMSectionedResults` object will be fully - evaluated and up-to-date. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - RLMResults *results = [Dog allObjects]; - RLMSectionedResults *sectionedResults = [results sectionedResultsUsingKeyPath:@"age" ascending:YES]; - self.token = [sectionedResults addNotificationBlock:^(RLMSectionedResults *sectionedResults, RLMSectionedResultsChange *changes) { - // Only fired once for the example - NSLog(@"sectionedResults.count: %zu", sectionedResults.count); // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - dog.age = 5; - [realm addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning The queue must be a serial queue. - - @note When filtering with key paths a notification will be fired in the following scenarios: - - An object in the collection has been modified at the filtered properties. - - An object has been modified on the section key path property, and the result of that modification has changed it's position in the section, or the object may need to move to another section. - - An object of the same observed type has been inserted or deleted from the Realm. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSectionedResults *, RLMSectionedResultsChange *))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue __attribute__((warn_unused_result)); -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMSet.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMSet.h deleted file mode 100644 index fead2e005..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMSet.h +++ /dev/null @@ -1,535 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObject, RLMResults; - -/** - A collection datatype used for storing distinct objects. - - - Note: - `RLMSet` supports storing primitive and `RLMObject` types. `RLMSet` does not support storing - Embedded Realm Objects. - */ -@interface RLMSet : NSObject - -#pragma mark - Properties - -/** - The number of objects in the set. - */ -@property (nonatomic, readonly, assign) NSUInteger count; - -/** - The type of the objects in the set. - */ -@property (nonatomic, readonly, assign) RLMPropertyType type; - -/** - Indicates whether the objects in the collection can be `nil`. - */ -@property (nonatomic, readonly, getter = isOptional) BOOL optional; - -/** - The objects in the RLMSet as an NSArray value. - */ -@property (nonatomic, readonly) NSArray *allObjects; - -/** - The class name of the objects contained in the set. - - Will be `nil` if `type` is not RLMPropertyTypeObject. - */ -@property (nonatomic, readonly, copy, nullable) NSString *objectClassName; - -/** - The Realm which manages the set. Returns `nil` for unmanaged set. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/** - Indicates if the set can no longer be accessed. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -/** - Indicates if the set is frozen. - - Frozen sets are immutable and can be accessed from any thread. Frozen sets - are created by calling `-freeze` on a managed live set. Unmanaged sets are - never frozen. - */ -@property (nonatomic, readonly, getter = isFrozen) BOOL frozen; - -#pragma mark - Adding, Removing, and Replacing Objects in a Set - -/** - Adds an object to the set if it is not already present. - - @warning This method may only be called during a write transaction. - - @param object An object of the type contained in the set. - */ -- (void)addObject:(RLMObjectType)object; - -/** - Adds an array of distinct objects to the set. - - @warning This method may only be called during a write transaction. - - @param objects An enumerable object such as `NSArray`, `NSSet` or `RLMResults` which contains objects of the - same class as the set. - */ -- (void)addObjects:(id)objects; - -/** - Removes a given object from the set. - - @warning This method may only be called during a write transaction. - - @param object The object in the set that you want to remove. - */ -- (void)removeObject:(RLMObjectType)object; - -/** - Removes all objects from the set. - - @warning This method may only be called during a write transaction. - */ -- (void)removeAllObjects; - -/** - Empties the receiving set, then adds each object contained in another given set. - - @warning This method may only be called during a write transaction. - - @param set The RLMSet whose members replace the receiving set's content. - */ -- (void)setSet:(RLMSet *)set; - -/** - Removes from the receiving set each object that isn’t a member of another given set. - - @warning This method may only be called during a write transaction. - - @param set The RLMSet with which to perform the intersection. - */ -- (void)intersectSet:(RLMSet *)set; - -/** - Removes each object in another given set from the receiving set, if present. - - @warning This method may only be called during a write transaction. - - @param set The set of objects to remove from the receiving set. - */ -- (void)minusSet:(RLMSet *)set; - -/** - Adds each object in another given set to the receiving set, if not present. - - @warning This method may only be called during a write transaction. - - @param set The set of objects to add to the receiving set. - */ -- (void)unionSet:(RLMSet *)set; - -#pragma mark - Querying a Set - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (RLMResults *)objectsWhere:(NSString *)predicateFormat args:(va_list)args; - -/// :nodoc: -- (RLMResults *)objectsWithPredicate:(NSPredicate *)predicate; - -/// :nodoc: -- (RLMResults *)sortedResultsUsingKeyPath:(NSString *)keyPath ascending:(BOOL)ascending; - -/// :nodoc: -- (RLMResults *)sortedResultsUsingDescriptors:(NSArray *)properties; - -/// :nodoc: -- (RLMResults *)distinctResultsUsingKeyPaths:(NSArray *)keyPaths; - -/** - Returns a Boolean value that indicates whether at least one object in the receiving set is also present in another given set. - - @param set The RLMSet to compare the receiving set to. - - @return YES if at least one object in the receiving set is also present in otherSet, otherwise NO. - */ -- (BOOL)intersectsSet:(RLMSet *)set; - -/** - Returns a Boolean value that indicates whether every object in the receiving set is also present in another given set. - - @param set The RLMSet to compare the receiving set to. - - @return YES if every object in the receiving set is also present in otherSet, otherwise NO. - */ -- (BOOL)isSubsetOfSet:(RLMSet *)set; - -/** - Returns a Boolean value that indicates whether a given object is present in the set. - - @param anObject An object to look for in the set. - - @return YES if anObject is present in the set, otherwise NO. - */ -- (BOOL)containsObject:(RLMObjectType)anObject; - -/** - Compares the receiving set to another set. - - @param otherSet The set with which to compare the receiving set. - - @return YES if the contents of otherSet are equal to the contents of the receiving set, otherwise NO. - */ -- (BOOL)isEqualToSet:(RLMSet *)otherSet; - -#pragma mark - Sectioning a Set - -/** - Sorts and sections this collection from a given property key path, returning the result - as an instance of `RLMSectionedResults`. - - @param keyPath The property key path to sort on. - @param ascending The direction to sort in. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsSortedUsingKeyPath:(NSString *)keyPath - ascending:(BOOL)ascending - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - -/** - Sorts and sections this collection from a given array of sort descriptors, returning the result - as an instance of `RLMSectionedResults`. - - @param sortDescriptors An array of `RLMSortDescriptor`s to sort by. - @param keyBlock A callback which is invoked on each element in the Results collection. - This callback is to return the section key for the element in the collection. - - @note The primary sort descriptor must be responsible for determining the section key. - - @return An instance of RLMSectionedResults. - */ -- (RLMSectionedResults *)sectionedResultsUsingSortDescriptors:(NSArray *)sortDescriptors - keyBlock:(RLMSectionedResultsKeyBlock)keyBlock; - - -#pragma mark - Notifications - -/** - Registers a block to be called each time the set changes. - - The block will be asynchronously called with the initial set, and then - called again after each write transaction which changes any of the objects in - the set, which objects are in the results, or the order of the objects in the - set. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the set were added, removed or modified. If a write transaction - did not modify any objects in the set, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - Person *person = [[Person allObjectsInRealm:realm] firstObject]; - NSLog(@"person.dogs.count: %zu", person.dogs.count); // => 0 - self.token = [person.dogs addNotificationBlock(RLMSet *dogs, - RLMCollectionChange *changes, - NSError *error) { - // Only fired once for the example - NSLog(@"dogs.count: %zu", dogs.count) // => 1 - }]; - [realm transactionWithBlock:^{ - Dog *dog = [[Dog alloc] init]; - dog.name = @"Rex"; - [person.dogs addObject:dog]; - }]; - // end of run loop execution context - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a non-frozen managed set. - - @param block The block to be called each time the set changes. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSet *_Nullable set, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the set changes. - - The block will be asynchronously called with the initial set, and then - called again after each write transaction which changes any of the objects in - the set, which objects are in the results, or the order of the objects in the - set. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the set were added, removed or modified. If a write transaction - did not modify any objects in the set, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSet *_Nullable set, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the set changes. - - The block will be asynchronously called with the initial set, and then - called again after each write transaction which changes any of the objects in - the set, which objects are in the results, or the order of the objects in the - set. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the set were added, removed or modified. If a write transaction - did not modify any objects in the set, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered on the given queue. If the queue is blocked and - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @param queue The serial queue to deliver notifications to. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSet *_Nullable set, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths - queue:(nullable dispatch_queue_t)queue -__attribute__((warn_unused_result)); - -/** - Registers a block to be called each time the set changes. - - The block will be asynchronously called with the initial set, and then - called again after each write transaction which changes any of the objects in - the set, which objects are in the results, or the order of the objects in the - set. - - The `changes` parameter will be `nil` the first time the block is called. - For each call after that, it will contain information about - which rows in the set were added, removed or modified. If a write transaction - did not modify any objects in the set, the block is not called at all. - See the `RLMCollectionChange` documentation for information on how the changes - are reported and an example of updating a `UITableView`. - - The error parameter is present only for backwards compatibility and will always - be `nil`. - - Notifications are delivered via the standard run loop, and so can't be - delivered while the run loop is blocked by other activity. When - notifications can't be delivered instantly, multiple notifications may be - coalesced into a single notification. This can include the notification - with the initial results. For example, the following code performs a write - transaction immediately after adding the notification block, so there is no - opportunity for the initial notification to be delivered first. As a - result, the initial notification will reflect the state of the Realm after - the write transaction. - - You must retain the returned token for as long as you want updates to continue - to be sent to the block. To stop receiving updates, call `-invalidate` on the token. - - @warning This method cannot be called when the containing Realm is read-only or frozen. - @warning The queue must be a serial queue. - @param block The block to be called whenever a change occurs. - @param keyPaths The block will be called for changes occurring on these keypaths. If no - key paths are given, notifications are delivered for every property key path. - @return A token which must be held for as long as you want updates to be delivered. - */ -- (RLMNotificationToken *)addNotificationBlock:(void (^)(RLMSet *_Nullable set, - RLMCollectionChange *_Nullable changes, - NSError *_Nullable error))block - keyPaths:(nullable NSArray *)keyPaths -__attribute__((warn_unused_result)); - -#pragma mark - Aggregating Property Values - -/** - Returns the minimum (lowest) value of the given property among all the objects in the set. - - NSNumber *min = [object.setProperty minOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, `RLMSet`, and `NSData` properties. - - @param property The property whose minimum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The minimum value of the property, or `nil` if the set is empty. - */ -- (nullable id)minOfProperty:(NSString *)property; - -/** - Returns the maximum (highest) value of the given property among all the objects in the set. - - NSNumber *max = [object.setProperty maxOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, `RLMSet`, and `NSData` properties. - - @param property The property whose maximum value is desired. Only properties of - types `int`, `float`, `double`, and `NSDate` are supported. - - @return The maximum value of the property, or `nil` if the set is empty. - */ -- (nullable id)maxOfProperty:(NSString *)property; - -/** - Returns the sum of distinct values of a given property over all the objects in the set. - - NSNumber *sum = [object.setProperty sumOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMArray`, `RLMSet and `NSData` properties. - - @param property The property whose values should be summed. Only properties of - types `int`, `float`, and `double` are supported. - - @return The sum of the given property. - */ -- (NSNumber *)sumOfProperty:(NSString *)property; - -/** - Returns the average value of a given property over the objects in the set. - - NSNumber *average = [object.setProperty averageOfProperty:@"age"]; - - @warning You cannot use this method on `RLMObject`, `RLMSet`, `RLMArray`, and `NSData` properties. - - @param property The property whose average value should be calculated. Only - properties of types `int`, `float`, and `double` are supported. - - @return The average value of the given property, or `nil` if the set is empty. - */ -- (nullable NSNumber *)averageOfProperty:(NSString *)property; - -#pragma mark - Freeze - -/** - Returns a frozen (immutable) snapshot of this set. - - The frozen copy is an immutable set which contains the same data as this - et currently contains, but will not update when writes are made to the - containing Realm. Unlike live sets, frozen sets can be accessed from any - thread. - - @warning This method cannot be called during a write transaction, or when the - containing Realm is read-only. - @warning This method may only be called on a managed set. - @warning Holding onto a frozen set for an extended period while performing - write transaction on the Realm may result in the Realm file growing - to large sizes. See `RLMRealmConfiguration.maximumNumberOfActiveVersions` - for more information. - */ -- (instancetype)freeze; - -/** - Returns a live version of this frozen collection. - - This method resolves a reference to a live copy of the same frozen collection. - If called on a live collection, will return itself. -*/ -- (instancetype)thaw; - -#pragma mark - Unavailable Methods - -/** - `-[RLMSet init]` is not available because `RLMSet`s cannot be created directly. - ``RLMSet` properties on `RLMObject`s are lazily created when accessed. - */ -- (instancetype)init __attribute__((unavailable("RLMSets cannot be created directly"))); - -/** - `+[RLMSet new]` is not available because `RLMSet`s cannot be created directly. - `RLMSet` properties on `RLMObject`s are lazily created when accessed. - */ -+ (instancetype)new __attribute__((unavailable("RLMSet cannot be created directly"))); - -@end - -/// :nodoc: -@interface RLMSet (Swift) -// for use only in Swift class definitions -- (instancetype)initWithObjectClassName:(NSString *)objectClassName; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMSwiftObject.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMSwiftObject.h deleted file mode 100644 index 7ea764016..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMSwiftObject.h +++ /dev/null @@ -1,142 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) -/** - `Object` is a class used to define Realm model objects. - - In Realm you define your model classes by subclassing `Object` and adding properties to be managed. - You then instantiate and use your custom subclasses instead of using the `Object` class directly. - - ```swift - class Dog: Object { - @objc dynamic var name: String = "" - @objc dynamic var adopted: Bool = false - let siblings = List() - } - ``` - - ### Supported property types - - - `String`, `NSString` - - `Int` - - `Int8`, `Int16`, `Int32`, `Int64` - - `Float` - - `Double` - - `Bool` - - `Date`, `NSDate` - - `Data`, `NSData` - - `Decimal128` - - `ObjectId` - - `@objc enum` which has been delcared as conforming to `RealmEnum`. - - `RealmOptional` for optional numeric properties - - `Object` subclasses, to model many-to-one relationships - - `EmbeddedObject` subclasses, to model owning one-to-one relationships - - `List`, to model many-to-many relationships - - `String`, `NSString`, `Date`, `NSDate`, `Data`, `NSData`, `Decimal128`, and `ObjectId` properties - can be declared as optional. `Object` and `EmbeddedObject` subclasses *must* be declared as optional. - `Int`, `Int8`, `Int16`, `Int32`, `Int64`, `Float`, `Double`, `Bool`, enum, and `List` properties cannot. - To store an optional number, use `RealmOptional`, `RealmOptional`, `RealmOptional`, or - `RealmOptional` instead, which wraps an optional numeric value. Lists cannot be optional at all. - - All property types except for `List` and `RealmOptional` *must* be declared as `@objc dynamic var`. `List` and - `RealmOptional` properties must be declared as non-dynamic `let` properties. Swift `lazy` properties are not allowed. - - Note that none of the restrictions listed above apply to properties that are configured to be ignored by Realm. - - ### Querying - - You can retrieve all objects of a given type from a Realm by calling the `objects(_:)` instance method. - - ### Relationships - - See our [Objective-C guide](https://docs.mongodb.com/realm/sdk/swift/fundamentals/relationships/) for more details. - */ -@interface RealmSwiftObject : RLMObjectBase -@end - -/** - `EmbeddedObject` is a base class used to define embedded Realm model objects. - - Embedded objects work similarly to normal objects, but are owned by a single - parent Object (which itself may be embedded). Unlike normal top-level objects, - embedded objects cannot be directly created in or added to a Realm. Instead, - they can only be created as part of a parent object, or by assigning an - unmanaged object to a parent object's property. Embedded objects are - automatically deleted when the parent object is deleted or when the parent is - modified to no longer point at the embedded object, either by reassigning an - Object property or by removing the embedded object from the List containing it. - - Embedded objects can only ever have a single parent object which links to - them, and attempting to link to an existing managed embedded object will throw - an exception. - - The property types supported on `EmbeddedObject` are the same as for `Object`, - except for that embedded objects cannot link to top-level objects, so `Object` - and `List` properties are not supported (`EmbeddedObject` and - `List` *are*). - - Embedded objects cannot have primary keys or indexed properties. - - ```swift - class Owner: Object { - @objc dynamic var name: String = "" - let dogs = List() - } - class Dog: EmbeddedObject { - @objc dynamic var name: String = "" - @objc dynamic var adopted: Bool = false - let owner = LinkingObjects(fromType: Owner.self, property: "dogs") - } - ``` - */ -@interface RealmSwiftEmbeddedObject : RLMObjectBase -@end - -/** - `AsymmetricObject` is a base class used to define asymmetric Realm objects. - - Asymmetric objects can only be created using the `create(_ object:)` - function, and cannot be added, removed or queried. - When created, asymmetric objects will be synced unidirectionally to the MongoDB - database and cannot be accessed locally. - - Incoming links from any asymmetric table are not allowed, meaning embedding - an asymmetric object within an `Object` will throw an error. - - The property types supported on `AsymmetricObject` are the same as for `Object`, - except for that asymmetric objects can only link to embedded objects, so `Object` - and `List` properties are not supported (`EmbeddedObject` and - `List` *are*). - - ```swift - class Person: AsymmetricObject { - @Persisted(primaryKey: true) var _id: ObjectId = ObjectId.generate() - @Persisted var name: String - @Persisted var age: Int - } - ``` - */ -@interface RealmSwiftAsymmetricObject : RLMObjectBase -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMSwiftProperty.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMSwiftProperty.h deleted file mode 100644 index ea071927c..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMSwiftProperty.h +++ /dev/null @@ -1,71 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -@class RLMObjectBase, RLMArray, RLMSet; - -#ifdef __cplusplus -extern "C" { -#endif - -RLM_HEADER_AUDIT_BEGIN(nullability) - -#define REALM_FOR_EACH_SWIFT_PRIMITIVE_TYPE(macro) \ - macro(bool, Bool, bool) \ - macro(double, Double, double) \ - macro(float, Float, float) \ - macro(int64_t, Int64, int) - -#define REALM_FOR_EACH_SWIFT_OBJECT_TYPE(macro) \ - macro(NSString, String, string) \ - macro(NSDate, Date, date) \ - macro(NSData, Data, data) \ - macro(NSUUID, UUID, uuid) \ - macro(RLMDecimal128, Decimal128, decimal128) \ - macro(RLMObjectId, ObjectId, objectId) - -#define REALM_SWIFT_PROPERTY_ACCESSOR(objc, swift, rlmtype) \ - objc RLMGetSwiftProperty##swift(RLMObjectBase *, uint16_t); \ - objc RLMGetSwiftProperty##swift##Optional(RLMObjectBase *, uint16_t, bool *); \ - void RLMSetSwiftProperty##swift(RLMObjectBase *, uint16_t, objc); -REALM_FOR_EACH_SWIFT_PRIMITIVE_TYPE(REALM_SWIFT_PROPERTY_ACCESSOR) -#undef REALM_SWIFT_PROPERTY_ACCESSOR - -#define REALM_SWIFT_PROPERTY_ACCESSOR(objc, swift, rlmtype) \ - objc *_Nullable RLMGetSwiftProperty##swift(RLMObjectBase *, uint16_t); \ - void RLMSetSwiftProperty##swift(RLMObjectBase *, uint16_t, objc *_Nullable); -REALM_FOR_EACH_SWIFT_OBJECT_TYPE(REALM_SWIFT_PROPERTY_ACCESSOR) -#undef REALM_SWIFT_PROPERTY_ACCESSOR - -id _Nullable RLMGetSwiftPropertyAny(RLMObjectBase *, uint16_t); -void RLMSetSwiftPropertyAny(RLMObjectBase *, uint16_t, id); -RLMObjectBase *_Nullable RLMGetSwiftPropertyObject(RLMObjectBase *, uint16_t); -void RLMSetSwiftPropertyNil(RLMObjectBase *, uint16_t); -void RLMSetSwiftPropertyObject(RLMObjectBase *, uint16_t, RLMObjectBase *_Nullable); - -RLMArray *_Nonnull RLMGetSwiftPropertyArray(RLMObjectBase *obj, uint16_t); -RLMSet *_Nonnull RLMGetSwiftPropertySet(RLMObjectBase *obj, uint16_t); -RLMDictionary *_Nonnull RLMGetSwiftPropertyMap(RLMObjectBase *obj, uint16_t); - -RLM_HEADER_AUDIT_END(nullability) - -#ifdef __cplusplus -} // extern "C" -#endif diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMSyncConfiguration.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMSyncConfiguration.h deleted file mode 100644 index 54ea2ecfc..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMSyncConfiguration.h +++ /dev/null @@ -1,196 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -@class RLMApp; -@class RLMRealm; -@class RLMRealmConfiguration; -@class RLMUser; -@protocol RLMBSON; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** Determines file behavior during a client reset. - - @see: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ -*/ -typedef NS_ENUM(NSUInteger, RLMClientResetMode) { - /// The local copy of the Realm is copied into a recovery - /// directory for safekeeping, and then deleted from the original location. The next time - /// the Realm for that partition value is opened, the Realm will automatically be re-downloaded from - /// Atlas App Services, and can be used as normal. - - /// Data written to the Realm after the local copy of the Realm diverged from the backup - /// remote copy will be present in the local recovery copy of the Realm file. The - /// re-downloaded Realm will initially contain only the data present at the time the Realm - /// was backed up on the server. - /// - /// @see: ``rlmSync_clientResetBackedUpRealmPath`` and ``RLMSyncErrorActionToken`` for more information on accessing the recovery directory and error information. - /// - /// The manual client reset mode handler can be set in two places: - /// 1. As an ErrorReportingBlock argument at ``RLMSyncConfiguration.manualClientResetHandler``. - /// 2. As an ErrorReportingBlock in the ``RLMSyncManager.errorHandler`` property. - /// @see: ``RLMSyncManager.errorHandler`` - /// - /// When an ``RLMSyncErrorClientResetError`` is thrown, the following rules determine which block is executed: - /// - If an error reporting block is set in ``.manualClientResetHandler`` and the ``RLMSyncManager.errorHandler``, the ``.manualClientResetHandler`` block will be executed. - /// - If an error reporting block is set in either the ``.manualClientResetHandler`` or the ``RLMSyncManager``, but not both, the single block will execute. - /// - If no block is set in either location, the client reset will not be handled. The application will likely need to be restarted and unsynced local changes may be lost. - /// @note: The ``RLMSyncManager.errorHandler`` is still invoked under all ``RLMSyncError``s *other than* ``RLMSyncErrorClientResetError``. - /// @see ``RLMSyncError`` for an exhaustive list. - RLMClientResetModeManual = 0, - /// All unsynchronized local changes are automatically discarded and the local state is - /// automatically reverted to the most recent state from the server. Unsynchronized changes - /// can then be recovered in the post-client-reset callback block. - /// - /// If ``RLMClientResetModeDiscardLocal`` is enabled but the client reset operation is unable to complete - /// then the client reset process reverts to manual mode. Example) During a destructive schema change this - /// mode will fail and invoke the manual client reset handler. - /// - /// The RLMClientResetModeDiscardLocal mode supports two client reset callbacks -- ``RLMClientResetBeforeBlock``, ``RLMClientResetAfterBlock`` -- which can be passed as arguments when creating the ``RLMSyncConfiguration``. - /// @see: ``RLMClientResetAfterBlock`` and ``RLMClientResetBeforeBlock`` - RLMClientResetModeDiscardLocal __deprecated_enum_msg("Use RLMClientResetModeDiscardUnsyncedChanges") = 1, - /// All unsynchronized local changes are automatically discarded and the local state is - /// automatically reverted to the most recent state from the server. Unsynchronized changes - /// can then be recovered in the post-client-reset callback block. - /// - /// If ``RLMClientResetModeDiscardUnsyncedChanges`` is enabled but the client reset operation is unable to complete - /// then the client reset process reverts to manual mode. Example) During a destructive schema change this - /// mode will fail and invoke the manual client reset handler. - /// - /// The RLMClientResetModeDiscardUnsyncedChanges mode supports two client reset callbacks -- ``RLMClientResetBeforeBlock``, ``RLMClientResetAfterBlock`` -- which can be passed as arguments when creating the ``RLMSyncConfiguration``. - /// @see: ``RLMClientResetAfterBlock`` and ``RLMClientResetBeforeBlock`` - RLMClientResetModeDiscardUnsyncedChanges = 1, - /// The client device will download a realm realm which reflects the latest - /// state of the server after a client reset. A recovery process is run locally in - /// an attempt to integrate the server version with any local changes from - /// before the client reset occurred. - /// - /// The changes are integrated with the following rules: - /// 1. Objects created locally that were not synced before client reset will be integrated. - /// 2. If an object has been deleted on the server, but was modified on the client, the delete takes precedence and the update is discarded - /// 3. If an object was deleted on the client, but not the server, then the client delete instruction is applied. - /// 4. In the case of conflicting updates to the same field, the client update is applied. - /// - /// If the recovery integration fails, the client reset process falls back to ``RLMClientResetModeManual``. - /// The recovery integration will fail if the "Client Recovery" setting is not enabled on the server. - /// Integration may also fail in the event of an incompatible schema change. - /// - /// The RLMClientResetModeRecoverUnsyncedChanges mode supports two client reset callbacks -- ``RLMClientResetBeforeBlock``, ``RLMClientResetAfterBlock`` -- which can be passed as arguments when creating the ``RLMSyncConfiguration``. - /// @see: ``RLMClientResetAfterBlock`` and ``RLMClientResetBeforeBlock`` - RLMClientResetModeRecoverUnsyncedChanges = 2, - /// The client device will download a realm with objects reflecting the latest version of the server. A recovery - /// process is run locally in an attempt to integrate the server version with any local changes from before the - /// client reset occurred. - /// - /// The changes are integrated with the following rules: - /// 1. Objects created locally that were not synced before client reset will be integrated. - /// 2. If an object has been deleted on the server, but was modified on the client, the delete takes precedence and the update is discarded - /// 3. If an object was deleted on the client, but not the server, then the client delete instruction is applied. - /// 4. In the case of conflicting updates to the same field, the client update is applied. - /// - /// If the recovery integration fails, the client reset process falls back to ``RLMClientResetModeDiscardUnsyncedChanges``. - /// The recovery integration will fail if the "Client Recovery" setting is not enabled on the server. - /// Integration may also fail in the event of an incompatible schema change. - /// - /// The RLMClientResetModeRecoverOrDiscardUnsyncedChanges mode supports two client reset callbacks -- ``RLMClientResetBeforeBlock``, ``RLMClientResetAfterBlock`` -- which can be passed as arguments when creating the ``RLMSyncConfiguration``. - /// @see: ``RLMClientResetAfterBlock`` and ``RLMClientResetBeforeBlock`` - RLMClientResetModeRecoverOrDiscardUnsyncedChanges = 3 -}; - -/** - A block type used to report before a client reset will occur. - The `beforeFrozen` is a frozen copy of the local state prior to client reset. - */ -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMClientResetBeforeBlock)(RLMRealm * _Nonnull beforeFrozen); - -/** - A block type used to report after a client reset occurred. - The `beforeFrozen` argument is a frozen copy of the local state prior to client reset. - The `after` argument contains the local database state after the client reset occurred. - */ -RLM_SWIFT_SENDABLE // invoked on a backgroun thread -typedef void(^RLMClientResetAfterBlock)(RLMRealm * _Nonnull beforeFrozen, RLMRealm * _Nonnull after); - -/** - A configuration object representing configuration state for a Realm which is intended to sync with a Realm Object - Server. - */ -@interface RLMSyncConfiguration : NSObject - -/// The user to which the remote Realm belongs. -@property (nonatomic, readonly) RLMUser *user; - -/** - The value this Realm is partitioned on. The partition key is a property defined in - Atlas App Services. All classes with a property with this value will be synchronized to the - Realm. - */ -@property (nonatomic, readonly) id partitionValue; - -/** - An enum which determines file recovery behavior in the event of a client reset. - @note: Defaults to `RLMClientResetModeRecoverUnsyncedChanges` - - @see: `RLMClientResetMode` - @see: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ -*/ -@property (nonatomic) RLMClientResetMode clientResetMode; - -/** - A callback which notifies prior to prior to a client reset occurring. - @see: `RLMClientResetBeforeBlock` - */ -@property (nonatomic, nullable) RLMClientResetBeforeBlock beforeClientReset; - -/** - A callback which notifies after a client reset has occurred. - @see: `RLMClientResetAfterBlock` - */ -@property (nonatomic, nullable) RLMClientResetAfterBlock afterClientReset; - -/** - A callback that's executed when an `RLMSyncErrorClientResetError` is encountered. - @See RLMSyncErrorReportingBlock and RLMSyncErrorClientResetError for more - details on handling a client reset manually. - */ -@property (nonatomic, nullable) RLMSyncErrorReportingBlock manualClientResetHandler; - - -/** - Whether nonfatal connection errors should cancel async opens. - - By default, if a nonfatal connection error such as a connection timing out occurs, any currently pending asyncOpen operations will ignore the error and continue to retry until it succeeds. If this is set to true, the open will instead fail and report the error. - - NEXT-MAJOR: This should be true by default. - */ -@property (nonatomic) bool cancelAsyncOpenOnNonFatalErrors; - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("This type cannot be created directly"))); - -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("This type cannot be created directly"))); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMSyncManager.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMSyncManager.h deleted file mode 100644 index 1dee453d0..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMSyncManager.h +++ /dev/null @@ -1,223 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMSyncSession, RLMSyncTimeoutOptions, RLMAppConfiguration; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -// NEXT-MAJOR: This enum needs to be removed when access to the logger is removed -// from the sync manager. -/// An enum representing different levels of sync-related logging that can be configured. -typedef RLM_CLOSED_ENUM(NSUInteger, RLMSyncLogLevel) { - /// Nothing will ever be logged. - RLMSyncLogLevelOff, - /// Only fatal errors will be logged. - RLMSyncLogLevelFatal, - /// Only errors will be logged. - RLMSyncLogLevelError, - /// Warnings and errors will be logged. - RLMSyncLogLevelWarn, - /// Information about sync events will be logged. Fewer events will be logged in order to avoid overhead. - RLMSyncLogLevelInfo, - /// Information about sync events will be logged. More events will be logged than with `RLMSyncLogLevelInfo`. - RLMSyncLogLevelDetail, - /// Log information that can aid in debugging. - /// - /// - warning: Will incur a measurable performance impact. - RLMSyncLogLevelDebug, - /// Log information that can aid in debugging. More events will be logged than with `RLMSyncLogLevelDebug`. - /// - /// - warning: Will incur a measurable performance impact. - RLMSyncLogLevelTrace, - /// Log information that can aid in debugging. More events will be logged than with `RLMSyncLogLevelTrace`. - /// - /// - warning: Will incur a measurable performance impact. - RLMSyncLogLevelAll -}; - -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" -/// A log callback function which can be set on RLMSyncManager. -/// -/// The log function may be called from multiple threads simultaneously, and is -/// responsible for performing its own synchronization if any is required. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void (^RLMSyncLogFunction)(RLMSyncLogLevel level, NSString *message); -#pragma clang diagnostic pop - -/// A block type representing a block which can be used to report a sync-related error to the application. If the error -/// pertains to a specific session, that session will also be passed into the block. -RLM_SWIFT_SENDABLE // invoked on a background thread -typedef void(^RLMSyncErrorReportingBlock)(NSError *, RLMSyncSession * _Nullable); - -/** - A manager which serves as a central point for sync-related configuration. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMSyncManager : NSObject - -/** - A block which can optionally be set to report sync-related errors to your application. - - Any error reported through this block will be of the `RLMSyncError` type, and marked - with the `RLMSyncErrorDomain` domain. - - Errors reported through this mechanism are fatal, with several exceptions. Please consult - `RLMSyncError` for information about the types of errors that can be reported through - the block, and for for suggestions on handling recoverable error codes. - - @see `RLMSyncError` - */ -@property (nullable, atomic, copy) RLMSyncErrorReportingBlock errorHandler; - -/// :nodoc: -@property (nonatomic, copy) NSString *appID -__attribute__((deprecated("This property is not used for anything"))); - -/** - A string identifying this application which is included in the User-Agent - header of sync connections. By default, this will be the application's bundle - identifier. - - This property must be set prior to opening a synchronized Realm for the first - time. Any modifications made after opening a Realm will be ignored. - */ -@property (atomic, copy) NSString *userAgent; - -/** - The logging threshold which newly opened synced Realms will use. Defaults to - `RLMSyncLogLevelInfo`. - - By default logging strings are output to Apple System Logger. Set `logger` to - perform custom logging logic instead. - - @warning This property must be set before any synced Realms are opened. Setting it after - opening any synced Realm will do nothing. - */ -@property (atomic) RLMSyncLogLevel logLevel -__attribute__((deprecated("Use `RLMLogger.default.level`/`Logger.shared.level` to set/get the default logger threshold level."))); - -/** - The function which will be invoked whenever the sync client has a log message. - - If nil, log strings are output to Apple System Logger instead. - - @warning This property must be set before any synced Realms are opened. Setting - it after opening any synced Realm will do nothing. - */ -@property (atomic, nullable) RLMSyncLogFunction logger -__attribute__((deprecated("Use `RLMLogger.default`/`Logger.shared` to set/get the default logger."))); - -/** - The name of the HTTP header to send authorization data in when making requests to Atlas App Services which has - been configured to expect a custom authorization header. - */ -@property (nullable, atomic, copy) NSString *authorizationHeaderName; - -/** - Extra HTTP headers to append to every request to Atlas App Services. - - Modifying this property while sync sessions are active will result in all - sessions disconnecting and reconnecting using the new headers. - */ -@property (nullable, atomic, copy) NSDictionary *customRequestHeaders; - -/** - Options for the assorted types of connection timeouts for sync connections. - - If nil default values for all timeouts are used instead. - - @warning This property must be set before any synced Realms are opened. Setting - it after opening any synced Realm will do nothing. - */ -@property (nullable, atomic, copy) RLMSyncTimeoutOptions *timeoutOptions; - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("RLMSyncManager cannot be created directly"))); - -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("RLMSyncManager cannot be created directly"))); - -@end - -/** - Options for configuring timeouts and intervals in the sync client. - */ -@interface RLMSyncTimeoutOptions : NSObject -/// The maximum number of milliseconds to allow for a connection to -/// become fully established. This includes the time to resolve the -/// network address, the TCP connect operation, the SSL handshake, and -/// the WebSocket handshake. -/// -/// Defaults to 2 minutes. -@property (nonatomic) NSUInteger connectTimeout; - -/// The number of milliseconds to keep a connection open after all -/// sessions have been abandoned. -/// -/// After all synchronized Realms have been closed for a given server, the -/// connection is kept open until the linger time has expired to avoid the -/// overhead of reestablishing the connection when Realms are being closed and -/// reopened. -/// -/// Defaults to 30 seconds. -@property (nonatomic) NSUInteger connectionLingerTime; - -/// The number of milliseconds between each heartbeat ping message. -/// -/// The client periodically sends ping messages to the server to check if the -/// connection is still alive. Shorter periods make connection state change -/// notifications more responsive at the cost of battery life (as the antenna -/// will have to wake up more often). -/// -/// Defaults to 1 minute. -@property (nonatomic) NSUInteger pingKeepalivePeriod; - -/// How long in milliseconds to wait for a reponse to a heartbeat ping before -/// concluding that the connection has dropped. -/// -/// Shorter values will make connection state change notifications more -/// responsive as it will only change to `disconnected` after this much time has -/// elapsed, but overly short values may result in spurious disconnection -/// notifications when the server is simply taking a long time to respond. -/// -/// Defaults to 2 minutes. -@property (nonatomic) NSUInteger pongKeepaliveTimeout; - -/// The maximum amount of time, in milliseconds, since the loss of a -/// prior connection, for a new connection to be considered a "fast -/// reconnect". -/// -/// When a client first connects to the server, it defers uploading any local -/// changes until it has downloaded all changesets from the server. This -/// typically reduces the total amount of merging that has to be done, and is -/// particularly beneficial the first time that a specific client ever connects -/// to the server. -/// -/// When an existing client disconnects and then reconnects within the "fact -/// reconnect" time this is skipped and any local changes are uploaded -/// immediately without waiting for downloads, just as if the client was online -/// the whole time. -/// -/// Defaults to 1 minute. -@property (nonatomic) NSUInteger fastReconnectLimit; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMSyncSession.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMSyncSession.h deleted file mode 100644 index 31677ce9c..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMSyncSession.h +++ /dev/null @@ -1,234 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -/** - The current state of the session represented by a session object. - */ -typedef NS_ENUM(NSUInteger, RLMSyncSessionState) { - /// The sync session is actively communicating or attempting to communicate - /// with Atlas App Services. A session is considered Active even if - /// it is not currently connected. Check the connection state instead if you - /// wish to know if the connection is currently online. - RLMSyncSessionStateActive, - /// The sync session is not attempting to communicate with MongoDB - /// Realm due to the user logging out or synchronization being paused. - RLMSyncSessionStateInactive, - /// The sync session encountered a fatal error and is permanently invalid; it should be discarded. - RLMSyncSessionStateInvalid -}; - -/** - The current state of a sync session's connection. Sessions which are not in - the Active state will always be Disconnected. - */ -typedef NS_ENUM(NSUInteger, RLMSyncConnectionState) { - /// The sync session is not connected to the server, and is not attempting - /// to connect, either because the session is inactive or because it is - /// waiting to retry after a failed connection. - RLMSyncConnectionStateDisconnected, - /// The sync session is attempting to connect to Atlas App Services. - RLMSyncConnectionStateConnecting, - /// The sync session is currently connected to Atlas App Services. - RLMSyncConnectionStateConnected, -}; - -/** - The transfer direction (upload or download) tracked by a given progress notification block. - - Progress notification blocks can be registered on sessions if your app wishes to be informed - how many bytes have been uploaded or downloaded, for example to show progress indicator UIs. - */ -typedef RLM_CLOSED_ENUM(NSUInteger, RLMSyncProgressDirection) { - /// For monitoring upload progress. - RLMSyncProgressDirectionUpload, - /// For monitoring download progress. - RLMSyncProgressDirectionDownload, -}; - -/** - The desired behavior of a progress notification block. - - Progress notification blocks can be registered on sessions if your app wishes to be informed - how many bytes have been uploaded or downloaded, for example to show progress indicator UIs. - */ -typedef NS_ENUM(NSUInteger, RLMSyncProgressMode) { - /** - The block will be called indefinitely, or until it is unregistered by calling - `-[RLMProgressNotificationToken invalidate]`. - - Notifications will always report the latest number of transferred bytes, and the - most up-to-date number of total transferrable bytes. - */ - RLMSyncProgressModeReportIndefinitely, - /** - The block will, upon registration, store the total number of bytes - to be transferred. When invoked, it will always report the most up-to-date number - of transferrable bytes out of that original number of transferrable bytes. - - When the number of transferred bytes reaches or exceeds the - number of transferrable bytes, the block will be unregistered. - */ - RLMSyncProgressModeForCurrentlyOutstandingWork, -}; - -@class RLMUser, RLMSyncConfiguration, RLMSyncErrorActionToken, RLMSyncManager; - -/** - The type of a progress notification block intended for reporting a session's network - activity to the user. - - `transferredBytes` refers to the number of bytes that have been uploaded or downloaded. - `transferrableBytes` refers to the total number of bytes transferred, and pending transfer. - */ -typedef void(^RLMProgressNotificationBlock)(NSUInteger transferredBytes, NSUInteger transferrableBytes); - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A token object corresponding to a progress notification block on a session object. - - To stop notifications manually, call `-invalidate` on it. Notifications should be stopped before - the token goes out of scope or is destroyed. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMProgressNotificationToken : RLMNotificationToken -@end - -/** - An object encapsulating an Atlas App Services "session". Sessions represent the - communication between the client (and a local Realm file on disk), and the server - (and a remote Realm with a given partition value stored on Atlas App Services). - - Sessions are always created by the SDK and vended out through various APIs. The - lifespans of sessions associated with Realms are managed automatically. Session - objects can be accessed from any thread. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMSyncSession : NSObject - -/// The session's current state. -/// -/// This property is not KVO-compliant. -@property (nonatomic, readonly) RLMSyncSessionState state; - -/// The session's current connection state. -/// -/// This property is KVO-compliant and can be observed to be notified of changes. -/// Be warned that KVO observers for this property may be called on a background -/// thread. -@property (atomic, readonly) RLMSyncConnectionState connectionState; - -/// The user that owns this session. -- (nullable RLMUser *)parentUser; - -/** - If the session is valid, return a sync configuration that can be used to open the Realm - associated with this session. - */ -- (nullable RLMSyncConfiguration *)configuration; - -/** - Temporarily suspend syncronization and disconnect from the server. - - The session will not attempt to connect to Atlas App Services until `resume` - is called or the Realm file is closed and re-opened. - */ -- (void)suspend; - -/** - Resume syncronization and reconnect to Atlas App Services after suspending. - - This is a no-op if the session was already active or if the session is invalid. - Newly created sessions begin in the Active state and do not need to be resumed. - */ -- (void)resume; - -/** - Register a progress notification block. - - Multiple blocks can be registered with the same session at once. Each block - will be invoked on a side queue devoted to progress notifications. - - If the session has already received progress information from the - synchronization subsystem, the block will be called immediately. Otherwise, it - will be called as soon as progress information becomes available. - - The token returned by this method must be retained as long as progress - notifications are desired, and the `-invalidate` method should be called on it - when notifications are no longer needed and before the token is destroyed. - - If no token is returned, the notification block will never be called again. - There are a number of reasons this might be true. If the session has previously - experienced a fatal error it will not accept progress notification blocks. If - the block was configured in the `RLMSyncProgressForCurrentlyOutstandingWork` - mode but there is no additional progress to report (for example, the number - of transferrable bytes and transferred bytes are equal), the block will not be - called again. - - @param direction The transfer direction (upload or download) to track in this progress notification block. - @param mode The desired behavior of this progress notification block. - @param block The block to invoke when notifications are available. - - @return A token which must be held for as long as you want notifications to be delivered. - - @see `RLMSyncProgressDirection`, `RLMSyncProgress`, `RLMProgressNotificationBlock`, `RLMProgressNotificationToken` - */ -- (nullable RLMProgressNotificationToken *)addProgressNotificationForDirection:(RLMSyncProgressDirection)direction - mode:(RLMSyncProgressMode)mode - block:(RLMProgressNotificationBlock)block -NS_REFINED_FOR_SWIFT; - -/** - Given an error action token, immediately handle the corresponding action. - - @see `RLMSyncErrorClientResetError`, `RLMSyncErrorPermissionDeniedError` - */ -+ (void)immediatelyHandleError:(RLMSyncErrorActionToken *)token syncManager:(RLMSyncManager *)syncManager; - -/** - Get the sync session for the given Realm if it is a synchronized Realm, or `nil` - if it is not. - */ -+ (nullable RLMSyncSession *)sessionForRealm:(RLMRealm *)realm; - -@end - -// MARK: - Error action token - -#pragma mark - Error action token - -/** - An opaque token returned as part of certain errors. It can be - passed into certain APIs to perform certain actions. - - @see `RLMSyncErrorClientResetError`, `RLMSyncErrorPermissionDeniedError` - */ -RLM_SWIFT_SENDABLE RLM_FINAL -@interface RLMSyncErrorActionToken : NSObject - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("This type cannot be created directly"))); - -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("This type cannot be created directly"))); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMSyncSubscription.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMSyncSubscription.h deleted file mode 100644 index d35be19d0..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMSyncSubscription.h +++ /dev/null @@ -1,346 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectId; - -#pragma mark - Subscription States - -/// The current state of the subscription. This can be used for ensuring that -/// the subscriptions are not errored and that it has been successfully -/// synced to the server. -typedef NS_ENUM(NSUInteger, RLMSyncSubscriptionState) { - /// The subscription is complete and the server has sent all the data that matched the subscription - /// queries at the time the subscription set was updated. The server is now in a steady-state - /// synchronization mode where it will stream update as they come. - RLMSyncSubscriptionStateComplete, - /// The subscription encountered an error and synchronization is paused for this Realm. You can - /// find the error calling error in the subscription set to get a description of the error. You can - /// still use the current subscription set to write a subscription. - RLMSyncSubscriptionStateError, - /// The subscription is persisted locally but not yet processed by the server, which means - /// the server hasn't yet returned all the data that matched the updated subscription queries. - RLMSyncSubscriptionStatePending, - /// The subscription set has been super-ceded by an updated one, this typically means that - /// someone is trying to write a subscription on a different instance of the subscription set. - /// You should not use a superseded subscription set and instead obtain a new instance of - /// the subscription set to write a subscription. - RLMSyncSubscriptionStateSuperseded -}; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - `RLMSyncSubscription` is used to define a Flexible Sync subscription obtained from querying a - subscription set, which can be used to read or remove/update a committed subscription. - */ -@interface RLMSyncSubscription : NSObject - -/// Name of the subscription. If not specified it will return nil. -@property (nonatomic, readonly, nullable) NSString *name; - -/// When the subscription was created. Recorded automatically. -@property (nonatomic, readonly) NSDate *createdAt; - -/// When the subscription was last updated. Recorded automatically. -@property (nonatomic, readonly) NSDate *updatedAt; - -/** - Updates a Flexible Sync's subscription query with an allowed query which will be used to bootstrap data - from the server when committed. - - @warning This method may only be called during a write subscription block. - - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - */ -- (void)updateSubscriptionWhere:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (void)updateSubscriptionWhere:(NSString *)predicateFormat - args:(va_list)args; - -/** - Updates a Flexible Sync's subscription query with an allowed query which will be used to bootstrap data - from the server when committed. - - @warning This method may only be called during a write subscription block. - - @param predicate The predicate with which to filter the objects on the server. - */ -- (void)updateSubscriptionWithPredicate:(NSPredicate *)predicate; - -@end - -/** - `RLMSyncSubscriptionSet` is a collection of `RLMSyncSubscription`s. This is the entry point - for adding and removing `RLMSyncSubscription`s. - */ -@interface RLMSyncSubscriptionSet : NSObject - -/// The number of subscriptions in the subscription set. -@property (readonly) NSUInteger count; - -/// Gets the error associated to the subscription set. This will be non-nil in case the current -/// state of the subscription set is `RLMSyncSubscriptionStateError`. -@property (nonatomic, readonly, nullable) NSError *error; - -/// Gets the state associated to the subscription set. -@property (nonatomic, readonly) RLMSyncSubscriptionState state; - -#pragma mark - Batch Update subscriptions - -/** - Synchronously performs any transactions (add/remove/update) to the subscription set within the block, - this will not wait for the server to acknowledge and see all the data associated with this collection of subscriptions, - and will return after committing the subscription transactions. - - @param block The block containing actions to perform to the subscription set. - */ -- (void)update:(__attribute__((noescape)) void(^)(void))block; -/// :nodoc: -- (void)write:(__attribute__((noescape)) void(^)(void))block __attribute__((unavailable("Renamed to -update"))); - -/** - Synchronously performs any transactions (add/remove/update) to the subscription set within the block, - this will not wait for the server to acknowledge and see all the data associated with this collection of subscriptions, - and will return after committing the subscription transactions. - - @param block The block containing actions to perform to the subscription set. - @param onComplete A block which is called upon synchronization of - subscriptions to the server. The block will be passed `nil` - if the update succeeded, and an error describing the problem - otherwise. - */ -- (void)update:(__attribute__((noescape)) void(^)(void))block - onComplete:(nullable void(^RLM_SWIFT_SENDABLE)(NSError *_Nullable))onComplete - __attribute__((swift_async(not_swift_private, 2))) - __attribute__((swift_attr("@_unsafeInheritExecutor"))); -/// :nodoc: -- (void)write:(__attribute__((noescape)) void(^)(void))block - onComplete:(void(^)(NSError * _Nullable))onComplete __attribute__((unavailable("Renamed to -update:onComplete."))); - -#pragma mark - Find subscription - -/** - Finds a subscription by the specified name. - - @param name The name used to identify the subscription. - - @return A subscription for the given name. - */ -- (nullable RLMSyncSubscription *)subscriptionWithName:(NSString *)name; - -/** - Finds a subscription by the query for the specified object class name. - - @param objectClassName The class name for the model class to be queried. - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - - @return A subscription for the given query.. - */ -- (nullable RLMSyncSubscription *)subscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (nullable RLMSyncSubscription *)subscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat - args:(va_list)args; - -/** - Finds a subscription by the query for the specified object class name. - - @param objectClassName The class name for the model class to be queried. - @param predicate The predicate used to to filter the objects on the server. - - @return A subscription for the given query.. - */ -- (nullable RLMSyncSubscription *)subscriptionWithClassName:(NSString *)objectClassName - predicate:(NSPredicate *)predicate; - -#pragma mark - Add a Subscription - -/** - Adds a new subscription to the subscription set which will be sent to the server when - committed at the end of a write subscription block. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - */ -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat - args:(va_list)args; - -/** - Adds a new subscription to the subscription set which will be sent to the server when - committed at the end of a write subscription block. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param name The name used the identify the subscription. - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - */ -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - subscriptionName:(NSString *)name - where:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - subscriptionName:(NSString *)name - where:(NSString *)predicateFormat - args:(va_list)args; - -/** - Adds a new subscription to the subscription set which will be sent to the server when - committed at the end of a write subscription block. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param predicate The predicate defining the query for the subscription. - */ -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - predicate:(NSPredicate *)predicate; - -/** - Adds a new subscription to the subscription set which will be sent to the server when - committed at the end of a write subscription block. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param name The name used to identify the subscription. - @param predicate The predicate defining the query for the subscription. - */ -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - subscriptionName:(nullable NSString *)name - predicate:(NSPredicate *)predicate; - -#pragma mark - Remove Subscription - -/** - Removes a subscription with the specified name from the subscription set. - - @warning This method may only be called during a write subscription block. - - @param name The name used the identify the subscription. - */ -- (void)removeSubscriptionWithName:(NSString *)name; - -/** - Removes a subscription with the specified query for the object class from the subscription set. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param predicateFormat A predicate format string, optionally followed by a variable number of arguments. - */ -- (void)removeSubscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat, ...; - -/// :nodoc: -- (void)removeSubscriptionWithClassName:(NSString *)objectClassName - where:(NSString *)predicateFormat - args:(va_list)args; - -/** - Removes a subscription with the specified query for the object class from the subscription set. - - @warning This method may only be called during a write subscription block. - - @param objectClassName The class name for the model class to be queried. - @param predicate The predicate which will be used to identify the subscription to be removed. - */ -- (void)removeSubscriptionWithClassName:(NSString *)objectClassName - predicate:(NSPredicate *)predicate; - -/** - Removes the subscription from the subscription set. - - @warning This method may only be called during a write subscription block. - - @param subscription An instance of the subscription to be removed. - */ -- (void)removeSubscription:(RLMSyncSubscription *)subscription; - -#pragma mark - Remove Subscriptions - -/** - Removes all subscription from the subscription set. - - @warning This method may only be called during a write subscription block. - @warning Removing all subscriptions will result in an error if no new subscription is added. Server should - acknowledge at least one subscription. - */ -- (void)removeAllSubscriptions; - -/** - Removes all subscription with the specified class name. - - @param className The class name for the model class to be queried. - - @warning This method may only be called during a write subscription block. - */ -- (void)removeAllSubscriptionsWithClassName:(NSString *)className; - -#pragma mark - SubscriptionSet Collection - -/** - Returns the subscription at the given `index`. - - @param index The index. - - @return A subscription for the given index in the subscription set. - */ -- (nullable RLMSyncSubscription *)objectAtIndex:(NSUInteger)index; - -/** - Returns the first object in the subscription set list, or `nil` if the subscriptions are empty. - - @return A subscription. - */ -- (nullable RLMSyncSubscription *)firstObject; - -/** - Returns the last object in the subscription set, or `nil` if the subscriptions are empty. - - @return A subscription. - */ -- (nullable RLMSyncSubscription *)lastObject; - -#pragma mark - Subscript - -/** - Returns the subscription at the given `index`. - - @param index The index. - - @return A subscription for the given index in the subscription set. - */ -- (id)objectAtIndexedSubscript:(NSUInteger)index; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMThreadSafeReference.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMThreadSafeReference.h deleted file mode 100644 index 9472942ed..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMThreadSafeReference.h +++ /dev/null @@ -1,107 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMRealm; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - Objects of types which conform to `RLMThreadConfined` can be managed by a Realm, which will make - them bound to a thread-specific `RLMRealm` instance. Managed objects must be explicitly exported - and imported to be passed between threads. - - Managed instances of objects conforming to this protocol can be converted to a thread-safe - reference for transport between threads by passing to the - `+[RLMThreadSafeReference referenceWithThreadConfined:]` constructor. - - Note that only types defined by Realm can meaningfully conform to this protocol, and defining new - classes which attempt to conform to it will not make them work with `RLMThreadSafeReference`. - */ -@protocol RLMThreadConfined -// Conformance to the `RLMThreadConfined_Private` protocol will be enforced at runtime. - -/** - The Realm which manages the object, or `nil` if the object is unmanaged. - - Unmanaged objects are not confined to a thread and cannot be passed to methods expecting a - `RLMThreadConfined` object. - */ -@property (nonatomic, readonly, nullable) RLMRealm *realm; - -/// Indicates if the object can no longer be accessed because it is now invalid. -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -@end - -/** - An object intended to be passed between threads containing a thread-safe reference to its - thread-confined object. - - To resolve a thread-safe reference on a target Realm on a different thread, pass to - `-[RLMRealm resolveThreadSafeReference:]`. - - @warning A `RLMThreadSafeReference` object must be resolved at most once. - Failing to resolve a `RLMThreadSafeReference` will result in the source version of the - Realm being pinned until the reference is deallocated. - - @note Prefer short-lived `RLMThreadSafeReference`s as the data for the version of the source Realm - will be retained until all references have been resolved or deallocated. - - @see `RLMThreadConfined` - @see `-[RLMRealm resolveThreadSafeReference:]` - */ -RLM_SWIFT_SENDABLE RLM_FINAL // is internally thread-safe -@interface RLMThreadSafeReference<__covariant Confined : id> : NSObject - -/** - Create a thread-safe reference to the thread-confined object. - - @param threadConfined The thread-confined object to create a thread-safe reference to. - - @note You may continue to use and access the thread-confined object after passing it to this - constructor. - */ -+ (instancetype)referenceWithThreadConfined:(Confined)threadConfined; - -/** - Indicates if the reference can no longer be resolved because an attempt to resolve it has already - occurred. References can only be resolved once. - */ -@property (nonatomic, readonly, getter = isInvalidated) BOOL invalidated; - -#pragma mark - Unavailable Methods - -/** - `-[RLMThreadSafeReference init]` is not available because `RLMThreadSafeReference` cannot be - created directly. `RLMThreadSafeReference` instances must be obtained by calling - `-[RLMRealm resolveThreadSafeReference:]`. - */ -- (instancetype)init __attribute__((unavailable("RLMThreadSafeReference cannot be created directly"))); - -/** - `-[RLMThreadSafeReference new]` is not available because `RLMThreadSafeReference` cannot be - created directly. `RLMThreadSafeReference` instances must be obtained by calling - `-[RLMRealm resolveThreadSafeReference:]`. - */ -+ (instancetype)new __attribute__((unavailable("RLMThreadSafeReference cannot be created directly"))); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMUpdateResult.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMUpdateResult.h deleted file mode 100644 index df0b237e3..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMUpdateResult.h +++ /dev/null @@ -1,45 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectId; -@protocol RLMBSON; - -/// The result of an `updateOne` or `updateMany` operation a `RLMMongoCollection`. -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMUpdateResult : NSObject - -/// The number of documents that matched the filter. -@property (nonatomic, readonly) NSUInteger matchedCount; - -/// The number of documents modified. -@property (nonatomic, readonly) NSUInteger modifiedCount; - -/// The identifier of the inserted document if an upsert took place and the document's primary key is an `ObjectId`. -@property (nonatomic, nullable, readonly) RLMObjectId *objectId -__attribute__((deprecated("Use documentId instead, which support all BSON types", "documentId"))); - -/// The identifier of the inserted document if an upsert took place. -@property (nonatomic, nullable, readonly) id documentId; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMUser.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMUser.h deleted file mode 100644 index 436350f9b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMUser.h +++ /dev/null @@ -1,447 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import -#import -#import - -@class RLMUser, RLMSyncSession, RLMRealm, RLMUserIdentity, RLMAPIKeyAuth, RLMMongoClient, RLMMongoDatabase, RLMMongoCollection, RLMUserProfile; -@protocol RLMBSON; - -/** - The state of the user object. - */ -typedef NS_ENUM(NSUInteger, RLMUserState) { - /// The user is logged out. Call `logInWithCredentials:...` with valid credentials to log the user back in. - RLMUserStateLoggedOut, - /// The user is logged in, and any Realms associated with it are syncing with Atlas App Services. - RLMUserStateLoggedIn, - /// The user has been removed, and cannot be used. - RLMUserStateRemoved -}; - -/// A block type used to report an error related to a specific user. -RLM_SWIFT_SENDABLE -typedef void(^RLMOptionalUserBlock)(RLMUser * _Nullable, NSError * _Nullable); - -/// A block type used to report an error on a network request from the user. -RLM_SWIFT_SENDABLE -typedef void(^RLMUserOptionalErrorBlock)(NSError * _Nullable); - -/// A block which returns a dictionary should there be any custom data set for a user -RLM_SWIFT_SENDABLE -typedef void(^RLMUserCustomDataBlock)(NSDictionary * _Nullable, NSError * _Nullable); - -/// A block type for returning from function calls. -RLM_SWIFT_SENDABLE -typedef void(^RLMCallFunctionCompletionBlock)(id _Nullable, NSError * _Nullable); - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/** - A `RLMUser` instance represents a single Realm App user account. - - A user may have one or more credentials associated with it. These credentials - uniquely identify the user to the authentication provider, and are used to sign - into an Atlas App Services user account. - - Note that user objects are only vended out via SDK APIs, and cannot be directly - initialized. User objects can be accessed from any thread. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // internally thread-safe -@interface RLMUser : NSObject - -/** - The unique Atlas App Services string identifying this user. - Note this is different from an identity: A user may have multiple identities but has a single identifier. See RLMUserIdentity. - */ -@property (nonatomic, readonly) NSString *identifier NS_SWIFT_NAME(id); - -/// Returns an array of identities currently linked to a user. -@property (nonatomic, readonly) NSArray *identities; - -/** - The user's refresh token used to access App Services. - - By default, refresh tokens expire 60 days after they are issued. - You can configure this time for your App's refresh tokens to be - anywhere between 30 minutes and 180 days. - - You can configure the refresh token expiration time for all sessions in - an App from the Admin UI or Admin API. -*/ -@property (nullable, nonatomic, readonly) NSString *refreshToken; - -/** - The user's access token used to access App Services. - - This is required to make HTTP requests to Atlas App Services like the Data API or GraphQL. - It should be treated as sensitive data. - - The Realm SDK automatically manages access tokens and refreshes them - when they expire. - */ -@property (nullable, nonatomic, readonly) NSString *accessToken; - -/** - The current state of the user. - */ -@property (nonatomic, readonly) RLMUserState state; - -/** - Indicates if the user is logged in or not. Returns true if the access token and refresh token are not empty. - */ -@property (nonatomic, readonly) BOOL isLoggedIn; - -#pragma mark - Lifecycle - -/** - Create a partition-based sync configuration instance for the given partition value. - - @param partitionValue The `RLMBSON` value the Realm is partitioned on. - @return A default configuration object with the sync configuration set to use the given partition value. - */ -- (RLMRealmConfiguration *)configurationWithPartitionValue:(nullable id)partitionValue NS_REFINED_FOR_SWIFT; - -/** - Create a partition-based sync configuration instance for the given partition value. - - @param partitionValue The `RLMBSON` value the Realm is partitioned on. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - - @return A configuration object with the sync configuration set to use the given partition value. - */ -- (RLMRealmConfiguration *)configurationWithPartitionValue:(nullable id)partitionValue - clientResetMode:(RLMClientResetMode)clientResetMode NS_REFINED_FOR_SWIFT; - -/** - Create a partition-based sync configuration instance for the given partition value. - - @param partitionValue The `RLMBSON` value the Realm is partitioned on. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param beforeResetBlock A callback which notifies prior to a client reset occurring. See: `RLMClientResetBeforeBlock` - @param afterResetBlock A callback which notifies after a client reset has occurred. See: `RLMClientResetAfterBlock` - - @return A configuration object with the sync configuration set to use the given partition value. - */ -- (RLMRealmConfiguration *)configurationWithPartitionValue:(nullable id)partitionValue - clientResetMode:(RLMClientResetMode)clientResetMode - notifyBeforeReset:(nullable RLMClientResetBeforeBlock)beforeResetBlock - notifyAfterReset:(nullable RLMClientResetAfterBlock)afterResetBlock NS_REFINED_FOR_SWIFT; - -/** - Create a partition-based sync configuration instance for the given partition value. - - @param partitionValue The `RLMBSON` value the Realm is partitioned on. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param manualClientResetHandler An error reporting block that is invoked during a client reset. - @See ``RLMSyncErrorReportingBlock`` and ``RLMClientResetInfo`` - - @return A configuration object with the sync configuration set to use the given partition value. - */ -- (RLMRealmConfiguration *)configurationWithPartitionValue:(nullable id)partitionValue - clientResetMode:(RLMClientResetMode)clientResetMode - manualClientResetHandler:(nullable RLMSyncErrorReportingBlock)manualClientResetHandler NS_REFINED_FOR_SWIFT; - -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @return A ``RLMRealmConfiguration`` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfiguration NS_REFINED_FOR_SWIFT; - -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param beforeResetBlock A callback which notifies prior to a client reset occurring. See: `RLMClientResetBeforeBlock` - @param afterResetBlock A callback which notifies after a client reset has occurred. See: `RLMClientResetAfterBlock` - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithClientResetMode:(RLMClientResetMode)clientResetMode - notifyBeforeReset:(nullable RLMClientResetBeforeBlock)beforeResetBlock - notifyAfterReset:(nullable RLMClientResetAfterBlock)afterResetBlock NS_REFINED_FOR_SWIFT; -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param manualClientResetHandler An error reporting block that is invoked during a client reset. - @See `RLMSyncErrorReportingBlock` and `RLMClientResetInfo` - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithClientResetMode:(RLMClientResetMode)clientResetMode - manualClientResetHandler:(nullable RLMSyncErrorReportingBlock)manualClientResetHandler NS_REFINED_FOR_SWIFT; - -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param initialSubscriptions A block which receives a subscription set instance, that can be - used to add an initial set of subscriptions which will be executed - when the Realm is first opened. - @param rerunOnOpen If true, allows to run the initial set of subscriptions specified, on every app startup. - This can be used to re-run dynamic time ranges and other queries that require a - re-computation of a static variable. - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithInitialSubscriptions:(RLMFlexibleSyncInitialSubscriptionsBlock)initialSubscriptions - rerunOnOpen:(BOOL)rerunOnOpen NS_REFINED_FOR_SWIFT; -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param initialSubscriptions A block which receives a subscription set instance, that can be - used to add an initial set of subscriptions which will be executed - when the Realm is first opened. - @param rerunOnOpen If true, allows to run the initial set of subscriptions specified, on every app startup. - This can be used to re-run dynamic time ranges and other queries that require a - re-computation of a static variable. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param beforeResetBlock A callback which notifies prior to a client reset occurring. See: `RLMClientResetBeforeBlock` - @param afterResetBlock A callback which notifies after a client reset has occurred. See: `RLMClientResetAfterBlock` - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithInitialSubscriptions:(RLMFlexibleSyncInitialSubscriptionsBlock)initialSubscriptions - rerunOnOpen:(BOOL)rerunOnOpen - clientResetMode:(RLMClientResetMode)clientResetMode - notifyBeforeReset:(nullable RLMClientResetBeforeBlock)beforeResetBlock - notifyAfterReset:(nullable RLMClientResetAfterBlock)afterResetBlock NS_REFINED_FOR_SWIFT; - -/** - Create a flexible sync configuration instance, which can be used to open a Realm that - supports flexible sync. - - @note A single server-side Device Sync App can sync data with either partition-based realms or flexible sync based realms. - In order for an application to contain both partition-based and flexible sync realms, more than one - server-side Device Sync App must be used. - - @param initialSubscriptions A block which receives a subscription set instance, that can be - used to add an initial set of subscriptions which will be executed - when the Realm is first opened. - @param rerunOnOpen If true, allows to run the initial set of subscriptions specified, on every app startup. - This can be used to re-run dynamic time ranges and other queries that require a - re-computation of a static variable. - @param clientResetMode Determines file recovery behavior in the event of a client reset. - See: https://docs.mongodb.com/realm/sync/error-handling/client-resets/ - @param manualClientResetHandler An error reporting block that is invoked during a client reset. - @See `RLMSyncErrorReportingBlock` and `RLMClientResetInfo` - - @return A `RLMRealmConfiguration` instance with a flexible sync configuration. - */ -- (RLMRealmConfiguration *)flexibleSyncConfigurationWithInitialSubscriptions:(RLMFlexibleSyncInitialSubscriptionsBlock)initialSubscriptions - rerunOnOpen:(BOOL)rerunOnOpen - clientResetMode:(RLMClientResetMode)clientResetMode - manualClientResetHandler:(nullable RLMSyncErrorReportingBlock)manualClientResetHandler NS_REFINED_FOR_SWIFT; - -#pragma mark - Sessions - -/** - Retrieve a valid session object belonging to this user for a given URL, or `nil` - if no such object exists. - */ -- (nullable RLMSyncSession *)sessionForPartitionValue:(id)partitionValue; - -/// Retrieve all the valid sessions belonging to this user. -@property (nonatomic, readonly) NSArray *allSessions; - -#pragma mark - Custom Data - -/** - The custom data of the user. - This is configured in your Atlas App Services app. - */ -@property (nonatomic, readonly) NSDictionary *customData NS_REFINED_FOR_SWIFT; - -/** - The profile of the user. - */ -@property (nonatomic, readonly) RLMUserProfile *profile; - -/** - Refresh a user's custom data. This will, in effect, refresh the user's auth session. - */ -- (void)refreshCustomDataWithCompletion:(RLMUserCustomDataBlock)completion; - -/** - Links the currently authenticated user with a new identity, where the identity is defined by the credential - specified as a parameter. This will only be successful if this `RLMUser` is the currently authenticated - with the client from which it was created. On success a new user will be returned with the new linked credentials. - - @param credentials The `RLMCredentials` used to link the user to a new identity. - @param completion The completion handler to call when the linking is complete. - If the operation is successful, the result will contain a new - `RLMUser` object representing the currently logged in user. -*/ -- (void)linkUserWithCredentials:(RLMCredentials *)credentials - completion:(RLMOptionalUserBlock)completion NS_REFINED_FOR_SWIFT; - -/** - Removes the user - - This logs out and destroys the session related to this user. The completion block will return an error - if the user is not found or is already removed. - - @param completion A callback invoked on completion -*/ -- (void)removeWithCompletion:(RLMUserOptionalErrorBlock)completion; - -/** - Permanently deletes this user from your Atlas App Services app. - - The users state will be set to `Removed` and the session will be destroyed. - If the delete request fails, the local authentication state will be untouched. - - @param completion A callback invoked on completion -*/ -- (void)deleteWithCompletion:(RLMUserOptionalErrorBlock)completion; - -/** - Logs out the current user - - The users state will be set to `Removed` is they are an anonymous user or `LoggedOut` if they are authenticated by an email / password or third party auth clients - If the logout request fails, this method will still clear local authentication state. - - @param completion A callback invoked on completion -*/ -- (void)logOutWithCompletion:(RLMUserOptionalErrorBlock)completion; - -/** - A client for the user API key authentication provider which - can be used to create and modify user API keys. - - This client should only be used by an authenticated user. -*/ -@property (nonatomic, readonly) RLMAPIKeyAuth *apiKeysAuth; - -/// A client for interacting with a remote MongoDB instance -/// @param serviceName The name of the MongoDB service -- (RLMMongoClient *)mongoClientWithServiceName:(NSString *)serviceName NS_REFINED_FOR_SWIFT; - -/** - Calls the Atlas App Services function with the provided name and arguments. - - @param name The name of the Atlas App Services function to be called. - @param arguments The `BSONArray` of arguments to be provided to the function. - @param completion The completion handler to call when the function call is complete. - This handler is executed on a non-main global `DispatchQueue`. -*/ -- (void)callFunctionNamed:(NSString *)name - arguments:(NSArray> *)arguments - completionBlock:(RLMCallFunctionCompletionBlock)completion NS_REFINED_FOR_SWIFT; - -/// :nodoc: -- (instancetype)init __attribute__((unavailable("RLMUser cannot be created directly"))); -/// :nodoc: -+ (instancetype)new __attribute__((unavailable("RLMUser cannot be created directly"))); - -@end - -#pragma mark - User info classes - -/** - An identity of a user. A user can have multiple identities, usually associated with multiple providers. - Note this is different from a user's unique identifier string. - @seeAlso `RLMUser.identifier` - */ -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMUserIdentity : NSObject - -/** - The associated provider type - */ -@property (nonatomic, readonly) NSString *providerType; - -/** - The string which identifies the RLMUserIdentity - */ -@property (nonatomic, readonly) NSString *identifier; - -/** - Initialize an RLMUserIdentity for the given identifier and provider type. - @param providerType the associated provider type - @param identifier the identifier of the identity - */ -- (instancetype)initUserIdentityWithProviderType:(NSString *)providerType - identifier:(NSString *)identifier; - -@end - -/** - A profile for a given User. - */ -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMUserProfile : NSObject - -/// The full name of the user. -@property (nonatomic, readonly, nullable) NSString *name; -/// The email address of the user. -@property (nonatomic, readonly, nullable) NSString *email; -/// A URL to the user's profile picture. -@property (nonatomic, readonly, nullable) NSString *pictureURL; -/// The first name of the user. -@property (nonatomic, readonly, nullable) NSString *firstName; -/// The last name of the user. -@property (nonatomic, readonly, nullable) NSString *lastName; -/// The gender of the user. -@property (nonatomic, readonly, nullable) NSString *gender; -/// The birthdate of the user. -@property (nonatomic, readonly, nullable) NSString *birthday; -/// The minimum age of the user. -@property (nonatomic, readonly, nullable) NSString *minAge; -/// The maximum age of the user. -@property (nonatomic, readonly, nullable) NSString *maxAge; -/// The BSON dictionary of metadata associated with this user. -@property (nonatomic, readonly) NSDictionary *metadata NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMUserAPIKey.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMUserAPIKey.h deleted file mode 100644 index 2cdd82b2a..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMUserAPIKey.h +++ /dev/null @@ -1,43 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// UserAPIKey model for APIKeys recevied from the server. -RLM_SWIFT_SENDABLE RLM_FINAL // immutable final class -@interface RLMUserAPIKey : NSObject - -/// Indicates if the API key is disabled or not -@property (nonatomic, readonly) BOOL disabled; - -/// The name of the key. -@property (nonatomic, readonly) NSString *name; - -/// The actual key. Will only be included in -/// the response when an API key is first created. -@property (nonatomic, readonly, nullable) NSString *key; - -/// The ObjectId of the API key -@property (nonatomic, readonly) RLMObjectId *objectId NS_REFINED_FOR_SWIFT; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMValue.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMValue.h deleted file mode 100644 index ac1f10ee4..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/RLMValue.h +++ /dev/null @@ -1,97 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import -#import -#import -#import -#import - -#pragma mark RLMValue - -/** - RLMValue is a property type which represents a polymorphic Realm value. This is similar to the usage of - `AnyObject` / `Any` in Swift. -``` - // A property on `MyObject` - @property (nonatomic) id myAnyValue; - - // A property on `AnotherObject` - @property (nonatomic) id myAnyValue; - - MyObject *myObject = [MyObject createInRealm:realm withValue:@[]]; - myObject.myAnyValue = @1234; // underlying type is NSNumber. - myObject.myAnyValue = @"hello"; // underlying type is NSString. - AnotherObject *anotherObject = [AnotherObject createInRealm:realm withValue:@[]]; - myObject.myAnyValue = anotherObject; // underlying type is RLMObject. -``` - The following types conform to RLMValue: - - `NSData` - `NSDate` - `NSNull` - `NSNumber` - `NSUUID` - `NSString` - `RLMObject - `RLMObjectId` - `RLMDecimal128` - */ -@protocol RLMValue - -/// Describes the type of property stored. -@property (readonly) RLMPropertyType rlm_valueType; - -@end - -/// :nodoc: -@interface NSNull (RLMValue) -@end - -/// :nodoc: -@interface NSNumber (RLMValue) -@end - -/// :nodoc: -@interface NSString (RLMValue) -@end - -/// :nodoc: -@interface NSData (RLMValue) -@end - -/// :nodoc: -@interface NSDate (RLMValue) -@end - -/// :nodoc: -@interface NSUUID (RLMValue) -@end - -/// :nodoc: -@interface RLMDecimal128 (RLMValue) -@end - -/// :nodoc: -@interface RLMObjectBase (RLMValue) -@end - -/// :nodoc: -@interface RLMObjectId (RLMValue) -@end diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/Realm.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/Realm.h deleted file mode 100644 index 245596393..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Headers/Realm.h +++ /dev/null @@ -1,63 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import - -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Info.plist b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Info.plist deleted file mode 100644 index 7488f58f1..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Info.plist and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/LICENSE b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/LICENSE deleted file mode 100644 index 66a27ec5f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/LICENSE +++ /dev/null @@ -1,177 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Modules/module.modulemap b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Modules/module.modulemap deleted file mode 100644 index 519ddc20b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Modules/module.modulemap +++ /dev/null @@ -1,88 +0,0 @@ -framework module Realm { - export Foundation - - umbrella header "Realm.h" - - header "RLMArray.h" - header "RLMAsymmetricObject.h" - header "RLMDecimal128.h" - header "RLMDictionary.h" - header "RLMEmbeddedObject.h" - header "RLMLogger.h" - header "RLMMigration.h" - header "RLMObject.h" - header "RLMObjectId.h" - header "RLMObjectSchema.h" - header "RLMProperty.h" - header "RLMProviderClient.h" - header "RLMRealm+Sync.h" - header "RLMRealm.h" - header "RLMRealmConfiguration.h" - header "RLMResults.h" - header "RLMSchema.h" - header "RLMSectionedResults.h" - header "RLMSet.h" - header "RLMValue.h" - - header "RLMApp.h" - header "RLMCredentials.h" - header "RLMNetworkTransport.h" - header "RLMPushClient.h" - header "RLMRealm+Sync.h" - header "RLMSyncConfiguration.h" - header "RLMSyncManager.h" - header "RLMSyncSession.h" - header "RLMUser.h" - header "RLMUserAPIKey.h" - header "RLMAPIKeyAuth.h" - header "RLMEmailPasswordAuth.h" - header "NSError+RLMSync.h" - header "RLMBSON.h" - header "RLMMongoClient.h" - header "RLMMongoDatabase.h" - header "RLMMongoCollection.h" - header "RLMUpdateResult.h" - header "RLMFindOptions.h" - header "RLMFindOneAndModifyOptions.h" - header "RLMSyncSubscription.h" - - explicit module Private { - header "RLMAccessor.h" - header "RLMApp_Private.h" - header "RLMArray_Private.h" - header "RLMAsyncTask_Private.h" - header "RLMCollection_Private.h" - header "RLMDictionary_Private.h" - header "RLMLogger_Private.h" - header "RLMEvent.h" - header "RLMMongoCollection_Private.h" - header "RLMObjectBase_Dynamic.h" - header "RLMObjectBase_Private.h" - header "RLMObjectSchema_Private.h" - header "RLMObjectStore.h" - header "RLMObject_Private.h" - header "RLMProperty_Private.h" - header "RLMRealmConfiguration_Private.h" - header "RLMRealm_Private.h" - header "RLMResults_Private.h" - header "RLMScheduler.h" - header "RLMSchema_Private.h" - header "RLMSectionedResults.h" - header "RLMSet_Private.h" - header "RLMSwiftCollectionBase.h" - header "RLMSwiftProperty.h" - header "RLMSwiftValueStorage.h" - header "RLMSyncConfiguration_Private.h" - header "RLMSyncSubscription_Private.h" - header "RLMUser_Private.h" - } - - explicit module Dynamic { - header "RLMRealm_Dynamic.h" - header "RLMObjectBase_Dynamic.h" - } - - explicit module Swift { - header "RLMSwiftObject.h" - } -} diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMAccessor.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMAccessor.h deleted file mode 100644 index db915ca7c..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMAccessor.h +++ /dev/null @@ -1,53 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectSchema, RLMProperty, RLMObjectBase; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -// -// Accessors Class Creation/Caching -// - -// get accessor classes for an object class - generates classes if not cached -Class RLMManagedAccessorClassForObjectClass(Class objectClass, RLMObjectSchema *schema, const char *name); -Class RLMUnmanagedAccessorClassForObjectClass(Class objectClass, RLMObjectSchema *schema); - -// -// Dynamic getters/setters -// -FOUNDATION_EXTERN void RLMDynamicValidatedSet(RLMObjectBase *obj, NSString *propName, id __nullable val); -FOUNDATION_EXTERN id __nullable RLMDynamicGet(RLMObjectBase *obj, RLMProperty *prop); -FOUNDATION_EXTERN id __nullable RLMDynamicGetByName(RLMObjectBase *obj, NSString *propName); - -// by property/column -void RLMDynamicSet(RLMObjectBase *obj, RLMProperty *prop, id val); - -// -// Class modification -// - -// Replace className method for the given class -void RLMReplaceClassNameMethod(Class accessorClass, NSString *className); - -// Replace sharedSchema method for the given class -void RLMReplaceSharedSchemaMethod(Class accessorClass, RLMObjectSchema * __nullable schema); - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMApp_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMApp_Private.h deleted file mode 100644 index 5da5c3c7a..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMApp_Private.h +++ /dev/null @@ -1,50 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// Observer block for app notifications. -typedef void(^RLMAppNotificationBlock)(RLMApp *); - -/// Token that identifies an observer. Unsubscribes when deconstructed to -/// avoid dangling observers, therefore this must be retained to hold -/// onto a subscription. -@interface RLMAppSubscriptionToken : NSObject -- (void)unsubscribe; -@end - -@interface RLMApp () -/// Returns all currently cached Apps -+ (NSArray *)allApps; -/// Subscribe to notifications for this RLMApp. -- (RLMAppSubscriptionToken *)subscribe:(RLMAppNotificationBlock)block; - -+ (instancetype)appWithConfiguration:(RLMAppConfiguration *)configuration; - -+ (void)resetAppCache; -@end - -@interface RLMAppConfiguration () -@property (nonatomic) NSString *appId; -@property (nonatomic) BOOL encryptMetadata; -@property (nonatomic) NSURL *rootDirectory; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMArray_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMArray_Private.h deleted file mode 100644 index 1a37f010e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMArray_Private.h +++ /dev/null @@ -1,44 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -@class RLMObjectBase, RLMProperty; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMArray () -- (instancetype)initWithObjectClassName:(NSString *)objectClassName; -- (instancetype)initWithObjectType:(RLMPropertyType)type optional:(BOOL)optional; -- (NSString *)descriptionWithMaxDepth:(NSUInteger)depth; -- (void)setParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -- (void)replaceAllObjectsWithObjects:(NSArray *)objects; -// YES if the property is declared with old property syntax. -@property (nonatomic, readonly) BOOL isLegacyProperty; -// The name of the property which this collection represents -@property (nonatomic, readonly) NSString *propertyKey; -@end - -@interface RLMManagedArray : RLMArray -- (instancetype)initWithParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -@end - -void RLMArrayValidateMatchingObjectType(RLMArray *array, id value); - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMAsyncTask_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMAsyncTask_Private.h deleted file mode 100644 index 3cce89441..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMAsyncTask_Private.h +++ /dev/null @@ -1,71 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import "RLMRealm_Private.h" - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMAsyncOpenTask () -@property (nonatomic, nullable) RLMRealm *localRealm; - -- (instancetype)initWithConfiguration:(RLMRealmConfiguration *)configuration - confinedTo:(RLMScheduler *)confinement - download:(bool)waitForDownloadCompletion - completion:(RLMAsyncOpenRealmCallback)completion -__attribute__((objc_direct)); - -- (instancetype)initWithConfiguration:(RLMRealmConfiguration *)configuration - confinedTo:(RLMScheduler *)confinement - download:(bool)waitForDownloadCompletion; - -- (void)waitWithCompletion:(void (^)(NSError *_Nullable))completion; -- (void)waitForOpen:(RLMAsyncOpenRealmCallback)completion __attribute__((objc_direct)); -@end - -// A cancellable task for waiting for downloads on an already-open Realm. -RLM_SWIFT_SENDABLE -@interface RLMAsyncDownloadTask : NSObject -- (instancetype)initWithRealm:(RLMRealm *)realm; -- (void)cancel; -- (void)waitWithCompletion:(void (^)(NSError *_Nullable))completion; -@end - -// A cancellable task for beginning an async write -RLM_SWIFT_SENDABLE -@interface RLMAsyncWriteTask : NSObject -// Must only be called from within the Actor -- (instancetype)initWithRealm:(RLMRealm *)realm; -- (void)setTransactionId:(RLMAsyncTransactionId)transactionID; -- (void)complete:(bool)cancel; - -// Can be called from any thread -- (void)wait:(void (^)(void))completion; -@end - -typedef void (^RLMAsyncRefreshCompletion)(bool); -// A cancellable task for refreshing a Realm -RLM_SWIFT_SENDABLE -@interface RLMAsyncRefreshTask : NSObject -- (void)complete:(bool)didRefresh; -- (void)wait:(RLMAsyncRefreshCompletion)completion; -+ (RLMAsyncRefreshTask *)completedRefresh; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMBSON_Private.hpp b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMBSON_Private.hpp deleted file mode 100644 index c5cc1a410..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMBSON_Private.hpp +++ /dev/null @@ -1,32 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -namespace realm::bson { -class Bson; -template class IndexedMap; -using BsonDocument = IndexedMap; -} - -realm::bson::Bson RLMConvertRLMBSONToBson(id b); -realm::bson::BsonDocument RLMConvertRLMBSONArrayToBsonDocument(NSArray> *array); -id RLMConvertBsonToRLMBSON(const realm::bson::Bson& b); -id RLMConvertBsonDocumentToRLMBSON(std::optional b); -NSArray> *RLMConvertBsonDocumentToRLMBSONArray(std::optional b); diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMCollection_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMCollection_Private.h deleted file mode 100644 index 7d31bd3f0..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMCollection_Private.h +++ /dev/null @@ -1,42 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@protocol RLMCollectionPrivate; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -NSUInteger RLMUnmanagedFastEnumerate(id collection, NSFastEnumerationState *); -void RLMCollectionSetValueForKey(id collection, NSString *key, id _Nullable value); -FOUNDATION_EXTERN NSString *RLMDescriptionWithMaxDepth(NSString *name, id collection, NSUInteger depth); -FOUNDATION_EXTERN void RLMAssignToCollection(id collection, id value); -FOUNDATION_EXTERN void RLMSetSwiftBridgeCallback(id _Nullable (*_Nonnull)(id)); - -FOUNDATION_EXTERN -RLMNotificationToken *RLMAddNotificationBlock(id collection, id block, - NSArray *_Nullable keyPaths, - dispatch_queue_t _Nullable queue); - -typedef RLM_CLOSED_ENUM(int32_t, RLMCollectionType) { - RLMCollectionTypeArray = 0, - RLMCollectionTypeSet = 1, - RLMCollectionTypeDictionary = 2 -}; - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMDictionary_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMDictionary_Private.h deleted file mode 100644 index 37ff740c7..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMDictionary_Private.h +++ /dev/null @@ -1,46 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectBase, RLMProperty; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMDictionary () -- (instancetype)initWithObjectClassName:(NSString *)objectClassName keyType:(RLMPropertyType)keyType; -- (instancetype)initWithObjectType:(RLMPropertyType)type optional:(BOOL)optional keyType:(RLMPropertyType)keyType; -- (NSString *)descriptionWithMaxDepth:(NSUInteger)depth; -- (void)setParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -// YES if the property is declared with old property syntax. -@property (nonatomic, readonly) BOOL isLegacyProperty; -// The name of the property which this collection represents -@property (nonatomic, readonly) NSString *propertyKey; -@end - -@interface RLMManagedDictionary : RLMDictionary -- (instancetype)initWithParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -@end - -FOUNDATION_EXTERN NSString *RLMDictionaryDescriptionWithMaxDepth(NSString *name, - RLMDictionary *dictionary, - NSUInteger depth); -id RLMDictionaryKey(RLMDictionary *dictionary, id key) RLM_HIDDEN; -id RLMDictionaryValue(RLMDictionary *dictionary, id value) RLM_HIDDEN; - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMEvent.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMEvent.h deleted file mode 100644 index 9a6acb1a6..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMEvent.h +++ /dev/null @@ -1,64 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2022 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#ifdef __cplusplus -#include - -namespace realm { -struct AuditConfig; -} -#endif - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMRealm, RLMUser, RLMRealmConfiguration; -typedef RLM_CLOSED_ENUM(NSUInteger, RLMSyncLogLevel); - -struct RLMEventContext; -typedef void (^RLMEventCompletion)(NSError *_Nullable); - -FOUNDATION_EXTERN struct RLMEventContext *_Nullable RLMEventGetContext(RLMRealm *realm); -FOUNDATION_EXTERN uint64_t RLMEventBeginScope(struct RLMEventContext *context, NSString *activity); -FOUNDATION_EXTERN void RLMEventCommitScope(struct RLMEventContext *context, uint64_t scope_id, - RLMEventCompletion _Nullable completion); -FOUNDATION_EXTERN void RLMEventCancelScope(struct RLMEventContext *context, uint64_t scope_id); -FOUNDATION_EXTERN bool RLMEventIsActive(struct RLMEventContext *context, uint64_t scope_id); -FOUNDATION_EXTERN void RLMEventRecordEvent(struct RLMEventContext *context, NSString *activity, - NSString *_Nullable event, NSString *_Nullable data, - RLMEventCompletion _Nullable completion); -FOUNDATION_EXTERN void RLMEventUpdateMetadata(struct RLMEventContext *context, - NSDictionary *newMetadata); - -@interface RLMEventConfiguration : NSObject -@property (nonatomic) NSString *partitionPrefix; -@property (nonatomic, nullable) RLMUser *syncUser; -@property (nonatomic, nullable) NSDictionary *metadata; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" -@property (nonatomic, nullable) void (^logger)(RLMSyncLogLevel, NSString *); -#pragma clang diagnostic pop -@property (nonatomic, nullable) RLM_SWIFT_SENDABLE void (^errorHandler)(NSError *); - -#ifdef __cplusplus -- (std::shared_ptr)auditConfigWithRealmConfiguration:(RLMRealmConfiguration *)realmConfig; -#endif -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMLogger_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMLogger_Private.h deleted file mode 100644 index 08f8c591e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMLogger_Private.h +++ /dev/null @@ -1,36 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMLogger() - -/** - Log a message to the supplied level. - - @param logLevel The log level for the message. - @param message The message to log. - */ -- (void)logWithLevel:(RLMLogLevel)logLevel message:(NSString *)message, ... NS_SWIFT_UNAVAILABLE(""); -- (void)logLevel:(RLMLogLevel)logLevel message:(NSString *)message; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMMigration_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMMigration_Private.h deleted file mode 100644 index 393f41184..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMMigration_Private.h +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import -#import - -namespace realm { - class Schema; -} - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMMigration () - -@property (nonatomic, strong) RLMRealm *oldRealm; -@property (nonatomic, strong) RLMRealm *realm; - -- (instancetype)initWithRealm:(RLMRealm *)realm oldRealm:(RLMRealm *)oldRealm schema:(realm::Schema &)schema; - -- (void)execute:(RLMMigrationBlock)block objectClass:(_Nullable Class)cls; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMMongoCollection_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMMongoCollection_Private.h deleted file mode 100644 index 77bbf9752..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMMongoCollection_Private.h +++ /dev/null @@ -1,37 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@class RLMUser; - -@interface RLMMongoCollection () -- (instancetype)initWithUser:(RLMUser *)user - serviceName:(NSString *)serviceName - databaseName:(NSString *)databaseName - collectionName:(NSString *)collectionName; - -- (RLMChangeStream *)watchWithMatchFilter:(nullable id)matchFilter - idFilter:(nullable id)idFilter - delegate:(id)delegate - scheduler:(void (^)(dispatch_block_t))scheduler; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObjectBase_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObjectBase_Private.h deleted file mode 100644 index af547b17e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObjectBase_Private.h +++ /dev/null @@ -1,34 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2017 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMArray; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -// RLMObjectBase private -@interface RLMObjectBase () -@property (nonatomic, nullable) NSMutableArray *lastAccessedNames; - -+ (void)initializeLinkedObjectSchemas; -+ (bool)isEmbedded; -+ (bool)isAsymmetric; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObjectSchema_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObjectSchema_Private.h deleted file mode 100644 index 08855a82b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObjectSchema_Private.h +++ /dev/null @@ -1,75 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -// RLMObjectSchema private -@interface RLMObjectSchema () { -@public - bool _isSwiftClass; -} - -/// The object type name reported to the object store and core. -@property (nonatomic, readonly) NSString *objectName; - -// writable redeclaration -@property (nonatomic, readwrite, copy) NSArray *properties; -@property (nonatomic, readwrite, assign) bool isSwiftClass; -@property (nonatomic, readwrite, assign) BOOL isEmbedded; -@property (nonatomic, readwrite, assign) BOOL isAsymmetric; - -// class used for this object schema -@property (nonatomic, readwrite, assign) Class objectClass; -@property (nonatomic, readwrite, assign) Class accessorClass; -@property (nonatomic, readwrite, assign) Class unmanagedClass; - -@property (nonatomic, readwrite, assign) bool hasCustomEventSerialization; - -@property (nonatomic, readwrite, nullable) RLMProperty *primaryKeyProperty; - -@property (nonatomic, copy) NSArray *computedProperties; -@property (nonatomic, readonly, nullable) NSArray *swiftGenericProperties; - -// returns a cached or new schema for a given object class -+ (instancetype)schemaForObjectClass:(Class)objectClass; -@end - -@interface RLMObjectSchema (Dynamic) -/** - This method is useful only in specialized circumstances, for example, when accessing objects - in a Realm produced externally. If you are simply building an app on Realm, it is not recommended - to use this method as an [RLMObjectSchema](RLMObjectSchema) is generated automatically for every [RLMObject](RLMObject) subclass. - - Initialize an RLMObjectSchema with classname, objectClass, and an array of properties - - @warning This method is useful only in specialized circumstances. - - @param objectClassName The name of the class used to refer to objects of this type. - @param objectClass The Objective-C class used when creating instances of this type. - @param properties An array of RLMProperty instances describing the managed properties for this type. - - @return An initialized instance of RLMObjectSchema. - */ -- (instancetype)initWithClassName:(NSString *)objectClassName objectClass:(Class)objectClass properties:(NSArray *)properties; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObjectStore.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObjectStore.h deleted file mode 100644 index 6045f1e8e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObjectStore.h +++ /dev/null @@ -1,98 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#ifdef __cplusplus -extern "C" { -#endif - -@class RLMRealm, RLMSchema, RLMObjectBase, RLMResults, RLMProperty; - -typedef NS_ENUM(NSUInteger, RLMUpdatePolicy) { - RLMUpdatePolicyError = 1, - RLMUpdatePolicyUpdateChanged = 3, - RLMUpdatePolicyUpdateAll = 2, -}; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -void RLMVerifyHasPrimaryKey(Class cls); - -void RLMVerifyInWriteTransaction(RLMRealm *const realm); - -// -// Adding, Removing, Getting Objects -// - -// add an object to the given realm -void RLMAddObjectToRealm(RLMObjectBase *object, RLMRealm *realm, RLMUpdatePolicy); - -// delete an object from its realm -void RLMDeleteObjectFromRealm(RLMObjectBase *object, RLMRealm *realm); - -// deletes all objects from a realm -void RLMDeleteAllObjectsFromRealm(RLMRealm *realm); - -// get objects of a given class -RLMResults *RLMGetObjects(RLMRealm *realm, NSString *objectClassName, NSPredicate * _Nullable predicate) -NS_RETURNS_RETAINED; - -// get an object with the given primary key -id _Nullable RLMGetObject(RLMRealm *realm, NSString *objectClassName, id _Nullable key) NS_RETURNS_RETAINED; - -// create object from array or dictionary -RLMObjectBase *RLMCreateObjectInRealmWithValue(RLMRealm *realm, NSString *className, - id _Nullable value, RLMUpdatePolicy updatePolicy) -NS_RETURNS_RETAINED; - -// creates an asymmetric object and doesn't return -void RLMCreateAsymmetricObjectInRealm(RLMRealm *realm, NSString *className, id value); - -// -// Accessor Creation -// - - -// Perform the per-property accessor initialization for a managed RealmSwiftObject -// promotingExisting should be true if the object was previously used as an -// unmanaged object, and false if it is a newly created object. -void RLMInitializeSwiftAccessor(RLMObjectBase *object, bool promotingExisting); - -#ifdef __cplusplus -} - -namespace realm { - class Obj; - class Table; - struct ColKey; - struct ObjLink; -} -class RLMClassInfo; - -// get an object with a given table & object key -RLMObjectBase *RLMObjectFromObjLink(RLMRealm *realm, - realm::ObjLink&& objLink, - bool parentIsSwiftObject) NS_RETURNS_RETAINED; - -// Create accessors -RLMObjectBase *RLMCreateObjectAccessor(RLMClassInfo& info, int64_t key) NS_RETURNS_RETAINED; -RLMObjectBase *RLMCreateObjectAccessor(RLMClassInfo& info, const realm::Obj& obj) NS_RETURNS_RETAINED; -#endif - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObject_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObject_Private.h deleted file mode 100644 index 8ccdbf576..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMObject_Private.h +++ /dev/null @@ -1,110 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMProperty, RLMArray, RLMSchema; -typedef NS_ENUM(int32_t, RLMPropertyType); - -FOUNDATION_EXTERN void RLMInitializeWithValue(RLMObjectBase *, id, RLMSchema *); - -typedef void (^RLMObjectNotificationCallback)(RLMObjectBase *_Nullable object, - NSArray *_Nullable propertyNames, - NSArray *_Nullable oldValues, - NSArray *_Nullable newValues, - NSError *_Nullable error); - -// RLMObject accessor and read/write realm -@interface RLMObjectBase () { -@public - RLMRealm *_realm; - __unsafe_unretained RLMObjectSchema *_objectSchema; -} - -// shared schema for this class -+ (nullable RLMObjectSchema *)sharedSchema; - -+ (nullable NSArray *)_getProperties; -+ (bool)_realmIgnoreClass; - -// This enables to override the propertiesMapping in Swift, it is not to be used in Objective-C API. -+ (NSDictionary *)propertiesMapping; -@end - -@interface RLMDynamicObject : RLMObject - -@end - -// Calls valueForKey: and re-raises NSUndefinedKeyExceptions -FOUNDATION_EXTERN id _Nullable RLMValidatedValueForProperty(id object, NSString *key, NSString *className); - -// Compare two RLObjectBases -FOUNDATION_EXTERN BOOL RLMObjectBaseAreEqual(RLMObjectBase * _Nullable o1, RLMObjectBase * _Nullable o2); - -FOUNDATION_EXTERN RLMNotificationToken *RLMObjectBaseAddNotificationBlock(RLMObjectBase *obj, - NSArray *_Nullable keyPaths, - dispatch_queue_t _Nullable queue, - RLMObjectNotificationCallback block); - -RLMNotificationToken *RLMObjectAddNotificationBlock(RLMObjectBase *obj, - RLMObjectChangeBlock block, - NSArray *_Nullable keyPaths, - dispatch_queue_t _Nullable queue); - -// Returns whether the class is a descendent of RLMObjectBase -FOUNDATION_EXTERN BOOL RLMIsObjectOrSubclass(Class klass); - -// Returns whether the class is an indirect descendant of RLMObjectBase -FOUNDATION_EXTERN BOOL RLMIsObjectSubclass(Class klass); - -FOUNDATION_EXTERN const NSUInteger RLMDescriptionMaxDepth; - -FOUNDATION_EXTERN id RLMObjectFreeze(RLMObjectBase *obj) NS_RETURNS_RETAINED; - -FOUNDATION_EXTERN id RLMObjectThaw(RLMObjectBase *obj); - -// Gets an object identifier suitable for use with Combine. This value may -// change when an unmanaged object is added to the Realm. -FOUNDATION_EXTERN uint64_t RLMObjectBaseGetCombineId(RLMObjectBase *); - -// An accessor object which is used to interact with Swift properties from obj-c -@interface RLMManagedPropertyAccessor : NSObject -// Perform any initialization required for KVO on a *unmanaged* object -+ (void)observe:(RLMProperty *)property on:(RLMObjectBase *)parent; -// Initialize the given property on a *managed* object which previous was unmanaged -+ (void)promote:(RLMProperty *)property on:(RLMObjectBase *)parent; -// Initialize the given property on a newly created *managed* object -+ (void)initialize:(RLMProperty *)property on:(RLMObjectBase *)parent; -// Read the value of the property, on either kind of object -+ (id)get:(RLMProperty *)property on:(RLMObjectBase *)parent; -// Set the property to the given value, on either kind of object -+ (void)set:(RLMProperty *)property on:(RLMObjectBase *)parent to:(id)value; -@end - -@interface RLMObjectNotificationToken : RLMNotificationToken -- (void)observe:(RLMObjectBase *)obj - keyPaths:(nullable NSArray *)keyPaths - block:(RLMObjectNotificationCallback)block; -- (void)registrationComplete:(void (^)(void))completion; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMProperty_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMProperty_Private.h deleted file mode 100644 index 6a87ced63..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMProperty_Private.h +++ /dev/null @@ -1,139 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -@class RLMObjectBase; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -BOOL RLMPropertyTypeIsComputed(RLMPropertyType propertyType); -FOUNDATION_EXTERN void RLMValidateSwiftPropertyName(NSString *name); - -// Translate an rlmtype to a string representation -static inline NSString *RLMTypeToString(RLMPropertyType type) { - switch (type) { - case RLMPropertyTypeString: - return @"string"; - case RLMPropertyTypeInt: - return @"int"; - case RLMPropertyTypeBool: - return @"bool"; - case RLMPropertyTypeDate: - return @"date"; - case RLMPropertyTypeData: - return @"data"; - case RLMPropertyTypeDouble: - return @"double"; - case RLMPropertyTypeFloat: - return @"float"; - case RLMPropertyTypeAny: - return @"mixed"; - case RLMPropertyTypeObject: - return @"object"; - case RLMPropertyTypeLinkingObjects: - return @"linking objects"; - case RLMPropertyTypeDecimal128: - return @"decimal128"; - case RLMPropertyTypeObjectId: - return @"object id"; - case RLMPropertyTypeUUID: - return @"uuid"; - } - return @"Unknown"; -} - -// private property interface -@interface RLMProperty () { -@public - RLMPropertyType _type; -} - -- (instancetype)initWithName:(NSString *)name - indexed:(BOOL)indexed - linkPropertyDescriptor:(nullable RLMPropertyDescriptor *)linkPropertyDescriptor - property:(objc_property_t)property; - -- (instancetype)initSwiftPropertyWithName:(NSString *)name - indexed:(BOOL)indexed - linkPropertyDescriptor:(nullable RLMPropertyDescriptor *)linkPropertyDescriptor - property:(objc_property_t)property - instance:(RLMObjectBase *)objectInstance; - -- (void)updateAccessors; - -// private setters -@property (nonatomic, readwrite) NSString *name; -@property (nonatomic, readwrite, assign) RLMPropertyType type; -@property (nonatomic, readwrite) BOOL indexed; -@property (nonatomic, readwrite) BOOL optional; -@property (nonatomic, readwrite) BOOL array; -@property (nonatomic, readwrite) BOOL set; -@property (nonatomic, readwrite) BOOL dictionary; -@property (nonatomic, copy, nullable) NSString *objectClassName; -@property (nonatomic, copy, nullable) NSString *linkOriginPropertyName; - -// private properties -@property (nonatomic, readwrite, nullable) NSString *columnName; -@property (nonatomic, assign) NSUInteger index; -@property (nonatomic, assign) BOOL isPrimary; -@property (nonatomic, assign) BOOL isLegacy; -@property (nonatomic, assign) ptrdiff_t swiftIvar; -@property (nonatomic, assign, nullable) Class swiftAccessor; -@property (nonatomic, readwrite, assign) RLMPropertyType dictionaryKeyType; -@property (nonatomic, readwrite) BOOL customMappingIsOptional; - -// getter and setter names -@property (nonatomic, copy) NSString *getterName; -@property (nonatomic, copy) NSString *setterName; -@property (nonatomic, nullable) SEL getterSel; -@property (nonatomic, nullable) SEL setterSel; - -- (RLMProperty *)copyWithNewName:(NSString *)name; -- (NSString *)typeName; - -@end - -@interface RLMProperty (Dynamic) -/** - This method is useful only in specialized circumstances, for example, in conjunction with - +[RLMObjectSchema initWithClassName:objectClass:properties:]. If you are simply building an - app on Realm, it is not recommended to use this method. - - Initialize an RLMProperty - - @warning This method is useful only in specialized circumstances. - - @param name The property name. - @param type The property type. - @param objectClassName The object type used for Object and Array types. - @param linkOriginPropertyName The property name of the origin of a link. Used for linking objects properties. - - @return An initialized instance of RLMProperty. - */ -- (instancetype)initWithName:(NSString *)name - type:(RLMPropertyType)type - objectClassName:(nullable NSString *)objectClassName - linkOriginPropertyName:(nullable NSString *)linkOriginPropertyName - indexed:(BOOL)indexed - optional:(BOOL)optional; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMPushClient_Private.hpp b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMPushClient_Private.hpp deleted file mode 100644 index 44304c9c3..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMPushClient_Private.hpp +++ /dev/null @@ -1,28 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import "RLMPushClient.h" - -namespace realm::app { -class PushClient; -} - -RLM_DIRECT_MEMBERS -@interface RLMPushClient () -- (instancetype)initWithPushClient:(realm::app::PushClient&&)pushClient; -@end diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMRealmConfiguration_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMRealmConfiguration_Private.h deleted file mode 100644 index 12b09676d..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMRealmConfiguration_Private.h +++ /dev/null @@ -1,52 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2015 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMSchema, RLMEventConfiguration; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMRealmConfiguration () - -@property (nonatomic, readwrite) bool cache; -@property (nonatomic, readwrite) bool dynamic; -@property (nonatomic, readwrite) bool disableFormatUpgrade; -@property (nonatomic, copy, nullable) RLMSchema *customSchema; -@property (nonatomic, copy) NSString *pathOnDisk; -@property (nonatomic, retain, nullable) RLMEventConfiguration *eventConfiguration; -@property (nonatomic, nullable) Class migrationObjectClass; -@property (nonatomic) bool disableAutomaticChangeNotifications; - -// Flexible Sync -@property (nonatomic, readwrite, nullable) RLMFlexibleSyncInitialSubscriptionsBlock initialSubscriptions; -@property (nonatomic, readwrite) BOOL rerunOnOpen; - -// Get the default configuration without copying it -+ (RLMRealmConfiguration *)rawDefaultConfiguration; - -+ (void)resetRealmConfigurationState; - -- (void)setCustomSchemaWithoutCopying:(nullable RLMSchema *)schema; -@end - -// Get a path in the platform-appropriate documents directory with the given filename -FOUNDATION_EXTERN NSString *RLMRealmPathForFile(NSString *fileName); -FOUNDATION_EXTERN NSString *RLMRealmPathForFileAndBundleIdentifier(NSString *fileName, NSString *mainBundleIdentifier); - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMRealm_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMRealm_Private.h deleted file mode 100644 index 95841491f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMRealm_Private.h +++ /dev/null @@ -1,94 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMFastEnumerator, RLMScheduler, RLMAsyncRefreshTask, RLMAsyncWriteTask; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -// Disable syncing files to disk. Cannot be re-enabled. Use only for tests. -FOUNDATION_EXTERN void RLMDisableSyncToDisk(void); -// Set whether the skip backup attribute should be set on temporary files. -FOUNDATION_EXTERN void RLMSetSkipBackupAttribute(bool value); - -FOUNDATION_EXTERN NSData * _Nullable RLMRealmValidatedEncryptionKey(NSData *key); - -// Set the queue used for async open. For testing purposes only. -FOUNDATION_EXTERN void RLMSetAsyncOpenQueue(dispatch_queue_t queue); - -// Translate an in-flight exception resulting from an operation on a SharedGroup to -// an NSError or NSException (if error is nil) -void RLMRealmTranslateException(NSError **error); - -// Block until the Realm at the given path is closed. -FOUNDATION_EXTERN void RLMWaitForRealmToClose(NSString *path); -BOOL RLMIsRealmCachedAtPath(NSString *path); - -// Register a block to be called from the next before_notify() invocation -FOUNDATION_EXTERN void RLMAddBeforeNotifyBlock(RLMRealm *realm, dispatch_block_t block); - -// Test hook to run the async notifiers for a Realm which has the background thread disabled -FOUNDATION_EXTERN void RLMRunAsyncNotifiers(NSString *path); - -// Get the cached Realm for the given configuration and scheduler, if any -FOUNDATION_EXTERN RLMRealm *_Nullable RLMGetCachedRealm(RLMRealmConfiguration *, RLMScheduler *) NS_RETURNS_RETAINED; -// Get a cached Realm for the given configuration and any scheduler. The returned -// Realm is not confined to the current thread, so very few operations are safe -// to perform on it -FOUNDATION_EXTERN RLMRealm *_Nullable RLMGetAnyCachedRealm(RLMRealmConfiguration *) NS_RETURNS_RETAINED; - -// Scheduler an async refresh for the given Realm -FOUNDATION_EXTERN RLMAsyncRefreshTask *_Nullable RLMRealmRefreshAsync(RLMRealm *rlmRealm) NS_RETURNS_RETAINED; - -// RLMRealm private members -@interface RLMRealm () -@property (nonatomic, readonly) BOOL dynamic; -@property (nonatomic, readwrite) RLMSchema *schema; -@property (nonatomic, readonly, nullable) id actor; -@property (nonatomic, readonly) bool isFlexibleSync; - -+ (void)resetRealmState; - -- (void)registerEnumerator:(RLMFastEnumerator *)enumerator; -- (void)unregisterEnumerator:(RLMFastEnumerator *)enumerator; -- (void)detachAllEnumerators; - -- (void)sendNotifications:(RLMNotification)notification; -- (void)verifyThread; -- (void)verifyNotificationsAreSupported:(bool)isCollection; - -- (RLMRealm *)frozenCopy NS_RETURNS_RETAINED; - -+ (nullable instancetype)realmWithConfiguration:(RLMRealmConfiguration *)configuration - confinedTo:(RLMScheduler *)options - error:(NSError **)error; - -- (RLMAsyncWriteTask *)beginAsyncWrite NS_RETURNS_RETAINED; -- (void)commitAsyncWriteWithGrouping:(bool)allowGrouping - completion:(void(^)(NSError *_Nullable))completion; -@end - -@interface RLMPinnedRealm : NSObject -@property (nonatomic, readonly) RLMRealmConfiguration *configuration; - -- (instancetype)initWithRealm:(RLMRealm *)realm; -- (void)unpin; -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMResults_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMResults_Private.h deleted file mode 100644 index c7e29bebb..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMResults_Private.h +++ /dev/null @@ -1,33 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectSchema; - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@interface RLMResults () -@property (nonatomic, readonly, getter=isAttached) BOOL attached; - -+ (instancetype)emptyDetachedResults; -- (RLMResults *)snapshot; - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMScheduler.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMScheduler.h deleted file mode 100644 index 3c1b9874b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMScheduler.h +++ /dev/null @@ -1,63 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2023 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#ifdef __cplusplus -#include -namespace realm::util { -class Scheduler; -} -#endif - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -// A serial work queue of some sort which represents a thread-confinement context -// of some sort which blocks can be invoked inside. Realms are confined to a -// scheduler, which can be a thread (actually a run loop), a dispatch queue, or -// an actor. The scheduler ensures that the Realm is only used on one thread at -// a time, and allows us to dispatch work to the thread where we can access the -// Realm safely. -RLM_SWIFT_SENDABLE // is immutable -@interface RLMScheduler : NSObject -+ (RLMScheduler *)mainRunLoop __attribute__((objc_direct)); -+ (RLMScheduler *)currentRunLoop __attribute__((objc_direct)); -// A scheduler for the given queue if it's non-nil, and currentRunLoop otherwise -+ (RLMScheduler *)dispatchQueue:(nullable dispatch_queue_t)queue; -+ (RLMScheduler *)actor:(id)actor invoke:(void (^)(dispatch_block_t))invoke - verify:(void (^)(void))verify; - -// Invoke the block on this scheduler. Currently not actually implement for run -// loop schedulers. -- (void)invoke:(dispatch_block_t)block; - -// Cache key for this scheduler suitable for use with NSMapTable. Only valid -// when called from the current scheduler. -- (void *)cacheKey; - -- (nullable id)actor; - -#ifdef __cplusplus -// The object store Scheduler corresponding to this scheduler -- (std::shared_ptr)osScheduler; -#endif -@end - -FOUNDATION_EXTERN void RLMSetMainActor(id actor); - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSchema_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSchema_Private.h deleted file mode 100644 index f4f63c9f8..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSchema_Private.h +++ /dev/null @@ -1,58 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability) - -@class RLMRealm; - -// -// RLMSchema private interface -// -@interface RLMSchema () - -/** - Returns an `RLMSchema` containing only the given `RLMObject` subclasses. - - @param classes The classes to be included in the schema. - - @return An `RLMSchema` containing only the given classes. - */ -+ (instancetype)schemaWithObjectClasses:(NSArray *)classes; - -@property (nonatomic, readwrite, copy) NSArray *objectSchema; - -// schema based on runtime objects -+ (instancetype)sharedSchema; - -// schema based upon all currently registered object classes -+ (instancetype)partialSharedSchema; - -// private schema based upon all currently registered object classes. -// includes classes that are excluded from the default schema. -+ (instancetype)partialPrivateSharedSchema; - -// class for string -+ (nullable Class)classForString:(NSString *)className; - -+ (nullable RLMObjectSchema *)sharedSchemaForClass:(Class)cls; - -@end - -RLM_HEADER_AUDIT_END(nullability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSet_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSet_Private.h deleted file mode 100644 index 1053e0a0f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSet_Private.h +++ /dev/null @@ -1,43 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import -#import - -@class RLMObjectBase, RLMProperty; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMSet () -- (instancetype)initWithObjectClassName:(NSString *)objectClassName; -- (instancetype)initWithObjectType:(RLMPropertyType)type optional:(BOOL)optional; -- (NSString *)descriptionWithMaxDepth:(NSUInteger)depth; -- (void)setParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -// YES if the property is declared with old property syntax. -@property (nonatomic, readonly) BOOL isLegacyProperty; -// The name of the property which this collection represents -@property (nonatomic, readonly) NSString *propertyKey; -@end - -void RLMSetValidateMatchingObjectType(RLMSet *set, id value); - -@interface RLMManagedSet : RLMSet -- (instancetype)initWithParent:(RLMObjectBase *)parentObject property:(RLMProperty *)property; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSwiftCollectionBase.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSwiftCollectionBase.h deleted file mode 100644 index a4f864282..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSwiftCollectionBase.h +++ /dev/null @@ -1,46 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -@class RLMObjectBase, RLMResults, RLMProperty, RLMLinkingObjects; - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMSwiftCollectionBase : NSProxy -@property (nonatomic, strong) id _rlmCollection; - -- (instancetype)init; -+ (Class)_backingCollectionType; -- (instancetype)initWithCollection:(id)collection; - -- (nullable id)valueForKey:(NSString *)key; -- (nullable id)valueForKeyPath:(NSString *)keyPath; -- (BOOL)isEqual:(nullable id)object; -@end - -@interface RLMLinkingObjectsHandle : NSObject -- (instancetype)initWithObject:(RLMObjectBase *)object property:(RLMProperty *)property; -- (instancetype)initWithLinkingObjects:(RLMResults *)linkingObjects; - -@property (nonatomic, readonly) RLMLinkingObjects *results; -@property (nonatomic, readonly) NSString *_propertyKey; -@property (nonatomic, readonly) BOOL _isLegacyProperty; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSwiftSupport.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSwiftSupport.h deleted file mode 100644 index 530f0edbf..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSwiftSupport.h +++ /dev/null @@ -1,30 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@interface RLMSwiftSupport : NSObject - -+ (BOOL)isSwiftClassName:(NSString *)className; -+ (NSString *)demangleClassName:(NSString *)className; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSwiftValueStorage.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSwiftValueStorage.h deleted file mode 100644 index ef3efc610..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSwiftValueStorage.h +++ /dev/null @@ -1,53 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -@class RLMObjectBase, RLMProperty; - -/// This class implements the backing storage for `RealmProperty<>` and `RealmOptional<>`. -/// This class should not be subclassed or used directly. -@interface RLMSwiftValueStorage : NSProxy -- (instancetype)init; -@end -/// Retrieves the value that is stored, or nil if it is empty. -FOUNDATION_EXTERN id _Nullable RLMGetSwiftValueStorage(RLMSwiftValueStorage *); -/// Sets a value on the property this instance represents for an object. -FOUNDATION_EXTERN void RLMSetSwiftValueStorage(RLMSwiftValueStorage *, id _Nullable); - -/// Initialises managed accessors on an instance of `RLMSwiftValueStorage` -/// @param parent The enclosing parent object. -/// @param prop The property which this class represents. -FOUNDATION_EXTERN void RLMInitializeManagedSwiftValueStorage(RLMSwiftValueStorage *, - RLMObjectBase *parent, - RLMProperty *prop); - -/// Initialises unmanaged accessors on an instance of `RLMSwiftValueStorage` -/// @param parent The enclosing parent object. -/// @param prop The property which this class represents. -FOUNDATION_EXTERN void RLMInitializeUnmanagedSwiftValueStorage(RLMSwiftValueStorage *, - RLMObjectBase *parent, - RLMProperty *prop); - -/// Gets the property name for the RealmProperty instance. This is required for tracing the key path on -/// objects that use the legacy property declaration syntax. -FOUNDATION_EXTERN NSString *RLMSwiftValueStorageGetPropertyName(RLMSwiftValueStorage *); - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSyncConfiguration_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSyncConfiguration_Private.h deleted file mode 100644 index 62d0e1f1f..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSyncConfiguration_Private.h +++ /dev/null @@ -1,47 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2016 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -typedef RLM_CLOSED_ENUM(NSUInteger, RLMSyncStopPolicy) { - RLMSyncStopPolicyImmediately, - RLMSyncStopPolicyLiveIndefinitely, - RLMSyncStopPolicyAfterChangesUploaded, -}; - - -@class RLMSchema; - -@interface RLMSyncConfiguration () - -// Flexible sync -- (instancetype)initWithUser:(RLMUser *)user; -// Partition-based sync -- (instancetype)initWithUser:(RLMUser *)user - partitionValue:(nullable id)partitionValue; - -// Internal-only APIs -@property (nonatomic, readwrite) RLMSyncStopPolicy stopPolicy; - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSyncSubscription_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSyncSubscription_Private.h deleted file mode 100644 index dc438a20e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMSyncSubscription_Private.h +++ /dev/null @@ -1,70 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -#pragma mark - Subscription - -@interface RLMSyncSubscription () - -@property (nonatomic, readonly) RLMObjectId *identifier; - -@property (nonatomic, readonly) NSString *queryString; - -@property (nonatomic, readonly) NSString *objectClassName; - -@end - -#pragma mark - SubscriptionSet - -@interface RLMSyncSubscriptionEnumerator : NSObject - -@property (nonatomic, readonly) RLMSyncSubscriptionSet *subscriptionSet; - -- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state - count:(NSUInteger)len; - -- (instancetype)initWithSubscriptionSet:(RLMSyncSubscriptionSet *)subscriptionSet; - -@end - -@interface RLMSyncSubscriptionSet () - -@property (readonly) uint64_t version; - -- (void)addSubscriptionWithClassName:(NSString *)objectClassName - subscriptionName:(nullable NSString *)name - predicate:(NSPredicate *)predicate - updateExisting:(BOOL)updateExisting; - -- (void)waitForSynchronizationOnQueue:(nullable dispatch_queue_t)queue - completionBlock:(void(^)(NSError *))completionBlock; - -- (RLMSyncSubscriptionEnumerator *)fastEnumerator; - -NSUInteger RLMFastEnumerate(NSFastEnumerationState *state, - NSUInteger len, - RLMSyncSubscriptionSet *collection); - -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMUser_Private.h b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMUser_Private.h deleted file mode 100644 index f62c9a940..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/PrivateHeaders/RLMUser_Private.h +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2020 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -#import - -RLM_HEADER_AUDIT_BEGIN(nullability, sendability) - -/// Observer block for user notifications. -typedef void(^RLMUserNotificationBlock)(RLMUser *); - -/// Token that identifies an observer. Unsubscribes when deconstructed to -/// avoid dangling observers, therefore this must be retained to hold -/// onto a subscription. -@interface RLMUserSubscriptionToken : NSObject -- (void)unsubscribe; -@end - -@interface RLMUser () -/// Subscribe to notifications for this RLMUser. -- (RLMUserSubscriptionToken *)subscribe:(RLMUserNotificationBlock)block; - -- (void)logOut; -@end - -RLM_HEADER_AUDIT_END(nullability, sendability) diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Realm b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Realm deleted file mode 100755 index e615245b9..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/Realm and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/_CodeSignature/CodeResources b/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/_CodeSignature/CodeResources deleted file mode 100644 index 7f95b43c7..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/Realm.xcframework/xros-arm64_x86_64-simulator/Realm.framework/_CodeSignature/CodeResources +++ /dev/null @@ -1,1015 +0,0 @@ - - - - - files - - CHANGELOG.md - - Zv1aE8lgTnRPKTg4+FZa+hYQQNM= - - Headers/NSError+RLMSync.h - - 02q4InRTrAKLrV8lPlx32J0V1Ko= - - Headers/RLMAPIKeyAuth.h - - 1jiv26oYx54zXYdhCKJkfQgUCZ8= - - Headers/RLMApp.h - - Ld28y6nHFgdYCwgko5F6L9mRTCc= - - Headers/RLMArray.h - - SxnXSBzghc13RDA5GoX65htp0Jc= - - Headers/RLMAsymmetricObject.h - - WI4FoMYUXUw5Jgvy2eN4FBgPf3c= - - Headers/RLMAsyncTask.h - - gBGrbdQ+f9PpOJWHbVRh5Zgrcj4= - - Headers/RLMBSON.h - - GxfhbpWdUsi0bAu035zq0wBE47k= - - Headers/RLMCollection.h - - HRgDEwlbCpYK0KE4nKT3aPeVt8Y= - - Headers/RLMConstants.h - - X7tUrKW39pKREt/52svrJ/kN+ZU= - - Headers/RLMCredentials.h - - 5r4wtUdLa9Sk0U2eqOShqRrLI3o= - - Headers/RLMDecimal128.h - - W9LoTzurbOFC6l/vu0W1s6NqP/8= - - Headers/RLMDictionary.h - - J4dcvrLymwvq7wa1sgBJejF2lnk= - - Headers/RLMEmailPasswordAuth.h - - qfpoumflL/1gL/z13dVqmA19PLk= - - Headers/RLMEmbeddedObject.h - - P6AmwHOiZF/Q9/w6LRANmqDu01g= - - Headers/RLMError.h - - f/fmbab1ht8EdLMSS3f0NXW1ejg= - - Headers/RLMFindOneAndModifyOptions.h - - NiYNYX+E6fXAZefMtarr31btYSs= - - Headers/RLMFindOptions.h - - nVYUhdeFVo2/ogMj0swOyCup1LY= - - Headers/RLMLogger.h - - xRxc1g20RrrsSVEhSHPTjV7wUrM= - - Headers/RLMMigration.h - - ek93LcGxSB4AWXYxDtK7lSLIUZA= - - Headers/RLMMongoClient.h - - JRIy+dSIlbOnrRU/zjhrjH/sXTQ= - - Headers/RLMMongoCollection.h - - zKZ75q5wJK1K7basKszSka/XDlE= - - Headers/RLMMongoDatabase.h - - 0+ymiybJvLDiWbH4UgOpF5kK7JA= - - Headers/RLMNetworkTransport.h - - NkHxyI4VoqVug1wJFXOSIPd4/n8= - - Headers/RLMObject.h - - 2XkBjhUx/DUZMHptinJRuCSuN5w= - - Headers/RLMObjectBase.h - - 6+LtdM5Zd9OGUBHLtOy0mNzlGNg= - - Headers/RLMObjectBase_Dynamic.h - - lN/ItPF2L4asyDrzvE9tb2NWeQU= - - Headers/RLMObjectId.h - - FAhiEJMRgGhU/STMYxb6Cat31Ns= - - Headers/RLMObjectSchema.h - - yasl78Lq+PvN6f/sBDQAG9IiiwU= - - Headers/RLMProperty.h - - QyE/WKZTEZokOC4HNpIuGWTo3V8= - - Headers/RLMProviderClient.h - - KI1gAsi16P1iZdUTVEJSXAZF+VQ= - - Headers/RLMPushClient.h - - ZXzPubk1A63/oe83WFy6s80UAdY= - - Headers/RLMRealm+Sync.h - - bRbsIAkomXsV+zAaLltmyzxBMvk= - - Headers/RLMRealm.h - - tXxGw5mHQm9c6gM5XAu3/1zO/F8= - - Headers/RLMRealmConfiguration.h - - tACtbQrCi+eN56JH+gH60N0lXOQ= - - Headers/RLMRealm_Dynamic.h - - 0cVBS7WHOS7nUFs7Zr0DQHRc7I0= - - Headers/RLMResults.h - - OeV5SVo3AWcXxIeYr3YYc/Iu7tw= - - Headers/RLMSchema.h - - iJLLK3FYqubxFLoT7EHwmGOnbGU= - - Headers/RLMSectionedResults.h - - +n3MZjJSPd30hm1WNfqQoj1gx44= - - Headers/RLMSet.h - - wCO5ODFhqKDzuFdZZfmBnsgScdM= - - Headers/RLMSwiftObject.h - - TyJjSFDM4ZAekB3cZKc+Fv89CqU= - - Headers/RLMSwiftProperty.h - - /CqEDrE+WN75hOjEyKoDOFTM5cI= - - Headers/RLMSyncConfiguration.h - - 0U9O9AfTO5SB6TJryUm8di9tn5Y= - - Headers/RLMSyncManager.h - - YkhlSPT2hNZyA//Lf07+5rkaTsc= - - Headers/RLMSyncSession.h - - ENN75q8RC4BNpH67LE7NiUtO08U= - - Headers/RLMSyncSubscription.h - - x1LOw7ekOPIKEzT7r93iFXMpvHo= - - Headers/RLMThreadSafeReference.h - - TFdISOKXlf2bIyLYEAbzQg2nMy0= - - Headers/RLMUpdateResult.h - - Mv08aMtnTA3wP3RetaDB4sHtOGU= - - Headers/RLMUser.h - - j5Zpgb+g0lIwk90bDaauU6Y1Fbk= - - Headers/RLMUserAPIKey.h - - cIVGNVxydkLjfkIoehfmqwwGd0w= - - Headers/RLMValue.h - - PQWyj9ZNWsNAy1kGw6ENnNfTQ7c= - - Headers/Realm.h - - fDREEG2URHEbKjZ2nfKq+7M/7m8= - - Info.plist - - bdw3TSYtrVWSVX1daC2W/LnFRaU= - - LICENSE - - htlQ0eA7QbvmaoSv/b3yVb0Yvsc= - - Modules/module.modulemap - - A28J5rfl2ooZX6nLmKAtWsKyoFg= - - PrivateHeaders/RLMAccessor.h - - khE1Bhu30Ou7L9/AFJKc/IJcRuU= - - PrivateHeaders/RLMApp_Private.h - - fw57ZhMCNGsWCpB/lCMaKqf0gek= - - PrivateHeaders/RLMArray_Private.h - - oA6RhNNa1GlEp9Z1dIc6yAXL91g= - - PrivateHeaders/RLMAsyncTask_Private.h - - ayc2eXD44f0/BptRlmZc+ocrzs8= - - PrivateHeaders/RLMBSON_Private.hpp - - Ku6rvqGFX5xk7aXxX4/93IoUJIw= - - PrivateHeaders/RLMCollection_Private.h - - CjigFgVyD/CQlglvVOv3mgmYhmM= - - PrivateHeaders/RLMDictionary_Private.h - - 9jGJQrUJ13oF7wuVyURhFJvDa48= - - PrivateHeaders/RLMEvent.h - - Z1CXQWPXt3itYLuQPrnDE2DOCIQ= - - PrivateHeaders/RLMLogger_Private.h - - vXtWFbH2FmBySg6psXIsF4xTyVw= - - PrivateHeaders/RLMMigration_Private.h - - Rkv9PVKy4D9WpE91+PF5fG8dqb4= - - PrivateHeaders/RLMMongoCollection_Private.h - - SxxQvypVsEBDtC0poogA7IuabvY= - - PrivateHeaders/RLMObjectBase_Private.h - - PQsL4hvY5WGKrm+ENzb3IzoLFMI= - - PrivateHeaders/RLMObjectSchema_Private.h - - 87hjm4eoCqM0JdgW0yVzYipgCv0= - - PrivateHeaders/RLMObjectStore.h - - LH3NYAHYk37ukx3w36l3VfRkWLY= - - PrivateHeaders/RLMObject_Private.h - - fSysuPyok9rS8jBVWujPT5ZYPkw= - - PrivateHeaders/RLMProperty_Private.h - - YrwESqK7Bp+VJPR2q1unO0HC1n4= - - PrivateHeaders/RLMPushClient_Private.hpp - - VB6WiIHnxZ2GvtGB/Dt8BukU3g8= - - PrivateHeaders/RLMRealmConfiguration_Private.h - - fDc6xRp+/ItxCAWyzEto1dXyZDU= - - PrivateHeaders/RLMRealm_Private.h - - FQ45UlPks0oI4fN23S8KH3+cY4U= - - PrivateHeaders/RLMResults_Private.h - - pYrkP89R066MUPthppAiIF6icJ0= - - PrivateHeaders/RLMScheduler.h - - bmnqRPRwLoqjOIHXTAATSTi2Uzs= - - PrivateHeaders/RLMSchema_Private.h - - W3h50q1OLVJcyk0pNZ6qMcSbW0U= - - PrivateHeaders/RLMSet_Private.h - - 1UAOTMK/IHQOq44rH3GVRul1lT0= - - PrivateHeaders/RLMSwiftCollectionBase.h - - g/qYcSeOq1sDRrlomok4rP7w7gA= - - PrivateHeaders/RLMSwiftSupport.h - - 4T1N9038YMMHtsxSBDLu6RQ+Lpo= - - PrivateHeaders/RLMSwiftValueStorage.h - - yk9OQJHakSFzvm/0GWEw3L/IYdg= - - PrivateHeaders/RLMSyncConfiguration_Private.h - - Uq5Fv8y5c2BeibZeqe/OqOfQumI= - - PrivateHeaders/RLMSyncSubscription_Private.h - - MNGSKmrqPPyhHcOtu/BqSSURYXM= - - PrivateHeaders/RLMUser_Private.h - - j+PpsIBJsBM3k2htqZGM/y4Fw3M= - - - files2 - - CHANGELOG.md - - hash2 - - wt8p9tw4OPVj/LtpO9d+DXFoOnRQ6hRaxf/hS2NxDRg= - - - Headers/NSError+RLMSync.h - - hash2 - - 6nK1lw6vBPSTrCi83gbHTMykzmdmX0MlMrq6LmJk94I= - - - Headers/RLMAPIKeyAuth.h - - hash2 - - FwweqLeo/BZi7cBnkDu+AdBgnukrjAbjicdVQJ3PVV8= - - - Headers/RLMApp.h - - hash2 - - fmHB8oywmfycQqOzXoYB99LpOLE7akGn0ZrJtqviiTs= - - - Headers/RLMArray.h - - hash2 - - KaucaZvTcO+xDUtNo4JYySrZMCq6E8OiSYOMG3/LBxE= - - - Headers/RLMAsymmetricObject.h - - hash2 - - +liD/ke74W4Loa4OKvFBITIRTkZRZbItMxN6R4eU7wY= - - - Headers/RLMAsyncTask.h - - hash2 - - iyHi4LWQgTu2yYDS23OZ1wfdZt3ouoY5VoI0aEsHOm0= - - - Headers/RLMBSON.h - - hash2 - - W+5lc5SCRmNbVF2Pu9Zd2v46R+WALQ7xoNCOYC1Swnw= - - - Headers/RLMCollection.h - - hash2 - - womyBrMRt2s1UKKkPo++KwOv6DtP6q48hcBi1jfM2hI= - - - Headers/RLMConstants.h - - hash2 - - QntrtgpnRkkfsRAPt4SY8+3rscdQDbqztCyWdLS0vsU= - - - Headers/RLMCredentials.h - - hash2 - - ObUBKMWeTU0zI7Q4Ts9H5trRs4y4T3bCUY808oTm0bY= - - - Headers/RLMDecimal128.h - - hash2 - - Ubfmc9QWzsK+AcqbQRwaiXdylBV0LgqlyqeMBY1+LyQ= - - - Headers/RLMDictionary.h - - hash2 - - 7zN2nXgEwGfrPRtbgqtfoLrwJbwqohcVvU/OyA/07Lk= - - - Headers/RLMEmailPasswordAuth.h - - hash2 - - kPgBdHJePj/cHAbWCVhZlW1gCQP5jXtJ7XudO0PWjJc= - - - Headers/RLMEmbeddedObject.h - - hash2 - - ixHqXedHxkS6e1f2hOY4TR7NWMyNq34b4/nm8SR0Oxc= - - - Headers/RLMError.h - - hash2 - - 6duvM3p0FRf6fZ+aS57vHkf7WvV1KPoz7PcIZA48WTU= - - - Headers/RLMFindOneAndModifyOptions.h - - hash2 - - eBuQnRLTeMBzF7m2R9PMJor8N0HG8BATxdCptRT1l9M= - - - Headers/RLMFindOptions.h - - hash2 - - P8MSaPFACOtAPsGYinSqt6NMIsXKcWkHpFTlly2GBYo= - - - Headers/RLMLogger.h - - hash2 - - Rc5dqT87eP/gD3kVZ1e7cRwI9Mkt5r6CFn/coM+9wNw= - - - Headers/RLMMigration.h - - hash2 - - /CXq+e7CtzaXdrGoLya2a56Zz6xWRH73N3RzyMcQrgs= - - - Headers/RLMMongoClient.h - - hash2 - - mcINEnrePRx0xfRaNvOmeXYRadQMzwLngLrJ1OVyopc= - - - Headers/RLMMongoCollection.h - - hash2 - - E0fX0BjuJ0j4c8TuCPbwnLNKz673nghSyUN4BYN/+Io= - - - Headers/RLMMongoDatabase.h - - hash2 - - wnJWmMW0z3xO9KVRJKpiE+xkaKkzXBXiH5j+8eaFmcA= - - - Headers/RLMNetworkTransport.h - - hash2 - - AicqavQF04Q9MIj7DC5P9gBz6OuViFiiAmXdjlFnDHg= - - - Headers/RLMObject.h - - hash2 - - OiikDToZtuVXIwxkh+yGFMFCP0c/2M6A8cIP77/xvcU= - - - Headers/RLMObjectBase.h - - hash2 - - 0IkNkedPyHNJuPYD0PmVx4Bg/+mH8tv2PNXD2m9hWV8= - - - Headers/RLMObjectBase_Dynamic.h - - hash2 - - MhHocXkaDJWhg+kvj9Hqqy9FG4zTtna2Np2i7p4l/mA= - - - Headers/RLMObjectId.h - - hash2 - - Y7IcVMBjUeMCgI/orPGngNh0qcgC7R7fwx2STYYTC2g= - - - Headers/RLMObjectSchema.h - - hash2 - - 8oCJihoGgigIF170SRk/yU5RLDNX9TYQUrXxLjYrtuM= - - - Headers/RLMProperty.h - - hash2 - - nV0mZEIKVaPW2/FVbUaWuXy+nEV5iB30UZ55i0VVCno= - - - Headers/RLMProviderClient.h - - hash2 - - aOPxwbDKabtIt2wbqZ4Wb/le1H43X9HXrNkONHiEX2M= - - - Headers/RLMPushClient.h - - hash2 - - vLfYK+JyPmkHz32A9v/JPJGPKAL9QTKDDjuzAvbp+oQ= - - - Headers/RLMRealm+Sync.h - - hash2 - - WcmSf38ttMQ4awjqOn4zkmpysaf44aAT0GgECwvPPTA= - - - Headers/RLMRealm.h - - hash2 - - DMk8xOvPhlnZalU0C2E5O60eqhA67YErgxkj3mI4jXc= - - - Headers/RLMRealmConfiguration.h - - hash2 - - j5GiT0/nxORHqliXnJv/kkbOOqZX33xDbk8OTR7zDwU= - - - Headers/RLMRealm_Dynamic.h - - hash2 - - S14hbsZJZN4uVtz+HI326QGjnxKdSRlU6Ogf/zRhn3I= - - - Headers/RLMResults.h - - hash2 - - qZJ0imHeOKCxk0VNEkVldju7BQHiZ2hohjwCeU6aZTg= - - - Headers/RLMSchema.h - - hash2 - - Da+xBUjLeHl2hcOCpSFRylZchf6KtXuqqjscXH1jJQM= - - - Headers/RLMSectionedResults.h - - hash2 - - sXdD7rSZHJKtS62ScBNQhWdpGkKW1aDVK0qCzOouJIs= - - - Headers/RLMSet.h - - hash2 - - GJyUsZbhXDGgjqOQlfqqef9XjQnvB5nCRPHtZJWGa3w= - - - Headers/RLMSwiftObject.h - - hash2 - - Mp9akxBWxbrBunN7cH8rKSLxSps0tbV78UDSheKAlcU= - - - Headers/RLMSwiftProperty.h - - hash2 - - 9FsxWX7jcaks+2ZmTf4cgN0zvirLeNQHSB6BYAO1EYI= - - - Headers/RLMSyncConfiguration.h - - hash2 - - Qd1NmY+Z/yEGUpaaue7NEJ5fPWaRdhGPZwdhliidIpY= - - - Headers/RLMSyncManager.h - - hash2 - - rFV4QDsBonA29YqdZXsYhNSVewEYkrafSLPWBGaEhqI= - - - Headers/RLMSyncSession.h - - hash2 - - nvtBHH3xJsThO0B4IC70G3oFD2TAm3ylKbmewSOosI4= - - - Headers/RLMSyncSubscription.h - - hash2 - - bLLVFGHhtBca6vgsFZmW1oNaoYQlrjFELS/wESp9AbM= - - - Headers/RLMThreadSafeReference.h - - hash2 - - UMODRNRT6SDDKzmYIElQuKxojpiUtxhb0o/KbUM9BiA= - - - Headers/RLMUpdateResult.h - - hash2 - - lAHF8rLoAYtBCB3iqPCJEeSAijx4p/TLf2Q/B/qh5lY= - - - Headers/RLMUser.h - - hash2 - - wTq72vEeK8F3E3s/3DWLNz76GPbIMmApC5KfRF6m0ro= - - - Headers/RLMUserAPIKey.h - - hash2 - - 1QyqOo1U0h/D83T3jmF2rcq87+P6CHZvXh5dNLZQV00= - - - Headers/RLMValue.h - - hash2 - - kTEM0oJVWJv89s6/r6s0AHQoO1bJZsYB8IHZKbPtddY= - - - Headers/Realm.h - - hash2 - - kjoP0TvFhg49q7sxVEgPoNFg+zqo9bCE2Uh0YOpDpbE= - - - LICENSE - - hash2 - - aYSSIb+5AFPeITTvXm1UAoe0uYBiMmSS8flvXaaFUks= - - - Modules/module.modulemap - - hash2 - - KdpbsAGrxax/jx81TZ93YswnCwT1BZTor6VwIHvgRUs= - - - PrivateHeaders/RLMAccessor.h - - hash2 - - SPn/lNQWueENJmkQ4wtBIhfjYt6+nmmT97X3fzuAJC0= - - - PrivateHeaders/RLMApp_Private.h - - hash2 - - 4pd3636NRX7kQgsEy7dv7IQH/AyZMKjQvA2nmK97Vq0= - - - PrivateHeaders/RLMArray_Private.h - - hash2 - - 2N5vpeRBFWpvYEVWixFuVwigDP3cRo9i7S0qyB7fCZE= - - - PrivateHeaders/RLMAsyncTask_Private.h - - hash2 - - vD90SYI5658JDp88stHbsxALdVNhs0Tojcld9hVORHE= - - - PrivateHeaders/RLMBSON_Private.hpp - - hash2 - - BbwPX5lPL+B+5GRik9KiI5HcYoKNH/Tsciqyo3dZwBw= - - - PrivateHeaders/RLMCollection_Private.h - - hash2 - - Ez5JFCGYAGERpmwzK44V9Wu5NkwdLOrl1iHqFvur6r4= - - - PrivateHeaders/RLMDictionary_Private.h - - hash2 - - L46EZOdftwGMzm9VC/4u3hkjsshqrE1MqRXoAkJqsOg= - - - PrivateHeaders/RLMEvent.h - - hash2 - - 5QzhSVhLCncN5PArOpGSswyWYU5jSvmLJ64E6SIAYdw= - - - PrivateHeaders/RLMLogger_Private.h - - hash2 - - FcXRklemoAfn0U01YWdTuUgt0i183/x1v71EplpuujM= - - - PrivateHeaders/RLMMigration_Private.h - - hash2 - - ffQpfBvMLXuV8NocpO5ksVSmYUATypSSGr91LEfzT6o= - - - PrivateHeaders/RLMMongoCollection_Private.h - - hash2 - - PihL2Vx/JsPS4RvQXdpvaQ+VxmtmdOwaYgtH6f9wNQs= - - - PrivateHeaders/RLMObjectBase_Private.h - - hash2 - - qSCecm7kZ3JIPZlhy4bqSwWYGpxP6cO+4XEUgSvdUTY= - - - PrivateHeaders/RLMObjectSchema_Private.h - - hash2 - - YULa8m2pbU/ji4KozUqn/FNoRTWwO71lgKeJiAbPRYA= - - - PrivateHeaders/RLMObjectStore.h - - hash2 - - 0KjmazUjg/mYvymGTJ74ChBgvrqN2Lc9O0TqcYF/Mic= - - - PrivateHeaders/RLMObject_Private.h - - hash2 - - +H8SMf9eYajdgBd1CmVWutUX5RsEHIsqKiruzH9R/Ok= - - - PrivateHeaders/RLMProperty_Private.h - - hash2 - - SCHY8+Qpt8utNhA5fwnUlOZ4Lg3O4Ubp5JrNuf01QIA= - - - PrivateHeaders/RLMPushClient_Private.hpp - - hash2 - - 2Os6mvA+v08M/g6mBUU8xUYAJvdOf9G/Fe1c0QuXlVg= - - - PrivateHeaders/RLMRealmConfiguration_Private.h - - hash2 - - syVrRHUbHQtVS/Dn94ZFKgu8iSJM1m17S0xnMCK9yEg= - - - PrivateHeaders/RLMRealm_Private.h - - hash2 - - Iwvw9zZudHE58doxwpdgpZqHaiCFT0Vn256EkmeFzIw= - - - PrivateHeaders/RLMResults_Private.h - - hash2 - - 7XS2lKYYaVQEMQ+lyOes++x+RIKDsVc8K2ZyTCf2NgE= - - - PrivateHeaders/RLMScheduler.h - - hash2 - - k60PzA5BmG/FSt34q+UmdeQWecO5OhB+uZnq99H1Fzc= - - - PrivateHeaders/RLMSchema_Private.h - - hash2 - - xuglEVxHTOiGP9pVTJ8oLhSTM1SRk38dn7uPHqUQ93Y= - - - PrivateHeaders/RLMSet_Private.h - - hash2 - - Fo+6TD0oovdpdflJ6GyRvXgCOWHSSjd2bAR+j7Fs88U= - - - PrivateHeaders/RLMSwiftCollectionBase.h - - hash2 - - bDV50WQPz5wCRCcFfCQLob/JPetY8XeEOZOJXoLtGKs= - - - PrivateHeaders/RLMSwiftSupport.h - - hash2 - - bDHCy6fOU4zn5MSi6CAVRmKQsc7GJgx6X4RNHbuI8Ws= - - - PrivateHeaders/RLMSwiftValueStorage.h - - hash2 - - D9eklFNwtXSh83+sMaYU1SNzeidnyKUXZV2PLWt+Ank= - - - PrivateHeaders/RLMSyncConfiguration_Private.h - - hash2 - - neftVth2HwCuILURLXm1nMY/GZCeo0G5/yYCIS8gz3Q= - - - PrivateHeaders/RLMSyncSubscription_Private.h - - hash2 - - Y9ySSatKNxy/XkESWScAioTpFet/83QmLhrE1VUIgmU= - - - PrivateHeaders/RLMUser_Private.h - - hash2 - - 4DKpP+7zxmcfnitz1DhLK2fhsChCk2aPWbG0B85100o= - - - - rules - - ^.* - - ^.*\.lproj/ - - optional - - weight - 1000 - - ^.*\.lproj/locversion.plist$ - - omit - - weight - 1100 - - ^Base\.lproj/ - - weight - 1010 - - ^version.plist$ - - - rules2 - - .*\.dSYM($|/) - - weight - 11 - - ^(.*/)?\.DS_Store$ - - omit - - weight - 2000 - - ^.* - - ^.*\.lproj/ - - optional - - weight - 1000 - - ^.*\.lproj/locversion.plist$ - - omit - - weight - 1100 - - ^Base\.lproj/ - - weight - 1010 - - ^Info\.plist$ - - omit - - weight - 20 - - ^PkgInfo$ - - omit - - weight - 20 - - ^embedded\.provisionprofile$ - - weight - 20 - - ^version\.plist$ - - weight - 20 - - - - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/Info.plist b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/Info.plist deleted file mode 100644 index e01192c07..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/Info.plist +++ /dev/null @@ -1,172 +0,0 @@ - - - - - AvailableLibraries - - - BinaryPath - RealmSwift.framework/RealmSwift - LibraryIdentifier - xros-arm64 - LibraryPath - RealmSwift.framework - SupportedArchitectures - - arm64 - - SupportedPlatform - xros - - - BinaryPath - RealmSwift.framework/RealmSwift - LibraryIdentifier - xros-arm64_x86_64-simulator - LibraryPath - RealmSwift.framework - SupportedArchitectures - - arm64 - x86_64 - - SupportedPlatform - xros - SupportedPlatformVariant - simulator - - - BinaryPath - RealmSwift.framework/RealmSwift - LibraryIdentifier - watchos-arm64_i386_x86_64-simulator - LibraryPath - RealmSwift.framework - SupportedArchitectures - - arm64 - i386 - x86_64 - - SupportedPlatform - watchos - SupportedPlatformVariant - simulator - - - BinaryPath - RealmSwift.framework/RealmSwift - LibraryIdentifier - tvos-arm64_x86_64-simulator - LibraryPath - RealmSwift.framework - SupportedArchitectures - - arm64 - x86_64 - - SupportedPlatform - tvos - SupportedPlatformVariant - simulator - - - BinaryPath - RealmSwift.framework/Versions/A/RealmSwift - LibraryIdentifier - ios-arm64_x86_64-maccatalyst - LibraryPath - RealmSwift.framework - SupportedArchitectures - - arm64 - x86_64 - - SupportedPlatform - ios - SupportedPlatformVariant - maccatalyst - - - BinaryPath - RealmSwift.framework/RealmSwift - LibraryIdentifier - watchos-arm64_arm64_32_armv7k - LibraryPath - RealmSwift.framework - SupportedArchitectures - - arm64 - arm64_32 - armv7k - - SupportedPlatform - watchos - - - BinaryPath - RealmSwift.framework/RealmSwift - LibraryIdentifier - tvos-arm64 - LibraryPath - RealmSwift.framework - SupportedArchitectures - - arm64 - - SupportedPlatform - tvos - - - BinaryPath - RealmSwift.framework/Versions/A/RealmSwift - LibraryIdentifier - macos-arm64_x86_64 - LibraryPath - RealmSwift.framework - SupportedArchitectures - - arm64 - x86_64 - - SupportedPlatform - macos - - - BinaryPath - RealmSwift.framework/RealmSwift - LibraryIdentifier - ios-arm64 - LibraryPath - RealmSwift.framework - SupportedArchitectures - - arm64 - - SupportedPlatform - ios - - - BinaryPath - RealmSwift.framework/RealmSwift - LibraryIdentifier - ios-arm64_x86_64-simulator - LibraryPath - RealmSwift.framework - SupportedArchitectures - - arm64 - x86_64 - - SupportedPlatform - ios - SupportedPlatformVariant - simulator - - - CFBundlePackageType - XFWK - XCFrameworkFormatVersion - 1.0 - - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64/RealmSwift.framework/Headers/RealmSwift-Swift.h b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64/RealmSwift.framework/Headers/RealmSwift-Swift.h deleted file mode 100644 index a0975c6e0..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64/RealmSwift.framework/Headers/RealmSwift-Swift.h +++ /dev/null @@ -1,727 +0,0 @@ -#if 0 -#elif defined(__arm64__) && __arm64__ -// Generated by Apple Swift version 5.9 (swiftlang-5.9.0.128.106 clang-1500.0.40.1) -#ifndef REALMSWIFT_SWIFT_H -#define REALMSWIFT_SWIFT_H -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wgcc-compat" - -#if !defined(__has_include) -# define __has_include(x) 0 -#endif -#if !defined(__has_attribute) -# define __has_attribute(x) 0 -#endif -#if !defined(__has_feature) -# define __has_feature(x) 0 -#endif -#if !defined(__has_warning) -# define __has_warning(x) 0 -#endif - -#if __has_include() -# include -#endif - -#pragma clang diagnostic ignored "-Wauto-import" -#if defined(__OBJC__) -#include -#endif -#if defined(__cplusplus) -#include -#include -#include -#include -#include -#include -#include -#else -#include -#include -#include -#include -#endif -#if defined(__cplusplus) -#if defined(__arm64e__) && __has_include() -# include -#else -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wreserved-macro-identifier" -# ifndef __ptrauth_swift_value_witness_function_pointer -# define __ptrauth_swift_value_witness_function_pointer(x) -# endif -# ifndef __ptrauth_swift_class_method_pointer -# define __ptrauth_swift_class_method_pointer(x) -# endif -#pragma clang diagnostic pop -#endif -#endif - -#if !defined(SWIFT_TYPEDEFS) -# define SWIFT_TYPEDEFS 1 -# if __has_include() -# include -# elif !defined(__cplusplus) -typedef uint_least16_t char16_t; -typedef uint_least32_t char32_t; -# endif -typedef float swift_float2 __attribute__((__ext_vector_type__(2))); -typedef float swift_float3 __attribute__((__ext_vector_type__(3))); -typedef float swift_float4 __attribute__((__ext_vector_type__(4))); -typedef double swift_double2 __attribute__((__ext_vector_type__(2))); -typedef double swift_double3 __attribute__((__ext_vector_type__(3))); -typedef double swift_double4 __attribute__((__ext_vector_type__(4))); -typedef int swift_int2 __attribute__((__ext_vector_type__(2))); -typedef int swift_int3 __attribute__((__ext_vector_type__(3))); -typedef int swift_int4 __attribute__((__ext_vector_type__(4))); -typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2))); -typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3))); -typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); -#endif - -#if !defined(SWIFT_PASTE) -# define SWIFT_PASTE_HELPER(x, y) x##y -# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y) -#endif -#if !defined(SWIFT_METATYPE) -# define SWIFT_METATYPE(X) Class -#endif -#if !defined(SWIFT_CLASS_PROPERTY) -# if __has_feature(objc_class_property) -# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__ -# else -# define SWIFT_CLASS_PROPERTY(...) -# endif -#endif -#if !defined(SWIFT_RUNTIME_NAME) -# if __has_attribute(objc_runtime_name) -# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) -# else -# define SWIFT_RUNTIME_NAME(X) -# endif -#endif -#if !defined(SWIFT_COMPILE_NAME) -# if __has_attribute(swift_name) -# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) -# else -# define SWIFT_COMPILE_NAME(X) -# endif -#endif -#if !defined(SWIFT_METHOD_FAMILY) -# if __has_attribute(objc_method_family) -# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) -# else -# define SWIFT_METHOD_FAMILY(X) -# endif -#endif -#if !defined(SWIFT_NOESCAPE) -# if __has_attribute(noescape) -# define SWIFT_NOESCAPE __attribute__((noescape)) -# else -# define SWIFT_NOESCAPE -# endif -#endif -#if !defined(SWIFT_RELEASES_ARGUMENT) -# if __has_attribute(ns_consumed) -# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) -# else -# define SWIFT_RELEASES_ARGUMENT -# endif -#endif -#if !defined(SWIFT_WARN_UNUSED_RESULT) -# if __has_attribute(warn_unused_result) -# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) -# else -# define SWIFT_WARN_UNUSED_RESULT -# endif -#endif -#if !defined(SWIFT_NORETURN) -# if __has_attribute(noreturn) -# define SWIFT_NORETURN __attribute__((noreturn)) -# else -# define SWIFT_NORETURN -# endif -#endif -#if !defined(SWIFT_CLASS_EXTRA) -# define SWIFT_CLASS_EXTRA -#endif -#if !defined(SWIFT_PROTOCOL_EXTRA) -# define SWIFT_PROTOCOL_EXTRA -#endif -#if !defined(SWIFT_ENUM_EXTRA) -# define SWIFT_ENUM_EXTRA -#endif -#if !defined(SWIFT_CLASS) -# if __has_attribute(objc_subclassing_restricted) -# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA -# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# else -# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# endif -#endif -#if !defined(SWIFT_RESILIENT_CLASS) -# if __has_attribute(objc_class_stub) -# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub)) -# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME) -# else -# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) -# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME) -# endif -#endif -#if !defined(SWIFT_PROTOCOL) -# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA -# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA -#endif -#if !defined(SWIFT_EXTENSION) -# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__) -#endif -#if !defined(OBJC_DESIGNATED_INITIALIZER) -# if __has_attribute(objc_designated_initializer) -# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) -# else -# define OBJC_DESIGNATED_INITIALIZER -# endif -#endif -#if !defined(SWIFT_ENUM_ATTR) -# if __has_attribute(enum_extensibility) -# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility))) -# else -# define SWIFT_ENUM_ATTR(_extensibility) -# endif -#endif -#if !defined(SWIFT_ENUM) -# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type -# if __has_feature(generalized_swift_name) -# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type -# else -# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility) -# endif -#endif -#if !defined(SWIFT_UNAVAILABLE) -# define SWIFT_UNAVAILABLE __attribute__((unavailable)) -#endif -#if !defined(SWIFT_UNAVAILABLE_MSG) -# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg))) -#endif -#if !defined(SWIFT_AVAILABILITY) -# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__))) -#endif -#if !defined(SWIFT_WEAK_IMPORT) -# define SWIFT_WEAK_IMPORT __attribute__((weak_import)) -#endif -#if !defined(SWIFT_DEPRECATED) -# define SWIFT_DEPRECATED __attribute__((deprecated)) -#endif -#if !defined(SWIFT_DEPRECATED_MSG) -# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__))) -#endif -#if !defined(SWIFT_DEPRECATED_OBJC) -# if __has_feature(attribute_diagnose_if_objc) -# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) -# else -# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) -# endif -#endif -#if defined(__OBJC__) -#if !defined(IBSegueAction) -# define IBSegueAction -#endif -#endif -#if !defined(SWIFT_EXTERN) -# if defined(__cplusplus) -# define SWIFT_EXTERN extern "C" -# else -# define SWIFT_EXTERN extern -# endif -#endif -#if !defined(SWIFT_CALL) -# define SWIFT_CALL __attribute__((swiftcall)) -#endif -#if !defined(SWIFT_INDIRECT_RESULT) -# define SWIFT_INDIRECT_RESULT __attribute__((swift_indirect_result)) -#endif -#if !defined(SWIFT_CONTEXT) -# define SWIFT_CONTEXT __attribute__((swift_context)) -#endif -#if !defined(SWIFT_ERROR_RESULT) -# define SWIFT_ERROR_RESULT __attribute__((swift_error_result)) -#endif -#if defined(__cplusplus) -# define SWIFT_NOEXCEPT noexcept -#else -# define SWIFT_NOEXCEPT -#endif -#if !defined(SWIFT_C_INLINE_THUNK) -# if __has_attribute(always_inline) -# if __has_attribute(nodebug) -# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) __attribute__((nodebug)) -# else -# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) -# endif -# else -# define SWIFT_C_INLINE_THUNK inline -# endif -#endif -#if defined(_WIN32) -#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) -# define SWIFT_IMPORT_STDLIB_SYMBOL __declspec(dllimport) -#endif -#else -#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) -# define SWIFT_IMPORT_STDLIB_SYMBOL -#endif -#endif -#if defined(__OBJC__) -#if __has_feature(objc_modules) -#if __has_warning("-Watimport-in-framework-header") -#pragma clang diagnostic ignored "-Watimport-in-framework-header" -#endif -@import Foundation; -@import ObjectiveC; -@import Realm; -@import Realm.Swift; -#endif - -#endif -#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch" -#pragma clang diagnostic ignored "-Wduplicate-method-arg" -#if __has_warning("-Wpragma-clang-attribute") -# pragma clang diagnostic ignored "-Wpragma-clang-attribute" -#endif -#pragma clang diagnostic ignored "-Wunknown-pragmas" -#pragma clang diagnostic ignored "-Wnullability" -#pragma clang diagnostic ignored "-Wdollar-in-identifier-extension" - -#if __has_attribute(external_source_symbol) -# pragma push_macro("any") -# undef any -# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="RealmSwift",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol)) -# pragma pop_macro("any") -#endif - -#if defined(__OBJC__) -@class NSString; - -/// A type which has a custom representation in Realm events. -/// By default, objects are serialized to JSON using built-in rules which -/// include every property. If you wish to customize how a class is serialized -/// in events, you can declare it as conforming to this protocol and -/// define customEventRepresentation(). -SWIFT_PROTOCOL_NAMED("CustomEventRepresentable") -@protocol RLMCustomEventRepresentable -/// Get the custom event serialization for this object. -/// This function must return a valid JSON String, as this is included in a -/// larger JSON document. Implementations of this function should be “pure” -/// and access no data other than that which is obtainable from the Object -/// it is called on, and it should not mutate the object which it is called -/// on. This function is called on a background thread in a somewhat -/// unusual context, and attempting to access other data is likely to cause -/// problems. -- (NSString * _Nonnull)customEventRepresentation SWIFT_WARN_UNUSED_RESULT; -@end - -@class NSNumber; - -/// A 128-bit IEEE 754-2008 decimal floating point number. -/// This type is similar to Swift’s built-in Decimal type, but allocates bits differently, resulting in a different representable range. (NS)Decimal stores a significand of up to 38 digits long and an exponent from -128 to 127, while this type stores up to 34 digits of significand and an exponent from -6143 to 6144. -SWIFT_CLASS_NAMED("Decimal128") -@interface RealmSwiftDecimal128 : RLMDecimal128 -/// Creates a new zero-initialized Decimal128. -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -/// Converts the given value to a Decimal128. -/// The following types can be converted to Decimal128: -///
    -///
  • -/// Int (of any size) -///
  • -///
  • -/// Float -///
  • -///
  • -/// Double -///
  • -///
  • -/// String -///
  • -///
  • -/// NSNumber -///
  • -///
  • -/// Decimal -///
  • -///
-/// Passing a value with a type not in this list is a fatal error. Passing a string which cannot be parsed as a valid Decimal128 is a fatal error. -/// \param value The value to convert to a Decimal128. -/// -- (nonnull instancetype)initWithValue:(id _Nonnull)value OBJC_DESIGNATED_INITIALIZER; -/// Converts the given number to a Decimal128. -/// This initializer cannot fail and is never lossy. -/// \param number The number to convert to a Decimal128. -/// -- (nonnull instancetype)initWithNumber:(NSNumber * _Nonnull)number OBJC_DESIGNATED_INITIALIZER; -/// Parse the given string as a Decimal128. -/// This initializer never throws and is marked as throws only because removing it is a breaking -/// change. Strings which cannot be parsed as a Decimal128 return a value where isNaN is true. -/// \param string The string to parse. -/// -- (nullable instancetype)initWithString:(NSString * _Nonnull)string error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER; -@end - - - - - - - - - - - - - - - - - - -@class RLMObjectSchema; - -/// Object interface which allows untyped getters and setters for Objects. -/// :nodoc: -SWIFT_CLASS_NAMED("DynamicObject") -@interface RealmSwiftDynamicObject : RealmSwiftObject -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)value forKeyedSubscript:(NSString * _Nonnull)key; -/// :nodoc: -- (id _Nullable)valueForUndefinedKey:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -- (void)setValue:(id _Nullable)value forUndefinedKey:(NSString * _Nonnull)key; -/// :nodoc: -+ (BOOL)shouldIncludeInDefaultSchema SWIFT_WARN_UNUSED_RESULT; -+ (RLMObjectSchema * _Nullable)sharedSchema SWIFT_WARN_UNUSED_RESULT; -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -@end - - - - - - - - - - - - - - - -@class NSDate; - -/// A 12-byte (probably) unique object identifier. -/// ObjectIds are similar to a GUID or a UUID, and can be used to uniquely identify objects without a centralized ID generator. An ObjectID consists of: -///
    -///
  1. -/// A 4 byte timestamp measuring the creation time of the ObjectId in seconds since the Unix epoch. -///
  2. -///
  3. -/// A 5 byte random value -///
  4. -///
  5. -/// A 3 byte counter, initialized to a random value. -///
  6. -///
-/// ObjectIds are intended to be fast to generate. Sorting by an ObjectId field will typically result in the objects being sorted in creation order. -SWIFT_CLASS_NAMED("ObjectId") -@interface RealmSwiftObjectId : RLMObjectId -/// Creates a new zero-initialized ObjectId. -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -/// Creates a new randomly-initialized ObjectId. -+ (RealmSwiftObjectId * _Nonnull)objectId SWIFT_WARN_UNUSED_RESULT; -/// Creates a new ObjectId from the given 24-byte hexadecimal string. -/// Throws if the string is not 24 characters or contains any characters other than 0-9a-fA-F. -/// \param string The string to parse. -/// -- (nullable instancetype)initWithString:(NSString * _Nonnull)string error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER; -- (nonnull instancetype)initWithTimestamp:(NSDate * _Nonnull)timestamp machineIdentifier:(int32_t)machineIdentifier processIdentifier:(int32_t)processIdentifier SWIFT_UNAVAILABLE; -@end - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -@class RLMProperty; - -@interface RealmSwiftAsymmetricObject (SWIFT_EXTENSION(RealmSwift)) -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: AsymmetricObject { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - - - - -@interface RealmSwiftEmbeddedObject (SWIFT_EXTENSION(RealmSwift)) -/// :nodoc: -+ (BOOL)isEmbedded SWIFT_WARN_UNUSED_RESULT; -/// Indicates if the object can no longer be accessed because it is now invalid. -/// An object can no longer be accessed if the object has been deleted from the Realm that manages it, or if -/// invalidate() is called on that Realm. -@property (nonatomic, readonly, getter=isInvalidated) BOOL invalidated; -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the names of properties to ignore. These properties will not be managed by -/// the Realm that manages the object. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, any properties not -/// marked with @Persisted are automatically ignored. -/// -/// returns: -/// An array of property names to ignore. -+ (NSArray * _Nonnull)ignoredProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: EmbeddedObject { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - - - - - - -@interface RealmSwiftObject (SWIFT_EXTENSION(RealmSwift)) -/// Indicates if the object can no longer be accessed because it is now invalid. -/// An object can no longer be accessed if the object has been deleted from the Realm that manages it, or if -/// invalidate() is called on that Realm. This property is key-value observable. -@property (nonatomic, readonly, getter=isInvalidated) BOOL invalidated; -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the name of a property to be used as the primary key. -/// Only properties of types String, Int, ObjectId and UUID can be -/// designated as the primary key. Primary key properties enforce uniqueness -/// for each value whenever the property is set, which incurs minor overhead. -/// Indexes are created automatically for primary key properties. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, use -/// @Persisted(primaryKey: true) instead. -/// -/// returns: -/// The name of the property designated as the primary key, or -/// nil if the model has no primary key. -+ (NSString * _Nullable)primaryKey SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the names of properties to ignore. These -/// properties will not be managed by the Realm that manages the object. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, any properties not -/// marked with @Persisted are automatically ignored. -/// -/// returns: -/// An array of property names to ignore. -+ (NSArray * _Nonnull)ignoredProperties SWIFT_WARN_UNUSED_RESULT; -/// Returns an array of property names for properties which should be indexed. -/// Only string, integer, boolean, Date, and NSDate properties are supported. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, use -/// @Persisted(indexed: true) instead. -/// -/// returns: -/// An array of property names. -+ (NSArray * _Nonnull)indexedProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: Object { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// note: -/// In a migration block, when enumerating an old property with a public/private name, you will have to use -/// the old column name instead of the public one to retrieve the property value. -/// \code -/// let migrationBlock = { migration, oldSchemaVersion in -/// migration.enumerateObjects(ofType: "Person", { oldObj, newObj in -/// let oldPropertyValue = oldObj!["first_name"] as! String -/// // Use this value in migration -/// }) -/// } -/// -/// \endcodeThis has to be done as well when renaming a property. -/// \code -/// let migrationBlock = { migration, oldSchemaVersion in -/// migration.renameProperty(onType: "Person", from: "first_name", to: "complete_name") -/// } -/// -/// \endcode -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - -SWIFT_CLASS_NAMED("SwiftUIKVO") SWIFT_AVAILABILITY(watchos,introduced=6.0) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0) -@interface RLMSwiftUIKVO : NSObject -- (void)observeValueForKeyPath:(NSString * _Nullable)keyPath ofObject:(id _Nullable)object change:(NSDictionary * _Nullable)change context:(void * _Nullable)context; -- (nonnull instancetype)init SWIFT_UNAVAILABLE; -+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable"); -@end - - -SWIFT_AVAILABILITY(watchos,introduced=6.0) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0) -@interface RLMSwiftUIKVO (SWIFT_EXTENSION(RealmSwift)) -+ (BOOL)removeObserversFromObject:(NSObject * _Nonnull)object SWIFT_WARN_UNUSED_RESULT; -+ (void)addObserversToObject:(NSObject * _Nonnull)object; -@end - -#endif -#if __has_attribute(external_source_symbol) -# pragma clang attribute pop -#endif -#if defined(__cplusplus) -#endif -#pragma clang diagnostic pop -#endif - -#else -#error unsupported Swift architecture -#endif diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64/RealmSwift.framework/Info.plist b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64/RealmSwift.framework/Info.plist deleted file mode 100644 index 9e410414f..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64/RealmSwift.framework/Info.plist and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/arm64-apple-ios.swiftsourceinfo b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/arm64-apple-ios.swiftsourceinfo deleted file mode 100644 index 8c0a9cd78..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/arm64-apple-ios.swiftsourceinfo and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-ios.abi.json b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-ios.abi.json deleted file mode 100644 index dc109fc09..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-ios.abi.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "ABIRoot": { - "kind": "Root", - "name": "TopLevel", - "printedName": "TopLevel", - "json_format_version": 8 - }, - "ConstValues": [] -} \ No newline at end of file diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-ios.swiftdoc b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-ios.swiftdoc deleted file mode 100644 index 1b1b85c15..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-ios.swiftdoc and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-ios.swiftmodule b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-ios.swiftmodule deleted file mode 100644 index 9b2efbc11..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-ios.swiftmodule and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64/RealmSwift.framework/Modules/module.modulemap b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64/RealmSwift.framework/Modules/module.modulemap deleted file mode 100644 index 5742239a8..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64/RealmSwift.framework/Modules/module.modulemap +++ /dev/null @@ -1,4 +0,0 @@ -framework module RealmSwift { - header "RealmSwift-Swift.h" - requires objc -} diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64/RealmSwift.framework/RealmSwift b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64/RealmSwift.framework/RealmSwift deleted file mode 100755 index 4ff464adc..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64/RealmSwift.framework/RealmSwift and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Headers b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Headers deleted file mode 120000 index a177d2a6b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Headers +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/Headers \ No newline at end of file diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Modules b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Modules deleted file mode 120000 index 5736f3186..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Modules +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/Modules \ No newline at end of file diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/RealmSwift b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/RealmSwift deleted file mode 120000 index d2aa14626..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/RealmSwift +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/RealmSwift \ No newline at end of file diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Resources b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Resources deleted file mode 120000 index 953ee36f3..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Resources +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/Resources \ No newline at end of file diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Versions/A/Headers/RealmSwift-Swift.h b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Versions/A/Headers/RealmSwift-Swift.h deleted file mode 100644 index 37e9dad7b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Versions/A/Headers/RealmSwift-Swift.h +++ /dev/null @@ -1,1450 +0,0 @@ -#if 0 -#elif defined(__arm64__) && __arm64__ -// Generated by Apple Swift version 5.9 (swiftlang-5.9.0.128.106 clang-1500.0.40.1) -#ifndef REALMSWIFT_SWIFT_H -#define REALMSWIFT_SWIFT_H -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wgcc-compat" - -#if !defined(__has_include) -# define __has_include(x) 0 -#endif -#if !defined(__has_attribute) -# define __has_attribute(x) 0 -#endif -#if !defined(__has_feature) -# define __has_feature(x) 0 -#endif -#if !defined(__has_warning) -# define __has_warning(x) 0 -#endif - -#if __has_include() -# include -#endif - -#pragma clang diagnostic ignored "-Wauto-import" -#if defined(__OBJC__) -#include -#endif -#if defined(__cplusplus) -#include -#include -#include -#include -#include -#include -#include -#else -#include -#include -#include -#include -#endif -#if defined(__cplusplus) -#if defined(__arm64e__) && __has_include() -# include -#else -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wreserved-macro-identifier" -# ifndef __ptrauth_swift_value_witness_function_pointer -# define __ptrauth_swift_value_witness_function_pointer(x) -# endif -# ifndef __ptrauth_swift_class_method_pointer -# define __ptrauth_swift_class_method_pointer(x) -# endif -#pragma clang diagnostic pop -#endif -#endif - -#if !defined(SWIFT_TYPEDEFS) -# define SWIFT_TYPEDEFS 1 -# if __has_include() -# include -# elif !defined(__cplusplus) -typedef uint_least16_t char16_t; -typedef uint_least32_t char32_t; -# endif -typedef float swift_float2 __attribute__((__ext_vector_type__(2))); -typedef float swift_float3 __attribute__((__ext_vector_type__(3))); -typedef float swift_float4 __attribute__((__ext_vector_type__(4))); -typedef double swift_double2 __attribute__((__ext_vector_type__(2))); -typedef double swift_double3 __attribute__((__ext_vector_type__(3))); -typedef double swift_double4 __attribute__((__ext_vector_type__(4))); -typedef int swift_int2 __attribute__((__ext_vector_type__(2))); -typedef int swift_int3 __attribute__((__ext_vector_type__(3))); -typedef int swift_int4 __attribute__((__ext_vector_type__(4))); -typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2))); -typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3))); -typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); -#endif - -#if !defined(SWIFT_PASTE) -# define SWIFT_PASTE_HELPER(x, y) x##y -# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y) -#endif -#if !defined(SWIFT_METATYPE) -# define SWIFT_METATYPE(X) Class -#endif -#if !defined(SWIFT_CLASS_PROPERTY) -# if __has_feature(objc_class_property) -# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__ -# else -# define SWIFT_CLASS_PROPERTY(...) -# endif -#endif -#if !defined(SWIFT_RUNTIME_NAME) -# if __has_attribute(objc_runtime_name) -# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) -# else -# define SWIFT_RUNTIME_NAME(X) -# endif -#endif -#if !defined(SWIFT_COMPILE_NAME) -# if __has_attribute(swift_name) -# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) -# else -# define SWIFT_COMPILE_NAME(X) -# endif -#endif -#if !defined(SWIFT_METHOD_FAMILY) -# if __has_attribute(objc_method_family) -# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) -# else -# define SWIFT_METHOD_FAMILY(X) -# endif -#endif -#if !defined(SWIFT_NOESCAPE) -# if __has_attribute(noescape) -# define SWIFT_NOESCAPE __attribute__((noescape)) -# else -# define SWIFT_NOESCAPE -# endif -#endif -#if !defined(SWIFT_RELEASES_ARGUMENT) -# if __has_attribute(ns_consumed) -# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) -# else -# define SWIFT_RELEASES_ARGUMENT -# endif -#endif -#if !defined(SWIFT_WARN_UNUSED_RESULT) -# if __has_attribute(warn_unused_result) -# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) -# else -# define SWIFT_WARN_UNUSED_RESULT -# endif -#endif -#if !defined(SWIFT_NORETURN) -# if __has_attribute(noreturn) -# define SWIFT_NORETURN __attribute__((noreturn)) -# else -# define SWIFT_NORETURN -# endif -#endif -#if !defined(SWIFT_CLASS_EXTRA) -# define SWIFT_CLASS_EXTRA -#endif -#if !defined(SWIFT_PROTOCOL_EXTRA) -# define SWIFT_PROTOCOL_EXTRA -#endif -#if !defined(SWIFT_ENUM_EXTRA) -# define SWIFT_ENUM_EXTRA -#endif -#if !defined(SWIFT_CLASS) -# if __has_attribute(objc_subclassing_restricted) -# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA -# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# else -# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# endif -#endif -#if !defined(SWIFT_RESILIENT_CLASS) -# if __has_attribute(objc_class_stub) -# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub)) -# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME) -# else -# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) -# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME) -# endif -#endif -#if !defined(SWIFT_PROTOCOL) -# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA -# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA -#endif -#if !defined(SWIFT_EXTENSION) -# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__) -#endif -#if !defined(OBJC_DESIGNATED_INITIALIZER) -# if __has_attribute(objc_designated_initializer) -# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) -# else -# define OBJC_DESIGNATED_INITIALIZER -# endif -#endif -#if !defined(SWIFT_ENUM_ATTR) -# if __has_attribute(enum_extensibility) -# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility))) -# else -# define SWIFT_ENUM_ATTR(_extensibility) -# endif -#endif -#if !defined(SWIFT_ENUM) -# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type -# if __has_feature(generalized_swift_name) -# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type -# else -# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility) -# endif -#endif -#if !defined(SWIFT_UNAVAILABLE) -# define SWIFT_UNAVAILABLE __attribute__((unavailable)) -#endif -#if !defined(SWIFT_UNAVAILABLE_MSG) -# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg))) -#endif -#if !defined(SWIFT_AVAILABILITY) -# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__))) -#endif -#if !defined(SWIFT_WEAK_IMPORT) -# define SWIFT_WEAK_IMPORT __attribute__((weak_import)) -#endif -#if !defined(SWIFT_DEPRECATED) -# define SWIFT_DEPRECATED __attribute__((deprecated)) -#endif -#if !defined(SWIFT_DEPRECATED_MSG) -# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__))) -#endif -#if !defined(SWIFT_DEPRECATED_OBJC) -# if __has_feature(attribute_diagnose_if_objc) -# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) -# else -# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) -# endif -#endif -#if defined(__OBJC__) -#if !defined(IBSegueAction) -# define IBSegueAction -#endif -#endif -#if !defined(SWIFT_EXTERN) -# if defined(__cplusplus) -# define SWIFT_EXTERN extern "C" -# else -# define SWIFT_EXTERN extern -# endif -#endif -#if !defined(SWIFT_CALL) -# define SWIFT_CALL __attribute__((swiftcall)) -#endif -#if !defined(SWIFT_INDIRECT_RESULT) -# define SWIFT_INDIRECT_RESULT __attribute__((swift_indirect_result)) -#endif -#if !defined(SWIFT_CONTEXT) -# define SWIFT_CONTEXT __attribute__((swift_context)) -#endif -#if !defined(SWIFT_ERROR_RESULT) -# define SWIFT_ERROR_RESULT __attribute__((swift_error_result)) -#endif -#if defined(__cplusplus) -# define SWIFT_NOEXCEPT noexcept -#else -# define SWIFT_NOEXCEPT -#endif -#if !defined(SWIFT_C_INLINE_THUNK) -# if __has_attribute(always_inline) -# if __has_attribute(nodebug) -# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) __attribute__((nodebug)) -# else -# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) -# endif -# else -# define SWIFT_C_INLINE_THUNK inline -# endif -#endif -#if defined(_WIN32) -#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) -# define SWIFT_IMPORT_STDLIB_SYMBOL __declspec(dllimport) -#endif -#else -#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) -# define SWIFT_IMPORT_STDLIB_SYMBOL -#endif -#endif -#if defined(__OBJC__) -#if __has_feature(objc_modules) -#if __has_warning("-Watimport-in-framework-header") -#pragma clang diagnostic ignored "-Watimport-in-framework-header" -#endif -@import Foundation; -@import ObjectiveC; -@import Realm; -@import Realm.Swift; -#endif - -#endif -#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch" -#pragma clang diagnostic ignored "-Wduplicate-method-arg" -#if __has_warning("-Wpragma-clang-attribute") -# pragma clang diagnostic ignored "-Wpragma-clang-attribute" -#endif -#pragma clang diagnostic ignored "-Wunknown-pragmas" -#pragma clang diagnostic ignored "-Wnullability" -#pragma clang diagnostic ignored "-Wdollar-in-identifier-extension" - -#if __has_attribute(external_source_symbol) -# pragma push_macro("any") -# undef any -# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="RealmSwift",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol)) -# pragma pop_macro("any") -#endif - -#if defined(__OBJC__) -@class NSString; - -/// A type which has a custom representation in Realm events. -/// By default, objects are serialized to JSON using built-in rules which -/// include every property. If you wish to customize how a class is serialized -/// in events, you can declare it as conforming to this protocol and -/// define customEventRepresentation(). -SWIFT_PROTOCOL_NAMED("CustomEventRepresentable") -@protocol RLMCustomEventRepresentable -/// Get the custom event serialization for this object. -/// This function must return a valid JSON String, as this is included in a -/// larger JSON document. Implementations of this function should be “pure” -/// and access no data other than that which is obtainable from the Object -/// it is called on, and it should not mutate the object which it is called -/// on. This function is called on a background thread in a somewhat -/// unusual context, and attempting to access other data is likely to cause -/// problems. -- (NSString * _Nonnull)customEventRepresentation SWIFT_WARN_UNUSED_RESULT; -@end - -@class NSNumber; - -/// A 128-bit IEEE 754-2008 decimal floating point number. -/// This type is similar to Swift’s built-in Decimal type, but allocates bits differently, resulting in a different representable range. (NS)Decimal stores a significand of up to 38 digits long and an exponent from -128 to 127, while this type stores up to 34 digits of significand and an exponent from -6143 to 6144. -SWIFT_CLASS_NAMED("Decimal128") -@interface RealmSwiftDecimal128 : RLMDecimal128 -/// Creates a new zero-initialized Decimal128. -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -/// Converts the given value to a Decimal128. -/// The following types can be converted to Decimal128: -///
    -///
  • -/// Int (of any size) -///
  • -///
  • -/// Float -///
  • -///
  • -/// Double -///
  • -///
  • -/// String -///
  • -///
  • -/// NSNumber -///
  • -///
  • -/// Decimal -///
  • -///
-/// Passing a value with a type not in this list is a fatal error. Passing a string which cannot be parsed as a valid Decimal128 is a fatal error. -/// \param value The value to convert to a Decimal128. -/// -- (nonnull instancetype)initWithValue:(id _Nonnull)value OBJC_DESIGNATED_INITIALIZER; -/// Converts the given number to a Decimal128. -/// This initializer cannot fail and is never lossy. -/// \param number The number to convert to a Decimal128. -/// -- (nonnull instancetype)initWithNumber:(NSNumber * _Nonnull)number OBJC_DESIGNATED_INITIALIZER; -/// Parse the given string as a Decimal128. -/// This initializer never throws and is marked as throws only because removing it is a breaking -/// change. Strings which cannot be parsed as a Decimal128 return a value where isNaN is true. -/// \param string The string to parse. -/// -- (nullable instancetype)initWithString:(NSString * _Nonnull)string error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER; -@end - - - - - - - - - - - - - - - - - - -@class RLMObjectSchema; - -/// Object interface which allows untyped getters and setters for Objects. -/// :nodoc: -SWIFT_CLASS_NAMED("DynamicObject") -@interface RealmSwiftDynamicObject : RealmSwiftObject -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)value forKeyedSubscript:(NSString * _Nonnull)key; -/// :nodoc: -- (id _Nullable)valueForUndefinedKey:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -- (void)setValue:(id _Nullable)value forUndefinedKey:(NSString * _Nonnull)key; -/// :nodoc: -+ (BOOL)shouldIncludeInDefaultSchema SWIFT_WARN_UNUSED_RESULT; -+ (RLMObjectSchema * _Nullable)sharedSchema SWIFT_WARN_UNUSED_RESULT; -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -@end - - - - - - - - - - - - - - - -@class NSDate; - -/// A 12-byte (probably) unique object identifier. -/// ObjectIds are similar to a GUID or a UUID, and can be used to uniquely identify objects without a centralized ID generator. An ObjectID consists of: -///
    -///
  1. -/// A 4 byte timestamp measuring the creation time of the ObjectId in seconds since the Unix epoch. -///
  2. -///
  3. -/// A 5 byte random value -///
  4. -///
  5. -/// A 3 byte counter, initialized to a random value. -///
  6. -///
-/// ObjectIds are intended to be fast to generate. Sorting by an ObjectId field will typically result in the objects being sorted in creation order. -SWIFT_CLASS_NAMED("ObjectId") -@interface RealmSwiftObjectId : RLMObjectId -/// Creates a new zero-initialized ObjectId. -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -/// Creates a new randomly-initialized ObjectId. -+ (RealmSwiftObjectId * _Nonnull)objectId SWIFT_WARN_UNUSED_RESULT; -/// Creates a new ObjectId from the given 24-byte hexadecimal string. -/// Throws if the string is not 24 characters or contains any characters other than 0-9a-fA-F. -/// \param string The string to parse. -/// -- (nullable instancetype)initWithString:(NSString * _Nonnull)string error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER; -- (nonnull instancetype)initWithTimestamp:(NSDate * _Nonnull)timestamp machineIdentifier:(int32_t)machineIdentifier processIdentifier:(int32_t)processIdentifier SWIFT_UNAVAILABLE; -@end - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -@class RLMProperty; - -@interface RealmSwiftAsymmetricObject (SWIFT_EXTENSION(RealmSwift)) -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: AsymmetricObject { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - - - - -@interface RealmSwiftEmbeddedObject (SWIFT_EXTENSION(RealmSwift)) -/// :nodoc: -+ (BOOL)isEmbedded SWIFT_WARN_UNUSED_RESULT; -/// Indicates if the object can no longer be accessed because it is now invalid. -/// An object can no longer be accessed if the object has been deleted from the Realm that manages it, or if -/// invalidate() is called on that Realm. -@property (nonatomic, readonly, getter=isInvalidated) BOOL invalidated; -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the names of properties to ignore. These properties will not be managed by -/// the Realm that manages the object. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, any properties not -/// marked with @Persisted are automatically ignored. -/// -/// returns: -/// An array of property names to ignore. -+ (NSArray * _Nonnull)ignoredProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: EmbeddedObject { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - - - - - - -@interface RealmSwiftObject (SWIFT_EXTENSION(RealmSwift)) -/// Indicates if the object can no longer be accessed because it is now invalid. -/// An object can no longer be accessed if the object has been deleted from the Realm that manages it, or if -/// invalidate() is called on that Realm. This property is key-value observable. -@property (nonatomic, readonly, getter=isInvalidated) BOOL invalidated; -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the name of a property to be used as the primary key. -/// Only properties of types String, Int, ObjectId and UUID can be -/// designated as the primary key. Primary key properties enforce uniqueness -/// for each value whenever the property is set, which incurs minor overhead. -/// Indexes are created automatically for primary key properties. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, use -/// @Persisted(primaryKey: true) instead. -/// -/// returns: -/// The name of the property designated as the primary key, or -/// nil if the model has no primary key. -+ (NSString * _Nullable)primaryKey SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the names of properties to ignore. These -/// properties will not be managed by the Realm that manages the object. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, any properties not -/// marked with @Persisted are automatically ignored. -/// -/// returns: -/// An array of property names to ignore. -+ (NSArray * _Nonnull)ignoredProperties SWIFT_WARN_UNUSED_RESULT; -/// Returns an array of property names for properties which should be indexed. -/// Only string, integer, boolean, Date, and NSDate properties are supported. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, use -/// @Persisted(indexed: true) instead. -/// -/// returns: -/// An array of property names. -+ (NSArray * _Nonnull)indexedProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: Object { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// note: -/// In a migration block, when enumerating an old property with a public/private name, you will have to use -/// the old column name instead of the public one to retrieve the property value. -/// \code -/// let migrationBlock = { migration, oldSchemaVersion in -/// migration.enumerateObjects(ofType: "Person", { oldObj, newObj in -/// let oldPropertyValue = oldObj!["first_name"] as! String -/// // Use this value in migration -/// }) -/// } -/// -/// \endcodeThis has to be done as well when renaming a property. -/// \code -/// let migrationBlock = { migration, oldSchemaVersion in -/// migration.renameProperty(onType: "Person", from: "first_name", to: "complete_name") -/// } -/// -/// \endcode -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - -SWIFT_CLASS_NAMED("SwiftUIKVO") SWIFT_AVAILABILITY(watchos,introduced=6.0) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0) -@interface RLMSwiftUIKVO : NSObject -- (void)observeValueForKeyPath:(NSString * _Nullable)keyPath ofObject:(id _Nullable)object change:(NSDictionary * _Nullable)change context:(void * _Nullable)context; -- (nonnull instancetype)init SWIFT_UNAVAILABLE; -+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable"); -@end - - -SWIFT_AVAILABILITY(watchos,introduced=6.0) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0) -@interface RLMSwiftUIKVO (SWIFT_EXTENSION(RealmSwift)) -+ (BOOL)removeObserversFromObject:(NSObject * _Nonnull)object SWIFT_WARN_UNUSED_RESULT; -+ (void)addObserversToObject:(NSObject * _Nonnull)object; -@end - -#endif -#if __has_attribute(external_source_symbol) -# pragma clang attribute pop -#endif -#if defined(__cplusplus) -#endif -#pragma clang diagnostic pop -#endif - -#elif defined(__x86_64__) && __x86_64__ -// Generated by Apple Swift version 5.9 (swiftlang-5.9.0.128.106 clang-1500.0.40.1) -#ifndef REALMSWIFT_SWIFT_H -#define REALMSWIFT_SWIFT_H -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wgcc-compat" - -#if !defined(__has_include) -# define __has_include(x) 0 -#endif -#if !defined(__has_attribute) -# define __has_attribute(x) 0 -#endif -#if !defined(__has_feature) -# define __has_feature(x) 0 -#endif -#if !defined(__has_warning) -# define __has_warning(x) 0 -#endif - -#if __has_include() -# include -#endif - -#pragma clang diagnostic ignored "-Wauto-import" -#if defined(__OBJC__) -#include -#endif -#if defined(__cplusplus) -#include -#include -#include -#include -#include -#include -#include -#else -#include -#include -#include -#include -#endif -#if defined(__cplusplus) -#if defined(__arm64e__) && __has_include() -# include -#else -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wreserved-macro-identifier" -# ifndef __ptrauth_swift_value_witness_function_pointer -# define __ptrauth_swift_value_witness_function_pointer(x) -# endif -# ifndef __ptrauth_swift_class_method_pointer -# define __ptrauth_swift_class_method_pointer(x) -# endif -#pragma clang diagnostic pop -#endif -#endif - -#if !defined(SWIFT_TYPEDEFS) -# define SWIFT_TYPEDEFS 1 -# if __has_include() -# include -# elif !defined(__cplusplus) -typedef uint_least16_t char16_t; -typedef uint_least32_t char32_t; -# endif -typedef float swift_float2 __attribute__((__ext_vector_type__(2))); -typedef float swift_float3 __attribute__((__ext_vector_type__(3))); -typedef float swift_float4 __attribute__((__ext_vector_type__(4))); -typedef double swift_double2 __attribute__((__ext_vector_type__(2))); -typedef double swift_double3 __attribute__((__ext_vector_type__(3))); -typedef double swift_double4 __attribute__((__ext_vector_type__(4))); -typedef int swift_int2 __attribute__((__ext_vector_type__(2))); -typedef int swift_int3 __attribute__((__ext_vector_type__(3))); -typedef int swift_int4 __attribute__((__ext_vector_type__(4))); -typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2))); -typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3))); -typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); -#endif - -#if !defined(SWIFT_PASTE) -# define SWIFT_PASTE_HELPER(x, y) x##y -# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y) -#endif -#if !defined(SWIFT_METATYPE) -# define SWIFT_METATYPE(X) Class -#endif -#if !defined(SWIFT_CLASS_PROPERTY) -# if __has_feature(objc_class_property) -# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__ -# else -# define SWIFT_CLASS_PROPERTY(...) -# endif -#endif -#if !defined(SWIFT_RUNTIME_NAME) -# if __has_attribute(objc_runtime_name) -# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) -# else -# define SWIFT_RUNTIME_NAME(X) -# endif -#endif -#if !defined(SWIFT_COMPILE_NAME) -# if __has_attribute(swift_name) -# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) -# else -# define SWIFT_COMPILE_NAME(X) -# endif -#endif -#if !defined(SWIFT_METHOD_FAMILY) -# if __has_attribute(objc_method_family) -# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) -# else -# define SWIFT_METHOD_FAMILY(X) -# endif -#endif -#if !defined(SWIFT_NOESCAPE) -# if __has_attribute(noescape) -# define SWIFT_NOESCAPE __attribute__((noescape)) -# else -# define SWIFT_NOESCAPE -# endif -#endif -#if !defined(SWIFT_RELEASES_ARGUMENT) -# if __has_attribute(ns_consumed) -# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) -# else -# define SWIFT_RELEASES_ARGUMENT -# endif -#endif -#if !defined(SWIFT_WARN_UNUSED_RESULT) -# if __has_attribute(warn_unused_result) -# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) -# else -# define SWIFT_WARN_UNUSED_RESULT -# endif -#endif -#if !defined(SWIFT_NORETURN) -# if __has_attribute(noreturn) -# define SWIFT_NORETURN __attribute__((noreturn)) -# else -# define SWIFT_NORETURN -# endif -#endif -#if !defined(SWIFT_CLASS_EXTRA) -# define SWIFT_CLASS_EXTRA -#endif -#if !defined(SWIFT_PROTOCOL_EXTRA) -# define SWIFT_PROTOCOL_EXTRA -#endif -#if !defined(SWIFT_ENUM_EXTRA) -# define SWIFT_ENUM_EXTRA -#endif -#if !defined(SWIFT_CLASS) -# if __has_attribute(objc_subclassing_restricted) -# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA -# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# else -# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# endif -#endif -#if !defined(SWIFT_RESILIENT_CLASS) -# if __has_attribute(objc_class_stub) -# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub)) -# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME) -# else -# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) -# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME) -# endif -#endif -#if !defined(SWIFT_PROTOCOL) -# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA -# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA -#endif -#if !defined(SWIFT_EXTENSION) -# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__) -#endif -#if !defined(OBJC_DESIGNATED_INITIALIZER) -# if __has_attribute(objc_designated_initializer) -# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) -# else -# define OBJC_DESIGNATED_INITIALIZER -# endif -#endif -#if !defined(SWIFT_ENUM_ATTR) -# if __has_attribute(enum_extensibility) -# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility))) -# else -# define SWIFT_ENUM_ATTR(_extensibility) -# endif -#endif -#if !defined(SWIFT_ENUM) -# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type -# if __has_feature(generalized_swift_name) -# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type -# else -# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility) -# endif -#endif -#if !defined(SWIFT_UNAVAILABLE) -# define SWIFT_UNAVAILABLE __attribute__((unavailable)) -#endif -#if !defined(SWIFT_UNAVAILABLE_MSG) -# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg))) -#endif -#if !defined(SWIFT_AVAILABILITY) -# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__))) -#endif -#if !defined(SWIFT_WEAK_IMPORT) -# define SWIFT_WEAK_IMPORT __attribute__((weak_import)) -#endif -#if !defined(SWIFT_DEPRECATED) -# define SWIFT_DEPRECATED __attribute__((deprecated)) -#endif -#if !defined(SWIFT_DEPRECATED_MSG) -# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__))) -#endif -#if !defined(SWIFT_DEPRECATED_OBJC) -# if __has_feature(attribute_diagnose_if_objc) -# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) -# else -# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) -# endif -#endif -#if defined(__OBJC__) -#if !defined(IBSegueAction) -# define IBSegueAction -#endif -#endif -#if !defined(SWIFT_EXTERN) -# if defined(__cplusplus) -# define SWIFT_EXTERN extern "C" -# else -# define SWIFT_EXTERN extern -# endif -#endif -#if !defined(SWIFT_CALL) -# define SWIFT_CALL __attribute__((swiftcall)) -#endif -#if !defined(SWIFT_INDIRECT_RESULT) -# define SWIFT_INDIRECT_RESULT __attribute__((swift_indirect_result)) -#endif -#if !defined(SWIFT_CONTEXT) -# define SWIFT_CONTEXT __attribute__((swift_context)) -#endif -#if !defined(SWIFT_ERROR_RESULT) -# define SWIFT_ERROR_RESULT __attribute__((swift_error_result)) -#endif -#if defined(__cplusplus) -# define SWIFT_NOEXCEPT noexcept -#else -# define SWIFT_NOEXCEPT -#endif -#if !defined(SWIFT_C_INLINE_THUNK) -# if __has_attribute(always_inline) -# if __has_attribute(nodebug) -# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) __attribute__((nodebug)) -# else -# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) -# endif -# else -# define SWIFT_C_INLINE_THUNK inline -# endif -#endif -#if defined(_WIN32) -#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) -# define SWIFT_IMPORT_STDLIB_SYMBOL __declspec(dllimport) -#endif -#else -#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) -# define SWIFT_IMPORT_STDLIB_SYMBOL -#endif -#endif -#if defined(__OBJC__) -#if __has_feature(objc_modules) -#if __has_warning("-Watimport-in-framework-header") -#pragma clang diagnostic ignored "-Watimport-in-framework-header" -#endif -@import Foundation; -@import ObjectiveC; -@import Realm; -@import Realm.Swift; -#endif - -#endif -#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch" -#pragma clang diagnostic ignored "-Wduplicate-method-arg" -#if __has_warning("-Wpragma-clang-attribute") -# pragma clang diagnostic ignored "-Wpragma-clang-attribute" -#endif -#pragma clang diagnostic ignored "-Wunknown-pragmas" -#pragma clang diagnostic ignored "-Wnullability" -#pragma clang diagnostic ignored "-Wdollar-in-identifier-extension" - -#if __has_attribute(external_source_symbol) -# pragma push_macro("any") -# undef any -# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="RealmSwift",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol)) -# pragma pop_macro("any") -#endif - -#if defined(__OBJC__) -@class NSString; - -/// A type which has a custom representation in Realm events. -/// By default, objects are serialized to JSON using built-in rules which -/// include every property. If you wish to customize how a class is serialized -/// in events, you can declare it as conforming to this protocol and -/// define customEventRepresentation(). -SWIFT_PROTOCOL_NAMED("CustomEventRepresentable") -@protocol RLMCustomEventRepresentable -/// Get the custom event serialization for this object. -/// This function must return a valid JSON String, as this is included in a -/// larger JSON document. Implementations of this function should be “pure” -/// and access no data other than that which is obtainable from the Object -/// it is called on, and it should not mutate the object which it is called -/// on. This function is called on a background thread in a somewhat -/// unusual context, and attempting to access other data is likely to cause -/// problems. -- (NSString * _Nonnull)customEventRepresentation SWIFT_WARN_UNUSED_RESULT; -@end - -@class NSNumber; - -/// A 128-bit IEEE 754-2008 decimal floating point number. -/// This type is similar to Swift’s built-in Decimal type, but allocates bits differently, resulting in a different representable range. (NS)Decimal stores a significand of up to 38 digits long and an exponent from -128 to 127, while this type stores up to 34 digits of significand and an exponent from -6143 to 6144. -SWIFT_CLASS_NAMED("Decimal128") -@interface RealmSwiftDecimal128 : RLMDecimal128 -/// Creates a new zero-initialized Decimal128. -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -/// Converts the given value to a Decimal128. -/// The following types can be converted to Decimal128: -///
    -///
  • -/// Int (of any size) -///
  • -///
  • -/// Float -///
  • -///
  • -/// Double -///
  • -///
  • -/// String -///
  • -///
  • -/// NSNumber -///
  • -///
  • -/// Decimal -///
  • -///
-/// Passing a value with a type not in this list is a fatal error. Passing a string which cannot be parsed as a valid Decimal128 is a fatal error. -/// \param value The value to convert to a Decimal128. -/// -- (nonnull instancetype)initWithValue:(id _Nonnull)value OBJC_DESIGNATED_INITIALIZER; -/// Converts the given number to a Decimal128. -/// This initializer cannot fail and is never lossy. -/// \param number The number to convert to a Decimal128. -/// -- (nonnull instancetype)initWithNumber:(NSNumber * _Nonnull)number OBJC_DESIGNATED_INITIALIZER; -/// Parse the given string as a Decimal128. -/// This initializer never throws and is marked as throws only because removing it is a breaking -/// change. Strings which cannot be parsed as a Decimal128 return a value where isNaN is true. -/// \param string The string to parse. -/// -- (nullable instancetype)initWithString:(NSString * _Nonnull)string error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER; -@end - - - - - - - - - - - - - - - - - - -@class RLMObjectSchema; - -/// Object interface which allows untyped getters and setters for Objects. -/// :nodoc: -SWIFT_CLASS_NAMED("DynamicObject") -@interface RealmSwiftDynamicObject : RealmSwiftObject -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)value forKeyedSubscript:(NSString * _Nonnull)key; -/// :nodoc: -- (id _Nullable)valueForUndefinedKey:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -- (void)setValue:(id _Nullable)value forUndefinedKey:(NSString * _Nonnull)key; -/// :nodoc: -+ (BOOL)shouldIncludeInDefaultSchema SWIFT_WARN_UNUSED_RESULT; -+ (RLMObjectSchema * _Nullable)sharedSchema SWIFT_WARN_UNUSED_RESULT; -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -@end - - - - - - - - - - - - - - - -@class NSDate; - -/// A 12-byte (probably) unique object identifier. -/// ObjectIds are similar to a GUID or a UUID, and can be used to uniquely identify objects without a centralized ID generator. An ObjectID consists of: -///
    -///
  1. -/// A 4 byte timestamp measuring the creation time of the ObjectId in seconds since the Unix epoch. -///
  2. -///
  3. -/// A 5 byte random value -///
  4. -///
  5. -/// A 3 byte counter, initialized to a random value. -///
  6. -///
-/// ObjectIds are intended to be fast to generate. Sorting by an ObjectId field will typically result in the objects being sorted in creation order. -SWIFT_CLASS_NAMED("ObjectId") -@interface RealmSwiftObjectId : RLMObjectId -/// Creates a new zero-initialized ObjectId. -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -/// Creates a new randomly-initialized ObjectId. -+ (RealmSwiftObjectId * _Nonnull)objectId SWIFT_WARN_UNUSED_RESULT; -/// Creates a new ObjectId from the given 24-byte hexadecimal string. -/// Throws if the string is not 24 characters or contains any characters other than 0-9a-fA-F. -/// \param string The string to parse. -/// -- (nullable instancetype)initWithString:(NSString * _Nonnull)string error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER; -- (nonnull instancetype)initWithTimestamp:(NSDate * _Nonnull)timestamp machineIdentifier:(int32_t)machineIdentifier processIdentifier:(int32_t)processIdentifier SWIFT_UNAVAILABLE; -@end - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -@class RLMProperty; - -@interface RealmSwiftAsymmetricObject (SWIFT_EXTENSION(RealmSwift)) -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: AsymmetricObject { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - - - - -@interface RealmSwiftEmbeddedObject (SWIFT_EXTENSION(RealmSwift)) -/// :nodoc: -+ (BOOL)isEmbedded SWIFT_WARN_UNUSED_RESULT; -/// Indicates if the object can no longer be accessed because it is now invalid. -/// An object can no longer be accessed if the object has been deleted from the Realm that manages it, or if -/// invalidate() is called on that Realm. -@property (nonatomic, readonly, getter=isInvalidated) BOOL invalidated; -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the names of properties to ignore. These properties will not be managed by -/// the Realm that manages the object. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, any properties not -/// marked with @Persisted are automatically ignored. -/// -/// returns: -/// An array of property names to ignore. -+ (NSArray * _Nonnull)ignoredProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: EmbeddedObject { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - - - - - - -@interface RealmSwiftObject (SWIFT_EXTENSION(RealmSwift)) -/// Indicates if the object can no longer be accessed because it is now invalid. -/// An object can no longer be accessed if the object has been deleted from the Realm that manages it, or if -/// invalidate() is called on that Realm. This property is key-value observable. -@property (nonatomic, readonly, getter=isInvalidated) BOOL invalidated; -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the name of a property to be used as the primary key. -/// Only properties of types String, Int, ObjectId and UUID can be -/// designated as the primary key. Primary key properties enforce uniqueness -/// for each value whenever the property is set, which incurs minor overhead. -/// Indexes are created automatically for primary key properties. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, use -/// @Persisted(primaryKey: true) instead. -/// -/// returns: -/// The name of the property designated as the primary key, or -/// nil if the model has no primary key. -+ (NSString * _Nullable)primaryKey SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the names of properties to ignore. These -/// properties will not be managed by the Realm that manages the object. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, any properties not -/// marked with @Persisted are automatically ignored. -/// -/// returns: -/// An array of property names to ignore. -+ (NSArray * _Nonnull)ignoredProperties SWIFT_WARN_UNUSED_RESULT; -/// Returns an array of property names for properties which should be indexed. -/// Only string, integer, boolean, Date, and NSDate properties are supported. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, use -/// @Persisted(indexed: true) instead. -/// -/// returns: -/// An array of property names. -+ (NSArray * _Nonnull)indexedProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: Object { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// note: -/// In a migration block, when enumerating an old property with a public/private name, you will have to use -/// the old column name instead of the public one to retrieve the property value. -/// \code -/// let migrationBlock = { migration, oldSchemaVersion in -/// migration.enumerateObjects(ofType: "Person", { oldObj, newObj in -/// let oldPropertyValue = oldObj!["first_name"] as! String -/// // Use this value in migration -/// }) -/// } -/// -/// \endcodeThis has to be done as well when renaming a property. -/// \code -/// let migrationBlock = { migration, oldSchemaVersion in -/// migration.renameProperty(onType: "Person", from: "first_name", to: "complete_name") -/// } -/// -/// \endcode -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - -SWIFT_CLASS_NAMED("SwiftUIKVO") SWIFT_AVAILABILITY(watchos,introduced=6.0) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0) -@interface RLMSwiftUIKVO : NSObject -- (void)observeValueForKeyPath:(NSString * _Nullable)keyPath ofObject:(id _Nullable)object change:(NSDictionary * _Nullable)change context:(void * _Nullable)context; -- (nonnull instancetype)init SWIFT_UNAVAILABLE; -+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable"); -@end - - -SWIFT_AVAILABILITY(watchos,introduced=6.0) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0) -@interface RLMSwiftUIKVO (SWIFT_EXTENSION(RealmSwift)) -+ (BOOL)removeObserversFromObject:(NSObject * _Nonnull)object SWIFT_WARN_UNUSED_RESULT; -+ (void)addObserversToObject:(NSObject * _Nonnull)object; -@end - -#endif -#if __has_attribute(external_source_symbol) -# pragma clang attribute pop -#endif -#if defined(__cplusplus) -#endif -#pragma clang diagnostic pop -#endif - -#else -#error unsupported Swift architecture -#endif diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/Project/arm64-apple-ios-macabi.swiftsourceinfo b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/Project/arm64-apple-ios-macabi.swiftsourceinfo deleted file mode 100644 index 5dac7dc6e..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/Project/arm64-apple-ios-macabi.swiftsourceinfo and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/Project/x86_64-apple-ios-macabi.swiftsourceinfo b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/Project/x86_64-apple-ios-macabi.swiftsourceinfo deleted file mode 100644 index 1f81771d6..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/Project/x86_64-apple-ios-macabi.swiftsourceinfo and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/arm64-apple-ios-macabi.abi.json b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/arm64-apple-ios-macabi.abi.json deleted file mode 100644 index dc109fc09..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/arm64-apple-ios-macabi.abi.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "ABIRoot": { - "kind": "Root", - "name": "TopLevel", - "printedName": "TopLevel", - "json_format_version": 8 - }, - "ConstValues": [] -} \ No newline at end of file diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/arm64-apple-ios-macabi.swiftdoc b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/arm64-apple-ios-macabi.swiftdoc deleted file mode 100644 index e85906e17..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/arm64-apple-ios-macabi.swiftdoc and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/arm64-apple-ios-macabi.swiftmodule b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/arm64-apple-ios-macabi.swiftmodule deleted file mode 100644 index accbac444..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/arm64-apple-ios-macabi.swiftmodule and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/x86_64-apple-ios-macabi.abi.json b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/x86_64-apple-ios-macabi.abi.json deleted file mode 100644 index dc109fc09..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/x86_64-apple-ios-macabi.abi.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "ABIRoot": { - "kind": "Root", - "name": "TopLevel", - "printedName": "TopLevel", - "json_format_version": 8 - }, - "ConstValues": [] -} \ No newline at end of file diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/x86_64-apple-ios-macabi.swiftdoc b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/x86_64-apple-ios-macabi.swiftdoc deleted file mode 100644 index ef61e5bad..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/x86_64-apple-ios-macabi.swiftdoc and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/x86_64-apple-ios-macabi.swiftmodule b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/x86_64-apple-ios-macabi.swiftmodule deleted file mode 100644 index 84df5eb0c..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/x86_64-apple-ios-macabi.swiftmodule and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Versions/A/Modules/module.modulemap b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Versions/A/Modules/module.modulemap deleted file mode 100644 index 5742239a8..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Versions/A/Modules/module.modulemap +++ /dev/null @@ -1,4 +0,0 @@ -framework module RealmSwift { - header "RealmSwift-Swift.h" - requires objc -} diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Versions/A/RealmSwift b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Versions/A/RealmSwift deleted file mode 100755 index c7ee367c0..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Versions/A/RealmSwift and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Versions/A/Resources/Info.plist b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Versions/A/Resources/Info.plist deleted file mode 100644 index 540c97288..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Versions/A/Resources/Info.plist +++ /dev/null @@ -1,55 +0,0 @@ - - - - - BuildMachineOSBuild - 22G91 - CFBundleDevelopmentRegion - English - CFBundleExecutable - RealmSwift - CFBundleIdentifier - io.realm.RealmSwit - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - RealmSwift - CFBundlePackageType - FMWK - CFBundleShortVersionString - 10.42.3 - CFBundleSignature - ???? - CFBundleSupportedPlatforms - - MacOSX - - CFBundleVersion - 10.42.3 - DTCompiler - com.apple.compilers.llvm.clang.1_0 - DTPlatformBuild - - DTPlatformName - macosx - DTPlatformVersion - 14.0 - DTSDKBuild - 23A5326c - DTSDKName - macosx14.0 - DTXcode - 1500 - DTXcodeBuild - 15A5229h - LSMinimumSystemVersion - 10.15 - NSHumanReadableCopyright - Copyright © 2014-2021 Realm. All rights reserved. - UIDeviceFamily - - 2 - 6 - - - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Versions/Current b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Versions/Current deleted file mode 120000 index 8c7e5a667..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-maccatalyst/RealmSwift.framework/Versions/Current +++ /dev/null @@ -1 +0,0 @@ -A \ No newline at end of file diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-simulator/RealmSwift.framework/Headers/RealmSwift-Swift.h b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-simulator/RealmSwift.framework/Headers/RealmSwift-Swift.h deleted file mode 100644 index 37e9dad7b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-simulator/RealmSwift.framework/Headers/RealmSwift-Swift.h +++ /dev/null @@ -1,1450 +0,0 @@ -#if 0 -#elif defined(__arm64__) && __arm64__ -// Generated by Apple Swift version 5.9 (swiftlang-5.9.0.128.106 clang-1500.0.40.1) -#ifndef REALMSWIFT_SWIFT_H -#define REALMSWIFT_SWIFT_H -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wgcc-compat" - -#if !defined(__has_include) -# define __has_include(x) 0 -#endif -#if !defined(__has_attribute) -# define __has_attribute(x) 0 -#endif -#if !defined(__has_feature) -# define __has_feature(x) 0 -#endif -#if !defined(__has_warning) -# define __has_warning(x) 0 -#endif - -#if __has_include() -# include -#endif - -#pragma clang diagnostic ignored "-Wauto-import" -#if defined(__OBJC__) -#include -#endif -#if defined(__cplusplus) -#include -#include -#include -#include -#include -#include -#include -#else -#include -#include -#include -#include -#endif -#if defined(__cplusplus) -#if defined(__arm64e__) && __has_include() -# include -#else -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wreserved-macro-identifier" -# ifndef __ptrauth_swift_value_witness_function_pointer -# define __ptrauth_swift_value_witness_function_pointer(x) -# endif -# ifndef __ptrauth_swift_class_method_pointer -# define __ptrauth_swift_class_method_pointer(x) -# endif -#pragma clang diagnostic pop -#endif -#endif - -#if !defined(SWIFT_TYPEDEFS) -# define SWIFT_TYPEDEFS 1 -# if __has_include() -# include -# elif !defined(__cplusplus) -typedef uint_least16_t char16_t; -typedef uint_least32_t char32_t; -# endif -typedef float swift_float2 __attribute__((__ext_vector_type__(2))); -typedef float swift_float3 __attribute__((__ext_vector_type__(3))); -typedef float swift_float4 __attribute__((__ext_vector_type__(4))); -typedef double swift_double2 __attribute__((__ext_vector_type__(2))); -typedef double swift_double3 __attribute__((__ext_vector_type__(3))); -typedef double swift_double4 __attribute__((__ext_vector_type__(4))); -typedef int swift_int2 __attribute__((__ext_vector_type__(2))); -typedef int swift_int3 __attribute__((__ext_vector_type__(3))); -typedef int swift_int4 __attribute__((__ext_vector_type__(4))); -typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2))); -typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3))); -typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); -#endif - -#if !defined(SWIFT_PASTE) -# define SWIFT_PASTE_HELPER(x, y) x##y -# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y) -#endif -#if !defined(SWIFT_METATYPE) -# define SWIFT_METATYPE(X) Class -#endif -#if !defined(SWIFT_CLASS_PROPERTY) -# if __has_feature(objc_class_property) -# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__ -# else -# define SWIFT_CLASS_PROPERTY(...) -# endif -#endif -#if !defined(SWIFT_RUNTIME_NAME) -# if __has_attribute(objc_runtime_name) -# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) -# else -# define SWIFT_RUNTIME_NAME(X) -# endif -#endif -#if !defined(SWIFT_COMPILE_NAME) -# if __has_attribute(swift_name) -# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) -# else -# define SWIFT_COMPILE_NAME(X) -# endif -#endif -#if !defined(SWIFT_METHOD_FAMILY) -# if __has_attribute(objc_method_family) -# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) -# else -# define SWIFT_METHOD_FAMILY(X) -# endif -#endif -#if !defined(SWIFT_NOESCAPE) -# if __has_attribute(noescape) -# define SWIFT_NOESCAPE __attribute__((noescape)) -# else -# define SWIFT_NOESCAPE -# endif -#endif -#if !defined(SWIFT_RELEASES_ARGUMENT) -# if __has_attribute(ns_consumed) -# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) -# else -# define SWIFT_RELEASES_ARGUMENT -# endif -#endif -#if !defined(SWIFT_WARN_UNUSED_RESULT) -# if __has_attribute(warn_unused_result) -# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) -# else -# define SWIFT_WARN_UNUSED_RESULT -# endif -#endif -#if !defined(SWIFT_NORETURN) -# if __has_attribute(noreturn) -# define SWIFT_NORETURN __attribute__((noreturn)) -# else -# define SWIFT_NORETURN -# endif -#endif -#if !defined(SWIFT_CLASS_EXTRA) -# define SWIFT_CLASS_EXTRA -#endif -#if !defined(SWIFT_PROTOCOL_EXTRA) -# define SWIFT_PROTOCOL_EXTRA -#endif -#if !defined(SWIFT_ENUM_EXTRA) -# define SWIFT_ENUM_EXTRA -#endif -#if !defined(SWIFT_CLASS) -# if __has_attribute(objc_subclassing_restricted) -# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA -# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# else -# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# endif -#endif -#if !defined(SWIFT_RESILIENT_CLASS) -# if __has_attribute(objc_class_stub) -# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub)) -# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME) -# else -# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) -# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME) -# endif -#endif -#if !defined(SWIFT_PROTOCOL) -# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA -# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA -#endif -#if !defined(SWIFT_EXTENSION) -# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__) -#endif -#if !defined(OBJC_DESIGNATED_INITIALIZER) -# if __has_attribute(objc_designated_initializer) -# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) -# else -# define OBJC_DESIGNATED_INITIALIZER -# endif -#endif -#if !defined(SWIFT_ENUM_ATTR) -# if __has_attribute(enum_extensibility) -# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility))) -# else -# define SWIFT_ENUM_ATTR(_extensibility) -# endif -#endif -#if !defined(SWIFT_ENUM) -# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type -# if __has_feature(generalized_swift_name) -# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type -# else -# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility) -# endif -#endif -#if !defined(SWIFT_UNAVAILABLE) -# define SWIFT_UNAVAILABLE __attribute__((unavailable)) -#endif -#if !defined(SWIFT_UNAVAILABLE_MSG) -# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg))) -#endif -#if !defined(SWIFT_AVAILABILITY) -# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__))) -#endif -#if !defined(SWIFT_WEAK_IMPORT) -# define SWIFT_WEAK_IMPORT __attribute__((weak_import)) -#endif -#if !defined(SWIFT_DEPRECATED) -# define SWIFT_DEPRECATED __attribute__((deprecated)) -#endif -#if !defined(SWIFT_DEPRECATED_MSG) -# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__))) -#endif -#if !defined(SWIFT_DEPRECATED_OBJC) -# if __has_feature(attribute_diagnose_if_objc) -# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) -# else -# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) -# endif -#endif -#if defined(__OBJC__) -#if !defined(IBSegueAction) -# define IBSegueAction -#endif -#endif -#if !defined(SWIFT_EXTERN) -# if defined(__cplusplus) -# define SWIFT_EXTERN extern "C" -# else -# define SWIFT_EXTERN extern -# endif -#endif -#if !defined(SWIFT_CALL) -# define SWIFT_CALL __attribute__((swiftcall)) -#endif -#if !defined(SWIFT_INDIRECT_RESULT) -# define SWIFT_INDIRECT_RESULT __attribute__((swift_indirect_result)) -#endif -#if !defined(SWIFT_CONTEXT) -# define SWIFT_CONTEXT __attribute__((swift_context)) -#endif -#if !defined(SWIFT_ERROR_RESULT) -# define SWIFT_ERROR_RESULT __attribute__((swift_error_result)) -#endif -#if defined(__cplusplus) -# define SWIFT_NOEXCEPT noexcept -#else -# define SWIFT_NOEXCEPT -#endif -#if !defined(SWIFT_C_INLINE_THUNK) -# if __has_attribute(always_inline) -# if __has_attribute(nodebug) -# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) __attribute__((nodebug)) -# else -# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) -# endif -# else -# define SWIFT_C_INLINE_THUNK inline -# endif -#endif -#if defined(_WIN32) -#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) -# define SWIFT_IMPORT_STDLIB_SYMBOL __declspec(dllimport) -#endif -#else -#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) -# define SWIFT_IMPORT_STDLIB_SYMBOL -#endif -#endif -#if defined(__OBJC__) -#if __has_feature(objc_modules) -#if __has_warning("-Watimport-in-framework-header") -#pragma clang diagnostic ignored "-Watimport-in-framework-header" -#endif -@import Foundation; -@import ObjectiveC; -@import Realm; -@import Realm.Swift; -#endif - -#endif -#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch" -#pragma clang diagnostic ignored "-Wduplicate-method-arg" -#if __has_warning("-Wpragma-clang-attribute") -# pragma clang diagnostic ignored "-Wpragma-clang-attribute" -#endif -#pragma clang diagnostic ignored "-Wunknown-pragmas" -#pragma clang diagnostic ignored "-Wnullability" -#pragma clang diagnostic ignored "-Wdollar-in-identifier-extension" - -#if __has_attribute(external_source_symbol) -# pragma push_macro("any") -# undef any -# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="RealmSwift",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol)) -# pragma pop_macro("any") -#endif - -#if defined(__OBJC__) -@class NSString; - -/// A type which has a custom representation in Realm events. -/// By default, objects are serialized to JSON using built-in rules which -/// include every property. If you wish to customize how a class is serialized -/// in events, you can declare it as conforming to this protocol and -/// define customEventRepresentation(). -SWIFT_PROTOCOL_NAMED("CustomEventRepresentable") -@protocol RLMCustomEventRepresentable -/// Get the custom event serialization for this object. -/// This function must return a valid JSON String, as this is included in a -/// larger JSON document. Implementations of this function should be “pure” -/// and access no data other than that which is obtainable from the Object -/// it is called on, and it should not mutate the object which it is called -/// on. This function is called on a background thread in a somewhat -/// unusual context, and attempting to access other data is likely to cause -/// problems. -- (NSString * _Nonnull)customEventRepresentation SWIFT_WARN_UNUSED_RESULT; -@end - -@class NSNumber; - -/// A 128-bit IEEE 754-2008 decimal floating point number. -/// This type is similar to Swift’s built-in Decimal type, but allocates bits differently, resulting in a different representable range. (NS)Decimal stores a significand of up to 38 digits long and an exponent from -128 to 127, while this type stores up to 34 digits of significand and an exponent from -6143 to 6144. -SWIFT_CLASS_NAMED("Decimal128") -@interface RealmSwiftDecimal128 : RLMDecimal128 -/// Creates a new zero-initialized Decimal128. -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -/// Converts the given value to a Decimal128. -/// The following types can be converted to Decimal128: -///
    -///
  • -/// Int (of any size) -///
  • -///
  • -/// Float -///
  • -///
  • -/// Double -///
  • -///
  • -/// String -///
  • -///
  • -/// NSNumber -///
  • -///
  • -/// Decimal -///
  • -///
-/// Passing a value with a type not in this list is a fatal error. Passing a string which cannot be parsed as a valid Decimal128 is a fatal error. -/// \param value The value to convert to a Decimal128. -/// -- (nonnull instancetype)initWithValue:(id _Nonnull)value OBJC_DESIGNATED_INITIALIZER; -/// Converts the given number to a Decimal128. -/// This initializer cannot fail and is never lossy. -/// \param number The number to convert to a Decimal128. -/// -- (nonnull instancetype)initWithNumber:(NSNumber * _Nonnull)number OBJC_DESIGNATED_INITIALIZER; -/// Parse the given string as a Decimal128. -/// This initializer never throws and is marked as throws only because removing it is a breaking -/// change. Strings which cannot be parsed as a Decimal128 return a value where isNaN is true. -/// \param string The string to parse. -/// -- (nullable instancetype)initWithString:(NSString * _Nonnull)string error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER; -@end - - - - - - - - - - - - - - - - - - -@class RLMObjectSchema; - -/// Object interface which allows untyped getters and setters for Objects. -/// :nodoc: -SWIFT_CLASS_NAMED("DynamicObject") -@interface RealmSwiftDynamicObject : RealmSwiftObject -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)value forKeyedSubscript:(NSString * _Nonnull)key; -/// :nodoc: -- (id _Nullable)valueForUndefinedKey:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -- (void)setValue:(id _Nullable)value forUndefinedKey:(NSString * _Nonnull)key; -/// :nodoc: -+ (BOOL)shouldIncludeInDefaultSchema SWIFT_WARN_UNUSED_RESULT; -+ (RLMObjectSchema * _Nullable)sharedSchema SWIFT_WARN_UNUSED_RESULT; -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -@end - - - - - - - - - - - - - - - -@class NSDate; - -/// A 12-byte (probably) unique object identifier. -/// ObjectIds are similar to a GUID or a UUID, and can be used to uniquely identify objects without a centralized ID generator. An ObjectID consists of: -///
    -///
  1. -/// A 4 byte timestamp measuring the creation time of the ObjectId in seconds since the Unix epoch. -///
  2. -///
  3. -/// A 5 byte random value -///
  4. -///
  5. -/// A 3 byte counter, initialized to a random value. -///
  6. -///
-/// ObjectIds are intended to be fast to generate. Sorting by an ObjectId field will typically result in the objects being sorted in creation order. -SWIFT_CLASS_NAMED("ObjectId") -@interface RealmSwiftObjectId : RLMObjectId -/// Creates a new zero-initialized ObjectId. -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -/// Creates a new randomly-initialized ObjectId. -+ (RealmSwiftObjectId * _Nonnull)objectId SWIFT_WARN_UNUSED_RESULT; -/// Creates a new ObjectId from the given 24-byte hexadecimal string. -/// Throws if the string is not 24 characters or contains any characters other than 0-9a-fA-F. -/// \param string The string to parse. -/// -- (nullable instancetype)initWithString:(NSString * _Nonnull)string error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER; -- (nonnull instancetype)initWithTimestamp:(NSDate * _Nonnull)timestamp machineIdentifier:(int32_t)machineIdentifier processIdentifier:(int32_t)processIdentifier SWIFT_UNAVAILABLE; -@end - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -@class RLMProperty; - -@interface RealmSwiftAsymmetricObject (SWIFT_EXTENSION(RealmSwift)) -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: AsymmetricObject { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - - - - -@interface RealmSwiftEmbeddedObject (SWIFT_EXTENSION(RealmSwift)) -/// :nodoc: -+ (BOOL)isEmbedded SWIFT_WARN_UNUSED_RESULT; -/// Indicates if the object can no longer be accessed because it is now invalid. -/// An object can no longer be accessed if the object has been deleted from the Realm that manages it, or if -/// invalidate() is called on that Realm. -@property (nonatomic, readonly, getter=isInvalidated) BOOL invalidated; -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the names of properties to ignore. These properties will not be managed by -/// the Realm that manages the object. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, any properties not -/// marked with @Persisted are automatically ignored. -/// -/// returns: -/// An array of property names to ignore. -+ (NSArray * _Nonnull)ignoredProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: EmbeddedObject { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - - - - - - -@interface RealmSwiftObject (SWIFT_EXTENSION(RealmSwift)) -/// Indicates if the object can no longer be accessed because it is now invalid. -/// An object can no longer be accessed if the object has been deleted from the Realm that manages it, or if -/// invalidate() is called on that Realm. This property is key-value observable. -@property (nonatomic, readonly, getter=isInvalidated) BOOL invalidated; -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the name of a property to be used as the primary key. -/// Only properties of types String, Int, ObjectId and UUID can be -/// designated as the primary key. Primary key properties enforce uniqueness -/// for each value whenever the property is set, which incurs minor overhead. -/// Indexes are created automatically for primary key properties. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, use -/// @Persisted(primaryKey: true) instead. -/// -/// returns: -/// The name of the property designated as the primary key, or -/// nil if the model has no primary key. -+ (NSString * _Nullable)primaryKey SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the names of properties to ignore. These -/// properties will not be managed by the Realm that manages the object. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, any properties not -/// marked with @Persisted are automatically ignored. -/// -/// returns: -/// An array of property names to ignore. -+ (NSArray * _Nonnull)ignoredProperties SWIFT_WARN_UNUSED_RESULT; -/// Returns an array of property names for properties which should be indexed. -/// Only string, integer, boolean, Date, and NSDate properties are supported. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, use -/// @Persisted(indexed: true) instead. -/// -/// returns: -/// An array of property names. -+ (NSArray * _Nonnull)indexedProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: Object { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// note: -/// In a migration block, when enumerating an old property with a public/private name, you will have to use -/// the old column name instead of the public one to retrieve the property value. -/// \code -/// let migrationBlock = { migration, oldSchemaVersion in -/// migration.enumerateObjects(ofType: "Person", { oldObj, newObj in -/// let oldPropertyValue = oldObj!["first_name"] as! String -/// // Use this value in migration -/// }) -/// } -/// -/// \endcodeThis has to be done as well when renaming a property. -/// \code -/// let migrationBlock = { migration, oldSchemaVersion in -/// migration.renameProperty(onType: "Person", from: "first_name", to: "complete_name") -/// } -/// -/// \endcode -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - -SWIFT_CLASS_NAMED("SwiftUIKVO") SWIFT_AVAILABILITY(watchos,introduced=6.0) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0) -@interface RLMSwiftUIKVO : NSObject -- (void)observeValueForKeyPath:(NSString * _Nullable)keyPath ofObject:(id _Nullable)object change:(NSDictionary * _Nullable)change context:(void * _Nullable)context; -- (nonnull instancetype)init SWIFT_UNAVAILABLE; -+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable"); -@end - - -SWIFT_AVAILABILITY(watchos,introduced=6.0) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0) -@interface RLMSwiftUIKVO (SWIFT_EXTENSION(RealmSwift)) -+ (BOOL)removeObserversFromObject:(NSObject * _Nonnull)object SWIFT_WARN_UNUSED_RESULT; -+ (void)addObserversToObject:(NSObject * _Nonnull)object; -@end - -#endif -#if __has_attribute(external_source_symbol) -# pragma clang attribute pop -#endif -#if defined(__cplusplus) -#endif -#pragma clang diagnostic pop -#endif - -#elif defined(__x86_64__) && __x86_64__ -// Generated by Apple Swift version 5.9 (swiftlang-5.9.0.128.106 clang-1500.0.40.1) -#ifndef REALMSWIFT_SWIFT_H -#define REALMSWIFT_SWIFT_H -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wgcc-compat" - -#if !defined(__has_include) -# define __has_include(x) 0 -#endif -#if !defined(__has_attribute) -# define __has_attribute(x) 0 -#endif -#if !defined(__has_feature) -# define __has_feature(x) 0 -#endif -#if !defined(__has_warning) -# define __has_warning(x) 0 -#endif - -#if __has_include() -# include -#endif - -#pragma clang diagnostic ignored "-Wauto-import" -#if defined(__OBJC__) -#include -#endif -#if defined(__cplusplus) -#include -#include -#include -#include -#include -#include -#include -#else -#include -#include -#include -#include -#endif -#if defined(__cplusplus) -#if defined(__arm64e__) && __has_include() -# include -#else -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wreserved-macro-identifier" -# ifndef __ptrauth_swift_value_witness_function_pointer -# define __ptrauth_swift_value_witness_function_pointer(x) -# endif -# ifndef __ptrauth_swift_class_method_pointer -# define __ptrauth_swift_class_method_pointer(x) -# endif -#pragma clang diagnostic pop -#endif -#endif - -#if !defined(SWIFT_TYPEDEFS) -# define SWIFT_TYPEDEFS 1 -# if __has_include() -# include -# elif !defined(__cplusplus) -typedef uint_least16_t char16_t; -typedef uint_least32_t char32_t; -# endif -typedef float swift_float2 __attribute__((__ext_vector_type__(2))); -typedef float swift_float3 __attribute__((__ext_vector_type__(3))); -typedef float swift_float4 __attribute__((__ext_vector_type__(4))); -typedef double swift_double2 __attribute__((__ext_vector_type__(2))); -typedef double swift_double3 __attribute__((__ext_vector_type__(3))); -typedef double swift_double4 __attribute__((__ext_vector_type__(4))); -typedef int swift_int2 __attribute__((__ext_vector_type__(2))); -typedef int swift_int3 __attribute__((__ext_vector_type__(3))); -typedef int swift_int4 __attribute__((__ext_vector_type__(4))); -typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2))); -typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3))); -typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); -#endif - -#if !defined(SWIFT_PASTE) -# define SWIFT_PASTE_HELPER(x, y) x##y -# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y) -#endif -#if !defined(SWIFT_METATYPE) -# define SWIFT_METATYPE(X) Class -#endif -#if !defined(SWIFT_CLASS_PROPERTY) -# if __has_feature(objc_class_property) -# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__ -# else -# define SWIFT_CLASS_PROPERTY(...) -# endif -#endif -#if !defined(SWIFT_RUNTIME_NAME) -# if __has_attribute(objc_runtime_name) -# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) -# else -# define SWIFT_RUNTIME_NAME(X) -# endif -#endif -#if !defined(SWIFT_COMPILE_NAME) -# if __has_attribute(swift_name) -# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) -# else -# define SWIFT_COMPILE_NAME(X) -# endif -#endif -#if !defined(SWIFT_METHOD_FAMILY) -# if __has_attribute(objc_method_family) -# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) -# else -# define SWIFT_METHOD_FAMILY(X) -# endif -#endif -#if !defined(SWIFT_NOESCAPE) -# if __has_attribute(noescape) -# define SWIFT_NOESCAPE __attribute__((noescape)) -# else -# define SWIFT_NOESCAPE -# endif -#endif -#if !defined(SWIFT_RELEASES_ARGUMENT) -# if __has_attribute(ns_consumed) -# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) -# else -# define SWIFT_RELEASES_ARGUMENT -# endif -#endif -#if !defined(SWIFT_WARN_UNUSED_RESULT) -# if __has_attribute(warn_unused_result) -# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) -# else -# define SWIFT_WARN_UNUSED_RESULT -# endif -#endif -#if !defined(SWIFT_NORETURN) -# if __has_attribute(noreturn) -# define SWIFT_NORETURN __attribute__((noreturn)) -# else -# define SWIFT_NORETURN -# endif -#endif -#if !defined(SWIFT_CLASS_EXTRA) -# define SWIFT_CLASS_EXTRA -#endif -#if !defined(SWIFT_PROTOCOL_EXTRA) -# define SWIFT_PROTOCOL_EXTRA -#endif -#if !defined(SWIFT_ENUM_EXTRA) -# define SWIFT_ENUM_EXTRA -#endif -#if !defined(SWIFT_CLASS) -# if __has_attribute(objc_subclassing_restricted) -# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA -# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# else -# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# endif -#endif -#if !defined(SWIFT_RESILIENT_CLASS) -# if __has_attribute(objc_class_stub) -# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub)) -# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME) -# else -# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) -# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME) -# endif -#endif -#if !defined(SWIFT_PROTOCOL) -# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA -# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA -#endif -#if !defined(SWIFT_EXTENSION) -# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__) -#endif -#if !defined(OBJC_DESIGNATED_INITIALIZER) -# if __has_attribute(objc_designated_initializer) -# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) -# else -# define OBJC_DESIGNATED_INITIALIZER -# endif -#endif -#if !defined(SWIFT_ENUM_ATTR) -# if __has_attribute(enum_extensibility) -# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility))) -# else -# define SWIFT_ENUM_ATTR(_extensibility) -# endif -#endif -#if !defined(SWIFT_ENUM) -# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type -# if __has_feature(generalized_swift_name) -# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type -# else -# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility) -# endif -#endif -#if !defined(SWIFT_UNAVAILABLE) -# define SWIFT_UNAVAILABLE __attribute__((unavailable)) -#endif -#if !defined(SWIFT_UNAVAILABLE_MSG) -# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg))) -#endif -#if !defined(SWIFT_AVAILABILITY) -# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__))) -#endif -#if !defined(SWIFT_WEAK_IMPORT) -# define SWIFT_WEAK_IMPORT __attribute__((weak_import)) -#endif -#if !defined(SWIFT_DEPRECATED) -# define SWIFT_DEPRECATED __attribute__((deprecated)) -#endif -#if !defined(SWIFT_DEPRECATED_MSG) -# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__))) -#endif -#if !defined(SWIFT_DEPRECATED_OBJC) -# if __has_feature(attribute_diagnose_if_objc) -# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) -# else -# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) -# endif -#endif -#if defined(__OBJC__) -#if !defined(IBSegueAction) -# define IBSegueAction -#endif -#endif -#if !defined(SWIFT_EXTERN) -# if defined(__cplusplus) -# define SWIFT_EXTERN extern "C" -# else -# define SWIFT_EXTERN extern -# endif -#endif -#if !defined(SWIFT_CALL) -# define SWIFT_CALL __attribute__((swiftcall)) -#endif -#if !defined(SWIFT_INDIRECT_RESULT) -# define SWIFT_INDIRECT_RESULT __attribute__((swift_indirect_result)) -#endif -#if !defined(SWIFT_CONTEXT) -# define SWIFT_CONTEXT __attribute__((swift_context)) -#endif -#if !defined(SWIFT_ERROR_RESULT) -# define SWIFT_ERROR_RESULT __attribute__((swift_error_result)) -#endif -#if defined(__cplusplus) -# define SWIFT_NOEXCEPT noexcept -#else -# define SWIFT_NOEXCEPT -#endif -#if !defined(SWIFT_C_INLINE_THUNK) -# if __has_attribute(always_inline) -# if __has_attribute(nodebug) -# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) __attribute__((nodebug)) -# else -# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) -# endif -# else -# define SWIFT_C_INLINE_THUNK inline -# endif -#endif -#if defined(_WIN32) -#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) -# define SWIFT_IMPORT_STDLIB_SYMBOL __declspec(dllimport) -#endif -#else -#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) -# define SWIFT_IMPORT_STDLIB_SYMBOL -#endif -#endif -#if defined(__OBJC__) -#if __has_feature(objc_modules) -#if __has_warning("-Watimport-in-framework-header") -#pragma clang diagnostic ignored "-Watimport-in-framework-header" -#endif -@import Foundation; -@import ObjectiveC; -@import Realm; -@import Realm.Swift; -#endif - -#endif -#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch" -#pragma clang diagnostic ignored "-Wduplicate-method-arg" -#if __has_warning("-Wpragma-clang-attribute") -# pragma clang diagnostic ignored "-Wpragma-clang-attribute" -#endif -#pragma clang diagnostic ignored "-Wunknown-pragmas" -#pragma clang diagnostic ignored "-Wnullability" -#pragma clang diagnostic ignored "-Wdollar-in-identifier-extension" - -#if __has_attribute(external_source_symbol) -# pragma push_macro("any") -# undef any -# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="RealmSwift",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol)) -# pragma pop_macro("any") -#endif - -#if defined(__OBJC__) -@class NSString; - -/// A type which has a custom representation in Realm events. -/// By default, objects are serialized to JSON using built-in rules which -/// include every property. If you wish to customize how a class is serialized -/// in events, you can declare it as conforming to this protocol and -/// define customEventRepresentation(). -SWIFT_PROTOCOL_NAMED("CustomEventRepresentable") -@protocol RLMCustomEventRepresentable -/// Get the custom event serialization for this object. -/// This function must return a valid JSON String, as this is included in a -/// larger JSON document. Implementations of this function should be “pure” -/// and access no data other than that which is obtainable from the Object -/// it is called on, and it should not mutate the object which it is called -/// on. This function is called on a background thread in a somewhat -/// unusual context, and attempting to access other data is likely to cause -/// problems. -- (NSString * _Nonnull)customEventRepresentation SWIFT_WARN_UNUSED_RESULT; -@end - -@class NSNumber; - -/// A 128-bit IEEE 754-2008 decimal floating point number. -/// This type is similar to Swift’s built-in Decimal type, but allocates bits differently, resulting in a different representable range. (NS)Decimal stores a significand of up to 38 digits long and an exponent from -128 to 127, while this type stores up to 34 digits of significand and an exponent from -6143 to 6144. -SWIFT_CLASS_NAMED("Decimal128") -@interface RealmSwiftDecimal128 : RLMDecimal128 -/// Creates a new zero-initialized Decimal128. -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -/// Converts the given value to a Decimal128. -/// The following types can be converted to Decimal128: -///
    -///
  • -/// Int (of any size) -///
  • -///
  • -/// Float -///
  • -///
  • -/// Double -///
  • -///
  • -/// String -///
  • -///
  • -/// NSNumber -///
  • -///
  • -/// Decimal -///
  • -///
-/// Passing a value with a type not in this list is a fatal error. Passing a string which cannot be parsed as a valid Decimal128 is a fatal error. -/// \param value The value to convert to a Decimal128. -/// -- (nonnull instancetype)initWithValue:(id _Nonnull)value OBJC_DESIGNATED_INITIALIZER; -/// Converts the given number to a Decimal128. -/// This initializer cannot fail and is never lossy. -/// \param number The number to convert to a Decimal128. -/// -- (nonnull instancetype)initWithNumber:(NSNumber * _Nonnull)number OBJC_DESIGNATED_INITIALIZER; -/// Parse the given string as a Decimal128. -/// This initializer never throws and is marked as throws only because removing it is a breaking -/// change. Strings which cannot be parsed as a Decimal128 return a value where isNaN is true. -/// \param string The string to parse. -/// -- (nullable instancetype)initWithString:(NSString * _Nonnull)string error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER; -@end - - - - - - - - - - - - - - - - - - -@class RLMObjectSchema; - -/// Object interface which allows untyped getters and setters for Objects. -/// :nodoc: -SWIFT_CLASS_NAMED("DynamicObject") -@interface RealmSwiftDynamicObject : RealmSwiftObject -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)value forKeyedSubscript:(NSString * _Nonnull)key; -/// :nodoc: -- (id _Nullable)valueForUndefinedKey:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -- (void)setValue:(id _Nullable)value forUndefinedKey:(NSString * _Nonnull)key; -/// :nodoc: -+ (BOOL)shouldIncludeInDefaultSchema SWIFT_WARN_UNUSED_RESULT; -+ (RLMObjectSchema * _Nullable)sharedSchema SWIFT_WARN_UNUSED_RESULT; -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -@end - - - - - - - - - - - - - - - -@class NSDate; - -/// A 12-byte (probably) unique object identifier. -/// ObjectIds are similar to a GUID or a UUID, and can be used to uniquely identify objects without a centralized ID generator. An ObjectID consists of: -///
    -///
  1. -/// A 4 byte timestamp measuring the creation time of the ObjectId in seconds since the Unix epoch. -///
  2. -///
  3. -/// A 5 byte random value -///
  4. -///
  5. -/// A 3 byte counter, initialized to a random value. -///
  6. -///
-/// ObjectIds are intended to be fast to generate. Sorting by an ObjectId field will typically result in the objects being sorted in creation order. -SWIFT_CLASS_NAMED("ObjectId") -@interface RealmSwiftObjectId : RLMObjectId -/// Creates a new zero-initialized ObjectId. -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -/// Creates a new randomly-initialized ObjectId. -+ (RealmSwiftObjectId * _Nonnull)objectId SWIFT_WARN_UNUSED_RESULT; -/// Creates a new ObjectId from the given 24-byte hexadecimal string. -/// Throws if the string is not 24 characters or contains any characters other than 0-9a-fA-F. -/// \param string The string to parse. -/// -- (nullable instancetype)initWithString:(NSString * _Nonnull)string error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER; -- (nonnull instancetype)initWithTimestamp:(NSDate * _Nonnull)timestamp machineIdentifier:(int32_t)machineIdentifier processIdentifier:(int32_t)processIdentifier SWIFT_UNAVAILABLE; -@end - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -@class RLMProperty; - -@interface RealmSwiftAsymmetricObject (SWIFT_EXTENSION(RealmSwift)) -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: AsymmetricObject { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - - - - -@interface RealmSwiftEmbeddedObject (SWIFT_EXTENSION(RealmSwift)) -/// :nodoc: -+ (BOOL)isEmbedded SWIFT_WARN_UNUSED_RESULT; -/// Indicates if the object can no longer be accessed because it is now invalid. -/// An object can no longer be accessed if the object has been deleted from the Realm that manages it, or if -/// invalidate() is called on that Realm. -@property (nonatomic, readonly, getter=isInvalidated) BOOL invalidated; -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the names of properties to ignore. These properties will not be managed by -/// the Realm that manages the object. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, any properties not -/// marked with @Persisted are automatically ignored. -/// -/// returns: -/// An array of property names to ignore. -+ (NSArray * _Nonnull)ignoredProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: EmbeddedObject { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - - - - - - -@interface RealmSwiftObject (SWIFT_EXTENSION(RealmSwift)) -/// Indicates if the object can no longer be accessed because it is now invalid. -/// An object can no longer be accessed if the object has been deleted from the Realm that manages it, or if -/// invalidate() is called on that Realm. This property is key-value observable. -@property (nonatomic, readonly, getter=isInvalidated) BOOL invalidated; -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the name of a property to be used as the primary key. -/// Only properties of types String, Int, ObjectId and UUID can be -/// designated as the primary key. Primary key properties enforce uniqueness -/// for each value whenever the property is set, which incurs minor overhead. -/// Indexes are created automatically for primary key properties. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, use -/// @Persisted(primaryKey: true) instead. -/// -/// returns: -/// The name of the property designated as the primary key, or -/// nil if the model has no primary key. -+ (NSString * _Nullable)primaryKey SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the names of properties to ignore. These -/// properties will not be managed by the Realm that manages the object. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, any properties not -/// marked with @Persisted are automatically ignored. -/// -/// returns: -/// An array of property names to ignore. -+ (NSArray * _Nonnull)ignoredProperties SWIFT_WARN_UNUSED_RESULT; -/// Returns an array of property names for properties which should be indexed. -/// Only string, integer, boolean, Date, and NSDate properties are supported. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, use -/// @Persisted(indexed: true) instead. -/// -/// returns: -/// An array of property names. -+ (NSArray * _Nonnull)indexedProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: Object { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// note: -/// In a migration block, when enumerating an old property with a public/private name, you will have to use -/// the old column name instead of the public one to retrieve the property value. -/// \code -/// let migrationBlock = { migration, oldSchemaVersion in -/// migration.enumerateObjects(ofType: "Person", { oldObj, newObj in -/// let oldPropertyValue = oldObj!["first_name"] as! String -/// // Use this value in migration -/// }) -/// } -/// -/// \endcodeThis has to be done as well when renaming a property. -/// \code -/// let migrationBlock = { migration, oldSchemaVersion in -/// migration.renameProperty(onType: "Person", from: "first_name", to: "complete_name") -/// } -/// -/// \endcode -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - -SWIFT_CLASS_NAMED("SwiftUIKVO") SWIFT_AVAILABILITY(watchos,introduced=6.0) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0) -@interface RLMSwiftUIKVO : NSObject -- (void)observeValueForKeyPath:(NSString * _Nullable)keyPath ofObject:(id _Nullable)object change:(NSDictionary * _Nullable)change context:(void * _Nullable)context; -- (nonnull instancetype)init SWIFT_UNAVAILABLE; -+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable"); -@end - - -SWIFT_AVAILABILITY(watchos,introduced=6.0) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0) -@interface RLMSwiftUIKVO (SWIFT_EXTENSION(RealmSwift)) -+ (BOOL)removeObserversFromObject:(NSObject * _Nonnull)object SWIFT_WARN_UNUSED_RESULT; -+ (void)addObserversToObject:(NSObject * _Nonnull)object; -@end - -#endif -#if __has_attribute(external_source_symbol) -# pragma clang attribute pop -#endif -#if defined(__cplusplus) -#endif -#pragma clang diagnostic pop -#endif - -#else -#error unsupported Swift architecture -#endif diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-simulator/RealmSwift.framework/Info.plist b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-simulator/RealmSwift.framework/Info.plist deleted file mode 100644 index f7eeb3126..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-simulator/RealmSwift.framework/Info.plist and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/arm64-apple-ios-simulator.swiftsourceinfo b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/arm64-apple-ios-simulator.swiftsourceinfo deleted file mode 100644 index d86f07be4..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/arm64-apple-ios-simulator.swiftsourceinfo and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/x86_64-apple-ios-simulator.swiftsourceinfo b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/x86_64-apple-ios-simulator.swiftsourceinfo deleted file mode 100644 index 1e1d3fe63..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/x86_64-apple-ios-simulator.swiftsourceinfo and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-ios-simulator.abi.json b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-ios-simulator.abi.json deleted file mode 100644 index dc109fc09..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-ios-simulator.abi.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "ABIRoot": { - "kind": "Root", - "name": "TopLevel", - "printedName": "TopLevel", - "json_format_version": 8 - }, - "ConstValues": [] -} \ No newline at end of file diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-ios-simulator.swiftdoc b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-ios-simulator.swiftdoc deleted file mode 100644 index b6ad584e3..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-ios-simulator.swiftdoc and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-ios-simulator.swiftmodule b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-ios-simulator.swiftmodule deleted file mode 100644 index 7d5a0ffe4..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-ios-simulator.swiftmodule and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/x86_64-apple-ios-simulator.abi.json b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/x86_64-apple-ios-simulator.abi.json deleted file mode 100644 index dc109fc09..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/x86_64-apple-ios-simulator.abi.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "ABIRoot": { - "kind": "Root", - "name": "TopLevel", - "printedName": "TopLevel", - "json_format_version": 8 - }, - "ConstValues": [] -} \ No newline at end of file diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/x86_64-apple-ios-simulator.swiftdoc b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/x86_64-apple-ios-simulator.swiftdoc deleted file mode 100644 index 8e42ac9fe..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/x86_64-apple-ios-simulator.swiftdoc and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/x86_64-apple-ios-simulator.swiftmodule b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/x86_64-apple-ios-simulator.swiftmodule deleted file mode 100644 index af1083927..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/x86_64-apple-ios-simulator.swiftmodule and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-simulator/RealmSwift.framework/Modules/module.modulemap b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-simulator/RealmSwift.framework/Modules/module.modulemap deleted file mode 100644 index 5742239a8..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-simulator/RealmSwift.framework/Modules/module.modulemap +++ /dev/null @@ -1,4 +0,0 @@ -framework module RealmSwift { - header "RealmSwift-Swift.h" - requires objc -} diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-simulator/RealmSwift.framework/RealmSwift b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-simulator/RealmSwift.framework/RealmSwift deleted file mode 100755 index 4b8eeedac..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-simulator/RealmSwift.framework/RealmSwift and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-simulator/RealmSwift.framework/_CodeSignature/CodeResources b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-simulator/RealmSwift.framework/_CodeSignature/CodeResources deleted file mode 100644 index 79891f1d5..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/ios-arm64_x86_64-simulator/RealmSwift.framework/_CodeSignature/CodeResources +++ /dev/null @@ -1,212 +0,0 @@ - - - - - files - - Headers/RealmSwift-Swift.h - - 4/F674JO/MVMxbCMUEnOTj7VNWs= - - Info.plist - - 2FzhRlB44AC52GF0gs0Ppo29qs4= - - Modules/RealmSwift.swiftmodule/Project/arm64-apple-ios-simulator.swiftsourceinfo - - jOMWyeAW1dacEpmGDFGt8eV/imQ= - - Modules/RealmSwift.swiftmodule/Project/x86_64-apple-ios-simulator.swiftsourceinfo - - 2pNRDqWZY7Lf1iOQ/XMbza7QZWI= - - Modules/RealmSwift.swiftmodule/arm64-apple-ios-simulator.abi.json - - FSPnLbho3G+LL9smI3XgVOqBIQ4= - - Modules/RealmSwift.swiftmodule/arm64-apple-ios-simulator.swiftdoc - - 7JGfkIrsIcpDLNUQa5PetJ4I+/k= - - Modules/RealmSwift.swiftmodule/arm64-apple-ios-simulator.swiftmodule - - J4/HAIYM3y+7hu+oDM1GBc5w/VA= - - Modules/RealmSwift.swiftmodule/x86_64-apple-ios-simulator.abi.json - - FSPnLbho3G+LL9smI3XgVOqBIQ4= - - Modules/RealmSwift.swiftmodule/x86_64-apple-ios-simulator.swiftdoc - - mTZWXsxtMPgqkzHgGF0/wkjEsH0= - - Modules/RealmSwift.swiftmodule/x86_64-apple-ios-simulator.swiftmodule - - 2PM9A5uQxypfBAmOX++X4Kzy9BI= - - Modules/module.modulemap - - IXqtE49GMw2XlMvW/BV8T8CvAUI= - - - files2 - - Headers/RealmSwift-Swift.h - - hash2 - - R7UTtK85xpvxJUN1vpceuPOXeEhtTvgY/mzD2K8KmI8= - - - Modules/RealmSwift.swiftmodule/Project/arm64-apple-ios-simulator.swiftsourceinfo - - hash2 - - WCXoTWFRYmeXuOHIA5BSELwL2rfSmH/fSb3lJWW6gw8= - - - Modules/RealmSwift.swiftmodule/Project/x86_64-apple-ios-simulator.swiftsourceinfo - - hash2 - - JS8GE5RcAeeUEu5NwpQzUUHkXHPPM/KadCyxy32TokY= - - - Modules/RealmSwift.swiftmodule/arm64-apple-ios-simulator.abi.json - - hash2 - - KnRdWE4y6t4QM5zi5JDptPdHFgJy1Tku+7GLkZS2aNM= - - - Modules/RealmSwift.swiftmodule/arm64-apple-ios-simulator.swiftdoc - - hash2 - - rxrIOrISlOhyPmILxkOCIs5gJPrcGjhjA2xz1pKPp7Y= - - - Modules/RealmSwift.swiftmodule/arm64-apple-ios-simulator.swiftmodule - - hash2 - - LLmc+9RSfyd/fT5otKyR+IVNfRSf1PHGiSc486zTsZ0= - - - Modules/RealmSwift.swiftmodule/x86_64-apple-ios-simulator.abi.json - - hash2 - - KnRdWE4y6t4QM5zi5JDptPdHFgJy1Tku+7GLkZS2aNM= - - - Modules/RealmSwift.swiftmodule/x86_64-apple-ios-simulator.swiftdoc - - hash2 - - Iyf0CYkkCPktk2rJSiRE4VB3lW/S7YTtOEn988KutBA= - - - Modules/RealmSwift.swiftmodule/x86_64-apple-ios-simulator.swiftmodule - - hash2 - - U3zTWAiJ6S1F+NsEabpheIkAKyE5S4eGWMUGS4/h6ow= - - - Modules/module.modulemap - - hash2 - - Zfv2ZSs6d6XBckKRFjW5jDoJ/AIcJok4zix6ZQgi7dg= - - - - rules - - ^.* - - ^.*\.lproj/ - - optional - - weight - 1000 - - ^.*\.lproj/locversion.plist$ - - omit - - weight - 1100 - - ^Base\.lproj/ - - weight - 1010 - - ^version.plist$ - - - rules2 - - .*\.dSYM($|/) - - weight - 11 - - ^(.*/)?\.DS_Store$ - - omit - - weight - 2000 - - ^.* - - ^.*\.lproj/ - - optional - - weight - 1000 - - ^.*\.lproj/locversion.plist$ - - omit - - weight - 1100 - - ^Base\.lproj/ - - weight - 1010 - - ^Info\.plist$ - - omit - - weight - 20 - - ^PkgInfo$ - - omit - - weight - 20 - - ^embedded\.provisionprofile$ - - weight - 20 - - ^version\.plist$ - - weight - 20 - - - - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Headers b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Headers deleted file mode 120000 index a177d2a6b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Headers +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/Headers \ No newline at end of file diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Modules b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Modules deleted file mode 120000 index 5736f3186..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Modules +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/Modules \ No newline at end of file diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/RealmSwift b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/RealmSwift deleted file mode 120000 index d2aa14626..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/RealmSwift +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/RealmSwift \ No newline at end of file diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Resources b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Resources deleted file mode 120000 index 953ee36f3..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Resources +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/Resources \ No newline at end of file diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Versions/A/Headers/RealmSwift-Swift.h b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Versions/A/Headers/RealmSwift-Swift.h deleted file mode 100644 index 37e9dad7b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Versions/A/Headers/RealmSwift-Swift.h +++ /dev/null @@ -1,1450 +0,0 @@ -#if 0 -#elif defined(__arm64__) && __arm64__ -// Generated by Apple Swift version 5.9 (swiftlang-5.9.0.128.106 clang-1500.0.40.1) -#ifndef REALMSWIFT_SWIFT_H -#define REALMSWIFT_SWIFT_H -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wgcc-compat" - -#if !defined(__has_include) -# define __has_include(x) 0 -#endif -#if !defined(__has_attribute) -# define __has_attribute(x) 0 -#endif -#if !defined(__has_feature) -# define __has_feature(x) 0 -#endif -#if !defined(__has_warning) -# define __has_warning(x) 0 -#endif - -#if __has_include() -# include -#endif - -#pragma clang diagnostic ignored "-Wauto-import" -#if defined(__OBJC__) -#include -#endif -#if defined(__cplusplus) -#include -#include -#include -#include -#include -#include -#include -#else -#include -#include -#include -#include -#endif -#if defined(__cplusplus) -#if defined(__arm64e__) && __has_include() -# include -#else -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wreserved-macro-identifier" -# ifndef __ptrauth_swift_value_witness_function_pointer -# define __ptrauth_swift_value_witness_function_pointer(x) -# endif -# ifndef __ptrauth_swift_class_method_pointer -# define __ptrauth_swift_class_method_pointer(x) -# endif -#pragma clang diagnostic pop -#endif -#endif - -#if !defined(SWIFT_TYPEDEFS) -# define SWIFT_TYPEDEFS 1 -# if __has_include() -# include -# elif !defined(__cplusplus) -typedef uint_least16_t char16_t; -typedef uint_least32_t char32_t; -# endif -typedef float swift_float2 __attribute__((__ext_vector_type__(2))); -typedef float swift_float3 __attribute__((__ext_vector_type__(3))); -typedef float swift_float4 __attribute__((__ext_vector_type__(4))); -typedef double swift_double2 __attribute__((__ext_vector_type__(2))); -typedef double swift_double3 __attribute__((__ext_vector_type__(3))); -typedef double swift_double4 __attribute__((__ext_vector_type__(4))); -typedef int swift_int2 __attribute__((__ext_vector_type__(2))); -typedef int swift_int3 __attribute__((__ext_vector_type__(3))); -typedef int swift_int4 __attribute__((__ext_vector_type__(4))); -typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2))); -typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3))); -typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); -#endif - -#if !defined(SWIFT_PASTE) -# define SWIFT_PASTE_HELPER(x, y) x##y -# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y) -#endif -#if !defined(SWIFT_METATYPE) -# define SWIFT_METATYPE(X) Class -#endif -#if !defined(SWIFT_CLASS_PROPERTY) -# if __has_feature(objc_class_property) -# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__ -# else -# define SWIFT_CLASS_PROPERTY(...) -# endif -#endif -#if !defined(SWIFT_RUNTIME_NAME) -# if __has_attribute(objc_runtime_name) -# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) -# else -# define SWIFT_RUNTIME_NAME(X) -# endif -#endif -#if !defined(SWIFT_COMPILE_NAME) -# if __has_attribute(swift_name) -# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) -# else -# define SWIFT_COMPILE_NAME(X) -# endif -#endif -#if !defined(SWIFT_METHOD_FAMILY) -# if __has_attribute(objc_method_family) -# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) -# else -# define SWIFT_METHOD_FAMILY(X) -# endif -#endif -#if !defined(SWIFT_NOESCAPE) -# if __has_attribute(noescape) -# define SWIFT_NOESCAPE __attribute__((noescape)) -# else -# define SWIFT_NOESCAPE -# endif -#endif -#if !defined(SWIFT_RELEASES_ARGUMENT) -# if __has_attribute(ns_consumed) -# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) -# else -# define SWIFT_RELEASES_ARGUMENT -# endif -#endif -#if !defined(SWIFT_WARN_UNUSED_RESULT) -# if __has_attribute(warn_unused_result) -# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) -# else -# define SWIFT_WARN_UNUSED_RESULT -# endif -#endif -#if !defined(SWIFT_NORETURN) -# if __has_attribute(noreturn) -# define SWIFT_NORETURN __attribute__((noreturn)) -# else -# define SWIFT_NORETURN -# endif -#endif -#if !defined(SWIFT_CLASS_EXTRA) -# define SWIFT_CLASS_EXTRA -#endif -#if !defined(SWIFT_PROTOCOL_EXTRA) -# define SWIFT_PROTOCOL_EXTRA -#endif -#if !defined(SWIFT_ENUM_EXTRA) -# define SWIFT_ENUM_EXTRA -#endif -#if !defined(SWIFT_CLASS) -# if __has_attribute(objc_subclassing_restricted) -# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA -# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# else -# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# endif -#endif -#if !defined(SWIFT_RESILIENT_CLASS) -# if __has_attribute(objc_class_stub) -# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub)) -# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME) -# else -# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) -# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME) -# endif -#endif -#if !defined(SWIFT_PROTOCOL) -# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA -# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA -#endif -#if !defined(SWIFT_EXTENSION) -# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__) -#endif -#if !defined(OBJC_DESIGNATED_INITIALIZER) -# if __has_attribute(objc_designated_initializer) -# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) -# else -# define OBJC_DESIGNATED_INITIALIZER -# endif -#endif -#if !defined(SWIFT_ENUM_ATTR) -# if __has_attribute(enum_extensibility) -# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility))) -# else -# define SWIFT_ENUM_ATTR(_extensibility) -# endif -#endif -#if !defined(SWIFT_ENUM) -# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type -# if __has_feature(generalized_swift_name) -# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type -# else -# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility) -# endif -#endif -#if !defined(SWIFT_UNAVAILABLE) -# define SWIFT_UNAVAILABLE __attribute__((unavailable)) -#endif -#if !defined(SWIFT_UNAVAILABLE_MSG) -# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg))) -#endif -#if !defined(SWIFT_AVAILABILITY) -# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__))) -#endif -#if !defined(SWIFT_WEAK_IMPORT) -# define SWIFT_WEAK_IMPORT __attribute__((weak_import)) -#endif -#if !defined(SWIFT_DEPRECATED) -# define SWIFT_DEPRECATED __attribute__((deprecated)) -#endif -#if !defined(SWIFT_DEPRECATED_MSG) -# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__))) -#endif -#if !defined(SWIFT_DEPRECATED_OBJC) -# if __has_feature(attribute_diagnose_if_objc) -# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) -# else -# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) -# endif -#endif -#if defined(__OBJC__) -#if !defined(IBSegueAction) -# define IBSegueAction -#endif -#endif -#if !defined(SWIFT_EXTERN) -# if defined(__cplusplus) -# define SWIFT_EXTERN extern "C" -# else -# define SWIFT_EXTERN extern -# endif -#endif -#if !defined(SWIFT_CALL) -# define SWIFT_CALL __attribute__((swiftcall)) -#endif -#if !defined(SWIFT_INDIRECT_RESULT) -# define SWIFT_INDIRECT_RESULT __attribute__((swift_indirect_result)) -#endif -#if !defined(SWIFT_CONTEXT) -# define SWIFT_CONTEXT __attribute__((swift_context)) -#endif -#if !defined(SWIFT_ERROR_RESULT) -# define SWIFT_ERROR_RESULT __attribute__((swift_error_result)) -#endif -#if defined(__cplusplus) -# define SWIFT_NOEXCEPT noexcept -#else -# define SWIFT_NOEXCEPT -#endif -#if !defined(SWIFT_C_INLINE_THUNK) -# if __has_attribute(always_inline) -# if __has_attribute(nodebug) -# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) __attribute__((nodebug)) -# else -# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) -# endif -# else -# define SWIFT_C_INLINE_THUNK inline -# endif -#endif -#if defined(_WIN32) -#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) -# define SWIFT_IMPORT_STDLIB_SYMBOL __declspec(dllimport) -#endif -#else -#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) -# define SWIFT_IMPORT_STDLIB_SYMBOL -#endif -#endif -#if defined(__OBJC__) -#if __has_feature(objc_modules) -#if __has_warning("-Watimport-in-framework-header") -#pragma clang diagnostic ignored "-Watimport-in-framework-header" -#endif -@import Foundation; -@import ObjectiveC; -@import Realm; -@import Realm.Swift; -#endif - -#endif -#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch" -#pragma clang diagnostic ignored "-Wduplicate-method-arg" -#if __has_warning("-Wpragma-clang-attribute") -# pragma clang diagnostic ignored "-Wpragma-clang-attribute" -#endif -#pragma clang diagnostic ignored "-Wunknown-pragmas" -#pragma clang diagnostic ignored "-Wnullability" -#pragma clang diagnostic ignored "-Wdollar-in-identifier-extension" - -#if __has_attribute(external_source_symbol) -# pragma push_macro("any") -# undef any -# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="RealmSwift",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol)) -# pragma pop_macro("any") -#endif - -#if defined(__OBJC__) -@class NSString; - -/// A type which has a custom representation in Realm events. -/// By default, objects are serialized to JSON using built-in rules which -/// include every property. If you wish to customize how a class is serialized -/// in events, you can declare it as conforming to this protocol and -/// define customEventRepresentation(). -SWIFT_PROTOCOL_NAMED("CustomEventRepresentable") -@protocol RLMCustomEventRepresentable -/// Get the custom event serialization for this object. -/// This function must return a valid JSON String, as this is included in a -/// larger JSON document. Implementations of this function should be “pure” -/// and access no data other than that which is obtainable from the Object -/// it is called on, and it should not mutate the object which it is called -/// on. This function is called on a background thread in a somewhat -/// unusual context, and attempting to access other data is likely to cause -/// problems. -- (NSString * _Nonnull)customEventRepresentation SWIFT_WARN_UNUSED_RESULT; -@end - -@class NSNumber; - -/// A 128-bit IEEE 754-2008 decimal floating point number. -/// This type is similar to Swift’s built-in Decimal type, but allocates bits differently, resulting in a different representable range. (NS)Decimal stores a significand of up to 38 digits long and an exponent from -128 to 127, while this type stores up to 34 digits of significand and an exponent from -6143 to 6144. -SWIFT_CLASS_NAMED("Decimal128") -@interface RealmSwiftDecimal128 : RLMDecimal128 -/// Creates a new zero-initialized Decimal128. -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -/// Converts the given value to a Decimal128. -/// The following types can be converted to Decimal128: -///
    -///
  • -/// Int (of any size) -///
  • -///
  • -/// Float -///
  • -///
  • -/// Double -///
  • -///
  • -/// String -///
  • -///
  • -/// NSNumber -///
  • -///
  • -/// Decimal -///
  • -///
-/// Passing a value with a type not in this list is a fatal error. Passing a string which cannot be parsed as a valid Decimal128 is a fatal error. -/// \param value The value to convert to a Decimal128. -/// -- (nonnull instancetype)initWithValue:(id _Nonnull)value OBJC_DESIGNATED_INITIALIZER; -/// Converts the given number to a Decimal128. -/// This initializer cannot fail and is never lossy. -/// \param number The number to convert to a Decimal128. -/// -- (nonnull instancetype)initWithNumber:(NSNumber * _Nonnull)number OBJC_DESIGNATED_INITIALIZER; -/// Parse the given string as a Decimal128. -/// This initializer never throws and is marked as throws only because removing it is a breaking -/// change. Strings which cannot be parsed as a Decimal128 return a value where isNaN is true. -/// \param string The string to parse. -/// -- (nullable instancetype)initWithString:(NSString * _Nonnull)string error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER; -@end - - - - - - - - - - - - - - - - - - -@class RLMObjectSchema; - -/// Object interface which allows untyped getters and setters for Objects. -/// :nodoc: -SWIFT_CLASS_NAMED("DynamicObject") -@interface RealmSwiftDynamicObject : RealmSwiftObject -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)value forKeyedSubscript:(NSString * _Nonnull)key; -/// :nodoc: -- (id _Nullable)valueForUndefinedKey:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -- (void)setValue:(id _Nullable)value forUndefinedKey:(NSString * _Nonnull)key; -/// :nodoc: -+ (BOOL)shouldIncludeInDefaultSchema SWIFT_WARN_UNUSED_RESULT; -+ (RLMObjectSchema * _Nullable)sharedSchema SWIFT_WARN_UNUSED_RESULT; -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -@end - - - - - - - - - - - - - - - -@class NSDate; - -/// A 12-byte (probably) unique object identifier. -/// ObjectIds are similar to a GUID or a UUID, and can be used to uniquely identify objects without a centralized ID generator. An ObjectID consists of: -///
    -///
  1. -/// A 4 byte timestamp measuring the creation time of the ObjectId in seconds since the Unix epoch. -///
  2. -///
  3. -/// A 5 byte random value -///
  4. -///
  5. -/// A 3 byte counter, initialized to a random value. -///
  6. -///
-/// ObjectIds are intended to be fast to generate. Sorting by an ObjectId field will typically result in the objects being sorted in creation order. -SWIFT_CLASS_NAMED("ObjectId") -@interface RealmSwiftObjectId : RLMObjectId -/// Creates a new zero-initialized ObjectId. -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -/// Creates a new randomly-initialized ObjectId. -+ (RealmSwiftObjectId * _Nonnull)objectId SWIFT_WARN_UNUSED_RESULT; -/// Creates a new ObjectId from the given 24-byte hexadecimal string. -/// Throws if the string is not 24 characters or contains any characters other than 0-9a-fA-F. -/// \param string The string to parse. -/// -- (nullable instancetype)initWithString:(NSString * _Nonnull)string error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER; -- (nonnull instancetype)initWithTimestamp:(NSDate * _Nonnull)timestamp machineIdentifier:(int32_t)machineIdentifier processIdentifier:(int32_t)processIdentifier SWIFT_UNAVAILABLE; -@end - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -@class RLMProperty; - -@interface RealmSwiftAsymmetricObject (SWIFT_EXTENSION(RealmSwift)) -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: AsymmetricObject { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - - - - -@interface RealmSwiftEmbeddedObject (SWIFT_EXTENSION(RealmSwift)) -/// :nodoc: -+ (BOOL)isEmbedded SWIFT_WARN_UNUSED_RESULT; -/// Indicates if the object can no longer be accessed because it is now invalid. -/// An object can no longer be accessed if the object has been deleted from the Realm that manages it, or if -/// invalidate() is called on that Realm. -@property (nonatomic, readonly, getter=isInvalidated) BOOL invalidated; -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the names of properties to ignore. These properties will not be managed by -/// the Realm that manages the object. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, any properties not -/// marked with @Persisted are automatically ignored. -/// -/// returns: -/// An array of property names to ignore. -+ (NSArray * _Nonnull)ignoredProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: EmbeddedObject { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - - - - - - -@interface RealmSwiftObject (SWIFT_EXTENSION(RealmSwift)) -/// Indicates if the object can no longer be accessed because it is now invalid. -/// An object can no longer be accessed if the object has been deleted from the Realm that manages it, or if -/// invalidate() is called on that Realm. This property is key-value observable. -@property (nonatomic, readonly, getter=isInvalidated) BOOL invalidated; -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the name of a property to be used as the primary key. -/// Only properties of types String, Int, ObjectId and UUID can be -/// designated as the primary key. Primary key properties enforce uniqueness -/// for each value whenever the property is set, which incurs minor overhead. -/// Indexes are created automatically for primary key properties. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, use -/// @Persisted(primaryKey: true) instead. -/// -/// returns: -/// The name of the property designated as the primary key, or -/// nil if the model has no primary key. -+ (NSString * _Nullable)primaryKey SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the names of properties to ignore. These -/// properties will not be managed by the Realm that manages the object. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, any properties not -/// marked with @Persisted are automatically ignored. -/// -/// returns: -/// An array of property names to ignore. -+ (NSArray * _Nonnull)ignoredProperties SWIFT_WARN_UNUSED_RESULT; -/// Returns an array of property names for properties which should be indexed. -/// Only string, integer, boolean, Date, and NSDate properties are supported. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, use -/// @Persisted(indexed: true) instead. -/// -/// returns: -/// An array of property names. -+ (NSArray * _Nonnull)indexedProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: Object { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// note: -/// In a migration block, when enumerating an old property with a public/private name, you will have to use -/// the old column name instead of the public one to retrieve the property value. -/// \code -/// let migrationBlock = { migration, oldSchemaVersion in -/// migration.enumerateObjects(ofType: "Person", { oldObj, newObj in -/// let oldPropertyValue = oldObj!["first_name"] as! String -/// // Use this value in migration -/// }) -/// } -/// -/// \endcodeThis has to be done as well when renaming a property. -/// \code -/// let migrationBlock = { migration, oldSchemaVersion in -/// migration.renameProperty(onType: "Person", from: "first_name", to: "complete_name") -/// } -/// -/// \endcode -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - -SWIFT_CLASS_NAMED("SwiftUIKVO") SWIFT_AVAILABILITY(watchos,introduced=6.0) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0) -@interface RLMSwiftUIKVO : NSObject -- (void)observeValueForKeyPath:(NSString * _Nullable)keyPath ofObject:(id _Nullable)object change:(NSDictionary * _Nullable)change context:(void * _Nullable)context; -- (nonnull instancetype)init SWIFT_UNAVAILABLE; -+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable"); -@end - - -SWIFT_AVAILABILITY(watchos,introduced=6.0) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0) -@interface RLMSwiftUIKVO (SWIFT_EXTENSION(RealmSwift)) -+ (BOOL)removeObserversFromObject:(NSObject * _Nonnull)object SWIFT_WARN_UNUSED_RESULT; -+ (void)addObserversToObject:(NSObject * _Nonnull)object; -@end - -#endif -#if __has_attribute(external_source_symbol) -# pragma clang attribute pop -#endif -#if defined(__cplusplus) -#endif -#pragma clang diagnostic pop -#endif - -#elif defined(__x86_64__) && __x86_64__ -// Generated by Apple Swift version 5.9 (swiftlang-5.9.0.128.106 clang-1500.0.40.1) -#ifndef REALMSWIFT_SWIFT_H -#define REALMSWIFT_SWIFT_H -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wgcc-compat" - -#if !defined(__has_include) -# define __has_include(x) 0 -#endif -#if !defined(__has_attribute) -# define __has_attribute(x) 0 -#endif -#if !defined(__has_feature) -# define __has_feature(x) 0 -#endif -#if !defined(__has_warning) -# define __has_warning(x) 0 -#endif - -#if __has_include() -# include -#endif - -#pragma clang diagnostic ignored "-Wauto-import" -#if defined(__OBJC__) -#include -#endif -#if defined(__cplusplus) -#include -#include -#include -#include -#include -#include -#include -#else -#include -#include -#include -#include -#endif -#if defined(__cplusplus) -#if defined(__arm64e__) && __has_include() -# include -#else -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wreserved-macro-identifier" -# ifndef __ptrauth_swift_value_witness_function_pointer -# define __ptrauth_swift_value_witness_function_pointer(x) -# endif -# ifndef __ptrauth_swift_class_method_pointer -# define __ptrauth_swift_class_method_pointer(x) -# endif -#pragma clang diagnostic pop -#endif -#endif - -#if !defined(SWIFT_TYPEDEFS) -# define SWIFT_TYPEDEFS 1 -# if __has_include() -# include -# elif !defined(__cplusplus) -typedef uint_least16_t char16_t; -typedef uint_least32_t char32_t; -# endif -typedef float swift_float2 __attribute__((__ext_vector_type__(2))); -typedef float swift_float3 __attribute__((__ext_vector_type__(3))); -typedef float swift_float4 __attribute__((__ext_vector_type__(4))); -typedef double swift_double2 __attribute__((__ext_vector_type__(2))); -typedef double swift_double3 __attribute__((__ext_vector_type__(3))); -typedef double swift_double4 __attribute__((__ext_vector_type__(4))); -typedef int swift_int2 __attribute__((__ext_vector_type__(2))); -typedef int swift_int3 __attribute__((__ext_vector_type__(3))); -typedef int swift_int4 __attribute__((__ext_vector_type__(4))); -typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2))); -typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3))); -typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); -#endif - -#if !defined(SWIFT_PASTE) -# define SWIFT_PASTE_HELPER(x, y) x##y -# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y) -#endif -#if !defined(SWIFT_METATYPE) -# define SWIFT_METATYPE(X) Class -#endif -#if !defined(SWIFT_CLASS_PROPERTY) -# if __has_feature(objc_class_property) -# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__ -# else -# define SWIFT_CLASS_PROPERTY(...) -# endif -#endif -#if !defined(SWIFT_RUNTIME_NAME) -# if __has_attribute(objc_runtime_name) -# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) -# else -# define SWIFT_RUNTIME_NAME(X) -# endif -#endif -#if !defined(SWIFT_COMPILE_NAME) -# if __has_attribute(swift_name) -# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) -# else -# define SWIFT_COMPILE_NAME(X) -# endif -#endif -#if !defined(SWIFT_METHOD_FAMILY) -# if __has_attribute(objc_method_family) -# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) -# else -# define SWIFT_METHOD_FAMILY(X) -# endif -#endif -#if !defined(SWIFT_NOESCAPE) -# if __has_attribute(noescape) -# define SWIFT_NOESCAPE __attribute__((noescape)) -# else -# define SWIFT_NOESCAPE -# endif -#endif -#if !defined(SWIFT_RELEASES_ARGUMENT) -# if __has_attribute(ns_consumed) -# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) -# else -# define SWIFT_RELEASES_ARGUMENT -# endif -#endif -#if !defined(SWIFT_WARN_UNUSED_RESULT) -# if __has_attribute(warn_unused_result) -# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) -# else -# define SWIFT_WARN_UNUSED_RESULT -# endif -#endif -#if !defined(SWIFT_NORETURN) -# if __has_attribute(noreturn) -# define SWIFT_NORETURN __attribute__((noreturn)) -# else -# define SWIFT_NORETURN -# endif -#endif -#if !defined(SWIFT_CLASS_EXTRA) -# define SWIFT_CLASS_EXTRA -#endif -#if !defined(SWIFT_PROTOCOL_EXTRA) -# define SWIFT_PROTOCOL_EXTRA -#endif -#if !defined(SWIFT_ENUM_EXTRA) -# define SWIFT_ENUM_EXTRA -#endif -#if !defined(SWIFT_CLASS) -# if __has_attribute(objc_subclassing_restricted) -# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA -# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# else -# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# endif -#endif -#if !defined(SWIFT_RESILIENT_CLASS) -# if __has_attribute(objc_class_stub) -# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub)) -# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME) -# else -# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) -# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME) -# endif -#endif -#if !defined(SWIFT_PROTOCOL) -# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA -# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA -#endif -#if !defined(SWIFT_EXTENSION) -# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__) -#endif -#if !defined(OBJC_DESIGNATED_INITIALIZER) -# if __has_attribute(objc_designated_initializer) -# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) -# else -# define OBJC_DESIGNATED_INITIALIZER -# endif -#endif -#if !defined(SWIFT_ENUM_ATTR) -# if __has_attribute(enum_extensibility) -# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility))) -# else -# define SWIFT_ENUM_ATTR(_extensibility) -# endif -#endif -#if !defined(SWIFT_ENUM) -# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type -# if __has_feature(generalized_swift_name) -# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type -# else -# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility) -# endif -#endif -#if !defined(SWIFT_UNAVAILABLE) -# define SWIFT_UNAVAILABLE __attribute__((unavailable)) -#endif -#if !defined(SWIFT_UNAVAILABLE_MSG) -# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg))) -#endif -#if !defined(SWIFT_AVAILABILITY) -# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__))) -#endif -#if !defined(SWIFT_WEAK_IMPORT) -# define SWIFT_WEAK_IMPORT __attribute__((weak_import)) -#endif -#if !defined(SWIFT_DEPRECATED) -# define SWIFT_DEPRECATED __attribute__((deprecated)) -#endif -#if !defined(SWIFT_DEPRECATED_MSG) -# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__))) -#endif -#if !defined(SWIFT_DEPRECATED_OBJC) -# if __has_feature(attribute_diagnose_if_objc) -# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) -# else -# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) -# endif -#endif -#if defined(__OBJC__) -#if !defined(IBSegueAction) -# define IBSegueAction -#endif -#endif -#if !defined(SWIFT_EXTERN) -# if defined(__cplusplus) -# define SWIFT_EXTERN extern "C" -# else -# define SWIFT_EXTERN extern -# endif -#endif -#if !defined(SWIFT_CALL) -# define SWIFT_CALL __attribute__((swiftcall)) -#endif -#if !defined(SWIFT_INDIRECT_RESULT) -# define SWIFT_INDIRECT_RESULT __attribute__((swift_indirect_result)) -#endif -#if !defined(SWIFT_CONTEXT) -# define SWIFT_CONTEXT __attribute__((swift_context)) -#endif -#if !defined(SWIFT_ERROR_RESULT) -# define SWIFT_ERROR_RESULT __attribute__((swift_error_result)) -#endif -#if defined(__cplusplus) -# define SWIFT_NOEXCEPT noexcept -#else -# define SWIFT_NOEXCEPT -#endif -#if !defined(SWIFT_C_INLINE_THUNK) -# if __has_attribute(always_inline) -# if __has_attribute(nodebug) -# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) __attribute__((nodebug)) -# else -# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) -# endif -# else -# define SWIFT_C_INLINE_THUNK inline -# endif -#endif -#if defined(_WIN32) -#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) -# define SWIFT_IMPORT_STDLIB_SYMBOL __declspec(dllimport) -#endif -#else -#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) -# define SWIFT_IMPORT_STDLIB_SYMBOL -#endif -#endif -#if defined(__OBJC__) -#if __has_feature(objc_modules) -#if __has_warning("-Watimport-in-framework-header") -#pragma clang diagnostic ignored "-Watimport-in-framework-header" -#endif -@import Foundation; -@import ObjectiveC; -@import Realm; -@import Realm.Swift; -#endif - -#endif -#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch" -#pragma clang diagnostic ignored "-Wduplicate-method-arg" -#if __has_warning("-Wpragma-clang-attribute") -# pragma clang diagnostic ignored "-Wpragma-clang-attribute" -#endif -#pragma clang diagnostic ignored "-Wunknown-pragmas" -#pragma clang diagnostic ignored "-Wnullability" -#pragma clang diagnostic ignored "-Wdollar-in-identifier-extension" - -#if __has_attribute(external_source_symbol) -# pragma push_macro("any") -# undef any -# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="RealmSwift",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol)) -# pragma pop_macro("any") -#endif - -#if defined(__OBJC__) -@class NSString; - -/// A type which has a custom representation in Realm events. -/// By default, objects are serialized to JSON using built-in rules which -/// include every property. If you wish to customize how a class is serialized -/// in events, you can declare it as conforming to this protocol and -/// define customEventRepresentation(). -SWIFT_PROTOCOL_NAMED("CustomEventRepresentable") -@protocol RLMCustomEventRepresentable -/// Get the custom event serialization for this object. -/// This function must return a valid JSON String, as this is included in a -/// larger JSON document. Implementations of this function should be “pure” -/// and access no data other than that which is obtainable from the Object -/// it is called on, and it should not mutate the object which it is called -/// on. This function is called on a background thread in a somewhat -/// unusual context, and attempting to access other data is likely to cause -/// problems. -- (NSString * _Nonnull)customEventRepresentation SWIFT_WARN_UNUSED_RESULT; -@end - -@class NSNumber; - -/// A 128-bit IEEE 754-2008 decimal floating point number. -/// This type is similar to Swift’s built-in Decimal type, but allocates bits differently, resulting in a different representable range. (NS)Decimal stores a significand of up to 38 digits long and an exponent from -128 to 127, while this type stores up to 34 digits of significand and an exponent from -6143 to 6144. -SWIFT_CLASS_NAMED("Decimal128") -@interface RealmSwiftDecimal128 : RLMDecimal128 -/// Creates a new zero-initialized Decimal128. -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -/// Converts the given value to a Decimal128. -/// The following types can be converted to Decimal128: -///
    -///
  • -/// Int (of any size) -///
  • -///
  • -/// Float -///
  • -///
  • -/// Double -///
  • -///
  • -/// String -///
  • -///
  • -/// NSNumber -///
  • -///
  • -/// Decimal -///
  • -///
-/// Passing a value with a type not in this list is a fatal error. Passing a string which cannot be parsed as a valid Decimal128 is a fatal error. -/// \param value The value to convert to a Decimal128. -/// -- (nonnull instancetype)initWithValue:(id _Nonnull)value OBJC_DESIGNATED_INITIALIZER; -/// Converts the given number to a Decimal128. -/// This initializer cannot fail and is never lossy. -/// \param number The number to convert to a Decimal128. -/// -- (nonnull instancetype)initWithNumber:(NSNumber * _Nonnull)number OBJC_DESIGNATED_INITIALIZER; -/// Parse the given string as a Decimal128. -/// This initializer never throws and is marked as throws only because removing it is a breaking -/// change. Strings which cannot be parsed as a Decimal128 return a value where isNaN is true. -/// \param string The string to parse. -/// -- (nullable instancetype)initWithString:(NSString * _Nonnull)string error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER; -@end - - - - - - - - - - - - - - - - - - -@class RLMObjectSchema; - -/// Object interface which allows untyped getters and setters for Objects. -/// :nodoc: -SWIFT_CLASS_NAMED("DynamicObject") -@interface RealmSwiftDynamicObject : RealmSwiftObject -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)value forKeyedSubscript:(NSString * _Nonnull)key; -/// :nodoc: -- (id _Nullable)valueForUndefinedKey:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -- (void)setValue:(id _Nullable)value forUndefinedKey:(NSString * _Nonnull)key; -/// :nodoc: -+ (BOOL)shouldIncludeInDefaultSchema SWIFT_WARN_UNUSED_RESULT; -+ (RLMObjectSchema * _Nullable)sharedSchema SWIFT_WARN_UNUSED_RESULT; -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -@end - - - - - - - - - - - - - - - -@class NSDate; - -/// A 12-byte (probably) unique object identifier. -/// ObjectIds are similar to a GUID or a UUID, and can be used to uniquely identify objects without a centralized ID generator. An ObjectID consists of: -///
    -///
  1. -/// A 4 byte timestamp measuring the creation time of the ObjectId in seconds since the Unix epoch. -///
  2. -///
  3. -/// A 5 byte random value -///
  4. -///
  5. -/// A 3 byte counter, initialized to a random value. -///
  6. -///
-/// ObjectIds are intended to be fast to generate. Sorting by an ObjectId field will typically result in the objects being sorted in creation order. -SWIFT_CLASS_NAMED("ObjectId") -@interface RealmSwiftObjectId : RLMObjectId -/// Creates a new zero-initialized ObjectId. -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -/// Creates a new randomly-initialized ObjectId. -+ (RealmSwiftObjectId * _Nonnull)objectId SWIFT_WARN_UNUSED_RESULT; -/// Creates a new ObjectId from the given 24-byte hexadecimal string. -/// Throws if the string is not 24 characters or contains any characters other than 0-9a-fA-F. -/// \param string The string to parse. -/// -- (nullable instancetype)initWithString:(NSString * _Nonnull)string error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER; -- (nonnull instancetype)initWithTimestamp:(NSDate * _Nonnull)timestamp machineIdentifier:(int32_t)machineIdentifier processIdentifier:(int32_t)processIdentifier SWIFT_UNAVAILABLE; -@end - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -@class RLMProperty; - -@interface RealmSwiftAsymmetricObject (SWIFT_EXTENSION(RealmSwift)) -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: AsymmetricObject { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - - - - -@interface RealmSwiftEmbeddedObject (SWIFT_EXTENSION(RealmSwift)) -/// :nodoc: -+ (BOOL)isEmbedded SWIFT_WARN_UNUSED_RESULT; -/// Indicates if the object can no longer be accessed because it is now invalid. -/// An object can no longer be accessed if the object has been deleted from the Realm that manages it, or if -/// invalidate() is called on that Realm. -@property (nonatomic, readonly, getter=isInvalidated) BOOL invalidated; -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the names of properties to ignore. These properties will not be managed by -/// the Realm that manages the object. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, any properties not -/// marked with @Persisted are automatically ignored. -/// -/// returns: -/// An array of property names to ignore. -+ (NSArray * _Nonnull)ignoredProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: EmbeddedObject { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - - - - - - -@interface RealmSwiftObject (SWIFT_EXTENSION(RealmSwift)) -/// Indicates if the object can no longer be accessed because it is now invalid. -/// An object can no longer be accessed if the object has been deleted from the Realm that manages it, or if -/// invalidate() is called on that Realm. This property is key-value observable. -@property (nonatomic, readonly, getter=isInvalidated) BOOL invalidated; -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the name of a property to be used as the primary key. -/// Only properties of types String, Int, ObjectId and UUID can be -/// designated as the primary key. Primary key properties enforce uniqueness -/// for each value whenever the property is set, which incurs minor overhead. -/// Indexes are created automatically for primary key properties. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, use -/// @Persisted(primaryKey: true) instead. -/// -/// returns: -/// The name of the property designated as the primary key, or -/// nil if the model has no primary key. -+ (NSString * _Nullable)primaryKey SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the names of properties to ignore. These -/// properties will not be managed by the Realm that manages the object. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, any properties not -/// marked with @Persisted are automatically ignored. -/// -/// returns: -/// An array of property names to ignore. -+ (NSArray * _Nonnull)ignoredProperties SWIFT_WARN_UNUSED_RESULT; -/// Returns an array of property names for properties which should be indexed. -/// Only string, integer, boolean, Date, and NSDate properties are supported. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, use -/// @Persisted(indexed: true) instead. -/// -/// returns: -/// An array of property names. -+ (NSArray * _Nonnull)indexedProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: Object { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// note: -/// In a migration block, when enumerating an old property with a public/private name, you will have to use -/// the old column name instead of the public one to retrieve the property value. -/// \code -/// let migrationBlock = { migration, oldSchemaVersion in -/// migration.enumerateObjects(ofType: "Person", { oldObj, newObj in -/// let oldPropertyValue = oldObj!["first_name"] as! String -/// // Use this value in migration -/// }) -/// } -/// -/// \endcodeThis has to be done as well when renaming a property. -/// \code -/// let migrationBlock = { migration, oldSchemaVersion in -/// migration.renameProperty(onType: "Person", from: "first_name", to: "complete_name") -/// } -/// -/// \endcode -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - -SWIFT_CLASS_NAMED("SwiftUIKVO") SWIFT_AVAILABILITY(watchos,introduced=6.0) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0) -@interface RLMSwiftUIKVO : NSObject -- (void)observeValueForKeyPath:(NSString * _Nullable)keyPath ofObject:(id _Nullable)object change:(NSDictionary * _Nullable)change context:(void * _Nullable)context; -- (nonnull instancetype)init SWIFT_UNAVAILABLE; -+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable"); -@end - - -SWIFT_AVAILABILITY(watchos,introduced=6.0) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0) -@interface RLMSwiftUIKVO (SWIFT_EXTENSION(RealmSwift)) -+ (BOOL)removeObserversFromObject:(NSObject * _Nonnull)object SWIFT_WARN_UNUSED_RESULT; -+ (void)addObserversToObject:(NSObject * _Nonnull)object; -@end - -#endif -#if __has_attribute(external_source_symbol) -# pragma clang attribute pop -#endif -#if defined(__cplusplus) -#endif -#pragma clang diagnostic pop -#endif - -#else -#error unsupported Swift architecture -#endif diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/Project/arm64-apple-macos.swiftsourceinfo b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/Project/arm64-apple-macos.swiftsourceinfo deleted file mode 100644 index f136ad770..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/Project/arm64-apple-macos.swiftsourceinfo and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/Project/x86_64-apple-macos.swiftsourceinfo b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/Project/x86_64-apple-macos.swiftsourceinfo deleted file mode 100644 index 5b1c099e6..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/Project/x86_64-apple-macos.swiftsourceinfo and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/arm64-apple-macos.abi.json b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/arm64-apple-macos.abi.json deleted file mode 100644 index dc109fc09..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/arm64-apple-macos.abi.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "ABIRoot": { - "kind": "Root", - "name": "TopLevel", - "printedName": "TopLevel", - "json_format_version": 8 - }, - "ConstValues": [] -} \ No newline at end of file diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/arm64-apple-macos.swiftdoc b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/arm64-apple-macos.swiftdoc deleted file mode 100644 index 88dcc75a8..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/arm64-apple-macos.swiftdoc and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/arm64-apple-macos.swiftmodule b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/arm64-apple-macos.swiftmodule deleted file mode 100644 index 93cdc5a89..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/arm64-apple-macos.swiftmodule and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/x86_64-apple-macos.abi.json b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/x86_64-apple-macos.abi.json deleted file mode 100644 index dc109fc09..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/x86_64-apple-macos.abi.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "ABIRoot": { - "kind": "Root", - "name": "TopLevel", - "printedName": "TopLevel", - "json_format_version": 8 - }, - "ConstValues": [] -} \ No newline at end of file diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/x86_64-apple-macos.swiftdoc b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/x86_64-apple-macos.swiftdoc deleted file mode 100644 index b71868ad2..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/x86_64-apple-macos.swiftdoc and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/x86_64-apple-macos.swiftmodule b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/x86_64-apple-macos.swiftmodule deleted file mode 100644 index 119c4fea7..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Versions/A/Modules/RealmSwift.swiftmodule/x86_64-apple-macos.swiftmodule and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Versions/A/Modules/module.modulemap b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Versions/A/Modules/module.modulemap deleted file mode 100644 index 5742239a8..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Versions/A/Modules/module.modulemap +++ /dev/null @@ -1,4 +0,0 @@ -framework module RealmSwift { - header "RealmSwift-Swift.h" - requires objc -} diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Versions/A/RealmSwift b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Versions/A/RealmSwift deleted file mode 100755 index c6dbf5635..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Versions/A/RealmSwift and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Versions/A/Resources/Info.plist b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Versions/A/Resources/Info.plist deleted file mode 100644 index bc82cdfe7..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Versions/A/Resources/Info.plist +++ /dev/null @@ -1,50 +0,0 @@ - - - - - BuildMachineOSBuild - 22G91 - CFBundleDevelopmentRegion - English - CFBundleExecutable - RealmSwift - CFBundleIdentifier - io.realm.RealmSwit - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - RealmSwift - CFBundlePackageType - FMWK - CFBundleShortVersionString - 10.42.3 - CFBundleSignature - ???? - CFBundleSupportedPlatforms - - MacOSX - - CFBundleVersion - 10.42.3 - DTCompiler - com.apple.compilers.llvm.clang.1_0 - DTPlatformBuild - - DTPlatformName - macosx - DTPlatformVersion - 14.0 - DTSDKBuild - 23A5326c - DTSDKName - macosx14.0 - DTXcode - 1500 - DTXcodeBuild - 15A5229h - LSMinimumSystemVersion - 10.14 - NSHumanReadableCopyright - Copyright © 2014-2021 Realm. All rights reserved. - - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Versions/A/_CodeSignature/CodeResources b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Versions/A/_CodeSignature/CodeResources deleted file mode 100644 index df06d7d83..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Versions/A/_CodeSignature/CodeResources +++ /dev/null @@ -1,198 +0,0 @@ - - - - - files - - Resources/Info.plist - - QlmeAmBP9KF54yDHqGUIKRdOE0M= - - - files2 - - Headers/RealmSwift-Swift.h - - hash2 - - R7UTtK85xpvxJUN1vpceuPOXeEhtTvgY/mzD2K8KmI8= - - - Modules/RealmSwift.swiftmodule/Project/arm64-apple-macos.swiftsourceinfo - - hash2 - - nJj5+4+eOFWPD/0xYuOPyb6EmemCqObDcAMZzm4CU5I= - - - Modules/RealmSwift.swiftmodule/Project/x86_64-apple-macos.swiftsourceinfo - - hash2 - - p8fVkEnQ20J++f/V1BOMnDSf45DUoPY8LdITBadffGk= - - - Modules/RealmSwift.swiftmodule/arm64-apple-macos.abi.json - - hash2 - - KnRdWE4y6t4QM5zi5JDptPdHFgJy1Tku+7GLkZS2aNM= - - - Modules/RealmSwift.swiftmodule/arm64-apple-macos.swiftdoc - - hash2 - - LZLdhlcYEGrQCMCWLDM230BVN0LWmNJhzcgkKkyk+Ko= - - - Modules/RealmSwift.swiftmodule/arm64-apple-macos.swiftmodule - - hash2 - - aUVsBgi+wemyYQQaRnm5obXjvnx4Oo3I+mUQWgrVUXc= - - - Modules/RealmSwift.swiftmodule/x86_64-apple-macos.abi.json - - hash2 - - KnRdWE4y6t4QM5zi5JDptPdHFgJy1Tku+7GLkZS2aNM= - - - Modules/RealmSwift.swiftmodule/x86_64-apple-macos.swiftdoc - - hash2 - - 7ytGRSCS0mPv0hUa3NdJNYKW68BSNMjrZtzFzCinJsQ= - - - Modules/RealmSwift.swiftmodule/x86_64-apple-macos.swiftmodule - - hash2 - - ZBH9VpCi9zsvKdTi5zAexvvCVCoqn29KnPyhyADqHos= - - - Modules/module.modulemap - - hash2 - - Zfv2ZSs6d6XBckKRFjW5jDoJ/AIcJok4zix6ZQgi7dg= - - - Resources/Info.plist - - hash2 - - 9nBuYYVnXKcOLagk7QUZ/ToQV7x1E08wFL7zRk3Kg2c= - - - - rules - - ^Resources/ - - ^Resources/.*\.lproj/ - - optional - - weight - 1000 - - ^Resources/.*\.lproj/locversion.plist$ - - omit - - weight - 1100 - - ^Resources/Base\.lproj/ - - weight - 1010 - - ^version.plist$ - - - rules2 - - .*\.dSYM($|/) - - weight - 11 - - ^(.*/)?\.DS_Store$ - - omit - - weight - 2000 - - ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/ - - nested - - weight - 10 - - ^.* - - ^Info\.plist$ - - omit - - weight - 20 - - ^PkgInfo$ - - omit - - weight - 20 - - ^Resources/ - - weight - 20 - - ^Resources/.*\.lproj/ - - optional - - weight - 1000 - - ^Resources/.*\.lproj/locversion.plist$ - - omit - - weight - 1100 - - ^Resources/Base\.lproj/ - - weight - 1010 - - ^[^/]+$ - - nested - - weight - 10 - - ^embedded\.provisionprofile$ - - weight - 20 - - ^version\.plist$ - - weight - 20 - - - - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Versions/Current b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Versions/Current deleted file mode 120000 index 8c7e5a667..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/macos-arm64_x86_64/RealmSwift.framework/Versions/Current +++ /dev/null @@ -1 +0,0 @@ -A \ No newline at end of file diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64/RealmSwift.framework/Headers/RealmSwift-Swift.h b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64/RealmSwift.framework/Headers/RealmSwift-Swift.h deleted file mode 100644 index a0975c6e0..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64/RealmSwift.framework/Headers/RealmSwift-Swift.h +++ /dev/null @@ -1,727 +0,0 @@ -#if 0 -#elif defined(__arm64__) && __arm64__ -// Generated by Apple Swift version 5.9 (swiftlang-5.9.0.128.106 clang-1500.0.40.1) -#ifndef REALMSWIFT_SWIFT_H -#define REALMSWIFT_SWIFT_H -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wgcc-compat" - -#if !defined(__has_include) -# define __has_include(x) 0 -#endif -#if !defined(__has_attribute) -# define __has_attribute(x) 0 -#endif -#if !defined(__has_feature) -# define __has_feature(x) 0 -#endif -#if !defined(__has_warning) -# define __has_warning(x) 0 -#endif - -#if __has_include() -# include -#endif - -#pragma clang diagnostic ignored "-Wauto-import" -#if defined(__OBJC__) -#include -#endif -#if defined(__cplusplus) -#include -#include -#include -#include -#include -#include -#include -#else -#include -#include -#include -#include -#endif -#if defined(__cplusplus) -#if defined(__arm64e__) && __has_include() -# include -#else -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wreserved-macro-identifier" -# ifndef __ptrauth_swift_value_witness_function_pointer -# define __ptrauth_swift_value_witness_function_pointer(x) -# endif -# ifndef __ptrauth_swift_class_method_pointer -# define __ptrauth_swift_class_method_pointer(x) -# endif -#pragma clang diagnostic pop -#endif -#endif - -#if !defined(SWIFT_TYPEDEFS) -# define SWIFT_TYPEDEFS 1 -# if __has_include() -# include -# elif !defined(__cplusplus) -typedef uint_least16_t char16_t; -typedef uint_least32_t char32_t; -# endif -typedef float swift_float2 __attribute__((__ext_vector_type__(2))); -typedef float swift_float3 __attribute__((__ext_vector_type__(3))); -typedef float swift_float4 __attribute__((__ext_vector_type__(4))); -typedef double swift_double2 __attribute__((__ext_vector_type__(2))); -typedef double swift_double3 __attribute__((__ext_vector_type__(3))); -typedef double swift_double4 __attribute__((__ext_vector_type__(4))); -typedef int swift_int2 __attribute__((__ext_vector_type__(2))); -typedef int swift_int3 __attribute__((__ext_vector_type__(3))); -typedef int swift_int4 __attribute__((__ext_vector_type__(4))); -typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2))); -typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3))); -typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); -#endif - -#if !defined(SWIFT_PASTE) -# define SWIFT_PASTE_HELPER(x, y) x##y -# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y) -#endif -#if !defined(SWIFT_METATYPE) -# define SWIFT_METATYPE(X) Class -#endif -#if !defined(SWIFT_CLASS_PROPERTY) -# if __has_feature(objc_class_property) -# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__ -# else -# define SWIFT_CLASS_PROPERTY(...) -# endif -#endif -#if !defined(SWIFT_RUNTIME_NAME) -# if __has_attribute(objc_runtime_name) -# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) -# else -# define SWIFT_RUNTIME_NAME(X) -# endif -#endif -#if !defined(SWIFT_COMPILE_NAME) -# if __has_attribute(swift_name) -# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) -# else -# define SWIFT_COMPILE_NAME(X) -# endif -#endif -#if !defined(SWIFT_METHOD_FAMILY) -# if __has_attribute(objc_method_family) -# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) -# else -# define SWIFT_METHOD_FAMILY(X) -# endif -#endif -#if !defined(SWIFT_NOESCAPE) -# if __has_attribute(noescape) -# define SWIFT_NOESCAPE __attribute__((noescape)) -# else -# define SWIFT_NOESCAPE -# endif -#endif -#if !defined(SWIFT_RELEASES_ARGUMENT) -# if __has_attribute(ns_consumed) -# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) -# else -# define SWIFT_RELEASES_ARGUMENT -# endif -#endif -#if !defined(SWIFT_WARN_UNUSED_RESULT) -# if __has_attribute(warn_unused_result) -# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) -# else -# define SWIFT_WARN_UNUSED_RESULT -# endif -#endif -#if !defined(SWIFT_NORETURN) -# if __has_attribute(noreturn) -# define SWIFT_NORETURN __attribute__((noreturn)) -# else -# define SWIFT_NORETURN -# endif -#endif -#if !defined(SWIFT_CLASS_EXTRA) -# define SWIFT_CLASS_EXTRA -#endif -#if !defined(SWIFT_PROTOCOL_EXTRA) -# define SWIFT_PROTOCOL_EXTRA -#endif -#if !defined(SWIFT_ENUM_EXTRA) -# define SWIFT_ENUM_EXTRA -#endif -#if !defined(SWIFT_CLASS) -# if __has_attribute(objc_subclassing_restricted) -# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA -# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# else -# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# endif -#endif -#if !defined(SWIFT_RESILIENT_CLASS) -# if __has_attribute(objc_class_stub) -# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub)) -# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME) -# else -# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) -# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME) -# endif -#endif -#if !defined(SWIFT_PROTOCOL) -# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA -# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA -#endif -#if !defined(SWIFT_EXTENSION) -# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__) -#endif -#if !defined(OBJC_DESIGNATED_INITIALIZER) -# if __has_attribute(objc_designated_initializer) -# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) -# else -# define OBJC_DESIGNATED_INITIALIZER -# endif -#endif -#if !defined(SWIFT_ENUM_ATTR) -# if __has_attribute(enum_extensibility) -# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility))) -# else -# define SWIFT_ENUM_ATTR(_extensibility) -# endif -#endif -#if !defined(SWIFT_ENUM) -# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type -# if __has_feature(generalized_swift_name) -# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type -# else -# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility) -# endif -#endif -#if !defined(SWIFT_UNAVAILABLE) -# define SWIFT_UNAVAILABLE __attribute__((unavailable)) -#endif -#if !defined(SWIFT_UNAVAILABLE_MSG) -# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg))) -#endif -#if !defined(SWIFT_AVAILABILITY) -# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__))) -#endif -#if !defined(SWIFT_WEAK_IMPORT) -# define SWIFT_WEAK_IMPORT __attribute__((weak_import)) -#endif -#if !defined(SWIFT_DEPRECATED) -# define SWIFT_DEPRECATED __attribute__((deprecated)) -#endif -#if !defined(SWIFT_DEPRECATED_MSG) -# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__))) -#endif -#if !defined(SWIFT_DEPRECATED_OBJC) -# if __has_feature(attribute_diagnose_if_objc) -# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) -# else -# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) -# endif -#endif -#if defined(__OBJC__) -#if !defined(IBSegueAction) -# define IBSegueAction -#endif -#endif -#if !defined(SWIFT_EXTERN) -# if defined(__cplusplus) -# define SWIFT_EXTERN extern "C" -# else -# define SWIFT_EXTERN extern -# endif -#endif -#if !defined(SWIFT_CALL) -# define SWIFT_CALL __attribute__((swiftcall)) -#endif -#if !defined(SWIFT_INDIRECT_RESULT) -# define SWIFT_INDIRECT_RESULT __attribute__((swift_indirect_result)) -#endif -#if !defined(SWIFT_CONTEXT) -# define SWIFT_CONTEXT __attribute__((swift_context)) -#endif -#if !defined(SWIFT_ERROR_RESULT) -# define SWIFT_ERROR_RESULT __attribute__((swift_error_result)) -#endif -#if defined(__cplusplus) -# define SWIFT_NOEXCEPT noexcept -#else -# define SWIFT_NOEXCEPT -#endif -#if !defined(SWIFT_C_INLINE_THUNK) -# if __has_attribute(always_inline) -# if __has_attribute(nodebug) -# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) __attribute__((nodebug)) -# else -# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) -# endif -# else -# define SWIFT_C_INLINE_THUNK inline -# endif -#endif -#if defined(_WIN32) -#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) -# define SWIFT_IMPORT_STDLIB_SYMBOL __declspec(dllimport) -#endif -#else -#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) -# define SWIFT_IMPORT_STDLIB_SYMBOL -#endif -#endif -#if defined(__OBJC__) -#if __has_feature(objc_modules) -#if __has_warning("-Watimport-in-framework-header") -#pragma clang diagnostic ignored "-Watimport-in-framework-header" -#endif -@import Foundation; -@import ObjectiveC; -@import Realm; -@import Realm.Swift; -#endif - -#endif -#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch" -#pragma clang diagnostic ignored "-Wduplicate-method-arg" -#if __has_warning("-Wpragma-clang-attribute") -# pragma clang diagnostic ignored "-Wpragma-clang-attribute" -#endif -#pragma clang diagnostic ignored "-Wunknown-pragmas" -#pragma clang diagnostic ignored "-Wnullability" -#pragma clang diagnostic ignored "-Wdollar-in-identifier-extension" - -#if __has_attribute(external_source_symbol) -# pragma push_macro("any") -# undef any -# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="RealmSwift",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol)) -# pragma pop_macro("any") -#endif - -#if defined(__OBJC__) -@class NSString; - -/// A type which has a custom representation in Realm events. -/// By default, objects are serialized to JSON using built-in rules which -/// include every property. If you wish to customize how a class is serialized -/// in events, you can declare it as conforming to this protocol and -/// define customEventRepresentation(). -SWIFT_PROTOCOL_NAMED("CustomEventRepresentable") -@protocol RLMCustomEventRepresentable -/// Get the custom event serialization for this object. -/// This function must return a valid JSON String, as this is included in a -/// larger JSON document. Implementations of this function should be “pure” -/// and access no data other than that which is obtainable from the Object -/// it is called on, and it should not mutate the object which it is called -/// on. This function is called on a background thread in a somewhat -/// unusual context, and attempting to access other data is likely to cause -/// problems. -- (NSString * _Nonnull)customEventRepresentation SWIFT_WARN_UNUSED_RESULT; -@end - -@class NSNumber; - -/// A 128-bit IEEE 754-2008 decimal floating point number. -/// This type is similar to Swift’s built-in Decimal type, but allocates bits differently, resulting in a different representable range. (NS)Decimal stores a significand of up to 38 digits long and an exponent from -128 to 127, while this type stores up to 34 digits of significand and an exponent from -6143 to 6144. -SWIFT_CLASS_NAMED("Decimal128") -@interface RealmSwiftDecimal128 : RLMDecimal128 -/// Creates a new zero-initialized Decimal128. -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -/// Converts the given value to a Decimal128. -/// The following types can be converted to Decimal128: -///
    -///
  • -/// Int (of any size) -///
  • -///
  • -/// Float -///
  • -///
  • -/// Double -///
  • -///
  • -/// String -///
  • -///
  • -/// NSNumber -///
  • -///
  • -/// Decimal -///
  • -///
-/// Passing a value with a type not in this list is a fatal error. Passing a string which cannot be parsed as a valid Decimal128 is a fatal error. -/// \param value The value to convert to a Decimal128. -/// -- (nonnull instancetype)initWithValue:(id _Nonnull)value OBJC_DESIGNATED_INITIALIZER; -/// Converts the given number to a Decimal128. -/// This initializer cannot fail and is never lossy. -/// \param number The number to convert to a Decimal128. -/// -- (nonnull instancetype)initWithNumber:(NSNumber * _Nonnull)number OBJC_DESIGNATED_INITIALIZER; -/// Parse the given string as a Decimal128. -/// This initializer never throws and is marked as throws only because removing it is a breaking -/// change. Strings which cannot be parsed as a Decimal128 return a value where isNaN is true. -/// \param string The string to parse. -/// -- (nullable instancetype)initWithString:(NSString * _Nonnull)string error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER; -@end - - - - - - - - - - - - - - - - - - -@class RLMObjectSchema; - -/// Object interface which allows untyped getters and setters for Objects. -/// :nodoc: -SWIFT_CLASS_NAMED("DynamicObject") -@interface RealmSwiftDynamicObject : RealmSwiftObject -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)value forKeyedSubscript:(NSString * _Nonnull)key; -/// :nodoc: -- (id _Nullable)valueForUndefinedKey:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -- (void)setValue:(id _Nullable)value forUndefinedKey:(NSString * _Nonnull)key; -/// :nodoc: -+ (BOOL)shouldIncludeInDefaultSchema SWIFT_WARN_UNUSED_RESULT; -+ (RLMObjectSchema * _Nullable)sharedSchema SWIFT_WARN_UNUSED_RESULT; -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -@end - - - - - - - - - - - - - - - -@class NSDate; - -/// A 12-byte (probably) unique object identifier. -/// ObjectIds are similar to a GUID or a UUID, and can be used to uniquely identify objects without a centralized ID generator. An ObjectID consists of: -///
    -///
  1. -/// A 4 byte timestamp measuring the creation time of the ObjectId in seconds since the Unix epoch. -///
  2. -///
  3. -/// A 5 byte random value -///
  4. -///
  5. -/// A 3 byte counter, initialized to a random value. -///
  6. -///
-/// ObjectIds are intended to be fast to generate. Sorting by an ObjectId field will typically result in the objects being sorted in creation order. -SWIFT_CLASS_NAMED("ObjectId") -@interface RealmSwiftObjectId : RLMObjectId -/// Creates a new zero-initialized ObjectId. -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -/// Creates a new randomly-initialized ObjectId. -+ (RealmSwiftObjectId * _Nonnull)objectId SWIFT_WARN_UNUSED_RESULT; -/// Creates a new ObjectId from the given 24-byte hexadecimal string. -/// Throws if the string is not 24 characters or contains any characters other than 0-9a-fA-F. -/// \param string The string to parse. -/// -- (nullable instancetype)initWithString:(NSString * _Nonnull)string error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER; -- (nonnull instancetype)initWithTimestamp:(NSDate * _Nonnull)timestamp machineIdentifier:(int32_t)machineIdentifier processIdentifier:(int32_t)processIdentifier SWIFT_UNAVAILABLE; -@end - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -@class RLMProperty; - -@interface RealmSwiftAsymmetricObject (SWIFT_EXTENSION(RealmSwift)) -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: AsymmetricObject { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - - - - -@interface RealmSwiftEmbeddedObject (SWIFT_EXTENSION(RealmSwift)) -/// :nodoc: -+ (BOOL)isEmbedded SWIFT_WARN_UNUSED_RESULT; -/// Indicates if the object can no longer be accessed because it is now invalid. -/// An object can no longer be accessed if the object has been deleted from the Realm that manages it, or if -/// invalidate() is called on that Realm. -@property (nonatomic, readonly, getter=isInvalidated) BOOL invalidated; -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the names of properties to ignore. These properties will not be managed by -/// the Realm that manages the object. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, any properties not -/// marked with @Persisted are automatically ignored. -/// -/// returns: -/// An array of property names to ignore. -+ (NSArray * _Nonnull)ignoredProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: EmbeddedObject { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - - - - - - -@interface RealmSwiftObject (SWIFT_EXTENSION(RealmSwift)) -/// Indicates if the object can no longer be accessed because it is now invalid. -/// An object can no longer be accessed if the object has been deleted from the Realm that manages it, or if -/// invalidate() is called on that Realm. This property is key-value observable. -@property (nonatomic, readonly, getter=isInvalidated) BOOL invalidated; -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the name of a property to be used as the primary key. -/// Only properties of types String, Int, ObjectId and UUID can be -/// designated as the primary key. Primary key properties enforce uniqueness -/// for each value whenever the property is set, which incurs minor overhead. -/// Indexes are created automatically for primary key properties. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, use -/// @Persisted(primaryKey: true) instead. -/// -/// returns: -/// The name of the property designated as the primary key, or -/// nil if the model has no primary key. -+ (NSString * _Nullable)primaryKey SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the names of properties to ignore. These -/// properties will not be managed by the Realm that manages the object. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, any properties not -/// marked with @Persisted are automatically ignored. -/// -/// returns: -/// An array of property names to ignore. -+ (NSArray * _Nonnull)ignoredProperties SWIFT_WARN_UNUSED_RESULT; -/// Returns an array of property names for properties which should be indexed. -/// Only string, integer, boolean, Date, and NSDate properties are supported. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, use -/// @Persisted(indexed: true) instead. -/// -/// returns: -/// An array of property names. -+ (NSArray * _Nonnull)indexedProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: Object { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// note: -/// In a migration block, when enumerating an old property with a public/private name, you will have to use -/// the old column name instead of the public one to retrieve the property value. -/// \code -/// let migrationBlock = { migration, oldSchemaVersion in -/// migration.enumerateObjects(ofType: "Person", { oldObj, newObj in -/// let oldPropertyValue = oldObj!["first_name"] as! String -/// // Use this value in migration -/// }) -/// } -/// -/// \endcodeThis has to be done as well when renaming a property. -/// \code -/// let migrationBlock = { migration, oldSchemaVersion in -/// migration.renameProperty(onType: "Person", from: "first_name", to: "complete_name") -/// } -/// -/// \endcode -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - -SWIFT_CLASS_NAMED("SwiftUIKVO") SWIFT_AVAILABILITY(watchos,introduced=6.0) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0) -@interface RLMSwiftUIKVO : NSObject -- (void)observeValueForKeyPath:(NSString * _Nullable)keyPath ofObject:(id _Nullable)object change:(NSDictionary * _Nullable)change context:(void * _Nullable)context; -- (nonnull instancetype)init SWIFT_UNAVAILABLE; -+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable"); -@end - - -SWIFT_AVAILABILITY(watchos,introduced=6.0) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0) -@interface RLMSwiftUIKVO (SWIFT_EXTENSION(RealmSwift)) -+ (BOOL)removeObserversFromObject:(NSObject * _Nonnull)object SWIFT_WARN_UNUSED_RESULT; -+ (void)addObserversToObject:(NSObject * _Nonnull)object; -@end - -#endif -#if __has_attribute(external_source_symbol) -# pragma clang attribute pop -#endif -#if defined(__cplusplus) -#endif -#pragma clang diagnostic pop -#endif - -#else -#error unsupported Swift architecture -#endif diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64/RealmSwift.framework/Info.plist b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64/RealmSwift.framework/Info.plist deleted file mode 100644 index 76872c4cc..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64/RealmSwift.framework/Info.plist and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/arm64-apple-tvos.swiftsourceinfo b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/arm64-apple-tvos.swiftsourceinfo deleted file mode 100644 index 2f2e56bfd..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/arm64-apple-tvos.swiftsourceinfo and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-tvos.abi.json b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-tvos.abi.json deleted file mode 100644 index dc109fc09..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-tvos.abi.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "ABIRoot": { - "kind": "Root", - "name": "TopLevel", - "printedName": "TopLevel", - "json_format_version": 8 - }, - "ConstValues": [] -} \ No newline at end of file diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-tvos.swiftdoc b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-tvos.swiftdoc deleted file mode 100644 index d4737de64..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-tvos.swiftdoc and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-tvos.swiftmodule b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-tvos.swiftmodule deleted file mode 100644 index dd0eec6af..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-tvos.swiftmodule and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64/RealmSwift.framework/Modules/module.modulemap b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64/RealmSwift.framework/Modules/module.modulemap deleted file mode 100644 index 5742239a8..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64/RealmSwift.framework/Modules/module.modulemap +++ /dev/null @@ -1,4 +0,0 @@ -framework module RealmSwift { - header "RealmSwift-Swift.h" - requires objc -} diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64/RealmSwift.framework/RealmSwift b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64/RealmSwift.framework/RealmSwift deleted file mode 100755 index b2d72f320..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64/RealmSwift.framework/RealmSwift and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64_x86_64-simulator/RealmSwift.framework/Headers/RealmSwift-Swift.h b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64_x86_64-simulator/RealmSwift.framework/Headers/RealmSwift-Swift.h deleted file mode 100644 index 37e9dad7b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64_x86_64-simulator/RealmSwift.framework/Headers/RealmSwift-Swift.h +++ /dev/null @@ -1,1450 +0,0 @@ -#if 0 -#elif defined(__arm64__) && __arm64__ -// Generated by Apple Swift version 5.9 (swiftlang-5.9.0.128.106 clang-1500.0.40.1) -#ifndef REALMSWIFT_SWIFT_H -#define REALMSWIFT_SWIFT_H -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wgcc-compat" - -#if !defined(__has_include) -# define __has_include(x) 0 -#endif -#if !defined(__has_attribute) -# define __has_attribute(x) 0 -#endif -#if !defined(__has_feature) -# define __has_feature(x) 0 -#endif -#if !defined(__has_warning) -# define __has_warning(x) 0 -#endif - -#if __has_include() -# include -#endif - -#pragma clang diagnostic ignored "-Wauto-import" -#if defined(__OBJC__) -#include -#endif -#if defined(__cplusplus) -#include -#include -#include -#include -#include -#include -#include -#else -#include -#include -#include -#include -#endif -#if defined(__cplusplus) -#if defined(__arm64e__) && __has_include() -# include -#else -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wreserved-macro-identifier" -# ifndef __ptrauth_swift_value_witness_function_pointer -# define __ptrauth_swift_value_witness_function_pointer(x) -# endif -# ifndef __ptrauth_swift_class_method_pointer -# define __ptrauth_swift_class_method_pointer(x) -# endif -#pragma clang diagnostic pop -#endif -#endif - -#if !defined(SWIFT_TYPEDEFS) -# define SWIFT_TYPEDEFS 1 -# if __has_include() -# include -# elif !defined(__cplusplus) -typedef uint_least16_t char16_t; -typedef uint_least32_t char32_t; -# endif -typedef float swift_float2 __attribute__((__ext_vector_type__(2))); -typedef float swift_float3 __attribute__((__ext_vector_type__(3))); -typedef float swift_float4 __attribute__((__ext_vector_type__(4))); -typedef double swift_double2 __attribute__((__ext_vector_type__(2))); -typedef double swift_double3 __attribute__((__ext_vector_type__(3))); -typedef double swift_double4 __attribute__((__ext_vector_type__(4))); -typedef int swift_int2 __attribute__((__ext_vector_type__(2))); -typedef int swift_int3 __attribute__((__ext_vector_type__(3))); -typedef int swift_int4 __attribute__((__ext_vector_type__(4))); -typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2))); -typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3))); -typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); -#endif - -#if !defined(SWIFT_PASTE) -# define SWIFT_PASTE_HELPER(x, y) x##y -# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y) -#endif -#if !defined(SWIFT_METATYPE) -# define SWIFT_METATYPE(X) Class -#endif -#if !defined(SWIFT_CLASS_PROPERTY) -# if __has_feature(objc_class_property) -# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__ -# else -# define SWIFT_CLASS_PROPERTY(...) -# endif -#endif -#if !defined(SWIFT_RUNTIME_NAME) -# if __has_attribute(objc_runtime_name) -# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) -# else -# define SWIFT_RUNTIME_NAME(X) -# endif -#endif -#if !defined(SWIFT_COMPILE_NAME) -# if __has_attribute(swift_name) -# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) -# else -# define SWIFT_COMPILE_NAME(X) -# endif -#endif -#if !defined(SWIFT_METHOD_FAMILY) -# if __has_attribute(objc_method_family) -# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) -# else -# define SWIFT_METHOD_FAMILY(X) -# endif -#endif -#if !defined(SWIFT_NOESCAPE) -# if __has_attribute(noescape) -# define SWIFT_NOESCAPE __attribute__((noescape)) -# else -# define SWIFT_NOESCAPE -# endif -#endif -#if !defined(SWIFT_RELEASES_ARGUMENT) -# if __has_attribute(ns_consumed) -# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) -# else -# define SWIFT_RELEASES_ARGUMENT -# endif -#endif -#if !defined(SWIFT_WARN_UNUSED_RESULT) -# if __has_attribute(warn_unused_result) -# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) -# else -# define SWIFT_WARN_UNUSED_RESULT -# endif -#endif -#if !defined(SWIFT_NORETURN) -# if __has_attribute(noreturn) -# define SWIFT_NORETURN __attribute__((noreturn)) -# else -# define SWIFT_NORETURN -# endif -#endif -#if !defined(SWIFT_CLASS_EXTRA) -# define SWIFT_CLASS_EXTRA -#endif -#if !defined(SWIFT_PROTOCOL_EXTRA) -# define SWIFT_PROTOCOL_EXTRA -#endif -#if !defined(SWIFT_ENUM_EXTRA) -# define SWIFT_ENUM_EXTRA -#endif -#if !defined(SWIFT_CLASS) -# if __has_attribute(objc_subclassing_restricted) -# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA -# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# else -# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# endif -#endif -#if !defined(SWIFT_RESILIENT_CLASS) -# if __has_attribute(objc_class_stub) -# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub)) -# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME) -# else -# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) -# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME) -# endif -#endif -#if !defined(SWIFT_PROTOCOL) -# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA -# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA -#endif -#if !defined(SWIFT_EXTENSION) -# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__) -#endif -#if !defined(OBJC_DESIGNATED_INITIALIZER) -# if __has_attribute(objc_designated_initializer) -# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) -# else -# define OBJC_DESIGNATED_INITIALIZER -# endif -#endif -#if !defined(SWIFT_ENUM_ATTR) -# if __has_attribute(enum_extensibility) -# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility))) -# else -# define SWIFT_ENUM_ATTR(_extensibility) -# endif -#endif -#if !defined(SWIFT_ENUM) -# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type -# if __has_feature(generalized_swift_name) -# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type -# else -# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility) -# endif -#endif -#if !defined(SWIFT_UNAVAILABLE) -# define SWIFT_UNAVAILABLE __attribute__((unavailable)) -#endif -#if !defined(SWIFT_UNAVAILABLE_MSG) -# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg))) -#endif -#if !defined(SWIFT_AVAILABILITY) -# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__))) -#endif -#if !defined(SWIFT_WEAK_IMPORT) -# define SWIFT_WEAK_IMPORT __attribute__((weak_import)) -#endif -#if !defined(SWIFT_DEPRECATED) -# define SWIFT_DEPRECATED __attribute__((deprecated)) -#endif -#if !defined(SWIFT_DEPRECATED_MSG) -# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__))) -#endif -#if !defined(SWIFT_DEPRECATED_OBJC) -# if __has_feature(attribute_diagnose_if_objc) -# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) -# else -# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) -# endif -#endif -#if defined(__OBJC__) -#if !defined(IBSegueAction) -# define IBSegueAction -#endif -#endif -#if !defined(SWIFT_EXTERN) -# if defined(__cplusplus) -# define SWIFT_EXTERN extern "C" -# else -# define SWIFT_EXTERN extern -# endif -#endif -#if !defined(SWIFT_CALL) -# define SWIFT_CALL __attribute__((swiftcall)) -#endif -#if !defined(SWIFT_INDIRECT_RESULT) -# define SWIFT_INDIRECT_RESULT __attribute__((swift_indirect_result)) -#endif -#if !defined(SWIFT_CONTEXT) -# define SWIFT_CONTEXT __attribute__((swift_context)) -#endif -#if !defined(SWIFT_ERROR_RESULT) -# define SWIFT_ERROR_RESULT __attribute__((swift_error_result)) -#endif -#if defined(__cplusplus) -# define SWIFT_NOEXCEPT noexcept -#else -# define SWIFT_NOEXCEPT -#endif -#if !defined(SWIFT_C_INLINE_THUNK) -# if __has_attribute(always_inline) -# if __has_attribute(nodebug) -# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) __attribute__((nodebug)) -# else -# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) -# endif -# else -# define SWIFT_C_INLINE_THUNK inline -# endif -#endif -#if defined(_WIN32) -#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) -# define SWIFT_IMPORT_STDLIB_SYMBOL __declspec(dllimport) -#endif -#else -#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) -# define SWIFT_IMPORT_STDLIB_SYMBOL -#endif -#endif -#if defined(__OBJC__) -#if __has_feature(objc_modules) -#if __has_warning("-Watimport-in-framework-header") -#pragma clang diagnostic ignored "-Watimport-in-framework-header" -#endif -@import Foundation; -@import ObjectiveC; -@import Realm; -@import Realm.Swift; -#endif - -#endif -#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch" -#pragma clang diagnostic ignored "-Wduplicate-method-arg" -#if __has_warning("-Wpragma-clang-attribute") -# pragma clang diagnostic ignored "-Wpragma-clang-attribute" -#endif -#pragma clang diagnostic ignored "-Wunknown-pragmas" -#pragma clang diagnostic ignored "-Wnullability" -#pragma clang diagnostic ignored "-Wdollar-in-identifier-extension" - -#if __has_attribute(external_source_symbol) -# pragma push_macro("any") -# undef any -# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="RealmSwift",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol)) -# pragma pop_macro("any") -#endif - -#if defined(__OBJC__) -@class NSString; - -/// A type which has a custom representation in Realm events. -/// By default, objects are serialized to JSON using built-in rules which -/// include every property. If you wish to customize how a class is serialized -/// in events, you can declare it as conforming to this protocol and -/// define customEventRepresentation(). -SWIFT_PROTOCOL_NAMED("CustomEventRepresentable") -@protocol RLMCustomEventRepresentable -/// Get the custom event serialization for this object. -/// This function must return a valid JSON String, as this is included in a -/// larger JSON document. Implementations of this function should be “pure” -/// and access no data other than that which is obtainable from the Object -/// it is called on, and it should not mutate the object which it is called -/// on. This function is called on a background thread in a somewhat -/// unusual context, and attempting to access other data is likely to cause -/// problems. -- (NSString * _Nonnull)customEventRepresentation SWIFT_WARN_UNUSED_RESULT; -@end - -@class NSNumber; - -/// A 128-bit IEEE 754-2008 decimal floating point number. -/// This type is similar to Swift’s built-in Decimal type, but allocates bits differently, resulting in a different representable range. (NS)Decimal stores a significand of up to 38 digits long and an exponent from -128 to 127, while this type stores up to 34 digits of significand and an exponent from -6143 to 6144. -SWIFT_CLASS_NAMED("Decimal128") -@interface RealmSwiftDecimal128 : RLMDecimal128 -/// Creates a new zero-initialized Decimal128. -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -/// Converts the given value to a Decimal128. -/// The following types can be converted to Decimal128: -///
    -///
  • -/// Int (of any size) -///
  • -///
  • -/// Float -///
  • -///
  • -/// Double -///
  • -///
  • -/// String -///
  • -///
  • -/// NSNumber -///
  • -///
  • -/// Decimal -///
  • -///
-/// Passing a value with a type not in this list is a fatal error. Passing a string which cannot be parsed as a valid Decimal128 is a fatal error. -/// \param value The value to convert to a Decimal128. -/// -- (nonnull instancetype)initWithValue:(id _Nonnull)value OBJC_DESIGNATED_INITIALIZER; -/// Converts the given number to a Decimal128. -/// This initializer cannot fail and is never lossy. -/// \param number The number to convert to a Decimal128. -/// -- (nonnull instancetype)initWithNumber:(NSNumber * _Nonnull)number OBJC_DESIGNATED_INITIALIZER; -/// Parse the given string as a Decimal128. -/// This initializer never throws and is marked as throws only because removing it is a breaking -/// change. Strings which cannot be parsed as a Decimal128 return a value where isNaN is true. -/// \param string The string to parse. -/// -- (nullable instancetype)initWithString:(NSString * _Nonnull)string error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER; -@end - - - - - - - - - - - - - - - - - - -@class RLMObjectSchema; - -/// Object interface which allows untyped getters and setters for Objects. -/// :nodoc: -SWIFT_CLASS_NAMED("DynamicObject") -@interface RealmSwiftDynamicObject : RealmSwiftObject -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)value forKeyedSubscript:(NSString * _Nonnull)key; -/// :nodoc: -- (id _Nullable)valueForUndefinedKey:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -- (void)setValue:(id _Nullable)value forUndefinedKey:(NSString * _Nonnull)key; -/// :nodoc: -+ (BOOL)shouldIncludeInDefaultSchema SWIFT_WARN_UNUSED_RESULT; -+ (RLMObjectSchema * _Nullable)sharedSchema SWIFT_WARN_UNUSED_RESULT; -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -@end - - - - - - - - - - - - - - - -@class NSDate; - -/// A 12-byte (probably) unique object identifier. -/// ObjectIds are similar to a GUID or a UUID, and can be used to uniquely identify objects without a centralized ID generator. An ObjectID consists of: -///
    -///
  1. -/// A 4 byte timestamp measuring the creation time of the ObjectId in seconds since the Unix epoch. -///
  2. -///
  3. -/// A 5 byte random value -///
  4. -///
  5. -/// A 3 byte counter, initialized to a random value. -///
  6. -///
-/// ObjectIds are intended to be fast to generate. Sorting by an ObjectId field will typically result in the objects being sorted in creation order. -SWIFT_CLASS_NAMED("ObjectId") -@interface RealmSwiftObjectId : RLMObjectId -/// Creates a new zero-initialized ObjectId. -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -/// Creates a new randomly-initialized ObjectId. -+ (RealmSwiftObjectId * _Nonnull)objectId SWIFT_WARN_UNUSED_RESULT; -/// Creates a new ObjectId from the given 24-byte hexadecimal string. -/// Throws if the string is not 24 characters or contains any characters other than 0-9a-fA-F. -/// \param string The string to parse. -/// -- (nullable instancetype)initWithString:(NSString * _Nonnull)string error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER; -- (nonnull instancetype)initWithTimestamp:(NSDate * _Nonnull)timestamp machineIdentifier:(int32_t)machineIdentifier processIdentifier:(int32_t)processIdentifier SWIFT_UNAVAILABLE; -@end - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -@class RLMProperty; - -@interface RealmSwiftAsymmetricObject (SWIFT_EXTENSION(RealmSwift)) -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: AsymmetricObject { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - - - - -@interface RealmSwiftEmbeddedObject (SWIFT_EXTENSION(RealmSwift)) -/// :nodoc: -+ (BOOL)isEmbedded SWIFT_WARN_UNUSED_RESULT; -/// Indicates if the object can no longer be accessed because it is now invalid. -/// An object can no longer be accessed if the object has been deleted from the Realm that manages it, or if -/// invalidate() is called on that Realm. -@property (nonatomic, readonly, getter=isInvalidated) BOOL invalidated; -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the names of properties to ignore. These properties will not be managed by -/// the Realm that manages the object. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, any properties not -/// marked with @Persisted are automatically ignored. -/// -/// returns: -/// An array of property names to ignore. -+ (NSArray * _Nonnull)ignoredProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: EmbeddedObject { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - - - - - - -@interface RealmSwiftObject (SWIFT_EXTENSION(RealmSwift)) -/// Indicates if the object can no longer be accessed because it is now invalid. -/// An object can no longer be accessed if the object has been deleted from the Realm that manages it, or if -/// invalidate() is called on that Realm. This property is key-value observable. -@property (nonatomic, readonly, getter=isInvalidated) BOOL invalidated; -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the name of a property to be used as the primary key. -/// Only properties of types String, Int, ObjectId and UUID can be -/// designated as the primary key. Primary key properties enforce uniqueness -/// for each value whenever the property is set, which incurs minor overhead. -/// Indexes are created automatically for primary key properties. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, use -/// @Persisted(primaryKey: true) instead. -/// -/// returns: -/// The name of the property designated as the primary key, or -/// nil if the model has no primary key. -+ (NSString * _Nullable)primaryKey SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the names of properties to ignore. These -/// properties will not be managed by the Realm that manages the object. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, any properties not -/// marked with @Persisted are automatically ignored. -/// -/// returns: -/// An array of property names to ignore. -+ (NSArray * _Nonnull)ignoredProperties SWIFT_WARN_UNUSED_RESULT; -/// Returns an array of property names for properties which should be indexed. -/// Only string, integer, boolean, Date, and NSDate properties are supported. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, use -/// @Persisted(indexed: true) instead. -/// -/// returns: -/// An array of property names. -+ (NSArray * _Nonnull)indexedProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: Object { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// note: -/// In a migration block, when enumerating an old property with a public/private name, you will have to use -/// the old column name instead of the public one to retrieve the property value. -/// \code -/// let migrationBlock = { migration, oldSchemaVersion in -/// migration.enumerateObjects(ofType: "Person", { oldObj, newObj in -/// let oldPropertyValue = oldObj!["first_name"] as! String -/// // Use this value in migration -/// }) -/// } -/// -/// \endcodeThis has to be done as well when renaming a property. -/// \code -/// let migrationBlock = { migration, oldSchemaVersion in -/// migration.renameProperty(onType: "Person", from: "first_name", to: "complete_name") -/// } -/// -/// \endcode -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - -SWIFT_CLASS_NAMED("SwiftUIKVO") SWIFT_AVAILABILITY(watchos,introduced=6.0) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0) -@interface RLMSwiftUIKVO : NSObject -- (void)observeValueForKeyPath:(NSString * _Nullable)keyPath ofObject:(id _Nullable)object change:(NSDictionary * _Nullable)change context:(void * _Nullable)context; -- (nonnull instancetype)init SWIFT_UNAVAILABLE; -+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable"); -@end - - -SWIFT_AVAILABILITY(watchos,introduced=6.0) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0) -@interface RLMSwiftUIKVO (SWIFT_EXTENSION(RealmSwift)) -+ (BOOL)removeObserversFromObject:(NSObject * _Nonnull)object SWIFT_WARN_UNUSED_RESULT; -+ (void)addObserversToObject:(NSObject * _Nonnull)object; -@end - -#endif -#if __has_attribute(external_source_symbol) -# pragma clang attribute pop -#endif -#if defined(__cplusplus) -#endif -#pragma clang diagnostic pop -#endif - -#elif defined(__x86_64__) && __x86_64__ -// Generated by Apple Swift version 5.9 (swiftlang-5.9.0.128.106 clang-1500.0.40.1) -#ifndef REALMSWIFT_SWIFT_H -#define REALMSWIFT_SWIFT_H -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wgcc-compat" - -#if !defined(__has_include) -# define __has_include(x) 0 -#endif -#if !defined(__has_attribute) -# define __has_attribute(x) 0 -#endif -#if !defined(__has_feature) -# define __has_feature(x) 0 -#endif -#if !defined(__has_warning) -# define __has_warning(x) 0 -#endif - -#if __has_include() -# include -#endif - -#pragma clang diagnostic ignored "-Wauto-import" -#if defined(__OBJC__) -#include -#endif -#if defined(__cplusplus) -#include -#include -#include -#include -#include -#include -#include -#else -#include -#include -#include -#include -#endif -#if defined(__cplusplus) -#if defined(__arm64e__) && __has_include() -# include -#else -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wreserved-macro-identifier" -# ifndef __ptrauth_swift_value_witness_function_pointer -# define __ptrauth_swift_value_witness_function_pointer(x) -# endif -# ifndef __ptrauth_swift_class_method_pointer -# define __ptrauth_swift_class_method_pointer(x) -# endif -#pragma clang diagnostic pop -#endif -#endif - -#if !defined(SWIFT_TYPEDEFS) -# define SWIFT_TYPEDEFS 1 -# if __has_include() -# include -# elif !defined(__cplusplus) -typedef uint_least16_t char16_t; -typedef uint_least32_t char32_t; -# endif -typedef float swift_float2 __attribute__((__ext_vector_type__(2))); -typedef float swift_float3 __attribute__((__ext_vector_type__(3))); -typedef float swift_float4 __attribute__((__ext_vector_type__(4))); -typedef double swift_double2 __attribute__((__ext_vector_type__(2))); -typedef double swift_double3 __attribute__((__ext_vector_type__(3))); -typedef double swift_double4 __attribute__((__ext_vector_type__(4))); -typedef int swift_int2 __attribute__((__ext_vector_type__(2))); -typedef int swift_int3 __attribute__((__ext_vector_type__(3))); -typedef int swift_int4 __attribute__((__ext_vector_type__(4))); -typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2))); -typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3))); -typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); -#endif - -#if !defined(SWIFT_PASTE) -# define SWIFT_PASTE_HELPER(x, y) x##y -# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y) -#endif -#if !defined(SWIFT_METATYPE) -# define SWIFT_METATYPE(X) Class -#endif -#if !defined(SWIFT_CLASS_PROPERTY) -# if __has_feature(objc_class_property) -# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__ -# else -# define SWIFT_CLASS_PROPERTY(...) -# endif -#endif -#if !defined(SWIFT_RUNTIME_NAME) -# if __has_attribute(objc_runtime_name) -# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) -# else -# define SWIFT_RUNTIME_NAME(X) -# endif -#endif -#if !defined(SWIFT_COMPILE_NAME) -# if __has_attribute(swift_name) -# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) -# else -# define SWIFT_COMPILE_NAME(X) -# endif -#endif -#if !defined(SWIFT_METHOD_FAMILY) -# if __has_attribute(objc_method_family) -# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) -# else -# define SWIFT_METHOD_FAMILY(X) -# endif -#endif -#if !defined(SWIFT_NOESCAPE) -# if __has_attribute(noescape) -# define SWIFT_NOESCAPE __attribute__((noescape)) -# else -# define SWIFT_NOESCAPE -# endif -#endif -#if !defined(SWIFT_RELEASES_ARGUMENT) -# if __has_attribute(ns_consumed) -# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) -# else -# define SWIFT_RELEASES_ARGUMENT -# endif -#endif -#if !defined(SWIFT_WARN_UNUSED_RESULT) -# if __has_attribute(warn_unused_result) -# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) -# else -# define SWIFT_WARN_UNUSED_RESULT -# endif -#endif -#if !defined(SWIFT_NORETURN) -# if __has_attribute(noreturn) -# define SWIFT_NORETURN __attribute__((noreturn)) -# else -# define SWIFT_NORETURN -# endif -#endif -#if !defined(SWIFT_CLASS_EXTRA) -# define SWIFT_CLASS_EXTRA -#endif -#if !defined(SWIFT_PROTOCOL_EXTRA) -# define SWIFT_PROTOCOL_EXTRA -#endif -#if !defined(SWIFT_ENUM_EXTRA) -# define SWIFT_ENUM_EXTRA -#endif -#if !defined(SWIFT_CLASS) -# if __has_attribute(objc_subclassing_restricted) -# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA -# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# else -# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# endif -#endif -#if !defined(SWIFT_RESILIENT_CLASS) -# if __has_attribute(objc_class_stub) -# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub)) -# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME) -# else -# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) -# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME) -# endif -#endif -#if !defined(SWIFT_PROTOCOL) -# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA -# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA -#endif -#if !defined(SWIFT_EXTENSION) -# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__) -#endif -#if !defined(OBJC_DESIGNATED_INITIALIZER) -# if __has_attribute(objc_designated_initializer) -# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) -# else -# define OBJC_DESIGNATED_INITIALIZER -# endif -#endif -#if !defined(SWIFT_ENUM_ATTR) -# if __has_attribute(enum_extensibility) -# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility))) -# else -# define SWIFT_ENUM_ATTR(_extensibility) -# endif -#endif -#if !defined(SWIFT_ENUM) -# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type -# if __has_feature(generalized_swift_name) -# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type -# else -# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility) -# endif -#endif -#if !defined(SWIFT_UNAVAILABLE) -# define SWIFT_UNAVAILABLE __attribute__((unavailable)) -#endif -#if !defined(SWIFT_UNAVAILABLE_MSG) -# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg))) -#endif -#if !defined(SWIFT_AVAILABILITY) -# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__))) -#endif -#if !defined(SWIFT_WEAK_IMPORT) -# define SWIFT_WEAK_IMPORT __attribute__((weak_import)) -#endif -#if !defined(SWIFT_DEPRECATED) -# define SWIFT_DEPRECATED __attribute__((deprecated)) -#endif -#if !defined(SWIFT_DEPRECATED_MSG) -# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__))) -#endif -#if !defined(SWIFT_DEPRECATED_OBJC) -# if __has_feature(attribute_diagnose_if_objc) -# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) -# else -# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) -# endif -#endif -#if defined(__OBJC__) -#if !defined(IBSegueAction) -# define IBSegueAction -#endif -#endif -#if !defined(SWIFT_EXTERN) -# if defined(__cplusplus) -# define SWIFT_EXTERN extern "C" -# else -# define SWIFT_EXTERN extern -# endif -#endif -#if !defined(SWIFT_CALL) -# define SWIFT_CALL __attribute__((swiftcall)) -#endif -#if !defined(SWIFT_INDIRECT_RESULT) -# define SWIFT_INDIRECT_RESULT __attribute__((swift_indirect_result)) -#endif -#if !defined(SWIFT_CONTEXT) -# define SWIFT_CONTEXT __attribute__((swift_context)) -#endif -#if !defined(SWIFT_ERROR_RESULT) -# define SWIFT_ERROR_RESULT __attribute__((swift_error_result)) -#endif -#if defined(__cplusplus) -# define SWIFT_NOEXCEPT noexcept -#else -# define SWIFT_NOEXCEPT -#endif -#if !defined(SWIFT_C_INLINE_THUNK) -# if __has_attribute(always_inline) -# if __has_attribute(nodebug) -# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) __attribute__((nodebug)) -# else -# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) -# endif -# else -# define SWIFT_C_INLINE_THUNK inline -# endif -#endif -#if defined(_WIN32) -#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) -# define SWIFT_IMPORT_STDLIB_SYMBOL __declspec(dllimport) -#endif -#else -#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) -# define SWIFT_IMPORT_STDLIB_SYMBOL -#endif -#endif -#if defined(__OBJC__) -#if __has_feature(objc_modules) -#if __has_warning("-Watimport-in-framework-header") -#pragma clang diagnostic ignored "-Watimport-in-framework-header" -#endif -@import Foundation; -@import ObjectiveC; -@import Realm; -@import Realm.Swift; -#endif - -#endif -#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch" -#pragma clang diagnostic ignored "-Wduplicate-method-arg" -#if __has_warning("-Wpragma-clang-attribute") -# pragma clang diagnostic ignored "-Wpragma-clang-attribute" -#endif -#pragma clang diagnostic ignored "-Wunknown-pragmas" -#pragma clang diagnostic ignored "-Wnullability" -#pragma clang diagnostic ignored "-Wdollar-in-identifier-extension" - -#if __has_attribute(external_source_symbol) -# pragma push_macro("any") -# undef any -# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="RealmSwift",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol)) -# pragma pop_macro("any") -#endif - -#if defined(__OBJC__) -@class NSString; - -/// A type which has a custom representation in Realm events. -/// By default, objects are serialized to JSON using built-in rules which -/// include every property. If you wish to customize how a class is serialized -/// in events, you can declare it as conforming to this protocol and -/// define customEventRepresentation(). -SWIFT_PROTOCOL_NAMED("CustomEventRepresentable") -@protocol RLMCustomEventRepresentable -/// Get the custom event serialization for this object. -/// This function must return a valid JSON String, as this is included in a -/// larger JSON document. Implementations of this function should be “pure” -/// and access no data other than that which is obtainable from the Object -/// it is called on, and it should not mutate the object which it is called -/// on. This function is called on a background thread in a somewhat -/// unusual context, and attempting to access other data is likely to cause -/// problems. -- (NSString * _Nonnull)customEventRepresentation SWIFT_WARN_UNUSED_RESULT; -@end - -@class NSNumber; - -/// A 128-bit IEEE 754-2008 decimal floating point number. -/// This type is similar to Swift’s built-in Decimal type, but allocates bits differently, resulting in a different representable range. (NS)Decimal stores a significand of up to 38 digits long and an exponent from -128 to 127, while this type stores up to 34 digits of significand and an exponent from -6143 to 6144. -SWIFT_CLASS_NAMED("Decimal128") -@interface RealmSwiftDecimal128 : RLMDecimal128 -/// Creates a new zero-initialized Decimal128. -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -/// Converts the given value to a Decimal128. -/// The following types can be converted to Decimal128: -///
    -///
  • -/// Int (of any size) -///
  • -///
  • -/// Float -///
  • -///
  • -/// Double -///
  • -///
  • -/// String -///
  • -///
  • -/// NSNumber -///
  • -///
  • -/// Decimal -///
  • -///
-/// Passing a value with a type not in this list is a fatal error. Passing a string which cannot be parsed as a valid Decimal128 is a fatal error. -/// \param value The value to convert to a Decimal128. -/// -- (nonnull instancetype)initWithValue:(id _Nonnull)value OBJC_DESIGNATED_INITIALIZER; -/// Converts the given number to a Decimal128. -/// This initializer cannot fail and is never lossy. -/// \param number The number to convert to a Decimal128. -/// -- (nonnull instancetype)initWithNumber:(NSNumber * _Nonnull)number OBJC_DESIGNATED_INITIALIZER; -/// Parse the given string as a Decimal128. -/// This initializer never throws and is marked as throws only because removing it is a breaking -/// change. Strings which cannot be parsed as a Decimal128 return a value where isNaN is true. -/// \param string The string to parse. -/// -- (nullable instancetype)initWithString:(NSString * _Nonnull)string error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER; -@end - - - - - - - - - - - - - - - - - - -@class RLMObjectSchema; - -/// Object interface which allows untyped getters and setters for Objects. -/// :nodoc: -SWIFT_CLASS_NAMED("DynamicObject") -@interface RealmSwiftDynamicObject : RealmSwiftObject -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)value forKeyedSubscript:(NSString * _Nonnull)key; -/// :nodoc: -- (id _Nullable)valueForUndefinedKey:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -- (void)setValue:(id _Nullable)value forUndefinedKey:(NSString * _Nonnull)key; -/// :nodoc: -+ (BOOL)shouldIncludeInDefaultSchema SWIFT_WARN_UNUSED_RESULT; -+ (RLMObjectSchema * _Nullable)sharedSchema SWIFT_WARN_UNUSED_RESULT; -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -@end - - - - - - - - - - - - - - - -@class NSDate; - -/// A 12-byte (probably) unique object identifier. -/// ObjectIds are similar to a GUID or a UUID, and can be used to uniquely identify objects without a centralized ID generator. An ObjectID consists of: -///
    -///
  1. -/// A 4 byte timestamp measuring the creation time of the ObjectId in seconds since the Unix epoch. -///
  2. -///
  3. -/// A 5 byte random value -///
  4. -///
  5. -/// A 3 byte counter, initialized to a random value. -///
  6. -///
-/// ObjectIds are intended to be fast to generate. Sorting by an ObjectId field will typically result in the objects being sorted in creation order. -SWIFT_CLASS_NAMED("ObjectId") -@interface RealmSwiftObjectId : RLMObjectId -/// Creates a new zero-initialized ObjectId. -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -/// Creates a new randomly-initialized ObjectId. -+ (RealmSwiftObjectId * _Nonnull)objectId SWIFT_WARN_UNUSED_RESULT; -/// Creates a new ObjectId from the given 24-byte hexadecimal string. -/// Throws if the string is not 24 characters or contains any characters other than 0-9a-fA-F. -/// \param string The string to parse. -/// -- (nullable instancetype)initWithString:(NSString * _Nonnull)string error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER; -- (nonnull instancetype)initWithTimestamp:(NSDate * _Nonnull)timestamp machineIdentifier:(int32_t)machineIdentifier processIdentifier:(int32_t)processIdentifier SWIFT_UNAVAILABLE; -@end - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -@class RLMProperty; - -@interface RealmSwiftAsymmetricObject (SWIFT_EXTENSION(RealmSwift)) -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: AsymmetricObject { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - - - - -@interface RealmSwiftEmbeddedObject (SWIFT_EXTENSION(RealmSwift)) -/// :nodoc: -+ (BOOL)isEmbedded SWIFT_WARN_UNUSED_RESULT; -/// Indicates if the object can no longer be accessed because it is now invalid. -/// An object can no longer be accessed if the object has been deleted from the Realm that manages it, or if -/// invalidate() is called on that Realm. -@property (nonatomic, readonly, getter=isInvalidated) BOOL invalidated; -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the names of properties to ignore. These properties will not be managed by -/// the Realm that manages the object. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, any properties not -/// marked with @Persisted are automatically ignored. -/// -/// returns: -/// An array of property names to ignore. -+ (NSArray * _Nonnull)ignoredProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: EmbeddedObject { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - - - - - - -@interface RealmSwiftObject (SWIFT_EXTENSION(RealmSwift)) -/// Indicates if the object can no longer be accessed because it is now invalid. -/// An object can no longer be accessed if the object has been deleted from the Realm that manages it, or if -/// invalidate() is called on that Realm. This property is key-value observable. -@property (nonatomic, readonly, getter=isInvalidated) BOOL invalidated; -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the name of a property to be used as the primary key. -/// Only properties of types String, Int, ObjectId and UUID can be -/// designated as the primary key. Primary key properties enforce uniqueness -/// for each value whenever the property is set, which incurs minor overhead. -/// Indexes are created automatically for primary key properties. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, use -/// @Persisted(primaryKey: true) instead. -/// -/// returns: -/// The name of the property designated as the primary key, or -/// nil if the model has no primary key. -+ (NSString * _Nullable)primaryKey SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the names of properties to ignore. These -/// properties will not be managed by the Realm that manages the object. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, any properties not -/// marked with @Persisted are automatically ignored. -/// -/// returns: -/// An array of property names to ignore. -+ (NSArray * _Nonnull)ignoredProperties SWIFT_WARN_UNUSED_RESULT; -/// Returns an array of property names for properties which should be indexed. -/// Only string, integer, boolean, Date, and NSDate properties are supported. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, use -/// @Persisted(indexed: true) instead. -/// -/// returns: -/// An array of property names. -+ (NSArray * _Nonnull)indexedProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: Object { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// note: -/// In a migration block, when enumerating an old property with a public/private name, you will have to use -/// the old column name instead of the public one to retrieve the property value. -/// \code -/// let migrationBlock = { migration, oldSchemaVersion in -/// migration.enumerateObjects(ofType: "Person", { oldObj, newObj in -/// let oldPropertyValue = oldObj!["first_name"] as! String -/// // Use this value in migration -/// }) -/// } -/// -/// \endcodeThis has to be done as well when renaming a property. -/// \code -/// let migrationBlock = { migration, oldSchemaVersion in -/// migration.renameProperty(onType: "Person", from: "first_name", to: "complete_name") -/// } -/// -/// \endcode -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - -SWIFT_CLASS_NAMED("SwiftUIKVO") SWIFT_AVAILABILITY(watchos,introduced=6.0) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0) -@interface RLMSwiftUIKVO : NSObject -- (void)observeValueForKeyPath:(NSString * _Nullable)keyPath ofObject:(id _Nullable)object change:(NSDictionary * _Nullable)change context:(void * _Nullable)context; -- (nonnull instancetype)init SWIFT_UNAVAILABLE; -+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable"); -@end - - -SWIFT_AVAILABILITY(watchos,introduced=6.0) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0) -@interface RLMSwiftUIKVO (SWIFT_EXTENSION(RealmSwift)) -+ (BOOL)removeObserversFromObject:(NSObject * _Nonnull)object SWIFT_WARN_UNUSED_RESULT; -+ (void)addObserversToObject:(NSObject * _Nonnull)object; -@end - -#endif -#if __has_attribute(external_source_symbol) -# pragma clang attribute pop -#endif -#if defined(__cplusplus) -#endif -#pragma clang diagnostic pop -#endif - -#else -#error unsupported Swift architecture -#endif diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64_x86_64-simulator/RealmSwift.framework/Info.plist b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64_x86_64-simulator/RealmSwift.framework/Info.plist deleted file mode 100644 index 79d20fad0..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64_x86_64-simulator/RealmSwift.framework/Info.plist and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/arm64-apple-tvos-simulator.swiftsourceinfo b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/arm64-apple-tvos-simulator.swiftsourceinfo deleted file mode 100644 index 97a52dbb3..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/arm64-apple-tvos-simulator.swiftsourceinfo and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/x86_64-apple-tvos-simulator.swiftsourceinfo b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/x86_64-apple-tvos-simulator.swiftsourceinfo deleted file mode 100644 index 8cd6b3e0a..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/x86_64-apple-tvos-simulator.swiftsourceinfo and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-tvos-simulator.abi.json b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-tvos-simulator.abi.json deleted file mode 100644 index dc109fc09..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-tvos-simulator.abi.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "ABIRoot": { - "kind": "Root", - "name": "TopLevel", - "printedName": "TopLevel", - "json_format_version": 8 - }, - "ConstValues": [] -} \ No newline at end of file diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-tvos-simulator.swiftdoc b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-tvos-simulator.swiftdoc deleted file mode 100644 index d77e1dcec..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-tvos-simulator.swiftdoc and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-tvos-simulator.swiftmodule b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-tvos-simulator.swiftmodule deleted file mode 100644 index 1b87c58e0..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-tvos-simulator.swiftmodule and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/x86_64-apple-tvos-simulator.abi.json b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/x86_64-apple-tvos-simulator.abi.json deleted file mode 100644 index dc109fc09..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/x86_64-apple-tvos-simulator.abi.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "ABIRoot": { - "kind": "Root", - "name": "TopLevel", - "printedName": "TopLevel", - "json_format_version": 8 - }, - "ConstValues": [] -} \ No newline at end of file diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/x86_64-apple-tvos-simulator.swiftdoc b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/x86_64-apple-tvos-simulator.swiftdoc deleted file mode 100644 index 42c6c8b52..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/x86_64-apple-tvos-simulator.swiftdoc and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/x86_64-apple-tvos-simulator.swiftmodule b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/x86_64-apple-tvos-simulator.swiftmodule deleted file mode 100644 index c4662821c..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/x86_64-apple-tvos-simulator.swiftmodule and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64_x86_64-simulator/RealmSwift.framework/Modules/module.modulemap b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64_x86_64-simulator/RealmSwift.framework/Modules/module.modulemap deleted file mode 100644 index 5742239a8..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64_x86_64-simulator/RealmSwift.framework/Modules/module.modulemap +++ /dev/null @@ -1,4 +0,0 @@ -framework module RealmSwift { - header "RealmSwift-Swift.h" - requires objc -} diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64_x86_64-simulator/RealmSwift.framework/RealmSwift b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64_x86_64-simulator/RealmSwift.framework/RealmSwift deleted file mode 100755 index b35491f73..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64_x86_64-simulator/RealmSwift.framework/RealmSwift and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64_x86_64-simulator/RealmSwift.framework/_CodeSignature/CodeResources b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64_x86_64-simulator/RealmSwift.framework/_CodeSignature/CodeResources deleted file mode 100644 index 7facfc1ad..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/tvos-arm64_x86_64-simulator/RealmSwift.framework/_CodeSignature/CodeResources +++ /dev/null @@ -1,212 +0,0 @@ - - - - - files - - Headers/RealmSwift-Swift.h - - 4/F674JO/MVMxbCMUEnOTj7VNWs= - - Info.plist - - xd4/gFQdwoKEo3HwdZ6Fr+KzBPY= - - Modules/RealmSwift.swiftmodule/Project/arm64-apple-tvos-simulator.swiftsourceinfo - - nQQiubbFjZU3tHSjlRTP5ptFXmA= - - Modules/RealmSwift.swiftmodule/Project/x86_64-apple-tvos-simulator.swiftsourceinfo - - L3Rzz9NPA07BgH0Lw9OmU1x5Cuc= - - Modules/RealmSwift.swiftmodule/arm64-apple-tvos-simulator.abi.json - - FSPnLbho3G+LL9smI3XgVOqBIQ4= - - Modules/RealmSwift.swiftmodule/arm64-apple-tvos-simulator.swiftdoc - - MqsHQhs1Fj+Um7p7EnBO4bWXjYU= - - Modules/RealmSwift.swiftmodule/arm64-apple-tvos-simulator.swiftmodule - - fiA5p7mc1lMii/IaaZeYCbT+qUc= - - Modules/RealmSwift.swiftmodule/x86_64-apple-tvos-simulator.abi.json - - FSPnLbho3G+LL9smI3XgVOqBIQ4= - - Modules/RealmSwift.swiftmodule/x86_64-apple-tvos-simulator.swiftdoc - - w2gOqA82R+AmFrHOsNg0ltNKEOM= - - Modules/RealmSwift.swiftmodule/x86_64-apple-tvos-simulator.swiftmodule - - vOQ7qN/hnVzKBzOC+n36t9LnHE0= - - Modules/module.modulemap - - IXqtE49GMw2XlMvW/BV8T8CvAUI= - - - files2 - - Headers/RealmSwift-Swift.h - - hash2 - - R7UTtK85xpvxJUN1vpceuPOXeEhtTvgY/mzD2K8KmI8= - - - Modules/RealmSwift.swiftmodule/Project/arm64-apple-tvos-simulator.swiftsourceinfo - - hash2 - - cgta0taLub6L1rgnEjCZptM+r/ubOSBxhxsdrKEN6XI= - - - Modules/RealmSwift.swiftmodule/Project/x86_64-apple-tvos-simulator.swiftsourceinfo - - hash2 - - JKrs474PP3/QoPlVLTOWJklqJPmFOsirvAXH8bEDthk= - - - Modules/RealmSwift.swiftmodule/arm64-apple-tvos-simulator.abi.json - - hash2 - - KnRdWE4y6t4QM5zi5JDptPdHFgJy1Tku+7GLkZS2aNM= - - - Modules/RealmSwift.swiftmodule/arm64-apple-tvos-simulator.swiftdoc - - hash2 - - 4bhH3ily7k6UVUqKVFZ5tIfs1uRAaeGNzBQlh8OFcLs= - - - Modules/RealmSwift.swiftmodule/arm64-apple-tvos-simulator.swiftmodule - - hash2 - - /l/hnPX7ofKR0jSF1LpCnPmVC/4e1iOdUj+v2+l00Ps= - - - Modules/RealmSwift.swiftmodule/x86_64-apple-tvos-simulator.abi.json - - hash2 - - KnRdWE4y6t4QM5zi5JDptPdHFgJy1Tku+7GLkZS2aNM= - - - Modules/RealmSwift.swiftmodule/x86_64-apple-tvos-simulator.swiftdoc - - hash2 - - y+AT256ZNuGSsGr3eRDW/K3AMcvQfqBdBC0Y81Xv/ic= - - - Modules/RealmSwift.swiftmodule/x86_64-apple-tvos-simulator.swiftmodule - - hash2 - - g5Lgya+TFZUF+Nkc84qQa4LLMqpMR1SdYrzNY3vz90U= - - - Modules/module.modulemap - - hash2 - - Zfv2ZSs6d6XBckKRFjW5jDoJ/AIcJok4zix6ZQgi7dg= - - - - rules - - ^.* - - ^.*\.lproj/ - - optional - - weight - 1000 - - ^.*\.lproj/locversion.plist$ - - omit - - weight - 1100 - - ^Base\.lproj/ - - weight - 1010 - - ^version.plist$ - - - rules2 - - .*\.dSYM($|/) - - weight - 11 - - ^(.*/)?\.DS_Store$ - - omit - - weight - 2000 - - ^.* - - ^.*\.lproj/ - - optional - - weight - 1000 - - ^.*\.lproj/locversion.plist$ - - omit - - weight - 1100 - - ^Base\.lproj/ - - weight - 1010 - - ^Info\.plist$ - - omit - - weight - 20 - - ^PkgInfo$ - - omit - - weight - 20 - - ^embedded\.provisionprofile$ - - weight - 20 - - ^version\.plist$ - - weight - 20 - - - - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Headers/RealmSwift-Swift.h b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Headers/RealmSwift-Swift.h deleted file mode 100644 index e93a7eef5..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Headers/RealmSwift-Swift.h +++ /dev/null @@ -1,2173 +0,0 @@ -#if 0 -#elif defined(__ARM64_ARCH_8_32__) && __ARM64_ARCH_8_32__ -// Generated by Apple Swift version 5.9 (swiftlang-5.9.0.128.106 clang-1500.0.40.1) -#ifndef REALMSWIFT_SWIFT_H -#define REALMSWIFT_SWIFT_H -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wgcc-compat" - -#if !defined(__has_include) -# define __has_include(x) 0 -#endif -#if !defined(__has_attribute) -# define __has_attribute(x) 0 -#endif -#if !defined(__has_feature) -# define __has_feature(x) 0 -#endif -#if !defined(__has_warning) -# define __has_warning(x) 0 -#endif - -#if __has_include() -# include -#endif - -#pragma clang diagnostic ignored "-Wauto-import" -#if defined(__OBJC__) -#include -#endif -#if defined(__cplusplus) -#include -#include -#include -#include -#include -#include -#include -#else -#include -#include -#include -#include -#endif -#if defined(__cplusplus) -#if defined(__arm64e__) && __has_include() -# include -#else -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wreserved-macro-identifier" -# ifndef __ptrauth_swift_value_witness_function_pointer -# define __ptrauth_swift_value_witness_function_pointer(x) -# endif -# ifndef __ptrauth_swift_class_method_pointer -# define __ptrauth_swift_class_method_pointer(x) -# endif -#pragma clang diagnostic pop -#endif -#endif - -#if !defined(SWIFT_TYPEDEFS) -# define SWIFT_TYPEDEFS 1 -# if __has_include() -# include -# elif !defined(__cplusplus) -typedef uint_least16_t char16_t; -typedef uint_least32_t char32_t; -# endif -typedef float swift_float2 __attribute__((__ext_vector_type__(2))); -typedef float swift_float3 __attribute__((__ext_vector_type__(3))); -typedef float swift_float4 __attribute__((__ext_vector_type__(4))); -typedef double swift_double2 __attribute__((__ext_vector_type__(2))); -typedef double swift_double3 __attribute__((__ext_vector_type__(3))); -typedef double swift_double4 __attribute__((__ext_vector_type__(4))); -typedef int swift_int2 __attribute__((__ext_vector_type__(2))); -typedef int swift_int3 __attribute__((__ext_vector_type__(3))); -typedef int swift_int4 __attribute__((__ext_vector_type__(4))); -typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2))); -typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3))); -typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); -#endif - -#if !defined(SWIFT_PASTE) -# define SWIFT_PASTE_HELPER(x, y) x##y -# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y) -#endif -#if !defined(SWIFT_METATYPE) -# define SWIFT_METATYPE(X) Class -#endif -#if !defined(SWIFT_CLASS_PROPERTY) -# if __has_feature(objc_class_property) -# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__ -# else -# define SWIFT_CLASS_PROPERTY(...) -# endif -#endif -#if !defined(SWIFT_RUNTIME_NAME) -# if __has_attribute(objc_runtime_name) -# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) -# else -# define SWIFT_RUNTIME_NAME(X) -# endif -#endif -#if !defined(SWIFT_COMPILE_NAME) -# if __has_attribute(swift_name) -# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) -# else -# define SWIFT_COMPILE_NAME(X) -# endif -#endif -#if !defined(SWIFT_METHOD_FAMILY) -# if __has_attribute(objc_method_family) -# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) -# else -# define SWIFT_METHOD_FAMILY(X) -# endif -#endif -#if !defined(SWIFT_NOESCAPE) -# if __has_attribute(noescape) -# define SWIFT_NOESCAPE __attribute__((noescape)) -# else -# define SWIFT_NOESCAPE -# endif -#endif -#if !defined(SWIFT_RELEASES_ARGUMENT) -# if __has_attribute(ns_consumed) -# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) -# else -# define SWIFT_RELEASES_ARGUMENT -# endif -#endif -#if !defined(SWIFT_WARN_UNUSED_RESULT) -# if __has_attribute(warn_unused_result) -# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) -# else -# define SWIFT_WARN_UNUSED_RESULT -# endif -#endif -#if !defined(SWIFT_NORETURN) -# if __has_attribute(noreturn) -# define SWIFT_NORETURN __attribute__((noreturn)) -# else -# define SWIFT_NORETURN -# endif -#endif -#if !defined(SWIFT_CLASS_EXTRA) -# define SWIFT_CLASS_EXTRA -#endif -#if !defined(SWIFT_PROTOCOL_EXTRA) -# define SWIFT_PROTOCOL_EXTRA -#endif -#if !defined(SWIFT_ENUM_EXTRA) -# define SWIFT_ENUM_EXTRA -#endif -#if !defined(SWIFT_CLASS) -# if __has_attribute(objc_subclassing_restricted) -# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA -# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# else -# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# endif -#endif -#if !defined(SWIFT_RESILIENT_CLASS) -# if __has_attribute(objc_class_stub) -# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub)) -# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME) -# else -# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) -# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME) -# endif -#endif -#if !defined(SWIFT_PROTOCOL) -# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA -# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA -#endif -#if !defined(SWIFT_EXTENSION) -# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__) -#endif -#if !defined(OBJC_DESIGNATED_INITIALIZER) -# if __has_attribute(objc_designated_initializer) -# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) -# else -# define OBJC_DESIGNATED_INITIALIZER -# endif -#endif -#if !defined(SWIFT_ENUM_ATTR) -# if __has_attribute(enum_extensibility) -# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility))) -# else -# define SWIFT_ENUM_ATTR(_extensibility) -# endif -#endif -#if !defined(SWIFT_ENUM) -# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type -# if __has_feature(generalized_swift_name) -# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type -# else -# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility) -# endif -#endif -#if !defined(SWIFT_UNAVAILABLE) -# define SWIFT_UNAVAILABLE __attribute__((unavailable)) -#endif -#if !defined(SWIFT_UNAVAILABLE_MSG) -# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg))) -#endif -#if !defined(SWIFT_AVAILABILITY) -# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__))) -#endif -#if !defined(SWIFT_WEAK_IMPORT) -# define SWIFT_WEAK_IMPORT __attribute__((weak_import)) -#endif -#if !defined(SWIFT_DEPRECATED) -# define SWIFT_DEPRECATED __attribute__((deprecated)) -#endif -#if !defined(SWIFT_DEPRECATED_MSG) -# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__))) -#endif -#if !defined(SWIFT_DEPRECATED_OBJC) -# if __has_feature(attribute_diagnose_if_objc) -# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) -# else -# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) -# endif -#endif -#if defined(__OBJC__) -#if !defined(IBSegueAction) -# define IBSegueAction -#endif -#endif -#if !defined(SWIFT_EXTERN) -# if defined(__cplusplus) -# define SWIFT_EXTERN extern "C" -# else -# define SWIFT_EXTERN extern -# endif -#endif -#if !defined(SWIFT_CALL) -# define SWIFT_CALL __attribute__((swiftcall)) -#endif -#if !defined(SWIFT_INDIRECT_RESULT) -# define SWIFT_INDIRECT_RESULT __attribute__((swift_indirect_result)) -#endif -#if !defined(SWIFT_CONTEXT) -# define SWIFT_CONTEXT __attribute__((swift_context)) -#endif -#if !defined(SWIFT_ERROR_RESULT) -# define SWIFT_ERROR_RESULT __attribute__((swift_error_result)) -#endif -#if defined(__cplusplus) -# define SWIFT_NOEXCEPT noexcept -#else -# define SWIFT_NOEXCEPT -#endif -#if !defined(SWIFT_C_INLINE_THUNK) -# if __has_attribute(always_inline) -# if __has_attribute(nodebug) -# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) __attribute__((nodebug)) -# else -# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) -# endif -# else -# define SWIFT_C_INLINE_THUNK inline -# endif -#endif -#if defined(_WIN32) -#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) -# define SWIFT_IMPORT_STDLIB_SYMBOL __declspec(dllimport) -#endif -#else -#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) -# define SWIFT_IMPORT_STDLIB_SYMBOL -#endif -#endif -#if defined(__OBJC__) -#if __has_feature(objc_modules) -#if __has_warning("-Watimport-in-framework-header") -#pragma clang diagnostic ignored "-Watimport-in-framework-header" -#endif -@import Foundation; -@import ObjectiveC; -@import Realm; -@import Realm.Swift; -#endif - -#endif -#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch" -#pragma clang diagnostic ignored "-Wduplicate-method-arg" -#if __has_warning("-Wpragma-clang-attribute") -# pragma clang diagnostic ignored "-Wpragma-clang-attribute" -#endif -#pragma clang diagnostic ignored "-Wunknown-pragmas" -#pragma clang diagnostic ignored "-Wnullability" -#pragma clang diagnostic ignored "-Wdollar-in-identifier-extension" - -#if __has_attribute(external_source_symbol) -# pragma push_macro("any") -# undef any -# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="RealmSwift",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol)) -# pragma pop_macro("any") -#endif - -#if defined(__OBJC__) -@class NSString; - -/// A type which has a custom representation in Realm events. -/// By default, objects are serialized to JSON using built-in rules which -/// include every property. If you wish to customize how a class is serialized -/// in events, you can declare it as conforming to this protocol and -/// define customEventRepresentation(). -SWIFT_PROTOCOL_NAMED("CustomEventRepresentable") -@protocol RLMCustomEventRepresentable -/// Get the custom event serialization for this object. -/// This function must return a valid JSON String, as this is included in a -/// larger JSON document. Implementations of this function should be “pure” -/// and access no data other than that which is obtainable from the Object -/// it is called on, and it should not mutate the object which it is called -/// on. This function is called on a background thread in a somewhat -/// unusual context, and attempting to access other data is likely to cause -/// problems. -- (NSString * _Nonnull)customEventRepresentation SWIFT_WARN_UNUSED_RESULT; -@end - -@class NSNumber; - -/// A 128-bit IEEE 754-2008 decimal floating point number. -/// This type is similar to Swift’s built-in Decimal type, but allocates bits differently, resulting in a different representable range. (NS)Decimal stores a significand of up to 38 digits long and an exponent from -128 to 127, while this type stores up to 34 digits of significand and an exponent from -6143 to 6144. -SWIFT_CLASS_NAMED("Decimal128") -@interface RealmSwiftDecimal128 : RLMDecimal128 -/// Creates a new zero-initialized Decimal128. -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -/// Converts the given value to a Decimal128. -/// The following types can be converted to Decimal128: -///
    -///
  • -/// Int (of any size) -///
  • -///
  • -/// Float -///
  • -///
  • -/// Double -///
  • -///
  • -/// String -///
  • -///
  • -/// NSNumber -///
  • -///
  • -/// Decimal -///
  • -///
-/// Passing a value with a type not in this list is a fatal error. Passing a string which cannot be parsed as a valid Decimal128 is a fatal error. -/// \param value The value to convert to a Decimal128. -/// -- (nonnull instancetype)initWithValue:(id _Nonnull)value OBJC_DESIGNATED_INITIALIZER; -/// Converts the given number to a Decimal128. -/// This initializer cannot fail and is never lossy. -/// \param number The number to convert to a Decimal128. -/// -- (nonnull instancetype)initWithNumber:(NSNumber * _Nonnull)number OBJC_DESIGNATED_INITIALIZER; -/// Parse the given string as a Decimal128. -/// This initializer never throws and is marked as throws only because removing it is a breaking -/// change. Strings which cannot be parsed as a Decimal128 return a value where isNaN is true. -/// \param string The string to parse. -/// -- (nullable instancetype)initWithString:(NSString * _Nonnull)string error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER; -@end - - - - - - - - - - - - - - - - - - -@class RLMObjectSchema; - -/// Object interface which allows untyped getters and setters for Objects. -/// :nodoc: -SWIFT_CLASS_NAMED("DynamicObject") -@interface RealmSwiftDynamicObject : RealmSwiftObject -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)value forKeyedSubscript:(NSString * _Nonnull)key; -/// :nodoc: -- (id _Nullable)valueForUndefinedKey:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -- (void)setValue:(id _Nullable)value forUndefinedKey:(NSString * _Nonnull)key; -/// :nodoc: -+ (BOOL)shouldIncludeInDefaultSchema SWIFT_WARN_UNUSED_RESULT; -+ (RLMObjectSchema * _Nullable)sharedSchema SWIFT_WARN_UNUSED_RESULT; -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -@end - - - - - - - - - - - - - - - -@class NSDate; - -/// A 12-byte (probably) unique object identifier. -/// ObjectIds are similar to a GUID or a UUID, and can be used to uniquely identify objects without a centralized ID generator. An ObjectID consists of: -///
    -///
  1. -/// A 4 byte timestamp measuring the creation time of the ObjectId in seconds since the Unix epoch. -///
  2. -///
  3. -/// A 5 byte random value -///
  4. -///
  5. -/// A 3 byte counter, initialized to a random value. -///
  6. -///
-/// ObjectIds are intended to be fast to generate. Sorting by an ObjectId field will typically result in the objects being sorted in creation order. -SWIFT_CLASS_NAMED("ObjectId") -@interface RealmSwiftObjectId : RLMObjectId -/// Creates a new zero-initialized ObjectId. -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -/// Creates a new randomly-initialized ObjectId. -+ (RealmSwiftObjectId * _Nonnull)objectId SWIFT_WARN_UNUSED_RESULT; -/// Creates a new ObjectId from the given 24-byte hexadecimal string. -/// Throws if the string is not 24 characters or contains any characters other than 0-9a-fA-F. -/// \param string The string to parse. -/// -- (nullable instancetype)initWithString:(NSString * _Nonnull)string error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER; -- (nonnull instancetype)initWithTimestamp:(NSDate * _Nonnull)timestamp machineIdentifier:(int32_t)machineIdentifier processIdentifier:(int32_t)processIdentifier SWIFT_UNAVAILABLE; -@end - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -@class RLMProperty; - -@interface RealmSwiftAsymmetricObject (SWIFT_EXTENSION(RealmSwift)) -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: AsymmetricObject { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - - - - -@interface RealmSwiftEmbeddedObject (SWIFT_EXTENSION(RealmSwift)) -/// :nodoc: -+ (BOOL)isEmbedded SWIFT_WARN_UNUSED_RESULT; -/// Indicates if the object can no longer be accessed because it is now invalid. -/// An object can no longer be accessed if the object has been deleted from the Realm that manages it, or if -/// invalidate() is called on that Realm. -@property (nonatomic, readonly, getter=isInvalidated) BOOL invalidated; -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the names of properties to ignore. These properties will not be managed by -/// the Realm that manages the object. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, any properties not -/// marked with @Persisted are automatically ignored. -/// -/// returns: -/// An array of property names to ignore. -+ (NSArray * _Nonnull)ignoredProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: EmbeddedObject { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - - - - - - -@interface RealmSwiftObject (SWIFT_EXTENSION(RealmSwift)) -/// Indicates if the object can no longer be accessed because it is now invalid. -/// An object can no longer be accessed if the object has been deleted from the Realm that manages it, or if -/// invalidate() is called on that Realm. This property is key-value observable. -@property (nonatomic, readonly, getter=isInvalidated) BOOL invalidated; -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the name of a property to be used as the primary key. -/// Only properties of types String, Int, ObjectId and UUID can be -/// designated as the primary key. Primary key properties enforce uniqueness -/// for each value whenever the property is set, which incurs minor overhead. -/// Indexes are created automatically for primary key properties. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, use -/// @Persisted(primaryKey: true) instead. -/// -/// returns: -/// The name of the property designated as the primary key, or -/// nil if the model has no primary key. -+ (NSString * _Nullable)primaryKey SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the names of properties to ignore. These -/// properties will not be managed by the Realm that manages the object. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, any properties not -/// marked with @Persisted are automatically ignored. -/// -/// returns: -/// An array of property names to ignore. -+ (NSArray * _Nonnull)ignoredProperties SWIFT_WARN_UNUSED_RESULT; -/// Returns an array of property names for properties which should be indexed. -/// Only string, integer, boolean, Date, and NSDate properties are supported. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, use -/// @Persisted(indexed: true) instead. -/// -/// returns: -/// An array of property names. -+ (NSArray * _Nonnull)indexedProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: Object { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// note: -/// In a migration block, when enumerating an old property with a public/private name, you will have to use -/// the old column name instead of the public one to retrieve the property value. -/// \code -/// let migrationBlock = { migration, oldSchemaVersion in -/// migration.enumerateObjects(ofType: "Person", { oldObj, newObj in -/// let oldPropertyValue = oldObj!["first_name"] as! String -/// // Use this value in migration -/// }) -/// } -/// -/// \endcodeThis has to be done as well when renaming a property. -/// \code -/// let migrationBlock = { migration, oldSchemaVersion in -/// migration.renameProperty(onType: "Person", from: "first_name", to: "complete_name") -/// } -/// -/// \endcode -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - -SWIFT_CLASS_NAMED("SwiftUIKVO") SWIFT_AVAILABILITY(watchos,introduced=6.0) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0) -@interface RLMSwiftUIKVO : NSObject -- (void)observeValueForKeyPath:(NSString * _Nullable)keyPath ofObject:(id _Nullable)object change:(NSDictionary * _Nullable)change context:(void * _Nullable)context; -- (nonnull instancetype)init SWIFT_UNAVAILABLE; -+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable"); -@end - - -SWIFT_AVAILABILITY(watchos,introduced=6.0) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0) -@interface RLMSwiftUIKVO (SWIFT_EXTENSION(RealmSwift)) -+ (BOOL)removeObserversFromObject:(NSObject * _Nonnull)object SWIFT_WARN_UNUSED_RESULT; -+ (void)addObserversToObject:(NSObject * _Nonnull)object; -@end - -#endif -#if __has_attribute(external_source_symbol) -# pragma clang attribute pop -#endif -#if defined(__cplusplus) -#endif -#pragma clang diagnostic pop -#endif - -#elif defined(__arm64__) && __arm64__ -// Generated by Apple Swift version 5.9 (swiftlang-5.9.0.128.106 clang-1500.0.40.1) -#ifndef REALMSWIFT_SWIFT_H -#define REALMSWIFT_SWIFT_H -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wgcc-compat" - -#if !defined(__has_include) -# define __has_include(x) 0 -#endif -#if !defined(__has_attribute) -# define __has_attribute(x) 0 -#endif -#if !defined(__has_feature) -# define __has_feature(x) 0 -#endif -#if !defined(__has_warning) -# define __has_warning(x) 0 -#endif - -#if __has_include() -# include -#endif - -#pragma clang diagnostic ignored "-Wauto-import" -#if defined(__OBJC__) -#include -#endif -#if defined(__cplusplus) -#include -#include -#include -#include -#include -#include -#include -#else -#include -#include -#include -#include -#endif -#if defined(__cplusplus) -#if defined(__arm64e__) && __has_include() -# include -#else -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wreserved-macro-identifier" -# ifndef __ptrauth_swift_value_witness_function_pointer -# define __ptrauth_swift_value_witness_function_pointer(x) -# endif -# ifndef __ptrauth_swift_class_method_pointer -# define __ptrauth_swift_class_method_pointer(x) -# endif -#pragma clang diagnostic pop -#endif -#endif - -#if !defined(SWIFT_TYPEDEFS) -# define SWIFT_TYPEDEFS 1 -# if __has_include() -# include -# elif !defined(__cplusplus) -typedef uint_least16_t char16_t; -typedef uint_least32_t char32_t; -# endif -typedef float swift_float2 __attribute__((__ext_vector_type__(2))); -typedef float swift_float3 __attribute__((__ext_vector_type__(3))); -typedef float swift_float4 __attribute__((__ext_vector_type__(4))); -typedef double swift_double2 __attribute__((__ext_vector_type__(2))); -typedef double swift_double3 __attribute__((__ext_vector_type__(3))); -typedef double swift_double4 __attribute__((__ext_vector_type__(4))); -typedef int swift_int2 __attribute__((__ext_vector_type__(2))); -typedef int swift_int3 __attribute__((__ext_vector_type__(3))); -typedef int swift_int4 __attribute__((__ext_vector_type__(4))); -typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2))); -typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3))); -typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); -#endif - -#if !defined(SWIFT_PASTE) -# define SWIFT_PASTE_HELPER(x, y) x##y -# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y) -#endif -#if !defined(SWIFT_METATYPE) -# define SWIFT_METATYPE(X) Class -#endif -#if !defined(SWIFT_CLASS_PROPERTY) -# if __has_feature(objc_class_property) -# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__ -# else -# define SWIFT_CLASS_PROPERTY(...) -# endif -#endif -#if !defined(SWIFT_RUNTIME_NAME) -# if __has_attribute(objc_runtime_name) -# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) -# else -# define SWIFT_RUNTIME_NAME(X) -# endif -#endif -#if !defined(SWIFT_COMPILE_NAME) -# if __has_attribute(swift_name) -# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) -# else -# define SWIFT_COMPILE_NAME(X) -# endif -#endif -#if !defined(SWIFT_METHOD_FAMILY) -# if __has_attribute(objc_method_family) -# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) -# else -# define SWIFT_METHOD_FAMILY(X) -# endif -#endif -#if !defined(SWIFT_NOESCAPE) -# if __has_attribute(noescape) -# define SWIFT_NOESCAPE __attribute__((noescape)) -# else -# define SWIFT_NOESCAPE -# endif -#endif -#if !defined(SWIFT_RELEASES_ARGUMENT) -# if __has_attribute(ns_consumed) -# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) -# else -# define SWIFT_RELEASES_ARGUMENT -# endif -#endif -#if !defined(SWIFT_WARN_UNUSED_RESULT) -# if __has_attribute(warn_unused_result) -# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) -# else -# define SWIFT_WARN_UNUSED_RESULT -# endif -#endif -#if !defined(SWIFT_NORETURN) -# if __has_attribute(noreturn) -# define SWIFT_NORETURN __attribute__((noreturn)) -# else -# define SWIFT_NORETURN -# endif -#endif -#if !defined(SWIFT_CLASS_EXTRA) -# define SWIFT_CLASS_EXTRA -#endif -#if !defined(SWIFT_PROTOCOL_EXTRA) -# define SWIFT_PROTOCOL_EXTRA -#endif -#if !defined(SWIFT_ENUM_EXTRA) -# define SWIFT_ENUM_EXTRA -#endif -#if !defined(SWIFT_CLASS) -# if __has_attribute(objc_subclassing_restricted) -# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA -# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# else -# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# endif -#endif -#if !defined(SWIFT_RESILIENT_CLASS) -# if __has_attribute(objc_class_stub) -# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub)) -# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME) -# else -# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) -# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME) -# endif -#endif -#if !defined(SWIFT_PROTOCOL) -# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA -# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA -#endif -#if !defined(SWIFT_EXTENSION) -# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__) -#endif -#if !defined(OBJC_DESIGNATED_INITIALIZER) -# if __has_attribute(objc_designated_initializer) -# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) -# else -# define OBJC_DESIGNATED_INITIALIZER -# endif -#endif -#if !defined(SWIFT_ENUM_ATTR) -# if __has_attribute(enum_extensibility) -# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility))) -# else -# define SWIFT_ENUM_ATTR(_extensibility) -# endif -#endif -#if !defined(SWIFT_ENUM) -# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type -# if __has_feature(generalized_swift_name) -# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type -# else -# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility) -# endif -#endif -#if !defined(SWIFT_UNAVAILABLE) -# define SWIFT_UNAVAILABLE __attribute__((unavailable)) -#endif -#if !defined(SWIFT_UNAVAILABLE_MSG) -# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg))) -#endif -#if !defined(SWIFT_AVAILABILITY) -# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__))) -#endif -#if !defined(SWIFT_WEAK_IMPORT) -# define SWIFT_WEAK_IMPORT __attribute__((weak_import)) -#endif -#if !defined(SWIFT_DEPRECATED) -# define SWIFT_DEPRECATED __attribute__((deprecated)) -#endif -#if !defined(SWIFT_DEPRECATED_MSG) -# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__))) -#endif -#if !defined(SWIFT_DEPRECATED_OBJC) -# if __has_feature(attribute_diagnose_if_objc) -# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) -# else -# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) -# endif -#endif -#if defined(__OBJC__) -#if !defined(IBSegueAction) -# define IBSegueAction -#endif -#endif -#if !defined(SWIFT_EXTERN) -# if defined(__cplusplus) -# define SWIFT_EXTERN extern "C" -# else -# define SWIFT_EXTERN extern -# endif -#endif -#if !defined(SWIFT_CALL) -# define SWIFT_CALL __attribute__((swiftcall)) -#endif -#if !defined(SWIFT_INDIRECT_RESULT) -# define SWIFT_INDIRECT_RESULT __attribute__((swift_indirect_result)) -#endif -#if !defined(SWIFT_CONTEXT) -# define SWIFT_CONTEXT __attribute__((swift_context)) -#endif -#if !defined(SWIFT_ERROR_RESULT) -# define SWIFT_ERROR_RESULT __attribute__((swift_error_result)) -#endif -#if defined(__cplusplus) -# define SWIFT_NOEXCEPT noexcept -#else -# define SWIFT_NOEXCEPT -#endif -#if !defined(SWIFT_C_INLINE_THUNK) -# if __has_attribute(always_inline) -# if __has_attribute(nodebug) -# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) __attribute__((nodebug)) -# else -# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) -# endif -# else -# define SWIFT_C_INLINE_THUNK inline -# endif -#endif -#if defined(_WIN32) -#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) -# define SWIFT_IMPORT_STDLIB_SYMBOL __declspec(dllimport) -#endif -#else -#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) -# define SWIFT_IMPORT_STDLIB_SYMBOL -#endif -#endif -#if defined(__OBJC__) -#if __has_feature(objc_modules) -#if __has_warning("-Watimport-in-framework-header") -#pragma clang diagnostic ignored "-Watimport-in-framework-header" -#endif -@import Foundation; -@import ObjectiveC; -@import Realm; -@import Realm.Swift; -#endif - -#endif -#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch" -#pragma clang diagnostic ignored "-Wduplicate-method-arg" -#if __has_warning("-Wpragma-clang-attribute") -# pragma clang diagnostic ignored "-Wpragma-clang-attribute" -#endif -#pragma clang diagnostic ignored "-Wunknown-pragmas" -#pragma clang diagnostic ignored "-Wnullability" -#pragma clang diagnostic ignored "-Wdollar-in-identifier-extension" - -#if __has_attribute(external_source_symbol) -# pragma push_macro("any") -# undef any -# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="RealmSwift",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol)) -# pragma pop_macro("any") -#endif - -#if defined(__OBJC__) -@class NSString; - -/// A type which has a custom representation in Realm events. -/// By default, objects are serialized to JSON using built-in rules which -/// include every property. If you wish to customize how a class is serialized -/// in events, you can declare it as conforming to this protocol and -/// define customEventRepresentation(). -SWIFT_PROTOCOL_NAMED("CustomEventRepresentable") -@protocol RLMCustomEventRepresentable -/// Get the custom event serialization for this object. -/// This function must return a valid JSON String, as this is included in a -/// larger JSON document. Implementations of this function should be “pure” -/// and access no data other than that which is obtainable from the Object -/// it is called on, and it should not mutate the object which it is called -/// on. This function is called on a background thread in a somewhat -/// unusual context, and attempting to access other data is likely to cause -/// problems. -- (NSString * _Nonnull)customEventRepresentation SWIFT_WARN_UNUSED_RESULT; -@end - -@class NSNumber; - -/// A 128-bit IEEE 754-2008 decimal floating point number. -/// This type is similar to Swift’s built-in Decimal type, but allocates bits differently, resulting in a different representable range. (NS)Decimal stores a significand of up to 38 digits long and an exponent from -128 to 127, while this type stores up to 34 digits of significand and an exponent from -6143 to 6144. -SWIFT_CLASS_NAMED("Decimal128") -@interface RealmSwiftDecimal128 : RLMDecimal128 -/// Creates a new zero-initialized Decimal128. -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -/// Converts the given value to a Decimal128. -/// The following types can be converted to Decimal128: -///
    -///
  • -/// Int (of any size) -///
  • -///
  • -/// Float -///
  • -///
  • -/// Double -///
  • -///
  • -/// String -///
  • -///
  • -/// NSNumber -///
  • -///
  • -/// Decimal -///
  • -///
-/// Passing a value with a type not in this list is a fatal error. Passing a string which cannot be parsed as a valid Decimal128 is a fatal error. -/// \param value The value to convert to a Decimal128. -/// -- (nonnull instancetype)initWithValue:(id _Nonnull)value OBJC_DESIGNATED_INITIALIZER; -/// Converts the given number to a Decimal128. -/// This initializer cannot fail and is never lossy. -/// \param number The number to convert to a Decimal128. -/// -- (nonnull instancetype)initWithNumber:(NSNumber * _Nonnull)number OBJC_DESIGNATED_INITIALIZER; -/// Parse the given string as a Decimal128. -/// This initializer never throws and is marked as throws only because removing it is a breaking -/// change. Strings which cannot be parsed as a Decimal128 return a value where isNaN is true. -/// \param string The string to parse. -/// -- (nullable instancetype)initWithString:(NSString * _Nonnull)string error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER; -@end - - - - - - - - - - - - - - - - - - -@class RLMObjectSchema; - -/// Object interface which allows untyped getters and setters for Objects. -/// :nodoc: -SWIFT_CLASS_NAMED("DynamicObject") -@interface RealmSwiftDynamicObject : RealmSwiftObject -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)value forKeyedSubscript:(NSString * _Nonnull)key; -/// :nodoc: -- (id _Nullable)valueForUndefinedKey:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -- (void)setValue:(id _Nullable)value forUndefinedKey:(NSString * _Nonnull)key; -/// :nodoc: -+ (BOOL)shouldIncludeInDefaultSchema SWIFT_WARN_UNUSED_RESULT; -+ (RLMObjectSchema * _Nullable)sharedSchema SWIFT_WARN_UNUSED_RESULT; -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -@end - - - - - - - - - - - - - - - -@class NSDate; - -/// A 12-byte (probably) unique object identifier. -/// ObjectIds are similar to a GUID or a UUID, and can be used to uniquely identify objects without a centralized ID generator. An ObjectID consists of: -///
    -///
  1. -/// A 4 byte timestamp measuring the creation time of the ObjectId in seconds since the Unix epoch. -///
  2. -///
  3. -/// A 5 byte random value -///
  4. -///
  5. -/// A 3 byte counter, initialized to a random value. -///
  6. -///
-/// ObjectIds are intended to be fast to generate. Sorting by an ObjectId field will typically result in the objects being sorted in creation order. -SWIFT_CLASS_NAMED("ObjectId") -@interface RealmSwiftObjectId : RLMObjectId -/// Creates a new zero-initialized ObjectId. -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -/// Creates a new randomly-initialized ObjectId. -+ (RealmSwiftObjectId * _Nonnull)objectId SWIFT_WARN_UNUSED_RESULT; -/// Creates a new ObjectId from the given 24-byte hexadecimal string. -/// Throws if the string is not 24 characters or contains any characters other than 0-9a-fA-F. -/// \param string The string to parse. -/// -- (nullable instancetype)initWithString:(NSString * _Nonnull)string error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER; -- (nonnull instancetype)initWithTimestamp:(NSDate * _Nonnull)timestamp machineIdentifier:(int32_t)machineIdentifier processIdentifier:(int32_t)processIdentifier SWIFT_UNAVAILABLE; -@end - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -@class RLMProperty; - -@interface RealmSwiftAsymmetricObject (SWIFT_EXTENSION(RealmSwift)) -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: AsymmetricObject { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - - - - -@interface RealmSwiftEmbeddedObject (SWIFT_EXTENSION(RealmSwift)) -/// :nodoc: -+ (BOOL)isEmbedded SWIFT_WARN_UNUSED_RESULT; -/// Indicates if the object can no longer be accessed because it is now invalid. -/// An object can no longer be accessed if the object has been deleted from the Realm that manages it, or if -/// invalidate() is called on that Realm. -@property (nonatomic, readonly, getter=isInvalidated) BOOL invalidated; -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the names of properties to ignore. These properties will not be managed by -/// the Realm that manages the object. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, any properties not -/// marked with @Persisted are automatically ignored. -/// -/// returns: -/// An array of property names to ignore. -+ (NSArray * _Nonnull)ignoredProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: EmbeddedObject { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - - - - - - -@interface RealmSwiftObject (SWIFT_EXTENSION(RealmSwift)) -/// Indicates if the object can no longer be accessed because it is now invalid. -/// An object can no longer be accessed if the object has been deleted from the Realm that manages it, or if -/// invalidate() is called on that Realm. This property is key-value observable. -@property (nonatomic, readonly, getter=isInvalidated) BOOL invalidated; -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the name of a property to be used as the primary key. -/// Only properties of types String, Int, ObjectId and UUID can be -/// designated as the primary key. Primary key properties enforce uniqueness -/// for each value whenever the property is set, which incurs minor overhead. -/// Indexes are created automatically for primary key properties. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, use -/// @Persisted(primaryKey: true) instead. -/// -/// returns: -/// The name of the property designated as the primary key, or -/// nil if the model has no primary key. -+ (NSString * _Nullable)primaryKey SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the names of properties to ignore. These -/// properties will not be managed by the Realm that manages the object. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, any properties not -/// marked with @Persisted are automatically ignored. -/// -/// returns: -/// An array of property names to ignore. -+ (NSArray * _Nonnull)ignoredProperties SWIFT_WARN_UNUSED_RESULT; -/// Returns an array of property names for properties which should be indexed. -/// Only string, integer, boolean, Date, and NSDate properties are supported. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, use -/// @Persisted(indexed: true) instead. -/// -/// returns: -/// An array of property names. -+ (NSArray * _Nonnull)indexedProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: Object { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// note: -/// In a migration block, when enumerating an old property with a public/private name, you will have to use -/// the old column name instead of the public one to retrieve the property value. -/// \code -/// let migrationBlock = { migration, oldSchemaVersion in -/// migration.enumerateObjects(ofType: "Person", { oldObj, newObj in -/// let oldPropertyValue = oldObj!["first_name"] as! String -/// // Use this value in migration -/// }) -/// } -/// -/// \endcodeThis has to be done as well when renaming a property. -/// \code -/// let migrationBlock = { migration, oldSchemaVersion in -/// migration.renameProperty(onType: "Person", from: "first_name", to: "complete_name") -/// } -/// -/// \endcode -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - -SWIFT_CLASS_NAMED("SwiftUIKVO") SWIFT_AVAILABILITY(watchos,introduced=6.0) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0) -@interface RLMSwiftUIKVO : NSObject -- (void)observeValueForKeyPath:(NSString * _Nullable)keyPath ofObject:(id _Nullable)object change:(NSDictionary * _Nullable)change context:(void * _Nullable)context; -- (nonnull instancetype)init SWIFT_UNAVAILABLE; -+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable"); -@end - - -SWIFT_AVAILABILITY(watchos,introduced=6.0) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0) -@interface RLMSwiftUIKVO (SWIFT_EXTENSION(RealmSwift)) -+ (BOOL)removeObserversFromObject:(NSObject * _Nonnull)object SWIFT_WARN_UNUSED_RESULT; -+ (void)addObserversToObject:(NSObject * _Nonnull)object; -@end - -#endif -#if __has_attribute(external_source_symbol) -# pragma clang attribute pop -#endif -#if defined(__cplusplus) -#endif -#pragma clang diagnostic pop -#endif - -#elif defined(__ARM_ARCH_7K__) && __ARM_ARCH_7K__ -// Generated by Apple Swift version 5.9 (swiftlang-5.9.0.128.106 clang-1500.0.40.1) -#ifndef REALMSWIFT_SWIFT_H -#define REALMSWIFT_SWIFT_H -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wgcc-compat" - -#if !defined(__has_include) -# define __has_include(x) 0 -#endif -#if !defined(__has_attribute) -# define __has_attribute(x) 0 -#endif -#if !defined(__has_feature) -# define __has_feature(x) 0 -#endif -#if !defined(__has_warning) -# define __has_warning(x) 0 -#endif - -#if __has_include() -# include -#endif - -#pragma clang diagnostic ignored "-Wauto-import" -#if defined(__OBJC__) -#include -#endif -#if defined(__cplusplus) -#include -#include -#include -#include -#include -#include -#include -#else -#include -#include -#include -#include -#endif -#if defined(__cplusplus) -#if defined(__arm64e__) && __has_include() -# include -#else -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wreserved-macro-identifier" -# ifndef __ptrauth_swift_value_witness_function_pointer -# define __ptrauth_swift_value_witness_function_pointer(x) -# endif -# ifndef __ptrauth_swift_class_method_pointer -# define __ptrauth_swift_class_method_pointer(x) -# endif -#pragma clang diagnostic pop -#endif -#endif - -#if !defined(SWIFT_TYPEDEFS) -# define SWIFT_TYPEDEFS 1 -# if __has_include() -# include -# elif !defined(__cplusplus) -typedef uint_least16_t char16_t; -typedef uint_least32_t char32_t; -# endif -typedef float swift_float2 __attribute__((__ext_vector_type__(2))); -typedef float swift_float3 __attribute__((__ext_vector_type__(3))); -typedef float swift_float4 __attribute__((__ext_vector_type__(4))); -typedef double swift_double2 __attribute__((__ext_vector_type__(2))); -typedef double swift_double3 __attribute__((__ext_vector_type__(3))); -typedef double swift_double4 __attribute__((__ext_vector_type__(4))); -typedef int swift_int2 __attribute__((__ext_vector_type__(2))); -typedef int swift_int3 __attribute__((__ext_vector_type__(3))); -typedef int swift_int4 __attribute__((__ext_vector_type__(4))); -typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2))); -typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3))); -typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); -#endif - -#if !defined(SWIFT_PASTE) -# define SWIFT_PASTE_HELPER(x, y) x##y -# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y) -#endif -#if !defined(SWIFT_METATYPE) -# define SWIFT_METATYPE(X) Class -#endif -#if !defined(SWIFT_CLASS_PROPERTY) -# if __has_feature(objc_class_property) -# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__ -# else -# define SWIFT_CLASS_PROPERTY(...) -# endif -#endif -#if !defined(SWIFT_RUNTIME_NAME) -# if __has_attribute(objc_runtime_name) -# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) -# else -# define SWIFT_RUNTIME_NAME(X) -# endif -#endif -#if !defined(SWIFT_COMPILE_NAME) -# if __has_attribute(swift_name) -# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) -# else -# define SWIFT_COMPILE_NAME(X) -# endif -#endif -#if !defined(SWIFT_METHOD_FAMILY) -# if __has_attribute(objc_method_family) -# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) -# else -# define SWIFT_METHOD_FAMILY(X) -# endif -#endif -#if !defined(SWIFT_NOESCAPE) -# if __has_attribute(noescape) -# define SWIFT_NOESCAPE __attribute__((noescape)) -# else -# define SWIFT_NOESCAPE -# endif -#endif -#if !defined(SWIFT_RELEASES_ARGUMENT) -# if __has_attribute(ns_consumed) -# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) -# else -# define SWIFT_RELEASES_ARGUMENT -# endif -#endif -#if !defined(SWIFT_WARN_UNUSED_RESULT) -# if __has_attribute(warn_unused_result) -# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) -# else -# define SWIFT_WARN_UNUSED_RESULT -# endif -#endif -#if !defined(SWIFT_NORETURN) -# if __has_attribute(noreturn) -# define SWIFT_NORETURN __attribute__((noreturn)) -# else -# define SWIFT_NORETURN -# endif -#endif -#if !defined(SWIFT_CLASS_EXTRA) -# define SWIFT_CLASS_EXTRA -#endif -#if !defined(SWIFT_PROTOCOL_EXTRA) -# define SWIFT_PROTOCOL_EXTRA -#endif -#if !defined(SWIFT_ENUM_EXTRA) -# define SWIFT_ENUM_EXTRA -#endif -#if !defined(SWIFT_CLASS) -# if __has_attribute(objc_subclassing_restricted) -# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA -# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# else -# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# endif -#endif -#if !defined(SWIFT_RESILIENT_CLASS) -# if __has_attribute(objc_class_stub) -# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub)) -# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME) -# else -# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) -# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME) -# endif -#endif -#if !defined(SWIFT_PROTOCOL) -# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA -# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA -#endif -#if !defined(SWIFT_EXTENSION) -# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__) -#endif -#if !defined(OBJC_DESIGNATED_INITIALIZER) -# if __has_attribute(objc_designated_initializer) -# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) -# else -# define OBJC_DESIGNATED_INITIALIZER -# endif -#endif -#if !defined(SWIFT_ENUM_ATTR) -# if __has_attribute(enum_extensibility) -# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility))) -# else -# define SWIFT_ENUM_ATTR(_extensibility) -# endif -#endif -#if !defined(SWIFT_ENUM) -# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type -# if __has_feature(generalized_swift_name) -# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type -# else -# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility) -# endif -#endif -#if !defined(SWIFT_UNAVAILABLE) -# define SWIFT_UNAVAILABLE __attribute__((unavailable)) -#endif -#if !defined(SWIFT_UNAVAILABLE_MSG) -# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg))) -#endif -#if !defined(SWIFT_AVAILABILITY) -# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__))) -#endif -#if !defined(SWIFT_WEAK_IMPORT) -# define SWIFT_WEAK_IMPORT __attribute__((weak_import)) -#endif -#if !defined(SWIFT_DEPRECATED) -# define SWIFT_DEPRECATED __attribute__((deprecated)) -#endif -#if !defined(SWIFT_DEPRECATED_MSG) -# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__))) -#endif -#if !defined(SWIFT_DEPRECATED_OBJC) -# if __has_feature(attribute_diagnose_if_objc) -# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) -# else -# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) -# endif -#endif -#if defined(__OBJC__) -#if !defined(IBSegueAction) -# define IBSegueAction -#endif -#endif -#if !defined(SWIFT_EXTERN) -# if defined(__cplusplus) -# define SWIFT_EXTERN extern "C" -# else -# define SWIFT_EXTERN extern -# endif -#endif -#if !defined(SWIFT_CALL) -# define SWIFT_CALL __attribute__((swiftcall)) -#endif -#if !defined(SWIFT_INDIRECT_RESULT) -# define SWIFT_INDIRECT_RESULT __attribute__((swift_indirect_result)) -#endif -#if !defined(SWIFT_CONTEXT) -# define SWIFT_CONTEXT __attribute__((swift_context)) -#endif -#if !defined(SWIFT_ERROR_RESULT) -# define SWIFT_ERROR_RESULT __attribute__((swift_error_result)) -#endif -#if defined(__cplusplus) -# define SWIFT_NOEXCEPT noexcept -#else -# define SWIFT_NOEXCEPT -#endif -#if !defined(SWIFT_C_INLINE_THUNK) -# if __has_attribute(always_inline) -# if __has_attribute(nodebug) -# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) __attribute__((nodebug)) -# else -# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) -# endif -# else -# define SWIFT_C_INLINE_THUNK inline -# endif -#endif -#if defined(_WIN32) -#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) -# define SWIFT_IMPORT_STDLIB_SYMBOL __declspec(dllimport) -#endif -#else -#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) -# define SWIFT_IMPORT_STDLIB_SYMBOL -#endif -#endif -#if defined(__OBJC__) -#if __has_feature(objc_modules) -#if __has_warning("-Watimport-in-framework-header") -#pragma clang diagnostic ignored "-Watimport-in-framework-header" -#endif -@import Foundation; -@import ObjectiveC; -@import Realm; -@import Realm.Swift; -#endif - -#endif -#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch" -#pragma clang diagnostic ignored "-Wduplicate-method-arg" -#if __has_warning("-Wpragma-clang-attribute") -# pragma clang diagnostic ignored "-Wpragma-clang-attribute" -#endif -#pragma clang diagnostic ignored "-Wunknown-pragmas" -#pragma clang diagnostic ignored "-Wnullability" -#pragma clang diagnostic ignored "-Wdollar-in-identifier-extension" - -#if __has_attribute(external_source_symbol) -# pragma push_macro("any") -# undef any -# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="RealmSwift",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol)) -# pragma pop_macro("any") -#endif - -#if defined(__OBJC__) -@class NSString; - -/// A type which has a custom representation in Realm events. -/// By default, objects are serialized to JSON using built-in rules which -/// include every property. If you wish to customize how a class is serialized -/// in events, you can declare it as conforming to this protocol and -/// define customEventRepresentation(). -SWIFT_PROTOCOL_NAMED("CustomEventRepresentable") -@protocol RLMCustomEventRepresentable -/// Get the custom event serialization for this object. -/// This function must return a valid JSON String, as this is included in a -/// larger JSON document. Implementations of this function should be “pure” -/// and access no data other than that which is obtainable from the Object -/// it is called on, and it should not mutate the object which it is called -/// on. This function is called on a background thread in a somewhat -/// unusual context, and attempting to access other data is likely to cause -/// problems. -- (NSString * _Nonnull)customEventRepresentation SWIFT_WARN_UNUSED_RESULT; -@end - -@class NSNumber; - -/// A 128-bit IEEE 754-2008 decimal floating point number. -/// This type is similar to Swift’s built-in Decimal type, but allocates bits differently, resulting in a different representable range. (NS)Decimal stores a significand of up to 38 digits long and an exponent from -128 to 127, while this type stores up to 34 digits of significand and an exponent from -6143 to 6144. -SWIFT_CLASS_NAMED("Decimal128") -@interface RealmSwiftDecimal128 : RLMDecimal128 -/// Creates a new zero-initialized Decimal128. -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -/// Converts the given value to a Decimal128. -/// The following types can be converted to Decimal128: -///
    -///
  • -/// Int (of any size) -///
  • -///
  • -/// Float -///
  • -///
  • -/// Double -///
  • -///
  • -/// String -///
  • -///
  • -/// NSNumber -///
  • -///
  • -/// Decimal -///
  • -///
-/// Passing a value with a type not in this list is a fatal error. Passing a string which cannot be parsed as a valid Decimal128 is a fatal error. -/// \param value The value to convert to a Decimal128. -/// -- (nonnull instancetype)initWithValue:(id _Nonnull)value OBJC_DESIGNATED_INITIALIZER; -/// Converts the given number to a Decimal128. -/// This initializer cannot fail and is never lossy. -/// \param number The number to convert to a Decimal128. -/// -- (nonnull instancetype)initWithNumber:(NSNumber * _Nonnull)number OBJC_DESIGNATED_INITIALIZER; -/// Parse the given string as a Decimal128. -/// This initializer never throws and is marked as throws only because removing it is a breaking -/// change. Strings which cannot be parsed as a Decimal128 return a value where isNaN is true. -/// \param string The string to parse. -/// -- (nullable instancetype)initWithString:(NSString * _Nonnull)string error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER; -@end - - - - - - - - - - - - - - - - - - -@class RLMObjectSchema; - -/// Object interface which allows untyped getters and setters for Objects. -/// :nodoc: -SWIFT_CLASS_NAMED("DynamicObject") -@interface RealmSwiftDynamicObject : RealmSwiftObject -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)value forKeyedSubscript:(NSString * _Nonnull)key; -/// :nodoc: -- (id _Nullable)valueForUndefinedKey:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -- (void)setValue:(id _Nullable)value forUndefinedKey:(NSString * _Nonnull)key; -/// :nodoc: -+ (BOOL)shouldIncludeInDefaultSchema SWIFT_WARN_UNUSED_RESULT; -+ (RLMObjectSchema * _Nullable)sharedSchema SWIFT_WARN_UNUSED_RESULT; -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -@end - - - - - - - - - - - - - - - -@class NSDate; - -/// A 12-byte (probably) unique object identifier. -/// ObjectIds are similar to a GUID or a UUID, and can be used to uniquely identify objects without a centralized ID generator. An ObjectID consists of: -///
    -///
  1. -/// A 4 byte timestamp measuring the creation time of the ObjectId in seconds since the Unix epoch. -///
  2. -///
  3. -/// A 5 byte random value -///
  4. -///
  5. -/// A 3 byte counter, initialized to a random value. -///
  6. -///
-/// ObjectIds are intended to be fast to generate. Sorting by an ObjectId field will typically result in the objects being sorted in creation order. -SWIFT_CLASS_NAMED("ObjectId") -@interface RealmSwiftObjectId : RLMObjectId -/// Creates a new zero-initialized ObjectId. -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -/// Creates a new randomly-initialized ObjectId. -+ (RealmSwiftObjectId * _Nonnull)objectId SWIFT_WARN_UNUSED_RESULT; -/// Creates a new ObjectId from the given 24-byte hexadecimal string. -/// Throws if the string is not 24 characters or contains any characters other than 0-9a-fA-F. -/// \param string The string to parse. -/// -- (nullable instancetype)initWithString:(NSString * _Nonnull)string error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER; -- (nonnull instancetype)initWithTimestamp:(NSDate * _Nonnull)timestamp machineIdentifier:(int32_t)machineIdentifier processIdentifier:(int32_t)processIdentifier SWIFT_UNAVAILABLE; -@end - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -@class RLMProperty; - -@interface RealmSwiftAsymmetricObject (SWIFT_EXTENSION(RealmSwift)) -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: AsymmetricObject { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - - - - -@interface RealmSwiftEmbeddedObject (SWIFT_EXTENSION(RealmSwift)) -/// :nodoc: -+ (BOOL)isEmbedded SWIFT_WARN_UNUSED_RESULT; -/// Indicates if the object can no longer be accessed because it is now invalid. -/// An object can no longer be accessed if the object has been deleted from the Realm that manages it, or if -/// invalidate() is called on that Realm. -@property (nonatomic, readonly, getter=isInvalidated) BOOL invalidated; -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the names of properties to ignore. These properties will not be managed by -/// the Realm that manages the object. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, any properties not -/// marked with @Persisted are automatically ignored. -/// -/// returns: -/// An array of property names to ignore. -+ (NSArray * _Nonnull)ignoredProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: EmbeddedObject { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - - - - - - -@interface RealmSwiftObject (SWIFT_EXTENSION(RealmSwift)) -/// Indicates if the object can no longer be accessed because it is now invalid. -/// An object can no longer be accessed if the object has been deleted from the Realm that manages it, or if -/// invalidate() is called on that Realm. This property is key-value observable. -@property (nonatomic, readonly, getter=isInvalidated) BOOL invalidated; -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the name of a property to be used as the primary key. -/// Only properties of types String, Int, ObjectId and UUID can be -/// designated as the primary key. Primary key properties enforce uniqueness -/// for each value whenever the property is set, which incurs minor overhead. -/// Indexes are created automatically for primary key properties. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, use -/// @Persisted(primaryKey: true) instead. -/// -/// returns: -/// The name of the property designated as the primary key, or -/// nil if the model has no primary key. -+ (NSString * _Nullable)primaryKey SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the names of properties to ignore. These -/// properties will not be managed by the Realm that manages the object. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, any properties not -/// marked with @Persisted are automatically ignored. -/// -/// returns: -/// An array of property names to ignore. -+ (NSArray * _Nonnull)ignoredProperties SWIFT_WARN_UNUSED_RESULT; -/// Returns an array of property names for properties which should be indexed. -/// Only string, integer, boolean, Date, and NSDate properties are supported. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, use -/// @Persisted(indexed: true) instead. -/// -/// returns: -/// An array of property names. -+ (NSArray * _Nonnull)indexedProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: Object { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// note: -/// In a migration block, when enumerating an old property with a public/private name, you will have to use -/// the old column name instead of the public one to retrieve the property value. -/// \code -/// let migrationBlock = { migration, oldSchemaVersion in -/// migration.enumerateObjects(ofType: "Person", { oldObj, newObj in -/// let oldPropertyValue = oldObj!["first_name"] as! String -/// // Use this value in migration -/// }) -/// } -/// -/// \endcodeThis has to be done as well when renaming a property. -/// \code -/// let migrationBlock = { migration, oldSchemaVersion in -/// migration.renameProperty(onType: "Person", from: "first_name", to: "complete_name") -/// } -/// -/// \endcode -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - -SWIFT_CLASS_NAMED("SwiftUIKVO") SWIFT_AVAILABILITY(watchos,introduced=6.0) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0) -@interface RLMSwiftUIKVO : NSObject -- (void)observeValueForKeyPath:(NSString * _Nullable)keyPath ofObject:(id _Nullable)object change:(NSDictionary * _Nullable)change context:(void * _Nullable)context; -- (nonnull instancetype)init SWIFT_UNAVAILABLE; -+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable"); -@end - - -SWIFT_AVAILABILITY(watchos,introduced=6.0) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0) -@interface RLMSwiftUIKVO (SWIFT_EXTENSION(RealmSwift)) -+ (BOOL)removeObserversFromObject:(NSObject * _Nonnull)object SWIFT_WARN_UNUSED_RESULT; -+ (void)addObserversToObject:(NSObject * _Nonnull)object; -@end - -#endif -#if __has_attribute(external_source_symbol) -# pragma clang attribute pop -#endif -#if defined(__cplusplus) -#endif -#pragma clang diagnostic pop -#endif - -#else -#error unsupported Swift architecture -#endif diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Info.plist b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Info.plist deleted file mode 100644 index ab5f35577..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Info.plist and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/arm64-apple-watchos.swiftsourceinfo b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/arm64-apple-watchos.swiftsourceinfo deleted file mode 100644 index c4bb540dc..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/arm64-apple-watchos.swiftsourceinfo and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/arm64_32-apple-watchos.swiftsourceinfo b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/arm64_32-apple-watchos.swiftsourceinfo deleted file mode 100644 index 6f853504e..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/arm64_32-apple-watchos.swiftsourceinfo and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/armv7k-apple-watchos.swiftsourceinfo b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/armv7k-apple-watchos.swiftsourceinfo deleted file mode 100644 index 3d2a23963..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/armv7k-apple-watchos.swiftsourceinfo and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-watchos.abi.json b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-watchos.abi.json deleted file mode 100644 index dc109fc09..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-watchos.abi.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "ABIRoot": { - "kind": "Root", - "name": "TopLevel", - "printedName": "TopLevel", - "json_format_version": 8 - }, - "ConstValues": [] -} \ No newline at end of file diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-watchos.swiftdoc b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-watchos.swiftdoc deleted file mode 100644 index 27ae29733..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-watchos.swiftdoc and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-watchos.swiftmodule b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-watchos.swiftmodule deleted file mode 100644 index 5c4806d3f..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-watchos.swiftmodule and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64_32-apple-watchos.abi.json b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64_32-apple-watchos.abi.json deleted file mode 100644 index dc109fc09..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64_32-apple-watchos.abi.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "ABIRoot": { - "kind": "Root", - "name": "TopLevel", - "printedName": "TopLevel", - "json_format_version": 8 - }, - "ConstValues": [] -} \ No newline at end of file diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64_32-apple-watchos.swiftdoc b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64_32-apple-watchos.swiftdoc deleted file mode 100644 index 7b5653636..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64_32-apple-watchos.swiftdoc and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64_32-apple-watchos.swiftmodule b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64_32-apple-watchos.swiftmodule deleted file mode 100644 index c3f75e4ef..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64_32-apple-watchos.swiftmodule and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Modules/RealmSwift.swiftmodule/armv7k-apple-watchos.abi.json b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Modules/RealmSwift.swiftmodule/armv7k-apple-watchos.abi.json deleted file mode 100644 index dc109fc09..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Modules/RealmSwift.swiftmodule/armv7k-apple-watchos.abi.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "ABIRoot": { - "kind": "Root", - "name": "TopLevel", - "printedName": "TopLevel", - "json_format_version": 8 - }, - "ConstValues": [] -} \ No newline at end of file diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Modules/RealmSwift.swiftmodule/armv7k-apple-watchos.swiftdoc b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Modules/RealmSwift.swiftmodule/armv7k-apple-watchos.swiftdoc deleted file mode 100644 index 77206f41b..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Modules/RealmSwift.swiftmodule/armv7k-apple-watchos.swiftdoc and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Modules/RealmSwift.swiftmodule/armv7k-apple-watchos.swiftmodule b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Modules/RealmSwift.swiftmodule/armv7k-apple-watchos.swiftmodule deleted file mode 100644 index a6bad1827..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Modules/RealmSwift.swiftmodule/armv7k-apple-watchos.swiftmodule and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Modules/module.modulemap b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Modules/module.modulemap deleted file mode 100644 index 5742239a8..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/Modules/module.modulemap +++ /dev/null @@ -1,4 +0,0 @@ -framework module RealmSwift { - header "RealmSwift-Swift.h" - requires objc -} diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/RealmSwift b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/RealmSwift deleted file mode 100755 index c77fc557a..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_arm64_32_armv7k/RealmSwift.framework/RealmSwift and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Headers/RealmSwift-Swift.h b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Headers/RealmSwift-Swift.h deleted file mode 100644 index 70d2d0c46..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Headers/RealmSwift-Swift.h +++ /dev/null @@ -1,2173 +0,0 @@ -#if 0 -#elif defined(__arm64__) && __arm64__ -// Generated by Apple Swift version 5.9 (swiftlang-5.9.0.128.106 clang-1500.0.40.1) -#ifndef REALMSWIFT_SWIFT_H -#define REALMSWIFT_SWIFT_H -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wgcc-compat" - -#if !defined(__has_include) -# define __has_include(x) 0 -#endif -#if !defined(__has_attribute) -# define __has_attribute(x) 0 -#endif -#if !defined(__has_feature) -# define __has_feature(x) 0 -#endif -#if !defined(__has_warning) -# define __has_warning(x) 0 -#endif - -#if __has_include() -# include -#endif - -#pragma clang diagnostic ignored "-Wauto-import" -#if defined(__OBJC__) -#include -#endif -#if defined(__cplusplus) -#include -#include -#include -#include -#include -#include -#include -#else -#include -#include -#include -#include -#endif -#if defined(__cplusplus) -#if defined(__arm64e__) && __has_include() -# include -#else -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wreserved-macro-identifier" -# ifndef __ptrauth_swift_value_witness_function_pointer -# define __ptrauth_swift_value_witness_function_pointer(x) -# endif -# ifndef __ptrauth_swift_class_method_pointer -# define __ptrauth_swift_class_method_pointer(x) -# endif -#pragma clang diagnostic pop -#endif -#endif - -#if !defined(SWIFT_TYPEDEFS) -# define SWIFT_TYPEDEFS 1 -# if __has_include() -# include -# elif !defined(__cplusplus) -typedef uint_least16_t char16_t; -typedef uint_least32_t char32_t; -# endif -typedef float swift_float2 __attribute__((__ext_vector_type__(2))); -typedef float swift_float3 __attribute__((__ext_vector_type__(3))); -typedef float swift_float4 __attribute__((__ext_vector_type__(4))); -typedef double swift_double2 __attribute__((__ext_vector_type__(2))); -typedef double swift_double3 __attribute__((__ext_vector_type__(3))); -typedef double swift_double4 __attribute__((__ext_vector_type__(4))); -typedef int swift_int2 __attribute__((__ext_vector_type__(2))); -typedef int swift_int3 __attribute__((__ext_vector_type__(3))); -typedef int swift_int4 __attribute__((__ext_vector_type__(4))); -typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2))); -typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3))); -typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); -#endif - -#if !defined(SWIFT_PASTE) -# define SWIFT_PASTE_HELPER(x, y) x##y -# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y) -#endif -#if !defined(SWIFT_METATYPE) -# define SWIFT_METATYPE(X) Class -#endif -#if !defined(SWIFT_CLASS_PROPERTY) -# if __has_feature(objc_class_property) -# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__ -# else -# define SWIFT_CLASS_PROPERTY(...) -# endif -#endif -#if !defined(SWIFT_RUNTIME_NAME) -# if __has_attribute(objc_runtime_name) -# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) -# else -# define SWIFT_RUNTIME_NAME(X) -# endif -#endif -#if !defined(SWIFT_COMPILE_NAME) -# if __has_attribute(swift_name) -# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) -# else -# define SWIFT_COMPILE_NAME(X) -# endif -#endif -#if !defined(SWIFT_METHOD_FAMILY) -# if __has_attribute(objc_method_family) -# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) -# else -# define SWIFT_METHOD_FAMILY(X) -# endif -#endif -#if !defined(SWIFT_NOESCAPE) -# if __has_attribute(noescape) -# define SWIFT_NOESCAPE __attribute__((noescape)) -# else -# define SWIFT_NOESCAPE -# endif -#endif -#if !defined(SWIFT_RELEASES_ARGUMENT) -# if __has_attribute(ns_consumed) -# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) -# else -# define SWIFT_RELEASES_ARGUMENT -# endif -#endif -#if !defined(SWIFT_WARN_UNUSED_RESULT) -# if __has_attribute(warn_unused_result) -# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) -# else -# define SWIFT_WARN_UNUSED_RESULT -# endif -#endif -#if !defined(SWIFT_NORETURN) -# if __has_attribute(noreturn) -# define SWIFT_NORETURN __attribute__((noreturn)) -# else -# define SWIFT_NORETURN -# endif -#endif -#if !defined(SWIFT_CLASS_EXTRA) -# define SWIFT_CLASS_EXTRA -#endif -#if !defined(SWIFT_PROTOCOL_EXTRA) -# define SWIFT_PROTOCOL_EXTRA -#endif -#if !defined(SWIFT_ENUM_EXTRA) -# define SWIFT_ENUM_EXTRA -#endif -#if !defined(SWIFT_CLASS) -# if __has_attribute(objc_subclassing_restricted) -# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA -# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# else -# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# endif -#endif -#if !defined(SWIFT_RESILIENT_CLASS) -# if __has_attribute(objc_class_stub) -# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub)) -# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME) -# else -# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) -# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME) -# endif -#endif -#if !defined(SWIFT_PROTOCOL) -# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA -# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA -#endif -#if !defined(SWIFT_EXTENSION) -# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__) -#endif -#if !defined(OBJC_DESIGNATED_INITIALIZER) -# if __has_attribute(objc_designated_initializer) -# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) -# else -# define OBJC_DESIGNATED_INITIALIZER -# endif -#endif -#if !defined(SWIFT_ENUM_ATTR) -# if __has_attribute(enum_extensibility) -# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility))) -# else -# define SWIFT_ENUM_ATTR(_extensibility) -# endif -#endif -#if !defined(SWIFT_ENUM) -# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type -# if __has_feature(generalized_swift_name) -# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type -# else -# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility) -# endif -#endif -#if !defined(SWIFT_UNAVAILABLE) -# define SWIFT_UNAVAILABLE __attribute__((unavailable)) -#endif -#if !defined(SWIFT_UNAVAILABLE_MSG) -# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg))) -#endif -#if !defined(SWIFT_AVAILABILITY) -# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__))) -#endif -#if !defined(SWIFT_WEAK_IMPORT) -# define SWIFT_WEAK_IMPORT __attribute__((weak_import)) -#endif -#if !defined(SWIFT_DEPRECATED) -# define SWIFT_DEPRECATED __attribute__((deprecated)) -#endif -#if !defined(SWIFT_DEPRECATED_MSG) -# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__))) -#endif -#if !defined(SWIFT_DEPRECATED_OBJC) -# if __has_feature(attribute_diagnose_if_objc) -# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) -# else -# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) -# endif -#endif -#if defined(__OBJC__) -#if !defined(IBSegueAction) -# define IBSegueAction -#endif -#endif -#if !defined(SWIFT_EXTERN) -# if defined(__cplusplus) -# define SWIFT_EXTERN extern "C" -# else -# define SWIFT_EXTERN extern -# endif -#endif -#if !defined(SWIFT_CALL) -# define SWIFT_CALL __attribute__((swiftcall)) -#endif -#if !defined(SWIFT_INDIRECT_RESULT) -# define SWIFT_INDIRECT_RESULT __attribute__((swift_indirect_result)) -#endif -#if !defined(SWIFT_CONTEXT) -# define SWIFT_CONTEXT __attribute__((swift_context)) -#endif -#if !defined(SWIFT_ERROR_RESULT) -# define SWIFT_ERROR_RESULT __attribute__((swift_error_result)) -#endif -#if defined(__cplusplus) -# define SWIFT_NOEXCEPT noexcept -#else -# define SWIFT_NOEXCEPT -#endif -#if !defined(SWIFT_C_INLINE_THUNK) -# if __has_attribute(always_inline) -# if __has_attribute(nodebug) -# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) __attribute__((nodebug)) -# else -# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) -# endif -# else -# define SWIFT_C_INLINE_THUNK inline -# endif -#endif -#if defined(_WIN32) -#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) -# define SWIFT_IMPORT_STDLIB_SYMBOL __declspec(dllimport) -#endif -#else -#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) -# define SWIFT_IMPORT_STDLIB_SYMBOL -#endif -#endif -#if defined(__OBJC__) -#if __has_feature(objc_modules) -#if __has_warning("-Watimport-in-framework-header") -#pragma clang diagnostic ignored "-Watimport-in-framework-header" -#endif -@import Foundation; -@import ObjectiveC; -@import Realm; -@import Realm.Swift; -#endif - -#endif -#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch" -#pragma clang diagnostic ignored "-Wduplicate-method-arg" -#if __has_warning("-Wpragma-clang-attribute") -# pragma clang diagnostic ignored "-Wpragma-clang-attribute" -#endif -#pragma clang diagnostic ignored "-Wunknown-pragmas" -#pragma clang diagnostic ignored "-Wnullability" -#pragma clang diagnostic ignored "-Wdollar-in-identifier-extension" - -#if __has_attribute(external_source_symbol) -# pragma push_macro("any") -# undef any -# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="RealmSwift",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol)) -# pragma pop_macro("any") -#endif - -#if defined(__OBJC__) -@class NSString; - -/// A type which has a custom representation in Realm events. -/// By default, objects are serialized to JSON using built-in rules which -/// include every property. If you wish to customize how a class is serialized -/// in events, you can declare it as conforming to this protocol and -/// define customEventRepresentation(). -SWIFT_PROTOCOL_NAMED("CustomEventRepresentable") -@protocol RLMCustomEventRepresentable -/// Get the custom event serialization for this object. -/// This function must return a valid JSON String, as this is included in a -/// larger JSON document. Implementations of this function should be “pure” -/// and access no data other than that which is obtainable from the Object -/// it is called on, and it should not mutate the object which it is called -/// on. This function is called on a background thread in a somewhat -/// unusual context, and attempting to access other data is likely to cause -/// problems. -- (NSString * _Nonnull)customEventRepresentation SWIFT_WARN_UNUSED_RESULT; -@end - -@class NSNumber; - -/// A 128-bit IEEE 754-2008 decimal floating point number. -/// This type is similar to Swift’s built-in Decimal type, but allocates bits differently, resulting in a different representable range. (NS)Decimal stores a significand of up to 38 digits long and an exponent from -128 to 127, while this type stores up to 34 digits of significand and an exponent from -6143 to 6144. -SWIFT_CLASS_NAMED("Decimal128") -@interface RealmSwiftDecimal128 : RLMDecimal128 -/// Creates a new zero-initialized Decimal128. -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -/// Converts the given value to a Decimal128. -/// The following types can be converted to Decimal128: -///
    -///
  • -/// Int (of any size) -///
  • -///
  • -/// Float -///
  • -///
  • -/// Double -///
  • -///
  • -/// String -///
  • -///
  • -/// NSNumber -///
  • -///
  • -/// Decimal -///
  • -///
-/// Passing a value with a type not in this list is a fatal error. Passing a string which cannot be parsed as a valid Decimal128 is a fatal error. -/// \param value The value to convert to a Decimal128. -/// -- (nonnull instancetype)initWithValue:(id _Nonnull)value OBJC_DESIGNATED_INITIALIZER; -/// Converts the given number to a Decimal128. -/// This initializer cannot fail and is never lossy. -/// \param number The number to convert to a Decimal128. -/// -- (nonnull instancetype)initWithNumber:(NSNumber * _Nonnull)number OBJC_DESIGNATED_INITIALIZER; -/// Parse the given string as a Decimal128. -/// This initializer never throws and is marked as throws only because removing it is a breaking -/// change. Strings which cannot be parsed as a Decimal128 return a value where isNaN is true. -/// \param string The string to parse. -/// -- (nullable instancetype)initWithString:(NSString * _Nonnull)string error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER; -@end - - - - - - - - - - - - - - - - - - -@class RLMObjectSchema; - -/// Object interface which allows untyped getters and setters for Objects. -/// :nodoc: -SWIFT_CLASS_NAMED("DynamicObject") -@interface RealmSwiftDynamicObject : RealmSwiftObject -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)value forKeyedSubscript:(NSString * _Nonnull)key; -/// :nodoc: -- (id _Nullable)valueForUndefinedKey:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -- (void)setValue:(id _Nullable)value forUndefinedKey:(NSString * _Nonnull)key; -/// :nodoc: -+ (BOOL)shouldIncludeInDefaultSchema SWIFT_WARN_UNUSED_RESULT; -+ (RLMObjectSchema * _Nullable)sharedSchema SWIFT_WARN_UNUSED_RESULT; -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -@end - - - - - - - - - - - - - - - -@class NSDate; - -/// A 12-byte (probably) unique object identifier. -/// ObjectIds are similar to a GUID or a UUID, and can be used to uniquely identify objects without a centralized ID generator. An ObjectID consists of: -///
    -///
  1. -/// A 4 byte timestamp measuring the creation time of the ObjectId in seconds since the Unix epoch. -///
  2. -///
  3. -/// A 5 byte random value -///
  4. -///
  5. -/// A 3 byte counter, initialized to a random value. -///
  6. -///
-/// ObjectIds are intended to be fast to generate. Sorting by an ObjectId field will typically result in the objects being sorted in creation order. -SWIFT_CLASS_NAMED("ObjectId") -@interface RealmSwiftObjectId : RLMObjectId -/// Creates a new zero-initialized ObjectId. -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -/// Creates a new randomly-initialized ObjectId. -+ (RealmSwiftObjectId * _Nonnull)objectId SWIFT_WARN_UNUSED_RESULT; -/// Creates a new ObjectId from the given 24-byte hexadecimal string. -/// Throws if the string is not 24 characters or contains any characters other than 0-9a-fA-F. -/// \param string The string to parse. -/// -- (nullable instancetype)initWithString:(NSString * _Nonnull)string error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER; -- (nonnull instancetype)initWithTimestamp:(NSDate * _Nonnull)timestamp machineIdentifier:(int32_t)machineIdentifier processIdentifier:(int32_t)processIdentifier SWIFT_UNAVAILABLE; -@end - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -@class RLMProperty; - -@interface RealmSwiftAsymmetricObject (SWIFT_EXTENSION(RealmSwift)) -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: AsymmetricObject { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - - - - -@interface RealmSwiftEmbeddedObject (SWIFT_EXTENSION(RealmSwift)) -/// :nodoc: -+ (BOOL)isEmbedded SWIFT_WARN_UNUSED_RESULT; -/// Indicates if the object can no longer be accessed because it is now invalid. -/// An object can no longer be accessed if the object has been deleted from the Realm that manages it, or if -/// invalidate() is called on that Realm. -@property (nonatomic, readonly, getter=isInvalidated) BOOL invalidated; -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the names of properties to ignore. These properties will not be managed by -/// the Realm that manages the object. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, any properties not -/// marked with @Persisted are automatically ignored. -/// -/// returns: -/// An array of property names to ignore. -+ (NSArray * _Nonnull)ignoredProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: EmbeddedObject { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - - - - - - -@interface RealmSwiftObject (SWIFT_EXTENSION(RealmSwift)) -/// Indicates if the object can no longer be accessed because it is now invalid. -/// An object can no longer be accessed if the object has been deleted from the Realm that manages it, or if -/// invalidate() is called on that Realm. This property is key-value observable. -@property (nonatomic, readonly, getter=isInvalidated) BOOL invalidated; -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the name of a property to be used as the primary key. -/// Only properties of types String, Int, ObjectId and UUID can be -/// designated as the primary key. Primary key properties enforce uniqueness -/// for each value whenever the property is set, which incurs minor overhead. -/// Indexes are created automatically for primary key properties. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, use -/// @Persisted(primaryKey: true) instead. -/// -/// returns: -/// The name of the property designated as the primary key, or -/// nil if the model has no primary key. -+ (NSString * _Nullable)primaryKey SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the names of properties to ignore. These -/// properties will not be managed by the Realm that manages the object. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, any properties not -/// marked with @Persisted are automatically ignored. -/// -/// returns: -/// An array of property names to ignore. -+ (NSArray * _Nonnull)ignoredProperties SWIFT_WARN_UNUSED_RESULT; -/// Returns an array of property names for properties which should be indexed. -/// Only string, integer, boolean, Date, and NSDate properties are supported. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, use -/// @Persisted(indexed: true) instead. -/// -/// returns: -/// An array of property names. -+ (NSArray * _Nonnull)indexedProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: Object { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// note: -/// In a migration block, when enumerating an old property with a public/private name, you will have to use -/// the old column name instead of the public one to retrieve the property value. -/// \code -/// let migrationBlock = { migration, oldSchemaVersion in -/// migration.enumerateObjects(ofType: "Person", { oldObj, newObj in -/// let oldPropertyValue = oldObj!["first_name"] as! String -/// // Use this value in migration -/// }) -/// } -/// -/// \endcodeThis has to be done as well when renaming a property. -/// \code -/// let migrationBlock = { migration, oldSchemaVersion in -/// migration.renameProperty(onType: "Person", from: "first_name", to: "complete_name") -/// } -/// -/// \endcode -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - -SWIFT_CLASS_NAMED("SwiftUIKVO") SWIFT_AVAILABILITY(watchos,introduced=6.0) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0) -@interface RLMSwiftUIKVO : NSObject -- (void)observeValueForKeyPath:(NSString * _Nullable)keyPath ofObject:(id _Nullable)object change:(NSDictionary * _Nullable)change context:(void * _Nullable)context; -- (nonnull instancetype)init SWIFT_UNAVAILABLE; -+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable"); -@end - - -SWIFT_AVAILABILITY(watchos,introduced=6.0) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0) -@interface RLMSwiftUIKVO (SWIFT_EXTENSION(RealmSwift)) -+ (BOOL)removeObserversFromObject:(NSObject * _Nonnull)object SWIFT_WARN_UNUSED_RESULT; -+ (void)addObserversToObject:(NSObject * _Nonnull)object; -@end - -#endif -#if __has_attribute(external_source_symbol) -# pragma clang attribute pop -#endif -#if defined(__cplusplus) -#endif -#pragma clang diagnostic pop -#endif - -#elif defined(__x86_64__) && __x86_64__ -// Generated by Apple Swift version 5.9 (swiftlang-5.9.0.128.106 clang-1500.0.40.1) -#ifndef REALMSWIFT_SWIFT_H -#define REALMSWIFT_SWIFT_H -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wgcc-compat" - -#if !defined(__has_include) -# define __has_include(x) 0 -#endif -#if !defined(__has_attribute) -# define __has_attribute(x) 0 -#endif -#if !defined(__has_feature) -# define __has_feature(x) 0 -#endif -#if !defined(__has_warning) -# define __has_warning(x) 0 -#endif - -#if __has_include() -# include -#endif - -#pragma clang diagnostic ignored "-Wauto-import" -#if defined(__OBJC__) -#include -#endif -#if defined(__cplusplus) -#include -#include -#include -#include -#include -#include -#include -#else -#include -#include -#include -#include -#endif -#if defined(__cplusplus) -#if defined(__arm64e__) && __has_include() -# include -#else -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wreserved-macro-identifier" -# ifndef __ptrauth_swift_value_witness_function_pointer -# define __ptrauth_swift_value_witness_function_pointer(x) -# endif -# ifndef __ptrauth_swift_class_method_pointer -# define __ptrauth_swift_class_method_pointer(x) -# endif -#pragma clang diagnostic pop -#endif -#endif - -#if !defined(SWIFT_TYPEDEFS) -# define SWIFT_TYPEDEFS 1 -# if __has_include() -# include -# elif !defined(__cplusplus) -typedef uint_least16_t char16_t; -typedef uint_least32_t char32_t; -# endif -typedef float swift_float2 __attribute__((__ext_vector_type__(2))); -typedef float swift_float3 __attribute__((__ext_vector_type__(3))); -typedef float swift_float4 __attribute__((__ext_vector_type__(4))); -typedef double swift_double2 __attribute__((__ext_vector_type__(2))); -typedef double swift_double3 __attribute__((__ext_vector_type__(3))); -typedef double swift_double4 __attribute__((__ext_vector_type__(4))); -typedef int swift_int2 __attribute__((__ext_vector_type__(2))); -typedef int swift_int3 __attribute__((__ext_vector_type__(3))); -typedef int swift_int4 __attribute__((__ext_vector_type__(4))); -typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2))); -typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3))); -typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); -#endif - -#if !defined(SWIFT_PASTE) -# define SWIFT_PASTE_HELPER(x, y) x##y -# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y) -#endif -#if !defined(SWIFT_METATYPE) -# define SWIFT_METATYPE(X) Class -#endif -#if !defined(SWIFT_CLASS_PROPERTY) -# if __has_feature(objc_class_property) -# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__ -# else -# define SWIFT_CLASS_PROPERTY(...) -# endif -#endif -#if !defined(SWIFT_RUNTIME_NAME) -# if __has_attribute(objc_runtime_name) -# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) -# else -# define SWIFT_RUNTIME_NAME(X) -# endif -#endif -#if !defined(SWIFT_COMPILE_NAME) -# if __has_attribute(swift_name) -# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) -# else -# define SWIFT_COMPILE_NAME(X) -# endif -#endif -#if !defined(SWIFT_METHOD_FAMILY) -# if __has_attribute(objc_method_family) -# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) -# else -# define SWIFT_METHOD_FAMILY(X) -# endif -#endif -#if !defined(SWIFT_NOESCAPE) -# if __has_attribute(noescape) -# define SWIFT_NOESCAPE __attribute__((noescape)) -# else -# define SWIFT_NOESCAPE -# endif -#endif -#if !defined(SWIFT_RELEASES_ARGUMENT) -# if __has_attribute(ns_consumed) -# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) -# else -# define SWIFT_RELEASES_ARGUMENT -# endif -#endif -#if !defined(SWIFT_WARN_UNUSED_RESULT) -# if __has_attribute(warn_unused_result) -# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) -# else -# define SWIFT_WARN_UNUSED_RESULT -# endif -#endif -#if !defined(SWIFT_NORETURN) -# if __has_attribute(noreturn) -# define SWIFT_NORETURN __attribute__((noreturn)) -# else -# define SWIFT_NORETURN -# endif -#endif -#if !defined(SWIFT_CLASS_EXTRA) -# define SWIFT_CLASS_EXTRA -#endif -#if !defined(SWIFT_PROTOCOL_EXTRA) -# define SWIFT_PROTOCOL_EXTRA -#endif -#if !defined(SWIFT_ENUM_EXTRA) -# define SWIFT_ENUM_EXTRA -#endif -#if !defined(SWIFT_CLASS) -# if __has_attribute(objc_subclassing_restricted) -# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA -# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# else -# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# endif -#endif -#if !defined(SWIFT_RESILIENT_CLASS) -# if __has_attribute(objc_class_stub) -# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub)) -# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME) -# else -# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) -# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME) -# endif -#endif -#if !defined(SWIFT_PROTOCOL) -# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA -# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA -#endif -#if !defined(SWIFT_EXTENSION) -# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__) -#endif -#if !defined(OBJC_DESIGNATED_INITIALIZER) -# if __has_attribute(objc_designated_initializer) -# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) -# else -# define OBJC_DESIGNATED_INITIALIZER -# endif -#endif -#if !defined(SWIFT_ENUM_ATTR) -# if __has_attribute(enum_extensibility) -# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility))) -# else -# define SWIFT_ENUM_ATTR(_extensibility) -# endif -#endif -#if !defined(SWIFT_ENUM) -# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type -# if __has_feature(generalized_swift_name) -# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type -# else -# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility) -# endif -#endif -#if !defined(SWIFT_UNAVAILABLE) -# define SWIFT_UNAVAILABLE __attribute__((unavailable)) -#endif -#if !defined(SWIFT_UNAVAILABLE_MSG) -# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg))) -#endif -#if !defined(SWIFT_AVAILABILITY) -# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__))) -#endif -#if !defined(SWIFT_WEAK_IMPORT) -# define SWIFT_WEAK_IMPORT __attribute__((weak_import)) -#endif -#if !defined(SWIFT_DEPRECATED) -# define SWIFT_DEPRECATED __attribute__((deprecated)) -#endif -#if !defined(SWIFT_DEPRECATED_MSG) -# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__))) -#endif -#if !defined(SWIFT_DEPRECATED_OBJC) -# if __has_feature(attribute_diagnose_if_objc) -# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) -# else -# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) -# endif -#endif -#if defined(__OBJC__) -#if !defined(IBSegueAction) -# define IBSegueAction -#endif -#endif -#if !defined(SWIFT_EXTERN) -# if defined(__cplusplus) -# define SWIFT_EXTERN extern "C" -# else -# define SWIFT_EXTERN extern -# endif -#endif -#if !defined(SWIFT_CALL) -# define SWIFT_CALL __attribute__((swiftcall)) -#endif -#if !defined(SWIFT_INDIRECT_RESULT) -# define SWIFT_INDIRECT_RESULT __attribute__((swift_indirect_result)) -#endif -#if !defined(SWIFT_CONTEXT) -# define SWIFT_CONTEXT __attribute__((swift_context)) -#endif -#if !defined(SWIFT_ERROR_RESULT) -# define SWIFT_ERROR_RESULT __attribute__((swift_error_result)) -#endif -#if defined(__cplusplus) -# define SWIFT_NOEXCEPT noexcept -#else -# define SWIFT_NOEXCEPT -#endif -#if !defined(SWIFT_C_INLINE_THUNK) -# if __has_attribute(always_inline) -# if __has_attribute(nodebug) -# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) __attribute__((nodebug)) -# else -# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) -# endif -# else -# define SWIFT_C_INLINE_THUNK inline -# endif -#endif -#if defined(_WIN32) -#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) -# define SWIFT_IMPORT_STDLIB_SYMBOL __declspec(dllimport) -#endif -#else -#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) -# define SWIFT_IMPORT_STDLIB_SYMBOL -#endif -#endif -#if defined(__OBJC__) -#if __has_feature(objc_modules) -#if __has_warning("-Watimport-in-framework-header") -#pragma clang diagnostic ignored "-Watimport-in-framework-header" -#endif -@import Foundation; -@import ObjectiveC; -@import Realm; -@import Realm.Swift; -#endif - -#endif -#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch" -#pragma clang diagnostic ignored "-Wduplicate-method-arg" -#if __has_warning("-Wpragma-clang-attribute") -# pragma clang diagnostic ignored "-Wpragma-clang-attribute" -#endif -#pragma clang diagnostic ignored "-Wunknown-pragmas" -#pragma clang diagnostic ignored "-Wnullability" -#pragma clang diagnostic ignored "-Wdollar-in-identifier-extension" - -#if __has_attribute(external_source_symbol) -# pragma push_macro("any") -# undef any -# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="RealmSwift",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol)) -# pragma pop_macro("any") -#endif - -#if defined(__OBJC__) -@class NSString; - -/// A type which has a custom representation in Realm events. -/// By default, objects are serialized to JSON using built-in rules which -/// include every property. If you wish to customize how a class is serialized -/// in events, you can declare it as conforming to this protocol and -/// define customEventRepresentation(). -SWIFT_PROTOCOL_NAMED("CustomEventRepresentable") -@protocol RLMCustomEventRepresentable -/// Get the custom event serialization for this object. -/// This function must return a valid JSON String, as this is included in a -/// larger JSON document. Implementations of this function should be “pure” -/// and access no data other than that which is obtainable from the Object -/// it is called on, and it should not mutate the object which it is called -/// on. This function is called on a background thread in a somewhat -/// unusual context, and attempting to access other data is likely to cause -/// problems. -- (NSString * _Nonnull)customEventRepresentation SWIFT_WARN_UNUSED_RESULT; -@end - -@class NSNumber; - -/// A 128-bit IEEE 754-2008 decimal floating point number. -/// This type is similar to Swift’s built-in Decimal type, but allocates bits differently, resulting in a different representable range. (NS)Decimal stores a significand of up to 38 digits long and an exponent from -128 to 127, while this type stores up to 34 digits of significand and an exponent from -6143 to 6144. -SWIFT_CLASS_NAMED("Decimal128") -@interface RealmSwiftDecimal128 : RLMDecimal128 -/// Creates a new zero-initialized Decimal128. -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -/// Converts the given value to a Decimal128. -/// The following types can be converted to Decimal128: -///
    -///
  • -/// Int (of any size) -///
  • -///
  • -/// Float -///
  • -///
  • -/// Double -///
  • -///
  • -/// String -///
  • -///
  • -/// NSNumber -///
  • -///
  • -/// Decimal -///
  • -///
-/// Passing a value with a type not in this list is a fatal error. Passing a string which cannot be parsed as a valid Decimal128 is a fatal error. -/// \param value The value to convert to a Decimal128. -/// -- (nonnull instancetype)initWithValue:(id _Nonnull)value OBJC_DESIGNATED_INITIALIZER; -/// Converts the given number to a Decimal128. -/// This initializer cannot fail and is never lossy. -/// \param number The number to convert to a Decimal128. -/// -- (nonnull instancetype)initWithNumber:(NSNumber * _Nonnull)number OBJC_DESIGNATED_INITIALIZER; -/// Parse the given string as a Decimal128. -/// This initializer never throws and is marked as throws only because removing it is a breaking -/// change. Strings which cannot be parsed as a Decimal128 return a value where isNaN is true. -/// \param string The string to parse. -/// -- (nullable instancetype)initWithString:(NSString * _Nonnull)string error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER; -@end - - - - - - - - - - - - - - - - - - -@class RLMObjectSchema; - -/// Object interface which allows untyped getters and setters for Objects. -/// :nodoc: -SWIFT_CLASS_NAMED("DynamicObject") -@interface RealmSwiftDynamicObject : RealmSwiftObject -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)value forKeyedSubscript:(NSString * _Nonnull)key; -/// :nodoc: -- (id _Nullable)valueForUndefinedKey:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -- (void)setValue:(id _Nullable)value forUndefinedKey:(NSString * _Nonnull)key; -/// :nodoc: -+ (BOOL)shouldIncludeInDefaultSchema SWIFT_WARN_UNUSED_RESULT; -+ (RLMObjectSchema * _Nullable)sharedSchema SWIFT_WARN_UNUSED_RESULT; -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -@end - - - - - - - - - - - - - - - -@class NSDate; - -/// A 12-byte (probably) unique object identifier. -/// ObjectIds are similar to a GUID or a UUID, and can be used to uniquely identify objects without a centralized ID generator. An ObjectID consists of: -///
    -///
  1. -/// A 4 byte timestamp measuring the creation time of the ObjectId in seconds since the Unix epoch. -///
  2. -///
  3. -/// A 5 byte random value -///
  4. -///
  5. -/// A 3 byte counter, initialized to a random value. -///
  6. -///
-/// ObjectIds are intended to be fast to generate. Sorting by an ObjectId field will typically result in the objects being sorted in creation order. -SWIFT_CLASS_NAMED("ObjectId") -@interface RealmSwiftObjectId : RLMObjectId -/// Creates a new zero-initialized ObjectId. -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -/// Creates a new randomly-initialized ObjectId. -+ (RealmSwiftObjectId * _Nonnull)objectId SWIFT_WARN_UNUSED_RESULT; -/// Creates a new ObjectId from the given 24-byte hexadecimal string. -/// Throws if the string is not 24 characters or contains any characters other than 0-9a-fA-F. -/// \param string The string to parse. -/// -- (nullable instancetype)initWithString:(NSString * _Nonnull)string error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER; -- (nonnull instancetype)initWithTimestamp:(NSDate * _Nonnull)timestamp machineIdentifier:(int32_t)machineIdentifier processIdentifier:(int32_t)processIdentifier SWIFT_UNAVAILABLE; -@end - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -@class RLMProperty; - -@interface RealmSwiftAsymmetricObject (SWIFT_EXTENSION(RealmSwift)) -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: AsymmetricObject { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - - - - -@interface RealmSwiftEmbeddedObject (SWIFT_EXTENSION(RealmSwift)) -/// :nodoc: -+ (BOOL)isEmbedded SWIFT_WARN_UNUSED_RESULT; -/// Indicates if the object can no longer be accessed because it is now invalid. -/// An object can no longer be accessed if the object has been deleted from the Realm that manages it, or if -/// invalidate() is called on that Realm. -@property (nonatomic, readonly, getter=isInvalidated) BOOL invalidated; -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the names of properties to ignore. These properties will not be managed by -/// the Realm that manages the object. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, any properties not -/// marked with @Persisted are automatically ignored. -/// -/// returns: -/// An array of property names to ignore. -+ (NSArray * _Nonnull)ignoredProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: EmbeddedObject { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - - - - - - -@interface RealmSwiftObject (SWIFT_EXTENSION(RealmSwift)) -/// Indicates if the object can no longer be accessed because it is now invalid. -/// An object can no longer be accessed if the object has been deleted from the Realm that manages it, or if -/// invalidate() is called on that Realm. This property is key-value observable. -@property (nonatomic, readonly, getter=isInvalidated) BOOL invalidated; -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the name of a property to be used as the primary key. -/// Only properties of types String, Int, ObjectId and UUID can be -/// designated as the primary key. Primary key properties enforce uniqueness -/// for each value whenever the property is set, which incurs minor overhead. -/// Indexes are created automatically for primary key properties. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, use -/// @Persisted(primaryKey: true) instead. -/// -/// returns: -/// The name of the property designated as the primary key, or -/// nil if the model has no primary key. -+ (NSString * _Nullable)primaryKey SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the names of properties to ignore. These -/// properties will not be managed by the Realm that manages the object. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, any properties not -/// marked with @Persisted are automatically ignored. -/// -/// returns: -/// An array of property names to ignore. -+ (NSArray * _Nonnull)ignoredProperties SWIFT_WARN_UNUSED_RESULT; -/// Returns an array of property names for properties which should be indexed. -/// Only string, integer, boolean, Date, and NSDate properties are supported. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, use -/// @Persisted(indexed: true) instead. -/// -/// returns: -/// An array of property names. -+ (NSArray * _Nonnull)indexedProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: Object { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// note: -/// In a migration block, when enumerating an old property with a public/private name, you will have to use -/// the old column name instead of the public one to retrieve the property value. -/// \code -/// let migrationBlock = { migration, oldSchemaVersion in -/// migration.enumerateObjects(ofType: "Person", { oldObj, newObj in -/// let oldPropertyValue = oldObj!["first_name"] as! String -/// // Use this value in migration -/// }) -/// } -/// -/// \endcodeThis has to be done as well when renaming a property. -/// \code -/// let migrationBlock = { migration, oldSchemaVersion in -/// migration.renameProperty(onType: "Person", from: "first_name", to: "complete_name") -/// } -/// -/// \endcode -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - -SWIFT_CLASS_NAMED("SwiftUIKVO") SWIFT_AVAILABILITY(watchos,introduced=6.0) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0) -@interface RLMSwiftUIKVO : NSObject -- (void)observeValueForKeyPath:(NSString * _Nullable)keyPath ofObject:(id _Nullable)object change:(NSDictionary * _Nullable)change context:(void * _Nullable)context; -- (nonnull instancetype)init SWIFT_UNAVAILABLE; -+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable"); -@end - - -SWIFT_AVAILABILITY(watchos,introduced=6.0) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0) -@interface RLMSwiftUIKVO (SWIFT_EXTENSION(RealmSwift)) -+ (BOOL)removeObserversFromObject:(NSObject * _Nonnull)object SWIFT_WARN_UNUSED_RESULT; -+ (void)addObserversToObject:(NSObject * _Nonnull)object; -@end - -#endif -#if __has_attribute(external_source_symbol) -# pragma clang attribute pop -#endif -#if defined(__cplusplus) -#endif -#pragma clang diagnostic pop -#endif - -#elif defined(__i386__) && __i386__ -// Generated by Apple Swift version 5.9 (swiftlang-5.9.0.128.106 clang-1500.0.40.1) -#ifndef REALMSWIFT_SWIFT_H -#define REALMSWIFT_SWIFT_H -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wgcc-compat" - -#if !defined(__has_include) -# define __has_include(x) 0 -#endif -#if !defined(__has_attribute) -# define __has_attribute(x) 0 -#endif -#if !defined(__has_feature) -# define __has_feature(x) 0 -#endif -#if !defined(__has_warning) -# define __has_warning(x) 0 -#endif - -#if __has_include() -# include -#endif - -#pragma clang diagnostic ignored "-Wauto-import" -#if defined(__OBJC__) -#include -#endif -#if defined(__cplusplus) -#include -#include -#include -#include -#include -#include -#include -#else -#include -#include -#include -#include -#endif -#if defined(__cplusplus) -#if defined(__arm64e__) && __has_include() -# include -#else -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wreserved-macro-identifier" -# ifndef __ptrauth_swift_value_witness_function_pointer -# define __ptrauth_swift_value_witness_function_pointer(x) -# endif -# ifndef __ptrauth_swift_class_method_pointer -# define __ptrauth_swift_class_method_pointer(x) -# endif -#pragma clang diagnostic pop -#endif -#endif - -#if !defined(SWIFT_TYPEDEFS) -# define SWIFT_TYPEDEFS 1 -# if __has_include() -# include -# elif !defined(__cplusplus) -typedef uint_least16_t char16_t; -typedef uint_least32_t char32_t; -# endif -typedef float swift_float2 __attribute__((__ext_vector_type__(2))); -typedef float swift_float3 __attribute__((__ext_vector_type__(3))); -typedef float swift_float4 __attribute__((__ext_vector_type__(4))); -typedef double swift_double2 __attribute__((__ext_vector_type__(2))); -typedef double swift_double3 __attribute__((__ext_vector_type__(3))); -typedef double swift_double4 __attribute__((__ext_vector_type__(4))); -typedef int swift_int2 __attribute__((__ext_vector_type__(2))); -typedef int swift_int3 __attribute__((__ext_vector_type__(3))); -typedef int swift_int4 __attribute__((__ext_vector_type__(4))); -typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2))); -typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3))); -typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); -#endif - -#if !defined(SWIFT_PASTE) -# define SWIFT_PASTE_HELPER(x, y) x##y -# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y) -#endif -#if !defined(SWIFT_METATYPE) -# define SWIFT_METATYPE(X) Class -#endif -#if !defined(SWIFT_CLASS_PROPERTY) -# if __has_feature(objc_class_property) -# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__ -# else -# define SWIFT_CLASS_PROPERTY(...) -# endif -#endif -#if !defined(SWIFT_RUNTIME_NAME) -# if __has_attribute(objc_runtime_name) -# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) -# else -# define SWIFT_RUNTIME_NAME(X) -# endif -#endif -#if !defined(SWIFT_COMPILE_NAME) -# if __has_attribute(swift_name) -# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) -# else -# define SWIFT_COMPILE_NAME(X) -# endif -#endif -#if !defined(SWIFT_METHOD_FAMILY) -# if __has_attribute(objc_method_family) -# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) -# else -# define SWIFT_METHOD_FAMILY(X) -# endif -#endif -#if !defined(SWIFT_NOESCAPE) -# if __has_attribute(noescape) -# define SWIFT_NOESCAPE __attribute__((noescape)) -# else -# define SWIFT_NOESCAPE -# endif -#endif -#if !defined(SWIFT_RELEASES_ARGUMENT) -# if __has_attribute(ns_consumed) -# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) -# else -# define SWIFT_RELEASES_ARGUMENT -# endif -#endif -#if !defined(SWIFT_WARN_UNUSED_RESULT) -# if __has_attribute(warn_unused_result) -# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) -# else -# define SWIFT_WARN_UNUSED_RESULT -# endif -#endif -#if !defined(SWIFT_NORETURN) -# if __has_attribute(noreturn) -# define SWIFT_NORETURN __attribute__((noreturn)) -# else -# define SWIFT_NORETURN -# endif -#endif -#if !defined(SWIFT_CLASS_EXTRA) -# define SWIFT_CLASS_EXTRA -#endif -#if !defined(SWIFT_PROTOCOL_EXTRA) -# define SWIFT_PROTOCOL_EXTRA -#endif -#if !defined(SWIFT_ENUM_EXTRA) -# define SWIFT_ENUM_EXTRA -#endif -#if !defined(SWIFT_CLASS) -# if __has_attribute(objc_subclassing_restricted) -# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA -# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# else -# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# endif -#endif -#if !defined(SWIFT_RESILIENT_CLASS) -# if __has_attribute(objc_class_stub) -# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub)) -# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME) -# else -# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) -# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME) -# endif -#endif -#if !defined(SWIFT_PROTOCOL) -# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA -# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA -#endif -#if !defined(SWIFT_EXTENSION) -# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__) -#endif -#if !defined(OBJC_DESIGNATED_INITIALIZER) -# if __has_attribute(objc_designated_initializer) -# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) -# else -# define OBJC_DESIGNATED_INITIALIZER -# endif -#endif -#if !defined(SWIFT_ENUM_ATTR) -# if __has_attribute(enum_extensibility) -# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility))) -# else -# define SWIFT_ENUM_ATTR(_extensibility) -# endif -#endif -#if !defined(SWIFT_ENUM) -# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type -# if __has_feature(generalized_swift_name) -# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type -# else -# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility) -# endif -#endif -#if !defined(SWIFT_UNAVAILABLE) -# define SWIFT_UNAVAILABLE __attribute__((unavailable)) -#endif -#if !defined(SWIFT_UNAVAILABLE_MSG) -# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg))) -#endif -#if !defined(SWIFT_AVAILABILITY) -# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__))) -#endif -#if !defined(SWIFT_WEAK_IMPORT) -# define SWIFT_WEAK_IMPORT __attribute__((weak_import)) -#endif -#if !defined(SWIFT_DEPRECATED) -# define SWIFT_DEPRECATED __attribute__((deprecated)) -#endif -#if !defined(SWIFT_DEPRECATED_MSG) -# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__))) -#endif -#if !defined(SWIFT_DEPRECATED_OBJC) -# if __has_feature(attribute_diagnose_if_objc) -# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) -# else -# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) -# endif -#endif -#if defined(__OBJC__) -#if !defined(IBSegueAction) -# define IBSegueAction -#endif -#endif -#if !defined(SWIFT_EXTERN) -# if defined(__cplusplus) -# define SWIFT_EXTERN extern "C" -# else -# define SWIFT_EXTERN extern -# endif -#endif -#if !defined(SWIFT_CALL) -# define SWIFT_CALL __attribute__((swiftcall)) -#endif -#if !defined(SWIFT_INDIRECT_RESULT) -# define SWIFT_INDIRECT_RESULT __attribute__((swift_indirect_result)) -#endif -#if !defined(SWIFT_CONTEXT) -# define SWIFT_CONTEXT __attribute__((swift_context)) -#endif -#if !defined(SWIFT_ERROR_RESULT) -# define SWIFT_ERROR_RESULT __attribute__((swift_error_result)) -#endif -#if defined(__cplusplus) -# define SWIFT_NOEXCEPT noexcept -#else -# define SWIFT_NOEXCEPT -#endif -#if !defined(SWIFT_C_INLINE_THUNK) -# if __has_attribute(always_inline) -# if __has_attribute(nodebug) -# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) __attribute__((nodebug)) -# else -# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) -# endif -# else -# define SWIFT_C_INLINE_THUNK inline -# endif -#endif -#if defined(_WIN32) -#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) -# define SWIFT_IMPORT_STDLIB_SYMBOL __declspec(dllimport) -#endif -#else -#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) -# define SWIFT_IMPORT_STDLIB_SYMBOL -#endif -#endif -#if defined(__OBJC__) -#if __has_feature(objc_modules) -#if __has_warning("-Watimport-in-framework-header") -#pragma clang diagnostic ignored "-Watimport-in-framework-header" -#endif -@import Foundation; -@import ObjectiveC; -@import Realm; -@import Realm.Swift; -#endif - -#endif -#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch" -#pragma clang diagnostic ignored "-Wduplicate-method-arg" -#if __has_warning("-Wpragma-clang-attribute") -# pragma clang diagnostic ignored "-Wpragma-clang-attribute" -#endif -#pragma clang diagnostic ignored "-Wunknown-pragmas" -#pragma clang diagnostic ignored "-Wnullability" -#pragma clang diagnostic ignored "-Wdollar-in-identifier-extension" - -#if __has_attribute(external_source_symbol) -# pragma push_macro("any") -# undef any -# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="RealmSwift",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol)) -# pragma pop_macro("any") -#endif - -#if defined(__OBJC__) -@class NSString; - -/// A type which has a custom representation in Realm events. -/// By default, objects are serialized to JSON using built-in rules which -/// include every property. If you wish to customize how a class is serialized -/// in events, you can declare it as conforming to this protocol and -/// define customEventRepresentation(). -SWIFT_PROTOCOL_NAMED("CustomEventRepresentable") -@protocol RLMCustomEventRepresentable -/// Get the custom event serialization for this object. -/// This function must return a valid JSON String, as this is included in a -/// larger JSON document. Implementations of this function should be “pure” -/// and access no data other than that which is obtainable from the Object -/// it is called on, and it should not mutate the object which it is called -/// on. This function is called on a background thread in a somewhat -/// unusual context, and attempting to access other data is likely to cause -/// problems. -- (NSString * _Nonnull)customEventRepresentation SWIFT_WARN_UNUSED_RESULT; -@end - -@class NSNumber; - -/// A 128-bit IEEE 754-2008 decimal floating point number. -/// This type is similar to Swift’s built-in Decimal type, but allocates bits differently, resulting in a different representable range. (NS)Decimal stores a significand of up to 38 digits long and an exponent from -128 to 127, while this type stores up to 34 digits of significand and an exponent from -6143 to 6144. -SWIFT_CLASS_NAMED("Decimal128") -@interface RealmSwiftDecimal128 : RLMDecimal128 -/// Creates a new zero-initialized Decimal128. -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -/// Converts the given value to a Decimal128. -/// The following types can be converted to Decimal128: -///
    -///
  • -/// Int (of any size) -///
  • -///
  • -/// Float -///
  • -///
  • -/// Double -///
  • -///
  • -/// String -///
  • -///
  • -/// NSNumber -///
  • -///
  • -/// Decimal -///
  • -///
-/// Passing a value with a type not in this list is a fatal error. Passing a string which cannot be parsed as a valid Decimal128 is a fatal error. -/// \param value The value to convert to a Decimal128. -/// -- (nonnull instancetype)initWithValue:(id _Nonnull)value OBJC_DESIGNATED_INITIALIZER; -/// Converts the given number to a Decimal128. -/// This initializer cannot fail and is never lossy. -/// \param number The number to convert to a Decimal128. -/// -- (nonnull instancetype)initWithNumber:(NSNumber * _Nonnull)number OBJC_DESIGNATED_INITIALIZER; -/// Parse the given string as a Decimal128. -/// This initializer never throws and is marked as throws only because removing it is a breaking -/// change. Strings which cannot be parsed as a Decimal128 return a value where isNaN is true. -/// \param string The string to parse. -/// -- (nullable instancetype)initWithString:(NSString * _Nonnull)string error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER; -@end - - - - - - - - - - - - - - - - - - -@class RLMObjectSchema; - -/// Object interface which allows untyped getters and setters for Objects. -/// :nodoc: -SWIFT_CLASS_NAMED("DynamicObject") -@interface RealmSwiftDynamicObject : RealmSwiftObject -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)value forKeyedSubscript:(NSString * _Nonnull)key; -/// :nodoc: -- (id _Nullable)valueForUndefinedKey:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -- (void)setValue:(id _Nullable)value forUndefinedKey:(NSString * _Nonnull)key; -/// :nodoc: -+ (BOOL)shouldIncludeInDefaultSchema SWIFT_WARN_UNUSED_RESULT; -+ (RLMObjectSchema * _Nullable)sharedSchema SWIFT_WARN_UNUSED_RESULT; -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -@end - - - - - - - - - - - - - - - -@class NSDate; - -/// A 12-byte (probably) unique object identifier. -/// ObjectIds are similar to a GUID or a UUID, and can be used to uniquely identify objects without a centralized ID generator. An ObjectID consists of: -///
    -///
  1. -/// A 4 byte timestamp measuring the creation time of the ObjectId in seconds since the Unix epoch. -///
  2. -///
  3. -/// A 5 byte random value -///
  4. -///
  5. -/// A 3 byte counter, initialized to a random value. -///
  6. -///
-/// ObjectIds are intended to be fast to generate. Sorting by an ObjectId field will typically result in the objects being sorted in creation order. -SWIFT_CLASS_NAMED("ObjectId") -@interface RealmSwiftObjectId : RLMObjectId -/// Creates a new zero-initialized ObjectId. -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -/// Creates a new randomly-initialized ObjectId. -+ (RealmSwiftObjectId * _Nonnull)objectId SWIFT_WARN_UNUSED_RESULT; -/// Creates a new ObjectId from the given 24-byte hexadecimal string. -/// Throws if the string is not 24 characters or contains any characters other than 0-9a-fA-F. -/// \param string The string to parse. -/// -- (nullable instancetype)initWithString:(NSString * _Nonnull)string error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER; -- (nonnull instancetype)initWithTimestamp:(NSDate * _Nonnull)timestamp machineIdentifier:(int32_t)machineIdentifier processIdentifier:(int32_t)processIdentifier SWIFT_UNAVAILABLE; -@end - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -@class RLMProperty; - -@interface RealmSwiftAsymmetricObject (SWIFT_EXTENSION(RealmSwift)) -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: AsymmetricObject { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - - - - -@interface RealmSwiftEmbeddedObject (SWIFT_EXTENSION(RealmSwift)) -/// :nodoc: -+ (BOOL)isEmbedded SWIFT_WARN_UNUSED_RESULT; -/// Indicates if the object can no longer be accessed because it is now invalid. -/// An object can no longer be accessed if the object has been deleted from the Realm that manages it, or if -/// invalidate() is called on that Realm. -@property (nonatomic, readonly, getter=isInvalidated) BOOL invalidated; -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the names of properties to ignore. These properties will not be managed by -/// the Realm that manages the object. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, any properties not -/// marked with @Persisted are automatically ignored. -/// -/// returns: -/// An array of property names to ignore. -+ (NSArray * _Nonnull)ignoredProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: EmbeddedObject { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - - - - - - -@interface RealmSwiftObject (SWIFT_EXTENSION(RealmSwift)) -/// Indicates if the object can no longer be accessed because it is now invalid. -/// An object can no longer be accessed if the object has been deleted from the Realm that manages it, or if -/// invalidate() is called on that Realm. This property is key-value observable. -@property (nonatomic, readonly, getter=isInvalidated) BOOL invalidated; -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the name of a property to be used as the primary key. -/// Only properties of types String, Int, ObjectId and UUID can be -/// designated as the primary key. Primary key properties enforce uniqueness -/// for each value whenever the property is set, which incurs minor overhead. -/// Indexes are created automatically for primary key properties. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, use -/// @Persisted(primaryKey: true) instead. -/// -/// returns: -/// The name of the property designated as the primary key, or -/// nil if the model has no primary key. -+ (NSString * _Nullable)primaryKey SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the names of properties to ignore. These -/// properties will not be managed by the Realm that manages the object. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, any properties not -/// marked with @Persisted are automatically ignored. -/// -/// returns: -/// An array of property names to ignore. -+ (NSArray * _Nonnull)ignoredProperties SWIFT_WARN_UNUSED_RESULT; -/// Returns an array of property names for properties which should be indexed. -/// Only string, integer, boolean, Date, and NSDate properties are supported. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, use -/// @Persisted(indexed: true) instead. -/// -/// returns: -/// An array of property names. -+ (NSArray * _Nonnull)indexedProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: Object { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// note: -/// In a migration block, when enumerating an old property with a public/private name, you will have to use -/// the old column name instead of the public one to retrieve the property value. -/// \code -/// let migrationBlock = { migration, oldSchemaVersion in -/// migration.enumerateObjects(ofType: "Person", { oldObj, newObj in -/// let oldPropertyValue = oldObj!["first_name"] as! String -/// // Use this value in migration -/// }) -/// } -/// -/// \endcodeThis has to be done as well when renaming a property. -/// \code -/// let migrationBlock = { migration, oldSchemaVersion in -/// migration.renameProperty(onType: "Person", from: "first_name", to: "complete_name") -/// } -/// -/// \endcode -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - -SWIFT_CLASS_NAMED("SwiftUIKVO") SWIFT_AVAILABILITY(watchos,introduced=6.0) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0) -@interface RLMSwiftUIKVO : NSObject -- (void)observeValueForKeyPath:(NSString * _Nullable)keyPath ofObject:(id _Nullable)object change:(NSDictionary * _Nullable)change context:(void * _Nullable)context; -- (nonnull instancetype)init SWIFT_UNAVAILABLE; -+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable"); -@end - - -SWIFT_AVAILABILITY(watchos,introduced=6.0) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0) -@interface RLMSwiftUIKVO (SWIFT_EXTENSION(RealmSwift)) -+ (BOOL)removeObserversFromObject:(NSObject * _Nonnull)object SWIFT_WARN_UNUSED_RESULT; -+ (void)addObserversToObject:(NSObject * _Nonnull)object; -@end - -#endif -#if __has_attribute(external_source_symbol) -# pragma clang attribute pop -#endif -#if defined(__cplusplus) -#endif -#pragma clang diagnostic pop -#endif - -#else -#error unsupported Swift architecture -#endif diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Info.plist b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Info.plist deleted file mode 100644 index 426e1ad4e..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Info.plist and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/arm64-apple-watchos-simulator.swiftsourceinfo b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/arm64-apple-watchos-simulator.swiftsourceinfo deleted file mode 100644 index 17fc16cee..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/arm64-apple-watchos-simulator.swiftsourceinfo and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/i386-apple-watchos-simulator.swiftsourceinfo b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/i386-apple-watchos-simulator.swiftsourceinfo deleted file mode 100644 index 4cc5c738e..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/i386-apple-watchos-simulator.swiftsourceinfo and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/x86_64-apple-watchos-simulator.swiftsourceinfo b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/x86_64-apple-watchos-simulator.swiftsourceinfo deleted file mode 100644 index a42ee9efe..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/x86_64-apple-watchos-simulator.swiftsourceinfo and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-watchos-simulator.abi.json b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-watchos-simulator.abi.json deleted file mode 100644 index dc109fc09..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-watchos-simulator.abi.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "ABIRoot": { - "kind": "Root", - "name": "TopLevel", - "printedName": "TopLevel", - "json_format_version": 8 - }, - "ConstValues": [] -} \ No newline at end of file diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-watchos-simulator.swiftdoc b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-watchos-simulator.swiftdoc deleted file mode 100644 index 2b99557c1..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-watchos-simulator.swiftdoc and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-watchos-simulator.swiftmodule b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-watchos-simulator.swiftmodule deleted file mode 100644 index 9461571cd..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-watchos-simulator.swiftmodule and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/i386-apple-watchos-simulator.abi.json b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/i386-apple-watchos-simulator.abi.json deleted file mode 100644 index dc109fc09..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/i386-apple-watchos-simulator.abi.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "ABIRoot": { - "kind": "Root", - "name": "TopLevel", - "printedName": "TopLevel", - "json_format_version": 8 - }, - "ConstValues": [] -} \ No newline at end of file diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/i386-apple-watchos-simulator.swiftdoc b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/i386-apple-watchos-simulator.swiftdoc deleted file mode 100644 index 6cd56f05f..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/i386-apple-watchos-simulator.swiftdoc and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/i386-apple-watchos-simulator.swiftmodule b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/i386-apple-watchos-simulator.swiftmodule deleted file mode 100644 index 10f821e88..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/i386-apple-watchos-simulator.swiftmodule and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/x86_64-apple-watchos-simulator.abi.json b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/x86_64-apple-watchos-simulator.abi.json deleted file mode 100644 index dc109fc09..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/x86_64-apple-watchos-simulator.abi.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "ABIRoot": { - "kind": "Root", - "name": "TopLevel", - "printedName": "TopLevel", - "json_format_version": 8 - }, - "ConstValues": [] -} \ No newline at end of file diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/x86_64-apple-watchos-simulator.swiftdoc b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/x86_64-apple-watchos-simulator.swiftdoc deleted file mode 100644 index ca540d733..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/x86_64-apple-watchos-simulator.swiftdoc and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/x86_64-apple-watchos-simulator.swiftmodule b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/x86_64-apple-watchos-simulator.swiftmodule deleted file mode 100644 index 22d7dc088..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/x86_64-apple-watchos-simulator.swiftmodule and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Modules/module.modulemap b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Modules/module.modulemap deleted file mode 100644 index 5742239a8..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/Modules/module.modulemap +++ /dev/null @@ -1,4 +0,0 @@ -framework module RealmSwift { - header "RealmSwift-Swift.h" - requires objc -} diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/RealmSwift b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/RealmSwift deleted file mode 100755 index a4d1554b3..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/RealmSwift and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/_CodeSignature/CodeResources b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/_CodeSignature/CodeResources deleted file mode 100644 index d26162a5e..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/watchos-arm64_i386_x86_64-simulator/RealmSwift.framework/_CodeSignature/CodeResources +++ /dev/null @@ -1,312 +0,0 @@ - - - - - files - - Headers/RealmSwift-Swift.h - - 5PgazQgKN5AbKPq/ps9xkHr+b/Q= - - Info.plist - - VZ58I4MTlIHyIoOPhe4KN6J754w= - - Modules/RealmSwift.swiftmodule/Project/arm64-apple-watchos-simulator.swiftsourceinfo - - vpUnHzGQrJOIjGuaHk2G9vEJCVE= - - Modules/RealmSwift.swiftmodule/Project/i386-apple-watchos-simulator.swiftsourceinfo - - M8IoEAtN6TZVIlrfZDuwxZGKntU= - - Modules/RealmSwift.swiftmodule/Project/x86_64-apple-watchos-simulator.swiftsourceinfo - - qtSh2FBN68VLAcgMGNn2n9LBgXY= - - Modules/RealmSwift.swiftmodule/arm64-apple-watchos-simulator.abi.json - - FSPnLbho3G+LL9smI3XgVOqBIQ4= - - Modules/RealmSwift.swiftmodule/arm64-apple-watchos-simulator.swiftdoc - - 3WxxmONmeAI1RKLTZVs5/j5n7JE= - - Modules/RealmSwift.swiftmodule/arm64-apple-watchos-simulator.swiftmodule - - nLpmJ3/lJ6sVmFOvDIXCaLyjIio= - - Modules/RealmSwift.swiftmodule/i386-apple-watchos-simulator.abi.json - - FSPnLbho3G+LL9smI3XgVOqBIQ4= - - Modules/RealmSwift.swiftmodule/i386-apple-watchos-simulator.swiftdoc - - 3kPCqIJRzxZ0aH5fEaCFJA/arGE= - - Modules/RealmSwift.swiftmodule/i386-apple-watchos-simulator.swiftmodule - - yFUZxZrUH3v1P/IxkwZTyfb6XL8= - - Modules/RealmSwift.swiftmodule/x86_64-apple-watchos-simulator.abi.json - - FSPnLbho3G+LL9smI3XgVOqBIQ4= - - Modules/RealmSwift.swiftmodule/x86_64-apple-watchos-simulator.swiftdoc - - B6d+PK076Ii2S3472b54d4t7bQ4= - - Modules/RealmSwift.swiftmodule/x86_64-apple-watchos-simulator.swiftmodule - - Ou02Edklk+oFgEHCiN00LBZ4oow= - - Modules/module.modulemap - - IXqtE49GMw2XlMvW/BV8T8CvAUI= - - - files2 - - Headers/RealmSwift-Swift.h - - hash - - 5PgazQgKN5AbKPq/ps9xkHr+b/Q= - - hash2 - - gn9br1XEWTvjTDMQP2XrGv1Wco35I/I/jaQayecIzFE= - - - Modules/RealmSwift.swiftmodule/Project/arm64-apple-watchos-simulator.swiftsourceinfo - - hash - - vpUnHzGQrJOIjGuaHk2G9vEJCVE= - - hash2 - - 1O1cC7bAIwm1AaFpMxc5eJMq0S0kmDbNX+tfwvczIdo= - - - Modules/RealmSwift.swiftmodule/Project/i386-apple-watchos-simulator.swiftsourceinfo - - hash - - M8IoEAtN6TZVIlrfZDuwxZGKntU= - - hash2 - - UenxEgiUbU0dEjqYVPWxS6//q7nXblmL5k4PKdeyzvw= - - - Modules/RealmSwift.swiftmodule/Project/x86_64-apple-watchos-simulator.swiftsourceinfo - - hash - - qtSh2FBN68VLAcgMGNn2n9LBgXY= - - hash2 - - 138WcKzPkbLMpAfpAJcC1CVjwqlNrQ4vvbZNfCiuhBQ= - - - Modules/RealmSwift.swiftmodule/arm64-apple-watchos-simulator.abi.json - - hash - - FSPnLbho3G+LL9smI3XgVOqBIQ4= - - hash2 - - KnRdWE4y6t4QM5zi5JDptPdHFgJy1Tku+7GLkZS2aNM= - - - Modules/RealmSwift.swiftmodule/arm64-apple-watchos-simulator.swiftdoc - - hash - - 3WxxmONmeAI1RKLTZVs5/j5n7JE= - - hash2 - - r9HxqKKfi5WmHT6R99VCCwAgY8OmXhjYQu05mQAva1M= - - - Modules/RealmSwift.swiftmodule/arm64-apple-watchos-simulator.swiftmodule - - hash - - nLpmJ3/lJ6sVmFOvDIXCaLyjIio= - - hash2 - - tjzQJIdi6sb7WK2SshddfcmyfHBwavJXT1hQHJefpsQ= - - - Modules/RealmSwift.swiftmodule/i386-apple-watchos-simulator.abi.json - - hash - - FSPnLbho3G+LL9smI3XgVOqBIQ4= - - hash2 - - KnRdWE4y6t4QM5zi5JDptPdHFgJy1Tku+7GLkZS2aNM= - - - Modules/RealmSwift.swiftmodule/i386-apple-watchos-simulator.swiftdoc - - hash - - 3kPCqIJRzxZ0aH5fEaCFJA/arGE= - - hash2 - - GVj7TAKllCKKmA2j3eEzqEe8hDnE08KlUvjOZX/S9o0= - - - Modules/RealmSwift.swiftmodule/i386-apple-watchos-simulator.swiftmodule - - hash - - yFUZxZrUH3v1P/IxkwZTyfb6XL8= - - hash2 - - gAVHEv0Udtzn41q5F0AGnXhQJfxEEd26TmGLyNSd3m4= - - - Modules/RealmSwift.swiftmodule/x86_64-apple-watchos-simulator.abi.json - - hash - - FSPnLbho3G+LL9smI3XgVOqBIQ4= - - hash2 - - KnRdWE4y6t4QM5zi5JDptPdHFgJy1Tku+7GLkZS2aNM= - - - Modules/RealmSwift.swiftmodule/x86_64-apple-watchos-simulator.swiftdoc - - hash - - B6d+PK076Ii2S3472b54d4t7bQ4= - - hash2 - - c35SR5JMG/S2poIuYj8GSgWlrTtSMTWjvo7uXyuzEVY= - - - Modules/RealmSwift.swiftmodule/x86_64-apple-watchos-simulator.swiftmodule - - hash - - Ou02Edklk+oFgEHCiN00LBZ4oow= - - hash2 - - KvemVxvfPF9avCkeZrBMj7rpGBVztMDDI68befe3+kI= - - - Modules/module.modulemap - - hash - - IXqtE49GMw2XlMvW/BV8T8CvAUI= - - hash2 - - Zfv2ZSs6d6XBckKRFjW5jDoJ/AIcJok4zix6ZQgi7dg= - - - - rules - - ^.* - - ^.*\.lproj/ - - optional - - weight - 1000 - - ^.*\.lproj/locversion.plist$ - - omit - - weight - 1100 - - ^Base\.lproj/ - - weight - 1010 - - ^version.plist$ - - - rules2 - - .*\.dSYM($|/) - - weight - 11 - - ^(.*/)?\.DS_Store$ - - omit - - weight - 2000 - - ^.* - - ^.*\.lproj/ - - optional - - weight - 1000 - - ^.*\.lproj/locversion.plist$ - - omit - - weight - 1100 - - ^Base\.lproj/ - - weight - 1010 - - ^Info\.plist$ - - omit - - weight - 20 - - ^PkgInfo$ - - omit - - weight - 20 - - ^embedded\.provisionprofile$ - - weight - 20 - - ^version\.plist$ - - weight - 20 - - - - diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64/RealmSwift.framework/Headers/RealmSwift-Swift.h b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64/RealmSwift.framework/Headers/RealmSwift-Swift.h deleted file mode 100644 index a0975c6e0..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64/RealmSwift.framework/Headers/RealmSwift-Swift.h +++ /dev/null @@ -1,727 +0,0 @@ -#if 0 -#elif defined(__arm64__) && __arm64__ -// Generated by Apple Swift version 5.9 (swiftlang-5.9.0.128.106 clang-1500.0.40.1) -#ifndef REALMSWIFT_SWIFT_H -#define REALMSWIFT_SWIFT_H -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wgcc-compat" - -#if !defined(__has_include) -# define __has_include(x) 0 -#endif -#if !defined(__has_attribute) -# define __has_attribute(x) 0 -#endif -#if !defined(__has_feature) -# define __has_feature(x) 0 -#endif -#if !defined(__has_warning) -# define __has_warning(x) 0 -#endif - -#if __has_include() -# include -#endif - -#pragma clang diagnostic ignored "-Wauto-import" -#if defined(__OBJC__) -#include -#endif -#if defined(__cplusplus) -#include -#include -#include -#include -#include -#include -#include -#else -#include -#include -#include -#include -#endif -#if defined(__cplusplus) -#if defined(__arm64e__) && __has_include() -# include -#else -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wreserved-macro-identifier" -# ifndef __ptrauth_swift_value_witness_function_pointer -# define __ptrauth_swift_value_witness_function_pointer(x) -# endif -# ifndef __ptrauth_swift_class_method_pointer -# define __ptrauth_swift_class_method_pointer(x) -# endif -#pragma clang diagnostic pop -#endif -#endif - -#if !defined(SWIFT_TYPEDEFS) -# define SWIFT_TYPEDEFS 1 -# if __has_include() -# include -# elif !defined(__cplusplus) -typedef uint_least16_t char16_t; -typedef uint_least32_t char32_t; -# endif -typedef float swift_float2 __attribute__((__ext_vector_type__(2))); -typedef float swift_float3 __attribute__((__ext_vector_type__(3))); -typedef float swift_float4 __attribute__((__ext_vector_type__(4))); -typedef double swift_double2 __attribute__((__ext_vector_type__(2))); -typedef double swift_double3 __attribute__((__ext_vector_type__(3))); -typedef double swift_double4 __attribute__((__ext_vector_type__(4))); -typedef int swift_int2 __attribute__((__ext_vector_type__(2))); -typedef int swift_int3 __attribute__((__ext_vector_type__(3))); -typedef int swift_int4 __attribute__((__ext_vector_type__(4))); -typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2))); -typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3))); -typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); -#endif - -#if !defined(SWIFT_PASTE) -# define SWIFT_PASTE_HELPER(x, y) x##y -# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y) -#endif -#if !defined(SWIFT_METATYPE) -# define SWIFT_METATYPE(X) Class -#endif -#if !defined(SWIFT_CLASS_PROPERTY) -# if __has_feature(objc_class_property) -# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__ -# else -# define SWIFT_CLASS_PROPERTY(...) -# endif -#endif -#if !defined(SWIFT_RUNTIME_NAME) -# if __has_attribute(objc_runtime_name) -# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) -# else -# define SWIFT_RUNTIME_NAME(X) -# endif -#endif -#if !defined(SWIFT_COMPILE_NAME) -# if __has_attribute(swift_name) -# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) -# else -# define SWIFT_COMPILE_NAME(X) -# endif -#endif -#if !defined(SWIFT_METHOD_FAMILY) -# if __has_attribute(objc_method_family) -# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) -# else -# define SWIFT_METHOD_FAMILY(X) -# endif -#endif -#if !defined(SWIFT_NOESCAPE) -# if __has_attribute(noescape) -# define SWIFT_NOESCAPE __attribute__((noescape)) -# else -# define SWIFT_NOESCAPE -# endif -#endif -#if !defined(SWIFT_RELEASES_ARGUMENT) -# if __has_attribute(ns_consumed) -# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) -# else -# define SWIFT_RELEASES_ARGUMENT -# endif -#endif -#if !defined(SWIFT_WARN_UNUSED_RESULT) -# if __has_attribute(warn_unused_result) -# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) -# else -# define SWIFT_WARN_UNUSED_RESULT -# endif -#endif -#if !defined(SWIFT_NORETURN) -# if __has_attribute(noreturn) -# define SWIFT_NORETURN __attribute__((noreturn)) -# else -# define SWIFT_NORETURN -# endif -#endif -#if !defined(SWIFT_CLASS_EXTRA) -# define SWIFT_CLASS_EXTRA -#endif -#if !defined(SWIFT_PROTOCOL_EXTRA) -# define SWIFT_PROTOCOL_EXTRA -#endif -#if !defined(SWIFT_ENUM_EXTRA) -# define SWIFT_ENUM_EXTRA -#endif -#if !defined(SWIFT_CLASS) -# if __has_attribute(objc_subclassing_restricted) -# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA -# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# else -# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# endif -#endif -#if !defined(SWIFT_RESILIENT_CLASS) -# if __has_attribute(objc_class_stub) -# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub)) -# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME) -# else -# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) -# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME) -# endif -#endif -#if !defined(SWIFT_PROTOCOL) -# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA -# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA -#endif -#if !defined(SWIFT_EXTENSION) -# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__) -#endif -#if !defined(OBJC_DESIGNATED_INITIALIZER) -# if __has_attribute(objc_designated_initializer) -# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) -# else -# define OBJC_DESIGNATED_INITIALIZER -# endif -#endif -#if !defined(SWIFT_ENUM_ATTR) -# if __has_attribute(enum_extensibility) -# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility))) -# else -# define SWIFT_ENUM_ATTR(_extensibility) -# endif -#endif -#if !defined(SWIFT_ENUM) -# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type -# if __has_feature(generalized_swift_name) -# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type -# else -# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility) -# endif -#endif -#if !defined(SWIFT_UNAVAILABLE) -# define SWIFT_UNAVAILABLE __attribute__((unavailable)) -#endif -#if !defined(SWIFT_UNAVAILABLE_MSG) -# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg))) -#endif -#if !defined(SWIFT_AVAILABILITY) -# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__))) -#endif -#if !defined(SWIFT_WEAK_IMPORT) -# define SWIFT_WEAK_IMPORT __attribute__((weak_import)) -#endif -#if !defined(SWIFT_DEPRECATED) -# define SWIFT_DEPRECATED __attribute__((deprecated)) -#endif -#if !defined(SWIFT_DEPRECATED_MSG) -# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__))) -#endif -#if !defined(SWIFT_DEPRECATED_OBJC) -# if __has_feature(attribute_diagnose_if_objc) -# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) -# else -# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) -# endif -#endif -#if defined(__OBJC__) -#if !defined(IBSegueAction) -# define IBSegueAction -#endif -#endif -#if !defined(SWIFT_EXTERN) -# if defined(__cplusplus) -# define SWIFT_EXTERN extern "C" -# else -# define SWIFT_EXTERN extern -# endif -#endif -#if !defined(SWIFT_CALL) -# define SWIFT_CALL __attribute__((swiftcall)) -#endif -#if !defined(SWIFT_INDIRECT_RESULT) -# define SWIFT_INDIRECT_RESULT __attribute__((swift_indirect_result)) -#endif -#if !defined(SWIFT_CONTEXT) -# define SWIFT_CONTEXT __attribute__((swift_context)) -#endif -#if !defined(SWIFT_ERROR_RESULT) -# define SWIFT_ERROR_RESULT __attribute__((swift_error_result)) -#endif -#if defined(__cplusplus) -# define SWIFT_NOEXCEPT noexcept -#else -# define SWIFT_NOEXCEPT -#endif -#if !defined(SWIFT_C_INLINE_THUNK) -# if __has_attribute(always_inline) -# if __has_attribute(nodebug) -# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) __attribute__((nodebug)) -# else -# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) -# endif -# else -# define SWIFT_C_INLINE_THUNK inline -# endif -#endif -#if defined(_WIN32) -#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) -# define SWIFT_IMPORT_STDLIB_SYMBOL __declspec(dllimport) -#endif -#else -#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) -# define SWIFT_IMPORT_STDLIB_SYMBOL -#endif -#endif -#if defined(__OBJC__) -#if __has_feature(objc_modules) -#if __has_warning("-Watimport-in-framework-header") -#pragma clang diagnostic ignored "-Watimport-in-framework-header" -#endif -@import Foundation; -@import ObjectiveC; -@import Realm; -@import Realm.Swift; -#endif - -#endif -#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch" -#pragma clang diagnostic ignored "-Wduplicate-method-arg" -#if __has_warning("-Wpragma-clang-attribute") -# pragma clang diagnostic ignored "-Wpragma-clang-attribute" -#endif -#pragma clang diagnostic ignored "-Wunknown-pragmas" -#pragma clang diagnostic ignored "-Wnullability" -#pragma clang diagnostic ignored "-Wdollar-in-identifier-extension" - -#if __has_attribute(external_source_symbol) -# pragma push_macro("any") -# undef any -# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="RealmSwift",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol)) -# pragma pop_macro("any") -#endif - -#if defined(__OBJC__) -@class NSString; - -/// A type which has a custom representation in Realm events. -/// By default, objects are serialized to JSON using built-in rules which -/// include every property. If you wish to customize how a class is serialized -/// in events, you can declare it as conforming to this protocol and -/// define customEventRepresentation(). -SWIFT_PROTOCOL_NAMED("CustomEventRepresentable") -@protocol RLMCustomEventRepresentable -/// Get the custom event serialization for this object. -/// This function must return a valid JSON String, as this is included in a -/// larger JSON document. Implementations of this function should be “pure” -/// and access no data other than that which is obtainable from the Object -/// it is called on, and it should not mutate the object which it is called -/// on. This function is called on a background thread in a somewhat -/// unusual context, and attempting to access other data is likely to cause -/// problems. -- (NSString * _Nonnull)customEventRepresentation SWIFT_WARN_UNUSED_RESULT; -@end - -@class NSNumber; - -/// A 128-bit IEEE 754-2008 decimal floating point number. -/// This type is similar to Swift’s built-in Decimal type, but allocates bits differently, resulting in a different representable range. (NS)Decimal stores a significand of up to 38 digits long and an exponent from -128 to 127, while this type stores up to 34 digits of significand and an exponent from -6143 to 6144. -SWIFT_CLASS_NAMED("Decimal128") -@interface RealmSwiftDecimal128 : RLMDecimal128 -/// Creates a new zero-initialized Decimal128. -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -/// Converts the given value to a Decimal128. -/// The following types can be converted to Decimal128: -///
    -///
  • -/// Int (of any size) -///
  • -///
  • -/// Float -///
  • -///
  • -/// Double -///
  • -///
  • -/// String -///
  • -///
  • -/// NSNumber -///
  • -///
  • -/// Decimal -///
  • -///
-/// Passing a value with a type not in this list is a fatal error. Passing a string which cannot be parsed as a valid Decimal128 is a fatal error. -/// \param value The value to convert to a Decimal128. -/// -- (nonnull instancetype)initWithValue:(id _Nonnull)value OBJC_DESIGNATED_INITIALIZER; -/// Converts the given number to a Decimal128. -/// This initializer cannot fail and is never lossy. -/// \param number The number to convert to a Decimal128. -/// -- (nonnull instancetype)initWithNumber:(NSNumber * _Nonnull)number OBJC_DESIGNATED_INITIALIZER; -/// Parse the given string as a Decimal128. -/// This initializer never throws and is marked as throws only because removing it is a breaking -/// change. Strings which cannot be parsed as a Decimal128 return a value where isNaN is true. -/// \param string The string to parse. -/// -- (nullable instancetype)initWithString:(NSString * _Nonnull)string error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER; -@end - - - - - - - - - - - - - - - - - - -@class RLMObjectSchema; - -/// Object interface which allows untyped getters and setters for Objects. -/// :nodoc: -SWIFT_CLASS_NAMED("DynamicObject") -@interface RealmSwiftDynamicObject : RealmSwiftObject -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)value forKeyedSubscript:(NSString * _Nonnull)key; -/// :nodoc: -- (id _Nullable)valueForUndefinedKey:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -- (void)setValue:(id _Nullable)value forUndefinedKey:(NSString * _Nonnull)key; -/// :nodoc: -+ (BOOL)shouldIncludeInDefaultSchema SWIFT_WARN_UNUSED_RESULT; -+ (RLMObjectSchema * _Nullable)sharedSchema SWIFT_WARN_UNUSED_RESULT; -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -@end - - - - - - - - - - - - - - - -@class NSDate; - -/// A 12-byte (probably) unique object identifier. -/// ObjectIds are similar to a GUID or a UUID, and can be used to uniquely identify objects without a centralized ID generator. An ObjectID consists of: -///
    -///
  1. -/// A 4 byte timestamp measuring the creation time of the ObjectId in seconds since the Unix epoch. -///
  2. -///
  3. -/// A 5 byte random value -///
  4. -///
  5. -/// A 3 byte counter, initialized to a random value. -///
  6. -///
-/// ObjectIds are intended to be fast to generate. Sorting by an ObjectId field will typically result in the objects being sorted in creation order. -SWIFT_CLASS_NAMED("ObjectId") -@interface RealmSwiftObjectId : RLMObjectId -/// Creates a new zero-initialized ObjectId. -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -/// Creates a new randomly-initialized ObjectId. -+ (RealmSwiftObjectId * _Nonnull)objectId SWIFT_WARN_UNUSED_RESULT; -/// Creates a new ObjectId from the given 24-byte hexadecimal string. -/// Throws if the string is not 24 characters or contains any characters other than 0-9a-fA-F. -/// \param string The string to parse. -/// -- (nullable instancetype)initWithString:(NSString * _Nonnull)string error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER; -- (nonnull instancetype)initWithTimestamp:(NSDate * _Nonnull)timestamp machineIdentifier:(int32_t)machineIdentifier processIdentifier:(int32_t)processIdentifier SWIFT_UNAVAILABLE; -@end - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -@class RLMProperty; - -@interface RealmSwiftAsymmetricObject (SWIFT_EXTENSION(RealmSwift)) -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: AsymmetricObject { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - - - - -@interface RealmSwiftEmbeddedObject (SWIFT_EXTENSION(RealmSwift)) -/// :nodoc: -+ (BOOL)isEmbedded SWIFT_WARN_UNUSED_RESULT; -/// Indicates if the object can no longer be accessed because it is now invalid. -/// An object can no longer be accessed if the object has been deleted from the Realm that manages it, or if -/// invalidate() is called on that Realm. -@property (nonatomic, readonly, getter=isInvalidated) BOOL invalidated; -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the names of properties to ignore. These properties will not be managed by -/// the Realm that manages the object. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, any properties not -/// marked with @Persisted are automatically ignored. -/// -/// returns: -/// An array of property names to ignore. -+ (NSArray * _Nonnull)ignoredProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: EmbeddedObject { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - - - - - - -@interface RealmSwiftObject (SWIFT_EXTENSION(RealmSwift)) -/// Indicates if the object can no longer be accessed because it is now invalid. -/// An object can no longer be accessed if the object has been deleted from the Realm that manages it, or if -/// invalidate() is called on that Realm. This property is key-value observable. -@property (nonatomic, readonly, getter=isInvalidated) BOOL invalidated; -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the name of a property to be used as the primary key. -/// Only properties of types String, Int, ObjectId and UUID can be -/// designated as the primary key. Primary key properties enforce uniqueness -/// for each value whenever the property is set, which incurs minor overhead. -/// Indexes are created automatically for primary key properties. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, use -/// @Persisted(primaryKey: true) instead. -/// -/// returns: -/// The name of the property designated as the primary key, or -/// nil if the model has no primary key. -+ (NSString * _Nullable)primaryKey SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the names of properties to ignore. These -/// properties will not be managed by the Realm that manages the object. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, any properties not -/// marked with @Persisted are automatically ignored. -/// -/// returns: -/// An array of property names to ignore. -+ (NSArray * _Nonnull)ignoredProperties SWIFT_WARN_UNUSED_RESULT; -/// Returns an array of property names for properties which should be indexed. -/// Only string, integer, boolean, Date, and NSDate properties are supported. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, use -/// @Persisted(indexed: true) instead. -/// -/// returns: -/// An array of property names. -+ (NSArray * _Nonnull)indexedProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: Object { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// note: -/// In a migration block, when enumerating an old property with a public/private name, you will have to use -/// the old column name instead of the public one to retrieve the property value. -/// \code -/// let migrationBlock = { migration, oldSchemaVersion in -/// migration.enumerateObjects(ofType: "Person", { oldObj, newObj in -/// let oldPropertyValue = oldObj!["first_name"] as! String -/// // Use this value in migration -/// }) -/// } -/// -/// \endcodeThis has to be done as well when renaming a property. -/// \code -/// let migrationBlock = { migration, oldSchemaVersion in -/// migration.renameProperty(onType: "Person", from: "first_name", to: "complete_name") -/// } -/// -/// \endcode -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - -SWIFT_CLASS_NAMED("SwiftUIKVO") SWIFT_AVAILABILITY(watchos,introduced=6.0) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0) -@interface RLMSwiftUIKVO : NSObject -- (void)observeValueForKeyPath:(NSString * _Nullable)keyPath ofObject:(id _Nullable)object change:(NSDictionary * _Nullable)change context:(void * _Nullable)context; -- (nonnull instancetype)init SWIFT_UNAVAILABLE; -+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable"); -@end - - -SWIFT_AVAILABILITY(watchos,introduced=6.0) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0) -@interface RLMSwiftUIKVO (SWIFT_EXTENSION(RealmSwift)) -+ (BOOL)removeObserversFromObject:(NSObject * _Nonnull)object SWIFT_WARN_UNUSED_RESULT; -+ (void)addObserversToObject:(NSObject * _Nonnull)object; -@end - -#endif -#if __has_attribute(external_source_symbol) -# pragma clang attribute pop -#endif -#if defined(__cplusplus) -#endif -#pragma clang diagnostic pop -#endif - -#else -#error unsupported Swift architecture -#endif diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64/RealmSwift.framework/Info.plist b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64/RealmSwift.framework/Info.plist deleted file mode 100644 index 9d3111acd..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64/RealmSwift.framework/Info.plist and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/arm64-apple-xros.swiftsourceinfo b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/arm64-apple-xros.swiftsourceinfo deleted file mode 100644 index c5721c1be..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/arm64-apple-xros.swiftsourceinfo and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-xros.abi.json b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-xros.abi.json deleted file mode 100644 index dc109fc09..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-xros.abi.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "ABIRoot": { - "kind": "Root", - "name": "TopLevel", - "printedName": "TopLevel", - "json_format_version": 8 - }, - "ConstValues": [] -} \ No newline at end of file diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-xros.swiftdoc b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-xros.swiftdoc deleted file mode 100644 index 3c96d148b..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-xros.swiftdoc and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-xros.swiftmodule b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-xros.swiftmodule deleted file mode 100644 index 6e0b5d8e8..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-xros.swiftmodule and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64/RealmSwift.framework/Modules/module.modulemap b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64/RealmSwift.framework/Modules/module.modulemap deleted file mode 100644 index 5742239a8..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64/RealmSwift.framework/Modules/module.modulemap +++ /dev/null @@ -1,4 +0,0 @@ -framework module RealmSwift { - header "RealmSwift-Swift.h" - requires objc -} diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64/RealmSwift.framework/RealmSwift b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64/RealmSwift.framework/RealmSwift deleted file mode 100755 index afc18fe35..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64/RealmSwift.framework/RealmSwift and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64_x86_64-simulator/RealmSwift.framework/Headers/RealmSwift-Swift.h b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64_x86_64-simulator/RealmSwift.framework/Headers/RealmSwift-Swift.h deleted file mode 100644 index 37e9dad7b..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64_x86_64-simulator/RealmSwift.framework/Headers/RealmSwift-Swift.h +++ /dev/null @@ -1,1450 +0,0 @@ -#if 0 -#elif defined(__arm64__) && __arm64__ -// Generated by Apple Swift version 5.9 (swiftlang-5.9.0.128.106 clang-1500.0.40.1) -#ifndef REALMSWIFT_SWIFT_H -#define REALMSWIFT_SWIFT_H -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wgcc-compat" - -#if !defined(__has_include) -# define __has_include(x) 0 -#endif -#if !defined(__has_attribute) -# define __has_attribute(x) 0 -#endif -#if !defined(__has_feature) -# define __has_feature(x) 0 -#endif -#if !defined(__has_warning) -# define __has_warning(x) 0 -#endif - -#if __has_include() -# include -#endif - -#pragma clang diagnostic ignored "-Wauto-import" -#if defined(__OBJC__) -#include -#endif -#if defined(__cplusplus) -#include -#include -#include -#include -#include -#include -#include -#else -#include -#include -#include -#include -#endif -#if defined(__cplusplus) -#if defined(__arm64e__) && __has_include() -# include -#else -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wreserved-macro-identifier" -# ifndef __ptrauth_swift_value_witness_function_pointer -# define __ptrauth_swift_value_witness_function_pointer(x) -# endif -# ifndef __ptrauth_swift_class_method_pointer -# define __ptrauth_swift_class_method_pointer(x) -# endif -#pragma clang diagnostic pop -#endif -#endif - -#if !defined(SWIFT_TYPEDEFS) -# define SWIFT_TYPEDEFS 1 -# if __has_include() -# include -# elif !defined(__cplusplus) -typedef uint_least16_t char16_t; -typedef uint_least32_t char32_t; -# endif -typedef float swift_float2 __attribute__((__ext_vector_type__(2))); -typedef float swift_float3 __attribute__((__ext_vector_type__(3))); -typedef float swift_float4 __attribute__((__ext_vector_type__(4))); -typedef double swift_double2 __attribute__((__ext_vector_type__(2))); -typedef double swift_double3 __attribute__((__ext_vector_type__(3))); -typedef double swift_double4 __attribute__((__ext_vector_type__(4))); -typedef int swift_int2 __attribute__((__ext_vector_type__(2))); -typedef int swift_int3 __attribute__((__ext_vector_type__(3))); -typedef int swift_int4 __attribute__((__ext_vector_type__(4))); -typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2))); -typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3))); -typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); -#endif - -#if !defined(SWIFT_PASTE) -# define SWIFT_PASTE_HELPER(x, y) x##y -# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y) -#endif -#if !defined(SWIFT_METATYPE) -# define SWIFT_METATYPE(X) Class -#endif -#if !defined(SWIFT_CLASS_PROPERTY) -# if __has_feature(objc_class_property) -# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__ -# else -# define SWIFT_CLASS_PROPERTY(...) -# endif -#endif -#if !defined(SWIFT_RUNTIME_NAME) -# if __has_attribute(objc_runtime_name) -# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) -# else -# define SWIFT_RUNTIME_NAME(X) -# endif -#endif -#if !defined(SWIFT_COMPILE_NAME) -# if __has_attribute(swift_name) -# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) -# else -# define SWIFT_COMPILE_NAME(X) -# endif -#endif -#if !defined(SWIFT_METHOD_FAMILY) -# if __has_attribute(objc_method_family) -# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) -# else -# define SWIFT_METHOD_FAMILY(X) -# endif -#endif -#if !defined(SWIFT_NOESCAPE) -# if __has_attribute(noescape) -# define SWIFT_NOESCAPE __attribute__((noescape)) -# else -# define SWIFT_NOESCAPE -# endif -#endif -#if !defined(SWIFT_RELEASES_ARGUMENT) -# if __has_attribute(ns_consumed) -# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) -# else -# define SWIFT_RELEASES_ARGUMENT -# endif -#endif -#if !defined(SWIFT_WARN_UNUSED_RESULT) -# if __has_attribute(warn_unused_result) -# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) -# else -# define SWIFT_WARN_UNUSED_RESULT -# endif -#endif -#if !defined(SWIFT_NORETURN) -# if __has_attribute(noreturn) -# define SWIFT_NORETURN __attribute__((noreturn)) -# else -# define SWIFT_NORETURN -# endif -#endif -#if !defined(SWIFT_CLASS_EXTRA) -# define SWIFT_CLASS_EXTRA -#endif -#if !defined(SWIFT_PROTOCOL_EXTRA) -# define SWIFT_PROTOCOL_EXTRA -#endif -#if !defined(SWIFT_ENUM_EXTRA) -# define SWIFT_ENUM_EXTRA -#endif -#if !defined(SWIFT_CLASS) -# if __has_attribute(objc_subclassing_restricted) -# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA -# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# else -# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# endif -#endif -#if !defined(SWIFT_RESILIENT_CLASS) -# if __has_attribute(objc_class_stub) -# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub)) -# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME) -# else -# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) -# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME) -# endif -#endif -#if !defined(SWIFT_PROTOCOL) -# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA -# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA -#endif -#if !defined(SWIFT_EXTENSION) -# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__) -#endif -#if !defined(OBJC_DESIGNATED_INITIALIZER) -# if __has_attribute(objc_designated_initializer) -# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) -# else -# define OBJC_DESIGNATED_INITIALIZER -# endif -#endif -#if !defined(SWIFT_ENUM_ATTR) -# if __has_attribute(enum_extensibility) -# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility))) -# else -# define SWIFT_ENUM_ATTR(_extensibility) -# endif -#endif -#if !defined(SWIFT_ENUM) -# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type -# if __has_feature(generalized_swift_name) -# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type -# else -# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility) -# endif -#endif -#if !defined(SWIFT_UNAVAILABLE) -# define SWIFT_UNAVAILABLE __attribute__((unavailable)) -#endif -#if !defined(SWIFT_UNAVAILABLE_MSG) -# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg))) -#endif -#if !defined(SWIFT_AVAILABILITY) -# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__))) -#endif -#if !defined(SWIFT_WEAK_IMPORT) -# define SWIFT_WEAK_IMPORT __attribute__((weak_import)) -#endif -#if !defined(SWIFT_DEPRECATED) -# define SWIFT_DEPRECATED __attribute__((deprecated)) -#endif -#if !defined(SWIFT_DEPRECATED_MSG) -# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__))) -#endif -#if !defined(SWIFT_DEPRECATED_OBJC) -# if __has_feature(attribute_diagnose_if_objc) -# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) -# else -# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) -# endif -#endif -#if defined(__OBJC__) -#if !defined(IBSegueAction) -# define IBSegueAction -#endif -#endif -#if !defined(SWIFT_EXTERN) -# if defined(__cplusplus) -# define SWIFT_EXTERN extern "C" -# else -# define SWIFT_EXTERN extern -# endif -#endif -#if !defined(SWIFT_CALL) -# define SWIFT_CALL __attribute__((swiftcall)) -#endif -#if !defined(SWIFT_INDIRECT_RESULT) -# define SWIFT_INDIRECT_RESULT __attribute__((swift_indirect_result)) -#endif -#if !defined(SWIFT_CONTEXT) -# define SWIFT_CONTEXT __attribute__((swift_context)) -#endif -#if !defined(SWIFT_ERROR_RESULT) -# define SWIFT_ERROR_RESULT __attribute__((swift_error_result)) -#endif -#if defined(__cplusplus) -# define SWIFT_NOEXCEPT noexcept -#else -# define SWIFT_NOEXCEPT -#endif -#if !defined(SWIFT_C_INLINE_THUNK) -# if __has_attribute(always_inline) -# if __has_attribute(nodebug) -# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) __attribute__((nodebug)) -# else -# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) -# endif -# else -# define SWIFT_C_INLINE_THUNK inline -# endif -#endif -#if defined(_WIN32) -#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) -# define SWIFT_IMPORT_STDLIB_SYMBOL __declspec(dllimport) -#endif -#else -#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) -# define SWIFT_IMPORT_STDLIB_SYMBOL -#endif -#endif -#if defined(__OBJC__) -#if __has_feature(objc_modules) -#if __has_warning("-Watimport-in-framework-header") -#pragma clang diagnostic ignored "-Watimport-in-framework-header" -#endif -@import Foundation; -@import ObjectiveC; -@import Realm; -@import Realm.Swift; -#endif - -#endif -#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch" -#pragma clang diagnostic ignored "-Wduplicate-method-arg" -#if __has_warning("-Wpragma-clang-attribute") -# pragma clang diagnostic ignored "-Wpragma-clang-attribute" -#endif -#pragma clang diagnostic ignored "-Wunknown-pragmas" -#pragma clang diagnostic ignored "-Wnullability" -#pragma clang diagnostic ignored "-Wdollar-in-identifier-extension" - -#if __has_attribute(external_source_symbol) -# pragma push_macro("any") -# undef any -# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="RealmSwift",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol)) -# pragma pop_macro("any") -#endif - -#if defined(__OBJC__) -@class NSString; - -/// A type which has a custom representation in Realm events. -/// By default, objects are serialized to JSON using built-in rules which -/// include every property. If you wish to customize how a class is serialized -/// in events, you can declare it as conforming to this protocol and -/// define customEventRepresentation(). -SWIFT_PROTOCOL_NAMED("CustomEventRepresentable") -@protocol RLMCustomEventRepresentable -/// Get the custom event serialization for this object. -/// This function must return a valid JSON String, as this is included in a -/// larger JSON document. Implementations of this function should be “pure” -/// and access no data other than that which is obtainable from the Object -/// it is called on, and it should not mutate the object which it is called -/// on. This function is called on a background thread in a somewhat -/// unusual context, and attempting to access other data is likely to cause -/// problems. -- (NSString * _Nonnull)customEventRepresentation SWIFT_WARN_UNUSED_RESULT; -@end - -@class NSNumber; - -/// A 128-bit IEEE 754-2008 decimal floating point number. -/// This type is similar to Swift’s built-in Decimal type, but allocates bits differently, resulting in a different representable range. (NS)Decimal stores a significand of up to 38 digits long and an exponent from -128 to 127, while this type stores up to 34 digits of significand and an exponent from -6143 to 6144. -SWIFT_CLASS_NAMED("Decimal128") -@interface RealmSwiftDecimal128 : RLMDecimal128 -/// Creates a new zero-initialized Decimal128. -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -/// Converts the given value to a Decimal128. -/// The following types can be converted to Decimal128: -///
    -///
  • -/// Int (of any size) -///
  • -///
  • -/// Float -///
  • -///
  • -/// Double -///
  • -///
  • -/// String -///
  • -///
  • -/// NSNumber -///
  • -///
  • -/// Decimal -///
  • -///
-/// Passing a value with a type not in this list is a fatal error. Passing a string which cannot be parsed as a valid Decimal128 is a fatal error. -/// \param value The value to convert to a Decimal128. -/// -- (nonnull instancetype)initWithValue:(id _Nonnull)value OBJC_DESIGNATED_INITIALIZER; -/// Converts the given number to a Decimal128. -/// This initializer cannot fail and is never lossy. -/// \param number The number to convert to a Decimal128. -/// -- (nonnull instancetype)initWithNumber:(NSNumber * _Nonnull)number OBJC_DESIGNATED_INITIALIZER; -/// Parse the given string as a Decimal128. -/// This initializer never throws and is marked as throws only because removing it is a breaking -/// change. Strings which cannot be parsed as a Decimal128 return a value where isNaN is true. -/// \param string The string to parse. -/// -- (nullable instancetype)initWithString:(NSString * _Nonnull)string error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER; -@end - - - - - - - - - - - - - - - - - - -@class RLMObjectSchema; - -/// Object interface which allows untyped getters and setters for Objects. -/// :nodoc: -SWIFT_CLASS_NAMED("DynamicObject") -@interface RealmSwiftDynamicObject : RealmSwiftObject -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)value forKeyedSubscript:(NSString * _Nonnull)key; -/// :nodoc: -- (id _Nullable)valueForUndefinedKey:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -- (void)setValue:(id _Nullable)value forUndefinedKey:(NSString * _Nonnull)key; -/// :nodoc: -+ (BOOL)shouldIncludeInDefaultSchema SWIFT_WARN_UNUSED_RESULT; -+ (RLMObjectSchema * _Nullable)sharedSchema SWIFT_WARN_UNUSED_RESULT; -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -@end - - - - - - - - - - - - - - - -@class NSDate; - -/// A 12-byte (probably) unique object identifier. -/// ObjectIds are similar to a GUID or a UUID, and can be used to uniquely identify objects without a centralized ID generator. An ObjectID consists of: -///
    -///
  1. -/// A 4 byte timestamp measuring the creation time of the ObjectId in seconds since the Unix epoch. -///
  2. -///
  3. -/// A 5 byte random value -///
  4. -///
  5. -/// A 3 byte counter, initialized to a random value. -///
  6. -///
-/// ObjectIds are intended to be fast to generate. Sorting by an ObjectId field will typically result in the objects being sorted in creation order. -SWIFT_CLASS_NAMED("ObjectId") -@interface RealmSwiftObjectId : RLMObjectId -/// Creates a new zero-initialized ObjectId. -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -/// Creates a new randomly-initialized ObjectId. -+ (RealmSwiftObjectId * _Nonnull)objectId SWIFT_WARN_UNUSED_RESULT; -/// Creates a new ObjectId from the given 24-byte hexadecimal string. -/// Throws if the string is not 24 characters or contains any characters other than 0-9a-fA-F. -/// \param string The string to parse. -/// -- (nullable instancetype)initWithString:(NSString * _Nonnull)string error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER; -- (nonnull instancetype)initWithTimestamp:(NSDate * _Nonnull)timestamp machineIdentifier:(int32_t)machineIdentifier processIdentifier:(int32_t)processIdentifier SWIFT_UNAVAILABLE; -@end - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -@class RLMProperty; - -@interface RealmSwiftAsymmetricObject (SWIFT_EXTENSION(RealmSwift)) -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: AsymmetricObject { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - - - - -@interface RealmSwiftEmbeddedObject (SWIFT_EXTENSION(RealmSwift)) -/// :nodoc: -+ (BOOL)isEmbedded SWIFT_WARN_UNUSED_RESULT; -/// Indicates if the object can no longer be accessed because it is now invalid. -/// An object can no longer be accessed if the object has been deleted from the Realm that manages it, or if -/// invalidate() is called on that Realm. -@property (nonatomic, readonly, getter=isInvalidated) BOOL invalidated; -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the names of properties to ignore. These properties will not be managed by -/// the Realm that manages the object. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, any properties not -/// marked with @Persisted are automatically ignored. -/// -/// returns: -/// An array of property names to ignore. -+ (NSArray * _Nonnull)ignoredProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: EmbeddedObject { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - - - - - - -@interface RealmSwiftObject (SWIFT_EXTENSION(RealmSwift)) -/// Indicates if the object can no longer be accessed because it is now invalid. -/// An object can no longer be accessed if the object has been deleted from the Realm that manages it, or if -/// invalidate() is called on that Realm. This property is key-value observable. -@property (nonatomic, readonly, getter=isInvalidated) BOOL invalidated; -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the name of a property to be used as the primary key. -/// Only properties of types String, Int, ObjectId and UUID can be -/// designated as the primary key. Primary key properties enforce uniqueness -/// for each value whenever the property is set, which incurs minor overhead. -/// Indexes are created automatically for primary key properties. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, use -/// @Persisted(primaryKey: true) instead. -/// -/// returns: -/// The name of the property designated as the primary key, or -/// nil if the model has no primary key. -+ (NSString * _Nullable)primaryKey SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the names of properties to ignore. These -/// properties will not be managed by the Realm that manages the object. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, any properties not -/// marked with @Persisted are automatically ignored. -/// -/// returns: -/// An array of property names to ignore. -+ (NSArray * _Nonnull)ignoredProperties SWIFT_WARN_UNUSED_RESULT; -/// Returns an array of property names for properties which should be indexed. -/// Only string, integer, boolean, Date, and NSDate properties are supported. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, use -/// @Persisted(indexed: true) instead. -/// -/// returns: -/// An array of property names. -+ (NSArray * _Nonnull)indexedProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: Object { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// note: -/// In a migration block, when enumerating an old property with a public/private name, you will have to use -/// the old column name instead of the public one to retrieve the property value. -/// \code -/// let migrationBlock = { migration, oldSchemaVersion in -/// migration.enumerateObjects(ofType: "Person", { oldObj, newObj in -/// let oldPropertyValue = oldObj!["first_name"] as! String -/// // Use this value in migration -/// }) -/// } -/// -/// \endcodeThis has to be done as well when renaming a property. -/// \code -/// let migrationBlock = { migration, oldSchemaVersion in -/// migration.renameProperty(onType: "Person", from: "first_name", to: "complete_name") -/// } -/// -/// \endcode -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - -SWIFT_CLASS_NAMED("SwiftUIKVO") SWIFT_AVAILABILITY(watchos,introduced=6.0) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0) -@interface RLMSwiftUIKVO : NSObject -- (void)observeValueForKeyPath:(NSString * _Nullable)keyPath ofObject:(id _Nullable)object change:(NSDictionary * _Nullable)change context:(void * _Nullable)context; -- (nonnull instancetype)init SWIFT_UNAVAILABLE; -+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable"); -@end - - -SWIFT_AVAILABILITY(watchos,introduced=6.0) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0) -@interface RLMSwiftUIKVO (SWIFT_EXTENSION(RealmSwift)) -+ (BOOL)removeObserversFromObject:(NSObject * _Nonnull)object SWIFT_WARN_UNUSED_RESULT; -+ (void)addObserversToObject:(NSObject * _Nonnull)object; -@end - -#endif -#if __has_attribute(external_source_symbol) -# pragma clang attribute pop -#endif -#if defined(__cplusplus) -#endif -#pragma clang diagnostic pop -#endif - -#elif defined(__x86_64__) && __x86_64__ -// Generated by Apple Swift version 5.9 (swiftlang-5.9.0.128.106 clang-1500.0.40.1) -#ifndef REALMSWIFT_SWIFT_H -#define REALMSWIFT_SWIFT_H -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wgcc-compat" - -#if !defined(__has_include) -# define __has_include(x) 0 -#endif -#if !defined(__has_attribute) -# define __has_attribute(x) 0 -#endif -#if !defined(__has_feature) -# define __has_feature(x) 0 -#endif -#if !defined(__has_warning) -# define __has_warning(x) 0 -#endif - -#if __has_include() -# include -#endif - -#pragma clang diagnostic ignored "-Wauto-import" -#if defined(__OBJC__) -#include -#endif -#if defined(__cplusplus) -#include -#include -#include -#include -#include -#include -#include -#else -#include -#include -#include -#include -#endif -#if defined(__cplusplus) -#if defined(__arm64e__) && __has_include() -# include -#else -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wreserved-macro-identifier" -# ifndef __ptrauth_swift_value_witness_function_pointer -# define __ptrauth_swift_value_witness_function_pointer(x) -# endif -# ifndef __ptrauth_swift_class_method_pointer -# define __ptrauth_swift_class_method_pointer(x) -# endif -#pragma clang diagnostic pop -#endif -#endif - -#if !defined(SWIFT_TYPEDEFS) -# define SWIFT_TYPEDEFS 1 -# if __has_include() -# include -# elif !defined(__cplusplus) -typedef uint_least16_t char16_t; -typedef uint_least32_t char32_t; -# endif -typedef float swift_float2 __attribute__((__ext_vector_type__(2))); -typedef float swift_float3 __attribute__((__ext_vector_type__(3))); -typedef float swift_float4 __attribute__((__ext_vector_type__(4))); -typedef double swift_double2 __attribute__((__ext_vector_type__(2))); -typedef double swift_double3 __attribute__((__ext_vector_type__(3))); -typedef double swift_double4 __attribute__((__ext_vector_type__(4))); -typedef int swift_int2 __attribute__((__ext_vector_type__(2))); -typedef int swift_int3 __attribute__((__ext_vector_type__(3))); -typedef int swift_int4 __attribute__((__ext_vector_type__(4))); -typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2))); -typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3))); -typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); -#endif - -#if !defined(SWIFT_PASTE) -# define SWIFT_PASTE_HELPER(x, y) x##y -# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y) -#endif -#if !defined(SWIFT_METATYPE) -# define SWIFT_METATYPE(X) Class -#endif -#if !defined(SWIFT_CLASS_PROPERTY) -# if __has_feature(objc_class_property) -# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__ -# else -# define SWIFT_CLASS_PROPERTY(...) -# endif -#endif -#if !defined(SWIFT_RUNTIME_NAME) -# if __has_attribute(objc_runtime_name) -# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) -# else -# define SWIFT_RUNTIME_NAME(X) -# endif -#endif -#if !defined(SWIFT_COMPILE_NAME) -# if __has_attribute(swift_name) -# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) -# else -# define SWIFT_COMPILE_NAME(X) -# endif -#endif -#if !defined(SWIFT_METHOD_FAMILY) -# if __has_attribute(objc_method_family) -# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) -# else -# define SWIFT_METHOD_FAMILY(X) -# endif -#endif -#if !defined(SWIFT_NOESCAPE) -# if __has_attribute(noescape) -# define SWIFT_NOESCAPE __attribute__((noescape)) -# else -# define SWIFT_NOESCAPE -# endif -#endif -#if !defined(SWIFT_RELEASES_ARGUMENT) -# if __has_attribute(ns_consumed) -# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) -# else -# define SWIFT_RELEASES_ARGUMENT -# endif -#endif -#if !defined(SWIFT_WARN_UNUSED_RESULT) -# if __has_attribute(warn_unused_result) -# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) -# else -# define SWIFT_WARN_UNUSED_RESULT -# endif -#endif -#if !defined(SWIFT_NORETURN) -# if __has_attribute(noreturn) -# define SWIFT_NORETURN __attribute__((noreturn)) -# else -# define SWIFT_NORETURN -# endif -#endif -#if !defined(SWIFT_CLASS_EXTRA) -# define SWIFT_CLASS_EXTRA -#endif -#if !defined(SWIFT_PROTOCOL_EXTRA) -# define SWIFT_PROTOCOL_EXTRA -#endif -#if !defined(SWIFT_ENUM_EXTRA) -# define SWIFT_ENUM_EXTRA -#endif -#if !defined(SWIFT_CLASS) -# if __has_attribute(objc_subclassing_restricted) -# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA -# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# else -# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA -# endif -#endif -#if !defined(SWIFT_RESILIENT_CLASS) -# if __has_attribute(objc_class_stub) -# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub)) -# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME) -# else -# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) -# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME) -# endif -#endif -#if !defined(SWIFT_PROTOCOL) -# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA -# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA -#endif -#if !defined(SWIFT_EXTENSION) -# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__) -#endif -#if !defined(OBJC_DESIGNATED_INITIALIZER) -# if __has_attribute(objc_designated_initializer) -# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) -# else -# define OBJC_DESIGNATED_INITIALIZER -# endif -#endif -#if !defined(SWIFT_ENUM_ATTR) -# if __has_attribute(enum_extensibility) -# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility))) -# else -# define SWIFT_ENUM_ATTR(_extensibility) -# endif -#endif -#if !defined(SWIFT_ENUM) -# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type -# if __has_feature(generalized_swift_name) -# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type -# else -# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility) -# endif -#endif -#if !defined(SWIFT_UNAVAILABLE) -# define SWIFT_UNAVAILABLE __attribute__((unavailable)) -#endif -#if !defined(SWIFT_UNAVAILABLE_MSG) -# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg))) -#endif -#if !defined(SWIFT_AVAILABILITY) -# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__))) -#endif -#if !defined(SWIFT_WEAK_IMPORT) -# define SWIFT_WEAK_IMPORT __attribute__((weak_import)) -#endif -#if !defined(SWIFT_DEPRECATED) -# define SWIFT_DEPRECATED __attribute__((deprecated)) -#endif -#if !defined(SWIFT_DEPRECATED_MSG) -# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__))) -#endif -#if !defined(SWIFT_DEPRECATED_OBJC) -# if __has_feature(attribute_diagnose_if_objc) -# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) -# else -# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) -# endif -#endif -#if defined(__OBJC__) -#if !defined(IBSegueAction) -# define IBSegueAction -#endif -#endif -#if !defined(SWIFT_EXTERN) -# if defined(__cplusplus) -# define SWIFT_EXTERN extern "C" -# else -# define SWIFT_EXTERN extern -# endif -#endif -#if !defined(SWIFT_CALL) -# define SWIFT_CALL __attribute__((swiftcall)) -#endif -#if !defined(SWIFT_INDIRECT_RESULT) -# define SWIFT_INDIRECT_RESULT __attribute__((swift_indirect_result)) -#endif -#if !defined(SWIFT_CONTEXT) -# define SWIFT_CONTEXT __attribute__((swift_context)) -#endif -#if !defined(SWIFT_ERROR_RESULT) -# define SWIFT_ERROR_RESULT __attribute__((swift_error_result)) -#endif -#if defined(__cplusplus) -# define SWIFT_NOEXCEPT noexcept -#else -# define SWIFT_NOEXCEPT -#endif -#if !defined(SWIFT_C_INLINE_THUNK) -# if __has_attribute(always_inline) -# if __has_attribute(nodebug) -# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) __attribute__((nodebug)) -# else -# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) -# endif -# else -# define SWIFT_C_INLINE_THUNK inline -# endif -#endif -#if defined(_WIN32) -#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) -# define SWIFT_IMPORT_STDLIB_SYMBOL __declspec(dllimport) -#endif -#else -#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) -# define SWIFT_IMPORT_STDLIB_SYMBOL -#endif -#endif -#if defined(__OBJC__) -#if __has_feature(objc_modules) -#if __has_warning("-Watimport-in-framework-header") -#pragma clang diagnostic ignored "-Watimport-in-framework-header" -#endif -@import Foundation; -@import ObjectiveC; -@import Realm; -@import Realm.Swift; -#endif - -#endif -#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch" -#pragma clang diagnostic ignored "-Wduplicate-method-arg" -#if __has_warning("-Wpragma-clang-attribute") -# pragma clang diagnostic ignored "-Wpragma-clang-attribute" -#endif -#pragma clang diagnostic ignored "-Wunknown-pragmas" -#pragma clang diagnostic ignored "-Wnullability" -#pragma clang diagnostic ignored "-Wdollar-in-identifier-extension" - -#if __has_attribute(external_source_symbol) -# pragma push_macro("any") -# undef any -# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="RealmSwift",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol)) -# pragma pop_macro("any") -#endif - -#if defined(__OBJC__) -@class NSString; - -/// A type which has a custom representation in Realm events. -/// By default, objects are serialized to JSON using built-in rules which -/// include every property. If you wish to customize how a class is serialized -/// in events, you can declare it as conforming to this protocol and -/// define customEventRepresentation(). -SWIFT_PROTOCOL_NAMED("CustomEventRepresentable") -@protocol RLMCustomEventRepresentable -/// Get the custom event serialization for this object. -/// This function must return a valid JSON String, as this is included in a -/// larger JSON document. Implementations of this function should be “pure” -/// and access no data other than that which is obtainable from the Object -/// it is called on, and it should not mutate the object which it is called -/// on. This function is called on a background thread in a somewhat -/// unusual context, and attempting to access other data is likely to cause -/// problems. -- (NSString * _Nonnull)customEventRepresentation SWIFT_WARN_UNUSED_RESULT; -@end - -@class NSNumber; - -/// A 128-bit IEEE 754-2008 decimal floating point number. -/// This type is similar to Swift’s built-in Decimal type, but allocates bits differently, resulting in a different representable range. (NS)Decimal stores a significand of up to 38 digits long and an exponent from -128 to 127, while this type stores up to 34 digits of significand and an exponent from -6143 to 6144. -SWIFT_CLASS_NAMED("Decimal128") -@interface RealmSwiftDecimal128 : RLMDecimal128 -/// Creates a new zero-initialized Decimal128. -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -/// Converts the given value to a Decimal128. -/// The following types can be converted to Decimal128: -///
    -///
  • -/// Int (of any size) -///
  • -///
  • -/// Float -///
  • -///
  • -/// Double -///
  • -///
  • -/// String -///
  • -///
  • -/// NSNumber -///
  • -///
  • -/// Decimal -///
  • -///
-/// Passing a value with a type not in this list is a fatal error. Passing a string which cannot be parsed as a valid Decimal128 is a fatal error. -/// \param value The value to convert to a Decimal128. -/// -- (nonnull instancetype)initWithValue:(id _Nonnull)value OBJC_DESIGNATED_INITIALIZER; -/// Converts the given number to a Decimal128. -/// This initializer cannot fail and is never lossy. -/// \param number The number to convert to a Decimal128. -/// -- (nonnull instancetype)initWithNumber:(NSNumber * _Nonnull)number OBJC_DESIGNATED_INITIALIZER; -/// Parse the given string as a Decimal128. -/// This initializer never throws and is marked as throws only because removing it is a breaking -/// change. Strings which cannot be parsed as a Decimal128 return a value where isNaN is true. -/// \param string The string to parse. -/// -- (nullable instancetype)initWithString:(NSString * _Nonnull)string error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER; -@end - - - - - - - - - - - - - - - - - - -@class RLMObjectSchema; - -/// Object interface which allows untyped getters and setters for Objects. -/// :nodoc: -SWIFT_CLASS_NAMED("DynamicObject") -@interface RealmSwiftDynamicObject : RealmSwiftObject -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)value forKeyedSubscript:(NSString * _Nonnull)key; -/// :nodoc: -- (id _Nullable)valueForUndefinedKey:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -- (void)setValue:(id _Nullable)value forUndefinedKey:(NSString * _Nonnull)key; -/// :nodoc: -+ (BOOL)shouldIncludeInDefaultSchema SWIFT_WARN_UNUSED_RESULT; -+ (RLMObjectSchema * _Nullable)sharedSchema SWIFT_WARN_UNUSED_RESULT; -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -@end - - - - - - - - - - - - - - - -@class NSDate; - -/// A 12-byte (probably) unique object identifier. -/// ObjectIds are similar to a GUID or a UUID, and can be used to uniquely identify objects without a centralized ID generator. An ObjectID consists of: -///
    -///
  1. -/// A 4 byte timestamp measuring the creation time of the ObjectId in seconds since the Unix epoch. -///
  2. -///
  3. -/// A 5 byte random value -///
  4. -///
  5. -/// A 3 byte counter, initialized to a random value. -///
  6. -///
-/// ObjectIds are intended to be fast to generate. Sorting by an ObjectId field will typically result in the objects being sorted in creation order. -SWIFT_CLASS_NAMED("ObjectId") -@interface RealmSwiftObjectId : RLMObjectId -/// Creates a new zero-initialized ObjectId. -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; -/// Creates a new randomly-initialized ObjectId. -+ (RealmSwiftObjectId * _Nonnull)objectId SWIFT_WARN_UNUSED_RESULT; -/// Creates a new ObjectId from the given 24-byte hexadecimal string. -/// Throws if the string is not 24 characters or contains any characters other than 0-9a-fA-F. -/// \param string The string to parse. -/// -- (nullable instancetype)initWithString:(NSString * _Nonnull)string error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER; -- (nonnull instancetype)initWithTimestamp:(NSDate * _Nonnull)timestamp machineIdentifier:(int32_t)machineIdentifier processIdentifier:(int32_t)processIdentifier SWIFT_UNAVAILABLE; -@end - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -@class RLMProperty; - -@interface RealmSwiftAsymmetricObject (SWIFT_EXTENSION(RealmSwift)) -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: AsymmetricObject { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - - - - -@interface RealmSwiftEmbeddedObject (SWIFT_EXTENSION(RealmSwift)) -/// :nodoc: -+ (BOOL)isEmbedded SWIFT_WARN_UNUSED_RESULT; -/// Indicates if the object can no longer be accessed because it is now invalid. -/// An object can no longer be accessed if the object has been deleted from the Realm that manages it, or if -/// invalidate() is called on that Realm. -@property (nonatomic, readonly, getter=isInvalidated) BOOL invalidated; -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the names of properties to ignore. These properties will not be managed by -/// the Realm that manages the object. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, any properties not -/// marked with @Persisted are automatically ignored. -/// -/// returns: -/// An array of property names to ignore. -+ (NSArray * _Nonnull)ignoredProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: EmbeddedObject { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - - - - - - -@interface RealmSwiftObject (SWIFT_EXTENSION(RealmSwift)) -/// Indicates if the object can no longer be accessed because it is now invalid. -/// An object can no longer be accessed if the object has been deleted from the Realm that manages it, or if -/// invalidate() is called on that Realm. This property is key-value observable. -@property (nonatomic, readonly, getter=isInvalidated) BOOL invalidated; -/// A human-readable description of the object. -@property (nonatomic, readonly, copy) NSString * _Nonnull description; -/// WARNING: This is an internal helper method not intended for public use. -/// It is not considered part of the public API. -/// :nodoc: -+ (NSArray * _Nonnull)_getProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the name of a property to be used as the primary key. -/// Only properties of types String, Int, ObjectId and UUID can be -/// designated as the primary key. Primary key properties enforce uniqueness -/// for each value whenever the property is set, which incurs minor overhead. -/// Indexes are created automatically for primary key properties. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, use -/// @Persisted(primaryKey: true) instead. -/// -/// returns: -/// The name of the property designated as the primary key, or -/// nil if the model has no primary key. -+ (NSString * _Nullable)primaryKey SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify the names of properties to ignore. These -/// properties will not be managed by the Realm that manages the object. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, any properties not -/// marked with @Persisted are automatically ignored. -/// -/// returns: -/// An array of property names to ignore. -+ (NSArray * _Nonnull)ignoredProperties SWIFT_WARN_UNUSED_RESULT; -/// Returns an array of property names for properties which should be indexed. -/// Only string, integer, boolean, Date, and NSDate properties are supported. -/// warning: -/// This function is only applicable to legacy property declarations -/// using @objc. When using @Persisted, use -/// @Persisted(indexed: true) instead. -/// -/// returns: -/// An array of property names. -+ (NSArray * _Nonnull)indexedProperties SWIFT_WARN_UNUSED_RESULT; -/// Override this method to specify a map of public-private property names. -/// This will set a different persisted property name on the Realm, and allows using the public name -/// for any operation with the property. (Ex: Queries, Sorting, …). -/// This very helpful if you need to map property names from your Device Sync JSON schema -/// to local property names. -/// \code -/// class Person: Object { -/// @Persisted var firstName: String -/// @Persisted var birthDate: Date -/// @Persisted var age: Int -/// -/// override class public func propertiesMapping() -> [String : String] { -/// ["firstName": "first_name", -/// "birthDate": "birth_date"] -/// } -/// } -/// -/// \endcodenote: -/// Only property that have a different column name have to be added to the properties mapping -/// dictionary. -/// note: -/// In a migration block, when enumerating an old property with a public/private name, you will have to use -/// the old column name instead of the public one to retrieve the property value. -/// \code -/// let migrationBlock = { migration, oldSchemaVersion in -/// migration.enumerateObjects(ofType: "Person", { oldObj, newObj in -/// let oldPropertyValue = oldObj!["first_name"] as! String -/// // Use this value in migration -/// }) -/// } -/// -/// \endcodeThis has to be done as well when renaming a property. -/// \code -/// let migrationBlock = { migration, oldSchemaVersion in -/// migration.renameProperty(onType: "Person", from: "first_name", to: "complete_name") -/// } -/// -/// \endcode -/// returns: -/// A dictionary of public-private property names. -+ (NSDictionary * _Nonnull)propertiesMapping SWIFT_WARN_UNUSED_RESULT; -/// :nodoc: -+ (NSDictionary * _Nonnull)_realmColumnNames SWIFT_WARN_UNUSED_RESULT SWIFT_UNAVAILABLE_MSG("'_realmColumnNames' has been renamed to 'propertiesMapping': `_realmColumnNames` private API is unavailable in our Swift SDK, please use the override `.propertiesMapping()` instead."); -- (id _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; -- (void)setObject:(id _Nullable)newValue forKeyedSubscript:(NSString * _Nonnull)key; -@end - - -SWIFT_CLASS_NAMED("SwiftUIKVO") SWIFT_AVAILABILITY(watchos,introduced=6.0) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0) -@interface RLMSwiftUIKVO : NSObject -- (void)observeValueForKeyPath:(NSString * _Nullable)keyPath ofObject:(id _Nullable)object change:(NSDictionary * _Nullable)change context:(void * _Nullable)context; -- (nonnull instancetype)init SWIFT_UNAVAILABLE; -+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable"); -@end - - -SWIFT_AVAILABILITY(watchos,introduced=6.0) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0) -@interface RLMSwiftUIKVO (SWIFT_EXTENSION(RealmSwift)) -+ (BOOL)removeObserversFromObject:(NSObject * _Nonnull)object SWIFT_WARN_UNUSED_RESULT; -+ (void)addObserversToObject:(NSObject * _Nonnull)object; -@end - -#endif -#if __has_attribute(external_source_symbol) -# pragma clang attribute pop -#endif -#if defined(__cplusplus) -#endif -#pragma clang diagnostic pop -#endif - -#else -#error unsupported Swift architecture -#endif diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64_x86_64-simulator/RealmSwift.framework/Info.plist b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64_x86_64-simulator/RealmSwift.framework/Info.plist deleted file mode 100644 index f3646adad..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64_x86_64-simulator/RealmSwift.framework/Info.plist and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/arm64-apple-xros-simulator.swiftsourceinfo b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/arm64-apple-xros-simulator.swiftsourceinfo deleted file mode 100644 index 22d91f5ab..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/arm64-apple-xros-simulator.swiftsourceinfo and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/x86_64-apple-xros-simulator.swiftsourceinfo b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/x86_64-apple-xros-simulator.swiftsourceinfo deleted file mode 100644 index 7f26faa81..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/Project/x86_64-apple-xros-simulator.swiftsourceinfo and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-xros-simulator.abi.json b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-xros-simulator.abi.json deleted file mode 100644 index dc109fc09..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-xros-simulator.abi.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "ABIRoot": { - "kind": "Root", - "name": "TopLevel", - "printedName": "TopLevel", - "json_format_version": 8 - }, - "ConstValues": [] -} \ No newline at end of file diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-xros-simulator.swiftdoc b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-xros-simulator.swiftdoc deleted file mode 100644 index 66cc1cad9..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-xros-simulator.swiftdoc and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-xros-simulator.swiftmodule b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-xros-simulator.swiftmodule deleted file mode 100644 index e09284f71..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64-apple-xros-simulator.swiftmodule and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/x86_64-apple-xros-simulator.abi.json b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/x86_64-apple-xros-simulator.abi.json deleted file mode 100644 index dc109fc09..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/x86_64-apple-xros-simulator.abi.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "ABIRoot": { - "kind": "Root", - "name": "TopLevel", - "printedName": "TopLevel", - "json_format_version": 8 - }, - "ConstValues": [] -} \ No newline at end of file diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/x86_64-apple-xros-simulator.swiftdoc b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/x86_64-apple-xros-simulator.swiftdoc deleted file mode 100644 index b9c275b18..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/x86_64-apple-xros-simulator.swiftdoc and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/x86_64-apple-xros-simulator.swiftmodule b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/x86_64-apple-xros-simulator.swiftmodule deleted file mode 100644 index 48185580e..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64_x86_64-simulator/RealmSwift.framework/Modules/RealmSwift.swiftmodule/x86_64-apple-xros-simulator.swiftmodule and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64_x86_64-simulator/RealmSwift.framework/Modules/module.modulemap b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64_x86_64-simulator/RealmSwift.framework/Modules/module.modulemap deleted file mode 100644 index 5742239a8..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64_x86_64-simulator/RealmSwift.framework/Modules/module.modulemap +++ /dev/null @@ -1,4 +0,0 @@ -framework module RealmSwift { - header "RealmSwift-Swift.h" - requires objc -} diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64_x86_64-simulator/RealmSwift.framework/RealmSwift b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64_x86_64-simulator/RealmSwift.framework/RealmSwift deleted file mode 100755 index 5a40ba507..000000000 Binary files a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64_x86_64-simulator/RealmSwift.framework/RealmSwift and /dev/null differ diff --git a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64_x86_64-simulator/RealmSwift.framework/_CodeSignature/CodeResources b/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64_x86_64-simulator/RealmSwift.framework/_CodeSignature/CodeResources deleted file mode 100644 index dd4204bcb..000000000 --- a/Projects/Modules/ThirdPartyLib/Frameworks/RealmSwift.xcframework/xros-arm64_x86_64-simulator/RealmSwift.framework/_CodeSignature/CodeResources +++ /dev/null @@ -1,212 +0,0 @@ - - - - - files - - Headers/RealmSwift-Swift.h - - 4/F674JO/MVMxbCMUEnOTj7VNWs= - - Info.plist - - YS2ZeOxpXvJZ9XlSC4aEkU3UqQw= - - Modules/RealmSwift.swiftmodule/Project/arm64-apple-xros-simulator.swiftsourceinfo - - xO67tz8a1O8ZPJbhPdu8YVIcg94= - - Modules/RealmSwift.swiftmodule/Project/x86_64-apple-xros-simulator.swiftsourceinfo - - C6T4EOLDL2FWLT5vMhVyqNzDEp4= - - Modules/RealmSwift.swiftmodule/arm64-apple-xros-simulator.abi.json - - FSPnLbho3G+LL9smI3XgVOqBIQ4= - - Modules/RealmSwift.swiftmodule/arm64-apple-xros-simulator.swiftdoc - - TuTUdZDBs/kI7oypQeZwR2MbxRs= - - Modules/RealmSwift.swiftmodule/arm64-apple-xros-simulator.swiftmodule - - wZGrvwlTBDeOUvFGsUzGlKAIiQo= - - Modules/RealmSwift.swiftmodule/x86_64-apple-xros-simulator.abi.json - - FSPnLbho3G+LL9smI3XgVOqBIQ4= - - Modules/RealmSwift.swiftmodule/x86_64-apple-xros-simulator.swiftdoc - - BaAPDRTaRPbER0MCqV9qCCqlmHc= - - Modules/RealmSwift.swiftmodule/x86_64-apple-xros-simulator.swiftmodule - - 1P7Id5Deo9qMgQvXBpA3otU3TPU= - - Modules/module.modulemap - - IXqtE49GMw2XlMvW/BV8T8CvAUI= - - - files2 - - Headers/RealmSwift-Swift.h - - hash2 - - R7UTtK85xpvxJUN1vpceuPOXeEhtTvgY/mzD2K8KmI8= - - - Modules/RealmSwift.swiftmodule/Project/arm64-apple-xros-simulator.swiftsourceinfo - - hash2 - - VHqeIo16JxNsFZq3Bigg/JTo1HQoZtsr3aMJXgUDtmw= - - - Modules/RealmSwift.swiftmodule/Project/x86_64-apple-xros-simulator.swiftsourceinfo - - hash2 - - 0D9Mm/9drvL/jTZ7qz9CQnDzUr0eIax9KMRlQmIadr0= - - - Modules/RealmSwift.swiftmodule/arm64-apple-xros-simulator.abi.json - - hash2 - - KnRdWE4y6t4QM5zi5JDptPdHFgJy1Tku+7GLkZS2aNM= - - - Modules/RealmSwift.swiftmodule/arm64-apple-xros-simulator.swiftdoc - - hash2 - - 5oItde+lREKr1XW2HF5KEL68xVl4xhwCAyl2op8sBsg= - - - Modules/RealmSwift.swiftmodule/arm64-apple-xros-simulator.swiftmodule - - hash2 - - LWXvYkbi2Snef6wb/JyDsmQPFAm/JqIXIFK42du6nJg= - - - Modules/RealmSwift.swiftmodule/x86_64-apple-xros-simulator.abi.json - - hash2 - - KnRdWE4y6t4QM5zi5JDptPdHFgJy1Tku+7GLkZS2aNM= - - - Modules/RealmSwift.swiftmodule/x86_64-apple-xros-simulator.swiftdoc - - hash2 - - svVRX6OT2bi2U4f2RPfvB1Ki/jj9/xC1JKmV+dHoiDI= - - - Modules/RealmSwift.swiftmodule/x86_64-apple-xros-simulator.swiftmodule - - hash2 - - OeJ8w/GUt8yaZwA9MbaKgLzdM7tCduQ1cWqd+78YrZA= - - - Modules/module.modulemap - - hash2 - - Zfv2ZSs6d6XBckKRFjW5jDoJ/AIcJok4zix6ZQgi7dg= - - - - rules - - ^.* - - ^.*\.lproj/ - - optional - - weight - 1000 - - ^.*\.lproj/locversion.plist$ - - omit - - weight - 1100 - - ^Base\.lproj/ - - weight - 1010 - - ^version.plist$ - - - rules2 - - .*\.dSYM($|/) - - weight - 11 - - ^(.*/)?\.DS_Store$ - - omit - - weight - 2000 - - ^.* - - ^.*\.lproj/ - - optional - - weight - 1000 - - ^.*\.lproj/locversion.plist$ - - omit - - weight - 1100 - - ^Base\.lproj/ - - weight - 1010 - - ^Info\.plist$ - - omit - - weight - 20 - - ^PkgInfo$ - - omit - - weight - 20 - - ^embedded\.provisionprofile$ - - weight - 20 - - ^version\.plist$ - - weight - 20 - - - - diff --git a/Projects/Modules/ThirdPartyLib/Project.swift b/Projects/Modules/ThirdPartyLib/Project.swift index 89fd85921..f08d13b22 100644 --- a/Projects/Modules/ThirdPartyLib/Project.swift +++ b/Projects/Modules/ThirdPartyLib/Project.swift @@ -1,18 +1,25 @@ +import DependencyPlugin import ProjectDescription import ProjectDescriptionHelpers -import UtilityPlugin -let project = Project.makeModule( - name: "ThirdPartyLib", - product: .framework, - dependencies: [ - .XCFramework.Realm, - .XCFramework.RealmSwift, - .SPM.NaverLogin, - .SPM.RxSwift, - .SPM.RxMoya, - .SPM.Moya, - .SPM.FirebaseAnalytics, - .SPM.FirebaseCrashlytics +let project = Project.module( + name: ModulePaths.Module.ThirdPartyLib.rawValue, + targets: [ + .implements( + module: .module(.ThirdPartyLib), + product: .framework, + dependencies: [ + .XCFramework.Realm, + .XCFramework.RealmSwift, + .SPM.NaverLogin, + .SPM.RxSwift, + .SPM.RxMoya, + .SPM.Moya, + .SPM.FirebaseAnalytics, + .SPM.FirebaseCrashlytics, + .SPM.CryptoSwift, + .SPM.FirebaseMessaging + ] + ) ] ) diff --git a/Projects/Modules/ThirdPartyLib/Sources/ThirdPartyLibrary.swift b/Projects/Modules/ThirdPartyLib/Sources/ThirdPartyLibrary.swift index 7d846fc7c..45848cb7f 100644 --- a/Projects/Modules/ThirdPartyLib/Sources/ThirdPartyLibrary.swift +++ b/Projects/Modules/ThirdPartyLib/Sources/ThirdPartyLibrary.swift @@ -1 +1,5 @@ +import Firebase + // this is for tuist +import Realm +import RealmSwift diff --git a/Projects/Modules/ThirdPartyLib/Tests/TargetTests.swift b/Projects/Modules/ThirdPartyLib/Tests/TargetTests.swift new file mode 100644 index 000000000..147c29d2f --- /dev/null +++ b/Projects/Modules/ThirdPartyLib/Tests/TargetTests.swift @@ -0,0 +1,15 @@ +import XCTest + +class TargetTests: XCTestCase { + override func setUpWithError() throws { + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDownWithError() throws { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testExample() throws { + XCTAssertEqual("A", "A") + } +} diff --git a/Projects/Modules/Utility/.swiftlint.yml b/Projects/Modules/Utility/.swiftlint.yml deleted file mode 100644 index ff44f9f28..000000000 --- a/Projects/Modules/Utility/.swiftlint.yml +++ /dev/null @@ -1,20 +0,0 @@ -excluded: - - "**/*/NeedleGenerated.swift" - - "Tuist" - - -force_cast: # From https://realm.github.io/SwiftLint/force_cast.html - warning # 강제 캐스팅은 error에서 warning으로 변경 - -disabled_rules: - - trailing_whitespace - - vertical_whitespace - - colon - - comma - - comment_spacing # 주석 여백 - - mark # //MARK 관련 warning - - opening_brace # 괄호 열 때 줄바꿈을 했는지 안했는지, (안했으면 warning) - - line_length # 한줄에 글자 수 제한 , warning: 120, error: 200 (default) - - statement_position # if는 반드시 else로 끝나야한다. - - identifier_name #변수명 글자 수 제한 - diff --git a/Projects/Modules/Utility/Project.swift b/Projects/Modules/Utility/Project.swift index 784820808..1d8c38938 100644 --- a/Projects/Modules/Utility/Project.swift +++ b/Projects/Modules/Utility/Project.swift @@ -1,10 +1,13 @@ +import DependencyPlugin import ProjectDescription import ProjectDescriptionHelpers -let project = Project.makeModule( - name: "Utility", - product: .staticFramework, - dependencies: [ - .Project.Module.ThirdPartyLib +let project = Project.module( + name: ModulePaths.Module.Utility.rawValue, + targets: [ + .implements(module: .module(.Utility), product: .framework, dependencies: [ + .module(target: .LogManager), + .module(target: .ThirdPartyLib) + ]) ] ) diff --git a/Projects/Modules/Utility/Sources/API/WMImageAPI.swift b/Projects/Modules/Utility/Sources/API/WMImageAPI.swift index f4bbc7775..fcb15fad8 100644 --- a/Projects/Modules/Utility/Sources/API/WMImageAPI.swift +++ b/Projects/Modules/Utility/Sources/API/WMImageAPI.swift @@ -1,87 +1,35 @@ -// -// WMImageAPI.swift -// Utility -// -// Created by KTH on 2023/02/10. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - import Foundation public enum WMImageAPI { - case fetchNewsThumbnail(time: String) - case fetchArtistWithRound(id: String, version: Int) - case fetchArtistWithSquare(id: String, version: Int) - case fetchProfile(name: String, version: Int) - case fetchPlayList(id: String, version: Int) - case fetchRecommendPlayListWithRound(id: String, version: Int) - case fetchRecommendPlayListWithSquare(id: String, version: Int) case fetchYoutubeThumbnail(id: String) case fetchYoutubeThumbnailHD(id: String) - case fetchNotice(id: String) } -extension WMImageAPI { - public var baseURLString: String { - return BASE_IMAGE_URL() - } - - public var youtubeBaseURLString: String { +public extension WMImageAPI { + var baseURLString: String { return "https://i.ytimg.com" } - - public var path: String { + + var path: String { switch self { - case let .fetchNewsThumbnail(time): - return WMDOMAIN_IMAGE_NEWS() + "/\(time).png" - - case let .fetchArtistWithRound(id, version): - return WMDOMAIN_IMAGE_ARTIST_ROUND() + "/\(id).png?v=\(version)" - - case let .fetchArtistWithSquare(id, version): - return WMDOMAIN_IMAGE_ARTIST_SQUARE() + "/\(id).png?v=\(version)" - - case let .fetchProfile(name,version): - return WMDOMAIN_IMAGE_PROFILE() + "/\(name).png?v=\(version)" - - case let .fetchPlayList(id,version): - return WMDOMAIN_IMAGE_PLAYLIST() + "/\(id).png?v=\(version)" - - case let .fetchRecommendPlayListWithSquare(id,version): - return WMDOMAIN_IMAGE_RECOMMEND_PLAYLIST_SQUARE() + "/\(id).png?v=\(version)" - - case let .fetchRecommendPlayListWithRound(id,version): - return WMDOMAIN_IMAGE_RECOMMEND_PLAYLIST_ROUND() + "/\(id).png?v=\(version)" - case let .fetchYoutubeThumbnail(id): return "vi/\(id)/mqdefault.jpg" - + case let .fetchYoutubeThumbnailHD(id): return "vi/\(id)/maxresdefault.jpg" - - case let .fetchNotice(id): - return WMDOMAIN_IMAGE_NOTICE() + "/\(id)" } } - - public var toString: String { + + var toString: String { switch self { - case .fetchYoutubeThumbnail: - return youtubeBaseURLString + "/" + path - case .fetchYoutubeThumbnailHD: - return youtubeBaseURLString + "/" + path - default: + case .fetchYoutubeThumbnail, .fetchYoutubeThumbnailHD: return baseURLString + "/" + path } } - - public var toURL: URL? { + + var toURL: URL? { switch self { - case .fetchYoutubeThumbnail: - return URL(string: youtubeBaseURLString + "/" + path) - case .fetchYoutubeThumbnailHD: - return URL(string: youtubeBaseURLString + "/" + path) - default: + case .fetchYoutubeThumbnail, .fetchYoutubeThumbnailHD: return URL(string: baseURLString + "/" + path) } } diff --git a/Projects/Modules/Utility/Sources/DeepLink/DeepLinkGenerator.swift b/Projects/Modules/Utility/Sources/DeepLink/DeepLinkGenerator.swift new file mode 100644 index 000000000..e31a2a0d8 --- /dev/null +++ b/Projects/Modules/Utility/Sources/DeepLink/DeepLinkGenerator.swift @@ -0,0 +1,13 @@ +import Foundation + +public protocol WMDeepLinkGeneratable { + func generatePlaylistDeepLink(key: String) -> String +} + +public final class WMDeepLinkGenerator: WMDeepLinkGeneratable { + public init() {} + + public func generatePlaylistDeepLink(key: String) -> String { + return "https://\(WM_UNIVERSALLINK_DOMAIN())/playlist/\(key)" + } +} diff --git a/Projects/Modules/Utility/Sources/Enums/BottomSheetSize.swift b/Projects/Modules/Utility/Sources/Enums/BottomSheetSize.swift new file mode 100644 index 000000000..a947aad5e --- /dev/null +++ b/Projects/Modules/Utility/Sources/Enums/BottomSheetSize.swift @@ -0,0 +1,6 @@ +import Foundation + +public enum BottomSheetSize { + case intrinsic + case fixed(CGFloat) +} diff --git a/Projects/Modules/Utility/Sources/Enums/PlaylistFloatingButtonPosition.swift b/Projects/Modules/Utility/Sources/Enums/PlaylistFloatingButtonPosition.swift new file mode 100644 index 000000000..1c72b3c7e --- /dev/null +++ b/Projects/Modules/Utility/Sources/Enums/PlaylistFloatingButtonPosition.swift @@ -0,0 +1,15 @@ +import Foundation + +public enum PlaylistFloatingButtonPosition { + case `default` + case top + + public var bottomOffset: CGFloat { + switch self { + case .default: + return -20 + case .top: + return -80 + } + } +} diff --git a/Projects/Modules/Utility/Sources/Enums/WMToastOptions.swift b/Projects/Modules/Utility/Sources/Enums/WMToastOptions.swift new file mode 100644 index 000000000..a45ba220f --- /dev/null +++ b/Projects/Modules/Utility/Sources/Enums/WMToastOptions.swift @@ -0,0 +1,27 @@ +import Foundation + +public struct WMToastOptions: OptionSet { + public let rawValue: Int + public static let empty = WMToastOptions(rawValue: 1 << 0) + public static let tabBar = WMToastOptions(rawValue: 1 << 1) + public static let songCart = WMToastOptions(rawValue: 1 << 2) + + public init(rawValue: Int) { + self.rawValue = rawValue + } + + var offset: CGFloat { + switch self { + case _ where self == [.empty]: + return 56 + case _ where self == [.tabBar]: + return 56 + 56 + case _ where self == [.songCart]: + return 56 + 56 + case _ where self == [.tabBar, .songCart]: + return 56 + 56 + 40 + default: + return 56 + } + } +} diff --git a/Projects/Modules/Utility/Sources/Enums/YoutubePlayType.swift b/Projects/Modules/Utility/Sources/Enums/YoutubePlayType.swift new file mode 100644 index 000000000..2743af89d --- /dev/null +++ b/Projects/Modules/Utility/Sources/Enums/YoutubePlayType.swift @@ -0,0 +1,13 @@ +import Foundation + +public enum YoutubePlayType: Codable { + case youtube + case youtubeMusic + + public var display: String { + switch self { + case .youtube: "YouTube" + case .youtubeMusic: "YouTube Music" + } + } +} diff --git a/Projects/Modules/Utility/Sources/Extensions/Extension+AVAsset.swift b/Projects/Modules/Utility/Sources/Extensions/Extension+AVAsset.swift index 24b2c563e..8998ae1ae 100644 --- a/Projects/Modules/Utility/Sources/Extensions/Extension+AVAsset.swift +++ b/Projects/Modules/Utility/Sources/Extensions/Extension+AVAsset.swift @@ -1,15 +1,14 @@ -import Foundation import AVKit +import Foundation public extension AVAsset { - func generateThumbnail(completion: @escaping (UIImage?) -> Void) { DispatchQueue.global().async { let imageGenerator = AVAssetImageGenerator(asset: self) let time = CMTime(seconds: 0.0, preferredTimescale: 600) let times = [NSValue(time: time)] - imageGenerator.generateCGImagesAsynchronously(forTimes: times, completionHandler: { _,image,_,_,_ in + imageGenerator.generateCGImagesAsynchronously(forTimes: times, completionHandler: { _, image, _, _, _ in if let image = image { completion(UIImage(cgImage: image)) } else { diff --git a/Projects/Modules/Utility/Sources/Extensions/Extension+CALayer.swift b/Projects/Modules/Utility/Sources/Extensions/Extension+CALayer.swift index ffac99680..97b828b0e 100644 --- a/Projects/Modules/Utility/Sources/Extensions/Extension+CALayer.swift +++ b/Projects/Modules/Utility/Sources/Extensions/Extension+CALayer.swift @@ -10,19 +10,18 @@ import Foundation import QuartzCore import UIKit - public extension CALayer { - /// 해당 layer의 원하는 방향에 borderColor와 width를 부여한다 - /// - Parameter arr_edge: bodrer가 들어갈 방향 - /// - Parameter color: 적용할 색상 - /// - Parameter width: border 두께 + // 해당 layer의 원하는 방향에 borderColor와 width를 부여한다 + // - Parameter arr_edge: bodrer가 들어갈 방향 + // - Parameter color: 적용할 색상 + // - Parameter width: border 두께 /* - UIRectEdge.all, //전체 - UIRectEdge.top, //상단 - UIRectEdge.bottom, //하단 - UIRectEdge.left, //왼쪽 - UIRectEdge.right, //오른쪽 - */ + UIRectEdge.all, //전체 + UIRectEdge.top, //상단 + UIRectEdge.bottom, //하단 + UIRectEdge.left, //왼쪽 + UIRectEdge.right, //오른쪽 + */ func addBorder(_ edges: [UIRectEdge], color: UIColor, height: CGFloat) { for edge in edges { @@ -33,7 +32,7 @@ public extension CALayer { break case UIRectEdge.bottom: border.frame = CGRect.init(x: 0, y: frame.height - height, width: frame.width, height: height) - + break case UIRectEdge.left: border.frame = CGRect.init(x: 0, y: 0, width: height, height: frame.height) @@ -44,8 +43,44 @@ public extension CALayer { default: break } - border.backgroundColor = color.cgColor; + border.backgroundColor = color.cgColor self.addSublayer(border) } } + + /// 피그마를 보고 빠르게 그림자를 추가할 수 있는 함수입니다. + /// - Parameters: + /// - color: ex) UIColor(hex: "#12FF34") + /// - alpha: ex) 0.0 ~ 1.0 + /// - x: 그림자 위치 조정(pt단위) ex) 0 + /// - y: 그림자 위치 조정(pt단위) ex) 0 + /// - blur: 피그마 기준 blur 값(pt단위) ex) 20 + /// - spread: 피그마 기준 spread 값(pt단위) ex) 20 + func addShadow( + color: UIColor, + alpha: Float, + x: CGFloat, + y: CGFloat, + blur: CGFloat, + spread: CGFloat + ) { + masksToBounds = false + shadowColor = color.cgColor + shadowOpacity = alpha + shadowOffset = CGSize(width: x, height: y) + + guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene else { + DEBUG_LOG("windowScene을 찾지 못했습니다.") + return + } + let displayScale = windowScene.screen.traitCollection.displayScale + shadowRadius = blur / displayScale + + if spread == 0 { + shadowPath = nil + } else { + let rect = bounds.insetBy(dx: -spread, dy: -spread) + shadowPath = UIBezierPath(rect: rect).cgPath + } + } } diff --git a/Projects/Modules/Utility/Sources/Extensions/Extension+Data.swift b/Projects/Modules/Utility/Sources/Extensions/Extension+Data.swift index 3388ed8f7..8c96e0b84 100644 --- a/Projects/Modules/Utility/Sources/Extensions/Extension+Data.swift +++ b/Projects/Modules/Utility/Sources/Extensions/Extension+Data.swift @@ -6,9 +6,9 @@ // Copyright © 2023 yongbeomkwak. All rights reserved. // +import AVFoundation import Foundation import UIKit -import AVFoundation public extension Data { func extractThumbnail() -> UIImage? { diff --git a/Projects/Modules/Utility/Sources/Extensions/Extension+Date.swift b/Projects/Modules/Utility/Sources/Extensions/Extension+Date.swift index 8d08f8d8b..d3ad8bfd6 100644 --- a/Projects/Modules/Utility/Sources/Extensions/Extension+Date.swift +++ b/Projects/Modules/Utility/Sources/Extensions/Extension+Date.swift @@ -7,14 +7,14 @@ public extension Date { func changeDateFormatForChart() -> String { let dateFormatter = DateFormatter() dateFormatter.dateFormat = "MM월 dd일 a hh시" - dateFormatter.locale = Locale(identifier:"ko_KR") + dateFormatter.locale = Locale(identifier: "ko_KR") return dateFormatter.string(from: self) } - + func dateToString(format: String) -> String { let dateFormatter = DateFormatter() dateFormatter.dateFormat = format - dateFormatter.locale = Locale(identifier:"ko_KR") + dateFormatter.locale = Locale(identifier: "ko_KR") return dateFormatter.string(from: self) } } diff --git a/Projects/Modules/Utility/Sources/Extensions/Extension+Dictionary.swift b/Projects/Modules/Utility/Sources/Extensions/Extension+Dictionary.swift new file mode 100644 index 000000000..22a49c1f2 --- /dev/null +++ b/Projects/Modules/Utility/Sources/Extensions/Extension+Dictionary.swift @@ -0,0 +1,13 @@ +import Foundation + +public extension Dictionary where Key == AnyHashable, Value == Any { + var parseNotificationInfo: [String: Any] { + guard let data = self["data"] as? String, + let jsonData = data.data(using: .utf8), + let dict = try? JSONSerialization.jsonObject(with: jsonData, options: .allowFragments) + as? [String: Any] else { + return [:] + } + return dict + } +} diff --git a/Projects/Modules/Utility/Sources/Extensions/Extension+Double.swift b/Projects/Modules/Utility/Sources/Extensions/Extension+Double.swift index 99fc4215d..12ec0515f 100644 --- a/Projects/Modules/Utility/Sources/Extensions/Extension+Double.swift +++ b/Projects/Modules/Utility/Sources/Extensions/Extension+Double.swift @@ -1,24 +1,36 @@ -// -// Extension+Double.swift -// Utility -// -// Created by KTH on 2023/04/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - import Foundation +import UIKit public extension Double { var unixTimeToDate: Date { return Date(timeIntervalSince1970: TimeInterval(truncating: NSNumber(value: self))) } + var kilobytes: Double { return Double(self) / 1024 } + var megabytes: Double { return kilobytes / 1024 } + var gigabytes: Double { return megabytes / 1024 } + + var correctLeading: CGFloat { + return self * APP_WIDTH() / 375.0 + } + + var correctTrailing: CGFloat { + return -self * APP_WIDTH() / 375.0 + } + + var correctTop: CGFloat { + return APP_HEIGHT() * (self / 812.0) + } + + var correctBottom: CGFloat { + return -APP_HEIGHT() * (self / 812.0) + } } diff --git a/Projects/Modules/Utility/Sources/Extensions/Extension+Int.swift b/Projects/Modules/Utility/Sources/Extensions/Extension+Int.swift index a97c925d7..9e0ca74c1 100644 --- a/Projects/Modules/Utility/Sources/Extensions/Extension+Int.swift +++ b/Projects/Modules/Utility/Sources/Extensions/Extension+Int.swift @@ -1,16 +1,15 @@ import Foundation public extension Int { - /// Int 값을 받으면 세번쨰 자리마다 ,를 삽입하여 반환합니다. /// - Returns: 세 자리마다 ,가 들어간 String func addCommaToNumber() -> String { let numberFormatter = NumberFormatter() numberFormatter.numberStyle = .decimal - + return numberFormatter.string(from: NSNumber(value: self))! } - + /// DateFormat의 형태를 변경합니다. /// - Parameter origin: 원본 포맷 (ex: yyyy-MM-dd HH:mm:ss) /// - Parameter result: 바꾸기 원하는 포맷 (ex: HH:mm) @@ -19,11 +18,51 @@ public extension Int { let formatter = DateFormatter() formatter.dateFormat = origin formatter.locale = .current - + guard let dateFromString = formatter.date(from: String(self)) else { return "" } - + formatter.dateFormat = result let stringFromDate = formatter.string(from: dateFromString) return stringFromDate } + + var toUnitNumber: String { + let formatter = NumberFormatter() + formatter.numberStyle = .decimal + formatter.groupingSeparator = "" + formatter.decimalSeparator = "." + formatter.maximumFractionDigits = 2 + formatter.minimumFractionDigits = 0 + formatter.roundingMode = .floor + + let correctNumber: Int = (self < 0) ? 0 : self + + switch correctNumber { + case 0 ..< 1000: + return String(correctNumber) + case 1000 ..< 10000: + let thousands = Double(correctNumber) / 1000.0 + return formatter.string(from: NSNumber(value: thousands))! + "천" + case 10000 ..< 1_000_000: + let tenThousands = Double(correctNumber) / 10000.0 + return formatter.string(from: NSNumber(value: tenThousands))! + "만" + case 1_000_000 ..< 100_000_000: + let tenThousands = Int(correctNumber) / 10000 + return formatter.string(from: NSNumber(value: tenThousands))! + "만" + default: + let millions = Double(correctNumber) / 100_000_000.0 + return formatter.string(from: NSNumber(value: millions))! + "억" + } + } + + func formattedWithComma() -> String { + let numberFormatter = NumberFormatter() + numberFormatter.numberStyle = .decimal + + guard let result = numberFormatter.string(from: NSNumber(value: self)) else { + return "0" + } + + return result + } } diff --git a/Projects/Modules/Utility/Sources/Extensions/Extension+Messaging.swift b/Projects/Modules/Utility/Sources/Extensions/Extension+Messaging.swift new file mode 100644 index 000000000..942f00615 --- /dev/null +++ b/Projects/Modules/Utility/Sources/Extensions/Extension+Messaging.swift @@ -0,0 +1,18 @@ +import FirebaseMessaging +import Foundation +import RxSwift + +public extension Messaging { + func fetchRxPushToken() -> Single { + return Single.create { single in + self.token { token, error in + if let error = error { + single(.failure(error)) + } else if let token = token { + single(.success(token)) + } + } + return Disposables.create() + } + } +} diff --git a/Projects/Modules/Utility/Sources/Extensions/Extension+NSAttributedString.swift b/Projects/Modules/Utility/Sources/Extensions/Extension+NSAttributedString.swift index da94908c1..52ce86eed 100644 --- a/Projects/Modules/Utility/Sources/Extensions/Extension+NSAttributedString.swift +++ b/Projects/Modules/Utility/Sources/Extensions/Extension+NSAttributedString.swift @@ -10,20 +10,21 @@ import Foundation import UIKit public extension NSAttributedString { - func height(containerWidth: CGFloat) -> CGFloat { - - let rect = self.boundingRect(with: CGSize.init(width: containerWidth, height: CGFloat.greatestFiniteMagnitude), - options: [.usesLineFragmentOrigin, .usesFontLeading], - context: nil) + let rect = self.boundingRect( + with: CGSize.init(width: containerWidth, height: CGFloat.greatestFiniteMagnitude), + options: [.usesLineFragmentOrigin, .usesFontLeading], + context: nil + ) return ceil(rect.size.height) } func width(containerHeight: CGFloat) -> CGFloat { - - let rect = self.boundingRect(with: CGSize.init(width: CGFloat.greatestFiniteMagnitude, height: containerHeight), - options: [.usesLineFragmentOrigin, .usesFontLeading], - context: nil) + let rect = self.boundingRect( + with: CGSize.init(width: CGFloat.greatestFiniteMagnitude, height: containerHeight), + options: [.usesLineFragmentOrigin, .usesFontLeading], + context: nil + ) return ceil(rect.size.width) } } diff --git a/Projects/Modules/Utility/Sources/Extensions/Extension+Notification.Name.swift b/Projects/Modules/Utility/Sources/Extensions/Extension+Notification.Name.swift index 91edee407..cee2cc82b 100644 --- a/Projects/Modules/Utility/Sources/Extensions/Extension+Notification.Name.swift +++ b/Projects/Modules/Utility/Sources/Extensions/Extension+Notification.Name.swift @@ -1,25 +1,13 @@ -// -// Extension+Notification.Name.swift -// Utility -// -// Created by yongbeomkwak on 2023/02/21. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - import Foundation public extension Notification.Name { - static let updatePlayerMode = Notification.Name("updatePlayerMode") - static let playListRefresh = Notification.Name("playListRefresh") - static let likeListRefresh = Notification.Name("likeListRefresh") - static let playListNameRefresh = Notification.Name("playListNameRefresh") - static let statusBarEnterDarkBackground = Notification.Name("statusBarEnterDarkBackground") - static let statusBarEnterLightBackground = Notification.Name("statusBarEnterLightBackground") - static let showSongCart = Notification.Name("showSongCart") - static let hideSongCart = Notification.Name("hideSongCart") - static let movedTab = Notification.Name("movedTab") - static let selectedSongOnSearch = Notification.Name("selectedSongOnSearch") - static let updateCurrentSongLikeState = Notification.Name("updateCurrentSongLikeState") - static let resetYouTubePlayerHostingView = Notification.Name("resetYouTubePlayerHostingView") - static let requestPlaybackLog = Notification.Name("requestPlaybackLog") + static let shouldRefreshPlaylist = Notification.Name("shouldRefreshPlaylist") // 플레이리스트 목록 갱신(보관함 같은) (노래목록 아님) + static let shouldRefreshLikeList = Notification.Name("shouldRefreshLikeList") + static let didRemovedSubscriptionPlaylist = Notification.Name("didRemovedSubscriptionPlaylist") // 보관함에서 구독플리 제거 + static let willRefreshUserInfo = Notification.Name("willRefreshUserInfo") // 유저 정보 갱신 + static let willStatusBarEnterDarkBackground = Notification.Name("willStatusBarEnterDarkBackground") + static let willStatusBarEnterLightBackground = Notification.Name("willStatusBarEnterLightBackground") + static let shouldHidePlaylistFloatingButton = Notification.Name("shouldHidePlaylistFloatingButton") + static let shouldShowPlaylistFloatingButton = Notification.Name("shouldShowPlaylistFloatingButton") + static let shouldMovePlaylistFloatingButton = Notification.Name("shouldMovePlaylistFloatingButton") } diff --git a/Projects/Modules/Utility/Sources/Extensions/Extension+PreferenceManager.swift b/Projects/Modules/Utility/Sources/Extensions/Extension+PreferenceManager.swift index 01865fe05..c319761e4 100644 --- a/Projects/Modules/Utility/Sources/Extensions/Extension+PreferenceManager.swift +++ b/Projects/Modules/Utility/Sources/Extensions/Extension+PreferenceManager.swift @@ -6,65 +6,71 @@ // Copyright © 2023 yongbeomkwak. All rights reserved. // +import FirebaseCrashlytics import Foundation +import LogManager import RxSwift public extension PreferenceManager { - /// 최근 검색어를 저장 /// - Parameter word: 최근 검색어 func addRecentRecords(word: String) { let maxSize: Int = 10 var currentRecentRecords = Utility.PreferenceManager.recentRecords ?? [] - + if currentRecentRecords.contains(word) { - if let i = currentRecentRecords.firstIndex(where: { $0 == word }){ + if let i = currentRecentRecords.firstIndex(where: { $0 == word }) { currentRecentRecords.remove(at: i) currentRecentRecords.insert(word, at: 0) } - - }else{ + + } else { if currentRecentRecords.count == maxSize { currentRecentRecords.removeLast() } currentRecentRecords.insert(word, at: 0) } - + Utility.PreferenceManager.recentRecords = currentRecentRecords } - + /// 최근 검색어를 삭제 /// - Parameter word: 최근 검색어 func removeRecentRecords(word: String) { var currentRecentRecords = Utility.PreferenceManager.recentRecords ?? [] - if let i = currentRecentRecords.firstIndex(where: { $0 == word }){ + if let i = currentRecentRecords.firstIndex(where: { $0 == word }) { currentRecentRecords.remove(at: i) } - + Utility.PreferenceManager.recentRecords = currentRecentRecords - } - + /// 유저 정보 저장 func setUserInfo( ID: String, platform: String, profile: String, - displayName: String, - firstLoginTime: Int, - first: Bool, - version: Int + name: String, + itemCount: Int ) { let userInfo = UserInfo( - ID: ID, + ID: AES256.encrypt(string: ID), platform: platform, profile: profile, - displayName: displayName, - firstLoginTime: firstLoginTime, - first: first, - version: version + name: AES256.encrypt(string: name), + itemCount: itemCount ) Utility.PreferenceManager.userInfo = userInfo + LogManager.setUserProperty(property: .fruitTotal(count: userInfo.itemCount)) + LogManager.setUserProperty(property: .loginPlatform(platform: userInfo.platform)) + } + + static func clearUserInfo() { + LogManager.setUserID(userID: nil) + Crashlytics.crashlytics().setUserID(nil) + PreferenceManager.userInfo = nil + LogManager.clearUserProperty(property: .fruitTotal(count: -1)) + LogManager.clearUserProperty(property: .loginPlatform(platform: "")) } } diff --git a/Projects/Modules/Utility/Sources/Extensions/Extension+String.swift b/Projects/Modules/Utility/Sources/Extensions/Extension+String.swift index d0b76f55c..992034871 100644 --- a/Projects/Modules/Utility/Sources/Extensions/Extension+String.swift +++ b/Projects/Modules/Utility/Sources/Extensions/Extension+String.swift @@ -10,19 +10,17 @@ import Foundation import UIKit public extension String { - /// 문자열이 스페이스바 또는 공백으로만 이뤄졌는지 체크 - /// - Returns: 완전환 공백 체크 = true - var isWhiteSpace: Bool{ - return self.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines).count == 0 + /// - Returns: 완전환 공백 체크 = true + var isWhiteSpace: Bool { + return self.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines).isEmpty } - + /// String(text) 높이 값을 계산하여 반환합니다. /// - Parameter width: 스트링이 들어갈 최대 너비 /// - Parameter font: 사용 된 폰트 값 /// - Returns: String 높이 값 func heightConstraintAt(width: CGFloat, font: UIFont) -> CGFloat { - // greatestFiniteMagnitude: CGFloat 타입이 가질 수 있는 최대 유한 값 // boundingRect 함수의 파람으로 넘겨줄 CGSize 생성 시에 일단 최대로 잡아둡니다. // 여기서는 '높이'를 구할 것이기 때문에 String이 들어갈 최대 너비 값이 몇이냐가 중요합니다. @@ -31,27 +29,39 @@ public extension String { // boundingRect: 사각형 내부에서 옵션들과 표시 특성등을 활용하여 사각형을 계산하고 반환합니다. // https://onemoonstudio.tistory.com/2 - let boundingBox = self.boundingRect(with: constraintRect, - options: NSStringDrawingOptions.usesLineFragmentOrigin, - attributes: [NSAttributedString.Key.font: font], context: nil) + let boundingBox = self.boundingRect( + with: constraintRect, + options: NSStringDrawingOptions.usesLineFragmentOrigin, + attributes: [NSAttributedString.Key.font: font], + context: nil + ) return boundingBox.height } - + /// String(text)의 첫 글자만 대문자로 변환합니다. var capitalizingFirstLetter: String { // 첫 글자는 대문자로 + 대문자로 변환한 첫 글자는 잘라낸 후 더한다. return prefix(1).uppercased() + self.dropFirst() } - - + var correctionNickName: String { let limit: Int = 8 return self.count > limit ? String(self.prefix(limit)) + "..." : self } - + func createRandomStr(length: Int) -> String { - let str = (0 ..< length).map{ _ in self.randomElement()! } + let str = (0 ..< length).map { _ in self.randomElement()! } return String(str) } + + func toDateCustomFormat(format: String) -> Date { + let formatter = DateFormatter() + formatter.dateFormat = format + return formatter.date(from: self) ?? .init() + } + + var isContainShortsTagTitle: Bool { + return self.lowercased().contains("#Shorts".lowercased()) + } } diff --git a/Projects/Modules/Utility/Sources/Extensions/Extension+UIActivityIndicatorView.swift b/Projects/Modules/Utility/Sources/Extensions/Extension+UIActivityIndicatorView.swift index 90b262121..de1778efa 100644 --- a/Projects/Modules/Utility/Sources/Extensions/Extension+UIActivityIndicatorView.swift +++ b/Projects/Modules/Utility/Sources/Extensions/Extension+UIActivityIndicatorView.swift @@ -9,8 +9,8 @@ import Foundation import UIKit -extension UIActivityIndicatorView { - public func stopOnMainThread() { +public extension UIActivityIndicatorView { + func stopOnMainThread() { DispatchQueue.main.async { self.stopAnimating() } diff --git a/Projects/Modules/Utility/Sources/Extensions/Extension+UIApplication.swift b/Projects/Modules/Utility/Sources/Extensions/Extension+UIApplication.swift new file mode 100644 index 000000000..7916e22fa --- /dev/null +++ b/Projects/Modules/Utility/Sources/Extensions/Extension+UIApplication.swift @@ -0,0 +1,27 @@ +import UIKit + +public extension UIApplication { + static func topVisibleViewController( + base: UIViewController? = UIApplication.keyRootViewController + ) -> UIViewController? { + if let nav = base as? UINavigationController { + return topVisibleViewController(base: nav.visibleViewController) + } + if let tab = base as? UITabBarController, let selected = tab.selectedViewController { + return topVisibleViewController(base: selected) + } + if let presented = base?.presentedViewController { + return topVisibleViewController(base: presented) + } + return base + } + + static var keyRootViewController: UIViewController? { + UIApplication.shared.connectedScenes + .compactMap { $0 as? UIWindowScene } + .filter { $0.activationState == .foregroundActive } + .first? + .keyWindow? + .rootViewController + } +} diff --git a/Projects/Modules/Utility/Sources/Extensions/Extension+UIButton.swift b/Projects/Modules/Utility/Sources/Extensions/Extension+UIButton.swift index b3b1c538e..264d50eea 100644 --- a/Projects/Modules/Utility/Sources/Extensions/Extension+UIButton.swift +++ b/Projects/Modules/Utility/Sources/Extensions/Extension+UIButton.swift @@ -1,14 +1,6 @@ -// -// Extension+UIButton.swift -// Utility -// -// Created by yongbeomkwak on 2023/01/21. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - +import Combine import Foundation import UIKit -import Combine public extension UIButton { var tapPublisher: AnyPublisher { @@ -16,19 +8,19 @@ public extension UIButton { .map { _ in } .eraseToAnyPublisher() } - + func setBackgroundColor(_ color: UIColor, for state: UIControl.State) { UIGraphicsBeginImageContext(CGSize(width: 1.0, height: 1.0)) guard let context = UIGraphicsGetCurrentContext() else { return } context.setFillColor(color.cgColor) context.fill(CGRect(x: 0.0, y: 0.0, width: 1.0, height: 1.0)) - + let backgroundImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() - + self.setBackgroundImage(backgroundImage, for: state) } - + func alignTextBelow(spacing: CGFloat) { guard let image = self.imageView?.image else { return @@ -49,4 +41,13 @@ public extension UIButton { titleEdgeInsets = UIEdgeInsets(top: spacing, left: -image.size.width, bottom: -image.size.height, right: 0) imageEdgeInsets = UIEdgeInsets(top: -(titleSize.height + spacing), left: 0, bottom: 0, right: -titleSize.width) } + + func addAction(for event: UIControl.Event = .primaryActionTriggered, _ action: @escaping () -> Void) { + self.addAction( + UIAction { _ in + action() + }, + for: event + ) + } } diff --git a/Projects/Modules/Utility/Sources/Extensions/Extension+UICollectionView.swift b/Projects/Modules/Utility/Sources/Extensions/Extension+UICollectionView.swift new file mode 100644 index 000000000..437cae996 --- /dev/null +++ b/Projects/Modules/Utility/Sources/Extensions/Extension+UICollectionView.swift @@ -0,0 +1,26 @@ +import SnapKit +import UIKit + +public extension UICollectionView { + func setBackgroundView(_ view: UIView, _ topOffset: CGFloat = .zero) { + let superView = UIView(frame: CGRect(x: .zero, y: .zero, width: APP_WIDTH(), height: APP_HEIGHT())) + + superView.addSubview(view) + + view.snp.makeConstraints { + $0.top.equalToSuperview().offset(topOffset) + $0.horizontalEdges.equalToSuperview() + } + + self.backgroundView = superView + } + + func restore() { + self.backgroundView = nil + } + + var isVerticallyScrollable: Bool { + // 콘텐츠 크기가 컬렉션 뷰의 크기보다 큰지 비교 + return contentSize.height > bounds.height + } +} diff --git a/Projects/Modules/Utility/Sources/Extensions/Extension+UIColor.swift b/Projects/Modules/Utility/Sources/Extensions/Extension+UIColor.swift index 164d46701..95335ca89 100644 --- a/Projects/Modules/Utility/Sources/Extensions/Extension+UIColor.swift +++ b/Projects/Modules/Utility/Sources/Extensions/Extension+UIColor.swift @@ -19,5 +19,34 @@ public extension UIColor { ) } } - + + static func random() -> UIColor { + return UIColor( + red: CGFloat(Float.random(in: 0 ..< 1)), + green: CGFloat(Float.random(in: 0 ..< 1)), + blue: CGFloat(Float.random(in: 0 ..< 1)), + alpha: 1.0 + ) + } + + /// - Parameter hex: "#FF00EE" + convenience init(hex: String, alpha: CGFloat = 1.0) { + var hexFormatted: String = hex.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines).uppercased() + + if hexFormatted.hasPrefix("#") { + hexFormatted = String(hexFormatted.dropFirst()) + } + + assert(hexFormatted.count == 6, "Invalid hex code used.") + + var rgbValue: UInt64 = 0 + Scanner(string: hexFormatted).scanHexInt64(&rgbValue) + + self.init( + red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0, + green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0, + blue: CGFloat(rgbValue & 0x0000FF) / 255.0, + alpha: alpha + ) + } } diff --git a/Projects/Modules/Utility/Sources/Extensions/Extension+UIControl.swift b/Projects/Modules/Utility/Sources/Extensions/Extension+UIControl.swift index 75f263084..2e4411da6 100644 --- a/Projects/Modules/Utility/Sources/Extensions/Extension+UIControl.swift +++ b/Projects/Modules/Utility/Sources/Extensions/Extension+UIControl.swift @@ -6,51 +6,51 @@ // Copyright © 2023 yongbeomkwak. All rights reserved. // +import Combine import Foundation import UIKit -import Combine extension UIControl { func controlPublisher(for event: UIControl.Event) -> UIControl.EventPublisher { return UIControl.EventPublisher(control: self, event: event) } - - // Publisher + + /// Publisher struct EventPublisher: Publisher { typealias Output = UIControl typealias Failure = Never - + let control: UIControl let event: UIControl.Event - - func receive(subscriber: S) where S : Subscriber, Never == S.Failure, UIControl == S.Input { + + func receive(subscriber: S) where S: Subscriber, Never == S.Failure, UIControl == S.Input { let subscription = EventSubscription(control: control, subscrier: subscriber, event: event) subscriber.receive(subscription: subscription) } } - - // Subscription - fileprivate class EventSubscription: Subscription where EventSubscriber.Input == UIControl, EventSubscriber.Failure == Never { - + + /// Subscription + fileprivate class EventSubscription: Subscription + where EventSubscriber.Input == UIControl, EventSubscriber.Failure == Never { let control: UIControl let event: UIControl.Event var subscriber: EventSubscriber? - + init(control: UIControl, subscrier: EventSubscriber, event: UIControl.Event) { self.control = control self.subscriber = subscrier self.event = event - + control.addTarget(self, action: #selector(eventDidOccur), for: event) } - + func request(_ demand: Subscribers.Demand) {} - + func cancel() { subscriber = nil control.removeTarget(self, action: #selector(eventDidOccur), for: event) } - + @objc func eventDidOccur() { _ = subscriber?.receive(control) } diff --git a/Projects/Modules/Utility/Sources/Extensions/Extension+UIImage.swift b/Projects/Modules/Utility/Sources/Extensions/Extension+UIImage.swift index fade1053a..e48649368 100644 --- a/Projects/Modules/Utility/Sources/Extensions/Extension+UIImage.swift +++ b/Projects/Modules/Utility/Sources/Extensions/Extension+UIImage.swift @@ -1,45 +1,66 @@ -// -// Extension+UIImage.swift -// Utility -// -// Created by KTH on 2023/01/02. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - import Foundation import UIKit public extension UIImage { + func customizeForPlaylistCover(targetSize: CGSize) -> UIImage? { + let imageWidth = self.size.width + let imageHeight = self.size.height + + guard imageWidth != imageHeight else { + guard imageWidth > targetSize.width else { + return self + } + return performResize(targetSize: targetSize) + } + + guard let cropImage = performSquareCrop() else { + return nil + } + + guard cropImage.size.width > targetSize.width else { + return cropImage + } + + return cropImage.performResize(targetSize: targetSize) + } + + func performSquareCrop() -> UIImage? { + let imageWidth = self.size.width + let imageHeight = self.size.height + + guard imageWidth != imageHeight else { + return self + } - /// 메인 탭바의 상단에 들어갈 라인을 이미지로 그리고 반환합니다. - /// - Parameter color: 컬러 값 - /// - Returns: 라인 이미지 - static func tabBarTopLine(color: UIColor) -> UIImage { - let rect = CGRect(x: 0.0, y: 0.0, width: APP_WIDTH(), height: 1.0) + let minLength = min(imageWidth, imageHeight) + let cropSize = CGSize(width: minLength, height: minLength) - // 화면에 바로 나타나지 않는 offscreen 이미지를 생성하고 싶을 때는 반드시 bitmap image context를 생성해야 한다. - // https://soulpark.wordpress.com/tag/uigraphicsbeginimagecontext + let x = (imageWidth - cropSize.width) / 2 + let y = (imageHeight - cropSize.height) / 2 + let cropRect = CGRect(x: x, y: y, width: cropSize.width, height: cropSize.height) - // 그림을 그리기 위한 콘텍스트 생성 - UIGraphicsBeginImageContext(rect.size) + guard let cropCgImage = self.cgImage?.cropping(to: cropRect) else { + return nil + } + + return UIImage(cgImage: cropCgImage) + } - // context: 코어 이미지의 모든 과정은 CIContext내에서 수행합니다. - // 렌더링 과정과 렌더링에 필요한 리소스를 더 정밀하게 컨트롤 할수 있게 해주는 객체 - // 생성된 콘텍스트 정보 획득 - guard let context = UIGraphicsGetCurrentContext() else { return Self() } + func performResize(targetSize: CGSize) -> UIImage? { + let rect = CGRect(origin: .zero, size: targetSize) - // 채우기 색상 설정 - context.setFillColor(color.cgColor) + guard let cgImage = self.cgImage else { return nil } + let image = UIImage(cgImage: cgImage, scale: 0, orientation: self.imageOrientation) - // 사각형 채우기 - context.fill(rect) + let foramt = UIGraphicsImageRendererFormat.default() + foramt.scale = 1.0 - // 현재 콘텍스트에 그려진 이미지를 가져옵니다. - guard let image = UIGraphicsGetImageFromCurrentImageContext() else { return Self() } + let render = UIGraphicsImageRenderer(size: targetSize, format: foramt) - // 그림 그리기 종료 - UIGraphicsEndImageContext() + let newImage = render.image { _ in + image.draw(in: rect) + } - return image + return newImage } } diff --git a/Projects/Modules/Utility/Sources/Extensions/Extension+UIPanGestureRecognizer.swift b/Projects/Modules/Utility/Sources/Extensions/Extension+UIPanGestureRecognizer.swift index 0139d94a8..0c8b8a821 100644 --- a/Projects/Modules/Utility/Sources/Extensions/Extension+UIPanGestureRecognizer.swift +++ b/Projects/Modules/Utility/Sources/Extensions/Extension+UIPanGestureRecognizer.swift @@ -10,7 +10,6 @@ import Foundation import UIKit public extension UIPanGestureRecognizer { - struct PanGestureDirection: OptionSet { public let rawValue: UInt8 @@ -24,9 +23,11 @@ public extension UIPanGestureRecognizer { public static let Right = PanGestureDirection(rawValue: 1 << 3) } - private func getDirectionBy(velocity: CGFloat, - greater: PanGestureDirection, - lower: PanGestureDirection) -> PanGestureDirection { + private func getDirectionBy( + velocity: CGFloat, + greater: PanGestureDirection, + lower: PanGestureDirection + ) -> PanGestureDirection { if velocity == 0 { return [] } @@ -39,12 +40,16 @@ public extension UIPanGestureRecognizer { /// - Returns: PanGestureDirection func direction(in view: UIView) -> PanGestureDirection { let velocity = self.velocity(in: view) - let yDirection = getDirectionBy(velocity: velocity.y, - greater: PanGestureDirection.Down, - lower: PanGestureDirection.Up) - let xDirection = getDirectionBy(velocity: velocity.x, - greater: PanGestureDirection.Right, - lower: PanGestureDirection.Left) + let yDirection = getDirectionBy( + velocity: velocity.y, + greater: PanGestureDirection.Down, + lower: PanGestureDirection.Up + ) + let xDirection = getDirectionBy( + velocity: velocity.x, + greater: PanGestureDirection.Right, + lower: PanGestureDirection.Left + ) return xDirection.union(yDirection) } } diff --git a/Projects/Modules/Utility/Sources/Extensions/Extension+UIScrollView.swift b/Projects/Modules/Utility/Sources/Extensions/Extension+UIScrollView.swift index 4e7cc936a..8a90051f4 100644 --- a/Projects/Modules/Utility/Sources/Extensions/Extension+UIScrollView.swift +++ b/Projects/Modules/Utility/Sources/Extensions/Extension+UIScrollView.swift @@ -16,38 +16,36 @@ public enum ScrollDirection { } public extension UIScrollView { - func scrollToView(view: UIView) { if let origin = view.superview { - let childStartPoint = origin.convert(view.frame.origin, to: self) let bottomOffset = scrollBottomOffset() - if (childStartPoint.y > bottomOffset.y) { + if childStartPoint.y > bottomOffset.y { setContentOffset(bottomOffset, animated: true) - }else { + } else { setContentOffset(CGPoint(x: 0, y: childStartPoint.y), animated: true) } } } - + // func scrollToTop() { // let topOffset = CGPoint(x: 0, y: -contentInset.top) // setContentOffset(topOffset, animated: true) // } -// +// // func scrollToBottom() { // let bottomOffset = scrollBottomOffset() // if(bottomOffset.y > 0) { // setContentOffset(bottomOffset, animated: true) // } // } - + private func scrollBottomOffset() -> CGPoint { return CGPoint(x: 0, y: contentSize.height - bounds.size.height + contentInset.bottom) } - + func scroll(to direction: ScrollDirection) { DispatchQueue.main.async { switch direction { @@ -72,7 +70,7 @@ public extension UIScrollView { private func scrollToBottom() { let bottomOffset = CGPoint(x: 0, y: contentSize.height - bounds.size.height + contentInset.bottom) - if(bottomOffset.y > 0) { + if bottomOffset.y > 0 { setContentOffset(bottomOffset, animated: true) } } diff --git a/Projects/Modules/Utility/Sources/Extensions/Extension+UIStackView.swift b/Projects/Modules/Utility/Sources/Extensions/Extension+UIStackView.swift new file mode 100644 index 000000000..b6b52debe --- /dev/null +++ b/Projects/Modules/Utility/Sources/Extensions/Extension+UIStackView.swift @@ -0,0 +1,7 @@ +import UIKit + +public extension UIStackView { + func addArrangedSubviews(_ views: UIView...) { + views.forEach(self.addArrangedSubview(_:)) + } +} diff --git a/Projects/Modules/Utility/Sources/Extensions/Extension+UITableView.swift b/Projects/Modules/Utility/Sources/Extensions/Extension+UITableView.swift new file mode 100644 index 000000000..5f5d23348 --- /dev/null +++ b/Projects/Modules/Utility/Sources/Extensions/Extension+UITableView.swift @@ -0,0 +1,21 @@ +import SnapKit +import UIKit + +public extension UITableView { + func setBackgroundView(_ view: UIView, _ topOffset: CGFloat = .zero) { + let superView = UIView() + + superView.addSubview(view) + + view.snp.makeConstraints { + $0.top.equalToSuperview().offset(topOffset) + $0.horizontalEdges.equalToSuperview() + } + + self.backgroundView = superView + } + + func restore() { + self.backgroundView = nil + } +} diff --git a/Projects/Modules/Utility/Sources/Extensions/Extension+UITapGesutreRecognizer.swift b/Projects/Modules/Utility/Sources/Extensions/Extension+UITapGesutreRecognizer.swift index 223745fe6..ebf4b6cee 100644 --- a/Projects/Modules/Utility/Sources/Extensions/Extension+UITapGesutreRecognizer.swift +++ b/Projects/Modules/Utility/Sources/Extensions/Extension+UITapGesutreRecognizer.swift @@ -6,25 +6,25 @@ // Copyright © 2023 yongbeomkwak. All rights reserved. // +import Combine import Foundation import UIKit -import Combine /// UIControl 을 상속받지 않는 UIView 등의 이벤트를 Combine 으로 처리하기 위한 Publisher 입니다. public extension UITapGestureRecognizer { struct GesturePublisher: Publisher { public typealias Output = TapRecognizer public typealias Failure = Never - + private let recognizer: TapRecognizer private let view: UIView - + init(recognizer: TapRecognizer, view: UIView) { self.recognizer = recognizer self.view = view } - - public func receive(subscriber: S) where S : Subscriber, Never == S.Failure, TapRecognizer == S.Input { + + public func receive(subscriber: S) where S: Subscriber, Never == S.Failure, TapRecognizer == S.Input { let subscription = GestureSubscription( subscriber: subscriber, recognizer: recognizer, @@ -32,29 +32,28 @@ public extension UITapGestureRecognizer { ) subscriber.receive(subscription: subscription) } - } - - final class GestureSubscription: Subscription where S.Input == TapRecognizer { + + final class GestureSubscription: Subscription + where S.Input == TapRecognizer { private var subscriber: S? private let recognizer: TapRecognizer - + init(subscriber: S, recognizer: TapRecognizer, view: UIView) { self.subscriber = subscriber self.recognizer = recognizer recognizer.addTarget(self, action: #selector(eventHandler)) view.addGestureRecognizer(recognizer) } - + public func request(_ demand: Subscribers.Demand) {} - + public func cancel() { subscriber = nil } - + @objc func eventHandler() { _ = subscriber?.receive(recognizer) } - } } diff --git a/Projects/Modules/Utility/Sources/Extensions/Extension+UIView.swift b/Projects/Modules/Utility/Sources/Extensions/Extension+UIView.swift index fdc606c6f..cc153cec1 100644 --- a/Projects/Modules/Utility/Sources/Extensions/Extension+UIView.swift +++ b/Projects/Modules/Utility/Sources/Extensions/Extension+UIView.swift @@ -6,26 +6,31 @@ // Copyright © 2023 yongbeomkwak. All rights reserved. // +import Combine import Foundation -import UIKit import SwiftEntryKit -import Combine +import UIKit public extension UIView { - + enum StartDirection: CGFloat { + case up = -1 + case down = 1 + case random + } + enum VerticalLocation { case bottom case top case left case right } - + func tapPublisher() -> AnyPublisher { return UITapGestureRecognizer.GesturePublisher(recognizer: .init(), view: self) .map { _ in } .eraseToAnyPublisher() } - + /// 1초 이내 첫 이벤트를 제외한 나머지 이벤트는 무시하는 Publisher 입니다. func throttleTapPublisher() -> AnyPublisher { return UITapGestureRecognizer.GesturePublisher(recognizer: .init(), view: self) @@ -37,7 +42,7 @@ public extension UIView { .map { _ in } .eraseToAnyPublisher() } - + func addShadow(location: VerticalLocation, color: UIColor = .black, opacity: Float = 0.8, radius: CGFloat = 5.0) { switch location { case .bottom: @@ -50,22 +55,20 @@ public extension UIView { addShadow(offset: CGSize(width: 10, height: 0), color: color, opacity: opacity, radius: radius) } } - + func addShadow(offset: CGSize, color: UIColor = .black, opacity: Float = 0.1, radius: CGFloat = 3.0) { - - /// 테두리 밖으로 contents가 있을 때, 마스킹(true)하여 표출안되게 할것인지 마스킹을 off(false emptyView.layer.masksToBounds = false - /// shadow 색상 - /// 현재 shadow는 view의 layer 테두리와 동일한 위치로 있는 상태이므로 offset을 통해 그림자를 이동시켜야 표출 - /// shadow의 투명도 (0 ~ 1) - /// shadow의 corner radius + // 테두리 밖으로 contents가 있을 때, 마스킹(true)하여 표출안되게 할것인지 마스킹을 off(false emptyView.layer.masksToBounds = false + // shadow 색상 + // 현재 shadow는 view의 layer 테두리와 동일한 위치로 있는 상태이므로 offset을 통해 그림자를 이동시켜야 표출 + // shadow의 투명도 (0 ~ 1) + // shadow의 corner radius self.layer.masksToBounds = false self.layer.shadowColor = color.cgColor self.layer.shadowOffset = offset self.layer.shadowOpacity = opacity self.layer.shadowRadius = radius } - - + func animateSizeDownToUp(timeInterval: TimeInterval) { let propertyAnimator = UIViewPropertyAnimator(duration: timeInterval, dampingRatio: 0.5) { self.transform = CGAffineTransform.identity.scaledBy(x: 0.9, y: 0.9) @@ -73,13 +76,13 @@ public extension UIView { propertyAnimator.addAnimations({ self.transform = .identity }, delayFactor: CGFloat(timeInterval)) propertyAnimator.startAnimation() } - + func showToast(text: String, font: UIFont) { var attributes = EKAttributes.bottomFloat attributes.displayDuration = 2 attributes.entryBackground = .color(color: EKColor(rgb: 0x101828).with(alpha: 0.8)) attributes.roundCorners = .all(radius: 20) - + let style = EKProperty.LabelStyle( font: .systemFont(ofSize: 14, weight: .light), color: EKColor(rgb: 0xFCFCFD), @@ -89,14 +92,13 @@ public extension UIView { text: text, style: style ) - + let contentView = EKNoteMessageView(with: labelContent) contentView.verticalOffset = 10 SwiftEntryKit.display(entry: contentView, using: attributes) } - + func parentViewController() -> UIViewController? { - var parentResponder: UIResponder? = self while true { guard let nextResponder = parentResponder?.next else { return nil } @@ -106,4 +108,62 @@ public extension UIView { parentResponder = nextResponder } } + + func addSubviews(_ views: UIView...) { + views.forEach(self.addSubview(_:)) + } + + var asImage: UIImage { + let renderer = UIGraphicsImageRenderer(bounds: bounds) + return renderer.image { rendererContext in + layer.render(in: rendererContext.cgContext) + } + } + + func asImage(size: CGSize? = nil) -> UIImage { + let originalSize = bounds.size + let targetSize = size ?? originalSize + let rendererFormat = UIGraphicsImageRendererFormat.default() + rendererFormat.scale = 1.0 + + let renderer = UIGraphicsImageRenderer(size: targetSize, format: rendererFormat) + return renderer.image { rendererContext in + let scaleX = targetSize.width / originalSize.width + let scaleY = targetSize.height / originalSize.height + rendererContext.cgContext.scaleBy(x: scaleX, y: scaleY) + layer.render(in: rendererContext.cgContext) + } + } + + func rotate(_ toValue: CGFloat, duration: CFTimeInterval = 0.2) { + let animation = CABasicAnimation(keyPath: "transform.rotation") + animation.toValue = toValue + animation.duration = duration + animation.isRemovedOnCompletion = false + animation.fillMode = CAMediaTimingFillMode.forwards + layer.add(animation, forKey: nil) + } + + func moveAnimate( + duration: CGFloat, + amount: CGFloat, + direction: StartDirection + ) { + let directionValue = (direction == .random) ? ((Array(0 ... 1).randomElement() ?? 0) == 0 ? 1 : -1) : direction + .rawValue + UIView.animate( + withDuration: duration, + delay: 0, + options: [.autoreverse, .repeat], + animations: { + self.transform = CGAffineTransform(translationX: 0, y: amount * directionValue) + }, + completion: nil + ) + } + + func removeAllAnimations() { + self.layer.removeAllAnimations() + self.transform = .identity + } } diff --git a/Projects/Modules/Utility/Sources/Extensions/Extension+UIViewController.swift b/Projects/Modules/Utility/Sources/Extensions/Extension+UIViewController.swift index c60a10ba2..2675f41f2 100644 --- a/Projects/Modules/Utility/Sources/Extensions/Extension+UIViewController.swift +++ b/Projects/Modules/Utility/Sources/Extensions/Extension+UIViewController.swift @@ -6,14 +6,13 @@ // Copyright © 2023 yongbeomkwak. All rights reserved. // +import FittedSheets import Foundation -import UIKit -import SwiftUI -import PanModal import SwiftEntryKit +import SwiftUI +import UIKit public extension UIViewController { - /// 뷰 컨트롤러로부터 네비게이션 컨트롤러를 입혀 반환합니다. /// 화면 이동을 위해서 필요합니다. /// https://etst.tistory.com/84 @@ -21,79 +20,65 @@ public extension UIViewController { var wrapNavigationController: UINavigationController { return UINavigationController(rootViewController: self) } - - #if DEBUG - private struct Preview: UIViewControllerRepresentable { - let viewController: UIViewController - - func makeUIViewController(context: Context) -> UIViewController { - return viewController + + #if DEBUG || QA + private struct Preview: UIViewControllerRepresentable { + let viewController: UIViewController + + func makeUIViewController(context: Context) -> UIViewController { + return viewController + } + + func updateUIViewController(_ uiViewController: UIViewController, context: Context) {} } - - func updateUIViewController(_ uiViewController: UIViewController, context: Context) { + + func toPreview() -> some View { + Preview(viewController: self) } - } - - func toPreview() -> some View { - Preview(viewController: self) - } #endif - - func showPanModal(content: UIViewController & PanModalPresentable) { - let viewController: PanModalPresentable.LayoutType = content - self.presentPanModal(viewController) - } - - func showEntryKitModal(content: UIViewController, height: CGFloat) { - var attributes: EKAttributes - attributes = .bottomFloat - attributes.displayDuration = .infinity - attributes.screenBackground = .color(color: EKColor(rgb: 0x000000).with(alpha: 0.4)) - attributes.entryBackground = .color(color: EKColor(rgb: 0xffffff)) - attributes.screenInteraction = .dismiss - attributes.entryInteraction = .absorbTouches - attributes.positionConstraints.verticalOffset = 0 - attributes.positionConstraints.safeArea = .empty(fillSafeArea: true) - attributes.roundCorners = .top(radius: 24) - attributes.positionConstraints.keyboardRelation = .bind(offset: .none) - attributes.entranceAnimation = .init( - translate: .init( - duration: 0.4, - spring: .init(damping: 0.8, initialVelocity: 0) - ) - ) - attributes.exitAnimation = .init( - translate: .init( - duration: 0.4, - spring: .init(damping: 0.8, initialVelocity: 0) - ) - ) - attributes.positionConstraints.size = .init( - width: .offset(value: 0), - height: .constant(value: height) - ) - attributes.positionConstraints.maxSize = .init( - width: .offset(value: 0), - height: .constant(value: height) + + /// showBottomSheet(): PanModal의 대체 + /// - Parameter content: ViewController + /// - Parameter size: 내부 컨텐츠로 사이즈 결정이 가능하면 .intrinsic, 고정시켜야 하는 경우: .fixed(200), (default: .intrinsic) + /// - Parameter dismissOnOverlayTapAndPull: 오버레이 영역 터치하거나 당겨서 닫기 허용여부 (default: true) + /// - 버튼을 눌러서 다음 행동을 해야하는 경우 dismissOnOverlayTapAndPull 옵션을 필수로 false 설정할 것. (ex: 강제업데이트 팝업) + func showBottomSheet( + content: UIViewController, + size: BottomSheetSize = .intrinsic, + dismissOnOverlayTapAndPull: Bool = true + ) { + showFittedSheets( + content: content, + size: size, + dismissOnOverlayTapAndPull: dismissOnOverlayTapAndPull ) - - HapticManager.shared.impact(style: .light) - SwiftEntryKit.display(entry: content, using: attributes) } - - func showToast(text: String, font: UIFont, verticalOffset: CGFloat? = nil) { + + func showToast( + text: String, + font: UIFont = UIFont(name: "Pretendard-Light", size: 14) ?? + .systemFont(ofSize: 14, weight: .light), + options: WMToastOptions = [.empty], + backgroundThema: EKAttributes.DisplayMode = .dark + ) { var attributes = EKAttributes.bottomFloat attributes.displayDuration = 2 - attributes.entryBackground = .color(color: EKColor(rgb: 0x101828).with(alpha: 0.8)) + attributes.entryBackground = backgroundThema == .dark ? + .color(color: EKColor(rgb: 0x101828).with(alpha: 0.8)) : + .color(color: EKColor(rgb: 0xF2F4F7).with(alpha: 0.8)) attributes.roundCorners = .all(radius: 20) - - if let verticalOffset = verticalOffset { - attributes.positionConstraints.verticalOffset = verticalOffset - } + attributes.entranceAnimation = EKAttributes.Animation.init( + translate: .init(duration: 0.3), + fade: .init(from: 0, to: 1, duration: 0.3) + ) + attributes.exitAnimation = EKAttributes.Animation.init( + fade: .init(from: 1, to: 0, duration: 0.3) + ) + attributes.positionConstraints.verticalOffset = options.offset let style = EKProperty.LabelStyle( font: font, - color: EKColor(rgb: 0xFCFCFD), + color: backgroundThema == .dark ? EKColor(rgb: 0xFCFCFD) : EKColor(rgb: 0x191A1C), alignment: .center ) let labelContent = EKProperty.LabelContent( @@ -105,9 +90,8 @@ public extension UIViewController { contentView.verticalOffset = 10 SwiftEntryKit.display(entry: contentView, using: attributes) } - - func hideKeyboardWhenTappedAround() { + func hideKeyboardWhenTappedAround() { let tap = UITapGestureRecognizer(target: self, action: #selector(UIViewController.dismissKeyboard)) tap.cancelsTouchesInView = false view.addGestureRecognizer(tap) @@ -116,26 +100,105 @@ public extension UIViewController { @objc func dismissKeyboard() { view.endEditing(true) } - - - static func rootViewController() -> UIViewController? { - var root: UIViewController? - if let rootViewController = UIApplication.shared.windows.first?.rootViewController { - if rootViewController is UINavigationController { - root = (rootViewController as! UINavigationController).visibleViewController! - }else{ - if let presentedViewController = rootViewController.presentedViewController { - root = presentedViewController - } - } - } - return root - } - + func goAppStore() { let appID: String = WM_APP_ID() guard let storeURL = URL(string: "https://itunes.apple.com/kr/app/id/\(appID)"), - UIApplication.shared.canOpenURL(storeURL) else { return } + UIApplication.shared.canOpenURL(storeURL) else { return } UIApplication.shared.open(storeURL) } } + +private extension UIViewController { + func showFittedSheets( + content: UIViewController, + size: BottomSheetSize, + dismissOnOverlayTapAndPull: Bool + ) { + var toSize: SheetSize = .intrinsic + switch size { + case .intrinsic: + toSize = SheetSize.intrinsic + case let .fixed(value): + toSize = SheetSize.fixed(value) + } + + let options = SheetOptions( + // The full height of the pull bar. + // The presented view controller will treat this area as a safearea inset on the top + pullBarHeight: 0, + + // The corner radius of the shrunken presenting view controller + presentingViewCornerRadius: 24, + + // Extends the background behind the pull bar or not + shouldExtendBackground: true, + + // Attempts to use intrinsic heights on navigation controllers. + // This does not work well in combination with keyboards without your code handling it. + setIntrinsicHeightOnNavigationControllers: true, + + // Pulls the view controller behind the safe area top, + // especially useful when embedding navigation controllers + useFullScreenMode: true, + + // Shrinks the presenting view controller, similar to the native modal + shrinkPresentingViewController: false, + + // Determines if using inline mode or not + useInlineMode: false, + + // Adds a padding on the left and right of the sheet with this amount. Defaults to zero (no padding) + horizontalPadding: 0, + + // Sets the maximum width allowed for the sheet. This defaults to nil and doesn't limit the width. + maxWidth: nil + ) + + let sheetController = SheetViewController( + controller: content, + sizes: [toSize], + options: options + ) + + // The size of the grip in the pull bar + sheetController.gripSize = .zero + + // The color of the grip on the pull bar + sheetController.gripColor = UIColor.clear + + // The corner radius of the sheet + sheetController.cornerRadius = 24 + + // minimum distance above the pull bar, prevents bar from coming right up to the edge of the screen + sheetController.minimumSpaceAbovePullBar = 0 + + // Set the pullbar's background explicitly + sheetController.pullBarBackgroundColor = UIColor.clear + + // Determine if the rounding should happen on the pullbar or the presented controller only + // (should only be true when the pull bar's background color is .clear) + sheetController.treatPullBarAsClear = false + + // Disable the dismiss on background tap functionality + sheetController.dismissOnOverlayTap = dismissOnOverlayTapAndPull + + // Disable the ability to pull down to dismiss the modal + sheetController.dismissOnPull = dismissOnOverlayTapAndPull + + // Allow pulling past the maximum height and bounce back. Defaults to true. + sheetController.allowPullingPastMaxHeight = false + + // Automatically grow/move the sheet to accomidate the keyboard. Defaults to true. + sheetController.autoAdjustToKeyboard = true + + // Color of the sheet anywhere the child view controller may not show (or is transparent), + // such as behind the keyboard currently + sheetController.contentBackgroundColor = UIColor.clear + + // Change the overlay color + sheetController.overlayColor = UIColor.black.withAlphaComponent(0.4) + + self.present(sheetController, animated: true, completion: nil) + } +} diff --git a/Projects/Modules/Utility/Sources/Extensions/Extension+URL.swift b/Projects/Modules/Utility/Sources/Extensions/Extension+URL.swift new file mode 100644 index 000000000..16c089435 --- /dev/null +++ b/Projects/Modules/Utility/Sources/Extensions/Extension+URL.swift @@ -0,0 +1,18 @@ +import Foundation + +public extension URL { + func parseToParams() -> [String: Any] { + var dict: [String: Any] = [:] + + guard let components = URLComponents(url: self, resolvingAgainstBaseURL: false), + let queryItems = components.queryItems else { + return [:] + } + + for item in queryItems { + dict[item.name] = item.value + } + + return dict + } +} diff --git a/Projects/Modules/Utility/Sources/GoogleOAuth/CodeChallenge.swift b/Projects/Modules/Utility/Sources/GoogleOAuth/CodeChallenge.swift index 544b802e0..0633a9fd8 100644 --- a/Projects/Modules/Utility/Sources/GoogleOAuth/CodeChallenge.swift +++ b/Projects/Modules/Utility/Sources/GoogleOAuth/CodeChallenge.swift @@ -6,26 +6,26 @@ // Copyright © 2023 yongbeomkwak. All rights reserved. // -import Foundation import CryptoKit +import Foundation struct PKCE { typealias PKCECode = String let codeVerifier: PKCECode // 임의로 생성한 ASCII 문자 let codeChallenge: PKCECode // 임의로 생성한 codeVerifier Base64URL 인코딩된 SHA256 해시 - + init() throws { codeVerifier = PKCE.generateCodeVerifier() codeChallenge = try PKCE.codeChallenge(fromVerifier: codeVerifier) } - + static func codeChallenge(fromVerifier verifier: PKCECode) throws -> PKCECode { guard let verifierData = verifier.data(using: .ascii) else { throw PKCEError.improperlyFormattedVerifier } - + let challengeHashed = SHA256.hash(data: verifierData) let challengeBase64Encoded = Data(challengeHashed).base64URLEncodedString - + return challengeBase64Encoded } @@ -41,19 +41,19 @@ struct PKCE { private static func generateCryptographicallySecureRandomOctets(count: Int) throws -> [UInt8] { var octets = [UInt8](repeating: 0, count: count) let status = SecRandomCopyBytes(kSecRandomDefault, octets.count, &octets) - + if status == errSecSuccess { return octets } else { throw PKCEError.failedToGenerateRandomOctets } } - + private static func generateBase64RandomString(ofLength length: UInt8) -> PKCECode { let base64 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" - return String((0.. { self.key = key self.defaultValue = defaultValue } - + public var wrappedValue: T? { get { if let savedData = UserDefaults.standard.object(forKey: key) as? Data { @@ -56,7 +67,8 @@ public final class UserDefaultWrapper { if let lodedObejct = try? decoder.decode(T.self, from: savedData) { return lodedObejct } - }else if UserDefaults.standard.array(forKey: key) != nil{ + + } else if UserDefaults.standard.array(forKey: key) != nil { return UserDefaults.standard.array(forKey: key) as? T } return defaultValue @@ -69,7 +81,7 @@ public final class UserDefaultWrapper { subject.onNext(newValue) } } - + private lazy var subject = BehaviorSubject(value: wrappedValue) public var projectedValue: Observable { return subject.asObservable() diff --git a/Projects/Modules/Utility/Sources/Manager/UserInfoManager.swift b/Projects/Modules/Utility/Sources/Manager/UserInfoManager.swift index 5f7269b58..ec3b9a44f 100644 --- a/Projects/Modules/Utility/Sources/Manager/UserInfoManager.swift +++ b/Projects/Modules/Utility/Sources/Manager/UserInfoManager.swift @@ -12,22 +12,50 @@ public struct UserInfo: Codable, Equatable { public let ID: String public let platform: String public let profile: String - public let displayName: String - public let firstLoginTime: Int - public let first: Bool - public let version: Int - + public let name: String + public let itemCount: Int + + public var decryptedID: String { + return AES256.decrypt(encoded: ID) + } + + public var decryptedName: String { + return AES256.decrypt(encoded: name) + } + public static func == (lhs: Self, rhs: Self) -> Bool { return lhs.ID == rhs.ID } } public extension UserInfo { - func update(displayName: String) -> UserInfo { - return UserInfo(ID: self.ID, platform: self.platform, profile: self.profile, displayName: displayName, firstLoginTime: self.firstLoginTime, first: self.first,version: self.version) + func update(name: String) -> UserInfo { + return UserInfo( + ID: self.ID, + platform: self.platform, + profile: self.profile, + name: AES256.encrypt(string: name), + itemCount: self.itemCount + ) } - + func update(profile: String) -> UserInfo { - return UserInfo(ID: self.ID, platform: self.platform, profile: profile, displayName: self.displayName, firstLoginTime: self.firstLoginTime, first: self.first,version:self.version) + return UserInfo( + ID: self.ID, + platform: self.platform, + profile: profile, + name: self.name, + itemCount: self.itemCount + ) + } + + func update(itemCount: Int) -> UserInfo { + return UserInfo( + ID: self.ID, + platform: self.platform, + profile: self.profile, + name: self.name, + itemCount: itemCount + ) } } diff --git a/Projects/Modules/Utility/Sources/Player/WakmusicPlayer.swift b/Projects/Modules/Utility/Sources/Player/WakmusicPlayer.swift new file mode 100644 index 000000000..7963e92a5 --- /dev/null +++ b/Projects/Modules/Utility/Sources/Player/WakmusicPlayer.swift @@ -0,0 +1,3 @@ +public protocol WakmusicPlayer { + func play() +} diff --git a/Projects/Modules/Utility/Sources/Player/WakmusicYoutubePlayer.swift b/Projects/Modules/Utility/Sources/Player/WakmusicYoutubePlayer.swift new file mode 100644 index 000000000..bbe42c8d2 --- /dev/null +++ b/Projects/Modules/Utility/Sources/Player/WakmusicYoutubePlayer.swift @@ -0,0 +1,224 @@ +import Foundation +import LinkPresentation +import UIKit + +public struct WakmusicYoutubePlayer: WakmusicPlayer { + fileprivate enum OpenerPlatform { + case youtube + case youtubeMusic + } + + private enum VideoPlayType { + case videos(ids: [String]) + case playlist(listID: String) + } + + public enum PlayPlatform { + case youtube + case youtubeMusic + case automatic + } + + private let youtubeURLGenerator: any YoutubeURLGeneratable + private let youtubeVideoType: VideoPlayType + private let title: String? + private let openerPlatform: OpenerPlatform + + public init( + id: String, + title: String? = nil, + playPlatform: PlayPlatform = .automatic, + youtubeURLGenerator: any YoutubeURLGeneratable = YoutubeURLGenerator() + ) { + self.youtubeVideoType = .videos(ids: [id]) + self.title = title + self.openerPlatform = playPlatform.toOpenerPlatform + self.youtubeURLGenerator = youtubeURLGenerator + } + + public init( + ids: [String], + title: String? = nil, + playPlatform: PlayPlatform = .automatic, + youtubeURLGenerator: any YoutubeURLGeneratable = YoutubeURLGenerator() + ) { + self.youtubeVideoType = .videos(ids: ids) + self.title = title + self.openerPlatform = playPlatform.toOpenerPlatform + self.youtubeURLGenerator = youtubeURLGenerator + } + + public init( + listID: String, + playPlatform: PlayPlatform = .automatic, + youtubeURLGenerator: any YoutubeURLGeneratable = YoutubeURLGenerator() + ) { + self.youtubeVideoType = .playlist(listID: listID) + self.title = nil + self.openerPlatform = playPlatform.toOpenerPlatform + self.youtubeURLGenerator = youtubeURLGenerator + } + + public func play() { + switch youtubeVideoType { + case let .videos(ids): + playYoutube(ids: ids) + case let .playlist(listID): + playPlaylistYoutube(listID: listID) + } + } +} + +private extension WakmusicYoutubePlayer { + func playYoutube(ids: [String]) { + Task { @MainActor in + guard let url = await urlForYoutube(ids: ids) else { + return + } + if let title, !title.isEmpty, let titledURL = url.appendingTitleParam(title: title) { + await UIApplication.shared.open(titledURL) + } else { + await UIApplication.shared.open(url) + } + } + } + + func playPlaylistYoutube(listID: String) { + guard let url = urlForYoutubePlaylist(listID: listID) else { + return + } + UIApplication.shared.open(url) + } +} + +private extension WakmusicYoutubePlayer { + func urlForYoutube(ids: [String]) async -> URL? { + do { + switch openerPlatform { + case .youtube: + return if let appURL = urlForYoutubeApp(ids: ids) { + appURL + } else if let webURL = urlForYoutubeWeb(ids: ids) { + webURL + } else { + nil + } + + case .youtubeMusic: + return if let appURL = try await urlForYoutubeMusicApp(ids: ids) { + appURL + } else if let webURL = try await urlForYoutubeMusicWeb(ids: ids) { + webURL + } else { + nil + } + } + } catch { + print(error) + return nil + } + } + + func urlForYoutubeApp(ids: [String]) -> URL? { + return openableURL( + youtubeURLGenerator.generateYoutubeVideoAppURL(ids: ids) + ) + } + + func urlForYoutubeWeb(ids: [String]) -> URL? { + return openableURL( + youtubeURLGenerator.generateYoutubeVideoWebURL(ids: ids) + ) + } + + func urlForYoutubeMusicApp(ids: [String]) async throws -> URL? { + if ids.count == 1, let id = ids.first { + return openableURL(youtubeURLGenerator.generateYoutubeMusicVideoAppURL(id: id)) + } else if let redirectedYoutubeURL = try await redirectedYoutubeURL( + youtubeURLGenerator + .generateYoutubeVideoWebURL(ids: ids) + ), + let components = URLComponents(url: redirectedYoutubeURL, resolvingAgainstBaseURL: false), + let listID = components.queryItems?.first(where: { $0.name == "list" })?.value { + return openableURL(youtubeURLGenerator.generateYoutubeMusicPlaylistAppURL(id: listID)) + } + return nil + } + + func urlForYoutubeMusicWeb(ids: [String]) async throws -> URL? { + if ids.count == 1, let id = ids.first { + return openableURL(youtubeURLGenerator.generateYoutubeMusicVideoWebURL(id: id)) + } else if let redirectedYoutubeURL = try await redirectedYoutubeURL( + youtubeURLGenerator + .generateYoutubeVideoWebURL(ids: ids) + ), + let components = URLComponents(url: redirectedYoutubeURL, resolvingAgainstBaseURL: false), + let listID = components.queryItems?.first(where: { $0.name == "list" })?.value { + return openableURL(youtubeURLGenerator.generateYoutubeMusicPlaylistWebURL(id: listID)) + } + return nil + } +} + +private extension WakmusicYoutubePlayer { + func urlForYoutubePlaylist(listID: String) -> URL? { + switch openerPlatform { + case .youtube: + let appURL = openableURL(youtubeURLGenerator.generateYoutubePlaylistAppURL(id: listID)) + let webURL = openableURL(youtubeURLGenerator.generateYoutubePlaylistWebURL(id: listID)) + return appURL ?? webURL + + case .youtubeMusic: + let appURL = openableURL(youtubeURLGenerator.generateYoutubeMusicPlaylistAppURL(id: listID)) + let webURL = openableURL(youtubeURLGenerator.generateYoutubeMusicPlaylistWebURL(id: listID)) + return appURL ?? webURL + } + } +} + +private extension WakmusicYoutubePlayer { + func openableURL(_ urlString: String) -> URL? { + guard let url = URL(string: urlString), UIApplication.shared.canOpenURL(url) else { return nil } + return url + } + + @MainActor + func redirectedYoutubeURL(_ urlString: String) async throws -> URL? { + guard let url = URL(string: urlString) else { return nil } + + let provider = LPMetadataProvider() + let metadata = try await provider.startFetchingMetadata(for: url) + guard let redirectedURL = metadata.url, + UIApplication.shared.canOpenURL(redirectedURL) + else { return nil } + + return redirectedURL + } +} + +private extension URL { + func appendingTitleParam(title: String) -> URL? { + guard var components = URLComponents(url: self, resolvingAgainstBaseURL: false) else { return nil } + components.queryItems?.append(URLQueryItem(name: "title", value: title)) + return components.url + } +} + +private extension WakmusicYoutubePlayer.PlayPlatform { + var toOpenerPlatform: WakmusicYoutubePlayer.OpenerPlatform { + switch self { + case .youtube: return .youtube + case .youtubeMusic: return .youtubeMusic + case .automatic: return PreferenceManager.songPlayPlatformType?.toOpnerPlatform ?? .youtube + } + } +} + +private extension YoutubePlayType { + var toOpnerPlatform: WakmusicYoutubePlayer.OpenerPlatform { + switch self { + case .youtube: return .youtube + case .youtubeMusic: return .youtubeMusic + } + } +} diff --git a/Projects/Modules/Utility/Sources/Protocols/ContainerViewType.swift b/Projects/Modules/Utility/Sources/Protocols/ContainerViewType.swift index cf28d118b..f77415e25 100644 --- a/Projects/Modules/Utility/Sources/Protocols/ContainerViewType.swift +++ b/Projects/Modules/Utility/Sources/Protocols/ContainerViewType.swift @@ -7,16 +7,18 @@ // import Foundation -import UIKit import SnapKit +import UIKit -public protocol ContainerViewType{ - var contentView: UIView! {get set} +public protocol ContainerViewType { + var contentView: UIView! { get set } } public extension ContainerViewType where Self: UIViewController { - - func add(asChildViewController viewController: UIViewController) { + func add(asChildViewController viewController: UIViewController?) { + guard let viewController = viewController else { + return + } addChild(viewController) contentView.addSubview(viewController.view) @@ -27,7 +29,10 @@ public extension ContainerViewType where Self: UIViewController { } } - func remove(asChildViewController viewController: UIViewController) { + func remove(asChildViewController viewController: UIViewController?) { + guard let viewController = viewController else { + return + } viewController.willMove(toParent: nil) viewController.view.removeFromSuperview() diff --git a/Projects/Modules/Utility/Sources/Protocols/ViewControllerFromStoryBoard.swift b/Projects/Modules/Utility/Sources/Protocols/ViewControllerFromStoryBoard.swift index 660cc4a97..0d2cc9e14 100644 --- a/Projects/Modules/Utility/Sources/Protocols/ViewControllerFromStoryBoard.swift +++ b/Projects/Modules/Utility/Sources/Protocols/ViewControllerFromStoryBoard.swift @@ -13,16 +13,15 @@ public protocol ViewControllerFromStoryBoard {} public protocol ViewControllerFromStoryBoardAndNeedle {} public extension ViewControllerFromStoryBoard where Self: UIViewController { - /// 스토리 보드에 정의된 화면을 객체화 하여 반환합니다. /// where Self: UIViewController: UIViewController에 한정하여 사용 /// - Parameter storyBoardName: 스토리보드 이름 /// - Parameter bundle: 해당 번들, 각 피쳐별 모듈이 다르기 때문에 번들까지 넘겨줘야합니다. /// - Returns: UIViewController - static func viewController(storyBoardName: String, bundle: Bundle) -> Self { + static func viewController(storyBoardName: String, bundle: Bundle) -> Self { guard let viewController = UIStoryboard(name: storyBoardName, bundle: bundle) .instantiateViewController(withIdentifier: String(describing: Self.self)) as? Self - else { return Self() } + else { return Self() } return viewController } } diff --git a/Projects/Modules/Utility/Sources/Realm/RealmManager.swift b/Projects/Modules/Utility/Sources/Realm/RealmManager.swift index 7aeab80bd..c108fd353 100644 --- a/Projects/Modules/Utility/Sources/Realm/RealmManager.swift +++ b/Projects/Modules/Utility/Sources/Realm/RealmManager.swift @@ -7,36 +7,47 @@ // import Foundation +import LogManager +import Realm import RealmSwift +/** + schemaVersion 업데이트 기록 + v1 + - PlayedLists 엔티티 추가 + - 재생목록 저장을 위한 엔티티 + + v2 + - PlaylistLocalEntity 엔티티 추가 + - 재생목록 저장을 위한 엔티티 (리팩토링 버전) + - 기존 PlayedList는 레거시로 판정하여 migration 과정에서 데이터 모두 제거 + */ public class RealmManager: NSObject { public static let shared = RealmManager() - public var realm: Realm! + private var realm: Realm! override init() { - super.init() - DEBUG_LOG("✅ \(Self.self) init") - } - - public func register() { - - //Realm DataBase Migration 하려면 아래의 schemaVersion을 +1 해줘야 합니다. let config = Realm.Configuration( - schemaVersion: 1, - migrationBlock: { (_, oldSchemaVersion) in - if oldSchemaVersion < 1 { + schemaVersion: 2, + migrationBlock: { database, oldSchemaVersion in + if oldSchemaVersion < 1 {} + if oldSchemaVersion < 2 { + database.deleteData(forType: PlayedLists.className()) } } ) Realm.Configuration.defaultConfiguration = config - - //init + do { realm = try Realm() - }catch { - DEBUG_LOG(error.localizedDescription) + } catch { + LogManager.printError(error.localizedDescription) + fatalError() } - DEBUG_LOG(Realm.Configuration.defaultConfiguration.fileURL ?? "") + LogManager.printDebug(Realm.Configuration.defaultConfiguration.fileURL ?? "") + + super.init() + DEBUG_LOG("✅ \(Self.self) init") } } @@ -44,26 +55,48 @@ public extension RealmManager { func addRealmDB(model: T, update: Realm.UpdatePolicy = .all) { do { try self.realm.write { - if let object = model as? Object { + if let object = model as? Object { self.realm.add(object, update: update) - }else if let object = model as? [Object] { + } else if let object = model as? [Object] { self.realm.add(object, update: update) - }else{ - DEBUG_LOG("❌ Object Casting Failed") + } else { + LogManager.printError("Object Casting Failed") } } } catch { - DEBUG_LOG(error.localizedDescription) + LogManager.printError(error.localizedDescription) } } - - func deleteRealmDB(model: Results){ + + func fetchRealmDB() -> Results { + self.realm.objects(T.self) + } + + func fetchRealmDB(_ type: T.Type) -> Results { + self.realm.objects(type) + } + + func fetchRealmDB(_ type: T.Type, primaryKey: KeyType) -> T? { + self.realm.object(ofType: type, forPrimaryKey: primaryKey) + } + + func deleteRealmDB(model: Results) { + do { + try self.realm.write { + self.realm.delete(model) + } + } catch { + LogManager.printError(error.localizedDescription) + } + } + + func deleteRealmDB(model: [T]) { do { try self.realm.write { self.realm.delete(model) } } catch { - DEBUG_LOG(error.localizedDescription) + LogManager.printError(error.localizedDescription) } } } diff --git a/Projects/Modules/Utility/Sources/Realm/RealmModel.swift b/Projects/Modules/Utility/Sources/Realm/RealmModel.swift index aa98d78b9..94ed2da2f 100644 --- a/Projects/Modules/Utility/Sources/Realm/RealmModel.swift +++ b/Projects/Modules/Utility/Sources/Realm/RealmModel.swift @@ -9,6 +9,7 @@ import Foundation import RealmSwift +@available(*, deprecated, message: "PlaylistLocalEntity로 전환. 해당 객체는 사용하지 말아주세요.") public final class PlayedLists: Object { @objc public dynamic var id: String = "" @objc public dynamic var title: String = "" @@ -18,12 +19,13 @@ public final class PlayedLists: Object { @objc public dynamic var views: Int = 0 @objc public dynamic var last: Int = 0 @objc public dynamic var date: String = "" + @objc public dynamic var likes: Int = 0 @objc public dynamic var lastPlayed: Bool = false - public override static func primaryKey() -> String? { + override public static func primaryKey() -> String? { return "id" } - + public convenience init( id: String, title: String, @@ -33,6 +35,7 @@ public final class PlayedLists: Object { views: Int, last: Int, date: String, + likes: Int = 0, lastPlayed: Bool ) { self.init() @@ -44,6 +47,7 @@ public final class PlayedLists: Object { self.views = views self.last = last self.date = date + self.likes = 0 self.lastPlayed = lastPlayed } } diff --git a/Projects/Features/BaseFeature/Sources/AES256.swift b/Projects/Modules/Utility/Sources/Utils/AES256.swift similarity index 78% rename from Projects/Features/BaseFeature/Sources/AES256.swift rename to Projects/Modules/Utility/Sources/Utils/AES256.swift index 0e0c178e8..4821021c4 100644 --- a/Projects/Features/BaseFeature/Sources/AES256.swift +++ b/Projects/Modules/Utility/Sources/Utils/AES256.swift @@ -6,23 +6,25 @@ // Copyright © 2023 yongbeomkwak. All rights reserved. // -import Foundation import CryptoSwift +import Foundation -public final class AES256 { - //키값 32바이트: AES256(24bytes: AES192, 16bytes: AES128) +public enum AES256 { + /// 키값 32바이트: AES256(24bytes: AES192, 16bytes: AES128) private static let SECRET_KEY = "01234567890123450123456789012345" private static let IV = "0123456789012345" - - public static func encrypt(string: String) -> String { +} + +public extension AES256 { + static func encrypt(string: String) -> String { guard !string.isEmpty else { return "" } guard let result = try? getAESObject()?.encrypt(string.bytes).toBase64() else { return "" } return result } - - public static func decrypt(encoded: String) -> String { + + static func decrypt(encoded: String) -> String { guard !encoded.isEmpty else { return "" } @@ -35,8 +37,10 @@ public final class AES256 { } return String(bytes: decode, encoding: .utf8) ?? "" } - - private static func getAESObject() -> AES? { +} + +private extension AES256 { + static func getAESObject() -> AES? { let keyDecodes: [UInt8] = Array(SECRET_KEY.utf8) let ivDecodes: [UInt8] = Array(IV.utf8) let aesObject = try? AES(key: keyDecodes, blockMode: CBC(iv: ivDecodes), padding: .pkcs5) diff --git a/Projects/Modules/Utility/Sources/Utils/Devices.swift b/Projects/Modules/Utility/Sources/Utils/Devices.swift index 85ada78e7..d560ec4c7 100644 --- a/Projects/Modules/Utility/Sources/Utils/Devices.swift +++ b/Projects/Modules/Utility/Sources/Utils/Devices.swift @@ -10,7 +10,7 @@ import Foundation public struct Device { public init() {} - + public var modelName: String { var systemInfo = utsname() uname(&systemInfo) @@ -19,10 +19,9 @@ public struct Device { guard let value = element.value as? Int8, value != 0 else { return identifier } return identifier + String(UnicodeScalar(UInt8(value))) } - - switch identifier { - //iPhone + switch identifier { + // iPhone case "iPhone3,1", "iPhone3,2", "iPhone3,3": return "iPhone 4" case "iPhone4,1": return "iPhone 4s" case "iPhone5,1", "iPhone5,2": return "iPhone 5" @@ -41,65 +40,65 @@ public struct Device { case "iPhone11,8": return "iPhone XR" case "iPhone11,2": return "iPhone XS" case "iPhone11,4", "iPhone11,6": return "iPhone XS MAX" - case "iPhone12,1" : return "iPhone 11" - case "iPhone12,3" : return "iPhone 11 Pro" - case "iPhone12,5" : return "iPhone 11 Pro Max" - case "iPhone12,8" : return "iPhone SE (2nd Gen)" - case "iPhone13,1" : return "iPhone 12 Mini" - case "iPhone13,2" : return "iPhone 12" - case "iPhone13,3" : return "iPhone 12 Pro" - case "iPhone13,4" : return "iPhone 12 Pro Max" - case "iPhone14,2" : return "iPhone 13 Pro" - case "iPhone14,3" : return "iPhone 13 Pro Max" - case "iPhone14,4" : return "iPhone 13 Mini" - case "iPhone14,5" : return "iPhone 13" - case "iPhone14,6" : return "iPhone SE (3rd Gen)" - case "iPhone14,7" : return "iPhone 14" - case "iPhone14,8" : return "iPhone 14 Plus" - case "iPhone15,2" : return "iPhone 14 Pro" - case "iPhone15,3" : return "iPhone 14 Pro Max" - case "iPhone15,4" : return "iPhone 15" - case "iPhone15,5" : return "iPhone 15 Plus" - case "iPhone16,1" : return "iPhone 15 Pro" - case "iPhone16,2" : return "iPhone 15 Pro Max" + case "iPhone12,1": return "iPhone 11" + case "iPhone12,3": return "iPhone 11 Pro" + case "iPhone12,5": return "iPhone 11 Pro Max" + case "iPhone12,8": return "iPhone SE (2nd Gen)" + case "iPhone13,1": return "iPhone 12 Mini" + case "iPhone13,2": return "iPhone 12" + case "iPhone13,3": return "iPhone 12 Pro" + case "iPhone13,4": return "iPhone 12 Pro Max" + case "iPhone14,2": return "iPhone 13 Pro" + case "iPhone14,3": return "iPhone 13 Pro Max" + case "iPhone14,4": return "iPhone 13 Mini" + case "iPhone14,5": return "iPhone 13" + case "iPhone14,6": return "iPhone SE (3rd Gen)" + case "iPhone14,7": return "iPhone 14" + case "iPhone14,8": return "iPhone 14 Plus" + case "iPhone15,2": return "iPhone 14 Pro" + case "iPhone15,3": return "iPhone 14 Pro Max" + case "iPhone15,4": return "iPhone 15" + case "iPhone15,5": return "iPhone 15 Plus" + case "iPhone16,1": return "iPhone 15 Pro" + case "iPhone16,2": return "iPhone 15 Pro Max" - //iPod + // iPod case "iPod5,1": return "iPod Touch 5" case "iPod7,1": return "iPod Touch 6" case "iPod9,1": return "iPod touch 7" - //iPad - case "iPad2,1", "iPad2,2", "iPad2,3", "iPad2,4":return "iPad 2" - case "iPad3,1", "iPad3,2", "iPad3,3": return "iPad (3rd Gen)" - case "iPad3,4", "iPad3,5", "iPad3,6": return "iPad (4th Gen)" - case "iPad6,11", "iPad6,12": return "iPad (5th Gen)" - case "iPad7,5", "iPad7,6": return "iPad (6th Gen)" - case "iPad7,11", "iPad7,12": return "iPad (7th Gen)" - case "iPad4,1", "iPad4,2", "iPad4,3": return "iPad Air" - case "iPad5,3", "iPad5,4": return "iPad Air 2" - case "iPad11,4", "iPad11,5": return "iPad Air (3rd Gen)" - case "iPad2,5", "iPad2,6", "iPad2,7": return "iPad mini" - case "iPad4,4", "iPad4,5", "iPad4,6": return "iPad mini 2" - case "iPad4,7", "iPad4,8", "iPad4,9": return "iPad mini 3" - case "iPad5,1", "iPad5,2": return "iPad mini 4" - case "iPad11,1", "iPad11,2": return "iPad mini (5th Gen)" - case "iPad6,3", "iPad6,4": return "iPad Pro (9.7-inch)" - case "iPad6,7", "iPad6,8": return "iPad Pro (12.9-inch)" - case "iPad7,1", "iPad7,2": return "iPad Pro (12.9-inch) (2nd Gen)" - case "iPad7,3", "iPad7,4": return "iPad Pro (10.5-inch)" - case "iPad8,1", "iPad8,2", "iPad8,3", "iPad8,4":return "iPad Pro (11-inch)" - case "iPad8,9": return "iPad Pro (11-inch) (2nd Gen)" - case "iPad8,5", "iPad8,6", "iPad8,7", "iPad8,8":return "iPad Pro (12.9-inch) (3rd Gen)" - case "iPad8,12": return "iPad Pro (12.9-inch) (4th Gen)" - - //ETC - case "AppleTV5,3": return "Apple TV" - case "AppleTV6,2": return "Apple TV 4K" - case "AudioAccessory1,1": return "HomePod" - - //Simulator + // iPad + case "iPad2,1", "iPad2,2", "iPad2,3", "iPad2,4": return "iPad 2" + case "iPad3,1", "iPad3,2", "iPad3,3": return "iPad (3rd Gen)" + case "iPad3,4", "iPad3,5", "iPad3,6": return "iPad (4th Gen)" + case "iPad6,11", "iPad6,12": return "iPad (5th Gen)" + case "iPad7,5", "iPad7,6": return "iPad (6th Gen)" + case "iPad7,11", "iPad7,12": return "iPad (7th Gen)" + case "iPad4,1", "iPad4,2", "iPad4,3": return "iPad Air" + case "iPad5,3", "iPad5,4": return "iPad Air 2" + case "iPad11,4", "iPad11,5": return "iPad Air (3rd Gen)" + case "iPad2,5", "iPad2,6", "iPad2,7": return "iPad mini" + case "iPad4,4", "iPad4,5", "iPad4,6": return "iPad mini 2" + case "iPad4,7", "iPad4,8", "iPad4,9": return "iPad mini 3" + case "iPad5,1", "iPad5,2": return "iPad mini 4" + case "iPad11,1", "iPad11,2": return "iPad mini (5th Gen)" + case "iPad6,3", "iPad6,4": return "iPad Pro (9.7-inch)" + case "iPad6,7", "iPad6,8": return "iPad Pro (12.9-inch)" + case "iPad7,1", "iPad7,2": return "iPad Pro (12.9-inch) (2nd Gen)" + case "iPad7,3", "iPad7,4": return "iPad Pro (10.5-inch)" + case "iPad8,1", "iPad8,2", "iPad8,3", "iPad8,4": return "iPad Pro (11-inch)" + case "iPad8,9": return "iPad Pro (11-inch) (2nd Gen)" + case "iPad8,5", "iPad8,6", "iPad8,7", "iPad8,8": return "iPad Pro (12.9-inch) (3rd Gen)" + case "iPad8,12": return "iPad Pro (12.9-inch) (4th Gen)" + + // ETC + case "AppleTV5,3": return "Apple TV" + case "AppleTV6,2": return "Apple TV 4K" + case "AudioAccessory1,1": return "HomePod" + + // Simulator case "i386", "x86_64", "arm64": return "iPhone Simulator" - + default: return identifier } } diff --git a/Projects/Modules/Utility/Sources/Utils/Secrets.swift b/Projects/Modules/Utility/Sources/Utils/Secrets.swift index 3c4292e6d..40433ff46 100644 --- a/Projects/Modules/Utility/Sources/Utils/Secrets.swift +++ b/Projects/Modules/Utility/Sources/Utils/Secrets.swift @@ -15,63 +15,50 @@ public func config(key: String) -> String { return secrets[key] as? String ?? "not found key" } -//MARK: - BASE_IMAGE_URL -public func BASE_IMAGE_URL() -> String { - return config(key: "BASE_IMAGE_URL") +// MARK: - CDN Domain +public func CDN_DOMAIN_URL() -> String { + return config(key: "CDN_DOMAIN_URL") } -//MARK: - WMDomain > Image -public func WMDOMAIN_IMAGE_NEWS() -> String { - return config(key: "WMDOMAIN_IMAGE_NEWS") -} -public func WMDOMAIN_IMAGE_ARTIST_ROUND() -> String { - return config(key: "WMDOMAIN_IMAGE_ARTIST_ROUND") -} -public func WMDOMAIN_IMAGE_ARTIST_SQUARE() -> String { - return config(key: "WMDOMAIN_IMAGE_ARTIST_SQUARE") -} -public func WMDOMAIN_IMAGE_PROFILE() -> String { - return config(key: "WMDOMAIN_IMAGE_PROFILE") -} -public func WMDOMAIN_IMAGE_PLAYLIST() -> String { - return config(key: "WMDOMAIN_IMAGE_PLAYLIST") -} -public func WMDOMAIN_IMAGE_RECOMMEND_PLAYLIST_SQUARE() -> String { - return config(key: "WMDOMAIN_IMAGE_RECOMMEND_PLAYLIST_SQUARE") -} -public func WMDOMAIN_IMAGE_RECOMMEND_PLAYLIST_ROUND() -> String { - return config(key: "WMDOMAIN_IMAGE_RECOMMEND_PLAYLIST_ROUND") -} -public func WMDOMAIN_IMAGE_NOTICE() -> String { - return config(key: "WMDOMAIN_IMAGE_NOTICE") -} - -//MARK: - NAVER +// MARK: - NAVER public func NAVER_URL_SCHEME() -> String { return config(key: "NAVER_URL_SCHEME") } + public func NAVER_CONSUMER_KEY() -> String { return config(key: "NAVER_CONSUMER_KEY") } + public func NAVER_CONSUMER_SECRET() -> String { return config(key: "NAVER_CONSUMER_SECRET") } + public func NAVER_APP_NAME() -> String { return config(key: "NAVER_APP_NAME") } -//MARK: - GOOGLE +// MARK: - GOOGLE public func GOOGLE_URL_SCHEME() -> String { return config(key: "GOOGLE_URL_SCHEME") } + public func GOOGLE_CLIENT_ID() -> String { return config(key: "GOOGLE_CLIENT_ID") } -public func GOOGLE_SECRET_KEY() -> String { - return config(key: "GOOGLE_SECRET_KEY") -} -//WAKTAVERSEMUSIC +/// WAKTAVERSEMUSIC public func WM_APP_ID() -> String { return config(key: "WM_APP_ID") } + +public func WM_URI_SCHEME() -> String { + return config(key: "WM_URI_SCHEME") +} + +public func WM_UNIVERSALLINK_DOMAIN() -> String { + #if DEBUG || QA + return config(key: "WM_UNIVERSALLINK_TEST_DOMAIN") + #else + return config(key: "WM_UNIVERSALLINK_DOMAIN") + #endif +} diff --git a/Projects/Modules/Utility/Sources/Utils/TemporaryMediaFile.swift b/Projects/Modules/Utility/Sources/Utils/TemporaryMediaFile.swift index 70ec3dad3..549cfb949 100644 --- a/Projects/Modules/Utility/Sources/Utils/TemporaryMediaFile.swift +++ b/Projects/Modules/Utility/Sources/Utils/TemporaryMediaFile.swift @@ -6,8 +6,8 @@ // Copyright © 2023 yongbeomkwak. All rights reserved. // -import Foundation import AVFoundation +import Foundation public class TemporaryMediaFile { public var url: URL? diff --git a/Projects/Modules/Utility/Sources/Utils/Utils.swift b/Projects/Modules/Utility/Sources/Utils/Utils.swift index 92ed8aa74..6c6e9890b 100644 --- a/Projects/Modules/Utility/Sources/Utils/Utils.swift +++ b/Projects/Modules/Utility/Sources/Utils/Utils.swift @@ -8,14 +8,15 @@ import Foundation import UIKit -import KeychainModule public func APP_WIDTH() -> CGFloat { - return UIScreen.main.bounds.size.width + let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene + return windowScene?.screen.bounds.size.width ?? .zero } public func APP_HEIGHT() -> CGFloat { - return UIScreen.main.bounds.size.height + let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene + return windowScene?.screen.bounds.size.height ?? .zero } public func PLAYER_HEIGHT() -> CGFloat { @@ -23,11 +24,23 @@ public func PLAYER_HEIGHT() -> CGFloat { } public func STATUS_BAR_HEGHIT() -> CGFloat { - return max(20, UIApplication.shared.windows.first?.safeAreaInsets.top ?? 0) + return UIApplication.shared.connectedScenes + .compactMap { $0 as? UIWindowScene } + .filter { $0.activationState == .foregroundActive } + .first? + .keyWindow? + .safeAreaInsets + .top ?? 0 } public func SAFEAREA_BOTTOM_HEIGHT() -> CGFloat { - return UIApplication.shared.windows.first?.safeAreaInsets.bottom ?? 0 + return UIApplication.shared.connectedScenes + .compactMap { $0 as? UIWindowScene } + .filter { $0.activationState == .foregroundActive } + .first? + .keyWindow? + .safeAreaInsets + .bottom ?? 0 } public func APP_VERSION() -> String { @@ -45,23 +58,23 @@ public func OS_VERSION() -> String { public func OS_NAME() -> String { let osName: String = { #if os(iOS) - #if targetEnvironment(macCatalyst) - return "macOS(Catalyst)" - #else - return "iOS" - #endif + #if targetEnvironment(macCatalyst) + return "macOS(Catalyst)" + #else + return "iOS" + #endif #elseif os(watchOS) - return "watchOS" + return "watchOS" #elseif os(tvOS) - return "tvOS" + return "tvOS" #elseif os(macOS) - return "macOS" + return "macOS" #elseif os(Linux) - return "Linux" + return "Linux" #elseif os(Windows) - return "Windows" + return "Windows" #else - return "Unknown" + return "Unknown" #endif }() return osName @@ -69,30 +82,29 @@ public func OS_NAME() -> String { // use: colorFromRGB(0xffffff) public func colorFromRGB(_ rgbValue: UInt, alpha: CGFloat = 1.0) -> UIColor { - return UIColor(red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0, - green: CGFloat((rgbValue & 0xFF00) >> 8) / 255.0, - blue: CGFloat(rgbValue & 0xFF) / 255.0, alpha: alpha) + return UIColor( + red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0, + green: CGFloat((rgbValue & 0xFF00) >> 8) / 255.0, + blue: CGFloat(rgbValue & 0xFF) / 255.0, + alpha: alpha + ) } // use: colorFromRGB("ffffff") public func colorFromRGB(_ hexString: String, alpha: CGFloat = 1.0) -> UIColor { let hexToInt = UInt32(Float64("0x" + hexString) ?? 0) - return UIColor(red: CGFloat((hexToInt & 0xFF0000) >> 16) / 255.0, - green: CGFloat((hexToInt & 0xFF00) >> 8) / 255.0, - blue: CGFloat(hexToInt & 0xFF) / 255.0, alpha: alpha) + return UIColor( + red: CGFloat((hexToInt & 0xFF0000) >> 16) / 255.0, + green: CGFloat((hexToInt & 0xFF00) >> 8) / 255.0, + blue: CGFloat(hexToInt & 0xFF) / 255.0, + alpha: alpha + ) } public func DEBUG_LOG(_ msg: Any, file: String = #file, function: String = #function, line: Int = #line) { - #if DEBUG + #if DEBUG || QA let fileName = file.split(separator: "/").last ?? "" let funcName = function.split(separator: "(").first ?? "" print("[\(fileName)] \(funcName)(\(line)): \(msg)") #endif } - -public func LOGOUT(){ - let keychain = KeychainImpl() - keychain.delete(type: .accessToken) - Utility.PreferenceManager.userInfo = nil - NotificationCenter.default.post(name: .movedTab, object: 4) -} diff --git a/Projects/Modules/Utility/Sources/Youtube/YoutubeURLGenerator.swift b/Projects/Modules/Utility/Sources/Youtube/YoutubeURLGenerator.swift new file mode 100644 index 000000000..ab0ab8927 --- /dev/null +++ b/Projects/Modules/Utility/Sources/Youtube/YoutubeURLGenerator.swift @@ -0,0 +1,73 @@ +import Foundation + +public protocol YoutubeURLGeneratable { + func generateThumbnailURL(id: String) -> String + func generateHDThumbnailURL(id: String) -> String + func generateYoutubeVideoAppURL(id: String) -> String + func generateYoutubeVideoWebURL(id: String) -> String + func generateYoutubeVideoAppURL(ids: [String]) -> String + func generateYoutubeVideoWebURL(ids: [String]) -> String + func generateYoutubePlaylistAppURL(id: String) -> String + func generateYoutubePlaylistWebURL(id: String) -> String + + func generateYoutubeMusicVideoAppURL(id: String) -> String + func generateYoutubeMusicVideoWebURL(id: String) -> String + func generateYoutubeMusicPlaylistAppURL(id: String) -> String + func generateYoutubeMusicPlaylistWebURL(id: String) -> String +} + +public struct YoutubeURLGenerator: YoutubeURLGeneratable { + public init() {} + + // MARK: Youtube + + public func generateThumbnailURL(id: String) -> String { + "https://i.ytimg.com/vi/\(id)/mqdefault.jpg" + } + + public func generateHDThumbnailURL(id: String) -> String { + "https://i.ytimg.com/vi/\(id)/maxresdefault.jpg" + } + + public func generateYoutubeVideoAppURL(id: String) -> String { + "youtube://\(id)" + } + + public func generateYoutubeVideoWebURL(id: String) -> String { + "https://youtube.com/watch?v=\(id)" + } + + public func generateYoutubeVideoAppURL(ids: [String]) -> String { + "youtube://watch_videos?video_ids=\(ids.joined(separator: ","))" + } + + public func generateYoutubeVideoWebURL(ids: [String]) -> String { + "https://youtube.com/watch_videos?video_ids=\(ids.joined(separator: ","))" + } + + public func generateYoutubePlaylistAppURL(id: String) -> String { + "youtube://playlist?list=\(id)" + } + + public func generateYoutubePlaylistWebURL(id: String) -> String { + "https://youtube.com/playlist?list=\(id)" + } + + // MARK: Youtube Music + + public func generateYoutubeMusicVideoAppURL(id: String) -> String { + return "youtubemusic://watch?v=\(id)" + } + + public func generateYoutubeMusicVideoWebURL(id: String) -> String { + return "https://music.youtube.com/watch?v=\(id)" + } + + public func generateYoutubeMusicPlaylistAppURL(id: String) -> String { + return "youtubemusic://watch?list=\(id)" + } + + public func generateYoutubeMusicPlaylistWebURL(id: String) -> String { + return "https://music.youtube.com/watch?list=\(id)" + } +} diff --git a/Projects/Modules/Utility/Tests/TargetTests.swift b/Projects/Modules/Utility/Tests/TargetTests.swift new file mode 100644 index 000000000..1e92a5f9f --- /dev/null +++ b/Projects/Modules/Utility/Tests/TargetTests.swift @@ -0,0 +1 @@ +import XCTest diff --git a/Projects/Services/APIKit/.swiftlint.yml b/Projects/Services/APIKit/.swiftlint.yml deleted file mode 100644 index ff44f9f28..000000000 --- a/Projects/Services/APIKit/.swiftlint.yml +++ /dev/null @@ -1,20 +0,0 @@ -excluded: - - "**/*/NeedleGenerated.swift" - - "Tuist" - - -force_cast: # From https://realm.github.io/SwiftLint/force_cast.html - warning # 강제 캐스팅은 error에서 warning으로 변경 - -disabled_rules: - - trailing_whitespace - - vertical_whitespace - - colon - - comma - - comment_spacing # 주석 여백 - - mark # //MARK 관련 warning - - opening_brace # 괄호 열 때 줄바꿈을 했는지 안했는지, (안했으면 warning) - - line_length # 한줄에 글자 수 제한 , warning: 120, error: 200 (default) - - statement_position # if는 반드시 else로 끝나야한다. - - identifier_name #변수명 글자 수 제한 - diff --git a/Projects/Services/APIKit/Project.swift b/Projects/Services/APIKit/Project.swift deleted file mode 100644 index 6efd2679c..000000000 --- a/Projects/Services/APIKit/Project.swift +++ /dev/null @@ -1,13 +0,0 @@ -import ProjectDescription -import ProjectDescriptionHelpers - -let project = Project.makeModule( - name: "APIKit", - product: .staticFramework, - dependencies: [ - .Project.Module.ThirdPartyLib, - .Project.Module.KeychainModule, - .Project.Module.ErrorModule, - .Project.Service.DataMappingModule - ] -) diff --git a/Projects/Services/APIKit/Sources/API/AppAPI.swift b/Projects/Services/APIKit/Sources/API/AppAPI.swift deleted file mode 100644 index 815e35473..000000000 --- a/Projects/Services/APIKit/Sources/API/AppAPI.swift +++ /dev/null @@ -1,57 +0,0 @@ -import Moya -import DataMappingModule -import ErrorModule -import Foundation - -public enum AppAPI { - case checkVersion -} - -extension AppAPI: WMAPI { - public var domain: WMDomain { - .app - } - - public var urlPath: String { - switch self { - case .checkVersion: - return "/check" - } - } - - public var method: Moya.Method { - return .get - } - - public var task: Moya.Task { - switch self { - - case .checkVersion: - return .requestParameters(parameters: [ - "os": "ios", - "version": Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String ?? "" - ], encoding: URLEncoding.queryString) - - } - } - - public var jwtTokenType: JwtTokenType { - return .none - } - - public var errorMap: [Int: WMError] { - switch self { - default: - return [ - 400: .badRequest, - 401: .tokenExpired, - 404: .notFound, - 429: .tooManyRequest, - 500: .internalServerError, - 502: .internalServerError, - 521: .internalServerError, - 1009: .offline - ] - } - } -} diff --git a/Projects/Services/APIKit/Sources/API/ArtistAPI.swift b/Projects/Services/APIKit/Sources/API/ArtistAPI.swift deleted file mode 100644 index d0eeabb94..000000000 --- a/Projects/Services/APIKit/Sources/API/ArtistAPI.swift +++ /dev/null @@ -1,74 +0,0 @@ -// -// ArtistAPI.swift -// APIKit -// -// Created by KTH on 2023/02/01. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Moya -import DataMappingModule -import ErrorModule -import Foundation - -public enum ArtistAPI { - case fetchArtistList - case fetchArtistSongList(id: String, sort: ArtistSongSortType, page: Int) -} - -extension ArtistAPI: WMAPI { - public var domain: WMDomain { - switch self{ - case .fetchArtistList, - .fetchArtistSongList: - return .artist - } - } - - public var urlPath: String { - switch self { - case .fetchArtistList: - return "/list" - case .fetchArtistSongList: - return "/albums" - } - } - - public var method: Moya.Method { - switch self { - case .fetchArtistList, - .fetchArtistSongList: - return .get - } - } - - public var task: Moya.Task { - switch self { - case .fetchArtistList: - return .requestPlain - case let .fetchArtistSongList(id, sort, page): - return .requestParameters(parameters: [ - "id": id, - "sort": sort.rawValue, - "start": (page == 1) ? 0 : (page - 1) * 30 - ], encoding: URLEncoding.queryString) - } - } - - public var jwtTokenType: JwtTokenType { - return .none - } - - public var errorMap: [Int: WMError] { - switch self { - default: - return [ - 400: .badRequest, - 401: .tokenExpired, - 404: .notFound, - 429: .tooManyRequest, - 500: .internalServerError - ] - } - } -} diff --git a/Projects/Services/APIKit/Sources/API/AuthAPI.swift b/Projects/Services/APIKit/Sources/API/AuthAPI.swift deleted file mode 100644 index b779bee4f..000000000 --- a/Projects/Services/APIKit/Sources/API/AuthAPI.swift +++ /dev/null @@ -1,103 +0,0 @@ -import Moya -import DataMappingModule -import ErrorModule -import Foundation -import KeychainModule - -public enum AuthAPI { - case fetchToken(token: String, type: ProviderType) - case fetchNaverUserInfo(tokenType: String, accessToken: String) - case fetchUserInfo - case withdrawUserInfo -} - -public struct AuthRequset:Encodable { - var token: String - var provider: String -} - -extension AuthAPI: WMAPI { - public var baseURL: URL { - switch self { - case .fetchToken, .fetchUserInfo, .withdrawUserInfo: - return URL(string:BASE_URL())! - case .fetchNaverUserInfo: - return URL(string: "https://openapi.naver.com")! - } - } - - public var domain: WMDomain { - switch self { - case .fetchToken, .fetchUserInfo, .withdrawUserInfo: - return .auth - case .fetchNaverUserInfo: - return .naver - } - } - - public var urlPath: String { - switch self { - case .fetchToken: - return "/login/mobile" - case .fetchNaverUserInfo: - return "" - case .fetchUserInfo: - return "/" - case .withdrawUserInfo: - return "/remove" - } - } - - public var method: Moya.Method { - switch self { - case .fetchToken: - return .post - case .fetchNaverUserInfo: - return .get - case .fetchUserInfo: - return .get - case .withdrawUserInfo: - return .delete - } - } - - public var headers: [String : String]? { - switch self { - case .fetchNaverUserInfo(tokenType: let tokenType, accessToken: let accessToken): - return ["Authorization": "\(tokenType) \(accessToken)"] - default: - return ["Content-Type": "application/json"] - } - } - - public var task: Moya.Task { - switch self { - case .fetchToken(token: let id, type: let type): - return .requestJSONEncodable(AuthRequset(token: id, provider: type.rawValue)) - case .fetchNaverUserInfo, .fetchUserInfo, .withdrawUserInfo: - return .requestPlain - } - } - - public var jwtTokenType: JwtTokenType { - switch self { - case .fetchUserInfo, .withdrawUserInfo: - return .accessToken - default: - return .none - } - } - - public var errorMap: [Int: WMError] { - switch self { - default: - return [ - 400: .badRequest, - 401: .tokenExpired, - 404: .notFound, - 429: .tooManyRequest, - 500: .internalServerError - ] - } - } -} diff --git a/Projects/Services/APIKit/Sources/API/ChartAPI.swift b/Projects/Services/APIKit/Sources/API/ChartAPI.swift deleted file mode 100644 index e3fa005c9..000000000 --- a/Projects/Services/APIKit/Sources/API/ChartAPI.swift +++ /dev/null @@ -1,58 +0,0 @@ -import Moya -import DataMappingModule -import ErrorModule -import Foundation - -public enum ChartAPI { - case fetchChartRanking(type: ChartDateType, limit: Int) - case fetchChartUpdateTime(type: ChartDateType) -} - -extension ChartAPI: WMAPI { - public var domain: WMDomain { - .charts - } - - public var urlPath: String { - switch self { - case .fetchChartRanking: - return "/" - case let.fetchChartUpdateTime(type): - return "/updated/\(type.rawValue)" - } - } - - public var method: Moya.Method { - return .get - } - - public var task: Moya.Task { - switch self { - case let .fetchChartRanking(type, limit): - return .requestParameters(parameters: [ - "type": type.rawValue, - "limit": limit - ], encoding: URLEncoding.queryString) - - case .fetchChartUpdateTime: - return .requestPlain - } - } - - public var jwtTokenType: JwtTokenType { - return .none - } - - public var errorMap: [Int: WMError] { - switch self { - default: - return [ - 400: .badRequest, - 401: .tokenExpired, - 404: .notFound, - 429: .tooManyRequest, - 500: .internalServerError - ] - } - } -} diff --git a/Projects/Services/APIKit/Sources/API/LikeAPI.swift b/Projects/Services/APIKit/Sources/API/LikeAPI.swift deleted file mode 100644 index bbe4ab784..000000000 --- a/Projects/Services/APIKit/Sources/API/LikeAPI.swift +++ /dev/null @@ -1,63 +0,0 @@ -import Moya -import DataMappingModule -import ErrorModule -import Foundation -import KeychainModule - -public enum LikeAPI { - case fetchLikeNumOfSong(id:String) - case addLikeSong(id:String) - case cancelLikeSong(id:String) -} - -extension LikeAPI: WMAPI { - public var domain: WMDomain { - .like - } - - public var urlPath: String { - switch self { - case .fetchLikeNumOfSong(id: let id): - return "/\(id)" - case .addLikeSong(id: let id): - return "/\(id)/addLike" - case .cancelLikeSong(id: let id): - return "/\(id)/removeLike" - } - } - - public var method: Moya.Method { - switch self { - case .fetchLikeNumOfSong: - return .get - case .addLikeSong,.cancelLikeSong: - return .post - } - } - - public var task: Moya.Task { - return .requestPlain - } - - public var jwtTokenType: JwtTokenType { - switch self { - case .fetchLikeNumOfSong: - return .none - case .addLikeSong,.cancelLikeSong: - return .accessToken - } - } - - public var errorMap: [Int: WMError] { - switch self { - default: - return [ - 400: .badRequest, - 401: .tokenExpired, - 404: .notFound, - 429: .tooManyRequest, - 500: .internalServerError - ] - } - } -} diff --git a/Projects/Services/APIKit/Sources/API/NoticeAPI.swift b/Projects/Services/APIKit/Sources/API/NoticeAPI.swift deleted file mode 100644 index 5a6aa3fe1..000000000 --- a/Projects/Services/APIKit/Sources/API/NoticeAPI.swift +++ /dev/null @@ -1,74 +0,0 @@ -// -// NoticeAPI.swift -// APIKit -// -// Created by KTH on 2023/04/04. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import Moya -import DataMappingModule -import ErrorModule - -public enum NoticeAPI { - case fetchNotice(type: NoticeType) - case fetchNoticeCategories -} - -extension NoticeAPI: WMAPI { - public var domain: WMDomain { - switch self{ - case .fetchNotice, - .fetchNoticeCategories: - return .notice - } - } - - public var urlPath: String { - switch self { - case let .fetchNotice(type): - return type.addPathString - case .fetchNoticeCategories: - return "/categories" - } - } - - public var method: Moya.Method { - switch self { - case .fetchNotice, - .fetchNoticeCategories: - return .get - } - } - - public var task: Moya.Task { - switch self { - case .fetchNotice: - return .requestParameters( - parameters: ["os": "ios", - "version": Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String ?? ""], - encoding: URLEncoding.queryString - ) - case .fetchNoticeCategories: - return .requestPlain - } - } - - public var jwtTokenType: JwtTokenType { - return .none - } - - public var errorMap: [Int: WMError] { - switch self { - default: - return [ - 400: .badRequest, - 401: .tokenExpired, - 404: .notFound, - 429: .tooManyRequest, - 500: .internalServerError - ] - } - } -} diff --git a/Projects/Services/APIKit/Sources/API/PlayAPI.swift b/Projects/Services/APIKit/Sources/API/PlayAPI.swift deleted file mode 100644 index 6db71d1d2..000000000 --- a/Projects/Services/APIKit/Sources/API/PlayAPI.swift +++ /dev/null @@ -1,52 +0,0 @@ -import Moya -import KeychainModule -import DataMappingModule -import ErrorModule -import Foundation - -public enum PlayAPI { - case postPlaybackLog(item: Data) -} -extension PlayAPI: WMAPI { - public var domain: WMDomain { - return .play - } - - public var urlPath: String { - switch self { - case .postPlaybackLog: - return "" - } - } - - public var method: Moya.Method { - switch self { - case .postPlaybackLog: - return .post - } - } - - public var task: Moya.Task { - switch self { - case let .postPlaybackLog(item): - return .requestData(item) - } - } - - public var jwtTokenType: JwtTokenType { - return .accessToken - } - - public var errorMap: [Int: WMError] { - switch self { - default: - return [ - 400: .badRequest, - 401: .tokenExpired, - 404: .notFound, - 429: .tooManyRequest, - 500: .internalServerError - ] - } - } -} diff --git a/Projects/Services/APIKit/Sources/API/PlayListAPI.swift b/Projects/Services/APIKit/Sources/API/PlayListAPI.swift deleted file mode 100644 index 5078df708..000000000 --- a/Projects/Services/APIKit/Sources/API/PlayListAPI.swift +++ /dev/null @@ -1,131 +0,0 @@ -import Moya -import KeychainModule -import DataMappingModule -import ErrorModule -import Foundation - - -public struct AddSongRequest:Encodable { - var songs:[String] -} - -public struct CreatePlayListRequset:Encodable { - var title:String - var image:String -} - -public struct SongsKeyBody:Encodable { - var songs:[String] -} -public struct EditPlayListNameRequset:Encodable { - var title:String -} - - -public enum PlayListAPI { - case fetchRecommendPlayList - case fetchPlayListDetail(id:String,type:PlayListType) - case createPlayList(title:String) - case editPlayList(key:String,songs:[String]) - case editPlayListName(key:String,title:String) - case deletePlayList(key:String) - case removeSongs(key:String,songs:[String]) - case loadPlayList(key:String) - case addSongIntoPlayList(key:String,songs:[String]) -} - -extension PlayListAPI: WMAPI { - public var domain: WMDomain { - .playlist - } - - public var urlPath: String { - switch self { - case .fetchRecommendPlayList: - return "/recommended" - case .fetchPlayListDetail(id: let id, type: let type): - switch type { - case .custom: - return "/\(id)/detail" - case .wmRecommend: - return "/recommended/\(id)" - } - case .createPlayList: - return "/create" - case .deletePlayList(key: let key): - return "/\(key)/delete" - case .loadPlayList(key: let key): - return "/\(key)/addToMyPlaylist" - case .editPlayList(key: let key,_): - return "/\(key)/edit" - case .editPlayListName(key: let key,_): - return "/\(key)/edit/title" - case .addSongIntoPlayList(key: let key,_): - return "/\(key)/songs/add" - case .removeSongs(key: let key,_): - return "/\(key)/songs/remove" - } - } - - public var method: Moya.Method { - switch self { - case .fetchRecommendPlayList,.fetchPlayListDetail: - return .get - case .createPlayList,.loadPlayList,.addSongIntoPlayList: - return .post - case .editPlayList,.editPlayListName,.removeSongs: - return .patch - case .deletePlayList: - return .delete - } - } - - public var task: Moya.Task { - switch self { - case .fetchRecommendPlayList: - return .requestPlain - - case .fetchPlayListDetail,.deletePlayList,.loadPlayList: - return .requestPlain - - case .createPlayList(title: let title): - return .requestJSONEncodable(CreatePlayListRequset(title: title, image: String(Int.random(in: 1...11)))) - - case .editPlayList(_,songs: let songs): - return .requestJSONEncodable(SongsKeyBody(songs: songs)) - - case .editPlayListName(_, title: let title): - return .requestJSONEncodable(EditPlayListNameRequset(title: title)) - - case . addSongIntoPlayList(_, songs: let songs): - return .requestJSONEncodable(AddSongRequest(songs: songs)) - - case .removeSongs(_, songs: let songs): - return .requestJSONEncodable(SongsKeyBody(songs: songs)) - } - } - - public var jwtTokenType: JwtTokenType { - switch self { - case .fetchRecommendPlayList,.fetchPlayListDetail: - return .none - - case .createPlayList,.editPlayList,.deletePlayList,.loadPlayList,.editPlayListName,.addSongIntoPlayList,.removeSongs: - return .accessToken - } - } - - public var errorMap: [Int: WMError] { - switch self { - default: - return [ - 400: .badRequest, - 401: .tokenExpired, - 404: .notFound, - 409: .conflict, - 429: .tooManyRequest, - 500: .internalServerError - ] - } - } -} diff --git a/Projects/Services/APIKit/Sources/API/QnaAPI.swift b/Projects/Services/APIKit/Sources/API/QnaAPI.swift deleted file mode 100644 index d585c11cb..000000000 --- a/Projects/Services/APIKit/Sources/API/QnaAPI.swift +++ /dev/null @@ -1,57 +0,0 @@ -import Moya -import DataMappingModule -import ErrorModule -import Foundation -import KeychainModule - -public enum QnaAPI { - case fetchQnaCategories - case fetchQna -} - -extension QnaAPI: WMAPI { - - public var domain: WMDomain { - .qna - } - - public var urlPath: String { - switch self { - case .fetchQnaCategories: - return "/categories" - case .fetchQna: - return "/" - } - } - - public var method: Moya.Method { - switch self { - case .fetchQnaCategories,.fetchQna: - return .get - } - } - - public var task: Moya.Task { - switch self { - case .fetchQnaCategories,.fetchQna: - return .requestPlain - } - } - - public var jwtTokenType: JwtTokenType { - return .none - } - - public var errorMap: [Int: WMError] { - switch self { - default: - return [ - 400: .badRequest, - 401: .tokenExpired, - 404: .notFound, - 429: .tooManyRequest, - 500: .internalServerError - ] - } - } -} diff --git a/Projects/Services/APIKit/Sources/API/SongsAPI.swift b/Projects/Services/APIKit/Sources/API/SongsAPI.swift deleted file mode 100644 index 75fe30485..000000000 --- a/Projects/Services/APIKit/Sources/API/SongsAPI.swift +++ /dev/null @@ -1,80 +0,0 @@ -import Moya -import DataMappingModule -import ErrorModule -import Foundation - -public enum SongsAPI { - case fetchSearchSong(type: SearchType, keyword: String) - case fetchLyrics(id: String) - case fetchNewSongs(type: NewSongGroupType, page: Int, limit: Int) -} - -extension SongsAPI: WMAPI { - public var domain: WMDomain { - return .songs - } - - public var path: String { - switch self { - case .fetchNewSongs: - return "/\(WMDOMAIN_V2_SONGS())" + urlPath - default: - return domain.asURLString + urlPath - } - } - - public var urlPath: String { - switch self { - case .fetchSearchSong: - return "/search" - case .fetchLyrics(id: let id): - return "/lyrics/\(id)" - case let .fetchNewSongs(type, _, _): - return "/new/\(type.apiKey)" - } - } - - public var method: Moya.Method { - return .get - } - - public var task: Moya.Task { - switch self { - case let .fetchSearchSong(type,keyword): - return .requestParameters(parameters: [ - "type": type.rawValue, - "sort": "popular", //기본 인기순으로 - "keyword": keyword - ], encoding: URLEncoding.queryString) - - case .fetchLyrics: - return .requestPlain - - case let .fetchNewSongs(_, page, limit): - return .requestParameters( - parameters: [ - "limit": limit, - "start": (page == 1) ? 0 : (page - 1) * limit - ], - encoding: URLEncoding.queryString - ) - } - } - - public var jwtTokenType: JwtTokenType { - return .none - } - - public var errorMap: [Int: WMError] { - switch self { - default: - return [ - 400: .badRequest, - 401: .tokenExpired, - 404: .notFound, - 429: .tooManyRequest, - 500: .internalServerError - ] - } - } -} diff --git a/Projects/Services/APIKit/Sources/API/SuggestAPI.swift b/Projects/Services/APIKit/Sources/API/SuggestAPI.swift deleted file mode 100644 index 870a25ce3..000000000 --- a/Projects/Services/APIKit/Sources/API/SuggestAPI.swift +++ /dev/null @@ -1,150 +0,0 @@ -// -// SuggestAPI.swift -// APIKit -// -// Created by KTH on 2023/04/09. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Moya -import DataMappingModule -import ErrorModule -import Foundation -import KeychainModule - -public enum SuggestAPI { - case reportBug(userID: String, nickname: String, attaches: [String], content: String) - case suggestFunction(type: SuggestPlatformType, userID: String, content: String) - case modifySong(type: SuggestSongModifyType, userID: String, artist: String, songTitle: String, youtubeLink: String, content: String) - case inquiryWeeklyChart(userID: String, content: String) -} - -extension SuggestAPI: WMAPI { - public var baseURL: URL { - switch self { - case .reportBug, - .suggestFunction, - .modifySong, - .inquiryWeeklyChart: - return URL(string: WAKENTER_BASE_URL())! - } - } - - public var domain: WMDomain { - switch self { - case .reportBug, - .suggestFunction, - .modifySong, - .inquiryWeeklyChart: - return .suggest - } - } - - public var urlPath: String { - switch self { - case .reportBug: - return "/bug" - case .suggestFunction: - return "/feature" - case .modifySong: - return "/music" - case .inquiryWeeklyChart: - return "/weekly" - } - } - - public var method: Moya.Method { - switch self { - case .reportBug, .suggestFunction, .modifySong, .inquiryWeeklyChart: - return .put - } - } - - public var headers: [String : String]? { - switch self { - case .reportBug, .suggestFunction, .modifySong, .inquiryWeeklyChart: - return ["Content-Type": "application/json"] - } - } - - public var task: Moya.Task { - switch self { - case let .reportBug(userID, nickname, attaches, content): - let version = ProcessInfo.processInfo.operatingSystemVersion - let versionString = "\(version.majorVersion).\(version.minorVersion).\(version.patchVersion)" - let osName: String = { - #if os(iOS) - #if targetEnvironment(macCatalyst) - return "macOS(Catalyst)" - #else - return "iOS" - #endif - #elseif os(watchOS) - return "watchOS" - #elseif os(tvOS) - return "tvOS" - #elseif os(macOS) - return "macOS" - #elseif os(Linux) - return "Linux" - #elseif os(Windows) - return "Windows" - #else - return "Unknown" - #endif - }() - var parameters: [String: Any] = ["userId": userID, - "detailContent": content, - "osVersion": "\(osName) \(versionString)", - "deviceModel": Device().modelName] - if !nickname.isEmpty { - parameters["nickname"] = nickname - } - if !attaches.isEmpty { - parameters["attachs"] = attaches - } - return .requestParameters(parameters: parameters, - encoding: JSONEncoding.default) - - case let .suggestFunction(type, userID, content): - return .requestParameters(parameters: ["userId": userID, - "platform": type.rawValue, - "detailContent": content], - encoding: JSONEncoding.default) - - case let .modifySong(type, userID, artist, songTitle, youtubeLink, content): - return .requestParameters(parameters: ["userId": userID, - "type": type.rawValue, - "artist": artist, - "musicTitle": songTitle, - "youtubeLink": youtubeLink, - "detailContent": content], - encoding: JSONEncoding.default) - - case let .inquiryWeeklyChart(userID, content): - return .requestParameters(parameters: ["userId": userID, - "detailContent": content], - encoding: JSONEncoding.default) - } - } - - public var jwtTokenType: JwtTokenType { - switch self { - case .reportBug, .suggestFunction, .modifySong, .inquiryWeeklyChart: - return .none - } - } - - public var errorMap: [Int: WMError] { - switch self { - default: - return [ - 400: .badRequest, - 401: .tokenExpired, - 404: .notFound, - 429: .tooManyRequest, - 500: .internalServerError - ] - } - } -} diff --git a/Projects/Services/APIKit/Sources/API/UserAPI.swift b/Projects/Services/APIKit/Sources/API/UserAPI.swift deleted file mode 100644 index 34324d3e8..000000000 --- a/Projects/Services/APIKit/Sources/API/UserAPI.swift +++ /dev/null @@ -1,125 +0,0 @@ -import Moya -import DataMappingModule -import ErrorModule -import Foundation -import KeychainModule - -public enum UserAPI { - case fetchProfileList - case setProfile(image: String) - case setUserName(name: String) - case fetchPlayList - case fetchFavoriteSongs - case editFavoriteSongsOrder(ids: [String]) - case editPlayListOrder(ids: [String]) - case deletePlayList(ids: [String]) - case deleteFavoriteList(ids: [String]) -} - -public struct RequsetProfileModel:Encodable { - var image:String -} - -public struct RequsetUserNameModel:Encodable { - var username:String -} - -public struct RequsetEditFavoriteSongs:Encodable { - var songs:[String] -} - -public struct RequsetEditPlayList:Encodable { - var playlists:[String] -} - -public struct RequsetDeletePlayList: Encodable { - var playlists:[String] -} - -public struct RequestDeleteFavoriteList: Encodable { - var songs: [String] -} - -extension UserAPI: WMAPI { - - public var domain: WMDomain { - .user - } - - public var urlPath: String { - switch self { - case .fetchProfileList: - return "/profile/list" - case .setProfile: - return "/profile/set" - case .setUserName: - return "/username" - case .fetchPlayList: - return "/playlists" - case .fetchFavoriteSongs: - return "/likes" - case .editFavoriteSongsOrder: - return "/likes/edit" - case .deleteFavoriteList: - return "/likes/delete" - case .editPlayListOrder: - return "/playlists/edit" - case .deletePlayList: - return "/playlists/delete" - } - } - - public var method: Moya.Method { - switch self { - case .setProfile, .setUserName: - return .post - case .fetchProfileList, .fetchPlayList,.fetchFavoriteSongs: - return .get - case .editFavoriteSongsOrder,.editPlayListOrder: - return .patch - case .deletePlayList, .deleteFavoriteList: - return .delete - } - } - - public var task: Moya.Task { - switch self { - case let .setProfile(image): - return .requestJSONEncodable(RequsetProfileModel(image: image)) - case let .setUserName(name): - return .requestJSONEncodable(RequsetUserNameModel(username: name)) - case .fetchProfileList, .fetchPlayList,.fetchFavoriteSongs: - return .requestPlain - case .editFavoriteSongsOrder(ids: let ids): - return .requestJSONEncodable(RequsetEditFavoriteSongs(songs: ids)) - case .editPlayListOrder(ids: let ids): - return .requestJSONEncodable(RequsetEditPlayList(playlists: ids)) - case let .deletePlayList(ids): - return .requestJSONEncodable(RequsetDeletePlayList(playlists: ids)) - case let .deleteFavoriteList(ids): - return .requestJSONEncodable(RequestDeleteFavoriteList(songs: ids)) - } - } - - public var jwtTokenType: JwtTokenType { - switch self { - case .fetchProfileList: - return .none - default : - return .accessToken - } - } - - public var errorMap: [Int: WMError] { - switch self { - default: - return [ - 400: .badRequest, - 401: .tokenExpired, - 404: .notFound, - 429: .tooManyRequest, - 500: .internalServerError - ] - } - } -} diff --git a/Projects/Services/APIKit/Sources/API/WMAPI.swift b/Projects/Services/APIKit/Sources/API/WMAPI.swift deleted file mode 100644 index cbb29ec3d..000000000 --- a/Projects/Services/APIKit/Sources/API/WMAPI.swift +++ /dev/null @@ -1,83 +0,0 @@ -import Moya -import Foundation -import ErrorModule -import KeychainModule - -public protocol WMAPI: TargetType, JwtAuthorizable { - var domain: WMDomain { get } - var urlPath: String { get } - var errorMap: [Int: WMError] { get } -} - -public extension WMAPI { - var baseURL: URL { - URL(string: BASE_URL())! - } - - var path: String { - domain.asURLString + urlPath - } - - var headers: [String: String]? { - ["Content-Type": "application/json"] - } - - var validationType: ValidationType { - return .successCodes - } -} - -public enum WMDomain: String { - case auth - case charts - case songs - case artist - case user - case playlist - case like - case naver - case qna - case notice - case suggest - case app - case play -} - -extension WMDomain { - var asURLString: String { - "/\(self.asDomainString)" - } -} - -extension WMDomain { - var asDomainString: String { - switch self { - case .auth: - return WMDOMAIN_AUTH() - case .charts: - return WMDOMAIN_CHARTS() - case .songs: - return WMDOMAIN_SONGS() - case .artist: - return WMDOMAIN_ARTIST() - case .user: - return WMDOMAIN_USER() - case .playlist: - return WMDOMAIN_PLAYLIST() - case .like: - return WMDOMAIN_LIKE() - case .naver: - return "/v1/nid/me" - case .qna: - return WMDOMAIN_QNA() - case .notice: - return WMDOMAIN_NOTICE() - case .suggest: - return WMDOMAIN_SUGGEST() - case .app: - return WMDOMAIN_APP() - case .play: - return WMDOMAIN_PLAY() - } - } -} diff --git a/Projects/Services/APIKit/Sources/Devices/Devices.swift b/Projects/Services/APIKit/Sources/Devices/Devices.swift deleted file mode 100644 index 04e912cc3..000000000 --- a/Projects/Services/APIKit/Sources/Devices/Devices.swift +++ /dev/null @@ -1,104 +0,0 @@ -// -// Devices.swift -// APIKit -// -// Created by KTH on 2023/05/13. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public struct Device { - public var modelName: String { - var systemInfo = utsname() - uname(&systemInfo) - let machineMirror = Mirror(reflecting: systemInfo.machine) - let identifier = machineMirror.children.reduce("") { identifier, element in - guard let value = element.value as? Int8, value != 0 else { return identifier } - return identifier + String(UnicodeScalar(UInt8(value))) - } - - switch identifier { - - //iPhone - case "iPhone3,1", "iPhone3,2", "iPhone3,3": return "iPhone 4" - case "iPhone4,1": return "iPhone 4s" - case "iPhone5,1", "iPhone5,2": return "iPhone 5" - case "iPhone5,3", "iPhone5,4": return "iPhone 5c" - case "iPhone6,1", "iPhone6,2": return "iPhone 5s" - case "iPhone7,2": return "iPhone 6" - case "iPhone7,1": return "iPhone 6 Plus" - case "iPhone8,1": return "iPhone 6s" - case "iPhone8,2": return "iPhone 6s Plus" - case "iPhone9,1", "iPhone9,3": return "iPhone 7" - case "iPhone9,2", "iPhone9,4": return "iPhone 7 Plus" - case "iPhone8,4": return "iPhone SE" - case "iPhone10,1", "iPhone10,4": return "iPhone 8" - case "iPhone10,2", "iPhone10,5": return "iPhone 8 Plus" - case "iPhone10,3", "iPhone10,6": return "iPhone X" - case "iPhone11,8": return "iPhone XR" - case "iPhone11,2": return "iPhone XS" - case "iPhone11,4", "iPhone11,6": return "iPhone XS MAX" - case "iPhone12,1" : return "iPhone 11" - case "iPhone12,3" : return "iPhone 11 Pro" - case "iPhone12,5" : return "iPhone 11 Pro Max" - case "iPhone12,8" : return "iPhone SE (2nd Gen)" - case "iPhone13,1" : return "iPhone 12 Mini" - case "iPhone13,2" : return "iPhone 12" - case "iPhone13,3" : return "iPhone 12 Pro" - case "iPhone13,4" : return "iPhone 12 Pro Max" - case "iPhone14,2" : return "iPhone 13 Pro" - case "iPhone14,3" : return "iPhone 13 Pro Max" - case "iPhone14,4" : return "iPhone 13 Mini" - case "iPhone14,5" : return "iPhone 13" - case "iPhone14,6" : return "iPhone SE (3rd Gen)" - case "iPhone14,7" : return "iPhone 14" - case "iPhone14,8" : return "iPhone 14 Plus" - case "iPhone15,2" : return "iPhone 14 Pro" - case "iPhone15,3" : return "iPhone 14 Pro Max" - case "iPhone15,4" : return "iPhone 15" - case "iPhone15,5" : return "iPhone 15 Plus" - case "iPhone16,1" : return "iPhone 15 Pro" - case "iPhone16,2" : return "iPhone 15 Pro Max" - - //iPod - case "iPod5,1": return "iPod Touch 5" - case "iPod7,1": return "iPod Touch 6" - case "iPod9,1": return "iPod touch 7" - - //iPad - case "iPad2,1", "iPad2,2", "iPad2,3", "iPad2,4":return "iPad 2" - case "iPad3,1", "iPad3,2", "iPad3,3": return "iPad (3rd Gen)" - case "iPad3,4", "iPad3,5", "iPad3,6": return "iPad (4th Gen)" - case "iPad6,11", "iPad6,12": return "iPad (5th Gen)" - case "iPad7,5", "iPad7,6": return "iPad (6th Gen)" - case "iPad7,11", "iPad7,12": return "iPad (7th Gen)" - case "iPad4,1", "iPad4,2", "iPad4,3": return "iPad Air" - case "iPad5,3", "iPad5,4": return "iPad Air 2" - case "iPad11,4", "iPad11,5": return "iPad Air (3rd Gen)" - case "iPad2,5", "iPad2,6", "iPad2,7": return "iPad mini" - case "iPad4,4", "iPad4,5", "iPad4,6": return "iPad mini 2" - case "iPad4,7", "iPad4,8", "iPad4,9": return "iPad mini 3" - case "iPad5,1", "iPad5,2": return "iPad mini 4" - case "iPad11,1", "iPad11,2": return "iPad mini (5th Gen)" - case "iPad6,3", "iPad6,4": return "iPad Pro (9.7-inch)" - case "iPad6,7", "iPad6,8": return "iPad Pro (12.9-inch)" - case "iPad7,1", "iPad7,2": return "iPad Pro (12.9-inch) (2nd Gen)" - case "iPad7,3", "iPad7,4": return "iPad Pro (10.5-inch)" - case "iPad8,1", "iPad8,2", "iPad8,3", "iPad8,4":return "iPad Pro (11-inch)" - case "iPad8,9": return "iPad Pro (11-inch) (2nd Gen)" - case "iPad8,5", "iPad8,6", "iPad8,7", "iPad8,8":return "iPad Pro (12.9-inch) (3rd Gen)" - case "iPad8,12": return "iPad Pro (12.9-inch) (4th Gen)" - - //ETC - case "AppleTV5,3": return "Apple TV" - case "AppleTV6,2": return "Apple TV 4K" - case "AudioAccessory1,1": return "HomePod" - - //Simulator - case "i386", "x86_64", "arm64": return "iPhone Simulator" - - default: return identifier - } - } -} diff --git a/Projects/Services/APIKit/Sources/Jwt/JwtAuthorizable.swift b/Projects/Services/APIKit/Sources/Jwt/JwtAuthorizable.swift deleted file mode 100644 index fcdb412af..000000000 --- a/Projects/Services/APIKit/Sources/Jwt/JwtAuthorizable.swift +++ /dev/null @@ -1,11 +0,0 @@ -import Moya - -public enum JwtTokenType: String { - case accessToken = "Authorization" - case refreshToken = "refresh-token" - case none -} - -public protocol JwtAuthorizable { - var jwtTokenType: JwtTokenType { get } -} diff --git a/Projects/Services/APIKit/Sources/Jwt/JwtPlugin.swift b/Projects/Services/APIKit/Sources/Jwt/JwtPlugin.swift deleted file mode 100644 index 34b518845..000000000 --- a/Projects/Services/APIKit/Sources/Jwt/JwtPlugin.swift +++ /dev/null @@ -1,52 +0,0 @@ -import Moya -import KeychainModule -import Foundation - -public struct JwtPlugin: PluginType { - private let keychain: any Keychain - - public init(keychain: any Keychain) { - self.keychain = keychain - } - - public func prepare( - _ request: URLRequest, - target: TargetType - ) -> URLRequest { - guard let jwtTokenType = (target as? JwtAuthorizable)?.jwtTokenType, - jwtTokenType != .none - else { return request } - var req = request - let token = "\(getToken(type: .accessToken))" - - req.addValue(token, forHTTPHeaderField: jwtTokenType.rawValue) - return req - } - - public func didReceive( - _ result: Result, - target: TargetType - ) { - switch result { - case let .success(res): - if let new = try? res.map(TokenDTO.self) { - saveToken(token: new) - } - default: - break - } - } -} - -private extension JwtPlugin { - func getToken(type: KeychainType) -> String { - switch type { - case .accessToken: - return "Bearer \(keychain.load(type: .accessToken))" - } - } - - func saveToken(token: TokenDTO) { - keychain.save(type: .accessToken, value: token.accessToken) - } -} diff --git a/Projects/Services/APIKit/Sources/Jwt/TokenDTO.swift b/Projects/Services/APIKit/Sources/Jwt/TokenDTO.swift deleted file mode 100644 index ab501a413..000000000 --- a/Projects/Services/APIKit/Sources/Jwt/TokenDTO.swift +++ /dev/null @@ -1,9 +0,0 @@ -import Foundation - -struct TokenDTO: Equatable, Decodable { - let accessToken: String - - enum CodingKeys: String, CodingKey { - case accessToken = "access_token" - } -} diff --git a/Projects/Services/APIKit/Sources/Logging/MoyaLogginPlugin.swift b/Projects/Services/APIKit/Sources/Logging/MoyaLogginPlugin.swift deleted file mode 100644 index b196da93e..000000000 --- a/Projects/Services/APIKit/Sources/Logging/MoyaLogginPlugin.swift +++ /dev/null @@ -1,67 +0,0 @@ -import Foundation -import Moya - -#if DEBUG - -public final class CustomLoggingPlugin: PluginType { - public init() {} - - public func willSend(_ request: RequestType, target: TargetType) { - guard let httpRequest = request.request else { - print("--> 유효하지 않은 요청") - return - } - let url = httpRequest.description - let method = httpRequest.httpMethod ?? "unknown method" - var log = "====================\n\n[\(method)] \(url)\n\n====================\n" - log.append("API: \(target)\n") - if let headers = httpRequest.allHTTPHeaderFields, !headers.isEmpty { - log.append("header: \(headers)\n") - } - if let body = httpRequest.httpBody, let bodyString = String(bytes: body, encoding: String.Encoding.utf8) { - log.append("\(bodyString)\n") - } - log.append("---------------- END \(method) -----------------------\n") - print(log) - } - - public func didReceive(_ result: Result, target: TargetType) { - switch result { - case let .success(response): - onSuceed(response, target: target, isFromError: false) - case let .failure(error): - onFail(error, target: target) - } - } - - func onSuceed(_ response: Response, target: TargetType, isFromError: Bool) { - let request = response.request - let url = request?.url?.absoluteString ?? "nil" - let statusCode = response.statusCode - var log = "------------------- 네트워크 통신 성공 -------------------" - log.append("\n[\(statusCode)] \(url)\n----------------------------------------------------\n") - log.append("API: \(target)\n") - response.response?.allHeaderFields.forEach { - log.append("\($0): \($1)\n") - } - if let reString = String(bytes: response.data, encoding: String.Encoding.utf8) { - log.append("\(reString)\n") - } - log.append("------------------- END HTTP (\(response.data.count)-byte body) -------------------\n") - print(log) - } - - func onFail(_ error: MoyaError, target: TargetType) { - if let response = error.response { - onSuceed(response, target: target, isFromError: true) - return - } - var log = "네트워크 오류" - log.append("<-- \(error.errorCode) \(target)\n") - log.append("\(error.failureReason ?? error.errorDescription ?? "unknown error")\n") - log.append("<-- END HTTP\n") - print(log) - } -} - -#endif diff --git a/Projects/Services/APIKit/Sources/Secrets/SecretURL.swift b/Projects/Services/APIKit/Sources/Secrets/SecretURL.swift deleted file mode 100644 index f0a5ad590..000000000 --- a/Projects/Services/APIKit/Sources/Secrets/SecretURL.swift +++ /dev/null @@ -1,73 +0,0 @@ -// -// SecretURL.swift -// APIKit -// -// Created by KTH on 2023/04/25. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public func config(key: String) -> String { - guard let secrets = Bundle.main.object(forInfoDictionaryKey: "Secrets") as? [String: Any] else { - return "" - } - return secrets[key] as? String ?? "not found key" -} - -//MARK: - BASE_URL -public func BASE_URL() -> String { - #if DEBUG - return config(key: "BASE_DEV_URL") - #else - return config(key: "BASE_PROD_URL") - #endif -} - -//MARK: - WAKENTER_BASE_URL -public func WAKENTER_BASE_URL() -> String { - return config(key: "WAKENTER_BASE_URL") -} - -//MARK: - WMDomain -public func WMDOMAIN_AUTH() -> String { - return config(key: "WMDOMAIN_AUTH") -} -public func WMDOMAIN_CHARTS() -> String { - return config(key: "WMDOMAIN_CHARTS") -} -public func WMDOMAIN_SONGS() -> String { - return config(key: "WMDOMAIN_SONGS") -} -public func WMDOMAIN_ARTIST() -> String { - return config(key: "WMDOMAIN_ARTIST") -} -public func WMDOMAIN_USER() -> String { - return config(key: "WMDOMAIN_USER") -} -public func WMDOMAIN_PLAYLIST() -> String { - return config(key: "WMDOMAIN_PLAYLIST") -} -public func WMDOMAIN_LIKE() -> String { - return config(key: "WMDOMAIN_LIKE") -} -public func WMDOMAIN_QNA() -> String { - return config(key: "WMDOMAIN_QNA") -} -public func WMDOMAIN_NOTICE() -> String { - return config(key: "WMDOMAIN_NOTICE") -} -public func WMDOMAIN_SUGGEST() -> String { - return config(key: "WMDOMAIN_SUGGEST") -} -public func WMDOMAIN_APP() -> String { - return config(key: "WMDOMAIN_APP") -} -public func WMDOMAIN_PLAY() -> String { - return config(key: "WMDOMAIN_PLAY") -} - -//MARK: - WMDomain V2 -public func WMDOMAIN_V2_SONGS() -> String { - return config(key: "WMDOMAIN_V2_SONGS") -} diff --git a/Projects/Services/APIKit/Tests/.gitkeep b/Projects/Services/APIKit/Tests/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/Projects/Services/APIKit/Tests/TargetTest.swift b/Projects/Services/APIKit/Tests/TargetTest.swift deleted file mode 100644 index b1cf79405..000000000 --- a/Projects/Services/APIKit/Tests/TargetTest.swift +++ /dev/null @@ -1,17 +0,0 @@ -import XCTest - -class TargetTests: XCTestCase { - - override func setUpWithError() throws { - // Put setup code here. This method is called before the invocation of each test method in the class. - } - - override func tearDownWithError() throws { - // Put teardown code here. This method is called after the invocation of each test method in the class. - } - - func testExample() throws { - XCTAssertEqual("A", "A") - } - -} diff --git a/Projects/Services/DataMappingModule/.swiftlint.yml b/Projects/Services/DataMappingModule/.swiftlint.yml deleted file mode 100644 index ff44f9f28..000000000 --- a/Projects/Services/DataMappingModule/.swiftlint.yml +++ /dev/null @@ -1,20 +0,0 @@ -excluded: - - "**/*/NeedleGenerated.swift" - - "Tuist" - - -force_cast: # From https://realm.github.io/SwiftLint/force_cast.html - warning # 강제 캐스팅은 error에서 warning으로 변경 - -disabled_rules: - - trailing_whitespace - - vertical_whitespace - - colon - - comma - - comment_spacing # 주석 여백 - - mark # //MARK 관련 warning - - opening_brace # 괄호 열 때 줄바꿈을 했는지 안했는지, (안했으면 warning) - - line_length # 한줄에 글자 수 제한 , warning: 120, error: 200 (default) - - statement_position # if는 반드시 else로 끝나야한다. - - identifier_name #변수명 글자 수 제한 - diff --git a/Projects/Services/DataMappingModule/Project.swift b/Projects/Services/DataMappingModule/Project.swift deleted file mode 100644 index 2b926c252..000000000 --- a/Projects/Services/DataMappingModule/Project.swift +++ /dev/null @@ -1,7 +0,0 @@ -import ProjectDescription -import ProjectDescriptionHelpers - -let project = Project.makeModule( - name: "DataMappingModule", - product: .staticFramework -) diff --git a/Projects/Services/DataMappingModule/Sources/App/Response/AppInfoDTO.swift b/Projects/Services/DataMappingModule/Sources/App/Response/AppInfoDTO.swift deleted file mode 100644 index 88944aab1..000000000 --- a/Projects/Services/DataMappingModule/Sources/App/Response/AppInfoDTO.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// CheckVersionResponseDTO.swift -// DataMappingModuleTests -// -// Created by yongbeomkwak on 2023/05/23. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public struct AppInfoDTO: Codable { - public let flag: AppInfoFlagType - public let title, description, version: String? - public let specialLogo: Bool? -} diff --git a/Projects/Services/DataMappingModule/Sources/Artist/Response/ArtistListResponseDTO.swift b/Projects/Services/DataMappingModule/Sources/Artist/Response/ArtistListResponseDTO.swift deleted file mode 100644 index 2954e2d9c..000000000 --- a/Projects/Services/DataMappingModule/Sources/Artist/Response/ArtistListResponseDTO.swift +++ /dev/null @@ -1,43 +0,0 @@ -// -// ArtistListResponseDTO.swift -// DataMappingModule -// -// Created by KTH on 2023/02/01. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public struct ArtistListResponseDTO: Codable, Equatable { - public let ID, name, short: String - public let title, description: String - public let color: [[String]]? - public let youtube, twitch, instagram: String? - public let graduated: Bool? - public let group: ArtistListResponseDTO.Group? - public let image: ArtistListResponseDTO.Image? - - public static func == (lhs: Self, rhs: Self) -> Bool { - return lhs.ID == rhs.ID - } - - private enum CodingKeys: String, CodingKey { - case ID = "artistId" - case title = "appTitle" - case group, image - case name, short, description - case color, youtube, twitch, instagram - case graduated - } -} - -public extension ArtistListResponseDTO { - struct Group: Codable { - public let en: String - public let kr: String - } - struct Image: Codable { - public let round: Int - public let square: Int - } -} diff --git a/Projects/Services/DataMappingModule/Sources/Artist/Response/ArtistSongListResponseDTO.swift b/Projects/Services/DataMappingModule/Sources/Artist/Response/ArtistSongListResponseDTO.swift deleted file mode 100644 index 34745761b..000000000 --- a/Projects/Services/DataMappingModule/Sources/Artist/Response/ArtistSongListResponseDTO.swift +++ /dev/null @@ -1,32 +0,0 @@ -// -// ArtistSongListResponseDTO.swift -// DataMappingModule -// -// Created by KTH on 2023/02/01. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public struct ArtistSongListResponseDTO: Codable, Equatable { - public let ID, title, artist, remix: String - public let reaction: String - public let date: Int - public let total: ArtistSongListResponseDTO.Total? - - public static func == (lhs: Self, rhs: Self) -> Bool { - return lhs.ID == rhs.ID - } - - enum CodingKeys: String, CodingKey { - case ID = "songId" - case title, artist, remix, reaction, date, total - } -} - -public extension ArtistSongListResponseDTO { - struct Total: Codable { - public let views: Int - public let last: Int - } -} diff --git a/Projects/Services/DataMappingModule/Sources/Auth/Response/AuthLoginResponseDTO.swift b/Projects/Services/DataMappingModule/Sources/Auth/Response/AuthLoginResponseDTO.swift deleted file mode 100644 index effbf45f4..000000000 --- a/Projects/Services/DataMappingModule/Sources/Auth/Response/AuthLoginResponseDTO.swift +++ /dev/null @@ -1,16 +0,0 @@ -// -// ArtistListResponseDTO.swift -// DataMappingModule -// -// Created by KTH on 2023/02/01. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public struct AuthLoginResponseDTO: Codable, Equatable { - public let token:String - public static func == (lhs: Self, rhs: Self) -> Bool { - return lhs.token == rhs.token - } -} diff --git a/Projects/Services/DataMappingModule/Sources/Auth/Response/AuthUserInfoResponseDTO.swift b/Projects/Services/DataMappingModule/Sources/Auth/Response/AuthUserInfoResponseDTO.swift deleted file mode 100644 index ba8f89199..000000000 --- a/Projects/Services/DataMappingModule/Sources/Auth/Response/AuthUserInfoResponseDTO.swift +++ /dev/null @@ -1,32 +0,0 @@ -// -// ArtistListResponseDTO.swift -// DataMappingModule -// -// Created by KTH on 2023/02/01. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public struct AuthUserInfoResponseDTO: Codable, Equatable { - public let id, platform, displayName :String - public let firstLoginTime: Int - public let first: Bool - public let profile: AuthUserInfoResponseDTO.Profile? - - public static func == (lhs: Self, rhs: Self) -> Bool { - return lhs.id == rhs.id - } - - enum CodingKeys: String, CodingKey { - case id = "userId" - case platform, displayName, firstLoginTime, first, profile - } -} - -public extension AuthUserInfoResponseDTO { - struct Profile: Codable { - public let type: String - public let version: Int - } -} diff --git a/Projects/Services/DataMappingModule/Sources/Auth/Response/NaverUserInfoResponseDTO.swift b/Projects/Services/DataMappingModule/Sources/Auth/Response/NaverUserInfoResponseDTO.swift deleted file mode 100644 index 57683be6a..000000000 --- a/Projects/Services/DataMappingModule/Sources/Auth/Response/NaverUserInfoResponseDTO.swift +++ /dev/null @@ -1,29 +0,0 @@ -// -// NaverUserInfoResponseDTO.swift -// DataMappingModule -// -// Created by yongbeomkwak on 2023/02/15. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public struct NaverUserInfoResponseDTO: Codable,Equatable{ - - public static func == (lhs: NaverUserInfoResponseDTO, rhs: NaverUserInfoResponseDTO) -> Bool { - lhs.response.id == rhs.response.id - } - - - public let resultcode, message: String - public let response: Response -} - - -public extension NaverUserInfoResponseDTO { - struct Response: Codable { - public let id, nickname: String - } -} - - diff --git a/Projects/Services/DataMappingModule/Sources/Base/AppInfoFlagType.swift b/Projects/Services/DataMappingModule/Sources/Base/AppInfoFlagType.swift deleted file mode 100644 index 4005ad1b1..000000000 --- a/Projects/Services/DataMappingModule/Sources/Base/AppInfoFlagType.swift +++ /dev/null @@ -1,17 +0,0 @@ -// -// AppInfoFlagType.swift -// DataMappingModule -// -// Created by KTH on 2023/05/24. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public enum AppInfoFlagType: Int, Codable { - case normal = 1 - case event - case update - case forceUpdate - case offline -} diff --git a/Projects/Services/DataMappingModule/Sources/Base/ArtistType.swift b/Projects/Services/DataMappingModule/Sources/Base/ArtistType.swift deleted file mode 100644 index b0778fc4f..000000000 --- a/Projects/Services/DataMappingModule/Sources/Base/ArtistType.swift +++ /dev/null @@ -1,26 +0,0 @@ -// -// ArtistType.swift -// DataMappingModule -// -// Created by KTH on 2023/02/01. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public enum ArtistSongSortType: String, Codable { - case new - case popular - case old - - public var display: String { - switch self { - case .new: - return "최신순" - case .popular: - return "인기순" - case .old: - return "과거순" - } - } -} diff --git a/Projects/Services/DataMappingModule/Sources/Base/BaseResponseDTO.swift b/Projects/Services/DataMappingModule/Sources/Base/BaseResponseDTO.swift deleted file mode 100644 index 8cacfff8c..000000000 --- a/Projects/Services/DataMappingModule/Sources/Base/BaseResponseDTO.swift +++ /dev/null @@ -1,13 +0,0 @@ -// -// BaseResponseDTO.swift -// DataMappingModule -// -// Created by KTH on 2023/02/18. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public struct BaseResponseDTO: Codable { - public let status: Int -} diff --git a/Projects/Services/DataMappingModule/Sources/Base/NoticeType.swift b/Projects/Services/DataMappingModule/Sources/Base/NoticeType.swift deleted file mode 100644 index a07b63eee..000000000 --- a/Projects/Services/DataMappingModule/Sources/Base/NoticeType.swift +++ /dev/null @@ -1,23 +0,0 @@ -// -// NoticeType.swift -// DataMappingModule -// -// Created by KTH on 2023/04/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public enum NoticeType: String { - case all - case currently - - public var addPathString: String { - switch self { - case .all: - return "/all" - case .currently: - return "" - } - } -} diff --git a/Projects/Services/DataMappingModule/Sources/Base/PlayListType.swift b/Projects/Services/DataMappingModule/Sources/Base/PlayListType.swift deleted file mode 100644 index a4f159d18..000000000 --- a/Projects/Services/DataMappingModule/Sources/Base/PlayListType.swift +++ /dev/null @@ -1,14 +0,0 @@ -// -// PlayListType.swift -// DataMappingModule -// -// Created by yongbeomkwak on 2023/02/11. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public enum PlayListType{ - case custom - case wmRecommend -} diff --git a/Projects/Services/DataMappingModule/Sources/Base/SearchType.swift b/Projects/Services/DataMappingModule/Sources/Base/SearchType.swift deleted file mode 100644 index 9a473b00c..000000000 --- a/Projects/Services/DataMappingModule/Sources/Base/SearchType.swift +++ /dev/null @@ -1,26 +0,0 @@ -// -// SearchType.swift -// DataMappingModule -// -// Created by yongbeomkwak on 2023/02/07. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public enum SearchType: String, Codable { - case title - case artist - case remix - - public var display: String { - switch self { - case .title: - return "title" - case .artist: - return "artist" - case .remix: - return "remix" - } - } -} diff --git a/Projects/Services/DataMappingModule/Sources/Base/SuggestType.swift b/Projects/Services/DataMappingModule/Sources/Base/SuggestType.swift deleted file mode 100644 index 64dc03455..000000000 --- a/Projects/Services/DataMappingModule/Sources/Base/SuggestType.swift +++ /dev/null @@ -1,19 +0,0 @@ -// -// SuggestType.swift -// DataMappingModule -// -// Created by KTH on 2023/04/09. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public enum SuggestPlatformType: String { - case mobile = "MOBILE" - case pc = "PC" -} - -public enum SuggestSongModifyType: String { - case add = "ADD" - case update = "UPDATE" -} diff --git a/Projects/Services/DataMappingModule/Sources/Chart/Response/FetchChartRankingResponseDTO.swift b/Projects/Services/DataMappingModule/Sources/Chart/Response/FetchChartRankingResponseDTO.swift deleted file mode 100644 index 0941b6329..000000000 --- a/Projects/Services/DataMappingModule/Sources/Chart/Response/FetchChartRankingResponseDTO.swift +++ /dev/null @@ -1,24 +0,0 @@ -import Foundation - -public struct SingleChartRankingResponseDTO: Codable, Equatable { - public let id, title, artist, remix, reaction: String - public let date, start, end: Int - public let monthly, weekly, daily, hourly, total: SingleChartRankingResponseDTO.ChartInfo? - - public static func == (lhs: Self, rhs: Self) -> Bool { - return lhs.id == rhs.id - } - - enum CodingKeys: String, CodingKey { - case id = "songId" - case title, artist, remix, reaction, date, start, end - case monthly, weekly, daily, hourly, total - } -} - -extension SingleChartRankingResponseDTO{ - public struct ChartInfo: Codable { - public let views, last: Int - public let increase: Int? - } -} diff --git a/Projects/Services/DataMappingModule/Sources/Like/Response/LikeResponseDTO.swift b/Projects/Services/DataMappingModule/Sources/Like/Response/LikeResponseDTO.swift deleted file mode 100644 index e2062b418..000000000 --- a/Projects/Services/DataMappingModule/Sources/Like/Response/LikeResponseDTO.swift +++ /dev/null @@ -1,14 +0,0 @@ -// -// LikeResponseDTO.swift -// DataMappingModuleTests -// -// Created by YoungK on 2023/04/03. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public struct LikeResponseDTO: Codable { - public let status: Int? - public let likes: Int -} diff --git a/Projects/Services/DataMappingModule/Sources/Notice/Response/FetchNoticeCategoriesResponseDTO.swift b/Projects/Services/DataMappingModule/Sources/Notice/Response/FetchNoticeCategoriesResponseDTO.swift deleted file mode 100644 index 92168498b..000000000 --- a/Projects/Services/DataMappingModule/Sources/Notice/Response/FetchNoticeCategoriesResponseDTO.swift +++ /dev/null @@ -1,13 +0,0 @@ -// -// FetchNoticeCategoriesResponseDTO.swift -// DataMappingModule -// -// Created by KTH on 2023/04/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public struct FetchNoticeCategoriesResponseDTO: Codable { - public let type, category: String -} diff --git a/Projects/Services/DataMappingModule/Sources/Notice/Response/FetchNoticeResponseDTO.swift b/Projects/Services/DataMappingModule/Sources/Notice/Response/FetchNoticeResponseDTO.swift deleted file mode 100644 index 8c97e4960..000000000 --- a/Projects/Services/DataMappingModule/Sources/Notice/Response/FetchNoticeResponseDTO.swift +++ /dev/null @@ -1,37 +0,0 @@ -// -// FetchNoticeResponseDTO.swift -// DataMappingModule -// -// Created by KTH on 2023/04/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public struct FetchNoticeResponseDTO: Codable, Equatable { - public let id: Int - public let title: String - public let thumbnail: String? - public let content: String? - public let images: [String] - public let createAt, startAt, endAt: Double - public let category: FetchNoticeResponseDTO.Category? - - public static func == (lhs: Self, rhs: Self) -> Bool { - return lhs.id == rhs.id - } - - enum CodingKeys: String, CodingKey { - case id, category, title, images, thumbnail - case content = "mainText" - case createAt - case startAt - case endAt - } -} - -public extension FetchNoticeResponseDTO { - struct Category: Codable { - public let type, category: String - } -} diff --git a/Projects/Services/DataMappingModule/Sources/Play/Reponse/PlaybackLogResponseDTO.swift b/Projects/Services/DataMappingModule/Sources/Play/Reponse/PlaybackLogResponseDTO.swift deleted file mode 100644 index 18c634971..000000000 --- a/Projects/Services/DataMappingModule/Sources/Play/Reponse/PlaybackLogResponseDTO.swift +++ /dev/null @@ -1,13 +0,0 @@ -// -// PlaybackLogResponseDTO.swift -// DataMappingModule -// -// Created by KTH on 2023/08/27. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public struct PlaybackLogResponseDTO: Decodable { - public let songId, title, artist: String -} diff --git a/Projects/Services/DataMappingModule/Sources/Playlist/Response/AddSongResponseDTO.swift b/Projects/Services/DataMappingModule/Sources/Playlist/Response/AddSongResponseDTO.swift deleted file mode 100644 index 452ffee25..000000000 --- a/Projects/Services/DataMappingModule/Sources/Playlist/Response/AddSongResponseDTO.swift +++ /dev/null @@ -1,9 +0,0 @@ -import Foundation - - -public struct AddSongResponseDTO: Decodable { - - public let status: Int - public let addedSongsLength: Int - public let duplicated: Bool -} diff --git a/Projects/Services/DataMappingModule/Sources/Playlist/Response/EditPlayListNameResponseDTO.swift b/Projects/Services/DataMappingModule/Sources/Playlist/Response/EditPlayListNameResponseDTO.swift deleted file mode 100644 index 5079c39ea..000000000 --- a/Projects/Services/DataMappingModule/Sources/Playlist/Response/EditPlayListNameResponseDTO.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// RecommendPlayListResponseDTO.swift -// DataMappingModuleTests -// -// Created by yongbeomkwak on 2023/02/10. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - - -public struct EditPlayListNameResponseDTO: Decodable { - public let title: String - public let status: Int -} diff --git a/Projects/Services/DataMappingModule/Sources/Playlist/Response/PlayListBaseResponseDTO.swift b/Projects/Services/DataMappingModule/Sources/Playlist/Response/PlayListBaseResponseDTO.swift deleted file mode 100644 index 009dba1d6..000000000 --- a/Projects/Services/DataMappingModule/Sources/Playlist/Response/PlayListBaseResponseDTO.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// RecommendPlayListResponseDTO.swift -// DataMappingModuleTests -// -// Created by yongbeomkwak on 2023/02/10. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - - -public struct PlayListBaseResponseDTO: Decodable { - public let key: String - public let status: Int -} diff --git a/Projects/Services/DataMappingModule/Sources/Playlist/Response/PlayListDetailResponseDTO.swift b/Projects/Services/DataMappingModule/Sources/Playlist/Response/PlayListDetailResponseDTO.swift deleted file mode 100644 index 95f6d8f68..000000000 --- a/Projects/Services/DataMappingModule/Sources/Playlist/Response/PlayListDetailResponseDTO.swift +++ /dev/null @@ -1,28 +0,0 @@ -// -// RecommendPlayListResponseDTO.swift -// DataMappingModuleTests -// -// Created by yongbeomkwak on 2023/02/10. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - - -public struct SinglePlayListDetailResponseDTO: Decodable { - public let title: String - public let songs: [SingleSongResponseDTO]? - public let `public`: Bool? - public let key: String? - public let image:SinglePlayListDetailResponseDTO.Image - -} - -extension SinglePlayListDetailResponseDTO { - public struct Image: Codable { - public let round:Int? - public let square:Int? - public let name:String? - public let version:Int? - } -} diff --git a/Projects/Services/DataMappingModule/Sources/Playlist/Response/RecommendPlayListResponseDTO.swift b/Projects/Services/DataMappingModule/Sources/Playlist/Response/RecommendPlayListResponseDTO.swift deleted file mode 100644 index 843f5121f..000000000 --- a/Projects/Services/DataMappingModule/Sources/Playlist/Response/RecommendPlayListResponseDTO.swift +++ /dev/null @@ -1,25 +0,0 @@ -// -// RecommendPlayListResponseDTO.swift -// DataMappingModuleTests -// -// Created by yongbeomkwak on 2023/02/10. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - - -public struct SingleRecommendPlayListResponseDTO: Decodable { - public let key, title: String - public let `public`: Bool - public let image:SingleRecommendPlayListResponseDTO.Image - - -} - -extension SingleRecommendPlayListResponseDTO { - public struct Image: Codable { - public let round:Int - public let square:Int - } -} diff --git a/Projects/Services/DataMappingModule/Sources/Qna/Response/QnaCategoryResponseDTO.swift b/Projects/Services/DataMappingModule/Sources/Qna/Response/QnaCategoryResponseDTO.swift deleted file mode 100644 index fa2ae675a..000000000 --- a/Projects/Services/DataMappingModule/Sources/Qna/Response/QnaCategoryResponseDTO.swift +++ /dev/null @@ -1,5 +0,0 @@ -import Foundation - -public struct QnaCategoryResponseDTO: Codable, Equatable { - public let type, category: String -} diff --git a/Projects/Services/DataMappingModule/Sources/Qna/Response/QnaResponseDTO.swift b/Projects/Services/DataMappingModule/Sources/Qna/Response/QnaResponseDTO.swift deleted file mode 100644 index c09d9df65..000000000 --- a/Projects/Services/DataMappingModule/Sources/Qna/Response/QnaResponseDTO.swift +++ /dev/null @@ -1,26 +0,0 @@ -// -// ArtistListResponseDTO.swift -// DataMappingModule -// -// Created by KTH on 2023/02/01. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public struct QnaResponseDTO: Decodable { - public let createAt: Int - public let question, description: String - public let category: QnaResponseDTO.Category? - - private enum CodingKeys: String, CodingKey { - case createAt, question, description, category - } -} - -public extension QnaResponseDTO { - struct Category: Codable { - public let type: String - public let category: String - } -} diff --git a/Projects/Services/DataMappingModule/Sources/Songs/Response/LyricsResponseDTO.swift b/Projects/Services/DataMappingModule/Sources/Songs/Response/LyricsResponseDTO.swift deleted file mode 100644 index 0f57a7e7b..000000000 --- a/Projects/Services/DataMappingModule/Sources/Songs/Response/LyricsResponseDTO.swift +++ /dev/null @@ -1,14 +0,0 @@ -// -// LyricsResponseDTO.swift -// DataMappingModule -// -// Created by YoungK on 2023/02/22. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public struct LyricsResponseDTO: Decodable { - public let identifier, text, styles: String - public let start, end: Double -} diff --git a/Projects/Services/DataMappingModule/Sources/Songs/Response/NewSongsResponseDTO.swift b/Projects/Services/DataMappingModule/Sources/Songs/Response/NewSongsResponseDTO.swift deleted file mode 100644 index 4a2cc7696..000000000 --- a/Projects/Services/DataMappingModule/Sources/Songs/Response/NewSongsResponseDTO.swift +++ /dev/null @@ -1,32 +0,0 @@ -// -// NewSongsResponseDTO.swift -// DataMappingModule -// -// Created by KTH on 2023/11/15. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public struct NewSongsResponseDTO: Decodable { - public let id, title, artist: String - public let remix, reaction: String - public let date: Int - public let total: NewSongsResponseDTO.Total? - - public static func == (lhs: Self, rhs: Self) -> Bool { - return lhs.id == rhs.id - } - - enum CodingKeys: String, CodingKey { - case id = "songId" - case title, artist, remix, reaction, date, total - } -} - -public extension NewSongsResponseDTO { - struct Total: Codable { - public let views: Int - public let last: Int - } -} diff --git a/Projects/Services/DataMappingModule/Sources/Songs/Response/SongResponseDTO.swift b/Projects/Services/DataMappingModule/Sources/Songs/Response/SongResponseDTO.swift deleted file mode 100644 index 197c7b615..000000000 --- a/Projects/Services/DataMappingModule/Sources/Songs/Response/SongResponseDTO.swift +++ /dev/null @@ -1,32 +0,0 @@ -// -// SearchSongResponseDTO.swift -// DataMappingModule -// -// Created by yongbeomkwak on 2023/02/07. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - - -public struct SingleSongResponseDTO: Decodable { - public let id, title, artist, remix,reaction: String - public let date, start, end: Int - public let total:SingleSongResponseDTO.Total - - enum CodingKeys: String, CodingKey { - case title, artist, remix,reaction,date,start,end,total - case id = "songId" - - } -} - - -extension SingleSongResponseDTO{ - - public struct Total: Codable { - public let views,last:Int - public let increase:Int? - } - -} diff --git a/Projects/Services/DataMappingModule/Sources/Suggest/Response/InquiryWeeklyChartResponseDTO.swift b/Projects/Services/DataMappingModule/Sources/Suggest/Response/InquiryWeeklyChartResponseDTO.swift deleted file mode 100644 index ba48845ed..000000000 --- a/Projects/Services/DataMappingModule/Sources/Suggest/Response/InquiryWeeklyChartResponseDTO.swift +++ /dev/null @@ -1,14 +0,0 @@ -// -// InquiryWeeklyChartResponseDTO.swift -// DataMappingModuleTests -// -// Created by KTH on 2023/04/14. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public struct InquiryWeeklyChartResponseDTO: Codable { - public let status: Int? - public let message: String? -} diff --git a/Projects/Services/DataMappingModule/Sources/Suggest/Response/ModifySongResponseDTO.swift b/Projects/Services/DataMappingModule/Sources/Suggest/Response/ModifySongResponseDTO.swift deleted file mode 100644 index 1275a25a3..000000000 --- a/Projects/Services/DataMappingModule/Sources/Suggest/Response/ModifySongResponseDTO.swift +++ /dev/null @@ -1,14 +0,0 @@ -// -// ModifySongResponseDTO.swift -// DataMappingModuleTests -// -// Created by KTH on 2023/04/14. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public struct ModifySongResponseDTO: Codable { - public let status: Int? - public let message: String? -} diff --git a/Projects/Services/DataMappingModule/Sources/Suggest/Response/ReportBugResponseDTO.swift b/Projects/Services/DataMappingModule/Sources/Suggest/Response/ReportBugResponseDTO.swift deleted file mode 100644 index faa988620..000000000 --- a/Projects/Services/DataMappingModule/Sources/Suggest/Response/ReportBugResponseDTO.swift +++ /dev/null @@ -1,14 +0,0 @@ -// -// ReportBugResponseDTO.swift -// DataMappingModuleTests -// -// Created by KTH on 2023/04/14. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public struct ReportBugResponseDTO: Codable { - public let status: Int? - public let message: String? -} diff --git a/Projects/Services/DataMappingModule/Sources/Suggest/Response/SuggestFunctionResponseDTO.swift b/Projects/Services/DataMappingModule/Sources/Suggest/Response/SuggestFunctionResponseDTO.swift deleted file mode 100644 index dab1697a4..000000000 --- a/Projects/Services/DataMappingModule/Sources/Suggest/Response/SuggestFunctionResponseDTO.swift +++ /dev/null @@ -1,14 +0,0 @@ -// -// SuggestFunctionResponseDTO.swift -// DataMappingModuleTests -// -// Created by KTH on 2023/04/14. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public struct SuggestFunctionResponseDTO: Codable { - public let status: Int? - public let message: String? -} diff --git a/Projects/Services/DataMappingModule/Sources/User/Response/FavoriteSongsResponseDTO.swift b/Projects/Services/DataMappingModule/Sources/User/Response/FavoriteSongsResponseDTO.swift deleted file mode 100644 index bf8accfd2..000000000 --- a/Projects/Services/DataMappingModule/Sources/User/Response/FavoriteSongsResponseDTO.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// ArtistListResponseDTO.swift -// DataMappingModule -// -// Created by KTH on 2023/02/01. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public struct FavoriteSongsResponseDTO: Decodable { - public let likes: Int - public let song: SingleSongResponseDTO - -} diff --git a/Projects/Services/DataMappingModule/Sources/User/Response/FetchProfileListResponseDTO.swift b/Projects/Services/DataMappingModule/Sources/User/Response/FetchProfileListResponseDTO.swift deleted file mode 100644 index 60fad50b0..000000000 --- a/Projects/Services/DataMappingModule/Sources/User/Response/FetchProfileListResponseDTO.swift +++ /dev/null @@ -1,14 +0,0 @@ -// -// FetchProfileListResponseDTO.swift -// DataMappingModule -// -// Created by KTH on 2023/02/18. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public struct FetchProfileListResponseDTO: Decodable, Equatable { - public let type: String? - public let version: Int -} diff --git a/Projects/Services/DataMappingModule/Sources/User/Response/PlayListResponseDTO.swift b/Projects/Services/DataMappingModule/Sources/User/Response/PlayListResponseDTO.swift deleted file mode 100644 index c653e37e7..000000000 --- a/Projects/Services/DataMappingModule/Sources/User/Response/PlayListResponseDTO.swift +++ /dev/null @@ -1,51 +0,0 @@ -// -// ArtistListResponseDTO.swift -// DataMappingModule -// -// Created by KTH on 2023/02/01. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public struct PlayListResponseDTO: Decodable{ - public let title: String - public let key: String? - public let user: PlayListResponseDTO.User - public let image: PlayListResponseDTO.Image - public let songs: [PlayListResponseDTO.Song] - public var isSelected: Bool? - - public struct User: Codable { - public let displayName:String - public let profile:Profile - } - - public struct Profile: Codable { - public let type:String - public let version:Int - } - - public struct Image: Codable { - public let name:String - public let version:Int - } - - public struct Song: Codable { - public let songId: String - public let title: String - public let artist: String - public let remix: String - public let reaction: String - public let date: Int - public let total: PlayListResponseDTO.Song.Total - } -} - -public extension PlayListResponseDTO.Song{ - struct Total: Codable { - public let views: Int - public let increase: Int - public let last: Int - } -} diff --git a/Projects/Services/DataMappingModule/Tests/TargetTest.swift b/Projects/Services/DataMappingModule/Tests/TargetTest.swift deleted file mode 100644 index b1cf79405..000000000 --- a/Projects/Services/DataMappingModule/Tests/TargetTest.swift +++ /dev/null @@ -1,17 +0,0 @@ -import XCTest - -class TargetTests: XCTestCase { - - override func setUpWithError() throws { - // Put setup code here. This method is called before the invocation of each test method in the class. - } - - override func tearDownWithError() throws { - // Put teardown code here. This method is called after the invocation of each test method in the class. - } - - func testExample() throws { - XCTAssertEqual("A", "A") - } - -} diff --git a/Projects/Services/DataModule/.swiftlint.yml b/Projects/Services/DataModule/.swiftlint.yml deleted file mode 100644 index ff44f9f28..000000000 --- a/Projects/Services/DataModule/.swiftlint.yml +++ /dev/null @@ -1,20 +0,0 @@ -excluded: - - "**/*/NeedleGenerated.swift" - - "Tuist" - - -force_cast: # From https://realm.github.io/SwiftLint/force_cast.html - warning # 강제 캐스팅은 error에서 warning으로 변경 - -disabled_rules: - - trailing_whitespace - - vertical_whitespace - - colon - - comma - - comment_spacing # 주석 여백 - - mark # //MARK 관련 warning - - opening_brace # 괄호 열 때 줄바꿈을 했는지 안했는지, (안했으면 warning) - - line_length # 한줄에 글자 수 제한 , warning: 120, error: 200 (default) - - statement_position # if는 반드시 else로 끝나야한다. - - identifier_name #변수명 글자 수 제한 - diff --git a/Projects/Services/DataModule/Project.swift b/Projects/Services/DataModule/Project.swift deleted file mode 100644 index f404013b0..000000000 --- a/Projects/Services/DataModule/Project.swift +++ /dev/null @@ -1,12 +0,0 @@ -import ProjectDescription -import ProjectDescriptionHelpers - -let project = Project.makeModule( - name: "DataModule", - product: .staticFramework, - dependencies: [ - .Project.Service.Domain, - .Project.Service.DatabaseModule, - .Project.Service.NetworkModule - ] -) diff --git a/Projects/Services/DataModule/Sources/App/Repositories/AppRepositoryImpl.swift b/Projects/Services/DataModule/Sources/App/Repositories/AppRepositoryImpl.swift deleted file mode 100644 index 57fb4445a..000000000 --- a/Projects/Services/DataModule/Sources/App/Repositories/AppRepositoryImpl.swift +++ /dev/null @@ -1,30 +0,0 @@ -// -// AppRepositoryImpl.swift -// DataModule -// -// Created by yongbeomkwak on 2023/05/23. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import DataMappingModule -import DomainModule -import ErrorModule -import NetworkModule -import DatabaseModule -import RxSwift - -public struct AppRepositoryImpl :AppRepository { - private let remoteAppDataSource: any RemoteAppDataSource - - public init( - remoteAppDataSource: RemoteAppDataSource - ) { - self.remoteAppDataSource = remoteAppDataSource - } - - public func fetchCheckApp() -> Single { - remoteAppDataSource.fetchCheckApp() - } - - -} diff --git a/Projects/Services/DataModule/Sources/App/UseCases/FetchCheckVersionUseCaseImpl.swift b/Projects/Services/DataModule/Sources/App/UseCases/FetchCheckVersionUseCaseImpl.swift deleted file mode 100644 index e674b5dd6..000000000 --- a/Projects/Services/DataModule/Sources/App/UseCases/FetchCheckVersionUseCaseImpl.swift +++ /dev/null @@ -1,30 +0,0 @@ -// -// FetchCheckVersionUseCaseImpl.swift -// DataModule -// -// Created by yongbeomkwak on 2023/05/23. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule - -public struct FetchCheckAppUseCaseImpl: FetchCheckAppUseCase { - - private let appRepository: any AppRepository - - public init( - appRepository: AppRepository - ) { - self.appRepository = appRepository - } - - public func execute() -> Single { - appRepository.fetchCheckApp() - } - - -} diff --git a/Projects/Services/DataModule/Sources/Artist/Repositories/ArtistRepositoryImpl.swift b/Projects/Services/DataModule/Sources/Artist/Repositories/ArtistRepositoryImpl.swift deleted file mode 100644 index 69986819f..000000000 --- a/Projects/Services/DataModule/Sources/Artist/Repositories/ArtistRepositoryImpl.swift +++ /dev/null @@ -1,32 +0,0 @@ -// -// ArtistRepositoryImpl.swift -// DataModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import DataMappingModule -import DomainModule -import ErrorModule -import NetworkModule -import DatabaseModule -import RxSwift - -public struct ArtistRepositoryImpl: ArtistRepository { - private let remoteArtistDataSource: any RemoteArtistDataSource - - public init( - remoteArtistDataSource: RemoteArtistDataSource - ) { - self.remoteArtistDataSource = remoteArtistDataSource - } - - public func fetchArtistList() -> Single<[ArtistListEntity]> { - remoteArtistDataSource.fetchArtistList() - } - - public func fetchArtistSongList(id: String, sort: ArtistSongSortType, page: Int) -> Single<[ArtistSongListEntity]> { - remoteArtistDataSource.fetchArtistSongList(id: id, sort: sort, page: page) - } -} diff --git a/Projects/Services/DataModule/Sources/Artist/UseCases/FetchArtistListUseCaseImpl.swift b/Projects/Services/DataModule/Sources/Artist/UseCases/FetchArtistListUseCaseImpl.swift deleted file mode 100644 index 7e3ebc37c..000000000 --- a/Projects/Services/DataModule/Sources/Artist/UseCases/FetchArtistListUseCaseImpl.swift +++ /dev/null @@ -1,28 +0,0 @@ -// -// FetchArtistListUseCaseImpl.swift -// DataModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule - -public struct FetchArtistListUseCaseImpl: FetchArtistListUseCase { - - private let artistRepository: any ArtistRepository - - public init( - artistRepository: ArtistRepository - ) { - self.artistRepository = artistRepository - } - - public func execute() -> Single<[ArtistListEntity]> { - artistRepository.fetchArtistList() - } -} diff --git a/Projects/Services/DataModule/Sources/Artist/UseCases/FetchArtistSongListUseCaseImpl.swift b/Projects/Services/DataModule/Sources/Artist/UseCases/FetchArtistSongListUseCaseImpl.swift deleted file mode 100644 index 3ec11df87..000000000 --- a/Projects/Services/DataModule/Sources/Artist/UseCases/FetchArtistSongListUseCaseImpl.swift +++ /dev/null @@ -1,28 +0,0 @@ -// -// FetchArtistSongListUseCaseImpl.swift -// DataModule -// -// Created by KTH on 2023/02/10. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule - -public struct FetchArtistSongListUseCaseImpl: FetchArtistSongListUseCase { - - private let artistRepository: any ArtistRepository - - public init( - artistRepository: ArtistRepository - ) { - self.artistRepository = artistRepository - } - - public func execute(id: String, sort: ArtistSongSortType, page: Int) -> Single<[ArtistSongListEntity]> { - artistRepository.fetchArtistSongList(id: id, sort: sort, page: page) - } -} diff --git a/Projects/Services/DataModule/Sources/Auth/Repositories/AuthRepositoryImpl.swift b/Projects/Services/DataModule/Sources/Auth/Repositories/AuthRepositoryImpl.swift deleted file mode 100644 index 8277d7da8..000000000 --- a/Projects/Services/DataModule/Sources/Auth/Repositories/AuthRepositoryImpl.swift +++ /dev/null @@ -1,50 +0,0 @@ -// -// ArtistRepositoryImpl.swift -// DataModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import DataMappingModule -import DomainModule -import ErrorModule -import NetworkModule -import DatabaseModule -import RxSwift - -public struct AuthRepositoryImpl: AuthRepository { - - - - - - - private let remoteAuthDataSource: any RemoteAuthDataSource - - public init(remoteAuthDataSource: RemoteAuthDataSource) { - self.remoteAuthDataSource = remoteAuthDataSource - } - - - public func fetchToken(token: String, type: ProviderType) -> Single { - remoteAuthDataSource.fetchToken(token: token, type: type) - } - - public func fetchNaverUserInfo(tokenType: String, accessToken: String) -> RxSwift.Single { - remoteAuthDataSource.fetchNaverUserInfo(tokenType: tokenType, accessToken: accessToken) - } - - public func fetchUserInfo() -> Single { - remoteAuthDataSource.fetchUserInfo() - } - - public func withdrawUserInfo() -> Single { - remoteAuthDataSource.withdrawUserInfo() - } - - - - - -} diff --git a/Projects/Services/DataModule/Sources/Auth/UseCases/FetchNaverUserInfoUseCaseImpl.swift b/Projects/Services/DataModule/Sources/Auth/UseCases/FetchNaverUserInfoUseCaseImpl.swift deleted file mode 100644 index e1056ff1a..000000000 --- a/Projects/Services/DataModule/Sources/Auth/UseCases/FetchNaverUserInfoUseCaseImpl.swift +++ /dev/null @@ -1,34 +0,0 @@ -// -// FetchArtistListUseCaseImpl.swift -// DataModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule - -public struct FetchNaverUserInfoUseCaseImpl: FetchNaverUserInfoUseCase { - - - - private let authRepository: any AuthRepository - - public init(authRepository: any AuthRepository) { - self.authRepository = authRepository - } - - - public func execute(tokenType: String, accessToken: String) -> Single { - authRepository.fetchNaverUserInfo(tokenType: tokenType, accessToken: accessToken) - } - - - - - -} diff --git a/Projects/Services/DataModule/Sources/Auth/UseCases/FetchTokenUseCaseImpl.swift b/Projects/Services/DataModule/Sources/Auth/UseCases/FetchTokenUseCaseImpl.swift deleted file mode 100644 index d1d9f25d3..000000000 --- a/Projects/Services/DataModule/Sources/Auth/UseCases/FetchTokenUseCaseImpl.swift +++ /dev/null @@ -1,31 +0,0 @@ -// -// FetchArtistListUseCaseImpl.swift -// DataModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule - -public struct FetchTokenUseCaseImpl: FetchTokenUseCase { - - private let authRepository: any AuthRepository - - public init(authRepository: any AuthRepository) { - self.authRepository = authRepository - } - - - public func execute(token: String, type:ProviderType) -> Single { - authRepository.fetchToken(token: token, type: type) - } - - - - -} diff --git a/Projects/Services/DataModule/Sources/Auth/UseCases/FetchUserInfoUseCaseImpl.swift b/Projects/Services/DataModule/Sources/Auth/UseCases/FetchUserInfoUseCaseImpl.swift deleted file mode 100644 index 4f2a5432d..000000000 --- a/Projects/Services/DataModule/Sources/Auth/UseCases/FetchUserInfoUseCaseImpl.swift +++ /dev/null @@ -1,33 +0,0 @@ -// -// FetchArtistListUseCaseImpl.swift -// DataModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule - -public struct FetchUserInfoUseCaseImpl: FetchUserInfoUseCase { - - - private let authRepository: any AuthRepository - - public init(authRepository: any AuthRepository) { - self.authRepository = authRepository - } - - public func execute() -> Single { - authRepository.fetchUserInfo() - } - - - - - - -} diff --git a/Projects/Services/DataModule/Sources/Auth/UseCases/WithdrawUserInfoUseCaseImpl.swift b/Projects/Services/DataModule/Sources/Auth/UseCases/WithdrawUserInfoUseCaseImpl.swift deleted file mode 100644 index a40269a92..000000000 --- a/Projects/Services/DataModule/Sources/Auth/UseCases/WithdrawUserInfoUseCaseImpl.swift +++ /dev/null @@ -1,37 +0,0 @@ -// -// FetchArtistListUseCaseImpl.swift -// DataModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule - -public struct WithdrawUserInfoUseCaseImpl: WithdrawUserInfoUseCase { - - - - - private let authRepository: any AuthRepository - - public init(authRepository: any AuthRepository) { - self.authRepository = authRepository - } - - public func execute() -> Single { - authRepository.withdrawUserInfo() - } - - - - - - - - -} diff --git a/Projects/Services/DataModule/Sources/Chart/Repositories/ChartRepositoryImpl.swift b/Projects/Services/DataModule/Sources/Chart/Repositories/ChartRepositoryImpl.swift deleted file mode 100644 index 7fe8a46a8..000000000 --- a/Projects/Services/DataModule/Sources/Chart/Repositories/ChartRepositoryImpl.swift +++ /dev/null @@ -1,33 +0,0 @@ -import DataMappingModule -import Foundation -import DomainModule -import ErrorModule -import NetworkModule -import DatabaseModule -import RxSwift - -public struct ChartRepositoryImpl: ChartRepository { - private let remoteChartDataSource: any RemoteChartDataSource - - public init( - remoteChartDataSource: RemoteChartDataSource - ) { - self.remoteChartDataSource = remoteChartDataSource - } - - public func fetchChartRanking( - type: ChartDateType, - limit: Int - ) -> Single<[ChartRankingEntity]> { - remoteChartDataSource.fetchChartRanking(type: type, limit: limit) - } - - public func fetchChartUpdateTime(type: ChartDateType) -> Single { - remoteChartDataSource.fetchChartUpdateTime(type: type) - .map { - let convert: TimeInterval = TimeInterval($0) ?? -1 - return convert == -1 ? - $0 : Date(timeIntervalSince1970: convert).changeDateFormatForChart() + " 업데이트" - } - } -} diff --git a/Projects/Services/DataModule/Sources/Chart/UseCases/FetchChartRankingUseCaseImpl.swift b/Projects/Services/DataModule/Sources/Chart/UseCases/FetchChartRankingUseCaseImpl.swift deleted file mode 100644 index 6410cd01d..000000000 --- a/Projects/Services/DataModule/Sources/Chart/UseCases/FetchChartRankingUseCaseImpl.swift +++ /dev/null @@ -1,18 +0,0 @@ -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule - -public struct FetchChartRankingUseCaseImpl: FetchChartRankingUseCase { - private let chartRepository: any ChartRepository - - public init( - chartRepository: ChartRepository - ) { - self.chartRepository = chartRepository - } - - public func execute(type: ChartDateType, limit: Int) -> Single<[ChartRankingEntity]> { - chartRepository.fetchChartRanking(type: type, limit: limit) - } -} diff --git a/Projects/Services/DataModule/Sources/Chart/UseCases/FetchChartUpdateTimeUseCaseImpl.swift b/Projects/Services/DataModule/Sources/Chart/UseCases/FetchChartUpdateTimeUseCaseImpl.swift deleted file mode 100644 index 99f01a5bb..000000000 --- a/Projects/Services/DataModule/Sources/Chart/UseCases/FetchChartUpdateTimeUseCaseImpl.swift +++ /dev/null @@ -1,18 +0,0 @@ -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule - -public struct FetchChartUpdateTimeUseCaseImpl: FetchChartUpdateTimeUseCase { - private let chartRepository: any ChartRepository - - public init( - chartRepository: ChartRepository - ) { - self.chartRepository = chartRepository - } - - public func execute(type: ChartDateType) -> Single { - chartRepository.fetchChartUpdateTime(type: type) - } -} diff --git a/Projects/Services/DataModule/Sources/Like/Repositories/LikeRepositoryImpl.swift b/Projects/Services/DataModule/Sources/Like/Repositories/LikeRepositoryImpl.swift deleted file mode 100644 index b62e28dab..000000000 --- a/Projects/Services/DataModule/Sources/Like/Repositories/LikeRepositoryImpl.swift +++ /dev/null @@ -1,39 +0,0 @@ -// -// ArtistRepositoryImpl.swift -// DataModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import DataMappingModule -import DomainModule -import ErrorModule -import NetworkModule -import DatabaseModule -import RxSwift - -public struct LikeRepositoryImpl: LikeRepository { - - private let remoteLikeDataSource: any RemoteLikeDataSource - - public init( - remoteLikeDataSource: RemoteLikeDataSource - ) { - self.remoteLikeDataSource = remoteLikeDataSource - } - - public func fetchLikeNumOfSong(id: String) -> Single { - remoteLikeDataSource.fetchLikeNumOfSong(id: id) - } - - public func addLikeSong(id: String) -> Single { - remoteLikeDataSource.addLikeSong(id: id) - } - - public func cancelLikeSong(id: String) -> Single { - remoteLikeDataSource.cancelLikeSong(id: id) - } - - -} diff --git a/Projects/Services/DataModule/Sources/Like/UseCases/FetchLikeNumOfSongUseCaseImpl.swift b/Projects/Services/DataModule/Sources/Like/UseCases/FetchLikeNumOfSongUseCaseImpl.swift deleted file mode 100644 index 96423e714..000000000 --- a/Projects/Services/DataModule/Sources/Like/UseCases/FetchLikeNumOfSongUseCaseImpl.swift +++ /dev/null @@ -1,31 +0,0 @@ -// -// FetchArtistListUseCaseImpl.swift -// DataModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule - -public struct FetchLikeNumOfSongUseCaseImpl: FetchLikeNumOfSongUseCase { - - - - private let likeRepository: any LikeRepository - - public init( - likeRepository: LikeRepository - ) { - self.likeRepository = likeRepository - } - - public func execute(id: String) -> Single { - likeRepository.fetchLikeNumOfSong(id: id) - } - -} diff --git a/Projects/Services/DataModule/Sources/Notice/Repositories/NoticeRepositoryImpl.swift b/Projects/Services/DataModule/Sources/Notice/Repositories/NoticeRepositoryImpl.swift deleted file mode 100644 index ac9ec48c4..000000000 --- a/Projects/Services/DataModule/Sources/Notice/Repositories/NoticeRepositoryImpl.swift +++ /dev/null @@ -1,33 +0,0 @@ -// -// NoticeRepositoryImpl.swift -// DataModule -// -// Created by KTH on 2023/04/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import DataMappingModule -import DomainModule -import ErrorModule -import NetworkModule -import DatabaseModule -import RxSwift - -public struct NoticeRepositoryImpl: NoticeRepository { - private let remoteNoticeDataSource: any RemoteNoticeDataSource - - public init( - remoteNoticeDataSource: RemoteNoticeDataSource - ) { - self.remoteNoticeDataSource = remoteNoticeDataSource - } - - public func fetchNotice(type: NoticeType) -> Single<[FetchNoticeEntity]> { - remoteNoticeDataSource.fetchNotice(type: type) - } - - public func fetchNoticeCategories() -> Single<[FetchNoticeCategoriesEntity]> { - remoteNoticeDataSource.fetchNoticeCategories() - } -} diff --git a/Projects/Services/DataModule/Sources/Notice/UseCases/FetchNoticeCategoriesUseCaseImpl.swift b/Projects/Services/DataModule/Sources/Notice/UseCases/FetchNoticeCategoriesUseCaseImpl.swift deleted file mode 100644 index b07e58fda..000000000 --- a/Projects/Services/DataModule/Sources/Notice/UseCases/FetchNoticeCategoriesUseCaseImpl.swift +++ /dev/null @@ -1,27 +0,0 @@ -// -// FetchNoticeCategoriesUseCaseImpl.swift -// DataModule -// -// Created by KTH on 2023/04/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule - -public struct FetchNoticeCategoriesUseCaseImpl: FetchNoticeCategoriesUseCase { - private let noticeRepository: any NoticeRepository - - public init( - noticeRepository: NoticeRepository - ) { - self.noticeRepository = noticeRepository - } - - public func execute() -> Single<[FetchNoticeCategoriesEntity]> { - noticeRepository.fetchNoticeCategories() - } -} diff --git a/Projects/Services/DataModule/Sources/Notice/UseCases/FetchNoticeUseCaseImpl.swift b/Projects/Services/DataModule/Sources/Notice/UseCases/FetchNoticeUseCaseImpl.swift deleted file mode 100644 index 5af51b3b6..000000000 --- a/Projects/Services/DataModule/Sources/Notice/UseCases/FetchNoticeUseCaseImpl.swift +++ /dev/null @@ -1,27 +0,0 @@ -// -// FetchNoticeUseCaseImpl.swift -// DataModule -// -// Created by KTH on 2023/04/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule - -public struct FetchNoticeUseCaseImpl: FetchNoticeUseCase { - private let noticeRepository: any NoticeRepository - - public init( - noticeRepository: NoticeRepository - ) { - self.noticeRepository = noticeRepository - } - - public func execute(type: NoticeType) -> Single<[FetchNoticeEntity]> { - noticeRepository.fetchNotice(type: type) - } -} diff --git a/Projects/Services/DataModule/Sources/Play/Repositories/PlayRepositoryImpl.swift b/Projects/Services/DataModule/Sources/Play/Repositories/PlayRepositoryImpl.swift deleted file mode 100644 index c4d9ee224..000000000 --- a/Projects/Services/DataModule/Sources/Play/Repositories/PlayRepositoryImpl.swift +++ /dev/null @@ -1,21 +0,0 @@ -import Foundation -import DataMappingModule -import DomainModule -import ErrorModule -import NetworkModule -import DatabaseModule -import RxSwift - -public struct PlayRepositoryImpl: PlayRepository { - private let remotePlayDataSource: any RemotePlayDataSource - - public init( - remotePlayDataSource: RemotePlayDataSource - ) { - self.remotePlayDataSource = remotePlayDataSource - } - - public func postPlaybackLog(item: Data) -> Single { - remotePlayDataSource.postPlaybackLog(item: item) - } -} diff --git a/Projects/Services/DataModule/Sources/Play/UseCases/PostPlaybackLogUseCaseImpl.swift b/Projects/Services/DataModule/Sources/Play/UseCases/PostPlaybackLogUseCaseImpl.swift deleted file mode 100644 index 25cc57822..000000000 --- a/Projects/Services/DataModule/Sources/Play/UseCases/PostPlaybackLogUseCaseImpl.swift +++ /dev/null @@ -1,27 +0,0 @@ -// -// PostPlaybackLogUseCaseImpl.swift -// DataModule -// -// Created by KTH on 2023/08/27. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule -import Foundation - -public struct PostPlaybackLogUseCaseImpl: PostPlaybackLogUseCase { - private let playRepository: any PlayRepository - - public init( - playRepository: PlayRepository - ) { - self.playRepository = playRepository - } - - public func execute(item: Data) -> Single { - playRepository.postPlaybackLog(item: item) - } -} diff --git a/Projects/Services/DataModule/Sources/Playlist/Repositories/PlaylistRepositoryImpl.swift b/Projects/Services/DataModule/Sources/Playlist/Repositories/PlaylistRepositoryImpl.swift deleted file mode 100644 index 112eb0a3e..000000000 --- a/Projects/Services/DataModule/Sources/Playlist/Repositories/PlaylistRepositoryImpl.swift +++ /dev/null @@ -1,64 +0,0 @@ -// -// ArtistRepositoryImpl.swift -// DataModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import DataMappingModule -import DomainModule -import ErrorModule -import NetworkModule -import DatabaseModule -import RxSwift - -public struct PlayListRepositoryImpl: PlayListRepository { - - - - private let remotePlayListDataSource: any RemotePlayListDataSource - - public init( - remotePlayListDataSource: RemotePlayListDataSource - ) { - self.remotePlayListDataSource = remotePlayListDataSource - } - - public func fetchRecommendPlayList() -> Single<[RecommendPlayListEntity]> { - remotePlayListDataSource.fetchRecommendPlayList() - } - - public func fetchPlayListDetail(id:String,type:PlayListType) -> Single { - remotePlayListDataSource.fetchPlayListDetail(id: id, type: type) - } - - public func createPlayList(title: String) -> Single { - remotePlayListDataSource.createPlayList(title: title) - } - - public func editPlayList(key: String,songs: [String]) -> Single { - - return remotePlayListDataSource.editPlayList(key: key,songs: songs) - } - - public func editPlayListName(key: String,title:String) -> Single { - remotePlayListDataSource.editPlayListName(key: key, title: title) - } - - public func deletePlayList(key: String) -> Single { - remotePlayListDataSource.deletePlayList(key: key) - } - - public func loadPlayList(key: String) -> Single { - remotePlayListDataSource.loadPlayList(key: key) - } - - public func addSongIntoPlayList(key: String, songs: [String]) -> Single { - remotePlayListDataSource.addSongIntoPlayList(key: key, songs: songs) - } - - public func removeSongs(key: String, songs: [String]) -> RxSwift.Single { - remotePlayListDataSource.removeSongs(key: key, songs: songs) - } -} diff --git a/Projects/Services/DataModule/Sources/Playlist/UseCases/AddSongIntoPlayListUseCaseImpl.swift b/Projects/Services/DataModule/Sources/Playlist/UseCases/AddSongIntoPlayListUseCaseImpl.swift deleted file mode 100644 index d9189a8a3..000000000 --- a/Projects/Services/DataModule/Sources/Playlist/UseCases/AddSongIntoPlayListUseCaseImpl.swift +++ /dev/null @@ -1,33 +0,0 @@ -// -// FetchArtistListUseCaseImpl.swift -// DataModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule - -public struct AddSongIntoPlayListUseCaseImpl: AddSongIntoPlayListUseCase { - - - - private let playListRepository: any PlayListRepository - - public init( - playListRepository: PlayListRepository - ) { - self.playListRepository = playListRepository - } - - public func execute(key:String,songs:[String]) -> Single { - playListRepository.addSongIntoPlayList(key: key, songs: songs) - } - - - -} diff --git a/Projects/Services/DataModule/Sources/Playlist/UseCases/CreatePlayListUseCaseImpl.swift b/Projects/Services/DataModule/Sources/Playlist/UseCases/CreatePlayListUseCaseImpl.swift deleted file mode 100644 index 66ea6168c..000000000 --- a/Projects/Services/DataModule/Sources/Playlist/UseCases/CreatePlayListUseCaseImpl.swift +++ /dev/null @@ -1,34 +0,0 @@ -// -// FetchArtistListUseCaseImpl.swift -// DataModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule - -public struct CreatePlayListUseCaseImpl: CreatePlayListUseCase { - - - - - - private let playListRepository: any PlayListRepository - - public init( - playListRepository: PlayListRepository - ) { - self.playListRepository = playListRepository - } - - public func execute(title:String) -> Single { - playListRepository.createPlayList(title: title) - } - - -} diff --git a/Projects/Services/DataModule/Sources/Playlist/UseCases/EditPlayListNameUseCaseImpl.swift b/Projects/Services/DataModule/Sources/Playlist/UseCases/EditPlayListNameUseCaseImpl.swift deleted file mode 100644 index 821b17656..000000000 --- a/Projects/Services/DataModule/Sources/Playlist/UseCases/EditPlayListNameUseCaseImpl.swift +++ /dev/null @@ -1,33 +0,0 @@ -// -// FetchArtistListUseCaseImpl.swift -// DataModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule - -public struct EditPlayListNameUseCaseImpl: EditPlayListNameUseCase { - - - private let playListRepository: any PlayListRepository - - public init( - playListRepository: PlayListRepository - ) { - self.playListRepository = playListRepository - } - - public func execute(key: String,title:String) -> Single { - playListRepository.editPlayListName(key: key, title: title) - } - - - - -} diff --git a/Projects/Services/DataModule/Sources/Playlist/UseCases/EditPlayListUseCaseImpl.swift b/Projects/Services/DataModule/Sources/Playlist/UseCases/EditPlayListUseCaseImpl.swift deleted file mode 100644 index 7700547d7..000000000 --- a/Projects/Services/DataModule/Sources/Playlist/UseCases/EditPlayListUseCaseImpl.swift +++ /dev/null @@ -1,35 +0,0 @@ -// -// FetchArtistListUseCaseImpl.swift -// DataModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule - -public struct EditPlayListUseCaseImpl: EditPlayListUseCase { - - - private let playListRepository: any PlayListRepository - - public init( - playListRepository: PlayListRepository - ) { - self.playListRepository = playListRepository - } - - public func execute(key: String,songs: [String]) -> Single { - - - return playListRepository.editPlayList(key: key,songs: songs) - } - - - - -} diff --git a/Projects/Services/DataModule/Sources/Playlist/UseCases/FetchPlayListDetailUseCaseImpl.swift b/Projects/Services/DataModule/Sources/Playlist/UseCases/FetchPlayListDetailUseCaseImpl.swift deleted file mode 100644 index 3577f96b8..000000000 --- a/Projects/Services/DataModule/Sources/Playlist/UseCases/FetchPlayListDetailUseCaseImpl.swift +++ /dev/null @@ -1,35 +0,0 @@ -// -// FetchArtistListUseCaseImpl.swift -// DataModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule - -public struct FetchPlayListDetailUseCaseImpl: FetchPlayListDetailUseCase{ - - - - - - private let playListRepository: any PlayListRepository - - public init( - playListRepository: PlayListRepository - ) { - self.playListRepository = playListRepository - } - - public func execute(id: String,type:PlayListType) -> Single { - playListRepository.fetchPlayListDetail(id: id, type: type) - } - - - -} diff --git a/Projects/Services/DataModule/Sources/Playlist/UseCases/FetchRecommendPlayListUseCaseImpl.swift b/Projects/Services/DataModule/Sources/Playlist/UseCases/FetchRecommendPlayListUseCaseImpl.swift deleted file mode 100644 index c257f51f1..000000000 --- a/Projects/Services/DataModule/Sources/Playlist/UseCases/FetchRecommendPlayListUseCaseImpl.swift +++ /dev/null @@ -1,32 +0,0 @@ -// -// FetchArtistListUseCaseImpl.swift -// DataModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule - -public struct FetchRecommendPlayListUseCaseImpl: FetchRecommendPlayListUseCase { - - - - private let playListRepository: any PlayListRepository - - public init( - playListRepository: PlayListRepository - ) { - self.playListRepository = playListRepository - } - - public func execute() -> Single<[RecommendPlayListEntity]> { - playListRepository.fetchRecommendPlayList() - } - - -} diff --git a/Projects/Services/DataModule/Sources/Playlist/UseCases/LoadPlayListUseCaseImpl.swift b/Projects/Services/DataModule/Sources/Playlist/UseCases/LoadPlayListUseCaseImpl.swift deleted file mode 100644 index aedc57b26..000000000 --- a/Projects/Services/DataModule/Sources/Playlist/UseCases/LoadPlayListUseCaseImpl.swift +++ /dev/null @@ -1,33 +0,0 @@ -// -// FetchArtistListUseCaseImpl.swift -// DataModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule - -public struct LoadPlayListUseCaseImpl: LoadPlayListUseCase { - - - - private let playListRepository: any PlayListRepository - - public init( - playListRepository: PlayListRepository - ) { - self.playListRepository = playListRepository - } - - public func execute(key:String) -> Single { - playListRepository.loadPlayList(key: key) - } - - - -} diff --git a/Projects/Services/DataModule/Sources/Playlist/UseCases/RemoveSongsUseCaseImpl.swift b/Projects/Services/DataModule/Sources/Playlist/UseCases/RemoveSongsUseCaseImpl.swift deleted file mode 100644 index 31dab1387..000000000 --- a/Projects/Services/DataModule/Sources/Playlist/UseCases/RemoveSongsUseCaseImpl.swift +++ /dev/null @@ -1,35 +0,0 @@ -// -// FetchArtistListUseCaseImpl.swift -// DataModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule - -public struct RemoveSongsUseCaseImpl: RemoveSongsUseCase{ - - - private let playListRepository: any PlayListRepository - - public init( - playListRepository: PlayListRepository - ) { - self.playListRepository = playListRepository - } - - public func execute(key: String,songs: [String]) -> Single { - - - return playListRepository.removeSongs(key: key,songs: songs) - } - - - - -} diff --git a/Projects/Services/DataModule/Sources/Qna/Repositories/QnaRepositoryImpl.swift b/Projects/Services/DataModule/Sources/Qna/Repositories/QnaRepositoryImpl.swift deleted file mode 100644 index f73a4caaf..000000000 --- a/Projects/Services/DataModule/Sources/Qna/Repositories/QnaRepositoryImpl.swift +++ /dev/null @@ -1,35 +0,0 @@ -// -// ArtistRepositoryImpl.swift -// DataModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import DataMappingModule -import DomainModule -import ErrorModule -import NetworkModule -import DatabaseModule -import RxSwift - -public struct QnaRepositoryImpl: QnaRepository { - - private let remoteQnaDataSource: any RemoteQnaDataSource - - public init( - remoteQnaDataSource: RemoteQnaDataSource - ) { - self.remoteQnaDataSource = remoteQnaDataSource - } - - public func fetchQnaCategories() -> Single<[QnaCategoryEntity]> { - remoteQnaDataSource.fetchCategories() - } - - public func fetchQna() -> Single<[QnaEntity]> { - remoteQnaDataSource.fetchQna() - } - - -} diff --git a/Projects/Services/DataModule/Sources/Qna/UseCases/FetchQnaCategoriesUseCaseImpl.swift b/Projects/Services/DataModule/Sources/Qna/UseCases/FetchQnaCategoriesUseCaseImpl.swift deleted file mode 100644 index 32d5800af..000000000 --- a/Projects/Services/DataModule/Sources/Qna/UseCases/FetchQnaCategoriesUseCaseImpl.swift +++ /dev/null @@ -1,30 +0,0 @@ -// -// FetchArtistListUseCaseImpl.swift -// DataModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule - -public struct FetchQnaCategoriesUseCaseImpl: FetchQnaCategoriesUseCase { - - - private let qnaRepository: any QnaRepository - - public init( - qnaRepository: QnaRepository - ) { - self.qnaRepository = qnaRepository - } - - public func execute() -> Single<[QnaCategoryEntity]> { - qnaRepository.fetchQnaCategories() - } - -} diff --git a/Projects/Services/DataModule/Sources/Qna/UseCases/FetchQnaUseCaseImpl.swift b/Projects/Services/DataModule/Sources/Qna/UseCases/FetchQnaUseCaseImpl.swift deleted file mode 100644 index a1c0e3f3d..000000000 --- a/Projects/Services/DataModule/Sources/Qna/UseCases/FetchQnaUseCaseImpl.swift +++ /dev/null @@ -1,33 +0,0 @@ -// -// FetchArtistListUseCaseImpl.swift -// DataModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule - -public struct FetchQnaUseCaseImpl: FetchQnaUseCase { - - - - - private let qnaRepository: any QnaRepository - - public init( - qnaRepository: QnaRepository - ) { - self.qnaRepository = qnaRepository - } - - public func execute() -> Single<[QnaEntity]> { - qnaRepository.fetchQna() - } - - -} diff --git a/Projects/Services/DataModule/Sources/Songs/Repositories/SongsRepositoryImpl.swift b/Projects/Services/DataModule/Sources/Songs/Repositories/SongsRepositoryImpl.swift deleted file mode 100644 index f7001750f..000000000 --- a/Projects/Services/DataModule/Sources/Songs/Repositories/SongsRepositoryImpl.swift +++ /dev/null @@ -1,28 +0,0 @@ -import DataMappingModule -import DomainModule -import ErrorModule -import NetworkModule -import DatabaseModule -import RxSwift - -public struct SongsRepositoryImpl: SongsRepository { - private let remoteSongsDataSource: any RemoteSongsDataSource - - public init( - remoteSongsDataSource: RemoteSongsDataSource - ) { - self.remoteSongsDataSource = remoteSongsDataSource - } - - public func fetchSearchSong(type: SearchType, keyword: String) -> Single<[SongEntity]> { - remoteSongsDataSource.fetchSearchSong(type: type, keyword: keyword) - } - - public func fetchLyrics(id: String) -> Single<[LyricsEntity]> { - remoteSongsDataSource.fetchLyrics(id: id) - } - - public func fetchNewSongs(type: NewSongGroupType, page: Int, limit: Int) -> Single<[NewSongsEntity]> { - remoteSongsDataSource.fetchNewSongs(type: type, page: page, limit: limit) - } -} diff --git a/Projects/Services/DataModule/Sources/Songs/UseCases/FetchSearchSongUseCaseImpl.swift b/Projects/Services/DataModule/Sources/Songs/UseCases/FetchSearchSongUseCaseImpl.swift deleted file mode 100644 index 5f1bdeb95..000000000 --- a/Projects/Services/DataModule/Sources/Songs/UseCases/FetchSearchSongUseCaseImpl.swift +++ /dev/null @@ -1,21 +0,0 @@ -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule - -public struct FetchSearchSongUseCaseImpl: FetchSearchSongUseCase { - - private let songsRepository: any SongsRepository - - public init( - songsRepository: SongsRepository - ) { - self.songsRepository = songsRepository - } - - public func execute(type: SearchType, keyword: String) -> Single<[SongEntity]> { - songsRepository.fetchSearchSong(type: type, keyword: keyword) - } - - -} diff --git a/Projects/Services/DataModule/Sources/Suggest/Repositories/SuggestRepositoryImpl.swift b/Projects/Services/DataModule/Sources/Suggest/Repositories/SuggestRepositoryImpl.swift deleted file mode 100644 index de593e0e7..000000000 --- a/Projects/Services/DataModule/Sources/Suggest/Repositories/SuggestRepositoryImpl.swift +++ /dev/null @@ -1,41 +0,0 @@ -// -// SuggestRepositoryImpl.swift -// DataModuleTests -// -// Created by KTH on 2023/04/14. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import DataMappingModule -import DomainModule -import ErrorModule -import NetworkModule -import DatabaseModule -import RxSwift - -public struct SuggestRepositoryImpl: SuggestRepository { - private let remoteSuggestDataSource: any RemoteSuggestDataSource - - public init( - remoteSuggestDataSource: RemoteSuggestDataSource - ) { - self.remoteSuggestDataSource = remoteSuggestDataSource - } - - public func reportBug(userID: String, nickname: String, attaches: [String], content: String) -> Single { - remoteSuggestDataSource.reportBug(userID: userID, nickname: nickname, attaches: attaches, content: content) - } - - public func suggestFunction(type: SuggestPlatformType, userID: String, content: String) -> Single { - remoteSuggestDataSource.suggestFunction(type: type, userID: userID, content: content) - } - - public func modifySong(type: SuggestSongModifyType, userID: String, artist: String, songTitle: String, youtubeLink: String, content: String) -> Single { - remoteSuggestDataSource.modifySong(type: type, userID: userID, artist: artist, songTitle: songTitle, youtubeLink: youtubeLink, content: content) - } - - public func inquiryWeeklyChart(userID: String, content: String) -> Single { - remoteSuggestDataSource.inquiryWeeklyChart(userID: userID, content: content) - } -} diff --git a/Projects/Services/DataModule/Sources/Suggest/UseCases/InquiryWeeklyChartUseCaseImpl.swift b/Projects/Services/DataModule/Sources/Suggest/UseCases/InquiryWeeklyChartUseCaseImpl.swift deleted file mode 100644 index e4a8130a4..000000000 --- a/Projects/Services/DataModule/Sources/Suggest/UseCases/InquiryWeeklyChartUseCaseImpl.swift +++ /dev/null @@ -1,26 +0,0 @@ -// -// InquiryWeeklyChartUseCaseImpl.swift -// DataModuleTests -// -// Created by KTH on 2023/04/14. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule - -public struct InquiryWeeklyChartUseCaseImpl: InquiryWeeklyChartUseCase { - private let suggestRepository: any SuggestRepository - - public init( - suggestRepository: SuggestRepository - ) { - self.suggestRepository = suggestRepository - } - public func execute(userID: String, content: String) -> Single { - suggestRepository.inquiryWeeklyChart(userID: userID, content: content) - } -} diff --git a/Projects/Services/DataModule/Sources/Suggest/UseCases/ModifySongUseCaseImpl.swift b/Projects/Services/DataModule/Sources/Suggest/UseCases/ModifySongUseCaseImpl.swift deleted file mode 100644 index 2dc904a9a..000000000 --- a/Projects/Services/DataModule/Sources/Suggest/UseCases/ModifySongUseCaseImpl.swift +++ /dev/null @@ -1,26 +0,0 @@ -// -// ModifySongUseCaseImpl.swift -// DataModuleTests -// -// Created by KTH on 2023/04/14. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule - -public struct ModifySongUseCaseImpl: ModifySongUseCase { - private let suggestRepository: any SuggestRepository - - public init( - suggestRepository: SuggestRepository - ) { - self.suggestRepository = suggestRepository - } - public func execute(type: SuggestSongModifyType, userID: String, artist: String, songTitle: String, youtubeLink: String, content: String) -> Single { - suggestRepository.modifySong(type: type, userID: userID, artist: artist, songTitle: songTitle, youtubeLink: youtubeLink, content: content) - } -} diff --git a/Projects/Services/DataModule/Sources/Suggest/UseCases/ReportBugUseCaseImpl.swift b/Projects/Services/DataModule/Sources/Suggest/UseCases/ReportBugUseCaseImpl.swift deleted file mode 100644 index 75bea34fd..000000000 --- a/Projects/Services/DataModule/Sources/Suggest/UseCases/ReportBugUseCaseImpl.swift +++ /dev/null @@ -1,26 +0,0 @@ -// -// ReportBugUseCaseImpl.swift -// DataModuleTests -// -// Created by KTH on 2023/04/14. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule - -public struct ReportBugUseCaseImpl: ReportBugUseCase { - private let suggestRepository: any SuggestRepository - - public init( - suggestRepository: SuggestRepository - ) { - self.suggestRepository = suggestRepository - } - public func execute(userID: String, nickname: String, attaches: [String], content: String) -> Single { - suggestRepository.reportBug(userID: userID, nickname: nickname, attaches: attaches, content: content) - } -} diff --git a/Projects/Services/DataModule/Sources/Suggest/UseCases/SuggestFunctionUseCaseImpl.swift b/Projects/Services/DataModule/Sources/Suggest/UseCases/SuggestFunctionUseCaseImpl.swift deleted file mode 100644 index 5e4ac222e..000000000 --- a/Projects/Services/DataModule/Sources/Suggest/UseCases/SuggestFunctionUseCaseImpl.swift +++ /dev/null @@ -1,26 +0,0 @@ -// -// SuggestFunctionUseCaseImpl.swift -// DataModuleTests -// -// Created by KTH on 2023/04/14. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule - -public struct SuggestFunctionUseCaseImpl: SuggestFunctionUseCase { - private let suggestRepository: any SuggestRepository - - public init( - suggestRepository: SuggestRepository - ) { - self.suggestRepository = suggestRepository - } - public func execute(type: SuggestPlatformType, userID: String, content: String) -> Single { - suggestRepository.suggestFunction(type: type, userID: userID, content: content) - } -} diff --git a/Projects/Services/DataModule/Sources/User/Repositories/UserRepositoryImpl.swift b/Projects/Services/DataModule/Sources/User/Repositories/UserRepositoryImpl.swift deleted file mode 100644 index 86ac4cd7e..000000000 --- a/Projects/Services/DataModule/Sources/User/Repositories/UserRepositoryImpl.swift +++ /dev/null @@ -1,61 +0,0 @@ -// -// ArtistRepositoryImpl.swift -// DataModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import DataMappingModule -import DomainModule -import ErrorModule -import NetworkModule -import DatabaseModule -import RxSwift - -public struct UserRepositoryImpl: UserRepository { - - private let remoteUserDataSource: any RemoteUserDataSource - - public init( - remoteUserDataSource: RemoteUserDataSource - ) { - self.remoteUserDataSource = remoteUserDataSource - } - - public func fetchProfileList() -> Single<[ProfileListEntity]> { - remoteUserDataSource.fetchProfileList() - } - - public func setProfile(image: String) -> Single { - remoteUserDataSource.setProfile(image: image) - } - - public func setUserName(name: String) -> Single { - remoteUserDataSource.setUserName(name: name) - } - - public func fetchPlayList() -> Single<[PlayListEntity]> { - remoteUserDataSource.fetchPlayList() - } - - public func fetchFavoriteSongs() -> Single<[FavoriteSongEntity]> { - remoteUserDataSource.fetchFavoriteSong() - } - - public func editFavoriteSongsOrder(ids: [String]) -> Single { - remoteUserDataSource.editFavoriteSongsOrder(ids: ids) - } - - public func editPlayListOrder(ids: [String]) -> Single { - remoteUserDataSource.editPlayListOrder(ids: ids) - } - - public func deletePlayList(ids: [String]) -> Single { - remoteUserDataSource.deletePlayList(ids: ids) - } - - public func deleteFavoriteList(ids: [String]) -> Single { - remoteUserDataSource.deleteFavoriteList(ids: ids) - } -} diff --git a/Projects/Services/DataModule/Sources/User/UseCases/DeleteFavoriteListUseCaseImpl.swift b/Projects/Services/DataModule/Sources/User/UseCases/DeleteFavoriteListUseCaseImpl.swift deleted file mode 100644 index ddc4f4eff..000000000 --- a/Projects/Services/DataModule/Sources/User/UseCases/DeleteFavoriteListUseCaseImpl.swift +++ /dev/null @@ -1,28 +0,0 @@ -// -// DeleteLikeListUseCaseImpl.swift -// DataModule -// -// Created by KTH on 2023/04/03. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule - -public struct DeleteFavoriteListUseCaseImpl: DeleteFavoriteListUseCase { - - private let userRepository: any UserRepository - - public init( - userRepository: UserRepository - ) { - self.userRepository = userRepository - } - - public func execute(ids: [String]) -> Single { - userRepository.deleteFavoriteList(ids: ids) - } -} diff --git a/Projects/Services/DataModule/Sources/User/UseCases/DeletePlayListUseCaseImpl.swift b/Projects/Services/DataModule/Sources/User/UseCases/DeletePlayListUseCaseImpl.swift deleted file mode 100644 index 27d35c267..000000000 --- a/Projects/Services/DataModule/Sources/User/UseCases/DeletePlayListUseCaseImpl.swift +++ /dev/null @@ -1,28 +0,0 @@ -// -// FetchArtistListUseCaseImpl.swift -// DataModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule - -public struct DeletePlayListUseCaseImpl: DeletePlayListUseCase { - - private let userRepository: any UserRepository - - public init( - userRepository: UserRepository - ) { - self.userRepository = userRepository - } - - public func execute(ids: [String]) -> Single { - userRepository.deletePlayList(ids: ids) - } -} diff --git a/Projects/Services/DataModule/Sources/User/UseCases/EditFavoriteSongsOrderUseCaseImpl.swift b/Projects/Services/DataModule/Sources/User/UseCases/EditFavoriteSongsOrderUseCaseImpl.swift deleted file mode 100644 index 4b29090ee..000000000 --- a/Projects/Services/DataModule/Sources/User/UseCases/EditFavoriteSongsOrderUseCaseImpl.swift +++ /dev/null @@ -1,35 +0,0 @@ -// -// FetchArtistListUseCaseImpl.swift -// DataModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule - -public struct EditFavoriteSongsOrderUseCaseImpl: EditFavoriteSongsOrderUseCase { - - - - - private let userRepository: any UserRepository - - public init( - userRepository: UserRepository - ) { - self.userRepository = userRepository - } - - public func execute(ids:[String]) -> Single { - userRepository.editFavoriteSongsOrder(ids: ids) - } - - - - -} diff --git a/Projects/Services/DataModule/Sources/User/UseCases/EditPlayListOrderUseCaseImpl.swift b/Projects/Services/DataModule/Sources/User/UseCases/EditPlayListOrderUseCaseImpl.swift deleted file mode 100644 index 4028e8236..000000000 --- a/Projects/Services/DataModule/Sources/User/UseCases/EditPlayListOrderUseCaseImpl.swift +++ /dev/null @@ -1,36 +0,0 @@ -// -// FetchArtistListUseCaseImpl.swift -// DataModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule - -public struct EditPlayListOrderUseCaseImpl:EditPlayListOrderUseCase { - - - - - private let userRepository: any UserRepository - - public init( - userRepository: UserRepository - ) { - self.userRepository = userRepository - } - - public func execute(ids: [String]) -> Single { - userRepository.editPlayListOrder(ids: ids) - } - - - - - -} diff --git a/Projects/Services/DataModule/Sources/User/UseCases/FetchPlayListUseCaseImpl.swift b/Projects/Services/DataModule/Sources/User/UseCases/FetchPlayListUseCaseImpl.swift deleted file mode 100644 index 732eee90f..000000000 --- a/Projects/Services/DataModule/Sources/User/UseCases/FetchPlayListUseCaseImpl.swift +++ /dev/null @@ -1,34 +0,0 @@ -// -// FetchArtistListUseCaseImpl.swift -// DataModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule - -public struct FetchPlayListUseCaseImpl: FetchPlayListUseCase { - - - - - private let userRepository: any UserRepository - - public init( - userRepository: UserRepository - ) { - self.userRepository = userRepository - } - - public func execute() -> Single<[PlayListEntity]> { - userRepository.fetchPlayList() - } - - - -} diff --git a/Projects/Services/DataModule/Sources/User/UseCases/FetchProfileListUseCaseImpl.swift b/Projects/Services/DataModule/Sources/User/UseCases/FetchProfileListUseCaseImpl.swift deleted file mode 100644 index cbf9db2ad..000000000 --- a/Projects/Services/DataModule/Sources/User/UseCases/FetchProfileListUseCaseImpl.swift +++ /dev/null @@ -1,28 +0,0 @@ -// -// FetchProfileListUseCaseImpl.swift -// DataModule -// -// Created by KTH on 2023/02/18. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule - -public struct FetchProfileListUseCaseImpl: FetchProfileListUseCase { - - private let userRepository: any UserRepository - - public init( - userRepository: UserRepository - ) { - self.userRepository = userRepository - } - - public func execute() -> Single<[ProfileListEntity]> { - userRepository.fetchProfileList() - } -} diff --git a/Projects/Services/DataModule/Sources/User/UseCases/SetProfileUseCaseImpl.swift b/Projects/Services/DataModule/Sources/User/UseCases/SetProfileUseCaseImpl.swift deleted file mode 100644 index 9dfc92468..000000000 --- a/Projects/Services/DataModule/Sources/User/UseCases/SetProfileUseCaseImpl.swift +++ /dev/null @@ -1,32 +0,0 @@ -// -// FetchArtistListUseCaseImpl.swift -// DataModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule - -public struct SetProfileUseCaseImpl: SetProfileUseCase { - - - private let userRepository: any UserRepository - - public init( - userRepository: UserRepository - ) { - self.userRepository = userRepository - } - - public func execute(image: String) -> Single { - userRepository.setProfile(image: image) - } - - - -} diff --git a/Projects/Services/DataModule/Sources/User/UseCases/SetUserNameUseCaseImpl.swift b/Projects/Services/DataModule/Sources/User/UseCases/SetUserNameUseCaseImpl.swift deleted file mode 100644 index bd2f42cad..000000000 --- a/Projects/Services/DataModule/Sources/User/UseCases/SetUserNameUseCaseImpl.swift +++ /dev/null @@ -1,32 +0,0 @@ -// -// FetchArtistListUseCaseImpl.swift -// DataModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule - -public struct SetUserNameUseCaseImpl: SetUserNameUseCase { - - - private let userRepository: any UserRepository - - public init( - userRepository: UserRepository - ) { - self.userRepository = userRepository - } - - public func execute(name: String) -> Single { - userRepository.setUserName(name: name) - } - - - -} diff --git a/Projects/Services/DataModule/Tests/.gitkeep b/Projects/Services/DataModule/Tests/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/Projects/Services/DataModule/Tests/TargetTest.swift b/Projects/Services/DataModule/Tests/TargetTest.swift deleted file mode 100644 index b1cf79405..000000000 --- a/Projects/Services/DataModule/Tests/TargetTest.swift +++ /dev/null @@ -1,17 +0,0 @@ -import XCTest - -class TargetTests: XCTestCase { - - override func setUpWithError() throws { - // Put setup code here. This method is called before the invocation of each test method in the class. - } - - override func tearDownWithError() throws { - // Put teardown code here. This method is called after the invocation of each test method in the class. - } - - func testExample() throws { - XCTAssertEqual("A", "A") - } - -} diff --git a/Projects/Services/DatabaseModule/.swiftlint.yml b/Projects/Services/DatabaseModule/.swiftlint.yml deleted file mode 100644 index ff44f9f28..000000000 --- a/Projects/Services/DatabaseModule/.swiftlint.yml +++ /dev/null @@ -1,20 +0,0 @@ -excluded: - - "**/*/NeedleGenerated.swift" - - "Tuist" - - -force_cast: # From https://realm.github.io/SwiftLint/force_cast.html - warning # 강제 캐스팅은 error에서 warning으로 변경 - -disabled_rules: - - trailing_whitespace - - vertical_whitespace - - colon - - comma - - comment_spacing # 주석 여백 - - mark # //MARK 관련 warning - - opening_brace # 괄호 열 때 줄바꿈을 했는지 안했는지, (안했으면 warning) - - line_length # 한줄에 글자 수 제한 , warning: 120, error: 200 (default) - - statement_position # if는 반드시 else로 끝나야한다. - - identifier_name #변수명 글자 수 제한 - diff --git a/Projects/Services/DatabaseModule/Project.swift b/Projects/Services/DatabaseModule/Project.swift deleted file mode 100644 index 139f7dbff..000000000 --- a/Projects/Services/DatabaseModule/Project.swift +++ /dev/null @@ -1,10 +0,0 @@ -import ProjectDescription -import ProjectDescriptionHelpers - -let project = Project.makeModule( - name: "DatabaseModule", - product: .staticFramework, - dependencies: [ - .Project.Module.Utility - ] -) diff --git a/Projects/Services/DatabaseModule/Sources/Feature.swift b/Projects/Services/DatabaseModule/Sources/Feature.swift deleted file mode 100644 index 8d35d5c80..000000000 --- a/Projects/Services/DatabaseModule/Sources/Feature.swift +++ /dev/null @@ -1 +0,0 @@ -// This is for the feature diff --git a/Projects/Services/DatabaseModule/Tests/.gitkeep b/Projects/Services/DatabaseModule/Tests/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/Projects/Services/DatabaseModule/Tests/TargetTest.swift b/Projects/Services/DatabaseModule/Tests/TargetTest.swift deleted file mode 100644 index b1cf79405..000000000 --- a/Projects/Services/DatabaseModule/Tests/TargetTest.swift +++ /dev/null @@ -1,17 +0,0 @@ -import XCTest - -class TargetTests: XCTestCase { - - override func setUpWithError() throws { - // Put setup code here. This method is called before the invocation of each test method in the class. - } - - override func tearDownWithError() throws { - // Put teardown code here. This method is called after the invocation of each test method in the class. - } - - func testExample() throws { - XCTAssertEqual("A", "A") - } - -} diff --git a/Projects/Services/DomainModule/.swiftlint.yml b/Projects/Services/DomainModule/.swiftlint.yml deleted file mode 100644 index ff44f9f28..000000000 --- a/Projects/Services/DomainModule/.swiftlint.yml +++ /dev/null @@ -1,20 +0,0 @@ -excluded: - - "**/*/NeedleGenerated.swift" - - "Tuist" - - -force_cast: # From https://realm.github.io/SwiftLint/force_cast.html - warning # 강제 캐스팅은 error에서 warning으로 변경 - -disabled_rules: - - trailing_whitespace - - vertical_whitespace - - colon - - comma - - comment_spacing # 주석 여백 - - mark # //MARK 관련 warning - - opening_brace # 괄호 열 때 줄바꿈을 했는지 안했는지, (안했으면 warning) - - line_length # 한줄에 글자 수 제한 , warning: 120, error: 200 (default) - - statement_position # if는 반드시 else로 끝나야한다. - - identifier_name #변수명 글자 수 제한 - diff --git a/Projects/Services/DomainModule/Project.swift b/Projects/Services/DomainModule/Project.swift deleted file mode 100644 index 5956fb29f..000000000 --- a/Projects/Services/DomainModule/Project.swift +++ /dev/null @@ -1,11 +0,0 @@ -import ProjectDescription -import ProjectDescriptionHelpers - -let project = Project.makeModule( - name: "DomainModule", - product: .staticFramework, - dependencies: [ - .Project.Module.ThirdPartyLib, - .Project.Service.DataMappingModule - ] -) diff --git a/Projects/Services/DomainModule/Sources/App/Entity/AppInfoEntity.swift b/Projects/Services/DomainModule/Sources/App/Entity/AppInfoEntity.swift deleted file mode 100644 index 5bc3a2dd4..000000000 --- a/Projects/Services/DomainModule/Sources/App/Entity/AppInfoEntity.swift +++ /dev/null @@ -1,31 +0,0 @@ -// -// VersionCheckEntity.swift -// DomainModuleTests -// -// Created by yongbeomkwak on 2023/05/23. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import DataMappingModule - -public struct AppInfoEntity: Equatable { - public init( - flag: AppInfoFlagType, - title: String, - description: String, - version: String, - specialLogo: Bool - ) - { - self.flag = flag - self.title = title - self.description = description - self.version = version - self.specialLogo = specialLogo - } - - public let flag: AppInfoFlagType - public let title, description, version: String - public let specialLogo: Bool -} diff --git a/Projects/Services/DomainModule/Sources/App/Repository/AppRepository.swift b/Projects/Services/DomainModule/Sources/App/Repository/AppRepository.swift deleted file mode 100644 index 9677426e0..000000000 --- a/Projects/Services/DomainModule/Sources/App/Repository/AppRepository.swift +++ /dev/null @@ -1,18 +0,0 @@ -// -// AppRepository.swift -// DomainModuleTests -// -// Created by yongbeomkwak on 2023/05/23. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule -import ErrorModule - - -public protocol AppRepository { - func fetchCheckApp() -> Single - -} diff --git a/Projects/Services/DomainModule/Sources/App/UseCases/FetchCheckAppUseCase.swift b/Projects/Services/DomainModule/Sources/App/UseCases/FetchCheckAppUseCase.swift deleted file mode 100644 index 4fdd9437c..000000000 --- a/Projects/Services/DomainModule/Sources/App/UseCases/FetchCheckAppUseCase.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// FetchCheckVersionUseCase.swift -// DomainModuleTests -// -// Created by yongbeomkwak on 2023/05/23. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule - -public protocol FetchCheckAppUseCase { - func execute() -> Single -} diff --git a/Projects/Services/DomainModule/Sources/Artist/Entity/ArtistListEntity.swift b/Projects/Services/DomainModule/Sources/Artist/Entity/ArtistListEntity.swift deleted file mode 100644 index 1eab25021..000000000 --- a/Projects/Services/DomainModule/Sources/Artist/Entity/ArtistListEntity.swift +++ /dev/null @@ -1,55 +0,0 @@ -// -// ArtistListEntity.swift -// DomainModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public struct ArtistListEntity: Equatable { - public init( - ID: String, - name: String, - short: String, - group: String, - title: String, - description: String, - color: [[String]], - youtube: String, - twitch: String, - instagram: String, - imageRoundVersion: Int, - imageSquareVersion: Int, - graduated: Bool, - isHiddenItem: Bool - ) { - self.ID = ID - self.name = name - self.short = short - self.group = group - self.title = title - self.description = description - self.color = color - self.youtube = youtube - self.twitch = twitch - self.instagram = instagram - self.imageRoundVersion = imageRoundVersion - self.imageSquareVersion = imageSquareVersion - self.graduated = graduated - self.isHiddenItem = isHiddenItem - } - - public static func == (lhs: Self, rhs: Self) -> Bool { - return lhs.ID == rhs.ID - } - - public let ID, name, short, group: String - public let title, description: String - public let color: [[String]] - public let youtube, twitch, instagram: String - public let imageRoundVersion, imageSquareVersion: Int - public let graduated: Bool - public var isHiddenItem: Bool = false -} diff --git a/Projects/Services/DomainModule/Sources/Artist/Entity/ArtistSongListEntity.swift b/Projects/Services/DomainModule/Sources/Artist/Entity/ArtistSongListEntity.swift deleted file mode 100644 index 5147db65e..000000000 --- a/Projects/Services/DomainModule/Sources/Artist/Entity/ArtistSongListEntity.swift +++ /dev/null @@ -1,41 +0,0 @@ -// -// ArtistSongListEntity.swift -// DomainModule -// -// Created by KTH on 2023/02/10. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public struct ArtistSongListEntity: Equatable { - public init( - ID: String, - title: String, - artist: String, - remix: String, - reaction: String, - date: String, - views: Int, - last: Int, - isSelected: Bool - ){ - self.ID = ID - self.title = title - self.artist = artist - self.remix = remix - self.reaction = reaction - self.date = date - self.views = views - self.last = last - self.isSelected = isSelected - } - - public static func == (lhs: Self, rhs: Self) -> Bool { - return lhs.ID == rhs.ID - } - - public let ID, title, artist, remix, reaction, date: String - public let views, last: Int - public var isSelected: Bool = false -} diff --git a/Projects/Services/DomainModule/Sources/Artist/Repository/ArtistRepository.swift b/Projects/Services/DomainModule/Sources/Artist/Repository/ArtistRepository.swift deleted file mode 100644 index 8ec664486..000000000 --- a/Projects/Services/DomainModule/Sources/Artist/Repository/ArtistRepository.swift +++ /dev/null @@ -1,17 +0,0 @@ -// -// ArtistRepository.swift -// DomainModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule -import ErrorModule - -public protocol ArtistRepository { - func fetchArtistList() -> Single<[ArtistListEntity]> - func fetchArtistSongList(id: String, sort: ArtistSongSortType, page: Int) -> Single<[ArtistSongListEntity]> -} diff --git a/Projects/Services/DomainModule/Sources/Artist/UseCases/FetchArtistListUseCase.swift b/Projects/Services/DomainModule/Sources/Artist/UseCases/FetchArtistListUseCase.swift deleted file mode 100644 index 1b677d234..000000000 --- a/Projects/Services/DomainModule/Sources/Artist/UseCases/FetchArtistListUseCase.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// FetchArtistListUseCase.swift -// DomainModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule - -public protocol FetchArtistListUseCase { - func execute() -> Single<[ArtistListEntity]> -} diff --git a/Projects/Services/DomainModule/Sources/Artist/UseCases/FetchArtistSongListUseCase.swift b/Projects/Services/DomainModule/Sources/Artist/UseCases/FetchArtistSongListUseCase.swift deleted file mode 100644 index 485537ff4..000000000 --- a/Projects/Services/DomainModule/Sources/Artist/UseCases/FetchArtistSongListUseCase.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// FetchArtistSongListUseCase.swift -// DomainModule -// -// Created by KTH on 2023/02/10. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule - -public protocol FetchArtistSongListUseCase { - func execute(id: String, sort: ArtistSongSortType, page: Int) -> Single<[ArtistSongListEntity]> -} diff --git a/Projects/Services/DomainModule/Sources/Auth/Entitiy/AuthLoginEntity.swift b/Projects/Services/DomainModule/Sources/Auth/Entitiy/AuthLoginEntity.swift deleted file mode 100644 index 85edf924e..000000000 --- a/Projects/Services/DomainModule/Sources/Auth/Entitiy/AuthLoginEntity.swift +++ /dev/null @@ -1,21 +0,0 @@ -// -// RecommendPlayListEntity.swift -// DomainModuleTests -// -// Created by yongbeomkwak on 2023/02/10. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public struct AuthLoginEntity: Equatable { - public init( - token: String - ) { - self.token = token - } - - public let token: String - - -} diff --git a/Projects/Services/DomainModule/Sources/Auth/Entitiy/AuthUserInfoEntity.swift b/Projects/Services/DomainModule/Sources/Auth/Entitiy/AuthUserInfoEntity.swift deleted file mode 100644 index c2e1c89db..000000000 --- a/Projects/Services/DomainModule/Sources/Auth/Entitiy/AuthUserInfoEntity.swift +++ /dev/null @@ -1,47 +0,0 @@ -// -// NaverUserInfoResponseDTO.swift -// DataMappingModule -// -// Created by yongbeomkwak on 2023/02/15. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public struct AuthUserInfoEntity: Equatable { - - - - - public init( - id:String, - platform:String, - displayName:String, - first_login_time:Int, - first:Bool, - profile:String, - version:Int - - ) { - self.id = id - self.platform = platform - self.displayName = displayName - self.first_login_time = first_login_time - self.first = first - self.profile = profile - self.version = version - } - - public let id, platform, displayName,profile:String - public let first_login_time,version:Int - public let first:Bool - - - public static func == (lhs: AuthUserInfoEntity, rhs: AuthUserInfoEntity) -> Bool { - lhs.id == rhs.id - } - -} - - - diff --git a/Projects/Services/DomainModule/Sources/Auth/Entitiy/NaverUserInfoEntity.swift b/Projects/Services/DomainModule/Sources/Auth/Entitiy/NaverUserInfoEntity.swift deleted file mode 100644 index be80017bd..000000000 --- a/Projects/Services/DomainModule/Sources/Auth/Entitiy/NaverUserInfoEntity.swift +++ /dev/null @@ -1,31 +0,0 @@ -// -// NaverUserInfoResponseDTO.swift -// DataMappingModule -// -// Created by yongbeomkwak on 2023/02/15. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public struct NaverUserInfoEntity: Equatable { - public init( - resultcode: String, - message: String, - id:String, - nickname:String - ) { - self.resultcode = resultcode - self.message = message - self.id = id - self.nickname = nickname - } - - public let resultcode, message ,id, nickname : String - - public static func == ( - lhs: NaverUserInfoEntity, - rhs: NaverUserInfoEntity) -> Bool { - lhs.id == rhs.id - } -} diff --git a/Projects/Services/DomainModule/Sources/Auth/Repository/AuthRepository.swift b/Projects/Services/DomainModule/Sources/Auth/Repository/AuthRepository.swift deleted file mode 100644 index f68187560..000000000 --- a/Projects/Services/DomainModule/Sources/Auth/Repository/AuthRepository.swift +++ /dev/null @@ -1,12 +0,0 @@ -import RxSwift -import DataMappingModule -import ErrorModule -import Foundation - -public protocol AuthRepository { - func fetchToken(token:String,type:ProviderType) -> Single - func fetchNaverUserInfo(tokenType:String,accessToken:String) -> Single - func fetchUserInfo() -> Single - func withdrawUserInfo() -> Single - -} diff --git a/Projects/Services/DomainModule/Sources/Auth/UseCases/FetchNaverUserInfoUseCase.swift b/Projects/Services/DomainModule/Sources/Auth/UseCases/FetchNaverUserInfoUseCase.swift deleted file mode 100644 index 17264df55..000000000 --- a/Projects/Services/DomainModule/Sources/Auth/UseCases/FetchNaverUserInfoUseCase.swift +++ /dev/null @@ -1,7 +0,0 @@ -import Foundation -import RxSwift -import DataMappingModule - -public protocol FetchNaverUserInfoUseCase { - func execute(tokenType:String,accessToken:String) -> Single -} diff --git a/Projects/Services/DomainModule/Sources/Auth/UseCases/FetchTokenUseCase.swift b/Projects/Services/DomainModule/Sources/Auth/UseCases/FetchTokenUseCase.swift deleted file mode 100644 index fd6009c3e..000000000 --- a/Projects/Services/DomainModule/Sources/Auth/UseCases/FetchTokenUseCase.swift +++ /dev/null @@ -1,7 +0,0 @@ -import Foundation -import RxSwift -import DataMappingModule - -public protocol FetchTokenUseCase { - func execute(token:String,type:ProviderType) -> Single -} diff --git a/Projects/Services/DomainModule/Sources/Auth/UseCases/FetchUserInfoUseCase.swift b/Projects/Services/DomainModule/Sources/Auth/UseCases/FetchUserInfoUseCase.swift deleted file mode 100644 index 343b4a175..000000000 --- a/Projects/Services/DomainModule/Sources/Auth/UseCases/FetchUserInfoUseCase.swift +++ /dev/null @@ -1,7 +0,0 @@ -import Foundation -import RxSwift -import DataMappingModule - -public protocol FetchUserInfoUseCase { - func execute() -> Single -} diff --git a/Projects/Services/DomainModule/Sources/Auth/UseCases/WithdrawUserInfoUseCase.swift b/Projects/Services/DomainModule/Sources/Auth/UseCases/WithdrawUserInfoUseCase.swift deleted file mode 100644 index d7d882f6a..000000000 --- a/Projects/Services/DomainModule/Sources/Auth/UseCases/WithdrawUserInfoUseCase.swift +++ /dev/null @@ -1,7 +0,0 @@ -import Foundation -import RxSwift -import DataMappingModule - -public protocol WithdrawUserInfoUseCase { - func execute() -> Single -} diff --git a/Projects/Services/DomainModule/Sources/Base/BaseEntity.swift b/Projects/Services/DomainModule/Sources/Base/BaseEntity.swift deleted file mode 100644 index bfbf500b3..000000000 --- a/Projects/Services/DomainModule/Sources/Base/BaseEntity.swift +++ /dev/null @@ -1,22 +0,0 @@ -// -// BaseEntity.swift -// DomainModule -// -// Created by KTH on 2023/02/18. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public struct BaseEntity { - public init( - status: Int, - description: String = "" - ) { - self.status = status - self.description = description - } - - public let status: Int - public var description: String = "" -} diff --git a/Projects/Services/DomainModule/Sources/Chart/Entity/ChartRankingEntity.swift b/Projects/Services/DomainModule/Sources/Chart/Entity/ChartRankingEntity.swift deleted file mode 100644 index 9e22eb3c3..000000000 --- a/Projects/Services/DomainModule/Sources/Chart/Entity/ChartRankingEntity.swift +++ /dev/null @@ -1,37 +0,0 @@ -import Foundation - -public struct ChartRankingEntity: Equatable { - public init( - id: String, - title: String, - artist: String, - remix: String, - reaction: String, - views: Int, - last: Int, - increase: Int, - date: String, - isSelected: Bool = false - ) { - self.id = id - self.title = title - self.artist = artist - self.remix = remix - self.reaction = reaction - self.views = views - self.last = last - self.increase = increase - self.date = date - self.isSelected = isSelected - } - - public let id, title, artist, remix: String - public let reaction: String - public let views, last, increase: Int - public let date: String - public var isSelected:Bool - - public static func == (lhs: ChartRankingEntity, rhs: ChartRankingEntity) -> Bool { - lhs.id == rhs.id - } -} diff --git a/Projects/Services/DomainModule/Sources/Chart/Repository/ChartRepository.swift b/Projects/Services/DomainModule/Sources/Chart/Repository/ChartRepository.swift deleted file mode 100644 index a02bf6fff..000000000 --- a/Projects/Services/DomainModule/Sources/Chart/Repository/ChartRepository.swift +++ /dev/null @@ -1,9 +0,0 @@ -import RxSwift -import DataMappingModule -import ErrorModule -import Foundation - -public protocol ChartRepository { - func fetchChartRanking(type: ChartDateType, limit: Int) -> Single<[ChartRankingEntity]> - func fetchChartUpdateTime(type: ChartDateType) -> Single -} diff --git a/Projects/Services/DomainModule/Sources/Chart/UseCases/FetchChartRankingUseCase.swift b/Projects/Services/DomainModule/Sources/Chart/UseCases/FetchChartRankingUseCase.swift deleted file mode 100644 index 993fb10dc..000000000 --- a/Projects/Services/DomainModule/Sources/Chart/UseCases/FetchChartRankingUseCase.swift +++ /dev/null @@ -1,8 +0,0 @@ -import Combine -import DataMappingModule -import ErrorModule -import RxSwift - -public protocol FetchChartRankingUseCase { - func execute(type: ChartDateType, limit: Int) -> Single<[ChartRankingEntity]> -} diff --git a/Projects/Services/DomainModule/Sources/Chart/UseCases/FetchChartUpdateTimeUseCase.swift b/Projects/Services/DomainModule/Sources/Chart/UseCases/FetchChartUpdateTimeUseCase.swift deleted file mode 100644 index 7f9cd905f..000000000 --- a/Projects/Services/DomainModule/Sources/Chart/UseCases/FetchChartUpdateTimeUseCase.swift +++ /dev/null @@ -1,9 +0,0 @@ -import Combine -import DataMappingModule -import ErrorModule -import RxSwift -import Foundation - -public protocol FetchChartUpdateTimeUseCase { - func execute(type: ChartDateType) -> Single -} diff --git a/Projects/Services/DomainModule/Sources/Like/Repository/LikeRepository.swift b/Projects/Services/DomainModule/Sources/Like/Repository/LikeRepository.swift deleted file mode 100644 index 3c17bc09f..000000000 --- a/Projects/Services/DomainModule/Sources/Like/Repository/LikeRepository.swift +++ /dev/null @@ -1,20 +0,0 @@ -// -// ArtistRepository.swift -// DomainModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule -import ErrorModule - -public protocol LikeRepository { - func fetchLikeNumOfSong(id:String) -> Single - func addLikeSong(id:String) -> Single - func cancelLikeSong(id:String) -> Single - - -} diff --git a/Projects/Services/DomainModule/Sources/Like/UseCases/AddLikeSongUseCase.swift b/Projects/Services/DomainModule/Sources/Like/UseCases/AddLikeSongUseCase.swift deleted file mode 100644 index 89ca43d7d..000000000 --- a/Projects/Services/DomainModule/Sources/Like/UseCases/AddLikeSongUseCase.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// FetchArtistListUseCase.swift -// DomainModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule - -public protocol AddLikeSongUseCase { - func execute(id:String) -> Single -} diff --git a/Projects/Services/DomainModule/Sources/Like/UseCases/FetchLikeNumOfSongUseCase.swift b/Projects/Services/DomainModule/Sources/Like/UseCases/FetchLikeNumOfSongUseCase.swift deleted file mode 100644 index fe67479c4..000000000 --- a/Projects/Services/DomainModule/Sources/Like/UseCases/FetchLikeNumOfSongUseCase.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// FetchArtistListUseCase.swift -// DomainModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule - -public protocol FetchLikeNumOfSongUseCase { - func execute(id:String) -> Single -} diff --git a/Projects/Services/DomainModule/Sources/Notice/Entity/FetchNoticeCategoriesEntity.swift b/Projects/Services/DomainModule/Sources/Notice/Entity/FetchNoticeCategoriesEntity.swift deleted file mode 100644 index 70db76944..000000000 --- a/Projects/Services/DomainModule/Sources/Notice/Entity/FetchNoticeCategoriesEntity.swift +++ /dev/null @@ -1,21 +0,0 @@ -// -// FetchNoticeCategoriesEntity.swift -// DomainModuleTests -// -// Created by KTH on 2023/04/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public struct FetchNoticeCategoriesEntity: Codable { - public init ( - type: String, - category: String - ) { - self.type = type - self.category = category - } - public let type: String - public let category: String -} diff --git a/Projects/Services/DomainModule/Sources/Notice/Entity/FetchNoticeEntity.swift b/Projects/Services/DomainModule/Sources/Notice/Entity/FetchNoticeEntity.swift deleted file mode 100644 index ff1edf971..000000000 --- a/Projects/Services/DomainModule/Sources/Notice/Entity/FetchNoticeEntity.swift +++ /dev/null @@ -1,40 +0,0 @@ -// -// FetchNoticeEntity.swift -// DomainModuleTests -// -// Created by KTH on 2023/04/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public struct FetchNoticeEntity: Codable { - public init ( - id: Int, - category: String, - title: String, - thumbnail: String?, - content: String?, - images: [String], - createAt: Double, - startAt: Double, - endAt: Double - ) { - self.id = id - self.category = category - self.title = title - self.thumbnail = thumbnail - self.content = content - self.images = images - self.createAt = createAt - self.startAt = startAt - self.endAt = endAt - } - - public let id: Int - public let category, title: String - public let thumbnail: String? - public let content: String? - public let images: [String] - public let createAt, startAt, endAt: Double -} diff --git a/Projects/Services/DomainModule/Sources/Notice/Repository/NoticeRepository.swift b/Projects/Services/DomainModule/Sources/Notice/Repository/NoticeRepository.swift deleted file mode 100644 index 94453c49c..000000000 --- a/Projects/Services/DomainModule/Sources/Notice/Repository/NoticeRepository.swift +++ /dev/null @@ -1,17 +0,0 @@ -// -// NoticeRepository.swift -// DomainModuleTests -// -// Created by KTH on 2023/04/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule -import ErrorModule - -public protocol NoticeRepository { - func fetchNotice(type: NoticeType) -> Single<[FetchNoticeEntity]> - func fetchNoticeCategories() -> Single<[FetchNoticeCategoriesEntity]> -} diff --git a/Projects/Services/DomainModule/Sources/Notice/UseCases/FetchNoticeCategoriesUseCase.swift b/Projects/Services/DomainModule/Sources/Notice/UseCases/FetchNoticeCategoriesUseCase.swift deleted file mode 100644 index a69588d5a..000000000 --- a/Projects/Services/DomainModule/Sources/Notice/UseCases/FetchNoticeCategoriesUseCase.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// FetchNoticeCategoriesUseCase.swift -// DomainModuleTests -// -// Created by KTH on 2023/04/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule - -public protocol FetchNoticeCategoriesUseCase { - func execute() -> Single<[FetchNoticeCategoriesEntity]> -} diff --git a/Projects/Services/DomainModule/Sources/Notice/UseCases/FetchNoticeUseCase.swift b/Projects/Services/DomainModule/Sources/Notice/UseCases/FetchNoticeUseCase.swift deleted file mode 100644 index 673809ea2..000000000 --- a/Projects/Services/DomainModule/Sources/Notice/UseCases/FetchNoticeUseCase.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// FetchNoticeUseCase.swift -// DomainModuleTests -// -// Created by KTH on 2023/04/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule - -public protocol FetchNoticeUseCase { - func execute(type: NoticeType) -> Single<[FetchNoticeEntity]> -} diff --git a/Projects/Services/DomainModule/Sources/Play/Entity/PlaybackLogEntity.swift b/Projects/Services/DomainModule/Sources/Play/Entity/PlaybackLogEntity.swift deleted file mode 100644 index 6b517ee2e..000000000 --- a/Projects/Services/DomainModule/Sources/Play/Entity/PlaybackLogEntity.swift +++ /dev/null @@ -1,27 +0,0 @@ -// -// PostPlaybackLogEntity.swift -// DomainModuleTests -// -// Created by KTH on 2023/08/27. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public struct PlaybackLogEntity: Equatable { - public init( - id: String, - title: String, - artist: String - ) { - self.id = id - self.title = title - self.artist = artist - } - - public let id, title, artist: String - - public static func == (lhs: PlaybackLogEntity, rhs: PlaybackLogEntity) -> Bool { - lhs.id == rhs.id - } -} diff --git a/Projects/Services/DomainModule/Sources/Play/Repository/PlayRepository.swift b/Projects/Services/DomainModule/Sources/Play/Repository/PlayRepository.swift deleted file mode 100644 index 19882415c..000000000 --- a/Projects/Services/DomainModule/Sources/Play/Repository/PlayRepository.swift +++ /dev/null @@ -1,8 +0,0 @@ -import RxSwift -import DataMappingModule -import ErrorModule -import Foundation - -public protocol PlayRepository { - func postPlaybackLog(item: Data) -> Single -} diff --git a/Projects/Services/DomainModule/Sources/Play/UseCases/PostPlaybackLogUseCase.swift b/Projects/Services/DomainModule/Sources/Play/UseCases/PostPlaybackLogUseCase.swift deleted file mode 100644 index e2fbe6d08..000000000 --- a/Projects/Services/DomainModule/Sources/Play/UseCases/PostPlaybackLogUseCase.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// PostPlaybackLogUseCase.swift -// DomainModuleTests -// -// Created by KTH on 2023/08/27. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule - -public protocol PostPlaybackLogUseCase { - func execute(item: Data) -> Single -} diff --git a/Projects/Services/DomainModule/Sources/Playlist/Entity/AddSongEntity.swift b/Projects/Services/DomainModule/Sources/Playlist/Entity/AddSongEntity.swift deleted file mode 100644 index fc4e409f2..000000000 --- a/Projects/Services/DomainModule/Sources/Playlist/Entity/AddSongEntity.swift +++ /dev/null @@ -1,31 +0,0 @@ -// -// AddSongEntity.swift -// DomainModule -// -// Created by yongbeomkwak on 2023/03/14. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - - -public struct AddSongEntity: Equatable { - - public init( - status: Int, - added_songs_length: Int, - duplicated: Bool, - description: String - ) { - self.status = status - self.added_songs_length = added_songs_length - self.duplicated = duplicated - self.description = description - } - - - public let status: Int - public let added_songs_length: Int - public let duplicated: Bool - public let description:String -} diff --git a/Projects/Services/DomainModule/Sources/Playlist/Entity/EditPlayListNameEntity.swift b/Projects/Services/DomainModule/Sources/Playlist/Entity/EditPlayListNameEntity.swift deleted file mode 100644 index 4b0bb8047..000000000 --- a/Projects/Services/DomainModule/Sources/Playlist/Entity/EditPlayListNameEntity.swift +++ /dev/null @@ -1,25 +0,0 @@ -// -// RecommendPlayListEntity.swift -// DomainModuleTests -// -// Created by yongbeomkwak on 2023/02/10. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public struct EditPlayListNameEntity: Equatable { - public init( - title: String, - status: Int, - description:String = "" - ) { - self.title = title - self.status = status - self.description = description - - - } - public let status:Int - public let title,description : String -} diff --git a/Projects/Services/DomainModule/Sources/Playlist/Entity/PlayListBaseEntity.swift b/Projects/Services/DomainModule/Sources/Playlist/Entity/PlayListBaseEntity.swift deleted file mode 100644 index 398d2c71d..000000000 --- a/Projects/Services/DomainModule/Sources/Playlist/Entity/PlayListBaseEntity.swift +++ /dev/null @@ -1,25 +0,0 @@ -// -// RecommendPlayListEntity.swift -// DomainModuleTests -// -// Created by yongbeomkwak on 2023/02/10. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public struct PlayListBaseEntity: Equatable { - public init( - status:Int, - key:String, - description:String = "" - ) { - self.status = status - self.key = key - self.description = description - } - public let status: Int - public let key: String - public var description:String - -} diff --git a/Projects/Services/DomainModule/Sources/Playlist/Entity/PlayListDetailEntity.swift b/Projects/Services/DomainModule/Sources/Playlist/Entity/PlayListDetailEntity.swift deleted file mode 100644 index c6094a924..000000000 --- a/Projects/Services/DomainModule/Sources/Playlist/Entity/PlayListDetailEntity.swift +++ /dev/null @@ -1,40 +0,0 @@ -// -// RecommendPlayListEntity.swift -// DomainModuleTests -// -// Created by yongbeomkwak on 2023/02/10. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public struct PlayListDetailEntity: Equatable { - public init( - title: String, - songs: [SongEntity], - `public`:Bool, - key:String, - image:String, - image_square_version:Int, - image_round_version:Int, - version:Int - - ) { - self.title = title - self.songs = songs - self.public = `public` - self.key = key - self.image = image - self.image_round_version = image_round_version - self.image_square_version = image_square_version - self.version = version - - } - - public let title : String - public let songs: [SongEntity] - public let `public` : Bool - public let key,image: String - public let image_round_version,image_square_version,version :Int - -} diff --git a/Projects/Services/DomainModule/Sources/Playlist/Entity/RecommendPlayListEntity.swift b/Projects/Services/DomainModule/Sources/Playlist/Entity/RecommendPlayListEntity.swift deleted file mode 100644 index 6fceebb5c..000000000 --- a/Projects/Services/DomainModule/Sources/Playlist/Entity/RecommendPlayListEntity.swift +++ /dev/null @@ -1,30 +0,0 @@ -// -// RecommendPlayListEntity.swift -// DomainModuleTests -// -// Created by yongbeomkwak on 2023/02/10. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public struct RecommendPlayListEntity: Equatable { - public init( - key: String, - title: String, - `public`: Bool, - image_round_version:Int, - image_sqaure_version:Int - ) { - self.key = key - self.title = title - self.public = `public` - self.image_round_version = image_round_version - self.image_sqaure_version = image_sqaure_version - - } - - public let key, title : String - public let `public` : Bool - public let image_round_version,image_sqaure_version : Int -} diff --git a/Projects/Services/DomainModule/Sources/Playlist/Repository/PlayListRepository.swift b/Projects/Services/DomainModule/Sources/Playlist/Repository/PlayListRepository.swift deleted file mode 100644 index 7a6e47188..000000000 --- a/Projects/Services/DomainModule/Sources/Playlist/Repository/PlayListRepository.swift +++ /dev/null @@ -1,16 +0,0 @@ -import RxSwift -import DataMappingModule -import ErrorModule -import Foundation - -public protocol PlayListRepository { - func fetchRecommendPlayList() -> Single<[RecommendPlayListEntity]> - func fetchPlayListDetail(id:String,type:PlayListType) -> Single - func createPlayList(title:String) -> Single - func editPlayList(key:String,songs:[String]) -> Single - func editPlayListName(key:String,title:String) -> Single - func deletePlayList(key:String) -> Single - func loadPlayList(key:String) -> Single - func addSongIntoPlayList(key:String,songs:[String]) -> Single - func removeSongs(key:String,songs:[String]) -> Single -} diff --git a/Projects/Services/DomainModule/Sources/Playlist/UseCases/AddSongIntoPlayListUseCase.swift b/Projects/Services/DomainModule/Sources/Playlist/UseCases/AddSongIntoPlayListUseCase.swift deleted file mode 100644 index abd720d74..000000000 --- a/Projects/Services/DomainModule/Sources/Playlist/UseCases/AddSongIntoPlayListUseCase.swift +++ /dev/null @@ -1,7 +0,0 @@ -import Foundation -import RxSwift -import DataMappingModule - -public protocol AddSongIntoPlayListUseCase { - func execute(key: String,songs:[String]) -> Single -} diff --git a/Projects/Services/DomainModule/Sources/Playlist/UseCases/CreatePlayListUseCase.swift b/Projects/Services/DomainModule/Sources/Playlist/UseCases/CreatePlayListUseCase.swift deleted file mode 100644 index 2cbfe266d..000000000 --- a/Projects/Services/DomainModule/Sources/Playlist/UseCases/CreatePlayListUseCase.swift +++ /dev/null @@ -1,7 +0,0 @@ -import Foundation -import RxSwift -import DataMappingModule - -public protocol CreatePlayListUseCase { - func execute(title:String) -> Single -} diff --git a/Projects/Services/DomainModule/Sources/Playlist/UseCases/EditPlayListNameUseCase.swift b/Projects/Services/DomainModule/Sources/Playlist/UseCases/EditPlayListNameUseCase.swift deleted file mode 100644 index 0e518dc80..000000000 --- a/Projects/Services/DomainModule/Sources/Playlist/UseCases/EditPlayListNameUseCase.swift +++ /dev/null @@ -1,7 +0,0 @@ -import Foundation -import RxSwift -import DataMappingModule - -public protocol EditPlayListNameUseCase { - func execute(key: String,title:String) -> Single -} diff --git a/Projects/Services/DomainModule/Sources/Playlist/UseCases/EditPlayListUseCase.swift b/Projects/Services/DomainModule/Sources/Playlist/UseCases/EditPlayListUseCase.swift deleted file mode 100644 index 3ffb1b5f6..000000000 --- a/Projects/Services/DomainModule/Sources/Playlist/UseCases/EditPlayListUseCase.swift +++ /dev/null @@ -1,7 +0,0 @@ -import Foundation -import RxSwift -import DataMappingModule - -public protocol EditPlayListUseCase { - func execute(key: String,songs: [String]) -> Single -} diff --git a/Projects/Services/DomainModule/Sources/Playlist/UseCases/FetchPlayListDetailUseCase.swift b/Projects/Services/DomainModule/Sources/Playlist/UseCases/FetchPlayListDetailUseCase.swift deleted file mode 100644 index 88c508ddc..000000000 --- a/Projects/Services/DomainModule/Sources/Playlist/UseCases/FetchPlayListDetailUseCase.swift +++ /dev/null @@ -1,7 +0,0 @@ -import Foundation -import RxSwift -import DataMappingModule - -public protocol FetchPlayListDetailUseCase { - func execute(id:String,type:PlayListType) -> Single -} diff --git a/Projects/Services/DomainModule/Sources/Playlist/UseCases/FetchRecommendPlayListUseCase.swift b/Projects/Services/DomainModule/Sources/Playlist/UseCases/FetchRecommendPlayListUseCase.swift deleted file mode 100644 index 988d912aa..000000000 --- a/Projects/Services/DomainModule/Sources/Playlist/UseCases/FetchRecommendPlayListUseCase.swift +++ /dev/null @@ -1,7 +0,0 @@ -import Foundation -import RxSwift -import DataMappingModule - -public protocol FetchRecommendPlayListUseCase { - func execute() -> Single<[RecommendPlayListEntity]> -} diff --git a/Projects/Services/DomainModule/Sources/Playlist/UseCases/LoadPlayListUseCase.swift b/Projects/Services/DomainModule/Sources/Playlist/UseCases/LoadPlayListUseCase.swift deleted file mode 100644 index bb857641d..000000000 --- a/Projects/Services/DomainModule/Sources/Playlist/UseCases/LoadPlayListUseCase.swift +++ /dev/null @@ -1,7 +0,0 @@ -import Foundation -import RxSwift -import DataMappingModule - -public protocol LoadPlayListUseCase { - func execute(key: String) -> Single -} diff --git a/Projects/Services/DomainModule/Sources/Playlist/UseCases/RemoveSongsUseCase.swift b/Projects/Services/DomainModule/Sources/Playlist/UseCases/RemoveSongsUseCase.swift deleted file mode 100644 index 71f7a8633..000000000 --- a/Projects/Services/DomainModule/Sources/Playlist/UseCases/RemoveSongsUseCase.swift +++ /dev/null @@ -1,7 +0,0 @@ -import Foundation -import RxSwift -import DataMappingModule - -public protocol RemoveSongsUseCase { - func execute(key: String,songs: [String]) -> Single -} diff --git a/Projects/Services/DomainModule/Sources/Qna/Entity/QnaCategoryEntity.swift b/Projects/Services/DomainModule/Sources/Qna/Entity/QnaCategoryEntity.swift deleted file mode 100644 index 79441b386..000000000 --- a/Projects/Services/DomainModule/Sources/Qna/Entity/QnaCategoryEntity.swift +++ /dev/null @@ -1,10 +0,0 @@ -import Foundation - -public struct QnaCategoryEntity: Equatable { - public init( - category: String - ) { - self.category = category - } - public let category: String -} diff --git a/Projects/Services/DomainModule/Sources/Qna/Entity/QnaEntity.swift b/Projects/Services/DomainModule/Sources/Qna/Entity/QnaEntity.swift deleted file mode 100644 index 92e6ce40f..000000000 --- a/Projects/Services/DomainModule/Sources/Qna/Entity/QnaEntity.swift +++ /dev/null @@ -1,20 +0,0 @@ -import Foundation - -public struct QnaEntity: Equatable { - public init( - create_at: Int, - category: String, - question: String, - description: String, - isOpen: Bool - ) { - self.create_at = create_at - self.category = category - self.question = question - self.description = description - self.isOpen = isOpen - } - public let create_at: Int - public let category,question,description:String - public var isOpen:Bool -} diff --git a/Projects/Services/DomainModule/Sources/Qna/Repository/QnaRepository.swift b/Projects/Services/DomainModule/Sources/Qna/Repository/QnaRepository.swift deleted file mode 100644 index 3bc7024cb..000000000 --- a/Projects/Services/DomainModule/Sources/Qna/Repository/QnaRepository.swift +++ /dev/null @@ -1,17 +0,0 @@ -// -// ArtistRepository.swift -// DomainModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule -import ErrorModule - -public protocol QnaRepository { - func fetchQnaCategories() -> Single<[QnaCategoryEntity]> - func fetchQna() -> Single<[QnaEntity]> -} diff --git a/Projects/Services/DomainModule/Sources/Qna/UseCase/FetchQnaCategoriesUseCase.swift b/Projects/Services/DomainModule/Sources/Qna/UseCase/FetchQnaCategoriesUseCase.swift deleted file mode 100644 index beafa931d..000000000 --- a/Projects/Services/DomainModule/Sources/Qna/UseCase/FetchQnaCategoriesUseCase.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// FetchArtistListUseCase.swift -// DomainModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule - -public protocol FetchQnaCategoriesUseCase { - func execute() -> Single<[QnaCategoryEntity]> -} diff --git a/Projects/Services/DomainModule/Sources/Qna/UseCase/FetchQnaUseCase.swift b/Projects/Services/DomainModule/Sources/Qna/UseCase/FetchQnaUseCase.swift deleted file mode 100644 index 7a36e9de8..000000000 --- a/Projects/Services/DomainModule/Sources/Qna/UseCase/FetchQnaUseCase.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// FetchArtistListUseCase.swift -// DomainModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule - -public protocol FetchQnaUseCase { - func execute() -> Single<[QnaEntity]> -} diff --git a/Projects/Services/DomainModule/Sources/Songs/Entity/LyricsEntity.swift b/Projects/Services/DomainModule/Sources/Songs/Entity/LyricsEntity.swift deleted file mode 100644 index d7c676c12..000000000 --- a/Projects/Services/DomainModule/Sources/Songs/Entity/LyricsEntity.swift +++ /dev/null @@ -1,28 +0,0 @@ -// -// LyricsEntity.swift -// DomainModule -// -// Created by YoungK on 2023/02/22. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public struct LyricsEntity: Equatable { - public init( - identifier: String, - start: Double, - end: Double, - text: String, - styles: String - ) { - self.identifier = identifier - self.start = start - self.end = end - self.text = text - self.styles = styles - } - - public let identifier, text, styles: String - public let start, end: Double -} diff --git a/Projects/Services/DomainModule/Sources/Songs/Entity/NewSongsEntity.swift b/Projects/Services/DomainModule/Sources/Songs/Entity/NewSongsEntity.swift deleted file mode 100644 index 4e4711445..000000000 --- a/Projects/Services/DomainModule/Sources/Songs/Entity/NewSongsEntity.swift +++ /dev/null @@ -1,43 +0,0 @@ -// -// NewSongsEntity.swift -// DomainModule -// -// Created by KTH on 2023/11/15. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public struct NewSongsEntity: Equatable { - public init( - id: String, - title: String, - artist: String, - remix: String, - reaction: String, - views: Int, - last: Int, - date: Int, - isSelected: Bool = false - ) { - self.id = id - self.title = title - self.artist = artist - self.remix = remix - self.reaction = reaction - self.views = views - self.last = last - self.date = date - self.isSelected = isSelected - } - - public let id, title, artist, remix: String - public let reaction: String - public let views, last: Int - public let date: Int - public var isSelected: Bool - - public static func == (lhs: NewSongsEntity, rhs: NewSongsEntity) -> Bool { - lhs.id == rhs.id - } -} diff --git a/Projects/Services/DomainModule/Sources/Songs/Entity/SongEntity.swift b/Projects/Services/DomainModule/Sources/Songs/Entity/SongEntity.swift deleted file mode 100644 index ffb9e21fa..000000000 --- a/Projects/Services/DomainModule/Sources/Songs/Entity/SongEntity.swift +++ /dev/null @@ -1,35 +0,0 @@ -import Foundation - -public struct SongEntity: Equatable { - public init( - id: String, - title: String, - artist: String, - remix: String, - reaction: String, - views: Int, - last: Int, - date: String, - isSelected: Bool = false - ) { - self.id = id - self.title = title - self.artist = artist - self.remix = remix - self.reaction = reaction - self.views = views - self.last = last - self.date = date - self.isSelected = isSelected - } - - public let id, title, artist, remix: String - public let reaction: String - public let views, last: Int - public let date: String - public var isSelected: Bool - - public static func == (lhs: SongEntity, rhs: SongEntity) -> Bool { - lhs.id == rhs.id - } -} diff --git a/Projects/Services/DomainModule/Sources/Songs/Repository/SongsRepository.swift b/Projects/Services/DomainModule/Sources/Songs/Repository/SongsRepository.swift deleted file mode 100644 index e3d37acc0..000000000 --- a/Projects/Services/DomainModule/Sources/Songs/Repository/SongsRepository.swift +++ /dev/null @@ -1,10 +0,0 @@ -import RxSwift -import DataMappingModule -import ErrorModule -import Foundation - -public protocol SongsRepository { - func fetchSearchSong(type: SearchType, keyword: String) -> Single<[SongEntity]> - func fetchLyrics(id: String) -> Single<[LyricsEntity]> - func fetchNewSongs(type: NewSongGroupType, page: Int, limit: Int) -> Single<[NewSongsEntity]> -} diff --git a/Projects/Services/DomainModule/Sources/Songs/UseCases/FetchLyricsUseCase.swift b/Projects/Services/DomainModule/Sources/Songs/UseCases/FetchLyricsUseCase.swift deleted file mode 100644 index 73bd8e44f..000000000 --- a/Projects/Services/DomainModule/Sources/Songs/UseCases/FetchLyricsUseCase.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// FetchLyricsUseCase.swift -// DomainModule -// -// Created by YoungK on 2023/02/22. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule - -public protocol FetchLyricsUseCase { - func execute(id: String) -> Single<[LyricsEntity]> -} diff --git a/Projects/Services/DomainModule/Sources/Songs/UseCases/FetchSeachSongUseCase.swift b/Projects/Services/DomainModule/Sources/Songs/UseCases/FetchSeachSongUseCase.swift deleted file mode 100644 index 7fbb435dd..000000000 --- a/Projects/Services/DomainModule/Sources/Songs/UseCases/FetchSeachSongUseCase.swift +++ /dev/null @@ -1,7 +0,0 @@ -import Foundation -import RxSwift -import DataMappingModule - -public protocol FetchSearchSongUseCase { - func execute(type: SearchType,keyword: String) -> Single<[SongEntity]> -} diff --git a/Projects/Services/DomainModule/Sources/Songs/UseCases/fetchNewSongsUseCase.swift b/Projects/Services/DomainModule/Sources/Songs/UseCases/fetchNewSongsUseCase.swift deleted file mode 100644 index 436091377..000000000 --- a/Projects/Services/DomainModule/Sources/Songs/UseCases/fetchNewSongsUseCase.swift +++ /dev/null @@ -1,16 +0,0 @@ -// -// fetchNewSongsUseCase.swift -// DomainModule -// -// Created by KTH on 2023/11/15. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import DataMappingModule -import ErrorModule -import RxSwift - -public protocol FetchNewSongsUseCase { - func execute(type: NewSongGroupType, page: Int, limit: Int) -> Single<[NewSongsEntity]> -} diff --git a/Projects/Services/DomainModule/Sources/Suggest/Entity/InquiryWeeklyChartEntity.swift b/Projects/Services/DomainModule/Sources/Suggest/Entity/InquiryWeeklyChartEntity.swift deleted file mode 100644 index e39e944f8..000000000 --- a/Projects/Services/DomainModule/Sources/Suggest/Entity/InquiryWeeklyChartEntity.swift +++ /dev/null @@ -1,22 +0,0 @@ -// -// InquiryWeeklyChartEntity.swift -// DomainModule -// -// Created by KTH on 2023/04/14. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public struct InquiryWeeklyChartEntity: Codable { - public init ( - status: Int?, - message: String? - ) { - self.status = status - self.message = message - } - - public let status: Int? - public let message: String? -} diff --git a/Projects/Services/DomainModule/Sources/Suggest/Entity/ModifySongEntity.swift b/Projects/Services/DomainModule/Sources/Suggest/Entity/ModifySongEntity.swift deleted file mode 100644 index 3233dec75..000000000 --- a/Projects/Services/DomainModule/Sources/Suggest/Entity/ModifySongEntity.swift +++ /dev/null @@ -1,22 +0,0 @@ -// -// ModifySongEntity.swift -// DomainModule -// -// Created by KTH on 2023/04/14. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public struct ModifySongEntity: Codable { - public init ( - status: Int?, - message: String? - ) { - self.status = status - self.message = message - } - - public let status: Int? - public let message: String? -} diff --git a/Projects/Services/DomainModule/Sources/Suggest/Entity/ReportBugEntity.swift b/Projects/Services/DomainModule/Sources/Suggest/Entity/ReportBugEntity.swift deleted file mode 100644 index 6ef0ee7e1..000000000 --- a/Projects/Services/DomainModule/Sources/Suggest/Entity/ReportBugEntity.swift +++ /dev/null @@ -1,22 +0,0 @@ -// -// ReportBugEntity.swift -// DomainModule -// -// Created by KTH on 2023/04/14. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public struct ReportBugEntity: Codable { - public init ( - status: Int?, - message: String? - ) { - self.status = status - self.message = message - } - - public let status: Int? - public let message: String? -} diff --git a/Projects/Services/DomainModule/Sources/Suggest/Entity/SuggestFunctionEntity.swift b/Projects/Services/DomainModule/Sources/Suggest/Entity/SuggestFunctionEntity.swift deleted file mode 100644 index d8de7bacf..000000000 --- a/Projects/Services/DomainModule/Sources/Suggest/Entity/SuggestFunctionEntity.swift +++ /dev/null @@ -1,22 +0,0 @@ -// -// SuggestFunctionEntity.swift -// DomainModule -// -// Created by KTH on 2023/04/14. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public struct SuggestFunctionEntity: Codable { - public init ( - status: Int?, - message: String? - ) { - self.status = status - self.message = message - } - - public let status: Int? - public let message: String? -} diff --git a/Projects/Services/DomainModule/Sources/Suggest/Repository/SuggestRepository.swift b/Projects/Services/DomainModule/Sources/Suggest/Repository/SuggestRepository.swift deleted file mode 100644 index a28c82c54..000000000 --- a/Projects/Services/DomainModule/Sources/Suggest/Repository/SuggestRepository.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// SuggestRepository.swift -// DomainModule -// -// Created by KTH on 2023/04/14. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule -import ErrorModule - -public protocol SuggestRepository { - func reportBug(userID: String, nickname: String, attaches: [String], content: String) -> Single - func suggestFunction(type: SuggestPlatformType, userID: String, content: String) -> Single - func modifySong(type: SuggestSongModifyType, - userID: String, - artist: String, - songTitle: String, - youtubeLink: String, - content: String) -> Single - func inquiryWeeklyChart(userID: String, content: String) -> Single -} diff --git a/Projects/Services/DomainModule/Sources/Suggest/UseCases/InquiryWeeklyChartUseCase.swift b/Projects/Services/DomainModule/Sources/Suggest/UseCases/InquiryWeeklyChartUseCase.swift deleted file mode 100644 index be26340c9..000000000 --- a/Projects/Services/DomainModule/Sources/Suggest/UseCases/InquiryWeeklyChartUseCase.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// InquiryWeeklyChartUseCase.swift -// DomainModule -// -// Created by KTH on 2023/04/14. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule - -public protocol InquiryWeeklyChartUseCase { - func execute(userID: String, content: String) -> Single -} diff --git a/Projects/Services/DomainModule/Sources/Suggest/UseCases/ModifySongUseCase.swift b/Projects/Services/DomainModule/Sources/Suggest/UseCases/ModifySongUseCase.swift deleted file mode 100644 index 2da010fca..000000000 --- a/Projects/Services/DomainModule/Sources/Suggest/UseCases/ModifySongUseCase.swift +++ /dev/null @@ -1,20 +0,0 @@ -// -// ModifySongUseCase.swift -// DomainModule -// -// Created by KTH on 2023/04/14. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule - -public protocol ModifySongUseCase { - func execute(type: SuggestSongModifyType, - userID: String, - artist: String, - songTitle: String, - youtubeLink: String, - content: String) -> Single -} diff --git a/Projects/Services/DomainModule/Sources/Suggest/UseCases/ReportBugUseCase.swift b/Projects/Services/DomainModule/Sources/Suggest/UseCases/ReportBugUseCase.swift deleted file mode 100644 index 237960b39..000000000 --- a/Projects/Services/DomainModule/Sources/Suggest/UseCases/ReportBugUseCase.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// ReportBugUseCase.swift -// DomainModule -// -// Created by KTH on 2023/04/14. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule - -public protocol ReportBugUseCase { - func execute(userID: String, nickname: String, attaches: [String], content: String) -> Single -} diff --git a/Projects/Services/DomainModule/Sources/Suggest/UseCases/SuggestFunctionUseCase.swift b/Projects/Services/DomainModule/Sources/Suggest/UseCases/SuggestFunctionUseCase.swift deleted file mode 100644 index 9cba76267..000000000 --- a/Projects/Services/DomainModule/Sources/Suggest/UseCases/SuggestFunctionUseCase.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// SuggestFunctionUseCase.swift -// DomainModule -// -// Created by KTH on 2023/04/14. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule - -public protocol SuggestFunctionUseCase { - func execute(type: SuggestPlatformType, userID: String, content: String) -> Single -} diff --git a/Projects/Services/DomainModule/Sources/User/Entity/FavoriteSongEntity.swift b/Projects/Services/DomainModule/Sources/User/Entity/FavoriteSongEntity.swift deleted file mode 100644 index e586743e2..000000000 --- a/Projects/Services/DomainModule/Sources/User/Entity/FavoriteSongEntity.swift +++ /dev/null @@ -1,17 +0,0 @@ -import Foundation - -public struct FavoriteSongEntity: Equatable { - public init( - likes: Int, - song: SongEntity, - isSelected: Bool - ) { - self.likes = likes - self.song = song - self.isSelected = isSelected - } - - public let likes: Int - public let song: SongEntity - public var isSelected: Bool -} diff --git a/Projects/Services/DomainModule/Sources/User/Entity/PlayListEntity.swift b/Projects/Services/DomainModule/Sources/User/Entity/PlayListEntity.swift deleted file mode 100644 index 5fea4ab9f..000000000 --- a/Projects/Services/DomainModule/Sources/User/Entity/PlayListEntity.swift +++ /dev/null @@ -1,25 +0,0 @@ -import Foundation - -public struct PlayListEntity: Equatable { - public init( - key: String, - title: String, - image: String, - songlist: [SongEntity], - image_version: Int, - isSelected: Bool = false - ) { - self.key = key - self.title = title - self.image = image - self.songlist = songlist - self.image_version = image_version - self.isSelected = isSelected - } - - public let image_version: Int - public let key, title, image: String - public let songlist: [SongEntity] - public var isSelected: Bool - -} diff --git a/Projects/Services/DomainModule/Sources/User/Entity/ProfileListEntity.swift b/Projects/Services/DomainModule/Sources/User/Entity/ProfileListEntity.swift deleted file mode 100644 index 39f0c4dd0..000000000 --- a/Projects/Services/DomainModule/Sources/User/Entity/ProfileListEntity.swift +++ /dev/null @@ -1,25 +0,0 @@ -// -// ProfileListEntity.swift -// DomainModule -// -// Created by KTH on 2023/02/18. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation - -public struct ProfileListEntity: Equatable { - public init( - type: String, - version: Int, - isSelected: Bool - ) { - self.type = type - self.version = version - self.isSelected = false - } - - public let type: String - public var isSelected: Bool - public var version: Int -} diff --git a/Projects/Services/DomainModule/Sources/User/Repository/UserRepository.swift b/Projects/Services/DomainModule/Sources/User/Repository/UserRepository.swift deleted file mode 100644 index 19f9f0765..000000000 --- a/Projects/Services/DomainModule/Sources/User/Repository/UserRepository.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// ArtistRepository.swift -// DomainModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule -import ErrorModule - -public protocol UserRepository { - func fetchProfileList() -> Single<[ProfileListEntity]> - func setProfile(image:String) -> Single - func setUserName(name:String) -> Single - func fetchPlayList() -> Single<[PlayListEntity]> - func fetchFavoriteSongs() -> Single<[FavoriteSongEntity]> - func editFavoriteSongsOrder(ids:[String]) -> Single - func editPlayListOrder(ids:[String]) -> Single - func deletePlayList(ids: [String]) -> Single - func deleteFavoriteList(ids: [String]) -> Single -} diff --git a/Projects/Services/DomainModule/Sources/User/UseCases/DeleteFavoriteListUseCase.swift b/Projects/Services/DomainModule/Sources/User/UseCases/DeleteFavoriteListUseCase.swift deleted file mode 100644 index 7e419bf3a..000000000 --- a/Projects/Services/DomainModule/Sources/User/UseCases/DeleteFavoriteListUseCase.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// DeleteLikeListUseCase.swift -// DomainModule -// -// Created by KTH on 2023/04/03. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule - -public protocol DeleteFavoriteListUseCase { - func execute(ids: [String]) -> Single -} diff --git a/Projects/Services/DomainModule/Sources/User/UseCases/DeletePlayListUseCase.swift b/Projects/Services/DomainModule/Sources/User/UseCases/DeletePlayListUseCase.swift deleted file mode 100644 index 64b3c7332..000000000 --- a/Projects/Services/DomainModule/Sources/User/UseCases/DeletePlayListUseCase.swift +++ /dev/null @@ -1,7 +0,0 @@ -import Foundation -import RxSwift -import DataMappingModule - -public protocol DeletePlayListUseCase { - func execute(ids: [String]) -> Single -} diff --git a/Projects/Services/DomainModule/Sources/User/UseCases/EditFavoriteSongsOrderUseCase.swift b/Projects/Services/DomainModule/Sources/User/UseCases/EditFavoriteSongsOrderUseCase.swift deleted file mode 100644 index b2130f47d..000000000 --- a/Projects/Services/DomainModule/Sources/User/UseCases/EditFavoriteSongsOrderUseCase.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// FetchArtistListUseCase.swift -// DomainModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule - -public protocol EditFavoriteSongsOrderUseCase { - func execute(ids:[String]) -> Single -} diff --git a/Projects/Services/DomainModule/Sources/User/UseCases/EditPlayListOrderUseCase.swift b/Projects/Services/DomainModule/Sources/User/UseCases/EditPlayListOrderUseCase.swift deleted file mode 100644 index 255132402..000000000 --- a/Projects/Services/DomainModule/Sources/User/UseCases/EditPlayListOrderUseCase.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// FetchArtistListUseCase.swift -// DomainModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule - -public protocol EditPlayListOrderUseCase { - func execute(ids:[String]) -> Single -} diff --git a/Projects/Services/DomainModule/Sources/User/UseCases/FetchFavoriteSongsUseCase.swift b/Projects/Services/DomainModule/Sources/User/UseCases/FetchFavoriteSongsUseCase.swift deleted file mode 100644 index 3f86c3181..000000000 --- a/Projects/Services/DomainModule/Sources/User/UseCases/FetchFavoriteSongsUseCase.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// FetchArtistListUseCase.swift -// DomainModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule - -public protocol FetchFavoriteSongsUseCase { - func execute() -> Single<[FavoriteSongEntity]> -} diff --git a/Projects/Services/DomainModule/Sources/User/UseCases/FetchPlayListUseCase.swift b/Projects/Services/DomainModule/Sources/User/UseCases/FetchPlayListUseCase.swift deleted file mode 100644 index 61d02f33f..000000000 --- a/Projects/Services/DomainModule/Sources/User/UseCases/FetchPlayListUseCase.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// FetchArtistListUseCase.swift -// DomainModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule - -public protocol FetchPlayListUseCase { - func execute() -> Single<[PlayListEntity]> -} diff --git a/Projects/Services/DomainModule/Sources/User/UseCases/FetchProfileListUseCase.swift b/Projects/Services/DomainModule/Sources/User/UseCases/FetchProfileListUseCase.swift deleted file mode 100644 index 81eca4c0b..000000000 --- a/Projects/Services/DomainModule/Sources/User/UseCases/FetchProfileListUseCase.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// FetchProfileListUseCase.swift -// DomainModule -// -// Created by KTH on 2023/02/18. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule - -public protocol FetchProfileListUseCase { - func execute() -> Single<[ProfileListEntity]> -} diff --git a/Projects/Services/DomainModule/Sources/User/UseCases/SetProfileUseCase.swift b/Projects/Services/DomainModule/Sources/User/UseCases/SetProfileUseCase.swift deleted file mode 100644 index cd632667a..000000000 --- a/Projects/Services/DomainModule/Sources/User/UseCases/SetProfileUseCase.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// FetchArtistListUseCase.swift -// DomainModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule - -public protocol SetProfileUseCase { - func execute(image:String) -> Single -} diff --git a/Projects/Services/DomainModule/Sources/User/UseCases/SetUserNameUseCase.swift b/Projects/Services/DomainModule/Sources/User/UseCases/SetUserNameUseCase.swift deleted file mode 100644 index c6c705085..000000000 --- a/Projects/Services/DomainModule/Sources/User/UseCases/SetUserNameUseCase.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// FetchArtistListUseCase.swift -// DomainModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule - -public protocol SetUserNameUseCase { - func execute(name:String) -> Single -} diff --git a/Projects/Services/DomainModule/Tests/.gitkeep b/Projects/Services/DomainModule/Tests/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/Projects/Services/DomainModule/Tests/TargetTest.swift b/Projects/Services/DomainModule/Tests/TargetTest.swift deleted file mode 100644 index b1cf79405..000000000 --- a/Projects/Services/DomainModule/Tests/TargetTest.swift +++ /dev/null @@ -1,17 +0,0 @@ -import XCTest - -class TargetTests: XCTestCase { - - override func setUpWithError() throws { - // Put setup code here. This method is called before the invocation of each test method in the class. - } - - override func tearDownWithError() throws { - // Put teardown code here. This method is called after the invocation of each test method in the class. - } - - func testExample() throws { - XCTAssertEqual("A", "A") - } - -} diff --git a/Projects/Services/NetworkModule/.swiftlint.yml b/Projects/Services/NetworkModule/.swiftlint.yml deleted file mode 100644 index ff44f9f28..000000000 --- a/Projects/Services/NetworkModule/.swiftlint.yml +++ /dev/null @@ -1,20 +0,0 @@ -excluded: - - "**/*/NeedleGenerated.swift" - - "Tuist" - - -force_cast: # From https://realm.github.io/SwiftLint/force_cast.html - warning # 강제 캐스팅은 error에서 warning으로 변경 - -disabled_rules: - - trailing_whitespace - - vertical_whitespace - - colon - - comma - - comment_spacing # 주석 여백 - - mark # //MARK 관련 warning - - opening_brace # 괄호 열 때 줄바꿈을 했는지 안했는지, (안했으면 warning) - - line_length # 한줄에 글자 수 제한 , warning: 120, error: 200 (default) - - statement_position # if는 반드시 else로 끝나야한다. - - identifier_name #변수명 글자 수 제한 - diff --git a/Projects/Services/NetworkModule/Project.swift b/Projects/Services/NetworkModule/Project.swift deleted file mode 100644 index ffa71531f..000000000 --- a/Projects/Services/NetworkModule/Project.swift +++ /dev/null @@ -1,12 +0,0 @@ -import ProjectDescription -import ProjectDescriptionHelpers - -let project = Project.makeModule( - name: "NetworkModule", - product: .staticFramework, - dependencies: [ - .Project.Module.Utility, - .Project.Service.APIKit, - .Project.Service.Domain - ] -) diff --git a/Projects/Services/NetworkModule/Sources/App/DataTransfer/FetchCheckVersionTransfer.swift b/Projects/Services/NetworkModule/Sources/App/DataTransfer/FetchCheckVersionTransfer.swift deleted file mode 100644 index 3215d5851..000000000 --- a/Projects/Services/NetworkModule/Sources/App/DataTransfer/FetchCheckVersionTransfer.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// FetchCheckVersionTransfer.swift -// NetworkModuleTests -// -// Created by yongbeomkwak on 2023/05/23. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import DataMappingModule -import DomainModule -import Utility - -public extension AppInfoDTO { - func toDomain() -> AppInfoEntity { - return AppInfoEntity( - flag: flag, - title: title ?? "", - description: description ?? "", - version: version ?? "", - specialLogo: specialLogo ?? false - ) - } -} diff --git a/Projects/Services/NetworkModule/Sources/App/Remote/RemoteAppDataSource.swift b/Projects/Services/NetworkModule/Sources/App/Remote/RemoteAppDataSource.swift deleted file mode 100644 index 802c7f231..000000000 --- a/Projects/Services/NetworkModule/Sources/App/Remote/RemoteAppDataSource.swift +++ /dev/null @@ -1,17 +0,0 @@ -// -// RemoteAppDataSource.swift -// NetworkModuleTests -// -// Created by yongbeomkwak on 2023/05/23. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import DataMappingModule -import ErrorModule -import DomainModule -import RxSwift - -public protocol RemoteAppDataSource { - func fetchCheckApp() -> Single -} diff --git a/Projects/Services/NetworkModule/Sources/App/Remote/RemoteAppDataSourceImpl.swift b/Projects/Services/NetworkModule/Sources/App/Remote/RemoteAppDataSourceImpl.swift deleted file mode 100644 index 402e82cea..000000000 --- a/Projects/Services/NetworkModule/Sources/App/Remote/RemoteAppDataSourceImpl.swift +++ /dev/null @@ -1,22 +0,0 @@ -// -// RemoteAppDataSourceImpl.swift -// NetworkModuleTests -// -// Created by yongbeomkwak on 2023/05/23. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import APIKit -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule -import Foundation - -public final class RemoteAppDataSourceImpl: BaseRemoteDataSource, RemoteAppDataSource { - public func fetchCheckApp() -> Single { - request(.checkVersion) - .map(AppInfoDTO.self) - .map({$0.toDomain()}) - } -} diff --git a/Projects/Services/NetworkModule/Sources/Artist/DataTransfer/FetchArtistListTransfer.swift b/Projects/Services/NetworkModule/Sources/Artist/DataTransfer/FetchArtistListTransfer.swift deleted file mode 100644 index 0ba4668f3..000000000 --- a/Projects/Services/NetworkModule/Sources/Artist/DataTransfer/FetchArtistListTransfer.swift +++ /dev/null @@ -1,33 +0,0 @@ -// -// FetchArtistListTransfer.swift -// NetworkModuleTests -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import DataMappingModule -import DomainModule -import Utility - -public extension ArtistListResponseDTO { - func toDomain() -> ArtistListEntity { - ArtistListEntity( - ID: ID, - name: name, - short: short, - group: group?.kr ?? "", - title: title, - description: description, - color: color ?? [], - youtube: youtube ?? "", - twitch: twitch ?? "", - instagram: instagram ?? "", - imageRoundVersion: image?.round ?? 0, - imageSquareVersion: image?.square ?? 0, - graduated: graduated ?? false, - isHiddenItem: false - ) - } -} diff --git a/Projects/Services/NetworkModule/Sources/Artist/DataTransfer/FetchArtistSongListTransfer.swift b/Projects/Services/NetworkModule/Sources/Artist/DataTransfer/FetchArtistSongListTransfer.swift deleted file mode 100644 index 8dd6473f9..000000000 --- a/Projects/Services/NetworkModule/Sources/Artist/DataTransfer/FetchArtistSongListTransfer.swift +++ /dev/null @@ -1,28 +0,0 @@ -// -// FetchArtistSongListTransfer.swift -// NetworkModule -// -// Created by KTH on 2023/02/10. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import DataMappingModule -import DomainModule -import Utility - -public extension ArtistSongListResponseDTO { - func toDomain() -> ArtistSongListEntity { - ArtistSongListEntity( - ID: ID, - title: title, - artist: artist, - remix: remix, - reaction: reaction, - date: date.changeDateFormat(origin: "yyMMdd", result: "yyyy.MM.dd"), - views: total?.views ?? 0, - last: total?.last ?? 0, - isSelected: false - ) - } -} diff --git a/Projects/Services/NetworkModule/Sources/Artist/Remote/RemoteArtistDataSource.swift b/Projects/Services/NetworkModule/Sources/Artist/Remote/RemoteArtistDataSource.swift deleted file mode 100644 index 001c29f06..000000000 --- a/Projects/Services/NetworkModule/Sources/Artist/Remote/RemoteArtistDataSource.swift +++ /dev/null @@ -1,18 +0,0 @@ -// -// RemoteArtistDataSource.swift -// NetworkModuleTests -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import DataMappingModule -import ErrorModule -import DomainModule -import RxSwift -import Foundation - -public protocol RemoteArtistDataSource { - func fetchArtistList() -> Single<[ArtistListEntity]> - func fetchArtistSongList(id: String, sort: ArtistSongSortType, page: Int) -> Single<[ArtistSongListEntity]> -} diff --git a/Projects/Services/NetworkModule/Sources/Artist/Remote/RemoteArtistDataSourceImpl.swift b/Projects/Services/NetworkModule/Sources/Artist/Remote/RemoteArtistDataSourceImpl.swift deleted file mode 100644 index 4ec3cad0c..000000000 --- a/Projects/Services/NetworkModule/Sources/Artist/Remote/RemoteArtistDataSourceImpl.swift +++ /dev/null @@ -1,28 +0,0 @@ -// -// RemoteArtistDataSourceImpl.swift -// NetworkModuleTests -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import APIKit -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule -import Foundation - -public final class RemoteArtistDataSourceImpl: BaseRemoteDataSource, RemoteArtistDataSource { - public func fetchArtistList() -> Single<[ArtistListEntity]> { - request(.fetchArtistList) - .map([ArtistListResponseDTO].self) - .map { $0.map { $0.toDomain() } } - } - - public func fetchArtistSongList(id: String, sort: ArtistSongSortType, page: Int) -> Single<[ArtistSongListEntity]> { - request(.fetchArtistSongList(id: id, sort: sort, page: page)) - .map([ArtistSongListResponseDTO].self) - .map { $0.map { $0.toDomain() } } - } -} diff --git a/Projects/Services/NetworkModule/Sources/Auth/DataTransfer/FetchNaverUserInfoTransfer.swift b/Projects/Services/NetworkModule/Sources/Auth/DataTransfer/FetchNaverUserInfoTransfer.swift deleted file mode 100644 index b52571c5e..000000000 --- a/Projects/Services/NetworkModule/Sources/Auth/DataTransfer/FetchNaverUserInfoTransfer.swift +++ /dev/null @@ -1,25 +0,0 @@ -// -// FetchArtistListTransfer.swift -// NetworkModuleTests -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import DataMappingModule -import DomainModule -import Utility - -public extension NaverUserInfoResponseDTO { - func toDomain() -> NaverUserInfoEntity { - - NaverUserInfoEntity( - resultcode: resultcode , - message: message, - id: response.id, - nickname: response.nickname - ) - - } -} diff --git a/Projects/Services/NetworkModule/Sources/Auth/DataTransfer/FetchTokenTransfer.swift b/Projects/Services/NetworkModule/Sources/Auth/DataTransfer/FetchTokenTransfer.swift deleted file mode 100644 index 3923c738f..000000000 --- a/Projects/Services/NetworkModule/Sources/Auth/DataTransfer/FetchTokenTransfer.swift +++ /dev/null @@ -1,20 +0,0 @@ -// -// FetchArtistListTransfer.swift -// NetworkModuleTests -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import DataMappingModule -import DomainModule -import Utility - -public extension AuthLoginResponseDTO { - func toDomain() -> AuthLoginEntity { - AuthLoginEntity( - token:token - ) - } -} diff --git a/Projects/Services/NetworkModule/Sources/Auth/DataTransfer/FetchUserInfoTransfer.swift b/Projects/Services/NetworkModule/Sources/Auth/DataTransfer/FetchUserInfoTransfer.swift deleted file mode 100644 index 494e1bbf6..000000000 --- a/Projects/Services/NetworkModule/Sources/Auth/DataTransfer/FetchUserInfoTransfer.swift +++ /dev/null @@ -1,26 +0,0 @@ -// -// FetchArtistListTransfer.swift -// NetworkModuleTests -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import DataMappingModule -import DomainModule -import Utility - -public extension AuthUserInfoResponseDTO { - func toDomain() -> AuthUserInfoEntity { - AuthUserInfoEntity( - id: id, - platform: platform, - displayName: displayName, - first_login_time: firstLoginTime, - first: first, - profile: profile?.type ?? "", - version: profile?.version ?? 0 - ) - } -} diff --git a/Projects/Services/NetworkModule/Sources/Auth/Remote/RemoteAuthDataSource.swift b/Projects/Services/NetworkModule/Sources/Auth/Remote/RemoteAuthDataSource.swift deleted file mode 100644 index 426b1d46e..000000000 --- a/Projects/Services/NetworkModule/Sources/Auth/Remote/RemoteAuthDataSource.swift +++ /dev/null @@ -1,12 +0,0 @@ -import DataMappingModule -import ErrorModule -import DomainModule -import RxSwift -import Foundation - -public protocol RemoteAuthDataSource { - func fetchToken(token:String,type:ProviderType) -> Single - func fetchNaverUserInfo(tokenType:String,accessToken:String) -> Single - func fetchUserInfo() -> Single - func withdrawUserInfo() -> Single -} diff --git a/Projects/Services/NetworkModule/Sources/Auth/Remote/RemoteAuthDataSourceImpl.swift b/Projects/Services/NetworkModule/Sources/Auth/Remote/RemoteAuthDataSourceImpl.swift deleted file mode 100644 index 0226570e3..000000000 --- a/Projects/Services/NetworkModule/Sources/Auth/Remote/RemoteAuthDataSourceImpl.swift +++ /dev/null @@ -1,32 +0,0 @@ -import APIKit -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule -import Foundation - -public final class RemoteAuthDataSourceImpl: BaseRemoteDataSource, RemoteAuthDataSource { - public func fetchToken(token: String, type: ProviderType) -> Single { - request(.fetchToken(token: token, type: type)) - .map(AuthLoginResponseDTO.self) - .map({$0.toDomain()}) - } - - public func fetchNaverUserInfo(tokenType: String, accessToken: String) -> RxSwift.Single { - request(.fetchNaverUserInfo(tokenType: tokenType, accessToken: accessToken)) - .map(NaverUserInfoResponseDTO.self) - .map({$0.toDomain()}) - } - - public func fetchUserInfo() -> Single { - request(.fetchUserInfo) - .map(AuthUserInfoResponseDTO.self) - .map({$0.toDomain()}) - } - - public func withdrawUserInfo() -> Single { - request(.withdrawUserInfo) - .map(BaseResponseDTO.self) - .map{ $0.toDomain() } - } -} diff --git a/Projects/Services/NetworkModule/Sources/Base/BaseRemoteDataSource.swift b/Projects/Services/NetworkModule/Sources/Base/BaseRemoteDataSource.swift deleted file mode 100644 index 613852dbc..000000000 --- a/Projects/Services/NetworkModule/Sources/Base/BaseRemoteDataSource.swift +++ /dev/null @@ -1,61 +0,0 @@ -import APIKit -import UIKit -import ErrorModule -import Foundation -import KeychainModule -import RxSwift -import Moya -import RxMoya -import Utility - -public class BaseRemoteDataSource { - private let keychain: any Keychain - private let provider: MoyaProvider - private let decoder = JSONDecoder() - private let maxRetryCount = 2 - - public init( - keychain: any Keychain, - provider: MoyaProvider? = nil - ) { - self.keychain = keychain - - #if DEBUG - self.provider = provider ?? MoyaProvider(plugins: [JwtPlugin(keychain: keychain), CustomLoggingPlugin()]) - #else - self.provider = provider ?? MoyaProvider(plugins: [JwtPlugin(keychain: keychain)]) - #endif - } - - public func request(_ api: API) -> Single { - return Single.create { single in - var disposabels = [Disposable]() - disposabels.append( - self.defaultRequest(api).subscribe( - onSuccess: { single(.success($0)) }, - onFailure: { single(.failure($0)) }) - ) - return Disposables.create(disposabels) - } - } -} - -private extension BaseRemoteDataSource { - func defaultRequest(_ api: API) -> Single { - return provider.rx.request(api) - .timeout(.seconds(10), scheduler: MainScheduler.asyncInstance) - .catch { error in - guard let errorCode = (error as? MoyaError)?.response?.statusCode else { - if let moyaError = (error as? MoyaError), moyaError.errorCode == 6 { - return Single.error(api.errorMap[1009] ?? error) - } - return Single.error(error) - } - return Single.error(api.errorMap[errorCode] ?? error) - } - } - - func checkIsApiNeedsAuthorization(_ api: API) -> Bool { - api.jwtTokenType == .accessToken - } -} diff --git a/Projects/Services/NetworkModule/Sources/Base/DataTransfer/BaseTransfer.swift b/Projects/Services/NetworkModule/Sources/Base/DataTransfer/BaseTransfer.swift deleted file mode 100644 index bf453379b..000000000 --- a/Projects/Services/NetworkModule/Sources/Base/DataTransfer/BaseTransfer.swift +++ /dev/null @@ -1,20 +0,0 @@ -// -// BaseTransfer.swift -// NetworkModule -// -// Created by KTH on 2023/02/18. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import DataMappingModule -import DomainModule -import Utility - -public extension BaseResponseDTO { - func toDomain() -> BaseEntity { - BaseEntity( - status: status - ) - } -} diff --git a/Projects/Services/NetworkModule/Sources/Chart/DataTransfer/FetchChartRankingTransfer.swift b/Projects/Services/NetworkModule/Sources/Chart/DataTransfer/FetchChartRankingTransfer.swift deleted file mode 100644 index 574cd5639..000000000 --- a/Projects/Services/NetworkModule/Sources/Chart/DataTransfer/FetchChartRankingTransfer.swift +++ /dev/null @@ -1,45 +0,0 @@ -import DataMappingModule -import DomainModule -import Utility - -public extension SingleChartRankingResponseDTO { - func toDomain(type: ChartDateType) -> ChartRankingEntity { - var views: Int = 0 - var last: Int = 0 - var increase: Int = 0 - switch type { - case .monthly: - views = monthly?.views ?? 0 - last = monthly?.last ?? 0 - increase = monthly?.increase ?? 0 - case .weekly: - views = weekly?.views ?? 0 - last = weekly?.last ?? 0 - increase = weekly?.increase ?? 0 - case .daily: - views = daily?.views ?? 0 - last = daily?.last ?? 0 - increase = daily?.increase ?? 0 - case .hourly: - views = hourly?.views ?? 0 - last = hourly?.last ?? 0 - increase = hourly?.increase ?? 0 - case .total: - views = total?.views ?? 0 - last = total?.last ?? 0 - increase = total?.increase ?? 0 - } - - return ChartRankingEntity( - id: id, - title: title, - artist: artist, - remix: remix, - reaction: reaction, - views: views, - last: last, - increase: increase, - date: date.changeDateFormat(origin: "yyMMdd", result: "yyyy.MM.dd") - ) - } -} diff --git a/Projects/Services/NetworkModule/Sources/Chart/Remote/RemoteChartDataSource.swift b/Projects/Services/NetworkModule/Sources/Chart/Remote/RemoteChartDataSource.swift deleted file mode 100644 index 106dc9035..000000000 --- a/Projects/Services/NetworkModule/Sources/Chart/Remote/RemoteChartDataSource.swift +++ /dev/null @@ -1,10 +0,0 @@ -import DataMappingModule -import ErrorModule -import DomainModule -import RxSwift -import Foundation - -public protocol RemoteChartDataSource { - func fetchChartRanking(type: ChartDateType, limit: Int) -> Single<[ChartRankingEntity]> - func fetchChartUpdateTime(type: ChartDateType) -> Single -} diff --git a/Projects/Services/NetworkModule/Sources/Chart/Remote/RemoteChartDataSourceImpl.swift b/Projects/Services/NetworkModule/Sources/Chart/Remote/RemoteChartDataSourceImpl.swift deleted file mode 100644 index 779d12599..000000000 --- a/Projects/Services/NetworkModule/Sources/Chart/Remote/RemoteChartDataSourceImpl.swift +++ /dev/null @@ -1,19 +0,0 @@ -import APIKit -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule -import Foundation - -public final class RemoteChartDataSourceImpl: BaseRemoteDataSource, RemoteChartDataSource { - public func fetchChartRanking(type: ChartDateType, limit: Int) -> Single<[ChartRankingEntity]> { - request(.fetchChartRanking(type: type, limit: limit)) - .map([SingleChartRankingResponseDTO].self) - .map { $0.map { $0.toDomain(type: type) } } - } - - public func fetchChartUpdateTime(type: ChartDateType) -> Single { - request(.fetchChartUpdateTime(type: type)) - .map { String(data: $0.data, encoding: .utf8) ?? "" } - } -} diff --git a/Projects/Services/NetworkModule/Sources/Like/DataTransfer/FetchLikeTransfer.swift b/Projects/Services/NetworkModule/Sources/Like/DataTransfer/FetchLikeTransfer.swift deleted file mode 100644 index 5b4d026d6..000000000 --- a/Projects/Services/NetworkModule/Sources/Like/DataTransfer/FetchLikeTransfer.swift +++ /dev/null @@ -1,21 +0,0 @@ -// -// FetchLikeTransfer.swift -// NetworkModuleTests -// -// Created by YoungK on 2023/04/03. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import DataMappingModule -import DomainModule -import Utility - -public extension LikeResponseDTO { - func toDomain() -> LikeEntity { - LikeEntity( - status: status ?? 200, - likes: likes - ) - } -} diff --git a/Projects/Services/NetworkModule/Sources/Like/Remote/RemoteLikeDataSource.swift b/Projects/Services/NetworkModule/Sources/Like/Remote/RemoteLikeDataSource.swift deleted file mode 100644 index 1b9fbc301..000000000 --- a/Projects/Services/NetworkModule/Sources/Like/Remote/RemoteLikeDataSource.swift +++ /dev/null @@ -1,21 +0,0 @@ -// -// ArtistRepository.swift -// DomainModule -// -// Created by KTH on 2023/02/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import RxSwift -import DataMappingModule -import ErrorModule -import DomainModule - -public protocol RemoteLikeDataSource { - func fetchLikeNumOfSong(id:String) -> Single - func addLikeSong(id:String) -> Single - func cancelLikeSong(id:String) -> Single - - -} diff --git a/Projects/Services/NetworkModule/Sources/Like/Remote/RemoteLikeDataSourceImpl.swift b/Projects/Services/NetworkModule/Sources/Like/Remote/RemoteLikeDataSourceImpl.swift deleted file mode 100644 index a8a8ffd93..000000000 --- a/Projects/Services/NetworkModule/Sources/Like/Remote/RemoteLikeDataSourceImpl.swift +++ /dev/null @@ -1,34 +0,0 @@ -import APIKit -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule -import Foundation - - -public final class RemoteLikeDataSourceImpl: BaseRemoteDataSource, RemoteLikeDataSource { - - public func fetchLikeNumOfSong(id: String) -> Single { - request(.fetchLikeNumOfSong(id: id)) - .map(FavoriteSongsResponseDTO.self) - .map({$0.toDomain()}) - } - - public func addLikeSong(id: String) -> Single { - request(.addLikeSong(id: id)) - .map(LikeResponseDTO.self) - .map({$0.toDomain()}) - } - - public func cancelLikeSong(id: String) -> Single { - request(.cancelLikeSong(id: id)) - .map(LikeResponseDTO.self) - .map({$0.toDomain()}) - } - - - - - - -} diff --git a/Projects/Services/NetworkModule/Sources/Notice/DataTransfer/FetchNoticeCategoriesTransfer.swift b/Projects/Services/NetworkModule/Sources/Notice/DataTransfer/FetchNoticeCategoriesTransfer.swift deleted file mode 100644 index 072905fc9..000000000 --- a/Projects/Services/NetworkModule/Sources/Notice/DataTransfer/FetchNoticeCategoriesTransfer.swift +++ /dev/null @@ -1,20 +0,0 @@ -// -// FetchNoticeCategoriesTransfer.swift -// NetworkModuleTests -// -// Created by KTH on 2023/04/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import DataMappingModule -import DomainModule - -public extension FetchNoticeCategoriesResponseDTO { - func toDomain() -> FetchNoticeCategoriesEntity { - FetchNoticeCategoriesEntity( - type: type, - category: category - ) - } -} diff --git a/Projects/Services/NetworkModule/Sources/Notice/DataTransfer/FetchNoticeTransfer.swift b/Projects/Services/NetworkModule/Sources/Notice/DataTransfer/FetchNoticeTransfer.swift deleted file mode 100644 index aec296cea..000000000 --- a/Projects/Services/NetworkModule/Sources/Notice/DataTransfer/FetchNoticeTransfer.swift +++ /dev/null @@ -1,28 +0,0 @@ -// -// FetchNoticeTransfer.swift -// NetworkModuleTests -// -// Created by KTH on 2023/04/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import DataMappingModule -import DomainModule -import Utility - -public extension FetchNoticeResponseDTO { - func toDomain() -> FetchNoticeEntity { - FetchNoticeEntity( - id: id, - category: category?.category ?? "", - title: title, - thumbnail: thumbnail, - content: content, - images: images, - createAt: createAt, - startAt: startAt, - endAt: endAt - ) - } -} diff --git a/Projects/Services/NetworkModule/Sources/Notice/Remote/RemoteNoticeDataSource.swift b/Projects/Services/NetworkModule/Sources/Notice/Remote/RemoteNoticeDataSource.swift deleted file mode 100644 index f0af29cea..000000000 --- a/Projects/Services/NetworkModule/Sources/Notice/Remote/RemoteNoticeDataSource.swift +++ /dev/null @@ -1,18 +0,0 @@ -// -// RemoteNoticeDataSource.swift -// NetworkModule -// -// Created by KTH on 2023/04/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import DataMappingModule -import ErrorModule -import DomainModule -import RxSwift -import Foundation - -public protocol RemoteNoticeDataSource { - func fetchNotice(type: NoticeType) -> Single<[FetchNoticeEntity]> - func fetchNoticeCategories() -> Single<[FetchNoticeCategoriesEntity]> -} diff --git a/Projects/Services/NetworkModule/Sources/Notice/Remote/RemoteNoticeDataSourceImpl.swift b/Projects/Services/NetworkModule/Sources/Notice/Remote/RemoteNoticeDataSourceImpl.swift deleted file mode 100644 index cdea5f251..000000000 --- a/Projects/Services/NetworkModule/Sources/Notice/Remote/RemoteNoticeDataSourceImpl.swift +++ /dev/null @@ -1,28 +0,0 @@ -// -// RemoteNoticeDataSourceImpl.swift -// NetworkModule -// -// Created by KTH on 2023/04/08. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import APIKit -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule -import Foundation - -public final class RemoteNoticeDataSourceImpl: BaseRemoteDataSource, RemoteNoticeDataSource { - public func fetchNotice(type: NoticeType) -> Single<[FetchNoticeEntity]> { - request(.fetchNotice(type: type)) - .map([FetchNoticeResponseDTO].self) - .map { $0.map { $0.toDomain() }} - } - - public func fetchNoticeCategories() -> Single<[FetchNoticeCategoriesEntity]> { - request(.fetchNoticeCategories) - .map([FetchNoticeCategoriesResponseDTO].self) - .map{ $0.map{ FetchNoticeCategoriesEntity(type: $0.type, category: $0.category) }} - } -} diff --git a/Projects/Services/NetworkModule/Sources/Play/DataTransfer/PostPlaybackLogTransfer.swift b/Projects/Services/NetworkModule/Sources/Play/DataTransfer/PostPlaybackLogTransfer.swift deleted file mode 100644 index 98442e3fa..000000000 --- a/Projects/Services/NetworkModule/Sources/Play/DataTransfer/PostPlaybackLogTransfer.swift +++ /dev/null @@ -1,22 +0,0 @@ -// -// PostPlaybackLogTransfer.swift -// NetworkModule -// -// Created by KTH on 2023/08/27. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import DataMappingModule -import DomainModule -import Utility - -public extension PlaybackLogResponseDTO { - func toDomain() -> PlaybackLogEntity { - return PlaybackLogEntity( - id: songId, - title: title, - artist: artist - ) - } -} diff --git a/Projects/Services/NetworkModule/Sources/Play/Remote/RemotePlayDataSource.swift b/Projects/Services/NetworkModule/Sources/Play/Remote/RemotePlayDataSource.swift deleted file mode 100644 index d692e2f9b..000000000 --- a/Projects/Services/NetworkModule/Sources/Play/Remote/RemotePlayDataSource.swift +++ /dev/null @@ -1,9 +0,0 @@ -import DataMappingModule -import ErrorModule -import DomainModule -import RxSwift -import Foundation - -public protocol RemotePlayDataSource { - func postPlaybackLog(item: Data) -> Single -} diff --git a/Projects/Services/NetworkModule/Sources/Play/Remote/RemotePlayDataSourceImpl.swift b/Projects/Services/NetworkModule/Sources/Play/Remote/RemotePlayDataSourceImpl.swift deleted file mode 100644 index 664eb3999..000000000 --- a/Projects/Services/NetworkModule/Sources/Play/Remote/RemotePlayDataSourceImpl.swift +++ /dev/null @@ -1,14 +0,0 @@ -import APIKit -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule -import Foundation - -public final class RemotePlayDataSourceImpl: BaseRemoteDataSource, RemotePlayDataSource { - public func postPlaybackLog(item: Data) -> Single { - request(.postPlaybackLog(item: item)) - .map(PlaybackLogResponseDTO.self) - .map({$0.toDomain()}) - } -} diff --git a/Projects/Services/NetworkModule/Sources/Playlist/DataTransfer/AddSongTransfer.swift b/Projects/Services/NetworkModule/Sources/Playlist/DataTransfer/AddSongTransfer.swift deleted file mode 100644 index 0b1c39e00..000000000 --- a/Projects/Services/NetworkModule/Sources/Playlist/DataTransfer/AddSongTransfer.swift +++ /dev/null @@ -1,14 +0,0 @@ -import DataMappingModule -import DomainModule -import Utility - - -public extension AddSongResponseDTO { - func toDomain() -> AddSongEntity { - AddSongEntity(status: status, - added_songs_length: addedSongsLength, - duplicated: duplicated, - description: "" - ) - } -} diff --git a/Projects/Services/NetworkModule/Sources/Playlist/DataTransfer/EditPlayListNameTransfer.swift b/Projects/Services/NetworkModule/Sources/Playlist/DataTransfer/EditPlayListNameTransfer.swift deleted file mode 100644 index 84e4614db..000000000 --- a/Projects/Services/NetworkModule/Sources/Playlist/DataTransfer/EditPlayListNameTransfer.swift +++ /dev/null @@ -1,10 +0,0 @@ -import DataMappingModule -import DomainModule -import Utility - - -public extension EditPlayListNameResponseDTO { - func toDomain() -> EditPlayListNameEntity { - EditPlayListNameEntity(title: title, status: status) - } -} diff --git a/Projects/Services/NetworkModule/Sources/Playlist/DataTransfer/FetchPlayListDetailResponseDTO.swift b/Projects/Services/NetworkModule/Sources/Playlist/DataTransfer/FetchPlayListDetailResponseDTO.swift deleted file mode 100644 index d0ff6b57a..000000000 --- a/Projects/Services/NetworkModule/Sources/Playlist/DataTransfer/FetchPlayListDetailResponseDTO.swift +++ /dev/null @@ -1,19 +0,0 @@ -import DataMappingModule -import DomainModule -import Utility - - -public extension SinglePlayListDetailResponseDTO { - func toDomain() -> PlayListDetailEntity { - PlayListDetailEntity( - title: title, - songs: songs?.map({$0.toDomain()}) ?? [], - public: `public` ?? false, - key: key ?? "", - image: image.name ?? "", - image_square_version: image.square ?? 0, - image_round_version: image.round ?? 0, - version: image.version ?? 0 - ) - } -} diff --git a/Projects/Services/NetworkModule/Sources/Playlist/DataTransfer/FetchRecommendPlayListTransfer.swift b/Projects/Services/NetworkModule/Sources/Playlist/DataTransfer/FetchRecommendPlayListTransfer.swift deleted file mode 100644 index 0e0d263d0..000000000 --- a/Projects/Services/NetworkModule/Sources/Playlist/DataTransfer/FetchRecommendPlayListTransfer.swift +++ /dev/null @@ -1,16 +0,0 @@ -import DataMappingModule -import DomainModule -import Utility - - -public extension SingleRecommendPlayListResponseDTO { - func toDomain() -> RecommendPlayListEntity { - RecommendPlayListEntity( - key:key, - title: title, - public: `public`, - image_round_version: image.round, - image_sqaure_version: image.square - ) - } -} diff --git a/Projects/Services/NetworkModule/Sources/Playlist/DataTransfer/PlayListBaseTransfer.swift b/Projects/Services/NetworkModule/Sources/Playlist/DataTransfer/PlayListBaseTransfer.swift deleted file mode 100644 index 8723e03ab..000000000 --- a/Projects/Services/NetworkModule/Sources/Playlist/DataTransfer/PlayListBaseTransfer.swift +++ /dev/null @@ -1,10 +0,0 @@ -import DataMappingModule -import DomainModule -import Utility - - -public extension PlayListBaseResponseDTO { - func toDomain() -> PlayListBaseEntity { - PlayListBaseEntity(status: status,key: key) - } -} diff --git a/Projects/Services/NetworkModule/Sources/Playlist/Remote/RemotePlayListDataSource.swift b/Projects/Services/NetworkModule/Sources/Playlist/Remote/RemotePlayListDataSource.swift deleted file mode 100644 index d506ff688..000000000 --- a/Projects/Services/NetworkModule/Sources/Playlist/Remote/RemotePlayListDataSource.swift +++ /dev/null @@ -1,17 +0,0 @@ -import DataMappingModule -import ErrorModule -import DomainModule -import RxSwift -import Foundation - -public protocol RemotePlayListDataSource { - func fetchRecommendPlayList() -> Single<[RecommendPlayListEntity]> - func fetchPlayListDetail(id:String,type:PlayListType) -> Single - func createPlayList(title:String) -> Single - func editPlayList(key:String,songs:[String]) -> Single - func editPlayListName(key:String,title:String) -> Single - func deletePlayList(key:String) -> Single - func loadPlayList(key:String) -> Single - func addSongIntoPlayList(key:String,songs:[String]) -> Single - func removeSongs(key:String,songs:[String]) -> Single -} diff --git a/Projects/Services/NetworkModule/Sources/Playlist/Remote/RemotePlayListDataSourceImpl.swift b/Projects/Services/NetworkModule/Sources/Playlist/Remote/RemotePlayListDataSourceImpl.swift deleted file mode 100644 index 74856b716..000000000 --- a/Projects/Services/NetworkModule/Sources/Playlist/Remote/RemotePlayListDataSourceImpl.swift +++ /dev/null @@ -1,74 +0,0 @@ -import APIKit -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule -import Foundation - - -public final class RemotePlayListDataSourceImpl: BaseRemoteDataSource, RemotePlayListDataSource { - - - public func fetchRecommendPlayList() ->Single<[RecommendPlayListEntity]> { - request(.fetchRecommendPlayList) - .map([SingleRecommendPlayListResponseDTO].self) - .map{$0.map{$0.toDomain()}} - - } - - public func fetchPlayListDetail(id: String,type:PlayListType) ->Single { - request(.fetchPlayListDetail(id: id,type: type)) - .map(SinglePlayListDetailResponseDTO.self) - .map({$0.toDomain()}) - } - - public func createPlayList(title: String) -> Single { - request(.createPlayList(title: title)) - .map(PlayListBaseResponseDTO.self) - .map({$0.toDomain()}) - } - - public func editPlayList(key: String,songs: [String]) -> Single { - request(.editPlayList(key: key,songs: songs)) - .map(BaseResponseDTO.self) - .map({$0.toDomain()}) - } - - public func editPlayListName(key: String,title:String) -> Single { - request(.editPlayListName(key: key,title:title)) - .map(EditPlayListNameResponseDTO.self) - .map({$0.toDomain()}) - } - - public func deletePlayList(key: String) -> Single { - request(.deletePlayList(key: key)) - .map(BaseResponseDTO.self) - .map({$0.toDomain()}) - } - - public func loadPlayList(key: String) -> Single { - request(.loadPlayList(key: key)) - .map(PlayListBaseResponseDTO.self) - .map({$0.toDomain()}) - } - - public func addSongIntoPlayList(key: String, songs: [String]) -> Single { - request(.addSongIntoPlayList(key: key, songs: songs)) - .map(AddSongResponseDTO.self) - .map({$0.toDomain()}) - - } - - public func removeSongs(key:String,songs:[String]) -> Single { - request(.removeSongs(key: key, songs: songs)) - .map(BaseResponseDTO.self) - .map({$0.toDomain()}) - } - - - - - - - -} diff --git a/Projects/Services/NetworkModule/Sources/Qna/DataTransfer/FetchCategoriesTransfer.swift b/Projects/Services/NetworkModule/Sources/Qna/DataTransfer/FetchCategoriesTransfer.swift deleted file mode 100644 index f8ca68a80..000000000 --- a/Projects/Services/NetworkModule/Sources/Qna/DataTransfer/FetchCategoriesTransfer.swift +++ /dev/null @@ -1,12 +0,0 @@ -import DataMappingModule -import DomainModule -import Utility - - -public extension QnaCategoryResponseDTO { - func toDomain() -> QnaCategoryEntity { - QnaCategoryEntity( - category: category - ) - } -} diff --git a/Projects/Services/NetworkModule/Sources/Qna/DataTransfer/FetchQnaTransfer.swift b/Projects/Services/NetworkModule/Sources/Qna/DataTransfer/FetchQnaTransfer.swift deleted file mode 100644 index 696dc4294..000000000 --- a/Projects/Services/NetworkModule/Sources/Qna/DataTransfer/FetchQnaTransfer.swift +++ /dev/null @@ -1,16 +0,0 @@ -import DataMappingModule -import DomainModule -import Utility - - -public extension QnaResponseDTO { - func toDomain() -> QnaEntity { - QnaEntity( - create_at: createAt, - category: category?.category ?? "", - question: question, - description: description, - isOpen: false - ) - } -} diff --git a/Projects/Services/NetworkModule/Sources/Qna/Remote/RemoteQnaDataSource.swift b/Projects/Services/NetworkModule/Sources/Qna/Remote/RemoteQnaDataSource.swift deleted file mode 100644 index a5bc8bd39..000000000 --- a/Projects/Services/NetworkModule/Sources/Qna/Remote/RemoteQnaDataSource.swift +++ /dev/null @@ -1,10 +0,0 @@ -import DataMappingModule -import ErrorModule -import DomainModule -import RxSwift -import Foundation - -public protocol RemoteQnaDataSource { - func fetchCategories() -> Single<[QnaCategoryEntity]> - func fetchQna() -> Single<[QnaEntity]> -} diff --git a/Projects/Services/NetworkModule/Sources/Qna/Remote/RemoteQnaDataSourceImpl.swift b/Projects/Services/NetworkModule/Sources/Qna/Remote/RemoteQnaDataSourceImpl.swift deleted file mode 100644 index d762b4dac..000000000 --- a/Projects/Services/NetworkModule/Sources/Qna/Remote/RemoteQnaDataSourceImpl.swift +++ /dev/null @@ -1,21 +0,0 @@ -import APIKit -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule -import Foundation - - -public final class RemoteQnaDataSourceImpl: BaseRemoteDataSource, RemoteQnaDataSource { - public func fetchCategories() -> Single<[QnaCategoryEntity]> { - return request(.fetchQnaCategories) - .map([QnaCategoryResponseDTO].self) - .map({$0.map({QnaCategoryEntity(category: $0.category)})}) - } - - public func fetchQna() -> Single<[QnaEntity]> { - return request(.fetchQna) - .map([QnaResponseDTO].self) - .map({$0.map({$0.toDomain()})}) - } -} diff --git a/Projects/Services/NetworkModule/Sources/Songs/DataTransfer/FetchLyricsTransfer.swift b/Projects/Services/NetworkModule/Sources/Songs/DataTransfer/FetchLyricsTransfer.swift deleted file mode 100644 index c7c3ff52f..000000000 --- a/Projects/Services/NetworkModule/Sources/Songs/DataTransfer/FetchLyricsTransfer.swift +++ /dev/null @@ -1,25 +0,0 @@ -// -// FetchLyricsTransfer.swift -// NetworkModule -// -// Created by YoungK on 2023/02/22. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import DomainModule -import DataMappingModule -import Utility - - -public extension LyricsResponseDTO { - func toDomain() -> LyricsEntity { - LyricsEntity( - identifier: identifier, - start: start, - end: end, - text: text, - styles: styles - ) - } -} diff --git a/Projects/Services/NetworkModule/Sources/Songs/DataTransfer/FetchNewSongsTransfer.swift b/Projects/Services/NetworkModule/Sources/Songs/DataTransfer/FetchNewSongsTransfer.swift deleted file mode 100644 index 5b452556d..000000000 --- a/Projects/Services/NetworkModule/Sources/Songs/DataTransfer/FetchNewSongsTransfer.swift +++ /dev/null @@ -1,26 +0,0 @@ -// -// FetchNewSongsTransfer.swift -// NetworkModule -// -// Created by KTH on 2023/11/15. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import DataMappingModule -import DomainModule -import Utility - -public extension NewSongsResponseDTO { - func toDomain() -> NewSongsEntity { - return NewSongsEntity( - id: id, - title: title, - artist: artist, - remix: remix, - reaction: reaction, - views: total?.views ?? 0, - last: total?.last ?? 0, - date: date - ) - } -} diff --git a/Projects/Services/NetworkModule/Sources/Songs/DataTransfer/FetchSearchSongTransfer.swift b/Projects/Services/NetworkModule/Sources/Songs/DataTransfer/FetchSearchSongTransfer.swift deleted file mode 100644 index 17e3be468..000000000 --- a/Projects/Services/NetworkModule/Sources/Songs/DataTransfer/FetchSearchSongTransfer.swift +++ /dev/null @@ -1,19 +0,0 @@ -import DataMappingModule -import DomainModule -import Utility - - -public extension SingleSongResponseDTO { - func toDomain() -> SongEntity { - SongEntity( - id: id, - title: title, - artist: artist, - remix: remix, - reaction: reaction, - views: total.views, - last: total.last, - date: date.changeDateFormat(origin: "yyMMdd", result: "yyyy.MM.dd") - ) - } -} diff --git a/Projects/Services/NetworkModule/Sources/Songs/Remote/RemoteSongsDataSource.swift b/Projects/Services/NetworkModule/Sources/Songs/Remote/RemoteSongsDataSource.swift deleted file mode 100644 index 16abc2edd..000000000 --- a/Projects/Services/NetworkModule/Sources/Songs/Remote/RemoteSongsDataSource.swift +++ /dev/null @@ -1,11 +0,0 @@ -import DataMappingModule -import ErrorModule -import DomainModule -import RxSwift -import Foundation - -public protocol RemoteSongsDataSource { - func fetchSearchSong(type: SearchType,keyword: String) -> Single<[SongEntity]> - func fetchLyrics(id: String) -> Single<[LyricsEntity]> - func fetchNewSongs(type: NewSongGroupType, page: Int, limit: Int) -> Single<[NewSongsEntity]> -} diff --git a/Projects/Services/NetworkModule/Sources/Songs/Remote/RemoteSongsDataSourceImpl.swift b/Projects/Services/NetworkModule/Sources/Songs/Remote/RemoteSongsDataSourceImpl.swift deleted file mode 100644 index 99643fe8d..000000000 --- a/Projects/Services/NetworkModule/Sources/Songs/Remote/RemoteSongsDataSourceImpl.swift +++ /dev/null @@ -1,27 +0,0 @@ -import APIKit -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule -import Foundation - - -public final class RemoteSongsDataSourceImpl: BaseRemoteDataSource, RemoteSongsDataSource { - public func fetchSearchSong(type: SearchType, keyword: String) -> Single<[SongEntity]> { - request(.fetchSearchSong(type: type, keyword: keyword)) - .map([SingleSongResponseDTO].self) - .map{$0.map{$0.toDomain()}} - } - - public func fetchLyrics(id: String) -> Single<[LyricsEntity]> { - request(.fetchLyrics(id: id)) - .map([LyricsResponseDTO].self) - .map{$0.map{$0.toDomain()}} - } - - public func fetchNewSongs(type: NewSongGroupType, page: Int, limit: Int) -> Single<[NewSongsEntity]> { - request(.fetchNewSongs(type: type, page: page, limit: limit)) - .map([NewSongsResponseDTO].self) - .map{$0.map{$0.toDomain()}} - } -} diff --git a/Projects/Services/NetworkModule/Sources/Suggest/DataTransfer/InquiryWeeklyChartTransfer.swift b/Projects/Services/NetworkModule/Sources/Suggest/DataTransfer/InquiryWeeklyChartTransfer.swift deleted file mode 100644 index 818bd375d..000000000 --- a/Projects/Services/NetworkModule/Sources/Suggest/DataTransfer/InquiryWeeklyChartTransfer.swift +++ /dev/null @@ -1,20 +0,0 @@ -// -// InquiryWeeklyChartTransfer.swift -// NetworkModule -// -// Created by KTH on 2023/04/14. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import DataMappingModule -import DomainModule - -public extension InquiryWeeklyChartResponseDTO { - func toDomain() -> InquiryWeeklyChartEntity { - InquiryWeeklyChartEntity( - status: status, - message: message - ) - } -} diff --git a/Projects/Services/NetworkModule/Sources/Suggest/DataTransfer/ModifySongTransfer.swift b/Projects/Services/NetworkModule/Sources/Suggest/DataTransfer/ModifySongTransfer.swift deleted file mode 100644 index 865dbf629..000000000 --- a/Projects/Services/NetworkModule/Sources/Suggest/DataTransfer/ModifySongTransfer.swift +++ /dev/null @@ -1,20 +0,0 @@ -// -// ModifySongTransfer.swift -// NetworkModule -// -// Created by KTH on 2023/04/14. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import DataMappingModule -import DomainModule - -public extension ModifySongResponseDTO { - func toDomain() -> ModifySongEntity { - ModifySongEntity( - status: status, - message: message - ) - } -} diff --git a/Projects/Services/NetworkModule/Sources/Suggest/DataTransfer/ReportBugTransfer.swift b/Projects/Services/NetworkModule/Sources/Suggest/DataTransfer/ReportBugTransfer.swift deleted file mode 100644 index 41d8ebb68..000000000 --- a/Projects/Services/NetworkModule/Sources/Suggest/DataTransfer/ReportBugTransfer.swift +++ /dev/null @@ -1,20 +0,0 @@ -// -// ReportBugTransfer.swift -// NetworkModule -// -// Created by KTH on 2023/04/14. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import DataMappingModule -import DomainModule - -public extension ReportBugResponseDTO { - func toDomain() -> ReportBugEntity { - ReportBugEntity( - status: status, - message: message - ) - } -} diff --git a/Projects/Services/NetworkModule/Sources/Suggest/DataTransfer/SuggestFunctionTransfer.swift b/Projects/Services/NetworkModule/Sources/Suggest/DataTransfer/SuggestFunctionTransfer.swift deleted file mode 100644 index 2f4a6e6cf..000000000 --- a/Projects/Services/NetworkModule/Sources/Suggest/DataTransfer/SuggestFunctionTransfer.swift +++ /dev/null @@ -1,20 +0,0 @@ -// -// SuggestFunctionTransfer.swift -// NetworkModule -// -// Created by KTH on 2023/04/14. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import DataMappingModule -import DomainModule - -public extension SuggestFunctionResponseDTO { - func toDomain() -> SuggestFunctionEntity { - SuggestFunctionEntity( - status: status, - message: message - ) - } -} diff --git a/Projects/Services/NetworkModule/Sources/Suggest/Remote/RemoteSuggestDataSource.swift b/Projects/Services/NetworkModule/Sources/Suggest/Remote/RemoteSuggestDataSource.swift deleted file mode 100644 index d72e01d19..000000000 --- a/Projects/Services/NetworkModule/Sources/Suggest/Remote/RemoteSuggestDataSource.swift +++ /dev/null @@ -1,25 +0,0 @@ -// -// RemoteSuggestDataSource.swift -// NetworkModule -// -// Created by KTH on 2023/04/14. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import DataMappingModule -import ErrorModule -import DomainModule -import RxSwift - -public protocol RemoteSuggestDataSource { - func reportBug(userID: String, nickname: String, attaches: [String], content: String) -> Single - func suggestFunction(type: SuggestPlatformType, userID: String, content: String) -> Single - func modifySong(type: SuggestSongModifyType, - userID: String, - artist: String, - songTitle: String, - youtubeLink: String, - content: String) -> Single - func inquiryWeeklyChart(userID: String, content: String) -> Single -} diff --git a/Projects/Services/NetworkModule/Sources/Suggest/Remote/RemoteSuggestDataSourceImpl.swift b/Projects/Services/NetworkModule/Sources/Suggest/Remote/RemoteSuggestDataSourceImpl.swift deleted file mode 100644 index 9cd637102..000000000 --- a/Projects/Services/NetworkModule/Sources/Suggest/Remote/RemoteSuggestDataSourceImpl.swift +++ /dev/null @@ -1,40 +0,0 @@ -// -// RemoteSuggestDataSourceImpl.swift -// NetworkModule -// -// Created by KTH on 2023/04/14. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import APIKit -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule -import Foundation - -public final class RemoteSuggestDataSourceImpl: BaseRemoteDataSource, RemoteSuggestDataSource { - public func reportBug(userID: String, nickname: String, attaches: [String], content: String) -> Single { - request(.reportBug(userID: userID, nickname: nickname, attaches: attaches, content: content)) - .map(ReportBugResponseDTO.self) - .map { $0.toDomain() } - } - - public func suggestFunction(type: SuggestPlatformType, userID: String, content: String) -> Single { - request(.suggestFunction(type: type, userID: userID, content: content)) - .map(SuggestFunctionResponseDTO.self) - .map { $0.toDomain() } - } - - public func modifySong(type: SuggestSongModifyType, userID: String, artist: String, songTitle: String, youtubeLink: String, content: String) -> Single { - request(.modifySong(type: type, userID: userID, artist: artist, songTitle: songTitle, youtubeLink: youtubeLink, content: content)) - .map(ModifySongResponseDTO.self) - .map { $0.toDomain() } - } - - public func inquiryWeeklyChart(userID: String, content: String) -> Single { - request(.inquiryWeeklyChart(userID: userID, content: content)) - .map(InquiryWeeklyChartResponseDTO.self) - .map { $0.toDomain() } - } -} diff --git a/Projects/Services/NetworkModule/Sources/User/DataTransfer/FetchFavoriteSongTransfer.swift b/Projects/Services/NetworkModule/Sources/User/DataTransfer/FetchFavoriteSongTransfer.swift deleted file mode 100644 index cb6b3329d..000000000 --- a/Projects/Services/NetworkModule/Sources/User/DataTransfer/FetchFavoriteSongTransfer.swift +++ /dev/null @@ -1,14 +0,0 @@ -import DataMappingModule -import DomainModule -import Utility - - -public extension FavoriteSongsResponseDTO { - func toDomain() -> FavoriteSongEntity { - FavoriteSongEntity( - likes: likes, - song: song.toDomain(), - isSelected: false - ) - } -} diff --git a/Projects/Services/NetworkModule/Sources/User/DataTransfer/FetchPlayListTransfer.swift b/Projects/Services/NetworkModule/Sources/User/DataTransfer/FetchPlayListTransfer.swift deleted file mode 100644 index a05ee3435..000000000 --- a/Projects/Services/NetworkModule/Sources/User/DataTransfer/FetchPlayListTransfer.swift +++ /dev/null @@ -1,27 +0,0 @@ -import DataMappingModule -import DomainModule -import Utility - -public extension PlayListResponseDTO { - func toDomain() -> PlayListEntity { - PlayListEntity( - key: key ?? "", - title: title, - image: image.name, - songlist: songs.map { - SongEntity( - id: $0.songId, - title: $0.title, - artist: $0.artist, - remix: $0.remix, - reaction: $0.reaction, - views: $0.total.views, - last: $0.total.last, - date: "\($0.date)" - ) - }, - image_version: image.version, - isSelected: isSelected ?? false - ) - } -} diff --git a/Projects/Services/NetworkModule/Sources/User/DataTransfer/FetchProfileListTransfer.swift b/Projects/Services/NetworkModule/Sources/User/DataTransfer/FetchProfileListTransfer.swift deleted file mode 100644 index 837d95f33..000000000 --- a/Projects/Services/NetworkModule/Sources/User/DataTransfer/FetchProfileListTransfer.swift +++ /dev/null @@ -1,22 +0,0 @@ -// -// FetchProfileListTransfer.swift -// NetworkModule -// -// Created by KTH on 2023/02/18. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import Foundation -import DataMappingModule -import DomainModule -import Utility - -public extension FetchProfileListResponseDTO { - func toDomain() -> ProfileListEntity { - ProfileListEntity(type: type ?? "unknown", - version: version, - isSelected: false - - ) - } -} diff --git a/Projects/Services/NetworkModule/Sources/User/Remote/RemoteUserDataSource.swift b/Projects/Services/NetworkModule/Sources/User/Remote/RemoteUserDataSource.swift deleted file mode 100644 index 2eb7ab8c7..000000000 --- a/Projects/Services/NetworkModule/Sources/User/Remote/RemoteUserDataSource.swift +++ /dev/null @@ -1,17 +0,0 @@ -import DataMappingModule -import ErrorModule -import DomainModule -import RxSwift -import Foundation - -public protocol RemoteUserDataSource { - func fetchProfileList() -> Single<[ProfileListEntity]> - func setProfile(image:String) -> Single - func setUserName(name:String) -> Single - func fetchPlayList() -> Single<[PlayListEntity]> - func fetchFavoriteSong() -> Single<[FavoriteSongEntity]> - func editFavoriteSongsOrder(ids:[String]) -> Single - func editPlayListOrder(ids:[String]) -> Single - func deletePlayList(ids: [String]) -> Single - func deleteFavoriteList(ids: [String]) -> Single -} diff --git a/Projects/Services/NetworkModule/Sources/User/Remote/RemoteUserDataSourceImpl.swift b/Projects/Services/NetworkModule/Sources/User/Remote/RemoteUserDataSourceImpl.swift deleted file mode 100644 index 4e23cf332..000000000 --- a/Projects/Services/NetworkModule/Sources/User/Remote/RemoteUserDataSourceImpl.swift +++ /dev/null @@ -1,64 +0,0 @@ -import APIKit -import RxSwift -import DataMappingModule -import DomainModule -import ErrorModule -import Foundation - - -public final class RemoteUserDataSourceImpl: BaseRemoteDataSource, RemoteUserDataSource { - - public func fetchProfileList() -> Single<[ProfileListEntity]> { - return request(.fetchProfileList) - .map([FetchProfileListResponseDTO].self) - .map{$0.map({$0.toDomain()})} - } - - public func setProfile(image: String) -> Single { - return request(.setProfile(image: image)) - .map(BaseResponseDTO.self) - .map { $0.toDomain() } - } - - public func setUserName(name: String) -> Single { - return request(.setUserName(name: name)) - .map(BaseResponseDTO.self) - .map { $0.toDomain() } - } - - public func fetchPlayList() -> Single<[PlayListEntity]> { - return request(.fetchPlayList) - .map([PlayListResponseDTO].self) - .map({$0.map{$0.toDomain()}}) - } - - public func fetchFavoriteSong() -> Single<[FavoriteSongEntity]> { - return request(.fetchFavoriteSongs) - .map([FavoriteSongsResponseDTO].self) - .map({$0.map({$0.toDomain()})}) - } - - public func editFavoriteSongsOrder(ids: [String]) -> Single { - return request(.editFavoriteSongsOrder(ids: ids)) - .map(BaseResponseDTO.self) - .map{$0.toDomain()} - } - - public func editPlayListOrder(ids: [String]) -> Single { - request(.editPlayListOrder(ids: ids)) - .map(BaseResponseDTO.self) - .map{$0.toDomain()} - } - - public func deletePlayList(ids: [String]) -> Single { - request(.deletePlayList(ids: ids)) - .map(BaseResponseDTO.self) - .map{$0.toDomain()} - } - - public func deleteFavoriteList(ids: [String]) -> Single { - request(.deleteFavoriteList(ids: ids)) - .map(BaseResponseDTO.self) - .map{$0.toDomain()} - } -} diff --git a/Projects/Services/NetworkModule/Tests/.gitkeep b/Projects/Services/NetworkModule/Tests/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/Projects/Services/NetworkModule/Tests/TargetTest.swift b/Projects/Services/NetworkModule/Tests/TargetTest.swift deleted file mode 100644 index b1cf79405..000000000 --- a/Projects/Services/NetworkModule/Tests/TargetTest.swift +++ /dev/null @@ -1,17 +0,0 @@ -import XCTest - -class TargetTests: XCTestCase { - - override func setUpWithError() throws { - // Put setup code here. This method is called before the invocation of each test method in the class. - } - - override func tearDownWithError() throws { - // Put teardown code here. This method is called after the invocation of each test method in the class. - } - - func testExample() throws { - XCTAssertEqual("A", "A") - } - -} diff --git a/Projects/UsertInterfaces/DesignSystem/.swiftlint.yml b/Projects/UsertInterfaces/DesignSystem/.swiftlint.yml deleted file mode 100644 index ff44f9f28..000000000 --- a/Projects/UsertInterfaces/DesignSystem/.swiftlint.yml +++ /dev/null @@ -1,20 +0,0 @@ -excluded: - - "**/*/NeedleGenerated.swift" - - "Tuist" - - -force_cast: # From https://realm.github.io/SwiftLint/force_cast.html - warning # 강제 캐스팅은 error에서 warning으로 변경 - -disabled_rules: - - trailing_whitespace - - vertical_whitespace - - colon - - comma - - comment_spacing # 주석 여백 - - mark # //MARK 관련 warning - - opening_brace # 괄호 열 때 줄바꿈을 했는지 안했는지, (안했으면 warning) - - line_length # 한줄에 글자 수 제한 , warning: 120, error: 200 (default) - - statement_position # if는 반드시 else로 끝나야한다. - - identifier_name #변수명 글자 수 제한 - diff --git a/Projects/UsertInterfaces/DesignSystem/Project.swift b/Projects/UsertInterfaces/DesignSystem/Project.swift index 4891aa978..389ad1d32 100644 --- a/Projects/UsertInterfaces/DesignSystem/Project.swift +++ b/Projects/UsertInterfaces/DesignSystem/Project.swift @@ -1,9 +1,20 @@ +import DependencyPlugin import ProjectDescription import ProjectDescriptionHelpers -let project = Project.makeModule( - name: "DesignSystem", - product: .framework, - dependencies: [], - resources: ["Resources/**"] +let project = Project.module( + name: ModulePaths.UserInterface.DesignSystem.rawValue, + targets: [ + .implements( + module: .userInterface(.DesignSystem), + product: .framework, + spec: .init( + resources: ["Resources/**"], + dependencies: [ + .SPM.MarqueeLabel, + .module(target: .Localization) + ] + ) + ) + ] ) diff --git a/.tuist-bin/Templates/swiftui/Preview Content/Preview Assets.xcassets/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Color/BlueGrayColor.xcassets/Contents.json similarity index 100% rename from .tuist-bin/Templates/swiftui/Preview Content/Preview Assets.xcassets/Contents.json rename to Projects/UsertInterfaces/DesignSystem/Resources/Color/BlueGrayColor.xcassets/Contents.json diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Color/GrayColor.xcassets/gray100.colorset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Color/BlueGrayColor.xcassets/blueGray100.colorset/Contents.json similarity index 100% rename from Projects/UsertInterfaces/DesignSystem/Resources/Color/GrayColor.xcassets/gray100.colorset/Contents.json rename to Projects/UsertInterfaces/DesignSystem/Resources/Color/BlueGrayColor.xcassets/blueGray100.colorset/Contents.json diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Color/GrayColor.xcassets/gray200.colorset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Color/BlueGrayColor.xcassets/blueGray200.colorset/Contents.json similarity index 100% rename from Projects/UsertInterfaces/DesignSystem/Resources/Color/GrayColor.xcassets/gray200.colorset/Contents.json rename to Projects/UsertInterfaces/DesignSystem/Resources/Color/BlueGrayColor.xcassets/blueGray200.colorset/Contents.json diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Color/GrayColor.xcassets/gray25.colorset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Color/BlueGrayColor.xcassets/blueGray25.colorset/Contents.json similarity index 100% rename from Projects/UsertInterfaces/DesignSystem/Resources/Color/GrayColor.xcassets/gray25.colorset/Contents.json rename to Projects/UsertInterfaces/DesignSystem/Resources/Color/BlueGrayColor.xcassets/blueGray25.colorset/Contents.json diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Color/GrayColor.xcassets/gray300.colorset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Color/BlueGrayColor.xcassets/blueGray300.colorset/Contents.json similarity index 100% rename from Projects/UsertInterfaces/DesignSystem/Resources/Color/GrayColor.xcassets/gray300.colorset/Contents.json rename to Projects/UsertInterfaces/DesignSystem/Resources/Color/BlueGrayColor.xcassets/blueGray300.colorset/Contents.json diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Color/BlueGrayColor.xcassets/blueGray400.colorset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Color/BlueGrayColor.xcassets/blueGray400.colorset/Contents.json new file mode 100644 index 000000000..6ec7115aa --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Color/BlueGrayColor.xcassets/blueGray400.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xB3", + "green" : "0xA2", + "red" : "0x98" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Color/GrayColor.xcassets/gray50.colorset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Color/BlueGrayColor.xcassets/blueGray50.colorset/Contents.json similarity index 100% rename from Projects/UsertInterfaces/DesignSystem/Resources/Color/GrayColor.xcassets/gray50.colorset/Contents.json rename to Projects/UsertInterfaces/DesignSystem/Resources/Color/BlueGrayColor.xcassets/blueGray50.colorset/Contents.json diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Color/GrayColor.xcassets/gray500.colorset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Color/BlueGrayColor.xcassets/blueGray500.colorset/Contents.json similarity index 100% rename from Projects/UsertInterfaces/DesignSystem/Resources/Color/GrayColor.xcassets/gray500.colorset/Contents.json rename to Projects/UsertInterfaces/DesignSystem/Resources/Color/BlueGrayColor.xcassets/blueGray500.colorset/Contents.json diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Color/GrayColor.xcassets/gray600.colorset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Color/BlueGrayColor.xcassets/blueGray600.colorset/Contents.json similarity index 100% rename from Projects/UsertInterfaces/DesignSystem/Resources/Color/GrayColor.xcassets/gray600.colorset/Contents.json rename to Projects/UsertInterfaces/DesignSystem/Resources/Color/BlueGrayColor.xcassets/blueGray600.colorset/Contents.json diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Color/GrayColor.xcassets/gray700.colorset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Color/BlueGrayColor.xcassets/blueGray700.colorset/Contents.json similarity index 100% rename from Projects/UsertInterfaces/DesignSystem/Resources/Color/GrayColor.xcassets/gray700.colorset/Contents.json rename to Projects/UsertInterfaces/DesignSystem/Resources/Color/BlueGrayColor.xcassets/blueGray700.colorset/Contents.json diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Color/BlueGrayColor.xcassets/blueGray800.colorset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Color/BlueGrayColor.xcassets/blueGray800.colorset/Contents.json new file mode 100644 index 000000000..f104c1fa0 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Color/BlueGrayColor.xcassets/blueGray800.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x39", + "green" : "0x29", + "red" : "0x1D" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Color/BlueGrayColor.xcassets/blueGray900.colorset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Color/BlueGrayColor.xcassets/blueGray900.colorset/Contents.json new file mode 100644 index 000000000..893ef47ba --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Color/BlueGrayColor.xcassets/blueGray900.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x28", + "green" : "0x18", + "red" : "0x10" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Color/GrayColor.xcassets/gray400.colorset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Color/GrayColor.xcassets/gray400.colorset/Contents.json deleted file mode 100644 index 6feb85fda..000000000 --- a/Projects/UsertInterfaces/DesignSystem/Resources/Color/GrayColor.xcassets/gray400.colorset/Contents.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0.702", - "green" : "0.635", - "red" : "0.596" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Color/GrayColor.xcassets/gray800.colorset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Color/GrayColor.xcassets/gray800.colorset/Contents.json deleted file mode 100644 index 219999443..000000000 --- a/Projects/UsertInterfaces/DesignSystem/Resources/Color/GrayColor.xcassets/gray800.colorset/Contents.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0.224", - "green" : "0.161", - "red" : "0.114" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Color/GrayColor.xcassets/gray900.colorset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Color/GrayColor.xcassets/gray900.colorset/Contents.json deleted file mode 100644 index 9e5dfbc71..000000000 --- a/Projects/UsertInterfaces/DesignSystem/Resources/Color/GrayColor.xcassets/gray900.colorset/Contents.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0.157", - "green" : "0.094", - "red" : "0.063" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/.tuist-bin/Templates/swiftui/ios/Assets.xcassets/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Color/NewGrayColor.xcassets/Contents.json similarity index 100% rename from .tuist-bin/Templates/swiftui/ios/Assets.xcassets/Contents.json rename to Projects/UsertInterfaces/DesignSystem/Resources/Color/NewGrayColor.xcassets/Contents.json diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Color/NewGrayColor.xcassets/gray400.colorset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Color/NewGrayColor.xcassets/gray400.colorset/Contents.json new file mode 100644 index 000000000..a200dfba5 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Color/NewGrayColor.xcassets/gray400.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xCC", + "green" : "0xCC", + "red" : "0xCC" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Color/NewGrayColor.xcassets/gray500.colorset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Color/NewGrayColor.xcassets/gray500.colorset/Contents.json new file mode 100644 index 000000000..e2feb435d --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Color/NewGrayColor.xcassets/gray500.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x88", + "green" : "0x88", + "red" : "0x88" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Color/NewGrayColor.xcassets/gray600.colorset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Color/NewGrayColor.xcassets/gray600.colorset/Contents.json new file mode 100644 index 000000000..eb4771b6c --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Color/NewGrayColor.xcassets/gray600.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x50", + "green" : "0x4E", + "red" : "0x4B" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Color/NewGrayColor.xcassets/gray700.colorset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Color/NewGrayColor.xcassets/gray700.colorset/Contents.json new file mode 100644 index 000000000..58f89afea --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Color/NewGrayColor.xcassets/gray700.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x38", + "green" : "0x34", + "red" : "0x31" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Color/NewGrayColor.xcassets/gray900.colorset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Color/NewGrayColor.xcassets/gray900.colorset/Contents.json new file mode 100644 index 000000000..68757c142 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Color/NewGrayColor.xcassets/gray900.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x1C", + "green" : "0x1A", + "red" : "0x19" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColor.xcassets/POINT.colorset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColor.xcassets/POINT.colorset/Contents.json deleted file mode 100644 index 916ca5520..000000000 --- a/Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColor.xcassets/POINT.colorset/Contents.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0.950", - "green" : "0.785", - "red" : "0.036" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColor.xcassets/SUB 1.colorset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColor.xcassets/V1 SUB 1.colorset/Contents.json similarity index 100% rename from Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColor.xcassets/SUB 1.colorset/Contents.json rename to Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColor.xcassets/V1 SUB 1.colorset/Contents.json diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColor.xcassets/SUB 2.colorset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColor.xcassets/V1 SUB 2.colorset/Contents.json similarity index 100% rename from Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColor.xcassets/SUB 2.colorset/Contents.json rename to Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColor.xcassets/V1 SUB 2.colorset/Contents.json diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColor.xcassets/SUB 3.colorset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColor.xcassets/V1 SUB 3.colorset/Contents.json similarity index 100% rename from Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColor.xcassets/SUB 3.colorset/Contents.json rename to Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColor.xcassets/V1 SUB 3.colorset/Contents.json diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColor.xcassets/BASESKELETON.colorset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColorV2.xcassets/BASE_SKELETON.colorset/Contents.json similarity index 100% rename from Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColor.xcassets/BASESKELETON.colorset/Contents.json rename to Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColorV2.xcassets/BASE_SKELETON.colorset/Contents.json diff --git a/.tuist-bin/Templates/swiftui/macos/Assets.xcassets/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColorV2.xcassets/Contents.json similarity index 100% rename from .tuist-bin/Templates/swiftui/macos/Assets.xcassets/Contents.json rename to Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColorV2.xcassets/Contents.json diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColor.xcassets/DECREASE.colorset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColorV2.xcassets/DECREASE.colorset/Contents.json similarity index 100% rename from Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColor.xcassets/DECREASE.colorset/Contents.json rename to Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColorV2.xcassets/DECREASE.colorset/Contents.json diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColor.xcassets/SECONDARYSKELETON.colorset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColorV2.xcassets/HIGHLIGHT_SKELETON.colorset/Contents.json similarity index 100% rename from Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColor.xcassets/SECONDARYSKELETON.colorset/Contents.json rename to Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColorV2.xcassets/HIGHLIGHT_SKELETON.colorset/Contents.json diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColor.xcassets/INCREASE.colorset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColorV2.xcassets/INCREASE.colorset/Contents.json similarity index 100% rename from Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColor.xcassets/INCREASE.colorset/Contents.json rename to Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColorV2.xcassets/INCREASE.colorset/Contents.json diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColor.xcassets/NEW.colorset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColorV2.xcassets/NEW.colorset/Contents.json similarity index 100% rename from Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColor.xcassets/NEW.colorset/Contents.json rename to Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColorV2.xcassets/NEW.colorset/Contents.json diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColorV2.xcassets/POINT.colorset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColorV2.xcassets/POINT.colorset/Contents.json new file mode 100644 index 000000000..5ffef33b4 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColorV2.xcassets/POINT.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xF2", + "green" : "0xC8", + "red" : "0x09" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColorV2.xcassets/SUB 1.colorset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColorV2.xcassets/SUB 1.colorset/Contents.json new file mode 100644 index 000000000..f909ad565 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColorV2.xcassets/SUB 1.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xF4", + "green" : "0x60", + "red" : "0x27" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColorV2.xcassets/SUB 2.colorset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColorV2.xcassets/SUB 2.colorset/Contents.json new file mode 100644 index 000000000..47753324a --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColorV2.xcassets/SUB 2.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xB2", + "green" : "0xEB", + "red" : "0x00" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColor.xcassets/TOAST.colorset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColorV2.xcassets/TOAST.colorset/Contents.json similarity index 100% rename from Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColor.xcassets/TOAST.colorset/Contents.json rename to Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColorV2.xcassets/TOAST.colorset/Contents.json diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColor.xcassets/WAKTAVERSE.colorset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColorV2.xcassets/WAKTAVERSE.colorset/Contents.json similarity index 100% rename from Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColor.xcassets/WAKTAVERSE.colorset/Contents.json rename to Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColorV2.xcassets/WAKTAVERSE.colorset/Contents.json diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColorV2.xcassets/WHITE.colorset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColorV2.xcassets/WHITE.colorset/Contents.json new file mode 100644 index 000000000..fafa47672 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Color/PrimaryColorV2.xcassets/WHITE.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFF", + "green" : "0xFF", + "red" : "0xFF" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Artist.xcassets/subscription_off.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Artist.xcassets/subscription_off.imageset/Contents.json new file mode 100644 index 000000000..345d6e458 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Artist.xcassets/subscription_off.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "subscription_off@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "subscription_off@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Artist.xcassets/subscription_off.imageset/subscription_off@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Artist.xcassets/subscription_off.imageset/subscription_off@2x.png new file mode 100644 index 000000000..9b726ef59 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Artist.xcassets/subscription_off.imageset/subscription_off@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Artist.xcassets/subscription_off.imageset/subscription_off@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Artist.xcassets/subscription_off.imageset/subscription_off@3x.png new file mode 100644 index 000000000..32d2dcfe2 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Artist.xcassets/subscription_off.imageset/subscription_off@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Artist.xcassets/subscription_on.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Artist.xcassets/subscription_on.imageset/Contents.json new file mode 100644 index 000000000..0554395fb --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Artist.xcassets/subscription_on.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "subscription_on@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "subscription_on@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Artist.xcassets/subscription_on.imageset/subscription_on@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Artist.xcassets/subscription_on.imageset/subscription_on@2x.png new file mode 100644 index 000000000..40b679bb0 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Artist.xcassets/subscription_on.imageset/subscription_on@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Artist.xcassets/subscription_on.imageset/subscription_on@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Artist.xcassets/subscription_on.imageset/subscription_on@3x.png new file mode 100644 index 000000000..d94223269 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Artist.xcassets/subscription_on.imageset/subscription_on@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Chart.xcassets/half_play.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Chart.xcassets/half_play.imageset/Contents.json new file mode 100644 index 000000000..f54604927 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Chart.xcassets/half_play.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "ic_32_play_point@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ic_32_play_point@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/play.imageset/ic_32_play_point-1.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Chart.xcassets/half_play.imageset/ic_32_play_point@2x.png similarity index 100% rename from Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/play.imageset/ic_32_play_point-1.png rename to Projects/UsertInterfaces/DesignSystem/Resources/Image/Chart.xcassets/half_play.imageset/ic_32_play_point@2x.png diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Chart.xcassets/half_play.imageset/ic_32_play_point@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Chart.xcassets/half_play.imageset/ic_32_play_point@3x.png new file mode 100644 index 000000000..913e8a117 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Chart.xcassets/half_play.imageset/ic_32_play_point@3x.png differ diff --git a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/Contents.json similarity index 100% rename from .tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Contents.json rename to Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/Contents.json diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_bg.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_bg.imageset/Contents.json new file mode 100644 index 000000000..74f958dbf --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_bg.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "note_draw_bg@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "note_draw_bg@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_bg.imageset/note_draw_bg@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_bg.imageset/note_draw_bg@2x.png new file mode 100644 index 000000000..4f8fe9034 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_bg.imageset/note_draw_bg@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_bg.imageset/note_draw_bg@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_bg.imageset/note_draw_bg@3x.png new file mode 100644 index 000000000..2b1f43efc Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_bg.imageset/note_draw_bg@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_cloud.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_cloud.imageset/Contents.json new file mode 100644 index 000000000..cc3f4e21c --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_cloud.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "note_draw_cloud@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "note_draw_cloud@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_cloud.imageset/note_draw_cloud@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_cloud.imageset/note_draw_cloud@2x.png new file mode 100644 index 000000000..d10d26d6f Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_cloud.imageset/note_draw_cloud@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_cloud.imageset/note_draw_cloud@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_cloud.imageset/note_draw_cloud@3x.png new file mode 100644 index 000000000..6aafc70cd Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_cloud.imageset/note_draw_cloud@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_deep_green_heart.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_deep_green_heart.imageset/Contents.json new file mode 100644 index 000000000..c5d1a0e82 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_deep_green_heart.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "note_draw_deep_green_ball@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "note_draw_deep_green_ball@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_deep_green_heart.imageset/note_draw_deep_green_ball@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_deep_green_heart.imageset/note_draw_deep_green_ball@2x.png new file mode 100644 index 000000000..e992d9cff Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_deep_green_heart.imageset/note_draw_deep_green_ball@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_deep_green_heart.imageset/note_draw_deep_green_ball@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_deep_green_heart.imageset/note_draw_deep_green_ball@3x.png new file mode 100644 index 000000000..c3616c0a2 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_deep_green_heart.imageset/note_draw_deep_green_ball@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_green_heart.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_green_heart.imageset/Contents.json new file mode 100644 index 000000000..a7d819990 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_green_heart.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "note_draw_green_heart@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "note_draw_green_heart@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_green_heart.imageset/note_draw_green_heart@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_green_heart.imageset/note_draw_green_heart@2x.png new file mode 100644 index 000000000..20f7b296f Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_green_heart.imageset/note_draw_green_heart@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_green_heart.imageset/note_draw_green_heart@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_green_heart.imageset/note_draw_green_heart@3x.png new file mode 100644 index 000000000..ef69907ba Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_green_heart.imageset/note_draw_green_heart@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_left_note.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_left_note.imageset/Contents.json new file mode 100644 index 000000000..25cdd74ff --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_left_note.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "note_draw_left_note@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "note_draw_left_note@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_left_note.imageset/note_draw_left_note@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_left_note.imageset/note_draw_left_note@2x.png new file mode 100644 index 000000000..a068b9d81 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_left_note.imageset/note_draw_left_note@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_left_note.imageset/note_draw_left_note@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_left_note.imageset/note_draw_left_note@3x.png new file mode 100644 index 000000000..3325cbfb8 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_left_note.imageset/note_draw_left_note@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_machine.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_machine.imageset/Contents.json new file mode 100644 index 000000000..17e474d89 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_machine.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "note_draw_machine@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "note_draw_machine@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_machine.imageset/note_draw_machine@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_machine.imageset/note_draw_machine@2x.png new file mode 100644 index 000000000..2feb58cf6 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_machine.imageset/note_draw_machine@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_machine.imageset/note_draw_machine@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_machine.imageset/note_draw_machine@3x.png new file mode 100644 index 000000000..304687d77 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_machine.imageset/note_draw_machine@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_magenta_ball.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_magenta_ball.imageset/Contents.json new file mode 100644 index 000000000..a9248e677 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_magenta_ball.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "note_draw_magenta_ball@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "note_draw_magenta_ball@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_magenta_ball.imageset/note_draw_magenta_ball@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_magenta_ball.imageset/note_draw_magenta_ball@2x.png new file mode 100644 index 000000000..abaa9d9fc Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_magenta_ball.imageset/note_draw_magenta_ball@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_magenta_ball.imageset/note_draw_magenta_ball@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_magenta_ball.imageset/note_draw_magenta_ball@3x.png new file mode 100644 index 000000000..f635c1ae6 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_magenta_ball.imageset/note_draw_magenta_ball@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_orange_ball.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_orange_ball.imageset/Contents.json new file mode 100644 index 000000000..7854cfce0 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_orange_ball.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "note_draw_orange_ball@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "note_draw_orange_ball@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_orange_ball.imageset/note_draw_orange_ball@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_orange_ball.imageset/note_draw_orange_ball@2x.png new file mode 100644 index 000000000..a9397ede8 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_orange_ball.imageset/note_draw_orange_ball@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_orange_ball.imageset/note_draw_orange_ball@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_orange_ball.imageset/note_draw_orange_ball@3x.png new file mode 100644 index 000000000..9f51c54c7 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_orange_ball.imageset/note_draw_orange_ball@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_pink_ball.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_pink_ball.imageset/Contents.json new file mode 100644 index 000000000..f5ec485d2 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_pink_ball.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "note_draw_pick_ball@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "note_draw_pick_ball@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_pink_ball.imageset/note_draw_pick_ball@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_pink_ball.imageset/note_draw_pick_ball@2x.png new file mode 100644 index 000000000..9eb0a7d9e Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_pink_ball.imageset/note_draw_pick_ball@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_pink_ball.imageset/note_draw_pick_ball@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_pink_ball.imageset/note_draw_pick_ball@3x.png new file mode 100644 index 000000000..5e771ca16 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_pink_ball.imageset/note_draw_pick_ball@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_purple_ball.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_purple_ball.imageset/Contents.json new file mode 100644 index 000000000..3be03e491 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_purple_ball.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "note_draw_purple_ball@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "note_draw_purple_ball@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_purple_ball.imageset/note_draw_purple_ball@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_purple_ball.imageset/note_draw_purple_ball@2x.png new file mode 100644 index 000000000..b985cb22d Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_purple_ball.imageset/note_draw_purple_ball@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_purple_ball.imageset/note_draw_purple_ball@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_purple_ball.imageset/note_draw_purple_ball@3x.png new file mode 100644 index 000000000..617ed780c Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_purple_ball.imageset/note_draw_purple_ball@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_purple_heart.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_purple_heart.imageset/Contents.json new file mode 100644 index 000000000..366945ab2 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_purple_heart.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "note_draw_purple_heart@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "note_draw_purple_heart@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_purple_heart.imageset/note_draw_purple_heart@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_purple_heart.imageset/note_draw_purple_heart@2x.png new file mode 100644 index 000000000..e8db1d85e Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_purple_heart.imageset/note_draw_purple_heart@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_purple_heart.imageset/note_draw_purple_heart@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_purple_heart.imageset/note_draw_purple_heart@3x.png new file mode 100644 index 000000000..c88fc1442 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_purple_heart.imageset/note_draw_purple_heart@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_red_heart.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_red_heart.imageset/Contents.json new file mode 100644 index 000000000..511fafd94 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_red_heart.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "note_draw_red_heart@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "note_draw_red_heart@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_red_heart.imageset/note_draw_red_heart@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_red_heart.imageset/note_draw_red_heart@2x.png new file mode 100644 index 000000000..0fb61d55e Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_red_heart.imageset/note_draw_red_heart@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_red_heart.imageset/note_draw_red_heart@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_red_heart.imageset/note_draw_red_heart@3x.png new file mode 100644 index 000000000..8a55fefcc Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_red_heart.imageset/note_draw_red_heart@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_right_bottom_note.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_right_bottom_note.imageset/Contents.json new file mode 100644 index 000000000..28a30272e --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_right_bottom_note.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "note_draw_right_bottom_note@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "note_draw_right_bottom_note@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_right_bottom_note.imageset/note_draw_right_bottom_note@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_right_bottom_note.imageset/note_draw_right_bottom_note@2x.png new file mode 100644 index 000000000..8bc437ff9 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_right_bottom_note.imageset/note_draw_right_bottom_note@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_right_bottom_note.imageset/note_draw_right_bottom_note@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_right_bottom_note.imageset/note_draw_right_bottom_note@3x.png new file mode 100644 index 000000000..35298fa6b Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_right_bottom_note.imageset/note_draw_right_bottom_note@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_right_top_note.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_right_top_note.imageset/Contents.json new file mode 100644 index 000000000..c672b0bfc --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_right_top_note.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "note_draw_right_top_note@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "note_draw_right_top_note@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_right_top_note.imageset/note_draw_right_top_note@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_right_top_note.imageset/note_draw_right_top_note@2x.png new file mode 100644 index 000000000..2c1981abc Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_right_top_note.imageset/note_draw_right_top_note@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_right_top_note.imageset/note_draw_right_top_note@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_right_top_note.imageset/note_draw_right_top_note@3x.png new file mode 100644 index 000000000..14d479260 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_right_top_note.imageset/note_draw_right_top_note@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_yellow_heart.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_yellow_heart.imageset/Contents.json new file mode 100644 index 000000000..49ab664df --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_yellow_heart.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "note_draw_yellow_heart@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "note_draw_yellow_heart@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_yellow_heart.imageset/note_draw_yellow_heart@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_yellow_heart.imageset/note_draw_yellow_heart@2x.png new file mode 100644 index 000000000..b9d6b2cca Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_yellow_heart.imageset/note_draw_yellow_heart@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_yellow_heart.imageset/note_draw_yellow_heart@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_yellow_heart.imageset/note_draw_yellow_heart@3x.png new file mode 100644 index 000000000..bbed798d7 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/fruit_draw_yellow_heart.imageset/note_draw_yellow_heart@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/note_info_popup_bg.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/note_info_popup_bg.imageset/Contents.json new file mode 100644 index 000000000..66430e244 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/note_info_popup_bg.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "note_info_popup_bg@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "note_info_popup_bg@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/note_info_popup_bg.imageset/note_info_popup_bg@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/note_info_popup_bg.imageset/note_info_popup_bg@2x.png new file mode 100644 index 000000000..aaa14a6b1 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/note_info_popup_bg.imageset/note_info_popup_bg@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/note_info_popup_bg.imageset/note_info_popup_bg@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/note_info_popup_bg.imageset/note_info_popup_bg@3x.png new file mode 100644 index 000000000..a717119c5 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/note_info_popup_bg.imageset/note_info_popup_bg@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/note_shadow.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/note_shadow.imageset/Contents.json new file mode 100644 index 000000000..fbb584e96 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/note_shadow.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "note_shadow@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "note_shadow@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/note_shadow.imageset/note_shadow@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/note_shadow.imageset/note_shadow@2x.png new file mode 100644 index 000000000..f5df9121b Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/note_shadow.imageset/note_shadow@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/note_shadow.imageset/note_shadow@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/note_shadow.imageset/note_shadow@3x.png new file mode 100644 index 000000000..99a293bf9 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/note_shadow.imageset/note_shadow@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/note_support.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/note_support.imageset/Contents.json new file mode 100644 index 000000000..e4dc377c3 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/note_support.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "note_support@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "note_support@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/note_support.imageset/note_support@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/note_support.imageset/note_support@2x.png new file mode 100644 index 000000000..d7aecf8a2 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/note_support.imageset/note_support@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/note_support.imageset/note_support@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/note_support.imageset/note_support@3x.png new file mode 100644 index 000000000..fe07d3af4 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/note_support.imageset/note_support@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note.imageset/Contents.json new file mode 100644 index 000000000..090304915 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "unidentified_note@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "unidentified_note@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note.imageset/unidentified_note@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note.imageset/unidentified_note@2x.png new file mode 100644 index 000000000..473fafdde Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note.imageset/unidentified_note@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note.imageset/unidentified_note@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note.imageset/unidentified_note@3x.png new file mode 100644 index 000000000..9658afddf Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note.imageset/unidentified_note@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_1st.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_1st.imageset/Contents.json new file mode 100644 index 000000000..5e1816d02 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_1st.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "unidentified_note_1st@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "unidentified_note_1st@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_1st.imageset/unidentified_note_1st@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_1st.imageset/unidentified_note_1st@2x.png new file mode 100644 index 000000000..3f6916c1f Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_1st.imageset/unidentified_note_1st@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_1st.imageset/unidentified_note_1st@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_1st.imageset/unidentified_note_1st@3x.png new file mode 100644 index 000000000..2edb8af65 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_1st.imageset/unidentified_note_1st@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_2nd.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_2nd.imageset/Contents.json new file mode 100644 index 000000000..6551e59ed --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_2nd.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "unidentified_note_2nd@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "unidentified_note_2nd@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_2nd.imageset/unidentified_note_2nd@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_2nd.imageset/unidentified_note_2nd@2x.png new file mode 100644 index 000000000..c3ae96d86 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_2nd.imageset/unidentified_note_2nd@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_2nd.imageset/unidentified_note_2nd@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_2nd.imageset/unidentified_note_2nd@3x.png new file mode 100644 index 000000000..91acb3d75 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_2nd.imageset/unidentified_note_2nd@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_3rd.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_3rd.imageset/Contents.json new file mode 100644 index 000000000..6e5babb4e --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_3rd.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "unidentified_note_3rd@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "unidentified_note_3rd@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_3rd.imageset/unidentified_note_3rd@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_3rd.imageset/unidentified_note_3rd@2x.png new file mode 100644 index 000000000..99a4e7dfc Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_3rd.imageset/unidentified_note_3rd@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_3rd.imageset/unidentified_note_3rd@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_3rd.imageset/unidentified_note_3rd@3x.png new file mode 100644 index 000000000..4938540a3 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_3rd.imageset/unidentified_note_3rd@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_4th.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_4th.imageset/Contents.json new file mode 100644 index 000000000..014927aaf --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_4th.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "unidentified_note_4th@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "unidentified_note_4th@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_4th.imageset/unidentified_note_4th@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_4th.imageset/unidentified_note_4th@2x.png new file mode 100644 index 000000000..f125df846 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_4th.imageset/unidentified_note_4th@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_4th.imageset/unidentified_note_4th@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_4th.imageset/unidentified_note_4th@3x.png new file mode 100644 index 000000000..7b881774c Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_4th.imageset/unidentified_note_4th@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_5th.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_5th.imageset/Contents.json new file mode 100644 index 000000000..776b5722d --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_5th.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "unidentified_note_5th@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "unidentified_note_5th@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_5th.imageset/unidentified_note_5th@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_5th.imageset/unidentified_note_5th@2x.png new file mode 100644 index 000000000..ff5320a5b Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_5th.imageset/unidentified_note_5th@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_5th.imageset/unidentified_note_5th@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_5th.imageset/unidentified_note_5th@3x.png new file mode 100644 index 000000000..e3469d76a Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_5th.imageset/unidentified_note_5th@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_big.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_big.imageset/Contents.json new file mode 100644 index 000000000..962bb26cc --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_big.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "unidentified_note_big@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "unidentified_note_big@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_big.imageset/unidentified_note_big@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_big.imageset/unidentified_note_big@2x.png new file mode 100644 index 000000000..bdc8cdf89 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_big.imageset/unidentified_note_big@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_big.imageset/unidentified_note_big@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_big.imageset/unidentified_note_big@3x.png new file mode 100644 index 000000000..06ef85c4e Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/FruitDraw.xcassets/unidentified_note_big.imageset/unidentified_note_big@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Logo.xcassets/musicDetailPlaceholder.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Logo.xcassets/musicDetailPlaceholder.imageset/Contents.json new file mode 100644 index 000000000..c5c40fde5 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Logo.xcassets/musicDetailPlaceholder.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "music_detail_placeholder.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "music_detail_placeholder@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "music_detail_placeholder@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Logo.xcassets/musicDetailPlaceholder.imageset/music_detail_placeholder.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Logo.xcassets/musicDetailPlaceholder.imageset/music_detail_placeholder.png new file mode 100644 index 000000000..fa3d63475 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Logo.xcassets/musicDetailPlaceholder.imageset/music_detail_placeholder.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Logo.xcassets/musicDetailPlaceholder.imageset/music_detail_placeholder@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Logo.xcassets/musicDetailPlaceholder.imageset/music_detail_placeholder@2x.png new file mode 100644 index 000000000..c3d8c6c3e Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Logo.xcassets/musicDetailPlaceholder.imageset/music_detail_placeholder@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Logo.xcassets/musicDetailPlaceholder.imageset/music_detail_placeholder@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Logo.xcassets/musicDetailPlaceholder.imageset/music_detail_placeholder@3x.png new file mode 100644 index 000000000..4515a6af1 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Logo.xcassets/musicDetailPlaceholder.imageset/music_detail_placeholder@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Logo.xcassets/splash_parable.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Logo.xcassets/splash_parable.imageset/Contents.json new file mode 100644 index 000000000..00223114c --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Logo.xcassets/splash_parable.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "splash_parable@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "splash_parable@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Logo.xcassets/splash_parable.imageset/splash_parable@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Logo.xcassets/splash_parable.imageset/splash_parable@2x.png new file mode 100644 index 000000000..95f9cc282 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Logo.xcassets/splash_parable.imageset/splash_parable@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Logo.xcassets/splash_parable.imageset/splash_parable@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Logo.xcassets/splash_parable.imageset/splash_parable@3x.png new file mode 100644 index 000000000..97faa077c Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Logo.xcassets/splash_parable.imageset/splash_parable@3x.png differ diff --git a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/Contents.json similarity index 100% rename from .tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Contents.json rename to Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/Contents.json diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingBottomShadow.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingBottomShadow.imageset/Contents.json new file mode 100644 index 000000000..a31a9ad3c --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingBottomShadow.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "LyricDecoratingBottomShadow@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "LyricDecoratingBottomShadow@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingBottomShadow.imageset/LyricDecoratingBottomShadow@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingBottomShadow.imageset/LyricDecoratingBottomShadow@2x.png new file mode 100644 index 000000000..c88475c5f Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingBottomShadow.imageset/LyricDecoratingBottomShadow@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingBottomShadow.imageset/LyricDecoratingBottomShadow@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingBottomShadow.imageset/LyricDecoratingBottomShadow@3x.png new file mode 100644 index 000000000..94de4c4a8 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingBottomShadow.imageset/LyricDecoratingBottomShadow@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingCheckBox.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingCheckBox.imageset/Contents.json new file mode 100644 index 000000000..36f454560 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingCheckBox.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "LyricDecoratingCheckBox@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "LyricDecoratingCheckBox@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingCheckBox.imageset/LyricDecoratingCheckBox@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingCheckBox.imageset/LyricDecoratingCheckBox@2x.png new file mode 100644 index 000000000..577a5bce3 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingCheckBox.imageset/LyricDecoratingCheckBox@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingCheckBox.imageset/LyricDecoratingCheckBox@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingCheckBox.imageset/LyricDecoratingCheckBox@3x.png new file mode 100644 index 000000000..11b8c3ee6 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingCheckBox.imageset/LyricDecoratingCheckBox@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingQuotationMarksLeft.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingQuotationMarksLeft.imageset/Contents.json new file mode 100644 index 000000000..413449e8d --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingQuotationMarksLeft.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "ic_12_quotation-marks_L@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ic_12_quotation-marks_L@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingQuotationMarksLeft.imageset/ic_12_quotation-marks_L@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingQuotationMarksLeft.imageset/ic_12_quotation-marks_L@2x.png new file mode 100644 index 000000000..dd59c9f35 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingQuotationMarksLeft.imageset/ic_12_quotation-marks_L@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingQuotationMarksLeft.imageset/ic_12_quotation-marks_L@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingQuotationMarksLeft.imageset/ic_12_quotation-marks_L@3x.png new file mode 100644 index 000000000..8a4ad9ac5 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingQuotationMarksLeft.imageset/ic_12_quotation-marks_L@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingQuotationMarksRight.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingQuotationMarksRight.imageset/Contents.json new file mode 100644 index 000000000..8a93f6bf8 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingQuotationMarksRight.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "ic_12_quotation-marks_R@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ic_12_quotation-marks_R@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingQuotationMarksRight.imageset/ic_12_quotation-marks_R@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingQuotationMarksRight.imageset/ic_12_quotation-marks_R@2x.png new file mode 100644 index 000000000..e3ab074ac Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingQuotationMarksRight.imageset/ic_12_quotation-marks_R@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingQuotationMarksRight.imageset/ic_12_quotation-marks_R@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingQuotationMarksRight.imageset/ic_12_quotation-marks_R@3x.png new file mode 100644 index 000000000..a1d8fc46c Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingQuotationMarksRight.imageset/ic_12_quotation-marks_R@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingWMLogo.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingWMLogo.imageset/Contents.json new file mode 100644 index 000000000..468bdd0b1 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingWMLogo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "LyricDecoratingWMLogo@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "LyricDecoratingWMLogo@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingWMLogo.imageset/LyricDecoratingWMLogo@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingWMLogo.imageset/LyricDecoratingWMLogo@2x.png new file mode 100644 index 000000000..670e72048 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingWMLogo.imageset/LyricDecoratingWMLogo@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingWMLogo.imageset/LyricDecoratingWMLogo@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingWMLogo.imageset/LyricDecoratingWMLogo@3x.png new file mode 100644 index 000000000..9c3cd97e0 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/LyricDecoratingWMLogo.imageset/LyricDecoratingWMLogo@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/error_dark.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/error_dark.imageset/Contents.json new file mode 100644 index 000000000..1725ca7f2 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/error_dark.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "error_dark@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "error_dark@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/error_dark.imageset/error_dark@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/error_dark.imageset/error_dark@2x.png new file mode 100644 index 000000000..1317ed030 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/error_dark.imageset/error_dark@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/error_dark.imageset/error_dark@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/error_dark.imageset/error_dark@3x.png new file mode 100644 index 000000000..591f92f47 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/error_dark.imageset/error_dark@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/lyric_highlight_save_off.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/lyric_highlight_save_off.imageset/Contents.json new file mode 100644 index 000000000..c84724be4 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/lyric_highlight_save_off.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "lyric_highlight_save_off@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "lyric_highlight_save_off@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/lyric_highlight_save_off.imageset/lyric_highlight_save_off@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/lyric_highlight_save_off.imageset/lyric_highlight_save_off@2x.png new file mode 100644 index 000000000..282e09824 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/lyric_highlight_save_off.imageset/lyric_highlight_save_off@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/lyric_highlight_save_off.imageset/lyric_highlight_save_off@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/lyric_highlight_save_off.imageset/lyric_highlight_save_off@3x.png new file mode 100644 index 000000000..5bc90ac42 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/lyric_highlight_save_off.imageset/lyric_highlight_save_off@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/lyric_highlight_save_on.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/lyric_highlight_save_on.imageset/Contents.json new file mode 100644 index 000000000..15e0af68f --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/lyric_highlight_save_on.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "lyric_highlight_save_on@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "lyric_highlight_save_on@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/lyric_highlight_save_on.imageset/lyric_highlight_save_on@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/lyric_highlight_save_on.imageset/lyric_highlight_save_on@2x.png new file mode 100644 index 000000000..95aacd15a Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/lyric_highlight_save_on.imageset/lyric_highlight_save_on@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/lyric_highlight_save_on.imageset/lyric_highlight_save_on@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/lyric_highlight_save_on.imageset/lyric_highlight_save_on@3x.png new file mode 100644 index 000000000..4967c89b1 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/LyricHighlighting.xcassets/lyric_highlight_save_on.imageset/lyric_highlight_save_on@3x.png differ diff --git a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Main.xcassets/Contents.json similarity index 100% rename from .tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Contents.json rename to Projects/UsertInterfaces/DesignSystem/Resources/Image/Main.xcassets/Contents.json diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Main.xcassets/playlist.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Main.xcassets/playlist.imageset/Contents.json new file mode 100644 index 000000000..90ab6a707 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Main.xcassets/playlist.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "playlist.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Main.xcassets/playlist.imageset/playlist.svg b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Main.xcassets/playlist.imageset/playlist.svg new file mode 100644 index 000000000..a6334421b --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Main.xcassets/playlist.imageset/playlist.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/Contents.json similarity index 100% rename from .tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Contents.json rename to Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/Contents.json diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/credit.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/credit.imageset/Contents.json new file mode 100644 index 000000000..1af875508 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/credit.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "ic_32_info.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/credit.imageset/ic_32_info.svg b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/credit.imageset/ic_32_info.svg new file mode 100644 index 000000000..b8020e921 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/credit.imageset/ic_32_info.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/dismiss.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/dismiss.imageset/Contents.json new file mode 100644 index 000000000..1a48267e8 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/dismiss.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "ic_32_close_header_fff.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/dismiss.imageset/ic_32_close_header_fff.svg b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/dismiss.imageset/ic_32_close_header_fff.svg new file mode 100644 index 000000000..0d7b6af28 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/dismiss.imageset/ic_32_close_header_fff.svg @@ -0,0 +1,4 @@ + + + + diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/heart.fill.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/heart.fill.imageset/Contents.json new file mode 100644 index 000000000..0508a184d --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/heart.fill.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "ic_32_heart_on.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/heart.fill.imageset/ic_32_heart_on.svg b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/heart.fill.imageset/ic_32_heart_on.svg new file mode 100644 index 000000000..b62339d52 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/heart.fill.imageset/ic_32_heart_on.svg @@ -0,0 +1,3 @@ + + + diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/heart.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/heart.imageset/Contents.json new file mode 100644 index 000000000..bfeac7b31 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/heart.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "ic_32_heart_off.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/heart.imageset/ic_32_heart_off.svg b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/heart.imageset/ic_32_heart_off.svg new file mode 100644 index 000000000..2d6e610f2 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/heart.imageset/ic_32_heart_off.svg @@ -0,0 +1,3 @@ + + + diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/ky.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/ky.imageset/Contents.json new file mode 100644 index 000000000..c4ca15029 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/ky.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "ic_32_ky@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ic_32_ky@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/ky.imageset/ic_32_ky@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/ky.imageset/ic_32_ky@2x.png new file mode 100644 index 000000000..2987c3d5d Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/ky.imageset/ic_32_ky@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/ky.imageset/ic_32_ky@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/ky.imageset/ic_32_ky@3x.png new file mode 100644 index 000000000..61b40ab65 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/ky.imageset/ic_32_ky@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/lyrics.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/lyrics.imageset/Contents.json new file mode 100644 index 000000000..9b810b4e5 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/lyrics.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "lyrics.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/lyrics.imageset/lyrics.svg b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/lyrics.imageset/lyrics.svg new file mode 100644 index 000000000..963ff810e --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/lyrics.imageset/lyrics.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/music_pick.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/music_pick.imageset/Contents.json new file mode 100644 index 000000000..e4f83e633 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/music_pick.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "ic_32_playadd_400.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/music_pick.imageset/ic_32_playadd_400.svg b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/music_pick.imageset/ic_32_playadd_400.svg new file mode 100644 index 000000000..82d8c0fbb --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/music_pick.imageset/ic_32_playadd_400.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/next.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/next.imageset/Contents.json new file mode 100644 index 000000000..67011d1a6 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/next.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "ic_32_next_on.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/next.imageset/ic_32_next_on.svg b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/next.imageset/ic_32_next_on.svg new file mode 100644 index 000000000..87d449097 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/next.imageset/ic_32_next_on.svg @@ -0,0 +1,4 @@ + + + + diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/play.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/play.imageset/Contents.json new file mode 100644 index 000000000..0eab61eed --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/play.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "play.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/play.imageset/play.svg b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/play.imageset/play.svg new file mode 100644 index 000000000..ff4ae8417 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/play.imageset/play.svg @@ -0,0 +1,3 @@ + + + diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/playlist.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/playlist.imageset/Contents.json new file mode 100644 index 000000000..747144ba0 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/playlist.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "ic_32_play_list_400.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/playlist.imageset/ic_32_play_list_400.svg b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/playlist.imageset/ic_32_play_list_400.svg new file mode 100644 index 000000000..feb0af5c5 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/playlist.imageset/ic_32_play_list_400.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/prev.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/prev.imageset/Contents.json new file mode 100644 index 000000000..8af812a48 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/prev.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "ic_32_prev_on.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/prev.imageset/ic_32_prev_on.svg b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/prev.imageset/ic_32_prev_on.svg new file mode 100644 index 000000000..c0fc646bd --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/prev.imageset/ic_32_prev_on.svg @@ -0,0 +1,4 @@ + + + + diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/singing_room.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/singing_room.imageset/Contents.json new file mode 100644 index 000000000..95fc0d90f --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/singing_room.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "singing_room.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/singing_room.imageset/singing_room.svg b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/singing_room.imageset/singing_room.svg new file mode 100644 index 000000000..931dd4b64 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/singing_room.imageset/singing_room.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/tj.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/tj.imageset/Contents.json new file mode 100644 index 000000000..0bead861f --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/tj.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "ic_32_tj@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ic_32_tj@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/tj.imageset/ic_32_tj@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/tj.imageset/ic_32_tj@2x.png new file mode 100644 index 000000000..ee9dcef1c Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/tj.imageset/ic_32_tj@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/tj.imageset/ic_32_tj@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/tj.imageset/ic_32_tj@3x.png new file mode 100644 index 000000000..f4d5099eb Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/tj.imageset/ic_32_tj@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/views.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/views.imageset/Contents.json new file mode 100644 index 000000000..1dc6ee38b --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/views.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "ic_32_views.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/views.imageset/ic_32_views.svg b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/views.imageset/ic_32_views.svg new file mode 100644 index 000000000..6d0dd05ac --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MusicDetail.xcassets/views.imageset/ic_32_views.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/Contents.json similarity index 100% rename from .tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Contents.json rename to Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/Contents.json diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/donut.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/donut.imageset/Contents.json new file mode 100644 index 000000000..91543bb11 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/donut.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "radio_button@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "radio_button@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/donut.imageset/radio_button@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/donut.imageset/radio_button@2x.png new file mode 100644 index 000000000..6d3efaa90 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/donut.imageset/radio_button@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/donut.imageset/radio_button@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/donut.imageset/radio_button@3x.png new file mode 100644 index 000000000..a6a026260 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/donut.imageset/radio_button@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/donut_color.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/donut_color.imageset/Contents.json new file mode 100644 index 000000000..a5cf0c1cc --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/donut_color.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "radio_button_fill@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "radio_button_fill@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/donut_color.imageset/radio_button_fill@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/donut_color.imageset/radio_button_fill@2x.png new file mode 100644 index 000000000..53408431b Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/donut_color.imageset/radio_button_fill@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/donut_color.imageset/radio_button_fill@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/donut_color.imageset/radio_button_fill@3x.png new file mode 100644 index 000000000..680a99979 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/donut_color.imageset/radio_button_fill@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/dot.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/dot.imageset/Contents.json new file mode 100644 index 000000000..60b8de503 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/dot.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "ic_16_dot.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "ic_16_dot@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ic_16_dot@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/dot.imageset/ic_16_dot.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/dot.imageset/ic_16_dot.png new file mode 100644 index 000000000..97716554a Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/dot.imageset/ic_16_dot.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/dot.imageset/ic_16_dot@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/dot.imageset/ic_16_dot@2x.png new file mode 100644 index 000000000..92dda4d72 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/dot.imageset/ic_16_dot@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/dot.imageset/ic_16_dot@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/dot.imageset/ic_16_dot@3x.png new file mode 100644 index 000000000..977b43557 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/dot.imageset/ic_16_dot@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/fruit.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/fruit.imageset/Contents.json new file mode 100644 index 000000000..11ea9cbbb --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/fruit.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "ic_32_keep.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "ic_32_keep@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ic_32_keep@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/fruit.imageset/ic_32_keep.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/fruit.imageset/ic_32_keep.png new file mode 100644 index 000000000..07b647c42 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/fruit.imageset/ic_32_keep.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/fruit.imageset/ic_32_keep@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/fruit.imageset/ic_32_keep@2x.png new file mode 100644 index 000000000..409cb4095 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/fruit.imageset/ic_32_keep@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/fruit.imageset/ic_32_keep@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/fruit.imageset/ic_32_keep@3x.png new file mode 100644 index 000000000..d5232473e Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/fruit.imageset/ic_32_keep@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/gear.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/gear.imageset/Contents.json new file mode 100644 index 000000000..808c8103d --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/gear.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "ic_32_set.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "ic_32_set@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ic_32_set@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/gear.imageset/ic_32_set.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/gear.imageset/ic_32_set.png new file mode 100644 index 000000000..20b155a98 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/gear.imageset/ic_32_set.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/gear.imageset/ic_32_set@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/gear.imageset/ic_32_set@2x.png new file mode 100644 index 000000000..fcf8ed883 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/gear.imageset/ic_32_set@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/gear.imageset/ic_32_set@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/gear.imageset/ic_32_set@3x.png new file mode 100644 index 000000000..8e91ea5fd Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/gear.imageset/ic_32_set@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/heart_myInfo.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/heart_myInfo.imageset/Contents.json new file mode 100644 index 000000000..b96161e03 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/heart_myInfo.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "ic_32_heart_off.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "ic_32_heart_off@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ic_32_heart_off@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/heart_myInfo.imageset/ic_32_heart_off.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/heart_myInfo.imageset/ic_32_heart_off.png new file mode 100644 index 000000000..4b4e5144b Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/heart_myInfo.imageset/ic_32_heart_off.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/heart_myInfo.imageset/ic_32_heart_off@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/heart_myInfo.imageset/ic_32_heart_off@2x.png new file mode 100644 index 000000000..35716c474 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/heart_myInfo.imageset/ic_32_heart_off@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/heart_myInfo.imageset/ic_32_heart_off@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/heart_myInfo.imageset/ic_32_heart_off@3x.png new file mode 100644 index 000000000..e8504a842 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/heart_myInfo.imageset/ic_32_heart_off@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/icon_color.imageset/AppIcon_300.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/icon_color.imageset/AppIcon_300.png new file mode 100644 index 000000000..c3ef1caf5 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/icon_color.imageset/AppIcon_300.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/icon_color.imageset/AppIcon_300@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/icon_color.imageset/AppIcon_300@2x.png new file mode 100644 index 000000000..bfca98b52 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/icon_color.imageset/AppIcon_300@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/icon_color.imageset/AppIcon_300@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/icon_color.imageset/AppIcon_300@3x.png new file mode 100644 index 000000000..7690d180b Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/icon_color.imageset/AppIcon_300@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/icon_color.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/icon_color.imageset/Contents.json new file mode 100644 index 000000000..8bc7fa804 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/icon_color.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "AppIcon_300.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "AppIcon_300@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "AppIcon_300@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/mail.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/mail.imageset/Contents.json new file mode 100644 index 000000000..eae4e6d1a --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/mail.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "ic_32_request.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "ic_32_request@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ic_32_request@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/mail.imageset/ic_32_request.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/mail.imageset/ic_32_request.png new file mode 100644 index 000000000..6f4dd41af Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/mail.imageset/ic_32_request.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/mail.imageset/ic_32_request@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/mail.imageset/ic_32_request@2x.png new file mode 100644 index 000000000..7e2304591 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/mail.imageset/ic_32_request@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/mail.imageset/ic_32_request@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/mail.imageset/ic_32_request@3x.png new file mode 100644 index 000000000..53919f3da Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/mail.imageset/ic_32_request@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/more.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/more.imageset/Contents.json new file mode 100644 index 000000000..ed84c4254 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/more.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "ic_32_more.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "ic_32_more@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ic_32_more@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/more.imageset/ic_32_more.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/more.imageset/ic_32_more.png new file mode 100644 index 000000000..3e664add3 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/more.imageset/ic_32_more.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/more.imageset/ic_32_more@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/more.imageset/ic_32_more@2x.png new file mode 100644 index 000000000..194ace126 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/more.imageset/ic_32_more@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/more.imageset/ic_32_more@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/more.imageset/ic_32_more@3x.png new file mode 100644 index 000000000..bfa48c5e1 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/more.imageset/ic_32_more@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/noti.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/noti.imageset/Contents.json new file mode 100644 index 000000000..b242193f5 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/noti.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "ic_32_noti.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "ic_32_noti@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ic_32_noti@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/noti.imageset/ic_32_noti.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/noti.imageset/ic_32_noti.png new file mode 100644 index 000000000..a95c6a962 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/noti.imageset/ic_32_noti.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/noti.imageset/ic_32_noti@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/noti.imageset/ic_32_noti@2x.png new file mode 100644 index 000000000..fb5c3c586 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/noti.imageset/ic_32_noti@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/noti.imageset/ic_32_noti@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/noti.imageset/ic_32_noti@3x.png new file mode 100644 index 000000000..1743391eb Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/noti.imageset/ic_32_noti@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/qna.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/qna.imageset/Contents.json new file mode 100644 index 000000000..fcd0064ab --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/qna.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "ic_32_qna.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "ic_32_qna@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ic_32_qna@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/qna.imageset/ic_32_qna.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/qna.imageset/ic_32_qna.png new file mode 100644 index 000000000..2c4e074e5 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/qna.imageset/ic_32_qna.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/qna.imageset/ic_32_qna@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/qna.imageset/ic_32_qna@2x.png new file mode 100644 index 000000000..e248d1bdc Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/qna.imageset/ic_32_qna@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/qna.imageset/ic_32_qna@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/qna.imageset/ic_32_qna@3x.png new file mode 100644 index 000000000..54fb55903 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/qna.imageset/ic_32_qna@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/red_dot.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/red_dot.imageset/Contents.json new file mode 100644 index 000000000..7f3ef2ec7 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/red_dot.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "dot.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "dot@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "dot@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/red_dot.imageset/dot.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/red_dot.imageset/dot.png new file mode 100644 index 000000000..d740d5367 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/red_dot.imageset/dot.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/red_dot.imageset/dot@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/red_dot.imageset/dot@2x.png new file mode 100644 index 000000000..e40760007 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/red_dot.imageset/dot@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/red_dot.imageset/dot@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/red_dot.imageset/dot@3x.png new file mode 100644 index 000000000..4ad18ae8b Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/red_dot.imageset/dot@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/team.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/team.imageset/Contents.json new file mode 100644 index 000000000..9bca901ef --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/team.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "ic_32_team.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "ic_32_team@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ic_32_team@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/team.imageset/ic_32_team.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/team.imageset/ic_32_team.png new file mode 100644 index 000000000..26334b994 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/team.imageset/ic_32_team.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/team.imageset/ic_32_team@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/team.imageset/ic_32_team@2x.png new file mode 100644 index 000000000..0946aa8a8 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/team.imageset/ic_32_team@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/team.imageset/ic_32_team@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/team.imageset/ic_32_team@3x.png new file mode 100644 index 000000000..74ea76224 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/MyInfo.xcassets/team.imageset/ic_32_team@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Permission.xcassets/permission_device.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Permission.xcassets/permission_device.imageset/Contents.json new file mode 100644 index 000000000..eca05e043 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Permission.xcassets/permission_device.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "permission_device@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "permission_device@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Permission.xcassets/permission_device.imageset/permission_device@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Permission.xcassets/permission_device.imageset/permission_device@2x.png new file mode 100644 index 000000000..f797f28d9 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Permission.xcassets/permission_device.imageset/permission_device@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Permission.xcassets/permission_device.imageset/permission_device@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Permission.xcassets/permission_device.imageset/permission_device@3x.png new file mode 100644 index 000000000..a584f4783 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Permission.xcassets/permission_device.imageset/permission_device@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Permission.xcassets/permission_notification.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Permission.xcassets/permission_notification.imageset/Contents.json new file mode 100644 index 000000000..3cff514dd --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Permission.xcassets/permission_notification.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "permission_notification@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "permission_notification@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Permission.xcassets/permission_notification.imageset/permission_notification@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Permission.xcassets/permission_notification.imageset/permission_notification@2x.png new file mode 100644 index 000000000..f451ccc5e Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Permission.xcassets/permission_notification.imageset/permission_notification@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Permission.xcassets/permission_notification.imageset/permission_notification@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Permission.xcassets/permission_notification.imageset/permission_notification@3x.png new file mode 100644 index 000000000..cf6f4e22b Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Permission.xcassets/permission_notification.imageset/permission_notification@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Player.xcassets/dummy_thumbnail_large.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Player.xcassets/dummy_thumbnail_large.imageset/Contents.json deleted file mode 100644 index d9287fdf9..000000000 --- a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Player.xcassets/dummy_thumbnail_large.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "filename" : "img.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "img@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "img@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Player.xcassets/dummy_thumbnail_large.imageset/img.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Player.xcassets/dummy_thumbnail_large.imageset/img.png deleted file mode 100644 index e7722103e..000000000 Binary files a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Player.xcassets/dummy_thumbnail_large.imageset/img.png and /dev/null differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Player.xcassets/dummy_thumbnail_large.imageset/img@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Player.xcassets/dummy_thumbnail_large.imageset/img@2x.png deleted file mode 100644 index 0cc69c45c..000000000 Binary files a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Player.xcassets/dummy_thumbnail_large.imageset/img@2x.png and /dev/null differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Player.xcassets/dummy_thumbnail_large.imageset/img@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Player.xcassets/dummy_thumbnail_large.imageset/img@3x.png deleted file mode 100644 index 7b88aa0e2..000000000 Binary files a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Player.xcassets/dummy_thumbnail_large.imageset/img@3x.png and /dev/null differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Player.xcassets/dummy_thumbnail_medium.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Player.xcassets/dummy_thumbnail_medium.imageset/Contents.json deleted file mode 100644 index d0b7fae40..000000000 --- a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Player.xcassets/dummy_thumbnail_medium.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "filename" : "mediumdummy.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "mediumdummy@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "mediumdummy@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Player.xcassets/dummy_thumbnail_medium.imageset/mediumdummy.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Player.xcassets/dummy_thumbnail_medium.imageset/mediumdummy.png deleted file mode 100644 index 5b93815cd..000000000 Binary files a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Player.xcassets/dummy_thumbnail_medium.imageset/mediumdummy.png and /dev/null differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Player.xcassets/dummy_thumbnail_medium.imageset/mediumdummy@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Player.xcassets/dummy_thumbnail_medium.imageset/mediumdummy@2x.png deleted file mode 100644 index 0f640989b..000000000 Binary files a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Player.xcassets/dummy_thumbnail_medium.imageset/mediumdummy@2x.png and /dev/null differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Player.xcassets/dummy_thumbnail_medium.imageset/mediumdummy@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Player.xcassets/dummy_thumbnail_medium.imageset/mediumdummy@3x.png deleted file mode 100644 index a3c19aba4..000000000 Binary files a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Player.xcassets/dummy_thumbnail_medium.imageset/mediumdummy@3x.png and /dev/null differ diff --git a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/Contents.json similarity index 100% rename from .tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Contents.json rename to Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/Contents.json diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/album.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/album.imageset/Contents.json new file mode 100644 index 000000000..355a44c5f --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/album.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "ic_32_album@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ic_32_album@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/album.imageset/ic_32_album@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/album.imageset/ic_32_album@2x.png new file mode 100644 index 000000000..14ca9efd8 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/album.imageset/ic_32_album@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/album.imageset/ic_32_album@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/album.imageset/ic_32_album@3x.png new file mode 100644 index 000000000..f6f9b4d52 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/album.imageset/ic_32_album@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/grayDot.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/grayDot.imageset/Contents.json new file mode 100644 index 000000000..041d0e11b --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/grayDot.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "ic_16_dot_4@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ic_16_dot_4@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/grayDot.imageset/ic_16_dot_4@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/grayDot.imageset/ic_16_dot_4@2x.png new file mode 100644 index 000000000..92dda4d72 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/grayDot.imageset/ic_16_dot_4@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/grayDot.imageset/ic_16_dot_4@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/grayDot.imageset/ic_16_dot_4@3x.png new file mode 100644 index 000000000..977b43557 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/grayDot.imageset/ic_16_dot_4@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/lock.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/lock.imageset/Contents.json new file mode 100644 index 000000000..490001a17 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/lock.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Property 1=ic_32_close.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "lock.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/lock.imageset/Property 1=ic_32_close.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/lock.imageset/Property 1=ic_32_close.png new file mode 100644 index 000000000..aa35b4b89 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/lock.imageset/Property 1=ic_32_close.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/lock.imageset/lock.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/lock.imageset/lock.png new file mode 100644 index 000000000..aee71ebd6 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/lock.imageset/lock.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/miniNote.imageset/Component 1@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/miniNote.imageset/Component 1@3x.png new file mode 100644 index 000000000..f1e556578 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/miniNote.imageset/Component 1@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/miniNote.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/miniNote.imageset/Contents.json new file mode 100644 index 000000000..6cb1178c4 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/miniNote.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "miniNote.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Component 1@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/miniNote.imageset/miniNote.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/miniNote.imageset/miniNote.png new file mode 100644 index 000000000..f864451ec Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/miniNote.imageset/miniNote.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/smallGrayDot.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/smallGrayDot.imageset/Contents.json new file mode 100644 index 000000000..7cf57b655 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/smallGrayDot.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "smallGrayDot@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "smallGrayDot@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/smallGrayDot.imageset/smallGrayDot@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/smallGrayDot.imageset/smallGrayDot@2x.png new file mode 100644 index 000000000..75e8ccff7 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/smallGrayDot.imageset/smallGrayDot@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/smallGrayDot.imageset/smallGrayDot@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/smallGrayDot.imageset/smallGrayDot@3x.png new file mode 100644 index 000000000..1033e1181 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/smallGrayDot.imageset/smallGrayDot@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/unLock.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/unLock.imageset/Contents.json new file mode 100644 index 000000000..70ad9c4b5 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/unLock.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "unLock@x2.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "unLock.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/unLock.imageset/unLock.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/unLock.imageset/unLock.png new file mode 100644 index 000000000..378566891 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/unLock.imageset/unLock.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/unLock.imageset/unLock@x2.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/unLock.imageset/unLock@x2.png new file mode 100644 index 000000000..941362f9c Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Playlist.xcassets/unLock.imageset/unLock@x2.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Search.xcassets/arrow_down.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Search.xcassets/arrow_down.imageset/Contents.json new file mode 100644 index 000000000..38f2b9f27 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Search.xcassets/arrow_down.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "ic_16_arrow_down@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ic_16_arrow_down@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Search.xcassets/arrow_down.imageset/ic_16_arrow_down@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Search.xcassets/arrow_down.imageset/ic_16_arrow_down@2x.png new file mode 100644 index 000000000..0f231101d Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Search.xcassets/arrow_down.imageset/ic_16_arrow_down@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Search.xcassets/arrow_down.imageset/ic_16_arrow_down@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Search.xcassets/arrow_down.imageset/ic_16_arrow_down@3x.png new file mode 100644 index 000000000..a92ff6d2d Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Search.xcassets/arrow_down.imageset/ic_16_arrow_down@3x.png differ diff --git a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/Contents.json similarity index 100% rename from .tuist-bin/Templates/swiftui/tvos/Assets.xcassets/Contents.json rename to Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/Contents.json diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/heart_blue.imageset/14.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/heart_blue.imageset/14.png new file mode 100644 index 000000000..617ed780c Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/heart_blue.imageset/14.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/heart_blue.imageset/14@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/heart_blue.imageset/14@2x.png new file mode 100644 index 000000000..b985cb22d Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/heart_blue.imageset/14@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/heart_blue.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/heart_blue.imageset/Contents.json new file mode 100644 index 000000000..8d83b4da4 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/heart_blue.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "14@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "14.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/heart_green.imageset/12.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/heart_green.imageset/12.png new file mode 100644 index 000000000..80a68ebe5 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/heart_green.imageset/12.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/heart_green.imageset/12@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/heart_green.imageset/12@2x.png new file mode 100644 index 000000000..d44b50466 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/heart_green.imageset/12@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/heart_green.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/heart_green.imageset/Contents.json new file mode 100644 index 000000000..aea2d4a64 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/heart_green.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "12@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "12.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/heart_purple.imageset/16.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/heart_purple.imageset/16.png new file mode 100644 index 000000000..ec36ebccc Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/heart_purple.imageset/16.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/heart_purple.imageset/16@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/heart_purple.imageset/16@2x.png new file mode 100644 index 000000000..534b3c93e Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/heart_purple.imageset/16@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/heart_purple.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/heart_purple.imageset/Contents.json new file mode 100644 index 000000000..9b7bf3787 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/heart_purple.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "16@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "16.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/heart_yellow.imageset/13.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/heart_yellow.imageset/13.png new file mode 100644 index 000000000..bbed798d7 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/heart_yellow.imageset/13.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/heart_yellow.imageset/13@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/heart_yellow.imageset/13@2x.png new file mode 100644 index 000000000..b9d6b2cca Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/heart_yellow.imageset/13@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/heart_yellow.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/heart_yellow.imageset/Contents.json new file mode 100644 index 000000000..fbb7959e2 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/heart_yellow.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "13@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "13.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/note_gray.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/note_gray.imageset/Contents.json new file mode 100644 index 000000000..775d14241 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/note_gray.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Note@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Note@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/note_gray.imageset/Note@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/note_gray.imageset/Note@2x.png new file mode 100644 index 000000000..b560e6b38 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/note_gray.imageset/Note@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/note_gray.imageset/Note@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/note_gray.imageset/Note@3x.png new file mode 100644 index 000000000..20b23ad67 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/note_gray.imageset/Note@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/particle_medium.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/particle_medium.imageset/Contents.json new file mode 100644 index 000000000..37244a612 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/particle_medium.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Vector@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Vector.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/particle_medium.imageset/Vector.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/particle_medium.imageset/Vector.png new file mode 100644 index 000000000..68bc2e368 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/particle_medium.imageset/Vector.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/particle_medium.imageset/Vector@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/particle_medium.imageset/Vector@2x.png new file mode 100644 index 000000000..1dd5f2703 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/particle_medium.imageset/Vector@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/particle_small.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/particle_small.imageset/Contents.json new file mode 100644 index 000000000..2ac0d5b3d --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/particle_small.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Vector@2x-1.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Vector-1.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/particle_small.imageset/Vector-1.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/particle_small.imageset/Vector-1.png new file mode 100644 index 000000000..c2de65999 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/particle_small.imageset/Vector-1.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/particle_small.imageset/Vector@2x-1.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/particle_small.imageset/Vector@2x-1.png new file mode 100644 index 000000000..33918e9ab Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/Particle/particle_small.imageset/Vector@2x-1.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/attach_remove.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/attach_remove.imageset/Contents.json deleted file mode 100644 index aaa0aa431..000000000 --- a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/attach_remove.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "attach_remove@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "attach_remove@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/attach_remove.imageset/attach_remove@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/attach_remove.imageset/attach_remove@2x.png deleted file mode 100644 index a59f21432..000000000 Binary files a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/attach_remove.imageset/attach_remove@2x.png and /dev/null differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/attach_remove.imageset/attach_remove@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/attach_remove.imageset/attach_remove@3x.png deleted file mode 100644 index ee8959439..000000000 Binary files a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/attach_remove.imageset/attach_remove@3x.png and /dev/null differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/camera.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/camera.imageset/Contents.json index 036286339..507245a19 100644 --- a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/camera.imageset/Contents.json +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/camera.imageset/Contents.json @@ -5,12 +5,12 @@ "scale" : "1x" }, { - "filename" : "ic_32_camera-1.png", + "filename" : "ic_32_camera_fff.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "ic_32_camera.png", + "filename" : "ic_32_camera_fff 1.png", "idiom" : "universal", "scale" : "3x" } diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/camera.imageset/ic_32_camera-1.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/camera.imageset/ic_32_camera-1.png deleted file mode 100644 index d2cf22735..000000000 Binary files a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/camera.imageset/ic_32_camera-1.png and /dev/null differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/camera.imageset/ic_32_camera.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/camera.imageset/ic_32_camera.png deleted file mode 100644 index aecb5fa12..000000000 Binary files a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/camera.imageset/ic_32_camera.png and /dev/null differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/camera.imageset/ic_32_camera_fff 1.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/camera.imageset/ic_32_camera_fff 1.png new file mode 100644 index 000000000..078f7a6bc Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/camera.imageset/ic_32_camera_fff 1.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/camera.imageset/ic_32_camera_fff.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/camera.imageset/ic_32_camera_fff.png new file mode 100644 index 000000000..078f7a6bc Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/camera.imageset/ic_32_camera_fff.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/close.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/close.imageset/Contents.json deleted file mode 100644 index beef6185a..000000000 --- a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/close.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "ic_24_close_900-1.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "ic_24_close_900.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/close.imageset/ic_24_close_900-1.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/close.imageset/ic_24_close_900-1.png deleted file mode 100644 index ee5e64b6e..000000000 Binary files a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/close.imageset/ic_24_close_900-1.png and /dev/null differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/close.imageset/ic_24_close_900.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/close.imageset/ic_24_close_900.png deleted file mode 100644 index 86a420642..000000000 Binary files a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/close.imageset/ic_24_close_900.png and /dev/null differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/play.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/play.imageset/Contents.json deleted file mode 100644 index 4a9459e18..000000000 --- a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/play.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "ic_32_play_point-1.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "ic_32_play_point.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/play.imageset/ic_32_play_point.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/play.imageset/ic_32_play_point.png deleted file mode 100644 index ecdec6ce9..000000000 Binary files a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/play.imageset/ic_32_play_point.png and /dev/null differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/storage_close.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/storage_close.imageset/Contents.json new file mode 100644 index 000000000..0bf04a3c9 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/storage_close.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "ic_16_close@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ic_16_close@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/storage_close.imageset/ic_16_close@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/storage_close.imageset/ic_16_close@2x.png new file mode 100644 index 000000000..9d6d046cd Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/storage_close.imageset/ic_16_close@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/storage_close.imageset/ic_16_close@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/storage_close.imageset/ic_16_close@3x.png new file mode 100644 index 000000000..9f71e86af Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Storage.xcassets/storage_close.imageset/ic_16_close@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/artist_on.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/artist_on.imageset/Contents.json index 11abefcf9..26b423d0b 100644 --- a/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/artist_on.imageset/Contents.json +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/artist_on.imageset/Contents.json @@ -5,12 +5,12 @@ "scale" : "1x" }, { - "filename" : "icon_artist_on@2x.png", + "filename" : "ic_32_artist_Enabled.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "icon_artist_on@3x.png", + "filename" : "ic_32_artist_Enabled-1.png", "idiom" : "universal", "scale" : "3x" } diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/artist_on.imageset/ic_32_artist_Enabled-1.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/artist_on.imageset/ic_32_artist_Enabled-1.png new file mode 100644 index 000000000..191b91f0e Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/artist_on.imageset/ic_32_artist_Enabled-1.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/artist_on.imageset/ic_32_artist_Enabled.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/artist_on.imageset/ic_32_artist_Enabled.png new file mode 100644 index 000000000..afcd5ac0d Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/artist_on.imageset/ic_32_artist_Enabled.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/artist_on.imageset/icon_artist_on@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/artist_on.imageset/icon_artist_on@2x.png deleted file mode 100644 index b6bdbcb99..000000000 Binary files a/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/artist_on.imageset/icon_artist_on@2x.png and /dev/null differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/artist_on.imageset/icon_artist_on@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/artist_on.imageset/icon_artist_on@3x.png deleted file mode 100644 index 539dfb281..000000000 Binary files a/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/artist_on.imageset/icon_artist_on@3x.png and /dev/null differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/chart_off.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/chart_off.imageset/Contents.json deleted file mode 100644 index a8df34918..000000000 --- a/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/chart_off.imageset/Contents.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "icon_chart_off@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "icon_chart_off@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - }, - "properties" : { - "template-rendering-intent" : "original" - } -} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/chart_off.imageset/icon_chart_off@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/chart_off.imageset/icon_chart_off@2x.png deleted file mode 100644 index 0a56c8f76..000000000 Binary files a/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/chart_off.imageset/icon_chart_off@2x.png and /dev/null differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/chart_off.imageset/icon_chart_off@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/chart_off.imageset/icon_chart_off@3x.png deleted file mode 100644 index 9cfba52f9..000000000 Binary files a/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/chart_off.imageset/icon_chart_off@3x.png and /dev/null differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/chart_on.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/chart_on.imageset/Contents.json deleted file mode 100644 index 07e69bbf0..000000000 --- a/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/chart_on.imageset/Contents.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "icon_chart_on@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "icon_chart_on@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - }, - "properties" : { - "template-rendering-intent" : "original" - } -} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/chart_on.imageset/icon_chart_on@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/chart_on.imageset/icon_chart_on@2x.png deleted file mode 100644 index 86521a1b3..000000000 Binary files a/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/chart_on.imageset/icon_chart_on@2x.png and /dev/null differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/chart_on.imageset/icon_chart_on@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/chart_on.imageset/icon_chart_on@3x.png deleted file mode 100644 index a9675a182..000000000 Binary files a/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/chart_on.imageset/icon_chart_on@3x.png and /dev/null differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/myinfo_off.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/myinfo_off.imageset/Contents.json new file mode 100644 index 000000000..00a138db0 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/myinfo_off.imageset/Contents.json @@ -0,0 +1,25 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "icon_storage_off@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "icon_storage_off@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "original" + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/storage_off.imageset/icon_storage_off@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/myinfo_off.imageset/icon_storage_off@2x.png similarity index 100% rename from Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/storage_off.imageset/icon_storage_off@2x.png rename to Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/myinfo_off.imageset/icon_storage_off@2x.png diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/storage_off.imageset/icon_storage_off@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/myinfo_off.imageset/icon_storage_off@3x.png similarity index 100% rename from Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/storage_off.imageset/icon_storage_off@3x.png rename to Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/myinfo_off.imageset/icon_storage_off@3x.png diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/myinfo_on.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/myinfo_on.imageset/Contents.json new file mode 100644 index 000000000..ed2cb77eb --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/myinfo_on.imageset/Contents.json @@ -0,0 +1,25 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "icon_storage_on@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "icon_storage_on@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "original" + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/storage_on.imageset/icon_storage_on@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/myinfo_on.imageset/icon_storage_on@2x.png similarity index 100% rename from Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/storage_on.imageset/icon_storage_on@2x.png rename to Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/myinfo_on.imageset/icon_storage_on@2x.png diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/storage_on.imageset/icon_storage_on@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/myinfo_on.imageset/icon_storage_on@3x.png similarity index 100% rename from Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/storage_on.imageset/icon_storage_on@3x.png rename to Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/myinfo_on.imageset/icon_storage_on@3x.png diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/search_on.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/search_on.imageset/Contents.json index 0610634c6..e370bb100 100644 --- a/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/search_on.imageset/Contents.json +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/search_on.imageset/Contents.json @@ -5,12 +5,12 @@ "scale" : "1x" }, { - "filename" : "icon_search_on@2x.png", + "filename" : "ic_32_Search_Enabled.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "icon_search_on@3x.png", + "filename" : "ic_32_Search_Enabled-1.png", "idiom" : "universal", "scale" : "3x" } diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/search_on.imageset/ic_32_Search_Enabled-1.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/search_on.imageset/ic_32_Search_Enabled-1.png new file mode 100644 index 000000000..120ed3589 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/search_on.imageset/ic_32_Search_Enabled-1.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/search_on.imageset/ic_32_Search_Enabled.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/search_on.imageset/ic_32_Search_Enabled.png new file mode 100644 index 000000000..1b22cdadd Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/search_on.imageset/ic_32_Search_Enabled.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/search_on.imageset/icon_search_on@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/search_on.imageset/icon_search_on@2x.png deleted file mode 100644 index 92dea3444..000000000 Binary files a/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/search_on.imageset/icon_search_on@2x.png and /dev/null differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/search_on.imageset/icon_search_on@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/search_on.imageset/icon_search_on@3x.png deleted file mode 100644 index 8deb5e6f1..000000000 Binary files a/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/search_on.imageset/icon_search_on@3x.png and /dev/null differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/storage_off.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/storage_off.imageset/Contents.json index 00a138db0..0b1f6f8ad 100644 --- a/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/storage_off.imageset/Contents.json +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/storage_off.imageset/Contents.json @@ -5,12 +5,12 @@ "scale" : "1x" }, { - "filename" : "icon_storage_off@2x.png", + "filename" : "storage_off.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "icon_storage_off@3x.png", + "filename" : "ic_32_keep_Disabled.png", "idiom" : "universal", "scale" : "3x" } @@ -18,8 +18,5 @@ "info" : { "author" : "xcode", "version" : 1 - }, - "properties" : { - "template-rendering-intent" : "original" } } diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/storage_off.imageset/ic_32_keep_Disabled.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/storage_off.imageset/ic_32_keep_Disabled.png new file mode 100644 index 000000000..c04d3231f Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/storage_off.imageset/ic_32_keep_Disabled.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/storage_off.imageset/storage_off.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/storage_off.imageset/storage_off.png new file mode 100644 index 000000000..e27eff074 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/storage_off.imageset/storage_off.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/storage_on.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/storage_on.imageset/Contents.json index ed2cb77eb..2acb1870f 100644 --- a/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/storage_on.imageset/Contents.json +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/storage_on.imageset/Contents.json @@ -5,12 +5,12 @@ "scale" : "1x" }, { - "filename" : "icon_storage_on@2x.png", + "filename" : "storage_on.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "icon_storage_on@3x.png", + "filename" : "ic_32_keep_Enabled.png", "idiom" : "universal", "scale" : "3x" } @@ -18,8 +18,5 @@ "info" : { "author" : "xcode", "version" : 1 - }, - "properties" : { - "template-rendering-intent" : "original" } } diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/storage_on.imageset/ic_32_keep_Enabled.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/storage_on.imageset/ic_32_keep_Enabled.png new file mode 100644 index 000000000..d34f162fb Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/storage_on.imageset/ic_32_keep_Enabled.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/storage_on.imageset/storage_on.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/storage_on.imageset/storage_on.png new file mode 100644 index 000000000..0abec960d Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/TabBar.xcassets/storage_on.imageset/storage_on.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Color/GrayColor.xcassets/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/Contents.json similarity index 100% rename from Projects/UsertInterfaces/DesignSystem/Resources/Color/GrayColor.xcassets/Contents.json rename to Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/Contents.json diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/arrow_bottom.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/arrow_bottom.imageset/Contents.json new file mode 100644 index 000000000..78b6f69ea --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/arrow_bottom.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "arrow_bottom@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "arrow_bottom@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/arrow_bottom.imageset/arrow_bottom@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/arrow_bottom.imageset/arrow_bottom@2x.png new file mode 100644 index 000000000..e37b5f26d Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/arrow_bottom.imageset/arrow_bottom@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/arrow_bottom.imageset/arrow_bottom@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/arrow_bottom.imageset/arrow_bottom@3x.png new file mode 100644 index 000000000..6bf7f865d Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/arrow_bottom.imageset/arrow_bottom@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/arrow_top.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/arrow_top.imageset/Contents.json new file mode 100644 index 000000000..40ac47b2d --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/arrow_top.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "arrow_top@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "arrow_top@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/arrow_top.imageset/arrow_top@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/arrow_top.imageset/arrow_top@2x.png new file mode 100644 index 000000000..f78e2c9b6 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/arrow_top.imageset/arrow_top@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/arrow_top.imageset/arrow_top@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/arrow_top.imageset/arrow_top@3x.png new file mode 100644 index 000000000..509488eaa Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/arrow_top.imageset/arrow_top@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/crown.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/crown.imageset/Contents.json new file mode 100644 index 000000000..afbb31081 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/crown.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "crown@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "crown@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/crown.imageset/crown@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/crown.imageset/crown@2x.png new file mode 100644 index 000000000..f80868be9 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/crown.imageset/crown@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/crown.imageset/crown@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/crown.imageset/crown@3x.png new file mode 100644 index 000000000..0e4b68a6c Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/crown.imageset/crown@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/folder_off.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/folder_off.imageset/Contents.json new file mode 100644 index 000000000..c50ee9e95 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/folder_off.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "folder_off@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "folder_off@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/folder_off.imageset/folder_off@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/folder_off.imageset/folder_off@2x.png new file mode 100644 index 000000000..92d3c51a3 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/folder_off.imageset/folder_off@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/folder_off.imageset/folder_off@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/folder_off.imageset/folder_off@3x.png new file mode 100644 index 000000000..965c2b195 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/folder_off.imageset/folder_off@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/folder_on.imageset/Contents.json b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/folder_on.imageset/Contents.json new file mode 100644 index 000000000..dadc83641 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/folder_on.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "folder_on@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "folder_on@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/folder_on.imageset/folder_on@2x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/folder_on.imageset/folder_on@2x.png new file mode 100644 index 000000000..c9705dd94 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/folder_on.imageset/folder_on@2x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/folder_on.imageset/folder_on@3x.png b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/folder_on.imageset/folder_on@3x.png new file mode 100644 index 000000000..0f70a5218 Binary files /dev/null and b/Projects/UsertInterfaces/DesignSystem/Resources/Image/Team.xcassets/folder_on.imageset/folder_on@3x.png differ diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Lottie/Artist_Tab.json b/Projects/UsertInterfaces/DesignSystem/Resources/Lottie/Artist_Tab.json index b92f4b47a..30ae02f0c 100644 --- a/Projects/UsertInterfaces/DesignSystem/Resources/Lottie/Artist_Tab.json +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Lottie/Artist_Tab.json @@ -1 +1 @@ -{"v":"4.8.0","meta":{"g":"LottieFiles AE 3.1.1","a":"","k":"","d":"","tc":""},"fr":29.9700012207031,"ip":0,"op":30.0000012219251,"w":320,"h":320,"nm":"Artist_ic","ddd":0,"assets":[{"id":"image_0","w":320,"h":320,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUAAAAFACAYAAADNkKWqAAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAgAElEQVR4nOy9a8wlyXke9rx1zneby87scrnLuyRSlGUytmSTlixbUiQFcBA7siRbEHKD4BhBAkPIjyBAkD9BDPhPghj5Y+diOIkhGJETQ7FhOwhgBwbj2E5CXS1ZikgvSVMkd7nc28zs3L7vO6frzY96b1XdZ5a700MazvsMvjnndFdXV9c59fTzXqoaSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiYOgb3YDEofxym++cu0YD7+XC393wfR7iOn9zHgfM98kxgmYAWYGM1AZYBCYibkyVTAAQm27iSuIGdzKMWoFmInAQAXADOYKkvKoDGIwcyWqjLaRGZWJOBwDZqpM7RzM7fxo52IGgdvFVH2F1AUQtD3cfoikp0H7j2WTVNN+rMyy7/Bvl7WCd/z7ZlB3rNYlr4vVXgK4DaYXifhLDP5HXMuvXSvnv0A/81P33mE7Ek8YSYD/jOGV33zl2snZxY/zjn+CmX+QCp5FZVBtTADUNgxrIxAI0QhhBSKTCqt8Ft4QogRxFS5pZNaIqNpnMMsxVU7Z2kBc2/msLiEwJbhAqK0+OKFpGda2tw/MYbtsJtum9YZ6wssi+FE73wYOjo7AhY/gWdn7GgGfYvD/enW7+Xn69370wTqNS6yBJMB/RvD6C1/5wAb0M0D9E0B9D9fw5VQGAUzMPu5dlRFU1XFPbswgqswqoViItJFSJXBTdPIZqFKBERi7aoTU285L1Hi17YeWFbkWiVia2c4PALLfCZCglyXHNeZgJ09qZcgKkV4fAAKRikIQCEwj/zEDZFWwiDtiaRgJVbWaaThUrp2IWsOJwa0maSa1BmpT5Riu5IQt0pbpq0z477GZ/tz1P/XHXnn7v5LE2kgC/CbjpZdeunJ6l/8T2vJ/QOATs/CYQUSMCkKtjFrBU21ENakyE5JTM1hVWa3Um8doA7I2BiVRjFzbICXmVn8Vu7LWJsBq5RIUoZ6TGODalCGM/KTdtToBQkmxEilPyjlIlZ8pRwCVG5sp8YKdzpRYlWnaRmcuBck5pJzZrFKv7jCrW2sgHQrhJEwmSZlA1FolTNjYV0iTqVDbs90AmwIcbYDNplU5TUAFNYomEPM9Yvz5s+PNn0lF+M1FEuA3EW98/sV/vRT6L4j5/azmKACAGRMTTxPzfgLvK6FWYKpspFHVhMXwnknMVrbtlQm1MjFsHzlRsqlJe61aT9vn+4lq8/PpdlV5Wo/4/kgIi1URyvURVW5yjkUWRbNYVZ33hRC0GcuDEvSXzhJtglgpjUdl50pwZsjKW2PFJhDRPI592cjEUje1GqgUwtGGcbwFnRyDzo5BR9t2U5hEGRIA8Iubiv/o7N//8Z97jJ9R4jGQBPhNADPTG1/4yn+3KfQnwaQmWjOt9nvi3cQ8TeDJVRkpKajK4/AXCMqUX2UxWTEQHYQw5bXWUF8rKyQXydPqlCCIBV5YzGEwN2WK2BbA2gM4iQpDBaIzmrLrsW2Iig9km1g1XejY7oPIt8VvQGIu5mk0y1nUHfHBYyEmue8nUms+mrtyHQTgaAu6coJy9Qx0dty6Yz8pawKgv3T1tV/5d+hP/+m6cLbEE0QS4DcYr37pS+/b1O3fLOBPNNOySZU6VfBuh7rbgyu3MaWkBAZNqqwA4hpMWzVNMRBji+gKKY5KzgiVRyUY9vkxaj5LsMPJT1SdOPjMb8dDW9olqEnexE+1sizRauWRkQCZtT8AuDxDpwIbb72t74KEJMWjx1HTjQTa74NZzNJCdRBC61Jzm0DQmxltN0RXT7ncuAqcHgH7Sc1+oNZfKtvtj1/5Uz/64tu6iMRjoXyzG/D/J7z5+a98x5Y3v1qAT4iFxwBQd3tM5xeouz2au2rIwHD7jEnUlFiYxC3thLryehg7WVgZcwMGgtLDoo3XzFjTNlKG5ANp68kaiL4eg9ml83Jegokse2aIQqgqG8ITpBwUslLIGZDCH4b3UjF5UylcpNUQG0vja3+ZTUkGodpOKeKXNhvQ8bb13Zv3MX31DfCt+0ApwHYjFkD5ZK31V87/27/1USS+YUgC/Abh9m9/7cN1Uz5NTM8xM4sKounyEtPFpZCPs08kMlFk5Ns0Khw88ToEGZYTqKrJFJRLKLfY2jm0YqLKWpTh//fc41qsJ6xWK/VSrBNR1n4scHYk+MguQ7GBZ9iKCSsrSesFeK/Gi2ik2jWOtA/COYVkTSXqseFiqKu4eVphZUlVIZqbo/kCqb56B/XlW4SpMh1tRY7zc/t9/fSd/+pvfDsS3xAkAX4D8PLnXn4OqJ9m4CbAXFqkkvcXl8z7CU3ydUos+s+c24T3tFzzv4Wh3VEDu5lIdkBQd64InRsllmv7tDpWEuR+W2DlYDsK7eon0v+ajuNF4SgfiY18OrKOJKNcZSSk1NeIaSCn4OeLB/eIhO3izs1eN5GB4POT8k2KthfqK6eumtZQolIYRxvi++c8vfg66vklcLTVtjy9Yf6/7/43f+25WTMTqyMJ8BuA4239FBjPkmiuOlWaLi6b/81HDA0kMhNshBZVVfOXTOTAAwpd4MAjslFQmlGsxKZE6XJuIDA9T9BVnaILFxvnUARqZKchjvwRFSQpW/dSLZ5Ama7z9jG7WA1bg2LTiPBoulq1vLTdlNsYELGvAz2P81CIrLM019HvTATG0QbY7VG/+gb4/IJwtNUyz9K0+dSsmYnVkQT4hPHGF1/+ywX4mGTsgSem/cUO8hHGVEYXgcQafNSymoliKs7MUx3vWlVjSic4ILKhKBaOpzJ+GprVSTwOIqhTkFKQ0Ss2DsLLlG374OfXNnGsCTEXkPxoq6Kl5+mJWvlQgRGY1D5c6zIYkd377Q7qKqBAouqbdMVIfhvp62jpMbWifvUN4OIS2G6lXP3YvT/3N372UBsT6yAJ8AnitS++9BOF+N8yCqlMdbeTCKFulP9saDeoh0o9SS3Ywa7W7OCo/AjQMsy9svKiqkuIGeZyc9IMF6AKLhKtaTTum9EqJzumryVGUyx2MTuhBIZHsghdNZB9yyg0P1072D7HY+c4nCITTOvBnNYzs85CbNuHexbL5BIX49xfiFyl+RS2W2Binl6+DUwTYVs05fGnL/783/yxg5eQeGwkAT4hvPDCCycbor+kQVuAUS93LR1C9VMN6kkDHV3AQywoVgYKAQInn7CtZ0diH6wKC2CwH0B9XdypOndAMljiLvH8M7tPL9eupdsTlWMTqI3crX1a1miSWKedjWeh8L6XbapkD+fy0aICdJ9hd4ntCFYS7InRzWxvG3HXLh6JmLQHrI/paAtc7lFfvdOupDTf4g71Z/kv/IWjQ9eReDwkAT4hPH189T8l5hvq5Kq7CXWqHpudK61FIwnjaAwRkXlp9v3tM/m8Wx4r89hv4C3qCKt73wIPfmiwpoeLmaWyqBhjHfaNSCja3F4Pa96La1Dlt24WiNQkOTLRz0fseXldQ6yKg8y4ADJV6HXyjEB7sg0yMpx+mcht4/EGfO+c+M2HrOkxzLhx/+Ldf+ZtNDfxNnDYQki8Y7z6mVevH53tX2fmIwCMythfXEIkD+kvG1UGUUskbo5yUU39zA9PGu6SjGVhgraIAYZZHVLHxJaAHJOhdZEDT3qu/nlMoA5liNGdg5nDzBHAFgEwH6WeL7Qf8NeqgpB1yavOZwnxAXa2dSTp5dsGegXIFGd9jHATe578bOcM23jh/dJ+QCPGniit5wntMUsYRKCpAgUo731XyxGcajOnN/X5XEBhfaQCfAKg091/DOYjU3/7PboIawwS6NpSor5IdrL78rRcJEEKJCDkF0xdKcfRlGbXLzI3l6wMh/1OUuzHKhmpY8uHeBe0cObqFJ0VtVKaERN2kk8KHCjEZmh05Ad4wjjFavw4E4wz8usTm/2KehXXB1T82LlqmJvTPXmGvPPwuZWj5jDUlmwKeDeh3rlPKNQ6mBmb/eY/nJ028dhIAlwZzLzdAj/TzDPiOlXUfY0FEIdzIDmXOJEFOlOXAQ9ijDwTjhdfldbOoWIJDMMcb4FsMTuXjdiO1/xiAq8P8QkneLJzhv12fYOt6D5K2cjO8YZxzar+zOhJ0HZRPEsLS8/nz/VBj8Gshd4+wsnsPDEBfKHOxnOj2Sz16MXK7u0GfO8hcH4JlAICYeL676YvcH0kAa6M17740k8y+IY5repkhBQUGnefAWe1njyC6gN07rBrpxBoiH9yhpAvEqa1sQVONU3GIxvWPk+U1i0jTGEObe3K+LvIgFHiWR2Vm+Lqs0tGAuoYo61zOC8+98/B8nA6kQwPaETFRrPt/eyWeWcAvencK84QahrzOykGqSShEygEVOZ67xwokkJIuHl5+b4/tnjqxDtGEuDK2DD+NQCN0SqDJ1bzjgbTVT97GkVQalyDycgaKVWSDPbUEBQhPwCArPenVOhCVCnEbbFYbyBKNcnDFA0jLQKx5xlGmNHau8QWvHAEMIJAntcXeKWRP0XTt3E3hcO7YwkDecUWSkeEoEgfIIn3orcyo1udYy6gk9ssAzsuiR2pVcttCvjhBXi3B5XChIIL7P6N8ToSj4ckwBXx0ksvXQHRD+kPvU61LTrqEVMZZ/Ze2G6YT9oKRUVnqim4CXX0Rz1FapMywxYhNfUIJlSQVoJYdStnLkgdlh0xRzUaAxpGdhxWqDkc1eYgeAEARRsyz7sL6oyF/5whlVwolo+mq2dTyi2hU3FqDjv5edCkV5FL6TS9+TwwvaVvLten33dIoeHBsicCdnvC+WVbYLVd+w/xf/lXz+ZtSbxTJAGuiLPz/ScJfANAG+jTRGCXVD1ZCdhKu0KswU3Okv+n0VR9380ok88MCfgytXJatbIbnJn0vJ367FpnFpnv6cl4uA4/nyo/I1Uey+ohNG73oqR3CRobBehCU24RU0d60HbGI4WjuGu+E+yh3L5RPY7EqOsHRtB40ABP0jbJGVtFsPAxn+/8OS4oT907ou99ZNWJt4UkwDVRyu8z2STP2CD9ZZtfzRUUadoJ0H7sXeQWYE2TaeWjH7GnLFWUYpuOBDUoLt2natFy+zrCjD69noH8VcnNOd5dbTG5WaIHeqC2z9oZlwF1jeZpMcZRkPUQ2+oszV/YMQfzAZPXSYmUboR7RnUWT+b5hNomWiTY3o/Y79djxpkp7Iv4LARjADT/324PSGpM+5LL98yvLfFOkQS4IrjidwMt15ns8Y9GKO2DcYURBohlJRGVJ0qQ3ayNqMasTgluUCfjdL+nuAQ2Y7ZHUaJrEKStQjgjhQaTNzRt0I1qdBOIaCBjVaSm2mbqz2rRuvrNehDzkBmj5TR40VfZBy+87jg/eB556XtUSTWuIB3rG+vv1xqM5eLxkClzeogKPytJBOwmwjTBnvxUt78LidWQBLgiCPiwcA1HkpnDVZ/KLu4UHvdFI2maD06P7zQhxf1GppA4RvA1Uqibex+kOtnICwxtQO+39/N7JdwtuSVn1JNSICqJ/sZzjcQVJZ31nHkM2Z2Etr+PyIYL63x2y0rR4WXmSjBedntlEdPz9Jm43z9rnZ4GKD8d58BChMptybTStm6ofuuj2px4e0gCXBEEft4GaszRGwMHMYBgZMUcyYTNXLaNMTGa4rHhyWq9z469MnUOmorTJ8CZELQ2OuMdIHAZrId8e7qd48Y5qQe60gBF1/beZJQP4VlEHO4fVvGM0ILi6hQcD8f0am9Opv2VLgdFaNjnJrBun6fcWHlS9Udd74GZMFU7gAm5TuCK2L51kcTXC2bclNHTOMLFSbOo4rDh2Rsjhjg7g7mZyN1ot8dgypQ2Dg8qasEUO5hMHwaJV2WI1S4aHEmZuoTkaF5LuWDa9vsQjovHu7oZWcs6yO1Kpu1HP8ibb3mOylNXWmLw+SX41l1Mr95GffkW6ut3G58EezjUtXCGg3Su10Ee1FiqZ1nZAb40GA/7leDGr91loNdpRB0cpPIdst2sWoNuLF5G4h0hCXBNVJwySdijU3lsQ2Rxu722TGfxP/nKML5MvE+JDQQT/YbwdQLtFJ0JC54PQk974a4+q0DfCtF2vAA93htkQ7jnHG+nUMvwDDQGUK6d4fSHvgvl/c8SagVf7gEwyvUz4P3PYktE/PAC9dXbmL70Kk+//TLqrXuIBLVEhiNzte2RPA+vHIOF/dJZj5xj/NYIdUpDzIRmiN9PboDQHwUyDWZFJAGuCZYV7Yjk7h7oysnM6IVFabVXI7lBYWndKg/hJBqJ1MgV+t4XQQjlZB5wqCO0PrAlg4c22TssbHMRJNsJcl2dUjzUbY1I6OwIp3/ke6jcuAa+fa/tK2L17ibg4WXr223B9oPPYfuR9xHf+w5ML76O6Z98hXcv6APVPFEbZhYvLYY6J72loEZ89eNtXZygDPv3c3Kcb2urvboZrC/9cdZOXxUisQqSAFcFx+HOLoBsoyotMju3nx3iv3xZ6SUoNRWHLuJE7QVlZqQahF4kJVURotx0DHNP2HACC+ZvCzd7vt9A8DHDo52KZDZMVKuqcqgaTYoPkOn0+z6OcuMa6q27ABGoDC49NQsnRr33sG062mL7Oz6A7Xd+kLYvvY79Z77M+3/8T5n3+1kyMkzxjb7AkdA8xKL7+nIxguwR4r6pkejiuf1SWNoi36+RcqcCwWBUm2PyVjo18faQBLgiSO7nRoTdwGc1CblTbCpHRJG5Pw9ROUo9jLb0lW8Lrjqf9sasJKMkGnMMWdkThN4MZXTt7lRoUK5WOrZNy4Sq2tJfZAzIAPmk5L6qzXNP8+Zbnqd65z6ISNgTlrUXe9k0GRF4P4Fv3QNKweb5p7H50HN09N0fwf7Xv8CXv/wCWUsWgxmhpf4djh5PM3f79zHxupEgGXn1VLVUZ7wSrYfCe9YC+h+N8woTayAJcEWEOAX5jI2gwuJvfpF4OPjflDDZXrpjZYVmU3vOkSSSRCWj7pRAzMA9ag6GmSeuNsHdOn2RHed0EpVMmBrh5ZfMYRaHweb9z8oiABXiR7V7gCXLzchQIJRT7z4A7hHKjas4+UOfpO3HvxWXv/AZ7D/z5YWDzA8YghhLBNM/T2RUdfNyWtbN3VFlxp4JMlq4PprD8aa5eAmJx0SmwawK5YhOGblImyk6PcQ9O74OIPoROfr94jm9IlOA3ZDWRQ1Yx1U4R1NyM2JSsmxkOkg7jTbbNVu7dBsBcaEF5z8GiKsu3uykWK6dwtI9Wj8scl2DnkZFmD5vUqq99xD19TdRnn8aZz/+B3H2E99P5eY1a7PW22vQR2K0xdnJTPyXVtCVYa8il1JgZqdZUIrkO+cNSTwmUgGuCXY7dCaOOKScKDkZWcIGsyxN1QcwIglChonqAvZTxLKkh8sSWrL0VWtjd/7heKgZ3su04CeEnZn7K3XTnWAzPYTgSXpHLqztU6fkEkhod3HEyw6i7qMV18cN3bkP3hZsf+eHsPnQu+ni7/8G737lhVldjYfVR7eU7vIo6pmnucg7nQE4aOE+UMKBMKMabOk9w6rR7hhMrIRUgCuCesLq1+qDvkSxZYTGCLswZKqgLXsfEqFN2VksZVSKEsW1SijOQ47RZFVwcFVoXDKayyPp+t6eHajVoaPVTF8lcLt6J8n65gNqcwipq2cZgwLs+nQoUxn19TvAdoPTf/V76ewnf4Bw7VSPs4CHt2d83KXunydZ0/DalyHmjuiWLqslMuq2niDZBHvb1bwab7XMQuLtIQlwVYg12SK4kSbIiQZB9YX3tn3YYcEHC4yYmGxqTsUd29qCsSndWuyRgBXV6nLSZQBcmQN3mbncSUaE98Nn7oev7YmLJEQq3Rbd1kjHyfLrQBSmC5sLgR+co77+JrYf/1Zc/ZP/Cm0//F49WzhkHijxK5upwtl0uHmZpfYv5Q16XcOqNtzXmuS3NpIAV8Sie676iivqf3NiCYQntqodF//6IRlnfQBoJBgTlMnNVSc0mMka+FWc7GzDzVN34uiebRvaOTLPfIQvdE4AAeXqmUavrYrDw33e0e3C6XAZMcLrK7dBV09w9m/+CB1/73cu1hZ9daPyi+ptab9um3P/snTjQMJzRRnqYOr6J7EOkgDXRFBzau6KaWNxBO5IZlR/eqCSIvq/yIaMhYCJqb0WibWACA/1steicQ7oel0aeAQ60hKz+qAA1DbFgR7N/0DGbcTHcvFculbo3AJ/ewJoKKwVFUK98wD84AKnP/p9dPIvf5IWSh8kxX773GTujz+ccB3PGclS/3oS9vUp6EBdiXeGJMBV0f+USaxWCw7InE5isD3q0lSgcdCcDAeT2UxewExK9tOCEddjYsB9bUPCsqXauOBqnzrfmJJWcCLq8QiflUi6lBwO27nGFB1vr7zveWRJMR4Y+oefkXQAhcAXO9TX7uDkX/zdOPvj3x9M0FG1Ud+dth3oAxe+3X2Gc/Pa29zfLEbFOZxPFDr3N5jEYyMJcE2MpiF7YITVvaWRVpM60GfwKhn1ik4K2YNDpBLJ/xPCGeY2cEgONKWnRKj1V6AbY066BMlCCaMwEtsBcnJSU8aUE/ozRAJbzp44OZeWEoA4SHwWC+k/zhrmOyMfATxV1K/dwtEnvgNnf/wHKJIZSSvnp3RSHGq08u3SH63U2MqP5HoACw/jTDw+kgDXRlBrHNRcmN0h5RAKgQMBiRITH14NY7elp1AYPkZ+IQJNNqLin9inkRWtHR1JwuoOUZdo+ka/4qDienWiJD9GUrQ9HDnrwNN2eTi0hytuMydn9USWjEalJFszCwl+FKc/+QNa2BS2kLAdzUHdPYKSzAH71rQVp9NFcl2IOicJro4kwCeCwDxx4FraSiAFJx0lQeUdS1BukdwaKtHjjECdbGEThH0eb2zGGAgJytKb0QI1vTQZ3nBkFBuwXRJ2p926lV+6TukfGIVAGgNpzY6VSDMFMc1L6nQBrvQ8OHL0ez+K0x/7AzSPDo9njmkzS0GSPkL8iGBOMJlHc7mP/epyjol1kQS4NsYUl7ZR7aJu3m+nqkTUaXEnBie5rt5ZegtCGSUjq6st0R/t0/lY6pSd2cqqUL3d0YfoZH24Q/rXOMwP6LrGe2KEqk5c8JahMujsBHTtzJr3yCYc2twYBvX1N3H8vd+Jkx/6rq5MPFwJzncPRNXedb7B/vTR7zf6EA8HVFL7PRkkAa4Iqmy3fp16BmDgHQ6E52pJygmhVJEyZGaY2JM2NxfxsPAgJa+HtQ201A6AKegMsjVUofOLg0U8hmPD+pwkKR/qk1yKlaI7lCNthMLjMdwz5AK70ckRdr/4Wd791pdQnrkOOjteZsGvhz2IgKmi3r6Hkz/0Cdp+7FsWD9Xu6itmIszM/4Xjl8ss7Vs4XG9QKQNXRBLguiDTDBw+D0rQGMUVnOf1jU9/0yCKms6S+ByI09VeDdN2fddwrnYeDZ7otDcLpvSNH66rbyt37K3NlTzHuLXOB3eoLZxjuVDbS7MSdOUE+89/FZf/+y/zxd/5FcZ+QnnmKTl2UeU+GkTA5R788AJnP/WDtHnmWrBLbe5zNHttuXsOK8EcIDM0hXcoWdoDK0Fi28fwpaQYXBFJgCuiz08WkmhLuZk/blwhYOG1j7ZGG4wDq0o6DPThS+Y/DITbkWF4s2SG+iEhamAUF/yOaPTG+jzyvsLRrOWQ3sK2zssShu0LgnCGyig3r4LBtPu1z9HD/+lTmL7wEsqzN4Djba8G30pfSWNRCHz3IejoCKc/9UO6Y4jqWlBk0Jv9vN7DROj74tcLIdH4ub+BJtZGEuDKsERiWShAw3tBGGpGi4wR2bE41xfQQ23aGAPNRO7Ipg84KinxwuBRGy768mosj+5vcSW7+Gx10qaEPrC2tqWuvZ3BSwYzzaXtbzHKFyzr1hXWBVxv38PD/+Uf8MX/+Wugq6egq6dAHdbdn/fFHJuC+vodbD70HE5+5LvRR2ZnC31Z85aq/np4vMdC+gxlEsyTQhLgitBoHXwdt+Cfi2ouKMFOD/LwtjdbY1S31WH1eXqLkkpUbFIkRpzFz+erjgo5+xosjxqqoe2RiKMa1MPtgWZhiX0EAh1EkKandIzySNboFyAAgMt/+P/y+V//h23LjavAxLM63pJQqCnBk3/p99DmPc/gUGQ4NHGBpA6VHxXloel2UkcUhY/g88TbRxLgirBnAeuMi/hMDCUtTWMB0Px9YTUXM2V9vTwANgvAttnbSIi6rwsskm3jsN/JkCN/kX+ez+3V5/yGNJfhvH1fzAb1fDFQCGlovNevCWELBvX31kKRAOxfeJEf/o9/l/n+Bcoz12dK8K2VGMCXO4AIJ3/ke8zv9yib9tF1jkTdf/Z+ULY7EDDJEbsqsjtXBGlI1BgqKre4WeMNsnWmnIIzMQRFNEYhbNaWyNJjQnDDEqNbVfGRmrRAbF3sw8x1299doqjDsH0INkSfn/RKs6TD0lfw0a1X2ZnwndD1asKbLjjaKbMoMadX7+Dhz/1d1HsPUZ6ek+AMFFvVPtdb97D9yPtw9F0f6ep/NA75/uZqNbabu+3RFaj+1kcwhGYAACAASURBVPkXkng8JAGuibg2H3f/awGIKlSi6WZfROLp01c4Hq98qZFbYxYa6xoloub0qQUrzwuhxskhYm3no5D31zcCIQnEiLVTb4ww2255JU+ObDZjjUct7tKV81edzuZdd/t+U4Lnl80crt72GUstaThmYD/h5Ie/G7SJw2U+j3cMfASnLB1axODwMWF7/J3U9AauiSTAFcHqiuvkSkc+QOSvGK0136GWlRgDi1kqMiqaxc6PRrqxLqDbrucW64uVLVz5sas75zYCuwrVunsR6BcSnokc0AVw2ht7iJ05SGNQZhBi6A8e3vcCdNzEYOJb93D+V/8eUyHQlROohX+QU4dFWevdByjP3cTRJz46U3DROncF1y90Crs19aavE+e8rniOUPehFifeIZIAV8Zgx7G89dw4JZwZKUAJbCGa2xVoayHoiOjSTIa6Gq/RnCKUeGdWpj6KwxmCreQgTrTu+UmHLSTt1PddQVb+jHuWuG4pxNAKhOv3ObyhFDOA/Uuv4/xv/T9M18+ATVlWe4/CVHH8+z/WHtw0a95SnmMfPw/srp1PQxcfYrew/ZG0nXgHSAJcGVG8xd9rbwLy4gBUphJhFvxybHl/Kh/hUdVmRy6Rxpxcg+lnKYPRbI+SFQcHm5rSI+cKSTJAav7GCIu9N70YPrH12uDim518eHd4Du2I3W98Ebtf+GxLll4iwIMCi5of8T1P4+jj33qw2Nys7smZQpm5SRwTqftKrEQmw6yOJMAngdktPZilvl9NymD2qm/QZ2r05RHJg/U4nZLr8RdVjWKTyzYaxIRIs6C/jAgJlowyWGGza/Xmdm1vp7V6gzH3lqN4kfP44N5gSvosjUNkdP53fpnrK7dRrl9ZuJZHNEh8h0ef+OjC7BBbBmto0xjt9Uux7+sRgZHxSnMxhPWRBLgmBk0U5r2aHw+9CBNzU7ks+AW7Sht0dJsRFXdZCg2PZKHpOH6QmaNtGJrUBHwsazqPnxqHGWJpu/oDu6ZSXAfQScBbG1d2CVfwlnD/WVypxdpO1mv7PV387V8ETo6+TkVF9sL3z7H9yPtQnn8asc6RyEZfnpNhV6OowkfmFsZ3Sw8TSTwmkgDXRf+b5WGfmsc2Zy6YhJ35qeVgWioEe1k+a0FCN60DgHOlmavh/1YgUBPH+ccjK7G0fDb4AmcuMKCqP5ZZYToH7iBVhlO18r4Nw7uFc/lVtS3hXAwMZvL+81/l/We+BHr62rKq6rYZdYN3e2BTcPSxD+m+g2LV73LdUrVvcSWLML6cdUnisZEEuCb00b8ch0FTddSnk8j44PH4RaFFAEqrKOgROSHrQnw60pQDEEg2qr4BJP6oWTqOs1s/0K3+PktFLeDWDjIpqySuaTuDqFuybJsPdKETFqDqK/I22aID8+RlJabLv/frjP0E2m6WK+5b1y5Q0tq3H/0ARX9jVJ6HOGq5+aOo88UU+vKjlySxFpIAV4SqLJEf+pjKpTu2+ub6VVOiqelmrvFesEpnk0B8mllPkfbBUlgQ6mZabB3CWJba+11j/U0g9VpOi1FYXiEGBWLlo1ReugyanxM9+cwV1tw3p/PK6su3sP/ci6CnroRrGrllfp/i8wtsPvAsNs/dxBKUo8b72NhtfqY+XWYs39U62taJx0YS4Iqg8D/mWm6UWPLGJRK5pUoumGRTF8EdTmTqjtWdN0xls0EmbslWjvoBt2DJKsP2gZrezzi7Oo6MxnMn/8AFIbFwub5Hbhv65JGIJMMAdr/6OZHXMz26CAaA3QRsN9h8+L1D3aNqA5ZN5DEPcOazBB7hF0ysiyTANVE1b/hQfhwfJg938PiT09SIdKtWRosHS1qCoZiVo5Q6bDbOjCmaW8h6Vuo++oGaf01B+jWUrqQvndUTgilWGlseWjJngrkY7Vo17BtIvgtY7D/3IurLt9pCqosnY8y7pWHzwXcv+v+W0JvgUZUukaYf06lfV+tJjisiCXBF2NNbmyfQn8mhsBE4d6mFGaDMC2PGjLGYg2dpgCHfLuwOEzS6Rlj9y+75wWUWVZv747VBTaqOSnJmq3Koy3rArVwey4OXWKdrg12NVfooQoxkY+2t4OnzL4GunIa+OFyDfaqMzfNPQyM77dzjcvYe4T0gccknL/YRZb0Wd+8ygipMH+CKSAJcEd2gVZ4ZHi/pBDUeG1UiIuUMfiGjDpof/vWIg5FA1GUpC7dqXa4+nafceIsJMt5EveKFNQfYm69s3WfzfN16akZzjG4GyNzPqKZmfzsSFfiFrzLvJ6CUBR9gX5F9Q5c70LueQnn2Keuq3rfXL3clnSr97LmDS2eL7YvPZU7h92SQBLgmdEmA/rcq42MwJW049gqRl0bhwm+f/FyjqdoruOEUQFSZznfURtxoGptdjjFgorTptOfH6a+q0zRdzbZMGOnmtxrfS+o5XpFFfefEMiqwSDLTi6+jvnG3X0F6/ArGCvcT6OQI5V03Fpu57NfrfX59O7oafCGHxfMnEa6JJMB1Qb18GyxDLRKLL1fg4O59oAD5fzbERgd6y50OPjViUgJanNDbKlLqM1JcGMs8o8q+SNgWF/7TpBtCuFmMa+U/Wh4dwFLUd34oBRXG55eor9wGnR6Hg+Yn6pKmZX9513XdQMFktW3ehkbMes0L3zqPxzih+yEL97LEYyIJcE3IL9Rk0zDq7B2AkNMQmHFJ6o11aIg3yCsGhcWzhkFEHl4eTqQqkF1CBZ60Ri6ZhgwQiEaynZdtDkLz04mWDKsmukW/uAJoJzTfAmMrI9l0TIL+4UT19TeHpa7mWEqYLjeuyg3JPbgDi89uRpEo3VzW13EqnBZXh8ownTHx2EgCXBXBZeOray4XcoIMIqWREWEWCBniKUNUIxKRPXZ9eaBQoJZxGhZ1tEP0iMBAR8vsPEXS1pHMTXJJi1kH8pJpGonLL5n8LAcwN3V7c9L/1GfYmlVv3eWlp86NDZsRrMwn9vNGX6STIQ3EqEna/ZXMbybqj+hPnxpwTSQBronReD3osxrKdpN6TRi1nL0+HGo1ypsujtu5/zVAORqpxizD8OtnDEv7hzVm1MLulj/1KAi1HCC9CFIy1/m97q+0Aw6YjFhSnUs+xfB22d/mGxvh6faoAvnOg7b8fTkwHDonQth85aQ773zZf5+Sx3ZeKz3zk1D4HNst7oNcC+EJIAlwTbhsCTz2yJLyiZa3Q0kF6kMT4lmcOzHUP2hGU4ZtN/t8MfEHDlos2o69LT+ImZ7ozb/YLSrKdk751wQXd/zOWmH7pPS61CvD9ZKdZFYi3Fp4SWUBAD84B1/ul0nXCi1Y+6fHUJJ1Mz+uABPPN0an451Nt/Rlwod2hYSFrzrxOEgCXBVucYlO8p/rmBNIRDEyoKXaPi0jCnCgy/FFh5L9TxQISK1OqGXc8gqJVBItBJ5lD1l9WGgrBoXoJnC7unix8n83E2SYE6F+wQPUvrx+IuiQrT8sjbW0z76six2wnx5NgBi4pzJwtAnbl+cFBwG+xNrSlmXPHseXYaZjYh0kAa6KYV5nZ352TqaBDQ/8rnUEUcdmoV6xcqVckHiROWZnmNu6g6Gspu5ymwaTzd812jQiICrkvsxeNy651RZHuFHD15kdxAtvezte94Wi+wmY6qPJZXyke61hIQX93vsosH7J/uUtxnnC/mXFqOdPrI8kwCcA+9EzkZDXjPCWjjEhFKSDcAW34Un2oM1IpzaQKJCuPmBX1RsNQ2rQRjw/sSx/EgjM6iYnMTLzz4IhMTpMZeSkTsCqX3F5dNOhTgvtFiFHTVGzC2tG+xzaTvMa2vekPgY88lua7TICVNKP5i+A4AM8XLUkaFNbOMzEdpj+A4v+pwW8NpIAnwyUNOQ3K2xD/e7+rbKVkkRvwkZys7XyjF+H8v15OsZp5rH43uSU1IiC2UjT2qO8OG+wD1Spo3EoW+lIroFV2zDv9lOnltn/D7zUj/zAqdoXrGvlqBehdWXnSxvea028n9ojMx8ZCR6op5SmHOdLV0ny3tzn6ArvkNkObfN8rdbFDPnE4yIJcG3MPF8Id/FuBwVeiITZV0TdFiMXZQzGKF6EXKhTEHq+4YSxTiWiwIDkRex45emOwLQaTyWk4kOWwsUQiHWR1I5cB8OaYNnas35YhF/QEFblMAduYZYFAH5wgXr7XlsUYWkx1BEMoFCbQTLz9y09mKltD806wIBMkh/Eo8u4/20k1kIS4IoIY6dfa8rhzNMHCSxu3E29cL5S7uGmoqwuM/aM3uZyx2MTSl4U6lRzVbY1c0yP0zqI4QrUVCLbH4Hll2TRZmsD2XJTngBMHLhSx3pH44uEZ22nWZHA4iIhraODq43Yes0ObGkm+89+men4yM+zdPrYDgC73/iiT6UZ+l63uUD3JXGZwncIvS2Uphh1ZmJ39/TXRy2hn3j7SAJcEdSbUPPBZqO+J7YZacXBRAjlKb6VZWBIOHNYL5rQVzT7prsVTDs73fNUpA5/DQHnkW3762FjbNE0hZoq7M7P4rRT4vRqllYNW5JEMkWCOtMXUetpf6m4klcj0baU7OUvvYDpxdfaE+OmaucYT8u1gq6fYXrxNex+9QXbv+iHtUOD4Av+TgsYyVwZ4u4HEz6Q3L7eSgYn3i6SAFdF8N/5cA7pJLoJB1UG7FYfyNKrbDU1h5v4AGU0R+JU+xFo37CdlzoVaGpNlWBfRwjMaB2NQKCpMyHAopcaL0HoiN19Ra09xfYyQXyPy70w973ptuFGoc3TB1EZu0fyYqVMZxOboDvt6eHP/33mhxcoz93sr4VgZm+5eQ187xwP/8qn7ElxzpNGw2y+QY1whGYAPKaYg0BmAJOZ1XE1GHVzPsJ/mHjb2H6zG/DPF4L8a/dvNhaxxUqgg1r2y+giKRSWP3USkOL26Fi2elx8BKloCxOGc1pF7XiNL8gWFyrE7ojXg8hoigdyl4NiNdRrNxJ5pmfjdtFUwFx7N1/ou6B043hfGvtCytZPHDgrGta9ZW452OFa6tdu4f5f/N/49I9+H20/8r6+ywT7z7+E87/2D7jevkfENCjNeIJwQwmnIZDNiFH1Ci9iX3AImCBavWn/roskwDURBhQhPPDG5AkHUtR9NsLmS6F2M2iVzNzYczIMRCRk6fMSApXB6/Gm+ghn4vbYSlMh3Bi6PRCo1bzdAEcbkK+f19pdK2M/gfcVuNiBamWusqZdbL+4R5UEUUWnDf49MEBFV1IdiG8pJ9AkHTl78Ehydtfx96RsT8xg1Nfu4OH/8Ld5850fxPbb3kPl5rXWC3fuY/+5l3j/T75i36+3hpjjdyvXEb7o7rsJU2BY+sJFYvfQF7t4PnDZicdEEuCK8LXfRe7YYJ6NQj2AQBQGTVdZIyQo/QRLUoYIFQKqUWIbgYV18pxzq5pNOgxFbZJXBqM4EnW4KVxOj0HXzphOj6icnoCOt8B2S3S0AUoBbagjLNQK7Ct4P4Evd+AHF8z3z8F37qO+eR/14QUpsRJKI87CQO27RyXcjLtD3yyKwb6rXXT1hjCo3+xxaPL/97/1Jew/8yX7buSLIiOsMMW5a1WntqVQmMXLfk7tbcb8thj7wpXg8Cbx+EgCXBGWF8fBr2Wr36H5vqoUZHD7zG41xqFqMQQxLYUKbSgCMnS0/mj3Qq1VsWml1koAVYJ4w4wIGM0wOznC5voVlBtXuFw9A50eE442zec41fDw9XZy3g+mbiHgZItydgxsrgKbDVGhRojnl+A793l67Q7q126h3rqn/RD8lAvKTvs1GorUcU1nh+v3wPrOp5CZzNVlrm09evvi7MrsECa5oYR52AjH6VpV8n5YKTuY3pGORxJj1+R2q4o1+cIJs0MTj4ckwFXhKSXtph5NWKczM3XdPye/frayw9Ifgz+JxFukbjkZI1UHi6k6Fpuwed0LgOomKYuzrTx9hs3N6yhPXUE5PWn0sZ/A08SYpm4k+qVGspLmTwxUAmNCF9otBDraorzvWdp86HnwxSXqG3cxfflVnr74NfBuD95PjSyjouxCdPZgEcxYRJILQ3e5KiOKDGLUFrRfXKRGI/nEzO6qo2CS+uk7mDpcnoEHFBAJ+Xa9qfqOBvmou0MwRp41kIbwikgCXBFKSQCaG05Um9NaMIuBnggbkSkRqokEFHEPVSCOD5TS/G6gGF+YtQhMzczkYFPKoNu86xo277qBcv2sVbLbcz2/dM+j+Z+sfYF4FbQwJMM2bdt+ajMuiECbgs17nsHm/c8S/84PYffZLzOOt21FloWqmujjMc0oXORAJoNSCl3jyZRWuTrmXOHNfY56FhORrVI9B5leD4f0Vm1PfuqZ6MzmuNyBS/neZk+sjCTAFdEZZfLXaEPDt+Q/c8DJyB4OZtVw/L0zM+kiyqo0jJDQjSJRfGBTDoWZKnnziLlcvYrtu29QeeoKg5n4cuJu+MFaE+SYRkHCCB0ddLR4cCBDeTNV8P2HrUlnJzj+fb+D+PwS/PACWFiZmfTYaApbF+sGJvGUhr1OhUFoxeNl+h4HLjOz1WP4avWrbhSWJHtKKcM7cK4qgYEso1pdprXRaGbzc6QNvCqSANeFEBmroWskReLvXvzBq6PLFhQNag0Qi429rGy0+AnrzAICoTIXPTsBLF4sgGm7wfb5Z2jz9LUWfbzY9SYtwdigI9TGfS0GTT3t+PHDq74fC5JdULvMi0tgV6QsOXPOcgp1VxBv0ihYOBdBrTXzkdESjN0ENrO2T72mcJJwKvsiNaXR1v9r37KIM+N7GqoIF+G2cd8nRnQSsw9fNPl+6upKrIQkwHURGKspEhjtiaWm+WFxTOgoMxJgQjHRIAQk/KPbq8ecubBW357JruORGSjEqIxy9QxH73sWdHLEfLkj1DaY3bQFYL6njsWiWumyCtu2QZJZkxEoAR0ZWtDATGm9PCwO75lpT7NPDAKqdbzwn19Qd+OIFBU36n9B9qrmU1r1GxuGap2x9EuNu2OQZswJ0AsaN+kvwUvE6TKJVZAEuCbcgc8EQvVAoU97gubasVtoGoU0wnKhAsgcqS4BugBUVQTJoc3ORaEW7VWSYWDzrqdw9PzTzZC63CkDhWGPSLjBxpUPrkZtLReTcAjH6JtRrAymsprO1B0XP9DsZTGfWy49VqKeAqV1yWaksE4hJFHQlK6ar+x8bPamqr2hkV5Xv828urp7+BAcg8rS3NXnQlT9Iu2ONLQhsRKSAFeGjDwPAjPamngcHXPyU/dEPflcEMxkH3sMcCFQhSQFgrvjAFApjMraAFEqjO27n8b22Rvg/R6YpiYnycaTDHk1H3XM9vNZA2MJDy2ptUEbfh2GGuspR/8exQJY2NFBs73jDcFX0JPr64LqpDKOIgE5+fWs1ym52bnn2+zWwH4az5dBiEC3z1FEyt1udolJfk8ISYArQsUUS8oslGh6XglByhJu7DyYxmFslebs45ZH2FfYjtWPehJGBbbvvontu55q0dXKAJUwDcvNLhdsFK1RdfZLOU1D4SD+InlbJX2ndNzVysWT6iKgi+RmUV8O0hP9uXSeSiAiaR+77RxEohr91PWDaGUK7fKk54VHrWvfR2I0PW3EFw4IbkI7YHbJRFFBgpUmtXIsRKgTj4UkwFVBPtBl0HEYa27JBIlhA5NgidEQAQdRhJr/1a/4zGrqSgWwfEAmbN91HdtnnwJf7MW0HlhgSbxo3o65usibIi0w002b7oGaMGx1W9gXB24gw3kXxmOGfu1UZ+hrJcoq5q5eWMfsyty99UrBJGWv0WbT0aiGtWKbyqY3PkurXp7g7GF8kNwj+6+jNTGo2MbK4brFpZFqcEUkAa4JW4sOQc3Zb14KFZiRFSxRmxJGgRmYufn0CkxXFICrxGWDT7yNoTYwy7UTbJ+9ybyTvLr+ucGmIpp0CqHkxtdtHEayLRR8V4AJk7mCQbRC9Xzd6/ygg50ZGtwX6/IBCTKPl6iERQSqKijup0+7zJXZOpF00L1n1cTRSNWmiDINdyQNWhiT2W2QLQvTOr/jSekrSXaa3ZUQrfGSEnBNJAGuiWifiDYgndTRBQVlmr6lz7rdaYVcrQgBENucWVsWpjZVUOXIAqbNBkfPPQOuE2T6sI5jbQX7hBOyQWlDb0ZYaA0REmIiUCmyGAJs8Jr6q415bKmoUek5X8Rr852zNvSm42KZJnzV+8nSF+1gBskMGJ0Q03pFFRdFDajv1JUQVboEmFtYJeg/gwYt2M1naQNxH8PSb364tpH8mOQGZSH1BTGaeCwkAa4JT3BVx3xzcxfILCbAfEGWq9eKex2toqbAmtzDjJy4De1awFwlSbrNhds+ewPYFPDljjQkCrfHbd5D8DVp5b15rfs3hWi70ZknbUbHxSXXfQ0LhwK0KW2lmOMt0dEWdNR+WrxrwRc38+J1DP03kmN8f4icm69VeXaYQcuufovIwSbJmCN7UVB7/iV15q+QHzri04UjhiDF+Jn17tLUd/BMhh16kW2BC2lv9B1SuH0l1kIS4Kpg/5FS+FHH6WhhSpsOR/WnM0AtYowWi2Q0m7cwUD2trRlU0Lm9UEVSTk9Rrp018itFdaZ7xMi89zYxDmI7ihCVMtQWQdgU4ss9T7fvot59CH5wQfXhJeNyB97tJD1ayJgZ2BCwPQIdb7F56gqXG9dQblylcu0MKAQ+vwzKEN4RXw86s3epiiCxtEcIIO5kHNoiNOSOWU1JrKwadtGFJ+zlkwl75prp1PnRQyRXCLnN8gkaVPaZpY7mCmzRau5vDonHRhLgmiDN7DV66bNaiG0RJbJVlVnNZeiUOQmWuMHUDDlVcSIIdHSQnWhz4xq4WiTYB5FOGtExxT7C3bpqkomOt0REqPfOsX/jDk93HhCfX4iCFSJmAJJ2Y0RD1Mjt4pL5/AK7O/eJvvQK09GWyzPXsX3vM9g8/zTR0RHqw4tmKpt5HMhtKXCiPjLbPJCA3WtUoRnjc1fPzBVB5gVAIZ1y2D7r9Rb79mwBV12mjFCM1JZpqR1P4Vcwg9587HcDmG+yPebTbqbta1rIkkm8YyQBronZT5N0YIlSIiGsClukxRxNpsKkHvkMCYQw/K+ymKRiyFWgXDlpy1fJggMNYqCZ88gtWxlSElRk0GYDOt5SvfcQ+1du8XTrXmtzFdFTmFFJZlk0C5IpNNtErw7WtoV3e/DLt3j/8hu0uXmNj77tvdh84FnCxG0a3Eh+UdEJibNX64Z7nDJsLgKOm+YqTo8NjtHonFN/IKP5DWemrT3TxHJvXEXGUEmJJ4yvoXGqPIM3gptKlyISri5q/FIMWSVWQhLgmhjUBQB4Wi2FAdpYgzrGE9VSqK2kLGMEXJg0QqyVNp+iz94ojM3VU3gl1iCrWzz/kjGsqkRatt0SlYL9127x7uU35Bm52lQSExe+nJbn34i2ZCfnYAxq7FiVU71zHxe/+gI2L7/Oxx//NirXr6Dee9i5B9+6f8O1qcq1pL+otqSJM7pgsSlBTUBb7jqHapnDTN/g2tAi7N+1fK+eaaMlyctJU+yGpxZAd3FyXoRZK+zft1aTiYCrIglwVVj0QMgpyhJNYhXe0VVB1NQKg1vn+xLApiZIpJ7WF+YK06aATo7bTBAaRhWMG2ApIS1y3Np0vAUYfPnlVzG9edcaICQHH/bS6gIGy2rOtmTegknKMH8nFfZEECJMX30D56/f45Pf/520edcN1LsPlskt1rf0PnwmCivuxPuQMlQ31xogYjbzXfuUneqo+Dao/8Gi9v3JXSn6/r6cEhfN2s/eIrkOj2a3G5aSOVTNJ1ZEPhVuZcjvXKkp/lF7Hqyu3NJcVr6NhvJof+IQZ0JL4ijDfiLQyTFou5H6EMmE5Tw+fU73FQJttwCILr/8Cqa7D8AoLfGC0KbW2fnQahB/lLYbVMj8nkTgIn9CFt5WWRwxft7tcP5//SbXW3db4MaFY7i22LFL5iT5eRtd9xMJQbpazJxESdwRFApYvwZbPBxnqm3hz8zXhWvQfWYyS6lGdGTzshmgLvVFfjdo331YOSKxFpIA14Qu7T4fCLKiixIQwT4XaonGwEBsRUdcG8qFmJRcSjc4uJwccahXzzeQqasI00JHW7r82huoDy7ABS0CXYiNUHSF5iIDshSwnrvINShJFvj5G3nKe7TnhxQf1G0wEzBVnH/6t5gv96CTI++v0HGjmYjxowdNlIitL5o1WRpplXDe2FcQdWabZCphaAMTeXBEtwH6hc7bqeSrZaTe9rnVtVRn933118dGnrNFGBOPgyTAJwKRbYF0AikSShiI+iMvrqQWyUv+qMjoIiKUwiiSf+eOfECjHB0ZwiOaREzHW57uPeT65gMVfnYMhb92fHESbMqvbS/UqTx5367PSFEykkM7qHj76vklXX7mt5lOj9DfOaIv1ce8WdylESjvJwp9aDKLAbLzWEd0VVK43n4isJRRYrT7UHeDgveZHhC/N+1njeTa59amXuWJSi+6v/0+3DwuzZXMcG5OrIL0Aa4KGSDt5872ECQLkUqKis1pZ91kjnvm2g1FoiIryTQjiSCKSyPLAGGzsVGhoQD7bBPBgsNeWGj/5n14hJnQHmNZwUTtcZXEkq6ibWnXw4VBHBdy6M7O4LboYVOs3AJBHB4TCskFamOdp6+8hvrtH2j+yBjF1j7qPofGVG6PBSDJeZQ2NHJhTYM2RReXNYiBF2ZuJj+rg1RmiGifMXT2Bns3DhFiY6YD7T0Eb4Qc7TmKaLNKvEiKv9WRBLgu4mwKeQ0/cB1UyoVySBtkbGanBIh92qrw3oERxaIKYSQbFlC1oIsrKaJCzNNEfLlrbSJIag3BAhy6DoMQAyraTPyik8EYpE+4q7E5BFBtOYLWpo4s5apaWQYTponrnXu8ff+zVKfaX2VU0TCF2xq33YCOj/SylNW0JxkxgMPsKUne8V2d6ptTMiQPOHVT7fRVqiVPj2nttBQZCmeZfXXDBiJd+KC7UTTZ5DOAiAAAIABJREFUCKaQJZVYD0mAa8Imqgey0sHprMc2Q6MvTk6Ssk/VIDUR1akMiFqwVAvy6XfteEl9JnhEWrZr3QDb1CvSsacqlvX0Otobd8TRaWk4cmnMEh0uQKkq//T6qRFjTNZjtIcFgTDVZs7bvgWyHzcVas8QiTcd03va/9odKqDbN2DvFCIJjZyVFJktidyVoKfOkKZSUmjAsPjE4nUs3c/IzQf7HZgbmPr2JVZBEuCqGH7Zphd0AA3TobqpCySCiAGbiN9kGFtOtNigci7ViuJLCg51qbLAlytRCSFFaFMYm9Lm6RYSApOFDDj40NTSLiLXGOCqbcSg/sJ1kSzQCqgQZVvyS6bcheYwTo6oyz8Ml7JIhkCbizxVMtKGUnSnumH0FYLEPQPxwU220gyIqXPAubTrVqtG8N15XWrz65FkaTam1O14VfDx2uPxaQeviCTAFaG3bBVfHNaM8rEnd3MW5ohqwQZKm69qZrAZzOzH62w5lqzegrZsluaTRFVk9auqAehoS3TllOtu7xzMbXaJ+vq8As8/ZAAyzxhcG8+ZsVldohJz518cxFZHJOXsGJunr4fHYsb29yawNcmDIF2ysYttmwAY+iB4BpqTUBpGepxNCB6sdrecTVjGAAhgx1kXByZVFRfa0svgeGG9ApUbXNiWAnBNJAE+KXR5W4xBBBB05WYz13SIjQplfAXayiQIA78C5QjgFkCQ6R5DPQqJujBje+MaprsP5AFJAIhJnkmC+PAlW6qfYcRIALiwPQm8fYYpSFOUZvoTYD7JXvUcffj9oLMTe1Tmo/tVXksBX+5Q759LtN3mTqs5y4F55VzawEHmLZ9IjGS2PD25uYi6i2KSIBl8rcL4XOfIWn5T4oXrJDd3WW6GzRJw7mdk4sa6SAJcEzYA5H/7MVMw+QZFoGYa4DwHPR625F88i5zLLL46VUsR1CyYQJrBDAab/JkmLmfHdPTsDd69dptsVRmQ8wQQ3guhFdZJItCLg6ghb76eX2eUaKOiFdjq3DxzHUcffi/xw4t4ddqf/TZR0ExA2W5a8vbDi+BPZS+E6A8FYItKULBeKfhGxymL1O5bGnGPnWunQFCcwVSNqj78GrydUQDaNUYz2OuVRqkbkGPNicdGEuC6oO6dD0y1S9lFEFQlLig/Ow4oPmerjV+ytQVZaXCqpjCCRgm+KBl0wodNQhLxfuLt09eJ9xPvb98llXAuT9okBGtwKcYrTETNx8eyxJTyOoFZFSOBa2mB2SoKSSPHzCjXznD6e7+DuFbwVEOeYt+VvUksXXu8Rb11NxLU0IfaGWaUK/d4IERP1viNXT1KWo0Jxmh7BgVpXCoXz7Ghs7JKvirO42+Fo1DsbhgW9papy28hkBNvD0mAK6P7fduPug1SjgNbHxHX5XXocZBlp9Q/ZE/9bpP0hRQhI6/uJ3BlUCk+PdeW1ZJmGWyMMhjEU8XRu28SbTa8e/1OK0Hg5s+TFebjOoYV4AICM1MhXcqw8V11OtE2oICZyU1qCaZs3vUUTn7XhwlHG/DDSyM/xD6SxsS2R207vXJbigpxi+M0RFAtK1r4TeVduC/Bb0JqdupW9c91sZMikaAgOanoMYzOk6HsTPE8fgndTTK82iXLDTImmz/abk+8TSQBronRUR9/ykI8NgFfCYG45dhFRz7gix1UjpEGmH1G8IUUwKi7HW3OToH9ZMrG8tFMWKgtqyKPW9JyrXz07A0qp8fYvXobfLljLuJnVOLTBzaJVescKtcW1Gq4bJNbQp6EUvj4W5+no295Tzt9R35D/3WCKOw7OQK/+QDTV98AYr8W8uxJe+6KVlSCGlxQWu34sNiUy3dEU9rub+REFlvbm+08a7xxHfVbol+w43zR8aTH5HqAayIJcEW4a19u7RRWr1R3k685FwWiD0KSwlpjsQN9mLGWFQ85M6bzHTZnZ+xWksc4NXfNBzx82Ap71N2ey7VTOjl7DtObD7C/fY/54jIs3U/QmS0eIJHDq2QDV1vmwa5Bl4AttKHNe2/y0fvfTZunrqKeX7YUnMVZHvpK8+0MlLMTXLzwFeZwfFCeFCWfd7QoOkmohO3UL04JLH6h+h0EhahfZk/R6D6PhO3fcbuZ9Xmgzsbd1Do9o+dG+s0msRaSAFdE+E3b4gfmXlIOCr4ny8MwDgg/dZ4RQxxwquDEviTmaeJ6ucPm5KgRQzieuoHKytQkuR6s0z54NzEVwvaZ67R56gpP9x5iuvcQ9cE5eDe16voASdOXOhNN1w6sZByxuXaG7c3r2DxzHeX6GWGqmO6fSxccUH7DhRv5A8339+Acu8+9JIsUwG8QwnuysDMr50l8Q+RqyIExn1wXQVZ3awyuBD1vU+Qi+bG/zAjKCdTMbxq+bCHgBeOWzRRX/p6XSbxzJAGuCDMI1VwxyhJWpPBR5aDHJlsVnUVlE7DaAV3G7cCQRNg/eEi+MkzXLjELATcFh8TpMPOBd3smItrevI7tzWvgyx3XhzvUi0vgcofpYk+037fgS5geQmXDdLxFOTpCuXKMcuWUypUT0HZLvNujPrzsTjlLcB7Jz4SbXQjKtVNc/NrnweeXoC7PT8VXn2xuboDGMM0vKg/isI7WiPpMCTJsAq77CbXhS1TUm8Sdmhep7Zc3+57GfjFWLuQFUgCuiiTAFSFSAlAiG0w4W2RYJ1KpBmSbWYWBBcx5FhQK3ISzmgEAtVaezi+wvXIK3k9htwz2OK40UVhVj/uw2Grc7due7ZY2N46wpauteK1ArS0KHAYtEbU1BtX3P1XwvoJ3FzJ2LVTqE/s7KhkHeP+5XD3FdOseLj/7lUAeoc+sq1wR6qIGzO4I6EI16qSM3xWHeiUWFG48euCCCRxJ1fo9EHQJ18zdkdqHpkDt+HCfsu8vsRaSAFfF8ICvgQD19+t2rFCCmo4KlsTpKB6GxQ180HMYKITdg3OU4yOU7cZIcMgjhB8o9agPsmcj318rsz5oXM5LRMCmeA6yoO52vYfMB65I3T4d3F9HaTP03XYDbAvOf+UFblPmSGt03mKQrT7t+gmN5XQhitBfrs7jdUu0dkhgtuhuiQoenUJH96UF4qPQ34KiE6hjt1ILfjn5gpjGrkkNuCKSANeE/oirfVDrygZTlzFssY6Ow6BqUAKZ8jxaiiM2EBbg5NhOcHn3AZ88fR3YFEK1CbkzvWJ1xGRsz9XhfszqfjmNzks+YAg6gUcJ55fNY95bR4ZjfQS6doaLf/Q5nl6/E2ZctMqEeUIHqtryW42BxQVABG4PedLLstT0MCEutqFXfN30NGv4Qm/0c7DjBbY+UqHazQf2F01/If+KE+shCXBFOH/FrQS1jJ0B/X8Gsc87dRNI9U0nP4gIFe4XdIXjKTVg5mnC5Z37dHLzmp/Yc9lEiGrq8jD42jiOI9ZNudaGIFAWSLU7MpK9vw2h8e5l5hOTbeXGVew+9yJffv4lIKafqDCW5Gz1/9n3YPxOnfAUDyBr+l40lbt29HwT7lbDFY/NVt04LFAxRONNmVOYD9yaIrY5gfVuylAOTqyJJMA1EROf9RkanbzTMaped1LLyRZBQFhDlEhW8GQicG2RSVu5ZVQDUW0R6n7Puzfv46g9KzgubGrqkZ3OhqqUxgNzxfbGcbhguc5aJEompgjOrLoldVMI5foV7H77azj/9S8EQgnKUSPuuqdFPZQw2JKj7VpYwiDmdIUFibrGc2h8VJDK/KIWu3nN8p6g3dtq93hz309NCds++z7Gb4WIxWOcU0FWRhLg2uDwzga9GWme+BJXgratPcHIqJD1BvQ4UQ5dirOSQG9y7i93xHfu8dFTV9u6eZOtQDOQn6SO6MlNSMUSmj4XTbjOAyev1AnUDgM5Gu8POxkAbTcoV05x+YWv8sVvfKE9MiCcwhZnEKFsJrXEu2UtHqJ4E1L/H2kr7ZDQ6ZotQ2E3eeaeLI0Y1beU6b/9zjSOfRQ6hvpzd75am0RSvIpC8/te4rGQBLgm1IIdFzgQO8wsMpsTrINBB6kZpMySIGPJ/y5j1Jbuk2ktwTear8STkODxU1dBR1vi/Z69qa1dsLXu4qCFiz4YOTI0t5tDOfTvowW5TILRcpwrmnJ2DJSCi9/6bb78wktBWcdOlgr0EcUMTdpujWwT/dzEV9t7rjTJ+x/taXmhiGpLCovK9opOo/kgWSHWbyxDknZHfmNnxf16uaXIajzNmhjuP4kVkAS4IsIwtREehoebYabUotXlrNFPdtJFZOLgYDWDNWIJV4BCDj7di+t+wsWtN+no+hXenJ4AtYKnyJ9mq9nRbevC/CxL7Yj01tlr9vnwklzoP6vy3RSUKyeo985x8dkv8fTqbSGIYHFC+pKlnfrQeL1RgJpvj8m71ySpb/fTD3a5J3QP30/XWVqjfd0k/deZqL3ipejr6wpJ8nb7GoV+C7S6NrdZ+yixKpIAVwSr3VeNAYKLr72yPbw8DjyWoWmroQJqAXcpHSK+yD52jxrSykJqBkw6MvPlnfvYXu6xvXpG5WgLrhNzDVpuaBZMRNm+MBMryrxe8jH3JGCpHNHa5f61nJ2CmbH78qu4+NxX2swTz9drEpSoPYdESbBya5PO4RUC4+5m4dfHEpomi7AvCarI96aEo2RVZnJ9bDM8WP9bqm7YHs9TxK3h3Sg7mQsDJKcjNfUTayEJcEWYKNK/btQLJCuCZLEXANDlRaIVKUwi5pc6wMXfhW59dVd8FE8a8gYDee7PLzBdXGJ75Yy3ZydUjjbgqTJP1dUGB5k3WGiRVGcKSU8/mpk0vOr7Uux5wPvX38Tll1/h6fZd0hAFAELL69PnkRA3K9OErxGhts2SWYKLwcWTzcNWMWfrx8wCItq/6ocIii+SWpen5xfI1hvUHaMmObuUtm+7+YzDXGUitLQduc0l+a2OJMC14Yqs0Q7pxFL4yItEEs1FExDqvJIqYYMijGAVD2STK+T4wAbWKJU7LTzA4N39B9g/POft2SltTo9RjrfNfzZV1nJ6dnS1LSqkziD0IDf5ZYZLpqNNmzGyn7B/7Q7vv3YLuzfebPxbiLnGE1Jc+Yatz+L6fraKCwl5Dic1IjRJrt+T+NVYVPKQEuThDe/U4BAFA+QLJbjJCr1FUPj2KPAu3NTV61F/YSl+a3GW18YvKNbE4yAJcEWYtdrMQg4mcFj5QMsGkoBz2JDTDGNFNieTnYk5zm4bjw8Da3GaPcBTpd29+9jff4jNyTFvTo9RjrYom02THLU2dcp2UQzwwhik7qW91wFNLbBQCmhTwFNFfXiB6c1bvH/tTdR7DxuryFL8TRlCghtVlzGQdRu8Q6GeygpfsUavUvsgEp7eODr3Q5CDBI/Cxkiw05RT7FLaTPEyfdf0NwH2eqAc2i7HlSLrDcxULSCPKqADX2XiHSIJcFW0e70tSqqO9zhYmgsKQDA01aQlH5QUxrrULSWhVnAbqO1AO1xNRbWN0ZlzQsnKoVoZM/YPL7B/cI6y2aCcHnHZblGOtlQ2G6JtkXZKZTq5hEO7XNo04tDCzKiXO9SLc0z3HvJ07wFNdx+0Fof1BfUEVaPSRXwEas7ayvpylXrz2HQmcJzP4ctMtNRy9pmEwVSleB1y3DDTpL/4wazlrjo9rDWSXbbxMJMksCB3+S+hH10yiwqkrkRiBSQBrgo6B/CU3+1JR4LPRPDnCCG6gSyCK3637j4f0mo4KhoVKSF5WiMOVkWXHrOUSKxvGjHWaUK9P0noGo0INwVluwE2hUohplKa/w5KLiJQpwquFbyf2iIIF5dUL3eoDy+Zd/vWFqEFBrdHQ0Z1Jw8ghz5202QeLC9OvKFGrgNhkf1vn5SKrDM7KgvfnW42FWiOOURhZvVIm/2mpSaw9b1+vWoyL/rwqP8ayN+aw1hXhG4dcbFQSeIdIglwTRBuM+M5uV8HL1aYkWCc4aJQfU/cZUQHoaf/uwlHGun03Gcj1cEH1jnMWitjPojNohDFpSs/q9Da7TFdMiZwUH7sfzI1zx4gzgC4igxmJSolqai/eo43Y5HApdqysZbwR9ymHnvHmsY0pVTkusyjEIlerm+WeR3D6IGgyANPHX1aqTlxxftWux55pnDL4eMF54F8saZuYalNSvId+QFAvTOrJfGOkQS4IpjxCgHfIe+7/N1GgmogQ0Sa+td0kOl4kGd/kDwQicyiE1oicyG2WthJop0Nmnqos0nE2orTxpbUYGtAS/olUWBhMIZTyFVJlBZUGxu2GvSh6CrT1HZvpqw1vtYWdGj+PjijBBMVcL7WBVjBejtwa56tM2UWCKkPwENEenOxEAb0m9DrVTNZvjlS0gos6be1tn3BBkY8hnri0xZpxB3hiyOtljzRW0/ldby8dLLEO0MS4Iqggi8y0/c3BVjdh9cNH1+t2MaaUA1C7DeSYDuwjRXNAWG1tzryM/nINnopMCwZ4ZreMt5pkdYgzrrE7aDgAmE6D1mdLJxH6t/SCrl1kC1CDbRn+zLLQ93J66lqw7ok8jb56aFVccz81rluLGrY+05rNNeDUmjXzwgST643LiwjzGlqb8h5HH4RGNS493UUlfKNtz6x25O3KapAxhfGsyTeOZIA1wTzbwQmaKZhoShEhH4aOejjdNsYNjqUBA0nQWOdgjZDTrhASVCKq+yUp2iGYAc6NSp6SLhWTV5VHWZ3iYSs+uAPN1KVILgwiEubtidNotZOM059lgb3ZOFoDKT+QI0IMwjVWhXoxwVUMP9FvQEI3TWcResZGxJkM9o1d/mT4cR+iDEs6VI/UbzGeL8GMLqWBF+sm7cc3vtDsUohtNQYdbn+46VOTLwzJAGuCAY+DUAeHs6ihEq0VUcTUsWLThUJ7CcjK6w7R0qGQVXE9RAQtJ8POl0OX8ZsnDKno9z8frZZxZcOUI8626IErsxIfIftsZjcM4et+wnM2USpXGtSq09YzZQXExMxVe7vErKSivWJ5SGRnyqaqK7GQxuZ+gcV6dV6v3duwrZRdLcmiptC1fMPzlsp48VkewnH6TYzd9svYENOp0TgiX8BidWQBLgizrf49Nm+vgmUpwCWJag2oURwTXEgLwqU0CZrMQYiESuJ1cVFgD+CUlZL6pz+4T2bNTqQmvMkkT53oosySx4PafShR2fcsVnAHf3MjiGAqrYbNm1QL9ZHuzCcfmCQqSLtthKD4t5X5nU07RgWcHCVZcnJ1mdeKKpEnhMq4LZqV4HfRdRlQHEfWtJ2rEcUIntKoN3S2jUXJipgriCUOzePjn/xUN8m3j7KN7sB/zzhgx/84MNSyv9hvr/KBGZCgfp+GuQ9EYXxQbJNBg1REwiyi72QuvFDfeSGrgwoUtPb6rOyenIxn5XkSEywIpvisTRsI1cq3atMWiW0axbflX0maVMpkj5C4/GEItegnUMkidSqjsrYniYE5RAUkksIZUqbTkZ6za1dbW3FUrivj7StbEqudYtuJ2+baDkvL3UUV9ZEcV8sI23t+lvckvJlbQqjlHZtmwLm6VP0U3/g4Uo/1wRSAa6Oy7r5uQ32f5QBQnt4EPN2C2rzu6BToFj8R2LainJSsyu4scIMYDfyVGyQRlLEaoP5rljy6lxMQXSJLgUtA9KivCI6LdLaKaLwClVuEq1p4sSES6NTt8wLSB8RwBTn2XIjgAq5WdTWHm9rS5esfmqPgkOXuGq6V5aMks5RzTdb3SZ6Cv0bC2q09fBcvXKoxbVkfO1vbnZ3Ur+qfZfxEPcF2g2KAM0OAOxGId8ojjZH//OsbYnHQhLgynj+wet//fWrN24zyk2gMvYVtFHD0MK8bINBfHea99YgakD8VWIMutEsCpOcvfpGaC5Zb/JBs2LUXGYlH+MrT9YxX1rFHJqio+O5WWiBGyJ5os1vlQJtRRdjZ0ZBe7pcKZKKwqwxGAbCFDi/0HBLaPHm0nWM/Om8OeET9VhWb58zWuh3xLeseeXBWdB7FMJl9iQoPc6Bdknzl3SOiypcK641CyFvZJUYgJjp9rVnp59f+DYSj4E0gVcGffzjlwz6i6bQpkqY6txskx+6TedVcwnDgCC0+bQU9suLawlJ8FUVgb6cWpnCI7FuC75o25hkCobGOorZmVJelGP85ZgZC4omantwucxsISIqzQw1E5REBZXRRISoW4KviCz7SqtX/9zMBfr3UDNYLkf3eT3oTeJ2kJnPrT4ukrfYt7M34dt8Z29L+J7djCZwMVcDcSHSuls/FW1j80xsZO40EVUGtkfb/5p++If36/1SE0AS4BPB6enmz2pMgghM+8nFiN3hKajBcLAO/m5D3B9ZC4DJrDAHt+jUU5mAKspLqiM7tCgJQVlZByhH35lpH1j5fqDL+SNBMImZSkY0jFKafFICLaGOsc7m8xO/WyEhmeYPlHqJipFrI0ojy6Zli5C2khPktfhHGOlot7RzKRk5ETfyj+TYtz9Ejf1GEfx88s/Ifzi2iH+D5HWzsYgIFdpdJ/xn7/T3mDiMJMAngOvvec8rlek/LzI4eaqALvAZCI2COmgbbJcTiW4VpcCAZ91BuVAPgp1DBpM8AM1IiNCdU8kkBjuKqixvUSGACnfBA3hZFGV2UbQEIadWxtUaQH0QQ69TSQZOvEWmtjmxsqk0a3dTlRqQJW2rEiL0HMxE4BL61ZUbZD8JUTEbqep1giDqlefH2vVj4wRsZeR6pT+ighQSB6GoaSx9st20RR7Q6tkeb/4s/dj3313tB5ow0FsXSbwT8C/90tHrz77vFQZugrn55E+Pgc0Gllw8992ZKuQ2FGzSlgZ+tdx4XHv1TZYVE/YRINNLpKjM35WVFNphtkJ087A1VpOdPrcX5qSrgPnuNJDCoSziPOH2HGGuaMEY5uZzjO1sU+h0iousiGVlSOqXadMsPko/l16KxR607rhfYkmS8qxdEL4Q7wLEb8qWmhbnbVw70A7z6YYi4IBGyTHpKHgv2tdgDS4E2mz0soiI7jx98ubz9If/cC6C8ASQCvAJgT75yR1K+RMSpmhy7WLXyK8skB8AN5FhAQuK6qzz31lh9deZZGu1L5SVuizDTQMZ6ssCWLJg3DZux4gpHVSaWtKzFJBBFUGVLnVtMbPYFaGYiFJfUF7hGE1NEZO1BMUnKwgEa9fuHQsmtrsLiMmUrV1Pk7Gi8tQ0FZfB/H38enR7kYBPq4PNjziY0803Crsm2mxsMh8I2G75307ye3JIBfiE8co/felnC/inW/SzMpcCXDkOSsrBlg6LBWXRlwG0nERJQxCZ2NY7EHoznTdTQ/oD0IWULdO42g79I5VOTZlVjzRzVGJBBYJb1FVWwuGqs1LYj1FBqs8tjqpTztmpQ1Gf+myQuAoNG52rGg19F5SwK0C3nP2tqUEEzWaJQVpdfwtTZRhn4Egxnb5NXlLKErpHDhBhU6AR7YmZNoS//PSP/+BPI/HEkAT4DcCrX3zpN8H4GAhMlcEbAs5O2s5ax9EEoA1mywtUOnO9xmFzPEYMtO4ws8TYiAkyztmkohMTlE3awTV8FrKzoc4cztURl5Z101gJsrJMfo7mNGCrx8TtZvKq2at16HFs5nk8/6wPjPSto2QHhZuQmc/WH+1r4UiQA+Lcu37CX9hg9wyKJnMsHAMlckqi8ptP/9gf/BeWzppYD2kCfwMw7csPg/AaAOJC7QHlDy8aNxQKw8RhAZK4U2WEmqyzY+IbChtkULvZLJqlmWXkjn8ftBIEMQ0ZTVit0T+3E4oV6iantrUQYsTUIsCh0UVN1bg9mI0YjwfNTW+EdBTNhUELwsj6rd7ubgbGkE4jVxOvcfYHwAI96logN691Foz1sZKfbW/2fGnBF4naM4ioFry6PcWPvMXPKrECUgF+g/DKl7/87TSVX2DG06SrrFAhnB4xtm3BBDMR/7/27t5FriqM4/jvuTNrEYMG1AUN2FlZKBiMhSnSmgQbSWMjaKmlpZWVlZWlYmdp/gaxsZE0NmIR2GSIS4QUErOBvY/FOc85z7kzxsZsInw/YHbmzn05e9f7zHNe7rkLXmt1NV/p62xlNfGyZCZTeVPaH9NQ4ZYtxUaedhZZXssE+/omlftIcqbZs7VejlrtVcoqa/ZnrQ6fq6juW/vammC1dYTsWr/uv2eU/XzFRLRtndo/0VoJ0kkcXst6etlPj40vpZQGxuu2ejlyuhtk8aVlipleYrlJdnea5jfOXL7AtFcngAB4gg4PDl6x4+lHyfYlyeJWj72VtLeut4b16m4Ohu3WufKhhuX59i2vHaRW95/3UGtzcTNe31e7cWyo3vbaYaoSR7yZ5163q727Y9W3tfVFO14JYvMyeEaZfexl7kEuV6vHQKh63DndBDf8Pj1w5wDYT5X3QFjPj6UzJg1fEi3ApUrzzi+ssqW1UzmskzPoqV1+VgPm4d40X3jm0oVfd+4T/zkC4Am7c3Bw1o/X1+Tzudbi417agPbWpr1VvWTnHgwXF9EyOPZlNbTlz7czw0hX+mwwKeC1SBjjMNouvD3IqB6kHKO13Ukp4KkFrShD+txaEFtmfRqHxaRMz2dvTw0YMsFaFg3Daaz8ArMsoqbUyl7r9lHoVI52olT/MIvg5fG3WHZ2xDHrO1P5Utp1dZWqc1u9T4RmPx/P85UX3n17s2MrPCIEwMfA3ac/btz6etb0QdSO6iQFZTDtelXGC069xtgCVt/L8GP7dQTPVAXsuU6ESlPMrFq3aVM1xLi4tkxDoIoyS9LOIBjlHXuHW0+yu5vN3quodR91yGSdUCH2Obeg1DLM1jGSzkNbbyjvkOXlwNsDXCp/OpeurYzwH0SwjPy4f89EBM5tm3WNmO9Rk6Zvzlw+/9HQSYITQQB8jH6/sXl/kr6Q/Gy9r0N+XK+ByaTVyrUyadUb1NtwCvnQFujlxrHF5brjQi/Xeg9EPQvqWw/tam3YTaR+kW2ZjT2wWxld397SIOkeZGNYS8v81NtBfe6By+c5hs8sAl/OBoeyRVmBjDdqAAADOklEQVRM8kWVX/3LIXrVWwV5kVkvMsOWPS6ywrpgkZXn2wH7svinbnZrNa0+ffbS+e+2/+/ASSAAPmabzebUdKTP1qaPJZ0uV2K9HuMpbGbl4UN17riebZTV1FOOMYPI2dGuK7mu41LO/BSzanncEOe1N8AlladzlzduMp9VNykRNGaF9sW+5hISXO6W797wGo1z4PTUBtnGCbapHNzr+MFoELQeANWH+qTglQN6Oh8uyWbrZeknpj1JJXd7RIPeQ3PCHuPib5c+KcecZEem6ct7Wn/+0pVz9x6yNzxiBMAnxO3fbu+v1/MnLn1orheHaBYXYwQr5cytDXFpPbTLVdqCCGpubcBtqq4uOhLKG6vNaU3uEGnv088o8LAssjHl299qJ2sNZLFtPEqgrCz3OvFMlMFinegQ8TyDV9pvL8oQ4KLM7a31cpZfyFJXTzoXVm7cGJPCnVzR9pg6PCRNmm5L9u3xSl89985bN/9lNzgBBMAnzGazObW6b++tJr/s8ovmel7ubXxFBIaRjRf6rqvUx591esEh+4uqpNesrB8w/ZeDScu0PH0eny2Xp6CzbDO0tN7wWQ3Cc69Fxh0r9U3NAcvK5em76gGuraPxGC3TXZybrQQ6Av2iwyPHS9V4GX+DrZ3aHZf94PJr8/0z3+9fffVP4YlBAHyCHf5yeHp++sGbcr22ll536WVJZ+U6I+mpIXy525SSn5ZWDZW44EMFOgbXtCxQHkNL2sb1UXPy2Xv10lL1M6rtLTimIOySfO6Papp76hkZXF+vRr3WPueaa9DrnTntDpDeJmhtGEvdV80yzcvjPnuGKKkf0zyHLW//9s4Ra80LdUbr8mmZhdplHpN9H02yu26+keumy66vJrv+4K+jn/avXiToAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMD/z9+1OSJi/gH9WgAAAABJRU5ErkJggg==","e":1},{"id":"image_1","w":320,"h":320,"u":"","p":"data:image/png;base64,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","e":1},{"id":"image_2","w":320,"h":320,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUAAAAFACAYAAADNkKWqAAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAfH0lEQVR4nO3dSWxkyZ0e8O8f8ZZcySJZ3IpV6r1bvUgaSTOjGdiArTn7MALmYM/4MLKOBgwfDMMn+2AfvJ0Mz8WAoPEytg+GR4B9l40BZGvUo5Hc0y11tzRdUqmqi1uxSObylngRPryXLBaLLGaSmXyZj98PKBSXZGYw+fLLiPci/gEQEREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREZ1Jym4AnW1ra6tlbfAV0e5XnOCLCnrDwW4AmAcQlt0+ekoCYF+U+qWD+4XL7A8h8iNlkz9dWVnplN04Oh0DcMpsbW21lBf+dubc11yGvyYKS2W3iS7BYQeivgO4/5kl3f9269atXtlNoicYgFNid7d3O82SvyuCr0OwetptRPjnmgXOubO+86lAfTML1b9Zb7e3r7RRdCq+okr24MGDhujGP9Yaf9+dGNYOAs85B+cGL6yzXlw0HQQiApGn/34DDg4C6Qi8f2uS5j+9dUvYIywRA7BED7f3/5ZS7l85h43B1/LXjMA5B2tdEX7uKAQZgNPuSfgN/iklRRgO/oZHQXhfKfmHy4vz/7nUJl9jDMASOOdkc3f/mwJ8/fjXRQTWOlhrYa19KvA4/J0tT/52eSAqpYp/csoQWf5wZWnuGyJir76l1xtfVVdse7t7y0r6PwB8afA1EcBaHAs+x8CrmDz0BFqfFoQOIupd5fzfvnmzcb/Mdl43fJVdoe3tg9et2D8BsAIUw10HZNYiyxh818Hgb6y0gqc14NzxkxrbYuWvrKzMf1xeC68XvtquyObjxy/D4M8A3IDLh7QODsZksNaBuXe9OOegVB6C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","e":1}],"layers":[{"ddd":0,"ind":1,"ty":2,"nm":"Opacity1","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[160,160,0],"ix":2},"a":{"a":0,"k":[160,160,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":-1.00000004073083,"op":30.0000012219251,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":2,"nm":"Moving1","refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":2,"s":[0]},{"t":9.00000036657752,"s":[30]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":2,"s":[160,160,0],"to":[4.418,-16.902,0],"ti":[-1.749,2.098,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":9,"s":[185,130,0],"to":[4.167,-5,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":13,"s":[181,134,0],"to":[0,0,0],"ti":[-1.749,2.098,0]},{"t":20.0000008146167,"s":[185,130,0]}],"ix":2},"a":{"a":0,"k":[160,160,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":9,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":13,"s":[98,98,100]},{"t":23.0000009368092,"s":[100,100,100]}],"ix":6}},"ao":0,"ip":-2.00000008146167,"op":30.000001221925,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":2,"nm":"Default","refId":"image_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[160,160,0],"ix":2},"a":{"a":0,"k":[160,160,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":-1.00000004073083,"op":30.0000012219251,"st":0,"bm":0}],"markers":[]} \ No newline at end of file +{"v":"4.8.0","meta":{"g":"LottieFiles AE 3.5.4","a":"","k":"","d":"","tc":""},"fr":29.9700012207031,"ip":0,"op":30.0000012219251,"w":320,"h":320,"nm":"Artist_ic","ddd":0,"assets":[{"id":"image_0","w":320,"h":320,"u":"/images/","p":"data:image/png;base64,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","e":0},{"id":"image_1","w":320,"h":320,"u":"/images/","p":"data:image/png;base64,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","e":0},{"id":"image_2","w":320,"h":320,"u":"/images/","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUAAAAFACAYAAADNkKWqAAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAfH0lEQVR4nO3dSWxkyZ0e8O8f8ZZcySJZ3IpV6r1bvUgaSTOjGdiArTn7MALmYM/4MLKOBgwfDMMn+2AfvJ0Mz8WAoPEytg+GR4B9l40BZGvUo5Hc0y11tzRdUqmqi1uxSObylngRPryXLBaLLGaSmXyZj98PKBSXZGYw+fLLiPci/gEQEREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREZ1Jym4AnW1ra6tlbfAV0e5XnOCLCnrDwW4AmAcQlt0+ekoCYF+U+qWD+4XL7A8h8iNlkz9dWVnplN04Oh0DcMpsbW21lBf+dubc11yGvyYKS2W3iS7BYQeivgO4/5kl3f9269atXtlNoicYgFNid7d3O82SvyuCr0OwetptRPjnmgXOubO+86lAfTML1b9Zb7e3r7RRdCq+okr24MGDhujGP9Yaf9+dGNYOAs85B+cGL6yzXlw0HQQiApGn/34DDg4C6Qi8f2uS5j+9dUvYIywRA7BED7f3/5ZS7l85h43B1/LXjMA5B2tdEX7uKAQZgNPuSfgN/iklRRgO/oZHQXhfKfmHy4vz/7nUJl9jDMASOOdkc3f/mwJ8/fjXRQTWOlhrYa19KvA4/J0tT/52eSAqpYp/csoQWf5wZWnuGyJir76l1xtfVVdse7t7y0r6PwB8afA1EcBaHAs+x8CrmDz0BFqfFoQOIupd5fzfvnmzcb/Mdl43fJVdoe3tg9et2D8BsAIUw10HZNYiyxh818Hgb6y0gqc14NzxkxrbYuWvrKzMf1xeC68XvtquyObjxy/D4M8A3IDLh7QODsZksNaBuXe9OOegVB6C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","e":0}],"layers":[{"ddd":0,"ind":1,"ty":2,"nm":"Opacity1","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[160,170,0],"ix":2},"a":{"a":0,"k":[160,160,0],"ix":1},"s":{"a":0,"k":[143,143,100],"ix":6}},"ao":0,"ip":-1.00000004073083,"op":30.0000012219251,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":2,"nm":"Moving1","refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":2,"s":[0]},{"t":9.00000036657752,"s":[30]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":2,"s":[160,160,0],"to":[4.418,-16.902,0],"ti":[-1.749,2.098,0]},{"t":9.00000036657752,"s":[196.7,140,0]}],"ix":2},"a":{"a":0,"k":[160,160,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":5,"s":[129.6,129.6,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.309,0.309,0.309],"y":[0,0,0]},"t":9,"s":[124,124,100]},{"t":13.0000005295009,"s":[129.6,129.6,100]}],"ix":6}},"ao":0,"ip":-2.00000008146167,"op":30.000001221925,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":2,"nm":"Default","refId":"image_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[160,170,0],"ix":2},"a":{"a":0,"k":[160,160,0],"ix":1},"s":{"a":0,"k":[143,143,100],"ix":6}},"ao":0,"ip":-1.00000004073083,"op":30.0000012219251,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Lottie/Chart_Tab.json b/Projects/UsertInterfaces/DesignSystem/Resources/Lottie/Chart_Tab.json deleted file mode 100644 index 2092943e9..000000000 --- a/Projects/UsertInterfaces/DesignSystem/Resources/Lottie/Chart_Tab.json +++ /dev/null @@ -1 +0,0 @@ -{"v":"4.8.0","meta":{"g":"LottieFiles AE 3.1.1","a":"","k":"","d":"","tc":""},"fr":29.9700012207031,"ip":0,"op":30.0000012219251,"w":320,"h":320,"nm":"Chart_ic","ddd":0,"assets":[{"id":"image_0","w":320,"h":320,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUAAAAFACAYAAADNkKWqAAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAgAElEQVR4nOy9e6xlWVof9vv2ObduVXX1Y6ZfM90MPRmGeWKeAzgeB+EJkRJiYnAwAkMICLCQHFtyrESKEisjkShCThQJgxJZxg4ickxCAiGWkMIfYzk2YYYBm8cAwzDMTM9MT3dVv6q7uh73nrO+/PE919r73Hur6lQPir+fuvqes/daa6+991m//fsea22gUCgUCoVCoVAoFAqFQqFQKBQKhUKhUCgUCoVCoVAoFAqFQqFQKBQKhUKhUCgUCoVCoVAoFAqFQqFQKBQKhUKhUCgUCoVCoVAoFAqFQqFQKBQKhUKhUCgUCoVCoVAoFAqFQqFQKBQKhUKhUCgUCoVCoVAoFAqFQqFQKBQKhUKhUCgUCoVCoVAoFAqFQqFQKBQKhUKhUCgUCoVCoVAoFAqFQqFQKBQKhUKhUCgUCoVCoVAoFAqFQqFQKBQKhUKhUCgUCoVCoVAoFAqFQqFQKBQKhUKhUCgUCoVCoVAoFAqFQqFQKBQKhUKhUCgUCoVCoVAoFAqFQqFQKBQKhUKhUCgUCoVCoVAoFAqFQqFQKBQKhUKhUCgUCoVCoVAoFAqFQqFQKBQKhUKhUCgUCoVCoVAoFAqFQqFQKBQKhUKhUCgUCoVCoVAoFAqFQqFQKBQKhUKhUCgUCoVCoVAoFAqFQqFQKBQKhUKhUCgUdoK+2B0o7MbHLl++tDk6942M6atB9DWN8GRjPAHGQzzhkBvQGGggZgaYQQ0gZjADaJD9DICZ/HsDwOPfNqGhQepN2HIDg5iZiNHQeEJj5gYia5sBtCZtsH1n6XsbvjMoyqXy2m+ASLcxtIpsBwHEaAxMTGjSDDHLHhCYrcJZwQzQHf30GZATIe1v2nXEoKsAfY7ATzPoX2wn+u3z59cf+eB76dqdHKxw71EE+CcMH7t8+dKKL357a+07toxvYqJHuDEY5KRixGIE0thIhbDVdrwMJyIUAvE6maS4aTlk4iQ0ZVP5nOr4sYWBmAFWUsh1AaDpz8zJcIEAmazfBKFBmpUlhlI0AJDXIYb0gWj+g87bjfgyARp73hkhngg5E3qewB/agv7xOTr4+Q++j67v/UCFO0YR4J8QfOKF619ydLz5q2D8AIA3mfpprGQgyicRoBBPA4hBAINVDQIQomhs3DCSF6ExEzNxY6ZEWhykyE56nD7LfiIGe7ujApTP1KlB6D4Y2bETIrEIOjAFE2aChHKcbc9/HVpu3BV0Ge1oIdlExLQgITnq2Gf/mvfZMbt+MbBVleq1pdazDPy9tj73E//N19KV2UELrzuKAL/I+Ogzz1y8D5f+Fk34Gww6VFJToiBmYQfegLFlMTm3DFdmDSAzgbdh7pIqNE5KjZoIPTRmJUGQtENKnkJ0WyFONAaLqmQ4iZq6A1PTeqbgRmUJaQsMJgYxOJQjEJ/ZFSKLvQsjQCYkeuKsDKEHSMSYmWhgwv6rSrP0nTvatNIdU4JYRCexlhZSZDCIJwImAtYEHEyEgwlYT1Jx2+Tc/OwY12i1+skV1j9WivCLiyLALyL+8MrV7wHT32bGk+KjY3FqAbxpTMdb5i0D2y3TMYSQjGC2zL1fj00tgppsZwawZSM6cGMmKU9sKlBITAhxawQmREpbyD5mMa2l/MQNTA3gLROZCdsgfVPiJFWKbOpQyY6aMAZY1VgQIiX/INtnsVxdTLErQTNZjf1GDWeKzXadSIgnbKekPpcqZa4k7daKQAcT+HBFuLgGLq4Ihyu5rht9uExgMNHnCav/9Mfet/6HJ/xMCvcQRYBfBDAzffy5qz9NmH7QZAvTxMzApjU63oKPG2PT2BUX0ActmtrE4d8T4tlCBr3553S/qL+OMO0fRzkry8QRMGFSgjXyFTKFmuHpO4MkKCJtEatUctPaiI+1jzAzmDoVCYQJbAw2mr7szwr/PmIXydk+UF9tsHh31u1IcYSRuF0/AnC4Ai6tCQ+cE0JkBo4bSMJJhC3oHxy+7+CHPyjCvfA6ogjwdcbTV1574qi1X2rgr7OxTgCOG+NoAxw1xrY1IppUUSVfnJCNR33N1Nwa6biJ2REdmTpryGasDlIxqZN5HOTqilBIkMdIcjN1aWSWSNmDG9H/QfFFPwCx9RsRzwiP7RIJiRKLKTqyz21HggWDsbu47yyNZJU4I8ctyz1aT6AHzhG/8ZBwYQUcq2ksYnb6KB9vvv2//jMXP39HZ1K4IxQBvo745JVX3sEN/w8DjzWoAmEhvaNNw0af/6zjPKesJDOy998hBTCS8lAiI2awmK8gZmLzyTUtv80kae2zmsdQU1rb27LVIyfVTMSqCDH228oAQXqc97uUY1WH6gdMTBJSTwlwUIDGpLuU2QKy4jtLWXPh8UkKcFcZ0ofXMYMPJuDhQ8LD5wnMTBu26DVfwRbv/6/+9PlPnPEcCneJ6YvdgX9V8JnnXn4bGj7MwGMMMJEQz43jhpvHTcwlIvVtUZfbpmRBmVBg1qTJyDzULEPOBZS4+RmaBWJRV/gItRbl4PAyErgwRhKff8roc9dXIiom9gQV3abx1swYy6xDnIMgXtuPAszUX3cCfgG6RhcP1QvNsfxYpyO0kdiGRneWIQIfTnIvv3Cd8fS1RlsmPjeZWKZHsaIPf/BXb759R58Le0YR4OuAP3r21ce2NH2YgYdg5NeYbxw33mw1yaXLe2MaCMr+EifC0eiqlwnVxWAGh8KSERxqkYk5SCody9xznpWXTFEhAIJHqe1wPSENJBbHsW0daeZgrBBn3y/NuKHELESRLOgFE0Hl7pzVjM0ktkSMJ/n87EkwI1p9nNFQhlYEPr8CvXoE/vSrjBtb4Nyk9w38hs0K/+8Hf4sfO0O/C3eJIsDXA8QfYsYjpvy2W6YbRw2tMWiyaGZOR+sJJIk8doJkG/MuDq2d3nTM6k2PYyRlbeWumgnqpmkQn/dJ/80UnZGybwDA6tebHSIqpnYG9ec0PJQdJ2EsI5MfDX9H7Gpvp5m8RHgLjVpsh+yzPTAY4MOVuD8+82rD9WOmcyuyZ9ojx8fHHzqt/cLdowjwHuOTz139WQLe4+TXmG4ey3wG8lSOXjV1yo9GkzANJPlAY7087QxezniI2NSgNNylAav9jX5Lajd1eCQ2q8AqA+3oplo7wgxqGi3avhiYSVyZAEgmmwyHPcnkHQls4czuDKMi3KUQT9rHEOXXGHj6NVWCK/mhUGvv+S8+evQzd9PHwukoAryH+KPnXvoOAn2fOeoag24eN9YACIBEWr1q830qI1SyuX9OCqgxqRai/NWMY2PUpB5H89rNaSswBh10m9UlQCO9FFWDSAEzX020MpzA3Z/opz7QD/f/yx/z3yXt55dpVvpknKb6xjJLxLrT9D3l2F6GARxMwJbBn7/WcNwkh1CnEn7/f/7rt/7CaW0V7hxFgPcIn/gEHxJW/6ABMK/VrU3z3DBG50tz8zH/je3+mTMxaETVyc2LKYd43h2CNG1GhpdJx1CSymJT/yqvDXJx6Juk50TxzhROyP0l/+flst0bM0gw7D4F1u5JJLjU0kl1ONXhtNFOmcZtJ4H7NnBuAm5ugS9cb8ziGWECgxr/zF/5KB+c1l7hzlAEeK9w/9X/EsCDJp2ONozNtrFZvaZzkstfpn3xyaoQGIiHyVkrp8touaTweJRK3bFy23a8IDe2tlyeGbF2iIY7Atf2QpGG2T7rAttJuesMKYy6SCwEDTakouNpdWUXtp+GGfHtiv7eKRhi/r5yBHrpFvN6pY0SHnwEmx+7m7YLu3FXfpDCMj52+fKlQz7/IoADAnjDwK3jrRGTJBXD0kskwMmctkOJTBkiZl3wbAZI83qUEpQtP5Bi5kZKYmaGTm0LwvQEaYZOi9PFEmyfHneDRLQcM0OEgAmsM0dsGpyvYNMR+7D0ldaD7JO2CNEomcsxicoFnTpgDIKchaDOWu62kCPB4/dxn6RDAU/dN+FwpTNGwFgfHz7+wffT5X337V91lAK8BzjXzv1nBByYwttsW14KijlJG07jufvHnQ9P6npwg30OrhUR1RXDSomVOuLxdpCDJ95WVp4WnWC4YENL9MD9x/RhKZdPT7b/TL0gI41mh3oUSRcR6YU2l9rN3dkVxd0VFd5V7sRtp/n8RnXI/TXr9q0ION4CLx417zsDOD6/+ZsnHaNwZygC3DM+xLyepumvGhlsdU4vqCciS7jD+FnbyfuaKyYArrBm/9hsxJQXI19VP1nUOBOX+Qnhx6XcB/fVSX0etzuRev2RFUXZZf8YhlPtGSCy/KzuWCLYMF0nwC9xXzK1vLCdsZu8dqnB2TaWjo5m+NjYmawthgRFXjkCrm/EhACAtm1/pXyB+0cR4J7xxHOvfCczHgTkx3y85S5VRRHkwxEM8VEZ5NIrQAYiIAwgpo51JiVTal+qOgnpIbsIMToT1hRmTkgOD+Qg7boosu0a5V/ia/2Ss2RyHiKTd0KaFy1q6s+Ij2aHwPD9dlw7SyQ3bj/Vd3iSqlvaZoS5SJYEbBj8ynE8mgj80JPt6C+e1IfC7aMIcM9YAd8NyA9e58/C564yqGXzNE0bG5Rhmn4mJNEyiRKU5RLTuXkcbQhTEsQf10VTjUBixkmXD6110uBsaQSneq4wo9X4KOXmCxzk88Usz3FHbMXm/vKJRDTuI5xOXrtM6MVuLJQ9Kfq7sz2Oe7BIwCsCXjtm3NoCExETCDeBv3xC/wp3gCLAPeKZZ565yIQ/Z9+3LKsyh+TJk/xtNgYx6zp9I0kMxKF1mVoLAuJUL0lDNXWp4yZZBIFHv2CK2LI74oBEuLvQq9Yk6+Rku09dY4ltO9KkzMM9edDs0gy7fVH7bLoOl2eRkKzsGDRZMpnHeieZz15vVHoU15bz94wVAbca6MaWsSI/2Df/jV/lCzuOWbgDFAHuETfX978PTA8YwWwtdKsDMOf9deQh/0WisxqLoZLgK7JEgCFy8lSGJcWoU68sAduP06stTpqQ036JO1LOnNFC7oscVBs6s5QpLRyQWZiineFDIKlUV35zzLb1l3MRRnC7SGsUqFZnSVXmckttnvW5cRr4xja+EPMDhwebbzxj3cIZUAS4RzTir1elZaTkViQLjc0SnJV4PP3DWKjlKC4L4Vk9JOHG7jYL3+CoDM2+lc9OgjMV6f1KW6wwp8/pj6XrIlJZ2IlmGOWuPEPNzc3dgPaZlGDsQsXOmf+MdTtOVnpGWNmEPYkUcx/PHBhJFXwe8Lh9od8dJgJubRnHTeUtAdTwDbuOVbh9FAHuEbzhrwQAEOlKy7K9OcGRz4LQyIOxkQ9sW1zUFRmZry/qyqovrhiz8hsCKORLW3U5f4hyeYhrfSEv7sXXUNzyd9xkVenIlv83VBlUD3sbXReS7hrnBHfvStI48ZKSWti2iwwXrsCsTG5jF/kt4SS/YC50YrkJkgd4zIwJ9s6o9pVn7EPhDCgC3CMY9DZVf9yaLz0lO40ojMDUDcQQldOSQlLVFgqxIzX/1xdHqLq0rrqSqa9R1aejRCM5KqyKRVYOZEjSNPK5OPKiC7O9yfc5u07eN+1lJEQ6zXRT6cZmeKnd7hDLn08yZ3fBenRSO7ZtJ1GOitUu/aj8Ol8hgbYM3jRgBaARYWJ+6gx9LpwRRYD7BOFxMQcBf1euWW/GVjnpo/+QFlvRd2ogRomQlDvlnCxzdNZamskbdv4yM3tGpqkBLcKuGLMFmuSch5U7tRh+TF7oww65RQwKwgs1CVWD6QqfjNOivUu8eRopnqYOx23dvhzwOItinX1n0CavnkFU6wTuEUWAe0RjPBQqKiUv9/NgASRVhxSkYCeLpBR8ZRffnOMKWi+pR3K/nAddUqpJIjXLzEFePktJVUxMVnHm0gw+QpUDZ6N+aZAnzGzqaDqJReYcvl4kNXOJnXCsEbv65e9XP6XcaRHfxbrj9aD+84n9V8bmUPQMgB48qU7h9lAEuEcw+Lzm5A1L2vcLEXRqKBFiIsjwFQqTxcouC+pPTWhXeosKkIdt0TtVKFmbdmuoeh2oTvOuGkPmMhFaMD9dtld59iHvN7VHZItGZI61ah60GMjldnx0w2nNurSz7IDbOuZYeOlhsWAm25OP5GJUGsw+UQS4RzCohbkY4VZLBm46wyKRX0g62+aN9e/t0PKeppfnxmZlF+TKlImvI9yOdE39RaDElKTPX/bzGAmMTF1a9DezSZdI3Y30GeOkBQR3gLhXaIkzlw5xWpT3pMjvWUC3+dk6ONt2VhUIIKYUFfaGIsB9g0UZaYC2Ix/ENkpF42WwnExSAJI207Xha6azzypBNy44Ahrsn5O6dBXIFhjxpBfrk+1n63Bq02aWDKTtrsXUT+Tm0PPR+D4SiW8ilk+dBU8GtZRfNLIrytsfYm6qjoSZP59Gajz8Pa0PO3nLzsuCJHohlstTd4sKe0AR4D7BjEZhTDJzSkLmTEyczVfk75DXJ0pdinm6QXazAcBAnnHS5RMOKsxHUMQqrLO9j88/ckcW2TXneyzwk5VdN/XFOxBpOfNrR8av7rO0toCZUsoNjG1lkiLMSWsJS4Q5YhcpZhIcj7mrj0sdWHpOWcPmpjhLU4XbQBHgHmEvrOCYqgbY6i3sqitVQGeiqglr/DVLi7H/+0rQDDNThURls6aU+EwO9yN1xAsLhrDNSU4mN6fj85DOMg5PP/eOCOLAiT2TPy9fn7El8LitL6UsE+ki8+7koqfhNKsyq72TVN1Ioktm90hs+fMssTtHkM/S0cLtowhwj2C1boNIkAKakQidSQhIMkwJp0to7tqab9P6aZ8lTHerRHdjp1OFno+d3zYkL0T3dxQHl7kSRXp1Z+pTnrHRH9OTvvtXXy4FXFI/rcS4FvT4HDnh69lM0VOwRHaj8huPd1I/ZhuGZ8UMzOiud2E/KALcI0z5QWcA2wIH2PF36Z/wX1JkKbQ7kmDa3ZGkE1XskxkmNsK6Osa9nOuJ8lgm6mTG8mirphhMd2nI3Zo0E8FzLGhCLZqnEp7GBaf55XaVvV2SPKnNpbZOM6UB9fYl5UcUnwt7RBHgHtE/0WN2Q2/KojMNOYjDzVJbiooBMasteoKswEJ1jaTqx8996iPNkRBt/esDKYy5atQPPDYJxhjUENLy48xIwmMkcQwze32GH+fIL5ynB5wQRT2LWBr9g7vSWmbX45T2rA4vbD+tXfclZhOY5a2q4KLAvaIIcM/w1JNOHHEXjbX38sq++YiT75RJKpmhmhid1J3ZsG4mDaQ6U3L5b//idUpRD0Y6jnWlU5v5nOO4w3kM+zo/6IIaPMGzl9hkFwvciXrj4ftJZU871llId6nMTAlyXNa+yHiRC3eFIsC9IjEP4GYoXCnpQqcdUYml1BEN9ySTCYbVwO5JSJvMMz7SQglOaEyexqJkGgEL6zJHFGMgPz+nvMGODwzEzqdHCfrvQ2SYw2zuD+zkPPs8NHmSWXs7RHmawjzNzD1LOyeymiYO8VllaOHsKALcI7gNARD7x52uUZaEE1GzzwPhzExn3dW16y9Fl3+aQkPOsYnIWm5LiVkzt93n10C+ig1SX4zpum25r6kMD9uV53MMOAIh47HsWtGgdcgF4kkcsMunNmJfMmqXyZz33/XxOrYvBtwrigD3iUklFIyl4qc7vMjI9/h2lWiDsktqDd4up5By9vXFzA3qDs9BPgyfdcGQ93H4IVOuWZ9+oZ+JuVOLtt2wNNg9EMB+bFWrnewE3Aeoy94vMUYODOh3GvhgF9Fk8XS76m9JeO0itrx9V3R4qfxp29LN3NXVwp1g/cXuwP+fIIl4ya9vf9V77QFdJbHmatCIb3gxerJ1WZWZElvMDU7kCuS6aVksbyYIVmeRxPs6OJbp0j6mfD752CmRdH62tVeCVp2iAeM1OZ8kGs8MSgwz+Mj6cuiJi4fvZ1VmJ/Dwovrjocxp2NVO4XVCKcA9wk1MMuuuWwqr44aesCzg4S44iL/OU05sBMcCqASoEPSG9FidadkHQNLLkXSJ4axKu3Zcc6gHysTckMydlam1Gm2eMPPDTnKhrbRhjESPrskl7IrEjofIZLWk8HZ17SykdTuEZu3Zv/w99WhHGLxwVygC3DOMyDp/G9KoNYmVJJWTk6kvjXOMCi01N5jO3T9TYnnRBQTZMZke85d+GGdGhwleX8Zjyi9MAV0/F2PTbhWcOLVxQ1dETOQ8/Y10wjPG2qf6AJcP0VVfVG2ZDMdtJx1jiTyxY9uu/iwdb+H4C3MgC3eNIsA9g4yh+mCpfe58aEFabpp6MELDut1IyPJnWCRBic5nf1AmT3TtZDPbiI/RwlfX95Xjs+6hNBiN7z2gvcgcs6EcV2uJjfQo+RQtUOOXd8BJAedchhf2nzVwsnS8XUR5Owr1bPWK/e4JigD3Cf2R9stSdeoPsrwf+fsfh5keLvs0UEDZotVi3dvgpA2LnHpZ9jq+AEHsCLL1WERa5YXmJJNZEaLC0vk5GSxKmKGvwwWjJRKcNZIjM7tLjribeOntqsxdSvB22j1NSc4CU4W7RxHgPkH9r5PnPixnuCDHeOGRlumSnL0ePGrA7ltzpehqjdKxkQTlPFmZ3YK1+h5v6VSnWLZpHipx623aM5DBMCsl2pZe+oVgT8kxxZfO/zTf30nYFcVd6lZWijMCQn9+pwVZRuxSjLbvJBK0O3o3xF4YUAS4R4xzfxmS+Nw4kRqlhU71J9+TTa+kZmrSiopcjJw7qdhHkbkfcbrWlPTLti8TWE+WlraSj5+n+qUTHkmqn5I3X+dPttphSGf+eTe74jb4F0ggBxHi0P3n8buf6wnI5Zbqzzn97O0v7RtJkGcfCntFEeAekVP1LZJh+iYRjq+KkkmG4QEF+57WEoRyR06cBsx8bLacy+CDi6X4uWuXXV1xfkNdL7FCQS6MdjVdY6h6tFrLcZT3YHYPewmSRIIpz2LprqkVT/6/HWSQNy8pt6Xvi3y8Y1uO0t5LLLVfqu8eofIA9wlSEqEYKGlWhpKTj6W0TcKynkSNjhjhcog7kkGU8NxmtSKZ8nuFrFgSewyklx9Fe2oOExl9jypSjjPz26WvqX9DJTgRapxXD7lLTs263x8vp4yM/cj7d3Hq7eK0ersizGcpexKxlvi7hygFuEckBSXBCuRBb1DVBhibdbM/OEkpJ72F0R/lh0ixiyWEylS9ldSfMARpwjM78TpxzB1utnDqcM6+dyjPYfpmtdrVW1j4dGh7ZvIS5guH7q7uOK38WRTj7QZGTjrGLuK+neMV9oBSgPcIrMEKndk1kBYjlocHi4kaIoBNACoZSoHh/SIqw4YoMXy390MVKEOP2ef+aclsXnaKrB/VtgZgejET9RJS31nSVXO5J4eHK2LL/Uvzf/t6St6pGzNevj3i2aW0eNz3wDnCtzy5onc/NOGR80QE4IVbTB9/ueFXPr/ll26deNhdx8nbT1N8Z1WIhbtAEeAeMRu9PTckBSYpfjlB2fx0RmoMmSrXESeyOS0ZMl2KTWZACMF4iFfqd31qDGIiWwt/JJpQcRx+vCC3PnpjdYUic7lQgHPqYvLUnTRbebikrgKH01tCNouXiOQ0UgIA/tpHJvzIuw7o/gPp23EDJgIeOU9454MTvuXJNf30x4/x4cvbXe2d1K+T+r24fYH0C3tCEeA+kYaek4qqHH9Jue1iU1JCTEaObFSoEzZaLA7gQd8xpYXHfzx7RaaJLHb1x6Y+vR5zmL8uvrTLNJqwcTqA+QulZE98Rn5dXSE+X75LjzYjgcxkAwl08nWhS6eppyWCZAD46ocn/Md/6hwxAy/cYqzU3p6S3X3pgPDX3nuALQMfvbIdmvb2dh3jdnyF/UPhJAot3BHKB7hHmIcs+e2UsOJFP71oQszeiH/+E8/KTsWiqsB4mbmVX5Y75rfrHXQM7ggyVzHyy8pSCGxYvorTisUnSDMCp/QUZfVMiHohdsimXTM/8uFGE3ds6szq6fELhL/+3nN01IT8poUGJwKub6TJv/beA7p0YAJ1Z//O0u9dbch29wqWENw3igD3CspklZKHAegUNABm+5o6SvKmU09ZNjmRuqIa1/zDjn9puCVFFh1Gn34TIZE4cO5UIlqbtJILO9Gla8L5Goi47S+Z1shp412JhaDH2MXF7t4Ozk3A3/zKc3SwAl6+xZjsTBYOTCDc3AIrAv6dt6xO0mQnBVeWm56Du5tY2CuKAPeJpNQyNfio7HjHSHAWWWV3vcFYJv3w/Rg7lpMalBuQzWbKxZyvZ6rTVeUykXWMQ1HeyDP8f66Jc6vjGn5LGHl7F5ZU1El+Nm9/3Pej7zmgJy4SLt8Qs/ekA+bKX/3wtNRePs7tRKBPJO87ZvfCThQB7hGW7Ky5gJ36g73u0t4ADkrJ0gLN3+t+6Pkvp+WvsvnKScWNrMhgar6clW1UNgyW4a6ua1Xn5nn6y5nECPXtpFzAk6qnSj497+Sii9tyOgkN27vD/3tPrfkbHl3h8o1QfkiFc6PjAR8+pLHoLiz19czRXc73q7A3FAHeK8zM0m6V5m4CiGwgINY+GAkuT3vjwUbNclL/hJ/QSllGIEMWQ+1M3Vl29WysmZnaF0vnMz/3mOnR/z0ZvPCR4AuhnpVkTjOZvdzXPDzhu962phdvnbzc1K4Dn4GT7pa23NV6l+0UFlAEuEfYO797gjB71ghgErPIwrK9dZtVI3qx0s3HjTnAod4oM0b4HJULOZSiHSsdk9PnfqRRIrNUMCf7uYHrNMlEWTRqP3Shmd2jmZd5ZjTTF7BEeKean49fIP7R9xzQtWPGre3ZPGyjfHzhZnqM3D5mpvjw9wxVCneDIsC9whJaCJrj4XNc+1K97y3ZhLMwgOq20UfH/f8w+7SDYIbKO8yqRM1aLC1VPRws+qkL3w9+xuTizLOH0wnlc96l4Ky5XWbs7ZjIBAAHk0RxDybC1SPMTN/TGjH87kvthL1nwunn0T0LKxCyTxQB7hXdjzNsTtnX85VZvm4Tx1DlQvUAACAASURBVPqlLPItmY6LOXjjwcgPkvLr0pJXWf+Nrq1F9ZVYNogrdWQpAsHW/TjjSONIQRk/nk2ViTbMpB+3jV27UynEAPDD7zqgt94/nRr0sPPKlRsY51fApgG//FlPhl5q5SzbluqXzHudUAS4V+i0t3EdwM5WnP/eGfDY6DwJOZu+sYJArmsuslH4cfr/rKNpjxx/1JK2XIstWZ/bRPgQ07p9XYlM/Kwk6DOS43g9MccBKQ6Zr+Wo/M4ih2YX4Fvfsqb3P77CM9fnQY/TGmEGzmmln/y9Y756dNtclSuc7ehC9xUEuQcoAtwzbPDa5N3B1+aW58hWA4O4auKZgvKqPqnXfX3ZHu1b3uVryn1eqGBRW32NSNQc1YqTmc9to64PQoI8z3mmHX6/1JdZPCjvG9s7pS185Rsn/KW3rfHcDUYbZfQO5IOsiHAwAb/0mc04C2TpGp9EWXn/rrIhqk98nhXuFEWAe4SxkmugWZjDdsTvnoHZii/dBOBdS8b375WcKb/+oAu+9dHbGDM7UngjghZIW4bj0cEkPrV0SvKxY9Y+JYayCbwbu0gh77PTPS2AwI9fIPzIu/qgx+3wCQO4sAb+5QsN/+sfb85KbmO/5+6Hs7ZBxX/7Rs0FvieQMSkGcZpGBmJfaG9msCLJwzMfxBZ4gb3kPL3sXCmYY9EEZltklZXwwjqnnF4jorPl5aq69fyAwwl46/0THr0w8YWVbLuxBZ6/yfjEyw3XszjyoaxzgBnEu4kvSseGPCVuqd5pSgoHE/Cj7z6gg0n6uD6r7atoDDx4jvDCTcZP/O6pdu9J/bl94qvAxz1DEeC9hGqTTIJ9tllHQbJ4loaRl0eJkBDpJyyYcET2jmHvgq+zQsIk46oqbtn6Mc0PSf0KLlbm8QtEX/PIii8dEG1YggEgWULqqUvAOx6c8OtXGn/q1Z0RUjepk9YMUlRtKOuApZVmeiJcbHfXjh94xwE9dWnC5683rMxKvw3/3wMH0rkf/60jPpqfVjbHM/mN+0/r9+haSJ5XjcTXfOC9okzgewJTedlmoe5HHivmy/LL2GnrYtZGVkZisHIsKc8x1YwIbFOSB9edtWP+RZLivVlKPE5bYzx2kfBn3rTGwYro6hHz9WPm48a8acw3Nswv3mKcmwgfeGJF3/DoCsK73FNaH/WFEjpbn/M5U8fLd2YB/ttvWeNff3yFZ260Mwc9DI2Bw4kwEfB3fvcYz1z350XGLnV6mhk8bluqb14SF9GF/aEI8J6ByCTaqPl6Ay+JviCjmRuPZx/c/cdZMJKt74c8h56c8rxTY2sLvj0MXy6uJ3zdoyscN+DGRtmRwv/GDJoIuLFhXDtmfPXDE/27X7rG/ecm6yo5bY9Xa+xQ9iXG37OuBu1Vv+KNE/7iW1d0+Ua6HnasM9DpROL3+8VPb/CRK9tdRJe7uuTjWyK2XSQ6gz0LbtdnWTgdRYB7RnBb+N5MRrl9Zx7BQV95MQ1LaDP5DSOEngE4qmSDUljOipJ0Ylatj1GEKRz9iHm700T8vkdXmIjo5lZznjmVRVJvBGwZePEW480XJ3z7U2t6+4MTzHx3QutWZ1A+lVPpBSv5U4HT1/HazbY9ep74h955QK8eA7e2FuWJYqexKUP8fr/x/BY//6nFoEd3CTHnp5NI7syqkfz5Utg3igD3DBmouuqdsU56hNua8LKFfbt+nZmG5ocjpbLFA86gU9EIya3WhzgoDkHofW/G3R2+6uEVHjwkurGJfWTUPFBANAxc1aWl/q0nV/Rn3zQYoJQMukje7jPeCN1HxvIKyeO2gwn4kXcd0JqAV440349HH+xuRbVl4I2HhGdvMH7yY8e7yC83kb8vqcCzKNcdZcruvVcoAtwrTLiQvQhkXIt0KDx42Nz3lgvNlo+i2YfhOxHxyDT+f3t5ZnrFSMogtAagMRMQAW97YMKT90107Xg2l+1ExUMkJuSNDeOVI+BrHlnhO966pgfPLfRuaZpcX8i60124XSLue99+QF96ifD8zTTT44w00iDK77gBf/u3jvh4OZbTS+6TTd5d287Sq1J+9xBFgPtEXga60xuxIrT+j21//vUvERp3nm8e4rJaLlvVeTvPNyrZ0aDUom8DHj1PeOdDK3rtuJ/PsrPfC40QgC0zXrjJePNFwr//r63pyx+cvDQDOfghE6nnzWTCWeQEO49veXKFP/3YhGdvzBuiU/iGGThcyQKpf+djR/zcjUV35c5nz8K2pXI7D79Ulro9RYf7RBHgPuE/WU6EZOZob75SnyXcjyDqymmQw83artxAPomc3AyX/szLjsNRLe7o+IU10Z96eEVHW+YTZ02k5pecXqYEAeDlI8ZqAr71LSv6pjettL8SHCHWNEmak2zX52S/Z78gA/zeN0z4C0+t6crN02d6zIIikH4+cED4+U9t+DefX5R+mYhHU3cMbpxFc+7ya2Y7QC0DPpXAC7eHIsA9Q0aAzX1Nk//dlLWfcPKlRfVFElHnfRcV9X9p5Mw4jey46bUSRGwmspu+BJ6EMZ2WJyJ81cMrngg4aim1Bokk+w73tvoOJSgmMfDqMfD1j67oL71tTQ8dTuYMZb9iWTHvRnrkgB89T/gPvvyAXtsAR0vLW6kmTyQ/7sYj5wkfvbLFL356c1by2kVco4mc953Y9kiGli7FtBA+L9wVigDvAZamt1JEStOmMF31V9+TnI8EH1O0xAod8bk6klknSWgmvtKggJTN5ObK6z1vWNED54AbG18MkBad8VluLpjHXff9VBnbBjx/i/El9xG+58vW9O6H9KdI3OU1LrY3O7wEPX7wnQd0bgJePV62of3oCyyyZXkp0jPXGT/1e8dGXmcxY5f8oKfVWwzi6L2YJXtTV6cocJ8oAtwn8hrLADyfI2STcxxFzANAWuYlNA1lESFNdGkkxo+6C91bzAhuEXP89W3awFxqEYCn7ie8+SLxa0oklF9hiXmwohvZHNv8tGd0QE7UL96Slwt921Nr+sATKxKhQ6Em5RKMvk3yE1TW+MtvP6AvuU+CHkv98v6l87e+NgAPnQNubYH/7rfnQQ9CJ7Rvm4F6Auvb7fvmb1OgpXPwqFRhbygC3CuoIyD7k77PAwhkteambbSKbrTofpNkS6bWsIZ8n1iXucMOOCnJPHxI+LIHVv7qxyQb1QqjaD6PYFOTdqIqY5ZmbmVlOxHjtWPg6hHjGx9b4bvfvqaHDq2fOouEwnJdUsAfeGJF73tkOehxEqzs4Qq4uCb85Dzowfq/23k5+VLOyijQrfGdbaYYVd9GCcC9ogjwXiCTl4sZ7uinHyRd6ptLRSPCKM1dRR0heQqbEQ5FXalPACZiJoomJleFACbwxQPCO9+wwlGTAMLiKfHcFiZgSN3pJdOyEgv2nYixacCVG4y33Dfh+9++pvc8FD9NYvRRYlHMRADe9dCEP/+la1y5yYussWRL+j6WAfDwIeEffXKDf/lC88s49ndQgYtl0jG7t1Blohv3zQ/TBXbiKYRYPLewPxQB7hP9z5qEKCjsYDLlpe5ACnKCL6QnuS7LTROnpuwvUyQLEhHT5FFU9rKUhyNFIjRpXuCaGO98aIUVAccNmAg0kfEOu6U8KlHMvg5fcqF0/v1DQdmFgBdvMlYT4dvfuqZveXItprcupNrlKxL44fPiP7x2zDhqs+s/69TY0QbgTRcJv/rcFv/46c28csJtqsBFdZf64g8eVc2mbp0cB/Lr6bSwNxQB7h0uwWYqSbkqkyDMwSV+r9jeqSjl0MlYi+cDmwCaVEpmkpF/IQsn9Gb6BGAF4G0PrHDpAHRrK9vY1+xyolxcwYrUlTZNhMNVb6KanJkzJKWm+z3TBLx2zHjliPH+N63o+99xQPLqSYKtJkYA1gR835et6dxEePV4rvy6ZheIsWnQ4zPXGv7uH3jQQ+/I6SyTVFr3TFrCoBzjY9wc1iehnF9mR//pADvOsnAXKALcJ9h9UPn/HeG4MdV9ClKTf/7Lt+BGXuHFiXCCiTlVmyS+vNwwRTXlU+FIDagwAfzEpQmPXZjoxjbnL3p/eFB9NEYE1pMIxVeOmC8dOIH6QeP65A/9QO5ImWSJrcvXGV96H+EH3nGAr3jDpDmRUv0737amJ+6b8OKtsy9rb2hgPHgOONoyfuJ3j7FtGDhnEYsmsBGhuTztGTW0M/oF+ydAvNp0iXhL8t1DFAHuEZM/xN1p3znuu4n4nXkMZCdaJh9XGBTbg+CYCJ7DZyMvfyYhFDIzmYlCzRHJlK+3XFrh5pZZlyoFwqTW8wq1QymQase5fw380dUt/5NnNvj9lxvffwCcX2PmRwx20f+fsB6+XbwXbolJ/J1vW9O/+cQKBxPw/jdN9LUPr/D8zdYp5uFQkTgy/D1cES4dEP6H3z/myzd8pSnn9EzGicM7EzgpwHxMKxML8SyfXn9lBmk9XBYy+3upauHuUAui7hP2OBkCAj66JOEY7mrX4TIB1GxAGXsy5UVP2Uxl+U69hiLnT7I3b+h+BjExx9zgScdSgxDBlz20wraxyxeXWNb1nLiobznxpEUGHjwk+vS1xp+4uiUG8e+8sMXLtxq+/tE1HjhHuHYsbVuKjl2g7vMgV7tLSsBrG8ZxI7z/8RU9dWnCQ4eEF25xqMyxEvV/qdtEePwC4R99csO//UKLBbr749tt6y7GgnBF2kcwpUdRrzvluKVSj+fSUBucB5n0Hhf97RelAPcKm8jKmCheR04mzAblBEp+PZArtqwcSWVeUnVuJuZ8uW52xtguFupPwJc9uMIEMTfjlR4UdciNznHcEzNw6YDo5VvMv3llqzmKTBMxffZaw698bsNXbjR+wznCmm5/4GYOkz4yXj5iPH5B+nbckK7S2RpjAE9cJPzzZ7f45ac3Qe3kz5QoeFKnlvbki7xcwkzlOAxpNDul+Lj6Czeuq+8d/Fu4CxQB7hPci4REZq7uBvPKCvKkP28r70RlbSyQo6yw15FbTGezSgALWcbKzETAU5dWdHFNONqCTIFNQsKuVjNhepMqQM+vQFsGfv3y1tcFtHnLBJmN8Suf2+B3X9rypQPCxfXuqIFfh0GJdSpIL+L1DWM7BIHOgi3Lwg6fvtbw9z9+7NfdHjK5bEdEI+YB7E42Y7dVb22f3nV/JUG4QJhTGL6wNxQB7hGTvaCoIyGYr8sJBWnf1BMB59keQhReN21XtxW52gxCTD7ASdSoRp7F5ziB6bHzEx4+P/GtbSMhXh//NEGSkycA+pokT9EwTbIm4HBN+BfPb3B90zS6nKLOSZn+xpUN/dMvbHjLwENpGaw+04fRXZsd15e6/+/WlGN9ZnlfyVED/sffP+YNJzme6uQH0qzR8S12/ZqF3C3kOvaHI7C7YAWw1c/fYykffRhS7CrsD0WAewXTFKPYhI5HBz3DIQ30rLJ0apqYnkFEJtAoN6Kk52Njoi57IrfLGkkGEfDA4cRvvjTRrcZQ/cgT9IdAbASuB4SY8pT6CPClA6Lff2nLV240UZfqqJwpXJIVbD79asMvP73BczcaP3xIWNFM7Dlox5cZsxCdmRAs6PHTf3DMV25kbrHbtrAWYQ4mmf/uBHXHLq9V6HYzV6gny/FUpEIXVNFg1fx6lADcK4oA94kYWAx7AUbIO1aPGoXZGj7zIDIKtahtyfYFwlTFKOtIKWEh+/8yuRIOVxLxbQ26wIiPJ4kWqwns0Wzru5ZlAPcfEH3+tcafemWbB6sr0E6NygImIIBe3TD/8tMb/PYLW77/HOHimrrXBYzIRDruyEpqiRHGCROPnif8H5865o+93BLBxXL/5ukkZtJ/vVGcSKvz19m/pN46JTcr193vblv/U9FrN/xOaiLI/lEEuE8QIMvJE2V/2qTRXzGFktcbRhh5vT5Rfva1C2joyLCIavwlEImSc7WYy2gbb7l/wkRMG4+eamaML0Hqawu4PafHJQbovjXRq8fMv/PCZiRi/SHJQDU1Omk7U2L6D1/e4kOf33Bj4KFD8ted5bYylsd8zlxZMGW1kcbAmy8Sfu3yFr/yuXhRcVZWTkruYpObk/pDqfFecvZTrKNMSoGSctF2fh768awJlklANJyWadZxe+HuUQS4R2TVZAptKJB8dAzyH7arPvZo7JRJQZhzAmOCqz1JkqZMVEyqwrhTgQCeuG/ChTXheCsBF1cZ7nOMdizXJtXn8yvixsy/9fwWYCbz+U1CrqT94fAF5pfGqTqUfuOTrzT8X5855uduMB4+T1hPlN/KPvBJMIn5wXKhPLc512sQ5ff0Ncb//InxnR7d6tywxHC/mKlMvoXpfth6th5E8QeH3uOhYudznLlAbMfUvR05rqEz8R1Efwonoghwj+hJJBQEwU3YPsmWYlB5QQQ5TWm/DYak/pzkJvfA00z1EZgeOT/RQ4cTjrdZafaqS81ngpKnJFdLeysCDibQ7720xU0JejCpEtX+KEGnNtUBOPgP/VivHDF+6dPH/JtXtnz/gazG0npuW7i+J137QGNZ1fmoAX/v48e80VTDmEKYVBdi0Vo3gfX6643hfM38vto7k2NHMqm7+2/HIVPc7iXM1VXdUXe8ZKZroeK//aII8B6AkHxG1H3OpNhFTtNafi7+bLsQUpdq5vuTmW0WGhFcCeLSOcKjFyc+VnaxGz5lc5dUYERfXf0QgItroj++uuWX9AVDORjjfkfvAzBNTqKYtC+juWwk8WuXt/i/P7fBloE3HNpRB/JYMPt27WPI8lb3HQA/+4kjvHSzEeVk5rx2BKXP0bK3OMWrOpH/dn1IfjoxUTmEmnTQuItz2/m40Y6tPRs7FmImhT2iZoLsEVkMqAKT5H19uqeCbP4j8vcHW9g43v9gjWqwgCcitCY+NQZTA2EC0LStiWKWB8A4mAhvurjm1iTllmSdZZk/xwBJ1JdivCX6Yxm6960Jz11v/LlrWx/UE4MYxM3OS/4SqyoV+4/NFFTvPYGIqTGxVbFXVX7ylcbP3zymDzyxxlP3T3j5qH+fh5EnYz6jJORzdP3R84T/8zMb/v2Xm1XXdlh1ICcm6tUgR2s9tSpBcVKMfSniUHaxojWRtcnE7gNkN9z7aHjMdTbya+jTosoFuF+UAtwjwlSB0QAnE9HNo065wciAU/SWyRSUBhHM7AIRIcxpYSL1w/WRYIAev7iiaQKakF+3/t9sgYUUAdG5v3RxRXjtuOETVzeeG+g+Ruh33U6D37H7DAvcEE+yXBdg505ME5heOWr8C58+wm88v+UHz0ni9M41CXd8Z5blrT56ZYsPPbOFppWnVbSNgCQfMhMLpe8I2ZbmVbNM1fHvodq6dkhIL2+zY03iKmT1/TL6Y/ZtyI0ZZwWXCbxnlALcN4ycGOJ4YhnoTfcNj3wGgIllv1ZhAnFjURE2ZCcwNSKe2ObtEiZmNGtHj6MKkB65sMLhivio2VxbnYYqrMDQLJRp6qOaJPEIOrcibgx8/KWtDmJC07qTaCgiABJbZZZzkAK6NB8zmRo1JQhyErKRzBHyZgD/7NkNrtxo/E1vXtMbDwlXj3ieLpPKuzJieaHR515r+Lk/3khaniQizbL3JOIbakwfLWzX2aOuqQ5bb11FIprwEuR9msPaH7bl9uL0ulPVh93sbc+Fu0cR4B6RB6mpOyb4VDHdTk5aqTAxiQnLYipNTLwF1AckUz5sLDcARoRQA7MpKTSAHjqc+P5DwvGWMUHJL5aS8ozbifukZ+0uVhP43AT6g5e2fKs1soDAxIymvN6CdAkAtkRC5ATWdgka1Y5xy/5lMi+ASS42VQv84dWG524c87c8uaa3PjDh6q2Y/tYpJjtnZp3pwfjZTxzztunBKWU4D7TkDMeZ7DIx5hsr6hX6UNIUT+ZUls2BoMycP48ENzTdfTZzWZ9yOgMofMVlAu8XZQLvEV3Ek/oB674rMRU92JDMJEQ+oPsQMRH5bIuJ2a0iNbVgi6jatLcLa8Ibzk/Y6msh1bSO9BRrVz7HLBDYAgugCyvC565t+ZVbW4k2q4OfiCyFhq2/0g5hZX0GLJWO1fR180/Sc3R6HplpaKZ1HxR45Yjxv3/qmD/y3JYfOEe474AWE4EZwIOHklj9c5885pdu+Zw0cz/019eT9CLFJP6pGjXeyWwLPTHroL0eZfhsbc7t2v5Ydk3halMCWG6aKwtGl+Du5ML+UApw30hedI8KmiOcUxEhCxnTWkdNYVZXnwgYCtNJhY3WI2pgniCueWZgmogfubDC6Mk3UUIqwXQYyUjTIS0fmS+uJ37hRsOzr221jwQTirK8DXGTsckTgZiJm0qelZrk4v2EJ3xMnFZy6tUvx+Kpco3UFvVAyT97doNnrzd885NrPHaBcKvJSjAE4PwKuLAmvHyL8b998gh/9HKjidLENrdbEaosNhFUbes1cb8dq48wd7THoOi0s3KPk0oc322Qt2nievINpJZcoDoZulguCbhXFAHuHUZvOv7Vc9OycyhIh7NvkJUE1T+HiYiZ3Y+m1UW6NNjagnYY8MMXVpgIOG5hkJGNLiNF1gm/vb3OAHA4Ea4fNzx9bWMRbLD2UcxaiUpO6kVrasVOwofIxBPzLqR9Y8DxXzoxQN7ZxOagtP1/9Erjz18/xlc9vMKT9xHdfyBZ2pdvMD57jfk3rmzx2kYmcHSXmWDZfH4NEn/IlB27pukSyb5uhkZ8VFdEngRi3jkjT73yybeqzs/hdOHHo9wzm0KpL0juxWS5AfeLIsA9wikHFpGVEalBgSA8AEInFE91JT9WM7KlNJgJhAbQBFdJsLQyDU7iwcMVzk2ybp5OS/NByND3hXQyyIc7McAH8iYl+swrG6i6U/KVBRnMbzmx9LuxpvlwAyeiVlVDK2Ju0HOXeISKzHS9SJWibbYMOidrKK0S39gwfu25DRjgc2qz39ymMzFlqVSXiXAgxEzU7NkrCIZK4rlrIERtn5A8eXV2O77jKcpdSN5HxLwPsaSdVdmuDykVWwMrFPaJIsA9IscAXRGYCkn5/zLwKZGhCQlVe0IuYFiOHyfVxb5Mqb6ChC8crHDxYBLltyApkt1s34MCCFiBsJ5An35ly8ctRZPNLJfABtk2MENfA8JpeQF/F0gTs1J8e6YGKcjPBn421YUowyEWRKVLWntmJNNRE96eKM7JrqFdZ9vWXQc2Ls4XJghPTPxQq9Hoovhyozc29LwJMwW08HDdvc2OqEeFJxWHBPXCvlAEuEcMicQ+A8EYSZSgpZiRRUstlYXYrMhkSjqd6jY1N0miq8QHK8L9hxO29kImaTP5l2LQJKuX3c4G+HAFfOH6lq8dbWlSX1yYvU4OYQoTwKzmMBnp6TkS0QqMxr7OAVbEaBrGZu+iXxcycz5PEkvzJ7hLINZEan/ULCjLdMldU2XhF0XCF+l+13TFEmEOrVsHdkd3Uym/Zuj7MHoA4iEZfdMUGFeIRYF7RhHgXsHOMuTjXI1cgswfJcnxywNtkgHoKTP2ittGOruDhXAYQhKmulYA7j+nJdjy/WB5f3b4GTk4iHG4mvDyrYYXbzRRdWz5huhGvmmdFoTHk7CTK0Um0CSv7yZXsHqkSTZjaxMltE1XN8a05ktUKiQSopXa5M60pJ6NTJXOkxLksLJpONZ4SSiUY5irPdkkEuWFrLyc7JTuvLbYqbyu1awhtajdM1XCeW73aYxbuD0UAe4RZEyGJA7SH7KpVnkUDLaW+Pxkyli8QElSJiyQYsrx/MGE9US8UZNUSkJzmf1w/ejT2C+D6dxEuLVt/NxrG40yy7Ja1i0nOpZgi4Z2uFEkd5N5xsQ8B4l/0NlXFaKalywRYWKPfhMkdsF2ftZdN0o1Z1Da0cdIUlUzJjPPnuTY9EZqXAfibD3HHjNXrS0jTCC5ECWuz6mOE+NwN3cLtkx8SR1mqwGQi+PkTgvnUrgrFAHuEdmf09JG8yk1XSGZQTwffe7mEbNJCcGIhpHUIMm2c5rlPKlJCg/cyggVthB1kw7HIGCtwZov6BxfzU1jZvIE7mzygoO81denRBpJzUTi17RACHMkaUMDvKSmNFxNumHn84iVPsl8cmHL05xV0vU10YRBuvUeT/8UpnNsdcWclKKpSLu/ZlqbTsvuBr/G47bsDMwPvSVlSPlUUySYxoKFu0YR4B5hP3pVezCvFrspQ0FEpnBIpRpL8IAgc3cBmHryvzwcazWl9LqOGyIYSgQaB90EwmoCP3NtK1FjHYiNARZ/HSBzjMMfiJgipmY6Z6J0TpE2fBJ/IlEPekzqW9MAS9fhuDbaVPoOGnkmriEATfGJ9BWbQsdGV2EmZx9igEwkx/WyqYGkmT6jClvIMZQiZHNMgjRTprcfJp2dn4YrT3gCvfsCC/tFEeCeET9S4QoijnnAvjlXUP8WyfJLkmen+X2W85foQSLFKk2giyPwUtMcW0wUqal6MAEv3NjSjeMtT8n5pSvLqKLTFjx9mjwIYiZwOoKns+h2PflQkC33TkMZ4juU7Y3AsgKMM3k3pU6IrGvDPkTKCyU26RKR0yPJ74Xm87ihDdeaC0qrM0uzvTvNy0aRYLicZ5jOQRRevrddF60MmVBePljhzlEEuE80VqcNgBAKo4qB/+RV8YmpFzM+WCtblRxQ0H0EVVRrkjSTnGMRFlpIKevIuQn02nHjV25uYaYzQwIrZnrZLA6G+PWcJDnl+gkxe6I1o0/27iLcHFFrBsCNRwWIiY0NQr01gvOecaPts5IWFmZKCX0AbDYGyzw16z4iVYnmXNI/pNwKpt6ejej+vLaRl0tzV3/5J5CUbOJxy+O2ThDpw9CmC4rSTuGfwl2jCHCfUJvRhELyaWXaE0cV9wpq3pSay+HbC9+atrttjMMV2XqAIWS6ISp0yQAOJuLj1vjF6xtdvl7m21lQ2kjJzVoGKLVF6PITMYlqcxL0/MGOCJl0VT72VCCd7REKkCLCgFg5Z2LxF9o8Pb84ZFYmlOMwXIAgvthkR8jZjJSsLAAAHwFJREFUmqG23Ez2DS6Y45i6LRXpkPI9u3QXZdL8lre4O6n2Eh/TWGzXD6ZwRygC3COGp7yglx0+eFJO4FxbmEkEUYZGlJprx5Ymc7RtdH498WoS89FCmzJ/Vw9FxMyMtfoLX7i+BaDzeMW9pf48U1JAY6JJj7cCcwOpEhSm09CqT1ww/6TlAsppuxnNNClJh5AEwJ46o5kzxrcsq85I2y6+yIkKUB5iu2YQmShlqWOnueEYwaZeMPbU0pGf0fPAULaIhN6ymYXbISLKZiJQouKYl+33PgwIIU6bT1Prl+wTRYB7RT+Xibo9ybfEbhplQ8zVhyilGHQm0SbNlfZgCoNvHG9x6XAFgpjCE3lTbj6up4mJgCvXN7aitKaqyLjVSSI+M2UiIT2b/TERewd1ehwRxWsbLTcQ0OAGOSlSUxucXMWKn9M7CAu0yGoxlsCzkoA0Yjqdk9uQ2agHJlVx4vxLMaBObhEnpSVFQmEb0fWadOEewkS85Un7GoeDPpu3TaYjVY3m3wjljukxSNtWEkSZwPtFEeAekR7tZs4R8jAySYc+pQUmf5DMP4QJ7OawFO3U5KYxrh1tcd/Big50rfzGtuQTSeJ1Y7x4c4ujjbodWZbXZ1GT4bTUsIFMkJWVUjz3ECkPUXtiji07vynN/tDz8FxGUWcSG51Ip7aluXBSV2jFgj7MNoc5tLISbmcUuwmbvpKr39ja0UdIdWX3tGS9q28nqpQGk9OVnPwGntXr42SbLOlU0kMw5Pe1J8T0z/eVCbxXFAHuEabwYq2Q7E5309jNwPRj12hvWh7BB0fIL1NbRq4WqNhuGVfbBudXE68m8perb5hxa9tw/XhL26bT1pJJbX1IwRUnxAnEOQBi404cXJYOI6ZqSochK5RSaCQ/XJfOMv+lBTlgRJZ0cEr/4QabRQI07YsRbUc7/TQyUZacVJUqtklDNhwWvBNhcKK0JGJN63kbgJFfl9a0gwTjd0G6VgLJ8gZOgoNCHOr4C6U4WRCFvaEIcJ+waV5uG+kHCGGR2VbkBCBPeCE0NU0Hr5UrFxkgllMHQI1LXxyBb26aD3wjGRtdEzGayU0lWx2I3KW0iDB0I5qRprtB2Cq9sMjIzXPums/68ECJfmaPzehMETKTPlaTiQnUviiE8CYB7hvkNF9DotaYGauqtZEoCRx3wScLwhZagH0PM5gpvgWPGnl1L1Na1mUT0D/Ech1fNcuzBReDIDBF6+dSPsB9oghwn7BhRJaEEsaRE4WVpVgo1OcuMPoVTiwxGskkdtUi4yWXJwKZ+WgGmhKJEIgGSRgUaw2miVyi/JiarP1Ck7rkOFGDZfqsAJbFW2WvvnySuygx4D4+UFweLaNpNkYOkToDqMnttq2du6x8zbqAgs1wSa6EZBj7dfaZHK6rg+u7RUuVnnzGi36TWzMjr3FSml5YshzoID03g5U8Td2NLcwIkJgmpvSy+ZJ/+0YR4B7hFp3ICvXWCwl2GV5mmoU7n3tZApi5xIi8uzy0fQVl3adEEAEIHSue1tLFZxgiHNUtp3wpyot4RTIv2HyJEhBJ54Je3bGeQbyBV2eOqMmdVpYBp/41ZltxmlpoZGtQFGLyGehlY1u1Zemtce4rtOPAp7FZLrizoN6NuDvJJI7ngs4p7I/EXb18+5MpG6oRfqE6M5b67/oQnC2dFsX9ahf2hCLAfSKRlKUhC2LxUxs69lOmGJCe3hLtsf/x9/xAxkivBrU4pRw8ju40SmauEZHGPyUXUNNoYPN8JTKcJ8GKWmNdnJV9OXxThZaw24S1ubnBb3XiErXUP70gnRmeidPDy+lU7RR1xgySxhNSMh7uKYrdOwh52sQUErb/hJPIZq6laLUdRrvU36c4EXMTJt/j7Gbak6hXoNavdGtJ9Cgpe2exXtgPigD3Co6nutKPhVWhOXc+DiFDwImBkFc4SWsIh8dL1JiOw04IyGC13ELlJvGoxZQyJ5eejFjNUop8vtSemsUeyRUS1PQW7etEkJeky2KqrAnOxCBuygRKrB5Q6KfTsRNsDH2WQExKB5okcqxqVa71SuvbOZnP0u/ATPFFucyBynbMpoldh/Zmr5bF3ATWbR1Bpa9JZNoNDM9jPNxGfssBEHumFPaHIsA9gtInm6crMHnCGiOJpFhbqNnUYDaBEL93+65pITGFjNhWYDYC9RzB0KOUewGyxUclaRrUVLdYmytNf7H3Fdv5gLy/boJm1eo+Tu2Hp7+46iWO4EaYw01z+7IaZpKHw0rr2EnBUizZ3s0h/dNcRU/byUYqY7imnVZ3WC7fjnvbaUnraKc4c4KSz9rL5rMtqgCfQ2y9CdWXygDQ90vDqbrob78oAtwjQrRJvt0EcNMRYANRn/Luc0vuH3O+u6O8WYaYcifSoHX1lM28PKzT1DPbp/HD/KIlAmJVF8/1gw5gkjm6Dex5i0ZWAGwVGZsOZyunAGSrwGi+XzLNY/ZHvBDKfF1ihrKvWmCvAZA5w3qmHHLJiF54VLqVpwsiniv+kLEHilqXXVLfyfc0boLmspi8d2XowRG9Ls67eWp2ajP/Foz8MFi59vpSmgjUPE2qsCcUAe4Rxj/6w1ZfEMdOSTB2IoTm6Vp80fkrjUobvIhNNruNbJDlpapsRAm5SBTR1nHKUeiJQc2WfZGuUAMkAMKEhaXxEa/hVFUHNlOW/UwJmJqa/Dqzo0FM7JbXLKRoF0KctvxWrI6NPvnat7Oxivg3VXLqieh6DrI6gr97xMxL85+KSNWLkRI3e48c2yYmu2f+3PG7kg4O59Es3Efi0256fTd9qSe//veULYrCvlAEuEdkOZHmZsk+5UTJ+2IflFIB3OlB3WrJxHkUrNhlDZtF2EyJiOZgU3OcDcFQoD6FV5WfLFyafIVmilqk13yCCPKQiG/jWAiBY/4uyFaRFuVj5AUQs9rQ48oxLZmBRrxIidhdcMdmkgj5w+ZBq48y85zosSmCPHZ/kpwO89g64Dc03dZ+Al5obfnk9ilFqo3LdwCR8jKqwHS8kd4o/kn0O/pc2BOKAPcI++WrHHJ2kITo5OvzwlJPSCdc77MVhikNWiUnMyWhQYU0y8LnAEt58uWksimYUmfCJJURSCs1T32laa1oq1QDwISGNmlittEvu/lpNOQ+P1dxUFVJca26urD20S2T70EaUmK3yXLaFtj9kU6kzS5cLjMQTtZx+WMir76CFrFkd8CeKkm806D27E8iWhr+IinMtMgCrcjSfsgDZYX9oQhwjzBfVuss2ZhVYVG/JGaSIDBNqBMQ0ssZ8xLBpswolAdMX5picRXHlH2AMXQ4RY0pLYIAIzOOAAjpsllIuX/cTXFLJAVqLvUkxUaOJsY+E7hJGDuizHoW9u6QBvjkWukT+7qDrOZ5dz4p2DMhZCwze8J1vkoT1HkAxpbJ75FceRouZXdr+wwUQu5m7FsguVD+caws/wniY43iZCpcfB32FJ0ZCYW7RRHgPpFIarSqjBHJB5hbpq4OPTrre7pBlwZ6YlhOlpE2bGzKNotsyXaiCFJY4KCpwPL5wLpAQVolhsTcJF6BuOmMjDBTOWayyHJbQkqmLtkDJ2iyyIPvE8Vm08dicoua0P6uqUkyYVRJMmDxYOFae4T0F81NZxfZYAArW0zVnzERgnFq9I70JKiF+gUZUkG4SZwTGTlVlS2TMm6iXlvMhgm+wg/bNMTCflEEeI9gfhtzHrlgscEY5QCC+898LkSyk02zGEnEvFBY6m2Yt+H0l9dnGimK1agmsE0tI06pHL4Yqi024KTlnymiwdIPG5guVzl1zSPKql80B9HnizDcT4DmARvYawDMXCZXqRq1bZpvYu9I9oiELYQKuGSUkhbuNQYMwzeconKdZQGGsGnJJGKYqNR97xWfP9v8MhCQZ+NJ3+LJFVW8qrVHdn2teJQv7AtFgPtEF6izDOiYmuvlxLbphJmPIx9eYke6QanDxdSamUQmJ9w6Ymu/s7KMVv0YEike5hUkmdNMmPjcBiHXmbkMDWDosl2+X830Jrs84mr1JLgiX2T1GuLsn9OUHF7BlKGQpZ6XZNwQqfnN7iYwbksKOd2enIQeZO3pePphZcSsaM6i3nSnqZNl2km0yRq1JxhM6XG+YbrEqT2TvGkmqGJmQFe3XnqdYOEuUAS4R/iQ0cEfz/2I4JG5dMT6M90XBfVrSopR5ZcsqTytQCqN9jbZ4HdlKPtcDNnLzM38zGktpNWnbhtcDaYEZogSgwdboOk0RlOawydZc0rpTUPhsYS+KjpSUpalqjxJPPkjAcR2IU89P31ShLxk9xvaoqch3VLUxa9y3DpEfAMAsDJ2C1V+sj8ufHYSvc1Sz6rFPeb+e9xGqyG/JTb3SUnAPaIIcI8gwk0GHjC2MHXWuaYsby3B7CmGrRciW9NMhlh4gLsREPMi4IqMdPqULVNF6TA+v9eTn1mPJMtEWW6eBaUZ6NQeMZCmyFGowNjm8oWZqRGwUvEmS3BplJNDFccyYOSr3jBygCWtS5gIT9dG9KRyRpjANiNGL388BABSRuyVM8hUuffMyuvzxALb1gr6D6E5TVLmXD8kcefklh+AUa1LjZHrY0k/BBBuobA3FAHuE4yXCXgMgDlubHpUsnjTVAoFRVZFMlLTaMibldTG8WckukJMB0v2nYy5THbugurnkRDSUlaJdP2znaoRn5m2+kpPUCzz5eku8Cl8nCLG8ZJ3lggys5m1njDt7yHxlzQhZrFoFNozy2WqnSvI6KyammrM+xxm3cVu346ySwkbzMkyHTWjX324Ds2PPu9aSPj8AHOFmJjYyBZIa0bacZmuorA3FAHuEQxcJuAdAOKH7vaNWLxsiwizz7+Xn7Ut+ymmkL2qTSqpyUYesMj2sh3Em52JE/JpZxboZDRVjfGOYXIFZSsxpybTGM88wbEgqnYg+8uEvJibxwsil1D7AA2s+JxinXYHW9QgB32YfFVn8UeaCUuw05KIsS9coMvcM/zqmciDLfePTHIxU0dLmpLzh1ES8N0Xk+asMj5Nzukix/YxFHaKw6RbJgJWFPlKfxcTCG3Cs6f+EAtnRhHgPjHxZ9Doz7oY8OVdkiAz/1DaqCYbAFWKRoIIlxasfpoQ4L4s4ygbpqE4YZtTNFNMag5O80TeCEaCVP74nOFkEq+gCyGopsqBESOBluxFJVQ3pS3KS9ZX7VTL/WGJDNuyob6cf7TtboGOqJW49ZouXOdQ35OpZyW/EHjGe5R04pCEEkex7/JnGiV62u0kF44MX3ILocjJhaOs77iieAgA/Mco7A21vvYeQZvptzXBS/JKdLCbGiSyeZ9kU+LMtiFSa45IkzeIPfJnY3siyLtufXAJY5EPJjPphFgsjWIiW69PuuLvmaD4AZAOeCkjc++Joq79o6487F231pwT2OR1SeuSRHvJEn/J2iOSttnqqAlIBIL1o2s7/dXPNMUxWa7TeN5y2cjes+HnQzzpKs6TlplItxFZXRDJijPaB8ptTkSe36irNxPJ/fNrka432fb+n7zHWPsk9xrAikAr0lsNxrrhd/b0cy2gFOB+0fgjtJKPpsv0vRAAlOvIliYwqPHLsWCIKjNb+iQUoAZ1s0qC82iytZJYcfeYHU3VmAUPiCLaa40Q+dqCOp0sWhRfnag/U4ITecAilvfi8A+CNY3FvoqfDys1tccFD7QeT2oGM8R10CyjiDyCTQSwvyQJoclcriKuDcdnplB02qav5dBFjeHt6D2cQiLGrpDe6tsQp6H5EFM/YqK4PQy9GXu3i1veDOL1xLwiSYgm+T19BIW9oQhwj1jj2oe3dN8rYHrABuB8EMW0K10WQeUEB09qwUSGsNQZD14ohQVZGv+lrGiTngqCm55gisUPkIeptqR91CW9Uq+UUvPCCU6OYG7e3Sgj5MhRHvCXt1PMHtFFVskCR9plC/DCXw/K8Fkj/uY3I11nsQh4G7XLEYMVje7dIE1PCYuhq0ma78N4Z+N4YicLd5LcMm3S73ZHrDn305arSK3yREwHkz2kGJjo6gMPXPp1FPaGMoH3iLe85S03CPRPAFMSmrpFMfABwAa5KTkrZH46N/fMPoabW2raDnnVqh9nh4EtVRUIU02PDVFtNt3KzUuKum4Gk5iMBOtMbx5bncnMYTPvINPexOyVf0Ru1mfTliYVWfrZ++pmrW3r+sR+vHx+47kMZcwUZjNRpRzTCskM9j5wNntp0m1x/sRi5vs1Sv2w7xTXTafvuHlPfX8JwJrAa/VvTETAlj/0XW+hG2f+QRZORRHgnkFM/1B/+MQgNA1PAi5qXBW4QPOk2SA8b8+LAEhaJZGXjB9VHT7wEhs64UVb4bOjoY5tRxqUiIEavj0nZFD208n3IFPI25eMRKL+QMbWl/BbyudEEu6jM+KhTHziwwOc/NjugxG2HpumdJJT/pcuZBCVnp+G0GeEZn1P/zq/49BW54sdjp/8qSAABxOwJo1fM4CJfu62f5CFE1Em8J7x6uMP/sKlyy+/DOaHSBYMwIoiM4zUDNLoRhhTxJ05p4QHBmwqWviovJ5HigX2wfx7UIsM5o7yNnwJBUJEVQELLCfRaK139rycQ1qVun+pEqTTaT3BiCjrjGUVNjwBZIuq9qu+6OrORGbyai/VDo+kZfUkyIlG4D1yCd0/wHHtIoKcz9WuVXoIEWzKTnpyAfleIZeffeki+XE1Ke5nesLle4RzkzdIBFz93JVLP4/CXlEKcM94L9FRA/9d9XeROfn9h67QFaJA5nAjuDiMsh4i7rbHoHEzitMg84FMkJQVM69dncR+sm1T3pYUXURGkUzNpJJSf1xdwRWPBCkASJCTzFRXhcakKs/SPdhVIZkJHBHwZGbTlC5NZ+oSOmW5UhM3RY5dneYIeY5y56gtxT5ehdncm9qUVHC6JmZip+vBqnJpgkR3k5K34xAg5CfqRPhzwvRTH/xztDnzD7FwJtDpRQq3i2efffWxWzh+TumM5WmeY4nmtI9XL2Z5Fz55+eNyIYkVNiES0Q/ZbjIFOuNL18+HtmEzUkwJse5g2+b144VIsjKLKKqWprDZii0WfLDPjdT/ydFmi+OjRR0vE9tIF1DQNjSnUWZ5dMeTuppubFnHNmMk+qN60FeUoO48tbimqcsxSWepAKH64u6omk7C2GD5z0jiMN0a0h32Q/A1cJ3J9bwI4IsrWVxCchRxfLy+/+Efehe9isJeUQrwHuBNb7r/ciP8uD3dGcBmUIGiEELyWTBEv3pEF/CcM83UcLFnk0T6/DxXIDKeSadxqcAk8/mlAIO/aHxUmxbMmNL6dJOsao/wh3XqEeTKDf6WN/Ghhb9uRa68uFNABBBxKLkp+QMxU22silPy/kwpWh8ImMCeOyltkgdSuj5rW6FMrc/hO53SNZqm1Edi+QfGNM2VZfKdcr72KejkqZ1alg8neTOf3YiJVv9tkd+9QSnAe4SPMh88dvnlK8x4EKooDqaGlSmhobwpPIbNSrA5rTZ5LuZXcactLKuQ+3ZtkixCoam4CPXnarBXh/6OXVNaSR1mpafKC41j3lfjUKxJ7XVtNEjyI4OpsdWLtpvwtpVPix2IO4H7Pse1UzUc5xsq1o4h58Vx3qGIQ+HBK43C2zJ0mJOCG0B+S3zD4Nq1B5w/bEKZHkzAockSmaFy9Y3nLj3+rV9OtQjCPUApwHuE9xEdg/Ef6jAiANjom3+Wnjo2IMjynz30EQm6sOnCZLLQFGJWioAlXHeqUNQV5+OFLIvv1o10HO6+p/67IkKeXREuzRTt5UFxebpIpKBwSnshK6/Ky2eNsCo0L+tKlZJqo85H50Gi7J90XyT5DJQu+pvPN/nneBX9X4wAq5oc/YqcrmU3u2XSBx6IaQ3g/OTtEBFw7nD1g0V+9w6lAO8xPvOFl34GE3+/+rd4AvsTfq4E2abPd6uZRBnlRgvtukLRwkmVARYohTCfW83h/zLVM6op9qOlbabEdGczZcihaGcKkZM/ENCZHPKuZC+nas98gPLXlS6F2uPB5xiqVf2Edj7IvkezI23+jVyGtFJBXFqp7z5HaE3ALhkhzi/0dxSjQfkhlF+oPU77lBAlWs50fiWmL+uFXa2nn/2ed136fhTuGYoAXwd85vKLv4eGd5uZMxHjYHL2QeKvhPSuX99nspDyuFWoyRsE5Tt8sLM1p+zJ8bZGRgRLLNgALJu9eXsTM7IjMzdlNV2m5XaM5Lq2NdAyOxZTU0aSIEasAK1k6BMBm50ERvKbEzsQtmt+IEDPwZryaM/iw0juR1jFQXRWTwIbkfAUL0YKxWiLRJxfCQmaq4OIPvY9777/K1C4pygT+HXAcTv4ZgDPQ8fEloGjZoMkYriDeMjjdWZ2juao0EgU7ExVW9NEjUHTX7rYgs8sSQEQWaadU4Izwhz0bvk+8e9PiCBDLqum7DgzI8x1wNNIxhQUAqdkaEaYzB4AgQdkKPqej6EpNbEIBCJgomU9hSX6zrO0lvE6+MyOMHH7VBr4ufiskpwgzmBaEej82ladJksVvXJ4gA+gcM9RCvB1wmcvX3174/YRZn6DJUhPxHSwAq/A+rrHSN4Fsika839ton5uW1RK5G6w28SaCs3Q/6cybsJqG65CqUuFSYqsS38BzFwNNZUDGcy9GhRFOFdouQ1Gl1rjZSPIQq4gAc7pNADH2+uSCetmtym5ZCpbhsyCK8KuOWVRvbBf7ok6HDylaShJsaxWJyaxBtO5VSSUQ+7iy9t1+7rvfcdDtezV64AiwNcRn7189cu33P45MR6F+KQYkOlOa81RiTy2IUcwm8QJTohEuqw8ALO109jVhtRfZgNfdjeOcWn+tjCT5yZwH2UVVmlWl91Pyb1ZrCtGn2QCw3yU0YfG4SO0/ne5fm4K+wvg5QEQ5cTvmK+D9Z1ViJExZH+NPY8S2ikzYaPE7GHkILl/HTEGy+FgYqxdsIurkIguM/jf+O53P/CHi20W9o4iwNcZn33++SfbZvWLAL8vfPYyBNbEtNJoZEvDalR9nAeek1HnMyRWs7aP+zIFecSCCpl0TEmGKqKeBJFUlK403ZMZ7F27rJPVOsKzFBcgkp+7xOhBIYZ/kLuASKhG0hcpGYcZiSv5yrnxoP7gp2BS0TZ2/r4FtZ2JcDdMzs82riZgTWLy2gIw0tz0m42mb/ued933zCltF/aIIsAvAph5evryyz8N5h+wW2ADfwJjPVnysY4jJ6xeweQNZuIB5GvFu6RD8GD+ayTm3xk+szgTjqutKOckkk1ZwE1YQorsQvdbUMTaaLKbmvZBykSA1aLFZhZH+yzrA0i+pNu3SQGbelTCSy9F4u4aUIoDza9tIuslMLJJa4qvK0HQFKEVCfn5G+YQk0Ia4+9/97vv/2E6nVgLe0YR4BcRn37mxe+liX4cwJO2zUy/CSyzHSIvDDmLMKsTHr5rgTBj07Q5AOK91/VnmH1Hp76yYjK+61RaMi1HM9nMYZjiy6Yvp0Rp6NL6SNPm4rOn2TR5sTAz+5vTw9x1hcqdn9LMZwRfozOD5VqEQrTrZGrRr6Ff8vAdpOs8EqANKAmIyHS2lZm6JG34wqnA56fV9J985zsu/S+n/lgK9wRFgF9kPPPMMxePp4t/C8T/EYBLAGzgJb4SJ5GtoQcfd5764p544a5w7sMkHhAZGYh1VZU8QW5SmiQkNSHDTM9K0OtyrNQyN2N9JRcQWzDDzNiZqkwBjrQNJAulKvk18sCEB3GcCO2MGf7XXqYODH1PzDaeEyHPvskkyJgbtj0s0qwSL88Zts2YCLfalv77+2688mPf9r4nrp/YYOGeogjwTwg+8YVXHz2kzV9nwg8B/GZ4dFWHZG+hJZWmbxG3cS5OvlCHblDCpomRDkd/kTmEVCKh2AiDrFK04woxf6beTHXy65SkBkMisECWCaQCzkxgh/j+PFLQRZnhgQ9Xhd4bdrOenFhDxUUfTVP7NdWzjsTxfL1ZXgriJzjcwBzeNQK1qSlR5FkG/U+b9fRT3/flFz+HwhcdRYB/wvDMM89cPF5d+E4G/jwYHwDwsDNQIiExEnuSsb+ha5bTPDhI1RmHKcggR3kz83o7eZt2zYIrwDw9Jis8r69mZkrYRmujAgzzVqLcKvloYfaJEo5fG98XCtDJ2PpB/r/xYRMnR4mEGTY9O1/eE0GE5wH804npF8HXf+G73vvYtdNrFV4vFAH+CcbHLl++dF879w3c+KuwwlcT40sZeBL/X3v3jhMxDEUB9KahppxdsCPWSwebGGqakUCgmCLPn6BZAMU5ZeTI0YvyYlv+tDxmy8PSmNn2mvvRE2OSPmY1Zjj3D7uvpjiPKo5xtyOh7LNM3VNHN/1ppWVJQLNFV/MaK4W08xK3Kng8d2byrNUgx96pLdvYQmvpsu/L5qRLAuy5fJxFlBoPWLvbaxDmtSU2/Scyy466Kp5VwSk0qRb1V5KP1vKelmvSXrfsb98/ny/PT5fb/TcMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwD/2C/f4UHK7ql3yAAAAAElFTkSuQmCC","e":1},{"id":"image_1","w":320,"h":320,"u":"","p":"data:image/png;base64,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","e":1},{"id":"image_2","w":320,"h":320,"u":"","p":"data:image/png;base64,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","e":1}],"layers":[{"ddd":0,"ind":1,"ty":2,"nm":"Opacity1","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[160,160,0],"ix":2},"a":{"a":0,"k":[160,160,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":-2.00000008146167,"op":30.000001221925,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":2,"nm":"Moving1","refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":2,"s":[0]},{"t":9.00000036657752,"s":[30]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":2,"s":[160,160,0],"to":[4.418,-16.902,0],"ti":[-1.749,2.098,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":9,"s":[185,130,0],"to":[4.167,-5,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":13,"s":[181,134,0],"to":[0,0,0],"ti":[-1.749,2.098,0]},{"t":20.0000008146167,"s":[185,130,0]}],"ix":2},"a":{"a":0,"k":[160,160,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":9,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":13,"s":[98,98,100]},{"t":23.0000009368092,"s":[100,100,100]}],"ix":6}},"ao":0,"ip":-2.00000008146167,"op":30.000001221925,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":2,"nm":"Default","refId":"image_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[160,160,0],"ix":2},"a":{"a":0,"k":[160,160,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":-2.00000008146167,"op":30.000001221925,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Lottie/Fruit_Draw.json b/Projects/UsertInterfaces/DesignSystem/Resources/Lottie/Fruit_Draw.json new file mode 100644 index 000000000..bab45626c --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Lottie/Fruit_Draw.json @@ -0,0 +1 @@ +{"v":"4.8.0","meta":{"g":"LottieFiles AE 3.5.7","a":"","k":"","d":"","tc":""},"fr":29.9700012207031,"ip":0,"op":150.000006109625,"w":825,"h":600,"nm":"Comp 1","ddd":0,"assets":[{"id":"image_0","w":954,"h":483,"u":"/images/","p":"data:image/png;base64,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","e":0},{"id":"image_1","w":954,"h":473,"u":"/images/","p":"data:image/png;base64,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","e":0},{"id":"image_2","w":670,"h":720,"u":"/images/","p":"data:image/png;base64,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","e":0},{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":2,"nm":"캡슐 상단.png","cl":"png","refId":"image_0","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":85,"s":[100]},{"t":98.0000039916218,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":39,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":45,"s":[4]},{"i":{"x":[0.732],"y":[0.989]},"o":{"x":[0.404],"y":[0]},"t":52,"s":[1]},{"i":{"x":[0.767],"y":[1]},"o":{"x":[0.925],"y":[-0.063]},"t":60,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":72,"s":[1.4]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":80,"s":[119]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":85,"s":[107]},{"t":97.000003950891,"s":[112]}],"ix":10},"p":{"a":0,"k":[540.79,300.27,0],"ix":2},"a":{"a":0,"k":[954,479,0],"ix":1},"s":{"a":0,"k":[27,27,100],"ix":6}},"ao":0,"ip":0,"op":150.000006109625,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":2,"nm":"캡슐 하단.png","cl":"png","refId":"image_1","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":107,"s":[100]},{"t":115.000004684046,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":104,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":107,"s":[4]},{"t":115.000004684046,"s":[-2]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":104,"s":[412,300,0],"to":[0,0,0],"ti":[0,0,0]},{"t":115.000004684046,"s":[412,449,0]}],"ix":2},"a":{"a":0,"k":[477,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":100,"s":[27,27,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0.167,1.149]},"t":104,"s":[27,27,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":106,"s":[27,30,100]},{"t":111.000004521123,"s":[27,25,100]}],"ix":6}},"ao":0,"ip":0,"op":150.000006109625,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"캡슐","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[412.5,300,0],"ix":2},"a":{"a":0,"k":[412.5,300,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":1,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":5,"s":[94,98,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":10.851,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":17,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":22,"s":[90,98,100]},{"t":28.0000011404634,"s":[100,100,100]}],"ix":6}},"ao":0,"w":825,"h":600,"ip":0,"op":150.000006109625,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":2,"nm":"음표.png","cl":"png","parent":1,"refId":"image_2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":71,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":79,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":118,"s":[100]},{"t":126.000005132085,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":75,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":80,"s":[2]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":87,"s":[0]},{"i":{"x":[0.583],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":94,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.417],"y":[0]},"t":99,"s":[6]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":104,"s":[-3]},{"t":108.00000439893,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":75,"s":[412.5,300,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":80,"s":[412.5,287,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"t":85,"s":[412.5,295,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":94,"s":[412.5,295,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":99,"s":[412.5,240,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":104,"s":[412.5,310,0],"to":[0,0,0],"ti":[0,0,0]},{"t":108.00000439893,"s":[412.5,300,0]}],"ix":2},"a":{"a":0,"k":[335,360,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":112,"s":[27,27,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":118,"s":[30,30,100]},{"t":126.000005132085,"s":[15,15,100]}],"ix":6}},"ao":0,"ip":0,"op":150.000006109625,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Lottie/Home_Tab.json b/Projects/UsertInterfaces/DesignSystem/Resources/Lottie/Home_Tab.json index 49d43eeaa..e44d5e4b1 100644 --- a/Projects/UsertInterfaces/DesignSystem/Resources/Lottie/Home_Tab.json +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Lottie/Home_Tab.json @@ -1 +1 @@ -{"v":"4.8.0","meta":{"g":"LottieFiles AE 3.1.1","a":"","k":"","d":"","tc":""},"fr":29.9700012207031,"ip":0,"op":30.0000012219251,"w":320,"h":320,"nm":"Home_ic","ddd":0,"assets":[{"id":"image_0","w":320,"h":320,"u":"","p":"data:image/png;base64,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","e":1},{"id":"image_1","w":320,"h":320,"u":"","p":"data:image/png;base64,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","e":1},{"id":"image_2","w":320,"h":320,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUAAAAFACAYAAADNkKWqAAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAVh0lEQVR4nO3dS3BkV33H8d//3JY0M54ZzUgjjebhgMFjTJEQQzk2mFQSkhWEolhkEyC2x07hsIBKFc4ui1RlQ4BNFhBwwA8eeZBUbAg4qUpRRRITbEJBKgTKxuRB4hmpWxqN5qlX3/PP4na3rjR6jdSt2933+1nYUner+6/p2z+dc8/jSgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQcVZ0ASiPS5cujSzG5GfS5fSkWXpEXtkvSRbqix4qc8HCK/OX6z991auOXCy6VpQDAYiOuXDhwum6VX7F3H85ut1l8jslHdzix66Y7EU3+36I/k/LSfrPJ0dG/ncv6kX5EIBoK3e3ydrl91Yq/l6P+jVJQzd9lLnyR+aSXN9IksqfHRs5+MV21goQgGgLdx+oXbj025J+V9Id8tydJlnuUPP8nbmwu+Ex+efIvCTTH4+PDn/azG68F7hJBCB2bXr66m9G1f9Q0mvzt5tZlmHuiu6SZ9Hnvn52mTUiMJiCTGaS3OS2OgzN7CXz8AdjY4f+ojO/EcqCAMSO1Wq1CffKZyxJ3t0MNZMkM7m7YoyKkjzGVhC22Ep7b6P7zEzBTCEEmVkrQJtpaJb8tWL40Pj4walO/p7oXwQgdmRq+uK7TfakTEez8MpabO5SGqNijK2WntnODrP8z4cQlITQeo2VJqHNusLZibHDX931L4XSCUUXgN5TnZ79uMm+IvlRuWddV5PSNGo5rStNU0mNLu0Ow2/tz6dpquV6XWkaW63DjI9I9a9MX5j72C5/LZQQLUBsW6126YwrfUIhvE251ln0qDTNury7CbztcJdCMCVJUGh0tZui67lE4ez4+PBPOloE+gYBiG2pzly8X26fkWnfSvhlrb56zAYpOpx9LY0etyohKEls5fRhdgJyQfIPHD929At7Uw16GQGITbl7Up2ee8xMDzVva53rS6PSPWj1bVKbkhCUJPlzg80a7fGx0eFHzKxeSHHoCQQgNjQ1deEtSpInTLpzZeRVitFVT13uvmetvo24Z93wSmIKYaU1mM0jDC8OJOlDo6Oj3y62SnQrBkGwrur0hUctCd9uhp9Z9tcyTV3L9dgV4Sc1W6NZTfXUGwMk2aRqM7+zHsO/VKfnHi26TnSnLjiE0U0mJyfHQhh6SsHe0byt2b2sp1Exdkfwrac5QFJZp0vsbs8qJmcnJg7ViqsQ3aZLD2UUoVqdeY+FymMuH2veZial0ZWmsdHdLLLCrTVrTJKgZFWXWDJpWqYPHD929JlCi0TXoAsMSdncPoXk6Wb4WeM/9TSqXu+N8JNyrdV6VD2NWXfYWn/px+R6unrh4ieKrRLdogcOaXRSrVY7Ez35goXk3pWBjubcvqjovXuQZF1iKUmS1XMGs/OGLwRPfmt8fPjlYqtEkXr12EYb1GoXH5DZp12+r3lbs8tbT6Oaqzx6mTearpVGlzi/yYyZFiU9Mn7s6FNF1oji9PbRjR354Q99cGx87lMue7jV6lP2VT1GxbR7Bzp2yl0KiakSbhwgSUyPV6tHPviGN9hScRWiCH12mGMrU1Mz9yrYkwrJnc0UCGaKMZvU3Mtd3q24SxayFSQWwuoUjP6Se/LAxMTwC8VViL3GIEiJVKuzv6dK5flW+DUGCOppbMzt69/wk/IDJKnSNLZGR1ySB3udKvF55gyWSz8f72ioVqvHLQx+NsrelV/R0VzOthebGHQbd8+22FozZ9AlJaavxXrlYeYM9r9yHfUlNDU9/S555bMKdjzf5XPvnbl9nZKfM3jDHwBXLTF/aGxs5OvFVIe9QBe4j1WnZz8mVf5WloVfc05c2mNz+zolP2cwzc0ZzO7UeCr7WvZviH5V4sO/f50/P3NnMlB50qV7V3d5vdHlLXfwrWdlzmDWGsx3iSvBX1haqDxw6tThlwotEm3Hx6DPTNUuPCwLn5LZYH7fvthDy9mKku8S53eWkSRFLYWKPjg+evTxwgpE2/FR6BMvv+xDh4fnPuOmB5q3WWP1Q9rlmxh0m/wKErPVu06b66nLl448cuaMLRZYItqEj0QfmJqauVdJ8gXJzqzdty9r9fX+io691vw3S5JE+SmDLilIP/Y03M+cwd7HIEiPq05f+IglleclrQq/NI25Li/hd7Oa5wHTNG0NkEhZiyFKdyiJz09PX/xIoUVi1/hk9KjJyStjVqk/Juk9zdvyXd6NLj6Onclag+GGLrGkZ7xe+cCJE4emi6oNO0cA9qBabfYd0ewpSav27WOgo3M2HSCRal73sydOjDxbUHnYIbrAPaY6PfvxGMKzyoWfxNy+Tls7Z3CNcavY16cvzH68iNqwc3xUesT58zN3hkp4XGZvzd/u7orRGeXdQ83zqkly44XfzezbieoPHTt27MWCysNN4CPTA2q1C2dThT81U9K8LRvoyC5Gjr3XbGmHtdcmzu6rm/TIxDhzBrsdAdjFsrl9Fx/zkNwvxdbFx1c2MaDVV7TmhZiSJLT2VJSU7bQT9fnr1+Yeue222xYKLBGb4OPTpc6dq74tGRx8QtKZ5m3NgY4YWc7WTVYNkFjIrkksZX+wgn6i1B88fnzkW8VWifUwCNKFqtULjyYDg8/J7Ywae/SZm9LUVU9TBjq6zKp9BmPM3q/GfR51e5Q9V62yz2A34mPURebm5o4uLvqTHuzdzYtXNLtVaaTL2wta+wzmt95vvommr+4fDGeHh4dnCy4TDXycusTkZO0dVhn4nNxO5K/TEd2Vxti8ri16QPO9SkLIrkaXuz0JNqWYnh0fH/374ipEE13gLlCtzX7UkoFnm+HX7EKljet0SIRfL2m+V833L3s/LfuDFn0i9fB31drsRwssEQ18rgo0MzNzZz1WnpD0lrVXZ8suUOS8QT3OlV10KglrRokluez5ioUHx8bYZ7AotAALMjVVezj1yr9rTfilng10EH79oXkao56mSm94T/0tUel/TE5ePFtMdeAzVoDq9NyfuPvvrL2dVl9/y7cG10qCfXrs2JEP7n1V5cZnbQ+5ezJZnf1qklTe6b5ybo+BjvLYaIBEJqVL+trJk0feY2ZpcRWWC5+3PeLulVpt7lse7J7WVvVaafURfuXRfK9DCEryISipkug7oyNH7iME9wbnAPfIZG32GwrhHvnKKG89RqW5MEQ55EeJ62smTtej7pmcmvuHgkorHQJwD0zPXP5CEiq/1Oz2usRAB1YNkLRagS6Fit4+PXPxiwWWVhoEYIdN1WY+nMb0/c3wk7KWH+EHKReC+V19XEqj3lerXfxQYYWVBJ/BDjp3bvp1lcHBF/Phl8ZU0fmHx2rZCLGUhGTV7cuL4Y5bbx1+uZiq+h8twA4KleTLklq7g8Tmet5Cq0I3aqwSae3v6HLJXAND8cvFVtbfCMAOmZ6efZ/M3hg9lcmyqS5cnhKbMMuOk9g8V+ySy++amZ19f8Gl9S0+jR3g7kl1Zq7m7iPZLaY0ZVYDtsckhWSlbeLS1MnxkRPFVdS/aAF2QG3m4sMem+Entq3HTXFl3eEmkyYmayyX6wQCsANS+aP5jfu4Ri9uVv6YyfYV9N8vsJy+RQC22fna7C9atDPNDQ4IP+xU89hp7AD+mnPV2bcVXFLfIQDbLCS6P/99visD3Iy1fzyToAcKKqVvEYDtlvo7m91fWn/YjRjzx5DL3X690IL6EAHYRv9Xrb7RZadWur8FF4Se1rqmSPadJD/5Su3qXQWW1HcIwDYaVLhv9cwiEhC7tfqK60lI7yuulv5DALZRWknebLlmHy1A7Jb7ynFkweTL6c8WW1F/IQDbyNxf0zpjQ/ihzVySzM4UXUc/IQDbyW1ipQdMAqJdvPU/Cz5RbC39hQBsJ9fI1g8Ctq/V/V05tXysoFL6EgHYXgeklYOVbjA64EDRBfQTArC92FwC6CEEYHvR5kOncYy1EQEIoLQIQAClRQACKC0CEEBpEYAASosA7ATG6dAupux44pjqiErRBfSV5kHaPGiZFYh2IgTbjhYggNIiAIFeQOuvIwjATuBgBXoCAQigtAhAAKVFAAIoLQIQQGkRgABKiwDsgObEfeZBY7dYCNJZrARpo/xCEKDdCMH2owXYARyoaDeOqc4gAAGUFgEIoLQIQAClRQACKC0CEEBpEYAASosABFBaBCCA0mIlSFsxXRWdwrHVCbQAO4LFcEAvIAA7gr/WQC8gAAGUFgEIoLQIQAClRQACKC0CEEBpEYAASosABFBaBCCA0iIAAZQWAQigtAhAAKVFAAIoLQIQQGkRgO3EJjDoBN/ga+waAdhuHKBoN1N2XHFstR0B2AkcrEBPIADbrJV7bAqNNuNvavsRgEAPIPw6gwDsAA5WoDcQgEAP4IxKZxCAQA+gV9EZBCCA0iIAAZRWpegC0B3MbPV5pg1POm19NuqGR2z7BJbt9qU3eOjq72KMSmPc/pOhbxGAJReCySwoxlRpXP9M0w23bnpCauuzVZ7/wtbeuB0b12nr3bvmhqGhAR28Zb+W66kWFhZlxhBDWRGAJZYkQfV6qvn5eS0uLSuNUe5R7ib3bDmLu6vxpbz1fZYoUZJ7lGLjPkkelT0m+wG55793ZRmbfe2t79V63uw1su/ljeds1OD5emKWa3HlRRqPkRRd0WPjeVeeOypKbhoaHNToyCHd/upTGjl6WFevzSvGSBCWEAFYUkkStLCwqMtX5lVP06whZmqEksvjSgDGVQEYG/flArB1n+Sx8fPKBWczNBvP5fkAbPREXS6PUa7GY9YLwGZIut8YgNGzeiQputJ8ADaeN7vLdfnqdZ2brOk//+ec7rnr9Xrtq0/p6vX5VrCjPAjAEkpCooWFRc1dviZJqlSSVS27IMkbw2PupmbTKguj0AqT7H6ttAAt+7+tF4CNoLI1AdhsdGU/b3K5Qj40tSYAtXkASlkIB7dWfa2aGwFcSSo6sG9Q1+cX9I3nvqco15lXn9blq9doBZYMo8AlY2aqp3VdvTavIFMIaw8BX/PVzltFdsMXN7zEjY/d4rZ1+bpf3vCY1btKufbv26fBgQF953svau7SFe3bN7jdV0SfIABLxoJpYXFJaYyyxNYZhNhBC8jW/7Gbic7mYzd99Y3u3MnocKNFeWD/kK5cm9eP//sVDQ4MbP+J0BcIwBIxy7qH9Xp6E129bTxuq+2/1t63zlOuNxjciTNya3Pe3TU4UFFt5qKuzy8ouaFFjH7Gu10qphijorvCNjbZbJxF2/wpm3NPOnzqbMuZN5u9/ha/wkAl0fz8ohYWlpQkfCTKhHe7zNYNjbXnANuQbBudA8yH5xYhtav2qm3nObYV9+gzBGCZuMtCUDDTBnOeb952tmvf6D6z1s/6Jt3iLZ9nO2zjH1+up9q/f0j79g0qpqwQKRMCsERcUjBrTXuRtJIyGzaPtpE6G3SBW+f1NnvuNnedNxsFXu97M9PS0rKOjQzrwP59LJErGQKwZNxd+4YGlYSgmG8GrjMKvMXK3J3Lj3g0usG2y9bdesnXmsaTy/r81Bwz0/X5RR06eEB3vOa0lpfquygCvYgALBl3V6WS6OAt+xsrMTZu8Wx7HuBWXeD1n3j1+b+O5aytSr6VlzbNLyxoaWlZ97759Ro9eljzi4vtLwJdjZUgJZSmUfv2DeqIbtGlq/PZtBgptxROuaVwUTFb4rHxUrhVa4FXlsKtLNPdZClcfpldR5bC5dcvZ8+9vJxqaWlJtxzYp/t+4ed0+22ndOXaPKtASogAbKP2n9HqnCwEh1SpVHR9flFLS3WlMc2Wp7nk1gxAU8iHlJs85APQNtwMYe0mChtuhuCSzBXj6s0QNl4Kp3UDsNUQbWyGsPJSqzdaOHJoQMdGh3X7bad0ZPgQmyGUGAFYYmkalSRBhw8dUIwbd4dv6N1uOSlvc772m5veEmv9B263rKGhAe3fN6Tl5bquXMnW//ZK+DmnrdqKAGyvBUmHiy7iZsRGE8wsWxe84fpdbXnH5o/YVr7swYaoJsU06uq1+ezbHgm+HE5UthEB2F6XJI0XXcROtLqbrRs2fOQeVION2VzRFfQTmtPtZKoWXQL6nPtU0SX0EwKwrfyntmqdF9AOK8eSBf+vAgvpOwRgG8Uk/GDbc+eAm9IYlY/+g6Ir6ScEYDt5+sKuVjQAmzCTYr3yr0XX0U8IwHZaWHghmq40ptD1zqRAdK2VDVxdcruUJEcIwDYiANvo1ltvnTfpmzQC0VYuSSaP8ZsnT9r1osvpJwRgmyWyLxVdA/qRSwODf1l0Ff2GAGyzV14Z+Rt3XaL/i3Zy16WTxw7/VdF19BsCsM3uvtuWzewxd2csGLvW2MJBqgx80szYr6vNaKd0wNTUlfG6LzIpGu3hvjxYOTYyPm5Xiy6l39AC7ICJiUM1U/gYbUDsXpQ09AnCrzNoAXbId7/rAxOnZqclHy66FvQql2SX5q+OHj9zxtgEoQNoAXbI3XfbcgjhQVqB2DlX8MGzhF/nEIAddPL40WcSJZ8vug70olSyyhdPnjz8dNGV9DO6wHvg3OSFH7n89UXXgR5hLvPkR6dOjLyh6FL6HS3APVAJQ283+UzRdaA3mGsmsYG3F11HGRCAe+D48YPVmPhbZWIzS2zlUiXEeycmDtWKLqQMCMA9cuv4+E88xHskTRddC7qRS1JNqd9z/Phx9vzbIwTgHrp1fPxlr+tNQfZdxoaxwiUl34sVf9Pp02M/LrqaMmEQpADuHs6dn/2cgj9YdC0oUvOSePbEqYmRh83YTXKv0QIsgJnF06dGzwYP7zezc0XXgyK4zOyc2cB7T58YfYjwKwYBWKCTJ0e+ZHHxDnN9VBJLnUrBJdOix+SPLC7dcWpi+M+LrqjM6AJ3icnJK2NuSx+W6+EoP1F0PegEq5rbEx79k6dPj75SdDUgALvO+fPnD0Qb/A1J75L0q5JGCy4Ju3NBsn/04E8PWXxmfHycln4XIQC7WK1WO7i0FO5RsJ+X+V2SfkbSaUnDkgaLrQ5rLCrbCPecmc6lbt8Pqf/b4GB8gdADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgJ70/0W7pXnysL05AAAAAElFTkSuQmCC","e":1}],"layers":[{"ddd":0,"ind":1,"ty":2,"nm":"Opacity1","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[160,160,0],"ix":2},"a":{"a":0,"k":[160,160,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":-2.00000008146167,"op":30.000001221925,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":2,"nm":"Moving1","refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":2,"s":[0]},{"t":9.00000036657752,"s":[30]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":2,"s":[160,160,0],"to":[4.418,-16.902,0],"ti":[-1.749,2.098,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":9,"s":[185,130,0],"to":[4.167,-5,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":13,"s":[181,134,0],"to":[0,0,0],"ti":[-1.749,2.098,0]},{"t":20.0000008146167,"s":[185,130,0]}],"ix":2},"a":{"a":0,"k":[160,160,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":9,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":13,"s":[98,98,100]},{"t":23.0000009368092,"s":[100,100,100]}],"ix":6}},"ao":0,"ip":-2.00000008146167,"op":30.000001221925,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":2,"nm":"Default","refId":"image_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[160,160,0],"ix":2},"a":{"a":0,"k":[160,160,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":-2.00000008146167,"op":30.000001221925,"st":0,"bm":0}],"markers":[]} \ No newline at end of file +{"v":"4.8.0","meta":{"g":"LottieFiles AE 3.5.6","a":"","k":"","d":"","tc":""},"fr":29.9700012207031,"ip":0,"op":30.0000012219251,"w":320,"h":320,"nm":"Home_ic","ddd":0,"assets":[{"id":"image_0","w":320,"h":320,"u":"/images/","p":"data:image/png;base64,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","e":0},{"id":"image_1","w":320,"h":320,"u":"/images/","p":"data:image/png;base64,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","e":0},{"id":"image_2","w":320,"h":320,"u":"/images/","p":"data:image/png;base64,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","e":0}],"layers":[{"ddd":0,"ind":1,"ty":2,"nm":"Opacity1","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[160,170,0],"ix":2},"a":{"a":0,"k":[160,160,0],"ix":1},"s":{"a":0,"k":[143,143,100],"ix":6}},"ao":0,"ip":-2.00000008146167,"op":30.000001221925,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":2,"nm":"Moving1","refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":2,"s":[0]},{"t":9.00000036657752,"s":[30]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":2,"s":[160,170,0],"to":[4.418,-16.902,0],"ti":[-1.749,2.098,0]},{"t":9.00000036657752,"s":[200,118,0]}],"ix":2},"a":{"a":0,"k":[160,160,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.309,0.309,0.309],"y":[0,0,0]},"t":5,"s":[143.3,143.3,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.309,0.309,0.309],"y":[0,0,0]},"t":9,"s":[129.6,129.6,100]},{"t":13.0000005295009,"s":[143.3,143.3,100]}],"ix":6}},"ao":0,"ip":-2.00000008146167,"op":30.000001221925,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":2,"nm":"Default","refId":"image_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[160,170,0],"ix":2},"a":{"a":0,"k":[160,160,0],"ix":1},"s":{"a":0,"k":[143,143,100],"ix":6}},"ao":0,"ip":-2.00000008146167,"op":30.000001221925,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Lottie/MyInfo_Tab.json b/Projects/UsertInterfaces/DesignSystem/Resources/Lottie/MyInfo_Tab.json new file mode 100644 index 000000000..25f2fd4fc --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Lottie/MyInfo_Tab.json @@ -0,0 +1 @@ +{"v":"4.8.0","meta":{"g":"LottieFiles AE 3.5.4","a":"","k":"","d":"","tc":""},"fr":29.9700012207031,"ip":0,"op":30.0000012219251,"w":320,"h":320,"nm":"My_ic","ddd":0,"assets":[{"id":"image_0","w":154,"h":154,"u":"/images/","p":"data:image/png;base64,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","e":0},{"id":"image_1","w":154,"h":154,"u":"/images/","p":"data:image/png;base64,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","e":0},{"id":"image_2","w":154,"h":154,"u":"/images/","p":"data:image/png;base64,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","e":0}],"layers":[{"ddd":0,"ind":1,"ty":2,"nm":"Opacity1","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[160,170,0],"ix":2},"a":{"a":0,"k":[77,77,0],"ix":1},"s":{"a":0,"k":[143,143,100],"ix":6}},"ao":0,"ip":0,"op":30.0000012219251,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":2,"nm":"Moving1","refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":2,"s":[0]},{"t":9.00000036657752,"s":[30]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":2,"s":[160,160,0],"to":[4.418,-16.902,0],"ti":[-1.749,2.098,0]},{"t":9.00000036657752,"s":[196.7,140,0]}],"ix":2},"a":{"a":0,"k":[77,77,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":5,"s":[129.6,129.6,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.309,0.309,0.309],"y":[0,0,0]},"t":9,"s":[124,124,100]},{"t":13.0000005295009,"s":[129.6,129.6,100]}],"ix":6}},"ao":0,"ip":0,"op":30.0000012219251,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":2,"nm":"Default","refId":"image_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[160,170,0],"ix":2},"a":{"a":0,"k":[77,77,0],"ix":1},"s":{"a":0,"k":[143,143,100],"ix":6}},"ao":0,"ip":0,"op":30.0000012219251,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Lottie/Search_Tab.json b/Projects/UsertInterfaces/DesignSystem/Resources/Lottie/Search_Tab.json index 4923ae176..007f6b5c6 100644 --- a/Projects/UsertInterfaces/DesignSystem/Resources/Lottie/Search_Tab.json +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Lottie/Search_Tab.json @@ -1 +1 @@ -{"v":"4.8.0","meta":{"g":"LottieFiles AE 3.1.1","a":"","k":"","d":"","tc":""},"fr":29.9700012207031,"ip":0,"op":30.0000012219251,"w":320,"h":320,"nm":"Search_ic","ddd":0,"assets":[{"id":"image_0","w":320,"h":320,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUAAAAFACAYAAADNkKWqAAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAgAElEQVR4nOy9W6xtS3oe9P0151yXfT/3drftKMGJRIIikA2RUAA7WH4IsnIBtQhBTiJFvIQXhEDiwSIoL0TAC4KHIEJkrASwTECId/OCkE2EpaA2bp+24253H7fPOft+WZc5R/081H+rmmOutfY5Y58Txf+3tfacc4waNWrUnPWN779UDSCRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQOgr7sBiQO4xvf+PjOen30J1Yo/2wl/ucA+hoxf7UyPwDTMQDUCjDAYIArEwPEDGZG29H2t78KMPd/7eC2r8ormHU/M4OsLMBc5TPkWP1DqI/9nKhyMfGcYHklgBmVgULUisrBcj4ABCY9IUlNILYKZCcDIGoveigzQDM/ca/cj9ELBEBE7cJlf6jLzk3heDnuEoynBHwXVL4z1d2vMvgfYl1/5etff//F9d924stAEuA/ZvjGNz6+c+/OrT97uat/jrn+y4XoXWYGM4Er90QDElJjIRvqyIiZgQpUtOM7wlKSEYKsuq2x0DxRyp8U8e1V2gLut0eiBMBViYecg4S9tSwJKTL7T1NJrVXLMD4MP18hRJASkpyYrJz0kbaA5DxaCwnHDWW9Pq9LqVLr8EqBcKB+/BTAL2HC/765d/aLP/3TX311xdef+IKRBPiPCb774asf3K53f40r/2UCf6VClIgqMhAzN8HD1XQPagWxFmEATLJdGRJcwQATqjESYapMzGDU9huopviUgJyETEW6oiQTcYPKROV22qguTT7ClVplcGOIrq7GGiTHEAiMyu0NCcnqtbOwlio20XuR5xqkXi2qJxGByIH9tAEdl7XWUc9/VnX7UiicSpR2k6vyRi7n+6j8306bo//y61+/+8nr/UISbwJJgF8yPvroo1vb7Z2fZeZ/D8BxVHRExKigWsG1MipzM3nFlK0VqMxEIDbzFgBXpipyKag4M43tr5p527YreTVyVEvYzgeYya3HNt6qZCoOXndjl1YJGUEr5zJ3RCdKUBi+ncsY34RWZ+AqyXC3PdBT0Hyi1SgQm0tMEgNY95G9sXa0Ooga/5Jwt8tUJiKUgva3IqxXQFkTiIGpsrTVir8gxn+1uXv+N1IRfrlIAvwS8Z3vPP0LzPyfgelrwc8GgHiqlerEPE2MacdUqxIVC/G58kL07VVQVUu0spNfbRqHG4GyqcfaLFNTdyL1KlM7hmFqkBlURTUyM1cm0vIM6s/XTG4Wnmt11k7tGSm60nISt45otKXishNmegz2NgJgJhFt3qvyP3Ml8efNHcOR/xgz5zwAIvkrROsVeL0p2GyA42PCak160woilb4H8H/4r/+Ft//eTepPLI8kwC8BzEzf/vbTvw3QX2kb0EyrCkwT025i3u0aMynRNTMPB//AQI3Krd8fyMzVYyDNrmytPCrHoBL3lCSBidW87rbDiFN5EmBuzMPkgRrrmHgTGN7bf96HwAyJhf00R3J2rCjsmW1XHXtV3WzmuPZro8/1inB0Qji9VXB8XFArY5qYiJqRv6317/x/H779V//6X6c6d77Em0MS4BeM73zn5VfBu/+NGT/qxh9hqhW7y4rdxKi1Eri0Md+RihKccIibo7EMajBFK4OgKm8mCsxVyvBYhoVUWwNHAmUxX7n5IIXM1OQ109dMXAaTkp62GYAymwRhySzdSHg92fn7SJCfBUpkc4R2HQkeKjt3XK3NJ1sK0ekt4tu3V9gcAdPUbigyCv/BdDn92a//pXe/9/muKvE6KF92A34/4bvfffZHiHa/ysCPMhhFHOq73YSLiwm7XW1OfiLMZW+0ge8DjRujtFcpweyvHExO5u5mRxq14OEVXg+Z38q8d1IHd63zzfYXjVh1pDn5jWAQg4jbdfD+lRPx/q1aFVu4Xp459gBi2Tmim1OH4+tVx8cypQDrdevIly8qHn66w/PnFYUAKiZ7f2y1Kb/6i3/34z9802tIfH4kAX5B+Pa3n/whrvzLzHgfDCYqqAy6vJxweTk1GikkcmBOeahK8o8WMIgkBijLaNAUFtT0cmP9+llOLn63QHxRmTVXJEMS46hXeyAYXXX27X5eSzipvGMaL3OPEHv1p69OhH35Q6RIRHwFce0RXFR2c+QYy86VYQZKIV6vCcxMzx5PePRoR1zBq7WJ6PeI1r/8Cz//9Efm2pxYHkmAXwC+9a3n7xeiX2bmB8xNP9Va+fJix7upWrKZE5j58no/XyNBMiJiJu7yMtiI0Px0cHMyiDxNmB7BEpgw9gu5fU6oVtirJOc8J+aQbmKk3qIjXTKJm7ttXwxdtAAI2yZXiWQ6VA6gkdRGc5RnLljL6Xspf2NzOJq+c/WO5jEzUynEqzXo/Iz54acTtpeM1cpU9Fur9fR//f3//vn7s41NLIokwC8AR0e7XwLwruaLTRPT5cWEyppM63ZkRxYAhBTg5i+LKjJfmHEZ85CkBjT112/U6GuMxmIwT42TxHRmN4S9nigcY8qJHQu/FuceN+NbuagMD/jcBhVJTJ0R7jeIuK0nHqDlscxV/zrBknHfVVBC1rZEgiZqanC3Yzz8dIeL80rrtan6d+t6+0vX1Z/4/EgCfMP49rcf/zyh/NGqkzUq03a7AyCqSXQRVKAEpeYEQoGgSEWQK6pRs/SmcG9SWv6xFYkCUkxgtQJ7357l60nk132HXRWm2NpnJevBBLbXkVz2gxFo+XeiBi3zBszQrJW+/PA+ENhB0/V1MZLiVQGTq/atJT3m8cOmBNcra+Uf/Z//7qOf+zxtTFyPJMA3iN/+7cd/rpTyb1chiFpB222Nub9hRIaXwIAhpYTMNNbdPB4vSccw5WbVBpWk/jzz1amp22Qhm23rlQIY64tth220jGbfqoovRnHjQX1FLk33MRcg0Yj46Hu7LoJ7neoby8wR6/j+qm1XlVmtCJXBjx9N2E1MZUV6v/mZv/8/Pv4z19WV+OxIAnxD+PBDPl6tyt9hUS7ELdpba21mb8VIck3NAeDRFjRGoN6NxUCXWsKRo0xR9iawBzZM/XUsGHSjn1aDnzpo+9zgViHpugK6m3qG7k1i4UlTh3aqOGECPJ+w3DVrH6Pv7VCZuW1X+frmTOI5H+BN0mfGMus1YbdlPHs6NWHb4kuolX/ub/0t3lxXX+KzIQnwDeHo6Ol/jIr7ugDAbqqotXIhTwze880JBcXUFCe3wIMz8qtjtWCz6vbOz6cUxEO97ZC2087l82zbkfKyl5jiEpaZTMJ4XW6qu5IL6rBnfLHxnSxbbdTdGaxeSQdq2/aDIV7ey70OrkqcVtw0Z/AqrNeE81dMZ68qr1Z6B8P9t+88/huft+7EPDIR+g3gGx9/fOfe+fEjZmxYfsfby10wZ9XS5DhljBjgKgnCXQR42AbZVqUODbS2bdwdx3NzgH1f91dtLrC2rZFkS6wmPV9PqGFKW20LKdjMka7NCG2Hv3aRbwC9QkQ7sSZ+vwbFXJecfN0xS2ImGn2wbbUChYAH76ywXunUOaBMmw/+/M/c/Xjptv1+RyrAN4Dbr47+IwAbHfDTrurdHGjKi6LxOYx4ZYY+VSSSHzjOmWLx3bmMcqIZk+q6fXJwL/lMPnrwxe6TPPMXXIp+XMtl6ZkkBkHmEp6JW+7hEMo+FBmGmcCxns4MPRTFvWlC8039e9epyqsCJuO+UoDdjvHqZbWVuEDAtN7++1edI/HZkAS4MJh5XYj+Wm3OP67MmOqEOE4jDzmpOVeZEiL4gqJ+NHHc5krMVZ6frGky325BEsA5OWyz+nSHslu0RaV9KvFCFJr6MqpQQxK3Vq0LHJC6/Jy6Iu0f8vLF7SPFGw6ZrDFQcoi8DqnBQ9uief1ZAyOK1ZpwflZxeckoBaL4+d9JX+DySAJcGL/928/+DQD3m+8MqFNVeeQkFFmCB/eXgAFf7UU3QC1Fc+0dCGW6jqtazn12QYFa6TFHePCVsUwwBiwVRuWfXZMrWLb/lNfGvOtA9jax2cnSTzsqp+g7bP055gNqnXPdMofrEpytja+h8m5CnFrnXL0tUR58dsayjheDCA/evffiz9/kmhI3RxLgwigF/6a5ybj5dGTAi00JVVlqBlqynbEW94O41hmTMao6BPOYw+dqdbdNgaOC/w7RCo7yi7s0mQ7UTc4wdKY+IIGMjsT3qWGs+oDJq4nfTP3837FMdwEHSSaWmXu/18obmNE3MaHHsocIuBTg8oKx27UpdATCxNt/61B9ic+GJMAF8dFHH90C808AULMFlWskvt6SZJnJwS51xtHgA7ylu1Qd1FLDnl8vyKxwRq2LOlu71UHde13bnl1mOms2VuwVn3C41WOcS1cIVCN96ysAmvIi3bPnI3TF10r06q+PArf9PvtCts2orf1gxEiaV5m9s9c3+B7H+ub2j3WUAkw7psvLCtJRWvHjv/ALv3M6d87EZ0MS4ILYnd/9MTDd09HSlrUyQWZmW1REyknNl8Y2z7df+8DXzlPzcc9vF8iP7QEdvaqMH/3IrlFyTld3e8TM/UeXrl2ch9x8DdfU14H9QAj87AcSpxsJ72cAXqeohGTUV7d/zgO5fSM5jcQ4R4Svm4Q9P0OvfQfbSzkvgEK4N13c+RNX1Z14PSQBLohadv88oyk/bukorD4zyEM9uGeaoK7IUmNcGcXgAUfCM2OX2eIkZubGErJjL2jAkqisxYzttOaoLPdMVxNwe/ark9+4rEsgCSJzIR7qy5B0HepS5WREtkc8h/1qHUF2AYsD5fdWjHmdwMh4zDXm8ayapNLmCk+Th5cK0b9w6FyJ10cS4IKotfzx9k5XBe5kV+ML5TchO2EtCYRKsCCQoh8fVSDUf0fNPw5EwlPFFVShqkb/M4nox0jbG+HsXZ1O7CAn6aEKwK1zJzchnnGO72gG751ujlSUSJSIbhZsmCszmskzLeiI73VyBK8zn29ajohRJ6ZpYpA9h6T+8Zu0IXEzJAEuiz/knBfnlQ0wk1CUEItyQVBt3Jd34jPWsWVhQhGrQ8vIK3EdVjcI8REO/jtW+bbnL2P0dNfnBlq7rLRHdGM/+NFDisrYWd28vvDUNfYbwyEcisheZc4ewpyCO5TmchVRzvkV58zn4TNVJtYsKgZQwH/gujYnbo4kwAVB4A+ap96fs+v+ro6Y5o6OeXl7pMAmAWPAQdJcnF14j2kAzWDhfj9Hq7SLELuaVHodpvUyerM6lGV93OSB2Rv9aJdtpJwbC46KERjLjK6zawjtIDFd9fl1cgHn9sWAx03qmju+TvoeQCm5TuCCSAJcEMx4AGrmaZRzHPPuNLcvmqN7qm9Y9UX9amwP3OnnDOvjLfVc6OtFz11Sjlj8lD0xO7mxRXwjiw3qckidwaxfz9XrFQTVuThDNNt9ifuxgtea1zt/29lfM3BetB9u+7XR4oMNulm+YkjSZIBx/wbHJG6IJMAFwcCJsMcQXXAFGMr2nzv1F9RTZQomX2dW9qf2/2fr1d0dFYrr0eoe6tuH5pLEMxzIT+zaLScYZ7v0bRxO4+av5f2pUuwTotu+15/He13y8qGy8Zw43Fevdf6hzrCf9KZG8lTjTINZEEmAy6IFZNmVmH4UBrIoiJp0pvAimjHlJKAVyHJ/XbRWDxkZUVVnKLcfeW50JuYux7X4eFwpmqP4s/bAo7Rh4MK399e091adlDS3j7pt+6Tn17Dv67sqyntdcvR1OJQ8fV1S9U23DSVg9sRM+k7i8yEJcEl0hMNxdlh05cFJkGxaWiSyMJLJFhmoerApQCO42pu9KrOaK04rq7ERRtDkoyqmrZjIbIETmyrSLzzAw1v/HMhqjvhiqo+UY3vWh+zHSNiR+DrldjDlRd+PwYarghqHkpbj+9Hfd1XazaH9Y7kYQOnKh571bILEUkgCXBIxbmFjGco4lq2iy8mbqorLy+uB1SaIeOyjlQlZgHoyKDlFk0z9gt3skBCY4VB23hzvnjkizbejtM1SOJw5VByelRQ6KBKm0xLvpc50BmYkkT6HDvFDT1I0ktYIZp4lzJlys6Q4ziQ5lJ84d+6xzGwgpfVBCywdWgE28ZmRBLgobBUCYQuCjmphMtojiVH9CRnWfl6YxVPCfz5dTT4JH8X1+FgPZVlvMPolW73iaOrrhs62aKZ0b6I6KwOeDmN+S+p9c7F/KFyFFTBHJNnnm5inh8sEU/EmxHPluQ7lC15FcofSW64LiMxGpO3OIduuvpzEayIJcFmYKgqJxjIfxBVOFxxh/fHrtmEGhVbM4a8/o5PoPr1oGYp7GG4yG+VqRmFHsdZctjwZl22m7TrFB5aBO045U7OfCfFBRnSILLsLCIrrakUlRNV99vo/s99vj+zm5hDH812X3nKo7VecmfqPiSWQBLggQuCDLUfE93WvM8cKiVhQoZFpDccMr+zqzv7A/eegHDnujOoSuv6BE2zvvIvX54+y6xdM0C0gBg0cztxUIcn1RRIP7w9rMb15dH7KKwnlOr9cKHeT4MXB81yVNnNd0OPQTJAZs72lJR1sReKzIglwQQzEE56B0ZHRjJIbI5vEURpxCEREkpP6e7PJ34aBBguOGHc64eoy+uT03ZnXsSrzQbra9KBOLE0zPj0/uX5289fJICrlkUCuT2S2kjdQXCPRHDJTr1r55VBbRpV4qI2HTGXZLgH15tqwG1diMay/7Ab8kwRTQyH+0d40BbR3C+f9vxDccJJqaytEXyEF9ccIwQ1m8/NxJF1rn692Fdpmbr0YdmgkOOq12A69VAbKmnByTDg6Ljg6Iqw3hNUKKIVQSlvleJoYXEG1gqcJuLysfHnOOD9nvHo1Ybftu4eob79+1v7c6//XzAV8HTN1bobGUmZurGvOhGaGrBw5dEjicyMJcEkEk7L7zPvmTYyEdn+Ra4KitOrCQ5W0/jojDNj9fk6Usu6Wsh1s7T+PgaiojFW280sZfSHg9LTg9FbB6a3CxyeFjo4JmyPCZkNYrxsJrguBVoT1WheHbRc/TYw6MS4vGZcXwPlZxauXFc+fT3j+tOL5s92QSB1Jbz6B+dDKLSNZvQ5RXqUKD+2/6baxzfNQERhurYnFkAS4IPQXGmWSkE03eKtE90a/XZRW442egZYL6LnKMMWmdSAwmJKkHRwlqVfL7pTThRnCzmATNylIR0fEt+8U3L5dcHK6opPTgqMTwmZNLU2D2lPNiAAqBCoiXGpb5FOCGDg6IimD5lgswPaS6dXLCS+fM5483vHjxxMeP5zw6mWFK+h59QfMK6k5vO6MkUO4SWT30KIHr3EWgIr/PjIVZlEkAS6MNlRd0TV49Lf9kAd1gEaclf1ZuB0fjqYsg3QRwKpkZ/8F/nRSbE3ygajcGaWem7+s2dp6WsLJCdG9+4Vv317R8WnB8UnBak06R6sVJAYxhTTotuACSb8UjmZs6LDSbLyjI8LR0RpvvwN89Yc29PzphCePJ3z6yY5/73d3ePZ0QiS/QxHYEUpA8XX2yxtw6JhIbHPl5465zvS9apt0LtoXmgS4JJIAF4QxV9zmw0Z+1THzv18ElWOENCrDvbqM8Aju8+t2DmpPVzUQ5WnUpnuDAtX/iBjMx8eEe/dXuHWn4OR4RZvjptxaYnawyqL3sAIoym0sa2vJQ6IqUEhWojHvYyPLKv7CysBq1Z6N+/a7a7z3lQ195as7fPz9LX73e1s8fTJdtY7fGEjYmw1yXXK04irSusYHeCOSfR1CjgmfieWQBLgkeHgfiKll283n+IlW0niCqjLz4e1LyS4O4adjqHtOXHxDNjTU3wdoaHHkVyXC1Qp87/4ad+8WOjop2GzInk3BLIq1Ait9bKMNfTayIzTT15dvkEsS/i21mcDq5Cdu5XWbXsjdewV37x3jnXfXeP8rG3zvd7b83e9c4vJivzMPpZbo57nI71h23DaX5HwNad2YpUbzeK6NbYf+lwS4JJIAl0RkkzADrVdjTLC1M8MxPj3O3YJqwsLIzTIhBn6N51ffH3UMaHWw+w3NhRgHFuH0NtG9+yucnBYcn7TUv8AO8lleKwOFzOyHVe7PfnelKNuN5QmVWy5WRfMd9ra/+g8ZVIA7d1e4e3+FO3dWdOdu4Y9+Z4tPP9l1X8E1/jaaIxy/tHnTdqaSg+QZ67mqjrnzXaVM23fPGQZZGEmAi0MIpU/0k4+0lzwsP2zVP6SrvcRUFy0Y8wgjA3b1ybHwl6F9vg4g1KckeYBE4AdvFdy+u8LREWG1Jiki5cS0BZwEKxOKNIKCwiMO7j07Tg1rD66gElhVJBqZ2nkqUIun2qiz893317h7r9B776/xW9+65G//1gXV6hd601STq7ZfhXBMN+vkqvPf5HzXnp9SAS6NJMClERZEYEkH7lRYY5QQcICRmPoAreA+g425erJxyFsJ+1nm5pqCcGIW0daYeVUID95Z4fS00NFxaT484SNi6H9myZoY6VLTZKdEgszvB2DFsvCNytli6R3B3IWfNGxTU7gSQCIVj08KvvbDR1itiU5OiX/rNy5wEUzi180J7Pvz6mMDgVn5uP2qel/znJZ71L5HvRsllkIS4ILo/HttoNP4GF5Rck5+ADQTxU3kQIPVOFLtVUldMSEYH4HZPw5TmzWoUW9Je8DRekP84O0Vjk8KrTfF1Kamr6BY26A2GAlDMTcVh6KMKmUGc3aSNBi1hkkJsbe+u2OCEPQmdIwJfOWrG6zXRKsV8W99eCEpM+P3cnhhgqvM17n3A9m1UPpMmdfN+TsQbfZeaXH5fh514nMjCXBh8PCq9p6pO6JuOatBIII7b5pXNuQJKmH20+3iabtGRLhrEACOjonv319hc1JovQ4+wXCs8o1W6ks0a41y8mDIg8mOMdpkBgtZajJOrW22CACgBtUX+sW8h+RpNeaDRDOJVytQKcA/+s1Lfv50OpggHT/fVOldkdIyW+9N6j8URd4n57ZKBWnUPJ2AiyIJcEF4Dkv7zUJFWSSpyqp/yAIf7WjLARxIzaznzgfop2xJKaxl3HIegyjwuggANhvwvfsrbI4LrVYeufVmUDfcTKixqr8Ych5Vn0pRspQYCwazpsPAgiRKZtY7oP2ZXzFCbBffjnvrnXXLSyTgW9+8oJcv6iwJXefzO7Ttpmbu58Vs/TqDR29EicWQBLgwZNR5pDXOAulIKPzQ28gPMzrIyXSPBf01WLZd/ZBEZva6w8EMMHi9Jty9v6LNpqCofanCT4kQPRGZCjTSEp4PMQ29MmuyX30feNFmiU1c4T5DQ7R9jVxbmwp0m5Pgvfsr/MF/6pi4gn/j18/p/Iz3IrqflcBucNyeb/am6u8aJWr3LALrQxcSCyEJcEGwPvFNDMFq7yNc9bFOdo0rQjM8fBuPvGL4GRGKrgliMdq0ljxdCvjuvRU264Ky0urZ3UudBcwgNVtV8amcE3JT8xYgbHeM3SVjt2NMEzBNgDo9iVqi83oNrDcFJ8eE41sFJyfiVxwjxKEhagxGFWiykmyqC+7eX+GH/+ARTZX5m792gd2WrzV1D/n99Atrmz9f7t+oPK+LSndtiifI9ZsWRRLgotDkEBnzYSFSjq8AbKSHtVDhrx6wjVPdEJSfRlfCge0jdyKKQd4oMZVv31thvSGi4scRWixDXfs+p6EnR1N1kIukRnoXF4zzs8oX50xnZ8wX5xNdXoJ3W2CaKnFtA70UwvoIODoqOD0h3L5TcHKL6P6DNe7eW+H4RE4g/2sQpgrxGb0ThYZDlGLL5Xn7nTV2W6bLc+YPv3luRuNVwYlD09K8F26OQ+e5ScrN3P7gXEgsjCTAJcFOENE0HciPIn/N1SEw4hu3xZL7o6z7Yws5iyl8ckq8OSIqxYt7YLV9ir4ma6QFPb0Ru0vg8nKHF88rnj+r/OIZYzdVGGsiqFPJb5wmxu4MOD+b8OxJmzi8WgP335r47XdWeOudFd27v8LtOwWVwqqCYoYH8WnbxnQZEOH9r2wwTaDnzyt//6O2ztZ1pBTLXOfzu4rkDpU9lAZzJWH6N+lfVmIxJAEuiAoNy9qv1ExZE2sWwQ1rBAaTGEqMPlcj+vwPcmZkUxV7kYYZbXrbyWlbtcXtYWlxpNYQfKBYlZio08S4vGC8eFb58aOKV69quMBg4luLyLIXhV2osW3bvtsBDz/Z0sNPdnzvfuH3Ptjgg6+s6d5bK5yermy2CDHkTUsXJOy7CCMJvvvBGl/5gTU9fTLx2St3ns0psZsERF5HwR06xzVziPfqqsZ9KQDfBJIAF0QbjB71hesgda6FSRzB7wMnCwZ0lpibtUYccgIEE5utilCPLXFv5wUYJ7cIVOxhR2ZFWg0Spo2PcrM8PTGLLy4rzl4yP364oxfPa1uz78qxKeFhywAn5m7Ae5CICHj+rOLZ0ws8frjjr3x1Te995Qhvv71us0W0LRUgWUFGrznuJpG0mzXhB//AEc7OGN/8tfOrGtm3OCyaEEnrdVNa5soe8jVe4WP0WxMJ8ycWQxLggqhAZDJb0FME36DRukiDE6YQBvcJgaoitULRYybkQh29fGMRPpujgvWaQshWRZWVs+MAACAASURBVJ2y2745Gc0tZuD8vKm+h59M2G0taSaMUCZiXdhBiTHYzmPku9sWV8xmevRw4ufPJ5yfM6Yd490PNm1Wil6vzLNjpi5ZWtmQhHPffmeNH/zhSp9+suOHw7zhEXOqbakZJVfkEtrnA+dKxnuDSAJcGnOeuxEhoMCs+X9Ri3EwlcdjZ95FIzCSYdBmx0dkjr0uREwuOd0XGO3uhssLxpNHEz96OBmp+tklp9H8mr54qaSwQTnQy/aIOX+NDIDtJeMffeuSL85bh73z/gZYyUw56RszgSnMomNflxHEePvdFb7y1TU9frjjWmfVWeuKGT/dTaLHV6m914lAX0m0DIkEpRNwSWRQfWlw9yIgs9dkgFH0A7YDaC+yOzMaxkkafoIQ7HAl1Tx46w2ICun5+/qDjBwTrSP5Pfp04kefTpaHdnCk9vQRVSB0LtfcYUq8ToTuI/3e72z5N3/jgh9+srUouLZbFXDX9mHfyUnBV7+2wbvvr9sNZz8YsafMDgUz4vvRhD3UJbHesb7r1GVIRX+zGdi/T5EKcEnwSAxxWhlFXWhmnx/newNH7fsGgU4ZMuvqzd36fmSHMXB0RG1dBlVIkJWbYWK0nUCCHES6yosov8cTP300ddfZvQ6mrTG6LxHNYSHCPYwR5/bZTWJmpt/93pZJVoZ594NNI8sK9w2KDWyqVtshMvatd9Z474M1Pvm9XVfvVcGPa/IDb0Zgn3PmCLuPlG31hcRiSAW4IEKEI27UESTrBzQyuIoQ4syKPpY7lGCAgroa2sIAY7WhNitXbFpXd3x4dSVuQ+7ysuLli4mfPNrFuIgGS4b2s0tZaJQ3NpiYPJ15/5Sm+uJnOba0Pvvou5f43ne2/PjTnWU7tkd6sqm+CnhCelCCR0eE997f0P0HK6/3NchpLj3mkE+vz8S8vs5wHMXXbh/QO0oSiyAJcGHEcQuLnYb9ZhKOqsgSTrBXPj77t1OQMFehb6Pu2M3Kn9ExBkv6GSSwDwxgqoyLc+ZHD/vncBy8YCJlhqHAdWZi/7BzSWPxcho+ATGY+Du/fYnf+/4WZy9rR3yR8PRaR/P4rXdWeOe91edSUTchzdcRavFar6s714FZHkmAS6L/gQaLFDAiiGXi2O+y/0CB9Chs90NDheSfKVIaEVBW1BGcidTB0WdFpMC0ZTx9UlGn1tB4/k7gBLXaNc0vjLRVFHL/dDgz96qQzS/aqUFToLsd43e/u+WnTydUlk7uXiHbYcEa3X7rdsHdeyvebMjONfr1Yh/PKDQcwnU+w+vOcT0R0r51kfjcSAJcEGHADfnQsdDM51CWo69vOILV+NyveaChtoz9alV6L3oweUmSADmaxdKOaWK8esV89qoqIcmiTPFkavGqyXvg+iR7Wljcw98W+VRzUiv2iKgypDwxygjryeMJv/e9HT9/Mtl9o3Izh00RSg/qd1Ll89vvrun+g7JHNjcksLkAymvhdQInQ2NS/70BJAEuCDLaagtGjXfsQzdvDtaviqVAcZ1mZAxaQHyMHl1VwchYrfZNQgpExYAbqKHctGM8f1YBQJ38HBtiREYQ0zcoPuGyvWiwRYCZ+n26XmJ/ta29TQ3GNBF9/7sfXdKzZ1MgO1eA8vxkV7tBCd69W3D/wdrqs9MOPr1Dyc3XJThfdfyh/ddOhZNv+lBdic+OJMAFEYyp8N/MndtUmLzKAD5UbfwwOg21jDOQF9cHkc+X2h9VzABPjPMz5stLS+smyZN2f9wwk6Nv+cygD8qOO+W4X77vLCUIv46mAoGzV8wPP5n41asagh7cgiJwU9jMfnl/enuF23cLcDAY40GOOfP4JqrtqoUVrptjfFUdieWRBPgmEH627Ufcor5mgcagRBhOLProaj4czkKkFrHWT4CR3/6KCx1PspGilpsqIcybDZQeVF9oL3SdmEgLwXtJ3S7WeXgtSjywOeEQwbiz1MxlAI8f7vDiaTV/n15H9G/WoAj1qm7dLnR6q8ye61Bk96rFDA7VcV39cxiPGYyIlIELIwnwC0EcSGFrDHPIZ/IwyGxFe2/iZyIzhYlof7BEPx0Z4RpLMgN1Yj4/F5dcC8UwwHtE1r9e0dAAs5LFv9cT50iw8Rzaf32g+emTCc+eTVyn6PfjLjiiClBJEACOjwknp+VgcvJVn6865lBA5To1dygQYknz0U1wwxSbxM2QBLg0DiguGwDsgonDZ3iAo5HN/O88ThSRY1gHiE7lIMjCo7M05LnX1j7dwtxWeZFpbaYmo2UfAyCkKm7OLg9ExsxiRs/nLHYNw6AMO+Loe6VW4OWLCefn1QiwcSCLImSPCsNJ8vik4PS03MiXdxOSPDSV7SZ5fuPCC+PxJEaB/S4yF3pRJAEuiP7mPDj3XQN2qz/HMAS79huM4x7DDgnQmrxjwpDkvCcX2VdylrY1M5JwecnqlAwScqwgPg7XCBj7r+1Qi+iatTy6DWeu0VSRfh7P1fDyecX5WbN/Oai8qkERiyD7dW6OCMcntBfRvWq9vtimq1aFmfPxHVr4YO56ZzpCvRUUpzEmlkES4KKI6XpNyczesGn4A4v5CkvkA83SVz9ooCHV3pZmBkohYmU5HtrBUJIbamVMW9vM1FFgVGY0UKOmJPbBEerMV+8TPxuHZqlK1ON6eAJ5T1RnZxWXl9wpPCW7atFgNnUIBtZrwvFxmX1eyNxc4ZsQ3ly5q+p5XdUIb35iQSQBLghyAiKjsVmMA5xU813lOjNnUGc0z7+3ZfAlR8Ylpb4Jpm8MjOyqsKUScq9jsa/+xJ8XttEeQQ7XTdbMcL+IJBpzBMfu8P0AcHHB2F5yp/DGmSFcAZhZDKzWhPVm/qu5KtWlu5JB6c1Fj6/K+YtJ1fr+kAL1G0Kav0sjCXBRmKJindV1qBgh5P4CJm4s5QS2syMNkK4VEOqjICgbcTGRP3ZSi3M4juN5QjOr5o7E3WEZwS6IM8xuCZPuKO7TC+0JD8Nbnte83sY9U5uoPW+kTmx+PssBVEIU0msc2PycBEIZsxFfI82lnfvwXOCrFlgIn+28V/n12tzxxJtCEuCC4J6VTGDZ4HWW6lTMHmjgADISNB470AKXksGs7QzkoPZGm4rRCKPxHXfE6uY8dezYCVAlBZK2UD+lbe+6Oq4nffyT95Xuk/N6CgzJc+6AOompW7mbAtfSXtz/x2EfFW5TBGdwkzSVuRkiui+Wmzv2qrpvNksk6XBJJAG+CUSdQ6KGYurHiL3B3n1W6ePkRy7KehWpU8qEo+ZOeI2+MeahxmBxU9fG7uRMIFnhZo8ke8JEPExmPHNUjjKzpDerh34J732xHVF4Snqj/08I30zivWu6WdJxVH6jf+5Q8vQeolfUzuuqVqcHtkvloJw5reCFkQS4IILkIx384cc7WLZwJlC322DuDmRoQZW9483E3D+OGB6bCMM11qHtJgJKzA4hNjWnvsCOh4wr5Vq1bLwG6wYlznEqXBzs6geIPjUcBjGVFew5wYf+OrMY7VnFdbrasryJKXxVNHfOl2jEec26LhxW/guCvX3DN7PQEzdEEuCC6OSAfna50w+4fv6/Et++j6yXedcJSBkmwdhVgiOeFRCs25QjiwU/tPnqHGuPk7NYhf+5uvWLMpNW31vz3CxubekJk0Xw9j61w9e7WVPzdQrBVVF9iKvDgN0s5ubnrIMKnJ+qdr0Zu68c91N1fPuhYwD5gtS8thhJ+Bmk7fsGkAS4KMz/xh6CbdDBrh/2ScHYREe8m0Swp55Fc7LTf67GfOxFM7lLfYkKEaKMpNB67Y3VtjS/nrV3z2c/RnO09Z1a1OvXm4G3VwSoEF+nmq1fqTO7LYBEfHzSIrrR9+d/YYGE8H6aGLtLc4JSZ3LOkpOT2uHFEK5Rq/M+X1e5dpPsiZeH18SySAJcEEQefBCWIDNZVSmNxBD2U/wMieLasVFxofkG5c+UY/HyNh021Ovg/p2Vb2Qi5ILGe921iaoLqTBjG71mFaLk+0J6CyBcGYhF6o5EB7QHK/WLpPqJTk4KysofRdqlwVRPiK7ymRm4vGRcXKqSjU+jGxGCLvZ+HnGucleDErZTWlCCMP+luUG6ct0pr6TXxGdDEuCSGEYSRQJA4AoafuwDcRCAUlztXTMIRMAEoh3U41wW2TjlWPgZx8eq+lSkmfcpOOejghsqDmTd2tArmvhGg0PmAhD1N2fy2mwStml/BAJu3SnYHJHP/KghATooQQRFuL0ELs6rVOf9rn3WKTD2bS1lpS8f4X7Gds1E8bNdDfeEqP0UzWtz2saHYLHNb04shiTANwIGdH4uhujvMIDCQOiVkGwZyNKio+GPIQl4pEKNwJrOYuTqA6lvRmgxCNgcAcUDt9SUIJkAimpSm2RNo54UzAQn6hgw5gv2DYoBElYJagTKdnyrsxTg9p2CzTH1uX+zARCPEF9eVpyfzVNJ3GqBCCOxXi2+jsnbT+nzYE/vM9THaEqfyS9ouEFeddLEayIJcFFQ/KX3CXhi3lH4TEJKREChfXunZxMntFgmFCbog96amugjxjxzHIZtTe3Q8SkBhZgK2Ewxmo9C70U9jZiFuOzao+Jtj4rTQe7HBZU3d65hlsndu4VOTws58TH0OQSW9iLvPUeQsb2oOD+vfbR8JpHZ1d9Mf4X0lVE1WpcP6rLb15n+qgpnVo0Jj5eKLpbEMkgCXBQ6YgLPdWoJA/sEzgsEFxz+7pALZQZfYOMJIVCN3sqMNu6Ow/6A7pzsUuD0VB4iTACVcf5aG/Cl7evr1lJyAEX1SwB3vkOyWS8ECfIIkWguoJ02HhPw1jtrPjop3covuhJM91yQoAinyjg/Zz4/qzMKTD+HT34/68rpwqyI5qrVNdbpeXzMeg6J+iJ+ng2UcP82GXBJJAEuDdaxPuQ9E1DIqaQFMMzx39fhR9rjgIy8egIkC4bA9ikRYppAhfp6o2NR+dECJmKYHR0Rjo6cuakYkbWBGtRcOG/7rEotPNbJCW5mji9Zt2kF/XTAdpmsNwslydNbBfcfrGi9pqDwdE4wz0SE29/FBePFiymoM83Xi2aoX0vcjs4/6e9dKSqJHUrhsYsev/DhMw/fWlCTaQEviiTABaEmShxAw2CPyX/Q/8k1Xj/wXbVxeK9MtPeeQs0EoDKG1QZ1NLX3HMoikCCDcftuGSLY3NSgqzEhNYkUB3XXkWK4Dfhlh1kPVnacGz2+98eIEhG/98EaR8H31/2hXYOtAygqsDJw/mrC8yfVv46o0+z7CtdCTnQdye+9V9+d/vXHaZ32h/7POqh9mRzq6W4we48HTHwuJAEuCPXniVQJuXMh3QM+AIBhQOggQUcGHEdK5E9SWVQGspU/nhiFxFzFMNDkhWe2Ae1B4ienalBzP2g7k9ysdPNjWV0EUFELmsmvcz/Q0508JEe3up08AKZ791d46+0VbY6Kp7xEAtR1AUPun0aHX7yo/PTJzr4P/35uNhVuHjeZnnE4+Vl9pRSuPcw51stT8v/szUzsIQlwQRCxRyptULdoZue3G8v0JhMRgXUll6ICgOy373l1cSz46DEfHQDUagPIoUEDAPoMzqgK2yvj7t2CVZEfCfk/AjTAIZciBFlCIMSaRUwFnfmrzY0sH4MmPjXOCrKqwNWG8MEPrD3yO8z68LQXHp4bDGzPGc+fTthN7tiTk8yQ08HFCGh+//6UxwPoAkPjjacxngaIgmnOKf7eBJIAF4Ql+uqPXGMQYVBbWZr7I0b0Tmll8QGbpqK8TO9/C/KRgGliKmXOzOoHnRcIkqMA995akbCyJl4rMYfzlKG90VcW1FxH3GE6XEeCsVFds0CF6Ws/uOFbt1dUCpl52xTfSII9ITIzXr2a8PjhhLi4q/ZfbwpT9x30Jq4nR/c3sJjU7d+H9gFi0e5r2PdBxmmEILCt8B1+U4llsP6yG/BPEtjGq6Tmkcw90yVLRMUwfMjspacoXZDmc6gogKW56MlYsyLECa/sqXUTXAGCnEv0tBzek34I28DA8RHh3v0CfQYv2aNCGMyBBKscyd4LZlqyvBeJzBokAZMFQuO51azVeuTB6h98sMb9t9a0OSJ0fYjQYP8KRN22jph2jBfPJn7+bOr7O7TzEAkCmp7ipvI+yWkOX1SCcSaJl8MsRvIfzfIkvjeBVIBLgqC/WQbAUQgRERfN99KyIU+OiAnFfF3x195GdQlqxH1+TZXprJGg7jSthAjY7dwPqKZvrHz8ELdNlXFyi+ju3dKi2CRjXFWrHNFSYoKvkAAqxBY81Rw/2R7bKnWQ92FUie3Yd99f4533N2jk1y6iSpTj0Pzf+Hd2xnj4yS64KOZISZb02iMbzwu8ap0/oj5QM5abN4/j1D/vU2JdEqzdSpP+3gxSAb4BsPjxABN0rPlfotT8F+2CRRdsUYFFHRG6/mgiiYASDSeZDltaUVL3GKFN/l+vyVJqFJ14kg0m4Mhfa2Wc3i5UVsxPn1Sz0UmVn18LiSp0JmgV2THFrrGdjNW8NKXoDdNpce+9v8Zb766wlqCHtrpNeXFpHL6BThpOO+D5kx0/erjrr9l60rXk3EIMrvrG2R2i+KJytC4AIrFiL89PFXFUfkH1DXUOxkJiISQBLg5hLxDiPHs17dS/IyOKyZZloq6s/tfkXxz2bjRygS06wwVANdJkNUtVj047YL0BpmChusEoFraY0lEJ6vCslXFySrRerfjJk4mmHbdYQ2mkzCzGbjESlZqU4Rm9udoIRXrLZHMwsGm9KfzBD6xx596KNpui1QT0Jq8pKUbLeZFI0PnZhE9+b+v5jmFGiRJwy9IOzdOHt4dTOAOpeauejWAe0xyJEoPDIn/obzRejNgIWciZ9K5pqjixJJIAF4QMXEBeS/NCieobEmRbIfPV2eBXFVbI5/OqJrAnJMI41CDyzwaWD1wiAFNlXoO4FJA+JwPwV5qrNQoptIVE1xuid99b8fOnlV69qmyePPQVsjjgiLRFTX5WsYrNFNdr9v4jgHDv3grvvrfG5rjQatWUHtDnWXYN1Ur0hiJ3nMsLxtPHEx4/nqzju6XIOh8kiyuUmFXtDYEZ/zqCMoSTuH9GPKzZst7b3CnHSLIU1F4hJn1GiwWfx2tPfB4kAS4KsTLJtUZnEvkPvpmoYQAUAiqpWSVERm14VvWLRWMJTlc2fnjYp2NGQg3bLeP4hHgnC2hFQSFKE2Ync1CAHQkyqIDuPii4dafg+bMJ52ccTsjNN8mEqoamXFQzV73hVreoHibg9u0VP3h7hdNbhVYrIlVNrbwHNWyjETervyzsA85e7vD9j7ZGchJURVuChu2BxVoNcSS1fu7xiF6QNXOY5Vrs+3ZFx9TuCr5MWDB37XwxBQhBECsrpgpcFEmAC6Ko064SWu6b+uJoUA9RNJHOQDN/YaxTFAnCob7Z0REiCO3hP7EKNP7ZbcGrdTOJx4pcu4aqu4EnRMeEaQLKCvTWO2tMW+ZXL5sinMwn6JY+ixoDZPX6GBwGsFoVvn2H6M7dFR+dEJVCbQ4fqaIO60hzcGVK21xF95KVa3tkZilygzEy0tX7XQ0qEcrNp82t7r8ENIXozywJX4rVQ2rG+hIGbMRrq+KwPinGaTAo03AFxJIdLzfWGfWb+DxIAnwzEKsXOod2cAbqYD7k1+EoIwdz2Q1mHWFSTzMSdXcRv1yTdWbx7naM1Yq4rEBVrML9MaXyj/ZM1Vik1uYbVEV478EK20vGuTyrd7dj7LaMWkEV4FKaxFkV8HpdcHRccHICOjpqhEdEFPMS1AXQmZNjZ1JQhtoZZvsT7r21wXYLPH444cXziWtL1+liNI0Ig0lb4OQFI16lodH34IrPG9mZzcF+7czmliPupvCewHPC9HamI3BRJAEujcZ4PvNDiSuqMgnVQqLDPshVF4g24JAQW50UR2VCJXACZJyITRvKm5a7vGQ+OS0MgCadFaHt0ANEbcXkuJjix8Mx09Quu6yA27cLcAcodp16ftNppARrpmKkICE5dXoqwdkFaDuD37InSr/q1YrwzvsbIgJPE+PVqwqu0s8UzU5NdbnC7JXcRdvPXUqT9/TAZO2a9utkdY9IsKXjNukLtnzSzlucWAhJgEuCXI7ZAIjOnAJAllGSxFqY4Wrmr5tZsPLEVNxmDBoHkDRrpQdmUCEwx3yYYEFCuOPiouLkpIAY2EngwMivs4sDu9iLeft8t7XNDfamttARHTF15BC6rlfGcL2k/BGXR7ZzMsOfijRIVDlRWRFObxW898Eajx5OePF8h6o3o5CGEn1wXdvku7EMHzVxuxkj3hd71xe+u9G7MH5QZSgndnNbbz6ZubsokgCXhCqeMEiD089UXyAMKiSPqY0E093vKbjQbDCaEiIWcdh26gTZEa6X7Bjg8pL5+JjAWyb1CZr1G6qhXqaGQIPY2IMCi6RIpiTbuO7Mab8FwEi8I3lRflqX2vqhDn2/Zz6GWgDg9t01nd5qARquFS9fVLK+1euMeXujaiPZr6q7m6kxzCSZs1L3iC/kBlpfOYMbEYtjI4TTEwsiCfBNgMLcTRm/SmpxoFIwgQGoj8fowswxt3lJj6tuGbpFPcQvxlYRwFV4pgBcJ8bFBdpzQADsdn1mhr7ZCz4MZG3qUa8tKsKO7DwXjo1IvCwomL1+mkFl9onPFBrE8S5iEHYs1JTgacE7726YsaVXL6tqzPbqeo5DWqDct+KN6XBkOOjW/rsTc9a39XW06dTEe8RqF5jm75tAEuDiaL9uItbpXn0wA6pmXBB1hlsQOSjEqBjQ/IBFnvtRdfl480t1FfajhoDCvb+wTozzc/DpSUvd3m65Z5+uzhBsCErNFR3NBneielXfnp7DLOJBuDqNcGdeslSoYvdKzLDorXsbOrldQQX86NMdvXxRUZlCVdEP69VAUmZG8mvVRzPa7Ne+dcOznpxdY8RYjwt+SdYn842/osQSSAJ8M3Bi84EuSWDYU0+DLGxjQrep6GLNM+uPKUFtGauG0ex70IUS1BxGBXFlPj9nHJ+0Ccfby+Fo2DV07yO7GsmN5m+swkhMOuQACUbz2K5Lz6XbY96fmsd6bULGmhTt7Wz0vVqVFqjBmmvd4eXL6spVzhh1pBN4zBH0jpVCnuYyqHqEBGt1PPZEJ+e2oEpnepvspuhTSSyCJMBF0SuTQARx/EZDUt/IlBEEohEtIf+VEuYTW4qMm0tdwEDGaOO3VjmBJJBsLWuuObGfK4POzyofnxTQMWi3Y4nsRgEYkkwGQrSNKnlHEtzbprO+3LRsxBG263nMAiTvV4RGdGSjfT8ETYYip3c2BGyZPlijPNzRy+e1zbwBzQjLmMOn9QVSiyfo3rOJ3XCVsJjUzBJpenyvFsmiTrko4LJIAlwQynOkH+GkpltUrFjeHnfbmUgXOQiaZk9NyUCiNl3OSMT3mnO/yEBlrVfkk6blBO5hZtDFWeX1EfHprYLtBZM+QDzm0wx85xuhJiuMmDo2CeqwtZ+tsWZS87BdjhNqtY6LgZHuDoBwtwn+wtYXoaEgnN7Z0NGtVgnXHb16WVnmNEvJuDBpf706r3ucmtcTvh+3n+TeJz33EWghR1tswW+smQe4LDKovihUf1GbDqa9G6Z9xMdfEkHXEm1LWnl5EOkSVjZtQdbO1IeHq/LoFxyVGSj2GbJKc1eGXEk1zx/sDwW02zLOXk5YrcG3bhWs14NmFSJVU1QJpjNRwXvkJ8W7AIlWNm7vlrWCvxIzeKrc1sIKshp9/cyQZwKzNY67v1Z/KS0w8u57G759Z+WZJ4MKUzWn2H/mx+jkm38fgmP+ZD39zuQ8+n1pqpR8W11WQWIZpAJcEOajUf8WguJpny3hVbe3QSiPsQTa6ipVhF8jJNC4Bl03EAZnuznVVUXEfQiTsEgXX1KnGYjkQUpS/dmritWa+Pik4GhDdHHZlpaKCpDjG1KS0o86K8y3d4ox9g1HlRPIjghFkht324qHj1rm9r0HKxyfSDeE/vD8wHCu/kPfIWjm8MktBpX29+pFbTNGKJrDZpvr1Zla63yzsg0cc1r6746G5oicb5cSlhDS+5Sfi0Bzl5H4zEgCXBBmjsn/zQaG37k1oBnEke6ycUEwuutyA1tlg+AJaRUcEqgB6CIMVpMO3fg42736oPnT+lxhTDvGqxcT1mvi05MCBmi7ZWwvR6IxNuz8kcYbep5AcGYamvILPlRqN4ZSGNsL5ufPdnj5spLx+1PgHoOPTwjt0U/GpOhYIhDsHvuSN4pKS5Z++501M+/w6mWVmTu9n9X6PObxAQMxkc/g2f+e97h4JEq7NcXvjuTuOUvkic+KJMAloWNKCIFUi4kd04lB7owqm6UBAJB1/vZUE/ptJNpQZ5YQy+yLsN+r9gHYVBIZf2nb3dcWLoUArsBux7TdTbxaEW/WhLv3CLtdM5d3O8Kkmd1+bcF/KUpQClhG7/C+UFtEYlXaYD97Wfnly4qLCxZea5lDlYHzswpm4D6tSJWgnS/mEnXMY6LNOsR3M05vbXB8wlQK8aNPd3jxfGr9xJ6WEjjT+20Pe9Pp/Gchny3VqVOTcqwpT8ublJ9Rkt/SSAJcHKpC0ORDEB2dAeXbOIzR6NMPqRhhBkIw8TqC1M+xzAHI4GqUSa2SGEQBQnK1fhABMu3aIgevzoDNhnizIdw6BgoVmiZgqm3JrDqJ4OV2IOlgJm+j+sAKNV/cNDGfn1ecnwHn5xVczWPANh2mETuYGRcXFc+ftT4+PS3YVfJV93g/YbolUMJ5ZCZNphTCg7c3BAZPuzZ3eFyiKpqs89+/f+9dXud8+WEGSQm5f6SCVta7TQpcGkmACyLOVCCd1yX5EjYQ22jTqQI+zW1czSWav3ClJEX3UigQ6udQIYU6pJW2yILYu2PmiZjI0u6oO6KVWYBpy7S9ZDUBebUi6N9m0ziiKU4iFIAncGWAK6gy87RjbC+AnZjUu6kakUudzuWeD21kysw4e1lJZCAIlAAAHvBJREFUVC+f3AJPUyEzP7lfI8bcAN3F7H2LoEK4dbvQex+s8fH3d3xxUcMNJZjEoYbugUjucOhSoOBt8Bki7vB01UhekslnFdHBNic+K5IAF4YEEgBJaZERS4Se7CxeohoPe2Rl+cJAiyiLedetJ2CEKOZZUwnkleokvMauTndVUjh0nVJNGNTD0CtCAP1cZ1evLdbBbcHVy0tnsNqcnbIAqVxP+2t3BonQcswvDBETrUn6hi1QxGr9t7NvmxIEiHB0zKjWaXoRbL1iDGURoBlCqYzjW2tsjgt2O+Dj72+x21W14UVghqmB0uxgIbOpavIceCtdvGs1O55c+9udSFtLJgX1B5RYCkmAC0Jd8TrqjdTCFIwgThDHqRzWEEwi4qAgwwC0sdFGkJrNw3AO/iUC2zNCQEyFNZfXPoudqWanNoGr1xLRCxKz4Z0jS6NmFpM9GOpCIGrhSbzGWDFeBzuRFWEJKo0MrStYfYI73H+w5uMToqmWvi9DECRKMl1woduhKndFuH2n4NZtoufPKKzwChAFHwVLH+qtzvrBp/0WcwaYyPc+VkuAAh17CowqWo1yJRZEEuDCIEAeEdl+4RbJnSEQG3ZhtISbvBjL0AwRQC1SL8txMLcSUGIgCKeZaaUKTkYbQ598Qba0EzUxaPzQnm3Sn4PQFjilFWBzla21XlTbGtoOaJzXSmqYSISS3hNUQYfuYRVWJM+DCrYyM+PivNKzpzu+TyteHZF5IYLciuzcXaWKLOtDtGac3lrT7TsTXryoXcBGr5XENPdFwDQTwKiLw/fMReJBpdOmWlwFsLUl9FJH1YmFkAS4JAg2SORHHW7o7TWMoZ4oAnVIAc0wJoSnv5m962JT7GsnM5s5QsHfpydGnEqnC3IqO7VxXJi41vDIx4G8O/6QN+rst0Vfta0EsHvvKTSFtTZmgErLnGuhbA16YG8VqK4LjDvlYgBcXDA9ezbxvfvAyUnh3VRMqVqyHlEj7hIqtc6n7ntgIpzeLrxeEXY71+Gmf0PtJiSlPkI0f71S8lqMJuPvwe4DgkJefvwuEp8PSYALggHzAbKaLeGHK/vjcFOy6D964KR7NnC0OKFBzqBqmALjAbY6VGcKzxmzdnJd7BMoK5lm5+0eL9UaZITYyFp8lVCfH8l8POdCZ1wiAuvCqdbcAvOfNW8C91MKoVmPckCThSwJlnT2qqJW8FtvE9ZrtvUS/avQu8ZcLwived9hsyGsjwjTxJZhE2uQ6BWZ3iwI2tyIz7Q3oL8LV426byBH52yY1EwsiCTABRF+m75QCdlgHpa4dLO4y9vlPbKxMUkhbhCJUBztZrjFWIWqwv3xLoGTMPNAh37fLuqUrdp+lkGiaw6IXYww9GO/qFALQtgyZErhsQ0IzKsJ3TI9TKTWmM5tEzMavV1eVH72dMK9B+D1ulBlMiWqJvXetxY6nOM+DyZLsEIC0ibzOdim0nZ7aj1TodA4t58J6iRo21hrgxJ0IEZ3mKYEXBJJgG8AewQWTByTAe03riltnVkcDC0fATImO1M6kqUMkz0/eZMRJgxVhmnKxj7hClVXfSKZnIzb4zn1Y5EZLca0TQbuL1YiwZeOZ1Q/ikp2LmJjVidLYTdnOoDVPUiypI2Rit0cGMDZqwnMTPfur/jktGC7LTa3LRrVgd+GJrat09So2qP6NhtEe0x5rH1VSleWLWMamo1NyY/vuNMUYytKZkVw38DEIkgCXBAhtcV/2dF3owTiN3hVg906oVLG8nij7WSkR2ZiRqOWI3lEJdYFPArag4GMBMN7JdDet9fmKKuOIewb0iILVapp4IYY/nySVsSPlzPq0NaIC7sYYtLzM9rahY39ouRqXaH9GwibAVycV35OQClEZRWeU9KBoTZq/K7a7YRxfla5TvoFsUT1lWfd9RdvDlpN29HL/fbVaWSrdQT5D4LseTFK7HrjipUmFkES4NIQ5iF/C0BVQjQlfZuOP7MRjRECAYUxoIPApN6e1QSTQiRmpA01qZuKm7qRzogaSejqJsy+UIPWoZFMUnUXrt28/k0NdjP5VAd1s05EPik52nkkoKLJk5GUVRQiVt5O0DyDRl6wFBlg4gcPgJOTgvOLMqOlVF16ncSMaZr41auKKh3XktydcE34yQMKSuBRj2yJXg9fdiGG+FvD10hoHgmdCdLLVQrvE8sgCfANgACTP70HxxUSEIjAiKpt5/63TqoSwz5/lpnUz5rE3M2YiD6ysCEou1CHoRSmWkUv0sA7dgUk0/M8eVAK+iV5JNu7JqxTaiFh2R/Oo+a9NF8vT7ypQQyNfCCHtHoIpqwuzic8fsx46601Vitg4tJds/e8No5BVPn5s6kRaDRrpW0MkXsqWMuY7DR8pO4luh58+m+8JlF+yXlvDkmAbwoU8ufUXG3vnTCCmDBygigrgj0YnGDBD19wWvnVx3tTfcXI0WktCBFdpUmDH2SEIicS9VeKW21ehcZeXTEGbu2iHOEa3RQMjFAQ6o+rNoga1k5S41E2x1PGaRdxn7cSbk4zwJeXFU+f7HDv/gqbE6BWAleXbKSdvAIKKj9/WvHs2a4tPViEz+0aVbzZs18codeDadu6PdwX9KYWI/1+XKvJNCDFLzSxFJIA3wBkKLYRQojmkio7DX4o77SxRU4SGiTp6toLTsI/Ktl4nd0T51RxQR53VpX84pqBruJgOlX2sS0JH2eXMAqDqz5SQ/MAXeFZiGMYvPYx5gnqYHcFZCSt3caNhiMFQ9dOblVqD5E0EEGhMnB2XnG5Zb57D3R8Qnx6WjDVQuvS1gBcrRmvXraFFp493WHaAqEN2jjjXvF1KvtaHjNcrLfDik38CQ0Mc4VDvZFLCYEgm68WieWQBLgk4iiPviB3LSm5GWHIZyWtcMs3EnF153MlOkqt7HGC4kTi1QRy1IIFbUaFExyLOrEhajToAYs+9KFLXDUrsAnPUgCuJsk68gunt3w3TYJGdUllbkWlEOpm3Zo0VD7UmYbKqBobFgHGMfOaQKiV8ezpjtcvgRdHBUdHxOs1Ybdl7CbGdsu4OKtoExo1QOTzqZueU0nuXG/fnpmtg17TDM34w3BBD/0+u++/nVIqTfJbGkmAbwyDTIF7yzriAzQKrO+N7KhXiUAYURzmRRXlIoYKJLVLXaFUbQbUB8f9WDuQFsOQlo8XA1T1zxE8Atwa5LNYSGZ1VCFKYcJWLZzNTWJJCl04lwk7b1u0boUgJD+RG+nJVL/WpeJSaP5PFVNtHcPddqJXL8C0KijUVqYJ82zUDwnrN7b5udw3j6m0L8z62BWfOjfG30jrIA94UCjTlnkNgpHHoxOfH0mACyLYL6TjPvzoORhk4QDoAa1QHAfsx3dTD2D7PeDRp7OZ6jGfYRFTUamur8tMcNV8XbOVeITItD1FPPciPTmsY6DDts1sc70aGu9DngCuLc2GAgGb8tXrZj9GFiltuT0a1AE5yZJ9GXHOcK+sTBxTm44yxb6n2a/J0pcwkKCSHJXuBNqHemhQeLy3vwVeXLFr0+LNJzXgskgCXBjms5EoMCGMZtVR4S4v/3s6cJz7r6oFQZW5QlQL0gasDBweT6EKK2xv9CCGXVdeSM5XlrFs3tZQHeBt9RiO5ya0ySCRvxGqYlGiFCxWKH+GpkbCFXvYyMP7o/kHu3X4oDeK1n3yzOS4LyxcoBW1lvbfi16PUV+898AXmODuXiKsyM5XHDo8hKYQTWG9AwZG1GNIAyZxhmNiSSQBvlFQJIfOZrK3bVCr4WQWoZLHWIWqyGBceaiBXDDFU5pJ2SuvKK7QLHNiYuIqCyto4MMcd6YGQ/w5DGyuxDYNtrJmpMDIqwKs0WUOUyP2u81N9mZOc3etHUl7uk6teqPQW0ODRrSjqwF+/aKkhVrj+75pTVlbN7YWBR637da3reMCg8pbSwby74TMQahRekhWtJ0s8QaQBLgkQsa/mnaj5ReJCHBFqPsCGzWwDia48guqMKySpGarkqErN6Bbqxg+kGP8wMihkC0N2LVdW+xmqiSvsT+cydi795E18hAz19oRnl+CoQtCUmDMcbFpI65QYdkppbR0ZHbiMEeqEmPgJO8eZ8Zu8Ylw5fpcEMAD+3v3KnjThPS9o6AeBq2z6Gfvjii2gRY5bps19pVYGkmAiyI8C9Ey/wGiZi62zVIyHubma58Q7eQY3Vh+RFQzumOGJCGjj4ahrYOqqTxq08R0dLPUWshyGGmvBm2zL5+1p3TZm9ctHcjwB10wLJeRVCk2FrFl+e04ArjCF5tAuF7hG78PDZLP+c6DPco5qrSEZT19yDmyKTJJuvHUlEhNsaX+bYX6MIhes8jhDKyNMupsd4GYjZNYCEmAi8LlCuk7MVzd1lS/ETEHGWOuo9566yWUjyuOQ0y5hH1b1BLuO9NparHqcD4KlSqJxRkn+wTj5YtMrVNTOhqKTe0xFRDXdjHSK7JPzlP1UmUanbkGEIhdlBFz39TQGv0WnIsJFhKWrwDBbehUJV+Mp18G36C1lcN5YOo9fl8aoNH1E3TPqC5FnYa18sm/h6FuayP1p0t8PiQBLotzAPeA9jwMwKRa00kA4siLv2RhKerMX90XSDASpAlGD6HAeNeTsJWRmy+tk5BSrxCEn1c9k8Hx3qw9V7KhjX3qDEU/mVh2xOZVDBMA2TkEDJsd0j1GWNoXGb67bzBCKne3rGyXKcSBtLtbjLc19ogHYqV7mphU6RrvW0JxHL7BEq4r3Admcpijae5yOZrr1g2uWC/GWhKfHUmAC4JQnjDz+24+2S+fORihnZkIQH1oDLhrfPADdkM7VKRjREkhqiZ1/ANGgnqsfbLcvKCS9KlLZmLa9Xk7xnxBjcYSWn4gbDl+ADLjhJm4MCCLHKivDHZ+ISp4IvVcJ6sRSSQ5lapiJSPGMn8GNlQFptnRkUPhxq52cPsKSnGRpqHomKlC0umSKukRDDeTu24cSLAp4bCNuhB1r7bly3k62y+Jz4QkwAVRuX5MRH8EMsiBTikwEH2BtqYx3MDTY3wRUFUHJvqa1PDRqzYv0BFh9HGZfy0Qq8kj9jaqgtJqBmvYVmuxUS2k0hL5iDXfr0iKSos+x2ePyIGFUMTkNdM/so+uCI1wwqGjOhnnNYtGJFtnMZidbPaxfx8IVZHcqLQnONyErPv1Qvz+EL5CA1v9+0GVSHJQAc8DM3q75WKp2J3x+2N9ic+OJMAFQUTfBuNPElpKRpe87IafmJdOUIGBOA5QJ8GOEHwBBYT6FR4Rdqa1XXArLqhUeSNZJaGs75QHEZEv2SU7YnTGrFSrX69TzGKKqSrCc8FOjQ3S+RSEzmzvFliI+T5WLmThjV1DXq98H5bxYnOztT8p3IBKiRcaW9qzcziLMKTPYww3mbFdMS7urgsXnPDZIgDx6rfGhiQ+O5IAFwRR+YfM018EEdW2SADWKwRlFgxUlXXEkktC8Qm+kfZseBiXDrZpZymLRlQT04nXarNMkDgoXfNYGaAM5fQcsFbENiLKICNBffBQDaSF7twEnXY7nkYe3K5KrMJvGqN5C1e5Mehj1++KTT6OJK6irR3m6ksdhxTPaOpvnwGNUN0M774fdG0NJgI43hDDYl2EcCvdUf1/kVgMSYALgpl/xd5XgCeANu3V0MUFAZgDKWyCai7ZD5U+LmJiNV0UFz4yA5kpsUXTsROPg5JjtkpaG+I4bXX5LBCdEdJMXQ+cdEpTJakwkWXcMIiGdcOECGwtLFI7OvCemrNEgTwP2MQDAXUlm5lMQrPa05Lwt8fJVisPG/sz+jNACCG8rw+4UxKk/m7QzulPqiMq4Fr1a2idSXX1K0gshiTABXFy8uKXL85vPwNwjyuwm4AjjIMwsAICG8FYi1o6IRkBNEVDgGRNSG1MxiCiO7oxqsfJeVQVyf5oTuqIh8/S0GraNFmE+job2UlNjmBPgxmuLzIP+6o1xaPGQdvZwWoCN/E4pvUJaRklRaazK5OGjbvFvLYFFlWqxVtHa7g9samdx0is62wOqXpekzoMSXuZ9HsLhSxXU7dJW3QRHLYvkujpWxcP/m8kFkO5vkjipvihH/qhMwD/BwBQAXZbplqZijwoHeiGd/vs0kotUbbBKINDxoeMV+rNRR0sXhyqEOWDTaeLbSA/gIjApbiyBLX2qyO+UFeeiZpSsW3hfK19LbmXSvsTnmnqUrbvXR8xqD2krn0kOaZY3Wzl5a/IfrRrsHaUAtCqOxZFTEzbX8DWdyVyuNTVHgnQ7Nli/QQqIHvvr+25xt421ussxfoMVGS7fhXaF7H/Srg2gLk2GmyJ6vWX/sWv09kNf46JGyAJcGFMtfw9vZlPE7C9bKsrA7CRTiLg9BidXdARVCjuh4YcO9UnziE2T9ZJsydYwIiC7H2YsaLmmVe4TzjGsHAiMMIzQiT245mU8CiU2yNb6Qcqrb+UgOL57bJIhKj6KvU9dZfLJRC8kaF1pV/PSLTx+kuxPrG+dTJt5q3WFf9IWwo7b+NqJ7pInt4O7RZR40zcFp4gxqps/qdrf4CJ10KawAtjt7v/v6yOHj8h4gcE4stL4OgYEnkQP1nIBzRQ8JoDwQzV7XsrrwAEmx5F4Ti1CqWoOfvILdAuQGL7x4UVtIIh6IAYSBGWA7frK+E4NacLEcdpv/rwdVtRhQEqchPo8gfJTe2+CaxGv25Xy93Mcva8ws789f17lUL7Qq9f70nUV2H/t2tA/Byh6zQSNwKGf02diqf+ODOR5WAuraOeHt2694tILIpUgAvjj/0xugTjvwEAWoF2W6btZVMSgP/YSRYcCLOHe7jSiqrL1Z8wmCgpVvU3/kV/E4X6pB7qtgV9FbZTaIupxqhaTHUVJTbd50tV6Xs3Q4Wf1O4lLaRtYzU5jYTMfCURTeT80ylFVXRi6pauTWaOdn2kqivWVfo6e0VahnNGRRfb0PcVy3dF2pfStngs6eo17YbSKHyFo//6J36Cdlf89BKfAUmAbwJl81/o9AQi4ovzkP/m67KAdAZIJLfxrQ7S+L6Rnw5+Drt0vz6op22KJGVmq5TT3W0bo3gaiBxndYmfi+K5tFwji2ivy/JafgIudl4hxYFEQ7uaGa28WNgIIl5fbFswTzui071KLgTxr0Wiir683p/YHzsQ3PDHYx0FvTlMBDJSDCSJ4D/UG2Wt2g4GgbYn27v/6ev8BBM3QxLgG8CP/Mjdjxn4m/KDpt0WOD8DVquOiIwM98ktWmUajQzEB4j5qAPfGc5EEVEzIOPAhVt8YfAzhQBIAUwdKTHKPo4DHVIuKikAgJEVMYoSgAQ3hKCKqjNThNwFMTR4APOxBeUY2q2meBlUHZWmokK72a6V7Nqi0uPiQY6mpIuTqnRx74+84g/Dq/wOmDRYVexza274jkoBTxPAVabPUAXR0X/+J/8MPf+cP8vEDJIA3xCePXvrZwF6ygDKqhHg5QWwcpOuU20KmUOKGCTx92H1YyEZlYEehQgVCmFZNT6gpTp/G/izvSFJyImKSAvqYA0fe+XmZGUFSohuQwlPI75tn5EpQrBEFScBLbbi83KpBPNSTxVuIGREG/40auxR7M7Utroh5FnkT9viCvqQIiQjN4/+RxVJM6a1qb9agTpBzXEC0dNLvvufzP7IEp8bSYBvCD/2Y7Rl0F9qE2TbMHj5ApimRoizObaAm4fmD4vrNlE0TYWQnBx1n5nMVimcDAMpIZpikTjkk6ZiKGFE5RRPsKeOtIydPkaFQ5NII76AWs9qSkOaV4JfUKPEiKRMaM87UWIDMLTF1dXwqopLmLwn00jygay08TGtxr5gJbTwHYniHdUzhe+EAHAp7Yveba1PiYixKcd/5U//acoVYN4Q6Poiic+DDz989HMA/wwYqBPxegPcvd86vtZQkBBWKOlm1vfJ0nFh4QPlAImI+nOZuvWfLJemem50d3zYaCuRyFwJ1m0Wh/XyYZ9va+tbybGyZArDFovQVXLU6a/bmMMKOrK9hsiytrzqTNq2T1ORLWF6vA67Fm17KAPYijgU+7wvEjvcXtRVYHOex2TsvRtSWKhBSfHyQkzfAlRUWpX1z/+pn3r7Z2bPnVgESYBfAD788NGvgfmfBhHXHbDeAPfuA6CBBNExFXUEZ1kfwEh8gcKg69IHLusfL27l2+wF9uM5nn8gDM+f0ZQY3i+rJFmlhVJ/9yjM7phYR/X9kQjtWjg8gc5eJW3GyiiZcn8NfX/0Htb996SH0FC2K2fUZlFdI7Nh/rS9pTDpRKFBj8tLYJqa+czEtMLqGz/xU2//M/tnTyyJNIG/ABBtfhyETwFQWQHbLfDsafP1rFbzaTDm67MNs2/Ho+zFzTAWIzCORD2HBQjsXGaihZLRfCUK5dwJKBZqo4TO99c+d/4yO77/bLNHLGVIAyXo6pKT6TxbOcbr8ii3+/+IKFxLOLf62jrTGZLBEtusf+jq7aLR47VF14OaxiECTatVm+B2cdluhEWj7IxPjnjzpw5+zYnFkArwC8K3vvX0R7jufoWBt4iIpx2wKky37xIfHevyWb5eYA9dKCTMteVZcdJKh8VX98xqM1fZlhkcp/ZHpWXHsAk/REU3voZ9zewNis3MXYgJPJ5P66iidqUvuMraiXPnjOqO1TLWFXbaVGnYQgemME2xmZgbO5N794AXtC1xmjUAOc8+yMr4/QlUgGkH2m4Rp4cTAU+m1fSjP/mTH+SyV18AkgC/QPzmb378h+u0/j8BvAcwam1j6OQUOL3lUUAlC1ufScw9EmM2IpJdvw2I/jPhAycVKwygsa5vmjERO4IKFUST1T7XQDDuK2xPbAt1dQRYZaXXPRPZbwqRQM18jsQqOyJZI74XL51yWeVIjdJhvmCsHGAOgp7+mo3cbetltu3rzGOte7cFdjsjQwIDBfh4t+N/6Sf/tfd+A4kvBEmAXzC++c1Pv1YK/a9c8WPiBec6Aes1cHLKdHTcIqOVYYECYFSGgfSMueI2m4A1+v1CJQOZipSKamrYpX495S5fPzCWk0leEvGAriQTSMuCJ6Nv0FTfnMLTwEjYbu2MJBkvqfbqV28kypNd/8Xr9bf+mAD37fXKcA7RJyj/yUPaMe0a+XGFpeQAjEL0/1wy//RP/dR7H11Zd2JRJAF+CWDm8psfPvrblfGXdc5Zrc1c3Gza3OHNkSROy4KpLM7+g6Zvp/S6k1FPAJGw/CFFc8EAHfyj4oOvutyZuMN+HomKu4htM2tZ5//KOao9EokG89nbrsGReNz4GsvqfOoYRZEinQLsXAHU98EN0KtB940yS27ftPOgFxU9A1Aq/rt/5afe+at7ft/EG0cS4JeIX//1R3+xEP4mEb6m26apkdFqDWw2xJtNI8Ky8uBAQyM2HXVxoMeRaOZzCPh2ZrORBQdyArysiZiW0qgmpb/2pKPP9FX1FpcanVN2EKUWzFwlxmj6ipUuaS5j2kyohyJxehrNyORy/nEp1bAsauxqqPWs44XdsWc9acpQ28YVVGtT+HvE1872vVI2/8GP/6v3/wckvhQkAX7J+OgffHTr+d2Tny2EfxfAHR1BDOJaJSJJTGX1/7d39ziSE2EYgL/Po0UCgYS0AvEjcQUIEPmQbAIZNyDnEhyAiJwbwBmIyCDZaFMYIUSANIC0y46LwPXr2Rg6eJ5kpu0et+1Rvf25yt2VZbuqI55RL3Gb+rUl45uZz/31U3UzPz4l5SiF+rrcS2v7sQRXTqFSchrwKGsQ9ECtAVLOFdcesbc4Lj10azUY0YK+RMk2i1K/lJ1ugVlGNeo2xpvDejJGITjC8KRWmPUJORWFozo8ndCx3Rp+4xxHtBueD1s8zbv9q9eePf/yw0/f+fsFW+M/IgAvxJMnt2/c3T37Ytvy84jy9mh19Vui9ilUIqaqpH00bLof7lQdNq2/7Nh0Ts076qVo9K7+aSBgBEvt1OvfEN3CJ6fnnEJsCoF+k3ENyzYoMg80HD9qtbSPumwZOGkBGCXLHmN+9ZJZYqoml+Oez1m0/Sx9f9v6nAeFp9ePduNy28fWGZhTIxpHciza1gaWJX6NiG/ipfz6+vrhz8H/TgBemJubm1dub1/+LHP/JCI/joiHrczqauNt910sQdcbeZ0ZKaJ/MqH01evkwcvfntzvNxwP5upr3v5yibsk8Ckcp+2f15d9XjySq09LN79G1D7MHMvnfeqnZdnHU+fe+djLuuj8ZjIvyxctbL/v5fdty+/vIr7bHuzfXl+/+WdwMQTgBXv8+LdXr662j3LP97cH+UEp8V5EeTf2fD2O6UYiWnsvR9nWJsM9VpRWu6yXgHOA1pQ6FzNLYz8u5zLLmB/kVFTNYws59c+1vsL1tpJjfakjwtFu1uv7XI4r7xG+bW+jVcJtpLm9aBnHm8vOjXBf599s52A+2B6SY6i3d5b2Y8z7wVd/f1pK/JERN1Hil8z8sZTy0z/b8x8ePXrrr/v/XQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAu3L9CF/QAUlS0hAAAAABJRU5ErkJggg==","e":1},{"id":"image_1","w":320,"h":320,"u":"","p":"data:image/png;base64,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","e":1},{"id":"image_2","w":320,"h":320,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUAAAAFACAYAAADNkKWqAAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAgAElEQVR4nO3dSWyc6Z0e8Of/vt9SVawiKZKiKFFbS61e3W170vYkmACJc85hHGQwyHIYx8cAQQ5BkFNySA7ZTkHmEsDwZJkEAYKMgeTuBLlknJ622+rFVm9Wa+UmbrV92/vP4fuqSErcVcUqVj2/hlpcqkpvsb56+O4vQERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER0IBl0AehgT58+nQBKf16sfksF3zawiwq3CGAKQGnQ5aM9IgCbYsxDhX6tmfsFRD40Lv7Z/Px8fdCFo/0xAIfM8vJy1Xjh72aq39cMf0kMZgddJnoJilUIfgrI/8zixn+7cuVKc9BFoh0MwCGxtta8mmTx3xXBDyC4tN9tRPhynQeqetB3ngjMj7LQ/JvLtdrKmRaK9sV31IA9fvy4Irbyj63F31cg3P29TuCpKlQ7bywtvnbmRaVD7PxuEogIRPa+fh0KhUDqAu/fpvHEP71yRVgjHCAG4AA9Xdn8G8bov1LFYudr+XtGoKpwTovw024IdgKQhtVO+HX+GCNFGGr3F1cRhI+MkX94cWbqPw+0yGOMATgAqipLa5s/EuAHu78uInBO4ZyDc25P4LH5e77svHZ5IBpjij+yTxNZ/mh+dvKHIuLOvqTjje+qM7ay0rjiJPkfAH6r8zURwDnsCj5l4I2YPPQE1u4XhAoR875R/3fn5iqPBlnOccN32RlaWdl6zYn7PwDmgaK5q0DmHLKMwTcOOq+xsQaetYDq7k6NFXHyO/PzU58NroTjhe+2M7K0sXELKT4AMAXNm7QKRZpmcE7B3Bsvqgpj8hDsXAtFi3lD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DIKICJqtCBOVEm7duIwkPWCPRDrXWAOkkSci3T7BN169jm9941VEcYJ2FL0wuVmK27fbMeIkxm+9+xouTE+ifYLJ2XR+sAZIYyGvCSoazXyeYOj7+PCTz7G53YDvebCeARRIkgxxnKBSKeEvfutd3LpxudiAgZNRRhEDkMbG7tHh61fnMTU5gd88eIK19S20oxiqQK1aweyFSbxy4zIuTNXQaLbhnGMAjigGII0VkXyCc73RQqVSwjfffhWtdlys8lCEQYByKUSapt31vwy/0cUApLEkIojjBHGcwBqDSikEkG8G22i2ureh0cYApLGXuXxfQho/HAUmorHFACSiscUAJKKxxQDsLfaaE50jDECi84Xv2R7iD7O3WoMuAI289qALMEoYgL21OegC0KiTjUGXYJQwAHtJsNT9kJNoqR9Unw66CKOEAdhTep+xR/0kRr8cdBlGCQOwh5w1d/OjdriHOvWDQp3eHXQpRgkDsJdU/lT2HDVG1Av5tSQCZOr9bMCFGSkMwF5q1//UGWx3QpDdgPSyuteQKhSyJdn0/xtogUYMA7CHrl271hLB/2Ldj3pOAGTup9euCada9RADsMeskz8GAHYFUk90riNVwA/+66CLM2rYSOux999Xf+HK2ooRTHXyjzlIp7H7zSmqm5cvz82JCE9n6iHWAHvsvfckESv/Thl71DMOzvP/kOHXe6wB9sHTp9vzmUZLndMWGYX0cjQJ7NzM/LzUB12SUcMaYB8sLNSWHfAvFawH0stygIb/muHXH6wB9sn776u/sPhsBdCpQZeFzisFIJut+uylO3ckGnRpRhFrgH3y3nuSGGP+gHVAOj2F0eAHDL/+YQD20ZVLF35iYf/DoMtB51EGiPefrlyZ/JNBl2SUsQl8Bh49WftEoW8Ouhx0TohC1H6yeHnm7UEXZdSxBngGPBN+T6Crgy4HnQ+iWLXif2/Q5RgHDMAzcOlSdclZ/QsQcDNLOsqmZ9xvLyzUlgddkHHAADwj1+bnP1fjvgtgZdBloWGkALCMTL976dIl7vl3RhiAZ+ja/PxnmuLbBvI+x4ZphwKwHzhPv3316sV7gy7NOOEgyACoqnn0+NmPYPQPBl0WGqTOWiH58eLCzA9FhL8XzxhrgAMgIu7q4uwPjJq/LSKPBl0eGgSFiDwS8f/m1cuzf4fhNxgMwAG6cmXmj8VFr4ninwPgUqexoIAgUmf/hbj4tcWFqf8y6BKNMzaBh8STJ9sXVeK/B8UPHfTyoMtD/SBLovJjdfqHV6/OPhx0aYgBOHQeP35ccRL8dQB/FcBfATA74CLRy1kD5H+r0T8Jxf1kfn6eNf0hwgAcYsvLy9U4Nt+FkW9C9FsArgO4CmBKgXDAxaNdBGhDsQnBIxE8ylR+bjL9heel/3dhYaEx6PIREREREREREREREREREREREREREREREREREREREREREREREREREREREREREa48/wEAAACqSURBVBEREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREdGJ/X920AMzgv+PTgAAAABJRU5ErkJggg==","e":1}],"layers":[{"ddd":0,"ind":1,"ty":2,"nm":"Opacity1","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[160,160,0],"ix":2},"a":{"a":0,"k":[160,160,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":-3.00000012219251,"op":30.0000012219251,"st":1.00000004073083,"bm":0},{"ddd":0,"ind":2,"ty":2,"nm":"Moving1","refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":2,"s":[0]},{"t":9.00000036657752,"s":[30]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":2,"s":[160,160,0],"to":[4.418,-16.902,0],"ti":[-1.749,2.098,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":9,"s":[185,130,0],"to":[4.167,-5,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":13,"s":[181,134,0],"to":[0,0,0],"ti":[-1.749,2.098,0]},{"t":20.0000008146167,"s":[185,130,0]}],"ix":2},"a":{"a":0,"k":[160,160,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":9,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":13,"s":[98,98,100]},{"t":23.0000009368092,"s":[100,100,100]}],"ix":6}},"ao":0,"ip":-3.00000012219251,"op":30.0000012219251,"st":1.00000004073083,"bm":0},{"ddd":0,"ind":3,"ty":2,"nm":"Default","refId":"image_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[160,160,0],"ix":2},"a":{"a":0,"k":[160,160,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":-3.00000012219251,"op":30.0000012219251,"st":1.00000004073083,"bm":0}],"markers":[]} \ No newline at end of file +{"v":"4.8.0","meta":{"g":"LottieFiles AE 3.5.4","a":"","k":"","d":"","tc":""},"fr":29.9700012207031,"ip":0,"op":30.0000012219251,"w":320,"h":320,"nm":"Search_ic","ddd":0,"assets":[{"id":"image_0","w":320,"h":320,"u":"/images/","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUAAAAFACAYAAADNkKWqAAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAgAElEQVR4nOy9W6x12XUm9I2597n81/rr7nJsJ/ElMe7ck47TCWloFF5CXxLEAyCEACFaKE8IBOIBgdSPSDy0WgKkRq0WEhISEk2IEKJbiiLFlzS5NY6dOHHilMsu173q/+u/nHP2XnPwMMY3xpj7nHI6VavsFszPrv/sy1pzzTXXnt/6xmWOBUxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEy8I+Q73YGJd8YrX3zlZtv2T0vf/8jJZvnRtsh39d4/2KB3FDhpXQFV+//SAe0CFYGqal8gALQDooqmwKILZFE0AL0rVDs2CqArlqVDoAAA7QpRBbSrLl0EAigAVYV2gR8XHQAUiH6o/aAWhe8A7X4yqhBrA53bqR1PvGlRQKH+3pqw193eC9CQhxFwF2/HTn0YQ5E4zD8VRAS993h90K6KiPTe47uy54UAdwX69V07+tqDzenvPGzb/+f84ql//Bd+6S/c/6fvwcS3E5MA/xnDK1985ebJNf2F1ne/2CB/GdqfCkICIN0IAf6ZAkZA3QgI3ZhDun0n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","e":0},{"id":"image_1","w":320,"h":320,"u":"/images/","p":"data:image/png;base64,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","e":0},{"id":"image_2","w":320,"h":320,"u":"/images/","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUAAAAFACAYAAADNkKWqAAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAgAElEQVR4nO3dSWyc6Z0e8Of/vt9SVawiKZKiKFFbS61e3W170vYkmACJc85hHGQwyHIYx8cAQQ5BkFNySA7ZTkHmEsDwZJkEAYKMgeTuBLlknJ622+rFVm9Wa+UmbrV92/vP4fuqSErcVcUqVj2/hlpcqkpvsb56+O4vQERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER0IBl0AehgT58+nQBKf16sfksF3zawiwq3CGAKQGnQ5aM9IgCbYsxDhX6tmfsFRD40Lv7Z/Px8fdCFo/0xAIfM8vJy1Xjh72aq39cMf0kMZgddJnoJilUIfgrI/8zixn+7cuVKc9BFoh0MwCGxtta8mmTx3xXBDyC4tN9tRPhynQeqetB3ngjMj7LQ/JvLtdrKmRaK9sV31IA9fvy4Irbyj63F31cg3P29TuCpKlQ7bywtvnbmRaVD7PxuEogIRPa+fh0KhUDqAu/fpvHEP71yRVgjHCAG4AA9Xdn8G8bov1LFYudr+XtGoKpwTovw024IdgKQhtVO+HX+GCNFGGr3F1cRhI+MkX94cWbqPw+0yGOMATgAqipLa5s/EuAHu78uInBO4ZyDc25P4LH5e77svHZ5IBpjij+yTxNZ/mh+dvKHIuLOvqTjje+qM7ay0rjiJPkfAH6r8zURwDnsCj5l4I2YPPQE1u4XhAoR875R/3fn5iqPBlnOccN32RlaWdl6zYn7PwDmgaK5q0DmHLKMwTcOOq+xsQaetYDq7k6NFXHyO/PzU58NroTjhe+2M7K0sXELKT4AMAXNm7QKRZpmcE7B3Bsvqgpj8hDsXAtFi3lD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DIKICJqtCBOVEm7duIwkPWCPRDrXWAOkkSci3T7BN169jm9941VEcYJ2FL0wuVmK27fbMeIkxm+9+xouTE+ifYLJ2XR+sAZIYyGvCSoazXyeYOj7+PCTz7G53YDvebCeARRIkgxxnKBSKeEvfutd3LpxudiAgZNRRhEDkMbG7tHh61fnMTU5gd88eIK19S20oxiqQK1aweyFSbxy4zIuTNXQaLbhnGMAjigGII0VkXyCc73RQqVSwjfffhWtdlys8lCEQYByKUSapt31vwy/0cUApLEkIojjBHGcwBqDSikEkG8G22i2ureh0cYApLGXuXxfQho/HAUmorHFACSiscUAJKKxxQDsLfaaE50jDECi84Xv2R7iD7O3WoMuAI289qALMEoYgL21OegC0KiTjUGXYJQwAHtJsNT9kJNoqR9Unw66CKOEAdhTep+xR/0kRr8cdBlGCQOwh5w1d/OjdriHOvWDQp3eHXQpRgkDsJdU/lT2HDVG1Av5tSQCZOr9bMCFGSkMwF5q1//UGWx3QpDdgPSyuteQKhSyJdn0/xtogUYMA7CHrl271hLB/2Ldj3pOAGTup9euCada9RADsMeskz8GAHYFUk90riNVwA/+66CLM2rYSOux999Xf+HK2ooRTHXyjzlIp7H7zSmqm5cvz82JCE9n6iHWAHvsvfckESv/Thl71DMOzvP/kOHXe6wB9sHTp9vzmUZLndMWGYX0cjQJ7NzM/LzUB12SUcMaYB8sLNSWHfAvFawH0stygIb/muHXH6wB9sn776u/sPhsBdCpQZeFzisFIJut+uylO3ckGnRpRhFrgH3y3nuSGGP+gHVAOj2F0eAHDL/+YQD20ZVLF35iYf/DoMtB51EGiPefrlyZ/JNBl2SUsQl8Bh49WftEoW8Ouhx0TohC1H6yeHnm7UEXZdSxBngGPBN+T6Crgy4HnQ+iWLXif2/Q5RgHDMAzcOlSdclZ/QsQcDNLOsqmZ9xvLyzUlgddkHHAADwj1+bnP1fjvgtgZdBloWGkALCMTL976dIl7vl3RhiAZ+ja/PxnmuLbBvI+x4ZphwKwHzhPv3316sV7gy7NOOEgyACoqnn0+NmPYPQPBl0WGqTOWiH58eLCzA9FhL8XzxhrgAMgIu7q4uwPjJq/LSKPBl0eGgSFiDwS8f/m1cuzf4fhNxgMwAG6cmXmj8VFr4ninwPgUqexoIAgUmf/hbj4tcWFqf8y6BKNMzaBh8STJ9sXVeK/B8UPHfTyoMtD/SBLovJjdfqHV6/OPhx0aYgBOHQeP35ccRL8dQB/FcBfATA74CLRy1kD5H+r0T8Jxf1kfn6eNf0hwgAcYsvLy9U4Nt+FkW9C9FsArgO4CmBKgXDAxaNdBGhDsQnBIxE8ylR+bjL9heel/3dhYaEx6PIREREREREREREREREREREREREREREREREREREREREREREREREREREREREREa48/wEAAACqSURBVBEREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREdGJ/X920AMzgv+PTgAAAABJRU5ErkJggg==","e":0}],"layers":[{"ddd":0,"ind":1,"ty":2,"nm":"Opacity1","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[160,170,0],"ix":2},"a":{"a":0,"k":[160,160,0],"ix":1},"s":{"a":0,"k":[143,143,100],"ix":6}},"ao":0,"ip":-3.00000012219251,"op":30.0000012219251,"st":1.00000004073083,"bm":0},{"ddd":0,"ind":2,"ty":2,"nm":"Moving1","refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":2,"s":[0]},{"t":9.00000036657752,"s":[30]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":2,"s":[160,160,0],"to":[4.418,-16.902,0],"ti":[-1.749,2.098,0]},{"t":9.00000036657752,"s":[196.7,140,0]}],"ix":2},"a":{"a":0,"k":[160,160,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":5,"s":[129.6,129.6,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.309,0.309,0.309],"y":[0,0,0]},"t":9,"s":[124,124,100]},{"t":13.0000005295009,"s":[129.6,129.6,100]}],"ix":6}},"ao":0,"ip":-3.00000012219251,"op":30.0000012219251,"st":1.00000004073083,"bm":0},{"ddd":0,"ind":3,"ty":2,"nm":"Default","refId":"image_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[160,170,0],"ix":2},"a":{"a":0,"k":[160,160,0],"ix":1},"s":{"a":0,"k":[143,143,100],"ix":6}},"ao":0,"ip":-3.00000012219251,"op":30.0000012219251,"st":1.00000004073083,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Lottie/Storage_Tab.json b/Projects/UsertInterfaces/DesignSystem/Resources/Lottie/Storage_Tab.json index 3d64ae918..1310ccdea 100644 --- a/Projects/UsertInterfaces/DesignSystem/Resources/Lottie/Storage_Tab.json +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Lottie/Storage_Tab.json @@ -1 +1 @@ -{"v":"4.8.0","meta":{"g":"LottieFiles AE 3.1.1","a":"","k":"","d":"","tc":""},"fr":29.9700012207031,"ip":0,"op":30.0000012219251,"w":320,"h":320,"nm":"Keep_ic","ddd":0,"assets":[{"id":"image_0","w":320,"h":320,"u":"","p":"data:image/png;base64,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","e":1},{"id":"image_1","w":320,"h":320,"u":"","p":"data:image/png;base64,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","e":1},{"id":"image_2","w":320,"h":320,"u":"","p":"data:image/png;base64,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tLIy93tiotfE4p8A4Fana8ECgsga55+KiV+7vVz+j+Nu0XXGIfAV8ezZ4U0r8d+GxXcM7K1xt4dGQdbFyvessb9z5878k3G3hhiAV87q6mreiP+XAPwFAH8WwPyYm0QXsw3IH1hlfz8Q8/3FxUX29K8QBuAVtrGxUYxj9TaUfBlivwLgHoA7AMoWCMbcPOogQAMW+xA8FcFTbeXHStv3XDf9o+Xl5eq420dERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERAP7/5w9g20tT20HAAAAAElFTkSuQmCC","e":1}],"layers":[{"ddd":0,"ind":1,"ty":2,"nm":"Opacity1","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[160,160,0],"ix":2},"a":{"a":0,"k":[160,160,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":-2.00000008146167,"op":30.000001221925,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":2,"nm":"Moving1","refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":2,"s":[0]},{"t":9.00000036657752,"s":[30]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":2,"s":[160,160,0],"to":[4.418,-16.902,0],"ti":[-1.749,2.098,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":9,"s":[185,130,0],"to":[4.167,-5,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":13,"s":[181,134,0],"to":[0,0,0],"ti":[-1.749,2.098,0]},{"t":20.0000008146167,"s":[185,130,0]}],"ix":2},"a":{"a":0,"k":[160,160,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":9,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":13,"s":[98,98,100]},{"t":23.0000009368092,"s":[100,100,100]}],"ix":6}},"ao":0,"ip":-2.00000008146167,"op":30.000001221925,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":2,"nm":"Default","refId":"image_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[160,160,0],"ix":2},"a":{"a":0,"k":[160,160,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":-2.00000008146167,"op":30.000001221925,"st":0,"bm":0}],"markers":[]} \ No newline at end of file +{"v":"4.8.0","meta":{"g":"LottieFiles AE 3.5.4","a":"","k":"","d":"","tc":""},"fr":29.9700012207031,"ip":0,"op":30.0000012219251,"w":320,"h":320,"nm":"Keep_ic","ddd":0,"assets":[{"id":"image_0","w":154,"h":154,"u":"/images/","p":"data:image/png;base64,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","e":0},{"id":"image_1","w":154,"h":154,"u":"/images/","p":"data:image/png;base64,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","e":0},{"id":"image_2","w":154,"h":154,"u":"/images/","p":"data:image/png;base64,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","e":0}],"layers":[{"ddd":0,"ind":1,"ty":2,"nm":"Opacity1","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[160,170,0],"ix":2},"a":{"a":0,"k":[77,77,0],"ix":1},"s":{"a":0,"k":[143,143,100],"ix":6}},"ao":0,"ip":0,"op":30.0000012219251,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":2,"nm":"Moving1","refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":2,"s":[0]},{"t":9.00000036657752,"s":[30]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":2,"s":[160,160,0],"to":[4.418,-16.902,0],"ti":[-1.749,2.098,0]},{"t":9.00000036657752,"s":[196.7,140,0]}],"ix":2},"a":{"a":0,"k":[77,77,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":5,"s":[129.6,129.6,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.309,0.309,0.309],"y":[0,0,0]},"t":9,"s":[124,124,100]},{"t":13.0000005295009,"s":[129.6,129.6,100]}],"ix":6}},"ao":0,"ip":0,"op":30.0000012219251,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":2,"nm":"Default","refId":"image_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[160,170,0],"ix":2},"a":{"a":0,"k":[77,77,0],"ix":1},"s":{"a":0,"k":[143,143,100],"ix":6}},"ao":0,"ip":0,"op":30.0000012219251,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/Projects/UsertInterfaces/DesignSystem/Resources/Lottie/Weekly_WM.json b/Projects/UsertInterfaces/DesignSystem/Resources/Lottie/Weekly_WM.json new file mode 100644 index 000000000..85a730d7a --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Resources/Lottie/Weekly_WM.json @@ -0,0 +1 @@ +{"assets":[],"ddd":0,"fr":30,"h":124,"ip":0,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Lottie Layer 1","hd":false,"sr":1,"ks":{"a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"x":{"a":0,"k":0},"y":{"a":0,"k":0},"s":true},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":601,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":false,"nm":"Path 1 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0],[0,-2.01],[0,0],[-1.66,1.135],[0,0],[1.452,0.993]],"o":[[0,0],[-1.66,-1.135],[0,0],[0,2.01],[0,0],[1.452,-0.993],[0,0]],"v":[[72.755,59.936],[57.846,49.743],[53.936,51.806],[53.936,72.194],[57.846,74.257],[72.756,64.064],[72.756,59.936]]}}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.035,0.784,0.949]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]},{"ddd":0,"ind":3,"ty":4,"nm":"Lottie Layer 2","hd":false,"sr":1,"ks":{"a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"x":{"a":0,"k":0},"y":{"a":0,"k":0},"s":true},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":601,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":false,"nm":"Path 1 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[16.569,0],[0,16.569],[-16.569,0],[0,-16.569]],"o":[[0,16.569],[-16.569,0],[0,-16.569],[16.569,0],[0,0]],"v":[[92,62],[62,92],[32,62],[62,32],[92,62]]}}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.2,0.2,0.2]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]},{"ddd":0,"ind":5,"ty":4,"nm":"Lottie Layer 3","hd":false,"sr":1,"ks":{"a":{"a":0,"k":[62,62]},"o":{"a":0,"k":100},"p":{"x":{"a":0,"k":62},"y":{"a":0,"k":62},"s":true},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":601,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":false,"nm":"txt Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"txt","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[39.918,16.87],[40.762,16.564],[45.194,23.012],[45.264,22.987],[44.568,15.187],[45.506,14.846],[49.952,21.291],[50.021,21.266],[49.312,13.472],[50.156,13.166],[50.893,22.379],[50.014,22.697],[45.566,16.384],[45.509,16.406],[46.117,24.106],[45.239,24.424],[39.921,16.869]]}}},{"ty":"sh","hd":false,"nm":"txt","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[52.518,21.906],[54.473,12.63],[55.411,12.498],[59.856,20.869],[58.943,20.999],[57.649,18.509],[53.985,19.026],[53.431,21.777]]}}},{"ty":"sh","hd":false,"nm":"txt","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[57.275,17.777],[55.13,13.68],[55.07,13.69],[54.157,18.219]]}}},{"ty":"sh","hd":false,"nm":"txt","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[61.078,12],[61.95,12.031],[61.774,16.756],[61.859,16.756],[66.313,12.196],[67.456,12.239],[63.518,16.195],[67.098,21.147],[66.027,21.106],[62.951,16.788],[61.723,18.061],[61.616,20.939],[60.744,20.907]]}}},{"ty":"sh","hd":false,"nm":"txt","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[69.353,12.508],[75.713,13.882],[75.546,14.652],[72.806,14.059],[71.095,22],[70.229,21.814],[71.942,13.872],[69.19,13.276],[69.357,12.506]]}}},{"ty":"sh","hd":false,"nm":"txt","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[73.229,22.376],[79.446,15.225],[80.331,15.565],[80.148,25.043],[79.288,24.712],[79.368,21.907],[75.914,20.573],[74.091,22.707],[73.231,22.377]]}}},{"ty":"sh","hd":false,"nm":"txt","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[79.389,21.087],[79.509,16.463],[79.453,16.441],[76.455,19.952],[79.393,21.084]]}}},{"ty":"sh","hd":false,"nm":"txt","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[83.21,25.604],[83.286,25.648],[89.586,20.328],[90.383,20.794],[83.085,26.843],[82.269,26.363],[83.989,17.037],[84.785,17.504],[83.214,25.604]]}}},{"ty":"sh","hd":false,"nm":"txt","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[92.3,22.291],[96.277,25.667],[95.767,26.269],[92.457,23.457],[90.342,25.953],[93.446,28.589],[92.946,29.181],[89.842,26.546],[87.716,29.052],[91.092,31.92],[90.582,32.522],[86.539,29.09],[92.297,22.294]]}}},{"ty":"sh","hd":false,"nm":"txt","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[1.193,-1.005],[0.989,0.615],[0,0],[0,0],[0,0],[0.067,0.078],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[1.234,1.47],[-0.913,0.77],[0,0],[0,0],[0,0],[-0.071,-0.073],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[98.36,27.765],[100.236,29.996],[100.047,33.936],[97.081,34.248],[95.526,38.229],[94.877,37.457],[96.373,33.672],[96.165,33.445],[94.843,31.872],[92.116,34.169],[91.553,33.501],[98.363,27.761]]}}},{"ty":"sh","hd":false,"nm":"txt","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.875,0.737],[0.9,1.072],[0,0],[0,0]],"o":[[0.895,1.066],[0.875,-0.738],[0,0],[0,0],[0,0]],"v":[[96.75,32.902],[99.493,33.278],[99.613,30.476],[98.322,28.941],[95.453,31.358]]}}},{"ty":"sh","hd":false,"nm":"txt","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.809,-0.473],[-0.223,-0.852],[0,0],[1.298,-0.756],[0.982,1.692],[-1.184,0.804],[0,0],[-0.595,-1.025],[-0.913,0.533],[0.277,1.093],[0,0],[-0.998,0.58],[-0.84,-1.447],[1.152,-0.738],[0,0],[0.583,1.002]],"o":[[-0.617,-1.066],[-0.796,0.463],[0,0],[0.287,1.128],[-1.243,0.725],[-0.92,-1.586],[0,0],[-0.86,0.599],[0.66,1.137],[0.765,-0.444],[0,0],[-0.343,-1.425],[1.257,-0.731],[0.841,1.447],[0,0],[0.796,-0.564],[0,0]],"v":[[104.556,37.305],[102.113,36.334],[101.625,38.654],[101.864,39.584],[101.014,42.899],[97.262,41.481],[97.778,37.591],[98.228,38.37],[97.942,41.087],[100.599,42.161],[101.055,39.76],[100.791,38.688],[101.65,35.612],[105.239,36.942],[104.66,40.652],[104.229,39.908],[104.556,37.311]]}}},{"ty":"sh","hd":false,"nm":"txt","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[107.814,42.208],[109.633,47.096],[108.897,47.37],[107.379,43.298],[104.316,44.442],[105.736,48.259],[105.012,48.53],[103.589,44.713],[100.513,45.861],[102.059,50.011],[101.322,50.286],[99.471,45.316],[107.81,42.201]]}}},{"ty":"sh","hd":false,"nm":"txt","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[111.386,54.62],[104.022,58.427],[104.028,58.512],[111.915,61.049],[112,62.08],[103.125,62.811],[103.055,61.976],[110.13,61.393],[110.123,61.321],[102.807,58.957],[102.741,58.172],[109.572,54.645],[109.566,54.572],[102.492,55.155],[102.426,54.333],[111.301,53.602]]}}},{"ty":"sh","hd":false,"nm":"txt","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-0.284,1.998],[-1.801,-0.255],[0,0],[0,0],[0,0],[0.214,-1.51],[-1.376,-0.196],[0,0],[0,0]],"o":[[0,0],[-1.801,-0.255],[0.286,-2.01],[0,0],[0,0],[0,0],[-1.376,-0.195],[-0.215,1.51],[0,0],[0,0],[0,0]],"v":[[110.839,72.404],[105.009,71.575],[102.358,67.768],[105.963,64.849],[111.793,65.679],[111.67,66.545],[105.9,65.725],[103.161,67.885],[105.191,70.721],[110.962,71.541],[110.839,72.408]]}}},{"ty":"sh","hd":false,"nm":"txt","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.885,0.303],[0.497,-0.728],[0,0],[1.416,0.488],[-0.636,1.85],[-1.382,-0.371],[0,0],[0.387,-1.116],[-1.001,-0.344],[-0.643,0.923],[0,0],[-1.093,-0.376],[0.544,-1.582],[1.313,0.387],[0,0],[-0.378,1.094]],"o":[[0.4,-1.163],[-0.872,-0.3],[0,0],[-0.668,0.956],[-1.36,-0.47],[0.598,-1.733],[0,0],[-1.017,-0.259],[-0.429,1.245],[0.838,0.29],[0,0],[0.853,-1.191],[1.372,0.472],[-0.545,1.583],[0,0],[0.948,0.236],[0,0]],"v":[[108.474,78.063],[107.611,75.579],[105.54,76.727],[104.995,77.514],[101.935,79.037],[100.553,75.267],[103.83,73.117],[103.537,73.969],[101.296,75.526],[102.221,78.24],[104.334,77.017],[104.97,76.115],[107.857,74.754],[109.198,78.34],[106.015,80.33],[106.295,79.516],[108.474,78.066]]}}},{"ty":"sh","hd":false,"nm":"txt","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[98.6,80.31],[98.982,79.525],[106.988,83.434],[106.604,84.219],[98.598,80.31]]}}},{"ty":"sh","hd":false,"nm":"txt","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.024,1.352],[0.926,-1.393],[-0.875,-0.88],[0,0],[-1.045,1.57],[-2.324,-1.551],[1.256,-1.885],[1.572,0.677],[0,0],[-0.752,1.128]],"o":[[0.929,-1.393],[-2.027,-1.352],[-0.749,1.129],[0,0],[-1.219,-1.169],[1.256,-1.885],[2.324,1.551],[-1.042,1.566],[0,0],[1.149,0.472],[0,0]],"v":[[102.767,89.419],[101.319,84.827],[96.527,85.252],[96.792,88.625],[96.301,89.362],[95.841,84.792],[101.798,84.105],[103.454,89.873],[99.064,91.206],[99.556,90.469],[102.77,89.416]]}}},{"ty":"sh","hd":false,"nm":"txt","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.866,-0.763],[0.432,-0.053],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.859,0.744],[-0.74,-0.841]],"o":[[0.749,0.851],[-0.322,0.292],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.72,-0.841],[0.86,-0.775],[0,0]],"v":[[92.6,91.757],[92.363,94.525],[91.205,95.055],[95.203,99.602],[92.665,101.84],[91.576,100.602],[93.553,98.862],[89.627,94.414],[89.612,94.395],[89.602,94.386],[89.592,94.376],[89.81,91.625],[92.6,91.76]]}}},{"ty":"sh","hd":false,"nm":"txt","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[87.703,105.073],[86.888,105.448],[81.932,99.397],[81.866,99.428],[83.21,107.141],[82.304,107.557],[77.339,101.508],[77.273,101.54],[78.63,109.246],[77.814,109.621],[76.313,100.506],[77.163,100.115],[82.121,106.031],[82.178,106.006],[80.928,98.385],[81.778,97.995],[87.706,105.076]]}}},{"ty":"sh","hd":false,"nm":"txt","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[74.732,101.117],[73.562,110.529],[72.639,110.74],[67.504,102.769],[68.404,102.564],[69.903,104.937],[73.511,104.111],[73.831,101.322]]}}},{"ty":"sh","hd":false,"nm":"txt","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[70.337,105.634],[72.818,109.539],[72.878,109.526],[73.407,104.934],[70.337,105.637]]}}},{"ty":"sh","hd":false,"nm":"txt","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[67.022,111.71],[66.15,111.751],[65.936,107.026],[65.851,107.026],[61.789,111.949],[60.647,112],[64.245,107.732],[60.265,103.093],[61.336,103.045],[64.758,107.092],[65.879,105.721],[65.749,102.844],[66.622,102.803],[67.025,111.71]]}}},{"ty":"sh","hd":false,"nm":"txt","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[58.74,111.886],[52.29,111.051],[52.39,110.269],[55.17,110.628],[56.209,102.572],[57.087,102.686],[56.048,110.742],[58.841,111.104]]}}},{"ty":"sh","hd":false,"nm":"txt","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[54.05,102.376],[48.455,110.029],[47.545,109.764],[46.932,100.299],[47.816,100.557],[47.974,103.359],[51.528,104.396],[53.165,102.117]]}}},{"ty":"sh","hd":false,"nm":"txt","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[48.015,104.182],[48.285,108.799],[48.345,108.815],[51.04,105.061],[48.018,104.179]]}}},{"ty":"sh","hd":false,"nm":"txt","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[43.832,100.004],[43.754,99.966],[37.923,105.794],[37.092,105.394],[43.854,98.756],[44.708,99.166],[43.776,108.602],[42.944,108.202],[43.829,100.001]]}}},{"ty":"sh","hd":false,"nm":"txt","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[35.058,104.071],[30.814,101.042],[31.271,100.399],[34.803,102.92],[36.702,100.254],[33.387,97.887],[33.837,97.257],[37.152,99.623],[39.057,96.947],[35.452,94.375],[35.908,93.732],[40.225,96.812],[35.055,104.067]]}}},{"ty":"sh","hd":false,"nm":"txt","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-1.109,1.103],[-1.038,-0.529],[0,0],[0,0],[0,0],[-0.077,-0.072],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[-1.354,-1.361],[0.843,-0.841],[0,0],[0,0],[0,0],[0.074,0.067],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[28.56,99.121],[26.504,97.053],[26.366,93.11],[29.296,92.552],[30.516,88.455],[31.226,89.171],[30.052,93.066],[30.279,93.274],[31.727,94.731],[34.255,92.212],[34.872,92.833],[28.563,99.121]]}}},{"ty":"sh","hd":false,"nm":"txt","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.809,-0.807],[-0.989,-0.993],[0,0],[0,0],[0,0]],"o":[[-0.98,-0.987],[-0.809,0.807],[0,0],[0,0],[0,0],[0,0]],"v":[[29.738,93.867],[26.973,93.722],[27.09,96.524],[28.503,97.945],[31.161,95.295],[29.737,93.864]]}}},{"ty":"sh","hd":false,"nm":"txt","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.765,0.535],[0.293,0.832],[0,0],[-1.231,0.863],[-1.121,-1.601],[1.115,-0.9],[0,0],[0.677,0.968],[0.866,-0.605],[-0.368,-1.062],[0,0],[0.948,-0.666],[0.957,1.375],[-1.083,0.836],[0,0],[-0.664,-0.948]],"o":[[0.705,1.008],[0.756,-0.53],[0,0],[-0.381,-1.104],[1.18,-0.826],[1.051,1.503],[0,0],[0.806,-0.671],[-0.755,-1.08],[-0.724,0.507],[0,0],[0.463,1.39],[-1.19,0.832],[-0.96,-1.371],[0,0],[-0.746,0.628],[0,0]],"v":[[21.594,90.142],[24.109,90.905],[24.402,88.55],[24.084,87.646],[24.654,84.27],[28.514,85.367],[28.324,89.287],[27.811,88.55],[27.868,85.82],[25.129,84.973],[24.877,87.403],[25.233,88.446],[24.635,91.586],[20.948,90.561],[21.213,86.813],[21.707,87.519],[21.6,90.135]]}}},{"ty":"sh","hd":false,"nm":"txt","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[17.934,85.528],[15.705,80.809],[16.417,80.472],[18.27,84.4],[21.226,83],[19.486,79.316],[20.184,78.986],[21.925,82.67],[24.894,81.264],[23.002,77.258],[23.713,76.921],[25.977,81.718],[17.93,85.528]]}}},{"ty":"sh","hd":false,"nm":"txt","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[13.335,73.45],[20.352,69.044],[20.339,68.959],[12.274,67.09],[12.104,66.072],[20.881,64.603],[21.019,65.429],[14.024,66.602],[14.037,66.674],[21.52,68.417],[21.65,69.193],[15.139,73.278],[15.151,73.35],[22.147,72.178],[22.282,72.991],[13.505,74.459],[13.338,73.451]]}}},{"ty":"sh","hd":false,"nm":"txt","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.113,-2.017],[1.817,0.104],[0,0],[0,0],[0,0],[-0.088,1.525],[1.388,0.079],[0,0]],"o":[[0,0],[1.817,0.104],[-0.117,2.03],[0,0],[0,0],[0,0],[1.388,0.08],[0.088,-1.525],[0,0],[0,0]],"v":[[12.387,55.688],[18.268,56.025],[21.231,59.599],[17.881,62.811],[12,62.474],[12.05,61.6],[17.872,61.934],[20.422,59.552],[18.158,56.895],[12.337,56.561]]}}},{"ty":"sh","hd":false,"nm":"txt","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.903,-0.227],[-0.434,0.766],[0,0],[-1.454,-0.366],[0.475,-1.897],[1.407,0.256],[0,0],[-0.29,1.147],[1.026,0.259],[0.563,-0.974],[0,0],[1.12,0.285],[-0.41,1.623],[-1.342,-0.275],[0,0],[0.284,-1.123]],"o":[[-0.302,1.195],[0.895,0.227],[0,0],[0.582,-1.008],[1.395,0.353],[-0.447,1.778],[0,0],[1.036,0.174],[0.321,-1.277],[-0.86,-0.217],[0,0],[-0.749,1.257],[-1.408,-0.355],[0.408,-1.623],[0,0],[-0.964,-0.155],[0,0]],"v":[[14.268,49.848],[15.335,52.25],[17.303,50.932],[17.779,50.1],[20.7,48.323],[22.397,51.963],[19.315,54.383],[19.535,53.513],[21.635,51.771],[20.483,49.145],[18.481,50.545],[17.923,51.497],[15.163,53.097],[13.523,49.637],[16.526,47.387],[16.315,48.222],[14.268,49.852]]}}},{"ty":"sh","hd":false,"nm":"txt","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[23.919,46.779],[23.604,47.595],[15.299,44.377],[15.614,43.56]]}}},{"ty":"sh","hd":false,"nm":"txt","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-2.135,-1.179],[-0.809,1.466],[0.947,0.803],[0,0],[0.91,-1.648],[2.446,1.352],[-1.092,1.982],[-1.625,-0.545],[0,0],[0.655,-1.185]],"o":[[-0.809,1.465],[2.13,1.178],[0.655,-1.185],[0,0],[1.313,1.063],[-1.095,1.983],[-2.447,-1.352],[0.91,-1.649],[0,0],[-1.184,-0.375],[0,0]],"v":[[19.004,38.046],[20.834,42.503],[25.574,41.677],[25.027,38.336],[25.455,37.56],[26.295,42.077],[20.415,43.259],[18.28,37.649],[22.546,35.953],[22.118,36.728],[19.001,38.046]]}}},{"ty":"sh","hd":false,"nm":"txt","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0.69,-0.646],[0.312,0.331],[-0.129,0.844],[0.378,0.407],[0,0],[0,0],[0,0],[0.818,-0.766],[0.224,0.239],[-0.378,0.957],[0.516,0.551],[0,0]],"o":[[0,0],[0,0],[0.491,0.527],[-0.302,0.284],[-0.249,-0.268],[0.259,-1.018],[0,0],[0,0],[0,0],[0.93,0.996],[-0.258,0.24],[-0.308,-0.331],[0.39,-0.729],[0,0],[0,0]],"v":[[27.176,26.448],[30.781,21.228],[35.528,26.312],[35.594,29.152],[34.524,29.152],[34.259,27.52],[34.807,26.11],[32.821,23.983],[29.701,28.56],[31.989,31.009],[31.955,34.441],[31.155,34.413],[31.08,32.396],[31.439,31.009],[27.182,26.451]]}}},{"ty":"sh","hd":false,"nm":"txt","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[28.813,27.608],[31.892,22.984],[31.461,22.524],[28.331,27.091]]}}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.137,0.094,0.082]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[62,62],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":600,"s":[62,62],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[62,62],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":600,"s":[62,62],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":600,"s":[360],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"bg Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"bg","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[34.242,0],[0,34.242],[-34.242,0],[0,-34.242]],"o":[[0,34.242],[-34.242,0],[0,-34.242],[34.242,0],[0,0]],"v":[[124,62],[62,124],[0,62],[62,0],[124,62]]}}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[1,1,1]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]},{"ddd":0,"ind":8,"ty":4,"nm":"Screen","hd":false,"sr":1,"ks":{"a":{"a":0,"k":[62,62]},"o":{"a":0,"k":100},"p":{"x":{"a":0,"k":62},"y":{"a":0,"k":62},"s":true},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":601,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":false,"nm":"Screen Group","bm":0,"it":[{"ty":"rc","hd":false,"nm":"Screen","d":1,"p":{"a":0,"k":[62,62]},"r":{"a":0,"k":0},"s":{"a":0,"k":[124,124]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[1,1,1]},"r":1,"o":{"a":0,"k":0}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]}],"meta":{"g":"@phase-software/lottie-exporter 0.5.0"},"nm":"","op":600,"v":"5.6.0","w":124} \ No newline at end of file diff --git a/Projects/UsertInterfaces/DesignSystem/Sources/AliasBlueGray+Gray.swift b/Projects/UsertInterfaces/DesignSystem/Sources/AliasBlueGray+Gray.swift new file mode 100644 index 000000000..bfbd10422 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Sources/AliasBlueGray+Gray.swift @@ -0,0 +1,18 @@ +public extension DesignSystemAsset { + @available(*, deprecated, renamed: "BlueGrayColor", message: "'GrayColor' renamed 'BlueGrayColor'") + typealias GrayColor = BlueGrayColor +} + +public extension DesignSystemAsset.BlueGrayColor { + static var gray100: DesignSystemColors { Self.blueGray100 } + static var gray200: DesignSystemColors { Self.blueGray200 } + static var gray25: DesignSystemColors { Self.blueGray25 } + static var gray300: DesignSystemColors { Self.blueGray300 } + static var gray400: DesignSystemColors { Self.blueGray400 } + static var gray50: DesignSystemColors { Self.blueGray50 } + static var gray500: DesignSystemColors { Self.blueGray500 } + static var gray600: DesignSystemColors { Self.blueGray600 } + static var gray700: DesignSystemColors { Self.blueGray700 } + static var gray800: DesignSystemColors { Self.blueGray800 } + static var gray900: DesignSystemColors { Self.blueGray900 } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Sources/AliasPrimaryV1+PrimaryV2.swift b/Projects/UsertInterfaces/DesignSystem/Sources/AliasPrimaryV1+PrimaryV2.swift new file mode 100644 index 000000000..11a488559 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Sources/AliasPrimaryV1+PrimaryV2.swift @@ -0,0 +1,15 @@ +import UIKit + +public extension DesignSystemAsset.PrimaryColor { + static var baseskeleton: DesignSystemColors { DesignSystemAsset.PrimaryColorV2.baseSkeleton } + static var decrease: DesignSystemColors { DesignSystemAsset.PrimaryColorV2.decrease } + static var increase: DesignSystemColors { DesignSystemAsset.PrimaryColorV2.increase } + static var new: DesignSystemColors { DesignSystemAsset.PrimaryColorV2.new } + static var point: DesignSystemColors { DesignSystemAsset.PrimaryColorV2.point } + static var secondaryskeleton: DesignSystemColors { DesignSystemAsset.PrimaryColorV2.highlightSkeleton } + static var toast: DesignSystemColors { DesignSystemAsset.PrimaryColorV2.toast } + static var waktaverse: DesignSystemColors { DesignSystemAsset.PrimaryColorV2.waktaverse } + static var sub1: DesignSystemColors { Self.v1Sub1 } + static var sub2: DesignSystemColors { Self.v1Sub2 } + static var sub3: DesignSystemColors { Self.v1Sub3 } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Sources/DimmedGradientLayer.swift b/Projects/UsertInterfaces/DesignSystem/Sources/DimmedGradientLayer.swift new file mode 100644 index 000000000..b26f8cb83 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Sources/DimmedGradientLayer.swift @@ -0,0 +1,20 @@ +import UIKit + +open class DimmedGradientLayer: CAGradientLayer { + public init(frame: CGRect) { + super.init() + self.frame = frame + self.colors = [ + DesignSystemAsset.NewGrayColor.gray900.color.withAlphaComponent(0.6).cgColor, + DesignSystemAsset.NewGrayColor.gray900.color.withAlphaComponent(1.0).cgColor + ] + self.startPoint = .init(x: 0.5, y: 0.4) + self.endPoint = .init(x: 0.5, y: 1.0) + self.opacity = 1.0 + } + + @available(*, unavailable) + public required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Sources/Extension+UILabel.swift b/Projects/UsertInterfaces/DesignSystem/Sources/Extension+UILabel.swift index 219750d0e..5ff917659 100644 --- a/Projects/UsertInterfaces/DesignSystem/Sources/Extension+UILabel.swift +++ b/Projects/UsertInterfaces/DesignSystem/Sources/Extension+UILabel.swift @@ -14,82 +14,140 @@ public extension UILabel { /// - Parameter kernValue: 글자간의 간격 /// - Parameter lineSpacing: 줄 간격 (한 줄과 다음 줄 사이의 간격) /// - Parameter lineHeightMultiple: 줄 간격의 배수 (lineSpacing * lineHeightMultiple) - func setLineSpacing(kernValue: Double = 0.0, - lineSpacing: CGFloat = 0.0, - lineHeightMultiple: CGFloat = 0.0) { + func setLineSpacing( + kernValue: Double = 0.0, + lineSpacing: CGFloat = 0.0, + lineHeightMultiple: CGFloat = 0.0 + ) { guard let labelText = self.text else { return } - + let paragraphStyle = NSMutableParagraphStyle() paragraphStyle.lineSpacing = lineSpacing paragraphStyle.lineHeightMultiple = lineHeightMultiple paragraphStyle.lineBreakMode = .byTruncatingTail - - let attributedString = NSMutableAttributedString(string: labelText, - attributes: [ - .paragraphStyle: paragraphStyle, - .kern: kernValue - ]) - + + let attributedString = NSMutableAttributedString( + string: labelText, + attributes: [ + .paragraphStyle: paragraphStyle, + .kern: kernValue + ] + ) + self.attributedText = attributedString } - + @available(*, deprecated, renamed: "setTextWithAttributes", message: "setLineSpacing과 setLineHeight 통합됨") - func setLineHeight(lineHeight: CGFloat){ + func setLineHeight(lineHeight: CGFloat) { if let text = self.text { let style = NSMutableParagraphStyle() style.maximumLineHeight = lineHeight style.minimumLineHeight = lineHeight - + let attributes: [NSAttributedString.Key: Any] = [ .paragraphStyle: style, .baselineOffset: (lineHeight - font.lineHeight) / 2 ] - let attrString = NSAttributedString(string: text, - attributes: attributes) + let attrString = NSAttributedString( + string: text, + attributes: attributes + ) self.attributedText = attrString } } - + /// 레이블의 높이, 자간, 행간을 조절하는 메소드입니다. /// - Parameter lineHeight: 레이블 자체의 높이 /// - Parameter kernValue: 글자간의 간격 /// - Parameter lineSpacing: 줄 간격 (한 줄과 다음 줄 사이의 간격) /// - Parameter lineHeightMultiple: 줄 간격의 배수 (lineSpacing * lineHeightMultiple) - func setTextWithAttributes(lineHeight: CGFloat? = nil, - kernValue: Double? = nil, - lineSpacing: CGFloat? = nil, - lineHeightMultiple: CGFloat? = nil, - alignment: NSTextAlignment = .left) { - guard let labelText = self.text else { return } - + func getTextWithAttributes( + lineHeight: CGFloat? = nil, + lineBreakMode: NSLineBreakMode = .byTruncatingTail, + kernValue: Double? = nil, + lineSpacing: CGFloat? = nil, + lineHeightMultiple: CGFloat? = nil, + alignment: NSTextAlignment = .left + ) -> [NSAttributedString.Key: Any] { let paragraphStyle = NSMutableParagraphStyle() - + if let lineSpacing { paragraphStyle.lineSpacing = lineSpacing } if let lineHeightMultiple { paragraphStyle.lineHeightMultiple = lineHeightMultiple } - - paragraphStyle.lineBreakMode = .byTruncatingTail + + paragraphStyle.lineBreakMode = lineBreakMode paragraphStyle.alignment = alignment - - let style = NSMutableParagraphStyle() - + let baselineOffset: CGFloat - + let offsetDivisor: CGFloat + + if #available(iOS 16.4, *) { // 16.4 부터 잠수함 패치로 고쳐졌다고 합니다. + offsetDivisor = 2 + } else { + offsetDivisor = 4 + } + if let lineHeight { - style.maximumLineHeight = lineHeight - style.minimumLineHeight = lineHeight - baselineOffset = (lineHeight - font.lineHeight) / 2 + paragraphStyle.maximumLineHeight = lineHeight + paragraphStyle.minimumLineHeight = lineHeight + baselineOffset = (lineHeight - font.lineHeight) / offsetDivisor } else { baselineOffset = 0 } - + let attributes: [NSAttributedString.Key: Any] = [ .paragraphStyle: paragraphStyle, .kern: kernValue ?? 0.0, .baselineOffset: baselineOffset ] - - let attributedString = NSMutableAttributedString(string: labelText, attributes: attributes) - + + return attributes + } + + func setTextWithAttributes( + lineHeight: CGFloat? = nil, + lineBreakMode: NSLineBreakMode = .byTruncatingTail, + kernValue: Double? = -0.5, + lineSpacing: CGFloat? = nil, + lineHeightMultiple: CGFloat? = nil, + alignment: NSTextAlignment = .left, + hangulWordPriority: Bool = false + ) { + let paragraphStyle = NSMutableParagraphStyle() + + if let lineSpacing { paragraphStyle.lineSpacing = lineSpacing } + if let lineHeightMultiple { paragraphStyle.lineHeightMultiple = lineHeightMultiple } + + paragraphStyle.lineBreakMode = lineBreakMode + paragraphStyle.alignment = alignment + + if hangulWordPriority { + paragraphStyle.lineBreakStrategy = .hangulWordPriority + } + + let baselineOffset: CGFloat + let offsetDivisor: CGFloat + + if #available(iOS 16.4, *) { // 16.4 부터 잠수함 패치로 고쳐졌다고 합니다. + offsetDivisor = 2 + } else { + offsetDivisor = 4 + } + + if let lineHeight { + paragraphStyle.maximumLineHeight = lineHeight + paragraphStyle.minimumLineHeight = lineHeight + baselineOffset = (lineHeight - font.lineHeight) / offsetDivisor + } else { + baselineOffset = 0 + } + + let attributes: [NSAttributedString.Key: Any] = [ + .paragraphStyle: paragraphStyle, + .kern: kernValue ?? 0.0, + .baselineOffset: baselineOffset + ] + let attributedString = NSMutableAttributedString(string: text ?? "", attributes: attributes) + self.attributedText = attributedString } } diff --git a/Projects/UsertInterfaces/DesignSystem/Sources/HorizontalAlignButton.swift b/Projects/UsertInterfaces/DesignSystem/Sources/HorizontalAlignButton.swift new file mode 100644 index 000000000..e1b3548ad --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Sources/HorizontalAlignButton.swift @@ -0,0 +1,38 @@ +import Foundation +import UIKit + +open class HorizontalAlignButton: UIButton { + public init( + imagePlacement: NSDirectionalRectEdge, + title: String? = nil, + image: UIImage? = nil, + font: UIFont, + titleColor: UIColor, + spacing: CGFloat = 0.0 + ) { + super.init(frame: .zero) + + var config = UIButton.Configuration.plain() + config.imagePlacement = imagePlacement + config.titleTextAttributesTransformer = UIConfigurationTextAttributesTransformer { + var attribute = $0 + attribute.font = font + attribute.foregroundColor = titleColor + attribute.kern = -0.5 + return attribute + } + config.title = title + config.image = image + config.imagePadding = spacing + self.configuration = config + } + + @available(*, unavailable) + public required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override open func awakeFromNib() { + super.awakeFromNib() + } +} diff --git a/Projects/Features/PlayerFeature/Sources/Views/LikeButton.swift b/Projects/UsertInterfaces/DesignSystem/Sources/LikeButton.swift similarity index 98% rename from Projects/Features/PlayerFeature/Sources/Views/LikeButton.swift rename to Projects/UsertInterfaces/DesignSystem/Sources/LikeButton.swift index dd5eb6815..cf68a824e 100644 --- a/Projects/Features/PlayerFeature/Sources/Views/LikeButton.swift +++ b/Projects/UsertInterfaces/DesignSystem/Sources/LikeButton.swift @@ -6,8 +6,8 @@ // Copyright © 2023 yongbeomkwak. All rights reserved. // -import UIKit import DesignSystem +import UIKit protocol Likeable { var isLiked: Bool { get set } @@ -20,16 +20,14 @@ class LikeButton: VerticalImageButton, Likeable { setImage() } } - + private func setColor() { let color = isLiked ? DesignSystemAsset.PrimaryColor.increase.color : DesignSystemAsset.GrayColor.gray400.color self.titleLabel.textColor = color } - + private func setImage() { let image = isLiked ? DesignSystemAsset.Player.likeOn.image : DesignSystemAsset.Player.likeOff.image self.image = image } - - } diff --git a/Projects/UsertInterfaces/DesignSystem/Sources/SingleActionButtonView.swift b/Projects/UsertInterfaces/DesignSystem/Sources/SingleActionButtonView.swift new file mode 100644 index 000000000..6e1aeed11 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Sources/SingleActionButtonView.swift @@ -0,0 +1,106 @@ +import SnapKit +import Then +import UIKit + +public protocol SingleActionButtonViewDelegate: AnyObject { + func tappedButtonAction() +} + +public final class SingleActionButtonView: UIView { + private let baseView = UIView().then { + $0.layer.cornerRadius = 8 + $0.layer.borderColor = DesignSystemAsset.BlueGrayColor.gray200.color.withAlphaComponent(0.7).cgColor + $0.layer.borderWidth = 1 + $0.backgroundColor = .white.withAlphaComponent(0.4) + } + + private let translucentView = UIVisualEffectView(effect: UIBlurEffect(style: .regular)).then { + $0.layer.cornerRadius = 8 + $0.clipsToBounds = true + } + + private let imageView = UIImageView().then { + $0.contentMode = .scaleAspectFit + } + + private let label = WMLabel( + text: "", + textColor: DesignSystemAsset.BlueGrayColor.blueGray900.color, + font: .t6(weight: .medium), + alignment: .center + ) + + private let button = UIButton() + + public weak var delegate: SingleActionButtonViewDelegate? + + private let topSpacing: CGFloat + + public init(frame: CGRect, topSpacing: CGFloat = 16) { + self.topSpacing = topSpacing + super.init(frame: frame) + backgroundColor = .clear + addView() + setLayout() + addAction() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + public func setTitleAndImage( + text: String, + textColor: UIColor = DesignSystemAsset.NewGrayColor.gray900.color, + image: UIImage + ) { + label.text = text + label.textColor = textColor + imageView.image = image + } +} + +private extension SingleActionButtonView { + func addAction() { + let buttonAction = UIAction { [weak self] _ in + guard let self = self else { return } + self.delegate?.tappedButtonAction() + } + button.addAction(buttonAction, for: .touchUpInside) + } + + func addView() { + addSubview(translucentView) + addSubview(baseView) + addSubview(imageView) + addSubview(label) + addSubview(button) + } + + func setLayout() { + baseView.snp.makeConstraints { + $0.top.equalToSuperview().offset(topSpacing) + $0.horizontalEdges.equalToSuperview().inset(20) + $0.height.equalTo(52) + } + + imageView.snp.makeConstraints { + $0.size.equalTo(32) + $0.leading.equalTo(baseView.snp.leading).offset(32) + $0.centerY.equalTo(baseView.snp.centerY) + } + + button.snp.makeConstraints { + $0.edges.equalTo(baseView) + } + + label.snp.makeConstraints { + $0.center.equalTo(button.snp.center) + } + + translucentView.snp.makeConstraints { + $0.edges.equalTo(baseView) + } + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Sources/VerticalAlignButton.swift b/Projects/UsertInterfaces/DesignSystem/Sources/VerticalAlignButton.swift new file mode 100644 index 000000000..81d13eb9f --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Sources/VerticalAlignButton.swift @@ -0,0 +1,50 @@ +import Foundation +import UIKit + +open class VerticalAlignButton: UIButton { + public private(set) var spacing: CGFloat + + public init( + title: String? = nil, + image: UIImage? = nil, + titleColor: UIColor = DesignSystemAsset.NewGrayColor.gray400.color, + spacing: CGFloat = 0.0 + ) { + self.spacing = spacing + super.init(frame: .zero) + + var config = UIButton.Configuration.plain() + config.imagePlacement = .top + config.titleTextAttributesTransformer = UIConfigurationTextAttributesTransformer { + var attribute = $0 + attribute.font = UIFont.setFont(.t7(weight: .medium)) + attribute.foregroundColor = titleColor + attribute.kern = -0.5 + return attribute + } + config.title = title + config.image = image + config.contentInsets = .zero + self.configuration = config + } + + @available(*, unavailable) + public required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override open func awakeFromNib() { + super.awakeFromNib() + self.contentHorizontalAlignment = .left + } + + public func setTextColor(color: UIColor) { + self.configuration?.titleTextAttributesTransformer = UIConfigurationTextAttributesTransformer { + var attribute = $0 + attribute.font = UIFont.setFont(.t7(weight: .medium)) + attribute.foregroundColor = color + attribute.kern = -0.5 + return attribute + } + } +} diff --git a/Projects/Features/PlayerFeature/Sources/Views/VerticalButton.swift b/Projects/UsertInterfaces/DesignSystem/Sources/VerticalButton.swift similarity index 97% rename from Projects/Features/PlayerFeature/Sources/Views/VerticalButton.swift rename to Projects/UsertInterfaces/DesignSystem/Sources/VerticalButton.swift index 03744b7be..c155570a8 100644 --- a/Projects/Features/PlayerFeature/Sources/Views/VerticalButton.swift +++ b/Projects/UsertInterfaces/DesignSystem/Sources/VerticalButton.swift @@ -9,16 +9,15 @@ import UIKit internal class VerticalButton: UIButton { - func alignToVertical(spacing: CGFloat = 0) { guard let image = self.imageView?.image else { return } guard let titleLabel = self.titleLabel else { return } guard let titleText = titleLabel.text else { return } - + let titleSize = titleText.size(withAttributes: [ NSAttributedString.Key.font: titleLabel.font as Any ]) - + titleEdgeInsets = UIEdgeInsets(top: spacing, left: -image.size.width, bottom: -image.size.height, right: 0) imageEdgeInsets = UIEdgeInsets(top: -(titleSize.height + spacing), left: 0, bottom: 0, right: -titleSize.width) } diff --git a/Projects/Features/PlayerFeature/Sources/Views/VerticalImageButton.swift b/Projects/UsertInterfaces/DesignSystem/Sources/VerticalImageButton.swift similarity index 96% rename from Projects/Features/PlayerFeature/Sources/Views/VerticalImageButton.swift rename to Projects/UsertInterfaces/DesignSystem/Sources/VerticalImageButton.swift index 474a778b9..49ffd831a 100644 --- a/Projects/Features/PlayerFeature/Sources/Views/VerticalImageButton.swift +++ b/Projects/UsertInterfaces/DesignSystem/Sources/VerticalImageButton.swift @@ -6,43 +6,44 @@ // Copyright © 2023 yongbeomkwak. All rights reserved. // -import UIKit import SnapKit +import UIKit internal class VerticalImageButton: UIView { let imageView = UIImageView() let titleLabel = UILabel() - + var title: String? { didSet { titleLabel.text = title } } - + var image: UIImage? { didSet { imageView.image = image } } - + override init(frame: CGRect) { super.init(frame: frame) addSubview(imageView) addSubview(titleLabel) - + imageView.snp.makeConstraints { $0.centerX.equalToSuperview() $0.top.equalToSuperview().offset(4) $0.width.height.equalTo(32) } - + titleLabel.snp.makeConstraints { $0.centerX.equalToSuperview() $0.top.equalTo(imageView.snp.bottom) } } - + + @available(*, unavailable) required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } diff --git a/Projects/UsertInterfaces/DesignSystem/Sources/Views/LoginWarningView.swift b/Projects/UsertInterfaces/DesignSystem/Sources/Views/LoginWarningView.swift new file mode 100644 index 000000000..92b1115a3 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Sources/Views/LoginWarningView.swift @@ -0,0 +1,105 @@ +import RxSwift +import SnapKit +import Then +import UIKit + +public final class LoginWarningView: UIView { + @available(*, deprecated, message: "loginButtonDidTapSubject로 액션을 보내고 클로저는 제거 예정") + private let completion: () -> Void + + private let imageView: UIImageView = UIImageView().then { + $0.contentMode = .scaleAspectFill + $0.image = DesignSystemAsset.Search.warning.image + } + + private let label: WMLabel = WMLabel( + text: "", + textColor: DesignSystemAsset.BlueGrayColor.blueGray900.color, + font: .t6(weight: .medium), + alignment: .center, + kernValue: -0.5 + ) + + private let button: UIButton = UIButton().then { + $0.titleLabel?.font = DesignSystemFontFamily.Pretendard.medium.font(size: 14) + $0.setTitle("로그인", for: .normal) + $0.setTitleColor(DesignSystemAsset.BlueGrayColor.blueGray600.color, for: .normal) + $0.layer.cornerRadius = 8 + $0.layer.borderColor = DesignSystemAsset.BlueGrayColor.blueGray400.color.cgColor.copy(alpha: 0.4) + $0.layer.borderWidth = 1 + $0.clipsToBounds = true + } + + public let loginButtonDidTapSubject = PublishSubject() + + public init( + frame: CGRect = CGRect( + x: .zero, + y: .zero, + width: 164, + height: 176 + ), + text: String = "로그인을 해주세요.", + _ completion: @escaping (() -> Void) + ) { + self.completion = completion + super.init(frame: frame) + + addSubviews() + setLayout() + configureUI(text: text) + configureAction() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +extension LoginWarningView { + private func addSubviews() { + self.addSubview(imageView) + self.addSubview(label) + self.addSubview(button) + } + + private func setLayout() { + imageView.snp.makeConstraints { + $0.width.height.equalTo(80) + $0.top.equalToSuperview() + $0.centerX.equalToSuperview() + } + + label.snp.makeConstraints { + $0.top.equalTo(imageView.snp.bottom) + $0.leading.trailing.equalToSuperview() + $0.centerX.equalTo(imageView.snp.centerX) + } + + button.snp.makeConstraints { + $0.height.equalTo(44) + $0.width.equalTo(164) + $0.top.equalTo(label.snp.bottom).offset(16) + $0.centerX.equalToSuperview() + } + } + + private func configureUI(text: String) { + label.text = text + label.numberOfLines = 0 + label.setTextWithAttributes( + kernValue: -0.5, + lineSpacing: 6, + alignment: .center + ) + } + + private func configureAction() { + button.addAction(UIAction(handler: { [weak self] _ in + guard let self else { return } + self.completion() + self.loginButtonDidTapSubject.onNext(()) + }), for: .primaryActionTriggered) + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Sources/Views/WMWarningView.swift b/Projects/UsertInterfaces/DesignSystem/Sources/Views/WMWarningView.swift new file mode 100644 index 000000000..cb0ca5e0b --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Sources/Views/WMWarningView.swift @@ -0,0 +1,51 @@ +import SnapKit +import Then +import UIKit + +public final class WMWarningView: UIView { + private let imageView: UIImageView = UIImageView().then { + $0.contentMode = .scaleAspectFill + $0.image = DesignSystemAsset.Search.warning.image + } + + private let label: WMLabel = WMLabel( + text: "", + textColor: DesignSystemAsset.BlueGrayColor.blueGray900.color, + font: .t6(weight: .light), + alignment: .center, + kernValue: -0.5 + ) + + public init(text: String) { + super.init(frame: .zero) + addSubviews() + setLayout() + label.text = text + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +private extension WMWarningView { + func addSubviews() { + self.addSubview(imageView) + self.addSubview(label) + } + + func setLayout() { + imageView.snp.makeConstraints { + $0.width.height.equalTo(80) + $0.top.equalToSuperview() + $0.centerX.equalToSuperview() + } + + label.snp.makeConstraints { + $0.top.equalTo(imageView.snp.bottom).offset(-8) + $0.leading.trailing.equalToSuperview() + $0.centerX.equalTo(imageView.snp.centerX) + } + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Sources/WMFlowLabel.swift b/Projects/UsertInterfaces/DesignSystem/Sources/WMFlowLabel.swift index 5aecc59cb..e423ced22 100644 --- a/Projects/UsertInterfaces/DesignSystem/Sources/WMFlowLabel.swift +++ b/Projects/UsertInterfaces/DesignSystem/Sources/WMFlowLabel.swift @@ -6,8 +6,8 @@ // Copyright © 2023 yongbeomkwak. All rights reserved. // -import UIKit import MarqueeLabel +import UIKit public final class WMFlowLabel: MarqueeLabel { public init( @@ -16,7 +16,7 @@ public final class WMFlowLabel: MarqueeLabel { font: UIFont.WMFontSystem, alignment: NSTextAlignment = .left, lineHeight: CGFloat? = nil, - kernValue: Double? = nil, + kernValue: Double? = -0.5, lineSpacing: CGFloat? = nil, lineHeightMultiple: CGFloat? = nil, leadingBuffer: CGFloat = 0, @@ -30,12 +30,49 @@ public final class WMFlowLabel: MarqueeLabel { self.textColor = textColor self.font = .setFont(font) self.textAlignment = alignment - self.setTextWithAttributes(lineHeight: lineHeight, kernValue: kernValue, lineSpacing: lineSpacing, lineHeightMultiple: lineHeightMultiple, alignment: alignment) + self.setTextWithAttributes( + lineHeight: lineHeight, + kernValue: kernValue, + lineSpacing: lineSpacing, + lineHeightMultiple: lineHeightMultiple, + alignment: alignment + ) self.leadingBuffer = leadingBuffer self.trailingBuffer = trailingBuffer self.animationDelay = animationDelay } - + + convenience init( + text: String, + textColor: UIColor = .init(), + font: UIFont.WMFontSystem, + alignment: NSTextAlignment = .left, + lineHeight: CGFloat? = nil, + kernValue: Double? = nil, + leadingBuffer: CGFloat = 0, + trailingBuffer: CGFloat = 0, + animationDelay: CGFloat = 1, + animationSpeed: CGFloat = 30, + fadeLength: CGFloat = 3 + ) { + self.init( + text: text, + textColor: textColor, + font: font, + alignment: alignment, + lineHeight: lineHeight, + kernValue: kernValue, + lineSpacing: nil, + lineHeightMultiple: nil, + leadingBuffer: leadingBuffer, + trailingBuffer: trailingBuffer, + animationDelay: animationDelay, + animationSpeed: animationSpeed, + fadeLength: fadeLength + ) + } + + @available(*, unavailable) required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } diff --git a/Projects/UsertInterfaces/DesignSystem/Sources/WMFontSystem.swift b/Projects/UsertInterfaces/DesignSystem/Sources/WMFontSystem.swift index 90a119202..d6cd8d723 100644 --- a/Projects/UsertInterfaces/DesignSystem/Sources/WMFontSystem.swift +++ b/Projects/UsertInterfaces/DesignSystem/Sources/WMFontSystem.swift @@ -25,7 +25,7 @@ public extension UIFont { case t4(weight: WMFontWeight = .medium) /// size: 16 height: 24 case t5(weight: WMFontWeight = .medium) - /// size: 14 height: 14 + /// size: 14 height: 22 case t6(weight: WMFontWeight = .medium) /// size: 14 height: 20 case t6_1(weight: WMFontWeight = .medium) @@ -35,8 +35,10 @@ public extension UIFont { case t7_1(weight: WMFontWeight = .medium) /// size: 11 height: 16 case t8(weight: WMFontWeight = .medium) + /// size: 12 height: 18 + case sc7(weight: WMFontWeight = .score3Light) } - + static func setFont(_ style: WMFontSystem) -> UIFont { return style.font } @@ -44,13 +46,13 @@ public extension UIFont { public extension UIFont.WMFontSystem { enum WMFontWeight { - case light, medium, bold + case light, medium, bold, score3Light } - + var font: UIFont { return UIFont(font: weight.font, size: size) ?? .init() } - + var lineHeight: CGFloat { return height } @@ -60,19 +62,20 @@ private extension UIFont.WMFontSystem { var weight: WMFontWeight { switch self { case let .t1(weight), - let .t2(weight), - let .t3(weight), - let .t4(weight), - let .t5(weight), - let .t6(weight), - let .t6_1(weight), - let .t7(weight), - let .t7_1(weight), - let .t8(weight): + let .t2(weight), + let .t3(weight), + let .t4(weight), + let .t5(weight), + let .t6(weight), + let .t6_1(weight), + let .t7(weight), + let .t7_1(weight), + let .t8(weight), + let .sc7(weight: weight): return weight } } - + var size: CGFloat { switch self { case .t1: return 24 @@ -82,12 +85,12 @@ private extension UIFont.WMFontSystem { case .t5: return 16 case .t6: return 14 case .t6_1: return 14 - case .t7: return 12 + case .t7, .sc7: return 12 case .t7_1: return 12 case .t8: return 11 } } - + var height: CGFloat { switch self { case .t1: return 36 @@ -95,9 +98,9 @@ private extension UIFont.WMFontSystem { case .t3: return 32 case .t4: return 28 case .t5: return 24 - case .t6: return 20 + case .t6: return 22 case .t6_1: return 20 - case .t7: return 18 + case .t7, .sc7: return 18 case .t7_1: return 14 case .t8: return 16 } @@ -110,6 +113,7 @@ public extension UIFont.WMFontSystem.WMFontWeight { case .light: return DesignSystemFontFamily.Pretendard.light case .medium: return DesignSystemFontFamily.Pretendard.medium case .bold: return DesignSystemFontFamily.Pretendard.bold + case .score3Light: return DesignSystemFontFamily.SCoreDream._3Light } } } diff --git a/Projects/UsertInterfaces/DesignSystem/Sources/WMLabel.swift b/Projects/UsertInterfaces/DesignSystem/Sources/WMLabel.swift index 97da8bba1..167a7b8a3 100644 --- a/Projects/UsertInterfaces/DesignSystem/Sources/WMLabel.swift +++ b/Projects/UsertInterfaces/DesignSystem/Sources/WMLabel.swift @@ -1,46 +1,68 @@ -// -// WMLabel.swift -// DesignSystem -// -// Created by YoungK on 11/22/23. -// Copyright © 2023 yongbeomkwak. All rights reserved. -// - -import UIKit import MarqueeLabel +import UIKit public final class WMLabel: UILabel { + override public var text: String? { + get { + self.attributedText?.string + } set { + self.attributedText = NSMutableAttributedString(string: newValue ?? "", attributes: attributes) + } + } + + var attributes: [NSAttributedString.Key: Any]? + public init( text: String, textColor: UIColor = .init(), font: UIFont.WMFontSystem, alignment: NSTextAlignment = .left, lineHeight: CGFloat? = nil, - kernValue: Double? = nil, + kernValue: Double? = -0.5, lineSpacing: CGFloat? = nil, lineHeightMultiple: CGFloat? = nil ) { super.init(frame: .zero) - self.text = text self.textColor = textColor self.font = .setFont(font) self.textAlignment = alignment - self.setTextWithAttributes(lineHeight: lineHeight, kernValue: kernValue, lineSpacing: lineSpacing, lineHeightMultiple: lineHeightMultiple, alignment: alignment) + attributes = self.getTextWithAttributes( + lineHeight: lineHeight ?? font.lineHeight, + kernValue: kernValue, + lineSpacing: lineSpacing, + lineHeightMultiple: lineHeightMultiple, + alignment: alignment + ) + + self.attributedText = NSMutableAttributedString(string: text, attributes: attributes) } - + convenience init( text: String, textColor: UIColor = .init(), font: UIFont.WMFontSystem, alignment: NSTextAlignment = .left, lineHeight: CGFloat? = nil, - kernValue: Double? = nil + kernValue: Double? = -0.5 ) { - self.init(text: text, textColor: textColor, font: font, alignment: alignment, lineHeight: lineHeight, kernValue: kernValue, lineSpacing: nil, lineHeightMultiple: nil) + self.init( + text: text, + textColor: textColor, + font: font, + alignment: alignment, + lineHeight: lineHeight, + kernValue: kernValue, + lineSpacing: nil, + lineHeightMultiple: nil + ) } - + + @available(*, unavailable) required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } -} + public func setFont(_ style: UIFont.WMFontSystem) { + self.font = UIFont.setFont(style) + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Sources/WMNavigationBarView.swift b/Projects/UsertInterfaces/DesignSystem/Sources/WMNavigationBarView.swift new file mode 100644 index 000000000..a455f6462 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Sources/WMNavigationBarView.swift @@ -0,0 +1,96 @@ +import SnapKit +import Then +import UIKit + +public final class WMNavigationBarView: UIView { + private let leftStackView = UIStackView().then { + $0.axis = .horizontal + $0.alignment = .center + } + + public private(set) var titleView: UIView = UIView() + private let rightStackView = UIStackView().then { + $0.isUserInteractionEnabled = true + $0.axis = .horizontal + $0.alignment = .center + $0.distribution = .fillEqually + $0.spacing = 10 + } + + private let horizontalInset: CGFloat + + public init(horizontalInset: CGFloat = 20) { + self.horizontalInset = horizontalInset + super.init(frame: .zero) + addView() + setLayout() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + public func setTitle( + _ text: String, + textColor: UIColor = DesignSystemAsset.NewGrayColor.gray900.color + ) { + let titleLabel = WMLabel( + text: text, + textColor: textColor, + font: .t5(weight: .medium), + alignment: .center + ) + titleView.removeFromSuperview() + self.titleView = titleLabel + + self.addSubview(titleView) + titleView.snp.remakeConstraints { + $0.center.equalToSuperview() + } + } + + public func setTitleView(_ view: UIView) { + titleView.removeFromSuperview() + self.titleView = view + + self.addSubview(titleView) + titleView.snp.remakeConstraints { + $0.center.equalToSuperview() + } + } + + public func setRightViews(_ views: [UIView]) { + rightStackView.arrangedSubviews.forEach { + $0.removeFromSuperview() + rightStackView.removeArrangedSubview($0) + } + views.forEach(rightStackView.addArrangedSubview(_:)) + } + + public func setLeftViews(_ views: [UIView]) { + leftStackView.arrangedSubviews.forEach { + $0.removeFromSuperview() + leftStackView.removeArrangedSubview($0) + } + views.forEach(leftStackView.addArrangedSubview(_:)) + } +} + +private extension WMNavigationBarView { + func addView() { + self.addSubview(leftStackView) + self.addSubview(rightStackView) + } + + func setLayout() { + leftStackView.snp.makeConstraints { + $0.left.equalToSuperview().inset(horizontalInset) + $0.centerY.equalToSuperview() + } + rightStackView.snp.makeConstraints { + $0.right.equalToSuperview().inset(horizontalInset) + $0.centerY.equalToSuperview() + } + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Sources/WMRetryWarningView.swift b/Projects/UsertInterfaces/DesignSystem/Sources/WMRetryWarningView.swift new file mode 100644 index 000000000..fbaf43b6a --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Sources/WMRetryWarningView.swift @@ -0,0 +1,104 @@ +import RxSwift +import SnapKit +import Then +import UIKit + +public protocol WMRetryWarningViewDelegate: AnyObject { + func tappedRetryButton() +} + +public final class WMRetryWarningView: UIView { + private let warningImageView: UIImageView = UIImageView().then { + $0.contentMode = .scaleAspectFill + $0.image = DesignSystemAsset.Search.warning.image + } + + private let descriptionLabel: WMLabel = WMLabel( + text: "", + textColor: DesignSystemAsset.BlueGrayColor.blueGray900.color, + font: .t6(weight: .light), + alignment: .center, + kernValue: -0.5 + ).then { + $0.numberOfLines = 0 + let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene + let screenWidth = windowScene?.screen.bounds.size.width ?? .zero + $0.preferredMaxLayoutWidth = screenWidth - 40 + } + + private let retryButton: UIButton = UIButton( + type: .system + ).then { + $0.titleLabel?.font = UIFont.WMFontSystem.t6(weight: .medium).font + $0.titleLabel?.setTextWithAttributes( + lineHeight: UIFont.WMFontSystem.t6(weight: .medium).font.lineHeight, + alignment: .center + ) + $0.setTitleColor(DesignSystemAsset.BlueGrayColor.blueGray600.color, for: .normal) + $0.layer.cornerRadius = 8 + $0.layer.borderColor = DesignSystemAsset.BlueGrayColor.blueGray400.color.withAlphaComponent(0.4).cgColor + $0.layer.borderWidth = 1 + $0.clipsToBounds = true + } + + public weak var delegate: WMRetryWarningViewDelegate? + + public init( + description: String, + retryButtonTitle: String + ) { + super.init(frame: .zero) + addSubviews() + setLayout() + configureUI( + description: description, + retryButtonTitle: retryButtonTitle + ) + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +private extension WMRetryWarningView { + func addSubviews() { + addSubview(warningImageView) + addSubview(descriptionLabel) + addSubview(retryButton) + } + + func setLayout() { + warningImageView.snp.makeConstraints { + $0.top.centerX.equalToSuperview() + $0.size.equalTo(80) + } + + descriptionLabel.snp.makeConstraints { + $0.top.equalTo(warningImageView.snp.bottom).offset(-2) + $0.horizontalEdges.greaterThanOrEqualTo(0) + $0.centerX.equalTo(warningImageView.snp.centerX) + } + + retryButton.snp.makeConstraints { + $0.width.equalTo(164) + $0.height.equalTo(44) + $0.top.equalTo(descriptionLabel.snp.bottom).offset(16) + $0.centerX.bottom.equalToSuperview() + } + } + + func configureUI( + description: String, + retryButtonTitle: String + ) { + descriptionLabel.text = description + retryButton.setTitle(retryButtonTitle, for: .normal) + retryButton.addTarget(self, action: #selector(retryButtonAction), for: .touchUpInside) + } + + @objc func retryButtonAction() { + delegate?.tappedRetryButton() + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Tests/TargetTest.swift b/Projects/UsertInterfaces/DesignSystem/Tests/TargetTest.swift index b1cf79405..147c29d2f 100644 --- a/Projects/UsertInterfaces/DesignSystem/Tests/TargetTest.swift +++ b/Projects/UsertInterfaces/DesignSystem/Tests/TargetTest.swift @@ -1,7 +1,6 @@ import XCTest class TargetTests: XCTestCase { - override func setUpWithError() throws { // Put setup code here. This method is called before the invocation of each test method in the class. } @@ -13,5 +12,4 @@ class TargetTests: XCTestCase { func testExample() throws { XCTAssertEqual("A", "A") } - } diff --git a/README.md b/README.md index 8ca914d87..125838027 100644 --- a/README.md +++ b/README.md @@ -15,10 +15,10 @@ ## iOS Developer & Designer -| iOS Hamp | 구구 | 케이 | 김대희 | 샴퓨(디자인) | +| iOS Hamp | 구구 | 케이 | 김대희 | baegteun | 샴퓨(디자인) | | --- | --- | --- | --- | -- | -| | | | | | -| [yongbeomkwak](https://github.com/yongbeomkwak) | [KangTaeHoon](https://github.com/KangTaeHoon) | [youn9k](https://github.com/youn9k) | [kimdaehee0824](https://github.com/kimdaehee0824) | [syampuuu](instagram.com/jjma._.y) | +| | | | | | | +| [yongbeomkwak](https://github.com/yongbeomkwak) | [KangTaeHoon](https://github.com/KangTaeHoon) | [youn9k](https://github.com/youn9k) | [kimdaehee0824](https://github.com/kimdaehee0824) | [baekteun](https://github.com/baekteun) | [syampuuu](instagram.com/jjma._.y) | ## iOS 모듈 구조도 diff --git a/Scripts/.swiftlint.yml b/Scripts/.swiftlint.yml new file mode 100644 index 000000000..2715e42db --- /dev/null +++ b/Scripts/.swiftlint.yml @@ -0,0 +1,26 @@ +force_cast: # From https://realm.github.io/SwiftLint/force_cast.html + warning # 강제 캐스팅은 error에서 warning으로 변경 + +identifier_name: + min_length: + warning: 1 + allowed_symbols: ["_"] + +nesting: + type_label: + warning: 3 + +type_name: + max_length: + warning: 60 + +function_body_length: + warning: 100 + error: 300 + +function_parameter_count: + warning: 10 + error: 15 + +disabled_rules: + - file_length diff --git a/Scripts/FirebaseCrashlyticsScript.sh b/Scripts/FirebaseCrashlyticsScript.sh index 6a133f0cb..bccdd2a2f 100755 --- a/Scripts/FirebaseCrashlyticsScript.sh +++ b/Scripts/FirebaseCrashlyticsScript.sh @@ -1,5 +1,5 @@ #if [ "${CONFIGURATION}" != "Debug" ]; then -"../Tuist/Dependencies/SwiftPackageManager/.build/checkouts/firebase-ios-sdk/Crashlytics/run" -"../Tuist/Dependencies/SwiftPackageManager/.build/checkouts/firebase-ios-sdk/Crashlytics/run" -gsp ../Projects/App/Resources/GoogleService-Info.plist -"../Tuist/Dependencies/SwiftPackageManager/.build/checkouts/firebase-ios-sdk/Crashlytics/upload-symbols" -gsp ../Projects/App/Resources/GoogleService-Info.plist -p ios ${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME} +"../.build/checkouts/firebase-ios-sdk/Crashlytics/run" +"../.build/checkouts/firebase-ios-sdk/Crashlytics/run" -gsp ../Projects/App/Resources/GoogleService-Info.plist +"../.build/checkouts/firebase-ios-sdk/Crashlytics/upload-symbols" -gsp ../Projects/App/Resources/GoogleService-Info.plist -p ios ${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME} #fi diff --git a/Scripts/GenerateModule.swift b/Scripts/GenerateModule.swift new file mode 100644 index 000000000..c4f43f896 --- /dev/null +++ b/Scripts/GenerateModule.swift @@ -0,0 +1,261 @@ +#!/usr/bin/swift +import Foundation + +func handleSIGINT(_ signal: Int32) { + exit(0) +} + +signal(SIGINT, handleSIGINT) + +enum LayerType: String { + case feature = "Feature" + case domain = "Domain" + @available(*, deprecated, message: "Service 레이어는 미래에 지워집니다. Service 레이어의 내용은 Domain 레이어로 이전될 예정입니다.") + case service = "Service" + case module = "Module" + case userInterface = "UserInterface" +} + +enum MicroTargetType: String { + case interface = "Interface" + case sources = "" + case testing = "Testing" + case unitTest = "Tests" + case uiTest = "UITests" + case demo = "Demo" +} + +let fileManager = FileManager.default +let currentPath = "./" +let bash = Bash() + +func registerModuleDependency() { + registerModulePaths() + makeProjectDirectory() + + let layerPrefix = layer.rawValue.lowercased() + let moduleEnum = ".\(layerPrefix)(.\(moduleName))" + var targetString = "[\n" + if hasInterface { + makeScaffold(target: .interface) + targetString += "\(tab(2)).interface(module: \(moduleEnum)),\n" + } + targetString += "\(tab(2)).implements(module: \(moduleEnum)" + if hasInterface { + targetString += ", dependencies: [\n\(tab(3)).\(layerPrefix)(target: .\(moduleName), type: .interface)\n\(tab(2))])" + } else { + targetString += ")" + } + if hasTesting { + makeScaffold(target: .testing) + let interfaceDependency = ".\(layerPrefix)(target: .\(moduleName), type: .interface)" + targetString += ",\n\(tab(2)).testing(module: \(moduleEnum), dependencies: [\n\(tab(3))\(interfaceDependency)\n\(tab(2))])" + } + if hasUnitTests { + makeScaffold(target: .unitTest) + targetString += ",\n\(tab(2)).tests(module: \(moduleEnum), dependencies: [\n\(tab(3)).\(layerPrefix)(target: .\(moduleName))\n\(tab(2))])" + } + if hasUITests { + makeScaffold(target: .uiTest) + // TODO: - ui test 타겟 설정 로직 추가 + } + if hasDemo { + makeScaffold(target: .demo) + targetString += ",\n\(tab(2)).demo(module: \(moduleEnum), dependencies: [\n\(tab(3)).\(layerPrefix)(target: .\(moduleName))\n\(tab(2))])" + } + targetString += "\n\(tab(1))]" + makeProjectSwift(targetString: targetString) + makeSourceScaffold() +} + +func tab(_ count: Int) -> String { + var tabString = "" + for _ in 0.. String +} + +enum BashError: Error { + case commandNotFound(name: String) +} + +struct Bash: CommandExecuting { + func run(commandName: String, arguments: [String] = []) throws -> String { + return try run(resolve(commandName), with: arguments) + } + + private func resolve(_ command: String) throws -> String { + guard var bashCommand = try? run("/bin/bash", with: ["-l", "-c", "which \(command)"]) else { + throw BashError.commandNotFound(name: command) + } + bashCommand = bashCommand.trimmingCharacters(in: NSCharacterSet.whitespacesAndNewlines) + return bashCommand + } + + private func run(_ command: String, with arguments: [String] = []) throws -> String { + let process = Process() + process.launchPath = command + process.arguments = arguments + let outputPipe = Pipe() + process.standardOutput = outputPipe + process.launch() + let outputData = outputPipe.fileHandleForReading.readDataToEndOfFile() + let output = String(decoding: outputData, as: UTF8.self) + return output + } +} \ No newline at end of file diff --git a/Scripts/GeneteFeature/Project.swift b/Scripts/GeneteFeature/Project.swift deleted file mode 100644 index 3cabc43ed..000000000 --- a/Scripts/GeneteFeature/Project.swift +++ /dev/null @@ -1,9 +0,0 @@ -//import ProjectDescription -//import ProjectDescriptionHelpers -// -//let project = Project.staticFramework( -// name: "Feature", -// dependencies: [ -// .Project.Features.Feature -// ] -//) diff --git a/Scripts/GeneteFeature/Sources/Feature.swift b/Scripts/GeneteFeature/Sources/Feature.swift deleted file mode 100644 index 8d35d5c80..000000000 --- a/Scripts/GeneteFeature/Sources/Feature.swift +++ /dev/null @@ -1 +0,0 @@ -// This is for the feature diff --git a/Scripts/GeneteFeature/Tests/.gitkeep b/Scripts/GeneteFeature/Tests/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/Scripts/GeneteFeature/Tests/TargetTest.swift b/Scripts/GeneteFeature/Tests/TargetTest.swift deleted file mode 100644 index b1cf79405..000000000 --- a/Scripts/GeneteFeature/Tests/TargetTest.swift +++ /dev/null @@ -1,17 +0,0 @@ -import XCTest - -class TargetTests: XCTestCase { - - override func setUpWithError() throws { - // Put setup code here. This method is called before the invocation of each test method in the class. - } - - override func tearDownWithError() throws { - // Put teardown code here. This method is called after the invocation of each test method in the class. - } - - func testExample() throws { - XCTAssertEqual("A", "A") - } - -} diff --git a/Scripts/NeedleRunScript.sh b/Scripts/NeedleRunScript.sh index c15ff4196..29f519d09 100755 --- a/Scripts/NeedleRunScript.sh +++ b/Scripts/NeedleRunScript.sh @@ -5,7 +5,16 @@ fi export PATH if which needle > /dev/null; then - needle generate Sources/Application/NeedleGenerated.swift ../ + + ROOT_PATH="Projects/App" + + if [ $# -eq 0 ]; then #로컬 + needle generate Sources/Application/NeedleGenerated.swift ../ + else #ci + touch "${ROOT_PATH}/Sources/Application/NeedleGenerated.swift" + needle generate ${ROOT_PATH}/Sources/Application/NeedleGenerated.swift ../ + fi + else echo "warning: Needle not installed, plz run 'brew install needle'" -fi +fi \ No newline at end of file diff --git a/Scripts/Setup.sh b/Scripts/Setup.sh new file mode 100644 index 000000000..ff2394c1e --- /dev/null +++ b/Scripts/Setup.sh @@ -0,0 +1,50 @@ +if test -d "/opt/homebrew/bin/"; then + PATH="/opt/homebrew/bin/:${PATH}" +fi + +export PATH + +if which swiftlint > /dev/null; then + echo "✅ SwiftLint가 설치되어있어요." +else + echo "❌ SwiftLint가 설치되어있지 않아요. SwiftLint 설치를 시작해요." + brew install swiftlint +fi + +if which swiftformat > /dev/null; then + echo "✅ SwiftFormat이 설치되어있어요." +else + echo "❌ SwiftFormat이 설치되어있지 않아요. SwiftFormat 설치를 시작해요." + brew install swiftformat +fi + +if which needle > /dev/null; then + echo "✅ Needle이 설치되어있어요." +else + echo "❌ Needle이 설치되어있지 않아요. Needle 설치를 시작해요." + brew install needle +fi + +if which tuist > /dev/null; then + echo "✅ Tuist가 설치되어있어요." +else + echo "❌ Tuist가 설치되어있지 않아요. Tuist 설치를 시작해요." + curl https://mise.run | sh + echo 'eval "$(~/.local/bin/mise activate --shims zsh)"' >> ~/.zshrc + source ~/.zshrc + + mise install tuist + tuist version +fi + +if which carthage > /dev/null; then + echo "✅ Carthage가 설치되어있어요." +else + echo "❌ Carthage가 설치되어있지 않아요. Carthage 설치를 시작해요." + brew install carthage +fi + +echo "✅ 개발 환경 기본 세팅을 완료했어요!" + +git config --local include.path ../.gitconfig +chmod 777 .githooks/* \ No newline at end of file diff --git a/Scripts/SwiftLintRunScript.sh b/Scripts/SwiftLintRunScript.sh index 48e55fec5..4c2bccd8d 100755 --- a/Scripts/SwiftLintRunScript.sh +++ b/Scripts/SwiftLintRunScript.sh @@ -4,8 +4,10 @@ fi export PATH +YML="$(dirname "$0")/.swiftlint.yml" + if which swiftlint > /dev/null; then - swiftlint + swiftlint --config ${YML} else echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint" fi diff --git a/Scripts/generatePlugin.swift b/Scripts/generatePlugin.swift new file mode 100644 index 000000000..fcbf8b0a1 --- /dev/null +++ b/Scripts/generatePlugin.swift @@ -0,0 +1,130 @@ +// +// generatePlugin.swift +// +// +// Created by yongbeomkwak on 2/17/24. +// + +import Foundation + +let fileManager = FileManager.default +let currentPath = "./" + +/// 폴더 생성 +func makeDirectory(_ path: String) { + + do { + try fileManager.createDirectory(atPath: path, withIntermediateDirectories: false, attributes: nil) + } catch { + fatalError("❌ failed to create directory: \(path)") + } + +} + +/// 파일 생성 +func writeContentInFile(path: String, content: String) { + let fileURL = URL(fileURLWithPath: path) + let data = Data(content.utf8) + + do { + try data.write(to: fileURL) + } catch { + fatalError("❌ failed to create File: \(path)") + } + +} + +// 파일 업데이트 +func updateFileContent( + filePath: String, + finding findingString: String, + inserting insertString: String +) { + let fileURL = URL(fileURLWithPath: filePath) + guard let readHandle = try? FileHandle(forReadingFrom: fileURL) else { + fatalError("❌ Failed to find \(filePath)") + } + guard let readData = try? readHandle.readToEnd() else { + fatalError("❌ Failed to find \(filePath)") + } + try? readHandle.close() + + guard var fileString = String(data: readData, encoding: .utf8) else { fatalError() } + fileString.insert(contentsOf: insertString, at: fileString.range(of: findingString)?.upperBound ?? fileString.endIndex) + + guard let writeHandle = try? FileHandle(forWritingTo: fileURL) else { + fatalError("❌ Failed to find \(filePath)") + } + writeHandle.seek(toFileOffset: 0) + try? writeHandle.write(contentsOf: Data(fileString.utf8)) + try? writeHandle.close() +} + + +/// Plugins.swift 파일 생성 +func makePluginSwift(_ plugin: String) { + + let prefix = plugin.prefix(1).lowercased() + + let tmp = plugin.dropFirst() + + let variableString = String(prefix) + tmp + + print("VA: \(variableString)") + let pluginSwift = """ +import ProjectDescription + +let \(variableString)Plugin = Plugin(name: "\(plugin)Plugin") + +""" + + writeContentInFile(path: currentPath+"Plugin/\(plugin)Plugin/Plugin.swift", content: pluginSwift) + print("TOO: \(variableString)") +} + +/// +func generatePlugin(_ plugin: String) { + + let helperPath : String = currentPath+"Plugin/\(plugin)Plugin/ProjectDescriptionHelpers" + let emptyFileContent : String = """ +"Empty" +""" + + makeDirectory(currentPath+"Plugin/\(plugin)Plugin") + makePluginSwift(plugin) + makeDirectory(helperPath) + writeContentInFile(path: "\(helperPath)/empty.swift", content: emptyFileContent) // 더미 파일 + registerToConfig(plugin) + + +} + + + + + +func registerToConfig(_ plugin: String) { + + let path = currentPath+"/Tuist/Config.swift" + let content = """ + + .local(path: .relativeToRoot("Plugin/\(plugin)Plugin")), +""" + + + updateFileContent(filePath: path, finding: "[",inserting: content) +} + + +// ✅ Entry Point + +print("Enter plugin Name\n⚠️ Do not include Plugin\nex) input: Dependency") +let plugin = readLine()! + +generatePlugin(plugin) +print("------------------------------------------------------------------------------------------------------------------------") +print("Plugin Name: \(plugin)") +print("Processing...") +print("------------------------------------------------------------------------------------------------------------------------") +print("✅ \(plugin)Plugin is created successfully!") + diff --git a/Scripts/generate_new_feature.py b/Scripts/generate_new_feature.py deleted file mode 100644 index 3a30df38f..000000000 --- a/Scripts/generate_new_feature.py +++ /dev/null @@ -1,213 +0,0 @@ -import sys -import os -import subprocess - - -def make_new_feature(feature_name, has_demo=False): - make_dir(f"{feature_name}Feature") - make_project_file(feature_name, f"{feature_name}Feature", has_demo) - make_sources(feature_name) - make_resources(feature_name) - make_swiftLint(feature_name) - make_tests(feature_name) - if has_demo: - make_demo(feature_name) - -def write_code_in_file(file_path, codes): - if not os.path.isfile(file_path): - subprocess.run(['touch', file_path]) - - master_key_file = open(file_path, 'w') - master_key_file.write(codes) - master_key_file.close() - -def make_dir(path): - if not os.path.exists(path): - os.makedirs(path) - -def make_dirs(paths): - for path in paths: - make_dir(path) - -def make_project_file(feature_name, file_path, has_demo=False, dependencies=[]): - project_path = file_path + '/Project.swift' - file_name = file_path.split('/')[-1] - file_content = f"""import ProjectDescription -import ProjectDescriptionHelpers - -let project = Project.makeModule( - name: "{feature_name}Feature", - product: .staticFramework, - dependencies: [ - .Project.Features.BaseFeature""" - file_content += ",\n ".join(dependencies) - file_content += "\n ]" - file_content += ', resources: ["Resources/**"]' - file_content += ",\n hasDemo: true" if has_demo else "" - file_content += "\n)" - write_code_in_file(project_path, file_content) - -def make_sources(feature_name): - make_dir(f'{feature_name}Feature/Sources') - feature_file_path = f'{feature_name}Feature/Sources/{feature_name}Feature.swift' - feature_content = '// This is for tuist' - write_code_in_file(feature_file_path, feature_content) - -def make_resources(feature_name): - make_dir(f'{feature_name}Feature/Resources') - feature_file_path = f'{feature_name}Feature/Resources/{feature_name}Feature.txt' - feature_content = '// This is for tuist' - write_code_in_file(feature_file_path, feature_content) - -def make_swiftLint(feature_name): - feature_file_path = f'{feature_name}Feature/.swiftlint.yml' - feature_content = """excluded: - - "**/*/NeedleGenerated.swift" - - "Tuist" -force_cast: # From https://realm.github.io/SwiftLint/force_cast.html - warning # 강제 캐스팅은 error에서 warning으로 변경 - -disabled_rules: - - trailing_whitespace - - vertical_whitespace - - colon - - comma - - comment_spacing # 주석 여백 - - mark # //MARK 관련 warning - - opening_brace # 괄호 열 때 줄바꿈을 했는지 안했는지, (안했으면 warning) - - line_length # 한줄에 글자 수 제한 , warning: 120, error: 200 (default) - - statement_position # if는 반드시 else로 끝나야한다. - - identifier_name #변수명 글자 수 제한" - """ - write_code_in_file(feature_file_path,feature_content) - - -def make_tests(feature_name): - make_dir(f'{feature_name}Feature/Tests') - test_file_path = f'{feature_name}Feature/Tests/TargetTests.swift' - test_content = '''import XCTest - -class TargetTests: XCTestCase { - - override func setUpWithError() throws { - // Put setup code here. This method is called before the invocation of each test method in the class. - } - - override func tearDownWithError() throws { - // Put teardown code here. This method is called after the invocation of each test method in the class. - } - - func testExample() throws { - XCTAssertEqual("A", "A") - } - -} -''' - write_code_in_file(test_file_path, test_content) - -def make_demo(feature_name): - make_dir(f'{feature_name}Feature/Demo') - make_dir(f'{feature_name}Feature/Demo/Sources') - make_dir(f'{feature_name}Feature/Demo/Resources') - launch_path = f'{feature_name}Feature/Demo/Resources/LaunchScreen.storyboard' - launch = ''' - - - - - - - - - - - - - - - - - - - - - - - - -''' - write_code_in_file(launch_path, launch) - - app_delegate_path = f'{feature_name}Feature/Demo/Sources/AppDelegate.swift' - app_delegate = '''import UIKit - -@UIApplicationMain -class AppDelegate: UIResponder, UIApplicationDelegate { - - var window: UIWindow? - - func application( - _ application: UIApplication, - didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil - ) -> Bool { - window = UIWindow(frame: UIScreen.main.bounds) - let viewController = UIViewController() - viewController.view.backgroundColor = .yellow - window?.rootViewController = viewController - window?.makeKeyAndVisible() - - return true - } -} -''' - write_code_in_file(app_delegate_path, app_delegate) - -def write_created_feature_on_dependency_project(feature_name): - file_path = f'{root_path}/Plugin/UtilityPlugin/ProjectDescriptionHelpers/Dependency+Project.swift' - read_file = read_file_at(file_path) - updated_file = update_file_at(read_file, feature_name) - write_file_at(file_path, updated_file) - -def read_file_at(file_path): - with open(file_path, 'r') as file: - return file.readlines() - -def update_file_at(dependency_file, feature_name): - insert_line = 0 - dependency_file_len = len(dependency_file) - for index, elem in enumerate(dependency_file): - if "public extension TargetDependency.Project.Features" in elem: - insert_line = index + 1 - break - - append_code = f' static let {feature_name}Feature = TargetDependency.feature(name: "{feature_name}Feature")\n' - - if dependency_file_len > int(insert_line): - dependency_file.insert(insert_line, append_code) - - return dependency_file - -def write_file_at(file_path, update_file): - with open(file_path, 'w') as file: - file.writelines(update_file) - - -print('Input new feature name ', end=': ', flush=True) -feature_name = sys.stdin.readline().replace("\n", "") -feature_name = feature_name.replace("Feature", "") - -print('Include demo? (Y or N, default = N) ', end=': ', flush=True) -has_demo = sys.stdin.readline().replace("\n", "").upper() == "Y" - -print(f'Start to generate the new feature named {feature_name}...') - -current_file_path = os.path.dirname(os.path.abspath(__file__)) -os.chdir(current_file_path) -os.chdir(os.pardir) -root_path = os.getcwd() -os.chdir(root_path + '/Projects/Features') - -make_new_feature(feature_name, has_demo) -write_created_feature_on_dependency_project(feature_name) - -print(f'Created {feature_name}Feature Module') diff --git a/Tuist/Config.swift b/Tuist/Config.swift index 28f2dc1ad..ee6458716 100644 --- a/Tuist/Config.swift +++ b/Tuist/Config.swift @@ -2,7 +2,10 @@ import ProjectDescription let config = Config( plugins: [ - .local(path: .relativeToRoot("Plugin/UtilityPlugin")) + .local(path: .relativeToRoot("Plugin/TemplatePlugin")), + .local(path: .relativeToRoot("Plugin/ConfigurationPlugin")), + .local(path: .relativeToRoot("Plugin/DependencyPlugin")), + .local(path: .relativeToRoot("Plugin/EnvironmentPlugin")) ], generationOptions: .options() ) diff --git a/Tuist/Dependencies.swift b/Tuist/Dependencies.swift index 131ef98e4..8e4f5c107 100644 --- a/Tuist/Dependencies.swift +++ b/Tuist/Dependencies.swift @@ -1,28 +1,10 @@ import ProjectDescription let dependencies = Dependencies( - carthage: nil, + carthage: [ + .github(path: "realm/realm-swift", requirement: .upToNext("10.46.0")) + ], swiftPackageManager: SwiftPackageManagerDependencies( - [ - .remote(url: "https://github.com/Moya/Moya.git", requirement: .upToNextMajor(from: "15.0.3")), - .remote(url: "https://github.com/onevcat/Kingfisher.git", requirement: .upToNextMajor(from: "7.6.0")), - .remote(url: "https://github.com/slackhq/PanModal.git", requirement: .upToNextMajor(from: "1.2.0")), - .remote(url: "https://github.com/ReactiveX/RxSwift.git",requirement: .upToNextMajor(from: "6.5.0")), - .remote(url: "https://github.com/devxoul/Then", requirement: .upToNextMajor(from: "2.0.0")), - .remote(url: "https://github.com/SnapKit/SnapKit.git", requirement: .upToNextMajor(from: "5.0.1")), - .remote(url: "https://github.com/ashleymills/Reachability.swift", requirement: .upToNextMajor(from: "5.1.0")), - .remote(url: "https://github.com/airbnb/lottie-ios.git", requirement: .upToNextMajor(from: "4.0.0")), - .remote(url: "https://github.com/uber/needle.git", requirement: .upToNextMajor(from: "0.19.0")), - .remote(url: "https://github.com/uias/Tabman.git", requirement: .upToNextMajor(from: "3.0.1")), - .remote(url: "https://github.com/RxSwiftCommunity/RxDataSources.git", requirement: .upToNextMajor(from: "5.0.0")), - .remote(url: "https://github.com/RxSwiftCommunity/RxKeyboard.git", requirement: .upToNextMajor(from: "2.0.1")), - .remote(url: "https://github.com/huri000/SwiftEntryKit", requirement: .upToNextMajor(from: "2.0.0")), - .remote(url: "https://github.com/kyungkoo/naveridlogin-ios-sp", requirement: .upToNextMajor(from: "4.1.5")), - .remote(url: "https://github.com/krzyzanowskim/CryptoSwift.git", requirement: .upToNextMajor(from: "1.8.0")), - .remote(url: "https://github.com/cbpowell/MarqueeLabel.git", requirement: .upToNextMajor(from: "4.3.0")), - .remote(url: "https://github.com/firebase/firebase-ios-sdk.git", requirement: .upToNextMajor(from: "10.7.0")), - .remote(url: "https://github.com/ninjaprox/NVActivityIndicatorView.git", requirement: .upToNextMajor(from: "5.1.1")) - ], baseSettings: .settings( configurations: [ .debug(name: .debug), diff --git a/Tuist/Package.resolved b/Tuist/Package.resolved new file mode 100644 index 000000000..ca4ae2113 --- /dev/null +++ b/Tuist/Package.resolved @@ -0,0 +1,366 @@ +{ + "originHash" : "cfcef3161222cecec9f2a4aacfe123ed471e27218930ca40dabd850bde16957e", + "pins" : [ + { + "identity" : "abseil-cpp-binary", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/abseil-cpp-binary.git", + "state" : { + "revision" : "bfc0b6f81adc06ce5121eb23f628473638d67c5c", + "version" : "1.2022062300.0" + } + }, + { + "identity" : "alamofire", + "kind" : "remoteSourceControl", + "location" : "https://github.com/Alamofire/Alamofire.git", + "state" : { + "revision" : "3dc6a42c7727c49bf26508e29b0a0b35f9c7e1ad", + "version" : "5.8.1" + } + }, + { + "identity" : "app-check", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/app-check.git", + "state" : { + "revision" : "3e464dad87dad2d29bb29a97836789bf0f8f67d2", + "version" : "10.18.1" + } + }, + { + "identity" : "cryptoswift", + "kind" : "remoteSourceControl", + "location" : "https://github.com/krzyzanowskim/CryptoSwift.git", + "state" : { + "revision" : "7892a123f7e8d0fe62f9f03728b17bbd4f94df5c", + "version" : "1.8.1" + } + }, + { + "identity" : "cwlcatchexception", + "kind" : "remoteSourceControl", + "location" : "https://github.com/mattgallagher/CwlCatchException.git", + "state" : { + "revision" : "3ef6999c73b6938cc0da422f2c912d0158abb0a0", + "version" : "2.2.0" + } + }, + { + "identity" : "cwlpreconditiontesting", + "kind" : "remoteSourceControl", + "location" : "https://github.com/mattgallagher/CwlPreconditionTesting.git", + "state" : { + "revision" : "2ef56b2caf25f55fa7eef8784c30d5a767550f54", + "version" : "2.2.1" + } + }, + { + "identity" : "firebase-ios-sdk", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/firebase-ios-sdk", + "state" : { + "revision" : "d9bcd141c3e4ad48a9500e6faeebb073f43cbcbd", + "version" : "10.19.0" + } + }, + { + "identity" : "googleappmeasurement", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleAppMeasurement.git", + "state" : { + "revision" : "6b332152355c372ace9966d8ee76ed191f97025e", + "version" : "10.17.0" + } + }, + { + "identity" : "googledatatransport", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleDataTransport.git", + "state" : { + "revision" : "a732a4b47f59e4f725a2ea10f0c77e93a7131117", + "version" : "9.3.0" + } + }, + { + "identity" : "googleutilities", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleUtilities.git", + "state" : { + "revision" : "bc27fad73504f3d4af235de451f02ee22586ebd3", + "version" : "7.12.1" + } + }, + { + "identity" : "grpc-binary", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/grpc-binary.git", + "state" : { + "revision" : "a673bc2937fbe886dd1f99c401b01b6d977a9c98", + "version" : "1.49.1" + } + }, + { + "identity" : "gtm-session-fetcher", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/gtm-session-fetcher.git", + "state" : { + "revision" : "76135c9f4e1ac85459d5fec61b6f76ac47ab3a4c", + "version" : "3.3.1" + } + }, + { + "identity" : "inject", + "kind" : "remoteSourceControl", + "location" : "https://github.com/krzysztofzablocki/Inject.git", + "state" : { + "revision" : "d394c5327141ba490a13080147af7228ee77aa59", + "version" : "1.4.0" + } + }, + { + "identity" : "interop-ios-for-google-sdks", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/interop-ios-for-google-sdks.git", + "state" : { + "revision" : "2d12673670417654f08f5f90fdd62926dc3a2648", + "version" : "100.0.0" + } + }, + { + "identity" : "kingfisher", + "kind" : "remoteSourceControl", + "location" : "https://github.com/onevcat/Kingfisher.git", + "state" : { + "revision" : "3ec0ab0bca4feb56e8b33e289c9496e89059dd08", + "version" : "7.10.2" + } + }, + { + "identity" : "leveldb", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/leveldb.git", + "state" : { + "revision" : "9d108e9112aa1d65ce508facf804674546116d9c", + "version" : "1.22.3" + } + }, + { + "identity" : "lottie-ios", + "kind" : "remoteSourceControl", + "location" : "https://github.com/airbnb/lottie-ios.git", + "state" : { + "revision" : "f522990668c2f9132323a2e68d924c7dcb9130b4", + "version" : "4.4.0" + } + }, + { + "identity" : "marqueelabel", + "kind" : "remoteSourceControl", + "location" : "https://github.com/cbpowell/MarqueeLabel.git", + "state" : { + "revision" : "ae3cf7c647dd7f67f1946658285f5f0ce2476caf", + "version" : "4.4.0" + } + }, + { + "identity" : "moya", + "kind" : "remoteSourceControl", + "location" : "https://github.com/Moya/Moya.git", + "state" : { + "revision" : "c263811c1f3dbf002be9bd83107f7cdc38992b26", + "version" : "15.0.3" + } + }, + { + "identity" : "nanopb", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/nanopb.git", + "state" : { + "revision" : "819d0a2173aff699fb8c364b6fb906f7cdb1a692", + "version" : "2.30909.0" + } + }, + { + "identity" : "naveridlogin-ios-sp", + "kind" : "remoteSourceControl", + "location" : "https://github.com/kyungkoo/naveridlogin-ios-sp", + "state" : { + "revision" : "85b08cf3be9bfd84df09437c64bc621c93336770", + "version" : "4.1.5" + } + }, + { + "identity" : "needle", + "kind" : "remoteSourceControl", + "location" : "https://github.com/uber/needle.git", + "state" : { + "revision" : "6db73ae873952794b94fd6bb5111554e23c160af", + "version" : "0.24.0" + } + }, + { + "identity" : "nimble", + "kind" : "remoteSourceControl", + "location" : "https://github.com/Quick/Nimble.git", + "state" : { + "revision" : "efe11bbca024b57115260709b5c05e01131470d0", + "version" : "13.2.1" + } + }, + { + "identity" : "nvactivityindicatorview", + "kind" : "remoteSourceControl", + "location" : "https://github.com/ninjaprox/NVActivityIndicatorView.git", + "state" : { + "revision" : "bcb52371f2259254bac6690f92bb474a61768c47", + "version" : "5.1.1" + } + }, + { + "identity" : "pageboy", + "kind" : "remoteSourceControl", + "location" : "https://github.com/uias/Pageboy", + "state" : { + "revision" : "5522aa6ae88633f6c23cf504e9cd684e963822f1", + "version" : "4.0.2" + } + }, + { + "identity" : "panmodal", + "kind" : "remoteSourceControl", + "location" : "https://github.com/slackhq/PanModal.git", + "state" : { + "revision" : "b012aecb6b67a8e46369227f893c12544846613f", + "version" : "1.2.7" + } + }, + { + "identity" : "promises", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/promises.git", + "state" : { + "revision" : "e70e889c0196c76d22759eb50d6a0270ca9f1d9e", + "version" : "2.3.1" + } + }, + { + "identity" : "quick", + "kind" : "remoteSourceControl", + "location" : "https://github.com/Quick/Quick.git", + "state" : { + "revision" : "26529ff2209c40ae50fd642b031f930d9d68ea02", + "version" : "7.5.0" + } + }, + { + "identity" : "reachability.swift", + "kind" : "remoteSourceControl", + "location" : "https://github.com/ashleymills/Reachability.swift", + "state" : { + "revision" : "c01127cb51f591045696128effe43c16840d08bf", + "version" : "5.2.0" + } + }, + { + "identity" : "reactiveswift", + "kind" : "remoteSourceControl", + "location" : "https://github.com/ReactiveCocoa/ReactiveSwift.git", + "state" : { + "revision" : "c43bae3dac73fdd3cb906bd5a1914686ca71ed3c", + "version" : "6.7.0" + } + }, + { + "identity" : "reactorkit", + "kind" : "remoteSourceControl", + "location" : "https://github.com/ReactorKit/ReactorKit.git", + "state" : { + "revision" : "8fa33f09c6f6621a2aa536d739956d53b84dd139", + "version" : "3.2.0" + } + }, + { + "identity" : "rxdatasources", + "kind" : "remoteSourceControl", + "location" : "https://github.com/RxSwiftCommunity/RxDataSources.git", + "state" : { + "revision" : "90c29b48b628479097fe775ed1966d75ac374518", + "version" : "5.0.2" + } + }, + { + "identity" : "rxkeyboard", + "kind" : "remoteSourceControl", + "location" : "https://github.com/RxSwiftCommunity/RxKeyboard.git", + "state" : { + "revision" : "63f6377975c962a1d89f012a6f1e5bebb2c502b7", + "version" : "2.0.1" + } + }, + { + "identity" : "rxswift", + "kind" : "remoteSourceControl", + "location" : "https://github.com/ReactiveX/RxSwift.git", + "state" : { + "revision" : "9dcaa4b333db437b0fbfaf453fad29069044a8b4", + "version" : "6.6.0" + } + }, + { + "identity" : "snapkit", + "kind" : "remoteSourceControl", + "location" : "https://github.com/SnapKit/SnapKit.git", + "state" : { + "revision" : "e74fe2a978d1216c3602b129447c7301573cc2d8", + "version" : "5.7.0" + } + }, + { + "identity" : "swift-protobuf", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-protobuf.git", + "state" : { + "revision" : "65e8f29b2d63c4e38e736b25c27b83e012159be8", + "version" : "1.25.2" + } + }, + { + "identity" : "swiftentrykit", + "kind" : "remoteSourceControl", + "location" : "https://github.com/huri000/SwiftEntryKit", + "state" : { + "revision" : "5ad36cccf0c4b9fea32f4e9b17a8e38f07563ef0", + "version" : "2.0.0" + } + }, + { + "identity" : "tabman", + "kind" : "remoteSourceControl", + "location" : "https://github.com/uias/Tabman.git", + "state" : { + "revision" : "e32c0d821b03566ed966753f941113883f268da0", + "version" : "3.0.2" + } + }, + { + "identity" : "then", + "kind" : "remoteSourceControl", + "location" : "https://github.com/devxoul/Then", + "state" : { + "revision" : "e421a7b3440a271834337694e6050133a3958bc7", + "version" : "2.7.0" + } + }, + { + "identity" : "weakmaptable", + "kind" : "remoteSourceControl", + "location" : "https://github.com/ReactorKit/WeakMapTable.git", + "state" : { + "revision" : "cb05d64cef2bbf51e85c53adee937df46540a74e", + "version" : "1.2.1" + } + } + ], + "version" : 2 +} diff --git a/Tuist/ProjectDescriptionHelpers/Action+Template.swift b/Tuist/ProjectDescriptionHelpers/Action+Template.swift index 09702c058..5987d6562 100644 --- a/Tuist/ProjectDescriptionHelpers/Action+Template.swift +++ b/Tuist/ProjectDescriptionHelpers/Action+Template.swift @@ -13,18 +13,35 @@ public extension TargetScript { name: "Needle", basedOnDependencyAnalysis: false ) + + static let firebaseInfoByConfiguration = TargetScript.post( + script: """ + case "${CONFIGURATION}" in + "Release" ) + cp -r "$SRCROOT/Resources/GoogleService-Info.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist" + ;; + *) + cp -r "$SRCROOT/Resources/GoogleService-Info-QA.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist" + ;; + esac + + """, + name: "Firebase Info copy by Configuration", + basedOnDependencyAnalysis: false + ) static let firebaseCrashlytics = TargetScript.post( script: """ ROOT_DIR=\(ProcessInfo.processInfo.environment["TUIST_ROOT_DIR"] ?? "") - "${ROOT_DIR}/Tuist/Dependencies/SwiftPackageManager/.build/checkouts/firebase-ios-sdk/Crashlytics/run" + "${ROOT_DIR}/.build/checkouts/firebase-ios-sdk/Crashlytics/run" """ , name: "FirebaseCrashlytics", inputPaths: [ "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME}", "$(SRCROOT)/$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)" - ] + ], + basedOnDependencyAnalysis: false ) } diff --git a/Tuist/ProjectDescriptionHelpers/Environment.swift b/Tuist/ProjectDescriptionHelpers/Environment.swift deleted file mode 100644 index f689e38fd..000000000 --- a/Tuist/ProjectDescriptionHelpers/Environment.swift +++ /dev/null @@ -1,17 +0,0 @@ -import ProjectDescription - -public enum Environment { - public static let appName = "WaktaverseMusic" - public static let targetName = "WaktaverseMusic" - public static let beforeName = "Billboardoo" - public static let targetTestName = "\(targetName)Tests" - public static let organizationName = "yongbeomkwak" - public static let deploymentTarget: DeploymentTarget = .iOS(targetVersion: "14.0", devices: [.iphone]) - public static let platform = Platform.iOS - public static let baseSetting: SettingsDictionary = SettingsDictionary() - .marketingVersion("2.2.0") - .currentProjectVersion("0") - .debugInformationFormat(DebugInformationFormat.dwarfWithDsym) - .otherLinkerFlags(["-ObjC"]) - .bitcodeEnabled(false) -} diff --git a/Tuist/ProjectDescriptionHelpers/GenerateEnvironment.swift b/Tuist/ProjectDescriptionHelpers/GenerateEnvironment.swift new file mode 100644 index 000000000..306c1dfa2 --- /dev/null +++ b/Tuist/ProjectDescriptionHelpers/GenerateEnvironment.swift @@ -0,0 +1,27 @@ +import Foundation +import ProjectDescription + +public enum GenerateEnvironment: String { + case ci = "CI" + case cd = "CD" + case dev = "DEV" +} + +let environment = ProcessInfo.processInfo.environment["TUIST_ENV"] ?? "" +public let generateEnvironment = GenerateEnvironment(rawValue: environment) ?? .dev + +public extension GenerateEnvironment { + var appScripts: [TargetScript] { + switch self { + + case .ci: + return [] + + case .cd: + return [.firebaseInfoByConfiguration, .firebaseCrashlytics] + + case .dev: + return [.swiftLint, .needle] + } + } +} diff --git a/Tuist/ProjectDescriptionHelpers/Internal/Configurable.swift b/Tuist/ProjectDescriptionHelpers/Internal/Configurable.swift new file mode 100644 index 000000000..ff97c2738 --- /dev/null +++ b/Tuist/ProjectDescriptionHelpers/Internal/Configurable.swift @@ -0,0 +1,14 @@ +import Foundation + +protocol Configurable { + func with(_ block: (inout Self) throws -> Void) rethrows -> Self +} + +extension Configurable { + @inlinable + func with(_ block: (inout Self) throws -> Void) rethrows -> Self { + var copy = self + try block(©) + return copy + } +} diff --git a/Tuist/ProjectDescriptionHelpers/Project+Template.swift b/Tuist/ProjectDescriptionHelpers/Project+Template.swift deleted file mode 100644 index f50860583..000000000 --- a/Tuist/ProjectDescriptionHelpers/Project+Template.swift +++ /dev/null @@ -1,157 +0,0 @@ -import ProjectDescription -import UtilityPlugin -import Foundation - -public extension Project { - static func makeModule( - name: String, - platform: Platform = .iOS, - product: Product, - packages: [Package] = [], - dependencies: [TargetDependency] = [], - sources: SourceFilesList = ["Sources/**"], - resources: ResourceFileElements? = nil, - demoResources: ResourceFileElements? = nil, - infoPlist: InfoPlist = .default, - hasDemoApp: Bool = false - ) -> Project { - return project( - name: name, - platform: platform, - product: product, - packages: packages, - dependencies: dependencies, - sources: sources, - resources: resources, - infoPlist: infoPlist, - hasDemoApp: hasDemoApp - ) - } -} - -public extension Project { - static func project( - name: String, - platform: Platform, - product: Product, - organizationName: String = Environment.organizationName, - packages: [Package] = [], - deploymentTarget: DeploymentTarget? = Environment.deploymentTarget, - dependencies: [TargetDependency] = [], - sources: SourceFilesList, - resources: ResourceFileElements? = nil, - demoResources: ResourceFileElements? = nil, - infoPlist: InfoPlist, - hasDemoApp: Bool = false - ) -> Project { - let isForDev = (ProcessInfo.processInfo.environment["TUIST_DEV"] ?? "0") == "1" ? true : false - let scripts: [TargetScript] = isForDev ? [.swiftLint] : [.firebaseCrashlytics] - let settings: Settings = .settings( - base: Environment.baseSetting, - configurations: [ - .debug(name: .debug), - .release(name: .release) - ], defaultSettings: .recommended) - let appTarget = Target( - name: name, - platform: platform, - product: product, - bundleId: "\(organizationName).\(name)", - deploymentTarget: deploymentTarget, - infoPlist: infoPlist, - sources: sources, - resources: resources, - scripts: scripts, - dependencies: dependencies - ) - let demoSource: SourceFilesList = ["Demo/Sources/**"] - let demoSources: SourceFilesList = SourceFilesList(globs: sources.globs + demoSource.globs) - - let demoAppTarget = Target( - name: "\(name)DemoApp", - platform: platform, - product: .app, - bundleId: "\(organizationName).\(name)DemoApp", - deploymentTarget: Environment.deploymentTarget, - infoPlist: .extendingDefault(with: [ - "UIMainStoryboardFile": "", - "UILaunchStoryboardName": "LaunchScreen", - "ENABLE_TESTS": .boolean(true), - ]), - sources: demoSources, - resources: ["Demo/Resources/**"], - scripts: scripts, - dependencies: [ - .target(name: name) - ] - ) - - let testTargetDependencies: [TargetDependency] = hasDemoApp - ? [.target(name: "\(name)DemoApp")] - : [.target(name: name)] - - let testTarget = Target( - name: "\(name)Tests", - platform: platform, - product: .unitTests, - bundleId: "\(organizationName).\(name)Tests", - deploymentTarget: deploymentTarget, - infoPlist: .default, - sources: ["Tests/**"], - dependencies: testTargetDependencies + [ - ] - ) - - let schemes: [Scheme] = hasDemoApp - ? [.makeScheme(target: .debug, name: name), .makeDemoScheme(target: .debug, name: name)] - : [.makeScheme(target: .debug, name: name)] - - let targets: [Target] = hasDemoApp - ? [appTarget, testTarget, demoAppTarget] - : [appTarget, testTarget] - - return Project( - name: name, - organizationName: organizationName, - packages: packages, - settings: settings, - targets: targets, - schemes: schemes - ) - } -} - -extension Scheme { - static func makeScheme(target: ConfigurationName, name: String) -> Scheme { - return Scheme( - name: name, - shared: true, - buildAction: .buildAction(targets: ["\(name)"]), - testAction: .targets( - ["\(name)Tests"], - configuration: target, - options: .options(coverage: true, codeCoverageTargets: ["\(name)"]) - ), - runAction: .runAction(configuration: target), - archiveAction: .archiveAction(configuration: target), - profileAction: .profileAction(configuration: target), - analyzeAction: .analyzeAction(configuration: target) - ) - } - static func makeDemoScheme(target: ConfigurationName, name: String) -> Scheme { - return Scheme( - name: name, - shared: true, - buildAction: .buildAction(targets: ["\(name)DemoApp"]), - testAction: .targets( - ["\(name)Tests"], - configuration: target, - options: .options(coverage: true, codeCoverageTargets: ["\(name)DemoApp"]) - ), - runAction: .runAction(configuration: target), - archiveAction: .archiveAction(configuration: target), - profileAction: .profileAction(configuration: target), - analyzeAction: .analyzeAction(configuration: target) - ) - } -} diff --git a/Tuist/ProjectDescriptionHelpers/Project/Project+Template.swift b/Tuist/ProjectDescriptionHelpers/Project/Project+Template.swift new file mode 100644 index 000000000..83e615762 --- /dev/null +++ b/Tuist/ProjectDescriptionHelpers/Project/Project+Template.swift @@ -0,0 +1,72 @@ +import ConfigurationPlugin +import DependencyPlugin +import EnvironmentPlugin +import Foundation +import ProjectDescription + +public extension Project { + static func module( + name: String, + options: Options = .options(), + packages: [Package] = [], + settings: Settings = .settings( + base: env.baseSetting, + configurations: .default, + defaultSettings: .recommended + ), + targets: [Target], + fileHeaderTemplate: FileHeaderTemplate? = nil, + additionalFiles: [FileElement] = [], + resourceSynthesizers: [ResourceSynthesizer] = .default + ) -> Project { + return Project( + name: name, + organizationName: env.organizationName, + options: options, + packages: packages, + settings: settings, + targets: targets, + schemes: targets.contains { $0.product == .app } ? + [.makeScheme(target: .debug, name: name), .makeDemoScheme(target: .debug, name: name)] : + [.makeScheme(target: .debug, name: name)], + fileHeaderTemplate: fileHeaderTemplate, + additionalFiles: additionalFiles, + resourceSynthesizers: resourceSynthesizers + ) + } +} + +extension Scheme { + static func makeScheme(target: ConfigurationName, name: String) -> Scheme { + return Scheme.scheme( + name: name, + shared: true, + buildAction: .buildAction(targets: ["\(name)"]), + testAction: .targets( + ["\(name)Tests"], + configuration: target, + options: .options(coverage: true, codeCoverageTargets: ["\(name)"]) + ), + runAction: .runAction(configuration: target), + archiveAction: .archiveAction(configuration: target), + profileAction: .profileAction(configuration: target), + analyzeAction: .analyzeAction(configuration: target) + ) + } + static func makeDemoScheme(target: ConfigurationName, name: String) -> Scheme { + return Scheme.scheme( + name: name, + shared: true, + buildAction: .buildAction(targets: ["\(name)Demo"]), + testAction: .targets( + ["\(name)Tests"], + configuration: target, + options: .options(coverage: true, codeCoverageTargets: ["\(name)Demo"]) + ), + runAction: .runAction(configuration: target), + archiveAction: .archiveAction(configuration: target), + profileAction: .profileAction(configuration: target), + analyzeAction: .analyzeAction(configuration: target) + ) + } +} diff --git a/Tuist/ProjectDescriptionHelpers/SourceFiles+Template.swift b/Tuist/ProjectDescriptionHelpers/SourceFiles+Template.swift deleted file mode 100644 index 4934f3a99..000000000 --- a/Tuist/ProjectDescriptionHelpers/SourceFiles+Template.swift +++ /dev/null @@ -1,7 +0,0 @@ -import ProjectDescription - -public extension SourceFilesList { - static let sources: SourceFilesList = "Sources/**" - static let resources: SourceFilesList = "Resources/**" - static let tests: SourceFilesList = "Tests/**" -} diff --git a/Tuist/ProjectDescriptionHelpers/SourceFiles/SourceFiles+Template.swift b/Tuist/ProjectDescriptionHelpers/SourceFiles/SourceFiles+Template.swift new file mode 100644 index 000000000..5ddf3499f --- /dev/null +++ b/Tuist/ProjectDescriptionHelpers/SourceFiles/SourceFiles+Template.swift @@ -0,0 +1,11 @@ +import Foundation +import ProjectDescription + +public extension SourceFilesList { + static let demoSources: SourceFilesList = "Demo/Sources/**" + static let interface: SourceFilesList = "Interface/**" + static let sources: SourceFilesList = "Sources/**" + static let testing: SourceFilesList = "Testing/**" + static let unitTests: SourceFilesList = "Tests/**" + static let uiTests: SourceFilesList = "UITests/**" +} diff --git a/Tuist/ProjectDescriptionHelpers/Target/Target+MicroFeatures.swift b/Tuist/ProjectDescriptionHelpers/Target/Target+MicroFeatures.swift new file mode 100644 index 000000000..153b9306d --- /dev/null +++ b/Tuist/ProjectDescriptionHelpers/Target/Target+MicroFeatures.swift @@ -0,0 +1,211 @@ +import DependencyPlugin +import EnvironmentPlugin +import ConfigurationPlugin +import ProjectDescription + +// MARK: - Interface +public extension Target { + static func interface(module: ModulePaths, spec: TargetSpec) -> Target { + spec.with { + $0.sources = .interface + } + .toTarget(with: module.targetName(type: .interface), product: .framework) + } + + static func interface(module: ModulePaths, dependencies: [TargetDependency] = []) -> Target { + TargetSpec(sources: .interface, dependencies: dependencies) + .toTarget(with: module.targetName(type: .interface), product: .framework) + } + + static func interface(name: String, spec: TargetSpec) -> Target { + spec.with { + $0.sources = .interface + } + .toTarget(with: "\(name)Interface", product: .framework) + } + + static func interface(name: String, dependencies: [TargetDependency] = []) -> Target { + TargetSpec(sources: .interface, dependencies: dependencies) + .toTarget(with: "\(name)Interface", product: .framework) + } +} + +// MARK: - Implements +public extension Target { + static func implements( + module: ModulePaths, + product: Product = .staticLibrary, + spec: TargetSpec + ) -> Target { + spec.with { + $0.sources = .sources + } + .toTarget(with: module.targetName(type: .sources), product: product) + } + + static func implements( + module: ModulePaths, + product: Product = .staticLibrary, + dependencies: [TargetDependency] = [] + ) -> Target { + TargetSpec(sources: .sources, dependencies: dependencies) + .toTarget(with: module.targetName(type: .sources), product: product) + } + + static func implements( + name: String, + product: Product = .staticLibrary, + spec: TargetSpec + ) -> Target { + spec.with { + $0.sources = .sources + } + .toTarget(with: name, product: product) + } + + static func implements( + name: String, + product: Product = .staticLibrary, + dependencies: [TargetDependency] = [] + ) -> Target { + TargetSpec(sources: .sources, dependencies: dependencies) + .toTarget(with: name, product: product) + } +} + +// MARK: - Testing +public extension Target { + static func testing(module: ModulePaths, spec: TargetSpec) -> Target { + spec.with { + $0.sources = .testing + } + .toTarget(with: module.targetName(type: .testing), product: .framework) + } + + static func testing(module: ModulePaths, dependencies: [TargetDependency] = []) -> Target { + TargetSpec(sources: .testing, dependencies: dependencies) + .toTarget(with: module.targetName(type: .testing), product: .framework) + } + + static func testing(name: String, spec: TargetSpec) -> Target { + spec.with { + $0.sources = .testing + } + .toTarget(with: "\(name)Testing", product: .framework) + } + + static func testing(name: String, dependencies: [TargetDependency] = []) -> Target { + TargetSpec(sources: .testing, dependencies: dependencies) + .toTarget(with: "\(name)Testing", product: .framework) + } +} + +// MARK: - Tests +public extension Target { + static func tests(module: ModulePaths, spec: TargetSpec) -> Target { + spec.with { + $0.sources = .unitTests + $0.dependencies += [.SPM.Quick, .SPM.Nimble] + } + .toTarget(with: module.targetName(type: .unitTest), product: .unitTests) + } + + static func tests(module: ModulePaths, dependencies: [TargetDependency] = []) -> Target { + TargetSpec( + sources: .unitTests, + dependencies: dependencies + [.SPM.Quick, .SPM.Nimble] + ) + .toTarget(with: module.targetName(type: .unitTest), product: .unitTests) + } + + static func tests(name: String, spec: TargetSpec) -> Target { + spec.with { + $0.sources = .unitTests + $0.dependencies += [.SPM.Quick, .SPM.Nimble] + } + .toTarget(with: "\(name)Tests", product: .unitTests) + } + + static func tests(name: String, dependencies: [TargetDependency] = []) -> Target { + TargetSpec( + sources: .unitTests, + dependencies: dependencies + [.SPM.Quick, .SPM.Nimble] + ) + .toTarget(with: "\(name)Tests", product: .unitTests) + } +} + +// MARK: - Demo +public extension Target { + static func demo(module: ModulePaths, spec: TargetSpec) -> Target { + spec.with { + $0.sources = .demoSources + $0.settings = .settings( + base: (spec.settings?.base ?? [:]) + .merging(["OTHER_LDFLAGS": "$(inherited) -Xlinker -interposable"]), + configurations: .default, + defaultSettings: spec.settings?.defaultSettings ?? .recommended + ) + $0.dependencies = spec.dependencies + [.SPM.Inject] + $0.infoPlist = spec.infoPlist ?? .extendingDefault(with: [ + "UIMainStoryboardFile": "", + "UILaunchStoryboardName": "LaunchScreen", + "ENABLE_TESTS": .boolean(true), + ]) + } + .toTarget(with: module.targetName(type: .demo), product: .app) + } + + static func demo(module: ModulePaths, dependencies: [TargetDependency] = []) -> Target { + TargetSpec( + infoPlist: .extendingDefault(with: [ + "UIMainStoryboardFile": "", + "UILaunchStoryboardName": "LaunchScreen", + "ENABLE_TESTS": .boolean(true), + ]), + sources: .demoSources, + dependencies: dependencies + [.SPM.Inject], + settings: .settings( + base: ["OTHER_LDFLAGS": "$(inherited) -Xlinker -interposable"], + configurations: .default + ) + ) + .toTarget(with: module.targetName(type: .demo), product: .app) + } + + static func demo(name: String, spec: TargetSpec) -> Target { + spec.with { + $0.sources = .demoSources + $0.settings = .settings( + base: (spec.settings?.base ?? [:]) + .merging(["OTHER_LDFLAGS": "$(inherited) -Xlinker -interposable"]), + configurations: .default, + defaultSettings: spec.settings?.defaultSettings ?? .recommended + ) + $0.dependencies = spec.dependencies + [.SPM.Inject] + $0.infoPlist = spec.infoPlist ?? .extendingDefault(with: [ + "UIMainStoryboardFile": "", + "UILaunchStoryboardName": "LaunchScreen", + "ENABLE_TESTS": .boolean(true), + ]) + } + .toTarget(with: "\(name)Demo", product: .app) + } + + static func demo(name: String, dependencies: [TargetDependency] = []) -> Target { + TargetSpec( + infoPlist: .extendingDefault(with: [ + "UIMainStoryboardFile": "", + "UILaunchStoryboardName": "LaunchScreen", + "ENABLE_TESTS": .boolean(true), + ]), + sources: .demoSources, + dependencies: dependencies + [.SPM.Inject], + settings: .settings( + base: ["OTHER_LDFLAGS": "$(inherited) -Xlinker -interposable"], + configurations: .default + ) + ) + .toTarget(with: "\(name)Demo", product: .app) + } +} diff --git a/Tuist/ProjectDescriptionHelpers/Target/TargetSpec.swift b/Tuist/ProjectDescriptionHelpers/Target/TargetSpec.swift new file mode 100644 index 000000000..5724cfee7 --- /dev/null +++ b/Tuist/ProjectDescriptionHelpers/Target/TargetSpec.swift @@ -0,0 +1,126 @@ +import ConfigurationPlugin +import EnvironmentPlugin +import ProjectDescription + +public struct TargetSpec: Configurable { + public var name: String + public var destinations: Destinations + public var product: Product + public var productName: String? + public var bundleId: String? + public var deploymentTargets: DeploymentTargets? + public var infoPlist: InfoPlist? + public var sources: SourceFilesList? + public var resources: ResourceFileElements? + public var copyFiles: [CopyFilesAction]? + public var headers: Headers? + public var entitlements: Entitlements? + public var scripts: [TargetScript] + public var dependencies: [TargetDependency] + public var settings: Settings? + public var coreDataModels: [CoreDataModel] + public var environment: [String : String] + public var launchArguments: [LaunchArgument] + public var additionalFiles: [FileElement] + public var buildRules: [BuildRule] + + public init( + name: String = "", + destinations: Destinations = env.destinations, + product: Product = .staticLibrary, + productName: String? = nil, + bundleId: String? = nil, + deploymentTargets: DeploymentTargets? = env.deploymentTargets, + infoPlist: InfoPlist = .default, + sources: SourceFilesList? = .sources, + resources: ResourceFileElements? = nil, + copyFiles: [CopyFilesAction]? = nil, + headers: Headers? = nil, + entitlements: Entitlements? = nil, + scripts: [TargetScript] = [.swiftLint], + dependencies: [TargetDependency] = [], + settings: Settings? = nil, + coreDataModels: [CoreDataModel] = [], + environment: [String: String] = [:], + launchArguments: [LaunchArgument] = [], + additionalFiles: [FileElement] = [], + buildRules: [BuildRule] = [] + ) { + self.name = name + self.destinations = destinations + self.product = product + self.productName = productName + self.bundleId = bundleId + self.deploymentTargets = deploymentTargets + self.infoPlist = infoPlist + self.sources = sources + self.resources = resources + self.copyFiles = copyFiles + self.headers = headers + self.entitlements = entitlements + self.scripts = scripts + self.dependencies = dependencies + self.settings = settings + self.coreDataModels = coreDataModels + self.environment = environment + self.launchArguments = launchArguments + self.additionalFiles = additionalFiles + self.buildRules = buildRules + } + + func toTarget() -> Target { + self.toTarget(with: self.name) + } + + func toTarget(with name: String, product: Product? = nil) -> Target { + Target.target( + name: name, + destinations:destinations , + product: product ?? self.product, + productName: productName, + bundleId: "\(env.organizationName).\(name)", + deploymentTargets: deploymentTargets, + infoPlist: infoPlist, + sources: sources, + resources: resources, + copyFiles: copyFiles, + headers: headers, + entitlements: entitlements, + scripts: scripts, + dependencies: dependencies, + settings: settings, + coreDataModels: coreDataModels, + launchArguments: launchArguments, + additionalFiles: additionalFiles, + buildRules: buildRules + ) + /* + Target( + name: name, + platform: platform, + product: product ?? self.product, + productName: productName, + bundleId: bundleId ?? "\(env.organizationName).\(name)", + deploymentTarget: deploymentTarget, + infoPlist: infoPlist, + sources: sources, + resources: resources, + copyFiles: copyFiles, + headers: headers, + entitlements: entitlements, + scripts: scripts, + dependencies: dependencies, + settings: .settings( + base: env.baseSetting, + configurations: .default, + defaultSettings: .recommended + ), + coreDataModels: coreDataModels, + environment: environment, + launchArguments: launchArguments, + additionalFiles: additionalFiles, + buildRules: buildRules + ) + */ + } +} diff --git a/Tuist/ProjectDescriptionHelpers/Workspace+Scheme.swift b/Tuist/ProjectDescriptionHelpers/Workspace+Scheme.swift index 2e90e0b1b..ad40499bd 100644 --- a/Tuist/ProjectDescriptionHelpers/Workspace+Scheme.swift +++ b/Tuist/ProjectDescriptionHelpers/Workspace+Scheme.swift @@ -1,5 +1,4 @@ import ProjectDescription -import UtilityPlugin public extension Scheme { struct Workspace {} diff --git a/Tuist/Signing/WaktaverseMusic.Debug.cer.encrypted b/Tuist/Signing/WaktaverseMusic.Debug.cer.encrypted deleted file mode 100644 index fb7149af1..000000000 --- a/Tuist/Signing/WaktaverseMusic.Debug.cer.encrypted +++ /dev/null @@ -1 +0,0 @@ -Fl4nwJKCBazx3DL8xzU56w==-T+kG/m0iP7xrs0Zyj9AW3W9WaKpn7Uv2npPpllC2pj0zpE3D2DtQS1ZVodWXZaUpqiYX0qRooP5E74x0hdi0tltfN5KrzIEeJdLv5Lq8DRjN3Fe4geVe/AvM3seAs3JyN/wFGvDzJzCro+pF/kVrYoV3oN8qRKyfSZnP/RndjwM7xMb5oi+goVOoXHiMI4tpMFoQ9Tbg0HKod/RGlZI5e5SzMJEMbJoQS7HM/ougWpG+C4qif9AFRSVrWtF9ePXNeIxni1PModWZY2xfsh01UUNrFLHAz4+ZqCu9jmpVKTDHPwZ3srmZNKNUqftssYezsKwZyrM6fnE7kEpNbt3gD6DRV0NwM1zAJgx52us6biQcsLBQyUyU6wmIWEGGsHIcE92I5Ug/55VrgThq3cq7QMGMb3UUHq9XwgrtimrbeJ8ptF/xPPPRlZmCC1o6DcOcrKW+2kjl502kjR5k9Ou6B+8LkIHgdotLVV8CyOwAEjZQBsJIM8zUjuIByY9wcUWBhPuiPGvcZZxpLu0M53RSWdgUQUZZlpc/pOt3Dclic8jIWdct4pfpbM/JRnalKLXofTEsiQhkkkneUCxdsxVNpWYb5ZAyVzpVLa1+5iIl3dvn5Fcd2w8WxGg6S4x9DP78CreWYvq/c7Sk8Zc4qqu4U9cVsUJv/1qgHfcdwWD5ZbmlEHx30RAWMbD/3pEU50AZlqUxIp1S5jp43Gy4zlqByQFIAC/nmiw+c/MKfzGQT/a1uSVBeE3LMvWDjtO4DFLTAY6gPppWs5F5co4d/5LoYPqfK/zkMR9cZeEXLSHguvkKJWx9lUTFxkCTGKTb2qddk8d52RfQ2GWQbiHFwjgMhKgvDWXPLoQfwyBS71c06X9i728/i49FFCdn2jpPB4SxIT4yJZYvxy0MWib02jCIs399+DaFfhRp4BGjhX2Lk2GebE3O78OpuLtQDWr7yV46gJFj/4UYZtjQXQxV0gMF8rZgpa4mXy8xeEWC1lzLdA/dopiX9HfqwBl/mnJTs4lHNHzsmoz5Az5yT+C9guS4Bh4+f8KI5eUtnb8qPjqdqb/i3UBp8PwHL4uY/X6urN0/NLHV149yuPjkiT62aXnKErNIInnVXPsROdzWyczZlCyBW0He0aSjcwqnvDJYN95v8IZHlxN6KhGRtPfB0YhBXbkHbVNfshU8zRJyArvjtSRFJk1irAyHqQdBTFUGC+TFOc/NVGEXQvlc65HVBhhI4lkOWdon/tUBS+OEIj5Un3ekPyH0VJPz05MAR6AJlYw7ZB+cLSdKgZs6u68TXQ36YESzT2vERquD7M8Ae4JRHUt05/3i/HnpxUJat2lwwVcWtUVM9VXDxGB7QeZT0/KG5tWZimNw9fqnsuJD9MxYoqsixveZDG+Z0xMdvjbbr2py4KlagPA4ms3wQWzhG1sHKN+e/KnFDVAxMNHVFJ/1JAClPTEXZwYx/trBXB8f1Ad8kPFYrlJ0tk4i9n16RiFBebGC/1fH8HBS7jSVF9FzNwG4U82PJGj8r07DXVLzrgzwu6QIh2rVTm+0fob8BII/lekrnGz9ZOIA1DW4ev8q3ieEFbJTwsZxssfXkfN3zwy3OUHwj3wMGiFzqfWMT5OXPvRhDkImvtxMB6+/6lN7quGoi/RTXtAcASHx0YhldDGXe+Kod1pNgODPM/J75RxCjY2lG0zWsTGuKeYTAp9wcffefCbi5a8zUCqgerc3lRZHlr2SZMf2sP0iE12Ruq6Q81BrQGgaitG3FOpTDv69gQxysVyVQgbU1IE6fcEPU46SvfscLydENCDNzZmDfPdra70oY53E6pU+MZL7wYG2P7V2k+jC9+Jn6/cFebZcR2MSdGqUogb0uXwi0uCZj5lgN8t+z94ihbr0stEtAaCjVa5zrswWFqHjoBjZ+q2qW+yTw4CHlCWPyCz3ajpnYIsb/kYk1fIWTz8nB2ScJJ56Pnrg9WXrLm6psEKHw1U= \ No newline at end of file diff --git a/Tuist/Signing/WaktaverseMusic.Debug.mobileprovision b/Tuist/Signing/WaktaverseMusic.Debug.mobileprovision deleted file mode 100644 index e8f8ab71b..000000000 Binary files a/Tuist/Signing/WaktaverseMusic.Debug.mobileprovision and /dev/null differ diff --git a/Tuist/Signing/WaktaverseMusic.Debug.p12.encrypted b/Tuist/Signing/WaktaverseMusic.Debug.p12.encrypted deleted file mode 100644 index 8d7863ec6..000000000 --- a/Tuist/Signing/WaktaverseMusic.Debug.p12.encrypted +++ /dev/null @@ -1 +0,0 @@ -+igvqE/zcwI5++0yDFtrcg==-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 \ No newline at end of file diff --git a/Tuist/Signing/WaktaverseMusic.Release.cer.encrypted b/Tuist/Signing/WaktaverseMusic.Release.cer.encrypted deleted file mode 100644 index 7a3eaad1c..000000000 --- a/Tuist/Signing/WaktaverseMusic.Release.cer.encrypted +++ /dev/null @@ -1 +0,0 @@ -oU0HjBuBMWyrb1YdO4yw3A==-+z+6H0ANiVeU/bmsXCXAAzxKSW90TcIWMSOSm84gHx6NU32JIU6QUr9MgoMFM1is1klDMvDusoTAjW1KWN23Zyi+4i5YblewH2e3u0c20ScBAFH27c25E/GlhpQ7SjDIVUGs+hSob9Iu8YFXfyA91sc9UCreFrcHjRESFOXAnuOlklrFqxrpEu+5FlVnDj55JwoJSh98N4uCWQUkC1uklGgEVwUruAEuwSJVE2Cb/NgkfmzFh4mcucsBuSrcEUerQnplTIjxgJ7DFNOH2FwgT8iFpW1IA0QM/hYQPh3xwAwMivNH6zfARjSLuE8wArQ87i2SCQ2rdKOan4b74xZX1ZLn2JEqctfTbDeF15dY7Vn3Lk1CMgw0yDLbUAm3E2M+Lb8ZocYp7MTyrUKeo4EaqyQiXpT2o58SzwLZ6EfD9TJhN64huFCBtJNDu3oh+JDXLcMXadgvGxi3Tn4nrDyaWra2jUzkbV14Jy0bKAR7xHY5XNPXnmBsdqCDMzX7EPHIXLX3rx2RaqVD/1dh1l0KdydWIreOm1jJPY3bBcZofAxHeZUr7g/4T81A0OagvVFQcVcluucpEydJYxW7cm5MRgiuCR8PlYChoeI+pvlpE36i+VvFYGg9PCA703KDqLFC2dxirs6G/f5Hc2NlRbdpAdtadZvJmw5se90vWaQGUiyLx1HjXgOy7VGkzM6zIdLJyryQxlTS+h5QtGf1DwHwee7YjY985/UjpZrKOC6xgNGJTpkzgDtC1cxA8iHUuE5vgX2OBkH8+ZnMiYjOu0VACVld/AMX6TtyNrM28HqEYVHq23SN4rHUVq/yALCp+Y4rK0adVzMIG6dN1wRggGz9rHwezanD5+I+Sg8cXinIr5uhr+Wg2VdsYAGmS7qVHgRv1HM6gzW4elQIuWE6xI94I0evZPS0QHnylV2yz6fAeubW2lhXUiJMpIfpup6T9ZHTrEu4tmjCht3y/+Tz73SCXBOv8osx8wfU1UvKsoX1wrLjz5n6SmQWZmQ47jjxWwyRb60AG59QLgIPl/lJQP+Y+16bWrcPAkL16KEifK/xEGjyGTs5N9YDPv5Smq+m4RkqYkyDh+PMUsBq0rBS8drmwf8bsxUC8yymQT84kTIO+usV1Cx8TbwJypL587bVR7PMi9oB6Em0+YeVWIzzkr/T2AmDZE0pQuQNEKmdkg67EWaxA5oPKViZnnv7n4cj8Tt3ceanR8Fc4EwXr8zpioCIuYGxTN/tWLKHHpHFJpSt36DIqDsHjE9Il8AIUfI8NeaMJjbZmwvcDxQ8RB9TfuVUsrCzxhUnC++hK5s4PUUSxlYffGq3va0UtHTCKF70EDl4vvas8Iu7vYGmm4cntdEuUmtdijTbECWrZpC3RSUV5Ti9ORkRBuhR5OP+hpf992SeWq3gic/Gl0VLluqJmq3SZYVPh/C3nrOdgCO+RaaHZZqna+GYshS2eQXfurujotq5aN/5QjZ7Je9gA/j+8YcdjAqaX11ofweSjVuDLSONWEizlB1Ji8AFj5jUSklPL5nGWWTzJKq+ko4SfUdcmgAr225j6bvVSxPvJD1mc103UgmRQ/1p4c7b85tFIHKpqxo40wCnqX67NA1HiZCFuDiu7fs8QJR0jj8xSGILprWkthZbK/DNfwWo8upD9HNpq7AKG2KALXtqpjASH8Qzm1/N6US4JUgxXrFk/+dRePj0CcRYXhEx1KU1TTd+InVm6o/7DFMAaJW1T8PWgkE+4KKApwyo1/DuakgIOv9ROZ9CMuA0mqX9KCIQ0MCR6Gl2CNYP/JwzifsS7Gzsd+L+Emf1td+or7qNFNJ0q2J9cPie2XMZR81kw9sc6OAxuDri1StjYkvyoVoAHuekYaYxkr9zK1iw5nJ26ruE84XBZJ88VuNaie9iBp57utEicejHuoDBdALYsVxasfqXss+NTLvf5y/EsaWQcDc9bwgiB244g4TUk2M3CNPymvV0DWb0 \ No newline at end of file diff --git a/Tuist/Signing/WaktaverseMusic.Release.mobileprovision b/Tuist/Signing/WaktaverseMusic.Release.mobileprovision deleted file mode 100644 index e856884de..000000000 Binary files a/Tuist/Signing/WaktaverseMusic.Release.mobileprovision and /dev/null differ diff --git a/Tuist/Signing/WaktaverseMusic.Release.p12.encrypted b/Tuist/Signing/WaktaverseMusic.Release.p12.encrypted deleted file mode 100644 index 3f9286d7a..000000000 --- a/Tuist/Signing/WaktaverseMusic.Release.p12.encrypted +++ /dev/null @@ -1 +0,0 @@ -NcuPxzd+cio70b8yx9ccsA==-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 \ No newline at end of file diff --git a/Workspace.swift b/Workspace.swift index de31be009..9e7eddd82 100644 --- a/Workspace.swift +++ b/Workspace.swift @@ -1,8 +1,9 @@ import ProjectDescription import ProjectDescriptionHelpers +import EnvironmentPlugin let workspace = Workspace( - name: Environment.appName, + name: env.name, projects: [ "Projects/App" ] diff --git a/graph.png b/graph.png index eb842c2cc..28821cc07 100644 Binary files a/graph.png and b/graph.png differ